diff options
Diffstat (limited to 'dist/index.js')
| -rw-r--r-- | dist/index.js | 46278 |
1 files changed, 11 insertions, 46267 deletions
diff --git a/dist/index.js b/dist/index.js index e36ad31..3baf9cd 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,46284 +1,28 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // identity function for calling harmony imports with the correct context -/******/ __webpack_require__.i = function(value) { return value; }; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 80); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports) { - -var core = module.exports = {version: '2.4.0'}; -if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -var store = __webpack_require__(40)('wks') - , uid = __webpack_require__(29) - , Symbol = __webpack_require__(2).Symbol - , USE_SYMBOL = typeof Symbol == 'function'; - -var $exports = module.exports = function(name){ - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - -$exports.store = store; - -/***/ }), -/* 2 */ -/***/ (function(module, exports) { - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); -if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) {/*! +!function(t){var e={};function i(n){if(e[n])return e[n].exports;var s=e[n]={i:n,l:!1,exports:{}};return t[n].call(s.exports,s,s.exports,i),s.l=!0,s.exports}i.m=t,i.c=e,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=76)}([function(t,e){var i=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=i)},function(t,e,i){var n=i(39)("wks"),s=i(26),r=i(2).Symbol,o="function"==typeof r;(t.exports=function(t){return n[t]||(n[t]=o&&r[t]||(o?r:s)("Symbol."+t))}).store=n},function(t,e){var i=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(t,e,i){var n=i(4),s=i(55),r=i(35),o=Object.defineProperty;e.f=i(9)?Object.defineProperty:function(t,e,i){if(n(t),e=r(e,!0),n(i),s)try{return o(t,e,i)}catch(t){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(t[e]=i.value),t}},function(t,e,i){var n=i(20);t.exports=function(t){if(!n(t))throw TypeError(t+" is not an object!");return t}},function(t,e,i){"use strict";(function(t){ +/*! * The buffer module from node.js, for the browser. * * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org> * @license MIT */ -/* eslint-disable no-proto */ - - - -var base64 = __webpack_require__(92) -var ieee754 = __webpack_require__(139) -var isArray = __webpack_require__(71) - -exports.Buffer = Buffer -exports.SlowBuffer = SlowBuffer -exports.INSPECT_MAX_BYTES = 50 - +var n=i(130),s=i(131),r=i(70);function o(){return h.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function a(t,e){if(o()<e)throw new RangeError("Invalid typed array length");return h.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=h.prototype:(null===t&&(t=new h(e)),t.length=e),t}function h(t,e,i){if(!(h.TYPED_ARRAY_SUPPORT||this instanceof h))return new h(t,e,i);if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return c(this,t)}return u(this,t,e,i)}function u(t,e,i,n){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?function(t,e,i,n){if(e.byteLength,i<0||e.byteLength<i)throw new RangeError("'offset' is out of bounds");if(e.byteLength<i+(n||0))throw new RangeError("'length' is out of bounds");e=void 0===i&&void 0===n?new Uint8Array(e):void 0===n?new Uint8Array(e,i):new Uint8Array(e,i,n);h.TYPED_ARRAY_SUPPORT?(t=e).__proto__=h.prototype:t=p(t,e);return t}(t,e,i,n):"string"==typeof e?function(t,e,i){"string"==typeof i&&""!==i||(i="utf8");if(!h.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var n=0|d(e,i),s=(t=a(t,n)).write(e,i);s!==n&&(t=t.slice(0,s));return t}(t,e,i):function(t,e){if(h.isBuffer(e)){var i=0|f(e.length);return 0===(t=a(t,i)).length?t:(e.copy(t,0,0,i),t)}if(e){if("undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return"number"!=typeof e.length||function(t){return t!=t}(e.length)?a(t,0):p(t,e);if("Buffer"===e.type&&r(e.data))return p(t,e.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function l(t){if("number"!=typeof t)throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function c(t,e){if(l(e),t=a(t,e<0?0:0|f(e)),!h.TYPED_ARRAY_SUPPORT)for(var i=0;i<e;++i)t[i]=0;return t}function p(t,e){var i=e.length<0?0:0|f(e.length);t=a(t,i);for(var n=0;n<i;n+=1)t[n]=255&e[n];return t}function f(t){if(t>=o())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+o().toString(16)+" bytes");return 0|t}function d(t,e){if(h.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var i=t.length;if(0===i)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return B(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return z(t).length;default:if(n)return B(t).length;e=(""+e).toLowerCase(),n=!0}}function y(t,e,i){var n=t[e];t[e]=t[i],t[i]=n}function m(t,e,i,n,s){if(0===t.length)return-1;if("string"==typeof i?(n=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=s?0:t.length-1),i<0&&(i=t.length+i),i>=t.length){if(s)return-1;i=t.length-1}else if(i<0){if(!s)return-1;i=0}if("string"==typeof e&&(e=h.from(e,n)),h.isBuffer(e))return 0===e.length?-1:v(t,e,i,n,s);if("number"==typeof e)return e&=255,h.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?s?Uint8Array.prototype.indexOf.call(t,e,i):Uint8Array.prototype.lastIndexOf.call(t,e,i):v(t,[e],i,n,s);throw new TypeError("val must be string, number or Buffer")}function v(t,e,i,n,s){var r,o=1,a=t.length,h=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;o=2,a/=2,h/=2,i/=2}function u(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(s){var l=-1;for(r=i;r<a;r++)if(u(t,r)===u(e,-1===l?0:r-l)){if(-1===l&&(l=r),r-l+1===h)return l*o}else-1!==l&&(r-=r-l),l=-1}else for(i+h>a&&(i=a-h),r=i;r>=0;r--){for(var c=!0,p=0;p<h;p++)if(u(t,r+p)!==u(e,p)){c=!1;break}if(c)return r}return-1}function _(t,e,i,n){i=Number(i)||0;var s=t.length-i;n?(n=Number(n))>s&&(n=s):n=s;var r=e.length;if(r%2!=0)throw new TypeError("Invalid hex string");n>r/2&&(n=r/2);for(var o=0;o<n;++o){var a=parseInt(e.substr(2*o,2),16);if(isNaN(a))return o;t[i+o]=a}return o}function g(t,e,i,n){return U(B(e,t.length-i),t,i,n)}function b(t,e,i,n){return U(function(t){for(var e=[],i=0;i<t.length;++i)e.push(255&t.charCodeAt(i));return e}(e),t,i,n)}function w(t,e,i,n){return b(t,e,i,n)}function S(t,e,i,n){return U(z(e),t,i,n)}function T(t,e,i,n){return U(function(t,e){for(var i,n,s,r=[],o=0;o<t.length&&!((e-=2)<0);++o)i=t.charCodeAt(o),n=i>>8,s=i%256,r.push(s),r.push(n);return r}(e,t.length-i),t,i,n)}function x(t,e,i){return 0===e&&i===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,i))}function A(t,e,i){i=Math.min(t.length,i);for(var n=[],s=e;s<i;){var r,o,a,h,u=t[s],l=null,c=u>239?4:u>223?3:u>191?2:1;if(s+c<=i)switch(c){case 1:u<128&&(l=u);break;case 2:128==(192&(r=t[s+1]))&&(h=(31&u)<<6|63&r)>127&&(l=h);break;case 3:r=t[s+1],o=t[s+2],128==(192&r)&&128==(192&o)&&(h=(15&u)<<12|(63&r)<<6|63&o)>2047&&(h<55296||h>57343)&&(l=h);break;case 4:r=t[s+1],o=t[s+2],a=t[s+3],128==(192&r)&&128==(192&o)&&128==(192&a)&&(h=(15&u)<<18|(63&r)<<12|(63&o)<<6|63&a)>65535&&h<1114112&&(l=h)}null===l?(l=65533,c=1):l>65535&&(l-=65536,n.push(l>>>10&1023|55296),l=56320|1023&l),n.push(l),s+=c}return function(t){var e=t.length;if(e<=E)return String.fromCharCode.apply(String,t);var i="",n=0;for(;n<e;)i+=String.fromCharCode.apply(String,t.slice(n,n+=E));return i}(n)}e.Buffer=h,e.SlowBuffer=function(t){+t!=t&&(t=0);return h.alloc(+t)},e.INSPECT_MAX_BYTES=50,h.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:function(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()&&"function"==typeof t.subarray&&0===t.subarray(1,1).byteLength}catch(t){return!1}}(),e.kMaxLength=o(),h.poolSize=8192,h._augment=function(t){return t.__proto__=h.prototype,t},h.from=function(t,e,i){return u(null,t,e,i)},h.TYPED_ARRAY_SUPPORT&&(h.prototype.__proto__=Uint8Array.prototype,h.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&h[Symbol.species]===h&&Object.defineProperty(h,Symbol.species,{value:null,configurable:!0})),h.alloc=function(t,e,i){return function(t,e,i,n){return l(e),e<=0?a(t,e):void 0!==i?"string"==typeof n?a(t,e).fill(i,n):a(t,e).fill(i):a(t,e)}(null,t,e,i)},h.allocUnsafe=function(t){return c(null,t)},h.allocUnsafeSlow=function(t){return c(null,t)},h.isBuffer=function(t){return!(null==t||!t._isBuffer)},h.compare=function(t,e){if(!h.isBuffer(t)||!h.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var i=t.length,n=e.length,s=0,r=Math.min(i,n);s<r;++s)if(t[s]!==e[s]){i=t[s],n=e[s];break}return i<n?-1:n<i?1:0},h.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},h.concat=function(t,e){if(!r(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return h.alloc(0);var i;if(void 0===e)for(e=0,i=0;i<t.length;++i)e+=t[i].length;var n=h.allocUnsafe(e),s=0;for(i=0;i<t.length;++i){var o=t[i];if(!h.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(n,s),s+=o.length}return n},h.byteLength=d,h.prototype._isBuffer=!0,h.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)y(this,e,e+1);return this},h.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)y(this,e,e+3),y(this,e+1,e+2);return this},h.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)y(this,e,e+7),y(this,e+1,e+6),y(this,e+2,e+5),y(this,e+3,e+4);return this},h.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?A(this,0,t):function(t,e,i){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return M(this,e,i);case"utf8":case"utf-8":return A(this,e,i);case"ascii":return k(this,e,i);case"latin1":case"binary":return O(this,e,i);case"base64":return x(this,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return P(this,e,i);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}.apply(this,arguments)},h.prototype.equals=function(t){if(!h.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===h.compare(this,t)},h.prototype.inspect=function(){var t="",i=e.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,i).match(/.{2}/g).join(" "),this.length>i&&(t+=" ... ")),"<Buffer "+t+">"},h.prototype.compare=function(t,e,i,n,s){if(!h.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===i&&(i=t?t.length:0),void 0===n&&(n=0),void 0===s&&(s=this.length),e<0||i>t.length||n<0||s>this.length)throw new RangeError("out of range index");if(n>=s&&e>=i)return 0;if(n>=s)return-1;if(e>=i)return 1;if(e>>>=0,i>>>=0,n>>>=0,s>>>=0,this===t)return 0;for(var r=s-n,o=i-e,a=Math.min(r,o),u=this.slice(n,s),l=t.slice(e,i),c=0;c<a;++c)if(u[c]!==l[c]){r=u[c],o=l[c];break}return r<o?-1:o<r?1:0},h.prototype.includes=function(t,e,i){return-1!==this.indexOf(t,e,i)},h.prototype.indexOf=function(t,e,i){return m(this,t,e,i,!0)},h.prototype.lastIndexOf=function(t,e,i){return m(this,t,e,i,!1)},h.prototype.write=function(t,e,i,n){if(void 0===e)n="utf8",i=this.length,e=0;else if(void 0===i&&"string"==typeof e)n=e,i=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e|=0,isFinite(i)?(i|=0,void 0===n&&(n="utf8")):(n=i,i=void 0)}var s=this.length-e;if((void 0===i||i>s)&&(i=s),t.length>0&&(i<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var r=!1;;)switch(n){case"hex":return _(this,t,e,i);case"utf8":case"utf-8":return g(this,t,e,i);case"ascii":return b(this,t,e,i);case"latin1":case"binary":return w(this,t,e,i);case"base64":return S(this,t,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return T(this,t,e,i);default:if(r)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),r=!0}},h.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var E=4096;function k(t,e,i){var n="";i=Math.min(t.length,i);for(var s=e;s<i;++s)n+=String.fromCharCode(127&t[s]);return n}function O(t,e,i){var n="";i=Math.min(t.length,i);for(var s=e;s<i;++s)n+=String.fromCharCode(t[s]);return n}function M(t,e,i){var n=t.length;(!e||e<0)&&(e=0),(!i||i<0||i>n)&&(i=n);for(var s="",r=e;r<i;++r)s+=j(t[r]);return s}function P(t,e,i){for(var n=t.slice(e,i),s="",r=0;r<n.length;r+=2)s+=String.fromCharCode(n[r]+256*n[r+1]);return s}function C(t,e,i){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>i)throw new RangeError("Trying to access beyond buffer length")}function I(t,e,i,n,s,r){if(!h.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>s||e<r)throw new RangeError('"value" argument is out of bounds');if(i+n>t.length)throw new RangeError("Index out of range")}function R(t,e,i,n){e<0&&(e=65535+e+1);for(var s=0,r=Math.min(t.length-i,2);s<r;++s)t[i+s]=(e&255<<8*(n?s:1-s))>>>8*(n?s:1-s)}function F(t,e,i,n){e<0&&(e=4294967295+e+1);for(var s=0,r=Math.min(t.length-i,4);s<r;++s)t[i+s]=e>>>8*(n?s:3-s)&255}function D(t,e,i,n,s,r){if(i+n>t.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function N(t,e,i,n,r){return r||D(t,0,i,4),s.write(t,e,i,n,23,4),i+4}function q(t,e,i,n,r){return r||D(t,0,i,8),s.write(t,e,i,n,52,8),i+8}h.prototype.slice=function(t,e){var i,n=this.length;if(t=~~t,e=void 0===e?n:~~e,t<0?(t+=n)<0&&(t=0):t>n&&(t=n),e<0?(e+=n)<0&&(e=0):e>n&&(e=n),e<t&&(e=t),h.TYPED_ARRAY_SUPPORT)(i=this.subarray(t,e)).__proto__=h.prototype;else{var s=e-t;i=new h(s,void 0);for(var r=0;r<s;++r)i[r]=this[r+t]}return i},h.prototype.readUIntLE=function(t,e,i){t|=0,e|=0,i||C(t,e,this.length);for(var n=this[t],s=1,r=0;++r<e&&(s*=256);)n+=this[t+r]*s;return n},h.prototype.readUIntBE=function(t,e,i){t|=0,e|=0,i||C(t,e,this.length);for(var n=this[t+--e],s=1;e>0&&(s*=256);)n+=this[t+--e]*s;return n},h.prototype.readUInt8=function(t,e){return e||C(t,1,this.length),this[t]},h.prototype.readUInt16LE=function(t,e){return e||C(t,2,this.length),this[t]|this[t+1]<<8},h.prototype.readUInt16BE=function(t,e){return e||C(t,2,this.length),this[t]<<8|this[t+1]},h.prototype.readUInt32LE=function(t,e){return e||C(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},h.prototype.readUInt32BE=function(t,e){return e||C(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},h.prototype.readIntLE=function(t,e,i){t|=0,e|=0,i||C(t,e,this.length);for(var n=this[t],s=1,r=0;++r<e&&(s*=256);)n+=this[t+r]*s;return n>=(s*=128)&&(n-=Math.pow(2,8*e)),n},h.prototype.readIntBE=function(t,e,i){t|=0,e|=0,i||C(t,e,this.length);for(var n=e,s=1,r=this[t+--n];n>0&&(s*=256);)r+=this[t+--n]*s;return r>=(s*=128)&&(r-=Math.pow(2,8*e)),r},h.prototype.readInt8=function(t,e){return e||C(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},h.prototype.readInt16LE=function(t,e){e||C(t,2,this.length);var i=this[t]|this[t+1]<<8;return 32768&i?4294901760|i:i},h.prototype.readInt16BE=function(t,e){e||C(t,2,this.length);var i=this[t+1]|this[t]<<8;return 32768&i?4294901760|i:i},h.prototype.readInt32LE=function(t,e){return e||C(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},h.prototype.readInt32BE=function(t,e){return e||C(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},h.prototype.readFloatLE=function(t,e){return e||C(t,4,this.length),s.read(this,t,!0,23,4)},h.prototype.readFloatBE=function(t,e){return e||C(t,4,this.length),s.read(this,t,!1,23,4)},h.prototype.readDoubleLE=function(t,e){return e||C(t,8,this.length),s.read(this,t,!0,52,8)},h.prototype.readDoubleBE=function(t,e){return e||C(t,8,this.length),s.read(this,t,!1,52,8)},h.prototype.writeUIntLE=function(t,e,i,n){(t=+t,e|=0,i|=0,n)||I(this,t,e,i,Math.pow(2,8*i)-1,0);var s=1,r=0;for(this[e]=255&t;++r<i&&(s*=256);)this[e+r]=t/s&255;return e+i},h.prototype.writeUIntBE=function(t,e,i,n){(t=+t,e|=0,i|=0,n)||I(this,t,e,i,Math.pow(2,8*i)-1,0);var s=i-1,r=1;for(this[e+s]=255&t;--s>=0&&(r*=256);)this[e+s]=t/r&255;return e+i},h.prototype.writeUInt8=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,1,255,0),h.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},h.prototype.writeUInt16LE=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,2,65535,0),h.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):R(this,t,e,!0),e+2},h.prototype.writeUInt16BE=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,2,65535,0),h.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):R(this,t,e,!1),e+2},h.prototype.writeUInt32LE=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,4,4294967295,0),h.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):F(this,t,e,!0),e+4},h.prototype.writeUInt32BE=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,4,4294967295,0),h.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):F(this,t,e,!1),e+4},h.prototype.writeIntLE=function(t,e,i,n){if(t=+t,e|=0,!n){var s=Math.pow(2,8*i-1);I(this,t,e,i,s-1,-s)}var r=0,o=1,a=0;for(this[e]=255&t;++r<i&&(o*=256);)t<0&&0===a&&0!==this[e+r-1]&&(a=1),this[e+r]=(t/o>>0)-a&255;return e+i},h.prototype.writeIntBE=function(t,e,i,n){if(t=+t,e|=0,!n){var s=Math.pow(2,8*i-1);I(this,t,e,i,s-1,-s)}var r=i-1,o=1,a=0;for(this[e+r]=255&t;--r>=0&&(o*=256);)t<0&&0===a&&0!==this[e+r+1]&&(a=1),this[e+r]=(t/o>>0)-a&255;return e+i},h.prototype.writeInt8=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,1,127,-128),h.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},h.prototype.writeInt16LE=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,2,32767,-32768),h.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):R(this,t,e,!0),e+2},h.prototype.writeInt16BE=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,2,32767,-32768),h.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):R(this,t,e,!1),e+2},h.prototype.writeInt32LE=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,4,2147483647,-2147483648),h.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):F(this,t,e,!0),e+4},h.prototype.writeInt32BE=function(t,e,i){return t=+t,e|=0,i||I(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),h.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):F(this,t,e,!1),e+4},h.prototype.writeFloatLE=function(t,e,i){return N(this,t,e,!0,i)},h.prototype.writeFloatBE=function(t,e,i){return N(this,t,e,!1,i)},h.prototype.writeDoubleLE=function(t,e,i){return q(this,t,e,!0,i)},h.prototype.writeDoubleBE=function(t,e,i){return q(this,t,e,!1,i)},h.prototype.copy=function(t,e,i,n){if(i||(i=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n<i&&(n=i),n===i)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(i<0||i>=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e<n-i&&(n=t.length-e+i);var s,r=n-i;if(this===t&&i<e&&e<n)for(s=r-1;s>=0;--s)t[s+e]=this[s+i];else if(r<1e3||!h.TYPED_ARRAY_SUPPORT)for(s=0;s<r;++s)t[s+e]=this[s+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+r),e);return r},h.prototype.fill=function(t,e,i,n){if("string"==typeof t){if("string"==typeof e?(n=e,e=0,i=this.length):"string"==typeof i&&(n=i,i=this.length),1===t.length){var s=t.charCodeAt(0);s<256&&(t=s)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!h.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof t&&(t&=255);if(e<0||this.length<e||this.length<i)throw new RangeError("Out of range index");if(i<=e)return this;var r;if(e>>>=0,i=void 0===i?this.length:i>>>0,t||(t=0),"number"==typeof t)for(r=e;r<i;++r)this[r]=t;else{var o=h.isBuffer(t)?t:B(new h(t,n).toString()),a=o.length;for(r=0;r<i-e;++r)this[r+e]=o[r%a]}return this};var L=/[^+\/0-9A-Za-z-_]/g;function j(t){return t<16?"0"+t.toString(16):t.toString(16)}function B(t,e){var i;e=e||1/0;for(var n=t.length,s=null,r=[],o=0;o<n;++o){if((i=t.charCodeAt(o))>55295&&i<57344){if(!s){if(i>56319){(e-=3)>-1&&r.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&r.push(239,191,189);continue}s=i;continue}if(i<56320){(e-=3)>-1&&r.push(239,191,189),s=i;continue}i=65536+(s-55296<<10|i-56320)}else s&&(e-=3)>-1&&r.push(239,191,189);if(s=null,i<128){if((e-=1)<0)break;r.push(i)}else if(i<2048){if((e-=2)<0)break;r.push(i>>6|192,63&i|128)}else if(i<65536){if((e-=3)<0)break;r.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;r.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return r}function z(t){return n.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(L,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function U(t,e,i,n){for(var s=0;s<n&&!(s+i>=e.length||s>=t.length);++s)e[s+i]=t[s];return s}}).call(e,i(17))},function(t,e,i){var n=i(53),s=i(32);t.exports=function(t){return n(s(t))}},function(t,e,i){var n=i(2),s=i(0),r=i(19),o=i(8),a=function(t,e,i){var h,u,l,c=t&a.F,p=t&a.G,f=t&a.S,d=t&a.P,y=t&a.B,m=t&a.W,v=p?s:s[e]||(s[e]={}),_=v.prototype,g=p?n:f?n[e]:(n[e]||{}).prototype;for(h in p&&(i=e),i)(u=!c&&g&&void 0!==g[h])&&h in v||(l=u?g[h]:i[h],v[h]=p&&"function"!=typeof g[h]?i[h]:y&&u?r(l,n):m&&g[h]==l?function(t){var e=function(e,i,n){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,i)}return new t(e,i,n)}return t.apply(this,arguments)};return e.prototype=t.prototype,e}(l):d&&"function"==typeof l?r(Function.call,l):l,d&&((v.virtual||(v.virtual={}))[h]=l,t&a.R&&_&&!_[h]&&o(_,h,l)))};a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,t.exports=a},function(t,e,i){var n=i(3),s=i(21);t.exports=i(9)?function(t,e,i){return n.f(t,e,s(1,i))}:function(t,e,i){return t[e]=i,t}},function(t,e,i){t.exports=!i(15)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){var i={}.hasOwnProperty;t.exports=function(t,e){return i.call(t,e)}},function(t,e){var i,n,s=t.exports={};function r(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function a(t){if(i===setTimeout)return setTimeout(t,0);if((i===r||!i)&&setTimeout)return i=setTimeout,setTimeout(t,0);try{return i(t,0)}catch(e){try{return i.call(null,t,0)}catch(e){return i.call(this,t,0)}}}!function(){try{i="function"==typeof setTimeout?setTimeout:r}catch(t){i=r}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(t){n=o}}();var h,u=[],l=!1,c=-1;function p(){l&&h&&(l=!1,h.length?u=h.concat(u):c=-1,u.length&&f())}function f(){if(!l){var t=a(p);l=!0;for(var e=u.length;e;){for(h=u,u=[];++c<e;)h&&h[c].run();c=-1,e=u.length}h=null,l=!1,function(t){if(n===clearTimeout)return clearTimeout(t);if((n===o||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(t);try{n(t)}catch(e){try{return n.call(null,t)}catch(e){return n.call(this,t)}}}(t)}}function d(t,e){this.fun=t,this.array=e}function y(){}s.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)e[i-1]=arguments[i];u.push(new d(t,e)),1!==u.length||l||a(f)},d.prototype.run=function(){this.fun.apply(null,this.array)},s.title="browser",s.browser=!0,s.env={},s.argv=[],s.version="",s.versions={},s.on=y,s.addListener=y,s.once=y,s.off=y,s.removeListener=y,s.removeAllListeners=y,s.emit=y,s.prependListener=y,s.prependOnceListener=y,s.listeners=function(t){return[]},s.binding=function(t){throw new Error("process.binding is not supported")},s.cwd=function(){return"/"},s.chdir=function(t){throw new Error("process.chdir is not supported")},s.umask=function(){return 0}},function(t,e){"function"==typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var i=function(){};i.prototype=e.prototype,t.prototype=new i,t.prototype.constructor=t}},function(t,e,i){"use strict";var n=Object.keys||function(t){var e=[];for(var i in t)e.push(i);return e};t.exports=c;var s=i(49),r=i(23);r.inherits=i(12);var o=i(73),a=i(50);r.inherits(c,o);for(var h=n(a.prototype),u=0;u<h.length;u++){var l=h[u];c.prototype[l]||(c.prototype[l]=a.prototype[l])}function c(t){if(!(this instanceof c))return new c(t);o.call(this,t),a.call(this,t),t&&!1===t.readable&&(this.readable=!1),t&&!1===t.writable&&(this.writable=!1),this.allowHalfOpen=!0,t&&!1===t.allowHalfOpen&&(this.allowHalfOpen=!1),this.once("end",p)}function p(){this.allowHalfOpen||this._writableState.ended||s(f,this)}function f(t){t.end()}},function(t,e){t.exports={}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,i){var n=i(58),s=i(40);t.exports=Object.keys||function(t){return n(t,s)}},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e){var i={}.toString;t.exports=function(t){return i.call(t).slice(8,-1)}},function(t,e,i){var n=i(33);t.exports=function(t,e,i){if(n(t),void 0===e)return t;switch(i){case 1:return function(i){return t.call(e,i)};case 2:return function(i,n){return t.call(e,i,n)};case 3:return function(i,n,s){return t.call(e,i,n,s)}}return function(){return t.apply(e,arguments)}}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e,i){"use strict";var n=i(87)(!0);i(54)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,i=this._i;return i>=e.length?{value:void 0,done:!0}:(t=n(e,i),this._i+=t.length,{value:t,done:!1})})},function(t,e,i){(function(t){function i(t){return Object.prototype.toString.call(t)}e.isArray=function(t){return Array.isArray?Array.isArray(t):"[object Array]"===i(t)},e.isBoolean=function(t){return"boolean"==typeof t},e.isNull=function(t){return null===t},e.isNullOrUndefined=function(t){return null==t},e.isNumber=function(t){return"number"==typeof t},e.isString=function(t){return"string"==typeof t},e.isSymbol=function(t){return"symbol"==typeof t},e.isUndefined=function(t){return void 0===t},e.isRegExp=function(t){return"[object RegExp]"===i(t)},e.isObject=function(t){return"object"==typeof t&&null!==t},e.isDate=function(t){return"[object Date]"===i(t)},e.isError=function(t){return"[object Error]"===i(t)||t instanceof Error},e.isFunction=function(t){return"function"==typeof t},e.isPrimitive=function(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"==typeof t||void 0===t},e.isBuffer=t.isBuffer}).call(e,i(5).Buffer)},function(t,e,i){i(79);for(var n=i(2),s=i(8),r=i(14),o=i(1)("toStringTag"),a=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],h=0;h<5;h++){var u=a[h],l=n[u],c=l&&l.prototype;c&&!c[o]&&s(c,o,u),r[u]=r.Array}},function(t,e){t.exports=!0},function(t,e){var i=0,n=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++i+n).toString(36))}},function(t,e,i){var n=i(3).f,s=i(10),r=i(1)("toStringTag");t.exports=function(t,e,i){t&&!s(t=i?t:t.prototype,r)&&n(t,r,{configurable:!0,value:e})}},function(t,e,i){var n=i(32);t.exports=function(t){return Object(n(t))}},function(t,e,i){var n;!function(s,r){void 0===(n=function(){return r()}.call(e,i,e,t))||(t.exports=n)}(0,function(){"use strict";var t;function e(e){e(t)} /** - * If `Buffer.TYPED_ARRAY_SUPPORT`: - * === true Use Uint8Array implementation (fastest) - * === false Use Object implementation (most compatible, even IE6) - * - * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, - * Opera 11.6+, iOS 4.2+. - * - * Due to various browser bugs, sometimes the Object implementation will be used even - * when the browser supports typed arrays. - * - * Note: - * - * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, - * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. - * - * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. - * - * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of - * incorrect length in some situations. - - * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they - * get the Object implementation, which is slower but behaves correctly. - */ -Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined - ? global.TYPED_ARRAY_SUPPORT - : typedArraySupport() - -/* - * Export kMaxLength after typed array support is determined. - */ -exports.kMaxLength = kMaxLength() - -function typedArraySupport () { - try { - var arr = new Uint8Array(1) - arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }} - return arr.foo() === 42 && // typed array instances can be augmented - typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` - arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` - } catch (e) { - return false - } -} - -function kMaxLength () { - return Buffer.TYPED_ARRAY_SUPPORT - ? 0x7fffffff - : 0x3fffffff -} - -function createBuffer (that, length) { - if (kMaxLength() < length) { - throw new RangeError('Invalid typed array length') - } - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = new Uint8Array(length) - that.__proto__ = Buffer.prototype - } else { - // Fallback: Return an object instance of the Buffer class - if (that === null) { - that = new Buffer(length) - } - that.length = length - } - - return that -} - -/** - * The Buffer constructor returns instances of `Uint8Array` that have their - * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of - * `Uint8Array`, so the returned instances will have all the node `Buffer` methods - * and the `Uint8Array` methods. Square bracket notation works as expected -- it - * returns a single octet. - * - * The `Uint8Array` prototype remains unmodified. - */ - -function Buffer (arg, encodingOrOffset, length) { - if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) { - return new Buffer(arg, encodingOrOffset, length) - } - - // Common case. - if (typeof arg === 'number') { - if (typeof encodingOrOffset === 'string') { - throw new Error( - 'If encoding is specified then the first argument must be a string' - ) - } - return allocUnsafe(this, arg) - } - return from(this, arg, encodingOrOffset, length) -} - -Buffer.poolSize = 8192 // not used by this implementation - -// TODO: Legacy, not needed anymore. Remove in next major version. -Buffer._augment = function (arr) { - arr.__proto__ = Buffer.prototype - return arr -} - -function from (that, value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') - } - - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - return fromArrayBuffer(that, value, encodingOrOffset, length) - } - - if (typeof value === 'string') { - return fromString(that, value, encodingOrOffset) - } - - return fromObject(that, value) -} - -/** - * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError - * if value is a number. - * Buffer.from(str[, encoding]) - * Buffer.from(array) - * Buffer.from(buffer) - * Buffer.from(arrayBuffer[, byteOffset[, length]]) - **/ -Buffer.from = function (value, encodingOrOffset, length) { - return from(null, value, encodingOrOffset, length) -} - -if (Buffer.TYPED_ARRAY_SUPPORT) { - Buffer.prototype.__proto__ = Uint8Array.prototype - Buffer.__proto__ = Uint8Array - if (typeof Symbol !== 'undefined' && Symbol.species && - Buffer[Symbol.species] === Buffer) { - // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 - Object.defineProperty(Buffer, Symbol.species, { - value: null, - configurable: true - }) - } -} - -function assertSize (size) { - if (typeof size !== 'number') { - throw new TypeError('"size" argument must be a number') - } else if (size < 0) { - throw new RangeError('"size" argument must not be negative') - } -} - -function alloc (that, size, fill, encoding) { - assertSize(size) - if (size <= 0) { - return createBuffer(that, size) - } - if (fill !== undefined) { - // Only pay attention to encoding if it's a string. This - // prevents accidentally sending in a number that would - // be interpretted as a start offset. - return typeof encoding === 'string' - ? createBuffer(that, size).fill(fill, encoding) - : createBuffer(that, size).fill(fill) - } - return createBuffer(that, size) -} - -/** - * Creates a new filled Buffer instance. - * alloc(size[, fill[, encoding]]) - **/ -Buffer.alloc = function (size, fill, encoding) { - return alloc(null, size, fill, encoding) -} - -function allocUnsafe (that, size) { - assertSize(size) - that = createBuffer(that, size < 0 ? 0 : checked(size) | 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) { - for (var i = 0; i < size; ++i) { - that[i] = 0 - } - } - return that -} - -/** - * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. - * */ -Buffer.allocUnsafe = function (size) { - return allocUnsafe(null, size) -} -/** - * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. - */ -Buffer.allocUnsafeSlow = function (size) { - return allocUnsafe(null, size) -} - -function fromString (that, string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8' - } - - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('"encoding" must be a valid string encoding') - } - - var length = byteLength(string, encoding) | 0 - that = createBuffer(that, length) - - var actual = that.write(string, encoding) - - if (actual !== length) { - // Writing a hex string, for example, that contains invalid characters will - // cause everything after the first invalid character to be ignored. (e.g. - // 'abxxcd' will be treated as 'ab') - that = that.slice(0, actual) - } - - return that -} - -function fromArrayLike (that, array) { - var length = array.length < 0 ? 0 : checked(array.length) | 0 - that = createBuffer(that, length) - for (var i = 0; i < length; i += 1) { - that[i] = array[i] & 255 - } - return that -} - -function fromArrayBuffer (that, array, byteOffset, length) { - array.byteLength // this throws if `array` is not a valid ArrayBuffer - - if (byteOffset < 0 || array.byteLength < byteOffset) { - throw new RangeError('\'offset\' is out of bounds') - } - - if (array.byteLength < byteOffset + (length || 0)) { - throw new RangeError('\'length\' is out of bounds') - } - - if (byteOffset === undefined && length === undefined) { - array = new Uint8Array(array) - } else if (length === undefined) { - array = new Uint8Array(array, byteOffset) - } else { - array = new Uint8Array(array, byteOffset, length) - } - - if (Buffer.TYPED_ARRAY_SUPPORT) { - // Return an augmented `Uint8Array` instance, for best performance - that = array - that.__proto__ = Buffer.prototype - } else { - // Fallback: Return an object instance of the Buffer class - that = fromArrayLike(that, array) - } - return that -} - -function fromObject (that, obj) { - if (Buffer.isBuffer(obj)) { - var len = checked(obj.length) | 0 - that = createBuffer(that, len) - - if (that.length === 0) { - return that - } - - obj.copy(that, 0, 0, len) - return that - } - - if (obj) { - if ((typeof ArrayBuffer !== 'undefined' && - obj.buffer instanceof ArrayBuffer) || 'length' in obj) { - if (typeof obj.length !== 'number' || isnan(obj.length)) { - return createBuffer(that, 0) - } - return fromArrayLike(that, obj) - } - - if (obj.type === 'Buffer' && isArray(obj.data)) { - return fromArrayLike(that, obj.data) - } - } - - throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') -} - -function checked (length) { - // Note: cannot use `length < kMaxLength()` here because that fails when - // length is NaN (which is otherwise coerced to zero.) - if (length >= kMaxLength()) { - throw new RangeError('Attempt to allocate Buffer larger than maximum ' + - 'size: 0x' + kMaxLength().toString(16) + ' bytes') - } - return length | 0 -} - -function SlowBuffer (length) { - if (+length != length) { // eslint-disable-line eqeqeq - length = 0 - } - return Buffer.alloc(+length) -} - -Buffer.isBuffer = function isBuffer (b) { - return !!(b != null && b._isBuffer) -} - -Buffer.compare = function compare (a, b) { - if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { - throw new TypeError('Arguments must be Buffers') - } - - if (a === b) return 0 - - var x = a.length - var y = b.length - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i] - y = b[i] - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -Buffer.isEncoding = function isEncoding (encoding) { - switch (String(encoding).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return true - default: - return false - } -} - -Buffer.concat = function concat (list, length) { - if (!isArray(list)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - - if (list.length === 0) { - return Buffer.alloc(0) - } - - var i - if (length === undefined) { - length = 0 - for (i = 0; i < list.length; ++i) { - length += list[i].length - } - } - - var buffer = Buffer.allocUnsafe(length) - var pos = 0 - for (i = 0; i < list.length; ++i) { - var buf = list[i] - if (!Buffer.isBuffer(buf)) { - throw new TypeError('"list" argument must be an Array of Buffers') - } - buf.copy(buffer, pos) - pos += buf.length - } - return buffer -} - -function byteLength (string, encoding) { - if (Buffer.isBuffer(string)) { - return string.length - } - if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && - (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) { - return string.byteLength - } - if (typeof string !== 'string') { - string = '' + string - } - - var len = string.length - if (len === 0) return 0 - - // Use a for loop to avoid recursion - var loweredCase = false - for (;;) { - switch (encoding) { - case 'ascii': - case 'latin1': - case 'binary': - return len - case 'utf8': - case 'utf-8': - case undefined: - return utf8ToBytes(string).length - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return len * 2 - case 'hex': - return len >>> 1 - case 'base64': - return base64ToBytes(string).length - default: - if (loweredCase) return utf8ToBytes(string).length // assume utf8 - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} -Buffer.byteLength = byteLength - -function slowToString (encoding, start, end) { - var loweredCase = false - - // No need to verify that "this.length <= MAX_UINT32" since it's a read-only - // property of a typed array. - - // This behaves neither like String nor Uint8Array in that we set start/end - // to their upper/lower bounds if the value passed is out of range. - // undefined is handled specially as per ECMA-262 6th Edition, - // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. - if (start === undefined || start < 0) { - start = 0 - } - // Return early if start > this.length. Done here to prevent potential uint32 - // coercion fail below. - if (start > this.length) { - return '' - } - - if (end === undefined || end > this.length) { - end = this.length - } - - if (end <= 0) { - return '' - } - - // Force coersion to uint32. This will also coerce falsey/NaN values to 0. - end >>>= 0 - start >>>= 0 - - if (end <= start) { - return '' - } - - if (!encoding) encoding = 'utf8' - - while (true) { - switch (encoding) { - case 'hex': - return hexSlice(this, start, end) - - case 'utf8': - case 'utf-8': - return utf8Slice(this, start, end) - - case 'ascii': - return asciiSlice(this, start, end) - - case 'latin1': - case 'binary': - return latin1Slice(this, start, end) - - case 'base64': - return base64Slice(this, start, end) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, start, end) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = (encoding + '').toLowerCase() - loweredCase = true - } - } -} - -// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect -// Buffer instances. -Buffer.prototype._isBuffer = true - -function swap (b, n, m) { - var i = b[n] - b[n] = b[m] - b[m] = i -} - -Buffer.prototype.swap16 = function swap16 () { - var len = this.length - if (len % 2 !== 0) { - throw new RangeError('Buffer size must be a multiple of 16-bits') - } - for (var i = 0; i < len; i += 2) { - swap(this, i, i + 1) - } - return this -} - -Buffer.prototype.swap32 = function swap32 () { - var len = this.length - if (len % 4 !== 0) { - throw new RangeError('Buffer size must be a multiple of 32-bits') - } - for (var i = 0; i < len; i += 4) { - swap(this, i, i + 3) - swap(this, i + 1, i + 2) - } - return this -} - -Buffer.prototype.swap64 = function swap64 () { - var len = this.length - if (len % 8 !== 0) { - throw new RangeError('Buffer size must be a multiple of 64-bits') - } - for (var i = 0; i < len; i += 8) { - swap(this, i, i + 7) - swap(this, i + 1, i + 6) - swap(this, i + 2, i + 5) - swap(this, i + 3, i + 4) - } - return this -} - -Buffer.prototype.toString = function toString () { - var length = this.length | 0 - if (length === 0) return '' - if (arguments.length === 0) return utf8Slice(this, 0, length) - return slowToString.apply(this, arguments) -} - -Buffer.prototype.equals = function equals (b) { - if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') - if (this === b) return true - return Buffer.compare(this, b) === 0 -} - -Buffer.prototype.inspect = function inspect () { - var str = '' - var max = exports.INSPECT_MAX_BYTES - if (this.length > 0) { - str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') - if (this.length > max) str += ' ... ' - } - return '<Buffer ' + str + '>' -} - -Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { - if (!Buffer.isBuffer(target)) { - throw new TypeError('Argument must be a Buffer') - } - - if (start === undefined) { - start = 0 - } - if (end === undefined) { - end = target ? target.length : 0 - } - if (thisStart === undefined) { - thisStart = 0 - } - if (thisEnd === undefined) { - thisEnd = this.length - } - - if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { - throw new RangeError('out of range index') - } - - if (thisStart >= thisEnd && start >= end) { - return 0 - } - if (thisStart >= thisEnd) { - return -1 - } - if (start >= end) { - return 1 - } - - start >>>= 0 - end >>>= 0 - thisStart >>>= 0 - thisEnd >>>= 0 - - if (this === target) return 0 - - var x = thisEnd - thisStart - var y = end - start - var len = Math.min(x, y) - - var thisCopy = this.slice(thisStart, thisEnd) - var targetCopy = target.slice(start, end) - - for (var i = 0; i < len; ++i) { - if (thisCopy[i] !== targetCopy[i]) { - x = thisCopy[i] - y = targetCopy[i] - break - } - } - - if (x < y) return -1 - if (y < x) return 1 - return 0 -} - -// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, -// OR the last index of `val` in `buffer` at offset <= `byteOffset`. -// -// Arguments: -// - buffer - a Buffer to search -// - val - a string, Buffer, or number -// - byteOffset - an index into `buffer`; will be clamped to an int32 -// - encoding - an optional encoding, relevant is val is a string -// - dir - true for indexOf, false for lastIndexOf -function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { - // Empty buffer means no match - if (buffer.length === 0) return -1 - - // Normalize byteOffset - if (typeof byteOffset === 'string') { - encoding = byteOffset - byteOffset = 0 - } else if (byteOffset > 0x7fffffff) { - byteOffset = 0x7fffffff - } else if (byteOffset < -0x80000000) { - byteOffset = -0x80000000 - } - byteOffset = +byteOffset // Coerce to Number. - if (isNaN(byteOffset)) { - // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer - byteOffset = dir ? 0 : (buffer.length - 1) - } - - // Normalize byteOffset: negative offsets start from the end of the buffer - if (byteOffset < 0) byteOffset = buffer.length + byteOffset - if (byteOffset >= buffer.length) { - if (dir) return -1 - else byteOffset = buffer.length - 1 - } else if (byteOffset < 0) { - if (dir) byteOffset = 0 - else return -1 - } - - // Normalize val - if (typeof val === 'string') { - val = Buffer.from(val, encoding) - } - - // Finally, search either indexOf (if dir is true) or lastIndexOf - if (Buffer.isBuffer(val)) { - // Special case: looking for empty string/buffer always fails - if (val.length === 0) { - return -1 - } - return arrayIndexOf(buffer, val, byteOffset, encoding, dir) - } else if (typeof val === 'number') { - val = val & 0xFF // Search for a byte value [0-255] - if (Buffer.TYPED_ARRAY_SUPPORT && - typeof Uint8Array.prototype.indexOf === 'function') { - if (dir) { - return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) - } else { - return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) - } - } - return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) - } - - throw new TypeError('val must be string, number or Buffer') -} - -function arrayIndexOf (arr, val, byteOffset, encoding, dir) { - var indexSize = 1 - var arrLength = arr.length - var valLength = val.length - - if (encoding !== undefined) { - encoding = String(encoding).toLowerCase() - if (encoding === 'ucs2' || encoding === 'ucs-2' || - encoding === 'utf16le' || encoding === 'utf-16le') { - if (arr.length < 2 || val.length < 2) { - return -1 - } - indexSize = 2 - arrLength /= 2 - valLength /= 2 - byteOffset /= 2 - } - } - - function read (buf, i) { - if (indexSize === 1) { - return buf[i] - } else { - return buf.readUInt16BE(i * indexSize) - } - } - - var i - if (dir) { - var foundIndex = -1 - for (i = byteOffset; i < arrLength; i++) { - if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { - if (foundIndex === -1) foundIndex = i - if (i - foundIndex + 1 === valLength) return foundIndex * indexSize - } else { - if (foundIndex !== -1) i -= i - foundIndex - foundIndex = -1 - } - } - } else { - if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength - for (i = byteOffset; i >= 0; i--) { - var found = true - for (var j = 0; j < valLength; j++) { - if (read(arr, i + j) !== read(val, j)) { - found = false - break - } - } - if (found) return i - } - } - - return -1 -} - -Buffer.prototype.includes = function includes (val, byteOffset, encoding) { - return this.indexOf(val, byteOffset, encoding) !== -1 -} - -Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, true) -} - -Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { - return bidirectionalIndexOf(this, val, byteOffset, encoding, false) -} - -function hexWrite (buf, string, offset, length) { - offset = Number(offset) || 0 - var remaining = buf.length - offset - if (!length) { - length = remaining - } else { - length = Number(length) - if (length > remaining) { - length = remaining - } - } - - // must be an even number of digits - var strLen = string.length - if (strLen % 2 !== 0) throw new TypeError('Invalid hex string') - - if (length > strLen / 2) { - length = strLen / 2 - } - for (var i = 0; i < length; ++i) { - var parsed = parseInt(string.substr(i * 2, 2), 16) - if (isNaN(parsed)) return i - buf[offset + i] = parsed - } - return i -} - -function utf8Write (buf, string, offset, length) { - return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) -} - -function asciiWrite (buf, string, offset, length) { - return blitBuffer(asciiToBytes(string), buf, offset, length) -} - -function latin1Write (buf, string, offset, length) { - return asciiWrite(buf, string, offset, length) -} - -function base64Write (buf, string, offset, length) { - return blitBuffer(base64ToBytes(string), buf, offset, length) -} - -function ucs2Write (buf, string, offset, length) { - return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) -} - -Buffer.prototype.write = function write (string, offset, length, encoding) { - // Buffer#write(string) - if (offset === undefined) { - encoding = 'utf8' - length = this.length - offset = 0 - // Buffer#write(string, encoding) - } else if (length === undefined && typeof offset === 'string') { - encoding = offset - length = this.length - offset = 0 - // Buffer#write(string, offset[, length][, encoding]) - } else if (isFinite(offset)) { - offset = offset | 0 - if (isFinite(length)) { - length = length | 0 - if (encoding === undefined) encoding = 'utf8' - } else { - encoding = length - length = undefined - } - // legacy write(string, encoding, offset, length) - remove in v0.13 - } else { - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ) - } - - var remaining = this.length - offset - if (length === undefined || length > remaining) length = remaining - - if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { - throw new RangeError('Attempt to write outside buffer bounds') - } - - if (!encoding) encoding = 'utf8' - - var loweredCase = false - for (;;) { - switch (encoding) { - case 'hex': - return hexWrite(this, string, offset, length) - - case 'utf8': - case 'utf-8': - return utf8Write(this, string, offset, length) - - case 'ascii': - return asciiWrite(this, string, offset, length) - - case 'latin1': - case 'binary': - return latin1Write(this, string, offset, length) - - case 'base64': - // Warning: maxLength not taken into account in base64Write - return base64Write(this, string, offset, length) - - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, string, offset, length) - - default: - if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) - encoding = ('' + encoding).toLowerCase() - loweredCase = true - } - } -} - -Buffer.prototype.toJSON = function toJSON () { - return { - type: 'Buffer', - data: Array.prototype.slice.call(this._arr || this, 0) - } -} - -function base64Slice (buf, start, end) { - if (start === 0 && end === buf.length) { - return base64.fromByteArray(buf) - } else { - return base64.fromByteArray(buf.slice(start, end)) - } -} - -function utf8Slice (buf, start, end) { - end = Math.min(buf.length, end) - var res = [] - - var i = start - while (i < end) { - var firstByte = buf[i] - var codePoint = null - var bytesPerSequence = (firstByte > 0xEF) ? 4 - : (firstByte > 0xDF) ? 3 - : (firstByte > 0xBF) ? 2 - : 1 - - if (i + bytesPerSequence <= end) { - var secondByte, thirdByte, fourthByte, tempCodePoint - - switch (bytesPerSequence) { - case 1: - if (firstByte < 0x80) { - codePoint = firstByte - } - break - case 2: - secondByte = buf[i + 1] - if ((secondByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) - if (tempCodePoint > 0x7F) { - codePoint = tempCodePoint - } - } - break - case 3: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) - if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { - codePoint = tempCodePoint - } - } - break - case 4: - secondByte = buf[i + 1] - thirdByte = buf[i + 2] - fourthByte = buf[i + 3] - if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { - tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) - if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { - codePoint = tempCodePoint - } - } - } - } - - if (codePoint === null) { - // we did not generate a valid codePoint so insert a - // replacement char (U+FFFD) and advance only 1 byte - codePoint = 0xFFFD - bytesPerSequence = 1 - } else if (codePoint > 0xFFFF) { - // encode to utf16 (surrogate pair dance) - codePoint -= 0x10000 - res.push(codePoint >>> 10 & 0x3FF | 0xD800) - codePoint = 0xDC00 | codePoint & 0x3FF - } - - res.push(codePoint) - i += bytesPerSequence - } - - return decodeCodePointsArray(res) -} - -// Based on http://stackoverflow.com/a/22747272/680742, the browser with -// the lowest limit is Chrome, with 0x10000 args. -// We go 1 magnitude less, for safety -var MAX_ARGUMENTS_LENGTH = 0x1000 - -function decodeCodePointsArray (codePoints) { - var len = codePoints.length - if (len <= MAX_ARGUMENTS_LENGTH) { - return String.fromCharCode.apply(String, codePoints) // avoid extra slice() - } - - // Decode in chunks to avoid "call stack size exceeded". - var res = '' - var i = 0 - while (i < len) { - res += String.fromCharCode.apply( - String, - codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) - ) - } - return res -} - -function asciiSlice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i] & 0x7F) - } - return ret -} - -function latin1Slice (buf, start, end) { - var ret = '' - end = Math.min(buf.length, end) - - for (var i = start; i < end; ++i) { - ret += String.fromCharCode(buf[i]) - } - return ret -} - -function hexSlice (buf, start, end) { - var len = buf.length - - if (!start || start < 0) start = 0 - if (!end || end < 0 || end > len) end = len - - var out = '' - for (var i = start; i < end; ++i) { - out += toHex(buf[i]) - } - return out -} - -function utf16leSlice (buf, start, end) { - var bytes = buf.slice(start, end) - var res = '' - for (var i = 0; i < bytes.length; i += 2) { - res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) - } - return res -} - -Buffer.prototype.slice = function slice (start, end) { - var len = this.length - start = ~~start - end = end === undefined ? len : ~~end - - if (start < 0) { - start += len - if (start < 0) start = 0 - } else if (start > len) { - start = len - } - - if (end < 0) { - end += len - if (end < 0) end = 0 - } else if (end > len) { - end = len - } - - if (end < start) end = start - - var newBuf - if (Buffer.TYPED_ARRAY_SUPPORT) { - newBuf = this.subarray(start, end) - newBuf.__proto__ = Buffer.prototype - } else { - var sliceLen = end - start - newBuf = new Buffer(sliceLen, undefined) - for (var i = 0; i < sliceLen; ++i) { - newBuf[i] = this[i + start] - } - } - - return newBuf -} - -/* - * Need to make sure that buffer isn't trying to write out of bounds. - */ -function checkOffset (offset, ext, length) { - if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') - if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') -} - -Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - - return val -} - -Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - checkOffset(offset, byteLength, this.length) - } - - var val = this[offset + --byteLength] - var mul = 1 - while (byteLength > 0 && (mul *= 0x100)) { - val += this[offset + --byteLength] * mul - } - - return val -} - -Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - return this[offset] -} - -Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return this[offset] | (this[offset + 1] << 8) -} - -Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - return (this[offset] << 8) | this[offset + 1] -} - -Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return ((this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16)) + - (this[offset + 3] * 0x1000000) -} - -Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] * 0x1000000) + - ((this[offset + 1] << 16) | - (this[offset + 2] << 8) | - this[offset + 3]) -} - -Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var val = this[offset] - var mul = 1 - var i = 0 - while (++i < byteLength && (mul *= 0x100)) { - val += this[offset + i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) checkOffset(offset, byteLength, this.length) - - var i = byteLength - var mul = 1 - var val = this[offset + --i] - while (i > 0 && (mul *= 0x100)) { - val += this[offset + --i] * mul - } - mul *= 0x80 - - if (val >= mul) val -= Math.pow(2, 8 * byteLength) - - return val -} - -Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { - if (!noAssert) checkOffset(offset, 1, this.length) - if (!(this[offset] & 0x80)) return (this[offset]) - return ((0xff - this[offset] + 1) * -1) -} - -Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset] | (this[offset + 1] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 2, this.length) - var val = this[offset + 1] | (this[offset] << 8) - return (val & 0x8000) ? val | 0xFFFF0000 : val -} - -Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset]) | - (this[offset + 1] << 8) | - (this[offset + 2] << 16) | - (this[offset + 3] << 24) -} - -Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - - return (this[offset] << 24) | - (this[offset + 1] << 16) | - (this[offset + 2] << 8) | - (this[offset + 3]) -} - -Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, true, 23, 4) -} - -Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 4, this.length) - return ieee754.read(this, offset, false, 23, 4) -} - -Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, true, 52, 8) -} - -Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { - if (!noAssert) checkOffset(offset, 8, this.length) - return ieee754.read(this, offset, false, 52, 8) -} - -function checkInt (buf, value, offset, ext, max, min) { - if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') - if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') - if (offset + ext > buf.length) throw new RangeError('Index out of range') -} - -Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } - - var mul = 1 - var i = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - byteLength = byteLength | 0 - if (!noAssert) { - var maxBytes = Math.pow(2, 8 * byteLength) - 1 - checkInt(this, value, offset, byteLength, maxBytes, 0) - } - - var i = byteLength - 1 - var mul = 1 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - this[offset + i] = (value / mul) & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - this[offset] = (value & 0xff) - return offset + 1 -} - -function objectWriteUInt16 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) { - buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> - (littleEndian ? i : 1 - i) * 8 - } -} - -Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -function objectWriteUInt32 (buf, value, offset, littleEndian) { - if (value < 0) value = 0xffffffff + value + 1 - for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) { - buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff - } -} - -Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset + 3] = (value >>> 24) - this[offset + 2] = (value >>> 16) - this[offset + 1] = (value >>> 8) - this[offset] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = 0 - var mul = 1 - var sub = 0 - this[offset] = value & 0xFF - while (++i < byteLength && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { - sub = 1 - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) { - var limit = Math.pow(2, 8 * byteLength - 1) - - checkInt(this, value, offset, byteLength, limit - 1, -limit) - } - - var i = byteLength - 1 - var mul = 1 - var sub = 0 - this[offset + i] = value & 0xFF - while (--i >= 0 && (mul *= 0x100)) { - if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { - sub = 1 - } - this[offset + i] = ((value / mul) >> 0) - sub & 0xFF - } - - return offset + byteLength -} - -Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) - if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) - if (value < 0) value = 0xff + value + 1 - this[offset] = (value & 0xff) - return offset + 1 -} - -Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - } else { - objectWriteUInt16(this, value, offset, true) - } - return offset + 2 -} - -Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 8) - this[offset + 1] = (value & 0xff) - } else { - objectWriteUInt16(this, value, offset, false) - } - return offset + 2 -} - -Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value & 0xff) - this[offset + 1] = (value >>> 8) - this[offset + 2] = (value >>> 16) - this[offset + 3] = (value >>> 24) - } else { - objectWriteUInt32(this, value, offset, true) - } - return offset + 4 -} - -Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { - value = +value - offset = offset | 0 - if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) - if (value < 0) value = 0xffffffff + value + 1 - if (Buffer.TYPED_ARRAY_SUPPORT) { - this[offset] = (value >>> 24) - this[offset + 1] = (value >>> 16) - this[offset + 2] = (value >>> 8) - this[offset + 3] = (value & 0xff) - } else { - objectWriteUInt32(this, value, offset, false) - } - return offset + 4 -} - -function checkIEEE754 (buf, value, offset, ext, max, min) { - if (offset + ext > buf.length) throw new RangeError('Index out of range') - if (offset < 0) throw new RangeError('Index out of range') -} - -function writeFloat (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) - } - ieee754.write(buf, value, offset, littleEndian, 23, 4) - return offset + 4 -} - -Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { - return writeFloat(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { - return writeFloat(this, value, offset, false, noAssert) -} - -function writeDouble (buf, value, offset, littleEndian, noAssert) { - if (!noAssert) { - checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) - } - ieee754.write(buf, value, offset, littleEndian, 52, 8) - return offset + 8 -} - -Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { - return writeDouble(this, value, offset, true, noAssert) -} - -Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { - return writeDouble(this, value, offset, false, noAssert) -} - -// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) -Buffer.prototype.copy = function copy (target, targetStart, start, end) { - if (!start) start = 0 - if (!end && end !== 0) end = this.length - if (targetStart >= target.length) targetStart = target.length - if (!targetStart) targetStart = 0 - if (end > 0 && end < start) end = start - - // Copy 0 bytes; we're done - if (end === start) return 0 - if (target.length === 0 || this.length === 0) return 0 - - // Fatal error conditions - if (targetStart < 0) { - throw new RangeError('targetStart out of bounds') - } - if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') - if (end < 0) throw new RangeError('sourceEnd out of bounds') - - // Are we oob? - if (end > this.length) end = this.length - if (target.length - targetStart < end - start) { - end = target.length - targetStart + start - } - - var len = end - start - var i - - if (this === target && start < targetStart && targetStart < end) { - // descending copy from end - for (i = len - 1; i >= 0; --i) { - target[i + targetStart] = this[i + start] - } - } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { - // ascending copy from start - for (i = 0; i < len; ++i) { - target[i + targetStart] = this[i + start] - } - } else { - Uint8Array.prototype.set.call( - target, - this.subarray(start, start + len), - targetStart - ) - } - - return len -} - -// Usage: -// buffer.fill(number[, offset[, end]]) -// buffer.fill(buffer[, offset[, end]]) -// buffer.fill(string[, offset[, end]][, encoding]) -Buffer.prototype.fill = function fill (val, start, end, encoding) { - // Handle string cases: - if (typeof val === 'string') { - if (typeof start === 'string') { - encoding = start - start = 0 - end = this.length - } else if (typeof end === 'string') { - encoding = end - end = this.length - } - if (val.length === 1) { - var code = val.charCodeAt(0) - if (code < 256) { - val = code - } - } - if (encoding !== undefined && typeof encoding !== 'string') { - throw new TypeError('encoding must be a string') - } - if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { - throw new TypeError('Unknown encoding: ' + encoding) - } - } else if (typeof val === 'number') { - val = val & 255 - } - - // Invalid ranges are not set to a default, so can range check early. - if (start < 0 || this.length < start || this.length < end) { - throw new RangeError('Out of range index') - } - - if (end <= start) { - return this - } - - start = start >>> 0 - end = end === undefined ? this.length : end >>> 0 - - if (!val) val = 0 - - var i - if (typeof val === 'number') { - for (i = start; i < end; ++i) { - this[i] = val - } - } else { - var bytes = Buffer.isBuffer(val) - ? val - : utf8ToBytes(new Buffer(val, encoding).toString()) - var len = bytes.length - for (i = 0; i < end - start; ++i) { - this[i + start] = bytes[i % len] - } - } - - return this -} - -// HELPER FUNCTIONS -// ================ - -var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g - -function base64clean (str) { - // Node strips out invalid characters like \n and \t from the string, base64-js does not - str = stringtrim(str).replace(INVALID_BASE64_RE, '') - // Node converts strings with length < 2 to '' - if (str.length < 2) return '' - // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not - while (str.length % 4 !== 0) { - str = str + '=' - } - return str -} - -function stringtrim (str) { - if (str.trim) return str.trim() - return str.replace(/^\s+|\s+$/g, '') -} - -function toHex (n) { - if (n < 16) return '0' + n.toString(16) - return n.toString(16) -} - -function utf8ToBytes (string, units) { - units = units || Infinity - var codePoint - var length = string.length - var leadSurrogate = null - var bytes = [] - - for (var i = 0; i < length; ++i) { - codePoint = string.charCodeAt(i) - - // is surrogate component - if (codePoint > 0xD7FF && codePoint < 0xE000) { - // last char was a lead - if (!leadSurrogate) { - // no lead yet - if (codePoint > 0xDBFF) { - // unexpected trail - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } else if (i + 1 === length) { - // unpaired lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - continue - } - - // valid lead - leadSurrogate = codePoint - - continue - } - - // 2 leads in a row - if (codePoint < 0xDC00) { - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - leadSurrogate = codePoint - continue - } - - // valid surrogate pair - codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 - } else if (leadSurrogate) { - // valid bmp char, but last char was a lead - if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) - } - - leadSurrogate = null - - // encode utf8 - if (codePoint < 0x80) { - if ((units -= 1) < 0) break - bytes.push(codePoint) - } else if (codePoint < 0x800) { - if ((units -= 2) < 0) break - bytes.push( - codePoint >> 0x6 | 0xC0, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x10000) { - if ((units -= 3) < 0) break - bytes.push( - codePoint >> 0xC | 0xE0, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else if (codePoint < 0x110000) { - if ((units -= 4) < 0) break - bytes.push( - codePoint >> 0x12 | 0xF0, - codePoint >> 0xC & 0x3F | 0x80, - codePoint >> 0x6 & 0x3F | 0x80, - codePoint & 0x3F | 0x80 - ) - } else { - throw new Error('Invalid code point') - } - } - - return bytes -} - -function asciiToBytes (str) { - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - // Node's code seems to be doing this and not & 0x7F.. - byteArray.push(str.charCodeAt(i) & 0xFF) - } - return byteArray -} - -function utf16leToBytes (str, units) { - var c, hi, lo - var byteArray = [] - for (var i = 0; i < str.length; ++i) { - if ((units -= 2) < 0) break - - c = str.charCodeAt(i) - hi = c >> 8 - lo = c % 256 - byteArray.push(lo) - byteArray.push(hi) - } - - return byteArray -} - -function base64ToBytes (str) { - return base64.toByteArray(base64clean(str)) -} - -function blitBuffer (src, dst, offset, length) { - for (var i = 0; i < length; ++i) { - if ((i + offset >= dst.length) || (i >= src.length)) break - dst[i + offset] = src[i] - } - return i -} - -function isnan (val) { - return val !== val // eslint-disable-line no-self-compare -} - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(23))) - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(19); -module.exports = function(it){ - if(!isObject(it))throw TypeError(it + ' is not an object!'); - return it; -}; - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(4) - , IE8_DOM_DEFINE = __webpack_require__(59) - , toPrimitive = __webpack_require__(43) - , dP = Object.defineProperty; - -exports.f = __webpack_require__(6) ? Object.defineProperty : function defineProperty(O, P, Attributes){ - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if(IE8_DOM_DEFINE)try { - return dP(O, P, Attributes); - } catch(e){ /* empty */ } - if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); - if('value' in Attributes)O[P] = Attributes.value; - return O; -}; - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - -// Thank's IE8 for his funny defineProperty -module.exports = !__webpack_require__(13)(function(){ - return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; -}); - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(2) - , core = __webpack_require__(0) - , ctx = __webpack_require__(18) - , hide = __webpack_require__(9) - , PROTOTYPE = 'prototype'; - -var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , IS_WRAP = type & $export.W - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , expProto = exports[PROTOTYPE] - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] - , key, own, out; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - if(own && key in exports)continue; - // export native or passed - out = own ? target[key] : source[key]; - // prevent global pollution for namespaces - exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] - // bind timers to global for call from export context - : IS_BIND && own ? ctx(out, global) - // wrap global constructors for prevent change them in library - : IS_WRAP && target[key] == out ? (function(C){ - var F = function(a, b, c){ - if(this instanceof C){ - switch(arguments.length){ - case 0: return new C; - case 1: return new C(a); - case 2: return new C(a, b); - } return new C(a, b, c); - } return C.apply(this, arguments); - }; - F[PROTOTYPE] = C[PROTOTYPE]; - return F; - // make static versions for prototype methods - })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% - if(IS_PROTO){ - (exports.virtual || (exports.virtual = {}))[key] = out; - // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% - if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out); - } - } -}; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - -var hasOwnProperty = {}.hasOwnProperty; -module.exports = function(it, key){ - return hasOwnProperty.call(it, key); -}; - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(5) - , createDesc = __webpack_require__(20); -module.exports = __webpack_require__(6) ? function(object, key, value){ - return dP.f(object, key, createDesc(1, value)); -} : function(object, key, value){ - object[key] = value; - return object; -}; - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = __webpack_require__(60) - , defined = __webpack_require__(35); -module.exports = function(it){ - return IObject(defined(it)); -}; - -/***/ }), -/* 11 */ -/***/ (function(module, exports) { - -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// a duplex stream is just a stream that is both readable and writable. -// Since JS doesn't have multiple prototypal inheritance, this class -// prototypally inherits from Readable, and then parasitically from -// Writable. - - - -/*<replacement>*/ - -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - }return keys; -}; -/*</replacement>*/ - -module.exports = Duplex; - -/*<replacement>*/ -var processNextTick = __webpack_require__(49); -/*</replacement>*/ - -/*<replacement>*/ -var util = __webpack_require__(22); -util.inherits = __webpack_require__(16); -/*</replacement>*/ - -var Readable = __webpack_require__(72); -var Writable = __webpack_require__(50); - -util.inherits(Duplex, Readable); - -var keys = objectKeys(Writable.prototype); -for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; -} - -function Duplex(options) { - if (!(this instanceof Duplex)) return new Duplex(options); - - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) this.readable = false; - - if (options && options.writable === false) this.writable = false; - - this.allowHalfOpen = true; - if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; - - this.once('end', onend); -} - -// the no-half-open enforcer -function onend() { - // if we allow half-open state, or if the writable side ended, - // then we're ok. - if (this.allowHalfOpen || this._writableState.ended) return; - - // no more data can be written. - // But allow more writes to happen in this tick. - processNextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -/***/ }), -/* 13 */ -/***/ (function(module, exports) { - -module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } -}; - -/***/ }), -/* 14 */ -/***/ (function(module, exports) { - -module.exports = {}; - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = __webpack_require__(67) - , enumBugKeys = __webpack_require__(37); - -module.exports = Object.keys || function keys(O){ - return $keys(O, enumBugKeys); -}; - -/***/ }), -/* 16 */ -/***/ (function(module, exports) { - -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - - -/***/ }), -/* 17 */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = function(it){ - return toString.call(it).slice(8, -1); -}; - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -// optional / simple context binding -var aFunction = __webpack_require__(33); -module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); - }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; -}; - -/***/ }), -/* 19 */ -/***/ (function(module, exports) { - -module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; - -/***/ }), -/* 20 */ -/***/ (function(module, exports) { - -module.exports = function(bitmap, value){ - return { - enumerable : !(bitmap & 1), - configurable: !(bitmap & 2), - writable : !(bitmap & 4), - value : value - }; -}; - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $at = __webpack_require__(124)(true); - -// 21.1.3.27 String.prototype[@@iterator]() -__webpack_require__(63)(String, 'String', function(iterated){ - this._t = String(iterated); // target - this._i = 0; // next index -// 21.1.5.2.1 %StringIteratorPrototype%.next() -}, function(){ - var O = this._t - , index = this._i - , point; - if(index >= O.length)return {value: undefined, done: true}; - point = $at(O, index); - this._i += point.length; - return {value: point, done: false}; -}); - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(Buffer) {// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3).Buffer)) - -/***/ }), -/* 23 */ -/***/ (function(module, exports) { - -var g;
-
-// This works in non-strict mode
-g = (function() {
- return this;
-})();
-
-try {
- // This works if eval is allowed (see CSP)
- g = g || Function("return this")() || (1,eval)("this");
-} catch(e) {
- // This works if the window reference is available
- if(typeof window === "object")
- g = window;
-}
-
-// g can still be undefined, but nothing to do about it...
-// We return undefined, instead of nothing here, so it's
-// easier to handle this case. if(!global) { ...}
-
-module.exports = g;
- - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - -var __WEBPACK_AMD_DEFINE_RESULT__;(function(root, factory){ - - //UMD - if ( true ) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { - return factory(); - }.call(exports, __webpack_require__, exports, module), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else if (typeof module === "object") { - module.exports = factory(); - } else { - root.Tone = factory(); - } - -}(this, function(){ - - "use strict"; - - var Tone; - //constructs the main Tone object - function Main(func){ - Tone = func(); - } - //invokes each of the modules with the main Tone object as the argument - function Module(func){ - func(Tone); - } /** * Tone.js * @author Yotam Mann * @license http://opensource.org/licenses/MIT MIT License * @copyright 2014-2018 Yotam Mann - */ - Main(function () { - - /////////////////////////////////////////////////////////////////////////// - // TONE - /////////////////////////////////////////////////////////////////////////// - /** - * @class Tone is the base class of all other classes. - * @constructor - */ - var Tone = function () { - if (!(this instanceof Tone)) { - throw new Error('constructor needs to be called with the \'new\' keyword'); - } - }; - /** - * @memberOf Tone# - * @returns {String} returns the name of the class as a string - */ - Tone.prototype.toString = function () { - for (var className in Tone) { - var isLetter = className[0].match(/^[A-Z]$/); - var sameConstructor = Tone[className] === this.constructor; - if (Tone.isFunction(Tone[className]) && isLetter && sameConstructor) { - return className; - } - } - return 'Tone'; - }; - /** - * @memberOf Tone# - * disconnect and dispose - * @returns {Tone} this - */ - Tone.prototype.dispose = function () { - return this; - }; - /////////////////////////////////////////////////////////////////////////// - // GET/SET - /////////////////////////////////////////////////////////////////////////// - /** - * Set the parameters at once. Either pass in an - * object mapping parameters to values, or to set a - * single parameter, by passing in a string and value. - * The last argument is an optional ramp time which - * will ramp any signal values to their destination value - * over the duration of the rampTime. - * @param {Object|String} params - * @param {Number=} value - * @param {Time=} rampTime - * @returns {Tone} this - * @memberOf Tone# - * @example - * //set values using an object - * filter.set({ - * "frequency" : 300, - * "type" : highpass - * }); - * @example - * filter.set("type", "highpass"); - * @example - * //ramp to the value 220 over 3 seconds. - * oscillator.set({ - * "frequency" : 220 - * }, 3); - */ - Tone.prototype.set = function (params, value, rampTime) { - if (Tone.isObject(params)) { - rampTime = value; - } else if (Tone.isString(params)) { - var tmpObj = {}; - tmpObj[params] = value; - params = tmpObj; - } - paramLoop: - for (var attr in params) { - value = params[attr]; - var parent = this; - if (attr.indexOf('.') !== -1) { - var attrSplit = attr.split('.'); - for (var i = 0; i < attrSplit.length - 1; i++) { - parent = parent[attrSplit[i]]; - if (parent instanceof Tone) { - attrSplit.splice(0, i + 1); - var innerParam = attrSplit.join('.'); - parent.set(innerParam, value); - continue paramLoop; - } - } - attr = attrSplit[attrSplit.length - 1]; - } - var param = parent[attr]; - if (Tone.isUndef(param)) { - continue; - } - if (Tone.Signal && param instanceof Tone.Signal || Tone.Param && param instanceof Tone.Param) { - if (param.value !== value) { - if (Tone.isUndef(rampTime)) { - param.value = value; - } else { - param.rampTo(value, rampTime); - } - } - } else if (param instanceof AudioParam) { - if (param.value !== value) { - param.value = value; - } - } else if (Tone.TimeBase && param instanceof Tone.TimeBase) { - parent[attr] = value; - } else if (param instanceof Tone) { - param.set(value); - } else if (param !== value) { - parent[attr] = value; - } - } - return this; - }; - /** - * Get the object's attributes. Given no arguments get - * will return all available object properties and their corresponding - * values. Pass in a single attribute to retrieve or an array - * of attributes. The attribute strings can also include a "." - * to access deeper properties. - * @memberOf Tone# - * @example - * osc.get(); - * //returns {"type" : "sine", "frequency" : 440, ...etc} - * @example - * osc.get("type"); - * //returns { "type" : "sine"} - * @example - * //use dot notation to access deep properties - * synth.get(["envelope.attack", "envelope.release"]); - * //returns {"envelope" : {"attack" : 0.2, "release" : 0.4}} - * @param {Array=|string|undefined} params the parameters to get, otherwise will return - * all available. - * @returns {Object} - */ - Tone.prototype.get = function (params) { - if (Tone.isUndef(params)) { - params = this._collectDefaults(this.constructor); - } else if (Tone.isString(params)) { - params = [params]; - } - var ret = {}; - for (var i = 0; i < params.length; i++) { - var attr = params[i]; - var parent = this; - var subRet = ret; - if (attr.indexOf('.') !== -1) { - var attrSplit = attr.split('.'); - for (var j = 0; j < attrSplit.length - 1; j++) { - var subAttr = attrSplit[j]; - subRet[subAttr] = subRet[subAttr] || {}; - subRet = subRet[subAttr]; - parent = parent[subAttr]; - } - attr = attrSplit[attrSplit.length - 1]; - } - var param = parent[attr]; - if (Tone.isObject(params[attr])) { - subRet[attr] = param.get(); - } else if (Tone.Signal && param instanceof Tone.Signal) { - subRet[attr] = param.value; - } else if (Tone.Param && param instanceof Tone.Param) { - subRet[attr] = param.value; - } else if (param instanceof AudioParam) { - subRet[attr] = param.value; - } else if (param instanceof Tone) { - subRet[attr] = param.get(); - } else if (!Tone.isFunction(param) && Tone.isDefined(param)) { - subRet[attr] = param; - } - } - return ret; - }; - /** - * collect all of the default attributes in one - * @private - * @param {Function} constr the constructor to find the defaults from - * @return {Array} all of the attributes which belong to the class - */ - Tone.prototype._collectDefaults = function (constr) { - var ret = []; - if (Tone.isDefined(constr.defaults)) { - ret = Object.keys(constr.defaults); - } - if (Tone.isDefined(constr._super)) { - var superDefs = this._collectDefaults(constr._super); - //filter out repeats - for (var i = 0; i < superDefs.length; i++) { - if (ret.indexOf(superDefs[i]) === -1) { - ret.push(superDefs[i]); - } - } - } - return ret; - }; - /////////////////////////////////////////////////////////////////////////// - // DEFAULTS - /////////////////////////////////////////////////////////////////////////// - /** - * @memberOf Tone - * @param {Array} values The arguments array - * @param {Array} keys The names of the arguments - * @param {Function|Object} constr The class constructor - * @return {Object} An object composed of the defaults between the class' defaults - * and the passed in arguments. - */ - Tone.defaults = function (values, keys, constr) { - var options = {}; - if (values.length === 1 && Tone.isObject(values[0])) { - options = values[0]; - } else { - for (var i = 0; i < keys.length; i++) { - options[keys[i]] = values[i]; - } - } - if (Tone.isDefined(constr.defaults)) { - return Tone.defaultArg(options, constr.defaults); - } else if (Tone.isObject(constr)) { - return Tone.defaultArg(options, constr); - } else { - return options; - } - }; - /** - * If the `given` parameter is undefined, use the `fallback`. - * If both `given` and `fallback` are object literals, it will - * return a deep copy which includes all of the parameters from both - * objects. If a parameter is undefined in given, it will return - * the fallback property. - * <br><br> - * WARNING: if object is self referential, it will go into an an - * infinite recursive loop. - * @memberOf Tone - * @param {*} given - * @param {*} fallback - * @return {*} - */ - Tone.defaultArg = function (given, fallback) { - if (Tone.isObject(given) && Tone.isObject(fallback)) { - var ret = {}; - //make a deep copy of the given object - for (var givenProp in given) { - ret[givenProp] = Tone.defaultArg(fallback[givenProp], given[givenProp]); - } - for (var fallbackProp in fallback) { - ret[fallbackProp] = Tone.defaultArg(given[fallbackProp], fallback[fallbackProp]); - } - return ret; - } else { - return Tone.isUndef(given) ? fallback : given; - } - }; - /////////////////////////////////////////////////////////////////////////// - // CONNECTIONS - /////////////////////////////////////////////////////////////////////////// - /** - * connect together all of the arguments in series - * @param {...AudioParam|Tone|AudioNode} nodes - * @returns {Tone} - * @memberOf Tone - * @static - */ - Tone.connectSeries = function () { - var currentUnit = arguments[0]; - for (var i = 1; i < arguments.length; i++) { - var toUnit = arguments[i]; - currentUnit.connect(toUnit); - currentUnit = toUnit; - } - return Tone; - }; - /////////////////////////////////////////////////////////////////////////// - // TYPE CHECKING - /////////////////////////////////////////////////////////////////////////// - /** - * Test if the arg is undefined - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is undefined - * @static - * @memberOf Tone - */ - Tone.isUndef = function (val) { - return typeof val === 'undefined'; - }; - /** - * Test if the arg is not undefined - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is undefined - * @static - * @memberOf Tone - */ - Tone.isDefined = function (val) { - return !Tone.isUndef(val); - }; - /** - * Test if the arg is a function - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is a function - * @static - * @memberOf Tone - */ - Tone.isFunction = function (val) { - return typeof val === 'function'; - }; - /** - * Test if the argument is a number. - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is a number - * @static - * @memberOf Tone - */ - Tone.isNumber = function (arg) { - return typeof arg === 'number'; - }; - /** - * Test if the given argument is an object literal (i.e. `{}`); - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is an object literal. - * @static - * @memberOf Tone - */ - Tone.isObject = function (arg) { - return Object.prototype.toString.call(arg) === '[object Object]' && arg.constructor === Object; - }; - /** - * Test if the argument is a boolean. - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is a boolean - * @static - * @memberOf Tone - */ - Tone.isBoolean = function (arg) { - return typeof arg === 'boolean'; - }; - /** - * Test if the argument is an Array - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is an array - * @static - * @memberOf Tone - */ - Tone.isArray = function (arg) { - return Array.isArray(arg); - }; - /** - * Test if the argument is a string. - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is a string - * @static - * @memberOf Tone - */ - Tone.isString = function (arg) { - return typeof arg === 'string'; - }; - /** - * Test if the argument is in the form of a note in scientific pitch notation. - * e.g. "C4" - * @param {*} arg the argument to test - * @returns {Boolean} true if the arg is a string - * @static - * @memberOf Tone - */ - Tone.isNote = function (arg) { - return Tone.isString(arg) && /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i.test(arg); - }; - /** - * An empty function. - * @static - */ - Tone.noOp = function () { - }; - /** - * Make the property not writable. Internal use only. - * @private - * @param {String} property the property to make not writable - */ - Tone.prototype._readOnly = function (property) { - if (Array.isArray(property)) { - for (var i = 0; i < property.length; i++) { - this._readOnly(property[i]); - } - } else { - Object.defineProperty(this, property, { - writable: false, - enumerable: true - }); - } - }; - /** - * Make an attribute writeable. Interal use only. - * @private - * @param {String} property the property to make writable - */ - Tone.prototype._writable = function (property) { - if (Array.isArray(property)) { - for (var i = 0; i < property.length; i++) { - this._writable(property[i]); - } - } else { - Object.defineProperty(this, property, { writable: true }); - } - }; - /** - * Possible play states. - * @enum {String} - */ - Tone.State = { - Started: 'started', - Stopped: 'stopped', - Paused: 'paused' - }; - /////////////////////////////////////////////////////////////////////////// - // CONVERSIONS - /////////////////////////////////////////////////////////////////////////// - /** - * Equal power gain scale. Good for cross-fading. - * @param {NormalRange} percent (0-1) - * @return {Number} output gain (0-1) - * @static - * @memberOf Tone - */ - Tone.equalPowerScale = function (percent) { - var piFactor = 0.5 * Math.PI; - return Math.sin(percent * piFactor); - }; - /** - * Convert decibels into gain. - * @param {Decibels} db - * @return {Number} - * @static - * @memberOf Tone - */ - Tone.dbToGain = function (db) { - return Math.pow(10, db / 20); - }; - /** - * Convert gain to decibels. - * @param {Number} gain (0-1) - * @return {Decibels} - * @static - * @memberOf Tone - */ - Tone.gainToDb = function (gain) { - return 20 * (Math.log(gain) / Math.LN10); - }; - /** - * Convert an interval (in semitones) to a frequency ratio. - * @param {Interval} interval the number of semitones above the base note - * @return {Number} the frequency ratio - * @static - * @memberOf Tone - * @example - * tone.intervalToFrequencyRatio(0); // 1 - * tone.intervalToFrequencyRatio(12); // 2 - * tone.intervalToFrequencyRatio(-12); // 0.5 - */ - Tone.intervalToFrequencyRatio = function (interval) { - return Math.pow(2, interval / 12); - }; - /////////////////////////////////////////////////////////////////////////// - // TIMING - /////////////////////////////////////////////////////////////////////////// - /** - * Return the current time of the AudioContext clock. - * @return {Number} the currentTime from the AudioContext - * @memberOf Tone# - */ - Tone.prototype.now = function () { - return Tone.context.now(); - }; - /** - * Return the current time of the AudioContext clock. - * @return {Number} the currentTime from the AudioContext - * @static - * @memberOf Tone - */ - Tone.now = function () { - return Tone.context.now(); - }; - /////////////////////////////////////////////////////////////////////////// - // INHERITANCE - /////////////////////////////////////////////////////////////////////////// - /** - * have a child inherit all of Tone's (or a parent's) prototype - * to inherit the parent's properties, make sure to call - * Parent.call(this) in the child's constructor - * - * based on closure library's inherit function - * - * @memberOf Tone - * @static - * @param {Function} child - * @param {Function=} parent (optional) parent to inherit from - * if no parent is supplied, the child - * will inherit from Tone - */ - Tone.extend = function (child, parent) { - if (Tone.isUndef(parent)) { - parent = Tone; - } - function TempConstructor() { - } - TempConstructor.prototype = parent.prototype; - child.prototype = new TempConstructor(); - /** @override */ - child.prototype.constructor = child; - child._super = parent; - }; - /////////////////////////////////////////////////////////////////////////// - // CONTEXT - /////////////////////////////////////////////////////////////////////////// - /** - * Private reference to the global AudioContext - * @type {AudioContext} - * @private - */ - var audioContext = null; - /** - * A static pointer to the audio context accessible as Tone.context. - * @type {Tone.Context} - * @name context - * @memberOf Tone - */ - Object.defineProperty(Tone, 'context', { - get: function () { - return audioContext; - }, - set: function (context) { - if (Tone.Context && context instanceof Tone.Context) { - audioContext = context; - } else { - audioContext = new Tone.Context(context); - } - //initialize the new audio context - Tone.Context.emit('init', audioContext); - } - }); - /** - * The AudioContext - * @type {Tone.Context} - * @name context - * @memberOf Tone# - * @readOnly - */ - Object.defineProperty(Tone.prototype, 'context', { - get: function () { - return Tone.context; - } - }); - /** - * Tone automatically creates a context on init, but if you are working - * with other libraries which also create an AudioContext, it can be - * useful to set your own. If you are going to set your own context, - * be sure to do it at the start of your code, before creating any objects. - * @static - * @param {AudioContext} ctx The new audio context to set - */ - Tone.setContext = function (ctx) { - Tone.context = ctx; - }; - /////////////////////////////////////////////////////////////////////////// - // ATTRIBUTES - /////////////////////////////////////////////////////////////////////////// - /** - * The number of seconds of 1 processing block (128 samples) - * @type {Number} - * @name blockTime - * @memberOf Tone - * @static - * @readOnly - */ - Object.defineProperty(Tone.prototype, 'blockTime', { - get: function () { - return 128 / this.context.sampleRate; - } - }); - /** - * The duration in seconds of one sample. - * @type {Number} - * @name sampleTime - * @memberOf Tone - * @static - * @readOnly - */ - Object.defineProperty(Tone.prototype, 'sampleTime', { - get: function () { - return 1 / this.context.sampleRate; - } - }); - /** - * Whether or not all the technologies that Tone.js relies on are supported by the current browser. - * @type {Boolean} - * @name supported - * @memberOf Tone - * @readOnly - * @static - */ - Object.defineProperty(Tone, 'supported', { - get: function () { - var hasAudioContext = window.hasOwnProperty('AudioContext') || window.hasOwnProperty('webkitAudioContext'); - var hasPromises = window.hasOwnProperty('Promise'); - var hasWorkers = window.hasOwnProperty('Worker'); - return hasAudioContext && hasPromises && hasWorkers; - } - }); - /** - * Boolean value if the audio context has been initialized. - * @type {Boolean} - * @memberOf Tone - * @static - * @name initialized - */ - Object.defineProperty(Tone, 'initialized', { - get: function () { - return audioContext !== null; - } - }); - /** - * Get the context when it becomes available - * @param {Function} resolve Callback when the context is initialized - * @return {Tone} - */ - Tone.getContext = function (resolve) { - if (Tone.initialized) { - resolve(Tone.context); - } else { - var resCallback = function () { - resolve(Tone.context); - Tone.Context.off('init', resCallback); - }; - Tone.Context.on('init', resCallback); - } - return Tone; - }; - /** - * The version number - * @type {String} - * @static - */ - Tone.version = 'r12'; - return Tone; - }); - Module(function (Tone) { - - /** - * @class Tone.Emitter gives classes which extend it - * the ability to listen for and emit events. - * Inspiration and reference from Jerome Etienne's [MicroEvent](https://github.com/jeromeetienne/microevent.js). - * MIT (c) 2011 Jerome Etienne. - * - * @extends {Tone} - */ - Tone.Emitter = function () { - Tone.call(this); - /** - * Contains all of the events. - * @private - * @type {Object} - */ - this._events = {}; - }; - Tone.extend(Tone.Emitter); - /** - * Bind a callback to a specific event. - * @param {String} event The name of the event to listen for. - * @param {Function} callback The callback to invoke when the - * event is emitted - * @return {Tone.Emitter} this - */ - Tone.Emitter.prototype.on = function (event, callback) { - //split the event - var events = event.split(/\W+/); - for (var i = 0; i < events.length; i++) { - var eventName = events[i]; - if (!this._events.hasOwnProperty(eventName)) { - this._events[eventName] = []; - } - this._events[eventName].push(callback); - } - return this; - }; - /** - * Bind a callback which is only invoked once - * @param {String} event The name of the event to listen for. - * @param {Function} callback The callback to invoke when the - * event is emitted - * @return {Tone.Emitter} this - */ - Tone.Emitter.prototype.once = function (event, callback) { - var boundCallback = function () { - //invoke the callback - callback.apply(this, arguments); - this.off(event, boundCallback); - }.bind(this); - this.on(event, boundCallback); - return this; - }; - /** - * Remove the event listener. - * @param {String} event The event to stop listening to. - * @param {Function=} callback The callback which was bound to - * the event with Tone.Emitter.on. - * If no callback is given, all callbacks - * events are removed. - * @return {Tone.Emitter} this - */ - Tone.Emitter.prototype.off = function (event, callback) { - var events = event.split(/\W+/); - for (var ev = 0; ev < events.length; ev++) { - event = events[ev]; - if (this._events.hasOwnProperty(event)) { - if (Tone.isUndef(callback)) { - this._events[event] = []; - } else { - var eventList = this._events[event]; - for (var i = 0; i < eventList.length; i++) { - if (eventList[i] === callback) { - eventList.splice(i, 1); - } - } - } - } - } - return this; - }; - /** - * Invoke all of the callbacks bound to the event - * with any arguments passed in. - * @param {String} event The name of the event. - * @param {*} args... The arguments to pass to the functions listening. - * @return {Tone.Emitter} this - */ - Tone.Emitter.prototype.emit = function (event) { - if (this._events) { - var args = Array.apply(null, arguments).slice(1); - if (this._events.hasOwnProperty(event)) { - var eventList = this._events[event].slice(0); - for (var i = 0, len = eventList.length; i < len; i++) { - eventList[i].apply(this, args); - } - } - } - return this; - }; - /** - * Add Emitter functions (on/off/emit) to the object - * @param {Object|Function} object The object or class to extend. - * @returns {Tone.Emitter} - */ - Tone.Emitter.mixin = function (object) { - var functions = [ - 'on', - 'once', - 'off', - 'emit' - ]; - object._events = {}; - for (var i = 0; i < functions.length; i++) { - var func = functions[i]; - var emitterFunc = Tone.Emitter.prototype[func]; - object[func] = emitterFunc; - } - return Tone.Emitter; - }; - /** - * Clean up - * @return {Tone.Emitter} this - */ - Tone.Emitter.prototype.dispose = function () { - Tone.prototype.dispose.call(this); - this._events = null; - return this; - }; - return Tone.Emitter; - }); - Module(function (Tone) { - - /** - * @class A Timeline class for scheduling and maintaining state - * along a timeline. All events must have a "time" property. - * Internally, events are stored in time order for fast - * retrieval. - * @extends {Tone} - * @param {Positive} [memory=Infinity] The number of previous events that are retained. - */ - Tone.Timeline = function () { - var options = Tone.defaults(arguments, ['memory'], Tone.Timeline); - Tone.call(this); - /** - * The array of scheduled timeline events - * @type {Array} - * @private - */ - this._timeline = []; - /** - * The memory of the timeline, i.e. - * how many events in the past it will retain - * @type {Positive} - */ - this.memory = options.memory; - }; - Tone.extend(Tone.Timeline); - /** - * the default parameters - * @static - * @const - */ - Tone.Timeline.defaults = { 'memory': Infinity }; - /** - * The number of items in the timeline. - * @type {Number} - * @memberOf Tone.Timeline# - * @name length - * @readOnly - */ - Object.defineProperty(Tone.Timeline.prototype, 'length', { - get: function () { - return this._timeline.length; - } - }); - /** - * Insert an event object onto the timeline. Events must have a "time" attribute. - * @param {Object} event The event object to insert into the - * timeline. - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.add = function (event) { - //the event needs to have a time attribute - if (Tone.isUndef(event.time)) { - throw new Error('Tone.Timeline: events must have a time attribute'); - } - event.time = event.time.valueOf(); - var index = this._search(event.time); - this._timeline.splice(index + 1, 0, event); - //if the length is more than the memory, remove the previous ones - if (this.length > this.memory) { - var diff = this.length - this.memory; - this._timeline.splice(0, diff); - } - return this; - }; - /** - * Remove an event from the timeline. - * @param {Object} event The event object to remove from the list. - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.remove = function (event) { - var index = this._timeline.indexOf(event); - if (index !== -1) { - this._timeline.splice(index, 1); - } - return this; - }; - /** - * Get the nearest event whose time is less than or equal to the given time. - * @param {Number} time The time to query. - * @param {String} comparator Which value in the object to compare - * @returns {Object} The event object set after that time. - */ - Tone.Timeline.prototype.get = function (time, comparator) { - comparator = Tone.defaultArg(comparator, 'time'); - var index = this._search(time, comparator); - if (index !== -1) { - return this._timeline[index]; - } else { - return null; - } - }; - /** - * Return the first event in the timeline without removing it - * @returns {Object} The first event object - */ - Tone.Timeline.prototype.peek = function () { - return this._timeline[0]; - }; - /** - * Return the first event in the timeline and remove it - * @returns {Object} The first event object - */ - Tone.Timeline.prototype.shift = function () { - return this._timeline.shift(); - }; - /** - * Get the event which is scheduled after the given time. - * @param {Number} time The time to query. - * @param {String} comparator Which value in the object to compare - * @returns {Object} The event object after the given time - */ - Tone.Timeline.prototype.getAfter = function (time, comparator) { - comparator = Tone.defaultArg(comparator, 'time'); - var index = this._search(time, comparator); - if (index + 1 < this._timeline.length) { - return this._timeline[index + 1]; - } else { - return null; - } - }; - /** - * Get the event before the event at the given time. - * @param {Number} time The time to query. - * @param {String} comparator Which value in the object to compare - * @returns {Object} The event object before the given time - */ - Tone.Timeline.prototype.getBefore = function (time, comparator) { - comparator = Tone.defaultArg(comparator, 'time'); - var len = this._timeline.length; - //if it's after the last item, return the last item - if (len > 0 && this._timeline[len - 1][comparator] < time) { - return this._timeline[len - 1]; - } - var index = this._search(time, comparator); - if (index - 1 >= 0) { - return this._timeline[index - 1]; - } else { - return null; - } - }; - /** - * Cancel events after the given time - * @param {Number} time The time to query. - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.cancel = function (after) { - if (this._timeline.length > 1) { - var index = this._search(after); - if (index >= 0) { - if (this._timeline[index].time === after) { - //get the first item with that time - for (var i = index; i >= 0; i--) { - if (this._timeline[i].time === after) { - index = i; - } else { - break; - } - } - this._timeline = this._timeline.slice(0, index); - } else { - this._timeline = this._timeline.slice(0, index + 1); - } - } else { - this._timeline = []; - } - } else if (this._timeline.length === 1) { - //the first item's time - if (this._timeline[0].time >= after) { - this._timeline = []; - } - } - return this; - }; - /** - * Cancel events before or equal to the given time. - * @param {Number} time The time to cancel before. - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.cancelBefore = function (time) { - var index = this._search(time); - if (index >= 0) { - this._timeline = this._timeline.slice(index + 1); - } - return this; - }; - /** - * Returns the previous event if there is one. null otherwise - * @param {Object} event The event to find the previous one of - * @return {Object} The event right before the given event - */ - Tone.Timeline.prototype.previousEvent = function (event) { - var index = this._timeline.indexOf(event); - if (index > 0) { - return this._timeline[index - 1]; - } else { - return null; - } - }; - /** - * Does a binary search on the timeline array and returns the - * nearest event index whose time is after or equal to the given time. - * If a time is searched before the first index in the timeline, -1 is returned. - * If the time is after the end, the index of the last item is returned. - * @param {Number} time - * @param {String} comparator Which value in the object to compare - * @return {Number} the index in the timeline array - * @private - */ - Tone.Timeline.prototype._search = function (time, comparator) { - if (this._timeline.length === 0) { - return -1; - } - comparator = Tone.defaultArg(comparator, 'time'); - var beginning = 0; - var len = this._timeline.length; - var end = len; - if (len > 0 && this._timeline[len - 1][comparator] <= time) { - return len - 1; - } - while (beginning < end) { - // calculate the midpoint for roughly equal partition - var midPoint = Math.floor(beginning + (end - beginning) / 2); - var event = this._timeline[midPoint]; - var nextEvent = this._timeline[midPoint + 1]; - if (event[comparator] === time) { - //choose the last one that has the same time - for (var i = midPoint; i < this._timeline.length; i++) { - var testEvent = this._timeline[i]; - if (testEvent[comparator] === time) { - midPoint = i; - } - } - return midPoint; - } else if (event[comparator] < time && nextEvent[comparator] > time) { - return midPoint; - } else if (event[comparator] > time) { - //search lower - end = midPoint; - } else { - //search upper - beginning = midPoint + 1; - } - } - return -1; - }; - /** - * Internal iterator. Applies extra safety checks for - * removing items from the array. - * @param {Function} callback - * @param {Number=} lowerBound - * @param {Number=} upperBound - * @private - */ - Tone.Timeline.prototype._iterate = function (callback, lowerBound, upperBound) { - lowerBound = Tone.defaultArg(lowerBound, 0); - upperBound = Tone.defaultArg(upperBound, this._timeline.length - 1); - this._timeline.slice(lowerBound, upperBound + 1).forEach(function (event) { - callback.call(this, event); - }.bind(this)); - }; - /** - * Iterate over everything in the array - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.forEach = function (callback) { - this._iterate(callback); - return this; - }; - /** - * Iterate over everything in the array at or before the given time. - * @param {Number} time The time to check if items are before - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.forEachBefore = function (time, callback) { - //iterate over the items in reverse so that removing an item doesn't break things - var upperBound = this._search(time); - if (upperBound !== -1) { - this._iterate(callback, 0, upperBound); - } - return this; - }; - /** - * Iterate over everything in the array after the given time. - * @param {Number} time The time to check if items are before - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.forEachAfter = function (time, callback) { - //iterate over the items in reverse so that removing an item doesn't break things - var lowerBound = this._search(time); - this._iterate(callback, lowerBound + 1); - return this; - }; - /** - * Iterate over everything in the array between the startTime and endTime. - * The timerange is inclusive of the startTime, but exclusive of the endTime. - * range = [startTime, endTime). - * @param {Number} startTime The time to check if items are before - * @param {Number} endTime The end of the test interval. - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.forEachBetween = function (startTime, endTime, callback) { - var lowerBound = this._search(startTime); - var upperBound = this._search(endTime); - if (lowerBound !== -1 && upperBound !== -1) { - if (this._timeline[lowerBound].time !== startTime) { - lowerBound += 1; - } - //exclusive of the end time - if (this._timeline[upperBound].time === endTime) { - upperBound -= 1; - } - this._iterate(callback, lowerBound, upperBound); - } else if (lowerBound === -1) { - this._iterate(callback, 0, upperBound); - } - return this; - }; - /** - * Iterate over everything in the array at or after the given time. Similar to - * forEachAfter, but includes the item(s) at the given time. - * @param {Number} time The time to check if items are before - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.forEachFrom = function (time, callback) { - //iterate over the items in reverse so that removing an item doesn't break things - var lowerBound = this._search(time); - //work backwards until the event time is less than time - while (lowerBound >= 0 && this._timeline[lowerBound].time >= time) { - lowerBound--; - } - this._iterate(callback, lowerBound + 1); - return this; - }; - /** - * Iterate over everything in the array at the given time - * @param {Number} time The time to check if items are before - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.Timeline} this - */ - Tone.Timeline.prototype.forEachAtTime = function (time, callback) { - //iterate over the items in reverse so that removing an item doesn't break things - var upperBound = this._search(time); - if (upperBound !== -1) { - this._iterate(function (event) { - if (event.time === time) { - callback.call(this, event); - } - }, 0, upperBound); - } - return this; - }; - /** - * Clean up. - * @return {Tone.Timeline} this - */ - Tone.Timeline.prototype.dispose = function () { - Tone.prototype.dispose.call(this); - this._timeline = null; - return this; - }; - return Tone.Timeline; - }); - Module(function (Tone) { - if (Tone.supported) { - if (!window.hasOwnProperty('OfflineAudioContext') && window.hasOwnProperty('webkitOfflineAudioContext')) { - window.OfflineAudioContext = window.webkitOfflineAudioContext; - } - //returns promise? - var context = new OfflineAudioContext(1, 1, 44100); - var ret = context.startRendering(); - if (!(ret instanceof Promise)) { - OfflineAudioContext.prototype._native_startRendering = OfflineAudioContext.prototype.startRendering; - OfflineAudioContext.prototype.startRendering = function () { - return new Promise(function (done) { - this.oncomplete = function (e) { - done(e.renderedBuffer); - }; - this._native_startRendering(); - }.bind(this)); - }; - } - } - }); - Module(function (Tone) { - if (Tone.supported) { - if (!window.hasOwnProperty('AudioContext') && window.hasOwnProperty('webkitAudioContext')) { - window.AudioContext = window.webkitAudioContext; - } - //not functionally equivalent, but only an API placeholder - if (!AudioContext.prototype.close) { - AudioContext.prototype.close = function () { - if (Tone.isFunction(this.suspend)) { - this.suspend(); - } - return Promise.resolve(); - }; - } - //not functionally equivalent - if (!AudioContext.prototype.resume) { - AudioContext.prototype.resume = function () { - return Promise.resolve(); - }; - } - //createGain - if (!AudioContext.prototype.createGain && AudioContext.prototype.createGainNode) { - AudioContext.prototype.createGain = AudioContext.prototype.createGainNode; - } - //createDelay - if (!AudioContext.prototype.createDelay && AudioContext.prototype.createDelayNode) { - AudioContext.prototype.createDelay = AudioContext.prototype.createDelayNode; - } - //test decodeAudioData returns a promise - // https://github.com/mohayonao/web-audio-api-shim/blob/master/src/AudioContext.js - // MIT License (c) 2015 @mohayonao - var decodeAudioDataPromise = false; - var offlineContext = new OfflineAudioContext(1, 1, 44100); - var audioData = new Uint32Array([ - 1179011410, - 48, - 1163280727, - 544501094, - 16, - 131073, - 44100, - 176400, - 1048580, - 1635017060, - 8, - 0, - 0, - 0, - 0 - ]).buffer; - try { - var ret = offlineContext.decodeAudioData(audioData); - if (ret instanceof Promise) { - decodeAudioDataPromise = true; - } - } catch (e) { - decodeAudioDataPromise = false; - } - if (!decodeAudioDataPromise) { - AudioContext.prototype._native_decodeAudioData = AudioContext.prototype.decodeAudioData; - AudioContext.prototype.decodeAudioData = function (audioData) { - return new Promise(function (success, error) { - this._native_decodeAudioData(audioData, success, error); - }.bind(this)); - }; - } - } - }); - Module(function (Tone) { - /** - * @class Wrapper around the native AudioContext. - * @extends {Tone.Emitter} - * @param {AudioContext=} context optionally pass in a context - */ - Tone.Context = function () { - Tone.Emitter.call(this); - var options = Tone.defaults(arguments, ['context'], Tone.Context); - if (!options.context) { - options.context = new window.AudioContext(); - if (!options.context) { - throw new Error('could not create AudioContext. Possibly too many AudioContexts running already.'); - } - } - this._context = options.context; - // extend all of the methods - for (var prop in this._context) { - this._defineProperty(this._context, prop); - } - /** - * The default latency hint - * @type {String} - * @private - */ - this._latencyHint = options.latencyHint; - /** - * An object containing all of the constants AudioBufferSourceNodes - * @type {Object} - * @private - */ - this._constants = {}; - /////////////////////////////////////////////////////////////////////// - // WORKER - /////////////////////////////////////////////////////////////////////// - /** - * The amount of time events are scheduled - * into the future - * @type {Number} - */ - this.lookAhead = options.lookAhead; - /** - * A reference to the actual computed update interval - * @type {Number} - * @private - */ - this._computedUpdateInterval = 0; - /** - * A reliable callback method - * @private - * @type {Ticker} - */ - this._ticker = new Ticker(this.emit.bind(this, 'tick'), options.clockSource, options.updateInterval); - /////////////////////////////////////////////////////////////////////// - // TIMEOUTS - /////////////////////////////////////////////////////////////////////// - /** - * All of the setTimeout events. - * @type {Tone.Timeline} - * @private - */ - this._timeouts = new Tone.Timeline(); - /** - * The timeout id counter - * @private - * @type {Number} - */ - this._timeoutIds = 0; - this.on('tick', this._timeoutLoop.bind(this)); - }; - Tone.extend(Tone.Context, Tone.Emitter); - Tone.Emitter.mixin(Tone.Context); - /** - * defaults - * @static - * @type {Object} - */ - Tone.Context.defaults = { - 'clockSource': 'worker', - 'latencyHint': 'interactive', - 'lookAhead': 0.1, - 'updateInterval': 0.03 - }; - /** - * Define a property on this Tone.Context. - * This is used to extend the native AudioContext - * @param {AudioContext} context - * @param {String} prop - * @private - */ - Tone.Context.prototype._defineProperty = function (context, prop) { - if (Tone.isUndef(this[prop])) { - Object.defineProperty(this, prop, { - get: function () { - if (typeof context[prop] === 'function') { - return context[prop].bind(context); - } else { - return context[prop]; - } - }, - set: function (val) { - context[prop] = val; - } - }); - } - }; - /** - * The current audio context time - * @return {Number} - */ - Tone.Context.prototype.now = function () { - return this._context.currentTime + this.lookAhead; - }; - /** - * Promise which is invoked when the context is running. - * Tries to resume the context if it's not started. - * @return {Promise} - */ - Tone.Context.prototype.ready = function () { - return new Promise(function (done) { - if (this._context.state === 'running') { - done(); - } else { - this._context.resume().then(function () { - done(); - }); - } - }.bind(this)); - }; - /** - * Promise which is invoked when the context is running. - * Tries to resume the context if it's not started. - * @return {Promise} - */ - Tone.Context.prototype.close = function () { - return this._context.close().then(function () { - Tone.Context.emit('close', this); - }.bind(this)); - }; - /** - * Generate a looped buffer at some constant value. - * @param {Number} val - * @return {BufferSourceNode} - */ - Tone.Context.prototype.getConstant = function (val) { - if (this._constants[val]) { - return this._constants[val]; - } else { - var buffer = this._context.createBuffer(1, 128, this._context.sampleRate); - var arr = buffer.getChannelData(0); - for (var i = 0; i < arr.length; i++) { - arr[i] = val; - } - var constant = this._context.createBufferSource(); - constant.channelCount = 1; - constant.channelCountMode = 'explicit'; - constant.buffer = buffer; - constant.loop = true; - constant.start(0); - this._constants[val] = constant; - return constant; - } - }; - /** - * The private loop which keeps track of the context scheduled timeouts - * Is invoked from the clock source - * @private - */ - Tone.Context.prototype._timeoutLoop = function () { - var now = this.now(); - while (this._timeouts && this._timeouts.length && this._timeouts.peek().time <= now) { - this._timeouts.shift().callback(); - } - }; - /** - * A setTimeout which is gaurenteed by the clock source. - * Also runs in the offline context. - * @param {Function} fn The callback to invoke - * @param {Seconds} timeout The timeout in seconds - * @returns {Number} ID to use when invoking Tone.Context.clearTimeout - */ - Tone.Context.prototype.setTimeout = function (fn, timeout) { - this._timeoutIds++; - var now = this.now(); - this._timeouts.add({ - callback: fn, - time: now + timeout, - id: this._timeoutIds - }); - return this._timeoutIds; - }; - /** - * Clears a previously scheduled timeout with Tone.context.setTimeout - * @param {Number} id The ID returned from setTimeout - * @return {Tone.Context} this - */ - Tone.Context.prototype.clearTimeout = function (id) { - this._timeouts.forEach(function (event) { - if (event.id === id) { - this.remove(event); - } - }); - return this; - }; - /** - * How often the Web Worker callback is invoked. - * This number corresponds to how responsive the scheduling - * can be. Context.updateInterval + Context.lookAhead gives you the - * total latency between scheduling an event and hearing it. - * @type {Number} - * @memberOf Tone.Context# - * @name updateInterval - */ - Object.defineProperty(Tone.Context.prototype, 'updateInterval', { - get: function () { - return this._ticker.updateInterval; - }, - set: function (interval) { - this._ticker.updateInterval = interval; - } - }); - /** - * What the source of the clock is, either "worker" (Web Worker [default]), - * "timeout" (setTimeout), or "offline" (none). - * @type {String} - * @memberOf Tone.Context# - * @name clockSource - */ - Object.defineProperty(Tone.Context.prototype, 'clockSource', { - get: function () { - return this._ticker.type; - }, - set: function (type) { - this._ticker.type = type; - } - }); - /** - * The type of playback, which affects tradeoffs between audio - * output latency and responsiveness. - * - * In addition to setting the value in seconds, the latencyHint also - * accepts the strings "interactive" (prioritizes low latency), - * "playback" (prioritizes sustained playback), "balanced" (balances - * latency and performance), and "fastest" (lowest latency, might glitch more often). - * @type {String|Seconds} - * @memberOf Tone.Context# - * @name latencyHint - * @example - * //set the lookAhead to 0.3 seconds - * Tone.context.latencyHint = 0.3; - */ - Object.defineProperty(Tone.Context.prototype, 'latencyHint', { - get: function () { - return this._latencyHint; - }, - set: function (hint) { - var lookAhead = hint; - this._latencyHint = hint; - if (Tone.isString(hint)) { - switch (hint) { - case 'interactive': - lookAhead = 0.1; - this._context.latencyHint = hint; - break; - case 'playback': - lookAhead = 0.8; - this._context.latencyHint = hint; - break; - case 'balanced': - lookAhead = 0.25; - this._context.latencyHint = hint; - break; - case 'fastest': - this._context.latencyHint = 'interactive'; - lookAhead = 0.01; - break; - } - } - this.lookAhead = lookAhead; - this.updateInterval = lookAhead / 3; - } - }); - /** - * Unlike other dispose methods, this returns a Promise - * which executes when the context is closed and disposed - * @returns {Promise} this - */ - Tone.Context.prototype.dispose = function () { - return this.close().then(function () { - Tone.Emitter.prototype.dispose.call(this); - this._ticker.dispose(); - this._ticker = null; - this._timeouts.dispose(); - this._timeouts = null; - for (var con in this._constants) { - this._constants[con].disconnect(); - } - this._constants = null; - }.bind(this)); - }; - /** - * @class A class which provides a reliable callback using either - * a Web Worker, or if that isn't supported, falls back to setTimeout. - * @private - */ - var Ticker = function (callback, type, updateInterval) { - /** - * Either "worker" or "timeout" - * @type {String} - * @private - */ - this._type = type; - /** - * The update interval of the worker - * @private - * @type {Number} - */ - this._updateInterval = updateInterval; - /** - * The callback to invoke at regular intervals - * @type {Function} - * @private - */ - this._callback = Tone.defaultArg(callback, Tone.noOp); - //create the clock source for the first time - this._createClock(); - }; - /** - * The possible ticker types - * @private - * @type {Object} - */ - Ticker.Type = { - Worker: 'worker', - Timeout: 'timeout', - Offline: 'offline' - }; - /** - * Generate a web worker - * @return {WebWorker} - * @private - */ - Ticker.prototype._createWorker = function () { - //URL Shim - window.URL = window.URL || window.webkitURL; - var blob = new Blob([//the initial timeout time - 'var timeoutTime = ' + (this._updateInterval * 1000).toFixed(1) + ';' + //onmessage callback - 'self.onmessage = function(msg){' + '\ttimeoutTime = parseInt(msg.data);' + '};' + //the tick function which posts a message - //and schedules a new tick - 'function tick(){' + '\tsetTimeout(tick, timeoutTime);' + '\tself.postMessage(\'tick\');' + '}' + //call tick initially - 'tick();']); - var blobUrl = URL.createObjectURL(blob); - var worker = new Worker(blobUrl); - worker.onmessage = this._callback.bind(this); - this._worker = worker; - }; - /** - * Create a timeout loop - * @private - */ - Ticker.prototype._createTimeout = function () { - this._timeout = setTimeout(function () { - this._createTimeout(); - this._callback(); - }.bind(this), this._updateInterval * 1000); - }; - /** - * Create the clock source. - * @private - */ - Ticker.prototype._createClock = function () { - if (this._type === Ticker.Type.Worker) { - try { - this._createWorker(); - } catch (e) { - // workers not supported, fallback to timeout - this._type = Ticker.Type.Timeout; - this._createClock(); - } - } else if (this._type === Ticker.Type.Timeout) { - this._createTimeout(); - } - }; - /** - * @memberOf Ticker# - * @type {Number} - * @name updateInterval - * @private - */ - Object.defineProperty(Ticker.prototype, 'updateInterval', { - get: function () { - return this._updateInterval; - }, - set: function (interval) { - this._updateInterval = Math.max(interval, 128 / 44100); - if (this._type === Ticker.Type.Worker) { - this._worker.postMessage(Math.max(interval * 1000, 1)); - } - } - }); - /** - * The type of the ticker, either a worker or a timeout - * @memberOf Ticker# - * @type {Number} - * @name type - * @private - */ - Object.defineProperty(Ticker.prototype, 'type', { - get: function () { - return this._type; - }, - set: function (type) { - this._disposeClock(); - this._type = type; - this._createClock(); - } - }); - /** - * Clean up the current clock source - * @private - */ - Ticker.prototype._disposeClock = function () { - if (this._timeout) { - clearTimeout(this._timeout); - this._timeout = null; - } - if (this._worker) { - this._worker.terminate(); - this._worker.onmessage = null; - this._worker = null; - } - }; - /** - * Clean up - * @private - */ - Ticker.prototype.dispose = function () { - this._disposeClock(); - this._callback = null; - }; - /** - * Shim all connect/disconnect and some deprecated methods which are still in - * some older implementations. - * @private - */ - Tone.getContext(function () { - var nativeConnect = AudioNode.prototype.connect; - var nativeDisconnect = AudioNode.prototype.disconnect; - //replace the old connect method - function toneConnect(B, outNum, inNum) { - if (B.input) { - inNum = Tone.defaultArg(inNum, 0); - if (Tone.isArray(B.input)) { - return this.connect(B.input[inNum]); - } else { - return this.connect(B.input, outNum, inNum); - } - } else { - try { - if (B instanceof AudioNode) { - nativeConnect.call(this, B, outNum, inNum); - return B; - } else { - nativeConnect.call(this, B, outNum); - return B; - } - } catch (e) { - throw new Error('error connecting to node: ' + B + '\n' + e); - } - } - } - //replace the old disconnect method - function toneDisconnect(B, outNum, inNum) { - if (B && B.input && Tone.isArray(B.input)) { - inNum = Tone.defaultArg(inNum, 0); - this.disconnect(B.input[inNum], outNum, 0); - } else if (B && B.input) { - this.disconnect(B.input, outNum, inNum); - } else { - try { - nativeDisconnect.apply(this, arguments); - } catch (e) { - throw new Error('error disconnecting node: ' + B + '\n' + e); - } - } - } - if (AudioNode.prototype.connect !== toneConnect) { - AudioNode.prototype.connect = toneConnect; - AudioNode.prototype.disconnect = toneDisconnect; - } - }); - // set the audio context initially, and if one is not already created - if (Tone.supported && !Tone.initialized) { - Tone.context = new Tone.Context(); - // log on first initialization - // allow optional silencing of this log - if (!window.TONE_SILENCE_VERSION_LOGGING) { - // eslint-disable-next-line no-console - console.log('%c * Tone.js ' + Tone.version + ' * ', 'background: #000; color: #fff'); - } - } else if (!Tone.supported) { - // eslint-disable-next-line no-console - console.warn('This browser does not support Tone.js'); - } - return Tone.Context; - }); - Module(function (Tone) { - /** - * @class Tone.AudioNode is the base class for classes which process audio. - * AudioNodes have inputs and outputs. - * @param {AudioContext=} context The audio context to use with the class - * @extends {Tone} - */ - Tone.AudioNode = function () { - Tone.call(this); - //use the default context if one is not passed in - var options = Tone.defaults(arguments, ['context'], { 'context': Tone.context }); - /** - * The AudioContext of this instance - * @private - * @type {AudioContext} - */ - this._context = options.context; - }; - Tone.extend(Tone.AudioNode); - /** - * Get the audio context belonging to this instance. - * @type {Tone.Context} - * @memberOf Tone.AudioNode# - * @name context - * @readOnly - */ - Object.defineProperty(Tone.AudioNode.prototype, 'context', { - get: function () { - return this._context; - } - }); - /** - * Create input and outputs for this object. - * @param {Number} [input=0] The number of inputs - * @param {Number} [outputs=0] The number of outputs - * @return {Tone.AudioNode} this - * @private - */ - Tone.AudioNode.prototype.createInsOuts = function (inputs, outputs) { - if (inputs === 1) { - this.input = this.context.createGain(); - } else if (inputs > 1) { - this.input = new Array(inputs); - } - if (outputs === 1) { - this.output = this.context.createGain(); - } else if (outputs > 1) { - this.output = new Array(outputs); - } - }; - /** - * channelCount is the number of channels used when up-mixing and down-mixing - * connections to any inputs to the node. The default value is 2 except for - * specific nodes where its value is specially determined. - * - * @memberof Tone.AudioNode# - * @type {Number} - * @name channelCount - * @readOnly - */ - Object.defineProperty(Tone.AudioNode.prototype, 'channelCount', { - get: function () { - return this.output.channelCount; - }, - set: function (c) { - return this.output.channelCount = c; - } - }); - /** - * channelCountMode determines how channels will be counted when up-mixing and - * down-mixing connections to any inputs to the node. - * The default value is "max". This attribute has no effect for nodes with no inputs. - * @memberof Tone.AudioNode# - * @type {String} - * @name channelCountMode - * @readOnly - */ - Object.defineProperty(Tone.AudioNode.prototype, 'channelCountMode', { - get: function () { - return this.output.channelCountMode; - }, - set: function (m) { - return this.output.channelCountMode = m; - } - }); - /** - * channelInterpretation determines how individual channels will be treated - * when up-mixing and down-mixing connections to any inputs to the node. - * The default value is "speakers". - * @memberof Tone.AudioNode# - * @type {String} - * @name channelInterpretation - * @readOnly - */ - Object.defineProperty(Tone.AudioNode.prototype, 'channelInterpretation', { - get: function () { - return this.output.channelInterpretation; - }, - set: function (i) { - return this.output.channelInterpretation = i; - } - }); - /** - * The number of inputs feeding into the AudioNode. - * For source nodes, this will be 0. - * @type {Number} - * @name numberOfInputs - * @memberof Tone.AudioNode# - * @readOnly - */ - Object.defineProperty(Tone.AudioNode.prototype, 'numberOfInputs', { - get: function () { - if (this.input) { - if (Tone.isArray(this.input)) { - return this.input.length; - } else { - return 1; - } - } else { - return 0; - } - } - }); - /** - * The number of outputs coming out of the AudioNode. - * @type {Number} - * @name numberOfOutputs - * @memberof Tone.AudioNode# - * @readOnly - */ - Object.defineProperty(Tone.AudioNode.prototype, 'numberOfOutputs', { - get: function () { - if (this.output) { - if (Tone.isArray(this.output)) { - return this.output.length; - } else { - return 1; - } - } else { - return 0; - } - } - }); - /** - * Called when an audio param connects to this node - * @private - */ - Tone.AudioNode.prototype._onConnect = function () { - }; - /** - * connect the output of a ToneNode to an AudioParam, AudioNode, or ToneNode - * @param {Tone | AudioParam | AudioNode} unit - * @param {number} [outputNum=0] optionally which output to connect from - * @param {number} [inputNum=0] optionally which input to connect to - * @returns {Tone.AudioNode} this - */ - Tone.AudioNode.prototype.connect = function (unit, outputNum, inputNum) { - if (unit._onConnect) { - unit._onConnect(this); - } - if (Tone.isArray(this.output)) { - outputNum = Tone.defaultArg(outputNum, 0); - this.output[outputNum].connect(unit, 0, inputNum); - } else { - this.output.connect(unit, outputNum, inputNum); - } - return this; - }; - /** - * disconnect the output - * @param {Number|AudioNode} output Either the output index to disconnect - * if the output is an array, or the - * node to disconnect from. - * @returns {Tone.AudioNode} this - */ - Tone.AudioNode.prototype.disconnect = function (destination, outputNum, inputNum) { - if (Tone.isArray(this.output)) { - if (Tone.isNumber(destination)) { - this.output[destination].disconnect(); - } else { - outputNum = Tone.defaultArg(outputNum, 0); - this.output[outputNum].disconnect(destination, 0, inputNum); - } - } else { - this.output.disconnect.apply(this.output, arguments); - } - }; - /** - * Connect the output of this node to the rest of the nodes in series. - * @example - * //connect a node to an effect, panVol and then to the master output - * node.chain(effect, panVol, Tone.Master); - * @param {...AudioParam|Tone|AudioNode} nodes - * @returns {Tone.AudioNode} this - * @private - */ - Tone.AudioNode.prototype.chain = function () { - var currentUnit = this; - for (var i = 0; i < arguments.length; i++) { - var toUnit = arguments[i]; - currentUnit.connect(toUnit); - currentUnit = toUnit; - } - return this; - }; - /** - * connect the output of this node to the rest of the nodes in parallel. - * @param {...AudioParam|Tone|AudioNode} nodes - * @returns {Tone.AudioNode} this - * @private - */ - Tone.AudioNode.prototype.fan = function () { - for (var i = 0; i < arguments.length; i++) { - this.connect(arguments[i]); - } - return this; - }; - if (window.AudioNode) { - //give native nodes chain and fan methods - AudioNode.prototype.chain = Tone.AudioNode.prototype.chain; - AudioNode.prototype.fan = Tone.AudioNode.prototype.fan; - } - /** - * Dispose and disconnect - * @return {Tone.AudioNode} this - */ - Tone.AudioNode.prototype.dispose = function () { - if (Tone.isDefined(this.input)) { - if (this.input instanceof AudioNode) { - this.input.disconnect(); - } - this.input = null; - } - if (Tone.isDefined(this.output)) { - if (this.output instanceof AudioNode) { - this.output.disconnect(); - } - this.output = null; - } - this._context = null; - return this; - }; - return Tone.AudioNode; - }); - Module(function (Tone) { - - /** - * @class Base class for all Signals. Used Internally. - * - * @constructor - * @extends {Tone} - */ - Tone.SignalBase = function () { - Tone.AudioNode.call(this); - }; - Tone.extend(Tone.SignalBase, Tone.AudioNode); - /** - * When signals connect to other signals or AudioParams, - * they take over the output value of that signal or AudioParam. - * For all other nodes, the behavior is the same as a default <code>connect</code>. - * - * @override - * @param {AudioParam|AudioNode|Tone.Signal|Tone} node - * @param {number} [outputNumber=0] The output number to connect from. - * @param {number} [inputNumber=0] The input number to connect to. - * @returns {Tone.SignalBase} this - */ - Tone.SignalBase.prototype.connect = function (node, outputNumber, inputNumber) { - //zero it out so that the signal can have full control - if (Tone.Signal && Tone.Signal === node.constructor || Tone.Param && Tone.Param === node.constructor) { - //cancel changes - node._param.cancelScheduledValues(0); - //reset the value - node._param.value = 0; - //mark the value as overridden - node.overridden = true; - } else if (node instanceof AudioParam) { - node.cancelScheduledValues(0); - node.value = 0; - } - Tone.AudioNode.prototype.connect.call(this, node, outputNumber, inputNumber); - return this; - }; - return Tone.SignalBase; - }); - Module(function (Tone) { - if (Tone.supported) { - //fixes safari only bug which is still present in 11 - var ua = navigator.userAgent.toLowerCase(); - var isSafari = ua.includes('safari') && !ua.includes('chrome'); - if (isSafari) { - var WaveShaperNode = function (context) { - this._internalNode = this.input = this.output = context._native_createWaveShaper(); - this._curve = null; - for (var prop in this._internalNode) { - this._defineProperty(this._internalNode, prop); - } - }; - Object.defineProperty(WaveShaperNode.prototype, 'curve', { - get: function () { - return this._curve; - }, - set: function (curve) { - this._curve = curve; - var array = new Float32Array(curve.length + 1); - array.set(curve, 1); - array[0] = curve[0]; - this._internalNode.curve = array; - } - }); - WaveShaperNode.prototype._defineProperty = function (context, prop) { - if (Tone.isUndef(this[prop])) { - Object.defineProperty(this, prop, { - get: function () { - if (typeof context[prop] === 'function') { - return context[prop].bind(context); - } else { - return context[prop]; - } - }, - set: function (val) { - context[prop] = val; - } - }); - } - }; - AudioContext.prototype._native_createWaveShaper = AudioContext.prototype.createWaveShaper; - AudioContext.prototype.createWaveShaper = function () { - return new WaveShaperNode(this); - }; - } - } - }); - Module(function (Tone) { - - /** - * @class Wraps the native Web Audio API - * [WaveShaperNode](http://webaudio.github.io/web-audio-api/#the-waveshapernode-interface). - * - * @extends {Tone.SignalBase} - * @constructor - * @param {function|Array|Number} mapping The function used to define the values. - * The mapping function should take two arguments: - * the first is the value at the current position - * and the second is the array position. - * If the argument is an array, that array will be - * set as the wave shaping function. The input - * signal is an AudioRange [-1, 1] value and the output - * signal can take on any numerical values. - * - * @param {Number} [bufferLen=1024] The length of the WaveShaperNode buffer. - * @example - * var timesTwo = new Tone.WaveShaper(function(val){ - * return val * 2; - * }, 2048); - * @example - * //a waveshaper can also be constructed with an array of values - * var invert = new Tone.WaveShaper([1, -1]); - */ - Tone.WaveShaper = function (mapping, bufferLen) { - Tone.SignalBase.call(this); - /** - * the waveshaper - * @type {WaveShaperNode} - * @private - */ - this._shaper = this.input = this.output = this.context.createWaveShaper(); - /** - * the waveshapers curve - * @type {Float32Array} - * @private - */ - this._curve = null; - if (Array.isArray(mapping)) { - this.curve = mapping; - } else if (isFinite(mapping) || Tone.isUndef(mapping)) { - this._curve = new Float32Array(Tone.defaultArg(mapping, 1024)); - } else if (Tone.isFunction(mapping)) { - this._curve = new Float32Array(Tone.defaultArg(bufferLen, 1024)); - this.setMap(mapping); - } - }; - Tone.extend(Tone.WaveShaper, Tone.SignalBase); - /** - * Uses a mapping function to set the value of the curve. - * @param {function} mapping The function used to define the values. - * The mapping function take two arguments: - * the first is the value at the current position - * which goes from -1 to 1 over the number of elements - * in the curve array. The second argument is the array position. - * @returns {Tone.WaveShaper} this - * @example - * //map the input signal from [-1, 1] to [0, 10] - * shaper.setMap(function(val, index){ - * return (val + 1) * 5; - * }) - */ - Tone.WaveShaper.prototype.setMap = function (mapping) { - var array = new Array(this._curve.length); - for (var i = 0, len = this._curve.length; i < len; i++) { - var normalized = i / (len - 1) * 2 - 1; - array[i] = mapping(normalized, i); - } - this.curve = array; - return this; - }; - /** - * The array to set as the waveshaper curve. For linear curves - * array length does not make much difference, but for complex curves - * longer arrays will provide smoother interpolation. - * @memberOf Tone.WaveShaper# - * @type {Array} - * @name curve - */ - Object.defineProperty(Tone.WaveShaper.prototype, 'curve', { - get: function () { - return this._shaper.curve; - }, - set: function (mapping) { - this._curve = new Float32Array(mapping); - this._shaper.curve = this._curve; - } - }); - /** - * Specifies what type of oversampling (if any) should be used when - * applying the shaping curve. Can either be "none", "2x" or "4x". - * @memberOf Tone.WaveShaper# - * @type {string} - * @name oversample - */ - Object.defineProperty(Tone.WaveShaper.prototype, 'oversample', { - get: function () { - return this._shaper.oversample; - }, - set: function (oversampling) { - if ([ - 'none', - '2x', - '4x' - ].includes(oversampling)) { - this._shaper.oversample = oversampling; - } else { - throw new RangeError('Tone.WaveShaper: oversampling must be either \'none\', \'2x\', or \'4x\''); - } - } - }); - /** - * Clean up. - * @returns {Tone.WaveShaper} this - */ - Tone.WaveShaper.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._shaper.disconnect(); - this._shaper = null; - this._curve = null; - return this; - }; - return Tone.WaveShaper; - }); - Module(function (Tone) { - /** - * @class Tone.TimeBase is a flexible encoding of time - * which can be evaluated to and from a string. - * @extends {Tone} - * @param {Time} val The time value as a number or string - * @param {String=} units Unit values - * @example - * Tone.TimeBase(4, "n") - * Tone.TimeBase(2, "t") - * Tone.TimeBase("2t") - * Tone.TimeBase("2t") + Tone.TimeBase("4n"); - */ - Tone.TimeBase = function (val, units) { - //allows it to be constructed with or without 'new' - if (this instanceof Tone.TimeBase) { - /** - * The value - * @type {Number|String|Tone.TimeBase} - * @private - */ - this._val = val; - /** - * The units - * @type {String?} - * @private - */ - this._units = units; - //test if the value is a string representation of a number - if (Tone.isUndef(this._units) && Tone.isString(this._val) && // eslint-disable-next-line eqeqeq - parseFloat(this._val) == this._val && this._val.charAt(0) !== '+') { - this._val = parseFloat(this._val); - this._units = this._defaultUnits; - } else if (val && val.constructor === this.constructor) { - //if they're the same type, just copy values over - this._val = val._val; - this._units = val._units; - } else if (val instanceof Tone.TimeBase) { - switch (this._defaultUnits) { - case 's': - this._val = val.toSeconds(); - break; - case 'i': - this._val = val.toTicks(); - break; - case 'hz': - this._val = val.toFrequency(); - break; - case 'midi': - this._val = val.toMidi(); - break; - default: - throw new Error('Unrecognized default units ' + this._defaultUnits); - } - } - } else { - return new Tone.TimeBase(val, units); - } - }; - Tone.extend(Tone.TimeBase); - /////////////////////////////////////////////////////////////////////////// - // ABSTRACT SYNTAX TREE PARSER - /////////////////////////////////////////////////////////////////////////// - /** - * All the primary expressions. - * @private - * @type {Object} - */ - Tone.TimeBase.prototype._expressions = { - 'n': { - regexp: /^(\d+)n(\.?)$/i, - method: function (value, dot) { - value = parseInt(value); - var scalar = dot === '.' ? 1.5 : 1; - if (value === 1) { - return this._beatsToUnits(this._getTimeSignature()) * scalar; - } else { - return this._beatsToUnits(4 / value) * scalar; - } - } - }, - 't': { - regexp: /^(\d+)t$/i, - method: function (value) { - value = parseInt(value); - return this._beatsToUnits(8 / (parseInt(value) * 3)); - } - }, - 'm': { - regexp: /^(\d+)m$/i, - method: function (value) { - return this._beatsToUnits(parseInt(value) * this._getTimeSignature()); - } - }, - 'i': { - regexp: /^(\d+)i$/i, - method: function (value) { - return this._ticksToUnits(parseInt(value)); - } - }, - 'hz': { - regexp: /^(\d+(?:\.\d+)?)hz$/i, - method: function (value) { - return this._frequencyToUnits(parseFloat(value)); - } - }, - 'tr': { - regexp: /^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?):?(\d+(?:\.\d+)?)?$/, - method: function (m, q, s) { - var total = 0; - if (m && m !== '0') { - total += this._beatsToUnits(this._getTimeSignature() * parseFloat(m)); - } - if (q && q !== '0') { - total += this._beatsToUnits(parseFloat(q)); - } - if (s && s !== '0') { - total += this._beatsToUnits(parseFloat(s) / 4); - } - return total; - } - }, - 's': { - regexp: /^(\d+(?:\.\d+)?)s$/, - method: function (value) { - return this._secondsToUnits(parseFloat(value)); - } - }, - 'samples': { - regexp: /^(\d+)samples$/, - method: function (value) { - return parseInt(value) / this.context.sampleRate; - } - }, - 'default': { - regexp: /^(\d+(?:\.\d+)?)$/, - method: function (value) { - return this._expressions[this._defaultUnits].method.call(this, value); - } - } - }; - /** - * The default units if none are given. - * @type {String} - * @private - */ - Tone.TimeBase.prototype._defaultUnits = 's'; - /////////////////////////////////////////////////////////////////////////// - // TRANSPORT FALLBACKS - /////////////////////////////////////////////////////////////////////////// - /** - * Return the bpm, or 120 if Transport is not available - * @type {Number} - * @private - */ - Tone.TimeBase.prototype._getBpm = function () { - if (Tone.Transport) { - return Tone.Transport.bpm.value; - } else { - return 120; - } - }; - /** - * Return the timeSignature or 4 if Transport is not available - * @type {Number} - * @private - */ - Tone.TimeBase.prototype._getTimeSignature = function () { - if (Tone.Transport) { - return Tone.Transport.timeSignature; - } else { - return 4; - } - }; - /** - * Return the PPQ or 192 if Transport is not available - * @type {Number} - * @private - */ - Tone.TimeBase.prototype._getPPQ = function () { - if (Tone.Transport) { - return Tone.Transport.PPQ; - } else { - return 192; - } - }; - /** - * Return the current time in whichever context is relevant - * @type {Number} - * @private - */ - Tone.TimeBase.prototype._now = function () { - return this.now(); - }; - /////////////////////////////////////////////////////////////////////////// - // UNIT CONVERSIONS - /////////////////////////////////////////////////////////////////////////// - /** - * Returns the value of a frequency in the current units - * @param {Frequency} freq - * @return {Number} - * @private - */ - Tone.TimeBase.prototype._frequencyToUnits = function (freq) { - return 1 / freq; - }; - /** - * Return the value of the beats in the current units - * @param {Number} beats - * @return {Number} - * @private - */ - Tone.TimeBase.prototype._beatsToUnits = function (beats) { - return 60 / this._getBpm() * beats; - }; - /** - * Returns the value of a second in the current units - * @param {Seconds} seconds - * @return {Number} - * @private - */ - Tone.TimeBase.prototype._secondsToUnits = function (seconds) { - return seconds; - }; - /** - * Returns the value of a tick in the current time units - * @param {Ticks} ticks - * @return {Number} - * @private - */ - Tone.TimeBase.prototype._ticksToUnits = function (ticks) { - return ticks * (this._beatsToUnits(1) / this._getPPQ()); - }; - /** - * With no arguments, return 'now' - * @return {Number} - * @private - */ - Tone.TimeBase.prototype._noArg = function () { - return this._now(); - }; - /////////////////////////////////////////////////////////////////////////// - // EXPRESSIONS - /////////////////////////////////////////////////////////////////////////// - /** - * Evaluate the time value. Returns the time - * in seconds. - * @return {Seconds} - */ - Tone.TimeBase.prototype.valueOf = function () { - if (Tone.isUndef(this._val)) { - return this._noArg(); - } else if (Tone.isString(this._val) && Tone.isUndef(this._units)) { - for (var units in this._expressions) { - if (this._expressions[units].regexp.test(this._val.trim())) { - this._units = units; - break; - } - } - } - if (Tone.isDefined(this._units)) { - var expr = this._expressions[this._units]; - var matching = this._val.toString().trim().match(expr.regexp); - if (matching) { - return expr.method.apply(this, matching.slice(1)); - } else { - return expr.method.call(this, parseFloat(this._val)); - } - } else { - return this._val; - } - }; - /** - * Return the value in seconds - * @return {Seconds} - */ - Tone.TimeBase.prototype.toSeconds = function () { - return this.valueOf(); - }; - /** - * Return the value in hertz - * @return {Frequency} - */ - Tone.TimeBase.prototype.toFrequency = function () { - return 1 / this.toSeconds(); - }; - /** - * Return the time in samples - * @return {Samples} - */ - Tone.TimeBase.prototype.toSamples = function () { - return this.toSeconds() * this.context.sampleRate; - }; - /** - * Return the time in milliseconds. - * @return {Milliseconds} - */ - Tone.TimeBase.prototype.toMilliseconds = function () { - return this.toSeconds() * 1000; - }; - /** - * Clean up - * @return {Tone.TimeBase} this - */ - Tone.TimeBase.prototype.dispose = function () { - this._val = null; - this._units = null; - }; - return Tone.TimeBase; - }); - Module(function (Tone) { - /** - * @class Tone.Frequency is a primitive type for encoding Frequency values. - * Eventually all time values are evaluated to hertz - * using the `eval` method. - * @constructor - * @extends {Tone.TimeBase} - * @param {String|Number} val The time value. - * @param {String=} units The units of the value. - * @example - * Tone.Frequency("C3") // 261 - * Tone.Frequency(38, "midi") // - * Tone.Frequency("C3").transpose(4); - */ - Tone.Frequency = function (val, units) { - if (this instanceof Tone.Frequency) { - Tone.TimeBase.call(this, val, units); - } else { - return new Tone.Frequency(val, units); - } - }; - Tone.extend(Tone.Frequency, Tone.TimeBase); - /////////////////////////////////////////////////////////////////////////// - // AUGMENT BASE EXPRESSIONS - /////////////////////////////////////////////////////////////////////////// - Tone.Frequency.prototype._expressions = Object.assign({}, Tone.TimeBase.prototype._expressions, { - 'midi': { - regexp: /^(\d+(?:\.\d+)?midi)/, - method: function (value) { - if (this._defaultUnits === 'midi') { - return value; - } else { - return Tone.Frequency.mtof(value); - } - } - }, - 'note': { - regexp: /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i, - method: function (pitch, octave) { - var index = noteToScaleIndex[pitch.toLowerCase()]; - var noteNumber = index + (parseInt(octave) + 1) * 12; - if (this._defaultUnits === 'midi') { - return noteNumber; - } else { - return Tone.Frequency.mtof(noteNumber); - } - } - }, - 'tr': { - regexp: /^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?):?(\d+(?:\.\d+)?)?/, - method: function (m, q, s) { - var total = 1; - if (m && m !== '0') { - total *= this._beatsToUnits(this._getTimeSignature() * parseFloat(m)); - } - if (q && q !== '0') { - total *= this._beatsToUnits(parseFloat(q)); - } - if (s && s !== '0') { - total *= this._beatsToUnits(parseFloat(s) / 4); - } - return total; - } - } - }); - /////////////////////////////////////////////////////////////////////////// - // EXPRESSIONS - /////////////////////////////////////////////////////////////////////////// - /** - * Transposes the frequency by the given number of semitones. - * @param {Interval} interval - * @return {Tone.Frequency} A new transposed frequency - * @example - * Tone.Frequency("A4").transpose(3); //"C5" - */ - Tone.Frequency.prototype.transpose = function (interval) { - return new this.constructor(this.valueOf() * Tone.intervalToFrequencyRatio(interval)); - }; - /** - * Takes an array of semitone intervals and returns - * an array of frequencies transposed by those intervals. - * @param {Array} intervals - * @return {Array<Tone.Frequency>} Returns an array of Frequencies - * @example - * Tone.Frequency("A4").harmonize([0, 3, 7]); //["A4", "C5", "E5"] - */ - Tone.Frequency.prototype.harmonize = function (intervals) { - return intervals.map(function (interval) { - return this.transpose(interval); - }.bind(this)); - }; - /////////////////////////////////////////////////////////////////////////// - // UNIT CONVERSIONS - /////////////////////////////////////////////////////////////////////////// - /** - * Return the value of the frequency as a MIDI note - * @return {MIDI} - * @example - * Tone.Frequency("C4").toMidi(); //60 - */ - Tone.Frequency.prototype.toMidi = function () { - return Tone.Frequency.ftom(this.valueOf()); - }; - /** - * Return the value of the frequency in Scientific Pitch Notation - * @return {Note} - * @example - * Tone.Frequency(69, "midi").toNote(); //"A4" - */ - Tone.Frequency.prototype.toNote = function () { - var freq = this.toFrequency(); - var log = Math.log2(freq / Tone.Frequency.A4); - var noteNumber = Math.round(12 * log) + 57; - var octave = Math.floor(noteNumber / 12); - if (octave < 0) { - noteNumber += -12 * octave; - } - var noteName = scaleIndexToNote[noteNumber % 12]; - return noteName + octave.toString(); - }; - /** - * Return the duration of one cycle in seconds. - * @return {Seconds} - */ - Tone.Frequency.prototype.toSeconds = function () { - return 1 / Tone.TimeBase.prototype.toSeconds.call(this); - }; - /** - * Return the value in Hertz - * @return {Frequency} - */ - Tone.Frequency.prototype.toFrequency = function () { - return Tone.TimeBase.prototype.toFrequency.call(this); - }; - /** - * Return the duration of one cycle in ticks - * @return {Ticks} - */ - Tone.Frequency.prototype.toTicks = function () { - var quarterTime = this._beatsToUnits(1); - var quarters = this.valueOf() / quarterTime; - return Math.floor(quarters * Tone.Transport.PPQ); - }; - /////////////////////////////////////////////////////////////////////////// - // UNIT CONVERSIONS HELPERS - /////////////////////////////////////////////////////////////////////////// - /** - * With no arguments, return 0 - * @return {Number} - * @private - */ - Tone.Frequency.prototype._noArg = function () { - return 0; - }; - /** - * Returns the value of a frequency in the current units - * @param {Frequency} freq - * @return {Number} - * @private - */ - Tone.Frequency.prototype._frequencyToUnits = function (freq) { - return freq; - }; - /** - * Returns the value of a tick in the current time units - * @param {Ticks} ticks - * @return {Number} - * @private - */ - Tone.Frequency.prototype._ticksToUnits = function (ticks) { - return 1 / (ticks * 60 / (Tone.Transport.bpm.value * Tone.Transport.PPQ)); - }; - /** - * Return the value of the beats in the current units - * @param {Number} beats - * @return {Number} - * @private - */ - Tone.Frequency.prototype._beatsToUnits = function (beats) { - return 1 / Tone.TimeBase.prototype._beatsToUnits.call(this, beats); - }; - /** - * Returns the value of a second in the current units - * @param {Seconds} seconds - * @return {Number} - * @private - */ - Tone.Frequency.prototype._secondsToUnits = function (seconds) { - return 1 / seconds; - }; - /** - * The default units if none are given. - * @private - */ - Tone.Frequency.prototype._defaultUnits = 'hz'; - /////////////////////////////////////////////////////////////////////////// - // FREQUENCY CONVERSIONS - /////////////////////////////////////////////////////////////////////////// - /** - * Note to scale index - * @type {Object} - */ - var noteToScaleIndex = { - 'cbb': -2, - 'cb': -1, - 'c': 0, - 'c#': 1, - 'cx': 2, - 'dbb': 0, - 'db': 1, - 'd': 2, - 'd#': 3, - 'dx': 4, - 'ebb': 2, - 'eb': 3, - 'e': 4, - 'e#': 5, - 'ex': 6, - 'fbb': 3, - 'fb': 4, - 'f': 5, - 'f#': 6, - 'fx': 7, - 'gbb': 5, - 'gb': 6, - 'g': 7, - 'g#': 8, - 'gx': 9, - 'abb': 7, - 'ab': 8, - 'a': 9, - 'a#': 10, - 'ax': 11, - 'bbb': 9, - 'bb': 10, - 'b': 11, - 'b#': 12, - 'bx': 13 - }; - /** - * scale index to note (sharps) - * @type {Array} - */ - var scaleIndexToNote = [ - 'C', - 'C#', - 'D', - 'D#', - 'E', - 'F', - 'F#', - 'G', - 'G#', - 'A', - 'A#', - 'B' - ]; - /** - * The [concert pitch](https://en.wikipedia.org/wiki/Concert_pitch) - * A4's values in Hertz. - * @type {Frequency} - * @static - */ - Tone.Frequency.A4 = 440; - /** - * Convert a MIDI note to frequency value. - * @param {MIDI} midi The midi number to convert. - * @return {Frequency} the corresponding frequency value - * @static - * @example - * Tone.Frequency.mtof(69); // returns 440 - */ - Tone.Frequency.mtof = function (midi) { - return Tone.Frequency.A4 * Math.pow(2, (midi - 69) / 12); - }; - /** - * Convert a frequency value to a MIDI note. - * @param {Frequency} frequency The value to frequency value to convert. - * @returns {MIDI} - * @static - * @example - * Tone.Frequency.ftom(440); // returns 69 - */ - Tone.Frequency.ftom = function (frequency) { - return 69 + Math.round(12 * Math.log2(frequency / Tone.Frequency.A4)); - }; - return Tone.Frequency; - }); - Module(function (Tone) { - /** - * @class Tone.Time is a primitive type for encoding Time values. - * Tone.Time can be constructed with or without the `new` keyword. Tone.Time can be passed - * into the parameter of any method which takes time as an argument. - * @constructor - * @extends {Tone.TimeBase} - * @param {String|Number} val The time value. - * @param {String=} units The units of the value. - * @example - * var t = Tone.Time("4n");//a quarter note - */ - Tone.Time = function (val, units) { - if (this instanceof Tone.Time) { - Tone.TimeBase.call(this, val, units); - } else { - return new Tone.Time(val, units); - } - }; - Tone.extend(Tone.Time, Tone.TimeBase); - /** - * Extend the base expressions - */ - Tone.Time.prototype._expressions = Object.assign({}, Tone.TimeBase.prototype._expressions, { - 'quantize': { - regexp: /^@(.+)/, - method: function (capture) { - if (Tone.Transport) { - var quantTo = new this.constructor(capture); - return Tone.Transport.nextSubdivision(quantTo); - } else { - return 0; - } - } - }, - 'now': { - regexp: /^\+(.+)/, - method: function (capture) { - return this._now() + new this.constructor(capture); - } - } - }); - /** - * Quantize the time by the given subdivision. Optionally add a - * percentage which will move the time value towards the ideal - * quantized value by that percentage. - * @param {Number|Time} val The subdivision to quantize to - * @param {NormalRange} [percent=1] Move the time value - * towards the quantized value by - * a percentage. - * @return {Number} this - * @example - * Tone.Time(21).quantize(2) //returns 22 - * Tone.Time(0.6).quantize("4n", 0.5) //returns 0.55 - */ - Tone.Time.prototype.quantize = function (subdiv, percent) { - percent = Tone.defaultArg(percent, 1); - var subdivision = new this.constructor(subdiv); - var value = this.valueOf(); - var multiple = Math.round(value / subdivision); - var ideal = multiple * subdivision; - var diff = ideal - value; - return value + diff * percent; - }; - /////////////////////////////////////////////////////////////////////////// - // CONVERSIONS - /////////////////////////////////////////////////////////////////////////// - /** - * Convert a Time to Notation. The notation values are will be the - * closest representation between 1m to 128th note. - * @return {Notation} - * @example - * //if the Transport is at 120bpm: - * Tone.Time(2).toNotation();//returns "1m" - */ - Tone.Time.prototype.toNotation = function () { - var time = this.toSeconds(); - var testNotations = ['1m']; - for (var power = 1; power < 8; power++) { - var subdiv = Math.pow(2, power); - testNotations.push(subdiv + 'n.'); - testNotations.push(subdiv + 'n'); - testNotations.push(subdiv + 't'); - } - testNotations.push('0'); - //find the closets notation representation - var closest = testNotations[0]; - var closestSeconds = Tone.Time(testNotations[0]).toSeconds(); - testNotations.forEach(function (notation) { - var notationSeconds = Tone.Time(notation).toSeconds(); - if (Math.abs(notationSeconds - time) < Math.abs(closestSeconds - time)) { - closest = notation; - closestSeconds = notationSeconds; - } - }); - return closest; - }; - /** - * Return the time encoded as Bars:Beats:Sixteenths. - * @return {BarsBeatsSixteenths} - */ - Tone.Time.prototype.toBarsBeatsSixteenths = function () { - var quarterTime = this._beatsToUnits(1); - var quarters = this.valueOf() / quarterTime; - var measures = Math.floor(quarters / this._getTimeSignature()); - var sixteenths = quarters % 1 * 4; - quarters = Math.floor(quarters) % this._getTimeSignature(); - sixteenths = sixteenths.toString(); - if (sixteenths.length > 3) { - // the additional parseFloat removes insignificant trailing zeroes - sixteenths = parseFloat(parseFloat(sixteenths).toFixed(3)); - } - var progress = [ - measures, - quarters, - sixteenths - ]; - return progress.join(':'); - }; - /** - * Return the time in ticks. - * @return {Ticks} - */ - Tone.Time.prototype.toTicks = function () { - var quarterTime = this._beatsToUnits(1); - var quarters = this.valueOf() / quarterTime; - return Math.round(quarters * this._getPPQ()); - }; - /** - * Return the time in seconds. - * @return {Seconds} - */ - Tone.Time.prototype.toSeconds = function () { - return this.valueOf(); - }; - /** - * Return the value as a midi note. - * @return {Midi} - */ - Tone.Time.prototype.toMidi = function () { - return Tone.Frequency.ftom(this.toFrequency()); - }; - return Tone.Time; - }); - Module(function (Tone) { - /** - * @class Tone.TransportTime is a the time along the Transport's - * timeline. It is similar to Tone.Time, but instead of evaluating - * against the AudioContext's clock, it is evaluated against - * the Transport's position. See [TransportTime wiki](https://github.com/Tonejs/Tone.js/wiki/TransportTime). - * @constructor - * @param {Time} val The time value as a number or string - * @param {String=} units Unit values - * @extends {Tone.Time} - */ - Tone.TransportTime = function (val, units) { - if (this instanceof Tone.TransportTime) { - Tone.Time.call(this, val, units); - } else { - return new Tone.TransportTime(val, units); - } - }; - Tone.extend(Tone.TransportTime, Tone.Time); - /** - * Return the current time in whichever context is relevant - * @type {Number} - * @private - */ - Tone.TransportTime.prototype._now = function () { - return Tone.Transport.seconds; - }; - return Tone.TransportTime; - }); - Module(function (Tone) { - /////////////////////////////////////////////////////////////////////////// - // TYPES - /////////////////////////////////////////////////////////////////////////// - /** - * Units which a value can take on. - * @enum {String} - */ - Tone.Type = { - /** - * Default units - * @typedef {Default} - */ - Default: 'number', - /** - * Time can be described in a number of ways. Read more [Time](https://github.com/Tonejs/Tone.js/wiki/Time). - * - * * Numbers, which will be taken literally as the time (in seconds). - * * Notation, ("4n", "8t") describes time in BPM and time signature relative values. - * * TransportTime, ("4:3:2") will also provide tempo and time signature relative times - * in the form BARS:QUARTERS:SIXTEENTHS. - * * Frequency, ("8hz") is converted to the length of the cycle in seconds. - * * Now-Relative, ("+1") prefix any of the above with "+" and it will be interpreted as - * "the current time plus whatever expression follows". - * * Expressions, ("3:0 + 2 - (1m / 7)") any of the above can also be combined - * into a mathematical expression which will be evaluated to compute the desired time. - * * No Argument, for methods which accept time, no argument will be interpreted as - * "now" (i.e. the currentTime). - * - * @typedef {Time} - */ - Time: 'time', - /** - * Frequency can be described similar to time, except ultimately the - * values are converted to frequency instead of seconds. A number - * is taken literally as the value in hertz. Additionally any of the - * Time encodings can be used. Note names in the form - * of NOTE OCTAVE (i.e. C4) are also accepted and converted to their - * frequency value. - * @typedef {Frequency} - */ - Frequency: 'frequency', - /** - * TransportTime describes a position along the Transport's timeline. It is - * similar to Time in that it uses all the same encodings, but TransportTime specifically - * pertains to the Transport's timeline, which is startable, stoppable, loopable, and seekable. - * [Read more](https://github.com/Tonejs/Tone.js/wiki/TransportTime) - * @typedef {TransportTime} - */ - TransportTime: 'transportTime', - /** - * Ticks are the basic subunit of the Transport. They are - * the smallest unit of time that the Transport supports. - * @typedef {Ticks} - */ - Ticks: 'ticks', - /** - * Normal values are within the range [0, 1]. - * @typedef {NormalRange} - */ - NormalRange: 'normalRange', - /** - * AudioRange values are between [-1, 1]. - * @typedef {AudioRange} - */ - AudioRange: 'audioRange', - /** - * Decibels are a logarithmic unit of measurement which is useful for volume - * because of the logarithmic way that we perceive loudness. 0 decibels - * means no change in volume. -10db is approximately half as loud and 10db - * is twice is loud. - * @typedef {Decibels} - */ - Decibels: 'db', - /** - * Half-step note increments, i.e. 12 is an octave above the root. and 1 is a half-step up. - * @typedef {Interval} - */ - Interval: 'interval', - /** - * Beats per minute. - * @typedef {BPM} - */ - BPM: 'bpm', - /** - * The value must be greater than or equal to 0. - * @typedef {Positive} - */ - Positive: 'positive', - /** - * Gain is the ratio between input and output of a signal. - * A gain of 0 is the same as silencing the signal. A gain of - * 1, causes no change to the incoming signal. - * @typedef {Gain} - */ - Gain: 'gain', - /** - * A cent is a hundredth of a semitone. - * @typedef {Cents} - */ - Cents: 'cents', - /** - * Angle between 0 and 360. - * @typedef {Degrees} - */ - Degrees: 'degrees', - /** - * A number representing a midi note. - * @typedef {MIDI} - */ - MIDI: 'midi', - /** - * A colon-separated representation of time in the form of - * Bars:Beats:Sixteenths. - * @typedef {BarsBeatsSixteenths} - */ - BarsBeatsSixteenths: 'barsBeatsSixteenths', - /** - * Sampling is the reduction of a continuous signal to a discrete signal. - * Audio is typically sampled 44100 times per second. - * @typedef {Samples} - */ - Samples: 'samples', - /** - * Hertz are a frequency representation defined as one cycle per second. - * @typedef {Hertz} - */ - Hertz: 'hertz', - /** - * A frequency represented by a letter name, - * accidental and octave. This system is known as - * [Scientific Pitch Notation](https://en.wikipedia.org/wiki/Scientific_pitch_notation). - * @typedef {Note} - */ - Note: 'note', - /** - * One millisecond is a thousandth of a second. - * @typedef {Milliseconds} - */ - Milliseconds: 'milliseconds', - /** - * Seconds are the time unit of the AudioContext. In the end, - * all values need to be evaluated to seconds. - * @typedef {Seconds} - */ - Seconds: 'seconds', - /** - * A string representing a duration relative to a measure. - * * "4n" = quarter note - * * "2m" = two measures - * * "8t" = eighth-note triplet - * @typedef {Notation} - */ - Notation: 'notation' - }; - /////////////////////////////////////////////////////////////////////////// - // AUGMENT TONE's PROTOTYPE - /////////////////////////////////////////////////////////////////////////// - /** - * Convert Time into seconds. - * - * Unlike the method which it overrides, this takes into account - * transporttime and musical notation. - * - * Time : 1.40 - * Notation: 4n or 1m or 2t - * Now Relative: +3n - * Math: 3n+16n or even complicated expressions ((3n*2)/6 + 1) - * - * @param {Time} time - * @return {Seconds} - */ - Tone.prototype.toSeconds = function (time) { - if (Tone.isNumber(time)) { - return time; - } else if (Tone.isUndef(time)) { - return this.now(); - } else if (Tone.isString(time)) { - return new Tone.Time(time).toSeconds(); - } else if (time instanceof Tone.TimeBase) { - return time.toSeconds(); - } - }; - /** - * Convert a frequency representation into a number. - * @param {Frequency} freq - * @return {Hertz} the frequency in hertz - */ - Tone.prototype.toFrequency = function (freq) { - if (Tone.isNumber(freq)) { - return freq; - } else if (Tone.isString(freq) || Tone.isUndef(freq)) { - return new Tone.Frequency(freq).valueOf(); - } else if (freq instanceof Tone.TimeBase) { - return freq.toFrequency(); - } - }; - /** - * Convert a time representation into ticks. - * @param {Time} time - * @return {Ticks} the time in ticks - */ - Tone.prototype.toTicks = function (time) { - if (Tone.isNumber(time) || Tone.isString(time)) { - return new Tone.TransportTime(time).toTicks(); - } else if (Tone.isUndef(time)) { - return Tone.Transport.ticks; - } else if (time instanceof Tone.TimeBase) { - return time.toTicks(); - } - }; - return Tone; - }); - Module(function (Tone) { - - /** - * @class Tone.Param wraps the native Web Audio's AudioParam to provide - * additional unit conversion functionality. It also - * serves as a base-class for classes which have a single, - * automatable parameter. - * @extends {Tone.AudioNode} - * @param {AudioParam} param The parameter to wrap. - * @param {Tone.Type} units The units of the audio param. - * @param {Boolean} convert If the param should be converted. - */ - Tone.Param = function () { - var options = Tone.defaults(arguments, [ - 'param', - 'units', - 'convert' - ], Tone.Param); - Tone.AudioNode.call(this); - /** - * The native parameter to control - * @type {AudioParam} - * @private - */ - this._param = this.input = options.param; - /** - * The units of the parameter - * @type {Tone.Type} - */ - this.units = options.units; - /** - * If the value should be converted or not - * @type {Boolean} - */ - this.convert = options.convert; - /** - * True if the signal value is being overridden by - * a connected signal. - * @readOnly - * @type {boolean} - * @private - */ - this.overridden = false; - /** - * The timeline which tracks all of the automations. - * @type {Tone.Timeline} - * @private - */ - this._events = new Tone.Timeline(1000); - if (Tone.isDefined(options.value) && this._param) { - this.value = options.value; - } - }; - Tone.extend(Tone.Param, Tone.AudioNode); - /** - * Defaults - * @type {Object} - * @const - */ - Tone.Param.defaults = { - 'units': Tone.Type.Default, - 'convert': true, - 'param': undefined - }; - /** - * The current value of the parameter. - * @memberOf Tone.Param# - * @type {Number} - * @name value - */ - Object.defineProperty(Tone.Param.prototype, 'value', { - get: function () { - var now = this.now(); - return this._toUnits(this.getValueAtTime(now)); - }, - set: function (value) { - this._initialValue = this._fromUnits(value); - this.cancelScheduledValues(this.context.currentTime); - this.setValueAtTime(value, this.context.currentTime); - } - }); - /** - * The minimum output value of the parameter - * @memberOf Tone.Param# - * @type {Number} - * @name value - */ - Object.defineProperty(Tone.Param.prototype, 'minValue', { - get: function () { - if (this.units === Tone.Type.Time || this.units === Tone.Type.Frequency || this.units === Tone.Type.NormalRange || this.units === Tone.Type.Positive || this.units === Tone.Type.BPM) { - return 0; - } else if (this.units === Tone.Type.AudioRange) { - return -1; - } else if (this.units === Tone.Type.Decibels) { - return -Infinity; - } else { - return this._param.minValue; - } - } - }); - /** - * The maximum output value of the parameter - * @memberOf Tone.Param# - * @type {Number} - * @name value - */ - Object.defineProperty(Tone.Param.prototype, 'maxValue', { - get: function () { - if (this.units === Tone.Type.NormalRange || this.units === Tone.Type.AudioRange) { - return 1; - } else { - return this._param.maxValue; - } - } - }); - /** - * Convert the given value from the type specified by Tone.Param.units - * into the destination value (such as Gain or Frequency). - * @private - * @param {*} val the value to convert - * @return {number} the number which the value should be set to - */ - Tone.Param.prototype._fromUnits = function (val) { - if ((this.convert || Tone.isUndef(this.convert)) && !this.overridden) { - switch (this.units) { - case Tone.Type.Time: - return this.toSeconds(val); - case Tone.Type.Frequency: - return this.toFrequency(val); - case Tone.Type.Decibels: - return Tone.dbToGain(val); - case Tone.Type.NormalRange: - return Math.min(Math.max(val, 0), 1); - case Tone.Type.AudioRange: - return Math.min(Math.max(val, -1), 1); - case Tone.Type.Positive: - return Math.max(val, 0); - default: - return val; - } - } else { - return val; - } - }; - /** - * Convert the parameters value into the units specified by Tone.Param.units. - * @private - * @param {number} val the value to convert - * @return {number} - */ - Tone.Param.prototype._toUnits = function (val) { - if (this.convert || Tone.isUndef(this.convert)) { - switch (this.units) { - case Tone.Type.Decibels: - return Tone.gainToDb(val); - default: - return val; - } - } else { - return val; - } - }; - /** - * the minimum output value - * @type {Number} - * @private - */ - Tone.Param.prototype._minOutput = 0.00001; - /** - * The event types - * @enum {String} - * @private - */ - Tone.Param.AutomationType = { - Linear: 'linearRampToValueAtTime', - Exponential: 'exponentialRampToValueAtTime', - Target: 'setTargetAtTime', - SetValue: 'setValueAtTime' - }; - /** - * Schedules a parameter value change at the given time. - * @param {*} value The value to set the signal. - * @param {Time} time The time when the change should occur. - * @returns {Tone.Param} this - * @example - * //set the frequency to "G4" in exactly 1 second from now. - * freq.setValueAtTime("G4", "+1"); - */ - Tone.Param.prototype.setValueAtTime = function (value, time) { - time = this.toSeconds(time); - value = this._fromUnits(value); - this._events.add({ - 'type': Tone.Param.AutomationType.SetValue, - 'value': value, - 'time': time - }); - this._param.setValueAtTime(value, time); - return this; - }; - /** - * Get the signals value at the given time. Subsequent scheduling - * may invalidate the returned value. - * @param {Time} time When to get the value - * @returns {Number} The value at the given time - */ - Tone.Param.prototype.getValueAtTime = function (time) { - time = this.toSeconds(time); - var after = this._events.getAfter(time); - var before = this._events.get(time); - var initialValue = Tone.defaultArg(this._initialValue, this._param.defaultValue); - var value = initialValue; - //if it was set by - if (before === null) { - value = initialValue; - } else if (before.type === Tone.Param.AutomationType.Target) { - var previous = this._events.getBefore(before.time); - var previousVal; - if (previous === null) { - previousVal = initialValue; - } else { - previousVal = previous.value; - } - value = this._exponentialApproach(before.time, previousVal, before.value, before.constant, time); - } else if (after === null) { - value = before.value; - } else if (after.type === Tone.Param.AutomationType.Linear) { - value = this._linearInterpolate(before.time, before.value, after.time, after.value, time); - } else if (after.type === Tone.Param.AutomationType.Exponential) { - value = this._exponentialInterpolate(before.time, before.value, after.time, after.value, time); - } else { - value = before.value; - } - return value; - }; - /** - * Creates a schedule point with the current value at the current time. - * This is useful for creating an automation anchor point in order to - * schedule changes from the current value. - * - * @param {number=} now (Optionally) pass the now value in. - * @returns {Tone.Param} this - */ - Tone.Param.prototype.setRampPoint = function (time) { - time = this.toSeconds(time); - var currentVal = this.getValueAtTime(time); - this.cancelAndHoldAtTime(time); - if (currentVal === 0) { - currentVal = this._minOutput; - } - this.setValueAtTime(this._toUnits(currentVal), time); - return this; - }; - /** - * Schedules a linear continuous change in parameter value from the - * previous scheduled parameter value to the given value. - * - * @param {number} value - * @param {Time} endTime - * @returns {Tone.Param} this - */ - Tone.Param.prototype.linearRampToValueAtTime = function (value, endTime) { - value = this._fromUnits(value); - endTime = this.toSeconds(endTime); - this._events.add({ - 'type': Tone.Param.AutomationType.Linear, - 'value': value, - 'time': endTime - }); - this._param.linearRampToValueAtTime(value, endTime); - return this; - }; - /** - * Schedules an exponential continuous change in parameter value from - * the previous scheduled parameter value to the given value. - * - * @param {number} value - * @param {Time} endTime - * @returns {Tone.Param} this - */ - Tone.Param.prototype.exponentialRampToValueAtTime = function (value, endTime) { - value = this._fromUnits(value); - value = Math.max(this._minOutput, value); - endTime = this.toSeconds(endTime); - //store the event - this._events.add({ - 'type': Tone.Param.AutomationType.Exponential, - 'time': endTime, - 'value': value - }); - this._param.exponentialRampToValueAtTime(value, endTime); - return this; - }; - /** - * Schedules an exponential continuous change in parameter value from - * the current time and current value to the given value over the - * duration of the rampTime. - * - * @param {number} value The value to ramp to. - * @param {Time} rampTime the time that it takes the - * value to ramp from it's current value - * @param {Time} [startTime=now] When the ramp should start. - * @returns {Tone.Param} this - * @example - * //exponentially ramp to the value 2 over 4 seconds. - * signal.exponentialRampTo(2, 4); - */ - Tone.Param.prototype.exponentialRampTo = function (value, rampTime, startTime) { - startTime = this.toSeconds(startTime); - this.setRampPoint(startTime); - this.exponentialRampToValueAtTime(value, startTime + this.toSeconds(rampTime)); - return this; - }; - /** - * Schedules an linear continuous change in parameter value from - * the current time and current value to the given value over the - * duration of the rampTime. - * - * @param {number} value The value to ramp to. - * @param {Time} rampTime the time that it takes the - * value to ramp from it's current value - * @param {Time} [startTime=now] When the ramp should start. - * @returns {Tone.Param} this - * @example - * //linearly ramp to the value 4 over 3 seconds. - * signal.linearRampTo(4, 3); - */ - Tone.Param.prototype.linearRampTo = function (value, rampTime, startTime) { - startTime = this.toSeconds(startTime); - this.setRampPoint(startTime); - this.linearRampToValueAtTime(value, startTime + this.toSeconds(rampTime)); - return this; - }; - /** - * Start exponentially approaching the target value at the given time. Since it - * is an exponential approach it will continue approaching after the ramp duration. The - * rampTime is the time that it takes to reach over 99% of the way towards the value. - * @param {number} value The value to ramp to. - * @param {Time} rampTime the time that it takes the - * value to ramp from it's current value - * @param {Time} [startTime=now] When the ramp should start. - * @returns {Tone.Param} this - * @example - * //exponentially ramp to the value 2 over 4 seconds. - * signal.exponentialRampTo(2, 4); - */ - Tone.Param.prototype.targetRampTo = function (value, rampTime, startTime) { - startTime = this.toSeconds(startTime); - this.setRampPoint(startTime); - this.exponentialApproachValueAtTime(value, startTime, rampTime); - return this; - }; - /** - * Start exponentially approaching the target value at the given time. Since it - * is an exponential approach it will continue approaching after the ramp duration. The - * rampTime is the time that it takes to reach over 99% of the way towards the value. This methods - * is similar to setTargetAtTime except the third argument is a time instead of a 'timeConstant' - * @param {number} value The value to ramp to. - * @param {Time} time When the ramp should start. - * @param {Time} rampTime the time that it takes the - * value to ramp from it's current value - * @returns {Tone.Param} this - * @example - * //exponentially ramp to the value 2 over 4 seconds. - * signal.exponentialRampTo(2, 4); - */ - Tone.Param.prototype.exponentialApproachValueAtTime = function (value, time, rampTime) { - var timeConstant = Math.log(this.toSeconds(rampTime) + 1) / Math.log(200); - time = this.toSeconds(time); - return this.setTargetAtTime(value, time, timeConstant); - }; - /** - * Start exponentially approaching the target value at the given time with - * a rate having the given time constant. - * @param {number} value - * @param {Time} startTime - * @param {number} timeConstant - * @returns {Tone.Param} this - */ - Tone.Param.prototype.setTargetAtTime = function (value, startTime, timeConstant) { - value = this._fromUnits(value); - // The value will never be able to approach without timeConstant > 0. - if (timeConstant <= 0) { - throw new Error('timeConstant must be greater than 0'); - } - startTime = this.toSeconds(startTime); - this._events.add({ - 'type': Tone.Param.AutomationType.Target, - 'value': value, - 'time': startTime, - 'constant': timeConstant - }); - this._param.setTargetAtTime(value, startTime, timeConstant); - return this; - }; - /** - * Sets an array of arbitrary parameter values starting at the given time - * for the given duration. - * - * @param {Array} values - * @param {Time} startTime - * @param {Time} duration - * @param {NormalRange} [scaling=1] If the values in the curve should be scaled by some value - * @returns {Tone.Param} this - */ - Tone.Param.prototype.setValueCurveAtTime = function (values, startTime, duration, scaling) { - scaling = Tone.defaultArg(scaling, 1); - duration = this.toSeconds(duration); - startTime = this.toSeconds(startTime); - this.setValueAtTime(values[0] * scaling, startTime); - var segTime = duration / (values.length - 1); - for (var i = 1; i < values.length; i++) { - this.linearRampToValueAtTime(values[i] * scaling, startTime + i * segTime); - } - return this; - }; - /** - * Cancels all scheduled parameter changes with times greater than or - * equal to startTime. - * - * @param {Time} time - * @returns {Tone.Param} this - */ - Tone.Param.prototype.cancelScheduledValues = function (time) { - time = this.toSeconds(time); - this._events.cancel(time); - this._param.cancelScheduledValues(time); - return this; - }; - /** - * This is similar to [cancelScheduledValues](#cancelScheduledValues) except - * it holds the automated value at time until the next automated event. - * @param {Time} time - * @returns {Tone.Param} this - */ - Tone.Param.prototype.cancelAndHoldAtTime = function (time) { - var valueAtTime = this.getValueAtTime(time); - //if there is an event at the given time - //and that even is not a "set" - var before = this._events.get(time); - var after = this._events.getAfter(time); - if (before && before.time === time) { - //remove everything after - if (after) { - this._events.cancel(after.time); - } else { - this._events.cancel(time + 0.000001); - } - } else if (after) { - //cancel the next event(s) - this._events.cancel(after.time); - if (!this._param.cancelAndHoldAtTime) { - this._param.cancelScheduledValues(time); - } - if (after.type === Tone.Param.AutomationType.Linear) { - if (!this._param.cancelAndHoldAtTime) { - this.linearRampToValueAtTime(valueAtTime, time); - } else { - this._events.add({ - 'type': Tone.Param.AutomationType.Linear, - 'value': valueAtTime, - 'time': time - }); - } - } else if (after.type === Tone.Param.AutomationType.Exponential) { - if (!this._param.cancelAndHoldAtTime) { - this.exponentialRampToValueAtTime(valueAtTime, time); - } else { - this._events.add({ - 'type': Tone.Param.AutomationType.Exponential, - 'value': valueAtTime, - 'time': time - }); - } - } - } - //set the value at the given time - this._events.add({ - 'type': Tone.Param.AutomationType.SetValue, - 'value': valueAtTime, - 'time': time - }); - if (this._param.cancelAndHoldAtTime) { - this._param.cancelAndHoldAtTime(time); - } else { - this._param.setValueAtTime(valueAtTime, time); - } - return this; - }; - /** - * Ramps to the given value over the duration of the rampTime. - * Automatically selects the best ramp type (exponential or linear) - * depending on the `units` of the signal - * - * @param {number} value - * @param {Time} rampTime The time that it takes the - * value to ramp from it's current value - * @param {Time} [startTime=now] When the ramp should start. - * @returns {Tone.Param} this - * @example - * //ramp to the value either linearly or exponentially - * //depending on the "units" value of the signal - * signal.rampTo(0, 10); - * @example - * //schedule it to ramp starting at a specific time - * signal.rampTo(0, 10, 5) - */ - Tone.Param.prototype.rampTo = function (value, rampTime, startTime) { - rampTime = Tone.defaultArg(rampTime, 0.1); - if (this.units === Tone.Type.Frequency || this.units === Tone.Type.BPM || this.units === Tone.Type.Decibels) { - this.exponentialRampTo(value, rampTime, startTime); - } else { - this.linearRampTo(value, rampTime, startTime); - } - return this; - }; - /////////////////////////////////////////////////////////////////////////// - // AUTOMATION CURVE CALCULATIONS - // MIT License, copyright (c) 2014 Jordan Santell - /////////////////////////////////////////////////////////////////////////// - // Calculates the the value along the curve produced by setTargetAtTime - Tone.Param.prototype._exponentialApproach = function (t0, v0, v1, timeConstant, t) { - return v1 + (v0 - v1) * Math.exp(-(t - t0) / timeConstant); - }; - // Calculates the the value along the curve produced by linearRampToValueAtTime - Tone.Param.prototype._linearInterpolate = function (t0, v0, t1, v1, t) { - return v0 + (v1 - v0) * ((t - t0) / (t1 - t0)); - }; - // Calculates the the value along the curve produced by exponentialRampToValueAtTime - Tone.Param.prototype._exponentialInterpolate = function (t0, v0, t1, v1, t) { - return v0 * Math.pow(v1 / v0, (t - t0) / (t1 - t0)); - }; - /** - * Clean up - * @returns {Tone.Param} this - */ - Tone.Param.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._param = null; - this._events = null; - return this; - }; - return Tone.Param; - }); - Module(function (Tone) { - /** - * @class Wrapper around the OfflineAudioContext - * @extends {Tone.Context} - * @param {Number} channels The number of channels to render - * @param {Number} duration The duration to render in samples - * @param {Number} sampleRate the sample rate to render at - */ - Tone.OfflineContext = function (channels, duration, sampleRate) { - /** - * The offline context - * @private - * @type {OfflineAudioContext} - */ - var offlineContext = new OfflineAudioContext(channels, duration * sampleRate, sampleRate); - //wrap the methods/members - Tone.Context.call(this, { - 'context': offlineContext, - 'clockSource': 'offline', - 'lookAhead': 0, - 'updateInterval': 128 / sampleRate - }); - /** - * A private reference to the duration - * @private - * @type {Number} - */ - this._duration = duration; - /** - * An artificial clock source - * @type {Number} - * @private - */ - this._currentTime = 0; - }; - Tone.extend(Tone.OfflineContext, Tone.Context); - /** - * Override the now method to point to the internal clock time - * @return {Number} - */ - Tone.OfflineContext.prototype.now = function () { - return this._currentTime; - }; - /** - * Render the output of the OfflineContext - * @return {Promise} - */ - Tone.OfflineContext.prototype.render = function () { - while (this._duration - this._currentTime >= 0) { - //invoke all the callbacks on that time - this.emit('tick'); - //increment the clock - this._currentTime += this.blockTime; - } - return this._context.startRendering(); - }; - /** - * Close the context - * @return {Promise} - */ - Tone.OfflineContext.prototype.close = function () { - this._context = null; - return Promise.resolve(); - }; - return Tone.OfflineContext; - }); - Module(function (Tone) { - if (Tone.supported) { - var ua = navigator.userAgent.toLowerCase(); - var isMobileSafari = ua.includes('safari') && !ua.includes('chrome') && ua.includes('mobile'); - if (isMobileSafari) { - //mobile safari has a bizarre bug with the offline context - //when a BufferSourceNode is started, it starts the offline context - // - //deferring all BufferSource starts till the last possible moment - //reduces the likelihood of this happening - Tone.OfflineContext.prototype.createBufferSource = function () { - var bufferSource = this._context.createBufferSource(); - var _native_start = bufferSource.start; - bufferSource.start = function (time) { - this.setTimeout(function () { - _native_start.call(bufferSource, time); - }.bind(this), 0); - }.bind(this); - return bufferSource; - }; - } - } - }); - Module(function (Tone) { - - /** - * @class A thin wrapper around the Native Web Audio GainNode. - * The GainNode is a basic building block of the Web Audio - * API and is useful for routing audio and adjusting gains. - * @extends {Tone} - * @param {Number=} gain The initial gain of the GainNode - * @param {Tone.Type=} units The units of the gain parameter. - */ - Tone.Gain = function () { - var options = Tone.defaults(arguments, [ - 'gain', - 'units' - ], Tone.Gain); - Tone.AudioNode.call(this); - /** - * The GainNode - * @type {GainNode} - * @private - */ - this.input = this.output = this._gainNode = this.context.createGain(); - /** - * The gain parameter of the gain node. - * @type {Gain} - * @signal - */ - this.gain = new Tone.Param({ - 'param': this._gainNode.gain, - 'units': options.units, - 'value': options.gain, - 'convert': options.convert - }); - this._readOnly('gain'); - }; - Tone.extend(Tone.Gain, Tone.AudioNode); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.Gain.defaults = { - 'gain': 1, - 'convert': true - }; - /** - * Clean up. - * @return {Tone.Gain} this - */ - Tone.Gain.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._gainNode.disconnect(); - this._gainNode = null; - this._writable('gain'); - this.gain.dispose(); - this.gain = null; - }; - return Tone.Gain; - }); - Module(function (Tone) { - if (Tone.supported && !AudioContext.prototype.createConstantSource) { - var ConstantSourceNode = function (context) { - this.context = context; - var buffer = context.createBuffer(1, 128, context.sampleRate); - var arr = buffer.getChannelData(0); - for (var i = 0; i < arr.length; i++) { - arr[i] = 1; - } - this._bufferSource = context.createBufferSource(); - this._bufferSource.channelCount = 1; - this._bufferSource.channelCountMode = 'explicit'; - this._bufferSource.buffer = buffer; - this._bufferSource.loop = true; - var gainNode = this._output = context.createGain(); - this.offset = gainNode.gain; - this._bufferSource.connect(gainNode); - }; - ConstantSourceNode.prototype.start = function (time) { - this._bufferSource.start(time); - return this; - }; - ConstantSourceNode.prototype.stop = function (time) { - this._bufferSource.stop(time); - return this; - }; - ConstantSourceNode.prototype.connect = function () { - this._output.connect.apply(this._output, arguments); - return this; - }; - ConstantSourceNode.prototype.disconnect = function () { - this._output.disconnect.apply(this._output, arguments); - return this; - }; - AudioContext.prototype.createConstantSource = function () { - return new ConstantSourceNode(this); - }; - Tone.Context.prototype.createConstantSource = function () { - return new ConstantSourceNode(this); - }; - } - }); - Module(function (Tone) { - - /** - * @class A signal is an audio-rate value. Tone.Signal is a core component of the library. - * Unlike a number, Signals can be scheduled with sample-level accuracy. Tone.Signal - * has all of the methods available to native Web Audio - * [AudioParam](http://webaudio.github.io/web-audio-api/#the-audioparam-interface) - * as well as additional conveniences. Read more about working with signals - * [here](https://github.com/Tonejs/Tone.js/wiki/Signals). - * - * @constructor - * @extends {Tone.Param} - * @param {Number|AudioParam} [value] Initial value of the signal. If an AudioParam - * is passed in, that parameter will be wrapped - * and controlled by the Signal. - * @param {string} [units=Number] unit The units the signal is in. - * @example - * var signal = new Tone.Signal(10); - */ - Tone.Signal = function () { - var options = Tone.defaults(arguments, [ - 'value', - 'units' - ], Tone.Signal); - Tone.Param.call(this, options); - /** - * When a signal is connected to another signal or audio param, - * this signal becomes a proxy for it - * @type {Array} - * @private - */ - this._proxies = []; - /** - * Indicates if the constant source was started or not - * @private - * @type {Boolean} - */ - this._sourceStarted = false; - /** - * The constant source node which generates the signal - * @type {ConstantSourceNode} - * @private - */ - this._constantSource = this.context.createConstantSource(); - this._param = this._constantSource.offset; - this.value = options.value; - /** - * The node where the constant signal value is scaled. - * @type {GainNode} - * @private - */ - this.output = this._constantSource; - /** - * The node where the value is set. - * @type {Tone.Param} - * @private - */ - this.input = this._param = this.output.offset; - }; - Tone.extend(Tone.Signal, Tone.Param); - /** - * The default values - * @type {Object} - * @static - * @const - */ - Tone.Signal.defaults = { - 'value': 0, - 'units': Tone.Type.Default, - 'convert': true - }; - /** - * When signals connect to other signals or AudioParams, - * they take over the output value of that signal or AudioParam. - * For all other nodes, the behavior is the same as a default <code>connect</code>. - * - * @override - * @param {AudioParam|AudioNode|Tone.Signal|Tone} node - * @param {number} [outputNumber=0] The output number to connect from. - * @param {number} [inputNumber=0] The input number to connect to. - * @returns {Tone.Signal} this - * @method - */ - Tone.Signal.prototype.connect = function (node) { - //this is an optimization where this node will forward automations - //to connected nodes without any signal if possible. - if (this._isParam(node) && !this._sourceStarted) { - this._proxies.push(node); - node.overridden = true; - this._applyAutomations(node); - } else { - Tone.SignalBase.prototype.connect.apply(this, arguments); - if (!this._sourceStarted) { - this._sourceStarted = true; - this._constantSource.start(0); - } - } - return this; - }; - /** - * Takes a node as an argument and returns if it is a Param or AudioParam - * @param {*} node The node to test - * @return {Boolean} - * @private - */ - Tone.Signal.prototype._isParam = function (node) { - return Tone.Param && Tone.Param === node.constructor || node instanceof AudioParam; - }; - /** - * Discard the optimization and connect all of the proxies - * @private - */ - Tone.Signal.prototype._connectProxies = function () { - if (!this._sourceStarted) { - this._sourceStarted = true; - this._constantSource.start(0); - } - this._proxies.forEach(function (proxy) { - Tone.SignalBase.prototype.connect.call(this, proxy); - if (proxy._proxies) { - proxy._connectProxies(); - } - }.bind(this)); - }; - /** - * Invoked when a node is connected to this - * @param {AudioNode} from - * @private - */ - Tone.Signal.prototype._onConnect = function (from) { - if (!this._isParam(from)) { - //connect all the proxies - this._connectProxies(); - } - }; - /** - * Apply all the current automations to the given parameter - * @param {AudioParam} param - * @private - */ - Tone.Signal.prototype._applyAutomations = function (param) { - var now = this.context.currentTime; - param.cancelScheduledValues(now); - var currentVal = this.getValueAtTime(now); - param.setValueAtTime(currentVal, now); - this._events.forEachFrom(now, function (event) { - param[event.type](event.value, event.time, event.constant); - }); - }; - /** - * Disconnect from the given node or all nodes if no param is given. - * @param {AudioNode|AudioParam} node - * @return {Tone.Signal} this - */ - Tone.Signal.prototype.disconnect = function (node) { - if (this._proxies.includes(node)) { - var index = this._proxies.indexOf(node); - this._proxies.splice(index, 1); - } else if (!node) { - //no argument, disconnect everything - this._proxies = []; - } - return Tone.SignalBase.prototype.disconnect.apply(this, arguments); - }; - /** - * Return the current signal value at the given time. - * @param {Time} time When to get the signal value - * @return {Number} - */ - Tone.Signal.prototype.getValueAtTime = function (time) { - if (this._param.getValueAtTime) { - return this._param.getValueAtTime(time); - } else { - return Tone.Param.prototype.getValueAtTime.call(this, time); - } - }; - //wrap all of the automation methods - [ - 'setValueAtTime', - 'linearRampToValueAtTime', - 'exponentialRampToValueAtTime', - 'setTargetAtTime' - ].forEach(function (method) { - var previousMethod = Tone.Signal.prototype[method]; - Tone.Signal.prototype[method] = function () { - var args = arguments; - previousMethod.apply(this, arguments); - args[0] = this._fromUnits(args[0]); - args[1] = this.toSeconds(args[1]); - //apply it to the proxies - this._proxies.forEach(function (signal) { - signal[method].apply(signal, args); - }); - }; - }); - [ - 'cancelScheduledValues', - 'cancelAndHoldAtTime' - ].forEach(function (method) { - var previousMethod = Tone.Signal.prototype[method]; - Tone.Signal.prototype[method] = function () { - var args = arguments; - previousMethod.apply(this, arguments); - args[0] = this.toSeconds(args[0]); - //apply it to the proxies - this._proxies.forEach(function (signal) { - signal[method].apply(signal, args); - }); - }; - }); - /** - * dispose and disconnect - * @returns {Tone.Signal} this - */ - Tone.Signal.prototype.dispose = function () { - Tone.Param.prototype.dispose.call(this); - this._constantSource.disconnect(); - this._constantSource = null; - this._proxies = null; - return this; - }; - return Tone.Signal; - }); - Module(function (Tone) { - - /** - * @class Pow applies an exponent to the incoming signal. The incoming signal - * must be AudioRange. - * - * @extends {Tone.SignalBase} - * @constructor - * @param {Positive} exp The exponent to apply to the incoming signal, must be at least 2. - * @example - * var pow = new Tone.Pow(2); - * var sig = new Tone.Signal(0.5).connect(pow); - * //output of pow is 0.25. - */ - Tone.Pow = function (exp) { - Tone.SignalBase.call(this); - /** - * the exponent - * @private - * @type {number} - */ - this._exp = Tone.defaultArg(exp, 1); - /** - * @type {WaveShaperNode} - * @private - */ - this._expScaler = this.input = this.output = new Tone.WaveShaper(this._expFunc(this._exp), 8192); - }; - Tone.extend(Tone.Pow, Tone.SignalBase); - /** - * The value of the exponent. - * @memberOf Tone.Pow# - * @type {number} - * @name value - */ - Object.defineProperty(Tone.Pow.prototype, 'value', { - get: function () { - return this._exp; - }, - set: function (exp) { - this._exp = exp; - this._expScaler.setMap(this._expFunc(this._exp)); - } - }); - /** - * the function which maps the waveshaper - * @param {number} exp - * @return {function} - * @private - */ - Tone.Pow.prototype._expFunc = function (exp) { - return function (val) { - return Math.pow(Math.abs(val), exp); - }; - }; - /** - * Clean up. - * @returns {Tone.Pow} this - */ - Tone.Pow.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._expScaler.dispose(); - this._expScaler = null; - return this; - }; - return Tone.Pow; - }); - Module(function (Tone) { - - /** - * @class Tone.Envelope is an [ADSR](https://en.wikipedia.org/wiki/Synthesizer#ADSR_envelope) - * envelope generator. Tone.Envelope outputs a signal which - * can be connected to an AudioParam or Tone.Signal. - * <img src="https://upload.wikimedia.org/wikipedia/commons/e/ea/ADSR_parameter.svg"> - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Time} [attack] The amount of time it takes for the envelope to go from - * 0 to it's maximum value. - * @param {Time} [decay] The period of time after the attack that it takes for the envelope - * to fall to the sustain value. - * @param {NormalRange} [sustain] The percent of the maximum value that the envelope rests at until - * the release is triggered. - * @param {Time} [release] The amount of time after the release is triggered it takes to reach 0. - * @example - * //an amplitude envelope - * var gainNode = Tone.context.createGain(); - * var env = new Tone.Envelope({ - * "attack" : 0.1, - * "decay" : 0.2, - * "sustain" : 1, - * "release" : 0.8, - * }); - * env.connect(gainNode.gain); - */ - Tone.Envelope = function () { - //get all of the defaults - var options = Tone.defaults(arguments, [ - 'attack', - 'decay', - 'sustain', - 'release' - ], Tone.Envelope); - Tone.AudioNode.call(this); - /** - * When triggerAttack is called, the attack time is the amount of - * time it takes for the envelope to reach it's maximum value. - * @type {Time} - */ - this.attack = options.attack; - /** - * After the attack portion of the envelope, the value will fall - * over the duration of the decay time to it's sustain value. - * @type {Time} - */ - this.decay = options.decay; - /** - * The sustain value is the value - * which the envelope rests at after triggerAttack is - * called, but before triggerRelease is invoked. - * @type {NormalRange} - */ - this.sustain = options.sustain; - /** - * After triggerRelease is called, the envelope's - * value will fall to it's miminum value over the - * duration of the release time. - * @type {Time} - */ - this.release = options.release; - /** - * the next time the envelope is at standby - * @type {number} - * @private - */ - this._attackCurve = 'linear'; - /** - * the next time the envelope is at standby - * @type {number} - * @private - */ - this._releaseCurve = 'exponential'; - /** - * the signal - * @type {Tone.Signal} - * @private - */ - this._sig = this.output = new Tone.Signal(0); - //set the attackCurve initially - this.attackCurve = options.attackCurve; - this.releaseCurve = options.releaseCurve; - }; - Tone.extend(Tone.Envelope, Tone.AudioNode); - /** - * the default parameters - * @static - * @const - */ - Tone.Envelope.defaults = { - 'attack': 0.01, - 'decay': 0.1, - 'sustain': 0.5, - 'release': 1, - 'attackCurve': 'linear', - 'releaseCurve': 'exponential' - }; - /** - * Read the current value of the envelope. Useful for - * syncronizing visual output to the envelope. - * @memberOf Tone.Envelope# - * @type {Number} - * @name value - * @readOnly - */ - Object.defineProperty(Tone.Envelope.prototype, 'value', { - get: function () { - return this.getValueAtTime(this.now()); - } - }); - /** - * The shape of the attack. - * Can be any of these strings: - * <ul> - * <li>linear</li> - * <li>exponential</li> - * <li>sine</li> - * <li>cosine</li> - * <li>bounce</li> - * <li>ripple</li> - * <li>step</li> - * </ul> - * Can also be an array which describes the curve. Values - * in the array are evenly subdivided and linearly - * interpolated over the duration of the attack. - * @memberOf Tone.Envelope# - * @type {String|Array} - * @name attackCurve - * @example - * env.attackCurve = "linear"; - * @example - * //can also be an array - * env.attackCurve = [0, 0.2, 0.3, 0.4, 1] - */ - Object.defineProperty(Tone.Envelope.prototype, 'attackCurve', { - get: function () { - if (Tone.isString(this._attackCurve)) { - return this._attackCurve; - } else if (Tone.isArray(this._attackCurve)) { - //look up the name in the curves array - for (var type in Tone.Envelope.Type) { - if (Tone.Envelope.Type[type].In === this._attackCurve) { - return type; - } - } - //otherwise just return the array - return this._attackCurve; - } - }, - set: function (curve) { - //check if it's a valid type - if (Tone.Envelope.Type.hasOwnProperty(curve)) { - var curveDef = Tone.Envelope.Type[curve]; - if (Tone.isObject(curveDef)) { - this._attackCurve = curveDef.In; - } else { - this._attackCurve = curveDef; - } - } else if (Tone.isArray(curve)) { - this._attackCurve = curve; - } else { - throw new Error('Tone.Envelope: invalid curve: ' + curve); - } - } - }); - /** - * The shape of the release. See the attack curve types. - * @memberOf Tone.Envelope# - * @type {String|Array} - * @name releaseCurve - * @example - * env.releaseCurve = "linear"; - */ - Object.defineProperty(Tone.Envelope.prototype, 'releaseCurve', { - get: function () { - if (Tone.isString(this._releaseCurve)) { - return this._releaseCurve; - } else if (Tone.isArray(this._releaseCurve)) { - //look up the name in the curves array - for (var type in Tone.Envelope.Type) { - if (Tone.Envelope.Type[type].Out === this._releaseCurve) { - return type; - } - } - //otherwise just return the array - return this._releaseCurve; - } - }, - set: function (curve) { - //check if it's a valid type - if (Tone.Envelope.Type.hasOwnProperty(curve)) { - var curveDef = Tone.Envelope.Type[curve]; - if (Tone.isObject(curveDef)) { - this._releaseCurve = curveDef.Out; - } else { - this._releaseCurve = curveDef; - } - } else if (Tone.isArray(curve)) { - this._releaseCurve = curve; - } else { - throw new Error('Tone.Envelope: invalid curve: ' + curve); - } - } - }); - /** - * Trigger the attack/decay portion of the ADSR envelope. - * @param {Time} [time=now] When the attack should start. - * @param {NormalRange} [velocity=1] The velocity of the envelope scales the vales. - * number between 0-1 - * @returns {Tone.Envelope} this - * @example - * //trigger the attack 0.5 seconds from now with a velocity of 0.2 - * env.triggerAttack("+0.5", 0.2); - */ - Tone.Envelope.prototype.triggerAttack = function (time, velocity) { - time = this.toSeconds(time); - var originalAttack = this.toSeconds(this.attack); - var attack = originalAttack; - var decay = this.toSeconds(this.decay); - velocity = Tone.defaultArg(velocity, 1); - //check if it's not a complete attack - var currentValue = this.getValueAtTime(time); - if (currentValue > 0) { - //subtract the current value from the attack time - var attackRate = 1 / attack; - var remainingDistance = 1 - currentValue; - //the attack is now the remaining time - attack = remainingDistance / attackRate; - } - //attack - if (this._attackCurve === 'linear') { - this._sig.linearRampTo(velocity, attack, time); - } else if (this._attackCurve === 'exponential') { - this._sig.targetRampTo(velocity, attack, time); - } else if (attack > 0) { - this._sig.cancelAndHoldAtTime(time); - var curve = this._attackCurve; - //take only a portion of the curve - if (attack < originalAttack) { - var percentComplete = 1 - attack / originalAttack; - var sliceIndex = Math.floor(percentComplete * this._attackCurve.length); - curve = this._attackCurve.slice(sliceIndex); - //the first index is the current value - curve[0] = currentValue; - } - this._sig.setValueCurveAtTime(curve, time, attack, velocity); - } - //decay - if (decay) { - this._sig.targetRampTo(velocity * this.sustain, decay, attack + time); - } - return this; - }; - /** - * Triggers the release of the envelope. - * @param {Time} [time=now] When the release portion of the envelope should start. - * @returns {Tone.Envelope} this - * @example - * //trigger release immediately - * env.triggerRelease(); - */ - Tone.Envelope.prototype.triggerRelease = function (time) { - time = this.toSeconds(time); - var currentValue = this.getValueAtTime(time); - if (currentValue > 0) { - var release = this.toSeconds(this.release); - if (this._releaseCurve === 'linear') { - this._sig.linearRampTo(0, release, time); - } else if (this._releaseCurve === 'exponential') { - this._sig.targetRampTo(0, release, time); - } else { - var curve = this._releaseCurve; - if (Tone.isArray(curve)) { - this._sig.cancelAndHoldAtTime(time); - this._sig.setValueCurveAtTime(curve, time, release, currentValue); - } - } - } - return this; - }; - /** - * Get the scheduled value at the given time. This will - * return the unconverted (raw) value. - * @param {Number} time The time in seconds. - * @return {Number} The scheduled value at the given time. - */ - Tone.Envelope.prototype.getValueAtTime = function (time) { - return this._sig.getValueAtTime(time); - }; - /** - * triggerAttackRelease is shorthand for triggerAttack, then waiting - * some duration, then triggerRelease. - * @param {Time} duration The duration of the sustain. - * @param {Time} [time=now] When the attack should be triggered. - * @param {number} [velocity=1] The velocity of the envelope. - * @returns {Tone.Envelope} this - * @example - * //trigger the attack and then the release after 0.6 seconds. - * env.triggerAttackRelease(0.6); - */ - Tone.Envelope.prototype.triggerAttackRelease = function (duration, time, velocity) { - time = this.toSeconds(time); - this.triggerAttack(time, velocity); - this.triggerRelease(time + this.toSeconds(duration)); - return this; - }; - /** - * Cancels all scheduled envelope changes after the given time. - * @param {Time} after - * @returns {Tone.Envelope} this - */ - Tone.Envelope.prototype.cancel = function (after) { - this._sig.cancelScheduledValues(after); - return this; - }; - /** - * Borrows the connect method from Tone.Signal. - * @function - * @private - */ - Tone.Envelope.prototype.connect = Tone.SignalBase.prototype.connect; - /** - * Generate some complex envelope curves. - */ - (function _createCurves() { - var curveLen = 128; - var i, k; - //cosine curve - var cosineCurve = []; - for (i = 0; i < curveLen; i++) { - cosineCurve[i] = Math.sin(i / (curveLen - 1) * (Math.PI / 2)); - } - //ripple curve - var rippleCurve = []; - var rippleCurveFreq = 6.4; - for (i = 0; i < curveLen - 1; i++) { - k = i / (curveLen - 1); - var sineWave = Math.sin(k * (Math.PI * 2) * rippleCurveFreq - Math.PI / 2) + 1; - rippleCurve[i] = sineWave / 10 + k * 0.83; - } - rippleCurve[curveLen - 1] = 1; - //stairs curve - var stairsCurve = []; - var steps = 5; - for (i = 0; i < curveLen; i++) { - stairsCurve[i] = Math.ceil(i / (curveLen - 1) * steps) / steps; - } - //in-out easing curve - var sineCurve = []; - for (i = 0; i < curveLen; i++) { - k = i / (curveLen - 1); - sineCurve[i] = 0.5 * (1 - Math.cos(Math.PI * k)); - } - //a bounce curve - var bounceCurve = []; - for (i = 0; i < curveLen; i++) { - k = i / (curveLen - 1); - var freq = Math.pow(k, 3) * 4 + 0.2; - var val = Math.cos(freq * Math.PI * 2 * k); - bounceCurve[i] = Math.abs(val * (1 - k)); - } - /** - * Invert a value curve to make it work for the release - * @private - */ - function invertCurve(curve) { - var out = new Array(curve.length); - for (var j = 0; j < curve.length; j++) { - out[j] = 1 - curve[j]; - } - return out; - } - /** - * reverse the curve - * @private - */ - function reverseCurve(curve) { - return curve.slice(0).reverse(); - } - /** - * attack and release curve arrays - * @type {Object} - * @private - */ - Tone.Envelope.Type = { - 'linear': 'linear', - 'exponential': 'exponential', - 'bounce': { - In: invertCurve(bounceCurve), - Out: bounceCurve - }, - 'cosine': { - In: cosineCurve, - Out: reverseCurve(cosineCurve) - }, - 'step': { - In: stairsCurve, - Out: invertCurve(stairsCurve) - }, - 'ripple': { - In: rippleCurve, - Out: invertCurve(rippleCurve) - }, - 'sine': { - In: sineCurve, - Out: invertCurve(sineCurve) - } - }; - }()); - /** - * Disconnect and dispose. - * @returns {Tone.Envelope} this - */ - Tone.Envelope.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._sig.dispose(); - this._sig = null; - this._attackCurve = null; - this._releaseCurve = null; - return this; - }; - return Tone.Envelope; - }); - Module(function (Tone) { - - /** - * @class Tone.AmplitudeEnvelope is a Tone.Envelope connected to a gain node. - * Unlike Tone.Envelope, which outputs the envelope's value, Tone.AmplitudeEnvelope accepts - * an audio signal as the input and will apply the envelope to the amplitude - * of the signal. Read more about ADSR Envelopes on [Wikipedia](https://en.wikipedia.org/wiki/Synthesizer#ADSR_envelope). - * - * @constructor - * @extends {Tone.Envelope} - * @param {Time|Object} [attack] The amount of time it takes for the envelope to go from - * 0 to it's maximum value. - * @param {Time} [decay] The period of time after the attack that it takes for the envelope - * to fall to the sustain value. - * @param {NormalRange} [sustain] The percent of the maximum value that the envelope rests at until - * the release is triggered. - * @param {Time} [release] The amount of time after the release is triggered it takes to reach 0. - * @example - * var ampEnv = new Tone.AmplitudeEnvelope({ - * "attack": 0.1, - * "decay": 0.2, - * "sustain": 1.0, - * "release": 0.8 - * }).toMaster(); - * //create an oscillator and connect it - * var osc = new Tone.Oscillator().connect(ampEnv).start(); - * //trigger the envelopes attack and release "8t" apart - * ampEnv.triggerAttackRelease("8t"); - */ - Tone.AmplitudeEnvelope = function () { - Tone.Envelope.apply(this, arguments); - /** - * the input node - * @type {GainNode} - * @private - */ - this.input = this.output = new Tone.Gain(); - this._sig.connect(this.output.gain); - }; - Tone.extend(Tone.AmplitudeEnvelope, Tone.Envelope); - /** - * Clean up - * @return {Tone.AmplitudeEnvelope} this - */ - Tone.AmplitudeEnvelope.prototype.dispose = function () { - Tone.Envelope.prototype.dispose.call(this); - return this; - }; - return Tone.AmplitudeEnvelope; - }); - Module(function (Tone) { - /** - * AnalyserNode.getFloatTimeDomainData polyfill - * @private - */ - if (Tone.supported) { - if (!AnalyserNode.prototype.getFloatTimeDomainData) { - //referenced https://github.com/mohayonao/get-float-time-domain-data - AnalyserNode.prototype.getFloatTimeDomainData = function (array) { - var uint8 = new Uint8Array(array.length); - this.getByteTimeDomainData(uint8); - for (var i = 0; i < uint8.length; i++) { - array[i] = (uint8[i] - 128) / 128; - } - }; - } - } - }); - Module(function (Tone) { - - /** - * @class Wrapper around the native Web Audio's - * [AnalyserNode](http://webaudio.github.io/web-audio-api/#idl-def-AnalyserNode). - * Extracts FFT or Waveform data from the incoming signal. - * @extends {Tone.AudioNode} - * @param {String=} type The return type of the analysis, either "fft", or "waveform". - * @param {Number=} size The size of the FFT. Value must be a power of - * two in the range 32 to 32768. - */ - Tone.Analyser = function () { - var options = Tone.defaults(arguments, [ - 'type', - 'size' - ], Tone.Analyser); - Tone.AudioNode.call(this); - /** - * The analyser node. - * @private - * @type {AnalyserNode} - */ - this._analyser = this.input = this.output = this.context.createAnalyser(); - /** - * The analysis type - * @type {String} - * @private - */ - this._type = options.type; - /** - * The buffer that the FFT data is written to - * @type {TypedArray} - * @private - */ - this._buffer = null; - //set the values initially - this.size = options.size; - this.type = options.type; - }; - Tone.extend(Tone.Analyser, Tone.AudioNode); - /** - * The default values. - * @type {Object} - * @const - */ - Tone.Analyser.defaults = { - 'size': 1024, - 'type': 'fft', - 'smoothing': 0.8 - }; - /** - * Possible return types of analyser.getValue() - * @enum {String} - */ - Tone.Analyser.Type = { - Waveform: 'waveform', - FFT: 'fft' - }; - /** - * Run the analysis given the current settings and return the - * result as a TypedArray. - * @returns {TypedArray} - */ - Tone.Analyser.prototype.getValue = function () { - if (this._type === Tone.Analyser.Type.FFT) { - this._analyser.getFloatFrequencyData(this._buffer); - } else if (this._type === Tone.Analyser.Type.Waveform) { - this._analyser.getFloatTimeDomainData(this._buffer); - } - return this._buffer; - }; - /** - * The size of analysis. This must be a power of two in the range 32 to 32768. - * @memberOf Tone.Analyser# - * @type {Number} - * @name size - */ - Object.defineProperty(Tone.Analyser.prototype, 'size', { - get: function () { - return this._analyser.frequencyBinCount; - }, - set: function (size) { - this._analyser.fftSize = size * 2; - this._buffer = new Float32Array(size); - } - }); - /** - * The analysis function returned by analyser.getValue(), either "fft" or "waveform". - * @memberOf Tone.Analyser# - * @type {String} - * @name type - */ - Object.defineProperty(Tone.Analyser.prototype, 'type', { - get: function () { - return this._type; - }, - set: function (type) { - if (type !== Tone.Analyser.Type.Waveform && type !== Tone.Analyser.Type.FFT) { - throw new TypeError('Tone.Analyser: invalid type: ' + type); - } - this._type = type; - } - }); - /** - * 0 represents no time averaging with the last analysis frame. - * @memberOf Tone.Analyser# - * @type {NormalRange} - * @name smoothing - */ - Object.defineProperty(Tone.Analyser.prototype, 'smoothing', { - get: function () { - return this._analyser.smoothingTimeConstant; - }, - set: function (val) { - this._analyser.smoothingTimeConstant = val; - } - }); - /** - * Clean up. - * @return {Tone.Analyser} this - */ - Tone.Analyser.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._analyser.disconnect(); - this._analyser = null; - this._buffer = null; - }; - return Tone.Analyser; - }); - Module(function (Tone) { - - /** - * @class Tone.Compressor is a thin wrapper around the Web Audio - * [DynamicsCompressorNode](http://webaudio.github.io/web-audio-api/#the-dynamicscompressornode-interface). - * Compression reduces the volume of loud sounds or amplifies quiet sounds - * by narrowing or "compressing" an audio signal's dynamic range. - * Read more on [Wikipedia](https://en.wikipedia.org/wiki/Dynamic_range_compression). - * - * @extends {Tone.AudioNode} - * @constructor - * @param {Decibels|Object} [threshold] The value above which the compression starts to be applied. - * @param {Positive} [ratio] The gain reduction ratio. - * @example - * var comp = new Tone.Compressor(-30, 3); - */ - Tone.Compressor = function () { - var options = Tone.defaults(arguments, [ - 'threshold', - 'ratio' - ], Tone.Compressor); - Tone.AudioNode.call(this); - /** - * the compressor node - * @type {DynamicsCompressorNode} - * @private - */ - this._compressor = this.input = this.output = this.context.createDynamicsCompressor(); - /** - * the threshold vaue - * @type {Decibels} - * @signal - */ - this.threshold = new Tone.Param({ - 'param': this._compressor.threshold, - 'units': Tone.Type.Decibels, - 'convert': false - }); - /** - * The attack parameter - * @type {Time} - * @signal - */ - this.attack = new Tone.Param(this._compressor.attack, Tone.Type.Time); - /** - * The release parameter - * @type {Time} - * @signal - */ - this.release = new Tone.Param(this._compressor.release, Tone.Type.Time); - /** - * The knee parameter - * @type {Decibels} - * @signal - */ - this.knee = new Tone.Param({ - 'param': this._compressor.knee, - 'units': Tone.Type.Decibels, - 'convert': false - }); - /** - * The ratio value - * @type {Number} - * @signal - */ - this.ratio = new Tone.Param({ - 'param': this._compressor.ratio, - 'convert': false - }); - //set the defaults - this._readOnly([ - 'knee', - 'release', - 'attack', - 'ratio', - 'threshold' - ]); - this.set(options); - }; - Tone.extend(Tone.Compressor, Tone.AudioNode); - /** - * @static - * @const - * @type {Object} - */ - Tone.Compressor.defaults = { - 'ratio': 12, - 'threshold': -24, - 'release': 0.25, - 'attack': 0.003, - 'knee': 30 - }; - /** - * clean up - * @returns {Tone.Compressor} this - */ - Tone.Compressor.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable([ - 'knee', - 'release', - 'attack', - 'ratio', - 'threshold' - ]); - this._compressor.disconnect(); - this._compressor = null; - this.attack.dispose(); - this.attack = null; - this.release.dispose(); - this.release = null; - this.threshold.dispose(); - this.threshold = null; - this.ratio.dispose(); - this.ratio = null; - this.knee.dispose(); - this.knee = null; - return this; - }; - return Tone.Compressor; - }); - Module(function (Tone) { - - /** - * @class Add a signal and a number or two signals. When no value is - * passed into the constructor, Tone.Add will sum <code>input[0]</code> - * and <code>input[1]</code>. If a value is passed into the constructor, - * the it will be added to the input. - * - * @constructor - * @extends {Tone.Signal} - * @param {number=} value If no value is provided, Tone.Add will sum the first - * and second inputs. - * @example - * var signal = new Tone.Signal(2); - * var add = new Tone.Add(2); - * signal.connect(add); - * //the output of add equals 4 - * @example - * //if constructed with no arguments - * //it will add the first and second inputs - * var add = new Tone.Add(); - * var sig0 = new Tone.Signal(3).connect(add, 0, 0); - * var sig1 = new Tone.Signal(4).connect(add, 0, 1); - * //the output of add equals 7. - */ - Tone.Add = function (value) { - Tone.Signal.call(this); - this.createInsOuts(2, 0); - /** - * the summing node - * @type {GainNode} - * @private - */ - this._sum = this.input[0] = this.input[1] = this.output = new Tone.Gain(); - /** - * @private - * @type {Tone.Signal} - */ - this._param = this.input[1] = new Tone.Signal(value); - this._param.connect(this._sum); - }; - Tone.extend(Tone.Add, Tone.Signal); - /** - * Clean up. - * @returns {Tone.Add} this - */ - Tone.Add.prototype.dispose = function () { - Tone.Signal.prototype.dispose.call(this); - this._sum.dispose(); - this._sum = null; - return this; - }; - return Tone.Add; - }); - Module(function (Tone) { - - /** - * @class Multiply two incoming signals. Or, if a number is given in the constructor, - * multiplies the incoming signal by that value. - * - * @constructor - * @extends {Tone.Signal} - * @param {number=} value Constant value to multiple. If no value is provided, - * it will return the product of the first and second inputs - * @example - * var mult = new Tone.Multiply(); - * var sigA = new Tone.Signal(3); - * var sigB = new Tone.Signal(4); - * sigA.connect(mult, 0, 0); - * sigB.connect(mult, 0, 1); - * //output of mult is 12. - * @example - * var mult = new Tone.Multiply(10); - * var sig = new Tone.Signal(2).connect(mult); - * //the output of mult is 20. - */ - Tone.Multiply = function (value) { - Tone.Signal.call(this); - this.createInsOuts(2, 0); - /** - * the input node is the same as the output node - * it is also the GainNode which handles the scaling of incoming signal - * - * @type {GainNode} - * @private - */ - this._mult = this.input[0] = this.output = new Tone.Gain(); - /** - * the scaling parameter - * @type {AudioParam} - * @private - */ - this._param = this.input[1] = this.output.gain; - this.value = Tone.defaultArg(value, 0); - }; - Tone.extend(Tone.Multiply, Tone.Signal); - /** - * clean up - * @returns {Tone.Multiply} this - */ - Tone.Multiply.prototype.dispose = function () { - Tone.Signal.prototype.dispose.call(this); - this._mult.dispose(); - this._mult = null; - this._param = null; - return this; - }; - return Tone.Multiply; - }); - Module(function (Tone) { - - /** - * @class Negate the incoming signal. i.e. an input signal of 10 will output -10 - * - * @constructor - * @extends {Tone.SignalBase} - * @example - * var neg = new Tone.Negate(); - * var sig = new Tone.Signal(-2).connect(neg); - * //output of neg is positive 2. - */ - Tone.Negate = function () { - Tone.SignalBase.call(this); - /** - * negation is done by multiplying by -1 - * @type {Tone.Multiply} - * @private - */ - this._multiply = this.input = this.output = new Tone.Multiply(-1); - }; - Tone.extend(Tone.Negate, Tone.SignalBase); - /** - * clean up - * @returns {Tone.Negate} this - */ - Tone.Negate.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._multiply.dispose(); - this._multiply = null; - return this; - }; - return Tone.Negate; - }); - Module(function (Tone) { - - /** - * @class Subtract the signal connected to <code>input[1]</code> from the signal connected - * to <code>input[0]</code>. If an argument is provided in the constructor, the - * signals <code>.value</code> will be subtracted from the incoming signal. - * - * @extends {Tone.Signal} - * @constructor - * @param {number=} value The value to subtract from the incoming signal. If the value - * is omitted, it will subtract the second signal from the first. - * @example - * var sub = new Tone.Subtract(1); - * var sig = new Tone.Signal(4).connect(sub); - * //the output of sub is 3. - * @example - * var sub = new Tone.Subtract(); - * var sigA = new Tone.Signal(10); - * var sigB = new Tone.Signal(2.5); - * sigA.connect(sub, 0, 0); - * sigB.connect(sub, 0, 1); - * //output of sub is 7.5 - */ - Tone.Subtract = function (value) { - Tone.Signal.call(this); - this.createInsOuts(2, 0); - /** - * the summing node - * @type {GainNode} - * @private - */ - this._sum = this.input[0] = this.output = new Tone.Gain(); - /** - * negate the input of the second input before connecting it - * to the summing node. - * @type {Tone.Negate} - * @private - */ - this._neg = new Tone.Negate(); - /** - * the node where the value is set - * @private - * @type {Tone.Signal} - */ - this._param = this.input[1] = new Tone.Signal(value); - this._param.chain(this._neg, this._sum); - }; - Tone.extend(Tone.Subtract, Tone.Signal); - /** - * Clean up. - * @returns {Tone.SignalBase} this - */ - Tone.Subtract.prototype.dispose = function () { - Tone.Signal.prototype.dispose.call(this); - this._neg.dispose(); - this._neg = null; - this._sum.disconnect(); - this._sum = null; - return this; - }; - return Tone.Subtract; - }); - Module(function (Tone) { - - /** - * @class Convert an incoming signal between 0, 1 to an equal power gain scale. - * - * @extends {Tone.SignalBase} - * @constructor - * @example - * var eqPowGain = new Tone.EqualPowerGain(); - */ - Tone.EqualPowerGain = function () { - Tone.SignalBase.call(this); - /** - * @type {Tone.WaveShaper} - * @private - */ - this._eqPower = this.input = this.output = new Tone.WaveShaper(function (val) { - if (Math.abs(val) < 0.001) { - //should output 0 when input is 0 - return 0; - } else { - return Tone.equalPowerScale(val); - } - }.bind(this), 4096); - }; - Tone.extend(Tone.EqualPowerGain, Tone.SignalBase); - /** - * clean up - * @returns {Tone.EqualPowerGain} this - */ - Tone.EqualPowerGain.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._eqPower.dispose(); - this._eqPower = null; - return this; - }; - return Tone.EqualPowerGain; - }); - Module(function (Tone) { - - /** - * @class Tone.Crossfade provides equal power fading between two inputs. - * More on crossfading technique [here](https://en.wikipedia.org/wiki/Fade_(audio_engineering)#Crossfading). - * - * @constructor - * @extends {Tone.AudioNode} - * @param {NormalRange} [initialFade=0.5] - * @example - * var crossFade = new Tone.CrossFade(0.5); - * //connect effect A to crossfade from - * //effect output 0 to crossfade input 0 - * effectA.connect(crossFade, 0, 0); - * //connect effect B to crossfade from - * //effect output 0 to crossfade input 1 - * effectB.connect(crossFade, 0, 1); - * crossFade.fade.value = 0; - * // ^ only effectA is output - * crossFade.fade.value = 1; - * // ^ only effectB is output - * crossFade.fade.value = 0.5; - * // ^ the two signals are mixed equally. - */ - Tone.CrossFade = function (initialFade) { - Tone.AudioNode.call(this); - this.createInsOuts(2, 1); - /** - * Alias for <code>input[0]</code>. - * @type {Tone.Gain} - */ - this.a = this.input[0] = new Tone.Gain(); - /** - * Alias for <code>input[1]</code>. - * @type {Tone.Gain} - */ - this.b = this.input[1] = new Tone.Gain(); - /** - * The mix between the two inputs. A fade value of 0 - * will output 100% <code>input[0]</code> and - * a value of 1 will output 100% <code>input[1]</code>. - * @type {NormalRange} - * @signal - */ - this.fade = new Tone.Signal(Tone.defaultArg(initialFade, 0.5), Tone.Type.NormalRange); - /** - * equal power gain cross fade - * @private - * @type {Tone.EqualPowerGain} - */ - this._equalPowerA = new Tone.EqualPowerGain(); - /** - * equal power gain cross fade - * @private - * @type {Tone.EqualPowerGain} - */ - this._equalPowerB = new Tone.EqualPowerGain(); - /** - * invert the incoming signal - * @private - * @type {Tone} - */ - this._one = this.context.getConstant(1); - /** - * invert the incoming signal - * @private - * @type {Tone.Subtract} - */ - this._invert = new Tone.Subtract(); - //connections - this.a.connect(this.output); - this.b.connect(this.output); - this.fade.chain(this._equalPowerB, this.b.gain); - this._one.connect(this._invert, 0, 0); - this.fade.connect(this._invert, 0, 1); - this._invert.chain(this._equalPowerA, this.a.gain); - this._readOnly('fade'); - }; - Tone.extend(Tone.CrossFade, Tone.AudioNode); - /** - * clean up - * @returns {Tone.CrossFade} this - */ - Tone.CrossFade.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable('fade'); - this._equalPowerA.dispose(); - this._equalPowerA = null; - this._equalPowerB.dispose(); - this._equalPowerB = null; - this.fade.dispose(); - this.fade = null; - this._invert.dispose(); - this._invert = null; - this._one = null; - this.a.dispose(); - this.a = null; - this.b.dispose(); - this.b = null; - return this; - }; - return Tone.CrossFade; - }); - Module(function (Tone) { - - /** - * @class Tone.Filter is a filter which allows for all of the same native methods - * as the [BiquadFilterNode](http://webaudio.github.io/web-audio-api/#the-biquadfilternode-interface). - * Tone.Filter has the added ability to set the filter rolloff at -12 - * (default), -24 and -48. - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Frequency|Object} [frequency] The cutoff frequency of the filter. - * @param {string=} type The type of filter. - * @param {number=} rolloff The drop in decibels per octave after the cutoff frequency. - * 3 choices: -12, -24, and -48 - * @example - * var filter = new Tone.Filter(200, "highpass"); - */ - Tone.Filter = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'type', - 'rolloff' - ], Tone.Filter); - Tone.AudioNode.call(this); - this.createInsOuts(1, 1); - /** - * the filter(s) - * @type {Array} - * @private - */ - this._filters = []; - /** - * The cutoff frequency of the filter. - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency); - /** - * The detune parameter - * @type {Cents} - * @signal - */ - this.detune = new Tone.Signal(0, Tone.Type.Cents); - /** - * The gain of the filter, only used in certain filter types - * @type {Number} - * @signal - */ - this.gain = new Tone.Signal({ - 'value': options.gain, - 'convert': false - }); - /** - * The Q or Quality of the filter - * @type {Positive} - * @signal - */ - this.Q = new Tone.Signal(options.Q); - /** - * the type of the filter - * @type {string} - * @private - */ - this._type = options.type; - /** - * the rolloff value of the filter - * @type {number} - * @private - */ - this._rolloff = options.rolloff; - //set the rolloff; - this.rolloff = options.rolloff; - this._readOnly([ - 'detune', - 'frequency', - 'gain', - 'Q' - ]); - }; - Tone.extend(Tone.Filter, Tone.AudioNode); - /** - * the default parameters - * - * @static - * @type {Object} - */ - Tone.Filter.defaults = { - 'type': 'lowpass', - 'frequency': 350, - 'rolloff': -12, - 'Q': 1, - 'gain': 0 - }; - /** - * The type of the filter. Types: "lowpass", "highpass", - * "bandpass", "lowshelf", "highshelf", "notch", "allpass", or "peaking". - * @memberOf Tone.Filter# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.Filter.prototype, 'type', { - get: function () { - return this._type; - }, - set: function (type) { - var types = [ - 'lowpass', - 'highpass', - 'bandpass', - 'lowshelf', - 'highshelf', - 'notch', - 'allpass', - 'peaking' - ]; - if (types.indexOf(type) === -1) { - throw new TypeError('Tone.Filter: invalid type ' + type); - } - this._type = type; - for (var i = 0; i < this._filters.length; i++) { - this._filters[i].type = type; - } - } - }); - /** - * The rolloff of the filter which is the drop in db - * per octave. Implemented internally by cascading filters. - * Only accepts the values -12, -24, -48 and -96. - * @memberOf Tone.Filter# - * @type {number} - * @name rolloff - */ - Object.defineProperty(Tone.Filter.prototype, 'rolloff', { - get: function () { - return this._rolloff; - }, - set: function (rolloff) { - rolloff = parseInt(rolloff, 10); - var possibilities = [ - -12, - -24, - -48, - -96 - ]; - var cascadingCount = possibilities.indexOf(rolloff); - //check the rolloff is valid - if (cascadingCount === -1) { - throw new RangeError('Tone.Filter: rolloff can only be -12, -24, -48 or -96'); - } - cascadingCount += 1; - this._rolloff = rolloff; - //first disconnect the filters and throw them away - this.input.disconnect(); - for (var i = 0; i < this._filters.length; i++) { - this._filters[i].disconnect(); - this._filters[i] = null; - } - this._filters = new Array(cascadingCount); - for (var count = 0; count < cascadingCount; count++) { - var filter = this.context.createBiquadFilter(); - filter.type = this._type; - this.frequency.connect(filter.frequency); - this.detune.connect(filter.detune); - this.Q.connect(filter.Q); - this.gain.connect(filter.gain); - this._filters[count] = filter; - } - //connect them up - var connectionChain = [this.input].concat(this._filters).concat([this.output]); - Tone.connectSeries.apply(Tone, connectionChain); - } - }); - /** - * Clean up. - * @return {Tone.Filter} this - */ - Tone.Filter.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - for (var i = 0; i < this._filters.length; i++) { - this._filters[i].disconnect(); - this._filters[i] = null; - } - this._filters = null; - this._writable([ - 'detune', - 'frequency', - 'gain', - 'Q' - ]); - this.frequency.dispose(); - this.Q.dispose(); - this.frequency = null; - this.Q = null; - this.detune.dispose(); - this.detune = null; - this.gain.dispose(); - this.gain = null; - return this; - }; - return Tone.Filter; - }); - Module(function (Tone) { - - /** - * @class Split the incoming signal into three bands (low, mid, high) - * with two crossover frequency controls. - * - * @extends {Tone.AudioNode} - * @constructor - * @param {Frequency|Object} [lowFrequency] the low/mid crossover frequency - * @param {Frequency} [highFrequency] the mid/high crossover frequency - */ - Tone.MultibandSplit = function () { - var options = Tone.defaults(arguments, [ - 'lowFrequency', - 'highFrequency' - ], Tone.MultibandSplit); - Tone.AudioNode.call(this); - /** - * the input - * @type {Tone.Gain} - * @private - */ - this.input = new Tone.Gain(); - /** - * the outputs - * @type {Array} - * @private - */ - this.output = new Array(3); - /** - * The low band. Alias for <code>output[0]</code> - * @type {Tone.Filter} - */ - this.low = this.output[0] = new Tone.Filter(0, 'lowpass'); - /** - * the lower filter of the mid band - * @type {Tone.Filter} - * @private - */ - this._lowMidFilter = new Tone.Filter(0, 'highpass'); - /** - * The mid band output. Alias for <code>output[1]</code> - * @type {Tone.Filter} - */ - this.mid = this.output[1] = new Tone.Filter(0, 'lowpass'); - /** - * The high band output. Alias for <code>output[2]</code> - * @type {Tone.Filter} - */ - this.high = this.output[2] = new Tone.Filter(0, 'highpass'); - /** - * The low/mid crossover frequency. - * @type {Frequency} - * @signal - */ - this.lowFrequency = new Tone.Signal(options.lowFrequency, Tone.Type.Frequency); - /** - * The mid/high crossover frequency. - * @type {Frequency} - * @signal - */ - this.highFrequency = new Tone.Signal(options.highFrequency, Tone.Type.Frequency); - /** - * The quality of all the filters - * @type {Number} - * @signal - */ - this.Q = new Tone.Signal(options.Q); - this.input.fan(this.low, this.high); - this.input.chain(this._lowMidFilter, this.mid); - //the frequency control signal - this.lowFrequency.connect(this.low.frequency); - this.lowFrequency.connect(this._lowMidFilter.frequency); - this.highFrequency.connect(this.mid.frequency); - this.highFrequency.connect(this.high.frequency); - //the Q value - this.Q.connect(this.low.Q); - this.Q.connect(this._lowMidFilter.Q); - this.Q.connect(this.mid.Q); - this.Q.connect(this.high.Q); - this._readOnly([ - 'high', - 'mid', - 'low', - 'highFrequency', - 'lowFrequency' - ]); - }; - Tone.extend(Tone.MultibandSplit, Tone.AudioNode); - /** - * @private - * @static - * @type {Object} - */ - Tone.MultibandSplit.defaults = { - 'lowFrequency': 400, - 'highFrequency': 2500, - 'Q': 1 - }; - /** - * Clean up. - * @returns {Tone.MultibandSplit} this - */ - Tone.MultibandSplit.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable([ - 'high', - 'mid', - 'low', - 'highFrequency', - 'lowFrequency' - ]); - this.low.dispose(); - this.low = null; - this._lowMidFilter.dispose(); - this._lowMidFilter = null; - this.mid.dispose(); - this.mid = null; - this.high.dispose(); - this.high = null; - this.lowFrequency.dispose(); - this.lowFrequency = null; - this.highFrequency.dispose(); - this.highFrequency = null; - this.Q.dispose(); - this.Q = null; - return this; - }; - return Tone.MultibandSplit; - }); - Module(function (Tone) { - - /** - * @class Tone.EQ3 is a three band EQ with control over low, mid, and high gain as - * well as the low and high crossover frequencies. - * - * @constructor - * @extends {Tone.AudioNode} - * - * @param {Decibels|Object} [lowLevel] The gain applied to the lows. - * @param {Decibels} [midLevel] The gain applied to the mid. - * @param {Decibels} [highLevel] The gain applied to the high. - * @example - * var eq = new Tone.EQ3(-10, 3, -20); - */ - Tone.EQ3 = function () { - var options = Tone.defaults(arguments, [ - 'low', - 'mid', - 'high' - ], Tone.EQ3); - Tone.AudioNode.call(this); - /** - * the output node - * @type {GainNode} - * @private - */ - this.output = new Tone.Gain(); - /** - * the multiband split - * @type {Tone.MultibandSplit} - * @private - */ - this._multibandSplit = this.input = new Tone.MultibandSplit({ - 'lowFrequency': options.lowFrequency, - 'highFrequency': options.highFrequency - }); - /** - * The gain for the lower signals - * @type {Tone.Gain} - * @private - */ - this._lowGain = new Tone.Gain(options.low, Tone.Type.Decibels); - /** - * The gain for the mid signals - * @type {Tone.Gain} - * @private - */ - this._midGain = new Tone.Gain(options.mid, Tone.Type.Decibels); - /** - * The gain in decibels of the high part - * @type {Tone.Gain} - * @private - */ - this._highGain = new Tone.Gain(options.high, Tone.Type.Decibels); - /** - * The gain in decibels of the low part - * @type {Decibels} - * @signal - */ - this.low = this._lowGain.gain; - /** - * The gain in decibels of the mid part - * @type {Decibels} - * @signal - */ - this.mid = this._midGain.gain; - /** - * The gain in decibels of the high part - * @type {Decibels} - * @signal - */ - this.high = this._highGain.gain; - /** - * The Q value for all of the filters. - * @type {Positive} - * @signal - */ - this.Q = this._multibandSplit.Q; - /** - * The low/mid crossover frequency. - * @type {Frequency} - * @signal - */ - this.lowFrequency = this._multibandSplit.lowFrequency; - /** - * The mid/high crossover frequency. - * @type {Frequency} - * @signal - */ - this.highFrequency = this._multibandSplit.highFrequency; - //the frequency bands - this._multibandSplit.low.chain(this._lowGain, this.output); - this._multibandSplit.mid.chain(this._midGain, this.output); - this._multibandSplit.high.chain(this._highGain, this.output); - this._readOnly([ - 'low', - 'mid', - 'high', - 'lowFrequency', - 'highFrequency' - ]); - }; - Tone.extend(Tone.EQ3, Tone.AudioNode); - /** - * the default values - */ - Tone.EQ3.defaults = { - 'low': 0, - 'mid': 0, - 'high': 0, - 'lowFrequency': 400, - 'highFrequency': 2500 - }; - /** - * clean up - * @returns {Tone.EQ3} this - */ - Tone.EQ3.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable([ - 'low', - 'mid', - 'high', - 'lowFrequency', - 'highFrequency' - ]); - this._multibandSplit.dispose(); - this._multibandSplit = null; - this.lowFrequency = null; - this.highFrequency = null; - this._lowGain.dispose(); - this._lowGain = null; - this._midGain.dispose(); - this._midGain = null; - this._highGain.dispose(); - this._highGain = null; - this.low = null; - this.mid = null; - this.high = null; - this.Q = null; - return this; - }; - return Tone.EQ3; - }); - Module(function (Tone) { - - /** - * @class Performs a linear scaling on an input signal. - * Scales a NormalRange input to between - * outputMin and outputMax. - * - * @constructor - * @extends {Tone.SignalBase} - * @param {number} [outputMin=0] The output value when the input is 0. - * @param {number} [outputMax=1] The output value when the input is 1. - * @example - * var scale = new Tone.Scale(50, 100); - * var signal = new Tone.Signal(0.5).connect(scale); - * //the output of scale equals 75 - */ - Tone.Scale = function (outputMin, outputMax) { - Tone.SignalBase.call(this); - /** - * @private - * @type {number} - */ - this._outputMin = Tone.defaultArg(outputMin, 0); - /** - * @private - * @type {number} - */ - this._outputMax = Tone.defaultArg(outputMax, 1); - /** - * @private - * @type {Tone.Multiply} - * @private - */ - this._scale = this.input = new Tone.Multiply(1); - /** - * @private - * @type {Tone.Add} - * @private - */ - this._add = this.output = new Tone.Add(0); - this._scale.connect(this._add); - this._setRange(); - }; - Tone.extend(Tone.Scale, Tone.SignalBase); - /** - * The minimum output value. This number is output when - * the value input value is 0. - * @memberOf Tone.Scale# - * @type {number} - * @name min - */ - Object.defineProperty(Tone.Scale.prototype, 'min', { - get: function () { - return this._outputMin; - }, - set: function (min) { - this._outputMin = min; - this._setRange(); - } - }); - /** - * The maximum output value. This number is output when - * the value input value is 1. - * @memberOf Tone.Scale# - * @type {number} - * @name max - */ - Object.defineProperty(Tone.Scale.prototype, 'max', { - get: function () { - return this._outputMax; - }, - set: function (max) { - this._outputMax = max; - this._setRange(); - } - }); - /** - * set the values - * @private - */ - Tone.Scale.prototype._setRange = function () { - this._add.value = this._outputMin; - this._scale.value = this._outputMax - this._outputMin; - }; - /** - * Clean up. - * @returns {Tone.Scale} this - */ - Tone.Scale.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._add.dispose(); - this._add = null; - this._scale.dispose(); - this._scale = null; - return this; - }; - return Tone.Scale; - }); - Module(function (Tone) { - /** - * @class Performs an exponential scaling on an input signal. - * Scales a NormalRange value [0,1] exponentially - * to the output range of outputMin to outputMax. - * - * @constructor - * @extends {Tone.SignalBase} - * @param {number} [outputMin=0] The output value when the input is 0. - * @param {number} [outputMax=1] The output value when the input is 1. - * @param {number} [exponent=2] The exponent which scales the incoming signal. - * @example - * var scaleExp = new Tone.ScaleExp(0, 100, 2); - * var signal = new Tone.Signal(0.5).connect(scaleExp); - */ - Tone.ScaleExp = function (outputMin, outputMax, exponent) { - Tone.SignalBase.call(this); - /** - * scale the input to the output range - * @type {Tone.Scale} - * @private - */ - this._scale = this.output = new Tone.Scale(outputMin, outputMax); - /** - * @private - * @type {Tone.Pow} - * @private - */ - this._exp = this.input = new Tone.Pow(Tone.defaultArg(exponent, 2)); - this._exp.connect(this._scale); - }; - Tone.extend(Tone.ScaleExp, Tone.SignalBase); - /** - * Instead of interpolating linearly between the <code>min</code> and - * <code>max</code> values, setting the exponent will interpolate between - * the two values with an exponential curve. - * @memberOf Tone.ScaleExp# - * @type {number} - * @name exponent - */ - Object.defineProperty(Tone.ScaleExp.prototype, 'exponent', { - get: function () { - return this._exp.value; - }, - set: function (exp) { - this._exp.value = exp; - } - }); - /** - * The minimum output value. This number is output when - * the value input value is 0. - * @memberOf Tone.ScaleExp# - * @type {number} - * @name min - */ - Object.defineProperty(Tone.ScaleExp.prototype, 'min', { - get: function () { - return this._scale.min; - }, - set: function (min) { - this._scale.min = min; - } - }); - /** - * The maximum output value. This number is output when - * the value input value is 1. - * @memberOf Tone.ScaleExp# - * @type {number} - * @name max - */ - Object.defineProperty(Tone.ScaleExp.prototype, 'max', { - get: function () { - return this._scale.max; - }, - set: function (max) { - this._scale.max = max; - } - }); - /** - * Clean up. - * @returns {Tone.ScaleExp} this - */ - Tone.ScaleExp.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._scale.dispose(); - this._scale = null; - this._exp.dispose(); - this._exp = null; - return this; - }; - return Tone.ScaleExp; - }); - Module(function (Tone) { - - /** - * @class Wrapper around Web Audio's native [DelayNode](http://webaudio.github.io/web-audio-api/#the-delaynode-interface). - * @extends {Tone} - * @param {Time=} delayTime The delay applied to the incoming signal. - * @param {Time=} maxDelay The maximum delay time. - */ - Tone.Delay = function () { - var options = Tone.defaults(arguments, [ - 'delayTime', - 'maxDelay' - ], Tone.Delay); - Tone.AudioNode.call(this); - /** - * The maximum delay time initialized with the node - * @type {Number} - * @private - */ - this._maxDelay = Math.max(this.toSeconds(options.maxDelay), this.toSeconds(options.delayTime)); - /** - * The native delay node - * @type {DelayNode} - * @private - */ - this._delayNode = this.input = this.output = this.context.createDelay(this._maxDelay); - /** - * The amount of time the incoming signal is - * delayed. - * @type {Time} - * @signal - */ - this.delayTime = new Tone.Param({ - 'param': this._delayNode.delayTime, - 'units': Tone.Type.Time, - 'value': options.delayTime - }); - this._readOnly('delayTime'); - }; - Tone.extend(Tone.Delay, Tone.AudioNode); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.Delay.defaults = { - 'maxDelay': 1, - 'delayTime': 0 - }; - /** - * The maximum delay time. This cannot be changed. The value is passed into the constructor. - * @memberof Tone.Delay# - * @type {Time} - * @name maxDelay - * @readOnly - */ - Object.defineProperty(Tone.Delay.prototype, 'maxDelay', { - get: function () { - return this._maxDelay; - } - }); - /** - * Clean up. - * @return {Tone.Delay} this - */ - Tone.Delay.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._delayNode.disconnect(); - this._delayNode = null; - this._writable('delayTime'); - this.delayTime = null; - return this; - }; - return Tone.Delay; - }); - Module(function (Tone) { - - /** - * @class Comb filters are basic building blocks for physical modeling. Read more - * about comb filters on [CCRMA's website](https://ccrma.stanford.edu/~jos/pasp/Feedback_Comb_Filters.html). - * - * @extends {Tone.AudioNode} - * @constructor - * @param {Time|Object} [delayTime] The delay time of the filter. - * @param {NormalRange=} resonance The amount of feedback the filter has. - */ - Tone.FeedbackCombFilter = function () { - var options = Tone.defaults(arguments, [ - 'delayTime', - 'resonance' - ], Tone.FeedbackCombFilter); - Tone.AudioNode.call(this); - /** - * the delay node - * @type {DelayNode} - * @private - */ - this._delay = this.input = this.output = new Tone.Delay(options.delayTime); - /** - * The amount of delay of the comb filter. - * @type {Time} - * @signal - */ - this.delayTime = this._delay.delayTime; - /** - * the feedback node - * @type {GainNode} - * @private - */ - this._feedback = new Tone.Gain(options.resonance, Tone.Type.NormalRange); - /** - * The amount of feedback of the delayed signal. - * @type {NormalRange} - * @signal - */ - this.resonance = this._feedback.gain; - this._delay.chain(this._feedback, this._delay); - this._readOnly([ - 'resonance', - 'delayTime' - ]); - }; - Tone.extend(Tone.FeedbackCombFilter, Tone.AudioNode); - /** - * the default parameters - * @static - * @const - * @type {Object} - */ - Tone.FeedbackCombFilter.defaults = { - 'delayTime': 0.1, - 'resonance': 0.5 - }; - /** - * clean up - * @returns {Tone.FeedbackCombFilter} this - */ - Tone.FeedbackCombFilter.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable([ - 'resonance', - 'delayTime' - ]); - this._delay.dispose(); - this._delay = null; - this.delayTime = null; - this._feedback.dispose(); - this._feedback = null; - this.resonance = null; - return this; - }; - return Tone.FeedbackCombFilter; - }); - Module(function (Tone) { - /** - * @class Get the current waveform data of the connected audio source. - * @extends {Tone.AudioNode} - * @param {Number=} size The size of the FFT. Value must be a power of - * two in the range 32 to 32768. - */ - Tone.FFT = function () { - var options = Tone.defaults(arguments, ['size'], Tone.FFT); - options.type = Tone.Analyser.Type.FFT; - Tone.AudioNode.call(this); - /** - * The analyser node. - * @private - * @type {Tone.Analyser} - */ - this._analyser = this.input = this.output = new Tone.Analyser(options); - }; - Tone.extend(Tone.FFT, Tone.AudioNode); - /** - * The default values. - * @type {Object} - * @const - */ - Tone.FFT.defaults = { 'size': 1024 }; - /** - * Gets the waveform of the audio source. Returns the waveform data - * of length [size](#size) as a Float32Array with values between -1 and 1. - * @returns {TypedArray} - */ - Tone.FFT.prototype.getValue = function () { - return this._analyser.getValue(); - }; - /** - * The size of analysis. This must be a power of two in the range 32 to 32768. - * @memberOf Tone.FFT# - * @type {Number} - * @name size - */ - Object.defineProperty(Tone.FFT.prototype, 'size', { - get: function () { - return this._analyser.size; - }, - set: function (size) { - this._analyser.size = size; - } - }); - /** - * Clean up. - * @return {Tone.FFT} this - */ - Tone.FFT.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._analyser.dispose(); - this._analyser = null; - }; - return Tone.FFT; - }); - Module(function (Tone) { - - /** - * @class Return the absolute value of an incoming signal. - * - * @constructor - * @extends {Tone.SignalBase} - * @example - * var signal = new Tone.Signal(-1); - * var abs = new Tone.Abs(); - * signal.connect(abs); - * //the output of abs is 1. - */ - Tone.Abs = function () { - Tone.SignalBase.call(this); - /** - * @type {Tone.LessThan} - * @private - */ - this._abs = this.input = this.output = new Tone.WaveShaper(function (val) { - if (Math.abs(val) < 0.001) { - return 0; - } else { - return Math.abs(val); - } - }, 1024); - }; - Tone.extend(Tone.Abs, Tone.SignalBase); - /** - * dispose method - * @returns {Tone.Abs} this - */ - Tone.Abs.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._abs.dispose(); - this._abs = null; - return this; - }; - return Tone.Abs; - }); - Module(function (Tone) { - - /** - * @class Tone.Follower is a crude envelope follower which will follow - * the amplitude of an incoming signal. - * Take care with small (< 0.02) attack or decay values - * as follower has some ripple which is exaggerated - * at these values. Read more about envelope followers (also known - * as envelope detectors) on [Wikipedia](https://en.wikipedia.org/wiki/Envelope_detector). - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Time|Object} [attack] The rate at which the follower rises. - * @param {Time=} release The rate at which the folower falls. - * @example - * var follower = new Tone.Follower(0.2, 0.4); - */ - Tone.Follower = function () { - var options = Tone.defaults(arguments, [ - 'attack', - 'release' - ], Tone.Follower); - Tone.AudioNode.call(this); - this.createInsOuts(1, 1); - /** - * @type {Tone.Abs} - * @private - */ - this._abs = new Tone.Abs(); - /** - * the lowpass filter which smooths the input - * @type {BiquadFilterNode} - * @private - */ - this._filter = this.context.createBiquadFilter(); - this._filter.type = 'lowpass'; - this._filter.frequency.value = 0; - this._filter.Q.value = -100; - /** - * @type {WaveShaperNode} - * @private - */ - this._frequencyValues = new Tone.WaveShaper(); - /** - * @type {Tone.Subtract} - * @private - */ - this._sub = new Tone.Subtract(); - /** - * @type {Tone.Delay} - * @private - */ - this._delay = new Tone.Delay(this.blockTime); - /** - * this keeps it far from 0, even for very small differences - * @type {Tone.Multiply} - * @private - */ - this._mult = new Tone.Multiply(10000); - /** - * @private - * @type {number} - */ - this._attack = options.attack; - /** - * @private - * @type {number} - */ - this._release = options.release; - //the smoothed signal to get the values - this.input.chain(this._abs, this._filter, this.output); - //the difference path - this._abs.connect(this._sub, 0, 1); - this._filter.chain(this._delay, this._sub); - //threshold the difference and use the thresh to set the frequency - this._sub.chain(this._mult, this._frequencyValues, this._filter.frequency); - //set the attack and release values in the table - this._setAttackRelease(this._attack, this._release); - }; - Tone.extend(Tone.Follower, Tone.AudioNode); - /** - * @static - * @type {Object} - */ - Tone.Follower.defaults = { - 'attack': 0.05, - 'release': 0.5 - }; - /** - * sets the attack and release times in the wave shaper - * @param {Time} attack - * @param {Time} release - * @private - */ - Tone.Follower.prototype._setAttackRelease = function (attack, release) { - var minTime = this.blockTime; - attack = Tone.Time(attack).toFrequency(); - release = Tone.Time(release).toFrequency(); - attack = Math.max(attack, minTime); - release = Math.max(release, minTime); - this._frequencyValues.setMap(function (val) { - if (val <= 0) { - return attack; - } else { - return release; - } - }); - }; - /** - * The attack time. - * @memberOf Tone.Follower# - * @type {Time} - * @name attack - */ - Object.defineProperty(Tone.Follower.prototype, 'attack', { - get: function () { - return this._attack; - }, - set: function (attack) { - this._attack = attack; - this._setAttackRelease(this._attack, this._release); - } - }); - /** - * The release time. - * @memberOf Tone.Follower# - * @type {Time} - * @name release - */ - Object.defineProperty(Tone.Follower.prototype, 'release', { - get: function () { - return this._release; - }, - set: function (release) { - this._release = release; - this._setAttackRelease(this._attack, this._release); - } - }); - /** - * Borrows the connect method from Signal so that the output can be used - * as a Tone.Signal control signal. - * @function - */ - Tone.Follower.prototype.connect = Tone.SignalBase.prototype.connect; - /** - * dispose - * @returns {Tone.Follower} this - */ - Tone.Follower.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._filter.disconnect(); - this._filter = null; - this._frequencyValues.disconnect(); - this._frequencyValues = null; - this._delay.dispose(); - this._delay = null; - this._sub.disconnect(); - this._sub = null; - this._abs.dispose(); - this._abs = null; - this._mult.dispose(); - this._mult = null; - this._curve = null; - return this; - }; - return Tone.Follower; - }); - Module(function (Tone) { - - /** - * @class Tone.ScaledEnvelop is an envelope which can be scaled - * to any range. It's useful for applying an envelope - * to a frequency or any other non-NormalRange signal - * parameter. - * - * @extends {Tone.Envelope} - * @constructor - * @param {Time|Object} [attack] the attack time in seconds - * @param {Time} [decay] the decay time in seconds - * @param {number} [sustain] a percentage (0-1) of the full amplitude - * @param {Time} [release] the release time in seconds - * @example - * var scaledEnv = new Tone.ScaledEnvelope({ - * "attack" : 0.2, - * "min" : 200, - * "max" : 2000 - * }); - * scaledEnv.connect(oscillator.frequency); - */ - Tone.ScaledEnvelope = function () { - //get all of the defaults - var options = Tone.defaults(arguments, [ - 'attack', - 'decay', - 'sustain', - 'release' - ], Tone.Envelope); - Tone.Envelope.call(this, options); - options = Tone.defaultArg(options, Tone.ScaledEnvelope.defaults); - /** - * scale the incoming signal by an exponent - * @type {Tone.Pow} - * @private - */ - this._exp = this.output = new Tone.Pow(options.exponent); - /** - * scale the signal to the desired range - * @type {Tone.Multiply} - * @private - */ - this._scale = this.output = new Tone.Scale(options.min, options.max); - this._sig.chain(this._exp, this._scale); - }; - Tone.extend(Tone.ScaledEnvelope, Tone.Envelope); - /** - * the default parameters - * @static - */ - Tone.ScaledEnvelope.defaults = { - 'min': 0, - 'max': 1, - 'exponent': 1 - }; - /** - * The envelope's min output value. This is the value which it - * starts at. - * @memberOf Tone.ScaledEnvelope# - * @type {number} - * @name min - */ - Object.defineProperty(Tone.ScaledEnvelope.prototype, 'min', { - get: function () { - return this._scale.min; - }, - set: function (min) { - this._scale.min = min; - } - }); - /** - * The envelope's max output value. In other words, the value - * at the peak of the attack portion of the envelope. - * @memberOf Tone.ScaledEnvelope# - * @type {number} - * @name max - */ - Object.defineProperty(Tone.ScaledEnvelope.prototype, 'max', { - get: function () { - return this._scale.max; - }, - set: function (max) { - this._scale.max = max; - } - }); - /** - * The envelope's exponent value. - * @memberOf Tone.ScaledEnvelope# - * @type {number} - * @name exponent - */ - Object.defineProperty(Tone.ScaledEnvelope.prototype, 'exponent', { - get: function () { - return this._exp.value; - }, - set: function (exp) { - this._exp.value = exp; - } - }); - /** - * clean up - * @returns {Tone.ScaledEnvelope} this - */ - Tone.ScaledEnvelope.prototype.dispose = function () { - Tone.Envelope.prototype.dispose.call(this); - this._scale.dispose(); - this._scale = null; - this._exp.dispose(); - this._exp = null; - return this; - }; - return Tone.ScaledEnvelope; - }); - Module(function (Tone) { - - /** - * @class Tone.FrequencyEnvelope is a Tone.ScaledEnvelope, but instead of `min` and `max` - * it's got a `baseFrequency` and `octaves` parameter. - * - * @extends {Tone.Envelope} - * @constructor - * @param {Time|Object} [attack] the attack time in seconds - * @param {Time} [decay] the decay time in seconds - * @param {number} [sustain] a percentage (0-1) of the full amplitude - * @param {Time} [release] the release time in seconds - * @example - * var freqEnv = new Tone.FrequencyEnvelope({ - * "attack" : 0.2, - * "baseFrequency" : "C2", - * "octaves" : 4 - * }); - * freqEnv.connect(oscillator.frequency); - */ - Tone.FrequencyEnvelope = function () { - var options = Tone.defaults(arguments, [ - 'attack', - 'decay', - 'sustain', - 'release' - ], Tone.Envelope); - Tone.ScaledEnvelope.call(this, options); - //merge it with the frequency envelope defaults - options = Tone.defaultArg(options, Tone.FrequencyEnvelope.defaults); - /** - * Stores the octave value - * @type {Positive} - * @private - */ - this._octaves = options.octaves; - //setup - this.baseFrequency = options.baseFrequency; - this.octaves = options.octaves; - }; - Tone.extend(Tone.FrequencyEnvelope, Tone.Envelope); - /** - * the default parameters - * @static - */ - Tone.FrequencyEnvelope.defaults = { - 'baseFrequency': 200, - 'octaves': 4, - 'exponent': 2 - }; - /** - * The envelope's mininum output value. This is the value which it - * starts at. - * @memberOf Tone.FrequencyEnvelope# - * @type {Frequency} - * @name baseFrequency - */ - Object.defineProperty(Tone.FrequencyEnvelope.prototype, 'baseFrequency', { - get: function () { - return this._scale.min; - }, - set: function (min) { - this._scale.min = this.toFrequency(min); - //also update the octaves - this.octaves = this._octaves; - } - }); - /** - * The number of octaves above the baseFrequency that the - * envelope will scale to. - * @memberOf Tone.FrequencyEnvelope# - * @type {Positive} - * @name octaves - */ - Object.defineProperty(Tone.FrequencyEnvelope.prototype, 'octaves', { - get: function () { - return this._octaves; - }, - set: function (octaves) { - this._octaves = octaves; - this._scale.max = this.baseFrequency * Math.pow(2, octaves); - } - }); - /** - * The envelope's exponent value. - * @memberOf Tone.FrequencyEnvelope# - * @type {number} - * @name exponent - */ - Object.defineProperty(Tone.FrequencyEnvelope.prototype, 'exponent', { - get: function () { - return this._exp.value; - }, - set: function (exp) { - this._exp.value = exp; - } - }); - /** - * clean up - * @returns {Tone.FrequencyEnvelope} this - */ - Tone.FrequencyEnvelope.prototype.dispose = function () { - Tone.ScaledEnvelope.prototype.dispose.call(this); - return this; - }; - return Tone.FrequencyEnvelope; - }); - Module(function (Tone) { - - /** - * @class GreaterThanZero outputs 1 when the input is strictly greater than zero - * - * @constructor - * @extends {Tone.SignalBase} - * @example - * var gt0 = new Tone.GreaterThanZero(); - * var sig = new Tone.Signal(0.01).connect(gt0); - * //the output of gt0 is 1. - * sig.value = 0; - * //the output of gt0 is 0. - */ - Tone.GreaterThanZero = function () { - Tone.SignalBase.call(this); - /** - * @type {Tone.WaveShaper} - * @private - */ - this._thresh = this.output = new Tone.WaveShaper(function (val) { - if (val <= 0) { - return 0; - } else { - return 1; - } - }, 127); - /** - * scale the first thresholded signal by a large value. - * this will help with values which are very close to 0 - * @type {Tone.Multiply} - * @private - */ - this._scale = this.input = new Tone.Multiply(10000); - //connections - this._scale.connect(this._thresh); - }; - Tone.extend(Tone.GreaterThanZero, Tone.SignalBase); - /** - * dispose method - * @returns {Tone.GreaterThanZero} this - */ - Tone.GreaterThanZero.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._scale.dispose(); - this._scale = null; - this._thresh.dispose(); - this._thresh = null; - return this; - }; - return Tone.GreaterThanZero; - }); - Module(function (Tone) { - - /** - * @class Output 1 if the signal is greater than the value, otherwise outputs 0. - * can compare two signals or a signal and a number. - * - * @constructor - * @extends {Tone.Signal} - * @param {number} [value=0] the value to compare to the incoming signal - * @example - * var gt = new Tone.GreaterThan(2); - * var sig = new Tone.Signal(4).connect(gt); - * //output of gt is equal 1. - */ - Tone.GreaterThan = function (value) { - Tone.Signal.call(this); - this.createInsOuts(2, 0); - /** - * subtract the amount from the incoming signal - * @type {Tone.Subtract} - * @private - */ - this._param = this.input[0] = new Tone.Subtract(value); - this.input[1] = this._param.input[1]; - /** - * compare that amount to zero - * @type {Tone.GreaterThanZero} - * @private - */ - this._gtz = this.output = new Tone.GreaterThanZero(); - //connect - this._param.connect(this._gtz); - }; - Tone.extend(Tone.GreaterThan, Tone.Signal); - /** - * dispose method - * @returns {Tone.GreaterThan} this - */ - Tone.GreaterThan.prototype.dispose = function () { - Tone.Signal.prototype.dispose.call(this); - this._gtz.dispose(); - this._gtz = null; - return this; - }; - return Tone.GreaterThan; - }); - Module(function (Tone) { - - /** - * @class Tone.Gate only passes a signal through when the incoming - * signal exceeds a specified threshold. To do this, Gate uses - * a Tone.Follower to follow the amplitude of the incoming signal. - * A common implementation of this class is a [Noise Gate](https://en.wikipedia.org/wiki/Noise_gate). - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Decibels|Object} [threshold] The threshold above which the gate will open. - * @param {Time=} attack The follower's attack time - * @param {Time=} release The follower's release time - * @example - * var gate = new Tone.Gate(-30, 0.2, 0.3).toMaster(); - * var mic = new Tone.UserMedia().connect(gate); - * //the gate will only pass through the incoming - * //signal when it's louder than -30db - */ - Tone.Gate = function () { - var options = Tone.defaults(arguments, [ - 'threshold', - 'attack', - 'release' - ], Tone.Gate); - Tone.AudioNode.call(this); - this.createInsOuts(1, 1); - /** - * @type {Tone.Follower} - * @private - */ - this._follower = new Tone.Follower(options.attack, options.release); - /** - * @type {Tone.GreaterThan} - * @private - */ - this._gt = new Tone.GreaterThan(Tone.dbToGain(options.threshold)); - //the connections - this.input.connect(this.output); - //the control signal - this.input.chain(this._gt, this._follower, this.output.gain); - }; - Tone.extend(Tone.Gate, Tone.AudioNode); - /** - * @const - * @static - * @type {Object} - */ - Tone.Gate.defaults = { - 'attack': 0.1, - 'release': 0.1, - 'threshold': -40 - }; - /** - * The threshold of the gate in decibels - * @memberOf Tone.Gate# - * @type {Decibels} - * @name threshold - */ - Object.defineProperty(Tone.Gate.prototype, 'threshold', { - get: function () { - return Tone.gainToDb(this._gt.value); - }, - set: function (thresh) { - this._gt.value = Tone.dbToGain(thresh); - } - }); - /** - * The attack speed of the gate - * @memberOf Tone.Gate# - * @type {Time} - * @name attack - */ - Object.defineProperty(Tone.Gate.prototype, 'attack', { - get: function () { - return this._follower.attack; - }, - set: function (attackTime) { - this._follower.attack = attackTime; - } - }); - /** - * The release speed of the gate - * @memberOf Tone.Gate# - * @type {Time} - * @name release - */ - Object.defineProperty(Tone.Gate.prototype, 'release', { - get: function () { - return this._follower.release; - }, - set: function (releaseTime) { - this._follower.release = releaseTime; - } - }); - /** - * Clean up. - * @returns {Tone.Gate} this - */ - Tone.Gate.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._follower.dispose(); - this._gt.dispose(); - this._follower = null; - this._gt = null; - return this; - }; - return Tone.Gate; - }); - Module(function (Tone) { - /** - * @class Tone.TickSignal extends Tone.Signal, but adds the capability - * to calculate the number of elapsed ticks. exponential and target curves - * are approximated with multiple linear ramps. - * - * Thank you Bruno Dias, H. Sofia Pinto, and David M. Matos, for your [WAC paper](https://smartech.gatech.edu/bitstream/handle/1853/54588/WAC2016-49.pdf) - * describing integrating timing functions for tempo calculations. - * - * @param {Number} value The initial value of the signal - * @extends {Tone.Signal} - */ - Tone.TickSignal = function (value) { - value = Tone.defaultArg(value, 1); - Tone.Signal.call(this, { - 'units': Tone.Type.Ticks, - 'value': value - }); - //extend the memory - this._events.memory = Infinity; - //clear the clock from the beginning - this.cancelScheduledValues(0); - //set an initial event - this._events.add({ - 'type': Tone.Param.AutomationType.SetValue, - 'time': 0, - 'value': value - }); - }; - Tone.extend(Tone.TickSignal, Tone.Signal); - /** - * Wraps Tone.Signal methods so that they also - * record the ticks. - * @param {Function} method - * @return {Function} - * @private - */ - function _wrapScheduleMethods(method) { - return function (value, time) { - time = this.toSeconds(time); - method.apply(this, arguments); - var event = this._events.get(time); - var previousEvent = this._events.previousEvent(event); - var ticksUntilTime = this._getTicksUntilEvent(previousEvent, time); - event.ticks = Math.max(ticksUntilTime, 0); - return this; - }; - } - Tone.TickSignal.prototype.setValueAtTime = _wrapScheduleMethods(Tone.Signal.prototype.setValueAtTime); - Tone.TickSignal.prototype.linearRampToValueAtTime = _wrapScheduleMethods(Tone.Signal.prototype.linearRampToValueAtTime); - /** - * Start exponentially approaching the target value at the given time with - * a rate having the given time constant. - * @param {number} value - * @param {Time} startTime - * @param {number} timeConstant - * @returns {Tone.TickSignal} this - */ - Tone.TickSignal.prototype.setTargetAtTime = function (value, time, constant) { - //aproximate it with multiple linear ramps - time = this.toSeconds(time); - this.setRampPoint(time); - value = this._fromUnits(value); - //start from previously scheduled value - var prevEvent = this._events.get(time); - var segments = Math.round(Math.max(1 / constant, 1)); - for (var i = 0; i <= segments; i++) { - var segTime = constant * i + time; - var rampVal = this._exponentialApproach(prevEvent.time, prevEvent.value, value, constant, segTime); - this.linearRampToValueAtTime(this._toUnits(rampVal), segTime); - } - return this; - }; - /** - * Schedules an exponential continuous change in parameter value from - * the previous scheduled parameter value to the given value. - * @param {number} value - * @param {Time} endTime - * @returns {Tone.TickSignal} this - */ - Tone.TickSignal.prototype.exponentialRampToValueAtTime = function (value, time) { - //aproximate it with multiple linear ramps - time = this.toSeconds(time); - value = this._fromUnits(value); - //start from previously scheduled value - var prevEvent = this._events.get(time); - if (prevEvent === null) { - prevEvent = { - 'value': this._initialValue, - 'time': 0 - }; - } - //approx 10 segments per second - var segments = Math.round(Math.max((time - prevEvent.time) * 10, 1)); - var segmentDur = (time - prevEvent.time) / segments; - for (var i = 0; i <= segments; i++) { - var segTime = segmentDur * i + prevEvent.time; - var rampVal = this._exponentialInterpolate(prevEvent.time, prevEvent.value, time, value, segTime); - this.linearRampToValueAtTime(this._toUnits(rampVal), segTime); - } - return this; - }; - /** - * Returns the tick value at the time. Takes into account - * any automation curves scheduled on the signal. - * @private - * @param {Time} time The time to get the tick count at - * @return {Ticks} The number of ticks which have elapsed at the time - * given any automations. - */ - Tone.TickSignal.prototype._getTicksUntilEvent = function (event, time) { - if (event === null) { - event = { - 'ticks': 0, - 'time': 0 - }; - } else if (Tone.isUndef(event.ticks)) { - var previousEvent = this._events.previousEvent(event); - event.ticks = this._getTicksUntilEvent(previousEvent, event.time); - } - var val0 = this.getValueAtTime(event.time); - var val1 = this.getValueAtTime(time); - //if it's right on the line, take the previous value - if (this._events.get(time).time === time && this._events.get(time).type === Tone.Param.AutomationType.SetValue) { - val1 = this.getValueAtTime(time - this.sampleTime); - } - return 0.5 * (time - event.time) * (val0 + val1) + event.ticks; - }; - /** - * Returns the tick value at the time. Takes into account - * any automation curves scheduled on the signal. - * @param {Time} time The time to get the tick count at - * @return {Ticks} The number of ticks which have elapsed at the time - * given any automations. - */ - Tone.TickSignal.prototype.getTicksAtTime = function (time) { - time = this.toSeconds(time); - var event = this._events.get(time); - return Math.max(this._getTicksUntilEvent(event, time), 0); - }; - /** - * Return the elapsed time of the number of ticks from the given time - * @param {Ticks} ticks The number of ticks to calculate - * @param {Time} time The time to get the next tick from - * @return {Seconds} The duration of the number of ticks from the given time in seconds - */ - Tone.TickSignal.prototype.getDurationOfTicks = function (ticks, time) { - time = this.toSeconds(time); - var currentTick = this.getTicksAtTime(time); - return this.getTimeOfTick(currentTick + ticks) - time; - }; - /** - * Given a tick, returns the time that tick occurs at. - * @param {Ticks} tick - * @return {Time} The time that the tick occurs. - */ - Tone.TickSignal.prototype.getTimeOfTick = function (tick) { - var before = this._events.get(tick, 'ticks'); - var after = this._events.getAfter(tick, 'ticks'); - if (before && before.ticks === tick) { - return before.time; - } else if (before && after && after.type === Tone.Param.AutomationType.Linear && before.value !== after.value) { - var val0 = this.getValueAtTime(before.time); - var val1 = this.getValueAtTime(after.time); - var delta = (val1 - val0) / (after.time - before.time); - var k = Math.sqrt(Math.pow(val0, 2) - 2 * delta * (before.ticks - tick)); - var sol1 = (-val0 + k) / delta; - var sol2 = (-val0 - k) / delta; - return (sol1 > 0 ? sol1 : sol2) + before.time; - } else if (before) { - if (before.value === 0) { - return Infinity; - } else { - return before.time + (tick - before.ticks) / before.value; - } - } else { - return tick / this._initialValue; - } - }; - /** - * Convert some number of ticks their the duration in seconds accounting - * for any automation curves starting at the given time. - * @param {Ticks} ticks The number of ticks to convert to seconds. - * @param {Time} [when=now] When along the automation timeline to convert the ticks. - * @return {Tone.Time} The duration in seconds of the ticks. - */ - Tone.TickSignal.prototype.ticksToTime = function (ticks, when) { - when = this.toSeconds(when); - return new Tone.Time(this.getDurationOfTicks(ticks, when)); - }; - /** - * The inverse of [ticksToTime](#tickstotime). Convert a duration in - * seconds to the corresponding number of ticks accounting for any - * automation curves starting at the given time. - * @param {Time} duration The time interval to convert to ticks. - * @param {Time} [when=now] When along the automation timeline to convert the ticks. - * @return {Tone.Ticks} The duration in ticks. - */ - Tone.TickSignal.prototype.timeToTicks = function (duration, when) { - when = this.toSeconds(when); - duration = this.toSeconds(duration); - var startTicks = this.getTicksAtTime(when); - var endTicks = this.getTicksAtTime(when + duration); - return new Tone.Ticks(endTicks - startTicks); - }; - return Tone.TickSignal; - }); - Module(function (Tone) { - - /** - * @class A Timeline State. Provides the methods: <code>setStateAtTime("state", time)</code> - * and <code>getValueAtTime(time)</code>. - * - * @extends {Tone.Timeline} - * @param {String} initial The initial state of the TimelineState. - * Defaults to <code>undefined</code> - */ - Tone.TimelineState = function (initial) { - Tone.Timeline.call(this); - /** - * The initial state - * @private - * @type {String} - */ - this._initial = initial; - }; - Tone.extend(Tone.TimelineState, Tone.Timeline); - /** - * Returns the scheduled state scheduled before or at - * the given time. - * @param {Number} time The time to query. - * @return {String} The name of the state input in setStateAtTime. - */ - Tone.TimelineState.prototype.getValueAtTime = function (time) { - var event = this.get(time); - if (event !== null) { - return event.state; - } else { - return this._initial; - } - }; - /** - * Add a state to the timeline. - * @param {String} state The name of the state to set. - * @param {Number} time The time to query. - * @returns {Tone.TimelineState} this - */ - Tone.TimelineState.prototype.setStateAtTime = function (state, time) { - //all state changes need to be >= the previous state time - //TODO throw error if time < the previous event time - this.add({ - 'state': state, - 'time': time - }); - return this; - }; - /** - * Return the event before the time with the given state - * @param {Tone.State} state The state to look for - * @param {Time} time When to check before - * @return {Object} The event with the given state before the time - */ - Tone.TimelineState.prototype.getLastState = function (state, time) { - time = this.toSeconds(time); - var index = this._search(time); - for (var i = index; i >= 0; i--) { - var event = this._timeline[i]; - if (event.state === state) { - return event; - } - } - }; - /** - * Return the event after the time with the given state - * @param {Tone.State} state The state to look for - * @param {Time} time When to check from - * @return {Object} The event with the given state after the time - */ - Tone.TimelineState.prototype.getNextState = function (state, time) { - time = this.toSeconds(time); - var index = this._search(time); - if (index !== -1) { - for (var i = index; i < this._timeline.length; i++) { - var event = this._timeline[i]; - if (event.state === state) { - return event; - } - } - } - }; - return Tone.TimelineState; - }); - Module(function (Tone) { - - /** - * @class Uses [Tone.TickSignal](TickSignal) to track elapsed ticks with - * complex automation curves. - * - * @constructor - * @param {Frequency} frequency The initial frequency that the signal ticks at - * @extends {Tone} - */ - Tone.TickSource = function () { - var options = Tone.defaults(arguments, ['frequency'], Tone.TickSource); - /** - * The frequency the callback function should be invoked. - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.TickSignal(options.frequency, Tone.Type.Frequency); - this._readOnly('frequency'); - /** - * The state timeline - * @type {Tone.TimelineState} - * @private - */ - this._state = new Tone.TimelineState(Tone.State.Stopped); - this._state.setStateAtTime(Tone.State.Stopped, 0); - /** - * The offset values of the ticks - * @type {Tone.Timeline} - * @private - */ - this._tickOffset = new Tone.Timeline(); - //add the first event - this.setTicksAtTime(0, 0); - }; - Tone.extend(Tone.TickSource); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.TickSource.defaults = { 'frequency': 1 }; - /** - * Returns the playback state of the source, either "started", "stopped" or "paused". - * @type {Tone.State} - * @readOnly - * @memberOf Tone.TickSource# - * @name state - */ - Object.defineProperty(Tone.TickSource.prototype, 'state', { - get: function () { - return this._state.getValueAtTime(this.now()); - } - }); - /** - * Start the clock at the given time. Optionally pass in an offset - * of where to start the tick counter from. - * @param {Time=} time The time the clock should start - * @param {Ticks=0} offset The number of ticks to start the source at - * @return {Tone.TickSource} this - */ - Tone.TickSource.prototype.start = function (time, offset) { - time = this.toSeconds(time); - if (this._state.getValueAtTime(time) !== Tone.State.Started) { - this._state.setStateAtTime(Tone.State.Started, time); - if (Tone.isDefined(offset)) { - this.setTicksAtTime(offset, time); - } - } - return this; - }; - /** - * Stop the clock. Stopping the clock resets the tick counter to 0. - * @param {Time} [time=now] The time when the clock should stop. - * @returns {Tone.TickSource} this - * @example - * clock.stop(); - */ - Tone.TickSource.prototype.stop = function (time) { - time = this.toSeconds(time); - //cancel the previous stop - if (this._state.getValueAtTime(time) === Tone.State.Stopped) { - var event = this._state.get(time); - if (event.time > 0) { - this._tickOffset.cancel(event.time); - this._state.cancel(event.time); - } - } - this._state.cancel(time); - this._state.setStateAtTime(Tone.State.Stopped, time); - this.setTicksAtTime(0, time); - return this; - }; - /** - * Pause the clock. Pausing does not reset the tick counter. - * @param {Time} [time=now] The time when the clock should stop. - * @returns {Tone.TickSource} this - */ - Tone.TickSource.prototype.pause = function (time) { - time = this.toSeconds(time); - if (this._state.getValueAtTime(time) === Tone.State.Started) { - this._state.setStateAtTime(Tone.State.Paused, time); - } - return this; - }; - /** - * Cancel start/stop/pause and setTickAtTime events scheduled after the given time. - * @param {Time} [time=now] When to clear the events after - * @returns {Tone.TickSource} this - */ - Tone.TickSource.prototype.cancel = function (time) { - time = this.toSeconds(time); - this._state.cancel(time); - this._tickOffset.cancel(time); - return this; - }; - /** - * Get the elapsed ticks at the given time - * @param {Time} time When to get the tick value - * @return {Ticks} The number of ticks - */ - Tone.TickSource.prototype.getTicksAtTime = function (time) { - time = this.toSeconds(time); - var stopEvent = this._state.getLastState(Tone.State.Stopped, time); - //this event allows forEachBetween to iterate until the current time - var tmpEvent = { - state: Tone.State.Paused, - time: time - }; - this._state.add(tmpEvent); - //keep track of the previous offset event - var lastState = stopEvent; - var elapsedTicks = 0; - //iterate through all the events since the last stop - this._state.forEachBetween(stopEvent.time, time + this.sampleTime, function (e) { - var periodStartTime = lastState.time; - //if there is an offset event in this period use that - var offsetEvent = this._tickOffset.get(e.time); - if (offsetEvent.time >= lastState.time) { - elapsedTicks = offsetEvent.ticks; - periodStartTime = offsetEvent.time; - } - if (lastState.state === Tone.State.Started && e.state !== Tone.State.Started) { - elapsedTicks += this.frequency.getTicksAtTime(e.time) - this.frequency.getTicksAtTime(periodStartTime); - } - lastState = e; - }.bind(this)); - //remove the temporary event - this._state.remove(tmpEvent); - //return the ticks - return elapsedTicks; - }; - /** - * The number of times the callback was invoked. Starts counting at 0 - * and increments after the callback was invoked. Returns -1 when stopped. - * @memberOf Tone.TickSource# - * @name ticks - * @type {Ticks} - */ - Object.defineProperty(Tone.TickSource.prototype, 'ticks', { - get: function () { - return this.getTicksAtTime(this.now()); - }, - set: function (t) { - this.setTicksAtTime(t, this.now()); - } - }); - /** - * The time since ticks=0 that the TickSource has been running. Accounts - * for tempo curves - * @memberOf Tone.TickSource# - * @name seconds - * @type {Seconds} - */ - Object.defineProperty(Tone.TickSource.prototype, 'seconds', { - get: function () { - return this.getSecondsAtTime(this.now()); - }, - set: function (s) { - var now = this.now(); - var ticks = this.frequency.timeToTicks(s, now); - this.setTicksAtTime(ticks, now); - } - }); - /** - * Return the elapsed seconds at the given time. - * @param {Time} time When to get the elapsed seconds - * @return {Seconds} The number of elapsed seconds - */ - Tone.TickSource.prototype.getSecondsAtTime = function (time) { - time = this.toSeconds(time); - var stopEvent = this._state.getLastState(Tone.State.Stopped, time); - //this event allows forEachBetween to iterate until the current time - var tmpEvent = { - state: Tone.State.Paused, - time: time - }; - this._state.add(tmpEvent); - //keep track of the previous offset event - var lastState = stopEvent; - var elapsedSeconds = 0; - //iterate through all the events since the last stop - this._state.forEachBetween(stopEvent.time, time + this.sampleTime, function (e) { - var periodStartTime = lastState.time; - //if there is an offset event in this period use that - var offsetEvent = this._tickOffset.get(e.time); - if (offsetEvent.time >= lastState.time) { - elapsedSeconds = offsetEvent.seconds; - periodStartTime = offsetEvent.time; - } - if (lastState.state === Tone.State.Started && e.state !== Tone.State.Started) { - elapsedSeconds += e.time - periodStartTime; - } - lastState = e; - }.bind(this)); - //remove the temporary event - this._state.remove(tmpEvent); - //return the ticks - return elapsedSeconds; - }; - /** - * Set the clock's ticks at the given time. - * @param {Ticks} ticks The tick value to set - * @param {Time} time When to set the tick value - * @return {Tone.TickSource} this - */ - Tone.TickSource.prototype.setTicksAtTime = function (ticks, time) { - time = this.toSeconds(time); - this._tickOffset.cancel(time); - this._tickOffset.add({ - 'time': time, - 'ticks': ticks, - 'seconds': this.frequency.getDurationOfTicks(ticks, time) - }); - return this; - }; - /** - * Returns the scheduled state at the given time. - * @param {Time} time The time to query. - * @return {String} The name of the state input in setStateAtTime. - * @example - * source.start("+0.1"); - * source.getStateAtTime("+0.1"); //returns "started" - */ - Tone.TickSource.prototype.getStateAtTime = function (time) { - time = this.toSeconds(time); - return this._state.getValueAtTime(time); - }; - /** - * Get the time of the given tick. The second argument - * is when to test before. Since ticks can be set (with setTicksAtTime) - * there may be multiple times for a given tick value. - * @param {Ticks} ticks The tick number. - * @param {Time=} before When to measure the tick value from. - * @return {Time} The time of the tick - */ - Tone.TickSource.prototype.getTimeOfTick = function (tick, before) { - before = Tone.defaultArg(before, this.now()); - var offset = this._tickOffset.get(before); - var event = this._state.get(before); - var startTime = Math.max(offset.time, event.time); - var absoluteTicks = this.frequency.getTicksAtTime(startTime) + tick - offset.ticks; - return this.frequency.getTimeOfTick(absoluteTicks); - }; - /** - * Invoke the callback event at all scheduled ticks between the - * start time and the end time - * @param {Time} startTime The beginning of the search range - * @param {Time} endTime The end of the search range - * @param {Function<Time,Ticks>} callback The callback to invoke with each tick - * @return {Tone.TickSource} this - */ - Tone.TickSource.prototype.forEachTickBetween = function (startTime, endTime, callback) { - //only iterate through the sections where it is "started" - var lastStateEvent = this._state.get(startTime); - this._state.forEachBetween(startTime, endTime, function (event) { - if (lastStateEvent.state === Tone.State.Started && event.state !== Tone.State.Started) { - this.forEachTickBetween(Math.max(lastStateEvent.time, startTime), event.time - this.sampleTime, callback); - } - lastStateEvent = event; - }.bind(this)); - startTime = Math.max(lastStateEvent.time, startTime); - if (lastStateEvent.state === Tone.State.Started && this._state) { - //figure out the difference between the frequency ticks and the - var startTicks = this.frequency.getTicksAtTime(startTime); - var ticksAtStart = this.frequency.getTicksAtTime(lastStateEvent.time); - var diff = startTicks - ticksAtStart; - var offset = diff % 1; - if (offset !== 0) { - offset = 1 - offset; - } - var nextTickTime = this.frequency.getTimeOfTick(startTicks + offset); - var error = null; - while (nextTickTime < endTime && this._state) { - try { - callback(nextTickTime, Math.round(this.getTicksAtTime(nextTickTime))); - } catch (e) { - error = e; - break; - } - if (this._state) { - nextTickTime += this.frequency.getDurationOfTicks(1, nextTickTime); - } - } - } - if (error) { - throw error; - } - return this; - }; - /** - * Clean up - * @returns {Tone.TickSource} this - */ - Tone.TickSource.prototype.dispose = function () { - Tone.Param.prototype.dispose.call(this); - this._state.dispose(); - this._state = null; - this._tickOffset.dispose(); - this._tickOffset = null; - this._writable('frequency'); - this.frequency.dispose(); - this.frequency = null; - return this; - }; - return Tone.TickSource; - }); - Module(function (Tone) { - - /** - * @class A sample accurate clock which provides a callback at the given rate. - * While the callback is not sample-accurate (it is still susceptible to - * loose JS timing), the time passed in as the argument to the callback - * is precise. For most applications, it is better to use Tone.Transport - * instead of the Clock by itself since you can synchronize multiple callbacks. - * - * @constructor - * @extends {Tone.Emitter} - * @param {function} callback The callback to be invoked with the time of the audio event - * @param {Frequency} frequency The rate of the callback - * @example - * //the callback will be invoked approximately once a second - * //and will print the time exactly once a second apart. - * var clock = new Tone.Clock(function(time){ - * console.log(time); - * }, 1); - */ - Tone.Clock = function () { - var options = Tone.defaults(arguments, [ - 'callback', - 'frequency' - ], Tone.Clock); - Tone.Emitter.call(this); - /** - * The callback function to invoke at the scheduled tick. - * @type {Function} - */ - this.callback = options.callback; - /** - * The next time the callback is scheduled. - * @type {Number} - * @private - */ - this._nextTick = 0; - /** - * The tick counter - * @type {Tone.TickSource} - * @private - */ - this._tickSource = new Tone.TickSource(options.frequency); - /** - * The last time the loop callback was invoked - * @private - * @type {Number} - */ - this._lastUpdate = 0; - /** - * The rate the callback function should be invoked. - * @type {BPM} - * @signal - */ - this.frequency = this._tickSource.frequency; - this._readOnly('frequency'); - /** - * The state timeline - * @type {Tone.TimelineState} - * @private - */ - this._state = new Tone.TimelineState(Tone.State.Stopped); - //add an initial state - this._state.setStateAtTime(Tone.State.Stopped, 0); - /** - * The loop function bound to its context. - * This is necessary to remove the event in the end. - * @type {Function} - * @private - */ - this._boundLoop = this._loop.bind(this); - //bind a callback to the worker thread - this.context.on('tick', this._boundLoop); - }; - Tone.extend(Tone.Clock, Tone.Emitter); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.Clock.defaults = { - 'callback': Tone.noOp, - 'frequency': 1 - }; - /** - * Returns the playback state of the source, either "started", "stopped" or "paused". - * @type {Tone.State} - * @readOnly - * @memberOf Tone.Clock# - * @name state - */ - Object.defineProperty(Tone.Clock.prototype, 'state', { - get: function () { - return this._state.getValueAtTime(this.now()); - } - }); - /** - * Start the clock at the given time. Optionally pass in an offset - * of where to start the tick counter from. - * @param {Time=} time The time the clock should start - * @param {Ticks=} offset Where the tick counter starts counting from. - * @return {Tone.Clock} this - */ - Tone.Clock.prototype.start = function (time, offset) { - time = this.toSeconds(time); - if (this._state.getValueAtTime(time) !== Tone.State.Started) { - this._state.setStateAtTime(Tone.State.Started, time); - this._tickSource.start(time, offset); - if (time < this._lastUpdate) { - this.emit('start', time, offset); - } - } - return this; - }; - /** - * Stop the clock. Stopping the clock resets the tick counter to 0. - * @param {Time} [time=now] The time when the clock should stop. - * @returns {Tone.Clock} this - * @example - * clock.stop(); - */ - Tone.Clock.prototype.stop = function (time) { - time = this.toSeconds(time); - this._state.cancel(time); - this._state.setStateAtTime(Tone.State.Stopped, time); - this._tickSource.stop(time); - if (time < this._lastUpdate) { - this.emit('stop', time); - } - return this; - }; - /** - * Pause the clock. Pausing does not reset the tick counter. - * @param {Time} [time=now] The time when the clock should stop. - * @returns {Tone.Clock} this - */ - Tone.Clock.prototype.pause = function (time) { - time = this.toSeconds(time); - if (this._state.getValueAtTime(time) === Tone.State.Started) { - this._state.setStateAtTime(Tone.State.Paused, time); - this._tickSource.pause(time); - if (time < this._lastUpdate) { - this.emit('pause', time); - } - } - return this; - }; - /** - * The number of times the callback was invoked. Starts counting at 0 - * and increments after the callback was invoked. - * @type {Ticks} - */ - Object.defineProperty(Tone.Clock.prototype, 'ticks', { - get: function () { - return Math.ceil(this.getTicksAtTime(this.now())); - }, - set: function (t) { - this._tickSource.ticks = t; - } - }); - /** - * The time since ticks=0 that the Clock has been running. Accounts - * for tempo curves - * @type {Seconds} - */ - Object.defineProperty(Tone.Clock.prototype, 'seconds', { - get: function () { - return this._tickSource.seconds; - }, - set: function (s) { - this._tickSource.seconds = s; - } - }); - /** - * Return the elapsed seconds at the given time. - * @param {Time} time When to get the elapsed seconds - * @return {Seconds} The number of elapsed seconds - */ - Tone.Clock.prototype.getSecondsAtTime = function (time) { - return this._tickSource.getSecondsAtTime(time); - }; - /** - * Set the clock's ticks at the given time. - * @param {Ticks} ticks The tick value to set - * @param {Time} time When to set the tick value - * @return {Tone.Clock} this - */ - Tone.Clock.prototype.setTicksAtTime = function (ticks, time) { - this._tickSource.setTicksAtTime(ticks, time); - return this; - }; - /** - * Get the clock's ticks at the given time. - * @param {Time} time When to get the tick value - * @return {Ticks} The tick value at the given time. - */ - Tone.Clock.prototype.getTicksAtTime = function (time) { - return this._tickSource.getTicksAtTime(time); - }; - /** - * Get the time of the next tick - * @param {Ticks} ticks The tick number. - * @param {Time} before - * @return {Tone.Clock} this - */ - Tone.Clock.prototype.nextTickTime = function (offset, when) { - when = this.toSeconds(when); - var currentTick = this.getTicksAtTime(when); - return this._tickSource.getTimeOfTick(currentTick + offset, when); - }; - /** - * The scheduling loop. - * @private - */ - Tone.Clock.prototype._loop = function () { - var startTime = this._lastUpdate; - var endTime = this.now(); - this._lastUpdate = endTime; - if (startTime !== endTime) { - //the state change events - this._state.forEachBetween(startTime, endTime, function (e) { - switch (e.state) { - case Tone.State.Started: - var offset = this._tickSource.getTicksAtTime(e.time); - this.emit('start', e.time, offset); - break; - case Tone.State.Stopped: - if (e.time !== 0) { - this.emit('stop', e.time); - } - break; - case Tone.State.Paused: - this.emit('pause', e.time); - break; - } - }.bind(this)); - //the tick callbacks - this._tickSource.forEachTickBetween(startTime, endTime, function (time, ticks) { - this.callback(time, ticks); - }.bind(this)); - } - }; - /** - * Returns the scheduled state at the given time. - * @param {Time} time The time to query. - * @return {String} The name of the state input in setStateAtTime. - * @example - * clock.start("+0.1"); - * clock.getStateAtTime("+0.1"); //returns "started" - */ - Tone.Clock.prototype.getStateAtTime = function (time) { - time = this.toSeconds(time); - return this._state.getValueAtTime(time); - }; - /** - * Clean up - * @returns {Tone.Clock} this - */ - Tone.Clock.prototype.dispose = function () { - Tone.Emitter.prototype.dispose.call(this); - this.context.off('tick', this._boundLoop); - this._writable('frequency'); - this._tickSource.dispose(); - this._tickSource = null; - this.frequency = null; - this._boundLoop = null; - this._nextTick = Infinity; - this.callback = null; - this._state.dispose(); - this._state = null; - }; - return Tone.Clock; - }); - Module(function (Tone) { - - /** - * @class Similar to Tone.Timeline, but all events represent - * intervals with both "time" and "duration" times. The - * events are placed in a tree structure optimized - * for querying an intersection point with the timeline - * events. Internally uses an [Interval Tree](https://en.wikipedia.org/wiki/Interval_tree) - * to represent the data. - * @extends {Tone} - */ - Tone.IntervalTimeline = function () { - Tone.call(this); - /** - * The root node of the inteval tree - * @type {IntervalNode} - * @private - */ - this._root = null; - /** - * Keep track of the length of the timeline. - * @type {Number} - * @private - */ - this._length = 0; - }; - Tone.extend(Tone.IntervalTimeline); - /** - * The event to add to the timeline. All events must - * have a time and duration value - * @param {Object} event The event to add to the timeline - * @return {Tone.IntervalTimeline} this - */ - Tone.IntervalTimeline.prototype.add = function (event) { - if (Tone.isUndef(event.time) || Tone.isUndef(event.duration)) { - throw new Error('Tone.IntervalTimeline: events must have time and duration parameters'); - } - event.time = event.time.valueOf(); - var node = new IntervalNode(event.time, event.time + event.duration, event); - if (this._root === null) { - this._root = node; - } else { - this._root.insert(node); - } - this._length++; - // Restructure tree to be balanced - while (node !== null) { - node.updateHeight(); - node.updateMax(); - this._rebalance(node); - node = node.parent; - } - return this; - }; - /** - * Remove an event from the timeline. - * @param {Object} event The event to remove from the timeline - * @return {Tone.IntervalTimeline} this - */ - Tone.IntervalTimeline.prototype.remove = function (event) { - if (this._root !== null) { - var results = []; - this._root.search(event.time, results); - for (var i = 0; i < results.length; i++) { - var node = results[i]; - if (node.event === event) { - this._removeNode(node); - this._length--; - break; - } - } - } - return this; - }; - /** - * The number of items in the timeline. - * @type {Number} - * @memberOf Tone.IntervalTimeline# - * @name length - * @readOnly - */ - Object.defineProperty(Tone.IntervalTimeline.prototype, 'length', { - get: function () { - return this._length; - } - }); - /** - * Remove events whose time time is after the given time - * @param {Number} time The time to query. - * @returns {Tone.IntervalTimeline} this - */ - Tone.IntervalTimeline.prototype.cancel = function (after) { - this.forEachFrom(after, function (event) { - this.remove(event); - }.bind(this)); - return this; - }; - /** - * Set the root node as the given node - * @param {IntervalNode} node - * @private - */ - Tone.IntervalTimeline.prototype._setRoot = function (node) { - this._root = node; - if (this._root !== null) { - this._root.parent = null; - } - }; - /** - * Replace the references to the node in the node's parent - * with the replacement node. - * @param {IntervalNode} node - * @param {IntervalNode} replacement - * @private - */ - Tone.IntervalTimeline.prototype._replaceNodeInParent = function (node, replacement) { - if (node.parent !== null) { - if (node.isLeftChild()) { - node.parent.left = replacement; - } else { - node.parent.right = replacement; - } - this._rebalance(node.parent); - } else { - this._setRoot(replacement); - } - }; - /** - * Remove the node from the tree and replace it with - * a successor which follows the schema. - * @param {IntervalNode} node - * @private - */ - Tone.IntervalTimeline.prototype._removeNode = function (node) { - if (node.left === null && node.right === null) { - this._replaceNodeInParent(node, null); - } else if (node.right === null) { - this._replaceNodeInParent(node, node.left); - } else if (node.left === null) { - this._replaceNodeInParent(node, node.right); - } else { - var balance = node.getBalance(); - var replacement, temp; - if (balance > 0) { - if (node.left.right === null) { - replacement = node.left; - replacement.right = node.right; - temp = replacement; - } else { - replacement = node.left.right; - while (replacement.right !== null) { - replacement = replacement.right; - } - replacement.parent.right = replacement.left; - temp = replacement.parent; - replacement.left = node.left; - replacement.right = node.right; - } - } else if (node.right.left === null) { - replacement = node.right; - replacement.left = node.left; - temp = replacement; - } else { - replacement = node.right.left; - while (replacement.left !== null) { - replacement = replacement.left; - } - replacement.parent = replacement.parent; - replacement.parent.left = replacement.right; - temp = replacement.parent; - replacement.left = node.left; - replacement.right = node.right; - } - if (node.parent !== null) { - if (node.isLeftChild()) { - node.parent.left = replacement; - } else { - node.parent.right = replacement; - } - } else { - this._setRoot(replacement); - } - // this._replaceNodeInParent(node, replacement); - this._rebalance(temp); - } - node.dispose(); - }; - /** - * Rotate the tree to the left - * @param {IntervalNode} node - * @private - */ - Tone.IntervalTimeline.prototype._rotateLeft = function (node) { - var parent = node.parent; - var isLeftChild = node.isLeftChild(); - // Make node.right the new root of this sub tree (instead of node) - var pivotNode = node.right; - node.right = pivotNode.left; - pivotNode.left = node; - if (parent !== null) { - if (isLeftChild) { - parent.left = pivotNode; - } else { - parent.right = pivotNode; - } - } else { - this._setRoot(pivotNode); - } - }; - /** - * Rotate the tree to the right - * @param {IntervalNode} node - * @private - */ - Tone.IntervalTimeline.prototype._rotateRight = function (node) { - var parent = node.parent; - var isLeftChild = node.isLeftChild(); - // Make node.left the new root of this sub tree (instead of node) - var pivotNode = node.left; - node.left = pivotNode.right; - pivotNode.right = node; - if (parent !== null) { - if (isLeftChild) { - parent.left = pivotNode; - } else { - parent.right = pivotNode; - } - } else { - this._setRoot(pivotNode); - } - }; - /** - * Balance the BST - * @param {IntervalNode} node - * @private - */ - Tone.IntervalTimeline.prototype._rebalance = function (node) { - var balance = node.getBalance(); - if (balance > 1) { - if (node.left.getBalance() < 0) { - this._rotateLeft(node.left); - } else { - this._rotateRight(node); - } - } else if (balance < -1) { - if (node.right.getBalance() > 0) { - this._rotateRight(node.right); - } else { - this._rotateLeft(node); - } - } - }; - /** - * Get an event whose time and duration span the give time. Will - * return the match whose "time" value is closest to the given time. - * @param {Object} event The event to add to the timeline - * @return {Object} The event which spans the desired time - */ - Tone.IntervalTimeline.prototype.get = function (time) { - if (this._root !== null) { - var results = []; - this._root.search(time, results); - if (results.length > 0) { - var max = results[0]; - for (var i = 1; i < results.length; i++) { - if (results[i].low > max.low) { - max = results[i]; - } - } - return max.event; - } - } - return null; - }; - /** - * Iterate over everything in the timeline. - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.IntervalTimeline} this - */ - Tone.IntervalTimeline.prototype.forEach = function (callback) { - if (this._root !== null) { - var allNodes = []; - this._root.traverse(function (node) { - allNodes.push(node); - }); - for (var i = 0; i < allNodes.length; i++) { - var ev = allNodes[i].event; - if (ev) { - callback(ev); - } - } - } - return this; - }; - /** - * Iterate over everything in the array in which the given time - * overlaps with the time and duration time of the event. - * @param {Number} time The time to check if items are overlapping - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.IntervalTimeline} this - */ - Tone.IntervalTimeline.prototype.forEachAtTime = function (time, callback) { - if (this._root !== null) { - var results = []; - this._root.search(time, results); - for (var i = results.length - 1; i >= 0; i--) { - var ev = results[i].event; - if (ev) { - callback(ev); - } - } - } - return this; - }; - /** - * Iterate over everything in the array in which the time is greater - * than or equal to the given time. - * @param {Number} time The time to check if items are before - * @param {Function} callback The callback to invoke with every item - * @returns {Tone.IntervalTimeline} this - */ - Tone.IntervalTimeline.prototype.forEachFrom = function (time, callback) { - if (this._root !== null) { - var results = []; - this._root.searchAfter(time, results); - for (var i = results.length - 1; i >= 0; i--) { - var ev = results[i].event; - callback(ev); - } - } - return this; - }; - /** - * Clean up - * @return {Tone.IntervalTimeline} this - */ - Tone.IntervalTimeline.prototype.dispose = function () { - var allNodes = []; - if (this._root !== null) { - this._root.traverse(function (node) { - allNodes.push(node); - }); - } - for (var i = 0; i < allNodes.length; i++) { - allNodes[i].dispose(); - } - allNodes = null; - this._root = null; - return this; - }; - /////////////////////////////////////////////////////////////////////////// - // INTERVAL NODE HELPER - /////////////////////////////////////////////////////////////////////////// - /** - * Represents a node in the binary search tree, with the addition - * of a "high" value which keeps track of the highest value of - * its children. - * References: - * https://brooknovak.wordpress.com/2013/12/07/augmented-interval-tree-in-c/ - * http://www.mif.vu.lt/~valdas/ALGORITMAI/LITERATURA/Cormen/Cormen.pdf - * @param {Number} low - * @param {Number} high - * @private - */ - var IntervalNode = function (low, high, event) { - //the event container - this.event = event; - //the low value - this.low = low; - //the high value - this.high = high; - //the high value for this and all child nodes - this.max = this.high; - //the nodes to the left - this._left = null; - //the nodes to the right - this._right = null; - //the parent node - this.parent = null; - //the number of child nodes - this.height = 0; - }; - /** - * Insert a node into the correct spot in the tree - * @param {IntervalNode} node - */ - IntervalNode.prototype.insert = function (node) { - if (node.low <= this.low) { - if (this.left === null) { - this.left = node; - } else { - this.left.insert(node); - } - } else if (this.right === null) { - this.right = node; - } else { - this.right.insert(node); - } - }; - /** - * Search the tree for nodes which overlap - * with the given point - * @param {Number} point The point to query - * @param {Array} results The array to put the results - */ - IntervalNode.prototype.search = function (point, results) { - // If p is to the right of the rightmost point of any interval - // in this node and all children, there won't be any matches. - if (point > this.max) { - return; - } - // Search left children - if (this.left !== null) { - this.left.search(point, results); - } - // Check this node - if (this.low <= point && this.high > point) { - results.push(this); - } - // If p is to the left of the time of this interval, - // then it can't be in any child to the right. - if (this.low > point) { - return; - } - // Search right children - if (this.right !== null) { - this.right.search(point, results); - } - }; - /** - * Search the tree for nodes which are less - * than the given point - * @param {Number} point The point to query - * @param {Array} results The array to put the results - */ - IntervalNode.prototype.searchAfter = function (point, results) { - // Check this node - if (this.low >= point) { - results.push(this); - if (this.left !== null) { - this.left.searchAfter(point, results); - } - } - // search the right side - if (this.right !== null) { - this.right.searchAfter(point, results); - } - }; - /** - * Invoke the callback on this element and both it's branches - * @param {Function} callback - */ - IntervalNode.prototype.traverse = function (callback) { - callback(this); - if (this.left !== null) { - this.left.traverse(callback); - } - if (this.right !== null) { - this.right.traverse(callback); - } - }; - /** - * Update the height of the node - */ - IntervalNode.prototype.updateHeight = function () { - if (this.left !== null && this.right !== null) { - this.height = Math.max(this.left.height, this.right.height) + 1; - } else if (this.right !== null) { - this.height = this.right.height + 1; - } else if (this.left !== null) { - this.height = this.left.height + 1; - } else { - this.height = 0; - } - }; - /** - * Update the height of the node - */ - IntervalNode.prototype.updateMax = function () { - this.max = this.high; - if (this.left !== null) { - this.max = Math.max(this.max, this.left.max); - } - if (this.right !== null) { - this.max = Math.max(this.max, this.right.max); - } - }; - /** - * The balance is how the leafs are distributed on the node - * @return {Number} Negative numbers are balanced to the right - */ - IntervalNode.prototype.getBalance = function () { - var balance = 0; - if (this.left !== null && this.right !== null) { - balance = this.left.height - this.right.height; - } else if (this.left !== null) { - balance = this.left.height + 1; - } else if (this.right !== null) { - balance = -(this.right.height + 1); - } - return balance; - }; - /** - * @returns {Boolean} true if this node is the left child - * of its parent - */ - IntervalNode.prototype.isLeftChild = function () { - return this.parent !== null && this.parent.left === this; - }; - /** - * get/set the left node - * @type {IntervalNode} - */ - Object.defineProperty(IntervalNode.prototype, 'left', { - get: function () { - return this._left; - }, - set: function (node) { - this._left = node; - if (node !== null) { - node.parent = this; - } - this.updateHeight(); - this.updateMax(); - } - }); - /** - * get/set the right node - * @type {IntervalNode} - */ - Object.defineProperty(IntervalNode.prototype, 'right', { - get: function () { - return this._right; - }, - set: function (node) { - this._right = node; - if (node !== null) { - node.parent = this; - } - this.updateHeight(); - this.updateMax(); - } - }); - /** - * null out references. - */ - IntervalNode.prototype.dispose = function () { - this.parent = null; - this._left = null; - this._right = null; - this.event = null; - }; - /////////////////////////////////////////////////////////////////////////// - // END INTERVAL NODE HELPER - /////////////////////////////////////////////////////////////////////////// - return Tone.IntervalTimeline; - }); - Module(function (Tone) { - /** - * @class Tone.Ticks is a primitive type for encoding Time values. - * Tone.Ticks can be constructed with or without the `new` keyword. Tone.Ticks can be passed - * into the parameter of any method which takes time as an argument. - * @constructor - * @extends {Tone.TransportTime} - * @param {String|Number} val The time value. - * @param {String=} units The units of the value. - * @example - * var t = Tone.Ticks("4n");//a quarter note - */ - Tone.Ticks = function (val, units) { - if (this instanceof Tone.Ticks) { - Tone.TransportTime.call(this, val, units); - } else { - return new Tone.Ticks(val, units); - } - }; - Tone.extend(Tone.Ticks, Tone.TransportTime); - /** - * The default units if none are given. - * @type {String} - * @private - */ - Tone.Ticks.prototype._defaultUnits = 'i'; - /** - * Get the current time in the given units - * @return {Ticks} - * @private - */ - Tone.Ticks.prototype._now = function () { - return Tone.Transport.ticks; - }; - /** - * Return the value of the beats in the current units - * @param {Number} beats - * @return {Number} - * @private - */ - Tone.Ticks.prototype._beatsToUnits = function (beats) { - return this._getPPQ() * beats; - }; - /** - * Returns the value of a second in the current units - * @param {Seconds} seconds - * @return {Number} - * @private - */ - Tone.Ticks.prototype._secondsToUnits = function (seconds) { - return seconds / (60 / this._getBpm()) * this._getPPQ(); - }; - /** - * Returns the value of a tick in the current time units - * @param {Ticks} ticks - * @return {Number} - * @private - */ - Tone.Ticks.prototype._ticksToUnits = function (ticks) { - return ticks; - }; - /** - * Return the time in ticks - * @return {Ticks} - */ - Tone.Ticks.prototype.toTicks = function () { - return this.valueOf(); - }; - /** - * Return the time in ticks - * @return {Ticks} - */ - Tone.Ticks.prototype.toSeconds = function () { - return this.valueOf() / this._getPPQ() * (60 / this._getBpm()); - }; - return Tone.Ticks; - }); - Module(function (Tone) { - /** - * @class Tone.TransportEvent is an internal class used by (Tone.Transport)[Transport] - * to schedule events. Do no invoke this class directly, it is - * handled from within Tone.Transport. - * @extends {Tone} - * @param {Object} options - */ - Tone.TransportEvent = function (Transport, options) { - options = Tone.defaultArg(options, Tone.TransportEvent.defaults); - Tone.call(this); - /** - * Reference to the Transport that created it - * @type {Tone.Transport} - */ - this.Transport = Transport; - /** - * The unique id of the event - * @type {Number} - */ - this.id = Tone.TransportEvent._eventId++; - /** - * The time the event starts - * @type {Ticks} - */ - this.time = Tone.Ticks(options.time); - /** - * The callback to invoke - * @type {Function} - */ - this.callback = options.callback; - /** - * If the event should be removed after being created. - * @type {Boolean} - * @private - */ - this._once = options.once; - }; - Tone.extend(Tone.TransportEvent); - /** - * The defaults - * @static - * @type {Object} - */ - Tone.TransportEvent.defaults = { - 'once': false, - 'callback': Tone.noOp - }; - /** - * Current ID counter - * @private - * @static - * @type {Number} - */ - Tone.TransportEvent._eventId = 0; - /** - * Invoke the event callback. - * @param {Time} time The AudioContext time in seconds of the event - */ - Tone.TransportEvent.prototype.invoke = function (time) { - if (this.callback) { - this.callback(time); - if (this._once && this.Transport) { - this.Transport.clear(this.id); - } - } - }; - /** - * Clean up - * @return {Tone.TransportEvent} this - */ - Tone.TransportEvent.prototype.dispose = function () { - Tone.prototype.dispose.call(this); - this.Transport = null; - this.callback = null; - this.time = null; - return this; - }; - return Tone.TransportEvent; - }); - Module(function (Tone) { - /** - * @class Tone.TransportRepeatEvent is an internal class used by Tone.Transport - * to schedule repeat events. This class should not be instantiated directly. - * @extends {Tone.TransportEvent} - * @param {Object} options - */ - Tone.TransportRepeatEvent = function (Transport, options) { - Tone.TransportEvent.call(this, Transport, options); - options = Tone.defaultArg(options, Tone.TransportRepeatEvent.defaults); - /** - * When the event should stop repeating - * @type {Ticks} - * @private - */ - this.duration = Tone.Ticks(options.duration); - /** - * The interval of the repeated event - * @type {Ticks} - * @private - */ - this._interval = Tone.Ticks(options.interval); - /** - * The ID of the current timeline event - * @type {Number} - * @private - */ - this._currentId = -1; - /** - * The ID of the next timeline event - * @type {Number} - * @private - */ - this._nextId = -1; - /** - * The time of the next event - * @type {Ticks} - * @private - */ - this._nextTick = this.time; - /** - * a reference to the bound start method - * @type {Function} - * @private - */ - this._boundRestart = this._restart.bind(this); - this.Transport.on('start loopStart', this._boundRestart); - this._restart(); - }; - Tone.extend(Tone.TransportRepeatEvent, Tone.TransportEvent); - /** - * The defaults - * @static - * @type {Object} - */ - Tone.TransportRepeatEvent.defaults = { - 'duration': Infinity, - 'interval': 1 - }; - /** - * Invoke the callback. Returns the tick time which - * the next event should be scheduled at. - * @param {Number} time The AudioContext time in seconds of the event - */ - Tone.TransportRepeatEvent.prototype.invoke = function (time) { - //create more events if necessary - this._createEvents(time); - //call the super class - Tone.TransportEvent.prototype.invoke.call(this, time); - }; - /** - * Push more events onto the timeline to keep up with the position of the timeline - * @private - */ - Tone.TransportRepeatEvent.prototype._createEvents = function (time) { - // schedule the next event - var ticks = this.Transport.getTicksAtTime(time); - if (ticks >= this.time && ticks >= this._nextTick && this._nextTick + this._interval < this.time + this.duration) { - this._nextTick += this._interval; - this._currentId = this._nextId; - this._nextId = this.Transport.scheduleOnce(this.invoke.bind(this), Tone.Ticks(this._nextTick)); - } - }; - /** - * Push more events onto the timeline to keep up with the position of the timeline - * @private - */ - Tone.TransportRepeatEvent.prototype._restart = function (time) { - this.Transport.clear(this._currentId); - this.Transport.clear(this._nextId); - this._nextTick = this.time; - var ticks = this.Transport.getTicksAtTime(time); - if (ticks > this.time) { - this._nextTick = this.time + Math.ceil((ticks - this.time) / this._interval) * this._interval; - } - this._currentId = this.Transport.scheduleOnce(this.invoke.bind(this), Tone.Ticks(this._nextTick)); - this._nextTick += this._interval; - this._nextId = this.Transport.scheduleOnce(this.invoke.bind(this), Tone.Ticks(this._nextTick)); - }; - /** - * Clean up - * @return {Tone.TransportRepeatEvent} this - */ - Tone.TransportRepeatEvent.prototype.dispose = function () { - this.Transport.clear(this._currentId); - this.Transport.clear(this._nextId); - this.Transport.off('start loopStart', this._boundRestart); - this._boundCreateEvents = null; - Tone.TransportEvent.prototype.dispose.call(this); - this.duration = null; - this._interval = null; - return this; - }; - return Tone.TransportRepeatEvent; - }); - Module(function (Tone) { - - /** - * @class Transport for timing musical events. - * Supports tempo curves and time changes. Unlike browser-based timing (setInterval, requestAnimationFrame) - * Tone.Transport timing events pass in the exact time of the scheduled event - * in the argument of the callback function. Pass that time value to the object - * you're scheduling. <br><br> - * A single transport is created for you when the library is initialized. - * <br><br> - * The transport emits the events: "start", "stop", "pause", and "loop" which are - * called with the time of that event as the argument. - * - * @extends {Tone.Emitter} - * @singleton - * @example - * //repeated event every 8th note - * Tone.Transport.scheduleRepeat(function(time){ - * //do something with the time - * }, "8n"); - * @example - * //schedule an event on the 16th measure - * Tone.Transport.schedule(function(time){ - * //do something with the time - * }, "16:0:0"); - */ - Tone.Transport = function () { - Tone.Emitter.call(this); - Tone.getContext(function () { - /////////////////////////////////////////////////////////////////////// - // LOOPING - ////////////////////////////////////////////////////////////////////// - /** - * If the transport loops or not. - * @type {boolean} - */ - this.loop = false; - /** - * The loop start position in ticks - * @type {Ticks} - * @private - */ - this._loopStart = 0; - /** - * The loop end position in ticks - * @type {Ticks} - * @private - */ - this._loopEnd = 0; - /////////////////////////////////////////////////////////////////////// - // CLOCK/TEMPO - ////////////////////////////////////////////////////////////////////// - /** - * Pulses per quarter is the number of ticks per quarter note. - * @private - * @type {Number} - */ - this._ppq = TransportConstructor.defaults.PPQ; - /** - * watches the main oscillator for timing ticks - * initially starts at 120bpm - * @private - * @type {Tone.Clock} - */ - this._clock = new Tone.Clock({ - 'callback': this._processTick.bind(this), - 'frequency': 0 - }); - this._bindClockEvents(); - /** - * The Beats Per Minute of the Transport. - * @type {BPM} - * @signal - * @example - * Tone.Transport.bpm.value = 80; - * //ramp the bpm to 120 over 10 seconds - * Tone.Transport.bpm.rampTo(120, 10); - */ - this.bpm = this._clock.frequency; - this.bpm._toUnits = this._toUnits.bind(this); - this.bpm._fromUnits = this._fromUnits.bind(this); - this.bpm.units = Tone.Type.BPM; - this.bpm.value = TransportConstructor.defaults.bpm; - this._readOnly('bpm'); - /** - * The time signature, or more accurately the numerator - * of the time signature over a denominator of 4. - * @type {Number} - * @private - */ - this._timeSignature = TransportConstructor.defaults.timeSignature; - /////////////////////////////////////////////////////////////////////// - // TIMELINE EVENTS - ////////////////////////////////////////////////////////////////////// - /** - * All the events in an object to keep track by ID - * @type {Object} - * @private - */ - this._scheduledEvents = {}; - /** - * The scheduled events. - * @type {Tone.Timeline} - * @private - */ - this._timeline = new Tone.Timeline(); - /** - * Repeated events - * @type {Array} - * @private - */ - this._repeatedEvents = new Tone.IntervalTimeline(); - /** - * All of the synced Signals - * @private - * @type {Array} - */ - this._syncedSignals = []; - /////////////////////////////////////////////////////////////////////// - // SWING - ////////////////////////////////////////////////////////////////////// - /** - * The subdivision of the swing - * @type {Ticks} - * @private - */ - this._swingTicks = TransportConstructor.defaults.PPQ / 2; - //8n - /** - * The swing amount - * @type {NormalRange} - * @private - */ - this._swingAmount = 0; - }.bind(this)); - }; - Tone.extend(Tone.Transport, Tone.Emitter); - /** - * the defaults - * @type {Object} - * @const - * @static - */ - Tone.Transport.defaults = { - 'bpm': 120, - 'swing': 0, - 'swingSubdivision': '8n', - 'timeSignature': 4, - 'loopStart': 0, - 'loopEnd': '4m', - 'PPQ': 192 - }; - /////////////////////////////////////////////////////////////////////////////// - // TICKS - /////////////////////////////////////////////////////////////////////////////// - /** - * called on every tick - * @param {number} tickTime clock relative tick time - * @private - */ - Tone.Transport.prototype._processTick = function (tickTime, ticks) { - //handle swing - if (this._swingAmount > 0 && ticks % this._ppq !== 0 && //not on a downbeat - ticks % (this._swingTicks * 2) !== 0) { - //add some swing - var progress = ticks % (this._swingTicks * 2) / (this._swingTicks * 2); - var amount = Math.sin(progress * Math.PI) * this._swingAmount; - tickTime += Tone.Ticks(this._swingTicks * 2 / 3).toSeconds() * amount; - } - //do the loop test - if (this.loop) { - if (ticks >= this._loopEnd) { - this.emit('loopEnd', tickTime); - this._clock.setTicksAtTime(this._loopStart, tickTime); - ticks = this._loopStart; - this.emit('loopStart', tickTime, this._clock.getSecondsAtTime(tickTime)); - this.emit('loop', tickTime); - } - } - //invoke the timeline events scheduled on this tick - this._timeline.forEachAtTime(ticks, function (event) { - event.invoke(tickTime); - }); - }; - /////////////////////////////////////////////////////////////////////////////// - // SCHEDULABLE EVENTS - /////////////////////////////////////////////////////////////////////////////// - /** - * Schedule an event along the timeline. - * @param {Function} callback The callback to be invoked at the time. - * @param {TransportTime} time The time to invoke the callback at. - * @return {Number} The id of the event which can be used for canceling the event. - * @example - * //trigger the callback when the Transport reaches the desired time - * Tone.Transport.schedule(function(time){ - * envelope.triggerAttack(time); - * }, "128i"); - */ - Tone.Transport.prototype.schedule = function (callback, time) { - var event = new Tone.TransportEvent(this, { - 'time': Tone.TransportTime(time), - 'callback': callback - }); - return this._addEvent(event, this._timeline); - }; - /** - * Schedule a repeated event along the timeline. The event will fire - * at the `interval` starting at the `startTime` and for the specified - * `duration`. - * @param {Function} callback The callback to invoke. - * @param {Time} interval The duration between successive - * callbacks. Must be a positive number. - * @param {TransportTime=} startTime When along the timeline the events should - * start being invoked. - * @param {Time} [duration=Infinity] How long the event should repeat. - * @return {Number} The ID of the scheduled event. Use this to cancel - * the event. - * @example - * //a callback invoked every eighth note after the first measure - * Tone.Transport.scheduleRepeat(callback, "8n", "1m"); - */ - Tone.Transport.prototype.scheduleRepeat = function (callback, interval, startTime, duration) { - var event = new Tone.TransportRepeatEvent(this, { - 'callback': callback, - 'interval': Tone.Time(interval), - 'time': Tone.TransportTime(startTime), - 'duration': Tone.Time(Tone.defaultArg(duration, Infinity)) - }); - //kick it off if the Transport is started - return this._addEvent(event, this._repeatedEvents); - }; - /** - * Schedule an event that will be removed after it is invoked. - * Note that if the given time is less than the current transport time, - * the event will be invoked immediately. - * @param {Function} callback The callback to invoke once. - * @param {TransportTime} time The time the callback should be invoked. - * @returns {Number} The ID of the scheduled event. - */ - Tone.Transport.prototype.scheduleOnce = function (callback, time) { - var event = new Tone.TransportEvent(this, { - 'time': Tone.TransportTime(time), - 'callback': callback, - 'once': true - }); - return this._addEvent(event, this._timeline); - }; - /** - * Clear the passed in event id from the timeline - * @param {Number} eventId The id of the event. - * @returns {Tone.Transport} this - */ - Tone.Transport.prototype.clear = function (eventId) { - if (this._scheduledEvents.hasOwnProperty(eventId)) { - var item = this._scheduledEvents[eventId.toString()]; - item.timeline.remove(item.event); - item.event.dispose(); - delete this._scheduledEvents[eventId.toString()]; - } - return this; - }; - /** - * Add an event to the correct timeline. Keep track of the - * timeline it was added to. - * @param {Tone.TransportEvent} event - * @param {Tone.Timeline} timeline - * @returns {Number} the event id which was just added - * @private - */ - Tone.Transport.prototype._addEvent = function (event, timeline) { - this._scheduledEvents[event.id.toString()] = { - 'event': event, - 'timeline': timeline - }; - timeline.add(event); - return event.id; - }; - /** - * Remove scheduled events from the timeline after - * the given time. Repeated events will be removed - * if their startTime is after the given time - * @param {TransportTime} [after=0] Clear all events after - * this time. - * @returns {Tone.Transport} this - */ - Tone.Transport.prototype.cancel = function (after) { - after = Tone.defaultArg(after, 0); - after = this.toTicks(after); - this._timeline.forEachFrom(after, function (event) { - this.clear(event.id); - }.bind(this)); - this._repeatedEvents.forEachFrom(after, function (event) { - this.clear(event.id); - }.bind(this)); - return this; - }; - /////////////////////////////////////////////////////////////////////////////// - // START/STOP/PAUSE - /////////////////////////////////////////////////////////////////////////////// - /** - * Bind start/stop/pause events from the clock and emit them. - * @private - */ - Tone.Transport.prototype._bindClockEvents = function () { - this._clock.on('start', function (time, offset) { - offset = Tone.Ticks(offset).toSeconds(); - this.emit('start', time, offset); - }.bind(this)); - this._clock.on('stop', function (time) { - this.emit('stop', time); - }.bind(this)); - this._clock.on('pause', function (time) { - this.emit('pause', time); - }.bind(this)); - }; - /** - * Returns the playback state of the source, either "started", "stopped", or "paused" - * @type {Tone.State} - * @readOnly - * @memberOf Tone.Transport# - * @name state - */ - Object.defineProperty(Tone.Transport.prototype, 'state', { - get: function () { - return this._clock.getStateAtTime(this.now()); - } - }); - /** - * Start the transport and all sources synced to the transport. - * @param {Time} [time=now] The time when the transport should start. - * @param {TransportTime=} offset The timeline offset to start the transport. - * @returns {Tone.Transport} this - * @example - * //start the transport in one second starting at beginning of the 5th measure. - * Tone.Transport.start("+1", "4:0:0"); - */ - Tone.Transport.prototype.start = function (time, offset) { - //start the clock - if (Tone.isDefined(offset)) { - offset = this.toTicks(offset); - } - this._clock.start(time, offset); - return this; - }; - /** - * Stop the transport and all sources synced to the transport. - * @param {Time} [time=now] The time when the transport should stop. - * @returns {Tone.Transport} this - * @example - * Tone.Transport.stop(); - */ - Tone.Transport.prototype.stop = function (time) { - this._clock.stop(time); - return this; - }; - /** - * Pause the transport and all sources synced to the transport. - * @param {Time} [time=now] - * @returns {Tone.Transport} this - */ - Tone.Transport.prototype.pause = function (time) { - this._clock.pause(time); - return this; - }; - /** - * Toggle the current state of the transport. If it is - * started, it will stop it, otherwise it will start the Transport. - * @param {Time=} time The time of the event - * @return {Tone.Transport} this - */ - Tone.Transport.prototype.toggle = function (time) { - time = this.toSeconds(time); - if (this._clock.getStateAtTime(time) !== Tone.State.Started) { - this.start(time); - } else { - this.stop(time); - } - return this; - }; - /////////////////////////////////////////////////////////////////////////////// - // SETTERS/GETTERS - /////////////////////////////////////////////////////////////////////////////// - /** - * The time signature as just the numerator over 4. - * For example 4/4 would be just 4 and 6/8 would be 3. - * @memberOf Tone.Transport# - * @type {Number|Array} - * @name timeSignature - * @example - * //common time - * Tone.Transport.timeSignature = 4; - * // 7/8 - * Tone.Transport.timeSignature = [7, 8]; - * //this will be reduced to a single number - * Tone.Transport.timeSignature; //returns 3.5 - */ - Object.defineProperty(Tone.Transport.prototype, 'timeSignature', { - get: function () { - return this._timeSignature; - }, - set: function (timeSig) { - if (Tone.isArray(timeSig)) { - timeSig = timeSig[0] / timeSig[1] * 4; - } - this._timeSignature = timeSig; - } - }); - /** - * When the Tone.Transport.loop = true, this is the starting position of the loop. - * @memberOf Tone.Transport# - * @type {Time} - * @name loopStart - */ - Object.defineProperty(Tone.Transport.prototype, 'loopStart', { - get: function () { - return Tone.Ticks(this._loopStart).toSeconds(); - }, - set: function (startPosition) { - this._loopStart = this.toTicks(startPosition); - } - }); - /** - * When the Tone.Transport.loop = true, this is the ending position of the loop. - * @memberOf Tone.Transport# - * @type {Time} - * @name loopEnd - */ - Object.defineProperty(Tone.Transport.prototype, 'loopEnd', { - get: function () { - return Tone.Ticks(this._loopEnd).toSeconds(); - }, - set: function (endPosition) { - this._loopEnd = this.toTicks(endPosition); - } - }); - /** - * Set the loop start and stop at the same time. - * @param {TransportTime} startPosition - * @param {TransportTime} endPosition - * @returns {Tone.Transport} this - * @example - * //loop over the first measure - * Tone.Transport.setLoopPoints(0, "1m"); - * Tone.Transport.loop = true; - */ - Tone.Transport.prototype.setLoopPoints = function (startPosition, endPosition) { - this.loopStart = startPosition; - this.loopEnd = endPosition; - return this; - }; - /** - * The swing value. Between 0-1 where 1 equal to - * the note + half the subdivision. - * @memberOf Tone.Transport# - * @type {NormalRange} - * @name swing - */ - Object.defineProperty(Tone.Transport.prototype, 'swing', { - get: function () { - return this._swingAmount; - }, - set: function (amount) { - //scale the values to a normal range - this._swingAmount = amount; - } - }); - /** - * Set the subdivision which the swing will be applied to. - * The default value is an 8th note. Value must be less - * than a quarter note. - * - * @memberOf Tone.Transport# - * @type {Time} - * @name swingSubdivision - */ - Object.defineProperty(Tone.Transport.prototype, 'swingSubdivision', { - get: function () { - return Tone.Ticks(this._swingTicks).toNotation(); - }, - set: function (subdivision) { - this._swingTicks = this.toTicks(subdivision); - } - }); - /** - * The Transport's position in Bars:Beats:Sixteenths. - * Setting the value will jump to that position right away. - * @memberOf Tone.Transport# - * @type {BarsBeatsSixteenths} - * @name position - */ - Object.defineProperty(Tone.Transport.prototype, 'position', { - get: function () { - var now = this.now(); - var ticks = this._clock.getTicksAtTime(now); - return Tone.Ticks(ticks).toBarsBeatsSixteenths(); - }, - set: function (progress) { - var ticks = this.toTicks(progress); - this.ticks = ticks; - } - }); - /** - * The Transport's position in seconds - * Setting the value will jump to that position right away. - * @memberOf Tone.Transport# - * @type {Seconds} - * @name seconds - */ - Object.defineProperty(Tone.Transport.prototype, 'seconds', { - get: function () { - return this._clock.seconds; - }, - set: function (s) { - var now = this.now(); - var ticks = this.bpm.timeToTicks(s, now); - this.ticks = ticks; - } - }); - /** - * The Transport's loop position as a normalized value. Always - * returns 0 if the transport if loop is not true. - * @memberOf Tone.Transport# - * @name progress - * @type {NormalRange} - */ - Object.defineProperty(Tone.Transport.prototype, 'progress', { - get: function () { - if (this.loop) { - var now = this.now(); - var ticks = this._clock.getTicksAtTime(now); - return (ticks - this._loopStart) / (this._loopEnd - this._loopStart); - } else { - return 0; - } - } - }); - /** - * The transports current tick position. - * - * @memberOf Tone.Transport# - * @type {Ticks} - * @name ticks - */ - Object.defineProperty(Tone.Transport.prototype, 'ticks', { - get: function () { - return this._clock.ticks; - }, - set: function (t) { - if (this._clock.ticks !== t) { - var now = this.now(); - //stop everything synced to the transport - if (this.state === Tone.State.Started) { - this.emit('stop', now); - this._clock.setTicksAtTime(t, now); - //restart it with the new time - this.emit('start', now, this.seconds); - } else { - this._clock.setTicksAtTime(t, now); - } - } - } - }); - /** - * Get the clock's ticks at the given time. - * @param {Time} time When to get the tick value - * @return {Ticks} The tick value at the given time. - */ - Tone.Transport.prototype.getTicksAtTime = function (time) { - return Math.round(this._clock.getTicksAtTime(time)); - }; - /** - * Return the elapsed seconds at the given time. - * @param {Time} time When to get the elapsed seconds - * @return {Seconds} The number of elapsed seconds - */ - Tone.Transport.prototype.getSecondsAtTime = function (time) { - return this._clock.getSecondsAtTime(time); - }; - /** - * Pulses Per Quarter note. This is the smallest resolution - * the Transport timing supports. This should be set once - * on initialization and not set again. Changing this value - * after other objects have been created can cause problems. - * - * @memberOf Tone.Transport# - * @type {Number} - * @name PPQ - */ - Object.defineProperty(Tone.Transport.prototype, 'PPQ', { - get: function () { - return this._ppq; - }, - set: function (ppq) { - var bpm = this.bpm.value; - this._ppq = ppq; - this.bpm.value = bpm; - } - }); - /** - * Convert from BPM to frequency (factoring in PPQ) - * @param {BPM} bpm The BPM value to convert to frequency - * @return {Frequency} The BPM as a frequency with PPQ factored in. - * @private - */ - Tone.Transport.prototype._fromUnits = function (bpm) { - return 1 / (60 / bpm / this.PPQ); - }; - /** - * Convert from frequency (with PPQ) into BPM - * @param {Frequency} freq The clocks frequency to convert to BPM - * @return {BPM} The frequency value as BPM. - * @private - */ - Tone.Transport.prototype._toUnits = function (freq) { - return freq / this.PPQ * 60; - }; - /////////////////////////////////////////////////////////////////////////////// - // SYNCING - /////////////////////////////////////////////////////////////////////////////// - /** - * Returns the time aligned to the next subdivision - * of the Transport. If the Transport is not started, - * it will return 0. - * Note: this will not work precisely during tempo ramps. - * @param {Time} subdivision The subdivision to quantize to - * @return {Number} The context time of the next subdivision. - * @example - * Tone.Transport.start(); //the transport must be started - * Tone.Transport.nextSubdivision("4n"); - */ - Tone.Transport.prototype.nextSubdivision = function (subdivision) { - subdivision = this.toTicks(subdivision); - if (this.state !== Tone.State.Started) { - //if the transport's not started, return 0 - return 0; - } else { - var now = this.now(); - //the remainder of the current ticks and the subdivision - var transportPos = this.getTicksAtTime(now); - var remainingTicks = subdivision - transportPos % subdivision; - return this._clock.nextTickTime(remainingTicks, now); - } - }; - /** - * Attaches the signal to the tempo control signal so that - * any changes in the tempo will change the signal in the same - * ratio. - * - * @param {Tone.Signal} signal - * @param {number=} ratio Optionally pass in the ratio between - * the two signals. Otherwise it will be computed - * based on their current values. - * @returns {Tone.Transport} this - */ - Tone.Transport.prototype.syncSignal = function (signal, ratio) { - if (!ratio) { - //get the sync ratio - var now = this.now(); - if (signal.getValueAtTime(now) !== 0) { - ratio = signal.getValueAtTime(now) / this.bpm.getValueAtTime(now); - } else { - ratio = 0; - } - } - var ratioSignal = new Tone.Gain(ratio); - this.bpm.chain(ratioSignal, signal._param); - this._syncedSignals.push({ - 'ratio': ratioSignal, - 'signal': signal, - 'initial': signal.value - }); - signal.value = 0; - return this; - }; - /** - * Unsyncs a previously synced signal from the transport's control. - * See Tone.Transport.syncSignal. - * @param {Tone.Signal} signal - * @returns {Tone.Transport} this - */ - Tone.Transport.prototype.unsyncSignal = function (signal) { - for (var i = this._syncedSignals.length - 1; i >= 0; i--) { - var syncedSignal = this._syncedSignals[i]; - if (syncedSignal.signal === signal) { - syncedSignal.ratio.dispose(); - syncedSignal.signal.value = syncedSignal.initial; - this._syncedSignals.splice(i, 1); - } - } - return this; - }; - /** - * Clean up. - * @returns {Tone.Transport} this - * @private - */ - Tone.Transport.prototype.dispose = function () { - Tone.Emitter.prototype.dispose.call(this); - this._clock.dispose(); - this._clock = null; - this._writable('bpm'); - this.bpm = null; - this._timeline.dispose(); - this._timeline = null; - this._repeatedEvents.dispose(); - this._repeatedEvents = null; - return this; - }; - /////////////////////////////////////////////////////////////////////////////// - // INITIALIZATION - /////////////////////////////////////////////////////////////////////////////// - var TransportConstructor = Tone.Transport; - Tone.Transport = new TransportConstructor(); - Tone.Context.on('init', function (context) { - if (context.Transport instanceof TransportConstructor) { - Tone.Transport = context.Transport; - } else { - Tone.Transport = new TransportConstructor(); - } - //store the Transport on the context so it can be retrieved later - context.Transport = Tone.Transport; - }); - Tone.Context.on('close', function (context) { - if (context.Transport instanceof TransportConstructor) { - context.Transport.dispose(); - } - }); - return Tone.Transport; - }); - Module(function (Tone) { - - /** - * @class Tone.Volume is a simple volume node, useful for creating a volume fader. - * - * @extends {Tone.AudioNode} - * @constructor - * @param {Decibels} [volume=0] the initial volume - * @example - * var vol = new Tone.Volume(-12); - * instrument.chain(vol, Tone.Master); - */ - Tone.Volume = function () { - var options = Tone.defaults(arguments, ['volume'], Tone.Volume); - Tone.AudioNode.call(this); - /** - * the output node - * @type {GainNode} - * @private - */ - this.output = this.input = new Tone.Gain(options.volume, Tone.Type.Decibels); - /** - * The unmuted volume - * @type {Decibels} - * @private - */ - this._unmutedVolume = options.volume; - /** - * The volume control in decibels. - * @type {Decibels} - * @signal - */ - this.volume = this.output.gain; - this._readOnly('volume'); - //set the mute initially - this.mute = options.mute; - }; - Tone.extend(Tone.Volume, Tone.AudioNode); - /** - * Defaults - * @type {Object} - * @const - * @static - */ - Tone.Volume.defaults = { - 'volume': 0, - 'mute': false - }; - /** - * Mute the output. - * @memberOf Tone.Volume# - * @type {boolean} - * @name mute - * @example - * //mute the output - * volume.mute = true; - */ - Object.defineProperty(Tone.Volume.prototype, 'mute', { - get: function () { - return this.volume.value === -Infinity; - }, - set: function (mute) { - if (!this.mute && mute) { - this._unmutedVolume = this.volume.value; - //maybe it should ramp here? - this.volume.value = -Infinity; - } else if (this.mute && !mute) { - this.volume.value = this._unmutedVolume; - } - } - }); - /** - * clean up - * @returns {Tone.Volume} this - */ - Tone.Volume.prototype.dispose = function () { - this.input.dispose(); - Tone.AudioNode.prototype.dispose.call(this); - this._writable('volume'); - this.volume.dispose(); - this.volume = null; - return this; - }; - return Tone.Volume; - }); - Module(function (Tone) { - - /** - * @class A single master output which is connected to the - * AudioDestinationNode (aka your speakers). - * It provides useful conveniences such as the ability - * to set the volume and mute the entire application. - * It also gives you the ability to apply master effects to your application. - * <br><br> - * Like Tone.Transport, A single Tone.Master is created - * on initialization and you do not need to explicitly construct one. - * - * @constructor - * @extends {Tone} - * @singleton - * @example - * //the audio will go from the oscillator to the speakers - * oscillator.connect(Tone.Master); - * //a convenience for connecting to the master output is also provided: - * oscillator.toMaster(); - * //the above two examples are equivalent. - */ - Tone.Master = function () { - Tone.AudioNode.call(this); - Tone.getContext(function () { - this.createInsOuts(1, 0); - /** - * The private volume node - * @type {Tone.Volume} - * @private - */ - this._volume = this.output = new Tone.Volume(); - /** - * The volume of the master output. - * @type {Decibels} - * @signal - */ - this.volume = this._volume.volume; - this._readOnly('volume'); - //connections - this.input.chain(this.output, this.context.destination); - }.bind(this)); - }; - Tone.extend(Tone.Master, Tone.AudioNode); - /** - * @type {Object} - * @const - */ - Tone.Master.defaults = { - 'volume': 0, - 'mute': false - }; - /** - * Mute the output. - * @memberOf Tone.Master# - * @type {boolean} - * @name mute - * @example - * //mute the output - * Tone.Master.mute = true; - */ - Object.defineProperty(Tone.Master.prototype, 'mute', { - get: function () { - return this._volume.mute; - }, - set: function (mute) { - this._volume.mute = mute; - } - }); - /** - * Add a master effects chain. NOTE: this will disconnect any nodes which were previously - * chained in the master effects chain. - * @param {AudioNode|Tone} args... All arguments will be connected in a row - * and the Master will be routed through it. - * @return {Tone.Master} this - * @example - * //some overall compression to keep the levels in check - * var masterCompressor = new Tone.Compressor({ - * "threshold" : -6, - * "ratio" : 3, - * "attack" : 0.5, - * "release" : 0.1 - * }); - * //give a little boost to the lows - * var lowBump = new Tone.Filter(200, "lowshelf"); - * //route everything through the filter - * //and compressor before going to the speakers - * Tone.Master.chain(lowBump, masterCompressor); - */ - Tone.Master.prototype.chain = function () { - this.input.disconnect(); - this.input.chain.apply(this.input, arguments); - arguments[arguments.length - 1].connect(this.output); - }; - /** - * Clean up - * @return {Tone.Master} this - */ - Tone.Master.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable('volume'); - this._volume.dispose(); - this._volume = null; - this.volume = null; - }; - /////////////////////////////////////////////////////////////////////////// - // AUGMENT TONE's PROTOTYPE - /////////////////////////////////////////////////////////////////////////// - /** - * Connect 'this' to the master output. Shorthand for this.connect(Tone.Master) - * @returns {Tone.AudioNode} this - * @example - * //connect an oscillator to the master output - * var osc = new Tone.Oscillator().toMaster(); - */ - Tone.AudioNode.prototype.toMaster = function () { - this.connect(Tone.Master); - return this; - }; - if (window.AudioNode) { - // Also augment AudioNode's prototype to include toMaster as a convenience - AudioNode.prototype.toMaster = function () { - this.connect(Tone.Master); - return this; - }; - } - /** - * initialize the module and listen for new audio contexts - */ - var MasterConstructor = Tone.Master; - Tone.Master = new MasterConstructor(); - Tone.Context.on('init', function (context) { - // if it already exists, just restore it - if (context.Master instanceof MasterConstructor) { - Tone.Master = context.Master; - } else { - Tone.Master = new MasterConstructor(); - } - context.Master = Tone.Master; - }); - Tone.Context.on('close', function (context) { - if (context.Master instanceof MasterConstructor) { - context.Master.dispose(); - } - }); - return Tone.Master; - }); - Module(function (Tone) { - - /** - * @class Base class for sources. Sources have start/stop methods - * and the ability to be synced to the - * start/stop of Tone.Transport. - * - * @constructor - * @extends {Tone.AudioNode} - * @example - * //Multiple state change events can be chained together, - * //but must be set in the correct order and with ascending times - * - * // OK - * state.start().stop("+0.2"); - * // AND - * state.start().stop("+0.2").start("+0.4").stop("+0.7") - * - * // BAD - * state.stop("+0.2").start(); - * // OR - * state.start("+0.3").stop("+0.2"); - * - */ - Tone.Source = function (options) { - options = Tone.defaultArg(options, Tone.Source.defaults); - Tone.AudioNode.call(this); - /** - * The output volume node - * @type {Tone.Volume} - * @private - */ - this._volume = this.output = new Tone.Volume(options.volume); - /** - * The volume of the output in decibels. - * @type {Decibels} - * @signal - * @example - * source.volume.value = -6; - */ - this.volume = this._volume.volume; - this._readOnly('volume'); - /** - * Keep track of the scheduled state. - * @type {Tone.TimelineState} - * @private - */ - this._state = new Tone.TimelineState(Tone.State.Stopped); - this._state.memory = 100; - /** - * The synced `start` callback function from the transport - * @type {Function} - * @private - */ - this._synced = false; - /** - * Keep track of all of the scheduled event ids - * @type {Array} - * @private - */ - this._scheduled = []; - //make the output explicitly stereo - this._volume.output.output.channelCount = 2; - this._volume.output.output.channelCountMode = 'explicit'; - //mute initially - this.mute = options.mute; - }; - Tone.extend(Tone.Source, Tone.AudioNode); - /** - * The default parameters - * @static - * @const - * @type {Object} - */ - Tone.Source.defaults = { - 'volume': 0, - 'mute': false - }; - /** - * Returns the playback state of the source, either "started" or "stopped". - * @type {Tone.State} - * @readOnly - * @memberOf Tone.Source# - * @name state - */ - Object.defineProperty(Tone.Source.prototype, 'state', { - get: function () { - if (this._synced) { - if (Tone.Transport.state === Tone.State.Started) { - return this._state.getValueAtTime(Tone.Transport.seconds); - } else { - return Tone.State.Stopped; - } - } else { - return this._state.getValueAtTime(this.now()); - } - } - }); - /** - * Mute the output. - * @memberOf Tone.Source# - * @type {boolean} - * @name mute - * @example - * //mute the output - * source.mute = true; - */ - Object.defineProperty(Tone.Source.prototype, 'mute', { - get: function () { - return this._volume.mute; - }, - set: function (mute) { - this._volume.mute = mute; - } - }); - //overwrite these functions - Tone.Source.prototype._start = Tone.noOp; - Tone.Source.prototype.restart = Tone.noOp; - Tone.Source.prototype._stop = Tone.noOp; - /** - * Start the source at the specified time. If no time is given, - * start the source now. - * @param {Time} [time=now] When the source should be started. - * @returns {Tone.Source} this - * @example - * source.start("+0.5"); //starts the source 0.5 seconds from now - */ - Tone.Source.prototype.start = function (time, offset, duration) { - if (Tone.isUndef(time) && this._synced) { - time = Tone.Transport.seconds; - } else { - time = this.toSeconds(time); - } - //if it's started, stop it and restart it - if (this._state.getValueAtTime(time) === Tone.State.Started) { - this._state.cancel(time); - this._state.setStateAtTime(Tone.State.Started, time); - this.restart(time, offset, duration); - } else { - this._state.setStateAtTime(Tone.State.Started, time); - if (this._synced) { - // add the offset time to the event - var event = this._state.get(time); - event.offset = Tone.defaultArg(offset, 0); - event.duration = duration; - var sched = Tone.Transport.schedule(function (t) { - this._start(t, offset, duration); - }.bind(this), time); - this._scheduled.push(sched); - //if it's already started - if (Tone.Transport.state === Tone.State.Started) { - this._syncedStart(this.now(), Tone.Transport.seconds); - } - } else { - this._start.apply(this, arguments); - } - } - return this; - }; - /** - * Stop the source at the specified time. If no time is given, - * stop the source now. - * @param {Time} [time=now] When the source should be stopped. - * @returns {Tone.Source} this - * @example - * source.stop(); // stops the source immediately - */ - Tone.Source.prototype.stop = function (time) { - if (Tone.isUndef(time) && this._synced) { - time = Tone.Transport.seconds; - } else { - time = this.toSeconds(time); - } - if (!this._synced) { - this._stop.apply(this, arguments); - } else { - var sched = Tone.Transport.schedule(this._stop.bind(this), time); - this._scheduled.push(sched); - } - this._state.cancel(time); - this._state.setStateAtTime(Tone.State.Stopped, time); - return this; - }; - /** - * Sync the source to the Transport so that all subsequent - * calls to `start` and `stop` are synced to the TransportTime - * instead of the AudioContext time. - * - * @returns {Tone.Source} this - * @example - * //sync the source so that it plays between 0 and 0.3 on the Transport's timeline - * source.sync().start(0).stop(0.3); - * //start the transport. - * Tone.Transport.start(); - * - * @example - * //start the transport with an offset and the sync'ed sources - * //will start in the correct position - * source.sync().start(0.1); - * //the source will be invoked with an offset of 0.4 - * Tone.Transport.start("+0.5", 0.5); - */ - Tone.Source.prototype.sync = function () { - this._synced = true; - this._syncedStart = function (time, offset) { - if (offset > 0) { - // get the playback state at that time - var stateEvent = this._state.get(offset); - // listen for start events which may occur in the middle of the sync'ed time - if (stateEvent && stateEvent.state === Tone.State.Started && stateEvent.time !== offset) { - // get the offset - var startOffset = offset - this.toSeconds(stateEvent.time); - var duration; - if (stateEvent.duration) { - duration = this.toSeconds(stateEvent.duration) - startOffset; - } - this._start(time, this.toSeconds(stateEvent.offset) + startOffset, duration); - } - } - }.bind(this); - this._syncedStop = function (time) { - var seconds = Tone.Transport.getSecondsAtTime(Math.max(time - this.sampleTime, 0)); - if (this._state.getValueAtTime(seconds) === Tone.State.Started) { - this._stop(time); - } - }.bind(this); - Tone.Transport.on('start loopStart', this._syncedStart); - Tone.Transport.on('stop pause loopEnd', this._syncedStop); - return this; - }; - /** - * Unsync the source to the Transport. See Tone.Source.sync - * @returns {Tone.Source} this - */ - Tone.Source.prototype.unsync = function () { - if (this._synced) { - Tone.Transport.off('stop pause loopEnd', this._syncedStop); - Tone.Transport.off('start loopStart', this._syncedStart); - } - this._synced = false; - // clear all of the scheduled ids - for (var i = 0; i < this._scheduled.length; i++) { - var id = this._scheduled[i]; - Tone.Transport.clear(id); - } - this._scheduled = []; - this._state.cancel(0); - return this; - }; - /** - * Clean up. - * @return {Tone.Source} this - */ - Tone.Source.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this.unsync(); - this._scheduled = null; - this._writable('volume'); - this._volume.dispose(); - this._volume = null; - this.volume = null; - this._state.dispose(); - this._state = null; - }; - return Tone.Source; - }); - Module(function (Tone) { - /** - * AudioBuffer.copyTo/FromChannel polyfill - * @private - */ - if (Tone.supported) { - if (!AudioBuffer.prototype.copyToChannel) { - AudioBuffer.prototype.copyToChannel = function (src, chanNum, start) { - var channel = this.getChannelData(chanNum); - start = start || 0; - for (var i = 0; i < channel.length; i++) { - channel[i + start] = src[i]; - } - }; - AudioBuffer.prototype.copyFromChannel = function (dest, chanNum, start) { - var channel = this.getChannelData(chanNum); - start = start || 0; - for (var i = 0; i < dest.length; i++) { - dest[i] = channel[i + start]; - } - }; - } - } - }); - Module(function (Tone) { - - /** - * @class Buffer loading and storage. Tone.Buffer is used internally by all - * classes that make requests for audio files such as Tone.Player, - * Tone.Sampler and Tone.Convolver. - * - * Aside from load callbacks from individual buffers, Tone.Buffer - * provides events which keep track of the loading progress - * of _all_ of the buffers. These are Tone.Buffer.on("load" / "progress" / "error") - * - * @constructor - * @extends {Tone} - * @param {AudioBuffer|String} url The url to load, or the audio buffer to set. - * @param {Function=} onload A callback which is invoked after the buffer is loaded. - * It's recommended to use `Tone.Buffer.on('load', callback)` instead - * since it will give you a callback when _all_ buffers are loaded. - * @param {Function=} onerror The callback to invoke if there is an error - * @example - * var buffer = new Tone.Buffer("path/to/sound.mp3", function(){ - * //the buffer is now available. - * var buff = buffer.get(); - * }); - * @example - * //can load provide fallback extension types if the first type is not supported. - * var buffer = new Tone.Buffer("path/to/sound.[mp3|ogg|wav]"); - */ - Tone.Buffer = function () { - var options = Tone.defaults(arguments, [ - 'url', - 'onload', - 'onerror' - ], Tone.Buffer); - Tone.call(this); - /** - * stores the loaded AudioBuffer - * @type {AudioBuffer} - * @private - */ - this._buffer = null; - /** - * indicates if the buffer should be reversed or not - * @type {Boolean} - * @private - */ - this._reversed = options.reverse; - /** - * The XHR - * @type {XMLHttpRequest} - * @private - */ - this._xhr = null; - /** - * Private callback when the buffer is loaded. - * @type {Function} - * @private - */ - this._onload = Tone.noOp; - if (options.url instanceof AudioBuffer || options.url instanceof Tone.Buffer) { - this.set(options.url); - // invoke the onload callback - if (options.onload) { - if (this.loaded) { - options.onload(this); - } else { - this._onload = options.onload; - } - } - } else if (Tone.isString(options.url)) { - this.load(options.url).then(options.onload).catch(options.onerror); - } - }; - Tone.extend(Tone.Buffer); - /** - * the default parameters - * @type {Object} - */ - Tone.Buffer.defaults = { - 'url': undefined, - 'reverse': false, - 'onload': Tone.noOp, - 'onerror': Tone.noOp - }; - /** - * Pass in an AudioBuffer or Tone.Buffer to set the value - * of this buffer. - * @param {AudioBuffer|Tone.Buffer} buffer the buffer - * @returns {Tone.Buffer} this - */ - Tone.Buffer.prototype.set = function (buffer) { - if (buffer instanceof Tone.Buffer) { - if (buffer.loaded) { - this._buffer = buffer.get(); - } else { - buffer._onload = function () { - this.set(buffer); - this._onload(this); - }.bind(this); - } - } else { - this._buffer = buffer; - } - return this; - }; - /** - * @return {AudioBuffer} The audio buffer stored in the object. - */ - Tone.Buffer.prototype.get = function () { - return this._buffer; - }; - /** - * Makes an xhr reqest for the selected url then decodes - * the file as an audio buffer. Invokes - * the callback once the audio buffer loads. - * @param {String} url The url of the buffer to load. - * filetype support depends on the - * browser. - * @returns {Promise} returns a Promise which resolves with the Tone.Buffer - */ - Tone.Buffer.prototype.load = function (url, onload, onerror) { - var promise = new Promise(function (load, error) { - this._xhr = Tone.Buffer.load(url, //success - function (buff) { - this._xhr = null; - this.set(buff); - load(this); - this._onload(this); - if (onload) { - onload(this); - } - }.bind(this), //error - function (err) { - this._xhr = null; - error(err); - if (onerror) { - onerror(err); - } - }.bind(this)); - }.bind(this)); - return promise; - }; - /** - * dispose and disconnect - * @returns {Tone.Buffer} this - */ - Tone.Buffer.prototype.dispose = function () { - Tone.prototype.dispose.call(this); - this._buffer = null; - if (this._xhr) { - Tone.Buffer._removeFromDownloadQueue(this._xhr); - this._xhr.abort(); - this._xhr = null; - } - return this; - }; - /** - * If the buffer is loaded or not - * @memberOf Tone.Buffer# - * @type {Boolean} - * @name loaded - * @readOnly - */ - Object.defineProperty(Tone.Buffer.prototype, 'loaded', { - get: function () { - return this.length > 0; - } - }); - /** - * The duration of the buffer. - * @memberOf Tone.Buffer# - * @type {Number} - * @name duration - * @readOnly - */ - Object.defineProperty(Tone.Buffer.prototype, 'duration', { - get: function () { - if (this._buffer) { - return this._buffer.duration; - } else { - return 0; - } - } - }); - /** - * The length of the buffer in samples - * @memberOf Tone.Buffer# - * @type {Number} - * @name length - * @readOnly - */ - Object.defineProperty(Tone.Buffer.prototype, 'length', { - get: function () { - if (this._buffer) { - return this._buffer.length; - } else { - return 0; - } - } - }); - /** - * The number of discrete audio channels. Returns 0 if no buffer - * is loaded. - * @memberOf Tone.Buffer# - * @type {Number} - * @name numberOfChannels - * @readOnly - */ - Object.defineProperty(Tone.Buffer.prototype, 'numberOfChannels', { - get: function () { - if (this._buffer) { - return this._buffer.numberOfChannels; - } else { - return 0; - } - } - }); - /** - * Set the audio buffer from the array. To create a multichannel AudioBuffer, - * pass in a multidimensional array. - * @param {Float32Array} array The array to fill the audio buffer - * @return {Tone.Buffer} this - */ - Tone.Buffer.prototype.fromArray = function (array) { - var isMultidimensional = array[0].length > 0; - var channels = isMultidimensional ? array.length : 1; - var len = isMultidimensional ? array[0].length : array.length; - var buffer = this.context.createBuffer(channels, len, this.context.sampleRate); - if (!isMultidimensional && channels === 1) { - array = [array]; - } - for (var c = 0; c < channels; c++) { - buffer.copyToChannel(array[c], c); - } - this._buffer = buffer; - return this; - }; - /** - * Sums muliple channels into 1 channel - * @param {Number=} channel Optionally only copy a single channel from the array. - * @return {Array} - */ - Tone.Buffer.prototype.toMono = function (chanNum) { - if (Tone.isNumber(chanNum)) { - this.fromArray(this.toArray(chanNum)); - } else { - var outputArray = new Float32Array(this.length); - var numChannels = this.numberOfChannels; - for (var channel = 0; channel < numChannels; channel++) { - var channelArray = this.toArray(channel); - for (var i = 0; i < channelArray.length; i++) { - outputArray[i] += channelArray[i]; - } - } - //divide by the number of channels - outputArray = outputArray.map(function (sample) { - return sample / numChannels; - }); - this.fromArray(outputArray); - } - return this; - }; - /** - * Get the buffer as an array. Single channel buffers will return a 1-dimensional - * Float32Array, and multichannel buffers will return multidimensional arrays. - * @param {Number=} channel Optionally only copy a single channel from the array. - * @return {Array} - */ - Tone.Buffer.prototype.toArray = function (channel) { - if (Tone.isNumber(channel)) { - return this.getChannelData(channel); - } else if (this.numberOfChannels === 1) { - return this.toArray(0); - } else { - var ret = []; - for (var c = 0; c < this.numberOfChannels; c++) { - ret[c] = this.getChannelData(c); - } - return ret; - } - }; - /** - * Returns the Float32Array representing the PCM audio data for the specific channel. - * @param {Number} channel The channel number to return - * @return {Float32Array} The audio as a TypedArray - */ - Tone.Buffer.prototype.getChannelData = function (channel) { - return this._buffer.getChannelData(channel); - }; - /** - * Cut a subsection of the array and return a buffer of the - * subsection. Does not modify the original buffer - * @param {Time} start The time to start the slice - * @param {Time=} end The end time to slice. If none is given - * will default to the end of the buffer - * @return {Tone.Buffer} this - */ - Tone.Buffer.prototype.slice = function (start, end) { - end = Tone.defaultArg(end, this.duration); - var startSamples = Math.floor(this.context.sampleRate * this.toSeconds(start)); - var endSamples = Math.floor(this.context.sampleRate * this.toSeconds(end)); - var replacement = []; - for (var i = 0; i < this.numberOfChannels; i++) { - replacement[i] = this.toArray(i).slice(startSamples, endSamples); - } - var retBuffer = new Tone.Buffer().fromArray(replacement); - return retBuffer; - }; - /** - * Reverse the buffer. - * @private - * @return {Tone.Buffer} this - */ - Tone.Buffer.prototype._reverse = function () { - if (this.loaded) { - for (var i = 0; i < this.numberOfChannels; i++) { - Array.prototype.reverse.call(this.getChannelData(i)); - } - } - return this; - }; - /** - * Reverse the buffer. - * @memberOf Tone.Buffer# - * @type {Boolean} - * @name reverse - */ - Object.defineProperty(Tone.Buffer.prototype, 'reverse', { - get: function () { - return this._reversed; - }, - set: function (rev) { - if (this._reversed !== rev) { - this._reversed = rev; - this._reverse(); - } - } - }); - /////////////////////////////////////////////////////////////////////////// - // STATIC METHODS - /////////////////////////////////////////////////////////////////////////// - //statically inherits Emitter methods - Tone.Emitter.mixin(Tone.Buffer); - /** - * the static queue for all of the xhr requests - * @type {Array} - * @private - */ - Tone.Buffer._downloadQueue = []; - /** - * A path which is prefixed before every url. - * @type {String} - * @static - */ - Tone.Buffer.baseUrl = ''; - /** - * Create a Tone.Buffer from the array. To create a multichannel AudioBuffer, - * pass in a multidimensional array. - * @param {Float32Array} array The array to fill the audio buffer - * @return {Tone.Buffer} A Tone.Buffer created from the array - */ - Tone.Buffer.fromArray = function (array) { - return new Tone.Buffer().fromArray(array); - }; - /** - * Creates a Tone.Buffer from a URL, returns a promise - * which resolves to a Tone.Buffer - * @param {String} url The url to load. - * @return {Promise<Tone.Buffer>} A promise which resolves to a Tone.Buffer - */ - Tone.Buffer.fromUrl = function (url) { - var buffer = new Tone.Buffer(); - return buffer.load(url).then(function () { - return buffer; - }); - }; - /** - * Remove an xhr request from the download queue - * @private - */ - Tone.Buffer._removeFromDownloadQueue = function (request) { - var index = Tone.Buffer._downloadQueue.indexOf(request); - if (index !== -1) { - Tone.Buffer._downloadQueue.splice(index, 1); - } - }; - /** - * Loads a url using XMLHttpRequest. - * @param {String} url - * @param {Function} onload - * @param {Function} onerror - * @param {Function} onprogress - * @return {XMLHttpRequest} - */ - Tone.Buffer.load = function (url, onload, onerror) { - //default - onload = Tone.defaultArg(onload, Tone.noOp); - // test if the url contains multiple extensions - var matches = url.match(/\[(.+\|?)+\]$/); - if (matches) { - var extensions = matches[1].split('|'); - var extension = extensions[0]; - for (var i = 0; i < extensions.length; i++) { - if (Tone.Buffer.supportsType(extensions[i])) { - extension = extensions[i]; - break; - } - } - url = url.replace(matches[0], extension); - } - function onError(e) { - Tone.Buffer._removeFromDownloadQueue(request); - Tone.Buffer.emit('error', e); - if (onerror) { - onerror(e); - } else { - throw e; - } - } - function onProgress() { - //calculate the progress - var totalProgress = 0; - for (var i = 0; i < Tone.Buffer._downloadQueue.length; i++) { - totalProgress += Tone.Buffer._downloadQueue[i].progress; - } - Tone.Buffer.emit('progress', totalProgress / Tone.Buffer._downloadQueue.length); - } - var request = new XMLHttpRequest(); - request.open('GET', Tone.Buffer.baseUrl + url, true); - request.responseType = 'arraybuffer'; - //start out as 0 - request.progress = 0; - Tone.Buffer._downloadQueue.push(request); - request.addEventListener('load', function () { - if (request.status === 200) { - Tone.context.decodeAudioData(request.response).then(function (buff) { - request.progress = 1; - onProgress(); - onload(buff); - Tone.Buffer._removeFromDownloadQueue(request); - if (Tone.Buffer._downloadQueue.length === 0) { - //emit the event at the end - Tone.Buffer.emit('load'); - } - }).catch(function () { - Tone.Buffer._removeFromDownloadQueue(request); - onError('Tone.Buffer: could not decode audio data: ' + url); - }); - } else { - onError('Tone.Buffer: could not locate file: ' + url); - } - }); - request.addEventListener('error', onError); - request.addEventListener('progress', function (event) { - if (event.lengthComputable) { - //only go to 95%, the last 5% is when the audio is decoded - request.progress = event.loaded / event.total * 0.95; - onProgress(); - } - }); - request.send(); - return request; - }; - /** - * Stop all of the downloads in progress - * @return {Tone.Buffer} - * @static - */ - Tone.Buffer.cancelDownloads = function () { - Tone.Buffer._downloadQueue.slice().forEach(function (request) { - Tone.Buffer._removeFromDownloadQueue(request); - request.abort(); - }); - return Tone.Buffer; - }; - /** - * Checks a url's extension to see if the current browser can play that file type. - * @param {String} url The url/extension to test - * @return {Boolean} If the file extension can be played - * @static - * @example - * Tone.Buffer.supportsType("wav"); //returns true - * Tone.Buffer.supportsType("path/to/file.wav"); //returns true - */ - Tone.Buffer.supportsType = function (url) { - var extension = url.split('.'); - extension = extension[extension.length - 1]; - var response = document.createElement('audio').canPlayType('audio/' + extension); - return response !== ''; - }; - /** - * Returns a Promise which resolves when all of the buffers have loaded - * @return {Promise} - */ - Tone.loaded = function () { - var onload, onerror; - function removeEvents() { - //remove the events when it's resolved - Tone.Buffer.off('load', onload); - Tone.Buffer.off('error', onerror); - } - return new Promise(function (success, fail) { - onload = function () { - success(); - }; - onerror = function () { - fail(); - }; - //add the event listeners - Tone.Buffer.on('load', onload); - Tone.Buffer.on('error', onerror); - }).then(removeEvents).catch(function (e) { - removeEvents(); - throw new Error(e); - }); - }; - return Tone.Buffer; - }); - Module(function (Tone) { - /** - * @class Wrapper around the native fire-and-forget OscillatorNode. Adds the - * ability to reschedule the stop method. - * @extends {Tone.AudioNode} - * @param {AudioBuffer|Tone.Buffer} buffer The buffer to play - * @param {Function} onload The callback to invoke when the - * buffer is done playing. - */ - Tone.OscillatorNode = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'type' - ], Tone.OscillatorNode); - Tone.AudioNode.call(this, options); - /** - * The callback to invoke after the - * buffer source is done playing. - * @type {Function} - */ - this.onended = options.onended; - /** - * The oscillator start time - * @type {Number} - * @private - */ - this._startTime = -1; - /** - * The oscillator stop time - * @type {Number} - * @private - */ - this._stopTime = -1; - /** - * The gain node which envelopes the OscillatorNode - * @type {Tone.Gain} - * @private - */ - this._gainNode = this.output = new Tone.Gain(); - this._gainNode.gain.setValueAtTime(0, this.context.currentTime); - /** - * The oscillator - * @type {OscillatorNode} - * @private - */ - this._oscillator = this.context.createOscillator(); - this._oscillator.connect(this._gainNode); - this.type = options.type; - /** - * The frequency of the oscillator - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Param(this._oscillator.frequency, Tone.Type.Frequency); - this.frequency.value = options.frequency; - /** - * The detune of the oscillator - * @type {Frequency} - * @signal - */ - this.detune = new Tone.Param(this._oscillator.detune, Tone.Type.Cents); - this.detune.value = options.detune; - /** - * The value that the buffer ramps to - * @type {Gain} - * @private - */ - this._gain = 1; - }; - Tone.extend(Tone.OscillatorNode, Tone.AudioNode); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.OscillatorNode.defaults = { - 'frequency': 440, - 'detune': 0, - 'type': 'sine', - 'onended': Tone.noOp - }; - /** - * Returns the playback state of the oscillator, either "started" or "stopped". - * @type {Tone.State} - * @readOnly - * @memberOf Tone.OscillatorNode# - * @name state - */ - Object.defineProperty(Tone.OscillatorNode.prototype, 'state', { - get: function () { - return this.getStateAtTime(this.now()); - } - }); - /** - * Get the playback state at the given time - * @param {Time} time The time to test the state at - * @return {Tone.State} The playback state. - */ - Tone.OscillatorNode.prototype.getStateAtTime = function (time) { - time = this.toSeconds(time); - if (this._startTime !== -1 && time >= this._startTime && (this._stopTime === -1 || time <= this._stopTime)) { - return Tone.State.Started; - } else { - return Tone.State.Stopped; - } - }; - /** - * Start the oscillator node at the given time - * @param {Time=} time When to start the oscillator - * @return {OscillatorNode} this - */ - Tone.OscillatorNode.prototype.start = function (time) { - if (this._startTime === -1) { - this._startTime = this.toSeconds(time); - this._oscillator.start(this._startTime); - var now = this.context.currentTime; - this._gainNode.gain.cancelScheduledValues(now); - this._gainNode.gain.setValueAtTime(0, now); - this._gainNode.gain.setValueAtTime(1, this._startTime); - } else { - throw new Error('cannot call OscillatorNode.start more than once'); - } - return this; - }; - /** - * Sets an arbitrary custom periodic waveform given a PeriodicWave. - * @param {PeriodicWave} periodicWave PeriodicWave should be created with context.createPeriodicWave - * @return {OscillatorNode} this - */ - Tone.OscillatorNode.prototype.setPeriodicWave = function (periodicWave) { - this._oscillator.setPeriodicWave(periodicWave); - return this; - }; - /** - * Stop the oscillator node at the given time - * @param {Time=} time When to stop the oscillator - * @return {OscillatorNode} this - */ - Tone.OscillatorNode.prototype.stop = function (time) { - //cancel the previous stop - this.cancelStop(); - //reschedule it - this._stopTime = this.toSeconds(time); - this._gainNode.gain.setValueAtTime(0, this._stopTime); - this.context.clearTimeout(this._timeout); - this._timeout = this.context.setTimeout(function () { - this._oscillator.stop(this.now()); - this.onended(); - }.bind(this), this._stopTime - this.now()); - return this; - }; - /** - * Cancel a scheduled stop event - * @return {Tone.OscillatorNode} this - */ - Tone.OscillatorNode.prototype.cancelStop = function () { - if (this._startTime !== -1) { - //cancel the stop envelope - this._gainNode.gain.cancelScheduledValues(this._startTime + this.sampleTime); - this._gainNode.gain.setValueAtTime(1, Math.max(this.now(), this._startTime)); - this.context.clearTimeout(this._timeout); - this._stopTime = -1; - } - return this; - }; - /** - * The oscillator type. Either 'sine', 'sawtooth', 'square', or 'triangle' - * @memberOf Tone.OscillatorNode# - * @type {Time} - * @name type - */ - Object.defineProperty(Tone.OscillatorNode.prototype, 'type', { - get: function () { - return this._oscillator.type; - }, - set: function (type) { - this._oscillator.type = type; - } - }); - /** - * Clean up. - * @return {Tone.OscillatorNode} this - */ - Tone.OscillatorNode.prototype.dispose = function () { - this.context.clearTimeout(this._timeout); - Tone.AudioNode.prototype.dispose.call(this); - this.onended = null; - this._oscillator.disconnect(); - this._oscillator = null; - this._gainNode.dispose(); - this._gainNode = null; - this.frequency.dispose(); - this.frequency = null; - this.detune.dispose(); - this.detune = null; - return this; - }; - return Tone.OscillatorNode; - }); - Module(function (Tone) { - - /** - * @class Tone.Oscillator supports a number of features including - * phase rotation, multiple oscillator types (see Tone.Oscillator.type), - * and Transport syncing (see Tone.Oscillator.syncFrequency). - * - * @constructor - * @extends {Tone.Source} - * @param {Frequency} [frequency] Starting frequency - * @param {string} [type] The oscillator type. Read more about type below. - * @example - * //make and start a 440hz sine tone - * var osc = new Tone.Oscillator(440, "sine").toMaster().start(); - */ - Tone.Oscillator = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'type' - ], Tone.Oscillator); - Tone.Source.call(this, options); - /** - * the main oscillator - * @type {OscillatorNode} - * @private - */ - this._oscillator = null; - /** - * The frequency control. - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency); - /** - * The detune control signal. - * @type {Cents} - * @signal - */ - this.detune = new Tone.Signal(options.detune, Tone.Type.Cents); - /** - * the periodic wave - * @type {PeriodicWave} - * @private - */ - this._wave = null; - /** - * The partials of the oscillator - * @type {Array} - * @private - */ - this._partials = Tone.defaultArg(options.partials, [1]); - /** - * the phase of the oscillator - * between 0 - 360 - * @type {number} - * @private - */ - this._phase = options.phase; - /** - * the type of the oscillator - * @type {string} - * @private - */ - this._type = null; - //setup - this.type = options.type; - this.phase = this._phase; - this._readOnly([ - 'frequency', - 'detune' - ]); - }; - Tone.extend(Tone.Oscillator, Tone.Source); - /** - * the default parameters - * @type {Object} - */ - Tone.Oscillator.defaults = { - 'type': 'sine', - 'frequency': 440, - 'detune': 0, - 'phase': 0, - 'partials': [] - }; - /** - * The Oscillator types - * @enum {String} - */ - Tone.Oscillator.Type = { - Sine: 'sine', - Triangle: 'triangle', - Sawtooth: 'sawtooth', - Square: 'square', - Custom: 'custom' - }; - /** - * start the oscillator - * @param {Time} [time=now] - * @private - */ - Tone.Oscillator.prototype._start = function (time) { - //new oscillator with previous values - this._oscillator = new Tone.OscillatorNode(); - if (this._wave) { - this._oscillator.setPeriodicWave(this._wave); - } else { - this._oscillator.type = this._type; - } - //connect the control signal to the oscillator frequency & detune - this._oscillator.connect(this.output); - this.frequency.connect(this._oscillator.frequency); - this.detune.connect(this._oscillator.detune); - //start the oscillator - time = this.toSeconds(time); - this._oscillator.start(time); - }; - /** - * stop the oscillator - * @private - * @param {Time} [time=now] (optional) timing parameter - * @returns {Tone.Oscillator} this - */ - Tone.Oscillator.prototype._stop = function (time) { - if (this._oscillator) { - time = this.toSeconds(time); - this._oscillator.stop(time); - } - return this; - }; - /** - * Restart the oscillator. Does not stop the oscillator, but instead - * just cancels any scheduled 'stop' from being invoked. - * @param {Time=} time - * @return {Tone.Oscillator} this - */ - Tone.Oscillator.prototype.restart = function (time) { - this._oscillator.cancelStop(); - this._state.cancel(this.toSeconds(time)); - return this; - }; - /** - * Sync the signal to the Transport's bpm. Any changes to the transports bpm, - * will also affect the oscillators frequency. - * @returns {Tone.Oscillator} this - * @example - * Tone.Transport.bpm.value = 120; - * osc.frequency.value = 440; - * //the ration between the bpm and the frequency will be maintained - * osc.syncFrequency(); - * Tone.Transport.bpm.value = 240; - * // the frequency of the oscillator is doubled to 880 - */ - Tone.Oscillator.prototype.syncFrequency = function () { - Tone.Transport.syncSignal(this.frequency); - return this; - }; - /** - * Unsync the oscillator's frequency from the Transport. - * See Tone.Oscillator.syncFrequency - * @returns {Tone.Oscillator} this - */ - Tone.Oscillator.prototype.unsyncFrequency = function () { - Tone.Transport.unsyncSignal(this.frequency); - return this; - }; - /** - * The type of the oscillator: either sine, square, triangle, or sawtooth. Also capable of - * setting the first x number of partials of the oscillator. For example: "sine4" would - * set be the first 4 partials of the sine wave and "triangle8" would set the first - * 8 partials of the triangle wave. - * <br><br> - * Uses PeriodicWave internally even for native types so that it can set the phase. - * PeriodicWave equations are from the - * [Webkit Web Audio implementation](https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/modules/webaudio/PeriodicWave.cpp&sq=package:chromium). - * - * @memberOf Tone.Oscillator# - * @type {string} - * @name type - * @example - * //set it to a square wave - * osc.type = "square"; - * @example - * //set the first 6 partials of a sawtooth wave - * osc.type = "sawtooth6"; - */ - Object.defineProperty(Tone.Oscillator.prototype, 'type', { - get: function () { - return this._type; - }, - set: function (type) { - var isBasicType = [ - Tone.Oscillator.Type.Sine, - Tone.Oscillator.Type.Square, - Tone.Oscillator.Type.Triangle, - Tone.Oscillator.Type.Sawtooth - ].includes(type); - if (this._phase === 0 && isBasicType) { - this._wave = null; - //just go with the basic approach - if (this._oscillator !== null) { - this._oscillator.type === type; - } - } else { - var coefs = this._getRealImaginary(type, this._phase); - var periodicWave = this.context.createPeriodicWave(coefs[0], coefs[1]); - this._wave = periodicWave; - if (this._oscillator !== null) { - this._oscillator.setPeriodicWave(this._wave); - } - } - this._type = type; - } - }); - /** - * Returns the real and imaginary components based - * on the oscillator type. - * @returns {Array} [real, imaginary] - * @private - */ - Tone.Oscillator.prototype._getRealImaginary = function (type, phase) { - var fftSize = 4096; - var periodicWaveSize = fftSize / 2; - var real = new Float32Array(periodicWaveSize); - var imag = new Float32Array(periodicWaveSize); - var partialCount = 1; - if (type === Tone.Oscillator.Type.Custom) { - partialCount = this._partials.length + 1; - periodicWaveSize = partialCount; - } else { - var partial = /^(sine|triangle|square|sawtooth)(\d+)$/.exec(type); - if (partial) { - partialCount = parseInt(partial[2]) + 1; - type = partial[1]; - partialCount = Math.max(partialCount, 2); - periodicWaveSize = partialCount; - } - } - for (var n = 1; n < periodicWaveSize; ++n) { - var piFactor = 2 / (n * Math.PI); - var b; - switch (type) { - case Tone.Oscillator.Type.Sine: - b = n <= partialCount ? 1 : 0; - break; - case Tone.Oscillator.Type.Square: - b = n & 1 ? 2 * piFactor : 0; - break; - case Tone.Oscillator.Type.Sawtooth: - b = piFactor * (n & 1 ? 1 : -1); - break; - case Tone.Oscillator.Type.Triangle: - if (n & 1) { - b = 2 * (piFactor * piFactor) * (n - 1 >> 1 & 1 ? -1 : 1); - } else { - b = 0; - } - break; - case Tone.Oscillator.Type.Custom: - b = this._partials[n - 1]; - break; - default: - throw new TypeError('Tone.Oscillator: invalid type: ' + type); - } - if (b !== 0) { - real[n] = -b * Math.sin(phase * n); - imag[n] = b * Math.cos(phase * n); - } else { - real[n] = 0; - imag[n] = 0; - } - } - return [ - real, - imag - ]; - }; - /** - * Compute the inverse FFT for a given phase. - * @param {Float32Array} real - * @param {Float32Array} imag - * @param {NormalRange} phase - * @return {AudioRange} - * @private - */ - Tone.Oscillator.prototype._inverseFFT = function (real, imag, phase) { - var sum = 0; - var len = real.length; - for (var i = 0; i < len; i++) { - sum += real[i] * Math.cos(i * phase) + imag[i] * Math.sin(i * phase); - } - return sum; - }; - /** - * Returns the initial value of the oscillator. - * @return {AudioRange} - * @private - */ - Tone.Oscillator.prototype._getInitialValue = function () { - var coefs = this._getRealImaginary(this._type, 0); - var real = coefs[0]; - var imag = coefs[1]; - var maxValue = 0; - var twoPi = Math.PI * 2; - //check for peaks in 8 places - for (var i = 0; i < 8; i++) { - maxValue = Math.max(this._inverseFFT(real, imag, i / 8 * twoPi), maxValue); - } - return -this._inverseFFT(real, imag, this._phase) / maxValue; - }; - /** - * The partials of the waveform. A partial represents - * the amplitude at a harmonic. The first harmonic is the - * fundamental frequency, the second is the octave and so on - * following the harmonic series. - * Setting this value will automatically set the type to "custom". - * The value is an empty array when the type is not "custom". - * @memberOf Tone.Oscillator# - * @type {Array} - * @name partials - * @example - * osc.partials = [1, 0.2, 0.01]; - */ - Object.defineProperty(Tone.Oscillator.prototype, 'partials', { - get: function () { - if (this._type !== Tone.Oscillator.Type.Custom) { - return []; - } else { - return this._partials; - } - }, - set: function (partials) { - this._partials = partials; - this.type = Tone.Oscillator.Type.Custom; - } - }); - /** - * The phase of the oscillator in degrees. - * @memberOf Tone.Oscillator# - * @type {Degrees} - * @name phase - * @example - * osc.phase = 180; //flips the phase of the oscillator - */ - Object.defineProperty(Tone.Oscillator.prototype, 'phase', { - get: function () { - return this._phase * (180 / Math.PI); - }, - set: function (phase) { - this._phase = phase * Math.PI / 180; - //reset the type - this.type = this._type; - } - }); - /** - * Dispose and disconnect. - * @return {Tone.Oscillator} this - */ - Tone.Oscillator.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - if (this._oscillator !== null) { - this._oscillator.dispose(); - this._oscillator = null; - } - this._wave = null; - this._writable([ - 'frequency', - 'detune' - ]); - this.frequency.dispose(); - this.frequency = null; - this.detune.dispose(); - this.detune = null; - this._partials = null; - return this; - }; - return Tone.Oscillator; - }); - Module(function (Tone) { - - /** - * @class AudioToGain converts an input in AudioRange [-1,1] to NormalRange [0,1]. - * See Tone.GainToAudio. - * - * @extends {Tone.SignalBase} - * @constructor - * @example - * var a2g = new Tone.AudioToGain(); - */ - Tone.AudioToGain = function () { - Tone.SignalBase.call(this); - /** - * @type {WaveShaperNode} - * @private - */ - this._norm = this.input = this.output = new Tone.WaveShaper(function (x) { - return (x + 1) / 2; - }); - }; - Tone.extend(Tone.AudioToGain, Tone.SignalBase); - /** - * clean up - * @returns {Tone.AudioToGain} this - */ - Tone.AudioToGain.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._norm.dispose(); - this._norm = null; - return this; - }; - return Tone.AudioToGain; - }); - Module(function (Tone) { - /** - * @class Tone.Zero outputs 0's at audio-rate. The reason this has to be - * it's own class is that many browsers optimize out Tone.Signal - * with a value of 0 and will not process nodes further down the graph. - * @extends {Tone.SignalBase} - */ - Tone.Zero = function () { - Tone.SignalBase.call(this); - /** - * The gain node - * @type {Tone.Gain} - * @private - */ - this._gain = this.input = this.output = new Tone.Gain(); - this.context.getConstant(0).connect(this._gain); - }; - Tone.extend(Tone.Zero, Tone.SignalBase); - /** - * clean up - * @return {Tone.Zero} this - */ - Tone.Zero.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._gain.dispose(); - this._gain = null; - return this; - }; - return Tone.Zero; - }); - Module(function (Tone) { - - /** - * @class LFO stands for low frequency oscillator. Tone.LFO produces an output signal - * which can be attached to an AudioParam or Tone.Signal - * in order to modulate that parameter with an oscillator. The LFO can - * also be synced to the transport to start/stop and change when the tempo changes. - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Frequency|Object} [frequency] The frequency of the oscillation. Typically, LFOs will be - * in the frequency range of 0.1 to 10 hertz. - * @param {number=} min The minimum output value of the LFO. - * @param {number=} max The maximum value of the LFO. - * @example - * var lfo = new Tone.LFO("4n", 400, 4000); - * lfo.connect(filter.frequency); - */ - Tone.LFO = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'min', - 'max' - ], Tone.LFO); - Tone.AudioNode.call(this); - /** - * The oscillator. - * @type {Tone.Oscillator} - * @private - */ - this._oscillator = new Tone.Oscillator({ - 'frequency': options.frequency, - 'type': options.type - }); - /** - * the lfo's frequency - * @type {Frequency} - * @signal - */ - this.frequency = this._oscillator.frequency; - /** - * The amplitude of the LFO, which controls the output range between - * the min and max output. For example if the min is -10 and the max - * is 10, setting the amplitude to 0.5 would make the LFO modulate - * between -5 and 5. - * @type {Number} - * @signal - */ - this.amplitude = this._oscillator.volume; - this.amplitude.units = Tone.Type.NormalRange; - this.amplitude.value = options.amplitude; - /** - * The signal which is output when the LFO is stopped - * @type {Tone.Signal} - * @private - */ - this._stoppedSignal = new Tone.Signal(0, Tone.Type.AudioRange); - /** - * Just outputs zeros. - * @type {Tone.Zero} - * @private - */ - this._zeros = new Tone.Zero(); - /** - * The value that the LFO outputs when it's stopped - * @type {AudioRange} - * @private - */ - this._stoppedValue = 0; - /** - * @type {Tone.AudioToGain} - * @private - */ - this._a2g = new Tone.AudioToGain(); - /** - * @type {Tone.Scale} - * @private - */ - this._scaler = this.output = new Tone.Scale(options.min, options.max); - /** - * the units of the LFO (used for converting) - * @type {Tone.Type} - * @private - */ - this._units = Tone.Type.Default; - this.units = options.units; - //connect it up - this._oscillator.chain(this._a2g, this._scaler); - this._zeros.connect(this._a2g); - this._stoppedSignal.connect(this._a2g); - this._readOnly([ - 'amplitude', - 'frequency' - ]); - this.phase = options.phase; - }; - Tone.extend(Tone.LFO, Tone.AudioNode); - /** - * the default parameters - * - * @static - * @const - * @type {Object} - */ - Tone.LFO.defaults = { - 'type': 'sine', - 'min': 0, - 'max': 1, - 'phase': 0, - 'frequency': '4n', - 'amplitude': 1, - 'units': Tone.Type.Default - }; - /** - * Start the LFO. - * @param {Time} [time=now] the time the LFO will start - * @returns {Tone.LFO} this - */ - Tone.LFO.prototype.start = function (time) { - time = this.toSeconds(time); - this._stoppedSignal.setValueAtTime(0, time); - this._oscillator.start(time); - return this; - }; - /** - * Stop the LFO. - * @param {Time} [time=now] the time the LFO will stop - * @returns {Tone.LFO} this - */ - Tone.LFO.prototype.stop = function (time) { - time = this.toSeconds(time); - this._stoppedSignal.setValueAtTime(this._stoppedValue, time); - this._oscillator.stop(time); - return this; - }; - /** - * Sync the start/stop/pause to the transport - * and the frequency to the bpm of the transport - * @returns {Tone.LFO} this - * @example - * lfo.frequency.value = "8n"; - * lfo.sync().start(0) - * //the rate of the LFO will always be an eighth note, - * //even as the tempo changes - */ - Tone.LFO.prototype.sync = function () { - this._oscillator.sync(); - this._oscillator.syncFrequency(); - return this; - }; - /** - * unsync the LFO from transport control - * @returns {Tone.LFO} this - */ - Tone.LFO.prototype.unsync = function () { - this._oscillator.unsync(); - this._oscillator.unsyncFrequency(); - return this; - }; - /** - * The miniumum output of the LFO. - * @memberOf Tone.LFO# - * @type {number} - * @name min - */ - Object.defineProperty(Tone.LFO.prototype, 'min', { - get: function () { - return this._toUnits(this._scaler.min); - }, - set: function (min) { - min = this._fromUnits(min); - this._scaler.min = min; - } - }); - /** - * The maximum output of the LFO. - * @memberOf Tone.LFO# - * @type {number} - * @name max - */ - Object.defineProperty(Tone.LFO.prototype, 'max', { - get: function () { - return this._toUnits(this._scaler.max); - }, - set: function (max) { - max = this._fromUnits(max); - this._scaler.max = max; - } - }); - /** - * The type of the oscillator: sine, square, sawtooth, triangle. - * @memberOf Tone.LFO# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.LFO.prototype, 'type', { - get: function () { - return this._oscillator.type; - }, - set: function (type) { - this._oscillator.type = type; - this._stoppedValue = this._oscillator._getInitialValue(); - this._stoppedSignal.value = this._stoppedValue; - } - }); - /** - * The phase of the LFO. - * @memberOf Tone.LFO# - * @type {number} - * @name phase - */ - Object.defineProperty(Tone.LFO.prototype, 'phase', { - get: function () { - return this._oscillator.phase; - }, - set: function (phase) { - this._oscillator.phase = phase; - this._stoppedValue = this._oscillator._getInitialValue(); - this._stoppedSignal.value = this._stoppedValue; - } - }); - /** - * The output units of the LFO. - * @memberOf Tone.LFO# - * @type {Tone.Type} - * @name units - */ - Object.defineProperty(Tone.LFO.prototype, 'units', { - get: function () { - return this._units; - }, - set: function (val) { - var currentMin = this.min; - var currentMax = this.max; - //convert the min and the max - this._units = val; - this.min = currentMin; - this.max = currentMax; - } - }); - /** - * Mute the output. - * @memberOf Tone.LFO# - * @type {Boolean} - * @name mute - */ - Object.defineProperty(Tone.LFO.prototype, 'mute', { - get: function () { - return this._oscillator.mute; - }, - set: function (mute) { - this._oscillator.mute = mute; - } - }); - /** - * Returns the playback state of the source, either "started" or "stopped". - * @type {Tone.State} - * @readOnly - * @memberOf Tone.LFO# - * @name state - */ - Object.defineProperty(Tone.LFO.prototype, 'state', { - get: function () { - return this._oscillator.state; - } - }); - /** - * Connect the output of the LFO to an AudioParam, AudioNode, or Tone Node. - * Tone.LFO will automatically convert to the destination units of the - * will get the units from the connected node. - * @param {Tone | AudioParam | AudioNode} node - * @param {number} [outputNum=0] optionally which output to connect from - * @param {number} [inputNum=0] optionally which input to connect to - * @returns {Tone.LFO} this - * @private - */ - Tone.LFO.prototype.connect = function (node) { - if (node.constructor === Tone.Signal || node.constructor === Tone.Param) { - this.convert = node.convert; - this.units = node.units; - } - Tone.SignalBase.prototype.connect.apply(this, arguments); - return this; - }; - /** - * private method borrowed from Param converts - * units from their destination value - * @function - * @private - */ - Tone.LFO.prototype._fromUnits = Tone.Param.prototype._fromUnits; - /** - * private method borrowed from Param converts - * units to their destination value - * @function - * @private - */ - Tone.LFO.prototype._toUnits = Tone.Param.prototype._toUnits; - /** - * disconnect and dispose - * @returns {Tone.LFO} this - */ - Tone.LFO.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable([ - 'amplitude', - 'frequency' - ]); - this._oscillator.dispose(); - this._oscillator = null; - this._stoppedSignal.dispose(); - this._stoppedSignal = null; - this._zeros.dispose(); - this._zeros = null; - this._scaler.dispose(); - this._scaler = null; - this._a2g.dispose(); - this._a2g = null; - this.frequency = null; - this.amplitude = null; - return this; - }; - return Tone.LFO; - }); - Module(function (Tone) { - - /** - * @class Tone.Limiter will limit the loudness of an incoming signal. - * It is composed of a Tone.Compressor with a fast attack - * and release. Limiters are commonly used to safeguard against - * signal clipping. Unlike a compressor, limiters do not provide - * smooth gain reduction and almost completely prevent - * additional gain above the threshold. - * - * @extends {Tone.AudioNode} - * @constructor - * @param {number} threshold The theshold above which the limiting is applied. - * @example - * var limiter = new Tone.Limiter(-6); - */ - Tone.Limiter = function () { - var options = Tone.defaults(arguments, ['threshold'], Tone.Limiter); - Tone.AudioNode.call(this); - /** - * the compressor - * @private - * @type {Tone.Compressor} - */ - this._compressor = this.input = this.output = new Tone.Compressor({ - 'attack': 0.001, - 'decay': 0.001, - 'threshold': options.threshold - }); - /** - * The threshold of of the limiter - * @type {Decibel} - * @signal - */ - this.threshold = this._compressor.threshold; - this._readOnly('threshold'); - }; - Tone.extend(Tone.Limiter, Tone.AudioNode); - /** - * The default value - * @type {Object} - * @const - * @static - */ - Tone.Limiter.defaults = { 'threshold': -12 }; - /** - * Clean up. - * @returns {Tone.Limiter} this - */ - Tone.Limiter.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._compressor.dispose(); - this._compressor = null; - this._writable('threshold'); - this.threshold = null; - return this; - }; - return Tone.Limiter; - }); - Module(function (Tone) { - - /** - * @class Tone.Lowpass is a lowpass feedback comb filter. It is similar to - * Tone.FeedbackCombFilter, but includes a lowpass filter. - * - * @extends {Tone.AudioNode} - * @constructor - * @param {Time|Object} [delayTime] The delay time of the comb filter - * @param {NormalRange=} resonance The resonance (feedback) of the comb filter - * @param {Frequency=} dampening The cutoff of the lowpass filter dampens the - * signal as it is fedback. - */ - Tone.LowpassCombFilter = function () { - var options = Tone.defaults(arguments, [ - 'delayTime', - 'resonance', - 'dampening' - ], Tone.LowpassCombFilter); - Tone.AudioNode.call(this); - this.createInsOuts(1, 1); - /** - * the delay node - * @type {DelayNode} - * @private - */ - this._delay = this.input = new Tone.Delay(options.delayTime); - /** - * The delayTime of the comb filter. - * @type {Time} - * @signal - */ - this.delayTime = this._delay.delayTime; - /** - * the lowpass filter - * @type {BiquadFilterNode} - * @private - */ - this._lowpass = this.output = this.context.createBiquadFilter(); - this._lowpass.Q.value = -3.0102999566398125; - this._lowpass.type = 'lowpass'; - /** - * The dampening control of the feedback - * @type {Frequency} - * @signal - */ - this.dampening = new Tone.Param({ - 'param': this._lowpass.frequency, - 'units': Tone.Type.Frequency, - 'value': options.dampening - }); - /** - * the feedback gain - * @type {Tone.Gain} - * @private - */ - this._feedback = new Tone.Gain(options.resonance, Tone.Type.NormalRange); - /** - * The amount of feedback of the delayed signal. - * @type {NormalRange} - * @signal - */ - this.resonance = this._feedback.gain; - //connections - this._delay.chain(this._lowpass, this._feedback, this._delay); - this._readOnly([ - 'dampening', - 'resonance', - 'delayTime' - ]); - }; - Tone.extend(Tone.LowpassCombFilter, Tone.AudioNode); - /** - * the default parameters - * @static - * @const - * @type {Object} - */ - Tone.LowpassCombFilter.defaults = { - 'delayTime': 0.1, - 'resonance': 0.5, - 'dampening': 3000 - }; - /** - * Clean up. - * @returns {Tone.LowpassCombFilter} this - */ - Tone.LowpassCombFilter.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable([ - 'dampening', - 'resonance', - 'delayTime' - ]); - this.dampening.dispose(); - this.dampening = null; - this.resonance.dispose(); - this.resonance = null; - this._delay.dispose(); - this._delay = null; - this.delayTime = null; - this._lowpass.disconnect(); - this._lowpass = null; - this._feedback.disconnect(); - this._feedback = null; - return this; - }; - return Tone.LowpassCombFilter; - }); - Module(function (Tone) { - - /** - * @class Tone.Merge brings two signals into the left and right - * channels of a single stereo channel. - * - * @constructor - * @extends {Tone.AudioNode} - * @example - * var merge = new Tone.Merge().toMaster(); - * //routing a sine tone in the left channel - * //and noise in the right channel - * var osc = new Tone.Oscillator().connect(merge.left); - * var noise = new Tone.Noise().connect(merge.right); - * //starting our oscillators - * noise.start(); - * osc.start(); - */ - Tone.Merge = function () { - Tone.AudioNode.call(this); - this.createInsOuts(2, 0); - /** - * The left input channel. - * Alias for <code>input[0]</code> - * @type {GainNode} - */ - this.left = this.input[0] = new Tone.Gain(); - /** - * The right input channel. - * Alias for <code>input[1]</code>. - * @type {GainNode} - */ - this.right = this.input[1] = new Tone.Gain(); - /** - * the merger node for the two channels - * @type {ChannelMergerNode} - * @private - */ - this._merger = this.output = this.context.createChannelMerger(2); - //connections - this.left.connect(this._merger, 0, 0); - this.right.connect(this._merger, 0, 1); - this.left.channelCount = 1; - this.right.channelCount = 1; - this.left.channelCountMode = 'explicit'; - this.right.channelCountMode = 'explicit'; - }; - Tone.extend(Tone.Merge, Tone.AudioNode); - /** - * Clean up. - * @returns {Tone.Merge} this - */ - Tone.Merge.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this.left.dispose(); - this.left = null; - this.right.dispose(); - this.right = null; - this._merger.disconnect(); - this._merger = null; - return this; - }; - return Tone.Merge; - }); - Module(function (Tone) { - - /** - * @class Tone.Meter gets the [RMS](https://en.wikipedia.org/wiki/Root_mean_square) - * of an input signal with some averaging applied. It can also get the raw - * value of the input signal. - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Number} smoothing The amount of smoothing applied between frames. - * @example - * var meter = new Tone.Meter(); - * var mic = new Tone.UserMedia().open(); - * //connect mic to the meter - * mic.connect(meter); - * //the current level of the mic input in decibels - * var level = meter.getValue(); - */ - Tone.Meter = function () { - var options = Tone.defaults(arguments, ['smoothing'], Tone.Meter); - Tone.AudioNode.call(this); - /** - * The analyser node which computes the levels. - * @private - * @type {Tone.Analyser} - */ - this.input = this.output = this._analyser = new Tone.Analyser('waveform', 1024); - /** - * The amount of carryover between the current and last frame. - * Only applied meter for "level" type. - * @type {Number} - */ - this.smoothing = options.smoothing; - }; - Tone.extend(Tone.Meter, Tone.AudioNode); - /** - * The defaults - * @type {Object} - * @static - * @const - */ - Tone.Meter.defaults = { 'smoothing': 0.8 }; - /** - * Get the current decibel value of the incoming signal - * @returns {Decibels} - */ - Tone.Meter.prototype.getLevel = function () { - this._analyser.type = 'fft'; - var values = this._analyser.getValue(); - var offset = 28; - // normalizes most signal levels - // TODO: compute loudness from FFT - return Math.max.apply(this, values) + offset; - }; - /** - * Get the signal value of the incoming signal - * @returns {Number} - */ - Tone.Meter.prototype.getValue = function () { - this._analyser.type = 'waveform'; - var value = this._analyser.getValue(); - return value[0]; - }; - /** - * A value from 0 -> 1 where 0 represents no time averaging with the last analysis frame. - * @memberOf Tone.Meter# - * @type {Number} - * @name smoothing - * @readOnly - */ - Object.defineProperty(Tone.Meter.prototype, 'smoothing', { - get: function () { - return this._analyser.smoothing; - }, - set: function (val) { - this._analyser.smoothing = val; - } - }); - /** - * Clean up. - * @returns {Tone.Meter} this - */ - Tone.Meter.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._analyser.dispose(); - this._analyser = null; - return this; - }; - return Tone.Meter; - }); - Module(function (Tone) { - - /** - * @class Tone.Split splits an incoming signal into left and right channels. - * - * @constructor - * @extends {Tone.AudioNode} - * @example - * var split = new Tone.Split(); - * stereoSignal.connect(split); - */ - Tone.Split = function () { - Tone.AudioNode.call(this); - this.createInsOuts(0, 2); - /** - * @type {ChannelSplitterNode} - * @private - */ - this._splitter = this.input = this.context.createChannelSplitter(2); - this._splitter.channelCount = 2; - this._splitter.channelCountMode = 'explicit'; - /** - * Left channel output. - * Alias for <code>output[0]</code> - * @type {Tone.Gain} - */ - this.left = this.output[0] = new Tone.Gain(); - /** - * Right channel output. - * Alias for <code>output[1]</code> - * @type {Tone.Gain} - */ - this.right = this.output[1] = new Tone.Gain(); - //connections - this._splitter.connect(this.left, 0, 0); - this._splitter.connect(this.right, 1, 0); - }; - Tone.extend(Tone.Split, Tone.AudioNode); - /** - * Clean up. - * @returns {Tone.Split} this - */ - Tone.Split.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._splitter.disconnect(); - this.left.dispose(); - this.left = null; - this.right.dispose(); - this.right = null; - this._splitter = null; - return this; - }; - return Tone.Split; - }); - Module(function (Tone) { - - /** - * @class Mid/Side processing separates the the 'mid' signal - * (which comes out of both the left and the right channel) - * and the 'side' (which only comes out of the the side channels). <br><br> - * <code> - * Mid = (Left+Right)/sqrt(2); // obtain mid-signal from left and right<br> - * Side = (Left-Right)/sqrt(2); // obtain side-signal from left and righ<br> - * </code> - * - * @extends {Tone.AudioNode} - * @constructor - */ - Tone.MidSideSplit = function () { - Tone.AudioNode.call(this); - this.createInsOuts(0, 2); - /** - * split the incoming signal into left and right channels - * @type {Tone.Split} - * @private - */ - this._split = this.input = new Tone.Split(); - /** - * The mid send. Connect to mid processing. Alias for - * <code>output[0]</code> - * @type {Tone.Add} - */ - this._midAdd = new Tone.Add(); - /** - * Multiply the _midAdd by sqrt(1/2) - * @type {Tone.Multiply} - */ - this.mid = this.output[0] = new Tone.Multiply(Math.SQRT1_2); - /** - * The side output. Connect to side processing. Also Output 1 - * @type {Tone.Subtract} - */ - this._sideSubtract = new Tone.Subtract(); - /** - * Multiply the _midAdd by sqrt(1/2) - * @type {Tone.Multiply} - */ - this.side = this.output[1] = new Tone.Multiply(Math.SQRT1_2); - this._split.connect(this._midAdd, 0, 0); - this._split.connect(this._midAdd, 1, 1); - this._split.connect(this._sideSubtract, 0, 0); - this._split.connect(this._sideSubtract, 1, 1); - this._midAdd.connect(this.mid); - this._sideSubtract.connect(this.side); - }; - Tone.extend(Tone.MidSideSplit, Tone.AudioNode); - /** - * clean up - * @returns {Tone.MidSideSplit} this - */ - Tone.MidSideSplit.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this.mid.dispose(); - this.mid = null; - this.side.dispose(); - this.side = null; - this._midAdd.dispose(); - this._midAdd = null; - this._sideSubtract.dispose(); - this._sideSubtract = null; - this._split.dispose(); - this._split = null; - return this; - }; - return Tone.MidSideSplit; - }); - Module(function (Tone) { - - /** - * @class Mid/Side processing separates the the 'mid' signal - * (which comes out of both the left and the right channel) - * and the 'side' (which only comes out of the the side channels). - * MidSideMerge merges the mid and side signal after they've been seperated - * by Tone.MidSideSplit.<br><br> - * <code> - * Left = (Mid+Side)/sqrt(2); // obtain left signal from mid and side<br> - * Right = (Mid-Side)/sqrt(2); // obtain right signal from mid and side<br> - * </code> - * - * @extends {Tone.AudioNode} - * @constructor - */ - Tone.MidSideMerge = function () { - Tone.AudioNode.call(this); - this.createInsOuts(2, 0); - /** - * The mid signal input. Alias for - * <code>input[0]</code> - * @type {Tone.Gain} - */ - this.mid = this.input[0] = new Tone.Gain(); - /** - * recombine the mid/side into Left - * @type {Tone.Add} - * @private - */ - this._left = new Tone.Add(); - /** - * Multiply the left by sqrt(1/2) - * @type {Tone.Multiply} - */ - this._timesTwoLeft = new Tone.Multiply(Math.SQRT1_2); - /** - * The side signal input. Alias for - * <code>input[1]</code> - * @type {Tone.Gain} - */ - this.side = this.input[1] = new Tone.Gain(); - /** - * recombine the mid/side into Right - * @type {Tone.Subtract} - * @private - */ - this._right = new Tone.Subtract(); - /** - * Multiply the right by sqrt(1/2) - * @type {Tone.Multiply} - */ - this._timesTwoRight = new Tone.Multiply(Math.SQRT1_2); - /** - * Merge the left/right signal back into a stereo signal. - * @type {Tone.Merge} - * @private - */ - this._merge = this.output = new Tone.Merge(); - this.mid.connect(this._left, 0, 0); - this.side.connect(this._left, 0, 1); - this.mid.connect(this._right, 0, 0); - this.side.connect(this._right, 0, 1); - this._left.connect(this._timesTwoLeft); - this._right.connect(this._timesTwoRight); - this._timesTwoLeft.connect(this._merge, 0, 0); - this._timesTwoRight.connect(this._merge, 0, 1); - }; - Tone.extend(Tone.MidSideMerge, Tone.AudioNode); - /** - * clean up - * @returns {Tone.MidSideMerge} this - */ - Tone.MidSideMerge.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this.mid.dispose(); - this.mid = null; - this.side.dispose(); - this.side = null; - this._left.dispose(); - this._left = null; - this._timesTwoLeft.dispose(); - this._timesTwoLeft = null; - this._right.dispose(); - this._right = null; - this._timesTwoRight.dispose(); - this._timesTwoRight = null; - this._merge.dispose(); - this._merge = null; - return this; - }; - return Tone.MidSideMerge; - }); - Module(function (Tone) { - - /** - * @class Tone.MidSideCompressor applies two different compressors to the mid - * and side signal components. See Tone.MidSideSplit. - * - * @extends {Tone.AudioNode} - * @param {Object} options The options that are passed to the mid and side - * compressors. - * @constructor - */ - Tone.MidSideCompressor = function (options) { - Tone.AudioNode.call(this); - options = Tone.defaultArg(options, Tone.MidSideCompressor.defaults); - /** - * the mid/side split - * @type {Tone.MidSideSplit} - * @private - */ - this._midSideSplit = this.input = new Tone.MidSideSplit(); - /** - * the mid/side recombination - * @type {Tone.MidSideMerge} - * @private - */ - this._midSideMerge = this.output = new Tone.MidSideMerge(); - /** - * The compressor applied to the mid signal - * @type {Tone.Compressor} - */ - this.mid = new Tone.Compressor(options.mid); - /** - * The compressor applied to the side signal - * @type {Tone.Compressor} - */ - this.side = new Tone.Compressor(options.side); - this._midSideSplit.mid.chain(this.mid, this._midSideMerge.mid); - this._midSideSplit.side.chain(this.side, this._midSideMerge.side); - this._readOnly([ - 'mid', - 'side' - ]); - }; - Tone.extend(Tone.MidSideCompressor, Tone.AudioNode); - /** - * @const - * @static - * @type {Object} - */ - Tone.MidSideCompressor.defaults = { - 'mid': { - 'ratio': 3, - 'threshold': -24, - 'release': 0.03, - 'attack': 0.02, - 'knee': 16 - }, - 'side': { - 'ratio': 6, - 'threshold': -30, - 'release': 0.25, - 'attack': 0.03, - 'knee': 10 - } - }; - /** - * Clean up. - * @returns {Tone.MidSideCompressor} this - */ - Tone.MidSideCompressor.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable([ - 'mid', - 'side' - ]); - this.mid.dispose(); - this.mid = null; - this.side.dispose(); - this.side = null; - this._midSideSplit.dispose(); - this._midSideSplit = null; - this._midSideMerge.dispose(); - this._midSideMerge = null; - return this; - }; - return Tone.MidSideCompressor; - }); - Module(function (Tone) { - - /** - * @class Tone.Mono coerces the incoming mono or stereo signal into a mono signal - * where both left and right channels have the same value. This can be useful - * for [stereo imaging](https://en.wikipedia.org/wiki/Stereo_imaging). - * - * @extends {Tone.AudioNode} - * @constructor - */ - Tone.Mono = function () { - Tone.AudioNode.call(this); - this.createInsOuts(1, 0); - /** - * merge the signal - * @type {Tone.Merge} - * @private - */ - this._merge = this.output = new Tone.Merge(); - this.input.connect(this._merge, 0, 0); - this.input.connect(this._merge, 0, 1); - }; - Tone.extend(Tone.Mono, Tone.AudioNode); - /** - * clean up - * @returns {Tone.Mono} this - */ - Tone.Mono.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._merge.dispose(); - this._merge = null; - return this; - }; - return Tone.Mono; - }); - Module(function (Tone) { - - /** - * @class A compressor with seperate controls over low/mid/high dynamics - * - * @extends {Tone.AudioNode} - * @constructor - * @param {Object} options The low/mid/high compressor settings. - * @example - * var multiband = new Tone.MultibandCompressor({ - * "lowFrequency" : 200, - * "highFrequency" : 1300 - * "low" : { - * "threshold" : -12 - * } - * }) - */ - Tone.MultibandCompressor = function (options) { - Tone.AudioNode.call(this); - options = Tone.defaultArg(arguments, Tone.MultibandCompressor.defaults); - /** - * split the incoming signal into high/mid/low - * @type {Tone.MultibandSplit} - * @private - */ - this._splitter = this.input = new Tone.MultibandSplit({ - 'lowFrequency': options.lowFrequency, - 'highFrequency': options.highFrequency - }); - /** - * low/mid crossover frequency. - * @type {Frequency} - * @signal - */ - this.lowFrequency = this._splitter.lowFrequency; - /** - * mid/high crossover frequency. - * @type {Frequency} - * @signal - */ - this.highFrequency = this._splitter.highFrequency; - /** - * the output - * @type {Tone.Gain} - * @private - */ - this.output = new Tone.Gain(); - /** - * The compressor applied to the low frequencies. - * @type {Tone.Compressor} - */ - this.low = new Tone.Compressor(options.low); - /** - * The compressor applied to the mid frequencies. - * @type {Tone.Compressor} - */ - this.mid = new Tone.Compressor(options.mid); - /** - * The compressor applied to the high frequencies. - * @type {Tone.Compressor} - */ - this.high = new Tone.Compressor(options.high); - //connect the compressor - this._splitter.low.chain(this.low, this.output); - this._splitter.mid.chain(this.mid, this.output); - this._splitter.high.chain(this.high, this.output); - this._readOnly([ - 'high', - 'mid', - 'low', - 'highFrequency', - 'lowFrequency' - ]); - }; - Tone.extend(Tone.MultibandCompressor, Tone.AudioNode); - /** - * @const - * @static - * @type {Object} - */ - Tone.MultibandCompressor.defaults = { - 'low': Tone.Compressor.defaults, - 'mid': Tone.Compressor.defaults, - 'high': Tone.Compressor.defaults, - 'lowFrequency': 250, - 'highFrequency': 2000 - }; - /** - * clean up - * @returns {Tone.MultibandCompressor} this - */ - Tone.MultibandCompressor.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._splitter.dispose(); - this._writable([ - 'high', - 'mid', - 'low', - 'highFrequency', - 'lowFrequency' - ]); - this.low.dispose(); - this.mid.dispose(); - this.high.dispose(); - this._splitter = null; - this.low = null; - this.mid = null; - this.high = null; - this.lowFrequency = null; - this.highFrequency = null; - return this; - }; - return Tone.MultibandCompressor; - }); - Module(function (Tone) { - if (Tone.supported && !window.StereoPannerNode) { - /** - * @class Shimmed StereoPannerNode - * @param {AudioContext} context - * @private - */ - var StereoPannerNode = function (context) { - /** - * The audio context - * @type {AudioContext} - */ - this.context = context; - /** - * The left/right panning. [-1, 1] - * @type {AudioRange} - * @signal - */ - this.pan = new Tone.Signal(0, Tone.Type.AudioRange); - /** - * Equal power scaling of the right gain - * @type {Tone.WaveShaper} - */ - var rightWaveShaper = new Tone.WaveShaper(function (val) { - return Tone.equalPowerScale((val + 1) / 2); - }, 4096); - /** - * Equal power scaling of the left gain - * @type {Tone.WaveShaper} - * @private - */ - var leftWaveShaper = new Tone.WaveShaper(function (val) { - return Tone.equalPowerScale(1 - (val + 1) / 2); - }, 4096); - /** - * The left gain value - * @type {Tone.Gain} - * @private - */ - var leftGain = new Tone.Gain(); - /** - * The right gain value - * @type {Tone.Gain} - * @private - */ - var rightGain = new Tone.Gain(); - /** - * Split the incoming signal - * @type {Tone.Split} - * @private - */ - var split = this.input = new Tone.Split(); - /** - * Keeps the waveshapers from optimizing 0s - * @type {Tone.Zero} - * @private - */ - var zero = new Tone.Zero(); - zero.fan(rightWaveShaper, leftWaveShaper); - /** - * Merge the outgoing signal - * @type {Tone.Merge} - * @private - */ - var merge = this.output = new Tone.Merge(); - //connections - split.left.chain(leftGain, merge.left); - split.right.chain(rightGain, merge.right); - this.pan.chain(leftWaveShaper, leftGain.gain); - this.pan.chain(rightWaveShaper, rightGain.gain); - }; - StereoPannerNode.prototype.disconnect = function () { - this.output.disconnect.apply(this.output, arguments); - }; - StereoPannerNode.prototype.connect = function () { - this.output.connect.apply(this.output, arguments); - }; - //add it to the AudioContext - AudioContext.prototype.createStereoPanner = function () { - return new StereoPannerNode(this); - }; - Tone.Context.prototype.createStereoPanner = function () { - return new StereoPannerNode(this); - }; - } - }); - Module(function (Tone) { - - /** - * @class Tone.Panner is an equal power Left/Right Panner and does not - * support 3D. Panner uses the StereoPannerNode when available. - * - * @constructor - * @extends {Tone.AudioNode} - * @param {NormalRange} [initialPan=0] The initail panner value (center). - * @example - * //pan the input signal hard right. - * var panner = new Tone.Panner(1); - */ - Tone.Panner = function (initialPan) { - Tone.AudioNode.call(this); - /** - * the panner node - * @type {StereoPannerNode} - * @private - */ - this._panner = this.input = this.output = this.context.createStereoPanner(); - /** - * The pan control. -1 = hard left, 1 = hard right. - * @type {AudioRange} - * @signal - */ - this.pan = this._panner.pan; - //initial value - this.pan.value = Tone.defaultArg(initialPan, 0); - this._readOnly('pan'); - }; - Tone.extend(Tone.Panner, Tone.AudioNode); - /** - * Clean up. - * @returns {Tone.Panner} this - */ - Tone.Panner.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable('pan'); - this._panner.disconnect(); - this._panner = null; - this.pan = null; - return this; - }; - return Tone.Panner; - }); - Module(function (Tone) { - - /** - * @class A spatialized panner node which supports equalpower or HRTF panning. - * Tries to normalize the API across various browsers. See Tone.Listener - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Number} positionX The initial x position. - * @param {Number} positionY The initial y position. - * @param {Number} positionZ The initial z position. - */ - Tone.Panner3D = function () { - var options = Tone.defaults(arguments, [ - 'positionX', - 'positionY', - 'positionZ' - ], Tone.Panner3D); - Tone.AudioNode.call(this); - /** - * The panner node - * @type {PannerNode} - * @private - */ - this._panner = this.input = this.output = this.context.createPanner(); - //set some values - this._panner.panningModel = options.panningModel; - this._panner.maxDistance = options.maxDistance; - this._panner.distanceModel = options.distanceModel; - this._panner.coneOuterGain = options.coneOuterGain; - this._panner.coneOuterAngle = options.coneOuterAngle; - this._panner.coneInnerAngle = options.coneInnerAngle; - this._panner.refDistance = options.refDistance; - this._panner.rolloffFactor = options.rolloffFactor; - /** - * Holds the current orientation - * @type {Array} - * @private - */ - this._orientation = [ - options.orientationX, - options.orientationY, - options.orientationZ - ]; - /** - * Holds the current position - * @type {Array} - * @private - */ - this._position = [ - options.positionX, - options.positionY, - options.positionZ - ]; - // set the default position/orientation - this.orientationX = options.orientationX; - this.orientationY = options.orientationY; - this.orientationZ = options.orientationZ; - this.positionX = options.positionX; - this.positionY = options.positionY; - this.positionZ = options.positionZ; - }; - Tone.extend(Tone.Panner3D, Tone.AudioNode); - /** - * Defaults according to the specification - * @static - * @const - * @type {Object} - */ - Tone.Panner3D.defaults = { - 'positionX': 0, - 'positionY': 0, - 'positionZ': 0, - 'orientationX': 0, - 'orientationY': 0, - 'orientationZ': 0, - 'panningModel': 'equalpower', - 'maxDistance': 10000, - 'distanceModel': 'inverse', - 'coneOuterGain': 0, - 'coneOuterAngle': 360, - 'coneInnerAngle': 360, - 'refDistance': 1, - 'rolloffFactor': 1 - }; - /** - * The ramp time which is applied to the setTargetAtTime - * @type {Number} - * @private - */ - Tone.Panner3D.prototype._rampTimeConstant = 0.01; - /** - * Sets the position of the source in 3d space. - * @param {Number} x - * @param {Number} y - * @param {Number} z - * @return {Tone.Panner3D} this - */ - Tone.Panner3D.prototype.setPosition = function (x, y, z) { - if (this._panner.positionX) { - var now = this.now(); - this._panner.positionX.setTargetAtTime(x, now, this._rampTimeConstant); - this._panner.positionY.setTargetAtTime(y, now, this._rampTimeConstant); - this._panner.positionZ.setTargetAtTime(z, now, this._rampTimeConstant); - } else { - this._panner.setPosition(x, y, z); - } - this._position = Array.prototype.slice.call(arguments); - return this; - }; - /** - * Sets the orientation of the source in 3d space. - * @param {Number} x - * @param {Number} y - * @param {Number} z - * @return {Tone.Panner3D} this - */ - Tone.Panner3D.prototype.setOrientation = function (x, y, z) { - if (this._panner.orientationX) { - var now = this.now(); - this._panner.orientationX.setTargetAtTime(x, now, this._rampTimeConstant); - this._panner.orientationY.setTargetAtTime(y, now, this._rampTimeConstant); - this._panner.orientationZ.setTargetAtTime(z, now, this._rampTimeConstant); - } else { - this._panner.setOrientation(x, y, z); - } - this._orientation = Array.prototype.slice.call(arguments); - return this; - }; - /** - * The x position of the panner object. - * @type {Number} - * @memberOf Tone.Panner3D# - * @name positionX - */ - Object.defineProperty(Tone.Panner3D.prototype, 'positionX', { - set: function (pos) { - this._position[0] = pos; - this.setPosition.apply(this, this._position); - }, - get: function () { - return this._position[0]; - } - }); - /** - * The y position of the panner object. - * @type {Number} - * @memberOf Tone.Panner3D# - * @name positionY - */ - Object.defineProperty(Tone.Panner3D.prototype, 'positionY', { - set: function (pos) { - this._position[1] = pos; - this.setPosition.apply(this, this._position); - }, - get: function () { - return this._position[1]; - } - }); - /** - * The z position of the panner object. - * @type {Number} - * @memberOf Tone.Panner3D# - * @name positionZ - */ - Object.defineProperty(Tone.Panner3D.prototype, 'positionZ', { - set: function (pos) { - this._position[2] = pos; - this.setPosition.apply(this, this._position); - }, - get: function () { - return this._position[2]; - } - }); - /** - * The x orientation of the panner object. - * @type {Number} - * @memberOf Tone.Panner3D# - * @name orientationX - */ - Object.defineProperty(Tone.Panner3D.prototype, 'orientationX', { - set: function (pos) { - this._orientation[0] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[0]; - } - }); - /** - * The y orientation of the panner object. - * @type {Number} - * @memberOf Tone.Panner3D# - * @name orientationY - */ - Object.defineProperty(Tone.Panner3D.prototype, 'orientationY', { - set: function (pos) { - this._orientation[1] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[1]; - } - }); - /** - * The z orientation of the panner object. - * @type {Number} - * @memberOf Tone.Panner3D# - * @name orientationZ - */ - Object.defineProperty(Tone.Panner3D.prototype, 'orientationZ', { - set: function (pos) { - this._orientation[2] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[2]; - } - }); - /** - * Proxy a property on the panner to an exposed public propery - * @param {String} prop - * @private - */ - Tone.Panner3D._aliasProperty = function (prop) { - Object.defineProperty(Tone.Panner3D.prototype, prop, { - set: function (val) { - this._panner[prop] = val; - }, - get: function () { - return this._panner[prop]; - } - }); - }; - /** - * The panning model. Either "equalpower" or "HRTF". - * @type {String} - * @memberOf Tone.Panner3D# - * @name panningModel - */ - Tone.Panner3D._aliasProperty('panningModel'); - /** - * A reference distance for reducing volume as source move further from the listener - * @type {Number} - * @memberOf Tone.Panner3D# - * @name refDistance - */ - Tone.Panner3D._aliasProperty('refDistance'); - /** - * Describes how quickly the volume is reduced as source moves away from listener. - * @type {Number} - * @memberOf Tone.Panner3D# - * @name rolloffFactor - */ - Tone.Panner3D._aliasProperty('rolloffFactor'); - /** - * The distance model used by, "linear", "inverse", or "exponential". - * @type {String} - * @memberOf Tone.Panner3D# - * @name distanceModel - */ - Tone.Panner3D._aliasProperty('distanceModel'); - /** - * The angle, in degrees, inside of which there will be no volume reduction - * @type {Degrees} - * @memberOf Tone.Panner3D# - * @name coneInnerAngle - */ - Tone.Panner3D._aliasProperty('coneInnerAngle'); - /** - * The angle, in degrees, outside of which the volume will be reduced - * to a constant value of coneOuterGain - * @type {Degrees} - * @memberOf Tone.Panner3D# - * @name coneOuterAngle - */ - Tone.Panner3D._aliasProperty('coneOuterAngle'); - /** - * The gain outside of the coneOuterAngle - * @type {Gain} - * @memberOf Tone.Panner3D# - * @name coneOuterGain - */ - Tone.Panner3D._aliasProperty('coneOuterGain'); - /** - * The maximum distance between source and listener, - * after which the volume will not be reduced any further. - * @type {Positive} - * @memberOf Tone.Panner3D# - * @name maxDistance - */ - Tone.Panner3D._aliasProperty('maxDistance'); - /** - * Clean up. - * @returns {Tone.Panner3D} this - */ - Tone.Panner3D.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._panner.disconnect(); - this._panner = null; - this._orientation = null; - this._position = null; - return this; - }; - return Tone.Panner3D; - }); - Module(function (Tone) { - - /** - * @class Tone.PanVol is a Tone.Panner and Tone.Volume in one. - * - * @extends {Tone.AudioNode} - * @constructor - * @param {AudioRange} pan the initial pan - * @param {number} volume The output volume. - * @example - * //pan the incoming signal left and drop the volume - * var panVol = new Tone.PanVol(-0.25, -12); - */ - Tone.PanVol = function () { - var options = Tone.defaults(arguments, [ - 'pan', - 'volume' - ], Tone.PanVol); - Tone.AudioNode.call(this); - /** - * The panning node - * @type {Tone.Panner} - * @private - */ - this._panner = this.input = new Tone.Panner(options.pan); - /** - * The L/R panning control. - * @type {AudioRange} - * @signal - */ - this.pan = this._panner.pan; - /** - * The volume node - * @type {Tone.Volume} - * @private - */ - this._volume = this.output = new Tone.Volume(options.volume); - /** - * The volume control in decibels. - * @type {Decibels} - * @signal - */ - this.volume = this._volume.volume; - //connections - this._panner.connect(this._volume); - this.mute = options.mute; - this._readOnly([ - 'pan', - 'volume' - ]); - }; - Tone.extend(Tone.PanVol, Tone.AudioNode); - /** - * The defaults - * @type {Object} - * @const - * @static - */ - Tone.PanVol.defaults = { - 'pan': 0, - 'volume': 0, - 'mute': false - }; - /** - * Mute/unmute the volume - * @memberOf Tone.PanVol# - * @name mute - * @type {Boolean} - */ - Object.defineProperty(Tone.PanVol.prototype, 'mute', { - get: function () { - return this._volume.mute; - }, - set: function (mute) { - this._volume.mute = mute; - } - }); - /** - * clean up - * @returns {Tone.PanVol} this - */ - Tone.PanVol.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._writable([ - 'pan', - 'volume' - ]); - this._panner.dispose(); - this._panner = null; - this.pan = null; - this._volume.dispose(); - this._volume = null; - this.volume = null; - return this; - }; - return Tone.PanVol; - }); - Module(function (Tone) { - /** - * @class Tone.Solo lets you isolate a specific audio stream. When - * an instance is set to `solo=true`, it will mute all other instances. - * @extends {Tone.AudioNode} - * @example - * var soloA = new Tone.Solo() - * var soloB = new Tone.Solo() - * soloA.solo = true - * //no audio will pass through soloB - */ - Tone.Solo = function () { - var options = Tone.defaults(arguments, ['solo'], Tone.Solo); - Tone.AudioNode.call(this); - /** - * The input and output node - * @type {Tone.Gain} - */ - this.input = this.output = new Tone.Gain(); - /** - * A bound _soloed method - * @type {Function} - * @private - */ - this._soloBind = this._soloed.bind(this); - //listen for solo events class-wide. - this.context.on('solo', this._soloBind); - //set initially - this.solo = options.solo; - }; - Tone.extend(Tone.Solo, Tone.AudioNode); - /** - * The defaults - * @type {Object} - * @static - */ - Tone.Solo.defaults = { solo: false }; - /** - * Isolates this instance and mutes all other instances of Tone.Solo. - * Only one instance can be soloed at a time. A soloed - * instance will report `solo=false` when another instance is soloed. - * @memberOf Tone.Solo# - * @type {Boolean} - * @name solo - */ - Object.defineProperty(Tone.Solo.prototype, 'solo', { - get: function () { - return this._isSoloed(); - }, - set: function (solo) { - if (solo) { - this._addSolo(); - } else { - this._removeSolo(); - } - this.context.emit('solo', this); - } - }); - /** - * If the current instance is muted, i.e. another instance is soloed - * @memberOf Tone.Solo# - * @type {Boolean} - * @name muted - * @readOnly - */ - Object.defineProperty(Tone.Solo.prototype, 'muted', { - get: function () { - return this.input.gain.value === 0; - } - }); - /** - * Add this to the soloed array - * @private - */ - Tone.Solo.prototype._addSolo = function () { - if (!Tone.isArray(this.context._currentSolo)) { - this.context._currentSolo = []; - } - if (!this._isSoloed()) { - this.context._currentSolo.push(this); - } - }; - /** - * Remove this from the soloed array - * @private - */ - Tone.Solo.prototype._removeSolo = function () { - if (this._isSoloed()) { - var index = this.context._currentSolo.indexOf(this); - this.context._currentSolo.splice(index, 1); - } - }; - /** - * @return {Boolean} Is this on the soloed array - * @private - */ - Tone.Solo.prototype._isSoloed = function () { - if (Tone.isArray(this.context._currentSolo)) { - return this.context._currentSolo.length !== 0 && this.context._currentSolo.indexOf(this) !== -1; - } else { - return false; - } - }; - /** - * @return {Boolean} Returns true if no one is soloed - * @private - */ - Tone.Solo.prototype._noSolos = function () { - return !Tone.isArray(this.context._currentSolo) || this.context._currentSolo.length === 0; - }; - /** - * Solo the current instance and unsolo all other instances. - * @param {Tone.Solo} instance The instance which is being soloed/unsoloed. - * @private - */ - Tone.Solo.prototype._soloed = function () { - if (this._isSoloed()) { - this.input.gain.value = 1; - } else if (this._noSolos()) { - //no one is soloed - this.input.gain.value = 1; - } else { - this.input.gain.value = 0; - } - }; - /** - * Clean up - * @return {Tone.Solo} this - */ - Tone.Solo.prototype.dispose = function () { - this.context.off('solo', this._soloBind); - this._removeSolo(); - this._soloBind = null; - Tone.AudioNode.prototype.dispose.call(this); - return this; - }; - return Tone.Solo; - }); - Module(function (Tone) { - /** - * @class Get the current waveform data of the connected audio source. - * @extends {Tone.AudioNode} - * @param {Number=} size The size of the FFT. Value must be a power of - * two in the range 32 to 32768. - */ - Tone.Waveform = function () { - var options = Tone.defaults(arguments, ['size'], Tone.Waveform); - options.type = Tone.Analyser.Type.Waveform; - Tone.AudioNode.call(this); - /** - * The analyser node. - * @private - * @type {Tone.Analyser} - */ - this._analyser = this.input = this.output = new Tone.Analyser(options); - }; - Tone.extend(Tone.Waveform, Tone.AudioNode); - /** - * The default values. - * @type {Object} - * @const - */ - Tone.Waveform.defaults = { 'size': 1024 }; - /** - * Gets the waveform of the audio source. Returns the waveform data - * of length [size](#size) as a Float32Array with values between -1 and 1. - * @returns {TypedArray} - */ - Tone.Waveform.prototype.getValue = function () { - return this._analyser.getValue(); - }; - /** - * The size of analysis. This must be a power of two in the range 32 to 32768. - * @memberOf Tone.Waveform# - * @type {Number} - * @name size - */ - Object.defineProperty(Tone.Waveform.prototype, 'size', { - get: function () { - return this._analyser.size; - }, - set: function (size) { - this._analyser.size = size; - } - }); - /** - * Clean up. - * @return {Tone.Waveform} this - */ - Tone.Waveform.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._analyser.dispose(); - this._analyser = null; - }; - return Tone.Waveform; - }); - Module(function (Tone) { - - /** - * @class Tone.CtrlInterpolate will interpolate between given values based - * on the "index" property. Passing in an array or object literal - * will interpolate each of the parameters. Note (i.e. "C3") - * and Time (i.e. "4n + 2") can be interpolated. All other values are - * assumed to be numbers. - * @example - * var interp = new Tone.CtrlInterpolate([0, 2, 9, 4]); - * interp.index = 0.75; - * interp.value; //returns 1.5 - * - * @example - * var interp = new Tone.CtrlInterpolate([ - * [2, 4, 5], - * [9, 3, 2], - * ]); - * @param {Array} values The array of values to interpolate over - * @param {Positive} index The initial interpolation index. - * @extends {Tone} - */ - Tone.CtrlInterpolate = function () { - var options = Tone.defaults(arguments, [ - 'values', - 'index' - ], Tone.CtrlInterpolate); - Tone.call(this); - /** - * The values to interpolate between - * @type {Array} - */ - this.values = options.values; - /** - * The interpolated index between values. For example: a value of 1.5 - * would interpolate equally between the value at index 1 - * and the value at index 2. - * @example - * interp.index = 0; - * interp.value; //returns the value at 0 - * interp.index = 0.5; - * interp.value; //returns the value between indices 0 and 1. - * @type {Positive} - */ - this.index = options.index; - }; - Tone.extend(Tone.CtrlInterpolate); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.CtrlInterpolate.defaults = { - 'index': 0, - 'values': [] - }; - /** - * The current interpolated value based on the index - * @readOnly - * @memberOf Tone.CtrlInterpolate# - * @type {*} - * @name value - */ - Object.defineProperty(Tone.CtrlInterpolate.prototype, 'value', { - get: function () { - var index = this.index; - index = Math.min(index, this.values.length - 1); - var lowerPosition = Math.floor(index); - var lower = this.values[lowerPosition]; - var upper = this.values[Math.ceil(index)]; - return this._interpolate(index - lowerPosition, lower, upper); - } - }); - /** - * Internal interpolation routine - * @param {NormalRange} index The index between the lower and upper - * @param {*} lower - * @param {*} upper - * @return {*} The interpolated value - * @private - */ - Tone.CtrlInterpolate.prototype._interpolate = function (index, lower, upper) { - if (Tone.isArray(lower)) { - var retArray = []; - for (var i = 0; i < lower.length; i++) { - retArray[i] = this._interpolate(index, lower[i], upper[i]); - } - return retArray; - } else if (Tone.isObject(lower)) { - var retObj = {}; - for (var attr in lower) { - retObj[attr] = this._interpolate(index, lower[attr], upper[attr]); - } - return retObj; - } else { - lower = this._toNumber(lower); - upper = this._toNumber(upper); - return (1 - index) * lower + index * upper; - } - }; - /** - * Convert from the given type into a number - * @param {Number|String} value - * @return {Number} - * @private - */ - Tone.CtrlInterpolate.prototype._toNumber = function (val) { - if (Tone.isNumber(val)) { - return val; - } else { - //otherwise assume that it's Time... - return this.toSeconds(val); - } - }; - /** - * Clean up - * @return {Tone.CtrlInterpolate} this - */ - Tone.CtrlInterpolate.prototype.dispose = function () { - this.values = null; - }; - return Tone.CtrlInterpolate; - }); - Module(function (Tone) { - - /** - * @class Tone.CtrlMarkov represents a Markov Chain where each call - * to Tone.CtrlMarkov.next will move to the next state. If the next - * state choice is an array, the next state is chosen randomly with - * even probability for all of the choices. For a weighted probability - * of the next choices, pass in an object with "state" and "probability" attributes. - * The probabilities will be normalized and then chosen. If no next options - * are given for the current state, the state will stay there. - * @extends {Tone} - * @example - * var chain = new Tone.CtrlMarkov({ - * "beginning" : ["end", "middle"], - * "middle" : "end" - * }); - * chain.value = "beginning"; - * chain.next(); //returns "end" or "middle" with 50% probability - * - * @example - * var chain = new Tone.CtrlMarkov({ - * "beginning" : [{"value" : "end", "probability" : 0.8}, - * {"value" : "middle", "probability" : 0.2}], - * "middle" : "end" - * }); - * chain.value = "beginning"; - * chain.next(); //returns "end" with 80% probability or "middle" with 20%. - * @param {Object} values An object with the state names as the keys - * and the next state(s) as the values. - */ - Tone.CtrlMarkov = function (values, initial) { - Tone.call(this); - /** - * The Markov values with states as the keys - * and next state(s) as the values. - * @type {Object} - */ - this.values = Tone.defaultArg(values, {}); - /** - * The current state of the Markov values. The next - * state will be evaluated and returned when Tone.CtrlMarkov.next - * is invoked. - * @type {String} - */ - this.value = Tone.defaultArg(initial, Object.keys(this.values)[0]); - }; - Tone.extend(Tone.CtrlMarkov); - /** - * Returns the next state of the Markov values. - * @return {String} - */ - Tone.CtrlMarkov.prototype.next = function () { - if (this.values.hasOwnProperty(this.value)) { - var next = this.values[this.value]; - if (Tone.isArray(next)) { - var distribution = this._getProbDistribution(next); - var rand = Math.random(); - var total = 0; - for (var i = 0; i < distribution.length; i++) { - var dist = distribution[i]; - if (rand > total && rand < total + dist) { - var chosen = next[i]; - if (Tone.isObject(chosen)) { - this.value = chosen.value; - } else { - this.value = chosen; - } - } - total += dist; - } - } else { - this.value = next; - } - } - return this.value; - }; - /** - * Choose randomly from an array weighted options in the form - * {"state" : string, "probability" : number} or an array of values - * @param {Array} options - * @return {Array} The randomly selected choice - * @private - */ - Tone.CtrlMarkov.prototype._getProbDistribution = function (options) { - var distribution = []; - var total = 0; - var needsNormalizing = false; - for (var i = 0; i < options.length; i++) { - var option = options[i]; - if (Tone.isObject(option)) { - needsNormalizing = true; - distribution[i] = option.probability; - } else { - distribution[i] = 1 / options.length; - } - total += distribution[i]; - } - if (needsNormalizing) { - //normalize the values - for (var j = 0; j < distribution.length; j++) { - distribution[j] = distribution[j] / total; - } - } - return distribution; - }; - /** - * Clean up - * @return {Tone.CtrlMarkov} this - */ - Tone.CtrlMarkov.prototype.dispose = function () { - this.values = null; - }; - return Tone.CtrlMarkov; - }); - Module(function (Tone) { - - /** - * @class Generate patterns from an array of values. - * Has a number of arpeggiation and randomized - * selection patterns. - * <ul> - * <li>"up" - cycles upward</li> - * <li>"down" - cycles downward</li> - * <li>"upDown" - up then and down</li> - * <li>"downUp" - cycles down then and up</li> - * <li>"alternateUp" - jump up two and down one</li> - * <li>"alternateDown" - jump down two and up one</li> - * <li>"random" - randomly select an index</li> - * <li>"randomWalk" - randomly moves one index away from the current position</li> - * <li>"randomOnce" - randomly select an index without repeating until all values have been chosen.</li> - * </ul> - * @param {Array} values An array of options to choose from. - * @param {Tone.CtrlPattern.Type=} type The name of the pattern. - * @extends {Tone} - */ - Tone.CtrlPattern = function () { - var options = Tone.defaults(arguments, [ - 'values', - 'type' - ], Tone.CtrlPattern); - Tone.call(this); - /** - * The array of values to arpeggiate over - * @type {Array} - */ - this.values = options.values; - /** - * The current position in the values array - * @type {Number} - */ - this.index = 0; - /** - * The type placeholder - * @type {Tone.CtrlPattern.Type} - * @private - */ - this._type = null; - /** - * Shuffled values for the RandomOnce type - * @type {Array} - * @private - */ - this._shuffled = null; - /** - * The direction of the movement - * @type {String} - * @private - */ - this._direction = null; - this.type = options.type; - }; - Tone.extend(Tone.CtrlPattern); - /** - * The Control Patterns - * @type {Object} - * @static - */ - Tone.CtrlPattern.Type = { - Up: 'up', - Down: 'down', - UpDown: 'upDown', - DownUp: 'downUp', - AlternateUp: 'alternateUp', - AlternateDown: 'alternateDown', - Random: 'random', - RandomWalk: 'randomWalk', - RandomOnce: 'randomOnce' - }; - /** - * The default values. - * @type {Object} - */ - Tone.CtrlPattern.defaults = { - 'type': Tone.CtrlPattern.Type.Up, - 'values': [] - }; - /** - * The value at the current index of the pattern. - * @readOnly - * @memberOf Tone.CtrlPattern# - * @type {*} - * @name value - */ - Object.defineProperty(Tone.CtrlPattern.prototype, 'value', { - get: function () { - //some safeguards - if (this.values.length === 0) { - return; - } else if (this.values.length === 1) { - return this.values[0]; - } - this.index = Math.min(this.index, this.values.length - 1); - var val = this.values[this.index]; - if (this.type === Tone.CtrlPattern.Type.RandomOnce) { - if (this.values.length !== this._shuffled.length) { - this._shuffleValues(); - } - val = this.values[this._shuffled[this.index]]; - } - return val; - } - }); - /** - * The pattern used to select the next - * item from the values array - * @memberOf Tone.CtrlPattern# - * @type {Tone.CtrlPattern.Type} - * @name type - */ - Object.defineProperty(Tone.CtrlPattern.prototype, 'type', { - get: function () { - return this._type; - }, - set: function (type) { - this._type = type; - this._shuffled = null; - //the first index - if (this._type === Tone.CtrlPattern.Type.Up || this._type === Tone.CtrlPattern.Type.UpDown || this._type === Tone.CtrlPattern.Type.RandomOnce || this._type === Tone.CtrlPattern.Type.AlternateUp) { - this.index = 0; - } else if (this._type === Tone.CtrlPattern.Type.Down || this._type === Tone.CtrlPattern.Type.DownUp || this._type === Tone.CtrlPattern.Type.AlternateDown) { - this.index = this.values.length - 1; - } - //the direction - if (this._type === Tone.CtrlPattern.Type.UpDown || this._type === Tone.CtrlPattern.Type.AlternateUp) { - this._direction = Tone.CtrlPattern.Type.Up; - } else if (this._type === Tone.CtrlPattern.Type.DownUp || this._type === Tone.CtrlPattern.Type.AlternateDown) { - this._direction = Tone.CtrlPattern.Type.Down; - } - //randoms - if (this._type === Tone.CtrlPattern.Type.RandomOnce) { - this._shuffleValues(); - } else if (this._type === Tone.CtrlPattern.Random) { - this.index = Math.floor(Math.random() * this.values.length); - } - } - }); - /** - * Return the next value given the current position - * and pattern. - * @return {*} The next value - */ - Tone.CtrlPattern.prototype.next = function () { - var type = this.type; - //choose the next index - if (type === Tone.CtrlPattern.Type.Up) { - this.index++; - if (this.index >= this.values.length) { - this.index = 0; - } - } else if (type === Tone.CtrlPattern.Type.Down) { - this.index--; - if (this.index < 0) { - this.index = this.values.length - 1; - } - } else if (type === Tone.CtrlPattern.Type.UpDown || type === Tone.CtrlPattern.Type.DownUp) { - if (this._direction === Tone.CtrlPattern.Type.Up) { - this.index++; - } else { - this.index--; - } - if (this.index < 0) { - this.index = 1; - this._direction = Tone.CtrlPattern.Type.Up; - } else if (this.index >= this.values.length) { - this.index = this.values.length - 2; - this._direction = Tone.CtrlPattern.Type.Down; - } - } else if (type === Tone.CtrlPattern.Type.Random) { - this.index = Math.floor(Math.random() * this.values.length); - } else if (type === Tone.CtrlPattern.Type.RandomWalk) { - if (Math.random() < 0.5) { - this.index--; - this.index = Math.max(this.index, 0); - } else { - this.index++; - this.index = Math.min(this.index, this.values.length - 1); - } - } else if (type === Tone.CtrlPattern.Type.RandomOnce) { - this.index++; - if (this.index >= this.values.length) { - this.index = 0; - //reshuffle the values for next time - this._shuffleValues(); - } - } else if (type === Tone.CtrlPattern.Type.AlternateUp) { - if (this._direction === Tone.CtrlPattern.Type.Up) { - this.index += 2; - this._direction = Tone.CtrlPattern.Type.Down; - } else { - this.index -= 1; - this._direction = Tone.CtrlPattern.Type.Up; - } - if (this.index >= this.values.length) { - this.index = 0; - this._direction = Tone.CtrlPattern.Type.Up; - } - } else if (type === Tone.CtrlPattern.Type.AlternateDown) { - if (this._direction === Tone.CtrlPattern.Type.Up) { - this.index += 1; - this._direction = Tone.CtrlPattern.Type.Down; - } else { - this.index -= 2; - this._direction = Tone.CtrlPattern.Type.Up; - } - if (this.index < 0) { - this.index = this.values.length - 1; - this._direction = Tone.CtrlPattern.Type.Down; - } - } - return this.value; - }; - /** - * Shuffles the values and places the results into the _shuffled - * @private - */ - Tone.CtrlPattern.prototype._shuffleValues = function () { - var copy = []; - this._shuffled = []; - for (var i = 0; i < this.values.length; i++) { - copy[i] = i; - } - while (copy.length > 0) { - var randVal = copy.splice(Math.floor(copy.length * Math.random()), 1); - this._shuffled.push(randVal[0]); - } - }; - /** - * Clean up - * @returns {Tone.CtrlPattern} this - */ - Tone.CtrlPattern.prototype.dispose = function () { - this._shuffled = null; - this.values = null; - }; - return Tone.CtrlPattern; - }); - Module(function (Tone) { - - /** - * @class Choose a random value. - * @extends {Tone} - * @example - * var randomWalk = new Tone.CtrlRandom({ - * "min" : 0, - * "max" : 10, - * "integer" : true - * }); - * randomWalk.eval(); - * - * @param {Number|Time=} min The minimum return value. - * @param {Number|Time=} max The maximum return value. - */ - Tone.CtrlRandom = function () { - var options = Tone.defaults(arguments, [ - 'min', - 'max' - ], Tone.CtrlRandom); - Tone.call(this); - /** - * The minimum return value - * @type {Number|Time} - */ - this.min = options.min; - /** - * The maximum return value - * @type {Number|Time} - */ - this.max = options.max; - /** - * If the return value should be an integer - * @type {Boolean} - */ - this.integer = options.integer; - }; - Tone.extend(Tone.CtrlRandom); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.CtrlRandom.defaults = { - 'min': 0, - 'max': 1, - 'integer': false - }; - /** - * Return a random value between min and max. - * @readOnly - * @memberOf Tone.CtrlRandom# - * @type {*} - * @name value - */ - Object.defineProperty(Tone.CtrlRandom.prototype, 'value', { - get: function () { - var min = this.toSeconds(this.min); - var max = this.toSeconds(this.max); - var rand = Math.random(); - var val = rand * min + (1 - rand) * max; - if (this.integer) { - val = Math.floor(val); - } - return val; - } - }); - return Tone.CtrlRandom; - }); - Module(function (Tone) { - /** - * @class A data structure for holding multiple buffers. - * - * @param {Object|Array} urls An object literal or array - * of urls to load. - * @param {Function=} callback The callback to invoke when - * the buffers are loaded. - * @extends {Tone} - * @example - * //load a whole bank of piano samples - * var pianoSamples = new Tone.Buffers({ - * "C4" : "path/to/C4.mp3" - * "C#4" : "path/to/C#4.mp3" - * "D4" : "path/to/D4.mp3" - * "D#4" : "path/to/D#4.mp3" - * ... - * }, function(){ - * //play one of the samples when they all load - * player.buffer = pianoSamples.get("C4"); - * player.start(); - * }); - * @example - * //To pass in additional parameters in the second parameter - * var buffers = new Tone.Buffers(urls, { - * "onload" : callback, - * "baseUrl" : "../path/to/audio/" - * }) - */ - Tone.Buffers = function (urls) { - //remove the urls from the options - var args = Array.prototype.slice.call(arguments); - args.shift(); - var options = Tone.defaults(args, [ - 'onload', - 'baseUrl' - ], Tone.Buffers); - Tone.call(this); - /** - * All of the buffers - * @type {Object} - * @private - */ - this._buffers = {}; - /** - * A path which is prefixed before every url. - * @type {String} - */ - this.baseUrl = options.baseUrl; - this._loadingCount = 0; - //add each one - for (var key in urls) { - this._loadingCount++; - this.add(key, urls[key], this._bufferLoaded.bind(this, options.onload)); - } - }; - Tone.extend(Tone.Buffers); - /** - * Defaults - * @type {Object} - */ - Tone.Buffers.defaults = { - 'onload': Tone.noOp, - 'baseUrl': '' - }; - /** - * True if the buffers object has a buffer by that name. - * @param {String|Number} name The key or index of the - * buffer. - * @return {Boolean} - */ - Tone.Buffers.prototype.has = function (name) { - return this._buffers.hasOwnProperty(name); - }; - /** - * Get a buffer by name. If an array was loaded, - * then use the array index. - * @param {String|Number} name The key or index of the - * buffer. - * @return {Tone.Buffer} - */ - Tone.Buffers.prototype.get = function (name) { - if (this.has(name)) { - return this._buffers[name]; - } else { - throw new Error('Tone.Buffers: no buffer named ' + name); - } - }; - /** - * A buffer was loaded. decrement the counter. - * @param {Function} callback - * @private - */ - Tone.Buffers.prototype._bufferLoaded = function (callback) { - this._loadingCount--; - if (this._loadingCount === 0 && callback) { - callback(this); - } - }; - /** - * If the buffers are loaded or not - * @memberOf Tone.Buffers# - * @type {Boolean} - * @name loaded - * @readOnly - */ - Object.defineProperty(Tone.Buffers.prototype, 'loaded', { - get: function () { - var isLoaded = true; - for (var buffName in this._buffers) { - var buff = this.get(buffName); - isLoaded = isLoaded && buff.loaded; - } - return isLoaded; - } - }); - /** - * Add a buffer by name and url to the Buffers - * @param {String} name A unique name to give - * the buffer - * @param {String|Tone.Buffer|Audiobuffer} url Either the url of the bufer, - * or a buffer which will be added - * with the given name. - * @param {Function=} callback The callback to invoke - * when the url is loaded. - */ - Tone.Buffers.prototype.add = function (name, url, callback) { - callback = Tone.defaultArg(callback, Tone.noOp); - if (url instanceof Tone.Buffer) { - this._buffers[name] = url; - callback(this); - } else if (url instanceof AudioBuffer) { - this._buffers[name] = new Tone.Buffer(url); - callback(this); - } else if (Tone.isString(url)) { - this._buffers[name] = new Tone.Buffer(this.baseUrl + url, callback); - } - return this; - }; - /** - * Clean up. - * @return {Tone.Buffers} this - */ - Tone.Buffers.prototype.dispose = function () { - Tone.prototype.dispose.call(this); - for (var name in this._buffers) { - this._buffers[name].dispose(); - } - this._buffers = null; - return this; - }; - return Tone.Buffers; - }); - Module(function (Tone) { - - /** - * buses are another way of routing audio - * - * augments Tone.prototype to include send and recieve - */ - /** - * All of the routes - * - * @type {Object} - * @static - * @private - */ - var Buses = {}; - /** - * Send this signal to the channel name. - * @param {String} channelName A named channel to send the signal to. - * @param {Decibels} amount The amount of the source to send to the bus. - * @return {GainNode} The gain node which connects this node to the desired channel. - * Can be used to adjust the levels of the send. - * @example - * source.send("reverb", -12); - */ - Tone.prototype.send = function (channelName, amount) { - if (!Buses.hasOwnProperty(channelName)) { - Buses[channelName] = this.context.createGain(); - } - amount = Tone.defaultArg(amount, 0); - var sendKnob = new Tone.Gain(amount, Tone.Type.Decibels); - this.connect(sendKnob); - sendKnob.connect(Buses[channelName]); - return sendKnob; - }; - /** - * Recieve the input from the desired channelName to the input - * - * @param {String} channelName A named channel to send the signal to. - * @param {Number=} channelNumber The channel to connect to - * @returns {Tone} this - * @example - * reverbEffect.receive("reverb"); - */ - Tone.prototype.receive = function (channelName, inputNum) { - if (!Buses.hasOwnProperty(channelName)) { - Buses[channelName] = this.context.createGain(); - } - Buses[channelName].connect(this, 0, inputNum); - return this; - }; - //remove all the send/receives when a new audio context is passed in - Tone.Context.on('init', function (context) { - if (context.Buses) { - Buses = context.Buses; - } else { - Buses = {}; - context.Buses = Buses; - } - }); - return Tone; - }); - Module(function (Tone) { - - /** - * @class Tone.Draw is useful for synchronizing visuals and audio events. - * Callbacks from Tone.Transport or any of the Tone.Event classes - * always happen _before_ the scheduled time and are not synchronized - * to the animation frame so they are not good for triggering tightly - * synchronized visuals and sound. Tone.Draw makes it easy to schedule - * callbacks using the AudioContext time and uses requestAnimationFrame. - * - * @singleton - * @extends {Tone} - * @example - * Tone.Transport.schedule(function(time){ - * //use the time argument to schedule a callback with Tone.Draw - * Tone.Draw.schedule(function(){ - * //do drawing or DOM manipulation here - * }, time) - * }, "+0.5") - */ - Tone.Draw = function () { - Tone.call(this); - /** - * All of the events. - * @type {Tone.Timeline} - * @private - */ - this._events = new Tone.Timeline(); - /** - * The duration after which events are not invoked. - * @type {Number} - * @default 0.25 - */ - this.expiration = 0.25; - /** - * The amount of time before the scheduled time - * that the callback can be invoked. Default is - * half the time of an animation frame (0.008 seconds). - * @type {Number} - * @default 0.008 - */ - this.anticipation = 0.008; - /** - * The draw loop - * @type {Function} - * @private - */ - this._boundDrawLoop = this._drawLoop.bind(this); - }; - Tone.extend(Tone.Draw); - /** - * Schedule a function at the given time to be invoked - * on the nearest animation frame. - * @param {Function} callback Callback is invoked at the given time. - * @param {Time} time The time relative to the AudioContext time - * to invoke the callback. - * @return {Tone.Draw} this - */ - Tone.Draw.prototype.schedule = function (callback, time) { - this._events.add({ - callback: callback, - time: this.toSeconds(time) - }); - //start the draw loop on the first event - if (this._events.length === 1) { - requestAnimationFrame(this._boundDrawLoop); - } - return this; - }; - /** - * Cancel events scheduled after the given time - * @param {Time=} after Time after which scheduled events will - * be removed from the scheduling timeline. - * @return {Tone.Draw} this - */ - Tone.Draw.prototype.cancel = function (after) { - this._events.cancel(this.toSeconds(after)); - return this; - }; - /** - * The draw loop - * @private - */ - Tone.Draw.prototype._drawLoop = function () { - var now = Tone.now(); - while (this._events.length && this._events.peek().time - this.anticipation <= now) { - var event = this._events.shift(); - if (now - event.time <= this.expiration) { - event.callback(); - } - } - if (this._events.length > 0) { - requestAnimationFrame(this._boundDrawLoop); - } - }; - //make a singleton - Tone.Draw = new Tone.Draw(); - return Tone.Draw; - }); - Module(function (Tone) { - - /** - * @class Both Tone.Panner3D and Tone.Listener have a position in 3D space - * using a right-handed cartesian coordinate system. - * The units used in the coordinate system are not defined; - * these coordinates are independent/invariant of any particular - * units such as meters or feet. Tone.Panner3D objects have an forward - * vector representing the direction the sound is projecting. Additionally, - * they have a sound cone representing how directional the sound is. - * For example, the sound could be omnidirectional, in which case it would - * be heard anywhere regardless of its forward, or it can be more directional - * and heard only if it is facing the listener. Tone.Listener objects - * (representing a person's ears) have an forward and up vector - * representing in which direction the person is facing. Because both the - * source stream and the listener can be moving, they both have a velocity - * vector representing both the speed and direction of movement. Taken together, - * these two velocities can be used to generate a doppler shift effect which changes the pitch. - * <br><br> - * Note: the position of the Listener will have no effect on nodes not connected to a Tone.Panner3D - * - * @constructor - * @extends {Tone} - * @singleton - */ - Tone.Listener = function () { - Tone.call(this); - /** - * Holds the current forward orientation - * @type {Array} - * @private - */ - this._orientation = [ - 0, - 0, - 0, - 0, - 0, - 0 - ]; - /** - * Holds the current position - * @type {Array} - * @private - */ - this._position = [ - 0, - 0, - 0 - ]; - Tone.getContext(function () { - // set the default position/forward - this.set(ListenerConstructor.defaults); - }.bind(this)); - }; - Tone.extend(Tone.Listener); - /** - * Defaults according to the specification - * @static - * @const - * @type {Object} - */ - Tone.Listener.defaults = { - 'positionX': 0, - 'positionY': 0, - 'positionZ': 0, - 'forwardX': 0, - 'forwardY': 0, - 'forwardZ': 1, - 'upX': 0, - 'upY': 1, - 'upZ': 0 - }; - /** - * The ramp time which is applied to the setTargetAtTime - * @type {Number} - * @private - */ - Tone.Listener.prototype._rampTimeConstant = 0.01; - /** - * Sets the position of the listener in 3d space. - * @param {Number} x - * @param {Number} y - * @param {Number} z - * @return {Tone.Listener} this - */ - Tone.Listener.prototype.setPosition = function (x, y, z) { - if (this.context.listener.positionX) { - var now = this.now(); - this.context.listener.positionX.setTargetAtTime(x, now, this._rampTimeConstant); - this.context.listener.positionY.setTargetAtTime(y, now, this._rampTimeConstant); - this.context.listener.positionZ.setTargetAtTime(z, now, this._rampTimeConstant); - } else { - this.context.listener.setPosition(x, y, z); - } - this._position = Array.prototype.slice.call(arguments); - return this; - }; - /** - * Sets the orientation of the listener using two vectors, the forward - * vector (which direction the listener is facing) and the up vector - * (which the up direction of the listener). An up vector - * of 0, 0, 1 is equivalent to the listener standing up in the Z direction. - * @param {Number} x - * @param {Number} y - * @param {Number} z - * @param {Number} upX - * @param {Number} upY - * @param {Number} upZ - * @return {Tone.Listener} this - */ - Tone.Listener.prototype.setOrientation = function (x, y, z, upX, upY, upZ) { - if (this.context.listener.forwardX) { - var now = this.now(); - this.context.listener.forwardX.setTargetAtTime(x, now, this._rampTimeConstant); - this.context.listener.forwardY.setTargetAtTime(y, now, this._rampTimeConstant); - this.context.listener.forwardZ.setTargetAtTime(z, now, this._rampTimeConstant); - this.context.listener.upX.setTargetAtTime(upX, now, this._rampTimeConstant); - this.context.listener.upY.setTargetAtTime(upY, now, this._rampTimeConstant); - this.context.listener.upZ.setTargetAtTime(upZ, now, this._rampTimeConstant); - } else { - this.context.listener.setOrientation(x, y, z, upX, upY, upZ); - } - this._orientation = Array.prototype.slice.call(arguments); - return this; - }; - /** - * The x position of the panner object. - * @type {Number} - * @memberOf Tone.Listener# - * @name positionX - */ - Object.defineProperty(Tone.Listener.prototype, 'positionX', { - set: function (pos) { - this._position[0] = pos; - this.setPosition.apply(this, this._position); - }, - get: function () { - return this._position[0]; - } - }); - /** - * The y position of the panner object. - * @type {Number} - * @memberOf Tone.Listener# - * @name positionY - */ - Object.defineProperty(Tone.Listener.prototype, 'positionY', { - set: function (pos) { - this._position[1] = pos; - this.setPosition.apply(this, this._position); - }, - get: function () { - return this._position[1]; - } - }); - /** - * The z position of the panner object. - * @type {Number} - * @memberOf Tone.Listener# - * @name positionZ - */ - Object.defineProperty(Tone.Listener.prototype, 'positionZ', { - set: function (pos) { - this._position[2] = pos; - this.setPosition.apply(this, this._position); - }, - get: function () { - return this._position[2]; - } - }); - /** - * The x coordinate of the listeners front direction. i.e. - * which way they are facing. - * @type {Number} - * @memberOf Tone.Listener# - * @name forwardX - */ - Object.defineProperty(Tone.Listener.prototype, 'forwardX', { - set: function (pos) { - this._orientation[0] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[0]; - } - }); - /** - * The y coordinate of the listeners front direction. i.e. - * which way they are facing. - * @type {Number} - * @memberOf Tone.Listener# - * @name forwardY - */ - Object.defineProperty(Tone.Listener.prototype, 'forwardY', { - set: function (pos) { - this._orientation[1] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[1]; - } - }); - /** - * The z coordinate of the listeners front direction. i.e. - * which way they are facing. - * @type {Number} - * @memberOf Tone.Listener# - * @name forwardZ - */ - Object.defineProperty(Tone.Listener.prototype, 'forwardZ', { - set: function (pos) { - this._orientation[2] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[2]; - } - }); - /** - * The x coordinate of the listener's up direction. i.e. - * the direction the listener is standing in. - * @type {Number} - * @memberOf Tone.Listener# - * @name upX - */ - Object.defineProperty(Tone.Listener.prototype, 'upX', { - set: function (pos) { - this._orientation[3] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[3]; - } - }); - /** - * The y coordinate of the listener's up direction. i.e. - * the direction the listener is standing in. - * @type {Number} - * @memberOf Tone.Listener# - * @name upY - */ - Object.defineProperty(Tone.Listener.prototype, 'upY', { - set: function (pos) { - this._orientation[4] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[4]; - } - }); - /** - * The z coordinate of the listener's up direction. i.e. - * the direction the listener is standing in. - * @type {Number} - * @memberOf Tone.Listener# - * @name upZ - */ - Object.defineProperty(Tone.Listener.prototype, 'upZ', { - set: function (pos) { - this._orientation[5] = pos; - this.setOrientation.apply(this, this._orientation); - }, - get: function () { - return this._orientation[5]; - } - }); - /** - * Clean up. - * @returns {Tone.Listener} this - */ - Tone.Listener.prototype.dispose = function () { - this._orientation = null; - this._position = null; - return this; - }; - //SINGLETON SETUP - var ListenerConstructor = Tone.Listener; - Tone.Listener = new ListenerConstructor(); - Tone.Context.on('init', function (context) { - if (context.Listener instanceof ListenerConstructor) { - //a single listener object - Tone.Listener = context.Listener; - } else { - //make new Listener insides - Tone.Listener = new ListenerConstructor(); - } - context.Listener = Tone.Listener; - }); - //END SINGLETON SETUP - return Tone.Listener; - }); - Module(function (Tone) { - /** - * Because of a bug in iOS causing the currentTime to increment - * before the rendering is started, sometimes it takes multiple - * attempts to render the audio correctly. - * @private - */ - function attemptRender(callback, duration, sampleRate, tries) { - tries = Tone.defaultArg(tries, 0); - var context = new Tone.OfflineContext(2, duration, sampleRate); - Tone.context = context; - //invoke the callback/scheduling - var response = callback(Tone.Transport); - if (context.currentTime > 0 && tries < 1000) { - return attemptRender(callback, duration, sampleRate, ++tries); - } else { - return { - 'response': response, - 'context': context - }; - } - } - /** - * Generate a buffer by rendering all of the Tone.js code within the callback using the OfflineAudioContext. - * The OfflineAudioContext is capable of rendering much faster than real time in many cases. - * The callback function also passes in an offline instance of Tone.Transport which can be used - * to schedule events along the Transport. **NOTE** OfflineAudioContext has the same restrictions - * as the AudioContext in that on certain platforms (like iOS) it must be invoked by an explicit - * user action like a click or tap. - * @param {Function} callback All Tone.js nodes which are created and scheduled within this callback are recorded into the output Buffer. - * @param {Time} duration the amount of time to record for. - * @return {Promise} The promise which is invoked with the Tone.Buffer of the recorded output. - * @example - * //render 2 seconds of the oscillator - * Tone.Offline(function(){ - * //only nodes created in this callback will be recorded - * var oscillator = new Tone.Oscillator().toMaster().start(0) - * //schedule their events - * }, 2).then(function(buffer){ - * //do something with the output buffer - * }) - * @example - * //can also schedule events along the Transport - * //using the passed in Offline Transport - * Tone.Offline(function(Transport){ - * var osc = new Tone.Oscillator().toMaster() - * Transport.schedule(function(time){ - * osc.start(time).stop(time + 0.1) - * }, 1) - * Transport.start(0.2) - * }, 4).then(function(buffer){ - * //do something with the output buffer - * }) - */ - Tone.Offline = function (callback, duration) { - //set the OfflineAudioContext - var sampleRate = Tone.context.sampleRate; - var originalContext = Tone.context; - var renderRet = attemptRender(callback, duration, sampleRate); - var response = renderRet.response; - var context = renderRet.context; - var ret; - if (response instanceof Promise) { - //wait for the promise to resolve - ret = response.then(function () { - //then render the audio - return context.render(); - }); - } else { - //process the audio - ret = context.render(); - } - //return the original AudioContext - Tone.context = originalContext; - //return the audio - return ret.then(function (buffer) { - //wrap it in a Tone.Buffer - return new Tone.Buffer(buffer); - }); - }; - return Tone.Offline; - }); - Module(function (Tone) { - - /** - * @class Tone.Effect is the base class for effects. Connect the effect between - * the effectSend and effectReturn GainNodes, then control the amount of - * effect which goes to the output using the wet control. - * - * @constructor - * @extends {Tone.AudioNode} - * @param {NormalRange|Object} [wet] The starting wet value. - */ - Tone.Effect = function () { - var options = Tone.defaults(arguments, ['wet'], Tone.Effect); - Tone.AudioNode.call(this); - this.createInsOuts(1, 1); - /** - * the drywet knob to control the amount of effect - * @type {Tone.CrossFade} - * @private - */ - this._dryWet = new Tone.CrossFade(options.wet); - /** - * The wet control is how much of the effected - * will pass through to the output. 1 = 100% effected - * signal, 0 = 100% dry signal. - * @type {NormalRange} - * @signal - */ - this.wet = this._dryWet.fade; - /** - * connect the effectSend to the input of hte effect - * @type {Tone.Gain} - * @private - */ - this.effectSend = new Tone.Gain(); - /** - * connect the output of the effect to the effectReturn - * @type {Tone.Gain} - * @private - */ - this.effectReturn = new Tone.Gain(); - //connections - this.input.connect(this._dryWet.a); - this.input.connect(this.effectSend); - this.effectReturn.connect(this._dryWet.b); - this._dryWet.connect(this.output); - this._readOnly(['wet']); - }; - Tone.extend(Tone.Effect, Tone.AudioNode); - /** - * @static - * @type {Object} - */ - Tone.Effect.defaults = { 'wet': 1 }; - /** - * chains the effect in between the effectSend and effectReturn - * @param {Tone} effect - * @private - * @returns {Tone.Effect} this - */ - Tone.Effect.prototype.connectEffect = function (effect) { - this.effectSend.chain(effect, this.effectReturn); - return this; - }; - /** - * Clean up. - * @returns {Tone.Effect} this - */ - Tone.Effect.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._dryWet.dispose(); - this._dryWet = null; - this.effectSend.dispose(); - this.effectSend = null; - this.effectReturn.dispose(); - this.effectReturn = null; - this._writable(['wet']); - this.wet = null; - return this; - }; - return Tone.Effect; - }); - Module(function (Tone) { - - /** - * @class Tone.AutoFilter is a Tone.Filter with a Tone.LFO connected to the filter cutoff frequency. - * Setting the LFO rate and depth allows for control over the filter modulation rate - * and depth. - * - * @constructor - * @extends {Tone.Effect} - * @param {Time|Object} [frequency] The rate of the LFO. - * @param {Frequency=} baseFrequency The lower value of the LFOs oscillation - * @param {Frequency=} octaves The number of octaves above the baseFrequency - * @example - * //create an autofilter and start it's LFO - * var autoFilter = new Tone.AutoFilter("4n").toMaster().start(); - * //route an oscillator through the filter and start it - * var oscillator = new Tone.Oscillator().connect(autoFilter).start(); - */ - Tone.AutoFilter = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'baseFrequency', - 'octaves' - ], Tone.AutoFilter); - Tone.Effect.call(this, options); - /** - * the lfo which drives the filter cutoff - * @type {Tone.LFO} - * @private - */ - this._lfo = new Tone.LFO({ - 'frequency': options.frequency, - 'amplitude': options.depth - }); - /** - * The range of the filter modulating between the min and max frequency. - * 0 = no modulation. 1 = full modulation. - * @type {NormalRange} - * @signal - */ - this.depth = this._lfo.amplitude; - /** - * How fast the filter modulates between min and max. - * @type {Frequency} - * @signal - */ - this.frequency = this._lfo.frequency; - /** - * The filter node - * @type {Tone.Filter} - */ - this.filter = new Tone.Filter(options.filter); - /** - * The octaves placeholder - * @type {Positive} - * @private - */ - this._octaves = 0; - //connections - this.connectEffect(this.filter); - this._lfo.connect(this.filter.frequency); - this.type = options.type; - this._readOnly([ - 'frequency', - 'depth' - ]); - this.octaves = options.octaves; - this.baseFrequency = options.baseFrequency; - }; - //extend Effect - Tone.extend(Tone.AutoFilter, Tone.Effect); - /** - * defaults - * @static - * @type {Object} - */ - Tone.AutoFilter.defaults = { - 'frequency': 1, - 'type': 'sine', - 'depth': 1, - 'baseFrequency': 200, - 'octaves': 2.6, - 'filter': { - 'type': 'lowpass', - 'rolloff': -12, - 'Q': 1 - } - }; - /** - * Start the effect. - * @param {Time} [time=now] When the LFO will start. - * @returns {Tone.AutoFilter} this - */ - Tone.AutoFilter.prototype.start = function (time) { - this._lfo.start(time); - return this; - }; - /** - * Stop the effect. - * @param {Time} [time=now] When the LFO will stop. - * @returns {Tone.AutoFilter} this - */ - Tone.AutoFilter.prototype.stop = function (time) { - this._lfo.stop(time); - return this; - }; - /** - * Sync the filter to the transport. - * @param {Time} [delay=0] Delay time before starting the effect after the - * Transport has started. - * @returns {Tone.AutoFilter} this - */ - Tone.AutoFilter.prototype.sync = function (delay) { - this._lfo.sync(delay); - return this; - }; - /** - * Unsync the filter from the transport. - * @returns {Tone.AutoFilter} this - */ - Tone.AutoFilter.prototype.unsync = function () { - this._lfo.unsync(); - return this; - }; - /** - * Type of oscillator attached to the AutoFilter. - * Possible values: "sine", "square", "triangle", "sawtooth". - * @memberOf Tone.AutoFilter# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.AutoFilter.prototype, 'type', { - get: function () { - return this._lfo.type; - }, - set: function (type) { - this._lfo.type = type; - } - }); - /** - * The minimum value of the filter's cutoff frequency. - * @memberOf Tone.AutoFilter# - * @type {Frequency} - * @name min - */ - Object.defineProperty(Tone.AutoFilter.prototype, 'baseFrequency', { - get: function () { - return this._lfo.min; - }, - set: function (freq) { - this._lfo.min = this.toFrequency(freq); - //and set the max - this.octaves = this._octaves; - } - }); - /** - * The maximum value of the filter's cutoff frequency. - * @memberOf Tone.AutoFilter# - * @type {Positive} - * @name octaves - */ - Object.defineProperty(Tone.AutoFilter.prototype, 'octaves', { - get: function () { - return this._octaves; - }, - set: function (oct) { - this._octaves = oct; - this._lfo.max = this.baseFrequency * Math.pow(2, oct); - } - }); - /** - * Clean up. - * @returns {Tone.AutoFilter} this - */ - Tone.AutoFilter.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._lfo.dispose(); - this._lfo = null; - this.filter.dispose(); - this.filter = null; - this._writable([ - 'frequency', - 'depth' - ]); - this.frequency = null; - this.depth = null; - return this; - }; - return Tone.AutoFilter; - }); - Module(function (Tone) { - - /** - * @class Tone.AutoPanner is a Tone.Panner with an LFO connected to the pan amount. - * More on using autopanners [here](https://www.ableton.com/en/blog/autopan-chopper-effect-and-more-liveschool/). - * - * @constructor - * @extends {Tone.Effect} - * @param {Frequency|Object} [frequency] Rate of left-right oscillation. - * @example - * //create an autopanner and start it's LFO - * var autoPanner = new Tone.AutoPanner("4n").toMaster().start(); - * //route an oscillator through the panner and start it - * var oscillator = new Tone.Oscillator().connect(autoPanner).start(); - */ - Tone.AutoPanner = function () { - var options = Tone.defaults(arguments, ['frequency'], Tone.AutoPanner); - Tone.Effect.call(this, options); - /** - * the lfo which drives the panning - * @type {Tone.LFO} - * @private - */ - this._lfo = new Tone.LFO({ - 'frequency': options.frequency, - 'amplitude': options.depth, - 'min': -1, - 'max': 1 - }); - /** - * The amount of panning between left and right. - * 0 = always center. 1 = full range between left and right. - * @type {NormalRange} - * @signal - */ - this.depth = this._lfo.amplitude; - /** - * the panner node which does the panning - * @type {Tone.Panner} - * @private - */ - this._panner = new Tone.Panner(); - /** - * How fast the panner modulates between left and right. - * @type {Frequency} - * @signal - */ - this.frequency = this._lfo.frequency; - //connections - this.connectEffect(this._panner); - this._lfo.connect(this._panner.pan); - this.type = options.type; - this._readOnly([ - 'depth', - 'frequency' - ]); - }; - //extend Effect - Tone.extend(Tone.AutoPanner, Tone.Effect); - /** - * defaults - * @static - * @type {Object} - */ - Tone.AutoPanner.defaults = { - 'frequency': 1, - 'type': 'sine', - 'depth': 1 - }; - /** - * Start the effect. - * @param {Time} [time=now] When the LFO will start. - * @returns {Tone.AutoPanner} this - */ - Tone.AutoPanner.prototype.start = function (time) { - this._lfo.start(time); - return this; - }; - /** - * Stop the effect. - * @param {Time} [time=now] When the LFO will stop. - * @returns {Tone.AutoPanner} this - */ - Tone.AutoPanner.prototype.stop = function (time) { - this._lfo.stop(time); - return this; - }; - /** - * Sync the panner to the transport. - * @param {Time} [delay=0] Delay time before starting the effect after the - * Transport has started. - * @returns {Tone.AutoPanner} this - */ - Tone.AutoPanner.prototype.sync = function (delay) { - this._lfo.sync(delay); - return this; - }; - /** - * Unsync the panner from the transport - * @returns {Tone.AutoPanner} this - */ - Tone.AutoPanner.prototype.unsync = function () { - this._lfo.unsync(); - return this; - }; - /** - * Type of oscillator attached to the AutoFilter. - * Possible values: "sine", "square", "triangle", "sawtooth". - * @memberOf Tone.AutoFilter# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.AutoPanner.prototype, 'type', { - get: function () { - return this._lfo.type; - }, - set: function (type) { - this._lfo.type = type; - } - }); - /** - * clean up - * @returns {Tone.AutoPanner} this - */ - Tone.AutoPanner.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._lfo.dispose(); - this._lfo = null; - this._panner.dispose(); - this._panner = null; - this._writable([ - 'depth', - 'frequency' - ]); - this.frequency = null; - this.depth = null; - return this; - }; - return Tone.AutoPanner; - }); - Module(function (Tone) { - - /** - * @class Tone.AutoWah connects a Tone.Follower to a bandpass filter (Tone.Filter). - * The frequency of the filter is adjusted proportionally to the - * incoming signal's amplitude. Inspiration from [Tuna.js](https://github.com/Dinahmoe/tuna). - * - * @constructor - * @extends {Tone.Effect} - * @param {Frequency|Object} [baseFrequency] The frequency the filter is set - * to at the low point of the wah - * @param {Positive} [octaves] The number of octaves above the baseFrequency - * the filter will sweep to when fully open - * @param {Decibels} [sensitivity] The decibel threshold sensitivity for - * the incoming signal. Normal range of -40 to 0. - * @example - * var autoWah = new Tone.AutoWah(50, 6, -30).toMaster(); - * //initialize the synth and connect to autowah - * var synth = new Synth.connect(autoWah); - * //Q value influences the effect of the wah - default is 2 - * autoWah.Q.value = 6; - * //more audible on higher notes - * synth.triggerAttackRelease("C4", "8n") - */ - Tone.AutoWah = function () { - var options = Tone.defaults(arguments, [ - 'baseFrequency', - 'octaves', - 'sensitivity' - ], Tone.AutoWah); - Tone.Effect.call(this, options); - /** - * The envelope follower. Set the attack/release - * timing to adjust how the envelope is followed. - * @type {Tone.Follower} - * @private - */ - this.follower = new Tone.Follower(options.follower); - /** - * scales the follower value to the frequency domain - * @type {Tone} - * @private - */ - this._sweepRange = new Tone.ScaleExp(0, 1, 0.5); - /** - * @type {number} - * @private - */ - this._baseFrequency = options.baseFrequency; - /** - * @type {number} - * @private - */ - this._octaves = options.octaves; - /** - * the input gain to adjust the sensitivity - * @type {Tone.Gain} - * @private - */ - this._inputBoost = new Tone.Gain(); - /** - * @type {BiquadFilterNode} - * @private - */ - this._bandpass = new Tone.Filter({ - 'rolloff': -48, - 'frequency': 0, - 'Q': options.Q - }); - /** - * @type {Tone.Filter} - * @private - */ - this._peaking = new Tone.Filter(0, 'peaking'); - this._peaking.gain.value = options.gain; - /** - * The gain of the filter. - * @type {Number} - * @signal - */ - this.gain = this._peaking.gain; - /** - * The quality of the filter. - * @type {Positive} - * @signal - */ - this.Q = this._bandpass.Q; - //the control signal path - this.effectSend.chain(this._inputBoost, this.follower, this._sweepRange); - this._sweepRange.connect(this._bandpass.frequency); - this._sweepRange.connect(this._peaking.frequency); - //the filtered path - this.effectSend.chain(this._bandpass, this._peaking, this.effectReturn); - //set the initial value - this._setSweepRange(); - this.sensitivity = options.sensitivity; - this._readOnly([ - 'gain', - 'Q' - ]); - }; - Tone.extend(Tone.AutoWah, Tone.Effect); - /** - * @static - * @type {Object} - */ - Tone.AutoWah.defaults = { - 'baseFrequency': 100, - 'octaves': 6, - 'sensitivity': 0, - 'Q': 2, - 'gain': 2, - 'follower': { - 'attack': 0.3, - 'release': 0.5 - } - }; - /** - * The number of octaves that the filter will sweep above the - * baseFrequency. - * @memberOf Tone.AutoWah# - * @type {Number} - * @name octaves - */ - Object.defineProperty(Tone.AutoWah.prototype, 'octaves', { - get: function () { - return this._octaves; - }, - set: function (octaves) { - this._octaves = octaves; - this._setSweepRange(); - } - }); - /** - * The base frequency from which the sweep will start from. - * @memberOf Tone.AutoWah# - * @type {Frequency} - * @name baseFrequency - */ - Object.defineProperty(Tone.AutoWah.prototype, 'baseFrequency', { - get: function () { - return this._baseFrequency; - }, - set: function (baseFreq) { - this._baseFrequency = baseFreq; - this._setSweepRange(); - } - }); - /** - * The sensitivity to control how responsive to the input signal the filter is. - * @memberOf Tone.AutoWah# - * @type {Decibels} - * @name sensitivity - */ - Object.defineProperty(Tone.AutoWah.prototype, 'sensitivity', { - get: function () { - return Tone.gainToDb(1 / this._inputBoost.gain.value); - }, - set: function (sensitivy) { - this._inputBoost.gain.value = 1 / Tone.dbToGain(sensitivy); - } - }); - /** - * sets the sweep range of the scaler - * @private - */ - Tone.AutoWah.prototype._setSweepRange = function () { - this._sweepRange.min = this._baseFrequency; - this._sweepRange.max = Math.min(this._baseFrequency * Math.pow(2, this._octaves), this.context.sampleRate / 2); - }; - /** - * Clean up. - * @returns {Tone.AutoWah} this - */ - Tone.AutoWah.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this.follower.dispose(); - this.follower = null; - this._sweepRange.dispose(); - this._sweepRange = null; - this._bandpass.dispose(); - this._bandpass = null; - this._peaking.dispose(); - this._peaking = null; - this._inputBoost.dispose(); - this._inputBoost = null; - this._writable([ - 'gain', - 'Q' - ]); - this.gain = null; - this.Q = null; - return this; - }; - return Tone.AutoWah; - }); - Module(function (Tone) { - - /** - * @class Signal-rate modulo operator. Only works in AudioRange [-1, 1] and for modulus - * values in the NormalRange. - * - * @constructor - * @extends {Tone.SignalBase} - * @param {NormalRange} modulus The modulus to apply. - * @example - * var mod = new Tone.Modulo(0.2) - * var sig = new Tone.Signal(0.5).connect(mod); - * //mod outputs 0.1 - */ - Tone.Modulo = function (modulus) { - Tone.SignalBase.call(this); - this.createInsOuts(1, 0); - /** - * A waveshaper gets the integer multiple of - * the input signal and the modulus. - * @private - * @type {Tone.WaveShaper} - */ - this._shaper = new Tone.WaveShaper(Math.pow(2, 16)); - /** - * the integer multiple is multiplied by the modulus - * @type {Tone.Multiply} - * @private - */ - this._multiply = new Tone.Multiply(); - /** - * and subtracted from the input signal - * @type {Tone.Subtract} - * @private - */ - this._subtract = this.output = new Tone.Subtract(); - /** - * the modulus signal - * @type {Tone.Signal} - * @private - */ - this._modSignal = new Tone.Signal(modulus); - //connections - this.input.fan(this._shaper, this._subtract); - this._modSignal.connect(this._multiply, 0, 0); - this._shaper.connect(this._multiply, 0, 1); - this._multiply.connect(this._subtract, 0, 1); - this._setWaveShaper(modulus); - }; - Tone.extend(Tone.Modulo, Tone.SignalBase); - /** - * @param {number} mod the modulus to apply - * @private - */ - Tone.Modulo.prototype._setWaveShaper = function (mod) { - this._shaper.setMap(function (val) { - var multiple = Math.floor((val + 0.0001) / mod); - return multiple; - }); - }; - /** - * The modulus value. - * @memberOf Tone.Modulo# - * @type {NormalRange} - * @name value - */ - Object.defineProperty(Tone.Modulo.prototype, 'value', { - get: function () { - return this._modSignal.value; - }, - set: function (mod) { - this._modSignal.value = mod; - this._setWaveShaper(mod); - } - }); - /** - * clean up - * @returns {Tone.Modulo} this - */ - Tone.Modulo.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._shaper.dispose(); - this._shaper = null; - this._multiply.dispose(); - this._multiply = null; - this._subtract.dispose(); - this._subtract = null; - this._modSignal.dispose(); - this._modSignal = null; - return this; - }; - return Tone.Modulo; - }); - Module(function (Tone) { - - /** - * @class Tone.Bitcrusher downsamples the incoming signal to a different bitdepth. - * Lowering the bitdepth of the signal creates distortion. Read more about Bitcrushing - * on [Wikipedia](https://en.wikipedia.org/wiki/Bitcrusher). - * - * @constructor - * @extends {Tone.Effect} - * @param {Number} bits The number of bits to downsample the signal. Nominal range - * of 1 to 8. - * @example - * //initialize crusher and route a synth through it - * var crusher = new Tone.BitCrusher(4).toMaster(); - * var synth = new Tone.MonoSynth().connect(crusher); - */ - Tone.BitCrusher = function () { - var options = Tone.defaults(arguments, ['bits'], Tone.BitCrusher); - Tone.Effect.call(this, options); - var invStepSize = 1 / Math.pow(2, options.bits - 1); - /** - * Subtract the input signal and the modulus of the input signal - * @type {Tone.Subtract} - * @private - */ - this._subtract = new Tone.Subtract(); - /** - * The mod function - * @type {Tone.Modulo} - * @private - */ - this._modulo = new Tone.Modulo(invStepSize); - /** - * keeps track of the bits - * @type {number} - * @private - */ - this._bits = options.bits; - //connect it up - this.effectSend.fan(this._subtract, this._modulo); - this._modulo.connect(this._subtract, 0, 1); - this._subtract.connect(this.effectReturn); - }; - Tone.extend(Tone.BitCrusher, Tone.Effect); - /** - * the default values - * @static - * @type {Object} - */ - Tone.BitCrusher.defaults = { 'bits': 4 }; - /** - * The bit depth of the effect. Nominal range of 1-8. - * @memberOf Tone.BitCrusher# - * @type {number} - * @name bits - */ - Object.defineProperty(Tone.BitCrusher.prototype, 'bits', { - get: function () { - return this._bits; - }, - set: function (bits) { - this._bits = bits; - var invStepSize = 1 / Math.pow(2, bits - 1); - this._modulo.value = invStepSize; - } - }); - /** - * Clean up. - * @returns {Tone.BitCrusher} this - */ - Tone.BitCrusher.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._subtract.dispose(); - this._subtract = null; - this._modulo.dispose(); - this._modulo = null; - return this; - }; - return Tone.BitCrusher; - }); - Module(function (Tone) { - - /** - * @class Tone.ChebyShev is a Chebyshev waveshaper, an effect which is good - * for making different types of distortion sounds. - * Note that odd orders sound very different from even ones, - * and order = 1 is no change. - * Read more at [music.columbia.edu](http://music.columbia.edu/cmc/musicandcomputers/chapter4/04_06.php). - * - * @extends {Tone.Effect} - * @constructor - * @param {Positive|Object} [order] The order of the chebyshev polynomial. Normal range between 1-100. - * @example - * //create a new cheby - * var cheby = new Tone.Chebyshev(50); - * //create a monosynth connected to our cheby - * synth = new Tone.MonoSynth().connect(cheby); - */ - Tone.Chebyshev = function () { - var options = Tone.defaults(arguments, ['order'], Tone.Chebyshev); - Tone.Effect.call(this, options); - /** - * @type {WaveShaperNode} - * @private - */ - this._shaper = new Tone.WaveShaper(4096); - /** - * holds onto the order of the filter - * @type {number} - * @private - */ - this._order = options.order; - this.connectEffect(this._shaper); - this.order = options.order; - this.oversample = options.oversample; - }; - Tone.extend(Tone.Chebyshev, Tone.Effect); - /** - * @static - * @const - * @type {Object} - */ - Tone.Chebyshev.defaults = { - 'order': 1, - 'oversample': 'none' - }; - /** - * get the coefficient for that degree - * @param {number} x the x value - * @param {number} degree - * @param {Object} memo memoize the computed value. - * this speeds up computation greatly. - * @return {number} the coefficient - * @private - */ - Tone.Chebyshev.prototype._getCoefficient = function (x, degree, memo) { - if (memo.hasOwnProperty(degree)) { - return memo[degree]; - } else if (degree === 0) { - memo[degree] = 0; - } else if (degree === 1) { - memo[degree] = x; - } else { - memo[degree] = 2 * x * this._getCoefficient(x, degree - 1, memo) - this._getCoefficient(x, degree - 2, memo); - } - return memo[degree]; - }; - /** - * The order of the Chebyshev polynomial which creates - * the equation which is applied to the incoming - * signal through a Tone.WaveShaper. The equations - * are in the form:<br> - * order 2: 2x^2 + 1<br> - * order 3: 4x^3 + 3x <br> - * @memberOf Tone.Chebyshev# - * @type {Positive} - * @name order - */ - Object.defineProperty(Tone.Chebyshev.prototype, 'order', { - get: function () { - return this._order; - }, - set: function (order) { - this._order = order; - var curve = new Array(4096); - var len = curve.length; - for (var i = 0; i < len; ++i) { - var x = i * 2 / len - 1; - if (x === 0) { - //should output 0 when input is 0 - curve[i] = 0; - } else { - curve[i] = this._getCoefficient(x, order, {}); - } - } - this._shaper.curve = curve; - } - }); - /** - * The oversampling of the effect. Can either be "none", "2x" or "4x". - * @memberOf Tone.Chebyshev# - * @type {string} - * @name oversample - */ - Object.defineProperty(Tone.Chebyshev.prototype, 'oversample', { - get: function () { - return this._shaper.oversample; - }, - set: function (oversampling) { - this._shaper.oversample = oversampling; - } - }); - /** - * Clean up. - * @returns {Tone.Chebyshev} this - */ - Tone.Chebyshev.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._shaper.dispose(); - this._shaper = null; - return this; - }; - return Tone.Chebyshev; - }); - Module(function (Tone) { - - /** - * @class Base class for Stereo effects. Provides effectSendL/R and effectReturnL/R. - * - * @constructor - * @extends {Tone.Effect} - */ - Tone.StereoEffect = function () { - //get the defaults - Tone.AudioNode.call(this); - var options = Tone.defaults(arguments, ['wet'], Tone.Effect); - this.createInsOuts(1, 1); - /** - * the drywet knob to control the amount of effect - * @type {Tone.CrossFade} - * @private - */ - this._dryWet = new Tone.CrossFade(options.wet); - /** - * The wet control, i.e. how much of the effected - * will pass through to the output. - * @type {NormalRange} - * @signal - */ - this.wet = this._dryWet.fade; - /** - * then split it - * @type {Tone.Split} - * @private - */ - this._split = new Tone.Split(); - /** - * the effects send LEFT - * @type {GainNode} - * @private - */ - this.effectSendL = this._split.left; - /** - * the effects send RIGHT - * @type {GainNode} - * @private - */ - this.effectSendR = this._split.right; - /** - * the stereo effect merger - * @type {Tone.Merge} - * @private - */ - this._merge = new Tone.Merge(); - /** - * the effect return LEFT - * @type {GainNode} - * @private - */ - this.effectReturnL = this._merge.left; - /** - * the effect return RIGHT - * @type {GainNode} - * @private - */ - this.effectReturnR = this._merge.right; - //connections - this.input.connect(this._split); - //dry wet connections - this.input.connect(this._dryWet, 0, 0); - this._merge.connect(this._dryWet, 0, 1); - this._dryWet.connect(this.output); - this._readOnly(['wet']); - }; - Tone.extend(Tone.StereoEffect, Tone.Effect); - /** - * Clean up. - * @returns {Tone.StereoEffect} this - */ - Tone.StereoEffect.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._dryWet.dispose(); - this._dryWet = null; - this._split.dispose(); - this._split = null; - this._merge.dispose(); - this._merge = null; - this.effectSendL = null; - this.effectSendR = null; - this.effectReturnL = null; - this.effectReturnR = null; - this._writable(['wet']); - this.wet = null; - return this; - }; - return Tone.StereoEffect; - }); - Module(function (Tone) { - - /** - * @class Tone.Chorus is a stereo chorus effect composed of - * a left and right delay with a Tone.LFO applied to the delayTime of each channel. - * Inspiration from [Tuna.js](https://github.com/Dinahmoe/tuna/blob/master/tuna.js). - * Read more on the chorus effect on [SoundOnSound](http://www.soundonsound.com/sos/jun04/articles/synthsecrets.htm). - * - * @constructor - * @extends {Tone.StereoEffect} - * @param {Frequency|Object} [frequency] The frequency of the LFO. - * @param {Milliseconds} [delayTime] The delay of the chorus effect in ms. - * @param {NormalRange} [depth] The depth of the chorus. - * @example - * var chorus = new Tone.Chorus(4, 2.5, 0.5); - * var synth = new Tone.PolySynth(4, Tone.MonoSynth).connect(chorus); - * synth.triggerAttackRelease(["C3","E3","G3"], "8n"); - */ - Tone.Chorus = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'delayTime', - 'depth' - ], Tone.Chorus); - Tone.StereoEffect.call(this, options); - /** - * the depth of the chorus - * @type {number} - * @private - */ - this._depth = options.depth; - /** - * the delayTime - * @type {number} - * @private - */ - this._delayTime = options.delayTime / 1000; - /** - * the lfo which controls the delayTime - * @type {Tone.LFO} - * @private - */ - this._lfoL = new Tone.LFO({ - 'frequency': options.frequency, - 'min': 0, - 'max': 1 - }); - /** - * another LFO for the right side with a 180 degree phase diff - * @type {Tone.LFO} - * @private - */ - this._lfoR = new Tone.LFO({ - 'frequency': options.frequency, - 'min': 0, - 'max': 1, - 'phase': 180 - }); - /** - * delay for left - * @type {Tone.Delay} - * @private - */ - this._delayNodeL = new Tone.Delay(); - /** - * delay for right - * @type {Tone.Delay} - * @private - */ - this._delayNodeR = new Tone.Delay(); - /** - * The frequency of the LFO which modulates the delayTime. - * @type {Frequency} - * @signal - */ - this.frequency = this._lfoL.frequency; - //connections - this.effectSendL.chain(this._delayNodeL, this.effectReturnL); - this.effectSendR.chain(this._delayNodeR, this.effectReturnR); - //and pass through to make the detune apparent - this.effectSendL.connect(this.effectReturnL); - this.effectSendR.connect(this.effectReturnR); - //lfo setup - this._lfoL.connect(this._delayNodeL.delayTime); - this._lfoR.connect(this._delayNodeR.delayTime); - //start the lfo - this._lfoL.start(); - this._lfoR.start(); - //have one LFO frequency control the other - this._lfoL.frequency.connect(this._lfoR.frequency); - //set the initial values - this.depth = this._depth; - this.frequency.value = options.frequency; - this.type = options.type; - this._readOnly(['frequency']); - this.spread = options.spread; - }; - Tone.extend(Tone.Chorus, Tone.StereoEffect); - /** - * @static - * @type {Object} - */ - Tone.Chorus.defaults = { - 'frequency': 1.5, - 'delayTime': 3.5, - 'depth': 0.7, - 'type': 'sine', - 'spread': 180 - }; - /** - * The depth of the effect. A depth of 1 makes the delayTime - * modulate between 0 and 2*delayTime (centered around the delayTime). - * @memberOf Tone.Chorus# - * @type {NormalRange} - * @name depth - */ - Object.defineProperty(Tone.Chorus.prototype, 'depth', { - get: function () { - return this._depth; - }, - set: function (depth) { - this._depth = depth; - var deviation = this._delayTime * depth; - this._lfoL.min = Math.max(this._delayTime - deviation, 0); - this._lfoL.max = this._delayTime + deviation; - this._lfoR.min = Math.max(this._delayTime - deviation, 0); - this._lfoR.max = this._delayTime + deviation; - } - }); - /** - * The delayTime in milliseconds of the chorus. A larger delayTime - * will give a more pronounced effect. Nominal range a delayTime - * is between 2 and 20ms. - * @memberOf Tone.Chorus# - * @type {Milliseconds} - * @name delayTime - */ - Object.defineProperty(Tone.Chorus.prototype, 'delayTime', { - get: function () { - return this._delayTime * 1000; - }, - set: function (delayTime) { - this._delayTime = delayTime / 1000; - this.depth = this._depth; - } - }); - /** - * The oscillator type of the LFO. - * @memberOf Tone.Chorus# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.Chorus.prototype, 'type', { - get: function () { - return this._lfoL.type; - }, - set: function (type) { - this._lfoL.type = type; - this._lfoR.type = type; - } - }); - /** - * Amount of stereo spread. When set to 0, both LFO's will be panned centrally. - * When set to 180, LFO's will be panned hard left and right respectively. - * @memberOf Tone.Chorus# - * @type {Degrees} - * @name spread - */ - Object.defineProperty(Tone.Chorus.prototype, 'spread', { - get: function () { - return this._lfoR.phase - this._lfoL.phase; - }, - set: function (spread) { - this._lfoL.phase = 90 - spread / 2; - this._lfoR.phase = spread / 2 + 90; - } - }); - /** - * Clean up. - * @returns {Tone.Chorus} this - */ - Tone.Chorus.prototype.dispose = function () { - Tone.StereoEffect.prototype.dispose.call(this); - this._lfoL.dispose(); - this._lfoL = null; - this._lfoR.dispose(); - this._lfoR = null; - this._delayNodeL.dispose(); - this._delayNodeL = null; - this._delayNodeR.dispose(); - this._delayNodeR = null; - this._writable('frequency'); - this.frequency = null; - return this; - }; - return Tone.Chorus; - }); - Module(function (Tone) { - - /** - * @class Tone.Convolver is a wrapper around the Native Web Audio - * [ConvolverNode](http://webaudio.github.io/web-audio-api/#the-convolvernode-interface). - * Convolution is useful for reverb and filter emulation. Read more about convolution reverb on - * [Wikipedia](https://en.wikipedia.org/wiki/Convolution_reverb). - * - * @constructor - * @extends {Tone.Effect} - * @param {string|Tone.Buffer|Object} [url] The URL of the impulse response or the Tone.Buffer - * contianing the impulse response. - * @param {Function=} onload The callback to invoke when the url is loaded. - * @example - * //initializing the convolver with an impulse response - * var convolver = new Tone.Convolver("./path/to/ir.wav").toMaster(); - */ - Tone.Convolver = function () { - var options = Tone.defaults(arguments, [ - 'url', - 'onload' - ], Tone.Convolver); - Tone.Effect.call(this, options); - /** - * convolver node - * @type {ConvolverNode} - * @private - */ - this._convolver = this.context.createConvolver(); - /** - * the convolution buffer - * @type {Tone.Buffer} - * @private - */ - this._buffer = new Tone.Buffer(options.url, function (buffer) { - this._convolver.buffer = buffer.get(); - options.onload(); - }.bind(this)); - this.connectEffect(this._convolver); - }; - Tone.extend(Tone.Convolver, Tone.Effect); - /** - * @static - * @const - * @type {Object} - */ - Tone.Convolver.defaults = { 'onload': Tone.noOp }; - /** - * The convolver's buffer - * @memberOf Tone.Convolver# - * @type {AudioBuffer} - * @name buffer - */ - Object.defineProperty(Tone.Convolver.prototype, 'buffer', { - get: function () { - return this._buffer.get(); - }, - set: function (buffer) { - this._buffer.set(buffer); - this._convolver.buffer = this._buffer.get(); - } - }); - /** - * Load an impulse response url as an audio buffer. - * Decodes the audio asynchronously and invokes - * the callback once the audio buffer loads. - * @param {string} url The url of the buffer to load. - * filetype support depends on the - * browser. - * @param {function=} callback - * @returns {Promise} - */ - Tone.Convolver.prototype.load = function (url, callback) { - return this._buffer.load(url, function (buff) { - this.buffer = buff; - if (callback) { - callback(); - } - }.bind(this)); - }; - /** - * Clean up. - * @returns {Tone.Convolver} this - */ - Tone.Convolver.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._convolver.disconnect(); - this._convolver = null; - this._buffer.dispose(); - this._buffer = null; - return this; - }; - return Tone.Convolver; - }); - Module(function (Tone) { - - /** - * @class Tone.Distortion is a simple distortion effect using Tone.WaveShaper. - * Algorithm from [a stackoverflow answer](http://stackoverflow.com/a/22313408). - * - * @extends {Tone.Effect} - * @constructor - * @param {Number|Object} [distortion] The amount of distortion (nominal range of 0-1) - * @example - * var dist = new Tone.Distortion(0.8).toMaster(); - * var fm = new Tone.SimpleFM().connect(dist); - * //this sounds good on bass notes - * fm.triggerAttackRelease("A1", "8n"); - */ - Tone.Distortion = function () { - var options = Tone.defaults(arguments, ['distortion'], Tone.Distortion); - Tone.Effect.call(this, options); - /** - * @type {Tone.WaveShaper} - * @private - */ - this._shaper = new Tone.WaveShaper(4096); - /** - * holds the distortion amount - * @type {number} - * @private - */ - this._distortion = options.distortion; - this.connectEffect(this._shaper); - this.distortion = options.distortion; - this.oversample = options.oversample; - }; - Tone.extend(Tone.Distortion, Tone.Effect); - /** - * @static - * @const - * @type {Object} - */ - Tone.Distortion.defaults = { - 'distortion': 0.4, - 'oversample': 'none' - }; - /** - * The amount of distortion. - * @memberOf Tone.Distortion# - * @type {NormalRange} - * @name distortion - */ - Object.defineProperty(Tone.Distortion.prototype, 'distortion', { - get: function () { - return this._distortion; - }, - set: function (amount) { - this._distortion = amount; - var k = amount * 100; - var deg = Math.PI / 180; - this._shaper.setMap(function (x) { - if (Math.abs(x) < 0.001) { - //should output 0 when input is 0 - return 0; - } else { - return (3 + k) * x * 20 * deg / (Math.PI + k * Math.abs(x)); - } - }); - } - }); - /** - * The oversampling of the effect. Can either be "none", "2x" or "4x". - * @memberOf Tone.Distortion# - * @type {string} - * @name oversample - */ - Object.defineProperty(Tone.Distortion.prototype, 'oversample', { - get: function () { - return this._shaper.oversample; - }, - set: function (oversampling) { - this._shaper.oversample = oversampling; - } - }); - /** - * Clean up. - * @returns {Tone.Distortion} this - */ - Tone.Distortion.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._shaper.dispose(); - this._shaper = null; - return this; - }; - return Tone.Distortion; - }); - Module(function (Tone) { - - /** - * @class Tone.FeedbackEffect provides a loop between an - * audio source and its own output. This is a base-class - * for feedback effects. - * - * @constructor - * @extends {Tone.Effect} - * @param {NormalRange|Object} [feedback] The initial feedback value. - */ - Tone.FeedbackEffect = function () { - var options = Tone.defaults(arguments, ['feedback'], Tone.FeedbackEffect); - Tone.Effect.call(this, options); - /** - * the gain which controls the feedback - * @type {Tone.Gain} - * @private - */ - this._feedbackGain = new Tone.Gain(options.feedback, Tone.Type.NormalRange); - /** - * The amount of signal which is fed back into the effect input. - * @type {NormalRange} - * @signal - */ - this.feedback = this._feedbackGain.gain; - //the feedback loop - this.effectReturn.chain(this._feedbackGain, this.effectSend); - this._readOnly(['feedback']); - }; - Tone.extend(Tone.FeedbackEffect, Tone.Effect); - /** - * @static - * @type {Object} - */ - Tone.FeedbackEffect.defaults = { 'feedback': 0.125 }; - /** - * Clean up. - * @returns {Tone.FeedbackEffect} this - */ - Tone.FeedbackEffect.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._writable(['feedback']); - this._feedbackGain.dispose(); - this._feedbackGain = null; - this.feedback = null; - return this; - }; - return Tone.FeedbackEffect; - }); - Module(function (Tone) { - - /** - * @class Tone.FeedbackDelay is a DelayNode in which part of output - * signal is fed back into the delay. - * - * @constructor - * @extends {Tone.FeedbackEffect} - * @param {Time|Object} [delayTime] The delay applied to the incoming signal. - * @param {NormalRange=} feedback The amount of the effected signal which - * is fed back through the delay. - * @example - * var feedbackDelay = new Tone.FeedbackDelay("8n", 0.5).toMaster(); - * var tom = new Tone.DrumSynth({ - * "octaves" : 4, - * "pitchDecay" : 0.1 - * }).connect(feedbackDelay); - * tom.triggerAttackRelease("A2","32n"); - */ - Tone.FeedbackDelay = function () { - var options = Tone.defaults(arguments, [ - 'delayTime', - 'feedback' - ], Tone.FeedbackDelay); - Tone.FeedbackEffect.call(this, options); - /** - * the delay node - * @type {Tone.Delay} - * @private - */ - this._delayNode = new Tone.Delay(options.delayTime, options.maxDelay); - /** - * The delayTime of the DelayNode. - * @type {Time} - * @signal - */ - this.delayTime = this._delayNode.delayTime; - // connect it up - this.connectEffect(this._delayNode); - this._readOnly(['delayTime']); - }; - Tone.extend(Tone.FeedbackDelay, Tone.FeedbackEffect); - /** - * The default values. - * @const - * @static - * @type {Object} - */ - Tone.FeedbackDelay.defaults = { - 'delayTime': 0.25, - 'maxDelay': 1 - }; - /** - * clean up - * @returns {Tone.FeedbackDelay} this - */ - Tone.FeedbackDelay.prototype.dispose = function () { - Tone.FeedbackEffect.prototype.dispose.call(this); - this._delayNode.dispose(); - this._delayNode = null; - this._writable(['delayTime']); - this.delayTime = null; - return this; - }; - return Tone.FeedbackDelay; - }); - Module(function (Tone) { - - /** - * an array of comb filter delay values from Freeverb implementation - * @static - * @private - * @type {Array} - */ - var combFilterTunings = [ - 1557 / 44100, - 1617 / 44100, - 1491 / 44100, - 1422 / 44100, - 1277 / 44100, - 1356 / 44100, - 1188 / 44100, - 1116 / 44100 - ]; - /** - * an array of allpass filter frequency values from Freeverb implementation - * @private - * @static - * @type {Array} - */ - var allpassFilterFrequencies = [ - 225, - 556, - 441, - 341 - ]; - /** - * @class Tone.Freeverb is a reverb based on [Freeverb](https://ccrma.stanford.edu/~jos/pasp/Freeverb.html). - * Read more on reverb on [Sound On Sound](https://web.archive.org/web/20160404083902/http://www.soundonsound.com:80/sos/feb01/articles/synthsecrets.asp). - * - * @extends {Tone.Effect} - * @constructor - * @param {NormalRange|Object} [roomSize] Correlated to the decay time. - * @param {Frequency} [dampening] The cutoff frequency of a lowpass filter as part - * of the reverb. - * @example - * var freeverb = new Tone.Freeverb().toMaster(); - * freeverb.dampening.value = 1000; - * //routing synth through the reverb - * var synth = new Tone.AMSynth().connect(freeverb); - */ - Tone.Freeverb = function () { - var options = Tone.defaults(arguments, [ - 'roomSize', - 'dampening' - ], Tone.Freeverb); - Tone.StereoEffect.call(this, options); - /** - * The roomSize value between. A larger roomSize - * will result in a longer decay. - * @type {NormalRange} - * @signal - */ - this.roomSize = new Tone.Signal(options.roomSize, Tone.Type.NormalRange); - /** - * The amount of dampening of the reverberant signal. - * @type {Frequency} - * @signal - */ - this.dampening = new Tone.Signal(options.dampening, Tone.Type.Frequency); - /** - * the comb filters - * @type {Array} - * @private - */ - this._combFilters = []; - /** - * the allpass filters on the left - * @type {Array} - * @private - */ - this._allpassFiltersL = []; - /** - * the allpass filters on the right - * @type {Array} - * @private - */ - this._allpassFiltersR = []; - //make the allpass filters on the right - for (var l = 0; l < allpassFilterFrequencies.length; l++) { - var allpassL = this.context.createBiquadFilter(); - allpassL.type = 'allpass'; - allpassL.frequency.value = allpassFilterFrequencies[l]; - this._allpassFiltersL.push(allpassL); - } - //make the allpass filters on the left - for (var r = 0; r < allpassFilterFrequencies.length; r++) { - var allpassR = this.context.createBiquadFilter(); - allpassR.type = 'allpass'; - allpassR.frequency.value = allpassFilterFrequencies[r]; - this._allpassFiltersR.push(allpassR); - } - //make the comb filters - for (var c = 0; c < combFilterTunings.length; c++) { - var lfpf = new Tone.LowpassCombFilter(combFilterTunings[c]); - if (c < combFilterTunings.length / 2) { - this.effectSendL.chain(lfpf, this._allpassFiltersL[0]); - } else { - this.effectSendR.chain(lfpf, this._allpassFiltersR[0]); - } - this.roomSize.connect(lfpf.resonance); - this.dampening.connect(lfpf.dampening); - this._combFilters.push(lfpf); - } - //chain the allpass filters togetehr - Tone.connectSeries.apply(Tone, this._allpassFiltersL); - Tone.connectSeries.apply(Tone, this._allpassFiltersR); - this._allpassFiltersL[this._allpassFiltersL.length - 1].connect(this.effectReturnL); - this._allpassFiltersR[this._allpassFiltersR.length - 1].connect(this.effectReturnR); - this._readOnly([ - 'roomSize', - 'dampening' - ]); - }; - Tone.extend(Tone.Freeverb, Tone.StereoEffect); - /** - * @static - * @type {Object} - */ - Tone.Freeverb.defaults = { - 'roomSize': 0.7, - 'dampening': 3000 - }; - /** - * Clean up. - * @returns {Tone.Freeverb} this - */ - Tone.Freeverb.prototype.dispose = function () { - Tone.StereoEffect.prototype.dispose.call(this); - for (var al = 0; al < this._allpassFiltersL.length; al++) { - this._allpassFiltersL[al].disconnect(); - this._allpassFiltersL[al] = null; - } - this._allpassFiltersL = null; - for (var ar = 0; ar < this._allpassFiltersR.length; ar++) { - this._allpassFiltersR[ar].disconnect(); - this._allpassFiltersR[ar] = null; - } - this._allpassFiltersR = null; - for (var cf = 0; cf < this._combFilters.length; cf++) { - this._combFilters[cf].dispose(); - this._combFilters[cf] = null; - } - this._combFilters = null; - this._writable([ - 'roomSize', - 'dampening' - ]); - this.roomSize.dispose(); - this.roomSize = null; - this.dampening.dispose(); - this.dampening = null; - return this; - }; - return Tone.Freeverb; - }); - Module(function (Tone) { - - /** - * an array of the comb filter delay time values - * @private - * @static - * @type {Array} - */ - var combFilterDelayTimes = [ - 1687 / 25000, - 1601 / 25000, - 2053 / 25000, - 2251 / 25000 - ]; - /** - * the resonances of each of the comb filters - * @private - * @static - * @type {Array} - */ - var combFilterResonances = [ - 0.773, - 0.802, - 0.753, - 0.733 - ]; - /** - * the allpass filter frequencies - * @private - * @static - * @type {Array} - */ - var allpassFilterFreqs = [ - 347, - 113, - 37 - ]; - /** - * @class Tone.JCReverb is a simple [Schroeder Reverberator](https://ccrma.stanford.edu/~jos/pasp/Schroeder_Reverberators.html) - * tuned by John Chowning in 1970. - * It is made up of three allpass filters and four Tone.FeedbackCombFilter. - * - * - * @extends {Tone.Effect} - * @constructor - * @param {NormalRange|Object} [roomSize] Coorelates to the decay time. - * @example - * var reverb = new Tone.JCReverb(0.4).connect(Tone.Master); - * var delay = new Tone.FeedbackDelay(0.5); - * //connecting the synth to reverb through delay - * var synth = new Tone.DuoSynth().chain(delay, reverb); - * synth.triggerAttackRelease("A4","8n"); - */ - Tone.JCReverb = function () { - var options = Tone.defaults(arguments, ['roomSize'], Tone.JCReverb); - Tone.StereoEffect.call(this, options); - /** - * room size control values between [0,1] - * @type {NormalRange} - * @signal - */ - this.roomSize = new Tone.Signal(options.roomSize, Tone.Type.NormalRange); - /** - * scale the room size - * @type {Tone.Scale} - * @private - */ - this._scaleRoomSize = new Tone.Scale(-0.733, 0.197); - /** - * a series of allpass filters - * @type {Array} - * @private - */ - this._allpassFilters = []; - /** - * parallel feedback comb filters - * @type {Array} - * @private - */ - this._feedbackCombFilters = []; - //make the allpass filters - for (var af = 0; af < allpassFilterFreqs.length; af++) { - var allpass = this.context.createBiquadFilter(); - allpass.type = 'allpass'; - allpass.frequency.value = allpassFilterFreqs[af]; - this._allpassFilters.push(allpass); - } - //and the comb filters - for (var cf = 0; cf < combFilterDelayTimes.length; cf++) { - var fbcf = new Tone.FeedbackCombFilter(combFilterDelayTimes[cf], 0.1); - this._scaleRoomSize.connect(fbcf.resonance); - fbcf.resonance.value = combFilterResonances[cf]; - this._allpassFilters[this._allpassFilters.length - 1].connect(fbcf); - if (cf < combFilterDelayTimes.length / 2) { - fbcf.connect(this.effectReturnL); - } else { - fbcf.connect(this.effectReturnR); - } - this._feedbackCombFilters.push(fbcf); - } - //chain the allpass filters together - this.roomSize.connect(this._scaleRoomSize); - Tone.connectSeries.apply(Tone, this._allpassFilters); - this.effectSendL.connect(this._allpassFilters[0]); - this.effectSendR.connect(this._allpassFilters[0]); - this._readOnly(['roomSize']); - }; - Tone.extend(Tone.JCReverb, Tone.StereoEffect); - /** - * the default values - * @static - * @const - * @type {Object} - */ - Tone.JCReverb.defaults = { 'roomSize': 0.5 }; - /** - * Clean up. - * @returns {Tone.JCReverb} this - */ - Tone.JCReverb.prototype.dispose = function () { - Tone.StereoEffect.prototype.dispose.call(this); - for (var apf = 0; apf < this._allpassFilters.length; apf++) { - this._allpassFilters[apf].disconnect(); - this._allpassFilters[apf] = null; - } - this._allpassFilters = null; - for (var fbcf = 0; fbcf < this._feedbackCombFilters.length; fbcf++) { - this._feedbackCombFilters[fbcf].dispose(); - this._feedbackCombFilters[fbcf] = null; - } - this._feedbackCombFilters = null; - this._writable(['roomSize']); - this.roomSize.dispose(); - this.roomSize = null; - this._scaleRoomSize.dispose(); - this._scaleRoomSize = null; - return this; - }; - return Tone.JCReverb; - }); - Module(function (Tone) { - - /** - * @class Mid/Side processing separates the the 'mid' signal - * (which comes out of both the left and the right channel) - * and the 'side' (which only comes out of the the side channels) - * and effects them separately before being recombined. - * Applies a Mid/Side seperation and recombination. - * Algorithm found in [kvraudio forums](http://www.kvraudio.com/forum/viewtopic.php?t=212587). - * <br><br> - * This is a base-class for Mid/Side Effects. - * - * @extends {Tone.Effect} - * @constructor - */ - Tone.MidSideEffect = function () { - Tone.Effect.apply(this, arguments); - /** - * The mid/side split - * @type {Tone.MidSideSplit} - * @private - */ - this._midSideSplit = new Tone.MidSideSplit(); - /** - * The mid/side merge - * @type {Tone.MidSideMerge} - * @private - */ - this._midSideMerge = new Tone.MidSideMerge(); - /** - * The mid send. Connect to mid processing - * @type {Tone} - * @private - */ - this.midSend = this._midSideSplit.mid; - /** - * The side send. Connect to side processing - * @type {Tone} - * @private - */ - this.sideSend = this._midSideSplit.side; - /** - * The mid return connection - * @type {GainNode} - * @private - */ - this.midReturn = this._midSideMerge.mid; - /** - * The side return connection - * @type {GainNode} - * @private - */ - this.sideReturn = this._midSideMerge.side; - //the connections - this.effectSend.connect(this._midSideSplit); - this._midSideMerge.connect(this.effectReturn); - }; - Tone.extend(Tone.MidSideEffect, Tone.Effect); - /** - * Clean up. - * @returns {Tone.MidSideEffect} this - */ - Tone.MidSideEffect.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._midSideSplit.dispose(); - this._midSideSplit = null; - this._midSideMerge.dispose(); - this._midSideMerge = null; - this.midSend = null; - this.sideSend = null; - this.midReturn = null; - this.sideReturn = null; - return this; - }; - return Tone.MidSideEffect; - }); - Module(function (Tone) { - - /** - * @class Tone.Phaser is a phaser effect. Phasers work by changing the phase - * of different frequency components of an incoming signal. Read more on - * [Wikipedia](https://en.wikipedia.org/wiki/Phaser_(effect)). - * Inspiration for this phaser comes from [Tuna.js](https://github.com/Dinahmoe/tuna/). - * - * @extends {Tone.StereoEffect} - * @constructor - * @param {Frequency|Object} [frequency] The speed of the phasing. - * @param {number} [octaves] The octaves of the effect. - * @param {Frequency} [baseFrequency] The base frequency of the filters. - * @example - * var phaser = new Tone.Phaser({ - * "frequency" : 15, - * "octaves" : 5, - * "baseFrequency" : 1000 - * }).toMaster(); - * var synth = new Tone.FMSynth().connect(phaser); - * synth.triggerAttackRelease("E3", "2n"); - */ - Tone.Phaser = function () { - //set the defaults - var options = Tone.defaults(arguments, [ - 'frequency', - 'octaves', - 'baseFrequency' - ], Tone.Phaser); - Tone.StereoEffect.call(this, options); - /** - * the lfo which controls the frequency on the left side - * @type {Tone.LFO} - * @private - */ - this._lfoL = new Tone.LFO(options.frequency, 0, 1); - /** - * the lfo which controls the frequency on the right side - * @type {Tone.LFO} - * @private - */ - this._lfoR = new Tone.LFO(options.frequency, 0, 1); - this._lfoR.phase = 180; - /** - * the base modulation frequency - * @type {number} - * @private - */ - this._baseFrequency = options.baseFrequency; - /** - * the octaves of the phasing - * @type {number} - * @private - */ - this._octaves = options.octaves; - /** - * The quality factor of the filters - * @type {Positive} - * @signal - */ - this.Q = new Tone.Signal(options.Q, Tone.Type.Positive); - /** - * the array of filters for the left side - * @type {Array} - * @private - */ - this._filtersL = this._makeFilters(options.stages, this._lfoL, this.Q); - /** - * the array of filters for the left side - * @type {Array} - * @private - */ - this._filtersR = this._makeFilters(options.stages, this._lfoR, this.Q); - /** - * the frequency of the effect - * @type {Tone.Signal} - */ - this.frequency = this._lfoL.frequency; - this.frequency.value = options.frequency; - //connect them up - this.effectSendL.connect(this._filtersL[0]); - this.effectSendR.connect(this._filtersR[0]); - this._filtersL[options.stages - 1].connect(this.effectReturnL); - this._filtersR[options.stages - 1].connect(this.effectReturnR); - //control the frequency with one LFO - this._lfoL.frequency.connect(this._lfoR.frequency); - //set the options - this.baseFrequency = options.baseFrequency; - this.octaves = options.octaves; - //start the lfo - this._lfoL.start(); - this._lfoR.start(); - this._readOnly([ - 'frequency', - 'Q' - ]); - }; - Tone.extend(Tone.Phaser, Tone.StereoEffect); - /** - * defaults - * @static - * @type {object} - */ - Tone.Phaser.defaults = { - 'frequency': 0.5, - 'octaves': 3, - 'stages': 10, - 'Q': 10, - 'baseFrequency': 350 - }; - /** - * @param {number} stages - * @returns {Array} the number of filters all connected together - * @private - */ - Tone.Phaser.prototype._makeFilters = function (stages, connectToFreq, Q) { - var filters = new Array(stages); - //make all the filters - for (var i = 0; i < stages; i++) { - var filter = this.context.createBiquadFilter(); - filter.type = 'allpass'; - Q.connect(filter.Q); - connectToFreq.connect(filter.frequency); - filters[i] = filter; - } - Tone.connectSeries.apply(Tone, filters); - return filters; - }; - /** - * The number of octaves the phase goes above - * the baseFrequency - * @memberOf Tone.Phaser# - * @type {Positive} - * @name octaves - */ - Object.defineProperty(Tone.Phaser.prototype, 'octaves', { - get: function () { - return this._octaves; - }, - set: function (octaves) { - this._octaves = octaves; - var max = this._baseFrequency * Math.pow(2, octaves); - this._lfoL.max = max; - this._lfoR.max = max; - } - }); - /** - * The the base frequency of the filters. - * @memberOf Tone.Phaser# - * @type {number} - * @name baseFrequency - */ - Object.defineProperty(Tone.Phaser.prototype, 'baseFrequency', { - get: function () { - return this._baseFrequency; - }, - set: function (freq) { - this._baseFrequency = freq; - this._lfoL.min = freq; - this._lfoR.min = freq; - this.octaves = this._octaves; - } - }); - /** - * clean up - * @returns {Tone.Phaser} this - */ - Tone.Phaser.prototype.dispose = function () { - Tone.StereoEffect.prototype.dispose.call(this); - this._writable([ - 'frequency', - 'Q' - ]); - this.Q.dispose(); - this.Q = null; - this._lfoL.dispose(); - this._lfoL = null; - this._lfoR.dispose(); - this._lfoR = null; - for (var i = 0; i < this._filtersL.length; i++) { - this._filtersL[i].disconnect(); - this._filtersL[i] = null; - } - this._filtersL = null; - for (var j = 0; j < this._filtersR.length; j++) { - this._filtersR[j].disconnect(); - this._filtersR[j] = null; - } - this._filtersR = null; - this.frequency = null; - return this; - }; - return Tone.Phaser; - }); - Module(function (Tone) { - - /** - * @class Just like a stereo feedback effect, but the feedback is routed from left to right - * and right to left instead of on the same channel. - * - * @constructor - * @extends {Tone.StereoEffect} - */ - Tone.StereoXFeedbackEffect = function () { - var options = Tone.defaults(arguments, ['feedback'], Tone.FeedbackEffect); - Tone.StereoEffect.call(this, options); - /** - * The amount of feedback from the output - * back into the input of the effect (routed - * across left and right channels). - * @type {NormalRange} - * @signal - */ - this.feedback = new Tone.Signal(options.feedback, Tone.Type.NormalRange); - /** - * the left side feeback - * @type {Tone.Gain} - * @private - */ - this._feedbackLR = new Tone.Gain(); - /** - * the right side feeback - * @type {Tone.Gain} - * @private - */ - this._feedbackRL = new Tone.Gain(); - //connect it up - this.effectReturnL.chain(this._feedbackLR, this.effectSendR); - this.effectReturnR.chain(this._feedbackRL, this.effectSendL); - this.feedback.fan(this._feedbackLR.gain, this._feedbackRL.gain); - this._readOnly(['feedback']); - }; - Tone.extend(Tone.StereoXFeedbackEffect, Tone.StereoEffect); - /** - * clean up - * @returns {Tone.StereoXFeedbackEffect} this - */ - Tone.StereoXFeedbackEffect.prototype.dispose = function () { - Tone.StereoEffect.prototype.dispose.call(this); - this._writable(['feedback']); - this.feedback.dispose(); - this.feedback = null; - this._feedbackLR.dispose(); - this._feedbackLR = null; - this._feedbackRL.dispose(); - this._feedbackRL = null; - return this; - }; - return Tone.StereoXFeedbackEffect; - }); - Module(function (Tone) { - - /** - * @class Tone.PingPongDelay is a feedback delay effect where the echo is heard - * first in one channel and next in the opposite channel. In a stereo - * system these are the right and left channels. - * PingPongDelay in more simplified terms is two Tone.FeedbackDelays - * with independent delay values. Each delay is routed to one channel - * (left or right), and the channel triggered second will always - * trigger at the same interval after the first. - * - * @constructor - * @extends {Tone.StereoXFeedbackEffect} - * @param {Time|Object} [delayTime] The delayTime between consecutive echos. - * @param {NormalRange=} feedback The amount of the effected signal which - * is fed back through the delay. - * @example - * var pingPong = new Tone.PingPongDelay("4n", 0.2).toMaster(); - * var drum = new Tone.DrumSynth().connect(pingPong); - * drum.triggerAttackRelease("C4", "32n"); - */ - Tone.PingPongDelay = function () { - var options = Tone.defaults(arguments, [ - 'delayTime', - 'feedback' - ], Tone.PingPongDelay); - Tone.StereoXFeedbackEffect.call(this, options); - /** - * the delay node on the left side - * @type {Tone.Delay} - * @private - */ - this._leftDelay = new Tone.Delay(0, options.maxDelayTime); - /** - * the delay node on the right side - * @type {Tone.Delay} - * @private - */ - this._rightDelay = new Tone.Delay(0, options.maxDelayTime); - /** - * the predelay on the right side - * @type {Tone.Delay} - * @private - */ - this._rightPreDelay = new Tone.Delay(0, options.maxDelayTime); - /** - * the delay time signal - * @type {Time} - * @signal - */ - this.delayTime = new Tone.Signal(options.delayTime, Tone.Type.Time); - //connect it up - this.effectSendL.chain(this._leftDelay, this.effectReturnL); - this.effectSendR.chain(this._rightPreDelay, this._rightDelay, this.effectReturnR); - this.delayTime.fan(this._leftDelay.delayTime, this._rightDelay.delayTime, this._rightPreDelay.delayTime); - //rearranged the feedback to be after the rightPreDelay - this._feedbackLR.disconnect(); - this._feedbackLR.connect(this._rightDelay); - this._readOnly(['delayTime']); - }; - Tone.extend(Tone.PingPongDelay, Tone.StereoXFeedbackEffect); - /** - * @static - * @type {Object} - */ - Tone.PingPongDelay.defaults = { - 'delayTime': 0.25, - 'maxDelayTime': 1 - }; - /** - * Clean up. - * @returns {Tone.PingPongDelay} this - */ - Tone.PingPongDelay.prototype.dispose = function () { - Tone.StereoXFeedbackEffect.prototype.dispose.call(this); - this._leftDelay.dispose(); - this._leftDelay = null; - this._rightDelay.dispose(); - this._rightDelay = null; - this._rightPreDelay.dispose(); - this._rightPreDelay = null; - this._writable(['delayTime']); - this.delayTime.dispose(); - this.delayTime = null; - return this; - }; - return Tone.PingPongDelay; - }); - Module(function (Tone) { - - /** - * @class Tone.PitchShift does near-realtime pitch shifting to the incoming signal. - * The effect is achieved by speeding up or slowing down the delayTime - * of a DelayNode using a sawtooth wave. - * Algorithm found in [this pdf](http://dsp-book.narod.ru/soundproc.pdf). - * Additional reference by [Miller Pucket](http://msp.ucsd.edu/techniques/v0.11/book-html/node115.html). - * - * @extends {Tone.FeedbackEffect} - * @param {Interval=} pitch The interval to transpose the incoming signal by. - */ - Tone.PitchShift = function () { - var options = Tone.defaults(arguments, ['pitch'], Tone.PitchShift); - Tone.FeedbackEffect.call(this, options); - /** - * The pitch signal - * @type {Tone.Signal} - * @private - */ - this._frequency = new Tone.Signal(0); - /** - * Uses two DelayNodes to cover up the jump in - * the sawtooth wave. - * @type {DelayNode} - * @private - */ - this._delayA = new Tone.Delay(0, 1); - /** - * The first LFO. - * @type {Tone.LFO} - * @private - */ - this._lfoA = new Tone.LFO({ - 'min': 0, - 'max': 0.1, - 'type': 'sawtooth' - }).connect(this._delayA.delayTime); - /** - * The second DelayNode - * @type {DelayNode} - * @private - */ - this._delayB = new Tone.Delay(0, 1); - /** - * The first LFO. - * @type {Tone.LFO} - * @private - */ - this._lfoB = new Tone.LFO({ - 'min': 0, - 'max': 0.1, - 'type': 'sawtooth', - 'phase': 180 - }).connect(this._delayB.delayTime); - /** - * Crossfade quickly between the two delay lines - * to cover up the jump in the sawtooth wave - * @type {Tone.CrossFade} - * @private - */ - this._crossFade = new Tone.CrossFade(); - /** - * LFO which alternates between the two - * delay lines to cover up the disparity in the - * sawtooth wave. - * @type {Tone.LFO} - * @private - */ - this._crossFadeLFO = new Tone.LFO({ - 'min': 0, - 'max': 1, - 'type': 'triangle', - 'phase': 90 - }).connect(this._crossFade.fade); - /** - * The delay node - * @type {Tone.Delay} - * @private - */ - this._feedbackDelay = new Tone.Delay(options.delayTime); - /** - * The amount of delay on the input signal - * @type {Time} - * @signal - */ - this.delayTime = this._feedbackDelay.delayTime; - this._readOnly('delayTime'); - /** - * Hold the current pitch - * @type {Number} - * @private - */ - this._pitch = options.pitch; - /** - * Hold the current windowSize - * @type {Number} - * @private - */ - this._windowSize = options.windowSize; - //connect the two delay lines up - this._delayA.connect(this._crossFade.a); - this._delayB.connect(this._crossFade.b); - //connect the frequency - this._frequency.fan(this._lfoA.frequency, this._lfoB.frequency, this._crossFadeLFO.frequency); - //route the input - this.effectSend.fan(this._delayA, this._delayB); - this._crossFade.chain(this._feedbackDelay, this.effectReturn); - //start the LFOs at the same time - var now = this.now(); - this._lfoA.start(now); - this._lfoB.start(now); - this._crossFadeLFO.start(now); - //set the initial value - this.windowSize = this._windowSize; - }; - Tone.extend(Tone.PitchShift, Tone.FeedbackEffect); - /** - * default values - * @static - * @type {Object} - * @const - */ - Tone.PitchShift.defaults = { - 'pitch': 0, - 'windowSize': 0.1, - 'delayTime': 0, - 'feedback': 0 - }; - /** - * Repitch the incoming signal by some interval (measured - * in semi-tones). - * @memberOf Tone.PitchShift# - * @type {Interval} - * @name pitch - * @example - * pitchShift.pitch = -12; //down one octave - * pitchShift.pitch = 7; //up a fifth - */ - Object.defineProperty(Tone.PitchShift.prototype, 'pitch', { - get: function () { - return this._pitch; - }, - set: function (interval) { - this._pitch = interval; - var factor = 0; - if (interval < 0) { - this._lfoA.min = 0; - this._lfoA.max = this._windowSize; - this._lfoB.min = 0; - this._lfoB.max = this._windowSize; - factor = Tone.intervalToFrequencyRatio(interval - 1) + 1; - } else { - this._lfoA.min = this._windowSize; - this._lfoA.max = 0; - this._lfoB.min = this._windowSize; - this._lfoB.max = 0; - factor = Tone.intervalToFrequencyRatio(interval) - 1; - } - this._frequency.value = factor * (1.2 / this._windowSize); - } - }); - /** - * The window size corresponds roughly to the sample length in a looping sampler. - * Smaller values are desirable for a less noticeable delay time of the pitch shifted - * signal, but larger values will result in smoother pitch shifting for larger intervals. - * A nominal range of 0.03 to 0.1 is recommended. - * @memberOf Tone.PitchShift# - * @type {Time} - * @name windowSize - * @example - * pitchShift.windowSize = 0.1; - */ - Object.defineProperty(Tone.PitchShift.prototype, 'windowSize', { - get: function () { - return this._windowSize; - }, - set: function (size) { - this._windowSize = this.toSeconds(size); - this.pitch = this._pitch; - } - }); - /** - * Clean up. - * @return {Tone.PitchShift} this - */ - Tone.PitchShift.prototype.dispose = function () { - Tone.FeedbackEffect.prototype.dispose.call(this); - this._frequency.dispose(); - this._frequency = null; - this._delayA.disconnect(); - this._delayA = null; - this._delayB.disconnect(); - this._delayB = null; - this._lfoA.dispose(); - this._lfoA = null; - this._lfoB.dispose(); - this._lfoB = null; - this._crossFade.dispose(); - this._crossFade = null; - this._crossFadeLFO.dispose(); - this._crossFadeLFO = null; - this._writable('delayTime'); - this._feedbackDelay.dispose(); - this._feedbackDelay = null; - this.delayTime = null; - return this; - }; - return Tone.PitchShift; - }); - Module(function (Tone) { - /** - * @class Wrapper around the native BufferSourceNode. - * @extends {Tone.AudioNode} - * @param {AudioBuffer|Tone.Buffer} buffer The buffer to play - * @param {Function} onload The callback to invoke when the - * buffer is done playing. - */ - Tone.BufferSource = function () { - var options = Tone.defaults(arguments, [ - 'buffer', - 'onload' - ], Tone.BufferSource); - Tone.AudioNode.call(this, options); - /** - * The callback to invoke after the - * buffer source is done playing. - * @type {Function} - */ - this.onended = options.onended; - /** - * The time that the buffer was started. - * @type {Number} - * @private - */ - this._startTime = -1; - /** - * An additional flag if the actual BufferSourceNode - * has been started. b/c stopping an unstarted buffer - * will throw it into an invalid state - * @type {Boolean} - * @private - */ - this._sourceStarted = false; - /** - * Flag if the source has already been stopped - * @type {Boolean} - * @private - */ - this._sourceStopped = false; - /** - * The time that the buffer is scheduled to stop. - * @type {Number} - * @private - */ - this._stopTime = -1; - /** - * The gain node which envelopes the BufferSource - * @type {Tone.Gain} - * @private - */ - this._gainNode = this.output = new Tone.Gain(); - /** - * The buffer source - * @type {AudioBufferSourceNode} - * @private - */ - this._source = this.context.createBufferSource(); - this._source.connect(this._gainNode); - this._source.onended = this._onended.bind(this); - /** - * The private buffer instance - * @type {Tone.Buffer} - * @private - */ - this._buffer = new Tone.Buffer(options.buffer, options.onload); - /** - * The playbackRate of the buffer - * @type {Positive} - * @signal - */ - this.playbackRate = new Tone.Param(this._source.playbackRate, Tone.Type.Positive); - /** - * The fadeIn time of the amplitude envelope. - * @type {Time} - */ - this.fadeIn = options.fadeIn; - /** - * The fadeOut time of the amplitude envelope. - * @type {Time} - */ - this.fadeOut = options.fadeOut; - /** - * The curve applied to the fades, either "linear" or "exponential" - * @type {String} - */ - this.curve = options.curve; - /** - * The value that the buffer ramps to - * @type {Gain} - * @private - */ - this._gain = 1; - /** - * The onended timeout - * @type {Number} - * @private - */ - this._onendedTimeout = -1; - //set some values initially - this.loop = options.loop; - this.loopStart = options.loopStart; - this.loopEnd = options.loopEnd; - this.playbackRate.value = options.playbackRate; - }; - Tone.extend(Tone.BufferSource, Tone.AudioNode); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.BufferSource.defaults = { - 'onended': Tone.noOp, - 'onload': Tone.noOp, - 'loop': false, - 'loopStart': 0, - 'loopEnd': 0, - 'fadeIn': 0, - 'fadeOut': 0, - 'curve': 'linear', - 'playbackRate': 1 - }; - /** - * Returns the playback state of the source, either "started" or "stopped". - * @type {Tone.State} - * @readOnly - * @memberOf Tone.BufferSource# - * @name state - */ - Object.defineProperty(Tone.BufferSource.prototype, 'state', { - get: function () { - return this.getStateAtTime(this.now()); - } - }); - /** - * Get the playback state at the given time - * @param {Time} time The time to test the state at - * @return {Tone.State} The playback state. - */ - Tone.BufferSource.prototype.getStateAtTime = function (time) { - time = this.toSeconds(time); - if (this._startTime !== -1 && time >= this._startTime && !this._sourceStopped) { - return Tone.State.Started; - } else { - return Tone.State.Stopped; - } - }; - /** - * Start the buffer - * @param {Time} [startTime=now] When the player should start. - * @param {Time} [offset=0] The offset from the beginning of the sample - * to start at. - * @param {Time=} duration How long the sample should play. If no duration - * is given, it will default to the full length - * of the sample (minus any offset) - * @param {Gain} [gain=1] The gain to play the buffer back at. - * @param {Time=} fadeInTime The optional fadeIn ramp time. - * @return {Tone.BufferSource} this - */ - Tone.BufferSource.prototype.start = function (time, offset, duration, gain, fadeInTime) { - if (this._startTime !== -1) { - throw new Error('Tone.BufferSource can only be started once.'); - } - if (!this.buffer.loaded) { - throw new Error('Tone.BufferSource: buffer is either not set or not loaded.'); - } - time = this.toSeconds(time); - //if it's a loop the default offset is the loopstart point - if (this.loop) { - offset = Tone.defaultArg(offset, this.loopStart); - } else { - //otherwise the default offset is 0 - offset = Tone.defaultArg(offset, 0); - } - offset = this.toSeconds(offset); - gain = Tone.defaultArg(gain, 1); - this._gain = gain; - fadeInTime = this.toSeconds(Tone.defaultArg(fadeInTime, this.fadeIn)); - this.fadeIn = fadeInTime; - if (fadeInTime > 0) { - this._gainNode.gain.setValueAtTime(0, time); - if (this.curve === 'linear') { - this._gainNode.gain.linearRampToValueAtTime(this._gain, time + fadeInTime); - } else { - this._gainNode.gain.exponentialApproachValueAtTime(this._gain, time, fadeInTime); - } - } else { - this._gainNode.gain.setValueAtTime(gain, time); - } - this._startTime = time; - var computedDur = this.toSeconds(Tone.defaultArg(duration, this.buffer.duration - offset % this.buffer.duration)); - computedDur = Math.max(computedDur, 0); - if (Tone.isDefined(duration)) { - //clip the duration when not looping - if (!this.loop) { - computedDur = Math.min(computedDur, this.buffer.duration - offset % this.buffer.duration); - } - this.stop(time + computedDur, this.fadeOut); - } - //start the buffer source - if (this.loop) { - //modify the offset if it's greater than the loop time - var loopEnd = this.loopEnd || this.buffer.duration; - var loopStart = this.loopStart; - var loopDuration = loopEnd - loopStart; - //move the offset back - if (offset >= loopEnd) { - offset = (offset - loopStart) % loopDuration + loopStart; - } - } - this._source.buffer = this.buffer.get(); - this._source.loopEnd = this.loopEnd || this.buffer.duration; - if (offset < this.buffer.duration) { - this._sourceStarted = true; - this._source.start(time, offset); - } - return this; - }; - /** - * Stop the buffer. Optionally add a ramp time to fade the - * buffer out. - * @param {Time=} time The time the buffer should stop. - * @param {Time=} fadeOutTime How long the gain should fade out for - * @return {Tone.BufferSource} this - */ - Tone.BufferSource.prototype.stop = function (time, fadeOutTime) { - if (!this.buffer.loaded) { - throw new Error('Tone.BufferSource: buffer is either not set or not loaded.'); - } - if (this._sourceStopped) { - return; - } - time = this.toSeconds(time); - //if the event has already been scheduled, clear it - if (this._stopTime !== -1) { - this.cancelStop(); - } - //stop if it's schedule before the start time - if (time <= this._startTime) { - this._gainNode.gain.cancelScheduledValues(time); - this._gainNode.gain.value = 0; - return this; - } - time = Math.max(this._startTime + this.fadeIn + this.sampleTime, time); - //cancel the previous curve - this._gainNode.gain.cancelScheduledValues(time); - this._stopTime = time; - //the fadeOut time - fadeOutTime = this.toSeconds(Tone.defaultArg(fadeOutTime, this.fadeOut)); - var heldDuration = time - this._startTime - this.fadeIn - this.sampleTime; - if (!this.loop) { - //make sure the fade does not go beyond the length of the buffer - heldDuration = Math.min(heldDuration, this.buffer.duration); - } - fadeOutTime = Math.min(heldDuration, fadeOutTime); - var startFade = time - fadeOutTime; - if (fadeOutTime > this.sampleTime) { - this._gainNode.gain.setValueAtTime(this._gain, startFade); - if (this.curve === 'linear') { - this._gainNode.gain.linearRampToValueAtTime(0, time); - } else { - this._gainNode.gain.exponentialApproachValueAtTime(0, startFade, fadeOutTime); - } - } else { - this._gainNode.gain.setValueAtTime(0, time); - } - Tone.context.clearTimeout(this._onendedTimeout); - this._onendedTimeout = Tone.context.setTimeout(this._onended.bind(this), this._stopTime - this.now()); - return this; - }; - /** - * Cancel a scheduled stop event - * @return {Tone.BufferSource} this - */ - Tone.BufferSource.prototype.cancelStop = function () { - if (this._startTime !== -1 && !this._sourceStopped) { - //cancel the stop envelope - var fadeInTime = this.toSeconds(this.fadeIn); - this._gainNode.gain.cancelScheduledValues(this._startTime + fadeInTime + this.sampleTime); - this._gainNode.gain.setValueAtTime(1, Math.max(this.now(), this._startTime + fadeInTime + this.sampleTime)); - this.context.clearTimeout(this._onendedTimeout); - this._stopTime = -1; - } - return this; - }; - /** - * Internal callback when the buffer is ended. - * Invokes `onended` and disposes the node. - * @private - */ - Tone.BufferSource.prototype._onended = function () { - if (!this._sourceStopped) { - this._sourceStopped = true; - //allow additional time for the exponential curve to fully decay - var additionalTail = this.curve === 'exponential' ? this.fadeOut * 2 : 0; - if (this._sourceStarted && this._stopTime !== -1) { - this._source.stop(this._stopTime + additionalTail); - } - this.onended(this); - } - }; - /** - * If loop is true, the loop will start at this position. - * @memberOf Tone.BufferSource# - * @type {Time} - * @name loopStart - */ - Object.defineProperty(Tone.BufferSource.prototype, 'loopStart', { - get: function () { - return this._source.loopStart; - }, - set: function (loopStart) { - this._source.loopStart = this.toSeconds(loopStart); - } - }); - /** - * If loop is true, the loop will end at this position. - * @memberOf Tone.BufferSource# - * @type {Time} - * @name loopEnd - */ - Object.defineProperty(Tone.BufferSource.prototype, 'loopEnd', { - get: function () { - return this._source.loopEnd; - }, - set: function (loopEnd) { - this._source.loopEnd = this.toSeconds(loopEnd); - } - }); - /** - * The audio buffer belonging to the player. - * @memberOf Tone.BufferSource# - * @type {Tone.Buffer} - * @name buffer - */ - Object.defineProperty(Tone.BufferSource.prototype, 'buffer', { - get: function () { - return this._buffer; - }, - set: function (buffer) { - this._buffer.set(buffer); - } - }); - /** - * If the buffer should loop once it's over. - * @memberOf Tone.BufferSource# - * @type {Boolean} - * @name loop - */ - Object.defineProperty(Tone.BufferSource.prototype, 'loop', { - get: function () { - return this._source.loop; - }, - set: function (loop) { - this._source.loop = loop; - this.cancelStop(); - } - }); - /** - * Clean up. - * @return {Tone.BufferSource} this - */ - Tone.BufferSource.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this.onended = null; - this._source.onended = null; - this._source.disconnect(); - this._source = null; - this._gainNode.dispose(); - this._gainNode = null; - this._buffer.dispose(); - this._buffer = null; - this._startTime = -1; - this.playbackRate = null; - Tone.context.clearTimeout(this._onendedTimeout); - return this; - }; - return Tone.BufferSource; - }); - Module(function (Tone) { - - /** - * @class Tone.Noise is a noise generator. It uses looped noise buffers to save on performance. - * Tone.Noise supports the noise types: "pink", "white", and "brown". Read more about - * colors of noise on [Wikipedia](https://en.wikipedia.org/wiki/Colors_of_noise). - * - * @constructor - * @extends {Tone.Source} - * @param {string} type the noise type (white|pink|brown) - * @example - * //initialize the noise and start - * var noise = new Tone.Noise("pink").start(); - * - * //make an autofilter to shape the noise - * var autoFilter = new Tone.AutoFilter({ - * "frequency" : "8m", - * "min" : 800, - * "max" : 15000 - * }).connect(Tone.Master); - * - * //connect the noise - * noise.connect(autoFilter); - * //start the autofilter LFO - * autoFilter.start() - */ - Tone.Noise = function () { - var options = Tone.defaults(arguments, ['type'], Tone.Noise); - Tone.Source.call(this, options); - /** - * @private - * @type {AudioBufferSourceNode} - */ - this._source = null; - /** - * the buffer - * @private - * @type {AudioBuffer} - */ - this._type = options.type; - /** - * The playback rate of the noise. Affects - * the "frequency" of the noise. - * @type {Positive} - * @signal - */ - this._playbackRate = options.playbackRate; - }; - Tone.extend(Tone.Noise, Tone.Source); - /** - * the default parameters - * - * @static - * @const - * @type {Object} - */ - Tone.Noise.defaults = { - 'type': 'white', - 'playbackRate': 1 - }; - /** - * The type of the noise. Can be "white", "brown", or "pink". - * @memberOf Tone.Noise# - * @type {string} - * @name type - * @example - * noise.type = "white"; - */ - Object.defineProperty(Tone.Noise.prototype, 'type', { - get: function () { - return this._type; - }, - set: function (type) { - if (this._type !== type) { - if (type in _noiseBuffers) { - this._type = type; - //if it's playing, stop and restart it - if (this.state === Tone.State.Started) { - var now = this.now(); - this._stop(now); - this._start(now); - } - } else { - throw new TypeError('Tone.Noise: invalid type: ' + type); - } - } - } - }); - /** - * The playback rate of the noise. Affects - * the "frequency" of the noise. - * @type {Positive} - * @signal - */ - Object.defineProperty(Tone.Noise.prototype, 'playbackRate', { - get: function () { - return this._playbackRate; - }, - set: function (rate) { - this._playbackRate = rate; - if (this._source) { - this._source.playbackRate.value = rate; - } - } - }); - /** - * internal start method - * - * @param {Time} time - * @private - */ - Tone.Noise.prototype._start = function (time) { - var buffer = _noiseBuffers[this._type]; - this._source = new Tone.BufferSource(buffer).connect(this.output); - this._source.loop = true; - this._source.playbackRate.value = this._playbackRate; - this._source.start(this.toSeconds(time), Math.random() * (buffer.duration - 0.001)); - }; - /** - * internal stop method - * - * @param {Time} time - * @private - */ - Tone.Noise.prototype._stop = function (time) { - if (this._source) { - this._source.stop(this.toSeconds(time)); - this._source = null; - } - }; - /** - * Restarts the noise. - * @param {[type]} time [description] - * @return {[type]} [description] - */ - Tone.Noise.prototype.restart = function (time) { - //TODO could be optimized by cancelling the buffer source 'stop' - //stop and restart - this._stop(time); - this._start(time); - }; - /** - * Clean up. - * @returns {Tone.Noise} this - */ - Tone.Noise.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - if (this._source !== null) { - this._source.disconnect(); - this._source = null; - } - this._buffer = null; - return this; - }; - /////////////////////////////////////////////////////////////////////////// - // THE BUFFERS - /////////////////////////////////////////////////////////////////////////// - //Noise buffer stats - var bufferLength = 44100 * 5; - var channels = 2; - /** - * The noise arrays. Generated on initialization. - * borrowed heavily from https://github.com/zacharydenton/noise.js - * (c) 2013 Zach Denton (MIT) - * @static - * @private - * @type {Array} - */ - var _noiseArrays = { - 'pink': function () { - var buffer = []; - for (var channelNum = 0; channelNum < channels; channelNum++) { - var channel = new Float32Array(bufferLength); - buffer[channelNum] = channel; - var b0, b1, b2, b3, b4, b5, b6; - b0 = b1 = b2 = b3 = b4 = b5 = b6 = 0; - for (var i = 0; i < bufferLength; i++) { - var white = Math.random() * 2 - 1; - b0 = 0.99886 * b0 + white * 0.0555179; - b1 = 0.99332 * b1 + white * 0.0750759; - b2 = 0.969 * b2 + white * 0.153852; - b3 = 0.8665 * b3 + white * 0.3104856; - b4 = 0.55 * b4 + white * 0.5329522; - b5 = -0.7616 * b5 - white * 0.016898; - channel[i] = b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362; - channel[i] *= 0.11; - // (roughly) compensate for gain - b6 = white * 0.115926; - } - } - return buffer; - }(), - 'brown': function () { - var buffer = []; - for (var channelNum = 0; channelNum < channels; channelNum++) { - var channel = new Float32Array(bufferLength); - buffer[channelNum] = channel; - var lastOut = 0; - for (var i = 0; i < bufferLength; i++) { - var white = Math.random() * 2 - 1; - channel[i] = (lastOut + 0.02 * white) / 1.02; - lastOut = channel[i]; - channel[i] *= 3.5; // (roughly) compensate for gain - } - } - return buffer; - }(), - 'white': function () { - var buffer = []; - for (var channelNum = 0; channelNum < channels; channelNum++) { - var channel = new Float32Array(bufferLength); - buffer[channelNum] = channel; - for (var i = 0; i < bufferLength; i++) { - channel[i] = Math.random() * 2 - 1; - } - } - return buffer; - }() - }; - /** - * static noise buffers - * @static - * @private - * @type {Tone.Buffer} - */ - var _noiseBuffers = {}; - //create the Tone.Buffers - function createBuffers() { - for (var type in _noiseArrays) { - _noiseBuffers[type] = new Tone.Buffer().fromArray(_noiseArrays[type]); - } - } - //create the noise buffers - Tone.getContext(createBuffers); - Tone.Context.on('init', createBuffers); - return Tone.Noise; - }); - Module(function (Tone) { - - /** - * @class Simple convolution created with decaying noise. - * Generates an Impulse Response Buffer - * with Tone.Offline then feeds the IR into ConvolverNode. - * Note: the Reverb will not make any sound until [generate](#generate) - * has been invoked and resolved. - * - * Inspiration from [ReverbGen](https://github.com/adelespinasse/reverbGen). - * Copyright (c) 2014 Alan deLespinasse Apache 2.0 License. - * - * @extends {Tone.Convolver} - * @param {Time=} decay The amount of time it will reverberate for. - */ - Tone.Reverb = function () { - var options = Tone.defaults(arguments, ['decay'], Tone.Reverb); - Tone.Effect.call(this, options); - /** - * Convolver node - * @type {ConvolverNode} - * @private - */ - this._convolver = this.context.createConvolver(); - /** - * The duration of the reverb - * @type {Time} - */ - this.decay = options.decay; - /** - * The amount of time before the reverb is fully - * ramped in. - * @type {Time} - */ - this.preDelay = options.preDelay; - this.connectEffect(this._convolver); - }; - Tone.extend(Tone.Reverb, Tone.Effect); - /** - * The defaults - * @type {Object} - * @static - */ - Tone.Reverb.defaults = { - 'decay': 1.5, - 'preDelay': 0.01 - }; - /** - * Generate the Impulse Response. Returns a promise while the IR is being - * generated. - * @return {Promise<Tone.Reverb>} Promise which returns this object. - */ - Tone.Reverb.prototype.generate = function () { - return Tone.Offline(function () { - //create a noise burst which decays over the duration - var noiseL = new Tone.Noise(); - var noiseR = new Tone.Noise(); - var merge = new Tone.Merge(); - noiseL.connect(merge.left); - noiseR.connect(merge.right); - var gainNode = new Tone.Gain().toMaster(); - merge.connect(gainNode); - noiseL.start(0); - noiseR.start(0); - //short fade in - gainNode.gain.setValueAtTime(0, 0); - gainNode.gain.linearRampToValueAtTime(1, this.preDelay); - //decay - gainNode.gain.exponentialApproachValueAtTime(0, this.preDelay, this.decay - this.preDelay); - }.bind(this), this.decay).then(function (buffer) { - this._convolver.buffer = buffer.get(); - return this; - }.bind(this)); - }; - /** - * Clean up. - * @return {Tone.Reverb} this - */ - Tone.Reverb.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._convolver.disconnect(); - this._convolver = null; - return this; - }; - return Tone.Reverb; - }); - Module(function (Tone) { - - /** - * @class Base class for stereo feedback effects where the effectReturn - * is fed back into the same channel. - * - * @constructor - * @extends {Tone.StereoEffect} - */ - Tone.StereoFeedbackEffect = function () { - var options = Tone.defaults(arguments, ['feedback'], Tone.FeedbackEffect); - Tone.StereoEffect.call(this, options); - /** - * controls the amount of feedback - * @type {NormalRange} - * @signal - */ - this.feedback = new Tone.Signal(options.feedback, Tone.Type.NormalRange); - /** - * the left side feeback - * @type {Tone.Gain} - * @private - */ - this._feedbackL = new Tone.Gain(); - /** - * the right side feeback - * @type {Tone.Gain} - * @private - */ - this._feedbackR = new Tone.Gain(); - //connect it up - this.effectReturnL.chain(this._feedbackL, this.effectSendL); - this.effectReturnR.chain(this._feedbackR, this.effectSendR); - this.feedback.fan(this._feedbackL.gain, this._feedbackR.gain); - this._readOnly(['feedback']); - }; - Tone.extend(Tone.StereoFeedbackEffect, Tone.StereoEffect); - /** - * clean up - * @returns {Tone.StereoFeedbackEffect} this - */ - Tone.StereoFeedbackEffect.prototype.dispose = function () { - Tone.StereoEffect.prototype.dispose.call(this); - this._writable(['feedback']); - this.feedback.dispose(); - this.feedback = null; - this._feedbackL.dispose(); - this._feedbackL = null; - this._feedbackR.dispose(); - this._feedbackR = null; - return this; - }; - return Tone.StereoFeedbackEffect; - }); - Module(function (Tone) { - - /** - * @class Applies a width factor to the mid/side seperation. - * 0 is all mid and 1 is all side. - * Algorithm found in [kvraudio forums](http://www.kvraudio.com/forum/viewtopic.php?t=212587). - * <br><br> - * <code> - * Mid *= 2*(1-width)<br> - * Side *= 2*width - * </code> - * - * @extends {Tone.MidSideEffect} - * @constructor - * @param {NormalRange|Object} [width] The stereo width. A width of 0 is mono and 1 is stereo. 0.5 is no change. - */ - Tone.StereoWidener = function () { - var options = Tone.defaults(arguments, ['width'], Tone.StereoWidener); - Tone.MidSideEffect.call(this, options); - /** - * The width control. 0 = 100% mid. 1 = 100% side. 0.5 = no change. - * @type {NormalRange} - * @signal - */ - this.width = new Tone.Signal(options.width, Tone.Type.NormalRange); - this._readOnly(['width']); - /** - * Two times the (1-width) for the mid channel - * @type {Tone.Multiply} - * @private - */ - this._twoTimesWidthMid = new Tone.Multiply(2); - /** - * Two times the width for the side channel - * @type {Tone.Multiply} - * @private - */ - this._twoTimesWidthSide = new Tone.Multiply(2); - /** - * Mid multiplier - * @type {Tone.Multiply} - * @private - */ - this._midMult = new Tone.Multiply(); - this._twoTimesWidthMid.connect(this._midMult, 0, 1); - this.midSend.chain(this._midMult, this.midReturn); - /** - * 1 - width - * @type {Tone} - */ - this._oneMinusWidth = new Tone.Subtract(); - this._oneMinusWidth.connect(this._twoTimesWidthMid); - this.context.getConstant(1).connect(this._oneMinusWidth, 0, 0); - this.width.connect(this._oneMinusWidth, 0, 1); - /** - * Side multiplier - * @type {Tone.Multiply} - * @private - */ - this._sideMult = new Tone.Multiply(); - this.width.connect(this._twoTimesWidthSide); - this._twoTimesWidthSide.connect(this._sideMult, 0, 1); - this.sideSend.chain(this._sideMult, this.sideReturn); - }; - Tone.extend(Tone.StereoWidener, Tone.MidSideEffect); - /** - * the default values - * @static - * @type {Object} - */ - Tone.StereoWidener.defaults = { 'width': 0.5 }; - /** - * Clean up. - * @returns {Tone.StereoWidener} this - */ - Tone.StereoWidener.prototype.dispose = function () { - Tone.MidSideEffect.prototype.dispose.call(this); - this._writable(['width']); - this.width.dispose(); - this.width = null; - this._midMult.dispose(); - this._midMult = null; - this._sideMult.dispose(); - this._sideMult = null; - this._twoTimesWidthMid.dispose(); - this._twoTimesWidthMid = null; - this._twoTimesWidthSide.dispose(); - this._twoTimesWidthSide = null; - this._oneMinusWidth.dispose(); - this._oneMinusWidth = null; - return this; - }; - return Tone.StereoWidener; - }); - Module(function (Tone) { - - /** - * @class Tone.Tremolo modulates the amplitude of an incoming signal using a Tone.LFO. - * The type, frequency, and depth of the LFO is controllable. - * - * @extends {Tone.StereoEffect} - * @constructor - * @param {Frequency} [frequency] The rate of the effect. - * @param {NormalRange} [depth] The depth of the effect. - * @example - * //create a tremolo and start it's LFO - * var tremolo = new Tone.Tremolo(9, 0.75).toMaster().start(); - * //route an oscillator through the tremolo and start it - * var oscillator = new Tone.Oscillator().connect(tremolo).start(); - */ - Tone.Tremolo = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'depth' - ], Tone.Tremolo); - Tone.StereoEffect.call(this, options); - /** - * The tremelo LFO in the left channel - * @type {Tone.LFO} - * @private - */ - this._lfoL = new Tone.LFO({ - 'phase': options.spread, - 'min': 1, - 'max': 0 - }); - /** - * The tremelo LFO in the left channel - * @type {Tone.LFO} - * @private - */ - this._lfoR = new Tone.LFO({ - 'phase': options.spread, - 'min': 1, - 'max': 0 - }); - /** - * Where the gain is multiplied - * @type {Tone.Gain} - * @private - */ - this._amplitudeL = new Tone.Gain(); - /** - * Where the gain is multiplied - * @type {Tone.Gain} - * @private - */ - this._amplitudeR = new Tone.Gain(); - /** - * The frequency of the tremolo. - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency); - /** - * The depth of the effect. A depth of 0, has no effect - * on the amplitude, and a depth of 1 makes the amplitude - * modulate fully between 0 and 1. - * @type {NormalRange} - * @signal - */ - this.depth = new Tone.Signal(options.depth, Tone.Type.NormalRange); - this._readOnly([ - 'frequency', - 'depth' - ]); - this.effectSendL.chain(this._amplitudeL, this.effectReturnL); - this.effectSendR.chain(this._amplitudeR, this.effectReturnR); - this._lfoL.connect(this._amplitudeL.gain); - this._lfoR.connect(this._amplitudeR.gain); - this.frequency.fan(this._lfoL.frequency, this._lfoR.frequency); - this.depth.fan(this._lfoR.amplitude, this._lfoL.amplitude); - this.type = options.type; - this.spread = options.spread; - }; - Tone.extend(Tone.Tremolo, Tone.StereoEffect); - /** - * @static - * @const - * @type {Object} - */ - Tone.Tremolo.defaults = { - 'frequency': 10, - 'type': 'sine', - 'depth': 0.5, - 'spread': 180 - }; - /** - * Start the tremolo. - * @param {Time} [time=now] When the tremolo begins. - * @returns {Tone.Tremolo} this - */ - Tone.Tremolo.prototype.start = function (time) { - this._lfoL.start(time); - this._lfoR.start(time); - return this; - }; - /** - * Stop the tremolo. - * @param {Time} [time=now] When the tremolo stops. - * @returns {Tone.Tremolo} this - */ - Tone.Tremolo.prototype.stop = function (time) { - this._lfoL.stop(time); - this._lfoR.stop(time); - return this; - }; - /** - * Sync the effect to the transport. - * @param {Time} [delay=0] Delay time before starting the effect after the - * Transport has started. - * @returns {Tone.AutoFilter} this - */ - Tone.Tremolo.prototype.sync = function (delay) { - this._lfoL.sync(delay); - this._lfoR.sync(delay); - Tone.Transport.syncSignal(this.frequency); - return this; - }; - /** - * Unsync the filter from the transport - * @returns {Tone.Tremolo} this - */ - Tone.Tremolo.prototype.unsync = function () { - this._lfoL.unsync(); - this._lfoR.unsync(); - Tone.Transport.unsyncSignal(this.frequency); - return this; - }; - /** - * The Tremolo's oscillator type. - * @memberOf Tone.Tremolo# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.Tremolo.prototype, 'type', { - get: function () { - return this._lfoL.type; - }, - set: function (type) { - this._lfoL.type = type; - this._lfoR.type = type; - } - }); - /** - * Amount of stereo spread. When set to 0, both LFO's will be panned centrally. - * When set to 180, LFO's will be panned hard left and right respectively. - * @memberOf Tone.Tremolo# - * @type {Degrees} - * @name spread - */ - Object.defineProperty(Tone.Tremolo.prototype, 'spread', { - get: function () { - return this._lfoR.phase - this._lfoL.phase; //180 - }, - set: function (spread) { - this._lfoL.phase = 90 - spread / 2; - this._lfoR.phase = spread / 2 + 90; - } - }); - /** - * clean up - * @returns {Tone.Tremolo} this - */ - Tone.Tremolo.prototype.dispose = function () { - Tone.StereoEffect.prototype.dispose.call(this); - this._writable([ - 'frequency', - 'depth' - ]); - this._lfoL.dispose(); - this._lfoL = null; - this._lfoR.dispose(); - this._lfoR = null; - this._amplitudeL.dispose(); - this._amplitudeL = null; - this._amplitudeR.dispose(); - this._amplitudeR = null; - this.frequency = null; - this.depth = null; - return this; - }; - return Tone.Tremolo; - }); - Module(function (Tone) { - - /** - * @class A Vibrato effect composed of a Tone.Delay and a Tone.LFO. The LFO - * modulates the delayTime of the delay, causing the pitch to rise - * and fall. - * @extends {Tone.Effect} - * @param {Frequency} frequency The frequency of the vibrato. - * @param {NormalRange} depth The amount the pitch is modulated. - */ - Tone.Vibrato = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'depth' - ], Tone.Vibrato); - Tone.Effect.call(this, options); - /** - * The delay node used for the vibrato effect - * @type {Tone.Delay} - * @private - */ - this._delayNode = new Tone.Delay(0, options.maxDelay); - /** - * The LFO used to control the vibrato - * @type {Tone.LFO} - * @private - */ - this._lfo = new Tone.LFO({ - 'type': options.type, - 'min': 0, - 'max': options.maxDelay, - 'frequency': options.frequency, - 'phase': -90 //offse the phase so the resting position is in the center - }).start().connect(this._delayNode.delayTime); - /** - * The frequency of the vibrato - * @type {Frequency} - * @signal - */ - this.frequency = this._lfo.frequency; - /** - * The depth of the vibrato. - * @type {NormalRange} - * @signal - */ - this.depth = this._lfo.amplitude; - this.depth.value = options.depth; - this._readOnly([ - 'frequency', - 'depth' - ]); - this.effectSend.chain(this._delayNode, this.effectReturn); - }; - Tone.extend(Tone.Vibrato, Tone.Effect); - /** - * The defaults - * @type {Object} - * @const - */ - Tone.Vibrato.defaults = { - 'maxDelay': 0.005, - 'frequency': 5, - 'depth': 0.1, - 'type': 'sine' - }; - /** - * Type of oscillator attached to the Vibrato. - * @memberOf Tone.Vibrato# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.Vibrato.prototype, 'type', { - get: function () { - return this._lfo.type; - }, - set: function (type) { - this._lfo.type = type; - } - }); - /** - * Clean up. - * @returns {Tone.Vibrato} this - */ - Tone.Vibrato.prototype.dispose = function () { - Tone.Effect.prototype.dispose.call(this); - this._delayNode.dispose(); - this._delayNode = null; - this._lfo.dispose(); - this._lfo = null; - this._writable([ - 'frequency', - 'depth' - ]); - this.frequency = null; - this.depth = null; - }; - return Tone.Vibrato; - }); - Module(function (Tone) { - - /** - * @class Tone.Event abstracts away Tone.Transport.schedule and provides a schedulable - * callback for a single or repeatable events along the timeline. - * - * @extends {Tone} - * @param {function} callback The callback to invoke at the time. - * @param {*} value The value or values which should be passed to - * the callback function on invocation. - * @example - * var chord = new Tone.Event(function(time, chord){ - * //the chord as well as the exact time of the event - * //are passed in as arguments to the callback function - * }, ["D4", "E4", "F4"]); - * //start the chord at the beginning of the transport timeline - * chord.start(); - * //loop it every measure for 8 measures - * chord.loop = 8; - * chord.loopEnd = "1m"; - */ - Tone.Event = function () { - var options = Tone.defaults(arguments, [ - 'callback', - 'value' - ], Tone.Event); - Tone.call(this); - /** - * Loop value - * @type {Boolean|Positive} - * @private - */ - this._loop = options.loop; - /** - * The callback to invoke. - * @type {Function} - */ - this.callback = options.callback; - /** - * The value which is passed to the - * callback function. - * @type {*} - * @private - */ - this.value = options.value; - /** - * When the note is scheduled to start. - * @type {Number} - * @private - */ - this._loopStart = this.toTicks(options.loopStart); - /** - * When the note is scheduled to start. - * @type {Number} - * @private - */ - this._loopEnd = this.toTicks(options.loopEnd); - /** - * Tracks the scheduled events - * @type {Tone.TimelineState} - * @private - */ - this._state = new Tone.TimelineState(Tone.State.Stopped); - /** - * The playback speed of the note. A speed of 1 - * is no change. - * @private - * @type {Positive} - */ - this._playbackRate = 1; - /** - * A delay time from when the event is scheduled to start - * @type {Ticks} - * @private - */ - this._startOffset = 0; - /** - * private holder of probability value - * @type {NormalRange} - * @private - */ - this._probability = options.probability; - /** - * the amount of variation from the - * given time. - * @type {Boolean|Time} - * @private - */ - this._humanize = options.humanize; - /** - * If mute is true, the callback won't be - * invoked. - * @type {Boolean} - */ - this.mute = options.mute; - //set the initial values - this.playbackRate = options.playbackRate; - }; - Tone.extend(Tone.Event); - /** - * The default values - * @type {Object} - * @const - */ - Tone.Event.defaults = { - 'callback': Tone.noOp, - 'loop': false, - 'loopEnd': '1m', - 'loopStart': 0, - 'playbackRate': 1, - 'value': null, - 'probability': 1, - 'mute': false, - 'humanize': false - }; - /** - * Reschedule all of the events along the timeline - * with the updated values. - * @param {Time} after Only reschedules events after the given time. - * @return {Tone.Event} this - * @private - */ - Tone.Event.prototype._rescheduleEvents = function (after) { - //if no argument is given, schedules all of the events - after = Tone.defaultArg(after, -1); - this._state.forEachFrom(after, function (event) { - var duration; - if (event.state === Tone.State.Started) { - if (Tone.isDefined(event.id)) { - Tone.Transport.clear(event.id); - } - var startTick = event.time + Math.round(this.startOffset / this._playbackRate); - if (this._loop) { - duration = Infinity; - if (Tone.isNumber(this._loop)) { - duration = this._loop * this._getLoopDuration(); - } - var nextEvent = this._state.getAfter(startTick); - if (nextEvent !== null) { - duration = Math.min(duration, nextEvent.time - startTick); - } - if (duration !== Infinity) { - //schedule a stop since it's finite duration - this._state.setStateAtTime(Tone.State.Stopped, startTick + duration + 1); - duration = Tone.Ticks(duration); - } - var interval = Tone.Ticks(this._getLoopDuration()); - event.id = Tone.Transport.scheduleRepeat(this._tick.bind(this), interval, Tone.Ticks(startTick), duration); - } else { - event.id = Tone.Transport.schedule(this._tick.bind(this), Tone.Ticks(startTick)); - } - } - }.bind(this)); - return this; - }; - /** - * Returns the playback state of the note, either "started" or "stopped". - * @type {String} - * @readOnly - * @memberOf Tone.Event# - * @name state - */ - Object.defineProperty(Tone.Event.prototype, 'state', { - get: function () { - return this._state.getValueAtTime(Tone.Transport.ticks); - } - }); - /** - * The start from the scheduled start time - * @type {Ticks} - * @memberOf Tone.Event# - * @name startOffset - * @private - */ - Object.defineProperty(Tone.Event.prototype, 'startOffset', { - get: function () { - return this._startOffset; - }, - set: function (offset) { - this._startOffset = offset; - } - }); - /** - * The probability of the notes being triggered. - * @memberOf Tone.Event# - * @type {NormalRange} - * @name probability - */ - Object.defineProperty(Tone.Event.prototype, 'probability', { - get: function () { - return this._probability; - }, - set: function (prob) { - this._probability = prob; - } - }); - /** - * If set to true, will apply small random variation - * to the callback time. If the value is given as a time, it will randomize - * by that amount. - * @example - * event.humanize = true; - * @type {Boolean|Time} - * @name humanize - */ - Object.defineProperty(Tone.Event.prototype, 'humanize', { - get: function () { - return this._humanize; - }, - set: function (variation) { - this._humanize = variation; - } - }); - /** - * Start the note at the given time. - * @param {TimelinePosition} time When the note should start. - * @return {Tone.Event} this - */ - Tone.Event.prototype.start = function (time) { - time = this.toTicks(time); - if (this._state.getValueAtTime(time) === Tone.State.Stopped) { - this._state.add({ - 'state': Tone.State.Started, - 'time': time, - 'id': undefined - }); - this._rescheduleEvents(time); - } - return this; - }; - /** - * Stop the Event at the given time. - * @param {TimelinePosition} time When the note should stop. - * @return {Tone.Event} this - */ - Tone.Event.prototype.stop = function (time) { - this.cancel(time); - time = this.toTicks(time); - if (this._state.getValueAtTime(time) === Tone.State.Started) { - this._state.setStateAtTime(Tone.State.Stopped, time); - var previousEvent = this._state.getBefore(time); - var reschedulTime = time; - if (previousEvent !== null) { - reschedulTime = previousEvent.time; - } - this._rescheduleEvents(reschedulTime); - } - return this; - }; - /** - * Cancel all scheduled events greater than or equal to the given time - * @param {TimelinePosition} [time=0] The time after which events will be cancel. - * @return {Tone.Event} this - */ - Tone.Event.prototype.cancel = function (time) { - time = Tone.defaultArg(time, -Infinity); - time = this.toTicks(time); - this._state.forEachFrom(time, function (event) { - Tone.Transport.clear(event.id); - }); - this._state.cancel(time); - return this; - }; - /** - * The callback function invoker. Also - * checks if the Event is done playing - * @param {Number} time The time of the event in seconds - * @private - */ - Tone.Event.prototype._tick = function (time) { - var ticks = Tone.Transport.getTicksAtTime(time); - if (!this.mute && this._state.getValueAtTime(ticks) === Tone.State.Started) { - if (this.probability < 1 && Math.random() > this.probability) { - return; - } - if (this.humanize) { - var variation = 0.02; - if (!Tone.isBoolean(this.humanize)) { - variation = this.toSeconds(this.humanize); - } - time += (Math.random() * 2 - 1) * variation; - } - this.callback(time, this.value); - } - }; - /** - * Get the duration of the loop. - * @return {Ticks} - * @private - */ - Tone.Event.prototype._getLoopDuration = function () { - return Math.round((this._loopEnd - this._loopStart) / this._playbackRate); - }; - /** - * If the note should loop or not - * between Tone.Event.loopStart and - * Tone.Event.loopEnd. An integer - * value corresponds to the number of - * loops the Event does after it starts. - * @memberOf Tone.Event# - * @type {Boolean|Positive} - * @name loop - */ - Object.defineProperty(Tone.Event.prototype, 'loop', { - get: function () { - return this._loop; - }, - set: function (loop) { - this._loop = loop; - this._rescheduleEvents(); - } - }); - /** - * The playback rate of the note. Defaults to 1. - * @memberOf Tone.Event# - * @type {Positive} - * @name playbackRate - * @example - * note.loop = true; - * //repeat the note twice as fast - * note.playbackRate = 2; - */ - Object.defineProperty(Tone.Event.prototype, 'playbackRate', { - get: function () { - return this._playbackRate; - }, - set: function (rate) { - this._playbackRate = rate; - this._rescheduleEvents(); - } - }); - /** - * The loopEnd point is the time the event will loop - * if Tone.Event.loop is true. - * @memberOf Tone.Event# - * @type {Time} - * @name loopEnd - */ - Object.defineProperty(Tone.Event.prototype, 'loopEnd', { - get: function () { - return Tone.Ticks(this._loopEnd).toSeconds(); - }, - set: function (loopEnd) { - this._loopEnd = this.toTicks(loopEnd); - if (this._loop) { - this._rescheduleEvents(); - } - } - }); - /** - * The time when the loop should start. - * @memberOf Tone.Event# - * @type {Time} - * @name loopStart - */ - Object.defineProperty(Tone.Event.prototype, 'loopStart', { - get: function () { - return Tone.Ticks(this._loopStart).toSeconds(); - }, - set: function (loopStart) { - this._loopStart = this.toTicks(loopStart); - if (this._loop) { - this._rescheduleEvents(); - } - } - }); - /** - * The current progress of the loop interval. - * Returns 0 if the event is not started yet or - * it is not set to loop. - * @memberOf Tone.Event# - * @type {NormalRange} - * @name progress - * @readOnly - */ - Object.defineProperty(Tone.Event.prototype, 'progress', { - get: function () { - if (this._loop) { - var ticks = Tone.Transport.ticks; - var lastEvent = this._state.get(ticks); - if (lastEvent !== null && lastEvent.state === Tone.State.Started) { - var loopDuration = this._getLoopDuration(); - var progress = (ticks - lastEvent.time) % loopDuration; - return progress / loopDuration; - } else { - return 0; - } - } else { - return 0; - } - } - }); - /** - * Clean up - * @return {Tone.Event} this - */ - Tone.Event.prototype.dispose = function () { - this.cancel(); - this._state.dispose(); - this._state = null; - this.callback = null; - this.value = null; - }; - return Tone.Event; - }); - Module(function (Tone) { - /** - * @class Tone.Loop creates a looped callback at the - * specified interval. The callback can be - * started, stopped and scheduled along - * the Transport's timeline. - * @example - * var loop = new Tone.Loop(function(time){ - * //triggered every eighth note. - * console.log(time); - * }, "8n").start(0); - * Tone.Transport.start(); - * @extends {Tone} - * @param {Function} callback The callback to invoke with the event. - * @param {Time} interval The time between successive callback calls. - */ - Tone.Loop = function () { - var options = Tone.defaults(arguments, [ - 'callback', - 'interval' - ], Tone.Loop); - Tone.call(this); - /** - * The event which produces the callbacks - */ - this._event = new Tone.Event({ - 'callback': this._tick.bind(this), - 'loop': true, - 'loopEnd': options.interval, - 'playbackRate': options.playbackRate, - 'probability': options.probability - }); - /** - * The callback to invoke with the next event in the pattern - * @type {Function} - */ - this.callback = options.callback; - //set the iterations - this.iterations = options.iterations; - }; - Tone.extend(Tone.Loop); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.Loop.defaults = { - 'interval': '4n', - 'callback': Tone.noOp, - 'playbackRate': 1, - 'iterations': Infinity, - 'probability': true, - 'mute': false - }; - /** - * Start the loop at the specified time along the Transport's - * timeline. - * @param {TimelinePosition=} time When to start the Loop. - * @return {Tone.Loop} this - */ - Tone.Loop.prototype.start = function (time) { - this._event.start(time); - return this; - }; - /** - * Stop the loop at the given time. - * @param {TimelinePosition=} time When to stop the Arpeggio - * @return {Tone.Loop} this - */ - Tone.Loop.prototype.stop = function (time) { - this._event.stop(time); - return this; - }; - /** - * Cancel all scheduled events greater than or equal to the given time - * @param {TimelinePosition} [time=0] The time after which events will be cancel. - * @return {Tone.Loop} this - */ - Tone.Loop.prototype.cancel = function (time) { - this._event.cancel(time); - return this; - }; - /** - * Internal function called when the notes should be called - * @param {Number} time The time the event occurs - * @private - */ - Tone.Loop.prototype._tick = function (time) { - this.callback(time); - }; - /** - * The state of the Loop, either started or stopped. - * @memberOf Tone.Loop# - * @type {String} - * @name state - * @readOnly - */ - Object.defineProperty(Tone.Loop.prototype, 'state', { - get: function () { - return this._event.state; - } - }); - /** - * The progress of the loop as a value between 0-1. 0, when - * the loop is stopped or done iterating. - * @memberOf Tone.Loop# - * @type {NormalRange} - * @name progress - * @readOnly - */ - Object.defineProperty(Tone.Loop.prototype, 'progress', { - get: function () { - return this._event.progress; - } - }); - /** - * The time between successive callbacks. - * @example - * loop.interval = "8n"; //loop every 8n - * @memberOf Tone.Loop# - * @type {Time} - * @name interval - */ - Object.defineProperty(Tone.Loop.prototype, 'interval', { - get: function () { - return this._event.loopEnd; - }, - set: function (interval) { - this._event.loopEnd = interval; - } - }); - /** - * The playback rate of the loop. The normal playback rate is 1 (no change). - * A `playbackRate` of 2 would be twice as fast. - * @memberOf Tone.Loop# - * @type {Time} - * @name playbackRate - */ - Object.defineProperty(Tone.Loop.prototype, 'playbackRate', { - get: function () { - return this._event.playbackRate; - }, - set: function (rate) { - this._event.playbackRate = rate; - } - }); - /** - * Random variation +/-0.01s to the scheduled time. - * Or give it a time value which it will randomize by. - * @type {Boolean|Time} - * @memberOf Tone.Loop# - * @name humanize - */ - Object.defineProperty(Tone.Loop.prototype, 'humanize', { - get: function () { - return this._event.humanize; - }, - set: function (variation) { - this._event.humanize = variation; - } - }); - /** - * The probably of the callback being invoked. - * @memberOf Tone.Loop# - * @type {NormalRange} - * @name probability - */ - Object.defineProperty(Tone.Loop.prototype, 'probability', { - get: function () { - return this._event.probability; - }, - set: function (prob) { - this._event.probability = prob; - } - }); - /** - * Muting the Loop means that no callbacks are invoked. - * @memberOf Tone.Loop# - * @type {Boolean} - * @name mute - */ - Object.defineProperty(Tone.Loop.prototype, 'mute', { - get: function () { - return this._event.mute; - }, - set: function (mute) { - this._event.mute = mute; - } - }); - /** - * The number of iterations of the loop. The default - * value is Infinity (loop forever). - * @memberOf Tone.Loop# - * @type {Positive} - * @name iterations - */ - Object.defineProperty(Tone.Loop.prototype, 'iterations', { - get: function () { - if (this._event.loop === true) { - return Infinity; - } else { - return this._event.loop; - } - }, - set: function (iters) { - if (iters === Infinity) { - this._event.loop = true; - } else { - this._event.loop = iters; - } - } - }); - /** - * Clean up - * @return {Tone.Loop} this - */ - Tone.Loop.prototype.dispose = function () { - this._event.dispose(); - this._event = null; - this.callback = null; - }; - return Tone.Loop; - }); - Module(function (Tone) { - - /** - * @class Tone.Part is a collection Tone.Events which can be - * started/stopped and looped as a single unit. - * - * @extends {Tone.Event} - * @param {Function} callback The callback to invoke on each event - * @param {Array} events the array of events - * @example - * var part = new Tone.Part(function(time, note){ - * //the notes given as the second element in the array - * //will be passed in as the second argument - * synth.triggerAttackRelease(note, "8n", time); - * }, [[0, "C2"], ["0:2", "C3"], ["0:3:2", "G2"]]); - * @example - * //use an array of objects as long as the object has a "time" attribute - * var part = new Tone.Part(function(time, value){ - * //the value is an object which contains both the note and the velocity - * synth.triggerAttackRelease(value.note, "8n", time, value.velocity); - * }, [{"time" : 0, "note" : "C3", "velocity": 0.9}, - * {"time" : "0:2", "note" : "C4", "velocity": 0.5} - * ]).start(0); - */ - Tone.Part = function () { - var options = Tone.defaults(arguments, [ - 'callback', - 'events' - ], Tone.Part); - Tone.Event.call(this, options); - /** - * An array of Objects. - * @type {Array} - * @private - */ - this._events = []; - //add the events - for (var i = 0; i < options.events.length; i++) { - if (Array.isArray(options.events[i])) { - this.add(options.events[i][0], options.events[i][1]); - } else { - this.add(options.events[i]); - } - } - }; - Tone.extend(Tone.Part, Tone.Event); - /** - * The default values - * @type {Object} - * @const - */ - Tone.Part.defaults = { - 'callback': Tone.noOp, - 'loop': false, - 'loopEnd': '1m', - 'loopStart': 0, - 'playbackRate': 1, - 'probability': 1, - 'humanize': false, - 'mute': false, - 'events': [] - }; - /** - * Start the part at the given time. - * @param {TransportTime} time When to start the part. - * @param {Time=} offset The offset from the start of the part - * to begin playing at. - * @return {Tone.Part} this - */ - Tone.Part.prototype.start = function (time, offset) { - var ticks = this.toTicks(time); - if (this._state.getValueAtTime(ticks) !== Tone.State.Started) { - if (this._loop) { - offset = Tone.defaultArg(offset, this._loopStart); - } else { - offset = Tone.defaultArg(offset, 0); - } - offset = this.toTicks(offset); - this._state.add({ - 'state': Tone.State.Started, - 'time': ticks, - 'offset': offset - }); - this._forEach(function (event) { - this._startNote(event, ticks, offset); - }); - } - return this; - }; - /** - * Start the event in the given event at the correct time given - * the ticks and offset and looping. - * @param {Tone.Event} event - * @param {Ticks} ticks - * @param {Ticks} offset - * @private - */ - Tone.Part.prototype._startNote = function (event, ticks, offset) { - ticks -= offset; - if (this._loop) { - if (event.startOffset >= this._loopStart && event.startOffset < this._loopEnd) { - if (event.startOffset < offset) { - //start it on the next loop - ticks += this._getLoopDuration(); - } - event.start(Tone.Ticks(ticks)); - } else if (event.startOffset < this._loopStart && event.startOffset >= offset) { - event.loop = false; - event.start(Tone.Ticks(ticks)); - } - } else if (event.startOffset >= offset) { - event.start(Tone.Ticks(ticks)); - } - }; - /** - * The start from the scheduled start time - * @type {Ticks} - * @memberOf Tone.Part# - * @name startOffset - * @private - */ - Object.defineProperty(Tone.Part.prototype, 'startOffset', { - get: function () { - return this._startOffset; - }, - set: function (offset) { - this._startOffset = offset; - this._forEach(function (event) { - event.startOffset += this._startOffset; - }); - } - }); - /** - * Stop the part at the given time. - * @param {TimelinePosition} time When to stop the part. - * @return {Tone.Part} this - */ - Tone.Part.prototype.stop = function (time) { - var ticks = this.toTicks(time); - this._state.cancel(ticks); - this._state.setStateAtTime(Tone.State.Stopped, ticks); - this._forEach(function (event) { - event.stop(time); - }); - return this; - }; - /** - * Get/Set an Event's value at the given time. - * If a value is passed in and no event exists at - * the given time, one will be created with that value. - * If two events are at the same time, the first one will - * be returned. - * @example - * part.at("1m"); //returns the part at the first measure - * - * part.at("2m", "C2"); //set the value at "2m" to C2. - * //if an event didn't exist at that time, it will be created. - * @param {TransportTime} time The time of the event to get or set. - * @param {*=} value If a value is passed in, the value of the - * event at the given time will be set to it. - * @return {Tone.Event} the event at the time - */ - Tone.Part.prototype.at = function (time, value) { - time = Tone.TransportTime(time); - var tickTime = Tone.Ticks(1).toSeconds(); - for (var i = 0; i < this._events.length; i++) { - var event = this._events[i]; - if (Math.abs(time.toTicks() - event.startOffset) < tickTime) { - if (Tone.isDefined(value)) { - event.value = value; - } - return event; - } - } - //if there was no event at that time, create one - if (Tone.isDefined(value)) { - this.add(time, value); - //return the new event - return this._events[this._events.length - 1]; - } else { - return null; - } - }; - /** - * Add a an event to the part. - * @param {Time} time The time the note should start. - * If an object is passed in, it should - * have a 'time' attribute and the rest - * of the object will be used as the 'value'. - * @param {Tone.Event|*} value - * @returns {Tone.Part} this - * @example - * part.add("1m", "C#+11"); - */ - Tone.Part.prototype.add = function (time, value) { - //extract the parameters - if (time.hasOwnProperty('time')) { - value = time; - time = value.time; - } - time = this.toTicks(time); - var event; - if (value instanceof Tone.Event) { - event = value; - event.callback = this._tick.bind(this); - } else { - event = new Tone.Event({ - 'callback': this._tick.bind(this), - 'value': value - }); - } - //the start offset - event.startOffset = time; - //initialize the values - event.set({ - 'loopEnd': this.loopEnd, - 'loopStart': this.loopStart, - 'loop': this.loop, - 'humanize': this.humanize, - 'playbackRate': this.playbackRate, - 'probability': this.probability - }); - this._events.push(event); - //start the note if it should be played right now - this._restartEvent(event); - return this; - }; - /** - * Restart the given event - * @param {Tone.Event} event - * @private - */ - Tone.Part.prototype._restartEvent = function (event) { - this._state.forEach(function (stateEvent) { - if (stateEvent.state === Tone.State.Started) { - this._startNote(event, stateEvent.time, stateEvent.offset); - } else { - //stop the note - event.stop(Tone.Ticks(stateEvent.time)); - } - }.bind(this)); - }; - /** - * Remove an event from the part. Will recursively iterate - * into nested parts to find the event. - * @param {Time} time The time of the event - * @param {*} value Optionally select only a specific event value - * @return {Tone.Part} this - */ - Tone.Part.prototype.remove = function (time, value) { - //extract the parameters - if (time.hasOwnProperty('time')) { - value = time; - time = value.time; - } - time = this.toTicks(time); - for (var i = this._events.length - 1; i >= 0; i--) { - var event = this._events[i]; - if (event instanceof Tone.Part) { - event.remove(time, value); - } else if (event.startOffset === time) { - if (Tone.isUndef(value) || Tone.isDefined(value) && event.value === value) { - this._events.splice(i, 1); - event.dispose(); - } - } - } - return this; - }; - /** - * Remove all of the notes from the group. - * @return {Tone.Part} this - */ - Tone.Part.prototype.removeAll = function () { - this._forEach(function (event) { - event.dispose(); - }); - this._events = []; - return this; - }; - /** - * Cancel scheduled state change events: i.e. "start" and "stop". - * @param {TimelinePosition} after The time after which to cancel the scheduled events. - * @return {Tone.Part} this - */ - Tone.Part.prototype.cancel = function (after) { - this._forEach(function (event) { - event.cancel(after); - }); - this._state.cancel(this.toTicks(after)); - return this; - }; - /** - * Iterate over all of the events - * @param {Function} callback - * @param {Object} ctx The context - * @private - */ - Tone.Part.prototype._forEach = function (callback, ctx) { - if (this._events) { - ctx = Tone.defaultArg(ctx, this); - for (var i = this._events.length - 1; i >= 0; i--) { - var e = this._events[i]; - if (e instanceof Tone.Part) { - e._forEach(callback, ctx); - } else { - callback.call(ctx, e); - } - } - } - return this; - }; - /** - * Set the attribute of all of the events - * @param {String} attr the attribute to set - * @param {*} value The value to set it to - * @private - */ - Tone.Part.prototype._setAll = function (attr, value) { - this._forEach(function (event) { - event[attr] = value; - }); - }; - /** - * Internal tick method - * @param {Number} time The time of the event in seconds - * @private - */ - Tone.Part.prototype._tick = function (time, value) { - if (!this.mute) { - this.callback(time, value); - } - }; - /** - * Determine if the event should be currently looping - * given the loop boundries of this Part. - * @param {Tone.Event} event The event to test - * @private - */ - Tone.Part.prototype._testLoopBoundries = function (event) { - if (event.startOffset < this._loopStart || event.startOffset >= this._loopEnd) { - event.cancel(0); - } else if (event.state === Tone.State.Stopped) { - //reschedule it if it's stopped - this._restartEvent(event); - } - }; - /** - * The probability of the notes being triggered. - * @memberOf Tone.Part# - * @type {NormalRange} - * @name probability - */ - Object.defineProperty(Tone.Part.prototype, 'probability', { - get: function () { - return this._probability; - }, - set: function (prob) { - this._probability = prob; - this._setAll('probability', prob); - } - }); - /** - * If set to true, will apply small random variation - * to the callback time. If the value is given as a time, it will randomize - * by that amount. - * @example - * event.humanize = true; - * @type {Boolean|Time} - * @name humanize - */ - Object.defineProperty(Tone.Part.prototype, 'humanize', { - get: function () { - return this._humanize; - }, - set: function (variation) { - this._humanize = variation; - this._setAll('humanize', variation); - } - }); - /** - * If the part should loop or not - * between Tone.Part.loopStart and - * Tone.Part.loopEnd. An integer - * value corresponds to the number of - * loops the Part does after it starts. - * @memberOf Tone.Part# - * @type {Boolean|Positive} - * @name loop - * @example - * //loop the part 8 times - * part.loop = 8; - */ - Object.defineProperty(Tone.Part.prototype, 'loop', { - get: function () { - return this._loop; - }, - set: function (loop) { - this._loop = loop; - this._forEach(function (event) { - event._loopStart = this._loopStart; - event._loopEnd = this._loopEnd; - event.loop = loop; - this._testLoopBoundries(event); - }); - } - }); - /** - * The loopEnd point determines when it will - * loop if Tone.Part.loop is true. - * @memberOf Tone.Part# - * @type {Time} - * @name loopEnd - */ - Object.defineProperty(Tone.Part.prototype, 'loopEnd', { - get: function () { - return Tone.Ticks(this._loopEnd).toSeconds(); - }, - set: function (loopEnd) { - this._loopEnd = this.toTicks(loopEnd); - if (this._loop) { - this._forEach(function (event) { - event.loopEnd = loopEnd; - this._testLoopBoundries(event); - }); - } - } - }); - /** - * The loopStart point determines when it will - * loop if Tone.Part.loop is true. - * @memberOf Tone.Part# - * @type {Time} - * @name loopStart - */ - Object.defineProperty(Tone.Part.prototype, 'loopStart', { - get: function () { - return Tone.Ticks(this._loopStart).toSeconds(); - }, - set: function (loopStart) { - this._loopStart = this.toTicks(loopStart); - if (this._loop) { - this._forEach(function (event) { - event.loopStart = this.loopStart; - this._testLoopBoundries(event); - }); - } - } - }); - /** - * The playback rate of the part - * @memberOf Tone.Part# - * @type {Positive} - * @name playbackRate - */ - Object.defineProperty(Tone.Part.prototype, 'playbackRate', { - get: function () { - return this._playbackRate; - }, - set: function (rate) { - this._playbackRate = rate; - this._setAll('playbackRate', rate); - } - }); - /** - * The number of scheduled notes in the part. - * @memberOf Tone.Part# - * @type {Positive} - * @name length - * @readOnly - */ - Object.defineProperty(Tone.Part.prototype, 'length', { - get: function () { - return this._events.length; - } - }); - /** - * Clean up - * @return {Tone.Part} this - */ - Tone.Part.prototype.dispose = function () { - this.removeAll(); - this._state.dispose(); - this._state = null; - this.callback = null; - this._events = null; - return this; - }; - return Tone.Part; - }); - Module(function (Tone) { - /** - * @class Tone.Pattern arpeggiates between the given notes - * in a number of patterns. See Tone.CtrlPattern for - * a full list of patterns. - * @example - * var pattern = new Tone.Pattern(function(time, note){ - * //the order of the notes passed in depends on the pattern - * }, ["C2", "D4", "E5", "A6"], "upDown"); - * @extends {Tone.Loop} - * @param {Function} callback The callback to invoke with the - * event. - * @param {Array} values The values to arpeggiate over. - */ - Tone.Pattern = function () { - var options = Tone.defaults(arguments, [ - 'callback', - 'values', - 'pattern' - ], Tone.Pattern); - Tone.Loop.call(this, options); - /** - * The pattern manager - * @type {Tone.CtrlPattern} - * @private - */ - this._pattern = new Tone.CtrlPattern({ - 'values': options.values, - 'type': options.pattern, - 'index': options.index - }); - }; - Tone.extend(Tone.Pattern, Tone.Loop); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.Pattern.defaults = { - 'pattern': Tone.CtrlPattern.Type.Up, - 'callback': Tone.noOp, - 'values': [] - }; - /** - * Internal function called when the notes should be called - * @param {Number} time The time the event occurs - * @private - */ - Tone.Pattern.prototype._tick = function (time) { - this.callback(time, this._pattern.value); - this._pattern.next(); - }; - /** - * The current index in the values array. - * @memberOf Tone.Pattern# - * @type {Positive} - * @name index - */ - Object.defineProperty(Tone.Pattern.prototype, 'index', { - get: function () { - return this._pattern.index; - }, - set: function (i) { - this._pattern.index = i; - } - }); - /** - * The array of events. - * @memberOf Tone.Pattern# - * @type {Array} - * @name values - */ - Object.defineProperty(Tone.Pattern.prototype, 'values', { - get: function () { - return this._pattern.values; - }, - set: function (vals) { - this._pattern.values = vals; - } - }); - /** - * The current value of the pattern. - * @memberOf Tone.Pattern# - * @type {*} - * @name value - * @readOnly - */ - Object.defineProperty(Tone.Pattern.prototype, 'value', { - get: function () { - return this._pattern.value; - } - }); - /** - * The pattern type. See Tone.CtrlPattern for the full list of patterns. - * @memberOf Tone.Pattern# - * @type {String} - * @name pattern - */ - Object.defineProperty(Tone.Pattern.prototype, 'pattern', { - get: function () { - return this._pattern.type; - }, - set: function (pattern) { - this._pattern.type = pattern; - } - }); - /** - * Clean up - * @return {Tone.Pattern} this - */ - Tone.Pattern.prototype.dispose = function () { - Tone.Loop.prototype.dispose.call(this); - this._pattern.dispose(); - this._pattern = null; - }; - return Tone.Pattern; - }); - Module(function (Tone) { - - /** - * @class A sequence is an alternate notation of a part. Instead - * of passing in an array of [time, event] pairs, pass - * in an array of events which will be spaced at the - * given subdivision. Sub-arrays will subdivide that beat - * by the number of items are in the array. - * Sequence notation inspiration from [Tidal](http://yaxu.org/tidal/) - * @param {Function} callback The callback to invoke with every note - * @param {Array} events The sequence - * @param {Time} subdivision The subdivision between which events are placed. - * @extends {Tone.Part} - * @example - * var seq = new Tone.Sequence(function(time, note){ - * console.log(note); - * //straight quater notes - * }, ["C4", "E4", "G4", "A4"], "4n"); - * @example - * var seq = new Tone.Sequence(function(time, note){ - * console.log(note); - * //subdivisions are given as subarrays - * }, ["C4", ["E4", "D4", "E4"], "G4", ["A4", "G4"]]); - */ - Tone.Sequence = function () { - var options = Tone.defaults(arguments, [ - 'callback', - 'events', - 'subdivision' - ], Tone.Sequence); - //remove the events - var events = options.events; - delete options.events; - Tone.Part.call(this, options); - /** - * The subdivison of each note - * @type {Ticks} - * @private - */ - this._subdivision = this.toTicks(options.subdivision); - //if no time was passed in, the loop end is the end of the cycle - if (Tone.isUndef(options.loopEnd) && Tone.isDefined(events)) { - this._loopEnd = events.length * this._subdivision; - } - //defaults to looping - this._loop = true; - //add all of the events - if (Tone.isDefined(events)) { - for (var i = 0; i < events.length; i++) { - this.add(i, events[i]); - } - } - }; - Tone.extend(Tone.Sequence, Tone.Part); - /** - * The default values. - * @type {Object} - */ - Tone.Sequence.defaults = { 'subdivision': '4n' }; - /** - * The subdivision of the sequence. This can only be - * set in the constructor. The subdivision is the - * interval between successive steps. - * @type {Time} - * @memberOf Tone.Sequence# - * @name subdivision - * @readOnly - */ - Object.defineProperty(Tone.Sequence.prototype, 'subdivision', { - get: function () { - return Tone.Ticks(this._subdivision).toSeconds(); - } - }); - /** - * Get/Set an index of the sequence. If the index contains a subarray, - * a Tone.Sequence representing that sub-array will be returned. - * @example - * var sequence = new Tone.Sequence(playNote, ["E4", "C4", "F#4", ["A4", "Bb3"]]) - * sequence.at(0)// => returns "E4" - * //set a value - * sequence.at(0, "G3"); - * //get a nested sequence - * sequence.at(3).at(1)// => returns "Bb3" - * @param {Positive} index The index to get or set - * @param {*} value Optionally pass in the value to set at the given index. - */ - Tone.Sequence.prototype.at = function (index, value) { - //if the value is an array, - if (Tone.isArray(value)) { - //remove the current event at that index - this.remove(index); - } - //call the parent's method - return Tone.Part.prototype.at.call(this, this._indexTime(index), value); - }; - /** - * Add an event at an index, if there's already something - * at that index, overwrite it. If `value` is an array, - * it will be parsed as a subsequence. - * @param {Number} index The index to add the event to - * @param {*} value The value to add at that index - * @returns {Tone.Sequence} this - */ - Tone.Sequence.prototype.add = function (index, value) { - if (value === null) { - return this; - } - if (Tone.isArray(value)) { - //make a subsequence and add that to the sequence - var subSubdivision = Math.round(this._subdivision / value.length); - value = new Tone.Sequence(this._tick.bind(this), value, Tone.Ticks(subSubdivision)); - } - Tone.Part.prototype.add.call(this, this._indexTime(index), value); - return this; - }; - /** - * Remove a value from the sequence by index - * @param {Number} index The index of the event to remove - * @returns {Tone.Sequence} this - */ - Tone.Sequence.prototype.remove = function (index, value) { - Tone.Part.prototype.remove.call(this, this._indexTime(index), value); - return this; - }; - /** - * Get the time of the index given the Sequence's subdivision - * @param {Number} index - * @return {Time} The time of that index - * @private - */ - Tone.Sequence.prototype._indexTime = function (index) { - if (index instanceof Tone.TransportTime) { - return index; - } else { - return Tone.Ticks(index * this._subdivision + this.startOffset).toSeconds(); - } - }; - /** - * Clean up. - * @return {Tone.Sequence} this - */ - Tone.Sequence.prototype.dispose = function () { - Tone.Part.prototype.dispose.call(this); - return this; - }; - return Tone.Sequence; - }); - Module(function (Tone) { - - /** - * @class Tone.PulseOscillator is a pulse oscillator with control over pulse width, - * also known as the duty cycle. At 50% duty cycle (width = 0.5) the wave is - * a square and only odd-numbered harmonics are present. At all other widths - * even-numbered harmonics are present. Read more - * [here](https://wigglewave.wordpress.com/2014/08/16/pulse-waveforms-and-harmonics/). - * - * @constructor - * @extends {Tone.Source} - * @param {Frequency} [frequency] The frequency of the oscillator - * @param {NormalRange} [width] The width of the pulse - * @example - * var pulse = new Tone.PulseOscillator("E5", 0.4).toMaster().start(); - */ - Tone.PulseOscillator = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'width' - ], Tone.Oscillator); - Tone.Source.call(this, options); - /** - * The width of the pulse. - * @type {NormalRange} - * @signal - */ - this.width = new Tone.Signal(options.width, Tone.Type.NormalRange); - /** - * gate the width amount - * @type {Tone.Gain} - * @private - */ - this._widthGate = new Tone.Gain(); - /** - * the sawtooth oscillator - * @type {Tone.Oscillator} - * @private - */ - this._sawtooth = new Tone.Oscillator({ - frequency: options.frequency, - detune: options.detune, - type: 'sawtooth', - phase: options.phase - }); - /** - * The frequency control. - * @type {Frequency} - * @signal - */ - this.frequency = this._sawtooth.frequency; - /** - * The detune in cents. - * @type {Cents} - * @signal - */ - this.detune = this._sawtooth.detune; - /** - * Threshold the signal to turn it into a square - * @type {Tone.WaveShaper} - * @private - */ - this._thresh = new Tone.WaveShaper(function (val) { - if (val < 0) { - return -1; - } else { - return 1; - } - }); - //connections - this._sawtooth.chain(this._thresh, this.output); - this.width.chain(this._widthGate, this._thresh); - this._readOnly([ - 'width', - 'frequency', - 'detune' - ]); - }; - Tone.extend(Tone.PulseOscillator, Tone.Source); - /** - * The default parameters. - * @static - * @const - * @type {Object} - */ - Tone.PulseOscillator.defaults = { - 'frequency': 440, - 'detune': 0, - 'phase': 0, - 'width': 0.2 - }; - /** - * start the oscillator - * @param {Time} time - * @private - */ - Tone.PulseOscillator.prototype._start = function (time) { - time = this.toSeconds(time); - this._sawtooth.start(time); - this._widthGate.gain.setValueAtTime(1, time); - }; - /** - * stop the oscillator - * @param {Time} time - * @private - */ - Tone.PulseOscillator.prototype._stop = function (time) { - time = this.toSeconds(time); - this._sawtooth.stop(time); - //the width is still connected to the output. - //that needs to be stopped also - this._widthGate.gain.setValueAtTime(0, time); - }; - /** - * restart the oscillator - * @param {Time} time (optional) timing parameter - * @private - */ - Tone.PulseOscillator.prototype.restart = function (time) { - this._sawtooth.restart(time); - }; - /** - * The phase of the oscillator in degrees. - * @memberOf Tone.PulseOscillator# - * @type {Degrees} - * @name phase - */ - Object.defineProperty(Tone.PulseOscillator.prototype, 'phase', { - get: function () { - return this._sawtooth.phase; - }, - set: function (phase) { - this._sawtooth.phase = phase; - } - }); - /** - * The type of the oscillator. Always returns "pulse". - * @readOnly - * @memberOf Tone.PulseOscillator# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.PulseOscillator.prototype, 'type', { - get: function () { - return 'pulse'; - } - }); - /** - * The partials of the waveform. Cannot set partials for this waveform type - * @memberOf Tone.PulseOscillator# - * @type {Array} - * @name partials - * @private - */ - Object.defineProperty(Tone.PulseOscillator.prototype, 'partials', { - get: function () { - return []; - } - }); - /** - * Clean up method. - * @return {Tone.PulseOscillator} this - */ - Tone.PulseOscillator.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - this._sawtooth.dispose(); - this._sawtooth = null; - this._writable([ - 'width', - 'frequency', - 'detune' - ]); - this.width.dispose(); - this.width = null; - this._widthGate.dispose(); - this._widthGate = null; - this._thresh.dispose(); - this._thresh = null; - this.frequency = null; - this.detune = null; - return this; - }; - return Tone.PulseOscillator; - }); - Module(function (Tone) { - - /** - * @class Tone.PWMOscillator modulates the width of a Tone.PulseOscillator - * at the modulationFrequency. This has the effect of continuously - * changing the timbre of the oscillator by altering the harmonics - * generated. - * - * @extends {Tone.Source} - * @constructor - * @param {Frequency} frequency The starting frequency of the oscillator. - * @param {Frequency} modulationFrequency The modulation frequency of the width of the pulse. - * @example - * var pwm = new Tone.PWMOscillator("Ab3", 0.3).toMaster().start(); - */ - Tone.PWMOscillator = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'modulationFrequency' - ], Tone.PWMOscillator); - Tone.Source.call(this, options); - /** - * the pulse oscillator - * @type {Tone.PulseOscillator} - * @private - */ - this._pulse = new Tone.PulseOscillator(options.modulationFrequency); - //change the pulse oscillator type - this._pulse._sawtooth.type = 'sine'; - /** - * the modulator - * @type {Tone.Oscillator} - * @private - */ - this._modulator = new Tone.Oscillator({ - 'frequency': options.frequency, - 'detune': options.detune, - 'phase': options.phase - }); - /** - * Scale the oscillator so it doesn't go silent - * at the extreme values. - * @type {Tone.Multiply} - * @private - */ - this._scale = new Tone.Multiply(2); - /** - * The frequency control. - * @type {Frequency} - * @signal - */ - this.frequency = this._modulator.frequency; - /** - * The detune of the oscillator. - * @type {Cents} - * @signal - */ - this.detune = this._modulator.detune; - /** - * The modulation rate of the oscillator. - * @type {Frequency} - * @signal - */ - this.modulationFrequency = this._pulse.frequency; - //connections - this._modulator.chain(this._scale, this._pulse.width); - this._pulse.connect(this.output); - this._readOnly([ - 'modulationFrequency', - 'frequency', - 'detune' - ]); - }; - Tone.extend(Tone.PWMOscillator, Tone.Source); - /** - * default values - * @static - * @type {Object} - * @const - */ - Tone.PWMOscillator.defaults = { - 'frequency': 440, - 'detune': 0, - 'phase': 0, - 'modulationFrequency': 0.4 - }; - /** - * start the oscillator - * @param {Time} [time=now] - * @private - */ - Tone.PWMOscillator.prototype._start = function (time) { - time = this.toSeconds(time); - this._modulator.start(time); - this._pulse.start(time); - }; - /** - * stop the oscillator - * @param {Time} time (optional) timing parameter - * @private - */ - Tone.PWMOscillator.prototype._stop = function (time) { - time = this.toSeconds(time); - this._modulator.stop(time); - this._pulse.stop(time); - }; - /** - * restart the oscillator - * @param {Time} time (optional) timing parameter - * @private - */ - Tone.PWMOscillator.prototype.restart = function (time) { - this._modulator.restart(time); - this._pulse.restart(time); - }; - /** - * The type of the oscillator. Always returns "pwm". - * @readOnly - * @memberOf Tone.PWMOscillator# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.PWMOscillator.prototype, 'type', { - get: function () { - return 'pwm'; - } - }); - /** - * The partials of the waveform. Cannot set partials for this waveform type - * @memberOf Tone.PWMOscillator# - * @type {Array} - * @name partials - * @private - */ - Object.defineProperty(Tone.PWMOscillator.prototype, 'partials', { - get: function () { - return []; - } - }); - /** - * The phase of the oscillator in degrees. - * @memberOf Tone.PWMOscillator# - * @type {number} - * @name phase - */ - Object.defineProperty(Tone.PWMOscillator.prototype, 'phase', { - get: function () { - return this._modulator.phase; - }, - set: function (phase) { - this._modulator.phase = phase; - } - }); - /** - * Clean up. - * @return {Tone.PWMOscillator} this - */ - Tone.PWMOscillator.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - this._pulse.dispose(); - this._pulse = null; - this._scale.dispose(); - this._scale = null; - this._modulator.dispose(); - this._modulator = null; - this._writable([ - 'modulationFrequency', - 'frequency', - 'detune' - ]); - this.frequency = null; - this.detune = null; - this.modulationFrequency = null; - return this; - }; - return Tone.PWMOscillator; - }); - Module(function (Tone) { - - /** - * @class Tone.FMOscillator - * - * @extends {Tone.Source} - * @constructor - * @param {Frequency} frequency The starting frequency of the oscillator. - * @param {String} type The type of the carrier oscillator. - * @param {String} modulationType The type of the modulator oscillator. - * @example - * //a sine oscillator frequency-modulated by a square wave - * var fmOsc = new Tone.FMOscillator("Ab3", "sine", "square").toMaster().start(); - */ - Tone.FMOscillator = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'type', - 'modulationType' - ], Tone.FMOscillator); - Tone.Source.call(this, options); - /** - * The carrier oscillator - * @type {Tone.Oscillator} - * @private - */ - this._carrier = new Tone.Oscillator(options.frequency, options.type); - /** - * The oscillator's frequency - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency); - /** - * The detune control signal. - * @type {Cents} - * @signal - */ - this.detune = this._carrier.detune; - this.detune.value = options.detune; - /** - * The modulation index which is in essence the depth or amount of the modulation. In other terms it is the - * ratio of the frequency of the modulating signal (mf) to the amplitude of the - * modulating signal (ma) -- as in ma/mf. - * @type {Positive} - * @signal - */ - this.modulationIndex = new Tone.Multiply(options.modulationIndex); - this.modulationIndex.units = Tone.Type.Positive; - /** - * The modulating oscillator - * @type {Tone.Oscillator} - * @private - */ - this._modulator = new Tone.Oscillator(options.frequency, options.modulationType); - /** - * Harmonicity is the frequency ratio between the carrier and the modulator oscillators. - * A harmonicity of 1 gives both oscillators the same frequency. - * Harmonicity = 2 means a change of an octave. - * @type {Positive} - * @signal - * @example - * //pitch the modulator an octave below carrier - * synth.harmonicity.value = 0.5; - */ - this.harmonicity = new Tone.Multiply(options.harmonicity); - this.harmonicity.units = Tone.Type.Positive; - /** - * the node where the modulation happens - * @type {Tone.Gain} - * @private - */ - this._modulationNode = new Tone.Gain(0); - //connections - this.frequency.connect(this._carrier.frequency); - this.frequency.chain(this.harmonicity, this._modulator.frequency); - this.frequency.chain(this.modulationIndex, this._modulationNode); - this._modulator.connect(this._modulationNode.gain); - this._modulationNode.connect(this._carrier.frequency); - this._carrier.connect(this.output); - this.detune.connect(this._modulator.detune); - this.phase = options.phase; - this._readOnly([ - 'modulationIndex', - 'frequency', - 'detune', - 'harmonicity' - ]); - }; - Tone.extend(Tone.FMOscillator, Tone.Source); - /** - * default values - * @static - * @type {Object} - * @const - */ - Tone.FMOscillator.defaults = { - 'frequency': 440, - 'detune': 0, - 'phase': 0, - 'modulationIndex': 2, - 'modulationType': 'square', - 'harmonicity': 1 - }; - /** - * start the oscillator - * @param {Time} [time=now] - * @private - */ - Tone.FMOscillator.prototype._start = function (time) { - this._modulator.start(time); - this._carrier.start(time); - }; - /** - * stop the oscillator - * @param {Time} time (optional) timing parameter - * @private - */ - Tone.FMOscillator.prototype._stop = function (time) { - this._modulator.stop(time); - this._carrier.stop(time); - }; - /** - * stop the oscillator - * @param {Time} time (optional) timing parameter - * @private - */ - Tone.FMOscillator.prototype.restart = function (time) { - this._modulator.restart(time); - this._carrier.restart(time); - }; - /** - * The type of the carrier oscillator - * @memberOf Tone.FMOscillator# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.FMOscillator.prototype, 'type', { - get: function () { - return this._carrier.type; - }, - set: function (type) { - this._carrier.type = type; - } - }); - /** - * The type of the modulator oscillator - * @memberOf Tone.FMOscillator# - * @type {String} - * @name modulationType - */ - Object.defineProperty(Tone.FMOscillator.prototype, 'modulationType', { - get: function () { - return this._modulator.type; - }, - set: function (type) { - this._modulator.type = type; - } - }); - /** - * The phase of the oscillator in degrees. - * @memberOf Tone.FMOscillator# - * @type {number} - * @name phase - */ - Object.defineProperty(Tone.FMOscillator.prototype, 'phase', { - get: function () { - return this._carrier.phase; - }, - set: function (phase) { - this._carrier.phase = phase; - this._modulator.phase = phase; - } - }); - /** - * The partials of the carrier waveform. A partial represents - * the amplitude at a harmonic. The first harmonic is the - * fundamental frequency, the second is the octave and so on - * following the harmonic series. - * Setting this value will automatically set the type to "custom". - * The value is an empty array when the type is not "custom". - * @memberOf Tone.FMOscillator# - * @type {Array} - * @name partials - * @example - * osc.partials = [1, 0.2, 0.01]; - */ - Object.defineProperty(Tone.FMOscillator.prototype, 'partials', { - get: function () { - return this._carrier.partials; - }, - set: function (partials) { - this._carrier.partials = partials; - } - }); - /** - * Clean up. - * @return {Tone.FMOscillator} this - */ - Tone.FMOscillator.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - this._writable([ - 'modulationIndex', - 'frequency', - 'detune', - 'harmonicity' - ]); - this.frequency.dispose(); - this.frequency = null; - this.detune = null; - this.harmonicity.dispose(); - this.harmonicity = null; - this._carrier.dispose(); - this._carrier = null; - this._modulator.dispose(); - this._modulator = null; - this._modulationNode.dispose(); - this._modulationNode = null; - this.modulationIndex.dispose(); - this.modulationIndex = null; - return this; - }; - return Tone.FMOscillator; - }); - Module(function (Tone) { - - /** - * @class Tone.AMOscillator - * - * @extends {Tone.Oscillator} - * @constructor - * @param {Frequency} frequency The starting frequency of the oscillator. - * @param {String} type The type of the carrier oscillator. - * @param {String} modulationType The type of the modulator oscillator. - * @example - * //a sine oscillator frequency-modulated by a square wave - * var fmOsc = new Tone.AMOscillator("Ab3", "sine", "square").toMaster().start(); - */ - Tone.AMOscillator = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'type', - 'modulationType' - ], Tone.AMOscillator); - Tone.Source.call(this, options); - /** - * The carrier oscillator - * @type {Tone.Oscillator} - * @private - */ - this._carrier = new Tone.Oscillator(options.frequency, options.type); - /** - * The oscillator's frequency - * @type {Frequency} - * @signal - */ - this.frequency = this._carrier.frequency; - /** - * The detune control signal. - * @type {Cents} - * @signal - */ - this.detune = this._carrier.detune; - this.detune.value = options.detune; - /** - * The modulating oscillator - * @type {Tone.Oscillator} - * @private - */ - this._modulator = new Tone.Oscillator(options.frequency, options.modulationType); - /** - * convert the -1,1 output to 0,1 - * @type {Tone.AudioToGain} - * @private - */ - this._modulationScale = new Tone.AudioToGain(); - /** - * Harmonicity is the frequency ratio between the carrier and the modulator oscillators. - * A harmonicity of 1 gives both oscillators the same frequency. - * Harmonicity = 2 means a change of an octave. - * @type {Positive} - * @signal - * @example - * //pitch the modulator an octave below carrier - * synth.harmonicity.value = 0.5; - */ - this.harmonicity = new Tone.Multiply(options.harmonicity); - this.harmonicity.units = Tone.Type.Positive; - /** - * the node where the modulation happens - * @type {Tone.Gain} - * @private - */ - this._modulationNode = new Tone.Gain(0); - //connections - this.frequency.chain(this.harmonicity, this._modulator.frequency); - this.detune.connect(this._modulator.detune); - this._modulator.chain(this._modulationScale, this._modulationNode.gain); - this._carrier.chain(this._modulationNode, this.output); - this.phase = options.phase; - this._readOnly([ - 'frequency', - 'detune', - 'harmonicity' - ]); - }; - Tone.extend(Tone.AMOscillator, Tone.Oscillator); - /** - * default values - * @static - * @type {Object} - * @const - */ - Tone.AMOscillator.defaults = { - 'frequency': 440, - 'detune': 0, - 'phase': 0, - 'modulationType': 'square', - 'harmonicity': 1 - }; - /** - * start the oscillator - * @param {Time} [time=now] - * @private - */ - Tone.AMOscillator.prototype._start = function (time) { - this._modulator.start(time); - this._carrier.start(time); - }; - /** - * stop the oscillator - * @param {Time} time (optional) timing parameter - * @private - */ - Tone.AMOscillator.prototype._stop = function (time) { - this._modulator.stop(time); - this._carrier.stop(time); - }; - /** - * restart the oscillator - * @param {Time} time (optional) timing parameter - * @private - */ - Tone.AMOscillator.prototype.restart = function (time) { - this._modulator.restart(time); - this._carrier.restart(time); - }; - /** - * The type of the carrier oscillator - * @memberOf Tone.AMOscillator# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.AMOscillator.prototype, 'type', { - get: function () { - return this._carrier.type; - }, - set: function (type) { - this._carrier.type = type; - } - }); - /** - * The type of the modulator oscillator - * @memberOf Tone.AMOscillator# - * @type {string} - * @name modulationType - */ - Object.defineProperty(Tone.AMOscillator.prototype, 'modulationType', { - get: function () { - return this._modulator.type; - }, - set: function (type) { - this._modulator.type = type; - } - }); - /** - * The phase of the oscillator in degrees. - * @memberOf Tone.AMOscillator# - * @type {number} - * @name phase - */ - Object.defineProperty(Tone.AMOscillator.prototype, 'phase', { - get: function () { - return this._carrier.phase; - }, - set: function (phase) { - this._carrier.phase = phase; - this._modulator.phase = phase; - } - }); - /** - * The partials of the carrier waveform. A partial represents - * the amplitude at a harmonic. The first harmonic is the - * fundamental frequency, the second is the octave and so on - * following the harmonic series. - * Setting this value will automatically set the type to "custom". - * The value is an empty array when the type is not "custom". - * @memberOf Tone.AMOscillator# - * @type {Array} - * @name partials - * @example - * osc.partials = [1, 0.2, 0.01]; - */ - Object.defineProperty(Tone.AMOscillator.prototype, 'partials', { - get: function () { - return this._carrier.partials; - }, - set: function (partials) { - this._carrier.partials = partials; - } - }); - /** - * Clean up. - * @return {Tone.AMOscillator} this - */ - Tone.AMOscillator.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - this._writable([ - 'frequency', - 'detune', - 'harmonicity' - ]); - this.frequency = null; - this.detune = null; - this.harmonicity.dispose(); - this.harmonicity = null; - this._carrier.dispose(); - this._carrier = null; - this._modulator.dispose(); - this._modulator = null; - this._modulationNode.dispose(); - this._modulationNode = null; - this._modulationScale.dispose(); - this._modulationScale = null; - return this; - }; - return Tone.AMOscillator; - }); - Module(function (Tone) { - - /** - * @class Tone.FatOscillator - * - * @extends {Tone.Source} - * @constructor - * @param {Frequency} frequency The starting frequency of the oscillator. - * @param {String} type The type of the carrier oscillator. - * @param {String} modulationType The type of the modulator oscillator. - * @example - * //a sine oscillator frequency-modulated by a square wave - * var fmOsc = new Tone.FatOscillator("Ab3", "sine", "square").toMaster().start(); - */ - Tone.FatOscillator = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'type', - 'spread' - ], Tone.FatOscillator); - Tone.Source.call(this, options); - /** - * The oscillator's frequency - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency); - /** - * The detune control signal. - * @type {Cents} - * @signal - */ - this.detune = new Tone.Signal(options.detune, Tone.Type.Cents); - /** - * The array of oscillators - * @type {Array} - * @private - */ - this._oscillators = []; - /** - * The total spread of the oscillators - * @type {Cents} - * @private - */ - this._spread = options.spread; - /** - * The type of the oscillator - * @type {String} - * @private - */ - this._type = options.type; - /** - * The phase of the oscillators - * @type {Degrees} - * @private - */ - this._phase = options.phase; - /** - * The partials array - * @type {Array} - * @private - */ - this._partials = Tone.defaultArg(options.partials, []); - //set the count initially - this.count = options.count; - this._readOnly([ - 'frequency', - 'detune' - ]); - }; - Tone.extend(Tone.FatOscillator, Tone.Source); - /** - * default values - * @static - * @type {Object} - * @const - */ - Tone.FatOscillator.defaults = { - 'frequency': 440, - 'detune': 0, - 'phase': 0, - 'spread': 20, - 'count': 3, - 'type': 'sawtooth' - }; - /** - * start the oscillator - * @param {Time} [time=now] - * @private - */ - Tone.FatOscillator.prototype._start = function (time) { - time = this.toSeconds(time); - this._forEach(function (osc) { - osc.start(time); - }); - }; - /** - * stop the oscillator - * @param {Time} [time=now] - * @private - */ - Tone.FatOscillator.prototype._stop = function (time) { - time = this.toSeconds(time); - this._forEach(function (osc) { - osc.stop(time); - }); - }; - /** - * restart the oscillator - * @param {Time} time (optional) timing parameter - * @private - */ - Tone.FatOscillator.prototype.restart = function (time) { - time = this.toSeconds(time); - this._forEach(function (osc) { - osc.restart(time); - }); - }; - /** - * Iterate over all of the oscillators - * @param {Function} iterator The iterator function - * @private - */ - Tone.FatOscillator.prototype._forEach = function (iterator) { - for (var i = 0; i < this._oscillators.length; i++) { - iterator.call(this, this._oscillators[i], i); - } - }; - /** - * The type of the carrier oscillator - * @memberOf Tone.FatOscillator# - * @type {string} - * @name type - */ - Object.defineProperty(Tone.FatOscillator.prototype, 'type', { - get: function () { - return this._type; - }, - set: function (type) { - this._type = type; - this._forEach(function (osc) { - osc.type = type; - }); - } - }); - /** - * The detune spread between the oscillators. If "count" is - * set to 3 oscillators and the "spread" is set to 40, - * the three oscillators would be detuned like this: [-20, 0, 20] - * for a total detune spread of 40 cents. - * @memberOf Tone.FatOscillator# - * @type {Cents} - * @name spread - */ - Object.defineProperty(Tone.FatOscillator.prototype, 'spread', { - get: function () { - return this._spread; - }, - set: function (spread) { - this._spread = spread; - if (this._oscillators.length > 1) { - var start = -spread / 2; - var step = spread / (this._oscillators.length - 1); - this._forEach(function (osc, i) { - osc.detune.value = start + step * i; - }); - } - } - }); - /** - * The number of detuned oscillators - * @memberOf Tone.FatOscillator# - * @type {Number} - * @name count - */ - Object.defineProperty(Tone.FatOscillator.prototype, 'count', { - get: function () { - return this._oscillators.length; - }, - set: function (count) { - count = Math.max(count, 1); - if (this._oscillators.length !== count) { - // var partials = this.partials; - // var type = this.type; - //dispose the previous oscillators - this._forEach(function (osc) { - osc.dispose(); - }); - this._oscillators = []; - for (var i = 0; i < count; i++) { - var osc = new Tone.Oscillator(); - if (this.type === Tone.Oscillator.Type.Custom) { - osc.partials = this._partials; - } else { - osc.type = this._type; - } - osc.phase = this._phase; - osc.volume.value = -6 - count * 1.1; - this.frequency.connect(osc.frequency); - this.detune.connect(osc.detune); - osc.connect(this.output); - this._oscillators[i] = osc; - } - //set the spread - this.spread = this._spread; - if (this.state === Tone.State.Started) { - this._forEach(function (osc) { - osc.start(); - }); - } - } - } - }); - /** - * The phase of the oscillator in degrees. - * @memberOf Tone.FatOscillator# - * @type {Number} - * @name phase - */ - Object.defineProperty(Tone.FatOscillator.prototype, 'phase', { - get: function () { - return this._phase; - }, - set: function (phase) { - this._phase = phase; - this._forEach(function (osc) { - osc.phase = phase; - }); - } - }); - /** - * The partials of the carrier waveform. A partial represents - * the amplitude at a harmonic. The first harmonic is the - * fundamental frequency, the second is the octave and so on - * following the harmonic series. - * Setting this value will automatically set the type to "custom". - * The value is an empty array when the type is not "custom". - * @memberOf Tone.FatOscillator# - * @type {Array} - * @name partials - * @example - * osc.partials = [1, 0.2, 0.01]; - */ - Object.defineProperty(Tone.FatOscillator.prototype, 'partials', { - get: function () { - return this._partials; - }, - set: function (partials) { - this._partials = partials; - this._type = Tone.Oscillator.Type.Custom; - this._forEach(function (osc) { - osc.partials = partials; - }); - } - }); - /** - * Clean up. - * @return {Tone.FatOscillator} this - */ - Tone.FatOscillator.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - this._writable([ - 'frequency', - 'detune' - ]); - this.frequency.dispose(); - this.frequency = null; - this.detune.dispose(); - this.detune = null; - this._forEach(function (osc) { - osc.dispose(); - }); - this._oscillators = null; - this._partials = null; - return this; - }; - return Tone.FatOscillator; - }); - Module(function (Tone) { - - /** - * @class Tone.OmniOscillator aggregates Tone.Oscillator, Tone.PulseOscillator, - * Tone.PWMOscillator, Tone.FMOscillator, Tone.AMOscillator, and Tone.FatOscillator - * into one class. The oscillator class can be changed by setting the `type`. - * `omniOsc.type = "pwm"` will set it to the Tone.PWMOscillator. Prefixing - * any of the basic types ("sine", "square4", etc.) with "fm", "am", or "fat" - * will use the FMOscillator, AMOscillator or FatOscillator respectively. - * For example: `omniOsc.type = "fatsawtooth"` will create set the oscillator - * to a FatOscillator of type "sawtooth". - * - * @extends {Tone.Source} - * @constructor - * @param {Frequency} frequency The initial frequency of the oscillator. - * @param {String} type The type of the oscillator. - * @example - * var omniOsc = new Tone.OmniOscillator("C#4", "pwm"); - */ - Tone.OmniOscillator = function () { - var options = Tone.defaults(arguments, [ - 'frequency', - 'type' - ], Tone.OmniOscillator); - Tone.Source.call(this, options); - /** - * The frequency control. - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency); - /** - * The detune control - * @type {Cents} - * @signal - */ - this.detune = new Tone.Signal(options.detune, Tone.Type.Cents); - /** - * the type of the oscillator source - * @type {String} - * @private - */ - this._sourceType = undefined; - /** - * the oscillator - * @type {Tone.Oscillator} - * @private - */ - this._oscillator = null; - //set the oscillator - this.type = options.type; - this._readOnly([ - 'frequency', - 'detune' - ]); - //set the options - this.set(options); - }; - Tone.extend(Tone.OmniOscillator, Tone.Source); - /** - * default values - * @static - * @type {Object} - * @const - */ - Tone.OmniOscillator.defaults = { - 'frequency': 440, - 'detune': 0, - 'type': 'sine', - 'phase': 0 - }; - /** - * @enum {String} - * @private - */ - var OmniOscType = { - Pulse: 'PulseOscillator', - PWM: 'PWMOscillator', - Osc: 'Oscillator', - FM: 'FMOscillator', - AM: 'AMOscillator', - Fat: 'FatOscillator' - }; - /** - * start the oscillator - * @param {Time} [time=now] the time to start the oscillator - * @private - */ - Tone.OmniOscillator.prototype._start = function (time) { - this._oscillator.start(time); - }; - /** - * start the oscillator - * @param {Time} [time=now] the time to start the oscillator - * @private - */ - Tone.OmniOscillator.prototype._stop = function (time) { - this._oscillator.stop(time); - }; - Tone.OmniOscillator.prototype.restart = function (time) { - this._oscillator.restart(time); - }; - /** - * The type of the oscillator. Can be any of the basic types: sine, square, triangle, sawtooth. Or - * prefix the basic types with "fm", "am", or "fat" to use the FMOscillator, AMOscillator or FatOscillator - * types. The oscillator could also be set to "pwm" or "pulse". All of the parameters of the - * oscillator's class are accessible when the oscillator is set to that type, but throws an error - * when it's not. - * - * @memberOf Tone.OmniOscillator# - * @type {String} - * @name type - * @example - * omniOsc.type = "pwm"; - * //modulationFrequency is parameter which is available - * //only when the type is "pwm". - * omniOsc.modulationFrequency.value = 0.5; - * @example - * //an square wave frequency modulated by a sawtooth - * omniOsc.type = "fmsquare"; - * omniOsc.modulationType = "sawtooth"; - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'type', { - get: function () { - var prefix = ''; - if (this._sourceType === OmniOscType.FM) { - prefix = 'fm'; - } else if (this._sourceType === OmniOscType.AM) { - prefix = 'am'; - } else if (this._sourceType === OmniOscType.Fat) { - prefix = 'fat'; - } - return prefix + this._oscillator.type; - }, - set: function (type) { - if (type.substr(0, 2) === 'fm') { - this._createNewOscillator(OmniOscType.FM); - this._oscillator.type = type.substr(2); - } else if (type.substr(0, 2) === 'am') { - this._createNewOscillator(OmniOscType.AM); - this._oscillator.type = type.substr(2); - } else if (type.substr(0, 3) === 'fat') { - this._createNewOscillator(OmniOscType.Fat); - this._oscillator.type = type.substr(3); - } else if (type === 'pwm') { - this._createNewOscillator(OmniOscType.PWM); - } else if (type === 'pulse') { - this._createNewOscillator(OmniOscType.Pulse); - } else { - this._createNewOscillator(OmniOscType.Osc); - this._oscillator.type = type; - } - } - }); - /** - * The partials of the waveform. A partial represents - * the amplitude at a harmonic. The first harmonic is the - * fundamental frequency, the second is the octave and so on - * following the harmonic series. - * Setting this value will automatically set the type to "custom". - * The value is an empty array when the type is not "custom". - * This is not available on "pwm" and "pulse" oscillator types. - * @memberOf Tone.OmniOscillator# - * @type {Array} - * @name partials - * @example - * osc.partials = [1, 0.2, 0.01]; - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'partials', { - get: function () { - return this._oscillator.partials; - }, - set: function (partials) { - this._oscillator.partials = partials; - } - }); - /** - * Set a member/attribute of the oscillator. - * @param {Object|String} params - * @param {number=} value - * @param {Time=} rampTime - * @returns {Tone.OmniOscillator} this - */ - Tone.OmniOscillator.prototype.set = function (params, value) { - //make sure the type is set first - if (params === 'type') { - this.type = value; - } else if (Tone.isObject(params) && params.hasOwnProperty('type')) { - this.type = params.type; - } - //then set the rest - Tone.prototype.set.apply(this, arguments); - return this; - }; - /** - * connect the oscillator to the frequency and detune signals - * @private - */ - Tone.OmniOscillator.prototype._createNewOscillator = function (oscType) { - if (oscType !== this._sourceType) { - this._sourceType = oscType; - var OscillatorConstructor = Tone[oscType]; - //short delay to avoid clicks on the change - var now = this.now(); - if (this._oscillator !== null) { - var oldOsc = this._oscillator; - oldOsc.stop(now); - //dispose the old one - this.context.setTimeout(function () { - oldOsc.dispose(); - oldOsc = null; - }, this.blockTime); - } - this._oscillator = new OscillatorConstructor(); - this.frequency.connect(this._oscillator.frequency); - this.detune.connect(this._oscillator.detune); - this._oscillator.connect(this.output); - if (this.state === Tone.State.Started) { - this._oscillator.start(now); - } - } - }; - /** - * The phase of the oscillator in degrees. - * @memberOf Tone.OmniOscillator# - * @type {Degrees} - * @name phase - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'phase', { - get: function () { - return this._oscillator.phase; - }, - set: function (phase) { - this._oscillator.phase = phase; - } - }); - /** - * The width of the oscillator (only if the oscillator is set to "pulse") - * @memberOf Tone.OmniOscillator# - * @type {NormalRange} - * @signal - * @name width - * @example - * var omniOsc = new Tone.OmniOscillator(440, "pulse"); - * //can access the width attribute only if type === "pulse" - * omniOsc.width.value = 0.2; - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'width', { - get: function () { - if (this._sourceType === OmniOscType.Pulse) { - return this._oscillator.width; - } - } - }); - /** - * The number of detuned oscillators - * @memberOf Tone.OmniOscillator# - * @type {Number} - * @name count - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'count', { - get: function () { - if (this._sourceType === OmniOscType.Fat) { - return this._oscillator.count; - } - }, - set: function (count) { - if (this._sourceType === OmniOscType.Fat) { - this._oscillator.count = count; - } - } - }); - /** - * The detune spread between the oscillators. If "count" is - * set to 3 oscillators and the "spread" is set to 40, - * the three oscillators would be detuned like this: [-20, 0, 20] - * for a total detune spread of 40 cents. See Tone.FatOscillator - * for more info. - * @memberOf Tone.OmniOscillator# - * @type {Cents} - * @name spread - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'spread', { - get: function () { - if (this._sourceType === OmniOscType.Fat) { - return this._oscillator.spread; - } - }, - set: function (spread) { - if (this._sourceType === OmniOscType.Fat) { - this._oscillator.spread = spread; - } - } - }); - /** - * The type of the modulator oscillator. Only if the oscillator - * is set to "am" or "fm" types. see. Tone.AMOscillator or Tone.FMOscillator - * for more info. - * @memberOf Tone.OmniOscillator# - * @type {String} - * @name modulationType - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'modulationType', { - get: function () { - if (this._sourceType === OmniOscType.FM || this._sourceType === OmniOscType.AM) { - return this._oscillator.modulationType; - } - }, - set: function (mType) { - if (this._sourceType === OmniOscType.FM || this._sourceType === OmniOscType.AM) { - this._oscillator.modulationType = mType; - } - } - }); - /** - * The modulation index which is in essence the depth or amount of the modulation. In other terms it is the - * ratio of the frequency of the modulating signal (mf) to the amplitude of the - * modulating signal (ma) -- as in ma/mf. - * See Tone.FMOscillator for more info. - * @type {Positive} - * @signal - * @name modulationIndex - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'modulationIndex', { - get: function () { - if (this._sourceType === OmniOscType.FM) { - return this._oscillator.modulationIndex; - } - } - }); - /** - * Harmonicity is the frequency ratio between the carrier and the modulator oscillators. - * A harmonicity of 1 gives both oscillators the same frequency. - * Harmonicity = 2 means a change of an octave. See Tone.AMOscillator or Tone.FMOscillator - * for more info. - * @memberOf Tone.OmniOscillator# - * @signal - * @type {Positive} - * @name harmonicity - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'harmonicity', { - get: function () { - if (this._sourceType === OmniOscType.FM || this._sourceType === OmniOscType.AM) { - return this._oscillator.harmonicity; - } - } - }); - /** - * The modulationFrequency Signal of the oscillator - * (only if the oscillator type is set to pwm). See - * Tone.PWMOscillator for more info. - * @memberOf Tone.OmniOscillator# - * @type {Frequency} - * @signal - * @name modulationFrequency - * @example - * var omniOsc = new Tone.OmniOscillator(440, "pwm"); - * //can access the modulationFrequency attribute only if type === "pwm" - * omniOsc.modulationFrequency.value = 0.2; - */ - Object.defineProperty(Tone.OmniOscillator.prototype, 'modulationFrequency', { - get: function () { - if (this._sourceType === OmniOscType.PWM) { - return this._oscillator.modulationFrequency; - } - } - }); - /** - * Clean up. - * @return {Tone.OmniOscillator} this - */ - Tone.OmniOscillator.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - this._writable([ - 'frequency', - 'detune' - ]); - this.detune.dispose(); - this.detune = null; - this.frequency.dispose(); - this.frequency = null; - this._oscillator.dispose(); - this._oscillator = null; - this._sourceType = null; - return this; - }; - return Tone.OmniOscillator; - }); - Module(function (Tone) { - - /** - * @class Base-class for all instruments - * - * @constructor - * @extends {Tone.AudioNode} - */ - Tone.Instrument = function (options) { - //get the defaults - options = Tone.defaultArg(options, Tone.Instrument.defaults); - Tone.AudioNode.call(this); - /** - * The output and volume triming node - * @type {Tone.Volume} - * @private - */ - this._volume = this.output = new Tone.Volume(options.volume); - /** - * The volume of the output in decibels. - * @type {Decibels} - * @signal - * @example - * source.volume.value = -6; - */ - this.volume = this._volume.volume; - this._readOnly('volume'); - /** - * Keep track of all events scheduled to the transport - * when the instrument is 'synced' - * @type {Array<Number>} - * @private - */ - this._scheduledEvents = []; - }; - Tone.extend(Tone.Instrument, Tone.AudioNode); - /** - * the default attributes - * @type {object} - */ - Tone.Instrument.defaults = { - /** the volume of the output in decibels */ - 'volume': 0 - }; - /** - * @abstract - * @param {string|number} note the note to trigger - * @param {Time} [time=now] the time to trigger the ntoe - * @param {number} [velocity=1] the velocity to trigger the note - */ - Tone.Instrument.prototype.triggerAttack = Tone.noOp; - /** - * @abstract - * @param {Time} [time=now] when to trigger the release - */ - Tone.Instrument.prototype.triggerRelease = Tone.noOp; - /** - * Sync the instrument to the Transport. All subsequent calls of - * [triggerAttack](#triggerattack) and [triggerRelease](#triggerrelease) - * will be scheduled along the transport. - * @example - * instrument.sync() - * //schedule 3 notes when the transport first starts - * instrument.triggerAttackRelease('C4', '8n', 0) - * instrument.triggerAttackRelease('E4', '8n', '8n') - * instrument.triggerAttackRelease('G4', '8n', '4n') - * //start the transport to hear the notes - * Transport.start() - * @returns {Tone.Instrument} this - */ - Tone.Instrument.prototype.sync = function () { - this._syncMethod('triggerAttack', 1); - this._syncMethod('triggerRelease', 0); - return this; - }; - /** - * Wrap the given method so that it can be synchronized - * @param {String} method Which method to wrap and sync - * @param {Number} timePosition What position the time argument appears in - * @private - */ - Tone.Instrument.prototype._syncMethod = function (method, timePosition) { - var originalMethod = this['_original_' + method] = this[method]; - this[method] = function () { - var args = Array.prototype.slice.call(arguments); - var time = args[timePosition]; - var id = Tone.Transport.schedule(function (t) { - args[timePosition] = t; - originalMethod.apply(this, args); - }.bind(this), time); - this._scheduledEvents.push(id); - }.bind(this); - }; - /** - * Unsync the instrument from the Transport - * @returns {Tone.Instrument} this - */ - Tone.Instrument.prototype.unsync = function () { - this._scheduledEvents.forEach(function (id) { - Tone.Transport.clear(id); - }); - this._scheduledEvents = []; - if (this._original_triggerAttack) { - this.triggerAttack = this._original_triggerAttack; - this.triggerRelease = this._original_triggerRelease; - } - return this; - }; - /** - * Trigger the attack and then the release after the duration. - * @param {Frequency} note The note to trigger. - * @param {Time} duration How long the note should be held for before - * triggering the release. This value must be greater than 0. - * @param {Time} [time=now] When the note should be triggered. - * @param {NormalRange} [velocity=1] The velocity the note should be triggered at. - * @returns {Tone.Instrument} this - * @example - * //trigger "C4" for the duration of an 8th note - * synth.triggerAttackRelease("C4", "8n"); - */ - Tone.Instrument.prototype.triggerAttackRelease = function (note, duration, time, velocity) { - time = this.toSeconds(time); - duration = this.toSeconds(duration); - this.triggerAttack(note, time, velocity); - this.triggerRelease(time + duration); - return this; - }; - /** - * clean up - * @returns {Tone.Instrument} this - */ - Tone.Instrument.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._volume.dispose(); - this._volume = null; - this._writable(['volume']); - this.volume = null; - this.unsync(); - this._scheduledEvents = null; - return this; - }; - return Tone.Instrument; - }); - Module(function (Tone) { - - /** - * @class This is an abstract base class for other monophonic instruments to - * extend. IMPORTANT: It does not make any sound on its own and - * shouldn't be directly instantiated. - * - * @constructor - * @abstract - * @extends {Tone.Instrument} - */ - Tone.Monophonic = function (options) { - //get the defaults - options = Tone.defaultArg(options, Tone.Monophonic.defaults); - Tone.Instrument.call(this, options); - /** - * The glide time between notes. - * @type {Time} - */ - this.portamento = options.portamento; - }; - Tone.extend(Tone.Monophonic, Tone.Instrument); - /** - * @static - * @const - * @type {Object} - */ - Tone.Monophonic.defaults = { 'portamento': 0 }; - /** - * Trigger the attack of the note optionally with a given velocity. - * - * - * @param {Frequency} note The note to trigger. - * @param {Time} [time=now] When the note should start. - * @param {number} [velocity=1] velocity The velocity scaler - * determines how "loud" the note - * will be triggered. - * @returns {Tone.Monophonic} this - * @example - * synth.triggerAttack("C4"); - * @example - * //trigger the note a half second from now at half velocity - * synth.triggerAttack("C4", "+0.5", 0.5); - */ - Tone.Monophonic.prototype.triggerAttack = function (note, time, velocity) { - time = this.toSeconds(time); - this._triggerEnvelopeAttack(time, velocity); - this.setNote(note, time); - return this; - }; - /** - * Trigger the release portion of the envelope - * @param {Time} [time=now] If no time is given, the release happens immediatly - * @returns {Tone.Monophonic} this - * @example - * synth.triggerRelease(); - */ - Tone.Monophonic.prototype.triggerRelease = function (time) { - time = this.toSeconds(time); - this._triggerEnvelopeRelease(time); - return this; - }; - /** - * override this method with the actual method - * @abstract - * @private - */ - Tone.Monophonic.prototype._triggerEnvelopeAttack = function () { - }; - /** - * override this method with the actual method - * @abstract - * @private - */ - Tone.Monophonic.prototype._triggerEnvelopeRelease = function () { - }; - /** - * Get the level of the output at the given time. Measures - * the envelope(s) value at the time. - * @param {Time} time The time to query the envelope value - * @return {NormalRange} The output level between 0-1 - */ - Tone.Monophonic.prototype.getLevelAtTime = function (time) { - time = this.toSeconds(time); - return this.envelope.getValueAtTime(time); - }; - /** - * Set the note at the given time. If no time is given, the note - * will set immediately. - * @param {Frequency} note The note to change to. - * @param {Time} [time=now] The time when the note should be set. - * @returns {Tone.Monophonic} this - * @example - * //change to F#6 in one quarter note from now. - * synth.setNote("F#6", "+4n"); - * @example - * //change to Bb4 right now - * synth.setNote("Bb4"); - */ - Tone.Monophonic.prototype.setNote = function (note, time) { - time = this.toSeconds(time); - if (this.portamento > 0 && this.getLevelAtTime(time) > 0.05) { - var portTime = this.toSeconds(this.portamento); - this.frequency.exponentialRampTo(note, portTime, time); - } else { - this.frequency.setValueAtTime(note, time); - } - return this; - }; - return Tone.Monophonic; - }); - Module(function (Tone) { - - /** - * @class Tone.Synth is composed simply of a Tone.OmniOscillator - * routed through a Tone.AmplitudeEnvelope. - * <img src="https://docs.google.com/drawings/d/1-1_0YW2Z1J2EPI36P8fNCMcZG7N1w1GZluPs4og4evo/pub?w=1163&h=231"> - * - * @constructor - * @extends {Tone.Monophonic} - * @param {Object} [options] the options available for the synth - * see defaults below - * @example - * var synth = new Tone.Synth().toMaster(); - * synth.triggerAttackRelease("C4", "8n"); - */ - Tone.Synth = function (options) { - //get the defaults - options = Tone.defaultArg(options, Tone.Synth.defaults); - Tone.Monophonic.call(this, options); - /** - * The oscillator. - * @type {Tone.OmniOscillator} - */ - this.oscillator = new Tone.OmniOscillator(options.oscillator); - /** - * The frequency control. - * @type {Frequency} - * @signal - */ - this.frequency = this.oscillator.frequency; - /** - * The detune control. - * @type {Cents} - * @signal - */ - this.detune = this.oscillator.detune; - /** - * The amplitude envelope. - * @type {Tone.AmplitudeEnvelope} - */ - this.envelope = new Tone.AmplitudeEnvelope(options.envelope); - //connect the oscillators to the output - this.oscillator.chain(this.envelope, this.output); - this._readOnly([ - 'oscillator', - 'frequency', - 'detune', - 'envelope' - ]); - }; - Tone.extend(Tone.Synth, Tone.Monophonic); - /** - * @const - * @static - * @type {Object} - */ - Tone.Synth.defaults = { - 'oscillator': { 'type': 'triangle' }, - 'envelope': { - 'attack': 0.005, - 'decay': 0.1, - 'sustain': 0.3, - 'release': 1 - } - }; - /** - * start the attack portion of the envelope - * @param {Time} [time=now] the time the attack should start - * @param {number} [velocity=1] the velocity of the note (0-1) - * @returns {Tone.Synth} this - * @private - */ - Tone.Synth.prototype._triggerEnvelopeAttack = function (time, velocity) { - //the envelopes - this.envelope.triggerAttack(time, velocity); - this.oscillator.start(time); - //if there is no release portion, stop the oscillator - if (this.envelope.sustain === 0) { - this.oscillator.stop(time + this.envelope.attack + this.envelope.decay); - } - return this; - }; - /** - * start the release portion of the envelope - * @param {Time} [time=now] the time the release should start - * @returns {Tone.Synth} this - * @private - */ - Tone.Synth.prototype._triggerEnvelopeRelease = function (time) { - time = this.toSeconds(time); - this.envelope.triggerRelease(time); - this.oscillator.stop(time + this.envelope.release); - return this; - }; - /** - * clean up - * @returns {Tone.Synth} this - */ - Tone.Synth.prototype.dispose = function () { - Tone.Monophonic.prototype.dispose.call(this); - this._writable([ - 'oscillator', - 'frequency', - 'detune', - 'envelope' - ]); - this.oscillator.dispose(); - this.oscillator = null; - this.envelope.dispose(); - this.envelope = null; - this.frequency = null; - this.detune = null; - return this; - }; - return Tone.Synth; - }); - Module(function (Tone) { - - /** - * @class AMSynth uses the output of one Tone.Synth to modulate the - * amplitude of another Tone.Synth. The harmonicity (the ratio between - * the two signals) affects the timbre of the output signal greatly. - * Read more about Amplitude Modulation Synthesis on - * [SoundOnSound](https://web.archive.org/web/20160404103653/http://www.soundonsound.com:80/sos/mar00/articles/synthsecrets.htm). - * <img src="https://docs.google.com/drawings/d/1TQu8Ed4iFr1YTLKpB3U1_hur-UwBrh5gdBXc8BxfGKw/pub?w=1009&h=457"> - * - * @constructor - * @extends {Tone.Monophonic} - * @param {Object} [options] the options available for the synth - * see defaults below - * @example - * var synth = new Tone.AMSynth().toMaster(); - * synth.triggerAttackRelease("C4", "4n"); - */ - Tone.AMSynth = function (options) { - options = Tone.defaultArg(options, Tone.AMSynth.defaults); - Tone.Monophonic.call(this, options); - /** - * The carrier voice. - * @type {Tone.Synth} - * @private - */ - this._carrier = new Tone.Synth(); - this._carrier.volume.value = -10; - /** - * The carrier's oscillator - * @type {Tone.Oscillator} - */ - this.oscillator = this._carrier.oscillator; - /** - * The carrier's envelope - * @type {Tone.AmplitudeEnvelope} - */ - this.envelope = this._carrier.envelope.set(options.envelope); - /** - * The modulator voice. - * @type {Tone.Synth} - * @private - */ - this._modulator = new Tone.Synth(); - this._modulator.volume.value = -10; - /** - * The modulator's oscillator which is applied - * to the amplitude of the oscillator - * @type {Tone.Oscillator} - */ - this.modulation = this._modulator.oscillator.set(options.modulation); - /** - * The modulator's envelope - * @type {Tone.AmplitudeEnvelope} - */ - this.modulationEnvelope = this._modulator.envelope.set(options.modulationEnvelope); - /** - * The frequency. - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(440, Tone.Type.Frequency); - /** - * The detune in cents - * @type {Cents} - * @signal - */ - this.detune = new Tone.Signal(options.detune, Tone.Type.Cents); - /** - * Harmonicity is the ratio between the two voices. A harmonicity of - * 1 is no change. Harmonicity = 2 means a change of an octave. - * @type {Positive} - * @signal - * @example - * //pitch voice1 an octave below voice0 - * synth.harmonicity.value = 0.5; - */ - this.harmonicity = new Tone.Multiply(options.harmonicity); - this.harmonicity.units = Tone.Type.Positive; - /** - * convert the -1,1 output to 0,1 - * @type {Tone.AudioToGain} - * @private - */ - this._modulationScale = new Tone.AudioToGain(); - /** - * the node where the modulation happens - * @type {Tone.Gain} - * @private - */ - this._modulationNode = new Tone.Gain(); - //control the two voices frequency - this.frequency.connect(this._carrier.frequency); - this.frequency.chain(this.harmonicity, this._modulator.frequency); - this.detune.fan(this._carrier.detune, this._modulator.detune); - this._modulator.chain(this._modulationScale, this._modulationNode.gain); - this._carrier.chain(this._modulationNode, this.output); - this._readOnly([ - 'frequency', - 'harmonicity', - 'oscillator', - 'envelope', - 'modulation', - 'modulationEnvelope', - 'detune' - ]); - }; - Tone.extend(Tone.AMSynth, Tone.Monophonic); - /** - * @static - * @type {Object} - */ - Tone.AMSynth.defaults = { - 'harmonicity': 3, - 'detune': 0, - 'oscillator': { 'type': 'sine' }, - 'envelope': { - 'attack': 0.01, - 'decay': 0.01, - 'sustain': 1, - 'release': 0.5 - }, - 'modulation': { 'type': 'square' }, - 'modulationEnvelope': { - 'attack': 0.5, - 'decay': 0, - 'sustain': 1, - 'release': 0.5 - } - }; - /** - * trigger the attack portion of the note - * - * @param {Time} [time=now] the time the note will occur - * @param {NormalRange} [velocity=1] the velocity of the note - * @private - * @returns {Tone.AMSynth} this - */ - Tone.AMSynth.prototype._triggerEnvelopeAttack = function (time, velocity) { - //the port glide - time = this.toSeconds(time); - //the envelopes - this._carrier._triggerEnvelopeAttack(time, velocity); - this._modulator._triggerEnvelopeAttack(time); - return this; - }; - /** - * trigger the release portion of the note - * - * @param {Time} [time=now] the time the note will release - * @private - * @returns {Tone.AMSynth} this - */ - Tone.AMSynth.prototype._triggerEnvelopeRelease = function (time) { - this._carrier._triggerEnvelopeRelease(time); - this._modulator._triggerEnvelopeRelease(time); - return this; - }; - /** - * clean up - * @returns {Tone.AMSynth} this - */ - Tone.AMSynth.prototype.dispose = function () { - Tone.Monophonic.prototype.dispose.call(this); - this._writable([ - 'frequency', - 'harmonicity', - 'oscillator', - 'envelope', - 'modulation', - 'modulationEnvelope', - 'detune' - ]); - this._carrier.dispose(); - this._carrier = null; - this._modulator.dispose(); - this._modulator = null; - this.frequency.dispose(); - this.frequency = null; - this.detune.dispose(); - this.detune = null; - this.harmonicity.dispose(); - this.harmonicity = null; - this._modulationScale.dispose(); - this._modulationScale = null; - this._modulationNode.dispose(); - this._modulationNode = null; - this.oscillator = null; - this.envelope = null; - this.modulationEnvelope = null; - this.modulation = null; - return this; - }; - return Tone.AMSynth; - }); - Module(function (Tone) { - - /** - * @class Tone.MonoSynth is composed of one oscillator, one filter, and two envelopes. - * The amplitude of the Tone.Oscillator and the cutoff frequency of the - * Tone.Filter are controlled by Tone.Envelopes. - * <img src="https://docs.google.com/drawings/d/1gaY1DF9_Hzkodqf8JI1Cg2VZfwSElpFQfI94IQwad38/pub?w=924&h=240"> - * - * @constructor - * @extends {Tone.Monophonic} - * @param {Object} [options] the options available for the synth - * see defaults below - * @example - * var synth = new Tone.MonoSynth({ - * "oscillator" : { - * "type" : "square" - * }, - * "envelope" : { - * "attack" : 0.1 - * } - * }).toMaster(); - * synth.triggerAttackRelease("C4", "8n"); - */ - Tone.MonoSynth = function (options) { - //get the defaults - options = Tone.defaultArg(options, Tone.MonoSynth.defaults); - Tone.Monophonic.call(this, options); - /** - * The oscillator. - * @type {Tone.OmniOscillator} - */ - this.oscillator = new Tone.OmniOscillator(options.oscillator); - /** - * The frequency control. - * @type {Frequency} - * @signal - */ - this.frequency = this.oscillator.frequency; - /** - * The detune control. - * @type {Cents} - * @signal - */ - this.detune = this.oscillator.detune; - /** - * The filter. - * @type {Tone.Filter} - */ - this.filter = new Tone.Filter(options.filter); - /** - * The filter envelope. - * @type {Tone.FrequencyEnvelope} - */ - this.filterEnvelope = new Tone.FrequencyEnvelope(options.filterEnvelope); - /** - * The amplitude envelope. - * @type {Tone.AmplitudeEnvelope} - */ - this.envelope = new Tone.AmplitudeEnvelope(options.envelope); - //connect the oscillators to the output - this.oscillator.chain(this.filter, this.envelope, this.output); - //connect the filter envelope - this.filterEnvelope.connect(this.filter.frequency); - this._readOnly([ - 'oscillator', - 'frequency', - 'detune', - 'filter', - 'filterEnvelope', - 'envelope' - ]); - }; - Tone.extend(Tone.MonoSynth, Tone.Monophonic); - /** - * @const - * @static - * @type {Object} - */ - Tone.MonoSynth.defaults = { - 'frequency': 'C4', - 'detune': 0, - 'oscillator': { 'type': 'square' }, - 'filter': { - 'Q': 6, - 'type': 'lowpass', - 'rolloff': -24 - }, - 'envelope': { - 'attack': 0.005, - 'decay': 0.1, - 'sustain': 0.9, - 'release': 1 - }, - 'filterEnvelope': { - 'attack': 0.06, - 'decay': 0.2, - 'sustain': 0.5, - 'release': 2, - 'baseFrequency': 200, - 'octaves': 7, - 'exponent': 2 - } - }; - /** - * start the attack portion of the envelope - * @param {Time} [time=now] the time the attack should start - * @param {NormalRange} [velocity=1] the velocity of the note (0-1) - * @returns {Tone.MonoSynth} this - * @private - */ - Tone.MonoSynth.prototype._triggerEnvelopeAttack = function (time, velocity) { - time = this.toSeconds(time); - //the envelopes - this.envelope.triggerAttack(time, velocity); - this.filterEnvelope.triggerAttack(time); - this.oscillator.start(time); - if (this.envelope.sustain === 0) { - this.oscillator.stop(time + this.envelope.attack + this.envelope.decay); - } - return this; - }; - /** - * start the release portion of the envelope - * @param {Time} [time=now] the time the release should start - * @returns {Tone.MonoSynth} this - * @private - */ - Tone.MonoSynth.prototype._triggerEnvelopeRelease = function (time) { - this.envelope.triggerRelease(time); - this.filterEnvelope.triggerRelease(time); - this.oscillator.stop(time + this.envelope.release); - return this; - }; - /** - * clean up - * @returns {Tone.MonoSynth} this - */ - Tone.MonoSynth.prototype.dispose = function () { - Tone.Monophonic.prototype.dispose.call(this); - this._writable([ - 'oscillator', - 'frequency', - 'detune', - 'filter', - 'filterEnvelope', - 'envelope' - ]); - this.oscillator.dispose(); - this.oscillator = null; - this.envelope.dispose(); - this.envelope = null; - this.filterEnvelope.dispose(); - this.filterEnvelope = null; - this.filter.dispose(); - this.filter = null; - this.frequency = null; - this.detune = null; - return this; - }; - return Tone.MonoSynth; - }); - Module(function (Tone) { - - /** - * @class Tone.DuoSynth is a monophonic synth composed of two - * MonoSynths run in parallel with control over the - * frequency ratio between the two voices and vibrato effect. - * <img src="https://docs.google.com/drawings/d/1bL4GXvfRMMlqS7XyBm9CjL9KJPSUKbcdBNpqOlkFLxk/pub?w=1012&h=448"> - * - * @constructor - * @extends {Tone.Monophonic} - * @param {Object} [options] the options available for the synth - * see defaults below - * @example - * var duoSynth = new Tone.DuoSynth().toMaster(); - * duoSynth.triggerAttackRelease("C4", "2n"); - */ - Tone.DuoSynth = function (options) { - options = Tone.defaultArg(options, Tone.DuoSynth.defaults); - Tone.Monophonic.call(this, options); - /** - * the first voice - * @type {Tone.MonoSynth} - */ - this.voice0 = new Tone.MonoSynth(options.voice0); - this.voice0.volume.value = -10; - /** - * the second voice - * @type {Tone.MonoSynth} - */ - this.voice1 = new Tone.MonoSynth(options.voice1); - this.voice1.volume.value = -10; - /** - * The vibrato LFO. - * @type {Tone.LFO} - * @private - */ - this._vibrato = new Tone.LFO(options.vibratoRate, -50, 50); - this._vibrato.start(); - /** - * the vibrato frequency - * @type {Frequency} - * @signal - */ - this.vibratoRate = this._vibrato.frequency; - /** - * the vibrato gain - * @type {Tone.Gain} - * @private - */ - this._vibratoGain = new Tone.Gain(options.vibratoAmount, Tone.Type.Positive); - /** - * The amount of vibrato - * @type {Positive} - * @signal - */ - this.vibratoAmount = this._vibratoGain.gain; - /** - * the frequency control - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(440, Tone.Type.Frequency); - /** - * Harmonicity is the ratio between the two voices. A harmonicity of - * 1 is no change. Harmonicity = 2 means a change of an octave. - * @type {Positive} - * @signal - * @example - * //pitch voice1 an octave below voice0 - * duoSynth.harmonicity.value = 0.5; - */ - this.harmonicity = new Tone.Multiply(options.harmonicity); - this.harmonicity.units = Tone.Type.Positive; - //control the two voices frequency - this.frequency.connect(this.voice0.frequency); - this.frequency.chain(this.harmonicity, this.voice1.frequency); - this._vibrato.connect(this._vibratoGain); - this._vibratoGain.fan(this.voice0.detune, this.voice1.detune); - this.voice0.connect(this.output); - this.voice1.connect(this.output); - this._readOnly([ - 'voice0', - 'voice1', - 'frequency', - 'vibratoAmount', - 'vibratoRate' - ]); - }; - Tone.extend(Tone.DuoSynth, Tone.Monophonic); - /** - * @static - * @type {Object} - */ - Tone.DuoSynth.defaults = { - 'vibratoAmount': 0.5, - 'vibratoRate': 5, - 'harmonicity': 1.5, - 'voice0': { - 'volume': -10, - 'portamento': 0, - 'oscillator': { 'type': 'sine' }, - 'filterEnvelope': { - 'attack': 0.01, - 'decay': 0, - 'sustain': 1, - 'release': 0.5 - }, - 'envelope': { - 'attack': 0.01, - 'decay': 0, - 'sustain': 1, - 'release': 0.5 - } - }, - 'voice1': { - 'volume': -10, - 'portamento': 0, - 'oscillator': { 'type': 'sine' }, - 'filterEnvelope': { - 'attack': 0.01, - 'decay': 0, - 'sustain': 1, - 'release': 0.5 - }, - 'envelope': { - 'attack': 0.01, - 'decay': 0, - 'sustain': 1, - 'release': 0.5 - } - } - }; - /** - * start the attack portion of the envelopes - * - * @param {Time} [time=now] the time the attack should start - * @param {NormalRange} [velocity=1] the velocity of the note (0-1) - * @returns {Tone.DuoSynth} this - * @private - */ - Tone.DuoSynth.prototype._triggerEnvelopeAttack = function (time, velocity) { - time = this.toSeconds(time); - this.voice0._triggerEnvelopeAttack(time, velocity); - this.voice1._triggerEnvelopeAttack(time, velocity); - return this; - }; - /** - * start the release portion of the envelopes - * - * @param {Time} [time=now] the time the release should start - * @returns {Tone.DuoSynth} this - * @private - */ - Tone.DuoSynth.prototype._triggerEnvelopeRelease = function (time) { - this.voice0._triggerEnvelopeRelease(time); - this.voice1._triggerEnvelopeRelease(time); - return this; - }; - /** - * Get the level of the output at the given time. Measures - * the envelope(s) value at the time. - * @param {Time} time The time to query the envelope value - * @return {NormalRange} The output level between 0-1 - */ - Tone.DuoSynth.prototype.getLevelAtTime = function (time) { - return (this.voice0.getLevelAtTime(time) + this.voice1.getLevelAtTime(time)) / 2; - }; - /** - * clean up - * @returns {Tone.DuoSynth} this - */ - Tone.DuoSynth.prototype.dispose = function () { - Tone.Monophonic.prototype.dispose.call(this); - this._writable([ - 'voice0', - 'voice1', - 'frequency', - 'vibratoAmount', - 'vibratoRate' - ]); - this.voice0.dispose(); - this.voice0 = null; - this.voice1.dispose(); - this.voice1 = null; - this.frequency.dispose(); - this.frequency = null; - this._vibratoGain.dispose(); - this._vibratoGain = null; - this._vibrato = null; - this.harmonicity.dispose(); - this.harmonicity = null; - this.vibratoAmount.dispose(); - this.vibratoAmount = null; - this.vibratoRate = null; - return this; - }; - return Tone.DuoSynth; - }); - Module(function (Tone) { - - /** - * @class FMSynth is composed of two Tone.Synths where one Tone.Synth modulates - * the frequency of a second Tone.Synth. A lot of spectral content - * can be explored using the modulationIndex parameter. Read more about - * frequency modulation synthesis on Sound On Sound: [Part 1](https://web.archive.org/web/20160403123704/http://www.soundonsound.com/sos/apr00/articles/synthsecrets.htm), [Part 2](https://web.archive.org/web/20160403115835/http://www.soundonsound.com/sos/may00/articles/synth.htm). - * <img src="https://docs.google.com/drawings/d/1h0PUDZXPgi4Ikx6bVT6oncrYPLluFKy7lj53puxj-DM/pub?w=902&h=462"> - * - * @constructor - * @extends {Tone.Monophonic} - * @param {Object} [options] the options available for the synth - * see defaults below - * @example - * var fmSynth = new Tone.FMSynth().toMaster(); - * fmSynth.triggerAttackRelease("C5", "4n"); - */ - Tone.FMSynth = function (options) { - options = Tone.defaultArg(options, Tone.FMSynth.defaults); - Tone.Monophonic.call(this, options); - /** - * The carrier voice. - * @type {Tone.Synth} - * @private - */ - this._carrier = new Tone.Synth(options.carrier); - this._carrier.volume.value = -10; - /** - * The carrier's oscillator - * @type {Tone.Oscillator} - */ - this.oscillator = this._carrier.oscillator; - /** - * The carrier's envelope - * @type {Tone.Oscillator} - */ - this.envelope = this._carrier.envelope.set(options.envelope); - /** - * The modulator voice. - * @type {Tone.Synth} - * @private - */ - this._modulator = new Tone.Synth(options.modulator); - this._modulator.volume.value = -10; - /** - * The modulator's oscillator which is applied - * to the amplitude of the oscillator - * @type {Tone.Oscillator} - */ - this.modulation = this._modulator.oscillator.set(options.modulation); - /** - * The modulator's envelope - * @type {Tone.Oscillator} - */ - this.modulationEnvelope = this._modulator.envelope.set(options.modulationEnvelope); - /** - * The frequency control. - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(440, Tone.Type.Frequency); - /** - * The detune in cents - * @type {Cents} - * @signal - */ - this.detune = new Tone.Signal(options.detune, Tone.Type.Cents); - /** - * Harmonicity is the ratio between the two voices. A harmonicity of - * 1 is no change. Harmonicity = 2 means a change of an octave. - * @type {Positive} - * @signal - * @example - * //pitch voice1 an octave below voice0 - * synth.harmonicity.value = 0.5; - */ - this.harmonicity = new Tone.Multiply(options.harmonicity); - this.harmonicity.units = Tone.Type.Positive; - /** - * The modulation index which essentially the depth or amount of the modulation. It is the - * ratio of the frequency of the modulating signal (mf) to the amplitude of the - * modulating signal (ma) -- as in ma/mf. - * @type {Positive} - * @signal - */ - this.modulationIndex = new Tone.Multiply(options.modulationIndex); - this.modulationIndex.units = Tone.Type.Positive; - /** - * the node where the modulation happens - * @type {GainNode} - * @private - */ - this._modulationNode = new Tone.Gain(0); - //control the two voices frequency - this.frequency.connect(this._carrier.frequency); - this.frequency.chain(this.harmonicity, this._modulator.frequency); - this.frequency.chain(this.modulationIndex, this._modulationNode); - this.detune.fan(this._carrier.detune, this._modulator.detune); - this._modulator.connect(this._modulationNode.gain); - this._modulationNode.connect(this._carrier.frequency); - this._carrier.connect(this.output); - this._readOnly([ - 'frequency', - 'harmonicity', - 'modulationIndex', - 'oscillator', - 'envelope', - 'modulation', - 'modulationEnvelope', - 'detune' - ]); - }; - Tone.extend(Tone.FMSynth, Tone.Monophonic); - /** - * @static - * @type {Object} - */ - Tone.FMSynth.defaults = { - 'harmonicity': 3, - 'modulationIndex': 10, - 'detune': 0, - 'oscillator': { 'type': 'sine' }, - 'envelope': { - 'attack': 0.01, - 'decay': 0.01, - 'sustain': 1, - 'release': 0.5 - }, - 'modulation': { 'type': 'square' }, - 'modulationEnvelope': { - 'attack': 0.5, - 'decay': 0, - 'sustain': 1, - 'release': 0.5 - } - }; - /** - * trigger the attack portion of the note - * - * @param {Time} [time=now] the time the note will occur - * @param {number} [velocity=1] the velocity of the note - * @returns {Tone.FMSynth} this - * @private - */ - Tone.FMSynth.prototype._triggerEnvelopeAttack = function (time, velocity) { - time = this.toSeconds(time); - //the envelopes - this._carrier._triggerEnvelopeAttack(time, velocity); - this._modulator._triggerEnvelopeAttack(time); - return this; - }; - /** - * trigger the release portion of the note - * - * @param {Time} [time=now] the time the note will release - * @returns {Tone.FMSynth} this - * @private - */ - Tone.FMSynth.prototype._triggerEnvelopeRelease = function (time) { - time = this.toSeconds(time); - this._carrier._triggerEnvelopeRelease(time); - this._modulator._triggerEnvelopeRelease(time); - return this; - }; - /** - * clean up - * @returns {Tone.FMSynth} this - */ - Tone.FMSynth.prototype.dispose = function () { - Tone.Monophonic.prototype.dispose.call(this); - this._writable([ - 'frequency', - 'harmonicity', - 'modulationIndex', - 'oscillator', - 'envelope', - 'modulation', - 'modulationEnvelope', - 'detune' - ]); - this._carrier.dispose(); - this._carrier = null; - this._modulator.dispose(); - this._modulator = null; - this.frequency.dispose(); - this.frequency = null; - this.detune.dispose(); - this.detune = null; - this.modulationIndex.dispose(); - this.modulationIndex = null; - this.harmonicity.dispose(); - this.harmonicity = null; - this._modulationNode.dispose(); - this._modulationNode = null; - this.oscillator = null; - this.envelope = null; - this.modulationEnvelope = null; - this.modulation = null; - return this; - }; - return Tone.FMSynth; - }); - Module(function (Tone) { - - /** - * @class Tone.MembraneSynth makes kick and tom sounds using a single oscillator - * with an amplitude envelope and frequency ramp. A Tone.OmniOscillator - * is routed through a Tone.AmplitudeEnvelope to the output. The drum - * quality of the sound comes from the frequency envelope applied - * during Tone.MembraneSynth.triggerAttack(note). The frequency envelope - * starts at <code>note * .octaves</code> and ramps to <code>note</code> - * over the duration of <code>.pitchDecay</code>. - * - * @constructor - * @extends {Tone.Instrument} - * @param {Object} [options] the options available for the synth - * see defaults below - * @example - * var synth = new Tone.MembraneSynth().toMaster(); - * synth.triggerAttackRelease("C2", "8n"); - */ - Tone.MembraneSynth = function (options) { - options = Tone.defaultArg(options, Tone.MembraneSynth.defaults); - Tone.Instrument.call(this, options); - /** - * The oscillator. - * @type {Tone.OmniOscillator} - */ - this.oscillator = new Tone.OmniOscillator(options.oscillator); - /** - * The amplitude envelope. - * @type {Tone.AmplitudeEnvelope} - */ - this.envelope = new Tone.AmplitudeEnvelope(options.envelope); - /** - * The number of octaves the pitch envelope ramps. - * @type {Positive} - */ - this.octaves = options.octaves; - /** - * The amount of time the frequency envelope takes. - * @type {Time} - */ - this.pitchDecay = options.pitchDecay; - this.oscillator.chain(this.envelope, this.output); - this._readOnly([ - 'oscillator', - 'envelope' - ]); - }; - Tone.extend(Tone.MembraneSynth, Tone.Instrument); - /** - * @static - * @type {Object} - */ - Tone.MembraneSynth.defaults = { - 'pitchDecay': 0.05, - 'octaves': 10, - 'oscillator': { 'type': 'sine' }, - 'envelope': { - 'attack': 0.001, - 'decay': 0.4, - 'sustain': 0.01, - 'release': 1.4, - 'attackCurve': 'exponential' - } - }; - /** - * Trigger the note at the given time with the given velocity. - * - * @param {Frequency} note the note - * @param {Time} [time=now] the time, if not given is now - * @param {number} [velocity=1] velocity defaults to 1 - * @returns {Tone.MembraneSynth} this - * @example - * kick.triggerAttack(60); - */ - Tone.MembraneSynth.prototype.triggerAttack = function (note, time, velocity) { - time = this.toSeconds(time); - note = this.toFrequency(note); - var maxNote = note * this.octaves; - this.oscillator.frequency.setValueAtTime(maxNote, time); - this.oscillator.frequency.exponentialRampToValueAtTime(note, time + this.toSeconds(this.pitchDecay)); - this.envelope.triggerAttack(time, velocity); - this.oscillator.start(time); - return this; - }; - /** - * Trigger the release portion of the note. - * - * @param {Time} [time=now] the time the note will release - * @returns {Tone.MembraneSynth} this - */ - Tone.MembraneSynth.prototype.triggerRelease = function (time) { - time = this.toSeconds(time); - this.envelope.triggerRelease(time); - this.oscillator.stop(time + this.envelope.release); - return this; - }; - /** - * Clean up. - * @returns {Tone.MembraneSynth} this - */ - Tone.MembraneSynth.prototype.dispose = function () { - Tone.Instrument.prototype.dispose.call(this); - this._writable([ - 'oscillator', - 'envelope' - ]); - this.oscillator.dispose(); - this.oscillator = null; - this.envelope.dispose(); - this.envelope = null; - return this; - }; - return Tone.MembraneSynth; - }); - Module(function (Tone) { - /** - * Inharmonic ratio of frequencies based on the Roland TR-808 - * Taken from https://ccrma.stanford.edu/papers/tr-808-cymbal-physically-informed-circuit-bendable-digital-model - * @private - * @static - * @type {Array} - */ - var inharmRatios = [ - 1, - 1.483, - 1.932, - 2.546, - 2.63, - 3.897 - ]; - /** - * @class A highly inharmonic and spectrally complex source with a highpass filter - * and amplitude envelope which is good for making metalophone sounds. Based - * on CymbalSynth by [@polyrhythmatic](https://github.com/polyrhythmatic). - * Inspiration from [Sound on Sound](https://web.archive.org/web/20160610143924/https://www.soundonsound.com/sos/jul02/articles/synthsecrets0702.asp). - * - * @constructor - * @extends {Tone.Instrument} - * @param {Object} [options] The options availble for the synth - * see defaults below - */ - Tone.MetalSynth = function (options) { - options = Tone.defaultArg(options, Tone.MetalSynth.defaults); - Tone.Instrument.call(this, options); - /** - * The frequency of the cymbal - * @type {Frequency} - * @signal - */ - this.frequency = new Tone.Signal(options.frequency, Tone.Type.Frequency); - /** - * The array of FMOscillators - * @type {Array} - * @private - */ - this._oscillators = []; - /** - * The frequency multipliers - * @type {Array} - * @private - */ - this._freqMultipliers = []; - /** - * The amplitude for the body - * @type {Tone.Gain} - * @private - */ - this._amplitue = new Tone.Gain(0).connect(this.output); - /** - * highpass the output - * @type {Tone.Filter} - * @private - */ - this._highpass = new Tone.Filter({ - 'type': 'highpass', - 'Q': -3.0102999566398125 - }).connect(this._amplitue); - /** - * The number of octaves the highpass - * filter frequency ramps - * @type {Number} - * @private - */ - this._octaves = options.octaves; - /** - * Scale the body envelope - * for the bandpass - * @type {Tone.Scale} - * @private - */ - this._filterFreqScaler = new Tone.Scale(options.resonance, 7000); - /** - * The envelope which is connected both to the - * amplitude and highpass filter's cutoff frequency - * @type {Tone.Envelope} - */ - this.envelope = new Tone.Envelope({ - 'attack': options.envelope.attack, - 'attackCurve': 'linear', - 'decay': options.envelope.decay, - 'sustain': 0, - 'release': options.envelope.release - }).chain(this._filterFreqScaler, this._highpass.frequency); - this.envelope.connect(this._amplitue.gain); - for (var i = 0; i < inharmRatios.length; i++) { - var osc = new Tone.FMOscillator({ - 'type': 'square', - 'modulationType': 'square', - 'harmonicity': options.harmonicity, - 'modulationIndex': options.modulationIndex - }); - osc.connect(this._highpass); - this._oscillators[i] = osc; - var mult = new Tone.Multiply(inharmRatios[i]); - this._freqMultipliers[i] = mult; - this.frequency.chain(mult, osc.frequency); - } - //set the octaves - this.octaves = options.octaves; - }; - Tone.extend(Tone.MetalSynth, Tone.Instrument); - /** - * default values - * @static - * @const - * @type {Object} - */ - Tone.MetalSynth.defaults = { - 'frequency': 200, - 'envelope': { - 'attack': 0.001, - 'decay': 1.4, - 'release': 0.2 - }, - 'harmonicity': 5.1, - 'modulationIndex': 32, - 'resonance': 4000, - 'octaves': 1.5 - }; - /** - * Trigger the attack. - * @param {Time} time When the attack should be triggered. - * @param {NormalRange} [velocity=1] The velocity that the envelope should be triggered at. - * @return {Tone.MetalSynth} this - */ - Tone.MetalSynth.prototype.triggerAttack = function (time, vel) { - time = this.toSeconds(time); - vel = Tone.defaultArg(vel, 1); - this.envelope.triggerAttack(time, vel); - this._oscillators.forEach(function (osc) { - osc.start(time); - }); - //if the sustain is 0, stop the oscillator as well - if (this.envelope.sustain === 0) { - this._oscillators.forEach(function (osc) { - osc.stop(time + this.envelope.attack + this.envelope.decay); - }.bind(this)); - } - return this; - }; - /** - * Trigger the release of the envelope. - * @param {Time} time When the release should be triggered. - * @return {Tone.MetalSynth} this - */ - Tone.MetalSynth.prototype.triggerRelease = function (time) { - time = this.toSeconds(time); - this.envelope.triggerRelease(time); - this._oscillators.forEach(function (osc) { - osc.stop(time + this.envelope.release); - }.bind(this)); - return this; - }; - /** - * Sync the instrument to the Transport. All subsequent calls of - * [triggerAttack](#triggerattack) and [triggerRelease](#triggerrelease) - * will be scheduled along the transport. - * @example - * synth.sync() - * //schedule 3 notes when the transport first starts - * synth.triggerAttackRelease('8n', 0) - * synth.triggerAttackRelease('8n', '8n') - * synth.triggerAttackRelease('8n', '4n') - * //start the transport to hear the notes - * Transport.start() - * @returns {Tone.Instrument} this - */ - Tone.MetalSynth.prototype.sync = function () { - this._syncMethod('triggerAttack', 0); - this._syncMethod('triggerRelease', 0); - return this; - }; - /** - * Trigger the attack and release of the envelope after the given - * duration. - * @param {Time} duration The duration before triggering the release - * @param {Time} time When the attack should be triggered. - * @param {NormalRange} [velocity=1] The velocity that the envelope should be triggered at. - * @return {Tone.MetalSynth} this - */ - Tone.MetalSynth.prototype.triggerAttackRelease = function (duration, time, velocity) { - time = this.toSeconds(time); - duration = this.toSeconds(duration); - this.triggerAttack(time, velocity); - this.triggerRelease(time + duration); - return this; - }; - /** - * The modulationIndex of the oscillators which make up the source. - * see Tone.FMOscillator.modulationIndex - * @memberOf Tone.MetalSynth# - * @type {Positive} - * @name modulationIndex - */ - Object.defineProperty(Tone.MetalSynth.prototype, 'modulationIndex', { - get: function () { - return this._oscillators[0].modulationIndex.value; - }, - set: function (val) { - for (var i = 0; i < this._oscillators.length; i++) { - this._oscillators[i].modulationIndex.value = val; - } - } - }); - /** - * The harmonicity of the oscillators which make up the source. - * see Tone.FMOscillator.harmonicity - * @memberOf Tone.MetalSynth# - * @type {Positive} - * @name harmonicity - */ - Object.defineProperty(Tone.MetalSynth.prototype, 'harmonicity', { - get: function () { - return this._oscillators[0].harmonicity.value; - }, - set: function (val) { - for (var i = 0; i < this._oscillators.length; i++) { - this._oscillators[i].harmonicity.value = val; - } - } - }); - /** - * The frequency of the highpass filter attached to the envelope - * @memberOf Tone.MetalSynth# - * @type {Frequency} - * @name resonance - */ - Object.defineProperty(Tone.MetalSynth.prototype, 'resonance', { - get: function () { - return this._filterFreqScaler.min; - }, - set: function (val) { - this._filterFreqScaler.min = val; - this.octaves = this._octaves; - } - }); - /** - * The number of octaves above the "resonance" frequency - * that the filter ramps during the attack/decay envelope - * @memberOf Tone.MetalSynth# - * @type {Number} - * @name octaves - */ - Object.defineProperty(Tone.MetalSynth.prototype, 'octaves', { - get: function () { - return this._octaves; - }, - set: function (octs) { - this._octaves = octs; - this._filterFreqScaler.max = this._filterFreqScaler.min * Math.pow(2, octs); - } - }); - /** - * Clean up - * @returns {Tone.MetalSynth} this - */ - Tone.MetalSynth.prototype.dispose = function () { - Tone.Instrument.prototype.dispose.call(this); - for (var i = 0; i < this._oscillators.length; i++) { - this._oscillators[i].dispose(); - this._freqMultipliers[i].dispose(); - } - this._oscillators = null; - this._freqMultipliers = null; - this.frequency.dispose(); - this.frequency = null; - this._filterFreqScaler.dispose(); - this._filterFreqScaler = null; - this._amplitue.dispose(); - this._amplitue = null; - this.envelope.dispose(); - this.envelope = null; - this._highpass.dispose(); - this._highpass = null; - }; - return Tone.MetalSynth; - }); - Module(function (Tone) { - - /** - * @class Tone.NoiseSynth is composed of a noise generator (Tone.Noise), one filter (Tone.Filter), - * and two envelopes (Tone.Envelop). One envelope controls the amplitude - * of the noise and the other is controls the cutoff frequency of the filter. - * <img src="https://docs.google.com/drawings/d/1rqzuX9rBlhT50MRvD2TKml9bnZhcZmzXF1rf_o7vdnE/pub?w=918&h=242"> - * - * @constructor - * @extends {Tone.Instrument} - * @param {Object} [options] the options available for the synth - * see defaults below - * @example - * var noiseSynth = new Tone.NoiseSynth().toMaster(); - * noiseSynth.triggerAttackRelease("8n"); - */ - Tone.NoiseSynth = function (options) { - //get the defaults - options = Tone.defaultArg(options, Tone.NoiseSynth.defaults); - Tone.Instrument.call(this, options); - /** - * The noise source. - * @type {Tone.Noise} - * @example - * noiseSynth.set("noise.type", "brown"); - */ - this.noise = new Tone.Noise(); - /** - * The amplitude envelope. - * @type {Tone.AmplitudeEnvelope} - */ - this.envelope = new Tone.AmplitudeEnvelope(options.envelope); - //connect the noise to the output - this.noise.chain(this.envelope, this.output); - this._readOnly([ - 'noise', - 'envelope' - ]); - }; - Tone.extend(Tone.NoiseSynth, Tone.Instrument); - /** - * @const - * @static - * @type {Object} - */ - Tone.NoiseSynth.defaults = { - 'noise': { 'type': 'white' }, - 'envelope': { - 'attack': 0.005, - 'decay': 0.1, - 'sustain': 0 - } - }; - /** - * Start the attack portion of the envelopes. Unlike other - * instruments, Tone.NoiseSynth doesn't have a note. - * @param {Time} [time=now] the time the attack should start - * @param {number} [velocity=1] the velocity of the note (0-1) - * @returns {Tone.NoiseSynth} this - * @example - * noiseSynth.triggerAttack(); - */ - Tone.NoiseSynth.prototype.triggerAttack = function (time, velocity) { - //the envelopes - this.envelope.triggerAttack(time, velocity); - //start the noise - this.noise.start(time); - if (this.envelope.sustain === 0) { - this.noise.stop(time = this.envelope.attack + this.envelope.decay); - } - return this; - }; - /** - * Start the release portion of the envelopes. - * @param {Time} [time=now] the time the release should start - * @returns {Tone.NoiseSynth} this - */ - Tone.NoiseSynth.prototype.triggerRelease = function (time) { - this.envelope.triggerRelease(time); - this.noise.stop(time + this.envelope.release); - return this; - }; - /** - * Sync the instrument to the Transport. All subsequent calls of - * [triggerAttack](#triggerattack) and [triggerRelease](#triggerrelease) - * will be scheduled along the transport. - * @example - * synth.sync() - * //schedule 3 notes when the transport first starts - * synth.triggerAttackRelease('8n', 0) - * synth.triggerAttackRelease('8n', '8n') - * synth.triggerAttackRelease('8n', '4n') - * //start the transport to hear the notes - * Transport.start() - * @returns {Tone.Instrument} this - */ - Tone.NoiseSynth.prototype.sync = function () { - this._syncMethod('triggerAttack', 0); - this._syncMethod('triggerRelease', 0); - return this; - }; - /** - * Trigger the attack and then the release. - * @param {Time} duration the duration of the note - * @param {Time} [time=now] the time of the attack - * @param {number} [velocity=1] the velocity - * @returns {Tone.NoiseSynth} this - */ - Tone.NoiseSynth.prototype.triggerAttackRelease = function (duration, time, velocity) { - time = this.toSeconds(time); - duration = this.toSeconds(duration); - this.triggerAttack(time, velocity); - this.triggerRelease(time + duration); - return this; - }; - /** - * Clean up. - * @returns {Tone.NoiseSynth} this - */ - Tone.NoiseSynth.prototype.dispose = function () { - Tone.Instrument.prototype.dispose.call(this); - this._writable([ - 'noise', - 'envelope' - ]); - this.noise.dispose(); - this.noise = null; - this.envelope.dispose(); - this.envelope = null; - return this; - }; - return Tone.NoiseSynth; - }); - Module(function (Tone) { - - /** - * @class Karplus-String string synthesis. Often out of tune. - * Will change when the AudioWorkerNode is available across - * browsers. - * - * @constructor - * @extends {Tone.Instrument} - * @param {Object} [options] see the defaults - * @example - * var plucky = new Tone.PluckSynth().toMaster(); - * plucky.triggerAttack("C4"); - */ - Tone.PluckSynth = function (options) { - options = Tone.defaultArg(options, Tone.PluckSynth.defaults); - Tone.Instrument.call(this, options); - /** - * @type {Tone.Noise} - * @private - */ - this._noise = new Tone.Noise('pink'); - /** - * The amount of noise at the attack. - * Nominal range of [0.1, 20] - * @type {number} - */ - this.attackNoise = options.attackNoise; - /** - * the LFCF - * @type {Tone.LowpassCombFilter} - * @private - */ - this._lfcf = new Tone.LowpassCombFilter({ - 'resonance': options.resonance, - 'dampening': options.dampening - }); - /** - * The resonance control. - * @type {NormalRange} - * @signal - */ - this.resonance = this._lfcf.resonance; - /** - * The dampening control. i.e. the lowpass filter frequency of the comb filter - * @type {Frequency} - * @signal - */ - this.dampening = this._lfcf.dampening; - //connections - this._noise.connect(this._lfcf); - this._lfcf.connect(this.output); - this._readOnly([ - 'resonance', - 'dampening' - ]); - }; - Tone.extend(Tone.PluckSynth, Tone.Instrument); - /** - * @static - * @const - * @type {Object} - */ - Tone.PluckSynth.defaults = { - 'attackNoise': 1, - 'dampening': 4000, - 'resonance': 0.7 - }; - /** - * Trigger the note. - * @param {Frequency} note The note to trigger. - * @param {Time} [time=now] When the note should be triggered. - * @returns {Tone.PluckSynth} this - */ - Tone.PluckSynth.prototype.triggerAttack = function (note, time) { - note = this.toFrequency(note); - time = this.toSeconds(time); - var delayAmount = 1 / note; - this._lfcf.delayTime.setValueAtTime(delayAmount, time); - this._noise.start(time); - this._noise.stop(time + delayAmount * this.attackNoise); - return this; - }; - /** - * Clean up. - * @returns {Tone.PluckSynth} this - */ - Tone.PluckSynth.prototype.dispose = function () { - Tone.Instrument.prototype.dispose.call(this); - this._noise.dispose(); - this._lfcf.dispose(); - this._noise = null; - this._lfcf = null; - this._writable([ - 'resonance', - 'dampening' - ]); - this.dampening = null; - this.resonance = null; - return this; - }; - return Tone.PluckSynth; - }); - Module(function (Tone) { - - /** - * @class Tone.PolySynth handles voice creation and allocation for any - * instruments passed in as the second paramter. PolySynth is - * not a synthesizer by itself, it merely manages voices of - * one of the other types of synths, allowing any of the - * monophonic synthesizers to be polyphonic. - * - * @constructor - * @extends {Tone.Instrument} - * @param {number|Object} [polyphony=4] The number of voices to create - * @param {function} [voice=Tone.Synth] The constructor of the voices - * uses Tone.Synth by default. - * @example - * //a polysynth composed of 6 Voices of Synth - * var synth = new Tone.PolySynth(6, Tone.Synth).toMaster(); - * //set the attributes using the set interface - * synth.set("detune", -1200); - * //play a chord - * synth.triggerAttackRelease(["C4", "E4", "A4"], "4n"); - */ - Tone.PolySynth = function () { - var options = Tone.defaults(arguments, [ - 'polyphony', - 'voice' - ], Tone.PolySynth); - Tone.Instrument.call(this, options); - options = Tone.defaultArg(options, Tone.Instrument.defaults); - //max polyphony - options.polyphony = Math.min(Tone.PolySynth.MAX_POLYPHONY, options.polyphony); - /** - * the array of voices - * @type {Array} - */ - this.voices = new Array(options.polyphony); - /** - * The queue of voices with data about last trigger - * and the triggered note - * @private - * @type {Array} - */ - this._triggers = new Array(options.polyphony); - /** - * The detune in cents - * @type {Cents} - * @signal - */ - this.detune = new Tone.Signal(options.detune, Tone.Type.Cents); - this._readOnly('detune'); - //create the voices - for (var i = 0; i < options.polyphony; i++) { - var v = new options.voice(arguments[2], arguments[3]); - if (!(v instanceof Tone.Monophonic)) { - throw new Error('Synth constructor must be instance of Tone.Monophonic'); - } - this.voices[i] = v; - v.connect(this.output); - if (v.hasOwnProperty('detune')) { - this.detune.connect(v.detune); - } - this._triggers[i] = { - release: -1, - note: null, - voice: v - }; - } - }; - Tone.extend(Tone.PolySynth, Tone.Instrument); - /** - * the defaults - * @const - * @static - * @type {Object} - */ - Tone.PolySynth.defaults = { - 'polyphony': 4, - 'volume': 0, - 'detune': 0, - 'voice': Tone.Synth - }; - /** - * Trigger the attack portion of the note - * @param {Frequency|Array} notes The notes to play. Accepts a single - * Frequency or an array of frequencies. - * @param {Time} [time=now] The start time of the note. - * @param {number} [velocity=1] The velocity of the note. - * @returns {Tone.PolySynth} this - * @example - * //trigger a chord immediately with a velocity of 0.2 - * poly.triggerAttack(["Ab3", "C4", "F5"], undefined, 0.2); - */ - Tone.PolySynth.prototype.triggerAttack = function (notes, time, velocity) { - if (!Array.isArray(notes)) { - notes = [notes]; - } - time = this.toSeconds(time); - for (var i = 0; i < notes.length; i++) { - var val = notes[i]; - //trigger the oldest voice - var oldest = this._triggers[0]; - for (var j = 1; j < this._triggers.length; j++) { - if (this._triggers[j].release < oldest.release) { - oldest = this._triggers[j]; - } - } - oldest.release = Infinity; - oldest.note = JSON.stringify(val); - oldest.voice.triggerAttack(val, time, velocity); - } - return this; - }; - /** - * Trigger the attack and release after the specified duration - * - * @param {Frequency|Array} notes The notes to play. Accepts a single - * Frequency or an array of frequencies. - * @param {Time} duration the duration of the note - * @param {Time} [time=now] if no time is given, defaults to now - * @param {number} [velocity=1] the velocity of the attack (0-1) - * @returns {Tone.PolySynth} this - * @example - * //trigger a chord for a duration of a half note - * poly.triggerAttackRelease(["Eb3", "G4", "C5"], "2n"); - * @example - * //can pass in an array of durations as well - * poly.triggerAttackRelease(["Eb3", "G4", "C5"], ["2n", "4n", "4n"]); - */ - Tone.PolySynth.prototype.triggerAttackRelease = function (notes, duration, time, velocity) { - time = this.toSeconds(time); - this.triggerAttack(notes, time, velocity); - if (Tone.isArray(duration) && Tone.isArray(notes)) { - for (var i = 0; i < notes.length; i++) { - var d = duration[Math.min(i, duration.length - 1)]; - this.triggerRelease(notes[i], time + this.toSeconds(d)); - } - } else { - this.triggerRelease(notes, time + this.toSeconds(duration)); - } - return this; - }; - /** - * Trigger the release of the note. Unlike monophonic instruments, - * a note (or array of notes) needs to be passed in as the first argument. - * @param {Frequency|Array} notes The notes to play. Accepts a single - * Frequency or an array of frequencies. - * @param {Time} [time=now] When the release will be triggered. - * @returns {Tone.PolySynth} this - * @example - * poly.triggerRelease(["Ab3", "C4", "F5"], "+2n"); - */ - Tone.PolySynth.prototype.triggerRelease = function (notes, time) { - if (!Array.isArray(notes)) { - notes = [notes]; - } - time = this.toSeconds(time); - for (var i = 0; i < notes.length; i++) { - //get the voice - var stringified = JSON.stringify(notes[i]); - for (var v = 0; v < this._triggers.length; v++) { - var desc = this._triggers[v]; - if (desc.note === stringified && desc.release > time) { - desc.voice.triggerRelease(time); - desc.release = time; - } - } - } - return this; - }; - /** - * Sync the instrument to the Transport. All subsequent calls of - * [triggerAttack](#triggerattack) and [triggerRelease](#triggerrelease) - * will be scheduled along the transport. - * @example - * synth.sync() - * //schedule 3 notes when the transport first starts - * synth.triggerAttackRelease('8n', 0) - * synth.triggerAttackRelease('8n', '8n') - * synth.triggerAttackRelease('8n', '4n') - * //start the transport to hear the notes - * Transport.start() - * @returns {Tone.Instrument} this - */ - Tone.PolySynth.prototype.sync = function () { - this._syncMethod('triggerAttack', 1); - this._syncMethod('triggerRelease', 1); - return this; - }; - /** - * Set a member/attribute of the voices. - * @param {Object|string} params - * @param {number=} value - * @param {Time=} rampTime - * @returns {Tone.PolySynth} this - * @example - * poly.set({ - * "filter" : { - * "type" : "highpass" - * }, - * "envelope" : { - * "attack" : 0.25 - * } - * }); - */ - Tone.PolySynth.prototype.set = function (params, value, rampTime) { - for (var i = 0; i < this.voices.length; i++) { - this.voices[i].set(params, value, rampTime); - } - return this; - }; - /** - * Get the synth's attributes. Given no arguments get - * will return all available object properties and their corresponding - * values. Pass in a single attribute to retrieve or an array - * of attributes. The attribute strings can also include a "." - * to access deeper properties. - * @param {Array=} params the parameters to get, otherwise will return - * all available. - */ - Tone.PolySynth.prototype.get = function (params) { - return this.voices[0].get(params); - }; - /** - * Trigger the release portion of all the currently active voices. - * @param {Time} [time=now] When the notes should be released. - * @return {Tone.PolySynth} this - */ - Tone.PolySynth.prototype.releaseAll = function (time) { - time = this.toSeconds(time); - for (var i = 0; i < this._triggers.length; i++) { - var desc = this._triggers[i]; - if (desc.release > time) { - desc.release = time; - desc.voice.triggerRelease(time); - } - } - return this; - }; - /** - * Clean up. - * @returns {Tone.PolySynth} this - */ - Tone.PolySynth.prototype.dispose = function () { - Tone.Instrument.prototype.dispose.call(this); - for (var i = 0; i < this.voices.length; i++) { - this.voices[i].dispose(); - this.voices[i] = null; - } - this._writable('detune'); - this.detune.dispose(); - this.detune = null; - this.voices = null; - this._triggers = null; - return this; - }; - /** - * The maximum number of notes that can be allocated - * to a polysynth. - * @type {Number} - * @static - */ - Tone.PolySynth.MAX_POLYPHONY = 20; - return Tone.PolySynth; - }); - Module(function (Tone) { - /** - * @class Automatically interpolates between a set of pitched samples. Pass in an object which maps the note's pitch or midi value to the url, then you can trigger the attack and release of that note like other instruments. By automatically repitching the samples, it is possible to play pitches which were not explicitly included which can save loading time. - * For sample or buffer playback where repitching is not necessary, use [Tone.Player](https://tonejs.github.io/docs/Player). - * @param {Object} samples An object of samples mapping either Midi - * Note Numbers or Scientific Pitch Notation - * to the url of that sample. - * @param {Function=} onload The callback to invoke when all of the samples are loaded. - * @param {String=} baseUrl The root URL of all of the samples, which is prepended to all the URLs. - * @example - * var sampler = new Tone.Sampler({ - * "C3" : "path/to/C3.mp3", - * "D#3" : "path/to/Dsharp3.mp3", - * "F#3" : "path/to/Fsharp3.mp3", - * "A3" : "path/to/A3.mp3", - * }, function(){ - * //sampler will repitch the closest sample - * sampler.triggerAttack("D3") - * }) - * @extends {Tone.Instrument} - */ - Tone.Sampler = function (urls) { - // shift arguments over one. Those are the remainder of the options - var args = Array.prototype.slice.call(arguments); - args.shift(); - var options = Tone.defaults(args, [ - 'onload', - 'baseUrl' - ], Tone.Sampler); - Tone.Instrument.call(this, options); - var urlMap = {}; - for (var note in urls) { - if (Tone.isNote(note)) { - //convert the note name to MIDI - var mid = Tone.Frequency(note).toMidi(); - urlMap[mid] = urls[note]; - } else if (!isNaN(parseFloat(note))) { - //otherwise if it's numbers assume it's midi - urlMap[note] = urls[note]; - } else { - throw new Error('Tone.Sampler: url keys must be the note\'s pitch'); - } - } - /** - * The stored and loaded buffers - * @type {Tone.Buffers} - * @private - */ - this._buffers = new Tone.Buffers(urlMap, options.onload, options.baseUrl); - /** - * The object of all currently playing BufferSources - * @type {Object} - * @private - */ - this._activeSources = {}; - /** - * The envelope applied to the beginning of the sample. - * @type {Time} - */ - this.attack = options.attack; - /** - * The envelope applied to the end of the envelope. - * @type {Time} - */ - this.release = options.release; - }; - Tone.extend(Tone.Sampler, Tone.Instrument); - /** - * The defaults - * @const - * @type {Object} - */ - Tone.Sampler.defaults = { - attack: 0, - release: 0.1, - onload: Tone.noOp, - baseUrl: '' - }; - /** - * Returns the difference in steps between the given midi note at the closets sample. - * @param {Midi} midi - * @return {Interval} - * @private - */ - Tone.Sampler.prototype._findClosest = function (midi) { - //searches within 8 octaves of the given midi note - var MAX_INTERVAL = 96; - var interval = 0; - while (interval < MAX_INTERVAL) { - // check above and below - if (this._buffers.has(midi + interval)) { - return -interval; - } else if (this._buffers.has(midi - interval)) { - return interval; - } - interval++; - } - return null; - }; - /** - * @param {Frequency} note The note to play - * @param {Time=} time When to play the note - * @param {NormalRange=} velocity The velocity to play the sample back. - * @return {Tone.Sampler} this - */ - Tone.Sampler.prototype.triggerAttack = function (note, time, velocity) { - var midi = Tone.Frequency(note).toMidi(); - // find the closest note pitch - var difference = this._findClosest(midi); - if (difference !== null) { - var closestNote = midi - difference; - var buffer = this._buffers.get(closestNote); - // play that note - var source = new Tone.BufferSource({ - 'buffer': buffer, - 'playbackRate': Tone.intervalToFrequencyRatio(difference), - 'fadeIn': this.attack, - 'fadeOut': this.release, - 'curve': 'exponential' - }).connect(this.output); - source.start(time, 0, buffer.duration, velocity); - // add it to the active sources - if (!Tone.isArray(this._activeSources[midi])) { - this._activeSources[midi] = []; - } - this._activeSources[midi].push({ - note: midi, - source: source - }); - } - return this; - }; - /** - * @param {Frequency} note The note to release. - * @param {Time=} time When to release the note. - * @return {Tone.Sampler} this - */ - Tone.Sampler.prototype.triggerRelease = function (note, time) { - var midi = Tone.Frequency(note).toMidi(); - // find the note - if (this._activeSources[midi] && this._activeSources[midi].length) { - var source = this._activeSources[midi].shift().source; - time = this.toSeconds(time); - source.stop(time + this.release, this.release); - } - return this; - }; - /** - * Release all currently active notes. - * @param {Time=} time When to release the notes. - * @return {Tone.Sampler} this - */ - Tone.Sampler.prototype.releaseAll = function (time) { - time = this.toSeconds(time); - for (var note in this._activeSources) { - var sources = this._activeSources[note]; - while (sources.length) { - var source = sources.shift().source; - source.stop(time + this.release, this.release); - } - } - return this; - }; - /** - * Sync the instrument to the Transport. All subsequent calls of - * [triggerAttack](#triggerattack) and [triggerRelease](#triggerrelease) - * will be scheduled along the transport. - * @example - * synth.sync() - * //schedule 3 notes when the transport first starts - * synth.triggerAttackRelease('8n', 0) - * synth.triggerAttackRelease('8n', '8n') - * synth.triggerAttackRelease('8n', '4n') - * //start the transport to hear the notes - * Transport.start() - * @returns {Tone.Instrument} this - */ - Tone.Sampler.prototype.sync = function () { - this._syncMethod('triggerAttack', 1); - this._syncMethod('triggerRelease', 1); - return this; - }; - /** - * Invoke the attack phase, then after the duration, invoke the release. - * @param {Frequency} note The note to play - * @param {Time} duration The time the note should be held - * @param {Time=} time When to start the attack - * @param {NormalRange} [velocity=1] The velocity of the attack - * @return {Tone.Sampler} this - */ - Tone.Sampler.prototype.triggerAttackRelease = function (note, duration, time, velocity) { - time = this.toSeconds(time); - duration = this.toSeconds(duration); - this.triggerAttack(note, time, velocity); - this.triggerRelease(note, time + duration); - return this; - }; - /** - * Add a note to the sampler. - * @param {Note|Midi} note The buffer's pitch. - * @param {String|Tone.Buffer|Audiobuffer} url Either the url of the bufer, - * or a buffer which will be added - * with the given name. - * @param {Function=} callback The callback to invoke - * when the url is loaded. - */ - Tone.Sampler.prototype.add = function (note, url, callback) { - if (Tone.isNote(note)) { - //convert the note name to MIDI - var mid = Tone.Frequency(note).toMidi(); - this._buffers.add(mid, url, callback); - } else if (!isNaN(parseFloat(note))) { - //otherwise if it's numbers assume it's midi - this._buffers.add(note, url, callback); - } else { - throw new Error('Tone.Sampler: note must be the note\'s pitch. Instead got ' + note); - } - }; - /** - * If the buffers are loaded or not - * @memberOf Tone.Sampler# - * @type {Boolean} - * @name loaded - * @readOnly - */ - Object.defineProperty(Tone.Sampler.prototype, 'loaded', { - get: function () { - return this._buffers.loaded; - } - }); - /** - * Clean up - * @return {Tone.Sampler} this - */ - Tone.Sampler.prototype.dispose = function () { - Tone.Instrument.prototype.dispose.call(this); - this._buffers.dispose(); - this._buffers = null; - for (var midi in this._activeSources) { - this._activeSources[midi].forEach(function (event) { - event.source.dispose(); - }); - } - this._activeSources = null; - return this; - }; - return Tone.Sampler; - }); - Module(function (Tone) { - if (Tone.supported) { - if (!OscillatorNode.prototype.setPeriodicWave) { - OscillatorNode.prototype.setPeriodicWave = OscillatorNode.prototype.setWaveTable; - } - if (!AudioContext.prototype.createPeriodicWave) { - AudioContext.prototype.createPeriodicWave = AudioContext.prototype.createWaveTable; - } - } - }); - Module(function (Tone) { - - /** - * @class Maps a NormalRange [0, 1] to an AudioRange [-1, 1]. - * See also Tone.AudioToGain. - * - * @extends {Tone.SignalBase} - * @constructor - * @example - * var g2a = new Tone.GainToAudio(); - */ - Tone.GainToAudio = function () { - Tone.SignalBase.call(this); - /** - * @type {WaveShaperNode} - * @private - */ - this._norm = this.input = this.output = new Tone.WaveShaper(function (x) { - return Math.abs(x) * 2 - 1; - }); - }; - Tone.extend(Tone.GainToAudio, Tone.SignalBase); - /** - * clean up - * @returns {Tone.GainToAudio} this - */ - Tone.GainToAudio.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._norm.dispose(); - this._norm = null; - return this; - }; - return Tone.GainToAudio; - }); - Module(function (Tone) { - - /** - * @class Normalize takes an input min and max and maps it linearly to NormalRange [0,1] - * - * @extends {Tone.SignalBase} - * @constructor - * @param {number} inputMin the min input value - * @param {number} inputMax the max input value - * @example - * var norm = new Tone.Normalize(2, 4); - * var sig = new Tone.Signal(3).connect(norm); - * //output of norm is 0.5. - */ - Tone.Normalize = function (inputMin, inputMax) { - Tone.SignalBase.call(this); - /** - * the min input value - * @type {number} - * @private - */ - this._inputMin = Tone.defaultArg(inputMin, 0); - /** - * the max input value - * @type {number} - * @private - */ - this._inputMax = Tone.defaultArg(inputMax, 1); - /** - * subtract the min from the input - * @type {Tone.Add} - * @private - */ - this._sub = this.input = new Tone.Add(0); - /** - * divide by the difference between the input and output - * @type {Tone.Multiply} - * @private - */ - this._div = this.output = new Tone.Multiply(1); - this._sub.connect(this._div); - this._setRange(); - }; - Tone.extend(Tone.Normalize, Tone.SignalBase); - /** - * The minimum value the input signal will reach. - * @memberOf Tone.Normalize# - * @type {number} - * @name min - */ - Object.defineProperty(Tone.Normalize.prototype, 'min', { - get: function () { - return this._inputMin; - }, - set: function (min) { - this._inputMin = min; - this._setRange(); - } - }); - /** - * The maximum value the input signal will reach. - * @memberOf Tone.Normalize# - * @type {number} - * @name max - */ - Object.defineProperty(Tone.Normalize.prototype, 'max', { - get: function () { - return this._inputMax; - }, - set: function (max) { - this._inputMax = max; - this._setRange(); - } - }); - /** - * set the values - * @private - */ - Tone.Normalize.prototype._setRange = function () { - this._sub.value = -this._inputMin; - this._div.value = 1 / (this._inputMax - this._inputMin); - }; - /** - * clean up - * @returns {Tone.Normalize} this - */ - Tone.Normalize.prototype.dispose = function () { - Tone.SignalBase.prototype.dispose.call(this); - this._sub.dispose(); - this._sub = null; - this._div.dispose(); - this._div = null; - return this; - }; - return Tone.Normalize; - }); - Module(function (Tone) { - /** - * @class Tone.TransportTimelineSignal extends Tone.Signal, but adds the ability to synchronize the signal to the signal to the Tone.Transport - * @extends {Tone.Signal} - */ - Tone.TransportTimelineSignal = function () { - Tone.Signal.apply(this, arguments); - /** - * The real signal output - * @type {Tone.Signal} - * @private - */ - this.output = this._outputSig = new Tone.Signal(this._initialValue); - /** - * Keep track of the last value. (small optimization) - * @private - * @type {Number} - */ - this._lastVal = this.value; - /** - * The event id of the tick update loop - * @private - * @type {Number} - */ - this._synced = Tone.Transport.scheduleRepeat(this._onTick.bind(this), '1i'); - /** - * A bound version of the anchor value methods - * @type {Function} - * @private - */ - this._bindAnchorValue = this._anchorValue.bind(this); - Tone.Transport.on('start stop pause', this._bindAnchorValue); - this._events.memory = Infinity; - }; - Tone.extend(Tone.TransportTimelineSignal, Tone.Signal); - /** - * Callback which is invoked every tick. - * @private - * @param {Number} time - * @return {Tone.TransportTimelineSignal} this - */ - Tone.TransportTimelineSignal.prototype._onTick = function (time) { - var val = this.getValueAtTime(Tone.Transport.seconds); - if (this._lastVal !== val) { - this._lastVal = val; - //approximate ramp curves with linear ramps - this._outputSig.linearRampToValueAtTime(val, time); - } - }; - /** - * Anchor the value at the start and stop of the Transport - * @param {Number} time The time of the event - * @return {Tone.TransportTimelineSignal} this - * @private - */ - Tone.TransportTimelineSignal.prototype._anchorValue = function (time) { - var val = this.getValueAtTime(Tone.Transport.seconds); - this._lastVal = val; - this._outputSig.cancelScheduledValues(time); - this._outputSig.setValueAtTime(val, time); - return this; - }; - /** - * Get the scheduled value at the given time. This will - * return the unconverted (raw) value. - * @param {TransportTime} time The time in seconds. - * @return {Number} The scheduled value at the given time. - */ - Tone.TransportTimelineSignal.prototype.getValueAtTime = function (time) { - time = Tone.TransportTime(time); - return Tone.Signal.prototype.getValueAtTime.call(this, time); - }; - /** - * Set the output of the signal at the given time - * @param {Number} value The value to change to at the given time - * @param {TransportTime} time The time to change the signal - * @return {Tone.TransportTimelineSignal} this - */ - Tone.TransportTimelineSignal.prototype.setValueAtTime = function (value, time) { - time = Tone.TransportTime(time); - Tone.Signal.prototype.setValueAtTime.call(this, value, time); - return this; - }; - /** - * Linear ramp to the given value from the previous scheduled point to the given value - * @param {Number} value The value to change to at the given time - * @param {TransportTime} time The time to change the signal - * @return {Tone.TransportTimelineSignal} this - */ - Tone.TransportTimelineSignal.prototype.linearRampToValueAtTime = function (value, time) { - time = Tone.TransportTime(time); - Tone.Signal.prototype.linearRampToValueAtTime.call(this, value, time); - return this; - }; - /** - * Exponential ramp to the given value from the previous scheduled point to the given value - * @param {Number} value The value to change to at the given time - * @param {TransportTime} time The time to change the signal - * @return {Tone.TransportTimelineSignal} this - */ - Tone.TransportTimelineSignal.prototype.exponentialRampToValueAtTime = function (value, time) { - time = Tone.TransportTime(time); - Tone.Signal.prototype.exponentialRampToValueAtTime.call(this, value, time); - return this; - }; - /** - * Start exponentially approaching the target value at the given time with - * a rate having the given time constant. - * @param {number} value - * @param {TransportTime} startTime - * @param {number} timeConstant - * @return {Tone.TransportTimelineSignal} this - */ - Tone.TransportTimelineSignal.prototype.setTargetAtTime = function (value, startTime, timeConstant) { - startTime = Tone.TransportTime(startTime); - Tone.Signal.prototype.setTargetAtTime.call(this, value, startTime, timeConstant); - return this; - }; - /** - * Cancels all scheduled parameter changes with times greater than or - * equal to startTime. - * @param {TransportTime} startTime - * @returns {Tone.Param} this - */ - Tone.TransportTimelineSignal.prototype.cancelScheduledValues = function (startTime) { - startTime = Tone.TransportTime(startTime); - Tone.Signal.prototype.cancelScheduledValues.call(this, startTime); - return this; - }; - /** - * Set an array of arbitrary values starting at the given time for the given duration. - * @param {Float32Array} values - * @param {Time} startTime - * @param {Time} duration - * @param {NormalRange} [scaling=1] If the values in the curve should be scaled by some value - * @returns {Tone.Signal} this - */ - Tone.TransportTimelineSignal.prototype.setValueCurveAtTime = function (values, startTime, duration, scaling) { - startTime = Tone.TransportTime(startTime); - duration = Tone.TransportTime(duration); - Tone.Signal.prototype.setValueCurveAtTime.call(this, values, startTime, duration, scaling); - return this; - }; - /** - * This is similar to [cancelScheduledValues](#cancelScheduledValues) except - * it holds the automated value at time until the next automated event. - * @param {Time} time - * @returns {Tone.TransportTimelineSignal} this - */ - Tone.TransportTimelineSignal.prototype.cancelAndHoldAtTime = function (time) { - return Tone.Signal.prototype.cancelAndHoldAtTime.call(this, Tone.TransportTime(time)); - }; - /** - * Dispose and disconnect - * @return {Tone.TransportTimelineSignal} this - */ - Tone.TransportTimelineSignal.prototype.dispose = function () { - Tone.Transport.clear(this._synced); - Tone.Transport.off('start stop pause', this._syncedCallback); - this._events.cancel(0); - Tone.Signal.prototype.dispose.call(this); - this._outputSig.dispose(); - this._outputSig = null; - }; - return Tone.TransportTimelineSignal; - }); - Module(function (Tone) { - /** - * @class Tone.GrainPlayer implements [granular synthesis](https://en.wikipedia.org/wiki/Granular_synthesis). - * Granular Synthesis enables you to adjust pitch and playback rate independently. The grainSize is the - * amount of time each small chunk of audio is played for and the overlap is the - * amount of crossfading transition time between successive grains. - * @extends {Tone.Source} - * @param {String|Tone.Buffer} url The url to load, or the Tone.Buffer to play. - * @param {Function=} callback The callback to invoke after the url is loaded. - */ - Tone.GrainPlayer = function () { - var options = Tone.defaults(arguments, [ - 'url', - 'onload' - ], Tone.GrainPlayer); - Tone.Source.call(this, options); - /** - * The audio buffer belonging to the player. - * @type {Tone.Buffer} - */ - this.buffer = new Tone.Buffer(options.url, options.onload); - /** - * Create a repeating tick to schedule - * the grains. - * @type {Tone.Clock} - * @private - */ - this._clock = new Tone.Clock(this._tick.bind(this), options.grainSize); - /** - * @type {Number} - * @private - */ - this._loopStart = 0; - /** - * @type {Number} - * @private - */ - this._loopEnd = 0; - /** - * All of the currently playing BufferSources - * @type {Array} - * @private - */ - this._activeSources = []; - /** - * @type {Number} - * @private - */ - this._playbackRate = options.playbackRate; - /** - * @type {Number} - * @private - */ - this._grainSize = options.grainSize; - /** - * @private - * @type {Number} - */ - this._overlap = options.overlap; - /** - * Adjust the pitch independently of the playbackRate. - * @type {Cents} - */ - this.detune = options.detune; - //setup - this.overlap = options.overlap; - this.loop = options.loop; - this.playbackRate = options.playbackRate; - this.grainSize = options.grainSize; - this.loopStart = options.loopStart; - this.loopEnd = options.loopEnd; - this.reverse = options.reverse; - this._clock.on('stop', this._onstop.bind(this)); - }; - Tone.extend(Tone.GrainPlayer, Tone.Source); - /** - * the default parameters - * @static - * @const - * @type {Object} - */ - Tone.GrainPlayer.defaults = { - 'onload': Tone.noOp, - 'overlap': 0.1, - 'grainSize': 0.2, - 'playbackRate': 1, - 'detune': 0, - 'loop': false, - 'loopStart': 0, - 'loopEnd': 0, - 'reverse': false - }; - /** - * Play the buffer at the given startTime. Optionally add an offset - * and/or duration which will play the buffer from a position - * within the buffer for the given duration. - * - * @param {Time} [startTime=now] When the player should start. - * @param {Time} [offset=0] The offset from the beginning of the sample - * to start at. - * @param {Time=} duration How long the sample should play. If no duration - * is given, it will default to the full length - * of the sample (minus any offset) - * @returns {Tone.GrainPlayer} this - * @memberOf Tone.GrainPlayer# - * @method start - * @name start - */ - /** - * Internal start method - * @param {Time} time - * @param {Time} offset - * @private - */ - Tone.GrainPlayer.prototype._start = function (time, offset, duration) { - offset = Tone.defaultArg(offset, 0); - offset = this.toSeconds(offset); - time = this.toSeconds(time); - this._offset = offset; - this._clock.start(time); - if (duration) { - this.stop(time + this.toSeconds(duration)); - } - }; - /** - * Internal start method - * @param {Time} time - * @private - */ - Tone.GrainPlayer.prototype._stop = function (time) { - this._clock.stop(time); - }; - /** - * Invoked when the clock is stopped - * @param {Number} time - * @private - */ - Tone.GrainPlayer.prototype._onstop = function (time) { - //stop the players - this._activeSources.forEach(function (source) { - source.stop(time, 0); - }); - }; - /** - * Invoked on each clock tick. scheduled a new - * grain at this time. - * @param {Time} time - * @private - */ - Tone.GrainPlayer.prototype._tick = function (time) { - var fadeIn = this._offset < this._overlap ? 0 : this._overlap; - var source = new Tone.BufferSource({ - 'buffer': this.buffer, - 'fadeIn': fadeIn, - 'fadeOut': this._overlap, - 'loop': this.loop, - 'loopStart': this._loopStart, - 'loopEnd': this._loopEnd, - 'playbackRate': Tone.intervalToFrequencyRatio(this.detune / 100) - }).connect(this.output); - source.start(time, this._offset); - this._offset += this.grainSize; - source.stop(time + this.grainSize); - //add it to the active sources - this._activeSources.push(source); - //remove it when it's done - source.onended = function () { - var index = this._activeSources.indexOf(source); - if (index !== -1) { - this._activeSources.splice(index, 1); - } - }.bind(this); - }; - /** - * Jump to a specific time and play it. - * @param {Time} offset The offset to jump to. - * @param {Time=} time When to make the jump. - * @return {Tone.GrainPlayer} this - */ - Tone.GrainPlayer.prototype.seek = function (offset, time) { - this._offset = this.toSeconds(offset); - this._tick(this.toSeconds(time)); - return this; - }; - /** - * The playback rate of the sample - * @memberOf Tone.GrainPlayer# - * @type {Positive} - * @name playbackRate - */ - Object.defineProperty(Tone.GrainPlayer.prototype, 'playbackRate', { - get: function () { - return this._playbackRate; - }, - set: function (rate) { - this._playbackRate = rate; - this.grainSize = this._grainSize; - } - }); - /** - * The loop start time. - * @memberOf Tone.GrainPlayer# - * @type {Time} - * @name loopStart - */ - Object.defineProperty(Tone.GrainPlayer.prototype, 'loopStart', { - get: function () { - return this._loopStart; - }, - set: function (time) { - this._loopStart = this.toSeconds(time); - } - }); - /** - * The loop end time. - * @memberOf Tone.GrainPlayer# - * @type {Time} - * @name loopEnd - */ - Object.defineProperty(Tone.GrainPlayer.prototype, 'loopEnd', { - get: function () { - return this._loopEnd; - }, - set: function (time) { - this._loopEnd = this.toSeconds(time); - } - }); - /** - * The direction the buffer should play in - * @memberOf Tone.GrainPlayer# - * @type {boolean} - * @name reverse - */ - Object.defineProperty(Tone.GrainPlayer.prototype, 'reverse', { - get: function () { - return this.buffer.reverse; - }, - set: function (rev) { - this.buffer.reverse = rev; - } - }); - /** - * The size of each chunk of audio that the - * buffer is chopped into and played back at. - * @memberOf Tone.GrainPlayer# - * @type {Time} - * @name grainSize - */ - Object.defineProperty(Tone.GrainPlayer.prototype, 'grainSize', { - get: function () { - return this._grainSize; - }, - set: function (size) { - this._grainSize = this.toSeconds(size); - this._clock.frequency.value = this._playbackRate / this._grainSize; - } - }); - /** - * This is the duration of the cross-fade between - * sucessive grains. - * @memberOf Tone.GrainPlayer# - * @type {Time} - * @name overlap - */ - Object.defineProperty(Tone.GrainPlayer.prototype, 'overlap', { - get: function () { - return this._overlap; - }, - set: function (time) { - this._overlap = this.toSeconds(time); - } - }); - /** - * Clean up - * @return {Tone.GrainPlayer} this - */ - Tone.GrainPlayer.prototype.dispose = function () { - Tone.Source.prototype.dispose.call(this); - this.buffer.dispose(); - this.buffer = null; - this._clock.dispose(); - this._clock = null; - this._activeSources.forEach(function (source) { - source.dispose(); - }); - this._activeSources = null; - return this; - }; - return Tone.GrainPlayer; - }); - Module(function (Tone) { - - /** - * @class Tone.Player is an audio file player with start, loop, and stop functions. - * - * @constructor - * @extends {Tone.Source} - * @param {string|AudioBuffer} url Either the AudioBuffer or the url from - * which to load the AudioBuffer - * @param {Function=} onload The function to invoke when the buffer is loaded. - * Recommended to use Tone.Buffer.on('load') instead. - * @example - * var player = new Tone.Player("./path/to/sample.mp3").toMaster(); - * //play as soon as the buffer is loaded - * player.autostart = true; - */ - Tone.Player = function (url) { - var options; - if (url instanceof Tone.Buffer && url.loaded) { - url = url.get(); - options = Tone.Player.defaults; - } else { - options = Tone.defaults(arguments, [ - 'url', - 'onload' - ], Tone.Player); - } - Tone.Source.call(this, options); - /** - * If the file should play as soon - * as the buffer is loaded. - * @type {Boolean} - * @example - * //will play as soon as it's loaded - * var player = new Tone.Player({ - * "url" : "./path/to/sample.mp3", - * "autostart" : true, - * }).toMaster(); - */ - this.autostart = options.autostart; - /** - * the buffer - * @private - * @type {Tone.Buffer} - */ - this._buffer = new Tone.Buffer({ - 'url': options.url, - 'onload': this._onload.bind(this, options.onload), - 'reverse': options.reverse - }); - if (url instanceof AudioBuffer) { - this._buffer.set(url); - } - /** - * if the buffer should loop once it's over - * @type {Boolean} - * @private - */ - this._loop = options.loop; - /** - * if 'loop' is true, the loop will start at this position - * @type {Time} - * @private - */ - this._loopStart = options.loopStart; - /** - * if 'loop' is true, the loop will end at this position - * @type {Time} - * @private - */ - this._loopEnd = options.loopEnd; - /** - * the playback rate - * @private - * @type {Number} - */ - this._playbackRate = options.playbackRate; - /** - * All of the active buffer source nodes - * @type {Array<Tone.BufferSource>} - * @private - */ - this._activeSources = []; - /** - * The elapsed time counter. - * @type {Tone.TickSource} - * @private - */ - this._elapsedTime = new Tone.TickSource(options.playbackRate); - /** - * The fadeIn time of the amplitude envelope. - * @type {Time} - */ - this.fadeIn = options.fadeIn; - /** - * The fadeOut time of the amplitude envelope. - * @type {Time} - */ - this.fadeOut = options.fadeOut; - }; - Tone.extend(Tone.Player, Tone.Source); - /** - * the default parameters - * @static - * @const - * @type {Object} - */ - Tone.Player.defaults = { - 'onload': Tone.noOp, - 'playbackRate': 1, - 'loop': false, - 'autostart': false, - 'loopStart': 0, - 'loopEnd': 0, - 'retrigger': false, - 'reverse': false, - 'fadeIn': 0, - 'fadeOut': 0 - }; - /** - * Load the audio file as an audio buffer. - * Decodes the audio asynchronously and invokes - * the callback once the audio buffer loads. - * Note: this does not need to be called if a url - * was passed in to the constructor. Only use this - * if you want to manually load a new url. - * @param {string} url The url of the buffer to load. - * Filetype support depends on the - * browser. - * @param {Function=} callback The function to invoke once - * the sample is loaded. - * @returns {Promise} - */ - Tone.Player.prototype.load = function (url, callback) { - return this._buffer.load(url, this._onload.bind(this, callback)); - }; - /** - * Internal callback when the buffer is loaded. - * @private - */ - Tone.Player.prototype._onload = function (callback) { - callback = Tone.defaultArg(callback, Tone.noOp); - callback(this); - if (this.autostart) { - this.start(); - } - }; - /** - * Internal callback when the buffer is done playing. - * @private - */ - Tone.Player.prototype._onSourceEnd = function (source) { - var index = this._activeSources.indexOf(source); - this._activeSources.splice(index, 1); - }; - /** - * Play the buffer at the given startTime. Optionally add an offset - * and/or duration which will play the buffer from a position - * within the buffer for the given duration. - * - * @param {Time} [startTime=now] When the player should start. - * @param {Time} [offset=0] The offset from the beginning of the sample - * to start at. - * @param {Time=} duration How long the sample should play. If no duration - * is given, it will default to the full length - * of the sample (minus any offset) - * @returns {Tone.Player} this - * @memberOf Tone.Player# - * @method start - * @name start - */ - /** - * Internal start method - * @private - */ - Tone.Player.prototype._start = function (startTime, offset, duration) { - //if it's a loop the default offset is the loopstart point - if (this._loop) { - offset = Tone.defaultArg(offset, this._loopStart); - } else { - //otherwise the default offset is 0 - offset = Tone.defaultArg(offset, 0); - } - //compute the values in seconds - offset = this.toSeconds(offset); - var computedDuration = Tone.defaultArg(duration, Math.max(this._buffer.duration - offset, 0)); - computedDuration = this.toSeconds(computedDuration); - startTime = this.toSeconds(startTime); - //start the elapsed time counter - this._elapsedTime.start(startTime, offset); - //make the source - var source = new Tone.BufferSource({ - 'buffer': this._buffer, - 'loop': this._loop, - 'loopStart': this._loopStart, - 'loopEnd': this._loopEnd, - 'onended': this._onSourceEnd.bind(this), - 'playbackRate': this._playbackRate, - 'fadeIn': this.fadeIn, - 'fadeOut': this.fadeOut - }).connect(this.output); - //set the looping properties - if (!this._loop && !this._synced) { - //if it's not looping, set the state change at the end of the sample - this._state.setStateAtTime(Tone.State.Stopped, startTime + computedDuration / this._playbackRate); - } - //add it to the array of active sources - this._activeSources.push(source); - //start it - if (this._loop && Tone.isUndef(duration)) { - source.start(startTime, offset); - } else { - source.start(startTime, offset, computedDuration); - } - return this; - }; - /** - * Stop playback. - * @private - * @param {Time} [time=now] - * @returns {Tone.Player} this - */ - Tone.Player.prototype._stop = function (time) { - time = this.toSeconds(time); - this._elapsedTime.stop(time); - this._activeSources.forEach(function (source) { - source.stop(time); - }); - return this; - }; - /** - * Stop and then restart the player from the beginning (or offset) - * @param {Time} [startTime=now] When the player should start. - * @param {Time} [offset=0] The offset from the beginning of the sample - * to start at. - * @param {Time=} duration How long the sample should play. If no duration - * is given, it will default to the full length - * of the sample (minus any offset) - * @returns {Tone.Player} this - */ - Tone.Player.prototype.restart = function (time, offset, duration) { - this._stop(time); - this._start(time, offset, duration); - return this; - }; - /** - * Seek to a specific time in the player's buffer. If the - * source is no longer playing at that time, it will stop. - * If you seek to a time that - * @param {Time} offset The time to seek to. - * @param {Time=} time The time for the seek event to occur. - * @return {Tone.Player} this - * @example - * source.start(0.2); - * source.stop(0.4); - */ - Tone.Player.prototype.seek = function (offset, time) { - time = this.toSeconds(time); - if (this._state.getValueAtTime(time) === Tone.State.Started) { - offset = this.toSeconds(offset); - // if it's currently playing, stop it - this._stop(time); - //restart it at the given time - this._start(time, offset); - } - return this; - }; - /** - * Set the loop start and end. Will only loop if loop is - * set to true. - * @param {Time} loopStart The loop end time - * @param {Time} loopEnd The loop end time - * @returns {Tone.Player} this - * @example - * //loop 0.1 seconds of the file. - * player.setLoopPoints(0.2, 0.3); - * player.loop = true; - */ - Tone.Player.prototype.setLoopPoints = function (loopStart, loopEnd) { - this.loopStart = loopStart; - this.loopEnd = loopEnd; - return this; - }; - /** - * If loop is true, the loop will start at this position. - * @memberOf Tone.Player# - * @type {Time} - * @name loopStart - */ - Object.defineProperty(Tone.Player.prototype, 'loopStart', { - get: function () { - return this._loopStart; - }, - set: function (loopStart) { - this._loopStart = loopStart; - //get the current source - this._activeSources.forEach(function (source) { - source.loopStart = loopStart; - }); - } - }); - /** - * If loop is true, the loop will end at this position. - * @memberOf Tone.Player# - * @type {Time} - * @name loopEnd - */ - Object.defineProperty(Tone.Player.prototype, 'loopEnd', { - get: function () { - return this._loopEnd; - }, - set: function (loopEnd) { - this._loopEnd = loopEnd; - //get the current source - this._activeSources.forEach(function (source) { - source.loopEnd = loopEnd; - }); - } - }); - /** - * The audio buffer belonging to the player. - * @memberOf Tone.Player# - * @type {Tone.Buffer} - * @name buffer - */ - Object.defineProperty(Tone.Player.prototype, 'buffer', { - get: function () { - return this._buffer; - }, - set: function (buffer) { - this._buffer.set(buffer); - } - }); - /** - * If the buffer should loop once it's over. - * @memberOf Tone.Player# - * @type {Boolean} - * @name loop - */ - Object.defineProperty(Tone.Player.prototype, 'loop', { - get: function () { - return this._loop; - }, - set: function (loop) { - //if no change, do nothing - if (this._loop === loop) { - return; - } - this._loop = loop; - var now = this.now(); - if (!loop) { - //stop the playback on the next cycle - this._stopAtNextIteration(now); - } else { - //remove the next stopEvent - var stopEvent = this._state.getNextState(Tone.State.Stopped, now); - if (stopEvent) { - this._activeSources.forEach(function (source) { - source.loop = loop; - }); - this._state.cancel(stopEvent.time); - this._elapsedTime.cancel(stopEvent.time); - } - } - } - }); - /** - * Schedules a stop event at the next full iteration. Used - * for scheduling stop when the loop state or playbackRate changes - * @param {Number} now The current time - * @private - */ - Tone.Player.prototype._stopAtNextIteration = function (now) { - if (this._state.getValueAtTime(now) === Tone.State.Started) { - var nextStop = this._state.getNextState(Tone.State.Stopped, now); - var position = this._elapsedTime.getTicksAtTime(now); - var iterations = Math.max(Math.ceil(position / this.buffer.duration), 1); - var stopTime = this._elapsedTime.getTimeOfTick(iterations * this.buffer.duration, nextStop ? nextStop.time - this.sampleTime : Infinity); - this.stop(stopTime); - } - }; - /** - * The playback speed. 1 is normal speed. This is not a signal because - * Safari and iOS currently don't support playbackRate as a signal. - * @memberOf Tone.Player# - * @type {Number} - * @name playbackRate - */ - Object.defineProperty(Tone.Player.prototype, 'playbackRate', { - get: function () { - return this._playbackRate; - }, - set: function (rate) { - this._playbackRate = rate; - var now = this.now(); - this._elapsedTime.frequency.setValueAtTime(rate, now); - //if it's not looping - if (!this._loop) { - this._stopAtNextIteration(now); - } - //set all the sources - this._activeSources.forEach(function (source) { - source.playbackRate.setValueAtTime(rate, now); - }); - } - }); - /** - * The current playback position of the buffer. - * @memberOf Tone.Player# - * @type {Number} - * @name position - */ - Object.defineProperty(Tone.Player.prototype, 'position', { - get: function () { - var now = this.now(); - if (this._state.getValueAtTime(now) === Tone.State.Started && this.loaded) { - var duration = this.buffer.duration; - var position = this._elapsedTime.getTicksAtTime(now); - return position % duration; - } else { - return 0; - } - } - }); - /** - * The direction the buffer should play in - * @memberOf Tone.Player# - * @type {Boolean} - * @name reverse - */ - Object.defineProperty(Tone.Player.prototype, 'reverse', { - get: function () { - return this._buffer.reverse; - }, - set: function (rev) { - this._buffer.reverse = rev; - } - }); - /** - * If all the buffer is loaded - * @memberOf Tone.Player# - * @type {Boolean} - * @name loaded - * @readOnly - */ - Object.defineProperty(Tone.Player.prototype, 'loaded', { - get: function () { - return this._buffer.loaded; - } - }); - /** - * Dispose and disconnect. - * @return {Tone.Player} this - */ - Tone.Player.prototype.dispose = function () { - //disconnect all of the players - this._activeSources.forEach(function (source) { - source.dispose(); - }); - this._activeSources = null; - Tone.Source.prototype.dispose.call(this); - this._buffer.dispose(); - this._buffer = null; - this._elapsedTime.dispose(); - this._elapsedTime = null; - return this; - }; - return Tone.Player; - }); - Module(function (Tone) { - - /** - * @class Tone.Players combines multiple [Tone.Player](Player) objects. - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Object} urls An object mapping a name to a url. - * @param {function=} onload The function to invoke when all buffers are loaded. - */ - Tone.Players = function (urls) { - var args = Array.prototype.slice.call(arguments); - args.shift(); - var options = Tone.defaults(args, ['onload'], Tone.Players); - Tone.call(this); - /** - * The output volume node - * @type {Tone.Volume} - * @private - */ - this._volume = this.output = new Tone.Volume(options.volume); - /** - * The volume of the output in decibels. - * @type {Decibels} - * @signal - * @example - * source.volume.value = -6; - */ - this.volume = this._volume.volume; - this._readOnly('volume'); - //make the output explicitly stereo - this._volume.output.output.channelCount = 2; - this._volume.output.output.channelCountMode = 'explicit'; - //mute initially - this.mute = options.mute; - /** - * The container of all of the players - * @type {Object} - * @private - */ - this._players = {}; - /** - * The loading count - * @type {Number} - * @private - */ - this._loadingCount = 0; - /** - * private holder of the fadeIn time - * @type {Time} - * @private - */ - this._fadeIn = options.fadeIn; - /** - * private holder of the fadeOut time - * @type {Time} - * @private - */ - this._fadeOut = options.fadeOut; - //add all of the players - for (var name in urls) { - this._loadingCount++; - this.add(name, urls[name], this._bufferLoaded.bind(this, options.onload)); - } - }; - Tone.extend(Tone.Players, Tone.AudioNode); - /** - * The default values - * @type {Object} - */ - Tone.Players.defaults = { - 'volume': 0, - 'mute': false, - 'onload': Tone.noOp, - 'fadeIn': 0, - 'fadeOut': 0 - }; - /** - * A buffer was loaded. decrement the counter. - * @param {Function} callback - * @private - */ - Tone.Players.prototype._bufferLoaded = function (callback) { - this._loadingCount--; - if (this._loadingCount === 0 && callback) { - callback(this); - } - }; - /** - * Mute the output. - * @memberOf Tone.Source# - * @type {boolean} - * @name mute - * @example - * //mute the output - * source.mute = true; - */ - Object.defineProperty(Tone.Players.prototype, 'mute', { - get: function () { - return this._volume.mute; - }, - set: function (mute) { - this._volume.mute = mute; - } - }); - /** - * The fadeIn time of the amplitude envelope. - * @memberOf Tone.Source# - * @type {Time} - * @name fadeIn - */ - Object.defineProperty(Tone.Players.prototype, 'fadeIn', { - get: function () { - return this._fadeIn; - }, - set: function (fadeIn) { - this._fadeIn = fadeIn; - this._forEach(function (player) { - player.fadeIn = fadeIn; - }); - } - }); - /** - * The fadeOut time of the amplitude envelope. - * @memberOf Tone.Source# - * @type {Time} - * @name fadeOut - */ - Object.defineProperty(Tone.Players.prototype, 'fadeOut', { - get: function () { - return this._fadeOut; - }, - set: function (fadeOut) { - this._fadeOut = fadeOut; - this._forEach(function (player) { - player.fadeOut = fadeOut; - }); - } - }); - /** - * The state of the players object. Returns "started" if any of the players are playing. - * @memberOf Tone.Players# - * @type {String} - * @name state - * @readOnly - */ - Object.defineProperty(Tone.Players.prototype, 'state', { - get: function () { - var playing = false; - this._forEach(function (player) { - playing = playing || player.state === Tone.State.Started; - }); - return playing ? Tone.State.Started : Tone.State.Stopped; - } - }); - /** - * True if the buffers object has a buffer by that name. - * @param {String|Number} name The key or index of the - * buffer. - * @return {Boolean} - */ - Tone.Players.prototype.has = function (name) { - return this._players.hasOwnProperty(name); - }; - /** - * Get a player by name. - * @param {String} name The players name as defined in - * the constructor object or `add` method. - * @return {Tone.Player} - */ - Tone.Players.prototype.get = function (name) { - if (this.has(name)) { - return this._players[name]; - } else { - throw new Error('Tone.Players: no player named ' + name); - } - }; - /** - * Iterate over all of the players - * @param {Function} callback - * @return {Tone.Players} this - * @private - */ - Tone.Players.prototype._forEach = function (callback) { - for (var playerName in this._players) { - callback(this._players[playerName], playerName); - } - return this; - }; - /** - * If all the buffers are loaded or not - * @memberOf Tone.Players# - * @type {Boolean} - * @name loaded - * @readOnly - */ - Object.defineProperty(Tone.Players.prototype, 'loaded', { - get: function () { - var isLoaded = true; - this._forEach(function (player) { - isLoaded = isLoaded && player.loaded; - }); - return isLoaded; - } - }); - /** - * Add a player by name and url to the Players - * @param {String} name A unique name to give the player - * @param {String|Tone.Buffer|Audiobuffer} url Either the url of the bufer, - * or a buffer which will be added - * with the given name. - * @param {Function=} callback The callback to invoke - * when the url is loaded. - */ - Tone.Players.prototype.add = function (name, url, callback) { - this._players[name] = new Tone.Player(url, callback).connect(this.output); - this._players[name].fadeIn = this._fadeIn; - this._players[name].fadeOut = this._fadeOut; - return this; - }; - /** - * Stop all of the players at the given time - * @param {Time} time The time to stop all of the players. - * @return {Tone.Players} this - */ - Tone.Players.prototype.stopAll = function (time) { - this._forEach(function (player) { - player.stop(time); - }); - }; - /** - * Dispose and disconnect. - * @return {Tone.Players} this - */ - Tone.Players.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this._volume.dispose(); - this._volume = null; - this._writable('volume'); - this.volume = null; - this.output = null; - this._forEach(function (player) { - player.dispose(); - }); - this._players = null; - return this; - }; - return Tone.Players; - }); - Module(function (Tone) { - - /** - * @class Tone.UserMedia uses MediaDevices.getUserMedia to open up - * and external microphone or audio input. Check - * [MediaDevices API Support](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia) - * to see which browsers are supported. Access to an external input - * is limited to secure (HTTPS) connections. - * - * @constructor - * @extends {Tone.AudioNode} - * @param {Decibels=} volume The level of the input - * @example - * //list the inputs and open the third one - * var motu = new Tone.UserMedia(); - * - * //opening the input asks the user to activate their mic - * motu.open().then(function(){ - * //promise resolves when input is available - * }); - */ - Tone.UserMedia = function () { - var options = Tone.defaults(arguments, ['volume'], Tone.UserMedia); - Tone.AudioNode.call(this); - /** - * The MediaStreamNode - * @type {MediaStreamAudioSourceNode} - * @private - */ - this._mediaStream = null; - /** - * The media stream created by getUserMedia. - * @type {LocalMediaStream} - * @private - */ - this._stream = null; - /** - * The open device - * @type {MediaDeviceInfo} - * @private - */ - this._device = null; - /** - * The output volume node - * @type {Tone.Volume} - * @private - */ - this._volume = this.output = new Tone.Volume(options.volume); - /** - * The volume of the output in decibels. - * @type {Decibels} - * @signal - * @example - * input.volume.value = -6; - */ - this.volume = this._volume.volume; - this._readOnly('volume'); - this.mute = options.mute; - }; - Tone.extend(Tone.UserMedia, Tone.AudioNode); - /** - * the default parameters - * @type {Object} - */ - Tone.UserMedia.defaults = { - 'volume': 0, - 'mute': false - }; - /** - * Open the media stream. If a string is passed in, it is assumed - * to be the label or id of the stream, if a number is passed in, - * it is the input number of the stream. - * @param {String|Number} [labelOrId="default"] The label or id of the audio input media device. - * With no argument, the default stream is opened. - * @return {Promise} The promise is resolved when the stream is open. - */ - Tone.UserMedia.prototype.open = function (labelOrId) { - return Tone.UserMedia.enumerateDevices().then(function (devices) { - var device; - if (Tone.isNumber(labelOrId)) { - device = devices[labelOrId]; - } else { - device = devices.find(function (device) { - return device.label === labelOrId || device.deviceId === labelOrId; - }); - //didn't find a matching device - if (!device && devices.length > 0) { - device = devices[0]; - } else if (!device && Tone.isDefined(labelOrId)) { - throw new Error('Tone.UserMedia: no matching device: ' + labelOrId); - } - } - this._device = device; - //do getUserMedia - var constraints = { - audio: { - 'echoCancellation': false, - 'sampleRate': this.context.sampleRate - } - }; - if (device) { - constraints.audio.deviceId = device.deviceId; - } - return navigator.mediaDevices.getUserMedia(constraints).then(function (stream) { - //start a new source only if the previous one is closed - if (!this._stream) { - this._stream = stream; - //Wrap a MediaStreamSourceNode around the live input stream. - this._mediaStream = this.context.createMediaStreamSource(stream); - //Connect the MediaStreamSourceNode to a gate gain node - this._mediaStream.connect(this.output); - } - return this; - }.bind(this)); - }.bind(this)); - }; - /** - * Close the media stream - * @return {Tone.UserMedia} this - */ - Tone.UserMedia.prototype.close = function () { - if (this._stream) { - this._stream.getAudioTracks().forEach(function (track) { - track.stop(); - }); - this._stream = null; - //remove the old media stream - this._mediaStream.disconnect(); - this._mediaStream = null; - } - this._device = null; - return this; - }; - /** - * Returns a promise which resolves with the list of audio input devices available. - * @return {Promise} The promise that is resolved with the devices - * @static - * @example - * Tone.UserMedia.enumerateDevices().then(function(devices){ - * console.log(devices) - * }) - */ - Tone.UserMedia.enumerateDevices = function () { - return navigator.mediaDevices.enumerateDevices().then(function (devices) { - return devices.filter(function (device) { - return device.kind === 'audioinput'; - }); - }); - }; - /** - * Returns the playback state of the source, "started" when the microphone is open - * and "stopped" when the mic is closed. - * @type {Tone.State} - * @readOnly - * @memberOf Tone.UserMedia# - * @name state - */ - Object.defineProperty(Tone.UserMedia.prototype, 'state', { - get: function () { - return this._stream && this._stream.active ? Tone.State.Started : Tone.State.Stopped; - } - }); - /** - * Returns an identifier for the represented device that is - * persisted across sessions. It is un-guessable by other applications and - * unique to the origin of the calling application. It is reset when the - * user clears cookies (for Private Browsing, a different identifier is - * used that is not persisted across sessions). Returns undefined when the - * device is not open. - * @type {String} - * @readOnly - * @memberOf Tone.UserMedia# - * @name deviceId - */ - Object.defineProperty(Tone.UserMedia.prototype, 'deviceId', { - get: function () { - if (this._device) { - return this._device.deviceId; - } - } - }); - /** - * Returns a group identifier. Two devices have the - * same group identifier if they belong to the same physical device. - * Returns undefined when the device is not open. - * @type {String} - * @readOnly - * @memberOf Tone.UserMedia# - * @name groupId - */ - Object.defineProperty(Tone.UserMedia.prototype, 'groupId', { - get: function () { - if (this._device) { - return this._device.groupId; - } - } - }); - /** - * Returns a label describing this device (for example "Built-in Microphone"). - * Returns undefined when the device is not open or label is not available - * because of permissions. - * @type {String} - * @readOnly - * @memberOf Tone.UserMedia# - * @name groupId - */ - Object.defineProperty(Tone.UserMedia.prototype, 'label', { - get: function () { - if (this._device) { - return this._device.label; - } - } - }); - /** - * Mute the output. - * @memberOf Tone.UserMedia# - * @type {boolean} - * @name mute - * @example - * //mute the output - * userMedia.mute = true; - */ - Object.defineProperty(Tone.UserMedia.prototype, 'mute', { - get: function () { - return this._volume.mute; - }, - set: function (mute) { - this._volume.mute = mute; - } - }); - /** - * Clean up. - * @return {Tone.UserMedia} this - */ - Tone.UserMedia.prototype.dispose = function () { - Tone.AudioNode.prototype.dispose.call(this); - this.close(); - this._writable('volume'); - this._volume.dispose(); - this._volume = null; - this.volume = null; - return this; - }; - /** - * If getUserMedia is supported by the browser. - * @type {Boolean} - * @memberOf Tone.UserMedia# - * @name supported - * @static - * @readOnly - */ - Object.defineProperty(Tone.UserMedia, 'supported', { - get: function () { - return Tone.isDefined(navigator.mediaDevices) && Tone.isFunction(navigator.mediaDevices.getUserMedia); - } - }); - return Tone.UserMedia; - }); - Module(function (Tone) { - /** - * @class Tone.Midi is a primitive type for encoding Time values. - * Tone.Midi can be constructed with or without the `new` keyword. Tone.Midi can be passed - * into the parameter of any method which takes time as an argument. - * @constructor - * @extends {Tone.Frequency} - * @param {String|Number} val The time value. - * @param {String=} units The units of the value. - * @example - * var t = Tone.Midi("4n");//a quarter note - */ - Tone.Midi = function (val, units) { - if (this instanceof Tone.Midi) { - Tone.Frequency.call(this, val, units); - } else { - return new Tone.Midi(val, units); - } - }; - Tone.extend(Tone.Midi, Tone.Frequency); - /** - * The default units if none are given. - * @type {String} - * @private - */ - Tone.Midi.prototype._defaultUnits = 'midi'; - /** - * Returns the value of a frequency in the current units - * @param {Frequency} freq - * @return {Number} - * @private - */ - Tone.Midi.prototype._frequencyToUnits = function (freq) { - return Tone.Frequency.ftom(Tone.Frequency.prototype._frequencyToUnits.call(this, freq)); - }; - /** - * Returns the value of a tick in the current time units - * @param {Ticks} ticks - * @return {Number} - * @private - */ - Tone.Midi.prototype._ticksToUnits = function (ticks) { - return Tone.Frequency.ftom(Tone.Frequency.prototype._ticksToUnits.call(this, ticks)); - }; - /** - * Return the value of the beats in the current units - * @param {Number} beats - * @return {Number} - * @private - */ - Tone.Midi.prototype._beatsToUnits = function (beats) { - return Tone.Frequency.ftom(Tone.Frequency.prototype._beatsToUnits.call(this, beats)); - }; - /** - * Returns the value of a second in the current units - * @param {Seconds} seconds - * @return {Number} - * @private - */ - Tone.Midi.prototype._secondsToUnits = function (seconds) { - return Tone.Frequency.ftom(Tone.Frequency.prototype._secondsToUnits.call(this, seconds)); - }; - /** - * Return the value of the frequency as a MIDI note - * @return {MIDI} - * @example - * Tone.Midi(60).toMidi(); //60 - */ - Tone.Midi.prototype.toMidi = function () { - return this.valueOf(); - }; - /** - * Return the value of the frequency as a MIDI note - * @return {MIDI} - * @example - * Tone.Midi(60).toMidi(); //60 - */ - Tone.Midi.prototype.toFrequency = function () { - return Tone.Frequency.mtof(this.toMidi()); - }; - /** - * Transposes the frequency by the given number of semitones. - * @param {Interval} interval - * @return {Tone.Frequency} A new transposed frequency - * @example - * Tone.Frequency("A4").transpose(3); //"C5" - */ - Tone.Midi.prototype.transpose = function (interval) { - return new this.constructor(this.toMidi() + interval); - }; - return Tone.Midi; - }); - - return Tone; -})); - -/***/ }), -/* 25 */ -/***/ (function(module, exports) { - -module.exports = true; - -/***/ }), -/* 26 */ -/***/ (function(module, exports) { - -exports.f = {}.propertyIsEnumerable; - -/***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { - -var def = __webpack_require__(5).f - , has = __webpack_require__(8) - , TAG = __webpack_require__(1)('toStringTag'); - -module.exports = function(it, tag, stat){ - if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); -}; - -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.13 ToObject(argument) -var defined = __webpack_require__(35); -module.exports = function(it){ - return Object(defined(it)); -}; - -/***/ }), -/* 29 */ -/***/ (function(module, exports) { - -var id = 0 - , px = Math.random(); -module.exports = function(key){ - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(129); -var global = __webpack_require__(2) - , hide = __webpack_require__(9) - , Iterators = __webpack_require__(14) - , TO_STRING_TAG = __webpack_require__(1)('toStringTag'); - -for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){ - var NAME = collections[i] - , Collection = global[NAME] - , proto = Collection && Collection.prototype; - if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME); - Iterators[NAME] = Iterators.Array; -} - -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.browser = exports.isDesktop = exports.isMobile = exports.isAndroid = exports.isIpad = exports.isIphone = undefined; - -var _log = __webpack_require__(86); - -var _log2 = _interopRequireDefault(_log); - -var _assign = __webpack_require__(57); - -var _assign2 = _interopRequireDefault(_assign); - -exports.choice = choice; -exports.mod = mod; -exports.norm = norm; -exports.requestAudioContext = requestAudioContext; -exports.dataURItoBlob = dataURItoBlob; -exports.ftom = ftom; -exports.mtof = mtof; -exports.tap = tap; -exports.get_diff_bounds = get_diff_bounds; -exports.get_bounds = get_bounds; -exports.transpose = transpose; - -var _tone = __webpack_require__(24); - -var _tone2 = _interopRequireDefault(_tone); - -var _startAudioContext = __webpack_require__(82); - -var _startAudioContext2 = _interopRequireDefault(_startAudioContext); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var isIphone = exports.isIphone = navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i); -var isIpad = exports.isIpad = navigator.userAgent.match(/iPad/i); -var isAndroid = exports.isAndroid = navigator.userAgent.match(/Android/i); -var isMobile = exports.isMobile = isIphone || isIpad || isAndroid; -var isDesktop = exports.isDesktop = !isMobile; - -document.body.classList.add(isMobile ? 'mobile' : 'desktop'); - -var browser = exports.browser = { isIphone: isIphone, isIpad: isIpad, isMobile: isMobile, isDesktop: isDesktop }; - -function choice(a) { - return a[Math.floor(Math.random() * a.length)]; -} -function mod(n, m) { - return n - m * Math.floor(n / m); -} -function norm(n, min, max) { - return (n - min) / (max - min); -} - -function requestAudioContext(fn) { - if (isMobile) { - var container = document.createElement('div'); - var button = document.createElement('div'); - button.innerHTML = 'Tap to start - please unmute your phone'; - (0, _assign2.default)(container.style, { - position: 'absolute', - width: '100%', - height: '100%', - zIndex: '10000', - top: '0px', - left: '0px', - backgroundColor: 'rgba(0, 0, 0, 0.8)' - }); - (0, _assign2.default)(button.style, { - position: 'absolute', - left: '50%', - top: '50%', - padding: '20px', - backgroundColor: '#7F33ED', - color: 'white', - fontFamily: 'monospace', - borderRadius: '3px', - transform: 'translate3D(-50%,-50%,0)', - textAlign: 'center', - lineHeight: '1.5' - }); - container.appendChild(button); - document.body.appendChild(container); - _startAudioContext2.default.setContext(_tone2.default.context); - _startAudioContext2.default.on(button); - _startAudioContext2.default.onStarted(function (_) { - container.remove(); - fn(); - }); - } else { - fn(); - } -} - -function dataURItoBlob(dataURI) { - // convert base64 to raw binary data held in a string - // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this - var byteString = atob(dataURI.split(',')[1]); - - // separate out the mime component - var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; - - // write the bytes of the string to an ArrayBuffer - var ab = new ArrayBuffer(byteString.length); - - // create a view into the buffer - var ia = new Uint8Array(ab); - - // set the bytes of the buffer to the correct values - for (var i = 0; i < byteString.length; i++) { - ia[i] = byteString.charCodeAt(i); - } - - // write the ArrayBuffer to a blob, and you're done - var blob = new Blob([ab], { type: mimeString }); - return blob; -} -function ftom(f) { - // return (Math.log(f) - Math.log(261.626)) / Math.log(2) + 4.0 - return 69 + 12 * (0, _log2.default)(f / 440); -} -function mtof(m) { - return 440 * Math.pow(2, (m - 69) / 12); -} -function tap(fn) { - return function (e) { - if (browser.isMobile) fn();else if (e.press) fn(); - }; -} - -/* get minimum and maximum variance from row-to-row */ - -function get_diff_bounds(rows) { - var diffs = rows.map(function (row) { - var row_min = Math.min.apply(Math, row); - var row_max = Math.max.apply(Math, row); - return row_max - row_min; - }); - var min = Math.min.apply(Math, diffs); - var max = Math.max.apply(Math, diffs); - return { min: min, max: max }; -} - -/* get minimum and maximum values from a dataset */ - -function get_bounds(dataset) { - var rows = dataset.lines; - // rows.forEach(row => row.shift()) - rows = rows.map(function (a) { - return a.map(function (n) { - return parseFloat(n); - }); - }); - var max = rows.reduce(function (a, b) { - return b.reduce(function (z, bb) { - return Math.max(z, bb); - }, a); - }, -Infinity); - var min = rows.reduce(function (a, b) { - return b.reduce(function (z, bb) { - return Math.min(z, bb); - }, a); - }, Infinity); - return { rows: rows, max: max, min: min }; -} - -/* transpose a 2D array */ - -function transpose(a) { - var i_len = a[0].length; - var j_len = a.length; - var T = new Array(i_len); - for (var i = 0; i < i_len; i++) { - T[i] = new Array(j_len); - for (var j = 0; j < j_len; j++) { - T[i][j] = a[j][i]; - } - } - return T; -} - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) { - -var buffer = __webpack_require__(3); -var Buffer = buffer.Buffer; -var SlowBuffer = buffer.SlowBuffer; -var MAX_LEN = buffer.kMaxLength || 2147483647; -exports.alloc = function alloc(size, fill, encoding) { - if (typeof Buffer.alloc === 'function') { - return Buffer.alloc(size, fill, encoding); - } - if (typeof encoding === 'number') { - throw new TypeError('encoding must not be number'); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); - } - if (size > MAX_LEN) { - throw new RangeError('size is too large'); - } - var enc = encoding; - var _fill = fill; - if (_fill === undefined) { - enc = undefined; - _fill = 0; - } - var buf = new Buffer(size); - if (typeof _fill === 'string') { - var fillBuf = new Buffer(_fill, enc); - var flen = fillBuf.length; - var i = -1; - while (++i < size) { - buf[i] = fillBuf[i % flen]; - } - } else { - buf.fill(_fill); - } - return buf; -} -exports.allocUnsafe = function allocUnsafe(size) { - if (typeof Buffer.allocUnsafe === 'function') { - return Buffer.allocUnsafe(size); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); - } - if (size > MAX_LEN) { - throw new RangeError('size is too large'); - } - return new Buffer(size); -} -exports.from = function from(value, encodingOrOffset, length) { - if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) { - return Buffer.from(value, encodingOrOffset, length); - } - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number'); - } - if (typeof value === 'string') { - return new Buffer(value, encodingOrOffset); - } - if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) { - var offset = encodingOrOffset; - if (arguments.length === 1) { - return new Buffer(value); - } - if (typeof offset === 'undefined') { - offset = 0; - } - var len = length; - if (typeof len === 'undefined') { - len = value.byteLength - offset; - } - if (offset >= value.byteLength) { - throw new RangeError('\'offset\' is out of bounds'); - } - if (len > value.byteLength - offset) { - throw new RangeError('\'length\' is out of bounds'); - } - return new Buffer(value.slice(offset, offset + len)); - } - if (Buffer.isBuffer(value)) { - var out = new Buffer(value.length); - value.copy(out, 0, 0, value.length); - return out; - } - if (value) { - if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) { - return new Buffer(value); - } - if (value.type === 'Buffer' && Array.isArray(value.data)) { - return new Buffer(value.data); - } - } - - throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.'); -} -exports.allocUnsafeSlow = function allocUnsafeSlow(size) { - if (typeof Buffer.allocUnsafeSlow === 'function') { - return Buffer.allocUnsafeSlow(size); - } - if (typeof size !== 'number') { - throw new TypeError('size must be a number'); - } - if (size >= MAX_LEN) { - throw new RangeError('size is too large'); - } - return new SlowBuffer(size); -} - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(23))) - -/***/ }), -/* 33 */ -/***/ (function(module, exports) { - -module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; -}; - -/***/ }), -/* 34 */ -/***/ (function(module, exports, __webpack_require__) { - -// getting tag from 19.1.3.6 Object.prototype.toString() -var cof = __webpack_require__(17) - , TAG = __webpack_require__(1)('toStringTag') - // ES3 wrong here - , ARG = cof(function(){ return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function(it, key){ - try { - return it[key]; - } catch(e){ /* empty */ } -}; - -module.exports = function(it){ - var O, T, B; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T - // builtinTag case - : ARG ? cof(O) - // ES3 arguments fallback - : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; -}; - -/***/ }), -/* 35 */ -/***/ (function(module, exports) { - -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function(it){ - if(it == undefined)throw TypeError("Can't call method on " + it); - return it; -}; - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(19) - , document = __webpack_require__(2).document - // in old IE typeof document.createElement is 'object' - , is = isObject(document) && isObject(document.createElement); -module.exports = function(it){ - return is ? document.createElement(it) : {}; -}; - -/***/ }), -/* 37 */ -/***/ (function(module, exports) { - -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); - -/***/ }), -/* 38 */ -/***/ (function(module, exports) { - -exports.f = Object.getOwnPropertySymbols; - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(40)('keys') - , uid = __webpack_require__(29); -module.exports = function(key){ - return shared[key] || (shared[key] = uid(key)); -}; - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(2) - , SHARED = '__core-js_shared__' - , store = global[SHARED] || (global[SHARED] = {}); -module.exports = function(key){ - return store[key] || (store[key] = {}); -}; - -/***/ }), -/* 41 */ -/***/ (function(module, exports) { - -// 7.1.4 ToInteger -var ceil = Math.ceil - , floor = Math.floor; -module.exports = function(it){ - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.15 ToLength -var toInteger = __webpack_require__(41) - , min = Math.min; -module.exports = function(it){ - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = __webpack_require__(19); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function(it, S){ - if(!isObject(it))return it; - var fn, val; - if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; - if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - throw TypeError("Can't convert object to primitive value"); -}; - -/***/ }), -/* 44 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(2) - , core = __webpack_require__(0) - , LIBRARY = __webpack_require__(25) - , wksExt = __webpack_require__(45) - , defineProperty = __webpack_require__(5).f; -module.exports = function(name){ - var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); - if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)}); -}; - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - -exports.f = __webpack_require__(1); - -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(34) - , ITERATOR = __webpack_require__(1)('iterator') - , Iterators = __webpack_require__(14); -module.exports = __webpack_require__(0).getIteratorMethod = function(it){ - if(it != undefined)return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; - -/***/ }), -/* 47 */ -/***/ (function(module, exports) { - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; -}; - -EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; - - if (!this._events) - this._events = {}; - - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); - err.context = er; - throw err; - } - } - } - - handler = this._events[type]; - - if (isUndefined(handler)) - return false; - - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - args = Array.prototype.slice.call(arguments, 1); - handler.apply(this, args); - } - } else if (isObject(handler)) { - args = Array.prototype.slice.call(arguments, 1); - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } - - return true; -}; - -EventEmitter.prototype.addListener = function(type, listener) { - var m; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events) - this._events = {}; - - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); - - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; - - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; - } - - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); - } - } - } - - return this; -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - var fired = false; - - function g() { - this.removeListener(type, g); - - if (!fired) { - fired = true; - listener.apply(this, arguments); - } - } - - g.listener = listener; - this.on(type, g); - - return this; -}; - -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events || !this._events[type]) - return this; - - list = this._events[type]; - length = list.length; - position = -1; - - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); - - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } - - if (this._events.removeListener) - this.emit('removeListener', type, listener); - } - - return this; -}; - -EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; - - if (!this._events) - return this; - - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; - } - - listeners = this._events[type]; - - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); - } - delete this._events[type]; - - return this; -}; - -EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; -}; - -EventEmitter.prototype.listenerCount = function(type) { - if (this._events) { - var evlistener = this._events[type]; - - if (isFunction(evlistener)) - return 1; - else if (evlistener) - return evlistener.length; - } - return 0; -}; - -EventEmitter.listenerCount = function(emitter, type) { - return emitter.listenerCount(type); -}; - -function isFunction(arg) { - return typeof arg === 'function'; -} - -function isNumber(arg) { - return typeof arg === 'number'; -} - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} - -function isUndefined(arg) { - return arg === void 0; -} - - -/***/ }), -/* 48 */ -/***/ (function(module, exports, __webpack_require__) { - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var Buffer = __webpack_require__(3).Buffer; - -var isBufferEncoding = Buffer.isEncoding - || function(encoding) { - switch (encoding && encoding.toLowerCase()) { - case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; - default: return false; - } - } - - -function assertEncoding(encoding) { - if (encoding && !isBufferEncoding(encoding)) { - throw new Error('Unknown encoding: ' + encoding); - } -} - -// StringDecoder provides an interface for efficiently splitting a series of -// buffers into a series of JS strings without breaking apart multi-byte -// characters. CESU-8 is handled as part of the UTF-8 encoding. -// -// @TODO Handling all encodings inside a single object makes it very difficult -// to reason about this code, so it should be split up in the future. -// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code -// points as used by CESU-8. -var StringDecoder = exports.StringDecoder = function(encoding) { - this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); - assertEncoding(encoding); - switch (this.encoding) { - case 'utf8': - // CESU-8 represents each of Surrogate Pair by 3-bytes - this.surrogateSize = 3; - break; - case 'ucs2': - case 'utf16le': - // UTF-16 represents each of Surrogate Pair by 2-bytes - this.surrogateSize = 2; - this.detectIncompleteChar = utf16DetectIncompleteChar; - break; - case 'base64': - // Base-64 stores 3 bytes in 4 chars, and pads the remainder. - this.surrogateSize = 3; - this.detectIncompleteChar = base64DetectIncompleteChar; - break; - default: - this.write = passThroughWrite; - return; - } - - // Enough space to store all bytes of a single character. UTF-8 needs 4 - // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). - this.charBuffer = new Buffer(6); - // Number of bytes received for the current incomplete multi-byte character. - this.charReceived = 0; - // Number of bytes expected for the current incomplete multi-byte character. - this.charLength = 0; -}; - - -// write decodes the given buffer and returns it as JS string that is -// guaranteed to not contain any partial multi-byte characters. Any partial -// character found at the end of the buffer is buffered up, and will be -// returned when calling write again with the remaining bytes. -// -// Note: Converting a Buffer containing an orphan surrogate to a String -// currently works, but converting a String to a Buffer (via `new Buffer`, or -// Buffer#write) will replace incomplete surrogates with the unicode -// replacement character. See https://codereview.chromium.org/121173009/ . -StringDecoder.prototype.write = function(buffer) { - var charStr = ''; - // if our last write ended with an incomplete multibyte character - while (this.charLength) { - // determine how many remaining bytes this buffer has to offer for this char - var available = (buffer.length >= this.charLength - this.charReceived) ? - this.charLength - this.charReceived : - buffer.length; - - // add the new bytes to the char buffer - buffer.copy(this.charBuffer, this.charReceived, 0, available); - this.charReceived += available; - - if (this.charReceived < this.charLength) { - // still not enough chars in this buffer? wait for more ... - return ''; - } - - // remove bytes belonging to the current character from the buffer - buffer = buffer.slice(available, buffer.length); - - // get the character that was split - charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - var charCode = charStr.charCodeAt(charStr.length - 1); - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - this.charLength += this.surrogateSize; - charStr = ''; - continue; - } - this.charReceived = this.charLength = 0; - - // if there are no more bytes in this buffer, just emit our char - if (buffer.length === 0) { - return charStr; - } - break; - } - - // determine and set charLength / charReceived - this.detectIncompleteChar(buffer); - - var end = buffer.length; - if (this.charLength) { - // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; - } - - charStr += buffer.toString(this.encoding, 0, end); - - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); - } - - // or just emit the charStr - return charStr; -}; - -// detectIncompleteChar determines if there is an incomplete UTF-8 character at -// the end of the given buffer. If so, it sets this.charLength to the byte -// length that character, and sets this.charReceived to the number of bytes -// that are available for this character. -StringDecoder.prototype.detectIncompleteChar = function(buffer) { - // determine how many bytes we have to check at the end of this buffer - var i = (buffer.length >= 3) ? 3 : buffer.length; - - // Figure out if one of the last i bytes of our buffer announces an - // incomplete char. - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; - - // See http://en.wikipedia.org/wiki/UTF-8#Description - - // 110XXXXX - if (i == 1 && c >> 5 == 0x06) { - this.charLength = 2; - break; - } - - // 1110XXXX - if (i <= 2 && c >> 4 == 0x0E) { - this.charLength = 3; - break; - } - - // 11110XXX - if (i <= 3 && c >> 3 == 0x1E) { - this.charLength = 4; - break; - } - } - this.charReceived = i; -}; - -StringDecoder.prototype.end = function(buffer) { - var res = ''; - if (buffer && buffer.length) - res = this.write(buffer); - - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } - - return res; -}; - -function passThroughWrite(buffer) { - return buffer.toString(this.encoding); -} - -function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; -} - -function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; -} - - -/***/ }), -/* 49 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) { - -if (!process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = nextTick; -} else { - module.exports = process.nextTick; -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11))) - -/***/ }), -/* 50 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process, setImmediate) {// A bit simpler than readable streams. -// Implement an async ._write(chunk, encoding, cb), and it'll handle all -// the drain event emission and buffering. - - - -module.exports = Writable; - -/*<replacement>*/ -var processNextTick = __webpack_require__(49); -/*</replacement>*/ - -/*<replacement>*/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; -/*</replacement>*/ - -/*<replacement>*/ -var Duplex; -/*</replacement>*/ - -Writable.WritableState = WritableState; - -/*<replacement>*/ -var util = __webpack_require__(22); -util.inherits = __webpack_require__(16); -/*</replacement>*/ - -/*<replacement>*/ -var internalUtil = { - deprecate: __webpack_require__(151) -}; -/*</replacement>*/ - -/*<replacement>*/ -var Stream = __webpack_require__(74); -/*</replacement>*/ - -var Buffer = __webpack_require__(3).Buffer; -/*<replacement>*/ -var bufferShim = __webpack_require__(32); -/*</replacement>*/ - -util.inherits(Writable, Stream); - -function nop() {} - -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} - -function WritableState(options, stream) { - Duplex = Duplex || __webpack_require__(12); - - options = options || {}; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - - // the point at which write() starts returning false - // Note: 0 is a valid value, means that we always return false if - // the entire buffer is not flushed immediately on write() - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = ~~this.highWaterMark; - - // drain event flag. - this.needDrain = false; - // at the start of calling end() - this.ending = false; - // when end() has been called, and returned - this.ended = false; - // when 'finish' is emitted - this.finished = false; - - // should we decode strings into buffers before passing to _write? - // this is here so that some node-core streams can optimize string - // handling at a lower level. - var noDecode = options.decodeStrings === false; - this.decodeStrings = !noDecode; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // not an actual buffer we keep track of, but a measurement - // of how much we're waiting to get pushed to some underlying - // socket or file. - this.length = 0; - - // a flag to see when we're in the middle of a write. - this.writing = false; - - // when true all writes will be buffered until .uncork() call - this.corked = 0; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // a flag to know if we're processing previously buffered items, which - // may call the _write() callback in the same tick, so that we don't - // end up in an overlapped onwrite situation. - this.bufferProcessing = false; - - // the callback that's passed to _write(chunk,cb) - this.onwrite = function (er) { - onwrite(stream, er); - }; - - // the callback that the user supplies to write(chunk,encoding,cb) - this.writecb = null; - - // the amount that is being written when _write is called. - this.writelen = 0; - - this.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; - - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; - - // count buffered requests - this.bufferedRequestCount = 0; - - // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function getBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; - -(function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') - }); - } catch (_) {} -})(); - -// Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. -var realHasInstance; -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { - realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { - if (realHasInstance.call(this, object)) return true; - - return object && object._writableState instanceof WritableState; - } - }); -} else { - realHasInstance = function (object) { - return object instanceof this; - }; -} - -function Writable(options) { - Duplex = Duplex || __webpack_require__(12); - - // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. - if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { - return new Writable(options); - } - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; - - if (options) { - if (typeof options.write === 'function') this._write = options.write; - - if (typeof options.writev === 'function') this._writev = options.writev; - } - - Stream.call(this); -} - -// Otherwise people can pipe Writable streams, which is just wrong. -Writable.prototype.pipe = function () { - this.emit('error', new Error('Cannot pipe, not readable')); -}; - -function writeAfterEnd(stream, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - processNextTick(cb, er); -} - -// Checks that a user-supplied chunk is valid, especially for the particular -// mode the stream is in. Currently this means that `null` is never accepted -// and undefined/non-string values are only allowed in object mode. -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - if (er) { - stream.emit('error', er); - processNextTick(cb, er); - valid = false; - } - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - var isBuf = Buffer.isBuffer(chunk); - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); - } - - return ret; -}; - -Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; -}; - -Writable.prototype.uncork = function () { - var state = this._writableState; - - if (state.corked) { - state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; - -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; - return this; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = bufferShim.from(chunk, encoding); - } - return chunk; -} - -// if we're already writing something, then just put this -// in the queue, and wait our turn. Otherwise, call _write -// If we return false, then we need a drain event, so set that flag. -function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { - if (!isBuf) { - chunk = decodeChunk(state, chunk, encoding); - if (Buffer.isBuffer(chunk)) encoding = 'buffer'; - } - var len = state.objectMode ? 1 : chunk.length; - - state.length += len; - - var ret = state.length < state.highWaterMark; - // we must ensure that previous needDrain will not be reset to false. - if (!ret) state.needDrain = true; - - if (state.writing || state.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - - return ret; -} - -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - if (sync) processNextTick(cb, er);else cb(er); - - stream._writableState.errorEmitted = true; - stream.emit('error', er); -} - -function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; -} - -function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - - onwriteStateUpdate(state); - - if (er) onwriteError(stream, state, sync, er, cb);else { - // Check if we're actually ready to finish, but don't emit yet - var finished = needFinish(state); - - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } - - if (sync) { - /*<replacement>*/ - asyncWrite(afterWrite, stream, state, finished, cb); - /*</replacement>*/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); -} - -// Must force callback to be called on nextTick, so that we don't -// emit 'drain' before the write() consumer gets the 'false' return -// value, and has a chance to attach a 'drain' listener. -function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit('drain'); - } -} - -// if there's something in the buffer waiting, then process it -function clearBuffer(stream, state) { - state.bufferProcessing = true; - var entry = state.bufferedRequest; - - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - - var count = 0; - while (entry) { - buffer[count] = entry; - entry = entry.next; - count += 1; - } - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - - // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - // if we didn't call the onwrite immediately, then - // it means that we need to wait until it does. - // also, that means that the chunk and cb are currently - // being processed, so move the buffer counter past them. - if (state.writing) { - break; - } - } - - if (entry === null) state.lastBufferedRequest = null; - } - - state.bufferedRequestCount = 0; - state.bufferedRequest = entry; - state.bufferProcessing = false; -} - -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('_write() is not implemented')); -}; - -Writable.prototype._writev = null; - -Writable.prototype.end = function (chunk, encoding, cb) { - var state = this._writableState; - - if (typeof chunk === 'function') { - cb = chunk; - chunk = null; - encoding = null; - } else if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } - - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} - -function prefinish(stream, state) { - if (!state.prefinished) { - state.prefinished = true; - stream.emit('prefinish'); - } -} - -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - if (state.pendingcb === 0) { - prefinish(stream, state); - state.finished = true; - stream.emit('finish'); - } else { - prefinish(stream, state); - } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) processNextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} - -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - this.finish = function (err) { - var entry = _this.entry; - _this.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = _this; - } else { - state.corkedRequestsFree = _this; - } - }; -} -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11), __webpack_require__(75).setImmediate)) - -/***/ }), -/* 51 */ -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__(72); -exports.Stream = exports; -exports.Readable = exports; -exports.Writable = __webpack_require__(50); -exports.Duplex = __webpack_require__(12); -exports.Transform = __webpack_require__(73); -exports.PassThrough = __webpack_require__(143); - - -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _tone = __webpack_require__(24); - -var _tone2 = _interopRequireDefault(_tone); - -var _util = __webpack_require__(31); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var player_count = 2; -var sample_index = 0; - -var compressor = new _tone2.default.Compressor(-30, 3).toMaster(); - -var samples = [{ root: 226, fn: 'samples/380737__cabled-mess__sansula-01-a-raw.mp3' }, { root: 267, fn: 'samples/380736__cabled-mess__sansula-02-c-raw.mp3' }, { root: 340, fn: 'samples/380735__cabled-mess__sansula-03-e-raw.mp3' }, { root: 452, fn: 'samples/380733__cabled-mess__sansula-06-a-02-raw.mp3' }]; - -samples.forEach(function (sample) { - sample.players = []; - sample.index = -1; - for (var i = 0; i < player_count; i++) { - var fn = sample.fn; - if (window.location.href.match(/asdf.us/)) { - fn = '//asdf.us/kalimba/' + fn; - } - var player = new _tone2.default.Player({ - url: fn, - retrigger: true, - playbackRate: 1 - }); - player.connect(compressor); - sample.players.push(player); - } -}); - -function play(freq) { - var volume = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.0; - - var best = { sample: samples[sample_index] }; - sample_index = (sample_index + 1) % samples.length; - best.sample.index = (best.sample.index + 1) % player_count; - - var player = best.sample.players[best.sample.index]; - player.playbackRate = freq / best.sample.root; - // console.log(player) - player.volume.value = volume; - setTimeout(function () { - player.start(); - }, 0); -} - -exports.default = { play: play }; - -/***/ }), -/* 53 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _intonation = __webpack_require__(81); - -var _intonation2 = _interopRequireDefault(_intonation); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var meantone = '! meanquar.scl\n!\n1/4-comma meantone scale. Pietro Aaron\'s temperament (1523)\n 12\n!\n 76.04900\n 193.15686\n 310.26471\n 5/4\n 503.42157\n 579.47057\n 696.57843\n 25/16\n 889.73529\n 1006.84314\n 1082.89214\n 2/1\n'; - -var shares = '! shares.scl\n!\nA scale based on shares of wealth\n!\n1.\n5.\n15.\n32.\n52.\n78.\n116.\n182.\n521.\n1000.\n'; - -var shares_sum = '! shares_sum.scl\n!\nA scale based on summing shares of wealth\n!\n1\n6.0\n21.0\n53.0\n105.0\n183.0\n299.0\n481.0\n1002.0\n2/1\n'; - -var mavila = '! mavila12.scl\n!\nA 12-note mavila scale (for warping meantone-based music), 5-limit TOP\n 12\n!\n-30.99719\n 163.50770\n 358.01258\n 327.01540\n 521.52028\n 490.52310\n 685.02798\n 654.03080\n 848.53568\n 1043.04057\n 1012.04338\n 1206.54826\n'; - -var carlos_alpha = '! carlos_alpha.scl\n!\nWendy Carlos\' Alpha scale with perfect fifth divided in nine\n 18\n!\n 78.00000\n 156.00000\n 234.00000\n 312.00000\n 390.00000\n 468.00000\n 546.00000\n 624.00000\n 702.00000\n 780.00000\n 858.00000\n 936.00000\n 1014.00000\n 1092.00000\n 1170.00000\n 1248.00000\n 1326.00000\n 1404.00000\n'; - -var lamonte = '! young-lm_piano.scl\n!\nLaMonte Young\'s Well-Tempered Piano\n12\n!\n567/512\n9/8\n147/128\n21/16\n1323/1024\n189/128\n3/2\n49/32\n7/4\n441/256\n63/32\n2/1\n'; - -var colundi = '! colundi.scl\n!\nColundi scale\n10\n!\n9/8\n171/140\n137/112\n43/35\n3/2\n421/280\n213/140\n263/150\n66/35\n2/1\n'; - -var liu_major = '! liu_major.scl\n!\nLinus Liu\'s Major Scale, see his 1978 book, "Intonation Theory" \n 7\n!\n 10/9\n 100/81\n 4/3\n 3/2\n 5/3\n 50/27\n 2/1\n'; -var liu_pentatonic = '! liu_pent.scl\n!\nLinus Liu\'s "pentatonic scale" \n 7\n!\n 9/8\n 81/64\n 27/20\n 3/2\n 27/16\n 243/128\n 81/40\n'; - -var liu_minor = '! LIU_MINor.scl\n!\nLinus Liu\'s Harmonic Minor \n 7\n!\n 10/9\n 6/5\n 4/3\n 40/27\n 8/5\n 50/27\n 2/1\n'; - -var liu_melodic_minor = '! liu_mel.scl\n!\nLinus Liu\'s Melodic Minor, use 5 and 7 descending and 6 and 8 ascending \n 9\n!\n 10/9\n 6/5\n 4/3\n 3/2\n 81/50\n 5/3\n 9/5\n 50/27\n 2/1\n'; - -var scales = [{ - intervals: '1/1 9/8 5/4 4/3 3/2 5/3 15/8 2/1', - name: "harmonic scale" -}, { - root: 450, - intervals: '1/1 9/8 5/4 4/3 3/2 5/3 15/8 2/1', - name: "harmonic scale @ 450" -}, { - tet: 5 -}, { - tet: 12 -}, { - tet: 17 -}, { - intervals: '1/1 81/80 33/32 21/20 16/15 12/11 11/10 10/9 9/8 8/7 7/6 32/27 6/5 11/9 5/4 14/11 9/7 21/16 4/3 27/20 11/8 7/5 10/7 16/11 40/27 3/2 32/21 14/9 11/7 8/5 18/11 5/3 27/16 12/7 7/4 16/9 9/5 20/11 11/6 15/8 40/21 64/33 160/81 2/1', - name: "harry partch scale" -}, { - scl: lamonte -}, { - scl: meantone -}, { - scl: mavila -}, { - scl: carlos_alpha -}, { - scl: colundi -}, { - scl: shares -}, { - scl: shares_sum -}, { - scl: liu_major -}, { - scl: liu_minor -}, { - scl: liu_melodic_minor -}, { - scl: liu_pentatonic -}].map(function (opt) { - return new _intonation2.default(opt); -}); - -var scale = scales[0]; -var handleChange = function handleChange() {}; - -function build() { - scales.forEach(function (scale, i) { - scale.heading = document.createElement('div'); - scale.heading.innerHTML = scale.name; - scale.heading.classList.add('heading'); - scale.heading.addEventListener('click', function () { - pick(i); - }); - scale_list.appendChild(scale.heading); - }); - pick(0); -} -function build_options(el) { - scales.forEach(function (scale, i) { - var option = document.createElement('option'); - option.innerHTML = scale.name; - option.value = i; - el.appendChild(option); - }); - el.addEventListener('input', function (e) { - pick(e.target.value); - }); - pick(0); -} - -function pick(i) { - if (scale) { - scale.heading && scale.heading.classList.remove('selected'); - } - scale = scales[i]; - scale.heading && scale.heading.classList.add('selected'); - handleChange(scale); -} - -function current() { - return scale; -} - -function onChange(fn) { - handleChange = fn; -} - -function names() { - return scales.map(function (scale) { - return scale.name; - }); -} - -exports.default = { scales: scales, current: current, build: build, build_options: build_options, pick: pick, names: names, onChange: onChange }; - -/***/ }), -/* 54 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.nx = undefined; - -var _keys = __webpack_require__(87); - -var _keys2 = _interopRequireDefault(_keys); - -exports.update_value_on_change = update_value_on_change; -exports.update_radio_value_on_change = update_radio_value_on_change; -exports.build_options = build_options; - -var _nexusui = __webpack_require__(56); - -var _nexusui2 = _interopRequireDefault(_nexusui); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var nx = exports.nx = window.nx = {}; - -/* ui - update an int/float value */ - -function update_value_on_change(el, id, is_int, fn) { - var label = document.querySelector(id + ' + .val'); - var update = function update(v) { - label.innerHTML = is_int ? parseInt(v) : v.toFixed(2); - fn && fn(v); - }; - el.on('change', update); - update(el.value); - el.update = update; -} - -/* ui - update a radio button */ - -function update_radio_value_on_change(el, id, values, fn) { - var old_v = el.active; - var label = document.querySelector(id + ' + .val'); - var update = function update(v) { - if (v === -1) { - v = el.active = old_v; - } else { - old_v = v; - } - label.innerHTML = values[v][1]; - fn && fn(v); - }; - el.on('change', update); - update(el.active); - el.update = update; -} - -/* ui - bind/build a select dropdown */ - -function build_options(el, lists, fn) { - (0, _keys2.default)(lists).forEach(function (key) { - var list = lists[key]; - var option = document.createElement('option'); - option.innerHTML = list.name; - option.value = key; - el.appendChild(option); - }); - el.addEventListener('input', function (e) { - fn(e.target.value); - }); -} - -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _isIterable2 = __webpack_require__(85); - -var _isIterable3 = _interopRequireDefault(_isIterable2); - -var _getIterator2 = __webpack_require__(84); - -var _getIterator3 = _interopRequireDefault(_getIterator2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function () { - function sliceIterator(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"]) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - return function (arr, i) { - if (Array.isArray(arr)) { - return arr; - } else if ((0, _isIterable3.default)(Object(arr))) { - return sliceIterator(arr, i); - } else { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - }; -}(); - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -(function webpackUniversalModuleDefinition(root, factory) { - if(true) - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["Nexus"] = factory(); - else - root["Nexus"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var NexusUI = _interopRequire(__webpack_require__(1)); - - module.exports = NexusUI; - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - exports.colors = colors; - exports.context = context; - exports.clock = clock; - Object.defineProperty(exports, "__esModule", { - value: true - }); - "use strict"; - - var Interfaces = _interopRequire(__webpack_require__(2)); - - var math = _interopRequire(__webpack_require__(5)); - - var Rack = _interopRequire(__webpack_require__(38)); - - var Tune = _interopRequire(__webpack_require__(40)); - - var Transform = _interopRequireWildcard(__webpack_require__(39)); - - var Counter = __webpack_require__(28); - var Radio = __webpack_require__(41); - var Drunk = __webpack_require__(27); - var Sequence = __webpack_require__(26); - var Matrix = __webpack_require__(25); - - var WAAClock = _interopRequire(__webpack_require__(42)); - - var Interval = _interopRequire(__webpack_require__(45)); - - /** - NexusUI => created as Nexus - */ - - var NexusUI = (function () { - function NexusUI(context) { - _classCallCheck(this, NexusUI); - - for (var key in Interfaces) { - this[key] = Interfaces[key]; - } - - for (var key in math) { - this[key] = math[key]; - } - - var Core = { - Rack: Rack - }; - - var Models = { - Counter: Counter, - Radio: Radio, - Drunk: Drunk, - Sequence: Sequence, - Matrix: Matrix - }; - - for (var key in Models) { - this[key] = Models[key]; - } - - for (var key in Core) { - this[key] = Core[key]; - } - - var DefaultContext = window.AudioContext || window.webkitAudioContext; - this._context = context || new DefaultContext(); - - this.tune = new Tune(); - this.note = this.tune.note.bind(this.tune); - - this.clock = new WAAClock(this._context); - this.clock.start(); - this.Interval = Interval; - - this.colors = { - accent: "#2bb", - fill: "#eee", - light: "#fff", - dark: "#333", - mediumLight: "#ccc", - mediumDark: "#666" - }; - - this.transform = Transform; - this.add = Transform.add; - - this.Add = {}; - for (var key in Interfaces) { - this.Add[key] = Transform.add.bind(this, key); - } - - /* create default component size */ - /* jshint ignore:start */ - var existingStylesheets = document.getElementsByTagName("style"); - var defaultSizeDeclaration = "[nexus-ui]{height:5000px;width:5000px}"; - var defaultStyleNode = document.createElement("style"); - defaultStyleNode.type = "text/css"; - defaultStyleNode.innerHTML = defaultSizeDeclaration; - if (existingStylesheets.length > 0) { - var parent = existingStylesheets[0].parentNode; - parent.insertBefore(defaultStyleNode, existingStylesheets[0]); - } else { - document.write("<style>" + defaultSizeDeclaration + "</style>"); - } - /* jshint ignore:end */ - } - - _createClass(NexusUI, { - context: { - get: function () { - return this._context; - }, - set: function (ctx) { - this.clock.stop(); - this._context = ctx; - this.clock = new WAAClock(this.context); - this.clock.start(); - } - } - }); - - return NexusUI; - })(); - - var Nexus = new NexusUI(); - - function colors() { - return Nexus.colors; - } - - function context() { - return Nexus.context; - } - - function clock() { - return Nexus.clock; - } - - exports["default"] = Nexus; - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - module.exports = { - Position: __webpack_require__(3), - Slider: __webpack_require__(14), - Toggle: __webpack_require__(15), - /* Range: require('./rangeslider'), - Waveform: require('./waveform'), */ - Button: __webpack_require__(16), - TextButton: __webpack_require__(18), - RadioButton: __webpack_require__(19), - Number: __webpack_require__(20), - Select: __webpack_require__(21), - Dial: __webpack_require__(22), - Piano: __webpack_require__(23), - Sequencer: __webpack_require__(24), - Pan2D: __webpack_require__(29), - Tilt: __webpack_require__(30), - Multislider: __webpack_require__(31), - Pan: __webpack_require__(33), - Envelope: __webpack_require__(34), - Spectrogram: __webpack_require__(35), - Meter: __webpack_require__(36), - Oscilloscope: __webpack_require__(37) - }; - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - - - "use strict"; - - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var Interface = __webpack_require__(6); - var Step = __webpack_require__(11); - - var Interaction = _interopRequireWildcard(__webpack_require__(12)); - - /** - * Position - * - * @description Two-dimensional touch slider. - * - * @demo <span nexus-ui="position"></span> - * - * @example - * var position = new Nexus.Position('#target') - * - * @example - * var position = new Nexus.Position('#target',{ - * 'size': [200,200], - * 'mode': 'absolute', // "absolute" or "relative" - * 'x': 0.5, // initial x value - * 'minX': 0, - * 'maxX': 1, - * 'stepX': 0, - * 'y': 0.5, // initial y value - * 'minY': 0, - * 'maxY': 1, - * 'stepY': 0 - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * The event data is an object with x and y properties containing the x and y values of the interface. - * - * @outputexample - * position.on('change',function(v) { - * console.log(v); - * }) - * - * - */ - - var Position = (function (_Interface) { - function Position() { - _classCallCheck(this, Position); - - var options = ["value"]; - - var defaults = { - size: [200, 200], - mode: "absolute", - minX: 0, - maxX: 1, - stepX: 0, - x: 0.5, - minY: 0, - maxY: 1, - stepY: 0, - y: 0.5 - }; - - _get(Object.getPrototypeOf(Position.prototype), "constructor", this).call(this, arguments, options, defaults); - - this._x = new Step(this.settings.minX, this.settings.maxX, this.settings.stepX, this.settings.x); - this._y = new Step(this.settings.minY, this.settings.maxY, this.settings.stepY, this.settings.y); - - this.position = { - x: new Interaction.Handle(this.settings.mode, "horizontal", [0, this.width], [this.height, 0]), - y: new Interaction.Handle(this.settings.mode, "vertical", [0, this.width], [this.height, 0]) - }; - this.position.x.value = this._x.normalized; - this.position.y.value = this._y.normalized; - - this.init(); - this.render(); - } - - _inherits(Position, _Interface); - - _createClass(Position, { - buildInterface: { - value: function buildInterface() { - - this.knob = svg.create("circle"); - this.element.appendChild(this.knob); - } - }, - sizeInterface: { - value: function sizeInterface() { - - this.position.x.resize([0, this.width], [this.height, 0]); - this.position.y.resize([0, this.width], [this.height, 0]); - - this._minDimension = Math.min(this.width, this.height); - - this.knobRadius = { - off: ~ ~(this._minDimension / 100) * 5 + 5 }; - this.knobRadius.on = this.knobRadius.off * 2; - - this.knob.setAttribute("cx", this.width / 2); - this.knob.setAttribute("cy", this.height / 2); - this.knob.setAttribute("r", this.knobRadius.off); - } - }, - colorInterface: { - value: function colorInterface() { - this.element.style.backgroundColor = this.colors.fill; - this.knob.setAttribute("fill", this.colors.accent); - } - }, - render: { - value: function render() { - if (this.clicked) { - // this.knobRadius = 30; - this.knob.setAttribute("r", this.knobRadius.on); - } else { - // this.knobRadius = 15; - this.knob.setAttribute("r", this.knobRadius.off); - } - - this.knobCoordinates = { - x: this._x.normalized * this.width, - y: this.height - this._y.normalized * this.height - }; - - this.knob.setAttribute("cx", this.knobCoordinates.x); - this.knob.setAttribute("cy", this.knobCoordinates.y); - } - }, - click: { - value: function click() { - this.position.x.anchor = this.mouse; - this.position.y.anchor = this.mouse; - this.move(); - } - }, - move: { - value: function move() { - if (this.clicked) { - this.position.x.update(this.mouse); - this.position.y.update(this.mouse); - this._x.updateNormal(this.position.x.value); - this._y.updateNormal(this.position.y.value); - this.emit("change", { - x: this._x.value, - y: this._y.value - }); - this.render(); - } - } - }, - release: { - value: function release() { - this.render(); - } - }, - x: { - - /** - * The interface's x value. When set, it will automatically adjust to fit min/max/step settings of the interface. - * @type {object} - * @example position.x = 0.5; - */ - - get: function () { - return this._x.value; - }, - set: function (value) { - this._x.update(value); - this.emit("change", { - x: this._x.value, - y: this._y.value - }); - this.render(); - } - }, - y: { - - /** - * The interface's y values. When set, it will automatically adjust to fit min/max/step settings of the interface. - * @type {object} - * @example position.x = 0.5; - */ - - get: function () { - return this._y.value; - }, - set: function (value) { - this._y.update(value); - this.emit("change", { - x: this._x.value, - y: this._y.value - }); - this.render(); - } - }, - normalized: { - get: function () { - return { - x: this._x.normalized, - y: this._y.normalized - }; - } - }, - minX: { - - /** - * The lower limit of value on the x axis - * @type {object} - */ - - get: function () { - return this._x.min; - }, - set: function (v) { - this._x.min = v; - this.render(); - } - }, - minY: { - - /** - * The lower limit of value on the y axis - * @type {object} - */ - - get: function () { - return this._y.min; - }, - set: function (v) { - this._y.min = v; - this.render(); - } - }, - maxX: { - - /** - * The upper limit of value on the x axis - * @type {object} - */ - - get: function () { - return this._x.max; - }, - set: function (v) { - this._x.max = v; - this.render(); - } - }, - maxY: { - - /** - * The upper limit of value on the y axis - * @type {object} - */ - - get: function () { - return this._y.max; - }, - set: function (v) { - this._y.max = v; - this.render(); - } - }, - stepX: { - - /** - * The incremental step of values on the x axis - * @type {object} - */ - - get: function () { - return this._x.step; - }, - set: function (v) { - this._x.step = v; - this.render(); - } - }, - stepY: { - - /** - * The incremental step of values on the y axis - * @type {object} - */ - - get: function () { - return this._y.step; - }, - set: function (v) { - this._y.step = v; - this.render(); - } - }, - mode: { - - /** - Absolute mode (position's value jumps to mouse click position) or relative mode (mouse drag changes value relative to its current position). Default: "absolute". - @type {string} - @example position.mode = "relative"; - */ - - get: function () { - return this.position.x.mode; - }, - set: function (v) { - this.position.x.mode = v; - this.position.y.mode = v; - } - } - }); - - return Position; - })(Interface); - - module.exports = Position; - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var math = __webpack_require__(5); - - module.exports = { - - create: function (type) { - return document.createElementNS("http://www.w3.org/2000/svg", type); - }, - - arc: function (x, y, radius, startAngle, endAngle) { - - var start = math.toCartesian(radius, endAngle); - var end = math.toCartesian(radius, startAngle); - - var largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1"; - - var d = ["M", start.x + x, start.y + y, "A", radius, radius, 0, largeArcFlag, 0, end.x + x, end.y + y].join(" "); - - return d; - }, - - radialGradient: function (defs, numberOfStops) { - - var id = "gradient" + math.ri(100000000000); - var stops = []; - - var gradient = document.createElementNS("http://www.w3.org/2000/svg", "radialGradient"); - gradient.setAttribute("id", id); - gradient.setAttribute("cx", "50%"); - gradient.setAttribute("cy", "50%"); - gradient.setAttribute("r", "50%"); - - defs.appendChild(gradient); - - for (var i = 0; i < numberOfStops; i++) { - var _stop = document.createElementNS("http://www.w3.org/2000/svg", "stop"); - _stop.setAttribute("id", "stop" + i); - //stop.setAttribute('offset', '70%'); - //stop.setAttribute('stop-color', 'White'); - gradient.appendChild(_stop); - stops.push(_stop); - } - - return { - id: id, - stops: stops, - element: gradient - }; - } - - }; - -/***/ }), -/* 5 */ -/***/ (function(module, exports) { - - "use strict"; - - /** - * Limit a number to within a minimum and maximum - * @param {number} value Input value - * @param {number} min Lower limit - * @param {number} max Upper limit - * @return {number} The input value constrained within the lower and upper limits - * @example - * Nexus.clip(11,0,10) // returns 10 - * Nexus.clip(-1,0,10) // returns 0 - * Nexus.clip(5,0,10) // returns 5 - */ - - exports.clip = function (value, min, max) { - return Math.min(Math.max(value, min), max); - }; - - exports.normalize = function (value, min, max) { - return (value - min) / (max - min); - }; - - /** - * Scale a value from one range to another range. - * @param {number} inNum Input value - * @param {number} inMin Input range minimum - * @param {number} inMax Input range maximum - * @param {number} outMin Output range minimum - * @param {number} outMax Output range maximum - * @return {number} The input value scaled to its new range - * @example - * Nexus.scale(0.5,0,1,0,10) // returns 5 - * Nexus.scale(0.9,0,1,1,0) // returns 0.1 - */ - exports.scale = function (inNum, inMin, inMax, outMin, outMax) { - if (inMin === inMax) { - return outMin; - } - return (inNum - inMin) * (outMax - outMin) / (inMax - inMin) + outMin; - }; - - exports.toPolar = function (x, y) { - var r = Math.sqrt(x * x + y * y); - - var theta = Math.atan2(y, x); - if (theta < 0) { - theta = theta + 2 * Math.PI; - } - return { radius: r, angle: theta }; - }; - - exports.toCartesian = function (radius, angle) { - var cos = Math.cos(angle); - var sin = Math.sin(angle); - return { x: radius * cos, y: radius * sin * -1 }; - }; - /* - exports.polarToCartesian(centerX, centerY, radius, angleInDegrees) { - var angleInRadians = (angleInDegrees-90) * Math.PI / 180.0; - - return { - x: centerX + (radius * Math.cos(angleInRadians)), - y: centerY + (radius * Math.sin(angleInRadians)) - }; - } */ - - exports.prune = function (data, scale) { - return parseFloat(data.toFixed(scale)); - }; - - exports.invert = function (inNum) { - return exports.scale(inNum, 1, 0, 0, 1); - }; - - /** - * Convert a MIDi note number to a frequency value in equal temperament. - * @param {number} midi MIDI note value - * @return {number} Frequence value - * @example - * Nexus.mtof(60) // returns the frequency number of Middle C - */ - exports.mtof = function (midi) { - return Math.pow(2, (midi - 69) / 12) * 440; - }; - - /** - * Interpolate between two numbers - * @param {number} loc Interpolation index (0-1) - * @param {number} min Lower value - * @param {number} max Upper value - * @return {number} Interpolated value - * @example - * Nexus.interp(0.5,2,4) // returns 3 - * Nexus.interp(0.1,0,10) // returns 1 - */ - exports.interp = function (loc, min, max) { - return loc * (max - min) + min; - }; - - /** - * Return a random choice from a list of arguments - * @return {various} One random argument - * @example - * Nexus.pick(1,2,3,4) // returns 1, 2, 3, or 4 - * Nexus.pick(function1,function2) // returns either function1 or function2 - */ - exports.pick = function () { - return arguments[~ ~(Math.random() * arguments.length)]; - }; - - /** - * Returns an octave multiplier for frequency values - * @param {number} num Relative octave number (e.g. -1 for one octave down, 1 for one octave up) - * @return {number} Octave multiplier - * @example - * Nexus.octave(-1) // returns 0.5 - * Nexus.octave(0) // returns 1 - * Nexus.octave(1) // returns 2 - * Nexus.octave(2) // returns 4 - */ - exports.octave = function (num) { - return Math.pow(2, num); - }; - - /** - * Random integer generator. If no second argument is given, will return random integer from 0 to bound1. - * @param {number} bound1 Minimum random value - * @param {number} bound2 Maximum random value - * @return {number} Random integer between lower and upper boundary - * @example - * Nexus.ri(10) // returns random int from 0 to 10 - * Nexus.ri(20,2000) // returns random int from 20 to 2000 - */ - exports.ri = function (bound1, bound2) { - if (!bound2) { - bound2 = bound1; - bound1 = 0; - } - var low = Math.min(bound1, bound2); - var high = Math.max(bound1, bound2); - return Math.floor(Math.random() * (high - low) + low); - }; - - /** - * Random float number generator. If no second argument is given, will return random float from 0 to bound1. - * @param {number} bound1 Minimum random value - * @param {number} bound2 Maximum random value - * @return {number} Random float between lower and upper boundary - * @example - * Nexus.rf(1) // returns random float from 0 to 1 - * Nexus.rf(1,2) // returns random float from 1 to 2 - */ - exports.rf = function (bound1, bound2) { - if (!bound2) { - bound2 = bound1; - bound1 = 0; - } - var low = Math.min(bound1, bound2); - var high = Math.max(bound1, bound2); - return Math.random() * (high - low) + low; - }; - - exports.cycle = function (input, min, max) { - input++; - if (input >= max) { - input = min; - } - return input; - }; - - /** - * Average an array of numbers - * @param {Array} data Array of numbers to average - * @return {number} Average of the input data - * @example - * Nexus.average([0,2,4,6,8,10]) // returns 5 - */ - exports.average = function (data) { - var total = 0; - for (var i = 0; i < data.length; i++) { - total += data[i]; - } - return total / data.length; - }; - - /** - * Get the distance from one (x,y) point to another (x,y) point - * @param {number} x1 x of first point - * @param {number} y1 y of first point - * @param {number} x2 x of second point - * @param {number} y2 y of second poiny - * @return {number} Distance - * @example - * Nexus.distance(0,0,3,4) // returns 5 - */ - exports.distance = function (x1, y1, x2, y2) { - var a = x1 - x2; - var b = y1 - y2; - return Math.sqrt(a * a + b * b); - }; - - exports.gainToDB = function (gain) { - return 20 * Math.log10(gain); - }; - - /** - * Flip a coin, returning either 0 or 1 according to a probability - * @param {number} [odds=0.5] Likelihood of returning 1 - * @return {number} 1 or 0 - * @example - * Nexus.coin(0.1) // returns 1 (10% of the time) or 0 (90% of the time) - */ - exports.coin = function () { - var odds = arguments[0] === undefined ? 0.5 : arguments[0]; - - if (exports.rf(0, 1) < odds) { - return 1; - } else { - return 0; - } - }; - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var dom = __webpack_require__(7); - var util = __webpack_require__(8); - var touch = __webpack_require__(9); - var EventEmitter = __webpack_require__(10); - - var colors = __webpack_require__(1).colors; - - /** - Interface - */ - - var Interface = (function (_EventEmitter) { - function Interface(args, options, defaults) { - _classCallCheck(this, Interface); - - _get(Object.getPrototypeOf(Interface.prototype), "constructor", this).call(this); - this.type = this.constructor.name; - this.settings = this.parseSettings(args, options, defaults); - this.mouse = {}; - this.wait = false; - this.colors = {}; - var defaultColors = colors(); // jshint ignore:line - this.colors.accent = defaultColors.accent; - this.colors.fill = defaultColors.fill; - this.colors.light = defaultColors.light; - this.colors.dark = defaultColors.dark; - this.colors.mediumLight = defaultColors.mediumLight; - this.colors.mediumDark = defaultColors.mediumDark; - } - - _inherits(Interface, _EventEmitter); - - _createClass(Interface, { - parseSettings: { - value: function parseSettings(args, options, defaults) { - - options.unshift("target"); - defaults.defaultSize = defaults.size.splice(0, 2); - defaults.size = false; - - var settings = { - target: document.body, - colors: {}, // should inherit from a colors module, - snapWithParent: true, - event: function event() {}, - component: false - }; - - for (var key in defaults) { - settings[key] = defaults[key]; - } - - for (var i = 0; i < args.length; i++) { - // grabs the next argument - var setting = args[i]; - // if it's an object, it must be the settings object - if (util.isObject(setting)) { - for (var key in setting) { - settings[key] = setting[key]; - } - // if it's a function, it must be the event setting - } else if (typeof setting === "function") { - settings.event = setting; - // otherwise, consider it one of the widget's custom options - } else if (options.length >= 1) { - // grab the first option -- i.e. 'target' - var key = options.splice(0, 1)[0]; - settings[key] = setting; - } - } - - /* handle common settings */ - - // target - this.parent = dom.parseElement(settings.target); - - // nexus-ui attribute - if (this.parent && this.parent instanceof HTMLElement && !settings.component) { - if (!this.parent.hasAttribute("nexus-ui")) { - this.parent.setAttribute("nexus-ui", ""); - } - } - - // size - - if (settings.size && Array.isArray(settings.size) && settings.snapWithParent) { - this.width = settings.size[0]; - this.height = settings.size[1]; - this.parent.style.width = this.width + "px"; - this.parent.style.height = this.height + "px"; - } else if (settings.snapWithParent && !settings.component) { - - this.width = parseFloat(window.getComputedStyle(this.parent, null).getPropertyValue("width").replace("px", "")); - this.height = parseFloat(window.getComputedStyle(this.parent, null).getPropertyValue("height").replace("px", "")); - - if (this.width == 5000) { - this.width = settings.defaultSize[0]; - this.parent.style.width = this.parent.width = this.width + "px"; - } - if (this.height == 5000) { - this.height = settings.defaultSize[1]; - this.parent.style.height = this.parent.height = this.height + "px"; - } - } else { - settings.size = settings.defaultSize; - this.width = settings.size[0]; - this.height = settings.size[1]; - } - - // event - if (settings.event) { - this.event = this.on("change", settings.event); - } else { - this.event = false; - } - - return settings; - } - }, - init: { - value: function init() { - this.buildFrame(); - this.buildInterface(); - this.sizeInterface(); - this.attachListeners(); - this.colorInterface(); - this.finalTouches(); - } - }, - buildFrame: { - value: function buildFrame() { - this.element = svg.create("svg"); - this.element.setAttribute("width", this.width); - this.element.setAttribute("height", this.height); - this.parent.appendChild(this.element); - } - }, - buildInterface: { - value: function buildInterface() {} - }, - sizeInterface: { - value: function sizeInterface() {} - }, - colorInterface: { - value: function colorInterface() {} - }, - attachListeners: { - value: function attachListeners() { - var _this = this; - - this.interactionTarget = this.interactionTarget || this.element; - - // Setup interaction - if (touch.exists) { - this.interactionTarget.addEventListener("touchstart", function (evt) { - return _this.preTouch(evt); - }); - this.interactionTarget.addEventListener("touchmove", function (evt) { - return _this.preTouchMove(evt); - }); - this.interactionTarget.addEventListener("touchend", function (evt) { - return _this.preTouchRelease(evt); - }); - } - this.boundPreMove = function (evt) { - return _this.preMove(evt); - }; - this.boundPreRelease = function (evt) { - return _this.preRelease(evt); - }; - this.interactionTarget.addEventListener("mousedown", function (evt) { - return _this.preClick(evt); - }); - } - }, - finalTouches: { - value: function finalTouches() { - this.element.style.cursor = "pointer"; - } - }, - preClick: { - value: function preClick(e) { - // 10000 getComputedStyle calls takes 100 ms. - // .:. one takes about .01ms - if (this.element instanceof HTMLElement) { - this.width = window.getComputedStyle(this.element, null).getPropertyValue("width").replace("px", ""); - } - // 10000 getComputedStyle calls takes 40 ms. - // .:. one takes about .004ms - this.offset = dom.findPosition(this.element); - this.mouse = dom.locateMouse(e, this.offset); - this.clicked = true; - this.click(); - this.moveEvent = document.addEventListener("mousemove", this.boundPreMove); - this.releaseEvent = document.addEventListener("mouseup", this.boundPreRelease); - this.emit("click"); - e.preventDefault(); - e.stopPropagation(); - } - }, - preMove: { - value: function preMove(e) { - var _this = this; - - if (!this.wait) { - this.mouse = dom.locateMouse(e, this.offset); - this.move(); - this.wait = true; - setTimeout(function () { - _this.wait = false; - }, 25); - } - e.preventDefault(); - e.stopPropagation(); - } - }, - preRelease: { - value: function preRelease(e) { - this.mouse = dom.locateMouse(e, this.offset); - this.clicked = false; - this.release(); - this.emit("release"); - document.removeEventListener("mousemove", this.boundPreMove); - document.removeEventListener("mouseup", this.boundPreRelease); - e.preventDefault(); - e.stopPropagation(); - } - }, - click: { - value: function click() {} - }, - move: { - value: function move() {} - }, - release: { - value: function release() {} - }, - preTouch: { - - /* touch */ - - value: function preTouch(e) { - if (this.element instanceof HTMLElement) { - this.width = window.getComputedStyle(this.element, null).getPropertyValue("width").replace("px", ""); - } - this.offset = dom.findPosition(this.element); - this.mouse = dom.locateTouch(e, this.offset); - this.clicked = true; - this.touch(e); - this.emit("click"); - e.preventDefault(); - e.stopPropagation(); - } - }, - preTouchMove: { - value: function preTouchMove(e) { - if (this.clicked) { - this.mouse = dom.locateTouch(e, this.offset); - this.touchMove(); - e.preventDefault(); - e.stopPropagation(); - } - } - }, - preTouchRelease: { - value: function preTouchRelease(e) { - this.mouse = dom.locateTouch(e, this.offset); - this.clicked = false; - this.touchRelease(); - this.emit("release"); - e.preventDefault(); - e.stopPropagation(); - } - }, - touch: { - value: function touch() { - this.click(); - } - }, - touchMove: { - value: function touchMove() { - this.move(); - } - }, - touchRelease: { - value: function touchRelease() { - this.release(); - } - }, - resize: { - - /** - * Resize the interface - * @param width {number} New width in pixels - * @param height {number} New height in pixels - * - * @example - * button.resize(100,100); - */ - - value: function resize(width, height) { - this.width = width; - this.height = height; - this.parent.style.width = this.width + "px"; - this.parent.style.height = this.height + "px"; - this.element.setAttribute("width", this.width); - this.element.setAttribute("height", this.height); - this.sizeInterface(); - } - }, - empty: { - value: function empty() { - while (this.element.lastChild) { - this.element.removeChild(this.element.lastChild); - } - } - }, - destroy: { - - /** - * Remove the interface from the page and cancel its event listener(s). - * - * @example - * button.destroy(); - */ - - value: function destroy() { - this.empty(); - this.parent.removeChild(this.element); - this.removeAllListeners(); - if (this.instrument) { - delete this.instrument[this.id]; - } - this.customDestroy(); - } - }, - customDestroy: { - value: function customDestroy() {} - }, - colorize: { - value: function colorize(type, color) { - this.colors[type] = color; - this.colorInterface(); - } - } - }); - - return Interface; - })(EventEmitter); - - module.exports = Interface; - -/***/ }), -/* 7 */ -/***/ (function(module, exports) { - - "use strict"; - - exports.findPosition = function (el) { - var viewportOffset = el.getBoundingClientRect(); - var top = viewportOffset.top + window.scrollY; - var left = viewportOffset.left + window.scrollX; - return { top: top, left: left }; - }; - - exports.parseElement = function (parent) { - if (typeof parent === "string") { - parent = document.getElementById(parent.replace("#", "")); - } - - if (parent instanceof HTMLElement || parent instanceof SVGElement) { - return parent; - } else { - return "No valid parent argument"; - } - }; - - exports.locateMouse = function (e, offset) { - return { - x: e.pageX - offset.left, - y: e.pageY - offset.top - }; - }; - - exports.locateTouch = function (e, offset) { - return { - x: e.targetTouches.length ? e.targetTouches[0].pageX - offset.left : false, - y: e.targetTouches.length ? e.targetTouches[0].pageY - offset.top : false - }; - }; - - exports.SmartCanvas = function (parent) { - var _this = this; - - this.element = document.createElement("canvas"); - this.context = this.element.getContext("2d"); - parent.appendChild(this.element); - - this.resize = function (w, h) { - _this.element.width = w * 2; - _this.element.height = h * 2; - _this.element.style.width = w + "px"; - _this.element.style.height = h + "px"; - }; - }; - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - - "use strict"; - - exports.isObject = function (obj) { - if (typeof obj === "object" && !Array.isArray(obj) && obj !== null && obj instanceof SVGElement === false && obj instanceof HTMLElement === false) { - return true; - } else { - return false; - } - }; - -/***/ }), -/* 9 */ -/***/ (function(module, exports) { - - "use strict"; - - exports.exists = "ontouchstart" in document.documentElement; - -/***/ }), -/* 10 */ -/***/ (function(module, exports) { - - // Copyright Joyent, Inc. and other Node contributors. - // - // Permission is hereby granted, free of charge, to any person obtaining a - // copy of this software and associated documentation files (the - // "Software"), to deal in the Software without restriction, including - // without limitation the rights to use, copy, modify, merge, publish, - // distribute, sublicense, and/or sell copies of the Software, and to permit - // persons to whom the Software is furnished to do so, subject to the - // following conditions: - // - // The above copyright notice and this permission notice shall be included - // in all copies or substantial portions of the Software. - // - // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN - // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR - // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE - // USE OR OTHER DEALINGS IN THE SOFTWARE. - - function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; - } - module.exports = EventEmitter; - - // Backwards-compat with node 0.10.x - EventEmitter.EventEmitter = EventEmitter; - - EventEmitter.prototype._events = undefined; - EventEmitter.prototype._maxListeners = undefined; - - // By default EventEmitters will print a warning if more than 10 listeners are - // added to it. This is a useful default which helps finding memory leaks. - EventEmitter.defaultMaxListeners = 10; - - // Obviously not all Emitters should be limited to 10. This function allows - // that to be increased. Set to zero for unlimited. - EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; - }; - - EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; - - if (!this._events) - this._events = {}; - - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); - err.context = er; - throw err; - } - } - } - - handler = this._events[type]; - - if (isUndefined(handler)) - return false; - - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - args = Array.prototype.slice.call(arguments, 1); - handler.apply(this, args); - } - } else if (isObject(handler)) { - args = Array.prototype.slice.call(arguments, 1); - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } - - return true; - }; - - EventEmitter.prototype.addListener = function(type, listener) { - var m; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events) - this._events = {}; - - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); - - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; - - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; - } - - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); - } - } - } - - return this; - }; - - EventEmitter.prototype.on = EventEmitter.prototype.addListener; - - EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - var fired = false; - - function g() { - this.removeListener(type, g); - - if (!fired) { - fired = true; - listener.apply(this, arguments); - } - } - - g.listener = listener; - this.on(type, g); - - return this; - }; - - // emits a 'removeListener' event iff the listener was removed - EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events || !this._events[type]) - return this; - - list = this._events[type]; - length = list.length; - position = -1; - - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); - - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } - - if (this._events.removeListener) - this.emit('removeListener', type, listener); - } - - return this; - }; - - EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; - - if (!this._events) - return this; - - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; - } - - listeners = this._events[type]; - - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); - } - delete this._events[type]; - - return this; - }; - - EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; - }; - - EventEmitter.prototype.listenerCount = function(type) { - if (this._events) { - var evlistener = this._events[type]; - - if (isFunction(evlistener)) - return 1; - else if (evlistener) - return evlistener.length; - } - return 0; - }; - - EventEmitter.listenerCount = function(emitter, type) { - return emitter.listenerCount(type); - }; - - function isFunction(arg) { - return typeof arg === 'function'; - } - - function isNumber(arg) { - return typeof arg === 'number'; - } - - function isObject(arg) { - return typeof arg === 'object' && arg !== null; - } - - function isUndefined(arg) { - return arg === void 0; - } - - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var math = __webpack_require__(5); - - /** - Creates a steppable value with minimum, maximum, and step size. This is used in many interfaces to constrict their values to certain ranges. - @param {number} [min=0] minimum - @param {number} [max=1] maximum - @param {number} [step=0] - @param {number} [value=0] initial value - @returns {Object} Step - */ - - var Step = (function () { - function Step() { - var min = arguments[0] === undefined ? 0 : arguments[0]; - var max = arguments[1] === undefined ? 1 : arguments[1]; - var step = arguments[2] === undefined ? 0 : arguments[2]; - var value = arguments[3] === undefined ? 0 : arguments[3]; - - _classCallCheck(this, Step); - - //Object.assign(this,{min,max,step}); - //Cannot use Object.assign because not supported in Safari. - //I would expect for Babel to take care of this but it is not. - this.min = min; - this.max = max; - this.step = step; - this.value = value; - this.changed = false; - this.oldValue = false; - this.update(this.value); - } - - _createClass(Step, { - update: { - - /** - Update with a new value. The value will be auto-adjusted to fit the min/max/step. - @param {number} value - */ - - value: function update(value) { - if (this.step) { - // this.value = math.clip(Math.round(value / (this.step)) * this.step, this.min,this.max); - this.value = math.clip(Math.round((value - this.min) / this.step) * this.step + this.min, this.min, this.max); - } else { - this.value = math.clip(value, this.min, this.max); - } - if (this.oldValue !== this.value) { - this.oldValue = this.value; - this.changed = true; - } else { - this.changed = false; - } - return this.value; - } - }, - updateNormal: { - - /** - Update with a normalized value 0-1. - @param {number} value - */ - - value: function updateNormal(value) { - this.value = math.scale(value, 0, 1, this.min, this.max); - return this.update(this.value); - } - }, - normalized: { - - /** - Get a normalized version of this.value . Not settable. - */ - - get: function () { - return math.normalize(this.value, this.min, this.max); - } - } - }); - - return Step; - })(); - - module.exports = Step; - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - "use strict"; - - var math = _interopRequire(__webpack_require__(5)); - - var ToggleModel = _interopRequire(__webpack_require__(13)); - - /* - how to use : - - dial.interaction = new Handle('radial','relative',this.width,this.height); - // dial.interaction.mode = 'relative' - // dial.interaction.direction = 'radial' - - on click: - dial.interaction.anchor = this.mouse; - - on move: - dial.interaction.update(this.mouse); - - console.log( dial.interaction.value ); should be a normalized value. - - */ - - /* - absolute/relative are property: mode - radial/vertical/horizontal/2d are property: direction - - plan : - - if relative -- - NO on click, get value offset between current value and click value. - NO on move, use click value - offset - INSTEAD - use delta -- bc vertical motion on dial is impossible otherwise - also allow to set sensitivity - - */ - - var Handle = exports.Handle = (function () { - function Handle() { - var mode = arguments[0] === undefined ? "absolute" : arguments[0]; - var direction = arguments[1] === undefined ? "vertical" : arguments[1]; - var xbound = arguments[2] === undefined ? [0, 100] : arguments[2]; - var ybound = arguments[3] === undefined ? [0, 100] : arguments[3]; - - _classCallCheck(this, Handle); - - this.mode = mode; - this.direction = direction; - this.previous = 0; - this.value = 0; - this.sensitivity = 1; - this.resize(xbound, ybound); - } - - _createClass(Handle, { - resize: { - value: function resize(xbound, ybound) { - this.boundary = { - min: { - x: xbound[0], - y: ybound[0] - }, - max: { - x: xbound[1], - y: ybound[1] - }, - center: { - x: (xbound[1] - xbound[0]) / 2 + xbound[0], - y: (ybound[1] - ybound[0]) / 2 + ybound[0] - } - }; - } - }, - anchor: { - set: function (mouse) { - this._anchor = this.convertPositionToValue(mouse); - }, - get: function () { - return this._anchor; - } - }, - update: { - value: function update(mouse) { - if (this.mode === "relative") { - var increment = this.convertPositionToValue(mouse) - this.anchor; - if (Math.abs(increment) > 0.5) { - increment = 0; - } - this.anchor = mouse; - this.value = this.value + increment * this.sensitivity; - } else { - this.value = this.convertPositionToValue(mouse); - } - this.value = math.clip(this.value, 0, 1); - } - }, - convertPositionToValue: { - value: function convertPositionToValue(current) { - switch (this.direction) { - case "radial": - var position = math.toPolar(current.x - this.boundary.center.x, current.y - this.boundary.center.y); - position = position.angle / (Math.PI * 2); - position = (position - 0.25 + 1) % 1; - return position; - case "vertical": - return math.scale(current.y, this.boundary.min.y, this.boundary.max.y, 0, 1); - case "horizontal": - return math.scale(current.x, this.boundary.min.x, this.boundary.max.x, 0, 1); - } - } - } - }); - - return Handle; - })(); - - var Button = exports.Button = (function () { - function Button() { - var mode = arguments[0] === undefined ? "button" : arguments[0]; - - _classCallCheck(this, Button); - - this.mode = mode; - this.state = new ToggleModel(); - this.paintbrush = false; - } - - _createClass(Button, { - click: { - value: function click() { - switch (this.mode) { - case "impulse": - this.state.on(); - if (this.timeout) { - clearTimeout(this.timeout); - } - this.timeout = setTimeout(this.state.off.bind(this), 30); - this.emit("change", this.state); - break; - case "button": - this.turnOn(); - this.emit("change", this.state); - break; - case "aftertouch": - this.position = { - x: math.clip(this.mouse.x / this.width, 0, 1), - y: math.clip(1 - this.mouse.y / this.height, 0, 1) - }; - this.turnOn(); - this.emit("change", { - state: this.state, - x: this.position.x, - y: this.position.y }); - break; - case "toggle": - this.flip(); - this.emit("change", this.state); - break; - } - } - }, - move: { - value: function move() { - if (this.mode === "aftertouch") { - this.position = { - x: math.clip(this.mouse.x / this.width, 0, 1), - y: math.clip(1 - this.mouse.y / this.height, 0, 1) - }; - this.emit("change", { - state: this.state, - x: this.position.x, - y: this.position.y }); - this.render(); - } - } - }, - release: { - value: function release() { - switch (this.mode) { - case "button": - this.turnOff(); - this.emit("change", this.state); - break; - case "aftertouch": - this.turnOff(); - this.position = { - x: this.mouse.x / this.width, - y: 1 - this.mouse.y / this.height - }; - this.emit("change", { - state: this.state, - x: this.position.x, - y: this.position.y }); - break; - } - } - } - }); - - return Button; - })(); - -/***/ }), -/* 13 */ -/***/ (function(module, exports) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var Toggle = (function () { - function Toggle(state) { - _classCallCheck(this, Toggle); - - this.state = state || false; - } - - _createClass(Toggle, { - flip: { - value: function flip(state) { - if (state || state === false) { - this.state = state; - } else { - this.state = !this.state; - } - } - }, - on: { - value: function on() { - this.state = true; - } - }, - off: { - value: function off() { - this.state = false; - } - } - }); - - return Toggle; - })(); - - module.exports = Toggle; - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var Interface = __webpack_require__(6); - var Step = __webpack_require__(11); - - var Interaction = _interopRequireWildcard(__webpack_require__(12)); - - /** - * Slider - * - * @description Horizontal or vertical slider with settable interaction modes. - * - * @demo <span nexus-ui="slider" step=0.2></span> - * - * @example - * var slider = new Nexus.Slider('#target') - * - * @example - * var slider = new Nexus.Slider('#target',{ - * 'size': [120,20], - * 'mode': 'relative', // 'relative' or 'absolute' - * 'min': 0, - * 'max': 1, - * 'step': 0, - * 'value': 0 - * }) - * - * @output - * change - * Fires when the interface's value changes. <br> - * Event data: <i>number</i> The number value of the interface. - * - * @outputexample - * slider.on('change',function(v) { - * console.log(v); - * }) - * - * - */ - - var Slider = (function (_Interface) { - function Slider() { - _classCallCheck(this, Slider); - - var options = ["min", "max", "value"]; - - var defaults = { - size: [120, 20], - mode: "relative", // 'relative' or 'absolute' - min: 0, - max: 1, - step: 0, - value: 0 - }; - - _get(Object.getPrototypeOf(Slider.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.orientation = "vertical"; // This will change automatically to 'horizontal'if the interface is wider than it is tall. - - this._value = new Step(this.settings.min, this.settings.max, this.settings.step, this.settings.value); - - this.position = new Interaction.Handle(this.settings.mode, this.orientation, [0, this.width], [this.height, 0]); - this.position.value = this._value.normalized; - - this.init(); - - this.position.direction = this.orientation; - - this.emit("change", this.value); - } - - _inherits(Slider, _Interface); - - _createClass(Slider, { - buildInterface: { - value: function buildInterface() { - - this.bar = svg.create("rect"); - this.fillbar = svg.create("rect"); - this.knob = svg.create("circle"); - - this.element.appendChild(this.bar); - this.element.appendChild(this.fillbar); - this.element.appendChild(this.knob); - } - }, - sizeInterface: { - value: function sizeInterface() { - - if (this.width < this.height) { - this.orientation = "vertical"; - } else { - this.orientation = "horizontal"; - } - - if (this.position) { - this.position.resize([0, this.width], [this.height, 0]); - } - - var x = undefined, - y = undefined, - w = undefined, - h = undefined, - barOffset = undefined, - cornerRadius = undefined; - this.knobData = { - level: 0, - r: 0 - }; - - if (this.orientation === "vertical") { - this.thickness = this.width / 2; - x = this.width / 2; - y = 0; - w = this.thickness; - h = this.height; - this.knobData.r = this.thickness * 0.8; - this.knobData.level = h - this.knobData.r - this.normalized * (h - this.knobData.r * 2); - barOffset = "translate(" + this.thickness * -1 / 2 + ",0)"; - cornerRadius = w / 2; - } else { - this.thickness = this.height / 2; - x = 0; - y = this.height / 2; - w = this.width; - h = this.thickness; - this.knobData.r = this.thickness * 0.8; - this.knobData.level = this.normalized * (w - this.knobData.r * 2) + this.knobData.r; - barOffset = "translate(0," + this.thickness * -1 / 2 + ")"; - cornerRadius = h / 2; - } - - this.bar.setAttribute("x", x); - this.bar.setAttribute("y", y); - this.bar.setAttribute("transform", barOffset); - this.bar.setAttribute("rx", cornerRadius); // corner radius - this.bar.setAttribute("ry", cornerRadius); - this.bar.setAttribute("width", w); - this.bar.setAttribute("height", h); - - if (this.orientation === "vertical") { - this.fillbar.setAttribute("x", x); - this.fillbar.setAttribute("y", this.knobData.level); - this.fillbar.setAttribute("width", w); - this.fillbar.setAttribute("height", h - this.knobData.level); - } else { - this.fillbar.setAttribute("x", 0); - this.fillbar.setAttribute("y", y); - this.fillbar.setAttribute("width", this.knobData.level); - this.fillbar.setAttribute("height", h); - } - this.fillbar.setAttribute("transform", barOffset); - this.fillbar.setAttribute("rx", cornerRadius); - this.fillbar.setAttribute("ry", cornerRadius); - - if (this.orientation === "vertical") { - this.knob.setAttribute("cx", x); - this.knob.setAttribute("cy", this.knobData.level); - } else { - this.knob.setAttribute("cx", this.knobData.level); - this.knob.setAttribute("cy", y); - } - this.knob.setAttribute("r", this.knobData.r); - } - }, - colorInterface: { - value: function colorInterface() { - this.bar.setAttribute("fill", this.colors.fill); - this.fillbar.setAttribute("fill", this.colors.accent); - this.knob.setAttribute("fill", this.colors.accent); - } - }, - render: { - value: function render() { - if (!this.clicked) { - this.knobData.r = this.thickness * 0.75; - } - this.knob.setAttribute("r", this.knobData.r); - - if (this.orientation === "vertical") { - this.knobData.level = this.knobData.r + this._value.normalized * (this.height - this.knobData.r * 2); - this.knob.setAttribute("cy", this.height - this.knobData.level); - this.fillbar.setAttribute("y", this.height - this.knobData.level); - this.fillbar.setAttribute("height", this.knobData.level); - } else { - this.knobData.level = this._value.normalized * (this.width - this.knobData.r * 2) + this.knobData.r; - this.knob.setAttribute("cx", this.knobData.level); - this.fillbar.setAttribute("x", 0); - this.fillbar.setAttribute("width", this.knobData.level); - } - } - }, - click: { - value: function click() { - this.knobData.r = this.thickness * 0.9; - this.position.anchor = this.mouse; - this.move(); - } - }, - move: { - value: function move() { - if (this.clicked) { - this.position.update(this.mouse); - this._value.updateNormal(this.position.value); - this.emit("change", this._value.value); - this.render(); - } - } - }, - release: { - value: function release() { - this.render(); - } - }, - normalized: { - get: function () { - return this._value.normalized; - } - }, - value: { - - /** - The slider's current value. If set manually, will update the interface and trigger the output event. - @type {number} - @example slider.value = 10; - */ - - get: function () { - return this._value.value; - }, - set: function (v) { - this._value.update(v); - this.position.value = this._value.normalized; - this.emit("change", this._value.value); - this.render(); - } - }, - min: { - - /** - Lower limit of the sliders's output range - @type {number} - @example slider.min = 1000; - */ - - get: function () { - return this._value.min; - }, - set: function (v) { - this._value.min = v; - } - }, - max: { - - /** - Upper limit of the slider's output range - @type {number} - @example slider.max = 1000; - */ - - get: function () { - return this._value.max; - }, - set: function (v) { - this._value.max = v; - } - }, - step: { - - /** - The increment that the slider's value changes by. - @type {number} - @example slider.step = 5; - */ - - get: function () { - return this._value.step; - }, - set: function (v) { - this._value.step = v; - } - }, - mode: { - - /** - Absolute mode (slider's value jumps to mouse click position) or relative mode (mouse drag changes value relative to its current position). Default: "relative". - @type {string} - @example slider.mode = "relative"; - */ - - get: function () { - return this.position.mode; - }, - set: function (v) { - this.position.mode = v; - } - } - }); - - return Slider; - })(Interface); - - module.exports = Slider; - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var ToggleModel = __webpack_require__(13); - var Interface = __webpack_require__(6); - - /** - * Toggle - * - * @description Binary switch - * - * @demo <span nexus-ui="toggle"></span> - * - * @example - * var toggle = new Nexus.Toggle('#target') - * - * @example - * var toggle = new Nexus.Toggle('#target',{ - * 'size': [40,20], - * 'state': false - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * Parameter: The boolean state of the interface. - * - * @outputexample - * toggle.on('change',function(v) { - * console.log(v); - * }) - * - * - */ - - var Toggle = (function (_Interface) { - function Toggle() { - _classCallCheck(this, Toggle); - - var options = ["value"]; - - var defaults = { - size: [40, 20], - target: false, - state: false - }; - - _get(Object.getPrototypeOf(Toggle.prototype), "constructor", this).call(this, arguments, options, defaults); - - this._state = new ToggleModel(this.settings.state); - - this.init(); - } - - _inherits(Toggle, _Interface); - - _createClass(Toggle, { - buildInterface: { - value: function buildInterface() { - - this.bar = svg.create("rect"); - this.knob = svg.create("circle"); - this.element.appendChild(this.bar); - this.element.appendChild(this.knob); - } - }, - sizeInterface: { - value: function sizeInterface() { - - if (this.height < this.width / 2) { - this.knobSize = this.height / 2; - } else { - this.knobSize = this.width / 4; - } - - this.bar.setAttribute("x", this.width / 2 - this.knobSize * 1.5); - this.bar.setAttribute("y", this.height / 2 - this.knobSize / 2); - this.bar.setAttribute("rx", this.knobSize / 2); - this.bar.setAttribute("ry", this.knobSize / 2); - this.bar.setAttribute("width", this.knobSize * 3); - this.bar.setAttribute("height", this.knobSize); - - this.knob.setAttribute("cx", this.width / 2 - this.knobSize); - this.knob.setAttribute("cy", this.height / 2); - this.knob.setAttribute("r", this.knobSize); - } - }, - colorInterface: { - value: function colorInterface() { - this.knob.setAttribute("fill", this.colors.accent); - this.render(); - } - }, - render: { - value: function render() { - if (!this.state) { - this.knob.setAttribute("cx", this.width / 2 - this.knobSize); - this.bar.setAttribute("fill", this.colors.fill); - } else { - this.knob.setAttribute("cx", this.width / 2 + this.knobSize); - this.bar.setAttribute("fill", this.colors.accent); - } - } - }, - click: { - value: function click() { - this.flip(); - this.render(); - this.emit("change", this.state); - } - }, - state: { - - /** - Whether the toggle is currently on or off. Setting this property will update the toggle interface and trigger the output event. - @type {boolean} - @example toggle.state = false; - */ - - get: function () { - return this._state.state; - }, - set: function (value) { - this._state.flip(value); - this.emit("change", this.state); - this.render(); - } - }, - flip: { - - /** - * Switch the toggle state to its opposite state - * @example - * toggle.flip(); - */ - - value: function flip() { - this._state.flip(); - this.render(); - } - } - }); - - return Toggle; - })(Interface); - - module.exports = Toggle; - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var ButtonTemplate = __webpack_require__(17); - - /** - * Button - * - * @description Circular button with optional aftertouch. - * - * @demo <span nexus-ui="button"></span> - * - * @example - * var button = new Nexus.Button('#target') - * - * @example - * var button = new Nexus.Button('#target',{ - * 'size': [80,80], - * 'mode': 'aftertouch', - * 'state': false - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * In <b>button mode</b>, <b>toggle mode</b>, and <b>impulse mode</b>, the output data is a boolean describing the state of the button.<br> - * In <b>aftertouch mode</b>, the output data is an object containing x (0-1) and y (0-1) positions of aftertouch. - * - * @outputexample - * button.on('change',function(v) { - * // v is the value of the button - * console.log(v); - * }) - * - */ - - var Button = (function (_ButtonTemplate) { - function Button() { - _classCallCheck(this, Button); - - var options = ["mode"]; - - var defaults = { - size: [80, 80], - mode: "aftertouch", // button, aftertouch, impulse, toggle - state: false - }; - - _get(Object.getPrototypeOf(Button.prototype), "constructor", this).call(this, arguments, options, defaults); - - /** - * Interaction mode: supports "button", "aftertouch", "impulse", or "toggle" - * @type {string} - * @example button.mode = 'toggle'; - */ - this.mode = this.settings.mode; - - this.init(); - this.render(); - } - - _inherits(Button, _ButtonTemplate); - - _createClass(Button, { - buildInterface: { - value: function buildInterface() { - this.pad = svg.create("circle"); - this.element.appendChild(this.pad); - - this.interactionTarget = this.pad; - - // only used if in 'aftertouch' mode - this.defs = svg.create("defs"); - this.element.appendChild(this.defs); - - this.gradient = svg.radialGradient(this.defs, 2); - - this.gradient.stops[0].setAttribute("offset", "30%"); - - this.gradient.stops[1].setAttribute("offset", "100%"); - } - }, - sizeInterface: { - value: function sizeInterface() { - - this.pad.setAttribute("cx", this.width / 2); - this.pad.setAttribute("cy", this.height / 2); - this.pad.setAttribute("r", Math.min(this.width, this.height) / 2 - this.width / 40); - this.pad.setAttribute("stroke-width", this.width / 20); - } - }, - colorInterface: { - value: function colorInterface() { - - this.gradient.stops[0].setAttribute("stop-color", this.colors.accent); - this.gradient.stops[1].setAttribute("stop-color", this.colors.fill); - this.render(); - } - }, - render: { - - /* - * Update the visual interface using its current state - * - * @example - * button.render(); - */ - - value: function render() { - if (!this.state) { - this.pad.setAttribute("fill", this.colors.fill); - this.pad.setAttribute("stroke", this.colors.mediumLight); - } else { - if (this.mode === "aftertouch") { - this.pad.setAttribute("stroke", "url(#" + this.gradient.id + ")"); - this.gradient.element.setAttribute("cx", this.position.x * 100 + "%"); - this.gradient.element.setAttribute("cy", (1 - this.position.y) * 100 + "%"); - } else { - this.pad.setAttribute("stroke", this.colors.accent); - } - this.pad.setAttribute("fill", this.colors.accent); - } - } - } - }); - - return Button; - })(ButtonTemplate); - - module.exports = Button; - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var math = __webpack_require__(5); - var ToggleModel = __webpack_require__(13); - var Interface = __webpack_require__(6); - - /** - Button Template - */ - - var ButtonTemplate = (function (_Interface) { - function ButtonTemplate(args, options, defaults) { - _classCallCheck(this, ButtonTemplate); - - _get(Object.getPrototypeOf(ButtonTemplate.prototype), "constructor", this).call(this, args, options, defaults); - - this.mode = this.settings.mode || "button"; - - this.position = { - x: 0, - y: 0 - }; - - this._state = new ToggleModel(this.settings.state); - } - - _inherits(ButtonTemplate, _Interface); - - _createClass(ButtonTemplate, { - buildInterface: { - value: function buildInterface() { - this.pad = svg.create("circle"); - this.pad.setAttribute("fill", "#d18"); - this.pad.setAttribute("stroke", "#d18"); - this.pad.setAttribute("stroke-width", 4); - - this.element.appendChild(this.pad); - - this.interactionTarget = this.pad; - - this.sizeInterface(); - } - }, - sizeInterface: { - value: function sizeInterface() { - this.pad.setAttribute("cx", this.width / 2); - this.pad.setAttribute("cy", this.height / 2); - this.pad.setAttribute("r", Math.min(this.width, this.height) / 2 - 2); - } - }, - render: { - value: function render() { - if (!this.state) { - this.pad.setAttribute("fill", this.colors.fill); - this.pad.setAttribute("stroke", this.colors.mediumLight); - } else { - this.pad.setAttribute("fill", this.colors.accent); - this.pad.setAttribute("stroke", this.colors.accent); - } - } - }, - down: { - value: function down(paintbrush) { - switch (this.mode) { - case "impulse": - this.turnOn(); - if (this.timeout) { - clearTimeout(this.timeout); - } - this.timeout = setTimeout(this.turnOff.bind(this), 30); - // this.emit('change',this.state); - break; - case "button": - this.turnOn(); - // this.emit('change',this.state); - break; - case "aftertouch": - this.position = { - x: math.clip(this.mouse.x / this.width, 0, 1), - y: math.clip(1 - this.mouse.y / this.height, 0, 1) - }; - this.turnOn(); - // this.emit('change',{ - // state: this.state, - // x: this.position.x, - // y: this.position.y, - // }); - break; - case "toggle": - this.flip(paintbrush); - // this.emit('change',this.state); - break; - } - } - }, - bend: { - value: function bend(mouse) { - if (this.mode === "aftertouch") { - this.mouse = mouse || this.mouse; - this.position = { - x: math.clip(this.mouse.x / this.width, 0, 1), - y: math.clip(1 - this.mouse.y / this.height, 0, 1) - }; - this.emit("change", { - state: this.state, - x: this.position.x, - y: this.position.y }); - this.render(); - } - } - }, - up: { - value: function up() { - switch (this.mode) { - case "button": - this.turnOff(); - // this.emit('change',this.state); - break; - case "aftertouch": - this.turnOff(); - this.position = { - x: math.clip(this.mouse.x / this.width, 0, 1), - y: math.clip(1 - this.mouse.y / this.height, 0, 1) - }; - // this.emit('change',{ - // state: this.state, - // x: this.position.x, - // y: this.position.y, - // }); - break; - } - } - }, - click: { - - /* overwritable interaction handlers */ - - value: function click() { - this.down(); - } - }, - move: { - value: function move() { - this.bend(); - } - }, - release: { - value: function release() { - this.up(); - } - }, - state: { - - /** - Whether the button is on (pressed) or off (not pressed) - @type {boolean} - @example button.state = true; - */ - - get: function () { - return this._state.state; - }, - set: function (value) { - this._state.flip(value); - if (this.mode === "aftertouch") { - this.emit("change", { - state: this.state, - x: this.position.x, - y: this.position.y }); - } else { - this.emit("change", this.state); - } - this.render(); - } - }, - flip: { - - /** - Change the button to its alternate state (off=>on, on=>off), or flip it to a specified state. - @param value {boolean} (Optional) State to flip to. - @example button.flip(); - */ - - value: function flip(value) { - this._state.flip(value); - if (this.mode === "aftertouch") { - this.emit("change", { - state: this.state, - x: this.position.x, - y: this.position.y }); - } else { - this.emit("change", this.state); - } - this.render(); - } - }, - turnOn: { - - /** - Turn the button's state to true. - @example button.turnOn(); - */ - - value: function turnOn(emitting) { - this._state.on(); - if (emitting !== false) { - if (this.mode === "aftertouch") { - this.emit("change", { - state: this.state, - x: this.position.x, - y: this.position.y }); - } else { - this.emit("change", this.state); - } - } - this.render(); - } - }, - turnOff: { - - /** - Turn the button's state to false. - @example button.turnOff(); - */ - - value: function turnOff(emitting) { - this._state.off(); - if (emitting !== false) { - if (this.mode === "aftertouch") { - this.emit("change", { - state: this.state, - x: this.position.x, - y: this.position.y }); - } else { - this.emit("change", this.state); - } - } - this.render(); - } - } - }); - - return ButtonTemplate; - })(Interface); - - module.exports = ButtonTemplate; - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var ButtonTemplate = __webpack_require__(17); - - /** - * TextButton - * - * @description Text button - * - * @demo <span nexus-ui="textButton"></span> - * - * @example - * var textbutton = new Nexus.TextButton('#target') - * - * @example - * var textbutton = new Nexus.TextButton('#target',{ - * 'size': [150,50], - * 'state': false, - * 'text': 'Play', - * 'alternateText': 'Stop' - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * The event data is a <i>string</i> of the text on the button at the moment it was clicked. - * - * @outputexample - * textbutton.on('change',function(v) { - * console.log(v); - * }) - * - */ - - var TextButton = (function (_ButtonTemplate) { - function TextButton() { - _classCallCheck(this, TextButton); - - var options = ["value"]; - - var defaults = { - size: [150, 50], - state: false, - text: "Play" - }; - - _get(Object.getPrototypeOf(TextButton.prototype), "constructor", this).call(this, arguments, options, defaults); - - this._text = this.settings.text; - - if (this.settings.alternate) { - //TODO: Remove this conditional in a breaking-changes release - this.settings.alternateText = this.settings.alternate; - console.warn("'alternate' initiator is deprecated. Use 'alternateText' instead."); - } - this._alternateText = this.settings.alternateText; - this.mode = this.settings.alternateText ? "toggle" : "button"; - this.init(); - this.render(); - - this.state = this.settings.state; - } - - _inherits(TextButton, _ButtonTemplate); - - _createClass(TextButton, { - buildFrame: { - value: function buildFrame() { - - this.element = document.createElement("div"); - this.parent.appendChild(this.element); - - this.textElement = document.createElement("div"); - this.textElement.innerHTML = this._text; - this.element.appendChild(this.textElement); - } - }, - buildInterface: { - value: function buildInterface() {} - }, - colorInterface: { - value: function colorInterface() { - this.element.style.color = this.colors.dark; - this.render(); - } - }, - sizeInterface: { - value: function sizeInterface() { - var textsize = this.height / 3; - var textsize2 = this.width / (this._text.length + 2); - textsize = Math.min(textsize, textsize2); - if (this.alternateText) { - var textsize3 = this.width / (this.alternateText.length + 2); - textsize = Math.min(textsize, textsize3); - } - var styles = "width: " + this.width + "px;"; - styles += "height: " + this.height + "px;"; - styles += "padding: " + (this.height - textsize) / 2 + "px 0px;"; - styles += "box-sizing: border-box;"; - styles += "text-align: center;"; - styles += "font-family: inherit;"; - styles += "font-weight: 700;"; - styles += "opacity: 1;"; - styles += "font-size:" + textsize + "px;"; - this.textElement.style.cssText = styles; - this.render(); - } - }, - render: { - value: function render() { - if (!this.state) { - this.element.style.backgroundColor = this.colors.fill; - this.textElement.style.color = this.colors.dark; - this.textElement.innerHTML = this._text; - } else { - this.element.style.backgroundColor = this.colors.accent; - this.textElement.style.color = this.colors.fill; - if (this.alternateText) { - this.textElement.innerHTML = this._alternateText; - } else { - this.textElement.innerHTML = this._text; - } - } - } - }, - alternateText: { - - /** - The text to display when the button is in its "on" state. If set, this puts the button in "toggle" mode. - @type {String} - */ - - get: function () { - return this._alternateText; - }, - set: function (text) { - if (text) { - this.mode = "toggle"; - } else { - this.mode = "button"; - } - this._alternateText = text; - this.render(); - } - }, - text: { - - /** - The text to display. (If .alternateText exists, then this .text will only be displayed when the button is in its "off" state.) - @type {String} - */ - - get: function () { - return this._text; - }, - set: function (text) { - this._text = text; - this.sizeInterface(); - this.render(); - } - } - }); - - return TextButton; - })(ButtonTemplate); - - module.exports = TextButton; - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - //let svg = require('../util/svg'); - var Interface = __webpack_require__(6); - var Button = __webpack_require__(16); - - /** - * RadioButton - * - * @description An array of buttons. By default, selecting one button will deselect all other buttons, but this can be customized using the API below. - * - * @demo <div nexus-ui="RadioButton"></div> - * - * @example - * var radiobutton = new Nexus.RadioButton('#target') - * - * @example - * var radiobutton = new Nexus.RadioButton('#target',{ - * 'size': [120,25], - * 'numberOfButtons': 4, - * 'active': -1 - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * The event data an <i>integer</i>, the index of the button that is currently on. If no button is selected, the value will be -1. - * - * @outputexample - * radiobutton.on('change',function(v) { - * console.log(v); - * }) - * - */ - - var RadioButton = (function (_Interface) { - function RadioButton() { - _classCallCheck(this, RadioButton); - - var options = ["value"]; - - var defaults = { - size: [120, 25], - numberOfButtons: 4, - active: -1 - }; - - _get(Object.getPrototypeOf(RadioButton.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.buttons = []; - this._numberOfButtons = this.settings.numberOfButtons; - this.active = this.settings.active; - - this.init(); - this.render(); - } - - _inherits(RadioButton, _Interface); - - _createClass(RadioButton, { - buildFrame: { - value: function buildFrame() { - this.element = document.createElement("div"); - this.parent.appendChild(this.element); - } - }, - buildInterface: { - value: function buildInterface() { - - for (var i = 0; i < this._numberOfButtons; i++) { - var container = document.createElement("span"); - - var button = new Button(container, { - mode: "toggle", - component: true }, this.update.bind(this, i)); - - this.buttons.push(button); - this.element.appendChild(container); - } - } - }, - sizeInterface: { - value: function sizeInterface() { - - var buttonWidth = this.width / this._numberOfButtons; - var buttonHeight = this.height; - - for (var i = 0; i < this._numberOfButtons; i++) { - this.buttons[i].resize(buttonWidth, buttonHeight); - } - } - }, - colorInterface: { - value: function colorInterface() { - for (var i = 0; i < this._numberOfButtons; i++) { - this.buttons[i].colors = this.colors; - this.buttons[i].render(); - } - } - }, - update: { - value: function update(index) { - if (this.buttons[index].state) { - this.select(index); - } else { - this.deselect(); - } - // this.render(); - } - }, - render: { - value: function render() { - for (var i = 0; i < this.buttons.length; i++) { - if (i === this.active) { - this.buttons[i].turnOn(false); - } else { - this.buttons[i].turnOff(false); - } - } - } - }, - select: { - - /** - Select one button and deselect all other buttons. - @param index {number} The index of the button to select - */ - - value: function select(index) { - if (index >= 0 && index < this.buttons.length) { - this.active = index; - this.emit("change", this.active); - this.render(); - } - } - }, - deselect: { - - /** - Deselect all buttons. - */ - - value: function deselect() { - this.active = -1; - this.emit("change", this.active); - this.render(); - } - }, - numberOfButtons: { - get: function () { - return this._numberOfButtons; - }, - - /** - * Update how many buttons are in the interface - * @param {number} buttons How many buttons are in the interface - */ - set: function (buttons) { - this._numberOfButtons = buttons; - for (var i = 0; i < this.buttons.length; i++) { - this.buttons[i].destroy(); - } - this.buttons = []; - // for (let i=0;i<this.buttons.length;i++) { - // this.buttons[i].destroy(); - // } - this.empty(); - this.buildInterface(); - } - } - }); - - return RadioButton; - })(Interface); - - module.exports = RadioButton; - -/***/ }), -/* 20 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var Interface = __webpack_require__(6); - var Step = __webpack_require__(11); - var math = __webpack_require__(5); - - /** - * Number - * - * @description Number interface which is controllable by dragging or typing. - * - * @demo <span nexus-ui="number"></span> - * - * @example - * var number = new Nexus.Number('#target') - * - * @example - * var number = new Nexus.Number('#target',{ - * 'size': [60,30], - * 'value': 0, - * 'min': 0, - * 'max': 20000, - * 'step': 1 - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * The event data is the number value of the interface. - * - * @outputexample - * number.on('change',function(v) { - * console.log(v); - * }) - * - * - */ - - var Number = (function (_Interface) { - function Number() { - _classCallCheck(this, Number); - - var options = ["value"]; - - var defaults = { - size: [60, 30], - value: 0, - min: 0, - max: 20000, - step: 1 - }; - - _get(Object.getPrototypeOf(Number.prototype), "constructor", this).call(this, arguments, options, defaults); - - this._value = new Step(this.settings.min, this.settings.max, this.settings.step, this.settings.value); - - /* - Default: 2. How many decimal places to clip the number's visual rendering to. This does not affect number's actual value output -- for that, set the step property to .01, .1, or 1. - @type {number} - @example number.decimalPlaces = 2; - */ - this.decimalPlaces = 2; - this.actual = 0; - - this.max = this._value.max; - - this.min = this._value.min; - - this.step = this._value.step; - - this.init(); - this.render(); - } - - _inherits(Number, _Interface); - - _createClass(Number, { - buildFrame: { - value: function buildFrame() { - this.element = document.createElement("input"); - this.element.type = "text"; - - this.element.addEventListener("blur", (function () { - this.element.style.backgroundColor = this.colors.fill; - this.element.style.color = this.colors.dark; - if (this.element.value !== this.value) { - this.value = parseFloat(this.element.value); - this.render(); - } - }).bind(this)); - - this.element.addEventListener("keydown", (function (e) { - if (e.which < 48 || e.which > 57) { - if (e.which !== 189 && e.which !== 190 && e.which !== 8) { - e.preventDefault(); - } - } - if (e.which === 13) { - this.element.blur(); - this.value = this.element.value; - this.emit("change", this.value); - this.render(); - } - }).bind(this)); - - this.parent.appendChild(this.element); - } - }, - sizeInterface: { - value: function sizeInterface() { - - this._minDimension = Math.min(this.width, this.height); - - var styles = "width: " + this.width + "px;"; - styles += "height: " + this.height + "px;"; - styles += "background-color: #e7e7e7;"; - styles += "color: #333;"; - styles += "font-family: arial;"; - styles += "font-weight: 500;"; - styles += "font-size:" + this._minDimension / 2 + "px;"; - // styles += 'highlight: #d18;'; - styles += "border: none;"; - styles += "outline: none;"; - styles += "padding: " + this._minDimension / 4 + "px " + this._minDimension / 4 + "px;"; - styles += "box-sizing: border-box;"; - styles += "userSelect: text;"; - styles += "mozUserSelect: text;"; - styles += "webkitUserSelect: text;"; - this.element.style.cssText += styles; - - // to add eventually - // var css = '#'+this.elementID+'::selection{ background-color: transparent }'; - - this.element.value = this.value; - } - }, - colorInterface: { - value: function colorInterface() { - this.element.style.backgroundColor = this.colors.fill; - this.element.style.color = this.colors.dark; - } - }, - render: { - value: function render() { - - this.element.value = math.prune(this.value, this.decimalPlaces); - } - }, - click: { - value: function click() { - this.hasMoved = false; - this.element.readOnly = true; - this.actual = this.value; - this.initial = { y: this.mouse.y }; - this.changeFactor = math.invert(this.mouse.x / this.width); - console.log(this.changeFactor); - } - }, - move: { - value: function move() { - this.hasMoved = true; - if (this.clicked) { - - var newvalue = this.actual - (this.mouse.y - this.initial.y) * (math.clip(this.max - this.min, 0, 1000) / 200) * Math.pow(this.changeFactor, 2); - this.value = newvalue; - - this.render(); - if (this._value.changed) { - this.emit("change", this.value); - } - } - } - }, - release: { - value: function release() { - if (!this.hasMoved) { - this.element.readOnly = false; - this.element.focus(); - this.element.setSelectionRange(0, this.element.value.length); - this.element.style.backgroundColor = this.colors.accent; - this.element.style.color = this.colors.light; - } else { - document.body.focus(); - } - } - }, - link: { - - /** - Connect this number interface to a dial or slider - @param {Interface} element Element to connect to. - @example number.link(slider) - */ - - value: function link(destination) { - var _this = this; - - this.min = destination.min; - this.max = destination.max; - this.step = destination.step; - destination.on("change", function (v) { - _this.passiveUpdate(v); - }); - this.on("change", function (v) { - destination.value = v; - }); - this.value = destination.value; - /* return { - listener1: listener1, - listener2: listener2, - destroy: () => { - listener1.remove() (or similar) - listener2.remove() (or similar) - } - } */ - } - }, - passiveUpdate: { - value: function passiveUpdate(v) { - this._value.update(v); - this.render(); - } - }, - value: { - - /** - The interface's current value. If set manually, will update the interface and trigger the output event. - @type {number} - @example number.value = 10; - */ - - get: function () { - return this._value.value; - }, - set: function (v) { - this._value.update(v); - this.emit("change", this.value); - this.render(); - } - }, - min: { - - /** - Lower limit of the number's output range - @type {number} - @example number.min = 1000; - */ - - get: function () { - return this._value.min; - }, - set: function (v) { - this._value.min = v; - } - }, - max: { - - /** - Upper limit of the number's output range - @type {number} - @example number.max = 1000; - */ - - get: function () { - return this._value.max; - }, - set: function (v) { - this._value.max = v; - } - }, - step: { - - /** - The increment that the number's value changes by. - @type {number} - @example number.step = 5; - */ - - get: function () { - return this._value.step; - }, - set: function (v) { - this._value.step = v; - } - } - }); - - return Number; - })(Interface); - - module.exports = Number; - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var Interface = __webpack_require__(6); - - /** - * Select - * - * @description Dropdown menu - * - * @demo <span nexus-ui="select"></span> - * - * @example - * var select = new Nexus.Select('#target') - * - * @example - * var select = new Nexus.Select('#target',{ - * 'size': [100,30], - * 'options': ['default','options'] - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * The event data is an object containing the text value of the selected option, as well as the numeric index of the selection. - * - * @outputexample - * select.on('change',function(v) { - * console.log(v); - * }) - * - * - */ - - var Select = (function (_Interface) { - function Select() { - _classCallCheck(this, Select); - - var options = ["value"]; - - var defaults = { - size: [100, 30], - options: ["default", "options"] - }; - - _get(Object.getPrototypeOf(Select.prototype), "constructor", this).call(this, arguments, options, defaults); - - this._selectedIndex = -1; - this._value = false; - - this._options = this.settings.options; - - this.init(); - this.render(); - } - - _inherits(Select, _Interface); - - _createClass(Select, { - buildFrame: { - value: function buildFrame() { - this.element = document.createElement("select"); - this.element.style.fontSize = this.height / 2 + "px"; - this.element.style.outline = "none"; - this.element.style.highlight = "none"; - this.element.style.width = this.width + "px"; - this.element.style.height = this.height + "px"; - - this.boundRender = this.render.bind(this); - - this.element.addEventListener("change", this.boundRender); - - this.parent.appendChild(this.element); - } - }, - attachListeners: { - value: function attachListeners() {} - }, - buildInterface: { - value: function buildInterface() { - - this.defineOptions(); - } - }, - colorInterface: { - value: function colorInterface() { - this.element.style.backgroundColor = this.colors.fill; - this.element.style.color = this.colors.dark; - this.element.style.border = "solid 0px " + this.colors.mediumLight; - } - }, - render: { - value: function render() { - - this._value = this.element.options[this.element.selectedIndex].text; - this._selectedIndex = this.element.selectedIndex; - this.emit("change", { - value: this._value, - index: this._selectedIndex - }); - } - }, - click: { - value: function click() {} - }, - move: { - value: function move() {} - }, - release: { - value: function release() {} - }, - defineOptions: { - - /** - * Update the list of options. This removes all existing options and creates a new list of options. - * @param {array} options New array of options - */ - - value: function defineOptions(options) { - - /* function removeOptions(selectbox) - { - var i; - for(i = selectbox.options.length - 1 ; i >= 0 ; i--) - { - selectbox.remove(i); - } - } - //using the function: - removeOptions(document.getElementById("mySelectObject")); */ - - if (options) { - this._options = options; - } - - for (var i = this.element.options.length - 1; i >= 0; i--) { - this.element.remove(i); - } - - for (var i = 0; i < this._options.length; i++) { - this.element.options.add(new Option(this._options[i], i)); - } - } - }, - value: { - - /** - The text of the option that is currently selected. If set, will update the interface and trigger the output event. - @type {String} - @example select.value = "sawtooth"; - */ - - get: function () { - return this._value; - }, - set: function (v) { - this._value = v; - for (var i = 0; i < this.element.options.length; i++) { - if (v === this.element.options[i].text) { - this.selectedIndex = i; - break; - } - } - } - }, - selectedIndex: { - - /** - The numeric index of the option that is currently selected. If set, will update the interface and trigger the output event. - @type {number} - @example select.selectedIndex = 2; - */ - - get: function () { - return this._selectedIndex; - }, - set: function (v) { - this._selectedIndex = v; - this.element.selectedIndex = v; - this.render(); - } - }, - customDestroy: { - value: function customDestroy() { - this.element.removeEventListener("change", this.boundRender); - } - } - }); - - return Select; - })(Interface); - - module.exports = Select; - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var math = __webpack_require__(5); - var Interface = __webpack_require__(6); - var Step = __webpack_require__(11); - - var Interaction = _interopRequireWildcard(__webpack_require__(12)); - - /** - * Dial - * - * - * @description Dial with radial or linear interaction. - * - * @demo <span nexus-ui="dial"></span> - * - * @example - * var dial = new Nexus.Dial('#target') - * - * @example - * var dial = new Nexus.Dial('#target',{ - * 'size': [75,75], - * 'interaction': 'radial', // "radial", "vertical", or "horizontal" - * 'mode': 'relative', // "absolute" or "relative" - * 'min': 0, - * 'max': 1, - * 'step': 0, - * 'value': 0 - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * The event data is the number value of the interface. - * - * @outputexample - * dial.on('change',function(v) { - * console.log(v); - * }) - * - * @tutorial - * Dial - * ygGMxq - * - */ - - var Dial = (function (_Interface) { - function Dial() { - _classCallCheck(this, Dial); - - var options = ["min", "max", "value"]; - - var defaults = { - size: [75, 75], - interaction: "radial", // radial, vertical, horizontal - mode: "relative", // absolute, relative - min: 0, - max: 1, - step: 0, - value: 0 - }; - - _get(Object.getPrototypeOf(Dial.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.interaction = this.settings.interaction; - - this._value = new Step(this.settings.min, this.settings.max, this.settings.step, this.settings.value); - - this.position = new Interaction.Handle(this.settings.mode, this.interaction, [0, this.width], [this.height, 0]); - - this.init(); - - this.value = this._value.value; - - this.position.value = this._value.normalized; - - this.previousAngle = false; - - this.emit("change", this.value); - } - - _inherits(Dial, _Interface); - - _createClass(Dial, { - buildInterface: { - value: function buildInterface() { - - this.background = svg.create("circle"); - this.screw = svg.create("circle"); - this.handle = svg.create("path"); - this.handle2 = svg.create("path"); - this.handleFill = svg.create("path"); - this.handle2Fill = svg.create("path"); - this.handleLine = svg.create("path"); - - this.element.appendChild(this.background); - this.element.appendChild(this.handle); - this.element.appendChild(this.handle2); - this.element.appendChild(this.handleFill); - this.element.appendChild(this.handle2Fill); - this.element.appendChild(this.handleLine); - this.element.appendChild(this.screw); - } - }, - sizeInterface: { - value: function sizeInterface() { - - this.position.resize([0, this.width], [this.height, 0]); - - var center = { - x: this.width / 2, - y: this.height / 2 - }; - - var diameter = Math.min(this.width, this.height); - - this.background.setAttribute("cx", center.x); - this.background.setAttribute("cy", center.y); - this.background.setAttribute("r", diameter / 2 - diameter / 40); - - this.screw.setAttribute("cx", center.x); - this.screw.setAttribute("cy", center.y); - this.screw.setAttribute("r", diameter / 12); - - var value = this.value; - - var handlePoints = { - start: Math.PI * 1.5, - end: math.clip(math.scale(value, 0, 0.5, Math.PI * 1.5, Math.PI * 0.5), Math.PI * 0.5, Math.PI * 1.5) - }; - var handle2Points = { - start: Math.PI * 2.5, - end: math.clip(math.scale(value, 0.5, 1, Math.PI * 2.5, Math.PI * 1.5), Math.PI * 1.5, Math.PI * 2.5) - }; - - var handlePath = svg.arc(center.x, center.y, diameter / 2 - diameter / 40, handlePoints.start, handlePoints.end); - var handle2Path = svg.arc(center.x, center.y, diameter / 2 - diameter / 40, handle2Points.start, handle2Points.end); - - this.handle.setAttribute("d", handlePath); - this.handle.setAttribute("stroke-width", diameter / 20); - this.handle.setAttribute("fill", "none"); - - this.handle2.setAttribute("d", handle2Path); - this.handle2.setAttribute("stroke-width", diameter / 20); - this.handle2.setAttribute("fill", "none"); - - handlePath += " L " + center.x + " " + center.y; - - this.handleFill.setAttribute("d", handlePath); - this.handleFill.setAttribute("fill-opacity", "0.3"); - - handle2Path += " L " + center.x + " " + center.y; - - this.handle2Fill.setAttribute("d", handle2Path); - this.handle2Fill.setAttribute("fill-opacity", "0.3"); - - var arcEndingA = undefined; - if (value < 0.5) { - arcEndingA = handlePoints.end; - } else { - arcEndingA = handle2Points.end; - } - - var arcEndingX = center.x + Math.cos(arcEndingA) * (diameter / 2); - var arcEndingY = center.y + Math.sin(arcEndingA) * (diameter / 2) * -1; - - this.handleLine.setAttribute("d", "M " + center.x + " " + center.y + " L " + arcEndingX + " " + arcEndingY); - this.handleLine.setAttribute("stroke-width", diameter / 20); - } - }, - colorInterface: { - value: function colorInterface() { - this.background.setAttribute("fill", this.colors.fill); - this.screw.setAttribute("fill", this.colors.accent); - this.handle.setAttribute("stroke", this.colors.accent); - this.handle2.setAttribute("stroke", this.colors.accent); - this.handleFill.setAttribute("fill", this.colors.accent); - this.handle2Fill.setAttribute("fill", this.colors.accent); - this.handleLine.setAttribute("stroke", this.colors.accent); - } - }, - render: { - value: function render() { - var value = this._value.normalized; - - var center = { - x: this.width / 2, - y: this.height / 2 - }; - - var diameter = Math.min(this.width, this.height); - - var handlePoints = { - start: Math.PI * 1.5, - end: math.clip(math.scale(value, 0, 0.5, Math.PI * 1.5, Math.PI * 0.5), Math.PI * 0.5, Math.PI * 1.5) - }; - var handle2Points = { - start: Math.PI * 2.5, - end: math.clip(math.scale(value, 0.5, 1, Math.PI * 2.5, Math.PI * 1.5), Math.PI * 1.5, Math.PI * 2.5) - }; - - var handlePath = svg.arc(center.x, center.y, diameter / 2 - diameter / 40, handlePoints.start, handlePoints.end); - var handle2Path = svg.arc(center.x, center.y, diameter / 2 - diameter / 40, handle2Points.start, handle2Points.end); - - this.handle.setAttribute("d", handlePath); - this.handle2.setAttribute("d", handle2Path); - - handlePath += " L " + center.x + " " + center.y; - - this.handleFill.setAttribute("d", handlePath); - - handle2Path += " L " + center.x + " " + center.y; - - this.handle2Fill.setAttribute("d", handle2Path); - - var arcEndingA = undefined; - if (value <= 0.5) { - arcEndingA = handlePoints.end; - } else { - arcEndingA = handle2Points.end; - } - - var arcEndingX = center.x + Math.cos(arcEndingA) * (diameter / 2); - var arcEndingY = center.y + Math.sin(arcEndingA) * (diameter / 2) * -1; - - this.handleLine.setAttribute("d", "M " + center.x + " " + center.y + " L " + arcEndingX + " " + arcEndingY); - } - }, - click: { - value: function click() { - if (this.mode === "relative") { - this.previousAngle = false; - } - this.position.anchor = this.mouse; - this.position.value = this._value.normalized; - this.move(); - } - }, - move: { - value: function move() { - if (this.clicked) { - - this.position.update(this.mouse); - - var angle = this.position.value * Math.PI * 2; - - if (angle < 0) { - angle += Math.PI * 2; - } - - if (this.mode === "relative") { - if (this.previousAngle !== false && Math.abs(this.previousAngle - angle) > 2) { - if (this.previousAngle > 3) { - angle = Math.PI * 2; - } else { - angle = 0; - } - } - } /* else { - if (this.previousAngle !== false && Math.abs(this.previousAngle - angle) > 2) { - if (this.previousAngle > 3) { - angle = Math.PI*2; - } else { - angle = 0; - } - } - } */ - this.previousAngle = angle; - - var realValue = angle / (Math.PI * 2); - - this.value = this._value.updateNormal(realValue); - - if (this.mode === "relative") { - this.position.value = realValue; - } - - this.emit("change", this._value.value); - - this.render(); - } - } - }, - release: { - value: function release() {} - }, - value: { - - /* - Dial's value. When set, it will automatically be adjust to fit min/max/step settings of the interface. - @type {number} - @example dial.value = 10; - get value() { - return this._value.value; - } - set value(value) { - this._value.update(value); - this.emit('change',this.value); - this.render(); - } - */ - - /** - Dial's value. When set, it will automatically be adjust to fit min/max/step settings of the interface. - @type {number} - @example dial.value = 10; - */ - - get: function () { - return this._value.value; - }, - set: function (v) { - this._value.update(v); - this.position.value = this._value.normalized; - this.emit("change", this._value.value); - this.render(); - } - }, - min: { - - /** - Lower limit of the dial's output range - @type {number} - @example dial.min = 1000; - */ - - get: function () { - return this._value.min; - }, - set: function (v) { - this._value.min = v; - } - }, - max: { - - /** - Upper limit of the dial's output range - @type {number} - @example dial.max = 1000; - */ - - get: function () { - return this._value.max; - }, - set: function (v) { - this._value.max = v; - } - }, - step: { - - /** - The increment that the dial's value changes by. - @type {number} - @example dial.step = 5; - */ - - get: function () { - return this._value.step; - }, - set: function (v) { - this._value.step = v; - } - }, - mode: { - - /** - Absolute mode (dial's value jumps to mouse click position) or relative mode (mouse drag changes value relative to its current position). Default: "relative". - @type {string} - @example dial.mode = "relative"; - */ - - get: function () { - return this.position.mode; - }, - set: function (v) { - this.position.mode = v; - } - }, - normalized: { - - /** - Normalized value of the dial. - @type {number} - @example dial.normalized = 0.5; - */ - - get: function () { - return this._value.normalized; - }, - set: function (v) { - this._value.updateNormal(v); - this.emit("change", this.value); - } - } - }); - - return Dial; - })(Interface); - - module.exports = Dial; - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var Interface = __webpack_require__(6); - var ButtonTemplate = __webpack_require__(17); - var touch = __webpack_require__(9); - - var PianoKey = (function (_ButtonTemplate) { - function PianoKey() { - _classCallCheck(this, PianoKey); - - var options = ["value", "note", "color"]; - - var defaults = { - size: [80, 80], - target: false, - mode: "button", - value: 0 - }; - - _get(Object.getPrototypeOf(PianoKey.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.note = this.settings.note; - this.color = this.settings.color; - - this.colors = { - w: "#fff", - b: "#666" }; - - this.init(); - this.render(); - } - - _inherits(PianoKey, _ButtonTemplate); - - _createClass(PianoKey, { - buildFrame: { - value: function buildFrame() { - this.element = svg.create("svg"); - this.element.setAttribute("width", this.width); - this.element.setAttribute("height", this.height); - this.parent.appendChild(this.element); - } - }, - buildInterface: { - value: function buildInterface() { - var _this = this; - - this.pad = svg.create("rect"); - - this.element.appendChild(this.pad); - - this.interactionTarget = this.pad; - - /* events */ - - if (!touch.exists) { - - this.click = function () { - // console.log('click'); - _this.piano.interacting = true; - _this.piano.paintbrush = !_this.state; - _this.down(_this.piano.paintbrush); - }; - - this.pad.addEventListener("mouseover", function () { - if (_this.piano.interacting) { - // console.log('mouseover'); - _this.down(_this.piano.paintbrush); - } - }); - - this.move = function () { - if (_this.piano.interacting) { - // console.log('move'); - _this.bend(); - } - }; - - this.release = function () { - _this.piano.interacting = false; - // console.log('release'); - // this.up(); - }; - this.pad.addEventListener("mouseup", function () { - if (_this.piano.interacting) { - // console.log('mouseup'); - _this.up(); - } - }); - this.pad.addEventListener("mouseout", function () { - if (_this.piano.interacting) { - // console.log('mouseout'); - _this.up(); - } - }); - } - } - }, - sizeInterface: { - value: function sizeInterface() { - - //let radius = Math.min(this.width,this.height) / 5; - var radius = 0; - - this.pad.setAttribute("x", 0.5); - this.pad.setAttribute("y", 0.5); - if (this.width > 2) { - this.pad.setAttribute("width", this.width - 1); - } else { - this.pad.setAttribute("width", this.width); - } - if (this.height > 2) { - this.pad.setAttribute("height", this.height); - } else { - this.pad.setAttribute("height", this.height); - } - this.pad.setAttribute("rx", radius); - this.pad.setAttribute("ry", radius); - } - }, - render: { - value: function render() { - if (!this.state) { - this.pad.setAttribute("fill", this.colors[this.color]); - } else { - this.pad.setAttribute("fill", this.colors.accent); - } - } - } - }); - - return PianoKey; - })(ButtonTemplate); - - /** - * Piano - * - * @description Piano keyboard interface - * - * @demo <div nexus-ui="piano"></div> - * - * @example - * var piano = new Nexus.Piano('#target') - * - * @example - * var piano = new Nexus.Piano('#target',{ - * 'size': [500,125], - * 'mode': 'button', // 'button', 'toggle', or 'impulse' - * 'lowNote': 24, - * 'highNote': 60 - * }) - * - * @output - * change - * Fires any time a new key is pressed or released <br> - * The event data is an object containing <i>note</i> and <i>state</i> properties. - * - * @outputexample - * piano.on('change',function(v) { - * console.log(v); - * }) - * - */ - - var Piano = (function (_Interface) { - function Piano() { - _classCallCheck(this, Piano); - - var options = ["value"]; - - var defaults = { - size: [500, 125], - lowNote: 24, - highNote: 60, - mode: "button" - }; - - _get(Object.getPrototypeOf(Piano.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.keyPattern = ["w", "b", "w", "b", "w", "w", "b", "w", "b", "w", "b", "w"]; - - this.paintbrush = false; - - this.mode = this.settings.mode; - - this.range = { - low: this.settings.lowNote, - high: this.settings.highNote - }; - - this.range.size = this.range.high - this.range.low; - - this.keys = []; - - this.toggleTo = false; - - this.init(); - this.render(); - } - - _inherits(Piano, _Interface); - - _createClass(Piano, { - buildFrame: { - value: function buildFrame() { - this.element = document.createElement("div"); - this.element.style.position = "relative"; - this.element.style.borderRadius = "0px"; - this.element.style.display = "block"; - this.element.style.width = "100%"; - this.element.style.height = "100%"; - this.parent.appendChild(this.element); - } - }, - buildInterface: { - value: function buildInterface() { - - this.keys = []; - - for (var i = 0; i < this.range.high - this.range.low; i++) { - - var container = document.createElement("span"); - var scaleIndex = (i + this.range.low) % this.keyPattern.length; - - var key = new PianoKey(container, { - component: true, - note: i + this.range.low, - color: this.keyPattern[scaleIndex], - mode: this.mode - }, this.keyChange.bind(this, i + this.range.low)); - - key.piano = this; - - if (touch.exists) { - key.pad.index = i; - key.preClick = key.preMove = key.preRelease = function () {}; - key.click = key.move = key.release = function () {}; - key.preTouch = key.preTouchMove = key.preTouchRelease = function () {}; - key.touch = key.touchMove = key.touchRelease = function () {}; - } - - this.keys.push(key); - this.element.appendChild(container); - } - if (touch.exists) { - this.addTouchListeners(); - } - } - }, - sizeInterface: { - value: function sizeInterface() { - - var keyX = 0; - - var keyPositions = []; - - for (var i = 0; i < this.range.high - this.range.low; i++) { - - keyPositions.push(keyX); - - var scaleIndex = (i + this.range.low) % this.keyPattern.length; - var nextScaleIndex = (i + 1 + this.range.low) % this.keyPattern.length; - if (i + 1 + this.range.low >= this.range.high) { - keyX += 1; - } else if (this.keyPattern[scaleIndex] === "w" && this.keyPattern[nextScaleIndex] === "w") { - keyX += 1; - } else { - keyX += 0.5; - } - } - var keysWide = keyX; - - // let padding = this.width / 120; - var padding = 1; - var buttonWidth = (this.width - padding * 2) / keysWide; - var buttonHeight = (this.height - padding * 2) / 2; - - for (var i = 0; i < this.keys.length; i++) { - - var container = this.keys[i].parent; - container.style.position = "absolute"; - container.style.left = keyPositions[i] * buttonWidth + padding + "px"; - if (this.keys[i].color === "w") { - container.style.top = padding + "px"; - this.keys[i].resize(buttonWidth, buttonHeight * 2); - } else { - container.style.zIndex = 1; - container.style.top = padding + "px"; - this.keys[i].resize(buttonWidth, buttonHeight * 1.1); - } - } - } - }, - colorInterface: { - value: function colorInterface() { - - // Piano keys don't actually have a stroke border - // They have space between them, which shows the Piano bg color - this.element.style.backgroundColor = this.colors.mediumLight; - - for (var i = 0; i < this.keys.length; i++) { - this.keys[i].colors = { - w: this.colors.light, - b: this.colors.dark, - accent: this.colors.accent, - border: this.colors.mediumLight - }; - this.keys[i].colorInterface(); - this.keys[i].render(); - } - } - }, - keyChange: { - value: function keyChange(note, on) { - // emit data for any key turning on/off - // "note" is the note value - // "on" is a boolean whether it is on or off - // in aftertouch mode, "on: is an object with state/x/y properties - var data = { - note: note - }; - if (typeof on === "object") { - data.state = on.state; - // data.x = on.x - // data.y = on.y - } else { - data.state = on; - } - this.emit("change", data); - } - }, - render: { - - /* drag(note,on) { - this.emit('change',{ - note: note, - state: on - }); - } */ - - value: function render() {} - }, - addTouchListeners: { - value: function addTouchListeners() { - var _this = this; - - this.preClick = this.preMove = this.preRelease = function () {}; - this.click = this.move = this.release = function () {}; - this.preTouch = this.preTouchMove = this.preTouchRelease = function () {}; - this.touch = this.touchMove = this.touchRelease = function () {}; - - this.currentElement = false; - - this.element.addEventListener("touchstart", function (e) { - console.log("touchstart"); - var element = document.elementFromPoint(e.targetTouches[0].clientX, e.targetTouches[0].clientY); - var key = _this.keys[element.index]; - _this.paintbrush = !key.state; - key.down(_this.paintbrush); - _this.currentElement = element.index; - e.preventDefault(); - e.stopPropagation(); - }); - - this.element.addEventListener("touchmove", function (e) { - var element = document.elementFromPoint(e.targetTouches[0].clientX, e.targetTouches[0].clientY); - var key = _this.keys[element.index]; - if (element.index !== _this.currentElement) { - if (_this.currentElement) { - var pastKey = _this.keys[_this.currentElement]; - pastKey.up(); - } - key.down(_this.paintbrush); - } else { - key.bend(); - } - _this.currentElement = element.index; - e.preventDefault(); - e.stopPropagation(); - }); - - this.element.addEventListener("touchend", function (e) { - // no touches to calculate because none remaining - var key = _this.keys[_this.currentElement]; - key.up(); - _this.interacting = false; - _this.currentElement = false; - e.preventDefault(); - e.stopPropagation(); - }); - } - }, - setRange: { - - /** - Define the pitch range (lowest and highest note) of the piano keyboard. - @param low {number} MIDI note value of the lowest note on the keyboard - @param high {number} MIDI note value of the highest note on the keyboard - */ - - value: function setRange(low, high) { - this.range.low = low; - this.range.high = high; - this.empty(); - this.buildInterface(); - } - }, - toggleKey: { - - /** - Turn a key on or off using its MIDI note value; - @param note {number} MIDI note value of the key to change - @param on {boolean} Whether the note should turn on or off - */ - - value: function toggleKey(note, on) { - this.keys[note - this.range.low].flip(on); - } - }, - toggleIndex: { - - /** - Turn a key on or off using its key index on the piano interface. - @param index {number} Index of the key to change - @param on {boolean} Whether the note should turn on or off - */ - - value: function toggleIndex(index, on) { - this.keys[index].flip(on); - } - } - }); - - return Piano; - })(Interface); - - module.exports = Piano; - - // loop through and render the keys? - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var dom = __webpack_require__(7); - var Interface = __webpack_require__(6); - var ButtonTemplate = __webpack_require__(17); - var MatrixModel = __webpack_require__(25); - var CounterModel = __webpack_require__(28); - var touch = __webpack_require__(9); - - var MatrixCell = (function (_ButtonTemplate) { - function MatrixCell() { - _classCallCheck(this, MatrixCell); - - var options = ["value"]; - - var defaults = { - size: [80, 80], - target: false, - mode: "toggle", - value: 0 - }; - - _get(Object.getPrototypeOf(MatrixCell.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.index = this.settings.index; - this.row = this.settings.row; - this.column = this.settings.column; - - this.matrix = this.settings.matrix; - - this.interacting = false; - this.paintbrush = false; - - this.init(); - this.render(); - } - - _inherits(MatrixCell, _ButtonTemplate); - - _createClass(MatrixCell, { - buildFrame: { - value: function buildFrame() { - this.element = svg.create("svg"); - this.element.setAttribute("width", this.width); - this.element.setAttribute("height", this.height); - this.element.style.top = "0px"; - this.element.style.left = "0px"; - this.element.style.position = "absolute"; - this.parent.appendChild(this.element); - } - }, - buildInterface: { - value: function buildInterface() { - var _this = this; - - this.pad = svg.create("rect"); - this.element.appendChild(this.pad); - - this.interactionTarget = this.pad; - - /* events */ - - if (!touch.exists) { - - this.click = function () { - _this.matrix.interacting = true; - _this.matrix.paintbrush = !_this.state; - _this.down(_this.matrix.paintbrush); - }; - this.pad.addEventListener("mouseover", function () { - if (_this.matrix.interacting) { - _this.down(_this.matrix.paintbrush); - } - }); - - this.move = function () {}; - this.pad.addEventListener("mousemove", function (e) { - if (_this.matrix.interacting) { - if (!_this.offset) { - _this.offset = dom.findPosition(_this.element); - } - _this.mouse = dom.locateMouse(e, _this.offset); - _this.bend(); - } - }); - - this.release = function () { - _this.matrix.interacting = false; - }; - this.pad.addEventListener("mouseup", function () { - if (_this.matrix.interacting) { - _this.up(); - } - }); - this.pad.addEventListener("mouseout", function () { - if (_this.matrix.interacting) { - _this.up(); - } - }); - } - } - }, - sizeInterface: { - value: function sizeInterface() { - - this.pad.setAttribute("x", 1); - this.pad.setAttribute("y", 1); - if (this.width > 2) { - this.pad.setAttribute("width", this.width - 2); - } else { - this.pad.setAttribute("width", this.width); - } - if (this.height > 2) { - this.pad.setAttribute("height", this.height - 2); - } else { - this.pad.setAttribute("height", this.height); - } - //this.pad.setAttribute('height', this.height - 2); - this.pad.setAttribute("fill", this.matrix.colors.fill); - } - }, - render: { - value: function render() { - if (!this.state) { - this.pad.setAttribute("fill", this.matrix.colors.fill); - } else { - this.pad.setAttribute("fill", this.matrix.colors.accent); - } - } - } - }); - - return MatrixCell; - })(ButtonTemplate); - - /** - * Sequencer - * - * @description Grid of buttons with built-in step sequencer. - * - * @demo <div nexus-ui="sequencer" style="width:400px;height:200px;"></div> - * - * @example - * var sequencer = new Nexus.Sequencer('#target') - * - * @example - * var sequencer = new Nexus.Sequencer('#target',{ - * 'size': [400,200], - * 'mode': 'toggle', - * 'rows': 5, - * 'columns': 10 - *}) - * - * @output - * change - * Fires any time the interface's matrix changes. <br> - * The event data is an object containing <i>row</i> (number), <i>column</i> (number), and <i>state</i> (boolean) properties. - * - * @outputexample - * sequencer.on('change',function(v) { - * console.log(v); - * }) - * - * @output - * step - * Fires any time the sequencer steps to the next column, in sequece mode. <br> - * The event data is an <i>array</i> containing all values in the column, <i>bottom row first</i>. - * - * @outputexample - * sequencer.on('step',function(v) { - * console.log(v); - * }) - */ - - var Sequencer = (function (_Interface) { - function Sequencer() { - _classCallCheck(this, Sequencer); - - var options = ["value"]; - - var defaults = { - size: [400, 200], - mode: "toggle", - rows: 5, - columns: 10 - }; - - _get(Object.getPrototypeOf(Sequencer.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.active = -1; - - /** - * Button interaction mode: see Button - * @type {string} - * @example button.mode = 'toggle'; - */ - this.mode = this.settings.mode; - - /** - * The interval object which controls timing and sequence scheduling. - * @type {interval} - */ - this.interval = new Nexus.Interval(200, function () {}, false); // jshint ignore:line - - /** - * A Matrix model containing methods for manipulating the sequencer's array of values. To learn how to manipulate the matrix, read about the matrix model. - * @type {matrix} - */ - this.matrix = new MatrixModel(this.settings.rows, this.settings.columns); - this.matrix.ui = this; - - /** - * A Counter model which the sequencer steps through. For example, you could use this model to step through the sequencer in reverse, randomly, or in a drunk walk. - * @type {counter} - */ - this.stepper = new CounterModel(0, this.columns); - - this.init(); - } - - _inherits(Sequencer, _Interface); - - _createClass(Sequencer, { - buildFrame: { - value: function buildFrame() { - this.element = document.createElement("div"); - this.element.style.position = "relative"; - this.element.style.display = "block"; - this.element.style.width = "100%"; - this.element.style.height = "100%"; - this.parent.appendChild(this.element); - if (touch.exists) { - this.addTouchListeners(); - } - } - }, - buildInterface: { - value: function buildInterface() { - - this.cells = []; - for (var i = 0; i < this.matrix.length; i++) { - - var _location = this.matrix.locate(i); - // returns {row,col} - - var container = document.createElement("span"); - container.style.position = "absolute"; - - var cell = new MatrixCell(container, { - component: true, - index: i, - row: _location.row, - column: _location.column, - mode: this.mode, - matrix: this - }, this.keyChange.bind(this, i)); - - // cell.matrix = this; - if (touch.exists) { - cell.pad.index = i; - cell.preClick = cell.preMove = cell.preRelease = function () {}; - cell.click = cell.move = cell.release = function () {}; - cell.preTouch = cell.preTouchMove = cell.preTouchRelease = function () {}; - cell.touch = cell.touchMove = cell.touchRelease = function () {}; - } - - this.cells.push(cell); - this.element.appendChild(container); - } - this.sizeInterface(); - } - }, - sizeInterface: { - value: function sizeInterface() { - - var cellWidth = this.width / this.columns; - var cellHeight = this.height / this.rows; - - for (var i = 0; i < this.cells.length; i++) { - var container = this.cells[i].parent; - container.style.left = this.cells[i].column * cellWidth + "px"; - container.style.top = this.cells[i].row * cellHeight + "px"; - this.cells[i].resize(cellWidth, cellHeight); - } - } - }, - colorInterface: { - value: function colorInterface() { - for (var i = 0; i < this.cells.length; i++) { - this.cells[i].render(); - } - } - }, - update: { - value: function update() { - var _this = this; - - // console.log("updating...") - //on = on || false; - this.matrix.iterate(function (r, c, i) { - // console.log(this.matrix.pattern[r][c], this.cells[i].state); - if (_this.matrix.pattern[r][c] !== _this.cells[i].state) { - if (_this.matrix.pattern[r][c] > 0) { - _this.cells[i].turnOn(); - } else { - _this.cells[i].turnOff(); - } - } - }); - } - }, - keyChange: { - - // update => cell.turnOn => cell.emit => keyChange (seq.emit) => matrix.set.cell => update - // - // interaction => keyChange => matrix.set.cell => update => cell.turnOn - // => emit - // - // set.cell => update => needs to emit. - - value: function keyChange(note, on) { - // emit data for any key turning on/off - // i is the note index - // v is whether it is on or off - var cell = this.matrix.locate(note); - // this.matrix.set.cell(cell.column,cell.row,on); - this.matrix.pattern[cell.row][cell.column] = on; - var data = { - row: cell.row, - column: cell.column, - state: on - }; - this.emit("change", data); - } - }, - render: { - value: function render() { - var _this = this; - - if (this.stepper.value >= 0) { - this.matrix.iterate(function (r, c, i) { - if (c === _this.stepper.value) { - _this.cells[i].pad.setAttribute("stroke", _this.colors.mediumLight); - _this.cells[i].pad.setAttribute("stroke-width", "1"); - _this.cells[i].pad.setAttribute("stroke-opacity", "1"); - } else { - _this.cells[i].pad.setAttribute("stroke", "none"); - } - }); - } - } - }, - start: { - - /** - * Start sequencing - * @param {number} ms Beat tempo in milliseconds - */ - - value: function start(ms) { - this.interval.event = this.next.bind(this); - if (ms) { - this.interval.ms(ms); - } - this.interval.start(); - } - }, - stop: { - - /** - Stop sequencing - */ - - value: function stop() { - this.interval.stop(); - } - }, - next: { - - /** - Manually jump to the next column and trigger the 'change' event. The "next" column is determined by your mode of sequencing. - */ - - value: function next() { - this.stepper.next(); - this.emit("step", this.matrix.column(this.stepper.value).reverse()); - this.render(); - } - }, - addTouchListeners: { - value: function addTouchListeners() { - var _this = this; - - this.preClick = this.preMove = this.preRelease = function () {}; - this.click = this.move = this.release = function () {}; - this.preTouch = this.preTouchMove = this.preTouchRelease = function () {}; - this.touch = this.touchMove = this.touchRelease = function () {}; - - this.currentElement = false; - - this.element.addEventListener("touchstart", function (e) { - var element = document.elementFromPoint(e.targetTouches[0].clientX, e.targetTouches[0].clientY); - var cell = _this.cells[element.index]; - _this.paintbrush = !cell.state; - cell.down(_this.paintbrush); - _this.currentElement = element.index; - e.preventDefault(); - e.stopPropagation(); - }); - - this.element.addEventListener("touchmove", function (e) { - var element = document.elementFromPoint(e.targetTouches[0].clientX, e.targetTouches[0].clientY); - var cell = _this.cells[element.index]; - if (element.index !== _this.currentElement) { - if (_this.currentElement >= 0) { - var pastCell = _this.cells[_this.currentElement]; - pastCell.up(); - } - cell.down(_this.paintbrush); - } else { - cell.bend(); - } - _this.currentElement = element.index; - e.preventDefault(); - e.stopPropagation(); - }); - - this.element.addEventListener("touchend", function (e) { - // no touches to calculate because none remaining - var cell = _this.cells[_this.currentElement]; - cell.up(); - _this.interacting = false; - _this.currentElement = false; - e.preventDefault(); - e.stopPropagation(); - }); - } - }, - rows: { - - /** - Number of rows in the sequencer - @type {number} - */ - - get: function () { - return this.matrix.rows; - }, - set: function (v) { - this.matrix.rows = v; - this.empty(); - this.buildInterface(); - this.update(); - } - }, - columns: { - - /** - Number of columns in the sequencer - @type {number} - */ - - get: function () { - return this.matrix.columns; - }, - set: function (v) { - this.matrix.columns = v; - this.stepper.max = v; - this.empty(); - this.buildInterface(); - this.update(); - } - } - }); - - return Sequencer; - })(Interface); - - module.exports = Sequencer; - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var math = _interopRequire(__webpack_require__(5)); - - var Sequence = _interopRequire(__webpack_require__(26)); - - // For the tutorial, looking at - - //Pattern section: - // .create(), .rows, .columns, - // .pattern, .length, .formatAsText(), .log(), - // .locate(i), .indexOf(c,r) - // row(), column() (returns contents of row or colum) - - //Control section: - // toggle x3 - // set x4 - // rotate x3 - // populate x3 - // erase x3 - - // should some version of this have a float value for each cell? - // could be like a mirror .pattern that has values. by default, everything is 1, but could be set... - // not a good way to do that on interface, but as a model it would be nice... - // for .formatAsText(), could multiply by 100 and floor, so each cell is an int from 0 to 9 - - var Matrix = (function () { - function Matrix(rows, columns) { - var _this = this; - - _classCallCheck(this, Matrix); - - // should also have ability to create using an existing matrix (2d array) - this.pattern = []; - this.create(rows, columns); - - this.toggle = { - cell: function (column, row) { - _this.pattern[row][column] = !_this.pattern[row][column]; // math.invert(this.pattern[row][column]); - if (_this.ui) { - _this.ui.update(); - } - return _this.pattern[row][column]; - }, - all: function () { - _this.iterate(function (r, c) { - _this.toggle.cell(c, r); - }); - if (_this.ui) { - _this.ui.update(); - } - }, - row: function (row) { - for (var i = 0; i < _this.columns; i++) { - _this.toggle.cell(i, row); - } - if (_this.ui) { - _this.ui.update(); - } - }, - column: function (column) { - for (var i = 0; i < _this.rows; i++) { - _this.toggle.cell(column, i); - } - if (_this.ui) { - _this.ui.update(); - } - } - }; - - this.set = { - cell: function (column, row, value) { - _this.pattern[row][column] = value; - if (_this.ui) { - _this.ui.update(); - } - }, - all: function (values) { - // set the whole matrix using a 2d array as input - // this should also resize the array? - _this.pattern = values; - if (_this.ui) { - _this.ui.update(); - } - }, - row: function (row, values) { - // set a row using an array as input - _this.pattern[row] = values; - if (_this.ui) { - _this.ui.update(); - } - }, - column: function (column, values) { - // set a column using an array as input - _this.pattern.forEach(function (row, i) { - _this.pattern[i][column] = values[i]; - }); - if (_this.ui) { - _this.ui.update(); - } - } - }; - - this.rotate = { - //should eventually do (amountX, amountY) here - // could just use a loop and this.rotate.row(i,amountX); - all: function (amount) { - if (!amount && amount !== 0) { - amount = 1; - } - amount %= _this.pattern[0].length; - if (amount < 0) { - amount = _this.pattern[0].length + amount; - } - for (var i = 0; i < _this.rows; i++) { - var cut = _this.pattern[i].splice(_this.pattern[i].length - amount, amount); - _this.pattern[i] = cut.concat(_this.pattern[i]); - } - if (_this.ui) { - _this.ui.update(); - } - }, - row: function (row, amount) { - if (!amount && amount !== 0) { - amount = 1; - } - amount %= _this.pattern[0].length; - if (amount < 0) { - amount = _this.pattern[0].length + amount; - } - var cut = _this.pattern[row].splice(_this.pattern[row].length - amount, amount); - _this.pattern[row] = cut.concat(_this.pattern[row]); - if (_this.ui) { - _this.ui.update(); - } - }, - column: function (column, amount) { - if (!amount && amount !== 0) { - amount = 1; - } - amount %= _this.pattern.length; - if (amount < 0) { - amount = _this.pattern.length + amount; - } - var proxy = []; - _this.pattern.forEach(function (row) { - proxy.push(row[column]); - }); - var cut = proxy.splice(proxy.length - amount, amount); - proxy = cut.concat(proxy); - _this.pattern.forEach(function (row, i) { - row[column] = proxy[i]; - }); - if (_this.ui) { - _this.ui.update(); - } - } - }; - - // the idea behind populate is to be able to set a whole row or column to 0 or 1 - // IF the value is a float, such as 0.7, then it would become a probability - // so populate(0.7) would give each cell a 70% chance of being 1 - this.populate = { - all: function (odds) { - var oddsSequence = new Sequence(odds); - _this.iterate(function (r, c) { - _this.pattern[r][c] = math.coin(oddsSequence.next()); - }); - // This could be used so that each row has same odds pattern, even if row length is not divisibly by sequence length. - //,() => { - // odds.pos = -1; - // } - if (_this.ui) { - _this.ui.update(); - } - }, - row: function () { - var row = arguments[0] === undefined ? 0 : arguments[0]; - var odds = arguments[1] === undefined ? 1 : arguments[1]; - - var oddsSequence = new Sequence(odds); - _this.pattern[row].forEach(function (cell, i) { - _this.pattern[row][i] = math.coin(oddsSequence.next()); - }); - if (_this.ui) { - _this.ui.update(); - } - }, - column: function () { - var column = arguments[0] === undefined ? 0 : arguments[0]; - var odds = arguments[1] === undefined ? 1 : arguments[1]; - - var oddsSequence = new Sequence(odds); - _this.pattern.forEach(function (row, i) { - _this.pattern[i][column] = math.coin(oddsSequence.next()); - }); - if (_this.ui) { - _this.ui.update(); - } - } - }; - - // essentiall populate(0) so i'm not sure if this is necessary but is nice - this.erase = { - all: function () { - _this.set.all(0); - }, - row: function (row) { - _this.set.row(row, 0); - }, - column: function (column) { - _this.set.column(column, 0); - } - }; - - // end constructor - } - - _createClass(Matrix, { - create: { - value: function create(rows, columns) { - var _this = this; - - this.pattern = []; - for (var row = 0; row < rows; row++) { - var arr = new Array(columns); - this.pattern.push(arr); - } - this.iterate(function (r, c) { - _this.pattern[r][c] = false; - }); - } - }, - iterate: { - value: function iterate(f, f2) { - var i = 0; - for (var row = 0; row < this.rows; row++) { - if (f2) { - f2(row); - } - for (var column = 0; column < this.columns; column++) { - f(row, column, i); - i++; - } - } - } - }, - formatAsText: { - value: function formatAsText() { - var _this = this; - - var patternString = ""; - this.iterate(function (r, c) { - patternString += (_this.pattern[r][c] ? 1 : 0) + " "; - }, function () { - patternString += "\n"; - }); - return patternString; - } - }, - log: { - value: function log() { - console.log(this.formatAsText()); - } - }, - update: { - value: function update(pattern) { - this.pattern = pattern || this.pattern; - } - }, - length: { - get: function () { - return this.rows * this.columns; - } - }, - locate: { - value: function locate(index) { - // returns row and column of cell by index - return { - row: ~ ~(index / this.columns), - column: index % this.columns - }; - } - }, - indexOf: { - value: function indexOf(row, column) { - return column + row * this.columns; - // returns index of cell by row and column - } - }, - row: { - value: (function (_row) { - var _rowWrapper = function row(_x) { - return _row.apply(this, arguments); - }; - - _rowWrapper.toString = function () { - return _row.toString(); - }; - - return _rowWrapper; - })(function (row) { - var data = []; - for (var i = 0; i < this.columns; i++) { - data.push(this.pattern[row] ? 1 : 0); - } - return data; - }) - }, - column: { - value: (function (_column) { - var _columnWrapper = function column(_x2) { - return _column.apply(this, arguments); - }; - - _columnWrapper.toString = function () { - return _column.toString(); - }; - - return _columnWrapper; - })(function (column) { - var data = []; - for (var i = 0; i < this.rows; i++) { - data.push(this.pattern[i][column] ? 1 : 0); - } - return data; - }) - }, - rows: { - get: function () { - return this.pattern.length; - }, - set: function (v) { - var _this = this; - - var previous = this.pattern.slice(0); - this.create(v, this.columns); - this.iterate(function (r, c) { - if (previous[r] && previous[r][c]) { - _this.pattern[r][c] = previous[r][c]; - } - }); - } - }, - columns: { - get: function () { - return this.pattern[0].length; - }, - set: function (v) { - var _this = this; - - var previous = this.pattern.slice(0); - this.create(this.rows, v); - this.iterate(function (r, c) { - if (previous[r] && previous[r][c]) { - _this.pattern[r][c] = previous[r][c]; - } - }); - } - } - }); - - return Matrix; - })(); - - module.exports = Matrix; - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var math = _interopRequire(__webpack_require__(5)); - - var Drunk = _interopRequire(__webpack_require__(27)); - - var Sequence = (function () { - function Sequence() { - var sequence = arguments[0] === undefined ? [0, 10, 20, 30] : arguments[0]; - var mode = arguments[1] === undefined ? "up" : arguments[1]; - var position = arguments[2] === undefined ? false : arguments[2]; - - _classCallCheck(this, Sequence); - - this.values = sequence; - if (!Array.isArray(this.values)) { - this.values = [this.values]; - } - this._mode = mode; - this.position = position; - - this.drunkWalk = new Drunk(0, this.values.length - 1); - - this.startValues = { - up: 0, - down: this.values.length - 1, - drunk: ~ ~(this.values.length / 2), - random: math.ri(this.values.length) - }; - - if (this.position !== false) { - this.next = this[this._mode]; - } else { - this.next = this.first; - } - } - - _createClass(Sequence, { - mode: { - get: function () { - return this._mode; - }, - set: function (mode) { - if (!(mode === "up" || mode === "down" || mode === "random" || mode === "drunk")) { - console.error("The only modes currently allowed are: up, down, random, drunk"); - return; - } - this._mode = mode; - if (this.position) { - this.next = this[this._mode]; - } - } - }, - value: { - get: function () { - return this.values[this.position]; - }, - set: function (v) { - this.position = this.values.indexOf(v); - } - }, - first: { - value: function first() { - if (this.position !== false) { - this.next = this[this._mode]; - return this.next(); - } - this.position = this.startValues[this._mode]; - this.next = this[this._mode]; - return this.value; - } - }, - up: { - value: function up() { - this.position++; - this.position %= this.values.length; - return this.value; - } - }, - down: { - value: function down() { - this.position--; - if (this.position < 0) { - this.position = (this.position + this.values.length) % this.values.length; - } - return this.value; - } - }, - random: { - value: function random() { - this.position = math.ri(0, this.values.length); - return this.value; - } - }, - drunk: { - value: function drunk() { - this.drunkWalk.max = this.values.length; - this.drunkWalk.value = this.position; - this.position = this.drunkWalk.next(); - return this.value; - } - - /* future methods
- .group(start,stop) -- outputs a group of n items from the list, with wrapping
- .loop(start,stop) -- confines sequencing to a subset of the values
- (could even have a distinction between .originalValues and the array of values being used)
- */ - - } - }); - - return Sequence; - })(); - - module.exports = Sequence; - -/***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var math = _interopRequire(__webpack_require__(5)); - - var Drunk = (function () { - function Drunk() { - var min = arguments[0] === undefined ? 0 : arguments[0]; - var max = arguments[1] === undefined ? 9 : arguments[1]; - var value = arguments[2] === undefined ? 0 : arguments[2]; - var increment = arguments[3] === undefined ? 1 : arguments[3]; - var loop = arguments[4] === undefined ? false : arguments[4]; - - _classCallCheck(this, Drunk); - - this.min = min; - this.max = max; - this.value = value; - this.increment = increment; - this.loop = loop; - } - - _createClass(Drunk, { - next: { - value: function next() { - this.value += math.pick(-1 * this.increment, this.increment); - if (this.value > this.max) { - if (this.loop) { - this.value = this.min; - } else { - this.value = this.max - this.increment; - } - } - - if (this.value < this.min) { - if (this.loop) { - this.value = this.max; - } else { - this.value = this.min + this.increment; - } - } - return this.value; - } - } - }); - - return Drunk; - })(); - - module.exports = Drunk; - -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var math = _interopRequire(__webpack_require__(5)); - - var Drunk = _interopRequire(__webpack_require__(27)); - - var Counter = (function () { - function Counter() { - var min = arguments[0] === undefined ? 0 : arguments[0]; - var max = arguments[1] === undefined ? 10 : arguments[1]; - var mode = arguments[2] === undefined ? "up" : arguments[2]; - var value = arguments[3] === undefined ? false : arguments[3]; - - _classCallCheck(this, Counter); - - this.min = min; - this.max = max; - this.value = value; - this.mode = mode; - this.drunkWalk = new Drunk(this.min, this.max); - if (this.value !== false) { - this.next = this[this._mode]; - } else { - this.next = this.first; - } - } - - _createClass(Counter, { - mode: { - set: function (mode) { - if (!(mode === "up" || mode === "down" || mode === "random" || mode === "drunk")) { - console.error("The only modes currently allowed are: up, down, random, drunk"); - return; - } - this._mode = mode; - if (this.value) { - this.next = this[this._mode]; - } - }, - get: function () { - return this._mode; - } - }, - first: { - value: function first() { - if (this.value !== false) { - this.next = this[this._mode]; - return this.next(); - } - this.startValues = { - up: this.min, - down: this.max, - drunk: ~ ~math.average(this.min, this.max), - random: math.ri(this.min, this.max) - }; - this.value = this.startValues[this._mode]; - this.next = this[this._mode]; - return this.value; - } - }, - up: { - value: function up() { - this.value++; - if (this.value >= this.max) { - this.value = this.min; - } - return this.value; - } - }, - down: { - value: function down() { - this.value--; - if (this.value < this.min) { - this.value = this.max; - } - return this.value; - } - }, - random: { - value: function random() { - this.value = math.ri(this.min, this.max); - return this.value; - } - }, - drunk: { - value: function drunk() { - this.drunkWalk.min = this.min; - this.drunkWalk.max = this.max; - this.drunkWalk.value = this.value; - this.value = this.drunkWalk.next(); - return this.value; - } - } - }); - - return Counter; - })(); - - module.exports = Counter; - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var math = __webpack_require__(5); - var Interface = __webpack_require__(6); - var Step = __webpack_require__(11); - - var Interaction = _interopRequireWildcard(__webpack_require__(12)); - - /** - * Pan2D - * - * @description Interface for moving a sound around an array of speakers. Speaker locations can be customized. The interface calculates the closeness of the sound source to each speaker and returns that distance as a numeric value. - * - * @demo <span nexus-ui="pan2D"></span> - * - * @example - * var pan2d = new Nexus.Pan2d('#target') - * - * @example - * var pan2d = new Nexus.Pan2D('#target',{ - * 'size': [200,200], - * 'range': 0.5, // detection radius of each speaker - * 'mode': 'absolute', // 'absolute' or 'relative' sound movement - * 'speakers': [ // the speaker [x,y] positions - * [0.5,0.2], - * [0.75,0.25], - * [0.8,0.5], - * [0.75,0.75], - * [0.5,0.8], - * [0.25,0.75] - * [0.2,0.5], - * [0.25,0.25] - * ] - * }) - * - * @output - * change - * Fires any time the "source" node's position changes. <br> - * The event data is an array of the amplitudes (0-1), representing the level of each speaker (as calculated by its distance to the audio source). - * - * @outputexample - * pan2d.on('change',function(v) { - * console.log(v); - * }) - * - */ - - var Pan2D = (function (_Interface) { - function Pan2D() { - _classCallCheck(this, Pan2D); - - var options = ["range"]; - - var defaults = { - size: [200, 200], - range: 0.5, - mode: "absolute", - speakers: [[0.5, 0.2], [0.75, 0.25], [0.8, 0.5], [0.75, 0.75], [0.5, 0.8], [0.25, 0.75], [0.2, 0.5], [0.25, 0.25]] - }; - - _get(Object.getPrototypeOf(Pan2D.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.value = { - x: new Step(0, 1, 0, 0.5), - y: new Step(0, 1, 0, 0.5) - }; - - /** - Absolute or relative mouse interaction. In "absolute" mode, the source node will jump to your mouse position on mouse click. In "relative" mode, it does not. - */ - this.mode = this.settings.mode; - - this.position = { - x: new Interaction.Handle(this.mode, "horizontal", [0, this.width], [this.height, 0]), - y: new Interaction.Handle(this.mode, "vertical", [0, this.width], [this.height, 0]) - }; - this.position.x.value = this.value.x.normalized; - this.position.y.value = this.value.y.normalized; - - /** - An array of speaker locations. Update this with .moveSpeaker() or .moveAllSpeakers() - */ - this.speakers = this.settings.speakers; - - /** - Rewrite: The maximum distance from a speaker that the source node can be for it to be heard from that speaker. A low range (0.1) will result in speakers only playing when the sound is very close it. Default is 0.5 (half of the interface). - */ - this.range = this.settings.range; - - /** - The current levels for each speaker. This is calculated when a source node or speaker node is moved through interaction or programatically. - */ - this.levels = []; - - this.init(); - - this.calculateLevels(); - this.render(); - } - - _inherits(Pan2D, _Interface); - - _createClass(Pan2D, { - buildInterface: { - value: function buildInterface() { - - this.knob = svg.create("circle"); - - this.element.appendChild(this.knob); - - // add speakers - this.speakerElements = []; - - for (var i = 0; i < this.speakers.length; i++) { - var speakerElement = svg.create("circle"); - - this.element.appendChild(speakerElement); - - this.speakerElements.push(speakerElement); - } - } - }, - sizeInterface: { - value: function sizeInterface() { - - this._minDimension = Math.min(this.width, this.height); - - this.knobRadius = { - off: ~ ~(this._minDimension / 100) * 3 + 5 }; - this.knobRadius.on = this.knobRadius.off * 2; - - this.knob.setAttribute("cx", this.width / 2); - this.knob.setAttribute("cy", this.height / 2); - this.knob.setAttribute("r", this.knobRadius.off); - - for (var i = 0; i < this.speakers.length; i++) { - var speakerElement = this.speakerElements[i]; - var speaker = this.speakers[i]; - speakerElement.setAttribute("cx", speaker[0] * this.width); - speakerElement.setAttribute("cy", speaker[1] * this.height); - speakerElement.setAttribute("r", this._minDimension / 20 + 5); - speakerElement.setAttribute("fill-opacity", "0"); - } - - this.position.x.resize([0, this.width], [this.height, 0]); - this.position.y.resize([0, this.width], [this.height, 0]); - - // next, need to - // resize positions - // calculate speaker distances - this.calculateLevels(); - this.render(); - } - }, - colorInterface: { - value: function colorInterface() { - - this.element.style.backgroundColor = this.colors.fill; - this.knob.setAttribute("fill", this.colors.mediumLight); - - for (var i = 0; i < this.speakers.length; i++) { - var speakerElement = this.speakerElements[i]; - speakerElement.setAttribute("fill", this.colors.accent); - speakerElement.setAttribute("stroke", this.colors.accent); - } - } - }, - render: { - value: function render() { - this.knobCoordinates = { - x: this.value.x.normalized * this.width, - y: this.height - this.value.y.normalized * this.height - }; - - this.knob.setAttribute("cx", this.knobCoordinates.x); - this.knob.setAttribute("cy", this.knobCoordinates.y); - } - }, - click: { - value: function click() { - this.position.x.anchor = this.mouse; - this.position.y.anchor = this.mouse; - this.move(); - } - }, - move: { - value: function move() { - if (this.clicked) { - this.position.x.update(this.mouse); - this.position.y.update(this.mouse); - // position.x and position.y are normalized - // so are the levels - // likely don't need this.value at all -- only used for drawing - // not going to be a 'step' or 'min' and 'max' in this one. - this.calculateLevels(); - this.emit("change", this.levels); - this.render(); - } - } - }, - release: { - value: function release() { - this.render(); - } - }, - normalized: { - get: function () { - return { - x: this.value.x.normalized, - y: this.value.y.normalized - }; - } - }, - calculateLevels: { - value: function calculateLevels() { - var _this = this; - - this.value.x.updateNormal(this.position.x.value); - this.value.y.updateNormal(this.position.y.value); - this.levels = []; - this.speakers.forEach(function (s, i) { - var distance = math.distance(s[0] * _this.width, s[1] * _this.height, _this.position.x.value * _this.width, (1 - _this.position.y.value) * _this.height); - var level = math.clip(1 - distance / (_this.range * _this.width), 0, 1); - _this.levels.push(level); - _this.speakerElements[i].setAttribute("fill-opacity", level); - }); - } - }, - moveSource: { - - /** - Move the audio source node and trigger the output event. - @param x {number} New x location, normalized 0-1 - @param y {number} New y location, normalized 0-1 - */ - - value: function moveSource(x, y) { - var location = { - x: x * this.width, - y: y * this.height - }; - this.position.x.update(location); - this.position.y.update(location); - this.calculateLevels(); - this.emit("change", this.levels); - this.render(); - } - }, - moveSpeaker: { - - /** - Move a speaker node and trigger the output event. - @param index {number} Index of the speaker to move - @param x {number} New x location, normalized 0-1 - @param y {number} New y location, normalized 0-1 - */ - - value: function moveSpeaker(index, x, y) { - - this.speakers[index] = [x, y]; - this.speakerElements[index].setAttribute("cx", x * this.width); - this.speakerElements[index].setAttribute("cy", y * this.height); - this.calculateLevels(); - this.emit("change", this.levels); - this.render(); - } - - /** - Set all speaker locations - @param locations {Array} Array of speaker locations. Each item in the array should be an array of normalized x and y coordinates. - setSpeakers(locations) { - } - */ - - } - }); - - return Pan2D; - })(Interface); - - module.exports = Pan2D; - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var math = __webpack_require__(5); - var svg = __webpack_require__(4); - var Interface = __webpack_require__(6); - - /** - * Tilt - * - * @description Device tilt sensor with 2 or 3 axes (depending on your device and browser). - * - * @demo <span nexus-ui='tilt'></span> - * - * @example - * var tilt = new Nexus.Tilt('#target') - * - * @output - * change - * Fires at a regular interval, as long as this interface is active (see the interface's <i>.active</i> property)<br> - * The event data is an <i>object</i> containing x (number) and y (number) properties which represent the current tilt state of the device. - * - * @outputexample - * tilt.on('change',function(v) { - * console.log(v); - * }) - * - * - */ - - var Tilt = (function (_Interface) { - function Tilt() { - _classCallCheck(this, Tilt); - - var options = ["value"]; - - var defaults = { - size: [80, 80] - }; - - _get(Object.getPrototypeOf(Tilt.prototype), "constructor", this).call(this, arguments, options, defaults); - - this._active = true; - - this.init(); - - // add event listener for device orientation - - this.boundUpdate = this.update.bind(this); - // this.boundMozTilt = this.mozTilt.bind(this) - - if (window.DeviceOrientationEvent) { - this.orientationListener = window.addEventListener("deviceorientation", this.boundUpdate, false); - } else { - this._active = false; - this.colorInterface(); - } - - /*else if (window.OrientationEvent) { - // window.addEventListener('MozOrientation', this.boundMozTilt, false); - } else { - console.log('Not supported on your device or browser.'); - } */ - } - - _inherits(Tilt, _Interface); - - _createClass(Tilt, { - buildInterface: { - value: function buildInterface() { - - this.title = svg.create("text"); - this.circleX = svg.create("circle"); - this.circleY = svg.create("circle"); - this.circleZ = svg.create("circle"); - - this.barX = svg.create("path"); - this.barY = svg.create("path"); - this.barZ = svg.create("path"); - - this.barX2 = svg.create("path"); - this.barY2 = svg.create("path"); - this.barZ2 = svg.create("path"); - - this.barX.setAttribute("opacity", "0.8"); - this.barY.setAttribute("opacity", "0.8"); - this.barZ.setAttribute("opacity", "0.8"); - this.barX2.setAttribute("opacity", "0.8"); - this.barY2.setAttribute("opacity", "0.8"); - this.barZ2.setAttribute("opacity", "0.8"); - - this.circleX.setAttribute("cx", this.width * 3 / 12); - this.circleX.setAttribute("cy", this.height * 3 / 4); - this.circleX.setAttribute("r", this.height / 10); - this.circleX.setAttribute("opacity", "0.4"); - - this.circleY.setAttribute("cx", this.width * 6 / 12); - this.circleY.setAttribute("cy", this.height * 3 / 4); - this.circleY.setAttribute("r", this.height / 10); - this.circleY.setAttribute("opacity", "0.4"); - - this.circleZ.setAttribute("cx", this.width * 9 / 12); - this.circleZ.setAttribute("cy", this.height * 3 / 4); - this.circleZ.setAttribute("r", this.height / 10); - this.circleZ.setAttribute("opacity", "0.4"); - - this.barX.setAttribute("stroke-width", Math.round(this.height / 30)); - this.barY.setAttribute("stroke-width", Math.round(this.height / 30)); - this.barZ.setAttribute("stroke-width", Math.round(this.height / 30)); - - this.barX.setAttribute("fill", "none"); - this.barY.setAttribute("fill", "none"); - this.barZ.setAttribute("fill", "none"); - - this.barX2.setAttribute("stroke-width", Math.round(this.height / 30)); - this.barY2.setAttribute("stroke-width", Math.round(this.height / 30)); - this.barZ2.setAttribute("stroke-width", Math.round(this.height / 30)); - - this.barX2.setAttribute("fill", "none"); - this.barY2.setAttribute("fill", "none"); - this.barZ2.setAttribute("fill", "none"); - - this.title.setAttribute("x", this.width / 2); - this.title.setAttribute("y", this.height / 3 + 7); - this.title.setAttribute("font-size", "15px"); - this.title.setAttribute("font-weight", "bold"); - this.title.setAttribute("letter-spacing", "2px"); - this.title.setAttribute("opacity", "0.7"); - this.title.setAttribute("text-anchor", "middle"); - this.title.textContent = "TILT"; - - this.element.appendChild(this.circleX); - this.element.appendChild(this.circleY); - this.element.appendChild(this.circleZ); - - this.element.appendChild(this.barX); - this.element.appendChild(this.barY); - this.element.appendChild(this.barZ); - - this.element.appendChild(this.barX2); - this.element.appendChild(this.barY2); - this.element.appendChild(this.barZ2); - - this.element.appendChild(this.title); - } - }, - colorInterface: { - value: function colorInterface() { - - if (this._active) { - this.element.style.backgroundColor = this.colors.accent; - this.circleX.setAttribute("fill", this.colors.light); - this.circleY.setAttribute("fill", this.colors.light); - this.circleZ.setAttribute("fill", this.colors.light); - this.circleX.setAttribute("stroke", this.colors.light); - this.circleY.setAttribute("stroke", this.colors.light); - this.circleZ.setAttribute("stroke", this.colors.light); - this.barX.setAttribute("stroke", this.colors.light); - this.barY.setAttribute("stroke", this.colors.light); - this.barZ.setAttribute("stroke", this.colors.light); - this.barX2.setAttribute("stroke", this.colors.light); - this.barY2.setAttribute("stroke", this.colors.light); - this.barZ2.setAttribute("stroke", this.colors.light); - this.title.setAttribute("fill", this.colors.light); - } else { - this.element.style.backgroundColor = this.colors.fill; - this.circleX.setAttribute("fill", this.colors.mediumLight); - this.circleY.setAttribute("fill", this.colors.mediumLight); - this.circleZ.setAttribute("fill", this.colors.mediumLight); - this.circleX.setAttribute("stroke", this.colors.mediumLight); - this.circleY.setAttribute("stroke", this.colors.mediumLight); - this.circleZ.setAttribute("stroke", this.colors.mediumLight); - this.barX.setAttribute("stroke", this.colors.mediumLight); - this.barY.setAttribute("stroke", this.colors.mediumLight); - this.barZ.setAttribute("stroke", this.colors.mediumLight); - this.barX2.setAttribute("stroke", this.colors.mediumLight); - this.barY2.setAttribute("stroke", this.colors.mediumLight); - this.barZ2.setAttribute("stroke", this.colors.mediumLight); - this.title.setAttribute("fill", this.colors.mediumLight); - } - } - }, - update: { - value: function update(v) { - if (this._active) { - - var y = v.beta; - var x = v.gamma; - var z = v.alpha; - - // take the original -90 to 90 scale and normalize it 0-1 - x = math.scale(x, -90, 90, 0, 1); - y = math.scale(y, -90, 90, 0, 1); - z = math.scale(z, 0, 360, 0, 1); - - var handlePoints = { - start: Math.PI * 1.5, - end: math.clip(math.scale(x, 0, 0.5, Math.PI * 1.5, Math.PI * 0.5), Math.PI * 0.5, Math.PI * 1.5) - }; - var handle2Points = { - start: Math.PI * 2.5, - end: math.clip(math.scale(x, 0.5, 1, Math.PI * 2.5, Math.PI * 1.5), Math.PI * 1.5, Math.PI * 2.5) - }; - - var handlePath = svg.arc(this.circleX.cx.baseVal.value, this.circleX.cy.baseVal.value, this.circleX.r.baseVal.value, handlePoints.start, handlePoints.end); - var handle2Path = svg.arc(this.circleX.cx.baseVal.value, this.circleX.cy.baseVal.value, this.circleX.r.baseVal.value, handle2Points.start, handle2Points.end); - - this.barX.setAttribute("d", handlePath); - this.barX2.setAttribute("d", handle2Path); - - handlePoints = { - start: Math.PI * 1.5, - end: math.clip(math.scale(y, 0, 0.5, Math.PI * 1.5, Math.PI * 0.5), Math.PI * 0.5, Math.PI * 1.5) - }; - handle2Points = { - start: Math.PI * 2.5, - end: math.clip(math.scale(y, 0.5, 1, Math.PI * 2.5, Math.PI * 1.5), Math.PI * 1.5, Math.PI * 2.5) - }; - - handlePath = svg.arc(this.circleY.cx.baseVal.value, this.circleY.cy.baseVal.value, this.circleY.r.baseVal.value, handlePoints.start, handlePoints.end); - handle2Path = svg.arc(this.circleY.cx.baseVal.value, this.circleY.cy.baseVal.value, this.circleY.r.baseVal.value, handle2Points.start, handle2Points.end); - - this.barY.setAttribute("d", handlePath); - this.barY2.setAttribute("d", handle2Path); - - handlePoints = { - start: Math.PI * 1.5, - end: math.clip(math.scale(z, 0, 0.5, Math.PI * 1.5, Math.PI * 0.5), Math.PI * 0.5, Math.PI * 1.5) - }; - handle2Points = { - start: Math.PI * 2.5, - end: math.clip(math.scale(z, 0.5, 1, Math.PI * 2.5, Math.PI * 1.5), Math.PI * 1.5, Math.PI * 2.5) - }; - - handlePath = svg.arc(this.circleZ.cx.baseVal.value, this.circleZ.cy.baseVal.value, this.circleZ.r.baseVal.value, handlePoints.start, handlePoints.end); - handle2Path = svg.arc(this.circleZ.cx.baseVal.value, this.circleZ.cy.baseVal.value, this.circleZ.r.baseVal.value, handle2Points.start, handle2Points.end); - - this.barZ.setAttribute("d", handlePath); - this.barZ2.setAttribute("d", handle2Path); - - /* - let pointsX = { - start: 0, - end: math.scale( x, 0, 1, 0, Math.PI*2 ) - }; - // console.log(this.circleX.cx.baseVal.value); - let pathX = svg.arc(this.circleX.cx.baseVal.value, this.circleX.cy.baseVal.value, this.circleX.r.baseVal.value*2, pointsX.start, pointsX.end); - this.barX.setAttribute('d',pathX); */ - - //this.textH.textContent = math.prune(x,2); - //this.textV.textContent = math.prune(y,2); - // - // this.circleX.setAttribute('opacity',x); - // this.circleY.setAttribute('opacity',y); - // this.circleZ.setAttribute('opacity',z); - - this.emit("change", { - x: x, - y: y, - z: z - }); - } - } - }, - click: { - value: function click() { - if (window.DeviceOrientationEvent) { - this.active = !this.active; - } - } - }, - active: { - - /** - Whether the interface is on (emitting values) or off (paused & not emitting values). Setting this property will update it. - @type {boolean} - */ - - get: function () { - return this._active; - }, - set: function (on) { - this._active = on; - this.colorInterface(); - } - }, - customDestroy: { - value: function customDestroy() { - window.removeEventListener("deviceorientation", this.boundUpdate, false); - } - } - }); - - return Tilt; - })(Interface); - - module.exports = Tilt; - -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var dom = __webpack_require__(7); - var math = __webpack_require__(5); - var Interface = __webpack_require__(6); - var SliderTemplate = __webpack_require__(32); - var touch = __webpack_require__(9); - - var SingleSlider = (function (_SliderTemplate) { - function SingleSlider() { - var _this = this; - - _classCallCheck(this, SingleSlider); - - var options = ["scale", "value"]; - - var defaults = { - size: [120, 20], - orientation: "vertical", - mode: "absolute", - scale: [0, 1], - step: 0, - value: 0, - hasKnob: true - }; - - _get(Object.getPrototypeOf(SingleSlider.prototype), "constructor", this).call(this, arguments, options, defaults); - - /* events */ - - if (!touch.exists) { - - this.click = function () { - _this.multislider.interacting = true; - _this.multislider.interpolation = { - index: _this.index, - value: _this.value - }; - _this.down(); - _this.multislider.values[_this.index] = _this.value; - }; - this.element.addEventListener("mouseover", function (e) { - if (_this.multislider.interacting) { - if (!_this.offset) { - _this.offset = dom.findPosition(_this.element); - } - _this.mouse = dom.locateMouse(e, _this.offset); - _this.down(); - _this.multislider.values[_this.index] = _this.value; - if (_this.multislider.interpolation) { - var distance = Math.abs(_this.multislider.interpolation.index - _this.index); - if (distance > 1) { - var low = Math.min(_this.multislider.interpolation.index, _this.index); - var high = Math.max(_this.multislider.interpolation.index, _this.index); - var lowValue = _this.multislider.sliders[low].value; - var highValue = _this.multislider.sliders[high].value; - for (var i = low; i < high; i++) { - _this.multislider.sliders[i].value = math.interp((i - low) / distance, lowValue, highValue); - var smoothedValue = _this.multislider.sliders[i].value; - _this.multislider.values[i] = smoothedValue; - _this.multislider.update(i, smoothedValue); - } - } - } - - _this.multislider.interpolation = { - index: _this.index, - value: _this.value - }; - } - }); - - this.move = function () {}; - this.element.addEventListener("mousemove", function (e) { - if (_this.multislider.interacting) { - if (!_this.offset) { - _this.offset = dom.findPosition(_this.element); - } - _this.mouse = dom.locateMouse(e, _this.offset); - _this.slide(); - _this.multislider.values[_this.index] = _this.value; - } - }); - - this.release = function () { - _this.multislider.interacting = false; - _this.multislider.interpolation = false; - }; - this.element.addEventListener("mouseup", function () { - if (_this.multislider.interacting) { - _this.up(); - _this.multislider.interpolation = false; - _this.multislider.values[_this.index] = _this.value; - } - }); - this.element.addEventListener("mouseout", function () { - if (_this.multislider.interacting) { - _this.up(); - _this.multislider.values[_this.index] = _this.value; - } - }); - } - - this.customStyle(); - } - - _inherits(SingleSlider, _SliderTemplate); - - _createClass(SingleSlider, { - customStyle: { - value: function customStyle() { - - /* style changes */ - - this.bar.setAttribute("x", 0); - this.bar.setAttribute("transform", "translate(0,0)"); - this.bar.setAttribute("rx", 0); // corner radius - this.bar.setAttribute("ry", 0); - this.bar.setAttribute("width", this.width); - this.bar.setAttribute("height", this.height); - - this.fillbar.setAttribute("x", 0); - this.fillbar.setAttribute("transform", "translate(0,0)"); - this.fillbar.setAttribute("rx", 0); // corner radius - this.fillbar.setAttribute("ry", 0); - this.fillbar.setAttribute("width", this.width); - this.fillbar.setAttribute("height", this.height); - } - } - }); - - return SingleSlider; - })(SliderTemplate); - - /** - * Multislider - * - * @description Multislider - * - * @demo <span nexus-ui="multislider"></span> - * - * @example - * var multislider = new Nexus.Multislider('#target') - * - * @example - * var multislider = new Nexus.Multislider('#target',{ - * 'size': [200,100], - * 'numberOfSliders': 5, - * 'min': 0, - * 'max': 1, - * 'step': 0, - * 'values': [0.7,0.7,0.7,0.7,0.7] - * }) - * - * @output - * change - * Fires any time the interface's value changes. <br> - * The event data an object containing <i>index</i> and <i>value</i> properties - * - * @outputexample - * multislider.on('change',function(v) { - * console.log(v); - * }) - * - */ - - /* - Properties - .values - - */ - - var Multislider = (function (_Interface) { - function Multislider() { - _classCallCheck(this, Multislider); - - var options = ["value"]; - - var defaults = { - size: [200, 100], - numberOfSliders: 5, - min: 0, - max: 1, - step: 0, - values: [0.7, 0.7, 0.7, 0.7, 0.7] - }; - - _get(Object.getPrototypeOf(Multislider.prototype), "constructor", this).call(this, arguments, options, defaults); - - this._numberOfSliders = this.settings.numberOfSliders; - this.values = this.settings.values; - - this.sliders = []; - - this.interacting = false; - - this.init(); - } - - _inherits(Multislider, _Interface); - - _createClass(Multislider, { - buildFrame: { - value: function buildFrame() { - this.element = document.createElement("div"); - this.parent.appendChild(this.element); - } - }, - buildInterface: { - value: function buildInterface() { - - var min = this.settings.min; - var max = this.settings.max; - var step = this.settings.step; - - if (this.sliders.length) { - min = this.sliders[0].min; - max = this.sliders[0].max; - step = this.sliders[0].step; - } - - this.sliders = []; - - for (var i = 0; i < this._numberOfSliders; i++) { - var container = document.createElement("span"); - - var slider = new SingleSlider(container, { - scale: [min, max], - step: step, - mode: "absolute", - orientation: "vertical", - value: this.values[i], - hasKnob: false, - component: true }, this.update.bind(this, i)); - slider.multislider = this; - - slider.index = i; - if (touch.exists) { - slider.bar.index = i; - slider.fillbar.index = i; - slider.preClick = slider.preMove = slider.preRelease = function () {}; - slider.click = slider.move = slider.release = function () {}; - slider.preTouch = slider.preTouchMove = slider.preTouchRelease = function () {}; - slider.touch = slider.touchMove = slider.touchRelease = function () {}; - } - - this.sliders.push(slider); - this.element.appendChild(container); - } - if (touch.exists) { - this.addTouchListeners(); - } - } - }, - colorInterface: { - value: function colorInterface() { - for (var i = 0; i < this.sliders.length; i++) { - this.sliders[i].colors = this.colors; - this.sliders[i].colorInterface(); - } - } - }, - sizeInterface: { - value: function sizeInterface() { - - var sliderWidth = this.width / this.sliders.length; - var sliderHeight = this.height; - - for (var i = 0; i < this.sliders.length; i++) { - this.sliders[i].resize(sliderWidth, sliderHeight); - this.sliders[i].customStyle(); - } - } - }, - update: { - value: function update(index, value) { - this.emit("change", { - index: index, - value: value - }); - } - }, - addTouchListeners: { - value: function addTouchListeners() { - var _this = this; - - this.preClick = this.preMove = this.preRelease = function () {}; - this.click = this.move = this.release = function () {}; - this.preTouch = this.preTouchMove = this.preTouchRelease = function () {}; - this.touch = this.touchMove = this.touchRelease = function () {}; - - this.currentElement = false; - - this.element.addEventListener("touchstart", function (e) { - var element = document.elementFromPoint(e.targetTouches[0].clientX, e.targetTouches[0].clientY); - var slider = _this.sliders[element.index]; - if (!slider.offset) { - slider.offset = dom.findPosition(slider.element); - } - slider.mouse = dom.locateMouse(e, slider.offset); - slider.down(); - _this.currentElement = element.index; - e.preventDefault(); - e.stopPropagation(); - }); - - this.element.addEventListener("touchmove", function (e) { - var element = document.elementFromPoint(e.targetTouches[0].clientX, e.targetTouches[0].clientY); - var slider = _this.sliders[element.index]; - if (!slider.offset) { - slider.offset = dom.findPosition(slider.element); - } - slider.mouse = dom.locateMouse(e, slider.offset); - if (element.index !== _this.currentElement) { - if (_this.currentElement >= 0) { - var pastslider = _this.sliders[_this.currentElement]; - pastslider.up(); - } - slider.down(); - } else { - slider.slide(); - } - _this.currentElement = element.index; - e.preventDefault(); - e.stopPropagation(); - }); - - this.element.addEventListener("touchend", function (e) { - // no touches to calculate because none remaining - var slider = _this.sliders[_this.currentElement]; - slider.up(); - _this.interacting = false; - _this.currentElement = false; - e.preventDefault(); - e.stopPropagation(); - }); - } - }, - numberOfSliders: { - - /** - Get or set the number of sliders - @type {Number} - */ - - get: function () { - return this.sliders.length; - }, - set: function (v) { - if (v === this.sliders.length) { - return; - } - this.sliders.forEach(function (slider) { - slider.destroy(); - }); - this.empty(); - this._numberOfSliders = v; - this.buildInterface(); - } - }, - min: { - - /** - Lower limit of the multislider's output range - @type {number} - @example multislider.min = 1000; - */ - - get: function () { - return this.sliders[0].min; - }, - set: function (v) { - this.sliders.forEach(function (slider) { - slider.min = v; - }); - } - }, - max: { - - /** - Upper limit of the multislider's output range - @type {number} - @example multislider.max = 1000; - */ - - get: function () { - return this.sliders[0].max; - }, - set: function (v) { - this.sliders.forEach(function (slider) { - slider.max = v; - }); - } - }, - step: { - - /** - The increment that the multislider's value changes by. - @type {number} - @example multislider.step = 5; - */ - - get: function () { - return this.sliders[0].step; - }, - set: function (v) { - this.sliders.forEach(function (slider) { - slider.step = v; - }); - } - }, - setSlider: { - - /** - Set the value of an individual slider - @param index {number} Slider index - @param value {number} New slider value - @example - // Set the first slider to value 0.5 - multislider.setSlider(0,0.5) - */ - - value: function setSlider(index, value) { - this.sliders[index].value = value; - this.emit("change", { - index: index, - value: value - }); - } - }, - setAllSliders: { - - /** - Set the value of all sliders at once. If the size of the input array does not match the current number of sliders, the value array will repeat until all sliders have been set. I.e. an input array of length 1 will set all sliders to that value. - @param values {Array} All slider values - @example - multislider.setAllSliders([0.2,0.3,0.4,0.5,0.6]) - */ - - value: function setAllSliders(values) { - var _this = this; - - this.values = values; - this.sliders.forEach(function (slider, i) { - slider.value = values[i % values.length]; - _this.emit("change", { - index: i, - value: slider.value - }); - }); - } - } - }); - - return Multislider; - })(Interface); - - module.exports = Multislider; - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var Interface = __webpack_require__(6); - var Step = __webpack_require__(11); - - var Interaction = _interopRequireWildcard(__webpack_require__(12)); - - var SliderTemplate = (function (_Interface) { - function SliderTemplate(args, options, defaults) { - _classCallCheck(this, SliderTemplate); - - _get(Object.getPrototypeOf(SliderTemplate.prototype), "constructor", this).call(this, args, options, defaults); - - this.orientation = this.settings.orientation; - - // this.mode = this.settings.mode; - - this.hasKnob = this.settings.hasKnob; - - // this.step should eventually be get/set - // updating it will update the _value step model - // this.step = this.settings.step; // float - - this._value = new Step(this.settings.scale[0], this.settings.scale[1], this.settings.step, this.settings.value); - - this.init(); - - this.position = new Interaction.Handle(this.settings.mode, this.orientation, [0, this.width], [this.height, 0]); - this.position.value = this._value.normalized; - - this.value = this._value.value; - - this.emit("change", this.value); - } - - _inherits(SliderTemplate, _Interface); - - _createClass(SliderTemplate, { - buildInterface: { - value: function buildInterface() { - - this.bar = svg.create("rect"); - this.fillbar = svg.create("rect"); - this.knob = svg.create("circle"); - - this.element.appendChild(this.bar); - this.element.appendChild(this.fillbar); - this.element.appendChild(this.knob); - - this.sizeInterface(); - } - }, - sizeInterface: { - value: function sizeInterface() { - - if (!this.settings.orientation) { - if (this.width < this.height) { - this.orientation = "vertical"; - } else { - this.orientation = "horizontal"; - } - } - - var x = undefined, - y = undefined, - w = undefined, - h = undefined, - barOffset = undefined, - cornerRadius = undefined; - this.knobData = { - level: 0, - r: 0 - }; - - if (this.orientation === "vertical") { - this.thickness = this.width / 2; - x = this.width / 2; - y = 0; - w = this.thickness; - h = this.height; - this.knobData.r = this.thickness * 0.8; - this.knobData.level = h - this.normalized * h; - barOffset = "translate(" + this.thickness * -1 / 2 + ",0)"; - cornerRadius = w / 2; - } else { - this.thickness = this.height / 2; - x = 0; - y = this.height / 2; - w = this.width; - h = this.thickness; - this.knobData.r = this.thickness * 0.8; - this.knobData.level = this.normalized * w; - barOffset = "translate(0," + this.thickness * -1 / 2 + ")"; - cornerRadius = h / 2; - } - - this.bar.setAttribute("x", x); - this.bar.setAttribute("y", y); - this.bar.setAttribute("transform", barOffset); - this.bar.setAttribute("rx", cornerRadius); // corner radius - this.bar.setAttribute("ry", cornerRadius); - this.bar.setAttribute("width", w); - this.bar.setAttribute("height", h); - - if (this.orientation === "vertical") { - this.fillbar.setAttribute("x", x); - this.fillbar.setAttribute("y", this.knobData.level); - this.fillbar.setAttribute("width", w); - this.fillbar.setAttribute("height", h - this.knobData.level); - } else { - this.fillbar.setAttribute("x", 0); - this.fillbar.setAttribute("y", y); - this.fillbar.setAttribute("width", this.knobData.level); - this.fillbar.setAttribute("height", h); - } - this.fillbar.setAttribute("transform", barOffset); - this.fillbar.setAttribute("rx", cornerRadius); - this.fillbar.setAttribute("ry", cornerRadius); - - if (this.orientation === "vertical") { - this.knob.setAttribute("cx", x); - this.knob.setAttribute("cy", this.knobData.level); - } else { - this.knob.setAttribute("cx", this.knobData.level); - this.knob.setAttribute("cy", y); - } - this.knob.setAttribute("r", this.knobData.r); - - if (this.position) { - this.position.resize([0, this.width], [this.height, 0]); - } - } - }, - colorInterface: { - value: function colorInterface() { - - this.bar.setAttribute("fill", this.colors.fill); - this.fillbar.setAttribute("fill", this.colors.accent); - this.knob.setAttribute("fill", this.colors.accent); - if (!this.hasKnob) { - this.knob.setAttribute("fill", "none"); - } - } - }, - render: { - value: function render() { - if (!this.clicked) { - this.knobData.r = this.thickness * 0.75; - } - this.knob.setAttribute("r", this.knobData.r); - - if (this.orientation === "vertical") { - this.knobData.level = this._value.normalized * this.height; - this.knob.setAttribute("cy", this.height - this.knobData.level); - this.fillbar.setAttribute("y", this.height - this.knobData.level); - this.fillbar.setAttribute("height", this.knobData.level); - } else { - this.knobData.level = this._value.normalized * this.width; - this.knob.setAttribute("cx", this.knobData.level); - this.fillbar.setAttribute("x", 0); - this.fillbar.setAttribute("width", this.knobData.level); - } - } - }, - down: { - value: function down() { - this.clicked = true; - this.knobData.r = this.thickness * 0.9; - this.position.anchor = this.mouse; - this.slide(); - } - }, - slide: { - value: function slide() { - if (this.clicked) { - this.position.update(this.mouse); - this.value = this._value.updateNormal(this.position.value); - this.emit("change", this.value); - } - } - }, - up: { - value: function up() { - this.clicked = false; - this.render(); - } - }, - normalized: { - get: function () { - return this._value.normalized; - } - }, - value: { - - /** - The slider's current value. If set manually, will update the interface and trigger the output event. - @type {number} - @example slider.value = 10; - */ - - get: function () { - return this._value.value; - }, - set: function (v) { - this._value.update(v); - this.position.value = this._value.normalized; - this.render(); - } - }, - min: { - - /** - Lower limit of the sliders's output range - @type {number} - @example slider.min = 1000; - */ - - get: function () { - return this._value.min; - }, - set: function (v) { - this._value.min = v; - } - }, - max: { - - /** - Upper limit of the slider's output range - @type {number} - @example slider.max = 1000; - */ - - get: function () { - return this._value.max; - }, - set: function (v) { - this._value.max = v; - } - }, - step: { - - /** - The increment that the slider's value changes by. - @type {number} - @example slider.step = 5; - */ - - get: function () { - return this._value.step; - }, - set: function (v) { - this._value.step = v; - } - }, - mode: { - - /** - Absolute mode (slider's value jumps to mouse click position) or relative mode (mouse drag changes value relative to its current position). Default: "relative". - @type {string} - @example slider.mode = "relative"; - */ - - get: function () { - return this.position.mode; - }, - set: function (v) { - this.position.mode = v; - } - } - }); - - return SliderTemplate; - })(Interface); - - module.exports = SliderTemplate; - -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var svg = __webpack_require__(4); - var math = __webpack_require__(5); - var Interface = __webpack_require__(6); - var Step = __webpack_require__(11); - - var Interaction = _interopRequireWildcard(__webpack_require__(12)); - - /** - * Pan - * - * @description Stereo crossfader. - * - * @demo <span nexus-ui="pan"></span> - * - * @example - * var pan = new Nexus.Pan('#target') - * - * @output - * change - * Fires any time the interface's value changes. <br> - * The event data is an object containing the interface's <i>value</i> (-1 to 1), as well as <i>L</i> and <i>R</i> amplitude values (0-1) for left and right speakers, calculated by a square-root crossfade algorithm. - * - * @outputexample - * pan.on('change',function(v) { - * console.log(v); - * }) - * - * - */ - - var Pan = (function (_Interface) { - function Pan() { - _classCallCheck(this, Pan); - - var options = ["scale", "value"]; - - var defaults = { - size: [120, 20], - orientation: "horizontal", - mode: "relative", - scale: [-1, 1], - step: 0, - value: 0, - hasKnob: true - }; - - _get(Object.getPrototypeOf(Pan.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.orientation = this.settings.orientation; - - this.mode = this.settings.mode; - - this.hasKnob = this.settings.hasKnob; - - // this.step should eventually be get/set - // updating it will update the _value step model - this.step = this.settings.step; // float - - this._value = new Step(this.settings.scale[0], this.settings.scale[1], this.settings.step, this.settings.value); - - this.init(); - - this.position = new Interaction.Handle(this.mode, this.orientation, [0, this.width], [this.height, 0]); - this.position.value = this._value.normalized; - - this.value = this._value.value; - - this.emit("change", this.value); - } - - _inherits(Pan, _Interface); - - _createClass(Pan, { - buildInterface: { - value: function buildInterface() { - - this.bar = svg.create("rect"); - this.knob = svg.create("circle"); - - this.element.appendChild(this.bar); - this.element.appendChild(this.knob); - } - }, - sizeInterface: { - value: function sizeInterface() { - - if (this.position) { - this.position.resize([0, this.width], [this.height, 0]); - } - - if (this.width < this.height) { - this.orientation = "vertical"; - } else { - this.orientation = "horizontal"; - } - - var x = undefined, - y = undefined, - w = undefined, - h = undefined, - barOffset = undefined, - cornerRadius = undefined; - this.knobData = { - level: 0, - r: 0 - }; - - if (this.orientation === "vertical") { - this.thickness = this.width / 2; - x = this.width / 2; - y = 0; - w = this.thickness; - h = this.height; - this.knobData.r = this.thickness * 0.8; - this.knobData.level = h - this.knobData.r - this.normalized * (h - this.knobData.r * 2); - barOffset = "translate(" + this.thickness * -1 / 2 + ",0)"; - cornerRadius = w / 2; - } else { - this.thickness = this.height / 2; - x = 0; - y = this.height / 2; - w = this.width; - h = this.thickness; - this.knobData.r = this.thickness * 0.8; - this.knobData.level = this.normalized * (w - this.knobData.r * 2) + this.knobData.r; - barOffset = "translate(0," + this.thickness * -1 / 2 + ")"; - cornerRadius = h / 2; - } - - this.bar.setAttribute("x", x); - this.bar.setAttribute("y", y); - this.bar.setAttribute("transform", barOffset); - this.bar.setAttribute("rx", cornerRadius); // corner radius - this.bar.setAttribute("ry", cornerRadius); - this.bar.setAttribute("width", w); - this.bar.setAttribute("height", h); - - if (this.orientation === "vertical") { - this.knob.setAttribute("cx", x); - this.knob.setAttribute("cy", this.knobData.level); - } else { - this.knob.setAttribute("cx", this.knobData.level); - this.knob.setAttribute("cy", y); - } - this.knob.setAttribute("r", this.knobData.r); - } - }, - colorInterface: { - value: function colorInterface() { - - this.bar.setAttribute("fill", this.colors.fill); - this.knob.setAttribute("fill", this.colors.accent); - - if (!this.hasKnob) { - this.knob.setAttribute("fill", "transparent"); - } - } - }, - render: { - value: function render() { - if (!this.clicked) { - this.knobData.r = this.thickness * 0.75; - } - this.knob.setAttribute("r", this.knobData.r); - - if (this.orientation === "vertical") { - this.knobData.level = this.knobData.r + this._value.normalized * (this.height - this.knobData.r * 2); - this.knob.setAttribute("cy", this.height - this.knobData.level); - } else { - this.knobData.level = this._value.normalized * (this.width - this.knobData.r * 2) + this.knobData.r; - this.knob.setAttribute("cx", this.knobData.level); - } - } - }, - click: { - value: function click() { - this.knobData.r = this.thickness * 0.9; - this.position.anchor = this.mouse; - this.move(); - } - }, - move: { - value: function move() { - if (this.clicked) { - this.position.update(this.mouse); - - this.value = this._value.updateNormal(this.position.value); - - this.emit("change", { - value: this.value, - L: Math.pow(math.scale(this.value, -1, 1, 1, 0), 2), - R: Math.pow(math.scale(this.value, -1, 1, 0, 1), 2) - }); - } - } - }, - release: { - value: function release() { - this.render(); - } - }, - value: { - - /** - The position of crossfader, from -1 (left) to 1 (right). Setting this value updates the interface and triggers the output event. - @type {number} - */ - - get: function () { - return this._value.value; - }, - set: function (value) { - this._value.update(value); - this.position.value = this._value.normalized; - this.emit("change", { - value: this.value, - L: Math.pow(math.scale(this.value, -1, 1, 1, 0), 2), - R: Math.pow(math.scale(this.value, -1, 1, 0, 1), 2) - }); - this.render(); - } - }, - normalized: { - get: function () { - return this._value.normalized; - } - } - }); - - return Pan; - })(Interface); - - module.exports = Pan; - -/***/ }), -/* 34 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var math = __webpack_require__(5); - var svg = __webpack_require__(4); - var Interface = __webpack_require__(6); - - var Point = function Point(point, envelope) { - - this.x = point.x; - this.y = point.y; - this.envelope = envelope; - - this.element = svg.create("circle"); - this.element.setAttribute("fill", this.envelope.colors.accent); - - this.envelope.element.appendChild(this.element); - - this.resize = function () { - var r = ~ ~(Math.min(this.envelope.width, this.envelope.height) / 50) + 2; - this.element.setAttribute("r", r); - }; - - this.move = function (x, y) { - - this.x = x || x === 0 ? x : this.x; - this.y = y || y === 0 ? y : this.y; - - if (this.envelope.nodes.indexOf(this) >= 0) { - - var prevIndex = this.envelope.nodes.indexOf(this) - 1; - var nextIndex = this.envelope.nodes.indexOf(this) + 1; - - var prevNode = this.envelope.nodes[prevIndex]; - var nextNode = this.envelope.nodes[nextIndex]; - - var lowX = prevIndex >= 0 ? prevNode.x : 0; - var highX = nextIndex < this.envelope.nodes.length ? nextNode.x : 1; - - if (this.x < lowX) { - this.x = lowX; - } - if (this.x > highX) { - this.x = highX; - } - } - - this.location = this.getCoordinates(); - this.element.setAttribute("cx", this.location.x); - this.element.setAttribute("cy", this.location.y); - }; - - this.getCoordinates = function () { - return { - x: this.x * this.envelope.width, - y: (1 - this.y) * this.envelope.height - }; - }; - - this.move(this.x, this.y, true); - this.resize(); - - this.destroy = function () { - this.envelope.element.removeChild(this.element); - this.envelope.nodes.splice(this.envelope.nodes.indexOf(this), 1); - }; - }; - - /** - * Envelope - * - * @description Interactive linear ramp visualization. - * - * @demo <span nexus-ui="envelope"></span> - * - * @example - * var envelope = new Nexus.Envelope('#target') - * - * @example - * var envelope = new Nexus.Envelope('#target',{ - * 'size': [300,150], - * 'points': [ - * { - * x: 0.1, - * y: 0.4 - * }, - * { - * x: 0.35, - * y: 0.6 - * }, - * { - * x: 0.65, - * y: 0.2 - * }, - * { - * x: 0.9, - * y: 0.4 - * }, - * ] - * }) - * - * @output - * change - * Fires any time a node is moved. <br> - * The event data is an array of point locations. Each item in the array is an object containing <i>x</i> and <i>y</i> properties describing the location of a point on the envelope. - * - * @outputexample - * envelope.on('change',function(v) { - * console.log(v); - * }) - * - */ - - var Envelope = (function (_Interface) { - function Envelope() { - _classCallCheck(this, Envelope); - - var options = ["value"]; - - var defaults = { - size: [300, 150], - points: [{ - x: 0.1, - y: 0.4 - }, { - x: 0.35, - y: 0.6 - }, { - x: 0.65, - y: 0.2 - }, { - x: 0.9, - y: 0.4 - }] - }; - - _get(Object.getPrototypeOf(Envelope.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.points = this.settings.points; - - this.nodes = []; - - this.selected = false; - - this.init(); - } - - _inherits(Envelope, _Interface); - - _createClass(Envelope, { - buildInterface: { - value: function buildInterface() { - var _this = this; - - this.points.forEach(function (point) { - var node = new Point(point, _this); - _this.nodes.push(node); - }); - - this.sortPoints(); - - this.line = svg.create("polyline"); - this.line.setAttribute("stroke-width", 2); - this.line.setAttribute("fill", "none"); - - this.element.appendChild(this.line); - - this.fill = svg.create("polyline"); - this.fill.setAttribute("fill-opacity", "0.2"); - - this.element.appendChild(this.fill); - } - }, - sizeInterface: { - value: function sizeInterface() { - - for (var i = 0; i < this.nodes.length; i++) { - this.nodes[i].resize(); - this.nodes[i].move(); - } - - this.render(); - } - }, - colorInterface: { - value: function colorInterface() { - var _this = this; - - this.element.style.backgroundColor = this.colors.fill; - this.line.setAttribute("stroke", this.colors.accent); - this.fill.setAttribute("fill", this.colors.accent); - this.nodes.forEach(function (node) { - node.element.setAttribute("fill", _this.colors.accent); - }); - } - }, - render: { - value: function render() { - // this.nodes[this.selected].move( this.points ) - this.calculatePath(); - } - }, - calculatePoints: { - value: function calculatePoints() { - var _this = this; - - this.points = []; - this.nodes.forEach(function (node) { - _this.points.push({ x: node.x, y: node.y }); - }); - } - }, - calculatePath: { - value: function calculatePath() { - - //stroke data - var data = "0 " + this.nodes[0].location.y + ", "; - - // data should be re-ordered based on x location. - // whatever function adds a node should add it at the right index - - this.nodes.forEach(function (node) { - // let location = node.getCoordinates(); - data += node.location.x + " " + node.location.y + ", "; - }); - - // data += point.x*this.width+' '+ point.y*this.height+', '; - data += this.width + " " + this.nodes[this.nodes.length - 1].location.y; - - this.line.setAttribute("points", data); - - // fill data - // add bottom corners - - data += ", " + this.width + " " + this.height + ", "; - data += "0 " + this.height; - - this.fill.setAttribute("points", data); - } - }, - click: { - value: function click() { - // find nearest node and set this.selected (index) - this.hasMoved = false; - this.selected = this.findNearestNode(); - - this.nodes[this.selected].move(this.mouse.x / this.width, 1 - this.mouse.y / this.height); - this.scaleNode(this.selected); - - // must do this b/c new node may have been created - this.calculatePoints(); - this.emit("change", this.points); - this.render(); - } - }, - move: { - value: function move() { - if (this.clicked) { - this.mouse.x = math.clip(this.mouse.x, 0, this.width); - this.hasMoved = true; - - this.nodes[this.selected].move(this.mouse.x / this.width, 1 - this.mouse.y / this.height); - this.scaleNode(this.selected); - - this.calculatePoints(); - this.emit("change", this.points); - this.render(); - } - } - }, - release: { - value: function release() { - - if (!this.hasMoved) { - this.nodes[this.selected].destroy(); - } - - this.calculatePoints(); - this.emit("change", this.points); - this.render(); - - // reset this.selected - this.selected = null; - } - }, - findNearestNode: { - value: function findNearestNode() { - var nearestIndex = null; - // set this unreasonably high so that every distance will be lower than it. - var nearestDist = 10000; - var before = false; - var x = this.mouse.x / this.width; - var y = 1 - this.mouse.y / this.height; - var nodes = this.nodes; - for (var i = 0; i < nodes.length; i++) { - - // calculate the distance from mouse to this node using pythagorean theorem - var distance = Math.sqrt(Math.pow(nodes[i].x - x, 2) + Math.pow(nodes[i].y - y, 2)); - - // if this distance is less than the previous shortest distance, use this index - if (distance < nearestDist) { - nearestDist = distance; - nearestIndex = i; - before = x > nodes[i].x; - } - } - - // if not very close to any node, create a node - if (nearestDist > 0.07) { - - nearestIndex = this.getIndexFromX(this.mouse.x / this.width); - - this.nodes.splice(nearestIndex, 0, new Point({ - x: this.mouse.x / this.width, - y: 1 - this.mouse.y / this.height - }, this)); - this.hasMoved = true; - } - - return nearestIndex; - } - }, - getIndexFromX: { - value: function getIndexFromX(x) { - var _this = this; - - var index = 0; - this.nodes.forEach(function (node, i) { - if (_this.nodes[i].x <= x) { - index = i + 1; - } - }); - return index; - } - }, - scaleNode: { - value: function scaleNode(i) { - - var clippedX = math.clip(this.nodes[i].x, 0, 1); - var clippedY = math.clip(this.nodes[i].y, 0, 1); - - this.nodes[i].move(clippedX, clippedY); - } - }, - sortPoints: { - - /** - Sort the this.points array from left-most point to right-most point. You should not regularly need to use this, however it may be useful if the points get unordered. - */ - - value: function sortPoints() { - this.nodes.sort(function (a, b) { - return a.x > b.x; - }); - } - }, - addPoint: { - - /** - Add a breakpoint on the envelope. - @param x {number} x location of the point, normalized (0-1) - @param y {number} y location of the point, normalized (0-1) - */ - - value: function addPoint(x, y) { - var index = this.nodes.length; - - this.sortPoints(); - - for (var i = 0; i < this.nodes.length; i++) { - if (x < this.nodes[i].x) { - index = i; - break; - } - } - - this.nodes.splice(index, 0, new Point({ - x: x, - y: y - }, this)); - - this.scaleNode(index); - - this.calculatePoints(); - this.emit("change", this.points); - - this.render(); - } - }, - scan: { - - /** - Find the level at a certain x location on the envelope. - @param x {number} The x location to find the level of, normalized 0-1 - */ - - value: function scan(x) { - // find surrounding points - var nextIndex = this.getIndexFromX(x); - var priorIndex = nextIndex - 1; - if (priorIndex < 0) { - priorIndex = 0; - } - if (nextIndex >= this.nodes.length) { - nextIndex = this.nodes.length - 1; - } - var priorPoint = this.nodes[priorIndex]; - var nextPoint = this.nodes[nextIndex]; - var loc = math.scale(x, priorPoint.x, nextPoint.x, 0, 1); - var value = math.interp(loc, priorPoint.y, nextPoint.y); - this.emit("scan", value); - return value; - } - }, - movePoint: { - - /** - Move a breakpoint on the envelope. - @param index {number} The index of the breakpoint to move - @param x {number} New x location, normalized 0-1 - @param y {number} New y location, normalized 0-1 - */ - - value: function movePoint(index, x, y) { - this.nodes[index].move(x, y); - this.scaleNode(index); - this.calculatePoints(); - this.emit("change", this.points); - this.render(); - } - }, - adjustPoint: { - - /** - Move a breakpoint on the envelope by a certain amount. - @param index {number} The index of the breakpoint to move - @param xOffset {number} X displacement, normalized 0-1 - @param yOffset {number} Y displacement, normalized 0-1 - */ - - value: function adjustPoint(index, xOffset, yOffset) { - this.nodes[index].move(this.nodes[index].x + xOffset, this.nodes[index].y + yOffset); - this.scaleNode(index); - this.calculatePoints(); - this.emit("change", this.points); - this.render(); - } - }, - destroyPoint: { - - /** - Remove a breakpoint from the envelope. - @param index {number} Index of the breakpoint to remove - */ - - value: function destroyPoint(index) { - this.nodes[index].destroy(); - this.calculatePoints(); - this.emit("change", this.points); - this.render(); - } - }, - setPoints: { - - /** - Remove all existing breakpoints and add an entirely new set of breakpoints. - @param allPoints {array} An array of objects with x/y properties (normalized 0-1). Each object in the array specifices the x/y location of a new breakpoint to be added. - */ - - value: function setPoints(allPoints) { - var _this = this; - - while (this.nodes.length) { - this.nodes[0].destroy(); - } - allPoints.forEach(function (point) { - _this.addPoint(point.x, point.y); - }); - this.calculatePoints(); - this.emit("change", this.points); - this.render(); - } - } - }); - - return Envelope; - })(Interface); - - module.exports = Envelope; - -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var dom = __webpack_require__(7); - //let math = require('../util/math'); - var Interface = __webpack_require__(6); - - /** - * Spectrogram - * - * @description Audio spectrum visualization - * - * @demo <span nexus-ui="spectrogram"></span> - * - * @example - * var spectrogram = new Nexus.Spectrogram('#target') - * - * @example - * var spectrogram = new Nexus.Spectrogram('#target',{ - * 'size': [300,150] - * }) - * - * @output - * - * No events - * - */ - - var context = __webpack_require__(1).context; - - var Spectrogram = (function (_Interface) { - function Spectrogram() { - _classCallCheck(this, Spectrogram); - - var options = ["scale", "value"]; - - var defaults = { - size: [300, 150] - }; - - _get(Object.getPrototypeOf(Spectrogram.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.context = context(); // jshint ignore:line - - this.analyser = this.context.createAnalyser(); - this.analyser.fftSize = 2048; - this.bufferLength = this.analyser.frequencyBinCount; - this.dataArray = new Uint8Array(this.bufferLength); - - this.active = true; - - this.source = false; - - this.init(); - } - - _inherits(Spectrogram, _Interface); - - _createClass(Spectrogram, { - buildFrame: { - value: function buildFrame() { - this.canvas = new dom.SmartCanvas(this.parent); - this.element = this.canvas.element; - } - }, - sizeInterface: { - value: function sizeInterface() { - this.canvas.resize(this.width, this.height); - } - }, - colorInterface: { - value: function colorInterface() { - this.canvas.element.style.backgroundColor = this.colors.fill; - } - }, - render: { - value: function render() { - - if (this.active) { - requestAnimationFrame(this.render.bind(this)); - } - - this.analyser.getByteFrequencyData(this.dataArray); - - this.canvas.context.fillStyle = this.colors.fill; - this.canvas.context.fillRect(0, 0, this.canvas.element.width, this.canvas.element.height); - - if (this.source && this.dataArray) { - - //console.log(this.dataArray); - - var barWidth = this.canvas.element.width / this.bufferLength; - var barHeight = undefined; - var x = 0; - - var definition = this.canvas.element.width / 50; - - for (var i = 0; i < this.bufferLength; i = i + definition) { - barHeight = Math.max.apply(null, this.dataArray.subarray(i, i + definition)); - barHeight /= 255; - barHeight *= this.canvas.element.height; - - this.canvas.context.fillStyle = this.colors.accent; - this.canvas.context.fillRect(x, this.canvas.element.height - barHeight, barWidth * definition, barHeight); - - x += barWidth * definition; - } - } - } - }, - connect: { - - /** - Equivalent to "patching in" an audio node to visualize. NOTE: You cannot connect audio nodes across two different audio contexts. NexusUI runs its audio analysis on its own audio context, Nexus.context. If the audio node you are visualizing is created on a different audio context, you will need to tell NexusUI to use that context instead: i.e. Nexus.context = YourAudioContextName. For example, in ToneJS projects, the line would be: Nexus.context = Tone.context . We recommend that you write that line of code only once at the beginning of your project. - @param node {AudioNode} The audio node to visualize - @example Nexus.context = Tone.context // or another audio context you have created - spectrogram.connect( Tone.Master ); - */ - - value: function connect(node) { - if (this.source) { - this.disconnect(); - } - this.source = node; - this.source.connect(this.analyser); - this.render(); - } - }, - disconnect: { - - /** - Stop visualizing the source node and disconnect it. - */ - - value: function disconnect() { - this.source.disconnect(this.analyser); - this.source = null; - } - }, - click: { - value: function click() { - this.active = !this.active; - this.render(); - } - }, - customDestroy: { - value: function customDestroy() { - this.active = false; - } - } - }); - - return Spectrogram; - })(Interface); - - module.exports = Spectrogram; - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var dom = __webpack_require__(7); - var math = __webpack_require__(5); - var Interface = __webpack_require__(6); - - /** - * Meter - * - * @description Stereo decibel meter - * - * @demo <span nexus-ui="meter"></span> - * - * @example - * var meter = new Nexus.Meter('#target') - * - * @example - * var meter = new Nexus.Meter('#target',{ - * size: [75,75] - * }) - * - * @output - * - * No events - * - */ - - var context = __webpack_require__(1).context; - - var Meter = (function (_Interface) { - function Meter() { - _classCallCheck(this, Meter); - - var options = ["scale", "value"]; - - var defaults = { - size: [30, 100] - }; - - _get(Object.getPrototypeOf(Meter.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.context = context(); // jshint ignore:line - - this.channels = 2; - - this.splitter = this.context.createChannelSplitter(this.channels); - - this.analysers = []; - - for (var i = 0; i < this.channels; i++) { - var analyser = this.context.createAnalyser(); - this.splitter.connect(analyser, i); - analyser.fftSize = 1024; - analyser.smoothingTimeConstant = 1; - this.analysers.push(analyser); - } - this.bufferLength = this.analysers[0].frequencyBinCount; - this.dataArray = new Float32Array(this.bufferLength); - - /* - // add linear gradient - var grd = canvasCtx.createLinearGradient(0, 0, 0, canvas.height); - // light blue - grd.addColorStop(0, '#000'); - grd.addColorStop(0.2, '#bbb'); - grd.addColorStop(0.4, '#d18'); - // dark blue - grd.addColorStop(1, '#d18'); - canvasCtx.fillStyle = grd; */ - - this.active = true; - - this.db = -Infinity; - - this.init(); - - this.meterWidth = this.canvas.element.width / this.channels; - - this.render(); - } - - _inherits(Meter, _Interface); - - _createClass(Meter, { - buildFrame: { - value: function buildFrame() { - this.canvas = new dom.SmartCanvas(this.parent); - this.element = this.canvas.element; - } - }, - sizeInterface: { - value: function sizeInterface() { - this.canvas.resize(this.width, this.height); - } - }, - colorInterface: { - value: function colorInterface() { - this.canvas.element.style.backgroundColor = this.colors.fill; - } - }, - render: { - value: function render() { - - if (this.active) { - requestAnimationFrame(this.render.bind(this)); - } - - this.canvas.context.fillStyle = this.colors.fill; - this.canvas.context.fillRect(0, 0, this.canvas.element.width, this.canvas.element.height); - - for (var i = 0; i < this.analysers.length; i++) { - - if (this.source) { - - this.analysers[i].getFloatTimeDomainData(this.dataArray); - - var rms = 0; - - for (var _i = 0; _i < this.dataArray.length; _i++) { - rms += this.dataArray[_i] * this.dataArray[_i]; - } - - rms = Math.sqrt(rms / this.dataArray.length); - - this.db = 20 * Math.log10(rms); - } else if (this.db > -200 && this.db !== -Infinity) { - this.db -= 1; - } else { - this.db = -Infinity; - } - - //console.log(db) - - if (this.db > -70) { - - var linear = math.normalize(this.db, -70, 5); - var exp = linear * linear; - var y = math.scale(exp, 0, 1, this.element.height, 0); - - this.canvas.context.fillStyle = this.colors.accent; - this.canvas.context.fillRect(this.meterWidth * i, y, this.meterWidth, this.canvas.element.height - y); - - //console.log("rendering...") - } - } - } - }, - connect: { - - /** - Equivalent to "patching in" an audio node to visualize. NOTE: You cannot connect audio nodes across two different audio contexts. NexusUI runs its audio analysis on its own audio context, Nexus.context. If the audio node you are visualizing is created on a different audio context, you will need to tell NexusUI to use that context instead: i.e. Nexus.context = YourAudioContextName. For example, in ToneJS projects, the line would be: Nexus.context = Tone.context . We recommend that you write that line of code only once at the beginning of your project. - @param node {AudioNode} The audio node to visualize - @param channels {number} (optional) The number of channels in the source node to watch. If not specified, the interface will look for a .channelCount property on the input node. If it does not exist, the interface will default to 1 channel. - @example Nexus.context = Tone.context // or another audio context you have created - meter.connect( Tone.Master, 2 ); - */ - - value: function connect(node, channels) { - if (this.source) { - this.disconnect(); - } - //this.dummy.disconnect(this.splitter); - - if (channels) { - this.channels = channels; - } else if (node.channelCount) { - this.channels = node.channelCount; - } else { - this.channels = 2; - } - this.meterWidth = this.canvas.element.width / this.channels; - - this.source = node; - this.source.connect(this.splitter); - - // this.render(); - } - }, - disconnect: { - - /** - Stop visualizing the source node and disconnect it. - */ - - value: function disconnect() { - - this.source.disconnect(this.splitter); - this.source = false; - // this.dummy.connect(this.splitter); - this.meterWidth = this.canvas.element.width / this.channels; - } - }, - click: { - value: function click() { - this.active = !this.active; - this.render(); - } - }, - customDestroy: { - value: function customDestroy() { - this.active = false; - } - } - }); - - return Meter; - })(Interface); - - module.exports = Meter; - -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - - var _inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; }; - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var dom = __webpack_require__(7); - var Interface = __webpack_require__(6); - - /** - * Oscilloscope - * - * @description Visualizes a waveform's stream of values. - * - * @demo <span nexus-ui="oscilloscope"></span> - * - * @example - * var oscilloscope = new Nexus.Oscilloscope('#target') - * - * @example - * var oscilloscope = new Nexus.Oscilloscope('#target',{ - * 'size': [300,150] - * }) - * - * @output - * - * No events - * - */ - - var context = __webpack_require__(1).context; - - var Oscilloscope = (function (_Interface) { - function Oscilloscope() { - _classCallCheck(this, Oscilloscope); - - var options = ["scale", "value"]; - - var defaults = { - size: [300, 150] - }; - - _get(Object.getPrototypeOf(Oscilloscope.prototype), "constructor", this).call(this, arguments, options, defaults); - - this.context = context(); // jshint ignore:line - - this.analyser = this.context.createAnalyser(); - this.analyser.fftSize = 2048; - this.bufferLength = this.analyser.frequencyBinCount; - this.dataArray = new Uint8Array(this.bufferLength); - this.analyser.getByteTimeDomainData(this.dataArray); - - this.active = true; - - this.source = false; - - this.init(); - - this.render(); - } - - _inherits(Oscilloscope, _Interface); - - _createClass(Oscilloscope, { - buildFrame: { - value: function buildFrame() { - this.canvas = new dom.SmartCanvas(this.parent); - this.element = this.canvas.element; - } - }, - sizeInterface: { - value: function sizeInterface() { - this.canvas.resize(this.width, this.height); - } - }, - colorInterface: { - value: function colorInterface() { - this.canvas.element.style.backgroundColor = this.colors.fill; - } - }, - render: { - value: function render() { - - if (this.active) { - requestAnimationFrame(this.render.bind(this)); - } - - this.analyser.getByteTimeDomainData(this.dataArray); - - this.canvas.context.fillStyle = this.colors.fill; - this.canvas.context.fillRect(0, 0, this.canvas.element.width, this.canvas.element.height); - - this.canvas.context.lineWidth = ~ ~(this.height / 100 + 2); - this.canvas.context.strokeStyle = this.colors.accent; - - this.canvas.context.beginPath(); - - if (this.source) { - - var sliceWidth = this.canvas.element.width * 1 / this.bufferLength; - var x = 0; - - for (var i = 0; i < this.bufferLength; i++) { - - var v = this.dataArray[i] / 128; - var y = v * this.canvas.element.height / 2; - - if (i === 0) { - this.canvas.context.moveTo(x, y); - } else { - this.canvas.context.lineTo(x, y); - } - - x += sliceWidth; - } - } else { - this.canvas.context.moveTo(0, this.canvas.element.height / 2); - this.canvas.context.lineTo(this.canvas.element.width, this.canvas.element.height / 2); - } - - this.canvas.context.stroke(); - } - }, - connect: { - - /** - Equivalent to "patching in" an audio node to visualize. NOTE: You cannot connect audio nodes across two different audio contexts. NexusUI runs its audio analysis on its own audio context, Nexus.context. If the audio node you are visualizing is created on a different audio context, you will need to tell NexusUI to use that context instead: i.e. Nexus.context = YourAudioContextName. For example, in ToneJS projects, the line would be: Nexus.context = Tone.context . We recommend that you write that line of code only once at the beginning of your project. - @param node {AudioNode} The audio node to visualize - @example Nexus.context = Tone.context // or another audio context you have created - oscilloscope.connect( Tone.Master ); - */ - - value: function connect(node) { - - if (this.source) { - this.disconnect(); - } - - this.source = node; - this.source.connect(this.analyser); - - this.render(); - } - }, - disconnect: { - - /** - Stop visualizing the source node and disconnect it. - */ - - value: function disconnect() { - if (this.source) { - this.source.disconnect(this.analyser); - this.source = null; - } - } - }, - click: { - value: function click() { - this.active = !this.active; - this.render(); - } - }, - customDestroy: { - value: function customDestroy() { - this.active = false; - } - } - }); - - return Oscilloscope; - })(Interface); - - module.exports = Oscilloscope; - -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - /* - Main concept: - synth = new Nexus.Rack('elementID'); - - Transform all elements inside the div - synth.elementID will hold the first slider interface - - 2) In future, potentially writing a rack that is re-usable? - Could also take JSON - - new Nexus.Rack('#target',{ - pre: () => { - create some divs here, or some audio code - }, - interface: { - slider1: Nexus.add.slider({ - top:10, - left:10, - width:50, - height:100, - min: 0, - max: 100, - step: 1 - }), - wave1: Nexus.add.waveform({ - file: './path/to/file.mp3', - width:500, - height:100, - mode: 'range' - }) - }, - init: () => { - // some audio init code goes here... - } - }); - - */ - - var transform = _interopRequireWildcard(__webpack_require__(39)); - - var dom = _interopRequire(__webpack_require__(7)); - - var colors = __webpack_require__(1).colors; - - var Rack = (function () { - function Rack(target, settings) { - _classCallCheck(this, Rack); - - this.meta = {}; - this.meta.target = target; - this.meta.parent = dom.parseElement(target); // should be a generic function for parsing a 'target' argument that checks for string/DOM/jQUERY - this.meta.colors = {}; - - if (settings) { - this.meta.attribute = settings.attribute || "nexus-ui"; - this.meta.title = settings.name || false; - this.meta.open = settings.open || false; - } else { - this.meta.attribute = "nexus-ui"; - this.meta.title = false; - this.meta.open = false; - } - - var defaultColors = colors(); // jshint ignore:line - this.meta.colors.accent = defaultColors.accent; - this.meta.colors.fill = defaultColors.fill; - this.meta.colors.light = defaultColors.light; - this.meta.colors.dark = defaultColors.dark; - this.meta.colors.mediumLight = defaultColors.mediumLight; - this.meta.colors.mediumDark = defaultColors.mediumDark; - this.buildInterface(); - this.colorInterface(); - } - - _createClass(Rack, { - buildInterface: { - value: function buildInterface() { - var _this = this; - - this.meta.parent.style.boxSizing = "border-box"; - this.meta.parent.style.userSelect = "none"; - this.meta.parent.style.mozUserSelect = "none"; - this.meta.parent.style.webkitUserSelect = "none"; - - this.meta.contents = document.createElement("div"); - - while (this.meta.parent.childNodes.length > 0) { - this.meta.contents.appendChild(this.meta.parent.childNodes[0]); - } - - this.meta.contents.style.padding = "0px"; - this.meta.contents.style.boxSizing = "border-box"; - - if (this.meta.title) { - this.meta.titleBar = document.createElement("div"); - this.meta.titleBar.innerHTML = this.meta.title; - this.meta.titleBar.style.fontFamily = "arial"; - this.meta.titleBar.style.position = "relative"; - this.meta.titleBar.style.color = "#888"; - this.meta.titleBar.style.padding = "7px"; - this.meta.titleBar.style.fontSize = "12px"; - - this.meta.button = document.createElement("div"); - this.meta.button.style.position = "absolute"; - this.meta.button.style.top = "5px"; - this.meta.button.style.right = "5px"; - this.meta.button.innerHTML = "-"; - this.meta.button.style.padding = "0px 5px 2px"; - this.meta.button.style.lineHeight = "12px"; - this.meta.button.style.fontSize = "15px"; - - this.meta.button.style.cursor = "pointer"; - - this.meta.button.addEventListener("mouseover", function () { - _this.meta.button.style.backgroundColor = _this.meta.colors.mediumDark; - }); - this.meta.button.addEventListener("mouseleave", function () { - _this.meta.button.style.backgroundColor = _this.meta.colors.mediumLight; - }); - this.meta.button.addEventListener("click", function () { - if (_this.meta.open) { - _this.hide(); - } else { - _this.show(); - } - }); - - this.meta.titleBar.appendChild(this.meta.button); - - this.meta.parent.appendChild(this.meta.titleBar); - } - this.meta.parent.appendChild(this.meta.contents); - - // var width = this.meta.parent.style.width = getComputedStyle(this.meta.parent).getPropertyValue('width'); - // this.meta.parent.style.width = width; - - var ui = transform.section(this.meta.target, this.meta.attribute); - for (var key in ui) { - this[key] = ui[key]; - } - } - }, - colorInterface: { - value: function colorInterface() { - if (this.meta.title) { - this.meta.button.style.backgroundColor = this.meta.colors.mediumLight; - this.meta.button.style.border = "solid 0px " + this.meta.colors.fill; - this.meta.parent.style.border = "solid 1px " + this.meta.colors.mediumLight; - this.meta.parent.style.backgroundColor = this.meta.colors.light; - this.meta.titleBar.style.backgroundColor = this.meta.colors.fill; - } - } - }, - show: { - value: function show() { - this.meta.contents.style.display = "block"; - this.meta.open = true; - } - }, - hide: { - value: function hide() { - this.meta.contents.style.display = "none"; - this.meta.open = false; - } - }, - colorize: { - value: function colorize(type, color) { - for (var key in this) { - if (this[key].colorize) { - this[key].colorize(type, color); - } - } - this.meta.colors[type] = color; - this.colorInterface(); - } - }, - empty: { - value: function empty() { - for (var key in this) { - if (this[key].destroy) { - this[key].destroy(); - } - } - } - } - }); - - return Rack; - })(); - - module.exports = Rack; - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - "use strict"; - - var dom = _interopRequire(__webpack_require__(7)); - - var Interfaces = _interopRequire(__webpack_require__(2)); - - var createInterfaceID = function (widget, interfaceIDs) { - var type = widget.type; - if (interfaceIDs[type]) { - interfaceIDs[type]++; - } else { - interfaceIDs[type] = 1; - } - return type + interfaceIDs[type]; - }; - - var element = function (element, type, options) { - options = options || {}; - for (var i = 0; i < element.attributes.length; i++) { - var att = element.attributes[i]; - // try { - // options[att.nodeName] = eval(att.nodeValue); - // } catch(e) { - options[att.nodeName] = att.nodeValue; - // } - } - type = type[0].toUpperCase() + type.slice(1); - var widget = new Interfaces[type](element, options); - widget.id = element.id; - return widget; - }; - - var section = function (parent, keyword) { - - keyword = keyword || "nexus-ui"; - - var interfaceIDs = {}; - - var container = dom.parseElement(parent); - - var ui = {}; - - var htmlElements = container.getElementsByTagName("*"); - var elements = []; - for (var i = 0; i < htmlElements.length; i++) { - elements.push(htmlElements[i]); - } - for (var i = 0; i < elements.length; i++) { - var type = elements[i].getAttribute(keyword); - if (type) { - var formattedType = false; - for (var key in Interfaces) { - if (type.toLowerCase() === key.toLowerCase()) { - formattedType = key; - } - } - console.log(formattedType); - var widget = element(elements[i], formattedType); - if (widget.id) { - ui[widget.id] = widget; - } else { - var id = createInterfaceID(widget, interfaceIDs); - ui[id] = widget; - } - } - } - - return ui; - }; - - var add = function (type, parent, options) { - var target = document.createElement("div"); - options = options || {}; - if (parent) { - parent = dom.parseElement(parent); - } else { - parent = document.body; - } - parent.appendChild(target); - options.target = target; - if (options.size) { - target.style.width = options.size[0] + "px"; - target.style.height = options.size[1] + "px"; - } - return element(target, type, options); - }; - - exports.element = element; - exports.section = section; - exports.add = add; - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var math = _interopRequire(__webpack_require__(5)); - - var Tune = (function () { - function Tune() { - _classCallCheck(this, Tune); - - // the scale as ratios - this.scale = []; - - // i/o modes - this.mode = { - output: "frequency", - input: "step" - }; - - // ET major - this.etmajor = [261.62558, 293.664764, 329.627563, 349.228241, 391.995422, 440, 493.883301, 523.25116]; - - // Root frequency. - this.root = math.mtof(60); // * Math.pow(2,(60-69)/12); - - // default is a major scale - this.createScale(0, 2, 4, 5, 7, 9, 11); - } - - _createClass(Tune, { - note: { - - /* Return data in the mode you are in (freq, ratio, or midi) */ - - value: function note(input, octave) { - - var newvalue = undefined; - - if (this.mode.output === "frequency") { - newvalue = this.frequency(input, octave); - } else if (this.mode.output === "ratio") { - newvalue = this.ratio(input, octave); - } else if (this.mode.output === "MIDI") { - newvalue = this.MIDI(input, octave); - } else { - newvalue = this.frequency(input, octave); - } - - return newvalue; - } - }, - frequency: { - - /* Return freq data */ - - value: function frequency(stepIn, octaveIn) { - - if (this.mode.input === "midi" || this.mode.input === "MIDI") { - this.stepIn += 60; - } - - // what octave is our input - var octave = Math.floor(stepIn / this.scale.length); - - if (octaveIn) { - octave += octaveIn; - } - - // which scale degree (0 - scale length) is our input - var scaleDegree = stepIn % this.scale.length; - - while (scaleDegree < 0) { - scaleDegree += this.scale.length; - } - - var ratio = this.scale[scaleDegree]; - - var freq = this.root * ratio; - - freq = freq * Math.pow(2, octave); - - // truncate irrational numbers - freq = Math.floor(freq * 100000000000) / 100000000000; - - return freq; - } - }, - ratio: { - - /* Force return ratio data */ - - value: function ratio(stepIn, octaveIn) { - - if (this.mode.input === "midi" || this.mode.input === "MIDI") { - this.stepIn += 60; - } - - // what octave is our input - var octave = Math.floor(stepIn / this.scale.length); - - if (octaveIn) { - octave += octaveIn; - } - - // which scale degree (0 - scale length) is our input - var scaleDegree = stepIn % this.scale.length; - - // what ratio is our input to our key - var ratio = Math.pow(2, octave) * this.scale[scaleDegree]; - - ratio = Math.floor(ratio * 100000000000) / 100000000000; - - return ratio; - } - }, - MIDI: { - - /* Force return adjusted MIDI data */ - - value: function MIDI(stepIn, octaveIn) { - - var newvalue = this.frequency(stepIn, octaveIn); - - var n = 69 + 12 * Math.log(newvalue / 440) / Math.log(2); - - n = Math.floor(n * 1000000000) / 1000000000; - - return n; - } - }, - createScale: { - value: function createScale() { - var newScale = []; - for (var i = 0; i < arguments.length; i++) { - newScale.push(math.mtof(60 + arguments[i])); - } - this.loadScaleFromFrequencies(newScale); - } - }, - createJIScale: { - value: function createJIScale() { - this.scale = []; - for (var i = 0; i < arguments.length; i++) { - this.scale.push(arguments[i]); - } - } - }, - loadScaleFromFrequencies: { - value: function loadScaleFromFrequencies(freqs) { - this.scale = []; - for (var i = 0; i < freqs.length - 1; i++) { - this.scale.push(freqs[i] / freqs[0]); - } - } - }, - loadScale: { - - /* Load a new scale */ - - value: function loadScale(name) { - - /* load the scale */ - var freqs = this.scales[name].frequencies; - this.loadScaleFromFrequencies(freqs); - } - }, - search: { - - /* Search the names of tunings - Returns an array of names of tunings */ - - value: function search(letters) { - var possible = []; - for (var key in this.scales) { - if (key.toLowerCase().indexOf(letters.toLowerCase()) !== -1) { - possible.push(key); - } - } - return possible; - } - }, - chord: { - - /* Return a collection of notes as an array */ - - value: function chord(midis) { - var output = []; - for (var i = 0; i < midis.length; i++) { - output.push(this.note(midis[i])); - } - return output; - } - } - }); - - return Tune; - })(); - - module.exports = Tune; - -/***/ }), -/* 41 */ -/***/ (function(module, exports) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - //Disable jshint warning concerning trailing regular params - /*jshint -W138 */ - - var Radio = (function () { - //if non-existent buttons are switched, they are ignored - - function Radio() { - for (var _len = arguments.length, onVals = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - onVals[_key - 1] = arguments[_key]; - } - - var length = arguments[0] === undefined ? 3 : arguments[0]; - - _classCallCheck(this, Radio); - - //each optional 'onVals' argument switches on that value in the Radio if it exists - //In the example below, a 3-button radio is created, index 0 is switched on, index 1 is switched on then then attempted again producing an warning, and the final argument produces a warning because the index value does not exist. - //Example: - //` radio = new Radio(3, 0, 1, 1, 3); - //… [1,1,0] - - if (length < 0) { - length = 1; - } - - this.length = length; - this.onVals = onVals; - this.array = new Array(length).fill(0); - - if (onVals.length > 0) { - this.on.apply(this, onVals); - } - } - - _createClass(Radio, { - select: { - value: function select(value) { - this.array.fill(0); - this.array[value] = 1; - return this.array; - } - }, - flip: { - value: function flip() { - for (var _len = arguments.length, values = Array(_len), _key = 0; _key < _len; _key++) { - values[_key] = arguments[_key]; - } - - //flips the specified values. if no value is specified, flips all buttons - var a = this.array; - if (values.length > 0) { - values.forEach(function (v) { - if (v > a.length - 1) { - console.warn("Warning: AnonRadio[" + v + "] does not exist"); - } else { - a[v] = a[v] ? 0 : 1; - } - }); - } else { - a.forEach(function (v, i, arr) { - arr[i] = v ? 0 : 1; - }); - } - return a; - } - }, - on: { - value: function on() { - for (var _len = arguments.length, values = Array(_len), _key = 0; _key < _len; _key++) { - values[_key] = arguments[_key]; - } - - //switch on the specified values. if no value specified, flips on all buttons - var a = this.array; - if (values.length > 0) { - values.forEach(function (v) { - if (v > a.length - 1) { - console.warn("Warning: AnonRadio[" + v + "] exceeds size of object"); - } else { - if (a[v] === 1) { - console.warn("Warning: AnonRadio[" + v + "] was already on."); - } - a[v] = 1; - } - }); - } else { - a.fill(1); - } - return a; - } - }, - off: { - value: function off() { - for (var _len = arguments.length, values = Array(_len), _key = 0; _key < _len; _key++) { - values[_key] = arguments[_key]; - } - - //switch off the specified values. if no value specified, flips off all buttons - var a = this.array; - if (values.length > 0) { - values.forEach(function (v) { - a[v] = 0; - }); - } else { - a.fill(0); - } - return a; - } - } - }); - - return Radio; - })(); - - module.exports = Radio; - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - - var WAAClock = __webpack_require__(43) - - module.exports = WAAClock - if (typeof window !== 'undefined') window.WAAClock = WAAClock - - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - - /* WEBPACK VAR INJECTION */(function(process) {var isBrowser = (typeof window !== 'undefined') - - var CLOCK_DEFAULTS = { - toleranceLate: 0.10, - toleranceEarly: 0.001 - } - - // ==================== Event ==================== // - var Event = function(clock, deadline, func) { - this.clock = clock - this.func = func - this._cleared = false // Flag used to clear an event inside callback - - this.toleranceLate = clock.toleranceLate - this.toleranceEarly = clock.toleranceEarly - this._latestTime = null - this._earliestTime = null - this.deadline = null - this.repeatTime = null - - this.schedule(deadline) - } - - // Unschedules the event - Event.prototype.clear = function() { - this.clock._removeEvent(this) - this._cleared = true - return this - } - - // Sets the event to repeat every `time` seconds. - Event.prototype.repeat = function(time) { - if (time === 0) - throw new Error('delay cannot be 0') - this.repeatTime = time - if (!this.clock._hasEvent(this)) - this.schedule(this.deadline + this.repeatTime) - return this - } - - // Sets the time tolerance of the event. - // The event will be executed in the interval `[deadline - early, deadline + late]` - // If the clock fails to execute the event in time, the event will be dropped. - Event.prototype.tolerance = function(values) { - if (typeof values.late === 'number') - this.toleranceLate = values.late - if (typeof values.early === 'number') - this.toleranceEarly = values.early - this._refreshEarlyLateDates() - if (this.clock._hasEvent(this)) { - this.clock._removeEvent(this) - this.clock._insertEvent(this) - } - return this - } - - // Returns true if the event is repeated, false otherwise - Event.prototype.isRepeated = function() { return this.repeatTime !== null } - - // Schedules the event to be ran before `deadline`. - // If the time is within the event tolerance, we handle the event immediately. - // If the event was already scheduled at a different time, it is rescheduled. - Event.prototype.schedule = function(deadline) { - this._cleared = false - this.deadline = deadline - this._refreshEarlyLateDates() - - if (this.clock.context.currentTime >= this._earliestTime) { - this._execute() - - } else if (this.clock._hasEvent(this)) { - this.clock._removeEvent(this) - this.clock._insertEvent(this) - - } else this.clock._insertEvent(this) - } - - Event.prototype.timeStretch = function(tRef, ratio) { - if (this.isRepeated()) - this.repeatTime = this.repeatTime * ratio - - var deadline = tRef + ratio * (this.deadline - tRef) - // If the deadline is too close or past, and the event has a repeat, - // we calculate the next repeat possible in the stretched space. - if (this.isRepeated()) { - while (this.clock.context.currentTime >= deadline - this.toleranceEarly) - deadline += this.repeatTime - } - this.schedule(deadline) - } - - // Executes the event - Event.prototype._execute = function() { - if (this.clock._started === false) return - this.clock._removeEvent(this) - - if (this.clock.context.currentTime < this._latestTime) - this.func(this) - else { - if (this.onexpired) this.onexpired(this) - console.warn('event expired') - } - // In the case `schedule` is called inside `func`, we need to avoid - // overrwriting with yet another `schedule`. - if (!this.clock._hasEvent(this) && this.isRepeated() && !this._cleared) - this.schedule(this.deadline + this.repeatTime) - } - - // Updates cached times - Event.prototype._refreshEarlyLateDates = function() { - this._latestTime = this.deadline + this.toleranceLate - this._earliestTime = this.deadline - this.toleranceEarly - } - - // ==================== WAAClock ==================== // - var WAAClock = module.exports = function(context, opts) { - var self = this - opts = opts || {} - this.tickMethod = opts.tickMethod || 'ScriptProcessorNode' - this.toleranceEarly = opts.toleranceEarly || CLOCK_DEFAULTS.toleranceEarly - this.toleranceLate = opts.toleranceLate || CLOCK_DEFAULTS.toleranceLate - this.context = context - this._events = [] - this._started = false - } - - // ---------- Public API ---------- // - // Schedules `func` to run after `delay` seconds. - WAAClock.prototype.setTimeout = function(func, delay) { - return this._createEvent(func, this._absTime(delay)) - } - - // Schedules `func` to run before `deadline`. - WAAClock.prototype.callbackAtTime = function(func, deadline) { - return this._createEvent(func, deadline) - } - - // Stretches `deadline` and `repeat` of all scheduled `events` by `ratio`, keeping - // their relative distance to `tRef`. In fact this is equivalent to changing the tempo. - WAAClock.prototype.timeStretch = function(tRef, events, ratio) { - events.forEach(function(event) { event.timeStretch(tRef, ratio) }) - return events - } - - // Removes all scheduled events and starts the clock - WAAClock.prototype.start = function() { - if (this._started === false) { - var self = this - this._started = true - this._events = [] - - if (this.tickMethod === 'ScriptProcessorNode') { - var bufferSize = 256 - // We have to keep a reference to the node to avoid garbage collection - this._clockNode = this.context.createScriptProcessor(bufferSize, 1, 1) - this._clockNode.connect(this.context.destination) - this._clockNode.onaudioprocess = function () { - process.nextTick(function() { self._tick() }) - } - } else if (this.tickMethod === 'manual') null // _tick is called manually - - else throw new Error('invalid tickMethod ' + this.tickMethod) - } - } - - // Stops the clock - WAAClock.prototype.stop = function() { - if (this._started === true) { - this._started = false - this._clockNode.disconnect() - } - } - - // ---------- Private ---------- // - - // This function is ran periodically, and at each tick it executes - // events for which `currentTime` is included in their tolerance interval. - WAAClock.prototype._tick = function() { - var event = this._events.shift() - - while(event && event._earliestTime <= this.context.currentTime) { - event._execute() - event = this._events.shift() - } - - // Put back the last event - if(event) this._events.unshift(event) - } - - // Creates an event and insert it to the list - WAAClock.prototype._createEvent = function(func, deadline) { - return new Event(this, deadline, func) - } - - // Inserts an event to the list - WAAClock.prototype._insertEvent = function(event) { - this._events.splice(this._indexByTime(event._earliestTime), 0, event) - } - - // Removes an event from the list - WAAClock.prototype._removeEvent = function(event) { - var ind = this._events.indexOf(event) - if (ind !== -1) this._events.splice(ind, 1) - } - - // Returns true if `event` is in queue, false otherwise - WAAClock.prototype._hasEvent = function(event) { - return this._events.indexOf(event) !== -1 - } - - // Returns the index of the first event whose deadline is >= to `deadline` - WAAClock.prototype._indexByTime = function(deadline) { - // performs a binary search - var low = 0 - , high = this._events.length - , mid - while (low < high) { - mid = Math.floor((low + high) / 2) - if (this._events[mid]._earliestTime < deadline) - low = mid + 1 - else high = mid - } - return low - } - - // Converts from relative time to absolute time - WAAClock.prototype._absTime = function(relTime) { - return relTime + this.context.currentTime - } - - // Converts from absolute time to relative time - WAAClock.prototype._relTime = function(absTime) { - return absTime - this.context.currentTime - } - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(44))) - -/***/ }), -/* 44 */ -/***/ (function(module, exports) { - - // shim for using process in browser - var process = module.exports = {}; - - // cached from whatever global is present so that test runners that stub it - // don't break things. But we need to wrap it in a try catch in case it is - // wrapped in strict mode code which doesn't define any globals. It's inside a - // function because try/catches deoptimize in certain engines. - - var cachedSetTimeout; - var cachedClearTimeout; - - function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); - } - function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); - } - (function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } - } ()) - function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - - } - function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - - } - var queue = []; - var draining = false; - var currentQueue; - var queueIndex = -1; - - function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } - } - - function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); - } - - process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } - }; - - // v8 likes predictible objects - function Item(fun, array) { - this.fun = fun; - this.array = array; - } - Item.prototype.run = function () { - this.fun.apply(null, this.array); - }; - process.title = 'browser'; - process.browser = true; - process.env = {}; - process.argv = []; - process.version = ''; // empty string to avoid regexp issues - process.versions = {}; - - function noop() {} - - process.on = noop; - process.addListener = noop; - process.once = noop; - process.off = noop; - process.removeListener = noop; - process.removeAllListeners = noop; - process.emit = noop; - process.prependListener = noop; - process.prependOnceListener = noop; - - process.listeners = function (name) { return [] } - - process.binding = function (name) { - throw new Error('process.binding is not supported'); - }; - - process.cwd = function () { return '/' }; - process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); - }; - process.umask = function() { return 0; }; - - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var clock = __webpack_require__(1).clock; - - var Interval = (function () { - function Interval(rate, func, on) { - _classCallCheck(this, Interval); - - this.rate = rate; - this.on = on; - this.clock = clock(); // jshint ignore:line - - this.pattern = [1]; - this.index = 0; - - this.event = func ? func : function () {}; - - if (this.on) { - this.start(); - } - } - - _createClass(Interval, { - _event: { - value: function _event(e) { - // if (this.pattern[this.index%this.pattern.length]) { - this.event(e); - // } - this.index++; - } - }, - stop: { - value: function stop() { - this.on = false; - this.interval.clear(); - } - }, - start: { - value: function start() { - this.on = true; - this.interval = this.clock.callbackAtTime(this._event.bind(this), this.clock.context.currentTime).repeat(this.rate / 1000).tolerance({ early: 0.1, late: 1 }); - } - }, - ms: { - value: function ms(newrate) { - if (this.on) { - var ratio = newrate / this.rate; - this.rate = newrate; - this.clock.timeStretch(this.clock.context.currentTime, [this.interval], ratio); - } else { - this.rate = newrate; - } - } - } - }); - - return Interval; - })(); - - module.exports = Interval; - -/***/ }) -/******/ ]) -}); -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBiMjY5YWNlZjhjYWRhNzA4NDUwMiIsIndlYnBhY2s6Ly8vLi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9wb3NpdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbC9zdmcuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWwvbWF0aC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY29yZS9pbnRlcmZhY2UuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWwvZG9tLmpzIiwid2VicGFjazovLy8uL2xpYi91dGlsL3V0aWwuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3V0aWwvdG91Y2guanMiLCJ3ZWJwYWNrOi8vLy4vfi9ldmVudHMvZXZlbnRzLmpzIiwid2VicGFjazovLy8uL2xpYi9tb2RlbHMvc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbC9pbnRlcmFjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9saWIvbW9kZWxzL3RvZ2dsZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9zbGlkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2ludGVyZmFjZXMvdG9nZ2xlLmpzIiwid2VicGFjazovLy8uL2xpYi9pbnRlcmZhY2VzL2J1dHRvbi5qcyIsIndlYnBhY2s6Ly8vLi9saWIvY29tcG9uZW50cy9idXR0b250ZW1wbGF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy90ZXh0YnV0dG9uLmpzIiwid2VicGFjazovLy8uL2xpYi9pbnRlcmZhY2VzL3JhZGlvYnV0dG9uLmpzIiwid2VicGFjazovLy8uL2xpYi9pbnRlcmZhY2VzL251bWJlci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9zZWxlY3QuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2ludGVyZmFjZXMvZGlhbC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9waWFuby5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9zZXF1ZW5jZXIuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21vZGVscy9tYXRyaXguanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21vZGVscy9zZXF1ZW5jZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvbW9kZWxzL2RydW5rLmpzIiwid2VicGFjazovLy8uL2xpYi9tb2RlbHMvY291bnRlci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9wYW4yZC5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy90aWx0LmpzIiwid2VicGFjazovLy8uL2xpYi9pbnRlcmZhY2VzL211bHRpc2xpZGVyLmpzIiwid2VicGFjazovLy8uL2xpYi9jb21wb25lbnRzL3NsaWRlcnRlbXBsYXRlLmpzIiwid2VicGFjazovLy8uL2xpYi9pbnRlcmZhY2VzL3Bhbi5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9lbnZlbG9wZS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9zcGVjdHJvZ3JhbS5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9tZXRlci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW50ZXJmYWNlcy9vc2NpbGxvc2NvcGUuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL2NvcmUvcmFjay5qcyIsIndlYnBhY2s6Ly8vLi9saWIvdXRpbC90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vbGliL3R1bmluZy90dW5pbmcuanMiLCJ3ZWJwYWNrOi8vLy4vbGliL21vZGVscy9yYWRpby5qcyIsIndlYnBhY2s6Ly8vLi9+L3dhYWNsb2NrL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vd2FhY2xvY2svbGliL1dBQUNsb2NrLmpzIiwid2VicGFjazovLy8uL34vcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL2xpYi90aW1lL2ludGVydmFsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7OztBQ3RDQSxhQUFZLENBQUM7Ozs7S0FFTixPQUFPLHVDQUFNLENBQVk7O2tCQUVqQixPQUFPLEM7Ozs7Ozs7Ozs7Ozs7Ozs7U0NtSE4sTUFBTSxHQUFOLE1BQU07U0FHTixPQUFPLEdBQVAsT0FBTztTQUdQLEtBQUssR0FBTCxLQUFLOzs7O0FBN0hyQixhQUFZLENBQUM7O0tBRU4sVUFBVSx1Q0FBTSxDQUFlOztLQUMvQixJQUFJLHVDQUFNLENBQWE7O0tBQ3ZCLElBQUksdUNBQU0sRUFBYTs7S0FDdkIsSUFBSSx1Q0FBTSxFQUFpQjs7S0FDdEIsU0FBUywrQ0FBTSxFQUFrQjs7QUFFN0MsS0FBSSxPQUFPLEdBQUcsbUJBQU8sQ0FBQyxFQUFrQixDQUFDLENBQUM7QUFDMUMsS0FBSSxLQUFLLEdBQUcsbUJBQU8sQ0FBQyxFQUFnQixDQUFDLENBQUM7QUFDdEMsS0FBSSxLQUFLLEdBQUcsbUJBQU8sQ0FBQyxFQUFnQixDQUFDLENBQUM7QUFDdEMsS0FBSSxRQUFRLEdBQUcsbUJBQU8sQ0FBQyxFQUFtQixDQUFDLENBQUM7QUFDNUMsS0FBSSxNQUFNLEdBQUcsbUJBQU8sQ0FBQyxFQUFpQixDQUFDLENBQUM7O0tBRWpDLFFBQVEsdUNBQU0sRUFBVTs7S0FDeEIsUUFBUSx1Q0FBTSxFQUFpQjs7Ozs7O0tBT2hDLE9BQU87QUFFRSxZQUZULE9BQU8s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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxnQkFBZSxTQUFTO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFHO0FBQ0gscUJBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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QUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRSxhQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0FBRWxFLGFBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN2QyxhQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdkMsYUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDOztBQUV2QyxhQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkUsYUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25FLGFBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFFbkUsYUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3hDLGFBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN4QyxhQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7O0FBR3hDLGFBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBQyxJQUFJLENB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Q0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25ELGVBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25ELGVBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELGVBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELGVBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELGVBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1VBQ25ELE1BQU07QUFDTCxlQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDdEQsZUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUQsZUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUQsZUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUQsZUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDNUQsZUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDNUQsZUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDNUQsZUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekQsZUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekQsZUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekQsZUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUQsZUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUQsZUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUQsZUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7VUFDekQ7UUFFRjs7QUFFRCxXQUFNO2NBQUEsZ0JBQUMsQ0FBQyxFQUFFO0FBQ1IsYUFBSSxJQUFJLENBQUMsT0FBTyxFQUFDOztBQUVmLGVBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDZixlQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2hCLGVBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7OztBQUdoQixZQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixZQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixZQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRzVCLGVBQUksWUFBWSxHQUFHO0FBQ2pCLGtCQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBQyxHQUFHO0FBQ2xCLGdCQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsR0FBRyxFQUFDLElBQUksQ0FBQyxFQUFFLEdBQUMsR0FBRyxFQUFDLElBQUksQ0FBQyxFQUFFLEdBQUMsR0FBRyxDQUFDLEVBQUcsSUFBSSxDQUFDLEVBQUUsR0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBQyxHQUFHLENBQUU7WUFDekYsQ0FBQztBQUNGLGVBQUksYUFBYSxHQUFHO0FBQ2xCLGtCQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBQyxHQUFHO0FBQ2xCLGdCQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLElBQUksQ0FBQyxFQUFFLEdBQUMsR0FBRyxFQUFDLElBQUksQ0FBQyxFQUFFLEdBQUMsR0FBRyxDQUFDLEVBQUcsSUFBSSxDQUFDLEVBQUUsR0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBQyxHQUFHLENBQUU7WUFDekYsQ0FBQzs7QUFFRixlQUFJLFVBQVUsR0FBRyxHQUFHLENBQUMsR0FB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QUFJLENBQUMsSUFBSSxDQUFDLEtBQUcsQ0FBQyxHQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDOztBQUVuQyxTQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBRSxDQUFDLEVBQUU7O0FBRXhDLFdBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBQyxDQUFDLENBQUM7QUFDcEQsV0FBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFDLENBQUMsQ0FBQzs7QUFFcEQsV0FBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDOUMsV0FBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7O0FBRTlDLFdBQUksSUFBSSxHQUFHLFNBQVMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsV0FBSSxLQUFLLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7QUFFcEUsV0FBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRTtBQUFFLGFBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQUU7QUFDckMsV0FBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRTtBQUFFLGFBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQUU7TUFFeEM7O0FBRUQsU0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDdEMsU0FBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFR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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBeUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsSUFBRztBQUNIO0FBQ0E7O0FBRUEsSUFBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBa0MsaUNBQWlDO0FBQ25FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFxQyxlQUFlO0FBQ3BEO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEk7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEU7Ozs7Ozs7QUN6T0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQSxFQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsVUFBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdCQUF1QixzQkFBc0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBcUI7QUFDckI7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFxQzs7QUFFckM7QUFDQTtBQUNBOztBQUVBLDRCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw2QkFBNEIsVUFBVTs7Ozs7OztBQ3ZMdEMsYUFBWSxDQUFDOzs7Ozs7S0FFSixLQUFLLHVCQUFRLENBQVMsRUFBdEIsS0FBSzs7S0FFTyxRQUFRO0FBRWhCLFlBRlEsUUFBUSxDQUVmLElBQUksRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFOzJCQUZQLFFBQVE7O0FBSXpCLFNBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLFNBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2IsU0FBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQzs7QUFFckIsU0FBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLFNBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztBQUVmLFNBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxZQUFXLEVBQUcsQ0FBQzs7QUFFMUMsU0FBSSxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ1gsV0FBSSxDQUFDLEtBQUssRUFBRSxDQUFDO01BQ2Q7SUFFRjs7Z0JBakJrQixRQUFRO0FBbUIzQixXQUFNO2NBQUEsZ0JBQUMsQ0FBQyxFQUFFOztBQUVOLGFBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRWhCLGFBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNkOztBQUVELFNBQUk7Y0FBQSxnQkFBRztBQUNMLGFBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBQ2hCLGFBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkI7O0FBRUQsVUFBSztjQUFBLGlCQUFHO0FBQ04sYUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDZixhQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7UUFDMUo7O0FBRUQsT0FBRTtjQUFBLFlBQUMsT0FBTyxFQUFFO0FBQ1YsYUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ1gsZUFBSSxLQUFLLEdBQUcsT0FBTyxHQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDOUIsZUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7QUFDcEIsZUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1VBQ2hGLE1BQU07QUFDTCxlQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztVQUNyQjtRQUNGOzs7O1VBNUNrQixRQUFROzs7a0JBQVIsUUFBUSxDIiwiZmlsZSI6Ii4vZGlzdC9OZXh1c1VJLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiTmV4dXNcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiTmV4dXNcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYjI2OWFjZWY4Y2FkYTcwODQ1MDIiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBOZXh1c1VJIGZyb20gJy4vbGliL21haW4nO1xuXG5leHBvcnQgZGVmYXVsdCBOZXh1c1VJO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vaW5kZXguanMiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBJbnRlcmZhY2VzIGZyb20gJy4vaW50ZXJmYWNlcy8nO1xuaW1wb3J0IG1hdGggZnJvbSAnLi91dGlsL21hdGgnO1xuaW1wb3J0IFJhY2sgZnJvbSAnLi9jb3JlL3JhY2snO1xuaW1wb3J0IFR1bmUgZnJvbSAnLi90dW5pbmcvdHVuaW5nJztcbmltcG9ydCAqIGFzIFRyYW5zZm9ybSBmcm9tICcuL3V0aWwvdHJhbnNmb3JtJztcblxubGV0IENvdW50ZXIgPSByZXF1aXJlKCcuL21vZGVscy9jb3VudGVyJyk7XG5sZXQgUmFkaW8gPSByZXF1aXJlKCcuL21vZGVscy9yYWRpbycpO1xubGV0IERydW5rID0gcmVxdWlyZSgnLi9tb2RlbHMvZHJ1bmsnKTtcbmxldCBTZXF1ZW5jZSA9IHJlcXVpcmUoJy4vbW9kZWxzL3NlcXVlbmNlJyk7XG5sZXQgTWF0cml4ID0gcmVxdWlyZSgnLi9tb2RlbHMvbWF0cml4Jyk7XG5cbmltcG9ydCBXQUFDbG9jayBmcm9tICd3YWFjbG9jayc7XG5pbXBvcnQgSW50ZXJ2YWwgZnJvbSAnLi90aW1lL2ludGVydmFsJztcblxuXG4vKipcbk5leHVzVUkgPT4gY3JlYXRlZCBhcyBOZXh1c1xuKi9cblxuY2xhc3MgTmV4dXNVSSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIEludGVyZmFjZXMpIHtcbiAgICAgICAgICAgIHRoaXNba2V5XSA9IEludGVyZmFjZXNba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBtYXRoKSB7XG4gICAgICAgICAgICB0aGlzW2tleV0gPSBtYXRoW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgQ29yZSA9IHtcbiAgICAgICAgICAnUmFjayc6IFJhY2tcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgTW9kZWxzID0ge1xuICAgICAgICAgICdDb3VudGVyJzogQ291bnRlcixcbiAgICAgICAgICAnUmFkaW8nOiBSYWRpbyxcbiAgICAgICAgICAnRHJ1bmsnOiBEcnVuayxcbiAgICAgICAgICAnU2VxdWVuY2UnOiBTZXF1ZW5jZSxcbiAgICAgICAgICAnTWF0cml4JzogTWF0cml4XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIE1vZGVscykge1xuICAgICAgICAgIHRoaXNba2V5XSA9IE1vZGVsc1trZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIENvcmUpIHtcbiAgICAgICAgICB0aGlzW2tleV0gPSBDb3JlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgRGVmYXVsdENvbnRleHQgPSB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQ7XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0IHx8IG5ldyBEZWZhdWx0Q29udGV4dCgpO1xuXG4gICAgICAgIHRoaXMudHVuZSA9IG5ldyBUdW5lKCk7XG4gICAgICAgIHRoaXMubm90ZSA9IHRoaXMudHVuZS5ub3RlLmJpbmQodGhpcy50dW5lKTtcblxuICAgICAgICB0aGlzLmNsb2NrID0gbmV3IFdBQUNsb2NrKHRoaXMuX2NvbnRleHQpO1xuICAgICAgICB0aGlzLmNsb2NrLnN0YXJ0KCk7XG4gICAgICAgIHRoaXMuSW50ZXJ2YWwgPSBJbnRlcnZhbDtcblxuICAgICAgICB0aGlzLmNvbG9ycyA9IHtcbiAgICAgICAgICBhY2NlbnQ6ICcjMmJiJyxcbiAgICAgICAgICBmaWxsOiAnI2VlZScsXG4gICAgICAgICAgbGlnaHQ6ICcjZmZmJyxcbiAgICAgICAgICBkYXJrOiAnIzMzMycsXG4gICAgICAgICAgbWVkaXVtTGlnaHQ6ICcjY2NjJyxcbiAgICAgICAgICBtZWRpdW1EYXJrOiAnIzY2NidcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IFRyYW5zZm9ybTtcbiAgICAgICAgdGhpcy5hZGQgPSBUcmFuc2Zvcm0uYWRkO1xuXG5cbiAgICAgICAgdGhpcy5BZGQgPSB7fTtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIEludGVyZmFjZXMpIHtcbiAgICAgICAgICB0aGlzLkFkZFtrZXldID0gVHJhbnNmb3JtLmFkZC5iaW5kKHRoaXMsa2V5KTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIC8qIGNyZWF0ZSBkZWZhdWx0IGNvbXBvbmVudCBzaXplICovXG4gICAgICAgIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cbiAgICAgICAgdmFyIGV4aXN0aW5nU3R5bGVzaGVldHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInN0eWxlXCIpO1xuICAgICAgICB2YXIgZGVmYXVsdFNpemVEZWNsYXJhdGlvbiA9ICdbbmV4dXMtdWlde2hlaWdodDo1MDAwcHg7d2lkdGg6NTAwMHB4fSc7XG4gICAgICAgIHZhciBkZWZhdWx0U3R5bGVOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgZGVmYXVsdFN0eWxlTm9kZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgZGVmYXVsdFN0eWxlTm9kZS5pbm5lckhUTUwgPSBkZWZhdWx0U2l6ZURlY2xhcmF0aW9uO1xuICAgICAgICBpZiAoZXhpc3RpbmdTdHlsZXNoZWV0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIHBhcmVudCA9IGV4aXN0aW5nU3R5bGVzaGVldHNbMF0ucGFyZW50Tm9kZVxuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoIGRlZmF1bHRTdHlsZU5vZGUsIGV4aXN0aW5nU3R5bGVzaGVldHNbMF0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9jdW1lbnQud3JpdGUoJzxzdHlsZT4nK2RlZmF1bHRTaXplRGVjbGFyYXRpb24rJzxcXC9zdHlsZT4nKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gICAgfVxuXG4gICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29udGV4dDtcbiAgICB9XG5cbiAgICBzZXQgY29udGV4dChjdHgpIHtcbiAgICAgIHRoaXMuY2xvY2suc3RvcCgpO1xuICAgICAgdGhpcy5fY29udGV4dCA9IGN0eDtcbiAgICAgIHRoaXMuY2xvY2sgPSBuZXcgV0FBQ2xvY2sodGhpcy5jb250ZXh0KTtcbiAgICAgIHRoaXMuY2xvY2suc3RhcnQoKTtcbiAgICB9XG5cblxuXG59XG5cbmxldCBOZXh1cyA9IG5ldyBOZXh1c1VJKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcnMoKSB7XG4gICAgcmV0dXJuIE5leHVzLmNvbG9ycztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb250ZXh0KCkge1xuICAgIHJldHVybiBOZXh1cy5jb250ZXh0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNsb2NrKCkge1xuICAgIHJldHVybiBOZXh1cy5jbG9jaztcbn1cblxuZXhwb3J0IGRlZmF1bHQgTmV4dXM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvbWFpbi5qcyIsImV4cG9ydCBkZWZhdWx0IHtcbiAgUG9zaXRpb246IHJlcXVpcmUoJy4vcG9zaXRpb24nKSxcbiAgU2xpZGVyOiByZXF1aXJlKCcuL3NsaWRlcicpLFxuICBUb2dnbGU6IHJlcXVpcmUoJy4vdG9nZ2xlJyksXG4vKiAgUmFuZ2U6IHJlcXVpcmUoJy4vcmFuZ2VzbGlkZXInKSxcbiAgV2F2ZWZvcm06IHJlcXVpcmUoJy4vd2F2ZWZvcm0nKSwgKi9cbiAgQnV0dG9uOiByZXF1aXJlKCcuL2J1dHRvbicpLFxuICBUZXh0QnV0dG9uOiByZXF1aXJlKCcuL3RleHRidXR0b24nKSxcbiAgUmFkaW9CdXR0b246IHJlcXVpcmUoJy4vcmFkaW9idXR0b24nKSxcbiAgTnVtYmVyOiByZXF1aXJlKCcuL251bWJlcicpLFxuICBTZWxlY3Q6IHJlcXVpcmUoJy4vc2VsZWN0JyksXG4gIERpYWw6IHJlcXVpcmUoJy4vZGlhbCcpLFxuICBQaWFubzogcmVxdWlyZSgnLi9waWFubycpLFxuICBTZXF1ZW5jZXI6IHJlcXVpcmUoJy4vc2VxdWVuY2VyJyksXG4gIFBhbjJEOiByZXF1aXJlKCcuL3BhbjJkJyksXG4gIFRpbHQ6IHJlcXVpcmUoJy4vdGlsdCcpLFxuICBNdWx0aXNsaWRlcjogcmVxdWlyZSgnLi9tdWx0aXNsaWRlcicpLFxuICBQYW46IHJlcXVpcmUoJy4vcGFuJyksXG4gIEVudmVsb3BlOiByZXF1aXJlKCcuL2VudmVsb3BlJyksXG4gIFNwZWN0cm9ncmFtOiByZXF1aXJlKCcuL3NwZWN0cm9ncmFtJyksXG4gIE1ldGVyOiByZXF1aXJlKCcuL21ldGVyJyksXG4gIE9zY2lsbG9zY29wZTogcmVxdWlyZSgnLi9vc2NpbGxvc2NvcGUnKVxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9pbnRlcmZhY2VzL2luZGV4LmpzIiwiXG4ndXNlIHN0cmljdCc7XG5cbmxldCBzdmcgPSByZXF1aXJlKCcuLi91dGlsL3N2ZycpO1xubGV0IEludGVyZmFjZSA9IHJlcXVpcmUoJy4uL2NvcmUvaW50ZXJmYWNlJyk7XG5sZXQgU3RlcCA9IHJlcXVpcmUoJy4uL21vZGVscy9zdGVwJyk7XG5pbXBvcnQgKiBhcyBJbnRlcmFjdGlvbiBmcm9tICcuLi91dGlsL2ludGVyYWN0aW9uJztcblxuLyoqXG4qIFBvc2l0aW9uXG4qXG4qIEBkZXNjcmlwdGlvbiBUd28tZGltZW5zaW9uYWwgdG91Y2ggc2xpZGVyLlxuKlxuKiBAZGVtbyA8c3BhbiBuZXh1cy11aT1cInBvc2l0aW9uXCI+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgcG9zaXRpb24gPSBuZXcgTmV4dXMuUG9zaXRpb24oJyN0YXJnZXQnKVxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgcG9zaXRpb24gPSBuZXcgTmV4dXMuUG9zaXRpb24oJyN0YXJnZXQnLHtcbiogICAnc2l6ZSc6IFsyMDAsMjAwXSxcbiogICAnbW9kZSc6ICdhYnNvbHV0ZScsICAvLyBcImFic29sdXRlXCIgb3IgXCJyZWxhdGl2ZVwiXG4qICAgJ3gnOiAwLjUsICAvLyBpbml0aWFsIHggdmFsdWVcbiogICAnbWluWCc6IDAsXG4qICAgJ21heFgnOiAxLFxuKiAgICdzdGVwWCc6IDAsXG4qICAgJ3knOiAwLjUsICAvLyBpbml0aWFsIHkgdmFsdWVcbiogICAnbWluWSc6IDAsXG4qICAgJ21heFknOiAxLFxuKiAgICdzdGVwWSc6IDBcbiogfSlcbipcbiogQG91dHB1dFxuKiBjaGFuZ2VcbiogRmlyZXMgYW55IHRpbWUgdGhlIGludGVyZmFjZSdzIHZhbHVlIGNoYW5nZXMuIDxicj5cbiogVGhlIGV2ZW50IGRhdGEgaXMgYW4gb2JqZWN0IHdpdGggeCBhbmQgeSBwcm9wZXJ0aWVzIGNvbnRhaW5pbmcgdGhlIHggYW5kIHkgdmFsdWVzIG9mIHRoZSBpbnRlcmZhY2UuXG4qXG4qIEBvdXRwdXRleGFtcGxlXG4qIHBvc2l0aW9uLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcbiogICBjb25zb2xlLmxvZyh2KTtcbiogfSlcbipcbipcbiovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvc2l0aW9uIGV4dGVuZHMgSW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIGxldCBvcHRpb25zID0gWyd2YWx1ZSddO1xuXG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgJ3NpemUnOiBbMjAwLDIwMF0sXG4gICAgICAnbW9kZSc6ICdhYnNvbHV0ZScsXG4gICAgICAnbWluWCc6IDAsXG4gICAgICAnbWF4WCc6IDEsXG4gICAgICAnc3RlcFgnOiAwLFxuICAgICAgJ3gnOiAwLjUsXG4gICAgICAnbWluWSc6IDAsXG4gICAgICAnbWF4WSc6IDEsXG4gICAgICAnc3RlcFknOiAwLFxuICAgICAgJ3knOiAwLjVcbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG5cbiAgICB0aGlzLl94ID0gbmV3IFN0ZXAoIHRoaXMuc2V0dGluZ3MubWluWCwgdGhpcy5zZXR0aW5ncy5tYXhYLCB0aGlzLnNldHRpbmdzLnN0ZXBYLCB0aGlzLnNldHRpbmdzLnggKTtcbiAgICB0aGlzLl95ID0gbmV3IFN0ZXAoIHRoaXMuc2V0dGluZ3MubWluWSwgdGhpcy5zZXR0aW5ncy5tYXhZLCB0aGlzLnNldHRpbmdzLnN0ZXBZLCB0aGlzLnNldHRpbmdzLnkgKTtcblxuICAgIHRoaXMucG9zaXRpb24gPSB7XG4gICAgICB4OiBuZXcgSW50ZXJhY3Rpb24uSGFuZGxlKHRoaXMuc2V0dGluZ3MubW9kZSwnaG9yaXpvbnRhbCcsWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKSxcbiAgICAgIHk6IG5ldyBJbnRlcmFjdGlvbi5IYW5kbGUodGhpcy5zZXR0aW5ncy5tb2RlLCd2ZXJ0aWNhbCcsWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKVxuICAgIH07XG4gICAgdGhpcy5wb3NpdGlvbi54LnZhbHVlID0gdGhpcy5feC5ub3JtYWxpemVkO1xuICAgIHRoaXMucG9zaXRpb24ueS52YWx1ZSA9IHRoaXMuX3kubm9ybWFsaXplZDtcblxuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy5rbm9iID0gc3ZnLmNyZWF0ZSgnY2lyY2xlJyk7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMua25vYik7XG4gICAgXG4gIH1cblxuICBzaXplSW50ZXJmYWNlKCkge1xuXG4gICAgICB0aGlzLnBvc2l0aW9uLngucmVzaXplKFswLHRoaXMud2lkdGhdLFt0aGlzLmhlaWdodCwwXSk7XG4gICAgICB0aGlzLnBvc2l0aW9uLnkucmVzaXplKFswLHRoaXMud2lkdGhdLFt0aGlzLmhlaWdodCwwXSk7XG5cbiAgICAgIHRoaXMuX21pbkRpbWVuc2lvbiA9IE1hdGgubWluKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO1xuXG4gICAgICB0aGlzLmtub2JSYWRpdXMgPSB7XG4gICAgICAgIG9mZjogfn4odGhpcy5fbWluRGltZW5zaW9uLzEwMCkgKiA1ICsgNSxcbiAgICAgIH07XG4gICAgICB0aGlzLmtub2JSYWRpdXMub24gPSB0aGlzLmtub2JSYWRpdXMub2ZmICogMjtcblxuICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3gnLHRoaXMud2lkdGgvMik7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeScsdGhpcy5oZWlnaHQvMik7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdyJyx0aGlzLmtub2JSYWRpdXMub2ZmKTtcbiAgfVxuXG4gIGNvbG9ySW50ZXJmYWNlKCkge1xuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5jb2xvcnMuYWNjZW50KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5jbGlja2VkKSB7XG4gICAgLy8gIHRoaXMua25vYlJhZGl1cyA9IDMwO1xuICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgncicsdGhpcy5rbm9iUmFkaXVzLm9uKTtcbiAgICB9IGVsc2Uge1xuICAgIC8vICB0aGlzLmtub2JSYWRpdXMgPSAxNTtcbiAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ3InLHRoaXMua25vYlJhZGl1cy5vZmYpO1xuICAgIH1cblxuICAgIHRoaXMua25vYkNvb3JkaW5hdGVzID0ge1xuICAgICAgeDogdGhpcy5feC5ub3JtYWxpemVkICogdGhpcy53aWR0aCxcbiAgICAgIHk6IHRoaXMuaGVpZ2h0IC0gdGhpcy5feS5ub3JtYWxpemVkICogdGhpcy5oZWlnaHRcbiAgICB9O1xuXG4gICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3gnLHRoaXMua25vYkNvb3JkaW5hdGVzLngpO1xuICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N5Jyx0aGlzLmtub2JDb29yZGluYXRlcy55KTtcbiAgfVxuXG5cbiAgY2xpY2soKSB7XG4gICAgdGhpcy5wb3NpdGlvbi54LmFuY2hvciA9IHRoaXMubW91c2U7XG4gICAgdGhpcy5wb3NpdGlvbi55LmFuY2hvciA9IHRoaXMubW91c2U7XG4gICAgdGhpcy5tb3ZlKCk7XG4gIH1cblxuICBtb3ZlKCkge1xuICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcbiAgICAgIHRoaXMucG9zaXRpb24ueC51cGRhdGUodGhpcy5tb3VzZSk7XG4gICAgICB0aGlzLnBvc2l0aW9uLnkudXBkYXRlKHRoaXMubW91c2UpO1xuICAgICAgdGhpcy5feC51cGRhdGVOb3JtYWwoIHRoaXMucG9zaXRpb24ueC52YWx1ZSApO1xuICAgICAgdGhpcy5feS51cGRhdGVOb3JtYWwoIHRoaXMucG9zaXRpb24ueS52YWx1ZSApO1xuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgICAgeDogdGhpcy5feC52YWx1ZSxcbiAgICAgICAgeTogdGhpcy5feS52YWx1ZVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAqIFRoZSBpbnRlcmZhY2UncyB4IHZhbHVlLiBXaGVuIHNldCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGFkanVzdCB0byBmaXQgbWluL21heC9zdGVwIHNldHRpbmdzIG9mIHRoZSBpbnRlcmZhY2UuXG4gICogQHR5cGUge29iamVjdH1cbiAgKiBAZXhhbXBsZSBwb3NpdGlvbi54ID0gMC41O1xuICAqL1xuXG4gIGdldCB4KCkge1xuICAgIHJldHVybiB0aGlzLl94LnZhbHVlO1xuICB9XG5cbiAgc2V0IHgodmFsdWUpIHtcbiAgICB0aGlzLl94LnVwZGF0ZSh2YWx1ZSk7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgIHg6IHRoaXMuX3gudmFsdWUsXG4gICAgICB5OiB0aGlzLl95LnZhbHVlXG4gICAgfSk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAqIFRoZSBpbnRlcmZhY2UncyB5IHZhbHVlcy4gV2hlbiBzZXQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBhZGp1c3QgdG8gZml0IG1pbi9tYXgvc3RlcCBzZXR0aW5ncyBvZiB0aGUgaW50ZXJmYWNlLlxuICAqIEB0eXBlIHtvYmplY3R9XG4gICogQGV4YW1wbGUgcG9zaXRpb24ueCA9IDAuNTtcbiAgKi9cblxuICBnZXQgeSgpIHtcbiAgICByZXR1cm4gdGhpcy5feS52YWx1ZTtcbiAgfVxuXG4gIHNldCB5KHZhbHVlKSB7XG4gICAgdGhpcy5feS51cGRhdGUodmFsdWUpO1xuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx7XG4gICAgICB4OiB0aGlzLl94LnZhbHVlLFxuICAgICAgeTogdGhpcy5feS52YWx1ZVxuICAgIH0pO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuXG5cbiAgZ2V0IG5vcm1hbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHRoaXMuX3gubm9ybWFsaXplZCxcbiAgICAgIHk6IHRoaXMuX3kubm9ybWFsaXplZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgKiBUaGUgbG93ZXIgbGltaXQgb2YgdmFsdWUgb24gdGhlIHggYXhpc1xuICAqIEB0eXBlIHtvYmplY3R9XG4gICovXG4gIGdldCBtaW5YKCkge1xuICAgIHJldHVybiB0aGlzLl94Lm1pbjtcbiAgfVxuXG4gIHNldCBtaW5YKHYpIHtcbiAgICB0aGlzLl94Lm1pbiA9IHY7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAqIFRoZSBsb3dlciBsaW1pdCBvZiB2YWx1ZSBvbiB0aGUgeSBheGlzXG4gICogQHR5cGUge29iamVjdH1cbiAgKi9cbiAgZ2V0IG1pblkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3kubWluO1xuICB9XG5cbiAgc2V0IG1pblkodikge1xuICAgIHRoaXMuX3kubWluID0gdjtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cblxuICAvKipcbiAgKiBUaGUgdXBwZXIgbGltaXQgb2YgdmFsdWUgb24gdGhlIHggYXhpc1xuICAqIEB0eXBlIHtvYmplY3R9XG4gICovXG4gIGdldCBtYXhYKCkge1xuICAgIHJldHVybiB0aGlzLl94Lm1heDtcbiAgfVxuXG4gIHNldCBtYXhYKHYpIHtcbiAgICB0aGlzLl94Lm1heCA9IHY7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICogVGhlIHVwcGVyIGxpbWl0IG9mIHZhbHVlIG9uIHRoZSB5IGF4aXNcbiAgKiBAdHlwZSB7b2JqZWN0fVxuICAqL1xuICBnZXQgbWF4WSgpIHtcbiAgICByZXR1cm4gdGhpcy5feS5tYXg7XG4gIH1cblxuICBzZXQgbWF4WSh2KSB7XG4gICAgdGhpcy5feS5tYXggPSB2O1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuXG4gIC8qKlxuICAqIFRoZSBpbmNyZW1lbnRhbCBzdGVwIG9mIHZhbHVlcyBvbiB0aGUgeCBheGlzXG4gICogQHR5cGUge29iamVjdH1cbiAgKi9cbiAgZ2V0IHN0ZXBYKCkge1xuICAgIHJldHVybiB0aGlzLl94LnN0ZXA7XG4gIH1cblxuICBzZXQgc3RlcFgodikge1xuICAgIHRoaXMuX3guc3RlcCA9IHY7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICogVGhlIGluY3JlbWVudGFsIHN0ZXAgb2YgdmFsdWVzIG9uIHRoZSB5IGF4aXNcbiAgKiBAdHlwZSB7b2JqZWN0fVxuICAqL1xuICBnZXQgc3RlcFkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3kuc3RlcDtcbiAgfVxuXG4gIHNldCBzdGVwWSh2KSB7XG4gICAgdGhpcy5feS5zdGVwID0gdjtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cblxuICAvKipcbiAgQWJzb2x1dGUgbW9kZSAocG9zaXRpb24ncyB2YWx1ZSBqdW1wcyB0byBtb3VzZSBjbGljayBwb3NpdGlvbikgb3IgcmVsYXRpdmUgbW9kZSAobW91c2UgZHJhZyBjaGFuZ2VzIHZhbHVlIHJlbGF0aXZlIHRvIGl0cyBjdXJyZW50IHBvc2l0aW9uKS4gRGVmYXVsdDogXCJhYnNvbHV0ZVwiLlxuICBAdHlwZSB7c3RyaW5nfVxuICBAZXhhbXBsZSBwb3NpdGlvbi5tb2RlID0gXCJyZWxhdGl2ZVwiO1xuICAqL1xuICBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54Lm1vZGU7XG4gIH1cbiAgc2V0IG1vZGUodikge1xuICAgIHRoaXMucG9zaXRpb24ueC5tb2RlID0gdjtcbiAgICB0aGlzLnBvc2l0aW9uLnkubW9kZSA9IHY7XG4gIH1cblxuXG5cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL2ludGVyZmFjZXMvcG9zaXRpb24uanMiLCIndXNlIHN0cmljdCc7XG5cbmxldCBtYXRoID0gcmVxdWlyZSgnLi4vdXRpbC9tYXRoJyk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICBjcmVhdGU6ICh0eXBlKSA9PiB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCB0eXBlKTtcbiAgfSxcblxuICBhcmM6ICh4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKSA9PiB7XG5cbiAgICB2YXIgc3RhcnQgPSBtYXRoLnRvQ2FydGVzaWFuKHJhZGl1cywgZW5kQW5nbGUpO1xuICAgIHZhciBlbmQgPSBtYXRoLnRvQ2FydGVzaWFuKHJhZGl1cywgc3RhcnRBbmdsZSk7XG5cbiAgICB2YXIgbGFyZ2VBcmNGbGFnID0gZW5kQW5nbGUgLSBzdGFydEFuZ2xlIDw9IDE4MCA/ICcwJyA6ICcxJztcblxuICAgIHZhciBkID0gW1xuICAgICAgICAnTScsIHN0YXJ0LngreCwgc3RhcnQueSt5LFxuICAgICAgICAnQScsIHJhZGl1cywgcmFkaXVzLCAwLCBsYXJnZUFyY0ZsYWcsIDAsIGVuZC54K3gsIGVuZC55K3lcbiAgICBdLmpvaW4oJyAnKTtcblxuICAgIHJldHVybiBkO1xuICB9LFxuXG4gIHJhZGlhbEdyYWRpZW50OiAoZGVmcyxudW1iZXJPZlN0b3BzKSA9PiB7XG5cbiAgICBsZXQgaWQgPSAnZ3JhZGllbnQnICsgbWF0aC5yaSgxMDAwMDAwMDAwMDApO1xuICAgIGxldCBzdG9wcyA9IFtdO1xuXG4gICAgbGV0IGdyYWRpZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdyYWRpYWxHcmFkaWVudCcpO1xuICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBpZCk7XG4gICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlKCdjeCcsICc1MCUnKTtcbiAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGUoJ2N5JywgJzUwJScpO1xuICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZSgncicsICc1MCUnKTtcblxuICAgIGRlZnMuYXBwZW5kQ2hpbGQoZ3JhZGllbnQpO1xuXG4gICAgZm9yIChsZXQgaT0wO2k8bnVtYmVyT2ZTdG9wcztpKyspIHtcbiAgICAgIGxldCBzdG9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdG9wJyk7XG4gICAgICBzdG9wLnNldEF0dHJpYnV0ZSgnaWQnLCAnc3RvcCcraSk7XG4gICAgICAvL3N0b3Auc2V0QXR0cmlidXRlKCdvZmZzZXQnLCAnNzAlJyk7XG4gICAgICAvL3N0b3Auc2V0QXR0cmlidXRlKCdzdG9wLWNvbG9yJywgJ1doaXRlJyk7XG4gICAgICBncmFkaWVudC5hcHBlbmRDaGlsZChzdG9wKTtcbiAgICAgIHN0b3BzLnB1c2goc3RvcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHN0b3BzOiBzdG9wcyxcbiAgICAgIGVsZW1lbnQ6IGdyYWRpZW50XG4gICAgfTtcblxuICB9XG5cbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvdXRpbC9zdmcuanMiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTGltaXQgYSBudW1iZXIgdG8gd2l0aGluIGEgbWluaW11bSBhbmQgbWF4aW11bVxuICogQHBhcmFtICB7bnVtYmVyfSB2YWx1ZSBJbnB1dCB2YWx1ZVxuICogQHBhcmFtICB7bnVtYmVyfSBtaW4gICBMb3dlciBsaW1pdFxuICogQHBhcmFtICB7bnVtYmVyfSBtYXggICBVcHBlciBsaW1pdFxuICogQHJldHVybiB7bnVtYmVyfSAgICAgICBUaGUgaW5wdXQgdmFsdWUgY29uc3RyYWluZWQgd2l0aGluIHRoZSBsb3dlciBhbmQgdXBwZXIgbGltaXRzXG4gKiBAZXhhbXBsZVxuICogTmV4dXMuY2xpcCgxMSwwLDEwKSAgIC8vIHJldHVybnMgMTBcbiAqIE5leHVzLmNsaXAoLTEsMCwxMCkgICAvLyByZXR1cm5zIDBcbiAqIE5leHVzLmNsaXAoNSwwLDEwKSAgICAvLyByZXR1cm5zIDVcbiAqL1xuXG5leHBvcnRzLmNsaXAgPSAodmFsdWUsbWluLG1heCkgPT4ge1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsbWluKSxtYXgpO1xufTtcblxuZXhwb3J0cy5ub3JtYWxpemUgPSAodmFsdWUsbWluLG1heCkgPT4ge1xuICByZXR1cm4gKCAodmFsdWUtbWluKSAvIChtYXgtbWluKSApO1xufTtcblxuLyoqXG4gKiBTY2FsZSBhIHZhbHVlIGZyb20gb25lIHJhbmdlIHRvIGFub3RoZXIgcmFuZ2UuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGluTnVtICBJbnB1dCB2YWx1ZVxuICogQHBhcmFtICB7bnVtYmVyfSBpbk1pbiAgSW5wdXQgcmFuZ2UgbWluaW11bVxuICogQHBhcmFtICB7bnVtYmVyfSBpbk1heCAgSW5wdXQgcmFuZ2UgbWF4aW11bVxuICogQHBhcmFtICB7bnVtYmVyfSBvdXRNaW4gT3V0cHV0IHJhbmdlIG1pbmltdW1cbiAqIEBwYXJhbSAge251bWJlcn0gb3V0TWF4IE91dHB1dCByYW5nZSBtYXhpbXVtXG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICBUaGUgaW5wdXQgdmFsdWUgc2NhbGVkIHRvIGl0cyBuZXcgcmFuZ2VcbiAqIEBleGFtcGxlXG4gKiBOZXh1cy5zY2FsZSgwLjUsMCwxLDAsMTApICAgLy8gcmV0dXJucyA1XG4gKiBOZXh1cy5zY2FsZSgwLjksMCwxLDEsMCkgICAgLy8gcmV0dXJucyAwLjFcbiAqL1xuZXhwb3J0cy5zY2FsZSA9IChpbk51bSwgaW5NaW4sIGluTWF4LCBvdXRNaW4sIG91dE1heCkgPT4ge1xuICBpZiAoaW5NaW4gPT09IGluTWF4KSB7XG4gICAgcmV0dXJuIG91dE1pbjtcbiAgfVxuICByZXR1cm4gKCgoaW5OdW0gLSBpbk1pbikgKiAob3V0TWF4IC0gb3V0TWluKSkgLyAoaW5NYXggLSBpbk1pbikpICsgb3V0TWluO1xufTtcblxuZXhwb3J0cy50b1BvbGFyID0gKHgseSkgPT4ge1xuICB2YXIgciA9IE1hdGguc3FydCh4KnggKyB5KnkpO1xuXG4gIHZhciB0aGV0YSA9IE1hdGguYXRhbjIoeSx4KTtcbiAgaWYgKHRoZXRhIDwgMCkge1xuICAgIHRoZXRhID0gdGhldGEgKyAoMiAqIE1hdGguUEkpO1xuICB9XG4gIHJldHVybiB7cmFkaXVzOiByLCBhbmdsZTogdGhldGF9O1xufTtcblxuZXhwb3J0cy50b0NhcnRlc2lhbiA9IGZ1bmN0aW9uKHJhZGl1cywgYW5nbGUpe1xuICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICB2YXIgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuICByZXR1cm4ge3g6IHJhZGl1cypjb3MsIHk6IHJhZGl1cypzaW4qLTF9O1xufTtcbi8qXG5leHBvcnRzLnBvbGFyVG9DYXJ0ZXNpYW4oY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdsZUluRGVncmVlcykge1xuICB2YXIgYW5nbGVJblJhZGlhbnMgPSAoYW5nbGVJbkRlZ3JlZXMtOTApICogTWF0aC5QSSAvIDE4MC4wO1xuXG4gIHJldHVybiB7XG4gICAgeDogY2VudGVyWCArIChyYWRpdXMgKiBNYXRoLmNvcyhhbmdsZUluUmFkaWFucykpLFxuICAgIHk6IGNlbnRlclkgKyAocmFkaXVzICogTWF0aC5zaW4oYW5nbGVJblJhZGlhbnMpKVxuICB9O1xufSAgKi9cblxuXG5cbmV4cG9ydHMucHJ1bmUgPSBmdW5jdGlvbihkYXRhLCBzY2FsZSkge1xuICByZXR1cm4gcGFyc2VGbG9hdChkYXRhLnRvRml4ZWQoc2NhbGUpKTtcbn07XG5cbmV4cG9ydHMuaW52ZXJ0ID0gZnVuY3Rpb24gKGluTnVtKSB7XG4gIHJldHVybiBleHBvcnRzLnNjYWxlKGluTnVtLCAxLCAwLCAwLCAxKTtcbn07XG5cbi8qKlxuICogQ29udmVydCBhIE1JRGkgbm90ZSBudW1iZXIgdG8gYSBmcmVxdWVuY3kgdmFsdWUgaW4gZXF1YWwgdGVtcGVyYW1lbnQuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG1pZGkgTUlESSBub3RlIHZhbHVlXG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgRnJlcXVlbmNlIHZhbHVlXG4gKiBAZXhhbXBsZVxuICogTmV4dXMubXRvZig2MCkgIC8vIHJldHVybnMgdGhlIGZyZXF1ZW5jeSBudW1iZXIgb2YgTWlkZGxlIENcbiAqL1xuZXhwb3J0cy5tdG9mID0gZnVuY3Rpb24obWlkaSkge1xuICByZXR1cm4gTWF0aC5wb3coMiwgKChtaWRpLTY5KS8xMikpICogNDQwO1xufTtcblxuLyoqXG4gKiBJbnRlcnBvbGF0ZSBiZXR3ZWVuIHR3byBudW1iZXJzXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGxvYyBJbnRlcnBvbGF0aW9uIGluZGV4ICgwLTEpXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG1pbiBMb3dlciB2YWx1ZVxuICogQHBhcmFtICB7bnVtYmVyfSBtYXggVXBwZXIgdmFsdWVcbiAqIEByZXR1cm4ge251bWJlcn0gICAgIEludGVycG9sYXRlZCB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIE5leHVzLmludGVycCgwLjUsMiw0KSAgIC8vIHJldHVybnMgM1xuICogTmV4dXMuaW50ZXJwKDAuMSwwLDEwKSAgICAgLy8gcmV0dXJucyAxXG4gKi9cbmV4cG9ydHMuaW50ZXJwID0gZnVuY3Rpb24obG9jLG1pbixtYXgpIHtcbiAgcmV0dXJuIGxvYyAqIChtYXggLSBtaW4pICsgbWluO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYSByYW5kb20gY2hvaWNlIGZyb20gYSBsaXN0IG9mIGFyZ3VtZW50c1xuICogQHJldHVybiB7dmFyaW91c30gT25lIHJhbmRvbSBhcmd1bWVudFxuICogQGV4YW1wbGVcbiAqIE5leHVzLnBpY2soMSwyLDMsNCkgICAvLyByZXR1cm5zIDEsIDIsIDMsIG9yIDRcbiAqIE5leHVzLnBpY2soZnVuY3Rpb24xLGZ1bmN0aW9uMikgICAvLyByZXR1cm5zIGVpdGhlciBmdW5jdGlvbjEgb3IgZnVuY3Rpb24yXG4gKi9cbmV4cG9ydHMucGljayA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gYXJndW1lbnRzW35+KE1hdGgucmFuZG9tKCkqYXJndW1lbnRzLmxlbmd0aCldO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9jdGF2ZSBtdWx0aXBsaWVyIGZvciBmcmVxdWVuY3kgdmFsdWVzXG4gKiBAcGFyYW0gIHtudW1iZXJ9IG51bSBSZWxhdGl2ZSBvY3RhdmUgbnVtYmVyIChlLmcuIC0xIGZvciBvbmUgb2N0YXZlIGRvd24sIDEgZm9yIG9uZSBvY3RhdmUgdXApXG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICBPY3RhdmUgbXVsdGlwbGllclxuICogQGV4YW1wbGVcbiAqIE5leHVzLm9jdGF2ZSgtMSkgIC8vIHJldHVybnMgMC41XG4gKiBOZXh1cy5vY3RhdmUoMCkgICAvLyByZXR1cm5zIDFcbiAqIE5leHVzLm9jdGF2ZSgxKSAgIC8vIHJldHVybnMgMlxuICogTmV4dXMub2N0YXZlKDIpICAgLy8gcmV0dXJucyA0XG4gKi9cbmV4cG9ydHMub2N0YXZlID0gZnVuY3Rpb24obnVtKSB7XG4gIHJldHVybiBNYXRoLnBvdygyLG51bSk7XG59O1xuXG4vKipcbiAqIFJhbmRvbSBpbnRlZ2VyIGdlbmVyYXRvci4gSWYgbm8gc2Vjb25kIGFyZ3VtZW50IGlzIGdpdmVuLCB3aWxsIHJldHVybiByYW5kb20gaW50ZWdlciBmcm9tIDAgdG8gYm91bmQxLlxuICogQHBhcmFtICB7bnVtYmVyfSBib3VuZDEgTWluaW11bSByYW5kb20gdmFsdWVcbiAqIEBwYXJhbSAge251bWJlcn0gYm91bmQyIE1heGltdW0gcmFuZG9tIHZhbHVlXG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICBSYW5kb20gaW50ZWdlciBiZXR3ZWVuIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICogQGV4YW1wbGVcbiAqIE5leHVzLnJpKDEwKSAgICAvLyByZXR1cm5zIHJhbmRvbSBpbnQgZnJvbSAwIHRvIDEwXG4gKiBOZXh1cy5yaSgyMCwyMDAwKSAvLyByZXR1cm5zIHJhbmRvbSBpbnQgZnJvbSAyMCB0byAyMDAwXG4gKi9cbmV4cG9ydHMucmkgPSBmdW5jdGlvbihib3VuZDEsYm91bmQyKSB7XG4gIGlmICghYm91bmQyKSB7XG4gICAgYm91bmQyID0gYm91bmQxO1xuICAgIGJvdW5kMSA9IDA7XG4gIH1cbiAgdmFyIGxvdyA9IE1hdGgubWluKGJvdW5kMSxib3VuZDIpO1xuICB2YXIgaGlnaCA9IE1hdGgubWF4KGJvdW5kMSxib3VuZDIpO1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihoaWdoLWxvdykrbG93KTtcbn07XG5cbi8qKlxuICogUmFuZG9tIGZsb2F0IG51bWJlciBnZW5lcmF0b3IuIElmIG5vIHNlY29uZCBhcmd1bWVudCBpcyBnaXZlbiwgd2lsbCByZXR1cm4gcmFuZG9tIGZsb2F0IGZyb20gMCB0byBib3VuZDEuXG4gKiBAcGFyYW0gIHtudW1iZXJ9IGJvdW5kMSBNaW5pbXVtIHJhbmRvbSB2YWx1ZVxuICogQHBhcmFtICB7bnVtYmVyfSBib3VuZDIgTWF4aW11bSByYW5kb20gdmFsdWVcbiAqIEByZXR1cm4ge251bWJlcn0gICAgICAgIFJhbmRvbSBmbG9hdCBiZXR3ZWVuIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICogQGV4YW1wbGVcbiAqIE5leHVzLnJmKDEpICAgIC8vIHJldHVybnMgcmFuZG9tIGZsb2F0IGZyb20gMCB0byAxXG4gKiBOZXh1cy5yZigxLDIpIC8vIHJldHVybnMgcmFuZG9tIGZsb2F0IGZyb20gMSB0byAyXG4gKi9cbmV4cG9ydHMucmYgPSBmdW5jdGlvbihib3VuZDEsYm91bmQyKSB7XG4gIGlmICghYm91bmQyKSB7XG4gICAgYm91bmQyID0gYm91bmQxO1xuICAgIGJvdW5kMSA9IDA7XG4gIH1cbiAgdmFyIGxvdyA9IE1hdGgubWluKGJvdW5kMSxib3VuZDIpO1xuICB2YXIgaGlnaCA9IE1hdGgubWF4KGJvdW5kMSxib3VuZDIpO1xuICByZXR1cm4gTWF0aC5yYW5kb20oKSooaGlnaC1sb3cpK2xvdztcbn07XG5cblxuZXhwb3J0cy5jeWNsZSA9IGZ1bmN0aW9uKGlucHV0LG1pbixtYXgpIHtcbiAgaW5wdXQrKztcbiAgaWYgKGlucHV0ID49IG1heCkge1xuICAgIGlucHV0ID0gbWluO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn07XG5cbi8qKlxuICogQXZlcmFnZSBhbiBhcnJheSBvZiBudW1iZXJzXG4gKiBAcGFyYW0gIHtBcnJheX0gZGF0YSBBcnJheSBvZiBudW1iZXJzIHRvIGF2ZXJhZ2VcbiAqIEByZXR1cm4ge251bWJlcn0gICAgICBBdmVyYWdlIG9mIHRoZSBpbnB1dCBkYXRhXG4gKiBAZXhhbXBsZVxuICogTmV4dXMuYXZlcmFnZShbMCwyLDQsNiw4LDEwXSkgICAvLyByZXR1cm5zIDVcbiAqL1xuZXhwb3J0cy5hdmVyYWdlID0gZnVuY3Rpb24oZGF0YSkge1xuICBsZXQgdG90YWwgPSAwO1xuICBmb3IgKHZhciBpPTA7aTxkYXRhLmxlbmd0aDtpKyspIHtcbiAgICB0b3RhbCArPSBkYXRhW2ldO1xuICB9XG4gIHJldHVybiB0b3RhbCAvIGRhdGEubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRpc3RhbmNlIGZyb20gb25lICh4LHkpIHBvaW50IHRvIGFub3RoZXIgKHgseSkgcG9pbnRcbiAqIEBwYXJhbSAge251bWJlcn0geDEgeCBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtICB7bnVtYmVyfSB5MSB5IG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0gIHtudW1iZXJ9IHgyIHggb2Ygc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkyIHkgb2Ygc2Vjb25kIHBvaW55XG4gKiBAcmV0dXJuIHtudW1iZXJ9ICAgIERpc3RhbmNlXG4gKiBAZXhhbXBsZVxuICogTmV4dXMuZGlzdGFuY2UoMCwwLDMsNCkgICAvLyByZXR1cm5zIDVcbiAqL1xuZXhwb3J0cy5kaXN0YW5jZSA9IGZ1bmN0aW9uKHgxLHkxLHgyLHkyKSB7XG4gIGxldCBhID0geDEgLSB4MjtcbiAgbGV0IGIgPSB5MSAtIHkyO1xuICByZXR1cm4gTWF0aC5zcXJ0KCBhKmEgKyBiKmIgKTtcbn07XG5cbmV4cG9ydHMuZ2FpblRvREIgPSBmdW5jdGlvbihnYWluKSB7XG4gIHJldHVybiAyMCAqIE1hdGgubG9nMTAoZ2Fpbik7XG59O1xuXG4vKipcbiAqIEZsaXAgYSBjb2luLCByZXR1cm5pbmcgZWl0aGVyIDAgb3IgMSBhY2NvcmRpbmcgdG8gYSBwcm9iYWJpbGl0eVxuICogQHBhcmFtICB7bnVtYmVyfSBbb2Rkcz0wLjVdIExpa2VsaWhvb2Qgb2YgcmV0dXJuaW5nIDFcbiAqIEByZXR1cm4ge251bWJlcn0gICAgICAgICAgICAxIG9yIDBcbiAqIEBleGFtcGxlXG4gKiBOZXh1cy5jb2luKDAuMSkgICAvLyByZXR1cm5zIDEgKDEwJSBvZiB0aGUgdGltZSkgb3IgMCAoOTAlIG9mIHRoZSB0aW1lKVxuICovXG5leHBvcnRzLmNvaW4gPSBmdW5jdGlvbihvZGRzPTAuNSkge1xuICBpZiAoZXhwb3J0cy5yZigwLDEpIDwgb2Rkcykge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL3V0aWwvbWF0aC5qcyIsIid1c2Ugc3RyaWN0JztcblxubGV0IHN2ZyA9IHJlcXVpcmUoJy4uL3V0aWwvc3ZnJyk7XG5sZXQgZG9tID0gcmVxdWlyZSgnLi4vdXRpbC9kb20nKTtcbmxldCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5sZXQgdG91Y2ggPSByZXF1aXJlKCcuLi91dGlsL3RvdWNoJyk7XG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKTtcblxuaW1wb3J0IHsgY29sb3JzIH0gZnJvbSAnLi4vbWFpbic7XG5cbi8qKlxuSW50ZXJmYWNlXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcblxuICBjb25zdHJ1Y3RvcihhcmdzLG9wdGlvbnMsZGVmYXVsdHMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudHlwZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5wYXJzZVNldHRpbmdzKGFyZ3Msb3B0aW9ucyxkZWZhdWx0cyk7XG4gICAgdGhpcy5tb3VzZSA9IHt9O1xuICAgIHRoaXMud2FpdCA9IGZhbHNlO1xuICAgIHRoaXMuY29sb3JzID0ge307XG4gICAgbGV0IGRlZmF1bHRDb2xvcnMgPSBjb2xvcnMoKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgdGhpcy5jb2xvcnMuYWNjZW50ID0gZGVmYXVsdENvbG9ycy5hY2NlbnQ7XG4gICAgdGhpcy5jb2xvcnMuZmlsbCA9IGRlZmF1bHRDb2xvcnMuZmlsbDtcbiAgICB0aGlzLmNvbG9ycy5saWdodCA9IGRlZmF1bHRDb2xvcnMubGlnaHQ7XG4gICAgdGhpcy5jb2xvcnMuZGFyayA9IGRlZmF1bHRDb2xvcnMuZGFyaztcbiAgICB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCA9IGRlZmF1bHRDb2xvcnMubWVkaXVtTGlnaHQ7XG4gICAgdGhpcy5jb2xvcnMubWVkaXVtRGFyayA9IGRlZmF1bHRDb2xvcnMubWVkaXVtRGFyaztcbiAgfVxuXG4gIHBhcnNlU2V0dGluZ3MoYXJncyxvcHRpb25zLGRlZmF1bHRzKSB7XG5cbiAgICBvcHRpb25zLnVuc2hpZnQoJ3RhcmdldCcpO1xuICAgIGRlZmF1bHRzLmRlZmF1bHRTaXplID0gZGVmYXVsdHMuc2l6ZS5zcGxpY2UoMCwyKTtcbiAgICBkZWZhdWx0cy5zaXplID0gZmFsc2U7XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7XG4gICAgICAndGFyZ2V0JzogZG9jdW1lbnQuYm9keSxcbiAgICAgICdjb2xvcnMnOiB7fSwgLy8gc2hvdWxkIGluaGVyaXQgZnJvbSBhIGNvbG9ycyBtb2R1bGUsXG4gICAgICAnc25hcFdpdGhQYXJlbnQnOiB0cnVlLFxuICAgICAgJ2V2ZW50JzogZnVuY3Rpb24oKSB7fSxcbiAgICAgICdjb21wb25lbnQnOiBmYWxzZVxuICAgIH07XG5cbiAgICBmb3IgKGxldCBrZXkgaW4gZGVmYXVsdHMpIHtcbiAgICAgIHNldHRpbmdzW2tleV0gPSBkZWZhdWx0c1trZXldO1xuICAgIH1cblxuICAgIGZvciAobGV0IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBncmFicyB0aGUgbmV4dCBhcmd1bWVudFxuICAgICAgbGV0IHNldHRpbmcgPSBhcmdzW2ldO1xuICAgICAgLy8gaWYgaXQncyBhbiBvYmplY3QsIGl0IG11c3QgYmUgdGhlIHNldHRpbmdzIG9iamVjdFxuICAgICAgaWYgKCB1dGlsLmlzT2JqZWN0KHNldHRpbmcpICkge1xuICAgICAgICBmb3IgKCBsZXQga2V5IGluIHNldHRpbmcgKSB7XG4gICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHNldHRpbmdba2V5XTtcbiAgICAgICAgfVxuICAgICAgLy8gaWYgaXQncyBhIGZ1bmN0aW9uLCBpdCBtdXN0IGJlIHRoZSBldmVudCBzZXR0aW5nXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZXR0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHNldHRpbmdzLmV2ZW50ID0gc2V0dGluZztcbiAgICAgIC8vIG90aGVyd2lzZSwgY29uc2lkZXIgaXQgb25lIG9mIHRoZSB3aWRnZXQncyBjdXN0b20gb3B0aW9uc1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmxlbmd0aD49MSkge1xuICAgICAgICAvLyBncmFiIHRoZSBmaXJzdCBvcHRpb24gLS0gaS5lLiAndGFyZ2V0J1xuICAgICAgICBsZXQga2V5ID0gb3B0aW9ucy5zcGxpY2UoMCwxKVswXTtcbiAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHNldHRpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyogIGhhbmRsZSBjb21tb24gc2V0dGluZ3MgICovXG5cbiAgICAvLyB0YXJnZXRcbiAgICB0aGlzLnBhcmVudCA9IGRvbS5wYXJzZUVsZW1lbnQoc2V0dGluZ3MudGFyZ2V0KTtcblxuICAgIC8vIG5leHVzLXVpIGF0dHJpYnV0ZVxuICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmICFzZXR0aW5ncy5jb21wb25lbnQpIHtcbiAgICAgIGlmICghdGhpcy5wYXJlbnQuaGFzQXR0cmlidXRlKCduZXh1cy11aScpKSB7XG4gICAgICAgIHRoaXMucGFyZW50LnNldEF0dHJpYnV0ZSgnbmV4dXMtdWknLCcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzaXplXG5cbiAgICBpZiAoc2V0dGluZ3Muc2l6ZSAmJiBBcnJheS5pc0FycmF5KHNldHRpbmdzLnNpemUpICYmIHNldHRpbmdzLnNuYXBXaXRoUGFyZW50KSB7XG4gICAgICB0aGlzLndpZHRoID0gc2V0dGluZ3Muc2l6ZVswXTtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gc2V0dGluZ3Muc2l6ZVsxXTtcbiAgICAgIHRoaXMucGFyZW50LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArICdweCc7XG4gICAgICB0aGlzLnBhcmVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCArICdweCc7XG4gICAgfSBlbHNlIGlmIChzZXR0aW5ncy5zbmFwV2l0aFBhcmVudCAmJiAhc2V0dGluZ3MuY29tcG9uZW50KSB7XG5cbiAgICAgIHRoaXMud2lkdGggPSBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucGFyZW50LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpLnJlcGxhY2UoJ3B4JywnJykpO1xuICAgICAgdGhpcy5oZWlnaHQgPSBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucGFyZW50LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKS5yZXBsYWNlKCdweCcsJycpKTtcblxuICAgICAgaWYgKHRoaXMud2lkdGg9PTUwMDApIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IHNldHRpbmdzLmRlZmF1bHRTaXplWzBdO1xuICAgICAgICB0aGlzLnBhcmVudC5zdHlsZS53aWR0aCA9IHRoaXMucGFyZW50LndpZHRoID0gdGhpcy53aWR0aCArICdweCc7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oZWlnaHQ9PTUwMDApIHtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBzZXR0aW5ncy5kZWZhdWx0U2l6ZVsxXTtcbiAgICAgICAgdGhpcy5wYXJlbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5wYXJlbnQuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyAncHgnO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldHRpbmdzLnNpemUgPSBzZXR0aW5ncy5kZWZhdWx0U2l6ZTtcbiAgICAgIHRoaXMud2lkdGggPSBzZXR0aW5ncy5zaXplWzBdO1xuICAgICAgdGhpcy5oZWlnaHQgPSBzZXR0aW5ncy5zaXplWzFdO1xuICAgIH1cblxuICAgIC8vIGV2ZW50XG4gICAgaWYgKHNldHRpbmdzLmV2ZW50KSB7XG4gICAgICB0aGlzLmV2ZW50ID0gdGhpcy5vbignY2hhbmdlJywgc2V0dGluZ3MuZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV2ZW50ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuXG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuYnVpbGRGcmFtZSgpO1xuICAgIHRoaXMuYnVpbGRJbnRlcmZhY2UoKTtcbiAgICB0aGlzLnNpemVJbnRlcmZhY2UoKTtcbiAgICB0aGlzLmF0dGFjaExpc3RlbmVycygpO1xuICAgIHRoaXMuY29sb3JJbnRlcmZhY2UoKTtcbiAgICB0aGlzLmZpbmFsVG91Y2hlcygpO1xuICB9XG5cbiAgYnVpbGRGcmFtZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQgPSBzdmcuY3JlYXRlKCdzdmcnKTtcbiAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsdGhpcy53aWR0aCk7XG4gICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jyx0aGlzLmhlaWdodCk7XG4gICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge31cbiAgc2l6ZUludGVyZmFjZSgpIHt9XG4gIGNvbG9ySW50ZXJmYWNlKCkge31cblxuICBhdHRhY2hMaXN0ZW5lcnMoKSB7XG5cbiAgICB0aGlzLmludGVyYWN0aW9uVGFyZ2V0ID0gdGhpcy5pbnRlcmFjdGlvblRhcmdldCB8fCB0aGlzLmVsZW1lbnQ7XG5cbiAgICAvLyBTZXR1cCBpbnRlcmFjdGlvblxuICAgIGlmICh0b3VjaC5leGlzdHMpIHtcbiAgICAgIHRoaXMuaW50ZXJhY3Rpb25UYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGV2dCA9PiB0aGlzLnByZVRvdWNoKGV2dCkpO1xuICAgICAgdGhpcy5pbnRlcmFjdGlvblRhcmdldC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBldnQgPT4gdGhpcy5wcmVUb3VjaE1vdmUoZXZ0KSk7XG4gICAgICB0aGlzLmludGVyYWN0aW9uVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgZXZ0ID0+IHRoaXMucHJlVG91Y2hSZWxlYXNlKGV2dCkpO1xuICAgIH1cbiAgICB0aGlzLmJvdW5kUHJlTW92ZSA9IGV2dCA9PiB0aGlzLnByZU1vdmUoZXZ0KTtcbiAgICB0aGlzLmJvdW5kUHJlUmVsZWFzZSA9IGV2dCA9PiB0aGlzLnByZVJlbGVhc2UoZXZ0KTtcbiAgICB0aGlzLmludGVyYWN0aW9uVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2dCA9PiB0aGlzLnByZUNsaWNrKGV2dCkpO1xuICB9XG5cbiAgZmluYWxUb3VjaGVzKCkge1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gIH1cblxuICBwcmVDbGljayhlKSB7XG4gICAgLy8gMTAwMDAgZ2V0Q29tcHV0ZWRTdHlsZSBjYWxscyB0YWtlcyAxMDAgbXMuXG4gICAgLy8gLjouIG9uZSB0YWtlcyBhYm91dCAuMDFtc1xuICAgIGlmICh0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgdGhpcy53aWR0aCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKS5yZXBsYWNlKCdweCcsJycpO1xuICAgIH1cbiAgICAvLyAxMDAwMCBnZXRDb21wdXRlZFN0eWxlIGNhbGxzIHRha2VzIDQwIG1zLlxuICAgIC8vIC46LiBvbmUgdGFrZXMgYWJvdXQgLjAwNG1zXG4gICAgdGhpcy5vZmZzZXQgPSBkb20uZmluZFBvc2l0aW9uKHRoaXMuZWxlbWVudCk7XG4gICAgdGhpcy5tb3VzZSA9IGRvbS5sb2NhdGVNb3VzZShlLHRoaXMub2Zmc2V0KTtcbiAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xuICAgIHRoaXMuY2xpY2soKTtcbiAgICB0aGlzLm1vdmVFdmVudCA9IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuYm91bmRQcmVNb3ZlKTtcbiAgICB0aGlzLnJlbGVhc2VFdmVudCA9IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmJvdW5kUHJlUmVsZWFzZSk7XG4gICAgdGhpcy5lbWl0KCdjbGljaycpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJlTW92ZShlKSB7XG4gICAgaWYgKCF0aGlzLndhaXQpIHtcbiAgICAgIHRoaXMubW91c2UgPSBkb20ubG9jYXRlTW91c2UoZSx0aGlzLm9mZnNldCk7XG4gICAgICB0aGlzLm1vdmUoKTtcbiAgICAgIHRoaXMud2FpdCA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy53YWl0ID0gZmFsc2U7IH0sMjUpO1xuICAgIH1cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByZVJlbGVhc2UoZSkge1xuICAgIHRoaXMubW91c2UgPSBkb20ubG9jYXRlTW91c2UoZSx0aGlzLm9mZnNldCk7XG4gICAgdGhpcy5jbGlja2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZWxlYXNlKCk7XG4gICAgdGhpcy5lbWl0KCdyZWxlYXNlJyk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLmJvdW5kUHJlTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdGhpcy5ib3VuZFByZVJlbGVhc2UpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgY2xpY2soKSB7XG5cbiAgfVxuXG4gIG1vdmUoKSB7XG5cbiAgfVxuXG4gIHJlbGVhc2UoKSB7XG5cbiAgfVxuXG5cbiAgLyogdG91Y2ggKi9cblxuICBwcmVUb3VjaChlKSB7XG4gICAgaWYgKHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICB0aGlzLndpZHRoID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpLnJlcGxhY2UoJ3B4JywnJyk7XG4gICAgfVxuICAgIHRoaXMub2Zmc2V0ID0gZG9tLmZpbmRQb3NpdGlvbih0aGlzLmVsZW1lbnQpO1xuICAgIHRoaXMubW91c2UgPSBkb20ubG9jYXRlVG91Y2goZSx0aGlzLm9mZnNldCk7XG4gICAgdGhpcy5jbGlja2VkID0gdHJ1ZTtcbiAgICB0aGlzLnRvdWNoKGUpO1xuICAgIHRoaXMuZW1pdCgnY2xpY2snKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHByZVRvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRoaXMuY2xpY2tlZCkge1xuICAgICAgdGhpcy5tb3VzZSA9IGRvbS5sb2NhdGVUb3VjaChlLHRoaXMub2Zmc2V0KTtcbiAgICAgIHRoaXMudG91Y2hNb3ZlKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByZVRvdWNoUmVsZWFzZShlKSB7XG4gICAgdGhpcy5tb3VzZSA9IGRvbS5sb2NhdGVUb3VjaChlLCB0aGlzLm9mZnNldCk7XG4gICAgdGhpcy5jbGlja2VkID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFJlbGVhc2UoKTtcbiAgICB0aGlzLmVtaXQoJ3JlbGVhc2UnKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHRvdWNoKCkge1xuICAgIHRoaXMuY2xpY2soKTtcbiAgfVxuXG4gIHRvdWNoTW92ZSgpIHtcbiAgICB0aGlzLm1vdmUoKTtcbiAgfVxuXG4gIHRvdWNoUmVsZWFzZSgpIHtcbiAgICB0aGlzLnJlbGVhc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAqIFJlc2l6ZSB0aGUgaW50ZXJmYWNlXG4gICogQHBhcmFtIHdpZHRoIHtudW1iZXJ9IE5ldyB3aWR0aCBpbiBwaXhlbHNcbiAgKiBAcGFyYW0gaGVpZ2h0IHtudW1iZXJ9IE5ldyBoZWlnaHQgaW4gcGl4ZWxzXG4gICpcbiAgKiBAZXhhbXBsZVxuICAqIGJ1dHRvbi5yZXNpemUoMTAwLDEwMCk7XG4gICovXG4gIHJlc2l6ZSh3aWR0aCxoZWlnaHQpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5wYXJlbnQuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoKydweCc7XG4gICAgdGhpcy5wYXJlbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQrJ3B4JztcbiAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsdGhpcy53aWR0aCk7XG4gICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jyx0aGlzLmhlaWdodCk7XG4gICAgdGhpcy5zaXplSW50ZXJmYWNlKCk7XG4gIH1cblxuICBlbXB0eSgpIHtcbiAgICB3aGlsZSAodGhpcy5lbGVtZW50Lmxhc3RDaGlsZCkge1xuICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudC5sYXN0Q2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIFJlbW92ZSB0aGUgaW50ZXJmYWNlIGZyb20gdGhlIHBhZ2UgYW5kIGNhbmNlbCBpdHMgZXZlbnQgbGlzdGVuZXIocykuXG4gICpcbiAgKiBAZXhhbXBsZVxuICAqIGJ1dHRvbi5kZXN0cm95KCk7XG4gICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5lbXB0eSgpO1xuICAgIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBpZiAodGhpcy5pbnN0cnVtZW50KSB7XG4gICAgICBkZWxldGUgdGhpcy5pbnN0cnVtZW50W3RoaXMuaWRdO1xuICAgIH1cbiAgICB0aGlzLmN1c3RvbURlc3Ryb3koKTtcbiAgfVxuXG4gIGN1c3RvbURlc3Ryb3koKSB7XG5cbiAgfVxuXG4gIGNvbG9yaXplKHR5cGUsY29sb3IpIHtcbiAgICB0aGlzLmNvbG9yc1t0eXBlXSA9IGNvbG9yO1xuICAgIHRoaXMuY29sb3JJbnRlcmZhY2UoKTtcbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvY29yZS9pbnRlcmZhY2UuanMiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuZmluZFBvc2l0aW9uID0gKGVsKSA9PiB7XG4gIGxldCB2aWV3cG9ydE9mZnNldCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBsZXQgdG9wID0gdmlld3BvcnRPZmZzZXQudG9wICsgd2luZG93LnNjcm9sbFk7XG4gIGxldCBsZWZ0ID0gdmlld3BvcnRPZmZzZXQubGVmdCArIHdpbmRvdy5zY3JvbGxYO1xuICByZXR1cm4ge3RvcCxsZWZ0fTtcbn07XG5cbmV4cG9ydHMucGFyc2VFbGVtZW50ID0gKHBhcmVudCkgPT4ge1xuICBpZiAodHlwZW9mIHBhcmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXJlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnQucmVwbGFjZSgnIycsJycpKTtcbiAgfVxuXG4gIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBwYXJlbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KXtcbiAgICByZXR1cm4gcGFyZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnTm8gdmFsaWQgcGFyZW50IGFyZ3VtZW50JztcbiAgfVxufTtcblxuZXhwb3J0cy5sb2NhdGVNb3VzZSA9IChlLG9mZnNldCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHg6IGUucGFnZVggLSBvZmZzZXQubGVmdCxcbiAgICB5OiBlLnBhZ2VZIC0gb2Zmc2V0LnRvcFxuICB9O1xufTtcblxuZXhwb3J0cy5sb2NhdGVUb3VjaCA9IChlLG9mZnNldCkgPT4ge1xuICByZXR1cm4ge1xuICAgIHg6IGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggPyBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVggLSBvZmZzZXQubGVmdCA6IGZhbHNlLFxuICAgIHk6IGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggPyBlLnRhcmdldFRvdWNoZXNbMF0ucGFnZVkgLSBvZmZzZXQudG9wIDogZmFsc2VcbiAgfTtcbn07XG5cbmV4cG9ydHMuU21hcnRDYW52YXMgPSBmdW5jdGlvbihwYXJlbnQpIHtcblxuICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgdGhpcy5jb250ZXh0ID0gdGhpcy5lbGVtZW50LmdldENvbnRleHQoJzJkJyk7XG4gIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXG4gIHRoaXMucmVzaXplID0gKHcsaCkgPT4ge1xuICAgIHRoaXMuZWxlbWVudC53aWR0aCA9IHcqMjtcbiAgICB0aGlzLmVsZW1lbnQuaGVpZ2h0ID0gaCoyO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9IHcrJ3B4JztcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gaCsncHgnO1xuICB9O1xuXG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL3V0aWwvZG9tLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmlzT2JqZWN0ID0gKG9iaikgPT4ge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqKSAmJiBvYmogIT09IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgU1ZHRWxlbWVudCA9PT0gZmFsc2UgJiYgb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPT09IGZhbHNlICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi91dGlsL3V0aWwuanMiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuZXhpc3RzID0gKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvdXRpbC90b3VjaC5qcyIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9ldmVudHMvZXZlbnRzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbmxldCBtYXRoID0gcmVxdWlyZSgnLi4vdXRpbC9tYXRoJyk7XG5cbi8qKlxuICBDcmVhdGVzIGEgc3RlcHBhYmxlIHZhbHVlIHdpdGggbWluaW11bSwgbWF4aW11bSwgYW5kIHN0ZXAgc2l6ZS4gVGhpcyBpcyB1c2VkIGluIG1hbnkgaW50ZXJmYWNlcyB0byBjb25zdHJpY3QgdGhlaXIgdmFsdWVzIHRvIGNlcnRhaW4gcmFuZ2VzLlxuICBAcGFyYW0ge251bWJlcn0gW21pbj0wXSBtaW5pbXVtXG4gIEBwYXJhbSB7bnVtYmVyfSBbbWF4PTFdIG1heGltdW1cbiAgQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTBdXG4gIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWU9MF0gaW5pdGlhbCB2YWx1ZVxuICBAcmV0dXJucyB7T2JqZWN0fSBTdGVwXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGVwIHtcblxuICBjb25zdHJ1Y3RvcihtaW4gPSAwLG1heCA9IDEsc3RlcCA9IDAsdmFsdWUgPSAwKSB7XG4gICAgLy9PYmplY3QuYXNzaWduKHRoaXMse21pbixtYXgsc3RlcH0pO1xuICAgIC8vQ2Fubm90IHVzZSBPYmplY3QuYXNzaWduIGJlY2F1c2Ugbm90IHN1cHBvcnRlZCBpbiBTYWZhcmkuXG4gICAgLy9JIHdvdWxkIGV4cGVjdCBmb3IgQmFiZWwgdG8gdGFrZSBjYXJlIG9mIHRoaXMgYnV0IGl0IGlzIG5vdC5cbiAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICB0aGlzLm1heCA9IG1heDtcbiAgICB0aGlzLnN0ZXAgPSBzdGVwO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9sZFZhbHVlID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGUodGhpcy52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICBVcGRhdGUgd2l0aCBhIG5ldyB2YWx1ZS4gVGhlIHZhbHVlIHdpbGwgYmUgYXV0by1hZGp1c3RlZCB0byBmaXQgdGhlIG1pbi9tYXgvc3RlcC5cbiAgICBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgKi9cblxuICB1cGRhdGUodmFsdWUpIHtcbiAgICBpZiAodGhpcy5zdGVwKSB7XG4gICAgICAvLyB0aGlzLnZhbHVlID0gbWF0aC5jbGlwKE1hdGgucm91bmQodmFsdWUgLyAodGhpcy5zdGVwKSkgKiB0aGlzLnN0ZXAsIHRoaXMubWluLHRoaXMubWF4KTtcbiAgICAgIHRoaXMudmFsdWUgPSBtYXRoLmNsaXAoTWF0aC5yb3VuZCgodmFsdWUtdGhpcy5taW4pIC8gKHRoaXMuc3RlcCkpICogdGhpcy5zdGVwICsgdGhpcy5taW4sIHRoaXMubWluLHRoaXMubWF4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IG1hdGguY2xpcCh2YWx1ZSx0aGlzLm1pbix0aGlzLm1heCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9sZFZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLm9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgIFVwZGF0ZSB3aXRoIGEgbm9ybWFsaXplZCB2YWx1ZSAwLTEuXG4gICAgQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICovXG4gIHVwZGF0ZU5vcm1hbCh2YWx1ZSkge1xuICAgIHRoaXMudmFsdWUgPSBtYXRoLnNjYWxlKHZhbHVlLDAsMSx0aGlzLm1pbix0aGlzLm1heCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAgR2V0IGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMudmFsdWUgLiBOb3Qgc2V0dGFibGUuXG4gICovXG4gIGdldCBub3JtYWxpemVkKCkge1xuICAgIHJldHVybiBtYXRoLm5vcm1hbGl6ZSh0aGlzLnZhbHVlLHRoaXMubWluLHRoaXMubWF4KTtcbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvbW9kZWxzL3N0ZXAuanMiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBtYXRoIGZyb20gJy4uL3V0aWwvbWF0aCc7XG5pbXBvcnQgVG9nZ2xlTW9kZWwgZnJvbSAnLi4vbW9kZWxzL3RvZ2dsZSc7XG5cblxuLypcbmhvdyB0byB1c2UgOlxuXG5kaWFsLmludGVyYWN0aW9uID0gbmV3IEhhbmRsZSgncmFkaWFsJywncmVsYXRpdmUnLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO1xuLy8gZGlhbC5pbnRlcmFjdGlvbi5tb2RlID0gJ3JlbGF0aXZlJ1xuLy8gZGlhbC5pbnRlcmFjdGlvbi5kaXJlY3Rpb24gPSAncmFkaWFsJ1xuXG5vbiBjbGljazpcbmRpYWwuaW50ZXJhY3Rpb24uYW5jaG9yID0gdGhpcy5tb3VzZTtcblxub24gbW92ZTpcbmRpYWwuaW50ZXJhY3Rpb24udXBkYXRlKHRoaXMubW91c2UpO1xuXG5jb25zb2xlLmxvZyggZGlhbC5pbnRlcmFjdGlvbi52YWx1ZSApOyBzaG91bGQgYmUgYSBub3JtYWxpemVkIHZhbHVlLlxuXG4qL1xuXG4vKlxuICBhYnNvbHV0ZS9yZWxhdGl2ZSBhcmUgcHJvcGVydHk6IG1vZGVcbiAgcmFkaWFsL3ZlcnRpY2FsL2hvcml6b250YWwvMmQgYXJlIHByb3BlcnR5OiBkaXJlY3Rpb25cblxuICBwbGFuIDpcblxuICBpZiByZWxhdGl2ZSAtLVxuICBOTyBvbiBjbGljaywgZ2V0IHZhbHVlIG9mZnNldCBiZXR3ZWVuIGN1cnJlbnQgdmFsdWUgYW5kIGNsaWNrIHZhbHVlLlxuICBOTyBvbiBtb3ZlLCB1c2UgY2xpY2sgdmFsdWUgLSBvZmZzZXRcbiAgSU5TVEVBRFxuICB1c2UgZGVsdGEgLS0gYmMgdmVydGljYWwgbW90aW9uIG9uIGRpYWwgaXMgaW1wb3NzaWJsZSBvdGhlcndpc2VcbiAgYWxzbyBhbGxvdyB0byBzZXQgc2Vuc2l0aXZpdHlcblxuKi9cblxuZXhwb3J0IGNsYXNzIEhhbmRsZSB7XG5cbiAgY29uc3RydWN0b3IobW9kZT0nYWJzb2x1dGUnLGRpcmVjdGlvbj0ndmVydGljYWwnLHhib3VuZD1bMCwxMDBdLHlib3VuZD1bMCwxMDBdKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICB0aGlzLnByZXZpb3VzID0gMDtcbiAgICB0aGlzLnZhbHVlID0gMDtcbiAgICB0aGlzLnNlbnNpdGl2aXR5ID0gMTtcbiAgICB0aGlzLnJlc2l6ZSh4Ym91bmQseWJvdW5kKTtcbiAgfVxuXG4gIHJlc2l6ZSh4Ym91bmQseWJvdW5kKSB7XG4gICAgdGhpcy5ib3VuZGFyeSA9IHtcbiAgICAgIG1pbjoge1xuICAgICAgICB4OiB4Ym91bmRbMF0sXG4gICAgICAgIHk6IHlib3VuZFswXVxuICAgICAgfSxcbiAgICAgIG1heDoge1xuICAgICAgICB4OiB4Ym91bmRbMV0sXG4gICAgICAgIHk6IHlib3VuZFsxXVxuICAgICAgfSxcbiAgICAgIGNlbnRlcjoge1xuICAgICAgICB4OiAoeGJvdW5kWzFdIC0geGJvdW5kWzBdKS8yICsgeGJvdW5kWzBdLFxuICAgICAgICB5OiAoeWJvdW5kWzFdIC0geWJvdW5kWzBdKS8yICsgeWJvdW5kWzBdXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCBhbmNob3IobW91c2UpIHtcbiAgICB0aGlzLl9hbmNob3IgPSB0aGlzLmNvbnZlcnRQb3NpdGlvblRvVmFsdWUobW91c2UpO1xuICB9XG5cbiAgZ2V0IGFuY2hvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yO1xuICB9XG5cblxuICB1cGRhdGUobW91c2UpIHtcbiAgICBpZiAodGhpcy5tb2RlPT09J3JlbGF0aXZlJykge1xuICAgICAgbGV0IGluY3JlbWVudCA9IHRoaXMuY29udmVydFBvc2l0aW9uVG9WYWx1ZShtb3VzZSkgLSB0aGlzLmFuY2hvcjtcbiAgICAgIGlmIChNYXRoLmFicyhpbmNyZW1lbnQpID4gMC41KSB7IGluY3JlbWVudCA9IDA7IH1cbiAgICAgIHRoaXMuYW5jaG9yID0gbW91c2U7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZSArIGluY3JlbWVudCAqIHRoaXMuc2Vuc2l0aXZpdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnZlcnRQb3NpdGlvblRvVmFsdWUobW91c2UpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gbWF0aC5jbGlwKHRoaXMudmFsdWUsMCwxKTtcbiAgfVxuXG4gIGNvbnZlcnRQb3NpdGlvblRvVmFsdWUoY3VycmVudCkge1xuICAgIHN3aXRjaCh0aGlzLmRpcmVjdGlvbikge1xuICAgICAgY2FzZSAncmFkaWFsJzpcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gbWF0aC50b1BvbGFyKGN1cnJlbnQueCAtIHRoaXMuYm91bmRhcnkuY2VudGVyLngsIGN1cnJlbnQueSAtIHRoaXMuYm91bmRhcnkuY2VudGVyLnkpO1xuICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLmFuZ2xlIC8gKE1hdGguUEkqMik7XG4gICAgICAgIHBvc2l0aW9uID0gKChwb3NpdGlvbiAtIDAuMjUpICsgMSkgJSAxO1xuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIHJldHVybiBtYXRoLnNjYWxlKGN1cnJlbnQueSx0aGlzLmJvdW5kYXJ5Lm1pbi55LHRoaXMuYm91bmRhcnkubWF4LnksMCwxKTtcbiAgICAgIGNhc2UgJ2hvcml6b250YWwnOlxuICAgICAgICByZXR1cm4gbWF0aC5zY2FsZShjdXJyZW50LngsdGhpcy5ib3VuZGFyeS5taW4ueCx0aGlzLmJvdW5kYXJ5Lm1heC54LDAsMSk7XG4gICAgfVxuICB9XG5cbn1cblxuXG5leHBvcnQgY2xhc3MgQnV0dG9uIHtcblxuICBjb25zdHJ1Y3Rvcihtb2RlPSdidXR0b24nKSB7XG4gICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICB0aGlzLnN0YXRlID0gbmV3IFRvZ2dsZU1vZGVsKCk7XG4gICAgdGhpcy5wYWludGJydXNoID0gZmFsc2U7XG4gIH1cblxuICBjbGljaygpIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSAnaW1wdWxzZSc6XG4gICAgICAgIHRoaXMuc3RhdGUub24oKTtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5zdGF0ZS5vZmYuYmluZCh0aGlzKSwzMCk7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnN0YXRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICB0aGlzLnR1cm5PbigpO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5zdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWZ0ZXJ0b3VjaCc6XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogbWF0aC5jbGlwKHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgsMCwxKSxcbiAgICAgICAgICB5OiBtYXRoLmNsaXAoMSAtIHRoaXMubW91c2UueSAvIHRoaXMuaGVpZ2h0LDAsMSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy50dXJuT24oKTtcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICB4OiB0aGlzLnBvc2l0aW9uLngsXG4gICAgICAgICAgeTogdGhpcy5wb3NpdGlvbi55LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICB0aGlzLmZsaXAoKTtcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMuc3RhdGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgfVxuXG4gIG1vdmUoKSB7XG4gICAgaWYgKHRoaXMubW9kZT09PSdhZnRlcnRvdWNoJykge1xuICAgICAgdGhpcy5wb3NpdGlvbiA9IHtcbiAgICAgICAgeDogbWF0aC5jbGlwKHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgsMCwxKSxcbiAgICAgICAgeTogbWF0aC5jbGlwKDEgLSB0aGlzLm1vdXNlLnkgLyB0aGlzLmhlaWdodCwwLDEpXG4gICAgICB9O1xuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgIHg6IHRoaXMucG9zaXRpb24ueCxcbiAgICAgICAgeTogdGhpcy5wb3NpdGlvbi55LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHJlbGVhc2UoKSB7XG4gICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHRoaXMudHVybk9mZigpO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5zdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWZ0ZXJ0b3VjaCc6XG4gICAgICAgIHRoaXMudHVybk9mZigpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0ge1xuICAgICAgICAgIHg6IHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgsXG4gICAgICAgICAgeTogMSAtIHRoaXMubW91c2UueSAvIHRoaXMuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx7XG4gICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgeDogdGhpcy5wb3NpdGlvbi54LFxuICAgICAgICAgIHk6IHRoaXMucG9zaXRpb24ueSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL3V0aWwvaW50ZXJhY3Rpb24uanMiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvZ2dsZSB7XG5cbiAgY29uc3RydWN0b3Ioc3RhdGUpIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgZmFsc2U7XG4gIH1cblxuICBmbGlwKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlIHx8IHN0YXRlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gIXRoaXMuc3RhdGU7XG4gICAgfVxuICB9XG5cbiAgb24oKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHRydWU7XG4gIH1cblxuICBvZmYoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IGZhbHNlO1xuICB9XG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9tb2RlbHMvdG9nZ2xlLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgc3ZnID0gcmVxdWlyZSgnLi4vdXRpbC9zdmcnKTtcbmxldCBJbnRlcmZhY2UgPSByZXF1aXJlKCcuLi9jb3JlL2ludGVyZmFjZScpO1xubGV0IFN0ZXAgPSByZXF1aXJlKCcuLi9tb2RlbHMvc3RlcCcpO1xuaW1wb3J0ICogYXMgSW50ZXJhY3Rpb24gZnJvbSAnLi4vdXRpbC9pbnRlcmFjdGlvbic7XG5cbi8qKlxuKiBTbGlkZXJcbipcbiogQGRlc2NyaXB0aW9uIEhvcml6b250YWwgb3IgdmVydGljYWwgc2xpZGVyIHdpdGggc2V0dGFibGUgaW50ZXJhY3Rpb24gbW9kZXMuXG4qXG4qIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwic2xpZGVyXCIgc3RlcD0wLjI+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgc2xpZGVyID0gbmV3IE5leHVzLlNsaWRlcignI3RhcmdldCcpXG4qXG4qIEBleGFtcGxlXG4qIHZhciBzbGlkZXIgPSBuZXcgTmV4dXMuU2xpZGVyKCcjdGFyZ2V0Jyx7XG4qICAgICAnc2l6ZSc6IFsxMjAsMjBdLFxuKiAgICAgJ21vZGUnOiAncmVsYXRpdmUnLCAgLy8gJ3JlbGF0aXZlJyBvciAnYWJzb2x1dGUnXG4qICAgICAnbWluJzogMCxcbiogICAgICdtYXgnOiAxLFxuKiAgICAgJ3N0ZXAnOiAwLFxuKiAgICAgJ3ZhbHVlJzogMFxuKiB9KVxuKlxuKiBAb3V0cHV0XG4qIGNoYW5nZVxuKiBGaXJlcyB3aGVuIHRoZSBpbnRlcmZhY2UncyB2YWx1ZSBjaGFuZ2VzLiA8YnI+XG4qIEV2ZW50IGRhdGE6IDxpPm51bWJlcjwvaT4gVGhlIG51bWJlciB2YWx1ZSBvZiB0aGUgaW50ZXJmYWNlLlxuKlxuKiBAb3V0cHV0ZXhhbXBsZVxuKiBzbGlkZXIub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuKiAgIGNvbnNvbGUubG9nKHYpO1xuKiB9KVxuKlxuKlxuKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2xpZGVyIGV4dGVuZHMgSW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIGxldCBvcHRpb25zID0gWydtaW4nLCdtYXgnLCd2YWx1ZSddO1xuXG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgJ3NpemUnOiBbMTIwLDIwXSxcbiAgICAgICdtb2RlJzogJ3JlbGF0aXZlJywgIC8vICdyZWxhdGl2ZScgb3IgJ2Fic29sdXRlJ1xuICAgICAgJ21pbic6IDAsXG4gICAgICAnbWF4JzogMSxcbiAgICAgICdzdGVwJzogMCxcbiAgICAgICd2YWx1ZSc6IDBcbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG4gICAgdGhpcy5vcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCc7IC8vIFRoaXMgd2lsbCBjaGFuZ2UgYXV0b21hdGljYWxseSB0byAnaG9yaXpvbnRhbCdpZiB0aGUgaW50ZXJmYWNlIGlzIHdpZGVyIHRoYW4gaXQgaXMgdGFsbC5cblxuICAgIHRoaXMuX3ZhbHVlID0gbmV3IFN0ZXAodGhpcy5zZXR0aW5ncy5taW4sIHRoaXMuc2V0dGluZ3MubWF4LCB0aGlzLnNldHRpbmdzLnN0ZXAsIHRoaXMuc2V0dGluZ3MudmFsdWUpO1xuXG4gICAgdGhpcy5wb3NpdGlvbiA9IG5ldyBJbnRlcmFjdGlvbi5IYW5kbGUodGhpcy5zZXR0aW5ncy5tb2RlLHRoaXMub3JpZW50YXRpb24sWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKTtcbiAgICB0aGlzLnBvc2l0aW9uLnZhbHVlID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG4gICAgdGhpcy5wb3NpdGlvbi5kaXJlY3Rpb24gPSB0aGlzLm9yaWVudGF0aW9uO1xuXG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMudmFsdWUpO1xuXG4gIH1cblxuICBidWlsZEludGVyZmFjZSgpIHtcblxuICAgIHRoaXMuYmFyID0gc3ZnLmNyZWF0ZSgncmVjdCcpO1xuICAgIHRoaXMuZmlsbGJhciA9IHN2Zy5jcmVhdGUoJ3JlY3QnKTtcbiAgICB0aGlzLmtub2IgPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcblxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmJhcik7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZmlsbGJhcik7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMua25vYik7XG5cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICBpZiAodGhpcy53aWR0aCA8IHRoaXMuaGVpZ2h0KSB7XG4gICAgICB0aGlzLm9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgdGhpcy5wb3NpdGlvbi5yZXNpemUoWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKTtcbiAgICB9XG5cbiAgICBsZXQgeCwgeSwgdywgaCwgYmFyT2Zmc2V0LCBjb3JuZXJSYWRpdXM7XG4gICAgdGhpcy5rbm9iRGF0YSA9IHtcbiAgICAgIGxldmVsOiAwLFxuICAgICAgcjogMFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgdGhpcy50aGlja25lc3MgPSB0aGlzLndpZHRoIC8gMjtcbiAgICBcdHggPSB0aGlzLndpZHRoLzI7XG4gICAgXHR5ID0gMDtcbiAgICBcdHcgPSB0aGlzLnRoaWNrbmVzcztcbiAgICBcdGggPSB0aGlzLmhlaWdodDtcbiAgICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzICogMC44O1xuICAgIFx0dGhpcy5rbm9iRGF0YS5sZXZlbCA9IGgtdGhpcy5rbm9iRGF0YS5yLXRoaXMubm9ybWFsaXplZCooaC10aGlzLmtub2JEYXRhLnIqMik7XG4gICAgICBiYXJPZmZzZXQgPSAndHJhbnNsYXRlKCcrdGhpcy50aGlja25lc3MqKC0xKS8yKycsMCknO1xuICAgICAgY29ybmVyUmFkaXVzID0gdy8yO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRoaWNrbmVzcyA9IHRoaXMuaGVpZ2h0IC8gMjtcbiAgICBcdHggPSAwO1xuICAgIFx0eSA9IHRoaXMuaGVpZ2h0LzI7XG4gICAgXHR3ID0gdGhpcy53aWR0aDtcbiAgICBcdGggPSB0aGlzLnRoaWNrbmVzcztcbiAgICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzICogMC44O1xuICAgIFx0dGhpcy5rbm9iRGF0YS5sZXZlbCA9IHRoaXMubm9ybWFsaXplZCoody10aGlzLmtub2JEYXRhLnIqMikrdGhpcy5rbm9iRGF0YS5yO1xuICAgICAgYmFyT2Zmc2V0ID0gJ3RyYW5zbGF0ZSgwLCcrdGhpcy50aGlja25lc3MqKC0xKS8yKycpJztcbiAgICAgIGNvcm5lclJhZGl1cyA9IGgvMjtcbiAgICB9XG5cbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3gnLHgpO1xuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgneScseSk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLGJhck9mZnNldCk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCdyeCcsY29ybmVyUmFkaXVzKTsgLy8gY29ybmVyIHJhZGl1c1xuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgncnknLGNvcm5lclJhZGl1cyk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsdyk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLGgpO1xuXG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ3gnLHgpO1xuICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgneScsdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG4gICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsdyk7XG4gICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLGgtdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ3gnLDApO1xuICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgneScseSk7XG4gICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG4gICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLGgpO1xuICAgIH1cbiAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLGJhck9mZnNldCk7XG4gICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgncngnLGNvcm5lclJhZGl1cyk7XG4gICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgncnknLGNvcm5lclJhZGl1cyk7XG5cbiAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3gnLHgpO1xuICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3knLHRoaXMua25vYkRhdGEubGV2ZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeCcsdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeScseSk7XG4gICAgfVxuICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ3InLHRoaXMua25vYkRhdGEucik7XG5cbiAgfVxuXG4gIGNvbG9ySW50ZXJmYWNlKCkge1xuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmZpbGwpO1xuICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICB9XG5cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLmNsaWNrZWQpIHtcbiAgICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzKjAuNzU7XG4gICAgfVxuICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ3InLHRoaXMua25vYkRhdGEucik7XG5cbiAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICBcdCAgIHRoaXMua25vYkRhdGEubGV2ZWwgPSB0aGlzLmtub2JEYXRhLnIrdGhpcy5fdmFsdWUubm9ybWFsaXplZCoodGhpcy5oZWlnaHQtdGhpcy5rbm9iRGF0YS5yKjIpO1xuICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N5Jyx0aGlzLmhlaWdodCAtIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ3knLHRoaXMuaGVpZ2h0IC0gdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG4gICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jyx0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICB9IGVsc2Uge1xuICBcdCAgIHRoaXMua25vYkRhdGEubGV2ZWwgPSB0aGlzLl92YWx1ZS5ub3JtYWxpemVkKih0aGlzLndpZHRoLXRoaXMua25vYkRhdGEucioyKSt0aGlzLmtub2JEYXRhLnI7XG4gICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3gnLHRoaXMua25vYkRhdGEubGV2ZWwpO1xuICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ3gnLDApO1xuICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICB9XG4gIH1cblxuXG4gIGNsaWNrKCkge1xuICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzKjAuOTtcbiAgICB0aGlzLnBvc2l0aW9uLmFuY2hvciA9IHRoaXMubW91c2U7XG4gICAgdGhpcy5tb3ZlKCk7XG4gIH1cblxuICBtb3ZlKCkge1xuICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcbiAgICAgIHRoaXMucG9zaXRpb24udXBkYXRlKHRoaXMubW91c2UpO1xuICAgICAgdGhpcy5fdmFsdWUudXBkYXRlTm9ybWFsKCB0aGlzLnBvc2l0aW9uLnZhbHVlICk7XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5fdmFsdWUudmFsdWUpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICAgIH1cbiAgfVxuXG4gIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldCBub3JtYWxpemVkKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5ub3JtYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gIFRoZSBzbGlkZXIncyBjdXJyZW50IHZhbHVlLiBJZiBzZXQgbWFudWFsbHksIHdpbGwgdXBkYXRlIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cbiAgQHR5cGUge251bWJlcn1cbiAgQGV4YW1wbGUgc2xpZGVyLnZhbHVlID0gMTA7XG4gICovXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHYpIHtcbiAgICB0aGlzLl92YWx1ZS51cGRhdGUodik7XG4gICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMuX3ZhbHVlLnZhbHVlKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gIExvd2VyIGxpbWl0IG9mIHRoZSBzbGlkZXJzJ3Mgb3V0cHV0IHJhbmdlXG4gIEB0eXBlIHtudW1iZXJ9XG4gIEBleGFtcGxlIHNsaWRlci5taW4gPSAxMDAwO1xuICAqL1xuICBnZXQgbWluKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5taW47XG4gIH1cbiAgc2V0IG1pbih2KSB7XG4gICAgdGhpcy5fdmFsdWUubWluID0gdjtcbiAgfVxuXG4gIC8qKlxuICBVcHBlciBsaW1pdCBvZiB0aGUgc2xpZGVyJ3Mgb3V0cHV0IHJhbmdlXG4gIEB0eXBlIHtudW1iZXJ9XG4gIEBleGFtcGxlIHNsaWRlci5tYXggPSAxMDAwO1xuICAqL1xuICBnZXQgbWF4KCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5tYXg7XG4gIH1cbiAgc2V0IG1heCh2KSB7XG4gICAgdGhpcy5fdmFsdWUubWF4ID0gdjtcbiAgfVxuXG4gIC8qKlxuICBUaGUgaW5jcmVtZW50IHRoYXQgdGhlIHNsaWRlcidzIHZhbHVlIGNoYW5nZXMgYnkuXG4gIEB0eXBlIHtudW1iZXJ9XG4gIEBleGFtcGxlIHNsaWRlci5zdGVwID0gNTtcbiAgKi9cbiAgZ2V0IHN0ZXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnN0ZXA7XG4gIH1cbiAgc2V0IHN0ZXAodikge1xuICAgIHRoaXMuX3ZhbHVlLnN0ZXAgPSB2O1xuICB9XG5cbiAgLyoqXG4gIEFic29sdXRlIG1vZGUgKHNsaWRlcidzIHZhbHVlIGp1bXBzIHRvIG1vdXNlIGNsaWNrIHBvc2l0aW9uKSBvciByZWxhdGl2ZSBtb2RlIChtb3VzZSBkcmFnIGNoYW5nZXMgdmFsdWUgcmVsYXRpdmUgdG8gaXRzIGN1cnJlbnQgcG9zaXRpb24pLiBEZWZhdWx0OiBcInJlbGF0aXZlXCIuXG4gIEB0eXBlIHtzdHJpbmd9XG4gIEBleGFtcGxlIHNsaWRlci5tb2RlID0gXCJyZWxhdGl2ZVwiO1xuICAqL1xuICBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi5tb2RlO1xuICB9XG4gIHNldCBtb2RlKHYpIHtcbiAgICB0aGlzLnBvc2l0aW9uLm1vZGUgPSB2O1xuICB9XG5cblxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvaW50ZXJmYWNlcy9zbGlkZXIuanMiLCIndXNlIHN0cmljdCc7XG5cbmxldCBzdmcgPSByZXF1aXJlKCcuLi91dGlsL3N2ZycpO1xubGV0IFRvZ2dsZU1vZGVsID0gcmVxdWlyZSgnLi4vbW9kZWxzL3RvZ2dsZScpO1xubGV0IEludGVyZmFjZSA9IHJlcXVpcmUoJy4uL2NvcmUvaW50ZXJmYWNlJyk7XG5cbi8qKlxuKiBUb2dnbGVcbipcbiogQGRlc2NyaXB0aW9uIEJpbmFyeSBzd2l0Y2hcbipcbiogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJ0b2dnbGVcIj48L3NwYW4+XG4qXG4qIEBleGFtcGxlXG4qIHZhciB0b2dnbGUgPSBuZXcgTmV4dXMuVG9nZ2xlKCcjdGFyZ2V0JylcbipcbiogQGV4YW1wbGVcbiogdmFyIHRvZ2dsZSA9IG5ldyBOZXh1cy5Ub2dnbGUoJyN0YXJnZXQnLHtcbiogICAgICdzaXplJzogWzQwLDIwXSxcbiogICAgICdzdGF0ZSc6IGZhbHNlXG4qIH0pXG4qXG4qIEBvdXRwdXRcbiogY2hhbmdlXG4qIEZpcmVzIGFueSB0aW1lIHRoZSBpbnRlcmZhY2UncyB2YWx1ZSBjaGFuZ2VzLiA8YnI+XG4qIFBhcmFtZXRlcjogVGhlIGJvb2xlYW4gc3RhdGUgb2YgdGhlIGludGVyZmFjZS5cbipcbiogQG91dHB1dGV4YW1wbGVcbiogdG9nZ2xlLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcbiogICBjb25zb2xlLmxvZyh2KTtcbiogfSlcbipcbipcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2dnbGUgZXh0ZW5kcyBJbnRlcmZhY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgbGV0IG9wdGlvbnMgPSBbJ3ZhbHVlJ107XG5cbiAgICBsZXQgZGVmYXVsdHMgPSB7XG4gICAgICAnc2l6ZSc6IFs0MCwyMF0sXG4gICAgICAndGFyZ2V0JzogZmFsc2UsXG4gICAgICAnc3RhdGUnOiBmYWxzZVxuICAgIH07XG5cbiAgICBzdXBlcihhcmd1bWVudHMsb3B0aW9ucyxkZWZhdWx0cyk7XG5cbiAgICB0aGlzLl9zdGF0ZSA9IG5ldyBUb2dnbGVNb2RlbCh0aGlzLnNldHRpbmdzLnN0YXRlKTtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG4gIH1cblxuICBidWlsZEludGVyZmFjZSgpIHtcblxuICAgIHRoaXMuYmFyID0gc3ZnLmNyZWF0ZSgncmVjdCcpO1xuICAgIHRoaXMua25vYiA9IHN2Zy5jcmVhdGUoJ2NpcmNsZScpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmJhcik7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMua25vYik7XG5cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICBpZiAodGhpcy5oZWlnaHQgPCB0aGlzLndpZHRoLzIpIHtcbiAgICAgIHRoaXMua25vYlNpemUgPSB0aGlzLmhlaWdodC8yO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtub2JTaXplID0gdGhpcy53aWR0aC80O1xuICAgIH1cblxuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgneCcsdGhpcy53aWR0aC8yIC0gdGhpcy5rbm9iU2l6ZSoxLjUpO1xuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgneScsdGhpcy5oZWlnaHQvMiAtIHRoaXMua25vYlNpemUvMik7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCdyeCcsdGhpcy5rbm9iU2l6ZS8yKTtcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3J5Jyx0aGlzLmtub2JTaXplLzIpO1xuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgnd2lkdGgnLHRoaXMua25vYlNpemUqMyk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLHRoaXMua25vYlNpemUpO1xuXG4gICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3gnLHRoaXMud2lkdGgvMiAtIHRoaXMua25vYlNpemUpO1xuICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N5Jyx0aGlzLmhlaWdodC8yKTtcbiAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdyJyx0aGlzLmtub2JTaXplKTtcblxuICB9XG5cbiAgY29sb3JJbnRlcmZhY2UoKSB7XG4gICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmFjY2VudCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUpIHtcbiAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N4Jyx0aGlzLndpZHRoLzIgLSB0aGlzLmtub2JTaXplKTtcbiAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmZpbGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeCcsdGhpcy53aWR0aC8yICsgdGhpcy5rbm9iU2l6ZSk7XG4gICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNsaWNrKCkge1xuICAgIHRoaXMuZmxpcCgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMuc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIHRvZ2dsZSBpcyBjdXJyZW50bHkgb24gb3Igb2ZmLiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgd2lsbCB1cGRhdGUgdGhlIHRvZ2dsZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cbiAgQHR5cGUge2Jvb2xlYW59XG4gIEBleGFtcGxlIHRvZ2dsZS5zdGF0ZSA9IGZhbHNlO1xuICAqL1xuICBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLnN0YXRlO1xuICB9XG4gIHNldCBzdGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMuX3N0YXRlLmZsaXAodmFsdWUpO1xuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnN0YXRlKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cblxuICAvKipcbiAgKiBTd2l0Y2ggdGhlIHRvZ2dsZSBzdGF0ZSB0byBpdHMgb3Bwb3NpdGUgc3RhdGVcbiAgKiBAZXhhbXBsZVxuICAqIHRvZ2dsZS5mbGlwKCk7XG4gICovXG4gIGZsaXAoKSB7XG4gICAgdGhpcy5fc3RhdGUuZmxpcCgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL2ludGVyZmFjZXMvdG9nZ2xlLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgc3ZnID0gcmVxdWlyZSgnLi4vdXRpbC9zdmcnKTtcbmxldCBCdXR0b25UZW1wbGF0ZSA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvYnV0dG9udGVtcGxhdGUnKTtcblxuLyoqXG4qIEJ1dHRvblxuKlxuKiBAZGVzY3JpcHRpb24gQ2lyY3VsYXIgYnV0dG9uIHdpdGggb3B0aW9uYWwgYWZ0ZXJ0b3VjaC5cbipcbiogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJidXR0b25cIj48L3NwYW4+XG4qXG4qIEBleGFtcGxlXG4qIHZhciBidXR0b24gPSBuZXcgTmV4dXMuQnV0dG9uKCcjdGFyZ2V0JylcbipcbiogQGV4YW1wbGVcbiogdmFyIGJ1dHRvbiA9IG5ldyBOZXh1cy5CdXR0b24oJyN0YXJnZXQnLHtcbiogICAnc2l6ZSc6IFs4MCw4MF0sXG4qICAgJ21vZGUnOiAnYWZ0ZXJ0b3VjaCcsXG4qICAgJ3N0YXRlJzogZmFsc2VcbiogfSlcbipcbiogQG91dHB1dFxuKiBjaGFuZ2VcbiogRmlyZXMgYW55IHRpbWUgdGhlIGludGVyZmFjZSdzIHZhbHVlIGNoYW5nZXMuIDxicj5cbiogSW4gPGI+YnV0dG9uIG1vZGU8L2I+LCA8Yj50b2dnbGUgbW9kZTwvYj4sIGFuZCA8Yj5pbXB1bHNlIG1vZGU8L2I+LCB0aGUgb3V0cHV0IGRhdGEgaXMgYSBib29sZWFuIGRlc2NyaWJpbmcgdGhlIHN0YXRlIG9mIHRoZSBidXR0b24uPGJyPlxuKiBJbiA8Yj5hZnRlcnRvdWNoIG1vZGU8L2I+LCB0aGUgb3V0cHV0IGRhdGEgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeCAoMC0xKSBhbmQgeSAoMC0xKSBwb3NpdGlvbnMgb2YgYWZ0ZXJ0b3VjaC5cbipcbiogQG91dHB1dGV4YW1wbGVcbiogYnV0dG9uLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcbiogICAvLyB2IGlzIHRoZSB2YWx1ZSBvZiB0aGUgYnV0dG9uXG4qICAgY29uc29sZS5sb2codik7XG4qIH0pXG4qXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCdXR0b24gZXh0ZW5kcyBCdXR0b25UZW1wbGF0ZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsnbW9kZSddO1xuXG5cbiAgICBsZXQgZGVmYXVsdHMgPSB7XG4gICAgICAnc2l6ZSc6IFs4MCw4MF0sXG4gICAgICAnbW9kZSc6ICdhZnRlcnRvdWNoJywgLy8gYnV0dG9uLCBhZnRlcnRvdWNoLCBpbXB1bHNlLCB0b2dnbGVcbiAgICAgICdzdGF0ZSc6IGZhbHNlXG4gICAgfTtcblxuICAgIHN1cGVyKGFyZ3VtZW50cyxvcHRpb25zLGRlZmF1bHRzKTtcblxuXG4gICAgLyoqXG4gICAgKiBJbnRlcmFjdGlvbiBtb2RlOiBzdXBwb3J0cyBcImJ1dHRvblwiLCBcImFmdGVydG91Y2hcIiwgXCJpbXB1bHNlXCIsIG9yIFwidG9nZ2xlXCJcbiAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgKiBAZXhhbXBsZSBidXR0b24ubW9kZSA9ICd0b2dnbGUnO1xuICAgICovXG4gICAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5tb2RlO1xuXG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcblxuICB9XG5cbiAgYnVpbGRJbnRlcmZhY2UoKSB7XG4gICAgdGhpcy5wYWQgPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wYWQpO1xuXG4gICAgdGhpcy5pbnRlcmFjdGlvblRhcmdldCA9IHRoaXMucGFkO1xuXG4gICAgLy8gb25seSB1c2VkIGlmIGluICdhZnRlcnRvdWNoJyBtb2RlXG4gICAgdGhpcy5kZWZzID0gc3ZnLmNyZWF0ZSgnZGVmcycpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmRlZnMpO1xuXG4gICAgdGhpcy5ncmFkaWVudCA9IHN2Zy5yYWRpYWxHcmFkaWVudCh0aGlzLmRlZnMsMik7XG5cbiAgICB0aGlzLmdyYWRpZW50LnN0b3BzWzBdLnNldEF0dHJpYnV0ZSgnb2Zmc2V0JywgJzMwJScpO1xuXG4gICAgdGhpcy5ncmFkaWVudC5zdG9wc1sxXS5zZXRBdHRyaWJ1dGUoJ29mZnNldCcsICcxMDAlJyk7XG5cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ2N4Jyx0aGlzLndpZHRoLzIpO1xuICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnY3knLHRoaXMuaGVpZ2h0LzIpO1xuICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgncicsIE1hdGgubWluKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpIC8gMiAtIHRoaXMud2lkdGgvNDApO1xuICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgdGhpcy53aWR0aC8yMCk7XG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcblxuICAgIHRoaXMuZ3JhZGllbnQuc3RvcHNbMF0uc2V0QXR0cmlidXRlKCdzdG9wLWNvbG9yJywgdGhpcy5jb2xvcnMuYWNjZW50KTtcbiAgICB0aGlzLmdyYWRpZW50LnN0b3BzWzFdLnNldEF0dHJpYnV0ZSgnc3RvcC1jb2xvcicsIHRoaXMuY29sb3JzLmZpbGwpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKlxuICAqIFVwZGF0ZSB0aGUgdmlzdWFsIGludGVyZmFjZSB1c2luZyBpdHMgY3VycmVudCBzdGF0ZVxuICAqXG4gICogQGV4YW1wbGVcbiAgKiBidXR0b24ucmVuZGVyKCk7XG4gICovXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUpIHtcbiAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmZpbGwpO1xuICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCdzdHJva2UnLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm1vZGU9PT0nYWZ0ZXJ0b3VjaCcpIHtcbiAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAndXJsKCMnK3RoaXMuZ3JhZGllbnQuaWQrJyknKTtcbiAgICAgICAgdGhpcy5ncmFkaWVudC5lbGVtZW50LnNldEF0dHJpYnV0ZSgnY3gnLCAodGhpcy5wb3NpdGlvbi54KjEwMCkrJyUnKTtcbiAgICAgICAgdGhpcy5ncmFkaWVudC5lbGVtZW50LnNldEF0dHJpYnV0ZSgnY3knLCAoKDEtdGhpcy5wb3NpdGlvbi55KSoxMDApKyclJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMuY29sb3JzLmFjY2VudCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICAgIH1cbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvaW50ZXJmYWNlcy9idXR0b24uanMiLCIndXNlIHN0cmljdCc7XG5cbmxldCBzdmcgPSByZXF1aXJlKCcuLi91dGlsL3N2ZycpO1xubGV0IG1hdGggPSByZXF1aXJlKCcuLi91dGlsL21hdGgnKTtcbmxldCBUb2dnbGVNb2RlbCA9IHJlcXVpcmUoJy4uL21vZGVscy90b2dnbGUnKTtcbmxldCBJbnRlcmZhY2UgPSByZXF1aXJlKCcuLi9jb3JlL2ludGVyZmFjZScpO1xuXG4vKipcbkJ1dHRvbiBUZW1wbGF0ZVxuKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnV0dG9uVGVtcGxhdGUgZXh0ZW5kcyBJbnRlcmZhY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3Msb3B0aW9ucyxkZWZhdWx0cykge1xuXG4gICAgc3VwZXIoYXJncyxvcHRpb25zLGRlZmF1bHRzKTtcblxuICAgIHRoaXMubW9kZSA9IHRoaXMuc2V0dGluZ3MubW9kZSB8fCAnYnV0dG9uJztcblxuICAgIHRoaXMucG9zaXRpb24gPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG5cbiAgICB0aGlzLl9zdGF0ZSA9IG5ldyBUb2dnbGVNb2RlbCh0aGlzLnNldHRpbmdzLnN0YXRlKTtcblxuICB9XG5cbiAgYnVpbGRJbnRlcmZhY2UoKSB7XG4gICAgdGhpcy5wYWQgPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcbiAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnI2QxOCcpO1xuICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJyNkMTgnKTtcbiAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIDQpO1xuXG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucGFkKTtcblxuICAgIHRoaXMuaW50ZXJhY3Rpb25UYXJnZXQgPSB0aGlzLnBhZDtcblxuICAgIHRoaXMuc2l6ZUludGVyZmFjZSgpO1xuICB9XG5cbiAgc2l6ZUludGVyZmFjZSgpIHtcbiAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ2N4Jyx0aGlzLndpZHRoLzIpO1xuICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnY3knLHRoaXMuaGVpZ2h0LzIpO1xuICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgncicsIE1hdGgubWluKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpIC8gMiAtIDIpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5zdGF0ZSkge1xuICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5jb2xvcnMuZmlsbCk7XG4gICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5jb2xvcnMuYWNjZW50KTtcbiAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgdGhpcy5jb2xvcnMuYWNjZW50KTtcbiAgICB9XG4gIH1cblxuICBkb3duKHBhaW50YnJ1c2gpIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSAnaW1wdWxzZSc6XG4gICAgICAgIHRoaXMudHVybk9uKCk7XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMudHVybk9mZi5iaW5kKHRoaXMpLDMwKTtcbiAgICAvLyAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5zdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgdGhpcy50dXJuT24oKTtcbiAgICAvLyAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5zdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWZ0ZXJ0b3VjaCc6XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSB7XG4gICAgICAgICAgeDogbWF0aC5jbGlwKHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgsMCwxKSxcbiAgICAgICAgICB5OiBtYXRoLmNsaXAoMS10aGlzLm1vdXNlLnkgLyB0aGlzLmhlaWdodCwwLDEpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudHVybk9uKCk7XG4gICAgLy8gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAvLyAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgIC8vICAgICAgeDogdGhpcy5wb3NpdGlvbi54LFxuICAgIC8vICAgICAgeTogdGhpcy5wb3NpdGlvbi55LFxuICAgIC8vICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgICAgIHRoaXMuZmxpcChwYWludGJydXNoKTtcbiAgICAvLyAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5zdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICB9XG5cbiAgYmVuZChtb3VzZSkge1xuICAgIGlmICh0aGlzLm1vZGU9PT0nYWZ0ZXJ0b3VjaCcpIHtcbiAgICAgIHRoaXMubW91c2UgPSBtb3VzZSB8fCB0aGlzLm1vdXNlO1xuICAgICAgdGhpcy5wb3NpdGlvbiA9IHtcbiAgICAgICAgeDogbWF0aC5jbGlwKHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgsMCwxKSxcbiAgICAgICAgeTogbWF0aC5jbGlwKDEgLSB0aGlzLm1vdXNlLnkgLyB0aGlzLmhlaWdodCwwLDEpXG4gICAgICB9O1xuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgIHg6IHRoaXMucG9zaXRpb24ueCxcbiAgICAgICAgeTogdGhpcy5wb3NpdGlvbi55LFxuICAgICAgfSk7XG4gICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHVwKCkge1xuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICB0aGlzLnR1cm5PZmYoKTtcbiAgICAgIC8vICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5zdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWZ0ZXJ0b3VjaCc6XG4gICAgICAgIHRoaXMudHVybk9mZigpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0ge1xuICAgICAgICAgIHg6IG1hdGguY2xpcCh0aGlzLm1vdXNlLnggLyB0aGlzLndpZHRoLDAsMSksXG4gICAgICAgICAgeTogbWF0aC5jbGlwKDEgLSB0aGlzLm1vdXNlLnkgLyB0aGlzLmhlaWdodCwwLDEpXG4gICAgICAgIH07XG4gICAgICAvLyAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgIC8vICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgLy8gICAgeDogdGhpcy5wb3NpdGlvbi54LFxuICAgICAgLy8gICAgeTogdGhpcy5wb3NpdGlvbi55LFxuICAgICAgLy8gIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKiBvdmVyd3JpdGFibGUgaW50ZXJhY3Rpb24gaGFuZGxlcnMgKi9cblxuICBjbGljaygpIHtcbiAgICB0aGlzLmRvd24oKTtcbiAgfVxuICBtb3ZlKCkge1xuICAgIHRoaXMuYmVuZCgpO1xuICB9XG4gIHJlbGVhc2UoKSB7XG4gICAgdGhpcy51cCgpO1xuICB9XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBvbiAocHJlc3NlZCkgb3Igb2ZmIChub3QgcHJlc3NlZClcbiAgQHR5cGUge2Jvb2xlYW59XG4gIEBleGFtcGxlIGJ1dHRvbi5zdGF0ZSA9IHRydWU7XG4gICovXG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUuc3RhdGU7XG4gIH1cbiAgc2V0IHN0YXRlKHZhbHVlKSB7XG4gICAgdGhpcy5fc3RhdGUuZmxpcCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMubW9kZT09PSdhZnRlcnRvdWNoJykge1xuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgIHg6IHRoaXMucG9zaXRpb24ueCxcbiAgICAgICAgeTogdGhpcy5wb3NpdGlvbi55LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnN0YXRlKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICBDaGFuZ2UgdGhlIGJ1dHRvbiB0byBpdHMgYWx0ZXJuYXRlIHN0YXRlIChvZmY9Pm9uLCBvbj0+b2ZmKSwgb3IgZmxpcCBpdCB0byBhIHNwZWNpZmllZCBzdGF0ZS5cbiAgQHBhcmFtIHZhbHVlIHtib29sZWFufSAoT3B0aW9uYWwpIFN0YXRlIHRvIGZsaXAgdG8uXG4gIEBleGFtcGxlIGJ1dHRvbi5mbGlwKCk7XG4gICovXG4gIGZsaXAodmFsdWUpIHtcbiAgICB0aGlzLl9zdGF0ZS5mbGlwKHZhbHVlKTtcbiAgICBpZiAodGhpcy5tb2RlPT09J2FmdGVydG91Y2gnKSB7XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScse1xuICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgeDogdGhpcy5wb3NpdGlvbi54LFxuICAgICAgICB5OiB0aGlzLnBvc2l0aW9uLnksXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMuc3RhdGUpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gIFR1cm4gdGhlIGJ1dHRvbidzIHN0YXRlIHRvIHRydWUuXG4gIEBleGFtcGxlIGJ1dHRvbi50dXJuT24oKTtcbiAgKi9cbiAgdHVybk9uKGVtaXR0aW5nKSB7XG4gICAgdGhpcy5fc3RhdGUub24oKTtcbiAgICBpZiAoZW1pdHRpbmchPT1mYWxzZSkge1xuICAgICAgaWYgKHRoaXMubW9kZT09PSdhZnRlcnRvdWNoJykge1xuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScse1xuICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgIHg6IHRoaXMucG9zaXRpb24ueCxcbiAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uLnksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMuc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gIFR1cm4gdGhlIGJ1dHRvbidzIHN0YXRlIHRvIGZhbHNlLlxuICBAZXhhbXBsZSBidXR0b24udHVybk9mZigpO1xuICAqL1xuICB0dXJuT2ZmKGVtaXR0aW5nKSB7XG4gICAgdGhpcy5fc3RhdGUub2ZmKCk7XG4gICAgaWYgKGVtaXR0aW5nIT09ZmFsc2UpIHtcbiAgICAgIGlmICh0aGlzLm1vZGU9PT0nYWZ0ZXJ0b3VjaCcpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICB4OiB0aGlzLnBvc2l0aW9uLngsXG4gICAgICAgICAgeTogdGhpcy5wb3NpdGlvbi55LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvY29tcG9uZW50cy9idXR0b250ZW1wbGF0ZS5qcyIsIid1c2Ugc3RyaWN0JztcblxubGV0IEJ1dHRvblRlbXBsYXRlID0gcmVxdWlyZSgnLi4vY29tcG9uZW50cy9idXR0b250ZW1wbGF0ZScpO1xuXG4vKipcbiogVGV4dEJ1dHRvblxuKlxuKiBAZGVzY3JpcHRpb24gVGV4dCBidXR0b25cbipcbiogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJ0ZXh0QnV0dG9uXCI+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgdGV4dGJ1dHRvbiA9IG5ldyBOZXh1cy5UZXh0QnV0dG9uKCcjdGFyZ2V0JylcbipcbiogQGV4YW1wbGVcbiogdmFyIHRleHRidXR0b24gPSBuZXcgTmV4dXMuVGV4dEJ1dHRvbignI3RhcmdldCcse1xuKiAgICAgJ3NpemUnOiBbMTUwLDUwXSxcbiogICAgICdzdGF0ZSc6IGZhbHNlLFxuKiAgICAgJ3RleHQnOiAnUGxheScsXG4qICAgICAnYWx0ZXJuYXRlVGV4dCc6ICdTdG9wJ1xuKiB9KVxuKlxuKiBAb3V0cHV0XG4qIGNoYW5nZVxuKiBGaXJlcyBhbnkgdGltZSB0aGUgaW50ZXJmYWNlJ3MgdmFsdWUgY2hhbmdlcy4gPGJyPlxuKiBUaGUgZXZlbnQgZGF0YSBpcyBhIDxpPnN0cmluZzwvaT4gb2YgdGhlIHRleHQgb24gdGhlIGJ1dHRvbiBhdCB0aGUgbW9tZW50IGl0IHdhcyBjbGlja2VkLlxuKlxuKiBAb3V0cHV0ZXhhbXBsZVxuKiB0ZXh0YnV0dG9uLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcbiogICBjb25zb2xlLmxvZyh2KTtcbiogfSlcbipcbiovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHRCdXR0b24gZXh0ZW5kcyBCdXR0b25UZW1wbGF0ZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsndmFsdWUnXTtcblxuICAgIGxldCBkZWZhdWx0cyA9IHtcbiAgICAgICdzaXplJzogWzE1MCw1MF0sXG4gICAgICAnc3RhdGUnOiBmYWxzZSxcbiAgICAgICd0ZXh0JzogJ1BsYXknXG4gICAgfTtcblxuICAgIHN1cGVyKGFyZ3VtZW50cyxvcHRpb25zLGRlZmF1bHRzKTtcblxuICAgIHRoaXMuX3RleHQgPSB0aGlzLnNldHRpbmdzLnRleHQ7XG5cbiAgICBpZih0aGlzLnNldHRpbmdzLmFsdGVybmF0ZSl7IC8vVE9ETzogUmVtb3ZlIHRoaXMgY29uZGl0aW9uYWwgaW4gYSBicmVha2luZy1jaGFuZ2VzIHJlbGVhc2VcbiAgICAgIHRoaXMuc2V0dGluZ3MuYWx0ZXJuYXRlVGV4dCA9IHRoaXMuc2V0dGluZ3MuYWx0ZXJuYXRlO1xuICAgICAgY29uc29sZS53YXJuKFwiJ2FsdGVybmF0ZScgaW5pdGlhdG9yIGlzIGRlcHJlY2F0ZWQuIFVzZSAnYWx0ZXJuYXRlVGV4dCcgaW5zdGVhZC5cIik7XG4gICAgfVxuICAgIHRoaXMuX2FsdGVybmF0ZVRleHQgPSB0aGlzLnNldHRpbmdzLmFsdGVybmF0ZVRleHQ7XG4gICAgdGhpcy5tb2RlID0gKHRoaXMuc2V0dGluZ3MuYWx0ZXJuYXRlVGV4dCkgPyAndG9nZ2xlJyA6ICdidXR0b24nO1xuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICB0aGlzLnN0YXRlID0gdGhpcy5zZXR0aW5ncy5zdGF0ZTtcblxuICB9XG5cbiAgYnVpbGRGcmFtZSgpIHtcblxuICAgIHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG5cbiAgICB0aGlzLnRleHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy50ZXh0RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl90ZXh0O1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRleHRFbGVtZW50KTtcbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY29sb3IgPSB0aGlzLmNvbG9ycy5kYXJrO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBzaXplSW50ZXJmYWNlKCkge1xuICAgICAgbGV0IHRleHRzaXplID0gdGhpcy5oZWlnaHQvMztcbiAgICAgIGxldCB0ZXh0c2l6ZTIgPSAodGhpcy53aWR0aCAvICh0aGlzLl90ZXh0Lmxlbmd0aCArIDIpICk7XG4gICAgICB0ZXh0c2l6ZSA9IE1hdGgubWluKHRleHRzaXplLHRleHRzaXplMik7XG4gICAgICBpZiAodGhpcy5hbHRlcm5hdGVUZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0c2l6ZTMgPSAodGhpcy53aWR0aCAvICh0aGlzLmFsdGVybmF0ZVRleHQubGVuZ3RoICsgMikgKTtcbiAgICAgICAgdGV4dHNpemUgPSBNYXRoLm1pbih0ZXh0c2l6ZSx0ZXh0c2l6ZTMpO1xuICAgICAgfVxuICAgICAgbGV0IHN0eWxlcyA9ICd3aWR0aDogJyArIHRoaXMud2lkdGggKyAncHg7JztcbiAgICAgIHN0eWxlcyArPSAnaGVpZ2h0OiAnICsgdGhpcy5oZWlnaHQgKyAncHg7JztcbiAgICAgIHN0eWxlcyArPSAncGFkZGluZzogJysodGhpcy5oZWlnaHQtdGV4dHNpemUpLzIrJ3B4IDBweDsnO1xuICAgICAgc3R5bGVzICs9ICdib3gtc2l6aW5nOiBib3JkZXItYm94Oyc7XG4gICAgICBzdHlsZXMgKz0gJ3RleHQtYWxpZ246IGNlbnRlcjsnO1xuICAgICAgc3R5bGVzICs9ICdmb250LWZhbWlseTogaW5oZXJpdDsnO1xuICAgICAgc3R5bGVzICs9ICdmb250LXdlaWdodDogNzAwOyc7XG4gICAgICBzdHlsZXMgKz0gJ29wYWNpdHk6IDE7JztcbiAgICAgIHN0eWxlcyArPSAnZm9udC1zaXplOicgKyB0ZXh0c2l6ZSArICdweDsnO1xuICAgICAgdGhpcy50ZXh0RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gc3R5bGVzO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmNvbG9ycy5maWxsO1xuICAgICAgdGhpcy50ZXh0RWxlbWVudC5zdHlsZS5jb2xvciA9IHRoaXMuY29sb3JzLmRhcms7XG4gICAgICB0aGlzLnRleHRFbGVtZW50LmlubmVySFRNTCA9IHRoaXMuX3RleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmNvbG9ycy5hY2NlbnQ7XG4gICAgICB0aGlzLnRleHRFbGVtZW50LnN0eWxlLmNvbG9yID0gdGhpcy5jb2xvcnMuZmlsbDtcbiAgICAgIGlmICh0aGlzLmFsdGVybmF0ZVRleHQpIHtcbiAgICAgICAgdGhpcy50ZXh0RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl9hbHRlcm5hdGVUZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50ZXh0RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl90ZXh0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICBUaGUgdGV4dCB0byBkaXNwbGF5IHdoZW4gdGhlIGJ1dHRvbiBpcyBpbiBpdHMgXCJvblwiIHN0YXRlLiBJZiBzZXQsIHRoaXMgcHV0cyB0aGUgYnV0dG9uIGluIFwidG9nZ2xlXCIgbW9kZS5cbiAgQHR5cGUge1N0cmluZ31cbiAgKi9cbiAgZ2V0IGFsdGVybmF0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsdGVybmF0ZVRleHQ7XG4gIH1cblxuICBzZXQgYWx0ZXJuYXRlVGV4dCh0ZXh0KSB7XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIHRoaXMubW9kZSA9ICd0b2dnbGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGUgPSAnYnV0dG9uJztcbiAgICB9XG4gICAgdGhpcy5fYWx0ZXJuYXRlVGV4dCA9IHRleHQ7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG5cbiAgLyoqXG4gIFRoZSB0ZXh0IHRvIGRpc3BsYXkuIChJZiAuYWx0ZXJuYXRlVGV4dCBleGlzdHMsIHRoZW4gdGhpcyAudGV4dCB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBpbiBpdHMgXCJvZmZcIiBzdGF0ZS4pXG4gIEB0eXBlIHtTdHJpbmd9XG4gICovXG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLl90ZXh0O1xuICB9XG5cbiAgc2V0IHRleHQodGV4dCkge1xuICAgIHRoaXMuX3RleHQgPSB0ZXh0O1xuICAgIHRoaXMuc2l6ZUludGVyZmFjZSgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvaW50ZXJmYWNlcy90ZXh0YnV0dG9uLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG4vL2xldCBzdmcgPSByZXF1aXJlKCcuLi91dGlsL3N2ZycpO1xubGV0IEludGVyZmFjZSA9IHJlcXVpcmUoJy4uL2NvcmUvaW50ZXJmYWNlJyk7XG5sZXQgQnV0dG9uID0gcmVxdWlyZSgnLi4vaW50ZXJmYWNlcy9idXR0b24nKTtcblxuLyoqXG4qIFJhZGlvQnV0dG9uXG4qXG4qIEBkZXNjcmlwdGlvbiBBbiBhcnJheSBvZiBidXR0b25zLiBCeSBkZWZhdWx0LCBzZWxlY3Rpbmcgb25lIGJ1dHRvbiB3aWxsIGRlc2VsZWN0IGFsbCBvdGhlciBidXR0b25zLCBidXQgdGhpcyBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUgQVBJIGJlbG93LlxuKlxuKiBAZGVtbyA8ZGl2IG5leHVzLXVpPVwiUmFkaW9CdXR0b25cIj48L2Rpdj5cbipcbiogQGV4YW1wbGVcbiogdmFyIHJhZGlvYnV0dG9uID0gbmV3IE5leHVzLlJhZGlvQnV0dG9uKCcjdGFyZ2V0JylcbipcbiogQGV4YW1wbGVcbiogdmFyIHJhZGlvYnV0dG9uID0gbmV3IE5leHVzLlJhZGlvQnV0dG9uKCcjdGFyZ2V0Jyx7XG4qICAgJ3NpemUnOiBbMTIwLDI1XSxcbiogICAnbnVtYmVyT2ZCdXR0b25zJzogNCxcbiogICAnYWN0aXZlJzogLTFcbiogfSlcbipcbiogQG91dHB1dFxuKiBjaGFuZ2VcbiogRmlyZXMgYW55IHRpbWUgdGhlIGludGVyZmFjZSdzIHZhbHVlIGNoYW5nZXMuIDxicj5cbiogVGhlIGV2ZW50IGRhdGEgYW4gPGk+aW50ZWdlcjwvaT4sIHRoZSBpbmRleCBvZiB0aGUgYnV0dG9uIHRoYXQgaXMgY3VycmVudGx5IG9uLiBJZiBubyBidXR0b24gaXMgc2VsZWN0ZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIC0xLlxuKlxuKiBAb3V0cHV0ZXhhbXBsZVxuKiByYWRpb2J1dHRvbi5vbignY2hhbmdlJyxmdW5jdGlvbih2KSB7XG4qICAgY29uc29sZS5sb2codik7XG4qIH0pXG4qXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpb0J1dHRvbiBleHRlbmRzIEludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsndmFsdWUnXTtcblxuICAgIGxldCBkZWZhdWx0cyA9IHtcbiAgICAgICdzaXplJzogWzEyMCwyNV0sXG4gICAgICAnbnVtYmVyT2ZCdXR0b25zJzogNCxcbiAgICAgICdhY3RpdmUnOiAtMVxuICAgIH07XG5cbiAgICBzdXBlcihhcmd1bWVudHMsb3B0aW9ucyxkZWZhdWx0cyk7XG5cbiAgICB0aGlzLmJ1dHRvbnMgPSBbXTtcbiAgICB0aGlzLl9udW1iZXJPZkJ1dHRvbnMgPSB0aGlzLnNldHRpbmdzLm51bWJlck9mQnV0dG9ucztcbiAgICB0aGlzLmFjdGl2ZSA9IHRoaXMuc2V0dGluZ3MuYWN0aXZlO1xuXG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcblxuICB9XG5cbiAgYnVpbGRGcmFtZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuICB9XG5cbiAgYnVpbGRJbnRlcmZhY2UoKSB7XG5cbiAgICBmb3IgKGxldCBpPTA7aTx0aGlzLl9udW1iZXJPZkJ1dHRvbnM7aSsrKSB7XG4gICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuXG4gICAgICBsZXQgYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIHtcbiAgICAgICAgICBtb2RlOiAndG9nZ2xlJyxcbiAgICAgICAgICBjb21wb25lbnQ6IHRydWUsXG4gICAgICAgIH0sIHRoaXMudXBkYXRlLmJpbmQodGhpcyxpKSk7XG5cbiAgICAgIHRoaXMuYnV0dG9ucy5wdXNoKGJ1dHRvbik7XG4gICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICB9XG5cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICBsZXQgYnV0dG9uV2lkdGggPSB0aGlzLndpZHRoIC8gdGhpcy5fbnVtYmVyT2ZCdXR0b25zO1xuICAgIGxldCBidXR0b25IZWlnaHQgPSB0aGlzLmhlaWdodDtcblxuICAgIGZvciAobGV0IGk9MDtpPHRoaXMuX251bWJlck9mQnV0dG9ucztpKyspIHtcbiAgICAgIHRoaXMuYnV0dG9uc1tpXS5yZXNpemUoYnV0dG9uV2lkdGgsYnV0dG9uSGVpZ2h0KTtcbiAgICB9XG5cbiAgfVxuXG4gIGNvbG9ySW50ZXJmYWNlKCkge1xuICAgIGZvciAobGV0IGk9MDtpPHRoaXMuX251bWJlck9mQnV0dG9ucztpKyspIHtcbiAgICAgIHRoaXMuYnV0dG9uc1tpXS5jb2xvcnMgPSB0aGlzLmNvbG9ycztcbiAgICAgIHRoaXMuYnV0dG9uc1tpXS5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGUoaW5kZXgpIHtcbiAgICBpZiAodGhpcy5idXR0b25zW2luZGV4XS5zdGF0ZSkge1xuICAgICAgdGhpcy5zZWxlY3QoaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlc2VsZWN0KCk7XG4gICAgfVxuICAvLyAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBmb3IgKGxldCBpPTA7aTx0aGlzLmJ1dHRvbnMubGVuZ3RoO2krKykge1xuICAgICAgaWYgKGk9PT10aGlzLmFjdGl2ZSkge1xuICAgICAgICB0aGlzLmJ1dHRvbnNbaV0udHVybk9uKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYnV0dG9uc1tpXS50dXJuT2ZmKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgU2VsZWN0IG9uZSBidXR0b24gYW5kIGRlc2VsZWN0IGFsbCBvdGhlciBidXR0b25zLlxuICBAcGFyYW0gaW5kZXgge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBidXR0b24gdG8gc2VsZWN0XG4gICovXG4gIHNlbGVjdChpbmRleCkge1xuICAgIGlmIChpbmRleD49MCAmJiBpbmRleCA8IHRoaXMuYnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWN0aXZlID0gaW5kZXg7XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5hY3RpdmUpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgRGVzZWxlY3QgYWxsIGJ1dHRvbnMuXG4gICovXG4gIGRlc2VsZWN0KCkge1xuICAgIHRoaXMuYWN0aXZlID0gLTE7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMuYWN0aXZlKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgZ2V0IG51bWJlck9mQnV0dG9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZCdXR0b25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBob3cgbWFueSBidXR0b25zIGFyZSBpbiB0aGUgaW50ZXJmYWNlXG4gICAqIEBwYXJhbSAge251bWJlcn0gYnV0dG9ucyBIb3cgbWFueSBidXR0b25zIGFyZSBpbiB0aGUgaW50ZXJmYWNlXG4gICAqL1xuICBzZXQgbnVtYmVyT2ZCdXR0b25zKGJ1dHRvbnMpIHtcbiAgICB0aGlzLl9udW1iZXJPZkJ1dHRvbnMgPSBidXR0b25zO1xuICAgIGZvciAobGV0IGk9MDtpPHRoaXMuYnV0dG9ucy5sZW5ndGg7aSsrKSB7XG4gICAgICB0aGlzLmJ1dHRvbnNbaV0uZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLmJ1dHRvbnMgPSBbXTtcbiAgLy8gIGZvciAobGV0IGk9MDtpPHRoaXMuYnV0dG9ucy5sZW5ndGg7aSsrKSB7XG4gIC8vICAgIHRoaXMuYnV0dG9uc1tpXS5kZXN0cm95KCk7XG4gIC8vICB9XG4gICAgdGhpcy5lbXB0eSgpO1xuICAgIHRoaXMuYnVpbGRJbnRlcmZhY2UoKTtcbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvaW50ZXJmYWNlcy9yYWRpb2J1dHRvbi5qcyIsIid1c2Ugc3RyaWN0JztcblxubGV0IEludGVyZmFjZSA9IHJlcXVpcmUoJy4uL2NvcmUvaW50ZXJmYWNlJyk7XG5sZXQgU3RlcCA9IHJlcXVpcmUoJy4uL21vZGVscy9zdGVwJyk7XG5sZXQgbWF0aCA9IHJlcXVpcmUoJy4uL3V0aWwvbWF0aCcpO1xuXG4vKipcbiogTnVtYmVyXG4qXG4qIEBkZXNjcmlwdGlvbiBOdW1iZXIgaW50ZXJmYWNlIHdoaWNoIGlzIGNvbnRyb2xsYWJsZSBieSBkcmFnZ2luZyBvciB0eXBpbmcuXG4qXG4qIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwibnVtYmVyXCI+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgbnVtYmVyID0gbmV3IE5leHVzLk51bWJlcignI3RhcmdldCcpXG4qXG4qIEBleGFtcGxlXG4qIHZhciBudW1iZXIgPSBuZXcgTmV4dXMuTnVtYmVyKCcjdGFyZ2V0Jyx7XG4qICAgJ3NpemUnOiBbNjAsMzBdLFxuKiAgICd2YWx1ZSc6IDAsXG4qICAgJ21pbic6IDAsXG4qICAgJ21heCc6IDIwMDAwLFxuKiAgICdzdGVwJzogMVxuKiB9KVxuKlxuKiBAb3V0cHV0XG4qIGNoYW5nZVxuKiBGaXJlcyBhbnkgdGltZSB0aGUgaW50ZXJmYWNlJ3MgdmFsdWUgY2hhbmdlcy4gPGJyPlxuKiBUaGUgZXZlbnQgZGF0YSBpcyB0aGUgbnVtYmVyIHZhbHVlIG9mIHRoZSBpbnRlcmZhY2UuXG4qXG4qIEBvdXRwdXRleGFtcGxlXG4qIG51bWJlci5vbignY2hhbmdlJyxmdW5jdGlvbih2KSB7XG4qICAgY29uc29sZS5sb2codik7XG4qIH0pXG4qXG4qXG4qL1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE51bWJlciBleHRlbmRzIEludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsndmFsdWUnXTtcblxuICAgIGxldCBkZWZhdWx0cyA9IHtcbiAgICAgICdzaXplJzogWzYwLDMwXSxcbiAgICAgICd2YWx1ZSc6IDAsXG4gICAgICAnbWluJzogMCxcbiAgICAgICdtYXgnOiAyMDAwMCxcbiAgICAgICdzdGVwJzogMVxuICAgIH07XG5cbiAgICBzdXBlcihhcmd1bWVudHMsb3B0aW9ucyxkZWZhdWx0cyk7XG5cbiAgICB0aGlzLl92YWx1ZSA9IG5ldyBTdGVwKHRoaXMuc2V0dGluZ3MubWluLHRoaXMuc2V0dGluZ3MubWF4LHRoaXMuc2V0dGluZ3Muc3RlcCx0aGlzLnNldHRpbmdzLnZhbHVlKTtcblxuICAgIC8qXG4gICAgRGVmYXVsdDogMi4gSG93IG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gY2xpcCB0aGUgbnVtYmVyJ3MgdmlzdWFsIHJlbmRlcmluZyB0by4gVGhpcyBkb2VzIG5vdCBhZmZlY3QgbnVtYmVyJ3MgYWN0dWFsIHZhbHVlIG91dHB1dCAtLSBmb3IgdGhhdCwgc2V0IHRoZSBzdGVwIHByb3BlcnR5IHRvIC4wMSwgLjEsIG9yIDEuXG4gICAgQHR5cGUge251bWJlcn1cbiAgICBAZXhhbXBsZSBudW1iZXIuZGVjaW1hbFBsYWNlcyA9IDI7XG4gICAgKi9cbiAgICB0aGlzLmRlY2ltYWxQbGFjZXMgPSAyO1xuICAgIHRoaXMuYWN0dWFsID0gMDtcblxuICAgIHRoaXMubWF4ID0gdGhpcy5fdmFsdWUubWF4O1xuXG4gICAgdGhpcy5taW4gPSB0aGlzLl92YWx1ZS5taW47XG5cbiAgICB0aGlzLnN0ZXAgPSB0aGlzLl92YWx1ZS5zdGVwO1xuXG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcblxuICB9XG5cbiAgYnVpbGRGcmFtZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHRoaXMuZWxlbWVudC50eXBlID0gJ3RleHQnO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7XG4gIFx0ICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuZmlsbDtcbiAgXHQgIHRoaXMuZWxlbWVudC5zdHlsZS5jb2xvciA9IHRoaXMuY29sb3JzLmRhcms7XG4gIFx0ICBpZiAodGhpcy5lbGVtZW50LnZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBwYXJzZUZsb2F0KHRoaXMuZWxlbWVudC52YWx1ZSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gIFx0ICB9XG4gIFx0fS5iaW5kKHRoaXMpKTtcblxuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICBcdCAgaWYgKGUud2hpY2ggPCA0OCB8fCBlLndoaWNoID4gNTcpIHtcbiAgXHQgIFx0aWYgKGUud2hpY2ggIT09IDE4OSAmJiBlLndoaWNoICE9PSAxOTAgJiYgZS53aGljaCAhPT0gOCkge1xuICBcdCAgXHRcdGUucHJldmVudERlZmF1bHQoKTtcbiAgXHQgIFx0fVxuICBcdCAgfVxuICBcdCAgaWYgKGUud2hpY2g9PT0xMykge1xuICBcdCAgXHR0aGlzLmVsZW1lbnQuYmx1cigpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5lbGVtZW50LnZhbHVlO1xuICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gIFx0ICB9XG4gIFx0fS5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG5cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICB0aGlzLl9taW5EaW1lbnNpb24gPSBNYXRoLm1pbih0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcblxuICAgIGxldCBzdHlsZXMgPSAnd2lkdGg6ICcgKyB0aGlzLndpZHRoICsgJ3B4Oyc7XG4gICAgc3R5bGVzICs9ICdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCArICdweDsnO1xuICAgIHN0eWxlcyArPSAnYmFja2dyb3VuZC1jb2xvcjogI2U3ZTdlNzsnO1xuICAgIHN0eWxlcyArPSAnY29sb3I6ICMzMzM7JztcbiAgICBzdHlsZXMgKz0gJ2ZvbnQtZmFtaWx5OiBhcmlhbDsnO1xuICAgIHN0eWxlcyArPSAnZm9udC13ZWlnaHQ6IDUwMDsnO1xuICAgIHN0eWxlcyArPSAnZm9udC1zaXplOicgKyB0aGlzLl9taW5EaW1lbnNpb24vMiArICdweDsnO1xuICAvLyAgc3R5bGVzICs9ICdoaWdobGlnaHQ6ICNkMTg7JztcbiAgICBzdHlsZXMgKz0gJ2JvcmRlcjogbm9uZTsnO1xuICAgIHN0eWxlcyArPSAnb3V0bGluZTogbm9uZTsnO1xuICAgIHN0eWxlcyArPSAncGFkZGluZzogJyt0aGlzLl9taW5EaW1lbnNpb24vNCsncHggJyt0aGlzLl9taW5EaW1lbnNpb24vNCsncHg7JztcbiAgICBzdHlsZXMgKz0gJ2JveC1zaXppbmc6IGJvcmRlci1ib3g7JztcbiAgICBzdHlsZXMgKz0gJ3VzZXJTZWxlY3Q6IHRleHQ7JztcbiAgICBzdHlsZXMgKz0gJ21velVzZXJTZWxlY3Q6IHRleHQ7JztcbiAgICBzdHlsZXMgKz0gJ3dlYmtpdFVzZXJTZWxlY3Q6IHRleHQ7JztcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY3NzVGV4dCArPSBzdHlsZXM7XG5cbiAgICAvLyB0byBhZGQgZXZlbnR1YWxseVxuICAgIC8vIHZhciBjc3MgPSAnIycrdGhpcy5lbGVtZW50SUQrJzo6c2VsZWN0aW9ueyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCB9JztcblxuICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IHRoaXMudmFsdWU7XG5cbiAgfVxuXG4gIGNvbG9ySW50ZXJmYWNlKCkge1xuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY29sb3IgPSB0aGlzLmNvbG9ycy5kYXJrO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuXG4gICAgdGhpcy5lbGVtZW50LnZhbHVlID0gbWF0aC5wcnVuZSh0aGlzLnZhbHVlLHRoaXMuZGVjaW1hbFBsYWNlcyk7XG5cbiAgfVxuXG4gIGNsaWNrKCkge1xuICAgIHRoaXMuaGFzTW92ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVsZW1lbnQucmVhZE9ubHkgPSB0cnVlO1xuXHQgIHRoaXMuYWN0dWFsID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLmluaXRpYWwgPSB7IHk6IHRoaXMubW91c2UueSB9O1xuICAgIHRoaXMuY2hhbmdlRmFjdG9yID0gbWF0aC5pbnZlcnQoIHRoaXMubW91c2UueCAvIHRoaXMud2lkdGggKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmNoYW5nZUZhY3Rvcik7XG4gIH1cblxuICBtb3ZlKCkge1xuICAgIHRoaXMuaGFzTW92ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcblxuICAgICAgbGV0IG5ld3ZhbHVlID0gdGhpcy5hY3R1YWwgLSAodGhpcy5tb3VzZS55IC0gdGhpcy5pbml0aWFsLnkpICogKCBtYXRoLmNsaXAoIHRoaXMubWF4LXRoaXMubWluLCAwLCAxMDAwICkgLyAyMDAgKSAqIE1hdGgucG93KHRoaXMuY2hhbmdlRmFjdG9yLDIpO1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld3ZhbHVlO1xuXG4gIFx0XHR0aGlzLnJlbmRlcigpO1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlLmNoYW5nZWQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMudmFsdWUpO1xuICAgICAgfVxuXG4gIFx0fVxuICB9XG5cbiAgcmVsZWFzZSgpIHtcbiAgICBpZiAoIXRoaXMuaGFzTW92ZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5yZWFkT25seSA9IGZhbHNlO1xuICBcdFx0dGhpcy5lbGVtZW50LmZvY3VzKCk7XG4gIFx0XHR0aGlzLmVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGhpcy5lbGVtZW50LnZhbHVlLmxlbmd0aCk7XG4gIFx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuICBcdFx0dGhpcy5lbGVtZW50LnN0eWxlLmNvbG9yID0gdGhpcy5jb2xvcnMubGlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgQ29ubmVjdCB0aGlzIG51bWJlciBpbnRlcmZhY2UgdG8gYSBkaWFsIG9yIHNsaWRlclxuICBAcGFyYW0ge0ludGVyZmFjZX0gZWxlbWVudCBFbGVtZW50IHRvIGNvbm5lY3QgdG8uXG4gIEBleGFtcGxlIG51bWJlci5saW5rKHNsaWRlcilcbiAgKi9cbiAgbGluayhkZXN0aW5hdGlvbikge1xuICAgIHRoaXMubWluID0gZGVzdGluYXRpb24ubWluO1xuICAgIHRoaXMubWF4ID0gZGVzdGluYXRpb24ubWF4O1xuICAgIHRoaXMuc3RlcCA9IGRlc3RpbmF0aW9uLnN0ZXA7XG4gICAgZGVzdGluYXRpb24ub24oJ2NoYW5nZScsKHYpID0+IHtcbiAgICAgIHRoaXMucGFzc2l2ZVVwZGF0ZSh2KTtcbiAgICB9KTtcbiAgICB0aGlzLm9uKCdjaGFuZ2UnLCh2KSA9PiB7XG4gICAgICBkZXN0aW5hdGlvbi52YWx1ZSA9IHY7XG4gICAgfSk7XG4gICAgdGhpcy52YWx1ZSA9IGRlc3RpbmF0aW9uLnZhbHVlO1xuICAvKiAgcmV0dXJuIHtcbiAgICAgIGxpc3RlbmVyMTogbGlzdGVuZXIxLFxuICAgICAgbGlzdGVuZXIyOiBsaXN0ZW5lcjIsXG4gICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgIGxpc3RlbmVyMS5yZW1vdmUoKSAob3Igc2ltaWxhcilcbiAgICAgICAgbGlzdGVuZXIyLnJlbW92ZSgpIChvciBzaW1pbGFyKVxuICAgICAgfVxuICAgIH0gKi9cbiAgfVxuXG4gIHBhc3NpdmVVcGRhdGUodikge1xuICAgIHRoaXMuX3ZhbHVlLnVwZGF0ZSh2KTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gIFRoZSBpbnRlcmZhY2UncyBjdXJyZW50IHZhbHVlLiBJZiBzZXQgbWFudWFsbHksIHdpbGwgdXBkYXRlIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cbiAgQHR5cGUge251bWJlcn1cbiAgQGV4YW1wbGUgbnVtYmVyLnZhbHVlID0gMTA7XG4gICovXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHYpIHtcbiAgICB0aGlzLl92YWx1ZS51cGRhdGUodik7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMudmFsdWUpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgTG93ZXIgbGltaXQgb2YgdGhlIG51bWJlcidzIG91dHB1dCByYW5nZVxuICBAdHlwZSB7bnVtYmVyfVxuICBAZXhhbXBsZSBudW1iZXIubWluID0gMTAwMDtcbiAgKi9cbiAgZ2V0IG1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUubWluO1xuICB9XG4gIHNldCBtaW4odikge1xuICAgIHRoaXMuX3ZhbHVlLm1pbiA9IHY7XG4gIH1cblxuICAvKipcbiAgVXBwZXIgbGltaXQgb2YgdGhlIG51bWJlcidzIG91dHB1dCByYW5nZVxuICBAdHlwZSB7bnVtYmVyfVxuICBAZXhhbXBsZSBudW1iZXIubWF4ID0gMTAwMDtcbiAgKi9cbiAgZ2V0IG1heCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUubWF4O1xuICB9XG4gIHNldCBtYXgodikge1xuICAgIHRoaXMuX3ZhbHVlLm1heCA9IHY7XG4gIH1cblxuICAvKipcbiAgVGhlIGluY3JlbWVudCB0aGF0IHRoZSBudW1iZXIncyB2YWx1ZSBjaGFuZ2VzIGJ5LlxuICBAdHlwZSB7bnVtYmVyfVxuICBAZXhhbXBsZSBudW1iZXIuc3RlcCA9IDU7XG4gICovXG4gIGdldCBzdGVwKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5zdGVwO1xuICB9XG4gIHNldCBzdGVwKHYpIHtcbiAgICB0aGlzLl92YWx1ZS5zdGVwID0gdjtcbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvaW50ZXJmYWNlcy9udW1iZXIuanMiLCIndXNlIHN0cmljdCc7XG5cbmxldCBJbnRlcmZhY2UgPSByZXF1aXJlKCcuLi9jb3JlL2ludGVyZmFjZScpO1xuXG4vKipcbiogU2VsZWN0XG4qXG4qIEBkZXNjcmlwdGlvbiBEcm9wZG93biBtZW51XG4qXG4qIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwic2VsZWN0XCI+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgc2VsZWN0ID0gbmV3IE5leHVzLlNlbGVjdCgnI3RhcmdldCcpXG4qXG4qIEBleGFtcGxlXG4qIHZhciBzZWxlY3QgPSBuZXcgTmV4dXMuU2VsZWN0KCcjdGFyZ2V0Jyx7XG4qICAgJ3NpemUnOiBbMTAwLDMwXSxcbiogICAnb3B0aW9ucyc6IFsnZGVmYXVsdCcsJ29wdGlvbnMnXVxuKiB9KVxuKlxuKiBAb3V0cHV0XG4qIGNoYW5nZVxuKiBGaXJlcyBhbnkgdGltZSB0aGUgaW50ZXJmYWNlJ3MgdmFsdWUgY2hhbmdlcy4gPGJyPlxuKiBUaGUgZXZlbnQgZGF0YSBpcyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgdGV4dCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uLCBhcyB3ZWxsIGFzIHRoZSBudW1lcmljIGluZGV4IG9mIHRoZSBzZWxlY3Rpb24uXG4qXG4qIEBvdXRwdXRleGFtcGxlXG4qIHNlbGVjdC5vbignY2hhbmdlJyxmdW5jdGlvbih2KSB7XG4qICAgY29uc29sZS5sb2codik7XG4qIH0pXG4qXG4qXG4qL1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdCBleHRlbmRzIEludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsndmFsdWUnXTtcblxuICAgIGxldCBkZWZhdWx0cyA9IHtcbiAgICAgICAnc2l6ZSc6IFsxMDAsMzBdLFxuICAgICAgICdvcHRpb25zJzogWydkZWZhdWx0Jywnb3B0aW9ucyddXG4gICAgfTtcblxuICAgIHN1cGVyKGFyZ3VtZW50cyxvcHRpb25zLGRlZmF1bHRzKTtcblxuICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSAtMTtcbiAgICB0aGlzLl92YWx1ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5fb3B0aW9ucyA9IHRoaXMuc2V0dGluZ3Mub3B0aW9ucztcblxuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgfVxuXG4gIGJ1aWxkRnJhbWUoKSB7XG4gICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLmZvbnRTaXplID0gdGhpcy5oZWlnaHQvMisncHgnO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5vdXRsaW5lID0gJ25vbmUnO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oaWdobGlnaHQgPSAnbm9uZSc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCsncHgnO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCsncHgnO1xuXG4gICAgdGhpcy5ib3VuZFJlbmRlciA9IHRoaXMucmVuZGVyLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5ib3VuZFJlbmRlcik7XG5cbiAgICB0aGlzLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXG4gIH1cblxuICBhdHRhY2hMaXN0ZW5lcnMoKSB7XG5cbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy5kZWZpbmVPcHRpb25zKCk7XG5cbiAgfVxuXG4gIGNvbG9ySW50ZXJmYWNlKCkge1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmNvbG9ycy5maWxsO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5jb2xvciA9IHRoaXMuY29sb3JzLmRhcms7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLmJvcmRlciA9ICdzb2xpZCAwcHggJyt0aGlzLmNvbG9ycy5tZWRpdW1MaWdodDtcbiAgfVxuXG4gIHJlbmRlcigpIHtcblxuICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5lbGVtZW50Lm9wdGlvbnNbdGhpcy5lbGVtZW50LnNlbGVjdGVkSW5kZXhdLnRleHQ7XG4gICAgdGhpcy5fc2VsZWN0ZWRJbmRleCA9IHRoaXMuZWxlbWVudC5zZWxlY3RlZEluZGV4O1xuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx7XG4gICAgICB2YWx1ZTogdGhpcy5fdmFsdWUsXG4gICAgICBpbmRleDogdGhpcy5fc2VsZWN0ZWRJbmRleFxuICAgIH0pO1xuXG4gIH1cblxuICBjbGljaygpIHtcblxuICB9XG5cbiAgbW92ZSgpIHtcblxuICB9XG5cbiAgcmVsZWFzZSgpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBvcHRpb25zLiBUaGlzIHJlbW92ZXMgYWxsIGV4aXN0aW5nIG9wdGlvbnMgYW5kIGNyZWF0ZXMgYSBuZXcgbGlzdCBvZiBvcHRpb25zLlxuICAgKiBAcGFyYW0gIHthcnJheX0gb3B0aW9ucyBOZXcgYXJyYXkgb2Ygb3B0aW9uc1xuICAgKi9cblxuICBkZWZpbmVPcHRpb25zKG9wdGlvbnMpIHtcblxuICAvKiAgZnVuY3Rpb24gcmVtb3ZlT3B0aW9ucyhzZWxlY3Rib3gpXG4gICAge1xuICAgICAgICB2YXIgaTtcbiAgICAgICAgZm9yKGkgPSBzZWxlY3Rib3gub3B0aW9ucy5sZW5ndGggLSAxIDsgaSA+PSAwIDsgaS0tKVxuICAgICAgICB7XG4gICAgICAgICAgICBzZWxlY3Rib3gucmVtb3ZlKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vdXNpbmcgdGhlIGZ1bmN0aW9uOlxuICAgIHJlbW92ZU9wdGlvbnMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJteVNlbGVjdE9iamVjdFwiKSk7ICovXG5cblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBmb3IobGV0IGk9dGhpcy5lbGVtZW50Lm9wdGlvbnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlKGkpO1xuICAgIH1cblxuICAgIGZvcihsZXQgaT0wO2k8dGhpcy5fb3B0aW9ucy5sZW5ndGg7aSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnQub3B0aW9ucy5hZGQobmV3IE9wdGlvbih0aGlzLl9vcHRpb25zW2ldLCBpKSk7XG4gICAgfVxuXG4gIH1cblxuXG4gIC8qKlxuICBUaGUgdGV4dCBvZiB0aGUgb3B0aW9uIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLiBJZiBzZXQsIHdpbGwgdXBkYXRlIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cbiAgQHR5cGUge1N0cmluZ31cbiAgQGV4YW1wbGUgc2VsZWN0LnZhbHVlID0gXCJzYXd0b290aFwiO1xuICAqL1xuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2KSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2O1xuICAgIGZvcihsZXQgaT0wO2k8dGhpcy5lbGVtZW50Lm9wdGlvbnMubGVuZ3RoO2krKykge1xuICAgICAgaWYgKHYgPT09IHRoaXMuZWxlbWVudC5vcHRpb25zW2ldLnRleHQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgVGhlIG51bWVyaWMgaW5kZXggb2YgdGhlIG9wdGlvbiB0aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZC4gSWYgc2V0LCB3aWxsIHVwZGF0ZSB0aGUgaW50ZXJmYWNlIGFuZCB0cmlnZ2VyIHRoZSBvdXRwdXQgZXZlbnQuXG4gIEB0eXBlIHtudW1iZXJ9XG4gIEBleGFtcGxlIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gMjtcbiAgKi9cbiAgZ2V0IHNlbGVjdGVkSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSW5kZXg7XG4gIH1cbiAgc2V0IHNlbGVjdGVkSW5kZXgodikge1xuICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSB2O1xuICAgIHRoaXMuZWxlbWVudC5zZWxlY3RlZEluZGV4ID0gdjtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgY3VzdG9tRGVzdHJveSgpIHtcbiAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5ib3VuZFJlbmRlcik7XG4gIH1cblxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvaW50ZXJmYWNlcy9zZWxlY3QuanMiLCIndXNlIHN0cmljdCc7XG5cbmxldCBzdmcgPSByZXF1aXJlKCcuLi91dGlsL3N2ZycpO1xubGV0IG1hdGggPSByZXF1aXJlKCcuLi91dGlsL21hdGgnKTtcbmxldCBJbnRlcmZhY2UgPSByZXF1aXJlKCcuLi9jb3JlL2ludGVyZmFjZScpO1xubGV0IFN0ZXAgPSByZXF1aXJlKCcuLi9tb2RlbHMvc3RlcCcpO1xuaW1wb3J0ICogYXMgSW50ZXJhY3Rpb24gZnJvbSAnLi4vdXRpbC9pbnRlcmFjdGlvbic7XG5cbi8qKlxuKiBEaWFsXG4qXG4qXG4qIEBkZXNjcmlwdGlvbiBEaWFsIHdpdGggcmFkaWFsIG9yIGxpbmVhciBpbnRlcmFjdGlvbi5cbipcbiogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJkaWFsXCI+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgZGlhbCA9IG5ldyBOZXh1cy5EaWFsKCcjdGFyZ2V0JylcbipcbiogQGV4YW1wbGVcbiogdmFyIGRpYWwgPSBuZXcgTmV4dXMuRGlhbCgnI3RhcmdldCcse1xuKiAgICdzaXplJzogWzc1LDc1XSxcbiogICAnaW50ZXJhY3Rpb24nOiAncmFkaWFsJywgLy8gXCJyYWRpYWxcIiwgXCJ2ZXJ0aWNhbFwiLCBvciBcImhvcml6b250YWxcIlxuKiAgICdtb2RlJzogJ3JlbGF0aXZlJywgLy8gXCJhYnNvbHV0ZVwiIG9yIFwicmVsYXRpdmVcIlxuKiAgICdtaW4nOiAwLFxuKiAgICdtYXgnOiAxLFxuKiAgICdzdGVwJzogMCxcbiogICAndmFsdWUnOiAwXG4qIH0pXG4qXG4qIEBvdXRwdXRcbiogY2hhbmdlXG4qIEZpcmVzIGFueSB0aW1lIHRoZSBpbnRlcmZhY2UncyB2YWx1ZSBjaGFuZ2VzLiA8YnI+XG4qIFRoZSBldmVudCBkYXRhIGlzIHRoZSBudW1iZXIgdmFsdWUgb2YgdGhlIGludGVyZmFjZS5cbipcbiogQG91dHB1dGV4YW1wbGVcbiogZGlhbC5vbignY2hhbmdlJyxmdW5jdGlvbih2KSB7XG4qICAgY29uc29sZS5sb2codik7XG4qIH0pXG4qXG4qIEB0dXRvcmlhbFxuKiBEaWFsXG4qIHlnR014cVxuKlxuKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlhbCBleHRlbmRzIEludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsnbWluJywnbWF4JywndmFsdWUnXTtcblxuICAgIGxldCBkZWZhdWx0cyA9IHtcbiAgICAgICdzaXplJzogWzc1LDc1XSxcbiAgICAgICdpbnRlcmFjdGlvbic6ICdyYWRpYWwnLCAvLyByYWRpYWwsIHZlcnRpY2FsLCBob3Jpem9udGFsXG4gICAgICAnbW9kZSc6ICdyZWxhdGl2ZScsIC8vIGFic29sdXRlLCByZWxhdGl2ZVxuICAgICAgJ21pbic6IDAsXG4gICAgICAnbWF4JzogMSxcbiAgICAgICdzdGVwJzogMCxcbiAgICAgICd2YWx1ZSc6IDBcbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG4gICAgdGhpcy5pbnRlcmFjdGlvbiA9IHRoaXMuc2V0dGluZ3MuaW50ZXJhY3Rpb247XG5cbiAgICB0aGlzLl92YWx1ZSA9IG5ldyBTdGVwKHRoaXMuc2V0dGluZ3MubWluLCB0aGlzLnNldHRpbmdzLm1heCwgdGhpcy5zZXR0aW5ncy5zdGVwLCB0aGlzLnNldHRpbmdzLnZhbHVlKTtcblxuICAgIHRoaXMucG9zaXRpb24gPSBuZXcgSW50ZXJhY3Rpb24uSGFuZGxlKHRoaXMuc2V0dGluZ3MubW9kZSx0aGlzLmludGVyYWN0aW9uLFswLHRoaXMud2lkdGhdLFt0aGlzLmhlaWdodCwwXSk7XG5cbiAgICB0aGlzLmluaXQoKTtcblxuICAgIHRoaXMudmFsdWUgPSB0aGlzLl92YWx1ZS52YWx1ZTtcblxuICAgIHRoaXMucG9zaXRpb24udmFsdWUgPSB0aGlzLl92YWx1ZS5ub3JtYWxpemVkO1xuXG4gICAgdGhpcy5wcmV2aW91c0FuZ2xlID0gZmFsc2U7XG5cbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy52YWx1ZSk7XG5cbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy5iYWNrZ3JvdW5kID0gc3ZnLmNyZWF0ZSgnY2lyY2xlJyk7XG4gICAgdGhpcy5zY3JldyA9IHN2Zy5jcmVhdGUoJ2NpcmNsZScpO1xuICAgIHRoaXMuaGFuZGxlID0gc3ZnLmNyZWF0ZSgncGF0aCcpO1xuICAgIHRoaXMuaGFuZGxlMiA9IHN2Zy5jcmVhdGUoJ3BhdGgnKTtcbiAgICB0aGlzLmhhbmRsZUZpbGwgPSBzdmcuY3JlYXRlKCdwYXRoJyk7XG4gICAgdGhpcy5oYW5kbGUyRmlsbCA9IHN2Zy5jcmVhdGUoJ3BhdGgnKTtcbiAgICB0aGlzLmhhbmRsZUxpbmUgPSBzdmcuY3JlYXRlKCdwYXRoJyk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYWNrZ3JvdW5kKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oYW5kbGUpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhhbmRsZTIpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhhbmRsZUZpbGwpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhhbmRsZTJGaWxsKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oYW5kbGVMaW5lKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zY3Jldyk7XG5cbiAgfVxuXG5cbiAgc2l6ZUludGVyZmFjZSgpIHtcblxuICAgIHRoaXMucG9zaXRpb24ucmVzaXplKFswLHRoaXMud2lkdGhdLFt0aGlzLmhlaWdodCwwXSk7XG5cbiAgICBsZXQgY2VudGVyID0ge1xuICAgICAgeDogdGhpcy53aWR0aC8yLFxuICAgICAgeTogdGhpcy5oZWlnaHQvMlxuICAgIH07XG5cbiAgICBsZXQgZGlhbWV0ZXIgPSBNYXRoLm1pbih0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcblxuICAgIHRoaXMuYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoJ2N4JywgY2VudGVyLngpO1xuICAgIHRoaXMuYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoJ2N5JywgY2VudGVyLnkpO1xuICAgIHRoaXMuYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoJ3InLCBkaWFtZXRlci8yLWRpYW1ldGVyLzQwKTtcblxuICAgIHRoaXMuc2NyZXcuc2V0QXR0cmlidXRlKCdjeCcsIGNlbnRlci54KTtcbiAgICB0aGlzLnNjcmV3LnNldEF0dHJpYnV0ZSgnY3knLCBjZW50ZXIueSk7XG4gICAgdGhpcy5zY3Jldy5zZXRBdHRyaWJ1dGUoJ3InLCBkaWFtZXRlci8xMik7XG5cbiAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlO1xuXG4gICAgbGV0IGhhbmRsZVBvaW50cyA9IHtcbiAgICAgIHN0YXJ0OiBNYXRoLlBJKjEuNSxcbiAgICAgIGVuZDogbWF0aC5jbGlwKCBtYXRoLnNjYWxlKHZhbHVlLDAsMC41LE1hdGguUEkqMS41LE1hdGguUEkqMC41KSAsIE1hdGguUEkqMC41LCBNYXRoLlBJKjEuNSApXG4gICAgfTtcbiAgICBsZXQgaGFuZGxlMlBvaW50cyA9IHtcbiAgICAgIHN0YXJ0OiBNYXRoLlBJKjIuNSxcbiAgICAgIGVuZDogbWF0aC5jbGlwKCBtYXRoLnNjYWxlKHZhbHVlLDAuNSwxLE1hdGguUEkqMi41LE1hdGguUEkqMS41KSAsIE1hdGguUEkqMS41LCBNYXRoLlBJKjIuNSApXG4gICAgfTtcblxuICAgIGxldCBoYW5kbGVQYXRoID0gc3ZnLmFyYyhjZW50ZXIueCwgY2VudGVyLnksIGRpYW1ldGVyLzItZGlhbWV0ZXIvNDAsIGhhbmRsZVBvaW50cy5zdGFydCwgaGFuZGxlUG9pbnRzLmVuZCk7XG4gICAgbGV0IGhhbmRsZTJQYXRoID0gc3ZnLmFyYyhjZW50ZXIueCwgY2VudGVyLnksIGRpYW1ldGVyLzItZGlhbWV0ZXIvNDAsIGhhbmRsZTJQb2ludHMuc3RhcnQsIGhhbmRsZTJQb2ludHMuZW5kKTtcblxuICAgIHRoaXMuaGFuZGxlLnNldEF0dHJpYnV0ZSgnZCcsaGFuZGxlUGF0aCk7XG4gICAgdGhpcy5oYW5kbGUuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBkaWFtZXRlci8yMCk7XG4gICAgdGhpcy5oYW5kbGUuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcblxuICAgIHRoaXMuaGFuZGxlMi5zZXRBdHRyaWJ1dGUoJ2QnLGhhbmRsZTJQYXRoKTtcbiAgICB0aGlzLmhhbmRsZTIuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBkaWFtZXRlci8yMCk7XG4gICAgdGhpcy5oYW5kbGUyLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG5cbiAgICBoYW5kbGVQYXRoICs9ICcgTCAnK2NlbnRlci54KycgJytjZW50ZXIueTtcblxuICAgIHRoaXMuaGFuZGxlRmlsbC5zZXRBdHRyaWJ1dGUoJ2QnLGhhbmRsZVBhdGgpO1xuICAgIHRoaXMuaGFuZGxlRmlsbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjMnKTtcblxuICAgIGhhbmRsZTJQYXRoICs9ICcgTCAnK2NlbnRlci54KycgJytjZW50ZXIueTtcblxuICAgIHRoaXMuaGFuZGxlMkZpbGwuc2V0QXR0cmlidXRlKCdkJyxoYW5kbGUyUGF0aCk7XG4gICAgdGhpcy5oYW5kbGUyRmlsbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwtb3BhY2l0eScsICcwLjMnKTtcblxuICAgIGxldCBhcmNFbmRpbmdBO1xuICAgIGlmICh2YWx1ZSA8IDAuNSkge1xuICAgICAgYXJjRW5kaW5nQSA9IGhhbmRsZVBvaW50cy5lbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyY0VuZGluZ0EgPSBoYW5kbGUyUG9pbnRzLmVuZDtcbiAgICB9XG5cbiAgICBsZXQgYXJjRW5kaW5nWCA9IGNlbnRlci54ICsgTWF0aC5jb3MoYXJjRW5kaW5nQSkgKiAoZGlhbWV0ZXIvMik7XG4gICAgbGV0IGFyY0VuZGluZ1kgPSBjZW50ZXIueSArIE1hdGguc2luKGFyY0VuZGluZ0EpICogKGRpYW1ldGVyLzIpICogLTE7XG5cbiAgICB0aGlzLmhhbmRsZUxpbmUuc2V0QXR0cmlidXRlKCdkJywnTSAnK2NlbnRlci54KycgJytjZW50ZXIueSsnIEwgJythcmNFbmRpbmdYKycgJythcmNFbmRpbmdZKTtcbiAgICB0aGlzLmhhbmRsZUxpbmUuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBkaWFtZXRlci8yMCk7XG5cbiAgfVxuXG4gIGNvbG9ySW50ZXJmYWNlKCkge1xuICAgIHRoaXMuYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5maWxsKTtcbiAgICB0aGlzLnNjcmV3LnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmFjY2VudCk7XG4gICAgdGhpcy5oYW5kbGUuc2V0QXR0cmlidXRlKCdzdHJva2UnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICAgIHRoaXMuaGFuZGxlMi5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMuY29sb3JzLmFjY2VudCk7XG4gICAgdGhpcy5oYW5kbGVGaWxsLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmFjY2VudCk7XG4gICAgdGhpcy5oYW5kbGUyRmlsbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICAgIHRoaXMuaGFuZGxlTGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLl92YWx1ZS5ub3JtYWxpemVkO1xuXG4gICAgbGV0IGNlbnRlciA9IHtcbiAgICAgIHg6IHRoaXMud2lkdGgvMixcbiAgICAgIHk6IHRoaXMuaGVpZ2h0LzJcbiAgICB9O1xuXG4gICAgbGV0IGRpYW1ldGVyID0gTWF0aC5taW4odGhpcy53aWR0aCx0aGlzLmhlaWdodCk7XG5cbiAgICBsZXQgaGFuZGxlUG9pbnRzID0ge1xuICAgICAgc3RhcnQ6IE1hdGguUEkqMS41LFxuICAgICAgZW5kOiBtYXRoLmNsaXAoIG1hdGguc2NhbGUodmFsdWUsMCwwLjUsTWF0aC5QSSoxLjUsTWF0aC5QSSowLjUpICwgTWF0aC5QSSowLjUsIE1hdGguUEkqMS41IClcbiAgICB9O1xuICAgIGxldCBoYW5kbGUyUG9pbnRzID0ge1xuICAgICAgc3RhcnQ6IE1hdGguUEkgKjIuNSxcbiAgICAgIGVuZDogbWF0aC5jbGlwKCBtYXRoLnNjYWxlKHZhbHVlLDAuNSwxLE1hdGguUEkqMi41LE1hdGguUEkqMS41KSAsIE1hdGguUEkqMS41LCBNYXRoLlBJKjIuNSApXG4gICAgfTtcblxuICAgIGxldCBoYW5kbGVQYXRoID0gc3ZnLmFyYyhjZW50ZXIueCwgY2VudGVyLnksIGRpYW1ldGVyLzItZGlhbWV0ZXIvNDAsIGhhbmRsZVBvaW50cy5zdGFydCwgaGFuZGxlUG9pbnRzLmVuZCk7XG4gICAgbGV0IGhhbmRsZTJQYXRoID0gc3ZnLmFyYyhjZW50ZXIueCwgY2VudGVyLnksIGRpYW1ldGVyLzItZGlhbWV0ZXIvNDAsIGhhbmRsZTJQb2ludHMuc3RhcnQsIGhhbmRsZTJQb2ludHMuZW5kKTtcblxuICAgIHRoaXMuaGFuZGxlLnNldEF0dHJpYnV0ZSgnZCcsaGFuZGxlUGF0aCk7XG4gICAgdGhpcy5oYW5kbGUyLnNldEF0dHJpYnV0ZSgnZCcsaGFuZGxlMlBhdGgpO1xuXG5cbiAgICBoYW5kbGVQYXRoICs9ICcgTCAnK2NlbnRlci54KycgJytjZW50ZXIueTtcblxuICAgIHRoaXMuaGFuZGxlRmlsbC5zZXRBdHRyaWJ1dGUoJ2QnLGhhbmRsZVBhdGgpO1xuXG4gICAgaGFuZGxlMlBhdGggKz0gJyBMICcrY2VudGVyLngrJyAnK2NlbnRlci55O1xuXG4gICAgdGhpcy5oYW5kbGUyRmlsbC5zZXRBdHRyaWJ1dGUoJ2QnLGhhbmRsZTJQYXRoKTtcblxuICAgIGxldCBhcmNFbmRpbmdBO1xuICAgIGlmICh2YWx1ZSA8PSAwLjUpIHtcbiAgICAgIGFyY0VuZGluZ0EgPSBoYW5kbGVQb2ludHMuZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmNFbmRpbmdBID0gaGFuZGxlMlBvaW50cy5lbmQ7XG4gICAgfVxuXG4gICAgbGV0IGFyY0VuZGluZ1ggPSBjZW50ZXIueCArIE1hdGguY29zKGFyY0VuZGluZ0EpICogKGRpYW1ldGVyLzIpO1xuICAgIGxldCBhcmNFbmRpbmdZID0gY2VudGVyLnkgKyBNYXRoLnNpbihhcmNFbmRpbmdBKSAqIChkaWFtZXRlci8yKSAqIC0xO1xuXG4gICAgdGhpcy5oYW5kbGVMaW5lLnNldEF0dHJpYnV0ZSgnZCcsJ00gJytjZW50ZXIueCsnICcrY2VudGVyLnkrJyBMICcrYXJjRW5kaW5nWCsnICcrYXJjRW5kaW5nWSk7XG5cbiAgfVxuXG5cbiAgY2xpY2soKSB7XG4gICAgaWYgKHRoaXMubW9kZT09PSdyZWxhdGl2ZScpIHtcbiAgICAgIHRoaXMucHJldmlvdXNBbmdsZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnBvc2l0aW9uLmFuY2hvciA9IHRoaXMubW91c2U7XG4gICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG4gICAgdGhpcy5tb3ZlKCk7XG4gICB9XG5cbiAgbW92ZSgpIHtcbiAgICBpZiAodGhpcy5jbGlja2VkKSB7XG5cbiAgICAgIHRoaXMucG9zaXRpb24udXBkYXRlKHRoaXMubW91c2UpO1xuXG4gICAgICBsZXQgYW5nbGUgPSB0aGlzLnBvc2l0aW9uLnZhbHVlKk1hdGguUEkqMjtcblxuICAgICAgaWYgKGFuZ2xlIDwgMCApIHsgYW5nbGUgKz0gKE1hdGguUEkqMik7IH1cblxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3JlbGF0aXZlJykge1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FuZ2xlICE9PSBmYWxzZSAmJiBNYXRoLmFicyh0aGlzLnByZXZpb3VzQW5nbGUgLSBhbmdsZSkgPiAyKSB7XG4gICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNBbmdsZSA+IDMpIHtcbiAgICAgICAgICAgIGFuZ2xlID0gTWF0aC5QSSoyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmdsZSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IC8qIGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FuZ2xlICE9PSBmYWxzZSAmJiBNYXRoLmFicyh0aGlzLnByZXZpb3VzQW5nbGUgLSBhbmdsZSkgPiAyKSB7XG4gICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNBbmdsZSA+IDMpIHtcbiAgICAgICAgICAgIGFuZ2xlID0gTWF0aC5QSSoyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmdsZSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9ICovXG4gICAgICB0aGlzLnByZXZpb3VzQW5nbGUgPSBhbmdsZTtcblxuICAgICAgbGV0IHJlYWxWYWx1ZSA9IGFuZ2xlIC8gKE1hdGguUEkqMik7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl92YWx1ZS51cGRhdGVOb3JtYWwoIHJlYWxWYWx1ZSApO1xuXG4gICAgICBpZiAodGhpcy5tb2RlID09PSAncmVsYXRpdmUnKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24udmFsdWUgPSByZWFsVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLl92YWx1ZS52YWx1ZSk7XG5cbiAgICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgICB9XG4gIH1cblxuICByZWxlYXNlKCkge1xuICB9XG5cbiAgLypcbiAgRGlhbCdzIHZhbHVlLiBXaGVuIHNldCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkanVzdCB0byBmaXQgbWluL21heC9zdGVwIHNldHRpbmdzIG9mIHRoZSBpbnRlcmZhY2UuXG4gIEB0eXBlIHtudW1iZXJ9XG4gIEBleGFtcGxlIGRpYWwudmFsdWUgPSAxMDtcblxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnZhbHVlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5fdmFsdWUudXBkYXRlKHZhbHVlKTtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy52YWx1ZSk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuKi9cblxuICAgIC8qKlxuICAgIERpYWwncyB2YWx1ZS4gV2hlbiBzZXQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGp1c3QgdG8gZml0IG1pbi9tYXgvc3RlcCBzZXR0aW5ncyBvZiB0aGUgaW50ZXJmYWNlLlxuICAgIEB0eXBlIHtudW1iZXJ9XG4gICAgQGV4YW1wbGUgZGlhbC52YWx1ZSA9IDEwO1xuICAgICovXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnZhbHVlO1xuICAgIH1cbiAgICBzZXQgdmFsdWUodikge1xuICAgICAgdGhpcy5fdmFsdWUudXBkYXRlKHYpO1xuICAgICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5fdmFsdWUudmFsdWUpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICBMb3dlciBsaW1pdCBvZiB0aGUgZGlhbCdzIG91dHB1dCByYW5nZVxuICAgIEB0eXBlIHtudW1iZXJ9XG4gICAgQGV4YW1wbGUgZGlhbC5taW4gPSAxMDAwO1xuICAgICovXG4gICAgZ2V0IG1pbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5taW47XG4gICAgfVxuICAgIHNldCBtaW4odikge1xuICAgICAgdGhpcy5fdmFsdWUubWluID0gdjtcbiAgICB9XG5cbiAgICAvKipcbiAgICBVcHBlciBsaW1pdCBvZiB0aGUgZGlhbCdzIG91dHB1dCByYW5nZVxuICAgIEB0eXBlIHtudW1iZXJ9XG4gICAgQGV4YW1wbGUgZGlhbC5tYXggPSAxMDAwO1xuICAgICovXG4gICAgZ2V0IG1heCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5tYXg7XG4gICAgfVxuICAgIHNldCBtYXgodikge1xuICAgICAgdGhpcy5fdmFsdWUubWF4ID0gdjtcbiAgICB9XG5cbiAgICAvKipcbiAgICBUaGUgaW5jcmVtZW50IHRoYXQgdGhlIGRpYWwncyB2YWx1ZSBjaGFuZ2VzIGJ5LlxuICAgIEB0eXBlIHtudW1iZXJ9XG4gICAgQGV4YW1wbGUgZGlhbC5zdGVwID0gNTtcbiAgICAqL1xuICAgIGdldCBzdGVwKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnN0ZXA7XG4gICAgfVxuICAgIHNldCBzdGVwKHYpIHtcbiAgICAgIHRoaXMuX3ZhbHVlLnN0ZXAgPSB2O1xuICAgIH1cblxuICAgIC8qKlxuICAgIEFic29sdXRlIG1vZGUgKGRpYWwncyB2YWx1ZSBqdW1wcyB0byBtb3VzZSBjbGljayBwb3NpdGlvbikgb3IgcmVsYXRpdmUgbW9kZSAobW91c2UgZHJhZyBjaGFuZ2VzIHZhbHVlIHJlbGF0aXZlIHRvIGl0cyBjdXJyZW50IHBvc2l0aW9uKS4gRGVmYXVsdDogXCJyZWxhdGl2ZVwiLlxuICAgIEB0eXBlIHtzdHJpbmd9XG4gICAgQGV4YW1wbGUgZGlhbC5tb2RlID0gXCJyZWxhdGl2ZVwiO1xuICAgICovXG4gICAgZ2V0IG1vZGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi5tb2RlO1xuICAgIH1cbiAgICBzZXQgbW9kZSh2KSB7XG4gICAgICB0aGlzLnBvc2l0aW9uLm1vZGUgPSB2O1xuICAgIH1cblxuXG4gIC8qKlxuICBOb3JtYWxpemVkIHZhbHVlIG9mIHRoZSBkaWFsLlxuICBAdHlwZSB7bnVtYmVyfVxuICBAZXhhbXBsZSBkaWFsLm5vcm1hbGl6ZWQgPSAwLjU7XG4gICovXG4gIGdldCBub3JtYWxpemVkKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5ub3JtYWxpemVkO1xuICB9XG5cbiAgc2V0IG5vcm1hbGl6ZWQodikge1xuICAgIHRoaXMuX3ZhbHVlLnVwZGF0ZU5vcm1hbCh2KTtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy52YWx1ZSk7XG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL2ludGVyZmFjZXMvZGlhbC5qcyIsIid1c2Ugc3RyaWN0JztcblxubGV0IHN2ZyA9IHJlcXVpcmUoJy4uL3V0aWwvc3ZnJyk7XG5sZXQgSW50ZXJmYWNlID0gcmVxdWlyZSgnLi4vY29yZS9pbnRlcmZhY2UnKTtcbmxldCBCdXR0b25UZW1wbGF0ZSA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvYnV0dG9udGVtcGxhdGUnKTtcbmxldCB0b3VjaCA9IHJlcXVpcmUoJy4uL3V0aWwvdG91Y2gnKTtcblxuY2xhc3MgUGlhbm9LZXkgZXh0ZW5kcyBCdXR0b25UZW1wbGF0ZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsndmFsdWUnLCdub3RlJywnY29sb3InXTtcblxuICAgIGxldCBkZWZhdWx0cyA9IHtcbiAgICAgICdzaXplJzogWzgwLDgwXSxcbiAgICAgICd0YXJnZXQnOiBmYWxzZSxcbiAgICAgICdtb2RlJzogJ2J1dHRvbicsXG4gICAgICAndmFsdWUnOiAwXG4gICAgfTtcblxuICAgIHN1cGVyKGFyZ3VtZW50cyxvcHRpb25zLGRlZmF1bHRzKTtcblxuICAgIHRoaXMubm90ZSA9IHRoaXMuc2V0dGluZ3Mubm90ZTtcbiAgICB0aGlzLmNvbG9yID0gdGhpcy5zZXR0aW5ncy5jb2xvcjtcblxuICAgIHRoaXMuY29sb3JzID0ge1xuICAgICAgJ3cnOiAnI2ZmZicsXG4gICAgICAnYic6ICcjNjY2JyxcbiAgICB9O1xuXG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcblxuICB9XG5cbiAgYnVpbGRGcmFtZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQgPSBzdmcuY3JlYXRlKCdzdmcnKTtcbiAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsdGhpcy53aWR0aCk7XG4gICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jyx0aGlzLmhlaWdodCk7XG4gICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy5wYWQgPSBzdmcuY3JlYXRlKCdyZWN0Jyk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wYWQpO1xuXG4gICAgdGhpcy5pbnRlcmFjdGlvblRhcmdldCA9IHRoaXMucGFkO1xuXG4gICAgLyogZXZlbnRzICovXG5cbiAgICBpZiAoIXRvdWNoLmV4aXN0cykge1xuXG4gICAgICB0aGlzLmNsaWNrID0gKCkgPT4ge1xuICAgICAgLy8gIGNvbnNvbGUubG9nKCdjbGljaycpO1xuICAgICAgICB0aGlzLnBpYW5vLmludGVyYWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5waWFuby5wYWludGJydXNoID0gIXRoaXMuc3RhdGU7XG4gICAgICAgIHRoaXMuZG93bih0aGlzLnBpYW5vLnBhaW50YnJ1c2gpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5wYWQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5waWFuby5pbnRlcmFjdGluZykge1xuICAgICAgLy8gICAgY29uc29sZS5sb2coJ21vdXNlb3ZlcicpO1xuICAgICAgICAgIHRoaXMuZG93bih0aGlzLnBpYW5vLnBhaW50YnJ1c2gpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuXG4gICAgICB0aGlzLm1vdmUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBpYW5vLmludGVyYWN0aW5nKSB7XG4gICAgICAgIC8vICBjb25zb2xlLmxvZygnbW92ZScpO1xuICAgICAgICAgIHRoaXMuYmVuZCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG5cbiAgICAgIHRoaXMucmVsZWFzZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5waWFuby5pbnRlcmFjdGluZyA9IGZhbHNlO1xuICAgICAgLy8gIGNvbnNvbGUubG9nKCdyZWxlYXNlJyk7XG4gICAgICAvLyAgdGhpcy51cCgpO1xuICAgICAgfTtcbiAgICAgIHRoaXMucGFkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBpYW5vLmludGVyYWN0aW5nKSB7XG4gICAgICAgIC8vICBjb25zb2xlLmxvZygnbW91c2V1cCcpO1xuICAgICAgICAgIHRoaXMudXAoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBhZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGlhbm8uaW50ZXJhY3RpbmcpIHtcbiAgICAgICAgLy8gIGNvbnNvbGUubG9nKCdtb3VzZW91dCcpO1xuICAgICAgICAgIHRoaXMudXAoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB9XG5cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICAgICAgLy9sZXQgcmFkaXVzID0gTWF0aC5taW4odGhpcy53aWR0aCx0aGlzLmhlaWdodCkgLyA1O1xuICAgICAgICBsZXQgcmFkaXVzID0gMDtcblxuICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ3gnLDAuNSk7XG4gICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgneScsMC41KTtcbiAgICAgICAgaWYgKHRoaXMud2lkdGggPiAyKSB7XG4gICAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMud2lkdGggLSAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdGhpcy53aWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0ID4gMikge1xuICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgncngnLCByYWRpdXMpO1xuICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ3J5JywgcmFkaXVzKTtcblxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5zdGF0ZSkge1xuICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5jb2xvcnNbdGhpcy5jb2xvcl0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICAgIH1cbiAgfVxuXG59XG5cbi8qKlxuKiBQaWFub1xuKlxuKiBAZGVzY3JpcHRpb24gUGlhbm8ga2V5Ym9hcmQgaW50ZXJmYWNlXG4qXG4qIEBkZW1vIDxkaXYgbmV4dXMtdWk9XCJwaWFub1wiPjwvZGl2PlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgcGlhbm8gPSBuZXcgTmV4dXMuUGlhbm8oJyN0YXJnZXQnKVxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgcGlhbm8gPSBuZXcgTmV4dXMuUGlhbm8oJyN0YXJnZXQnLHtcbiogICAgICdzaXplJzogWzUwMCwxMjVdLFxuKiAgICAgJ21vZGUnOiAnYnV0dG9uJywgIC8vICdidXR0b24nLCAndG9nZ2xlJywgb3IgJ2ltcHVsc2UnXG4qICAgICAnbG93Tm90ZSc6IDI0LFxuKiAgICAgJ2hpZ2hOb3RlJzogNjBcbiogfSlcbipcbiogQG91dHB1dFxuKiBjaGFuZ2VcbiogRmlyZXMgYW55IHRpbWUgYSBuZXcga2V5IGlzIHByZXNzZWQgb3IgcmVsZWFzZWQgPGJyPlxuKiBUaGUgZXZlbnQgZGF0YSBpcyBhbiBvYmplY3QgY29udGFpbmluZyA8aT5ub3RlPC9pPiBhbmQgPGk+c3RhdGU8L2k+IHByb3BlcnRpZXMuXG4qXG4qIEBvdXRwdXRleGFtcGxlXG4qIHBpYW5vLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcbiogICBjb25zb2xlLmxvZyh2KTtcbiogfSlcbipcbiovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBpYW5vIGV4dGVuZHMgSW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIGxldCBvcHRpb25zID0gWyd2YWx1ZSddO1xuXG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgJ3NpemUnOiBbNTAwLDEyNV0sXG4gICAgICAnbG93Tm90ZSc6IDI0LFxuICAgICAgJ2hpZ2hOb3RlJzogNjAsXG4gICAgICAnbW9kZSc6ICdidXR0b24nXG4gICAgfTtcblxuICAgIHN1cGVyKGFyZ3VtZW50cyxvcHRpb25zLGRlZmF1bHRzKTtcblxuICAgIHRoaXMua2V5UGF0dGVybiA9IFsndycsJ2InLCd3JywnYicsJ3cnLCd3JywnYicsJ3cnLCdiJywndycsJ2InLCd3J107XG5cbiAgICB0aGlzLnBhaW50YnJ1c2ggPSBmYWxzZTtcblxuICAgIHRoaXMubW9kZSA9IHRoaXMuc2V0dGluZ3MubW9kZTtcblxuICAgIHRoaXMucmFuZ2UgPSB7XG4gICAgICBsb3c6IHRoaXMuc2V0dGluZ3MubG93Tm90ZSxcbiAgICAgIGhpZ2g6IHRoaXMuc2V0dGluZ3MuaGlnaE5vdGVcbiAgICB9O1xuXG4gICAgdGhpcy5yYW5nZS5zaXplID0gdGhpcy5yYW5nZS5oaWdoIC0gdGhpcy5yYW5nZS5sb3c7XG5cbiAgICB0aGlzLmtleXMgPSBbXTtcblxuICAgIHRoaXMudG9nZ2xlVG8gPSBmYWxzZTtcblxuICAgIHRoaXMuaW5pdCgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgfVxuXG4gIGJ1aWxkRnJhbWUoKSB7XG4gICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzBweCc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICBidWlsZEludGVyZmFjZSgpIHtcblxuICAgIHRoaXMua2V5cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaT0wO2k8dGhpcy5yYW5nZS5oaWdoIC0gdGhpcy5yYW5nZS5sb3c7aSsrKSB7XG5cbiAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICBsZXQgc2NhbGVJbmRleCA9IChpK3RoaXMucmFuZ2UubG93KSAlIHRoaXMua2V5UGF0dGVybi5sZW5ndGg7XG5cbiAgICAgIGxldCBrZXkgPSBuZXcgUGlhbm9LZXkoY29udGFpbmVyLCB7XG4gICAgICAgICAgY29tcG9uZW50OiB0cnVlLFxuICAgICAgICAgIG5vdGU6IGkrdGhpcy5yYW5nZS5sb3csXG4gICAgICAgICAgY29sb3I6IHRoaXMua2V5UGF0dGVybltzY2FsZUluZGV4XSxcbiAgICAgICAgICBtb2RlOiB0aGlzLm1vZGVcbiAgICAgICAgfSwgdGhpcy5rZXlDaGFuZ2UuYmluZCh0aGlzLGkrdGhpcy5yYW5nZS5sb3cpKTtcblxuICAgICAga2V5LnBpYW5vID0gdGhpcztcblxuICAgICAgaWYgKHRvdWNoLmV4aXN0cykge1xuICAgICAgICBrZXkucGFkLmluZGV4ID0gaTtcbiAgICAgICAga2V5LnByZUNsaWNrID0ga2V5LnByZU1vdmUgPSBrZXkucHJlUmVsZWFzZSA9ICgpID0+IHt9O1xuICAgICAgICBrZXkuY2xpY2sgPSBrZXkubW92ZSA9IGtleS5yZWxlYXNlID0gKCkgPT4ge307XG4gICAgICAgIGtleS5wcmVUb3VjaCA9IGtleS5wcmVUb3VjaE1vdmUgPSBrZXkucHJlVG91Y2hSZWxlYXNlID0gKCkgPT4ge307XG4gICAgICAgIGtleS50b3VjaCA9IGtleS50b3VjaE1vdmUgPSBrZXkudG91Y2hSZWxlYXNlID0gKCkgPT4ge307XG4gICAgICB9XG5cbiAgICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblxuICAgIH1cbiAgICBpZiAodG91Y2guZXhpc3RzKSB7XG4gICAgICB0aGlzLmFkZFRvdWNoTGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gIH1cblxuICBzaXplSW50ZXJmYWNlKCkge1xuXG4gICAgbGV0IGtleVggPSAwO1xuXG4gICAgbGV0IGtleVBvc2l0aW9ucyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaT0wO2k8dGhpcy5yYW5nZS5oaWdoIC0gdGhpcy5yYW5nZS5sb3c7aSsrKSB7XG5cbiAgICAgIGtleVBvc2l0aW9ucy5wdXNoKGtleVgpO1xuXG4gICAgICBsZXQgc2NhbGVJbmRleCA9IChpK3RoaXMucmFuZ2UubG93KSAlIHRoaXMua2V5UGF0dGVybi5sZW5ndGg7XG4gICAgICBsZXQgbmV4dFNjYWxlSW5kZXggPSAoaSsxK3RoaXMucmFuZ2UubG93KSAlIHRoaXMua2V5UGF0dGVybi5sZW5ndGg7XG4gICAgICBpZiAoaSsxK3RoaXMucmFuZ2UubG93ID49IHRoaXMucmFuZ2UuaGlnaCkge1xuICAgICAgICBrZXlYICs9IDE7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMua2V5UGF0dGVybltzY2FsZUluZGV4XSA9PT0gJ3cnICYmIHRoaXMua2V5UGF0dGVybltuZXh0U2NhbGVJbmRleF0gPT09ICd3Jykge1xuICAgICAgICBrZXlYICs9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlYICs9IDAuNTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGtleXNXaWRlID0ga2V5WDtcblxuXG4gIC8vICBsZXQgcGFkZGluZyA9IHRoaXMud2lkdGggLyAxMjA7XG4gICAgbGV0IHBhZGRpbmcgPSAxO1xuICAgIGxldCBidXR0b25XaWR0aCA9ICh0aGlzLndpZHRoLXBhZGRpbmcqMikgLyBrZXlzV2lkZTtcbiAgICBsZXQgYnV0dG9uSGVpZ2h0ID0gKHRoaXMuaGVpZ2h0LXBhZGRpbmcqMikgLyAyO1xuXG4gICAgZm9yIChsZXQgaT0wO2k8dGhpcy5rZXlzLmxlbmd0aDtpKyspIHtcblxuICAgICAgbGV0IGNvbnRhaW5lciA9IHRoaXMua2V5c1tpXS5wYXJlbnQ7XG4gICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSAoa2V5UG9zaXRpb25zW2ldKmJ1dHRvbldpZHRoK3BhZGRpbmcpICsgJ3B4JztcbiAgICAgIGlmICh0aGlzLmtleXNbaV0uY29sb3IgPT09ICd3Jykge1xuICAgICAgICBjb250YWluZXIuc3R5bGUudG9wID0gKHBhZGRpbmcpICsgJ3B4JztcbiAgICAgICAgdGhpcy5rZXlzW2ldLnJlc2l6ZShidXR0b25XaWR0aCwgYnV0dG9uSGVpZ2h0KjIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnpJbmRleCA9IDE7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSBwYWRkaW5nKydweCc7XG4gICAgICAgIHRoaXMua2V5c1tpXS5yZXNpemUoYnV0dG9uV2lkdGgsIGJ1dHRvbkhlaWdodCoxLjEpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcblxuICAgIC8vIFBpYW5vIGtleXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIHN0cm9rZSBib3JkZXJcbiAgICAvLyBUaGV5IGhhdmUgc3BhY2UgYmV0d2VlbiB0aGVtLCB3aGljaCBzaG93cyB0aGUgUGlhbm8gYmcgY29sb3JcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQ7XG5cbiAgICBmb3IgKGxldCBpPTA7aTx0aGlzLmtleXMubGVuZ3RoO2krKykge1xuICAgICAgdGhpcy5rZXlzW2ldLmNvbG9ycyA9IHtcbiAgICAgICAgJ3cnOiB0aGlzLmNvbG9ycy5saWdodCxcbiAgICAgICAgJ2InOiB0aGlzLmNvbG9ycy5kYXJrLFxuICAgICAgICAnYWNjZW50JzogdGhpcy5jb2xvcnMuYWNjZW50LFxuICAgICAgICAnYm9yZGVyJzogdGhpcy5jb2xvcnMubWVkaXVtTGlnaHRcbiAgICAgIH07XG4gICAgICB0aGlzLmtleXNbaV0uY29sb3JJbnRlcmZhY2UoKTtcbiAgICAgIHRoaXMua2V5c1tpXS5yZW5kZXIoKTtcbiAgICB9XG5cblxuICB9XG5cbiAga2V5Q2hhbmdlKG5vdGUsb24pIHtcbiAgICAvLyBlbWl0IGRhdGEgZm9yIGFueSBrZXkgdHVybmluZyBvbi9vZmZcbiAgICAvLyBcIm5vdGVcIiBpcyB0aGUgbm90ZSB2YWx1ZVxuICAgIC8vIFwib25cIiBpcyBhIGJvb2xlYW4gd2hldGhlciBpdCBpcyBvbiBvciBvZmZcbiAgICAvLyBpbiBhZnRlcnRvdWNoIG1vZGUsIFwib246IGlzIGFuIG9iamVjdCB3aXRoIHN0YXRlL3gveSBwcm9wZXJ0aWVzXG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBub3RlOiBub3RlXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgZGF0YS5zdGF0ZSA9IG9uLnN0YXRlO1xuICAgIC8vICBkYXRhLnggPSBvbi54XG4gICAgLy8gIGRhdGEueSA9IG9uLnlcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YS5zdGF0ZSA9IG9uO1xuICAgIH1cbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScsZGF0YSk7XG4gIH1cblxuICAvKiBkcmFnKG5vdGUsb24pIHtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScse1xuICAgICAgbm90ZTogbm90ZSxcbiAgICAgIHN0YXRlOiBvblxuICAgIH0pO1xuICB9ICovXG5cbiAgcmVuZGVyKCkge1xuICAgIC8vIGxvb3AgdGhyb3VnaCBhbmQgcmVuZGVyIHRoZSBrZXlzP1xuICB9XG5cblxuICBhZGRUb3VjaExpc3RlbmVycygpIHtcblxuICAgIHRoaXMucHJlQ2xpY2sgPSB0aGlzLnByZU1vdmUgPSB0aGlzLnByZVJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLmNsaWNrID0gdGhpcy5tb3ZlID0gdGhpcy5yZWxlYXNlID0gKCkgPT4ge307XG4gICAgdGhpcy5wcmVUb3VjaCA9IHRoaXMucHJlVG91Y2hNb3ZlID0gdGhpcy5wcmVUb3VjaFJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLnRvdWNoID0gdGhpcy50b3VjaE1vdmUgPSB0aGlzLnRvdWNoUmVsZWFzZSA9ICgpID0+IHt9O1xuXG4gICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ3RvdWNoc3RhcnQnKTtcbiAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WCxlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBsZXQga2V5ID0gdGhpcy5rZXlzW2VsZW1lbnQuaW5kZXhdO1xuICAgICAgdGhpcy5wYWludGJydXNoID0gIWtleS5zdGF0ZTtcbiAgICAgIGtleS5kb3duKHRoaXMucGFpbnRicnVzaCk7XG4gICAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5pbmRleDtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgKGUpID0+IHtcbiAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WCxlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBsZXQga2V5ID0gdGhpcy5rZXlzW2VsZW1lbnQuaW5kZXhdO1xuICAgICAgaWYgKGVsZW1lbnQuaW5kZXghPT10aGlzLmN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgbGV0IHBhc3RLZXkgPSB0aGlzLmtleXNbdGhpcy5jdXJyZW50RWxlbWVudF07XG4gICAgICAgICAgcGFzdEtleS51cCgpO1xuICAgICAgICB9XG4gICAgICAgIGtleS5kb3duKHRoaXMucGFpbnRicnVzaCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkuYmVuZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQuaW5kZXg7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgKGUpID0+IHtcbiAgICAgIC8vIG5vIHRvdWNoZXMgdG8gY2FsY3VsYXRlIGJlY2F1c2Ugbm9uZSByZW1haW5pbmdcbiAgICAgIGxldCBrZXkgPSB0aGlzLmtleXNbdGhpcy5jdXJyZW50RWxlbWVudF07XG4gICAgICBrZXkudXAoKTtcbiAgICAgIHRoaXMuaW50ZXJhY3RpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSBmYWxzZTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICBEZWZpbmUgdGhlIHBpdGNoIHJhbmdlIChsb3dlc3QgYW5kIGhpZ2hlc3Qgbm90ZSkgb2YgdGhlIHBpYW5vIGtleWJvYXJkLlxuICBAcGFyYW0gbG93IHtudW1iZXJ9IE1JREkgbm90ZSB2YWx1ZSBvZiB0aGUgbG93ZXN0IG5vdGUgb24gdGhlIGtleWJvYXJkXG4gIEBwYXJhbSBoaWdoIHtudW1iZXJ9IE1JREkgbm90ZSB2YWx1ZSBvZiB0aGUgaGlnaGVzdCBub3RlIG9uIHRoZSBrZXlib2FyZFxuICAqL1xuICBzZXRSYW5nZShsb3csaGlnaCkge1xuICAgIHRoaXMucmFuZ2UubG93ID0gbG93O1xuICAgIHRoaXMucmFuZ2UuaGlnaCA9IGhpZ2g7XG4gICAgdGhpcy5lbXB0eSgpO1xuICAgIHRoaXMuYnVpbGRJbnRlcmZhY2UoKTtcbiAgfVxuXG4gIC8qKlxuICBUdXJuIGEga2V5IG9uIG9yIG9mZiB1c2luZyBpdHMgTUlESSBub3RlIHZhbHVlO1xuICBAcGFyYW0gbm90ZSB7bnVtYmVyfSBNSURJIG5vdGUgdmFsdWUgb2YgdGhlIGtleSB0byBjaGFuZ2VcbiAgQHBhcmFtIG9uIHtib29sZWFufSBXaGV0aGVyIHRoZSBub3RlIHNob3VsZCB0dXJuIG9uIG9yIG9mZlxuICAqL1xuICB0b2dnbGVLZXkobm90ZSwgb24pIHtcbiAgICB0aGlzLmtleXNbbm90ZS10aGlzLnJhbmdlLmxvd10uZmxpcChvbik7XG4gIH1cblxuICAvKipcbiAgVHVybiBhIGtleSBvbiBvciBvZmYgdXNpbmcgaXRzIGtleSBpbmRleCBvbiB0aGUgcGlhbm8gaW50ZXJmYWNlLlxuICBAcGFyYW0gaW5kZXgge251bWJlcn0gSW5kZXggb2YgdGhlIGtleSB0byBjaGFuZ2VcbiAgQHBhcmFtIG9uIHtib29sZWFufSBXaGV0aGVyIHRoZSBub3RlIHNob3VsZCB0dXJuIG9uIG9yIG9mZlxuICAqL1xuICB0b2dnbGVJbmRleChpbmRleCwgb24pIHtcbiAgICB0aGlzLmtleXNbaW5kZXhdLmZsaXAob24pO1xuICB9XG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9pbnRlcmZhY2VzL3BpYW5vLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgc3ZnID0gcmVxdWlyZSgnLi4vdXRpbC9zdmcnKTtcbmxldCBkb20gPSByZXF1aXJlKCcuLi91dGlsL2RvbScpO1xubGV0IEludGVyZmFjZSA9IHJlcXVpcmUoJy4uL2NvcmUvaW50ZXJmYWNlJyk7XG5sZXQgQnV0dG9uVGVtcGxhdGUgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL2J1dHRvbnRlbXBsYXRlJyk7XG5sZXQgTWF0cml4TW9kZWwgPSByZXF1aXJlKCcuLi9tb2RlbHMvbWF0cml4Jyk7XG5sZXQgQ291bnRlck1vZGVsID0gcmVxdWlyZSgnLi4vbW9kZWxzL2NvdW50ZXInKTtcbmxldCB0b3VjaCA9IHJlcXVpcmUoJy4uL3V0aWwvdG91Y2gnKTtcblxuXG5cbmNsYXNzIE1hdHJpeENlbGwgZXh0ZW5kcyBCdXR0b25UZW1wbGF0ZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsndmFsdWUnLF07XG5cbiAgICBsZXQgZGVmYXVsdHMgPSB7XG4gICAgICAnc2l6ZSc6IFs4MCw4MF0sXG4gICAgICAndGFyZ2V0JzogZmFsc2UsXG4gICAgICAnbW9kZSc6ICd0b2dnbGUnLFxuICAgICAgJ3ZhbHVlJzogMFxuICAgIH07XG5cbiAgICBzdXBlcihhcmd1bWVudHMsb3B0aW9ucyxkZWZhdWx0cyk7XG5cbiAgICB0aGlzLmluZGV4ID0gdGhpcy5zZXR0aW5ncy5pbmRleDtcbiAgICB0aGlzLnJvdyA9IHRoaXMuc2V0dGluZ3Mucm93O1xuICAgIHRoaXMuY29sdW1uID0gdGhpcy5zZXR0aW5ncy5jb2x1bW47XG5cbiAgICB0aGlzLm1hdHJpeCA9IHRoaXMuc2V0dGluZ3MubWF0cml4O1xuXG4gICAgdGhpcy5pbnRlcmFjdGluZyA9IGZhbHNlO1xuICAgIHRoaXMucGFpbnRicnVzaCA9IGZhbHNlO1xuXG4gICAgdGhpcy5pbml0KCk7XG4gICAgdGhpcy5yZW5kZXIoKTtcblxuICB9XG5cbiAgYnVpbGRGcmFtZSgpIHtcbiAgICB0aGlzLmVsZW1lbnQgPSBzdmcuY3JlYXRlKCdzdmcnKTtcbiAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd3aWR0aCcsdGhpcy53aWR0aCk7XG4gICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jyx0aGlzLmhlaWdodCk7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5sZWZ0ID0gJzBweCc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICB0aGlzLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuICB9XG5cbiAgYnVpbGRJbnRlcmZhY2UoKSB7XG5cbiAgICB0aGlzLnBhZCA9IHN2Zy5jcmVhdGUoJ3JlY3QnKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wYWQpO1xuXG4gICAgdGhpcy5pbnRlcmFjdGlvblRhcmdldCA9IHRoaXMucGFkO1xuXG4gICAgLyogZXZlbnRzICovXG5cbiAgICBpZiAoIXRvdWNoLmV4aXN0cykge1xuXG4gICAgICB0aGlzLmNsaWNrID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm1hdHJpeC5pbnRlcmFjdGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMubWF0cml4LnBhaW50YnJ1c2ggPSAhdGhpcy5zdGF0ZTtcbiAgICAgICAgdGhpcy5kb3duKHRoaXMubWF0cml4LnBhaW50YnJ1c2gpO1xuICAgICAgfTtcbiAgICAgIHRoaXMucGFkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWF0cml4LmludGVyYWN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5kb3duKHRoaXMubWF0cml4LnBhaW50YnJ1c2gpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuXG4gICAgICB0aGlzLm1vdmUgPSAoKSA9PiB7XG4gICAgICB9O1xuICAgICAgdGhpcy5wYWQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKGUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWF0cml4LmludGVyYWN0aW5nKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLm9mZnNldCkge1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBkb20uZmluZFBvc2l0aW9uKHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubW91c2UgPSBkb20ubG9jYXRlTW91c2UoZSx0aGlzLm9mZnNldCk7XG4gICAgICAgICAgdGhpcy5iZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIHRoaXMucmVsZWFzZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5tYXRyaXguaW50ZXJhY3RpbmcgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgICB0aGlzLnBhZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tYXRyaXguaW50ZXJhY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLnVwKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5wYWQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm1hdHJpeC5pbnRlcmFjdGluZykge1xuICAgICAgICAgIHRoaXMudXAoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICBzaXplSW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCd4JywxKTtcbiAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ3knLDEpO1xuICAgIGlmICh0aGlzLndpZHRoID4gMikge1xuICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMud2lkdGggLSAyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMud2lkdGgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oZWlnaHQgPiAyKSB7XG4gICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMuaGVpZ2h0IC0gMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQpO1xuICAgIH1cbiAgICAvL3RoaXMucGFkLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQgLSAyKTtcbiAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLm1hdHJpeC5jb2xvcnMuZmlsbCk7XG5cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUpIHtcbiAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMubWF0cml4LmNvbG9ycy5maWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5tYXRyaXguY29sb3JzLmFjY2VudCk7XG4gICAgfVxuICB9XG5cbn1cblxuLyoqXG4qIFNlcXVlbmNlclxuKlxuKiBAZGVzY3JpcHRpb24gR3JpZCBvZiBidXR0b25zIHdpdGggYnVpbHQtaW4gc3RlcCBzZXF1ZW5jZXIuXG4qXG4qIEBkZW1vIDxkaXYgbmV4dXMtdWk9XCJzZXF1ZW5jZXJcIiBzdHlsZT1cIndpZHRoOjQwMHB4O2hlaWdodDoyMDBweDtcIj48L2Rpdj5cbipcbiogQGV4YW1wbGVcbiogdmFyIHNlcXVlbmNlciA9IG5ldyBOZXh1cy5TZXF1ZW5jZXIoJyN0YXJnZXQnKVxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgc2VxdWVuY2VyID0gbmV3IE5leHVzLlNlcXVlbmNlcignI3RhcmdldCcse1xuKiAgJ3NpemUnOiBbNDAwLDIwMF0sXG4qICAnbW9kZSc6ICd0b2dnbGUnLFxuKiAgJ3Jvd3MnOiA1LFxuKiAgJ2NvbHVtbnMnOiAxMFxuKn0pXG4qXG4qIEBvdXRwdXRcbiogY2hhbmdlXG4qIEZpcmVzIGFueSB0aW1lIHRoZSBpbnRlcmZhY2UncyBtYXRyaXggY2hhbmdlcy4gPGJyPlxuKiBUaGUgZXZlbnQgZGF0YSBpcyBhbiBvYmplY3QgY29udGFpbmluZyA8aT5yb3c8L2k+IChudW1iZXIpLCA8aT5jb2x1bW48L2k+IChudW1iZXIpLCBhbmQgPGk+c3RhdGU8L2k+IChib29sZWFuKSBwcm9wZXJ0aWVzLlxuKlxuKiBAb3V0cHV0ZXhhbXBsZVxuKiBzZXF1ZW5jZXIub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuKiAgIGNvbnNvbGUubG9nKHYpO1xuKiB9KVxuKlxuKiBAb3V0cHV0XG4qIHN0ZXBcbiogRmlyZXMgYW55IHRpbWUgdGhlIHNlcXVlbmNlciBzdGVwcyB0byB0aGUgbmV4dCBjb2x1bW4sIGluIHNlcXVlY2UgbW9kZS4gPGJyPlxuKiBUaGUgZXZlbnQgZGF0YSBpcyBhbiA8aT5hcnJheTwvaT4gY29udGFpbmluZyBhbGwgdmFsdWVzIGluIHRoZSBjb2x1bW4sIDxpPmJvdHRvbSByb3cgZmlyc3Q8L2k+LlxuKlxuKiBAb3V0cHV0ZXhhbXBsZVxuKiBzZXF1ZW5jZXIub24oJ3N0ZXAnLGZ1bmN0aW9uKHYpIHtcbiogICBjb25zb2xlLmxvZyh2KTtcbiogfSlcbiovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlcXVlbmNlciBleHRlbmRzIEludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsndmFsdWUnXTtcblxuICAgIGxldCBkZWZhdWx0cyA9IHtcbiAgICAgICdzaXplJzogWzQwMCwyMDBdLFxuICAgICAgJ21vZGUnOiAndG9nZ2xlJyxcbiAgICAgICdyb3dzJzogNSxcbiAgICAgICdjb2x1bW5zJzogMTBcbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG4gICAgdGhpcy5hY3RpdmUgPSAtMTtcblxuICAgIC8qKlxuICAgICogQnV0dG9uIGludGVyYWN0aW9uIG1vZGU6IHNlZSBCdXR0b25cbiAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgKiBAZXhhbXBsZSBidXR0b24ubW9kZSA9ICd0b2dnbGUnO1xuICAgICovXG4gICAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5tb2RlO1xuXG4gICAgLyoqXG4gICAgKiBUaGUgaW50ZXJ2YWwgb2JqZWN0IHdoaWNoIGNvbnRyb2xzIHRpbWluZyBhbmQgc2VxdWVuY2Ugc2NoZWR1bGluZy5cbiAgICAqIEB0eXBlIHtpbnRlcnZhbH1cbiAgICAqL1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBuZXcgTmV4dXMuSW50ZXJ2YWwoMjAwLGZ1bmN0aW9uKCkge30sZmFsc2UpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuICAgIC8qKlxuICAgICogQSBNYXRyaXggbW9kZWwgY29udGFpbmluZyBtZXRob2RzIGZvciBtYW5pcHVsYXRpbmcgdGhlIHNlcXVlbmNlcidzIGFycmF5IG9mIHZhbHVlcy4gVG8gbGVhcm4gaG93IHRvIG1hbmlwdWxhdGUgdGhlIG1hdHJpeCwgcmVhZCBhYm91dCB0aGUgbWF0cml4IG1vZGVsLlxuICAgICogQHR5cGUge21hdHJpeH1cbiAgICAqL1xuICAgIHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeE1vZGVsKHRoaXMuc2V0dGluZ3Mucm93cyx0aGlzLnNldHRpbmdzLmNvbHVtbnMpO1xuICAgIHRoaXMubWF0cml4LnVpID0gdGhpcztcblxuICAgIC8qKlxuICAgICogQSBDb3VudGVyIG1vZGVsIHdoaWNoIHRoZSBzZXF1ZW5jZXIgc3RlcHMgdGhyb3VnaC4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgdGhpcyBtb2RlbCB0byBzdGVwIHRocm91Z2ggdGhlIHNlcXVlbmNlciBpbiByZXZlcnNlLCByYW5kb21seSwgb3IgaW4gYSBkcnVuayB3YWxrLlxuICAgICogQHR5cGUge2NvdW50ZXJ9XG4gICAgKi9cbiAgICB0aGlzLnN0ZXBwZXIgPSBuZXcgQ291bnRlck1vZGVsKDAsdGhpcy5jb2x1bW5zKTtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG4gIH1cblxuICBidWlsZEZyYW1lKCkge1xuICAgIHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG4gICAgaWYgKHRvdWNoLmV4aXN0cykge1xuICAgICAgdGhpcy5hZGRUb3VjaExpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy5jZWxscyA9IFtdO1xuICAgIGZvciAobGV0IGk9MDtpPHRoaXMubWF0cml4Lmxlbmd0aDtpKyspIHtcblxuICAgICAgbGV0IGxvY2F0aW9uID0gdGhpcy5tYXRyaXgubG9jYXRlKGkpO1xuICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJucyB7cm93LGNvbH1cblxuICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cblxuICAgICAgbGV0IGNlbGwgPSBuZXcgTWF0cml4Q2VsbChjb250YWluZXIsIHtcbiAgICAgICAgICBjb21wb25lbnQ6IHRydWUsXG4gICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgcm93OiBsb2NhdGlvbi5yb3csXG4gICAgICAgICAgY29sdW1uOiBsb2NhdGlvbi5jb2x1bW4sXG4gICAgICAgICAgbW9kZTogdGhpcy5tb2RlLFxuICAgICAgICAgIG1hdHJpeDogdGhpc1xuICAgICAgICB9LCB0aGlzLmtleUNoYW5nZS5iaW5kKHRoaXMsaSkpO1xuXG4gICAgLy8gIGNlbGwubWF0cml4ID0gdGhpcztcbiAgICAgIGlmICh0b3VjaC5leGlzdHMpIHtcbiAgICAgICAgY2VsbC5wYWQuaW5kZXggPSBpO1xuICAgICAgICBjZWxsLnByZUNsaWNrID0gY2VsbC5wcmVNb3ZlID0gY2VsbC5wcmVSZWxlYXNlID0gKCkgPT4ge307XG4gICAgICAgIGNlbGwuY2xpY2sgPSBjZWxsLm1vdmUgPSBjZWxsLnJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICAgICAgY2VsbC5wcmVUb3VjaCA9IGNlbGwucHJlVG91Y2hNb3ZlID0gY2VsbC5wcmVUb3VjaFJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICAgICAgY2VsbC50b3VjaCA9IGNlbGwudG91Y2hNb3ZlID0gY2VsbC50b3VjaFJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jZWxscy5wdXNoKGNlbGwpO1xuICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICB9XG4gICAgdGhpcy5zaXplSW50ZXJmYWNlKCk7XG4gIH1cblxuICBzaXplSW50ZXJmYWNlKCkge1xuXG4gICAgbGV0IGNlbGxXaWR0aCA9IHRoaXMud2lkdGggLyB0aGlzLmNvbHVtbnM7XG4gICAgbGV0IGNlbGxIZWlnaHQgPSB0aGlzLmhlaWdodCAvIHRoaXMucm93cztcblxuICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5jZWxsc1tpXS5wYXJlbnQ7XG4gICAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IHRoaXMuY2VsbHNbaV0uY29sdW1uICogY2VsbFdpZHRoICsgJ3B4JztcbiAgICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSB0aGlzLmNlbGxzW2ldLnJvdyAqIGNlbGxIZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy5jZWxsc1tpXS5yZXNpemUoY2VsbFdpZHRoLGNlbGxIZWlnaHQpO1xuICAgIH1cblxuXG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcbiAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jZWxsc1tpXS5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gIC8vICBjb25zb2xlLmxvZyhcInVwZGF0aW5nLi4uXCIpXG4gICAgLy9vbiA9IG9uIHx8IGZhbHNlO1xuICAgIHRoaXMubWF0cml4Lml0ZXJhdGUoKHIsYyxpKSA9PiB7XG4gICAgICAvLyAgY29uc29sZS5sb2codGhpcy5tYXRyaXgucGF0dGVybltyXVtjXSwgdGhpcy5jZWxsc1tpXS5zdGF0ZSk7XG4gICAgICBpZiAodGhpcy5tYXRyaXgucGF0dGVybltyXVtjXSAhPT0gdGhpcy5jZWxsc1tpXS5zdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5tYXRyaXgucGF0dGVybltyXVtjXSA+IDApIHtcbiAgICAgICAgICB0aGlzLmNlbGxzW2ldLnR1cm5PbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2VsbHNbaV0udHVybk9mZigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuLy8gdXBkYXRlID0+IGNlbGwudHVybk9uID0+IGNlbGwuZW1pdCA9PiBrZXlDaGFuZ2UgKHNlcS5lbWl0KSA9PiBtYXRyaXguc2V0LmNlbGwgPT4gdXBkYXRlXG4vL1xuLy8gaW50ZXJhY3Rpb24gPT4ga2V5Q2hhbmdlID0+IG1hdHJpeC5zZXQuY2VsbCA9PiB1cGRhdGUgPT4gY2VsbC50dXJuT25cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gZW1pdFxuLy9cbi8vIHNldC5jZWxsID0+IHVwZGF0ZSA9PiBuZWVkcyB0byBlbWl0LlxuXG4gIGtleUNoYW5nZShub3RlLG9uKSB7XG4gICAgLy8gZW1pdCBkYXRhIGZvciBhbnkga2V5IHR1cm5pbmcgb24vb2ZmXG4gICAgLy8gaSBpcyB0aGUgbm90ZSBpbmRleFxuICAgIC8vIHYgaXMgd2hldGhlciBpdCBpcyBvbiBvciBvZmZcbiAgICBsZXQgY2VsbCA9IHRoaXMubWF0cml4LmxvY2F0ZShub3RlKTtcbiAgLy8gIHRoaXMubWF0cml4LnNldC5jZWxsKGNlbGwuY29sdW1uLGNlbGwucm93LG9uKTtcbiAgICB0aGlzLm1hdHJpeC5wYXR0ZXJuW2NlbGwucm93XVtjZWxsLmNvbHVtbl0gPSBvbjtcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgIHJvdzogY2VsbC5yb3csXG4gICAgICBjb2x1bW46IGNlbGwuY29sdW1uLFxuICAgICAgc3RhdGU6IG9uXG4gICAgfTtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScsZGF0YSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuc3RlcHBlci52YWx1ZSA+PSAwKSB7XG4gICAgICB0aGlzLm1hdHJpeC5pdGVyYXRlKChyLGMsaSkgPT4ge1xuICAgICAgICBpZiAoYz09PXRoaXMuc3RlcHBlci52YWx1ZSkge1xuICAgICAgICAgIHRoaXMuY2VsbHNbaV0ucGFkLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyx0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG4gICAgICAgICAgdGhpcy5jZWxsc1tpXS5wYWQuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCcxJyk7XG4gICAgICAgICAgdGhpcy5jZWxsc1tpXS5wYWQuc2V0QXR0cmlidXRlKCdzdHJva2Utb3BhY2l0eScsJzEnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNlbGxzW2ldLnBhZC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsJ25vbmUnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHNlcXVlbmNpbmdcbiAgICogQHBhcmFtICB7bnVtYmVyfSBtcyBCZWF0IHRlbXBvIGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgc3RhcnQobXMpIHtcbiAgICB0aGlzLmludGVydmFsLmV2ZW50ID0gdGhpcy5uZXh0LmJpbmQodGhpcyk7XG4gICAgaWYgKG1zKSB7XG4gICAgICB0aGlzLmludGVydmFsLm1zKG1zKTtcbiAgICB9XG4gICAgdGhpcy5pbnRlcnZhbC5zdGFydCgpO1xuICB9XG5cbiAgLyoqXG4gIFN0b3Agc2VxdWVuY2luZ1xuICAqL1xuICBzdG9wKCkge1xuICAgIHRoaXMuaW50ZXJ2YWwuc3RvcCgpO1xuICB9XG5cbiAgLyoqXG4gIE1hbnVhbGx5IGp1bXAgdG8gdGhlIG5leHQgY29sdW1uIGFuZCB0cmlnZ2VyIHRoZSAnY2hhbmdlJyBldmVudC4gVGhlIFwibmV4dFwiIGNvbHVtbiBpcyBkZXRlcm1pbmVkIGJ5IHlvdXIgbW9kZSBvZiBzZXF1ZW5jaW5nLlxuICAqL1xuICBuZXh0KCkge1xuICAgIHRoaXMuc3RlcHBlci5uZXh0KCk7XG4gICAgdGhpcy5lbWl0KCdzdGVwJyx0aGlzLm1hdHJpeC5jb2x1bW4odGhpcy5zdGVwcGVyLnZhbHVlKS5yZXZlcnNlKCkpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBhZGRUb3VjaExpc3RlbmVycygpIHtcblxuICAgIHRoaXMucHJlQ2xpY2sgPSB0aGlzLnByZU1vdmUgPSB0aGlzLnByZVJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLmNsaWNrID0gdGhpcy5tb3ZlID0gdGhpcy5yZWxlYXNlID0gKCkgPT4ge307XG4gICAgdGhpcy5wcmVUb3VjaCA9IHRoaXMucHJlVG91Y2hNb3ZlID0gdGhpcy5wcmVUb3VjaFJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLnRvdWNoID0gdGhpcy50b3VjaE1vdmUgPSB0aGlzLnRvdWNoUmVsZWFzZSA9ICgpID0+IHt9O1xuXG4gICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYLGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgIGxldCBjZWxsID0gdGhpcy5jZWxsc1tlbGVtZW50LmluZGV4XTtcbiAgICAgIHRoaXMucGFpbnRicnVzaCA9ICFjZWxsLnN0YXRlO1xuICAgICAgY2VsbC5kb3duKHRoaXMucGFpbnRicnVzaCk7XG4gICAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5pbmRleDtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgKGUpID0+IHtcbiAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WCxlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WSk7XG4gICAgICBsZXQgY2VsbCA9IHRoaXMuY2VsbHNbZWxlbWVudC5pbmRleF07XG4gICAgICBpZiAoZWxlbWVudC5pbmRleCE9PXRoaXMuY3VycmVudEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEVsZW1lbnQgPj0gMCkge1xuICAgICAgICAgIGxldCBwYXN0Q2VsbCA9IHRoaXMuY2VsbHNbdGhpcy5jdXJyZW50RWxlbWVudF07XG4gICAgICAgICAgcGFzdENlbGwudXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjZWxsLmRvd24odGhpcy5wYWludGJydXNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNlbGwuYmVuZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQuaW5kZXg7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgKGUpID0+IHtcbiAgICAgIC8vIG5vIHRvdWNoZXMgdG8gY2FsY3VsYXRlIGJlY2F1c2Ugbm9uZSByZW1haW5pbmdcbiAgICAgIGxldCBjZWxsID0gdGhpcy5jZWxsc1t0aGlzLmN1cnJlbnRFbGVtZW50XTtcbiAgICAgIGNlbGwudXAoKTtcbiAgICAgIHRoaXMuaW50ZXJhY3RpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSBmYWxzZTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICBOdW1iZXIgb2Ygcm93cyBpbiB0aGUgc2VxdWVuY2VyXG4gIEB0eXBlIHtudW1iZXJ9XG4gICovXG4gIGdldCByb3dzKCkge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeC5yb3dzO1xuICB9XG5cbiAgc2V0IHJvd3Modikge1xuICAgIHRoaXMubWF0cml4LnJvd3MgPSB2O1xuICAgIHRoaXMuZW1wdHkoKTtcbiAgICB0aGlzLmJ1aWxkSW50ZXJmYWNlKCk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgc2VxdWVuY2VyXG4gIEB0eXBlIHtudW1iZXJ9XG4gICovXG4gIGdldCBjb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeC5jb2x1bW5zO1xuICB9XG5cbiAgc2V0IGNvbHVtbnModikge1xuICAgIHRoaXMubWF0cml4LmNvbHVtbnMgPSB2O1xuICAgIHRoaXMuc3RlcHBlci5tYXggPSB2O1xuICAgIHRoaXMuZW1wdHkoKTtcbiAgICB0aGlzLmJ1aWxkSW50ZXJmYWNlKCk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvaW50ZXJmYWNlcy9zZXF1ZW5jZXIuanMiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBtYXRoIGZyb20gJy4uL3V0aWwvbWF0aCc7XG5pbXBvcnQgU2VxdWVuY2UgZnJvbSAnLi4vbW9kZWxzL3NlcXVlbmNlJztcblxuLy8gRm9yIHRoZSB0dXRvcmlhbCwgbG9va2luZyBhdFxuXG4vL1BhdHRlcm4gc2VjdGlvbjpcbi8vIC5jcmVhdGUoKSwgLnJvd3MsIC5jb2x1bW5zLFxuLy8gLnBhdHRlcm4sIC5sZW5ndGgsIC5mb3JtYXRBc1RleHQoKSwgLmxvZygpLFxuLy8gLmxvY2F0ZShpKSwgLmluZGV4T2YoYyxyKVxuLy8gcm93KCksIGNvbHVtbigpIChyZXR1cm5zIGNvbnRlbnRzIG9mIHJvdyBvciBjb2x1bSlcblxuLy9Db250cm9sIHNlY3Rpb246XG4vLyB0b2dnbGUgeDNcbi8vIHNldCB4NFxuLy8gcm90YXRlIHgzXG4vLyBwb3B1bGF0ZSB4M1xuLy8gZXJhc2UgeDNcblxuXG4vLyBzaG91bGQgc29tZSB2ZXJzaW9uIG9mIHRoaXMgaGF2ZSBhIGZsb2F0IHZhbHVlIGZvciBlYWNoIGNlbGw/XG4vLyBjb3VsZCBiZSBsaWtlIGEgbWlycm9yIC5wYXR0ZXJuIHRoYXQgaGFzIHZhbHVlcy4gYnkgZGVmYXVsdCwgZXZlcnl0aGluZyBpcyAxLCBidXQgY291bGQgYmUgc2V0Li4uXG4vLyBub3QgYSBnb29kIHdheSB0byBkbyB0aGF0IG9uIGludGVyZmFjZSwgYnV0IGFzIGEgbW9kZWwgaXQgd291bGQgYmUgbmljZS4uLlxuLy8gZm9yIC5mb3JtYXRBc1RleHQoKSwgY291bGQgbXVsdGlwbHkgYnkgMTAwIGFuZCBmbG9vciwgc28gZWFjaCBjZWxsIGlzIGFuIGludCBmcm9tIDAgdG8gOVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXRyaXgge1xuXG4gIGNvbnN0cnVjdG9yKHJvd3MsY29sdW1ucykge1xuICAgIC8vIHNob3VsZCBhbHNvIGhhdmUgYWJpbGl0eSB0byBjcmVhdGUgdXNpbmcgYW4gZXhpc3RpbmcgbWF0cml4ICgyZCBhcnJheSlcbiAgICB0aGlzLnBhdHRlcm4gPSBbXTtcbiAgICB0aGlzLmNyZWF0ZShyb3dzLGNvbHVtbnMpO1xuXG4gICAgdGhpcy50b2dnbGUgPSB7XG4gICAgICBjZWxsOiAoY29sdW1uLCByb3cpID0+IHtcbiAgICAgICAgdGhpcy5wYXR0ZXJuW3Jvd11bY29sdW1uXSA9ICF0aGlzLnBhdHRlcm5bcm93XVtjb2x1bW5dOyAvLyBtYXRoLmludmVydCh0aGlzLnBhdHRlcm5bcm93XVtjb2x1bW5dKTtcbiAgICAgICAgaWYgKHRoaXMudWkpIHsgdGhpcy51aS51cGRhdGUoKTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5wYXR0ZXJuW3Jvd11bY29sdW1uXTtcbiAgICAgIH0sXG4gICAgICBhbGw6ICgpID0+IHtcbiAgICAgICAgdGhpcy5pdGVyYXRlKChyLGMpID0+IHsgdGhpcy50b2dnbGUuY2VsbChjLHIpOyB9KTtcbiAgICAgICAgaWYgKHRoaXMudWkpIHsgdGhpcy51aS51cGRhdGUoKTsgfVxuICAgICAgfSxcbiAgICAgIHJvdzogKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5jb2x1bW5zOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZS5jZWxsKGkscm93KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51aSkgeyB0aGlzLnVpLnVwZGF0ZSgpOyB9XG4gICAgICB9LFxuICAgICAgY29sdW1uOiAoY29sdW1uKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLnJvd3M7IGkrKykge1xuICAgICAgICAgIHRoaXMudG9nZ2xlLmNlbGwoY29sdW1uLGkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnVpKSB7IHRoaXMudWkudXBkYXRlKCk7IH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5zZXQgPSB7XG4gICAgICBjZWxsOiAoY29sdW1uLCByb3csIHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMucGF0dGVybltyb3ddW2NvbHVtbl0gPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMudWkpIHsgdGhpcy51aS51cGRhdGUoKTsgfVxuICAgICAgfSxcbiAgICAgIGFsbDogKHZhbHVlcykgPT4ge1xuICAgICAgICAvLyBzZXQgdGhlIHdob2xlIG1hdHJpeCB1c2luZyBhIDJkIGFycmF5IGFzIGlucHV0XG4gICAgICAgIC8vIHRoaXMgc2hvdWxkIGFsc28gcmVzaXplIHRoZSBhcnJheT9cbiAgICAgICAgdGhpcy5wYXR0ZXJuID0gdmFsdWVzO1xuICAgICAgICBpZiAodGhpcy51aSkgeyB0aGlzLnVpLnVwZGF0ZSgpOyB9XG4gICAgICB9LFxuICAgICAgcm93OiAocm93LHZhbHVlcykgPT4ge1xuICAgICAgICAvLyBzZXQgYSByb3cgdXNpbmcgYW4gYXJyYXkgYXMgaW5wdXRcbiAgICAgICAgdGhpcy5wYXR0ZXJuW3Jvd10gPSB2YWx1ZXM7XG4gICAgICAgIGlmICh0aGlzLnVpKSB7IHRoaXMudWkudXBkYXRlKCk7IH1cbiAgICAgIH0sXG4gICAgICBjb2x1bW46IChjb2x1bW4sdmFsdWVzKSA9PiB7XG4gICAgICAgIC8vIHNldCBhIGNvbHVtbiB1c2luZyBhbiBhcnJheSBhcyBpbnB1dFxuICAgICAgICB0aGlzLnBhdHRlcm4uZm9yRWFjaCgocm93LGkpID0+IHtcbiAgICAgICAgICB0aGlzLnBhdHRlcm5baV1bY29sdW1uXSA9IHZhbHVlc1tpXTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnVpKSB7IHRoaXMudWkudXBkYXRlKCk7IH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5yb3RhdGUgPSB7XG4gICAgICAvL3Nob3VsZCBldmVudHVhbGx5IGRvIChhbW91bnRYLCBhbW91bnRZKSBoZXJlXG4gICAgICAvLyBjb3VsZCBqdXN0IHVzZSBhIGxvb3AgYW5kIHRoaXMucm90YXRlLnJvdyhpLGFtb3VudFgpO1xuICAgICAgYWxsOiAoYW1vdW50KSA9PiB7XG4gICAgICAgIGlmICghYW1vdW50ICYmIGFtb3VudCE9PTApIHtcbiAgICAgICAgICBhbW91bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGFtb3VudCAlPSB0aGlzLnBhdHRlcm5bMF0ubGVuZ3RoO1xuICAgICAgICBpZiAoYW1vdW50IDwgMCkge1xuICAgICAgICAgIGFtb3VudCA9IHRoaXMucGF0dGVyblswXS5sZW5ndGggKyBhbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMucm93czsgaSsrKSB7XG4gICAgICAgICAgbGV0IGN1dCA9IHRoaXMucGF0dGVybltpXS5zcGxpY2UoIHRoaXMucGF0dGVybltpXS5sZW5ndGggLSBhbW91bnQsIGFtb3VudCApO1xuICAgICAgICAgIHRoaXMucGF0dGVybltpXSA9IGN1dC5jb25jYXQoIHRoaXMucGF0dGVybltpXSApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnVpKSB7IHRoaXMudWkudXBkYXRlKCk7IH1cbiAgICAgIH0sXG4gICAgICByb3c6IChyb3csYW1vdW50KSA9PiB7XG4gICAgICAgIGlmICghYW1vdW50ICYmIGFtb3VudCE9PTApIHtcbiAgICAgICAgICBhbW91bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGFtb3VudCAlPSB0aGlzLnBhdHRlcm5bMF0ubGVuZ3RoO1xuICAgICAgICBpZiAoYW1vdW50IDwgMCkge1xuICAgICAgICAgIGFtb3VudCA9IHRoaXMucGF0dGVyblswXS5sZW5ndGggKyBhbW91bnQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1dCA9IHRoaXMucGF0dGVybltyb3ddLnNwbGljZSggdGhpcy5wYXR0ZXJuW3Jvd10ubGVuZ3RoIC0gYW1vdW50LCBhbW91bnQgKTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuW3Jvd10gPSBjdXQuY29uY2F0KCB0aGlzLnBhdHRlcm5bcm93XSApO1xuICAgICAgICBpZiAodGhpcy51aSkgeyB0aGlzLnVpLnVwZGF0ZSgpOyB9XG4gICAgICB9LFxuICAgICAgY29sdW1uOiAoY29sdW1uLCBhbW91bnQpID0+IHtcbiAgICAgICAgaWYgKCFhbW91bnQgJiYgYW1vdW50IT09MCkge1xuICAgICAgICAgIGFtb3VudCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgYW1vdW50ICU9IHRoaXMucGF0dGVybi5sZW5ndGg7XG4gICAgICAgIGlmIChhbW91bnQgPCAwKSB7XG4gICAgICAgICAgYW1vdW50ID0gdGhpcy5wYXR0ZXJuLmxlbmd0aCArIGFtb3VudDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJveHkgPSBbXTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgIHByb3h5LnB1c2goIHJvd1tjb2x1bW5dICk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgY3V0ID0gcHJveHkuc3BsaWNlKCBwcm94eS5sZW5ndGggLSBhbW91bnQsIGFtb3VudCApO1xuICAgICAgICBwcm94eSA9IGN1dC5jb25jYXQoIHByb3h5ICk7XG4gICAgICAgIHRoaXMucGF0dGVybi5mb3JFYWNoKChyb3csaSkgPT4ge1xuICAgICAgICAgIHJvd1tjb2x1bW5dID0gcHJveHlbaV07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy51aSkgeyB0aGlzLnVpLnVwZGF0ZSgpOyB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIHRoZSBpZGVhIGJlaGluZCBwb3B1bGF0ZSBpcyB0byBiZSBhYmxlIHRvIHNldCBhIHdob2xlIHJvdyBvciBjb2x1bW4gdG8gMCBvciAxXG4gICAgLy8gSUYgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIHN1Y2ggYXMgMC43LCB0aGVuIGl0IHdvdWxkIGJlY29tZSBhIHByb2JhYmlsaXR5XG4gICAgLy8gc28gcG9wdWxhdGUoMC43KSB3b3VsZCBnaXZlIGVhY2ggY2VsbCBhIDcwJSBjaGFuY2Ugb2YgYmVpbmcgMVxuICAgIHRoaXMucG9wdWxhdGUgPSB7XG4gICAgICBhbGw6IChvZGRzKSA9PiB7XG4gICAgICAgIGxldCBvZGRzU2VxdWVuY2UgPSBuZXcgU2VxdWVuY2Uob2Rkcyk7XG4gICAgICAgIHRoaXMuaXRlcmF0ZSgocixjKSA9PiB7XG4gICAgICAgICAgdGhpcy5wYXR0ZXJuW3JdW2NdID0gbWF0aC5jb2luKG9kZHNTZXF1ZW5jZS5uZXh0KCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSB1c2VkIHNvIHRoYXQgZWFjaCByb3cgaGFzIHNhbWUgb2RkcyBwYXR0ZXJuLCBldmVuIGlmIHJvdyBsZW5ndGggaXMgbm90IGRpdmlzaWJseSBieSBzZXF1ZW5jZSBsZW5ndGguXG4gICAgICAgIC8vLCgpID0+IHtcbiAgICAgICAgLy8gIG9kZHMucG9zID0gLTE7XG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKHRoaXMudWkpIHsgdGhpcy51aS51cGRhdGUoKTsgfVxuICAgICAgfSxcbiAgICAgIHJvdzogKHJvdz0wLG9kZHM9MSkgPT4ge1xuICAgICAgICBsZXQgb2Rkc1NlcXVlbmNlID0gbmV3IFNlcXVlbmNlKG9kZHMpO1xuICAgICAgICB0aGlzLnBhdHRlcm5bcm93XS5mb3JFYWNoKChjZWxsLGkpID0+IHtcbiAgICAgICAgICB0aGlzLnBhdHRlcm5bcm93XVtpXSA9IG1hdGguY29pbihvZGRzU2VxdWVuY2UubmV4dCgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnVpKSB7IHRoaXMudWkudXBkYXRlKCk7IH1cbiAgICAgIH0sXG4gICAgICBjb2x1bW46IChjb2x1bW49MCxvZGRzPTEpID0+IHtcbiAgICAgICAgbGV0IG9kZHNTZXF1ZW5jZSA9IG5ldyBTZXF1ZW5jZShvZGRzKTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuLmZvckVhY2goKHJvdyxpKSA9PiB7XG4gICAgICAgICAgdGhpcy5wYXR0ZXJuW2ldW2NvbHVtbl0gPSBtYXRoLmNvaW4ob2Rkc1NlcXVlbmNlLm5leHQoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodGhpcy51aSkgeyB0aGlzLnVpLnVwZGF0ZSgpOyB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGVzc2VudGlhbGwgcG9wdWxhdGUoMCkgc28gaSdtIG5vdCBzdXJlIGlmIHRoaXMgaXMgbmVjZXNzYXJ5IGJ1dCBpcyBuaWNlXG4gICAgdGhpcy5lcmFzZSA9IHtcbiAgICAgIGFsbDogKCkgPT4ge1xuICAgICAgICB0aGlzLnNldC5hbGwoMCk7XG4gICAgICB9LFxuICAgICAgcm93OiAocm93KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0LnJvdyhyb3csMCk7XG4gICAgICB9LFxuICAgICAgY29sdW1uOiAoY29sdW1uKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0LmNvbHVtbihjb2x1bW4sMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAvLyBlbmQgY29uc3RydWN0b3JcbiAgfVxuXG5cbiAgY3JlYXRlKHJvd3MsY29sdW1ucykge1xuICAgIHRoaXMucGF0dGVybiA9IFtdO1xuICAgIGZvciAoIGxldCByb3c9MDsgcm93IDwgcm93czsgcm93KysgKSB7XG4gICAgICBsZXQgYXJyID0gbmV3IEFycmF5KGNvbHVtbnMpO1xuICAgICAgdGhpcy5wYXR0ZXJuLnB1c2goYXJyKTtcbiAgICB9XG4gICAgdGhpcy5pdGVyYXRlKChyLGMpID0+IHsgdGhpcy5wYXR0ZXJuW3JdW2NdID0gZmFsc2U7IH0pO1xuICB9XG5cbiAgaXRlcmF0ZShmLCBmMikge1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKCBsZXQgcm93PTA7IHJvdyA8IHRoaXMucm93czsgcm93KysgKSB7XG4gICAgICBpZiAoZjIpIHsgZjIocm93KTsgfVxuICAgICAgZm9yICggbGV0IGNvbHVtbj0wOyBjb2x1bW4gPCB0aGlzLmNvbHVtbnM7IGNvbHVtbisrICkge1xuICAgICAgICBmKHJvdyxjb2x1bW4saSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3JtYXRBc1RleHQoKSB7XG4gICAgbGV0IHBhdHRlcm5TdHJpbmcgPSAnJztcbiAgICB0aGlzLml0ZXJhdGUoXG4gICAgICAocixjKSA9PiB7IHBhdHRlcm5TdHJpbmcgKz0gKHRoaXMucGF0dGVybltyXVtjXSA/IDEgOiAwKSArICcgJzsgfSxcbiAgICAgICgpID0+IHsgcGF0dGVyblN0cmluZyArPSAnXFxuJzsgfVxuICAgICk7XG4gICAgcmV0dXJuIHBhdHRlcm5TdHJpbmc7XG4gIH1cblxuICBsb2coKSB7XG4gICAgY29uc29sZS5sb2codGhpcy5mb3JtYXRBc1RleHQoKSk7XG4gIH1cblxuICB1cGRhdGUocGF0dGVybikge1xuICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm4gfHwgdGhpcy5wYXR0ZXJuO1xuICB9XG5cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1ucztcbiAgfVxuXG4gIGxvY2F0ZShpbmRleCkge1xuICAgIC8vIHJldHVybnMgcm93IGFuZCBjb2x1bW4gb2YgY2VsbCBieSBpbmRleFxuICAgIHJldHVybiB7XG4gICAgICByb3c6IH5+KCBpbmRleCAvIHRoaXMuY29sdW1ucyApLFxuICAgICAgY29sdW1uOiBpbmRleCAlIHRoaXMuY29sdW1uc1xuICAgIH07XG4gIH1cblxuICBpbmRleE9mKHJvdyxjb2x1bW4pIHtcbiAgICByZXR1cm4gY29sdW1uICsgcm93ICogdGhpcy5jb2x1bW5zO1xuICAgIC8vIHJldHVybnMgaW5kZXggb2YgY2VsbCBieSByb3cgYW5kIGNvbHVtblxuICB9XG5cbiAgcm93KHJvdykge1xuICAgIGxldCBkYXRhID0gW107XG4gICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuY29sdW1uczsgaSsrKSB7XG4gICAgICBkYXRhLnB1c2godGhpcy5wYXR0ZXJuW3Jvd10gPyAxIDogMCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29sdW1uKGNvbHVtbikge1xuICAgIGxldCBkYXRhID0gW107XG4gICAgZm9yIChsZXQgaT0wOyBpPHRoaXMucm93czsgaSsrKSB7XG4gICAgICBkYXRhLnB1c2godGhpcy5wYXR0ZXJuW2ldW2NvbHVtbl0gPyAxIDogMCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0IHJvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucGF0dGVybi5sZW5ndGg7XG4gIH1cbiAgc2V0IHJvd3Modikge1xuICAgIGxldCBwcmV2aW91cyA9IHRoaXMucGF0dGVybi5zbGljZSgwKTtcbiAgICB0aGlzLmNyZWF0ZSh2LHRoaXMuY29sdW1ucyk7XG4gICAgdGhpcy5pdGVyYXRlKChyLGMpID0+IHtcbiAgICAgIGlmIChwcmV2aW91c1tyXSAmJiBwcmV2aW91c1tyXVtjXSkge1xuICAgICAgICB0aGlzLnBhdHRlcm5bcl1bY10gPSBwcmV2aW91c1tyXVtjXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjb2x1bW5zKCkge1xuICAgIHJldHVybiB0aGlzLnBhdHRlcm5bMF0ubGVuZ3RoO1xuICB9XG4gIHNldCBjb2x1bW5zKHYpIHtcbiAgICBsZXQgcHJldmlvdXMgPSB0aGlzLnBhdHRlcm4uc2xpY2UoMCk7XG4gICAgdGhpcy5jcmVhdGUodGhpcy5yb3dzLHYpO1xuICAgIHRoaXMuaXRlcmF0ZSgocixjKSA9PiB7XG4gICAgICBpZiAocHJldmlvdXNbcl0gJiYgcHJldmlvdXNbcl1bY10pIHtcbiAgICAgICAgdGhpcy5wYXR0ZXJuW3JdW2NdID0gcHJldmlvdXNbcl1bY107XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL21vZGVscy9tYXRyaXguanMiLCIndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgbWF0aCBmcm9tICcuLi91dGlsL21hdGgnO1xyXG5pbXBvcnQgRHJ1bmsgZnJvbSAnLi9kcnVuayc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXF1ZW5jZSB7XHJcblxyXG4gICAgY29uc3RydWN0b3Ioc2VxdWVuY2UgPSBbMCwxMCwyMCwzMF0sIG1vZGU9J3VwJywgcG9zaXRpb249ZmFsc2UpIHtcclxuICAgICAgICB0aGlzLnZhbHVlcyA9IHNlcXVlbmNlO1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlcykpIHtcclxuICAgICAgICAgIHRoaXMudmFsdWVzID0gW3RoaXMudmFsdWVzXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbW9kZSA9IG1vZGU7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG5cclxuICAgICAgICB0aGlzLmRydW5rV2FsayA9IG5ldyBEcnVuaygwLCB0aGlzLnZhbHVlcy5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGFydFZhbHVlcyA9IHtcclxuICAgICAgICAgICd1cCc6IDAsXHJcbiAgICAgICAgICAnZG93bic6IHRoaXMudmFsdWVzLmxlbmd0aCAtIDEsXHJcbiAgICAgICAgICAnZHJ1bmsnOiB+fih0aGlzLnZhbHVlcy5sZW5ndGgvMiksXHJcbiAgICAgICAgICAncmFuZG9tJzogbWF0aC5yaSh0aGlzLnZhbHVlcy5sZW5ndGgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb24hPT1mYWxzZSkge1xyXG4gICAgICAgICAgdGhpcy5uZXh0ID0gdGhpc1t0aGlzLl9tb2RlXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5uZXh0ID0gdGhpcy5maXJzdDtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kZSgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX21vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1vZGUobW9kZSkge1xyXG4gICAgICAgIGlmICghKG1vZGUgPT09ICd1cCcgfHwgbW9kZSA9PT0gJ2Rvd24nIHx8IG1vZGUgPT09ICdyYW5kb20nIHx8IG1vZGUgPT09ICdkcnVuaycpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBvbmx5IG1vZGVzIGN1cnJlbnRseSBhbGxvd2VkIGFyZTogdXAsIGRvd24sIHJhbmRvbSwgZHJ1bmsnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9tb2RlID0gbW9kZTtcclxuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbikge1xyXG4gICAgICAgICAgdGhpcy5uZXh0ID0gdGhpc1t0aGlzLl9tb2RlXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhbHVlKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy52YWx1ZXNbdGhpcy5wb3NpdGlvbl07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZhbHVlKHYpIHtcclxuICAgICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMudmFsdWVzLmluZGV4T2Yodik7XHJcbiAgICB9XHJcblxyXG4gICAgZmlyc3QoKSB7XHJcbiAgICAgIGlmICh0aGlzLnBvc2l0aW9uIT09ZmFsc2UpIHtcclxuICAgICAgICB0aGlzLm5leHQgPSB0aGlzW3RoaXMuX21vZGVdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5zdGFydFZhbHVlc1t0aGlzLl9tb2RlXTtcclxuICAgICAgdGhpcy5uZXh0ID0gdGhpc1t0aGlzLl9tb2RlXTtcclxuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgdXAoKSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb24rKztcclxuICAgICAgdGhpcy5wb3NpdGlvbiAlPSB0aGlzLnZhbHVlcy5sZW5ndGg7XHJcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRvd24oKSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb24tLTtcclxuICAgICAgaWYgKHRoaXMucG9zaXRpb24gPCAwKSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9ICh0aGlzLnBvc2l0aW9uICsgdGhpcy52YWx1ZXMubGVuZ3RoKSAlIHRoaXMudmFsdWVzLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICByYW5kb20oKSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb24gPSBtYXRoLnJpKDAsIHRoaXMudmFsdWVzLmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRydW5rKCkge1xyXG4gICAgICB0aGlzLmRydW5rV2Fsay5tYXggPSB0aGlzLnZhbHVlcy5sZW5ndGg7XHJcbiAgICAgIHRoaXMuZHJ1bmtXYWxrLnZhbHVlID0gdGhpcy5wb3NpdGlvbjtcclxuICAgICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMuZHJ1bmtXYWxrLm5leHQoKTtcclxuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyogZnV0dXJlIG1ldGhvZHNcclxuICAgIC5ncm91cChzdGFydCxzdG9wKSAtLSBvdXRwdXRzIGEgZ3JvdXAgb2YgbiBpdGVtcyBmcm9tIHRoZSBsaXN0LCB3aXRoIHdyYXBwaW5nXHJcbiAgICAubG9vcChzdGFydCxzdG9wKSAtLSBjb25maW5lcyBzZXF1ZW5jaW5nIHRvIGEgc3Vic2V0IG9mIHRoZSB2YWx1ZXNcclxuICAgICAgICAoY291bGQgZXZlbiBoYXZlIGEgZGlzdGluY3Rpb24gYmV0d2VlbiAub3JpZ2luYWxWYWx1ZXMgYW5kIHRoZSBhcnJheSBvZiB2YWx1ZXMgYmVpbmcgdXNlZClcclxuICAgICovXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL21vZGVscy9zZXF1ZW5jZS5qcyIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IG1hdGggZnJvbSAnLi4vdXRpbC9tYXRoJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJ1bmsge1xuXG4gICAgY29uc3RydWN0b3IobWluPTAsIG1heD05LCB2YWx1ZT0wLCBpbmNyZW1lbnQ9MSwgbG9vcD1mYWxzZSkge1xuICAgICAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pbmNyZW1lbnQgPSBpbmNyZW1lbnQ7XG4gICAgICAgIHRoaXMubG9vcCA9IGxvb3A7XG4gICAgfVxuXG4gICAgbmV4dCgpIHtcbiAgICAgICAgdGhpcy52YWx1ZSArPSBtYXRoLnBpY2soLTEgKiB0aGlzLmluY3JlbWVudCwgdGhpcy5pbmNyZW1lbnQpO1xuICAgICAgICBpZiAodGhpcy52YWx1ZSA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sb29wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWluO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXggLSB0aGlzLmluY3JlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlIDwgdGhpcy5taW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxvb3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1pbiArIHRoaXMuaW5jcmVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9tb2RlbHMvZHJ1bmsuanMiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBtYXRoIGZyb20gJy4uL3V0aWwvbWF0aCc7XG5pbXBvcnQgRHJ1bmsgZnJvbSAnLi9kcnVuayc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvdW50ZXIge1xuXG4gICAgY29uc3RydWN0b3IobWluPTAsIG1heD0xMCwgbW9kZT0ndXAnLCB2YWx1ZT1mYWxzZSkge1xuICAgICAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgdGhpcy5kcnVua1dhbGsgPSBuZXcgRHJ1bmsodGhpcy5taW4sIHRoaXMubWF4KTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUhPT1mYWxzZSkge1xuICAgICAgICAgIHRoaXMubmV4dCA9IHRoaXNbdGhpcy5fbW9kZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5uZXh0ID0gdGhpcy5maXJzdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBtb2RlKG1vZGUpIHtcbiAgICAgICAgaWYgKCEobW9kZSA9PT0gJ3VwJyB8fCBtb2RlID09PSAnZG93bicgfHwgbW9kZSA9PT0gJ3JhbmRvbScgfHwgbW9kZSA9PT0gJ2RydW5rJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBvbmx5IG1vZGVzIGN1cnJlbnRseSBhbGxvd2VkIGFyZTogdXAsIGRvd24sIHJhbmRvbSwgZHJ1bmsnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tb2RlID0gbW9kZTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzW3RoaXMuX21vZGVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICAgIH1cblxuICAgIGZpcnN0KCkge1xuICAgICAgaWYgKHRoaXMudmFsdWUhPT1mYWxzZSkge1xuICAgICAgICB0aGlzLm5leHQgPSB0aGlzW3RoaXMuX21vZGVdO1xuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0YXJ0VmFsdWVzID0ge1xuICAgICAgICAndXAnOiB0aGlzLm1pbixcbiAgICAgICAgJ2Rvd24nOiB0aGlzLm1heCxcbiAgICAgICAgJ2RydW5rJzogfn5tYXRoLmF2ZXJhZ2UodGhpcy5taW4sdGhpcy5tYXgpLFxuICAgICAgICAncmFuZG9tJzogbWF0aC5yaSh0aGlzLm1pbix0aGlzLm1heClcbiAgICAgIH07XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdGFydFZhbHVlc1t0aGlzLl9tb2RlXTtcbiAgICAgIHRoaXMubmV4dCA9IHRoaXNbdGhpcy5fbW9kZV07XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICB1cCgpIHtcbiAgICAgICAgdGhpcy52YWx1ZSsrO1xuICAgICAgICBpZiAodGhpcy52YWx1ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWluO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGRvd24oKSB7XG4gICAgICAgIHRoaXMudmFsdWUtLTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIHJhbmRvbSgpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG1hdGgucmkodGhpcy5taW4sIHRoaXMubWF4KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgZHJ1bmsoKSB7XG4gICAgICAgIHRoaXMuZHJ1bmtXYWxrLm1pbiA9IHRoaXMubWluO1xuICAgICAgICB0aGlzLmRydW5rV2Fsay5tYXggPSB0aGlzLm1heDtcbiAgICAgICAgdGhpcy5kcnVua1dhbGsudmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5kcnVua1dhbGsubmV4dCgpO1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvbW9kZWxzL2NvdW50ZXIuanMiLCIndXNlIHN0cmljdCc7XG5cbmxldCBzdmcgPSByZXF1aXJlKCcuLi91dGlsL3N2ZycpO1xubGV0IG1hdGggPSByZXF1aXJlKCcuLi91dGlsL21hdGgnKTtcbmxldCBJbnRlcmZhY2UgPSByZXF1aXJlKCcuLi9jb3JlL2ludGVyZmFjZScpO1xubGV0IFN0ZXAgPSByZXF1aXJlKCcuLi9tb2RlbHMvc3RlcCcpO1xuaW1wb3J0ICogYXMgSW50ZXJhY3Rpb24gZnJvbSAnLi4vdXRpbC9pbnRlcmFjdGlvbic7XG5cbi8qKlxuKiBQYW4yRFxuKlxuKiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIGZvciBtb3ZpbmcgYSBzb3VuZCBhcm91bmQgYW4gYXJyYXkgb2Ygc3BlYWtlcnMuIFNwZWFrZXIgbG9jYXRpb25zIGNhbiBiZSBjdXN0b21pemVkLiBUaGUgaW50ZXJmYWNlIGNhbGN1bGF0ZXMgdGhlIGNsb3NlbmVzcyBvZiB0aGUgc291bmQgc291cmNlIHRvIGVhY2ggc3BlYWtlciBhbmQgcmV0dXJucyB0aGF0IGRpc3RhbmNlIGFzIGEgbnVtZXJpYyB2YWx1ZS5cbipcbiogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJwYW4yRFwiPjwvc3Bhbj5cbipcbiogQGV4YW1wbGVcbiogdmFyIHBhbjJkID0gbmV3IE5leHVzLlBhbjJkKCcjdGFyZ2V0JylcbipcbiogQGV4YW1wbGVcbiogdmFyIHBhbjJkID0gbmV3IE5leHVzLlBhbjJEKCcjdGFyZ2V0Jyx7XG4qICAgJ3NpemUnOiBbMjAwLDIwMF0sXG4qICAgJ3JhbmdlJzogMC41LCAgLy8gZGV0ZWN0aW9uIHJhZGl1cyBvZiBlYWNoIHNwZWFrZXJcbiogICAnbW9kZSc6ICdhYnNvbHV0ZScsICAgLy8gJ2Fic29sdXRlJyBvciAncmVsYXRpdmUnIHNvdW5kIG1vdmVtZW50XG4qICAgJ3NwZWFrZXJzJzogWyAgLy8gdGhlIHNwZWFrZXIgW3gseV0gcG9zaXRpb25zXG4qICAgICAgIFswLjUsMC4yXSxcbiogICAgICAgWzAuNzUsMC4yNV0sXG4qICAgICAgIFswLjgsMC41XSxcbiogICAgICAgWzAuNzUsMC43NV0sXG4qICAgICAgIFswLjUsMC44XSxcbiogICAgICAgWzAuMjUsMC43NV1cbiogICAgICAgWzAuMiwwLjVdLFxuKiAgICAgICBbMC4yNSwwLjI1XVxuKiAgIF1cbiogfSlcbipcbiogQG91dHB1dFxuKiBjaGFuZ2VcbiogRmlyZXMgYW55IHRpbWUgdGhlIFwic291cmNlXCIgbm9kZSdzIHBvc2l0aW9uIGNoYW5nZXMuIDxicj5cbiogVGhlIGV2ZW50IGRhdGEgaXMgYW4gYXJyYXkgb2YgdGhlIGFtcGxpdHVkZXMgKDAtMSksIHJlcHJlc2VudGluZyB0aGUgbGV2ZWwgb2YgZWFjaCBzcGVha2VyIChhcyBjYWxjdWxhdGVkIGJ5IGl0cyBkaXN0YW5jZSB0byB0aGUgYXVkaW8gc291cmNlKS5cbipcbiogQG91dHB1dGV4YW1wbGVcbiogcGFuMmQub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuKiAgIGNvbnNvbGUubG9nKHYpO1xuKiB9KVxuKlxuKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFuMkQgZXh0ZW5kcyBJbnRlcmZhY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgbGV0IG9wdGlvbnMgPSBbJ3JhbmdlJ107XG5cbiAgICBsZXQgZGVmYXVsdHMgPSB7XG4gICAgICAnc2l6ZSc6IFsyMDAsMjAwXSxcbiAgICAgICdyYW5nZSc6IDAuNSxcbiAgICAgICdtb2RlJzogJ2Fic29sdXRlJyxcbiAgICAgICdzcGVha2Vycyc6IFtcbiAgICAgICAgWzAuNSwwLjJdLFxuICAgICAgICBbMC43NSwwLjI1XSxcbiAgICAgICAgWzAuOCwwLjVdLFxuICAgICAgICBbMC43NSwwLjc1XSxcbiAgICAgICAgWzAuNSwwLjhdLFxuICAgICAgICBbMC4yNSwwLjc1XSxcbiAgICAgICAgWzAuMiwwLjVdLFxuICAgICAgICBbMC4yNSwwLjI1XVxuICAgICAgXVxuICAgIH07XG5cbiAgICBzdXBlcihhcmd1bWVudHMsb3B0aW9ucyxkZWZhdWx0cyk7XG5cbiAgICB0aGlzLnZhbHVlID0ge1xuICAgICAgeDogbmV3IFN0ZXAoMCwxLDAsMC41KSxcbiAgICAgIHk6IG5ldyBTdGVwKDAsMSwwLDAuNSlcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgQWJzb2x1dGUgb3IgcmVsYXRpdmUgbW91c2UgaW50ZXJhY3Rpb24uIEluIFwiYWJzb2x1dGVcIiBtb2RlLCB0aGUgc291cmNlIG5vZGUgd2lsbCBqdW1wIHRvIHlvdXIgbW91c2UgcG9zaXRpb24gb24gbW91c2UgY2xpY2suIEluIFwicmVsYXRpdmVcIiBtb2RlLCBpdCBkb2VzIG5vdC5cbiAgICAqL1xuICAgIHRoaXMubW9kZSA9IHRoaXMuc2V0dGluZ3MubW9kZTtcblxuICAgIHRoaXMucG9zaXRpb24gPSB7XG4gICAgICB4OiBuZXcgSW50ZXJhY3Rpb24uSGFuZGxlKHRoaXMubW9kZSwnaG9yaXpvbnRhbCcsWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKSxcbiAgICAgIHk6IG5ldyBJbnRlcmFjdGlvbi5IYW5kbGUodGhpcy5tb2RlLCd2ZXJ0aWNhbCcsWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKVxuICAgIH07XG4gICAgdGhpcy5wb3NpdGlvbi54LnZhbHVlID0gdGhpcy52YWx1ZS54Lm5vcm1hbGl6ZWQ7XG4gICAgdGhpcy5wb3NpdGlvbi55LnZhbHVlID0gdGhpcy52YWx1ZS55Lm5vcm1hbGl6ZWQ7XG5cbiAgICAvKipcbiAgICBBbiBhcnJheSBvZiBzcGVha2VyIGxvY2F0aW9ucy4gVXBkYXRlIHRoaXMgd2l0aCAubW92ZVNwZWFrZXIoKSBvciAubW92ZUFsbFNwZWFrZXJzKClcbiAgICAqL1xuICAgIHRoaXMuc3BlYWtlcnMgPSB0aGlzLnNldHRpbmdzLnNwZWFrZXJzO1xuXG4gICAgLyoqXG4gICAgUmV3cml0ZTogVGhlIG1heGltdW0gZGlzdGFuY2UgZnJvbSBhIHNwZWFrZXIgdGhhdCB0aGUgc291cmNlIG5vZGUgY2FuIGJlIGZvciBpdCB0byBiZSBoZWFyZCBmcm9tIHRoYXQgc3BlYWtlci4gQSBsb3cgcmFuZ2UgKDAuMSkgd2lsbCByZXN1bHQgaW4gc3BlYWtlcnMgb25seSBwbGF5aW5nIHdoZW4gdGhlIHNvdW5kIGlzIHZlcnkgY2xvc2UgaXQuIERlZmF1bHQgaXMgMC41IChoYWxmIG9mIHRoZSBpbnRlcmZhY2UpLlxuICAgICovXG4gICAgdGhpcy5yYW5nZSA9IHRoaXMuc2V0dGluZ3MucmFuZ2U7XG5cbiAgICAvKipcbiAgICBUaGUgY3VycmVudCBsZXZlbHMgZm9yIGVhY2ggc3BlYWtlci4gVGhpcyBpcyBjYWxjdWxhdGVkIHdoZW4gYSBzb3VyY2Ugbm9kZSBvciBzcGVha2VyIG5vZGUgaXMgbW92ZWQgdGhyb3VnaCBpbnRlcmFjdGlvbiBvciBwcm9ncmFtYXRpY2FsbHkuXG4gICAgKi9cbiAgICB0aGlzLmxldmVscyA9IFtdO1xuXG4gICAgdGhpcy5pbml0KCk7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZUxldmVscygpO1xuICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy5rbm9iID0gc3ZnLmNyZWF0ZSgnY2lyY2xlJyk7XG5cblxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmtub2IpO1xuXG5cbiAgICAvLyBhZGQgc3BlYWtlcnNcbiAgICB0aGlzLnNwZWFrZXJFbGVtZW50cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaT0wO2k8dGhpcy5zcGVha2Vycy5sZW5ndGg7aSsrKSB7XG4gICAgICBsZXQgc3BlYWtlckVsZW1lbnQgPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcblxuICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHNwZWFrZXJFbGVtZW50KTtcblxuICAgICAgdGhpcy5zcGVha2VyRWxlbWVudHMucHVzaChzcGVha2VyRWxlbWVudCk7XG4gICAgfVxuXG4gIH1cblxuICBzaXplSW50ZXJmYWNlKCkge1xuXG4gICAgICAgIHRoaXMuX21pbkRpbWVuc2lvbiA9IE1hdGgubWluKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO1xuXG4gICAgICAgIHRoaXMua25vYlJhZGl1cyA9IHtcbiAgICAgICAgICBvZmY6IH5+KHRoaXMuX21pbkRpbWVuc2lvbi8xMDApICogMyArIDUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMua25vYlJhZGl1cy5vbiA9IHRoaXMua25vYlJhZGl1cy5vZmYgKiAyO1xuXG4gICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N4Jyx0aGlzLndpZHRoLzIpO1xuICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeScsdGhpcy5oZWlnaHQvMik7XG4gICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ3InLHRoaXMua25vYlJhZGl1cy5vZmYpO1xuXG4gICAgICAgIGZvciAobGV0IGk9MDtpPHRoaXMuc3BlYWtlcnMubGVuZ3RoO2krKykge1xuICAgICAgICAgIGxldCBzcGVha2VyRWxlbWVudCA9IHRoaXMuc3BlYWtlckVsZW1lbnRzW2ldO1xuICAgICAgICAgIGxldCBzcGVha2VyID0gdGhpcy5zcGVha2Vyc1tpXTtcbiAgICAgICAgICBzcGVha2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2N4JyxzcGVha2VyWzBdKnRoaXMud2lkdGgpO1xuICAgICAgICAgIHNwZWFrZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnY3knLHNwZWFrZXJbMV0qdGhpcy5oZWlnaHQpO1xuICAgICAgICAgIHNwZWFrZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgncicsdGhpcy5fbWluRGltZW5zaW9uLzIwICsgNSk7XG4gICAgICAgICAgc3BlYWtlckVsZW1lbnQuc2V0QXR0cmlidXRlKCdmaWxsLW9wYWNpdHknLCAnMCcpO1xuICAgICAgICB9XG5cbiAgICAgIHRoaXMucG9zaXRpb24ueC5yZXNpemUoWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKTtcbiAgICAgIHRoaXMucG9zaXRpb24ueS5yZXNpemUoWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKTtcblxuICAgICAgICAvLyBuZXh0LCBuZWVkIHRvXG4gICAgICAgIC8vIHJlc2l6ZSBwb3NpdGlvbnNcbiAgICAgICAgLy8gY2FsY3VsYXRlIHNwZWFrZXIgZGlzdGFuY2VzXG4gICAgICB0aGlzLmNhbGN1bGF0ZUxldmVscygpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcblxuICB9XG5cbiAgY29sb3JJbnRlcmZhY2UoKSB7XG5cbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuZmlsbDtcbiAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQpO1xuXG4gICAgZm9yIChsZXQgaT0wO2k8dGhpcy5zcGVha2Vycy5sZW5ndGg7aSsrKSB7XG4gICAgICBsZXQgc3BlYWtlckVsZW1lbnQgPSB0aGlzLnNwZWFrZXJFbGVtZW50c1tpXTtcbiAgICAgIHNwZWFrZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmFjY2VudCk7XG4gICAgICBzcGVha2VyRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHRoaXMuY29sb3JzLmFjY2VudCk7XG4gICAgfVxuXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgdGhpcy5rbm9iQ29vcmRpbmF0ZXMgPSB7XG4gICAgICB4OiB0aGlzLnZhbHVlLngubm9ybWFsaXplZCAqIHRoaXMud2lkdGgsXG4gICAgICB5OiB0aGlzLmhlaWdodCAtIHRoaXMudmFsdWUueS5ub3JtYWxpemVkICogdGhpcy5oZWlnaHRcbiAgICB9O1xuXG4gICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3gnLHRoaXMua25vYkNvb3JkaW5hdGVzLngpO1xuICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N5Jyx0aGlzLmtub2JDb29yZGluYXRlcy55KTtcbiAgfVxuXG5cbiAgY2xpY2soKSB7XG4gICAgdGhpcy5wb3NpdGlvbi54LmFuY2hvciA9IHRoaXMubW91c2U7XG4gICAgdGhpcy5wb3NpdGlvbi55LmFuY2hvciA9IHRoaXMubW91c2U7XG4gICAgdGhpcy5tb3ZlKCk7XG4gIH1cblxuICBtb3ZlKCkge1xuICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcbiAgICAgIHRoaXMucG9zaXRpb24ueC51cGRhdGUodGhpcy5tb3VzZSk7XG4gICAgICB0aGlzLnBvc2l0aW9uLnkudXBkYXRlKHRoaXMubW91c2UpO1xuICAgICAgLy8gcG9zaXRpb24ueCBhbmQgcG9zaXRpb24ueSBhcmUgbm9ybWFsaXplZFxuICAgICAgLy8gc28gYXJlIHRoZSBsZXZlbHNcbiAgICAgIC8vIGxpa2VseSBkb24ndCBuZWVkIHRoaXMudmFsdWUgYXQgYWxsIC0tIG9ubHkgdXNlZCBmb3IgZHJhd2luZ1xuICAgICAgLy8gbm90IGdvaW5nIHRvIGJlIGEgJ3N0ZXAnIG9yICdtaW4nIGFuZCAnbWF4JyBpbiB0aGlzIG9uZS5cbiAgICAgIHRoaXMuY2FsY3VsYXRlTGV2ZWxzKCk7XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5sZXZlbHMpO1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICByZWxlYXNlKCkge1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBnZXQgbm9ybWFsaXplZCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogdGhpcy52YWx1ZS54Lm5vcm1hbGl6ZWQsXG4gICAgICB5OiB0aGlzLnZhbHVlLnkubm9ybWFsaXplZFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVMZXZlbHMoKSB7XG4gICAgdGhpcy52YWx1ZS54LnVwZGF0ZU5vcm1hbCggdGhpcy5wb3NpdGlvbi54LnZhbHVlICk7XG4gICAgdGhpcy52YWx1ZS55LnVwZGF0ZU5vcm1hbCggdGhpcy5wb3NpdGlvbi55LnZhbHVlICk7XG4gICAgdGhpcy5sZXZlbHMgPSBbXTtcbiAgICB0aGlzLnNwZWFrZXJzLmZvckVhY2goKHMsaSkgPT4ge1xuICAgICAgbGV0IGRpc3RhbmNlID0gbWF0aC5kaXN0YW5jZShzWzBdKnRoaXMud2lkdGgsc1sxXSp0aGlzLmhlaWdodCx0aGlzLnBvc2l0aW9uLngudmFsdWUqdGhpcy53aWR0aCwoMS10aGlzLnBvc2l0aW9uLnkudmFsdWUpKnRoaXMuaGVpZ2h0KTtcbiAgICAgIGxldCBsZXZlbCA9IG1hdGguY2xpcCgxLWRpc3RhbmNlLyh0aGlzLnJhbmdlKnRoaXMud2lkdGgpLDAsMSk7XG4gICAgICB0aGlzLmxldmVscy5wdXNoKGxldmVsKTtcbiAgICAgIHRoaXMuc3BlYWtlckVsZW1lbnRzW2ldLnNldEF0dHJpYnV0ZSgnZmlsbC1vcGFjaXR5JywgbGV2ZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIE1vdmUgdGhlIGF1ZGlvIHNvdXJjZSBub2RlIGFuZCB0cmlnZ2VyIHRoZSBvdXRwdXQgZXZlbnQuXG4gIEBwYXJhbSB4IHtudW1iZXJ9IE5ldyB4IGxvY2F0aW9uLCBub3JtYWxpemVkIDAtMVxuICBAcGFyYW0geSB7bnVtYmVyfSBOZXcgeSBsb2NhdGlvbiwgbm9ybWFsaXplZCAwLTFcbiAgKi9cbiAgbW92ZVNvdXJjZSh4LHkpIHtcbiAgICBsZXQgbG9jYXRpb24gPSB7XG4gICAgICB4OiB4KnRoaXMud2lkdGgsXG4gICAgICB5OiB5KnRoaXMuaGVpZ2h0XG4gICAgfTtcbiAgICB0aGlzLnBvc2l0aW9uLngudXBkYXRlKGxvY2F0aW9uKTtcbiAgICB0aGlzLnBvc2l0aW9uLnkudXBkYXRlKGxvY2F0aW9uKTtcbiAgICB0aGlzLmNhbGN1bGF0ZUxldmVscygpO1xuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLmxldmVscyk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICBNb3ZlIGEgc3BlYWtlciBub2RlIGFuZCB0cmlnZ2VyIHRoZSBvdXRwdXQgZXZlbnQuXG4gIEBwYXJhbSBpbmRleCB7bnVtYmVyfSBJbmRleCBvZiB0aGUgc3BlYWtlciB0byBtb3ZlXG4gIEBwYXJhbSB4IHtudW1iZXJ9IE5ldyB4IGxvY2F0aW9uLCBub3JtYWxpemVkIDAtMVxuICBAcGFyYW0geSB7bnVtYmVyfSBOZXcgeSBsb2NhdGlvbiwgbm9ybWFsaXplZCAwLTFcbiAgKi9cbiAgbW92ZVNwZWFrZXIoaW5kZXgseCx5KSB7XG5cbiAgICB0aGlzLnNwZWFrZXJzW2luZGV4XSA9IFt4LHldO1xuICAgIHRoaXMuc3BlYWtlckVsZW1lbnRzW2luZGV4XS5zZXRBdHRyaWJ1dGUoJ2N4JywgeCp0aGlzLndpZHRoKTtcbiAgICB0aGlzLnNwZWFrZXJFbGVtZW50c1tpbmRleF0uc2V0QXR0cmlidXRlKCdjeScsIHkqdGhpcy5oZWlnaHQpO1xuICAgIHRoaXMuY2FsY3VsYXRlTGV2ZWxzKCk7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMubGV2ZWxzKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuXG4gIH1cblxuICAvKipcbiAgU2V0IGFsbCBzcGVha2VyIGxvY2F0aW9uc1xuICBAcGFyYW0gbG9jYXRpb25zIHtBcnJheX0gQXJyYXkgb2Ygc3BlYWtlciBsb2NhdGlvbnMuIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIG5vcm1hbGl6ZWQgeCBhbmQgeSBjb29yZGluYXRlcy5cblxuICBzZXRTcGVha2Vycyhsb2NhdGlvbnMpIHtcblxuICB9XG4gICovXG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9pbnRlcmZhY2VzL3BhbjJkLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgbWF0aCA9IHJlcXVpcmUoJy4uL3V0aWwvbWF0aCcpO1xubGV0IHN2ZyA9IHJlcXVpcmUoJy4uL3V0aWwvc3ZnJyk7XG5sZXQgSW50ZXJmYWNlID0gcmVxdWlyZSgnLi4vY29yZS9pbnRlcmZhY2UnKTtcblxuLyoqXG4qIFRpbHRcbipcbiogQGRlc2NyaXB0aW9uIERldmljZSB0aWx0IHNlbnNvciB3aXRoIDIgb3IgMyBheGVzIChkZXBlbmRpbmcgb24geW91ciBkZXZpY2UgYW5kIGJyb3dzZXIpLlxuKlxuKiBAZGVtbyA8c3BhbiBuZXh1cy11aT0ndGlsdCc+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgdGlsdCA9IG5ldyBOZXh1cy5UaWx0KCcjdGFyZ2V0JylcbipcbiogQG91dHB1dFxuKiBjaGFuZ2VcbiogRmlyZXMgYXQgYSByZWd1bGFyIGludGVydmFsLCBhcyBsb25nIGFzIHRoaXMgaW50ZXJmYWNlIGlzIGFjdGl2ZSAoc2VlIHRoZSBpbnRlcmZhY2UncyA8aT4uYWN0aXZlPC9pPiBwcm9wZXJ0eSk8YnI+XG4qIFRoZSBldmVudCBkYXRhIGlzIGFuIDxpPm9iamVjdDwvaT4gY29udGFpbmluZyB4IChudW1iZXIpIGFuZCB5IChudW1iZXIpIHByb3BlcnRpZXMgd2hpY2ggcmVwcmVzZW50IHRoZSBjdXJyZW50IHRpbHQgc3RhdGUgb2YgdGhlIGRldmljZS5cbipcbiogQG91dHB1dGV4YW1wbGVcbiogdGlsdC5vbignY2hhbmdlJyxmdW5jdGlvbih2KSB7XG4qICAgY29uc29sZS5sb2codik7XG4qIH0pXG4qXG4qXG4qL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWx0IGV4dGVuZHMgSW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIGxldCBvcHRpb25zID0gWyd2YWx1ZSddO1xuXG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgJ3NpemUnOiBbODAsODBdXG4gICAgfTtcblxuICAgIHN1cGVyKGFyZ3VtZW50cyxvcHRpb25zLGRlZmF1bHRzKTtcblxuICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG5cbiAgICB0aGlzLmluaXQoKTtcblxuICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lciBmb3IgZGV2aWNlIG9yaWVudGF0aW9uXG5cbiAgXHR0aGlzLmJvdW5kVXBkYXRlID0gdGhpcy51cGRhdGUuYmluZCh0aGlzKTtcbiAgLy9cdHRoaXMuYm91bmRNb3pUaWx0ID0gdGhpcy5tb3pUaWx0LmJpbmQodGhpcylcblxuICBcdGlmICh3aW5kb3cuRGV2aWNlT3JpZW50YXRpb25FdmVudCkge1xuICBcdFx0dGhpcy5vcmllbnRhdGlvbkxpc3RlbmVyID0gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZW9yaWVudGF0aW9uJywgdGhpcy5ib3VuZFVwZGF0ZSwgZmFsc2UpO1xuICBcdH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuY29sb3JJbnRlcmZhY2UoKTtcbiAgICB9XG5cblxuXG4gICAgICAvKmVsc2UgaWYgKHdpbmRvdy5PcmllbnRhdGlvbkV2ZW50KSB7XG4gIC8vXHQgIFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ01vek9yaWVudGF0aW9uJywgdGhpcy5ib3VuZE1velRpbHQsIGZhbHNlKTtcbiAgXHR9IGVsc2Uge1xuICBcdCAgXHRjb25zb2xlLmxvZygnTm90IHN1cHBvcnRlZCBvbiB5b3VyIGRldmljZSBvciBicm93c2VyLicpO1xuICBcdH0gKi9cblxuXG4gIH1cblxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy50aXRsZSA9IHN2Zy5jcmVhdGUoJ3RleHQnKTtcbiAgICB0aGlzLmNpcmNsZVggPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcbiAgICB0aGlzLmNpcmNsZVkgPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcbiAgICB0aGlzLmNpcmNsZVogPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcblxuICAgIHRoaXMuYmFyWCA9IHN2Zy5jcmVhdGUoJ3BhdGgnKTtcbiAgICB0aGlzLmJhclkgPSBzdmcuY3JlYXRlKCdwYXRoJyk7XG4gICAgdGhpcy5iYXJaID0gc3ZnLmNyZWF0ZSgncGF0aCcpO1xuXG4gICAgdGhpcy5iYXJYMiA9IHN2Zy5jcmVhdGUoJ3BhdGgnKTtcbiAgICB0aGlzLmJhclkyID0gc3ZnLmNyZWF0ZSgncGF0aCcpO1xuICAgIHRoaXMuYmFyWjIgPSBzdmcuY3JlYXRlKCdwYXRoJyk7XG5cbiAgICB0aGlzLmJhclguc2V0QXR0cmlidXRlKCdvcGFjaXR5JywnMC44Jyk7XG4gICAgdGhpcy5iYXJZLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsJzAuOCcpO1xuICAgIHRoaXMuYmFyWi5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCcwLjgnKTtcbiAgICB0aGlzLmJhclgyLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsJzAuOCcpO1xuICAgIHRoaXMuYmFyWTIuc2V0QXR0cmlidXRlKCdvcGFjaXR5JywnMC44Jyk7XG4gICAgdGhpcy5iYXJaMi5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCcwLjgnKTtcblxuICAgIHRoaXMuY2lyY2xlWC5zZXRBdHRyaWJ1dGUoJ2N4Jyx0aGlzLndpZHRoKjMvMTIpO1xuICAgIHRoaXMuY2lyY2xlWC5zZXRBdHRyaWJ1dGUoJ2N5Jyx0aGlzLmhlaWdodCozLzQpO1xuICAgIHRoaXMuY2lyY2xlWC5zZXRBdHRyaWJ1dGUoJ3InLHRoaXMuaGVpZ2h0LzEwKTtcbiAgICB0aGlzLmNpcmNsZVguc2V0QXR0cmlidXRlKCdvcGFjaXR5JywnMC40Jyk7XG5cbiAgICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKCdjeCcsdGhpcy53aWR0aCo2LzEyKTtcbiAgICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKCdjeScsdGhpcy5oZWlnaHQqMy80KTtcbiAgICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKCdyJyx0aGlzLmhlaWdodC8xMCk7XG4gICAgdGhpcy5jaXJjbGVZLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScsJzAuNCcpO1xuXG4gICAgdGhpcy5jaXJjbGVaLnNldEF0dHJpYnV0ZSgnY3gnLHRoaXMud2lkdGgqOS8xMik7XG4gICAgdGhpcy5jaXJjbGVaLnNldEF0dHJpYnV0ZSgnY3knLHRoaXMuaGVpZ2h0KjMvNCk7XG4gICAgdGhpcy5jaXJjbGVaLnNldEF0dHJpYnV0ZSgncicsdGhpcy5oZWlnaHQvMTApO1xuICAgIHRoaXMuY2lyY2xlWi5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCcwLjQnKTtcblxuXG4gICAgdGhpcy5iYXJYLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJyxNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0LzMwKSk7XG4gICAgdGhpcy5iYXJZLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJyxNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0LzMwKSk7XG4gICAgdGhpcy5iYXJaLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJyxNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0LzMwKSk7XG5cbiAgICB0aGlzLmJhclguc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICB0aGlzLmJhclkuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICB0aGlzLmJhclouc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcblxuICAgIHRoaXMuYmFyWDIuc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLE1hdGgucm91bmQodGhpcy5oZWlnaHQvMzApKTtcbiAgICB0aGlzLmJhclkyLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJyxNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0LzMwKSk7XG4gICAgdGhpcy5iYXJaMi5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsTWF0aC5yb3VuZCh0aGlzLmhlaWdodC8zMCkpO1xuXG4gICAgdGhpcy5iYXJYMi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpO1xuICAgIHRoaXMuYmFyWTIuc2V0QXR0cmlidXRlKCdmaWxsJywgJ25vbmUnKTtcbiAgICB0aGlzLmJhcloyLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG5cblxuICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKCd4Jyx0aGlzLndpZHRoLzIpO1xuICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKCd5Jyx0aGlzLmhlaWdodC8zKzcpO1xuICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCcxNXB4Jyk7XG4gICAgdGhpcy50aXRsZS5zZXRBdHRyaWJ1dGUoJ2ZvbnQtd2VpZ2h0JywnYm9sZCcpO1xuICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKCdsZXR0ZXItc3BhY2luZycsJzJweCcpO1xuICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKCdvcGFjaXR5JywnMC43Jyk7XG4gICAgdGhpcy50aXRsZS5zZXRBdHRyaWJ1dGUoJ3RleHQtYW5jaG9yJywnbWlkZGxlJyk7XG4gICAgdGhpcy50aXRsZS50ZXh0Q29udGVudCA9ICdUSUxUJztcblxuXG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY2lyY2xlWCk7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY2lyY2xlWSk7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY2lyY2xlWik7XG5cbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYXJYKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYXJZKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYXJaKTtcblxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmJhclgyKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYXJZMik7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuYmFyWjIpO1xuXG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudGl0bGUpO1xuXG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcblxuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmNvbG9ycy5hY2NlbnQ7XG4gICAgICB0aGlzLmNpcmNsZVguc2V0QXR0cmlidXRlKCdmaWxsJyx0aGlzLmNvbG9ycy5saWdodCk7XG4gICAgICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKCdmaWxsJyx0aGlzLmNvbG9ycy5saWdodCk7XG4gICAgICB0aGlzLmNpcmNsZVouc2V0QXR0cmlidXRlKCdmaWxsJyx0aGlzLmNvbG9ycy5saWdodCk7XG4gICAgICB0aGlzLmNpcmNsZVguc2V0QXR0cmlidXRlKCdzdHJva2UnLHRoaXMuY29sb3JzLmxpZ2h0KTtcbiAgICAgIHRoaXMuY2lyY2xlWS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsdGhpcy5jb2xvcnMubGlnaHQpO1xuICAgICAgdGhpcy5jaXJjbGVaLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyx0aGlzLmNvbG9ycy5saWdodCk7XG4gICAgICB0aGlzLmJhclguc2V0QXR0cmlidXRlKCdzdHJva2UnLHRoaXMuY29sb3JzLmxpZ2h0KTtcbiAgICAgIHRoaXMuYmFyWS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsdGhpcy5jb2xvcnMubGlnaHQpO1xuICAgICAgdGhpcy5iYXJaLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyx0aGlzLmNvbG9ycy5saWdodCk7XG4gICAgICB0aGlzLmJhclgyLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyx0aGlzLmNvbG9ycy5saWdodCk7XG4gICAgICB0aGlzLmJhclkyLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyx0aGlzLmNvbG9ycy5saWdodCk7XG4gICAgICB0aGlzLmJhcloyLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyx0aGlzLmNvbG9ycy5saWdodCk7XG4gICAgICB0aGlzLnRpdGxlLnNldEF0dHJpYnV0ZSgnZmlsbCcsdGhpcy5jb2xvcnMubGlnaHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuZmlsbDtcbiAgICAgIHRoaXMuY2lyY2xlWC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICAgIHRoaXMuY2lyY2xlWS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICAgIHRoaXMuY2lyY2xlWi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICAgIHRoaXMuY2lyY2xlWC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQpO1xuICAgICAgdGhpcy5jaXJjbGVZLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyx0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG4gICAgICB0aGlzLmNpcmNsZVouc2V0QXR0cmlidXRlKCdzdHJva2UnLHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICAgIHRoaXMuYmFyWC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQpO1xuICAgICAgdGhpcy5iYXJZLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyx0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG4gICAgICB0aGlzLmJhclouc2V0QXR0cmlidXRlKCdzdHJva2UnLHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICAgIHRoaXMuYmFyWDIuc2V0QXR0cmlidXRlKCdzdHJva2UnLHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICAgIHRoaXMuYmFyWTIuc2V0QXR0cmlidXRlKCdzdHJva2UnLHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICAgIHRoaXMuYmFyWjIuc2V0QXR0cmlidXRlKCdzdHJva2UnLHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcbiAgICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKCdmaWxsJyx0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG4gICAgfVxuXG4gIH1cblxuICB1cGRhdGUodikge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpe1xuXG4gICAgICBsZXQgeSA9IHYuYmV0YTtcbiAgICAgIGxldCB4ID0gdi5nYW1tYTtcbiAgICAgIGxldCB6ID0gdi5hbHBoYTtcblxuICAgICAgLy8gdGFrZSB0aGUgb3JpZ2luYWwgLTkwIHRvIDkwIHNjYWxlIGFuZCBub3JtYWxpemUgaXQgMC0xXG4gICAgICB4ID0gbWF0aC5zY2FsZSh4LC05MCw5MCwwLDEpO1xuICAgICAgeSA9IG1hdGguc2NhbGUoeSwtOTAsOTAsMCwxKTtcbiAgICAgIHogPSBtYXRoLnNjYWxlKHosMCwzNjAsMCwxKTtcblxuXG4gICAgICBsZXQgaGFuZGxlUG9pbnRzID0ge1xuICAgICAgICBzdGFydDogTWF0aC5QSSoxLjUsXG4gICAgICAgIGVuZDogbWF0aC5jbGlwKCBtYXRoLnNjYWxlKHgsMCwwLjUsTWF0aC5QSSoxLjUsTWF0aC5QSSowLjUpICwgTWF0aC5QSSowLjUsIE1hdGguUEkqMS41IClcbiAgICAgIH07XG4gICAgICBsZXQgaGFuZGxlMlBvaW50cyA9IHtcbiAgICAgICAgc3RhcnQ6IE1hdGguUEkqMi41LFxuICAgICAgICBlbmQ6IG1hdGguY2xpcCggbWF0aC5zY2FsZSh4LDAuNSwxLE1hdGguUEkqMi41LE1hdGguUEkqMS41KSAsIE1hdGguUEkqMS41LCBNYXRoLlBJKjIuNSApXG4gICAgICB9O1xuXG4gICAgICBsZXQgaGFuZGxlUGF0aCA9IHN2Zy5hcmModGhpcy5jaXJjbGVYLmN4LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWC5jeS5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVguci5iYXNlVmFsLnZhbHVlLCBoYW5kbGVQb2ludHMuc3RhcnQsIGhhbmRsZVBvaW50cy5lbmQpO1xuICAgICAgbGV0IGhhbmRsZTJQYXRoID0gc3ZnLmFyYyh0aGlzLmNpcmNsZVguY3guYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVYLmN5LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWC5yLmJhc2VWYWwudmFsdWUsIGhhbmRsZTJQb2ludHMuc3RhcnQsIGhhbmRsZTJQb2ludHMuZW5kKTtcblxuICAgICAgdGhpcy5iYXJYLnNldEF0dHJpYnV0ZSgnZCcsIGhhbmRsZVBhdGgpO1xuICAgICAgdGhpcy5iYXJYMi5zZXRBdHRyaWJ1dGUoJ2QnLCBoYW5kbGUyUGF0aCk7XG5cblxuXG5cblxuICAgICAgaGFuZGxlUG9pbnRzID0ge1xuICAgICAgICBzdGFydDogTWF0aC5QSSoxLjUsXG4gICAgICAgIGVuZDogbWF0aC5jbGlwKCBtYXRoLnNjYWxlKHksMCwwLjUsTWF0aC5QSSoxLjUsTWF0aC5QSSowLjUpICwgTWF0aC5QSSowLjUsIE1hdGguUEkqMS41IClcbiAgICAgIH07XG4gICAgICBoYW5kbGUyUG9pbnRzID0ge1xuICAgICAgICBzdGFydDogTWF0aC5QSSoyLjUsXG4gICAgICAgIGVuZDogbWF0aC5jbGlwKCBtYXRoLnNjYWxlKHksMC41LDEsTWF0aC5QSSoyLjUsTWF0aC5QSSoxLjUpICwgTWF0aC5QSSoxLjUsIE1hdGguUEkqMi41IClcbiAgICAgIH07XG5cbiAgICAgIGhhbmRsZVBhdGggPSBzdmcuYXJjKHRoaXMuY2lyY2xlWS5jeC5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVkuY3kuYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVZLnIuYmFzZVZhbC52YWx1ZSwgaGFuZGxlUG9pbnRzLnN0YXJ0LCBoYW5kbGVQb2ludHMuZW5kKTtcbiAgICAgIGhhbmRsZTJQYXRoID0gc3ZnLmFyYyh0aGlzLmNpcmNsZVkuY3guYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVZLmN5LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWS5yLmJhc2VWYWwudmFsdWUsIGhhbmRsZTJQb2ludHMuc3RhcnQsIGhhbmRsZTJQb2ludHMuZW5kKTtcblxuICAgICAgdGhpcy5iYXJZLnNldEF0dHJpYnV0ZSgnZCcsIGhhbmRsZVBhdGgpO1xuICAgICAgdGhpcy5iYXJZMi5zZXRBdHRyaWJ1dGUoJ2QnLCBoYW5kbGUyUGF0aCk7XG5cblxuXG5cblxuXG4gICAgICBoYW5kbGVQb2ludHMgPSB7XG4gICAgICAgIHN0YXJ0OiBNYXRoLlBJKjEuNSxcbiAgICAgICAgZW5kOiBtYXRoLmNsaXAoIG1hdGguc2NhbGUoeiwwLDAuNSxNYXRoLlBJKjEuNSxNYXRoLlBJKjAuNSkgLCBNYXRoLlBJKjAuNSwgTWF0aC5QSSoxLjUgKVxuICAgICAgfTtcbiAgICAgIGhhbmRsZTJQb2ludHMgPSB7XG4gICAgICAgIHN0YXJ0OiBNYXRoLlBJKjIuNSxcbiAgICAgICAgZW5kOiBtYXRoLmNsaXAoIG1hdGguc2NhbGUoeiwwLjUsMSxNYXRoLlBJKjIuNSxNYXRoLlBJKjEuNSkgLCBNYXRoLlBJKjEuNSwgTWF0aC5QSSoyLjUgKVxuICAgICAgfTtcblxuICAgICAgaGFuZGxlUGF0aCA9IHN2Zy5hcmModGhpcy5jaXJjbGVaLmN4LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWi5jeS5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVouci5iYXNlVmFsLnZhbHVlLCBoYW5kbGVQb2ludHMuc3RhcnQsIGhhbmRsZVBvaW50cy5lbmQpO1xuICAgICAgaGFuZGxlMlBhdGggPSBzdmcuYXJjKHRoaXMuY2lyY2xlWi5jeC5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVouY3kuYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVaLnIuYmFzZVZhbC52YWx1ZSwgaGFuZGxlMlBvaW50cy5zdGFydCwgaGFuZGxlMlBvaW50cy5lbmQpO1xuXG4gICAgICB0aGlzLmJhclouc2V0QXR0cmlidXRlKCdkJywgaGFuZGxlUGF0aCk7XG4gICAgICB0aGlzLmJhcloyLnNldEF0dHJpYnV0ZSgnZCcsIGhhbmRsZTJQYXRoKTtcblxuXG4gICAgICAvKlxuXG4gICAgICBsZXQgcG9pbnRzWCA9IHtcbiAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgIGVuZDogbWF0aC5zY2FsZSggeCwgMCwgMSwgMCwgTWF0aC5QSSoyIClcbiAgICAgIH07XG5cbiAgICAvLyAgY29uc29sZS5sb2codGhpcy5jaXJjbGVYLmN4LmJhc2VWYWwudmFsdWUpO1xuXG4gICAgICBsZXQgcGF0aFggPSBzdmcuYXJjKHRoaXMuY2lyY2xlWC5jeC5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVguY3kuYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVYLnIuYmFzZVZhbC52YWx1ZSoyLCBwb2ludHNYLnN0YXJ0LCBwb2ludHNYLmVuZCk7XG5cbiAgICAgIHRoaXMuYmFyWC5zZXRBdHRyaWJ1dGUoJ2QnLHBhdGhYKTsgKi9cblxuICAgICAgLy90aGlzLnRleHRILnRleHRDb250ZW50ID0gbWF0aC5wcnVuZSh4LDIpO1xuICAgICAgLy90aGlzLnRleHRWLnRleHRDb250ZW50ID0gbWF0aC5wcnVuZSh5LDIpO1xuICAgICAgLy9cbiAgICAvLyAgdGhpcy5jaXJjbGVYLnNldEF0dHJpYnV0ZSgnb3BhY2l0eScseCk7XG4gICAgLy8gIHRoaXMuY2lyY2xlWS5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLHkpO1xuICAgIC8vICB0aGlzLmNpcmNsZVouc2V0QXR0cmlidXRlKCdvcGFjaXR5Jyx6KTtcblxuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCB7XG4gICAgICAgIHg6IHgsXG4gICAgICAgIHk6IHksXG4gICAgICAgIHo6IHpcbiAgICAgIH0pO1xuXG4gICAgfVxuXG4gIH1cblxuICBjbGljaygpIHtcbiAgICBpZiAod2luZG93LkRldmljZU9yaWVudGF0aW9uRXZlbnQpIHtcbiAgICAgIHRoaXMuYWN0aXZlID0gIXRoaXMuYWN0aXZlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICBXaGV0aGVyIHRoZSBpbnRlcmZhY2UgaXMgb24gKGVtaXR0aW5nIHZhbHVlcykgb3Igb2ZmIChwYXVzZWQgJiBub3QgZW1pdHRpbmcgdmFsdWVzKS4gU2V0dGluZyB0aGlzIHByb3BlcnR5IHdpbGwgdXBkYXRlIGl0LlxuICBAdHlwZSB7Ym9vbGVhbn1cbiAgKi9cblxuICBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBzZXQgYWN0aXZlKG9uKSB7XG4gICAgdGhpcy5fYWN0aXZlID0gb247XG4gICAgdGhpcy5jb2xvckludGVyZmFjZSgpO1xuICB9XG5cbiAgY3VzdG9tRGVzdHJveSgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGV2aWNlb3JpZW50YXRpb24nLCB0aGlzLmJvdW5kVXBkYXRlLCBmYWxzZSk7XG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL2ludGVyZmFjZXMvdGlsdC5qcyIsIid1c2Ugc3RyaWN0JztcblxubGV0IGRvbSA9IHJlcXVpcmUoJy4uL3V0aWwvZG9tJyk7XG5sZXQgbWF0aCA9IHJlcXVpcmUoJy4uL3V0aWwvbWF0aCcpO1xubGV0IEludGVyZmFjZSA9IHJlcXVpcmUoJy4uL2NvcmUvaW50ZXJmYWNlJyk7XG5sZXQgU2xpZGVyVGVtcGxhdGUgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL3NsaWRlcnRlbXBsYXRlJyk7XG5sZXQgdG91Y2ggPSByZXF1aXJlKCcuLi91dGlsL3RvdWNoJyk7XG5cblxuXG5jbGFzcyBTaW5nbGVTbGlkZXIgZXh0ZW5kcyBTbGlkZXJUZW1wbGF0ZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsnc2NhbGUnLCd2YWx1ZSddO1xuXG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgJ3NpemUnOiBbMTIwLDIwXSxcbiAgICAgICdvcmllbnRhdGlvbic6ICd2ZXJ0aWNhbCcsXG4gICAgICAnbW9kZSc6ICdhYnNvbHV0ZScsXG4gICAgICAnc2NhbGUnOiBbMCwxXSxcbiAgICAgICdzdGVwJzogMCxcbiAgICAgICd2YWx1ZSc6IDAsXG4gICAgICAnaGFzS25vYic6IHRydWVcbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG5cbiAgICAvKiBldmVudHMgKi9cblxuICAgIGlmICghdG91Y2guZXhpc3RzKSB7XG5cbiAgICAgIHRoaXMuY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubXVsdGlzbGlkZXIuaW50ZXJhY3RpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLm11bHRpc2xpZGVyLmludGVycG9sYXRpb24gPSB7XG4gICAgICAgICAgaW5kZXg6IHRoaXMuaW5kZXgsXG4gICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kb3duKCk7XG4gICAgICAgIHRoaXMubXVsdGlzbGlkZXIudmFsdWVzW3RoaXMuaW5kZXhdID0gdGhpcy52YWx1ZTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgKGUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlzbGlkZXIuaW50ZXJhY3RpbmcpIHtcbiAgICAgICAgICBpZiAoIXRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IGRvbS5maW5kUG9zaXRpb24odGhpcy5lbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tb3VzZSA9IGRvbS5sb2NhdGVNb3VzZShlLHRoaXMub2Zmc2V0KTtcbiAgICAgICAgICB0aGlzLmRvd24oKTtcbiAgICAgICAgICB0aGlzLm11bHRpc2xpZGVyLnZhbHVlc1t0aGlzLmluZGV4XSA9IHRoaXMudmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlzbGlkZXIuaW50ZXJwb2xhdGlvbikge1xuICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gTWF0aC5hYnModGhpcy5tdWx0aXNsaWRlci5pbnRlcnBvbGF0aW9uLmluZGV4LXRoaXMuaW5kZXgpO1xuICAgICAgICAgICAgaWYgKCBkaXN0YW5jZSA+IDEgKSB7XG4gICAgICAgICAgICAgIGxldCBsb3cgPSBNYXRoLm1pbih0aGlzLm11bHRpc2xpZGVyLmludGVycG9sYXRpb24uaW5kZXgsdGhpcy5pbmRleCk7XG4gICAgICAgICAgICAgIGxldCBoaWdoID0gTWF0aC5tYXgodGhpcy5tdWx0aXNsaWRlci5pbnRlcnBvbGF0aW9uLmluZGV4LHRoaXMuaW5kZXgpO1xuICAgICAgICAgICAgICBsZXQgbG93VmFsdWUgPSB0aGlzLm11bHRpc2xpZGVyLnNsaWRlcnNbbG93XS52YWx1ZTtcbiAgICAgICAgICAgICAgbGV0IGhpZ2hWYWx1ZSA9IHRoaXMubXVsdGlzbGlkZXIuc2xpZGVyc1toaWdoXS52YWx1ZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaT1sb3c7aTxoaWdoO2krKykge1xuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlzbGlkZXIuc2xpZGVyc1tpXS52YWx1ZSA9IG1hdGguaW50ZXJwKCAoaS1sb3cpL2Rpc3RhbmNlLCBsb3dWYWx1ZSwgaGlnaFZhbHVlICk7XG4gICAgICAgICAgICAgICAgbGV0IHNtb290aGVkVmFsdWUgPSB0aGlzLm11bHRpc2xpZGVyLnNsaWRlcnNbaV0udmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5tdWx0aXNsaWRlci52YWx1ZXNbaV0gPSBzbW9vdGhlZFZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlzbGlkZXIudXBkYXRlKGksc21vb3RoZWRWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm11bHRpc2xpZGVyLmludGVycG9sYXRpb24gPSB7XG4gICAgICAgICAgICBpbmRleDogdGhpcy5pbmRleCxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cblxuICAgICAgdGhpcy5tb3ZlID0gKCkgPT4ge1xuICAgICAgfTtcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXNsaWRlci5pbnRlcmFjdGluZykge1xuICAgICAgICAgIGlmICghdGhpcy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gZG9tLmZpbmRQb3NpdGlvbih0aGlzLmVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm1vdXNlID0gZG9tLmxvY2F0ZU1vdXNlKGUsdGhpcy5vZmZzZXQpO1xuICAgICAgICAgIHRoaXMuc2xpZGUoKTtcbiAgICAgICAgICB0aGlzLm11bHRpc2xpZGVyLnZhbHVlc1t0aGlzLmluZGV4XSA9IHRoaXMudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIHRoaXMucmVsZWFzZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5tdWx0aXNsaWRlci5pbnRlcmFjdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm11bHRpc2xpZGVyLmludGVycG9sYXRpb24gPSBmYWxzZTtcbiAgICAgIH07XG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlzbGlkZXIuaW50ZXJhY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLnVwKCk7XG4gICAgICAgICAgdGhpcy5tdWx0aXNsaWRlci5pbnRlcnBvbGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5tdWx0aXNsaWRlci52YWx1ZXNbdGhpcy5pbmRleF0gPSB0aGlzLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlzbGlkZXIuaW50ZXJhY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLnVwKCk7XG4gICAgICAgICAgdGhpcy5tdWx0aXNsaWRlci52YWx1ZXNbdGhpcy5pbmRleF0gPSB0aGlzLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIHRoaXMuY3VzdG9tU3R5bGUoKTtcbiAgfVxuXG4gIGN1c3RvbVN0eWxlKCkge1xuXG4gICAgLyogc3R5bGUgY2hhbmdlcyAqL1xuXG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCd4JywwKTtcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsJ3RyYW5zbGF0ZSgwLDApJyk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCdyeCcsMCk7IC8vIGNvcm5lciByYWRpdXNcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3J5JywwKTtcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx0aGlzLndpZHRoKTtcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsdGhpcy5oZWlnaHQpO1xuXG4gICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgneCcsMCk7XG4gICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywndHJhbnNsYXRlKDAsMCknKTtcbiAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCdyeCcsMCk7IC8vIGNvcm5lciByYWRpdXNcbiAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCdyeScsMCk7XG4gICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgnd2lkdGgnLHRoaXMud2lkdGgpO1xuICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsdGhpcy5oZWlnaHQpO1xuXG4gIH1cblxufVxuXG4vKipcbiogTXVsdGlzbGlkZXJcbipcbiogQGRlc2NyaXB0aW9uIE11bHRpc2xpZGVyXG4qXG4qIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwibXVsdGlzbGlkZXJcIj48L3NwYW4+XG4qXG4qIEBleGFtcGxlXG4qIHZhciBtdWx0aXNsaWRlciA9IG5ldyBOZXh1cy5NdWx0aXNsaWRlcignI3RhcmdldCcpXG4qXG4qIEBleGFtcGxlXG4qIHZhciBtdWx0aXNsaWRlciA9IG5ldyBOZXh1cy5NdWx0aXNsaWRlcignI3RhcmdldCcse1xuKiAgJ3NpemUnOiBbMjAwLDEwMF0sXG4qICAnbnVtYmVyT2ZTbGlkZXJzJzogNSxcbiogICdtaW4nOiAwLFxuKiAgJ21heCc6IDEsXG4qICAnc3RlcCc6IDAsXG4qICAndmFsdWVzJzogWzAuNywwLjcsMC43LDAuNywwLjddXG4qIH0pXG4qXG4qIEBvdXRwdXRcbiogY2hhbmdlXG4qIEZpcmVzIGFueSB0aW1lIHRoZSBpbnRlcmZhY2UncyB2YWx1ZSBjaGFuZ2VzLiA8YnI+XG4qIFRoZSBldmVudCBkYXRhIGFuIG9iamVjdCBjb250YWluaW5nIDxpPmluZGV4PC9pPiBhbmQgPGk+dmFsdWU8L2k+IHByb3BlcnRpZXNcbipcbiogQG91dHB1dGV4YW1wbGVcbiogbXVsdGlzbGlkZXIub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuKiAgIGNvbnNvbGUubG9nKHYpO1xuKiB9KVxuKlxuKi9cblxuLypcblByb3BlcnRpZXNcbi52YWx1ZXNcblxuKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTXVsdGlzbGlkZXIgZXh0ZW5kcyBJbnRlcmZhY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgbGV0IG9wdGlvbnMgPSBbJ3ZhbHVlJ107XG5cbiAgICBsZXQgZGVmYXVsdHMgPSB7XG4gICAgICAnc2l6ZSc6IFsyMDAsMTAwXSxcbiAgICAgICdudW1iZXJPZlNsaWRlcnMnOiA1LFxuICAgICAgJ21pbic6IDAsXG4gICAgICAnbWF4JzogMSxcbiAgICAgICdzdGVwJzogMCxcbiAgICAgICd2YWx1ZXMnOiBbMC43LDAuNywwLjcsMC43LDAuN11cbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG4gICAgdGhpcy5fbnVtYmVyT2ZTbGlkZXJzID0gdGhpcy5zZXR0aW5ncy5udW1iZXJPZlNsaWRlcnM7XG4gICAgdGhpcy52YWx1ZXMgPSB0aGlzLnNldHRpbmdzLnZhbHVlcztcblxuICAgIHRoaXMuc2xpZGVycyA9IFtdO1xuXG4gICAgdGhpcy5pbnRlcmFjdGluZyA9IGZhbHNlO1xuXG4gICAgdGhpcy5pbml0KCk7XG5cbiAgfVxuXG4gIGJ1aWxkRnJhbWUoKSB7XG4gICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG4gICAgbGV0IG1pbiA9IHRoaXMuc2V0dGluZ3MubWluO1xuICAgIGxldCBtYXggPSB0aGlzLnNldHRpbmdzLm1heDtcbiAgICBsZXQgc3RlcCA9IHRoaXMuc2V0dGluZ3Muc3RlcDtcblxuICAgIGlmICh0aGlzLnNsaWRlcnMubGVuZ3RoKSB7XG4gICAgICBtaW4gPSB0aGlzLnNsaWRlcnNbMF0ubWluO1xuICAgICAgbWF4ID0gdGhpcy5zbGlkZXJzWzBdLm1heDtcbiAgICAgIHN0ZXAgPSB0aGlzLnNsaWRlcnNbMF0uc3RlcDtcbiAgICB9XG5cbiAgICB0aGlzLnNsaWRlcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGk9MDtpPHRoaXMuX251bWJlck9mU2xpZGVycztpKyspIHtcbiAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cbiAgICAgIGxldCBzbGlkZXIgPSBuZXcgU2luZ2xlU2xpZGVyKGNvbnRhaW5lciwge1xuICAgICAgICAgIHNjYWxlOiBbbWluLG1heF0sXG4gICAgICAgICAgc3RlcDogc3RlcCxcbiAgICAgICAgICBtb2RlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIG9yaWVudGF0aW9uOiAndmVydGljYWwnLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlc1tpXSxcbiAgICAgICAgICBoYXNLbm9iOiBmYWxzZSxcbiAgICAgICAgICBjb21wb25lbnQ6IHRydWUsXG4gICAgICAgIH0sdGhpcy51cGRhdGUuYmluZCh0aGlzLGkpKTtcbiAgICAgIHNsaWRlci5tdWx0aXNsaWRlciA9IHRoaXM7XG5cbiAgICAgIHNsaWRlci5pbmRleCA9IGk7XG4gICAgICBpZiAodG91Y2guZXhpc3RzKSB7XG4gICAgICAgIHNsaWRlci5iYXIuaW5kZXggPSBpO1xuICAgICAgICBzbGlkZXIuZmlsbGJhci5pbmRleCA9IGk7XG4gICAgICAgIHNsaWRlci5wcmVDbGljayA9IHNsaWRlci5wcmVNb3ZlID0gc2xpZGVyLnByZVJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICAgICAgc2xpZGVyLmNsaWNrID0gc2xpZGVyLm1vdmUgPSBzbGlkZXIucmVsZWFzZSA9ICgpID0+IHt9O1xuICAgICAgICBzbGlkZXIucHJlVG91Y2ggPSBzbGlkZXIucHJlVG91Y2hNb3ZlID0gc2xpZGVyLnByZVRvdWNoUmVsZWFzZSA9ICgpID0+IHt9O1xuICAgICAgICBzbGlkZXIudG91Y2ggPSBzbGlkZXIudG91Y2hNb3ZlID0gc2xpZGVyLnRvdWNoUmVsZWFzZSA9ICgpID0+IHt9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNsaWRlcnMucHVzaChzbGlkZXIpO1xuICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICB9XG4gICAgaWYgKHRvdWNoLmV4aXN0cykge1xuICAgICAgdGhpcy5hZGRUb3VjaExpc3RlbmVycygpO1xuICAgIH1cblxuICB9XG5cbiAgY29sb3JJbnRlcmZhY2UoKSB7XG4gICAgZm9yIChsZXQgaT0wO2k8dGhpcy5zbGlkZXJzLmxlbmd0aDtpKyspIHtcbiAgICAgIHRoaXMuc2xpZGVyc1tpXS5jb2xvcnMgPSB0aGlzLmNvbG9ycztcbiAgICAgIHRoaXMuc2xpZGVyc1tpXS5jb2xvckludGVyZmFjZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICBsZXQgc2xpZGVyV2lkdGggPSB0aGlzLndpZHRoIC8gdGhpcy5zbGlkZXJzLmxlbmd0aDtcbiAgICBsZXQgc2xpZGVySGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cbiAgICBmb3IgKGxldCBpPTA7aTx0aGlzLnNsaWRlcnMubGVuZ3RoO2krKykge1xuICAgICAgdGhpcy5zbGlkZXJzW2ldLnJlc2l6ZShzbGlkZXJXaWR0aCxzbGlkZXJIZWlnaHQpO1xuICAgICAgdGhpcy5zbGlkZXJzW2ldLmN1c3RvbVN0eWxlKCk7XG4gICAgfVxuXG5cbiAgfVxuXG4gIHVwZGF0ZShpbmRleCx2YWx1ZSkge1xuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx7XG4gICAgICAnaW5kZXgnOiBpbmRleCxcbiAgICAgICd2YWx1ZSc6IHZhbHVlXG4gICAgfSk7XG4gIH1cblxuICBhZGRUb3VjaExpc3RlbmVycygpIHtcblxuICAgIHRoaXMucHJlQ2xpY2sgPSB0aGlzLnByZU1vdmUgPSB0aGlzLnByZVJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLmNsaWNrID0gdGhpcy5tb3ZlID0gdGhpcy5yZWxlYXNlID0gKCkgPT4ge307XG4gICAgdGhpcy5wcmVUb3VjaCA9IHRoaXMucHJlVG91Y2hNb3ZlID0gdGhpcy5wcmVUb3VjaFJlbGVhc2UgPSAoKSA9PiB7fTtcbiAgICB0aGlzLnRvdWNoID0gdGhpcy50b3VjaE1vdmUgPSB0aGlzLnRvdWNoUmVsZWFzZSA9ICgpID0+IHt9O1xuXG4gICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCAoZSkgPT4ge1xuICAgICAgbGV0IGVsZW1lbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYLGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZKTtcbiAgICAgIGxldCBzbGlkZXIgPSB0aGlzLnNsaWRlcnNbZWxlbWVudC5pbmRleF07XG4gICAgICBpZiAoIXNsaWRlci5vZmZzZXQpIHtcbiAgICAgICAgc2xpZGVyLm9mZnNldCA9IGRvbS5maW5kUG9zaXRpb24oc2xpZGVyLmVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgc2xpZGVyLm1vdXNlID0gZG9tLmxvY2F0ZU1vdXNlKGUsc2xpZGVyLm9mZnNldCk7XG4gICAgICBzbGlkZXIuZG93bigpO1xuICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQuaW5kZXg7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIChlKSA9PiB7XG4gICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFgsZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFkpO1xuICAgICAgbGV0IHNsaWRlciA9IHRoaXMuc2xpZGVyc1tlbGVtZW50LmluZGV4XTtcbiAgICAgIGlmICghc2xpZGVyLm9mZnNldCkge1xuICAgICAgICBzbGlkZXIub2Zmc2V0ID0gZG9tLmZpbmRQb3NpdGlvbihzbGlkZXIuZWxlbWVudCk7XG4gICAgICB9XG4gICAgICBzbGlkZXIubW91c2UgPSBkb20ubG9jYXRlTW91c2UoZSxzbGlkZXIub2Zmc2V0KTtcbiAgICAgIGlmIChlbGVtZW50LmluZGV4IT09dGhpcy5jdXJyZW50RWxlbWVudCkge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50RWxlbWVudCA+PSAwKSB7XG4gICAgICAgICAgbGV0IHBhc3RzbGlkZXIgPSB0aGlzLnNsaWRlcnNbdGhpcy5jdXJyZW50RWxlbWVudF07XG4gICAgICAgICAgcGFzdHNsaWRlci51cCgpO1xuICAgICAgICB9XG4gICAgICAgIHNsaWRlci5kb3duKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbGlkZXIuc2xpZGUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3VycmVudEVsZW1lbnQgPSBlbGVtZW50LmluZGV4O1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIChlKSA9PiB7XG4gICAgICAvLyBubyB0b3VjaGVzIHRvIGNhbGN1bGF0ZSBiZWNhdXNlIG5vbmUgcmVtYWluaW5nXG4gICAgICBsZXQgc2xpZGVyID0gdGhpcy5zbGlkZXJzW3RoaXMuY3VycmVudEVsZW1lbnRdO1xuICAgICAgc2xpZGVyLnVwKCk7XG4gICAgICB0aGlzLmludGVyYWN0aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgR2V0IG9yIHNldCB0aGUgbnVtYmVyIG9mIHNsaWRlcnNcbiAgQHR5cGUge051bWJlcn1cbiAgKi9cbiAgZ2V0IG51bWJlck9mU2xpZGVycygpIHtcbiAgICByZXR1cm4gdGhpcy5zbGlkZXJzLmxlbmd0aDtcbiAgfVxuXG4gIHNldCBudW1iZXJPZlNsaWRlcnModikge1xuICAgIGlmICh2PT09dGhpcy5zbGlkZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNsaWRlcnMuZm9yRWFjaCgoc2xpZGVyKT0+e1xuICAgICAgc2xpZGVyLmRlc3Ryb3koKTtcbiAgICB9KTtcbiAgICB0aGlzLmVtcHR5KCk7XG4gICAgdGhpcy5fbnVtYmVyT2ZTbGlkZXJzID0gdjtcbiAgICB0aGlzLmJ1aWxkSW50ZXJmYWNlKCk7XG4gIH1cblxuXG5cbiAgLyoqXG4gIExvd2VyIGxpbWl0IG9mIHRoZSBtdWx0aXNsaWRlcidzIG91dHB1dCByYW5nZVxuICBAdHlwZSB7bnVtYmVyfVxuICBAZXhhbXBsZSBtdWx0aXNsaWRlci5taW4gPSAxMDAwO1xuICAqL1xuICBnZXQgbWluKCkge1xuICAgIHJldHVybiB0aGlzLnNsaWRlcnNbMF0ubWluO1xuICB9XG4gIHNldCBtaW4odikge1xuICAgIHRoaXMuc2xpZGVycy5mb3JFYWNoKChzbGlkZXIpPT57XG4gICAgICBzbGlkZXIubWluID0gdjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICBVcHBlciBsaW1pdCBvZiB0aGUgbXVsdGlzbGlkZXIncyBvdXRwdXQgcmFuZ2VcbiAgQHR5cGUge251bWJlcn1cbiAgQGV4YW1wbGUgbXVsdGlzbGlkZXIubWF4ID0gMTAwMDtcbiAgKi9cbiAgZ2V0IG1heCgpIHtcbiAgICByZXR1cm4gdGhpcy5zbGlkZXJzWzBdLm1heDtcbiAgfVxuICBzZXQgbWF4KHYpIHtcbiAgICB0aGlzLnNsaWRlcnMuZm9yRWFjaCgoc2xpZGVyKT0+e1xuICAgICAgc2xpZGVyLm1heCA9IHY7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgVGhlIGluY3JlbWVudCB0aGF0IHRoZSBtdWx0aXNsaWRlcidzIHZhbHVlIGNoYW5nZXMgYnkuXG4gIEB0eXBlIHtudW1iZXJ9XG4gIEBleGFtcGxlIG11bHRpc2xpZGVyLnN0ZXAgPSA1O1xuICAqL1xuICBnZXQgc3RlcCgpIHtcbiAgICByZXR1cm4gdGhpcy5zbGlkZXJzWzBdLnN0ZXA7XG4gIH1cbiAgc2V0IHN0ZXAodikge1xuICAgIHRoaXMuc2xpZGVycy5mb3JFYWNoKChzbGlkZXIpPT57XG4gICAgICBzbGlkZXIuc3RlcCA9IHY7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgU2V0IHRoZSB2YWx1ZSBvZiBhbiBpbmRpdmlkdWFsIHNsaWRlclxuICBAcGFyYW0gaW5kZXgge251bWJlcn0gU2xpZGVyIGluZGV4XG4gIEBwYXJhbSB2YWx1ZSB7bnVtYmVyfSBOZXcgc2xpZGVyIHZhbHVlXG4gIEBleGFtcGxlXG4gIC8vIFNldCB0aGUgZmlyc3Qgc2xpZGVyIHRvIHZhbHVlIDAuNVxuICBtdWx0aXNsaWRlci5zZXRTbGlkZXIoMCwwLjUpXG4gICovXG4gIHNldFNsaWRlcihpbmRleCx2YWx1ZSkge1xuICAgIHRoaXMuc2xpZGVyc1tpbmRleF0udmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScse1xuICAgICAgJ2luZGV4JzogaW5kZXgsXG4gICAgICAndmFsdWUnOiB2YWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gIFNldCB0aGUgdmFsdWUgb2YgYWxsIHNsaWRlcnMgYXQgb25jZS4gSWYgdGhlIHNpemUgb2YgdGhlIGlucHV0IGFycmF5IGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IG51bWJlciBvZiBzbGlkZXJzLCB0aGUgdmFsdWUgYXJyYXkgd2lsbCByZXBlYXQgdW50aWwgYWxsIHNsaWRlcnMgaGF2ZSBiZWVuIHNldC4gSS5lLiBhbiBpbnB1dCBhcnJheSBvZiBsZW5ndGggMSB3aWxsIHNldCBhbGwgc2xpZGVycyB0byB0aGF0IHZhbHVlLlxuICBAcGFyYW0gdmFsdWVzIHtBcnJheX0gQWxsIHNsaWRlciB2YWx1ZXNcbiAgQGV4YW1wbGVcbiAgbXVsdGlzbGlkZXIuc2V0QWxsU2xpZGVycyhbMC4yLDAuMywwLjQsMC41LDAuNl0pXG4gICovXG4gIHNldEFsbFNsaWRlcnModmFsdWVzKSB7XG4gICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgdGhpcy5zbGlkZXJzLmZvckVhY2goKHNsaWRlcixpKT0+e1xuICAgICAgc2xpZGVyLnZhbHVlID0gdmFsdWVzW2kldmFsdWVzLmxlbmd0aF07XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScse1xuICAgICAgICAnaW5kZXgnOiBpLFxuICAgICAgICAndmFsdWUnOiBzbGlkZXIudmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9pbnRlcmZhY2VzL211bHRpc2xpZGVyLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgc3ZnID0gcmVxdWlyZSgnLi4vdXRpbC9zdmcnKTtcbmxldCBJbnRlcmZhY2UgPSByZXF1aXJlKCcuLi9jb3JlL2ludGVyZmFjZScpO1xubGV0IFN0ZXAgPSByZXF1aXJlKCcuLi9tb2RlbHMvc3RlcCcpO1xuaW1wb3J0ICogYXMgSW50ZXJhY3Rpb24gZnJvbSAnLi4vdXRpbC9pbnRlcmFjdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNsaWRlclRlbXBsYXRlIGV4dGVuZHMgSW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcihhcmdzLG9wdGlvbnMsZGVmYXVsdHMpIHtcblxuICAgIHN1cGVyKGFyZ3Msb3B0aW9ucyxkZWZhdWx0cyk7XG5cbiAgICB0aGlzLm9yaWVudGF0aW9uID0gdGhpcy5zZXR0aW5ncy5vcmllbnRhdGlvbjtcblxuICAvLyAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5tb2RlO1xuXG4gICAgdGhpcy5oYXNLbm9iID0gdGhpcy5zZXR0aW5ncy5oYXNLbm9iO1xuXG4gICAgLy8gdGhpcy5zdGVwIHNob3VsZCBldmVudHVhbGx5IGJlIGdldC9zZXRcbiAgICAvLyB1cGRhdGluZyBpdCB3aWxsIHVwZGF0ZSB0aGUgX3ZhbHVlIHN0ZXAgbW9kZWxcbiAgLy8gIHRoaXMuc3RlcCA9IHRoaXMuc2V0dGluZ3Muc3RlcDsgLy8gZmxvYXRcblxuICAgIHRoaXMuX3ZhbHVlID0gbmV3IFN0ZXAodGhpcy5zZXR0aW5ncy5zY2FsZVswXSwgdGhpcy5zZXR0aW5ncy5zY2FsZVsxXSwgdGhpcy5zZXR0aW5ncy5zdGVwLCB0aGlzLnNldHRpbmdzLnZhbHVlKTtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG4gICAgdGhpcy5wb3NpdGlvbiA9IG5ldyBJbnRlcmFjdGlvbi5IYW5kbGUodGhpcy5zZXR0aW5ncy5tb2RlLHRoaXMub3JpZW50YXRpb24sWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKTtcbiAgICB0aGlzLnBvc2l0aW9uLnZhbHVlID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblxuICAgIHRoaXMudmFsdWUgPSB0aGlzLl92YWx1ZS52YWx1ZTtcblxuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnZhbHVlKTtcblxuICB9XG5cbiAgYnVpbGRJbnRlcmZhY2UoKSB7XG5cbiAgICB0aGlzLmJhciA9IHN2Zy5jcmVhdGUoJ3JlY3QnKTtcbiAgICB0aGlzLmZpbGxiYXIgPSBzdmcuY3JlYXRlKCdyZWN0Jyk7XG4gICAgdGhpcy5rbm9iID0gc3ZnLmNyZWF0ZSgnY2lyY2xlJyk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYXIpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmZpbGxiYXIpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmtub2IpO1xuXG4gICAgdGhpcy5zaXplSW50ZXJmYWNlKCk7XG5cblxuXG4gIH1cblxuICBzaXplSW50ZXJmYWNlKCkge1xuXG5cbiAgICBpZiAoIXRoaXMuc2V0dGluZ3Mub3JpZW50YXRpb24pIHtcbiAgICAgIGlmICh0aGlzLndpZHRoIDwgdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB4LCB5LCB3LCBoLCBiYXJPZmZzZXQsIGNvcm5lclJhZGl1cztcbiAgICB0aGlzLmtub2JEYXRhID0ge1xuICAgICAgbGV2ZWw6IDAsXG4gICAgICByOiAwXG4gICAgfTtcblxuICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICB0aGlzLnRoaWNrbmVzcyA9IHRoaXMud2lkdGggLyAyO1xuICAgIFx0eCA9IHRoaXMud2lkdGgvMjtcbiAgICBcdHkgPSAwO1xuICAgIFx0dyA9IHRoaXMudGhpY2tuZXNzO1xuICAgIFx0aCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgdGhpcy5rbm9iRGF0YS5yID0gdGhpcy50aGlja25lc3MgKiAwLjg7XG4gICAgXHR0aGlzLmtub2JEYXRhLmxldmVsID0gaC10aGlzLm5vcm1hbGl6ZWQqaDtcbiAgICAgIGJhck9mZnNldCA9ICd0cmFuc2xhdGUoJyt0aGlzLnRoaWNrbmVzcyooLTEpLzIrJywwKSc7XG4gICAgICBjb3JuZXJSYWRpdXMgPSB3LzI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGhpY2tuZXNzID0gdGhpcy5oZWlnaHQgLyAyO1xuICAgIFx0eCA9IDA7XG4gICAgXHR5ID0gdGhpcy5oZWlnaHQvMjtcbiAgICBcdHcgPSB0aGlzLndpZHRoO1xuICAgIFx0aCA9IHRoaXMudGhpY2tuZXNzO1xuICAgICAgdGhpcy5rbm9iRGF0YS5yID0gdGhpcy50aGlja25lc3MgKiAwLjg7XG4gICAgXHR0aGlzLmtub2JEYXRhLmxldmVsID0gdGhpcy5ub3JtYWxpemVkKnc7XG4gICAgICBiYXJPZmZzZXQgPSAndHJhbnNsYXRlKDAsJyt0aGlzLnRoaWNrbmVzcyooLTEpLzIrJyknO1xuICAgICAgY29ybmVyUmFkaXVzID0gaC8yO1xuICAgIH1cblxuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgneCcseCk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCd5Jyx5KTtcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsYmFyT2Zmc2V0KTtcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3J4Jyxjb3JuZXJSYWRpdXMpOyAvLyBjb3JuZXIgcmFkaXVzXG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCdyeScsY29ybmVyUmFkaXVzKTtcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx3KTtcbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsaCk7XG5cbiAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgneCcseCk7XG4gICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCd5Jyx0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx3KTtcbiAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsaC10aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZSgneCcsMCk7XG4gICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCd5Jyx5KTtcbiAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ3dpZHRoJyx0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsaCk7XG4gICAgfVxuICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsYmFyT2Zmc2V0KTtcbiAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCdyeCcsY29ybmVyUmFkaXVzKTtcbiAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCdyeScsY29ybmVyUmFkaXVzKTtcblxuICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeCcseCk7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeScsdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N4Jyx0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N5Jyx5KTtcbiAgICB9XG4gICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgncicsdGhpcy5rbm9iRGF0YS5yKTtcblxuXG4gICAgaWYgKHRoaXMucG9zaXRpb24pIHtcbiAgICAgIHRoaXMucG9zaXRpb24ucmVzaXplKFswLHRoaXMud2lkdGhdLFt0aGlzLmhlaWdodCwwXSk7XG4gICAgfVxuXG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcblxuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmZpbGwpO1xuICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuICAgIGlmICghdGhpcy5oYXNLbm9iKSB7XG4gICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdmaWxsJywnbm9uZScpO1xuICAgIH1cblxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGlja2VkKSB7XG4gICAgICB0aGlzLmtub2JEYXRhLnIgPSB0aGlzLnRoaWNrbmVzcyowLjc1O1xuICAgIH1cbiAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdyJyx0aGlzLmtub2JEYXRhLnIpO1xuXG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgICB0aGlzLmtub2JEYXRhLmxldmVsID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZCp0aGlzLmhlaWdodDtcbiAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeScsdGhpcy5oZWlnaHQgLSB0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCd5Jyx0aGlzLmhlaWdodCAtIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICB0aGlzLmtub2JEYXRhLmxldmVsID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZCp0aGlzLndpZHRoO1xuICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N4Jyx0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCd4JywwKTtcbiAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgZG93bigpIHtcbiAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xuICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzKjAuOTtcbiAgICB0aGlzLnBvc2l0aW9uLmFuY2hvciA9IHRoaXMubW91c2U7XG4gICAgdGhpcy5zbGlkZSgpO1xuICB9XG5cbiAgc2xpZGUoKSB7XG4gICAgaWYgKHRoaXMuY2xpY2tlZCkge1xuICAgICAgdGhpcy5wb3NpdGlvbi51cGRhdGUodGhpcy5tb3VzZSk7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5fdmFsdWUudXBkYXRlTm9ybWFsKCB0aGlzLnBvc2l0aW9uLnZhbHVlICk7XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXAoKSB7XG4gICAgdGhpcy5jbGlja2VkID0gZmFsc2U7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldCBub3JtYWxpemVkKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5ub3JtYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gIFRoZSBzbGlkZXIncyBjdXJyZW50IHZhbHVlLiBJZiBzZXQgbWFudWFsbHksIHdpbGwgdXBkYXRlIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cbiAgQHR5cGUge251bWJlcn1cbiAgQGV4YW1wbGUgc2xpZGVyLnZhbHVlID0gMTA7XG4gICovXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHYpIHtcbiAgICB0aGlzLl92YWx1ZS51cGRhdGUodik7XG4gICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICBMb3dlciBsaW1pdCBvZiB0aGUgc2xpZGVycydzIG91dHB1dCByYW5nZVxuICBAdHlwZSB7bnVtYmVyfVxuICBAZXhhbXBsZSBzbGlkZXIubWluID0gMTAwMDtcbiAgKi9cbiAgZ2V0IG1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUubWluO1xuICB9XG4gIHNldCBtaW4odikge1xuICAgIHRoaXMuX3ZhbHVlLm1pbiA9IHY7XG4gIH1cblxuICAvKipcbiAgVXBwZXIgbGltaXQgb2YgdGhlIHNsaWRlcidzIG91dHB1dCByYW5nZVxuICBAdHlwZSB7bnVtYmVyfVxuICBAZXhhbXBsZSBzbGlkZXIubWF4ID0gMTAwMDtcbiAgKi9cbiAgZ2V0IG1heCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUubWF4O1xuICB9XG4gIHNldCBtYXgodikge1xuICAgIHRoaXMuX3ZhbHVlLm1heCA9IHY7XG4gIH1cblxuICAvKipcbiAgVGhlIGluY3JlbWVudCB0aGF0IHRoZSBzbGlkZXIncyB2YWx1ZSBjaGFuZ2VzIGJ5LlxuICBAdHlwZSB7bnVtYmVyfVxuICBAZXhhbXBsZSBzbGlkZXIuc3RlcCA9IDU7XG4gICovXG4gIGdldCBzdGVwKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZS5zdGVwO1xuICB9XG4gIHNldCBzdGVwKHYpIHtcbiAgICB0aGlzLl92YWx1ZS5zdGVwID0gdjtcbiAgfVxuXG4gIC8qKlxuICBBYnNvbHV0ZSBtb2RlIChzbGlkZXIncyB2YWx1ZSBqdW1wcyB0byBtb3VzZSBjbGljayBwb3NpdGlvbikgb3IgcmVsYXRpdmUgbW9kZSAobW91c2UgZHJhZyBjaGFuZ2VzIHZhbHVlIHJlbGF0aXZlIHRvIGl0cyBjdXJyZW50IHBvc2l0aW9uKS4gRGVmYXVsdDogXCJyZWxhdGl2ZVwiLlxuICBAdHlwZSB7c3RyaW5nfVxuICBAZXhhbXBsZSBzbGlkZXIubW9kZSA9IFwicmVsYXRpdmVcIjtcbiAgKi9cbiAgZ2V0IG1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb24ubW9kZTtcbiAgfVxuICBzZXQgbW9kZSh2KSB7XG4gICAgdGhpcy5wb3NpdGlvbi5tb2RlID0gdjtcbiAgfVxuXG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9jb21wb25lbnRzL3NsaWRlcnRlbXBsYXRlLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgc3ZnID0gcmVxdWlyZSgnLi4vdXRpbC9zdmcnKTtcbmxldCBtYXRoID0gcmVxdWlyZSgnLi4vdXRpbC9tYXRoJyk7XG5sZXQgSW50ZXJmYWNlID0gcmVxdWlyZSgnLi4vY29yZS9pbnRlcmZhY2UnKTtcbmxldCBTdGVwID0gcmVxdWlyZSgnLi4vbW9kZWxzL3N0ZXAnKTtcbmltcG9ydCAqIGFzIEludGVyYWN0aW9uIGZyb20gJy4uL3V0aWwvaW50ZXJhY3Rpb24nO1xuXG4vKipcbiogUGFuXG4qXG4qIEBkZXNjcmlwdGlvbiBTdGVyZW8gY3Jvc3NmYWRlci5cbipcbiogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJwYW5cIj48L3NwYW4+XG4qXG4qIEBleGFtcGxlXG4qIHZhciBwYW4gPSBuZXcgTmV4dXMuUGFuKCcjdGFyZ2V0JylcbipcbiogQG91dHB1dFxuKiBjaGFuZ2VcbiogRmlyZXMgYW55IHRpbWUgdGhlIGludGVyZmFjZSdzIHZhbHVlIGNoYW5nZXMuIDxicj5cbiogVGhlIGV2ZW50IGRhdGEgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZSdzIDxpPnZhbHVlPC9pPiAoLTEgdG8gMSksIGFzIHdlbGwgYXMgPGk+TDwvaT4gYW5kIDxpPlI8L2k+IGFtcGxpdHVkZSB2YWx1ZXMgKDAtMSkgZm9yIGxlZnQgYW5kIHJpZ2h0IHNwZWFrZXJzLCBjYWxjdWxhdGVkIGJ5IGEgc3F1YXJlLXJvb3QgY3Jvc3NmYWRlIGFsZ29yaXRobS5cbipcbiogQG91dHB1dGV4YW1wbGVcbiogcGFuLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcbiogICBjb25zb2xlLmxvZyh2KTtcbiogfSlcbipcbipcbiovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhbiBleHRlbmRzIEludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsnc2NhbGUnLCd2YWx1ZSddO1xuXG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgJ3NpemUnOiBbMTIwLDIwXSxcbiAgICAgICdvcmllbnRhdGlvbic6ICdob3Jpem9udGFsJyxcbiAgICAgICdtb2RlJzogJ3JlbGF0aXZlJyxcbiAgICAgICdzY2FsZSc6IFstMSwxXSxcbiAgICAgICdzdGVwJzogMCxcbiAgICAgICd2YWx1ZSc6IDAsXG4gICAgICAnaGFzS25vYic6IHRydWVcbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG4gICAgdGhpcy5vcmllbnRhdGlvbiA9IHRoaXMuc2V0dGluZ3Mub3JpZW50YXRpb247XG5cbiAgICB0aGlzLm1vZGUgPSB0aGlzLnNldHRpbmdzLm1vZGU7XG5cbiAgICB0aGlzLmhhc0tub2IgPSB0aGlzLnNldHRpbmdzLmhhc0tub2I7XG5cbiAgICAvLyB0aGlzLnN0ZXAgc2hvdWxkIGV2ZW50dWFsbHkgYmUgZ2V0L3NldFxuICAgIC8vIHVwZGF0aW5nIGl0IHdpbGwgdXBkYXRlIHRoZSBfdmFsdWUgc3RlcCBtb2RlbFxuICAgIHRoaXMuc3RlcCA9IHRoaXMuc2V0dGluZ3Muc3RlcDsgLy8gZmxvYXRcblxuICAgIHRoaXMuX3ZhbHVlID0gbmV3IFN0ZXAodGhpcy5zZXR0aW5ncy5zY2FsZVswXSwgdGhpcy5zZXR0aW5ncy5zY2FsZVsxXSwgdGhpcy5zZXR0aW5ncy5zdGVwLCB0aGlzLnNldHRpbmdzLnZhbHVlKTtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG4gICAgdGhpcy5wb3NpdGlvbiA9IG5ldyBJbnRlcmFjdGlvbi5IYW5kbGUodGhpcy5tb2RlLHRoaXMub3JpZW50YXRpb24sWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKTtcbiAgICB0aGlzLnBvc2l0aW9uLnZhbHVlID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblxuICAgIHRoaXMudmFsdWUgPSB0aGlzLl92YWx1ZS52YWx1ZTtcblxuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnZhbHVlKTtcblxuICB9XG5cbiAgYnVpbGRJbnRlcmZhY2UoKSB7XG5cbiAgICB0aGlzLmJhciA9IHN2Zy5jcmVhdGUoJ3JlY3QnKTtcbiAgICB0aGlzLmtub2IgPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcblxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmJhcik7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMua25vYik7XG5cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgdGhpcy5wb3NpdGlvbi5yZXNpemUoWzAsdGhpcy53aWR0aF0sW3RoaXMuaGVpZ2h0LDBdKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy53aWR0aCA8IHRoaXMuaGVpZ2h0KSB7XG4gICAgICB0aGlzLm9yaWVudGF0aW9uID0gJ3ZlcnRpY2FsJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJztcbiAgICB9XG5cbiAgICBsZXQgeCwgeSwgdywgaCwgYmFyT2Zmc2V0LCBjb3JuZXJSYWRpdXM7XG4gICAgdGhpcy5rbm9iRGF0YSA9IHtcbiAgICAgIGxldmVsOiAwLFxuICAgICAgcjogMFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgdGhpcy50aGlja25lc3MgPSB0aGlzLndpZHRoIC8gMjtcbiAgICBcdHggPSB0aGlzLndpZHRoLzI7XG4gICAgXHR5ID0gMDtcbiAgICBcdHcgPSB0aGlzLnRoaWNrbmVzcztcbiAgICBcdGggPSB0aGlzLmhlaWdodDtcbiAgICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzICogMC44O1xuICAgIFx0dGhpcy5rbm9iRGF0YS5sZXZlbCA9IGgtdGhpcy5rbm9iRGF0YS5yLXRoaXMubm9ybWFsaXplZCooaC10aGlzLmtub2JEYXRhLnIqMik7XG4gICAgICBiYXJPZmZzZXQgPSAndHJhbnNsYXRlKCcrdGhpcy50aGlja25lc3MqKC0xKS8yKycsMCknO1xuICAgICAgY29ybmVyUmFkaXVzID0gdy8yO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRoaWNrbmVzcyA9IHRoaXMuaGVpZ2h0IC8gMjtcbiAgICBcdHggPSAwO1xuICAgIFx0eSA9IHRoaXMuaGVpZ2h0LzI7XG4gICAgXHR3ID0gdGhpcy53aWR0aDtcbiAgICBcdGggPSB0aGlzLnRoaWNrbmVzcztcbiAgICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzICogMC44O1xuICAgIFx0dGhpcy5rbm9iRGF0YS5sZXZlbCA9IHRoaXMubm9ybWFsaXplZCoody10aGlzLmtub2JEYXRhLnIqMikrdGhpcy5rbm9iRGF0YS5yO1xuICAgICAgYmFyT2Zmc2V0ID0gJ3RyYW5zbGF0ZSgwLCcrdGhpcy50aGlja25lc3MqKC0xKS8yKycpJztcbiAgICAgIGNvcm5lclJhZGl1cyA9IGgvMjtcbiAgICB9XG5cbiAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoJ3gnLHgpO1xuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgneScseSk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLGJhck9mZnNldCk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCdyeCcsY29ybmVyUmFkaXVzKTsgLy8gY29ybmVyIHJhZGl1c1xuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgncnknLGNvcm5lclJhZGl1cyk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCd3aWR0aCcsdyk7XG4gICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKCdoZWlnaHQnLGgpO1xuXG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N4Jyx4KTtcbiAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2N5Jyx0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3gnLHRoaXMua25vYkRhdGEubGV2ZWwpO1xuICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3knLHkpO1xuICAgIH1cbiAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdyJyx0aGlzLmtub2JEYXRhLnIpO1xuXG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcblxuICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHRoaXMuY29sb3JzLmZpbGwpO1xuICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXG4gICAgaWYgKCF0aGlzLmhhc0tub2IpIHtcbiAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCd0cmFuc3BhcmVudCcpO1xuICAgIH1cblxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGlja2VkKSB7XG4gICAgICB0aGlzLmtub2JEYXRhLnIgPSB0aGlzLnRoaWNrbmVzcyowLjc1O1xuICAgIH1cbiAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdyJyx0aGlzLmtub2JEYXRhLnIpO1xuXG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgXHQgICB0aGlzLmtub2JEYXRhLmxldmVsID0gdGhpcy5rbm9iRGF0YS5yK3RoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQqKHRoaXMuaGVpZ2h0LXRoaXMua25vYkRhdGEucioyKTtcbiAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKCdjeScsdGhpcy5oZWlnaHQgLSB0aGlzLmtub2JEYXRhLmxldmVsKTtcbiAgICB9IGVsc2Uge1xuICBcdCAgIHRoaXMua25vYkRhdGEubGV2ZWwgPSB0aGlzLl92YWx1ZS5ub3JtYWxpemVkKih0aGlzLndpZHRoLXRoaXMua25vYkRhdGEucioyKSt0aGlzLmtub2JEYXRhLnI7XG4gICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZSgnY3gnLHRoaXMua25vYkRhdGEubGV2ZWwpO1xuICAgIH1cbiAgfVxuXG5cbiAgY2xpY2soKSB7XG4gICAgdGhpcy5rbm9iRGF0YS5yID0gdGhpcy50aGlja25lc3MqMC45O1xuICAgIHRoaXMucG9zaXRpb24uYW5jaG9yID0gdGhpcy5tb3VzZTtcbiAgICB0aGlzLm1vdmUoKTtcbiAgfVxuXG4gIG1vdmUoKSB7XG4gICAgaWYgKHRoaXMuY2xpY2tlZCkge1xuICAgICAgdGhpcy5wb3NpdGlvbi51cGRhdGUodGhpcy5tb3VzZSk7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl92YWx1ZS51cGRhdGVOb3JtYWwoIHRoaXMucG9zaXRpb24udmFsdWUgKTtcblxuICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcbiAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICAgIEw6IE1hdGgucG93KCBtYXRoLnNjYWxlKHRoaXMudmFsdWUsLTEsMSwxLDApLCAyKSxcbiAgICAgICAgUjogTWF0aC5wb3coIG1hdGguc2NhbGUodGhpcy52YWx1ZSwtMSwxLDAsMSksIDIpXG4gICAgICB9KTtcblxuICAgIH1cbiAgfVxuXG4gIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICBUaGUgcG9zaXRpb24gb2YgY3Jvc3NmYWRlciwgZnJvbSAtMSAobGVmdCkgdG8gMSAocmlnaHQpLiBTZXR0aW5nIHRoaXMgdmFsdWUgdXBkYXRlcyB0aGUgaW50ZXJmYWNlIGFuZCB0cmlnZ2VycyB0aGUgb3V0cHV0IGV2ZW50LlxuICBAdHlwZSB7bnVtYmVyfVxuICAqL1xuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnZhbHVlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy5fdmFsdWUudXBkYXRlKHZhbHVlKTtcbiAgICB0aGlzLnBvc2l0aW9uLnZhbHVlID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScse1xuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBMOiBNYXRoLnBvdyggbWF0aC5zY2FsZSh0aGlzLnZhbHVlLC0xLDEsMSwwKSwgMiksXG4gICAgICBSOiBNYXRoLnBvdyggbWF0aC5zY2FsZSh0aGlzLnZhbHVlLC0xLDEsMCwxKSwgMilcbiAgICB9KTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgZ2V0IG5vcm1hbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL2ludGVyZmFjZXMvcGFuLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgbWF0aCA9IHJlcXVpcmUoJy4uL3V0aWwvbWF0aCcpO1xubGV0IHN2ZyA9IHJlcXVpcmUoJy4uL3V0aWwvc3ZnJyk7XG5sZXQgSW50ZXJmYWNlID0gcmVxdWlyZSgnLi4vY29yZS9pbnRlcmZhY2UnKTtcblxuXG5sZXQgUG9pbnQgPSBmdW5jdGlvbihwb2ludCxlbnZlbG9wZSkge1xuXG4gIHRoaXMueCA9IHBvaW50Lng7XG4gIHRoaXMueSA9IHBvaW50Lnk7XG4gIHRoaXMuZW52ZWxvcGUgPSBlbnZlbG9wZTtcblxuICB0aGlzLmVsZW1lbnQgPSBzdmcuY3JlYXRlKCdjaXJjbGUnKTtcbiAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnZmlsbCcsdGhpcy5lbnZlbG9wZS5jb2xvcnMuYWNjZW50KTtcblxuICB0aGlzLmVudmVsb3BlLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcblxuICB0aGlzLnJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAgIGxldCByID0gfn4oTWF0aC5taW4odGhpcy5lbnZlbG9wZS53aWR0aCx0aGlzLmVudmVsb3BlLmhlaWdodCkvNTApKzI7XG4gICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgncicscik7XG4gIH07XG5cbiAgdGhpcy5tb3ZlID0gZnVuY3Rpb24oeCx5KSB7XG5cbiAgICB0aGlzLnggPSAoeCB8fCB4PT09MCkgPyB4IDogdGhpcy54O1xuICAgIHRoaXMueSA9ICh5IHx8IHk9PT0wKSA/IHkgOiB0aGlzLnk7XG5cbiAgICBpZiAodGhpcy5lbnZlbG9wZS5ub2Rlcy5pbmRleE9mKHRoaXMpPj0wKSB7XG5cbiAgICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLmVudmVsb3BlLm5vZGVzLmluZGV4T2YodGhpcyktMTtcbiAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmVudmVsb3BlLm5vZGVzLmluZGV4T2YodGhpcykrMTtcblxuICAgICAgbGV0IHByZXZOb2RlID0gdGhpcy5lbnZlbG9wZS5ub2Rlc1twcmV2SW5kZXhdO1xuICAgICAgbGV0IG5leHROb2RlID0gdGhpcy5lbnZlbG9wZS5ub2Rlc1tuZXh0SW5kZXhdO1xuXG4gICAgICBsZXQgbG93WCA9IHByZXZJbmRleCA+PSAwID8gcHJldk5vZGUueCA6IDA7XG4gICAgICBsZXQgaGlnaFggPSBuZXh0SW5kZXggPCB0aGlzLmVudmVsb3BlLm5vZGVzLmxlbmd0aCA/IG5leHROb2RlLnggOiAxO1xuXG4gICAgICBpZiAodGhpcy54IDwgbG93WCkgeyB0aGlzLnggPSBsb3dYOyB9XG4gICAgICBpZiAodGhpcy54ID4gaGlnaFgpIHsgdGhpcy54ID0gaGlnaFg7IH1cblxuICAgIH1cblxuICAgIHRoaXMubG9jYXRpb24gPSB0aGlzLmdldENvb3JkaW5hdGVzKCk7XG4gICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnY3gnLCB0aGlzLmxvY2F0aW9uLngpO1xuICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2N5JywgdGhpcy5sb2NhdGlvbi55KTtcbiAgfTtcblxuICB0aGlzLmdldENvb3JkaW5hdGVzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHRoaXMueCAqIHRoaXMuZW52ZWxvcGUud2lkdGgsXG4gICAgICB5OiAoMS10aGlzLnkpICogdGhpcy5lbnZlbG9wZS5oZWlnaHRcbiAgICB9O1xuICB9O1xuXG4gIHRoaXMubW92ZSh0aGlzLngsdGhpcy55LHRydWUpO1xuICB0aGlzLnJlc2l6ZSgpO1xuXG4gIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZW52ZWxvcGUuZWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xuICAgIHRoaXMuZW52ZWxvcGUubm9kZXMuc3BsaWNlKHRoaXMuZW52ZWxvcGUubm9kZXMuaW5kZXhPZih0aGlzKSwxKTtcbiAgfTtcblxuXG59O1xuXG5cbi8qKlxuKiBFbnZlbG9wZVxuKlxuKiBAZGVzY3JpcHRpb24gSW50ZXJhY3RpdmUgbGluZWFyIHJhbXAgdmlzdWFsaXphdGlvbi5cbipcbiogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJlbnZlbG9wZVwiPjwvc3Bhbj5cbipcbiogQGV4YW1wbGVcbiogdmFyIGVudmVsb3BlID0gbmV3IE5leHVzLkVudmVsb3BlKCcjdGFyZ2V0JylcbipcbiogQGV4YW1wbGVcbiogdmFyIGVudmVsb3BlID0gbmV3IE5leHVzLkVudmVsb3BlKCcjdGFyZ2V0Jyx7XG4qICAgJ3NpemUnOiBbMzAwLDE1MF0sXG4qICAgJ3BvaW50cyc6IFtcbiogICAgIHtcbiogICAgICAgeDogMC4xLFxuKiAgICAgICB5OiAwLjRcbiogICAgIH0sXG4qICAgICB7XG4qICAgICAgIHg6IDAuMzUsXG4qICAgICAgIHk6IDAuNlxuKiAgICAgfSxcbiogICAgIHtcbiogICAgICAgeDogMC42NSxcbiogICAgICAgeTogMC4yXG4qICAgICB9LFxuKiAgICAge1xuKiAgICAgICB4OiAwLjksXG4qICAgICAgIHk6IDAuNFxuKiAgICAgfSxcbiogICBdXG4qIH0pXG4qXG4qIEBvdXRwdXRcbiogY2hhbmdlXG4qIEZpcmVzIGFueSB0aW1lIGEgbm9kZSBpcyBtb3ZlZC4gPGJyPlxuKiBUaGUgZXZlbnQgZGF0YSBpcyBhbiBhcnJheSBvZiBwb2ludCBsb2NhdGlvbnMuIEVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgPGk+eDwvaT4gYW5kIDxpPnk8L2k+IHByb3BlcnRpZXMgZGVzY3JpYmluZyB0aGUgbG9jYXRpb24gb2YgYSBwb2ludCBvbiB0aGUgZW52ZWxvcGUuXG4qXG4qIEBvdXRwdXRleGFtcGxlXG4qIGVudmVsb3BlLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcbiogICBjb25zb2xlLmxvZyh2KTtcbiogfSlcbipcbiovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVudmVsb3BlIGV4dGVuZHMgSW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIGxldCBvcHRpb25zID0gWyd2YWx1ZSddO1xuXG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgJ3NpemUnOiBbMzAwLDE1MF0sXG4gICAgICAncG9pbnRzJzogW1xuICBcdFx0XHR7XG4gIFx0XHRcdFx0eDogMC4xLFxuICBcdFx0XHRcdHk6IDAuNFxuICBcdFx0XHR9LFxuICBcdFx0XHR7XG4gIFx0XHRcdFx0eDogMC4zNSxcbiAgXHRcdFx0XHR5OiAwLjZcbiAgXHRcdFx0fSxcbiAgXHRcdFx0e1xuICBcdFx0XHRcdHg6IDAuNjUsXG4gIFx0XHRcdFx0eTogMC4yXG4gIFx0XHRcdH0sXG4gIFx0XHRcdHtcbiAgXHRcdFx0XHR4OiAwLjksXG4gIFx0XHRcdFx0eTogMC40XG4gIFx0XHRcdH1cbiAgXHRcdF1cbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG4gICAgdGhpcy5wb2ludHMgPSB0aGlzLnNldHRpbmdzLnBvaW50cztcblxuICAgIHRoaXMubm9kZXMgPSBbXTtcblxuICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuaW5pdCgpO1xuXG5cbiAgfVxuXG4gIGJ1aWxkSW50ZXJmYWNlKCkge1xuXG5cbiAgICB0aGlzLnBvaW50cy5mb3JFYWNoKChwb2ludCkgPT4ge1xuICAgICAgbGV0IG5vZGUgPSBuZXcgUG9pbnQocG9pbnQsdGhpcyk7XG4gICAgICB0aGlzLm5vZGVzLnB1c2gobm9kZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNvcnRQb2ludHMoKTtcblxuICAgIHRoaXMubGluZSA9IHN2Zy5jcmVhdGUoJ3BvbHlsaW5lJyk7XG4gICAgdGhpcy5saW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgMik7XG4gICAgdGhpcy5saW5lLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG5cbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5saW5lKTtcblxuICAgIHRoaXMuZmlsbCA9IHN2Zy5jcmVhdGUoJ3BvbHlsaW5lJyk7XG4gICAgdGhpcy5maWxsLnNldEF0dHJpYnV0ZSgnZmlsbC1vcGFjaXR5JywgJzAuMicpO1xuXG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZmlsbCk7XG5cbiAgfVxuXG4gIHNpemVJbnRlcmZhY2UoKSB7XG5cbiAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5ub2Rlc1tpXS5yZXNpemUoKTtcbiAgICAgIHRoaXMubm9kZXNbaV0ubW92ZSgpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgfVxuXG4gIGNvbG9ySW50ZXJmYWNlKCkge1xuXG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG4gICAgdGhpcy5saW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgdGhpcy5jb2xvcnMuYWNjZW50KTtcbiAgICB0aGlzLmZpbGwuc2V0QXR0cmlidXRlKCdmaWxsJywgdGhpcy5jb2xvcnMuYWNjZW50KTtcbiAgICB0aGlzLm5vZGVzLmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIG5vZGUuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLHRoaXMuY29sb3JzLmFjY2VudCk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgLy8gIHRoaXMubm9kZXNbdGhpcy5zZWxlY3RlZF0ubW92ZSggdGhpcy5wb2ludHMgKVxuICAgIHRoaXMuY2FsY3VsYXRlUGF0aCgpO1xuICB9XG5cbiAgY2FsY3VsYXRlUG9pbnRzKCkge1xuICAgIHRoaXMucG9pbnRzID0gW107XG4gICAgdGhpcy5ub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICB0aGlzLnBvaW50cy5wdXNoKHsgeDogbm9kZS54LCB5OiBub2RlLnkgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjYWxjdWxhdGVQYXRoKCkge1xuXG4gICAgLy9zdHJva2UgZGF0YVxuICAgIGxldCBkYXRhID0gJzAgJysgdGhpcy5ub2Rlc1swXS5sb2NhdGlvbi55KycsICc7XG5cbiAgICAvLyBkYXRhIHNob3VsZCBiZSByZS1vcmRlcmVkIGJhc2VkIG9uIHggbG9jYXRpb24uXG4gICAgLy8gd2hhdGV2ZXIgZnVuY3Rpb24gYWRkcyBhIG5vZGUgc2hvdWxkIGFkZCBpdCBhdCB0aGUgcmlnaHQgaW5kZXhcblxuICAgIHRoaXMubm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgIC8vICBsZXQgbG9jYXRpb24gPSBub2RlLmdldENvb3JkaW5hdGVzKCk7XG4gICAgICBkYXRhICs9IG5vZGUubG9jYXRpb24ueCArICcgJyArIG5vZGUubG9jYXRpb24ueSArICcsICc7XG4gICAgfSk7XG5cblxuICAvLyAgZGF0YSArPSBwb2ludC54KnRoaXMud2lkdGgrJyAnKyBwb2ludC55KnRoaXMuaGVpZ2h0KycsICc7XG4gICAgZGF0YSArPSB0aGlzLndpZHRoICsgJyAnKyB0aGlzLm5vZGVzW3RoaXMubm9kZXMubGVuZ3RoLTFdLmxvY2F0aW9uLnk7XG5cbiAgICB0aGlzLmxpbmUuc2V0QXR0cmlidXRlKCdwb2ludHMnLCBkYXRhKTtcblxuICAgIC8vIGZpbGwgZGF0YVxuICAgIC8vIGFkZCBib3R0b20gY29ybmVyc1xuXG4gICAgZGF0YSArPSAnLCAnK3RoaXMud2lkdGggKycgJyt0aGlzLmhlaWdodCsnLCAnO1xuICAgIGRhdGEgKz0gJzAgJyt0aGlzLmhlaWdodDtcblxuICAgIHRoaXMuZmlsbC5zZXRBdHRyaWJ1dGUoJ3BvaW50cycsIGRhdGEpO1xuXG4gIH1cblxuXG5cbiAgY2xpY2soKSB7XG4gIFx0Ly8gZmluZCBuZWFyZXN0IG5vZGUgYW5kIHNldCB0aGlzLnNlbGVjdGVkIChpbmRleClcbiAgICB0aGlzLmhhc01vdmVkID0gZmFsc2U7XG4gIFx0dGhpcy5zZWxlY3RlZCA9IHRoaXMuZmluZE5lYXJlc3ROb2RlKCk7XG5cbiAgICB0aGlzLm5vZGVzW3RoaXMuc2VsZWN0ZWRdLm1vdmUodGhpcy5tb3VzZS54L3RoaXMud2lkdGgsMS10aGlzLm1vdXNlLnkvdGhpcy5oZWlnaHQpO1xuICAgIHRoaXMuc2NhbGVOb2RlKHRoaXMuc2VsZWN0ZWQpO1xuXG4gICAgLy8gbXVzdCBkbyB0aGlzIGIvYyBuZXcgbm9kZSBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICB0aGlzLmNhbGN1bGF0ZVBvaW50cygpO1xuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnBvaW50cyk7XG4gIFx0dGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIG1vdmUoKSB7XG4gIFx0aWYgKHRoaXMuY2xpY2tlZCkge1xuICAgICAgdGhpcy5tb3VzZS54ID0gbWF0aC5jbGlwKHRoaXMubW91c2UueCwwLHRoaXMud2lkdGgpO1xuICAgICAgdGhpcy5oYXNNb3ZlZCA9IHRydWU7XG5cbiAgICAgIHRoaXMubm9kZXNbdGhpcy5zZWxlY3RlZF0ubW92ZSh0aGlzLm1vdXNlLngvdGhpcy53aWR0aCwxLXRoaXMubW91c2UueS90aGlzLmhlaWdodCk7XG4gICAgXHR0aGlzLnNjYWxlTm9kZSh0aGlzLnNlbGVjdGVkKTtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVQb2ludHMoKTtcbiAgXHRcdHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnBvaW50cyk7XG4gIFx0XHR0aGlzLnJlbmRlcigpO1xuICBcdH1cbiAgfVxuXG4gIHJlbGVhc2UoKSB7XG5cbiAgXHRpZiAoIXRoaXMuaGFzTW92ZWQpIHtcbiAgICAgIHRoaXMubm9kZXNbdGhpcy5zZWxlY3RlZF0uZGVzdHJveSgpO1xuICBcdH1cblxuICAgIHRoaXMuY2FsY3VsYXRlUG9pbnRzKCk7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMucG9pbnRzKTtcbiAgXHR0aGlzLnJlbmRlcigpO1xuXG4gIFx0Ly8gcmVzZXQgdGhpcy5zZWxlY3RlZFxuICBcdHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xuICB9XG5cblxuICBmaW5kTmVhcmVzdE5vZGUoKSB7XG4gIFx0dmFyIG5lYXJlc3RJbmRleCA9IG51bGw7XG4gICAgLy8gc2V0IHRoaXMgdW5yZWFzb25hYmx5IGhpZ2ggc28gdGhhdCBldmVyeSBkaXN0YW5jZSB3aWxsIGJlIGxvd2VyIHRoYW4gaXQuXG4gIFx0dmFyIG5lYXJlc3REaXN0ID0gMTAwMDA7XG4gIFx0dmFyIGJlZm9yZSA9IGZhbHNlO1xuICAgIGxldCB4ID0gdGhpcy5tb3VzZS54L3RoaXMud2lkdGg7XG4gICAgbGV0IHkgPSAxLXRoaXMubW91c2UueS90aGlzLmhlaWdodDtcbiAgICBsZXQgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICBcdGZvciAobGV0IGkgPSAwOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSBtb3VzZSB0byB0aGlzIG5vZGUgdXNpbmcgcHl0aGFnb3JlYW4gdGhlb3JlbVxuICBcdFx0dmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KCAgTWF0aC5wb3coIChub2Rlc1tpXS54IC0geCksIDIpICsgTWF0aC5wb3coKG5vZGVzW2ldLnkgLSB5KSwgMikgKTtcblxuICAgICAgLy8gaWYgdGhpcyBkaXN0YW5jZSBpcyBsZXNzIHRoYW4gdGhlIHByZXZpb3VzIHNob3J0ZXN0IGRpc3RhbmNlLCB1c2UgdGhpcyBpbmRleFxuICBcdFx0aWYgKGRpc3RhbmNlIDwgbmVhcmVzdERpc3QpIHtcbiAgXHRcdFx0bmVhcmVzdERpc3QgPSBkaXN0YW5jZTtcbiAgXHRcdFx0bmVhcmVzdEluZGV4ID0gaTtcbiAgXHRcdFx0YmVmb3JlID0geCA+IG5vZGVzW2ldLng7XG4gIFx0XHR9XG5cbiAgXHR9XG5cbiAgICAvLyBpZiBub3QgdmVyeSBjbG9zZSB0byBhbnkgbm9kZSwgY3JlYXRlIGEgbm9kZVxuICBcdGlmIChuZWFyZXN0RGlzdD4wLjA3KSB7XG5cbiAgICAgIG5lYXJlc3RJbmRleCA9IHRoaXMuZ2V0SW5kZXhGcm9tWCh0aGlzLm1vdXNlLngvdGhpcy53aWR0aCk7XG5cbiAgXHRcdHRoaXMubm9kZXMuc3BsaWNlKG5lYXJlc3RJbmRleCwwLCBuZXcgUG9pbnQoe1xuICBcdFx0XHR4OiB0aGlzLm1vdXNlLngvdGhpcy53aWR0aCxcbiAgXHRcdFx0eTogMS10aGlzLm1vdXNlLnkvdGhpcy5oZWlnaHRcbiAgXHRcdH0sIHRoaXMpKTtcbiAgICAgIHRoaXMuaGFzTW92ZWQgPSB0cnVlO1xuXG4gIFx0fVxuXG4gIFx0cmV0dXJuIG5lYXJlc3RJbmRleDtcbiAgfVxuXG4gIGdldEluZGV4RnJvbVgoeCkge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgdGhpcy5ub2Rlcy5mb3JFYWNoKChub2RlLGkpID0+IHtcbiAgICAgIGlmICh0aGlzLm5vZGVzW2ldLnggPD0geCkge1xuICAgICAgICBpbmRleCA9IGkrMTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBzY2FsZU5vZGUoaSkge1xuXG4gIFx0bGV0IGNsaXBwZWRYID0gbWF0aC5jbGlwKHRoaXMubm9kZXNbaV0ueCwgMCwgMSk7XG4gIFx0bGV0IGNsaXBwZWRZID0gbWF0aC5jbGlwKHRoaXMubm9kZXNbaV0ueSwgMCwgMSk7XG5cbiAgICB0aGlzLm5vZGVzW2ldLm1vdmUoIGNsaXBwZWRYLCBjbGlwcGVkWSApO1xuXG4gIH1cblxuICAvKipcbiAgU29ydCB0aGUgdGhpcy5wb2ludHMgYXJyYXkgZnJvbSBsZWZ0LW1vc3QgcG9pbnQgdG8gcmlnaHQtbW9zdCBwb2ludC4gWW91IHNob3VsZCBub3QgcmVndWxhcmx5IG5lZWQgdG8gdXNlIHRoaXMsIGhvd2V2ZXIgaXQgbWF5IGJlIHVzZWZ1bCBpZiB0aGUgcG9pbnRzIGdldCB1bm9yZGVyZWQuXG4gICovXG4gIHNvcnRQb2ludHMoKSB7XG4gICAgdGhpcy5ub2Rlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGEueCA+IGIueDtcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gIEFkZCBhIGJyZWFrcG9pbnQgb24gdGhlIGVudmVsb3BlLlxuICBAcGFyYW0geCB7bnVtYmVyfSB4IGxvY2F0aW9uIG9mIHRoZSBwb2ludCwgbm9ybWFsaXplZCAoMC0xKVxuICBAcGFyYW0geSB7bnVtYmVyfSB5IGxvY2F0aW9uIG9mIHRoZSBwb2ludCwgbm9ybWFsaXplZCAoMC0xKVxuICAqL1xuICBhZGRQb2ludCh4LHkpIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLm5vZGVzLmxlbmd0aDtcblxuICAgIHRoaXMuc29ydFBvaW50cygpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGk8dGhpcy5ub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHggPCB0aGlzLm5vZGVzW2ldLngpIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgXHR9XG5cbiAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCwgMCwgbmV3IFBvaW50KHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSwgdGhpcykpO1xuXG4gICAgdGhpcy5zY2FsZU5vZGUoaW5kZXgpO1xuXG4gICAgdGhpcy5jYWxjdWxhdGVQb2ludHMoKTtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5wb2ludHMpO1xuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG5cbiAgLyoqXG4gIEZpbmQgdGhlIGxldmVsIGF0IGEgY2VydGFpbiB4IGxvY2F0aW9uIG9uIHRoZSBlbnZlbG9wZS5cbiAgQHBhcmFtIHgge251bWJlcn0gVGhlIHggbG9jYXRpb24gdG8gZmluZCB0aGUgbGV2ZWwgb2YsIG5vcm1hbGl6ZWQgMC0xXG4gICovXG4gIHNjYW4oeCkge1xuICAgIC8vIGZpbmQgc3Vycm91bmRpbmcgcG9pbnRzXG4gICAgbGV0IG5leHRJbmRleCA9IHRoaXMuZ2V0SW5kZXhGcm9tWCh4KTtcbiAgICBsZXQgcHJpb3JJbmRleCA9IG5leHRJbmRleC0xO1xuICAgIGlmIChwcmlvckluZGV4IDwgMCkge1xuICAgICAgcHJpb3JJbmRleCA9IDA7XG4gICAgfVxuICAgIGlmIChuZXh0SW5kZXggPj0gdGhpcy5ub2Rlcy5sZW5ndGgpIHtcbiAgICAgIG5leHRJbmRleCA9IHRoaXMubm9kZXMubGVuZ3RoLTE7XG4gICAgfVxuICAgIGxldCBwcmlvclBvaW50ID0gdGhpcy5ub2Rlc1twcmlvckluZGV4XTtcbiAgICBsZXQgbmV4dFBvaW50ID0gdGhpcy5ub2Rlc1tuZXh0SW5kZXhdO1xuICAgIGxldCBsb2MgPSBtYXRoLnNjYWxlKHgscHJpb3JQb2ludC54LCBuZXh0UG9pbnQueCwgMCwgMSk7XG4gICAgbGV0IHZhbHVlID0gbWF0aC5pbnRlcnAobG9jLHByaW9yUG9pbnQueSxuZXh0UG9pbnQueSk7XG4gICAgdGhpcy5lbWl0KCdzY2FuJyx2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cblxuICAvKipcbiAgTW92ZSBhIGJyZWFrcG9pbnQgb24gdGhlIGVudmVsb3BlLlxuICBAcGFyYW0gaW5kZXgge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBicmVha3BvaW50IHRvIG1vdmVcbiAgQHBhcmFtIHgge251bWJlcn0gTmV3IHggbG9jYXRpb24sIG5vcm1hbGl6ZWQgMC0xXG4gIEBwYXJhbSB5IHtudW1iZXJ9IE5ldyB5IGxvY2F0aW9uLCBub3JtYWxpemVkIDAtMVxuICAqL1xuICBtb3ZlUG9pbnQoaW5kZXgseCx5KSB7XG4gICAgdGhpcy5ub2Rlc1tpbmRleF0ubW92ZSh4LHkpO1xuICAgIHRoaXMuc2NhbGVOb2RlKGluZGV4KTtcbiAgICB0aGlzLmNhbGN1bGF0ZVBvaW50cygpO1xuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnBvaW50cyk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG5cbiAgLyoqXG4gIE1vdmUgYSBicmVha3BvaW50IG9uIHRoZSBlbnZlbG9wZSBieSBhIGNlcnRhaW4gYW1vdW50LlxuICBAcGFyYW0gaW5kZXgge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBicmVha3BvaW50IHRvIG1vdmVcbiAgQHBhcmFtIHhPZmZzZXQge251bWJlcn0gWCBkaXNwbGFjZW1lbnQsIG5vcm1hbGl6ZWQgMC0xXG4gIEBwYXJhbSB5T2Zmc2V0IHtudW1iZXJ9IFkgZGlzcGxhY2VtZW50LCBub3JtYWxpemVkIDAtMVxuICAqL1xuICBhZGp1c3RQb2ludChpbmRleCx4T2Zmc2V0LHlPZmZzZXQpIHtcbiAgICB0aGlzLm5vZGVzW2luZGV4XS5tb3ZlKHRoaXMubm9kZXNbaW5kZXhdLngreE9mZnNldCx0aGlzLm5vZGVzW2luZGV4XS55K3lPZmZzZXQpO1xuICAgIHRoaXMuc2NhbGVOb2RlKGluZGV4KTtcbiAgICB0aGlzLmNhbGN1bGF0ZVBvaW50cygpO1xuICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnBvaW50cyk7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG5cbiAgLyoqXG4gIFJlbW92ZSBhIGJyZWFrcG9pbnQgZnJvbSB0aGUgZW52ZWxvcGUuXG4gIEBwYXJhbSBpbmRleCB7bnVtYmVyfSBJbmRleCBvZiB0aGUgYnJlYWtwb2ludCB0byByZW1vdmVcbiAgKi9cbiAgZGVzdHJveVBvaW50KGluZGV4KSB7XG4gICAgdGhpcy5ub2Rlc1tpbmRleF0uZGVzdHJveSgpO1xuICAgIHRoaXMuY2FsY3VsYXRlUG9pbnRzKCk7XG4gICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHRoaXMucG9pbnRzKTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cblxuICAvKipcbiAgUmVtb3ZlIGFsbCBleGlzdGluZyBicmVha3BvaW50cyBhbmQgYWRkIGFuIGVudGlyZWx5IG5ldyBzZXQgb2YgYnJlYWtwb2ludHMuXG4gIEBwYXJhbSBhbGxQb2ludHMge2FycmF5fSBBbiBhcnJheSBvZiBvYmplY3RzIHdpdGggeC95IHByb3BlcnRpZXMgKG5vcm1hbGl6ZWQgMC0xKS4gRWFjaCBvYmplY3QgaW4gdGhlIGFycmF5IHNwZWNpZmljZXMgdGhlIHgveSBsb2NhdGlvbiBvZiBhIG5ldyBicmVha3BvaW50IHRvIGJlIGFkZGVkLlxuICAqL1xuICBzZXRQb2ludHMoYWxsUG9pbnRzKSB7XG4gICAgd2hpbGUgKHRoaXMubm9kZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLm5vZGVzWzBdLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgYWxsUG9pbnRzLmZvckVhY2goKHBvaW50KSA9PiB7XG4gICAgICB0aGlzLmFkZFBvaW50KHBvaW50LngscG9pbnQueSk7XG4gICAgfSk7XG4gICAgdGhpcy5jYWxjdWxhdGVQb2ludHMoKTtcbiAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5wb2ludHMpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL2ludGVyZmFjZXMvZW52ZWxvcGUuanMiLCIndXNlIHN0cmljdCc7XG5cbmxldCBkb20gPSByZXF1aXJlKCcuLi91dGlsL2RvbScpO1xuLy9sZXQgbWF0aCA9IHJlcXVpcmUoJy4uL3V0aWwvbWF0aCcpO1xubGV0IEludGVyZmFjZSA9IHJlcXVpcmUoJy4uL2NvcmUvaW50ZXJmYWNlJyk7XG5cbi8qKlxuKiBTcGVjdHJvZ3JhbVxuKlxuKiBAZGVzY3JpcHRpb24gQXVkaW8gc3BlY3RydW0gdmlzdWFsaXphdGlvblxuKlxuKiBAZGVtbyA8c3BhbiBuZXh1cy11aT1cInNwZWN0cm9ncmFtXCI+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgc3BlY3Ryb2dyYW0gPSBuZXcgTmV4dXMuU3BlY3Ryb2dyYW0oJyN0YXJnZXQnKVxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgc3BlY3Ryb2dyYW0gPSBuZXcgTmV4dXMuU3BlY3Ryb2dyYW0oJyN0YXJnZXQnLHtcbiogICAnc2l6ZSc6IFszMDAsMTUwXVxuKiB9KVxuKlxuKiBAb3V0cHV0XG4qICZuYnNwO1xuKiBObyBldmVudHNcbipcbiovXG5cbmltcG9ydCB7IGNvbnRleHQgfSBmcm9tICcuLi9tYWluJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BlY3Ryb2dyYW0gZXh0ZW5kcyBJbnRlcmZhY2Uge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgbGV0IG9wdGlvbnMgPSBbJ3NjYWxlJywndmFsdWUnXTtcblxuICAgIGxldCBkZWZhdWx0cyA9IHtcbiAgICAgICdzaXplJzogWzMwMCwxNTBdXG4gICAgfTtcblxuICAgIHN1cGVyKGFyZ3VtZW50cyxvcHRpb25zLGRlZmF1bHRzKTtcblxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQoKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgICB0aGlzLmFuYWx5c2VyID0gdGhpcy5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG4gICAgdGhpcy5hbmFseXNlci5mZnRTaXplID0gMjA0ODtcbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQ7XG4gICAgdGhpcy5kYXRhQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlckxlbmd0aCk7XG5cbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cbiAgICB0aGlzLnNvdXJjZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5pbml0KCk7XG5cbiAgfVxuXG4gIGJ1aWxkRnJhbWUoKSB7XG4gICAgdGhpcy5jYW52YXMgPSBuZXcgZG9tLlNtYXJ0Q2FudmFzKHRoaXMucGFyZW50KTtcbiAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLmNhbnZhcy5lbGVtZW50O1xuICB9XG5cbiAgc2l6ZUludGVyZmFjZSgpIHtcbiAgICB0aGlzLmNhbnZhcy5yZXNpemUodGhpcy53aWR0aCx0aGlzLmhlaWdodCk7XG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcbiAgICB0aGlzLmNhbnZhcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG4gIH1cblxuICByZW5kZXIoKSB7XG5cbiAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICB0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YUFycmF5KTtcblxuICAgIHRoaXMuY2FudmFzLmNvbnRleHQuZmlsbFN0eWxlID0gdGhpcy5jb2xvcnMuZmlsbDtcbiAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxSZWN0KDAsIDAsIHRoaXMuY2FudmFzLmVsZW1lbnQud2lkdGgsIHRoaXMuY2FudmFzLmVsZW1lbnQuaGVpZ2h0KTtcblxuICAgIGlmICh0aGlzLnNvdXJjZSAmJiB0aGlzLmRhdGFBcnJheSkge1xuXG4gICAgICAvL2NvbnNvbGUubG9nKHRoaXMuZGF0YUFycmF5KTtcblxuICAgICAgbGV0IGJhcldpZHRoID0gKHRoaXMuY2FudmFzLmVsZW1lbnQud2lkdGggLyB0aGlzLmJ1ZmZlckxlbmd0aCk7XG4gICAgICBsZXQgYmFySGVpZ2h0O1xuICAgICAgbGV0IHggPSAwO1xuXG4gICAgICBsZXQgZGVmaW5pdGlvbiA9IHRoaXMuY2FudmFzLmVsZW1lbnQud2lkdGgvNTA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5idWZmZXJMZW5ndGg7IGkgPSBpK2RlZmluaXRpb24pIHtcbiAgICAgICAgYmFySGVpZ2h0ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgdGhpcy5kYXRhQXJyYXkuc3ViYXJyYXkoaSxpK2RlZmluaXRpb24pKTtcbiAgICAgICAgYmFySGVpZ2h0IC89IDI1NTtcbiAgICAgICAgYmFySGVpZ2h0ICo9IHRoaXMuY2FudmFzLmVsZW1lbnQuaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuY2FudmFzLmNvbnRleHQuZmlsbFN0eWxlID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxSZWN0KHgsdGhpcy5jYW52YXMuZWxlbWVudC5oZWlnaHQtYmFySGVpZ2h0LGJhcldpZHRoKmRlZmluaXRpb24sYmFySGVpZ2h0KTtcblxuICAgICAgICB4ICs9IChiYXJXaWR0aCpkZWZpbml0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgRXF1aXZhbGVudCB0byBcInBhdGNoaW5nIGluXCIgYW4gYXVkaW8gbm9kZSB0byB2aXN1YWxpemUuIE5PVEU6IFlvdSBjYW5ub3QgY29ubmVjdCBhdWRpbyBub2RlcyBhY3Jvc3MgdHdvIGRpZmZlcmVudCBhdWRpbyBjb250ZXh0cy4gTmV4dXNVSSBydW5zIGl0cyBhdWRpbyBhbmFseXNpcyBvbiBpdHMgb3duIGF1ZGlvIGNvbnRleHQsIE5leHVzLmNvbnRleHQuIElmIHRoZSBhdWRpbyBub2RlIHlvdSBhcmUgdmlzdWFsaXppbmcgaXMgY3JlYXRlZCBvbiBhIGRpZmZlcmVudCBhdWRpbyBjb250ZXh0LCB5b3Ugd2lsbCBuZWVkIHRvIHRlbGwgTmV4dXNVSSB0byB1c2UgdGhhdCBjb250ZXh0IGluc3RlYWQ6IGkuZS4gTmV4dXMuY29udGV4dCA9IFlvdXJBdWRpb0NvbnRleHROYW1lLiBGb3IgZXhhbXBsZSwgaW4gVG9uZUpTIHByb2plY3RzLCB0aGUgbGluZSB3b3VsZCBiZTogTmV4dXMuY29udGV4dCA9IFRvbmUuY29udGV4dCAuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB3cml0ZSB0aGF0IGxpbmUgb2YgY29kZSBvbmx5IG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB5b3VyIHByb2plY3QuXG4gIEBwYXJhbSBub2RlIHtBdWRpb05vZGV9IFRoZSBhdWRpbyBub2RlIHRvIHZpc3VhbGl6ZVxuICBAZXhhbXBsZSBOZXh1cy5jb250ZXh0ID0gVG9uZS5jb250ZXh0IC8vIG9yIGFub3RoZXIgYXVkaW8gY29udGV4dCB5b3UgaGF2ZSBjcmVhdGVkXG4gIHNwZWN0cm9ncmFtLmNvbm5lY3QoIFRvbmUuTWFzdGVyICk7XG4gICovXG4gIGNvbm5lY3Qobm9kZSkge1xuICAgIGlmICh0aGlzLnNvdXJjZSkge1xuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlID0gbm9kZTtcbiAgICB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICAvKipcbiAgU3RvcCB2aXN1YWxpemluZyB0aGUgc291cmNlIG5vZGUgYW5kIGRpc2Nvbm5lY3QgaXQuXG4gICovXG4gIGRpc2Nvbm5lY3QoKSB7XG4gICAgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmFuYWx5c2VyKTtcbiAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gIH1cblxuICBjbGljaygpIHtcbiAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgY3VzdG9tRGVzdHJveSgpIHtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9pbnRlcmZhY2VzL3NwZWN0cm9ncmFtLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5sZXQgZG9tID0gcmVxdWlyZSgnLi4vdXRpbC9kb20nKTtcbmxldCBtYXRoID0gcmVxdWlyZSgnLi4vdXRpbC9tYXRoJyk7XG5sZXQgSW50ZXJmYWNlID0gcmVxdWlyZSgnLi4vY29yZS9pbnRlcmZhY2UnKTtcblxuXG4vKipcbiogTWV0ZXJcbipcbiogQGRlc2NyaXB0aW9uIFN0ZXJlbyBkZWNpYmVsIG1ldGVyXG4qXG4qIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwibWV0ZXJcIj48L3NwYW4+XG4qXG4qIEBleGFtcGxlXG4qIHZhciBtZXRlciA9IG5ldyBOZXh1cy5NZXRlcignI3RhcmdldCcpXG4qXG4qIEBleGFtcGxlXG4qIHZhciBtZXRlciA9IG5ldyBOZXh1cy5NZXRlcignI3RhcmdldCcse1xuKiAgIHNpemU6IFs3NSw3NV1cbiogfSlcbipcbiogQG91dHB1dFxuKiAmbmJzcDtcbiogTm8gZXZlbnRzXG4qXG4qL1xuXG5pbXBvcnQgeyBjb250ZXh0IH0gZnJvbSAnLi4vbWFpbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGVyIGV4dGVuZHMgSW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcblxuICAgIGxldCBvcHRpb25zID0gWydzY2FsZScsJ3ZhbHVlJ107XG5cbiAgICBsZXQgZGVmYXVsdHMgPSB7XG4gICAgICAnc2l6ZSc6IFszMCwxMDBdXG4gICAgfTtcblxuICAgIHN1cGVyKGFyZ3VtZW50cyxvcHRpb25zLGRlZmF1bHRzKTtcblxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQoKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgICB0aGlzLmNoYW5uZWxzID0gMjtcblxuICAgIHRoaXMuc3BsaXR0ZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKCB0aGlzLmNoYW5uZWxzICk7XG5cbiAgICB0aGlzLmFuYWx5c2VycyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuY2hhbm5lbHM7IGkrKykge1xuICAgICAgbGV0IGFuYWx5c2VyID0gdGhpcy5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG4gICAgICB0aGlzLnNwbGl0dGVyLmNvbm5lY3QoYW5hbHlzZXIsaSk7XG4gICAgICBhbmFseXNlci5mZnRTaXplID0gMTAyNDtcbiAgICAgIGFuYWx5c2VyLnNtb290aGluZ1RpbWVDb25zdGFudCA9IDE7XG4gICAgICB0aGlzLmFuYWx5c2Vycy5wdXNoKCBhbmFseXNlciApO1xuICAgIH1cbiAgICB0aGlzLmJ1ZmZlckxlbmd0aCA9IHRoaXMuYW5hbHlzZXJzWzBdLmZyZXF1ZW5jeUJpbkNvdW50O1xuICAgIHRoaXMuZGF0YUFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmJ1ZmZlckxlbmd0aCk7XG5cbi8qXG4gICAgLy8gYWRkIGxpbmVhciBncmFkaWVudFxuICAgIHZhciBncmQgPSBjYW52YXNDdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMCwgY2FudmFzLmhlaWdodCk7XG4gICAgLy8gbGlnaHQgYmx1ZVxuICAgIGdyZC5hZGRDb2xvclN0b3AoMCwgJyMwMDAnKTtcbiAgICBncmQuYWRkQ29sb3JTdG9wKDAuMiwgJyNiYmInKTtcbiAgICBncmQuYWRkQ29sb3JTdG9wKDAuNCwgJyNkMTgnKTtcbiAgICAvLyBkYXJrIGJsdWVcbiAgICBncmQuYWRkQ29sb3JTdG9wKDEsICcjZDE4Jyk7XG4gICAgY2FudmFzQ3R4LmZpbGxTdHlsZSA9IGdyZDsgKi9cblxuICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcblxuICAgIHRoaXMuZGIgPSAtSW5maW5pdHk7XG5cbiAgICB0aGlzLmluaXQoKTtcblxuICAgIHRoaXMubWV0ZXJXaWR0aCA9IHRoaXMuY2FudmFzLmVsZW1lbnQud2lkdGgvdGhpcy5jaGFubmVscztcblxuICAgIHRoaXMucmVuZGVyKCk7XG5cbiAgfVxuXG4gIGJ1aWxkRnJhbWUoKSB7XG4gICAgdGhpcy5jYW52YXMgPSBuZXcgZG9tLlNtYXJ0Q2FudmFzKHRoaXMucGFyZW50KTtcbiAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLmNhbnZhcy5lbGVtZW50O1xuICB9XG5cbiAgc2l6ZUludGVyZmFjZSgpIHtcbiAgICB0aGlzLmNhbnZhcy5yZXNpemUodGhpcy53aWR0aCx0aGlzLmhlaWdodCk7XG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcbiAgICB0aGlzLmNhbnZhcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG4gIH1cblxuICByZW5kZXIoKSB7XG5cbiAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxTdHlsZSA9IHRoaXMuY29sb3JzLmZpbGw7XG4gICAgdGhpcy5jYW52YXMuY29udGV4dC5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy5lbGVtZW50LndpZHRoICwgdGhpcy5jYW52YXMuZWxlbWVudC5oZWlnaHQpO1xuXG4gICAgZm9yIChsZXQgaT0wO2k8dGhpcy5hbmFseXNlcnMubGVuZ3RoO2krKykge1xuXG4gICAgICBpZiAodGhpcy5zb3VyY2UpIHtcblxuICAgICAgICB0aGlzLmFuYWx5c2Vyc1tpXS5nZXRGbG9hdFRpbWVEb21haW5EYXRhKHRoaXMuZGF0YUFycmF5KTtcblxuICAgICAgICBsZXQgcm1zID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YUFycmF5Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICBybXMgKz0gKHRoaXMuZGF0YUFycmF5W2ldICogdGhpcy5kYXRhQXJyYXlbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcm1zID0gTWF0aC5zcXJ0KHJtcyAvIHRoaXMuZGF0YUFycmF5Lmxlbmd0aCk7XG5cbiAgICAgICAgdGhpcy5kYiA9IDIwICogTWF0aC5sb2cxMChybXMpO1xuXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGIgPiAtMjAwICYmIHRoaXMuZGIgIT09IC1JbmZpbml0eSkge1xuICAgICAgICB0aGlzLmRiIC09IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRiID0gLUluZmluaXR5O1xuICAgICAgfVxuXG5cbiAgICAgIC8vY29uc29sZS5sb2coZGIpXG5cbiAgICAgIGlmICh0aGlzLmRiID4gLTcwKSB7XG5cbiAgICAgICAgbGV0IGxpbmVhciA9IG1hdGgubm9ybWFsaXplKHRoaXMuZGIsLTcwLDUpO1xuICAgICAgICBsZXQgZXhwID0gbGluZWFyICogbGluZWFyO1xuICAgICAgICBsZXQgeSA9IG1hdGguc2NhbGUoZXhwLDAsMSx0aGlzLmVsZW1lbnQuaGVpZ2h0LDApO1xuXG4gICAgICAgIHRoaXMuY2FudmFzLmNvbnRleHQuZmlsbFN0eWxlID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxSZWN0KHRoaXMubWV0ZXJXaWR0aCppLHksdGhpcy5tZXRlcldpZHRoLHRoaXMuY2FudmFzLmVsZW1lbnQuaGVpZ2h0IC0geSk7XG5cbiAgICAgICAgLy9jb25zb2xlLmxvZyhcInJlbmRlcmluZy4uLlwiKVxuXG4gICAgICB9XG5cbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICBFcXVpdmFsZW50IHRvIFwicGF0Y2hpbmcgaW5cIiBhbiBhdWRpbyBub2RlIHRvIHZpc3VhbGl6ZS4gTk9URTogWW91IGNhbm5vdCBjb25uZWN0IGF1ZGlvIG5vZGVzIGFjcm9zcyB0d28gZGlmZmVyZW50IGF1ZGlvIGNvbnRleHRzLiBOZXh1c1VJIHJ1bnMgaXRzIGF1ZGlvIGFuYWx5c2lzIG9uIGl0cyBvd24gYXVkaW8gY29udGV4dCwgTmV4dXMuY29udGV4dC4gSWYgdGhlIGF1ZGlvIG5vZGUgeW91IGFyZSB2aXN1YWxpemluZyBpcyBjcmVhdGVkIG9uIGEgZGlmZmVyZW50IGF1ZGlvIGNvbnRleHQsIHlvdSB3aWxsIG5lZWQgdG8gdGVsbCBOZXh1c1VJIHRvIHVzZSB0aGF0IGNvbnRleHQgaW5zdGVhZDogaS5lLiBOZXh1cy5jb250ZXh0ID0gWW91ckF1ZGlvQ29udGV4dE5hbWUuIEZvciBleGFtcGxlLCBpbiBUb25lSlMgcHJvamVjdHMsIHRoZSBsaW5lIHdvdWxkIGJlOiBOZXh1cy5jb250ZXh0ID0gVG9uZS5jb250ZXh0IC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHdyaXRlIHRoYXQgbGluZSBvZiBjb2RlIG9ubHkgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgcHJvamVjdC5cbiAgQHBhcmFtIG5vZGUge0F1ZGlvTm9kZX0gVGhlIGF1ZGlvIG5vZGUgdG8gdmlzdWFsaXplXG4gIEBwYXJhbSBjaGFubmVscyB7bnVtYmVyfSAob3B0aW9uYWwpIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIHNvdXJjZSBub2RlIHRvIHdhdGNoLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaW50ZXJmYWNlIHdpbGwgbG9vayBmb3IgYSAuY2hhbm5lbENvdW50IHByb3BlcnR5IG9uIHRoZSBpbnB1dCBub2RlLiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgdGhlIGludGVyZmFjZSB3aWxsIGRlZmF1bHQgdG8gMSBjaGFubmVsLlxuICBAZXhhbXBsZSBOZXh1cy5jb250ZXh0ID0gVG9uZS5jb250ZXh0IC8vIG9yIGFub3RoZXIgYXVkaW8gY29udGV4dCB5b3UgaGF2ZSBjcmVhdGVkXG4gIG1ldGVyLmNvbm5lY3QoIFRvbmUuTWFzdGVyLCAyICk7XG4gICovXG5cbiAgY29ubmVjdChub2RlLGNoYW5uZWxzKSB7XG4gICAgaWYgKHRoaXMuc291cmNlKSB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG4gICAgLy90aGlzLmR1bW15LmRpc2Nvbm5lY3QodGhpcy5zcGxpdHRlcik7XG5cbiAgICBpZiAoY2hhbm5lbHMpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHMgPSBjaGFubmVscztcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hhbm5lbENvdW50KSB7XG4gICAgICB0aGlzLmNoYW5uZWxzID0gbm9kZS5jaGFubmVsQ291bnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbm5lbHMgPSAyO1xuICAgIH1cbiAgICB0aGlzLm1ldGVyV2lkdGggPSB0aGlzLmNhbnZhcy5lbGVtZW50LndpZHRoL3RoaXMuY2hhbm5lbHM7XG5cbiAgICB0aGlzLnNvdXJjZSA9IG5vZGU7XG4gICAgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLnNwbGl0dGVyKTtcblxuICAvLyAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICBTdG9wIHZpc3VhbGl6aW5nIHRoZSBzb3VyY2Ugbm9kZSBhbmQgZGlzY29ubmVjdCBpdC5cbiAgKi9cbiAgZGlzY29ubmVjdCgpIHtcblxuICAgIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5zcGxpdHRlcik7XG4gICAgdGhpcy5zb3VyY2UgPSBmYWxzZTtcbiAgLy8gIHRoaXMuZHVtbXkuY29ubmVjdCh0aGlzLnNwbGl0dGVyKTtcbiAgICB0aGlzLm1ldGVyV2lkdGggPSB0aGlzLmNhbnZhcy5lbGVtZW50LndpZHRoL3RoaXMuY2hhbm5lbHM7XG5cbiAgfVxuXG4gIGNsaWNrKCkge1xuICAgIHRoaXMuYWN0aXZlID0gIXRoaXMuYWN0aXZlO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBjdXN0b21EZXN0cm95KCkge1xuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL2ludGVyZmFjZXMvbWV0ZXIuanMiLCIndXNlIHN0cmljdCc7XG5cbmxldCBkb20gPSByZXF1aXJlKCcuLi91dGlsL2RvbScpO1xubGV0IEludGVyZmFjZSA9IHJlcXVpcmUoJy4uL2NvcmUvaW50ZXJmYWNlJyk7XG5cbi8qKlxuKiBPc2NpbGxvc2NvcGVcbipcbiogQGRlc2NyaXB0aW9uIFZpc3VhbGl6ZXMgYSB3YXZlZm9ybSdzIHN0cmVhbSBvZiB2YWx1ZXMuXG4qXG4qIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwib3NjaWxsb3Njb3BlXCI+PC9zcGFuPlxuKlxuKiBAZXhhbXBsZVxuKiB2YXIgb3NjaWxsb3Njb3BlID0gbmV3IE5leHVzLk9zY2lsbG9zY29wZSgnI3RhcmdldCcpXG4qXG4qIEBleGFtcGxlXG4qIHZhciBvc2NpbGxvc2NvcGUgPSBuZXcgTmV4dXMuT3NjaWxsb3Njb3BlKCcjdGFyZ2V0Jyx7XG4qICAgJ3NpemUnOiBbMzAwLDE1MF1cbiogfSlcbipcbiogQG91dHB1dFxuKiAmbmJzcDtcbiogTm8gZXZlbnRzXG4qXG4qL1xuXG5pbXBvcnQgeyBjb250ZXh0IH0gZnJvbSAnLi4vbWFpbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9zY2lsbG9zY29wZSBleHRlbmRzIEludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBsZXQgb3B0aW9ucyA9IFsnc2NhbGUnLCd2YWx1ZSddO1xuXG4gICAgbGV0IGRlZmF1bHRzID0ge1xuICAgICAgJ3NpemUnOiBbMzAwLDE1MF1cbiAgICB9O1xuXG4gICAgc3VwZXIoYXJndW1lbnRzLG9wdGlvbnMsZGVmYXVsdHMpO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dCgpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblxuICAgIHRoaXMuYW5hbHlzZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcbiAgICB0aGlzLmFuYWx5c2VyLmZmdFNpemUgPSAyMDQ4O1xuICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudDtcbiAgICB0aGlzLmRhdGFBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyTGVuZ3RoKTtcbiAgICB0aGlzLmFuYWx5c2VyLmdldEJ5dGVUaW1lRG9tYWluRGF0YSh0aGlzLmRhdGFBcnJheSk7XG5cbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cbiAgICB0aGlzLnNvdXJjZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5pbml0KCk7XG5cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgYnVpbGRGcmFtZSgpIHtcbiAgICB0aGlzLmNhbnZhcyA9IG5ldyBkb20uU21hcnRDYW52YXModGhpcy5wYXJlbnQpO1xuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuY2FudmFzLmVsZW1lbnQ7XG4gIH1cblxuICBzaXplSW50ZXJmYWNlKCkge1xuICAgIHRoaXMuY2FudmFzLnJlc2l6ZSh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtcbiAgfVxuXG4gIGNvbG9ySW50ZXJmYWNlKCkge1xuICAgIHRoaXMuY2FudmFzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuZmlsbDtcbiAgfVxuXG4gIHJlbmRlcigpIHtcblxuICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZVRpbWVEb21haW5EYXRhKHRoaXMuZGF0YUFycmF5KTtcblxuICAgIHRoaXMuY2FudmFzLmNvbnRleHQuZmlsbFN0eWxlID0gdGhpcy5jb2xvcnMuZmlsbDtcbiAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxSZWN0KDAsIDAsIHRoaXMuY2FudmFzLmVsZW1lbnQud2lkdGgsIHRoaXMuY2FudmFzLmVsZW1lbnQuaGVpZ2h0KTtcblxuICAgIHRoaXMuY2FudmFzLmNvbnRleHQubGluZVdpZHRoID0gfn4odGhpcy5oZWlnaHQgLyAxMDAgKyAyKTtcbiAgICB0aGlzLmNhbnZhcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuXG4gICAgdGhpcy5jYW52YXMuY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgIGlmICh0aGlzLnNvdXJjZSkge1xuXG4gICAgICB2YXIgc2xpY2VXaWR0aCA9IHRoaXMuY2FudmFzLmVsZW1lbnQud2lkdGggKiAxLjAgLyB0aGlzLmJ1ZmZlckxlbmd0aDtcbiAgICAgIHZhciB4ID0gMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJ1ZmZlckxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgdmFyIHYgPSB0aGlzLmRhdGFBcnJheVtpXSAvIDEyOC4wO1xuICAgICAgICB2YXIgeSA9IHYgKiB0aGlzLmNhbnZhcy5lbGVtZW50LmhlaWdodCAvIDI7XG5cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0Lm1vdmVUbyh4LCB5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmxpbmVUbyh4LCB5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHggKz0gc2xpY2VXaWR0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0Lm1vdmVUbygwLCB0aGlzLmNhbnZhcy5lbGVtZW50LmhlaWdodC8yKTtcbiAgICAgICAgdGhpcy5jYW52YXMuY29udGV4dC5saW5lVG8odGhpcy5jYW52YXMuZWxlbWVudC53aWR0aCwgdGhpcy5jYW52YXMuZWxlbWVudC5oZWlnaHQvMik7XG4gICAgfVxuXG4gICAgdGhpcy5jYW52YXMuY29udGV4dC5zdHJva2UoKTtcbiAgfVxuXG4gIC8qKlxuICBFcXVpdmFsZW50IHRvIFwicGF0Y2hpbmcgaW5cIiBhbiBhdWRpbyBub2RlIHRvIHZpc3VhbGl6ZS4gTk9URTogWW91IGNhbm5vdCBjb25uZWN0IGF1ZGlvIG5vZGVzIGFjcm9zcyB0d28gZGlmZmVyZW50IGF1ZGlvIGNvbnRleHRzLiBOZXh1c1VJIHJ1bnMgaXRzIGF1ZGlvIGFuYWx5c2lzIG9uIGl0cyBvd24gYXVkaW8gY29udGV4dCwgTmV4dXMuY29udGV4dC4gSWYgdGhlIGF1ZGlvIG5vZGUgeW91IGFyZSB2aXN1YWxpemluZyBpcyBjcmVhdGVkIG9uIGEgZGlmZmVyZW50IGF1ZGlvIGNvbnRleHQsIHlvdSB3aWxsIG5lZWQgdG8gdGVsbCBOZXh1c1VJIHRvIHVzZSB0aGF0IGNvbnRleHQgaW5zdGVhZDogaS5lLiBOZXh1cy5jb250ZXh0ID0gWW91ckF1ZGlvQ29udGV4dE5hbWUuIEZvciBleGFtcGxlLCBpbiBUb25lSlMgcHJvamVjdHMsIHRoZSBsaW5lIHdvdWxkIGJlOiBOZXh1cy5jb250ZXh0ID0gVG9uZS5jb250ZXh0IC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHdyaXRlIHRoYXQgbGluZSBvZiBjb2RlIG9ubHkgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgcHJvamVjdC5cbiAgQHBhcmFtIG5vZGUge0F1ZGlvTm9kZX0gVGhlIGF1ZGlvIG5vZGUgdG8gdmlzdWFsaXplXG4gIEBleGFtcGxlIE5leHVzLmNvbnRleHQgPSBUb25lLmNvbnRleHQgLy8gb3IgYW5vdGhlciBhdWRpbyBjb250ZXh0IHlvdSBoYXZlIGNyZWF0ZWRcbiAgb3NjaWxsb3Njb3BlLmNvbm5lY3QoIFRvbmUuTWFzdGVyICk7XG4gICovXG5cbiAgY29ubmVjdChub2RlKSB7XG5cbiAgICBpZiAodGhpcy5zb3VyY2UpIHtcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHRoaXMuc291cmNlID0gbm9kZTtcbiAgICB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpO1xuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIC8qKlxuICBTdG9wIHZpc3VhbGl6aW5nIHRoZSBzb3VyY2Ugbm9kZSBhbmQgZGlzY29ubmVjdCBpdC5cbiAgKi9cbiAgZGlzY29ubmVjdCgpIHtcbiAgICBpZiAodGhpcy5zb3VyY2UpIHtcbiAgICAgIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5hbmFseXNlcik7XG4gICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgfVxuXG4gIH1cblxuICBjbGljaygpIHtcbiAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgY3VzdG9tRGVzdHJveSgpIHtcbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi9pbnRlcmZhY2VzL29zY2lsbG9zY29wZS5qcyIsIi8qXG5NYWluIGNvbmNlcHQ6XG5zeW50aCA9IG5ldyBOZXh1cy5SYWNrKCdlbGVtZW50SUQnKTtcblxuVHJhbnNmb3JtIGFsbCBlbGVtZW50cyBpbnNpZGUgdGhlIGRpdlxuc3ludGguZWxlbWVudElEIHdpbGwgaG9sZCB0aGUgZmlyc3Qgc2xpZGVyIGludGVyZmFjZVxuXG4yKSBJbiBmdXR1cmUsIHBvdGVudGlhbGx5IHdyaXRpbmcgYSByYWNrIHRoYXQgaXMgcmUtdXNhYmxlP1xuQ291bGQgYWxzbyB0YWtlIEpTT05cblxubmV3IE5leHVzLlJhY2soJyN0YXJnZXQnLHtcbiAgcHJlOiAoKSA9PiB7XG4gICAgY3JlYXRlIHNvbWUgZGl2cyBoZXJlLCBvciBzb21lIGF1ZGlvIGNvZGVcbiAgfSxcbiAgaW50ZXJmYWNlOiB7XG4gICAgc2xpZGVyMTogTmV4dXMuYWRkLnNsaWRlcih7XG4gICAgICB0b3A6MTAsXG4gICAgICBsZWZ0OjEwLFxuICAgICAgd2lkdGg6NTAsXG4gICAgICBoZWlnaHQ6MTAwLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICBzdGVwOiAxXG4gICAgfSksXG4gICAgd2F2ZTE6IE5leHVzLmFkZC53YXZlZm9ybSh7XG4gICAgICBmaWxlOiAnLi9wYXRoL3RvL2ZpbGUubXAzJyxcbiAgICAgIHdpZHRoOjUwMCxcbiAgICAgIGhlaWdodDoxMDAsXG4gICAgICBtb2RlOiAncmFuZ2UnXG4gICAgfSlcbiAgfSxcbiAgaW5pdDogKCkgPT4ge1xuICAgIC8vIHNvbWUgYXVkaW8gaW5pdCBjb2RlIGdvZXMgaGVyZS4uLlxuICB9XG59KTtcblxuKi9cblxuaW1wb3J0ICogYXMgdHJhbnNmb3JtIGZyb20gJy4uL3V0aWwvdHJhbnNmb3JtJztcbmltcG9ydCBkb20gZnJvbSAnLi4vdXRpbC9kb20nO1xuXG5pbXBvcnQgeyBjb2xvcnMgfSBmcm9tICcuLi9tYWluJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFjayB7XG5cbiAgY29uc3RydWN0b3IodGFyZ2V0LCBzZXR0aW5ncykge1xuXG4gICAgdGhpcy5tZXRhID0ge307XG4gICAgdGhpcy5tZXRhLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLm1ldGEucGFyZW50ID0gZG9tLnBhcnNlRWxlbWVudCh0YXJnZXQpOyAvLyBzaG91bGQgYmUgYSBnZW5lcmljIGZ1bmN0aW9uIGZvciBwYXJzaW5nIGEgJ3RhcmdldCcgYXJndW1lbnQgdGhhdCBjaGVja3MgZm9yIHN0cmluZy9ET00valFVRVJZXG4gICAgdGhpcy5tZXRhLmNvbG9ycyA9IHt9O1xuXG4gICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICB0aGlzLm1ldGEuYXR0cmlidXRlID0gc2V0dGluZ3MuYXR0cmlidXRlIHx8ICduZXh1cy11aSc7XG4gICAgICB0aGlzLm1ldGEudGl0bGUgPSBzZXR0aW5ncy5uYW1lIHx8IGZhbHNlO1xuICAgICAgdGhpcy5tZXRhLm9wZW4gPSBzZXR0aW5ncy5vcGVuIHx8IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1ldGEuYXR0cmlidXRlID0gJ25leHVzLXVpJztcbiAgICAgIHRoaXMubWV0YS50aXRsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5tZXRhLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgZGVmYXVsdENvbG9ycyA9IGNvbG9ycygpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICB0aGlzLm1ldGEuY29sb3JzLmFjY2VudCA9IGRlZmF1bHRDb2xvcnMuYWNjZW50O1xuICAgIHRoaXMubWV0YS5jb2xvcnMuZmlsbCA9IGRlZmF1bHRDb2xvcnMuZmlsbDtcbiAgICB0aGlzLm1ldGEuY29sb3JzLmxpZ2h0ID0gZGVmYXVsdENvbG9ycy5saWdodDtcbiAgICB0aGlzLm1ldGEuY29sb3JzLmRhcmsgPSBkZWZhdWx0Q29sb3JzLmRhcms7XG4gICAgdGhpcy5tZXRhLmNvbG9ycy5tZWRpdW1MaWdodCA9IGRlZmF1bHRDb2xvcnMubWVkaXVtTGlnaHQ7XG4gICAgdGhpcy5tZXRhLmNvbG9ycy5tZWRpdW1EYXJrID0gZGVmYXVsdENvbG9ycy5tZWRpdW1EYXJrO1xuICAgIHRoaXMuYnVpbGRJbnRlcmZhY2UoKTtcbiAgICB0aGlzLmNvbG9ySW50ZXJmYWNlKCk7XG4gIH1cblxuICBidWlsZEludGVyZmFjZSgpIHtcbiAgICB0aGlzLm1ldGEucGFyZW50LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICB0aGlzLm1ldGEucGFyZW50LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XG4gICAgdGhpcy5tZXRhLnBhcmVudC5zdHlsZS5tb3pVc2VyU2VsZWN0ID0gJ25vbmUnO1xuICAgIHRoaXMubWV0YS5wYXJlbnQuc3R5bGUud2Via2l0VXNlclNlbGVjdCA9ICdub25lJztcblxuICAgIHRoaXMubWV0YS5jb250ZW50cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgd2hpbGUgKHRoaXMubWV0YS5wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubWV0YS5jb250ZW50cy5hcHBlbmRDaGlsZCh0aGlzLm1ldGEucGFyZW50LmNoaWxkTm9kZXNbMF0pO1xuICAgIH1cblxuICAgIHRoaXMubWV0YS5jb250ZW50cy5zdHlsZS5wYWRkaW5nID0gJzBweCc7XG4gICAgdGhpcy5tZXRhLmNvbnRlbnRzLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcblxuICAgIGlmICh0aGlzLm1ldGEudGl0bGUpIHtcbiAgICAgIHRoaXMubWV0YS50aXRsZUJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5tZXRhLnRpdGxlQmFyLmlubmVySFRNTCA9IHRoaXMubWV0YS50aXRsZTtcbiAgICAgIHRoaXMubWV0YS50aXRsZUJhci5zdHlsZS5mb250RmFtaWx5ID0gJ2FyaWFsJztcbiAgICAgIHRoaXMubWV0YS50aXRsZUJhci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICB0aGlzLm1ldGEudGl0bGVCYXIuc3R5bGUuY29sb3IgPSAnIzg4OCc7XG4gICAgICB0aGlzLm1ldGEudGl0bGVCYXIuc3R5bGUucGFkZGluZyA9ICc3cHgnO1xuICAgICAgdGhpcy5tZXRhLnRpdGxlQmFyLnN0eWxlLmZvbnRTaXplID0gJzEycHgnO1xuXG4gICAgICB0aGlzLm1ldGEuYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLm1ldGEuYnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgIHRoaXMubWV0YS5idXR0b24uc3R5bGUudG9wID0gJzVweCcgO1xuICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5yaWdodCA9ICc1cHgnIDtcbiAgICAgIHRoaXMubWV0YS5idXR0b24uaW5uZXJIVE1MID0gJy0nO1xuICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5wYWRkaW5nID0gJzBweCA1cHggMnB4JztcbiAgICAgIHRoaXMubWV0YS5idXR0b24uc3R5bGUubGluZUhlaWdodCA9ICcxMnB4JztcbiAgICAgIHRoaXMubWV0YS5idXR0b24uc3R5bGUuZm9udFNpemUgPSAnMTVweCc7XG5cbiAgICAgIHRoaXMubWV0YS5idXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuXG4gICAgICB0aGlzLm1ldGEuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1ldGEuY29sb3JzLm1lZGl1bURhcms7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubWV0YS5idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1ldGEuY29sb3JzLm1lZGl1bUxpZ2h0O1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1ldGEuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tZXRhLm9wZW4pIHtcbiAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cblxuICAgICAgdGhpcy5tZXRhLnRpdGxlQmFyLmFwcGVuZENoaWxkKHRoaXMubWV0YS5idXR0b24pO1xuXG4gICAgICB0aGlzLm1ldGEucGFyZW50LmFwcGVuZENoaWxkKHRoaXMubWV0YS50aXRsZUJhcik7XG4gICAgfVxuICAgIHRoaXMubWV0YS5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5tZXRhLmNvbnRlbnRzKTtcblxuICAvLyAgdmFyIHdpZHRoID0gdGhpcy5tZXRhLnBhcmVudC5zdHlsZS53aWR0aCA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5tZXRhLnBhcmVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKTtcbi8vICAgIHRoaXMubWV0YS5wYXJlbnQuc3R5bGUud2lkdGggPSB3aWR0aDtcblxuICAgIGxldCB1aSA9IHRyYW5zZm9ybS5zZWN0aW9uKHRoaXMubWV0YS50YXJnZXQsIHRoaXMubWV0YS5hdHRyaWJ1dGUpO1xuICAgIGZvciAodmFyIGtleSBpbiB1aSkge1xuICAgICAgdGhpc1trZXldID0gdWlba2V5XTtcbiAgICB9XG4gIH1cblxuICBjb2xvckludGVyZmFjZSgpIHtcbiAgICBpZiAodGhpcy5tZXRhLnRpdGxlKSB7XG4gICAgICB0aGlzLm1ldGEuYnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubWV0YS5jb2xvcnMubWVkaXVtTGlnaHQ7XG4gICAgICB0aGlzLm1ldGEuYnV0dG9uLnN0eWxlLmJvcmRlciA9ICdzb2xpZCAwcHggJyt0aGlzLm1ldGEuY29sb3JzLmZpbGw7XG4gICAgICB0aGlzLm1ldGEucGFyZW50LnN0eWxlLmJvcmRlciA9ICdzb2xpZCAxcHggJyt0aGlzLm1ldGEuY29sb3JzLm1lZGl1bUxpZ2h0O1xuICAgICAgdGhpcy5tZXRhLnBhcmVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1ldGEuY29sb3JzLmxpZ2h0O1xuICAgICAgdGhpcy5tZXRhLnRpdGxlQmFyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubWV0YS5jb2xvcnMuZmlsbDtcbiAgICB9XG4gIH1cblxuICBzaG93KCkge1xuICAgIHRoaXMubWV0YS5jb250ZW50cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLm1ldGEub3BlbiA9IHRydWU7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMubWV0YS5jb250ZW50cy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMubWV0YS5vcGVuID0gZmFsc2U7XG4gIH1cblxuICBjb2xvcml6ZSh0eXBlLGNvbG9yKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMpIHtcbiAgICAgIGlmICh0aGlzW2tleV0uY29sb3JpemUpIHtcbiAgICAgICAgdGhpc1trZXldLmNvbG9yaXplKHR5cGUsY29sb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm1ldGEuY29sb3JzW3R5cGVdID0gY29sb3I7XG4gICAgdGhpcy5jb2xvckludGVyZmFjZSgpO1xuICB9XG5cbiAgZW1wdHkoKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMpIHtcbiAgICAgIGlmICh0aGlzW2tleV0uZGVzdHJveSkge1xuICAgICAgICB0aGlzW2tleV0uZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvY29yZS9yYWNrLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgZG9tIGZyb20gJy4uL3V0aWwvZG9tJztcbmltcG9ydCBJbnRlcmZhY2VzIGZyb20gJy4uL2ludGVyZmFjZXMvJztcblxubGV0IGNyZWF0ZUludGVyZmFjZUlEID0gKHdpZGdldCxpbnRlcmZhY2VJRHMpID0+IHtcbiAgbGV0IHR5cGUgPSB3aWRnZXQudHlwZTtcbiAgaWYgKGludGVyZmFjZUlEc1t0eXBlXSkge1xuICAgIGludGVyZmFjZUlEc1t0eXBlXSsrO1xuICB9IGVsc2Uge1xuICAgIGludGVyZmFjZUlEc1t0eXBlXSA9IDE7XG4gIH1cbiAgcmV0dXJuICggdHlwZSArIGludGVyZmFjZUlEc1t0eXBlXSApO1xufTtcblxubGV0IGVsZW1lbnQgPSAoZWxlbWVudCx0eXBlLG9wdGlvbnMpID0+IHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKXtcbiAgICBsZXQgYXR0ID0gZWxlbWVudC5hdHRyaWJ1dGVzW2ldO1xuICAvLyAgdHJ5IHtcbiAgLy8gICAgb3B0aW9uc1thdHQubm9kZU5hbWVdID0gZXZhbChhdHQubm9kZVZhbHVlKTtcbiAgLy8gIH0gY2F0Y2goZSkge1xuICAgICAgb3B0aW9uc1thdHQubm9kZU5hbWVdID0gYXR0Lm5vZGVWYWx1ZTtcbiAgLy8gIH1cbiAgfVxuICB0eXBlID0gdHlwZVswXS50b1VwcGVyQ2FzZSgpICsgdHlwZS5zbGljZSgxKTtcbiAgbGV0IHdpZGdldCA9IG5ldyBJbnRlcmZhY2VzW3R5cGVdKGVsZW1lbnQsb3B0aW9ucyk7XG4gIHdpZGdldC5pZCA9IGVsZW1lbnQuaWQ7XG4gIHJldHVybiB3aWRnZXQ7XG59O1xuXG5cbmxldCBzZWN0aW9uID0gKHBhcmVudCxrZXl3b3JkKSA9PiB7XG5cbiAga2V5d29yZCA9IGtleXdvcmQgfHwgJ25leHVzLXVpJztcblxuICBsZXQgaW50ZXJmYWNlSURzID0ge307XG5cbiAgbGV0IGNvbnRhaW5lciA9IGRvbS5wYXJzZUVsZW1lbnQocGFyZW50KTtcblxuICBsZXQgdWkgPSB7fTtcblxuICBsZXQgaHRtbEVsZW1lbnRzID0gY29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyk7XG4gIGxldCBlbGVtZW50cyA9IFtdO1xuICBmb3IgKGxldCBpPTA7IGk8aHRtbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZWxlbWVudHMucHVzaChodG1sRWxlbWVudHNbaV0pO1xuICB9XG4gIGZvciAobGV0IGk9MDtpPGVsZW1lbnRzLmxlbmd0aDtpKyspIHtcbiAgICBsZXQgdHlwZSA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShrZXl3b3JkKTtcbiAgICBpZiAodHlwZSkge1xuICAgICAgbGV0IGZvcm1hdHRlZFR5cGUgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGtleSBpbiBJbnRlcmZhY2VzKSB7XG4gICAgICAgIGlmICh0eXBlLnRvTG93ZXJDYXNlKCk9PT1rZXkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGZvcm1hdHRlZFR5cGUgPSBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKGZvcm1hdHRlZFR5cGUpO1xuICAgICAgbGV0IHdpZGdldCA9IGVsZW1lbnQoZWxlbWVudHNbaV0sZm9ybWF0dGVkVHlwZSk7XG4gICAgICBpZiAod2lkZ2V0LmlkKSB7XG4gICAgICAgIHVpW3dpZGdldC5pZF0gPSB3aWRnZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgaWQgPSBjcmVhdGVJbnRlcmZhY2VJRCh3aWRnZXQsaW50ZXJmYWNlSURzKTtcbiAgICAgICAgdWlbaWRdID0gd2lkZ2V0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1aTtcblxufTtcblxubGV0IGFkZCA9ICh0eXBlLHBhcmVudCxvcHRpb25zKSA9PiB7XG4gIGxldCB0YXJnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmIChwYXJlbnQpIHtcbiAgICBwYXJlbnQgPSBkb20ucGFyc2VFbGVtZW50KHBhcmVudCk7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgfVxuICBwYXJlbnQuYXBwZW5kQ2hpbGQodGFyZ2V0KTtcbiAgb3B0aW9ucy50YXJnZXQgPSB0YXJnZXQ7XG4gIGlmIChvcHRpb25zLnNpemUpIHtcbiAgICB0YXJnZXQuc3R5bGUud2lkdGggPSBvcHRpb25zLnNpemVbMF0gKyAncHgnO1xuICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBvcHRpb25zLnNpemVbMV0gKyAncHgnO1xuICB9XG4gIHJldHVybiBlbGVtZW50KHRhcmdldCx0eXBlLG9wdGlvbnMpO1xufTtcblxuZXhwb3J0IHsgZWxlbWVudCB9O1xuZXhwb3J0IHsgc2VjdGlvbiB9O1xuZXhwb3J0IHsgYWRkIH07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvdXRpbC90cmFuc2Zvcm0uanMiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBtYXRoIGZyb20gJy4uL3V0aWwvbWF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFR1bmUge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gIFx0Ly8gdGhlIHNjYWxlIGFzIHJhdGlvc1xuICBcdHRoaXMuc2NhbGUgPSBbXTtcblxuICBcdC8vIGkvbyBtb2Rlc1xuICBcdHRoaXMubW9kZSA9IHtcbiAgXHRcdG91dHB1dDogJ2ZyZXF1ZW5jeScsXG4gIFx0XHRpbnB1dDogJ3N0ZXAnXG4gIFx0fTtcblxuICBcdC8vIEVUIG1ham9yXG4gIFx0dGhpcy5ldG1ham9yID0gWyAyNjEuNjI1NTgsXG4gIFx0XHQyOTMuNjY0NzY0LFxuICBcdFx0MzI5LjYyNzU2MyxcbiAgXHRcdDM0OS4yMjgyNDEsXG4gIFx0XHQzOTEuOTk1NDIyLFxuICBcdFx0NDQwLFxuICBcdFx0NDkzLjg4MzMwMSxcbiAgXHRcdDUyMy4yNTExNlxuICBcdF07XG5cbiAgXHQvLyBSb290IGZyZXF1ZW5jeS5cbiAgXHR0aGlzLnJvb3QgPSBtYXRoLm10b2YoNjApOyAgICAgLy8gKiBNYXRoLnBvdygyLCg2MC02OSkvMTIpO1xuXG4gICAgLy8gZGVmYXVsdCBpcyBhIG1ham9yIHNjYWxlXG4gICAgdGhpcy5jcmVhdGVTY2FsZSgwLDIsNCw1LDcsOSwxMSk7XG5cbiAgfVxuXG4gIC8qIFJldHVybiBkYXRhIGluIHRoZSBtb2RlIHlvdSBhcmUgaW4gKGZyZXEsIHJhdGlvLCBvciBtaWRpKSAqL1xuICBub3RlKGlucHV0LG9jdGF2ZSkge1xuXG4gIFx0bGV0IG5ld3ZhbHVlO1xuXG4gIFx0aWYgKHRoaXMubW9kZS5vdXRwdXQgPT09ICdmcmVxdWVuY3knKSB7XG4gIFx0XHRuZXd2YWx1ZSA9IHRoaXMuZnJlcXVlbmN5KGlucHV0LG9jdGF2ZSk7XG4gIFx0fSBlbHNlIGlmICh0aGlzLm1vZGUub3V0cHV0ID09PSAncmF0aW8nKSB7XG4gIFx0XHRuZXd2YWx1ZSA9IHRoaXMucmF0aW8oaW5wdXQsb2N0YXZlKTtcbiAgXHR9IGVsc2UgaWYgKHRoaXMubW9kZS5vdXRwdXQgPT09ICdNSURJJykge1xuICBcdFx0bmV3dmFsdWUgPSB0aGlzLk1JREkoaW5wdXQsb2N0YXZlKTtcbiAgXHR9IGVsc2Uge1xuICBcdFx0bmV3dmFsdWUgPSB0aGlzLmZyZXF1ZW5jeShpbnB1dCxvY3RhdmUpO1xuICBcdH1cblxuICBcdHJldHVybiBuZXd2YWx1ZTtcblxuICB9XG5cblxuICAvKiBSZXR1cm4gZnJlcSBkYXRhICovXG4gIGZyZXF1ZW5jeShzdGVwSW4sIG9jdGF2ZUluKSB7XG5cbiAgXHRpZiAodGhpcy5tb2RlLmlucHV0ID09PSAnbWlkaScgfHwgdGhpcy5tb2RlLmlucHV0ID09PSAnTUlESScgKSB7XG4gIFx0XHR0aGlzLnN0ZXBJbiArPSA2MDtcbiAgXHR9XG5cbiAgXHQvLyB3aGF0IG9jdGF2ZSBpcyBvdXIgaW5wdXRcbiAgXHRsZXQgb2N0YXZlID0gTWF0aC5mbG9vcihzdGVwSW4vdGhpcy5zY2FsZS5sZW5ndGgpO1xuXG4gIFx0aWYgKG9jdGF2ZUluKSB7XG4gIFx0XHRvY3RhdmUgKz0gb2N0YXZlSW47XG4gIFx0fVxuXG4gIFx0Ly8gd2hpY2ggc2NhbGUgZGVncmVlICgwIC0gc2NhbGUgbGVuZ3RoKSBpcyBvdXIgaW5wdXRcbiAgXHRsZXQgc2NhbGVEZWdyZWUgPSBzdGVwSW4gJSB0aGlzLnNjYWxlLmxlbmd0aDtcblxuICBcdHdoaWxlIChzY2FsZURlZ3JlZSA8IDApIHtcbiAgXHRcdHNjYWxlRGVncmVlICs9IHRoaXMuc2NhbGUubGVuZ3RoO1xuICBcdH1cblxuICAgIGxldCByYXRpbyA9IHRoaXMuc2NhbGVbc2NhbGVEZWdyZWVdO1xuXG4gIFx0bGV0IGZyZXEgPSB0aGlzLnJvb3QgKiByYXRpbztcblxuICBcdGZyZXEgPSBmcmVxKihNYXRoLnBvdygyLG9jdGF2ZSkpO1xuXG4gIFx0Ly8gdHJ1bmNhdGUgaXJyYXRpb25hbCBudW1iZXJzXG4gIFx0ZnJlcSA9IE1hdGguZmxvb3IoZnJlcSoxMDAwMDAwMDAwMDApLzEwMDAwMDAwMDAwMDtcblxuICBcdHJldHVybiBmcmVxO1xuXG4gIH1cblxuICAvKiBGb3JjZSByZXR1cm4gcmF0aW8gZGF0YSAqL1xuXG4gIHJhdGlvKHN0ZXBJbiwgb2N0YXZlSW4pIHtcblxuICBcdGlmICh0aGlzLm1vZGUuaW5wdXQgPT09ICdtaWRpJyB8fCB0aGlzLm1vZGUuaW5wdXQgPT09ICdNSURJJyApIHtcbiAgXHRcdHRoaXMuc3RlcEluICs9IDYwO1xuICBcdH1cblxuICBcdC8vIHdoYXQgb2N0YXZlIGlzIG91ciBpbnB1dFxuICBcdGxldCBvY3RhdmUgPSBNYXRoLmZsb29yKHN0ZXBJbi90aGlzLnNjYWxlLmxlbmd0aCk7XG5cbiAgXHRpZiAob2N0YXZlSW4pIHtcbiAgXHRcdG9jdGF2ZSArPSBvY3RhdmVJbjtcbiAgXHR9XG5cbiAgXHQvLyB3aGljaCBzY2FsZSBkZWdyZWUgKDAgLSBzY2FsZSBsZW5ndGgpIGlzIG91ciBpbnB1dFxuICBcdGxldCBzY2FsZURlZ3JlZSA9IHN0ZXBJbiAlIHRoaXMuc2NhbGUubGVuZ3RoO1xuXG4gIFx0Ly8gd2hhdCByYXRpbyBpcyBvdXIgaW5wdXQgdG8gb3VyIGtleVxuICBcdGxldCByYXRpbyA9IE1hdGgucG93KDIsb2N0YXZlKSp0aGlzLnNjYWxlW3NjYWxlRGVncmVlXTtcblxuICBcdHJhdGlvID0gTWF0aC5mbG9vcihyYXRpbyoxMDAwMDAwMDAwMDApLzEwMDAwMDAwMDAwMDtcblxuICBcdHJldHVybiByYXRpbztcblxuICB9XG5cbiAgLyogRm9yY2UgcmV0dXJuIGFkanVzdGVkIE1JREkgZGF0YSAqL1xuXG4gIE1JREkoc3RlcEluLG9jdGF2ZUluKSB7XG5cbiAgXHRsZXQgbmV3dmFsdWUgPSB0aGlzLmZyZXF1ZW5jeShzdGVwSW4sb2N0YXZlSW4pO1xuXG4gIFx0bGV0IG4gPSA2OSArIDEyKk1hdGgubG9nKG5ld3ZhbHVlLzQ0MCkvTWF0aC5sb2coMik7XG5cbiAgXHRuID0gTWF0aC5mbG9vcihuKjEwMDAwMDAwMDApLzEwMDAwMDAwMDA7XG5cbiAgXHRyZXR1cm4gbjtcblxuICB9XG5cbiAgY3JlYXRlU2NhbGUoKSB7XG4gICAgbGV0IG5ld1NjYWxlID0gW107XG4gICAgZm9yIChsZXQgaT0wO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspIHtcbiAgICAgIG5ld1NjYWxlLnB1c2goIG1hdGgubXRvZiggNjAgKyBhcmd1bWVudHNbaV0gKSApO1xuICAgIH1cbiAgICB0aGlzLmxvYWRTY2FsZUZyb21GcmVxdWVuY2llcyhuZXdTY2FsZSk7XG4gIH1cblxuICBjcmVhdGVKSVNjYWxlKCkge1xuICAgIHRoaXMuc2NhbGUgPSBbXTtcbiAgICBmb3IgKGxldCBpPTA7aTxhcmd1bWVudHMubGVuZ3RoO2krKykge1xuICAgICAgdGhpcy5zY2FsZS5wdXNoKGFyZ3VtZW50c1tpXSk7XG4gICAgfVxuICB9XG5cbiAgbG9hZFNjYWxlRnJvbUZyZXF1ZW5jaWVzKGZyZXFzKSB7XG4gICAgdGhpcy5zY2FsZSA9IFtdO1xuICAgIGZvciAobGV0IGk9MDtpPGZyZXFzLmxlbmd0aC0xO2krKykge1xuICAgICAgdGhpcy5zY2FsZS5wdXNoKGZyZXFzW2ldL2ZyZXFzWzBdKTtcbiAgICB9XG4gIH1cblxuICAvKiBMb2FkIGEgbmV3IHNjYWxlICovXG5cbiAgbG9hZFNjYWxlKG5hbWUpe1xuXG4gIFx0LyogbG9hZCB0aGUgc2NhbGUgKi9cbiAgXHRsZXQgZnJlcXMgPSB0aGlzLnNjYWxlc1tuYW1lXS5mcmVxdWVuY2llcztcbiAgICB0aGlzLmxvYWRTY2FsZUZyb21GcmVxdWVuY2llcyhmcmVxcyk7XG5cbiAgfVxuXG4gIC8qIFNlYXJjaCB0aGUgbmFtZXMgb2YgdHVuaW5nc1xuICBcdCBSZXR1cm5zIGFuIGFycmF5IG9mIG5hbWVzIG9mIHR1bmluZ3MgKi9cblxuICBzZWFyY2gobGV0dGVycykge1xuICBcdGxldCBwb3NzaWJsZSA9IFtdO1xuICBcdGZvciAobGV0IGtleSBpbiB0aGlzLnNjYWxlcykge1xuICBcdFx0aWYgKGtleS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobGV0dGVycy50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHtcbiAgXHRcdFx0cG9zc2libGUucHVzaChrZXkpO1xuICBcdFx0fVxuICBcdH1cbiAgXHRyZXR1cm4gcG9zc2libGU7XG4gIH1cblxuICAvKiBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG5vdGVzIGFzIGFuIGFycmF5ICovXG5cbiAgY2hvcmQobWlkaXMpIHtcbiAgXHRsZXQgb3V0cHV0ID0gW107XG4gIFx0Zm9yIChsZXQgaT0wO2k8bWlkaXMubGVuZ3RoO2krKykge1xuICBcdFx0b3V0cHV0LnB1c2godGhpcy5ub3RlKG1pZGlzW2ldKSk7XG4gIFx0fVxuICBcdHJldHVybiBvdXRwdXQ7XG4gIH1cblxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vfi9qc2hpbnQtbG9hZGVyIS4vbGliL3R1bmluZy90dW5pbmcuanMiLCIndXNlIHN0cmljdCc7XG5cbi8vRGlzYWJsZSBqc2hpbnQgd2FybmluZyBjb25jZXJuaW5nIHRyYWlsaW5nIHJlZ3VsYXIgcGFyYW1zXG4vKmpzaGludCAtVzEzOCAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYWRpbyB7XG4gICAgLy9pZiBub24tZXhpc3RlbnQgYnV0dG9ucyBhcmUgc3dpdGNoZWQsIHRoZXkgYXJlIGlnbm9yZWRcblxuICAgIGNvbnN0cnVjdG9yKGxlbmd0aCA9IDMsIC4uLm9uVmFscykge1xuICAgICAgICAvL2VhY2ggb3B0aW9uYWwgJ29uVmFscycgYXJndW1lbnQgc3dpdGNoZXMgb24gdGhhdCB2YWx1ZSBpbiB0aGUgUmFkaW8gaWYgaXQgZXhpc3RzXG4gICAgICAgIC8vSW4gdGhlIGV4YW1wbGUgYmVsb3csIGEgMy1idXR0b24gcmFkaW8gaXMgY3JlYXRlZCwgaW5kZXggMCBpcyBzd2l0Y2hlZCBvbiwgaW5kZXggMSBpcyBzd2l0Y2hlZCBvbiB0aGVuIHRoZW4gYXR0ZW1wdGVkIGFnYWluIHByb2R1Y2luZyBhbiB3YXJuaW5nLCBhbmQgdGhlIGZpbmFsIGFyZ3VtZW50IHByb2R1Y2VzIGEgd2FybmluZyBiZWNhdXNlIHRoZSBpbmRleCB2YWx1ZSBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgLy9FeGFtcGxlOlxuICAgICAgICAvL2AgIHJhZGlvID0gbmV3IFJhZGlvKDMsIDAsIDEsIDEsIDMpO1xuICAgICAgICAvL+KApiAgWzEsMSwwXVxuXG4gICAgICAgIGlmIChsZW5ndGggPCAwKSB7IGxlbmd0aCA9IDE7IH1cblxuICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdGhpcy5vblZhbHMgPSBvblZhbHM7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBuZXcgQXJyYXkobGVuZ3RoKS5maWxsKDApO1xuXG4gICAgICAgIGlmIChvblZhbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5vbiguLi5vblZhbHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYXJyYXkuZmlsbCgwKTtcbiAgICAgICAgdGhpcy5hcnJheVt2YWx1ZV0gPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5hcnJheTtcbiAgICB9XG5cbiAgICBmbGlwKC4uLnZhbHVlcykge1xuICAgICAgICAvL2ZsaXBzIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIGZsaXBzIGFsbCBidXR0b25zXG4gICAgICAgIGxldCBhID0gdGhpcy5hcnJheTtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICAgICAgaWYgKHYgPiBhLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdXYXJuaW5nOiBBbm9uUmFkaW9bJyArIHYgKyAnXSBkb2VzIG5vdCBleGlzdCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFbdl0gPSAoYVt2XSA/IDAgOiAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGEuZm9yRWFjaChmdW5jdGlvbih2LCBpLCBhcnIpIHtcbiAgICAgICAgICAgICAgICBhcnJbaV0gPSAodiA/IDAgOiAxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIG9uKC4uLnZhbHVlcykge1xuICAgICAgICAvL3N3aXRjaCBvbiB0aGUgc3BlY2lmaWVkIHZhbHVlcy4gaWYgbm8gdmFsdWUgc3BlY2lmaWVkLCBmbGlwcyBvbiBhbGwgYnV0dG9uc1xuICAgICAgICBsZXQgYSA9IHRoaXMuYXJyYXk7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odikge1xuICAgICAgICAgICAgICAgIGlmICh2ID4gYS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignV2FybmluZzogQW5vblJhZGlvWycgKyB2ICsgJ10gZXhjZWVkcyBzaXplIG9mIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhW3ZdID09PSAxKSB7IGNvbnNvbGUud2FybignV2FybmluZzogQW5vblJhZGlvWycgKyB2ICsgJ10gd2FzIGFscmVhZHkgb24uJyk7IH1cbiAgICAgICAgICAgICAgICAgICAgYVt2XSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhLmZpbGwoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuXG4gICAgb2ZmKC4uLnZhbHVlcykge1xuICAgICAgICAvL3N3aXRjaCBvZmYgdGhlIHNwZWNpZmllZCB2YWx1ZXMuIGlmIG5vIHZhbHVlIHNwZWNpZmllZCwgZmxpcHMgb2ZmIGFsbCBidXR0b25zXG4gICAgICAgIGxldCBhID0gdGhpcy5hcnJheTtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2KSB7XG4gICAgICAgICAgICAgICAgYVt2XSA9IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGEuZmlsbCgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9+L2pzaGludC1sb2FkZXIhLi9saWIvbW9kZWxzL3JhZGlvLmpzIiwidmFyIFdBQUNsb2NrID0gcmVxdWlyZSgnLi9saWIvV0FBQ2xvY2snKVxuXG5tb2R1bGUuZXhwb3J0cyA9IFdBQUNsb2NrXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHdpbmRvdy5XQUFDbG9jayA9IFdBQUNsb2NrXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vd2FhY2xvY2svaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc0Jyb3dzZXIgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpXG5cbnZhciBDTE9DS19ERUZBVUxUUyA9IHtcbiAgdG9sZXJhbmNlTGF0ZTogMC4xMCxcbiAgdG9sZXJhbmNlRWFybHk6IDAuMDAxXG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09IEV2ZW50ID09PT09PT09PT09PT09PT09PT09IC8vXG52YXIgRXZlbnQgPSBmdW5jdGlvbihjbG9jaywgZGVhZGxpbmUsIGZ1bmMpIHtcbiAgdGhpcy5jbG9jayA9IGNsb2NrXG4gIHRoaXMuZnVuYyA9IGZ1bmNcbiAgdGhpcy5fY2xlYXJlZCA9IGZhbHNlIC8vIEZsYWcgdXNlZCB0byBjbGVhciBhbiBldmVudCBpbnNpZGUgY2FsbGJhY2tcblxuICB0aGlzLnRvbGVyYW5jZUxhdGUgPSBjbG9jay50b2xlcmFuY2VMYXRlXG4gIHRoaXMudG9sZXJhbmNlRWFybHkgPSBjbG9jay50b2xlcmFuY2VFYXJseVxuICB0aGlzLl9sYXRlc3RUaW1lID0gbnVsbFxuICB0aGlzLl9lYXJsaWVzdFRpbWUgPSBudWxsXG4gIHRoaXMuZGVhZGxpbmUgPSBudWxsXG4gIHRoaXMucmVwZWF0VGltZSA9IG51bGxcblxuICB0aGlzLnNjaGVkdWxlKGRlYWRsaW5lKVxufVxuXG4vLyBVbnNjaGVkdWxlcyB0aGUgZXZlbnRcbkV2ZW50LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNsb2NrLl9yZW1vdmVFdmVudCh0aGlzKVxuICB0aGlzLl9jbGVhcmVkID0gdHJ1ZVxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBTZXRzIHRoZSBldmVudCB0byByZXBlYXQgZXZlcnkgYHRpbWVgIHNlY29uZHMuXG5FdmVudC5wcm90b3R5cGUucmVwZWF0ID0gZnVuY3Rpb24odGltZSkge1xuICBpZiAodGltZSA9PT0gMClcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlbGF5IGNhbm5vdCBiZSAwJylcbiAgdGhpcy5yZXBlYXRUaW1lID0gdGltZVxuICBpZiAoIXRoaXMuY2xvY2suX2hhc0V2ZW50KHRoaXMpKVxuICAgIHRoaXMuc2NoZWR1bGUodGhpcy5kZWFkbGluZSArIHRoaXMucmVwZWF0VGltZSlcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gU2V0cyB0aGUgdGltZSB0b2xlcmFuY2Ugb2YgdGhlIGV2ZW50LlxuLy8gVGhlIGV2ZW50IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIGludGVydmFsIGBbZGVhZGxpbmUgLSBlYXJseSwgZGVhZGxpbmUgKyBsYXRlXWBcbi8vIElmIHRoZSBjbG9jayBmYWlscyB0byBleGVjdXRlIHRoZSBldmVudCBpbiB0aW1lLCB0aGUgZXZlbnQgd2lsbCBiZSBkcm9wcGVkLlxuRXZlbnQucHJvdG90eXBlLnRvbGVyYW5jZSA9IGZ1bmN0aW9uKHZhbHVlcykge1xuICBpZiAodHlwZW9mIHZhbHVlcy5sYXRlID09PSAnbnVtYmVyJylcbiAgICB0aGlzLnRvbGVyYW5jZUxhdGUgPSB2YWx1ZXMubGF0ZVxuICBpZiAodHlwZW9mIHZhbHVlcy5lYXJseSA9PT0gJ251bWJlcicpXG4gICAgdGhpcy50b2xlcmFuY2VFYXJseSA9IHZhbHVlcy5lYXJseVxuICB0aGlzLl9yZWZyZXNoRWFybHlMYXRlRGF0ZXMoKVxuICBpZiAodGhpcy5jbG9jay5faGFzRXZlbnQodGhpcykpIHtcbiAgICB0aGlzLmNsb2NrLl9yZW1vdmVFdmVudCh0aGlzKVxuICAgIHRoaXMuY2xvY2suX2luc2VydEV2ZW50KHRoaXMpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBpcyByZXBlYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG5FdmVudC5wcm90b3R5cGUuaXNSZXBlYXRlZCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5yZXBlYXRUaW1lICE9PSBudWxsIH1cblxuLy8gU2NoZWR1bGVzIHRoZSBldmVudCB0byBiZSByYW4gYmVmb3JlIGBkZWFkbGluZWAuXG4vLyBJZiB0aGUgdGltZSBpcyB3aXRoaW4gdGhlIGV2ZW50IHRvbGVyYW5jZSwgd2UgaGFuZGxlIHRoZSBldmVudCBpbW1lZGlhdGVseS5cbi8vIElmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBzY2hlZHVsZWQgYXQgYSBkaWZmZXJlbnQgdGltZSwgaXQgaXMgcmVzY2hlZHVsZWQuXG5FdmVudC5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbihkZWFkbGluZSkge1xuICB0aGlzLl9jbGVhcmVkID0gZmFsc2VcbiAgdGhpcy5kZWFkbGluZSA9IGRlYWRsaW5lXG4gIHRoaXMuX3JlZnJlc2hFYXJseUxhdGVEYXRlcygpXG5cbiAgaWYgKHRoaXMuY2xvY2suY29udGV4dC5jdXJyZW50VGltZSA+PSB0aGlzLl9lYXJsaWVzdFRpbWUpIHtcbiAgICB0aGlzLl9leGVjdXRlKClcbiAgXG4gIH0gZWxzZSBpZiAodGhpcy5jbG9jay5faGFzRXZlbnQodGhpcykpIHtcbiAgICB0aGlzLmNsb2NrLl9yZW1vdmVFdmVudCh0aGlzKVxuICAgIHRoaXMuY2xvY2suX2luc2VydEV2ZW50KHRoaXMpXG4gIFxuICB9IGVsc2UgdGhpcy5jbG9jay5faW5zZXJ0RXZlbnQodGhpcylcbn1cblxuRXZlbnQucHJvdG90eXBlLnRpbWVTdHJldGNoID0gZnVuY3Rpb24odFJlZiwgcmF0aW8pIHtcbiAgaWYgKHRoaXMuaXNSZXBlYXRlZCgpKVxuICAgIHRoaXMucmVwZWF0VGltZSA9IHRoaXMucmVwZWF0VGltZSAqIHJhdGlvXG5cbiAgdmFyIGRlYWRsaW5lID0gdFJlZiArIHJhdGlvICogKHRoaXMuZGVhZGxpbmUgLSB0UmVmKVxuICAvLyBJZiB0aGUgZGVhZGxpbmUgaXMgdG9vIGNsb3NlIG9yIHBhc3QsIGFuZCB0aGUgZXZlbnQgaGFzIGEgcmVwZWF0LFxuICAvLyB3ZSBjYWxjdWxhdGUgdGhlIG5leHQgcmVwZWF0IHBvc3NpYmxlIGluIHRoZSBzdHJldGNoZWQgc3BhY2UuXG4gIGlmICh0aGlzLmlzUmVwZWF0ZWQoKSkge1xuICAgIHdoaWxlICh0aGlzLmNsb2NrLmNvbnRleHQuY3VycmVudFRpbWUgPj0gZGVhZGxpbmUgLSB0aGlzLnRvbGVyYW5jZUVhcmx5KVxuICAgICAgZGVhZGxpbmUgKz0gdGhpcy5yZXBlYXRUaW1lXG4gIH1cbiAgdGhpcy5zY2hlZHVsZShkZWFkbGluZSlcbn1cblxuLy8gRXhlY3V0ZXMgdGhlIGV2ZW50XG5FdmVudC5wcm90b3R5cGUuX2V4ZWN1dGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuY2xvY2suX3N0YXJ0ZWQgPT09IGZhbHNlKSByZXR1cm5cbiAgdGhpcy5jbG9jay5fcmVtb3ZlRXZlbnQodGhpcylcblxuICBpZiAodGhpcy5jbG9jay5jb250ZXh0LmN1cnJlbnRUaW1lIDwgdGhpcy5fbGF0ZXN0VGltZSlcbiAgICB0aGlzLmZ1bmModGhpcylcbiAgZWxzZSB7XG4gICAgaWYgKHRoaXMub25leHBpcmVkKSB0aGlzLm9uZXhwaXJlZCh0aGlzKVxuICAgIGNvbnNvbGUud2FybignZXZlbnQgZXhwaXJlZCcpXG4gIH1cbiAgLy8gSW4gdGhlIGNhc2UgYHNjaGVkdWxlYCBpcyBjYWxsZWQgaW5zaWRlIGBmdW5jYCwgd2UgbmVlZCB0byBhdm9pZFxuICAvLyBvdmVycndyaXRpbmcgd2l0aCB5ZXQgYW5vdGhlciBgc2NoZWR1bGVgLlxuICBpZiAoIXRoaXMuY2xvY2suX2hhc0V2ZW50KHRoaXMpICYmIHRoaXMuaXNSZXBlYXRlZCgpICYmICF0aGlzLl9jbGVhcmVkKVxuICAgIHRoaXMuc2NoZWR1bGUodGhpcy5kZWFkbGluZSArIHRoaXMucmVwZWF0VGltZSkgXG59XG5cbi8vIFVwZGF0ZXMgY2FjaGVkIHRpbWVzXG5FdmVudC5wcm90b3R5cGUuX3JlZnJlc2hFYXJseUxhdGVEYXRlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9sYXRlc3RUaW1lID0gdGhpcy5kZWFkbGluZSArIHRoaXMudG9sZXJhbmNlTGF0ZVxuICB0aGlzLl9lYXJsaWVzdFRpbWUgPSB0aGlzLmRlYWRsaW5lIC0gdGhpcy50b2xlcmFuY2VFYXJseVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PSBXQUFDbG9jayA9PT09PT09PT09PT09PT09PT09PSAvL1xudmFyIFdBQUNsb2NrID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihjb250ZXh0LCBvcHRzKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICBvcHRzID0gb3B0cyB8fCB7fVxuICB0aGlzLnRpY2tNZXRob2QgPSBvcHRzLnRpY2tNZXRob2QgfHwgJ1NjcmlwdFByb2Nlc3Nvck5vZGUnXG4gIHRoaXMudG9sZXJhbmNlRWFybHkgPSBvcHRzLnRvbGVyYW5jZUVhcmx5IHx8IENMT0NLX0RFRkFVTFRTLnRvbGVyYW5jZUVhcmx5XG4gIHRoaXMudG9sZXJhbmNlTGF0ZSA9IG9wdHMudG9sZXJhbmNlTGF0ZSB8fCBDTE9DS19ERUZBVUxUUy50b2xlcmFuY2VMYXRlXG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgdGhpcy5fZXZlbnRzID0gW11cbiAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG59XG5cbi8vIC0tLS0tLS0tLS0gUHVibGljIEFQSSAtLS0tLS0tLS0tIC8vXG4vLyBTY2hlZHVsZXMgYGZ1bmNgIHRvIHJ1biBhZnRlciBgZGVsYXlgIHNlY29uZHMuXG5XQUFDbG9jay5wcm90b3R5cGUuc2V0VGltZW91dCA9IGZ1bmN0aW9uKGZ1bmMsIGRlbGF5KSB7XG4gIHJldHVybiB0aGlzLl9jcmVhdGVFdmVudChmdW5jLCB0aGlzLl9hYnNUaW1lKGRlbGF5KSlcbn1cblxuLy8gU2NoZWR1bGVzIGBmdW5jYCB0byBydW4gYmVmb3JlIGBkZWFkbGluZWAuXG5XQUFDbG9jay5wcm90b3R5cGUuY2FsbGJhY2tBdFRpbWUgPSBmdW5jdGlvbihmdW5jLCBkZWFkbGluZSkge1xuICByZXR1cm4gdGhpcy5fY3JlYXRlRXZlbnQoZnVuYywgZGVhZGxpbmUpXG59XG5cbi8vIFN0cmV0Y2hlcyBgZGVhZGxpbmVgIGFuZCBgcmVwZWF0YCBvZiBhbGwgc2NoZWR1bGVkIGBldmVudHNgIGJ5IGByYXRpb2AsIGtlZXBpbmdcbi8vIHRoZWlyIHJlbGF0aXZlIGRpc3RhbmNlIHRvIGB0UmVmYC4gSW4gZmFjdCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gY2hhbmdpbmcgdGhlIHRlbXBvLlxuV0FBQ2xvY2sucHJvdG90eXBlLnRpbWVTdHJldGNoID0gZnVuY3Rpb24odFJlZiwgZXZlbnRzLCByYXRpbykge1xuICBldmVudHMuZm9yRWFjaChmdW5jdGlvbihldmVudCkgeyBldmVudC50aW1lU3RyZXRjaCh0UmVmLCByYXRpbykgfSlcbiAgcmV0dXJuIGV2ZW50c1xufVxuXG4vLyBSZW1vdmVzIGFsbCBzY2hlZHVsZWQgZXZlbnRzIGFuZCBzdGFydHMgdGhlIGNsb2NrIFxuV0FBQ2xvY2sucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9zdGFydGVkID09PSBmYWxzZSkge1xuICAgIHZhciBzZWxmID0gdGhpc1xuICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlXG4gICAgdGhpcy5fZXZlbnRzID0gW11cblxuICAgIGlmICh0aGlzLnRpY2tNZXRob2QgPT09ICdTY3JpcHRQcm9jZXNzb3JOb2RlJykge1xuICAgICAgdmFyIGJ1ZmZlclNpemUgPSAyNTZcbiAgICAgIC8vIFdlIGhhdmUgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbm9kZSB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cbiAgICAgIHRoaXMuX2Nsb2NrTm9kZSA9IHRoaXMuY29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IoYnVmZmVyU2l6ZSwgMSwgMSlcbiAgICAgIHRoaXMuX2Nsb2NrTm9kZS5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbilcbiAgICAgIHRoaXMuX2Nsb2NrTm9kZS5vbmF1ZGlvcHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpIHsgc2VsZi5fdGljaygpIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnRpY2tNZXRob2QgPT09ICdtYW51YWwnKSBudWxsIC8vIF90aWNrIGlzIGNhbGxlZCBtYW51YWxseVxuXG4gICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGlja01ldGhvZCAnICsgdGhpcy50aWNrTWV0aG9kKVxuICB9XG59XG5cbi8vIFN0b3BzIHRoZSBjbG9ja1xuV0FBQ2xvY2sucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX3N0YXJ0ZWQgPT09IHRydWUpIHtcbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcbiAgICB0aGlzLl9jbG9ja05vZGUuZGlzY29ubmVjdCgpXG4gIH0gIFxufVxuXG4vLyAtLS0tLS0tLS0tIFByaXZhdGUgLS0tLS0tLS0tLSAvL1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHJhbiBwZXJpb2RpY2FsbHksIGFuZCBhdCBlYWNoIHRpY2sgaXQgZXhlY3V0ZXNcbi8vIGV2ZW50cyBmb3Igd2hpY2ggYGN1cnJlbnRUaW1lYCBpcyBpbmNsdWRlZCBpbiB0aGVpciB0b2xlcmFuY2UgaW50ZXJ2YWwuXG5XQUFDbG9jay5wcm90b3R5cGUuX3RpY2sgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGV2ZW50ID0gdGhpcy5fZXZlbnRzLnNoaWZ0KClcblxuICB3aGlsZShldmVudCAmJiBldmVudC5fZWFybGllc3RUaW1lIDw9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSkge1xuICAgIGV2ZW50Ll9leGVjdXRlKClcbiAgICBldmVudCA9IHRoaXMuX2V2ZW50cy5zaGlmdCgpXG4gIH1cblxuICAvLyBQdXQgYmFjayB0aGUgbGFzdCBldmVudFxuICBpZihldmVudCkgdGhpcy5fZXZlbnRzLnVuc2hpZnQoZXZlbnQpXG59XG5cbi8vIENyZWF0ZXMgYW4gZXZlbnQgYW5kIGluc2VydCBpdCB0byB0aGUgbGlzdFxuV0FBQ2xvY2sucHJvdG90eXBlLl9jcmVhdGVFdmVudCA9IGZ1bmN0aW9uKGZ1bmMsIGRlYWRsaW5lKSB7XG4gIHJldHVybiBuZXcgRXZlbnQodGhpcywgZGVhZGxpbmUsIGZ1bmMpXG59XG5cbi8vIEluc2VydHMgYW4gZXZlbnQgdG8gdGhlIGxpc3RcbldBQUNsb2NrLnByb3RvdHlwZS5faW5zZXJ0RXZlbnQgPSBmdW5jdGlvbihldmVudCkge1xuICB0aGlzLl9ldmVudHMuc3BsaWNlKHRoaXMuX2luZGV4QnlUaW1lKGV2ZW50Ll9lYXJsaWVzdFRpbWUpLCAwLCBldmVudClcbn1cblxuLy8gUmVtb3ZlcyBhbiBldmVudCBmcm9tIHRoZSBsaXN0XG5XQUFDbG9jay5wcm90b3R5cGUuX3JlbW92ZUV2ZW50ID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgdmFyIGluZCA9IHRoaXMuX2V2ZW50cy5pbmRleE9mKGV2ZW50KVxuICBpZiAoaW5kICE9PSAtMSkgdGhpcy5fZXZlbnRzLnNwbGljZShpbmQsIDEpXG59XG5cbi8vIFJldHVybnMgdHJ1ZSBpZiBgZXZlbnRgIGlzIGluIHF1ZXVlLCBmYWxzZSBvdGhlcndpc2VcbldBQUNsb2NrLnByb3RvdHlwZS5faGFzRXZlbnQgPSBmdW5jdGlvbihldmVudCkge1xuIHJldHVybiB0aGlzLl9ldmVudHMuaW5kZXhPZihldmVudCkgIT09IC0xXG59XG5cbi8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBldmVudCB3aG9zZSBkZWFkbGluZSBpcyA+PSB0byBgZGVhZGxpbmVgXG5XQUFDbG9jay5wcm90b3R5cGUuX2luZGV4QnlUaW1lID0gZnVuY3Rpb24oZGVhZGxpbmUpIHtcbiAgLy8gcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoXG4gIHZhciBsb3cgPSAwXG4gICAgLCBoaWdoID0gdGhpcy5fZXZlbnRzLmxlbmd0aFxuICAgICwgbWlkXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKVxuICAgIGlmICh0aGlzLl9ldmVudHNbbWlkXS5fZWFybGllc3RUaW1lIDwgZGVhZGxpbmUpXG4gICAgICBsb3cgPSBtaWQgKyAxXG4gICAgZWxzZSBoaWdoID0gbWlkXG4gIH1cbiAgcmV0dXJuIGxvd1xufVxuXG4vLyBDb252ZXJ0cyBmcm9tIHJlbGF0aXZlIHRpbWUgdG8gYWJzb2x1dGUgdGltZVxuV0FBQ2xvY2sucHJvdG90eXBlLl9hYnNUaW1lID0gZnVuY3Rpb24ocmVsVGltZSkge1xuICByZXR1cm4gcmVsVGltZSArIHRoaXMuY29udGV4dC5jdXJyZW50VGltZVxufVxuXG4vLyBDb252ZXJ0cyBmcm9tIGFic29sdXRlIHRpbWUgdG8gcmVsYXRpdmUgdGltZSBcbldBQUNsb2NrLnByb3RvdHlwZS5fcmVsVGltZSA9IGZ1bmN0aW9uKGFic1RpbWUpIHtcbiAgcmV0dXJuIGFic1RpbWUgLSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWVcbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vd2FhY2xvY2svbGliL1dBQUNsb2NrLmpzXG4vLyBtb2R1bGUgaWQgPSA0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gNDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgeyBjbG9jayB9IGZyb20gJy4uL21haW4nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnRlcnZhbCB7XG5cbiAgY29uc3RydWN0b3IocmF0ZSxmdW5jLG9uKSB7XG5cbiAgICB0aGlzLnJhdGUgPSByYXRlO1xuICAgIHRoaXMub24gPSBvbjtcbiAgICB0aGlzLmNsb2NrID0gY2xvY2soKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cbiAgICB0aGlzLnBhdHRlcm4gPSBbMV07XG4gICAgdGhpcy5pbmRleCA9IDA7XG5cbiAgICB0aGlzLmV2ZW50ID0gZnVuYyA/IGZ1bmMgOiBmdW5jdGlvbigpIHsgfTtcblxuICAgIGlmICh0aGlzLm9uKSB7XG4gICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgfVxuXG4gIH1cblxuICBfZXZlbnQoZSkge1xuICAvLyAgaWYgKHRoaXMucGF0dGVyblt0aGlzLmluZGV4JXRoaXMucGF0dGVybi5sZW5ndGhdKSB7XG4gICAgICB0aGlzLmV2ZW50KGUpO1xuICAvLyAgfVxuICAgIHRoaXMuaW5kZXgrKztcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgdGhpcy5vbiA9IGZhbHNlO1xuICAgIHRoaXMuaW50ZXJ2YWwuY2xlYXIoKTtcbiAgfVxuXG4gIHN0YXJ0KCkge1xuICAgIHRoaXMub24gPSB0cnVlO1xuICAgIHRoaXMuaW50ZXJ2YWwgPSB0aGlzLmNsb2NrLmNhbGxiYWNrQXRUaW1lKHRoaXMuX2V2ZW50LmJpbmQodGhpcyksIHRoaXMuY2xvY2suY29udGV4dC5jdXJyZW50VGltZSkucmVwZWF0KHRoaXMucmF0ZS8xMDAwKS50b2xlcmFuY2Uoe2Vhcmx5OiAwLjEsIGxhdGU6MX0pO1xuICB9XG5cbiAgbXMobmV3cmF0ZSkge1xuICAgIGlmICh0aGlzLm9uKSB7XG4gICAgICB2YXIgcmF0aW8gPSBuZXdyYXRlL3RoaXMucmF0ZTtcbiAgICAgIHRoaXMucmF0ZSA9IG5ld3JhdGU7XG4gICAgICB0aGlzLmNsb2NrLnRpbWVTdHJldGNoKHRoaXMuY2xvY2suY29udGV4dC5jdXJyZW50VGltZSwgW3RoaXMuaW50ZXJ2YWxdLCByYXRpbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmF0ZSA9IG5ld3JhdGU7XG4gICAgfVxuICB9XG5cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vanNoaW50LWxvYWRlciEuL2xpYi90aW1lL2ludGVydmFsLmpzIl0sInNvdXJjZVJvb3QiOiIifQ== - -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(97), __esModule: true }; - -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(2).document && document.documentElement; - -/***/ }), -/* 59 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = !__webpack_require__(6) && !__webpack_require__(13)(function(){ - return Object.defineProperty(__webpack_require__(36)('div'), 'a', {get: function(){ return 7; }}).a != 7; -}); - -/***/ }), -/* 60 */ -/***/ (function(module, exports, __webpack_require__) { - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = __webpack_require__(17); -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ - return cof(it) == 'String' ? it.split('') : Object(it); -}; - -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { - -// check on default Array iterator -var Iterators = __webpack_require__(14) - , ITERATOR = __webpack_require__(1)('iterator') - , ArrayProto = Array.prototype; - -module.exports = function(it){ - return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); -}; - -/***/ }), -/* 62 */ -/***/ (function(module, exports, __webpack_require__) { - -// call something on iterator step with safe closing on error -var anObject = __webpack_require__(4); -module.exports = function(iterator, fn, value, entries){ - try { - return entries ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch(e){ - var ret = iterator['return']; - if(ret !== undefined)anObject(ret.call(iterator)); - throw e; - } -}; - -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var LIBRARY = __webpack_require__(25) - , $export = __webpack_require__(7) - , redefine = __webpack_require__(68) - , hide = __webpack_require__(9) - , has = __webpack_require__(8) - , Iterators = __webpack_require__(14) - , $iterCreate = __webpack_require__(110) - , setToStringTag = __webpack_require__(27) - , getPrototypeOf = __webpack_require__(119) - , ITERATOR = __webpack_require__(1)('iterator') - , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` - , FF_ITERATOR = '@@iterator' - , KEYS = 'keys' - , VALUES = 'values'; - -var returnThis = function(){ return this; }; - -module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ - $iterCreate(Constructor, NAME, next); - var getMethod = function(kind){ - if(!BUGGY && kind in proto)return proto[kind]; - switch(kind){ - case KEYS: return function keys(){ return new Constructor(this, kind); }; - case VALUES: return function values(){ return new Constructor(this, kind); }; - } return function entries(){ return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator' - , DEF_VALUES = DEFAULT == VALUES - , VALUES_BUG = false - , proto = Base.prototype - , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] - , $default = $native || getMethod(DEFAULT) - , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined - , $anyNative = NAME == 'Array' ? proto.entries || $native : $native - , methods, key, IteratorPrototype; - // Fix native - if($anyNative){ - IteratorPrototype = getPrototypeOf($anyNative.call(new Base)); - if(IteratorPrototype !== Object.prototype){ - // Set @@toStringTag to native iterators - setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); - } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if(DEF_VALUES && $native && $native.name !== VALUES){ - VALUES_BUG = true; - $default = function values(){ return $native.call(this); }; - } - // Define iterator - if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ - hide(proto, ITERATOR, $default); - } - // Plug for library - Iterators[NAME] = $default; - Iterators[TAG] = returnThis; - if(DEFAULT){ - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if(FORCED)for(key in methods){ - if(!(key in proto))redefine(proto, key, methods[key]); - } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; - -/***/ }), -/* 64 */ -/***/ (function(module, exports, __webpack_require__) { - -var ITERATOR = __webpack_require__(1)('iterator') - , SAFE_CLOSING = false; - -try { - var riter = [7][ITERATOR](); - riter['return'] = function(){ SAFE_CLOSING = true; }; - Array.from(riter, function(){ throw 2; }); -} catch(e){ /* empty */ } - -module.exports = function(exec, skipClosing){ - if(!skipClosing && !SAFE_CLOSING)return false; - var safe = false; - try { - var arr = [7] - , iter = arr[ITERATOR](); - iter.next = function(){ return {done: safe = true}; }; - arr[ITERATOR] = function(){ return iter; }; - exec(arr); - } catch(e){ /* empty */ } - return safe; -}; - -/***/ }), -/* 65 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -var anObject = __webpack_require__(4) - , dPs = __webpack_require__(116) - , enumBugKeys = __webpack_require__(37) - , IE_PROTO = __webpack_require__(39)('IE_PROTO') - , Empty = function(){ /* empty */ } - , PROTOTYPE = 'prototype'; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function(){ - // Thrash, waste and sodomy: IE GC bug - var iframe = __webpack_require__(36)('iframe') - , i = enumBugKeys.length - , lt = '<' - , gt = '>' - , iframeDocument; - iframe.style.display = 'none'; - __webpack_require__(58).appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]]; - return createDict(); -}; - -module.exports = Object.create || function create(O, Properties){ - var result; - if(O !== null){ - Empty[PROTOTYPE] = anObject(O); - result = new Empty; - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : dPs(result, Properties); -}; - - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) -var $keys = __webpack_require__(67) - , hiddenKeys = __webpack_require__(37).concat('length', 'prototype'); - -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O){ - return $keys(O, hiddenKeys); -}; - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(8) - , toIObject = __webpack_require__(10) - , arrayIndexOf = __webpack_require__(104)(false) - , IE_PROTO = __webpack_require__(39)('IE_PROTO'); - -module.exports = function(object, names){ - var O = toIObject(object) - , i = 0 - , result = [] - , key; - for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while(names.length > i)if(has(O, key = names[i++])){ - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(9); - -/***/ }), -/* 69 */ -/***/ (function(module, exports, __webpack_require__) { - -var ctx = __webpack_require__(18) - , invoke = __webpack_require__(108) - , html = __webpack_require__(58) - , cel = __webpack_require__(36) - , global = __webpack_require__(2) - , process = global.process - , setTask = global.setImmediate - , clearTask = global.clearImmediate - , MessageChannel = global.MessageChannel - , counter = 0 - , queue = {} - , ONREADYSTATECHANGE = 'onreadystatechange' - , defer, channel, port; -var run = function(){ - var id = +this; - if(queue.hasOwnProperty(id)){ - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; -var listener = function(event){ - run.call(event.data); -}; -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if(!setTask || !clearTask){ - setTask = function setImmediate(fn){ - var args = [], i = 1; - while(arguments.length > i)args.push(arguments[i++]); - queue[++counter] = function(){ - invoke(typeof fn == 'function' ? fn : Function(fn), args); - }; - defer(counter); - return counter; - }; - clearTask = function clearImmediate(id){ - delete queue[id]; - }; - // Node.js 0.8- - if(__webpack_require__(17)(process) == 'process'){ - defer = function(id){ - process.nextTick(ctx(run, id, 1)); - }; - // Browsers with MessageChannel, includes WebWorkers - } else if(MessageChannel){ - channel = new MessageChannel; - port = channel.port2; - channel.port1.onmessage = listener; - defer = ctx(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ - defer = function(id){ - global.postMessage(id + '', '*'); - }; - global.addEventListener('message', listener, false); - // IE8- - } else if(ONREADYSTATECHANGE in cel('script')){ - defer = function(id){ - html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ - html.removeChild(this); - run.call(id); - }; - }; - // Rest old browsers - } else { - defer = function(id){ - setTimeout(ctx(run, id, 1), 0); - }; - } -} -module.exports = { - set: setTask, - clear: clearTask -}; - -/***/ }), -/* 70 */ -/***/ (function(module, exports) { - - - -/***/ }), -/* 71 */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; - - -/***/ }), -/* 72 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(process) { - -module.exports = Readable; - -/*<replacement>*/ -var processNextTick = __webpack_require__(49); -/*</replacement>*/ - -/*<replacement>*/ -var isArray = __webpack_require__(71); -/*</replacement>*/ - -/*<replacement>*/ -var Duplex; -/*</replacement>*/ - -Readable.ReadableState = ReadableState; - -/*<replacement>*/ -var EE = __webpack_require__(47).EventEmitter; - -var EElistenerCount = function (emitter, type) { - return emitter.listeners(type).length; -}; -/*</replacement>*/ - -/*<replacement>*/ -var Stream = __webpack_require__(74); -/*</replacement>*/ - -var Buffer = __webpack_require__(3).Buffer; -/*<replacement>*/ -var bufferShim = __webpack_require__(32); -/*</replacement>*/ - -/*<replacement>*/ -var util = __webpack_require__(22); -util.inherits = __webpack_require__(16); -/*</replacement>*/ - -/*<replacement>*/ -var debugUtil = __webpack_require__(158); -var debug = void 0; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function () {}; -} -/*</replacement>*/ - -var BufferList = __webpack_require__(144); -var StringDecoder; - -util.inherits(Readable, Stream); - -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') { - return emitter.prependListener(event, fn); - } else { - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; - } -} - -function ReadableState(options, stream) { - Duplex = Duplex || __webpack_require__(12); - - options = options || {}; - - // object stream flag. Used to make read(n) ignore n and to - // make all the buffer merging and length checks go away - this.objectMode = !!options.objectMode; - - if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - - // the point at which it stops calling _read() to fill the buffer - // Note: 0 is a valid value, means "don't call _read preemptively ever" - var hwm = options.highWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - - // cast to ints. - this.highWaterMark = ~~this.highWaterMark; - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the onwrite cb is called immediately, - // or on a later tick. We set this to true at first, because any - // actions that shouldn't happen until "later" should generally also - // not happen before the first write call. - this.sync = true; - - // whenever we return null, then we set a flag to say - // that we're awaiting a 'readable' event emission. - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.resumeScheduled = false; - - // Crypto is kind of old and crusty. Historically, its default string - // encoding is 'binary' so we have to make this configurable. - // Everything else in the universe uses 'utf8', though. - this.defaultEncoding = options.defaultEncoding || 'utf8'; - - // when piping, we only care about 'readable' events that happen - // after read()ing all the bytes and not getting any pushback. - this.ranOut = false; - - // the number of writers that are awaiting a drain event in .pipe()s - this.awaitDrain = 0; - - // if true, a maybeReadMore has been scheduled - this.readingMore = false; - - this.decoder = null; - this.encoding = null; - if (options.encoding) { - if (!StringDecoder) StringDecoder = __webpack_require__(48).StringDecoder; - this.decoder = new StringDecoder(options.encoding); - this.encoding = options.encoding; - } -} - -function Readable(options) { - Duplex = Duplex || __webpack_require__(12); - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options && typeof options.read === 'function') this._read = options.read; - - Stream.call(this); -} - -// Manually shove something into the read() buffer. -// This returns true if the highWaterMark has not been hit yet, -// similar to how Writable.write() returns true if you should -// write() some more. -Readable.prototype.push = function (chunk, encoding) { - var state = this._readableState; - - if (!state.objectMode && typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = bufferShim.from(chunk, encoding); - encoding = ''; - } - } - - return readableAddChunk(this, state, chunk, encoding, false); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - var state = this._readableState; - return readableAddChunk(this, state, chunk, '', true); -}; - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; - -function readableAddChunk(stream, state, chunk, encoding, addToFront) { - var er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (state.ended && !addToFront) { - var e = new Error('stream.push() after EOF'); - stream.emit('error', e); - } else if (state.endEmitted && addToFront) { - var _e = new Error('stream.unshift() after end event'); - stream.emit('error', _e); - } else { - var skipAdd; - if (state.decoder && !addToFront && !encoding) { - chunk = state.decoder.write(chunk); - skipAdd = !state.objectMode && chunk.length === 0; - } - - if (!addToFront) state.reading = false; - - // Don't add to the buffer if we've decoded to an empty string chunk and - // we're not in object mode - if (!skipAdd) { - // if we want the data now, just emit it. - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - - if (state.needReadable) emitReadable(stream); - } - } - - maybeReadMore(stream, state); - } - } else if (!addToFront) { - state.reading = false; - } - - return needMoreData(state); -} - -// if it's past the high water mark, we can push in some more. -// Also, if we have no data yet, we can stand some -// more bytes. This is to work around cases where hwm=0, -// such as the repl. Also, if the push() triggered a -// readable event, and the user called read(largeNumber) such that -// needReadable was set, then we ought to push more, so that another -// 'readable' event will be triggered. -function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); -} - -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = __webpack_require__(48).StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; - -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} - -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (n !== 0) state.emittedReadable = false; - - // if we're doing read(0) to trigger a readable event, but we - // already have a bunch of data in the buffer, then just trigger - // the 'readable' event and move on. - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); - return null; - } - - n = howMuchToRead(n, state); - - // if we've ended, and we're now clear, then finish it up. - if (n === 0 && state.ended) { - if (state.length === 0) endReadable(this); - return null; - } - - // All the actual chunk generation logic needs to be - // *below* the call to _read. The reason is that in certain - // synthetic stream cases, such as passthrough streams, _read - // may be a completely synchronous operation which may change - // the state of the read buffer, providing enough data when - // before there was *not* enough. - // - // So, the steps are: - // 1. Figure out what the state of things will be after we do - // a read from the buffer. - // - // 2. If that resulting state will trigger a _read, then call _read. - // Note that this may be asynchronous, or synchronous. Yes, it is - // deeply ugly to write APIs this way, but that still doesn't mean - // that the Readable class should behave improperly, as streams are - // designed to be sync/async agnostic. - // Take note if the _read call is sync or async (ie, if the read call - // has returned yet), so that we know whether or not it's safe to emit - // 'readable' etc. - // - // 3. Actually pull the requested chunks out of the buffer and return. - - // if we need a readable event, then we need to do some reading. - var doRead = state.needReadable; - debug('need readable', doRead); - - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } - - // however, if we've ended, then there's no point, and if we're already - // reading, then it's unnecessary. - if (state.ended || state.reading) { - doRead = false; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - state.reading = true; - state.sync = true; - // if the length is currently zero, then we *need* a readable event. - if (state.length === 0) state.needReadable = true; - // call internal read method - this._read(state.highWaterMark); - state.sync = false; - // If _read pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) n = howMuchToRead(nOrig, state); - } - - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; - - if (ret === null) { - state.needReadable = true; - n = 0; - } else { - state.length -= n; - } - - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; - - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) endReadable(this); - } - - if (ret !== null) this.emit('data', ret); - - return ret; -}; - -function chunkInvalid(state, chunk) { - var er = null; - if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - - // emit 'readable' now to make sure it gets picked up. - emitReadable(stream); -} - -// Don't emit readable right away in sync mode, because this can trigger -// another read() call => stack overflow. This way, it might trigger -// a nextTick recursion warning, but that's not so bad. -function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); - } -} - -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} - -// at this point, the user has presumably seen the 'readable' event, -// and called read() to consume some data. that may have triggered -// in turn another _read(n) call, in which case reading = true if -// it's in progress. -// However, if we're not ended, or reading, and the length < hwm, -// then go ahead and try to read some more preemptively. -function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - processNextTick(maybeReadMore_, stream, state); - } -} - -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - stream.read(0); - if (len === state.length) - // didn't get any data, stop spinning. - break;else len = state.length; - } - state.readingMore = false; -} - -// abstract method. to be overridden in specific implementation classes. -// call cb(er, data) where data is <= n in length. -// for virtual (non-string, non-buffer) streams, "length" is somewhat -// arbitrary, and perhaps not very meaningful. -Readable.prototype._read = function (n) { - this.emit('error', new Error('_read() is not implemented')); -}; - -Readable.prototype.pipe = function (dest, pipeOpts) { - var src = this; - var state = this._readableState; - - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - - var endFn = doEnd ? onend : cleanup; - if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable) { - debug('onunpipe'); - if (readable === src) { - cleanup(); - } - } - - function onend() { - debug('onend'); - dest.end(); - } - - // when the dest drains, it reduces the awaitDrain counter - // on the source. This would be more elegant with a .once() - // handler in flow(), but adding and removing repeatedly is - // too slow. - var ondrain = pipeOnDrain(src); - dest.on('drain', ondrain); - - var cleanedUp = false; - function cleanup() { - debug('cleanup'); - // cleanup event handlers once the pipe is broken - dest.removeListener('close', onclose); - dest.removeListener('finish', onfinish); - dest.removeListener('drain', ondrain); - dest.removeListener('error', onerror); - dest.removeListener('unpipe', onunpipe); - src.removeListener('end', onend); - src.removeListener('end', cleanup); - src.removeListener('data', ondata); - - cleanedUp = true; - - // if the reader is waiting for a drain event from this - // specific writer, then it would cause it to never start - // flowing again. - // So, if this is awaiting a drain, then we just call it now. - // If we don't know, then assume that we are waiting for one. - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } - - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; - } - src.pause(); - } - } - - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } - - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - - function unpipe() { - debug('unpipe'); - src.unpipe(dest); - } - - // tell the dest that it's being piped to - dest.emit('pipe', src); - - // start the flow if it hasn't been started already. - if (!state.flowing) { - debug('pipe resume'); - src.resume(); - } - - return dest; -}; - -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { - state.flowing = true; - flow(src); - } - }; -} - -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; - - // if we're not piping anywhere, then do nothing. - if (state.pipesCount === 0) return this; - - // just one destination. most common case. - if (state.pipesCount === 1) { - // passed in one, but it's not the right one. - if (dest && dest !== state.pipes) return this; - - if (!dest) dest = state.pipes; - - // got a match. - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) dest.emit('unpipe', this); - return this; - } - - // slow case. multiple pipe destinations. - - if (!dest) { - // remove all. - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this); - }return this; - } - - // try to find the right one. - var index = indexOf(state.pipes, dest); - if (index === -1) return this; - - state.pipes.splice(index, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - - dest.emit('unpipe', this); - - return this; -}; - -// set up data events if they are asked for -// Ensure readable listeners eventually get something -Readable.prototype.on = function (ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); - - if (ev === 'data') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - processNextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this, state); - } - } - } - - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; - -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} - -// pause() and resume() are remnants of the legacy readable stream API -// If the user uses them, then switch into old mode. -Readable.prototype.resume = function () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); - } - return this; -}; - -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - processNextTick(resume_, stream, state); - } -} - -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - - state.resumeScheduled = false; - state.awaitDrain = 0; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} - -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; - -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} - -// wrap an old-style stream as the async data source. -// This is *not* part of the readable stream interface. -// It is an ugly unfortunate mess of history. -Readable.prototype.wrap = function (stream) { - var state = this._readableState; - var paused = false; - - var self = this; - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) self.push(chunk); - } - - self.push(null); - }); - - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); - - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - - var ret = self.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); - - // proxy all the other methods. - // important when wrapping filters and duplexes. - for (var i in stream) { - if (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } - - // proxy certain important events. - for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], self.emit.bind(self, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - self._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - - return self; -}; - -// exposed for testing purposes only. -Readable._fromList = fromList; - -// Pluck off n bytes from an array of buffers. -// Length is the combined lengths of all the buffers in the list. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = bufferShim.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -function endReadable(stream) { - var state = stream._readableState; - - // If we get here before consuming all the bytes, then that is a - // bug in node. Should never happen. - if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); - - if (!state.endEmitted) { - state.ended = true; - processNextTick(endReadableNT, state, stream); - } -} - -function endReadableNT(state, stream) { - // Check that we didn't get one last unshift. - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit('end'); - } -} - -function forEach(xs, f) { - for (var i = 0, l = xs.length; i < l; i++) { - f(xs[i], i); - } -} - -function indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(11))) - -/***/ }), -/* 73 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// a transform stream is a readable/writable stream where you do -// something with the data. Sometimes it's called a "filter", -// but that's not a great name for it, since that implies a thing where -// some bits pass through, and others are simply ignored. (That would -// be a valid example of a transform, of course.) -// -// While the output is causally related to the input, it's not a -// necessarily symmetric or synchronous transformation. For example, -// a zlib stream might take multiple plain-text writes(), and then -// emit a single compressed chunk some time in the future. -// -// Here's how this works: -// -// The Transform stream has all the aspects of the readable and writable -// stream classes. When you write(chunk), that calls _write(chunk,cb) -// internally, and returns false if there's a lot of pending writes -// buffered up. When you call read(), that calls _read(n) until -// there's enough pending readable data buffered up. -// -// In a transform stream, the written data is placed in a buffer. When -// _read(n) is called, it transforms the queued up data, calling the -// buffered _write cb's as it consumes chunks. If consuming a single -// written chunk would result in multiple output chunks, then the first -// outputted bit calls the readcb, and subsequent chunks just go into -// the read buffer, and will cause it to emit 'readable' if necessary. -// -// This way, back-pressure is actually determined by the reading side, -// since _read has to be called to start processing a new chunk. However, -// a pathological inflate type of transform can cause excessive buffering -// here. For example, imagine a stream where every byte of input is -// interpreted as an integer from 0-255, and then results in that many -// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in -// 1kb of data being output. In this case, you could write a very small -// amount of input, and end up with a very large amount of output. In -// such a pathological inflating mechanism, there'd be no way to tell -// the system to stop doing the transform. A single 4MB write could -// cause the system to run out of memory. -// -// However, even in such a pathological case, only a single written chunk -// would be consumed, and then the rest would wait (un-transformed) until -// the results of the previous transformed chunk were consumed. - - - -module.exports = Transform; - -var Duplex = __webpack_require__(12); - -/*<replacement>*/ -var util = __webpack_require__(22); -util.inherits = __webpack_require__(16); -/*</replacement>*/ - -util.inherits(Transform, Duplex); - -function TransformState(stream) { - this.afterTransform = function (er, data) { - return afterTransform(stream, er, data); - }; - - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; - this.writeencoding = null; -} - -function afterTransform(stream, er, data) { - var ts = stream._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); - - ts.writechunk = null; - ts.writecb = null; - - if (data !== null && data !== undefined) stream.push(data); - - cb(er); - - var rs = stream._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - stream._read(rs.highWaterMark); - } -} - -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = new TransformState(this); - - var stream = this; - - // start out asking for a readable event once data is transformed. - this._readableState.needReadable = true; - - // we have implemented the _read method, and done the other things - // that Readable wants before the first _read call, so unset the - // sync guard flag. - this._readableState.sync = false; - - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - - if (typeof options.flush === 'function') this._flush = options.flush; - } - - // When the writable side finishes, then flush out anything remaining. - this.once('prefinish', function () { - if (typeof this._flush === 'function') this._flush(function (er, data) { - done(stream, er, data); - });else done(stream); - }); -} - -Transform.prototype.push = function (chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); -}; - -// This is the part where you do stuff! -// override this function in implementation classes. -// 'chunk' is an input chunk. -// -// Call `push(newChunk)` to pass along transformed output -// to the readable side. You may call 'push' zero or more times. -// -// Call `cb(err)` when you are done with this chunk. If you pass -// an error, then that'll put the hurt on the whole operation. If you -// never call cb(), then you'll never get another chunk. -Transform.prototype._transform = function (chunk, encoding, cb) { - throw new Error('_transform() is not implemented'); -}; - -Transform.prototype._write = function (chunk, encoding, cb) { - var ts = this._transformState; - ts.writecb = cb; - ts.writechunk = chunk; - ts.writeencoding = encoding; - if (!ts.transforming) { - var rs = this._readableState; - if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); - } -}; - -// Doesn't matter what the args are here. -// _transform does all the work. -// That we got here means that the readable side wants more data. -Transform.prototype._read = function (n) { - var ts = this._transformState; - - if (ts.writechunk !== null && ts.writecb && !ts.transforming) { - ts.transforming = true; - this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); - } else { - // mark that we need a transform, so that any data that comes in - // will get processed, now that we've asked for it. - ts.needTransform = true; - } -}; - -function done(stream, er, data) { - if (er) return stream.emit('error', er); - - if (data !== null && data !== undefined) stream.push(data); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - var ws = stream._writableState; - var ts = stream._transformState; - - if (ws.length) throw new Error('Calling transform done when ws.length != 0'); - - if (ts.transforming) throw new Error('Calling transform done when still transforming'); - - return stream.push(null); -} - -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(47).EventEmitter; - - -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { - -var apply = Function.prototype.apply; - -// DOM APIs, for completeness - -exports.setTimeout = function() { - return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); -}; -exports.setInterval = function() { - return new Timeout(apply.call(setInterval, window, arguments), clearInterval); -}; -exports.clearTimeout = -exports.clearInterval = function(timeout) { - if (timeout) { - timeout.close(); - } -}; - -function Timeout(id, clearFn) { - this._id = id; - this._clearFn = clearFn; -} -Timeout.prototype.unref = Timeout.prototype.ref = function() {}; -Timeout.prototype.close = function() { - this._clearFn.call(window, this._id); -}; - -// Does not start the time, just sets up the members needed. -exports.enroll = function(item, msecs) { - clearTimeout(item._idleTimeoutId); - item._idleTimeout = msecs; -}; - -exports.unenroll = function(item) { - clearTimeout(item._idleTimeoutId); - item._idleTimeout = -1; -}; - -exports._unrefActive = exports.active = function(item) { - clearTimeout(item._idleTimeoutId); - - var msecs = item._idleTimeout; - if (msecs >= 0) { - item._idleTimeoutId = setTimeout(function onTimeout() { - if (item._onTimeout) - item._onTimeout(); - }, msecs); - } -}; - -// setimmediate attaches itself to the global object -__webpack_require__(148); -exports.setImmediate = setImmediate; -exports.clearImmediate = clearImmediate; - - -/***/ }), -/* 76 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.load = undefined; - -var _promise = __webpack_require__(88); - -var _promise2 = _interopRequireDefault(_promise); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var files = [ -// "gun_violence", -"mass_shootings_from_columbine", "gun_violence_by_month"]; -var parse = __webpack_require__(137); - -var dataPromises = files.map(function (name) { - return fetch('./data/' + name + '.csv').then(function (rows) { - return rows.text(); - }).then(function (text) { - return new _promise2.default(function (resolve, reject) { - parse(text, {}, function (_, lines) { - return resolve(lines); - }); - }); - }).then(function (lines) { - // console.log(name, lines) - var h = lines.shift(); - return { - name: name, - h: h, - lines: lines.filter(function (s) { - return !!s; - }) - }; - }); -}); -var allPromises = _promise2.default.all(dataPromises).then(function (data) { - return data.reduce(function (a, b) { - // console.log(b) - a[b.name] = b; - return a; - }, {}); -}); -var load = function load() { - return allPromises; -}; - -exports.load = load; - -/***/ }), -/* 77 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var keys = {}; -var key_numbers = {}; -var letters = "zxcvbnmasdfghjklqwertyuiop"; -var numbers = "1234567890"; - -var callback = function callback() {}; - -letters.toUpperCase().split("").map(function (k, i) { - keys[k.charCodeAt(0)] = i; -}); - -numbers.split("").map(function (k, i) { - keys[k.charCodeAt(0)] = i + letters.length; - key_numbers[k.charCodeAt(0)] = true; -}); - -window.addEventListener("keydown", keydown, true); -function keydown(e) { - if (e.altKey || e.ctrlKey || e.metaKey) { - e.stopPropagation(); - return; - } - if (document.activeElement instanceof HTMLInputElement && e.keyCode in key_numbers) { - e.stopPropagation(); - return; - } - if (!(e.keyCode in keys)) return; - var index = keys[e.keyCode]; - if (e.shiftKey) index += letters.length; - index -= 7; - callback(index); -} - -function listen(fn) { - callback = fn; -} - -exports.default = { listen: listen }; - -/***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.note_values = exports.MidiWriter = undefined; - -var _slicedToArray2 = __webpack_require__(55); - -var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); - -exports.midi_init = midi_init; -exports.play_note = play_note; -exports.play_midi_note = play_midi_note; -exports.play_sequence = play_sequence; -exports.play_interval_sequence = play_interval_sequence; -exports.export_pattern_as_midi = export_pattern_as_midi; - -var _tone = __webpack_require__(24); - -var _tone2 = _interopRequireDefault(_tone); - -var _webmidi = __webpack_require__(155); - -var _webmidi2 = _interopRequireDefault(_webmidi); - -var _scales = __webpack_require__(53); - -var _scales2 = _interopRequireDefault(_scales); - -var _util = __webpack_require__(31); - -var _kalimba = __webpack_require__(52); - -var _kalimba2 = _interopRequireDefault(_kalimba); - -var _FileSaver = __webpack_require__(138); - -var _ui = __webpack_require__(54); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var midiDevice = void 0; -var sendPitchBend = false; - -var MidiWriter = exports.MidiWriter = __webpack_require__(140); - -var note_values = exports.note_values = [[8, '8 measures', 8 * 512], [4, '4 measures', 4 * 512], [2, '2 measures', 2 * 512], [1, 'whole note', 512], [1 / 2, 'half note', 256], [1 / 3, 'third note', [170, 170, 171]], [1 / 4, 'quarter note', 128], [1 / 5, 'fifth note', [51, 51, 51, 51, 52]], [1 / 6, 'sixth note', [85, 85, 86, 85, 85, 86]], [1 / 8, 'eighth note', 64], [1 / 10, 'tenth note', [25, 26, 26, 25, 26, 25, 26, 26, 25, 26]], [1 / 12, 'twelfth note', [21, 21, 22, 21, 21, 22, 21, 21, 22, 21, 21, 22]], [1 / 16, 'sixteenth note', 32], [1 / 32, 'thirtysecond note', 16]]; - -function midi_init() { - _webmidi2.default.enable(midi_ready); - function midi_ready(err) { - if (err) { - console.error('webmidi failed to initialize'); - return; - } - if (!_webmidi2.default.outputs.length) { - console.error('no MIDI output found'); - return; - } - console.log(_webmidi2.default.inputs); - console.log(_webmidi2.default.outputs); - if (_webmidi2.default.outputs.length > 1) { - var filtered = _webmidi2.default.outputs.filter(function (output) { - return output.name.match(/prodipe/i); - }); - if (filtered.length) { - // midiDevice = filtered[0] - } - } - // midiDevice = midiDevice || WebMidi.outputs[0] - // console.log(midiDevice.name) - } -} - -/* play a single note */ - -function play_note(index, duration) { - var channel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "all"; - var exporting = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; - var rest = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; - var defer = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; - - // console.log(index) - var scale = _scales2.default.current(); - var freq = scale.index(index + Math.round(_ui.nx.offset.value), _ui.nx.octave.value); - var midi_note = (0, _util.ftom)(freq); - var cents = midi_note % 1; - if (cents > 0.5) { - midi_note += 1; - cents -= 1; - } - cents *= 2; - midi_note = Math.floor(midi_note); - if ((midiDevice || exporting) && midi_note > 127) return 0; - var note = _tone2.default.Frequency(Math.floor(midi_note), "midi").toNote(); - var defer_time = 30000 / _tone2.default.Transport.bpm.value * defer / 128; - console.log(defer, defer_time); - if (exporting) { - return note; - } - if (midiDevice) { - duration = duration || 60000 / _tone2.default.Transport.bpm.value; - if (!exporting) { - if (defer) { - setTimeout(function () { - play_midi_note(note, cents, channel, duration); - }, defer); - } else { - play_midi_note(note, cents, channel, duration); - } - } - } else if (defer) { - setTimeout(function () { - _kalimba2.default.play(freq); - }, defer_time); - } else { - _kalimba2.default.play(freq); - } - return note; -} - -function play_midi_note(note, cents, channel, duration) { - midiDevice.playNote(note, channel, { duration: duration }); - if (sendPitchBend) { - midiDevice.sendPitchBend(cents, channel); - } -} - -/* play the next note in sequence */ - -function play_sequence(i, bounds, diff, note_time) { - var channel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "all"; - var exporting = arguments[5]; - var rows = bounds.rows, - min = bounds.min, - max = bounds.max; - - var count = rows.length * rows[0].length; - if (i >= count) i = 0; - var y = Math.floor(i / rows[0].length); - var x = i % rows[0].length; - // if (!x) console.log(y) - var n = rows[y][x]; - i += 1; - if (i >= count) i = 0; - var midi_note = play_note((0, _util.norm)(n, min, max) * _ui.nx.multiply.value, note_time, channel, exporting); - return [i, [midi_note]]; -} - -/* play the next row as an interval */ - -function play_interval_sequence(i, bounds, diff, note_time) { - var channel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "all"; - var exporting = arguments[5]; - var rows = bounds.rows, - min = bounds.min, - max = bounds.max; - - var count = rows.length; - if (i >= count) i = 0; - var y = i % count; - var row = rows[y]; - if (!row) { - i = 0;return; - } - var row_min = Math.min.apply(Math, row); - // const row_max = Math.max.apply(Math, row) - var row_f0 = (0, _util.norm)(row_min, min, max); - var row_root = row_f0 * _ui.nx.multiply.value; - var notes = row.map(function (n) { - var note = row_root + (0, _util.norm)(n - row_min, diff.min, diff.max) * _ui.nx.interval.value; - play_note(note, note_time, channel, exporting); - }); - i += 1; - return [i, notes]; -} - -/* generate a 1-track midi file by calling the play function repeatedly */ - -function export_pattern_as_midi(datasetName, bounds, diff, tempo, timingIndex, play_fn) { - // const behavior = document.querySelector('#behavior').value - var rows = bounds.rows; - // let count = behavior === 'sequence' ? rows[0].length * rows.length : rows.length - - var count = rows[0].length; - var notes = void 0, - timings = void 0, - wait = void 0; - var note_time = void 0; - // let timing = note_values[timingIndex][2] - var midi_track = new MidiWriter.Track(); - midi_track.setTempo(tempo); - for (var i = 0, len = count; i < len; i++) { - // if (timing.length) { - // note_time = timing[i % timing.length] - // } else { - // note_time = timing - // } - // midi_track.addEvent(new MidiWriter.NoteEvent({ pitch: notes, duration: 't' + note_time })) - var _play_fn = play_fn(i, bounds, note_time, "all", true); - - var _play_fn2 = (0, _slicedToArray3.default)(_play_fn, 4); - - i = _play_fn2[0]; - notes = _play_fn2[1]; - timings = _play_fn2[2]; - wait = _play_fn2[3]; - console.log(i, notes, timings, wait); - for (var j = 0; j < notes.length; j++) { - midi_track.addEvent(new MidiWriter.NoteEvent({ - pitch: notes[j], - duration: 't' + timings[j], - wait: j === 0 ? wait : 0 - })); - } - } - var writer = new MidiWriter.Writer([midi_track]); - var blob = (0, _util.dataURItoBlob)(writer.dataUri()); - (0, _FileSaver.saveAs)(blob, 'Recording - ' + datasetName + '.mid'); -} - -/***/ }), -/* 79 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _from = __webpack_require__(83); - -var _from2 = _interopRequireDefault(_from); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function (arr) { - return Array.isArray(arr) ? arr : (0, _from2.default)(arr); -}; - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _slicedToArray2 = __webpack_require__(55); - -var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); - -var _toArray2 = __webpack_require__(79); - -var _toArray3 = _interopRequireDefault(_toArray2); - -var _tone = __webpack_require__(24); - -var _tone2 = _interopRequireDefault(_tone); - -var _nexusui = __webpack_require__(56); - -var _nexusui2 = _interopRequireDefault(_nexusui); - -var _keys = __webpack_require__(77); - -var _keys2 = _interopRequireDefault(_keys); - -var _scales = __webpack_require__(53); - -var _scales2 = _interopRequireDefault(_scales); - -var _kalimba = __webpack_require__(52); - -var _kalimba2 = _interopRequireDefault(_kalimba); - -var _midi = __webpack_require__(78); - -var _util = __webpack_require__(31); - -var _ui = __webpack_require__(54); - -var _data = __webpack_require__(76); - -var data = _interopRequireWildcard(_data); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var DEFAULT_BPM = 60; - -var recorder = null; -var recording = false; - -(0, _midi.midi_init)(); - -/* initialization */ - -var mass_fields = ["date", "timestamp", "fatalities", "injured", "total_victims", "age", "case", "weapon_type", "weapon_details"].reduce(function (a, b, i) { - a[b] = i; - return a; -}, {}); - -var i = 0, - mass_i = 0, - datasets = {}, - dataset = {}, - bounds = {}, - diff = []; -var play_fn = _midi.play_sequence; -data.load().then(function (lists) { - console.log(lists); - (0, _util.transpose)(lists.gun_violence_by_month.lines).forEach(function (row, i) { - var name = lists.gun_violence_by_month.h[i]; - if (name === 'Date') return; - console.log(name, row); - datasets[name] = { - name: name, - h: [name], - lines: [row.map(function (n) { - return parseInt(n); - })], - play_fn: _midi.play_sequence - }; - }); - datasets["Mass Shootings"] = lists.mass_shootings_from_columbine; - datasets["Mass Shootings"].name = "Mass Shootings"; - datasets["Mass Shootings"].play_fn = play_mass_shootings; - var lines = datasets["Mass Shootings"].lines.reverse(); - - var _lines$0$mass_fields$ = lines[0][mass_fields.date].split('/'), - _lines$0$mass_fields$2 = (0, _toArray3.default)(_lines$0$mass_fields$), - min_y = _lines$0$mass_fields$2[0], - rest = _lines$0$mass_fields$2.slice(1); - - datasets["Mass Shootings"].dates = lines.map(function (row) { - var _row$mass_fields$date = row[mass_fields.date].split('/'), - _row$mass_fields$date2 = (0, _slicedToArray3.default)(_row$mass_fields$date, 3), - y = _row$mass_fields$date2[0], - m = _row$mass_fields$date2[1], - d = _row$mass_fields$date2[2]; - - return (parseInt(y) - parseInt(min_y)) * 12 + parseInt(m); - }); - datasets["Mass Shootings"].data = lines; - datasets["Mass Shootings"].lines = [lines.map(function (row) { - return row[mass_fields.total_victims]; - })]; - (0, _util.requestAudioContext)(ready); -}); - -/* play function for mass shooting data w/ custom timing */ - -var mass_rest = 0; - -// export const note_values = [ -// [8, '8 measures', 8 * 512], -// [4, '4 measures', 4 * 512], -// [2, '2 measures', 2 * 512], -// [1, 'whole note', 512], -// [1/2, 'half note', 256], -// [1/3, 'third note', [170, 170, 171]], -// [1/4, 'quarter note', 128], -// [1/5, 'fifth note', [51,51,51,51,52]], -// [1/6, 'sixth note', [85, 85, 86, 85, 85, 86]], -// [1/8, 'eighth note', 64], -// [1/10, 'tenth note', [25,26,26,25,26,25,26,26,25,26]], -// [1/12, 'twelfth note', [21,21,22, 21,21,22, 21,21,22, 21,21,22]], -// [1/16, 'sixteenth note', 32], -// [1/32, 'thirtysecond note', 16], -// ] - -function play_mass_shootings(i, bounds, diff, note_time) { - var channel = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : "all"; - var exporting = arguments[5]; - var rows = bounds.rows, - min = bounds.min, - max = bounds.max; - - var y = 0; - var x = i % rows[0].length; - var n = rows[y][x]; - var total = dataset.dates.length; - var notes = [], - midi_notes = [], - cases = [], - timings = void 0; - console.log(i, mass_i, dataset.dates[mass_i]); - while (i >= dataset.dates[mass_i] && mass_i < total) { - notes.push(dataset.lines[0][mass_i]); - cases.push(dataset.data[mass_i][mass_fields.date] + ' ' + dataset.data[mass_i][mass_fields.case] + ", " + dataset.data[mass_i][mass_fields.fatalities] + ' dead, ' + dataset.data[mass_i][mass_fields.injured] + ' injured'); - console.log('push case', dataset.data[mass_i][mass_fields.date] + ' ' + dataset.data[mass_i][mass_fields.case]); - mass_i += 1; - } - switch (notes.length) { - default: - case 0: - mass_rest += 1; - break; - case 1: - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[0], min, max) * _ui.nx.multiply.value, 128, channel, exporting, mass_rest, 0)); - timings = [128]; - break; - case 2: - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[0], min, max) * _ui.nx.multiply.value, 64, channel, exporting, mass_rest, 0)); - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[1], min, max) * _ui.nx.multiply.value, 64, channel, exporting, 0, 64)); - timings = [64, 64]; - break; - case 3: - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[0], min, max) * _ui.nx.multiply.value, 43, channel, exporting, mass_rest, 0)); - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[1], min, max) * _ui.nx.multiply.value, 43, channel, exporting, 0, 43)); - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[2], min, max) * _ui.nx.multiply.value, 42, channel, exporting, 0, 85)); - timings = [43, 43, 42]; - break; - case 4: - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[0], min, max) * _ui.nx.multiply.value, 32, channel, exporting, mass_rest, 0)); - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[1], min, max) * _ui.nx.multiply.value, 32, channel, exporting, 0, 32)); - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[2], min, max) * _ui.nx.multiply.value, 32, channel, exporting, 0, 64)); - midi_notes.push((0, _midi.play_note)((0, _util.norm)(notes[3], min, max) * _ui.nx.multiply.value, 32, channel, exporting, 0, 96)); - timings = [32, 32, 32, 32]; - break; - } - if (cases.length) { - document.querySelector('#cases').innerHTML = cases.join('<br>'); - } - if (total <= mass_i) { - mass_rest = 0; - mass_i = 0; - i = 0; - } else { - i += 1; - } - _kalimba2.default.play(220, -12); - if (notes.length) { - mass_rest = 0; - return [i, midi_notes, timings, mass_rest]; - } - mass_rest += 128; - return [i, [], [], 0]; -} - -/* play next note according to sonification */ - -function play_next() { - var note_time = 120000 / _tone2.default.Transport.bpm.value * _midi.note_values[_ui.nx.timing.active][0]; - setTimeout(play_next, note_time); - - var _play_fn = play_fn(i, bounds, diff, note_time), - _play_fn2 = (0, _slicedToArray3.default)(_play_fn, 3), - new_i = _play_fn2[0], - notes = _play_fn2[1], - timings = _play_fn2[2]; - - i = new_i; - if (recording) { - var timing = _midi.note_values[_ui.nx.timing.active][2]; - if (timing.length) timing = timing[i % timing.length]; - recorder.addEvent(new _midi.MidiWriter.NoteEvent({ pitch: notes, duration: 't' + timing })); - } -} - -/* bind selects */ - -function pick_dataset(key) { - console.log('pick dataset:', key, datasets[key]); - i = 0; - mass_i = 0; - mass_rest = 0; - dataset = datasets[key]; - bounds = (0, _util.get_bounds)(dataset); - diff = (0, _util.get_diff_bounds)(bounds.rows); - play_fn = dataset.play_fn; -} - -/* build and bind the UI */ - -function ready() { - _scales2.default.build_options(document.querySelector('#scale')); - (0, _ui.build_options)(document.querySelector('#dataset'), datasets, pick_dataset); - - var dial_size = [50, 50]; - - _tone2.default.Transport.bpm.value = DEFAULT_BPM; - _ui.nx.tempo = new _nexusui2.default.Dial('#tempo', { - size: dial_size, - min: 10, - max: 300, - step: 1, - value: DEFAULT_BPM - }); - (0, _ui.update_value_on_change)(_ui.nx.tempo, '#tempo', true, function (v) { - return _tone2.default.Transport.bpm.value = v; - }); - - _ui.nx.timing = new _nexusui2.default.RadioButton('#timing', { - size: [400, 25], - numberOfButtons: _midi.note_values.length, - active: 6 - }); - (0, _ui.update_radio_value_on_change)(_ui.nx.timing, '#timing', _midi.note_values); - - _ui.nx.duration = new _nexusui2.default.Dial('#duration', { - size: dial_size, - min: 0, - max: 2, - step: 0.01, - value: 0.8 - }); - (0, _ui.update_value_on_change)(_ui.nx.duration, '#duration', false); - - _ui.nx.offset = new _nexusui2.default.Dial('#offset', { - size: dial_size, - min: -24, - max: 24, - step: 1, - value: -5 - }); - (0, _ui.update_value_on_change)(_ui.nx.offset, '#offset', true); - - _ui.nx.octave = new _nexusui2.default.Dial('#octave', { - size: dial_size, - min: -4, - max: 4, - step: 1, - value: 0 - }); - (0, _ui.update_value_on_change)(_ui.nx.octave, '#octave', true); - - _ui.nx.multiply = new _nexusui2.default.Dial('#multiply', { - size: dial_size, - min: -64, - max: 64, - step: 1, - value: 19 - }); - (0, _ui.update_value_on_change)(_ui.nx.multiply, '#multiply', true); - - _ui.nx.interval = new _nexusui2.default.Dial('#interval', { - size: dial_size, - min: -64, - max: 64, - step: 1, - value: 10 - }); - (0, _ui.update_value_on_change)(_ui.nx.interval, '#interval', true); - - var export_midi_button = document.querySelector('#export_midi'); - export_midi_button.addEventListener('click', function () { - (0, _midi.export_pattern_as_midi)(dataset.name, bounds, diff, _ui.nx.tempo.value, _ui.nx.timing.active, play_fn); - }); - - var record_midi_button = document.querySelector('#record_midi'); - record_midi_button.addEventListener('click', function () { - if (recording) { - record_midi_button.innerHTML = 'Record MIDI'; - document.body.classList.remove('recording'); - recording = false; - var writer = new _midi.MidiWriter.Writer([recorder]); - var blob = (0, _util.dataURItoBlob)(writer.dataUri()); - saveAs(blob, 'Recording - ' + dataset.name + '.mid'); - } else { - record_midi_button.innerHTML = 'Save Recording'; - document.body.classList.add('recording'); - recording = true; - recorder = new _midi.MidiWriter.Track(); - recorder.setTempo(_ui.nx.tempo.value); - } - }); - - document.querySelector('.loading').classList.remove('loading'); - - document.querySelector('#dataset').value = 'Mass Shootings'; - pick_dataset('Mass Shootings'); - - document.querySelector('#scale').value = '14'; - _scales2.default.pick(14); - - play_next(); -} - -/* keys */ - -_keys2.default.listen(function (index) { - _ui.nx.offset.value = index; - _ui.nx.offset.update(index); -}); - -/***/ }), -/* 81 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _assign = __webpack_require__(57); - -var _assign2 = _interopRequireDefault(_assign); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -module.exports = function () { - var Intonation = function Intonation(opt) { - opt = this.opt = (0, _assign2.default)({ - name: "", - root: 440, - octave: 0, - interval: 2, - tet: 0, - intervals: null - }, opt || {}); - this.generate(); - }; - Intonation.prototype.generate = function (opt) { - opt = (0, _assign2.default)(this.opt, opt || {}); - if (opt.scl) { - this.generate_scl(); - } else if (opt.tet) { - this.generate_tet(); - } else if (opt.intervals) { - this.generate_intervals(); - } - }; - Intonation.prototype.generate_intervals = function () { - var root = this.opt.root; - var interval_list = this.opt.intervals; - if (typeof interval_list == "string") { - interval_list = interval_list.split(" "); - } - this.name = this.opt.name || "interval list"; - this.intervals = interval_list; - this.interval = this.opt.interval = parseInterval.call(this, interval_list.pop()); - this.scale = interval_list.map(parseIntervalString.bind(this)).filter(function (v) { - return !!v; - }); - }; - Intonation.prototype.generate_tet = function () { - var scale = this.scale = []; - var root = this.opt.root; - var tet = this.opt.tet; - var interval = this.interval = this.opt.interval; - var ratio = Math.pow(interval, 1 / tet); - var n = root; - scale.push(n); - for (var i = 0; i < tet - 1; i++) { - n *= ratio; - scale.push(n); - } - this.name = this.opt.name || tet + "-tone equal temperament"; - this.intervals = null; - }; - Intonation.prototype.generate_scl = function () { - var root = this.opt.root; - var scl = this.parse_scl(this.opt.scl); - this.intervals = scl.notes; - this.interval = scl.notes.pop(); - this.name = this.opt.name || scl.description; - this.scale = scl.notes.map(function (v) { - return v * root; - }); - }; - Intonation.prototype.parse_scl = function (s) { - var scl = {}; - scl.comments = []; - scl.notes = []; - s.trim().split("\n").forEach(function (line) { - // Lines beginning with an exclamation mark are regarded as comments - // and are to be ignored. - if (line.indexOf("!") !== -1) { - scl.comments.push(line); - } - // The first (non comment) line contains a short description of the scale. - // If there is no description, there should be an empty line. (nb: which is falsey) - else if (!('description' in scl)) { - scl.description = line; - } - // The second line contains the number of notes. - // The first note of 1/1 or 0.0 cents is implicit and not in the files. - else if (!scl.notes.length) { - scl.notes.push(1); - } else { - // If the value contains a period, it is a cents value, otherwise a ratio. - var note = line.replace(/^[^-\.0-9]+/, "").replace(/[^-\/\.0-9]+$/, ""); - if (note.indexOf(".") !== -1) { - note = Math.pow(2, parseFloat(note) / 1200); - } else { - note = parseInterval(note); - } - if (note) { - scl.notes.push(note); - } - } - }); - return scl; - }; - Intonation.prototype.index = function (i, octave) { - octave = octave || this.opt.octave; - var f = this.scale[mod(i, this.scale.length) | 0]; - var pow = Math.floor(norm(i, 0, this.scale.length)) + octave; - f *= Math.pow(this.interval, pow); - return f; - }; - Intonation.prototype.range = function (min, max) { - var a = []; - for (var i = min; i < max; i++) { - a.push(this.index(i)); - } - return a; - }; - Intonation.prototype.set_root = function (f) { - this.opt.root = f; - this.generate(); - }; - Intonation.prototype.quantize_frequency = function (f) { - if (f == 0) return 0; - var scale_f = f; - var pow = 0; - var interval = this.interval; - var scale = this.scale; - while (scale_f < root) { - scale_f *= interval; - pow -= 1; - } - while (scale_f > root * interval) { - scale_f /= interval; - pow += 1; - } - for (var i = 0; i < scale.length; i++) { - if (scale_f > scale[i]) continue; - scale_f = scale[i]; - break; - } - scale_f *= Math.pow(2, pow); - return scale_f; - }; - Intonation.prototype.quantize_index = function (i) { - return mod(index - 1, this.scale.length) | 0; - }; - var parseInterval = Intonation.prototype.parse_interval = function (s) { - if (typeof s == "number") return s; - if (!s.indexOf("/") == -1) return parseInt(s); - var pp = s.split("/"); - var num = parseInt(pp[0]); - var den = parseInt(pp[1]); - if (isNaN(num)) return 1; - if (isNaN(den) || den == 0) return num; - if (num == den) return 1; - return num / den; - }; - var parseIntervalString = Intonation.prototype.parse_interval_string = function (s) { - if (s.indexOf("/") !== -1) return parseInterval(s) * this.opt.root; // intervals - if (s.indexOf("f") !== -1) return parseFloat(s); // pure frequencies - return parseFloat(s); - }; - function norm(n, a, b) { - return (n - a) / (b - a); - } - function mod(n, m) { - return n - m * Math.floor(n / m); - } - - return Intonation; -}(); - -/***/ }), -/* 82 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; - -var _typeof2 = __webpack_require__(91); - -var _typeof3 = _interopRequireDefault(_typeof2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - + */return function(e){t=e()}(function(){var t=function(){if(!(this instanceof t))throw new Error("constructor needs to be called with the 'new' keyword")};t.prototype.toString=function(){for(var e in t){var i=e[0].match(/^[A-Z]$/),n=t[e]===this.constructor;if(t.isFunction(t[e])&&i&&n)return e}return"Tone"},t.prototype.dispose=function(){return this},t.prototype.set=function(e,i,n){if(t.isObject(e))n=i;else if(t.isString(e)){var s={};s[e]=i,e=s}t:for(var r in e){i=e[r];var o=this;if(-1!==r.indexOf(".")){for(var a=r.split("."),h=0;h<a.length-1;h++)if((o=o[a[h]])instanceof t){a.splice(0,h+1);var u=a.join(".");o.set(u,i);continue t}r=a[a.length-1]}var l=o[r];t.isUndef(l)||(t.Signal&&l instanceof t.Signal||t.Param&&l instanceof t.Param?l.value!==i&&(t.isUndef(n)?l.value=i:l.rampTo(i,n)):l instanceof AudioParam?l.value!==i&&(l.value=i):t.TimeBase&&l instanceof t.TimeBase?o[r]=i:l instanceof t?l.set(i):l!==i&&(o[r]=i))}return this},t.prototype.get=function(e){t.isUndef(e)?e=this._collectDefaults(this.constructor):t.isString(e)&&(e=[e]);for(var i={},n=0;n<e.length;n++){var s=e[n],r=this,o=i;if(-1!==s.indexOf(".")){for(var a=s.split("."),h=0;h<a.length-1;h++){var u=a[h];o[u]=o[u]||{},o=o[u],r=r[u]}s=a[a.length-1]}var l=r[s];t.isObject(e[s])?o[s]=l.get():t.Signal&&l instanceof t.Signal?o[s]=l.value:t.Param&&l instanceof t.Param?o[s]=l.value:l instanceof AudioParam?o[s]=l.value:l instanceof t?o[s]=l.get():!t.isFunction(l)&&t.isDefined(l)&&(o[s]=l)}return i},t.prototype._collectDefaults=function(e){var i=[];if(t.isDefined(e.defaults)&&(i=Object.keys(e.defaults)),t.isDefined(e._super))for(var n=this._collectDefaults(e._super),s=0;s<n.length;s++)-1===i.indexOf(n[s])&&i.push(n[s]);return i},t.defaults=function(e,i,n){var s={};if(1===e.length&&t.isObject(e[0]))s=e[0];else for(var r=0;r<i.length;r++)s[i[r]]=e[r];return t.isDefined(n.defaults)?t.defaultArg(s,n.defaults):t.isObject(n)?t.defaultArg(s,n):s},t.defaultArg=function(e,i){if(t.isObject(e)&&t.isObject(i)){var n={};for(var s in e)n[s]=t.defaultArg(i[s],e[s]);for(var r in i)n[r]=t.defaultArg(e[r],i[r]);return n}return t.isUndef(e)?i:e},t.connectSeries=function(){for(var e=arguments[0],i=1;i<arguments.length;i++){var n=arguments[i];e.connect(n),e=n}return t},t.isUndef=function(t){return void 0===t},t.isDefined=function(e){return!t.isUndef(e)},t.isFunction=function(t){return"function"==typeof t},t.isNumber=function(t){return"number"==typeof t},t.isObject=function(t){return"[object Object]"===Object.prototype.toString.call(t)&&t.constructor===Object},t.isBoolean=function(t){return"boolean"==typeof t},t.isArray=function(t){return Array.isArray(t)},t.isString=function(t){return"string"==typeof t},t.isNote=function(e){return t.isString(e)&&/^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i.test(e)},t.noOp=function(){},t.prototype._readOnly=function(t){if(Array.isArray(t))for(var e=0;e<t.length;e++)this._readOnly(t[e]);else Object.defineProperty(this,t,{writable:!1,enumerable:!0})},t.prototype._writable=function(t){if(Array.isArray(t))for(var e=0;e<t.length;e++)this._writable(t[e]);else Object.defineProperty(this,t,{writable:!0})},t.State={Started:"started",Stopped:"stopped",Paused:"paused"},t.equalPowerScale=function(t){var e=.5*Math.PI;return Math.sin(t*e)},t.dbToGain=function(t){return Math.pow(10,t/20)},t.gainToDb=function(t){return Math.log(t)/Math.LN10*20},t.intervalToFrequencyRatio=function(t){return Math.pow(2,t/12)},t.prototype.now=function(){return t.context.now()},t.now=function(){return t.context.now()},t.extend=function(e,i){function n(){}t.isUndef(i)&&(i=t),n.prototype=i.prototype,e.prototype=new n,e.prototype.constructor=e,e._super=i};var e=null;return Object.defineProperty(t,"context",{get:function(){return e},set:function(i){e=t.Context&&i instanceof t.Context?i:new t.Context(i),t.Context.emit("init",e)}}),Object.defineProperty(t.prototype,"context",{get:function(){return t.context}}),t.setContext=function(e){t.context=e},Object.defineProperty(t.prototype,"blockTime",{get:function(){return 128/this.context.sampleRate}}),Object.defineProperty(t.prototype,"sampleTime",{get:function(){return 1/this.context.sampleRate}}),Object.defineProperty(t,"supported",{get:function(){var t=window.hasOwnProperty("AudioContext")||window.hasOwnProperty("webkitAudioContext"),e=window.hasOwnProperty("Promise"),i=window.hasOwnProperty("Worker");return t&&e&&i}}),Object.defineProperty(t,"initialized",{get:function(){return null!==e}}),t.getContext=function(e){if(t.initialized)e(t.context);else{var i=function(){e(t.context),t.Context.off("init",i)};t.Context.on("init",i)}return t},t.version="r12",t}),e(function(t){return t.Emitter=function(){t.call(this),this._events={}},t.extend(t.Emitter),t.Emitter.prototype.on=function(t,e){for(var i=t.split(/\W+/),n=0;n<i.length;n++){var s=i[n];this._events.hasOwnProperty(s)||(this._events[s]=[]),this._events[s].push(e)}return this},t.Emitter.prototype.once=function(t,e){var i=function(){e.apply(this,arguments),this.off(t,i)}.bind(this);return this.on(t,i),this},t.Emitter.prototype.off=function(e,i){for(var n=e.split(/\W+/),s=0;s<n.length;s++)if(e=n[s],this._events.hasOwnProperty(e))if(t.isUndef(i))this._events[e]=[];else for(var r=this._events[e],o=0;o<r.length;o++)r[o]===i&&r.splice(o,1);return this},t.Emitter.prototype.emit=function(t){if(this._events){var e=Array.apply(null,arguments).slice(1);if(this._events.hasOwnProperty(t))for(var i=this._events[t].slice(0),n=0,s=i.length;n<s;n++)i[n].apply(this,e)}return this},t.Emitter.mixin=function(e){var i=["on","once","off","emit"];e._events={};for(var n=0;n<i.length;n++){var s=i[n],r=t.Emitter.prototype[s];e[s]=r}return t.Emitter},t.Emitter.prototype.dispose=function(){return t.prototype.dispose.call(this),this._events=null,this},t.Emitter}),e(function(t){return t.Timeline=function(){var e=t.defaults(arguments,["memory"],t.Timeline);t.call(this),this._timeline=[],this.memory=e.memory},t.extend(t.Timeline),t.Timeline.defaults={memory:1/0},Object.defineProperty(t.Timeline.prototype,"length",{get:function(){return this._timeline.length}}),t.Timeline.prototype.add=function(e){if(t.isUndef(e.time))throw new Error("Tone.Timeline: events must have a time attribute");e.time=e.time.valueOf();var i=this._search(e.time);if(this._timeline.splice(i+1,0,e),this.length>this.memory){var n=this.length-this.memory;this._timeline.splice(0,n)}return this},t.Timeline.prototype.remove=function(t){var e=this._timeline.indexOf(t);return-1!==e&&this._timeline.splice(e,1),this},t.Timeline.prototype.get=function(e,i){i=t.defaultArg(i,"time");var n=this._search(e,i);return-1!==n?this._timeline[n]:null},t.Timeline.prototype.peek=function(){return this._timeline[0]},t.Timeline.prototype.shift=function(){return this._timeline.shift()},t.Timeline.prototype.getAfter=function(e,i){i=t.defaultArg(i,"time");var n=this._search(e,i);return n+1<this._timeline.length?this._timeline[n+1]:null},t.Timeline.prototype.getBefore=function(e,i){i=t.defaultArg(i,"time");var n=this._timeline.length;if(n>0&&this._timeline[n-1][i]<e)return this._timeline[n-1];var s=this._search(e,i);return s-1>=0?this._timeline[s-1]:null},t.Timeline.prototype.cancel=function(t){if(this._timeline.length>1){var e=this._search(t);if(e>=0)if(this._timeline[e].time===t){for(var i=e;i>=0&&this._timeline[i].time===t;i--)e=i;this._timeline=this._timeline.slice(0,e)}else this._timeline=this._timeline.slice(0,e+1);else this._timeline=[]}else 1===this._timeline.length&&this._timeline[0].time>=t&&(this._timeline=[]);return this},t.Timeline.prototype.cancelBefore=function(t){var e=this._search(t);return e>=0&&(this._timeline=this._timeline.slice(e+1)),this},t.Timeline.prototype.previousEvent=function(t){var e=this._timeline.indexOf(t);return e>0?this._timeline[e-1]:null},t.Timeline.prototype._search=function(e,i){if(0===this._timeline.length)return-1;i=t.defaultArg(i,"time");var n=0,s=this._timeline.length,r=s;if(s>0&&this._timeline[s-1][i]<=e)return s-1;for(;n<r;){var o=Math.floor(n+(r-n)/2),a=this._timeline[o],h=this._timeline[o+1];if(a[i]===e){for(var u=o;u<this._timeline.length;u++){this._timeline[u][i]===e&&(o=u)}return o}if(a[i]<e&&h[i]>e)return o;a[i]>e?r=o:n=o+1}return-1},t.Timeline.prototype._iterate=function(e,i,n){i=t.defaultArg(i,0),n=t.defaultArg(n,this._timeline.length-1),this._timeline.slice(i,n+1).forEach(function(t){e.call(this,t)}.bind(this))},t.Timeline.prototype.forEach=function(t){return this._iterate(t),this},t.Timeline.prototype.forEachBefore=function(t,e){var i=this._search(t);return-1!==i&&this._iterate(e,0,i),this},t.Timeline.prototype.forEachAfter=function(t,e){var i=this._search(t);return this._iterate(e,i+1),this},t.Timeline.prototype.forEachBetween=function(t,e,i){var n=this._search(t),s=this._search(e);return-1!==n&&-1!==s?(this._timeline[n].time!==t&&(n+=1),this._timeline[s].time===e&&(s-=1),this._iterate(i,n,s)):-1===n&&this._iterate(i,0,s),this},t.Timeline.prototype.forEachFrom=function(t,e){for(var i=this._search(t);i>=0&&this._timeline[i].time>=t;)i--;return this._iterate(e,i+1),this},t.Timeline.prototype.forEachAtTime=function(t,e){var i=this._search(t);return-1!==i&&this._iterate(function(i){i.time===t&&e.call(this,i)},0,i),this},t.Timeline.prototype.dispose=function(){return t.prototype.dispose.call(this),this._timeline=null,this},t.Timeline}),e(function(t){t.supported&&(!window.hasOwnProperty("OfflineAudioContext")&&window.hasOwnProperty("webkitOfflineAudioContext")&&(window.OfflineAudioContext=window.webkitOfflineAudioContext),new OfflineAudioContext(1,1,44100).startRendering()instanceof Promise||(OfflineAudioContext.prototype._native_startRendering=OfflineAudioContext.prototype.startRendering,OfflineAudioContext.prototype.startRendering=function(){return new Promise(function(t){this.oncomplete=function(e){t(e.renderedBuffer)},this._native_startRendering()}.bind(this))}))}),e(function(t){if(t.supported){!window.hasOwnProperty("AudioContext")&&window.hasOwnProperty("webkitAudioContext")&&(window.AudioContext=window.webkitAudioContext),AudioContext.prototype.close||(AudioContext.prototype.close=function(){return t.isFunction(this.suspend)&&this.suspend(),Promise.resolve()}),AudioContext.prototype.resume||(AudioContext.prototype.resume=function(){return Promise.resolve()}),!AudioContext.prototype.createGain&&AudioContext.prototype.createGainNode&&(AudioContext.prototype.createGain=AudioContext.prototype.createGainNode),!AudioContext.prototype.createDelay&&AudioContext.prototype.createDelayNode&&(AudioContext.prototype.createDelay=AudioContext.prototype.createDelayNode);var e=!1,i=new OfflineAudioContext(1,1,44100),n=new Uint32Array([1179011410,48,1163280727,544501094,16,131073,44100,176400,1048580,1635017060,8,0,0,0,0]).buffer;try{i.decodeAudioData(n)instanceof Promise&&(e=!0)}catch(t){e=!1}e||(AudioContext.prototype._native_decodeAudioData=AudioContext.prototype.decodeAudioData,AudioContext.prototype.decodeAudioData=function(t){return new Promise(function(e,i){this._native_decodeAudioData(t,e,i)}.bind(this))})}}),e(function(t){t.Context=function(){t.Emitter.call(this);var i=t.defaults(arguments,["context"],t.Context);if(!i.context&&(i.context=new window.AudioContext,!i.context))throw new Error("could not create AudioContext. Possibly too many AudioContexts running already.");for(var n in this._context=i.context,this._context)this._defineProperty(this._context,n);this._latencyHint=i.latencyHint,this._constants={},this.lookAhead=i.lookAhead,this._computedUpdateInterval=0,this._ticker=new e(this.emit.bind(this,"tick"),i.clockSource,i.updateInterval),this._timeouts=new t.Timeline,this._timeoutIds=0,this.on("tick",this._timeoutLoop.bind(this))},t.extend(t.Context,t.Emitter),t.Emitter.mixin(t.Context),t.Context.defaults={clockSource:"worker",latencyHint:"interactive",lookAhead:.1,updateInterval:.03},t.Context.prototype._defineProperty=function(e,i){t.isUndef(this[i])&&Object.defineProperty(this,i,{get:function(){return"function"==typeof e[i]?e[i].bind(e):e[i]},set:function(t){e[i]=t}})},t.Context.prototype.now=function(){return this._context.currentTime+this.lookAhead},t.Context.prototype.ready=function(){return new Promise(function(t){"running"===this._context.state?t():this._context.resume().then(function(){t()})}.bind(this))},t.Context.prototype.close=function(){return this._context.close().then(function(){t.Context.emit("close",this)}.bind(this))},t.Context.prototype.getConstant=function(t){if(this._constants[t])return this._constants[t];for(var e=this._context.createBuffer(1,128,this._context.sampleRate),i=e.getChannelData(0),n=0;n<i.length;n++)i[n]=t;var s=this._context.createBufferSource();return s.channelCount=1,s.channelCountMode="explicit",s.buffer=e,s.loop=!0,s.start(0),this._constants[t]=s,s},t.Context.prototype._timeoutLoop=function(){for(var t=this.now();this._timeouts&&this._timeouts.length&&this._timeouts.peek().time<=t;)this._timeouts.shift().callback()},t.Context.prototype.setTimeout=function(t,e){this._timeoutIds++;var i=this.now();return this._timeouts.add({callback:t,time:i+e,id:this._timeoutIds}),this._timeoutIds},t.Context.prototype.clearTimeout=function(t){return this._timeouts.forEach(function(e){e.id===t&&this.remove(e)}),this},Object.defineProperty(t.Context.prototype,"updateInterval",{get:function(){return this._ticker.updateInterval},set:function(t){this._ticker.updateInterval=t}}),Object.defineProperty(t.Context.prototype,"clockSource",{get:function(){return this._ticker.type},set:function(t){this._ticker.type=t}}),Object.defineProperty(t.Context.prototype,"latencyHint",{get:function(){return this._latencyHint},set:function(e){var i=e;if(this._latencyHint=e,t.isString(e))switch(e){case"interactive":i=.1,this._context.latencyHint=e;break;case"playback":i=.8,this._context.latencyHint=e;break;case"balanced":i=.25,this._context.latencyHint=e;break;case"fastest":this._context.latencyHint="interactive",i=.01}this.lookAhead=i,this.updateInterval=i/3}}),t.Context.prototype.dispose=function(){return this.close().then(function(){for(var e in t.Emitter.prototype.dispose.call(this),this._ticker.dispose(),this._ticker=null,this._timeouts.dispose(),this._timeouts=null,this._constants)this._constants[e].disconnect();this._constants=null}.bind(this))};var e=function(e,i,n){this._type=i,this._updateInterval=n,this._callback=t.defaultArg(e,t.noOp),this._createClock()};return e.Type={Worker:"worker",Timeout:"timeout",Offline:"offline"},e.prototype._createWorker=function(){window.URL=window.URL||window.webkitURL;var t=new Blob(["var timeoutTime = "+(1e3*this._updateInterval).toFixed(1)+";self.onmessage = function(msg){\ttimeoutTime = parseInt(msg.data);};function tick(){\tsetTimeout(tick, timeoutTime);\tself.postMessage('tick');}tick();"]),e=URL.createObjectURL(t),i=new Worker(e);i.onmessage=this._callback.bind(this),this._worker=i},e.prototype._createTimeout=function(){this._timeout=setTimeout(function(){this._createTimeout(),this._callback()}.bind(this),1e3*this._updateInterval)},e.prototype._createClock=function(){if(this._type===e.Type.Worker)try{this._createWorker()}catch(t){this._type=e.Type.Timeout,this._createClock()}else this._type===e.Type.Timeout&&this._createTimeout()},Object.defineProperty(e.prototype,"updateInterval",{get:function(){return this._updateInterval},set:function(t){this._updateInterval=Math.max(t,128/44100),this._type===e.Type.Worker&&this._worker.postMessage(Math.max(1e3*t,1))}}),Object.defineProperty(e.prototype,"type",{get:function(){return this._type},set:function(t){this._disposeClock(),this._type=t,this._createClock()}}),e.prototype._disposeClock=function(){this._timeout&&(clearTimeout(this._timeout),this._timeout=null),this._worker&&(this._worker.terminate(),this._worker.onmessage=null,this._worker=null)},e.prototype.dispose=function(){this._disposeClock(),this._callback=null},t.getContext(function(){var e=AudioNode.prototype.connect,i=AudioNode.prototype.disconnect;function n(i,n,s){if(i.input)return s=t.defaultArg(s,0),t.isArray(i.input)?this.connect(i.input[s]):this.connect(i.input,n,s);try{return i instanceof AudioNode?(e.call(this,i,n,s),i):(e.call(this,i,n),i)}catch(t){throw new Error("error connecting to node: "+i+"\n"+t)}}AudioNode.prototype.connect!==n&&(AudioNode.prototype.connect=n,AudioNode.prototype.disconnect=function(e,n,s){if(e&&e.input&&t.isArray(e.input))s=t.defaultArg(s,0),this.disconnect(e.input[s],n,0);else if(e&&e.input)this.disconnect(e.input,n,s);else try{i.apply(this,arguments)}catch(t){throw new Error("error disconnecting node: "+e+"\n"+t)}})}),t.supported&&!t.initialized?(t.context=new t.Context,window.TONE_SILENCE_VERSION_LOGGING||console.log("%c * Tone.js "+t.version+" * ","background: #000; color: #fff")):t.supported||console.warn("This browser does not support Tone.js"),t.Context}),e(function(t){return t.AudioNode=function(){t.call(this);var e=t.defaults(arguments,["context"],{context:t.context});this._context=e.context},t.extend(t.AudioNode),Object.defineProperty(t.AudioNode.prototype,"context",{get:function(){return this._context}}),t.AudioNode.prototype.createInsOuts=function(t,e){1===t?this.input=this.context.createGain():t>1&&(this.input=new Array(t)),1===e?this.output=this.context.createGain():e>1&&(this.output=new Array(e))},Object.defineProperty(t.AudioNode.prototype,"channelCount",{get:function(){return this.output.channelCount},set:function(t){return this.output.channelCount=t}}),Object.defineProperty(t.AudioNode.prototype,"channelCountMode",{get:function(){return this.output.channelCountMode},set:function(t){return this.output.channelCountMode=t}}),Object.defineProperty(t.AudioNode.prototype,"channelInterpretation",{get:function(){return this.output.channelInterpretation},set:function(t){return this.output.channelInterpretation=t}}),Object.defineProperty(t.AudioNode.prototype,"numberOfInputs",{get:function(){return this.input?t.isArray(this.input)?this.input.length:1:0}}),Object.defineProperty(t.AudioNode.prototype,"numberOfOutputs",{get:function(){return this.output?t.isArray(this.output)?this.output.length:1:0}}),t.AudioNode.prototype._onConnect=function(){},t.AudioNode.prototype.connect=function(e,i,n){return e._onConnect&&e._onConnect(this),t.isArray(this.output)?(i=t.defaultArg(i,0),this.output[i].connect(e,0,n)):this.output.connect(e,i,n),this},t.AudioNode.prototype.disconnect=function(e,i,n){t.isArray(this.output)?t.isNumber(e)?this.output[e].disconnect():(i=t.defaultArg(i,0),this.output[i].disconnect(e,0,n)):this.output.disconnect.apply(this.output,arguments)},t.AudioNode.prototype.chain=function(){for(var t=this,e=0;e<arguments.length;e++){var i=arguments[e];t.connect(i),t=i}return this},t.AudioNode.prototype.fan=function(){for(var t=0;t<arguments.length;t++)this.connect(arguments[t]);return this},window.AudioNode&&(AudioNode.prototype.chain=t.AudioNode.prototype.chain,AudioNode.prototype.fan=t.AudioNode.prototype.fan),t.AudioNode.prototype.dispose=function(){return t.isDefined(this.input)&&(this.input instanceof AudioNode&&this.input.disconnect(),this.input=null),t.isDefined(this.output)&&(this.output instanceof AudioNode&&this.output.disconnect(),this.output=null),this._context=null,this},t.AudioNode}),e(function(t){return t.SignalBase=function(){t.AudioNode.call(this)},t.extend(t.SignalBase,t.AudioNode),t.SignalBase.prototype.connect=function(e,i,n){return t.Signal&&t.Signal===e.constructor||t.Param&&t.Param===e.constructor?(e._param.cancelScheduledValues(0),e._param.value=0,e.overridden=!0):e instanceof AudioParam&&(e.cancelScheduledValues(0),e.value=0),t.AudioNode.prototype.connect.call(this,e,i,n),this},t.SignalBase}),e(function(t){if(t.supported){var e=navigator.userAgent.toLowerCase();if(e.includes("safari")&&!e.includes("chrome")){var i=function(t){for(var e in this._internalNode=this.input=this.output=t._native_createWaveShaper(),this._curve=null,this._internalNode)this._defineProperty(this._internalNode,e)};Object.defineProperty(i.prototype,"curve",{get:function(){return this._curve},set:function(t){this._curve=t;var e=new Float32Array(t.length+1);e.set(t,1),e[0]=t[0],this._internalNode.curve=e}}),i.prototype._defineProperty=function(e,i){t.isUndef(this[i])&&Object.defineProperty(this,i,{get:function(){return"function"==typeof e[i]?e[i].bind(e):e[i]},set:function(t){e[i]=t}})},AudioContext.prototype._native_createWaveShaper=AudioContext.prototype.createWaveShaper,AudioContext.prototype.createWaveShaper=function(){return new i(this)}}}}),e(function(t){return t.WaveShaper=function(e,i){t.SignalBase.call(this),this._shaper=this.input=this.output=this.context.createWaveShaper(),this._curve=null,Array.isArray(e)?this.curve=e:isFinite(e)||t.isUndef(e)?this._curve=new Float32Array(t.defaultArg(e,1024)):t.isFunction(e)&&(this._curve=new Float32Array(t.defaultArg(i,1024)),this.setMap(e))},t.extend(t.WaveShaper,t.SignalBase),t.WaveShaper.prototype.setMap=function(t){for(var e=new Array(this._curve.length),i=0,n=this._curve.length;i<n;i++){var s=i/(n-1)*2-1;e[i]=t(s,i)}return this.curve=e,this},Object.defineProperty(t.WaveShaper.prototype,"curve",{get:function(){return this._shaper.curve},set:function(t){this._curve=new Float32Array(t),this._shaper.curve=this._curve}}),Object.defineProperty(t.WaveShaper.prototype,"oversample",{get:function(){return this._shaper.oversample},set:function(t){if(!["none","2x","4x"].includes(t))throw new RangeError("Tone.WaveShaper: oversampling must be either 'none', '2x', or '4x'");this._shaper.oversample=t}}),t.WaveShaper.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._shaper.disconnect(),this._shaper=null,this._curve=null,this},t.WaveShaper}),e(function(t){return t.TimeBase=function(e,i){if(!(this instanceof t.TimeBase))return new t.TimeBase(e,i);if(this._val=e,this._units=i,t.isUndef(this._units)&&t.isString(this._val)&&parseFloat(this._val)==this._val&&"+"!==this._val.charAt(0))this._val=parseFloat(this._val),this._units=this._defaultUnits;else if(e&&e.constructor===this.constructor)this._val=e._val,this._units=e._units;else if(e instanceof t.TimeBase)switch(this._defaultUnits){case"s":this._val=e.toSeconds();break;case"i":this._val=e.toTicks();break;case"hz":this._val=e.toFrequency();break;case"midi":this._val=e.toMidi();break;default:throw new Error("Unrecognized default units "+this._defaultUnits)}},t.extend(t.TimeBase),t.TimeBase.prototype._expressions={n:{regexp:/^(\d+)n(\.?)$/i,method:function(t,e){t=parseInt(t);var i="."===e?1.5:1;return 1===t?this._beatsToUnits(this._getTimeSignature())*i:this._beatsToUnits(4/t)*i}},t:{regexp:/^(\d+)t$/i,method:function(t){return t=parseInt(t),this._beatsToUnits(8/(3*parseInt(t)))}},m:{regexp:/^(\d+)m$/i,method:function(t){return this._beatsToUnits(parseInt(t)*this._getTimeSignature())}},i:{regexp:/^(\d+)i$/i,method:function(t){return this._ticksToUnits(parseInt(t))}},hz:{regexp:/^(\d+(?:\.\d+)?)hz$/i,method:function(t){return this._frequencyToUnits(parseFloat(t))}},tr:{regexp:/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?):?(\d+(?:\.\d+)?)?$/,method:function(t,e,i){var n=0;return t&&"0"!==t&&(n+=this._beatsToUnits(this._getTimeSignature()*parseFloat(t))),e&&"0"!==e&&(n+=this._beatsToUnits(parseFloat(e))),i&&"0"!==i&&(n+=this._beatsToUnits(parseFloat(i)/4)),n}},s:{regexp:/^(\d+(?:\.\d+)?)s$/,method:function(t){return this._secondsToUnits(parseFloat(t))}},samples:{regexp:/^(\d+)samples$/,method:function(t){return parseInt(t)/this.context.sampleRate}},default:{regexp:/^(\d+(?:\.\d+)?)$/,method:function(t){return this._expressions[this._defaultUnits].method.call(this,t)}}},t.TimeBase.prototype._defaultUnits="s",t.TimeBase.prototype._getBpm=function(){return t.Transport?t.Transport.bpm.value:120},t.TimeBase.prototype._getTimeSignature=function(){return t.Transport?t.Transport.timeSignature:4},t.TimeBase.prototype._getPPQ=function(){return t.Transport?t.Transport.PPQ:192},t.TimeBase.prototype._now=function(){return this.now()},t.TimeBase.prototype._frequencyToUnits=function(t){return 1/t},t.TimeBase.prototype._beatsToUnits=function(t){return 60/this._getBpm()*t},t.TimeBase.prototype._secondsToUnits=function(t){return t},t.TimeBase.prototype._ticksToUnits=function(t){return t*(this._beatsToUnits(1)/this._getPPQ())},t.TimeBase.prototype._noArg=function(){return this._now()},t.TimeBase.prototype.valueOf=function(){if(t.isUndef(this._val))return this._noArg();if(t.isString(this._val)&&t.isUndef(this._units))for(var e in this._expressions)if(this._expressions[e].regexp.test(this._val.trim())){this._units=e;break}if(t.isDefined(this._units)){var i=this._expressions[this._units],n=this._val.toString().trim().match(i.regexp);return n?i.method.apply(this,n.slice(1)):i.method.call(this,parseFloat(this._val))}return this._val},t.TimeBase.prototype.toSeconds=function(){return this.valueOf()},t.TimeBase.prototype.toFrequency=function(){return 1/this.toSeconds()},t.TimeBase.prototype.toSamples=function(){return this.toSeconds()*this.context.sampleRate},t.TimeBase.prototype.toMilliseconds=function(){return 1e3*this.toSeconds()},t.TimeBase.prototype.dispose=function(){this._val=null,this._units=null},t.TimeBase}),e(function(t){t.Frequency=function(e,i){if(!(this instanceof t.Frequency))return new t.Frequency(e,i);t.TimeBase.call(this,e,i)},t.extend(t.Frequency,t.TimeBase),t.Frequency.prototype._expressions=Object.assign({},t.TimeBase.prototype._expressions,{midi:{regexp:/^(\d+(?:\.\d+)?midi)/,method:function(e){return"midi"===this._defaultUnits?e:t.Frequency.mtof(e)}},note:{regexp:/^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i,method:function(i,n){var s=e[i.toLowerCase()]+12*(parseInt(n)+1);return"midi"===this._defaultUnits?s:t.Frequency.mtof(s)}},tr:{regexp:/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?):?(\d+(?:\.\d+)?)?/,method:function(t,e,i){var n=1;return t&&"0"!==t&&(n*=this._beatsToUnits(this._getTimeSignature()*parseFloat(t))),e&&"0"!==e&&(n*=this._beatsToUnits(parseFloat(e))),i&&"0"!==i&&(n*=this._beatsToUnits(parseFloat(i)/4)),n}}}),t.Frequency.prototype.transpose=function(e){return new this.constructor(this.valueOf()*t.intervalToFrequencyRatio(e))},t.Frequency.prototype.harmonize=function(t){return t.map(function(t){return this.transpose(t)}.bind(this))},t.Frequency.prototype.toMidi=function(){return t.Frequency.ftom(this.valueOf())},t.Frequency.prototype.toNote=function(){var e=this.toFrequency(),n=Math.log2(e/t.Frequency.A4),s=Math.round(12*n)+57,r=Math.floor(s/12);return r<0&&(s+=-12*r),i[s%12]+r.toString()},t.Frequency.prototype.toSeconds=function(){return 1/t.TimeBase.prototype.toSeconds.call(this)},t.Frequency.prototype.toFrequency=function(){return t.TimeBase.prototype.toFrequency.call(this)},t.Frequency.prototype.toTicks=function(){var e=this._beatsToUnits(1),i=this.valueOf()/e;return Math.floor(i*t.Transport.PPQ)},t.Frequency.prototype._noArg=function(){return 0},t.Frequency.prototype._frequencyToUnits=function(t){return t},t.Frequency.prototype._ticksToUnits=function(e){return 1/(60*e/(t.Transport.bpm.value*t.Transport.PPQ))},t.Frequency.prototype._beatsToUnits=function(e){return 1/t.TimeBase.prototype._beatsToUnits.call(this,e)},t.Frequency.prototype._secondsToUnits=function(t){return 1/t},t.Frequency.prototype._defaultUnits="hz";var e={cbb:-2,cb:-1,c:0,"c#":1,cx:2,dbb:0,db:1,d:2,"d#":3,dx:4,ebb:2,eb:3,e:4,"e#":5,ex:6,fbb:3,fb:4,f:5,"f#":6,fx:7,gbb:5,gb:6,g:7,"g#":8,gx:9,abb:7,ab:8,a:9,"a#":10,ax:11,bbb:9,bb:10,b:11,"b#":12,bx:13},i=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];return t.Frequency.A4=440,t.Frequency.mtof=function(e){return t.Frequency.A4*Math.pow(2,(e-69)/12)},t.Frequency.ftom=function(e){return 69+Math.round(12*Math.log2(e/t.Frequency.A4))},t.Frequency}),e(function(t){return t.Time=function(e,i){if(!(this instanceof t.Time))return new t.Time(e,i);t.TimeBase.call(this,e,i)},t.extend(t.Time,t.TimeBase),t.Time.prototype._expressions=Object.assign({},t.TimeBase.prototype._expressions,{quantize:{regexp:/^@(.+)/,method:function(e){if(t.Transport){var i=new this.constructor(e);return t.Transport.nextSubdivision(i)}return 0}},now:{regexp:/^\+(.+)/,method:function(t){return this._now()+new this.constructor(t)}}}),t.Time.prototype.quantize=function(e,i){i=t.defaultArg(i,1);var n=new this.constructor(e),s=this.valueOf();return s+(Math.round(s/n)*n-s)*i},t.Time.prototype.toNotation=function(){for(var e=this.toSeconds(),i=["1m"],n=1;n<8;n++){var s=Math.pow(2,n);i.push(s+"n."),i.push(s+"n"),i.push(s+"t")}i.push("0");var r=i[0],o=t.Time(i[0]).toSeconds();return i.forEach(function(i){var n=t.Time(i).toSeconds();Math.abs(n-e)<Math.abs(o-e)&&(r=i,o=n)}),r},t.Time.prototype.toBarsBeatsSixteenths=function(){var t=this._beatsToUnits(1),e=this.valueOf()/t,i=Math.floor(e/this._getTimeSignature()),n=e%1*4;return e=Math.floor(e)%this._getTimeSignature(),(n=n.toString()).length>3&&(n=parseFloat(parseFloat(n).toFixed(3))),[i,e,n].join(":")},t.Time.prototype.toTicks=function(){var t=this._beatsToUnits(1),e=this.valueOf()/t;return Math.round(e*this._getPPQ())},t.Time.prototype.toSeconds=function(){return this.valueOf()},t.Time.prototype.toMidi=function(){return t.Frequency.ftom(this.toFrequency())},t.Time}),e(function(t){return t.TransportTime=function(e,i){if(!(this instanceof t.TransportTime))return new t.TransportTime(e,i);t.Time.call(this,e,i)},t.extend(t.TransportTime,t.Time),t.TransportTime.prototype._now=function(){return t.Transport.seconds},t.TransportTime}),e(function(t){return t.Type={Default:"number",Time:"time",Frequency:"frequency",TransportTime:"transportTime",Ticks:"ticks",NormalRange:"normalRange",AudioRange:"audioRange",Decibels:"db",Interval:"interval",BPM:"bpm",Positive:"positive",Gain:"gain",Cents:"cents",Degrees:"degrees",MIDI:"midi",BarsBeatsSixteenths:"barsBeatsSixteenths",Samples:"samples",Hertz:"hertz",Note:"note",Milliseconds:"milliseconds",Seconds:"seconds",Notation:"notation"},t.prototype.toSeconds=function(e){return t.isNumber(e)?e:t.isUndef(e)?this.now():t.isString(e)?new t.Time(e).toSeconds():e instanceof t.TimeBase?e.toSeconds():void 0},t.prototype.toFrequency=function(e){return t.isNumber(e)?e:t.isString(e)||t.isUndef(e)?new t.Frequency(e).valueOf():e instanceof t.TimeBase?e.toFrequency():void 0},t.prototype.toTicks=function(e){return t.isNumber(e)||t.isString(e)?new t.TransportTime(e).toTicks():t.isUndef(e)?t.Transport.ticks:e instanceof t.TimeBase?e.toTicks():void 0},t}),e(function(t){return t.Param=function(){var e=t.defaults(arguments,["param","units","convert"],t.Param);t.AudioNode.call(this),this._param=this.input=e.param,this.units=e.units,this.convert=e.convert,this.overridden=!1,this._events=new t.Timeline(1e3),t.isDefined(e.value)&&this._param&&(this.value=e.value)},t.extend(t.Param,t.AudioNode),t.Param.defaults={units:t.Type.Default,convert:!0,param:void 0},Object.defineProperty(t.Param.prototype,"value",{get:function(){var t=this.now();return this._toUnits(this.getValueAtTime(t))},set:function(t){this._initialValue=this._fromUnits(t),this.cancelScheduledValues(this.context.currentTime),this.setValueAtTime(t,this.context.currentTime)}}),Object.defineProperty(t.Param.prototype,"minValue",{get:function(){return this.units===t.Type.Time||this.units===t.Type.Frequency||this.units===t.Type.NormalRange||this.units===t.Type.Positive||this.units===t.Type.BPM?0:this.units===t.Type.AudioRange?-1:this.units===t.Type.Decibels?-1/0:this._param.minValue}}),Object.defineProperty(t.Param.prototype,"maxValue",{get:function(){return this.units===t.Type.NormalRange||this.units===t.Type.AudioRange?1:this._param.maxValue}}),t.Param.prototype._fromUnits=function(e){if(!this.convert&&!t.isUndef(this.convert)||this.overridden)return e;switch(this.units){case t.Type.Time:return this.toSeconds(e);case t.Type.Frequency:return this.toFrequency(e);case t.Type.Decibels:return t.dbToGain(e);case t.Type.NormalRange:return Math.min(Math.max(e,0),1);case t.Type.AudioRange:return Math.min(Math.max(e,-1),1);case t.Type.Positive:return Math.max(e,0);default:return e}},t.Param.prototype._toUnits=function(e){if(!this.convert&&!t.isUndef(this.convert))return e;switch(this.units){case t.Type.Decibels:return t.gainToDb(e);default:return e}},t.Param.prototype._minOutput=1e-5,t.Param.AutomationType={Linear:"linearRampToValueAtTime",Exponential:"exponentialRampToValueAtTime",Target:"setTargetAtTime",SetValue:"setValueAtTime"},t.Param.prototype.setValueAtTime=function(e,i){return i=this.toSeconds(i),e=this._fromUnits(e),this._events.add({type:t.Param.AutomationType.SetValue,value:e,time:i}),this._param.setValueAtTime(e,i),this},t.Param.prototype.getValueAtTime=function(e){e=this.toSeconds(e);var i=this._events.getAfter(e),n=this._events.get(e),s=t.defaultArg(this._initialValue,this._param.defaultValue),r=s;if(null===n)r=s;else if(n.type===t.Param.AutomationType.Target){var o,a=this._events.getBefore(n.time);o=null===a?s:a.value,r=this._exponentialApproach(n.time,o,n.value,n.constant,e)}else r=null===i?n.value:i.type===t.Param.AutomationType.Linear?this._linearInterpolate(n.time,n.value,i.time,i.value,e):i.type===t.Param.AutomationType.Exponential?this._exponentialInterpolate(n.time,n.value,i.time,i.value,e):n.value;return r},t.Param.prototype.setRampPoint=function(t){t=this.toSeconds(t);var e=this.getValueAtTime(t);return this.cancelAndHoldAtTime(t),0===e&&(e=this._minOutput),this.setValueAtTime(this._toUnits(e),t),this},t.Param.prototype.linearRampToValueAtTime=function(e,i){return e=this._fromUnits(e),i=this.toSeconds(i),this._events.add({type:t.Param.AutomationType.Linear,value:e,time:i}),this._param.linearRampToValueAtTime(e,i),this},t.Param.prototype.exponentialRampToValueAtTime=function(e,i){return e=this._fromUnits(e),e=Math.max(this._minOutput,e),i=this.toSeconds(i),this._events.add({type:t.Param.AutomationType.Exponential,time:i,value:e}),this._param.exponentialRampToValueAtTime(e,i),this},t.Param.prototype.exponentialRampTo=function(t,e,i){return i=this.toSeconds(i),this.setRampPoint(i),this.exponentialRampToValueAtTime(t,i+this.toSeconds(e)),this},t.Param.prototype.linearRampTo=function(t,e,i){return i=this.toSeconds(i),this.setRampPoint(i),this.linearRampToValueAtTime(t,i+this.toSeconds(e)),this},t.Param.prototype.targetRampTo=function(t,e,i){return i=this.toSeconds(i),this.setRampPoint(i),this.exponentialApproachValueAtTime(t,i,e),this},t.Param.prototype.exponentialApproachValueAtTime=function(t,e,i){var n=Math.log(this.toSeconds(i)+1)/Math.log(200);return e=this.toSeconds(e),this.setTargetAtTime(t,e,n)},t.Param.prototype.setTargetAtTime=function(e,i,n){if(e=this._fromUnits(e),n<=0)throw new Error("timeConstant must be greater than 0");return i=this.toSeconds(i),this._events.add({type:t.Param.AutomationType.Target,value:e,time:i,constant:n}),this._param.setTargetAtTime(e,i,n),this},t.Param.prototype.setValueCurveAtTime=function(e,i,n,s){s=t.defaultArg(s,1),n=this.toSeconds(n),i=this.toSeconds(i),this.setValueAtTime(e[0]*s,i);for(var r=n/(e.length-1),o=1;o<e.length;o++)this.linearRampToValueAtTime(e[o]*s,i+o*r);return this},t.Param.prototype.cancelScheduledValues=function(t){return t=this.toSeconds(t),this._events.cancel(t),this._param.cancelScheduledValues(t),this},t.Param.prototype.cancelAndHoldAtTime=function(e){var i=this.getValueAtTime(e),n=this._events.get(e),s=this._events.getAfter(e);return n&&n.time===e?s?this._events.cancel(s.time):this._events.cancel(e+1e-6):s&&(this._events.cancel(s.time),this._param.cancelAndHoldAtTime||this._param.cancelScheduledValues(e),s.type===t.Param.AutomationType.Linear?this._param.cancelAndHoldAtTime?this._events.add({type:t.Param.AutomationType.Linear,value:i,time:e}):this.linearRampToValueAtTime(i,e):s.type===t.Param.AutomationType.Exponential&&(this._param.cancelAndHoldAtTime?this._events.add({type:t.Param.AutomationType.Exponential,value:i,time:e}):this.exponentialRampToValueAtTime(i,e))),this._events.add({type:t.Param.AutomationType.SetValue,value:i,time:e}),this._param.cancelAndHoldAtTime?this._param.cancelAndHoldAtTime(e):this._param.setValueAtTime(i,e),this},t.Param.prototype.rampTo=function(e,i,n){return i=t.defaultArg(i,.1),this.units===t.Type.Frequency||this.units===t.Type.BPM||this.units===t.Type.Decibels?this.exponentialRampTo(e,i,n):this.linearRampTo(e,i,n),this},t.Param.prototype._exponentialApproach=function(t,e,i,n,s){return i+(e-i)*Math.exp(-(s-t)/n)},t.Param.prototype._linearInterpolate=function(t,e,i,n,s){return e+(s-t)/(i-t)*(n-e)},t.Param.prototype._exponentialInterpolate=function(t,e,i,n,s){return e*Math.pow(n/e,(s-t)/(i-t))},t.Param.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._param=null,this._events=null,this},t.Param}),e(function(t){return t.OfflineContext=function(e,i,n){var s=new OfflineAudioContext(e,i*n,n);t.Context.call(this,{context:s,clockSource:"offline",lookAhead:0,updateInterval:128/n}),this._duration=i,this._currentTime=0},t.extend(t.OfflineContext,t.Context),t.OfflineContext.prototype.now=function(){return this._currentTime},t.OfflineContext.prototype.render=function(){for(;this._duration-this._currentTime>=0;)this.emit("tick"),this._currentTime+=this.blockTime;return this._context.startRendering()},t.OfflineContext.prototype.close=function(){return this._context=null,Promise.resolve()},t.OfflineContext}),e(function(t){if(t.supported){var e=navigator.userAgent.toLowerCase();e.includes("safari")&&!e.includes("chrome")&&e.includes("mobile")&&(t.OfflineContext.prototype.createBufferSource=function(){var t=this._context.createBufferSource(),e=t.start;return t.start=function(i){this.setTimeout(function(){e.call(t,i)}.bind(this),0)}.bind(this),t})}}),e(function(t){return t.Gain=function(){var e=t.defaults(arguments,["gain","units"],t.Gain);t.AudioNode.call(this),this.input=this.output=this._gainNode=this.context.createGain(),this.gain=new t.Param({param:this._gainNode.gain,units:e.units,value:e.gain,convert:e.convert}),this._readOnly("gain")},t.extend(t.Gain,t.AudioNode),t.Gain.defaults={gain:1,convert:!0},t.Gain.prototype.dispose=function(){t.AudioNode.prototype.dispose.call(this),this._gainNode.disconnect(),this._gainNode=null,this._writable("gain"),this.gain.dispose(),this.gain=null},t.Gain}),e(function(t){if(t.supported&&!AudioContext.prototype.createConstantSource){var e=function(t){this.context=t;for(var e=t.createBuffer(1,128,t.sampleRate),i=e.getChannelData(0),n=0;n<i.length;n++)i[n]=1;this._bufferSource=t.createBufferSource(),this._bufferSource.channelCount=1,this._bufferSource.channelCountMode="explicit",this._bufferSource.buffer=e,this._bufferSource.loop=!0;var s=this._output=t.createGain();this.offset=s.gain,this._bufferSource.connect(s)};e.prototype.start=function(t){return this._bufferSource.start(t),this},e.prototype.stop=function(t){return this._bufferSource.stop(t),this},e.prototype.connect=function(){return this._output.connect.apply(this._output,arguments),this},e.prototype.disconnect=function(){return this._output.disconnect.apply(this._output,arguments),this},AudioContext.prototype.createConstantSource=function(){return new e(this)},t.Context.prototype.createConstantSource=function(){return new e(this)}}}),e(function(t){return t.Signal=function(){var e=t.defaults(arguments,["value","units"],t.Signal);t.Param.call(this,e),this._proxies=[],this._sourceStarted=!1,this._constantSource=this.context.createConstantSource(),this._param=this._constantSource.offset,this.value=e.value,this.output=this._constantSource,this.input=this._param=this.output.offset},t.extend(t.Signal,t.Param),t.Signal.defaults={value:0,units:t.Type.Default,convert:!0},t.Signal.prototype.connect=function(e){return this._isParam(e)&&!this._sourceStarted?(this._proxies.push(e),e.overridden=!0,this._applyAutomations(e)):(t.SignalBase.prototype.connect.apply(this,arguments),this._sourceStarted||(this._sourceStarted=!0,this._constantSource.start(0))),this},t.Signal.prototype._isParam=function(e){return t.Param&&t.Param===e.constructor||e instanceof AudioParam},t.Signal.prototype._connectProxies=function(){this._sourceStarted||(this._sourceStarted=!0,this._constantSource.start(0)),this._proxies.forEach(function(e){t.SignalBase.prototype.connect.call(this,e),e._proxies&&e._connectProxies()}.bind(this))},t.Signal.prototype._onConnect=function(t){this._isParam(t)||this._connectProxies()},t.Signal.prototype._applyAutomations=function(t){var e=this.context.currentTime;t.cancelScheduledValues(e);var i=this.getValueAtTime(e);t.setValueAtTime(i,e),this._events.forEachFrom(e,function(e){t[e.type](e.value,e.time,e.constant)})},t.Signal.prototype.disconnect=function(e){if(this._proxies.includes(e)){var i=this._proxies.indexOf(e);this._proxies.splice(i,1)}else e||(this._proxies=[]);return t.SignalBase.prototype.disconnect.apply(this,arguments)},t.Signal.prototype.getValueAtTime=function(e){return this._param.getValueAtTime?this._param.getValueAtTime(e):t.Param.prototype.getValueAtTime.call(this,e)},["setValueAtTime","linearRampToValueAtTime","exponentialRampToValueAtTime","setTargetAtTime"].forEach(function(e){var i=t.Signal.prototype[e];t.Signal.prototype[e]=function(){var t=arguments;i.apply(this,arguments),t[0]=this._fromUnits(t[0]),t[1]=this.toSeconds(t[1]),this._proxies.forEach(function(i){i[e].apply(i,t)})}}),["cancelScheduledValues","cancelAndHoldAtTime"].forEach(function(e){var i=t.Signal.prototype[e];t.Signal.prototype[e]=function(){var t=arguments;i.apply(this,arguments),t[0]=this.toSeconds(t[0]),this._proxies.forEach(function(i){i[e].apply(i,t)})}}),t.Signal.prototype.dispose=function(){return t.Param.prototype.dispose.call(this),this._constantSource.disconnect(),this._constantSource=null,this._proxies=null,this},t.Signal}),e(function(t){return t.Pow=function(e){t.SignalBase.call(this),this._exp=t.defaultArg(e,1),this._expScaler=this.input=this.output=new t.WaveShaper(this._expFunc(this._exp),8192)},t.extend(t.Pow,t.SignalBase),Object.defineProperty(t.Pow.prototype,"value",{get:function(){return this._exp},set:function(t){this._exp=t,this._expScaler.setMap(this._expFunc(this._exp))}}),t.Pow.prototype._expFunc=function(t){return function(e){return Math.pow(Math.abs(e),t)}},t.Pow.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._expScaler.dispose(),this._expScaler=null,this},t.Pow}),e(function(t){return t.Envelope=function(){var e=t.defaults(arguments,["attack","decay","sustain","release"],t.Envelope);t.AudioNode.call(this),this.attack=e.attack,this.decay=e.decay,this.sustain=e.sustain,this.release=e.release,this._attackCurve="linear",this._releaseCurve="exponential",this._sig=this.output=new t.Signal(0),this.attackCurve=e.attackCurve,this.releaseCurve=e.releaseCurve},t.extend(t.Envelope,t.AudioNode),t.Envelope.defaults={attack:.01,decay:.1,sustain:.5,release:1,attackCurve:"linear",releaseCurve:"exponential"},Object.defineProperty(t.Envelope.prototype,"value",{get:function(){return this.getValueAtTime(this.now())}}),Object.defineProperty(t.Envelope.prototype,"attackCurve",{get:function(){if(t.isString(this._attackCurve))return this._attackCurve;if(t.isArray(this._attackCurve)){for(var e in t.Envelope.Type)if(t.Envelope.Type[e].In===this._attackCurve)return e;return this._attackCurve}},set:function(e){if(t.Envelope.Type.hasOwnProperty(e)){var i=t.Envelope.Type[e];t.isObject(i)?this._attackCurve=i.In:this._attackCurve=i}else{if(!t.isArray(e))throw new Error("Tone.Envelope: invalid curve: "+e);this._attackCurve=e}}}),Object.defineProperty(t.Envelope.prototype,"releaseCurve",{get:function(){if(t.isString(this._releaseCurve))return this._releaseCurve;if(t.isArray(this._releaseCurve)){for(var e in t.Envelope.Type)if(t.Envelope.Type[e].Out===this._releaseCurve)return e;return this._releaseCurve}},set:function(e){if(t.Envelope.Type.hasOwnProperty(e)){var i=t.Envelope.Type[e];t.isObject(i)?this._releaseCurve=i.Out:this._releaseCurve=i}else{if(!t.isArray(e))throw new Error("Tone.Envelope: invalid curve: "+e);this._releaseCurve=e}}}),t.Envelope.prototype.triggerAttack=function(e,i){e=this.toSeconds(e);var n=this.toSeconds(this.attack),s=n,r=this.toSeconds(this.decay);i=t.defaultArg(i,1);var o=this.getValueAtTime(e);o>0&&(s=(1-o)/(1/s));if("linear"===this._attackCurve)this._sig.linearRampTo(i,s,e);else if("exponential"===this._attackCurve)this._sig.targetRampTo(i,s,e);else if(s>0){this._sig.cancelAndHoldAtTime(e);var a=this._attackCurve;if(s<n){var h=1-s/n,u=Math.floor(h*this._attackCurve.length);(a=this._attackCurve.slice(u))[0]=o}this._sig.setValueCurveAtTime(a,e,s,i)}return r&&this._sig.targetRampTo(i*this.sustain,r,s+e),this},t.Envelope.prototype.triggerRelease=function(e){e=this.toSeconds(e);var i=this.getValueAtTime(e);if(i>0){var n=this.toSeconds(this.release);if("linear"===this._releaseCurve)this._sig.linearRampTo(0,n,e);else if("exponential"===this._releaseCurve)this._sig.targetRampTo(0,n,e);else{var s=this._releaseCurve;t.isArray(s)&&(this._sig.cancelAndHoldAtTime(e),this._sig.setValueCurveAtTime(s,e,n,i))}}return this},t.Envelope.prototype.getValueAtTime=function(t){return this._sig.getValueAtTime(t)},t.Envelope.prototype.triggerAttackRelease=function(t,e,i){return e=this.toSeconds(e),this.triggerAttack(e,i),this.triggerRelease(e+this.toSeconds(t)),this},t.Envelope.prototype.cancel=function(t){return this._sig.cancelScheduledValues(t),this},t.Envelope.prototype.connect=t.SignalBase.prototype.connect,function(){var e,i,n=[];for(e=0;e<128;e++)n[e]=Math.sin(e/127*(Math.PI/2));var s=[];for(e=0;e<127;e++){i=e/127;var r=Math.sin(i*(2*Math.PI)*6.4-Math.PI/2)+1;s[e]=r/10+.83*i}s[127]=1;var o=[];for(e=0;e<128;e++)o[e]=Math.ceil(e/127*5)/5;var a=[];for(e=0;e<128;e++)i=e/127,a[e]=.5*(1-Math.cos(Math.PI*i));var h=[];for(e=0;e<128;e++){i=e/127;var u=4*Math.pow(i,3)+.2,l=Math.cos(u*Math.PI*2*i);h[e]=Math.abs(l*(1-i))}function c(t){for(var e=new Array(t.length),i=0;i<t.length;i++)e[i]=1-t[i];return e}t.Envelope.Type={linear:"linear",exponential:"exponential",bounce:{In:c(h),Out:h},cosine:{In:n,Out:function(t){return t.slice(0).reverse()}(n)},step:{In:o,Out:c(o)},ripple:{In:s,Out:c(s)},sine:{In:a,Out:c(a)}}}(),t.Envelope.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._sig.dispose(),this._sig=null,this._attackCurve=null,this._releaseCurve=null,this},t.Envelope}),e(function(t){return t.AmplitudeEnvelope=function(){t.Envelope.apply(this,arguments),this.input=this.output=new t.Gain,this._sig.connect(this.output.gain)},t.extend(t.AmplitudeEnvelope,t.Envelope),t.AmplitudeEnvelope.prototype.dispose=function(){return t.Envelope.prototype.dispose.call(this),this},t.AmplitudeEnvelope}),e(function(t){t.supported&&(AnalyserNode.prototype.getFloatTimeDomainData||(AnalyserNode.prototype.getFloatTimeDomainData=function(t){var e=new Uint8Array(t.length);this.getByteTimeDomainData(e);for(var i=0;i<e.length;i++)t[i]=(e[i]-128)/128}))}),e(function(t){return t.Analyser=function(){var e=t.defaults(arguments,["type","size"],t.Analyser);t.AudioNode.call(this),this._analyser=this.input=this.output=this.context.createAnalyser(),this._type=e.type,this._buffer=null,this.size=e.size,this.type=e.type},t.extend(t.Analyser,t.AudioNode),t.Analyser.defaults={size:1024,type:"fft",smoothing:.8},t.Analyser.Type={Waveform:"waveform",FFT:"fft"},t.Analyser.prototype.getValue=function(){return this._type===t.Analyser.Type.FFT?this._analyser.getFloatFrequencyData(this._buffer):this._type===t.Analyser.Type.Waveform&&this._analyser.getFloatTimeDomainData(this._buffer),this._buffer},Object.defineProperty(t.Analyser.prototype,"size",{get:function(){return this._analyser.frequencyBinCount},set:function(t){this._analyser.fftSize=2*t,this._buffer=new Float32Array(t)}}),Object.defineProperty(t.Analyser.prototype,"type",{get:function(){return this._type},set:function(e){if(e!==t.Analyser.Type.Waveform&&e!==t.Analyser.Type.FFT)throw new TypeError("Tone.Analyser: invalid type: "+e);this._type=e}}),Object.defineProperty(t.Analyser.prototype,"smoothing",{get:function(){return this._analyser.smoothingTimeConstant},set:function(t){this._analyser.smoothingTimeConstant=t}}),t.Analyser.prototype.dispose=function(){t.AudioNode.prototype.dispose.call(this),this._analyser.disconnect(),this._analyser=null,this._buffer=null},t.Analyser}),e(function(t){return t.Compressor=function(){var e=t.defaults(arguments,["threshold","ratio"],t.Compressor);t.AudioNode.call(this),this._compressor=this.input=this.output=this.context.createDynamicsCompressor(),this.threshold=new t.Param({param:this._compressor.threshold,units:t.Type.Decibels,convert:!1}),this.attack=new t.Param(this._compressor.attack,t.Type.Time),this.release=new t.Param(this._compressor.release,t.Type.Time),this.knee=new t.Param({param:this._compressor.knee,units:t.Type.Decibels,convert:!1}),this.ratio=new t.Param({param:this._compressor.ratio,convert:!1}),this._readOnly(["knee","release","attack","ratio","threshold"]),this.set(e)},t.extend(t.Compressor,t.AudioNode),t.Compressor.defaults={ratio:12,threshold:-24,release:.25,attack:.003,knee:30},t.Compressor.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable(["knee","release","attack","ratio","threshold"]),this._compressor.disconnect(),this._compressor=null,this.attack.dispose(),this.attack=null,this.release.dispose(),this.release=null,this.threshold.dispose(),this.threshold=null,this.ratio.dispose(),this.ratio=null,this.knee.dispose(),this.knee=null,this},t.Compressor}),e(function(t){return t.Add=function(e){t.Signal.call(this),this.createInsOuts(2,0),this._sum=this.input[0]=this.input[1]=this.output=new t.Gain,this._param=this.input[1]=new t.Signal(e),this._param.connect(this._sum)},t.extend(t.Add,t.Signal),t.Add.prototype.dispose=function(){return t.Signal.prototype.dispose.call(this),this._sum.dispose(),this._sum=null,this},t.Add}),e(function(t){return t.Multiply=function(e){t.Signal.call(this),this.createInsOuts(2,0),this._mult=this.input[0]=this.output=new t.Gain,this._param=this.input[1]=this.output.gain,this.value=t.defaultArg(e,0)},t.extend(t.Multiply,t.Signal),t.Multiply.prototype.dispose=function(){return t.Signal.prototype.dispose.call(this),this._mult.dispose(),this._mult=null,this._param=null,this},t.Multiply}),e(function(t){return t.Negate=function(){t.SignalBase.call(this),this._multiply=this.input=this.output=new t.Multiply(-1)},t.extend(t.Negate,t.SignalBase),t.Negate.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._multiply.dispose(),this._multiply=null,this},t.Negate}),e(function(t){return t.Subtract=function(e){t.Signal.call(this),this.createInsOuts(2,0),this._sum=this.input[0]=this.output=new t.Gain,this._neg=new t.Negate,this._param=this.input[1]=new t.Signal(e),this._param.chain(this._neg,this._sum)},t.extend(t.Subtract,t.Signal),t.Subtract.prototype.dispose=function(){return t.Signal.prototype.dispose.call(this),this._neg.dispose(),this._neg=null,this._sum.disconnect(),this._sum=null,this},t.Subtract}),e(function(t){return t.EqualPowerGain=function(){t.SignalBase.call(this),this._eqPower=this.input=this.output=new t.WaveShaper(function(e){return Math.abs(e)<.001?0:t.equalPowerScale(e)}.bind(this),4096)},t.extend(t.EqualPowerGain,t.SignalBase),t.EqualPowerGain.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._eqPower.dispose(),this._eqPower=null,this},t.EqualPowerGain}),e(function(t){return t.CrossFade=function(e){t.AudioNode.call(this),this.createInsOuts(2,1),this.a=this.input[0]=new t.Gain,this.b=this.input[1]=new t.Gain,this.fade=new t.Signal(t.defaultArg(e,.5),t.Type.NormalRange),this._equalPowerA=new t.EqualPowerGain,this._equalPowerB=new t.EqualPowerGain,this._one=this.context.getConstant(1),this._invert=new t.Subtract,this.a.connect(this.output),this.b.connect(this.output),this.fade.chain(this._equalPowerB,this.b.gain),this._one.connect(this._invert,0,0),this.fade.connect(this._invert,0,1),this._invert.chain(this._equalPowerA,this.a.gain),this._readOnly("fade")},t.extend(t.CrossFade,t.AudioNode),t.CrossFade.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable("fade"),this._equalPowerA.dispose(),this._equalPowerA=null,this._equalPowerB.dispose(),this._equalPowerB=null,this.fade.dispose(),this.fade=null,this._invert.dispose(),this._invert=null,this._one=null,this.a.dispose(),this.a=null,this.b.dispose(),this.b=null,this},t.CrossFade}),e(function(t){return t.Filter=function(){var e=t.defaults(arguments,["frequency","type","rolloff"],t.Filter);t.AudioNode.call(this),this.createInsOuts(1,1),this._filters=[],this.frequency=new t.Signal(e.frequency,t.Type.Frequency),this.detune=new t.Signal(0,t.Type.Cents),this.gain=new t.Signal({value:e.gain,convert:!1}),this.Q=new t.Signal(e.Q),this._type=e.type,this._rolloff=e.rolloff,this.rolloff=e.rolloff,this._readOnly(["detune","frequency","gain","Q"])},t.extend(t.Filter,t.AudioNode),t.Filter.defaults={type:"lowpass",frequency:350,rolloff:-12,Q:1,gain:0},Object.defineProperty(t.Filter.prototype,"type",{get:function(){return this._type},set:function(t){if(-1===["lowpass","highpass","bandpass","lowshelf","highshelf","notch","allpass","peaking"].indexOf(t))throw new TypeError("Tone.Filter: invalid type "+t);this._type=t;for(var e=0;e<this._filters.length;e++)this._filters[e].type=t}}),Object.defineProperty(t.Filter.prototype,"rolloff",{get:function(){return this._rolloff},set:function(e){e=parseInt(e,10);var i=[-12,-24,-48,-96].indexOf(e);if(-1===i)throw new RangeError("Tone.Filter: rolloff can only be -12, -24, -48 or -96");i+=1,this._rolloff=e,this.input.disconnect();for(var n=0;n<this._filters.length;n++)this._filters[n].disconnect(),this._filters[n]=null;this._filters=new Array(i);for(var s=0;s<i;s++){var r=this.context.createBiquadFilter();r.type=this._type,this.frequency.connect(r.frequency),this.detune.connect(r.detune),this.Q.connect(r.Q),this.gain.connect(r.gain),this._filters[s]=r}var o=[this.input].concat(this._filters).concat([this.output]);t.connectSeries.apply(t,o)}}),t.Filter.prototype.dispose=function(){t.AudioNode.prototype.dispose.call(this);for(var e=0;e<this._filters.length;e++)this._filters[e].disconnect(),this._filters[e]=null;return this._filters=null,this._writable(["detune","frequency","gain","Q"]),this.frequency.dispose(),this.Q.dispose(),this.frequency=null,this.Q=null,this.detune.dispose(),this.detune=null,this.gain.dispose(),this.gain=null,this},t.Filter}),e(function(t){return t.MultibandSplit=function(){var e=t.defaults(arguments,["lowFrequency","highFrequency"],t.MultibandSplit);t.AudioNode.call(this),this.input=new t.Gain,this.output=new Array(3),this.low=this.output[0]=new t.Filter(0,"lowpass"),this._lowMidFilter=new t.Filter(0,"highpass"),this.mid=this.output[1]=new t.Filter(0,"lowpass"),this.high=this.output[2]=new t.Filter(0,"highpass"),this.lowFrequency=new t.Signal(e.lowFrequency,t.Type.Frequency),this.highFrequency=new t.Signal(e.highFrequency,t.Type.Frequency),this.Q=new t.Signal(e.Q),this.input.fan(this.low,this.high),this.input.chain(this._lowMidFilter,this.mid),this.lowFrequency.connect(this.low.frequency),this.lowFrequency.connect(this._lowMidFilter.frequency),this.highFrequency.connect(this.mid.frequency),this.highFrequency.connect(this.high.frequency),this.Q.connect(this.low.Q),this.Q.connect(this._lowMidFilter.Q),this.Q.connect(this.mid.Q),this.Q.connect(this.high.Q),this._readOnly(["high","mid","low","highFrequency","lowFrequency"])},t.extend(t.MultibandSplit,t.AudioNode),t.MultibandSplit.defaults={lowFrequency:400,highFrequency:2500,Q:1},t.MultibandSplit.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable(["high","mid","low","highFrequency","lowFrequency"]),this.low.dispose(),this.low=null,this._lowMidFilter.dispose(),this._lowMidFilter=null,this.mid.dispose(),this.mid=null,this.high.dispose(),this.high=null,this.lowFrequency.dispose(),this.lowFrequency=null,this.highFrequency.dispose(),this.highFrequency=null,this.Q.dispose(),this.Q=null,this},t.MultibandSplit}),e(function(t){return t.EQ3=function(){var e=t.defaults(arguments,["low","mid","high"],t.EQ3);t.AudioNode.call(this),this.output=new t.Gain,this._multibandSplit=this.input=new t.MultibandSplit({lowFrequency:e.lowFrequency,highFrequency:e.highFrequency}),this._lowGain=new t.Gain(e.low,t.Type.Decibels),this._midGain=new t.Gain(e.mid,t.Type.Decibels),this._highGain=new t.Gain(e.high,t.Type.Decibels),this.low=this._lowGain.gain,this.mid=this._midGain.gain,this.high=this._highGain.gain,this.Q=this._multibandSplit.Q,this.lowFrequency=this._multibandSplit.lowFrequency,this.highFrequency=this._multibandSplit.highFrequency,this._multibandSplit.low.chain(this._lowGain,this.output),this._multibandSplit.mid.chain(this._midGain,this.output),this._multibandSplit.high.chain(this._highGain,this.output),this._readOnly(["low","mid","high","lowFrequency","highFrequency"])},t.extend(t.EQ3,t.AudioNode),t.EQ3.defaults={low:0,mid:0,high:0,lowFrequency:400,highFrequency:2500},t.EQ3.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable(["low","mid","high","lowFrequency","highFrequency"]),this._multibandSplit.dispose(),this._multibandSplit=null,this.lowFrequency=null,this.highFrequency=null,this._lowGain.dispose(),this._lowGain=null,this._midGain.dispose(),this._midGain=null,this._highGain.dispose(),this._highGain=null,this.low=null,this.mid=null,this.high=null,this.Q=null,this},t.EQ3}),e(function(t){return t.Scale=function(e,i){t.SignalBase.call(this),this._outputMin=t.defaultArg(e,0),this._outputMax=t.defaultArg(i,1),this._scale=this.input=new t.Multiply(1),this._add=this.output=new t.Add(0),this._scale.connect(this._add),this._setRange()},t.extend(t.Scale,t.SignalBase),Object.defineProperty(t.Scale.prototype,"min",{get:function(){return this._outputMin},set:function(t){this._outputMin=t,this._setRange()}}),Object.defineProperty(t.Scale.prototype,"max",{get:function(){return this._outputMax},set:function(t){this._outputMax=t,this._setRange()}}),t.Scale.prototype._setRange=function(){this._add.value=this._outputMin,this._scale.value=this._outputMax-this._outputMin},t.Scale.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._add.dispose(),this._add=null,this._scale.dispose(),this._scale=null,this},t.Scale}),e(function(t){return t.ScaleExp=function(e,i,n){t.SignalBase.call(this),this._scale=this.output=new t.Scale(e,i),this._exp=this.input=new t.Pow(t.defaultArg(n,2)),this._exp.connect(this._scale)},t.extend(t.ScaleExp,t.SignalBase),Object.defineProperty(t.ScaleExp.prototype,"exponent",{get:function(){return this._exp.value},set:function(t){this._exp.value=t}}),Object.defineProperty(t.ScaleExp.prototype,"min",{get:function(){return this._scale.min},set:function(t){this._scale.min=t}}),Object.defineProperty(t.ScaleExp.prototype,"max",{get:function(){return this._scale.max},set:function(t){this._scale.max=t}}),t.ScaleExp.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._scale.dispose(),this._scale=null,this._exp.dispose(),this._exp=null,this},t.ScaleExp}),e(function(t){return t.Delay=function(){var e=t.defaults(arguments,["delayTime","maxDelay"],t.Delay);t.AudioNode.call(this),this._maxDelay=Math.max(this.toSeconds(e.maxDelay),this.toSeconds(e.delayTime)),this._delayNode=this.input=this.output=this.context.createDelay(this._maxDelay),this.delayTime=new t.Param({param:this._delayNode.delayTime,units:t.Type.Time,value:e.delayTime}),this._readOnly("delayTime")},t.extend(t.Delay,t.AudioNode),t.Delay.defaults={maxDelay:1,delayTime:0},Object.defineProperty(t.Delay.prototype,"maxDelay",{get:function(){return this._maxDelay}}),t.Delay.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._delayNode.disconnect(),this._delayNode=null,this._writable("delayTime"),this.delayTime=null,this},t.Delay}),e(function(t){return t.FeedbackCombFilter=function(){var e=t.defaults(arguments,["delayTime","resonance"],t.FeedbackCombFilter);t.AudioNode.call(this),this._delay=this.input=this.output=new t.Delay(e.delayTime),this.delayTime=this._delay.delayTime,this._feedback=new t.Gain(e.resonance,t.Type.NormalRange),this.resonance=this._feedback.gain,this._delay.chain(this._feedback,this._delay),this._readOnly(["resonance","delayTime"])},t.extend(t.FeedbackCombFilter,t.AudioNode),t.FeedbackCombFilter.defaults={delayTime:.1,resonance:.5},t.FeedbackCombFilter.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable(["resonance","delayTime"]),this._delay.dispose(),this._delay=null,this.delayTime=null,this._feedback.dispose(),this._feedback=null,this.resonance=null,this},t.FeedbackCombFilter}),e(function(t){return t.FFT=function(){var e=t.defaults(arguments,["size"],t.FFT);e.type=t.Analyser.Type.FFT,t.AudioNode.call(this),this._analyser=this.input=this.output=new t.Analyser(e)},t.extend(t.FFT,t.AudioNode),t.FFT.defaults={size:1024},t.FFT.prototype.getValue=function(){return this._analyser.getValue()},Object.defineProperty(t.FFT.prototype,"size",{get:function(){return this._analyser.size},set:function(t){this._analyser.size=t}}),t.FFT.prototype.dispose=function(){t.AudioNode.prototype.dispose.call(this),this._analyser.dispose(),this._analyser=null},t.FFT}),e(function(t){return t.Abs=function(){t.SignalBase.call(this),this._abs=this.input=this.output=new t.WaveShaper(function(t){return Math.abs(t)<.001?0:Math.abs(t)},1024)},t.extend(t.Abs,t.SignalBase),t.Abs.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._abs.dispose(),this._abs=null,this},t.Abs}),e(function(t){return t.Follower=function(){var e=t.defaults(arguments,["attack","release"],t.Follower);t.AudioNode.call(this),this.createInsOuts(1,1),this._abs=new t.Abs,this._filter=this.context.createBiquadFilter(),this._filter.type="lowpass",this._filter.frequency.value=0,this._filter.Q.value=-100,this._frequencyValues=new t.WaveShaper,this._sub=new t.Subtract,this._delay=new t.Delay(this.blockTime),this._mult=new t.Multiply(1e4),this._attack=e.attack,this._release=e.release,this.input.chain(this._abs,this._filter,this.output),this._abs.connect(this._sub,0,1),this._filter.chain(this._delay,this._sub),this._sub.chain(this._mult,this._frequencyValues,this._filter.frequency),this._setAttackRelease(this._attack,this._release)},t.extend(t.Follower,t.AudioNode),t.Follower.defaults={attack:.05,release:.5},t.Follower.prototype._setAttackRelease=function(e,i){var n=this.blockTime;e=t.Time(e).toFrequency(),i=t.Time(i).toFrequency(),e=Math.max(e,n),i=Math.max(i,n),this._frequencyValues.setMap(function(t){return t<=0?e:i})},Object.defineProperty(t.Follower.prototype,"attack",{get:function(){return this._attack},set:function(t){this._attack=t,this._setAttackRelease(this._attack,this._release)}}),Object.defineProperty(t.Follower.prototype,"release",{get:function(){return this._release},set:function(t){this._release=t,this._setAttackRelease(this._attack,this._release)}}),t.Follower.prototype.connect=t.SignalBase.prototype.connect,t.Follower.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._filter.disconnect(),this._filter=null,this._frequencyValues.disconnect(),this._frequencyValues=null,this._delay.dispose(),this._delay=null,this._sub.disconnect(),this._sub=null,this._abs.dispose(),this._abs=null,this._mult.dispose(),this._mult=null,this._curve=null,this},t.Follower}),e(function(t){return t.ScaledEnvelope=function(){var e=t.defaults(arguments,["attack","decay","sustain","release"],t.Envelope);t.Envelope.call(this,e),e=t.defaultArg(e,t.ScaledEnvelope.defaults),this._exp=this.output=new t.Pow(e.exponent),this._scale=this.output=new t.Scale(e.min,e.max),this._sig.chain(this._exp,this._scale)},t.extend(t.ScaledEnvelope,t.Envelope),t.ScaledEnvelope.defaults={min:0,max:1,exponent:1},Object.defineProperty(t.ScaledEnvelope.prototype,"min",{get:function(){return this._scale.min},set:function(t){this._scale.min=t}}),Object.defineProperty(t.ScaledEnvelope.prototype,"max",{get:function(){return this._scale.max},set:function(t){this._scale.max=t}}),Object.defineProperty(t.ScaledEnvelope.prototype,"exponent",{get:function(){return this._exp.value},set:function(t){this._exp.value=t}}),t.ScaledEnvelope.prototype.dispose=function(){return t.Envelope.prototype.dispose.call(this),this._scale.dispose(),this._scale=null,this._exp.dispose(),this._exp=null,this},t.ScaledEnvelope}),e(function(t){return t.FrequencyEnvelope=function(){var e=t.defaults(arguments,["attack","decay","sustain","release"],t.Envelope);t.ScaledEnvelope.call(this,e),e=t.defaultArg(e,t.FrequencyEnvelope.defaults),this._octaves=e.octaves,this.baseFrequency=e.baseFrequency,this.octaves=e.octaves},t.extend(t.FrequencyEnvelope,t.Envelope),t.FrequencyEnvelope.defaults={baseFrequency:200,octaves:4,exponent:2},Object.defineProperty(t.FrequencyEnvelope.prototype,"baseFrequency",{get:function(){return this._scale.min},set:function(t){this._scale.min=this.toFrequency(t),this.octaves=this._octaves}}),Object.defineProperty(t.FrequencyEnvelope.prototype,"octaves",{get:function(){return this._octaves},set:function(t){this._octaves=t,this._scale.max=this.baseFrequency*Math.pow(2,t)}}),Object.defineProperty(t.FrequencyEnvelope.prototype,"exponent",{get:function(){return this._exp.value},set:function(t){this._exp.value=t}}),t.FrequencyEnvelope.prototype.dispose=function(){return t.ScaledEnvelope.prototype.dispose.call(this),this},t.FrequencyEnvelope}),e(function(t){return t.GreaterThanZero=function(){t.SignalBase.call(this),this._thresh=this.output=new t.WaveShaper(function(t){return t<=0?0:1},127),this._scale=this.input=new t.Multiply(1e4),this._scale.connect(this._thresh)},t.extend(t.GreaterThanZero,t.SignalBase),t.GreaterThanZero.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._scale.dispose(),this._scale=null,this._thresh.dispose(),this._thresh=null,this},t.GreaterThanZero}),e(function(t){return t.GreaterThan=function(e){t.Signal.call(this),this.createInsOuts(2,0),this._param=this.input[0]=new t.Subtract(e),this.input[1]=this._param.input[1],this._gtz=this.output=new t.GreaterThanZero,this._param.connect(this._gtz)},t.extend(t.GreaterThan,t.Signal),t.GreaterThan.prototype.dispose=function(){return t.Signal.prototype.dispose.call(this),this._gtz.dispose(),this._gtz=null,this},t.GreaterThan}),e(function(t){return t.Gate=function(){var e=t.defaults(arguments,["threshold","attack","release"],t.Gate);t.AudioNode.call(this),this.createInsOuts(1,1),this._follower=new t.Follower(e.attack,e.release),this._gt=new t.GreaterThan(t.dbToGain(e.threshold)),this.input.connect(this.output),this.input.chain(this._gt,this._follower,this.output.gain)},t.extend(t.Gate,t.AudioNode),t.Gate.defaults={attack:.1,release:.1,threshold:-40},Object.defineProperty(t.Gate.prototype,"threshold",{get:function(){return t.gainToDb(this._gt.value)},set:function(e){this._gt.value=t.dbToGain(e)}}),Object.defineProperty(t.Gate.prototype,"attack",{get:function(){return this._follower.attack},set:function(t){this._follower.attack=t}}),Object.defineProperty(t.Gate.prototype,"release",{get:function(){return this._follower.release},set:function(t){this._follower.release=t}}),t.Gate.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._follower.dispose(),this._gt.dispose(),this._follower=null,this._gt=null,this},t.Gate}),e(function(t){function e(t){return function(e,i){i=this.toSeconds(i),t.apply(this,arguments);var n=this._events.get(i),s=this._events.previousEvent(n),r=this._getTicksUntilEvent(s,i);return n.ticks=Math.max(r,0),this}}return t.TickSignal=function(e){e=t.defaultArg(e,1),t.Signal.call(this,{units:t.Type.Ticks,value:e}),this._events.memory=1/0,this.cancelScheduledValues(0),this._events.add({type:t.Param.AutomationType.SetValue,time:0,value:e})},t.extend(t.TickSignal,t.Signal),t.TickSignal.prototype.setValueAtTime=e(t.Signal.prototype.setValueAtTime),t.TickSignal.prototype.linearRampToValueAtTime=e(t.Signal.prototype.linearRampToValueAtTime),t.TickSignal.prototype.setTargetAtTime=function(t,e,i){e=this.toSeconds(e),this.setRampPoint(e),t=this._fromUnits(t);for(var n=this._events.get(e),s=Math.round(Math.max(1/i,1)),r=0;r<=s;r++){var o=i*r+e,a=this._exponentialApproach(n.time,n.value,t,i,o);this.linearRampToValueAtTime(this._toUnits(a),o)}return this},t.TickSignal.prototype.exponentialRampToValueAtTime=function(t,e){e=this.toSeconds(e),t=this._fromUnits(t);var i=this._events.get(e);null===i&&(i={value:this._initialValue,time:0});for(var n=Math.round(Math.max(10*(e-i.time),1)),s=(e-i.time)/n,r=0;r<=n;r++){var o=s*r+i.time,a=this._exponentialInterpolate(i.time,i.value,e,t,o);this.linearRampToValueAtTime(this._toUnits(a),o)}return this},t.TickSignal.prototype._getTicksUntilEvent=function(e,i){if(null===e)e={ticks:0,time:0};else if(t.isUndef(e.ticks)){var n=this._events.previousEvent(e);e.ticks=this._getTicksUntilEvent(n,e.time)}var s=this.getValueAtTime(e.time),r=this.getValueAtTime(i);return this._events.get(i).time===i&&this._events.get(i).type===t.Param.AutomationType.SetValue&&(r=this.getValueAtTime(i-this.sampleTime)),.5*(i-e.time)*(s+r)+e.ticks},t.TickSignal.prototype.getTicksAtTime=function(t){t=this.toSeconds(t);var e=this._events.get(t);return Math.max(this._getTicksUntilEvent(e,t),0)},t.TickSignal.prototype.getDurationOfTicks=function(t,e){e=this.toSeconds(e);var i=this.getTicksAtTime(e);return this.getTimeOfTick(i+t)-e},t.TickSignal.prototype.getTimeOfTick=function(e){var i=this._events.get(e,"ticks"),n=this._events.getAfter(e,"ticks");if(i&&i.ticks===e)return i.time;if(i&&n&&n.type===t.Param.AutomationType.Linear&&i.value!==n.value){var s=this.getValueAtTime(i.time),r=(this.getValueAtTime(n.time)-s)/(n.time-i.time),o=Math.sqrt(Math.pow(s,2)-2*r*(i.ticks-e)),a=(-s+o)/r;return(a>0?a:(-s-o)/r)+i.time}return i?0===i.value?1/0:i.time+(e-i.ticks)/i.value:e/this._initialValue},t.TickSignal.prototype.ticksToTime=function(e,i){return i=this.toSeconds(i),new t.Time(this.getDurationOfTicks(e,i))},t.TickSignal.prototype.timeToTicks=function(e,i){i=this.toSeconds(i),e=this.toSeconds(e);var n=this.getTicksAtTime(i),s=this.getTicksAtTime(i+e);return new t.Ticks(s-n)},t.TickSignal}),e(function(t){return t.TimelineState=function(e){t.Timeline.call(this),this._initial=e},t.extend(t.TimelineState,t.Timeline),t.TimelineState.prototype.getValueAtTime=function(t){var e=this.get(t);return null!==e?e.state:this._initial},t.TimelineState.prototype.setStateAtTime=function(t,e){return this.add({state:t,time:e}),this},t.TimelineState.prototype.getLastState=function(t,e){e=this.toSeconds(e);for(var i=this._search(e);i>=0;i--){var n=this._timeline[i];if(n.state===t)return n}},t.TimelineState.prototype.getNextState=function(t,e){e=this.toSeconds(e);var i=this._search(e);if(-1!==i)for(var n=i;n<this._timeline.length;n++){var s=this._timeline[n];if(s.state===t)return s}},t.TimelineState}),e(function(t){return t.TickSource=function(){var e=t.defaults(arguments,["frequency"],t.TickSource);this.frequency=new t.TickSignal(e.frequency,t.Type.Frequency),this._readOnly("frequency"),this._state=new t.TimelineState(t.State.Stopped),this._state.setStateAtTime(t.State.Stopped,0),this._tickOffset=new t.Timeline,this.setTicksAtTime(0,0)},t.extend(t.TickSource),t.TickSource.defaults={frequency:1},Object.defineProperty(t.TickSource.prototype,"state",{get:function(){return this._state.getValueAtTime(this.now())}}),t.TickSource.prototype.start=function(e,i){return e=this.toSeconds(e),this._state.getValueAtTime(e)!==t.State.Started&&(this._state.setStateAtTime(t.State.Started,e),t.isDefined(i)&&this.setTicksAtTime(i,e)),this},t.TickSource.prototype.stop=function(e){if(e=this.toSeconds(e),this._state.getValueAtTime(e)===t.State.Stopped){var i=this._state.get(e);i.time>0&&(this._tickOffset.cancel(i.time),this._state.cancel(i.time))}return this._state.cancel(e),this._state.setStateAtTime(t.State.Stopped,e),this.setTicksAtTime(0,e),this},t.TickSource.prototype.pause=function(e){return e=this.toSeconds(e),this._state.getValueAtTime(e)===t.State.Started&&this._state.setStateAtTime(t.State.Paused,e),this},t.TickSource.prototype.cancel=function(t){return t=this.toSeconds(t),this._state.cancel(t),this._tickOffset.cancel(t),this},t.TickSource.prototype.getTicksAtTime=function(e){e=this.toSeconds(e);var i=this._state.getLastState(t.State.Stopped,e),n={state:t.State.Paused,time:e};this._state.add(n);var s=i,r=0;return this._state.forEachBetween(i.time,e+this.sampleTime,function(e){var i=s.time,n=this._tickOffset.get(e.time);n.time>=s.time&&(r=n.ticks,i=n.time),s.state===t.State.Started&&e.state!==t.State.Started&&(r+=this.frequency.getTicksAtTime(e.time)-this.frequency.getTicksAtTime(i)),s=e}.bind(this)),this._state.remove(n),r},Object.defineProperty(t.TickSource.prototype,"ticks",{get:function(){return this.getTicksAtTime(this.now())},set:function(t){this.setTicksAtTime(t,this.now())}}),Object.defineProperty(t.TickSource.prototype,"seconds",{get:function(){return this.getSecondsAtTime(this.now())},set:function(t){var e=this.now(),i=this.frequency.timeToTicks(t,e);this.setTicksAtTime(i,e)}}),t.TickSource.prototype.getSecondsAtTime=function(e){e=this.toSeconds(e);var i=this._state.getLastState(t.State.Stopped,e),n={state:t.State.Paused,time:e};this._state.add(n);var s=i,r=0;return this._state.forEachBetween(i.time,e+this.sampleTime,function(e){var i=s.time,n=this._tickOffset.get(e.time);n.time>=s.time&&(r=n.seconds,i=n.time),s.state===t.State.Started&&e.state!==t.State.Started&&(r+=e.time-i),s=e}.bind(this)),this._state.remove(n),r},t.TickSource.prototype.setTicksAtTime=function(t,e){return e=this.toSeconds(e),this._tickOffset.cancel(e),this._tickOffset.add({time:e,ticks:t,seconds:this.frequency.getDurationOfTicks(t,e)}),this},t.TickSource.prototype.getStateAtTime=function(t){return t=this.toSeconds(t),this._state.getValueAtTime(t)},t.TickSource.prototype.getTimeOfTick=function(e,i){i=t.defaultArg(i,this.now());var n=this._tickOffset.get(i),s=this._state.get(i),r=Math.max(n.time,s.time),o=this.frequency.getTicksAtTime(r)+e-n.ticks;return this.frequency.getTimeOfTick(o)},t.TickSource.prototype.forEachTickBetween=function(e,i,n){var s=this._state.get(e);if(this._state.forEachBetween(e,i,function(i){s.state===t.State.Started&&i.state!==t.State.Started&&this.forEachTickBetween(Math.max(s.time,e),i.time-this.sampleTime,n),s=i}.bind(this)),e=Math.max(s.time,e),s.state===t.State.Started&&this._state){var r=this.frequency.getTicksAtTime(e),o=(r-this.frequency.getTicksAtTime(s.time))%1;0!==o&&(o=1-o);for(var a=this.frequency.getTimeOfTick(r+o),h=null;a<i&&this._state;){try{n(a,Math.round(this.getTicksAtTime(a)))}catch(t){h=t;break}this._state&&(a+=this.frequency.getDurationOfTicks(1,a))}}if(h)throw h;return this},t.TickSource.prototype.dispose=function(){return t.Param.prototype.dispose.call(this),this._state.dispose(),this._state=null,this._tickOffset.dispose(),this._tickOffset=null,this._writable("frequency"),this.frequency.dispose(),this.frequency=null,this},t.TickSource}),e(function(t){return t.Clock=function(){var e=t.defaults(arguments,["callback","frequency"],t.Clock);t.Emitter.call(this),this.callback=e.callback,this._nextTick=0,this._tickSource=new t.TickSource(e.frequency),this._lastUpdate=0,this.frequency=this._tickSource.frequency,this._readOnly("frequency"),this._state=new t.TimelineState(t.State.Stopped),this._state.setStateAtTime(t.State.Stopped,0),this._boundLoop=this._loop.bind(this),this.context.on("tick",this._boundLoop)},t.extend(t.Clock,t.Emitter),t.Clock.defaults={callback:t.noOp,frequency:1},Object.defineProperty(t.Clock.prototype,"state",{get:function(){return this._state.getValueAtTime(this.now())}}),t.Clock.prototype.start=function(e,i){return e=this.toSeconds(e),this._state.getValueAtTime(e)!==t.State.Started&&(this._state.setStateAtTime(t.State.Started,e),this._tickSource.start(e,i),e<this._lastUpdate&&this.emit("start",e,i)),this},t.Clock.prototype.stop=function(e){return e=this.toSeconds(e),this._state.cancel(e),this._state.setStateAtTime(t.State.Stopped,e),this._tickSource.stop(e),e<this._lastUpdate&&this.emit("stop",e),this},t.Clock.prototype.pause=function(e){return e=this.toSeconds(e),this._state.getValueAtTime(e)===t.State.Started&&(this._state.setStateAtTime(t.State.Paused,e),this._tickSource.pause(e),e<this._lastUpdate&&this.emit("pause",e)),this},Object.defineProperty(t.Clock.prototype,"ticks",{get:function(){return Math.ceil(this.getTicksAtTime(this.now()))},set:function(t){this._tickSource.ticks=t}}),Object.defineProperty(t.Clock.prototype,"seconds",{get:function(){return this._tickSource.seconds},set:function(t){this._tickSource.seconds=t}}),t.Clock.prototype.getSecondsAtTime=function(t){return this._tickSource.getSecondsAtTime(t)},t.Clock.prototype.setTicksAtTime=function(t,e){return this._tickSource.setTicksAtTime(t,e),this},t.Clock.prototype.getTicksAtTime=function(t){return this._tickSource.getTicksAtTime(t)},t.Clock.prototype.nextTickTime=function(t,e){e=this.toSeconds(e);var i=this.getTicksAtTime(e);return this._tickSource.getTimeOfTick(i+t,e)},t.Clock.prototype._loop=function(){var e=this._lastUpdate,i=this.now();this._lastUpdate=i,e!==i&&(this._state.forEachBetween(e,i,function(e){switch(e.state){case t.State.Started:var i=this._tickSource.getTicksAtTime(e.time);this.emit("start",e.time,i);break;case t.State.Stopped:0!==e.time&&this.emit("stop",e.time);break;case t.State.Paused:this.emit("pause",e.time)}}.bind(this)),this._tickSource.forEachTickBetween(e,i,function(t,e){this.callback(t,e)}.bind(this)))},t.Clock.prototype.getStateAtTime=function(t){return t=this.toSeconds(t),this._state.getValueAtTime(t)},t.Clock.prototype.dispose=function(){t.Emitter.prototype.dispose.call(this),this.context.off("tick",this._boundLoop),this._writable("frequency"),this._tickSource.dispose(),this._tickSource=null,this.frequency=null,this._boundLoop=null,this._nextTick=1/0,this.callback=null,this._state.dispose(),this._state=null},t.Clock}),e(function(t){t.IntervalTimeline=function(){t.call(this),this._root=null,this._length=0},t.extend(t.IntervalTimeline),t.IntervalTimeline.prototype.add=function(i){if(t.isUndef(i.time)||t.isUndef(i.duration))throw new Error("Tone.IntervalTimeline: events must have time and duration parameters");i.time=i.time.valueOf();var n=new e(i.time,i.time+i.duration,i);for(null===this._root?this._root=n:this._root.insert(n),this._length++;null!==n;)n.updateHeight(),n.updateMax(),this._rebalance(n),n=n.parent;return this},t.IntervalTimeline.prototype.remove=function(t){if(null!==this._root){var e=[];this._root.search(t.time,e);for(var i=0;i<e.length;i++){var n=e[i];if(n.event===t){this._removeNode(n),this._length--;break}}}return this},Object.defineProperty(t.IntervalTimeline.prototype,"length",{get:function(){return this._length}}),t.IntervalTimeline.prototype.cancel=function(t){return this.forEachFrom(t,function(t){this.remove(t)}.bind(this)),this},t.IntervalTimeline.prototype._setRoot=function(t){this._root=t,null!==this._root&&(this._root.parent=null)},t.IntervalTimeline.prototype._replaceNodeInParent=function(t,e){null!==t.parent?(t.isLeftChild()?t.parent.left=e:t.parent.right=e,this._rebalance(t.parent)):this._setRoot(e)},t.IntervalTimeline.prototype._removeNode=function(t){if(null===t.left&&null===t.right)this._replaceNodeInParent(t,null);else if(null===t.right)this._replaceNodeInParent(t,t.left);else if(null===t.left)this._replaceNodeInParent(t,t.right);else{var e,i;if(t.getBalance()>0)if(null===t.left.right)(e=t.left).right=t.right,i=e;else{for(e=t.left.right;null!==e.right;)e=e.right;e.parent.right=e.left,i=e.parent,e.left=t.left,e.right=t.right}else if(null===t.right.left)(e=t.right).left=t.left,i=e;else{for(e=t.right.left;null!==e.left;)e=e.left;e.parent=e.parent,e.parent.left=e.right,i=e.parent,e.left=t.left,e.right=t.right}null!==t.parent?t.isLeftChild()?t.parent.left=e:t.parent.right=e:this._setRoot(e),this._rebalance(i)}t.dispose()},t.IntervalTimeline.prototype._rotateLeft=function(t){var e=t.parent,i=t.isLeftChild(),n=t.right;t.right=n.left,n.left=t,null!==e?i?e.left=n:e.right=n:this._setRoot(n)},t.IntervalTimeline.prototype._rotateRight=function(t){var e=t.parent,i=t.isLeftChild(),n=t.left;t.left=n.right,n.right=t,null!==e?i?e.left=n:e.right=n:this._setRoot(n)},t.IntervalTimeline.prototype._rebalance=function(t){var e=t.getBalance();e>1?t.left.getBalance()<0?this._rotateLeft(t.left):this._rotateRight(t):e<-1&&(t.right.getBalance()>0?this._rotateRight(t.right):this._rotateLeft(t))},t.IntervalTimeline.prototype.get=function(t){if(null!==this._root){var e=[];if(this._root.search(t,e),e.length>0){for(var i=e[0],n=1;n<e.length;n++)e[n].low>i.low&&(i=e[n]);return i.event}}return null},t.IntervalTimeline.prototype.forEach=function(t){if(null!==this._root){var e=[];this._root.traverse(function(t){e.push(t)});for(var i=0;i<e.length;i++){var n=e[i].event;n&&t(n)}}return this},t.IntervalTimeline.prototype.forEachAtTime=function(t,e){if(null!==this._root){var i=[];this._root.search(t,i);for(var n=i.length-1;n>=0;n--){var s=i[n].event;s&&e(s)}}return this},t.IntervalTimeline.prototype.forEachFrom=function(t,e){if(null!==this._root){var i=[];this._root.searchAfter(t,i);for(var n=i.length-1;n>=0;n--){e(i[n].event)}}return this},t.IntervalTimeline.prototype.dispose=function(){var t=[];null!==this._root&&this._root.traverse(function(e){t.push(e)});for(var e=0;e<t.length;e++)t[e].dispose();return t=null,this._root=null,this};var e=function(t,e,i){this.event=i,this.low=t,this.high=e,this.max=this.high,this._left=null,this._right=null,this.parent=null,this.height=0};return e.prototype.insert=function(t){t.low<=this.low?null===this.left?this.left=t:this.left.insert(t):null===this.right?this.right=t:this.right.insert(t)},e.prototype.search=function(t,e){t>this.max||(null!==this.left&&this.left.search(t,e),this.low<=t&&this.high>t&&e.push(this),this.low>t||null!==this.right&&this.right.search(t,e))},e.prototype.searchAfter=function(t,e){this.low>=t&&(e.push(this),null!==this.left&&this.left.searchAfter(t,e)),null!==this.right&&this.right.searchAfter(t,e)},e.prototype.traverse=function(t){t(this),null!==this.left&&this.left.traverse(t),null!==this.right&&this.right.traverse(t)},e.prototype.updateHeight=function(){null!==this.left&&null!==this.right?this.height=Math.max(this.left.height,this.right.height)+1:null!==this.right?this.height=this.right.height+1:null!==this.left?this.height=this.left.height+1:this.height=0},e.prototype.updateMax=function(){this.max=this.high,null!==this.left&&(this.max=Math.max(this.max,this.left.max)),null!==this.right&&(this.max=Math.max(this.max,this.right.max))},e.prototype.getBalance=function(){var t=0;return null!==this.left&&null!==this.right?t=this.left.height-this.right.height:null!==this.left?t=this.left.height+1:null!==this.right&&(t=-(this.right.height+1)),t},e.prototype.isLeftChild=function(){return null!==this.parent&&this.parent.left===this},Object.defineProperty(e.prototype,"left",{get:function(){return this._left},set:function(t){this._left=t,null!==t&&(t.parent=this),this.updateHeight(),this.updateMax()}}),Object.defineProperty(e.prototype,"right",{get:function(){return this._right},set:function(t){this._right=t,null!==t&&(t.parent=this),this.updateHeight(),this.updateMax()}}),e.prototype.dispose=function(){this.parent=null,this._left=null,this._right=null,this.event=null},t.IntervalTimeline}),e(function(t){return t.Ticks=function(e,i){if(!(this instanceof t.Ticks))return new t.Ticks(e,i);t.TransportTime.call(this,e,i)},t.extend(t.Ticks,t.TransportTime),t.Ticks.prototype._defaultUnits="i",t.Ticks.prototype._now=function(){return t.Transport.ticks},t.Ticks.prototype._beatsToUnits=function(t){return this._getPPQ()*t},t.Ticks.prototype._secondsToUnits=function(t){return t/(60/this._getBpm())*this._getPPQ()},t.Ticks.prototype._ticksToUnits=function(t){return t},t.Ticks.prototype.toTicks=function(){return this.valueOf()},t.Ticks.prototype.toSeconds=function(){return this.valueOf()/this._getPPQ()*(60/this._getBpm())},t.Ticks}),e(function(t){return t.TransportEvent=function(e,i){i=t.defaultArg(i,t.TransportEvent.defaults),t.call(this),this.Transport=e,this.id=t.TransportEvent._eventId++,this.time=t.Ticks(i.time),this.callback=i.callback,this._once=i.once},t.extend(t.TransportEvent),t.TransportEvent.defaults={once:!1,callback:t.noOp},t.TransportEvent._eventId=0,t.TransportEvent.prototype.invoke=function(t){this.callback&&(this.callback(t),this._once&&this.Transport&&this.Transport.clear(this.id))},t.TransportEvent.prototype.dispose=function(){return t.prototype.dispose.call(this),this.Transport=null,this.callback=null,this.time=null,this},t.TransportEvent}),e(function(t){return t.TransportRepeatEvent=function(e,i){t.TransportEvent.call(this,e,i),i=t.defaultArg(i,t.TransportRepeatEvent.defaults),this.duration=t.Ticks(i.duration),this._interval=t.Ticks(i.interval),this._currentId=-1,this._nextId=-1,this._nextTick=this.time,this._boundRestart=this._restart.bind(this),this.Transport.on("start loopStart",this._boundRestart),this._restart()},t.extend(t.TransportRepeatEvent,t.TransportEvent),t.TransportRepeatEvent.defaults={duration:1/0,interval:1},t.TransportRepeatEvent.prototype.invoke=function(e){this._createEvents(e),t.TransportEvent.prototype.invoke.call(this,e)},t.TransportRepeatEvent.prototype._createEvents=function(e){var i=this.Transport.getTicksAtTime(e);i>=this.time&&i>=this._nextTick&&this._nextTick+this._interval<this.time+this.duration&&(this._nextTick+=this._interval,this._currentId=this._nextId,this._nextId=this.Transport.scheduleOnce(this.invoke.bind(this),t.Ticks(this._nextTick)))},t.TransportRepeatEvent.prototype._restart=function(e){this.Transport.clear(this._currentId),this.Transport.clear(this._nextId),this._nextTick=this.time;var i=this.Transport.getTicksAtTime(e);i>this.time&&(this._nextTick=this.time+Math.ceil((i-this.time)/this._interval)*this._interval),this._currentId=this.Transport.scheduleOnce(this.invoke.bind(this),t.Ticks(this._nextTick)),this._nextTick+=this._interval,this._nextId=this.Transport.scheduleOnce(this.invoke.bind(this),t.Ticks(this._nextTick))},t.TransportRepeatEvent.prototype.dispose=function(){return this.Transport.clear(this._currentId),this.Transport.clear(this._nextId),this.Transport.off("start loopStart",this._boundRestart),this._boundCreateEvents=null,t.TransportEvent.prototype.dispose.call(this),this.duration=null,this._interval=null,this},t.TransportRepeatEvent}),e(function(t){t.Transport=function(){t.Emitter.call(this),t.getContext(function(){this.loop=!1,this._loopStart=0,this._loopEnd=0,this._ppq=e.defaults.PPQ,this._clock=new t.Clock({callback:this._processTick.bind(this),frequency:0}),this._bindClockEvents(),this.bpm=this._clock.frequency,this.bpm._toUnits=this._toUnits.bind(this),this.bpm._fromUnits=this._fromUnits.bind(this),this.bpm.units=t.Type.BPM,this.bpm.value=e.defaults.bpm,this._readOnly("bpm"),this._timeSignature=e.defaults.timeSignature,this._scheduledEvents={},this._timeline=new t.Timeline,this._repeatedEvents=new t.IntervalTimeline,this._syncedSignals=[],this._swingTicks=e.defaults.PPQ/2,this._swingAmount=0}.bind(this))},t.extend(t.Transport,t.Emitter),t.Transport.defaults={bpm:120,swing:0,swingSubdivision:"8n",timeSignature:4,loopStart:0,loopEnd:"4m",PPQ:192},t.Transport.prototype._processTick=function(e,i){if(this._swingAmount>0&&i%this._ppq!=0&&i%(2*this._swingTicks)!=0){var n=i%(2*this._swingTicks)/(2*this._swingTicks),s=Math.sin(n*Math.PI)*this._swingAmount;e+=t.Ticks(2*this._swingTicks/3).toSeconds()*s}this.loop&&i>=this._loopEnd&&(this.emit("loopEnd",e),this._clock.setTicksAtTime(this._loopStart,e),i=this._loopStart,this.emit("loopStart",e,this._clock.getSecondsAtTime(e)),this.emit("loop",e)),this._timeline.forEachAtTime(i,function(t){t.invoke(e)})},t.Transport.prototype.schedule=function(e,i){var n=new t.TransportEvent(this,{time:t.TransportTime(i),callback:e});return this._addEvent(n,this._timeline)},t.Transport.prototype.scheduleRepeat=function(e,i,n,s){var r=new t.TransportRepeatEvent(this,{callback:e,interval:t.Time(i),time:t.TransportTime(n),duration:t.Time(t.defaultArg(s,1/0))});return this._addEvent(r,this._repeatedEvents)},t.Transport.prototype.scheduleOnce=function(e,i){var n=new t.TransportEvent(this,{time:t.TransportTime(i),callback:e,once:!0});return this._addEvent(n,this._timeline)},t.Transport.prototype.clear=function(t){if(this._scheduledEvents.hasOwnProperty(t)){var e=this._scheduledEvents[t.toString()];e.timeline.remove(e.event),e.event.dispose(),delete this._scheduledEvents[t.toString()]}return this},t.Transport.prototype._addEvent=function(t,e){return this._scheduledEvents[t.id.toString()]={event:t,timeline:e},e.add(t),t.id},t.Transport.prototype.cancel=function(e){return e=t.defaultArg(e,0),e=this.toTicks(e),this._timeline.forEachFrom(e,function(t){this.clear(t.id)}.bind(this)),this._repeatedEvents.forEachFrom(e,function(t){this.clear(t.id)}.bind(this)),this},t.Transport.prototype._bindClockEvents=function(){this._clock.on("start",function(e,i){i=t.Ticks(i).toSeconds(),this.emit("start",e,i)}.bind(this)),this._clock.on("stop",function(t){this.emit("stop",t)}.bind(this)),this._clock.on("pause",function(t){this.emit("pause",t)}.bind(this))},Object.defineProperty(t.Transport.prototype,"state",{get:function(){return this._clock.getStateAtTime(this.now())}}),t.Transport.prototype.start=function(e,i){return t.isDefined(i)&&(i=this.toTicks(i)),this._clock.start(e,i),this},t.Transport.prototype.stop=function(t){return this._clock.stop(t),this},t.Transport.prototype.pause=function(t){return this._clock.pause(t),this},t.Transport.prototype.toggle=function(e){return e=this.toSeconds(e),this._clock.getStateAtTime(e)!==t.State.Started?this.start(e):this.stop(e),this},Object.defineProperty(t.Transport.prototype,"timeSignature",{get:function(){return this._timeSignature},set:function(e){t.isArray(e)&&(e=e[0]/e[1]*4),this._timeSignature=e}}),Object.defineProperty(t.Transport.prototype,"loopStart",{get:function(){return t.Ticks(this._loopStart).toSeconds()},set:function(t){this._loopStart=this.toTicks(t)}}),Object.defineProperty(t.Transport.prototype,"loopEnd",{get:function(){return t.Ticks(this._loopEnd).toSeconds()},set:function(t){this._loopEnd=this.toTicks(t)}}),t.Transport.prototype.setLoopPoints=function(t,e){return this.loopStart=t,this.loopEnd=e,this},Object.defineProperty(t.Transport.prototype,"swing",{get:function(){return this._swingAmount},set:function(t){this._swingAmount=t}}),Object.defineProperty(t.Transport.prototype,"swingSubdivision",{get:function(){return t.Ticks(this._swingTicks).toNotation()},set:function(t){this._swingTicks=this.toTicks(t)}}),Object.defineProperty(t.Transport.prototype,"position",{get:function(){var e=this.now(),i=this._clock.getTicksAtTime(e);return t.Ticks(i).toBarsBeatsSixteenths()},set:function(t){var e=this.toTicks(t);this.ticks=e}}),Object.defineProperty(t.Transport.prototype,"seconds",{get:function(){return this._clock.seconds},set:function(t){var e=this.now(),i=this.bpm.timeToTicks(t,e);this.ticks=i}}),Object.defineProperty(t.Transport.prototype,"progress",{get:function(){if(this.loop){var t=this.now();return(this._clock.getTicksAtTime(t)-this._loopStart)/(this._loopEnd-this._loopStart)}return 0}}),Object.defineProperty(t.Transport.prototype,"ticks",{get:function(){return this._clock.ticks},set:function(e){if(this._clock.ticks!==e){var i=this.now();this.state===t.State.Started?(this.emit("stop",i),this._clock.setTicksAtTime(e,i),this.emit("start",i,this.seconds)):this._clock.setTicksAtTime(e,i)}}}),t.Transport.prototype.getTicksAtTime=function(t){return Math.round(this._clock.getTicksAtTime(t))},t.Transport.prototype.getSecondsAtTime=function(t){return this._clock.getSecondsAtTime(t)},Object.defineProperty(t.Transport.prototype,"PPQ",{get:function(){return this._ppq},set:function(t){var e=this.bpm.value;this._ppq=t,this.bpm.value=e}}),t.Transport.prototype._fromUnits=function(t){return 1/(60/t/this.PPQ)},t.Transport.prototype._toUnits=function(t){return t/this.PPQ*60},t.Transport.prototype.nextSubdivision=function(e){if(e=this.toTicks(e),this.state!==t.State.Started)return 0;var i=this.now(),n=e-this.getTicksAtTime(i)%e;return this._clock.nextTickTime(n,i)},t.Transport.prototype.syncSignal=function(e,i){if(!i){var n=this.now();i=0!==e.getValueAtTime(n)?e.getValueAtTime(n)/this.bpm.getValueAtTime(n):0}var s=new t.Gain(i);return this.bpm.chain(s,e._param),this._syncedSignals.push({ratio:s,signal:e,initial:e.value}),e.value=0,this},t.Transport.prototype.unsyncSignal=function(t){for(var e=this._syncedSignals.length-1;e>=0;e--){var i=this._syncedSignals[e];i.signal===t&&(i.ratio.dispose(),i.signal.value=i.initial,this._syncedSignals.splice(e,1))}return this},t.Transport.prototype.dispose=function(){return t.Emitter.prototype.dispose.call(this),this._clock.dispose(),this._clock=null,this._writable("bpm"),this.bpm=null,this._timeline.dispose(),this._timeline=null,this._repeatedEvents.dispose(),this._repeatedEvents=null,this};var e=t.Transport;return t.Transport=new e,t.Context.on("init",function(i){i.Transport instanceof e?t.Transport=i.Transport:t.Transport=new e,i.Transport=t.Transport}),t.Context.on("close",function(t){t.Transport instanceof e&&t.Transport.dispose()}),t.Transport}),e(function(t){return t.Volume=function(){var e=t.defaults(arguments,["volume"],t.Volume);t.AudioNode.call(this),this.output=this.input=new t.Gain(e.volume,t.Type.Decibels),this._unmutedVolume=e.volume,this.volume=this.output.gain,this._readOnly("volume"),this.mute=e.mute},t.extend(t.Volume,t.AudioNode),t.Volume.defaults={volume:0,mute:!1},Object.defineProperty(t.Volume.prototype,"mute",{get:function(){return this.volume.value===-1/0},set:function(t){!this.mute&&t?(this._unmutedVolume=this.volume.value,this.volume.value=-1/0):this.mute&&!t&&(this.volume.value=this._unmutedVolume)}}),t.Volume.prototype.dispose=function(){return this.input.dispose(),t.AudioNode.prototype.dispose.call(this),this._writable("volume"),this.volume.dispose(),this.volume=null,this},t.Volume}),e(function(t){t.Master=function(){t.AudioNode.call(this),t.getContext(function(){this.createInsOuts(1,0),this._volume=this.output=new t.Volume,this.volume=this._volume.volume,this._readOnly("volume"),this.input.chain(this.output,this.context.destination)}.bind(this))},t.extend(t.Master,t.AudioNode),t.Master.defaults={volume:0,mute:!1},Object.defineProperty(t.Master.prototype,"mute",{get:function(){return this._volume.mute},set:function(t){this._volume.mute=t}}),t.Master.prototype.chain=function(){this.input.disconnect(),this.input.chain.apply(this.input,arguments),arguments[arguments.length-1].connect(this.output)},t.Master.prototype.dispose=function(){t.AudioNode.prototype.dispose.call(this),this._writable("volume"),this._volume.dispose(),this._volume=null,this.volume=null},t.AudioNode.prototype.toMaster=function(){return this.connect(t.Master),this},window.AudioNode&&(AudioNode.prototype.toMaster=function(){return this.connect(t.Master),this});var e=t.Master;return t.Master=new e,t.Context.on("init",function(i){i.Master instanceof e?t.Master=i.Master:t.Master=new e,i.Master=t.Master}),t.Context.on("close",function(t){t.Master instanceof e&&t.Master.dispose()}),t.Master}),e(function(t){return t.Source=function(e){e=t.defaultArg(e,t.Source.defaults),t.AudioNode.call(this),this._volume=this.output=new t.Volume(e.volume),this.volume=this._volume.volume,this._readOnly("volume"),this._state=new t.TimelineState(t.State.Stopped),this._state.memory=100,this._synced=!1,this._scheduled=[],this._volume.output.output.channelCount=2,this._volume.output.output.channelCountMode="explicit",this.mute=e.mute},t.extend(t.Source,t.AudioNode),t.Source.defaults={volume:0,mute:!1},Object.defineProperty(t.Source.prototype,"state",{get:function(){return this._synced?t.Transport.state===t.State.Started?this._state.getValueAtTime(t.Transport.seconds):t.State.Stopped:this._state.getValueAtTime(this.now())}}),Object.defineProperty(t.Source.prototype,"mute",{get:function(){return this._volume.mute},set:function(t){this._volume.mute=t}}),t.Source.prototype._start=t.noOp,t.Source.prototype.restart=t.noOp,t.Source.prototype._stop=t.noOp,t.Source.prototype.start=function(e,i,n){if(e=t.isUndef(e)&&this._synced?t.Transport.seconds:this.toSeconds(e),this._state.getValueAtTime(e)===t.State.Started)this._state.cancel(e),this._state.setStateAtTime(t.State.Started,e),this.restart(e,i,n);else if(this._state.setStateAtTime(t.State.Started,e),this._synced){var s=this._state.get(e);s.offset=t.defaultArg(i,0),s.duration=n;var r=t.Transport.schedule(function(t){this._start(t,i,n)}.bind(this),e);this._scheduled.push(r),t.Transport.state===t.State.Started&&this._syncedStart(this.now(),t.Transport.seconds)}else this._start.apply(this,arguments);return this},t.Source.prototype.stop=function(e){if(e=t.isUndef(e)&&this._synced?t.Transport.seconds:this.toSeconds(e),this._synced){var i=t.Transport.schedule(this._stop.bind(this),e);this._scheduled.push(i)}else this._stop.apply(this,arguments);return this._state.cancel(e),this._state.setStateAtTime(t.State.Stopped,e),this},t.Source.prototype.sync=function(){return this._synced=!0,this._syncedStart=function(e,i){if(i>0){var n=this._state.get(i);if(n&&n.state===t.State.Started&&n.time!==i){var s,r=i-this.toSeconds(n.time);n.duration&&(s=this.toSeconds(n.duration)-r),this._start(e,this.toSeconds(n.offset)+r,s)}}}.bind(this),this._syncedStop=function(e){var i=t.Transport.getSecondsAtTime(Math.max(e-this.sampleTime,0));this._state.getValueAtTime(i)===t.State.Started&&this._stop(e)}.bind(this),t.Transport.on("start loopStart",this._syncedStart),t.Transport.on("stop pause loopEnd",this._syncedStop),this},t.Source.prototype.unsync=function(){this._synced&&(t.Transport.off("stop pause loopEnd",this._syncedStop),t.Transport.off("start loopStart",this._syncedStart)),this._synced=!1;for(var e=0;e<this._scheduled.length;e++){var i=this._scheduled[e];t.Transport.clear(i)}return this._scheduled=[],this._state.cancel(0),this},t.Source.prototype.dispose=function(){t.AudioNode.prototype.dispose.call(this),this.unsync(),this._scheduled=null,this._writable("volume"),this._volume.dispose(),this._volume=null,this.volume=null,this._state.dispose(),this._state=null},t.Source}),e(function(t){t.supported&&(AudioBuffer.prototype.copyToChannel||(AudioBuffer.prototype.copyToChannel=function(t,e,i){var n=this.getChannelData(e);i=i||0;for(var s=0;s<n.length;s++)n[s+i]=t[s]},AudioBuffer.prototype.copyFromChannel=function(t,e,i){var n=this.getChannelData(e);i=i||0;for(var s=0;s<t.length;s++)t[s]=n[s+i]}))}),e(function(t){return t.Buffer=function(){var e=t.defaults(arguments,["url","onload","onerror"],t.Buffer);t.call(this),this._buffer=null,this._reversed=e.reverse,this._xhr=null,this._onload=t.noOp,e.url instanceof AudioBuffer||e.url instanceof t.Buffer?(this.set(e.url),e.onload&&(this.loaded?e.onload(this):this._onload=e.onload)):t.isString(e.url)&&this.load(e.url).then(e.onload).catch(e.onerror)},t.extend(t.Buffer),t.Buffer.defaults={url:void 0,reverse:!1,onload:t.noOp,onerror:t.noOp},t.Buffer.prototype.set=function(e){return e instanceof t.Buffer?e.loaded?this._buffer=e.get():e._onload=function(){this.set(e),this._onload(this)}.bind(this):this._buffer=e,this},t.Buffer.prototype.get=function(){return this._buffer},t.Buffer.prototype.load=function(e,i,n){return new Promise(function(s,r){this._xhr=t.Buffer.load(e,function(t){this._xhr=null,this.set(t),s(this),this._onload(this),i&&i(this)}.bind(this),function(t){this._xhr=null,r(t),n&&n(t)}.bind(this))}.bind(this))},t.Buffer.prototype.dispose=function(){return t.prototype.dispose.call(this),this._buffer=null,this._xhr&&(t.Buffer._removeFromDownloadQueue(this._xhr),this._xhr.abort(),this._xhr=null),this},Object.defineProperty(t.Buffer.prototype,"loaded",{get:function(){return this.length>0}}),Object.defineProperty(t.Buffer.prototype,"duration",{get:function(){return this._buffer?this._buffer.duration:0}}),Object.defineProperty(t.Buffer.prototype,"length",{get:function(){return this._buffer?this._buffer.length:0}}),Object.defineProperty(t.Buffer.prototype,"numberOfChannels",{get:function(){return this._buffer?this._buffer.numberOfChannels:0}}),t.Buffer.prototype.fromArray=function(t){var e=t[0].length>0,i=e?t.length:1,n=e?t[0].length:t.length,s=this.context.createBuffer(i,n,this.context.sampleRate);e||1!==i||(t=[t]);for(var r=0;r<i;r++)s.copyToChannel(t[r],r);return this._buffer=s,this},t.Buffer.prototype.toMono=function(e){if(t.isNumber(e))this.fromArray(this.toArray(e));else{for(var i=new Float32Array(this.length),n=this.numberOfChannels,s=0;s<n;s++)for(var r=this.toArray(s),o=0;o<r.length;o++)i[o]+=r[o];i=i.map(function(t){return t/n}),this.fromArray(i)}return this},t.Buffer.prototype.toArray=function(e){if(t.isNumber(e))return this.getChannelData(e);if(1===this.numberOfChannels)return this.toArray(0);for(var i=[],n=0;n<this.numberOfChannels;n++)i[n]=this.getChannelData(n);return i},t.Buffer.prototype.getChannelData=function(t){return this._buffer.getChannelData(t)},t.Buffer.prototype.slice=function(e,i){i=t.defaultArg(i,this.duration);for(var n=Math.floor(this.context.sampleRate*this.toSeconds(e)),s=Math.floor(this.context.sampleRate*this.toSeconds(i)),r=[],o=0;o<this.numberOfChannels;o++)r[o]=this.toArray(o).slice(n,s);return(new t.Buffer).fromArray(r)},t.Buffer.prototype._reverse=function(){if(this.loaded)for(var t=0;t<this.numberOfChannels;t++)Array.prototype.reverse.call(this.getChannelData(t));return this},Object.defineProperty(t.Buffer.prototype,"reverse",{get:function(){return this._reversed},set:function(t){this._reversed!==t&&(this._reversed=t,this._reverse())}}),t.Emitter.mixin(t.Buffer),t.Buffer._downloadQueue=[],t.Buffer.baseUrl="",t.Buffer.fromArray=function(e){return(new t.Buffer).fromArray(e)},t.Buffer.fromUrl=function(e){var i=new t.Buffer;return i.load(e).then(function(){return i})},t.Buffer._removeFromDownloadQueue=function(e){var i=t.Buffer._downloadQueue.indexOf(e);-1!==i&&t.Buffer._downloadQueue.splice(i,1)},t.Buffer.load=function(e,i,n){i=t.defaultArg(i,t.noOp);var s=e.match(/\[(.+\|?)+\]$/);if(s){for(var r=s[1].split("|"),o=r[0],a=0;a<r.length;a++)if(t.Buffer.supportsType(r[a])){o=r[a];break}e=e.replace(s[0],o)}function h(e){if(t.Buffer._removeFromDownloadQueue(l),t.Buffer.emit("error",e),!n)throw e;n(e)}function u(){for(var e=0,i=0;i<t.Buffer._downloadQueue.length;i++)e+=t.Buffer._downloadQueue[i].progress;t.Buffer.emit("progress",e/t.Buffer._downloadQueue.length)}var l=new XMLHttpRequest;return l.open("GET",t.Buffer.baseUrl+e,!0),l.responseType="arraybuffer",l.progress=0,t.Buffer._downloadQueue.push(l),l.addEventListener("load",function(){200===l.status?t.context.decodeAudioData(l.response).then(function(e){l.progress=1,u(),i(e),t.Buffer._removeFromDownloadQueue(l),0===t.Buffer._downloadQueue.length&&t.Buffer.emit("load")}).catch(function(){t.Buffer._removeFromDownloadQueue(l),h("Tone.Buffer: could not decode audio data: "+e)}):h("Tone.Buffer: could not locate file: "+e)}),l.addEventListener("error",h),l.addEventListener("progress",function(t){t.lengthComputable&&(l.progress=t.loaded/t.total*.95,u())}),l.send(),l},t.Buffer.cancelDownloads=function(){return t.Buffer._downloadQueue.slice().forEach(function(e){t.Buffer._removeFromDownloadQueue(e),e.abort()}),t.Buffer},t.Buffer.supportsType=function(t){var e=t.split(".");return e=e[e.length-1],""!==document.createElement("audio").canPlayType("audio/"+e)},t.loaded=function(){var e,i;function n(){t.Buffer.off("load",e),t.Buffer.off("error",i)}return new Promise(function(n,s){e=function(){n()},i=function(){s()},t.Buffer.on("load",e),t.Buffer.on("error",i)}).then(n).catch(function(t){throw n(),new Error(t)})},t.Buffer}),e(function(t){return t.OscillatorNode=function(){var e=t.defaults(arguments,["frequency","type"],t.OscillatorNode);t.AudioNode.call(this,e),this.onended=e.onended,this._startTime=-1,this._stopTime=-1,this._gainNode=this.output=new t.Gain,this._gainNode.gain.setValueAtTime(0,this.context.currentTime),this._oscillator=this.context.createOscillator(),this._oscillator.connect(this._gainNode),this.type=e.type,this.frequency=new t.Param(this._oscillator.frequency,t.Type.Frequency),this.frequency.value=e.frequency,this.detune=new t.Param(this._oscillator.detune,t.Type.Cents),this.detune.value=e.detune,this._gain=1},t.extend(t.OscillatorNode,t.AudioNode),t.OscillatorNode.defaults={frequency:440,detune:0,type:"sine",onended:t.noOp},Object.defineProperty(t.OscillatorNode.prototype,"state",{get:function(){return this.getStateAtTime(this.now())}}),t.OscillatorNode.prototype.getStateAtTime=function(e){return e=this.toSeconds(e),-1!==this._startTime&&e>=this._startTime&&(-1===this._stopTime||e<=this._stopTime)?t.State.Started:t.State.Stopped},t.OscillatorNode.prototype.start=function(t){if(-1!==this._startTime)throw new Error("cannot call OscillatorNode.start more than once");this._startTime=this.toSeconds(t),this._oscillator.start(this._startTime);var e=this.context.currentTime;return this._gainNode.gain.cancelScheduledValues(e),this._gainNode.gain.setValueAtTime(0,e),this._gainNode.gain.setValueAtTime(1,this._startTime),this},t.OscillatorNode.prototype.setPeriodicWave=function(t){return this._oscillator.setPeriodicWave(t),this},t.OscillatorNode.prototype.stop=function(t){return this.cancelStop(),this._stopTime=this.toSeconds(t),this._gainNode.gain.setValueAtTime(0,this._stopTime),this.context.clearTimeout(this._timeout),this._timeout=this.context.setTimeout(function(){this._oscillator.stop(this.now()),this.onended()}.bind(this),this._stopTime-this.now()),this},t.OscillatorNode.prototype.cancelStop=function(){return-1!==this._startTime&&(this._gainNode.gain.cancelScheduledValues(this._startTime+this.sampleTime),this._gainNode.gain.setValueAtTime(1,Math.max(this.now(),this._startTime)),this.context.clearTimeout(this._timeout),this._stopTime=-1),this},Object.defineProperty(t.OscillatorNode.prototype,"type",{get:function(){return this._oscillator.type},set:function(t){this._oscillator.type=t}}),t.OscillatorNode.prototype.dispose=function(){return this.context.clearTimeout(this._timeout),t.AudioNode.prototype.dispose.call(this),this.onended=null,this._oscillator.disconnect(),this._oscillator=null,this._gainNode.dispose(),this._gainNode=null,this.frequency.dispose(),this.frequency=null,this.detune.dispose(),this.detune=null,this},t.OscillatorNode}),e(function(t){return t.Oscillator=function(){var e=t.defaults(arguments,["frequency","type"],t.Oscillator);t.Source.call(this,e),this._oscillator=null,this.frequency=new t.Signal(e.frequency,t.Type.Frequency),this.detune=new t.Signal(e.detune,t.Type.Cents),this._wave=null,this._partials=t.defaultArg(e.partials,[1]),this._phase=e.phase,this._type=null,this.type=e.type,this.phase=this._phase,this._readOnly(["frequency","detune"])},t.extend(t.Oscillator,t.Source),t.Oscillator.defaults={type:"sine",frequency:440,detune:0,phase:0,partials:[]},t.Oscillator.Type={Sine:"sine",Triangle:"triangle",Sawtooth:"sawtooth",Square:"square",Custom:"custom"},t.Oscillator.prototype._start=function(e){this._oscillator=new t.OscillatorNode,this._wave?this._oscillator.setPeriodicWave(this._wave):this._oscillator.type=this._type,this._oscillator.connect(this.output),this.frequency.connect(this._oscillator.frequency),this.detune.connect(this._oscillator.detune),e=this.toSeconds(e),this._oscillator.start(e)},t.Oscillator.prototype._stop=function(t){return this._oscillator&&(t=this.toSeconds(t),this._oscillator.stop(t)),this},t.Oscillator.prototype.restart=function(t){return this._oscillator.cancelStop(),this._state.cancel(this.toSeconds(t)),this},t.Oscillator.prototype.syncFrequency=function(){return t.Transport.syncSignal(this.frequency),this},t.Oscillator.prototype.unsyncFrequency=function(){return t.Transport.unsyncSignal(this.frequency),this},Object.defineProperty(t.Oscillator.prototype,"type",{get:function(){return this._type},set:function(e){var i=[t.Oscillator.Type.Sine,t.Oscillator.Type.Square,t.Oscillator.Type.Triangle,t.Oscillator.Type.Sawtooth].includes(e);if(0===this._phase&&i)this._wave=null,null!==this._oscillator&&this._oscillator.type;else{var n=this._getRealImaginary(e,this._phase),s=this.context.createPeriodicWave(n[0],n[1]);this._wave=s,null!==this._oscillator&&this._oscillator.setPeriodicWave(this._wave)}this._type=e}}),t.Oscillator.prototype._getRealImaginary=function(e,i){var n=2048,s=new Float32Array(n),r=new Float32Array(n),o=1;if(e===t.Oscillator.Type.Custom)n=o=this._partials.length+1;else{var a=/^(sine|triangle|square|sawtooth)(\d+)$/.exec(e);a&&(o=parseInt(a[2])+1,e=a[1],n=o=Math.max(o,2))}for(var h=1;h<n;++h){var u,l=2/(h*Math.PI);switch(e){case t.Oscillator.Type.Sine:u=h<=o?1:0;break;case t.Oscillator.Type.Square:u=1&h?2*l:0;break;case t.Oscillator.Type.Sawtooth:u=l*(1&h?1:-1);break;case t.Oscillator.Type.Triangle:u=1&h?l*l*2*(h-1>>1&1?-1:1):0;break;case t.Oscillator.Type.Custom:u=this._partials[h-1];break;default:throw new TypeError("Tone.Oscillator: invalid type: "+e)}0!==u?(s[h]=-u*Math.sin(i*h),r[h]=u*Math.cos(i*h)):(s[h]=0,r[h]=0)}return[s,r]},t.Oscillator.prototype._inverseFFT=function(t,e,i){for(var n=0,s=t.length,r=0;r<s;r++)n+=t[r]*Math.cos(r*i)+e[r]*Math.sin(r*i);return n},t.Oscillator.prototype._getInitialValue=function(){for(var t=this._getRealImaginary(this._type,0),e=t[0],i=t[1],n=0,s=2*Math.PI,r=0;r<8;r++)n=Math.max(this._inverseFFT(e,i,r/8*s),n);return-this._inverseFFT(e,i,this._phase)/n},Object.defineProperty(t.Oscillator.prototype,"partials",{get:function(){return this._type!==t.Oscillator.Type.Custom?[]:this._partials},set:function(e){this._partials=e,this.type=t.Oscillator.Type.Custom}}),Object.defineProperty(t.Oscillator.prototype,"phase",{get:function(){return this._phase*(180/Math.PI)},set:function(t){this._phase=t*Math.PI/180,this.type=this._type}}),t.Oscillator.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),null!==this._oscillator&&(this._oscillator.dispose(),this._oscillator=null),this._wave=null,this._writable(["frequency","detune"]),this.frequency.dispose(),this.frequency=null,this.detune.dispose(),this.detune=null,this._partials=null,this},t.Oscillator}),e(function(t){return t.AudioToGain=function(){t.SignalBase.call(this),this._norm=this.input=this.output=new t.WaveShaper(function(t){return(t+1)/2})},t.extend(t.AudioToGain,t.SignalBase),t.AudioToGain.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._norm.dispose(),this._norm=null,this},t.AudioToGain}),e(function(t){return t.Zero=function(){t.SignalBase.call(this),this._gain=this.input=this.output=new t.Gain,this.context.getConstant(0).connect(this._gain)},t.extend(t.Zero,t.SignalBase),t.Zero.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._gain.dispose(),this._gain=null,this},t.Zero}),e(function(t){return t.LFO=function(){var e=t.defaults(arguments,["frequency","min","max"],t.LFO);t.AudioNode.call(this),this._oscillator=new t.Oscillator({frequency:e.frequency,type:e.type}),this.frequency=this._oscillator.frequency,this.amplitude=this._oscillator.volume,this.amplitude.units=t.Type.NormalRange,this.amplitude.value=e.amplitude,this._stoppedSignal=new t.Signal(0,t.Type.AudioRange),this._zeros=new t.Zero,this._stoppedValue=0,this._a2g=new t.AudioToGain,this._scaler=this.output=new t.Scale(e.min,e.max),this._units=t.Type.Default,this.units=e.units,this._oscillator.chain(this._a2g,this._scaler),this._zeros.connect(this._a2g),this._stoppedSignal.connect(this._a2g),this._readOnly(["amplitude","frequency"]),this.phase=e.phase},t.extend(t.LFO,t.AudioNode),t.LFO.defaults={type:"sine",min:0,max:1,phase:0,frequency:"4n",amplitude:1,units:t.Type.Default},t.LFO.prototype.start=function(t){return t=this.toSeconds(t),this._stoppedSignal.setValueAtTime(0,t),this._oscillator.start(t),this},t.LFO.prototype.stop=function(t){return t=this.toSeconds(t),this._stoppedSignal.setValueAtTime(this._stoppedValue,t),this._oscillator.stop(t),this},t.LFO.prototype.sync=function(){return this._oscillator.sync(),this._oscillator.syncFrequency(),this},t.LFO.prototype.unsync=function(){return this._oscillator.unsync(),this._oscillator.unsyncFrequency(),this},Object.defineProperty(t.LFO.prototype,"min",{get:function(){return this._toUnits(this._scaler.min)},set:function(t){t=this._fromUnits(t),this._scaler.min=t}}),Object.defineProperty(t.LFO.prototype,"max",{get:function(){return this._toUnits(this._scaler.max)},set:function(t){t=this._fromUnits(t),this._scaler.max=t}}),Object.defineProperty(t.LFO.prototype,"type",{get:function(){return this._oscillator.type},set:function(t){this._oscillator.type=t,this._stoppedValue=this._oscillator._getInitialValue(),this._stoppedSignal.value=this._stoppedValue}}),Object.defineProperty(t.LFO.prototype,"phase",{get:function(){return this._oscillator.phase},set:function(t){this._oscillator.phase=t,this._stoppedValue=this._oscillator._getInitialValue(),this._stoppedSignal.value=this._stoppedValue}}),Object.defineProperty(t.LFO.prototype,"units",{get:function(){return this._units},set:function(t){var e=this.min,i=this.max;this._units=t,this.min=e,this.max=i}}),Object.defineProperty(t.LFO.prototype,"mute",{get:function(){return this._oscillator.mute},set:function(t){this._oscillator.mute=t}}),Object.defineProperty(t.LFO.prototype,"state",{get:function(){return this._oscillator.state}}),t.LFO.prototype.connect=function(e){return e.constructor!==t.Signal&&e.constructor!==t.Param||(this.convert=e.convert,this.units=e.units),t.SignalBase.prototype.connect.apply(this,arguments),this},t.LFO.prototype._fromUnits=t.Param.prototype._fromUnits,t.LFO.prototype._toUnits=t.Param.prototype._toUnits,t.LFO.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable(["amplitude","frequency"]),this._oscillator.dispose(),this._oscillator=null,this._stoppedSignal.dispose(),this._stoppedSignal=null,this._zeros.dispose(),this._zeros=null,this._scaler.dispose(),this._scaler=null,this._a2g.dispose(),this._a2g=null,this.frequency=null,this.amplitude=null,this},t.LFO}),e(function(t){return t.Limiter=function(){var e=t.defaults(arguments,["threshold"],t.Limiter);t.AudioNode.call(this),this._compressor=this.input=this.output=new t.Compressor({attack:.001,decay:.001,threshold:e.threshold}),this.threshold=this._compressor.threshold,this._readOnly("threshold")},t.extend(t.Limiter,t.AudioNode),t.Limiter.defaults={threshold:-12},t.Limiter.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._compressor.dispose(),this._compressor=null,this._writable("threshold"),this.threshold=null,this},t.Limiter}),e(function(t){return t.LowpassCombFilter=function(){var e=t.defaults(arguments,["delayTime","resonance","dampening"],t.LowpassCombFilter);t.AudioNode.call(this),this.createInsOuts(1,1),this._delay=this.input=new t.Delay(e.delayTime),this.delayTime=this._delay.delayTime,this._lowpass=this.output=this.context.createBiquadFilter(),this._lowpass.Q.value=-3.0102999566398125,this._lowpass.type="lowpass",this.dampening=new t.Param({param:this._lowpass.frequency,units:t.Type.Frequency,value:e.dampening}),this._feedback=new t.Gain(e.resonance,t.Type.NormalRange),this.resonance=this._feedback.gain,this._delay.chain(this._lowpass,this._feedback,this._delay),this._readOnly(["dampening","resonance","delayTime"])},t.extend(t.LowpassCombFilter,t.AudioNode),t.LowpassCombFilter.defaults={delayTime:.1,resonance:.5,dampening:3e3},t.LowpassCombFilter.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable(["dampening","resonance","delayTime"]),this.dampening.dispose(),this.dampening=null,this.resonance.dispose(),this.resonance=null,this._delay.dispose(),this._delay=null,this.delayTime=null,this._lowpass.disconnect(),this._lowpass=null,this._feedback.disconnect(),this._feedback=null,this},t.LowpassCombFilter}),e(function(t){return t.Merge=function(){t.AudioNode.call(this),this.createInsOuts(2,0),this.left=this.input[0]=new t.Gain,this.right=this.input[1]=new t.Gain,this._merger=this.output=this.context.createChannelMerger(2),this.left.connect(this._merger,0,0),this.right.connect(this._merger,0,1),this.left.channelCount=1,this.right.channelCount=1,this.left.channelCountMode="explicit",this.right.channelCountMode="explicit"},t.extend(t.Merge,t.AudioNode),t.Merge.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this.left.dispose(),this.left=null,this.right.dispose(),this.right=null,this._merger.disconnect(),this._merger=null,this},t.Merge}),e(function(t){return t.Meter=function(){var e=t.defaults(arguments,["smoothing"],t.Meter);t.AudioNode.call(this),this.input=this.output=this._analyser=new t.Analyser("waveform",1024),this.smoothing=e.smoothing},t.extend(t.Meter,t.AudioNode),t.Meter.defaults={smoothing:.8},t.Meter.prototype.getLevel=function(){this._analyser.type="fft";var t=this._analyser.getValue();return Math.max.apply(this,t)+28},t.Meter.prototype.getValue=function(){return this._analyser.type="waveform",this._analyser.getValue()[0]},Object.defineProperty(t.Meter.prototype,"smoothing",{get:function(){return this._analyser.smoothing},set:function(t){this._analyser.smoothing=t}}),t.Meter.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._analyser.dispose(),this._analyser=null,this},t.Meter}),e(function(t){return t.Split=function(){t.AudioNode.call(this),this.createInsOuts(0,2),this._splitter=this.input=this.context.createChannelSplitter(2),this._splitter.channelCount=2,this._splitter.channelCountMode="explicit",this.left=this.output[0]=new t.Gain,this.right=this.output[1]=new t.Gain,this._splitter.connect(this.left,0,0),this._splitter.connect(this.right,1,0)},t.extend(t.Split,t.AudioNode),t.Split.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._splitter.disconnect(),this.left.dispose(),this.left=null,this.right.dispose(),this.right=null,this._splitter=null,this},t.Split}),e(function(t){return t.MidSideSplit=function(){t.AudioNode.call(this),this.createInsOuts(0,2),this._split=this.input=new t.Split,this._midAdd=new t.Add,this.mid=this.output[0]=new t.Multiply(Math.SQRT1_2),this._sideSubtract=new t.Subtract,this.side=this.output[1]=new t.Multiply(Math.SQRT1_2),this._split.connect(this._midAdd,0,0),this._split.connect(this._midAdd,1,1),this._split.connect(this._sideSubtract,0,0),this._split.connect(this._sideSubtract,1,1),this._midAdd.connect(this.mid),this._sideSubtract.connect(this.side)},t.extend(t.MidSideSplit,t.AudioNode),t.MidSideSplit.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this.mid.dispose(),this.mid=null,this.side.dispose(),this.side=null,this._midAdd.dispose(),this._midAdd=null,this._sideSubtract.dispose(),this._sideSubtract=null,this._split.dispose(),this._split=null,this},t.MidSideSplit}),e(function(t){return t.MidSideMerge=function(){t.AudioNode.call(this),this.createInsOuts(2,0),this.mid=this.input[0]=new t.Gain,this._left=new t.Add,this._timesTwoLeft=new t.Multiply(Math.SQRT1_2),this.side=this.input[1]=new t.Gain,this._right=new t.Subtract,this._timesTwoRight=new t.Multiply(Math.SQRT1_2),this._merge=this.output=new t.Merge,this.mid.connect(this._left,0,0),this.side.connect(this._left,0,1),this.mid.connect(this._right,0,0),this.side.connect(this._right,0,1),this._left.connect(this._timesTwoLeft),this._right.connect(this._timesTwoRight),this._timesTwoLeft.connect(this._merge,0,0),this._timesTwoRight.connect(this._merge,0,1)},t.extend(t.MidSideMerge,t.AudioNode),t.MidSideMerge.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this.mid.dispose(),this.mid=null,this.side.dispose(),this.side=null,this._left.dispose(),this._left=null,this._timesTwoLeft.dispose(),this._timesTwoLeft=null,this._right.dispose(),this._right=null,this._timesTwoRight.dispose(),this._timesTwoRight=null,this._merge.dispose(),this._merge=null,this},t.MidSideMerge}),e(function(t){return t.MidSideCompressor=function(e){t.AudioNode.call(this),e=t.defaultArg(e,t.MidSideCompressor.defaults),this._midSideSplit=this.input=new t.MidSideSplit,this._midSideMerge=this.output=new t.MidSideMerge,this.mid=new t.Compressor(e.mid),this.side=new t.Compressor(e.side),this._midSideSplit.mid.chain(this.mid,this._midSideMerge.mid),this._midSideSplit.side.chain(this.side,this._midSideMerge.side),this._readOnly(["mid","side"])},t.extend(t.MidSideCompressor,t.AudioNode),t.MidSideCompressor.defaults={mid:{ratio:3,threshold:-24,release:.03,attack:.02,knee:16},side:{ratio:6,threshold:-30,release:.25,attack:.03,knee:10}},t.MidSideCompressor.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable(["mid","side"]),this.mid.dispose(),this.mid=null,this.side.dispose(),this.side=null,this._midSideSplit.dispose(),this._midSideSplit=null,this._midSideMerge.dispose(),this._midSideMerge=null,this},t.MidSideCompressor}),e(function(t){return t.Mono=function(){t.AudioNode.call(this),this.createInsOuts(1,0),this._merge=this.output=new t.Merge,this.input.connect(this._merge,0,0),this.input.connect(this._merge,0,1)},t.extend(t.Mono,t.AudioNode),t.Mono.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._merge.dispose(),this._merge=null,this},t.Mono}),e(function(t){return t.MultibandCompressor=function(e){t.AudioNode.call(this),e=t.defaultArg(arguments,t.MultibandCompressor.defaults),this._splitter=this.input=new t.MultibandSplit({lowFrequency:e.lowFrequency,highFrequency:e.highFrequency}),this.lowFrequency=this._splitter.lowFrequency,this.highFrequency=this._splitter.highFrequency,this.output=new t.Gain,this.low=new t.Compressor(e.low),this.mid=new t.Compressor(e.mid),this.high=new t.Compressor(e.high),this._splitter.low.chain(this.low,this.output),this._splitter.mid.chain(this.mid,this.output),this._splitter.high.chain(this.high,this.output),this._readOnly(["high","mid","low","highFrequency","lowFrequency"])},t.extend(t.MultibandCompressor,t.AudioNode),t.MultibandCompressor.defaults={low:t.Compressor.defaults,mid:t.Compressor.defaults,high:t.Compressor.defaults,lowFrequency:250,highFrequency:2e3},t.MultibandCompressor.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._splitter.dispose(),this._writable(["high","mid","low","highFrequency","lowFrequency"]),this.low.dispose(),this.mid.dispose(),this.high.dispose(),this._splitter=null,this.low=null,this.mid=null,this.high=null,this.lowFrequency=null,this.highFrequency=null,this},t.MultibandCompressor}),e(function(t){if(t.supported&&!window.StereoPannerNode){var e=function(e){this.context=e,this.pan=new t.Signal(0,t.Type.AudioRange);var i=new t.WaveShaper(function(e){return t.equalPowerScale((e+1)/2)},4096),n=new t.WaveShaper(function(e){return t.equalPowerScale(1-(e+1)/2)},4096),s=new t.Gain,r=new t.Gain,o=this.input=new t.Split;(new t.Zero).fan(i,n);var a=this.output=new t.Merge;o.left.chain(s,a.left),o.right.chain(r,a.right),this.pan.chain(n,s.gain),this.pan.chain(i,r.gain)};e.prototype.disconnect=function(){this.output.disconnect.apply(this.output,arguments)},e.prototype.connect=function(){this.output.connect.apply(this.output,arguments)},AudioContext.prototype.createStereoPanner=function(){return new e(this)},t.Context.prototype.createStereoPanner=function(){return new e(this)}}}),e(function(t){return t.Panner=function(e){t.AudioNode.call(this),this._panner=this.input=this.output=this.context.createStereoPanner(),this.pan=this._panner.pan,this.pan.value=t.defaultArg(e,0),this._readOnly("pan")},t.extend(t.Panner,t.AudioNode),t.Panner.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable("pan"),this._panner.disconnect(),this._panner=null,this.pan=null,this},t.Panner}),e(function(t){return t.Panner3D=function(){var e=t.defaults(arguments,["positionX","positionY","positionZ"],t.Panner3D);t.AudioNode.call(this),this._panner=this.input=this.output=this.context.createPanner(),this._panner.panningModel=e.panningModel,this._panner.maxDistance=e.maxDistance,this._panner.distanceModel=e.distanceModel,this._panner.coneOuterGain=e.coneOuterGain,this._panner.coneOuterAngle=e.coneOuterAngle,this._panner.coneInnerAngle=e.coneInnerAngle,this._panner.refDistance=e.refDistance,this._panner.rolloffFactor=e.rolloffFactor,this._orientation=[e.orientationX,e.orientationY,e.orientationZ],this._position=[e.positionX,e.positionY,e.positionZ],this.orientationX=e.orientationX,this.orientationY=e.orientationY,this.orientationZ=e.orientationZ,this.positionX=e.positionX,this.positionY=e.positionY,this.positionZ=e.positionZ},t.extend(t.Panner3D,t.AudioNode),t.Panner3D.defaults={positionX:0,positionY:0,positionZ:0,orientationX:0,orientationY:0,orientationZ:0,panningModel:"equalpower",maxDistance:1e4,distanceModel:"inverse",coneOuterGain:0,coneOuterAngle:360,coneInnerAngle:360,refDistance:1,rolloffFactor:1},t.Panner3D.prototype._rampTimeConstant=.01,t.Panner3D.prototype.setPosition=function(t,e,i){if(this._panner.positionX){var n=this.now();this._panner.positionX.setTargetAtTime(t,n,this._rampTimeConstant),this._panner.positionY.setTargetAtTime(e,n,this._rampTimeConstant),this._panner.positionZ.setTargetAtTime(i,n,this._rampTimeConstant)}else this._panner.setPosition(t,e,i);return this._position=Array.prototype.slice.call(arguments),this},t.Panner3D.prototype.setOrientation=function(t,e,i){if(this._panner.orientationX){var n=this.now();this._panner.orientationX.setTargetAtTime(t,n,this._rampTimeConstant),this._panner.orientationY.setTargetAtTime(e,n,this._rampTimeConstant),this._panner.orientationZ.setTargetAtTime(i,n,this._rampTimeConstant)}else this._panner.setOrientation(t,e,i);return this._orientation=Array.prototype.slice.call(arguments),this},Object.defineProperty(t.Panner3D.prototype,"positionX",{set:function(t){this._position[0]=t,this.setPosition.apply(this,this._position)},get:function(){return this._position[0]}}),Object.defineProperty(t.Panner3D.prototype,"positionY",{set:function(t){this._position[1]=t,this.setPosition.apply(this,this._position)},get:function(){return this._position[1]}}),Object.defineProperty(t.Panner3D.prototype,"positionZ",{set:function(t){this._position[2]=t,this.setPosition.apply(this,this._position)},get:function(){return this._position[2]}}),Object.defineProperty(t.Panner3D.prototype,"orientationX",{set:function(t){this._orientation[0]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[0]}}),Object.defineProperty(t.Panner3D.prototype,"orientationY",{set:function(t){this._orientation[1]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[1]}}),Object.defineProperty(t.Panner3D.prototype,"orientationZ",{set:function(t){this._orientation[2]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[2]}}),t.Panner3D._aliasProperty=function(e){Object.defineProperty(t.Panner3D.prototype,e,{set:function(t){this._panner[e]=t},get:function(){return this._panner[e]}})},t.Panner3D._aliasProperty("panningModel"),t.Panner3D._aliasProperty("refDistance"),t.Panner3D._aliasProperty("rolloffFactor"),t.Panner3D._aliasProperty("distanceModel"),t.Panner3D._aliasProperty("coneInnerAngle"),t.Panner3D._aliasProperty("coneOuterAngle"),t.Panner3D._aliasProperty("coneOuterGain"),t.Panner3D._aliasProperty("maxDistance"),t.Panner3D.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._panner.disconnect(),this._panner=null,this._orientation=null,this._position=null,this},t.Panner3D}),e(function(t){return t.PanVol=function(){var e=t.defaults(arguments,["pan","volume"],t.PanVol);t.AudioNode.call(this),this._panner=this.input=new t.Panner(e.pan),this.pan=this._panner.pan,this._volume=this.output=new t.Volume(e.volume),this.volume=this._volume.volume,this._panner.connect(this._volume),this.mute=e.mute,this._readOnly(["pan","volume"])},t.extend(t.PanVol,t.AudioNode),t.PanVol.defaults={pan:0,volume:0,mute:!1},Object.defineProperty(t.PanVol.prototype,"mute",{get:function(){return this._volume.mute},set:function(t){this._volume.mute=t}}),t.PanVol.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._writable(["pan","volume"]),this._panner.dispose(),this._panner=null,this.pan=null,this._volume.dispose(),this._volume=null,this.volume=null,this},t.PanVol}),e(function(t){return t.Solo=function(){var e=t.defaults(arguments,["solo"],t.Solo);t.AudioNode.call(this),this.input=this.output=new t.Gain,this._soloBind=this._soloed.bind(this),this.context.on("solo",this._soloBind),this.solo=e.solo},t.extend(t.Solo,t.AudioNode),t.Solo.defaults={solo:!1},Object.defineProperty(t.Solo.prototype,"solo",{get:function(){return this._isSoloed()},set:function(t){t?this._addSolo():this._removeSolo(),this.context.emit("solo",this)}}),Object.defineProperty(t.Solo.prototype,"muted",{get:function(){return 0===this.input.gain.value}}),t.Solo.prototype._addSolo=function(){t.isArray(this.context._currentSolo)||(this.context._currentSolo=[]),this._isSoloed()||this.context._currentSolo.push(this)},t.Solo.prototype._removeSolo=function(){if(this._isSoloed()){var t=this.context._currentSolo.indexOf(this);this.context._currentSolo.splice(t,1)}},t.Solo.prototype._isSoloed=function(){return!!t.isArray(this.context._currentSolo)&&(0!==this.context._currentSolo.length&&-1!==this.context._currentSolo.indexOf(this))},t.Solo.prototype._noSolos=function(){return!t.isArray(this.context._currentSolo)||0===this.context._currentSolo.length},t.Solo.prototype._soloed=function(){this._isSoloed()?this.input.gain.value=1:this._noSolos()?this.input.gain.value=1:this.input.gain.value=0},t.Solo.prototype.dispose=function(){return this.context.off("solo",this._soloBind),this._removeSolo(),this._soloBind=null,t.AudioNode.prototype.dispose.call(this),this},t.Solo}),e(function(t){return t.Waveform=function(){var e=t.defaults(arguments,["size"],t.Waveform);e.type=t.Analyser.Type.Waveform,t.AudioNode.call(this),this._analyser=this.input=this.output=new t.Analyser(e)},t.extend(t.Waveform,t.AudioNode),t.Waveform.defaults={size:1024},t.Waveform.prototype.getValue=function(){return this._analyser.getValue()},Object.defineProperty(t.Waveform.prototype,"size",{get:function(){return this._analyser.size},set:function(t){this._analyser.size=t}}),t.Waveform.prototype.dispose=function(){t.AudioNode.prototype.dispose.call(this),this._analyser.dispose(),this._analyser=null},t.Waveform}),e(function(t){return t.CtrlInterpolate=function(){var e=t.defaults(arguments,["values","index"],t.CtrlInterpolate);t.call(this),this.values=e.values,this.index=e.index},t.extend(t.CtrlInterpolate),t.CtrlInterpolate.defaults={index:0,values:[]},Object.defineProperty(t.CtrlInterpolate.prototype,"value",{get:function(){var t=this.index;t=Math.min(t,this.values.length-1);var e=Math.floor(t),i=this.values[e],n=this.values[Math.ceil(t)];return this._interpolate(t-e,i,n)}}),t.CtrlInterpolate.prototype._interpolate=function(e,i,n){if(t.isArray(i)){for(var s=[],r=0;r<i.length;r++)s[r]=this._interpolate(e,i[r],n[r]);return s}if(t.isObject(i)){var o={};for(var a in i)o[a]=this._interpolate(e,i[a],n[a]);return o}return(1-e)*(i=this._toNumber(i))+e*(n=this._toNumber(n))},t.CtrlInterpolate.prototype._toNumber=function(e){return t.isNumber(e)?e:this.toSeconds(e)},t.CtrlInterpolate.prototype.dispose=function(){this.values=null},t.CtrlInterpolate}),e(function(t){return t.CtrlMarkov=function(e,i){t.call(this),this.values=t.defaultArg(e,{}),this.value=t.defaultArg(i,Object.keys(this.values)[0])},t.extend(t.CtrlMarkov),t.CtrlMarkov.prototype.next=function(){if(this.values.hasOwnProperty(this.value)){var e=this.values[this.value];if(t.isArray(e))for(var i=this._getProbDistribution(e),n=Math.random(),s=0,r=0;r<i.length;r++){var o=i[r];if(n>s&&n<s+o){var a=e[r];t.isObject(a)?this.value=a.value:this.value=a}s+=o}else this.value=e}return this.value},t.CtrlMarkov.prototype._getProbDistribution=function(e){for(var i=[],n=0,s=!1,r=0;r<e.length;r++){var o=e[r];t.isObject(o)?(s=!0,i[r]=o.probability):i[r]=1/e.length,n+=i[r]}if(s)for(var a=0;a<i.length;a++)i[a]=i[a]/n;return i},t.CtrlMarkov.prototype.dispose=function(){this.values=null},t.CtrlMarkov}),e(function(t){return t.CtrlPattern=function(){var e=t.defaults(arguments,["values","type"],t.CtrlPattern);t.call(this),this.values=e.values,this.index=0,this._type=null,this._shuffled=null,this._direction=null,this.type=e.type},t.extend(t.CtrlPattern),t.CtrlPattern.Type={Up:"up",Down:"down",UpDown:"upDown",DownUp:"downUp",AlternateUp:"alternateUp",AlternateDown:"alternateDown",Random:"random",RandomWalk:"randomWalk",RandomOnce:"randomOnce"},t.CtrlPattern.defaults={type:t.CtrlPattern.Type.Up,values:[]},Object.defineProperty(t.CtrlPattern.prototype,"value",{get:function(){if(0!==this.values.length){if(1===this.values.length)return this.values[0];this.index=Math.min(this.index,this.values.length-1);var e=this.values[this.index];return this.type===t.CtrlPattern.Type.RandomOnce&&(this.values.length!==this._shuffled.length&&this._shuffleValues(),e=this.values[this._shuffled[this.index]]),e}}}),Object.defineProperty(t.CtrlPattern.prototype,"type",{get:function(){return this._type},set:function(e){this._type=e,this._shuffled=null,this._type===t.CtrlPattern.Type.Up||this._type===t.CtrlPattern.Type.UpDown||this._type===t.CtrlPattern.Type.RandomOnce||this._type===t.CtrlPattern.Type.AlternateUp?this.index=0:this._type!==t.CtrlPattern.Type.Down&&this._type!==t.CtrlPattern.Type.DownUp&&this._type!==t.CtrlPattern.Type.AlternateDown||(this.index=this.values.length-1),this._type===t.CtrlPattern.Type.UpDown||this._type===t.CtrlPattern.Type.AlternateUp?this._direction=t.CtrlPattern.Type.Up:this._type!==t.CtrlPattern.Type.DownUp&&this._type!==t.CtrlPattern.Type.AlternateDown||(this._direction=t.CtrlPattern.Type.Down),this._type===t.CtrlPattern.Type.RandomOnce?this._shuffleValues():this._type===t.CtrlPattern.Random&&(this.index=Math.floor(Math.random()*this.values.length))}}),t.CtrlPattern.prototype.next=function(){var e=this.type;return e===t.CtrlPattern.Type.Up?(this.index++,this.index>=this.values.length&&(this.index=0)):e===t.CtrlPattern.Type.Down?(this.index--,this.index<0&&(this.index=this.values.length-1)):e===t.CtrlPattern.Type.UpDown||e===t.CtrlPattern.Type.DownUp?(this._direction===t.CtrlPattern.Type.Up?this.index++:this.index--,this.index<0?(this.index=1,this._direction=t.CtrlPattern.Type.Up):this.index>=this.values.length&&(this.index=this.values.length-2,this._direction=t.CtrlPattern.Type.Down)):e===t.CtrlPattern.Type.Random?this.index=Math.floor(Math.random()*this.values.length):e===t.CtrlPattern.Type.RandomWalk?Math.random()<.5?(this.index--,this.index=Math.max(this.index,0)):(this.index++,this.index=Math.min(this.index,this.values.length-1)):e===t.CtrlPattern.Type.RandomOnce?(this.index++,this.index>=this.values.length&&(this.index=0,this._shuffleValues())):e===t.CtrlPattern.Type.AlternateUp?(this._direction===t.CtrlPattern.Type.Up?(this.index+=2,this._direction=t.CtrlPattern.Type.Down):(this.index-=1,this._direction=t.CtrlPattern.Type.Up),this.index>=this.values.length&&(this.index=0,this._direction=t.CtrlPattern.Type.Up)):e===t.CtrlPattern.Type.AlternateDown&&(this._direction===t.CtrlPattern.Type.Up?(this.index+=1,this._direction=t.CtrlPattern.Type.Down):(this.index-=2,this._direction=t.CtrlPattern.Type.Up),this.index<0&&(this.index=this.values.length-1,this._direction=t.CtrlPattern.Type.Down)),this.value},t.CtrlPattern.prototype._shuffleValues=function(){var t=[];this._shuffled=[];for(var e=0;e<this.values.length;e++)t[e]=e;for(;t.length>0;){var i=t.splice(Math.floor(t.length*Math.random()),1);this._shuffled.push(i[0])}},t.CtrlPattern.prototype.dispose=function(){this._shuffled=null,this.values=null},t.CtrlPattern}),e(function(t){return t.CtrlRandom=function(){var e=t.defaults(arguments,["min","max"],t.CtrlRandom);t.call(this),this.min=e.min,this.max=e.max,this.integer=e.integer},t.extend(t.CtrlRandom),t.CtrlRandom.defaults={min:0,max:1,integer:!1},Object.defineProperty(t.CtrlRandom.prototype,"value",{get:function(){var t=this.toSeconds(this.min),e=this.toSeconds(this.max),i=Math.random(),n=i*t+(1-i)*e;return this.integer&&(n=Math.floor(n)),n}}),t.CtrlRandom}),e(function(t){return t.Buffers=function(e){var i=Array.prototype.slice.call(arguments);i.shift();var n=t.defaults(i,["onload","baseUrl"],t.Buffers);for(var s in t.call(this),this._buffers={},this.baseUrl=n.baseUrl,this._loadingCount=0,e)this._loadingCount++,this.add(s,e[s],this._bufferLoaded.bind(this,n.onload))},t.extend(t.Buffers),t.Buffers.defaults={onload:t.noOp,baseUrl:""},t.Buffers.prototype.has=function(t){return this._buffers.hasOwnProperty(t)},t.Buffers.prototype.get=function(t){if(this.has(t))return this._buffers[t];throw new Error("Tone.Buffers: no buffer named "+t)},t.Buffers.prototype._bufferLoaded=function(t){this._loadingCount--,0===this._loadingCount&&t&&t(this)},Object.defineProperty(t.Buffers.prototype,"loaded",{get:function(){var t=!0;for(var e in this._buffers){var i=this.get(e);t=t&&i.loaded}return t}}),t.Buffers.prototype.add=function(e,i,n){return n=t.defaultArg(n,t.noOp),i instanceof t.Buffer?(this._buffers[e]=i,n(this)):i instanceof AudioBuffer?(this._buffers[e]=new t.Buffer(i),n(this)):t.isString(i)&&(this._buffers[e]=new t.Buffer(this.baseUrl+i,n)),this},t.Buffers.prototype.dispose=function(){for(var e in t.prototype.dispose.call(this),this._buffers)this._buffers[e].dispose();return this._buffers=null,this},t.Buffers}),e(function(t){var e={};return t.prototype.send=function(i,n){e.hasOwnProperty(i)||(e[i]=this.context.createGain()),n=t.defaultArg(n,0);var s=new t.Gain(n,t.Type.Decibels);return this.connect(s),s.connect(e[i]),s},t.prototype.receive=function(t,i){return e.hasOwnProperty(t)||(e[t]=this.context.createGain()),e[t].connect(this,0,i),this},t.Context.on("init",function(t){t.Buses?e=t.Buses:(e={},t.Buses=e)}),t}),e(function(t){return t.Draw=function(){t.call(this),this._events=new t.Timeline,this.expiration=.25,this.anticipation=.008,this._boundDrawLoop=this._drawLoop.bind(this)},t.extend(t.Draw),t.Draw.prototype.schedule=function(t,e){return this._events.add({callback:t,time:this.toSeconds(e)}),1===this._events.length&&requestAnimationFrame(this._boundDrawLoop),this},t.Draw.prototype.cancel=function(t){return this._events.cancel(this.toSeconds(t)),this},t.Draw.prototype._drawLoop=function(){for(var e=t.now();this._events.length&&this._events.peek().time-this.anticipation<=e;){var i=this._events.shift();e-i.time<=this.expiration&&i.callback()}this._events.length>0&&requestAnimationFrame(this._boundDrawLoop)},t.Draw=new t.Draw,t.Draw}),e(function(t){t.Listener=function(){t.call(this),this._orientation=[0,0,0,0,0,0],this._position=[0,0,0],t.getContext(function(){this.set(e.defaults)}.bind(this))},t.extend(t.Listener),t.Listener.defaults={positionX:0,positionY:0,positionZ:0,forwardX:0,forwardY:0,forwardZ:1,upX:0,upY:1,upZ:0},t.Listener.prototype._rampTimeConstant=.01,t.Listener.prototype.setPosition=function(t,e,i){if(this.context.listener.positionX){var n=this.now();this.context.listener.positionX.setTargetAtTime(t,n,this._rampTimeConstant),this.context.listener.positionY.setTargetAtTime(e,n,this._rampTimeConstant),this.context.listener.positionZ.setTargetAtTime(i,n,this._rampTimeConstant)}else this.context.listener.setPosition(t,e,i);return this._position=Array.prototype.slice.call(arguments),this},t.Listener.prototype.setOrientation=function(t,e,i,n,s,r){if(this.context.listener.forwardX){var o=this.now();this.context.listener.forwardX.setTargetAtTime(t,o,this._rampTimeConstant),this.context.listener.forwardY.setTargetAtTime(e,o,this._rampTimeConstant),this.context.listener.forwardZ.setTargetAtTime(i,o,this._rampTimeConstant),this.context.listener.upX.setTargetAtTime(n,o,this._rampTimeConstant),this.context.listener.upY.setTargetAtTime(s,o,this._rampTimeConstant),this.context.listener.upZ.setTargetAtTime(r,o,this._rampTimeConstant)}else this.context.listener.setOrientation(t,e,i,n,s,r);return this._orientation=Array.prototype.slice.call(arguments),this},Object.defineProperty(t.Listener.prototype,"positionX",{set:function(t){this._position[0]=t,this.setPosition.apply(this,this._position)},get:function(){return this._position[0]}}),Object.defineProperty(t.Listener.prototype,"positionY",{set:function(t){this._position[1]=t,this.setPosition.apply(this,this._position)},get:function(){return this._position[1]}}),Object.defineProperty(t.Listener.prototype,"positionZ",{set:function(t){this._position[2]=t,this.setPosition.apply(this,this._position)},get:function(){return this._position[2]}}),Object.defineProperty(t.Listener.prototype,"forwardX",{set:function(t){this._orientation[0]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[0]}}),Object.defineProperty(t.Listener.prototype,"forwardY",{set:function(t){this._orientation[1]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[1]}}),Object.defineProperty(t.Listener.prototype,"forwardZ",{set:function(t){this._orientation[2]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[2]}}),Object.defineProperty(t.Listener.prototype,"upX",{set:function(t){this._orientation[3]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[3]}}),Object.defineProperty(t.Listener.prototype,"upY",{set:function(t){this._orientation[4]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[4]}}),Object.defineProperty(t.Listener.prototype,"upZ",{set:function(t){this._orientation[5]=t,this.setOrientation.apply(this,this._orientation)},get:function(){return this._orientation[5]}}),t.Listener.prototype.dispose=function(){return this._orientation=null,this._position=null,this};var e=t.Listener;return t.Listener=new e,t.Context.on("init",function(i){i.Listener instanceof e?t.Listener=i.Listener:t.Listener=new e,i.Listener=t.Listener}),t.Listener}),e(function(t){return t.Offline=function(e,i){var n,s=t.context.sampleRate,r=t.context,o=function e(i,n,s,r){r=t.defaultArg(r,0);var o=new t.OfflineContext(2,n,s);t.context=o;var a=i(t.Transport);return o.currentTime>0&&r<1e3?e(i,n,s,++r):{response:a,context:o}}(e,i,s),a=o.response,h=o.context;return n=a instanceof Promise?a.then(function(){return h.render()}):h.render(),t.context=r,n.then(function(e){return new t.Buffer(e)})},t.Offline}),e(function(t){return t.Effect=function(){var e=t.defaults(arguments,["wet"],t.Effect);t.AudioNode.call(this),this.createInsOuts(1,1),this._dryWet=new t.CrossFade(e.wet),this.wet=this._dryWet.fade,this.effectSend=new t.Gain,this.effectReturn=new t.Gain,this.input.connect(this._dryWet.a),this.input.connect(this.effectSend),this.effectReturn.connect(this._dryWet.b),this._dryWet.connect(this.output),this._readOnly(["wet"])},t.extend(t.Effect,t.AudioNode),t.Effect.defaults={wet:1},t.Effect.prototype.connectEffect=function(t){return this.effectSend.chain(t,this.effectReturn),this},t.Effect.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._dryWet.dispose(),this._dryWet=null,this.effectSend.dispose(),this.effectSend=null,this.effectReturn.dispose(),this.effectReturn=null,this._writable(["wet"]),this.wet=null,this},t.Effect}),e(function(t){return t.AutoFilter=function(){var e=t.defaults(arguments,["frequency","baseFrequency","octaves"],t.AutoFilter);t.Effect.call(this,e),this._lfo=new t.LFO({frequency:e.frequency,amplitude:e.depth}),this.depth=this._lfo.amplitude,this.frequency=this._lfo.frequency,this.filter=new t.Filter(e.filter),this._octaves=0,this.connectEffect(this.filter),this._lfo.connect(this.filter.frequency),this.type=e.type,this._readOnly(["frequency","depth"]),this.octaves=e.octaves,this.baseFrequency=e.baseFrequency},t.extend(t.AutoFilter,t.Effect),t.AutoFilter.defaults={frequency:1,type:"sine",depth:1,baseFrequency:200,octaves:2.6,filter:{type:"lowpass",rolloff:-12,Q:1}},t.AutoFilter.prototype.start=function(t){return this._lfo.start(t),this},t.AutoFilter.prototype.stop=function(t){return this._lfo.stop(t),this},t.AutoFilter.prototype.sync=function(t){return this._lfo.sync(t),this},t.AutoFilter.prototype.unsync=function(){return this._lfo.unsync(),this},Object.defineProperty(t.AutoFilter.prototype,"type",{get:function(){return this._lfo.type},set:function(t){this._lfo.type=t}}),Object.defineProperty(t.AutoFilter.prototype,"baseFrequency",{get:function(){return this._lfo.min},set:function(t){this._lfo.min=this.toFrequency(t),this.octaves=this._octaves}}),Object.defineProperty(t.AutoFilter.prototype,"octaves",{get:function(){return this._octaves},set:function(t){this._octaves=t,this._lfo.max=this.baseFrequency*Math.pow(2,t)}}),t.AutoFilter.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._lfo.dispose(),this._lfo=null,this.filter.dispose(),this.filter=null,this._writable(["frequency","depth"]),this.frequency=null,this.depth=null,this},t.AutoFilter}),e(function(t){return t.AutoPanner=function(){var e=t.defaults(arguments,["frequency"],t.AutoPanner);t.Effect.call(this,e),this._lfo=new t.LFO({frequency:e.frequency,amplitude:e.depth,min:-1,max:1}),this.depth=this._lfo.amplitude,this._panner=new t.Panner,this.frequency=this._lfo.frequency,this.connectEffect(this._panner),this._lfo.connect(this._panner.pan),this.type=e.type,this._readOnly(["depth","frequency"])},t.extend(t.AutoPanner,t.Effect),t.AutoPanner.defaults={frequency:1,type:"sine",depth:1},t.AutoPanner.prototype.start=function(t){return this._lfo.start(t),this},t.AutoPanner.prototype.stop=function(t){return this._lfo.stop(t),this},t.AutoPanner.prototype.sync=function(t){return this._lfo.sync(t),this},t.AutoPanner.prototype.unsync=function(){return this._lfo.unsync(),this},Object.defineProperty(t.AutoPanner.prototype,"type",{get:function(){return this._lfo.type},set:function(t){this._lfo.type=t}}),t.AutoPanner.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._lfo.dispose(),this._lfo=null,this._panner.dispose(),this._panner=null,this._writable(["depth","frequency"]),this.frequency=null,this.depth=null,this},t.AutoPanner}),e(function(t){return t.AutoWah=function(){var e=t.defaults(arguments,["baseFrequency","octaves","sensitivity"],t.AutoWah);t.Effect.call(this,e),this.follower=new t.Follower(e.follower),this._sweepRange=new t.ScaleExp(0,1,.5),this._baseFrequency=e.baseFrequency,this._octaves=e.octaves,this._inputBoost=new t.Gain,this._bandpass=new t.Filter({rolloff:-48,frequency:0,Q:e.Q}),this._peaking=new t.Filter(0,"peaking"),this._peaking.gain.value=e.gain,this.gain=this._peaking.gain,this.Q=this._bandpass.Q,this.effectSend.chain(this._inputBoost,this.follower,this._sweepRange),this._sweepRange.connect(this._bandpass.frequency),this._sweepRange.connect(this._peaking.frequency),this.effectSend.chain(this._bandpass,this._peaking,this.effectReturn),this._setSweepRange(),this.sensitivity=e.sensitivity,this._readOnly(["gain","Q"])},t.extend(t.AutoWah,t.Effect),t.AutoWah.defaults={baseFrequency:100,octaves:6,sensitivity:0,Q:2,gain:2,follower:{attack:.3,release:.5}},Object.defineProperty(t.AutoWah.prototype,"octaves",{get:function(){return this._octaves},set:function(t){this._octaves=t,this._setSweepRange()}}),Object.defineProperty(t.AutoWah.prototype,"baseFrequency",{get:function(){return this._baseFrequency},set:function(t){this._baseFrequency=t,this._setSweepRange()}}),Object.defineProperty(t.AutoWah.prototype,"sensitivity",{get:function(){return t.gainToDb(1/this._inputBoost.gain.value)},set:function(e){this._inputBoost.gain.value=1/t.dbToGain(e)}}),t.AutoWah.prototype._setSweepRange=function(){this._sweepRange.min=this._baseFrequency,this._sweepRange.max=Math.min(this._baseFrequency*Math.pow(2,this._octaves),this.context.sampleRate/2)},t.AutoWah.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this.follower.dispose(),this.follower=null,this._sweepRange.dispose(),this._sweepRange=null,this._bandpass.dispose(),this._bandpass=null,this._peaking.dispose(),this._peaking=null,this._inputBoost.dispose(),this._inputBoost=null,this._writable(["gain","Q"]),this.gain=null,this.Q=null,this},t.AutoWah}),e(function(t){return t.Modulo=function(e){t.SignalBase.call(this),this.createInsOuts(1,0),this._shaper=new t.WaveShaper(Math.pow(2,16)),this._multiply=new t.Multiply,this._subtract=this.output=new t.Subtract,this._modSignal=new t.Signal(e),this.input.fan(this._shaper,this._subtract),this._modSignal.connect(this._multiply,0,0),this._shaper.connect(this._multiply,0,1),this._multiply.connect(this._subtract,0,1),this._setWaveShaper(e)},t.extend(t.Modulo,t.SignalBase),t.Modulo.prototype._setWaveShaper=function(t){this._shaper.setMap(function(e){return Math.floor((e+1e-4)/t)})},Object.defineProperty(t.Modulo.prototype,"value",{get:function(){return this._modSignal.value},set:function(t){this._modSignal.value=t,this._setWaveShaper(t)}}),t.Modulo.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._shaper.dispose(),this._shaper=null,this._multiply.dispose(),this._multiply=null,this._subtract.dispose(),this._subtract=null,this._modSignal.dispose(),this._modSignal=null,this},t.Modulo}),e(function(t){return t.BitCrusher=function(){var e=t.defaults(arguments,["bits"],t.BitCrusher);t.Effect.call(this,e);var i=1/Math.pow(2,e.bits-1);this._subtract=new t.Subtract,this._modulo=new t.Modulo(i),this._bits=e.bits,this.effectSend.fan(this._subtract,this._modulo),this._modulo.connect(this._subtract,0,1),this._subtract.connect(this.effectReturn)},t.extend(t.BitCrusher,t.Effect),t.BitCrusher.defaults={bits:4},Object.defineProperty(t.BitCrusher.prototype,"bits",{get:function(){return this._bits},set:function(t){this._bits=t;var e=1/Math.pow(2,t-1);this._modulo.value=e}}),t.BitCrusher.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._subtract.dispose(),this._subtract=null,this._modulo.dispose(),this._modulo=null,this},t.BitCrusher}),e(function(t){return t.Chebyshev=function(){var e=t.defaults(arguments,["order"],t.Chebyshev);t.Effect.call(this,e),this._shaper=new t.WaveShaper(4096),this._order=e.order,this.connectEffect(this._shaper),this.order=e.order,this.oversample=e.oversample},t.extend(t.Chebyshev,t.Effect),t.Chebyshev.defaults={order:1,oversample:"none"},t.Chebyshev.prototype._getCoefficient=function(t,e,i){return i.hasOwnProperty(e)?i[e]:(i[e]=0===e?0:1===e?t:2*t*this._getCoefficient(t,e-1,i)-this._getCoefficient(t,e-2,i),i[e])},Object.defineProperty(t.Chebyshev.prototype,"order",{get:function(){return this._order},set:function(t){this._order=t;for(var e=new Array(4096),i=e.length,n=0;n<i;++n){var s=2*n/i-1;e[n]=0===s?0:this._getCoefficient(s,t,{})}this._shaper.curve=e}}),Object.defineProperty(t.Chebyshev.prototype,"oversample",{get:function(){return this._shaper.oversample},set:function(t){this._shaper.oversample=t}}),t.Chebyshev.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._shaper.dispose(),this._shaper=null,this},t.Chebyshev}),e(function(t){return t.StereoEffect=function(){t.AudioNode.call(this);var e=t.defaults(arguments,["wet"],t.Effect);this.createInsOuts(1,1),this._dryWet=new t.CrossFade(e.wet),this.wet=this._dryWet.fade,this._split=new t.Split,this.effectSendL=this._split.left,this.effectSendR=this._split.right,this._merge=new t.Merge,this.effectReturnL=this._merge.left,this.effectReturnR=this._merge.right,this.input.connect(this._split),this.input.connect(this._dryWet,0,0),this._merge.connect(this._dryWet,0,1),this._dryWet.connect(this.output),this._readOnly(["wet"])},t.extend(t.StereoEffect,t.Effect),t.StereoEffect.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._dryWet.dispose(),this._dryWet=null,this._split.dispose(),this._split=null,this._merge.dispose(),this._merge=null,this.effectSendL=null,this.effectSendR=null,this.effectReturnL=null,this.effectReturnR=null,this._writable(["wet"]),this.wet=null,this},t.StereoEffect}),e(function(t){return t.Chorus=function(){var e=t.defaults(arguments,["frequency","delayTime","depth"],t.Chorus);t.StereoEffect.call(this,e),this._depth=e.depth,this._delayTime=e.delayTime/1e3,this._lfoL=new t.LFO({frequency:e.frequency,min:0,max:1}),this._lfoR=new t.LFO({frequency:e.frequency,min:0,max:1,phase:180}),this._delayNodeL=new t.Delay,this._delayNodeR=new t.Delay,this.frequency=this._lfoL.frequency,this.effectSendL.chain(this._delayNodeL,this.effectReturnL),this.effectSendR.chain(this._delayNodeR,this.effectReturnR),this.effectSendL.connect(this.effectReturnL),this.effectSendR.connect(this.effectReturnR),this._lfoL.connect(this._delayNodeL.delayTime),this._lfoR.connect(this._delayNodeR.delayTime),this._lfoL.start(),this._lfoR.start(),this._lfoL.frequency.connect(this._lfoR.frequency),this.depth=this._depth,this.frequency.value=e.frequency,this.type=e.type,this._readOnly(["frequency"]),this.spread=e.spread},t.extend(t.Chorus,t.StereoEffect),t.Chorus.defaults={frequency:1.5,delayTime:3.5,depth:.7,type:"sine",spread:180},Object.defineProperty(t.Chorus.prototype,"depth",{get:function(){return this._depth},set:function(t){this._depth=t;var e=this._delayTime*t;this._lfoL.min=Math.max(this._delayTime-e,0),this._lfoL.max=this._delayTime+e,this._lfoR.min=Math.max(this._delayTime-e,0),this._lfoR.max=this._delayTime+e}}),Object.defineProperty(t.Chorus.prototype,"delayTime",{get:function(){return 1e3*this._delayTime},set:function(t){this._delayTime=t/1e3,this.depth=this._depth}}),Object.defineProperty(t.Chorus.prototype,"type",{get:function(){return this._lfoL.type},set:function(t){this._lfoL.type=t,this._lfoR.type=t}}),Object.defineProperty(t.Chorus.prototype,"spread",{get:function(){return this._lfoR.phase-this._lfoL.phase},set:function(t){this._lfoL.phase=90-t/2,this._lfoR.phase=t/2+90}}),t.Chorus.prototype.dispose=function(){return t.StereoEffect.prototype.dispose.call(this),this._lfoL.dispose(),this._lfoL=null,this._lfoR.dispose(),this._lfoR=null,this._delayNodeL.dispose(),this._delayNodeL=null,this._delayNodeR.dispose(),this._delayNodeR=null,this._writable("frequency"),this.frequency=null,this},t.Chorus}),e(function(t){return t.Convolver=function(){var e=t.defaults(arguments,["url","onload"],t.Convolver);t.Effect.call(this,e),this._convolver=this.context.createConvolver(),this._buffer=new t.Buffer(e.url,function(t){this._convolver.buffer=t.get(),e.onload()}.bind(this)),this.connectEffect(this._convolver)},t.extend(t.Convolver,t.Effect),t.Convolver.defaults={onload:t.noOp},Object.defineProperty(t.Convolver.prototype,"buffer",{get:function(){return this._buffer.get()},set:function(t){this._buffer.set(t),this._convolver.buffer=this._buffer.get()}}),t.Convolver.prototype.load=function(t,e){return this._buffer.load(t,function(t){this.buffer=t,e&&e()}.bind(this))},t.Convolver.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._convolver.disconnect(),this._convolver=null,this._buffer.dispose(),this._buffer=null,this},t.Convolver}),e(function(t){return t.Distortion=function(){var e=t.defaults(arguments,["distortion"],t.Distortion);t.Effect.call(this,e),this._shaper=new t.WaveShaper(4096),this._distortion=e.distortion,this.connectEffect(this._shaper),this.distortion=e.distortion,this.oversample=e.oversample},t.extend(t.Distortion,t.Effect),t.Distortion.defaults={distortion:.4,oversample:"none"},Object.defineProperty(t.Distortion.prototype,"distortion",{get:function(){return this._distortion},set:function(t){this._distortion=t;var e=100*t,i=Math.PI/180;this._shaper.setMap(function(t){return Math.abs(t)<.001?0:(3+e)*t*20*i/(Math.PI+e*Math.abs(t))})}}),Object.defineProperty(t.Distortion.prototype,"oversample",{get:function(){return this._shaper.oversample},set:function(t){this._shaper.oversample=t}}),t.Distortion.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._shaper.dispose(),this._shaper=null,this},t.Distortion}),e(function(t){return t.FeedbackEffect=function(){var e=t.defaults(arguments,["feedback"],t.FeedbackEffect);t.Effect.call(this,e),this._feedbackGain=new t.Gain(e.feedback,t.Type.NormalRange),this.feedback=this._feedbackGain.gain,this.effectReturn.chain(this._feedbackGain,this.effectSend),this._readOnly(["feedback"])},t.extend(t.FeedbackEffect,t.Effect),t.FeedbackEffect.defaults={feedback:.125},t.FeedbackEffect.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._writable(["feedback"]),this._feedbackGain.dispose(),this._feedbackGain=null,this.feedback=null,this},t.FeedbackEffect}),e(function(t){return t.FeedbackDelay=function(){var e=t.defaults(arguments,["delayTime","feedback"],t.FeedbackDelay);t.FeedbackEffect.call(this,e),this._delayNode=new t.Delay(e.delayTime,e.maxDelay),this.delayTime=this._delayNode.delayTime,this.connectEffect(this._delayNode),this._readOnly(["delayTime"])},t.extend(t.FeedbackDelay,t.FeedbackEffect),t.FeedbackDelay.defaults={delayTime:.25,maxDelay:1},t.FeedbackDelay.prototype.dispose=function(){return t.FeedbackEffect.prototype.dispose.call(this),this._delayNode.dispose(),this._delayNode=null,this._writable(["delayTime"]),this.delayTime=null,this},t.FeedbackDelay}),e(function(t){var e=[1557/44100,1617/44100,1491/44100,1422/44100,1277/44100,1356/44100,1188/44100,1116/44100],i=[225,556,441,341];return t.Freeverb=function(){var n=t.defaults(arguments,["roomSize","dampening"],t.Freeverb);t.StereoEffect.call(this,n),this.roomSize=new t.Signal(n.roomSize,t.Type.NormalRange),this.dampening=new t.Signal(n.dampening,t.Type.Frequency),this._combFilters=[],this._allpassFiltersL=[],this._allpassFiltersR=[];for(var s=0;s<i.length;s++){var r=this.context.createBiquadFilter();r.type="allpass",r.frequency.value=i[s],this._allpassFiltersL.push(r)}for(var o=0;o<i.length;o++){var a=this.context.createBiquadFilter();a.type="allpass",a.frequency.value=i[o],this._allpassFiltersR.push(a)}for(var h=0;h<e.length;h++){var u=new t.LowpassCombFilter(e[h]);h<e.length/2?this.effectSendL.chain(u,this._allpassFiltersL[0]):this.effectSendR.chain(u,this._allpassFiltersR[0]),this.roomSize.connect(u.resonance),this.dampening.connect(u.dampening),this._combFilters.push(u)}t.connectSeries.apply(t,this._allpassFiltersL),t.connectSeries.apply(t,this._allpassFiltersR),this._allpassFiltersL[this._allpassFiltersL.length-1].connect(this.effectReturnL),this._allpassFiltersR[this._allpassFiltersR.length-1].connect(this.effectReturnR),this._readOnly(["roomSize","dampening"])},t.extend(t.Freeverb,t.StereoEffect),t.Freeverb.defaults={roomSize:.7,dampening:3e3},t.Freeverb.prototype.dispose=function(){t.StereoEffect.prototype.dispose.call(this);for(var e=0;e<this._allpassFiltersL.length;e++)this._allpassFiltersL[e].disconnect(),this._allpassFiltersL[e]=null;this._allpassFiltersL=null;for(var i=0;i<this._allpassFiltersR.length;i++)this._allpassFiltersR[i].disconnect(),this._allpassFiltersR[i]=null;this._allpassFiltersR=null;for(var n=0;n<this._combFilters.length;n++)this._combFilters[n].dispose(),this._combFilters[n]=null;return this._combFilters=null,this._writable(["roomSize","dampening"]),this.roomSize.dispose(),this.roomSize=null,this.dampening.dispose(),this.dampening=null,this},t.Freeverb}),e(function(t){var e=[.06748,.06404,.08212,.09004],i=[.773,.802,.753,.733],n=[347,113,37];return t.JCReverb=function(){var s=t.defaults(arguments,["roomSize"],t.JCReverb);t.StereoEffect.call(this,s),this.roomSize=new t.Signal(s.roomSize,t.Type.NormalRange),this._scaleRoomSize=new t.Scale(-.733,.197),this._allpassFilters=[],this._feedbackCombFilters=[];for(var r=0;r<n.length;r++){var o=this.context.createBiquadFilter();o.type="allpass",o.frequency.value=n[r],this._allpassFilters.push(o)}for(var a=0;a<e.length;a++){var h=new t.FeedbackCombFilter(e[a],.1);this._scaleRoomSize.connect(h.resonance),h.resonance.value=i[a],this._allpassFilters[this._allpassFilters.length-1].connect(h),a<e.length/2?h.connect(this.effectReturnL):h.connect(this.effectReturnR),this._feedbackCombFilters.push(h)}this.roomSize.connect(this._scaleRoomSize),t.connectSeries.apply(t,this._allpassFilters),this.effectSendL.connect(this._allpassFilters[0]),this.effectSendR.connect(this._allpassFilters[0]),this._readOnly(["roomSize"])},t.extend(t.JCReverb,t.StereoEffect),t.JCReverb.defaults={roomSize:.5},t.JCReverb.prototype.dispose=function(){t.StereoEffect.prototype.dispose.call(this);for(var e=0;e<this._allpassFilters.length;e++)this._allpassFilters[e].disconnect(),this._allpassFilters[e]=null;this._allpassFilters=null;for(var i=0;i<this._feedbackCombFilters.length;i++)this._feedbackCombFilters[i].dispose(),this._feedbackCombFilters[i]=null;return this._feedbackCombFilters=null,this._writable(["roomSize"]),this.roomSize.dispose(),this.roomSize=null,this._scaleRoomSize.dispose(),this._scaleRoomSize=null,this},t.JCReverb}),e(function(t){return t.MidSideEffect=function(){t.Effect.apply(this,arguments),this._midSideSplit=new t.MidSideSplit,this._midSideMerge=new t.MidSideMerge,this.midSend=this._midSideSplit.mid,this.sideSend=this._midSideSplit.side,this.midReturn=this._midSideMerge.mid,this.sideReturn=this._midSideMerge.side,this.effectSend.connect(this._midSideSplit),this._midSideMerge.connect(this.effectReturn)},t.extend(t.MidSideEffect,t.Effect),t.MidSideEffect.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._midSideSplit.dispose(),this._midSideSplit=null,this._midSideMerge.dispose(),this._midSideMerge=null,this.midSend=null,this.sideSend=null,this.midReturn=null,this.sideReturn=null,this},t.MidSideEffect}),e(function(t){return t.Phaser=function(){var e=t.defaults(arguments,["frequency","octaves","baseFrequency"],t.Phaser);t.StereoEffect.call(this,e),this._lfoL=new t.LFO(e.frequency,0,1),this._lfoR=new t.LFO(e.frequency,0,1),this._lfoR.phase=180,this._baseFrequency=e.baseFrequency,this._octaves=e.octaves,this.Q=new t.Signal(e.Q,t.Type.Positive),this._filtersL=this._makeFilters(e.stages,this._lfoL,this.Q),this._filtersR=this._makeFilters(e.stages,this._lfoR,this.Q),this.frequency=this._lfoL.frequency,this.frequency.value=e.frequency,this.effectSendL.connect(this._filtersL[0]),this.effectSendR.connect(this._filtersR[0]),this._filtersL[e.stages-1].connect(this.effectReturnL),this._filtersR[e.stages-1].connect(this.effectReturnR),this._lfoL.frequency.connect(this._lfoR.frequency),this.baseFrequency=e.baseFrequency,this.octaves=e.octaves,this._lfoL.start(),this._lfoR.start(),this._readOnly(["frequency","Q"])},t.extend(t.Phaser,t.StereoEffect),t.Phaser.defaults={frequency:.5,octaves:3,stages:10,Q:10,baseFrequency:350},t.Phaser.prototype._makeFilters=function(e,i,n){for(var s=new Array(e),r=0;r<e;r++){var o=this.context.createBiquadFilter();o.type="allpass",n.connect(o.Q),i.connect(o.frequency),s[r]=o}return t.connectSeries.apply(t,s),s},Object.defineProperty(t.Phaser.prototype,"octaves",{get:function(){return this._octaves},set:function(t){this._octaves=t;var e=this._baseFrequency*Math.pow(2,t);this._lfoL.max=e,this._lfoR.max=e}}),Object.defineProperty(t.Phaser.prototype,"baseFrequency",{get:function(){return this._baseFrequency},set:function(t){this._baseFrequency=t,this._lfoL.min=t,this._lfoR.min=t,this.octaves=this._octaves}}),t.Phaser.prototype.dispose=function(){t.StereoEffect.prototype.dispose.call(this),this._writable(["frequency","Q"]),this.Q.dispose(),this.Q=null,this._lfoL.dispose(),this._lfoL=null,this._lfoR.dispose(),this._lfoR=null;for(var e=0;e<this._filtersL.length;e++)this._filtersL[e].disconnect(),this._filtersL[e]=null;this._filtersL=null;for(var i=0;i<this._filtersR.length;i++)this._filtersR[i].disconnect(),this._filtersR[i]=null;return this._filtersR=null,this.frequency=null,this},t.Phaser}),e(function(t){return t.StereoXFeedbackEffect=function(){var e=t.defaults(arguments,["feedback"],t.FeedbackEffect);t.StereoEffect.call(this,e),this.feedback=new t.Signal(e.feedback,t.Type.NormalRange),this._feedbackLR=new t.Gain,this._feedbackRL=new t.Gain,this.effectReturnL.chain(this._feedbackLR,this.effectSendR),this.effectReturnR.chain(this._feedbackRL,this.effectSendL),this.feedback.fan(this._feedbackLR.gain,this._feedbackRL.gain),this._readOnly(["feedback"])},t.extend(t.StereoXFeedbackEffect,t.StereoEffect),t.StereoXFeedbackEffect.prototype.dispose=function(){return t.StereoEffect.prototype.dispose.call(this),this._writable(["feedback"]),this.feedback.dispose(),this.feedback=null,this._feedbackLR.dispose(),this._feedbackLR=null,this._feedbackRL.dispose(),this._feedbackRL=null,this},t.StereoXFeedbackEffect}),e(function(t){return t.PingPongDelay=function(){var e=t.defaults(arguments,["delayTime","feedback"],t.PingPongDelay);t.StereoXFeedbackEffect.call(this,e),this._leftDelay=new t.Delay(0,e.maxDelayTime),this._rightDelay=new t.Delay(0,e.maxDelayTime),this._rightPreDelay=new t.Delay(0,e.maxDelayTime),this.delayTime=new t.Signal(e.delayTime,t.Type.Time),this.effectSendL.chain(this._leftDelay,this.effectReturnL),this.effectSendR.chain(this._rightPreDelay,this._rightDelay,this.effectReturnR),this.delayTime.fan(this._leftDelay.delayTime,this._rightDelay.delayTime,this._rightPreDelay.delayTime),this._feedbackLR.disconnect(),this._feedbackLR.connect(this._rightDelay),this._readOnly(["delayTime"])},t.extend(t.PingPongDelay,t.StereoXFeedbackEffect),t.PingPongDelay.defaults={delayTime:.25,maxDelayTime:1},t.PingPongDelay.prototype.dispose=function(){return t.StereoXFeedbackEffect.prototype.dispose.call(this),this._leftDelay.dispose(),this._leftDelay=null,this._rightDelay.dispose(),this._rightDelay=null,this._rightPreDelay.dispose(),this._rightPreDelay=null,this._writable(["delayTime"]),this.delayTime.dispose(),this.delayTime=null,this},t.PingPongDelay}),e(function(t){return t.PitchShift=function(){var e=t.defaults(arguments,["pitch"],t.PitchShift);t.FeedbackEffect.call(this,e),this._frequency=new t.Signal(0),this._delayA=new t.Delay(0,1),this._lfoA=new t.LFO({min:0,max:.1,type:"sawtooth"}).connect(this._delayA.delayTime),this._delayB=new t.Delay(0,1),this._lfoB=new t.LFO({min:0,max:.1,type:"sawtooth",phase:180}).connect(this._delayB.delayTime),this._crossFade=new t.CrossFade,this._crossFadeLFO=new t.LFO({min:0,max:1,type:"triangle",phase:90}).connect(this._crossFade.fade),this._feedbackDelay=new t.Delay(e.delayTime),this.delayTime=this._feedbackDelay.delayTime,this._readOnly("delayTime"),this._pitch=e.pitch,this._windowSize=e.windowSize,this._delayA.connect(this._crossFade.a),this._delayB.connect(this._crossFade.b),this._frequency.fan(this._lfoA.frequency,this._lfoB.frequency,this._crossFadeLFO.frequency),this.effectSend.fan(this._delayA,this._delayB),this._crossFade.chain(this._feedbackDelay,this.effectReturn);var i=this.now();this._lfoA.start(i),this._lfoB.start(i),this._crossFadeLFO.start(i),this.windowSize=this._windowSize},t.extend(t.PitchShift,t.FeedbackEffect),t.PitchShift.defaults={pitch:0,windowSize:.1,delayTime:0,feedback:0},Object.defineProperty(t.PitchShift.prototype,"pitch",{get:function(){return this._pitch},set:function(e){this._pitch=e;var i=0;e<0?(this._lfoA.min=0,this._lfoA.max=this._windowSize,this._lfoB.min=0,this._lfoB.max=this._windowSize,i=t.intervalToFrequencyRatio(e-1)+1):(this._lfoA.min=this._windowSize,this._lfoA.max=0,this._lfoB.min=this._windowSize,this._lfoB.max=0,i=t.intervalToFrequencyRatio(e)-1),this._frequency.value=i*(1.2/this._windowSize)}}),Object.defineProperty(t.PitchShift.prototype,"windowSize",{get:function(){return this._windowSize},set:function(t){this._windowSize=this.toSeconds(t),this.pitch=this._pitch}}),t.PitchShift.prototype.dispose=function(){return t.FeedbackEffect.prototype.dispose.call(this),this._frequency.dispose(),this._frequency=null,this._delayA.disconnect(),this._delayA=null,this._delayB.disconnect(),this._delayB=null,this._lfoA.dispose(),this._lfoA=null,this._lfoB.dispose(),this._lfoB=null,this._crossFade.dispose(),this._crossFade=null,this._crossFadeLFO.dispose(),this._crossFadeLFO=null,this._writable("delayTime"),this._feedbackDelay.dispose(),this._feedbackDelay=null,this.delayTime=null,this},t.PitchShift}),e(function(t){return t.BufferSource=function(){var e=t.defaults(arguments,["buffer","onload"],t.BufferSource);t.AudioNode.call(this,e),this.onended=e.onended,this._startTime=-1,this._sourceStarted=!1,this._sourceStopped=!1,this._stopTime=-1,this._gainNode=this.output=new t.Gain,this._source=this.context.createBufferSource(),this._source.connect(this._gainNode),this._source.onended=this._onended.bind(this),this._buffer=new t.Buffer(e.buffer,e.onload),this.playbackRate=new t.Param(this._source.playbackRate,t.Type.Positive),this.fadeIn=e.fadeIn,this.fadeOut=e.fadeOut,this.curve=e.curve,this._gain=1,this._onendedTimeout=-1,this.loop=e.loop,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this.playbackRate.value=e.playbackRate},t.extend(t.BufferSource,t.AudioNode),t.BufferSource.defaults={onended:t.noOp,onload:t.noOp,loop:!1,loopStart:0,loopEnd:0,fadeIn:0,fadeOut:0,curve:"linear",playbackRate:1},Object.defineProperty(t.BufferSource.prototype,"state",{get:function(){return this.getStateAtTime(this.now())}}),t.BufferSource.prototype.getStateAtTime=function(e){return e=this.toSeconds(e),-1!==this._startTime&&e>=this._startTime&&!this._sourceStopped?t.State.Started:t.State.Stopped},t.BufferSource.prototype.start=function(e,i,n,s,r){if(-1!==this._startTime)throw new Error("Tone.BufferSource can only be started once.");if(!this.buffer.loaded)throw new Error("Tone.BufferSource: buffer is either not set or not loaded.");e=this.toSeconds(e),i=this.loop?t.defaultArg(i,this.loopStart):t.defaultArg(i,0),i=this.toSeconds(i),s=t.defaultArg(s,1),this._gain=s,r=this.toSeconds(t.defaultArg(r,this.fadeIn)),this.fadeIn=r,r>0?(this._gainNode.gain.setValueAtTime(0,e),"linear"===this.curve?this._gainNode.gain.linearRampToValueAtTime(this._gain,e+r):this._gainNode.gain.exponentialApproachValueAtTime(this._gain,e,r)):this._gainNode.gain.setValueAtTime(s,e),this._startTime=e;var o=this.toSeconds(t.defaultArg(n,this.buffer.duration-i%this.buffer.duration));if(o=Math.max(o,0),t.isDefined(n)&&(this.loop||(o=Math.min(o,this.buffer.duration-i%this.buffer.duration)),this.stop(e+o,this.fadeOut)),this.loop){var a=this.loopEnd||this.buffer.duration,h=this.loopStart;i>=a&&(i=(i-h)%(a-h)+h)}return this._source.buffer=this.buffer.get(),this._source.loopEnd=this.loopEnd||this.buffer.duration,i<this.buffer.duration&&(this._sourceStarted=!0,this._source.start(e,i)),this},t.BufferSource.prototype.stop=function(e,i){if(!this.buffer.loaded)throw new Error("Tone.BufferSource: buffer is either not set or not loaded.");if(!this._sourceStopped){if(e=this.toSeconds(e),-1!==this._stopTime&&this.cancelStop(),e<=this._startTime)return this._gainNode.gain.cancelScheduledValues(e),this._gainNode.gain.value=0,this;e=Math.max(this._startTime+this.fadeIn+this.sampleTime,e),this._gainNode.gain.cancelScheduledValues(e),this._stopTime=e,i=this.toSeconds(t.defaultArg(i,this.fadeOut));var n=e-this._startTime-this.fadeIn-this.sampleTime;this.loop||(n=Math.min(n,this.buffer.duration));var s=e-(i=Math.min(n,i));return i>this.sampleTime?(this._gainNode.gain.setValueAtTime(this._gain,s),"linear"===this.curve?this._gainNode.gain.linearRampToValueAtTime(0,e):this._gainNode.gain.exponentialApproachValueAtTime(0,s,i)):this._gainNode.gain.setValueAtTime(0,e),t.context.clearTimeout(this._onendedTimeout),this._onendedTimeout=t.context.setTimeout(this._onended.bind(this),this._stopTime-this.now()),this}},t.BufferSource.prototype.cancelStop=function(){if(-1!==this._startTime&&!this._sourceStopped){var t=this.toSeconds(this.fadeIn);this._gainNode.gain.cancelScheduledValues(this._startTime+t+this.sampleTime),this._gainNode.gain.setValueAtTime(1,Math.max(this.now(),this._startTime+t+this.sampleTime)),this.context.clearTimeout(this._onendedTimeout),this._stopTime=-1}return this},t.BufferSource.prototype._onended=function(){if(!this._sourceStopped){this._sourceStopped=!0;var t="exponential"===this.curve?2*this.fadeOut:0;this._sourceStarted&&-1!==this._stopTime&&this._source.stop(this._stopTime+t),this.onended(this)}},Object.defineProperty(t.BufferSource.prototype,"loopStart",{get:function(){return this._source.loopStart},set:function(t){this._source.loopStart=this.toSeconds(t)}}),Object.defineProperty(t.BufferSource.prototype,"loopEnd",{get:function(){return this._source.loopEnd},set:function(t){this._source.loopEnd=this.toSeconds(t)}}),Object.defineProperty(t.BufferSource.prototype,"buffer",{get:function(){return this._buffer},set:function(t){this._buffer.set(t)}}),Object.defineProperty(t.BufferSource.prototype,"loop",{get:function(){return this._source.loop},set:function(t){this._source.loop=t,this.cancelStop()}}),t.BufferSource.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this.onended=null,this._source.onended=null,this._source.disconnect(),this._source=null,this._gainNode.dispose(),this._gainNode=null,this._buffer.dispose(),this._buffer=null,this._startTime=-1,this.playbackRate=null,t.context.clearTimeout(this._onendedTimeout),this},t.BufferSource}),e(function(t){t.Noise=function(){var e=t.defaults(arguments,["type"],t.Noise);t.Source.call(this,e),this._source=null,this._type=e.type,this._playbackRate=e.playbackRate},t.extend(t.Noise,t.Source),t.Noise.defaults={type:"white",playbackRate:1},Object.defineProperty(t.Noise.prototype,"type",{get:function(){return this._type},set:function(e){if(this._type!==e){if(!(e in i))throw new TypeError("Tone.Noise: invalid type: "+e);if(this._type=e,this.state===t.State.Started){var n=this.now();this._stop(n),this._start(n)}}}}),Object.defineProperty(t.Noise.prototype,"playbackRate",{get:function(){return this._playbackRate},set:function(t){this._playbackRate=t,this._source&&(this._source.playbackRate.value=t)}}),t.Noise.prototype._start=function(e){var n=i[this._type];this._source=new t.BufferSource(n).connect(this.output),this._source.loop=!0,this._source.playbackRate.value=this._playbackRate,this._source.start(this.toSeconds(e),Math.random()*(n.duration-.001))},t.Noise.prototype._stop=function(t){this._source&&(this._source.stop(this.toSeconds(t)),this._source=null)},t.Noise.prototype.restart=function(t){this._stop(t),this._start(t)},t.Noise.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),null!==this._source&&(this._source.disconnect(),this._source=null),this._buffer=null,this};var e={pink:function(){for(var t=[],e=0;e<2;e++){var i,n,s,r,o,a,h,u=new Float32Array(220500);t[e]=u,i=n=s=r=o=a=h=0;for(var l=0;l<220500;l++){var c=2*Math.random()-1;i=.99886*i+.0555179*c,n=.99332*n+.0750759*c,s=.969*s+.153852*c,r=.8665*r+.3104856*c,o=.55*o+.5329522*c,a=-.7616*a-.016898*c,u[l]=i+n+s+r+o+a+h+.5362*c,u[l]*=.11,h=.115926*c}}return t}(),brown:function(){for(var t=[],e=0;e<2;e++){var i=new Float32Array(220500);t[e]=i;for(var n=0,s=0;s<220500;s++){var r=2*Math.random()-1;i[s]=(n+.02*r)/1.02,n=i[s],i[s]*=3.5}}return t}(),white:function(){for(var t=[],e=0;e<2;e++){var i=new Float32Array(220500);t[e]=i;for(var n=0;n<220500;n++)i[n]=2*Math.random()-1}return t}()},i={};function n(){for(var n in e)i[n]=(new t.Buffer).fromArray(e[n])}return t.getContext(n),t.Context.on("init",n),t.Noise}),e(function(t){return t.Reverb=function(){var e=t.defaults(arguments,["decay"],t.Reverb);t.Effect.call(this,e),this._convolver=this.context.createConvolver(),this.decay=e.decay,this.preDelay=e.preDelay,this.connectEffect(this._convolver)},t.extend(t.Reverb,t.Effect),t.Reverb.defaults={decay:1.5,preDelay:.01},t.Reverb.prototype.generate=function(){return t.Offline(function(){var e=new t.Noise,i=new t.Noise,n=new t.Merge;e.connect(n.left),i.connect(n.right);var s=(new t.Gain).toMaster();n.connect(s),e.start(0),i.start(0),s.gain.setValueAtTime(0,0),s.gain.linearRampToValueAtTime(1,this.preDelay),s.gain.exponentialApproachValueAtTime(0,this.preDelay,this.decay-this.preDelay)}.bind(this),this.decay).then(function(t){return this._convolver.buffer=t.get(),this}.bind(this))},t.Reverb.prototype.dispose=function(){return t.Effect.prototype.dispose.call(this),this._convolver.disconnect(),this._convolver=null,this},t.Reverb}),e(function(t){return t.StereoFeedbackEffect=function(){var e=t.defaults(arguments,["feedback"],t.FeedbackEffect);t.StereoEffect.call(this,e),this.feedback=new t.Signal(e.feedback,t.Type.NormalRange),this._feedbackL=new t.Gain,this._feedbackR=new t.Gain,this.effectReturnL.chain(this._feedbackL,this.effectSendL),this.effectReturnR.chain(this._feedbackR,this.effectSendR),this.feedback.fan(this._feedbackL.gain,this._feedbackR.gain),this._readOnly(["feedback"])},t.extend(t.StereoFeedbackEffect,t.StereoEffect),t.StereoFeedbackEffect.prototype.dispose=function(){return t.StereoEffect.prototype.dispose.call(this),this._writable(["feedback"]),this.feedback.dispose(),this.feedback=null,this._feedbackL.dispose(),this._feedbackL=null,this._feedbackR.dispose(),this._feedbackR=null,this},t.StereoFeedbackEffect}),e(function(t){return t.StereoWidener=function(){var e=t.defaults(arguments,["width"],t.StereoWidener);t.MidSideEffect.call(this,e),this.width=new t.Signal(e.width,t.Type.NormalRange),this._readOnly(["width"]),this._twoTimesWidthMid=new t.Multiply(2),this._twoTimesWidthSide=new t.Multiply(2),this._midMult=new t.Multiply,this._twoTimesWidthMid.connect(this._midMult,0,1),this.midSend.chain(this._midMult,this.midReturn),this._oneMinusWidth=new t.Subtract,this._oneMinusWidth.connect(this._twoTimesWidthMid),this.context.getConstant(1).connect(this._oneMinusWidth,0,0),this.width.connect(this._oneMinusWidth,0,1),this._sideMult=new t.Multiply,this.width.connect(this._twoTimesWidthSide),this._twoTimesWidthSide.connect(this._sideMult,0,1),this.sideSend.chain(this._sideMult,this.sideReturn)},t.extend(t.StereoWidener,t.MidSideEffect),t.StereoWidener.defaults={width:.5},t.StereoWidener.prototype.dispose=function(){return t.MidSideEffect.prototype.dispose.call(this),this._writable(["width"]),this.width.dispose(),this.width=null,this._midMult.dispose(),this._midMult=null,this._sideMult.dispose(),this._sideMult=null,this._twoTimesWidthMid.dispose(),this._twoTimesWidthMid=null,this._twoTimesWidthSide.dispose(),this._twoTimesWidthSide=null,this._oneMinusWidth.dispose(),this._oneMinusWidth=null,this},t.StereoWidener}),e(function(t){return t.Tremolo=function(){var e=t.defaults(arguments,["frequency","depth"],t.Tremolo);t.StereoEffect.call(this,e),this._lfoL=new t.LFO({phase:e.spread,min:1,max:0}),this._lfoR=new t.LFO({phase:e.spread,min:1,max:0}),this._amplitudeL=new t.Gain,this._amplitudeR=new t.Gain,this.frequency=new t.Signal(e.frequency,t.Type.Frequency),this.depth=new t.Signal(e.depth,t.Type.NormalRange),this._readOnly(["frequency","depth"]),this.effectSendL.chain(this._amplitudeL,this.effectReturnL),this.effectSendR.chain(this._amplitudeR,this.effectReturnR),this._lfoL.connect(this._amplitudeL.gain),this._lfoR.connect(this._amplitudeR.gain),this.frequency.fan(this._lfoL.frequency,this._lfoR.frequency),this.depth.fan(this._lfoR.amplitude,this._lfoL.amplitude),this.type=e.type,this.spread=e.spread},t.extend(t.Tremolo,t.StereoEffect),t.Tremolo.defaults={frequency:10,type:"sine",depth:.5,spread:180},t.Tremolo.prototype.start=function(t){return this._lfoL.start(t),this._lfoR.start(t),this},t.Tremolo.prototype.stop=function(t){return this._lfoL.stop(t),this._lfoR.stop(t),this},t.Tremolo.prototype.sync=function(e){return this._lfoL.sync(e),this._lfoR.sync(e),t.Transport.syncSignal(this.frequency),this},t.Tremolo.prototype.unsync=function(){return this._lfoL.unsync(),this._lfoR.unsync(),t.Transport.unsyncSignal(this.frequency),this},Object.defineProperty(t.Tremolo.prototype,"type",{get:function(){return this._lfoL.type},set:function(t){this._lfoL.type=t,this._lfoR.type=t}}),Object.defineProperty(t.Tremolo.prototype,"spread",{get:function(){return this._lfoR.phase-this._lfoL.phase},set:function(t){this._lfoL.phase=90-t/2,this._lfoR.phase=t/2+90}}),t.Tremolo.prototype.dispose=function(){return t.StereoEffect.prototype.dispose.call(this),this._writable(["frequency","depth"]),this._lfoL.dispose(),this._lfoL=null,this._lfoR.dispose(),this._lfoR=null,this._amplitudeL.dispose(),this._amplitudeL=null,this._amplitudeR.dispose(),this._amplitudeR=null,this.frequency=null,this.depth=null,this},t.Tremolo}),e(function(t){return t.Vibrato=function(){var e=t.defaults(arguments,["frequency","depth"],t.Vibrato);t.Effect.call(this,e),this._delayNode=new t.Delay(0,e.maxDelay),this._lfo=new t.LFO({type:e.type,min:0,max:e.maxDelay,frequency:e.frequency,phase:-90}).start().connect(this._delayNode.delayTime),this.frequency=this._lfo.frequency,this.depth=this._lfo.amplitude,this.depth.value=e.depth,this._readOnly(["frequency","depth"]),this.effectSend.chain(this._delayNode,this.effectReturn)},t.extend(t.Vibrato,t.Effect),t.Vibrato.defaults={maxDelay:.005,frequency:5,depth:.1,type:"sine"},Object.defineProperty(t.Vibrato.prototype,"type",{get:function(){return this._lfo.type},set:function(t){this._lfo.type=t}}),t.Vibrato.prototype.dispose=function(){t.Effect.prototype.dispose.call(this),this._delayNode.dispose(),this._delayNode=null,this._lfo.dispose(),this._lfo=null,this._writable(["frequency","depth"]),this.frequency=null,this.depth=null},t.Vibrato}),e(function(t){return t.Event=function(){var e=t.defaults(arguments,["callback","value"],t.Event);t.call(this),this._loop=e.loop,this.callback=e.callback,this.value=e.value,this._loopStart=this.toTicks(e.loopStart),this._loopEnd=this.toTicks(e.loopEnd),this._state=new t.TimelineState(t.State.Stopped),this._playbackRate=1,this._startOffset=0,this._probability=e.probability,this._humanize=e.humanize,this.mute=e.mute,this.playbackRate=e.playbackRate},t.extend(t.Event),t.Event.defaults={callback:t.noOp,loop:!1,loopEnd:"1m",loopStart:0,playbackRate:1,value:null,probability:1,mute:!1,humanize:!1},t.Event.prototype._rescheduleEvents=function(e){return e=t.defaultArg(e,-1),this._state.forEachFrom(e,function(e){var i;if(e.state===t.State.Started){t.isDefined(e.id)&&t.Transport.clear(e.id);var n=e.time+Math.round(this.startOffset/this._playbackRate);if(this._loop){i=1/0,t.isNumber(this._loop)&&(i=this._loop*this._getLoopDuration());var s=this._state.getAfter(n);null!==s&&(i=Math.min(i,s.time-n)),i!==1/0&&(this._state.setStateAtTime(t.State.Stopped,n+i+1),i=t.Ticks(i));var r=t.Ticks(this._getLoopDuration());e.id=t.Transport.scheduleRepeat(this._tick.bind(this),r,t.Ticks(n),i)}else e.id=t.Transport.schedule(this._tick.bind(this),t.Ticks(n))}}.bind(this)),this},Object.defineProperty(t.Event.prototype,"state",{get:function(){return this._state.getValueAtTime(t.Transport.ticks)}}),Object.defineProperty(t.Event.prototype,"startOffset",{get:function(){return this._startOffset},set:function(t){this._startOffset=t}}),Object.defineProperty(t.Event.prototype,"probability",{get:function(){return this._probability},set:function(t){this._probability=t}}),Object.defineProperty(t.Event.prototype,"humanize",{get:function(){return this._humanize},set:function(t){this._humanize=t}}),t.Event.prototype.start=function(e){return e=this.toTicks(e),this._state.getValueAtTime(e)===t.State.Stopped&&(this._state.add({state:t.State.Started,time:e,id:void 0}),this._rescheduleEvents(e)),this},t.Event.prototype.stop=function(e){if(this.cancel(e),e=this.toTicks(e),this._state.getValueAtTime(e)===t.State.Started){this._state.setStateAtTime(t.State.Stopped,e);var i=this._state.getBefore(e),n=e;null!==i&&(n=i.time),this._rescheduleEvents(n)}return this},t.Event.prototype.cancel=function(e){return e=t.defaultArg(e,-1/0),e=this.toTicks(e),this._state.forEachFrom(e,function(e){t.Transport.clear(e.id)}),this._state.cancel(e),this},t.Event.prototype._tick=function(e){var i=t.Transport.getTicksAtTime(e);if(!this.mute&&this._state.getValueAtTime(i)===t.State.Started){if(this.probability<1&&Math.random()>this.probability)return;if(this.humanize){var n=.02;t.isBoolean(this.humanize)||(n=this.toSeconds(this.humanize)),e+=(2*Math.random()-1)*n}this.callback(e,this.value)}},t.Event.prototype._getLoopDuration=function(){return Math.round((this._loopEnd-this._loopStart)/this._playbackRate)},Object.defineProperty(t.Event.prototype,"loop",{get:function(){return this._loop},set:function(t){this._loop=t,this._rescheduleEvents()}}),Object.defineProperty(t.Event.prototype,"playbackRate",{get:function(){return this._playbackRate},set:function(t){this._playbackRate=t,this._rescheduleEvents()}}),Object.defineProperty(t.Event.prototype,"loopEnd",{get:function(){return t.Ticks(this._loopEnd).toSeconds()},set:function(t){this._loopEnd=this.toTicks(t),this._loop&&this._rescheduleEvents()}}),Object.defineProperty(t.Event.prototype,"loopStart",{get:function(){return t.Ticks(this._loopStart).toSeconds()},set:function(t){this._loopStart=this.toTicks(t),this._loop&&this._rescheduleEvents()}}),Object.defineProperty(t.Event.prototype,"progress",{get:function(){if(this._loop){var e=t.Transport.ticks,i=this._state.get(e);if(null!==i&&i.state===t.State.Started){var n=this._getLoopDuration();return(e-i.time)%n/n}return 0}return 0}}),t.Event.prototype.dispose=function(){this.cancel(),this._state.dispose(),this._state=null,this.callback=null,this.value=null},t.Event}),e(function(t){return t.Loop=function(){var e=t.defaults(arguments,["callback","interval"],t.Loop);t.call(this),this._event=new t.Event({callback:this._tick.bind(this),loop:!0,loopEnd:e.interval,playbackRate:e.playbackRate,probability:e.probability}),this.callback=e.callback,this.iterations=e.iterations},t.extend(t.Loop),t.Loop.defaults={interval:"4n",callback:t.noOp,playbackRate:1,iterations:1/0,probability:!0,mute:!1},t.Loop.prototype.start=function(t){return this._event.start(t),this},t.Loop.prototype.stop=function(t){return this._event.stop(t),this},t.Loop.prototype.cancel=function(t){return this._event.cancel(t),this},t.Loop.prototype._tick=function(t){this.callback(t)},Object.defineProperty(t.Loop.prototype,"state",{get:function(){return this._event.state}}),Object.defineProperty(t.Loop.prototype,"progress",{get:function(){return this._event.progress}}),Object.defineProperty(t.Loop.prototype,"interval",{get:function(){return this._event.loopEnd},set:function(t){this._event.loopEnd=t}}),Object.defineProperty(t.Loop.prototype,"playbackRate",{get:function(){return this._event.playbackRate},set:function(t){this._event.playbackRate=t}}),Object.defineProperty(t.Loop.prototype,"humanize",{get:function(){return this._event.humanize},set:function(t){this._event.humanize=t}}),Object.defineProperty(t.Loop.prototype,"probability",{get:function(){return this._event.probability},set:function(t){this._event.probability=t}}),Object.defineProperty(t.Loop.prototype,"mute",{get:function(){return this._event.mute},set:function(t){this._event.mute=t}}),Object.defineProperty(t.Loop.prototype,"iterations",{get:function(){return!0===this._event.loop?1/0:this._event.loop},set:function(t){this._event.loop=t===1/0||t}}),t.Loop.prototype.dispose=function(){this._event.dispose(),this._event=null,this.callback=null},t.Loop}),e(function(t){return t.Part=function(){var e=t.defaults(arguments,["callback","events"],t.Part);t.Event.call(this,e),this._events=[];for(var i=0;i<e.events.length;i++)Array.isArray(e.events[i])?this.add(e.events[i][0],e.events[i][1]):this.add(e.events[i])},t.extend(t.Part,t.Event),t.Part.defaults={callback:t.noOp,loop:!1,loopEnd:"1m",loopStart:0,playbackRate:1,probability:1,humanize:!1,mute:!1,events:[]},t.Part.prototype.start=function(e,i){var n=this.toTicks(e);return this._state.getValueAtTime(n)!==t.State.Started&&(i=this._loop?t.defaultArg(i,this._loopStart):t.defaultArg(i,0),i=this.toTicks(i),this._state.add({state:t.State.Started,time:n,offset:i}),this._forEach(function(t){this._startNote(t,n,i)})),this},t.Part.prototype._startNote=function(e,i,n){i-=n,this._loop?e.startOffset>=this._loopStart&&e.startOffset<this._loopEnd?(e.startOffset<n&&(i+=this._getLoopDuration()),e.start(t.Ticks(i))):e.startOffset<this._loopStart&&e.startOffset>=n&&(e.loop=!1,e.start(t.Ticks(i))):e.startOffset>=n&&e.start(t.Ticks(i))},Object.defineProperty(t.Part.prototype,"startOffset",{get:function(){return this._startOffset},set:function(t){this._startOffset=t,this._forEach(function(t){t.startOffset+=this._startOffset})}}),t.Part.prototype.stop=function(e){var i=this.toTicks(e);return this._state.cancel(i),this._state.setStateAtTime(t.State.Stopped,i),this._forEach(function(t){t.stop(e)}),this},t.Part.prototype.at=function(e,i){e=t.TransportTime(e);for(var n=t.Ticks(1).toSeconds(),s=0;s<this._events.length;s++){var r=this._events[s];if(Math.abs(e.toTicks()-r.startOffset)<n)return t.isDefined(i)&&(r.value=i),r}return t.isDefined(i)?(this.add(e,i),this._events[this._events.length-1]):null},t.Part.prototype.add=function(e,i){var n;return e.hasOwnProperty("time")&&(e=(i=e).time),e=this.toTicks(e),i instanceof t.Event?(n=i).callback=this._tick.bind(this):n=new t.Event({callback:this._tick.bind(this),value:i}),n.startOffset=e,n.set({loopEnd:this.loopEnd,loopStart:this.loopStart,loop:this.loop,humanize:this.humanize,playbackRate:this.playbackRate,probability:this.probability}),this._events.push(n),this._restartEvent(n),this},t.Part.prototype._restartEvent=function(e){this._state.forEach(function(i){i.state===t.State.Started?this._startNote(e,i.time,i.offset):e.stop(t.Ticks(i.time))}.bind(this))},t.Part.prototype.remove=function(e,i){e.hasOwnProperty("time")&&(e=(i=e).time),e=this.toTicks(e);for(var n=this._events.length-1;n>=0;n--){var s=this._events[n];s instanceof t.Part?s.remove(e,i):s.startOffset===e&&(t.isUndef(i)||t.isDefined(i)&&s.value===i)&&(this._events.splice(n,1),s.dispose())}return this},t.Part.prototype.removeAll=function(){return this._forEach(function(t){t.dispose()}),this._events=[],this},t.Part.prototype.cancel=function(t){return this._forEach(function(e){e.cancel(t)}),this._state.cancel(this.toTicks(t)),this},t.Part.prototype._forEach=function(e,i){if(this._events){i=t.defaultArg(i,this);for(var n=this._events.length-1;n>=0;n--){var s=this._events[n];s instanceof t.Part?s._forEach(e,i):e.call(i,s)}}return this},t.Part.prototype._setAll=function(t,e){this._forEach(function(i){i[t]=e})},t.Part.prototype._tick=function(t,e){this.mute||this.callback(t,e)},t.Part.prototype._testLoopBoundries=function(e){e.startOffset<this._loopStart||e.startOffset>=this._loopEnd?e.cancel(0):e.state===t.State.Stopped&&this._restartEvent(e)},Object.defineProperty(t.Part.prototype,"probability",{get:function(){return this._probability},set:function(t){this._probability=t,this._setAll("probability",t)}}),Object.defineProperty(t.Part.prototype,"humanize",{get:function(){return this._humanize},set:function(t){this._humanize=t,this._setAll("humanize",t)}}),Object.defineProperty(t.Part.prototype,"loop",{get:function(){return this._loop},set:function(t){this._loop=t,this._forEach(function(e){e._loopStart=this._loopStart,e._loopEnd=this._loopEnd,e.loop=t,this._testLoopBoundries(e)})}}),Object.defineProperty(t.Part.prototype,"loopEnd",{get:function(){return t.Ticks(this._loopEnd).toSeconds()},set:function(t){this._loopEnd=this.toTicks(t),this._loop&&this._forEach(function(e){e.loopEnd=t,this._testLoopBoundries(e)})}}),Object.defineProperty(t.Part.prototype,"loopStart",{get:function(){return t.Ticks(this._loopStart).toSeconds()},set:function(t){this._loopStart=this.toTicks(t),this._loop&&this._forEach(function(t){t.loopStart=this.loopStart,this._testLoopBoundries(t)})}}),Object.defineProperty(t.Part.prototype,"playbackRate",{get:function(){return this._playbackRate},set:function(t){this._playbackRate=t,this._setAll("playbackRate",t)}}),Object.defineProperty(t.Part.prototype,"length",{get:function(){return this._events.length}}),t.Part.prototype.dispose=function(){return this.removeAll(),this._state.dispose(),this._state=null,this.callback=null,this._events=null,this},t.Part}),e(function(t){return t.Pattern=function(){var e=t.defaults(arguments,["callback","values","pattern"],t.Pattern);t.Loop.call(this,e),this._pattern=new t.CtrlPattern({values:e.values,type:e.pattern,index:e.index})},t.extend(t.Pattern,t.Loop),t.Pattern.defaults={pattern:t.CtrlPattern.Type.Up,callback:t.noOp,values:[]},t.Pattern.prototype._tick=function(t){this.callback(t,this._pattern.value),this._pattern.next()},Object.defineProperty(t.Pattern.prototype,"index",{get:function(){return this._pattern.index},set:function(t){this._pattern.index=t}}),Object.defineProperty(t.Pattern.prototype,"values",{get:function(){return this._pattern.values},set:function(t){this._pattern.values=t}}),Object.defineProperty(t.Pattern.prototype,"value",{get:function(){return this._pattern.value}}),Object.defineProperty(t.Pattern.prototype,"pattern",{get:function(){return this._pattern.type},set:function(t){this._pattern.type=t}}),t.Pattern.prototype.dispose=function(){t.Loop.prototype.dispose.call(this),this._pattern.dispose(),this._pattern=null},t.Pattern}),e(function(t){return t.Sequence=function(){var e=t.defaults(arguments,["callback","events","subdivision"],t.Sequence),i=e.events;if(delete e.events,t.Part.call(this,e),this._subdivision=this.toTicks(e.subdivision),t.isUndef(e.loopEnd)&&t.isDefined(i)&&(this._loopEnd=i.length*this._subdivision),this._loop=!0,t.isDefined(i))for(var n=0;n<i.length;n++)this.add(n,i[n])},t.extend(t.Sequence,t.Part),t.Sequence.defaults={subdivision:"4n"},Object.defineProperty(t.Sequence.prototype,"subdivision",{get:function(){return t.Ticks(this._subdivision).toSeconds()}}),t.Sequence.prototype.at=function(e,i){return t.isArray(i)&&this.remove(e),t.Part.prototype.at.call(this,this._indexTime(e),i)},t.Sequence.prototype.add=function(e,i){if(null===i)return this;if(t.isArray(i)){var n=Math.round(this._subdivision/i.length);i=new t.Sequence(this._tick.bind(this),i,t.Ticks(n))}return t.Part.prototype.add.call(this,this._indexTime(e),i),this},t.Sequence.prototype.remove=function(e,i){return t.Part.prototype.remove.call(this,this._indexTime(e),i),this},t.Sequence.prototype._indexTime=function(e){return e instanceof t.TransportTime?e:t.Ticks(e*this._subdivision+this.startOffset).toSeconds()},t.Sequence.prototype.dispose=function(){return t.Part.prototype.dispose.call(this),this},t.Sequence}),e(function(t){return t.PulseOscillator=function(){var e=t.defaults(arguments,["frequency","width"],t.Oscillator);t.Source.call(this,e),this.width=new t.Signal(e.width,t.Type.NormalRange),this._widthGate=new t.Gain,this._sawtooth=new t.Oscillator({frequency:e.frequency,detune:e.detune,type:"sawtooth",phase:e.phase}),this.frequency=this._sawtooth.frequency,this.detune=this._sawtooth.detune,this._thresh=new t.WaveShaper(function(t){return t<0?-1:1}),this._sawtooth.chain(this._thresh,this.output),this.width.chain(this._widthGate,this._thresh),this._readOnly(["width","frequency","detune"])},t.extend(t.PulseOscillator,t.Source),t.PulseOscillator.defaults={frequency:440,detune:0,phase:0,width:.2},t.PulseOscillator.prototype._start=function(t){t=this.toSeconds(t),this._sawtooth.start(t),this._widthGate.gain.setValueAtTime(1,t)},t.PulseOscillator.prototype._stop=function(t){t=this.toSeconds(t),this._sawtooth.stop(t),this._widthGate.gain.setValueAtTime(0,t)},t.PulseOscillator.prototype.restart=function(t){this._sawtooth.restart(t)},Object.defineProperty(t.PulseOscillator.prototype,"phase",{get:function(){return this._sawtooth.phase},set:function(t){this._sawtooth.phase=t}}),Object.defineProperty(t.PulseOscillator.prototype,"type",{get:function(){return"pulse"}}),Object.defineProperty(t.PulseOscillator.prototype,"partials",{get:function(){return[]}}),t.PulseOscillator.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),this._sawtooth.dispose(),this._sawtooth=null,this._writable(["width","frequency","detune"]),this.width.dispose(),this.width=null,this._widthGate.dispose(),this._widthGate=null,this._thresh.dispose(),this._thresh=null,this.frequency=null,this.detune=null,this},t.PulseOscillator}),e(function(t){return t.PWMOscillator=function(){var e=t.defaults(arguments,["frequency","modulationFrequency"],t.PWMOscillator);t.Source.call(this,e),this._pulse=new t.PulseOscillator(e.modulationFrequency),this._pulse._sawtooth.type="sine",this._modulator=new t.Oscillator({frequency:e.frequency,detune:e.detune,phase:e.phase}),this._scale=new t.Multiply(2),this.frequency=this._modulator.frequency,this.detune=this._modulator.detune,this.modulationFrequency=this._pulse.frequency,this._modulator.chain(this._scale,this._pulse.width),this._pulse.connect(this.output),this._readOnly(["modulationFrequency","frequency","detune"])},t.extend(t.PWMOscillator,t.Source),t.PWMOscillator.defaults={frequency:440,detune:0,phase:0,modulationFrequency:.4},t.PWMOscillator.prototype._start=function(t){t=this.toSeconds(t),this._modulator.start(t),this._pulse.start(t)},t.PWMOscillator.prototype._stop=function(t){t=this.toSeconds(t),this._modulator.stop(t),this._pulse.stop(t)},t.PWMOscillator.prototype.restart=function(t){this._modulator.restart(t),this._pulse.restart(t)},Object.defineProperty(t.PWMOscillator.prototype,"type",{get:function(){return"pwm"}}),Object.defineProperty(t.PWMOscillator.prototype,"partials",{get:function(){return[]}}),Object.defineProperty(t.PWMOscillator.prototype,"phase",{get:function(){return this._modulator.phase},set:function(t){this._modulator.phase=t}}),t.PWMOscillator.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),this._pulse.dispose(),this._pulse=null,this._scale.dispose(),this._scale=null,this._modulator.dispose(),this._modulator=null,this._writable(["modulationFrequency","frequency","detune"]),this.frequency=null,this.detune=null,this.modulationFrequency=null,this},t.PWMOscillator}),e(function(t){return t.FMOscillator=function(){var e=t.defaults(arguments,["frequency","type","modulationType"],t.FMOscillator);t.Source.call(this,e),this._carrier=new t.Oscillator(e.frequency,e.type),this.frequency=new t.Signal(e.frequency,t.Type.Frequency),this.detune=this._carrier.detune,this.detune.value=e.detune,this.modulationIndex=new t.Multiply(e.modulationIndex),this.modulationIndex.units=t.Type.Positive,this._modulator=new t.Oscillator(e.frequency,e.modulationType),this.harmonicity=new t.Multiply(e.harmonicity),this.harmonicity.units=t.Type.Positive,this._modulationNode=new t.Gain(0),this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.frequency.chain(this.modulationIndex,this._modulationNode),this._modulator.connect(this._modulationNode.gain),this._modulationNode.connect(this._carrier.frequency),this._carrier.connect(this.output),this.detune.connect(this._modulator.detune),this.phase=e.phase,this._readOnly(["modulationIndex","frequency","detune","harmonicity"])},t.extend(t.FMOscillator,t.Source),t.FMOscillator.defaults={frequency:440,detune:0,phase:0,modulationIndex:2,modulationType:"square",harmonicity:1},t.FMOscillator.prototype._start=function(t){this._modulator.start(t),this._carrier.start(t)},t.FMOscillator.prototype._stop=function(t){this._modulator.stop(t),this._carrier.stop(t)},t.FMOscillator.prototype.restart=function(t){this._modulator.restart(t),this._carrier.restart(t)},Object.defineProperty(t.FMOscillator.prototype,"type",{get:function(){return this._carrier.type},set:function(t){this._carrier.type=t}}),Object.defineProperty(t.FMOscillator.prototype,"modulationType",{get:function(){return this._modulator.type},set:function(t){this._modulator.type=t}}),Object.defineProperty(t.FMOscillator.prototype,"phase",{get:function(){return this._carrier.phase},set:function(t){this._carrier.phase=t,this._modulator.phase=t}}),Object.defineProperty(t.FMOscillator.prototype,"partials",{get:function(){return this._carrier.partials},set:function(t){this._carrier.partials=t}}),t.FMOscillator.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),this._writable(["modulationIndex","frequency","detune","harmonicity"]),this.frequency.dispose(),this.frequency=null,this.detune=null,this.harmonicity.dispose(),this.harmonicity=null,this._carrier.dispose(),this._carrier=null,this._modulator.dispose(),this._modulator=null,this._modulationNode.dispose(),this._modulationNode=null,this.modulationIndex.dispose(),this.modulationIndex=null,this},t.FMOscillator}),e(function(t){return t.AMOscillator=function(){var e=t.defaults(arguments,["frequency","type","modulationType"],t.AMOscillator);t.Source.call(this,e),this._carrier=new t.Oscillator(e.frequency,e.type),this.frequency=this._carrier.frequency,this.detune=this._carrier.detune,this.detune.value=e.detune,this._modulator=new t.Oscillator(e.frequency,e.modulationType),this._modulationScale=new t.AudioToGain,this.harmonicity=new t.Multiply(e.harmonicity),this.harmonicity.units=t.Type.Positive,this._modulationNode=new t.Gain(0),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.detune.connect(this._modulator.detune),this._modulator.chain(this._modulationScale,this._modulationNode.gain),this._carrier.chain(this._modulationNode,this.output),this.phase=e.phase,this._readOnly(["frequency","detune","harmonicity"])},t.extend(t.AMOscillator,t.Oscillator),t.AMOscillator.defaults={frequency:440,detune:0,phase:0,modulationType:"square",harmonicity:1},t.AMOscillator.prototype._start=function(t){this._modulator.start(t),this._carrier.start(t)},t.AMOscillator.prototype._stop=function(t){this._modulator.stop(t),this._carrier.stop(t)},t.AMOscillator.prototype.restart=function(t){this._modulator.restart(t),this._carrier.restart(t)},Object.defineProperty(t.AMOscillator.prototype,"type",{get:function(){return this._carrier.type},set:function(t){this._carrier.type=t}}),Object.defineProperty(t.AMOscillator.prototype,"modulationType",{get:function(){return this._modulator.type},set:function(t){this._modulator.type=t}}),Object.defineProperty(t.AMOscillator.prototype,"phase",{get:function(){return this._carrier.phase},set:function(t){this._carrier.phase=t,this._modulator.phase=t}}),Object.defineProperty(t.AMOscillator.prototype,"partials",{get:function(){return this._carrier.partials},set:function(t){this._carrier.partials=t}}),t.AMOscillator.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),this._writable(["frequency","detune","harmonicity"]),this.frequency=null,this.detune=null,this.harmonicity.dispose(),this.harmonicity=null,this._carrier.dispose(),this._carrier=null,this._modulator.dispose(),this._modulator=null,this._modulationNode.dispose(),this._modulationNode=null,this._modulationScale.dispose(),this._modulationScale=null,this},t.AMOscillator}),e(function(t){return t.FatOscillator=function(){var e=t.defaults(arguments,["frequency","type","spread"],t.FatOscillator);t.Source.call(this,e),this.frequency=new t.Signal(e.frequency,t.Type.Frequency),this.detune=new t.Signal(e.detune,t.Type.Cents),this._oscillators=[],this._spread=e.spread,this._type=e.type,this._phase=e.phase,this._partials=t.defaultArg(e.partials,[]),this.count=e.count,this._readOnly(["frequency","detune"])},t.extend(t.FatOscillator,t.Source),t.FatOscillator.defaults={frequency:440,detune:0,phase:0,spread:20,count:3,type:"sawtooth"},t.FatOscillator.prototype._start=function(t){t=this.toSeconds(t),this._forEach(function(e){e.start(t)})},t.FatOscillator.prototype._stop=function(t){t=this.toSeconds(t),this._forEach(function(e){e.stop(t)})},t.FatOscillator.prototype.restart=function(t){t=this.toSeconds(t),this._forEach(function(e){e.restart(t)})},t.FatOscillator.prototype._forEach=function(t){for(var e=0;e<this._oscillators.length;e++)t.call(this,this._oscillators[e],e)},Object.defineProperty(t.FatOscillator.prototype,"type",{get:function(){return this._type},set:function(t){this._type=t,this._forEach(function(e){e.type=t})}}),Object.defineProperty(t.FatOscillator.prototype,"spread",{get:function(){return this._spread},set:function(t){if(this._spread=t,this._oscillators.length>1){var e=-t/2,i=t/(this._oscillators.length-1);this._forEach(function(t,n){t.detune.value=e+i*n})}}}),Object.defineProperty(t.FatOscillator.prototype,"count",{get:function(){return this._oscillators.length},set:function(e){if(e=Math.max(e,1),this._oscillators.length!==e){this._forEach(function(t){t.dispose()}),this._oscillators=[];for(var i=0;i<e;i++){var n=new t.Oscillator;this.type===t.Oscillator.Type.Custom?n.partials=this._partials:n.type=this._type,n.phase=this._phase,n.volume.value=-6-1.1*e,this.frequency.connect(n.frequency),this.detune.connect(n.detune),n.connect(this.output),this._oscillators[i]=n}this.spread=this._spread,this.state===t.State.Started&&this._forEach(function(t){t.start()})}}}),Object.defineProperty(t.FatOscillator.prototype,"phase",{get:function(){return this._phase},set:function(t){this._phase=t,this._forEach(function(e){e.phase=t})}}),Object.defineProperty(t.FatOscillator.prototype,"partials",{get:function(){return this._partials},set:function(e){this._partials=e,this._type=t.Oscillator.Type.Custom,this._forEach(function(t){t.partials=e})}}),t.FatOscillator.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),this._writable(["frequency","detune"]),this.frequency.dispose(),this.frequency=null,this.detune.dispose(),this.detune=null,this._forEach(function(t){t.dispose()}),this._oscillators=null,this._partials=null,this},t.FatOscillator}),e(function(t){t.OmniOscillator=function(){var e=t.defaults(arguments,["frequency","type"],t.OmniOscillator);t.Source.call(this,e),this.frequency=new t.Signal(e.frequency,t.Type.Frequency),this.detune=new t.Signal(e.detune,t.Type.Cents),this._sourceType=void 0,this._oscillator=null,this.type=e.type,this._readOnly(["frequency","detune"]),this.set(e)},t.extend(t.OmniOscillator,t.Source),t.OmniOscillator.defaults={frequency:440,detune:0,type:"sine",phase:0};var e="PulseOscillator",i="PWMOscillator",n="Oscillator",s="FMOscillator",r="AMOscillator",o="FatOscillator";return t.OmniOscillator.prototype._start=function(t){this._oscillator.start(t)},t.OmniOscillator.prototype._stop=function(t){this._oscillator.stop(t)},t.OmniOscillator.prototype.restart=function(t){this._oscillator.restart(t)},Object.defineProperty(t.OmniOscillator.prototype,"type",{get:function(){var t="";return this._sourceType===s?t="fm":this._sourceType===r?t="am":this._sourceType===o&&(t="fat"),t+this._oscillator.type},set:function(t){"fm"===t.substr(0,2)?(this._createNewOscillator(s),this._oscillator.type=t.substr(2)):"am"===t.substr(0,2)?(this._createNewOscillator(r),this._oscillator.type=t.substr(2)):"fat"===t.substr(0,3)?(this._createNewOscillator(o),this._oscillator.type=t.substr(3)):"pwm"===t?this._createNewOscillator(i):"pulse"===t?this._createNewOscillator(e):(this._createNewOscillator(n),this._oscillator.type=t)}}),Object.defineProperty(t.OmniOscillator.prototype,"partials",{get:function(){return this._oscillator.partials},set:function(t){this._oscillator.partials=t}}),t.OmniOscillator.prototype.set=function(e,i){return"type"===e?this.type=i:t.isObject(e)&&e.hasOwnProperty("type")&&(this.type=e.type),t.prototype.set.apply(this,arguments),this},t.OmniOscillator.prototype._createNewOscillator=function(e){if(e!==this._sourceType){this._sourceType=e;var i=t[e],n=this.now();if(null!==this._oscillator){var s=this._oscillator;s.stop(n),this.context.setTimeout(function(){s.dispose(),s=null},this.blockTime)}this._oscillator=new i,this.frequency.connect(this._oscillator.frequency),this.detune.connect(this._oscillator.detune),this._oscillator.connect(this.output),this.state===t.State.Started&&this._oscillator.start(n)}},Object.defineProperty(t.OmniOscillator.prototype,"phase",{get:function(){return this._oscillator.phase},set:function(t){this._oscillator.phase=t}}),Object.defineProperty(t.OmniOscillator.prototype,"width",{get:function(){if(this._sourceType===e)return this._oscillator.width}}),Object.defineProperty(t.OmniOscillator.prototype,"count",{get:function(){if(this._sourceType===o)return this._oscillator.count},set:function(t){this._sourceType===o&&(this._oscillator.count=t)}}),Object.defineProperty(t.OmniOscillator.prototype,"spread",{get:function(){if(this._sourceType===o)return this._oscillator.spread},set:function(t){this._sourceType===o&&(this._oscillator.spread=t)}}),Object.defineProperty(t.OmniOscillator.prototype,"modulationType",{get:function(){if(this._sourceType===s||this._sourceType===r)return this._oscillator.modulationType},set:function(t){this._sourceType!==s&&this._sourceType!==r||(this._oscillator.modulationType=t)}}),Object.defineProperty(t.OmniOscillator.prototype,"modulationIndex",{get:function(){if(this._sourceType===s)return this._oscillator.modulationIndex}}),Object.defineProperty(t.OmniOscillator.prototype,"harmonicity",{get:function(){if(this._sourceType===s||this._sourceType===r)return this._oscillator.harmonicity}}),Object.defineProperty(t.OmniOscillator.prototype,"modulationFrequency",{get:function(){if(this._sourceType===i)return this._oscillator.modulationFrequency}}),t.OmniOscillator.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),this._writable(["frequency","detune"]),this.detune.dispose(),this.detune=null,this.frequency.dispose(),this.frequency=null,this._oscillator.dispose(),this._oscillator=null,this._sourceType=null,this},t.OmniOscillator}),e(function(t){return t.Instrument=function(e){e=t.defaultArg(e,t.Instrument.defaults),t.AudioNode.call(this),this._volume=this.output=new t.Volume(e.volume),this.volume=this._volume.volume,this._readOnly("volume"),this._scheduledEvents=[]},t.extend(t.Instrument,t.AudioNode),t.Instrument.defaults={volume:0},t.Instrument.prototype.triggerAttack=t.noOp,t.Instrument.prototype.triggerRelease=t.noOp,t.Instrument.prototype.sync=function(){return this._syncMethod("triggerAttack",1),this._syncMethod("triggerRelease",0),this},t.Instrument.prototype._syncMethod=function(e,i){var n=this["_original_"+e]=this[e];this[e]=function(){var e=Array.prototype.slice.call(arguments),s=e[i],r=t.Transport.schedule(function(t){e[i]=t,n.apply(this,e)}.bind(this),s);this._scheduledEvents.push(r)}.bind(this)},t.Instrument.prototype.unsync=function(){return this._scheduledEvents.forEach(function(e){t.Transport.clear(e)}),this._scheduledEvents=[],this._original_triggerAttack&&(this.triggerAttack=this._original_triggerAttack,this.triggerRelease=this._original_triggerRelease),this},t.Instrument.prototype.triggerAttackRelease=function(t,e,i,n){return i=this.toSeconds(i),e=this.toSeconds(e),this.triggerAttack(t,i,n),this.triggerRelease(i+e),this},t.Instrument.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._volume.dispose(),this._volume=null,this._writable(["volume"]),this.volume=null,this.unsync(),this._scheduledEvents=null,this},t.Instrument}),e(function(t){return t.Monophonic=function(e){e=t.defaultArg(e,t.Monophonic.defaults),t.Instrument.call(this,e),this.portamento=e.portamento},t.extend(t.Monophonic,t.Instrument),t.Monophonic.defaults={portamento:0},t.Monophonic.prototype.triggerAttack=function(t,e,i){return e=this.toSeconds(e),this._triggerEnvelopeAttack(e,i),this.setNote(t,e),this},t.Monophonic.prototype.triggerRelease=function(t){return t=this.toSeconds(t),this._triggerEnvelopeRelease(t),this},t.Monophonic.prototype._triggerEnvelopeAttack=function(){},t.Monophonic.prototype._triggerEnvelopeRelease=function(){},t.Monophonic.prototype.getLevelAtTime=function(t){return t=this.toSeconds(t),this.envelope.getValueAtTime(t)},t.Monophonic.prototype.setNote=function(t,e){if(e=this.toSeconds(e),this.portamento>0&&this.getLevelAtTime(e)>.05){var i=this.toSeconds(this.portamento);this.frequency.exponentialRampTo(t,i,e)}else this.frequency.setValueAtTime(t,e);return this},t.Monophonic}),e(function(t){return t.Synth=function(e){e=t.defaultArg(e,t.Synth.defaults),t.Monophonic.call(this,e),this.oscillator=new t.OmniOscillator(e.oscillator),this.frequency=this.oscillator.frequency,this.detune=this.oscillator.detune,this.envelope=new t.AmplitudeEnvelope(e.envelope),this.oscillator.chain(this.envelope,this.output),this._readOnly(["oscillator","frequency","detune","envelope"])},t.extend(t.Synth,t.Monophonic),t.Synth.defaults={oscillator:{type:"triangle"},envelope:{attack:.005,decay:.1,sustain:.3,release:1}},t.Synth.prototype._triggerEnvelopeAttack=function(t,e){return this.envelope.triggerAttack(t,e),this.oscillator.start(t),0===this.envelope.sustain&&this.oscillator.stop(t+this.envelope.attack+this.envelope.decay),this},t.Synth.prototype._triggerEnvelopeRelease=function(t){return t=this.toSeconds(t),this.envelope.triggerRelease(t),this.oscillator.stop(t+this.envelope.release),this},t.Synth.prototype.dispose=function(){return t.Monophonic.prototype.dispose.call(this),this._writable(["oscillator","frequency","detune","envelope"]),this.oscillator.dispose(),this.oscillator=null,this.envelope.dispose(),this.envelope=null,this.frequency=null,this.detune=null,this},t.Synth}),e(function(t){return t.AMSynth=function(e){e=t.defaultArg(e,t.AMSynth.defaults),t.Monophonic.call(this,e),this._carrier=new t.Synth,this._carrier.volume.value=-10,this.oscillator=this._carrier.oscillator,this.envelope=this._carrier.envelope.set(e.envelope),this._modulator=new t.Synth,this._modulator.volume.value=-10,this.modulation=this._modulator.oscillator.set(e.modulation),this.modulationEnvelope=this._modulator.envelope.set(e.modulationEnvelope),this.frequency=new t.Signal(440,t.Type.Frequency),this.detune=new t.Signal(e.detune,t.Type.Cents),this.harmonicity=new t.Multiply(e.harmonicity),this.harmonicity.units=t.Type.Positive,this._modulationScale=new t.AudioToGain,this._modulationNode=new t.Gain,this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.detune.fan(this._carrier.detune,this._modulator.detune),this._modulator.chain(this._modulationScale,this._modulationNode.gain),this._carrier.chain(this._modulationNode,this.output),this._readOnly(["frequency","harmonicity","oscillator","envelope","modulation","modulationEnvelope","detune"])},t.extend(t.AMSynth,t.Monophonic),t.AMSynth.defaults={harmonicity:3,detune:0,oscillator:{type:"sine"},envelope:{attack:.01,decay:.01,sustain:1,release:.5},modulation:{type:"square"},modulationEnvelope:{attack:.5,decay:0,sustain:1,release:.5}},t.AMSynth.prototype._triggerEnvelopeAttack=function(t,e){return t=this.toSeconds(t),this._carrier._triggerEnvelopeAttack(t,e),this._modulator._triggerEnvelopeAttack(t),this},t.AMSynth.prototype._triggerEnvelopeRelease=function(t){return this._carrier._triggerEnvelopeRelease(t),this._modulator._triggerEnvelopeRelease(t),this},t.AMSynth.prototype.dispose=function(){return t.Monophonic.prototype.dispose.call(this),this._writable(["frequency","harmonicity","oscillator","envelope","modulation","modulationEnvelope","detune"]),this._carrier.dispose(),this._carrier=null,this._modulator.dispose(),this._modulator=null,this.frequency.dispose(),this.frequency=null,this.detune.dispose(),this.detune=null,this.harmonicity.dispose(),this.harmonicity=null,this._modulationScale.dispose(),this._modulationScale=null,this._modulationNode.dispose(),this._modulationNode=null,this.oscillator=null,this.envelope=null,this.modulationEnvelope=null,this.modulation=null,this},t.AMSynth}),e(function(t){return t.MonoSynth=function(e){e=t.defaultArg(e,t.MonoSynth.defaults),t.Monophonic.call(this,e),this.oscillator=new t.OmniOscillator(e.oscillator),this.frequency=this.oscillator.frequency,this.detune=this.oscillator.detune,this.filter=new t.Filter(e.filter),this.filterEnvelope=new t.FrequencyEnvelope(e.filterEnvelope),this.envelope=new t.AmplitudeEnvelope(e.envelope),this.oscillator.chain(this.filter,this.envelope,this.output),this.filterEnvelope.connect(this.filter.frequency),this._readOnly(["oscillator","frequency","detune","filter","filterEnvelope","envelope"])},t.extend(t.MonoSynth,t.Monophonic),t.MonoSynth.defaults={frequency:"C4",detune:0,oscillator:{type:"square"},filter:{Q:6,type:"lowpass",rolloff:-24},envelope:{attack:.005,decay:.1,sustain:.9,release:1},filterEnvelope:{attack:.06,decay:.2,sustain:.5,release:2,baseFrequency:200,octaves:7,exponent:2}},t.MonoSynth.prototype._triggerEnvelopeAttack=function(t,e){return t=this.toSeconds(t),this.envelope.triggerAttack(t,e),this.filterEnvelope.triggerAttack(t),this.oscillator.start(t),0===this.envelope.sustain&&this.oscillator.stop(t+this.envelope.attack+this.envelope.decay),this},t.MonoSynth.prototype._triggerEnvelopeRelease=function(t){return this.envelope.triggerRelease(t),this.filterEnvelope.triggerRelease(t),this.oscillator.stop(t+this.envelope.release),this},t.MonoSynth.prototype.dispose=function(){return t.Monophonic.prototype.dispose.call(this),this._writable(["oscillator","frequency","detune","filter","filterEnvelope","envelope"]),this.oscillator.dispose(),this.oscillator=null,this.envelope.dispose(),this.envelope=null,this.filterEnvelope.dispose(),this.filterEnvelope=null,this.filter.dispose(),this.filter=null,this.frequency=null,this.detune=null,this},t.MonoSynth}),e(function(t){return t.DuoSynth=function(e){e=t.defaultArg(e,t.DuoSynth.defaults),t.Monophonic.call(this,e),this.voice0=new t.MonoSynth(e.voice0),this.voice0.volume.value=-10,this.voice1=new t.MonoSynth(e.voice1),this.voice1.volume.value=-10,this._vibrato=new t.LFO(e.vibratoRate,-50,50),this._vibrato.start(),this.vibratoRate=this._vibrato.frequency,this._vibratoGain=new t.Gain(e.vibratoAmount,t.Type.Positive),this.vibratoAmount=this._vibratoGain.gain,this.frequency=new t.Signal(440,t.Type.Frequency),this.harmonicity=new t.Multiply(e.harmonicity),this.harmonicity.units=t.Type.Positive,this.frequency.connect(this.voice0.frequency),this.frequency.chain(this.harmonicity,this.voice1.frequency),this._vibrato.connect(this._vibratoGain),this._vibratoGain.fan(this.voice0.detune,this.voice1.detune),this.voice0.connect(this.output),this.voice1.connect(this.output),this._readOnly(["voice0","voice1","frequency","vibratoAmount","vibratoRate"])},t.extend(t.DuoSynth,t.Monophonic),t.DuoSynth.defaults={vibratoAmount:.5,vibratoRate:5,harmonicity:1.5,voice0:{volume:-10,portamento:0,oscillator:{type:"sine"},filterEnvelope:{attack:.01,decay:0,sustain:1,release:.5},envelope:{attack:.01,decay:0,sustain:1,release:.5}},voice1:{volume:-10,portamento:0,oscillator:{type:"sine"},filterEnvelope:{attack:.01,decay:0,sustain:1,release:.5},envelope:{attack:.01,decay:0,sustain:1,release:.5}}},t.DuoSynth.prototype._triggerEnvelopeAttack=function(t,e){return t=this.toSeconds(t),this.voice0._triggerEnvelopeAttack(t,e),this.voice1._triggerEnvelopeAttack(t,e),this},t.DuoSynth.prototype._triggerEnvelopeRelease=function(t){return this.voice0._triggerEnvelopeRelease(t),this.voice1._triggerEnvelopeRelease(t),this},t.DuoSynth.prototype.getLevelAtTime=function(t){return(this.voice0.getLevelAtTime(t)+this.voice1.getLevelAtTime(t))/2},t.DuoSynth.prototype.dispose=function(){return t.Monophonic.prototype.dispose.call(this),this._writable(["voice0","voice1","frequency","vibratoAmount","vibratoRate"]),this.voice0.dispose(),this.voice0=null,this.voice1.dispose(),this.voice1=null,this.frequency.dispose(),this.frequency=null,this._vibratoGain.dispose(),this._vibratoGain=null,this._vibrato=null,this.harmonicity.dispose(),this.harmonicity=null,this.vibratoAmount.dispose(),this.vibratoAmount=null,this.vibratoRate=null,this},t.DuoSynth}),e(function(t){return t.FMSynth=function(e){e=t.defaultArg(e,t.FMSynth.defaults),t.Monophonic.call(this,e),this._carrier=new t.Synth(e.carrier),this._carrier.volume.value=-10,this.oscillator=this._carrier.oscillator,this.envelope=this._carrier.envelope.set(e.envelope),this._modulator=new t.Synth(e.modulator),this._modulator.volume.value=-10,this.modulation=this._modulator.oscillator.set(e.modulation),this.modulationEnvelope=this._modulator.envelope.set(e.modulationEnvelope),this.frequency=new t.Signal(440,t.Type.Frequency),this.detune=new t.Signal(e.detune,t.Type.Cents),this.harmonicity=new t.Multiply(e.harmonicity),this.harmonicity.units=t.Type.Positive,this.modulationIndex=new t.Multiply(e.modulationIndex),this.modulationIndex.units=t.Type.Positive,this._modulationNode=new t.Gain(0),this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.frequency.chain(this.modulationIndex,this._modulationNode),this.detune.fan(this._carrier.detune,this._modulator.detune),this._modulator.connect(this._modulationNode.gain),this._modulationNode.connect(this._carrier.frequency),this._carrier.connect(this.output),this._readOnly(["frequency","harmonicity","modulationIndex","oscillator","envelope","modulation","modulationEnvelope","detune"])},t.extend(t.FMSynth,t.Monophonic),t.FMSynth.defaults={harmonicity:3,modulationIndex:10,detune:0,oscillator:{type:"sine"},envelope:{attack:.01,decay:.01,sustain:1,release:.5},modulation:{type:"square"},modulationEnvelope:{attack:.5,decay:0,sustain:1,release:.5}},t.FMSynth.prototype._triggerEnvelopeAttack=function(t,e){return t=this.toSeconds(t),this._carrier._triggerEnvelopeAttack(t,e),this._modulator._triggerEnvelopeAttack(t),this},t.FMSynth.prototype._triggerEnvelopeRelease=function(t){return t=this.toSeconds(t),this._carrier._triggerEnvelopeRelease(t),this._modulator._triggerEnvelopeRelease(t),this},t.FMSynth.prototype.dispose=function(){return t.Monophonic.prototype.dispose.call(this),this._writable(["frequency","harmonicity","modulationIndex","oscillator","envelope","modulation","modulationEnvelope","detune"]),this._carrier.dispose(),this._carrier=null,this._modulator.dispose(),this._modulator=null,this.frequency.dispose(),this.frequency=null,this.detune.dispose(),this.detune=null,this.modulationIndex.dispose(),this.modulationIndex=null,this.harmonicity.dispose(),this.harmonicity=null,this._modulationNode.dispose(),this._modulationNode=null,this.oscillator=null,this.envelope=null,this.modulationEnvelope=null,this.modulation=null,this},t.FMSynth}),e(function(t){return t.MembraneSynth=function(e){e=t.defaultArg(e,t.MembraneSynth.defaults),t.Instrument.call(this,e),this.oscillator=new t.OmniOscillator(e.oscillator),this.envelope=new t.AmplitudeEnvelope(e.envelope),this.octaves=e.octaves,this.pitchDecay=e.pitchDecay,this.oscillator.chain(this.envelope,this.output),this._readOnly(["oscillator","envelope"])},t.extend(t.MembraneSynth,t.Instrument),t.MembraneSynth.defaults={pitchDecay:.05,octaves:10,oscillator:{type:"sine"},envelope:{attack:.001,decay:.4,sustain:.01,release:1.4,attackCurve:"exponential"}},t.MembraneSynth.prototype.triggerAttack=function(t,e,i){e=this.toSeconds(e);var n=(t=this.toFrequency(t))*this.octaves;return this.oscillator.frequency.setValueAtTime(n,e),this.oscillator.frequency.exponentialRampToValueAtTime(t,e+this.toSeconds(this.pitchDecay)),this.envelope.triggerAttack(e,i),this.oscillator.start(e),this},t.MembraneSynth.prototype.triggerRelease=function(t){return t=this.toSeconds(t),this.envelope.triggerRelease(t),this.oscillator.stop(t+this.envelope.release),this},t.MembraneSynth.prototype.dispose=function(){return t.Instrument.prototype.dispose.call(this),this._writable(["oscillator","envelope"]),this.oscillator.dispose(),this.oscillator=null,this.envelope.dispose(),this.envelope=null,this},t.MembraneSynth}),e(function(t){var e=[1,1.483,1.932,2.546,2.63,3.897];return t.MetalSynth=function(i){i=t.defaultArg(i,t.MetalSynth.defaults),t.Instrument.call(this,i),this.frequency=new t.Signal(i.frequency,t.Type.Frequency),this._oscillators=[],this._freqMultipliers=[],this._amplitue=new t.Gain(0).connect(this.output),this._highpass=new t.Filter({type:"highpass",Q:-3.0102999566398125}).connect(this._amplitue),this._octaves=i.octaves,this._filterFreqScaler=new t.Scale(i.resonance,7e3),this.envelope=new t.Envelope({attack:i.envelope.attack,attackCurve:"linear",decay:i.envelope.decay,sustain:0,release:i.envelope.release}).chain(this._filterFreqScaler,this._highpass.frequency),this.envelope.connect(this._amplitue.gain);for(var n=0;n<e.length;n++){var s=new t.FMOscillator({type:"square",modulationType:"square",harmonicity:i.harmonicity,modulationIndex:i.modulationIndex});s.connect(this._highpass),this._oscillators[n]=s;var r=new t.Multiply(e[n]);this._freqMultipliers[n]=r,this.frequency.chain(r,s.frequency)}this.octaves=i.octaves},t.extend(t.MetalSynth,t.Instrument),t.MetalSynth.defaults={frequency:200,envelope:{attack:.001,decay:1.4,release:.2},harmonicity:5.1,modulationIndex:32,resonance:4e3,octaves:1.5},t.MetalSynth.prototype.triggerAttack=function(e,i){return e=this.toSeconds(e),i=t.defaultArg(i,1),this.envelope.triggerAttack(e,i),this._oscillators.forEach(function(t){t.start(e)}),0===this.envelope.sustain&&this._oscillators.forEach(function(t){t.stop(e+this.envelope.attack+this.envelope.decay)}.bind(this)),this},t.MetalSynth.prototype.triggerRelease=function(t){return t=this.toSeconds(t),this.envelope.triggerRelease(t),this._oscillators.forEach(function(e){e.stop(t+this.envelope.release)}.bind(this)),this},t.MetalSynth.prototype.sync=function(){return this._syncMethod("triggerAttack",0),this._syncMethod("triggerRelease",0),this},t.MetalSynth.prototype.triggerAttackRelease=function(t,e,i){return e=this.toSeconds(e),t=this.toSeconds(t),this.triggerAttack(e,i),this.triggerRelease(e+t),this},Object.defineProperty(t.MetalSynth.prototype,"modulationIndex",{get:function(){return this._oscillators[0].modulationIndex.value},set:function(t){for(var e=0;e<this._oscillators.length;e++)this._oscillators[e].modulationIndex.value=t}}),Object.defineProperty(t.MetalSynth.prototype,"harmonicity",{get:function(){return this._oscillators[0].harmonicity.value},set:function(t){for(var e=0;e<this._oscillators.length;e++)this._oscillators[e].harmonicity.value=t}}),Object.defineProperty(t.MetalSynth.prototype,"resonance",{get:function(){return this._filterFreqScaler.min},set:function(t){this._filterFreqScaler.min=t,this.octaves=this._octaves}}),Object.defineProperty(t.MetalSynth.prototype,"octaves",{get:function(){return this._octaves},set:function(t){this._octaves=t,this._filterFreqScaler.max=this._filterFreqScaler.min*Math.pow(2,t)}}),t.MetalSynth.prototype.dispose=function(){t.Instrument.prototype.dispose.call(this);for(var e=0;e<this._oscillators.length;e++)this._oscillators[e].dispose(),this._freqMultipliers[e].dispose();this._oscillators=null,this._freqMultipliers=null,this.frequency.dispose(),this.frequency=null,this._filterFreqScaler.dispose(),this._filterFreqScaler=null,this._amplitue.dispose(),this._amplitue=null,this.envelope.dispose(),this.envelope=null,this._highpass.dispose(),this._highpass=null},t.MetalSynth}),e(function(t){return t.NoiseSynth=function(e){e=t.defaultArg(e,t.NoiseSynth.defaults),t.Instrument.call(this,e),this.noise=new t.Noise,this.envelope=new t.AmplitudeEnvelope(e.envelope),this.noise.chain(this.envelope,this.output),this._readOnly(["noise","envelope"])},t.extend(t.NoiseSynth,t.Instrument),t.NoiseSynth.defaults={noise:{type:"white"},envelope:{attack:.005,decay:.1,sustain:0}},t.NoiseSynth.prototype.triggerAttack=function(t,e){return this.envelope.triggerAttack(t,e),this.noise.start(t),0===this.envelope.sustain&&this.noise.stop(t=this.envelope.attack+this.envelope.decay),this},t.NoiseSynth.prototype.triggerRelease=function(t){return this.envelope.triggerRelease(t),this.noise.stop(t+this.envelope.release),this},t.NoiseSynth.prototype.sync=function(){return this._syncMethod("triggerAttack",0),this._syncMethod("triggerRelease",0),this},t.NoiseSynth.prototype.triggerAttackRelease=function(t,e,i){return e=this.toSeconds(e),t=this.toSeconds(t),this.triggerAttack(e,i),this.triggerRelease(e+t),this},t.NoiseSynth.prototype.dispose=function(){return t.Instrument.prototype.dispose.call(this),this._writable(["noise","envelope"]),this.noise.dispose(),this.noise=null,this.envelope.dispose(),this.envelope=null,this},t.NoiseSynth}),e(function(t){return t.PluckSynth=function(e){e=t.defaultArg(e,t.PluckSynth.defaults),t.Instrument.call(this,e),this._noise=new t.Noise("pink"),this.attackNoise=e.attackNoise,this._lfcf=new t.LowpassCombFilter({resonance:e.resonance,dampening:e.dampening}),this.resonance=this._lfcf.resonance,this.dampening=this._lfcf.dampening,this._noise.connect(this._lfcf),this._lfcf.connect(this.output),this._readOnly(["resonance","dampening"])},t.extend(t.PluckSynth,t.Instrument),t.PluckSynth.defaults={attackNoise:1,dampening:4e3,resonance:.7},t.PluckSynth.prototype.triggerAttack=function(t,e){t=this.toFrequency(t),e=this.toSeconds(e);var i=1/t;return this._lfcf.delayTime.setValueAtTime(i,e),this._noise.start(e),this._noise.stop(e+i*this.attackNoise),this},t.PluckSynth.prototype.dispose=function(){return t.Instrument.prototype.dispose.call(this),this._noise.dispose(),this._lfcf.dispose(),this._noise=null,this._lfcf=null,this._writable(["resonance","dampening"]),this.dampening=null,this.resonance=null,this},t.PluckSynth}),e(function(t){return t.PolySynth=function(){var e=t.defaults(arguments,["polyphony","voice"],t.PolySynth);t.Instrument.call(this,e),(e=t.defaultArg(e,t.Instrument.defaults)).polyphony=Math.min(t.PolySynth.MAX_POLYPHONY,e.polyphony),this.voices=new Array(e.polyphony),this._triggers=new Array(e.polyphony),this.detune=new t.Signal(e.detune,t.Type.Cents),this._readOnly("detune");for(var i=0;i<e.polyphony;i++){var n=new e.voice(arguments[2],arguments[3]);if(!(n instanceof t.Monophonic))throw new Error("Synth constructor must be instance of Tone.Monophonic");this.voices[i]=n,n.connect(this.output),n.hasOwnProperty("detune")&&this.detune.connect(n.detune),this._triggers[i]={release:-1,note:null,voice:n}}},t.extend(t.PolySynth,t.Instrument),t.PolySynth.defaults={polyphony:4,volume:0,detune:0,voice:t.Synth},t.PolySynth.prototype.triggerAttack=function(t,e,i){Array.isArray(t)||(t=[t]),e=this.toSeconds(e);for(var n=0;n<t.length;n++){for(var s=t[n],r=this._triggers[0],o=1;o<this._triggers.length;o++)this._triggers[o].release<r.release&&(r=this._triggers[o]);r.release=1/0,r.note=JSON.stringify(s),r.voice.triggerAttack(s,e,i)}return this},t.PolySynth.prototype.triggerAttackRelease=function(e,i,n,s){if(n=this.toSeconds(n),this.triggerAttack(e,n,s),t.isArray(i)&&t.isArray(e))for(var r=0;r<e.length;r++){var o=i[Math.min(r,i.length-1)];this.triggerRelease(e[r],n+this.toSeconds(o))}else this.triggerRelease(e,n+this.toSeconds(i));return this},t.PolySynth.prototype.triggerRelease=function(t,e){Array.isArray(t)||(t=[t]),e=this.toSeconds(e);for(var i=0;i<t.length;i++)for(var n=JSON.stringify(t[i]),s=0;s<this._triggers.length;s++){var r=this._triggers[s];r.note===n&&r.release>e&&(r.voice.triggerRelease(e),r.release=e)}return this},t.PolySynth.prototype.sync=function(){return this._syncMethod("triggerAttack",1),this._syncMethod("triggerRelease",1),this},t.PolySynth.prototype.set=function(t,e,i){for(var n=0;n<this.voices.length;n++)this.voices[n].set(t,e,i);return this},t.PolySynth.prototype.get=function(t){return this.voices[0].get(t)},t.PolySynth.prototype.releaseAll=function(t){t=this.toSeconds(t);for(var e=0;e<this._triggers.length;e++){var i=this._triggers[e];i.release>t&&(i.release=t,i.voice.triggerRelease(t))}return this},t.PolySynth.prototype.dispose=function(){t.Instrument.prototype.dispose.call(this);for(var e=0;e<this.voices.length;e++)this.voices[e].dispose(),this.voices[e]=null;return this._writable("detune"),this.detune.dispose(),this.detune=null,this.voices=null,this._triggers=null,this},t.PolySynth.MAX_POLYPHONY=20,t.PolySynth}),e(function(t){return t.Sampler=function(e){var i=Array.prototype.slice.call(arguments);i.shift();var n=t.defaults(i,["onload","baseUrl"],t.Sampler);t.Instrument.call(this,n);var s={};for(var r in e)if(t.isNote(r)){s[t.Frequency(r).toMidi()]=e[r]}else{if(isNaN(parseFloat(r)))throw new Error("Tone.Sampler: url keys must be the note's pitch");s[r]=e[r]}this._buffers=new t.Buffers(s,n.onload,n.baseUrl),this._activeSources={},this.attack=n.attack,this.release=n.release},t.extend(t.Sampler,t.Instrument),t.Sampler.defaults={attack:0,release:.1,onload:t.noOp,baseUrl:""},t.Sampler.prototype._findClosest=function(t){for(var e=0;e<96;){if(this._buffers.has(t+e))return-e;if(this._buffers.has(t-e))return e;e++}return null},t.Sampler.prototype.triggerAttack=function(e,i,n){var s=t.Frequency(e).toMidi(),r=this._findClosest(s);if(null!==r){var o=s-r,a=this._buffers.get(o),h=new t.BufferSource({buffer:a,playbackRate:t.intervalToFrequencyRatio(r),fadeIn:this.attack,fadeOut:this.release,curve:"exponential"}).connect(this.output);h.start(i,0,a.duration,n),t.isArray(this._activeSources[s])||(this._activeSources[s]=[]),this._activeSources[s].push({note:s,source:h})}return this},t.Sampler.prototype.triggerRelease=function(e,i){var n=t.Frequency(e).toMidi();if(this._activeSources[n]&&this._activeSources[n].length){var s=this._activeSources[n].shift().source;i=this.toSeconds(i),s.stop(i+this.release,this.release)}return this},t.Sampler.prototype.releaseAll=function(t){for(var e in t=this.toSeconds(t),this._activeSources)for(var i=this._activeSources[e];i.length;){i.shift().source.stop(t+this.release,this.release)}return this},t.Sampler.prototype.sync=function(){return this._syncMethod("triggerAttack",1),this._syncMethod("triggerRelease",1),this},t.Sampler.prototype.triggerAttackRelease=function(t,e,i,n){return i=this.toSeconds(i),e=this.toSeconds(e),this.triggerAttack(t,i,n),this.triggerRelease(t,i+e),this},t.Sampler.prototype.add=function(e,i,n){if(t.isNote(e)){var s=t.Frequency(e).toMidi();this._buffers.add(s,i,n)}else{if(isNaN(parseFloat(e)))throw new Error("Tone.Sampler: note must be the note's pitch. Instead got "+e);this._buffers.add(e,i,n)}},Object.defineProperty(t.Sampler.prototype,"loaded",{get:function(){return this._buffers.loaded}}),t.Sampler.prototype.dispose=function(){for(var e in t.Instrument.prototype.dispose.call(this),this._buffers.dispose(),this._buffers=null,this._activeSources)this._activeSources[e].forEach(function(t){t.source.dispose()});return this._activeSources=null,this},t.Sampler}),e(function(t){t.supported&&(OscillatorNode.prototype.setPeriodicWave||(OscillatorNode.prototype.setPeriodicWave=OscillatorNode.prototype.setWaveTable),AudioContext.prototype.createPeriodicWave||(AudioContext.prototype.createPeriodicWave=AudioContext.prototype.createWaveTable))}),e(function(t){return t.GainToAudio=function(){t.SignalBase.call(this),this._norm=this.input=this.output=new t.WaveShaper(function(t){return 2*Math.abs(t)-1})},t.extend(t.GainToAudio,t.SignalBase),t.GainToAudio.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._norm.dispose(),this._norm=null,this},t.GainToAudio}),e(function(t){return t.Normalize=function(e,i){t.SignalBase.call(this),this._inputMin=t.defaultArg(e,0),this._inputMax=t.defaultArg(i,1),this._sub=this.input=new t.Add(0),this._div=this.output=new t.Multiply(1),this._sub.connect(this._div),this._setRange()},t.extend(t.Normalize,t.SignalBase),Object.defineProperty(t.Normalize.prototype,"min",{get:function(){return this._inputMin},set:function(t){this._inputMin=t,this._setRange()}}),Object.defineProperty(t.Normalize.prototype,"max",{get:function(){return this._inputMax},set:function(t){this._inputMax=t,this._setRange()}}),t.Normalize.prototype._setRange=function(){this._sub.value=-this._inputMin,this._div.value=1/(this._inputMax-this._inputMin)},t.Normalize.prototype.dispose=function(){return t.SignalBase.prototype.dispose.call(this),this._sub.dispose(),this._sub=null,this._div.dispose(),this._div=null,this},t.Normalize}),e(function(t){return t.TransportTimelineSignal=function(){t.Signal.apply(this,arguments),this.output=this._outputSig=new t.Signal(this._initialValue),this._lastVal=this.value,this._synced=t.Transport.scheduleRepeat(this._onTick.bind(this),"1i"),this._bindAnchorValue=this._anchorValue.bind(this),t.Transport.on("start stop pause",this._bindAnchorValue),this._events.memory=1/0},t.extend(t.TransportTimelineSignal,t.Signal),t.TransportTimelineSignal.prototype._onTick=function(e){var i=this.getValueAtTime(t.Transport.seconds);this._lastVal!==i&&(this._lastVal=i,this._outputSig.linearRampToValueAtTime(i,e))},t.TransportTimelineSignal.prototype._anchorValue=function(e){var i=this.getValueAtTime(t.Transport.seconds);return this._lastVal=i,this._outputSig.cancelScheduledValues(e),this._outputSig.setValueAtTime(i,e),this},t.TransportTimelineSignal.prototype.getValueAtTime=function(e){return e=t.TransportTime(e),t.Signal.prototype.getValueAtTime.call(this,e)},t.TransportTimelineSignal.prototype.setValueAtTime=function(e,i){return i=t.TransportTime(i),t.Signal.prototype.setValueAtTime.call(this,e,i),this},t.TransportTimelineSignal.prototype.linearRampToValueAtTime=function(e,i){return i=t.TransportTime(i),t.Signal.prototype.linearRampToValueAtTime.call(this,e,i),this},t.TransportTimelineSignal.prototype.exponentialRampToValueAtTime=function(e,i){return i=t.TransportTime(i),t.Signal.prototype.exponentialRampToValueAtTime.call(this,e,i),this},t.TransportTimelineSignal.prototype.setTargetAtTime=function(e,i,n){return i=t.TransportTime(i),t.Signal.prototype.setTargetAtTime.call(this,e,i,n),this},t.TransportTimelineSignal.prototype.cancelScheduledValues=function(e){return e=t.TransportTime(e),t.Signal.prototype.cancelScheduledValues.call(this,e),this},t.TransportTimelineSignal.prototype.setValueCurveAtTime=function(e,i,n,s){return i=t.TransportTime(i),n=t.TransportTime(n),t.Signal.prototype.setValueCurveAtTime.call(this,e,i,n,s),this},t.TransportTimelineSignal.prototype.cancelAndHoldAtTime=function(e){return t.Signal.prototype.cancelAndHoldAtTime.call(this,t.TransportTime(e))},t.TransportTimelineSignal.prototype.dispose=function(){t.Transport.clear(this._synced),t.Transport.off("start stop pause",this._syncedCallback),this._events.cancel(0),t.Signal.prototype.dispose.call(this),this._outputSig.dispose(),this._outputSig=null},t.TransportTimelineSignal}),e(function(t){return t.GrainPlayer=function(){var e=t.defaults(arguments,["url","onload"],t.GrainPlayer);t.Source.call(this,e),this.buffer=new t.Buffer(e.url,e.onload),this._clock=new t.Clock(this._tick.bind(this),e.grainSize),this._loopStart=0,this._loopEnd=0,this._activeSources=[],this._playbackRate=e.playbackRate,this._grainSize=e.grainSize,this._overlap=e.overlap,this.detune=e.detune,this.overlap=e.overlap,this.loop=e.loop,this.playbackRate=e.playbackRate,this.grainSize=e.grainSize,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this.reverse=e.reverse,this._clock.on("stop",this._onstop.bind(this))},t.extend(t.GrainPlayer,t.Source),t.GrainPlayer.defaults={onload:t.noOp,overlap:.1,grainSize:.2,playbackRate:1,detune:0,loop:!1,loopStart:0,loopEnd:0,reverse:!1},t.GrainPlayer.prototype._start=function(e,i,n){i=t.defaultArg(i,0),i=this.toSeconds(i),e=this.toSeconds(e),this._offset=i,this._clock.start(e),n&&this.stop(e+this.toSeconds(n))},t.GrainPlayer.prototype._stop=function(t){this._clock.stop(t)},t.GrainPlayer.prototype._onstop=function(t){this._activeSources.forEach(function(e){e.stop(t,0)})},t.GrainPlayer.prototype._tick=function(e){var i=this._offset<this._overlap?0:this._overlap,n=new t.BufferSource({buffer:this.buffer,fadeIn:i,fadeOut:this._overlap,loop:this.loop,loopStart:this._loopStart,loopEnd:this._loopEnd,playbackRate:t.intervalToFrequencyRatio(this.detune/100)}).connect(this.output);n.start(e,this._offset),this._offset+=this.grainSize,n.stop(e+this.grainSize),this._activeSources.push(n),n.onended=function(){var t=this._activeSources.indexOf(n);-1!==t&&this._activeSources.splice(t,1)}.bind(this)},t.GrainPlayer.prototype.seek=function(t,e){return this._offset=this.toSeconds(t),this._tick(this.toSeconds(e)),this},Object.defineProperty(t.GrainPlayer.prototype,"playbackRate",{get:function(){return this._playbackRate},set:function(t){this._playbackRate=t,this.grainSize=this._grainSize}}),Object.defineProperty(t.GrainPlayer.prototype,"loopStart",{get:function(){return this._loopStart},set:function(t){this._loopStart=this.toSeconds(t)}}),Object.defineProperty(t.GrainPlayer.prototype,"loopEnd",{get:function(){return this._loopEnd},set:function(t){this._loopEnd=this.toSeconds(t)}}),Object.defineProperty(t.GrainPlayer.prototype,"reverse",{get:function(){return this.buffer.reverse},set:function(t){this.buffer.reverse=t}}),Object.defineProperty(t.GrainPlayer.prototype,"grainSize",{get:function(){return this._grainSize},set:function(t){this._grainSize=this.toSeconds(t),this._clock.frequency.value=this._playbackRate/this._grainSize}}),Object.defineProperty(t.GrainPlayer.prototype,"overlap",{get:function(){return this._overlap},set:function(t){this._overlap=this.toSeconds(t)}}),t.GrainPlayer.prototype.dispose=function(){return t.Source.prototype.dispose.call(this),this.buffer.dispose(),this.buffer=null,this._clock.dispose(),this._clock=null,this._activeSources.forEach(function(t){t.dispose()}),this._activeSources=null,this},t.GrainPlayer}),e(function(t){return t.Player=function(e){var i;e instanceof t.Buffer&&e.loaded?(e=e.get(),i=t.Player.defaults):i=t.defaults(arguments,["url","onload"],t.Player),t.Source.call(this,i),this.autostart=i.autostart,this._buffer=new t.Buffer({url:i.url,onload:this._onload.bind(this,i.onload),reverse:i.reverse}),e instanceof AudioBuffer&&this._buffer.set(e),this._loop=i.loop,this._loopStart=i.loopStart,this._loopEnd=i.loopEnd,this._playbackRate=i.playbackRate,this._activeSources=[],this._elapsedTime=new t.TickSource(i.playbackRate),this.fadeIn=i.fadeIn,this.fadeOut=i.fadeOut},t.extend(t.Player,t.Source),t.Player.defaults={onload:t.noOp,playbackRate:1,loop:!1,autostart:!1,loopStart:0,loopEnd:0,retrigger:!1,reverse:!1,fadeIn:0,fadeOut:0},t.Player.prototype.load=function(t,e){return this._buffer.load(t,this._onload.bind(this,e))},t.Player.prototype._onload=function(e){(e=t.defaultArg(e,t.noOp))(this),this.autostart&&this.start()},t.Player.prototype._onSourceEnd=function(t){var e=this._activeSources.indexOf(t);this._activeSources.splice(e,1)},t.Player.prototype._start=function(e,i,n){i=this._loop?t.defaultArg(i,this._loopStart):t.defaultArg(i,0),i=this.toSeconds(i);var s=t.defaultArg(n,Math.max(this._buffer.duration-i,0));s=this.toSeconds(s),e=this.toSeconds(e),this._elapsedTime.start(e,i);var r=new t.BufferSource({buffer:this._buffer,loop:this._loop,loopStart:this._loopStart,loopEnd:this._loopEnd,onended:this._onSourceEnd.bind(this),playbackRate:this._playbackRate,fadeIn:this.fadeIn,fadeOut:this.fadeOut}).connect(this.output);return this._loop||this._synced||this._state.setStateAtTime(t.State.Stopped,e+s/this._playbackRate),this._activeSources.push(r),this._loop&&t.isUndef(n)?r.start(e,i):r.start(e,i,s),this},t.Player.prototype._stop=function(t){return t=this.toSeconds(t),this._elapsedTime.stop(t),this._activeSources.forEach(function(e){e.stop(t)}),this},t.Player.prototype.restart=function(t,e,i){return this._stop(t),this._start(t,e,i),this},t.Player.prototype.seek=function(e,i){return i=this.toSeconds(i),this._state.getValueAtTime(i)===t.State.Started&&(e=this.toSeconds(e),this._stop(i),this._start(i,e)),this},t.Player.prototype.setLoopPoints=function(t,e){return this.loopStart=t,this.loopEnd=e,this},Object.defineProperty(t.Player.prototype,"loopStart",{get:function(){return this._loopStart},set:function(t){this._loopStart=t,this._activeSources.forEach(function(e){e.loopStart=t})}}),Object.defineProperty(t.Player.prototype,"loopEnd",{get:function(){return this._loopEnd},set:function(t){this._loopEnd=t,this._activeSources.forEach(function(e){e.loopEnd=t})}}),Object.defineProperty(t.Player.prototype,"buffer",{get:function(){return this._buffer},set:function(t){this._buffer.set(t)}}),Object.defineProperty(t.Player.prototype,"loop",{get:function(){return this._loop},set:function(e){if(this._loop!==e){this._loop=e;var i=this.now();if(e){var n=this._state.getNextState(t.State.Stopped,i);n&&(this._activeSources.forEach(function(t){t.loop=e}),this._state.cancel(n.time),this._elapsedTime.cancel(n.time))}else this._stopAtNextIteration(i)}}}),t.Player.prototype._stopAtNextIteration=function(e){if(this._state.getValueAtTime(e)===t.State.Started){var i=this._state.getNextState(t.State.Stopped,e),n=this._elapsedTime.getTicksAtTime(e),s=Math.max(Math.ceil(n/this.buffer.duration),1),r=this._elapsedTime.getTimeOfTick(s*this.buffer.duration,i?i.time-this.sampleTime:1/0);this.stop(r)}},Object.defineProperty(t.Player.prototype,"playbackRate",{get:function(){return this._playbackRate},set:function(t){this._playbackRate=t;var e=this.now();this._elapsedTime.frequency.setValueAtTime(t,e),this._loop||this._stopAtNextIteration(e),this._activeSources.forEach(function(i){i.playbackRate.setValueAtTime(t,e)})}}),Object.defineProperty(t.Player.prototype,"position",{get:function(){var e=this.now();if(this._state.getValueAtTime(e)===t.State.Started&&this.loaded){var i=this.buffer.duration;return this._elapsedTime.getTicksAtTime(e)%i}return 0}}),Object.defineProperty(t.Player.prototype,"reverse",{get:function(){return this._buffer.reverse},set:function(t){this._buffer.reverse=t}}),Object.defineProperty(t.Player.prototype,"loaded",{get:function(){return this._buffer.loaded}}),t.Player.prototype.dispose=function(){return this._activeSources.forEach(function(t){t.dispose()}),this._activeSources=null,t.Source.prototype.dispose.call(this),this._buffer.dispose(),this._buffer=null,this._elapsedTime.dispose(),this._elapsedTime=null,this},t.Player}),e(function(t){return t.Players=function(e){var i=Array.prototype.slice.call(arguments);i.shift();var n=t.defaults(i,["onload"],t.Players);for(var s in t.call(this),this._volume=this.output=new t.Volume(n.volume),this.volume=this._volume.volume,this._readOnly("volume"),this._volume.output.output.channelCount=2,this._volume.output.output.channelCountMode="explicit",this.mute=n.mute,this._players={},this._loadingCount=0,this._fadeIn=n.fadeIn,this._fadeOut=n.fadeOut,e)this._loadingCount++,this.add(s,e[s],this._bufferLoaded.bind(this,n.onload))},t.extend(t.Players,t.AudioNode),t.Players.defaults={volume:0,mute:!1,onload:t.noOp,fadeIn:0,fadeOut:0},t.Players.prototype._bufferLoaded=function(t){this._loadingCount--,0===this._loadingCount&&t&&t(this)},Object.defineProperty(t.Players.prototype,"mute",{get:function(){return this._volume.mute},set:function(t){this._volume.mute=t}}),Object.defineProperty(t.Players.prototype,"fadeIn",{get:function(){return this._fadeIn},set:function(t){this._fadeIn=t,this._forEach(function(e){e.fadeIn=t})}}),Object.defineProperty(t.Players.prototype,"fadeOut",{get:function(){return this._fadeOut},set:function(t){this._fadeOut=t,this._forEach(function(e){e.fadeOut=t})}}),Object.defineProperty(t.Players.prototype,"state",{get:function(){var e=!1;return this._forEach(function(i){e=e||i.state===t.State.Started}),e?t.State.Started:t.State.Stopped}}),t.Players.prototype.has=function(t){return this._players.hasOwnProperty(t)},t.Players.prototype.get=function(t){if(this.has(t))return this._players[t];throw new Error("Tone.Players: no player named "+t)},t.Players.prototype._forEach=function(t){for(var e in this._players)t(this._players[e],e);return this},Object.defineProperty(t.Players.prototype,"loaded",{get:function(){var t=!0;return this._forEach(function(e){t=t&&e.loaded}),t}}),t.Players.prototype.add=function(e,i,n){return this._players[e]=new t.Player(i,n).connect(this.output),this._players[e].fadeIn=this._fadeIn,this._players[e].fadeOut=this._fadeOut,this},t.Players.prototype.stopAll=function(t){this._forEach(function(e){e.stop(t)})},t.Players.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this._volume.dispose(),this._volume=null,this._writable("volume"),this.volume=null,this.output=null,this._forEach(function(t){t.dispose()}),this._players=null,this},t.Players}),e(function(t){return t.UserMedia=function(){var e=t.defaults(arguments,["volume"],t.UserMedia);t.AudioNode.call(this),this._mediaStream=null,this._stream=null,this._device=null,this._volume=this.output=new t.Volume(e.volume),this.volume=this._volume.volume,this._readOnly("volume"),this.mute=e.mute},t.extend(t.UserMedia,t.AudioNode),t.UserMedia.defaults={volume:0,mute:!1},t.UserMedia.prototype.open=function(e){return t.UserMedia.enumerateDevices().then(function(i){var n;if(t.isNumber(e))n=i[e];else if(!(n=i.find(function(t){return t.label===e||t.deviceId===e}))&&i.length>0)n=i[0];else if(!n&&t.isDefined(e))throw new Error("Tone.UserMedia: no matching device: "+e);this._device=n;var s={audio:{echoCancellation:!1,sampleRate:this.context.sampleRate}};return n&&(s.audio.deviceId=n.deviceId),navigator.mediaDevices.getUserMedia(s).then(function(t){return this._stream||(this._stream=t,this._mediaStream=this.context.createMediaStreamSource(t),this._mediaStream.connect(this.output)),this}.bind(this))}.bind(this))},t.UserMedia.prototype.close=function(){return this._stream&&(this._stream.getAudioTracks().forEach(function(t){t.stop()}),this._stream=null,this._mediaStream.disconnect(),this._mediaStream=null),this._device=null,this},t.UserMedia.enumerateDevices=function(){return navigator.mediaDevices.enumerateDevices().then(function(t){return t.filter(function(t){return"audioinput"===t.kind})})},Object.defineProperty(t.UserMedia.prototype,"state",{get:function(){return this._stream&&this._stream.active?t.State.Started:t.State.Stopped}}),Object.defineProperty(t.UserMedia.prototype,"deviceId",{get:function(){if(this._device)return this._device.deviceId}}),Object.defineProperty(t.UserMedia.prototype,"groupId",{get:function(){if(this._device)return this._device.groupId}}),Object.defineProperty(t.UserMedia.prototype,"label",{get:function(){if(this._device)return this._device.label}}),Object.defineProperty(t.UserMedia.prototype,"mute",{get:function(){return this._volume.mute},set:function(t){this._volume.mute=t}}),t.UserMedia.prototype.dispose=function(){return t.AudioNode.prototype.dispose.call(this),this.close(),this._writable("volume"),this._volume.dispose(),this._volume=null,this.volume=null,this},Object.defineProperty(t.UserMedia,"supported",{get:function(){return t.isDefined(navigator.mediaDevices)&&t.isFunction(navigator.mediaDevices.getUserMedia)}}),t.UserMedia}),e(function(t){return t.Midi=function(e,i){if(!(this instanceof t.Midi))return new t.Midi(e,i);t.Frequency.call(this,e,i)},t.extend(t.Midi,t.Frequency),t.Midi.prototype._defaultUnits="midi",t.Midi.prototype._frequencyToUnits=function(e){return t.Frequency.ftom(t.Frequency.prototype._frequencyToUnits.call(this,e))},t.Midi.prototype._ticksToUnits=function(e){return t.Frequency.ftom(t.Frequency.prototype._ticksToUnits.call(this,e))},t.Midi.prototype._beatsToUnits=function(e){return t.Frequency.ftom(t.Frequency.prototype._beatsToUnits.call(this,e))},t.Midi.prototype._secondsToUnits=function(e){return t.Frequency.ftom(t.Frequency.prototype._secondsToUnits.call(this,e))},t.Midi.prototype.toMidi=function(){return this.valueOf()},t.Midi.prototype.toFrequency=function(){return t.Frequency.mtof(this.toMidi())},t.Midi.prototype.transpose=function(t){return new this.constructor(this.toMidi()+t)},t.Midi}),t})},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,i){"use strict";(function(t){var n=i(5),s=n.Buffer,r=n.SlowBuffer,o=n.kMaxLength||2147483647;e.alloc=function(t,e,i){if("function"==typeof s.alloc)return s.alloc(t,e,i);if("number"==typeof i)throw new TypeError("encoding must not be number");if("number"!=typeof t)throw new TypeError("size must be a number");if(t>o)throw new RangeError("size is too large");var n=i,r=e;void 0===r&&(n=void 0,r=0);var a=new s(t);if("string"==typeof r)for(var h=new s(r,n),u=h.length,l=-1;++l<t;)a[l]=h[l%u];else a.fill(r);return a},e.allocUnsafe=function(t){if("function"==typeof s.allocUnsafe)return s.allocUnsafe(t);if("number"!=typeof t)throw new TypeError("size must be a number");if(t>o)throw new RangeError("size is too large");return new s(t)},e.from=function(e,i,n){if("function"==typeof s.from&&(!t.Uint8Array||Uint8Array.from!==s.from))return s.from(e,i,n);if("number"==typeof e)throw new TypeError('"value" argument must not be a number');if("string"==typeof e)return new s(e,i);if("undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer){var r=i;if(1===arguments.length)return new s(e);void 0===r&&(r=0);var o=n;if(void 0===o&&(o=e.byteLength-r),r>=e.byteLength)throw new RangeError("'offset' is out of bounds");if(o>e.byteLength-r)throw new RangeError("'length' is out of bounds");return new s(e.slice(r,r+o))}if(s.isBuffer(e)){var a=new s(e.length);return e.copy(a,0,0,e.length),a}if(e){if(Array.isArray(e)||"undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return new s(e);if("Buffer"===e.type&&Array.isArray(e.data))return new s(e.data)}throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")},e.allocUnsafeSlow=function(t){if("function"==typeof s.allocUnsafeSlow)return s.allocUnsafeSlow(t);if("number"!=typeof t)throw new TypeError("size must be a number");if(t>=o)throw new RangeError("size is too large");return new r(t)}}).call(e,i(17))},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,i){var n=i(20),s=i(2).document,r=n(s)&&n(s.createElement);t.exports=function(t){return r?s.createElement(t):{}}},function(t,e,i){var n=i(20);t.exports=function(t,e){if(!n(t))return t;var i,s;if(e&&"function"==typeof(i=t.toString)&&!n(s=i.call(t)))return s;if("function"==typeof(i=t.valueOf)&&!n(s=i.call(t)))return s;if(!e&&"function"==typeof(i=t.toString)&&!n(s=i.call(t)))return s;throw TypeError("Can't convert object to primitive value")}},function(t,e,i){var n=i(37),s=Math.min;t.exports=function(t){return t>0?s(n(t),9007199254740991):0}},function(t,e){var i=Math.ceil,n=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?n:i)(t)}},function(t,e,i){var n=i(39)("keys"),s=i(26);t.exports=function(t){return n[t]||(n[t]=s(t))}},function(t,e,i){var n=i(2),s=n["__core-js_shared__"]||(n["__core-js_shared__"]={});t.exports=function(t){return s[t]||(s[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,i){var n=i(18),s=i(1)("toStringTag"),r="Arguments"==n(function(){return arguments}());t.exports=function(t){var e,i,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),s))?i:r?n(e):"Object"==(o=n(e))&&"function"==typeof e.callee?"Arguments":o}},function(t,e,i){var n=i(41),s=i(1)("iterator"),r=i(14);t.exports=i(0).getIteratorMethod=function(t){if(void 0!=t)return t[s]||t["@@iterator"]||r[n(t)]}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.browser=e.isDesktop=e.isMobile=e.isAndroid=e.isIpad=e.isIphone=void 0;var n=a(i(102)),s=a(i(65));e.choice=function(t){return t[Math.floor(Math.random()*t.length)]},e.mod=function(t,e){return t-e*Math.floor(t/e)},e.norm=function(t,e,i){return(t-e)/(i-e)},e.requestAudioContext=function(t){if(c){var e=document.createElement("div"),i=document.createElement("div");i.innerHTML="Tap to start - please unmute your phone",(0,s.default)(e.style,{position:"absolute",width:"100%",height:"100%",zIndex:"10000",top:"0px",left:"0px",backgroundColor:"rgba(0, 0, 0, 0.8)"}),(0,s.default)(i.style,{position:"absolute",left:"50%",top:"50%",padding:"20px",backgroundColor:"#7F33ED",color:"white",fontFamily:"monospace",borderRadius:"3px",transform:"translate3D(-50%,-50%,0)",textAlign:"center",lineHeight:"1.5"}),e.appendChild(i),document.body.appendChild(e),o.default.setContext(r.default.context),o.default.on(i),o.default.onStarted(function(i){e.remove(),t()})}else t()},e.dataURItoBlob=function(t){for(var e=atob(t.split(",")[1]),i=t.split(",")[0].split(":")[1].split(";")[0],n=new ArrayBuffer(e.length),s=new Uint8Array(n),r=0;r<e.length;r++)s[r]=e.charCodeAt(r);return new Blob([n],{type:i})},e.ftom=function(t){return 69+12*(0,n.default)(t/440)},e.mtof=function(t){return 440*Math.pow(2,(t-69)/12)},e.tap=function(t){return function(e){f.isMobile?t():e.press&&t()}},e.get_diff_bounds=function(t){var e=t.map(function(t){var e=Math.min.apply(Math,t),i=Math.max.apply(Math,t);return i-e}),i=Math.min.apply(Math,e),n=Math.max.apply(Math,e);return{min:i,max:n}},e.get_bounds=function(t){var e=t.lines,i=(e=e.map(function(t){return t.map(function(t){return parseFloat(t)})})).reduce(function(t,e){return e.reduce(function(t,e){return Math.max(t,e)},t)},-1/0),n=e.reduce(function(t,e){return e.reduce(function(t,e){return Math.min(t,e)},t)},1/0);return{rows:e,max:i,min:n}},e.transpose=function(t){for(var e=t[0].length,i=t.length,n=new Array(e),s=0;s<e;s++){n[s]=new Array(i);for(var r=0;r<i;r++)n[s][r]=t[r][s]}return n};var r=a(i(29)),o=a(i(105));function a(t){return t&&t.__esModule?t:{default:t}}var h=e.isIphone=navigator.userAgent.match(/iPhone/i)||navigator.userAgent.match(/iPod/i),u=e.isIpad=navigator.userAgent.match(/iPad/i),l=e.isAndroid=navigator.userAgent.match(/Android/i),c=e.isMobile=h||u||l,p=e.isDesktop=!c;document.body.classList.add(c?"mobile":"desktop");var f=e.browser={isIphone:h,isIpad:u,isMobile:c,isDesktop:p}},function(t,e,i){e.f=i(1)},function(t,e,i){var n=i(2),s=i(0),r=i(25),o=i(45),a=i(3).f;t.exports=function(t){var e=s.Symbol||(s.Symbol=r?{}:n.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:o.f(t)})}},function(t,e){function i(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(t){return"function"==typeof t}function s(t){return"object"==typeof t&&null!==t}function r(t){return void 0===t}t.exports=i,i.EventEmitter=i,i.prototype._events=void 0,i.prototype._maxListeners=void 0,i.defaultMaxListeners=10,i.prototype.setMaxListeners=function(t){if(!function(t){return"number"==typeof t}(t)||t<0||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},i.prototype.emit=function(t){var e,i,o,a,h,u;if(this._events||(this._events={}),"error"===t&&(!this._events.error||s(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var l=new Error('Uncaught, unspecified "error" event. ('+e+")");throw l.context=e,l}if(r(i=this._events[t]))return!1;if(n(i))switch(arguments.length){case 1:i.call(this);break;case 2:i.call(this,arguments[1]);break;case 3:i.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),i.apply(this,a)}else if(s(i))for(a=Array.prototype.slice.call(arguments,1),o=(u=i.slice()).length,h=0;h<o;h++)u[h].apply(this,a);return!0},i.prototype.addListener=function(t,e){var o;if(!n(e))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",t,n(e.listener)?e.listener:e),this._events[t]?s(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,s(this._events[t])&&!this._events[t].warned&&(o=r(this._maxListeners)?i.defaultMaxListeners:this._maxListeners)&&o>0&&this._events[t].length>o&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace()),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(t,e){if(!n(e))throw TypeError("listener must be a function");var i=!1;function s(){this.removeListener(t,s),i||(i=!0,e.apply(this,arguments))}return s.listener=e,this.on(t,s),this},i.prototype.removeListener=function(t,e){var i,r,o,a;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(o=(i=this._events[t]).length,r=-1,i===e||n(i.listener)&&i.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(s(i)){for(a=o;a-- >0;)if(i[a]===e||i[a].listener&&i[a].listener===e){r=a;break}if(r<0)return this;1===i.length?(i.length=0,delete this._events[t]):i.splice(r,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},i.prototype.removeAllListeners=function(t){var e,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(n(i=this._events[t]))this.removeListener(t,i);else if(i)for(;i.length;)this.removeListener(t,i[i.length-1]);return delete this._events[t],this},i.prototype.listeners=function(t){return this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},i.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(n(e))return 1;if(e)return e.length}return 0},i.listenerCount=function(t,e){return t.listenerCount(e)}},function(t,e,i){(e=t.exports=i(73)).Stream=e,e.Readable=e,e.Writable=i(50),e.Duplex=i(13),e.Transform=i(75),e.PassThrough=i(151)},function(t,e,i){"use strict";(function(e){!e.version||0===e.version.indexOf("v0.")||0===e.version.indexOf("v1.")&&0!==e.version.indexOf("v1.8.")?t.exports=function(t,i,n,s){if("function"!=typeof t)throw new TypeError('"callback" argument must be a function');var r,o,a=arguments.length;switch(a){case 0:case 1:return e.nextTick(t);case 2:return e.nextTick(function(){t.call(null,i)});case 3:return e.nextTick(function(){t.call(null,i,n)});case 4:return e.nextTick(function(){t.call(null,i,n,s)});default:for(r=new Array(a-1),o=0;o<r.length;)r[o++]=arguments[o];return e.nextTick(function(){t.apply(null,r)})}}:t.exports=e.nextTick}).call(e,i(11))},function(t,e,i){"use strict";(function(e,n){t.exports=y;var s,r=i(49),o=!e.browser&&["v0.10","v0.9."].indexOf(e.version.slice(0,5))>-1?n:r;y.WritableState=d;var a=i(23);a.inherits=i(12);var h,u={deprecate:i(150)},l=i(74),c=i(5).Buffer,p=i(31);function f(){}function d(t,e){s=s||i(13),t=t||{},this.objectMode=!!t.objectMode,e instanceof s&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var n=t.highWaterMark,a=this.objectMode?16:16384;this.highWaterMark=n||0===n?n:a,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var h=!1===t.decodeStrings;this.decodeStrings=!h,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var i=t._writableState,n=i.sync,s=i.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(i),e)!function(t,e,i,n,s){--e.pendingcb,i?r(s,n):s(n);t._writableState.errorEmitted=!0,t.emit("error",n)}(t,i,n,e,s);else{var a=g(i);a||i.corked||i.bufferProcessing||!i.bufferedRequest||_(t,i),n?o(v,t,i,a,s):v(t,i,a,s)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new S(this)}function y(t){if(s=s||i(13),!(h.call(y,this)||this instanceof s))return new y(t);this._writableState=new d(t,this),this.writable=!0,t&&("function"==typeof t.write&&(this._write=t.write),"function"==typeof t.writev&&(this._writev=t.writev)),l.call(this)}function m(t,e,i,n,s,r,o){e.writelen=n,e.writecb=o,e.writing=!0,e.sync=!0,i?t._writev(s,e.onwrite):t._write(s,r,e.onwrite),e.sync=!1}function v(t,e,i,n){i||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit("drain"))}(t,e),e.pendingcb--,n(),w(t,e)}function _(t,e){e.bufferProcessing=!0;var i=e.bufferedRequest;if(t._writev&&i&&i.next){var n=e.bufferedRequestCount,s=new Array(n),r=e.corkedRequestsFree;r.entry=i;for(var o=0;i;)s[o]=i,i=i.next,o+=1;m(t,e,!0,e.length,s,"",r.finish),e.pendingcb++,e.lastBufferedRequest=null,r.next?(e.corkedRequestsFree=r.next,r.next=null):e.corkedRequestsFree=new S(e)}else{for(;i;){var a=i.chunk,h=i.encoding,u=i.callback;if(m(t,e,!1,e.objectMode?1:a.length,a,h,u),i=i.next,e.writing)break}null===i&&(e.lastBufferedRequest=null)}e.bufferedRequestCount=0,e.bufferedRequest=i,e.bufferProcessing=!1}function g(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function b(t,e){e.prefinished||(e.prefinished=!0,t.emit("prefinish"))}function w(t,e){var i=g(e);return i&&(0===e.pendingcb?(b(t,e),e.finished=!0,t.emit("finish")):b(t,e)),i}function S(t){var e=this;this.next=null,this.entry=null,this.finish=function(i){var n=e.entry;for(e.entry=null;n;){var s=n.callback;t.pendingcb--,s(i),n=n.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}}a.inherits(y,l),d.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},function(){try{Object.defineProperty(d.prototype,"buffer",{get:u.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(t){}}(),"function"==typeof Symbol&&Symbol.hasInstance&&"function"==typeof Function.prototype[Symbol.hasInstance]?(h=Function.prototype[Symbol.hasInstance],Object.defineProperty(y,Symbol.hasInstance,{value:function(t){return!!h.call(this,t)||t&&t._writableState instanceof d}})):h=function(t){return t instanceof this},y.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},y.prototype.write=function(t,e,i){var n=this._writableState,s=!1,o=c.isBuffer(t);return"function"==typeof e&&(i=e,e=null),o?e="buffer":e||(e=n.defaultEncoding),"function"!=typeof i&&(i=f),n.ended?function(t,e){var i=new Error("write after end");t.emit("error",i),r(e,i)}(this,i):(o||function(t,e,i,n){var s=!0,o=!1;return null===i?o=new TypeError("May not write null values to stream"):"string"==typeof i||void 0===i||e.objectMode||(o=new TypeError("Invalid non-string/buffer chunk")),o&&(t.emit("error",o),r(n,o),s=!1),s}(this,n,t,i))&&(n.pendingcb++,s=function(t,e,i,n,s,r){i||(n=function(t,e,i){t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=p.from(e,i));return e}(e,n,s),c.isBuffer(n)&&(s="buffer"));var o=e.objectMode?1:n.length;e.length+=o;var a=e.length<e.highWaterMark;a||(e.needDrain=!0);if(e.writing||e.corked){var h=e.lastBufferedRequest;e.lastBufferedRequest=new function(t,e,i){this.chunk=t,this.encoding=e,this.callback=i,this.next=null}(n,s,r),h?h.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else m(t,e,!1,o,n,s,r);return a}(this,n,o,t,e,i)),s},y.prototype.cork=function(){this._writableState.corked++},y.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,t.writing||t.corked||t.finished||t.bufferProcessing||!t.bufferedRequest||_(this,t))},y.prototype.setDefaultEncoding=function(t){if("string"==typeof t&&(t=t.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((t+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},y.prototype._write=function(t,e,i){i(new Error("_write() is not implemented"))},y.prototype._writev=null,y.prototype.end=function(t,e,i){var n=this._writableState;"function"==typeof t?(i=t,t=null,e=null):"function"==typeof e&&(i=e,e=null),null!==t&&void 0!==t&&this.write(t,e),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||function(t,e,i){e.ending=!0,w(t,e),i&&(e.finished?r(i):t.once("finish",i));e.ended=!0,t.writable=!1}(this,n,i)}}).call(e,i(11),i(72).setImmediate)},function(t,e,i){"use strict";var n=i(5).Buffer,s=i(31),r=n.isEncoding||function(t){switch((t=""+t)&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function o(t){var e;switch(this.encoding=function(t){var e=function(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}(t);if("string"!=typeof e&&(n.isEncoding===r||!r(t)))throw new Error("Unknown encoding: "+t);return e||t}(t),this.encoding){case"utf16le":this.text=u,this.end=l,e=4;break;case"utf8":this.fillLast=h,e=4;break;case"base64":this.text=c,this.end=p,e=3;break;default:return this.write=f,void(this.end=d)}this.lastNeed=0,this.lastTotal=0,this.lastChar=s.allocUnsafe(e)}function a(t){return t<=127?0:t>>5==6?2:t>>4==14?3:t>>3==30?4:-1}function h(t){var e=this.lastTotal-this.lastNeed,i=function(t,e,i){if(128!=(192&e[0]))return t.lastNeed=0,"�".repeat(i);if(t.lastNeed>1&&e.length>1){if(128!=(192&e[1]))return t.lastNeed=1,"�".repeat(i+1);if(t.lastNeed>2&&e.length>2&&128!=(192&e[2]))return t.lastNeed=2,"�".repeat(i+2)}}(this,t,e);return void 0!==i?i:this.lastNeed<=t.length?(t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal)):(t.copy(this.lastChar,e,0,t.length),void(this.lastNeed-=t.length))}function u(t,e){if((t.length-e)%2==0){var i=t.toString("utf16le",e);if(i){var n=i.charCodeAt(i.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],i.slice(0,-1)}return i}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function l(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var i=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,i)}return e}function c(t,e){var i=(t.length-e)%3;return 0===i?t.toString("base64",e):(this.lastNeed=3-i,this.lastTotal=3,1===i?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-i))}function p(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function f(t){return t.toString(this.encoding)}function d(t){return t&&t.length?this.write(t):""}e.StringDecoder=o,o.prototype.write=function(t){if(0===t.length)return"";var e,i;if(this.lastNeed){if(void 0===(e=this.fillLast(t)))return"";i=this.lastNeed,this.lastNeed=0}else i=0;return i<t.length?e?e+this.text(t,i):this.text(t,i):e||""},o.prototype.end=function(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"�".repeat(this.lastTotal-this.lastNeed):e},o.prototype.text=function(t,e){var i=function(t,e,i){var n=e.length-1;if(n<i)return 0;var s=a(e[n]);if(s>=0)return s>0&&(t.lastNeed=s-1),s;if(--n<i)return 0;if((s=a(e[n]))>=0)return s>0&&(t.lastNeed=s-2),s;if(--n<i)return 0;if((s=a(e[n]))>=0)return s>0&&(2===s?s=0:t.lastNeed=s-3),s;return 0}(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=i;var n=t.length-(i-this.lastNeed);return t.copy(this.lastChar,0,n),t.toString("utf8",e,n)},o.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length}},function(t,e,i){"use strict";e.__esModule=!0;var n=r(i(77)),s=r(i(89));function r(t){return t&&t.__esModule?t:{default:t}}e.default=function(){return function(t,e){if(Array.isArray(t))return t;if((0,n.default)(Object(t)))return function(t,e){var i=[],n=!0,r=!1,o=void 0;try{for(var a,h=(0,s.default)(t);!(n=(a=h.next()).done)&&(i.push(a.value),!e||i.length!==e);n=!0);}catch(t){r=!0,o=t}finally{try{!n&&h.return&&h.return()}finally{if(r)throw o}}return i}(t,e);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(t,e,i){var n=i(18);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==n(t)?t.split(""):Object(t)}},function(t,e,i){"use strict";var n=i(25),s=i(7),r=i(56),o=i(8),a=i(10),h=i(14),u=i(82),l=i(27),c=i(86),p=i(1)("iterator"),f=!([].keys&&"next"in[].keys()),d=function(){return this};t.exports=function(t,e,i,y,m,v,_){u(i,e,y);var g,b,w,S=function(t){if(!f&&t in E)return E[t];switch(t){case"keys":case"values":return function(){return new i(this,t)}}return function(){return new i(this,t)}},T=e+" Iterator",x="values"==m,A=!1,E=t.prototype,k=E[p]||E["@@iterator"]||m&&E[m],O=k||S(m),M=m?x?S("entries"):O:void 0,P="Array"==e&&E.entries||k;if(P&&(w=c(P.call(new t)))!==Object.prototype&&(l(w,T,!0),n||a(w,p)||o(w,p,d)),x&&k&&"values"!==k.name&&(A=!0,O=function(){return k.call(this)}),n&&!_||!f&&!A&&E[p]||o(E,p,O),h[e]=O,h[T]=d,m)if(g={values:x?O:S("values"),keys:v?O:S("keys"),entries:M},_)for(b in g)b in E||r(E,b,g[b]);else s(s.P+s.F*(f||A),e,g);return g}},function(t,e,i){t.exports=!i(9)&&!i(15)(function(){return 7!=Object.defineProperty(i(34)("div"),"a",{get:function(){return 7}}).a})},function(t,e,i){t.exports=i(8)},function(t,e,i){var n=i(4),s=i(83),r=i(40),o=i(38)("IE_PROTO"),a=function(){},h=function(){var t,e=i(34)("iframe"),n=r.length;for(e.style.display="none",i(59).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),h=t.F;n--;)delete h.prototype[r[n]];return h()};t.exports=Object.create||function(t,e){var i;return null!==t?(a.prototype=n(t),i=new a,a.prototype=null,i[o]=t):i=h(),void 0===e?i:s(i,e)}},function(t,e,i){var n=i(10),s=i(6),r=i(84)(!1),o=i(38)("IE_PROTO");t.exports=function(t,e){var i,a=s(t),h=0,u=[];for(i in a)i!=o&&n(a,i)&&u.push(i);for(;e.length>h;)n(a,i=e[h++])&&(~r(u,i)||u.push(i));return u}},function(t,e,i){t.exports=i(2).document&&document.documentElement},function(t,e,i){var n=i(4);t.exports=function(t,e,i,s){try{return s?e(n(i)[0],i[1]):e(i)}catch(e){var r=t.return;throw void 0!==r&&n(r.call(t)),e}}},function(t,e,i){var n=i(14),s=i(1)("iterator"),r=Array.prototype;t.exports=function(t){return void 0!==t&&(n.Array===t||r[s]===t)}},function(t,e,i){var n=i(1)("iterator"),s=!1;try{var r=[7][n]();r.return=function(){s=!0},Array.from(r,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!s)return!1;var i=!1;try{var r=[7],o=r[n]();o.next=function(){return{done:i=!0}},r[n]=function(){return o},t(r)}catch(t){}return i}},function(t,e,i){!function(e,i){t.exports=i()}(0,function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var s=e[n]={exports:{},id:n,loaded:!1};return t[n].call(s.exports,s,s.exports,i),s.loaded=!0,s.exports}return i.m=t,i.c=e,i.p="",i(0)}([function(t,e,i){"use strict";var n=function(t){return t&&t.__esModule?t.default:t}(i(1));t.exports=n},function(t,e,i){"use strict";var n=function(t){return t&&t.__esModule?t.default:t},s=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")};e.colors=function(){return _.colors},e.context=function(){return _.context},e.clock=function(){return _.clock},Object.defineProperty(e,"__esModule",{value:!0});var o=n(i(2)),a=n(i(5)),h=n(i(38)),u=n(i(40)),l=function(t){return t&&t.__esModule?t:{default:t}}(i(39)),c=i(28),p=i(41),f=i(27),d=i(26),y=i(25),m=n(i(42)),v=n(i(45)),_=new(function(){function t(e){for(var i in r(this,t),o)this[i]=o[i];for(var i in a)this[i]=a[i];var n={Rack:h},s={Counter:c,Radio:p,Drunk:f,Sequence:d,Matrix:y};for(var i in s)this[i]=s[i];for(var i in n)this[i]=n[i];var _=window.AudioContext||window.webkitAudioContext;for(var i in this._context=e||new _,this.tune=new u,this.note=this.tune.note.bind(this.tune),this.clock=new m(this._context),this.clock.start(),this.Interval=v,this.colors={accent:"#2bb",fill:"#eee",light:"#fff",dark:"#333",mediumLight:"#ccc",mediumDark:"#666"},this.transform=l,this.add=l.add,this.Add={},o)this.Add[i]=l.add.bind(this,i);var g=document.getElementsByTagName("style"),b=document.createElement("style");(b.type="text/css",b.innerHTML="[nexus-ui]{height:5000px;width:5000px}",g.length>0)?g[0].parentNode.insertBefore(b,g[0]):document.write("<style>[nexus-ui]{height:5000px;width:5000px}</style>")}return s(t,{context:{get:function(){return this._context},set:function(t){this.clock.stop(),this._context=t,this.clock=new m(this.context),this.clock.start()}}}),t}());e.default=_},function(t,e,i){"use strict";t.exports={Position:i(3),Slider:i(14),Toggle:i(15),Button:i(16),TextButton:i(18),RadioButton:i(19),Number:i(20),Select:i(21),Dial:i(22),Piano:i(23),Sequencer:i(24),Pan2D:i(29),Tilt:i(30),Multislider:i(31),Pan:i(33),Envelope:i(34),Spectrogram:i(35),Meter:i(36),Oscilloscope:i(37)}},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(6),h=i(11),u=function(t){return t&&t.__esModule?t:{default:t}}(i(12)),l=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[200,200],mode:"absolute",minX:0,maxX:1,stepX:0,x:.5,minY:0,maxY:1,stepY:0,y:.5}),this._x=new h(this.settings.minX,this.settings.maxX,this.settings.stepX,this.settings.x),this._y=new h(this.settings.minY,this.settings.maxY,this.settings.stepY,this.settings.y),this.position={x:new u.Handle(this.settings.mode,"horizontal",[0,this.width],[this.height,0]),y:new u.Handle(this.settings.mode,"vertical",[0,this.width],[this.height,0])},this.position.x.value=this._x.normalized,this.position.y.value=this._y.normalized,this.init(),this.render()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,a),n(e,{buildInterface:{value:function(){this.knob=o.create("circle"),this.element.appendChild(this.knob)}},sizeInterface:{value:function(){this.position.x.resize([0,this.width],[this.height,0]),this.position.y.resize([0,this.width],[this.height,0]),this._minDimension=Math.min(this.width,this.height),this.knobRadius={off:5*~~(this._minDimension/100)+5},this.knobRadius.on=2*this.knobRadius.off,this.knob.setAttribute("cx",this.width/2),this.knob.setAttribute("cy",this.height/2),this.knob.setAttribute("r",this.knobRadius.off)}},colorInterface:{value:function(){this.element.style.backgroundColor=this.colors.fill,this.knob.setAttribute("fill",this.colors.accent)}},render:{value:function(){this.clicked?this.knob.setAttribute("r",this.knobRadius.on):this.knob.setAttribute("r",this.knobRadius.off),this.knobCoordinates={x:this._x.normalized*this.width,y:this.height-this._y.normalized*this.height},this.knob.setAttribute("cx",this.knobCoordinates.x),this.knob.setAttribute("cy",this.knobCoordinates.y)}},click:{value:function(){this.position.x.anchor=this.mouse,this.position.y.anchor=this.mouse,this.move()}},move:{value:function(){this.clicked&&(this.position.x.update(this.mouse),this.position.y.update(this.mouse),this._x.updateNormal(this.position.x.value),this._y.updateNormal(this.position.y.value),this.emit("change",{x:this._x.value,y:this._y.value}),this.render())}},release:{value:function(){this.render()}},x:{get:function(){return this._x.value},set:function(t){this._x.update(t),this.emit("change",{x:this._x.value,y:this._y.value}),this.render()}},y:{get:function(){return this._y.value},set:function(t){this._y.update(t),this.emit("change",{x:this._x.value,y:this._y.value}),this.render()}},normalized:{get:function(){return{x:this._x.normalized,y:this._y.normalized}}},minX:{get:function(){return this._x.min},set:function(t){this._x.min=t,this.render()}},minY:{get:function(){return this._y.min},set:function(t){this._y.min=t,this.render()}},maxX:{get:function(){return this._x.max},set:function(t){this._x.max=t,this.render()}},maxY:{get:function(){return this._y.max},set:function(t){this._y.max=t,this.render()}},stepX:{get:function(){return this._x.step},set:function(t){this._x.step=t,this.render()}},stepY:{get:function(){return this._y.step},set:function(t){this._y.step=t,this.render()}},mode:{get:function(){return this.position.x.mode},set:function(t){this.position.x.mode=t,this.position.y.mode=t}}}),e}();t.exports=l},function(t,e,i){"use strict";var n=i(5);t.exports={create:function(t){return document.createElementNS("http://www.w3.org/2000/svg",t)},arc:function(t,e,i,s,r){var o=n.toCartesian(i,r),a=n.toCartesian(i,s),h=r-s<=180?"0":"1";return["M",o.x+t,o.y+e,"A",i,i,0,h,0,a.x+t,a.y+e].join(" ")},radialGradient:function(t,e){var i="gradient"+n.ri(1e11),s=[],r=document.createElementNS("http://www.w3.org/2000/svg","radialGradient");r.setAttribute("id",i),r.setAttribute("cx","50%"),r.setAttribute("cy","50%"),r.setAttribute("r","50%"),t.appendChild(r);for(var o=0;o<e;o++){var a=document.createElementNS("http://www.w3.org/2000/svg","stop");a.setAttribute("id","stop"+o),r.appendChild(a),s.push(a)}return{id:i,stops:s,element:r}}}},function(t,e){"use strict";e.clip=function(t,e,i){return Math.min(Math.max(t,e),i)},e.normalize=function(t,e,i){return(t-e)/(i-e)},e.scale=function(t,e,i,n,s){return e===i?n:(t-e)*(s-n)/(i-e)+n},e.toPolar=function(t,e){var i=Math.sqrt(t*t+e*e),n=Math.atan2(e,t);return n<0&&(n+=2*Math.PI),{radius:i,angle:n}},e.toCartesian=function(t,e){return{x:t*Math.cos(e),y:t*Math.sin(e)*-1}},e.prune=function(t,e){return parseFloat(t.toFixed(e))},e.invert=function(t){return e.scale(t,1,0,0,1)},e.mtof=function(t){return 440*Math.pow(2,(t-69)/12)},e.interp=function(t,e,i){return t*(i-e)+e},e.pick=function(){return arguments[~~(Math.random()*arguments.length)]},e.octave=function(t){return Math.pow(2,t)},e.ri=function(t,e){e||(e=t,t=0);var i=Math.min(t,e),n=Math.max(t,e);return Math.floor(Math.random()*(n-i)+i)},e.rf=function(t,e){e||(e=t,t=0);var i=Math.min(t,e),n=Math.max(t,e);return Math.random()*(n-i)+i},e.cycle=function(t,e,i){return++t>=i&&(t=e),t},e.average=function(t){for(var e=0,i=0;i<t.length;i++)e+=t[i];return e/t.length},e.distance=function(t,e,i,n){var s=t-i,r=e-n;return Math.sqrt(s*s+r*r)},e.gainToDB=function(t){return 20*Math.log10(t)},e.coin=function(){var t=void 0===arguments[0]?.5:arguments[0];return e.rf(0,1)<t?1:0}},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(7),h=i(8),u=i(9),l=i(10),c=i(1).colors,p=function(t){function e(t,i,n){r(this,e),s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this),this.type=this.constructor.name,this.settings=this.parseSettings(t,i,n),this.mouse={},this.wait=!1,this.colors={};var o=c();this.colors.accent=o.accent,this.colors.fill=o.fill,this.colors.light=o.light,this.colors.dark=o.dark,this.colors.mediumLight=o.mediumLight,this.colors.mediumDark=o.mediumDark}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,l),n(e,{parseSettings:{value:function(t,e,i){e.unshift("target"),i.defaultSize=i.size.splice(0,2),i.size=!1;var n={target:document.body,colors:{},snapWithParent:!0,event:function(){},component:!1};for(var s in i)n[s]=i[s];for(var r=0;r<t.length;r++){var o=t[r];if(h.isObject(o))for(var s in o)n[s]=o[s];else if("function"==typeof o)n.event=o;else if(e.length>=1){n[s=e.splice(0,1)[0]]=o}}return this.parent=a.parseElement(n.target),this.parent&&this.parent instanceof HTMLElement&&!n.component&&(this.parent.hasAttribute("nexus-ui")||this.parent.setAttribute("nexus-ui","")),n.size&&Array.isArray(n.size)&&n.snapWithParent?(this.width=n.size[0],this.height=n.size[1],this.parent.style.width=this.width+"px",this.parent.style.height=this.height+"px"):n.snapWithParent&&!n.component?(this.width=parseFloat(window.getComputedStyle(this.parent,null).getPropertyValue("width").replace("px","")),this.height=parseFloat(window.getComputedStyle(this.parent,null).getPropertyValue("height").replace("px","")),5e3==this.width&&(this.width=n.defaultSize[0],this.parent.style.width=this.parent.width=this.width+"px"),5e3==this.height&&(this.height=n.defaultSize[1],this.parent.style.height=this.parent.height=this.height+"px")):(n.size=n.defaultSize,this.width=n.size[0],this.height=n.size[1]),n.event?this.event=this.on("change",n.event):this.event=!1,n}},init:{value:function(){this.buildFrame(),this.buildInterface(),this.sizeInterface(),this.attachListeners(),this.colorInterface(),this.finalTouches()}},buildFrame:{value:function(){this.element=o.create("svg"),this.element.setAttribute("width",this.width),this.element.setAttribute("height",this.height),this.parent.appendChild(this.element)}},buildInterface:{value:function(){}},sizeInterface:{value:function(){}},colorInterface:{value:function(){}},attachListeners:{value:function(){var t=this;this.interactionTarget=this.interactionTarget||this.element,u.exists&&(this.interactionTarget.addEventListener("touchstart",function(e){return t.preTouch(e)}),this.interactionTarget.addEventListener("touchmove",function(e){return t.preTouchMove(e)}),this.interactionTarget.addEventListener("touchend",function(e){return t.preTouchRelease(e)})),this.boundPreMove=function(e){return t.preMove(e)},this.boundPreRelease=function(e){return t.preRelease(e)},this.interactionTarget.addEventListener("mousedown",function(e){return t.preClick(e)})}},finalTouches:{value:function(){this.element.style.cursor="pointer"}},preClick:{value:function(t){this.element instanceof HTMLElement&&(this.width=window.getComputedStyle(this.element,null).getPropertyValue("width").replace("px","")),this.offset=a.findPosition(this.element),this.mouse=a.locateMouse(t,this.offset),this.clicked=!0,this.click(),this.moveEvent=document.addEventListener("mousemove",this.boundPreMove),this.releaseEvent=document.addEventListener("mouseup",this.boundPreRelease),this.emit("click"),t.preventDefault(),t.stopPropagation()}},preMove:{value:function(t){var e=this;this.wait||(this.mouse=a.locateMouse(t,this.offset),this.move(),this.wait=!0,setTimeout(function(){e.wait=!1},25)),t.preventDefault(),t.stopPropagation()}},preRelease:{value:function(t){this.mouse=a.locateMouse(t,this.offset),this.clicked=!1,this.release(),this.emit("release"),document.removeEventListener("mousemove",this.boundPreMove),document.removeEventListener("mouseup",this.boundPreRelease),t.preventDefault(),t.stopPropagation()}},click:{value:function(){}},move:{value:function(){}},release:{value:function(){}},preTouch:{value:function(t){this.element instanceof HTMLElement&&(this.width=window.getComputedStyle(this.element,null).getPropertyValue("width").replace("px","")),this.offset=a.findPosition(this.element),this.mouse=a.locateTouch(t,this.offset),this.clicked=!0,this.touch(t),this.emit("click"),t.preventDefault(),t.stopPropagation()}},preTouchMove:{value:function(t){this.clicked&&(this.mouse=a.locateTouch(t,this.offset),this.touchMove(),t.preventDefault(),t.stopPropagation())}},preTouchRelease:{value:function(t){this.mouse=a.locateTouch(t,this.offset),this.clicked=!1,this.touchRelease(),this.emit("release"),t.preventDefault(),t.stopPropagation()}},touch:{value:function(){this.click()}},touchMove:{value:function(){this.move()}},touchRelease:{value:function(){this.release()}},resize:{value:function(t,e){this.width=t,this.height=e,this.parent.style.width=this.width+"px",this.parent.style.height=this.height+"px",this.element.setAttribute("width",this.width),this.element.setAttribute("height",this.height),this.sizeInterface()}},empty:{value:function(){for(;this.element.lastChild;)this.element.removeChild(this.element.lastChild)}},destroy:{value:function(){this.empty(),this.parent.removeChild(this.element),this.removeAllListeners(),this.instrument&&delete this.instrument[this.id],this.customDestroy()}},customDestroy:{value:function(){}},colorize:{value:function(t,e){this.colors[t]=e,this.colorInterface()}}}),e}();t.exports=p},function(t,e){"use strict";e.findPosition=function(t){var e=t.getBoundingClientRect();return{top:e.top+window.scrollY,left:e.left+window.scrollX}},e.parseElement=function(t){return"string"==typeof t&&(t=document.getElementById(t.replace("#",""))),t instanceof HTMLElement||t instanceof SVGElement?t:"No valid parent argument"},e.locateMouse=function(t,e){return{x:t.pageX-e.left,y:t.pageY-e.top}},e.locateTouch=function(t,e){return{x:!!t.targetTouches.length&&t.targetTouches[0].pageX-e.left,y:!!t.targetTouches.length&&t.targetTouches[0].pageY-e.top}},e.SmartCanvas=function(t){var e=this;this.element=document.createElement("canvas"),this.context=this.element.getContext("2d"),t.appendChild(this.element),this.resize=function(t,i){e.element.width=2*t,e.element.height=2*i,e.element.style.width=t+"px",e.element.style.height=i+"px"}}},function(t,e){"use strict";e.isObject=function(t){return"object"==typeof t&&!Array.isArray(t)&&null!==t&&t instanceof SVGElement==!1&&t instanceof HTMLElement==!1}},function(t,e){"use strict";e.exists="ontouchstart"in document.documentElement},function(t,e){function i(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(t){return"function"==typeof t}function s(t){return"object"==typeof t&&null!==t}function r(t){return void 0===t}t.exports=i,i.EventEmitter=i,i.prototype._events=void 0,i.prototype._maxListeners=void 0,i.defaultMaxListeners=10,i.prototype.setMaxListeners=function(t){if(!function(t){return"number"==typeof t}(t)||t<0||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},i.prototype.emit=function(t){var e,i,o,a,h,u;if(this._events||(this._events={}),"error"===t&&(!this._events.error||s(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var l=new Error('Uncaught, unspecified "error" event. ('+e+")");throw l.context=e,l}if(r(i=this._events[t]))return!1;if(n(i))switch(arguments.length){case 1:i.call(this);break;case 2:i.call(this,arguments[1]);break;case 3:i.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),i.apply(this,a)}else if(s(i))for(a=Array.prototype.slice.call(arguments,1),o=(u=i.slice()).length,h=0;h<o;h++)u[h].apply(this,a);return!0},i.prototype.addListener=function(t,e){var o;if(!n(e))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",t,n(e.listener)?e.listener:e),this._events[t]?s(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,s(this._events[t])&&!this._events[t].warned&&(o=r(this._maxListeners)?i.defaultMaxListeners:this._maxListeners)&&o>0&&this._events[t].length>o&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace()),this},i.prototype.on=i.prototype.addListener,i.prototype.once=function(t,e){if(!n(e))throw TypeError("listener must be a function");var i=!1;function s(){this.removeListener(t,s),i||(i=!0,e.apply(this,arguments))}return s.listener=e,this.on(t,s),this},i.prototype.removeListener=function(t,e){var i,r,o,a;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(o=(i=this._events[t]).length,r=-1,i===e||n(i.listener)&&i.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(s(i)){for(a=o;a-- >0;)if(i[a]===e||i[a].listener&&i[a].listener===e){r=a;break}if(r<0)return this;1===i.length?(i.length=0,delete this._events[t]):i.splice(r,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},i.prototype.removeAllListeners=function(t){var e,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(n(i=this._events[t]))this.removeListener(t,i);else if(i)for(;i.length;)this.removeListener(t,i[i.length-1]);return delete this._events[t],this},i.prototype.listeners=function(t){return this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},i.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(n(e))return 1;if(e)return e.length}return 0},i.listenerCount=function(t,e){return t.listenerCount(e)}},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},r=i(5),o=function(){function t(){var e=void 0===arguments[0]?0:arguments[0],i=void 0===arguments[1]?1:arguments[1],n=void 0===arguments[2]?0:arguments[2],r=void 0===arguments[3]?0:arguments[3];s(this,t),this.min=e,this.max=i,this.step=n,this.value=r,this.changed=!1,this.oldValue=!1,this.update(this.value)}return n(t,{update:{value:function(t){return this.step?this.value=r.clip(Math.round((t-this.min)/this.step)*this.step+this.min,this.min,this.max):this.value=r.clip(t,this.min,this.max),this.oldValue!==this.value?(this.oldValue=this.value,this.changed=!0):this.changed=!1,this.value}},updateNormal:{value:function(t){return this.value=r.scale(t,0,1,this.min,this.max),this.update(this.value)}},normalized:{get:function(){return r.normalize(this.value,this.min,this.max)}}}),t}();t.exports=o},function(t,e,i){"use strict";var n=function(t){return t&&t.__esModule?t.default:t},s=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")};Object.defineProperty(e,"__esModule",{value:!0});var o=n(i(5)),a=n(i(13));e.Handle=function(){function t(){var e=void 0===arguments[0]?"absolute":arguments[0],i=void 0===arguments[1]?"vertical":arguments[1],n=void 0===arguments[2]?[0,100]:arguments[2],s=void 0===arguments[3]?[0,100]:arguments[3];r(this,t),this.mode=e,this.direction=i,this.previous=0,this.value=0,this.sensitivity=1,this.resize(n,s)}return s(t,{resize:{value:function(t,e){this.boundary={min:{x:t[0],y:e[0]},max:{x:t[1],y:e[1]},center:{x:(t[1]-t[0])/2+t[0],y:(e[1]-e[0])/2+e[0]}}}},anchor:{set:function(t){this._anchor=this.convertPositionToValue(t)},get:function(){return this._anchor}},update:{value:function(t){if("relative"===this.mode){var e=this.convertPositionToValue(t)-this.anchor;Math.abs(e)>.5&&(e=0),this.anchor=t,this.value=this.value+e*this.sensitivity}else this.value=this.convertPositionToValue(t);this.value=o.clip(this.value,0,1)}},convertPositionToValue:{value:function(t){switch(this.direction){case"radial":var e=o.toPolar(t.x-this.boundary.center.x,t.y-this.boundary.center.y);return e=((e=e.angle/(2*Math.PI))-.25+1)%1;case"vertical":return o.scale(t.y,this.boundary.min.y,this.boundary.max.y,0,1);case"horizontal":return o.scale(t.x,this.boundary.min.x,this.boundary.max.x,0,1)}}}}),t}(),e.Button=function(){function t(){var e=void 0===arguments[0]?"button":arguments[0];r(this,t),this.mode=e,this.state=new a,this.paintbrush=!1}return s(t,{click:{value:function(){switch(this.mode){case"impulse":this.state.on(),this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(this.state.off.bind(this),30),this.emit("change",this.state);break;case"button":this.turnOn(),this.emit("change",this.state);break;case"aftertouch":this.position={x:o.clip(this.mouse.x/this.width,0,1),y:o.clip(1-this.mouse.y/this.height,0,1)},this.turnOn(),this.emit("change",{state:this.state,x:this.position.x,y:this.position.y});break;case"toggle":this.flip(),this.emit("change",this.state)}}},move:{value:function(){"aftertouch"===this.mode&&(this.position={x:o.clip(this.mouse.x/this.width,0,1),y:o.clip(1-this.mouse.y/this.height,0,1)},this.emit("change",{state:this.state,x:this.position.x,y:this.position.y}),this.render())}},release:{value:function(){switch(this.mode){case"button":this.turnOff(),this.emit("change",this.state);break;case"aftertouch":this.turnOff(),this.position={x:this.mouse.x/this.width,y:1-this.mouse.y/this.height},this.emit("change",{state:this.state,x:this.position.x,y:this.position.y})}}}}),t}()},function(t,e){"use strict";var i=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),n=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},s=function(){function t(e){n(this,t),this.state=e||!1}return i(t,{flip:{value:function(t){this.state=t||!1===t?t:!this.state}},on:{value:function(){this.state=!0}},off:{value:function(){this.state=!1}}}),t}();t.exports=s},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(6),h=i(11),u=function(t){return t&&t.__esModule?t:{default:t}}(i(12)),l=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["min","max","value"],{size:[120,20],mode:"relative",min:0,max:1,step:0,value:0}),this.orientation="vertical",this._value=new h(this.settings.min,this.settings.max,this.settings.step,this.settings.value),this.position=new u.Handle(this.settings.mode,this.orientation,[0,this.width],[this.height,0]),this.position.value=this._value.normalized,this.init(),this.position.direction=this.orientation,this.emit("change",this.value)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,a),n(e,{buildInterface:{value:function(){this.bar=o.create("rect"),this.fillbar=o.create("rect"),this.knob=o.create("circle"),this.element.appendChild(this.bar),this.element.appendChild(this.fillbar),this.element.appendChild(this.knob)}},sizeInterface:{value:function(){this.width<this.height?this.orientation="vertical":this.orientation="horizontal",this.position&&this.position.resize([0,this.width],[this.height,0]);var t=void 0,e=void 0,i=void 0,n=void 0,s=void 0,r=void 0;this.knobData={level:0,r:0},"vertical"===this.orientation?(this.thickness=this.width/2,t=this.width/2,e=0,i=this.thickness,n=this.height,this.knobData.r=.8*this.thickness,this.knobData.level=n-this.knobData.r-this.normalized*(n-2*this.knobData.r),s="translate("+-1*this.thickness/2+",0)",r=i/2):(this.thickness=this.height/2,t=0,e=this.height/2,i=this.width,n=this.thickness,this.knobData.r=.8*this.thickness,this.knobData.level=this.normalized*(i-2*this.knobData.r)+this.knobData.r,s="translate(0,"+-1*this.thickness/2+")",r=n/2),this.bar.setAttribute("x",t),this.bar.setAttribute("y",e),this.bar.setAttribute("transform",s),this.bar.setAttribute("rx",r),this.bar.setAttribute("ry",r),this.bar.setAttribute("width",i),this.bar.setAttribute("height",n),"vertical"===this.orientation?(this.fillbar.setAttribute("x",t),this.fillbar.setAttribute("y",this.knobData.level),this.fillbar.setAttribute("width",i),this.fillbar.setAttribute("height",n-this.knobData.level)):(this.fillbar.setAttribute("x",0),this.fillbar.setAttribute("y",e),this.fillbar.setAttribute("width",this.knobData.level),this.fillbar.setAttribute("height",n)),this.fillbar.setAttribute("transform",s),this.fillbar.setAttribute("rx",r),this.fillbar.setAttribute("ry",r),"vertical"===this.orientation?(this.knob.setAttribute("cx",t),this.knob.setAttribute("cy",this.knobData.level)):(this.knob.setAttribute("cx",this.knobData.level),this.knob.setAttribute("cy",e)),this.knob.setAttribute("r",this.knobData.r)}},colorInterface:{value:function(){this.bar.setAttribute("fill",this.colors.fill),this.fillbar.setAttribute("fill",this.colors.accent),this.knob.setAttribute("fill",this.colors.accent)}},render:{value:function(){this.clicked||(this.knobData.r=.75*this.thickness),this.knob.setAttribute("r",this.knobData.r),"vertical"===this.orientation?(this.knobData.level=this.knobData.r+this._value.normalized*(this.height-2*this.knobData.r),this.knob.setAttribute("cy",this.height-this.knobData.level),this.fillbar.setAttribute("y",this.height-this.knobData.level),this.fillbar.setAttribute("height",this.knobData.level)):(this.knobData.level=this._value.normalized*(this.width-2*this.knobData.r)+this.knobData.r,this.knob.setAttribute("cx",this.knobData.level),this.fillbar.setAttribute("x",0),this.fillbar.setAttribute("width",this.knobData.level))}},click:{value:function(){this.knobData.r=.9*this.thickness,this.position.anchor=this.mouse,this.move()}},move:{value:function(){this.clicked&&(this.position.update(this.mouse),this._value.updateNormal(this.position.value),this.emit("change",this._value.value),this.render())}},release:{value:function(){this.render()}},normalized:{get:function(){return this._value.normalized}},value:{get:function(){return this._value.value},set:function(t){this._value.update(t),this.position.value=this._value.normalized,this.emit("change",this._value.value),this.render()}},min:{get:function(){return this._value.min},set:function(t){this._value.min=t}},max:{get:function(){return this._value.max},set:function(t){this._value.max=t}},step:{get:function(){return this._value.step},set:function(t){this._value.step=t}},mode:{get:function(){return this.position.mode},set:function(t){this.position.mode=t}}}),e}();t.exports=l},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(13),h=i(6),u=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[40,20],target:!1,state:!1}),this._state=new a(this.settings.state),this.init()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,h),n(e,{buildInterface:{value:function(){this.bar=o.create("rect"),this.knob=o.create("circle"),this.element.appendChild(this.bar),this.element.appendChild(this.knob)}},sizeInterface:{value:function(){this.height<this.width/2?this.knobSize=this.height/2:this.knobSize=this.width/4,this.bar.setAttribute("x",this.width/2-1.5*this.knobSize),this.bar.setAttribute("y",this.height/2-this.knobSize/2),this.bar.setAttribute("rx",this.knobSize/2),this.bar.setAttribute("ry",this.knobSize/2),this.bar.setAttribute("width",3*this.knobSize),this.bar.setAttribute("height",this.knobSize),this.knob.setAttribute("cx",this.width/2-this.knobSize),this.knob.setAttribute("cy",this.height/2),this.knob.setAttribute("r",this.knobSize)}},colorInterface:{value:function(){this.knob.setAttribute("fill",this.colors.accent),this.render()}},render:{value:function(){this.state?(this.knob.setAttribute("cx",this.width/2+this.knobSize),this.bar.setAttribute("fill",this.colors.accent)):(this.knob.setAttribute("cx",this.width/2-this.knobSize),this.bar.setAttribute("fill",this.colors.fill))}},click:{value:function(){this.flip(),this.render(),this.emit("change",this.state)}},state:{get:function(){return this._state.state},set:function(t){this._state.flip(t),this.emit("change",this.state),this.render()}},flip:{value:function(){this._state.flip(),this.render()}}}),e}();t.exports=u},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(17),h=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["mode"],{size:[80,80],mode:"aftertouch",state:!1}),this.mode=this.settings.mode,this.init(),this.render()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,a),n(e,{buildInterface:{value:function(){this.pad=o.create("circle"),this.element.appendChild(this.pad),this.interactionTarget=this.pad,this.defs=o.create("defs"),this.element.appendChild(this.defs),this.gradient=o.radialGradient(this.defs,2),this.gradient.stops[0].setAttribute("offset","30%"),this.gradient.stops[1].setAttribute("offset","100%")}},sizeInterface:{value:function(){this.pad.setAttribute("cx",this.width/2),this.pad.setAttribute("cy",this.height/2),this.pad.setAttribute("r",Math.min(this.width,this.height)/2-this.width/40),this.pad.setAttribute("stroke-width",this.width/20)}},colorInterface:{value:function(){this.gradient.stops[0].setAttribute("stop-color",this.colors.accent),this.gradient.stops[1].setAttribute("stop-color",this.colors.fill),this.render()}},render:{value:function(){this.state?("aftertouch"===this.mode?(this.pad.setAttribute("stroke","url(#"+this.gradient.id+")"),this.gradient.element.setAttribute("cx",100*this.position.x+"%"),this.gradient.element.setAttribute("cy",100*(1-this.position.y)+"%")):this.pad.setAttribute("stroke",this.colors.accent),this.pad.setAttribute("fill",this.colors.accent)):(this.pad.setAttribute("fill",this.colors.fill),this.pad.setAttribute("stroke",this.colors.mediumLight))}}}),e}();t.exports=h},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(5),h=i(13),u=i(6),l=function(t){function e(t,i,n){r(this,e),s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,t,i,n),this.mode=this.settings.mode||"button",this.position={x:0,y:0},this._state=new h(this.settings.state)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,u),n(e,{buildInterface:{value:function(){this.pad=o.create("circle"),this.pad.setAttribute("fill","#d18"),this.pad.setAttribute("stroke","#d18"),this.pad.setAttribute("stroke-width",4),this.element.appendChild(this.pad),this.interactionTarget=this.pad,this.sizeInterface()}},sizeInterface:{value:function(){this.pad.setAttribute("cx",this.width/2),this.pad.setAttribute("cy",this.height/2),this.pad.setAttribute("r",Math.min(this.width,this.height)/2-2)}},render:{value:function(){this.state?(this.pad.setAttribute("fill",this.colors.accent),this.pad.setAttribute("stroke",this.colors.accent)):(this.pad.setAttribute("fill",this.colors.fill),this.pad.setAttribute("stroke",this.colors.mediumLight))}},down:{value:function(t){switch(this.mode){case"impulse":this.turnOn(),this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(this.turnOff.bind(this),30);break;case"button":this.turnOn();break;case"aftertouch":this.position={x:a.clip(this.mouse.x/this.width,0,1),y:a.clip(1-this.mouse.y/this.height,0,1)},this.turnOn();break;case"toggle":this.flip(t)}}},bend:{value:function(t){"aftertouch"===this.mode&&(this.mouse=t||this.mouse,this.position={x:a.clip(this.mouse.x/this.width,0,1),y:a.clip(1-this.mouse.y/this.height,0,1)},this.emit("change",{state:this.state,x:this.position.x,y:this.position.y}),this.render())}},up:{value:function(){switch(this.mode){case"button":this.turnOff();break;case"aftertouch":this.turnOff(),this.position={x:a.clip(this.mouse.x/this.width,0,1),y:a.clip(1-this.mouse.y/this.height,0,1)}}}},click:{value:function(){this.down()}},move:{value:function(){this.bend()}},release:{value:function(){this.up()}},state:{get:function(){return this._state.state},set:function(t){this._state.flip(t),"aftertouch"===this.mode?this.emit("change",{state:this.state,x:this.position.x,y:this.position.y}):this.emit("change",this.state),this.render()}},flip:{value:function(t){this._state.flip(t),"aftertouch"===this.mode?this.emit("change",{state:this.state,x:this.position.x,y:this.position.y}):this.emit("change",this.state),this.render()}},turnOn:{value:function(t){this._state.on(),!1!==t&&("aftertouch"===this.mode?this.emit("change",{state:this.state,x:this.position.x,y:this.position.y}):this.emit("change",this.state)),this.render()}},turnOff:{value:function(t){this._state.off(),!1!==t&&("aftertouch"===this.mode?this.emit("change",{state:this.state,x:this.position.x,y:this.position.y}):this.emit("change",this.state)),this.render()}}}),e}();t.exports=l},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(17),a=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[150,50],state:!1,text:"Play"}),this._text=this.settings.text,this.settings.alternate&&(this.settings.alternateText=this.settings.alternate,console.warn("'alternate' initiator is deprecated. Use 'alternateText' instead.")),this._alternateText=this.settings.alternateText,this.mode=this.settings.alternateText?"toggle":"button",this.init(),this.render(),this.state=this.settings.state}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,o),n(e,{buildFrame:{value:function(){this.element=document.createElement("div"),this.parent.appendChild(this.element),this.textElement=document.createElement("div"),this.textElement.innerHTML=this._text,this.element.appendChild(this.textElement)}},buildInterface:{value:function(){}},colorInterface:{value:function(){this.element.style.color=this.colors.dark,this.render()}},sizeInterface:{value:function(){var t=this.height/3,e=this.width/(this._text.length+2);if(t=Math.min(t,e),this.alternateText){var i=this.width/(this.alternateText.length+2);t=Math.min(t,i)}var n="width: "+this.width+"px;";n+="height: "+this.height+"px;",n+="padding: "+(this.height-t)/2+"px 0px;",n+="box-sizing: border-box;",n+="text-align: center;",n+="font-family: inherit;",n+="font-weight: 700;",n+="opacity: 1;",n+="font-size:"+t+"px;",this.textElement.style.cssText=n,this.render()}},render:{value:function(){this.state?(this.element.style.backgroundColor=this.colors.accent,this.textElement.style.color=this.colors.fill,this.alternateText?this.textElement.innerHTML=this._alternateText:this.textElement.innerHTML=this._text):(this.element.style.backgroundColor=this.colors.fill,this.textElement.style.color=this.colors.dark,this.textElement.innerHTML=this._text)}},alternateText:{get:function(){return this._alternateText},set:function(t){this.mode=t?"toggle":"button",this._alternateText=t,this.render()}},text:{get:function(){return this._text},set:function(t){this._text=t,this.sizeInterface(),this.render()}}}),e}();t.exports=a},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(6),a=i(16),h=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[120,25],numberOfButtons:4,active:-1}),this.buttons=[],this._numberOfButtons=this.settings.numberOfButtons,this.active=this.settings.active,this.init(),this.render()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,o),n(e,{buildFrame:{value:function(){this.element=document.createElement("div"),this.parent.appendChild(this.element)}},buildInterface:{value:function(){for(var t=0;t<this._numberOfButtons;t++){var e=document.createElement("span"),i=new a(e,{mode:"toggle",component:!0},this.update.bind(this,t));this.buttons.push(i),this.element.appendChild(e)}}},sizeInterface:{value:function(){for(var t=this.width/this._numberOfButtons,e=this.height,i=0;i<this._numberOfButtons;i++)this.buttons[i].resize(t,e)}},colorInterface:{value:function(){for(var t=0;t<this._numberOfButtons;t++)this.buttons[t].colors=this.colors,this.buttons[t].render()}},update:{value:function(t){this.buttons[t].state?this.select(t):this.deselect()}},render:{value:function(){for(var t=0;t<this.buttons.length;t++)t===this.active?this.buttons[t].turnOn(!1):this.buttons[t].turnOff(!1)}},select:{value:function(t){t>=0&&t<this.buttons.length&&(this.active=t,this.emit("change",this.active),this.render())}},deselect:{value:function(){this.active=-1,this.emit("change",this.active),this.render()}},numberOfButtons:{get:function(){return this._numberOfButtons},set:function(t){this._numberOfButtons=t;for(var e=0;e<this.buttons.length;e++)this.buttons[e].destroy();this.buttons=[],this.empty(),this.buildInterface()}}}),e}();t.exports=h},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(6),a=i(11),h=i(5),u=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[60,30],value:0,min:0,max:2e4,step:1}),this._value=new a(this.settings.min,this.settings.max,this.settings.step,this.settings.value),this.decimalPlaces=2,this.actual=0,this.max=this._value.max,this.min=this._value.min,this.step=this._value.step,this.init(),this.render()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,o),n(e,{buildFrame:{value:function(){this.element=document.createElement("input"),this.element.type="text",this.element.addEventListener("blur",function(){this.element.style.backgroundColor=this.colors.fill,this.element.style.color=this.colors.dark,this.element.value!==this.value&&(this.value=parseFloat(this.element.value),this.render())}.bind(this)),this.element.addEventListener("keydown",function(t){(t.which<48||t.which>57)&&189!==t.which&&190!==t.which&&8!==t.which&&t.preventDefault(),13===t.which&&(this.element.blur(),this.value=this.element.value,this.emit("change",this.value),this.render())}.bind(this)),this.parent.appendChild(this.element)}},sizeInterface:{value:function(){this._minDimension=Math.min(this.width,this.height);var t="width: "+this.width+"px;";t+="height: "+this.height+"px;",t+="background-color: #e7e7e7;",t+="color: #333;",t+="font-family: arial;",t+="font-weight: 500;",t+="font-size:"+this._minDimension/2+"px;",t+="border: none;",t+="outline: none;",t+="padding: "+this._minDimension/4+"px "+this._minDimension/4+"px;",t+="box-sizing: border-box;",t+="userSelect: text;",t+="mozUserSelect: text;",t+="webkitUserSelect: text;",this.element.style.cssText+=t,this.element.value=this.value}},colorInterface:{value:function(){this.element.style.backgroundColor=this.colors.fill,this.element.style.color=this.colors.dark}},render:{value:function(){this.element.value=h.prune(this.value,this.decimalPlaces)}},click:{value:function(){this.hasMoved=!1,this.element.readOnly=!0,this.actual=this.value,this.initial={y:this.mouse.y},this.changeFactor=h.invert(this.mouse.x/this.width),console.log(this.changeFactor)}},move:{value:function(){if(this.hasMoved=!0,this.clicked){var t=this.actual-(this.mouse.y-this.initial.y)*(h.clip(this.max-this.min,0,1e3)/200)*Math.pow(this.changeFactor,2);this.value=t,this.render(),this._value.changed&&this.emit("change",this.value)}}},release:{value:function(){this.hasMoved?document.body.focus():(this.element.readOnly=!1,this.element.focus(),this.element.setSelectionRange(0,this.element.value.length),this.element.style.backgroundColor=this.colors.accent,this.element.style.color=this.colors.light)}},link:{value:function(t){var e=this;this.min=t.min,this.max=t.max,this.step=t.step,t.on("change",function(t){e.passiveUpdate(t)}),this.on("change",function(e){t.value=e}),this.value=t.value}},passiveUpdate:{value:function(t){this._value.update(t),this.render()}},value:{get:function(){return this._value.value},set:function(t){this._value.update(t),this.emit("change",this.value),this.render()}},min:{get:function(){return this._value.min},set:function(t){this._value.min=t}},max:{get:function(){return this._value.max},set:function(t){this._value.max=t}},step:{get:function(){return this._value.step},set:function(t){this._value.step=t}}}),e}();t.exports=u},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(6),a=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[100,30],options:["default","options"]}),this._selectedIndex=-1,this._value=!1,this._options=this.settings.options,this.init(),this.render()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,o),n(e,{buildFrame:{value:function(){this.element=document.createElement("select"),this.element.style.fontSize=this.height/2+"px",this.element.style.outline="none",this.element.style.highlight="none",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.boundRender=this.render.bind(this),this.element.addEventListener("change",this.boundRender),this.parent.appendChild(this.element)}},attachListeners:{value:function(){}},buildInterface:{value:function(){this.defineOptions()}},colorInterface:{value:function(){this.element.style.backgroundColor=this.colors.fill,this.element.style.color=this.colors.dark,this.element.style.border="solid 0px "+this.colors.mediumLight}},render:{value:function(){this._value=this.element.options[this.element.selectedIndex].text,this._selectedIndex=this.element.selectedIndex,this.emit("change",{value:this._value,index:this._selectedIndex})}},click:{value:function(){}},move:{value:function(){}},release:{value:function(){}},defineOptions:{value:function(t){t&&(this._options=t);for(var e=this.element.options.length-1;e>=0;e--)this.element.remove(e);for(e=0;e<this._options.length;e++)this.element.options.add(new Option(this._options[e],e))}},value:{get:function(){return this._value},set:function(t){this._value=t;for(var e=0;e<this.element.options.length;e++)if(t===this.element.options[e].text){this.selectedIndex=e;break}}},selectedIndex:{get:function(){return this._selectedIndex},set:function(t){this._selectedIndex=t,this.element.selectedIndex=t,this.render()}},customDestroy:{value:function(){this.element.removeEventListener("change",this.boundRender)}}}),e}();t.exports=a},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(5),h=i(6),u=i(11),l=function(t){return t&&t.__esModule?t:{default:t}}(i(12)),c=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["min","max","value"],{size:[75,75],interaction:"radial",mode:"relative",min:0,max:1,step:0,value:0}),this.interaction=this.settings.interaction,this._value=new u(this.settings.min,this.settings.max,this.settings.step,this.settings.value),this.position=new l.Handle(this.settings.mode,this.interaction,[0,this.width],[this.height,0]),this.init(),this.value=this._value.value,this.position.value=this._value.normalized,this.previousAngle=!1,this.emit("change",this.value)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,h),n(e,{buildInterface:{value:function(){this.background=o.create("circle"),this.screw=o.create("circle"),this.handle=o.create("path"),this.handle2=o.create("path"),this.handleFill=o.create("path"),this.handle2Fill=o.create("path"),this.handleLine=o.create("path"),this.element.appendChild(this.background),this.element.appendChild(this.handle),this.element.appendChild(this.handle2),this.element.appendChild(this.handleFill),this.element.appendChild(this.handle2Fill),this.element.appendChild(this.handleLine),this.element.appendChild(this.screw)}},sizeInterface:{value:function(){this.position.resize([0,this.width],[this.height,0]);var t={x:this.width/2,y:this.height/2},e=Math.min(this.width,this.height);this.background.setAttribute("cx",t.x),this.background.setAttribute("cy",t.y),this.background.setAttribute("r",e/2-e/40),this.screw.setAttribute("cx",t.x),this.screw.setAttribute("cy",t.y),this.screw.setAttribute("r",e/12);var i=this.value,n={start:1.5*Math.PI,end:a.clip(a.scale(i,0,.5,1.5*Math.PI,.5*Math.PI),.5*Math.PI,1.5*Math.PI)},s={start:2.5*Math.PI,end:a.clip(a.scale(i,.5,1,2.5*Math.PI,1.5*Math.PI),1.5*Math.PI,2.5*Math.PI)},r=o.arc(t.x,t.y,e/2-e/40,n.start,n.end),h=o.arc(t.x,t.y,e/2-e/40,s.start,s.end);this.handle.setAttribute("d",r),this.handle.setAttribute("stroke-width",e/20),this.handle.setAttribute("fill","none"),this.handle2.setAttribute("d",h),this.handle2.setAttribute("stroke-width",e/20),this.handle2.setAttribute("fill","none"),r+=" L "+t.x+" "+t.y,this.handleFill.setAttribute("d",r),this.handleFill.setAttribute("fill-opacity","0.3"),h+=" L "+t.x+" "+t.y,this.handle2Fill.setAttribute("d",h),this.handle2Fill.setAttribute("fill-opacity","0.3");var u=void 0;u=i<.5?n.end:s.end;var l=t.x+Math.cos(u)*(e/2),c=t.y+Math.sin(u)*(e/2)*-1;this.handleLine.setAttribute("d","M "+t.x+" "+t.y+" L "+l+" "+c),this.handleLine.setAttribute("stroke-width",e/20)}},colorInterface:{value:function(){this.background.setAttribute("fill",this.colors.fill),this.screw.setAttribute("fill",this.colors.accent),this.handle.setAttribute("stroke",this.colors.accent),this.handle2.setAttribute("stroke",this.colors.accent),this.handleFill.setAttribute("fill",this.colors.accent),this.handle2Fill.setAttribute("fill",this.colors.accent),this.handleLine.setAttribute("stroke",this.colors.accent)}},render:{value:function(){var t=this._value.normalized,e={x:this.width/2,y:this.height/2},i=Math.min(this.width,this.height),n={start:1.5*Math.PI,end:a.clip(a.scale(t,0,.5,1.5*Math.PI,.5*Math.PI),.5*Math.PI,1.5*Math.PI)},s={start:2.5*Math.PI,end:a.clip(a.scale(t,.5,1,2.5*Math.PI,1.5*Math.PI),1.5*Math.PI,2.5*Math.PI)},r=o.arc(e.x,e.y,i/2-i/40,n.start,n.end),h=o.arc(e.x,e.y,i/2-i/40,s.start,s.end);this.handle.setAttribute("d",r),this.handle2.setAttribute("d",h),r+=" L "+e.x+" "+e.y,this.handleFill.setAttribute("d",r),h+=" L "+e.x+" "+e.y,this.handle2Fill.setAttribute("d",h);var u=void 0;u=t<=.5?n.end:s.end;var l=e.x+Math.cos(u)*(i/2),c=e.y+Math.sin(u)*(i/2)*-1;this.handleLine.setAttribute("d","M "+e.x+" "+e.y+" L "+l+" "+c)}},click:{value:function(){"relative"===this.mode&&(this.previousAngle=!1),this.position.anchor=this.mouse,this.position.value=this._value.normalized,this.move()}},move:{value:function(){if(this.clicked){this.position.update(this.mouse);var t=this.position.value*Math.PI*2;t<0&&(t+=2*Math.PI),"relative"===this.mode&&!1!==this.previousAngle&&Math.abs(this.previousAngle-t)>2&&(t=this.previousAngle>3?2*Math.PI:0),this.previousAngle=t;var e=t/(2*Math.PI);this.value=this._value.updateNormal(e),"relative"===this.mode&&(this.position.value=e),this.emit("change",this._value.value),this.render()}}},release:{value:function(){}},value:{get:function(){return this._value.value},set:function(t){this._value.update(t),this.position.value=this._value.normalized,this.emit("change",this._value.value),this.render()}},min:{get:function(){return this._value.min},set:function(t){this._value.min=t}},max:{get:function(){return this._value.max},set:function(t){this._value.max=t}},step:{get:function(){return this._value.step},set:function(t){this._value.step=t}},mode:{get:function(){return this.position.mode},set:function(t){this.position.mode=t}},normalized:{get:function(){return this._value.normalized},set:function(t){this._value.updateNormal(t),this.emit("change",this.value)}}}),e}();t.exports=c},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)},o=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},a=i(4),h=i(6),u=i(17),l=i(9),c=function(t){function e(){o(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value","note","color"],{size:[80,80],target:!1,mode:"button",value:0}),this.note=this.settings.note,this.color=this.settings.color,this.colors={w:"#fff",b:"#666"},this.init(),this.render()}return r(e,u),n(e,{buildFrame:{value:function(){this.element=a.create("svg"),this.element.setAttribute("width",this.width),this.element.setAttribute("height",this.height),this.parent.appendChild(this.element)}},buildInterface:{value:function(){var t=this;this.pad=a.create("rect"),this.element.appendChild(this.pad),this.interactionTarget=this.pad,l.exists||(this.click=function(){t.piano.interacting=!0,t.piano.paintbrush=!t.state,t.down(t.piano.paintbrush)},this.pad.addEventListener("mouseover",function(){t.piano.interacting&&t.down(t.piano.paintbrush)}),this.move=function(){t.piano.interacting&&t.bend()},this.release=function(){t.piano.interacting=!1},this.pad.addEventListener("mouseup",function(){t.piano.interacting&&t.up()}),this.pad.addEventListener("mouseout",function(){t.piano.interacting&&t.up()}))}},sizeInterface:{value:function(){this.pad.setAttribute("x",.5),this.pad.setAttribute("y",.5),this.width>2?this.pad.setAttribute("width",this.width-1):this.pad.setAttribute("width",this.width),this.height,this.pad.setAttribute("height",this.height),this.pad.setAttribute("rx",0),this.pad.setAttribute("ry",0)}},render:{value:function(){this.state?this.pad.setAttribute("fill",this.colors.accent):this.pad.setAttribute("fill",this.colors[this.color])}}}),e}(),p=function(t){function e(){o(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[500,125],lowNote:24,highNote:60,mode:"button"}),this.keyPattern=["w","b","w","b","w","w","b","w","b","w","b","w"],this.paintbrush=!1,this.mode=this.settings.mode,this.range={low:this.settings.lowNote,high:this.settings.highNote},this.range.size=this.range.high-this.range.low,this.keys=[],this.toggleTo=!1,this.init(),this.render()}return r(e,h),n(e,{buildFrame:{value:function(){this.element=document.createElement("div"),this.element.style.position="relative",this.element.style.borderRadius="0px",this.element.style.display="block",this.element.style.width="100%",this.element.style.height="100%",this.parent.appendChild(this.element)}},buildInterface:{value:function(){this.keys=[];for(var t=0;t<this.range.high-this.range.low;t++){var e=document.createElement("span"),i=(t+this.range.low)%this.keyPattern.length,n=new c(e,{component:!0,note:t+this.range.low,color:this.keyPattern[i],mode:this.mode},this.keyChange.bind(this,t+this.range.low));n.piano=this,l.exists&&(n.pad.index=t,n.preClick=n.preMove=n.preRelease=function(){},n.click=n.move=n.release=function(){},n.preTouch=n.preTouchMove=n.preTouchRelease=function(){},n.touch=n.touchMove=n.touchRelease=function(){}),this.keys.push(n),this.element.appendChild(e)}l.exists&&this.addTouchListeners()}},sizeInterface:{value:function(){for(var t=0,e=[],i=0;i<this.range.high-this.range.low;i++){e.push(t);var n=(i+this.range.low)%this.keyPattern.length,s=(i+1+this.range.low)%this.keyPattern.length;i+1+this.range.low>=this.range.high?t+=1:"w"===this.keyPattern[n]&&"w"===this.keyPattern[s]?t+=1:t+=.5}var r=t,o=(this.width-2)/r,a=(this.height-2)/2;for(i=0;i<this.keys.length;i++){var h=this.keys[i].parent;h.style.position="absolute",h.style.left=e[i]*o+1+"px","w"===this.keys[i].color?(h.style.top="1px",this.keys[i].resize(o,2*a)):(h.style.zIndex=1,h.style.top="1px",this.keys[i].resize(o,1.1*a))}}},colorInterface:{value:function(){this.element.style.backgroundColor=this.colors.mediumLight;for(var t=0;t<this.keys.length;t++)this.keys[t].colors={w:this.colors.light,b:this.colors.dark,accent:this.colors.accent,border:this.colors.mediumLight},this.keys[t].colorInterface(),this.keys[t].render()}},keyChange:{value:function(t,e){var i={note:t};i.state="object"==typeof e?e.state:e,this.emit("change",i)}},render:{value:function(){}},addTouchListeners:{value:function(){var t=this;this.preClick=this.preMove=this.preRelease=function(){},this.click=this.move=this.release=function(){},this.preTouch=this.preTouchMove=this.preTouchRelease=function(){},this.touch=this.touchMove=this.touchRelease=function(){},this.currentElement=!1,this.element.addEventListener("touchstart",function(e){console.log("touchstart");var i=document.elementFromPoint(e.targetTouches[0].clientX,e.targetTouches[0].clientY),n=t.keys[i.index];t.paintbrush=!n.state,n.down(t.paintbrush),t.currentElement=i.index,e.preventDefault(),e.stopPropagation()}),this.element.addEventListener("touchmove",function(e){var i=document.elementFromPoint(e.targetTouches[0].clientX,e.targetTouches[0].clientY),n=t.keys[i.index];if(i.index!==t.currentElement){if(t.currentElement)t.keys[t.currentElement].up();n.down(t.paintbrush)}else n.bend();t.currentElement=i.index,e.preventDefault(),e.stopPropagation()}),this.element.addEventListener("touchend",function(e){t.keys[t.currentElement].up(),t.interacting=!1,t.currentElement=!1,e.preventDefault(),e.stopPropagation()})}},setRange:{value:function(t,e){this.range.low=t,this.range.high=e,this.empty(),this.buildInterface()}},toggleKey:{value:function(t,e){this.keys[t-this.range.low].flip(e)}},toggleIndex:{value:function(t,e){this.keys[t].flip(e)}}}),e}();t.exports=p},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)},o=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},a=i(4),h=i(7),u=i(6),l=i(17),c=i(25),p=i(28),f=i(9),d=function(t){function e(){o(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[80,80],target:!1,mode:"toggle",value:0}),this.index=this.settings.index,this.row=this.settings.row,this.column=this.settings.column,this.matrix=this.settings.matrix,this.interacting=!1,this.paintbrush=!1,this.init(),this.render()}return r(e,l),n(e,{buildFrame:{value:function(){this.element=a.create("svg"),this.element.setAttribute("width",this.width),this.element.setAttribute("height",this.height),this.element.style.top="0px",this.element.style.left="0px",this.element.style.position="absolute",this.parent.appendChild(this.element)}},buildInterface:{value:function(){var t=this;this.pad=a.create("rect"),this.element.appendChild(this.pad),this.interactionTarget=this.pad,f.exists||(this.click=function(){t.matrix.interacting=!0,t.matrix.paintbrush=!t.state,t.down(t.matrix.paintbrush)},this.pad.addEventListener("mouseover",function(){t.matrix.interacting&&t.down(t.matrix.paintbrush)}),this.move=function(){},this.pad.addEventListener("mousemove",function(e){t.matrix.interacting&&(t.offset||(t.offset=h.findPosition(t.element)),t.mouse=h.locateMouse(e,t.offset),t.bend())}),this.release=function(){t.matrix.interacting=!1},this.pad.addEventListener("mouseup",function(){t.matrix.interacting&&t.up()}),this.pad.addEventListener("mouseout",function(){t.matrix.interacting&&t.up()}))}},sizeInterface:{value:function(){this.pad.setAttribute("x",1),this.pad.setAttribute("y",1),this.width>2?this.pad.setAttribute("width",this.width-2):this.pad.setAttribute("width",this.width),this.height>2?this.pad.setAttribute("height",this.height-2):this.pad.setAttribute("height",this.height),this.pad.setAttribute("fill",this.matrix.colors.fill)}},render:{value:function(){this.state?this.pad.setAttribute("fill",this.matrix.colors.accent):this.pad.setAttribute("fill",this.matrix.colors.fill)}}}),e}(),y=function(t){function e(){o(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[400,200],mode:"toggle",rows:5,columns:10}),this.active=-1,this.mode=this.settings.mode,this.interval=new Nexus.Interval(200,function(){},!1),this.matrix=new c(this.settings.rows,this.settings.columns),this.matrix.ui=this,this.stepper=new p(0,this.columns),this.init()}return r(e,u),n(e,{buildFrame:{value:function(){this.element=document.createElement("div"),this.element.style.position="relative",this.element.style.display="block",this.element.style.width="100%",this.element.style.height="100%",this.parent.appendChild(this.element),f.exists&&this.addTouchListeners()}},buildInterface:{value:function(){this.cells=[];for(var t=0;t<this.matrix.length;t++){var e=this.matrix.locate(t),i=document.createElement("span");i.style.position="absolute";var n=new d(i,{component:!0,index:t,row:e.row,column:e.column,mode:this.mode,matrix:this},this.keyChange.bind(this,t));f.exists&&(n.pad.index=t,n.preClick=n.preMove=n.preRelease=function(){},n.click=n.move=n.release=function(){},n.preTouch=n.preTouchMove=n.preTouchRelease=function(){},n.touch=n.touchMove=n.touchRelease=function(){}),this.cells.push(n),this.element.appendChild(i)}this.sizeInterface()}},sizeInterface:{value:function(){for(var t=this.width/this.columns,e=this.height/this.rows,i=0;i<this.cells.length;i++){var n=this.cells[i].parent;n.style.left=this.cells[i].column*t+"px",n.style.top=this.cells[i].row*e+"px",this.cells[i].resize(t,e)}}},colorInterface:{value:function(){for(var t=0;t<this.cells.length;t++)this.cells[t].render()}},update:{value:function(){var t=this;this.matrix.iterate(function(e,i,n){t.matrix.pattern[e][i]!==t.cells[n].state&&(t.matrix.pattern[e][i]>0?t.cells[n].turnOn():t.cells[n].turnOff())})}},keyChange:{value:function(t,e){var i=this.matrix.locate(t);this.matrix.pattern[i.row][i.column]=e;var n={row:i.row,column:i.column,state:e};this.emit("change",n)}},render:{value:function(){var t=this;this.stepper.value>=0&&this.matrix.iterate(function(e,i,n){i===t.stepper.value?(t.cells[n].pad.setAttribute("stroke",t.colors.mediumLight),t.cells[n].pad.setAttribute("stroke-width","1"),t.cells[n].pad.setAttribute("stroke-opacity","1")):t.cells[n].pad.setAttribute("stroke","none")})}},start:{value:function(t){this.interval.event=this.next.bind(this),t&&this.interval.ms(t),this.interval.start()}},stop:{value:function(){this.interval.stop()}},next:{value:function(){this.stepper.next(),this.emit("step",this.matrix.column(this.stepper.value).reverse()),this.render()}},addTouchListeners:{value:function(){var t=this;this.preClick=this.preMove=this.preRelease=function(){},this.click=this.move=this.release=function(){},this.preTouch=this.preTouchMove=this.preTouchRelease=function(){},this.touch=this.touchMove=this.touchRelease=function(){},this.currentElement=!1,this.element.addEventListener("touchstart",function(e){var i=document.elementFromPoint(e.targetTouches[0].clientX,e.targetTouches[0].clientY),n=t.cells[i.index];t.paintbrush=!n.state,n.down(t.paintbrush),t.currentElement=i.index,e.preventDefault(),e.stopPropagation()}),this.element.addEventListener("touchmove",function(e){var i=document.elementFromPoint(e.targetTouches[0].clientX,e.targetTouches[0].clientY),n=t.cells[i.index];if(i.index!==t.currentElement){if(t.currentElement>=0)t.cells[t.currentElement].up();n.down(t.paintbrush)}else n.bend();t.currentElement=i.index,e.preventDefault(),e.stopPropagation()}),this.element.addEventListener("touchend",function(e){t.cells[t.currentElement].up(),t.interacting=!1,t.currentElement=!1,e.preventDefault(),e.stopPropagation()})}},rows:{get:function(){return this.matrix.rows},set:function(t){this.matrix.rows=t,this.empty(),this.buildInterface(),this.update()}},columns:{get:function(){return this.matrix.columns},set:function(t){this.matrix.columns=t,this.stepper.max=t,this.empty(),this.buildInterface(),this.update()}}}),e}();t.exports=y},function(t,e,i){"use strict";var n=function(t){return t&&t.__esModule?t.default:t},s=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=n(i(5)),a=n(i(26)),h=function(){function t(e,i){var n=this;r(this,t),this.pattern=[],this.create(e,i),this.toggle={cell:function(t,e){return n.pattern[e][t]=!n.pattern[e][t],n.ui&&n.ui.update(),n.pattern[e][t]},all:function(){n.iterate(function(t,e){n.toggle.cell(e,t)}),n.ui&&n.ui.update()},row:function(t){for(var e=0;e<n.columns;e++)n.toggle.cell(e,t);n.ui&&n.ui.update()},column:function(t){for(var e=0;e<n.rows;e++)n.toggle.cell(t,e);n.ui&&n.ui.update()}},this.set={cell:function(t,e,i){n.pattern[e][t]=i,n.ui&&n.ui.update()},all:function(t){n.pattern=t,n.ui&&n.ui.update()},row:function(t,e){n.pattern[t]=e,n.ui&&n.ui.update()},column:function(t,e){n.pattern.forEach(function(i,s){n.pattern[s][t]=e[s]}),n.ui&&n.ui.update()}},this.rotate={all:function(t){t||0===t||(t=1),(t%=n.pattern[0].length)<0&&(t=n.pattern[0].length+t);for(var e=0;e<n.rows;e++){var i=n.pattern[e].splice(n.pattern[e].length-t,t);n.pattern[e]=i.concat(n.pattern[e])}n.ui&&n.ui.update()},row:function(t,e){e||0===e||(e=1),(e%=n.pattern[0].length)<0&&(e=n.pattern[0].length+e);var i=n.pattern[t].splice(n.pattern[t].length-e,e);n.pattern[t]=i.concat(n.pattern[t]),n.ui&&n.ui.update()},column:function(t,e){e||0===e||(e=1),(e%=n.pattern.length)<0&&(e=n.pattern.length+e);var i=[];n.pattern.forEach(function(e){i.push(e[t])});var s=i.splice(i.length-e,e);i=s.concat(i),n.pattern.forEach(function(e,n){e[t]=i[n]}),n.ui&&n.ui.update()}},this.populate={all:function(t){var e=new a(t);n.iterate(function(t,i){n.pattern[t][i]=o.coin(e.next())}),n.ui&&n.ui.update()},row:function(){var t=void 0===arguments[0]?0:arguments[0],e=void 0===arguments[1]?1:arguments[1],i=new a(e);n.pattern[t].forEach(function(e,s){n.pattern[t][s]=o.coin(i.next())}),n.ui&&n.ui.update()},column:function(){var t=void 0===arguments[0]?0:arguments[0],e=void 0===arguments[1]?1:arguments[1],i=new a(e);n.pattern.forEach(function(e,s){n.pattern[s][t]=o.coin(i.next())}),n.ui&&n.ui.update()}},this.erase={all:function(){n.set.all(0)},row:function(t){n.set.row(t,0)},column:function(t){n.set.column(t,0)}}}return s(t,{create:{value:function(t,e){var i=this;this.pattern=[];for(var n=0;n<t;n++){var s=new Array(e);this.pattern.push(s)}this.iterate(function(t,e){i.pattern[t][e]=!1})}},iterate:{value:function(t,e){for(var i=0,n=0;n<this.rows;n++){e&&e(n);for(var s=0;s<this.columns;s++)t(n,s,i),i++}}},formatAsText:{value:function(){var t=this,e="";return this.iterate(function(i,n){e+=(t.pattern[i][n]?1:0)+" "},function(){e+="\n"}),e}},log:{value:function(){console.log(this.formatAsText())}},update:{value:function(t){this.pattern=t||this.pattern}},length:{get:function(){return this.rows*this.columns}},locate:{value:function(t){return{row:~~(t/this.columns),column:t%this.columns}}},indexOf:{value:function(t,e){return e+t*this.columns}},row:{value:function(t){var e=function(e){return t.apply(this,arguments)};return e.toString=function(){return t.toString()},e}(function(t){for(var e=[],i=0;i<this.columns;i++)e.push(this.pattern[t]?1:0);return e})},column:{value:function(t){var e=function(e){return t.apply(this,arguments)};return e.toString=function(){return t.toString()},e}(function(t){for(var e=[],i=0;i<this.rows;i++)e.push(this.pattern[i][t]?1:0);return e})},rows:{get:function(){return this.pattern.length},set:function(t){var e=this,i=this.pattern.slice(0);this.create(t,this.columns),this.iterate(function(t,n){i[t]&&i[t][n]&&(e.pattern[t][n]=i[t][n])})}},columns:{get:function(){return this.pattern[0].length},set:function(t){var e=this,i=this.pattern.slice(0);this.create(this.rows,t),this.iterate(function(t,n){i[t]&&i[t][n]&&(e.pattern[t][n]=i[t][n])})}}}),t}();t.exports=h},function(t,e,i){"use strict";var n=function(t){return t&&t.__esModule?t.default:t},s=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=n(i(5)),a=n(i(27)),h=function(){function t(){var e=void 0===arguments[0]?[0,10,20,30]:arguments[0],i=void 0===arguments[1]?"up":arguments[1],n=void 0!==arguments[2]&&arguments[2];r(this,t),this.values=e,Array.isArray(this.values)||(this.values=[this.values]),this._mode=i,this.position=n,this.drunkWalk=new a(0,this.values.length-1),this.startValues={up:0,down:this.values.length-1,drunk:~~(this.values.length/2),random:o.ri(this.values.length)},!1!==this.position?this.next=this[this._mode]:this.next=this.first}return s(t,{mode:{get:function(){return this._mode},set:function(t){"up"===t||"down"===t||"random"===t||"drunk"===t?(this._mode=t,this.position&&(this.next=this[this._mode])):console.error("The only modes currently allowed are: up, down, random, drunk")}},value:{get:function(){return this.values[this.position]},set:function(t){this.position=this.values.indexOf(t)}},first:{value:function(){return!1!==this.position?(this.next=this[this._mode],this.next()):(this.position=this.startValues[this._mode],this.next=this[this._mode],this.value)}},up:{value:function(){return this.position++,this.position%=this.values.length,this.value}},down:{value:function(){return this.position--,this.position<0&&(this.position=(this.position+this.values.length)%this.values.length),this.value}},random:{value:function(){return this.position=o.ri(0,this.values.length),this.value}},drunk:{value:function(){return this.drunkWalk.max=this.values.length,this.drunkWalk.value=this.position,this.position=this.drunkWalk.next(),this.value}}}),t}();t.exports=h},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},r=function(t){return t&&t.__esModule?t.default:t}(i(5)),o=function(){function t(){var e=void 0===arguments[0]?0:arguments[0],i=void 0===arguments[1]?9:arguments[1],n=void 0===arguments[2]?0:arguments[2],r=void 0===arguments[3]?1:arguments[3],o=void 0!==arguments[4]&&arguments[4];s(this,t),this.min=e,this.max=i,this.value=n,this.increment=r,this.loop=o}return n(t,{next:{value:function(){return this.value+=r.pick(-1*this.increment,this.increment),this.value>this.max&&(this.loop?this.value=this.min:this.value=this.max-this.increment),this.value<this.min&&(this.loop?this.value=this.max:this.value=this.min+this.increment),this.value}}}),t}();t.exports=o},function(t,e,i){"use strict";var n=function(t){return t&&t.__esModule?t.default:t},s=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=n(i(5)),a=n(i(27)),h=function(){function t(){var e=void 0===arguments[0]?0:arguments[0],i=void 0===arguments[1]?10:arguments[1],n=void 0===arguments[2]?"up":arguments[2],s=void 0!==arguments[3]&&arguments[3];r(this,t),this.min=e,this.max=i,this.value=s,this.mode=n,this.drunkWalk=new a(this.min,this.max),!1!==this.value?this.next=this[this._mode]:this.next=this.first}return s(t,{mode:{set:function(t){"up"===t||"down"===t||"random"===t||"drunk"===t?(this._mode=t,this.value&&(this.next=this[this._mode])):console.error("The only modes currently allowed are: up, down, random, drunk")},get:function(){return this._mode}},first:{value:function(){return!1!==this.value?(this.next=this[this._mode],this.next()):(this.startValues={up:this.min,down:this.max,drunk:~~o.average(this.min,this.max),random:o.ri(this.min,this.max)},this.value=this.startValues[this._mode],this.next=this[this._mode],this.value)}},up:{value:function(){return this.value++,this.value>=this.max&&(this.value=this.min),this.value}},down:{value:function(){return this.value--,this.value<this.min&&(this.value=this.max),this.value}},random:{value:function(){return this.value=o.ri(this.min,this.max),this.value}},drunk:{value:function(){return this.drunkWalk.min=this.min,this.drunkWalk.max=this.max,this.drunkWalk.value=this.value,this.value=this.drunkWalk.next(),this.value}}}),t}();t.exports=h},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(5),h=i(6),u=i(11),l=function(t){return t&&t.__esModule?t:{default:t}}(i(12)),c=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["range"],{size:[200,200],range:.5,mode:"absolute",speakers:[[.5,.2],[.75,.25],[.8,.5],[.75,.75],[.5,.8],[.25,.75],[.2,.5],[.25,.25]]}),this.value={x:new u(0,1,0,.5),y:new u(0,1,0,.5)},this.mode=this.settings.mode,this.position={x:new l.Handle(this.mode,"horizontal",[0,this.width],[this.height,0]),y:new l.Handle(this.mode,"vertical",[0,this.width],[this.height,0])},this.position.x.value=this.value.x.normalized,this.position.y.value=this.value.y.normalized,this.speakers=this.settings.speakers,this.range=this.settings.range,this.levels=[],this.init(),this.calculateLevels(),this.render()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,h),n(e,{buildInterface:{value:function(){this.knob=o.create("circle"),this.element.appendChild(this.knob),this.speakerElements=[];for(var t=0;t<this.speakers.length;t++){var e=o.create("circle");this.element.appendChild(e),this.speakerElements.push(e)}}},sizeInterface:{value:function(){this._minDimension=Math.min(this.width,this.height),this.knobRadius={off:3*~~(this._minDimension/100)+5},this.knobRadius.on=2*this.knobRadius.off,this.knob.setAttribute("cx",this.width/2),this.knob.setAttribute("cy",this.height/2),this.knob.setAttribute("r",this.knobRadius.off);for(var t=0;t<this.speakers.length;t++){var e=this.speakerElements[t],i=this.speakers[t];e.setAttribute("cx",i[0]*this.width),e.setAttribute("cy",i[1]*this.height),e.setAttribute("r",this._minDimension/20+5),e.setAttribute("fill-opacity","0")}this.position.x.resize([0,this.width],[this.height,0]),this.position.y.resize([0,this.width],[this.height,0]),this.calculateLevels(),this.render()}},colorInterface:{value:function(){this.element.style.backgroundColor=this.colors.fill,this.knob.setAttribute("fill",this.colors.mediumLight);for(var t=0;t<this.speakers.length;t++){var e=this.speakerElements[t];e.setAttribute("fill",this.colors.accent),e.setAttribute("stroke",this.colors.accent)}}},render:{value:function(){this.knobCoordinates={x:this.value.x.normalized*this.width,y:this.height-this.value.y.normalized*this.height},this.knob.setAttribute("cx",this.knobCoordinates.x),this.knob.setAttribute("cy",this.knobCoordinates.y)}},click:{value:function(){this.position.x.anchor=this.mouse,this.position.y.anchor=this.mouse,this.move()}},move:{value:function(){this.clicked&&(this.position.x.update(this.mouse),this.position.y.update(this.mouse),this.calculateLevels(),this.emit("change",this.levels),this.render())}},release:{value:function(){this.render()}},normalized:{get:function(){return{x:this.value.x.normalized,y:this.value.y.normalized}}},calculateLevels:{value:function(){var t=this;this.value.x.updateNormal(this.position.x.value),this.value.y.updateNormal(this.position.y.value),this.levels=[],this.speakers.forEach(function(e,i){var n=a.distance(e[0]*t.width,e[1]*t.height,t.position.x.value*t.width,(1-t.position.y.value)*t.height),s=a.clip(1-n/(t.range*t.width),0,1);t.levels.push(s),t.speakerElements[i].setAttribute("fill-opacity",s)})}},moveSource:{value:function(t,e){var i={x:t*this.width,y:e*this.height};this.position.x.update(i),this.position.y.update(i),this.calculateLevels(),this.emit("change",this.levels),this.render()}},moveSpeaker:{value:function(t,e,i){this.speakers[t]=[e,i],this.speakerElements[t].setAttribute("cx",e*this.width),this.speakerElements[t].setAttribute("cy",i*this.height),this.calculateLevels(),this.emit("change",this.levels),this.render()}}}),e}();t.exports=c},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(5),a=i(4),h=i(6),u=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[80,80]}),this._active=!0,this.init(),this.boundUpdate=this.update.bind(this),window.DeviceOrientationEvent?this.orientationListener=window.addEventListener("deviceorientation",this.boundUpdate,!1):(this._active=!1,this.colorInterface())}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,h),n(e,{buildInterface:{value:function(){this.title=a.create("text"),this.circleX=a.create("circle"),this.circleY=a.create("circle"),this.circleZ=a.create("circle"),this.barX=a.create("path"),this.barY=a.create("path"),this.barZ=a.create("path"),this.barX2=a.create("path"),this.barY2=a.create("path"),this.barZ2=a.create("path"),this.barX.setAttribute("opacity","0.8"),this.barY.setAttribute("opacity","0.8"),this.barZ.setAttribute("opacity","0.8"),this.barX2.setAttribute("opacity","0.8"),this.barY2.setAttribute("opacity","0.8"),this.barZ2.setAttribute("opacity","0.8"),this.circleX.setAttribute("cx",3*this.width/12),this.circleX.setAttribute("cy",3*this.height/4),this.circleX.setAttribute("r",this.height/10),this.circleX.setAttribute("opacity","0.4"),this.circleY.setAttribute("cx",6*this.width/12),this.circleY.setAttribute("cy",3*this.height/4),this.circleY.setAttribute("r",this.height/10),this.circleY.setAttribute("opacity","0.4"),this.circleZ.setAttribute("cx",9*this.width/12),this.circleZ.setAttribute("cy",3*this.height/4),this.circleZ.setAttribute("r",this.height/10),this.circleZ.setAttribute("opacity","0.4"),this.barX.setAttribute("stroke-width",Math.round(this.height/30)),this.barY.setAttribute("stroke-width",Math.round(this.height/30)),this.barZ.setAttribute("stroke-width",Math.round(this.height/30)),this.barX.setAttribute("fill","none"),this.barY.setAttribute("fill","none"),this.barZ.setAttribute("fill","none"),this.barX2.setAttribute("stroke-width",Math.round(this.height/30)),this.barY2.setAttribute("stroke-width",Math.round(this.height/30)),this.barZ2.setAttribute("stroke-width",Math.round(this.height/30)),this.barX2.setAttribute("fill","none"),this.barY2.setAttribute("fill","none"),this.barZ2.setAttribute("fill","none"),this.title.setAttribute("x",this.width/2),this.title.setAttribute("y",this.height/3+7),this.title.setAttribute("font-size","15px"),this.title.setAttribute("font-weight","bold"),this.title.setAttribute("letter-spacing","2px"),this.title.setAttribute("opacity","0.7"),this.title.setAttribute("text-anchor","middle"),this.title.textContent="TILT",this.element.appendChild(this.circleX),this.element.appendChild(this.circleY),this.element.appendChild(this.circleZ),this.element.appendChild(this.barX),this.element.appendChild(this.barY),this.element.appendChild(this.barZ),this.element.appendChild(this.barX2),this.element.appendChild(this.barY2),this.element.appendChild(this.barZ2),this.element.appendChild(this.title)}},colorInterface:{value:function(){this._active?(this.element.style.backgroundColor=this.colors.accent,this.circleX.setAttribute("fill",this.colors.light),this.circleY.setAttribute("fill",this.colors.light),this.circleZ.setAttribute("fill",this.colors.light),this.circleX.setAttribute("stroke",this.colors.light),this.circleY.setAttribute("stroke",this.colors.light),this.circleZ.setAttribute("stroke",this.colors.light),this.barX.setAttribute("stroke",this.colors.light),this.barY.setAttribute("stroke",this.colors.light),this.barZ.setAttribute("stroke",this.colors.light),this.barX2.setAttribute("stroke",this.colors.light),this.barY2.setAttribute("stroke",this.colors.light),this.barZ2.setAttribute("stroke",this.colors.light),this.title.setAttribute("fill",this.colors.light)):(this.element.style.backgroundColor=this.colors.fill,this.circleX.setAttribute("fill",this.colors.mediumLight),this.circleY.setAttribute("fill",this.colors.mediumLight),this.circleZ.setAttribute("fill",this.colors.mediumLight),this.circleX.setAttribute("stroke",this.colors.mediumLight),this.circleY.setAttribute("stroke",this.colors.mediumLight),this.circleZ.setAttribute("stroke",this.colors.mediumLight),this.barX.setAttribute("stroke",this.colors.mediumLight),this.barY.setAttribute("stroke",this.colors.mediumLight),this.barZ.setAttribute("stroke",this.colors.mediumLight),this.barX2.setAttribute("stroke",this.colors.mediumLight),this.barY2.setAttribute("stroke",this.colors.mediumLight),this.barZ2.setAttribute("stroke",this.colors.mediumLight),this.title.setAttribute("fill",this.colors.mediumLight))}},update:{value:function(t){if(this._active){var e=t.beta,i=t.gamma,n=t.alpha;i=o.scale(i,-90,90,0,1),e=o.scale(e,-90,90,0,1),n=o.scale(n,0,360,0,1);var s={start:1.5*Math.PI,end:o.clip(o.scale(i,0,.5,1.5*Math.PI,.5*Math.PI),.5*Math.PI,1.5*Math.PI)},r={start:2.5*Math.PI,end:o.clip(o.scale(i,.5,1,2.5*Math.PI,1.5*Math.PI),1.5*Math.PI,2.5*Math.PI)},h=a.arc(this.circleX.cx.baseVal.value,this.circleX.cy.baseVal.value,this.circleX.r.baseVal.value,s.start,s.end),u=a.arc(this.circleX.cx.baseVal.value,this.circleX.cy.baseVal.value,this.circleX.r.baseVal.value,r.start,r.end);this.barX.setAttribute("d",h),this.barX2.setAttribute("d",u),s={start:1.5*Math.PI,end:o.clip(o.scale(e,0,.5,1.5*Math.PI,.5*Math.PI),.5*Math.PI,1.5*Math.PI)},r={start:2.5*Math.PI,end:o.clip(o.scale(e,.5,1,2.5*Math.PI,1.5*Math.PI),1.5*Math.PI,2.5*Math.PI)},h=a.arc(this.circleY.cx.baseVal.value,this.circleY.cy.baseVal.value,this.circleY.r.baseVal.value,s.start,s.end),u=a.arc(this.circleY.cx.baseVal.value,this.circleY.cy.baseVal.value,this.circleY.r.baseVal.value,r.start,r.end),this.barY.setAttribute("d",h),this.barY2.setAttribute("d",u),s={start:1.5*Math.PI,end:o.clip(o.scale(n,0,.5,1.5*Math.PI,.5*Math.PI),.5*Math.PI,1.5*Math.PI)},r={start:2.5*Math.PI,end:o.clip(o.scale(n,.5,1,2.5*Math.PI,1.5*Math.PI),1.5*Math.PI,2.5*Math.PI)},h=a.arc(this.circleZ.cx.baseVal.value,this.circleZ.cy.baseVal.value,this.circleZ.r.baseVal.value,s.start,s.end),u=a.arc(this.circleZ.cx.baseVal.value,this.circleZ.cy.baseVal.value,this.circleZ.r.baseVal.value,r.start,r.end),this.barZ.setAttribute("d",h),this.barZ2.setAttribute("d",u),this.emit("change",{x:i,y:e,z:n})}}},click:{value:function(){window.DeviceOrientationEvent&&(this.active=!this.active)}},active:{get:function(){return this._active},set:function(t){this._active=t,this.colorInterface()}},customDestroy:{value:function(){window.removeEventListener("deviceorientation",this.boundUpdate,!1)}}}),e}();t.exports=u},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)},o=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},a=i(7),h=i(5),u=i(6),l=i(32),c=i(9),p=function(t){function e(){var t=this;o(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["scale","value"],{size:[120,20],orientation:"vertical",mode:"absolute",scale:[0,1],step:0,value:0,hasKnob:!0}),c.exists||(this.click=function(){t.multislider.interacting=!0,t.multislider.interpolation={index:t.index,value:t.value},t.down(),t.multislider.values[t.index]=t.value},this.element.addEventListener("mouseover",function(e){if(t.multislider.interacting){if(t.offset||(t.offset=a.findPosition(t.element)),t.mouse=a.locateMouse(e,t.offset),t.down(),t.multislider.values[t.index]=t.value,t.multislider.interpolation){var i=Math.abs(t.multislider.interpolation.index-t.index);if(i>1)for(var n=Math.min(t.multislider.interpolation.index,t.index),s=Math.max(t.multislider.interpolation.index,t.index),r=t.multislider.sliders[n].value,o=t.multislider.sliders[s].value,u=n;u<s;u++){t.multislider.sliders[u].value=h.interp((u-n)/i,r,o);var l=t.multislider.sliders[u].value;t.multislider.values[u]=l,t.multislider.update(u,l)}}t.multislider.interpolation={index:t.index,value:t.value}}}),this.move=function(){},this.element.addEventListener("mousemove",function(e){t.multislider.interacting&&(t.offset||(t.offset=a.findPosition(t.element)),t.mouse=a.locateMouse(e,t.offset),t.slide(),t.multislider.values[t.index]=t.value)}),this.release=function(){t.multislider.interacting=!1,t.multislider.interpolation=!1},this.element.addEventListener("mouseup",function(){t.multislider.interacting&&(t.up(),t.multislider.interpolation=!1,t.multislider.values[t.index]=t.value)}),this.element.addEventListener("mouseout",function(){t.multislider.interacting&&(t.up(),t.multislider.values[t.index]=t.value)})),this.customStyle()}return r(e,l),n(e,{customStyle:{value:function(){this.bar.setAttribute("x",0),this.bar.setAttribute("transform","translate(0,0)"),this.bar.setAttribute("rx",0),this.bar.setAttribute("ry",0),this.bar.setAttribute("width",this.width),this.bar.setAttribute("height",this.height),this.fillbar.setAttribute("x",0),this.fillbar.setAttribute("transform","translate(0,0)"),this.fillbar.setAttribute("rx",0),this.fillbar.setAttribute("ry",0),this.fillbar.setAttribute("width",this.width),this.fillbar.setAttribute("height",this.height)}}}),e}(),f=function(t){function e(){o(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[200,100],numberOfSliders:5,min:0,max:1,step:0,values:[.7,.7,.7,.7,.7]}),this._numberOfSliders=this.settings.numberOfSliders,this.values=this.settings.values,this.sliders=[],this.interacting=!1,this.init()}return r(e,u),n(e,{buildFrame:{value:function(){this.element=document.createElement("div"),this.parent.appendChild(this.element)}},buildInterface:{value:function(){var t=this.settings.min,e=this.settings.max,i=this.settings.step;this.sliders.length&&(t=this.sliders[0].min,e=this.sliders[0].max,i=this.sliders[0].step),this.sliders=[];for(var n=0;n<this._numberOfSliders;n++){var s=document.createElement("span"),r=new p(s,{scale:[t,e],step:i,mode:"absolute",orientation:"vertical",value:this.values[n],hasKnob:!1,component:!0},this.update.bind(this,n));r.multislider=this,r.index=n,c.exists&&(r.bar.index=n,r.fillbar.index=n,r.preClick=r.preMove=r.preRelease=function(){},r.click=r.move=r.release=function(){},r.preTouch=r.preTouchMove=r.preTouchRelease=function(){},r.touch=r.touchMove=r.touchRelease=function(){}),this.sliders.push(r),this.element.appendChild(s)}c.exists&&this.addTouchListeners()}},colorInterface:{value:function(){for(var t=0;t<this.sliders.length;t++)this.sliders[t].colors=this.colors,this.sliders[t].colorInterface()}},sizeInterface:{value:function(){for(var t=this.width/this.sliders.length,e=this.height,i=0;i<this.sliders.length;i++)this.sliders[i].resize(t,e),this.sliders[i].customStyle()}},update:{value:function(t,e){this.emit("change",{index:t,value:e})}},addTouchListeners:{value:function(){var t=this;this.preClick=this.preMove=this.preRelease=function(){},this.click=this.move=this.release=function(){},this.preTouch=this.preTouchMove=this.preTouchRelease=function(){},this.touch=this.touchMove=this.touchRelease=function(){},this.currentElement=!1,this.element.addEventListener("touchstart",function(e){var i=document.elementFromPoint(e.targetTouches[0].clientX,e.targetTouches[0].clientY),n=t.sliders[i.index];n.offset||(n.offset=a.findPosition(n.element)),n.mouse=a.locateMouse(e,n.offset),n.down(),t.currentElement=i.index,e.preventDefault(),e.stopPropagation()}),this.element.addEventListener("touchmove",function(e){var i=document.elementFromPoint(e.targetTouches[0].clientX,e.targetTouches[0].clientY),n=t.sliders[i.index];if(n.offset||(n.offset=a.findPosition(n.element)),n.mouse=a.locateMouse(e,n.offset),i.index!==t.currentElement){if(t.currentElement>=0)t.sliders[t.currentElement].up();n.down()}else n.slide();t.currentElement=i.index,e.preventDefault(),e.stopPropagation()}),this.element.addEventListener("touchend",function(e){t.sliders[t.currentElement].up(),t.interacting=!1,t.currentElement=!1,e.preventDefault(),e.stopPropagation()})}},numberOfSliders:{get:function(){return this.sliders.length},set:function(t){t!==this.sliders.length&&(this.sliders.forEach(function(t){t.destroy()}),this.empty(),this._numberOfSliders=t,this.buildInterface())}},min:{get:function(){return this.sliders[0].min},set:function(t){this.sliders.forEach(function(e){e.min=t})}},max:{get:function(){return this.sliders[0].max},set:function(t){this.sliders.forEach(function(e){e.max=t})}},step:{get:function(){return this.sliders[0].step},set:function(t){this.sliders.forEach(function(e){e.step=t})}},setSlider:{value:function(t,e){this.sliders[t].value=e,this.emit("change",{index:t,value:e})}},setAllSliders:{value:function(t){var e=this;this.values=t,this.sliders.forEach(function(i,n){i.value=t[n%t.length],e.emit("change",{index:n,value:i.value})})}}}),e}();t.exports=f},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(6),h=i(11),u=function(t){return t&&t.__esModule?t:{default:t}}(i(12)),l=function(t){function e(t,i,n){r(this,e),s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,t,i,n),this.orientation=this.settings.orientation,this.hasKnob=this.settings.hasKnob,this._value=new h(this.settings.scale[0],this.settings.scale[1],this.settings.step,this.settings.value),this.init(),this.position=new u.Handle(this.settings.mode,this.orientation,[0,this.width],[this.height,0]),this.position.value=this._value.normalized,this.value=this._value.value,this.emit("change",this.value)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,a),n(e,{buildInterface:{value:function(){this.bar=o.create("rect"),this.fillbar=o.create("rect"),this.knob=o.create("circle"),this.element.appendChild(this.bar),this.element.appendChild(this.fillbar),this.element.appendChild(this.knob),this.sizeInterface()}},sizeInterface:{value:function(){this.settings.orientation||(this.width<this.height?this.orientation="vertical":this.orientation="horizontal");var t=void 0,e=void 0,i=void 0,n=void 0,s=void 0,r=void 0;this.knobData={level:0,r:0},"vertical"===this.orientation?(this.thickness=this.width/2,t=this.width/2,e=0,i=this.thickness,n=this.height,this.knobData.r=.8*this.thickness,this.knobData.level=n-this.normalized*n,s="translate("+-1*this.thickness/2+",0)",r=i/2):(this.thickness=this.height/2,t=0,e=this.height/2,i=this.width,n=this.thickness,this.knobData.r=.8*this.thickness,this.knobData.level=this.normalized*i,s="translate(0,"+-1*this.thickness/2+")",r=n/2),this.bar.setAttribute("x",t),this.bar.setAttribute("y",e),this.bar.setAttribute("transform",s),this.bar.setAttribute("rx",r),this.bar.setAttribute("ry",r),this.bar.setAttribute("width",i),this.bar.setAttribute("height",n),"vertical"===this.orientation?(this.fillbar.setAttribute("x",t),this.fillbar.setAttribute("y",this.knobData.level),this.fillbar.setAttribute("width",i),this.fillbar.setAttribute("height",n-this.knobData.level)):(this.fillbar.setAttribute("x",0),this.fillbar.setAttribute("y",e),this.fillbar.setAttribute("width",this.knobData.level),this.fillbar.setAttribute("height",n)),this.fillbar.setAttribute("transform",s),this.fillbar.setAttribute("rx",r),this.fillbar.setAttribute("ry",r),"vertical"===this.orientation?(this.knob.setAttribute("cx",t),this.knob.setAttribute("cy",this.knobData.level)):(this.knob.setAttribute("cx",this.knobData.level),this.knob.setAttribute("cy",e)),this.knob.setAttribute("r",this.knobData.r),this.position&&this.position.resize([0,this.width],[this.height,0])}},colorInterface:{value:function(){this.bar.setAttribute("fill",this.colors.fill),this.fillbar.setAttribute("fill",this.colors.accent),this.knob.setAttribute("fill",this.colors.accent),this.hasKnob||this.knob.setAttribute("fill","none")}},render:{value:function(){this.clicked||(this.knobData.r=.75*this.thickness),this.knob.setAttribute("r",this.knobData.r),"vertical"===this.orientation?(this.knobData.level=this._value.normalized*this.height,this.knob.setAttribute("cy",this.height-this.knobData.level),this.fillbar.setAttribute("y",this.height-this.knobData.level),this.fillbar.setAttribute("height",this.knobData.level)):(this.knobData.level=this._value.normalized*this.width,this.knob.setAttribute("cx",this.knobData.level),this.fillbar.setAttribute("x",0),this.fillbar.setAttribute("width",this.knobData.level))}},down:{value:function(){this.clicked=!0,this.knobData.r=.9*this.thickness,this.position.anchor=this.mouse,this.slide()}},slide:{value:function(){this.clicked&&(this.position.update(this.mouse),this.value=this._value.updateNormal(this.position.value),this.emit("change",this.value))}},up:{value:function(){this.clicked=!1,this.render()}},normalized:{get:function(){return this._value.normalized}},value:{get:function(){return this._value.value},set:function(t){this._value.update(t),this.position.value=this._value.normalized,this.render()}},min:{get:function(){return this._value.min},set:function(t){this._value.min=t}},max:{get:function(){return this._value.max},set:function(t){this._value.max=t}},step:{get:function(){return this._value.step},set:function(t){this._value.step=t}},mode:{get:function(){return this.position.mode},set:function(t){this.position.mode=t}}}),e}();t.exports=l},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(4),a=i(5),h=i(6),u=i(11),l=function(t){return t&&t.__esModule?t:{default:t}}(i(12)),c=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["scale","value"],{size:[120,20],orientation:"horizontal",mode:"relative",scale:[-1,1],step:0,value:0,hasKnob:!0}),this.orientation=this.settings.orientation,this.mode=this.settings.mode,this.hasKnob=this.settings.hasKnob,this.step=this.settings.step,this._value=new u(this.settings.scale[0],this.settings.scale[1],this.settings.step,this.settings.value),this.init(),this.position=new l.Handle(this.mode,this.orientation,[0,this.width],[this.height,0]),this.position.value=this._value.normalized,this.value=this._value.value,this.emit("change",this.value)}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,h),n(e,{buildInterface:{value:function(){this.bar=o.create("rect"),this.knob=o.create("circle"),this.element.appendChild(this.bar),this.element.appendChild(this.knob)}},sizeInterface:{value:function(){this.position&&this.position.resize([0,this.width],[this.height,0]),this.width<this.height?this.orientation="vertical":this.orientation="horizontal";var t=void 0,e=void 0,i=void 0,n=void 0,s=void 0,r=void 0;this.knobData={level:0,r:0},"vertical"===this.orientation?(this.thickness=this.width/2,t=this.width/2,e=0,i=this.thickness,n=this.height,this.knobData.r=.8*this.thickness,this.knobData.level=n-this.knobData.r-this.normalized*(n-2*this.knobData.r),s="translate("+-1*this.thickness/2+",0)",r=i/2):(this.thickness=this.height/2,t=0,e=this.height/2,i=this.width,n=this.thickness,this.knobData.r=.8*this.thickness,this.knobData.level=this.normalized*(i-2*this.knobData.r)+this.knobData.r,s="translate(0,"+-1*this.thickness/2+")",r=n/2),this.bar.setAttribute("x",t),this.bar.setAttribute("y",e),this.bar.setAttribute("transform",s),this.bar.setAttribute("rx",r),this.bar.setAttribute("ry",r),this.bar.setAttribute("width",i),this.bar.setAttribute("height",n),"vertical"===this.orientation?(this.knob.setAttribute("cx",t),this.knob.setAttribute("cy",this.knobData.level)):(this.knob.setAttribute("cx",this.knobData.level),this.knob.setAttribute("cy",e)),this.knob.setAttribute("r",this.knobData.r)}},colorInterface:{value:function(){this.bar.setAttribute("fill",this.colors.fill),this.knob.setAttribute("fill",this.colors.accent),this.hasKnob||this.knob.setAttribute("fill","transparent")}},render:{value:function(){this.clicked||(this.knobData.r=.75*this.thickness),this.knob.setAttribute("r",this.knobData.r),"vertical"===this.orientation?(this.knobData.level=this.knobData.r+this._value.normalized*(this.height-2*this.knobData.r),this.knob.setAttribute("cy",this.height-this.knobData.level)):(this.knobData.level=this._value.normalized*(this.width-2*this.knobData.r)+this.knobData.r,this.knob.setAttribute("cx",this.knobData.level))}},click:{value:function(){this.knobData.r=.9*this.thickness,this.position.anchor=this.mouse,this.move()}},move:{value:function(){this.clicked&&(this.position.update(this.mouse),this.value=this._value.updateNormal(this.position.value),this.emit("change",{value:this.value,L:Math.pow(a.scale(this.value,-1,1,1,0),2),R:Math.pow(a.scale(this.value,-1,1,0,1),2)}))}},release:{value:function(){this.render()}},value:{get:function(){return this._value.value},set:function(t){this._value.update(t),this.position.value=this._value.normalized,this.emit("change",{value:this.value,L:Math.pow(a.scale(this.value,-1,1,1,0),2),R:Math.pow(a.scale(this.value,-1,1,0,1),2)}),this.render()}},normalized:{get:function(){return this._value.normalized}}}),e}();t.exports=c},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(5),a=i(4),h=i(6),u=function(t,e){this.x=t.x,this.y=t.y,this.envelope=e,this.element=a.create("circle"),this.element.setAttribute("fill",this.envelope.colors.accent),this.envelope.element.appendChild(this.element),this.resize=function(){var t=2+~~(Math.min(this.envelope.width,this.envelope.height)/50);this.element.setAttribute("r",t)},this.move=function(t,e){if(this.x=t||0===t?t:this.x,this.y=e||0===e?e:this.y,this.envelope.nodes.indexOf(this)>=0){var i=this.envelope.nodes.indexOf(this)-1,n=this.envelope.nodes.indexOf(this)+1,s=this.envelope.nodes[i],r=this.envelope.nodes[n],o=i>=0?s.x:0,a=n<this.envelope.nodes.length?r.x:1;this.x<o&&(this.x=o),this.x>a&&(this.x=a)}this.location=this.getCoordinates(),this.element.setAttribute("cx",this.location.x),this.element.setAttribute("cy",this.location.y)},this.getCoordinates=function(){return{x:this.x*this.envelope.width,y:(1-this.y)*this.envelope.height}},this.move(this.x,this.y,!0),this.resize(),this.destroy=function(){this.envelope.element.removeChild(this.element),this.envelope.nodes.splice(this.envelope.nodes.indexOf(this),1)}},l=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["value"],{size:[300,150],points:[{x:.1,y:.4},{x:.35,y:.6},{x:.65,y:.2},{x:.9,y:.4}]}),this.points=this.settings.points,this.nodes=[],this.selected=!1,this.init()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,h),n(e,{buildInterface:{value:function(){var t=this;this.points.forEach(function(e){var i=new u(e,t);t.nodes.push(i)}),this.sortPoints(),this.line=a.create("polyline"),this.line.setAttribute("stroke-width",2),this.line.setAttribute("fill","none"),this.element.appendChild(this.line),this.fill=a.create("polyline"),this.fill.setAttribute("fill-opacity","0.2"),this.element.appendChild(this.fill)}},sizeInterface:{value:function(){for(var t=0;t<this.nodes.length;t++)this.nodes[t].resize(),this.nodes[t].move();this.render()}},colorInterface:{value:function(){var t=this;this.element.style.backgroundColor=this.colors.fill,this.line.setAttribute("stroke",this.colors.accent),this.fill.setAttribute("fill",this.colors.accent),this.nodes.forEach(function(e){e.element.setAttribute("fill",t.colors.accent)})}},render:{value:function(){this.calculatePath()}},calculatePoints:{value:function(){var t=this;this.points=[],this.nodes.forEach(function(e){t.points.push({x:e.x,y:e.y})})}},calculatePath:{value:function(){var t="0 "+this.nodes[0].location.y+", ";this.nodes.forEach(function(e){t+=e.location.x+" "+e.location.y+", "}),t+=this.width+" "+this.nodes[this.nodes.length-1].location.y,this.line.setAttribute("points",t),t+=", "+this.width+" "+this.height+", ",t+="0 "+this.height,this.fill.setAttribute("points",t)}},click:{value:function(){this.hasMoved=!1,this.selected=this.findNearestNode(),this.nodes[this.selected].move(this.mouse.x/this.width,1-this.mouse.y/this.height),this.scaleNode(this.selected),this.calculatePoints(),this.emit("change",this.points),this.render()}},move:{value:function(){this.clicked&&(this.mouse.x=o.clip(this.mouse.x,0,this.width),this.hasMoved=!0,this.nodes[this.selected].move(this.mouse.x/this.width,1-this.mouse.y/this.height),this.scaleNode(this.selected),this.calculatePoints(),this.emit("change",this.points),this.render())}},release:{value:function(){this.hasMoved||this.nodes[this.selected].destroy(),this.calculatePoints(),this.emit("change",this.points),this.render(),this.selected=null}},findNearestNode:{value:function(){for(var t=null,e=1e4,i=this.mouse.x/this.width,n=1-this.mouse.y/this.height,s=this.nodes,r=0;r<s.length;r++){var o=Math.sqrt(Math.pow(s[r].x-i,2)+Math.pow(s[r].y-n,2));o<e&&(e=o,t=r,i>s[r].x)}return e>.07&&(t=this.getIndexFromX(this.mouse.x/this.width),this.nodes.splice(t,0,new u({x:this.mouse.x/this.width,y:1-this.mouse.y/this.height},this)),this.hasMoved=!0),t}},getIndexFromX:{value:function(t){var e=this,i=0;return this.nodes.forEach(function(n,s){e.nodes[s].x<=t&&(i=s+1)}),i}},scaleNode:{value:function(t){var e=o.clip(this.nodes[t].x,0,1),i=o.clip(this.nodes[t].y,0,1);this.nodes[t].move(e,i)}},sortPoints:{value:function(){this.nodes.sort(function(t,e){return t.x>e.x})}},addPoint:{value:function(t,e){var i=this.nodes.length;this.sortPoints();for(var n=0;n<this.nodes.length;n++)if(t<this.nodes[n].x){i=n;break}this.nodes.splice(i,0,new u({x:t,y:e},this)),this.scaleNode(i),this.calculatePoints(),this.emit("change",this.points),this.render()}},scan:{value:function(t){var e=this.getIndexFromX(t),i=e-1;i<0&&(i=0),e>=this.nodes.length&&(e=this.nodes.length-1);var n=this.nodes[i],s=this.nodes[e],r=o.scale(t,n.x,s.x,0,1),a=o.interp(r,n.y,s.y);return this.emit("scan",a),a}},movePoint:{value:function(t,e,i){this.nodes[t].move(e,i),this.scaleNode(t),this.calculatePoints(),this.emit("change",this.points),this.render()}},adjustPoint:{value:function(t,e,i){this.nodes[t].move(this.nodes[t].x+e,this.nodes[t].y+i),this.scaleNode(t),this.calculatePoints(),this.emit("change",this.points),this.render()}},destroyPoint:{value:function(t){this.nodes[t].destroy(),this.calculatePoints(),this.emit("change",this.points),this.render()}},setPoints:{value:function(t){for(var e=this;this.nodes.length;)this.nodes[0].destroy();t.forEach(function(t){e.addPoint(t.x,t.y)}),this.calculatePoints(),this.emit("change",this.points),this.render()}}}),e}();t.exports=l},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(7),a=i(6),h=i(1).context,u=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["scale","value"],{size:[300,150]}),this.context=h(),this.analyser=this.context.createAnalyser(),this.analyser.fftSize=2048,this.bufferLength=this.analyser.frequencyBinCount,this.dataArray=new Uint8Array(this.bufferLength),this.active=!0,this.source=!1,this.init()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,a),n(e,{buildFrame:{value:function(){this.canvas=new o.SmartCanvas(this.parent),this.element=this.canvas.element}},sizeInterface:{value:function(){this.canvas.resize(this.width,this.height)}},colorInterface:{value:function(){this.canvas.element.style.backgroundColor=this.colors.fill}},render:{value:function(){if(this.active&&requestAnimationFrame(this.render.bind(this)),this.analyser.getByteFrequencyData(this.dataArray),this.canvas.context.fillStyle=this.colors.fill,this.canvas.context.fillRect(0,0,this.canvas.element.width,this.canvas.element.height),this.source&&this.dataArray)for(var t=this.canvas.element.width/this.bufferLength,e=void 0,i=0,n=this.canvas.element.width/50,s=0;s<this.bufferLength;s+=n)e=Math.max.apply(null,this.dataArray.subarray(s,s+n)),e/=255,e*=this.canvas.element.height,this.canvas.context.fillStyle=this.colors.accent,this.canvas.context.fillRect(i,this.canvas.element.height-e,t*n,e),i+=t*n}},connect:{value:function(t){this.source&&this.disconnect(),this.source=t,this.source.connect(this.analyser),this.render()}},disconnect:{value:function(){this.source.disconnect(this.analyser),this.source=null}},click:{value:function(){this.active=!this.active,this.render()}},customDestroy:{value:function(){this.active=!1}}}),e}();t.exports=u},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(7),a=i(5),h=i(6),u=i(1).context,l=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["scale","value"],{size:[30,100]}),this.context=u(),this.channels=2,this.splitter=this.context.createChannelSplitter(this.channels),this.analysers=[];for(var t=0;t<this.channels;t++){var i=this.context.createAnalyser();this.splitter.connect(i,t),i.fftSize=1024,i.smoothingTimeConstant=1,this.analysers.push(i)}this.bufferLength=this.analysers[0].frequencyBinCount,this.dataArray=new Float32Array(this.bufferLength),this.active=!0,this.db=-1/0,this.init(),this.meterWidth=this.canvas.element.width/this.channels,this.render()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,h),n(e,{buildFrame:{value:function(){this.canvas=new o.SmartCanvas(this.parent),this.element=this.canvas.element}},sizeInterface:{value:function(){this.canvas.resize(this.width,this.height)}},colorInterface:{value:function(){this.canvas.element.style.backgroundColor=this.colors.fill}},render:{value:function(){this.active&&requestAnimationFrame(this.render.bind(this)),this.canvas.context.fillStyle=this.colors.fill,this.canvas.context.fillRect(0,0,this.canvas.element.width,this.canvas.element.height);for(var t=0;t<this.analysers.length;t++){if(this.source){this.analysers[t].getFloatTimeDomainData(this.dataArray);for(var e=0,i=0;i<this.dataArray.length;i++)e+=this.dataArray[i]*this.dataArray[i];e=Math.sqrt(e/this.dataArray.length),this.db=20*Math.log10(e)}else this.db>-200&&this.db!==-1/0?this.db-=1:this.db=-1/0;if(this.db>-70){var n=a.normalize(this.db,-70,5),s=n*n,r=a.scale(s,0,1,this.element.height,0);this.canvas.context.fillStyle=this.colors.accent,this.canvas.context.fillRect(this.meterWidth*t,r,this.meterWidth,this.canvas.element.height-r)}}}},connect:{value:function(t,e){this.source&&this.disconnect(),e?this.channels=e:t.channelCount?this.channels=t.channelCount:this.channels=2,this.meterWidth=this.canvas.element.width/this.channels,this.source=t,this.source.connect(this.splitter)}},disconnect:{value:function(){this.source.disconnect(this.splitter),this.source=!1,this.meterWidth=this.canvas.element.width/this.channels}},click:{value:function(){this.active=!this.active,this.render()}},customDestroy:{value:function(){this.active=!1}}}),e}();t.exports=l},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function t(e,i,n){var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var r=Object.getPrototypeOf(e);return null===r?void 0:t(r,i,n)}if("value"in s&&s.writable)return s.value;var o=s.get;return void 0!==o?o.call(n):void 0},r=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},o=i(7),a=i(6),h=i(1).context,u=function(t){function e(){r(this,e);s(Object.getPrototypeOf(e.prototype),"constructor",this).call(this,arguments,["scale","value"],{size:[300,150]}),this.context=h(),this.analyser=this.context.createAnalyser(),this.analyser.fftSize=2048,this.bufferLength=this.analyser.frequencyBinCount,this.dataArray=new Uint8Array(this.bufferLength),this.analyser.getByteTimeDomainData(this.dataArray),this.active=!0,this.source=!1,this.init(),this.render()}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(t.__proto__=e)}(e,a),n(e,{buildFrame:{value:function(){this.canvas=new o.SmartCanvas(this.parent),this.element=this.canvas.element}},sizeInterface:{value:function(){this.canvas.resize(this.width,this.height)}},colorInterface:{value:function(){this.canvas.element.style.backgroundColor=this.colors.fill}},render:{value:function(){if(this.active&&requestAnimationFrame(this.render.bind(this)),this.analyser.getByteTimeDomainData(this.dataArray),this.canvas.context.fillStyle=this.colors.fill,this.canvas.context.fillRect(0,0,this.canvas.element.width,this.canvas.element.height),this.canvas.context.lineWidth=~~(this.height/100+2),this.canvas.context.strokeStyle=this.colors.accent,this.canvas.context.beginPath(),this.source)for(var t=1*this.canvas.element.width/this.bufferLength,e=0,i=0;i<this.bufferLength;i++){var n=this.dataArray[i]/128*this.canvas.element.height/2;0===i?this.canvas.context.moveTo(e,n):this.canvas.context.lineTo(e,n),e+=t}else this.canvas.context.moveTo(0,this.canvas.element.height/2),this.canvas.context.lineTo(this.canvas.element.width,this.canvas.element.height/2);this.canvas.context.stroke()}},connect:{value:function(t){this.source&&this.disconnect(),this.source=t,this.source.connect(this.analyser),this.render()}},disconnect:{value:function(){this.source&&(this.source.disconnect(this.analyser),this.source=null)}},click:{value:function(){this.active=!this.active,this.render()}},customDestroy:{value:function(){this.active=!1}}}),e}();t.exports=u},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},r=function(t){return t&&t.__esModule?t:{default:t}}(i(39)),o=function(t){return t&&t.__esModule?t.default:t}(i(7)),a=i(1).colors,h=function(){function t(e,i){s(this,t),this.meta={},this.meta.target=e,this.meta.parent=o.parseElement(e),this.meta.colors={},i?(this.meta.attribute=i.attribute||"nexus-ui",this.meta.title=i.name||!1,this.meta.open=i.open||!1):(this.meta.attribute="nexus-ui",this.meta.title=!1,this.meta.open=!1);var n=a();this.meta.colors.accent=n.accent,this.meta.colors.fill=n.fill,this.meta.colors.light=n.light,this.meta.colors.dark=n.dark,this.meta.colors.mediumLight=n.mediumLight,this.meta.colors.mediumDark=n.mediumDark,this.buildInterface(),this.colorInterface()}return n(t,{buildInterface:{value:function(){var t=this;for(this.meta.parent.style.boxSizing="border-box",this.meta.parent.style.userSelect="none",this.meta.parent.style.mozUserSelect="none",this.meta.parent.style.webkitUserSelect="none",this.meta.contents=document.createElement("div");this.meta.parent.childNodes.length>0;)this.meta.contents.appendChild(this.meta.parent.childNodes[0]);this.meta.contents.style.padding="0px",this.meta.contents.style.boxSizing="border-box",this.meta.title&&(this.meta.titleBar=document.createElement("div"),this.meta.titleBar.innerHTML=this.meta.title,this.meta.titleBar.style.fontFamily="arial",this.meta.titleBar.style.position="relative",this.meta.titleBar.style.color="#888",this.meta.titleBar.style.padding="7px",this.meta.titleBar.style.fontSize="12px",this.meta.button=document.createElement("div"),this.meta.button.style.position="absolute",this.meta.button.style.top="5px",this.meta.button.style.right="5px",this.meta.button.innerHTML="-",this.meta.button.style.padding="0px 5px 2px",this.meta.button.style.lineHeight="12px",this.meta.button.style.fontSize="15px",this.meta.button.style.cursor="pointer",this.meta.button.addEventListener("mouseover",function(){t.meta.button.style.backgroundColor=t.meta.colors.mediumDark}),this.meta.button.addEventListener("mouseleave",function(){t.meta.button.style.backgroundColor=t.meta.colors.mediumLight}),this.meta.button.addEventListener("click",function(){t.meta.open?t.hide():t.show()}),this.meta.titleBar.appendChild(this.meta.button),this.meta.parent.appendChild(this.meta.titleBar)),this.meta.parent.appendChild(this.meta.contents);var e=r.section(this.meta.target,this.meta.attribute);for(var i in e)this[i]=e[i]}},colorInterface:{value:function(){this.meta.title&&(this.meta.button.style.backgroundColor=this.meta.colors.mediumLight,this.meta.button.style.border="solid 0px "+this.meta.colors.fill,this.meta.parent.style.border="solid 1px "+this.meta.colors.mediumLight,this.meta.parent.style.backgroundColor=this.meta.colors.light,this.meta.titleBar.style.backgroundColor=this.meta.colors.fill)}},show:{value:function(){this.meta.contents.style.display="block",this.meta.open=!0}},hide:{value:function(){this.meta.contents.style.display="none",this.meta.open=!1}},colorize:{value:function(t,e){for(var i in this)this[i].colorize&&this[i].colorize(t,e);this.meta.colors[t]=e,this.colorInterface()}},empty:{value:function(){for(var t in this)this[t].destroy&&this[t].destroy()}}}),t}();t.exports=h},function(t,e,i){"use strict";var n=function(t){return t&&t.__esModule?t.default:t};Object.defineProperty(e,"__esModule",{value:!0});var s=n(i(7)),r=n(i(2)),o=function(t,e){var i=t.type;return e[i]?e[i]++:e[i]=1,i+e[i]},a=function(t,e,i){i=i||{};for(var n=0;n<t.attributes.length;n++){var s=t.attributes[n];i[s.nodeName]=s.nodeValue}e=e[0].toUpperCase()+e.slice(1);var o=new r[e](t,i);return o.id=t.id,o};e.element=a,e.section=function(t,e){e=e||"nexus-ui";for(var i={},n={},h=s.parseElement(t).getElementsByTagName("*"),u=[],l=0;l<h.length;l++)u.push(h[l]);for(l=0;l<u.length;l++){var c=u[l].getAttribute(e);if(c){var p=!1;for(var f in r)c.toLowerCase()===f.toLowerCase()&&(p=f);console.log(p);var d=a(u[l],p);d.id?n[d.id]=d:n[o(d,i)]=d}}return n},e.add=function(t,e,i){var n=document.createElement("div");return i=i||{},(e=e?s.parseElement(e):document.body).appendChild(n),i.target=n,i.size&&(n.style.width=i.size[0]+"px",n.style.height=i.size[1]+"px"),a(n,t,i)}},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},r=function(t){return t&&t.__esModule?t.default:t}(i(5)),o=function(){function t(){s(this,t),this.scale=[],this.mode={output:"frequency",input:"step"},this.etmajor=[261.62558,293.664764,329.627563,349.228241,391.995422,440,493.883301,523.25116],this.root=r.mtof(60),this.createScale(0,2,4,5,7,9,11)}return n(t,{note:{value:function(t,e){return"frequency"===this.mode.output?this.frequency(t,e):"ratio"===this.mode.output?this.ratio(t,e):"MIDI"===this.mode.output?this.MIDI(t,e):this.frequency(t,e)}},frequency:{value:function(t,e){"midi"!==this.mode.input&&"MIDI"!==this.mode.input||(this.stepIn+=60);var i=Math.floor(t/this.scale.length);e&&(i+=e);for(var n=t%this.scale.length;n<0;)n+=this.scale.length;var s=this.scale[n],r=this.root*s;return r*=Math.pow(2,i),r=Math.floor(1e11*r)/1e11}},ratio:{value:function(t,e){"midi"!==this.mode.input&&"MIDI"!==this.mode.input||(this.stepIn+=60);var i=Math.floor(t/this.scale.length);e&&(i+=e);var n=t%this.scale.length,s=Math.pow(2,i)*this.scale[n];return s=Math.floor(1e11*s)/1e11,s}},MIDI:{value:function(t,e){var i=this.frequency(t,e),n=69+12*Math.log(i/440)/Math.log(2);return n=Math.floor(1e9*n)/1e9}},createScale:{value:function(){for(var t=[],e=0;e<arguments.length;e++)t.push(r.mtof(60+arguments[e]));this.loadScaleFromFrequencies(t)}},createJIScale:{value:function(){this.scale=[];for(var t=0;t<arguments.length;t++)this.scale.push(arguments[t])}},loadScaleFromFrequencies:{value:function(t){this.scale=[];for(var e=0;e<t.length-1;e++)this.scale.push(t[e]/t[0])}},loadScale:{value:function(t){var e=this.scales[t].frequencies;this.loadScaleFromFrequencies(e)}},search:{value:function(t){var e=[];for(var i in this.scales)-1!==i.toLowerCase().indexOf(t.toLowerCase())&&e.push(i);return e}},chord:{value:function(t){for(var e=[],i=0;i<t.length;i++)e.push(this.note(t[i]));return e}}}),t}();t.exports=o},function(t,e){"use strict";var i=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),n=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},s=function(){function t(){for(var e=arguments.length,i=Array(e>1?e-1:0),s=1;s<e;s++)i[s-1]=arguments[s];var r=void 0===arguments[0]?3:arguments[0];n(this,t),r<0&&(r=1),this.length=r,this.onVals=i,this.array=new Array(r).fill(0),i.length>0&&this.on.apply(this,i)}return i(t,{select:{value:function(t){return this.array.fill(0),this.array[t]=1,this.array}},flip:{value:function(){for(var t=arguments.length,e=Array(t),i=0;i<t;i++)e[i]=arguments[i];var n=this.array;return e.length>0?e.forEach(function(t){t>n.length-1?console.warn("Warning: AnonRadio["+t+"] does not exist"):n[t]=n[t]?0:1}):n.forEach(function(t,e,i){i[e]=t?0:1}),n}},on:{value:function(){for(var t=arguments.length,e=Array(t),i=0;i<t;i++)e[i]=arguments[i];var n=this.array;return e.length>0?e.forEach(function(t){t>n.length-1?console.warn("Warning: AnonRadio["+t+"] exceeds size of object"):(1===n[t]&&console.warn("Warning: AnonRadio["+t+"] was already on."),n[t]=1)}):n.fill(1),n}},off:{value:function(){for(var t=arguments.length,e=Array(t),i=0;i<t;i++)e[i]=arguments[i];var n=this.array;return e.length>0?e.forEach(function(t){n[t]=0}):n.fill(0),n}}}),t}();t.exports=s},function(t,e,i){var n=i(43);t.exports=n,"undefined"!=typeof window&&(window.WAAClock=n)},function(t,e,i){(function(e){var i=.1,n=.001,s=function(t,e,i){this.clock=t,this.func=i,this._cleared=!1,this.toleranceLate=t.toleranceLate,this.toleranceEarly=t.toleranceEarly,this._latestTime=null,this._earliestTime=null,this.deadline=null,this.repeatTime=null,this.schedule(e)};s.prototype.clear=function(){return this.clock._removeEvent(this),this._cleared=!0,this},s.prototype.repeat=function(t){if(0===t)throw new Error("delay cannot be 0");return this.repeatTime=t,this.clock._hasEvent(this)||this.schedule(this.deadline+this.repeatTime),this},s.prototype.tolerance=function(t){return"number"==typeof t.late&&(this.toleranceLate=t.late),"number"==typeof t.early&&(this.toleranceEarly=t.early),this._refreshEarlyLateDates(),this.clock._hasEvent(this)&&(this.clock._removeEvent(this),this.clock._insertEvent(this)),this},s.prototype.isRepeated=function(){return null!==this.repeatTime},s.prototype.schedule=function(t){this._cleared=!1,this.deadline=t,this._refreshEarlyLateDates(),this.clock.context.currentTime>=this._earliestTime?this._execute():this.clock._hasEvent(this)?(this.clock._removeEvent(this),this.clock._insertEvent(this)):this.clock._insertEvent(this)},s.prototype.timeStretch=function(t,e){this.isRepeated()&&(this.repeatTime=this.repeatTime*e);var i=t+e*(this.deadline-t);if(this.isRepeated())for(;this.clock.context.currentTime>=i-this.toleranceEarly;)i+=this.repeatTime;this.schedule(i)},s.prototype._execute=function(){!1!==this.clock._started&&(this.clock._removeEvent(this),this.clock.context.currentTime<this._latestTime?this.func(this):(this.onexpired&&this.onexpired(this),console.warn("event expired")),this.clock._hasEvent(this)||!this.isRepeated()||this._cleared||this.schedule(this.deadline+this.repeatTime))},s.prototype._refreshEarlyLateDates=function(){this._latestTime=this.deadline+this.toleranceLate,this._earliestTime=this.deadline-this.toleranceEarly};var r=t.exports=function(t,e){e=e||{},this.tickMethod=e.tickMethod||"ScriptProcessorNode",this.toleranceEarly=e.toleranceEarly||n,this.toleranceLate=e.toleranceLate||i,this.context=t,this._events=[],this._started=!1};r.prototype.setTimeout=function(t,e){return this._createEvent(t,this._absTime(e))},r.prototype.callbackAtTime=function(t,e){return this._createEvent(t,e)},r.prototype.timeStretch=function(t,e,i){return e.forEach(function(e){e.timeStretch(t,i)}),e},r.prototype.start=function(){if(!1===this._started){var t=this;if(this._started=!0,this._events=[],"ScriptProcessorNode"===this.tickMethod){this._clockNode=this.context.createScriptProcessor(256,1,1),this._clockNode.connect(this.context.destination),this._clockNode.onaudioprocess=function(){e.nextTick(function(){t._tick()})}}else if("manual"!==this.tickMethod)throw new Error("invalid tickMethod "+this.tickMethod)}},r.prototype.stop=function(){!0===this._started&&(this._started=!1,this._clockNode.disconnect())},r.prototype._tick=function(){for(var t=this._events.shift();t&&t._earliestTime<=this.context.currentTime;)t._execute(),t=this._events.shift();t&&this._events.unshift(t)},r.prototype._createEvent=function(t,e){return new s(this,e,t)},r.prototype._insertEvent=function(t){this._events.splice(this._indexByTime(t._earliestTime),0,t)},r.prototype._removeEvent=function(t){var e=this._events.indexOf(t);-1!==e&&this._events.splice(e,1)},r.prototype._hasEvent=function(t){return-1!==this._events.indexOf(t)},r.prototype._indexByTime=function(t){for(var e,i=0,n=this._events.length;i<n;)e=Math.floor((i+n)/2),this._events[e]._earliestTime<t?i=e+1:n=e;return i},r.prototype._absTime=function(t){return t+this.context.currentTime},r.prototype._relTime=function(t){return t-this.context.currentTime}}).call(e,i(44))},function(t,e){var i,n,s=t.exports={};function r(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function a(t){if(i===setTimeout)return setTimeout(t,0);if((i===r||!i)&&setTimeout)return i=setTimeout,setTimeout(t,0);try{return i(t,0)}catch(e){try{return i.call(null,t,0)}catch(e){return i.call(this,t,0)}}}!function(){try{i="function"==typeof setTimeout?setTimeout:r}catch(t){i=r}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(t){n=o}}();var h,u=[],l=!1,c=-1;function p(){l&&h&&(l=!1,h.length?u=h.concat(u):c=-1,u.length&&f())}function f(){if(!l){var t=a(p);l=!0;for(var e=u.length;e;){for(h=u,u=[];++c<e;)h&&h[c].run();c=-1,e=u.length}h=null,l=!1,function(t){if(n===clearTimeout)return clearTimeout(t);if((n===o||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(t);try{n(t)}catch(e){try{return n.call(null,t)}catch(e){return n.call(this,t)}}}(t)}}function d(t,e){this.fun=t,this.array=e}function y(){}s.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)e[i-1]=arguments[i];u.push(new d(t,e)),1!==u.length||l||a(f)},d.prototype.run=function(){this.fun.apply(null,this.array)},s.title="browser",s.browser=!0,s.env={},s.argv=[],s.version="",s.versions={},s.on=y,s.addListener=y,s.once=y,s.off=y,s.removeListener=y,s.removeAllListeners=y,s.emit=y,s.prependListener=y,s.prependOnceListener=y,s.listeners=function(t){return[]},s.binding=function(t){throw new Error("process.binding is not supported")},s.cwd=function(){return"/"},s.chdir=function(t){throw new Error("process.chdir is not supported")},s.umask=function(){return 0}},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i in e){var n=e[i];n.configurable=!0,n.value&&(n.writable=!0)}Object.defineProperties(t,e)}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),s=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},r=i(1).clock,o=function(){function t(e,i,n){s(this,t),this.rate=e,this.on=n,this.clock=r(),this.pattern=[1],this.index=0,this.event=i||function(){},this.on&&this.start()}return n(t,{_event:{value:function(t){this.event(t),this.index++}},stop:{value:function(){this.on=!1,this.interval.clear()}},start:{value:function(){this.on=!0,this.interval=this.clock.callbackAtTime(this._event.bind(this),this.clock.context.currentTime).repeat(this.rate/1e3).tolerance({early:.1,late:1})}},ms:{value:function(t){if(this.on){var e=t/this.rate;this.rate=t,this.clock.timeStretch(this.clock.context.currentTime,[this.interval],e)}else this.rate=t}}}),t}();t.exports=o}])})},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=function(t){return t&&t.__esModule?t:{default:t}}(i(98));var s=[{intervals:"1/1 9/8 5/4 4/3 3/2 5/3 15/8 2/1",name:"harmonic scale"},{root:450,intervals:"1/1 9/8 5/4 4/3 3/2 5/3 15/8 2/1",name:"harmonic scale @ 450"},{tet:5},{tet:12},{tet:17},{intervals:"1/1 81/80 33/32 21/20 16/15 12/11 11/10 10/9 9/8 8/7 7/6 32/27 6/5 11/9 5/4 14/11 9/7 21/16 4/3 27/20 11/8 7/5 10/7 16/11 40/27 3/2 32/21 14/9 11/7 8/5 18/11 5/3 27/16 12/7 7/4 16/9 9/5 20/11 11/6 15/8 40/21 64/33 160/81 2/1",name:"harry partch scale"},{scl:"! young-lm_piano.scl\n!\nLaMonte Young's Well-Tempered Piano\n12\n!\n567/512\n9/8\n147/128\n21/16\n1323/1024\n189/128\n3/2\n49/32\n7/4\n441/256\n63/32\n2/1\n"},{scl:"! meanquar.scl\n!\n1/4-comma meantone scale. Pietro Aaron's temperament (1523)\n 12\n!\n 76.04900\n 193.15686\n 310.26471\n 5/4\n 503.42157\n 579.47057\n 696.57843\n 25/16\n 889.73529\n 1006.84314\n 1082.89214\n 2/1\n"},{scl:"! mavila12.scl\n!\nA 12-note mavila scale (for warping meantone-based music), 5-limit TOP\n 12\n!\n-30.99719\n 163.50770\n 358.01258\n 327.01540\n 521.52028\n 490.52310\n 685.02798\n 654.03080\n 848.53568\n 1043.04057\n 1012.04338\n 1206.54826\n"},{scl:"! carlos_alpha.scl\n!\nWendy Carlos' Alpha scale with perfect fifth divided in nine\n 18\n!\n 78.00000\n 156.00000\n 234.00000\n 312.00000\n 390.00000\n 468.00000\n 546.00000\n 624.00000\n 702.00000\n 780.00000\n 858.00000\n 936.00000\n 1014.00000\n 1092.00000\n 1170.00000\n 1248.00000\n 1326.00000\n 1404.00000\n"},{scl:"! colundi.scl\n!\nColundi scale\n10\n!\n9/8\n171/140\n137/112\n43/35\n3/2\n421/280\n213/140\n263/150\n66/35\n2/1\n"},{scl:"! shares.scl\n!\nA scale based on shares of wealth\n!\n1.\n5.\n15.\n32.\n52.\n78.\n116.\n182.\n521.\n1000.\n"},{scl:"! shares_sum.scl\n!\nA scale based on summing shares of wealth\n!\n1\n6.0\n21.0\n53.0\n105.0\n183.0\n299.0\n481.0\n1002.0\n2/1\n"},{scl:'! liu_major.scl\n!\nLinus Liu\'s Major Scale, see his 1978 book, "Intonation Theory" \n 7\n!\n 10/9\n 100/81\n 4/3\n 3/2\n 5/3\n 50/27\n 2/1\n'},{scl:"! LIU_MINor.scl\n!\nLinus Liu's Harmonic Minor \n 7\n!\n 10/9\n 6/5\n 4/3\n 40/27\n 8/5\n 50/27\n 2/1\n"},{scl:"! liu_mel.scl\n!\nLinus Liu's Melodic Minor, use 5 and 7 descending and 6 and 8 ascending \n 9\n!\n 10/9\n 6/5\n 4/3\n 3/2\n 81/50\n 5/3\n 9/5\n 50/27\n 2/1\n"},{scl:'! liu_pent.scl\n!\nLinus Liu\'s "pentatonic scale" \n 7\n!\n 9/8\n 81/64\n 27/20\n 3/2\n 27/16\n 243/128\n 81/40\n'}].map(function(t){return new n.default(t)}),r=s[0],o=function(){};function a(t){r&&r.heading&&r.heading.classList.remove("selected"),(r=s[t]).heading&&r.heading.classList.add("selected"),o(r)}e.default={scales:s,current:function(){return r},build:function(){s.forEach(function(t,e){t.heading=document.createElement("div"),t.heading.innerHTML=t.name,t.heading.classList.add("heading"),t.heading.addEventListener("click",function(){a(e)}),scale_list.appendChild(t.heading)}),a(0)},build_options:function(t){s.forEach(function(e,i){var n=document.createElement("option");n.innerHTML=e.name,n.value=i,t.appendChild(n)}),t.addEventListener("input",function(t){a(t.target.value)}),a(0)},pick:a,names:function(){return s.map(function(t){return t.name})},onChange:function(t){o=t}}},function(t,e,i){t.exports={default:i(99),__esModule:!0}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=function(t){return t&&t.__esModule?t:{default:t}}(i(29));i(44);var s=2,r=0,o=new n.default.Compressor(-30,3).toMaster(),a=[{root:226,fn:"samples/380737__cabled-mess__sansula-01-a-raw.mp3"},{root:267,fn:"samples/380736__cabled-mess__sansula-02-c-raw.mp3"},{root:340,fn:"samples/380735__cabled-mess__sansula-03-e-raw.mp3"},{root:452,fn:"samples/380733__cabled-mess__sansula-06-a-02-raw.mp3"}];a.forEach(function(t){t.players=[],t.index=-1;for(var e=0;e<s;e++){var i=t.fn;window.location.href.match(/asdf.us/)&&(i="//asdf.us/kalimba/"+i);var r=new n.default.Player({url:i,retrigger:!0,playbackRate:1});r.connect(o),t.players.push(r)}}),e.default={play:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i={sample:a[r]};r=(r+1)%a.length,i.sample.index=(i.sample.index+1)%s;var n=i.sample.players[i.sample.index];n.playbackRate=t/i.sample.root,n.volume.value=e,setTimeout(function(){n.start()},0)}}},function(t,e,i){var n=i(58),s=i(40).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return n(t,s)}},function(t,e){},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.nx=void 0;var n=s(i(125));e.update_value_on_change=function(t,e,i,n){var s=document.querySelector(e+" + .val"),r=function(t){s.innerHTML=i?parseInt(t):t.toFixed(2),n&&n(t)};t.on("change",r),r(t.value),t.update=r},e.update_radio_value_on_change=function(t,e,i,n){var s=t.active,r=document.querySelector(e+" + .val"),o=function(e){-1===e?e=t.active=s:s=e,r.innerHTML=i[e][1],n&&n(e)};t.on("change",o),o(t.active),t.update=o},e.build_options=function(t,e,i){(0,n.default)(e).forEach(function(i){var n=e[i],s=document.createElement("option");s.innerHTML=n.name,s.value=i,t.appendChild(s)}),t.addEventListener("input",function(t){i(t.target.value)})};s(i(63));function s(t){return t&&t.__esModule?t:{default:t}}e.nx=window.nx={}},function(t,e){var i={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==i.call(t)}},function(t,e,i){var n,s,r,o=i(19),a=i(141),h=i(59),u=i(34),l=i(2),c=l.process,p=l.setImmediate,f=l.clearImmediate,d=l.MessageChannel,y=0,m={},v=function(){var t=+this;if(m.hasOwnProperty(t)){var e=m[t];delete m[t],e()}},_=function(t){v.call(t.data)};p&&f||(p=function(t){for(var e=[],i=1;arguments.length>i;)e.push(arguments[i++]);return m[++y]=function(){a("function"==typeof t?t:Function(t),e)},n(y),y},f=function(t){delete m[t]},"process"==i(18)(c)?n=function(t){c.nextTick(o(v,t,1))}:d?(r=(s=new d).port2,s.port1.onmessage=_,n=o(r.postMessage,r,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(n=function(t){l.postMessage(t+"","*")},l.addEventListener("message",_,!1)):n="onreadystatechange"in u("script")?function(t){h.appendChild(u("script")).onreadystatechange=function(){h.removeChild(this),v.call(t)}}:function(t){setTimeout(o(v,t,1),0)}),t.exports={set:p,clear:f}},function(t,e,i){(function(t){var n=void 0!==t&&t||"undefined"!=typeof self&&self||window,s=Function.prototype.apply;function r(t,e){this._id=t,this._clearFn=e}e.setTimeout=function(){return new r(s.call(setTimeout,n,arguments),clearTimeout)},e.setInterval=function(){return new r(s.call(setInterval,n,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(n,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},i(146),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(e,i(17))},function(t,e,i){"use strict";(function(e){t.exports=v;var n,s=i(49),r=i(70);v.ReadableState=m;i(47).EventEmitter;var o=function(t,e){return t.listeners(e).length},a=i(74),h=i(5).Buffer,u=i(31),l=i(23);l.inherits=i(12);var c=i(148),p=void 0;p=c&&c.debuglog?c.debuglog("stream"):function(){};var f,d=i(149);l.inherits(v,a);var y=["error","close","destroy","pause","resume"];function m(t,e){n=n||i(13),t=t||{},this.objectMode=!!t.objectMode,e instanceof n&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var s=t.highWaterMark,r=this.objectMode?16:16384;this.highWaterMark=s||0===s?s:r,this.highWaterMark=~~this.highWaterMark,this.buffer=new d,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(f||(f=i(51).StringDecoder),this.decoder=new f(t.encoding),this.encoding=t.encoding)}function v(t){if(n=n||i(13),!(this instanceof v))return new v(t);this._readableState=new m(t,this),this.readable=!0,t&&"function"==typeof t.read&&(this._read=t.read),a.call(this)}function _(t,e,i,n,r){var o=function(t,e){var i=null;h.isBuffer(e)||"string"==typeof e||null===e||void 0===e||t.objectMode||(i=new TypeError("Invalid non-string/buffer chunk"));return i}(e,i);if(o)t.emit("error",o);else if(null===i)e.reading=!1,function(t,e){if(e.ended)return;if(e.decoder){var i=e.decoder.end();i&&i.length&&(e.buffer.push(i),e.length+=e.objectMode?1:i.length)}e.ended=!0,w(t)}(t,e);else if(e.objectMode||i&&i.length>0)if(e.ended&&!r){var a=new Error("stream.push() after EOF");t.emit("error",a)}else if(e.endEmitted&&r){var u=new Error("stream.unshift() after end event");t.emit("error",u)}else{var l;!e.decoder||r||n||(i=e.decoder.write(i),l=!e.objectMode&&0===i.length),r||(e.reading=!1),l||(e.flowing&&0===e.length&&!e.sync?(t.emit("data",i),t.read(0)):(e.length+=e.objectMode?1:i.length,r?e.buffer.unshift(i):e.buffer.push(i),e.needReadable&&w(t))),function(t,e){e.readingMore||(e.readingMore=!0,s(T,t,e))}(t,e)}else r||(e.reading=!1);return function(t){return!t.ended&&(t.needReadable||t.length<t.highWaterMark||0===t.length)}(e)}v.prototype.push=function(t,e){var i=this._readableState;return i.objectMode||"string"!=typeof t||(e=e||i.defaultEncoding)!==i.encoding&&(t=u.from(t,e),e=""),_(this,i,t,e,!1)},v.prototype.unshift=function(t){return _(this,this._readableState,t,"",!0)},v.prototype.isPaused=function(){return!1===this._readableState.flowing},v.prototype.setEncoding=function(t){return f||(f=i(51).StringDecoder),this._readableState.decoder=new f(t),this._readableState.encoding=t,this};var g=8388608;function b(t,e){return t<=0||0===e.length&&e.ended?0:e.objectMode?1:t!=t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=function(t){return t>=g?t=g:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function w(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(p("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?s(S,t):S(t))}function S(t){p("emit readable"),t.emit("readable"),E(t)}function T(t,e){for(var i=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length<e.highWaterMark&&(p("maybeReadMore read 0"),t.read(0),i!==e.length);)i=e.length;e.readingMore=!1}function x(t){p("readable nexttick read 0"),t.read(0)}function A(t,e){e.reading||(p("resume read 0"),t.read(0)),e.resumeScheduled=!1,e.awaitDrain=0,t.emit("resume"),E(t),e.flowing&&!e.reading&&t.read(0)}function E(t){var e=t._readableState;for(p("flow",e.flowing);e.flowing&&null!==t.read(););}function k(t,e){return 0===e.length?null:(e.objectMode?i=e.buffer.shift():!t||t>=e.length?(i=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):i=function(t,e,i){var n;t<e.head.data.length?(n=e.head.data.slice(0,t),e.head.data=e.head.data.slice(t)):n=t===e.head.data.length?e.shift():i?function(t,e){var i=e.head,n=1,s=i.data;t-=s.length;for(;i=i.next;){var r=i.data,o=t>r.length?r.length:t;if(o===r.length?s+=r:s+=r.slice(0,t),0===(t-=o)){o===r.length?(++n,i.next?e.head=i.next:e.head=e.tail=null):(e.head=i,i.data=r.slice(o));break}++n}return e.length-=n,s}(t,e):function(t,e){var i=u.allocUnsafe(t),n=e.head,s=1;n.data.copy(i),t-=n.data.length;for(;n=n.next;){var r=n.data,o=t>r.length?r.length:t;if(r.copy(i,i.length-t,0,o),0===(t-=o)){o===r.length?(++s,n.next?e.head=n.next:e.head=e.tail=null):(e.head=n,n.data=r.slice(o));break}++s}return e.length-=s,i}(t,e);return n}(t,e.buffer,e.decoder),i);var i}function O(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,s(M,e,t))}function M(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function P(t,e){for(var i=0,n=t.length;i<n;i++)if(t[i]===e)return i;return-1}v.prototype.read=function(t){p("read",t),t=parseInt(t,10);var e=this._readableState,i=t;if(0!==t&&(e.emittedReadable=!1),0===t&&e.needReadable&&(e.length>=e.highWaterMark||e.ended))return p("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?O(this):w(this),null;if(0===(t=b(t,e))&&e.ended)return 0===e.length&&O(this),null;var n,s=e.needReadable;return p("need readable",s),(0===e.length||e.length-t<e.highWaterMark)&&p("length less than watermark",s=!0),e.ended||e.reading?p("reading or ended",s=!1):s&&(p("do read"),e.reading=!0,e.sync=!0,0===e.length&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(t=b(i,e))),null===(n=t>0?k(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),i!==t&&e.ended&&O(this)),null!==n&&this.emit("data",n),n},v.prototype._read=function(t){this.emit("error",new Error("_read() is not implemented"))},v.prototype.pipe=function(t,i){var n=this,a=this._readableState;switch(a.pipesCount){case 0:a.pipes=t;break;case 1:a.pipes=[a.pipes,t];break;default:a.pipes.push(t)}a.pipesCount+=1,p("pipe count=%d opts=%j",a.pipesCount,i);var h=(!i||!1!==i.end)&&t!==e.stdout&&t!==e.stderr?l:d;function u(t){p("onunpipe"),t===n&&d()}function l(){p("onend"),t.end()}a.endEmitted?s(h):n.once("end",h),t.on("unpipe",u);var c=function(t){return function(){var e=t._readableState;p("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&o(t,"data")&&(e.flowing=!0,E(t))}}(n);t.on("drain",c);var f=!1;function d(){p("cleanup"),t.removeListener("close",_),t.removeListener("finish",g),t.removeListener("drain",c),t.removeListener("error",v),t.removeListener("unpipe",u),n.removeListener("end",l),n.removeListener("end",d),n.removeListener("data",m),f=!0,!a.awaitDrain||t._writableState&&!t._writableState.needDrain||c()}var y=!1;function m(e){p("ondata"),y=!1,!1!==t.write(e)||y||((1===a.pipesCount&&a.pipes===t||a.pipesCount>1&&-1!==P(a.pipes,t))&&!f&&(p("false write response, pause",n._readableState.awaitDrain),n._readableState.awaitDrain++,y=!0),n.pause())}function v(e){p("onerror",e),b(),t.removeListener("error",v),0===o(t,"error")&&t.emit("error",e)}function _(){t.removeListener("finish",g),b()}function g(){p("onfinish"),t.removeListener("close",_),b()}function b(){p("unpipe"),n.unpipe(t)}return n.on("data",m),function(t,e,i){if("function"==typeof t.prependListener)return t.prependListener(e,i);t._events&&t._events[e]?r(t._events[e])?t._events[e].unshift(i):t._events[e]=[i,t._events[e]]:t.on(e,i)}(t,"error",v),t.once("close",_),t.once("finish",g),t.emit("pipe",n),a.flowing||(p("pipe resume"),n.resume()),t},v.prototype.unpipe=function(t){var e=this._readableState;if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this),this);if(!t){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s<n;s++)i[s].emit("unpipe",this);return this}var r=P(e.pipes,t);return-1===r?this:(e.pipes.splice(r,1),e.pipesCount-=1,1===e.pipesCount&&(e.pipes=e.pipes[0]),t.emit("unpipe",this),this)},v.prototype.on=function(t,e){var i=a.prototype.on.call(this,t,e);if("data"===t)!1!==this._readableState.flowing&&this.resume();else if("readable"===t){var n=this._readableState;n.endEmitted||n.readableListening||(n.readableListening=n.needReadable=!0,n.emittedReadable=!1,n.reading?n.length&&w(this):s(x,this))}return i},v.prototype.addListener=v.prototype.on,v.prototype.resume=function(){var t=this._readableState;return t.flowing||(p("resume"),t.flowing=!0,function(t,e){e.resumeScheduled||(e.resumeScheduled=!0,s(A,t,e))}(this,t)),this},v.prototype.pause=function(){return p("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(p("pause"),this._readableState.flowing=!1,this.emit("pause")),this},v.prototype.wrap=function(t){var e=this._readableState,i=!1,n=this;for(var s in t.on("end",function(){if(p("wrapped end"),e.decoder&&!e.ended){var t=e.decoder.end();t&&t.length&&n.push(t)}n.push(null)}),t.on("data",function(s){(p("wrapped data"),e.decoder&&(s=e.decoder.write(s)),!e.objectMode||null!==s&&void 0!==s)&&((e.objectMode||s&&s.length)&&(n.push(s)||(i=!0,t.pause())))}),t)void 0===this[s]&&"function"==typeof t[s]&&(this[s]=function(e){return function(){return t[e].apply(t,arguments)}}(s));for(var r=0;r<y.length;r++)t.on(y[r],n.emit.bind(n,y[r]));return n._read=function(e){p("wrapped _read",e),i&&(i=!1,t.resume())},n},v._fromList=k}).call(e,i(11))},function(t,e,i){t.exports=i(47).EventEmitter},function(t,e,i){"use strict";t.exports=o;var n=i(13),s=i(23);function r(t){this.afterTransform=function(e,i){return function(t,e,i){var n=t._transformState;n.transforming=!1;var s=n.writecb;if(!s)return t.emit("error",new Error("no writecb in Transform class"));n.writechunk=null,n.writecb=null,null!==i&&void 0!==i&&t.push(i);s(e);var r=t._readableState;r.reading=!1,(r.needReadable||r.length<r.highWaterMark)&&t._read(r.highWaterMark)}(t,e,i)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function o(t){if(!(this instanceof o))return new o(t);n.call(this,t),this._transformState=new r(this);var e=this;this._readableState.needReadable=!0,this._readableState.sync=!1,t&&("function"==typeof t.transform&&(this._transform=t.transform),"function"==typeof t.flush&&(this._flush=t.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(t,i){a(e,t,i)}):a(e)})}function a(t,e,i){if(e)return t.emit("error",e);null!==i&&void 0!==i&&t.push(i);var n=t._writableState,s=t._transformState;if(n.length)throw new Error("Calling transform done when ws.length != 0");if(s.transforming)throw new Error("Calling transform done when still transforming");return t.push(null)}s.inherits=i(12),s.inherits(o,n),o.prototype.push=function(t,e){return this._transformState.needTransform=!1,n.prototype.push.call(this,t,e)},o.prototype._transform=function(t,e,i){throw new Error("_transform() is not implemented")},o.prototype._write=function(t,e,i){var n=this._transformState;if(n.writecb=i,n.writechunk=t,n.writeencoding=e,!n.transforming){var s=this._readableState;(n.needTransform||s.needReadable||s.length<s.highWaterMark)&&this._read(s.highWaterMark)}},o.prototype._read=function(t){var e=this._transformState;null!==e.writechunk&&e.writecb&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0}},function(t,e,i){"use strict";var n=d(i(52)),s=d(i(92)),r=d(i(29)),o=d(i(63)),a=d(i(97)),h=d(i(64)),u=d(i(66)),l=i(120),c=i(44),p=i(69),f=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e.default=t,e}(i(134));function d(t){return t&&t.__esModule?t:{default:t}}var y=60,m=null,v=!1;(0,l.midi_init)();var _=["date","timestamp","fatalities","injured","total_victims","age","case","weapon_type","weapon_details"].reduce(function(t,e,i){return t[e]=i,t},{}),g=0,b=0,w={},S={},T={},x=[],A=l.play_sequence;f.load().then(function(t){console.log(t),(0,c.transpose)(t.gun_violence_by_month.lines).forEach(function(e,i){var n=t.gun_violence_by_month.h[i];"Date"!==n&&(console.log(n,e),w[n]={name:n,h:[n],lines:[e.map(function(t){return parseInt(t)})],play_fn:l.play_sequence})}),w["Mass Shootings"]=t.mass_shootings_from_columbine,w["Mass Shootings"].name="Mass Shootings",w["Mass Shootings"].play_fn=k;var e=w["Mass Shootings"].lines.reverse(),i=e[0][_.date].split("/"),r=(0,s.default)(i),o=r[0];r.slice(1);w["Mass Shootings"].dates=e.map(function(t){var e=t[_.date].split("/"),i=(0,n.default)(e,3),s=i[0],r=i[1];i[2];return 12*(parseInt(s)-parseInt(o))+parseInt(r)}),w["Mass Shootings"].data=e,w["Mass Shootings"].lines=[e.map(function(t){return t[_.total_victims]})],(0,c.requestAudioContext)(P)});var E=0;function k(t,e,i,n){var s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"all",r=arguments[5],o=e.rows,a=e.min,h=e.max,f=t%o[0].length,d=(o[0][f],S.dates.length),y=[],m=[],v=[],g=void 0;for(console.log(t,b,S.dates[b]);t>=S.dates[b]&&b<d;)y.push(S.lines[0][b]),v.push(S.data[b][_.date]+" "+S.data[b][_.case]+", "+S.data[b][_.fatalities]+" dead, "+S.data[b][_.injured]+" injured"),console.log("push case",S.data[b][_.date]+" "+S.data[b][_.case]),b+=1;switch(y.length){default:case 0:E+=1;break;case 1:m.push((0,l.play_note)((0,c.norm)(y[0],a,h)*p.nx.multiply.value,128,s,r,E,0)),g=[128];break;case 2:m.push((0,l.play_note)((0,c.norm)(y[0],a,h)*p.nx.multiply.value,64,s,r,E,0)),m.push((0,l.play_note)((0,c.norm)(y[1],a,h)*p.nx.multiply.value,64,s,r,0,64)),g=[64,64];break;case 3:m.push((0,l.play_note)((0,c.norm)(y[0],a,h)*p.nx.multiply.value,43,s,r,E,0)),m.push((0,l.play_note)((0,c.norm)(y[1],a,h)*p.nx.multiply.value,43,s,r,0,43)),m.push((0,l.play_note)((0,c.norm)(y[2],a,h)*p.nx.multiply.value,42,s,r,0,85)),g=[43,43,42];break;case 4:m.push((0,l.play_note)((0,c.norm)(y[0],a,h)*p.nx.multiply.value,32,s,r,E,0)),m.push((0,l.play_note)((0,c.norm)(y[1],a,h)*p.nx.multiply.value,32,s,r,0,32)),m.push((0,l.play_note)((0,c.norm)(y[2],a,h)*p.nx.multiply.value,32,s,r,0,64)),m.push((0,l.play_note)((0,c.norm)(y[3],a,h)*p.nx.multiply.value,32,s,r,0,96)),g=[32,32,32,32]}return v.length&&(document.querySelector("#cases").innerHTML=v.join("<br>")),d<=b?(E=0,b=0,t=0):t+=1,u.default.play(220,-12),y.length?[t,m,g,E=0]:(E+=128,[t,[],[],0])}function O(){var t=12e4/r.default.Transport.bpm.value*l.note_values[p.nx.timing.active][0];setTimeout(O,t);var e=A(g,T,x,t),i=(0,n.default)(e,3),s=i[0],o=i[1];i[2];if(g=s,v){var a=l.note_values[p.nx.timing.active][2];a.length&&(a=a[g%a.length]),m.addEvent(new l.MidiWriter.NoteEvent({pitch:o,duration:"t"+a}))}}function M(t){console.log("pick dataset:",t,w[t]),g=0,b=0,E=0,S=w[t],T=(0,c.get_bounds)(S),x=(0,c.get_diff_bounds)(T.rows),A=S.play_fn}function P(){h.default.build_options(document.querySelector("#scale")),(0,p.build_options)(document.querySelector("#dataset"),w,M);var t=[50,50];r.default.Transport.bpm.value=y,p.nx.tempo=new o.default.Dial("#tempo",{size:t,min:10,max:300,step:1,value:y}),(0,p.update_value_on_change)(p.nx.tempo,"#tempo",!0,function(t){return r.default.Transport.bpm.value=t}),p.nx.timing=new o.default.RadioButton("#timing",{size:[400,25],numberOfButtons:l.note_values.length,active:6}),(0,p.update_radio_value_on_change)(p.nx.timing,"#timing",l.note_values),p.nx.duration=new o.default.Dial("#duration",{size:t,min:0,max:2,step:.01,value:.8}),(0,p.update_value_on_change)(p.nx.duration,"#duration",!1),p.nx.offset=new o.default.Dial("#offset",{size:t,min:-24,max:24,step:1,value:-5}),(0,p.update_value_on_change)(p.nx.offset,"#offset",!0),p.nx.octave=new o.default.Dial("#octave",{size:t,min:-4,max:4,step:1,value:0}),(0,p.update_value_on_change)(p.nx.octave,"#octave",!0),p.nx.multiply=new o.default.Dial("#multiply",{size:t,min:-64,max:64,step:1,value:19}),(0,p.update_value_on_change)(p.nx.multiply,"#multiply",!0),p.nx.interval=new o.default.Dial("#interval",{size:t,min:-64,max:64,step:1,value:10}),(0,p.update_value_on_change)(p.nx.interval,"#interval",!0),document.querySelector("#export_midi").addEventListener("click",function(){(0,l.export_pattern_as_midi)(S.name,T,x,p.nx.tempo.value,p.nx.timing.active,A)});var e=document.querySelector("#record_midi");e.addEventListener("click",function(){if(v){e.innerHTML="Record MIDI",document.body.classList.remove("recording"),v=!1;var t=new l.MidiWriter.Writer([m]),i=(0,c.dataURItoBlob)(t.dataUri());saveAs(i,"Recording - "+S.name+".mid")}else e.innerHTML="Save Recording",document.body.classList.add("recording"),v=!0,(m=new l.MidiWriter.Track).setTempo(p.nx.tempo.value)}),document.querySelector(".loading").classList.remove("loading"),document.querySelector("#dataset").value="Mass Shootings",M("Mass Shootings"),document.querySelector("#scale").value="14",h.default.pick(14),O()}a.default.listen(function(t){p.nx.offset.value=t,p.nx.offset.update(t)})},function(t,e,i){t.exports={default:i(78),__esModule:!0}},function(t,e,i){i(24),i(22),t.exports=i(88)},function(t,e,i){"use strict";var n=i(80),s=i(81),r=i(14),o=i(6);t.exports=i(54)(Array,"Array",function(t,e){this._t=o(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,i=this._i++;return!t||i>=t.length?(this._t=void 0,s(1)):s(0,"keys"==e?i:"values"==e?t[i]:[i,t[i]])},"values"),r.Arguments=r.Array,n("keys"),n("values"),n("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,i){"use strict";var n=i(57),s=i(21),r=i(27),o={};i(8)(o,i(1)("iterator"),function(){return this}),t.exports=function(t,e,i){t.prototype=n(o,{next:s(1,i)}),r(t,e+" Iterator")}},function(t,e,i){var n=i(3),s=i(4),r=i(16);t.exports=i(9)?Object.defineProperties:function(t,e){s(t);for(var i,o=r(e),a=o.length,h=0;a>h;)n.f(t,i=o[h++],e[i]);return t}},function(t,e,i){var n=i(6),s=i(36),r=i(85);t.exports=function(t){return function(e,i,o){var a,h=n(e),u=s(h.length),l=r(o,u);if(t&&i!=i){for(;u>l;)if((a=h[l++])!=a)return!0}else for(;u>l;l++)if((t||l in h)&&h[l]===i)return t||l||0;return!t&&-1}}},function(t,e,i){var n=i(37),s=Math.max,r=Math.min;t.exports=function(t,e){return(t=n(t))<0?s(t+e,0):r(t,e)}},function(t,e,i){var n=i(10),s=i(28),r=i(38)("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=s(t),n(t,r)?t[r]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?o:null}},function(t,e,i){var n=i(37),s=i(32);t.exports=function(t){return function(e,i){var r,o,a=String(s(e)),h=n(i),u=a.length;return h<0||h>=u?t?"":void 0:(r=a.charCodeAt(h))<55296||r>56319||h+1===u||(o=a.charCodeAt(h+1))<56320||o>57343?t?a.charAt(h):r:t?a.slice(h,h+2):o-56320+(r-55296<<10)+65536}}},function(t,e,i){var n=i(41),s=i(1)("iterator"),r=i(14);t.exports=i(0).isIterable=function(t){var e=Object(t);return void 0!==e[s]||"@@iterator"in e||r.hasOwnProperty(n(e))}},function(t,e,i){t.exports={default:i(90),__esModule:!0}},function(t,e,i){i(24),i(22),t.exports=i(91)},function(t,e,i){var n=i(4),s=i(42);t.exports=i(0).getIterator=function(t){var e=s(t);if("function"!=typeof e)throw TypeError(t+" is not iterable!");return n(e.call(t))}},function(t,e,i){"use strict";e.__esModule=!0;var n=function(t){return t&&t.__esModule?t:{default:t}}(i(93));e.default=function(t){return Array.isArray(t)?t:(0,n.default)(t)}},function(t,e,i){t.exports={default:i(94),__esModule:!0}},function(t,e,i){i(22),i(95),t.exports=i(0).Array.from},function(t,e,i){"use strict";var n=i(19),s=i(7),r=i(28),o=i(60),a=i(61),h=i(36),u=i(96),l=i(42);s(s.S+s.F*!i(62)(function(t){Array.from(t)}),"Array",{from:function(t){var e,i,s,c,p=r(t),f="function"==typeof this?this:Array,d=arguments.length,y=d>1?arguments[1]:void 0,m=void 0!==y,v=0,_=l(p);if(m&&(y=n(y,d>2?arguments[2]:void 0,2)),void 0==_||f==Array&&a(_))for(i=new f(e=h(p.length));e>v;v++)u(i,v,m?y(p[v],v):p[v]);else for(c=_.call(p),i=new f;!(s=c.next()).done;v++)u(i,v,m?o(c,y,[s.value,v],!0):s.value);return i.length=v,i}})},function(t,e,i){"use strict";var n=i(3),s=i(21);t.exports=function(t,e,i){e in t?n.f(t,e,s(0,i)):t[e]=i}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n={},s={},r="zxcvbnmasdfghjklqwertyuiop",o=function(){};r.toUpperCase().split("").map(function(t,e){n[t.charCodeAt(0)]=e}),"1234567890".split("").map(function(t,e){n[t.charCodeAt(0)]=e+r.length,s[t.charCodeAt(0)]=!0}),window.addEventListener("keydown",function(t){if(t.altKey||t.ctrlKey||t.metaKey)return void t.stopPropagation();if(document.activeElement instanceof HTMLInputElement&&t.keyCode in s)return void t.stopPropagation();if(!(t.keyCode in n))return;var e=n[t.keyCode];t.shiftKey&&(e+=r.length);o(e-=7)},!0),e.default={listen:function(t){o=t}}},function(t,e,i){"use strict";var n=function(t){return t&&t.__esModule?t:{default:t}}(i(65));t.exports=function(){var t=function(t){t=this.opt=(0,n.default)({name:"",root:440,octave:0,interval:2,tet:0,intervals:null},t||{}),this.generate()};t.prototype.generate=function(t){(t=(0,n.default)(this.opt,t||{})).scl?this.generate_scl():t.tet?this.generate_tet():t.intervals&&this.generate_intervals()},t.prototype.generate_intervals=function(){this.opt.root;var t=this.opt.intervals;"string"==typeof t&&(t=t.split(" ")),this.name=this.opt.name||"interval list",this.intervals=t,this.interval=this.opt.interval=e.call(this,t.pop()),this.scale=t.map(i.bind(this)).filter(function(t){return!!t})},t.prototype.generate_tet=function(){var t=this.scale=[],e=this.opt.root,i=this.opt.tet,n=this.interval=this.opt.interval,s=Math.pow(n,1/i),r=e;t.push(r);for(var o=0;o<i-1;o++)r*=s,t.push(r);this.name=this.opt.name||i+"-tone equal temperament",this.intervals=null},t.prototype.generate_scl=function(){var t=this.opt.root,e=this.parse_scl(this.opt.scl);this.intervals=e.notes,this.interval=e.notes.pop(),this.name=this.opt.name||e.description,this.scale=e.notes.map(function(e){return e*t})},t.prototype.parse_scl=function(t){var i={comments:[],notes:[]};return t.trim().split("\n").forEach(function(t){if(-1!==t.indexOf("!"))i.comments.push(t);else if("description"in i)if(i.notes.length){var n=t.replace(/^[^-\.0-9]+/,"").replace(/[^-\/\.0-9]+$/,"");(n=-1!==n.indexOf(".")?Math.pow(2,parseFloat(n)/1200):e(n))&&i.notes.push(n)}else i.notes.push(1);else i.description=t}),i},t.prototype.index=function(t,e){e=e||this.opt.octave;var i=this.scale[0|s(t,this.scale.length)],n=Math.floor(function(t,e,i){return(t-e)/(i-e)}(t,0,this.scale.length))+e;return i*=Math.pow(this.interval,n)},t.prototype.range=function(t,e){for(var i=[],n=t;n<e;n++)i.push(this.index(n));return i},t.prototype.set_root=function(t){this.opt.root=t,this.generate()},t.prototype.quantize_frequency=function(t){if(0==t)return 0;for(var e=t,i=0,n=this.interval,s=this.scale;e<root;)e*=n,i-=1;for(;e>root*n;)e/=n,i+=1;for(var r=0;r<s.length;r++)if(!(e>s[r])){e=s[r];break}return e*=Math.pow(2,i)},t.prototype.quantize_index=function(t){return 0|s(index-1,this.scale.length)};var e=t.prototype.parse_interval=function(t){if("number"==typeof t)return t;if(-1==!t.indexOf("/"))return parseInt(t);var e=t.split("/"),i=parseInt(e[0]),n=parseInt(e[1]);return isNaN(i)?1:isNaN(n)||0==n?i:i==n?1:i/n},i=t.prototype.parse_interval_string=function(t){return-1!==t.indexOf("/")?e(t)*this.opt.root:(t.indexOf("f"),parseFloat(t))};function s(t,e){return t-e*Math.floor(t/e)}return t}()},function(t,e,i){i(100),t.exports=i(0).Object.assign},function(t,e,i){var n=i(7);n(n.S+n.F,"Object",{assign:i(101)})},function(t,e,i){"use strict";var n=i(16),s=i(43),r=i(30),o=i(28),a=i(53),h=Object.assign;t.exports=!h||i(15)(function(){var t={},e={},i=Symbol(),n="abcdefghijklmnopqrst";return t[i]=7,n.split("").forEach(function(t){e[t]=t}),7!=h({},t)[i]||Object.keys(h({},e)).join("")!=n})?function(t,e){for(var i=o(t),h=arguments.length,u=1,l=s.f,c=r.f;h>u;)for(var p,f=a(arguments[u++]),d=l?n(f).concat(l(f)):n(f),y=d.length,m=0;y>m;)c.call(f,p=d[m++])&&(i[p]=f[p]);return i}:h},function(t,e,i){t.exports={default:i(103),__esModule:!0}},function(t,e,i){i(104),t.exports=i(0).Math.log2},function(t,e,i){var n=i(7);n(n.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},function(t,e,i){"use strict";var n,s,r;!function(t){t&&t.__esModule} /** * StartAudioContext.js * @author Yotam Mann * @license http://opensource.org/licenses/MIT MIT License * @copyright 2016 Yotam Mann - */ -(function (root, factory) { - if (true) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else if ((typeof module === "undefined" ? "undefined" : (0, _typeof3.default)(module)) === 'object' && module.exports) { - module.exports = factory(); - } else { - root.StartAudioContext = factory(); - } -})(undefined, function () { - - /** - * The StartAudioContext object - */ - var StartAudioContext = { - /** - * The audio context passed in by the user - * @type {AudioContext} - */ - context: null, - /** - * The TapListeners bound to the elements - * @type {Array} - * @private - */ - _tapListeners: [], - /** - * Callbacks to invoke when the audio context is started - * @type {Array} - * @private - */ - _onStarted: [] - }; - - /** - * Set the context - * @param {AudioContext} ctx - * @returns {StartAudioContext} - */ - StartAudioContext.setContext = function (ctx) { - StartAudioContext.context = ctx; - return StartAudioContext; - }; - - /** - * Add a tap listener to the audio context - * @param {Array|Element|String|jQuery} element - * @returns {StartAudioContext} - */ - StartAudioContext.on = function (element) { - if (Array.isArray(element) || NodeList && element instanceof NodeList) { - for (var i = 0; i < element.length; i++) { - StartAudioContext.on(element[i]); - } - } else if (typeof element === "string") { - StartAudioContext.on(document.querySelectorAll(element)); - } else if (element.jquery && typeof element.toArray === "function") { - StartAudioContext.on(element.toArray()); - } else if (Element && element instanceof Element) { - //if it's an element, create a TapListener - var tap = new TapListener(element, onTap); - StartAudioContext._tapListeners.push(tap); - } - return StartAudioContext; - }; - - /** - * Bind a callback to when the audio context is started. - * @param {Function} cb - * @return {StartAudioContext} - */ - StartAudioContext.onStarted = function (cb) { - //if it's already started, invoke the callback - if (StartAudioContext.isStarted()) { - cb(); - } else { - StartAudioContext._onStarted.push(cb); - } - return StartAudioContext; - }; - - /** - * returns true if the context is started - * @return {Boolean} - */ - StartAudioContext.isStarted = function () { - return StartAudioContext.context !== null && StartAudioContext.context.state === "running"; - }; - - /** - * @class Listens for non-dragging tap ends on the given element - * @param {Element} element - * @internal - */ - var TapListener = function TapListener(element) { - - this._dragged = false; - - this._element = element; - - this._bindedMove = this._moved.bind(this); - this._bindedEnd = this._ended.bind(this); - - element.addEventListener("touchmove", this._bindedMove); - element.addEventListener("touchend", this._bindedEnd); - element.addEventListener("mouseup", this._bindedEnd); - }; - - /** - * drag move event - */ - TapListener.prototype._moved = function (e) { - this._dragged = true; - }; - - /** - * tap ended listener - */ - TapListener.prototype._ended = function (e) { - if (!this._dragged) { - onTap(); - } - this._dragged = false; - }; - - /** - * remove all the bound events - */ - TapListener.prototype.dispose = function () { - this._element.removeEventListener("touchmove", this._bindedMove); - this._element.removeEventListener("touchend", this._bindedEnd); - this._element.removeEventListener("mouseup", this._bindedEnd); - this._bindedMove = null; - this._bindedEnd = null; - this._element = null; - }; - - /** - * Invoked the first time of the elements is tapped. - * Creates a silent oscillator when a non-dragging touchend - * event has been triggered. - */ - function onTap() { - //start the audio context with a silent oscillator - if (StartAudioContext.context && !StartAudioContext.isStarted()) { - var osc = StartAudioContext.context.createOscillator(); - var silent = StartAudioContext.context.createGain(); - silent.gain.value = 0; - osc.connect(silent); - silent.connect(StartAudioContext.context.destination); - var now = StartAudioContext.context.currentTime; - osc.start(now); - osc.stop(now + 0.5); - } - - //dispose all the tap listeners - if (StartAudioContext._tapListeners) { - for (var i = 0; i < StartAudioContext._tapListeners.length; i++) { - StartAudioContext._tapListeners[i].dispose(); - } - StartAudioContext._tapListeners = null; - } - //the onstarted callbacks - if (StartAudioContext._onStarted) { - for (var j = 0; j < StartAudioContext._onStarted.length; j++) { - StartAudioContext._onStarted[j](); - } - StartAudioContext._onStarted = null; - } - } - - return StartAudioContext; -}); - -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(93), __esModule: true }; - -/***/ }), -/* 84 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(94), __esModule: true }; - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(95), __esModule: true }; - -/***/ }), -/* 86 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(96), __esModule: true }; - -/***/ }), -/* 87 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(98), __esModule: true }; - -/***/ }), -/* 88 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(99), __esModule: true }; - -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(100), __esModule: true }; - -/***/ }), -/* 90 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(101), __esModule: true }; - -/***/ }), -/* 91 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _iterator = __webpack_require__(90); - -var _iterator2 = _interopRequireDefault(_iterator); - -var _symbol = __webpack_require__(89); - -var _symbol2 = _interopRequireDefault(_symbol); - -var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; }; - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) { - return typeof obj === "undefined" ? "undefined" : _typeof(obj); -} : function (obj) { - return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj); -}; - -/***/ }), -/* 92 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.byteLength = byteLength -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array - -var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i -} - -revLookup['-'.charCodeAt(0)] = 62 -revLookup['_'.charCodeAt(0)] = 63 - -function placeHoldersCount (b64) { - var len = b64.length - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') - } - - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 -} - -function byteLength (b64) { - // base64 is 4/3 + up to two characters of the original data - return b64.length * 3 / 4 - placeHoldersCount(b64) -} - -function toByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - var len = b64.length - placeHolders = placeHoldersCount(b64) - - arr = new Arr(len * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] - arr[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF - } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output.push(tripletToBase64(tmp)) - } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var output = '' - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 - - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) - } - - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } - - parts.push(output) - - return parts.join('') -} - - -/***/ }), -/* 93 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(21); -__webpack_require__(128); -module.exports = __webpack_require__(0).Array.from; - -/***/ }), -/* 94 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(30); -__webpack_require__(21); -module.exports = __webpack_require__(126); - -/***/ }), -/* 95 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(30); -__webpack_require__(21); -module.exports = __webpack_require__(127); - -/***/ }), -/* 96 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(130); -module.exports = __webpack_require__(0).Math.log2; - -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(131); -module.exports = __webpack_require__(0).Object.assign; - -/***/ }), -/* 98 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(132); -module.exports = __webpack_require__(0).Object.keys; - -/***/ }), -/* 99 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(70); -__webpack_require__(21); -__webpack_require__(30); -__webpack_require__(133); -module.exports = __webpack_require__(0).Promise; - -/***/ }), -/* 100 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(134); -__webpack_require__(70); -__webpack_require__(135); -__webpack_require__(136); -module.exports = __webpack_require__(0).Symbol; - -/***/ }), -/* 101 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(21); -__webpack_require__(30); -module.exports = __webpack_require__(45).f('iterator'); - -/***/ }), -/* 102 */ -/***/ (function(module, exports) { - -module.exports = function(){ /* empty */ }; - -/***/ }), -/* 103 */ -/***/ (function(module, exports) { - -module.exports = function(it, Constructor, name, forbiddenField){ - if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){ - throw TypeError(name + ': incorrect invocation!'); - } return it; -}; - -/***/ }), -/* 104 */ -/***/ (function(module, exports, __webpack_require__) { - -// false -> Array#indexOf -// true -> Array#includes -var toIObject = __webpack_require__(10) - , toLength = __webpack_require__(42) - , toIndex = __webpack_require__(125); -module.exports = function(IS_INCLUDES){ - return function($this, el, fromIndex){ - var O = toIObject($this) - , length = toLength(O.length) - , index = toIndex(fromIndex, length) - , value; - // Array#includes uses SameValueZero equality algorithm - if(IS_INCLUDES && el != el)while(length > index){ - value = O[index++]; - if(value != value)return true; - // Array#toIndex ignores holes, Array#includes - not - } else for(;length > index; index++)if(IS_INCLUDES || index in O){ - if(O[index] === el)return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - -/***/ }), -/* 105 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $defineProperty = __webpack_require__(5) - , createDesc = __webpack_require__(20); - -module.exports = function(object, index, value){ - if(index in object)$defineProperty.f(object, index, createDesc(0, value)); - else object[index] = value; -}; - -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { - -// all enumerable object keys, includes symbols -var getKeys = __webpack_require__(15) - , gOPS = __webpack_require__(38) - , pIE = __webpack_require__(26); -module.exports = function(it){ - var result = getKeys(it) - , getSymbols = gOPS.f; - if(getSymbols){ - var symbols = getSymbols(it) - , isEnum = pIE.f - , i = 0 - , key; - while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key); - } return result; -}; - -/***/ }), -/* 107 */ -/***/ (function(module, exports, __webpack_require__) { - -var ctx = __webpack_require__(18) - , call = __webpack_require__(62) - , isArrayIter = __webpack_require__(61) - , anObject = __webpack_require__(4) - , toLength = __webpack_require__(42) - , getIterFn = __webpack_require__(46) - , BREAK = {} - , RETURN = {}; -var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){ - var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable) - , f = ctx(fn, that, entries ? 2 : 1) - , index = 0 - , length, step, iterator, result; - if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!'); - // fast case for arrays with default iterator - if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){ - result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); - if(result === BREAK || result === RETURN)return result; - } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){ - result = call(iterator, f, step.value, entries); - if(result === BREAK || result === RETURN)return result; - } -}; -exports.BREAK = BREAK; -exports.RETURN = RETURN; - -/***/ }), -/* 108 */ -/***/ (function(module, exports) { - -// fast apply, http://jsperf.lnkit.com/fast-apply/5 -module.exports = function(fn, args, that){ - var un = that === undefined; - switch(args.length){ - case 0: return un ? fn() - : fn.call(that); - case 1: return un ? fn(args[0]) - : fn.call(that, args[0]); - case 2: return un ? fn(args[0], args[1]) - : fn.call(that, args[0], args[1]); - case 3: return un ? fn(args[0], args[1], args[2]) - : fn.call(that, args[0], args[1], args[2]); - case 4: return un ? fn(args[0], args[1], args[2], args[3]) - : fn.call(that, args[0], args[1], args[2], args[3]); - } return fn.apply(that, args); -}; - -/***/ }), -/* 109 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.2.2 IsArray(argument) -var cof = __webpack_require__(17); -module.exports = Array.isArray || function isArray(arg){ - return cof(arg) == 'Array'; -}; - -/***/ }), -/* 110 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var create = __webpack_require__(65) - , descriptor = __webpack_require__(20) - , setToStringTag = __webpack_require__(27) - , IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -__webpack_require__(9)(IteratorPrototype, __webpack_require__(1)('iterator'), function(){ return this; }); - -module.exports = function(Constructor, NAME, next){ - Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)}); - setToStringTag(Constructor, NAME + ' Iterator'); -}; - -/***/ }), -/* 111 */ -/***/ (function(module, exports) { - -module.exports = function(done, value){ - return {value: value, done: !!done}; -}; - -/***/ }), -/* 112 */ -/***/ (function(module, exports, __webpack_require__) { - -var getKeys = __webpack_require__(15) - , toIObject = __webpack_require__(10); -module.exports = function(object, el){ - var O = toIObject(object) - , keys = getKeys(O) - , length = keys.length - , index = 0 - , key; - while(length > index)if(O[key = keys[index++]] === el)return key; -}; - -/***/ }), -/* 113 */ -/***/ (function(module, exports, __webpack_require__) { - -var META = __webpack_require__(29)('meta') - , isObject = __webpack_require__(19) - , has = __webpack_require__(8) - , setDesc = __webpack_require__(5).f - , id = 0; -var isExtensible = Object.isExtensible || function(){ - return true; -}; -var FREEZE = !__webpack_require__(13)(function(){ - return isExtensible(Object.preventExtensions({})); -}); -var setMeta = function(it){ - setDesc(it, META, {value: { - i: 'O' + ++id, // object ID - w: {} // weak collections IDs - }}); -}; -var fastKey = function(it, create){ - // return primitive with prefix - if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; - if(!has(it, META)){ - // can't set metadata to uncaught frozen object - if(!isExtensible(it))return 'F'; - // not necessary to add metadata - if(!create)return 'E'; - // add missing metadata - setMeta(it); - // return object ID - } return it[META].i; -}; -var getWeak = function(it, create){ - if(!has(it, META)){ - // can't set metadata to uncaught frozen object - if(!isExtensible(it))return true; - // not necessary to add metadata - if(!create)return false; - // add missing metadata - setMeta(it); - // return hash weak collections IDs - } return it[META].w; -}; -// add metadata on freeze-family methods calling -var onFreeze = function(it){ - if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it); - return it; -}; -var meta = module.exports = { - KEY: META, - NEED: false, - fastKey: fastKey, - getWeak: getWeak, - onFreeze: onFreeze -}; - -/***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(2) - , macrotask = __webpack_require__(69).set - , Observer = global.MutationObserver || global.WebKitMutationObserver - , process = global.process - , Promise = global.Promise - , isNode = __webpack_require__(17)(process) == 'process'; - -module.exports = function(){ - var head, last, notify; - - var flush = function(){ - var parent, fn; - if(isNode && (parent = process.domain))parent.exit(); - while(head){ - fn = head.fn; - head = head.next; - try { - fn(); - } catch(e){ - if(head)notify(); - else last = undefined; - throw e; - } - } last = undefined; - if(parent)parent.enter(); - }; - - // Node.js - if(isNode){ - notify = function(){ - process.nextTick(flush); - }; - // browsers with MutationObserver - } else if(Observer){ - var toggle = true - , node = document.createTextNode(''); - new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new - notify = function(){ - node.data = toggle = !toggle; - }; - // environments with maybe non-completely correct, but existent Promise - } else if(Promise && Promise.resolve){ - var promise = Promise.resolve(); - notify = function(){ - promise.then(flush); - }; - // for other environments - macrotask based on: - // - setImmediate - // - MessageChannel - // - window.postMessag - // - onreadystatechange - // - setTimeout - } else { - notify = function(){ - // strange IE + webpack dev server bug - use .call(global) - macrotask.call(global, flush); - }; - } - - return function(fn){ - var task = {fn: fn, next: undefined}; - if(last)last.next = task; - if(!head){ - head = task; - notify(); - } last = task; - }; -}; - -/***/ }), -/* 115 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// 19.1.2.1 Object.assign(target, source, ...) -var getKeys = __webpack_require__(15) - , gOPS = __webpack_require__(38) - , pIE = __webpack_require__(26) - , toObject = __webpack_require__(28) - , IObject = __webpack_require__(60) - , $assign = Object.assign; - -// should work with symbols and should have deterministic property order (V8 bug) -module.exports = !$assign || __webpack_require__(13)(function(){ - var A = {} - , B = {} - , S = Symbol() - , K = 'abcdefghijklmnopqrst'; - A[S] = 7; - K.split('').forEach(function(k){ B[k] = k; }); - return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; -}) ? function assign(target, source){ // eslint-disable-line no-unused-vars - var T = toObject(target) - , aLen = arguments.length - , index = 1 - , getSymbols = gOPS.f - , isEnum = pIE.f; - while(aLen > index){ - var S = IObject(arguments[index++]) - , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S) - , length = keys.length - , j = 0 - , key; - while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key]; - } return T; -} : $assign; - -/***/ }), -/* 116 */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(5) - , anObject = __webpack_require__(4) - , getKeys = __webpack_require__(15); - -module.exports = __webpack_require__(6) ? Object.defineProperties : function defineProperties(O, Properties){ - anObject(O); - var keys = getKeys(Properties) - , length = keys.length - , i = 0 - , P; - while(length > i)dP.f(O, P = keys[i++], Properties[P]); - return O; -}; - -/***/ }), -/* 117 */ -/***/ (function(module, exports, __webpack_require__) { - -var pIE = __webpack_require__(26) - , createDesc = __webpack_require__(20) - , toIObject = __webpack_require__(10) - , toPrimitive = __webpack_require__(43) - , has = __webpack_require__(8) - , IE8_DOM_DEFINE = __webpack_require__(59) - , gOPD = Object.getOwnPropertyDescriptor; - -exports.f = __webpack_require__(6) ? gOPD : function getOwnPropertyDescriptor(O, P){ - O = toIObject(O); - P = toPrimitive(P, true); - if(IE8_DOM_DEFINE)try { - return gOPD(O, P); - } catch(e){ /* empty */ } - if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]); -}; - -/***/ }), -/* 118 */ -/***/ (function(module, exports, __webpack_require__) { - -// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window -var toIObject = __webpack_require__(10) - , gOPN = __webpack_require__(66).f - , toString = {}.toString; - -var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames - ? Object.getOwnPropertyNames(window) : []; - -var getWindowNames = function(it){ - try { - return gOPN(it); - } catch(e){ - return windowNames.slice(); - } -}; - -module.exports.f = function getOwnPropertyNames(it){ - return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); -}; - - -/***/ }), -/* 119 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) -var has = __webpack_require__(8) - , toObject = __webpack_require__(28) - , IE_PROTO = __webpack_require__(39)('IE_PROTO') - , ObjectProto = Object.prototype; - -module.exports = Object.getPrototypeOf || function(O){ - O = toObject(O); - if(has(O, IE_PROTO))return O[IE_PROTO]; - if(typeof O.constructor == 'function' && O instanceof O.constructor){ - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; - -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { - -// most Object methods by ES6 should accept primitives -var $export = __webpack_require__(7) - , core = __webpack_require__(0) - , fails = __webpack_require__(13); -module.exports = function(KEY, exec){ - var fn = (core.Object || {})[KEY] || Object[KEY] - , exp = {}; - exp[KEY] = exec(fn); - $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp); -}; - -/***/ }), -/* 121 */ -/***/ (function(module, exports, __webpack_require__) { - -var hide = __webpack_require__(9); -module.exports = function(target, src, safe){ - for(var key in src){ - if(safe && target[key])target[key] = src[key]; - else hide(target, key, src[key]); - } return target; -}; - -/***/ }), -/* 122 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var global = __webpack_require__(2) - , core = __webpack_require__(0) - , dP = __webpack_require__(5) - , DESCRIPTORS = __webpack_require__(6) - , SPECIES = __webpack_require__(1)('species'); - -module.exports = function(KEY){ - var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY]; - if(DESCRIPTORS && C && !C[SPECIES])dP.f(C, SPECIES, { - configurable: true, - get: function(){ return this; } - }); -}; - -/***/ }), -/* 123 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.3.20 SpeciesConstructor(O, defaultConstructor) -var anObject = __webpack_require__(4) - , aFunction = __webpack_require__(33) - , SPECIES = __webpack_require__(1)('species'); -module.exports = function(O, D){ - var C = anObject(O).constructor, S; - return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); -}; - -/***/ }), -/* 124 */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(41) - , defined = __webpack_require__(35); -// true -> String#at -// false -> String#codePointAt -module.exports = function(TO_STRING){ - return function(that, pos){ - var s = String(defined(that)) - , i = toInteger(pos) - , l = s.length - , a, b; - if(i < 0 || i >= l)return TO_STRING ? '' : undefined; - a = s.charCodeAt(i); - return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff - ? TO_STRING ? s.charAt(i) : a - : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; - }; -}; - -/***/ }), -/* 125 */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(41) - , max = Math.max - , min = Math.min; -module.exports = function(index, length){ - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; - -/***/ }), -/* 126 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(4) - , get = __webpack_require__(46); -module.exports = __webpack_require__(0).getIterator = function(it){ - var iterFn = get(it); - if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!'); - return anObject(iterFn.call(it)); -}; - -/***/ }), -/* 127 */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(34) - , ITERATOR = __webpack_require__(1)('iterator') - , Iterators = __webpack_require__(14); -module.exports = __webpack_require__(0).isIterable = function(it){ - var O = Object(it); - return O[ITERATOR] !== undefined - || '@@iterator' in O - || Iterators.hasOwnProperty(classof(O)); -}; - -/***/ }), -/* 128 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var ctx = __webpack_require__(18) - , $export = __webpack_require__(7) - , toObject = __webpack_require__(28) - , call = __webpack_require__(62) - , isArrayIter = __webpack_require__(61) - , toLength = __webpack_require__(42) - , createProperty = __webpack_require__(105) - , getIterFn = __webpack_require__(46); - -$export($export.S + $export.F * !__webpack_require__(64)(function(iter){ Array.from(iter); }), 'Array', { - // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) - from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){ - var O = toObject(arrayLike) - , C = typeof this == 'function' ? this : Array - , aLen = arguments.length - , mapfn = aLen > 1 ? arguments[1] : undefined - , mapping = mapfn !== undefined - , index = 0 - , iterFn = getIterFn(O) - , length, result, step, iterator; - if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); - // if object isn't iterable or it's array with default iterator - use simple case - if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){ - for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){ - createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); - } - } else { - length = toLength(O.length); - for(result = new C(length); length > index; index++){ - createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); - } - } - result.length = index; - return result; - } -}); - - -/***/ }), -/* 129 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var addToUnscopables = __webpack_require__(102) - , step = __webpack_require__(111) - , Iterators = __webpack_require__(14) - , toIObject = __webpack_require__(10); - -// 22.1.3.4 Array.prototype.entries() -// 22.1.3.13 Array.prototype.keys() -// 22.1.3.29 Array.prototype.values() -// 22.1.3.30 Array.prototype[@@iterator]() -module.exports = __webpack_require__(63)(Array, 'Array', function(iterated, kind){ - this._t = toIObject(iterated); // target - this._i = 0; // next index - this._k = kind; // kind -// 22.1.5.2.1 %ArrayIteratorPrototype%.next() -}, function(){ - var O = this._t - , kind = this._k - , index = this._i++; - if(!O || index >= O.length){ - this._t = undefined; - return step(1); - } - if(kind == 'keys' )return step(0, index); - if(kind == 'values')return step(0, O[index]); - return step(0, [index, O[index]]); -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) -Iterators.Arguments = Iterators.Array; - -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - -/***/ }), -/* 130 */ -/***/ (function(module, exports, __webpack_require__) { - -// 20.2.2.22 Math.log2(x) -var $export = __webpack_require__(7); - -$export($export.S, 'Math', { - log2: function log2(x){ - return Math.log(x) / Math.LN2; - } -}); - -/***/ }), -/* 131 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.3.1 Object.assign(target, source) -var $export = __webpack_require__(7); - -$export($export.S + $export.F, 'Object', {assign: __webpack_require__(115)}); - -/***/ }), -/* 132 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 Object.keys(O) -var toObject = __webpack_require__(28) - , $keys = __webpack_require__(15); - -__webpack_require__(120)('keys', function(){ - return function keys(it){ - return $keys(toObject(it)); - }; -}); - -/***/ }), -/* 133 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var LIBRARY = __webpack_require__(25) - , global = __webpack_require__(2) - , ctx = __webpack_require__(18) - , classof = __webpack_require__(34) - , $export = __webpack_require__(7) - , isObject = __webpack_require__(19) - , aFunction = __webpack_require__(33) - , anInstance = __webpack_require__(103) - , forOf = __webpack_require__(107) - , speciesConstructor = __webpack_require__(123) - , task = __webpack_require__(69).set - , microtask = __webpack_require__(114)() - , PROMISE = 'Promise' - , TypeError = global.TypeError - , process = global.process - , $Promise = global[PROMISE] - , process = global.process - , isNode = classof(process) == 'process' - , empty = function(){ /* empty */ } - , Internal, GenericPromiseCapability, Wrapper; - -var USE_NATIVE = !!function(){ - try { - // correct subclassing with @@species support - var promise = $Promise.resolve(1) - , FakePromise = (promise.constructor = {})[__webpack_require__(1)('species')] = function(exec){ exec(empty, empty); }; - // unhandled rejections tracking support, NodeJS Promise without it fails @@species test - return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise; - } catch(e){ /* empty */ } -}(); - -// helpers -var sameConstructor = function(a, b){ - // with library wrapper special case - return a === b || a === $Promise && b === Wrapper; -}; -var isThenable = function(it){ - var then; - return isObject(it) && typeof (then = it.then) == 'function' ? then : false; -}; -var newPromiseCapability = function(C){ - return sameConstructor($Promise, C) - ? new PromiseCapability(C) - : new GenericPromiseCapability(C); -}; -var PromiseCapability = GenericPromiseCapability = function(C){ - var resolve, reject; - this.promise = new C(function($$resolve, $$reject){ - if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor'); - resolve = $$resolve; - reject = $$reject; - }); - this.resolve = aFunction(resolve); - this.reject = aFunction(reject); -}; -var perform = function(exec){ - try { - exec(); - } catch(e){ - return {error: e}; - } -}; -var notify = function(promise, isReject){ - if(promise._n)return; - promise._n = true; - var chain = promise._c; - microtask(function(){ - var value = promise._v - , ok = promise._s == 1 - , i = 0; - var run = function(reaction){ - var handler = ok ? reaction.ok : reaction.fail - , resolve = reaction.resolve - , reject = reaction.reject - , domain = reaction.domain - , result, then; - try { - if(handler){ - if(!ok){ - if(promise._h == 2)onHandleUnhandled(promise); - promise._h = 1; - } - if(handler === true)result = value; - else { - if(domain)domain.enter(); - result = handler(value); - if(domain)domain.exit(); - } - if(result === reaction.promise){ - reject(TypeError('Promise-chain cycle')); - } else if(then = isThenable(result)){ - then.call(result, resolve, reject); - } else resolve(result); - } else reject(value); - } catch(e){ - reject(e); - } - }; - while(chain.length > i)run(chain[i++]); // variable length - can't use forEach - promise._c = []; - promise._n = false; - if(isReject && !promise._h)onUnhandled(promise); - }); -}; -var onUnhandled = function(promise){ - task.call(global, function(){ - var value = promise._v - , abrupt, handler, console; - if(isUnhandled(promise)){ - abrupt = perform(function(){ - if(isNode){ - process.emit('unhandledRejection', value, promise); - } else if(handler = global.onunhandledrejection){ - handler({promise: promise, reason: value}); - } else if((console = global.console) && console.error){ - console.error('Unhandled promise rejection', value); - } - }); - // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should - promise._h = isNode || isUnhandled(promise) ? 2 : 1; - } promise._a = undefined; - if(abrupt)throw abrupt.error; - }); -}; -var isUnhandled = function(promise){ - if(promise._h == 1)return false; - var chain = promise._a || promise._c - , i = 0 - , reaction; - while(chain.length > i){ - reaction = chain[i++]; - if(reaction.fail || !isUnhandled(reaction.promise))return false; - } return true; -}; -var onHandleUnhandled = function(promise){ - task.call(global, function(){ - var handler; - if(isNode){ - process.emit('rejectionHandled', promise); - } else if(handler = global.onrejectionhandled){ - handler({promise: promise, reason: promise._v}); - } - }); -}; -var $reject = function(value){ - var promise = this; - if(promise._d)return; - promise._d = true; - promise = promise._w || promise; // unwrap - promise._v = value; - promise._s = 2; - if(!promise._a)promise._a = promise._c.slice(); - notify(promise, true); -}; -var $resolve = function(value){ - var promise = this - , then; - if(promise._d)return; - promise._d = true; - promise = promise._w || promise; // unwrap - try { - if(promise === value)throw TypeError("Promise can't be resolved itself"); - if(then = isThenable(value)){ - microtask(function(){ - var wrapper = {_w: promise, _d: false}; // wrap - try { - then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); - } catch(e){ - $reject.call(wrapper, e); - } - }); - } else { - promise._v = value; - promise._s = 1; - notify(promise, false); - } - } catch(e){ - $reject.call({_w: promise, _d: false}, e); // wrap - } -}; - -// constructor polyfill -if(!USE_NATIVE){ - // 25.4.3.1 Promise(executor) - $Promise = function Promise(executor){ - anInstance(this, $Promise, PROMISE, '_h'); - aFunction(executor); - Internal.call(this); - try { - executor(ctx($resolve, this, 1), ctx($reject, this, 1)); - } catch(err){ - $reject.call(this, err); - } - }; - Internal = function Promise(executor){ - this._c = []; // <- awaiting reactions - this._a = undefined; // <- checked in isUnhandled reactions - this._s = 0; // <- state - this._d = false; // <- done - this._v = undefined; // <- value - this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled - this._n = false; // <- notify - }; - Internal.prototype = __webpack_require__(121)($Promise.prototype, { - // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) - then: function then(onFulfilled, onRejected){ - var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); - reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; - reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = isNode ? process.domain : undefined; - this._c.push(reaction); - if(this._a)this._a.push(reaction); - if(this._s)notify(this, false); - return reaction.promise; - }, - // 25.4.5.1 Promise.prototype.catch(onRejected) - 'catch': function(onRejected){ - return this.then(undefined, onRejected); - } - }); - PromiseCapability = function(){ - var promise = new Internal; - this.promise = promise; - this.resolve = ctx($resolve, promise, 1); - this.reject = ctx($reject, promise, 1); - }; -} - -$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: $Promise}); -__webpack_require__(27)($Promise, PROMISE); -__webpack_require__(122)(PROMISE); -Wrapper = __webpack_require__(0)[PROMISE]; - -// statics -$export($export.S + $export.F * !USE_NATIVE, PROMISE, { - // 25.4.4.5 Promise.reject(r) - reject: function reject(r){ - var capability = newPromiseCapability(this) - , $$reject = capability.reject; - $$reject(r); - return capability.promise; - } -}); -$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { - // 25.4.4.6 Promise.resolve(x) - resolve: function resolve(x){ - // instanceof instead of internal slot check because we should fix it without replacement native Promise core - if(x instanceof $Promise && sameConstructor(x.constructor, this))return x; - var capability = newPromiseCapability(this) - , $$resolve = capability.resolve; - $$resolve(x); - return capability.promise; - } -}); -$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(64)(function(iter){ - $Promise.all(iter)['catch'](empty); -})), PROMISE, { - // 25.4.4.1 Promise.all(iterable) - all: function all(iterable){ - var C = this - , capability = newPromiseCapability(C) - , resolve = capability.resolve - , reject = capability.reject; - var abrupt = perform(function(){ - var values = [] - , index = 0 - , remaining = 1; - forOf(iterable, false, function(promise){ - var $index = index++ - , alreadyCalled = false; - values.push(undefined); - remaining++; - C.resolve(promise).then(function(value){ - if(alreadyCalled)return; - alreadyCalled = true; - values[$index] = value; - --remaining || resolve(values); - }, reject); - }); - --remaining || resolve(values); - }); - if(abrupt)reject(abrupt.error); - return capability.promise; - }, - // 25.4.4.4 Promise.race(iterable) - race: function race(iterable){ - var C = this - , capability = newPromiseCapability(C) - , reject = capability.reject; - var abrupt = perform(function(){ - forOf(iterable, false, function(promise){ - C.resolve(promise).then(capability.resolve, reject); - }); - }); - if(abrupt)reject(abrupt.error); - return capability.promise; - } -}); - -/***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// ECMAScript 6 symbols shim -var global = __webpack_require__(2) - , has = __webpack_require__(8) - , DESCRIPTORS = __webpack_require__(6) - , $export = __webpack_require__(7) - , redefine = __webpack_require__(68) - , META = __webpack_require__(113).KEY - , $fails = __webpack_require__(13) - , shared = __webpack_require__(40) - , setToStringTag = __webpack_require__(27) - , uid = __webpack_require__(29) - , wks = __webpack_require__(1) - , wksExt = __webpack_require__(45) - , wksDefine = __webpack_require__(44) - , keyOf = __webpack_require__(112) - , enumKeys = __webpack_require__(106) - , isArray = __webpack_require__(109) - , anObject = __webpack_require__(4) - , toIObject = __webpack_require__(10) - , toPrimitive = __webpack_require__(43) - , createDesc = __webpack_require__(20) - , _create = __webpack_require__(65) - , gOPNExt = __webpack_require__(118) - , $GOPD = __webpack_require__(117) - , $DP = __webpack_require__(5) - , $keys = __webpack_require__(15) - , gOPD = $GOPD.f - , dP = $DP.f - , gOPN = gOPNExt.f - , $Symbol = global.Symbol - , $JSON = global.JSON - , _stringify = $JSON && $JSON.stringify - , PROTOTYPE = 'prototype' - , HIDDEN = wks('_hidden') - , TO_PRIMITIVE = wks('toPrimitive') - , isEnum = {}.propertyIsEnumerable - , SymbolRegistry = shared('symbol-registry') - , AllSymbols = shared('symbols') - , OPSymbols = shared('op-symbols') - , ObjectProto = Object[PROTOTYPE] - , USE_NATIVE = typeof $Symbol == 'function' - , QObject = global.QObject; -// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 -var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; - -// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 -var setSymbolDesc = DESCRIPTORS && $fails(function(){ - return _create(dP({}, 'a', { - get: function(){ return dP(this, 'a', {value: 7}).a; } - })).a != 7; -}) ? function(it, key, D){ - var protoDesc = gOPD(ObjectProto, key); - if(protoDesc)delete ObjectProto[key]; - dP(it, key, D); - if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc); -} : dP; - -var wrap = function(tag){ - var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); - sym._k = tag; - return sym; -}; - -var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){ - return typeof it == 'symbol'; -} : function(it){ - return it instanceof $Symbol; -}; - -var $defineProperty = function defineProperty(it, key, D){ - if(it === ObjectProto)$defineProperty(OPSymbols, key, D); - anObject(it); - key = toPrimitive(key, true); - anObject(D); - if(has(AllSymbols, key)){ - if(!D.enumerable){ - if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {})); - it[HIDDEN][key] = true; - } else { - if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false; - D = _create(D, {enumerable: createDesc(0, false)}); - } return setSymbolDesc(it, key, D); - } return dP(it, key, D); -}; -var $defineProperties = function defineProperties(it, P){ - anObject(it); - var keys = enumKeys(P = toIObject(P)) - , i = 0 - , l = keys.length - , key; - while(l > i)$defineProperty(it, key = keys[i++], P[key]); - return it; -}; -var $create = function create(it, P){ - return P === undefined ? _create(it) : $defineProperties(_create(it), P); -}; -var $propertyIsEnumerable = function propertyIsEnumerable(key){ - var E = isEnum.call(this, key = toPrimitive(key, true)); - if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false; - return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; -}; -var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){ - it = toIObject(it); - key = toPrimitive(key, true); - if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return; - var D = gOPD(it, key); - if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true; - return D; -}; -var $getOwnPropertyNames = function getOwnPropertyNames(it){ - var names = gOPN(toIObject(it)) - , result = [] - , i = 0 - , key; - while(names.length > i){ - if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key); - } return result; -}; -var $getOwnPropertySymbols = function getOwnPropertySymbols(it){ - var IS_OP = it === ObjectProto - , names = gOPN(IS_OP ? OPSymbols : toIObject(it)) - , result = [] - , i = 0 - , key; - while(names.length > i){ - if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]); - } return result; -}; - -// 19.4.1.1 Symbol([description]) -if(!USE_NATIVE){ - $Symbol = function Symbol(){ - if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!'); - var tag = uid(arguments.length > 0 ? arguments[0] : undefined); - var $set = function(value){ - if(this === ObjectProto)$set.call(OPSymbols, value); - if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false; - setSymbolDesc(this, tag, createDesc(1, value)); - }; - if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set}); - return wrap(tag); - }; - redefine($Symbol[PROTOTYPE], 'toString', function toString(){ - return this._k; - }); - - $GOPD.f = $getOwnPropertyDescriptor; - $DP.f = $defineProperty; - __webpack_require__(66).f = gOPNExt.f = $getOwnPropertyNames; - __webpack_require__(26).f = $propertyIsEnumerable; - __webpack_require__(38).f = $getOwnPropertySymbols; - - if(DESCRIPTORS && !__webpack_require__(25)){ - redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); - } - - wksExt.f = function(name){ - return wrap(wks(name)); - } -} - -$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol}); - -for(var symbols = ( - // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 - 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' -).split(','), i = 0; symbols.length > i; )wks(symbols[i++]); - -for(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]); - -$export($export.S + $export.F * !USE_NATIVE, 'Symbol', { - // 19.4.2.1 Symbol.for(key) - 'for': function(key){ - return has(SymbolRegistry, key += '') - ? SymbolRegistry[key] - : SymbolRegistry[key] = $Symbol(key); - }, - // 19.4.2.5 Symbol.keyFor(sym) - keyFor: function keyFor(key){ - if(isSymbol(key))return keyOf(SymbolRegistry, key); - throw TypeError(key + ' is not a symbol!'); - }, - useSetter: function(){ setter = true; }, - useSimple: function(){ setter = false; } -}); - -$export($export.S + $export.F * !USE_NATIVE, 'Object', { - // 19.1.2.2 Object.create(O [, Properties]) - create: $create, - // 19.1.2.4 Object.defineProperty(O, P, Attributes) - defineProperty: $defineProperty, - // 19.1.2.3 Object.defineProperties(O, Properties) - defineProperties: $defineProperties, - // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) - getOwnPropertyDescriptor: $getOwnPropertyDescriptor, - // 19.1.2.7 Object.getOwnPropertyNames(O) - getOwnPropertyNames: $getOwnPropertyNames, - // 19.1.2.8 Object.getOwnPropertySymbols(O) - getOwnPropertySymbols: $getOwnPropertySymbols -}); - -// 24.3.2 JSON.stringify(value [, replacer [, space]]) -$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){ - var S = $Symbol(); - // MS Edge converts symbol values to JSON as {} - // WebKit converts symbol values to JSON as null - // V8 throws on boxed symbols - return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}'; -})), 'JSON', { - stringify: function stringify(it){ - if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined - var args = [it] - , i = 1 - , replacer, $replacer; - while(arguments.length > i)args.push(arguments[i++]); - replacer = args[1]; - if(typeof replacer == 'function')$replacer = replacer; - if($replacer || !isArray(replacer))replacer = function(key, value){ - if($replacer)value = $replacer.call(this, key, value); - if(!isSymbol(value))return value; - }; - args[1] = replacer; - return _stringify.apply($JSON, args); - } -}); - -// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) -$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(9)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); -// 19.4.3.5 Symbol.prototype[@@toStringTag] -setToStringTag($Symbol, 'Symbol'); -// 20.2.1.9 Math[@@toStringTag] -setToStringTag(Math, 'Math', true); -// 24.3.3 JSON[@@toStringTag] -setToStringTag(global.JSON, 'JSON', true); - -/***/ }), -/* 135 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(44)('asyncIterator'); - -/***/ }), -/* 136 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(44)('observable'); - -/***/ }), -/* 137 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(Buffer, process, setImmediate) {// Generated by CoffeeScript 2.3.1 -// # CSV Parser - -// This module provides a CSV parser tested and used against large datasets. Over -// the year, it has been enhance and is now full of useful options. - -// Please look at the [README], the [project website][site] the [samples] and the -// [tests] for additional information. -var Parser, StringDecoder, isObjLiteral, stream, util; - -stream = __webpack_require__(149); - -util = __webpack_require__(154); - -StringDecoder = __webpack_require__(48).StringDecoder; - -// ## Usage - -// Callback approach, for ease of use: - -// `parse(data, [options], callback)` - -// [Node.js Stream API][stream], for maximum of power: - -// `parse([options], [callback])` -module.exports = function() { - var callback, called, chunks, data, err, options, parser; - if (arguments.length === 3) { - data = arguments[0]; - options = arguments[1]; - callback = arguments[2]; - if (typeof callback !== 'function') { - throw Error(`Invalid callback argument: ${JSON.stringify(callback)}`); - } - if (!(typeof data === 'string' || Buffer.isBuffer(arguments[0]))) { - return callback(Error(`Invalid data argument: ${JSON.stringify(data)}`)); - } - } else if (arguments.length === 2) { - // 1st arg is data:string or options:object - if (typeof arguments[0] === 'string' || Buffer.isBuffer(arguments[0])) { - data = arguments[0]; - } else if (isObjLiteral(arguments[0])) { - options = arguments[0]; - } else { - err = `Invalid first argument: ${JSON.stringify(arguments[0])}`; - } - // 2nd arg is options:object or callback:function - if (typeof arguments[1] === 'function') { - callback = arguments[1]; - } else if (isObjLiteral(arguments[1])) { - if (options) { - err = 'Invalid arguments: got options twice as first and second arguments'; - } else { - options = arguments[1]; - } - } else { - err = `Invalid first argument: ${JSON.stringify(arguments[1])}`; - } - if (err) { - if (!callback) { - throw Error(err); - } else { - return callback(Error(err)); - } - } - } else if (arguments.length === 1) { - if (typeof arguments[0] === 'function') { - callback = arguments[0]; - } else { - options = arguments[0]; - } - } - if (options == null) { - options = {}; - } - parser = new Parser(options); - if (data != null) { - process.nextTick(function() { - parser.write(data); - return parser.end(); - }); - } - if (callback) { - called = false; - chunks = options.objname ? {} : []; - parser.on('readable', function() { - var chunk, results; - results = []; - while (chunk = parser.read()) { - if (options.objname) { - results.push(chunks[chunk[0]] = chunk[1]); - } else { - results.push(chunks.push(chunk)); - } - } - return results; - }); - parser.on('error', function(err) { - called = true; - return callback(err); - }); - parser.on('end', function() { - if (!called) { - return callback(null, chunks); - } - }); - } - return parser; -}; - -// ## `Parser([options])` - -// Options are documented [here](http://csv.adaltas.com/parse/). -Parser = function(options = {}) { - var base, base1, base10, base11, base12, base13, base14, base15, base16, base17, base2, base3, base4, base5, base6, base7, base8, base9, k, v; - // @options = options - this.options = {}; - for (k in options) { - v = options[k]; - this.options[k] = v; - } - this.options.objectMode = true; - stream.Transform.call(this, this.options); - if ((base = this.options).rowDelimiter == null) { - base.rowDelimiter = null; - } - if (typeof this.options.rowDelimiter === 'string') { - this.options.rowDelimiter = [this.options.rowDelimiter]; - } - if ((base1 = this.options).delimiter == null) { - base1.delimiter = ','; - } - if (this.options.quote !== void 0 && !this.options.quote) { - this.options.quote = ''; - } - if ((base2 = this.options).quote == null) { - base2.quote = '"'; - } - if ((base3 = this.options).escape == null) { - base3.escape = '"'; - } - if ((base4 = this.options).columns == null) { - base4.columns = null; - } - if ((base5 = this.options).comment == null) { - base5.comment = ''; - } - if ((base6 = this.options).objname == null) { - base6.objname = false; - } - if ((base7 = this.options).trim == null) { - base7.trim = false; - } - if ((base8 = this.options).ltrim == null) { - base8.ltrim = false; - } - if ((base9 = this.options).rtrim == null) { - base9.rtrim = false; - } - if (this.options.auto_parse != null) { - this.options.cast = this.options.auto_parse; - } - if ((base10 = this.options).cast == null) { - base10.cast = false; - } - if (this.options.auto_parse_date != null) { - this.options.cast_date = this.options.auto_parse_date; - } - if ((base11 = this.options).cast_date == null) { - base11.cast_date = false; - } - if (this.options.cast_date === true) { - this.options.cast_date = function(value) { - var m; - m = Date.parse(value); - if (!isNaN(m)) { - value = new Date(m); - } - return value; - }; - } - if ((base12 = this.options).relax == null) { - base12.relax = false; - } - if ((base13 = this.options).relax_column_count == null) { - base13.relax_column_count = false; - } - if ((base14 = this.options).skip_empty_lines == null) { - base14.skip_empty_lines = false; - } - if ((base15 = this.options).max_limit_on_data_read == null) { - base15.max_limit_on_data_read = 128000; - } - if ((base16 = this.options).skip_lines_with_empty_values == null) { - base16.skip_lines_with_empty_values = false; - } - if ((base17 = this.options).skip_lines_with_error == null) { - base17.skip_lines_with_error = false; - } - // Counters - // lines = count + skipped_line_count + empty_line_count - this.lines = 0; // Number of lines encountered in the source dataset - this.count = 0; // Number of records being processed - this.skipped_line_count = 0; // Number of records skipped due to errors - this.empty_line_count = 0; // Number of empty lines - // Constants - this.is_int = /^(\-|\+)?([1-9]+[0-9]*)$/; - // @is_float = /^(\-|\+)?([0-9]+(\.[0-9]+)([eE][0-9]+)?|Infinity)$/ - // @is_float = /^(\-|\+)?((([0-9])|([1-9]+[0-9]*))(\.[0-9]+)([eE][0-9]+)?|Infinity)$/ - this.is_float = function(value) { - return (value - parseFloat(value) + 1) >= 0; // Borrowed from jquery - }; - // Internal state - this._ = { - decoder: new StringDecoder(), - quoting: false, - commenting: false, - field: null, - nextChar: null, - closingQuote: 0, - line: [], - chunks: [], - rawBuf: '', - buf: '', - rowDelimiterLength: this.options.rowDelimiter ? Math.max(...this.options.rowDelimiter.map(function(v) { - return v.length; - })) : void 0, - lineHasError: false, - isEnded: false - }; - return this; -}; - -// ## Internal API - -// The Parser implement a [`stream.Transform` class][transform]. - -// ### Events - -// The library extends Node [EventEmitter][event] class and emit all -// the events of the Writable and Readable [Stream API][stream]. -util.inherits(Parser, stream.Transform); - -// For extra flexibility, you can get access to the original Parser -// class: `require('csv-parse').Parser`. -module.exports.Parser = Parser; - -// ### `_transform(chunk, encoding, callback)` - -// * `chunk` Buffer | String -// The chunk to be transformed. Will always be a buffer unless the decodeStrings option was set to false. -// * `encoding` String -// If the chunk is a string, then this is the encoding type. (Ignore if decodeStrings chunk is a buffer.) -// * `callback` Function -// Call this function (optionally with an error argument) when you are done processing the supplied chunk. - -// Implementation of the [`stream.Transform` API][transform] -Parser.prototype._transform = function(chunk, encoding, callback) { - return setImmediate(() => { - var err; - if (chunk instanceof Buffer) { - chunk = this._.decoder.write(chunk); - } - err = this.__write(chunk, false); - if (err) { - return this.emit('error', err); - } - return callback(); - }); -}; - -Parser.prototype._flush = function(callback) { - return callback(this.__flush()); -}; - -Parser.prototype.__flush = function() { - var err; - err = this.__write(this._.decoder.end(), true); - if (err) { - return err; - } - if (this._.quoting) { - err = this.error(`Quoted field not terminated at line ${this.lines + 1}`); - return err; - } - if (this._.line.length > 0) { - return this.__push(this._.line); - } -}; - -Parser.prototype.__push = function(line) { - var call_column_udf, columns, err, field, i, j, len, lineAsColumns, record; - if (this._.isEnded) { - return; - } - if (this.options.skip_lines_with_empty_values && line.join('').trim() === '') { - return; - } - record = null; - if (this.options.columns === true) { - this.options.columns = line; - return; - } else if (typeof this.options.columns === 'function') { - call_column_udf = function(fn, line) { - var columns, err; - try { - columns = fn.call(null, line); - return [null, columns]; - } catch (error) { - err = error; - return [err]; - } - }; - [err, columns] = call_column_udf(this.options.columns, line); - if (err) { - return err; - } - this.options.columns = columns; - return; - } - if (!this._.line_length && line.length > 0) { - this._.line_length = this.options.columns ? this.options.columns.length : line.length; - } - // Dont check column count on empty lines - if (line.length === 1 && line[0] === '') { - this.empty_line_count++; - } else if (line.length !== this._.line_length) { - // Dont check column count with relax_column_count - if (this.options.relax_column_count) { - this.count++; - this.skipped_line_count++; - } else if (this.options.columns != null) { - // Suggest: Inconsistent header and column numbers: header is 1 and number of columns is 1 on line 1 - err = this.error(`Number of columns on line ${this.lines} does not match header`); - return err; - } else { - err = this.error(`Number of columns is inconsistent on line ${this.lines}`); - return err; - } - } else { - this.count++; - } - if (this.options.columns != null) { - lineAsColumns = {}; - for (i = j = 0, len = line.length; j < len; i = ++j) { - field = line[i]; - if (this.options.columns[i] === false) { - continue; - } - lineAsColumns[this.options.columns[i]] = field; - } - if (this.options.objname) { - record = [lineAsColumns[this.options.objname], lineAsColumns]; - } else { - record = lineAsColumns; - } - } else { - record = line; - } - if (this.count < this.options.from) { - return; - } - if (this.options.raw) { - this.push({ - raw: this._.rawBuf, - row: record - }); - this._.rawBuf = ''; - } else { - this.push(record); - } - if (this.listenerCount('record')) { - this.emit('record', record); - } - // When to is reached set ignore any future calls - if (this.count >= this.options.to) { - this._.isEnded = true; - return this.push(null); - } - return null; -}; - -Parser.prototype.__write = function(chars, end) { - var areNextCharsDelimiter, areNextCharsRowDelimiters, cast, char, err, escapeIsQuote, i, isDelimiter, isEscape, isNextCharAComment, isNextCharTrimable, isQuote, isRowDelimiter, isRowDelimiterLength, is_float, is_int, l, ltrim, nextCharPos, ref, ref1, ref2, ref3, ref4, ref5, ref6, remainingBuffer, rowDelimiter, rtrim, wasCommenting; - is_int = (value) => { - if (typeof this.is_int === 'function') { - return this.is_int(value); - } else { - return this.is_int.test(value); - } - }; - is_float = (value) => { - if (typeof this.is_float === 'function') { - return this.is_float(value); - } else { - return this.is_float.test(value); - } - }; - cast = (value, context = {}) => { - if (!this.options.cast) { - return value; - } - if (context.quoting == null) { - context.quoting = !!this._.closingQuote; - } - if (context.lines == null) { - context.lines = this.lines; - } - if (context.count == null) { - context.count = this.count; - } - if (context.index == null) { - context.index = this._.line.length; - } - // context.header ?= if @options.column and @lines is 1 and @count is 0 then true else false - if (context.header == null) { - context.header = this.options.columns === true; - } - if (context.column == null) { - context.column = Array.isArray(this.options.columns) ? this.options.columns[context.index] : context.index; - } - if (typeof this.options.cast === 'function') { - return this.options.cast(value, context); - } - if (is_int(value)) { - value = parseInt(value); - } else if (is_float(value)) { - value = parseFloat(value); - } else if (this.options.cast_date) { - value = this.options.cast_date(value, context); - } - return value; - }; - ltrim = this.options.trim || this.options.ltrim; - rtrim = this.options.trim || this.options.rtrim; - chars = this._.buf + chars; - l = chars.length; - i = 0; - if (this.lines === 0 && 0xFEFF === chars.charCodeAt(0)) { - // Strip BOM header - i++; - } - while (i < l) { - // Ensure we get enough space to look ahead - if (!end) { - remainingBuffer = chars.substr(i, l - i); - // (i+1000 >= l) or - // Skip if the remaining buffer can be comment - // Skip if the remaining buffer can be row delimiter - if ((!this.options.rowDelimiter && i + 3 > l) || (!this._.commenting && l - i < this.options.comment.length && this.options.comment.substr(0, l - i) === remainingBuffer) || (this.options.rowDelimiter && l - i < this._.rowDelimiterLength && this.options.rowDelimiter.some(function(rd) { - return rd.substr(0, l - i) === remainingBuffer; - // Skip if the remaining buffer can be row delimiter following the closing quote - })) || (this.options.rowDelimiter && this._.quoting && l - i < (this.options.quote.length + this._.rowDelimiterLength) && this.options.rowDelimiter.some((rd) => { - return (this.options.quote + rd).substr(0, l - i) === remainingBuffer; - // Skip if the remaining buffer can be delimiter - // Skip if the remaining buffer can be escape sequence - })) || (l - i <= this.options.delimiter.length && this.options.delimiter.substr(0, l - i) === remainingBuffer) || (l - i <= this.options.escape.length && this.options.escape.substr(0, l - i) === remainingBuffer)) { - break; - } - } - char = this._.nextChar ? this._.nextChar : chars.charAt(i); - this._.nextChar = l > i + 1 ? chars.charAt(i + 1) : null; - if (this.options.raw) { - this._.rawBuf += char; - } - // Auto discovery of rowDelimiter, unix, mac and windows supported - if (this.options.rowDelimiter == null) { - nextCharPos = i; - rowDelimiter = null; - // First empty line - if (!this._.quoting && (char === '\n' || char === '\r')) { - rowDelimiter = char; - nextCharPos += 1; - } else if (this._.quoting && char === this.options.quote && ((ref = this._.nextChar) === '\n' || ref === '\r')) { - rowDelimiter = this._.nextChar; - nextCharPos += 2; - } - if (rowDelimiter) { - if (rowDelimiter === '\r' && chars.charAt(nextCharPos) === '\n') { - rowDelimiter += '\n'; - } - this.options.rowDelimiter = [rowDelimiter]; - this._.rowDelimiterLength = rowDelimiter.length; - } - } - // Parse that damn char - // Note, shouldn't we have sth like chars.substr(i, @options.escape.length) - if (!this._.commenting && char === this.options.escape) { - // Make sure the escape is really here for escaping: - // If escape is same as quote, and escape is first char of a field - // and it's not quoted, then it is a quote - // Next char should be an escape or a quote - escapeIsQuote = this.options.escape === this.options.quote; - isEscape = this._.nextChar === this.options.escape; - isQuote = this._.nextChar === this.options.quote; - if (!(escapeIsQuote && !this._.field && !this._.quoting) && (isEscape || isQuote)) { - i++; - char = this._.nextChar; - this._.nextChar = chars.charAt(i + 1); - if (this._.field == null) { - this._.field = ''; - } - this._.field += char; - // Since we're skipping the next one, better add it now if in raw mode. - if (this.options.raw) { - this._.rawBuf += char; - } - i++; - continue; - } - } - // Char match quote - if (!this._.commenting && char === this.options.quote) { - if (this._.acceptOnlyEmptyChars && (char !== ' ' && char !== '\t')) { - return this.error('Only trimable characters are accepted after quotes'); - } - if (this._.quoting) { - // Make sure a closing quote is followed by a delimiter - // If we have a next character and - // it isnt a rowDelimiter and - // it isnt an column delimiter and - // it isnt the begining of a comment - // Otherwise, if this is not "relax" mode, throw an error - isNextCharTrimable = rtrim && ((ref1 = this._.nextChar) === ' ' || ref1 === '\t'); - areNextCharsRowDelimiters = this.options.rowDelimiter && this.options.rowDelimiter.some(function(rd) { - return chars.substr(i + 1, rd.length) === rd; - }); - areNextCharsDelimiter = chars.substr(i + 1, this.options.delimiter.length) === this.options.delimiter; - isNextCharAComment = this._.nextChar === this.options.comment; - if ((this._.nextChar != null) && !isNextCharTrimable && !areNextCharsRowDelimiters && !areNextCharsDelimiter && !isNextCharAComment) { - if (this.options.relax) { - this._.quoting = false; - if (this._.field) { - this._.field = `${this.options.quote}${this._.field}`; - } - } else { - if (err = this.error(`Invalid closing quote at line ${this.lines + 1}; found ${JSON.stringify(this._.nextChar)} instead of delimiter ${JSON.stringify(this.options.delimiter)}`)) { - return err; - } - } - } else if ((this._.nextChar != null) && isNextCharTrimable) { - i++; - this._.quoting = false; - this._.closingQuote = this.options.quote.length; - this._.acceptOnlyEmptyChars = true; - continue; - } else { - i++; - this._.quoting = false; - this._.closingQuote = this.options.quote.length; - if (end && i === l) { - this._.line.push(cast(this._.field || '')); - this._.field = null; - } - continue; - } - } else if (!this._.field) { - this._.quoting = true; - i++; - continue; - } else if ((this._.field != null) && !this.options.relax) { - if (err = this.error(`Invalid opening quote at line ${this.lines + 1}`)) { - return err; - } - } - } - // Otherwise, treat quote as a regular character - isRowDelimiter = this.options.rowDelimiter && this.options.rowDelimiter.some(function(rd) { - return chars.substr(i, rd.length) === rd; - }); - if (isRowDelimiter || (end && i === l - 1)) { - this.lines++; - } - // Set the commenting flag - wasCommenting = false; - if (!this._.commenting && !this._.quoting && this.options.comment && chars.substr(i, this.options.comment.length) === this.options.comment) { - this._.commenting = true; - } else if (this._.commenting && isRowDelimiter) { - wasCommenting = true; - this._.commenting = false; - } - isDelimiter = chars.substr(i, this.options.delimiter.length) === this.options.delimiter; - if (this._.acceptOnlyEmptyChars) { - if (isDelimiter || isRowDelimiter) { - this._.acceptOnlyEmptyChars = false; - } else { - if (char === ' ' || char === '\t') { - i++; - continue; - } else { - return this.error('Only trimable characters are accepted after quotes'); - } - } - } - if (!this._.commenting && !this._.quoting && (isDelimiter || isRowDelimiter)) { - if (isRowDelimiter) { - isRowDelimiterLength = this.options.rowDelimiter.filter(function(rd) { - return chars.substr(i, rd.length) === rd; - })[0].length; - } - // Empty lines - if (isRowDelimiter && this._.line.length === 0 && (this._.field == null)) { - if (wasCommenting || this.options.skip_empty_lines) { - i += isRowDelimiterLength; - this._.nextChar = chars.charAt(i); - continue; - } - } - if (rtrim) { - if (!this._.closingQuote) { - this._.field = (ref2 = this._.field) != null ? ref2.trimRight() : void 0; - } - } - this._.line.push(cast(this._.field || '')); - this._.closingQuote = 0; - this._.field = null; - if (isDelimiter) { // End of field - i += this.options.delimiter.length; - this._.nextChar = chars.charAt(i); - if (end && !this._.nextChar) { - isRowDelimiter = true; - this._.line.push(''); - } - } - if (isRowDelimiter) { // End of record - if (!this._.lineHasError) { - err = this.__push(this._.line); - if (err) { - return err; - } - } - if (this._.lineHasError) { - this._.lineHasError = false; - } - // Some cleanup for the next record - this._.line = []; - i += isRowDelimiterLength; - this._.nextChar = chars.charAt(i); - continue; - } - } else if (!this._.commenting && !this._.quoting && (char === ' ' || char === '\t')) { - if (this._.field == null) { - // Left trim unless we are quoting or field already filled - this._.field = ''; - } - if (!(ltrim && !this._.field)) { - this._.field += char; - } - i++; - } else if (!this._.commenting) { - if (this._.field == null) { - this._.field = ''; - } - this._.field += char; - i++; - } else { - i++; - } - if (!this._.commenting && ((ref3 = this._.field) != null ? ref3.length : void 0) > this.options.max_limit_on_data_read) { - return Error(`Field exceeds max_limit_on_data_read setting (${this.options.max_limit_on_data_read}) ${JSON.stringify(this.options.delimiter)}`); - } - if (!this._.commenting && ((ref4 = this._.line) != null ? ref4.length : void 0) > this.options.max_limit_on_data_read) { - return Error(`Row delimiter not found in the file ${JSON.stringify(this.options.rowDelimiter)}`); - } - } - // Flush remaining fields and lines - if (end) { - if (l === 0) { - this.lines++; - } - if (this._.field != null) { - if (rtrim) { - if (!this._.closingQuote) { - this._.field = (ref5 = this._.field) != null ? ref5.trimRight() : void 0; - } - } - this._.line.push(cast(this._.field || '')); - this._.field = null; - } - if (((ref6 = this._.field) != null ? ref6.length : void 0) > this.options.max_limit_on_data_read) { - return Error(`Delimiter not found in the file ${JSON.stringify(this.options.delimiter)}`); - } - if (this._.line.length > this.options.max_limit_on_data_read) { - return Error(`Row delimiter not found in the file ${JSON.stringify(this.options.rowDelimiter)}`); - } - } - // Store un-parsed chars for next call - this._.buf = chars.substr(i); - return null; -}; - -Parser.prototype.error = function(msg) { - var err; - err = Error(msg); - if (!this.options.skip_lines_with_error) { - return err; - } else { - if (!this._.lineHasError) { - this._.lineHasError = true; - this.emit('skip', err); - } - } - return null; -}; - -// ## Utils -isObjLiteral = function(_obj) { - var _test; - _test = _obj; - if (typeof _obj !== 'object' || _obj === null || Array.isArray(_obj)) { - return false; - } else { - return (function() { - while (!false) { - if (Object.getPrototypeOf(_test = Object.getPrototypeOf(_test)) === null) { - break; - } - } - return Object.getPrototypeOf(_obj === _test); - })(); - } -}; - -// [readme]: https://github.com/wdavidw/node-csv-parse -// [site]: http://csv.adaltas.com/parse/ -// [samples]: https://github.com/wdavidw/node-csv-parse/tree/master/samples -// [tests]: https://github.com/wdavidw/node-csv-parse/tree/master/test -// [stream]: (http://nodejs.org/api/stream.html -// [transform]: (http://nodejs.org/api/stream.html#stream_class_stream_transform_1) - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3).Buffer, __webpack_require__(11), __webpack_require__(75).setImmediate)) - -/***/ }), -/* 138 */ -/***/ (function(module, exports, __webpack_require__) { - -var __WEBPACK_AMD_DEFINE_RESULT__;/* FileSaver.js - * A saveAs() FileSaver implementation. - * 1.3.2 - * 2016-06-16 18:25:19 - * - * By Eli Grey, http://eligrey.com - * License: MIT - * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md - */ - -/*global self */ -/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ - -/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ - -var saveAs = saveAs || (function(view) { - "use strict"; - // IE <10 is explicitly unsupported - if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { - return; - } - var - doc = view.document - // only get URL when necessary in case Blob.js hasn't overridden it yet - , get_URL = function() { - return view.URL || view.webkitURL || view; - } - , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") - , can_use_save_link = "download" in save_link - , click = function(node) { - var event = new MouseEvent("click"); - node.dispatchEvent(event); - } - , is_safari = /constructor/i.test(view.HTMLElement) || view.safari - , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent) - , throw_outside = function(ex) { - (view.setImmediate || view.setTimeout)(function() { - throw ex; - }, 0); - } - , force_saveable_type = "application/octet-stream" - // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to - , arbitrary_revoke_timeout = 1000 * 40 // in ms - , revoke = function(file) { - var revoker = function() { - if (typeof file === "string") { // file is an object URL - get_URL().revokeObjectURL(file); - } else { // file is a File - file.remove(); - } - }; - setTimeout(revoker, arbitrary_revoke_timeout); - } - , dispatch = function(filesaver, event_types, event) { - event_types = [].concat(event_types); - var i = event_types.length; - while (i--) { - var listener = filesaver["on" + event_types[i]]; - if (typeof listener === "function") { - try { - listener.call(filesaver, event || filesaver); - } catch (ex) { - throw_outside(ex); - } - } - } - } - , auto_bom = function(blob) { - // prepend BOM for UTF-8 XML and text/* types (including HTML) - // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF - if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { - return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type}); - } - return blob; - } - , FileSaver = function(blob, name, no_auto_bom) { - if (!no_auto_bom) { - blob = auto_bom(blob); - } - // First try a.download, then web filesystem, then object URLs - var - filesaver = this - , type = blob.type - , force = type === force_saveable_type - , object_url - , dispatch_all = function() { - dispatch(filesaver, "writestart progress write writeend".split(" ")); - } - // on any filesys errors revert to saving with object URLs - , fs_error = function() { - if ((is_chrome_ios || (force && is_safari)) && view.FileReader) { - // Safari doesn't allow downloading of blob urls - var reader = new FileReader(); - reader.onloadend = function() { - var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;'); - var popup = view.open(url, '_blank'); - if(!popup) view.location.href = url; - url=undefined; // release reference before dispatching - filesaver.readyState = filesaver.DONE; - dispatch_all(); - }; - reader.readAsDataURL(blob); - filesaver.readyState = filesaver.INIT; - return; - } - // don't create more object URLs than needed - if (!object_url) { - object_url = get_URL().createObjectURL(blob); - } - if (force) { - view.location.href = object_url; - } else { - var opened = view.open(object_url, "_blank"); - if (!opened) { - // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html - view.location.href = object_url; - } - } - filesaver.readyState = filesaver.DONE; - dispatch_all(); - revoke(object_url); - } - ; - filesaver.readyState = filesaver.INIT; - - if (can_use_save_link) { - object_url = get_URL().createObjectURL(blob); - setTimeout(function() { - save_link.href = object_url; - save_link.download = name; - click(save_link); - dispatch_all(); - revoke(object_url); - filesaver.readyState = filesaver.DONE; - }); - return; - } - - fs_error(); - } - , FS_proto = FileSaver.prototype - , saveAs = function(blob, name, no_auto_bom) { - return new FileSaver(blob, name || blob.name || "download", no_auto_bom); - } - ; - // IE 10+ (native saveAs) - if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) { - return function(blob, name, no_auto_bom) { - name = name || blob.name || "download"; - - if (!no_auto_bom) { - blob = auto_bom(blob); - } - return navigator.msSaveOrOpenBlob(blob, name); - }; - } - - FS_proto.abort = function(){}; - FS_proto.readyState = FS_proto.INIT = 0; - FS_proto.WRITING = 1; - FS_proto.DONE = 2; - - FS_proto.error = - FS_proto.onwritestart = - FS_proto.onprogress = - FS_proto.onwrite = - FS_proto.onabort = - FS_proto.onerror = - FS_proto.onwriteend = - null; - - return saveAs; -}( - typeof self !== "undefined" && self - || typeof window !== "undefined" && window - || this.content -)); -// `self` is undefined in Firefox for Android content script context -// while `this` is nsIContentFrameMessageManager -// with an attribute `content` that corresponds to the window - -if (typeof module !== "undefined" && module.exports) { - module.exports.saveAs = saveAs; -} else if (("function" !== "undefined" && __webpack_require__(156) !== null) && (__webpack_require__(157) !== null)) { - !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { - return saveAs; - }.call(exports, __webpack_require__, exports, module), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); -} - - -/***/ }), -/* 139 */ -/***/ (function(module, exports) { - -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] - - i += d - - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} - - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} - -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax - } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } - } - - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - - -/***/ }), -/* 140 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(Buffer, process) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.Writer = exports.VexFlow = exports.Utils = exports.Track = exports.ProgramChangeEvent = exports.NoteOnEvent = exports.NoteOffEvent = exports.NoteEvent = exports.MetaEvent = exports.ControllerChangeEvent = exports.Constants = exports.Chunk = undefined; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _tonalMidi = __webpack_require__(150); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -/** - * Object representation of the chunk section of a MIDI file. - * @param {object} fields - {type: number, data: array, size: array} - * @return {Chunk} - */ -var Chunk = function Chunk(fields) { - _classCallCheck(this, Chunk); - - this.type = fields.type; - this.data = fields.data; - this.size = [0, 0, 0, fields.data.length]; -}; - -exports.Chunk = Chunk; + */(i(106)); /** - * MIDI file format constants, including note -> MIDI number translation. - * @return {Constants} - */ - -var Constants = { - VERSION: '1.5.2', - HEADER_CHUNK_TYPE: [0x4d, 0x54, 0x68, 0x64], // Mthd - HEADER_CHUNK_LENGTH: [0x00, 0x00, 0x00, 0x06], // Header size for SMF - HEADER_CHUNK_FORMAT0: [0x00, 0x00], // Midi Type 0 id - HEADER_CHUNK_FORMAT1: [0x00, 0x01], // Midi Type 1 id - HEADER_CHUNK_DIVISION: [0x00, 0x80], // Defaults to 128 ticks per beat - TRACK_CHUNK_TYPE: [0x4d, 0x54, 0x72, 0x6b], // MTrk, - META_EVENT_ID: 0xFF, - META_TEXT_ID: 0x01, - META_COPYRIGHT_ID: 0x02, - META_TRACK_NAME_ID: 0x03, - META_INSTRUMENT_NAME_ID: 0x04, - META_LYRIC_ID: 0x05, - META_MARKER_ID: 0x06, - META_CUE_POINT: 0x07, - META_TEMPO_ID: 0x51, - META_SMTPE_OFFSET: 0x54, - META_TIME_SIGNATURE_ID: 0x58, - META_KEY_SIGNATURE_ID: 0x59, - META_END_OF_TRACK_ID: [0x2F, 0x00], - CONTROLLER_CHANGE_STATUS: 0xB0, // includes channel number (0) - PROGRAM_CHANGE_STATUS: 0xC0 // includes channel number (0) -}; - -exports.Constants = Constants; -/** - * Holds all data for a "controller change" MIDI event - * @param {object} fields {controllerNumber: integer, controllerValue: integer} - * @return {ControllerChangeEvent} - */ - -var ControllerChangeEvent = function ControllerChangeEvent(fields) { - _classCallCheck(this, ControllerChangeEvent); - - this.type = 'controller'; - // delta time defaults to 0. - this.data = Utils.numberToVariableLength(0x00).concat(Constants.CONTROLLER_CHANGE_STATUS, fields.controllerNumber, fields.controllerValue); -}; - -exports.ControllerChangeEvent = ControllerChangeEvent; -/** - * Object representation of a meta event. - * @param {object} fields - type, data - * @return {MetaEvent} - */ - -var MetaEvent = function MetaEvent(fields) { - _classCallCheck(this, MetaEvent); - - this.type = 'meta'; - this.data = Utils.numberToVariableLength(0x00); // Start with zero time delta - this.data = this.data.concat(Constants.META_EVENT_ID, fields.data); -}; - -exports.MetaEvent = MetaEvent; -/** - * Wrapper for noteOnEvent/noteOffEvent objects that builds both events. - * @param {object} fields - {pitch: '[C4]', duration: '4', wait: '4', velocity: 1-100} - * @return {NoteEvent} - */ - -var NoteEvent = function () { - function NoteEvent(fields) { - _classCallCheck(this, NoteEvent); - - this.type = 'note'; - this.pitch = Utils.toArray(fields.pitch); - this.wait = fields.wait || 0; - this.duration = fields.duration; - this.sequential = fields.sequential || false; - this.velocity = fields.velocity || 50; - this.channel = fields.channel || 1; - this.repeat = fields.repeat || 1; - this.velocity = this.convertVelocity(this.velocity); - this.grace = fields.grace; - this.buildData(); - } - - /** - * Builds int array for this event. - * @return {NoteEvent} - */ - - - _createClass(NoteEvent, [{ - key: 'buildData', - value: function buildData() { - this.data = []; - - var tickDuration = this.getTickDuration(this.duration, 'note'); - var restDuration = this.getTickDuration(this.wait, 'rest'); - - // Apply grace note(s) and subtract ticks (currently 1 tick per grace note) from tickDuration so net value is the same - if (this.grace) { - var graceDuration = 1; - this.grace = Utils.toArray(this.grace); - this.grace.forEach(function (pitch) { - var noteEvent = new NoteEvent({ pitch: this.grace, duration: 'T' + graceDuration }); - this.data = this.data.concat(noteEvent.data); - - tickDuration -= graceDuration; - }, this); - } - - // fields.pitch could be an array of pitches. - // If so create note events for each and apply the same duration. - var noteOn, noteOff; - if (Array.isArray(this.pitch)) { - // By default this is a chord if it's an array of notes that requires one NoteOnEvent. - // If this.sequential === true then it's a sequential string of notes that requires separate NoteOnEvents. - if (!this.sequential) { - // Handle repeat - for (var j = 0; j < this.repeat; j++) { - // Note on - this.pitch.forEach(function (p, i) { - if (i == 0) { - noteOn = new NoteOnEvent({ data: Utils.numberToVariableLength(restDuration).concat(this.getNoteOnStatus(), Utils.getPitch(p), this.velocity) }); - } else { - // Running status (can ommit the note on status) - noteOn = new NoteOnEvent({ data: [0, Utils.getPitch(p), this.velocity] }); - } - - this.data = this.data.concat(noteOn.data); - }, this); - - // Note off - this.pitch.forEach(function (p, i) { - if (i == 0) { - noteOff = new NoteOffEvent({ data: Utils.numberToVariableLength(tickDuration).concat(this.getNoteOffStatus(), Utils.getPitch(p), this.velocity) }); - } else { - // Running status (can ommit the note off status) - noteOff = new NoteOffEvent({ data: [0, Utils.getPitch(p), this.velocity] }); - } - - this.data = this.data.concat(noteOff.data); - }, this); - } - } else { - // Handle repeat - for (var j = 0; j < this.repeat; j++) { - this.pitch.forEach(function (p, i) { - // restDuration only applies to first note - if (i > 0) { - restDuration = 0; - } - - // If duration is 8th triplets we need to make sure that the total ticks == quarter note. - // So, the last one will need to be the remainder - if (this.duration === '8t' && i == this.pitch.length - 1) { - var quarterTicks = Utils.numberFromBytes(Constants.HEADER_CHUNK_DIVISION); - tickDuration = quarterTicks - tickDuration * 2; - } - - noteOn = new NoteOnEvent({ data: Utils.numberToVariableLength(restDuration).concat([this.getNoteOnStatus(), Utils.getPitch(p), this.velocity]) }); - noteOff = new NoteOffEvent({ data: Utils.numberToVariableLength(tickDuration).concat([this.getNoteOffStatus(), Utils.getPitch(p), this.velocity]) }); - - this.data = this.data.concat(noteOn.data, noteOff.data); - }, this); - } - } - - return this; - } - - throw 'pitch must be an array.'; - } - }, { - key: 'convertVelocity', - - - /** - * Converts velocity to value 0-127 - * @param {number} velocity - Velocity value 1-100 - * @return {number} - */ - value: function convertVelocity(velocity) { - // Max passed value limited to 100 - velocity = velocity > 100 ? 100 : velocity; - return Math.round(velocity / 100 * 127); - } - }, { - key: 'getTickDuration', - - - /** - * Gets the total number of ticks based on passed duration. - * Note: type=='note' defaults to quarter note, type==='rest' defaults to 0 - * @param {(string|array)} duration - * @param {string} type ['note', 'rest'] - * @return {number} - */ - value: function getTickDuration(duration, type) { - if (Array.isArray(duration)) { - // Recursively execute this method for each item in the array and return the sum of tick durations. - return duration.map(function (value) { - return this.getTickDuration(value, type); - }, this).reduce(function (a, b) { - return a + b; - }, 0); - } - - duration = duration.toString(); - - if (duration.toLowerCase().charAt(0) === 't') { - // If duration starts with 't' then the number that follows is an explicit tick count - return parseInt(duration.substring(1)); - } - - // Need to apply duration here. Quarter note == Constants.HEADER_CHUNK_DIVISION - // Rounding only applies to triplets, which the remainder is handled below - var quarterTicks = Utils.numberFromBytes(Constants.HEADER_CHUNK_DIVISION); - return Math.round(quarterTicks * this.getDurationMultiplier(duration, type)); - } - - /** - * Gets what to multiple ticks/quarter note by to get the specified duration. - * Note: type=='note' defaults to quarter note, type==='rest' defaults to 0 - * @param {string} duration - * @param {string} type ['note','rest'] - * @return {number} - */ - - }, { - key: 'getDurationMultiplier', - value: function getDurationMultiplier(duration, type) { - // Need to apply duration here. Quarter note == Constants.HEADER_CHUNK_DIVISION - switch (duration) { - case '0': - return 0; - case '1': - return 4; - case '2': - return 2; - case 'd2': - return 3; - case '4': - return 1; - case '4t': - return 0.666; - case 'd4': - return 1.5; - case '8': - return 0.5; - case '8t': - // For 8th triplets, let's divide a quarter by 3, round to the nearest int, and substract the remainder to the last one. - return 0.33; - case 'd8': - return 0.75; - case '16': - return 0.25; - case '16t': - return 0.166; - case '32': - return 0.125; - case '64': - return 0.0625; - default: - // Notes default to a quarter, rests default to 0 - //return type === 'note' ? 1 : 0; - } - - throw duration + ' is not a valid duration.'; - } - }, { - key: 'getNoteOnStatus', - - - /** - * Gets the note on status code based on the selected channel. 0x9{0-F} - * Note on at channel 0 is 0x90 (144) - * 0 = Ch 1 - * @return {number} - */ - value: function getNoteOnStatus() { - return 144 + this.channel - 1; - } - - /** - * Gets the note off status code based on the selected channel. 0x8{0-F} - * Note off at channel 0 is 0x80 (128) - * 0 = Ch 1 - * @return {number} - */ - - }, { - key: 'getNoteOffStatus', - value: function getNoteOffStatus() { - return 128 + this.channel - 1; - } - }]); - - return NoteEvent; -}(); - -exports.NoteEvent = NoteEvent; -/** - * Holds all data for a "note off" MIDI event - * @param {object} fields {data: []} - * @return {NoteOffEvent} - */ - -var NoteOffEvent = function NoteOffEvent(fields) { - _classCallCheck(this, NoteOffEvent); - - this.data = fields.data; -}; - -exports.NoteOffEvent = NoteOffEvent; -/** - * Holds all data for a "note on" MIDI event - * @param {object} fields {data: []} - * @return {NoteOnEvent} - */ - -var NoteOnEvent = function NoteOnEvent(fields) { - _classCallCheck(this, NoteOnEvent); - - this.data = fields.data; -}; - -exports.NoteOnEvent = NoteOnEvent; -/** - * Holds all data for a "program change" MIDI event - * @param {object} fields {instrument: integer} - * @return {ProgramChangeEvent} - */ - -var ProgramChangeEvent = function ProgramChangeEvent(fields) { - _classCallCheck(this, ProgramChangeEvent); - - this.type = 'program'; - // delta time defaults to 0. - this.data = Utils.numberToVariableLength(0x00).concat(Constants.PROGRAM_CHANGE_STATUS, fields.instrument); -}; - -exports.ProgramChangeEvent = ProgramChangeEvent; -/** - * Holds all data for a track. - * @param {object} fields {type: number, data: array, size: array, events: array} - * @return {Track} - */ - -var Track = function () { - function Track() { - _classCallCheck(this, Track); - - this.type = Constants.TRACK_CHUNK_TYPE; - this.data = []; - this.size = []; - this.events = []; - } - - /** - * Adds any event type to the track. - * @param {(NoteEvent|MetaEvent|ProgramChangeEvent)} event - Event object. - * @param {function} mapFunction - Callback which can be used to apply specific properties to all events. - * @return {Track} - */ - - - _createClass(Track, [{ - key: 'addEvent', - value: function addEvent(event, mapFunction) { - if (Array.isArray(event)) { - event.forEach(function (e, i) { - // Handle map function if provided - if (typeof mapFunction === 'function' && e.type === 'note') { - var properties = mapFunction(i, e); - - if ((typeof properties === 'undefined' ? 'undefined' : _typeof(properties)) === 'object') { - for (var j in properties) { - switch (j) { - case 'duration': - e.duration = properties[j]; - break; - case 'sequential': - e.sequential = properties[j]; - break; - case 'velocity': - e.velocity = e.convertVelocity(properties[j]); - break; - } - } - - // Gotta build that data - e.buildData(); - } - } - - this.data = this.data.concat(e.data); - this.size = Utils.numberToBytes(this.data.length, 4); // 4 bytes long - this.events.push(e); - }, this); - } else { - this.data = this.data.concat(event.data); - this.size = Utils.numberToBytes(this.data.length, 4); // 4 bytes long - this.events.push(event); - } - - return this; - } - - /** - * Sets tempo of the MIDI file. - * @param {number} bpm - Tempo in beats per minute. - * @return {Track} - */ - - }, { - key: 'setTempo', - value: function setTempo(bpm) { - var event = new MetaEvent({ data: [Constants.META_TEMPO_ID] }); - event.data.push(0x03); // Size - var tempo = Math.round(60000000 / bpm); - event.data = event.data.concat(Utils.numberToBytes(tempo, 3)); // Tempo, 3 bytes - return this.addEvent(event); - } - - /** - * Sets time signature. - * @param {number} numerator - Top number of the time signature. - * @param {number} denominator - Bottom number of the time signature. - * @param {number} midiclockspertick - Defaults to 24. - * @param {number} notespermidiclock - Defaults to 8. - * @return {Track} - */ - - }, { - key: 'setTimeSignature', - value: function setTimeSignature(numerator, denominator, midiclockspertick, notespermidiclock) { - midiclockspertick = midiclockspertick || 24; - notespermidiclock = notespermidiclock || 8; - - var event = new MetaEvent({ data: [Constants.META_TIME_SIGNATURE_ID] }); - event.data.push(0x04); // Size - event.data = event.data.concat(Utils.numberToBytes(numerator, 1)); // Numerator, 1 bytes - - var _denominator = Math.log2(denominator); // Denominator is expressed as pow of 2 - event.data = event.data.concat(Utils.numberToBytes(_denominator, 1)); // Denominator, 1 bytes - event.data = event.data.concat(Utils.numberToBytes(midiclockspertick, 1)); // MIDI Clocks per tick, 1 bytes - event.data = event.data.concat(Utils.numberToBytes(notespermidiclock, 1)); // Number of 1/32 notes per MIDI clocks, 1 bytes - return this.addEvent(event); - } - - /** - * Sets key signature. - * @param {*} sf - - * @param {*} mi - - * @return {Track} - */ - - }, { - key: 'setKeySignature', - value: function setKeySignature(sf, mi) { - var event = new MetaEvent({ data: [Constants.META_KEY_SIGNATURE_ID] }); - event.data.push(0x02); // Size - - var mode = mi || 0; - sf = sf || 0; - - // Function called with string notation - if (typeof mi === 'undefined') { - var fifths = [['Cb', 'Gb', 'Db', 'Ab', 'Eb', 'Bb', 'F', 'C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#'], ['ab', 'eb', 'bb', 'f', 'c', 'g', 'd', 'a', 'e', 'b', 'f#', 'c#', 'g#', 'd#', 'a#']]; - var _sflen = sf.length; - var note = sf || 'C'; - - if (sf[0] === sf[0].toLowerCase()) mode = 1; - - if (_sflen > 1) { - switch (sf.charAt(_sflen - 1)) { - case 'm': - mode = 1; - note = sf.charAt(0).toLowerCase(); - note = note.concat(sf.substring(1, _sflen - 1)); - break; - case '-': - mode = 1; - note = sf.charAt(0).toLowerCase(); - note = note.concat(sf.substring(1, _sflen - 1)); - break; - case 'M': - mode = 0; - note = sf.charAt(0).toUpperCase(); - note = note.concat(sf.substring(1, _sflen - 1)); - break; - case '+': - mode = 0; - note = sf.charAt(0).toUpperCase(); - note = note.concat(sf.substring(1, _sflen - 1)); - break; - } - } - - var fifthindex = fifths[mode].indexOf(note); - sf = fifthindex === -1 ? 0 : fifthindex - 7; - } - - event.data = event.data.concat(Utils.numberToBytes(sf, 1)); // Number of sharp or flats ( < 0 flat; > 0 sharp) - event.data = event.data.concat(Utils.numberToBytes(mode, 1)); // Mode: 0 major, 1 minor - return this.addEvent(event); - } - - /** - * Adds text to MIDI file. - * @param {string} text - Text to add. - * @return {Track} - */ - - }, { - key: 'addText', - value: function addText(text) { - var event = new MetaEvent({ data: [Constants.META_TEXT_ID] }); - var stringBytes = Utils.stringToBytes(text); - event.data = event.data.concat(Utils.numberToVariableLength(stringBytes.length)); // Size - event.data = event.data.concat(stringBytes); // Text - return this.addEvent(event); - } - - /** - * Adds copyright to MIDI file. - * @param {string} text - Text of copyright line. - * @return {Track} - */ - - }, { - key: 'addCopyright', - value: function addCopyright(text) { - var event = new MetaEvent({ data: [Constants.META_COPYRIGHT_ID] }); - var stringBytes = Utils.stringToBytes(text); - event.data = event.data.concat(Utils.numberToVariableLength(stringBytes.length)); // Size - event.data = event.data.concat(stringBytes); // Text - return this.addEvent(event); - } - - /** - * Adds Sequence/Track Name. - * @param {string} text - Text of track name. - * @return {Track} - */ - - }, { - key: 'addTrackName', - value: function addTrackName(text) { - var event = new MetaEvent({ data: [Constants.META_TRACK_NAME_ID] }); - var stringBytes = Utils.stringToBytes(text); - event.data = event.data.concat(Utils.numberToVariableLength(stringBytes.length)); // Size - event.data = event.data.concat(stringBytes); // Text - return this.addEvent(event); - } - - /** - * Sets instrument name of track. - * @param {string} text - Name of instrument. - * @return {Track} - */ - - }, { - key: 'addInstrumentName', - value: function addInstrumentName(text) { - var event = new MetaEvent({ data: [Constants.META_INSTRUMENT_NAME_ID] }); - var stringBytes = Utils.stringToBytes(text); - event.data = event.data.concat(Utils.numberToVariableLength(stringBytes.length)); // Size - event.data = event.data.concat(stringBytes); // Text - return this.addEvent(event); - } - - /** - * Adds marker to MIDI file. - * @param {string} text - Marker text. - * @return {Track} - */ - - }, { - key: 'addMarker', - value: function addMarker(text) { - var event = new MetaEvent({ data: [Constants.META_MARKER_ID] }); - var stringBytes = Utils.stringToBytes(text); - event.data = event.data.concat(Utils.numberToVariableLength(stringBytes.length)); // Size - event.data = event.data.concat(stringBytes); // Text - return this.addEvent(event); - } - - /** - * Adds cue point to MIDI file. - * @param {string} text - Text of cue point. - * @return {Track} - */ - - }, { - key: 'addCuePoint', - value: function addCuePoint(text) { - var event = new MetaEvent({ data: [Constants.META_CUE_POINT] }); - var stringBytes = Utils.stringToBytes(text); - event.data = event.data.concat(Utils.numberToVariableLength(stringBytes.length)); // Size - event.data = event.data.concat(stringBytes); // Text - return this.addEvent(event); - } - - /** - * Adds lyric to MIDI file. - * @param {string} lyric - Lyric text to add. - * @return {Track} - */ - - }, { - key: 'addLyric', - value: function addLyric(lyric) { - var event = new MetaEvent({ data: [Constants.META_LYRIC_ID] }); - var stringBytes = Utils.stringToBytes(lyric); - event.data = event.data.concat(Utils.numberToVariableLength(stringBytes.length)); // Size - event.data = event.data.concat(stringBytes); // Lyric - return this.addEvent(event); - } - - /** - * Channel mode messages - * @return {Track} - */ - - }, { - key: 'polyModeOn', - value: function polyModeOn() { - var event = new NoteOnEvent({ data: [0x00, 0xB0, 0x7E, 0x00] }); - return this.addEvent(event); - } - }]); - - return Track; -}(); - -exports.Track = Track; - -/** - * Static utility functions used throughout the library. - */ -var Utils = function () { - function Utils() { - _classCallCheck(this, Utils); - } - - _createClass(Utils, null, [{ - key: 'version', - - - /** - * Gets MidiWriterJS version number. - * @return {string} - */ - value: function version() { - return Constants.VERSION; - } - - /** - * Convert a string to an array of bytes - * @param {string} string - * @return {array} - */ - - }, { - key: 'stringToBytes', - value: function stringToBytes(string) { - return string.split('').map(function (char) { - return char.charCodeAt(); - }); - } - - /** - * Checks if argument is a valid number. - * @param {*} n - Value to check - * @return {boolean} - */ - - }, { - key: 'isNumeric', - value: function isNumeric(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - /** - * Returns the correct MIDI number for the specified pitch. - * Uses Tonal Midi - https://github.com/danigb/tonal/tree/master/packages/midi - * @param {(string|number)} pitch - 'C#4' or midi note code - * @return {number} - */ - - }, { - key: 'getPitch', - value: function getPitch(pitch) { - return (0, _tonalMidi.toMidi)(pitch); - } - - /** - * Translates number of ticks to MIDI timestamp format, returning an array of - * hex strings with the time values. Midi has a very particular time to express time, - * take a good look at the spec before ever touching this function. - * Thanks to https://github.com/sergi/jsmidi - * - * @param {number} ticks - Number of ticks to be translated - * @return {array} - Bytes that form the MIDI time value - */ - - }, { - key: 'numberToVariableLength', - value: function numberToVariableLength(ticks) { - var buffer = ticks & 0x7F; - - while (ticks = ticks >> 7) { - buffer <<= 8; - buffer |= ticks & 0x7F | 0x80; - } - - var bList = []; - while (true) { - bList.push(buffer & 0xff); - - if (buffer & 0x80) buffer >>= 8;else { - break; - } - } - - return bList; - } - - /** - * Counts number of bytes in string - * @param {string} s - * @return {array} - */ - - }, { - key: 'stringByteCount', - value: function stringByteCount(s) { - return encodeURI(s).split(/%..|./).length - 1; - } - - /** - * Get an int from an array of bytes. - * @param {array} bytes - * @return {number} - */ - - }, { - key: 'numberFromBytes', - value: function numberFromBytes(bytes) { - var hex = ''; - var stringResult; - - bytes.forEach(function (byte) { - stringResult = byte.toString(16); - - // ensure string is 2 chars - if (stringResult.length == 1) stringResult = "0" + stringResult; - - hex += stringResult; - }); - - return parseInt(hex, 16); - } - - /** - * Takes a number and splits it up into an array of bytes. Can be padded by passing a number to bytesNeeded - * @param {number} number - * @param {number} bytesNeeded - * @return {array} - Array of bytes - */ - - }, { - key: 'numberToBytes', - value: function numberToBytes(number, bytesNeeded) { - bytesNeeded = bytesNeeded || 1; - - var hexString = number.toString(16); - - if (hexString.length & 1) { - // Make sure hex string is even number of chars - hexString = '0' + hexString; - } - - // Split hex string into an array of two char elements - var hexArray = hexString.match(/.{2}/g); - - // Now parse them out as integers - hexArray = hexArray.map(function (item) { - return parseInt(item, 16); - }); - - // Prepend empty bytes if we don't have enough - if (hexArray.length < bytesNeeded) { - while (bytesNeeded - hexArray.length > 0) { - hexArray.unshift(0); - } - } - - return hexArray; - } - - /** - * Converts value to array if needed. - * @param {string} value - * @return {array} - */ - - }, { - key: 'toArray', - value: function toArray(value) { - if (Array.isArray(value)) return value; - return [value]; - } - }]); - - return Utils; -}(); - -exports.Utils = Utils; - -var VexFlow = function () { - function VexFlow() { - _classCallCheck(this, VexFlow); - } - // code... - - - /** - * Support for converting VexFlow voice into MidiWriterJS track - * @return MidiWritier.Track object - */ - - - _createClass(VexFlow, [{ - key: 'trackFromVoice', - value: function trackFromVoice(voice) { - var track = new Track(); - var wait; - var pitches = []; - - voice.tickables.forEach(function (tickable) { - pitches = []; - - if (tickable.noteType === 'n') { - tickable.keys.forEach(function (key) { - // build array of pitches - pitches.push(this.convertPitch(key)); - }); - } else if (tickable.noteType === 'r') { - // move on to the next tickable and use this rest as a `wait` property for the next event - wait = this.convertDuration(tickable); - return; - } - - track.addEvent(new NoteEvent({ pitch: pitches, duration: this.convertDuration(tickable), wait: wait })); - - // reset wait - wait = 0; - }); - - return track; - } - - /** - * Converts VexFlow pitch syntax to MidiWriterJS syntax - * @param pitch string - */ - - }, { - key: 'convertPitch', - value: function convertPitch(pitch) { - return pitch.replace('/', ''); - } - - /** - * Converts VexFlow duration syntax to MidiWriterJS syntax - * @param note struct from VexFlow - */ - - }, { - key: 'convertDuration', - value: function convertDuration(note) { - switch (note.duration) { - case 'w': - return '1'; - case 'h': - return note.isDotted() ? 'd2' : '2'; - case 'q': - return note.isDotted() ? 'd4' : '4'; - case '8': - return note.isDotted() ? 'd8' : '8'; - } - - return note.duration; - } - }]); - - return VexFlow; -}(); - -exports.VexFlow = VexFlow; -/** - * Object that puts together tracks and provides methods for file output. - * @param {array} tracks - An array of {Track} objects. - * @return {Writer} - */ - -var Writer = function () { - function Writer(tracks) { - _classCallCheck(this, Writer); - - this.data = []; - - var trackType = tracks.length > 1 ? Constants.HEADER_CHUNK_FORMAT1 : Constants.HEADER_CHUNK_FORMAT0; - var numberOfTracks = Utils.numberToBytes(tracks.length, 2); // two bytes long - - // Header chunk - this.data.push(new Chunk({ - type: Constants.HEADER_CHUNK_TYPE, - data: trackType.concat(numberOfTracks, Constants.HEADER_CHUNK_DIVISION) })); - - // Track chunks - tracks.forEach(function (track, i) { - track.addEvent(new MetaEvent({ data: Constants.META_END_OF_TRACK_ID })); - this.data.push(track); - }, this); - } - - /** - * Builds the file into a Uint8Array - * @return {Uint8Array} - */ - - - _createClass(Writer, [{ - key: 'buildFile', - value: function buildFile() { - var build = []; - - // Data consists of chunks which consists of data - this.data.forEach(function (d) { - return build = build.concat(d.type, d.size, d.data); - }); - - return new Uint8Array(build); - } - - /** - * Convert file buffer to a base64 string. Different methods depending on if browser or node. - * @return {string} - */ - - }, { - key: 'base64', - value: function base64() { - if (typeof btoa === 'function') return btoa(String.fromCharCode.apply(null, this.buildFile())); - return new Buffer(this.buildFile()).toString('base64'); - } - - /** - * Get the data URI. - * @return {string} - */ - - }, { - key: 'dataUri', - value: function dataUri() { - return 'data:audio/midi;base64,' + this.base64(); - } - - /** - * Output to stdout - * @return {string} - */ - - }, { - key: 'stdout', - value: function stdout() { - return process.stdout.write(new Buffer(this.buildFile())); - } - - /** - * Save to MIDI file - * @param {string} filename - */ - - }, { - key: 'saveMIDI', - value: function saveMIDI(filename) { - var buffer = new Buffer(this.buildFile()); - fs.writeFile(filename + '.mid', buffer, function (err) { - if (err) return console.log(err); - }); - } - }]); - - return Writer; -}(); - -exports.Writer = Writer; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkNodW5rIiwiZmllbGRzIiwidHlwZSIsImRhdGEiLCJzaXplIiwibGVuZ3RoIiwiQ29uc3RhbnRzIiwiVkVSU0lPTiIsIkhFQURFUl9DSFVOS19UWVBFIiwiSEVBREVSX0NIVU5LX0xFTkdUSCIsIkhFQURFUl9DSFVOS19GT1JNQVQwIiwiSEVBREVSX0NIVU5LX0ZPUk1BVDEiLCJIRUFERVJfQ0hVTktfRElWSVNJT04iLCJUUkFDS19DSFVOS19UWVBFIiwiTUVUQV9FVkVOVF9JRCIsIk1FVEFfVEVYVF9JRCIsIk1FVEFfQ09QWVJJR0hUX0lEIiwiTUVUQV9UUkFDS19OQU1FX0lEIiwiTUVUQV9JTlNUUlVNRU5UX05BTUVfSUQiLCJNRVRBX0xZUklDX0lEIiwiTUVUQV9NQVJLRVJfSUQiLCJNRVRBX0NVRV9QT0lOVCIsIk1FVEFfVEVNUE9fSUQiLCJNRVRBX1NNVFBFX09GRlNFVCIsIk1FVEFfVElNRV9TSUdOQVRVUkVfSUQiLCJNRVRBX0tFWV9TSUdOQVRVUkVfSUQiLCJNRVRBX0VORF9PRl9UUkFDS19JRCIsIkNPTlRST0xMRVJfQ0hBTkdFX1NUQVRVUyIsIlBST0dSQU1fQ0hBTkdFX1NUQVRVUyIsIkNvbnRyb2xsZXJDaGFuZ2VFdmVudCIsIlV0aWxzIiwibnVtYmVyVG9WYXJpYWJsZUxlbmd0aCIsImNvbmNhdCIsImNvbnRyb2xsZXJOdW1iZXIiLCJjb250cm9sbGVyVmFsdWUiLCJNZXRhRXZlbnQiLCJOb3RlRXZlbnQiLCJwaXRjaCIsInRvQXJyYXkiLCJ3YWl0IiwiZHVyYXRpb24iLCJzZXF1ZW50aWFsIiwidmVsb2NpdHkiLCJjaGFubmVsIiwicmVwZWF0IiwiY29udmVydFZlbG9jaXR5IiwiZ3JhY2UiLCJidWlsZERhdGEiLCJ0aWNrRHVyYXRpb24iLCJnZXRUaWNrRHVyYXRpb24iLCJyZXN0RHVyYXRpb24iLCJncmFjZUR1cmF0aW9uIiwiZm9yRWFjaCIsIm5vdGVFdmVudCIsIm5vdGVPbiIsIm5vdGVPZmYiLCJBcnJheSIsImlzQXJyYXkiLCJqIiwicCIsImkiLCJOb3RlT25FdmVudCIsImdldE5vdGVPblN0YXR1cyIsImdldFBpdGNoIiwiTm90ZU9mZkV2ZW50IiwiZ2V0Tm90ZU9mZlN0YXR1cyIsInF1YXJ0ZXJUaWNrcyIsIm51bWJlckZyb21CeXRlcyIsIk1hdGgiLCJyb3VuZCIsIm1hcCIsInZhbHVlIiwicmVkdWNlIiwiYSIsImIiLCJ0b1N0cmluZyIsInRvTG93ZXJDYXNlIiwiY2hhckF0IiwicGFyc2VJbnQiLCJzdWJzdHJpbmciLCJnZXREdXJhdGlvbk11bHRpcGxpZXIiLCJQcm9ncmFtQ2hhbmdlRXZlbnQiLCJpbnN0cnVtZW50IiwiVHJhY2siLCJldmVudHMiLCJldmVudCIsIm1hcEZ1bmN0aW9uIiwiZSIsInByb3BlcnRpZXMiLCJudW1iZXJUb0J5dGVzIiwicHVzaCIsImJwbSIsInRlbXBvIiwiYWRkRXZlbnQiLCJudW1lcmF0b3IiLCJkZW5vbWluYXRvciIsIm1pZGljbG9ja3NwZXJ0aWNrIiwibm90ZXNwZXJtaWRpY2xvY2siLCJfZGVub21pbmF0b3IiLCJsb2cyIiwic2YiLCJtaSIsIm1vZGUiLCJmaWZ0aHMiLCJfc2ZsZW4iLCJub3RlIiwidG9VcHBlckNhc2UiLCJmaWZ0aGluZGV4IiwiaW5kZXhPZiIsInRleHQiLCJzdHJpbmdCeXRlcyIsInN0cmluZ1RvQnl0ZXMiLCJseXJpYyIsInN0cmluZyIsInNwbGl0IiwiY2hhciIsImNoYXJDb2RlQXQiLCJuIiwiaXNOYU4iLCJwYXJzZUZsb2F0IiwiaXNGaW5pdGUiLCJ0aWNrcyIsImJ1ZmZlciIsImJMaXN0IiwicyIsImVuY29kZVVSSSIsImJ5dGVzIiwiaGV4Iiwic3RyaW5nUmVzdWx0IiwiYnl0ZSIsIm51bWJlciIsImJ5dGVzTmVlZGVkIiwiaGV4U3RyaW5nIiwiaGV4QXJyYXkiLCJtYXRjaCIsIml0ZW0iLCJ1bnNoaWZ0IiwiVmV4RmxvdyIsInZvaWNlIiwidHJhY2siLCJwaXRjaGVzIiwidGlja2FibGVzIiwidGlja2FibGUiLCJub3RlVHlwZSIsImtleXMiLCJrZXkiLCJjb252ZXJ0UGl0Y2giLCJjb252ZXJ0RHVyYXRpb24iLCJyZXBsYWNlIiwiaXNEb3R0ZWQiLCJXcml0ZXIiLCJ0cmFja3MiLCJ0cmFja1R5cGUiLCJudW1iZXJPZlRyYWNrcyIsImJ1aWxkIiwiZCIsIlVpbnQ4QXJyYXkiLCJidG9hIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiYXBwbHkiLCJidWlsZEZpbGUiLCJCdWZmZXIiLCJiYXNlNjQiLCJwcm9jZXNzIiwic3Rkb3V0Iiwid3JpdGUiLCJmaWxlbmFtZSIsImZzIiwid3JpdGVGaWxlIiwiZXJyIiwiY29uc29sZSIsImxvZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFza0JBOzs7O0FBdGtCQTs7Ozs7SUFLTUEsSyxHQUNMLGVBQVlDLE1BQVosRUFBb0I7QUFBQTs7QUFDbkIsTUFBS0MsSUFBTCxHQUFZRCxPQUFPQyxJQUFuQjtBQUNBLE1BQUtDLElBQUwsR0FBWUYsT0FBT0UsSUFBbkI7QUFDQSxNQUFLQyxJQUFMLEdBQVksQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVUgsT0FBT0UsSUFBUCxDQUFZRSxNQUF0QixDQUFaO0FBQ0EsQzs7UUFHTUwsSyxHQUFBQSxLO0FBQ1I7Ozs7O0FBS0EsSUFBSU0sWUFBWTtBQUNmQyxVQUFjLE9BREM7QUFFZkMsb0JBQXVCLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLENBRlIsRUFFa0M7QUFDakRDLHNCQUF3QixDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsSUFBYixFQUFtQixJQUFuQixDQUhULEVBR21DO0FBQ2xEQyx1QkFBMEIsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUpYLEVBSXlCO0FBQ3hDQyx1QkFBMEIsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUxYLEVBS3lCO0FBQ3hDQyx3QkFBMEIsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQU5YLEVBTXlCO0FBQ3hDQyxtQkFBb0IsQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFh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QUFLQyxPQUFPQyxZQUFQLENBQW9CQyxLQUFwQixDQUEwQixJQUExQixFQUFnQyxLQUFLQyxTQUFMLEVBQWhDLENBQUwsQ0FBUDtBQUNoQyxVQUFPLElBQUlDLE1BQUosQ0FBVyxLQUFLRCxTQUFMLEVBQVgsRUFBNkJ0RixRQUE3QixDQUFzQyxRQUF0QyxDQUFQO0FBQ0E7O0FBRUU7Ozs7Ozs7NEJBSVU7QUFDVCxVQUFPLDRCQUE0QixLQUFLd0YsTUFBTCxFQUFuQztBQUNBOztBQUVKOzs7Ozs7OzJCQUlZO0FBQ1IsVUFBT0MsUUFBUUMsTUFBUixDQUFlQyxLQUFmLENBQXFCLElBQUlKLE1BQUosQ0FBVyxLQUFLRCxTQUFMLEVBQVgsQ0FBckIsQ0FBUDtBQUNBOztBQUVKOzs7Ozs7OzJCQUlTTSxRLEVBQVU7QUFDbEIsT0FBSTdDLFNBQVMsSUFBSXdDLE1BQUosQ0FBVyxLQUFLRCxTQUFMLEVBQVgsQ0FBYjtBQUNBTyxNQUFHQyxTQUFILENBQWFGLFdBQVcsTUFBeEIsRUFBZ0M3QyxNQUFoQyxFQUF3QyxVQUFVZ0QsR0FBVixFQUFlO0FBQ3RELFFBQUdBLEdBQUgsRUFBUSxPQUFPQyxRQUFRQyxHQUFSLENBQVlGLEdBQVosQ0FBUDtBQUNSLElBRkQ7QUFHQTs7Ozs7O1FBR01wQixNLEdBQUFBLE0iLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2h1bmsgc2VjdGlvbiBvZiBhIE1JREkgZmlsZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZHMgLSB7dHlwZTogbnVtYmVyLCBkYXRhOiBhcnJheSwgc2l6ZTogYXJyYXl9XG4gKiBAcmV0dXJuIHtDaHVua31cbiAqL1xuY2xhc3MgQ2h1bmsge1xuXHRjb25zdHJ1Y3RvcihmaWVsZHMpIHtcblx0XHR0aGlzLnR5cGUgPSBmaWVsZHMudHlwZTtcblx0XHR0aGlzLmRhdGEgPSBmaWVsZHMuZGF0YTtcblx0XHR0aGlzLnNpemUgPSBbMCwgMCwgMCwgZmllbGRzLmRhdGEubGVuZ3RoXTtcblx0fVxufVxuXG5leHBvcnQge0NodW5rfTtcbi8qKlxuICogTUlESSBmaWxlIGZvcm1hdCBjb25zdGFudHMsIGluY2x1ZGluZyBub3RlIC0+IE1JREkgbnVtYmVyIHRyYW5zbGF0aW9uLlxuICogQHJldHVybiB7Q29uc3RhbnRzfVxuICovXG5cbnZhciBDb25zdGFudHMgPSB7XG5cdFZFUlNJT05cdFx0XHRcdFx0OiAnMS41LjInLFxuXHRIRUFERVJfQ0hVTktfVFlQRSAgXHRcdDogWzB4NGQsIDB4NTQsIDB4NjgsIDB4NjRdLCAvLyBNdGhkXG5cdEhFQURFUl9DSFVOS19MRU5HVEggIFx0OiBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNl0sIC8vIEhlYWRlciBzaXplIGZvciBTTUZcblx0SEVBREVSX0NIVU5LX0ZPUk1BVDAgICAgOiBbMHgwMCwgMHgwMF0sIC8vIE1pZGkgVHlwZSAwIGlkXG5cdEhFQURFUl9DSFVOS19GT1JNQVQxICAgIDogWzB4MDAsIDB4MDFdLCAvLyBNaWRpIFR5cGUgMSBpZFxuXHRIRUFERVJfQ0hVTktfRElWSVNJT04gICA6IFsweDAwLCAweDgwXSwgLy8gRGVmYXVsdHMgdG8gMTI4IHRpY2tzIHBlciBiZWF0XG5cdFRSQUNLX0NIVU5LX1RZUEVcdFx0OiBbMHg0ZCwgMHg1NCwgMHg3MiwgMHg2Yl0sIC8vIE1UcmssXG5cdE1FVEFfRVZFTlRfSURcdFx0XHQ6IDB4RkYsXG5cdE1FVEFfVEVYVF9JRFx0XHRcdDogMHgwMSxcblx0TUVUQV9DT1BZUklHSFRfSURcdFx0OiAweDAyLFxuXHRNRVRBX1RSQUNLX05BTUVfSURcdFx0OiAweDAzLFxuXHRNRVRBX0lOU1RSVU1FTlRfTkFNRV9JRCA6IDB4MDQsXG5cdE1FVEFfTFlSSUNfSURcdFx0XHQ6IDB4MDUsXG5cdE1FVEFfTUFSS0VSX0lEXHRcdFx0OiAweDA2LFxuXHRNRVRBX0NVRV9QT0lOVFx0XHRcdDogMHgwNyxcblx0TUVUQV9URU1QT19JRFx0XHRcdDogMHg1MSxcblx0TUVUQV9TTVRQRV9PRkZTRVRcdFx0OiAweDU0LFxuXHRNRVRBX1RJTUVfU0lHTkFUVVJFX0lEXHQ6IDB4NTgsXG5cdE1FVEFfS0VZX1NJR05BVFVSRV9JRFx0OiAweDU5LFxuXHRNRVRBX0VORF9PRl9UUkFDS19JRFx0OiBbMHgyRiwgMHgwMF0sXG5cdENPTlRST0xMRVJfQ0hBTkdFX1NUQVRVUzogMHhCMCwgLy8gaW5jbHVkZXMgY2hhbm5lbCBudW1iZXIgKDApXG5cdFBST0dSQU1fQ0hBTkdFX1NUQVRVU1x0OiAweEMwLCAvLyBpbmNsdWRlcyBjaGFubmVsIG51bWJlciAoMClcbn07XG5cbmV4cG9ydCB7Q29uc3RhbnRzfTtcbi8qKlxuICogSG9sZHMgYWxsIGRhdGEgZm9yIGEgXCJjb250cm9sbGVyIGNoYW5nZVwiIE1JREkgZXZlbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZHMge2NvbnRyb2xsZXJOdW1iZXI6IGludGVnZXIsIGNvbnRyb2xsZXJWYWx1ZTogaW50ZWdlcn1cbiAqIEByZXR1cm4ge0NvbnRyb2xsZXJDaGFuZ2VFdmVudH1cbiAqL1xuY2xhc3MgQ29udHJvbGxlckNoYW5nZUV2ZW50IHtcblx0Y29uc3RydWN0b3IoZmllbGRzKSB7XG5cdFx0dGhpcy50eXBlID0gJ2NvbnRyb2xsZXInO1xuXHRcdC8vIGRlbHRhIHRpbWUgZGVmYXVsdHMgdG8gMC5cblx0XHR0aGlzLmRhdGEgPSBVdGlscy5udW1iZXJUb1ZhcmlhYmxlTGVuZ3RoKDB4MDApLmNvbmNhdChDb25zdGFudHMuQ09OVFJPTExFUl9DSEFOR0VfU1RBVFVTLCBmaWVsZHMuY29udHJvbGxlck51bWJlciwgZmllbGRzLmNvbnRyb2xsZXJWYWx1ZSk7XG5cdH1cbn1cblxuZXhwb3J0IHtDb250cm9sbGVyQ2hhbmdlRXZlbnR9O1xuLyoqXG4gKiBPYmplY3QgcmVwcmVzZW50YXRpb24gb2YgYSBtZXRhIGV2ZW50LlxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkcyAtIHR5cGUsIGRhdGFcbiAqIEByZXR1cm4ge01ldGFFdmVudH1cbiAqL1xuY2xhc3MgTWV0YUV2ZW50IHtcblx0Y29uc3RydWN0b3IoZmllbGRzKSB7XG5cdFx0dGhpcy50eXBlID0gJ21ldGEnO1xuXHRcdHRoaXMuZGF0YSA9IFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoMHgwMCk7Ly8gU3RhcnQgd2l0aCB6ZXJvIHRpbWUgZGVsdGFcblx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KENvbnN0YW50cy5NRVRBX0VWRU5UX0lELCBmaWVsZHMuZGF0YSk7XG5cdH1cbn1cblxuZXhwb3J0IHtNZXRhRXZlbnR9O1xuLyoqXG4gKiBXcmFwcGVyIGZvciBub3RlT25FdmVudC9ub3RlT2ZmRXZlbnQgb2JqZWN0cyB0aGF0IGJ1aWxkcyBib3RoIGV2ZW50cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZHMgLSB7cGl0Y2g6ICdbQzRdJywgZHVyYXRpb246ICc0Jywgd2FpdDogJzQnLCB2ZWxvY2l0eTogMS0xMDB9XG4gKiBAcmV0dXJuIHtOb3RlRXZlbnR9XG4gKi9cbmNsYXNzIE5vdGVFdmVudCB7XG5cdGNvbnN0cnVjdG9yKGZpZWxkcykge1xuXHRcdHRoaXMudHlwZSBcdFx0PSAnbm90ZSc7XG5cdFx0dGhpcy5waXRjaCBcdFx0PSBVdGlscy50b0FycmF5KGZpZWxkcy5waXRjaCk7XG5cdFx0dGhpcy53YWl0IFx0XHQ9IGZpZWxkcy53YWl0IHx8IDA7XG5cdFx0dGhpcy5kdXJhdGlvbiBcdD0gZmllbGRzLmR1cmF0aW9uO1xuXHRcdHRoaXMuc2VxdWVudGlhbCA9IGZpZWxkcy5zZXF1ZW50aWFsIHx8IGZhbHNlO1xuXHRcdHRoaXMudmVsb2NpdHkgXHQ9IGZpZWxkcy52ZWxvY2l0eSB8fCA1MDtcblx0XHR0aGlzLmNoYW5uZWwgXHQ9IGZpZWxkcy5jaGFubmVsIHx8IDE7XG5cdFx0dGhpcy5yZXBlYXQgXHQ9IGZpZWxkcy5yZXBlYXQgfHwgMTtcblx0XHR0aGlzLnZlbG9jaXR5IFx0PSB0aGlzLmNvbnZlcnRWZWxvY2l0eSh0aGlzLnZlbG9jaXR5KTtcblx0XHR0aGlzLmdyYWNlXHRcdD0gZmllbGRzLmdyYWNlO1xuXHRcdHRoaXMuYnVpbGREYXRhKCk7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGludCBhcnJheSBmb3IgdGhpcyBldmVudC5cblx0ICogQHJldHVybiB7Tm90ZUV2ZW50fVxuXHQgKi9cblx0YnVpbGREYXRhKCkge1xuXHRcdHRoaXMuZGF0YSA9IFtdO1xuXG5cdFx0dmFyIHRpY2tEdXJhdGlvbiA9IHRoaXMuZ2V0VGlja0R1cmF0aW9uKHRoaXMuZHVyYXRpb24sICdub3RlJyk7XG5cdFx0dmFyIHJlc3REdXJhdGlvbiA9IHRoaXMuZ2V0VGlja0R1cmF0aW9uKHRoaXMud2FpdCwgJ3Jlc3QnKTtcblxuXHRcdC8vIEFwcGx5IGdyYWNlIG5vdGUocykgYW5kIHN1YnRyYWN0IHRpY2tzIChjdXJyZW50bHkgMSB0aWNrIHBlciBncmFjZSBub3RlKSBmcm9tIHRpY2tEdXJhdGlvbiBzbyBuZXQgdmFsdWUgaXMgdGhlIHNhbWVcblx0XHRpZiAodGhpcy5ncmFjZSkge1xuXHRcdFx0bGV0IGdyYWNlRHVyYXRpb24gPSAxO1xuXHRcdFx0dGhpcy5ncmFjZSA9IFV0aWxzLnRvQXJyYXkodGhpcy5ncmFjZSk7XG5cdFx0XHR0aGlzLmdyYWNlLmZvckVhY2goZnVuY3Rpb24ocGl0Y2gpIHtcblx0XHRcdFx0bGV0IG5vdGVFdmVudCA9IG5ldyBOb3RlRXZlbnQoe3BpdGNoOnRoaXMuZ3JhY2UsIGR1cmF0aW9uOidUJyArIGdyYWNlRHVyYXRpb259KTtcblx0XHRcdFx0dGhpcy5kYXRhID0gdGhpcy5kYXRhLmNvbmNhdChub3RlRXZlbnQuZGF0YSlcblxuXHRcdFx0XHR0aWNrRHVyYXRpb24gLT0gZ3JhY2VEdXJhdGlvbjtcblx0XHRcdH0sIHRoaXMpO1xuXHRcdH1cblxuXHRcdC8vIGZpZWxkcy5waXRjaCBjb3VsZCBiZSBhbiBhcnJheSBvZiBwaXRjaGVzLlxuXHRcdC8vIElmIHNvIGNyZWF0ZSBub3RlIGV2ZW50cyBmb3IgZWFjaCBhbmQgYXBwbHkgdGhlIHNhbWUgZHVyYXRpb24uXG5cdFx0dmFyIG5vdGVPbiwgbm90ZU9mZjtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnBpdGNoKSkge1xuXHRcdFx0Ly8gQnkgZGVmYXVsdCB0aGlzIGlzIGEgY2hvcmQgaWYgaXQncyBhbiBhcnJheSBvZiBub3RlcyB0aGF0IHJlcXVpcmVzIG9uZSBOb3RlT25FdmVudC5cblx0XHRcdC8vIElmIHRoaXMuc2VxdWVudGlhbCA9PT0gdHJ1ZSB0aGVuIGl0J3MgYSBzZXF1ZW50aWFsIHN0cmluZyBvZiBub3RlcyB0aGF0IHJlcXVpcmVzIHNlcGFyYXRlIE5vdGVPbkV2ZW50cy5cblx0XHRcdGlmICggISB0aGlzLnNlcXVlbnRpYWwpIHtcblx0XHRcdFx0Ly8gSGFuZGxlIHJlcGVhdFxuXHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMucmVwZWF0OyBqKyspIHtcblx0XHRcdFx0XHQvLyBOb3RlIG9uXG5cdFx0XHRcdFx0dGhpcy5waXRjaC5mb3JFYWNoKGZ1bmN0aW9uKHAsIGkpIHtcblx0XHRcdFx0XHRcdGlmIChpID09IDApIHtcblx0XHRcdFx0XHRcdFx0bm90ZU9uID0gbmV3IE5vdGVPbkV2ZW50KHtkYXRhOiBVdGlscy5udW1iZXJUb1ZhcmlhYmxlTGVuZ3RoKHJlc3REdXJhdGlvbikuY29uY2F0KHRoaXMuZ2V0Tm90ZU9uU3RhdHVzKCksIFV0aWxzLmdldFBpdGNoKHApLCB0aGlzLnZlbG9jaXR5KX0pO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBSdW5uaW5nIHN0YXR1cyAoY2FuIG9tbWl0IHRoZSBub3RlIG9uIHN0YXR1cylcblx0XHRcdFx0XHRcdFx0bm90ZU9uID0gbmV3IE5vdGVPbkV2ZW50KHtkYXRhOiBbMCwgVXRpbHMuZ2V0UGl0Y2gocCksIHRoaXMudmVsb2NpdHldfSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQobm90ZU9uLmRhdGEpO1xuXHRcdFx0XHRcdH0sIHRoaXMpO1xuXG5cdFx0XHRcdFx0Ly8gTm90ZSBvZmZcblx0XHRcdFx0XHR0aGlzLnBpdGNoLmZvckVhY2goZnVuY3Rpb24ocCwgaSkge1xuXHRcdFx0XHRcdFx0aWYgKGkgPT0gMCkge1xuXHRcdFx0XHRcdFx0XHRub3RlT2ZmID0gbmV3IE5vdGVPZmZFdmVudCh7ZGF0YTogVXRpbHMubnVtYmVyVG9WYXJpYWJsZUxlbmd0aCh0aWNrRHVyYXRpb24pLmNvbmNhdCh0aGlzLmdldE5vdGVPZmZTdGF0dXMoKSwgVXRpbHMuZ2V0UGl0Y2gocCksIHRoaXMudmVsb2NpdHkpfSk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJ1bm5pbmcgc3RhdHVzIChjYW4gb21taXQgdGhlIG5vdGUgb2ZmIHN0YXR1cylcblx0XHRcdFx0XHRcdFx0bm90ZU9mZiA9IG5ldyBOb3RlT2ZmRXZlbnQoe2RhdGE6IFswLCBVdGlscy5nZXRQaXRjaChwKSwgdGhpcy52ZWxvY2l0eV19KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dGhpcy5kYXRhID0gdGhpcy5kYXRhLmNvbmNhdChub3RlT2ZmLmRhdGEpO1xuXHRcdFx0XHRcdH0sIHRoaXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEhhbmRsZSByZXBlYXRcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnJlcGVhdDsgaisrKSB7XG5cdFx0XHRcdFx0dGhpcy5waXRjaC5mb3JFYWNoKGZ1bmN0aW9uKHAsIGkpIHtcblx0XHRcdFx0XHRcdC8vIHJlc3REdXJhdGlvbiBvbmx5IGFwcGxpZXMgdG8gZmlyc3Qgbm90ZVxuXHRcdFx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3REdXJhdGlvbiA9IDA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIElmIGR1cmF0aW9uIGlzIDh0aCB0cmlwbGV0cyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0b3RhbCB0aWNrcyA9PSBxdWFydGVyIG5vdGUuXG5cdFx0XHRcdFx0XHQvLyBTbywgdGhlIGxhc3Qgb25lIHdpbGwgbmVlZCB0byBiZSB0aGUgcmVtYWluZGVyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5kdXJhdGlvbiA9PT0gJzh0JyAmJiBpID09IHRoaXMucGl0Y2gubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRcdFx0XHRsZXQgcXVhcnRlclRpY2tzID0gVXRpbHMubnVtYmVyRnJvbUJ5dGVzKENvbnN0YW50cy5IRUFERVJfQ0hVTktfRElWSVNJT04pO1xuXHRcdFx0XHRcdFx0XHR0aWNrRHVyYXRpb24gPSBxdWFydGVyVGlja3MgLSAodGlja0R1cmF0aW9uICogMik7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdG5vdGVPbiA9IG5ldyBOb3RlT25FdmVudCh7ZGF0YTogVXRpbHMubnVtYmVyVG9WYXJpYWJsZUxlbmd0aChyZXN0RHVyYXRpb24pLmNvbmNhdChbdGhpcy5nZXROb3RlT25TdGF0dXMoKSwgVXRpbHMuZ2V0UGl0Y2gocCksIHRoaXMudmVsb2NpdHldKX0pO1xuXHRcdFx0XHRcdFx0bm90ZU9mZiA9IG5ldyBOb3RlT2ZmRXZlbnQoe2RhdGE6IFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgodGlja0R1cmF0aW9uKS5jb25jYXQoW3RoaXMuZ2V0Tm90ZU9mZlN0YXR1cygpLCBVdGlscy5nZXRQaXRjaChwKSwgdGhpcy52ZWxvY2l0eV0pfSk7XG5cblx0XHRcdFx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQobm90ZU9uLmRhdGEsIG5vdGVPZmYuZGF0YSk7XG5cdFx0XHRcdFx0fSwgdGhpcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0dGhyb3cgJ3BpdGNoIG11c3QgYmUgYW4gYXJyYXkuJztcblx0fTtcblxuXHQvKipcblx0ICogQ29udmVydHMgdmVsb2NpdHkgdG8gdmFsdWUgMC0xMjdcblx0ICogQHBhcmFtIHtudW1iZXJ9IHZlbG9jaXR5IC0gVmVsb2NpdHkgdmFsdWUgMS0xMDBcblx0ICogQHJldHVybiB7bnVtYmVyfVxuXHQgKi9cblx0Y29udmVydFZlbG9jaXR5KHZlbG9jaXR5KSB7XG5cdFx0Ly8gTWF4IHBhc3NlZCB2YWx1ZSBsaW1pdGVkIHRvIDEwMFxuXHRcdHZlbG9jaXR5ID0gdmVsb2NpdHkgPiAxMDAgPyAxMDAgOiB2ZWxvY2l0eTtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCh2ZWxvY2l0eSAvIDEwMCAqIDEyNyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiB0aWNrcyBiYXNlZCBvbiBwYXNzZWQgZHVyYXRpb24uXG5cdCAqIE5vdGU6IHR5cGU9PSdub3RlJyBkZWZhdWx0cyB0byBxdWFydGVyIG5vdGUsIHR5cGU9PT0ncmVzdCcgZGVmYXVsdHMgdG8gMFxuXHQgKiBAcGFyYW0geyhzdHJpbmd8YXJyYXkpfSBkdXJhdGlvblxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBbJ25vdGUnLCAncmVzdCddXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICovXG5cdGdldFRpY2tEdXJhdGlvbihkdXJhdGlvbiwgdHlwZSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KGR1cmF0aW9uKSkge1xuXHRcdFx0Ly8gUmVjdXJzaXZlbHkgZXhlY3V0ZSB0aGlzIG1ldGhvZCBmb3IgZWFjaCBpdGVtIGluIHRoZSBhcnJheSBhbmQgcmV0dXJuIHRoZSBzdW0gb2YgdGljayBkdXJhdGlvbnMuXG5cdFx0XHRyZXR1cm4gZHVyYXRpb24ubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldFRpY2tEdXJhdGlvbih2YWx1ZSwgdHlwZSk7XG5cdFx0XHR9LCB0aGlzKS5yZWR1Y2UoZnVuY3Rpb24oYSwgYikge1xuXHRcdFx0XHRyZXR1cm4gYSArIGI7XG5cdFx0XHR9LCAwKTtcblx0XHR9XG5cblx0XHRkdXJhdGlvbiA9IGR1cmF0aW9uLnRvU3RyaW5nKCk7XG5cblx0XHRpZiAoZHVyYXRpb24udG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICd0Jykge1xuXHRcdFx0Ly8gSWYgZHVyYXRpb24gc3RhcnRzIHdpdGggJ3QnIHRoZW4gdGhlIG51bWJlciB0aGF0IGZvbGxvd3MgaXMgYW4gZXhwbGljaXQgdGljayBjb3VudFxuXHRcdFx0cmV0dXJuIHBhcnNlSW50KGR1cmF0aW9uLnN1YnN0cmluZygxKSk7XG5cdFx0fVxuXG5cdFx0Ly8gTmVlZCB0byBhcHBseSBkdXJhdGlvbiBoZXJlLiAgUXVhcnRlciBub3RlID09IENvbnN0YW50cy5IRUFERVJfQ0hVTktfRElWSVNJT05cblx0XHQvLyBSb3VuZGluZyBvbmx5IGFwcGxpZXMgdG8gdHJpcGxldHMsIHdoaWNoIHRoZSByZW1haW5kZXIgaXMgaGFuZGxlZCBiZWxvd1xuXHRcdHZhciBxdWFydGVyVGlja3MgPSBVdGlscy5udW1iZXJGcm9tQnl0ZXMoQ29uc3RhbnRzLkhFQURFUl9DSFVOS19ESVZJU0lPTik7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQocXVhcnRlclRpY2tzICogdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoZHVyYXRpb24sIHR5cGUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHdoYXQgdG8gbXVsdGlwbGUgdGlja3MvcXVhcnRlciBub3RlIGJ5IHRvIGdldCB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uLlxuXHQgKiBOb3RlOiB0eXBlPT0nbm90ZScgZGVmYXVsdHMgdG8gcXVhcnRlciBub3RlLCB0eXBlPT09J3Jlc3QnIGRlZmF1bHRzIHRvIDBcblx0ICogQHBhcmFtIHtzdHJpbmd9IGR1cmF0aW9uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFsnbm90ZScsJ3Jlc3QnXVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuXHRnZXREdXJhdGlvbk11bHRpcGxpZXIoZHVyYXRpb24sIHR5cGUpIHtcblx0XHQvLyBOZWVkIHRvIGFwcGx5IGR1cmF0aW9uIGhlcmUuICBRdWFydGVyIG5vdGUgPT0gQ29uc3RhbnRzLkhFQURFUl9DSFVOS19ESVZJU0lPTlxuXHRcdHN3aXRjaCAoZHVyYXRpb24pIHtcblx0XHRcdGNhc2UgJzAnOlxuXHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdGNhc2UgJzEnOlxuXHRcdFx0XHRyZXR1cm4gNDtcblx0XHRcdGNhc2UgJzInOlxuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdGNhc2UgJ2QyJzpcblx0XHRcdFx0cmV0dXJuIDM7XG5cdFx0XHRjYXNlICc0Jzpcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRjYXNlICc0dCc6XG5cdFx0XHRcdHJldHVybiAwLjY2Njtcblx0XHRcdGNhc2UgJ2Q0Jzpcblx0XHRcdFx0cmV0dXJuIDEuNTtcblx0XHRcdGNhc2UgJzgnOlxuXHRcdFx0XHRyZXR1cm4gMC41O1xuXHRcdFx0Y2FzZSAnOHQnOlxuXHRcdFx0XHQvLyBGb3IgOHRoIHRyaXBsZXRzLCBsZXQncyBkaXZpZGUgYSBxdWFydGVyIGJ5IDMsIHJvdW5kIHRvIHRoZSBuZWFyZXN0IGludCwgYW5kIHN1YnN0cmFjdCB0aGUgcmVtYWluZGVyIHRvIHRoZSBsYXN0IG9uZS5cblx0XHRcdFx0cmV0dXJuIDAuMzM7XG5cdFx0XHRjYXNlICdkOCc6XG5cdFx0XHRcdHJldHVybiAwLjc1O1xuXHRcdFx0Y2FzZSAnMTYnOlxuXHRcdFx0XHRyZXR1cm4gMC4yNTtcblx0XHRcdGNhc2UgJzE2dCc6XG5cdFx0XHRcdHJldHVybiAwLjE2Njtcblx0XHRcdGNhc2UgJzMyJzpcblx0XHRcdFx0cmV0dXJuIDAuMTI1O1xuXHRcdFx0Y2FzZSAnNjQnOlxuXHRcdFx0XHRyZXR1cm4gMC4wNjI1O1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Ly8gTm90ZXMgZGVmYXVsdCB0byBhIHF1YXJ0ZXIsIHJlc3RzIGRlZmF1bHQgdG8gMFxuXHRcdFx0XHQvL3JldHVybiB0eXBlID09PSAnbm90ZScgPyAxIDogMDtcblx0XHR9XG5cblx0XHR0aHJvdyBkdXJhdGlvbiArICcgaXMgbm90IGEgdmFsaWQgZHVyYXRpb24uJztcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgbm90ZSBvbiBzdGF0dXMgY29kZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4gMHg5ezAtRn1cblx0ICogTm90ZSBvbiBhdCBjaGFubmVsIDAgaXMgMHg5MCAoMTQ0KVxuXHQgKiAwID0gQ2ggMVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuXHRnZXROb3RlT25TdGF0dXMoKSB7cmV0dXJuIDE0NCArIHRoaXMuY2hhbm5lbCAtIDF9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIG5vdGUgb2ZmIHN0YXR1cyBjb2RlIGJhc2VkIG9uIHRoZSBzZWxlY3RlZCBjaGFubmVsLiAweDh7MC1GfVxuXHQgKiBOb3RlIG9mZiBhdCBjaGFubmVsIDAgaXMgMHg4MCAoMTI4KVxuXHQgKiAwID0gQ2ggMVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9XG5cdCAqL1xuXHRnZXROb3RlT2ZmU3RhdHVzKCkge3JldHVybiAxMjggKyB0aGlzLmNoYW5uZWwgLSAxfVxufVxuXG5leHBvcnQge05vdGVFdmVudH07XG4vKipcbiAqIEhvbGRzIGFsbCBkYXRhIGZvciBhIFwibm90ZSBvZmZcIiBNSURJIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gZmllbGRzIHtkYXRhOiBbXX1cbiAqIEByZXR1cm4ge05vdGVPZmZFdmVudH1cbiAqL1xuY2xhc3MgTm90ZU9mZkV2ZW50IHtcblx0Y29uc3RydWN0b3IoZmllbGRzKSB7XG5cdFx0dGhpcy5kYXRhID0gZmllbGRzLmRhdGE7XG5cdH1cbn1cblxuZXhwb3J0IHtOb3RlT2ZmRXZlbnR9O1xuLyoqXG4gKiBIb2xkcyBhbGwgZGF0YSBmb3IgYSBcIm5vdGUgb25cIiBNSURJIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gZmllbGRzIHtkYXRhOiBbXX1cbiAqIEByZXR1cm4ge05vdGVPbkV2ZW50fVxuICovXG5jbGFzcyBOb3RlT25FdmVudCB7XG5cdGNvbnN0cnVjdG9yKGZpZWxkcykge1xuXHRcdHRoaXMuZGF0YSA9IGZpZWxkcy5kYXRhO1xuXHR9XG59XG5cbmV4cG9ydCB7Tm90ZU9uRXZlbnR9O1xuLyoqXG4gKiBIb2xkcyBhbGwgZGF0YSBmb3IgYSBcInByb2dyYW0gY2hhbmdlXCIgTUlESSBldmVudFxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkcyB7aW5zdHJ1bWVudDogaW50ZWdlcn1cbiAqIEByZXR1cm4ge1Byb2dyYW1DaGFuZ2VFdmVudH1cbiAqL1xuY2xhc3MgUHJvZ3JhbUNoYW5nZUV2ZW50IHtcblx0Y29uc3RydWN0b3IoZmllbGRzKSB7XG5cdFx0dGhpcy50eXBlID0gJ3Byb2dyYW0nO1xuXHRcdC8vIGRlbHRhIHRpbWUgZGVmYXVsdHMgdG8gMC5cblx0XHR0aGlzLmRhdGEgPSBVdGlscy5udW1iZXJUb1ZhcmlhYmxlTGVuZ3RoKDB4MDApLmNvbmNhdChDb25zdGFudHMuUFJPR1JBTV9DSEFOR0VfU1RBVFVTLCBmaWVsZHMuaW5zdHJ1bWVudCk7XG5cdH1cbn1cblxuZXhwb3J0IHtQcm9ncmFtQ2hhbmdlRXZlbnR9O1xuLyoqXG4gKiBIb2xkcyBhbGwgZGF0YSBmb3IgYSB0cmFjay5cbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZHMge3R5cGU6IG51bWJlciwgZGF0YTogYXJyYXksIHNpemU6IGFycmF5LCBldmVudHM6IGFycmF5fVxuICogQHJldHVybiB7VHJhY2t9XG4gKi9cbmNsYXNzIFRyYWNrIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy50eXBlID0gQ29uc3RhbnRzLlRSQUNLX0NIVU5LX1RZUEU7XG5cdFx0dGhpcy5kYXRhID0gW107XG5cdFx0dGhpcy5zaXplID0gW107XG5cdFx0dGhpcy5ldmVudHMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGFueSBldmVudCB0eXBlIHRvIHRoZSB0cmFjay5cblx0ICogQHBhcmFtIHsoTm90ZUV2ZW50fE1ldGFFdmVudHxQcm9ncmFtQ2hhbmdlRXZlbnQpfSBldmVudCAtIEV2ZW50IG9iamVjdC5cblx0ICogQHBhcmFtIHtmdW5jdGlvbn0gbWFwRnVuY3Rpb24gLSBDYWxsYmFjayB3aGljaCBjYW4gYmUgdXNlZCB0byBhcHBseSBzcGVjaWZpYyBwcm9wZXJ0aWVzIHRvIGFsbCBldmVudHMuIFxuXHQgKiBAcmV0dXJuIHtUcmFja31cblx0ICovXG5cdGFkZEV2ZW50KGV2ZW50LCBtYXBGdW5jdGlvbikge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuXHRcdFx0ZXZlbnQuZm9yRWFjaChmdW5jdGlvbihlLCBpKSB7XG5cdFx0XHRcdC8vIEhhbmRsZSBtYXAgZnVuY3Rpb24gaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKHR5cGVvZiBtYXBGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJyAmJiBlLnR5cGUgPT09ICdub3RlJykge1xuXHRcdFx0XHRcdHZhciBwcm9wZXJ0aWVzID0gbWFwRnVuY3Rpb24oaSwgZSk7XG5cblx0XHRcdFx0XHRpZiAodHlwZW9mIHByb3BlcnRpZXMgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0XHRmb3IgKHZhciBqIGluIHByb3BlcnRpZXMpIHtcblx0XHRcdFx0XHRcdFx0c3dpdGNoKGopIHtcblx0XHRcdFx0XHRcdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdFx0XHRcdFx0XHRlLmR1cmF0aW9uID0gcHJvcGVydGllc1tqXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3NlcXVlbnRpYWwnOlxuXHRcdFx0XHRcdFx0XHRcdFx0ZS5zZXF1ZW50aWFsID0gcHJvcGVydGllc1tqXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3ZlbG9jaXR5Jzpcblx0XHRcdFx0XHRcdFx0XHRcdGUudmVsb2NpdHkgPSBlLmNvbnZlcnRWZWxvY2l0eShwcm9wZXJ0aWVzW2pdKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XHRcdFxuXG5cdFx0XHRcdFx0XHQvLyBHb3R0YSBidWlsZCB0aGF0IGRhdGFcblx0XHRcdFx0XHRcdGUuYnVpbGREYXRhKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5kYXRhID0gdGhpcy5kYXRhLmNvbmNhdChlLmRhdGEpO1xuXHRcdFx0XHR0aGlzLnNpemUgPSBVdGlscy5udW1iZXJUb0J5dGVzKHRoaXMuZGF0YS5sZW5ndGgsIDQpOyAvLyA0IGJ5dGVzIGxvbmdcblx0XHRcdFx0dGhpcy5ldmVudHMucHVzaChlKTtcblx0XHRcdH0sIHRoaXMpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoZXZlbnQuZGF0YSk7XG5cdFx0XHR0aGlzLnNpemUgPSBVdGlscy5udW1iZXJUb0J5dGVzKHRoaXMuZGF0YS5sZW5ndGgsIDQpOyAvLyA0IGJ5dGVzIGxvbmdcblx0XHRcdHRoaXMuZXZlbnRzLnB1c2goZXZlbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGVtcG8gb2YgdGhlIE1JREkgZmlsZS5cblx0ICogQHBhcmFtIHtudW1iZXJ9IGJwbSAtIFRlbXBvIGluIGJlYXRzIHBlciBtaW51dGUuXG5cdCAqIEByZXR1cm4ge1RyYWNrfVxuXHQgKi9cblx0c2V0VGVtcG8oYnBtKSB7XG5cdFx0dmFyIGV2ZW50ID0gbmV3IE1ldGFFdmVudCh7ZGF0YTogW0NvbnN0YW50cy5NRVRBX1RFTVBPX0lEXX0pO1xuXHRcdGV2ZW50LmRhdGEucHVzaCgweDAzKTsgLy8gU2l6ZVxuXHRcdHZhciB0ZW1wbyA9IE1hdGgucm91bmQoNjAwMDAwMDAgLyBicG0pO1xuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb0J5dGVzKHRlbXBvLCAzKSk7IC8vIFRlbXBvLCAzIGJ5dGVzXG5cdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGltZSBzaWduYXR1cmUuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBudW1lcmF0b3IgLSBUb3AgbnVtYmVyIG9mIHRoZSB0aW1lIHNpZ25hdHVyZS5cblx0ICogQHBhcmFtIHtudW1iZXJ9IGRlbm9taW5hdG9yIC0gQm90dG9tIG51bWJlciBvZiB0aGUgdGltZSBzaWduYXR1cmUuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtaWRpY2xvY2tzcGVydGljayAtIERlZmF1bHRzIHRvIDI0LlxuXHQgKiBAcGFyYW0ge251bWJlcn0gbm90ZXNwZXJtaWRpY2xvY2sgLSBEZWZhdWx0cyB0byA4LlxuXHQgKiBAcmV0dXJuIHtUcmFja31cblx0ICovXG5cdHNldFRpbWVTaWduYXR1cmUobnVtZXJhdG9yLCBkZW5vbWluYXRvciwgbWlkaWNsb2Nrc3BlcnRpY2ssIG5vdGVzcGVybWlkaWNsb2NrKSB7XG5cdFx0bWlkaWNsb2Nrc3BlcnRpY2sgPSBtaWRpY2xvY2tzcGVydGljayB8fCAyNDtcblx0XHRub3Rlc3Blcm1pZGljbG9jayA9IG5vdGVzcGVybWlkaWNsb2NrIHx8IDg7XG5cdFx0XG5cdFx0dmFyIGV2ZW50ID0gbmV3IE1ldGFFdmVudCh7ZGF0YTogW0NvbnN0YW50cy5NRVRBX1RJTUVfU0lHTkFUVVJFX0lEXX0pO1xuXHRcdGV2ZW50LmRhdGEucHVzaCgweDA0KTsgLy8gU2l6ZVxuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb0J5dGVzKG51bWVyYXRvciwgMSkpOyAvLyBOdW1lcmF0b3IsIDEgYnl0ZXNcblx0XHRcblx0XHR2YXIgX2Rlbm9taW5hdG9yID0gTWF0aC5sb2cyKGRlbm9taW5hdG9yKTtcdC8vIERlbm9taW5hdG9yIGlzIGV4cHJlc3NlZCBhcyBwb3cgb2YgMlxuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb0J5dGVzKF9kZW5vbWluYXRvciwgMSkpOyAvLyBEZW5vbWluYXRvciwgMSBieXRlc1xuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb0J5dGVzKG1pZGljbG9ja3NwZXJ0aWNrLCAxKSk7IC8vIE1JREkgQ2xvY2tzIHBlciB0aWNrLCAxIGJ5dGVzXG5cdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvQnl0ZXMobm90ZXNwZXJtaWRpY2xvY2ssIDEpKTsgLy8gTnVtYmVyIG9mIDEvMzIgbm90ZXMgcGVyIE1JREkgY2xvY2tzLCAxIGJ5dGVzXG5cdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMga2V5IHNpZ25hdHVyZS5cblx0ICogQHBhcmFtIHsqfSBzZiAtIFxuXHQgKiBAcGFyYW0geyp9IG1pIC1cblx0ICogQHJldHVybiB7VHJhY2t9XG5cdCAqL1xuXHRzZXRLZXlTaWduYXR1cmUoc2YsIG1pKSB7XG5cdFx0dmFyIGV2ZW50ID0gbmV3IE1ldGFFdmVudCh7ZGF0YTogW0NvbnN0YW50cy5NRVRBX0tFWV9TSUdOQVRVUkVfSURdfSk7XG5cdFx0ZXZlbnQuZGF0YS5wdXNoKDB4MDIpOyAvLyBTaXplXG5cblx0XHR2YXIgbW9kZSA9IG1pIHx8IDA7XG5cdFx0c2YgPSBzZiB8fCAwO1xuXG5cdFx0Ly9cdEZ1bmN0aW9uIGNhbGxlZCB3aXRoIHN0cmluZyBub3RhdGlvblxuXHRcdGlmICh0eXBlb2YgbWkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR2YXIgZmlmdGhzID0gW1xuXHRcdFx0XHRbJ0NiJywgJ0diJywgJ0RiJywgJ0FiJywgJ0ViJywgJ0JiJywgJ0YnLCAnQycsICdHJywgJ0QnLCAnQScsICdFJywgJ0InLCAnRiMnLCAnQyMnXSxcblx0XHRcdFx0WydhYicsICdlYicsICdiYicsICdmJywgJ2MnLCAnZycsICdkJywgJ2EnLCAnZScsICdiJywgJ2YjJywgJ2MjJywgJ2cjJywgJ2QjJywgJ2EjJ11cblx0XHRcdF07XG5cdFx0XHR2YXIgX3NmbGVuID0gc2YubGVuZ3RoO1xuXHRcdFx0dmFyIG5vdGUgPSBzZiB8fCAnQyc7XG5cblx0XHRcdGlmIChzZlswXSA9PT0gc2ZbMF0udG9Mb3dlckNhc2UoKSkgbW9kZSA9IDFcblxuXHRcdFx0aWYgKF9zZmxlbiA+IDEpIHtcblx0XHRcdFx0c3dpdGNoIChzZi5jaGFyQXQoX3NmbGVuIC0gMSkpIHtcblx0XHRcdFx0XHRjYXNlICdtJzpcblx0XHRcdFx0XHRcdG1vZGUgPSAxO1xuXHRcdFx0XHRcdFx0bm90ZSA9IHNmLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0bm90ZSA9IG5vdGUuY29uY2F0KHNmLnN1YnN0cmluZygxLCBfc2ZsZW4gLSAxKSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICctJzpcblx0XHRcdFx0XHRcdG1vZGUgPSAxO1xuXHRcdFx0XHRcdFx0bm90ZSA9IHNmLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0bm90ZSA9IG5vdGUuY29uY2F0KHNmLnN1YnN0cmluZygxLCBfc2ZsZW4gLSAxKSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdNJzpcblx0XHRcdFx0XHRcdG1vZGUgPSAwO1xuXHRcdFx0XHRcdFx0bm90ZSA9IHNmLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0bm90ZSA9IG5vdGUuY29uY2F0KHNmLnN1YnN0cmluZygxLCBfc2ZsZW4gLSAxKSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICcrJzpcblx0XHRcdFx0XHRcdG1vZGUgPSAwO1xuXHRcdFx0XHRcdFx0bm90ZSA9IHNmLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0bm90ZSA9IG5vdGUuY29uY2F0KHNmLnN1YnN0cmluZygxLCBfc2ZsZW4gLSAxKSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZmlmdGhpbmRleCA9IGZpZnRoc1ttb2RlXS5pbmRleE9mKG5vdGUpO1xuXHRcdFx0c2YgPSBmaWZ0aGluZGV4ID09PSAtMSA/IDAgOiBmaWZ0aGluZGV4IC0gNztcblx0XHR9XG5cblx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoVXRpbHMubnVtYmVyVG9CeXRlcyhzZiwgMSkpOyAvLyBOdW1iZXIgb2Ygc2hhcnAgb3IgZmxhdHMgKCA8IDAgZmxhdDsgPiAwIHNoYXJwKVxuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb0J5dGVzKG1vZGUsIDEpKTsgLy8gTW9kZTogMCBtYWpvciwgMSBtaW5vclxuXHRcdHJldHVybiB0aGlzLmFkZEV2ZW50KGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRleHQgdG8gTUlESSBmaWxlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRleHQgdG8gYWRkLlxuXHQgKiBAcmV0dXJuIHtUcmFja31cblx0ICovXG5cdGFkZFRleHQodGV4dCkge1xuXHRcdHZhciBldmVudCA9IG5ldyBNZXRhRXZlbnQoe2RhdGE6IFtDb25zdGFudHMuTUVUQV9URVhUX0lEXX0pO1xuXHRcdHZhciBzdHJpbmdCeXRlcyA9IFV0aWxzLnN0cmluZ1RvQnl0ZXModGV4dCk7XG5cdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoc3RyaW5nQnl0ZXMubGVuZ3RoKSk7IC8vIFNpemVcblx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoc3RyaW5nQnl0ZXMpOyAvLyBUZXh0XG5cdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgY29weXJpZ2h0IHRvIE1JREkgZmlsZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUZXh0IG9mIGNvcHlyaWdodCBsaW5lLlxuXHQgKiBAcmV0dXJuIHtUcmFja31cblx0ICovXG5cdGFkZENvcHlyaWdodCh0ZXh0KSB7XG5cdFx0dmFyIGV2ZW50ID0gbmV3IE1ldGFFdmVudCh7ZGF0YTogW0NvbnN0YW50cy5NRVRBX0NPUFlSSUdIVF9JRF19KTtcblx0XHR2YXIgc3RyaW5nQnl0ZXMgPSBVdGlscy5zdHJpbmdUb0J5dGVzKHRleHQpO1xuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb1ZhcmlhYmxlTGVuZ3RoKHN0cmluZ0J5dGVzLmxlbmd0aCkpOyAvLyBTaXplXG5cdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KHN0cmluZ0J5dGVzKTsgLy8gVGV4dFxuXHRcdHJldHVybiB0aGlzLmFkZEV2ZW50KGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIFNlcXVlbmNlL1RyYWNrIE5hbWUuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGV4dCBvZiB0cmFjayBuYW1lLlxuXHQgKiBAcmV0dXJuIHtUcmFja31cblx0ICovXG5cdGFkZFRyYWNrTmFtZSh0ZXh0KSB7XG5cdFx0dmFyIGV2ZW50ID0gbmV3IE1ldGFFdmVudCh7ZGF0YTogW0NvbnN0YW50cy5NRVRBX1RSQUNLX05BTUVfSURdfSk7XG5cdFx0dmFyIHN0cmluZ0J5dGVzID0gVXRpbHMuc3RyaW5nVG9CeXRlcyh0ZXh0KTtcblx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoVXRpbHMubnVtYmVyVG9WYXJpYWJsZUxlbmd0aChzdHJpbmdCeXRlcy5sZW5ndGgpKTsgLy8gU2l6ZVxuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChzdHJpbmdCeXRlcyk7IC8vIFRleHRcblx0XHRyZXR1cm4gdGhpcy5hZGRFdmVudChldmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBpbnN0cnVtZW50IG5hbWUgb2YgdHJhY2suXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gTmFtZSBvZiBpbnN0cnVtZW50LlxuXHQgKiBAcmV0dXJuIHtUcmFja31cblx0ICovXG5cdGFkZEluc3RydW1lbnROYW1lKHRleHQpIHtcblx0XHR2YXIgZXZlbnQgPSBuZXcgTWV0YUV2ZW50KHtkYXRhOiBbQ29uc3RhbnRzLk1FVEFfSU5TVFJVTUVOVF9OQU1FX0lEXX0pO1xuXHRcdHZhciBzdHJpbmdCeXRlcyA9IFV0aWxzLnN0cmluZ1RvQnl0ZXModGV4dCk7XG5cdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoc3RyaW5nQnl0ZXMubGVuZ3RoKSk7IC8vIFNpemVcblx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoc3RyaW5nQnl0ZXMpOyAvLyBUZXh0XG5cdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgbWFya2VyIHRvIE1JREkgZmlsZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBNYXJrZXIgdGV4dC5cblx0ICogQHJldHVybiB7VHJhY2t9XG5cdCAqL1xuXHRhZGRNYXJrZXIodGV4dCkge1xuXHRcdHZhciBldmVudCA9IG5ldyBNZXRhRXZlbnQoe2RhdGE6IFtDb25zdGFudHMuTUVUQV9NQVJLRVJfSURdfSk7XG5cdFx0dmFyIHN0cmluZ0J5dGVzID0gVXRpbHMuc3RyaW5nVG9CeXRlcyh0ZXh0KTtcblx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoVXRpbHMubnVtYmVyVG9WYXJpYWJsZUxlbmd0aChzdHJpbmdCeXRlcy5sZW5ndGgpKTsgLy8gU2l6ZVxuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChzdHJpbmdCeXRlcyk7IC8vIFRleHRcblx0XHRyZXR1cm4gdGhpcy5hZGRFdmVudChldmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBjdWUgcG9pbnQgdG8gTUlESSBmaWxlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRleHQgb2YgY3VlIHBvaW50LlxuXHQgKiBAcmV0dXJuIHtUcmFja31cblx0ICovXG5cdGFkZEN1ZVBvaW50KHRleHQpIHtcblx0XHR2YXIgZXZlbnQgPSBuZXcgTWV0YUV2ZW50KHtkYXRhOiBbQ29uc3RhbnRzLk1FVEFfQ1VFX1BPSU5UXX0pO1xuXHRcdHZhciBzdHJpbmdCeXRlcyA9IFV0aWxzLnN0cmluZ1RvQnl0ZXModGV4dCk7XG5cdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoc3RyaW5nQnl0ZXMubGVuZ3RoKSk7IC8vIFNpemVcblx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoc3RyaW5nQnl0ZXMpOyAvLyBUZXh0XG5cdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgbHlyaWMgdG8gTUlESSBmaWxlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbHlyaWMgLSBMeXJpYyB0ZXh0IHRvIGFkZC5cblx0ICogQHJldHVybiB7VHJhY2t9XG5cdCAqL1xuXHRhZGRMeXJpYyhseXJpYykge1xuXHRcdHZhciBldmVudCA9IG5ldyBNZXRhRXZlbnQoe2RhdGE6IFtDb25zdGFudHMuTUVUQV9MWVJJQ19JRF19KTtcblx0XHR2YXIgc3RyaW5nQnl0ZXMgPSBVdGlscy5zdHJpbmdUb0J5dGVzKGx5cmljKTtcblx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoVXRpbHMubnVtYmVyVG9WYXJpYWJsZUxlbmd0aChzdHJpbmdCeXRlcy5sZW5ndGgpKTsgLy8gU2l6ZVxuXHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChzdHJpbmdCeXRlcyk7IC8vIEx5cmljXG5cdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5uZWwgbW9kZSBtZXNzYWdlc1xuXHQgKiBAcmV0dXJuIHtUcmFja31cblx0ICovXG5cdHBvbHlNb2RlT24oKSB7XG5cdFx0dmFyIGV2ZW50ID0gbmV3IE5vdGVPbkV2ZW50KHtkYXRhOiBbMHgwMCwgMHhCMCwgMHg3RSwgMHgwMF19KTtcblx0XHRyZXR1cm4gdGhpcy5hZGRFdmVudChldmVudCk7XG5cdH1cblxufVxuXG5leHBvcnQge1RyYWNrfTtcbmltcG9ydCB7dG9NaWRpfSBmcm9tICd0b25hbC1taWRpJztcblxuLyoqXG4gKiBTdGF0aWMgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5LlxuICovXG5jbGFzcyBVdGlscyB7XG5cblx0LyoqXG5cdCAqIEdldHMgTWlkaVdyaXRlckpTIHZlcnNpb24gbnVtYmVyLlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRzdGF0aWMgdmVyc2lvbigpIHtcblx0XHRyZXR1cm4gQ29uc3RhbnRzLlZFUlNJT047XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydCBhIHN0cmluZyB0byBhbiBhcnJheSBvZiBieXRlc1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG5cdCAqIEByZXR1cm4ge2FycmF5fVxuXHQgKi9cblx0c3RhdGljIHN0cmluZ1RvQnl0ZXMoc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5zcGxpdCgnJykubWFwKGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KCkpXG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGFyZ3VtZW50IGlzIGEgdmFsaWQgbnVtYmVyLlxuXHQgKiBAcGFyYW0geyp9IG4gLSBWYWx1ZSB0byBjaGVja1xuXHQgKiBAcmV0dXJuIHtib29sZWFufVxuXHQgKi9cblx0c3RhdGljIGlzTnVtZXJpYyhuKSB7XG5cdFx0cmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKVxuXHR9XG5cblx0LyoqXG4gICAgICogUmV0dXJucyB0aGUgY29ycmVjdCBNSURJIG51bWJlciBmb3IgdGhlIHNwZWNpZmllZCBwaXRjaC5cbiAgICAgKiBVc2VzIFRvbmFsIE1pZGkgLSBodHRwczovL2dpdGh1Yi5jb20vZGFuaWdiL3RvbmFsL3RyZWUvbWFzdGVyL3BhY2thZ2VzL21pZGlcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gcGl0Y2ggLSAnQyM0JyBvciBtaWRpIG5vdGUgY29kZVxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICAgc3RhdGljIGdldFBpdGNoKHBpdGNoKSB7XG4gICAgIFx0cmV0dXJuIHRvTWlkaShwaXRjaCk7XG4gICAgIH1cblxuXHQvKipcblx0ICogVHJhbnNsYXRlcyBudW1iZXIgb2YgdGlja3MgdG8gTUlESSB0aW1lc3RhbXAgZm9ybWF0LCByZXR1cm5pbmcgYW4gYXJyYXkgb2Zcblx0ICogaGV4IHN0cmluZ3Mgd2l0aCB0aGUgdGltZSB2YWx1ZXMuIE1pZGkgaGFzIGEgdmVyeSBwYXJ0aWN1bGFyIHRpbWUgdG8gZXhwcmVzcyB0aW1lLFxuXHQgKiB0YWtlIGEgZ29vZCBsb29rIGF0IHRoZSBzcGVjIGJlZm9yZSBldmVyIHRvdWNoaW5nIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoYW5rcyB0byBodHRwczovL2dpdGh1Yi5jb20vc2VyZ2kvanNtaWRpXG5cdCAqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSB0aWNrcyAtIE51bWJlciBvZiB0aWNrcyB0byBiZSB0cmFuc2xhdGVkXG5cdCAqIEByZXR1cm4ge2FycmF5fSAtIEJ5dGVzIHRoYXQgZm9ybSB0aGUgTUlESSB0aW1lIHZhbHVlXG5cdCAqL1xuXHRzdGF0aWMgbnVtYmVyVG9WYXJpYWJsZUxlbmd0aCh0aWNrcykge1xuXHQgICAgdmFyIGJ1ZmZlciA9IHRpY2tzICYgMHg3RjtcblxuXHQgICAgd2hpbGUgKHRpY2tzID0gdGlja3MgPj4gNykge1xuXHQgICAgICAgIGJ1ZmZlciA8PD0gODtcblx0ICAgICAgICBidWZmZXIgfD0gKCh0aWNrcyAmIDB4N0YpIHwgMHg4MCk7XG5cdCAgICB9XG5cblx0ICAgIHZhciBiTGlzdCA9IFtdO1xuXHQgICAgd2hpbGUgKHRydWUpIHtcblx0ICAgICAgICBiTGlzdC5wdXNoKGJ1ZmZlciAmIDB4ZmYpO1xuXG5cdCAgICAgICAgaWYgKGJ1ZmZlciAmIDB4ODApIGJ1ZmZlciA+Pj0gOFxuXHQgICAgICAgIGVsc2UgeyBicmVhazsgfVxuXHQgICAgfVxuXG5cdCAgICByZXR1cm4gYkxpc3Q7XG5cdH1cblxuXHQvKipcblx0ICogQ291bnRzIG51bWJlciBvZiBieXRlcyBpbiBzdHJpbmdcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNcblx0ICogQHJldHVybiB7YXJyYXl9XG5cdCAqL1xuXHRzdGF0aWMgc3RyaW5nQnl0ZUNvdW50KHMpIHtcblx0XHRyZXR1cm4gZW5jb2RlVVJJKHMpLnNwbGl0KC8lLi58Li8pLmxlbmd0aCAtIDFcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgYW4gaW50IGZyb20gYW4gYXJyYXkgb2YgYnl0ZXMuXG5cdCAqIEBwYXJhbSB7YXJyYXl9IGJ5dGVzXG5cdCAqIEByZXR1cm4ge251bWJlcn1cblx0ICovXG5cdHN0YXRpYyBudW1iZXJGcm9tQnl0ZXMoYnl0ZXMpIHtcblx0XHR2YXIgaGV4ID0gJyc7XG5cdFx0dmFyIHN0cmluZ1Jlc3VsdDtcblxuXHRcdGJ5dGVzLmZvckVhY2goZnVuY3Rpb24oYnl0ZSkge1xuXHRcdFx0c3RyaW5nUmVzdWx0ID0gYnl0ZS50b1N0cmluZygxNik7XG5cblx0XHRcdC8vIGVuc3VyZSBzdHJpbmcgaXMgMiBjaGFyc1xuXHRcdFx0aWYgKHN0cmluZ1Jlc3VsdC5sZW5ndGggPT0gMSkgc3RyaW5nUmVzdWx0ID0gXCIwXCIgKyBzdHJpbmdSZXN1bHRcblxuXHRcdFx0aGV4ICs9IHN0cmluZ1Jlc3VsdDtcblx0XHR9KTtcblxuXHRcdHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUYWtlcyBhIG51bWJlciBhbmQgc3BsaXRzIGl0IHVwIGludG8gYW4gYXJyYXkgb2YgYnl0ZXMuICBDYW4gYmUgcGFkZGVkIGJ5IHBhc3NpbmcgYSBudW1iZXIgdG8gYnl0ZXNOZWVkZWRcblx0ICogQHBhcmFtIHtudW1iZXJ9IG51bWJlclxuXHQgKiBAcGFyYW0ge251bWJlcn0gYnl0ZXNOZWVkZWRcblx0ICogQHJldHVybiB7YXJyYXl9IC0gQXJyYXkgb2YgYnl0ZXNcblx0ICovXG5cdHN0YXRpYyBudW1iZXJUb0J5dGVzKG51bWJlciwgYnl0ZXNOZWVkZWQpIHtcblx0XHRieXRlc05lZWRlZCA9IGJ5dGVzTmVlZGVkIHx8IDE7XG5cblx0XHR2YXIgaGV4U3RyaW5nID0gbnVtYmVyLnRvU3RyaW5nKDE2KTtcblxuXHRcdGlmIChoZXhTdHJpbmcubGVuZ3RoICYgMSkgeyAvLyBNYWtlIHN1cmUgaGV4IHN0cmluZyBpcyBldmVuIG51bWJlciBvZiBjaGFyc1xuXHRcdFx0aGV4U3RyaW5nID0gJzAnICsgaGV4U3RyaW5nO1xuXHRcdH1cblxuXHRcdC8vIFNwbGl0IGhleCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiB0d28gY2hhciBlbGVtZW50c1xuXHRcdHZhciBoZXhBcnJheSA9IGhleFN0cmluZy5tYXRjaCgvLnsyfS9nKTtcblxuXHRcdC8vIE5vdyBwYXJzZSB0aGVtIG91dCBhcyBpbnRlZ2Vyc1xuXHRcdGhleEFycmF5ID0gaGV4QXJyYXkubWFwKGl0ZW0gPT4gcGFyc2VJbnQoaXRlbSwgMTYpKVxuXG5cdFx0Ly8gUHJlcGVuZCBlbXB0eSBieXRlcyBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaFxuXHRcdGlmIChoZXhBcnJheS5sZW5ndGggPCBieXRlc05lZWRlZCkge1xuXHRcdFx0d2hpbGUgKGJ5dGVzTmVlZGVkIC0gaGV4QXJyYXkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRoZXhBcnJheS51bnNoaWZ0KDApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBoZXhBcnJheTtcblx0fVxuXG5cdC8qKlx0XG5cdCAqIENvbnZlcnRzIHZhbHVlIHRvIGFycmF5IGlmIG5lZWRlZC5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG5cdCAqIEByZXR1cm4ge2FycmF5fVxuXHQgKi9cblx0c3RhdGljIHRvQXJyYXkodmFsdWUpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblx0XHRyZXR1cm4gW3ZhbHVlXTtcblx0fVxufVxuXG5leHBvcnQge1V0aWxzfTtcbmNsYXNzIFZleEZsb3cge1xuXHRcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0Ly8gY29kZS4uLlxuXHR9XG5cblx0LyoqXG5cdCAqIFN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgVmV4RmxvdyB2b2ljZSBpbnRvIE1pZGlXcml0ZXJKUyB0cmFja1xuXHQgKiBAcmV0dXJuIE1pZGlXcml0aWVyLlRyYWNrIG9iamVjdFxuXHQgKi9cblx0dHJhY2tGcm9tVm9pY2Uodm9pY2UpIHtcblx0XHR2YXIgdHJhY2sgPSBuZXcgVHJhY2soKTtcblx0XHR2YXIgd2FpdDtcblx0XHR2YXIgcGl0Y2hlcyA9IFtdO1xuXG5cdFx0dm9pY2UudGlja2FibGVzLmZvckVhY2goZnVuY3Rpb24odGlja2FibGUpIHtcblx0XHRcdHBpdGNoZXMgPSBbXTtcblxuXHRcdFx0aWYgKHRpY2thYmxlLm5vdGVUeXBlID09PSAnbicpIHtcblx0XHRcdFx0dGlja2FibGUua2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuXHRcdFx0XHRcdC8vIGJ1aWxkIGFycmF5IG9mIHBpdGNoZXNcblx0XHRcdFx0XHRwaXRjaGVzLnB1c2godGhpcy5jb252ZXJ0UGl0Y2goa2V5KSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHR9IGVsc2UgaWYgKHRpY2thYmxlLm5vdGVUeXBlID09PSAncicpIHtcblx0XHRcdFx0Ly8gbW92ZSBvbiB0byB0aGUgbmV4dCB0aWNrYWJsZSBhbmQgdXNlIHRoaXMgcmVzdCBhcyBhIGB3YWl0YCBwcm9wZXJ0eSBmb3IgdGhlIG5leHQgZXZlbnRcblx0XHRcdFx0d2FpdCA9IHRoaXMuY29udmVydER1cmF0aW9uKHRpY2thYmxlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0cmFjay5hZGRFdmVudChuZXcgTm90ZUV2ZW50KHtwaXRjaDogcGl0Y2hlcywgZHVyYXRpb246IHRoaXMuY29udmVydER1cmF0aW9uKHRpY2thYmxlKSwgd2FpdDogd2FpdH0pKTtcblx0XHRcdFxuXHRcdFx0Ly8gcmVzZXQgd2FpdFxuXHRcdFx0d2FpdCA9IDA7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdHJhY2s7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBWZXhGbG93IHBpdGNoIHN5bnRheCB0byBNaWRpV3JpdGVySlMgc3ludGF4XG5cdCAqIEBwYXJhbSBwaXRjaCBzdHJpbmdcblx0ICovXG5cdGNvbnZlcnRQaXRjaChwaXRjaCkge1xuXHRcdHJldHVybiBwaXRjaC5yZXBsYWNlKCcvJywgJycpO1xuXHR9IFxuXG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIFZleEZsb3cgZHVyYXRpb24gc3ludGF4IHRvIE1pZGlXcml0ZXJKUyBzeW50YXhcblx0ICogQHBhcmFtIG5vdGUgc3RydWN0IGZyb20gVmV4Rmxvd1xuXHQgKi9cblx0Y29udmVydER1cmF0aW9uKG5vdGUpIHtcblx0XHRzd2l0Y2ggKG5vdGUuZHVyYXRpb24pIHtcblx0XHRcdGNhc2UgJ3cnOlxuXHRcdFx0XHRyZXR1cm4gJzEnO1xuXHRcdFx0Y2FzZSAnaCc6XG5cdFx0XHRcdHJldHVybiBub3RlLmlzRG90dGVkKCkgPyAnZDInIDogJzInO1xuXHRcdFx0Y2FzZSAncSc6XG5cdFx0XHRcdHJldHVybiBub3RlLmlzRG90dGVkKCkgPyAnZDQnIDogJzQnO1xuXHRcdFx0Y2FzZSAnOCc6XG5cdFx0XHRcdHJldHVybiBub3RlLmlzRG90dGVkKCkgPyAnZDgnIDogJzgnO1xuXHRcdH1cblxuXHRcdHJldHVybiBub3RlLmR1cmF0aW9uO1xuXHR9O1xufVxuXG5leHBvcnQge1ZleEZsb3d9O1xuLyoqXG4gKiBPYmplY3QgdGhhdCBwdXRzIHRvZ2V0aGVyIHRyYWNrcyBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgZmlsZSBvdXRwdXQuXG4gKiBAcGFyYW0ge2FycmF5fSB0cmFja3MgLSBBbiBhcnJheSBvZiB7VHJhY2t9IG9iamVjdHMuXG4gKiBAcmV0dXJuIHtXcml0ZXJ9XG4gKi9cbmNsYXNzIFdyaXRlciB7XG5cdGNvbnN0cnVjdG9yKHRyYWNrcykge1xuXHRcdHRoaXMuZGF0YSA9IFtdO1xuXG5cdFx0dmFyIHRyYWNrVHlwZSA9IHRyYWNrcy5sZW5ndGggPiAxID8gQ29uc3RhbnRzLkhFQURFUl9DSFVOS19GT1JNQVQxIDogQ29uc3RhbnRzLkhFQURFUl9DSFVOS19GT1JNQVQwO1xuXHRcdHZhciBudW1iZXJPZlRyYWNrcyA9IFV0aWxzLm51bWJlclRvQnl0ZXModHJhY2tzLmxlbmd0aCwgMik7IC8vIHR3byBieXRlcyBsb25nXG5cblx0XHQvLyBIZWFkZXIgY2h1bmtcblx0XHR0aGlzLmRhdGEucHVzaChuZXcgQ2h1bmsoe1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IENvbnN0YW50cy5IRUFERVJfQ0hVTktfVFlQRSxcblx0XHRcdFx0XHRcdFx0XHRkYXRhOiB0cmFja1R5cGUuY29uY2F0KG51bWJlck9mVHJhY2tzLCBDb25zdGFudHMuSEVBREVSX0NIVU5LX0RJVklTSU9OKX0pKTtcblxuXHRcdC8vIFRyYWNrIGNodW5rc1xuXHRcdHRyYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHRyYWNrLCBpKSB7XG5cdFx0XHR0cmFjay5hZGRFdmVudChuZXcgTWV0YUV2ZW50KHtkYXRhOiBDb25zdGFudHMuTUVUQV9FTkRfT0ZfVFJBQ0tfSUR9KSk7XG5cdFx0XHR0aGlzLmRhdGEucHVzaCh0cmFjayk7XG5cdFx0fSwgdGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIHRoZSBmaWxlIGludG8gYSBVaW50OEFycmF5XG5cdCAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9XG5cdCAqL1xuXHRidWlsZEZpbGUoKSB7XG5cdFx0dmFyIGJ1aWxkID0gW107XG5cblx0XHQvLyBEYXRhIGNvbnNpc3RzIG9mIGNodW5rcyB3aGljaCBjb25zaXN0cyBvZiBkYXRhXG5cdFx0dGhpcy5kYXRhLmZvckVhY2goKGQpID0+IGJ1aWxkID0gYnVpbGQuY29uY2F0KGQudHlwZSwgZC5zaXplLCBkLmRhdGEpKTtcblxuXHRcdHJldHVybiBuZXcgVWludDhBcnJheShidWlsZCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydCBmaWxlIGJ1ZmZlciB0byBhIGJhc2U2NCBzdHJpbmcuICBEaWZmZXJlbnQgbWV0aG9kcyBkZXBlbmRpbmcgb24gaWYgYnJvd3NlciBvciBub2RlLlxuXHQgKiBAcmV0dXJuIHtzdHJpbmd9XG5cdCAqL1xuXHRiYXNlNjQoKSB7XG5cdFx0aWYgKHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHRoaXMuYnVpbGRGaWxlKCkpKTtcblx0XHRyZXR1cm4gbmV3IEJ1ZmZlcih0aGlzLmJ1aWxkRmlsZSgpKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cdH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGF0YSBVUkkuXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIGRhdGFVcmkoKSB7XG4gICAgXHRyZXR1cm4gJ2RhdGE6YXVkaW8vbWlkaTtiYXNlNjQsJyArIHRoaXMuYmFzZTY0KCk7XG4gICAgfVxuXG5cdC8qKlxuXHQgKiBPdXRwdXQgdG8gc3Rkb3V0XG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG4gICAgc3Rkb3V0KCkge1xuICAgIFx0cmV0dXJuIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG5ldyBCdWZmZXIodGhpcy5idWlsZEZpbGUoKSkpO1xuICAgIH1cblxuXHQvKipcblx0ICogU2F2ZSB0byBNSURJIGZpbGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lXG5cdCAqL1xuXHRzYXZlTUlESShmaWxlbmFtZSkge1xuXHRcdHZhciBidWZmZXIgPSBuZXcgQnVmZmVyKHRoaXMuYnVpbGRGaWxlKCkpO1xuXHRcdGZzLndyaXRlRmlsZShmaWxlbmFtZSArICcubWlkJywgYnVmZmVyLCBmdW5jdGlvbiAoZXJyKSB7XG5cdFx0XHRpZihlcnIpIHJldHVybiBjb25zb2xlLmxvZyhlcnIpO1xuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCB7V3JpdGVyfTtcbiJdfQ== - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3).Buffer, __webpack_require__(11))) - -/***/ }), -/* 141 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -/* unused harmony export regex */ -/* unused harmony export parse */ -/* unused harmony export build */ -/* harmony export (immutable) */ __webpack_exports__["a"] = midi; -/* unused harmony export freq */ -/* unused harmony export letter */ -/* unused harmony export acc */ -/* unused harmony export pc */ -/* unused harmony export step */ -/* unused harmony export alt */ -/* unused harmony export chroma */ -/* unused harmony export oct */ - - -// util -function fillStr (s, num) { return Array(num + 1).join(s) } -function isNum (x) { return typeof x === 'number' } -function isStr (x) { return typeof x === 'string' } -function isDef (x) { return typeof x !== 'undefined' } -function midiToFreq (midi, tuning) { - return Math.pow(2, (midi - 69) / 12) * (tuning || 440) -} - -var REGEX = /^([a-gA-G])(#{1,}|b{1,}|x{1,}|)(-?\d*)\s*(.*)\s*$/ -/** - * A regex for matching note strings in scientific notation. - * - * @name regex - * @function - * @return {RegExp} the regexp used to parse the note name - * - * The note string should have the form `letter[accidentals][octave][element]` - * where: - * - * - letter: (Required) is a letter from A to G either upper or lower case - * - accidentals: (Optional) can be one or more `b` (flats), `#` (sharps) or `x` (double sharps). - * They can NOT be mixed. - * - octave: (Optional) a positive or negative integer - * - element: (Optional) additionally anything after the duration is considered to - * be the element name (for example: 'C2 dorian') - * - * The executed regex contains (by array index): - * - * - 0: the complete string - * - 1: the note letter - * - 2: the optional accidentals - * - 3: the optional octave - * - 4: the rest of the string (trimmed) - * - * @example - * var parser = require('note-parser') - * parser.regex.exec('c#4') - * // => ['c#4', 'c', '#', '4', ''] - * parser.regex.exec('c#4 major') - * // => ['c#4major', 'c', '#', '4', 'major'] - * parser.regex().exec('CMaj7') - * // => ['CMaj7', 'C', '', '', 'Maj7'] - */ -function regex () { return REGEX } - -var SEMITONES = [0, 2, 4, 5, 7, 9, 11] -/** - * Parse a note name in scientific notation an return it's components, - * and some numeric properties including midi number and frequency. - * - * @name parse - * @function - * @param {String} note - the note string to be parsed - * @param {Boolean} isTonic - true the strings it's supposed to contain a note number - * and some category (for example an scale: 'C# major'). It's false by default, - * but when true, en extra tonicOf property is returned with the category ('major') - * @param {Float} tunning - The frequency of A4 note to calculate frequencies. - * By default it 440. - * @return {Object} the parsed note name or null if not a valid note - * - * The parsed note name object will ALWAYS contains: - * - letter: the uppercase letter of the note - * - acc: the accidentals of the note (only sharps or flats) - * - pc: the pitch class (letter + acc) - * - step: s a numeric representation of the letter. It's an integer from 0 to 6 - * where 0 = C, 1 = D ... 6 = B - * - alt: a numeric representation of the accidentals. 0 means no alteration, - * positive numbers are for sharps and negative for flats - * - chroma: a numeric representation of the pitch class. It's like midi for - * pitch classes. 0 = C, 1 = C#, 2 = D ... 11 = B. Can be used to find enharmonics - * since, for example, chroma of 'Cb' and 'B' are both 11 - * - * If the note has octave, the parser object will contain: - * - oct: the octave number (as integer) - * - midi: the midi number - * - freq: the frequency (using tuning parameter as base) - * - * If the parameter `isTonic` is set to true, the parsed object will contain: - * - tonicOf: the rest of the string that follows note name (left and right trimmed) - * - * @example - * var parse = require('note-parser').parse - * parse('Cb4') - * // => { letter: 'C', acc: 'b', pc: 'Cb', step: 0, alt: -1, chroma: -1, - * oct: 4, midi: 59, freq: 246.94165062806206 } - * // if no octave, no midi, no freq - * parse('fx') - * // => { letter: 'F', acc: '##', pc: 'F##', step: 3, alt: 2, chroma: 7 }) - */ -function parse (str, isTonic, tuning) { - if (typeof str !== 'string') return null - var m = REGEX.exec(str) - if (!m || (!isTonic && m[4])) return null - - var p = { letter: m[1].toUpperCase(), acc: m[2].replace(/x/g, '##') } - p.pc = p.letter + p.acc - p.step = (p.letter.charCodeAt(0) + 3) % 7 - p.alt = p.acc[0] === 'b' ? -p.acc.length : p.acc.length - var pos = SEMITONES[p.step] + p.alt - p.chroma = pos < 0 ? 12 + pos : pos % 12 - if (m[3]) { // has octave - p.oct = +m[3] - p.midi = pos + 12 * (p.oct + 1) - p.freq = midiToFreq(p.midi, tuning) - } - if (isTonic) p.tonicOf = m[4] - return p -} - -var LETTERS = 'CDEFGAB' -function accStr (n) { return !isNum(n) ? '' : n < 0 ? fillStr('b', -n) : fillStr('#', n) } -function octStr (n) { return !isNum(n) ? '' : '' + n } - -/** - * Create a string from a parsed object or `step, alteration, octave` parameters - * @param {Object} obj - the parsed data object - * @return {String} a note string or null if not valid parameters - * @since 1.2 - * @example - * parser.build(parser.parse('cb2')) // => 'Cb2' - * - * @example - * // it accepts (step, alteration, octave) parameters: - * parser.build(3) // => 'F' - * parser.build(3, -1) // => 'Fb' - * parser.build(3, -1, 4) // => 'Fb4' - */ -function build (s, a, o) { - if (s === null || typeof s === 'undefined') return null - if (s.step) return build(s.step, s.alt, s.oct) - if (s < 0 || s > 6) return null - return LETTERS.charAt(s) + accStr(a) + octStr(o) -} - -/** - * Get midi of a note - * - * @name midi - * @function - * @param {String|Integer} note - the note name or midi number - * @return {Integer} the midi number of the note or null if not a valid note - * or the note does NOT contains octave - * @example - * var parser = require('note-parser') - * parser.midi('A4') // => 69 - * parser.midi('A') // => null - * @example - * // midi numbers are bypassed (even as strings) - * parser.midi(60) // => 60 - * parser.midi('60') // => 60 - */ -function midi (note) { - if ((isNum(note) || isStr(note)) && note >= 0 && note < 128) return +note - var p = parse(note) - return p && isDef(p.midi) ? p.midi : null -} - -/** - * Get freq of a note in hertzs (in a well tempered 440Hz A4) - * - * @name freq - * @function - * @param {String} note - the note name or note midi number - * @param {String} tuning - (Optional) the A4 frequency (440 by default) - * @return {Float} the freq of the number if hertzs or null if not valid note - * @example - * var parser = require('note-parser') - * parser.freq('A4') // => 440 - * parser.freq('A') // => null - * @example - * // can change tuning (440 by default) - * parser.freq('A4', 444) // => 444 - * parser.freq('A3', 444) // => 222 - * @example - * // it accepts midi numbers (as numbers and as strings) - * parser.freq(69) // => 440 - * parser.freq('69', 442) // => 442 - */ -function freq (note, tuning) { - var m = midi(note) - return m === null ? null : midiToFreq(m, tuning) -} - -function letter (src) { return (parse(src) || {}).letter } -function acc (src) { return (parse(src) || {}).acc } -function pc (src) { return (parse(src) || {}).pc } -function step (src) { return (parse(src) || {}).step } -function alt (src) { return (parse(src) || {}).alt } -function chroma (src) { return (parse(src) || {}).chroma } -function oct (src) { return (parse(src) || {}).oct } - - -/***/ }), -/* 142 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(12); - - -/***/ }), -/* 143 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// a passthrough stream. -// basically just the most minimal sort of Transform stream. -// Every written chunk gets output as-is. - - - -module.exports = PassThrough; - -var Transform = __webpack_require__(73); - -/*<replacement>*/ -var util = __webpack_require__(22); -util.inherits = __webpack_require__(16); -/*</replacement>*/ - -util.inherits(PassThrough, Transform); - -function PassThrough(options) { - if (!(this instanceof PassThrough)) return new PassThrough(options); - - Transform.call(this, options); -} - -PassThrough.prototype._transform = function (chunk, encoding, cb) { - cb(null, chunk); -}; - -/***/ }), -/* 144 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Buffer = __webpack_require__(3).Buffer; -/*<replacement>*/ -var bufferShim = __webpack_require__(32); -/*</replacement>*/ - -module.exports = BufferList; - -function BufferList() { - this.head = null; - this.tail = null; - this.length = 0; -} - -BufferList.prototype.push = function (v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; -}; - -BufferList.prototype.unshift = function (v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; -}; - -BufferList.prototype.shift = function () { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; -}; - -BufferList.prototype.clear = function () { - this.head = this.tail = null; - this.length = 0; -}; - -BufferList.prototype.join = function (s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; -}; - -BufferList.prototype.concat = function (n) { - if (this.length === 0) return bufferShim.alloc(0); - if (this.length === 1) return this.head.data; - var ret = bufferShim.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - p.data.copy(ret, i); - i += p.data.length; - p = p.next; - } - return ret; -}; - -/***/ }), -/* 145 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(51).PassThrough - - -/***/ }), -/* 146 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(51).Transform - - -/***/ }), -/* 147 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(50); - - -/***/ }), -/* 148 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) { - "use strict"; - - if (global.setImmediate) { - return; - } - - var nextHandle = 1; // Spec says greater than zero - var tasksByHandle = {}; - var currentlyRunningATask = false; - var doc = global.document; - var registerImmediate; - - function setImmediate(callback) { - // Callback can either be a function or a string - if (typeof callback !== "function") { - callback = new Function("" + callback); - } - // Copy function arguments - var args = new Array(arguments.length - 1); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i + 1]; - } - // Store and register the task - var task = { callback: callback, args: args }; - tasksByHandle[nextHandle] = task; - registerImmediate(nextHandle); - return nextHandle++; - } - - function clearImmediate(handle) { - delete tasksByHandle[handle]; - } - - function run(task) { - var callback = task.callback; - var args = task.args; - switch (args.length) { - case 0: - callback(); - break; - case 1: - callback(args[0]); - break; - case 2: - callback(args[0], args[1]); - break; - case 3: - callback(args[0], args[1], args[2]); - break; - default: - callback.apply(undefined, args); - break; - } - } - - function runIfPresent(handle) { - // From the spec: "Wait until any invocations of this algorithm started before this one have completed." - // So if we're currently running a task, we'll need to delay this invocation. - if (currentlyRunningATask) { - // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a - // "too much recursion" error. - setTimeout(runIfPresent, 0, handle); - } else { - var task = tasksByHandle[handle]; - if (task) { - currentlyRunningATask = true; - try { - run(task); - } finally { - clearImmediate(handle); - currentlyRunningATask = false; - } - } - } - } - - function installNextTickImplementation() { - registerImmediate = function(handle) { - process.nextTick(function () { runIfPresent(handle); }); - }; - } - - function canUsePostMessage() { - // The test against `importScripts` prevents this implementation from being installed inside a web worker, - // where `global.postMessage` means something completely different and can't be used for this purpose. - if (global.postMessage && !global.importScripts) { - var postMessageIsAsynchronous = true; - var oldOnMessage = global.onmessage; - global.onmessage = function() { - postMessageIsAsynchronous = false; - }; - global.postMessage("", "*"); - global.onmessage = oldOnMessage; - return postMessageIsAsynchronous; - } - } - - function installPostMessageImplementation() { - // Installs an event handler on `global` for the `message` event: see - // * https://developer.mozilla.org/en/DOM/window.postMessage - // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages - - var messagePrefix = "setImmediate$" + Math.random() + "$"; - var onGlobalMessage = function(event) { - if (event.source === global && - typeof event.data === "string" && - event.data.indexOf(messagePrefix) === 0) { - runIfPresent(+event.data.slice(messagePrefix.length)); - } - }; - - if (global.addEventListener) { - global.addEventListener("message", onGlobalMessage, false); - } else { - global.attachEvent("onmessage", onGlobalMessage); - } - - registerImmediate = function(handle) { - global.postMessage(messagePrefix + handle, "*"); - }; - } - - function installMessageChannelImplementation() { - var channel = new MessageChannel(); - channel.port1.onmessage = function(event) { - var handle = event.data; - runIfPresent(handle); - }; - - registerImmediate = function(handle) { - channel.port2.postMessage(handle); - }; - } - - function installReadyStateChangeImplementation() { - var html = doc.documentElement; - registerImmediate = function(handle) { - // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted - // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called. - var script = doc.createElement("script"); - script.onreadystatechange = function () { - runIfPresent(handle); - script.onreadystatechange = null; - html.removeChild(script); - script = null; - }; - html.appendChild(script); - }; - } - - function installSetTimeoutImplementation() { - registerImmediate = function(handle) { - setTimeout(runIfPresent, 0, handle); - }; - } - - // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live. - var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global); - attachTo = attachTo && attachTo.setTimeout ? attachTo : global; - - // Don't get fooled by e.g. browserify environments. - if ({}.toString.call(global.process) === "[object process]") { - // For Node.js before 0.9 - installNextTickImplementation(); - - } else if (canUsePostMessage()) { - // For non-IE10 modern browsers - installPostMessageImplementation(); - - } else if (global.MessageChannel) { - // For web workers, where supported - installMessageChannelImplementation(); - - } else if (doc && "onreadystatechange" in doc.createElement("script")) { - // For IE 6–8 - installReadyStateChangeImplementation(); - - } else { - // For older browsers - installSetTimeoutImplementation(); - } - - attachTo.setImmediate = setImmediate; - attachTo.clearImmediate = clearImmediate; -}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self)); - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(23), __webpack_require__(11))) - -/***/ }), -/* 149 */ -/***/ (function(module, exports, __webpack_require__) { - -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -module.exports = Stream; - -var EE = __webpack_require__(47).EventEmitter; -var inherits = __webpack_require__(16); - -inherits(Stream, EE); -Stream.Readable = __webpack_require__(51); -Stream.Writable = __webpack_require__(147); -Stream.Duplex = __webpack_require__(142); -Stream.Transform = __webpack_require__(146); -Stream.PassThrough = __webpack_require__(145); - -// Backwards-compat with node 0.4.x -Stream.Stream = Stream; - - - -// old-style streams. Note that the pipe method (the only relevant -// part of this class) is overridden in the Readable class. - -function Stream() { - EE.call(this); -} - -Stream.prototype.pipe = function(dest, options) { - var source = this; - - function ondata(chunk) { - if (dest.writable) { - if (false === dest.write(chunk) && source.pause) { - source.pause(); - } - } - } - - source.on('data', ondata); - - function ondrain() { - if (source.readable && source.resume) { - source.resume(); - } - } - - dest.on('drain', ondrain); - - // If the 'end' option is not supplied, dest.end() will be called when - // source gets the 'end' or 'close' events. Only dest.end() once. - if (!dest._isStdio && (!options || options.end !== false)) { - source.on('end', onend); - source.on('close', onclose); - } - - var didOnEnd = false; - function onend() { - if (didOnEnd) return; - didOnEnd = true; - - dest.end(); - } - - - function onclose() { - if (didOnEnd) return; - didOnEnd = true; - - if (typeof dest.destroy === 'function') dest.destroy(); - } - - // don't leave dangling pipes when there are errors. - function onerror(er) { - cleanup(); - if (EE.listenerCount(this, 'error') === 0) { - throw er; // Unhandled stream error in pipe. - } - } - - source.on('error', onerror); - dest.on('error', onerror); - - // remove all the event listeners that were added. - function cleanup() { - source.removeListener('data', ondata); - dest.removeListener('drain', ondrain); - - source.removeListener('end', onend); - source.removeListener('close', onclose); - - source.removeListener('error', onerror); - dest.removeListener('error', onerror); - - source.removeListener('end', cleanup); - source.removeListener('close', cleanup); - - dest.removeListener('close', cleanup); - } - - source.on('end', cleanup); - source.on('close', cleanup); - - dest.on('close', cleanup); - - dest.emit('pipe', source); - - // Allow for unix-like usage: A.pipe(B).pipe(C) - return dest; -}; - - -/***/ }), -/* 150 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_note_parser__ = __webpack_require__(141); -/* harmony export (immutable) */ __webpack_exports__["toMidi"] = toMidi; -/* harmony export (immutable) */ __webpack_exports__["note"] = note; -/** - * A midi note number is a number representation of a note pitch. It can be - * integers so it's equal tempered tuned, or float to indicate it's not - * tuned into equal temepered scale. - * - * This module contains functions to convert to and from midi notes. - * - * @example - * var midi = require('tonal-midi') - * midi.toMidi('A4') // => 69 - * midi.note(69) // => 'A4' - * midi.note(61) // => 'Db4' - * midi.note(61, true) // => 'C#4' - * - * @module midi - */ - - - -/** - * Convert the given note to a midi note number. If you pass a midi number it - * will returned as is. - * - * @param {Array|String|Number} note - the note to get the midi number from - * @return {Integer} the midi number or null if not valid pitch - * @example - * midi.toMidi('C4') // => 60 - * midi.toMidi(60) // => 60 - * midi.toMidi('60') // => 60 - */ -function toMidi (val) { - if (Array.isArray(val) && val.length === 2) return val[0] * 7 + val[1] * 12 + 12 - return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_note_parser__["a" /* midi */])(val) -} - -var FLATS = 'C Db D Eb E F Gb G Ab A Bb B'.split(' ') -var SHARPS = 'C C# D D# E F F# G G# A A# B'.split(' ') - -/** - * Given a midi number, returns a note name. The altered notes will have - * flats unless explicitly set with the optional `useSharps` parameter. - * - * @function - * @param {Integer} midi - the midi note number - * @param {Boolean} useSharps - (Optional) set to true to use sharps instead of flats - * @return {String} the note name - * @example - * var midi = require('tonal-midi') - * midi.note(61) // => 'Db4' - * midi.note(61, true) // => 'C#4' - * // it rounds to nearest note - * midi.note(61.7) // => 'D4' - */ -function note (num, sharps) { - if (num === true || num === false) return function (m) { return note(m, num) } - num = Math.round(num) - var pcs = sharps === true ? SHARPS : FLATS - var pc = pcs[num % 12] - var o = Math.floor(num / 12) - 1 - return pc + o -} - - -/***/ }), -/* 151 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(global) { -/** - * Module exports. - */ - -module.exports = deprecate; - -/** - * Mark that a method should not be used. - * Returns a modified function which warns once by default. - * - * If `localStorage.noDeprecation = true` is set, then it is a no-op. - * - * If `localStorage.throwDeprecation = true` is set, then deprecated functions - * will throw an Error when invoked. - * - * If `localStorage.traceDeprecation = true` is set, then deprecated functions - * will invoke `console.trace()` instead of `console.error()`. - * - * @param {Function} fn - the function to deprecate - * @param {String} msg - the string to print to the console when `fn` is invoked - * @returns {Function} a new "deprecated" version of `fn` - * @api public - */ - -function deprecate (fn, msg) { - if (config('noDeprecation')) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (config('throwDeprecation')) { - throw new Error(msg); - } else if (config('traceDeprecation')) { - console.trace(msg); - } else { - console.warn(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -} - -/** - * Checks `localStorage` for boolean values for the given `name`. - * - * @param {String} name - * @returns {Boolean} - * @api private - */ - -function config (name) { - // accessing global.localStorage can trigger a DOMException in sandboxed iframes - try { - if (!global.localStorage) return false; - } catch (_) { - return false; - } - var val = global.localStorage[name]; - if (null == val) return false; - return String(val).toLowerCase() === 'true'; -} - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(23))) - -/***/ }), -/* 152 */ -/***/ (function(module, exports) { - -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - - -/***/ }), -/* 153 */ -/***/ (function(module, exports) { - -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; -} - -/***/ }), -/* 154 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; -}; - - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -}; - - -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; - - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} -exports.inspect = inspect; - - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; - - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = __webpack_require__(153); - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; - - -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. + * StartAudioContext.js + * @author Yotam Mann + * @license http://opensource.org/licenses/MIT MIT License + * @copyright 2016 Yotam Mann */ -exports.inherits = __webpack_require__(152); - -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(23), __webpack_require__(11))) - -/***/ }), -/* 155 */ -/***/ (function(module, exports, __webpack_require__) { - -var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* - -WebMidi v2.2.0 - -WebMidi.js helps you tame the Web MIDI API. Send and receive MIDI messages with ease. Control instruments with user-friendly functions (playNote, sendPitchBend, etc.). React to MIDI input with simple event listeners (noteon, pitchbend, controlchange, etc.). -https://github.com/djipco/webmidi - - -The MIT License (MIT) - -Copyright (c) 2015-2018, Jean-Philippe Côté - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, -sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT -NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES -OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -!function(scope){"use strict";function WebMidi(){if(WebMidi.prototype._singleton)throw new Error("WebMidi is a singleton, it cannot be instantiated directly.");WebMidi.prototype._singleton=this,this._inputs=[],this._outputs=[],this._userHandlers={},this._stateChangeQueue=[],this._processingStateChange=!1,this._midiInterfaceEvents=["connected","disconnected"],this._notes=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],this._semitones={C:0,D:2,E:4,F:5,G:7,A:9,B:11},Object.defineProperties(this,{MIDI_SYSTEM_MESSAGES:{value:{sysex:240,timecode:241,songposition:242,songselect:243,tuningrequest:246,sysexend:247,clock:248,start:250,"continue":251,stop:252,activesensing:254,reset:255,midimessage:0,unknownsystemmessage:-1},writable:!1,enumerable:!0,configurable:!1},MIDI_CHANNEL_MESSAGES:{value:{noteoff:8,noteon:9,keyaftertouch:10,controlchange:11,channelmode:11,programchange:12,channelaftertouch:13,pitchbend:14},writable:!1,enumerable:!0,configurable:!1},MIDI_REGISTERED_PARAMETER:{value:{pitchbendrange:[0,0],channelfinetuning:[0,1],channelcoarsetuning:[0,2],tuningprogram:[0,3],tuningbank:[0,4],modulationrange:[0,5],azimuthangle:[61,0],elevationangle:[61,1],gain:[61,2],distanceratio:[61,3],maximumdistance:[61,4],maximumdistancegain:[61,5],referencedistanceratio:[61,6],panspreadangle:[61,7],rollangle:[61,8]},writable:!1,enumerable:!0,configurable:!1},MIDI_CONTROL_CHANGE_MESSAGES:{value:{bankselectcoarse:0,modulationwheelcoarse:1,breathcontrollercoarse:2,footcontrollercoarse:4,portamentotimecoarse:5,dataentrycoarse:6,volumecoarse:7,balancecoarse:8,pancoarse:10,expressioncoarse:11,effectcontrol1coarse:12,effectcontrol2coarse:13,generalpurposeslider1:16,generalpurposeslider2:17,generalpurposeslider3:18,generalpurposeslider4:19,bankselectfine:32,modulationwheelfine:33,breathcontrollerfine:34,footcontrollerfine:36,portamentotimefine:37,dataentryfine:38,volumefine:39,balancefine:40,panfine:42,expressionfine:43,effectcontrol1fine:44,effectcontrol2fine:45,holdpedal:64,portamento:65,sustenutopedal:66,softpedal:67,legatopedal:68,hold2pedal:69,soundvariation:70,resonance:71,soundreleasetime:72,soundattacktime:73,brightness:74,soundcontrol6:75,soundcontrol7:76,soundcontrol8:77,soundcontrol9:78,soundcontrol10:79,generalpurposebutton1:80,generalpurposebutton2:81,generalpurposebutton3:82,generalpurposebutton4:83,reverblevel:91,tremololevel:92,choruslevel:93,celestelevel:94,phaserlevel:95,databuttonincrement:96,databuttondecrement:97,nonregisteredparametercoarse:98,nonregisteredparameterfine:99,registeredparametercoarse:100,registeredparameterfine:101},writable:!1,enumerable:!0,configurable:!1},MIDI_CHANNEL_MODE_MESSAGES:{value:{allsoundoff:120,resetallcontrollers:121,localcontrol:122,allnotesoff:123,omnimodeoff:124,omnimodeon:125,monomodeon:126,polymodeon:127},writable:!1,enumerable:!0,configurable:!1},octaveOffset:{value:0,writable:!0,enumerable:!0,configurable:!1}}),Object.defineProperties(this,{supported:{enumerable:!0,get:function(){return"requestMIDIAccess"in navigator}},enabled:{enumerable:!0,get:function(){return void 0!==this["interface"]}.bind(this)},inputs:{enumerable:!0,get:function(){return this._inputs}.bind(this)},outputs:{enumerable:!0,get:function(){return this._outputs}.bind(this)},sysexEnabled:{enumerable:!0,get:function(){return!(!this["interface"]||!this["interface"].sysexEnabled)}.bind(this)},time:{enumerable:!0,get:function(){return performance.now()}}})}function Input(midiInput){var that=this;this._userHandlers={channel:{},system:{}},this._midiInput=midiInput,Object.defineProperties(this,{connection:{enumerable:!0,get:function(){return that._midiInput.connection}},id:{enumerable:!0,get:function(){return that._midiInput.id}},manufacturer:{enumerable:!0,get:function(){return that._midiInput.manufacturer}},name:{enumerable:!0,get:function(){return that._midiInput.name}},state:{enumerable:!0,get:function(){return that._midiInput.state}},type:{enumerable:!0,get:function(){return that._midiInput.type}}}),this._initializeUserHandlers(),this._midiInput.onmidimessage=this._onMidiMessage.bind(this)}function Output(midiOutput){var that=this;this._midiOutput=midiOutput,Object.defineProperties(this,{connection:{enumerable:!0,get:function(){return that._midiOutput.connection}},id:{enumerable:!0,get:function(){return that._midiOutput.id}},manufacturer:{enumerable:!0,get:function(){return that._midiOutput.manufacturer}},name:{enumerable:!0,get:function(){return that._midiOutput.name}},state:{enumerable:!0,get:function(){return that._midiOutput.state}},type:{enumerable:!0,get:function(){return that._midiOutput.type}}})}var wm=new WebMidi;WebMidi.prototype.enable=function(callback,sysex){return this.enabled?void 0:this.supported?void navigator.requestMIDIAccess({sysex:sysex}).then(function(midiAccess){function onPortsOpen(){clearTimeout(promiseTimeout),this._updateInputsAndOutputs(),this["interface"].onstatechange=this._onInterfaceStateChange.bind(this),"function"==typeof callback&&callback.call(this),events.forEach(function(event){this._onInterfaceStateChange(event)}.bind(this))}var promiseTimeout,events=[],promises=[];this["interface"]=midiAccess,this._resetInterfaceUserHandlers(),this["interface"].onstatechange=function(e){events.push(e)};for(var inputs=midiAccess.inputs.values(),input=inputs.next();input&&!input.done;input=inputs.next())promises.push(input.value.open());for(var outputs=midiAccess.outputs.values(),output=outputs.next();output&&!output.done;output=outputs.next())promises.push(output.value.open());promiseTimeout=setTimeout(onPortsOpen.bind(this),200),Promise&&Promise.all(promises)["catch"](function(err){}).then(onPortsOpen.bind(this))}.bind(this),function(err){"function"==typeof callback&&callback.call(this,err)}.bind(this)):void("function"==typeof callback&&callback(new Error("The Web MIDI API is not supported by your browser.")))},WebMidi.prototype.disable=function(){if(!this.supported)throw new Error("The Web MIDI API is not supported by your browser.");this["interface"]&&(this["interface"].onstatechange=void 0),this["interface"]=void 0,this._inputs=[],this._outputs=[],this._resetInterfaceUserHandlers()},WebMidi.prototype.addListener=function(type,listener){if(!this.enabled)throw new Error("WebMidi must be enabled before adding event listeners.");if("function"!=typeof listener)throw new TypeError("The 'listener' parameter must be a function.");if(!(this._midiInterfaceEvents.indexOf(type)>=0))throw new TypeError("The specified event type is not supported.");return this._userHandlers[type].push(listener),this},WebMidi.prototype.hasListener=function(type,listener){if(!this.enabled)throw new Error("WebMidi must be enabled before checking event listeners.");if("function"!=typeof listener)throw new TypeError("The 'listener' parameter must be a function.");if(!(this._midiInterfaceEvents.indexOf(type)>=0))throw new TypeError("The specified event type is not supported.");for(var o=0;o<this._userHandlers[type].length;o++)if(this._userHandlers[type][o]===listener)return!0;return!1},WebMidi.prototype.removeListener=function(type,listener){if(!this.enabled)throw new Error("WebMidi must be enabled before removing event listeners.");if(void 0!==listener&&"function"!=typeof listener)throw new TypeError("The 'listener' parameter must be a function.");if(this._midiInterfaceEvents.indexOf(type)>=0)if(listener)for(var o=0;o<this._userHandlers[type].length;o++)this._userHandlers[type][o]===listener&&this._userHandlers[type].splice(o,1);else this._userHandlers[type]=[];else{if(void 0!==type)throw new TypeError("The specified event type is not supported.");this._resetInterfaceUserHandlers()}return this},WebMidi.prototype.toMIDIChannels=function(channel){var channels;return channels="all"===channel||void 0===channel?["all"]:Array.isArray(channel)?channel:[channel],channels.indexOf("all")>-1&&(channels=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]),channels.map(function(ch){return parseInt(ch)}).filter(function(ch){return ch>=1&&16>=ch})},WebMidi.prototype.getInputById=function(id){if(!this.enabled)throw new Error("WebMidi is not enabled.");for(var i=0;i<this.inputs.length;i++)if(this.inputs[i].id===id)return this.inputs[i];return!1},WebMidi.prototype.getOutputById=function(id){if(!this.enabled)throw new Error("WebMidi is not enabled.");for(var i=0;i<this.outputs.length;i++)if(this.outputs[i].id===id)return this.outputs[i];return!1},WebMidi.prototype.getInputByName=function(name){if(!this.enabled)throw new Error("WebMidi is not enabled.");for(var i=0;i<this.inputs.length;i++)if(~this.inputs[i].name.indexOf(name))return this.inputs[i];return!1},WebMidi.prototype.getOctave=function(number){return null!=number&&number>=0&&127>=number?Math.floor(Math.floor(number)/12-1)+Math.floor(wm.octaveOffset):void 0},WebMidi.prototype.getOutputByName=function(name){if(!this.enabled)throw new Error("WebMidi is not enabled.");for(var i=0;i<this.outputs.length;i++)if(~this.outputs[i].name.indexOf(name))return this.outputs[i];return!1},WebMidi.prototype.guessNoteNumber=function(input){var output=!1;if(input&&input.toFixed&&input>=0&&127>=input?output=Math.round(input):parseInt(input)>=0&&parseInt(input)<=127?output=parseInt(input):("string"==typeof input||input instanceof String)&&(output=this.noteNameToNumber(input)),output===!1)throw new Error("Invalid input value ("+input+").");return output},WebMidi.prototype.noteNameToNumber=function(name){"string"!=typeof name&&(name="");var matches=name.match(/([CDEFGAB])(#{0,2}|b{0,2})(-?\d+)/i);if(!matches)throw new RangeError("Invalid note name.");var semitones=wm._semitones[matches[1].toUpperCase()],octave=parseInt(matches[3]),result=12*(octave+1-Math.floor(wm.octaveOffset))+semitones;if(matches[2].toLowerCase().indexOf("b")>-1?result-=matches[2].length:matches[2].toLowerCase().indexOf("#")>-1&&(result+=matches[2].length),0>result||result>127)throw new RangeError("Invalid note name or note outside valid range.");return result},WebMidi.prototype._updateInputsAndOutputs=function(){this._updateInputs(),this._updateOutputs()},WebMidi.prototype._updateInputs=function(){for(var i=0;i<this._inputs.length;i++){for(var remove=!0,updated=this["interface"].inputs.values(),input=updated.next();input&&!input.done;input=updated.next())if(this._inputs[i]._midiInput===input.value){remove=!1;break}remove&&this._inputs.splice(i,1)}this["interface"]&&this["interface"].inputs.forEach(function(nInput){for(var add=!0,j=0;j<this._inputs.length;j++)this._inputs[j]._midiInput===nInput&&(add=!1);add&&this._inputs.push(new Input(nInput))}.bind(this))},WebMidi.prototype._updateOutputs=function(){for(var i=0;i<this._outputs.length;i++){for(var remove=!0,updated=this["interface"].outputs.values(),output=updated.next();output&&!output.done;output=updated.next())if(this._outputs[i]._midiOutput===output.value){remove=!1;break}remove&&this._outputs.splice(i,1)}this["interface"]&&this["interface"].outputs.forEach(function(nOutput){for(var add=!0,j=0;j<this._outputs.length;j++)this._outputs[j]._midiOutput===nOutput&&(add=!1);add&&this._outputs.push(new Output(nOutput))}.bind(this))},WebMidi.prototype._onInterfaceStateChange=function(e){this._updateInputsAndOutputs();var event={timestamp:e.timeStamp,type:e.port.state};this["interface"]&&"connected"===e.port.state?"output"===e.port.type?event.port=this.getOutputById(e.port.id):"input"===e.port.type&&(event.port=this.getInputById(e.port.id)):event.port={connection:"closed",id:e.port.id,manufacturer:e.port.manufacturer,name:e.port.name,state:e.port.state,type:e.port.type},this._userHandlers[e.port.state].forEach(function(handler){handler(event)})},WebMidi.prototype._resetInterfaceUserHandlers=function(){for(var i=0;i<this._midiInterfaceEvents.length;i++)this._userHandlers[this._midiInterfaceEvents[i]]=[]},Input.prototype.addListener=function(type,channel,listener){var that=this;if(void 0===channel&&(channel="all"),Array.isArray(channel)||(channel=[channel]),channel.forEach(function(item){if("all"!==item&&!(item>=1&&16>=item))throw new RangeError("The 'channel' parameter is invalid.")}),"function"!=typeof listener)throw new TypeError("The 'listener' parameter must be a function.");if(void 0!==wm.MIDI_SYSTEM_MESSAGES[type])this._userHandlers.system[type]||(this._userHandlers.system[type]=[]),this._userHandlers.system[type].push(listener);else{if(void 0===wm.MIDI_CHANNEL_MESSAGES[type])throw new TypeError("The specified event type is not supported.");if(channel.indexOf("all")>-1){channel=[];for(var j=1;16>=j;j++)channel.push(j)}this._userHandlers.channel[type]||(this._userHandlers.channel[type]=[]),channel.forEach(function(ch){that._userHandlers.channel[type][ch]||(that._userHandlers.channel[type][ch]=[]),that._userHandlers.channel[type][ch].push(listener)})}return this},Input.prototype.on=Input.prototype.addListener,Input.prototype.hasListener=function(type,channel,listener){var that=this;if("function"!=typeof listener)throw new TypeError("The 'listener' parameter must be a function.");if(void 0===channel&&(channel="all"),channel.constructor!==Array&&(channel=[channel]),void 0!==wm.MIDI_SYSTEM_MESSAGES[type]){for(var o=0;o<this._userHandlers.system[type].length;o++)if(this._userHandlers.system[type][o]===listener)return!0}else if(void 0!==wm.MIDI_CHANNEL_MESSAGES[type]){if(channel.indexOf("all")>-1){channel=[];for(var j=1;16>=j;j++)channel.push(j)}return this._userHandlers.channel[type]?channel.every(function(chNum){var listeners=that._userHandlers.channel[type][chNum];return listeners&&listeners.indexOf(listener)>-1}):!1}return!1},Input.prototype.removeListener=function(type,channel,listener){var that=this;if(void 0!==listener&&"function"!=typeof listener)throw new TypeError("The 'listener' parameter must be a function.");if(void 0===channel&&(channel="all"),channel.constructor!==Array&&(channel=[channel]),void 0!==wm.MIDI_SYSTEM_MESSAGES[type])if(void 0===listener)this._userHandlers.system[type]=[];else for(var o=0;o<this._userHandlers.system[type].length;o++)this._userHandlers.system[type][o]===listener&&this._userHandlers.system[type].splice(o,1);else if(void 0!==wm.MIDI_CHANNEL_MESSAGES[type]){if(channel.indexOf("all")>-1){channel=[];for(var j=1;16>=j;j++)channel.push(j)}if(!this._userHandlers.channel[type])return this;channel.forEach(function(chNum){var listeners=that._userHandlers.channel[type][chNum];if(listeners)if(void 0===listener)that._userHandlers.channel[type][chNum]=[];else for(var l=0;l<listeners.length;l++)listeners[l]===listener&&listeners.splice(l,1)})}else{if(void 0!==type)throw new TypeError("The specified event type is not supported.");this._initializeUserHandlers()}return this},Input.prototype._initializeUserHandlers=function(){for(var prop1 in wm.MIDI_CHANNEL_MESSAGES)wm.MIDI_CHANNEL_MESSAGES.hasOwnProperty(prop1)&&(this._userHandlers.channel[prop1]={});for(var prop2 in wm.MIDI_SYSTEM_MESSAGES)wm.MIDI_SYSTEM_MESSAGES.hasOwnProperty(prop2)&&(this._userHandlers.system[prop2]=[])},Input.prototype._onMidiMessage=function(e){if(this._userHandlers.system.midimessage.length>0){var event={target:this,data:e.data,timestamp:e.timeStamp,type:"midimessage"};this._userHandlers.system.midimessage.forEach(function(callback){callback(event)})}e.data[0]<240?this._parseChannelEvent(e):e.data[0]<=255&&this._parseSystemEvent(e)},Input.prototype._parseChannelEvent=function(e){var data1,data2,command=e.data[0]>>4,channel=(15&e.data[0])+1;e.data.length>1&&(data1=e.data[1],data2=e.data.length>2?e.data[2]:void 0);var event={target:this,data:e.data,timestamp:e.timeStamp,channel:channel};command===wm.MIDI_CHANNEL_MESSAGES.noteoff||command===wm.MIDI_CHANNEL_MESSAGES.noteon&&0===data2?(event.type="noteoff",event.note={number:data1,name:wm._notes[data1%12],octave:wm.getOctave(data1)},event.velocity=data2/127,event.rawVelocity=data2):command===wm.MIDI_CHANNEL_MESSAGES.noteon?(event.type="noteon",event.note={number:data1,name:wm._notes[data1%12],octave:wm.getOctave(data1)},event.velocity=data2/127,event.rawVelocity=data2):command===wm.MIDI_CHANNEL_MESSAGES.keyaftertouch?(event.type="keyaftertouch",event.note={number:data1,name:wm._notes[data1%12],octave:wm.getOctave(data1)},event.value=data2/127):command===wm.MIDI_CHANNEL_MESSAGES.controlchange&&data1>=0&&119>=data1?(event.type="controlchange",event.controller={number:data1,name:this.getCcNameByNumber(data1)},event.value=data2):command===wm.MIDI_CHANNEL_MESSAGES.channelmode&&data1>=120&&127>=data1?(event.type="channelmode",event.controller={number:data1,name:this.getChannelModeByNumber(data1)},event.value=data2):command===wm.MIDI_CHANNEL_MESSAGES.programchange?(event.type="programchange",event.value=data1):command===wm.MIDI_CHANNEL_MESSAGES.channelaftertouch?(event.type="channelaftertouch",event.value=data1/127):command===wm.MIDI_CHANNEL_MESSAGES.pitchbend?(event.type="pitchbend",event.value=((data2<<7)+data1-8192)/8192):event.type="unknownchannelmessage",this._userHandlers.channel[event.type]&&this._userHandlers.channel[event.type][channel]&&this._userHandlers.channel[event.type][channel].forEach(function(callback){callback(event)})},Input.prototype.getCcNameByNumber=function(number){if(number=Math.floor(number),!(number>=0&&119>=number))throw new RangeError("The control change number must be between 0 and 119.");for(var cc in wm.MIDI_CONTROL_CHANGE_MESSAGES)if(wm.MIDI_CONTROL_CHANGE_MESSAGES.hasOwnProperty(cc)&&number===wm.MIDI_CONTROL_CHANGE_MESSAGES[cc])return cc;return void 0},Input.prototype.getChannelModeByNumber=function(number){if(number=Math.floor(number),!(number>=120&&status<=127))throw new RangeError("The control change number must be between 120 and 127.");for(var cm in wm.MIDI_CHANNEL_MODE_MESSAGES)if(wm.MIDI_CHANNEL_MODE_MESSAGES.hasOwnProperty(cm)&&number===wm.MIDI_CHANNEL_MODE_MESSAGES[cm])return cm},Input.prototype._parseSystemEvent=function(e){var command=e.data[0],event={target:this,data:e.data,timestamp:e.timeStamp};command===wm.MIDI_SYSTEM_MESSAGES.sysex?event.type="sysex":command===wm.MIDI_SYSTEM_MESSAGES.timecode?event.type="timecode":command===wm.MIDI_SYSTEM_MESSAGES.songposition?event.type="songposition":command===wm.MIDI_SYSTEM_MESSAGES.songselect?(event.type="songselect",event.song=e.data[1]):command===wm.MIDI_SYSTEM_MESSAGES.tuningrequest?event.type="tuningrequest":command===wm.MIDI_SYSTEM_MESSAGES.clock?event.type="clock":command===wm.MIDI_SYSTEM_MESSAGES.start?event.type="start":command===wm.MIDI_SYSTEM_MESSAGES["continue"]?event.type="continue":command===wm.MIDI_SYSTEM_MESSAGES.stop?event.type="stop":command===wm.MIDI_SYSTEM_MESSAGES.activesensing?event.type="activesensing":command===wm.MIDI_SYSTEM_MESSAGES.reset?event.type="reset":event.type="unknownsystemmessage",this._userHandlers.system[event.type]&&this._userHandlers.system[event.type].forEach(function(callback){callback(event)})},Output.prototype.send=function(status,data,timestamp){if(!(status>=128&&255>=status))throw new RangeError("The status byte must be an integer between 128 (0x80) and 255 (0xFF).");void 0===data&&(data=[]),Array.isArray(data)||(data=[data]);var message=[];return data.forEach(function(item,index){var parsed=Math.floor(item);if(!(parsed>=0&&255>=parsed))throw new RangeError("Data bytes must be integers between 0 (0x00) and 255 (0xFF).");message.push(parsed)}),this._midiOutput.send([status].concat(message),parseFloat(timestamp)||0),this},Output.prototype.sendSysex=function(manufacturer,data,options){if(!wm.sysexEnabled)throw new Error("Sysex message support must first be activated.");return options=options||{},manufacturer=[].concat(manufacturer),data.forEach(function(item){if(0>item||item>127)throw new RangeError("The data bytes of a sysex message must be integers between 0 (0x00) and 127 (0x7F).")}),data=manufacturer.concat(data,wm.MIDI_SYSTEM_MESSAGES.sysexend),this.send(wm.MIDI_SYSTEM_MESSAGES.sysex,data,this._parseTimeParameter(options.time)),this},Output.prototype.sendTimecodeQuarterFrame=function(value,options){return options=options||{},this.send(wm.MIDI_SYSTEM_MESSAGES.timecode,value,this._parseTimeParameter(options.time)),this},Output.prototype.sendSongPosition=function(value,options){value=Math.floor(value)||0,options=options||{};var msb=value>>7&127,lsb=127&value;return this.send(wm.MIDI_SYSTEM_MESSAGES.songposition,[msb,lsb],this._parseTimeParameter(options.time)),this},Output.prototype.sendSongSelect=function(value,options){if(value=Math.floor(value),options=options||{},!(value>=0&&127>=value))throw new RangeError("The song number must be between 0 and 127.");return this.send(wm.MIDI_SYSTEM_MESSAGES.songselect,[value],this._parseTimeParameter(options.time)),this},Output.prototype.sendTuningRequest=function(options){return options=options||{},this.send(wm.MIDI_SYSTEM_MESSAGES.tuningrequest,void 0,this._parseTimeParameter(options.time)),this},Output.prototype.sendClock=function(options){return options=options||{},this.send(wm.MIDI_SYSTEM_MESSAGES.clock,void 0,this._parseTimeParameter(options.time)),this},Output.prototype.sendStart=function(options){return options=options||{},this.send(wm.MIDI_SYSTEM_MESSAGES.start,void 0,this._parseTimeParameter(options.time)),this},Output.prototype.sendContinue=function(options){return options=options||{},this.send(wm.MIDI_SYSTEM_MESSAGES["continue"],void 0,this._parseTimeParameter(options.time)),this},Output.prototype.sendStop=function(options){return options=options||{},this.send(wm.MIDI_SYSTEM_MESSAGES.stop,void 0,this._parseTimeParameter(options.time)),this},Output.prototype.sendActiveSensing=function(options){return options=options||{},this.send(wm.MIDI_SYSTEM_MESSAGES.activesensing,[],this._parseTimeParameter(options.time)),this},Output.prototype.sendReset=function(options){return options=options||{},this.send(wm.MIDI_SYSTEM_MESSAGES.reset,void 0,this._parseTimeParameter(options.time)),this},Output.prototype.stopNote=function(note,channel,options){if("all"===note)return this.sendChannelMode("allnotesoff",0,channel,options);var nVelocity=64;return options=options||{},options.rawVelocity?!isNaN(options.velocity)&&options.velocity>=0&&options.velocity<=127&&(nVelocity=options.velocity):!isNaN(options.velocity)&&options.velocity>=0&&options.velocity<=1&&(nVelocity=127*options.velocity),this._convertNoteToArray(note).forEach(function(item){wm.toMIDIChannels(channel).forEach(function(ch){this.send((wm.MIDI_CHANNEL_MESSAGES.noteoff<<4)+(ch-1),[item,Math.round(nVelocity)],this._parseTimeParameter(options.time))}.bind(this))}.bind(this)),this},Output.prototype.playNote=function(note,channel,options){var nVelocity=64;if(options=options||{},options.rawVelocity?!isNaN(options.velocity)&&options.velocity>=0&&options.velocity<=127&&(nVelocity=options.velocity):!isNaN(options.velocity)&&options.velocity>=0&&options.velocity<=1&&(nVelocity=127*options.velocity),options.time=this._parseTimeParameter(options.time),this._convertNoteToArray(note).forEach(function(item){wm.toMIDIChannels(channel).forEach(function(ch){this.send((wm.MIDI_CHANNEL_MESSAGES.noteon<<4)+(ch-1),[item,Math.round(nVelocity)],options.time)}.bind(this))}.bind(this)),!isNaN(options.duration)){options.duration<=0&&(options.duration=0);var nRelease=64;options.rawVelocity?!isNaN(options.release)&&options.release>=0&&options.release<=127&&(nRelease=options.release):!isNaN(options.release)&&options.release>=0&&options.release<=1&&(nRelease=127*options.release),this._convertNoteToArray(note).forEach(function(item){wm.toMIDIChannels(channel).forEach(function(ch){this.send((wm.MIDI_CHANNEL_MESSAGES.noteoff<<4)+(ch-1),[item,Math.round(nRelease)],(options.time||wm.time)+options.duration)}.bind(this))}.bind(this))}return this},Output.prototype.sendKeyAftertouch=function(note,channel,pressure,options){var that=this;if(options=options||{},1>channel||channel>16)throw new RangeError("The channel must be between 1 and 16.");(isNaN(pressure)||0>pressure||pressure>1)&&(pressure=.5);var nPressure=Math.round(127*pressure);return this._convertNoteToArray(note).forEach(function(item){wm.toMIDIChannels(channel).forEach(function(ch){that.send((wm.MIDI_CHANNEL_MESSAGES.keyaftertouch<<4)+(ch-1),[item,nPressure],that._parseTimeParameter(options.time))})}),this},Output.prototype.sendControlChange=function(controller,value,channel,options){if(options=options||{},"string"==typeof controller){if(controller=wm.MIDI_CONTROL_CHANGE_MESSAGES[controller],!controller)throw new TypeError("Invalid controller name.")}else if(controller=Math.floor(controller),!(controller>=0&&119>=controller))throw new RangeError("Controller numbers must be between 0 and 119.");if(value=Math.floor(value)||0,!(value>=0&&127>=value))throw new RangeError("Controller value must be between 0 and 127.");return wm.toMIDIChannels(channel).forEach(function(ch){this.send((wm.MIDI_CHANNEL_MESSAGES.controlchange<<4)+(ch-1),[controller,value],this._parseTimeParameter(options.time))}.bind(this)),this},Output.prototype._selectRegisteredParameter=function(parameter,channel,time){var that=this;if(parameter[0]=Math.floor(parameter[0]),!(parameter[0]>=0&¶meter[0]<=127))throw new RangeError("The control65 value must be between 0 and 127");if(parameter[1]=Math.floor(parameter[1]),!(parameter[1]>=0&¶meter[1]<=127))throw new RangeError("The control64 value must be between 0 and 127");return wm.toMIDIChannels(channel).forEach(function(ch){that.sendControlChange(101,parameter[0],channel,{time:time}),that.sendControlChange(100,parameter[1],channel,{time:time})}),this},Output.prototype._selectNonRegisteredParameter=function(parameter,channel,time){var that=this;if(parameter[0]=Math.floor(parameter[0]),!(parameter[0]>=0&¶meter[0]<=127))throw new RangeError("The control63 value must be between 0 and 127");if(parameter[1]=Math.floor(parameter[1]),!(parameter[1]>=0&¶meter[1]<=127))throw new RangeError("The control62 value must be between 0 and 127");return wm.toMIDIChannels(channel).forEach(function(ch){that.sendControlChange(99,parameter[0],channel,{time:time}),that.sendControlChange(98,parameter[1],channel,{time:time})}),this},Output.prototype._setCurrentRegisteredParameter=function(data,channel,time){var that=this;if(data=[].concat(data),data[0]=Math.floor(data[0]),!(data[0]>=0&&data[0]<=127))throw new RangeError("The msb value must be between 0 and 127");return wm.toMIDIChannels(channel).forEach(function(ch){that.sendControlChange(6,data[0],channel,{time:time})}),data[1]=Math.floor(data[1]),data[1]>=0&&data[1]<=127&&wm.toMIDIChannels(channel).forEach(function(ch){that.sendControlChange(38,data[1],channel,{time:time})}),this},Output.prototype._deselectRegisteredParameter=function(channel,time){var that=this;return wm.toMIDIChannels(channel).forEach(function(ch){that.sendControlChange(101,127,channel,{time:time}),that.sendControlChange(100,127,channel,{time:time})}),this},Output.prototype.setRegisteredParameter=function(parameter,data,channel,options){var that=this;if(options=options||{},!Array.isArray(parameter)){if(!wm.MIDI_REGISTERED_PARAMETER[parameter])throw new Error("The specified parameter is not available.");parameter=wm.MIDI_REGISTERED_PARAMETER[parameter]}return wm.toMIDIChannels(channel).forEach(function(ch){that._selectRegisteredParameter(parameter,channel,options.time),that._setCurrentRegisteredParameter(data,channel,options.time),that._deselectRegisteredParameter(channel,options.time)}),this},Output.prototype.setNonRegisteredParameter=function(parameter,data,channel,options){var that=this;if(options=options||{},!(parameter[0]>=0&¶meter[0]<=127&¶meter[1]>=0&¶meter[1]<=127))throw new Error("Position 0 and 1 of the 2-position parameter array must both be between 0 and 127.");return data=[].concat(data),wm.toMIDIChannels(channel).forEach(function(ch){that._selectNonRegisteredParameter(parameter,channel,options.time),that._setCurrentRegisteredParameter(data,channel,options.time),that._deselectRegisteredParameter(channel,options.time)}),this},Output.prototype.incrementRegisteredParameter=function(parameter,channel,options){var that=this;if(options=options||{},!Array.isArray(parameter)){if(!wm.MIDI_REGISTERED_PARAMETER[parameter])throw new Error("The specified parameter is not available.");parameter=wm.MIDI_REGISTERED_PARAMETER[parameter]}return wm.toMIDIChannels(channel).forEach(function(ch){that._selectRegisteredParameter(parameter,channel,options.time),that.sendControlChange(96,0,channel,{time:options.time}),that._deselectRegisteredParameter(channel,options.time)}),this},Output.prototype.decrementRegisteredParameter=function(parameter,channel,options){if(options=options||{},!Array.isArray(parameter)){if(!wm.MIDI_REGISTERED_PARAMETER[parameter])throw new TypeError("The specified parameter is not available.");parameter=wm.MIDI_REGISTERED_PARAMETER[parameter]}return wm.toMIDIChannels(channel).forEach(function(ch){this._selectRegisteredParameter(parameter,channel,options.time),this.sendControlChange(97,0,channel,{time:options.time}),this._deselectRegisteredParameter(channel,options.time)}.bind(this)),this},Output.prototype.setPitchBendRange=function(semitones,cents,channel,options){var that=this;if(options=options||{},semitones=Math.floor(semitones)||0,!(semitones>=0&&127>=semitones))throw new RangeError("The semitones value must be between 0 and 127");if(cents=Math.floor(cents)||0,!(cents>=0&&127>=cents))throw new RangeError("The cents value must be between 0 and 127");return wm.toMIDIChannels(channel).forEach(function(ch){that.setRegisteredParameter("pitchbendrange",[semitones,cents],channel,{time:options.time})}),this},Output.prototype.setModulationRange=function(semitones,cents,channel,options){var that=this;if(options=options||{},semitones=Math.floor(semitones)||0,!(semitones>=0&&127>=semitones))throw new RangeError("The semitones value must be between 0 and 127");if(cents=Math.floor(cents)||0,!(cents>=0&&127>=cents))throw new RangeError("The cents value must be between 0 and 127");return wm.toMIDIChannels(channel).forEach(function(ch){that.setRegisteredParameter("modulationrange",[semitones,cents],channel,{time:options.time})}),this},Output.prototype.setMasterTuning=function(value,channel,options){var that=this;if(options=options||{},value=parseFloat(value)||0,-65>=value||value>=64)throw new RangeError("The value must be a decimal number larger than -65 and smaller than 64.");var coarse=Math.floor(value)+64,fine=value-Math.floor(value);fine=Math.round((fine+1)/2*16383);var msb=fine>>7&127,lsb=127&fine;return wm.toMIDIChannels(channel).forEach(function(ch){that.setRegisteredParameter("channelcoarsetuning",coarse,channel,{time:options.time}),that.setRegisteredParameter("channelfinetuning",[msb,lsb],channel,{time:options.time})}),this},Output.prototype.setTuningProgram=function(value,channel,options){var that=this;if(options=options||{},value=Math.floor(value),!(value>=0&&127>=value))throw new RangeError("The program value must be between 0 and 127");return wm.toMIDIChannels(channel).forEach(function(ch){that.setRegisteredParameter("tuningprogram",value,channel,{time:options.time})}),this},Output.prototype.setTuningBank=function(value,channel,options){var that=this;if(options=options||{},value=Math.floor(value)||0,!(value>=0&&127>=value))throw new RangeError("The bank value must be between 0 and 127");return wm.toMIDIChannels(channel).forEach(function(ch){that.setRegisteredParameter("tuningbank",value,channel,{time:options.time})}),this},Output.prototype.sendChannelMode=function(command,value,channel,options){if(options=options||{},"string"==typeof command){if(command=wm.MIDI_CHANNEL_MODE_MESSAGES[command],!command)throw new TypeError("Invalid channel mode message name.")}else if(command=Math.floor(command),!(command>=120&&127>=command))throw new RangeError("Channel mode numerical identifiers must be between 120 and 127.");if(value=Math.floor(value)||0,0>value||value>127)throw new RangeError("Value must be an integer between 0 and 127.");return wm.toMIDIChannels(channel).forEach(function(ch){this.send((wm.MIDI_CHANNEL_MESSAGES.channelmode<<4)+(ch-1),[command,value],this._parseTimeParameter(options.time))}.bind(this)),this},Output.prototype.sendProgramChange=function(program,channel,options){ -var that=this;if(options=options||{},program=Math.floor(program),isNaN(program)||0>program||program>127)throw new RangeError("Program numbers must be between 0 and 127.");return wm.toMIDIChannels(channel).forEach(function(ch){that.send((wm.MIDI_CHANNEL_MESSAGES.programchange<<4)+(ch-1),[program],that._parseTimeParameter(options.time))}),this},Output.prototype.sendChannelAftertouch=function(pressure,channel,options){var that=this;options=options||{},pressure=parseFloat(pressure),(isNaN(pressure)||0>pressure||pressure>1)&&(pressure=.5);var nPressure=Math.round(127*pressure);return wm.toMIDIChannels(channel).forEach(function(ch){that.send((wm.MIDI_CHANNEL_MESSAGES.channelaftertouch<<4)+(ch-1),[nPressure],that._parseTimeParameter(options.time))}),this},Output.prototype.sendPitchBend=function(bend,channel,options){var that=this;if(options=options||{},isNaN(bend)||-1>bend||bend>1)throw new RangeError("Pitch bend value must be between -1 and 1.");var nLevel=Math.round((bend+1)/2*16383),msb=nLevel>>7&127,lsb=127&nLevel;return wm.toMIDIChannels(channel).forEach(function(ch){that.send((wm.MIDI_CHANNEL_MESSAGES.pitchbend<<4)+(ch-1),[lsb,msb],that._parseTimeParameter(options.time))}),this},Output.prototype._parseTimeParameter=function(time){var parsed,value;return"string"==typeof time&&"+"===time.substring(0,1)?(parsed=parseFloat(time),parsed&&parsed>0&&(value=wm.time+parsed)):(parsed=parseFloat(time),parsed>wm.time&&(value=parsed)),value},Output.prototype._convertNoteToArray=function(note){var notes=[];return Array.isArray(note)||(note=[note]),note.forEach(function(item){notes.push(wm.guessNoteNumber(item))}),notes}, true?!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function(){return wm}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):"undefined"!=typeof module&&module.exports?module.exports=wm:scope.WebMidi||(scope.WebMidi=wm)}(this); - -/***/ }), -/* 156 */ -/***/ (function(module, exports) { - -module.exports = function() {
- throw new Error("define cannot be used indirect");
-};
- - -/***/ }), -/* 157 */ -/***/ (function(module, exports) { - -/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */
-module.exports = __webpack_amd_options__;
- -/* WEBPACK VAR INJECTION */}.call(exports, {})) - -/***/ }), -/* 158 */ -/***/ (function(module, exports) { - -/* (ignored) */ - -/***/ }) -/******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNjNlOTgzOWRkZTIyMTk5YmUyNDkiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL34vYnVmZmVyL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hhcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWlvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fZHVwbGV4LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ZhaWxzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9+L3RvbmUvYnVpbGQvVG9uZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19saWJyYXJ5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1waWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VpZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2xpYi91dGlsLmpzIiwid2VicGFjazovLy8uL34vYnVmZmVyLXNoaW1zL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZWZpbmVkLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1wcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZXh0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwid2VicGFjazovLy8uL34vZXZlbnRzL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9+L25vZGUtbGlicy1icm93c2VyL34vc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWRhYmxlLXN0cmVhbS9yZWFkYWJsZS1icm93c2VyLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9saWIva2FsaW1iYS5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvbGliL3NjYWxlcy5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvbGliL3VpLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9uZXh1c3VpL2Rpc3QvTmV4dXNVSS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2h0bWwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY2FsbC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRldGVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9pc2FycmF5L2luZGV4LmpzIiwid2VicGFjazovLy8uL34vcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwid2VicGFjazovLy8uL34vcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9zdHJlYW0tYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2RhdGEuanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2xpYi9rZXlzLmpzIiwid2VicGFjazovLy8uL2NsaWVudC9saWIvbWlkaS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXJ1bnRpbWUvaGVscGVycy90b0FycmF5LmpzIiwid2VicGFjazovLy8uL2NsaWVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9jbGllbnQvbGliL2ludG9uYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4vY2xpZW50L2xpYi9zdGFydEF1ZGlvQ29udGV4dC5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcnVudGltZS9jb3JlLWpzL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9pcy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9tYXRoL2xvZzIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2tleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vfi9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL34vYmFiZWwtcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly8vLi9+L2Jhc2U2NC1qcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L2ZuL2dldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9mbi9pcy1pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9mbi9tYXRoL2xvZzIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2Fzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qva2V5cy5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZm9yLW9mLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ludm9rZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fa2V5b2YuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19taWNyb3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BkLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLWV4dC5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1zYXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWluZGV4LmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmlzLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLy4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwid2VicGFjazovLy8uL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwid2VicGFjazovLy8uL34vY3N2LXBhcnNlL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2ZpbGUtc2F2ZXIvRmlsZVNhdmVyLmpzIiwid2VicGFjazovLy8uL34vaWVlZTc1NC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L21pZGktd3JpdGVyLWpzL2J1aWxkL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vbm90ZS1wYXJzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFkYWJsZS1zdHJlYW0vZHVwbGV4LWJyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWRhYmxlLXN0cmVhbS90cmFuc2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUtYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly8vLi9+L3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3RvbmFsLW1pZGkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzIiwid2VicGFjazovLy8uL34vdXRpbC9+L2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwid2VicGFjazovLy8uL34vdXRpbC91dGlsLmpzIiwid2VicGFjazovLy8uL34vd2VibWlkaS93ZWJtaWRpLm1pbi5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vYW1kLWRlZmluZS5qcyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vYW1kLW9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vL3V0aWwgKGlnbm9yZWQpIl0sIm5hbWVzIjpbImNob2ljZSIsIm1vZCIsIm5vcm0iLCJyZXF1ZXN0QXVkaW9Db250ZXh0IiwiZGF0YVVSSXRvQmxvYiIsImZ0b20iLCJtdG9mIiwidGFwIiwiZ2V0X2RpZmZfYm91bmRzIiwiZ2V0X2JvdW5kcyIsInRyYW5zcG9zZSIsImlzSXBob25lIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwibWF0Y2giLCJpc0lwYWQiLCJpc0FuZHJvaWQiLCJpc01vYmlsZSIsImlzRGVza3RvcCIsImRvY3VtZW50IiwiYm9keSIsImNsYXNzTGlzdCIsImFkZCIsImJyb3dzZXIiLCJhIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwibGVuZ3RoIiwibiIsIm0iLCJtaW4iLCJtYXgiLCJmbiIsImNvbnRhaW5lciIsImNyZWF0ZUVsZW1lbnQiLCJidXR0b24iLCJpbm5lckhUTUwiLCJzdHlsZSIsInBvc2l0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJ6SW5kZXgiLCJ0b3AiLCJsZWZ0IiwiYmFja2dyb3VuZENvbG9yIiwicGFkZGluZyIsImNvbG9yIiwiZm9udEZhbWlseSIsImJvcmRlclJhZGl1cyIsInRyYW5zZm9ybSIsInRleHRBbGlnbiIsImxpbmVIZWlnaHQiLCJhcHBlbmRDaGlsZCIsIlN0YXJ0QXVkaW9Db250ZXh0Iiwic2V0Q29udGV4dCIsIlRvbmUiLCJjb250ZXh0Iiwib24iLCJvblN0YXJ0ZWQiLCJyZW1vdmUiLCJkYXRhVVJJIiwiYnl0ZVN0cmluZyIsImF0b2IiLCJzcGxpdCIsIm1pbWVTdHJpbmciLCJhYiIsIkFycmF5QnVmZmVyIiwiaWEiLCJVaW50OEFycmF5IiwiaSIsImNoYXJDb2RlQXQiLCJibG9iIiwiQmxvYiIsInR5cGUiLCJmIiwicG93IiwiZSIsInByZXNzIiwicm93cyIsImRpZmZzIiwibWFwIiwicm93X21pbiIsImFwcGx5Iiwicm93Iiwicm93X21heCIsImRhdGFzZXQiLCJsaW5lcyIsInBhcnNlRmxvYXQiLCJyZWR1Y2UiLCJiIiwieiIsImJiIiwiSW5maW5pdHkiLCJpX2xlbiIsImpfbGVuIiwiVCIsIkFycmF5IiwiaiIsInBsYXllcl9jb3VudCIsInNhbXBsZV9pbmRleCIsImNvbXByZXNzb3IiLCJDb21wcmVzc29yIiwidG9NYXN0ZXIiLCJzYW1wbGVzIiwicm9vdCIsImZvckVhY2giLCJzYW1wbGUiLCJwbGF5ZXJzIiwiaW5kZXgiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsImhyZWYiLCJwbGF5ZXIiLCJQbGF5ZXIiLCJ1cmwiLCJyZXRyaWdnZXIiLCJwbGF5YmFja1JhdGUiLCJjb25uZWN0IiwicHVzaCIsInBsYXkiLCJmcmVxIiwidm9sdW1lIiwiYmVzdCIsInZhbHVlIiwic2V0VGltZW91dCIsInN0YXJ0IiwibWVhbnRvbmUiLCJzaGFyZXMiLCJzaGFyZXNfc3VtIiwibWF2aWxhIiwiY2FybG9zX2FscGhhIiwibGFtb250ZSIsImNvbHVuZGkiLCJsaXVfbWFqb3IiLCJsaXVfcGVudGF0b25pYyIsImxpdV9taW5vciIsImxpdV9tZWxvZGljX21pbm9yIiwic2NhbGVzIiwiaW50ZXJ2YWxzIiwibmFtZSIsInRldCIsInNjbCIsIm9wdCIsIkludG9uYXRpb24iLCJzY2FsZSIsImhhbmRsZUNoYW5nZSIsImJ1aWxkIiwiaGVhZGluZyIsImFkZEV2ZW50TGlzdGVuZXIiLCJwaWNrIiwic2NhbGVfbGlzdCIsImJ1aWxkX29wdGlvbnMiLCJlbCIsIm9wdGlvbiIsInRhcmdldCIsImN1cnJlbnQiLCJvbkNoYW5nZSIsIm5hbWVzIiwidXBkYXRlX3ZhbHVlX29uX2NoYW5nZSIsInVwZGF0ZV9yYWRpb192YWx1ZV9vbl9jaGFuZ2UiLCJueCIsImlkIiwiaXNfaW50IiwibGFiZWwiLCJxdWVyeVNlbGVjdG9yIiwidXBkYXRlIiwicGFyc2VJbnQiLCJ2IiwidG9GaXhlZCIsInZhbHVlcyIsIm9sZF92IiwiYWN0aXZlIiwibGlzdHMiLCJsaXN0Iiwia2V5IiwiZmlsZXMiLCJwYXJzZSIsInJlcXVpcmUiLCJkYXRhUHJvbWlzZXMiLCJmZXRjaCIsInRoZW4iLCJ0ZXh0IiwicmVzb2x2ZSIsInJlamVjdCIsIl8iLCJoIiwic2hpZnQiLCJmaWx0ZXIiLCJzIiwiYWxsUHJvbWlzZXMiLCJhbGwiLCJkYXRhIiwibG9hZCIsImtleXMiLCJrZXlfbnVtYmVycyIsImxldHRlcnMiLCJudW1iZXJzIiwiY2FsbGJhY2siLCJ0b1VwcGVyQ2FzZSIsImsiLCJrZXlkb3duIiwiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJzdG9wUHJvcGFnYXRpb24iLCJhY3RpdmVFbGVtZW50IiwiSFRNTElucHV0RWxlbWVudCIsImtleUNvZGUiLCJzaGlmdEtleSIsImxpc3RlbiIsIm1pZGlfaW5pdCIsInBsYXlfbm90ZSIsInBsYXlfbWlkaV9ub3RlIiwicGxheV9zZXF1ZW5jZSIsInBsYXlfaW50ZXJ2YWxfc2VxdWVuY2UiLCJleHBvcnRfcGF0dGVybl9hc19taWRpIiwibWlkaURldmljZSIsInNlbmRQaXRjaEJlbmQiLCJNaWRpV3JpdGVyIiwibm90ZV92YWx1ZXMiLCJXZWJNaWRpIiwiZW5hYmxlIiwibWlkaV9yZWFkeSIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsIm91dHB1dHMiLCJsb2ciLCJpbnB1dHMiLCJmaWx0ZXJlZCIsIm91dHB1dCIsImR1cmF0aW9uIiwiY2hhbm5lbCIsImV4cG9ydGluZyIsInJlc3QiLCJkZWZlciIsInJvdW5kIiwib2Zmc2V0Iiwib2N0YXZlIiwibWlkaV9ub3RlIiwiY2VudHMiLCJub3RlIiwiRnJlcXVlbmN5IiwidG9Ob3RlIiwiZGVmZXJfdGltZSIsIlRyYW5zcG9ydCIsImJwbSIsImthbGltYmEiLCJwbGF5Tm90ZSIsImJvdW5kcyIsImRpZmYiLCJub3RlX3RpbWUiLCJjb3VudCIsInkiLCJ4IiwibXVsdGlwbHkiLCJyb3dfZjAiLCJyb3dfcm9vdCIsIm5vdGVzIiwiaW50ZXJ2YWwiLCJkYXRhc2V0TmFtZSIsInRlbXBvIiwidGltaW5nSW5kZXgiLCJwbGF5X2ZuIiwidGltaW5ncyIsIndhaXQiLCJtaWRpX3RyYWNrIiwiVHJhY2siLCJzZXRUZW1wbyIsImxlbiIsImFkZEV2ZW50IiwiTm90ZUV2ZW50IiwicGl0Y2giLCJ3cml0ZXIiLCJXcml0ZXIiLCJkYXRhVXJpIiwiREVGQVVMVF9CUE0iLCJyZWNvcmRlciIsInJlY29yZGluZyIsIm1hc3NfZmllbGRzIiwibWFzc19pIiwiZGF0YXNldHMiLCJndW5fdmlvbGVuY2VfYnlfbW9udGgiLCJtYXNzX3Nob290aW5nc19mcm9tX2NvbHVtYmluZSIsInBsYXlfbWFzc19zaG9vdGluZ3MiLCJyZXZlcnNlIiwiZGF0ZSIsIm1pbl95IiwiZGF0ZXMiLCJkIiwidG90YWxfdmljdGltcyIsInJlYWR5IiwibWFzc19yZXN0IiwidG90YWwiLCJtaWRpX25vdGVzIiwiY2FzZXMiLCJjYXNlIiwiZmF0YWxpdGllcyIsImluanVyZWQiLCJqb2luIiwicGxheV9uZXh0IiwidGltaW5nIiwibmV3X2kiLCJwaWNrX2RhdGFzZXQiLCJkaWFsX3NpemUiLCJOZXh1cyIsIkRpYWwiLCJzaXplIiwic3RlcCIsIlJhZGlvQnV0dG9uIiwibnVtYmVyT2ZCdXR0b25zIiwiZXhwb3J0X21pZGlfYnV0dG9uIiwicmVjb3JkX21pZGlfYnV0dG9uIiwic2F2ZUFzIiwibW9kdWxlIiwiZXhwb3J0cyIsImdlbmVyYXRlIiwicHJvdG90eXBlIiwiZ2VuZXJhdGVfc2NsIiwiZ2VuZXJhdGVfdGV0IiwiZ2VuZXJhdGVfaW50ZXJ2YWxzIiwiaW50ZXJ2YWxfbGlzdCIsInBhcnNlSW50ZXJ2YWwiLCJjYWxsIiwicG9wIiwicGFyc2VJbnRlcnZhbFN0cmluZyIsImJpbmQiLCJyYXRpbyIsInBhcnNlX3NjbCIsImRlc2NyaXB0aW9uIiwiY29tbWVudHMiLCJ0cmltIiwibGluZSIsImluZGV4T2YiLCJyZXBsYWNlIiwicmFuZ2UiLCJzZXRfcm9vdCIsInF1YW50aXplX2ZyZXF1ZW5jeSIsInNjYWxlX2YiLCJxdWFudGl6ZV9pbmRleCIsInBhcnNlX2ludGVydmFsIiwicHAiLCJudW0iLCJkZW4iLCJpc05hTiIsInBhcnNlX2ludGVydmFsX3N0cmluZyIsImZhY3RvcnkiLCJkZWZpbmUiLCJfdGFwTGlzdGVuZXJzIiwiX29uU3RhcnRlZCIsImN0eCIsImVsZW1lbnQiLCJpc0FycmF5IiwiTm9kZUxpc3QiLCJxdWVyeVNlbGVjdG9yQWxsIiwianF1ZXJ5IiwidG9BcnJheSIsIkVsZW1lbnQiLCJUYXBMaXN0ZW5lciIsIm9uVGFwIiwiY2IiLCJpc1N0YXJ0ZWQiLCJzdGF0ZSIsIl9kcmFnZ2VkIiwiX2VsZW1lbnQiLCJfYmluZGVkTW92ZSIsIl9tb3ZlZCIsIl9iaW5kZWRFbmQiLCJfZW5kZWQiLCJkaXNwb3NlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9zYyIsImNyZWF0ZU9zY2lsbGF0b3IiLCJzaWxlbnQiLCJjcmVhdGVHYWluIiwiZ2FpbiIsImRlc3RpbmF0aW9uIiwibm93IiwiY3VycmVudFRpbWUiLCJzdG9wIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUNoRUEsNkJBQTZCO0FBQzdCLHFDQUFxQyxnQzs7Ozs7O0FDRHJDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVCOzs7Ozs7QUNWQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsZ0M7Ozs7Ozs7QUNIdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsbURBQW1EO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsVUFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLHVDQUF1QyxTQUFTO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxpQkFBaUI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixTQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELEVBQUU7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGVBQWU7QUFDdkM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQSxxQkFBcUIsZUFBZTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsWUFBWTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCLFNBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLG1CQUFtQixjQUFjO0FBQ2pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1REFBdUQsT0FBTztBQUM5RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdURBQXVELE9BQU87QUFDOUQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNB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Q0w7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDdEJBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBLEU7Ozs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDbkJBO0FBQ0E7QUFDQSxFOzs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEU7Ozs7Ozs7QUNQQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsY0FBYztBQUNkO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0EsVUFBVTtBQUNWLENBQUMsRTs7Ozs7O0FDaEJEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7OztBQzFHQTs7QUFFQTtBQUNBO0FBQ0E7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QUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsVUFBVTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGVBQWUsU0FBUztBQUN4QixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFF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QUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRkFBbUY7QUFDbkY7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThELDBCQUEwQjtBQUN4RjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsZUFBZSxLQUFLO0FBQ3BCLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEIsZUFBZSxRQUFRO0FBQ3ZCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQixlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsVUFBVTtBQUN6QixlQUFlLE1BQU07QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQixlQUFlLE1BQU07QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixlQUFlLFdBQVc7QUFDMUIsZUFBZSxVQUFVO0FBQ3pCLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxFQUFFO0FBQ2pCLGVBQWUsT0FBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsY0FBYyxLQUFLO0FBQ25CO0FBQ0EsY0FBYyxLQUFLO0FBQ25CO0FBQ0EsY0FBYyxZQUFZO0FBQzFCO0FBQ0EsY0FBYyxLQUFLO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLGNBQWMsZ0JBQWdCO0FBQzlCLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGNBQWM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixZQUFZO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLGNBQWMsUUFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2YsYUFBYSxZQUFZO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixjQUFjLGlCQUFpQjtBQUMvQixjQUFjLFFBQVE7QUFDdEIsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsUUFBUTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsZUFBZSxjQUFjO0FBQzdCLGVBQWUsUUFBUTtBQUN2QjtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQixnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLFFBQVE7QUFDdEIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxNQUFNO0FBQ3BCLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsb0JBQW9CO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLDBCQUEwQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QixjQUFjLGNBQWM7QUFDNUIsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCLGVBQWUsS0FBSztBQUNwQjtBQUNBLGVBQWUsZUFBZTtBQUM5QjtBQUNBLGNBQWMsS0FBSztBQUNuQixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsY0FBYztBQUM1QixnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLG9CQUFvQjtBQUNqQyxhQUFhLGNBQWM7QUFDM0IsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUI7QUFDQSxnQkFBZ0IsZUFBZTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQixlQUFlLGVBQWU7QUFDOUIsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQixnQkFBZ0IsZUFBZTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEIsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsTUFBTTtBQUNwQixjQUFjLGVBQWU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxjQUFjLGNBQWM7QUFDNUIsY0FBYyxjQUFjO0FBQzVCLGdCQUFnQixlQUFlO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FB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QSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxnQkFBZ0IsWUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxjQUFjLGVBQWU7QUFDN0I7QUFDQSxnQkFBZ0IsWUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixZQUFZO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsY0FBYyxVQUFVO0FBQ3hCLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCLGdCQUFnQixnQkFBZ0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsTUFBTTtBQUNwQixjQUFjLGdCQUFnQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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YjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVCQUF1QjtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsVUFBVTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix5QkFBeUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLGNBQWMsWUFBWTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsWUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLGNBQWMsT0FBTztBQUNyQixjQUFjLE9BQU87QUFDckIsY0FBYyxPQUFPO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxlQUFlLEVBQUU7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0Es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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsT0FBTztBQUN0QixlQUFlLE9BQU87QUFDdEIsZUFBZSxPQUFPO0FBQ3RCLGVBQWUsY0FBYztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxnQkFBZ0IsWUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixjQUFjLDBCQUEwQjtBQUN4QztBQUNBLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNy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QUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsTUFBTTtBQUNyQixlQUFlLE1BQU07QUFDckIsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsRUFBRTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsZ0JBQWdCLFVBQVU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7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QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxlQUFlLHFCQUFxQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7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Q2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLEtBQUs7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsS0FBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxLQUFLO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGVBQWUsa0JBQWtCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLEtBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZ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QTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYyw2QkFBNkI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQixjQUFjLDZCQUE2QjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYyxjQUFjO0FBQzVCLGNBQWMsNkJBQTZCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYyxjQUFjO0FBQzVCLGNBQWMsNkJBQTZCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckIsY0FBYyxjQUFjO0FBQzVCLGNBQWMsNkJBQTZCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLGVBQWUsZUFBZTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxjQUFjLGVBQWU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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UDtBQUNELEM7Ozs7Ozs7OENDNUlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUMzR0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsa0JBQWtCLEVBQUU7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxVQUFVO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0EsYTs7Ozs7O0FDSEEseUM7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDSkE7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBLHVDQUF1QztBQUN2QyxFOzs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0QsRTs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEU7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxzQkFBc0I7QUFDaEYsZ0ZBQWdGLHNCQUFzQjtBQUN0RyxFOzs7Ozs7QUNSQSxtQzs7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFOzs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSCxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7OztBQzdTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUSxPQUFPO0FBQ2Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OzsrQ0M1TkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7Ozs7Ozs7O0FDMUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDOztBQUVqQzs7QUFFQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7QUMvaEJBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLEVBQUU7O0FBRUY7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9B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WUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLHVCQUF1QixPQUFPO0FBQzlCLHdCQUF3QixPQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQSxFQUFFOztBQUVGOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEIsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSTtBQUNKLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQSxrQ0FBa0MsMkNBQTJDLHlCQUF5Qix1QkFBdUIsMEJBQTBCLHNDQUFzQyxFQUFFLHdDQUF3QyxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRTdiLHlEQUF5RCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRS9KOztBQUVBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsYUFBYSxPQUFPO0FBQ3BCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSwyQkFBMkIsYUFBYTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0EsRUFBRTs7QUFFRjs7QUFFQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQSx1Q0FBdUMscURBQXFEOztBQUU1RixrQ0FBa0MsMkNBQTJDLHlCQUF5Qix1QkFBdUIsMEJBQTBCLHNDQUFzQyxFQUFFLHdDQUF3QyxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRTdiLHlEQUF5RCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRS9KO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHVDQUF1Qzs7QUFFdkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLEVBQUU7O0FBRUYsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsa0NBQWtDLDJDQUEyQyx5QkFBeUIsdUJBQXVCLDBCQUEwQixzQ0FBc0MsRUFBRSx3Q0FBd0MsRUFBRSx5REFBeUQscUVBQXFFLDZEQUE2RCxvQkFBb0IsR0FBRyxFQUFFOztBQUU3Yix5REFBeUQsMENBQTBDLDBEQUEwRCxFQUFFOztBQUUvSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLEVBQUU7O0FBRUY7O0FBRUEsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUEsK0NBQStDLHVDQUF1QyxrQkFBa0I7O0FBRXhHLGtDQUFrQywyQ0FBMkMseUJBQXlCLHVCQUF1QiwwQkFBMEIsc0NBQXNDLEVBQUUsd0NBQXdDLEVBQUUseURBQXlELHFFQUFxRSw2REFBNkQsb0JBQW9CLEdBQUcsRUFBRTs7QUFFN2Isc0RBQXNELDhEQUE4RCwwQkFBMEIsNENBQTRDLHVCQUF1QixrQkFBa0IsRUFBRSxPQUFPLHdDQUF3QyxFQUFFLEVBQUUsNkNBQTZDLG1CQUFtQixFQUFFLE9BQU8sdUJBQXVCLDRCQUE0QixrQkFBa0IsRUFBRSw4QkFBOEIsRUFBRTs7QUFFeGMsa0RBQWtELCtEQUErRCxxR0FBcUcsRUFBRSx5RUFBeUUsZUFBZSx5RUFBeUUsRUFBRSxFQUFFLGlEQUFpRDs7QUFFOWEseURBQXlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFL0o7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG1DQUFtQzs7QUFFbkM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNB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O0FBRS9KO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQSxFQUFFOztBQUVGOztBQUVBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBLGtDQUFrQywyQ0FBMkMseUJBQXlCLHVCQUF1QiwwQkFBMEIsc0NBQXNDLEVBQUUsd0NBQXdDLEVBQUUseURBQXlELHFFQUFxRSw2REFBNkQsb0JBQW9CLEdBQUcsRUFBRTs7QUFFN2Isc0RBQXNELDhEQUE4RCwwQkFBMEIsNENBQTRDLHVCQUF1QixrQkFBa0IsRUFBRSxPQUFPLHdDQUF3QyxFQUFFLEVBQUUsNkNBQTZDLG1CQUFtQixFQUFFLE9BQU8sdUJBQXVCLDRCQUE0QixrQkFBa0IsRUFBRSw4QkFBOEIsRUFBRTs7QUFFeGMsa0RBQWtELCtEQUErRCxxR0FBcUcsRUFBRSx5RUFBeUUsZUFBZSx5RUFBeUUsRUFBRSxFQUFFLGlEQUFpRDs7QUFFOWEseURBQXlELDBDQUEwQywwREFBMEQsRUFBRTs7QUFFL0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7O0FBRUEsd0JBQXdCLHNDQUFzQzs7QUFFOUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7QUFFWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBOztBQUVBOztBQUVBLHdCQUF3QixzQ0FBc0M7O0FBRTlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixzQkFBc0I7O0FBRTlDO0FBQ0E7QUFD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QVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxhQUFhO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0EsMkRBQTJELFNBQVM7O0FBRXBFO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0Isd0JBQXdCOztBQUVoRDtBQUNBLHVCQUF1Qjs7QUFFdkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3QkFBd0IsdUJBQXVCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSx3QkFBd0IsMkJBQTJCO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0Esd0JBQXdCLHlCQUF5QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0JBQXdCLHlCQUF5QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBLFFB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QUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFFBQVE7QUFDUjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7O0FBRVY7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBLHdCQUF3Qix1QkFBdUI7QUFDL0M7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhCQUE4Qix1QkFBdUI7QUFDckQsVUFBVTtBQUNWO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQzs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxpQ0FBaUM7QUFDcEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGVBQWU7QUFDckQ7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7O0FBRTdCLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTs7QUFFQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFVBQVU7OztBQUd2QyxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQSxrQ0FBa0MsMkNBQTJDLHlCQUF5Qix1QkFBdUIsMEJBQTBCLHNDQUFzQyxFQUFFLHdDQUF3QyxFQUFFLHlEQUF5RCxxRUFBcUUsNkRBQTZELG9CQUFvQixHQUFHLEVBQUU7O0FBRTdiLHlEQUF5RCwwQ0FBMEMsMERBQTBELEVBQUU7O0FBRS9KOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSwrSUFBK0ksc0JBQXNCO0FBQ3JLO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQSxFQUFFOztBQUVGOztBQUVBLE9BQU87QUFDUDtBQUNBLENBQUM7QUFDRDtBQUNBLDJDQUEyQyxjQUFjLDI2eWlCOzs7Ozs7QUNoNVN6RCxrQkFBa0Isd0Q7Ozs7OztBQ0FsQiw2RTs7Ozs7O0FDQUE7QUFDQSxxRUFBc0UsZ0JBQWdCLFVBQVUsR0FBRztBQUNuRyxDQUFDLEU7Ozs7OztBQ0ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRTs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEU7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEU7Ozs7Ozs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCLGFBQWE7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0Msb0NBQW9DO0FBQzVFLDRDQUE0QyxvQ0FBb0M7QUFDaEYsS0FBSywyQkFBMkIsb0NBQW9DO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsbUJBQW1CO0FBQ25DO0FBQ0E7QUFDQSxpQ0FBaUMsMkJBQTJCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxFOzs7Ozs7QUNyRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsK0JBQStCLHFCQUFxQjtBQUNwRCwrQkFBK0IsU0FBUyxFQUFFO0FBQzFDLENBQUMsVUFBVTs7QUFFWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsU0FBUyxtQkFBbUI7QUFDdkQsK0JBQStCLGFBQWE7QUFDNUM7QUFDQSxHQUFHLFVBQVU7QUFDYjtBQUNBLEU7Ozs7OztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7Ozs7OztBQ3hDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEU7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFOzs7Ozs7QUNoQkEsd0M7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEU7Ozs7Ozs7Ozs7OztBQzFFQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7Ozs7Ozs7K0NDSkE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFLDZFQUE2RTtBQUN4SjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLHNEQUFzRDs7QUFFdEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwrQ0FBK0M7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRFQUE0RTs7QUFFNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCLHlCQUF5QjtBQUMxQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQSxtREFBbUQsaUVBQWlFO0FBQ3BIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0MsT0FBTztBQUN2QztBQUNBO0FBQ0E7QUFDQSxDOzs7Ozs7OztBQ3Q2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsWUFBWTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixpQkFBaUI7QUFDakIsOEJBQThCO0FBQzlCLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsZUFBZTtBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLG9EQUFvRCxXQUFXO0FBQy9EO0FBQ0EsS0FBSztBQUNMLG9FQUFvRSxXQUFXO0FBQy9FO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsU0FBUztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxtQkFBbUIsRUFBRSxhQUFhO0FBQ2xFO0FBQ0EsV0FBVztBQUNYLGtFQUFrRSxnQkFBZ0IsU0FBUyxnQ0FBZ0Msd0JBQXdCLHVDQUF1QztBQUMxTDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBDQUEwQyxzQkFBc0IsRUFBRTtBQUNsRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7QUN6TEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7O0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDRDQUE0QyxLQUFLOztBQUVqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsbUNBQW1DLE9BQU87QUFDMUM7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7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dUQsMkdBQTJHLE9BQU8scURBQXFELGlCQUFpQix5TEFBeUwscURBQXFELGFBQWEsc0VBQXNFLHFDQUFxQyxRQUFRLHVGQUE2RSxVQUFVO0FBQUEsb01BQWlHLE87Ozs7OztBQzlCeHhEO0FBQ0E7QUFDQTs7Ozs7OztBQ0ZBO0FBQ0E7Ozs7Ozs7O0FDREEsZSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gODApO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDYzZTk4MzlkZGUyMjE5OWJlMjQ5IiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcbmlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qc1xuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgc3RvcmUgICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKVxuICAsIHVpZCAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIFN5bWJvbCAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2xcbiAgLCBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qc1xuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCdiYXNlNjQtanMnKVxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0JylcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgVXNlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogRHVlIHRvIHZhcmlvdXMgYnJvd3NlciBidWdzLCBzb21ldGltZXMgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQgZXZlblxuICogd2hlbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0eXBlZCBhcnJheXMuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgIC0gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWAgaW5zdGFuY2VzLFxuICogICAgIFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4LlxuICpcbiAqICAgLSBDaHJvbWUgOS0xMCBpcyBtaXNzaW5nIHRoZSBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uLlxuICpcbiAqICAgLSBJRTEwIGhhcyBhIGJyb2tlbiBgVHlwZWRBcnJheS5wcm90b3R5cGUuc3ViYXJyYXlgIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYXJyYXlzIG9mXG4gKiAgICAgaW5jb3JyZWN0IGxlbmd0aCBpbiBzb21lIHNpdHVhdGlvbnMuXG5cbiAqIFdlIGRldGVjdCB0aGVzZSBidWdneSBicm93c2VycyBhbmQgc2V0IGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGAgdG8gYGZhbHNlYCBzbyB0aGV5XG4gKiBnZXQgdGhlIE9iamVjdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgc2xvd2VyIGJ1dCBiZWhhdmVzIGNvcnJlY3RseS5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVCAhPT0gdW5kZWZpbmVkXG4gID8gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgOiB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbi8qXG4gKiBFeHBvcnQga01heExlbmd0aCBhZnRlciB0eXBlZCBhcnJheSBzdXBwb3J0IGlzIGRldGVybWluZWQuXG4gKi9cbmV4cG9ydHMua01heExlbmd0aCA9IGtNYXhMZW5ndGgoKVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KDEpXG4gICAgYXJyLl9fcHJvdG9fXyA9IHtfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH19XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDIgJiYgLy8gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWRcbiAgICAgICAgdHlwZW9mIGFyci5zdWJhcnJheSA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyBjaHJvbWUgOS0xMCBsYWNrIGBzdWJhcnJheWBcbiAgICAgICAgYXJyLnN1YmFycmF5KDEsIDEpLmJ5dGVMZW5ndGggPT09IDAgLy8gaWUxMCBoYXMgYnJva2VuIGBzdWJhcnJheWBcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGtNYXhMZW5ndGggKCkge1xuICByZXR1cm4gQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRcbiAgICA/IDB4N2ZmZmZmZmZcbiAgICA6IDB4M2ZmZmZmZmZcbn1cblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyICh0aGF0LCBsZW5ndGgpIHtcbiAgaWYgKGtNYXhMZW5ndGgoKSA8IGxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCcpXG4gIH1cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aClcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgaWYgKHRoYXQgPT09IG51bGwpIHtcbiAgICAgIHRoYXQgPSBuZXcgQnVmZmVyKGxlbmd0aClcbiAgICB9XG4gICAgdGhhdC5sZW5ndGggPSBsZW5ndGhcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmICEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZydcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIGFsbG9jVW5zYWZlKHRoaXMsIGFyZylcbiAgfVxuICByZXR1cm4gZnJvbSh0aGlzLCBhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbi8vIFRPRE86IExlZ2FjeSwgbm90IG5lZWRlZCBhbnltb3JlLiBSZW1vdmUgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuQnVmZmVyLl9hdWdtZW50ID0gZnVuY3Rpb24gKGFycikge1xuICBhcnIuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIGZyb20gKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gZnJvbU9iamVjdCh0aGF0LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbShudWxsLCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5pZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuICBCdWZmZXIuX19wcm90b19fID0gVWludDhBcnJheVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgJiZcbiAgICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICAgIC8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRTaXplIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfSBlbHNlIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHRoYXQsIHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKG51bGwsIHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAodGhhdCwgc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkge1xuICAgICAgdGhhdFtpXSA9IDBcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShudWxsLCBzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nICh0aGF0LCBzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiZW5jb2RpbmdcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gdGhhdC53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgdGhhdCA9IHRoYXQuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAodGhhdCwgYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIHRoYXRbaV0gPSBhcnJheVtpXSAmIDI1NVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAodGhhdCwgYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBhcnJheS5ieXRlTGVuZ3RoIC8vIHRoaXMgdGhyb3dzIGlmIGBhcnJheWAgaXMgbm90IGEgdmFsaWQgQXJyYXlCdWZmZXJcblxuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnb2Zmc2V0XFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdsZW5ndGhcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQpXG4gIH0gZWxzZSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2UsIGZvciBiZXN0IHBlcmZvcm1hbmNlXG4gICAgdGhhdCA9IGFycmF5XG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIHRoYXQgPSBmcm9tQXJyYXlMaWtlKHRoYXQsIGFycmF5KVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKHRoYXQsIG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIGxlbilcblxuICAgIGlmICh0aGF0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoYXRcbiAgICB9XG5cbiAgICBvYmouY29weSh0aGF0LCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIHRoYXRcbiAgfVxuXG4gIGlmIChvYmopIHtcbiAgICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgb2JqLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiBvYmopIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgaXNuYW4ob2JqLmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCAwKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqKVxuICAgIH1cblxuICAgIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iai5kYXRhKVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4nKVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwga01heExlbmd0aCgpYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IGtNYXhMZW5ndGgoKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBrTWF4TGVuZ3RoKCkudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycycpXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFpc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH1cbiAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICBwb3MgKz0gYnVmLmxlbmd0aFxuICB9XG4gIHJldHVybiBidWZmZXJcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0cmluZykpIHtcbiAgICByZXR1cm4gc3RyaW5nLmxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIChBcnJheUJ1ZmZlci5pc1ZpZXcoc3RyaW5nKSB8fCBzdHJpbmcgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICBzdHJpbmcgPSAnJyArIHN0cmluZ1xuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCBhbmQgYGlzLWJ1ZmZlcmAgKGluIFNhZmFyaSA1LTcpIHRvIGRldGVjdFxuLy8gQnVmZmVyIGluc3RhbmNlcy5cbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfCAwXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIHZhciBzdHIgPSAnJ1xuICB2YXIgbWF4ID0gZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFU1xuICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5tYXRjaCgvLnsyfS9nKS5qb2luKCcgJylcbiAgICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIH1cbiAgcmV0dXJuICc8QnVmZmVyICcgKyBzdHIgKyAnPidcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAodGFyZ2V0LCBzdGFydCwgZW5kLCB0aGlzU3RhcnQsIHRoaXNFbmQpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmQgPSB0YXJnZXQgPyB0YXJnZXQubGVuZ3RoIDogMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNTdGFydCA9IDBcbiAgfVxuICBpZiAodGhpc0VuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc0VuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoc3RhcnQgPCAwIHx8IGVuZCA+IHRhcmdldC5sZW5ndGggfHwgdGhpc1N0YXJ0IDwgMCB8fCB0aGlzRW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCAmJiBzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMFxuICB9XG4gIGlmICh0aGlzU3RhcnQgPj0gdGhpc0VuZCkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmIChzdGFydCA+PSBlbmQpIHtcbiAgICByZXR1cm4gMVxuICB9XG5cbiAgc3RhcnQgPj4+PSAwXG4gIGVuZCA+Pj49IDBcbiAgdGhpc1N0YXJ0ID4+Pj0gMFxuICB0aGlzRW5kID4+Pj0gMFxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQpIHJldHVybiAwXG5cbiAgdmFyIHggPSB0aGlzRW5kIC0gdGhpc1N0YXJ0XG4gIHZhciB5ID0gZW5kIC0gc3RhcnRcbiAgdmFyIGxlbiA9IE1hdGgubWluKHgsIHkpXG5cbiAgdmFyIHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIHZhciB0YXJnZXRDb3B5ID0gdGFyZ2V0LnNsaWNlKHN0YXJ0LCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzQ29weVtpXSAhPT0gdGFyZ2V0Q29weVtpXSkge1xuICAgICAgeCA9IHRoaXNDb3B5W2ldXG4gICAgICB5ID0gdGFyZ2V0Q29weVtpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIEZpbmRzIGVpdGhlciB0aGUgZmlyc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0ID49IGBieXRlT2Zmc2V0YCxcbi8vIE9SIHRoZSBsYXN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA8PSBgYnl0ZU9mZnNldGAuXG4vL1xuLy8gQXJndW1lbnRzOlxuLy8gLSBidWZmZXIgLSBhIEJ1ZmZlciB0byBzZWFyY2hcbi8vIC0gdmFsIC0gYSBzdHJpbmcsIEJ1ZmZlciwgb3IgbnVtYmVyXG4vLyAtIGJ5dGVPZmZzZXQgLSBhbiBpbmRleCBpbnRvIGBidWZmZXJgOyB3aWxsIGJlIGNsYW1wZWQgdG8gYW4gaW50MzJcbi8vIC0gZW5jb2RpbmcgLSBhbiBvcHRpb25hbCBlbmNvZGluZywgcmVsZXZhbnQgaXMgdmFsIGlzIGEgc3RyaW5nXG4vLyAtIGRpciAtIHRydWUgZm9yIGluZGV4T2YsIGZhbHNlIGZvciBsYXN0SW5kZXhPZlxuZnVuY3Rpb24gYmlkaXJlY3Rpb25hbEluZGV4T2YgKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIC8vIEVtcHR5IGJ1ZmZlciBtZWFucyBubyBtYXRjaFxuICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIC0xXG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXRcbiAgaWYgKHR5cGVvZiBieXRlT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gYnl0ZU9mZnNldFxuICAgIGJ5dGVPZmZzZXQgPSAwXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA+IDB4N2ZmZmZmZmYpIHtcbiAgICBieXRlT2Zmc2V0ID0gMHg3ZmZmZmZmZlxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAtMHg4MDAwMDAwMCkge1xuICAgIGJ5dGVPZmZzZXQgPSAtMHg4MDAwMDAwMFxuICB9XG4gIGJ5dGVPZmZzZXQgPSArYnl0ZU9mZnNldCAgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKGlzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiZcbiAgICAgICAgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIG11c3QgYmUgYW4gZXZlbiBudW1iZXIgb2YgZGlnaXRzXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChzdHJMZW4gJSAyICE9PSAwKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGhleCBzdHJpbmcnKVxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChpc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICAgIGlmIChpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICBsZW5ndGggPSBsZW5ndGggfCAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgLy8gbGVnYWN5IHdyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKSAtIHJlbW92ZSBpbiB2MC4xM1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCdcbiAgICApXG4gIH1cblxuICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIHZhciByZXMgPSBbXVxuXG4gIHZhciBpID0gc3RhcnRcbiAgd2hpbGUgKGkgPCBlbmQpIHtcbiAgICB2YXIgZmlyc3RCeXRlID0gYnVmW2ldXG4gICAgdmFyIGNvZGVQb2ludCA9IG51bGxcbiAgICB2YXIgYnl0ZXNQZXJTZXF1ZW5jZSA9IChmaXJzdEJ5dGUgPiAweEVGKSA/IDRcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4REYpID8gM1xuICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICA6IDFcblxuICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA8PSBlbmQpIHtcbiAgICAgIHZhciBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUsIGZvdXJ0aEJ5dGUsIHRlbXBDb2RlUG9pbnRcblxuICAgICAgc3dpdGNoIChieXRlc1BlclNlcXVlbmNlKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBpZiAoZmlyc3RCeXRlIDwgMHg4MCkge1xuICAgICAgICAgICAgY29kZVBvaW50ID0gZmlyc3RCeXRlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4MUYpIDw8IDB4NiB8IChzZWNvbmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3Rikge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweEMgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4NiB8ICh0aGlyZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGRiAmJiAodGVtcENvZGVQb2ludCA8IDB4RDgwMCB8fCB0ZW1wQ29kZVBvaW50ID4gMHhERkZGKSkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBzZWNvbmRCeXRlID0gYnVmW2kgKyAxXVxuICAgICAgICAgIHRoaXJkQnl0ZSA9IGJ1ZltpICsgMl1cbiAgICAgICAgICBmb3VydGhCeXRlID0gYnVmW2kgKyAzXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAoZm91cnRoQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHgxMiB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHhDIHwgKHRoaXJkQnl0ZSAmIDB4M0YpIDw8IDB4NiB8IChmb3VydGhCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHhGRkZGICYmIHRlbXBDb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgICAgICAgICBjb2RlUG9pbnQgPSB0ZW1wQ29kZVBvaW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlUG9pbnQgPT09IG51bGwpIHtcbiAgICAgIC8vIHdlIGRpZCBub3QgZ2VuZXJhdGUgYSB2YWxpZCBjb2RlUG9pbnQgc28gaW5zZXJ0IGFcbiAgICAgIC8vIHJlcGxhY2VtZW50IGNoYXIgKFUrRkZGRCkgYW5kIGFkdmFuY2Ugb25seSAxIGJ5dGVcbiAgICAgIGNvZGVQb2ludCA9IDB4RkZGRFxuICAgICAgYnl0ZXNQZXJTZXF1ZW5jZSA9IDFcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gZW5jb2RlIHRvIHV0ZjE2IChzdXJyb2dhdGUgcGFpciBkYW5jZSlcbiAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwXG4gICAgICByZXMucHVzaChjb2RlUG9pbnQgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApXG4gICAgICBjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRlxuICAgIH1cblxuICAgIHJlcy5wdXNoKGNvZGVQb2ludClcbiAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2VcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocmVzKVxufVxuXG4vLyBCYXNlZCBvbiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMjc0NzI3Mi82ODA3NDIsIHRoZSBicm93c2VyIHdpdGhcbi8vIHRoZSBsb3dlc3QgbGltaXQgaXMgQ2hyb21lLCB3aXRoIDB4MTAwMDAgYXJncy5cbi8vIFdlIGdvIDEgbWFnbml0dWRlIGxlc3MsIGZvciBzYWZldHlcbnZhciBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgdmFyIGxlbiA9IGNvZGVQb2ludHMubGVuZ3RoXG4gIGlmIChsZW4gPD0gTUFYX0FSR1VNRU5UU19MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGNvZGVQb2ludHMpIC8vIGF2b2lkIGV4dHJhIHNsaWNlKClcbiAgfVxuXG4gIC8vIERlY29kZSBpbiBjaHVua3MgdG8gYXZvaWQgXCJjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgdmFyIHJlcyA9ICcnXG4gIHZhciBpID0gMFxuICB3aGlsZSAoaSA8IGxlbikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFxuICAgICAgU3RyaW5nLFxuICAgICAgY29kZVBvaW50cy5zbGljZShpLCBpICs9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKVxuICAgIClcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldICYgMHg3RilcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGxhdGluMVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbmZ1bmN0aW9uIGhleFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGhcblxuICBpZiAoIXN0YXJ0IHx8IHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIGlmICghZW5kIHx8IGVuZCA8IDAgfHwgZW5kID4gbGVuKSBlbmQgPSBsZW5cblxuICB2YXIgb3V0ID0gJydcbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQgKz0gdG9IZXgoYnVmW2ldKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGJ5dGVzID0gYnVmLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIHZhciByZXMgPSAnJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0gKiAyNTYpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZlxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gICAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2xpY2VMZW4gPSBlbmQgLSBzdGFydFxuICAgIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc2xpY2VMZW4sIHVuZGVmaW5lZClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNsaWNlTGVuOyArK2kpIHtcbiAgICAgIG5ld0J1ZltpXSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG4gIH1cblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdXG4gIHZhciBtdWwgPSAxXG4gIHdoaWxlIChieXRlTGVuZ3RoID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDggPSBmdW5jdGlvbiByZWFkVUludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgOCkgfCB0aGlzW29mZnNldCArIDFdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFID0gZnVuY3Rpb24gcmVhZEludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0TEUgPSBmdW5jdGlvbiByZWFkRmxvYXRMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgNTIsIDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUJFID0gZnVuY3Rpb24gcmVhZERvdWJsZUJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50OCA9IGZ1bmN0aW9uIHdyaXRlVUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQxNiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCAyKTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSAmICgweGZmIDw8ICg4ICogKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkpKSkgPj4+XG4gICAgICAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSAqIDhcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5mdW5jdGlvbiBvYmplY3RXcml0ZVVJbnQzMiAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4pIHtcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgNCk7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgPj4+IChsaXR0bGVFbmRpYW4gPyBpIDogMyAtIGkpICogOCkgJiAweGZmXG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuZnVuY3Rpb24gY2hlY2tJRUVFNzU0IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAob2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG4gIHZhciBpXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiBzdGFydCA8IHRhcmdldFN0YXJ0ICYmIHRhcmdldFN0YXJ0IDwgZW5kKSB7XG4gICAgLy8gZGVzY2VuZGluZyBjb3B5IGZyb20gZW5kXG4gICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8IDEwMDAgfHwgIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgLy8gYXNjZW5kaW5nIGNvcHkgZnJvbSBzdGFydFxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbiksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgY29kZSA9IHZhbC5jaGFyQ29kZUF0KDApXG4gICAgICBpZiAoY29kZSA8IDI1Nikge1xuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogdXRmOFRvQnl0ZXMobmV3IEJ1ZmZlcih2YWwsIGVuY29kaW5nKS50b1N0cmluZygpKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXitcXC8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHJpbmd0cmltKHN0cikucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gc3RyaW5ndHJpbSAoc3RyKSB7XG4gIGlmIChzdHIudHJpbSkgcmV0dXJuIHN0ci50cmltKClcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiBpc25hbiAodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IHZhbCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2J1ZmZlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBkUCAgICAgICAgICAgICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmKCd2YWx1ZScgaW4gQXR0cmlidXRlcylPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwLmpzXG4vLyBtb2R1bGUgaWQgPSA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanNcbi8vIG1vZHVsZSBpZCA9IDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgSVNfV1JBUCAgID0gdHlwZSAmICRleHBvcnQuV1xuICAgICwgZXhwb3J0cyAgID0gSVNfR0xPQkFMID8gY29yZSA6IGNvcmVbbmFtZV0gfHwgKGNvcmVbbmFtZV0gPSB7fSlcbiAgICAsIGV4cFByb3RvICA9IGV4cG9ydHNbUFJPVE9UWVBFXVxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXVxuICAgICwga2V5LCBvd24sIG91dDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmKG93biAmJiBrZXkgaW4gZXhwb3J0cyljb250aW51ZTtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IG93biA/IHRhcmdldFtrZXldIDogc291cmNlW2tleV07XG4gICAgLy8gcHJldmVudCBnbG9iYWwgcG9sbHV0aW9uIGZvciBuYW1lc3BhY2VzXG4gICAgZXhwb3J0c1trZXldID0gSVNfR0xPQkFMICYmIHR5cGVvZiB0YXJnZXRba2V5XSAhPSAnZnVuY3Rpb24nID8gc291cmNlW2tleV1cbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIDogSVNfQklORCAmJiBvd24gPyBjdHgob3V0LCBnbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uKEMpe1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgICAgaWYodGhpcyBpbnN0YW5jZW9mIEMpe1xuICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDO1xuICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IEMoYSk7XG4gICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQyhhLCBiKTtcbiAgICAgICAgICB9IHJldHVybiBuZXcgQyhhLCBiLCBjKTtcbiAgICAgICAgfSByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICAgIEZbUFJPVE9UWVBFXSA9IENbUFJPVE9UWVBFXTtcbiAgICAgIHJldHVybiBGO1xuICAgIC8vIG1ha2Ugc3RhdGljIHZlcnNpb25zIGZvciBwcm90b3R5cGUgbWV0aG9kc1xuICAgIH0pKG91dCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcbiAgICBpZihJU19QUk9UTyl7XG4gICAgICAoZXhwb3J0cy52aXJ0dWFsIHx8IChleHBvcnRzLnZpcnR1YWwgPSB7fSkpW2tleV0gPSBvdXQ7XG4gICAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUucHJvdG90eXBlLiVOQU1FJVxuICAgICAgaWYodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSloaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2V4cG9ydC5qc1xuLy8gbW9kdWxlIGlkID0gN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hhcy5qc1xuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZFAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzXG4vLyBtb2R1bGUgaWQgPSA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3Byb2Nlc3MvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gYSBkdXBsZXggc3RyZWFtIGlzIGp1c3QgYSBzdHJlYW0gdGhhdCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZS5cbi8vIFNpbmNlIEpTIGRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLCB0aGlzIGNsYXNzXG4vLyBwcm90b3R5cGFsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fcmVhZGFibGUnKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xuXG51dGlsLmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG52YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbmZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xufVxuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwcm9jZXNzTmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qc1xuLy8gbW9kdWxlIGlkID0gMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qc1xuLy8gbW9kdWxlIGlkID0gMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qc1xuLy8gbW9kdWxlIGlkID0gMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvZi5qc1xuLy8gbW9kdWxlIGlkID0gMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYodGhhdCA9PT0gdW5kZWZpbmVkKXJldHVybiBmbjtcbiAgc3dpdGNoKGxlbmd0aCl7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qc1xuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzXG4vLyBtb2R1bGUgaWQgPSAyMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ICA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uKGl0ZXJhdGVkKXtcbiAgdGhpcy5fdCA9IFN0cmluZyhpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuLy8gMjEuMS41LjIuMSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwgaW5kZXggPSB0aGlzLl9pXG4gICAgLCBwb2ludDtcbiAgaWYoaW5kZXggPj0gTy5sZW5ndGgpcmV0dXJuIHt2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHt2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlfTtcbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS11dGlsLWlzL2xpYi91dGlsLmpzXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XHJcbn0gY2F0Y2goZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcclxuXHRcdGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDIzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIihmdW5jdGlvbihyb290LCBmYWN0b3J5KXtcblxuXHQvL1VNRFxuXHRpZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmYWN0b3J5KCk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuIFx0fSBlbHNlIHtcblx0XHRyb290LlRvbmUgPSBmYWN0b3J5KCk7XG5cdH1cblxufSh0aGlzLCBmdW5jdGlvbigpe1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIFRvbmU7XG5cdC8vY29uc3RydWN0cyB0aGUgbWFpbiBUb25lIG9iamVjdFxuXHRmdW5jdGlvbiBNYWluKGZ1bmMpe1xuXHRcdFRvbmUgPSBmdW5jKCk7XG5cdH1cblx0Ly9pbnZva2VzIGVhY2ggb2YgdGhlIG1vZHVsZXMgd2l0aCB0aGUgbWFpbiBUb25lIG9iamVjdCBhcyB0aGUgYXJndW1lbnRcblx0ZnVuY3Rpb24gTW9kdWxlKGZ1bmMpe1xuXHRcdGZ1bmMoVG9uZSk7XG5cdH1cdC8qKlxuXHQgKiAgVG9uZS5qc1xuXHQgKiAgQGF1dGhvciBZb3RhbSBNYW5uXG5cdCAqICBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVCBMaWNlbnNlXG5cdCAqICBAY29weXJpZ2h0IDIwMTQtMjAxOCBZb3RhbSBNYW5uXG5cdCAqL1xuXHRNYWluKGZ1bmN0aW9uICgpIHtcblx0ICAgIFxuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0VE9ORVxuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBvdGhlciBjbGFzc2VzLlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKi9cblx0ICAgIHZhciBUb25lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUb25lKSkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnN0cnVjdG9yIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBcXCduZXdcXCcga2V5d29yZCcpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUjXG5cdFx0ICogIEByZXR1cm5zIHtTdHJpbmd9IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGFzIGEgc3RyaW5nXG5cdFx0ICovXG5cdCAgICBUb25lLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmb3IgKHZhciBjbGFzc05hbWUgaW4gVG9uZSkge1xuXHQgICAgICAgICAgICB2YXIgaXNMZXR0ZXIgPSBjbGFzc05hbWVbMF0ubWF0Y2goL15bQS1aXSQvKTtcblx0ICAgICAgICAgICAgdmFyIHNhbWVDb25zdHJ1Y3RvciA9IFRvbmVbY2xhc3NOYW1lXSA9PT0gdGhpcy5jb25zdHJ1Y3Rvcjtcblx0ICAgICAgICAgICAgaWYgKFRvbmUuaXNGdW5jdGlvbihUb25lW2NsYXNzTmFtZV0pICYmIGlzTGV0dGVyICYmIHNhbWVDb25zdHJ1Y3Rvcikge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gJ1RvbmUnO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZSNcblx0XHQgKiAgZGlzY29ubmVjdCBhbmQgZGlzcG9zZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vXHRHRVQvU0VUXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8qKlxuXHRcdCAqICBTZXQgdGhlIHBhcmFtZXRlcnMgYXQgb25jZS4gRWl0aGVyIHBhc3MgaW4gYW5cblx0XHQgKiAgb2JqZWN0IG1hcHBpbmcgcGFyYW1ldGVycyB0byB2YWx1ZXMsIG9yIHRvIHNldCBhXG5cdFx0ICogIHNpbmdsZSBwYXJhbWV0ZXIsIGJ5IHBhc3NpbmcgaW4gYSBzdHJpbmcgYW5kIHZhbHVlLlxuXHRcdCAqICBUaGUgbGFzdCBhcmd1bWVudCBpcyBhbiBvcHRpb25hbCByYW1wIHRpbWUgd2hpY2hcblx0XHQgKiAgd2lsbCByYW1wIGFueSBzaWduYWwgdmFsdWVzIHRvIHRoZWlyIGRlc3RpbmF0aW9uIHZhbHVlXG5cdFx0ICogIG92ZXIgdGhlIGR1cmF0aW9uIG9mIHRoZSByYW1wVGltZS5cblx0XHQgKiAgQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBwYXJhbXNcblx0XHQgKiAgQHBhcmFtIHtOdW1iZXI9fSB2YWx1ZVxuXHRcdCAqICBAcGFyYW0ge1RpbWU9fSByYW1wVGltZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZX0gdGhpc1xuXHRcdCAqICBAbWVtYmVyT2YgVG9uZSNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL3NldCB2YWx1ZXMgdXNpbmcgYW4gb2JqZWN0XG5cdFx0ICogZmlsdGVyLnNldCh7XG5cdFx0ICogXHRcImZyZXF1ZW5jeVwiIDogMzAwLFxuXHRcdCAqIFx0XCJ0eXBlXCIgOiBoaWdocGFzc1xuXHRcdCAqIH0pO1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIGZpbHRlci5zZXQoXCJ0eXBlXCIsIFwiaGlnaHBhc3NcIik7XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9yYW1wIHRvIHRoZSB2YWx1ZSAyMjAgb3ZlciAzIHNlY29uZHMuXG5cdFx0ICogb3NjaWxsYXRvci5zZXQoe1xuXHRcdCAqIFx0XCJmcmVxdWVuY3lcIiA6IDIyMFxuXHRcdCAqIH0sIDMpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHBhcmFtcywgdmFsdWUsIHJhbXBUaW1lKSB7XG5cdCAgICAgICAgaWYgKFRvbmUuaXNPYmplY3QocGFyYW1zKSkge1xuXHQgICAgICAgICAgICByYW1wVGltZSA9IHZhbHVlO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoVG9uZS5pc1N0cmluZyhwYXJhbXMpKSB7XG5cdCAgICAgICAgICAgIHZhciB0bXBPYmogPSB7fTtcblx0ICAgICAgICAgICAgdG1wT2JqW3BhcmFtc10gPSB2YWx1ZTtcblx0ICAgICAgICAgICAgcGFyYW1zID0gdG1wT2JqO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBwYXJhbUxvb3A6XG5cdCAgICAgICAgICAgIGZvciAodmFyIGF0dHIgaW4gcGFyYW1zKSB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtc1thdHRyXTtcblx0ICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuXHQgICAgICAgICAgICAgICAgaWYgKGF0dHIuaW5kZXhPZignLicpICE9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyU3BsaXQgPSBhdHRyLnNwbGl0KCcuJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRyU3BsaXQubGVuZ3RoIC0gMTsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFthdHRyU3BsaXRbaV1dO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVG9uZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0clNwbGl0LnNwbGljZSgwLCBpICsgMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5uZXJQYXJhbSA9IGF0dHJTcGxpdC5qb2luKCcuJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuc2V0KGlubmVyUGFyYW0sIHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHBhcmFtTG9vcDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBhdHRyID0gYXR0clNwbGl0W2F0dHJTcGxpdC5sZW5ndGggLSAxXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHZhciBwYXJhbSA9IHBhcmVudFthdHRyXTtcblx0ICAgICAgICAgICAgICAgIGlmIChUb25lLmlzVW5kZWYocGFyYW0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoVG9uZS5TaWduYWwgJiYgcGFyYW0gaW5zdGFuY2VvZiBUb25lLlNpZ25hbCB8fCBUb25lLlBhcmFtICYmIHBhcmFtIGluc3RhbmNlb2YgVG9uZS5QYXJhbSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS52YWx1ZSAhPT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRvbmUuaXNVbmRlZihyYW1wVGltZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnZhbHVlID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5yYW1wVG8odmFsdWUsIHJhbXBUaW1lKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBBdWRpb1BhcmFtKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnZhbHVlICE9PSB2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVG9uZS5UaW1lQmFzZSAmJiBwYXJhbSBpbnN0YW5jZW9mIFRvbmUuVGltZUJhc2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICBwYXJlbnRbYXR0cl0gPSB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBUb25lKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0KHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gIT09IHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcGFyZW50W2F0dHJdID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgR2V0IHRoZSBvYmplY3QncyBhdHRyaWJ1dGVzLiBHaXZlbiBubyBhcmd1bWVudHMgZ2V0XG5cdFx0ICogIHdpbGwgcmV0dXJuIGFsbCBhdmFpbGFibGUgb2JqZWN0IHByb3BlcnRpZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmdcblx0XHQgKiAgdmFsdWVzLiBQYXNzIGluIGEgc2luZ2xlIGF0dHJpYnV0ZSB0byByZXRyaWV2ZSBvciBhbiBhcnJheVxuXHRcdCAqICBvZiBhdHRyaWJ1dGVzLiBUaGUgYXR0cmlidXRlIHN0cmluZ3MgY2FuIGFsc28gaW5jbHVkZSBhIFwiLlwiXG5cdFx0ICogIHRvIGFjY2VzcyBkZWVwZXIgcHJvcGVydGllcy5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUjXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogb3NjLmdldCgpO1xuXHRcdCAqIC8vcmV0dXJucyB7XCJ0eXBlXCIgOiBcInNpbmVcIiwgXCJmcmVxdWVuY3lcIiA6IDQ0MCwgLi4uZXRjfVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIG9zYy5nZXQoXCJ0eXBlXCIpO1xuXHRcdCAqIC8vcmV0dXJucyB7IFwidHlwZVwiIDogXCJzaW5lXCJ9XG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvL3VzZSBkb3Qgbm90YXRpb24gdG8gYWNjZXNzIGRlZXAgcHJvcGVydGllc1xuXHRcdCAqIHN5bnRoLmdldChbXCJlbnZlbG9wZS5hdHRhY2tcIiwgXCJlbnZlbG9wZS5yZWxlYXNlXCJdKTtcblx0XHQgKiAvL3JldHVybnMge1wiZW52ZWxvcGVcIiA6IHtcImF0dGFja1wiIDogMC4yLCBcInJlbGVhc2VcIiA6IDAuNH19XG5cdFx0ICogIEBwYXJhbSB7QXJyYXk9fHN0cmluZ3x1bmRlZmluZWR9IHBhcmFtcyB0aGUgcGFyYW1ldGVycyB0byBnZXQsIG90aGVyd2lzZSB3aWxsIHJldHVyblxuXHRcdCAqICBcdFx0XHRcdFx0ICAgICAgICAgICAgICAgICAgYWxsIGF2YWlsYWJsZS5cblx0XHQgKiAgQHJldHVybnMge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc1VuZGVmKHBhcmFtcykpIHtcblx0ICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5fY29sbGVjdERlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoVG9uZS5pc1N0cmluZyhwYXJhbXMpKSB7XG5cdCAgICAgICAgICAgIHBhcmFtcyA9IFtwYXJhbXNdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcmV0ID0ge307XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIGF0dHIgPSBwYXJhbXNbaV07XG5cdCAgICAgICAgICAgIHZhciBwYXJlbnQgPSB0aGlzO1xuXHQgICAgICAgICAgICB2YXIgc3ViUmV0ID0gcmV0O1xuXHQgICAgICAgICAgICBpZiAoYXR0ci5pbmRleE9mKCcuJykgIT09IC0xKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYXR0clNwbGl0ID0gYXR0ci5zcGxpdCgnLicpO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBhdHRyU3BsaXQubGVuZ3RoIC0gMTsgaisrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkF0dHIgPSBhdHRyU3BsaXRbal07XG5cdCAgICAgICAgICAgICAgICAgICAgc3ViUmV0W3N1YkF0dHJdID0gc3ViUmV0W3N1YkF0dHJdIHx8IHt9O1xuXHQgICAgICAgICAgICAgICAgICAgIHN1YlJldCA9IHN1YlJldFtzdWJBdHRyXTtcblx0ICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRbc3ViQXR0cl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBhdHRyID0gYXR0clNwbGl0W2F0dHJTcGxpdC5sZW5ndGggLSAxXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJlbnRbYXR0cl07XG5cdCAgICAgICAgICAgIGlmIChUb25lLmlzT2JqZWN0KHBhcmFtc1thdHRyXSkpIHtcblx0ICAgICAgICAgICAgICAgIHN1YlJldFthdHRyXSA9IHBhcmFtLmdldCgpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKFRvbmUuU2lnbmFsICYmIHBhcmFtIGluc3RhbmNlb2YgVG9uZS5TaWduYWwpIHtcblx0ICAgICAgICAgICAgICAgIHN1YlJldFthdHRyXSA9IHBhcmFtLnZhbHVlO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKFRvbmUuUGFyYW0gJiYgcGFyYW0gaW5zdGFuY2VvZiBUb25lLlBhcmFtKSB7XG5cdCAgICAgICAgICAgICAgICBzdWJSZXRbYXR0cl0gPSBwYXJhbS52YWx1ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIEF1ZGlvUGFyYW0pIHtcblx0ICAgICAgICAgICAgICAgIHN1YlJldFthdHRyXSA9IHBhcmFtLnZhbHVlO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgVG9uZSkge1xuXHQgICAgICAgICAgICAgICAgc3ViUmV0W2F0dHJdID0gcGFyYW0uZ2V0KCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoIVRvbmUuaXNGdW5jdGlvbihwYXJhbSkgJiYgVG9uZS5pc0RlZmluZWQocGFyYW0pKSB7XG5cdCAgICAgICAgICAgICAgICBzdWJSZXRbYXR0cl0gPSBwYXJhbTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmV0O1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBjb2xsZWN0IGFsbCBvZiB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGluIG9uZVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqICBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHIgdGhlIGNvbnN0cnVjdG9yIHRvIGZpbmQgdGhlIGRlZmF1bHRzIGZyb21cblx0XHQgKiAgQHJldHVybiB7QXJyYXl9IGFsbCBvZiB0aGUgYXR0cmlidXRlcyB3aGljaCBiZWxvbmcgdG8gdGhlIGNsYXNzXG5cdFx0ICovXG5cdCAgICBUb25lLnByb3RvdHlwZS5fY29sbGVjdERlZmF1bHRzID0gZnVuY3Rpb24gKGNvbnN0cikge1xuXHQgICAgICAgIHZhciByZXQgPSBbXTtcblx0ICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQoY29uc3RyLmRlZmF1bHRzKSkge1xuXHQgICAgICAgICAgICByZXQgPSBPYmplY3Qua2V5cyhjb25zdHIuZGVmYXVsdHMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQoY29uc3RyLl9zdXBlcikpIHtcblx0ICAgICAgICAgICAgdmFyIHN1cGVyRGVmcyA9IHRoaXMuX2NvbGxlY3REZWZhdWx0cyhjb25zdHIuX3N1cGVyKTtcblx0ICAgICAgICAgICAgLy9maWx0ZXIgb3V0IHJlcGVhdHNcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdXBlckRlZnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIGlmIChyZXQuaW5kZXhPZihzdXBlckRlZnNbaV0pID09PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHN1cGVyRGVmc1tpXSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHJldDtcblx0ICAgIH07XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vXHRERUZBVUxUU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKiAgQHBhcmFtICB7QXJyYXl9ICB2YWx1ZXMgIFRoZSBhcmd1bWVudHMgYXJyYXlcblx0XHQgKiAgQHBhcmFtICB7QXJyYXl9ICBrZXlzICAgIFRoZSBuYW1lcyBvZiB0aGUgYXJndW1lbnRzXG5cdFx0ICogIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBjb25zdHIgVGhlIGNsYXNzIGNvbnN0cnVjdG9yXG5cdFx0ICogIEByZXR1cm4gIHtPYmplY3R9ICBBbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlICBkZWZhdWx0cyBiZXR3ZWVuIHRoZSBjbGFzcycgZGVmYXVsdHNcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcGFzc2VkIGluIGFyZ3VtZW50cy5cblx0XHQgKi9cblx0ICAgIFRvbmUuZGVmYXVsdHMgPSBmdW5jdGlvbiAodmFsdWVzLCBrZXlzLCBjb25zdHIpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IHt9O1xuXHQgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxICYmIFRvbmUuaXNPYmplY3QodmFsdWVzWzBdKSkge1xuXHQgICAgICAgICAgICBvcHRpb25zID0gdmFsdWVzWzBdO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgb3B0aW9uc1trZXlzW2ldXSA9IHZhbHVlc1tpXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQoY29uc3RyLmRlZmF1bHRzKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gVG9uZS5kZWZhdWx0QXJnKG9wdGlvbnMsIGNvbnN0ci5kZWZhdWx0cyk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChUb25lLmlzT2JqZWN0KGNvbnN0cikpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuZGVmYXVsdEFyZyhvcHRpb25zLCBjb25zdHIpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgSWYgdGhlIGBnaXZlbmAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCwgdXNlIHRoZSBgZmFsbGJhY2tgLlxuXHRcdCAqICBJZiBib3RoIGBnaXZlbmAgYW5kIGBmYWxsYmFja2AgYXJlIG9iamVjdCBsaXRlcmFscywgaXQgd2lsbFxuXHRcdCAqICByZXR1cm4gYSBkZWVwIGNvcHkgd2hpY2ggaW5jbHVkZXMgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGZyb20gYm90aFxuXHRcdCAqICBvYmplY3RzLiBJZiBhIHBhcmFtZXRlciBpcyB1bmRlZmluZWQgaW4gZ2l2ZW4sIGl0IHdpbGwgcmV0dXJuXG5cdFx0ICogIHRoZSBmYWxsYmFjayBwcm9wZXJ0eS5cblx0XHQgKiAgPGJyPjxicj5cblx0XHQgKiAgV0FSTklORzogaWYgb2JqZWN0IGlzIHNlbGYgcmVmZXJlbnRpYWwsIGl0IHdpbGwgZ28gaW50byBhbiBhblxuXHRcdCAqICBpbmZpbml0ZSByZWN1cnNpdmUgbG9vcC5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKiAgQHBhcmFtICB7Kn0gZ2l2ZW5cblx0XHQgKiAgQHBhcmFtICB7Kn0gZmFsbGJhY2tcblx0XHQgKiAgQHJldHVybiB7Kn1cblx0XHQgKi9cblx0ICAgIFRvbmUuZGVmYXVsdEFyZyA9IGZ1bmN0aW9uIChnaXZlbiwgZmFsbGJhY2spIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc09iamVjdChnaXZlbikgJiYgVG9uZS5pc09iamVjdChmYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgdmFyIHJldCA9IHt9O1xuXHQgICAgICAgICAgICAvL21ha2UgYSBkZWVwIGNvcHkgb2YgdGhlIGdpdmVuIG9iamVjdFxuXHQgICAgICAgICAgICBmb3IgKHZhciBnaXZlblByb3AgaW4gZ2l2ZW4pIHtcblx0ICAgICAgICAgICAgICAgIHJldFtnaXZlblByb3BdID0gVG9uZS5kZWZhdWx0QXJnKGZhbGxiYWNrW2dpdmVuUHJvcF0sIGdpdmVuW2dpdmVuUHJvcF0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZvciAodmFyIGZhbGxiYWNrUHJvcCBpbiBmYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgcmV0W2ZhbGxiYWNrUHJvcF0gPSBUb25lLmRlZmF1bHRBcmcoZ2l2ZW5bZmFsbGJhY2tQcm9wXSwgZmFsbGJhY2tbZmFsbGJhY2tQcm9wXSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHJldDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gVG9uZS5pc1VuZGVmKGdpdmVuKSA/IGZhbGxiYWNrIDogZ2l2ZW47XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdENPTk5FQ1RJT05TXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8qKlxuXHRcdCAqICBjb25uZWN0IHRvZ2V0aGVyIGFsbCBvZiB0aGUgYXJndW1lbnRzIGluIHNlcmllc1xuXHRcdCAqICBAcGFyYW0gey4uLkF1ZGlvUGFyYW18VG9uZXxBdWRpb05vZGV9IG5vZGVzXG5cdFx0ICogIEByZXR1cm5zIHtUb25lfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICovXG5cdCAgICBUb25lLmNvbm5lY3RTZXJpZXMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGN1cnJlbnRVbml0ID0gYXJndW1lbnRzWzBdO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHZhciB0b1VuaXQgPSBhcmd1bWVudHNbaV07XG5cdCAgICAgICAgICAgIGN1cnJlbnRVbml0LmNvbm5lY3QodG9Vbml0KTtcblx0ICAgICAgICAgICAgY3VycmVudFVuaXQgPSB0b1VuaXQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBUb25lO1xuXHQgICAgfTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8gVFlQRSBDSEVDS0lOR1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgVGVzdCBpZiB0aGUgYXJnIGlzIHVuZGVmaW5lZFxuXHRcdCAqICBAcGFyYW0geyp9IGFyZyB0aGUgYXJndW1lbnQgdG8gdGVzdFxuXHRcdCAqICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXJnIGlzIHVuZGVmaW5lZFxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lXG5cdFx0ICovXG5cdCAgICBUb25lLmlzVW5kZWYgPSBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUZXN0IGlmIHRoZSBhcmcgaXMgbm90IHVuZGVmaW5lZFxuXHRcdCAqICBAcGFyYW0geyp9IGFyZyB0aGUgYXJndW1lbnQgdG8gdGVzdFxuXHRcdCAqICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXJnIGlzIHVuZGVmaW5lZFxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lXG5cdFx0ICovXG5cdCAgICBUb25lLmlzRGVmaW5lZCA9IGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICByZXR1cm4gIVRvbmUuaXNVbmRlZih2YWwpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUZXN0IGlmIHRoZSBhcmcgaXMgYSBmdW5jdGlvblxuXHRcdCAqICBAcGFyYW0geyp9IGFyZyB0aGUgYXJndW1lbnQgdG8gdGVzdFxuXHRcdCAqICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXJnIGlzIGEgZnVuY3Rpb25cblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAbWVtYmVyT2YgVG9uZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5pc0Z1bmN0aW9uID0gZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUZXN0IGlmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlci5cblx0XHQgKiAgQHBhcmFtIHsqfSBhcmcgdGhlIGFyZ3VtZW50IHRvIHRlc3Rcblx0XHQgKiAgQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGFyZyBpcyBhIG51bWJlclxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lXG5cdFx0ICovXG5cdCAgICBUb25lLmlzTnVtYmVyID0gZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGVzdCBpZiB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYW4gb2JqZWN0IGxpdGVyYWwgKGkuZS4gYHt9YCk7XG5cdFx0ICogIEBwYXJhbSB7Kn0gYXJnIHRoZSBhcmd1bWVudCB0byB0ZXN0XG5cdFx0ICogIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBhcmcgaXMgYW4gb2JqZWN0IGxpdGVyYWwuXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKi9cblx0ICAgIFRvbmUuaXNPYmplY3QgPSBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBPYmplY3RdJyAmJiBhcmcuY29uc3RydWN0b3IgPT09IE9iamVjdDtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGVzdCBpZiB0aGUgYXJndW1lbnQgaXMgYSBib29sZWFuLlxuXHRcdCAqICBAcGFyYW0geyp9IGFyZyB0aGUgYXJndW1lbnQgdG8gdGVzdFxuXHRcdCAqICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXJnIGlzIGEgYm9vbGVhblxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lXG5cdFx0ICovXG5cdCAgICBUb25lLmlzQm9vbGVhbiA9IGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUZXN0IGlmIHRoZSBhcmd1bWVudCBpcyBhbiBBcnJheVxuXHRcdCAqICBAcGFyYW0geyp9IGFyZyB0aGUgYXJndW1lbnQgdG8gdGVzdFxuXHRcdCAqICBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXJnIGlzIGFuIGFycmF5XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKi9cblx0ICAgIFRvbmUuaXNBcnJheSA9IGZ1bmN0aW9uIChhcmcpIHtcblx0ICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUZXN0IGlmIHRoZSBhcmd1bWVudCBpcyBhIHN0cmluZy5cblx0XHQgKiAgQHBhcmFtIHsqfSBhcmcgdGhlIGFyZ3VtZW50IHRvIHRlc3Rcblx0XHQgKiAgQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGFyZyBpcyBhIHN0cmluZ1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lXG5cdFx0ICovXG5cdCAgICBUb25lLmlzU3RyaW5nID0gZnVuY3Rpb24gKGFyZykge1xuXHQgICAgICAgIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGVzdCBpZiB0aGUgYXJndW1lbnQgaXMgaW4gdGhlIGZvcm0gb2YgYSBub3RlIGluIHNjaWVudGlmaWMgcGl0Y2ggbm90YXRpb24uXG5cdFx0ICogIGUuZy4gXCJDNFwiXG5cdFx0ICogIEBwYXJhbSB7Kn0gYXJnIHRoZSBhcmd1bWVudCB0byB0ZXN0XG5cdFx0ICogIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBhcmcgaXMgYSBzdHJpbmdcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAbWVtYmVyT2YgVG9uZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5pc05vdGUgPSBmdW5jdGlvbiAoYXJnKSB7XG5cdCAgICAgICAgcmV0dXJuIFRvbmUuaXNTdHJpbmcoYXJnKSAmJiAvXihbYS1nXXsxfSg/OmJ8I3x4fGJiKT8pKC0/WzAtOV0rKS9pLnRlc3QoYXJnKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQW4gZW1wdHkgZnVuY3Rpb24uXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKi9cblx0ICAgIFRvbmUubm9PcCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgTWFrZSB0aGUgcHJvcGVydHkgbm90IHdyaXRhYmxlLiBJbnRlcm5hbCB1c2Ugb25seS5cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfSAgcHJvcGVydHkgIHRoZSBwcm9wZXJ0eSB0byBtYWtlIG5vdCB3cml0YWJsZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5wcm90b3R5cGUuX3JlYWRPbmx5ID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7XG5cdCAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcGVydHkpKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRPbmx5KHByb3BlcnR5W2ldKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwge1xuXHQgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIE1ha2UgYW4gYXR0cmlidXRlIHdyaXRlYWJsZS4gSW50ZXJhbCB1c2Ugb25seS5cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfSAgcHJvcGVydHkgIHRoZSBwcm9wZXJ0eSB0byBtYWtlIHdyaXRhYmxlXG5cdFx0ICovXG5cdCAgICBUb25lLnByb3RvdHlwZS5fd3JpdGFibGUgPSBmdW5jdGlvbiAocHJvcGVydHkpIHtcblx0ICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eSkpIHtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fd3JpdGFibGUocHJvcGVydHlbaV0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5LCB7IHdyaXRhYmxlOiB0cnVlIH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBQb3NzaWJsZSBwbGF5IHN0YXRlcy5cblx0XHQgKiBAZW51bSB7U3RyaW5nfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TdGF0ZSA9IHtcblx0ICAgICAgICBTdGFydGVkOiAnc3RhcnRlZCcsXG5cdCAgICAgICAgU3RvcHBlZDogJ3N0b3BwZWQnLFxuXHQgICAgICAgIFBhdXNlZDogJ3BhdXNlZCdcblx0ICAgIH07XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vIENPTlZFUlNJT05TXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8qKlxuXHRcdCAqICBFcXVhbCBwb3dlciBnYWluIHNjYWxlLiBHb29kIGZvciBjcm9zcy1mYWRpbmcuXG5cdFx0ICogIEBwYXJhbSAge05vcm1hbFJhbmdlfSBwZXJjZW50ICgwLTEpXG5cdFx0ICogIEByZXR1cm4ge051bWJlcn0gICAgICAgICBvdXRwdXQgZ2FpbiAoMC0xKVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lXG5cdFx0ICovXG5cdCAgICBUb25lLmVxdWFsUG93ZXJTY2FsZSA9IGZ1bmN0aW9uIChwZXJjZW50KSB7XG5cdCAgICAgICAgdmFyIHBpRmFjdG9yID0gMC41ICogTWF0aC5QSTtcblx0ICAgICAgICByZXR1cm4gTWF0aC5zaW4ocGVyY2VudCAqIHBpRmFjdG9yKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ29udmVydCBkZWNpYmVscyBpbnRvIGdhaW4uXG5cdFx0ICogIEBwYXJhbSAge0RlY2liZWxzfSBkYlxuXHRcdCAqICBAcmV0dXJuIHtOdW1iZXJ9XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKi9cblx0ICAgIFRvbmUuZGJUb0dhaW4gPSBmdW5jdGlvbiAoZGIpIHtcblx0ICAgICAgICByZXR1cm4gTWF0aC5wb3coMTAsIGRiIC8gMjApO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDb252ZXJ0IGdhaW4gdG8gZGVjaWJlbHMuXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gZ2FpbiAoMC0xKVxuXHRcdCAqICBAcmV0dXJuIHtEZWNpYmVsc31cblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAbWVtYmVyT2YgVG9uZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5nYWluVG9EYiA9IGZ1bmN0aW9uIChnYWluKSB7XG5cdCAgICAgICAgcmV0dXJuIDIwICogKE1hdGgubG9nKGdhaW4pIC8gTWF0aC5MTjEwKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ29udmVydCBhbiBpbnRlcnZhbCAoaW4gc2VtaXRvbmVzKSB0byBhIGZyZXF1ZW5jeSByYXRpby5cblx0XHQgKiAgQHBhcmFtICB7SW50ZXJ2YWx9IGludGVydmFsIHRoZSBudW1iZXIgb2Ygc2VtaXRvbmVzIGFib3ZlIHRoZSBiYXNlIG5vdGVcblx0XHQgKiAgQHJldHVybiB7TnVtYmVyfSAgICAgICAgICB0aGUgZnJlcXVlbmN5IHJhdGlvXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB0b25lLmludGVydmFsVG9GcmVxdWVuY3lSYXRpbygwKTsgLy8gMVxuXHRcdCAqIHRvbmUuaW50ZXJ2YWxUb0ZyZXF1ZW5jeVJhdGlvKDEyKTsgLy8gMlxuXHRcdCAqIHRvbmUuaW50ZXJ2YWxUb0ZyZXF1ZW5jeVJhdGlvKC0xMik7IC8vIDAuNVxuXHRcdCAqL1xuXHQgICAgVG9uZS5pbnRlcnZhbFRvRnJlcXVlbmN5UmF0aW8gPSBmdW5jdGlvbiAoaW50ZXJ2YWwpIHtcblx0ICAgICAgICByZXR1cm4gTWF0aC5wb3coMiwgaW50ZXJ2YWwgLyAxMik7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0VElNSU5HXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBvZiB0aGUgQXVkaW9Db250ZXh0IGNsb2NrLlxuXHRcdCAqICBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBjdXJyZW50VGltZSBmcm9tIHRoZSBBdWRpb0NvbnRleHRcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUjXG5cdFx0ICovXG5cdCAgICBUb25lLnByb3RvdHlwZS5ub3cgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIFRvbmUuY29udGV4dC5ub3coKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIEF1ZGlvQ29udGV4dCBjbG9jay5cblx0XHQgKiAgQHJldHVybiB7TnVtYmVyfSB0aGUgY3VycmVudFRpbWUgZnJvbSB0aGUgQXVkaW9Db250ZXh0XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKi9cblx0ICAgIFRvbmUubm93ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBUb25lLmNvbnRleHQubm93KCk7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0SU5IRVJJVEFOQ0Vcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLyoqXG5cdFx0ICogIGhhdmUgYSBjaGlsZCBpbmhlcml0IGFsbCBvZiBUb25lJ3MgKG9yIGEgcGFyZW50J3MpIHByb3RvdHlwZVxuXHRcdCAqICB0byBpbmhlcml0IHRoZSBwYXJlbnQncyBwcm9wZXJ0aWVzLCBtYWtlIHN1cmUgdG8gY2FsbFxuXHRcdCAqICBQYXJlbnQuY2FsbCh0aGlzKSBpbiB0aGUgY2hpbGQncyBjb25zdHJ1Y3RvclxuXHRcdCAqXG5cdFx0ICogIGJhc2VkIG9uIGNsb3N1cmUgbGlicmFyeSdzIGluaGVyaXQgZnVuY3Rpb25cblx0XHQgKlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9ufSBcdGNoaWxkXG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9uPX0gcGFyZW50IChvcHRpb25hbCkgcGFyZW50IHRvIGluaGVyaXQgZnJvbVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBubyBwYXJlbnQgaXMgc3VwcGxpZWQsIHRoZSBjaGlsZFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGluaGVyaXQgZnJvbSBUb25lXG5cdFx0ICovXG5cdCAgICBUb25lLmV4dGVuZCA9IGZ1bmN0aW9uIChjaGlsZCwgcGFyZW50KSB7XG5cdCAgICAgICAgaWYgKFRvbmUuaXNVbmRlZihwYXJlbnQpKSB7XG5cdCAgICAgICAgICAgIHBhcmVudCA9IFRvbmU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIFRlbXBDb25zdHJ1Y3RvcigpIHtcblx0ICAgICAgICB9XG5cdCAgICAgICAgVGVtcENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG5cdCAgICAgICAgY2hpbGQucHJvdG90eXBlID0gbmV3IFRlbXBDb25zdHJ1Y3RvcigpO1xuXHQgICAgICAgIC8qKiBAb3ZlcnJpZGUgKi9cblx0ICAgICAgICBjaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjaGlsZDtcblx0ICAgICAgICBjaGlsZC5fc3VwZXIgPSBwYXJlbnQ7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0Q09OVEVYVFxuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgUHJpdmF0ZSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBBdWRpb0NvbnRleHRcblx0XHQgKiAgQHR5cGUge0F1ZGlvQ29udGV4dH1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIHZhciBhdWRpb0NvbnRleHQgPSBudWxsO1xuXHQgICAgLyoqXG5cdFx0ICogIEEgc3RhdGljIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIGNvbnRleHQgYWNjZXNzaWJsZSBhcyBUb25lLmNvbnRleHQuXG5cdFx0ICogIEB0eXBlIHtUb25lLkNvbnRleHR9XG5cdFx0ICogIEBuYW1lIGNvbnRleHRcblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLCAnY29udGV4dCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGF1ZGlvQ29udGV4dDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGNvbnRleHQpIHtcblx0ICAgICAgICAgICAgaWYgKFRvbmUuQ29udGV4dCAmJiBjb250ZXh0IGluc3RhbmNlb2YgVG9uZS5Db250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICBhdWRpb0NvbnRleHQgPSBjb250ZXh0O1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYXVkaW9Db250ZXh0ID0gbmV3IFRvbmUuQ29udGV4dChjb250ZXh0KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvL2luaXRpYWxpemUgdGhlIG5ldyBhdWRpbyBjb250ZXh0XG5cdCAgICAgICAgICAgIFRvbmUuQ29udGV4dC5lbWl0KCdpbml0JywgYXVkaW9Db250ZXh0KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgQXVkaW9Db250ZXh0XG5cdFx0ICogIEB0eXBlIHtUb25lLkNvbnRleHR9XG5cdFx0ICogIEBuYW1lIGNvbnRleHRcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUjXG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUucHJvdG90eXBlLCAnY29udGV4dCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuY29udGV4dDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUb25lIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGNvbnRleHQgb24gaW5pdCwgYnV0IGlmIHlvdSBhcmUgd29ya2luZ1xuXHRcdCAqICB3aXRoIG90aGVyIGxpYnJhcmllcyB3aGljaCBhbHNvIGNyZWF0ZSBhbiBBdWRpb0NvbnRleHQsIGl0IGNhbiBiZVxuXHRcdCAqICB1c2VmdWwgdG8gc2V0IHlvdXIgb3duLiBJZiB5b3UgYXJlIGdvaW5nIHRvIHNldCB5b3VyIG93biBjb250ZXh0LFxuXHRcdCAqICBiZSBzdXJlIHRvIGRvIGl0IGF0IHRoZSBzdGFydCBvZiB5b3VyIGNvZGUsIGJlZm9yZSBjcmVhdGluZyBhbnkgb2JqZWN0cy5cblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAcGFyYW0ge0F1ZGlvQ29udGV4dH0gY3R4IFRoZSBuZXcgYXVkaW8gY29udGV4dCB0byBzZXRcblx0XHQgKi9cblx0ICAgIFRvbmUuc2V0Q29udGV4dCA9IGZ1bmN0aW9uIChjdHgpIHtcblx0ICAgICAgICBUb25lLmNvbnRleHQgPSBjdHg7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0QVRUUklCVVRFU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgVGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIDEgcHJvY2Vzc2luZyBibG9jayAoMTI4IHNhbXBsZXMpXG5cdFx0ICogIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogIEBuYW1lIGJsb2NrVGltZVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUucHJvdG90eXBlLCAnYmxvY2tUaW1lJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gMTI4IC8gdGhpcy5jb250ZXh0LnNhbXBsZVJhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgb2Ygb25lIHNhbXBsZS5cblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG5hbWUgc2FtcGxlVGltZVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUucHJvdG90eXBlLCAnc2FtcGxlVGltZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIDEgLyB0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBXaGV0aGVyIG9yIG5vdCBhbGwgdGhlIHRlY2hub2xvZ2llcyB0aGF0IFRvbmUuanMgcmVsaWVzIG9uIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgYnJvd3Nlci5cblx0XHQgKiAgQHR5cGUge0Jvb2xlYW59XG5cdFx0ICogIEBuYW1lIHN1cHBvcnRlZFxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZVxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUsICdzdXBwb3J0ZWQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBoYXNBdWRpb0NvbnRleHQgPSB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ0F1ZGlvQ29udGV4dCcpIHx8IHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnd2Via2l0QXVkaW9Db250ZXh0Jyk7XG5cdCAgICAgICAgICAgIHZhciBoYXNQcm9taXNlcyA9IHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnUHJvbWlzZScpO1xuXHQgICAgICAgICAgICB2YXIgaGFzV29ya2VycyA9IHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnV29ya2VyJyk7XG5cdCAgICAgICAgICAgIHJldHVybiBoYXNBdWRpb0NvbnRleHQgJiYgaGFzUHJvbWlzZXMgJiYgaGFzV29ya2Vycztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBCb29sZWFuIHZhbHVlIGlmIHRoZSBhdWRpbyBjb250ZXh0IGhhcyBiZWVuIGluaXRpYWxpemVkLlxuXHRcdCAqICBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmVcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAbmFtZSBpbml0aWFsaXplZFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUsICdpbml0aWFsaXplZCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGF1ZGlvQ29udGV4dCAhPT0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBHZXQgdGhlIGNvbnRleHQgd2hlbiBpdCBiZWNvbWVzIGF2YWlsYWJsZVxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbn0gIHJlc29sdmUgIENhbGxiYWNrIHdoZW4gdGhlIGNvbnRleHQgaXMgaW5pdGlhbGl6ZWRcblx0XHQgKiAgQHJldHVybiAge1RvbmV9XG5cdFx0ICovXG5cdCAgICBUb25lLmdldENvbnRleHQgPSBmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHQgICAgICAgIGlmIChUb25lLmluaXRpYWxpemVkKSB7XG5cdCAgICAgICAgICAgIHJlc29sdmUoVG9uZS5jb250ZXh0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgcmVzQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZXNvbHZlKFRvbmUuY29udGV4dCk7XG5cdCAgICAgICAgICAgICAgICBUb25lLkNvbnRleHQub2ZmKCdpbml0JywgcmVzQ2FsbGJhY2spO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBUb25lLkNvbnRleHQub24oJ2luaXQnLCByZXNDYWxsYmFjayk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBUb25lO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB2ZXJzaW9uIG51bWJlclxuXHRcdCAqIEB0eXBlIHtTdHJpbmd9XG5cdFx0ICogQHN0YXRpY1xuXHRcdCAqL1xuXHQgICAgVG9uZS52ZXJzaW9uID0gJ3IxMic7XG5cdCAgICByZXR1cm4gVG9uZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuRW1pdHRlciBnaXZlcyBjbGFzc2VzIHdoaWNoIGV4dGVuZCBpdFxuXHRcdCAqICAgICAgICAgdGhlIGFiaWxpdHkgdG8gbGlzdGVuIGZvciBhbmQgZW1pdCBldmVudHMuXG5cdFx0ICogICAgICAgICBJbnNwaXJhdGlvbiBhbmQgcmVmZXJlbmNlIGZyb20gSmVyb21lIEV0aWVubmUncyBbTWljcm9FdmVudF0oaHR0cHM6Ly9naXRodWIuY29tL2plcm9tZWV0aWVubmUvbWljcm9ldmVudC5qcykuXG5cdFx0ICogICAgICAgICBNSVQgKGMpIDIwMTEgSmVyb21lIEV0aWVubmUuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmV9XG5cdFx0ICovXG5cdCAgICBUb25lLkVtaXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIENvbnRhaW5zIGFsbCBvZiB0aGUgZXZlbnRzLlxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9ldmVudHMgPSB7fTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkVtaXR0ZXIpO1xuXHQgICAgLyoqXG5cdFx0ICogIEJpbmQgYSBjYWxsYmFjayB0byBhIHNwZWNpZmljIGV2ZW50LlxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmd9ICAgIGV2ZW50ICAgICBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci5cblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCBpcyBlbWl0dGVkXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkVtaXR0ZXJ9ICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgLy9zcGxpdCB0aGUgZXZlbnRcblx0ICAgICAgICB2YXIgZXZlbnRzID0gZXZlbnQuc3BsaXQoL1xcVysvKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gZXZlbnRzW2ldO1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50cy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbZXZlbnROYW1lXSA9IFtdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX2V2ZW50c1tldmVudE5hbWVdLnB1c2goY2FsbGJhY2spO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQmluZCBhIGNhbGxiYWNrIHdoaWNoIGlzIG9ubHkgaW52b2tlZCBvbmNlXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ30gICAgZXZlbnQgICAgIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gZm9yLlxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IGlzIGVtaXR0ZWRcblx0XHQgKiAgQHJldHVybiAge1RvbmUuRW1pdHRlcn0gICAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gKGV2ZW50LCBjYWxsYmFjaykge1xuXHQgICAgICAgIHZhciBib3VuZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvL2ludm9rZSB0aGUgY2FsbGJhY2tcblx0ICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgdGhpcy5vZmYoZXZlbnQsIGJvdW5kQ2FsbGJhY2spO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKTtcblx0ICAgICAgICB0aGlzLm9uKGV2ZW50LCBib3VuZENhbGxiYWNrKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lci5cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfSAgICBldmVudCAgICAgVGhlIGV2ZW50IHRvIHN0b3AgbGlzdGVuaW5nIHRvLlxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbj19ICBjYWxsYmFjayAgVGhlIGNhbGxiYWNrIHdoaWNoIHdhcyBib3VuZCB0b1xuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXZlbnQgd2l0aCBUb25lLkVtaXR0ZXIub24uXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vIGNhbGxiYWNrIGlzIGdpdmVuLCBhbGwgY2FsbGJhY2tzXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyBhcmUgcmVtb3ZlZC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuRW1pdHRlcn0gICAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5FbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAoZXZlbnQsIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgdmFyIGV2ZW50cyA9IGV2ZW50LnNwbGl0KC9cXFcrLyk7XG5cdCAgICAgICAgZm9yICh2YXIgZXYgPSAwOyBldiA8IGV2ZW50cy5sZW5ndGg7IGV2KyspIHtcblx0ICAgICAgICAgICAgZXZlbnQgPSBldmVudHNbZXZdO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKFRvbmUuaXNVbmRlZihjYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbZXZlbnRdID0gW107XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBldmVudExpc3QgPSB0aGlzLl9ldmVudHNbZXZlbnRdO1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudExpc3RbaV0gPT09IGNhbGxiYWNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudExpc3Quc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJbnZva2UgYWxsIG9mIHRoZSBjYWxsYmFja3MgYm91bmQgdG8gdGhlIGV2ZW50XG5cdFx0ICogIHdpdGggYW55IGFyZ3VtZW50cyBwYXNzZWQgaW4uXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ30gIGV2ZW50ICBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG5cdFx0ICogIEBwYXJhbSB7Kn0gYXJncy4uLiBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9ucyBsaXN0ZW5pbmcuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkVtaXR0ZXJ9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICBpZiAodGhpcy5fZXZlbnRzKSB7XG5cdCAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5zbGljZSgxKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2V2ZW50cy5oYXNPd25Qcm9wZXJ0eShldmVudCkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBldmVudExpc3QgPSB0aGlzLl9ldmVudHNbZXZlbnRdLnNsaWNlKDApO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGV2ZW50TGlzdC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50TGlzdFtpXS5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQWRkIEVtaXR0ZXIgZnVuY3Rpb25zIChvbi9vZmYvZW1pdCkgdG8gdGhlIG9iamVjdFxuXHRcdCAqICBAcGFyYW0gIHtPYmplY3R8RnVuY3Rpb259ICBvYmplY3QgIFRoZSBvYmplY3Qgb3IgY2xhc3MgdG8gZXh0ZW5kLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5FbWl0dGVyfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5FbWl0dGVyLm1peGluID0gZnVuY3Rpb24gKG9iamVjdCkge1xuXHQgICAgICAgIHZhciBmdW5jdGlvbnMgPSBbXG5cdCAgICAgICAgICAgICdvbicsXG5cdCAgICAgICAgICAgICdvbmNlJyxcblx0ICAgICAgICAgICAgJ29mZicsXG5cdCAgICAgICAgICAgICdlbWl0J1xuXHQgICAgICAgIF07XG5cdCAgICAgICAgb2JqZWN0Ll9ldmVudHMgPSB7fTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmN0aW9uc1tpXTtcblx0ICAgICAgICAgICAgdmFyIGVtaXR0ZXJGdW5jID0gVG9uZS5FbWl0dGVyLnByb3RvdHlwZVtmdW5jXTtcblx0ICAgICAgICAgICAgb2JqZWN0W2Z1bmNdID0gZW1pdHRlckZ1bmM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBUb25lLkVtaXR0ZXI7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkVtaXR0ZXJ9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkVtaXR0ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2V2ZW50cyA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuRW1pdHRlcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIEEgVGltZWxpbmUgY2xhc3MgZm9yIHNjaGVkdWxpbmcgYW5kIG1haW50YWluaW5nIHN0YXRlXG5cdFx0ICogICAgICAgICBhbG9uZyBhIHRpbWVsaW5lLiBBbGwgZXZlbnRzIG11c3QgaGF2ZSBhIFwidGltZVwiIHByb3BlcnR5LlxuXHRcdCAqICAgICAgICAgSW50ZXJuYWxseSwgZXZlbnRzIGFyZSBzdG9yZWQgaW4gdGltZSBvcmRlciBmb3IgZmFzdFxuXHRcdCAqICAgICAgICAgcmV0cmlldmFsLlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKiAgQHBhcmFtIHtQb3NpdGl2ZX0gW21lbW9yeT1JbmZpbml0eV0gVGhlIG51bWJlciBvZiBwcmV2aW91cyBldmVudHMgdGhhdCBhcmUgcmV0YWluZWQuXG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWVsaW5lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFsnbWVtb3J5J10sIFRvbmUuVGltZWxpbmUpO1xuXHQgICAgICAgIFRvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYXJyYXkgb2Ygc2NoZWR1bGVkIHRpbWVsaW5lIGV2ZW50c1xuXHRcdFx0ICogIEB0eXBlICB7QXJyYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3RpbWVsaW5lID0gW107XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG1lbW9yeSBvZiB0aGUgdGltZWxpbmUsIGkuZS5cblx0XHRcdCAqICBob3cgbWFueSBldmVudHMgaW4gdGhlIHBhc3QgaXQgd2lsbCByZXRhaW5cblx0XHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm1lbW9yeSA9IG9wdGlvbnMubWVtb3J5O1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuVGltZWxpbmUpO1xuXHQgICAgLyoqXG5cdFx0ICogIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnNcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZWxpbmUuZGVmYXVsdHMgPSB7ICdtZW1vcnknOiBJbmZpbml0eSB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRpbWVsaW5lLlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5UaW1lbGluZSNcblx0XHQgKiAgQG5hbWUgbGVuZ3RoXG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuVGltZWxpbmUucHJvdG90eXBlLCAnbGVuZ3RoJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZWxpbmUubGVuZ3RoO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIEluc2VydCBhbiBldmVudCBvYmplY3Qgb250byB0aGUgdGltZWxpbmUuIEV2ZW50cyBtdXN0IGhhdmUgYSBcInRpbWVcIiBhdHRyaWJ1dGUuXG5cdFx0ICogIEBwYXJhbSAge09iamVjdH0gIGV2ZW50ICBUaGUgZXZlbnQgb2JqZWN0IHRvIGluc2VydCBpbnRvIHRoZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWxpbmUuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlRpbWVsaW5lfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWVsaW5lLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAvL3RoZSBldmVudCBuZWVkcyB0byBoYXZlIGEgdGltZSBhdHRyaWJ1dGVcblx0ICAgICAgICBpZiAoVG9uZS5pc1VuZGVmKGV2ZW50LnRpbWUpKSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9uZS5UaW1lbGluZTogZXZlbnRzIG11c3QgaGF2ZSBhIHRpbWUgYXR0cmlidXRlJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGV2ZW50LnRpbWUgPSBldmVudC50aW1lLnZhbHVlT2YoKTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9zZWFyY2goZXZlbnQudGltZSk7XG5cdCAgICAgICAgdGhpcy5fdGltZWxpbmUuc3BsaWNlKGluZGV4ICsgMSwgMCwgZXZlbnQpO1xuXHQgICAgICAgIC8vaWYgdGhlIGxlbmd0aCBpcyBtb3JlIHRoYW4gdGhlIG1lbW9yeSwgcmVtb3ZlIHRoZSBwcmV2aW91cyBvbmVzXG5cdCAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gdGhpcy5tZW1vcnkpIHtcblx0ICAgICAgICAgICAgdmFyIGRpZmYgPSB0aGlzLmxlbmd0aCAtIHRoaXMubWVtb3J5O1xuXHQgICAgICAgICAgICB0aGlzLl90aW1lbGluZS5zcGxpY2UoMCwgZGlmZik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZW1vdmUgYW4gZXZlbnQgZnJvbSB0aGUgdGltZWxpbmUuXG5cdFx0ICogIEBwYXJhbSAge09iamVjdH0gIGV2ZW50ICBUaGUgZXZlbnQgb2JqZWN0IHRvIHJlbW92ZSBmcm9tIHRoZSBsaXN0LlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fdGltZWxpbmUuaW5kZXhPZihldmVudCk7XG5cdCAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLl90aW1lbGluZS5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgR2V0IHRoZSBuZWFyZXN0IGV2ZW50IHdob3NlIHRpbWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lICBUaGUgdGltZSB0byBxdWVyeS5cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfSAgY29tcGFyYXRvciBXaGljaCB2YWx1ZSBpbiB0aGUgb2JqZWN0IHRvIGNvbXBhcmVcblx0XHQgKiAgQHJldHVybnMge09iamVjdH0gVGhlIGV2ZW50IG9iamVjdCBzZXQgYWZ0ZXIgdGhhdCB0aW1lLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRpbWUsIGNvbXBhcmF0b3IpIHtcblx0ICAgICAgICBjb21wYXJhdG9yID0gVG9uZS5kZWZhdWx0QXJnKGNvbXBhcmF0b3IsICd0aW1lJyk7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fc2VhcmNoKHRpbWUsIGNvbXBhcmF0b3IpO1xuXHQgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVsaW5lW2luZGV4XTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgZmlyc3QgZXZlbnQgaW4gdGhlIHRpbWVsaW5lIHdpdGhvdXQgcmVtb3ZpbmcgaXRcblx0XHQgKiAgQHJldHVybnMge09iamVjdH0gVGhlIGZpcnN0IGV2ZW50IG9iamVjdFxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVbMF07XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgZmlyc3QgZXZlbnQgaW4gdGhlIHRpbWVsaW5lIGFuZCByZW1vdmUgaXRcblx0XHQgKiAgQHJldHVybnMge09iamVjdH0gVGhlIGZpcnN0IGV2ZW50IG9iamVjdFxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVsaW5lLnNoaWZ0KCk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEdldCB0aGUgZXZlbnQgd2hpY2ggaXMgc2NoZWR1bGVkIGFmdGVyIHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lICBUaGUgdGltZSB0byBxdWVyeS5cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfSAgY29tcGFyYXRvciBXaGljaCB2YWx1ZSBpbiB0aGUgb2JqZWN0IHRvIGNvbXBhcmVcblx0XHQgKiAgQHJldHVybnMge09iamVjdH0gVGhlIGV2ZW50IG9iamVjdCBhZnRlciB0aGUgZ2l2ZW4gdGltZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuZ2V0QWZ0ZXIgPSBmdW5jdGlvbiAodGltZSwgY29tcGFyYXRvcikge1xuXHQgICAgICAgIGNvbXBhcmF0b3IgPSBUb25lLmRlZmF1bHRBcmcoY29tcGFyYXRvciwgJ3RpbWUnKTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9zZWFyY2godGltZSwgY29tcGFyYXRvcik7XG5cdCAgICAgICAgaWYgKGluZGV4ICsgMSA8IHRoaXMuX3RpbWVsaW5lLmxlbmd0aCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVbaW5kZXggKyAxXTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEdldCB0aGUgZXZlbnQgYmVmb3JlIHRoZSBldmVudCBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgdGltZSAgVGhlIHRpbWUgdG8gcXVlcnkuXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ30gIGNvbXBhcmF0b3IgV2hpY2ggdmFsdWUgaW4gdGhlIG9iamVjdCB0byBjb21wYXJlXG5cdFx0ICogIEByZXR1cm5zIHtPYmplY3R9IFRoZSBldmVudCBvYmplY3QgYmVmb3JlIHRoZSBnaXZlbiB0aW1lXG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWVsaW5lLnByb3RvdHlwZS5nZXRCZWZvcmUgPSBmdW5jdGlvbiAodGltZSwgY29tcGFyYXRvcikge1xuXHQgICAgICAgIGNvbXBhcmF0b3IgPSBUb25lLmRlZmF1bHRBcmcoY29tcGFyYXRvciwgJ3RpbWUnKTtcblx0ICAgICAgICB2YXIgbGVuID0gdGhpcy5fdGltZWxpbmUubGVuZ3RoO1xuXHQgICAgICAgIC8vaWYgaXQncyBhZnRlciB0aGUgbGFzdCBpdGVtLCByZXR1cm4gdGhlIGxhc3QgaXRlbVxuXHQgICAgICAgIGlmIChsZW4gPiAwICYmIHRoaXMuX3RpbWVsaW5lW2xlbiAtIDFdW2NvbXBhcmF0b3JdIDwgdGltZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVbbGVuIC0gMV07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX3NlYXJjaCh0aW1lLCBjb21wYXJhdG9yKTtcblx0ICAgICAgICBpZiAoaW5kZXggLSAxID49IDApIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVsaW5lW2luZGV4IC0gMV07XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDYW5jZWwgZXZlbnRzIGFmdGVyIHRoZSBnaXZlbiB0aW1lXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHRpbWUgIFRoZSB0aW1lIHRvIHF1ZXJ5LlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKGFmdGVyKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX3RpbWVsaW5lLmxlbmd0aCA+IDEpIHtcblx0ICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fc2VhcmNoKGFmdGVyKTtcblx0ICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLl90aW1lbGluZVtpbmRleF0udGltZSA9PT0gYWZ0ZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvL2dldCB0aGUgZmlyc3QgaXRlbSB3aXRoIHRoYXQgdGltZVxuXHQgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBpbmRleDsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVsaW5lW2ldLnRpbWUgPT09IGFmdGVyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1lbGluZSA9IHRoaXMuX3RpbWVsaW5lLnNsaWNlKDAsIGluZGV4KTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltZWxpbmUgPSB0aGlzLl90aW1lbGluZS5zbGljZSgwLCBpbmRleCArIDEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fdGltZWxpbmUgPSBbXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGltZWxpbmUubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgICAgIC8vdGhlIGZpcnN0IGl0ZW0ncyB0aW1lXG5cdCAgICAgICAgICAgIGlmICh0aGlzLl90aW1lbGluZVswXS50aW1lID49IGFmdGVyKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl90aW1lbGluZSA9IFtdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDYW5jZWwgZXZlbnRzIGJlZm9yZSBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgdGltZSAgVGhlIHRpbWUgdG8gY2FuY2VsIGJlZm9yZS5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuVGltZWxpbmV9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZWxpbmUucHJvdG90eXBlLmNhbmNlbEJlZm9yZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fc2VhcmNoKHRpbWUpO1xuXHQgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpbWVsaW5lID0gdGhpcy5fdGltZWxpbmUuc2xpY2UoaW5kZXggKyAxKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogUmV0dXJucyB0aGUgcHJldmlvdXMgZXZlbnQgaWYgdGhlcmUgaXMgb25lLiBudWxsIG90aGVyd2lzZVxuXHRcdCAqIEBwYXJhbSAge09iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHRvIGZpbmQgdGhlIHByZXZpb3VzIG9uZSBvZlxuXHRcdCAqIEByZXR1cm4ge09iamVjdH0gICAgICAgVGhlIGV2ZW50IHJpZ2h0IGJlZm9yZSB0aGUgZ2l2ZW4gZXZlbnRcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZWxpbmUucHJvdG90eXBlLnByZXZpb3VzRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl90aW1lbGluZS5pbmRleE9mKGV2ZW50KTtcblx0ICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl90aW1lbGluZVtpbmRleCAtIDFdO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgRG9lcyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIHRpbWVsaW5lIGFycmF5IGFuZCByZXR1cm5zIHRoZVxuXHRcdCAqICBuZWFyZXN0IGV2ZW50IGluZGV4IHdob3NlIHRpbWUgaXMgYWZ0ZXIgb3IgZXF1YWwgdG8gdGhlIGdpdmVuIHRpbWUuXG5cdFx0ICogIElmIGEgdGltZSBpcyBzZWFyY2hlZCBiZWZvcmUgdGhlIGZpcnN0IGluZGV4IGluIHRoZSB0aW1lbGluZSwgLTEgaXMgcmV0dXJuZWQuXG5cdFx0ICogIElmIHRoZSB0aW1lIGlzIGFmdGVyIHRoZSBlbmQsIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBpdGVtIGlzIHJldHVybmVkLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ30gIGNvbXBhcmF0b3IgV2hpY2ggdmFsdWUgaW4gdGhlIG9iamVjdCB0byBjb21wYXJlXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9IHRoZSBpbmRleCBpbiB0aGUgdGltZWxpbmUgYXJyYXlcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZWxpbmUucHJvdG90eXBlLl9zZWFyY2ggPSBmdW5jdGlvbiAodGltZSwgY29tcGFyYXRvcikge1xuXHQgICAgICAgIGlmICh0aGlzLl90aW1lbGluZS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgcmV0dXJuIC0xO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb21wYXJhdG9yID0gVG9uZS5kZWZhdWx0QXJnKGNvbXBhcmF0b3IsICd0aW1lJyk7XG5cdCAgICAgICAgdmFyIGJlZ2lubmluZyA9IDA7XG5cdCAgICAgICAgdmFyIGxlbiA9IHRoaXMuX3RpbWVsaW5lLmxlbmd0aDtcblx0ICAgICAgICB2YXIgZW5kID0gbGVuO1xuXHQgICAgICAgIGlmIChsZW4gPiAwICYmIHRoaXMuX3RpbWVsaW5lW2xlbiAtIDFdW2NvbXBhcmF0b3JdIDw9IHRpbWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGxlbiAtIDE7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlIChiZWdpbm5pbmcgPCBlbmQpIHtcblx0ICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBtaWRwb2ludCBmb3Igcm91Z2hseSBlcXVhbCBwYXJ0aXRpb25cblx0ICAgICAgICAgICAgdmFyIG1pZFBvaW50ID0gTWF0aC5mbG9vcihiZWdpbm5pbmcgKyAoZW5kIC0gYmVnaW5uaW5nKSAvIDIpO1xuXHQgICAgICAgICAgICB2YXIgZXZlbnQgPSB0aGlzLl90aW1lbGluZVttaWRQb2ludF07XG5cdCAgICAgICAgICAgIHZhciBuZXh0RXZlbnQgPSB0aGlzLl90aW1lbGluZVttaWRQb2ludCArIDFdO1xuXHQgICAgICAgICAgICBpZiAoZXZlbnRbY29tcGFyYXRvcl0gPT09IHRpbWUpIHtcblx0ICAgICAgICAgICAgICAgIC8vY2hvb3NlIHRoZSBsYXN0IG9uZSB0aGF0IGhhcyB0aGUgc2FtZSB0aW1lXG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gbWlkUG9pbnQ7IGkgPCB0aGlzLl90aW1lbGluZS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0RXZlbnQgPSB0aGlzLl90aW1lbGluZVtpXTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGVzdEV2ZW50W2NvbXBhcmF0b3JdID09PSB0aW1lKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG1pZFBvaW50ID0gaTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbWlkUG9pbnQ7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRbY29tcGFyYXRvcl0gPCB0aW1lICYmIG5leHRFdmVudFtjb21wYXJhdG9yXSA+IHRpbWUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBtaWRQb2ludDtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFtjb21wYXJhdG9yXSA+IHRpbWUpIHtcblx0ICAgICAgICAgICAgICAgIC8vc2VhcmNoIGxvd2VyXG5cdCAgICAgICAgICAgICAgICBlbmQgPSBtaWRQb2ludDtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vc2VhcmNoIHVwcGVyXG5cdCAgICAgICAgICAgICAgICBiZWdpbm5pbmcgPSBtaWRQb2ludCArIDE7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIC0xO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJbnRlcm5hbCBpdGVyYXRvci4gQXBwbGllcyBleHRyYSBzYWZldHkgY2hlY2tzIGZvclxuXHRcdCAqICByZW1vdmluZyBpdGVtcyBmcm9tIHRoZSBhcnJheS5cblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFja1xuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXI9fSAgICBsb3dlckJvdW5kXG5cdFx0ICogIEBwYXJhbSAge051bWJlcj19ICAgIHVwcGVyQm91bmRcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZWxpbmUucHJvdG90eXBlLl9pdGVyYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBsb3dlckJvdW5kLCB1cHBlckJvdW5kKSB7XG5cdCAgICAgICAgbG93ZXJCb3VuZCA9IFRvbmUuZGVmYXVsdEFyZyhsb3dlckJvdW5kLCAwKTtcblx0ICAgICAgICB1cHBlckJvdW5kID0gVG9uZS5kZWZhdWx0QXJnKHVwcGVyQm91bmQsIHRoaXMuX3RpbWVsaW5lLmxlbmd0aCAtIDEpO1xuXHQgICAgICAgIHRoaXMuX3RpbWVsaW5lLnNsaWNlKGxvd2VyQm91bmQsIHVwcGVyQm91bmQgKyAxKS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGV2ZW50KTtcblx0ICAgICAgICB9LmJpbmQodGhpcykpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJdGVyYXRlIG92ZXIgZXZlcnl0aGluZyBpbiB0aGUgYXJyYXlcblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZXZlcnkgaXRlbVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgIHRoaXMuX2l0ZXJhdGUoY2FsbGJhY2spO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJdGVyYXRlIG92ZXIgZXZlcnl0aGluZyBpbiB0aGUgYXJyYXkgYXQgb3IgYmVmb3JlIHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lIFRoZSB0aW1lIHRvIGNoZWNrIGlmIGl0ZW1zIGFyZSBiZWZvcmVcblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZXZlcnkgaXRlbVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEJlZm9yZSA9IGZ1bmN0aW9uICh0aW1lLCBjYWxsYmFjaykge1xuXHQgICAgICAgIC8vaXRlcmF0ZSBvdmVyIHRoZSBpdGVtcyBpbiByZXZlcnNlIHNvIHRoYXQgcmVtb3ZpbmcgYW4gaXRlbSBkb2Vzbid0IGJyZWFrIHRoaW5nc1xuXHQgICAgICAgIHZhciB1cHBlckJvdW5kID0gdGhpcy5fc2VhcmNoKHRpbWUpO1xuXHQgICAgICAgIGlmICh1cHBlckJvdW5kICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLl9pdGVyYXRlKGNhbGxiYWNrLCAwLCB1cHBlckJvdW5kKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEl0ZXJhdGUgb3ZlciBldmVyeXRoaW5nIGluIHRoZSBhcnJheSBhZnRlciB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgdGltZSBUaGUgdGltZSB0byBjaGVjayBpZiBpdGVtcyBhcmUgYmVmb3JlXG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIGV2ZXJ5IGl0ZW1cblx0XHQgKiAgQHJldHVybnMge1RvbmUuVGltZWxpbmV9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZWxpbmUucHJvdG90eXBlLmZvckVhY2hBZnRlciA9IGZ1bmN0aW9uICh0aW1lLCBjYWxsYmFjaykge1xuXHQgICAgICAgIC8vaXRlcmF0ZSBvdmVyIHRoZSBpdGVtcyBpbiByZXZlcnNlIHNvIHRoYXQgcmVtb3ZpbmcgYW4gaXRlbSBkb2Vzbid0IGJyZWFrIHRoaW5nc1xuXHQgICAgICAgIHZhciBsb3dlckJvdW5kID0gdGhpcy5fc2VhcmNoKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2l0ZXJhdGUoY2FsbGJhY2ssIGxvd2VyQm91bmQgKyAxKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgSXRlcmF0ZSBvdmVyIGV2ZXJ5dGhpbmcgaW4gdGhlIGFycmF5IGJldHdlZW4gdGhlIHN0YXJ0VGltZSBhbmQgZW5kVGltZS4gXG5cdFx0ICogIFRoZSB0aW1lcmFuZ2UgaXMgaW5jbHVzaXZlIG9mIHRoZSBzdGFydFRpbWUsIGJ1dCBleGNsdXNpdmUgb2YgdGhlIGVuZFRpbWUuIFxuXHRcdCAqICByYW5nZSA9IFtzdGFydFRpbWUsIGVuZFRpbWUpLiBcblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgc3RhcnRUaW1lIFRoZSB0aW1lIHRvIGNoZWNrIGlmIGl0ZW1zIGFyZSBiZWZvcmVcblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgZW5kVGltZSBUaGUgZW5kIG9mIHRoZSB0ZXN0IGludGVydmFsLiBcblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZXZlcnkgaXRlbVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEJldHdlZW4gPSBmdW5jdGlvbiAoc3RhcnRUaW1lLCBlbmRUaW1lLCBjYWxsYmFjaykge1xuXHQgICAgICAgIHZhciBsb3dlckJvdW5kID0gdGhpcy5fc2VhcmNoKHN0YXJ0VGltZSk7XG5cdCAgICAgICAgdmFyIHVwcGVyQm91bmQgPSB0aGlzLl9zZWFyY2goZW5kVGltZSk7XG5cdCAgICAgICAgaWYgKGxvd2VyQm91bmQgIT09IC0xICYmIHVwcGVyQm91bmQgIT09IC0xKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl90aW1lbGluZVtsb3dlckJvdW5kXS50aW1lICE9PSBzdGFydFRpbWUpIHtcblx0ICAgICAgICAgICAgICAgIGxvd2VyQm91bmQgKz0gMTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvL2V4Y2x1c2l2ZSBvZiB0aGUgZW5kIHRpbWVcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVsaW5lW3VwcGVyQm91bmRdLnRpbWUgPT09IGVuZFRpbWUpIHtcblx0ICAgICAgICAgICAgICAgIHVwcGVyQm91bmQgLT0gMTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLl9pdGVyYXRlKGNhbGxiYWNrLCBsb3dlckJvdW5kLCB1cHBlckJvdW5kKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGxvd2VyQm91bmQgPT09IC0xKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2l0ZXJhdGUoY2FsbGJhY2ssIDAsIHVwcGVyQm91bmQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgSXRlcmF0ZSBvdmVyIGV2ZXJ5dGhpbmcgaW4gdGhlIGFycmF5IGF0IG9yIGFmdGVyIHRoZSBnaXZlbiB0aW1lLiBTaW1pbGFyIHRvXG5cdFx0ICogIGZvckVhY2hBZnRlciwgYnV0IGluY2x1ZGVzIHRoZSBpdGVtKHMpIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lIFRoZSB0aW1lIHRvIGNoZWNrIGlmIGl0ZW1zIGFyZSBiZWZvcmVcblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZXZlcnkgaXRlbVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEZyb20gPSBmdW5jdGlvbiAodGltZSwgY2FsbGJhY2spIHtcblx0ICAgICAgICAvL2l0ZXJhdGUgb3ZlciB0aGUgaXRlbXMgaW4gcmV2ZXJzZSBzbyB0aGF0IHJlbW92aW5nIGFuIGl0ZW0gZG9lc24ndCBicmVhayB0aGluZ3Ncblx0ICAgICAgICB2YXIgbG93ZXJCb3VuZCA9IHRoaXMuX3NlYXJjaCh0aW1lKTtcblx0ICAgICAgICAvL3dvcmsgYmFja3dhcmRzIHVudGlsIHRoZSBldmVudCB0aW1lIGlzIGxlc3MgdGhhbiB0aW1lXG5cdCAgICAgICAgd2hpbGUgKGxvd2VyQm91bmQgPj0gMCAmJiB0aGlzLl90aW1lbGluZVtsb3dlckJvdW5kXS50aW1lID49IHRpbWUpIHtcblx0ICAgICAgICAgICAgbG93ZXJCb3VuZC0tO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9pdGVyYXRlKGNhbGxiYWNrLCBsb3dlckJvdW5kICsgMSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEl0ZXJhdGUgb3ZlciBldmVyeXRoaW5nIGluIHRoZSBhcnJheSBhdCB0aGUgZ2l2ZW4gdGltZVxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lIFRoZSB0aW1lIHRvIGNoZWNrIGlmIGl0ZW1zIGFyZSBiZWZvcmVcblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZXZlcnkgaXRlbVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEF0VGltZSA9IGZ1bmN0aW9uICh0aW1lLCBjYWxsYmFjaykge1xuXHQgICAgICAgIC8vaXRlcmF0ZSBvdmVyIHRoZSBpdGVtcyBpbiByZXZlcnNlIHNvIHRoYXQgcmVtb3ZpbmcgYW4gaXRlbSBkb2Vzbid0IGJyZWFrIHRoaW5nc1xuXHQgICAgICAgIHZhciB1cHBlckJvdW5kID0gdGhpcy5fc2VhcmNoKHRpbWUpO1xuXHQgICAgICAgIGlmICh1cHBlckJvdW5kICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLl9pdGVyYXRlKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnRpbWUgPT09IHRpbWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXMsIGV2ZW50KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSwgMCwgdXBwZXJCb3VuZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuVGltZWxpbmV9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWVsaW5lLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl90aW1lbGluZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuVGltZWxpbmU7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIGlmIChUb25lLnN1cHBvcnRlZCkge1xuXHQgICAgICAgIGlmICghd2luZG93Lmhhc093blByb3BlcnR5KCdPZmZsaW5lQXVkaW9Db250ZXh0JykgJiYgd2luZG93Lmhhc093blByb3BlcnR5KCd3ZWJraXRPZmZsaW5lQXVkaW9Db250ZXh0JykpIHtcblx0ICAgICAgICAgICAgd2luZG93Lk9mZmxpbmVBdWRpb0NvbnRleHQgPSB3aW5kb3cud2Via2l0T2ZmbGluZUF1ZGlvQ29udGV4dDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9yZXR1cm5zIHByb21pc2U/XG5cdCAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgT2ZmbGluZUF1ZGlvQ29udGV4dCgxLCAxLCA0NDEwMCk7XG5cdCAgICAgICAgdmFyIHJldCA9IGNvbnRleHQuc3RhcnRSZW5kZXJpbmcoKTtcblx0ICAgICAgICBpZiAoIShyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuXHQgICAgICAgICAgICBPZmZsaW5lQXVkaW9Db250ZXh0LnByb3RvdHlwZS5fbmF0aXZlX3N0YXJ0UmVuZGVyaW5nID0gT2ZmbGluZUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuc3RhcnRSZW5kZXJpbmc7XG5cdCAgICAgICAgICAgIE9mZmxpbmVBdWRpb0NvbnRleHQucHJvdG90eXBlLnN0YXJ0UmVuZGVyaW5nID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChkb25lKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZG9uZShlLnJlbmRlcmVkQnVmZmVyKTtcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX25hdGl2ZV9zdGFydFJlbmRlcmluZygpO1xuXHQgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIGlmIChUb25lLnN1cHBvcnRlZCkge1xuXHQgICAgICAgIGlmICghd2luZG93Lmhhc093blByb3BlcnR5KCdBdWRpb0NvbnRleHQnKSAmJiB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ3dlYmtpdEF1ZGlvQ29udGV4dCcpKSB7XG5cdCAgICAgICAgICAgIHdpbmRvdy5BdWRpb0NvbnRleHQgPSB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL25vdCBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCwgYnV0IG9ubHkgYW4gQVBJIHBsYWNlaG9sZGVyXG5cdCAgICAgICAgaWYgKCFBdWRpb0NvbnRleHQucHJvdG90eXBlLmNsb3NlKSB7XG5cdCAgICAgICAgICAgIEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVG9uZS5pc0Z1bmN0aW9uKHRoaXMuc3VzcGVuZCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnN1c3BlbmQoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9ub3QgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnRcblx0ICAgICAgICBpZiAoIUF1ZGlvQ29udGV4dC5wcm90b3R5cGUucmVzdW1lKSB7XG5cdCAgICAgICAgICAgIEF1ZGlvQ29udGV4dC5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL2NyZWF0ZUdhaW5cblx0ICAgICAgICBpZiAoIUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlR2FpbiAmJiBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZUdhaW5Ob2RlKSB7XG5cdCAgICAgICAgICAgIEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlR2FpbiA9IEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlR2Fpbk5vZGU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vY3JlYXRlRGVsYXlcblx0ICAgICAgICBpZiAoIUF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRGVsYXkgJiYgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWxheU5vZGUpIHtcblx0ICAgICAgICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVEZWxheSA9IEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRGVsYXlOb2RlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL3Rlc3QgZGVjb2RlQXVkaW9EYXRhIHJldHVybnMgYSBwcm9taXNlXG5cdCAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vaGF5b25hby93ZWItYXVkaW8tYXBpLXNoaW0vYmxvYi9tYXN0ZXIvc3JjL0F1ZGlvQ29udGV4dC5qc1xuXHQgICAgICAgIC8vIE1JVCBMaWNlbnNlIChjKSAyMDE1IEBtb2hheW9uYW9cblx0ICAgICAgICB2YXIgZGVjb2RlQXVkaW9EYXRhUHJvbWlzZSA9IGZhbHNlO1xuXHQgICAgICAgIHZhciBvZmZsaW5lQ29udGV4dCA9IG5ldyBPZmZsaW5lQXVkaW9Db250ZXh0KDEsIDEsIDQ0MTAwKTtcblx0ICAgICAgICB2YXIgYXVkaW9EYXRhID0gbmV3IFVpbnQzMkFycmF5KFtcblx0ICAgICAgICAgICAgMTE3OTAxMTQxMCxcblx0ICAgICAgICAgICAgNDgsXG5cdCAgICAgICAgICAgIDExNjMyODA3MjcsXG5cdCAgICAgICAgICAgIDU0NDUwMTA5NCxcblx0ICAgICAgICAgICAgMTYsXG5cdCAgICAgICAgICAgIDEzMTA3Myxcblx0ICAgICAgICAgICAgNDQxMDAsXG5cdCAgICAgICAgICAgIDE3NjQwMCxcblx0ICAgICAgICAgICAgMTA0ODU4MCxcblx0ICAgICAgICAgICAgMTYzNTAxNzA2MCxcblx0ICAgICAgICAgICAgOCxcblx0ICAgICAgICAgICAgMCxcblx0ICAgICAgICAgICAgMCxcblx0ICAgICAgICAgICAgMCxcblx0ICAgICAgICAgICAgMFxuXHQgICAgICAgIF0pLmJ1ZmZlcjtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICB2YXIgcmV0ID0gb2ZmbGluZUNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKGF1ZGlvRGF0YSk7XG5cdCAgICAgICAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICBkZWNvZGVBdWRpb0RhdGFQcm9taXNlID0gdHJ1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgZGVjb2RlQXVkaW9EYXRhUHJvbWlzZSA9IGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIWRlY29kZUF1ZGlvRGF0YVByb21pc2UpIHtcblx0ICAgICAgICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5fbmF0aXZlX2RlY29kZUF1ZGlvRGF0YSA9IEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuZGVjb2RlQXVkaW9EYXRhO1xuXHQgICAgICAgICAgICBBdWRpb0NvbnRleHQucHJvdG90eXBlLmRlY29kZUF1ZGlvRGF0YSA9IGZ1bmN0aW9uIChhdWRpb0RhdGEpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoc3VjY2VzcywgZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9uYXRpdmVfZGVjb2RlQXVkaW9EYXRhKGF1ZGlvRGF0YSwgc3VjY2VzcywgZXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgV3JhcHBlciBhcm91bmQgdGhlIG5hdGl2ZSBBdWRpb0NvbnRleHQuXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkVtaXR0ZXJ9XG5cdFx0ICogIEBwYXJhbSB7QXVkaW9Db250ZXh0PX0gY29udGV4dCBvcHRpb25hbGx5IHBhc3MgaW4gYSBjb250ZXh0XG5cdFx0ICovXG5cdCAgICBUb25lLkNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5FbWl0dGVyLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydjb250ZXh0J10sIFRvbmUuQ29udGV4dCk7XG5cdCAgICAgICAgaWYgKCFvcHRpb25zLmNvbnRleHQpIHtcblx0ICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0ID0gbmV3IHdpbmRvdy5BdWRpb0NvbnRleHQoKTtcblx0ICAgICAgICAgICAgaWYgKCFvcHRpb25zLmNvbnRleHQpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGNyZWF0ZSBBdWRpb0NvbnRleHQuIFBvc3NpYmx5IHRvbyBtYW55IEF1ZGlvQ29udGV4dHMgcnVubmluZyBhbHJlYWR5LicpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2NvbnRleHQgPSBvcHRpb25zLmNvbnRleHQ7XG5cdCAgICAgICAgLy8gZXh0ZW5kIGFsbCBvZiB0aGUgbWV0aG9kc1xuXHQgICAgICAgIGZvciAodmFyIHByb3AgaW4gdGhpcy5fY29udGV4dCkge1xuXHQgICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eSh0aGlzLl9jb250ZXh0LCBwcm9wKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGRlZmF1bHQgbGF0ZW5jeSBoaW50XG5cdFx0XHQgKiAgQHR5cGUgIHtTdHJpbmd9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xhdGVuY3lIaW50ID0gb3B0aW9ucy5sYXRlbmN5SGludDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBbiBvYmplY3QgY29udGFpbmluZyBhbGwgb2YgdGhlIGNvbnN0YW50cyBBdWRpb0J1ZmZlclNvdXJjZU5vZGVzXG5cdFx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2NvbnN0YW50cyA9IHt9O1xuXHQgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAgICAgLy8gV09SS0VSXG5cdCAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW1vdW50IG9mIHRpbWUgZXZlbnRzIGFyZSBzY2hlZHVsZWRcblx0XHRcdCAqICBpbnRvIHRoZSBmdXR1cmVcblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMubG9va0FoZWFkID0gb3B0aW9ucy5sb29rQWhlYWQ7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQSByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBjb21wdXRlZCB1cGRhdGUgaW50ZXJ2YWxcblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fY29tcHV0ZWRVcGRhdGVJbnRlcnZhbCA9IDA7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQSByZWxpYWJsZSBjYWxsYmFjayBtZXRob2Rcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlICB7VGlja2VyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdGlja2VyID0gbmV3IFRpY2tlcih0aGlzLmVtaXQuYmluZCh0aGlzLCAndGljaycpLCBvcHRpb25zLmNsb2NrU291cmNlLCBvcHRpb25zLnVwZGF0ZUludGVydmFsKTtcblx0ICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgICAgIC8vIFRJTUVPVVRTXG5cdCAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBbGwgb2YgdGhlIHNldFRpbWVvdXQgZXZlbnRzLlxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5UaW1lbGluZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdGltZW91dHMgPSBuZXcgVG9uZS5UaW1lbGluZSgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSB0aW1lb3V0IGlkIGNvdW50ZXJcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtOdW1iZXJ9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl90aW1lb3V0SWRzID0gMDtcblx0ICAgICAgICB0aGlzLm9uKCd0aWNrJywgdGhpcy5fdGltZW91dExvb3AuYmluZCh0aGlzKSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5Db250ZXh0LCBUb25lLkVtaXR0ZXIpO1xuXHQgICAgVG9uZS5FbWl0dGVyLm1peGluKFRvbmUuQ29udGV4dCk7XG5cdCAgICAvKipcblx0XHQgKiBkZWZhdWx0c1xuXHRcdCAqIEBzdGF0aWNcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Db250ZXh0LmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdjbG9ja1NvdXJjZSc6ICd3b3JrZXInLFxuXHQgICAgICAgICdsYXRlbmN5SGludCc6ICdpbnRlcmFjdGl2ZScsXG5cdCAgICAgICAgJ2xvb2tBaGVhZCc6IDAuMSxcblx0ICAgICAgICAndXBkYXRlSW50ZXJ2YWwnOiAwLjAzXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIERlZmluZSBhIHByb3BlcnR5IG9uIHRoaXMgVG9uZS5Db250ZXh0LlxuXHRcdCAqICBUaGlzIGlzIHVzZWQgdG8gZXh0ZW5kIHRoZSBuYXRpdmUgQXVkaW9Db250ZXh0XG5cdFx0ICogIEBwYXJhbSAge0F1ZGlvQ29udGV4dH0gIGNvbnRleHRcblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfSAgcHJvcFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Db250ZXh0LnByb3RvdHlwZS5fZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAoY29udGV4dCwgcHJvcCkge1xuXHQgICAgICAgIGlmIChUb25lLmlzVW5kZWYodGhpc1twcm9wXSkpIHtcblx0ICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3AsIHtcblx0ICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGV4dFtwcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dFtwcm9wXS5iaW5kKGNvbnRleHQpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0W3Byb3BdO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb250ZXh0W3Byb3BdID0gdmFsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBjdXJyZW50IGF1ZGlvIGNvbnRleHQgdGltZVxuXHRcdCAqICBAcmV0dXJuICB7TnVtYmVyfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Db250ZXh0LnByb3RvdHlwZS5ub3cgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHQuY3VycmVudFRpbWUgKyB0aGlzLmxvb2tBaGVhZDtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUHJvbWlzZSB3aGljaCBpcyBpbnZva2VkIHdoZW4gdGhlIGNvbnRleHQgaXMgcnVubmluZy5cblx0XHQgKiAgVHJpZXMgdG8gcmVzdW1lIHRoZSBjb250ZXh0IGlmIGl0J3Mgbm90IHN0YXJ0ZWQuXG5cdFx0ICogIEByZXR1cm4gIHtQcm9taXNlfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Db250ZXh0LnByb3RvdHlwZS5yZWFkeSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGRvbmUpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHQuc3RhdGUgPT09ICdydW5uaW5nJykge1xuXHQgICAgICAgICAgICAgICAgZG9uZSgpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dC5yZXN1bWUoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICBkb25lKCk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFByb21pc2Ugd2hpY2ggaXMgaW52b2tlZCB3aGVuIHRoZSBjb250ZXh0IGlzIHJ1bm5pbmcuXG5cdFx0ICogIFRyaWVzIHRvIHJlc3VtZSB0aGUgY29udGV4dCBpZiBpdCdzIG5vdCBzdGFydGVkLlxuXHRcdCAqICBAcmV0dXJuICB7UHJvbWlzZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuQ29udGV4dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHQuY2xvc2UoKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgVG9uZS5Db250ZXh0LmVtaXQoJ2Nsb3NlJywgdGhpcyk7XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgR2VuZXJhdGUgYSBsb29wZWQgYnVmZmVyIGF0IHNvbWUgY29uc3RhbnQgdmFsdWUuXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHZhbFxuXHRcdCAqICBAcmV0dXJuICB7QnVmZmVyU291cmNlTm9kZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuQ29udGV4dC5wcm90b3R5cGUuZ2V0Q29uc3RhbnQgPSBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX2NvbnN0YW50c1t2YWxdKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb25zdGFudHNbdmFsXTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgYnVmZmVyID0gdGhpcy5fY29udGV4dC5jcmVhdGVCdWZmZXIoMSwgMTI4LCB0aGlzLl9jb250ZXh0LnNhbXBsZVJhdGUpO1xuXHQgICAgICAgICAgICB2YXIgYXJyID0gYnVmZmVyLmdldENoYW5uZWxEYXRhKDApO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgYXJyW2ldID0gdmFsO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBjb25zdGFudCA9IHRoaXMuX2NvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7XG5cdCAgICAgICAgICAgIGNvbnN0YW50LmNoYW5uZWxDb3VudCA9IDE7XG5cdCAgICAgICAgICAgIGNvbnN0YW50LmNoYW5uZWxDb3VudE1vZGUgPSAnZXhwbGljaXQnO1xuXHQgICAgICAgICAgICBjb25zdGFudC5idWZmZXIgPSBidWZmZXI7XG5cdCAgICAgICAgICAgIGNvbnN0YW50Lmxvb3AgPSB0cnVlO1xuXHQgICAgICAgICAgICBjb25zdGFudC5zdGFydCgwKTtcblx0ICAgICAgICAgICAgdGhpcy5fY29uc3RhbnRzW3ZhbF0gPSBjb25zdGFudDtcblx0ICAgICAgICAgICAgcmV0dXJuIGNvbnN0YW50O1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHByaXZhdGUgbG9vcCB3aGljaCBrZWVwcyB0cmFjayBvZiB0aGUgY29udGV4dCBzY2hlZHVsZWQgdGltZW91dHNcblx0XHQgKiAgSXMgaW52b2tlZCBmcm9tIHRoZSBjbG9jayBzb3VyY2Vcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuQ29udGV4dC5wcm90b3R5cGUuX3RpbWVvdXRMb29wID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBub3cgPSB0aGlzLm5vdygpO1xuXHQgICAgICAgIHdoaWxlICh0aGlzLl90aW1lb3V0cyAmJiB0aGlzLl90aW1lb3V0cy5sZW5ndGggJiYgdGhpcy5fdGltZW91dHMucGVlaygpLnRpbWUgPD0gbm93KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRzLnNoaWZ0KCkuY2FsbGJhY2soKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEEgc2V0VGltZW91dCB3aGljaCBpcyBnYXVyZW50ZWVkIGJ5IHRoZSBjbG9jayBzb3VyY2UuXG5cdFx0ICogIEFsc28gcnVucyBpbiB0aGUgb2ZmbGluZSBjb250ZXh0LlxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbn0gIGZuICAgICAgIFRoZSBjYWxsYmFjayB0byBpbnZva2Vcblx0XHQgKiAgQHBhcmFtICB7U2Vjb25kc30gICAgdGltZW91dCAgVGhlIHRpbWVvdXQgaW4gc2Vjb25kc1xuXHRcdCAqICBAcmV0dXJucyB7TnVtYmVyfSBJRCB0byB1c2Ugd2hlbiBpbnZva2luZyBUb25lLkNvbnRleHQuY2xlYXJUaW1lb3V0XG5cdFx0ICovXG5cdCAgICBUb25lLkNvbnRleHQucHJvdG90eXBlLnNldFRpbWVvdXQgPSBmdW5jdGlvbiAoZm4sIHRpbWVvdXQpIHtcblx0ICAgICAgICB0aGlzLl90aW1lb3V0SWRzKys7XG5cdCAgICAgICAgdmFyIG5vdyA9IHRoaXMubm93KCk7XG5cdCAgICAgICAgdGhpcy5fdGltZW91dHMuYWRkKHtcblx0ICAgICAgICAgICAgY2FsbGJhY2s6IGZuLFxuXHQgICAgICAgICAgICB0aW1lOiBub3cgKyB0aW1lb3V0LFxuXHQgICAgICAgICAgICBpZDogdGhpcy5fdGltZW91dElkc1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0SWRzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhcnMgYSBwcmV2aW91c2x5IHNjaGVkdWxlZCB0aW1lb3V0IHdpdGggVG9uZS5jb250ZXh0LnNldFRpbWVvdXRcblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgaWQgIFRoZSBJRCByZXR1cm5lZCBmcm9tIHNldFRpbWVvdXRcblx0XHQgKiAgQHJldHVybiAge1RvbmUuQ29udGV4dH0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ29udGV4dC5wcm90b3R5cGUuY2xlYXJUaW1lb3V0ID0gZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgdGhpcy5fdGltZW91dHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgICAgaWYgKGV2ZW50LmlkID09PSBpZCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoZXZlbnQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEhvdyBvZnRlbiB0aGUgV2ViIFdvcmtlciBjYWxsYmFjayBpcyBpbnZva2VkLlxuXHRcdCAqICBUaGlzIG51bWJlciBjb3JyZXNwb25kcyB0byBob3cgcmVzcG9uc2l2ZSB0aGUgc2NoZWR1bGluZ1xuXHRcdCAqICBjYW4gYmUuIENvbnRleHQudXBkYXRlSW50ZXJ2YWwgKyBDb250ZXh0Lmxvb2tBaGVhZCBnaXZlcyB5b3UgdGhlXG5cdFx0ICogIHRvdGFsIGxhdGVuY3kgYmV0d2VlbiBzY2hlZHVsaW5nIGFuIGV2ZW50IGFuZCBoZWFyaW5nIGl0LlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5Db250ZXh0I1xuXHRcdCAqICBAbmFtZSB1cGRhdGVJbnRlcnZhbFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQ29udGV4dC5wcm90b3R5cGUsICd1cGRhdGVJbnRlcnZhbCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpY2tlci51cGRhdGVJbnRlcnZhbDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGludGVydmFsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpY2tlci51cGRhdGVJbnRlcnZhbCA9IGludGVydmFsO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFdoYXQgdGhlIHNvdXJjZSBvZiB0aGUgY2xvY2sgaXMsIGVpdGhlciBcIndvcmtlclwiIChXZWIgV29ya2VyIFtkZWZhdWx0XSksXG5cdFx0ICogIFwidGltZW91dFwiIChzZXRUaW1lb3V0KSwgb3IgXCJvZmZsaW5lXCIgKG5vbmUpLlxuXHRcdCAqICBAdHlwZSB7U3RyaW5nfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5Db250ZXh0I1xuXHRcdCAqICBAbmFtZSBjbG9ja1NvdXJjZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQ29udGV4dC5wcm90b3R5cGUsICdjbG9ja1NvdXJjZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpY2tlci50eXBlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgICAgICB0aGlzLl90aWNrZXIudHlwZSA9IHR5cGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHR5cGUgb2YgcGxheWJhY2ssIHdoaWNoIGFmZmVjdHMgdHJhZGVvZmZzIGJldHdlZW4gYXVkaW9cblx0XHQgKiAgb3V0cHV0IGxhdGVuY3kgYW5kIHJlc3BvbnNpdmVuZXNzLlxuXHRcdCAqXG5cdFx0ICogIEluIGFkZGl0aW9uIHRvIHNldHRpbmcgdGhlIHZhbHVlIGluIHNlY29uZHMsIHRoZSBsYXRlbmN5SGludCBhbHNvXG5cdFx0ICogIGFjY2VwdHMgdGhlIHN0cmluZ3MgXCJpbnRlcmFjdGl2ZVwiIChwcmlvcml0aXplcyBsb3cgbGF0ZW5jeSksXG5cdFx0ICogIFwicGxheWJhY2tcIiAocHJpb3JpdGl6ZXMgc3VzdGFpbmVkIHBsYXliYWNrKSwgXCJiYWxhbmNlZFwiIChiYWxhbmNlc1xuXHRcdCAqICBsYXRlbmN5IGFuZCBwZXJmb3JtYW5jZSksIGFuZCBcImZhc3Rlc3RcIiAobG93ZXN0IGxhdGVuY3ksIG1pZ2h0IGdsaXRjaCBtb3JlIG9mdGVuKS5cblx0XHQgKiAgQHR5cGUge1N0cmluZ3xTZWNvbmRzfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5Db250ZXh0I1xuXHRcdCAqICBAbmFtZSBsYXRlbmN5SGludFxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vc2V0IHRoZSBsb29rQWhlYWQgdG8gMC4zIHNlY29uZHNcblx0XHQgKiBUb25lLmNvbnRleHQubGF0ZW5jeUhpbnQgPSAwLjM7XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Db250ZXh0LnByb3RvdHlwZSwgJ2xhdGVuY3lIaW50Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZW5jeUhpbnQ7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChoaW50KSB7XG5cdCAgICAgICAgICAgIHZhciBsb29rQWhlYWQgPSBoaW50O1xuXHQgICAgICAgICAgICB0aGlzLl9sYXRlbmN5SGludCA9IGhpbnQ7XG5cdCAgICAgICAgICAgIGlmIChUb25lLmlzU3RyaW5nKGhpbnQpKSB7XG5cdCAgICAgICAgICAgICAgICBzd2l0Y2ggKGhpbnQpIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgJ2ludGVyYWN0aXZlJzpcblx0ICAgICAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSAwLjE7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dC5sYXRlbmN5SGludCA9IGhpbnQ7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdwbGF5YmFjayc6XG5cdCAgICAgICAgICAgICAgICAgICAgbG9va0FoZWFkID0gMC44O1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubGF0ZW5jeUhpbnQgPSBoaW50O1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnYmFsYW5jZWQnOlxuXHQgICAgICAgICAgICAgICAgICAgIGxvb2tBaGVhZCA9IDAuMjU7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dC5sYXRlbmN5SGludCA9IGhpbnQ7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdmYXN0ZXN0Jzpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxhdGVuY3lIaW50ID0gJ2ludGVyYWN0aXZlJztcblx0ICAgICAgICAgICAgICAgICAgICBsb29rQWhlYWQgPSAwLjAxO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMubG9va0FoZWFkID0gbG9va0FoZWFkO1xuXHQgICAgICAgICAgICB0aGlzLnVwZGF0ZUludGVydmFsID0gbG9va0FoZWFkIC8gMztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBVbmxpa2Ugb3RoZXIgZGlzcG9zZSBtZXRob2RzLCB0aGlzIHJldHVybnMgYSBQcm9taXNlXG5cdFx0ICogIHdoaWNoIGV4ZWN1dGVzIHdoZW4gdGhlIGNvbnRleHQgaXMgY2xvc2VkIGFuZCBkaXNwb3NlZFxuXHRcdCAqICBAcmV0dXJucyB7UHJvbWlzZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Db250ZXh0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIFRvbmUuRW1pdHRlci5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICB0aGlzLl90aWNrZXIuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgICB0aGlzLl90aWNrZXIgPSBudWxsO1xuXHQgICAgICAgICAgICB0aGlzLl90aW1lb3V0cy5kaXNwb3NlKCk7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRzID0gbnVsbDtcblx0ICAgICAgICAgICAgZm9yICh2YXIgY29uIGluIHRoaXMuX2NvbnN0YW50cykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fY29uc3RhbnRzW2Nvbl0uZGlzY29ubmVjdCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX2NvbnN0YW50cyA9IG51bGw7XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBAY2xhc3MgQSBjbGFzcyB3aGljaCBwcm92aWRlcyBhIHJlbGlhYmxlIGNhbGxiYWNrIHVzaW5nIGVpdGhlclxuXHRcdCAqICAgICAgICBhIFdlYiBXb3JrZXIsIG9yIGlmIHRoYXQgaXNuJ3Qgc3VwcG9ydGVkLCBmYWxscyBiYWNrIHRvIHNldFRpbWVvdXQuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIHZhciBUaWNrZXIgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHR5cGUsIHVwZGF0ZUludGVydmFsKSB7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBFaXRoZXIgXCJ3b3JrZXJcIiBvciBcInRpbWVvdXRcIlxuXHRcdFx0ICogQHR5cGUge1N0cmluZ31cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSB1cGRhdGUgaW50ZXJ2YWwgb2YgdGhlIHdvcmtlclxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl91cGRhdGVJbnRlcnZhbCA9IHVwZGF0ZUludGVydmFsO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIGNhbGxiYWNrIHRvIGludm9rZSBhdCByZWd1bGFyIGludGVydmFsc1xuXHRcdFx0ICogQHR5cGUge0Z1bmN0aW9ufVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2NhbGxiYWNrID0gVG9uZS5kZWZhdWx0QXJnKGNhbGxiYWNrLCBUb25lLm5vT3ApO1xuXHQgICAgICAgIC8vY3JlYXRlIHRoZSBjbG9jayBzb3VyY2UgZm9yIHRoZSBmaXJzdCB0aW1lXG5cdCAgICAgICAgdGhpcy5fY3JlYXRlQ2xvY2soKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUaGUgcG9zc2libGUgdGlja2VyIHR5cGVzXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVGlja2VyLlR5cGUgPSB7XG5cdCAgICAgICAgV29ya2VyOiAnd29ya2VyJyxcblx0ICAgICAgICBUaW1lb3V0OiAndGltZW91dCcsXG5cdCAgICAgICAgT2ZmbGluZTogJ29mZmxpbmUnXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEdlbmVyYXRlIGEgd2ViIHdvcmtlclxuXHRcdCAqICBAcmV0dXJuICB7V2ViV29ya2VyfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVGlja2VyLnByb3RvdHlwZS5fY3JlYXRlV29ya2VyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vVVJMIFNoaW1cblx0ICAgICAgICB3aW5kb3cuVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xuXHQgICAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoWy8vdGhlIGluaXRpYWwgdGltZW91dCB0aW1lXG5cdCAgICAgICAgICAgICd2YXIgdGltZW91dFRpbWUgPSAnICsgKHRoaXMuX3VwZGF0ZUludGVydmFsICogMTAwMCkudG9GaXhlZCgxKSArICc7JyArIC8vb25tZXNzYWdlIGNhbGxiYWNrXG5cdCAgICAgICAgICAgICdzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKG1zZyl7JyArICdcXHR0aW1lb3V0VGltZSA9IHBhcnNlSW50KG1zZy5kYXRhKTsnICsgJ307JyArIC8vdGhlIHRpY2sgZnVuY3Rpb24gd2hpY2ggcG9zdHMgYSBtZXNzYWdlXG5cdCAgICAgICAgICAgIC8vYW5kIHNjaGVkdWxlcyBhIG5ldyB0aWNrXG5cdCAgICAgICAgICAgICdmdW5jdGlvbiB0aWNrKCl7JyArICdcXHRzZXRUaW1lb3V0KHRpY2ssIHRpbWVvdXRUaW1lKTsnICsgJ1xcdHNlbGYucG9zdE1lc3NhZ2UoXFwndGlja1xcJyk7JyArICd9JyArIC8vY2FsbCB0aWNrIGluaXRpYWxseVxuXHQgICAgICAgICAgICAndGljaygpOyddKTtcblx0ICAgICAgICB2YXIgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cdCAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIoYmxvYlVybCk7XG5cdCAgICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IHRoaXMuX2NhbGxiYWNrLmJpbmQodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd29ya2VyID0gd29ya2VyO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIENyZWF0ZSBhIHRpbWVvdXQgbG9vcFxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUaWNrZXIucHJvdG90eXBlLl9jcmVhdGVUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY3JlYXRlVGltZW91dCgpO1xuXHQgICAgICAgICAgICB0aGlzLl9jYWxsYmFjaygpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSwgdGhpcy5fdXBkYXRlSW50ZXJ2YWwgKiAxMDAwKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBDcmVhdGUgdGhlIGNsb2NrIHNvdXJjZS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVGlja2VyLnByb3RvdHlwZS5fY3JlYXRlQ2xvY2sgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09IFRpY2tlci5UeXBlLldvcmtlcikge1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlV29ya2VyKCk7XG5cdCAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgICAgIC8vIHdvcmtlcnMgbm90IHN1cHBvcnRlZCwgZmFsbGJhY2sgdG8gdGltZW91dFxuXHQgICAgICAgICAgICAgICAgdGhpcy5fdHlwZSA9IFRpY2tlci5UeXBlLlRpbWVvdXQ7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVDbG9jaygpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90eXBlID09PSBUaWNrZXIuVHlwZS5UaW1lb3V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVRpbWVvdXQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogQG1lbWJlck9mIFRpY2tlciNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIHVwZGF0ZUludGVydmFsXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUaWNrZXIucHJvdG90eXBlLCAndXBkYXRlSW50ZXJ2YWwnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVJbnRlcnZhbDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGludGVydmFsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUludGVydmFsID0gTWF0aC5tYXgoaW50ZXJ2YWwsIDEyOCAvIDQ0MTAwKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09IFRpY2tlci5UeXBlLldvcmtlcikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKE1hdGgubWF4KGludGVydmFsICogMTAwMCwgMSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgdHlwZSBvZiB0aGUgdGlja2VyLCBlaXRoZXIgYSB3b3JrZXIgb3IgYSB0aW1lb3V0XG5cdFx0ICogQG1lbWJlck9mIFRpY2tlciNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIHR5cGVcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRpY2tlci5wcm90b3R5cGUsICd0eXBlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHR5cGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZGlzcG9zZUNsb2NrKCk7XG5cdCAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLl9jcmVhdGVDbG9jaygpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogQ2xlYW4gdXAgdGhlIGN1cnJlbnQgY2xvY2sgc291cmNlXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRpY2tlci5wcm90b3R5cGUuX2Rpc3Bvc2VDbG9jayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5fdGltZW91dCkge1xuXHQgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3dvcmtlci50ZXJtaW5hdGUoKTtcblx0ICAgICAgICAgICAgdGhpcy5fd29ya2VyLm9ubWVzc2FnZSA9IG51bGw7XG5cdCAgICAgICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIENsZWFuIHVwXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRpY2tlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLl9kaXNwb3NlQ2xvY2soKTtcblx0ICAgICAgICB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNoaW0gYWxsIGNvbm5lY3QvZGlzY29ubmVjdCBhbmQgc29tZSBkZXByZWNhdGVkIG1ldGhvZHMgd2hpY2ggYXJlIHN0aWxsIGluXG5cdFx0ICogIHNvbWUgb2xkZXIgaW1wbGVtZW50YXRpb25zLlxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5nZXRDb250ZXh0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbmF0aXZlQ29ubmVjdCA9IEF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdDtcblx0ICAgICAgICB2YXIgbmF0aXZlRGlzY29ubmVjdCA9IEF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzY29ubmVjdDtcblx0ICAgICAgICAvL3JlcGxhY2UgdGhlIG9sZCBjb25uZWN0IG1ldGhvZFxuXHQgICAgICAgIGZ1bmN0aW9uIHRvbmVDb25uZWN0KEIsIG91dE51bSwgaW5OdW0pIHtcblx0ICAgICAgICAgICAgaWYgKEIuaW5wdXQpIHtcblx0ICAgICAgICAgICAgICAgIGluTnVtID0gVG9uZS5kZWZhdWx0QXJnKGluTnVtLCAwKTtcblx0ICAgICAgICAgICAgICAgIGlmIChUb25lLmlzQXJyYXkoQi5pbnB1dCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0KEIuaW5wdXRbaW5OdW1dKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdChCLmlucHV0LCBvdXROdW0sIGluTnVtKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKEIgaW5zdGFuY2VvZiBBdWRpb05vZGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ29ubmVjdC5jYWxsKHRoaXMsIEIsIG91dE51bSwgaW5OdW0pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQjtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVDb25uZWN0LmNhbGwodGhpcywgQiwgb3V0TnVtKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEI7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXJyb3IgY29ubmVjdGluZyB0byBub2RlOiAnICsgQiArICdcXG4nICsgZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9yZXBsYWNlIHRoZSBvbGQgZGlzY29ubmVjdCBtZXRob2Rcblx0ICAgICAgICBmdW5jdGlvbiB0b25lRGlzY29ubmVjdChCLCBvdXROdW0sIGluTnVtKSB7XG5cdCAgICAgICAgICAgIGlmIChCICYmIEIuaW5wdXQgJiYgVG9uZS5pc0FycmF5KEIuaW5wdXQpKSB7XG5cdCAgICAgICAgICAgICAgICBpbk51bSA9IFRvbmUuZGVmYXVsdEFyZyhpbk51bSwgMCk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoQi5pbnB1dFtpbk51bV0sIG91dE51bSwgMCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoQiAmJiBCLmlucHV0KSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoQi5pbnB1dCwgb3V0TnVtLCBpbk51bSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIG5hdGl2ZURpc2Nvbm5lY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGRpc2Nvbm5lY3Rpbmcgbm9kZTogJyArIEIgKyAnXFxuJyArIGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChBdWRpb05vZGUucHJvdG90eXBlLmNvbm5lY3QgIT09IHRvbmVDb25uZWN0KSB7XG5cdCAgICAgICAgICAgIEF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdCA9IHRvbmVDb25uZWN0O1xuXHQgICAgICAgICAgICBBdWRpb05vZGUucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSB0b25lRGlzY29ubmVjdDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8vIHNldCB0aGUgYXVkaW8gY29udGV4dCBpbml0aWFsbHksIGFuZCBpZiBvbmUgaXMgbm90IGFscmVhZHkgY3JlYXRlZFxuXHQgICAgaWYgKFRvbmUuc3VwcG9ydGVkICYmICFUb25lLmluaXRpYWxpemVkKSB7XG5cdCAgICAgICAgVG9uZS5jb250ZXh0ID0gbmV3IFRvbmUuQ29udGV4dCgpO1xuXHQgICAgICAgIC8vIGxvZyBvbiBmaXJzdCBpbml0aWFsaXphdGlvblxuXHQgICAgICAgIC8vIGFsbG93IG9wdGlvbmFsIHNpbGVuY2luZyBvZiB0aGlzIGxvZ1xuXHQgICAgICAgIGlmICghd2luZG93LlRPTkVfU0lMRU5DRV9WRVJTSU9OX0xPR0dJTkcpIHtcblx0ICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblx0ICAgICAgICAgICAgY29uc29sZS5sb2coJyVjICogVG9uZS5qcyAnICsgVG9uZS52ZXJzaW9uICsgJyAqICcsICdiYWNrZ3JvdW5kOiAjMDAwOyBjb2xvcjogI2ZmZicpO1xuXHQgICAgICAgIH1cblx0ICAgIH0gZWxzZSBpZiAoIVRvbmUuc3VwcG9ydGVkKSB7XG5cdCAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblx0ICAgICAgICBjb25zb2xlLndhcm4oJ1RoaXMgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFRvbmUuanMnKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBUb25lLkNvbnRleHQ7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5BdWRpb05vZGUgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGNsYXNzZXMgd2hpY2ggcHJvY2VzcyBhdWRpby5cblx0XHQgKiAgICAgICAgIEF1ZGlvTm9kZXMgaGF2ZSBpbnB1dHMgYW5kIG91dHB1dHMuXG5cdFx0ICogIEBwYXJhbVx0e0F1ZGlvQ29udGV4dD19IGNvbnRleHRcdFRoZSBhdWRpbyBjb250ZXh0IHRvIHVzZSB3aXRoIHRoZSBjbGFzc1xuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuQXVkaW9Ob2RlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvL3VzZSB0aGUgZGVmYXVsdCBjb250ZXh0IGlmIG9uZSBpcyBub3QgcGFzc2VkIGluXG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydjb250ZXh0J10sIHsgJ2NvbnRleHQnOiBUb25lLmNvbnRleHQgfSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgQXVkaW9Db250ZXh0IG9mIHRoaXMgaW5zdGFuY2Vcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAdHlwZSB7QXVkaW9Db250ZXh0fVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fY29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiBHZXQgdGhlIGF1ZGlvIGNvbnRleHQgYmVsb25naW5nIHRvIHRoaXMgaW5zdGFuY2UuXG5cdFx0ICogQHR5cGUge1RvbmUuQ29udGV4dH1cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5BdWRpb05vZGUjXG5cdFx0ICogQG5hbWUgY29udGV4dFxuXHRcdCAqIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZSwgJ2NvbnRleHQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENyZWF0ZSBpbnB1dCBhbmQgb3V0cHV0cyBmb3IgdGhpcyBvYmplY3QuXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIFtpbnB1dD0wXSAgIFRoZSBudW1iZXIgb2YgaW5wdXRzXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIFtvdXRwdXRzPTBdICBUaGUgbnVtYmVyIG9mIG91dHB1dHNcblx0XHQgKiAgQHJldHVybiAge1RvbmUuQXVkaW9Ob2RlfSAgdGhpc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmNyZWF0ZUluc091dHMgPSBmdW5jdGlvbiAoaW5wdXRzLCBvdXRwdXRzKSB7XG5cdCAgICAgICAgaWYgKGlucHV0cyA9PT0gMSkge1xuXHQgICAgICAgICAgICB0aGlzLmlucHV0ID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGlucHV0cyA+IDEpIHtcblx0ICAgICAgICAgICAgdGhpcy5pbnB1dCA9IG5ldyBBcnJheShpbnB1dHMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAob3V0cHV0cyA9PT0gMSkge1xuXHQgICAgICAgICAgICB0aGlzLm91dHB1dCA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRzID4gMSkge1xuXHQgICAgICAgICAgICB0aGlzLm91dHB1dCA9IG5ldyBBcnJheShvdXRwdXRzKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGNoYW5uZWxDb3VudCBpcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHVzZWQgd2hlbiB1cC1taXhpbmcgYW5kIGRvd24tbWl4aW5nXG5cdFx0ICogIGNvbm5lY3Rpb25zIHRvIGFueSBpbnB1dHMgdG8gdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIgZXhjZXB0IGZvclxuXHRcdCAqICBzcGVjaWZpYyBub2RlcyB3aGVyZSBpdHMgdmFsdWUgaXMgc3BlY2lhbGx5IGRldGVybWluZWQuXG5cdFx0ICpcblx0XHQgKiAgQG1lbWJlcm9mIFRvbmUuQXVkaW9Ob2RlI1xuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbmFtZSBjaGFubmVsQ291bnRcblx0XHQgKiAgQHJlYWRPbmx5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLCAnY2hhbm5lbENvdW50Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXQuY2hhbm5lbENvdW50O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoYykge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXQuY2hhbm5lbENvdW50ID0gYztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBjaGFubmVsQ291bnRNb2RlIGRldGVybWluZXMgaG93IGNoYW5uZWxzIHdpbGwgYmUgY291bnRlZCB3aGVuIHVwLW1peGluZyBhbmRcblx0XHQgKiAgZG93bi1taXhpbmcgY29ubmVjdGlvbnMgdG8gYW55IGlucHV0cyB0byB0aGUgbm9kZS5cblx0XHQgKiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJtYXhcIi4gVGhpcyBhdHRyaWJ1dGUgaGFzIG5vIGVmZmVjdCBmb3Igbm9kZXMgd2l0aCBubyBpbnB1dHMuXG5cdFx0ICogIEBtZW1iZXJvZiBUb25lLkF1ZGlvTm9kZSNcblx0XHQgKiAgQHR5cGUge1N0cmluZ31cblx0XHQgKiAgQG5hbWUgY2hhbm5lbENvdW50TW9kZVxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUsICdjaGFubmVsQ291bnRNb2RlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXQuY2hhbm5lbENvdW50TW9kZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG0pIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMub3V0cHV0LmNoYW5uZWxDb3VudE1vZGUgPSBtO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIGNoYW5uZWxJbnRlcnByZXRhdGlvbiBkZXRlcm1pbmVzIGhvdyBpbmRpdmlkdWFsIGNoYW5uZWxzIHdpbGwgYmUgdHJlYXRlZFxuXHRcdCAqICB3aGVuIHVwLW1peGluZyBhbmQgZG93bi1taXhpbmcgY29ubmVjdGlvbnMgdG8gYW55IGlucHV0cyB0byB0aGUgbm9kZS5cblx0XHQgKiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCJzcGVha2Vyc1wiLlxuXHRcdCAqICBAbWVtYmVyb2YgVG9uZS5BdWRpb05vZGUjXG5cdFx0ICogIEB0eXBlIHtTdHJpbmd9XG5cdFx0ICogIEBuYW1lIGNoYW5uZWxJbnRlcnByZXRhdGlvblxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUsICdjaGFubmVsSW50ZXJwcmV0YXRpb24nLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLm91dHB1dC5jaGFubmVsSW50ZXJwcmV0YXRpb247XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLm91dHB1dC5jaGFubmVsSW50ZXJwcmV0YXRpb24gPSBpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBudW1iZXIgb2YgaW5wdXRzIGZlZWRpbmcgaW50byB0aGUgQXVkaW9Ob2RlLlxuXHRcdCAqICBGb3Igc291cmNlIG5vZGVzLCB0aGlzIHdpbGwgYmUgMC5cblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG5hbWUgbnVtYmVyT2ZJbnB1dHNcblx0XHQgKiAgQG1lbWJlcm9mIFRvbmUuQXVkaW9Ob2RlI1xuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUsICdudW1iZXJPZklucHV0cycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXQpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChUb25lLmlzQXJyYXkodGhpcy5pbnB1dCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC5sZW5ndGg7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgbnVtYmVyIG9mIG91dHB1dHMgY29taW5nIG91dCBvZiB0aGUgQXVkaW9Ob2RlLlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbmFtZSBudW1iZXJPZk91dHB1dHNcblx0XHQgKiAgQG1lbWJlcm9mIFRvbmUuQXVkaW9Ob2RlI1xuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUsICdudW1iZXJPZk91dHB1dHMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm91dHB1dCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKFRvbmUuaXNBcnJheSh0aGlzLm91dHB1dCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXQubGVuZ3RoO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBDYWxsZWQgd2hlbiBhbiBhdWRpbyBwYXJhbSBjb25uZWN0cyB0byB0aGlzIG5vZGVcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLl9vbkNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGNvbm5lY3QgdGhlIG91dHB1dCBvZiBhIFRvbmVOb2RlIHRvIGFuIEF1ZGlvUGFyYW0sIEF1ZGlvTm9kZSwgb3IgVG9uZU5vZGVcblx0XHQgKiAgQHBhcmFtICB7VG9uZSB8IEF1ZGlvUGFyYW0gfCBBdWRpb05vZGV9IHVuaXRcblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IFtvdXRwdXROdW09MF0gb3B0aW9uYWxseSB3aGljaCBvdXRwdXQgdG8gY29ubmVjdCBmcm9tXG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyfSBbaW5wdXROdW09MF0gb3B0aW9uYWxseSB3aGljaCBpbnB1dCB0byBjb25uZWN0IHRvXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkF1ZGlvTm9kZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAodW5pdCwgb3V0cHV0TnVtLCBpbnB1dE51bSkge1xuXHQgICAgICAgIGlmICh1bml0Ll9vbkNvbm5lY3QpIHtcblx0ICAgICAgICAgICAgdW5pdC5fb25Db25uZWN0KHRoaXMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoVG9uZS5pc0FycmF5KHRoaXMub3V0cHV0KSkge1xuXHQgICAgICAgICAgICBvdXRwdXROdW0gPSBUb25lLmRlZmF1bHRBcmcob3V0cHV0TnVtLCAwKTtcblx0ICAgICAgICAgICAgdGhpcy5vdXRwdXRbb3V0cHV0TnVtXS5jb25uZWN0KHVuaXQsIDAsIGlucHV0TnVtKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLm91dHB1dC5jb25uZWN0KHVuaXQsIG91dHB1dE51bSwgaW5wdXROdW0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgZGlzY29ubmVjdCB0aGUgb3V0cHV0XG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfEF1ZGlvTm9kZX0gb3V0cHV0IEVpdGhlciB0aGUgb3V0cHV0IGluZGV4IHRvIGRpc2Nvbm5lY3Rcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIG91dHB1dCBpcyBhbiBhcnJheSwgb3IgdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgdG8gZGlzY29ubmVjdCBmcm9tLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5BdWRpb05vZGV9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKGRlc3RpbmF0aW9uLCBvdXRwdXROdW0sIGlucHV0TnVtKSB7XG5cdCAgICAgICAgaWYgKFRvbmUuaXNBcnJheSh0aGlzLm91dHB1dCkpIHtcblx0ICAgICAgICAgICAgaWYgKFRvbmUuaXNOdW1iZXIoZGVzdGluYXRpb24pKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm91dHB1dFtkZXN0aW5hdGlvbl0uZGlzY29ubmVjdCgpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgb3V0cHV0TnVtID0gVG9uZS5kZWZhdWx0QXJnKG91dHB1dE51bSwgMCk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLm91dHB1dFtvdXRwdXROdW1dLmRpc2Nvbm5lY3QoZGVzdGluYXRpb24sIDAsIGlucHV0TnVtKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMub3V0cHV0LmRpc2Nvbm5lY3QuYXBwbHkodGhpcy5vdXRwdXQsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDb25uZWN0IHRoZSBvdXRwdXQgb2YgdGhpcyBub2RlIHRvIHRoZSByZXN0IG9mIHRoZSBub2RlcyBpbiBzZXJpZXMuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogIC8vY29ubmVjdCBhIG5vZGUgdG8gYW4gZWZmZWN0LCBwYW5Wb2wgYW5kIHRoZW4gdG8gdGhlIG1hc3RlciBvdXRwdXRcblx0XHQgKiAgbm9kZS5jaGFpbihlZmZlY3QsIHBhblZvbCwgVG9uZS5NYXN0ZXIpO1xuXHRcdCAqICBAcGFyYW0gey4uLkF1ZGlvUGFyYW18VG9uZXxBdWRpb05vZGV9IG5vZGVzXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkF1ZGlvTm9kZX0gdGhpc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjdXJyZW50VW5pdCA9IHRoaXM7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIHRvVW5pdCA9IGFyZ3VtZW50c1tpXTtcblx0ICAgICAgICAgICAgY3VycmVudFVuaXQuY29ubmVjdCh0b1VuaXQpO1xuXHQgICAgICAgICAgICBjdXJyZW50VW5pdCA9IHRvVW5pdDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGNvbm5lY3QgdGhlIG91dHB1dCBvZiB0aGlzIG5vZGUgdG8gdGhlIHJlc3Qgb2YgdGhlIG5vZGVzIGluIHBhcmFsbGVsLlxuXHRcdCAqICBAcGFyYW0gey4uLkF1ZGlvUGFyYW18VG9uZXxBdWRpb05vZGV9IG5vZGVzXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkF1ZGlvTm9kZX0gdGhpc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmZhbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB0aGlzLmNvbm5lY3QoYXJndW1lbnRzW2ldKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgaWYgKHdpbmRvdy5BdWRpb05vZGUpIHtcblx0ICAgICAgICAvL2dpdmUgbmF0aXZlIG5vZGVzIGNoYWluIGFuZCBmYW4gbWV0aG9kc1xuXHQgICAgICAgIEF1ZGlvTm9kZS5wcm90b3R5cGUuY2hhaW4gPSBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuY2hhaW47XG5cdCAgICAgICAgQXVkaW9Ob2RlLnByb3RvdHlwZS5mYW4gPSBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZmFuO1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdFx0ICogRGlzcG9zZSBhbmQgZGlzY29ubmVjdFxuXHRcdCAqIEByZXR1cm4ge1RvbmUuQXVkaW9Ob2RlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQodGhpcy5pbnB1dCkpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXQgaW5zdGFuY2VvZiBBdWRpb05vZGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQodGhpcy5vdXRwdXQpKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLm91dHB1dCBpbnN0YW5jZW9mIEF1ZGlvTm9kZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5vdXRwdXQuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMub3V0cHV0ID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQXVkaW9Ob2RlO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIEJhc2UgY2xhc3MgZm9yIGFsbCBTaWduYWxzLiBVc2VkIEludGVybmFsbHkuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TaWduYWxCYXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5TaWduYWxCYXNlLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgV2hlbiBzaWduYWxzIGNvbm5lY3QgdG8gb3RoZXIgc2lnbmFscyBvciBBdWRpb1BhcmFtcyxcblx0XHQgKiAgdGhleSB0YWtlIG92ZXIgdGhlIG91dHB1dCB2YWx1ZSBvZiB0aGF0IHNpZ25hbCBvciBBdWRpb1BhcmFtLlxuXHRcdCAqICBGb3IgYWxsIG90aGVyIG5vZGVzLCB0aGUgYmVoYXZpb3IgaXMgdGhlIHNhbWUgYXMgYSBkZWZhdWx0IDxjb2RlPmNvbm5lY3Q8L2NvZGU+LlxuXHRcdCAqXG5cdFx0ICogIEBvdmVycmlkZVxuXHRcdCAqICBAcGFyYW0ge0F1ZGlvUGFyYW18QXVkaW9Ob2RlfFRvbmUuU2lnbmFsfFRvbmV9IG5vZGVcblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IFtvdXRwdXROdW1iZXI9MF0gVGhlIG91dHB1dCBudW1iZXIgdG8gY29ubmVjdCBmcm9tLlxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW2lucHV0TnVtYmVyPTBdIFRoZSBpbnB1dCBudW1iZXIgdG8gY29ubmVjdCB0by5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuU2lnbmFsQmFzZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKG5vZGUsIG91dHB1dE51bWJlciwgaW5wdXROdW1iZXIpIHtcblx0ICAgICAgICAvL3plcm8gaXQgb3V0IHNvIHRoYXQgdGhlIHNpZ25hbCBjYW4gaGF2ZSBmdWxsIGNvbnRyb2xcblx0ICAgICAgICBpZiAoVG9uZS5TaWduYWwgJiYgVG9uZS5TaWduYWwgPT09IG5vZGUuY29uc3RydWN0b3IgfHwgVG9uZS5QYXJhbSAmJiBUb25lLlBhcmFtID09PSBub2RlLmNvbnN0cnVjdG9yKSB7XG5cdCAgICAgICAgICAgIC8vY2FuY2VsIGNoYW5nZXNcblx0ICAgICAgICAgICAgbm9kZS5fcGFyYW0uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKDApO1xuXHQgICAgICAgICAgICAvL3Jlc2V0IHRoZSB2YWx1ZVxuXHQgICAgICAgICAgICBub2RlLl9wYXJhbS52YWx1ZSA9IDA7XG5cdCAgICAgICAgICAgIC8vbWFyayB0aGUgdmFsdWUgYXMgb3ZlcnJpZGRlblxuXHQgICAgICAgICAgICBub2RlLm92ZXJyaWRkZW4gPSB0cnVlO1xuXHQgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF1ZGlvUGFyYW0pIHtcblx0ICAgICAgICAgICAgbm9kZS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMCk7XG5cdCAgICAgICAgICAgIG5vZGUudmFsdWUgPSAwO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuY29ubmVjdC5jYWxsKHRoaXMsIG5vZGUsIG91dHB1dE51bWJlciwgaW5wdXROdW1iZXIpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlNpZ25hbEJhc2U7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIGlmIChUb25lLnN1cHBvcnRlZCkge1xuXHQgICAgICAgIC8vZml4ZXMgc2FmYXJpIG9ubHkgYnVnIHdoaWNoIGlzIHN0aWxsIHByZXNlbnQgaW4gMTFcblx0ICAgICAgICB2YXIgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG5cdCAgICAgICAgdmFyIGlzU2FmYXJpID0gdWEuaW5jbHVkZXMoJ3NhZmFyaScpICYmICF1YS5pbmNsdWRlcygnY2hyb21lJyk7XG5cdCAgICAgICAgaWYgKGlzU2FmYXJpKSB7XG5cdCAgICAgICAgICAgIHZhciBXYXZlU2hhcGVyTm9kZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcm5hbE5vZGUgPSB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSBjb250ZXh0Ll9uYXRpdmVfY3JlYXRlV2F2ZVNoYXBlcigpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fY3VydmUgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiB0aGlzLl9pbnRlcm5hbE5vZGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eSh0aGlzLl9pbnRlcm5hbE5vZGUsIHByb3ApO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2F2ZVNoYXBlck5vZGUucHJvdG90eXBlLCAnY3VydmUnLCB7XG5cdCAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VydmU7XG5cdCAgICAgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoY3VydmUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJ2ZSA9IGN1cnZlO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoY3VydmUubGVuZ3RoICsgMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgYXJyYXkuc2V0KGN1cnZlLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICBhcnJheVswXSA9IGN1cnZlWzBdO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVybmFsTm9kZS5jdXJ2ZSA9IGFycmF5O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgV2F2ZVNoYXBlck5vZGUucHJvdG90eXBlLl9kZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChjb250ZXh0LCBwcm9wKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVG9uZS5pc1VuZGVmKHRoaXNbcHJvcF0pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3AsIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRleHRbcHJvcF0gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dFtwcm9wXS5iaW5kKGNvbnRleHQpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dFtwcm9wXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0W3Byb3BdID0gdmFsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuX25hdGl2ZV9jcmVhdGVXYXZlU2hhcGVyID0gQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVXYXZlU2hhcGVyO1xuXHQgICAgICAgICAgICBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZVdhdmVTaGFwZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdhdmVTaGFwZXJOb2RlKHRoaXMpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFdyYXBzIHRoZSBuYXRpdmUgV2ViIEF1ZGlvIEFQSVxuXHRcdCAqICAgICAgICAgW1dhdmVTaGFwZXJOb2RlXShodHRwOi8vd2ViYXVkaW8uZ2l0aHViLmlvL3dlYi1hdWRpby1hcGkvI3RoZS13YXZlc2hhcGVybm9kZS1pbnRlcmZhY2UpLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlNpZ25hbEJhc2V9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge2Z1bmN0aW9ufEFycmF5fE51bWJlcn0gbWFwcGluZyBUaGUgZnVuY3Rpb24gdXNlZCB0byBkZWZpbmUgdGhlIHZhbHVlcy5cblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXBwaW5nIGZ1bmN0aW9uIHNob3VsZCB0YWtlIHR3byBhcmd1bWVudHM6XG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgaXMgdGhlIHZhbHVlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHNlY29uZCBpcyB0aGUgYXJyYXkgcG9zaXRpb24uXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoYXQgYXJyYXkgd2lsbCBiZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGFzIHRoZSB3YXZlIHNoYXBpbmcgZnVuY3Rpb24uIFRoZSBpbnB1dFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsIGlzIGFuIEF1ZGlvUmFuZ2UgWy0xLCAxXSB2YWx1ZSBhbmQgdGhlIG91dHB1dFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsIGNhbiB0YWtlIG9uIGFueSBudW1lcmljYWwgdmFsdWVzLlxuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBbYnVmZmVyTGVuPTEwMjRdIFRoZSBsZW5ndGggb2YgdGhlIFdhdmVTaGFwZXJOb2RlIGJ1ZmZlci5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgdGltZXNUd28gPSBuZXcgVG9uZS5XYXZlU2hhcGVyKGZ1bmN0aW9uKHZhbCl7XG5cdFx0ICogXHRyZXR1cm4gdmFsICogMjtcblx0XHQgKiB9LCAyMDQ4KTtcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2Egd2F2ZXNoYXBlciBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCB3aXRoIGFuIGFycmF5IG9mIHZhbHVlc1xuXHRcdCAqIHZhciBpbnZlcnQgPSBuZXcgVG9uZS5XYXZlU2hhcGVyKFsxLCAtMV0pO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5XYXZlU2hhcGVyID0gZnVuY3Rpb24gKG1hcHBpbmcsIGJ1ZmZlckxlbikge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSB3YXZlc2hhcGVyXG5cdFx0XHQgKiAgQHR5cGUge1dhdmVTaGFwZXJOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zaGFwZXIgPSB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSB0aGlzLmNvbnRleHQuY3JlYXRlV2F2ZVNoYXBlcigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSB3YXZlc2hhcGVycyBjdXJ2ZVxuXHRcdFx0ICogIEB0eXBlIHtGbG9hdDMyQXJyYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2N1cnZlID0gbnVsbDtcblx0ICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtYXBwaW5nKSkge1xuXHQgICAgICAgICAgICB0aGlzLmN1cnZlID0gbWFwcGluZztcblx0ICAgICAgICB9IGVsc2UgaWYgKGlzRmluaXRlKG1hcHBpbmcpIHx8IFRvbmUuaXNVbmRlZihtYXBwaW5nKSkge1xuXHQgICAgICAgICAgICB0aGlzLl9jdXJ2ZSA9IG5ldyBGbG9hdDMyQXJyYXkoVG9uZS5kZWZhdWx0QXJnKG1hcHBpbmcsIDEwMjQpKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKFRvbmUuaXNGdW5jdGlvbihtYXBwaW5nKSkge1xuXHQgICAgICAgICAgICB0aGlzLl9jdXJ2ZSA9IG5ldyBGbG9hdDMyQXJyYXkoVG9uZS5kZWZhdWx0QXJnKGJ1ZmZlckxlbiwgMTAyNCkpO1xuXHQgICAgICAgICAgICB0aGlzLnNldE1hcChtYXBwaW5nKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5XYXZlU2hhcGVyLCBUb25lLlNpZ25hbEJhc2UpO1xuXHQgICAgLyoqXG5cdFx0ICogIFVzZXMgYSBtYXBwaW5nIGZ1bmN0aW9uIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIGN1cnZlLlxuXHRcdCAqICBAcGFyYW0ge2Z1bmN0aW9ufSBtYXBwaW5nIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgdmFsdWVzLlxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXBwaW5nIGZ1bmN0aW9uIHRha2UgdHdvIGFyZ3VtZW50czpcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgaXMgdGhlIHZhbHVlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggZ29lcyBmcm9tIC0xIHRvIDEgb3ZlciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGN1cnZlIGFycmF5LiBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBhcnJheSBwb3NpdGlvbi5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuV2F2ZVNoYXBlcn0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vbWFwIHRoZSBpbnB1dCBzaWduYWwgZnJvbSBbLTEsIDFdIHRvIFswLCAxMF1cblx0XHQgKiBzaGFwZXIuc2V0TWFwKGZ1bmN0aW9uKHZhbCwgaW5kZXgpe1xuXHRcdCAqIFx0cmV0dXJuICh2YWwgKyAxKSAqIDU7XG5cdFx0ICogfSlcblx0XHQgKi9cblx0ICAgIFRvbmUuV2F2ZVNoYXBlci5wcm90b3R5cGUuc2V0TWFwID0gZnVuY3Rpb24gKG1hcHBpbmcpIHtcblx0ICAgICAgICB2YXIgYXJyYXkgPSBuZXcgQXJyYXkodGhpcy5fY3VydmUubGVuZ3RoKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5fY3VydmUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWQgPSBpIC8gKGxlbiAtIDEpICogMiAtIDE7XG5cdCAgICAgICAgICAgIGFycmF5W2ldID0gbWFwcGluZyhub3JtYWxpemVkLCBpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5jdXJ2ZSA9IGFycmF5O1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBhcnJheSB0byBzZXQgYXMgdGhlIHdhdmVzaGFwZXIgY3VydmUuIEZvciBsaW5lYXIgY3VydmVzXG5cdFx0ICogYXJyYXkgbGVuZ3RoIGRvZXMgbm90IG1ha2UgbXVjaCBkaWZmZXJlbmNlLCBidXQgZm9yIGNvbXBsZXggY3VydmVzXG5cdFx0ICogbG9uZ2VyIGFycmF5cyB3aWxsIHByb3ZpZGUgc21vb3RoZXIgaW50ZXJwb2xhdGlvbi5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5XYXZlU2hhcGVyI1xuXHRcdCAqIEB0eXBlIHtBcnJheX1cblx0XHQgKiBAbmFtZSBjdXJ2ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuV2F2ZVNoYXBlci5wcm90b3R5cGUsICdjdXJ2ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NoYXBlci5jdXJ2ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG1hcHBpbmcpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY3VydmUgPSBuZXcgRmxvYXQzMkFycmF5KG1hcHBpbmcpO1xuXHQgICAgICAgICAgICB0aGlzLl9zaGFwZXIuY3VydmUgPSB0aGlzLl9jdXJ2ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFNwZWNpZmllcyB3aGF0IHR5cGUgb2Ygb3ZlcnNhbXBsaW5nIChpZiBhbnkpIHNob3VsZCBiZSB1c2VkIHdoZW5cblx0XHQgKiBhcHBseWluZyB0aGUgc2hhcGluZyBjdXJ2ZS4gQ2FuIGVpdGhlciBiZSBcIm5vbmVcIiwgXCIyeFwiIG9yIFwiNHhcIi5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5XYXZlU2hhcGVyI1xuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICogQG5hbWUgb3ZlcnNhbXBsZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuV2F2ZVNoYXBlci5wcm90b3R5cGUsICdvdmVyc2FtcGxlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2hhcGVyLm92ZXJzYW1wbGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChvdmVyc2FtcGxpbmcpIHtcblx0ICAgICAgICAgICAgaWYgKFtcblx0ICAgICAgICAgICAgICAgICAgICAnbm9uZScsXG5cdCAgICAgICAgICAgICAgICAgICAgJzJ4Jyxcblx0ICAgICAgICAgICAgICAgICAgICAnNHgnXG5cdCAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKG92ZXJzYW1wbGluZykpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3NoYXBlci5vdmVyc2FtcGxlID0gb3ZlcnNhbXBsaW5nO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RvbmUuV2F2ZVNoYXBlcjogb3ZlcnNhbXBsaW5nIG11c3QgYmUgZWl0aGVyIFxcJ25vbmVcXCcsIFxcJzJ4XFwnLCBvciBcXCc0eFxcJycpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLldhdmVTaGFwZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuV2F2ZVNoYXBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9zaGFwZXIuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX3NoYXBlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fY3VydmUgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLldhdmVTaGFwZXI7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5UaW1lQmFzZSBpcyBhIGZsZXhpYmxlIGVuY29kaW5nIG9mIHRpbWVcblx0XHQgKiAgICAgICAgIHdoaWNoIGNhbiBiZSBldmFsdWF0ZWQgdG8gYW5kIGZyb20gYSBzdHJpbmcuXG5cdFx0ICogIEBleHRlbmRzIHtUb25lfVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSAgdmFsICAgIFRoZSB0aW1lIHZhbHVlIGFzIGEgbnVtYmVyIG9yIHN0cmluZ1xuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmc9fSAgdW5pdHMgIFVuaXQgdmFsdWVzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogVG9uZS5UaW1lQmFzZSg0LCBcIm5cIilcblx0XHQgKiBUb25lLlRpbWVCYXNlKDIsIFwidFwiKVxuXHRcdCAqIFRvbmUuVGltZUJhc2UoXCIydFwiKVxuXHRcdCAqIFRvbmUuVGltZUJhc2UoXCIydFwiKSArIFRvbmUuVGltZUJhc2UoXCI0blwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UgPSBmdW5jdGlvbiAodmFsLCB1bml0cykge1xuXHQgICAgICAgIC8vYWxsb3dzIGl0IHRvIGJlIGNvbnN0cnVjdGVkIHdpdGggb3Igd2l0aG91dCAnbmV3J1xuXHQgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgVG9uZS5UaW1lQmFzZSkge1xuXHQgICAgICAgICAgICAvKipcblx0XHRcdFx0ICogIFRoZSB2YWx1ZVxuXHRcdFx0XHQgKiAgQHR5cGUgIHtOdW1iZXJ8U3RyaW5nfFRvbmUuVGltZUJhc2V9XG5cdFx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy5fdmFsID0gdmFsO1xuXHQgICAgICAgICAgICAvKipcblx0XHRcdFx0ICogVGhlIHVuaXRzXG5cdFx0XHRcdCAqIEB0eXBlIHtTdHJpbmc/fVxuXHRcdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy5fdW5pdHMgPSB1bml0cztcblx0ICAgICAgICAgICAgLy90ZXN0IGlmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG51bWJlclxuXHQgICAgICAgICAgICBpZiAoVG9uZS5pc1VuZGVmKHRoaXMuX3VuaXRzKSAmJiBUb25lLmlzU3RyaW5nKHRoaXMuX3ZhbCkgJiYgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHQgICAgICAgICAgICAgICAgcGFyc2VGbG9hdCh0aGlzLl92YWwpID09IHRoaXMuX3ZhbCAmJiB0aGlzLl92YWwuY2hhckF0KDApICE9PSAnKycpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3ZhbCA9IHBhcnNlRmxvYXQodGhpcy5fdmFsKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3VuaXRzID0gdGhpcy5fZGVmYXVsdFVuaXRzO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbCAmJiB2YWwuY29uc3RydWN0b3IgPT09IHRoaXMuY29uc3RydWN0b3IpIHtcblx0ICAgICAgICAgICAgICAgIC8vaWYgdGhleSdyZSB0aGUgc2FtZSB0eXBlLCBqdXN0IGNvcHkgdmFsdWVzIG92ZXJcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3ZhbCA9IHZhbC5fdmFsO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fdW5pdHMgPSB2YWwuX3VuaXRzO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFRvbmUuVGltZUJhc2UpIHtcblx0ICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fZGVmYXVsdFVuaXRzKSB7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdzJzpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWwgPSB2YWwudG9TZWNvbmRzKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlICdpJzpcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWwgPSB2YWwudG9UaWNrcygpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnaHonOlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbCA9IHZhbC50b0ZyZXF1ZW5jeSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgY2FzZSAnbWlkaSc6XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsID0gdmFsLnRvTWlkaSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VucmVjb2duaXplZCBkZWZhdWx0IHVuaXRzICcgKyB0aGlzLl9kZWZhdWx0VW5pdHMpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb25lLlRpbWVCYXNlKHZhbCwgdW5pdHMpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlRpbWVCYXNlKTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdEFCU1RSQUNUIFNZTlRBWCBUUkVFIFBBUlNFUlxuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgQWxsIHRoZSBwcmltYXJ5IGV4cHJlc3Npb25zLlxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqICBAdHlwZSAge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UucHJvdG90eXBlLl9leHByZXNzaW9ucyA9IHtcblx0ICAgICAgICAnbic6IHtcblx0ICAgICAgICAgICAgcmVnZXhwOiAvXihcXGQrKW4oXFwuPykkL2ksXG5cdCAgICAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKHZhbHVlLCBkb3QpIHtcblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHNjYWxhciA9IGRvdCA9PT0gJy4nID8gMS41IDogMTtcblx0ICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iZWF0c1RvVW5pdHModGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpKSAqIHNjYWxhcjtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JlYXRzVG9Vbml0cyg0IC8gdmFsdWUpICogc2NhbGFyO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAndCc6IHtcblx0ICAgICAgICAgICAgcmVnZXhwOiAvXihcXGQrKXQkL2ksXG5cdCAgICAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iZWF0c1RvVW5pdHMoOCAvIChwYXJzZUludCh2YWx1ZSkgKiAzKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgICdtJzoge1xuXHQgICAgICAgICAgICByZWdleHA6IC9eKFxcZCspbSQvaSxcblx0ICAgICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iZWF0c1RvVW5pdHMocGFyc2VJbnQodmFsdWUpICogdGhpcy5fZ2V0VGltZVNpZ25hdHVyZSgpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgJ2knOiB7XG5cdCAgICAgICAgICAgIHJlZ2V4cDogL14oXFxkKylpJC9pLFxuXHQgICAgICAgICAgICBtZXRob2Q6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpY2tzVG9Vbml0cyhwYXJzZUludCh2YWx1ZSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAnaHonOiB7XG5cdCAgICAgICAgICAgIHJlZ2V4cDogL14oXFxkKyg/OlxcLlxcZCspPyloeiQvaSxcblx0ICAgICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3lUb1VuaXRzKHBhcnNlRmxvYXQodmFsdWUpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgJ3RyJzoge1xuXHQgICAgICAgICAgICByZWdleHA6IC9eKFxcZCsoPzpcXC5cXGQrKT8pOihcXGQrKD86XFwuXFxkKyk/KTo/KFxcZCsoPzpcXC5cXGQrKT8pPyQvLFxuXHQgICAgICAgICAgICBtZXRob2Q6IGZ1bmN0aW9uIChtLCBxLCBzKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgdG90YWwgPSAwO1xuXHQgICAgICAgICAgICAgICAgaWYgKG0gJiYgbSAhPT0gJzAnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdGhpcy5fYmVhdHNUb1VuaXRzKHRoaXMuX2dldFRpbWVTaWduYXR1cmUoKSAqIHBhcnNlRmxvYXQobSkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHEgJiYgcSAhPT0gJzAnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdGhpcy5fYmVhdHNUb1VuaXRzKHBhcnNlRmxvYXQocSkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHMgJiYgcyAhPT0gJzAnKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdGhpcy5fYmVhdHNUb1VuaXRzKHBhcnNlRmxvYXQocykgLyA0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgJ3MnOiB7XG5cdCAgICAgICAgICAgIHJlZ2V4cDogL14oXFxkKyg/OlxcLlxcZCspPylzJC8sXG5cdCAgICAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2Vjb25kc1RvVW5pdHMocGFyc2VGbG9hdCh2YWx1ZSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAnc2FtcGxlcyc6IHtcblx0ICAgICAgICAgICAgcmVnZXhwOiAvXihcXGQrKXNhbXBsZXMkLyxcblx0ICAgICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSkgLyB0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgJ2RlZmF1bHQnOiB7XG5cdCAgICAgICAgICAgIHJlZ2V4cDogL14oXFxkKyg/OlxcLlxcZCspPykkLyxcblx0ICAgICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHByZXNzaW9uc1t0aGlzLl9kZWZhdWx0VW5pdHNdLm1ldGhvZC5jYWxsKHRoaXMsIHZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGRlZmF1bHQgdW5pdHMgaWYgbm9uZSBhcmUgZ2l2ZW4uXG5cdFx0ICogIEB0eXBlIHtTdHJpbmd9XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWVCYXNlLnByb3RvdHlwZS5fZGVmYXVsdFVuaXRzID0gJ3MnO1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0VFJBTlNQT1JUIEZBTExCQUNLU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiBSZXR1cm4gdGhlIGJwbSwgb3IgMTIwIGlmIFRyYW5zcG9ydCBpcyBub3QgYXZhaWxhYmxlXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUuX2dldEJwbSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoVG9uZS5UcmFuc3BvcnQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVHJhbnNwb3J0LmJwbS52YWx1ZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gMTIwO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBSZXR1cm4gdGhlIHRpbWVTaWduYXR1cmUgb3IgNCBpZiBUcmFuc3BvcnQgaXMgbm90IGF2YWlsYWJsZVxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UucHJvdG90eXBlLl9nZXRUaW1lU2lnbmF0dXJlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmIChUb25lLlRyYW5zcG9ydCkge1xuXHQgICAgICAgICAgICByZXR1cm4gVG9uZS5UcmFuc3BvcnQudGltZVNpZ25hdHVyZTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gNDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogUmV0dXJuIHRoZSBQUFEgb3IgMTkyIGlmIFRyYW5zcG9ydCBpcyBub3QgYXZhaWxhYmxlXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUuX2dldFBQUSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoVG9uZS5UcmFuc3BvcnQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVHJhbnNwb3J0LlBQUTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gMTkyO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBpbiB3aGljaGV2ZXIgY29udGV4dCBpcyByZWxldmFudFxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UucHJvdG90eXBlLl9ub3cgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMubm93KCk7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0VU5JVCBDT05WRVJTSU9OU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBmcmVxdWVuY3kgaW4gdGhlIGN1cnJlbnQgdW5pdHNcblx0XHQgKiAgQHBhcmFtIHtGcmVxdWVuY3l9IGZyZXFcblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UucHJvdG90eXBlLl9mcmVxdWVuY3lUb1VuaXRzID0gZnVuY3Rpb24gKGZyZXEpIHtcblx0ICAgICAgICByZXR1cm4gMSAvIGZyZXE7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGJlYXRzIGluIHRoZSBjdXJyZW50IHVuaXRzXG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBiZWF0c1xuXHRcdCAqICBAcmV0dXJuICB7TnVtYmVyfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUuX2JlYXRzVG9Vbml0cyA9IGZ1bmN0aW9uIChiZWF0cykge1xuXHQgICAgICAgIHJldHVybiA2MCAvIHRoaXMuX2dldEJwbSgpICogYmVhdHM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgc2Vjb25kIGluIHRoZSBjdXJyZW50IHVuaXRzXG5cdFx0ICogIEBwYXJhbSB7U2Vjb25kc30gc2Vjb25kc1xuXHRcdCAqICBAcmV0dXJuICB7TnVtYmVyfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUuX3NlY29uZHNUb1VuaXRzID0gZnVuY3Rpb24gKHNlY29uZHMpIHtcblx0ICAgICAgICByZXR1cm4gc2Vjb25kcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYSB0aWNrIGluIHRoZSBjdXJyZW50IHRpbWUgdW5pdHNcblx0XHQgKiAgQHBhcmFtIHtUaWNrc30gdGlja3Ncblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UucHJvdG90eXBlLl90aWNrc1RvVW5pdHMgPSBmdW5jdGlvbiAodGlja3MpIHtcblx0ICAgICAgICByZXR1cm4gdGlja3MgKiAodGhpcy5fYmVhdHNUb1VuaXRzKDEpIC8gdGhpcy5fZ2V0UFBRKCkpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFdpdGggbm8gYXJndW1lbnRzLCByZXR1cm4gJ25vdydcblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UucHJvdG90eXBlLl9ub0FyZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fbm93KCk7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0RVhQUkVTU0lPTlNcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLyoqXG5cdFx0ICogIEV2YWx1YXRlIHRoZSB0aW1lIHZhbHVlLiBSZXR1cm5zIHRoZSB0aW1lXG5cdFx0ICogIGluIHNlY29uZHMuXG5cdFx0ICogIEByZXR1cm4gIHtTZWNvbmRzfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUudmFsdWVPZiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc1VuZGVmKHRoaXMuX3ZhbCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vQXJnKCk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChUb25lLmlzU3RyaW5nKHRoaXMuX3ZhbCkgJiYgVG9uZS5pc1VuZGVmKHRoaXMuX3VuaXRzKSkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciB1bml0cyBpbiB0aGlzLl9leHByZXNzaW9ucykge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2V4cHJlc3Npb25zW3VuaXRzXS5yZWdleHAudGVzdCh0aGlzLl92YWwudHJpbSgpKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VuaXRzID0gdW5pdHM7XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKFRvbmUuaXNEZWZpbmVkKHRoaXMuX3VuaXRzKSkge1xuXHQgICAgICAgICAgICB2YXIgZXhwciA9IHRoaXMuX2V4cHJlc3Npb25zW3RoaXMuX3VuaXRzXTtcblx0ICAgICAgICAgICAgdmFyIG1hdGNoaW5nID0gdGhpcy5fdmFsLnRvU3RyaW5nKCkudHJpbSgpLm1hdGNoKGV4cHIucmVnZXhwKTtcblx0ICAgICAgICAgICAgaWYgKG1hdGNoaW5nKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZXhwci5tZXRob2QuYXBwbHkodGhpcywgbWF0Y2hpbmcuc2xpY2UoMSkpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHIubWV0aG9kLmNhbGwodGhpcywgcGFyc2VGbG9hdCh0aGlzLl92YWwpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIHZhbHVlIGluIHNlY29uZHNcblx0XHQgKiAgQHJldHVybiB7U2Vjb25kc31cblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UucHJvdG90eXBlLnRvU2Vjb25kcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgdmFsdWUgaW4gaGVydHpcblx0XHQgKiAgQHJldHVybiB7RnJlcXVlbmN5fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUudG9GcmVxdWVuY3kgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIDEgLyB0aGlzLnRvU2Vjb25kcygpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIHRpbWUgaW4gc2FtcGxlc1xuXHRcdCAqICBAcmV0dXJuICB7U2FtcGxlc31cblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZUJhc2UucHJvdG90eXBlLnRvU2FtcGxlcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy50b1NlY29uZHMoKSAqIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxuXHRcdCAqICBAcmV0dXJuICB7TWlsbGlzZWNvbmRzfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUudG9NaWxsaXNlY29uZHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudG9TZWNvbmRzKCkgKiAxMDAwO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJuIHtUb25lLlRpbWVCYXNlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWVCYXNlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX3ZhbCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fdW5pdHMgPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlRpbWVCYXNlO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuRnJlcXVlbmN5IGlzIGEgcHJpbWl0aXZlIHR5cGUgZm9yIGVuY29kaW5nIEZyZXF1ZW5jeSB2YWx1ZXMuXG5cdFx0ICogICAgICAgICBFdmVudHVhbGx5IGFsbCB0aW1lIHZhbHVlcyBhcmUgZXZhbHVhdGVkIHRvIGhlcnR6XG5cdFx0ICogICAgICAgICB1c2luZyB0aGUgYGV2YWxgIG1ldGhvZC5cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlRpbWVCYXNlfVxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmd8TnVtYmVyfSAgdmFsICAgIFRoZSB0aW1lIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmc9fSAgdW5pdHMgIFRoZSB1bml0cyBvZiB0aGUgdmFsdWUuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogVG9uZS5GcmVxdWVuY3koXCJDM1wiKSAvLyAyNjFcblx0XHQgKiBUb25lLkZyZXF1ZW5jeSgzOCwgXCJtaWRpXCIpIC8vXG5cdFx0ICogVG9uZS5GcmVxdWVuY3koXCJDM1wiKS50cmFuc3Bvc2UoNCk7XG5cdFx0ICovXG5cdCAgICBUb25lLkZyZXF1ZW5jeSA9IGZ1bmN0aW9uICh2YWwsIHVuaXRzKSB7XG5cdCAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBUb25lLkZyZXF1ZW5jeSkge1xuXHQgICAgICAgICAgICBUb25lLlRpbWVCYXNlLmNhbGwodGhpcywgdmFsLCB1bml0cyk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb25lLkZyZXF1ZW5jeSh2YWwsIHVuaXRzKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5GcmVxdWVuY3ksIFRvbmUuVGltZUJhc2UpO1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0QVVHTUVOVCBCQVNFIEVYUFJFU1NJT05TXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIFRvbmUuRnJlcXVlbmN5LnByb3RvdHlwZS5fZXhwcmVzc2lvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBUb25lLlRpbWVCYXNlLnByb3RvdHlwZS5fZXhwcmVzc2lvbnMsIHtcblx0ICAgICAgICAnbWlkaSc6IHtcblx0ICAgICAgICAgICAgcmVnZXhwOiAvXihcXGQrKD86XFwuXFxkKyk/bWlkaSkvLFxuXHQgICAgICAgICAgICBtZXRob2Q6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlZmF1bHRVbml0cyA9PT0gJ21pZGknKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9uZS5GcmVxdWVuY3kubXRvZih2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgICdub3RlJzoge1xuXHQgICAgICAgICAgICByZWdleHA6IC9eKFthLWddezF9KD86YnwjfHh8YmIpPykoLT9bMC05XSspL2ksXG5cdCAgICAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKHBpdGNoLCBvY3RhdmUpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IG5vdGVUb1NjYWxlSW5kZXhbcGl0Y2gudG9Mb3dlckNhc2UoKV07XG5cdCAgICAgICAgICAgICAgICB2YXIgbm90ZU51bWJlciA9IGluZGV4ICsgKHBhcnNlSW50KG9jdGF2ZSkgKyAxKSAqIDEyO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlZmF1bHRVbml0cyA9PT0gJ21pZGknKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdGVOdW1iZXI7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBUb25lLkZyZXF1ZW5jeS5tdG9mKG5vdGVOdW1iZXIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAndHInOiB7XG5cdCAgICAgICAgICAgIHJlZ2V4cDogL14oXFxkKyg/OlxcLlxcZCspPyk6KFxcZCsoPzpcXC5cXGQrKT8pOj8oXFxkKyg/OlxcLlxcZCspPyk/Lyxcblx0ICAgICAgICAgICAgbWV0aG9kOiBmdW5jdGlvbiAobSwgcSwgcykge1xuXHQgICAgICAgICAgICAgICAgdmFyIHRvdGFsID0gMTtcblx0ICAgICAgICAgICAgICAgIGlmIChtICYmIG0gIT09ICcwJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRvdGFsICo9IHRoaXMuX2JlYXRzVG9Vbml0cyh0aGlzLl9nZXRUaW1lU2lnbmF0dXJlKCkgKiBwYXJzZUZsb2F0KG0pKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChxICYmIHEgIT09ICcwJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRvdGFsICo9IHRoaXMuX2JlYXRzVG9Vbml0cyhwYXJzZUZsb2F0KHEpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChzICYmIHMgIT09ICcwJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRvdGFsICo9IHRoaXMuX2JlYXRzVG9Vbml0cyhwYXJzZUZsb2F0KHMpIC8gNCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdG90YWw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdEVYUFJFU1NJT05TXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8qKlxuXHRcdCAqICBUcmFuc3Bvc2VzIHRoZSBmcmVxdWVuY3kgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBzZW1pdG9uZXMuXG5cdFx0ICogIEBwYXJhbSAge0ludGVydmFsfSAgaW50ZXJ2YWxcblx0XHQgKiAgQHJldHVybiAge1RvbmUuRnJlcXVlbmN5fSBBIG5ldyB0cmFuc3Bvc2VkIGZyZXF1ZW5jeVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIFRvbmUuRnJlcXVlbmN5KFwiQTRcIikudHJhbnNwb3NlKDMpOyAvL1wiQzVcIlxuXHRcdCAqL1xuXHQgICAgVG9uZS5GcmVxdWVuY3kucHJvdG90eXBlLnRyYW5zcG9zZSA9IGZ1bmN0aW9uIChpbnRlcnZhbCkge1xuXHQgICAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnZhbHVlT2YoKSAqIFRvbmUuaW50ZXJ2YWxUb0ZyZXF1ZW5jeVJhdGlvKGludGVydmFsKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRha2VzIGFuIGFycmF5IG9mIHNlbWl0b25lIGludGVydmFscyBhbmQgcmV0dXJuc1xuXHRcdCAqICBhbiBhcnJheSBvZiBmcmVxdWVuY2llcyB0cmFuc3Bvc2VkIGJ5IHRob3NlIGludGVydmFscy5cblx0XHQgKiAgQHBhcmFtICB7QXJyYXl9ICBpbnRlcnZhbHNcblx0XHQgKiAgQHJldHVybiAge0FycmF5PFRvbmUuRnJlcXVlbmN5Pn0gUmV0dXJucyBhbiBhcnJheSBvZiBGcmVxdWVuY2llc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIFRvbmUuRnJlcXVlbmN5KFwiQTRcIikuaGFybW9uaXplKFswLCAzLCA3XSk7IC8vW1wiQTRcIiwgXCJDNVwiLCBcIkU1XCJdXG5cdFx0ICovXG5cdCAgICBUb25lLkZyZXF1ZW5jeS5wcm90b3R5cGUuaGFybW9uaXplID0gZnVuY3Rpb24gKGludGVydmFscykge1xuXHQgICAgICAgIHJldHVybiBpbnRlcnZhbHMubWFwKGZ1bmN0aW9uIChpbnRlcnZhbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc3Bvc2UoaW50ZXJ2YWwpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0VU5JVCBDT05WRVJTSU9OU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZnJlcXVlbmN5IGFzIGEgTUlESSBub3RlXG5cdFx0ICogIEByZXR1cm4gIHtNSURJfVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIFRvbmUuRnJlcXVlbmN5KFwiQzRcIikudG9NaWRpKCk7IC8vNjBcblx0XHQgKi9cblx0ICAgIFRvbmUuRnJlcXVlbmN5LnByb3RvdHlwZS50b01pZGkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIFRvbmUuRnJlcXVlbmN5LmZ0b20odGhpcy52YWx1ZU9mKCkpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmcmVxdWVuY3kgaW4gU2NpZW50aWZpYyBQaXRjaCBOb3RhdGlvblxuXHRcdCAqICBAcmV0dXJuICB7Tm90ZX1cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBUb25lLkZyZXF1ZW5jeSg2OSwgXCJtaWRpXCIpLnRvTm90ZSgpOyAvL1wiQTRcIlxuXHRcdCAqL1xuXHQgICAgVG9uZS5GcmVxdWVuY3kucHJvdG90eXBlLnRvTm90ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgZnJlcSA9IHRoaXMudG9GcmVxdWVuY3koKTtcblx0ICAgICAgICB2YXIgbG9nID0gTWF0aC5sb2cyKGZyZXEgLyBUb25lLkZyZXF1ZW5jeS5BNCk7XG5cdCAgICAgICAgdmFyIG5vdGVOdW1iZXIgPSBNYXRoLnJvdW5kKDEyICogbG9nKSArIDU3O1xuXHQgICAgICAgIHZhciBvY3RhdmUgPSBNYXRoLmZsb29yKG5vdGVOdW1iZXIgLyAxMik7XG5cdCAgICAgICAgaWYgKG9jdGF2ZSA8IDApIHtcblx0ICAgICAgICAgICAgbm90ZU51bWJlciArPSAtMTIgKiBvY3RhdmU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBub3RlTmFtZSA9IHNjYWxlSW5kZXhUb05vdGVbbm90ZU51bWJlciAlIDEyXTtcblx0ICAgICAgICByZXR1cm4gbm90ZU5hbWUgKyBvY3RhdmUudG9TdHJpbmcoKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSBkdXJhdGlvbiBvZiBvbmUgY3ljbGUgaW4gc2Vjb25kcy5cblx0XHQgKiAgQHJldHVybiAge1NlY29uZHN9XG5cdFx0ICovXG5cdCAgICBUb25lLkZyZXF1ZW5jeS5wcm90b3R5cGUudG9TZWNvbmRzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiAxIC8gVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUudG9TZWNvbmRzLmNhbGwodGhpcyk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgdmFsdWUgaW4gSGVydHpcblx0XHQgKiAgQHJldHVybiAge0ZyZXF1ZW5jeX1cblx0XHQgKi9cblx0ICAgIFRvbmUuRnJlcXVlbmN5LnByb3RvdHlwZS50b0ZyZXF1ZW5jeSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUudG9GcmVxdWVuY3kuY2FsbCh0aGlzKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSBkdXJhdGlvbiBvZiBvbmUgY3ljbGUgaW4gdGlja3Ncblx0XHQgKiAgQHJldHVybiAge1RpY2tzfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5GcmVxdWVuY3kucHJvdG90eXBlLnRvVGlja3MgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHF1YXJ0ZXJUaW1lID0gdGhpcy5fYmVhdHNUb1VuaXRzKDEpO1xuXHQgICAgICAgIHZhciBxdWFydGVycyA9IHRoaXMudmFsdWVPZigpIC8gcXVhcnRlclRpbWU7XG5cdCAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IocXVhcnRlcnMgKiBUb25lLlRyYW5zcG9ydC5QUFEpO1xuXHQgICAgfTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdFVOSVQgQ09OVkVSU0lPTlMgSEVMUEVSU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgV2l0aCBubyBhcmd1bWVudHMsIHJldHVybiAwXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkZyZXF1ZW5jeS5wcm90b3R5cGUuX25vQXJnID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiAwO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGZyZXF1ZW5jeSBpbiB0aGUgY3VycmVudCB1bml0c1xuXHRcdCAqICBAcGFyYW0ge0ZyZXF1ZW5jeX0gZnJlcVxuXHRcdCAqICBAcmV0dXJuICB7TnVtYmVyfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5GcmVxdWVuY3kucHJvdG90eXBlLl9mcmVxdWVuY3lUb1VuaXRzID0gZnVuY3Rpb24gKGZyZXEpIHtcblx0ICAgICAgICByZXR1cm4gZnJlcTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYSB0aWNrIGluIHRoZSBjdXJyZW50IHRpbWUgdW5pdHNcblx0XHQgKiAgQHBhcmFtIHtUaWNrc30gdGlja3Ncblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuRnJlcXVlbmN5LnByb3RvdHlwZS5fdGlja3NUb1VuaXRzID0gZnVuY3Rpb24gKHRpY2tzKSB7XG5cdCAgICAgICAgcmV0dXJuIDEgLyAodGlja3MgKiA2MCAvIChUb25lLlRyYW5zcG9ydC5icG0udmFsdWUgKiBUb25lLlRyYW5zcG9ydC5QUFEpKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYmVhdHMgaW4gdGhlIGN1cnJlbnQgdW5pdHNcblx0XHQgKiAgQHBhcmFtIHtOdW1iZXJ9IGJlYXRzXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkZyZXF1ZW5jeS5wcm90b3R5cGUuX2JlYXRzVG9Vbml0cyA9IGZ1bmN0aW9uIChiZWF0cykge1xuXHQgICAgICAgIHJldHVybiAxIC8gVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUuX2JlYXRzVG9Vbml0cy5jYWxsKHRoaXMsIGJlYXRzKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBzZWNvbmQgaW4gdGhlIGN1cnJlbnQgdW5pdHNcblx0XHQgKiAgQHBhcmFtIHtTZWNvbmRzfSBzZWNvbmRzXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkZyZXF1ZW5jeS5wcm90b3R5cGUuX3NlY29uZHNUb1VuaXRzID0gZnVuY3Rpb24gKHNlY29uZHMpIHtcblx0ICAgICAgICByZXR1cm4gMSAvIHNlY29uZHM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBkZWZhdWx0IHVuaXRzIGlmIG5vbmUgYXJlIGdpdmVuLlxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5GcmVxdWVuY3kucHJvdG90eXBlLl9kZWZhdWx0VW5pdHMgPSAnaHonO1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0RlJFUVVFTkNZIENPTlZFUlNJT05TXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8qKlxuXHRcdCAqICBOb3RlIHRvIHNjYWxlIGluZGV4XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgdmFyIG5vdGVUb1NjYWxlSW5kZXggPSB7XG5cdCAgICAgICAgJ2NiYic6IC0yLFxuXHQgICAgICAgICdjYic6IC0xLFxuXHQgICAgICAgICdjJzogMCxcblx0ICAgICAgICAnYyMnOiAxLFxuXHQgICAgICAgICdjeCc6IDIsXG5cdCAgICAgICAgJ2RiYic6IDAsXG5cdCAgICAgICAgJ2RiJzogMSxcblx0ICAgICAgICAnZCc6IDIsXG5cdCAgICAgICAgJ2QjJzogMyxcblx0ICAgICAgICAnZHgnOiA0LFxuXHQgICAgICAgICdlYmInOiAyLFxuXHQgICAgICAgICdlYic6IDMsXG5cdCAgICAgICAgJ2UnOiA0LFxuXHQgICAgICAgICdlIyc6IDUsXG5cdCAgICAgICAgJ2V4JzogNixcblx0ICAgICAgICAnZmJiJzogMyxcblx0ICAgICAgICAnZmInOiA0LFxuXHQgICAgICAgICdmJzogNSxcblx0ICAgICAgICAnZiMnOiA2LFxuXHQgICAgICAgICdmeCc6IDcsXG5cdCAgICAgICAgJ2diYic6IDUsXG5cdCAgICAgICAgJ2diJzogNixcblx0ICAgICAgICAnZyc6IDcsXG5cdCAgICAgICAgJ2cjJzogOCxcblx0ICAgICAgICAnZ3gnOiA5LFxuXHQgICAgICAgICdhYmInOiA3LFxuXHQgICAgICAgICdhYic6IDgsXG5cdCAgICAgICAgJ2EnOiA5LFxuXHQgICAgICAgICdhIyc6IDEwLFxuXHQgICAgICAgICdheCc6IDExLFxuXHQgICAgICAgICdiYmInOiA5LFxuXHQgICAgICAgICdiYic6IDEwLFxuXHQgICAgICAgICdiJzogMTEsXG5cdCAgICAgICAgJ2IjJzogMTIsXG5cdCAgICAgICAgJ2J4JzogMTNcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc2NhbGUgaW5kZXggdG8gbm90ZSAoc2hhcnBzKVxuXHRcdCAqICBAdHlwZSAge0FycmF5fVxuXHRcdCAqL1xuXHQgICAgdmFyIHNjYWxlSW5kZXhUb05vdGUgPSBbXG5cdCAgICAgICAgJ0MnLFxuXHQgICAgICAgICdDIycsXG5cdCAgICAgICAgJ0QnLFxuXHQgICAgICAgICdEIycsXG5cdCAgICAgICAgJ0UnLFxuXHQgICAgICAgICdGJyxcblx0ICAgICAgICAnRiMnLFxuXHQgICAgICAgICdHJyxcblx0ICAgICAgICAnRyMnLFxuXHQgICAgICAgICdBJyxcblx0ICAgICAgICAnQSMnLFxuXHQgICAgICAgICdCJ1xuXHQgICAgXTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgW2NvbmNlcnQgcGl0Y2hdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmNlcnRfcGl0Y2gpXG5cdFx0ICogIEE0J3MgdmFsdWVzIGluIEhlcnR6LlxuXHRcdCAqICBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICovXG5cdCAgICBUb25lLkZyZXF1ZW5jeS5BNCA9IDQ0MDtcblx0ICAgIC8qKlxuXHRcdCAqICBDb252ZXJ0IGEgTUlESSBub3RlIHRvIGZyZXF1ZW5jeSB2YWx1ZS5cblx0XHQgKiAgQHBhcmFtICB7TUlESX0gbWlkaSBUaGUgbWlkaSBudW1iZXIgdG8gY29udmVydC5cblx0XHQgKiAgQHJldHVybiB7RnJlcXVlbmN5fSB0aGUgY29ycmVzcG9uZGluZyBmcmVxdWVuY3kgdmFsdWVcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIFRvbmUuRnJlcXVlbmN5Lm10b2YoNjkpOyAvLyByZXR1cm5zIDQ0MFxuXHRcdCAqL1xuXHQgICAgVG9uZS5GcmVxdWVuY3kubXRvZiA9IGZ1bmN0aW9uIChtaWRpKSB7XG5cdCAgICAgICAgcmV0dXJuIFRvbmUuRnJlcXVlbmN5LkE0ICogTWF0aC5wb3coMiwgKG1pZGkgLSA2OSkgLyAxMik7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENvbnZlcnQgYSBmcmVxdWVuY3kgdmFsdWUgdG8gYSBNSURJIG5vdGUuXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBmcmVxdWVuY3kgVGhlIHZhbHVlIHRvIGZyZXF1ZW5jeSB2YWx1ZSB0byBjb252ZXJ0LlxuXHRcdCAqICBAcmV0dXJucyAge01JREl9XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBUb25lLkZyZXF1ZW5jeS5mdG9tKDQ0MCk7IC8vIHJldHVybnMgNjlcblx0XHQgKi9cblx0ICAgIFRvbmUuRnJlcXVlbmN5LmZ0b20gPSBmdW5jdGlvbiAoZnJlcXVlbmN5KSB7XG5cdCAgICAgICAgcmV0dXJuIDY5ICsgTWF0aC5yb3VuZCgxMiAqIE1hdGgubG9nMihmcmVxdWVuY3kgLyBUb25lLkZyZXF1ZW5jeS5BNCkpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkZyZXF1ZW5jeTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLlRpbWUgaXMgYSBwcmltaXRpdmUgdHlwZSBmb3IgZW5jb2RpbmcgVGltZSB2YWx1ZXMuXG5cdFx0ICogICAgICAgICBUb25lLlRpbWUgY2FuIGJlIGNvbnN0cnVjdGVkIHdpdGggb3Igd2l0aG91dCB0aGUgYG5ld2Aga2V5d29yZC4gVG9uZS5UaW1lIGNhbiBiZSBwYXNzZWRcblx0XHQgKiAgICAgICAgIGludG8gdGhlIHBhcmFtZXRlciBvZiBhbnkgbWV0aG9kIHdoaWNoIHRha2VzIHRpbWUgYXMgYW4gYXJndW1lbnQuXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5UaW1lQmFzZX1cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfE51bWJlcn0gIHZhbCAgICBUaGUgdGltZSB2YWx1ZS5cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nPX0gIHVuaXRzICBUaGUgdW5pdHMgb2YgdGhlIHZhbHVlLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciB0ID0gVG9uZS5UaW1lKFwiNG5cIik7Ly9hIHF1YXJ0ZXIgbm90ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lID0gZnVuY3Rpb24gKHZhbCwgdW5pdHMpIHtcblx0ICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFRvbmUuVGltZSkge1xuXHQgICAgICAgICAgICBUb25lLlRpbWVCYXNlLmNhbGwodGhpcywgdmFsLCB1bml0cyk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb25lLlRpbWUodmFsLCB1bml0cyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuVGltZSwgVG9uZS5UaW1lQmFzZSk7XG5cdCAgICAvKipcblx0XHQgKiBFeHRlbmQgdGhlIGJhc2UgZXhwcmVzc2lvbnNcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zID0gT2JqZWN0LmFzc2lnbih7fSwgVG9uZS5UaW1lQmFzZS5wcm90b3R5cGUuX2V4cHJlc3Npb25zLCB7XG5cdCAgICAgICAgJ3F1YW50aXplJzoge1xuXHQgICAgICAgICAgICByZWdleHA6IC9eQCguKykvLFxuXHQgICAgICAgICAgICBtZXRob2Q6IGZ1bmN0aW9uIChjYXB0dXJlKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVG9uZS5UcmFuc3BvcnQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcXVhbnRUbyA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGNhcHR1cmUpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBUb25lLlRyYW5zcG9ydC5uZXh0U3ViZGl2aXNpb24ocXVhbnRUbyk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAnbm93Jzoge1xuXHQgICAgICAgICAgICByZWdleHA6IC9eXFwrKC4rKS8sXG5cdCAgICAgICAgICAgIG1ldGhvZDogZnVuY3Rpb24gKGNhcHR1cmUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3coKSArIG5ldyB0aGlzLmNvbnN0cnVjdG9yKGNhcHR1cmUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgUXVhbnRpemUgdGhlIHRpbWUgYnkgdGhlIGdpdmVuIHN1YmRpdmlzaW9uLiBPcHRpb25hbGx5IGFkZCBhXG5cdFx0ICogIHBlcmNlbnRhZ2Ugd2hpY2ggd2lsbCBtb3ZlIHRoZSB0aW1lIHZhbHVlIHRvd2FyZHMgdGhlIGlkZWFsXG5cdFx0ICogIHF1YW50aXplZCB2YWx1ZSBieSB0aGF0IHBlcmNlbnRhZ2UuXG5cdFx0ICogIEBwYXJhbSAge051bWJlcnxUaW1lfSAgdmFsICAgIFRoZSBzdWJkaXZpc2lvbiB0byBxdWFudGl6ZSB0b1xuXHRcdCAqICBAcGFyYW0gIHtOb3JtYWxSYW5nZX0gIFtwZXJjZW50PTFdICBNb3ZlIHRoZSB0aW1lIHZhbHVlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvd2FyZHMgdGhlIHF1YW50aXplZCB2YWx1ZSBieVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBlcmNlbnRhZ2UuXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9ICB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogVG9uZS5UaW1lKDIxKS5xdWFudGl6ZSgyKSAvL3JldHVybnMgMjJcblx0XHQgKiBUb25lLlRpbWUoMC42KS5xdWFudGl6ZShcIjRuXCIsIDAuNSkgLy9yZXR1cm5zIDAuNTVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZS5wcm90b3R5cGUucXVhbnRpemUgPSBmdW5jdGlvbiAoc3ViZGl2LCBwZXJjZW50KSB7XG5cdCAgICAgICAgcGVyY2VudCA9IFRvbmUuZGVmYXVsdEFyZyhwZXJjZW50LCAxKTtcblx0ICAgICAgICB2YXIgc3ViZGl2aXNpb24gPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihzdWJkaXYpO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWVPZigpO1xuXHQgICAgICAgIHZhciBtdWx0aXBsZSA9IE1hdGgucm91bmQodmFsdWUgLyBzdWJkaXZpc2lvbik7XG5cdCAgICAgICAgdmFyIGlkZWFsID0gbXVsdGlwbGUgKiBzdWJkaXZpc2lvbjtcblx0ICAgICAgICB2YXIgZGlmZiA9IGlkZWFsIC0gdmFsdWU7XG5cdCAgICAgICAgcmV0dXJuIHZhbHVlICsgZGlmZiAqIHBlcmNlbnQ7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvLyBDT05WRVJTSU9OU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgQ29udmVydCBhIFRpbWUgdG8gTm90YXRpb24uIFRoZSBub3RhdGlvbiB2YWx1ZXMgYXJlIHdpbGwgYmUgdGhlXG5cdFx0ICogIGNsb3Nlc3QgcmVwcmVzZW50YXRpb24gYmV0d2VlbiAxbSB0byAxMjh0aCBub3RlLlxuXHRcdCAqICBAcmV0dXJuIHtOb3RhdGlvbn1cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2lmIHRoZSBUcmFuc3BvcnQgaXMgYXQgMTIwYnBtOlxuXHRcdCAqIFRvbmUuVGltZSgyKS50b05vdGF0aW9uKCk7Ly9yZXR1cm5zIFwiMW1cIlxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lLnByb3RvdHlwZS50b05vdGF0aW9uID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciB0aW1lID0gdGhpcy50b1NlY29uZHMoKTtcblx0ICAgICAgICB2YXIgdGVzdE5vdGF0aW9ucyA9IFsnMW0nXTtcblx0ICAgICAgICBmb3IgKHZhciBwb3dlciA9IDE7IHBvd2VyIDwgODsgcG93ZXIrKykge1xuXHQgICAgICAgICAgICB2YXIgc3ViZGl2ID0gTWF0aC5wb3coMiwgcG93ZXIpO1xuXHQgICAgICAgICAgICB0ZXN0Tm90YXRpb25zLnB1c2goc3ViZGl2ICsgJ24uJyk7XG5cdCAgICAgICAgICAgIHRlc3ROb3RhdGlvbnMucHVzaChzdWJkaXYgKyAnbicpO1xuXHQgICAgICAgICAgICB0ZXN0Tm90YXRpb25zLnB1c2goc3ViZGl2ICsgJ3QnKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGVzdE5vdGF0aW9ucy5wdXNoKCcwJyk7XG5cdCAgICAgICAgLy9maW5kIHRoZSBjbG9zZXRzIG5vdGF0aW9uIHJlcHJlc2VudGF0aW9uXG5cdCAgICAgICAgdmFyIGNsb3Nlc3QgPSB0ZXN0Tm90YXRpb25zWzBdO1xuXHQgICAgICAgIHZhciBjbG9zZXN0U2Vjb25kcyA9IFRvbmUuVGltZSh0ZXN0Tm90YXRpb25zWzBdKS50b1NlY29uZHMoKTtcblx0ICAgICAgICB0ZXN0Tm90YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG5vdGF0aW9uKSB7XG5cdCAgICAgICAgICAgIHZhciBub3RhdGlvblNlY29uZHMgPSBUb25lLlRpbWUobm90YXRpb24pLnRvU2Vjb25kcygpO1xuXHQgICAgICAgICAgICBpZiAoTWF0aC5hYnMobm90YXRpb25TZWNvbmRzIC0gdGltZSkgPCBNYXRoLmFicyhjbG9zZXN0U2Vjb25kcyAtIHRpbWUpKSB7XG5cdCAgICAgICAgICAgICAgICBjbG9zZXN0ID0gbm90YXRpb247XG5cdCAgICAgICAgICAgICAgICBjbG9zZXN0U2Vjb25kcyA9IG5vdGF0aW9uU2Vjb25kcztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBjbG9zZXN0O1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIHRpbWUgZW5jb2RlZCBhcyBCYXJzOkJlYXRzOlNpeHRlZW50aHMuXG5cdFx0ICogIEByZXR1cm4gIHtCYXJzQmVhdHNTaXh0ZWVudGhzfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lLnByb3RvdHlwZS50b0JhcnNCZWF0c1NpeHRlZW50aHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHF1YXJ0ZXJUaW1lID0gdGhpcy5fYmVhdHNUb1VuaXRzKDEpO1xuXHQgICAgICAgIHZhciBxdWFydGVycyA9IHRoaXMudmFsdWVPZigpIC8gcXVhcnRlclRpbWU7XG5cdCAgICAgICAgdmFyIG1lYXN1cmVzID0gTWF0aC5mbG9vcihxdWFydGVycyAvIHRoaXMuX2dldFRpbWVTaWduYXR1cmUoKSk7XG5cdCAgICAgICAgdmFyIHNpeHRlZW50aHMgPSBxdWFydGVycyAlIDEgKiA0O1xuXHQgICAgICAgIHF1YXJ0ZXJzID0gTWF0aC5mbG9vcihxdWFydGVycykgJSB0aGlzLl9nZXRUaW1lU2lnbmF0dXJlKCk7XG5cdCAgICAgICAgc2l4dGVlbnRocyA9IHNpeHRlZW50aHMudG9TdHJpbmcoKTtcblx0ICAgICAgICBpZiAoc2l4dGVlbnRocy5sZW5ndGggPiAzKSB7XG5cdCAgICAgICAgICAgIC8vIHRoZSBhZGRpdGlvbmFsIHBhcnNlRmxvYXQgcmVtb3ZlcyBpbnNpZ25pZmljYW50IHRyYWlsaW5nIHplcm9lc1xuXHQgICAgICAgICAgICBzaXh0ZWVudGhzID0gcGFyc2VGbG9hdChwYXJzZUZsb2F0KHNpeHRlZW50aHMpLnRvRml4ZWQoMykpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcHJvZ3Jlc3MgPSBbXG5cdCAgICAgICAgICAgIG1lYXN1cmVzLFxuXHQgICAgICAgICAgICBxdWFydGVycyxcblx0ICAgICAgICAgICAgc2l4dGVlbnRoc1xuXHQgICAgICAgIF07XG5cdCAgICAgICAgcmV0dXJuIHByb2dyZXNzLmpvaW4oJzonKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSB0aW1lIGluIHRpY2tzLlxuXHRcdCAqICBAcmV0dXJuICB7VGlja3N9XG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWUucHJvdG90eXBlLnRvVGlja3MgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHF1YXJ0ZXJUaW1lID0gdGhpcy5fYmVhdHNUb1VuaXRzKDEpO1xuXHQgICAgICAgIHZhciBxdWFydGVycyA9IHRoaXMudmFsdWVPZigpIC8gcXVhcnRlclRpbWU7XG5cdCAgICAgICAgcmV0dXJuIE1hdGgucm91bmQocXVhcnRlcnMgKiB0aGlzLl9nZXRQUFEoKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgdGltZSBpbiBzZWNvbmRzLlxuXHRcdCAqICBAcmV0dXJuICB7U2Vjb25kc31cblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZS5wcm90b3R5cGUudG9TZWNvbmRzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSB2YWx1ZSBhcyBhIG1pZGkgbm90ZS5cblx0XHQgKiAgQHJldHVybiAge01pZGl9XG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWUucHJvdG90eXBlLnRvTWlkaSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5GcmVxdWVuY3kuZnRvbSh0aGlzLnRvRnJlcXVlbmN5KCkpO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlRpbWU7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5UcmFuc3BvcnRUaW1lIGlzIGEgdGhlIHRpbWUgYWxvbmcgdGhlIFRyYW5zcG9ydCdzXG5cdFx0ICogICAgICAgICB0aW1lbGluZS4gSXQgaXMgc2ltaWxhciB0byBUb25lLlRpbWUsIGJ1dCBpbnN0ZWFkIG9mIGV2YWx1YXRpbmdcblx0XHQgKiAgICAgICAgIGFnYWluc3QgdGhlIEF1ZGlvQ29udGV4dCdzIGNsb2NrLCBpdCBpcyBldmFsdWF0ZWQgYWdhaW5zdFxuXHRcdCAqICAgICAgICAgdGhlIFRyYW5zcG9ydCdzIHBvc2l0aW9uLiBTZWUgW1RyYW5zcG9ydFRpbWUgd2lraV0oaHR0cHM6Ly9naXRodWIuY29tL1RvbmVqcy9Ub25lLmpzL3dpa2kvVHJhbnNwb3J0VGltZSkuXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSAgdmFsICAgIFRoZSB0aW1lIHZhbHVlIGFzIGEgbnVtYmVyIG9yIHN0cmluZ1xuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmc9fSAgdW5pdHMgIFVuaXQgdmFsdWVzXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlRpbWV9XG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydFRpbWUgPSBmdW5jdGlvbiAodmFsLCB1bml0cykge1xuXHQgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgVG9uZS5UcmFuc3BvcnRUaW1lKSB7XG5cdCAgICAgICAgICAgIFRvbmUuVGltZS5jYWxsKHRoaXMsIHZhbCwgdW5pdHMpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9uZS5UcmFuc3BvcnRUaW1lKHZhbCwgdW5pdHMpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlRyYW5zcG9ydFRpbWUsIFRvbmUuVGltZSk7XG5cdCAgICAvKipcblx0XHQgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBpbiB3aGljaGV2ZXIgY29udGV4dCBpcyByZWxldmFudFxuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0VGltZS5wcm90b3R5cGUuX25vdyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5UcmFuc3BvcnQuc2Vjb25kcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5UcmFuc3BvcnRUaW1lO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vXHRUWVBFU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiBVbml0cyB3aGljaCBhIHZhbHVlIGNhbiB0YWtlIG9uLlxuXHRcdCAqIEBlbnVtIHtTdHJpbmd9XG5cdFx0ICovXG5cdCAgICBUb25lLlR5cGUgPSB7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgRGVmYXVsdCB1bml0c1xuXHRcdFx0ICogIEB0eXBlZGVmIHtEZWZhdWx0fVxuXHRcdFx0ICovXG5cdCAgICAgICAgRGVmYXVsdDogJ251bWJlcicsXG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGltZSBjYW4gYmUgZGVzY3JpYmVkIGluIGEgbnVtYmVyIG9mIHdheXMuIFJlYWQgbW9yZSBbVGltZV0oaHR0cHM6Ly9naXRodWIuY29tL1RvbmVqcy9Ub25lLmpzL3dpa2kvVGltZSkuXG5cdFx0XHQgKlxuXHRcdFx0ICogICogTnVtYmVycywgd2hpY2ggd2lsbCBiZSB0YWtlbiBsaXRlcmFsbHkgYXMgdGhlIHRpbWUgKGluIHNlY29uZHMpLlxuXHRcdFx0ICogICogTm90YXRpb24sIChcIjRuXCIsIFwiOHRcIikgZGVzY3JpYmVzIHRpbWUgaW4gQlBNIGFuZCB0aW1lIHNpZ25hdHVyZSByZWxhdGl2ZSB2YWx1ZXMuXG5cdFx0XHQgKiAgKiBUcmFuc3BvcnRUaW1lLCAoXCI0OjM6MlwiKSB3aWxsIGFsc28gcHJvdmlkZSB0ZW1wbyBhbmQgdGltZSBzaWduYXR1cmUgcmVsYXRpdmUgdGltZXNcblx0XHRcdCAqICBpbiB0aGUgZm9ybSBCQVJTOlFVQVJURVJTOlNJWFRFRU5USFMuXG5cdFx0XHQgKiAgKiBGcmVxdWVuY3ksIChcIjhoelwiKSBpcyBjb252ZXJ0ZWQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgY3ljbGUgaW4gc2Vjb25kcy5cblx0XHRcdCAqICAqIE5vdy1SZWxhdGl2ZSwgKFwiKzFcIikgcHJlZml4IGFueSBvZiB0aGUgYWJvdmUgd2l0aCBcIitcIiBhbmQgaXQgd2lsbCBiZSBpbnRlcnByZXRlZCBhc1xuXHRcdFx0ICogIFwidGhlIGN1cnJlbnQgdGltZSBwbHVzIHdoYXRldmVyIGV4cHJlc3Npb24gZm9sbG93c1wiLlxuXHRcdFx0ICogICogRXhwcmVzc2lvbnMsIChcIjM6MCArIDIgLSAoMW0gLyA3KVwiKSBhbnkgb2YgdGhlIGFib3ZlIGNhbiBhbHNvIGJlIGNvbWJpbmVkXG5cdFx0XHQgKiAgaW50byBhIG1hdGhlbWF0aWNhbCBleHByZXNzaW9uIHdoaWNoIHdpbGwgYmUgZXZhbHVhdGVkIHRvIGNvbXB1dGUgdGhlIGRlc2lyZWQgdGltZS5cblx0XHRcdCAqICAqIE5vIEFyZ3VtZW50LCBmb3IgbWV0aG9kcyB3aGljaCBhY2NlcHQgdGltZSwgbm8gYXJndW1lbnQgd2lsbCBiZSBpbnRlcnByZXRlZCBhc1xuXHRcdFx0ICogIFwibm93XCIgKGkuZS4gdGhlIGN1cnJlbnRUaW1lKS5cblx0XHRcdCAqXG5cdFx0XHQgKiAgQHR5cGVkZWYge1RpbWV9XG5cdFx0XHQgKi9cblx0ICAgICAgICBUaW1lOiAndGltZScsXG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgRnJlcXVlbmN5IGNhbiBiZSBkZXNjcmliZWQgc2ltaWxhciB0byB0aW1lLCBleGNlcHQgdWx0aW1hdGVseSB0aGVcblx0XHRcdCAqICB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBmcmVxdWVuY3kgaW5zdGVhZCBvZiBzZWNvbmRzLiBBIG51bWJlclxuXHRcdFx0ICogIGlzIHRha2VuIGxpdGVyYWxseSBhcyB0aGUgdmFsdWUgaW4gaGVydHouIEFkZGl0aW9uYWxseSBhbnkgb2YgdGhlXG5cdFx0XHQgKiAgVGltZSBlbmNvZGluZ3MgY2FuIGJlIHVzZWQuIE5vdGUgbmFtZXMgaW4gdGhlIGZvcm1cblx0XHRcdCAqICBvZiBOT1RFIE9DVEFWRSAoaS5lLiBDNCkgYXJlIGFsc28gYWNjZXB0ZWQgYW5kIGNvbnZlcnRlZCB0byB0aGVpclxuXHRcdFx0ICogIGZyZXF1ZW5jeSB2YWx1ZS5cblx0XHRcdCAqICBAdHlwZWRlZiB7RnJlcXVlbmN5fVxuXHRcdFx0ICovXG5cdCAgICAgICAgRnJlcXVlbmN5OiAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUcmFuc3BvcnRUaW1lIGRlc2NyaWJlcyBhIHBvc2l0aW9uIGFsb25nIHRoZSBUcmFuc3BvcnQncyB0aW1lbGluZS4gSXQgaXNcblx0XHRcdCAqICBzaW1pbGFyIHRvIFRpbWUgaW4gdGhhdCBpdCB1c2VzIGFsbCB0aGUgc2FtZSBlbmNvZGluZ3MsIGJ1dCBUcmFuc3BvcnRUaW1lIHNwZWNpZmljYWxseVxuXHRcdFx0ICogIHBlcnRhaW5zIHRvIHRoZSBUcmFuc3BvcnQncyB0aW1lbGluZSwgd2hpY2ggaXMgc3RhcnRhYmxlLCBzdG9wcGFibGUsIGxvb3BhYmxlLCBhbmQgc2Vla2FibGUuXG5cdFx0XHQgKiAgW1JlYWQgbW9yZV0oaHR0cHM6Ly9naXRodWIuY29tL1RvbmVqcy9Ub25lLmpzL3dpa2kvVHJhbnNwb3J0VGltZSlcblx0XHRcdCAqICBAdHlwZWRlZiB7VHJhbnNwb3J0VGltZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIFRyYW5zcG9ydFRpbWU6ICd0cmFuc3BvcnRUaW1lJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaWNrcyBhcmUgdGhlIGJhc2ljIHN1YnVuaXQgb2YgdGhlIFRyYW5zcG9ydC4gVGhleSBhcmVcblx0XHRcdCAqICB0aGUgc21hbGxlc3QgdW5pdCBvZiB0aW1lIHRoYXQgdGhlIFRyYW5zcG9ydCBzdXBwb3J0cy5cblx0XHRcdCAqICBAdHlwZWRlZiB7VGlja3N9XG5cdFx0XHQgKi9cblx0ICAgICAgICBUaWNrczogJ3RpY2tzJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBOb3JtYWwgdmFsdWVzIGFyZSB3aXRoaW4gdGhlIHJhbmdlIFswLCAxXS5cblx0XHRcdCAqICBAdHlwZWRlZiB7Tm9ybWFsUmFuZ2V9XG5cdFx0XHQgKi9cblx0ICAgICAgICBOb3JtYWxSYW5nZTogJ25vcm1hbFJhbmdlJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBdWRpb1JhbmdlIHZhbHVlcyBhcmUgYmV0d2VlbiBbLTEsIDFdLlxuXHRcdFx0ICogIEB0eXBlZGVmIHtBdWRpb1JhbmdlfVxuXHRcdFx0ICovXG5cdCAgICAgICAgQXVkaW9SYW5nZTogJ2F1ZGlvUmFuZ2UnLFxuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIERlY2liZWxzIGFyZSBhIGxvZ2FyaXRobWljIHVuaXQgb2YgbWVhc3VyZW1lbnQgd2hpY2ggaXMgdXNlZnVsIGZvciB2b2x1bWVcblx0XHRcdCAqICBiZWNhdXNlIG9mIHRoZSBsb2dhcml0aG1pYyB3YXkgdGhhdCB3ZSBwZXJjZWl2ZSBsb3VkbmVzcy4gMCBkZWNpYmVsc1xuXHRcdFx0ICogIG1lYW5zIG5vIGNoYW5nZSBpbiB2b2x1bWUuIC0xMGRiIGlzIGFwcHJveGltYXRlbHkgaGFsZiBhcyBsb3VkIGFuZCAxMGRiXG5cdFx0XHQgKiAgaXMgdHdpY2UgaXMgbG91ZC5cblx0XHRcdCAqICBAdHlwZWRlZiB7RGVjaWJlbHN9XG5cdFx0XHQgKi9cblx0ICAgICAgICBEZWNpYmVsczogJ2RiJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBIYWxmLXN0ZXAgbm90ZSBpbmNyZW1lbnRzLCBpLmUuIDEyIGlzIGFuIG9jdGF2ZSBhYm92ZSB0aGUgcm9vdC4gYW5kIDEgaXMgYSBoYWxmLXN0ZXAgdXAuXG5cdFx0XHQgKiAgQHR5cGVkZWYge0ludGVydmFsfVxuXHRcdFx0ICovXG5cdCAgICAgICAgSW50ZXJ2YWw6ICdpbnRlcnZhbCcsXG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQmVhdHMgcGVyIG1pbnV0ZS5cblx0XHRcdCAqICBAdHlwZWRlZiB7QlBNfVxuXHRcdFx0ICovXG5cdCAgICAgICAgQlBNOiAnYnBtJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC5cblx0XHRcdCAqICBAdHlwZWRlZiB7UG9zaXRpdmV9XG5cdFx0XHQgKi9cblx0ICAgICAgICBQb3NpdGl2ZTogJ3Bvc2l0aXZlJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBHYWluIGlzIHRoZSByYXRpbyBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgb2YgYSBzaWduYWwuXG5cdFx0XHQgKiAgQSBnYWluIG9mIDAgaXMgdGhlIHNhbWUgYXMgc2lsZW5jaW5nIHRoZSBzaWduYWwuIEEgZ2FpbiBvZlxuXHRcdFx0ICogIDEsIGNhdXNlcyBubyBjaGFuZ2UgdG8gdGhlIGluY29taW5nIHNpZ25hbC5cblx0XHRcdCAqICBAdHlwZWRlZiB7R2Fpbn1cblx0XHRcdCAqL1xuXHQgICAgICAgIEdhaW46ICdnYWluJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBIGNlbnQgaXMgYSBodW5kcmVkdGggb2YgYSBzZW1pdG9uZS5cblx0XHRcdCAqICBAdHlwZWRlZiB7Q2VudHN9XG5cdFx0XHQgKi9cblx0ICAgICAgICBDZW50czogJ2NlbnRzJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBbmdsZSBiZXR3ZWVuIDAgYW5kIDM2MC5cblx0XHRcdCAqICBAdHlwZWRlZiB7RGVncmVlc31cblx0XHRcdCAqL1xuXHQgICAgICAgIERlZ3JlZXM6ICdkZWdyZWVzJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBIG51bWJlciByZXByZXNlbnRpbmcgYSBtaWRpIG5vdGUuXG5cdFx0XHQgKiAgQHR5cGVkZWYge01JREl9XG5cdFx0XHQgKi9cblx0ICAgICAgICBNSURJOiAnbWlkaScsXG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQSBjb2xvbi1zZXBhcmF0ZWQgcmVwcmVzZW50YXRpb24gb2YgdGltZSBpbiB0aGUgZm9ybSBvZlxuXHRcdFx0ICogIEJhcnM6QmVhdHM6U2l4dGVlbnRocy5cblx0XHRcdCAqICBAdHlwZWRlZiB7QmFyc0JlYXRzU2l4dGVlbnRoc31cblx0XHRcdCAqL1xuXHQgICAgICAgIEJhcnNCZWF0c1NpeHRlZW50aHM6ICdiYXJzQmVhdHNTaXh0ZWVudGhzJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBTYW1wbGluZyBpcyB0aGUgcmVkdWN0aW9uIG9mIGEgY29udGludW91cyBzaWduYWwgdG8gYSBkaXNjcmV0ZSBzaWduYWwuXG5cdFx0XHQgKiAgQXVkaW8gaXMgdHlwaWNhbGx5IHNhbXBsZWQgNDQxMDAgdGltZXMgcGVyIHNlY29uZC5cblx0XHRcdCAqICBAdHlwZWRlZiB7U2FtcGxlc31cblx0XHRcdCAqL1xuXHQgICAgICAgIFNhbXBsZXM6ICdzYW1wbGVzJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBIZXJ0eiBhcmUgYSBmcmVxdWVuY3kgcmVwcmVzZW50YXRpb24gZGVmaW5lZCBhcyBvbmUgY3ljbGUgcGVyIHNlY29uZC5cblx0XHRcdCAqICBAdHlwZWRlZiB7SGVydHp9XG5cdFx0XHQgKi9cblx0ICAgICAgICBIZXJ0ejogJ2hlcnR6Jyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBIGZyZXF1ZW5jeSByZXByZXNlbnRlZCBieSBhIGxldHRlciBuYW1lLFxuXHRcdFx0ICogIGFjY2lkZW50YWwgYW5kIG9jdGF2ZS4gVGhpcyBzeXN0ZW0gaXMga25vd24gYXNcblx0XHRcdCAqICBbU2NpZW50aWZpYyBQaXRjaCBOb3RhdGlvbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2NpZW50aWZpY19waXRjaF9ub3RhdGlvbikuXG5cdFx0XHQgKiAgQHR5cGVkZWYge05vdGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICBOb3RlOiAnbm90ZScsXG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgT25lIG1pbGxpc2Vjb25kIGlzIGEgdGhvdXNhbmR0aCBvZiBhIHNlY29uZC5cblx0XHRcdCAqICBAdHlwZWRlZiB7TWlsbGlzZWNvbmRzfVxuXHRcdFx0ICovXG5cdCAgICAgICAgTWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmRzJyxcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBTZWNvbmRzIGFyZSB0aGUgdGltZSB1bml0IG9mIHRoZSBBdWRpb0NvbnRleHQuIEluIHRoZSBlbmQsXG5cdFx0XHQgKiAgYWxsIHZhbHVlcyBuZWVkIHRvIGJlIGV2YWx1YXRlZCB0byBzZWNvbmRzLlxuXHRcdFx0ICogIEB0eXBlZGVmIHtTZWNvbmRzfVxuXHRcdFx0ICovXG5cdCAgICAgICAgU2Vjb25kczogJ3NlY29uZHMnLFxuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEEgc3RyaW5nIHJlcHJlc2VudGluZyBhIGR1cmF0aW9uIHJlbGF0aXZlIHRvIGEgbWVhc3VyZS5cblx0XHRcdCAqICAqIFwiNG5cIiA9IHF1YXJ0ZXIgbm90ZVxuXHRcdFx0ICogICogXCIybVwiID0gdHdvIG1lYXN1cmVzXG5cdFx0XHQgKiAgKiBcIjh0XCIgPSBlaWdodGgtbm90ZSB0cmlwbGV0XG5cdFx0XHQgKiAgQHR5cGVkZWYge05vdGF0aW9ufVxuXHRcdFx0ICovXG5cdCAgICAgICAgTm90YXRpb246ICdub3RhdGlvbidcblx0ICAgIH07XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vIEFVR01FTlQgVE9ORSdzIFBST1RPVFlQRVxuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgQ29udmVydCBUaW1lIGludG8gc2Vjb25kcy5cblx0XHQgKlxuXHRcdCAqICBVbmxpa2UgdGhlIG1ldGhvZCB3aGljaCBpdCBvdmVycmlkZXMsIHRoaXMgdGFrZXMgaW50byBhY2NvdW50XG5cdFx0ICogIHRyYW5zcG9ydHRpbWUgYW5kIG11c2ljYWwgbm90YXRpb24uXG5cdFx0ICpcblx0XHQgKiAgVGltZSA6IDEuNDBcblx0XHQgKiAgTm90YXRpb246IDRuIG9yIDFtIG9yIDJ0XG5cdFx0ICogIE5vdyBSZWxhdGl2ZTogKzNuXG5cdFx0ICogIE1hdGg6IDNuKzE2biBvciBldmVuIGNvbXBsaWNhdGVkIGV4cHJlc3Npb25zICgoM24qMikvNiArIDEpXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gdGltZVxuXHRcdCAqICBAcmV0dXJuIHtTZWNvbmRzfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5wcm90b3R5cGUudG9TZWNvbmRzID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc051bWJlcih0aW1lKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGltZTtcblx0ICAgICAgICB9IGVsc2UgaWYgKFRvbmUuaXNVbmRlZih0aW1lKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5ub3coKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKFRvbmUuaXNTdHJpbmcodGltZSkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb25lLlRpbWUodGltZSkudG9TZWNvbmRzKCk7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0aW1lIGluc3RhbmNlb2YgVG9uZS5UaW1lQmFzZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGltZS50b1NlY29uZHMoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENvbnZlcnQgYSBmcmVxdWVuY3kgcmVwcmVzZW50YXRpb24gaW50byBhIG51bWJlci5cblx0XHQgKiAgQHBhcmFtICB7RnJlcXVlbmN5fSBmcmVxXG5cdFx0ICogIEByZXR1cm4ge0hlcnR6fSAgICAgIHRoZSBmcmVxdWVuY3kgaW4gaGVydHpcblx0XHQgKi9cblx0ICAgIFRvbmUucHJvdG90eXBlLnRvRnJlcXVlbmN5ID0gZnVuY3Rpb24gKGZyZXEpIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc051bWJlcihmcmVxKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZnJlcTtcblx0ICAgICAgICB9IGVsc2UgaWYgKFRvbmUuaXNTdHJpbmcoZnJlcSkgfHwgVG9uZS5pc1VuZGVmKGZyZXEpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9uZS5GcmVxdWVuY3koZnJlcSkudmFsdWVPZigpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoZnJlcSBpbnN0YW5jZW9mIFRvbmUuVGltZUJhc2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZyZXEudG9GcmVxdWVuY3koKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENvbnZlcnQgYSB0aW1lIHJlcHJlc2VudGF0aW9uIGludG8gdGlja3MuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IHRpbWVcblx0XHQgKiAgQHJldHVybiB7VGlja3N9ICB0aGUgdGltZSBpbiB0aWNrc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5wcm90b3R5cGUudG9UaWNrcyA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgaWYgKFRvbmUuaXNOdW1iZXIodGltZSkgfHwgVG9uZS5pc1N0cmluZyh0aW1lKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFRvbmUuVHJhbnNwb3J0VGltZSh0aW1lKS50b1RpY2tzKCk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChUb25lLmlzVW5kZWYodGltZSkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVHJhbnNwb3J0LnRpY2tzO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodGltZSBpbnN0YW5jZW9mIFRvbmUuVGltZUJhc2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRpbWUudG9UaWNrcygpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuUGFyYW0gd3JhcHMgdGhlIG5hdGl2ZSBXZWIgQXVkaW8ncyBBdWRpb1BhcmFtIHRvIHByb3ZpZGVcblx0XHQgKiAgICAgICAgIGFkZGl0aW9uYWwgdW5pdCBjb252ZXJzaW9uIGZ1bmN0aW9uYWxpdHkuIEl0IGFsc29cblx0XHQgKiAgICAgICAgIHNlcnZlcyBhcyBhIGJhc2UtY2xhc3MgZm9yIGNsYXNzZXMgd2hpY2ggaGF2ZSBhIHNpbmdsZSxcblx0XHQgKiAgICAgICAgIGF1dG9tYXRhYmxlIHBhcmFtZXRlci5cblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAcGFyYW0gIHtBdWRpb1BhcmFtfSAgcGFyYW0gIFRoZSBwYXJhbWV0ZXIgdG8gd3JhcC5cblx0XHQgKiAgQHBhcmFtICB7VG9uZS5UeXBlfSB1bml0cyBUaGUgdW5pdHMgb2YgdGhlIGF1ZGlvIHBhcmFtLlxuXHRcdCAqICBAcGFyYW0gIHtCb29sZWFufSBjb252ZXJ0IElmIHRoZSBwYXJhbSBzaG91bGQgYmUgY29udmVydGVkLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJhbSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdwYXJhbScsXG5cdCAgICAgICAgICAgICd1bml0cycsXG5cdCAgICAgICAgICAgICdjb252ZXJ0J1xuXHQgICAgICAgIF0sIFRvbmUuUGFyYW0pO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG5hdGl2ZSBwYXJhbWV0ZXIgdG8gY29udHJvbFxuXHRcdFx0ICogIEB0eXBlICB7QXVkaW9QYXJhbX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcGFyYW0gPSB0aGlzLmlucHV0ID0gb3B0aW9ucy5wYXJhbTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdW5pdHMgb2YgdGhlIHBhcmFtZXRlclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlR5cGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnVuaXRzID0gb3B0aW9ucy51bml0cztcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBJZiB0aGUgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCBvciBub3Rcblx0XHRcdCAqICBAdHlwZSB7Qm9vbGVhbn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuY29udmVydCA9IG9wdGlvbnMuY29udmVydDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUcnVlIGlmIHRoZSBzaWduYWwgdmFsdWUgaXMgYmVpbmcgb3ZlcnJpZGRlbiBieVxuXHRcdFx0ICogIGEgY29ubmVjdGVkIHNpZ25hbC5cblx0XHRcdCAqICBAcmVhZE9ubHlcblx0XHRcdCAqICBAdHlwZSAge2Jvb2xlYW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMub3ZlcnJpZGRlbiA9IGZhbHNlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIHRpbWVsaW5lIHdoaWNoIHRyYWNrcyBhbGwgb2YgdGhlIGF1dG9tYXRpb25zLlxuXHRcdFx0ICogQHR5cGUge1RvbmUuVGltZWxpbmV9XG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IFRvbmUuVGltZWxpbmUoMTAwMCk7XG5cdCAgICAgICAgaWYgKFRvbmUuaXNEZWZpbmVkKG9wdGlvbnMudmFsdWUpICYmIHRoaXMuX3BhcmFtKSB7XG5cdCAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlBhcmFtLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgRGVmYXVsdHNcblx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0ICogIEBjb25zdFxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJhbS5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAndW5pdHMnOiBUb25lLlR5cGUuRGVmYXVsdCxcblx0ICAgICAgICAnY29udmVydCc6IHRydWUsXG5cdCAgICAgICAgJ3BhcmFtJzogdW5kZWZpbmVkXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QYXJhbSNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIHZhbHVlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYXJhbS5wcm90b3R5cGUsICd2YWx1ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIG5vdyA9IHRoaXMubm93KCk7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl90b1VuaXRzKHRoaXMuZ2V0VmFsdWVBdFRpbWUobm93KSk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9pbml0aWFsVmFsdWUgPSB0aGlzLl9mcm9tVW5pdHModmFsdWUpO1xuXHQgICAgICAgICAgICB0aGlzLmNhbmNlbFNjaGVkdWxlZFZhbHVlcyh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUpO1xuXHQgICAgICAgICAgICB0aGlzLnNldFZhbHVlQXRUaW1lKHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG1pbmltdW0gb3V0cHV0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXJcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QYXJhbSNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIHZhbHVlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYXJhbS5wcm90b3R5cGUsICdtaW5WYWx1ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMudW5pdHMgPT09IFRvbmUuVHlwZS5UaW1lIHx8IHRoaXMudW5pdHMgPT09IFRvbmUuVHlwZS5GcmVxdWVuY3kgfHwgdGhpcy51bml0cyA9PT0gVG9uZS5UeXBlLk5vcm1hbFJhbmdlIHx8IHRoaXMudW5pdHMgPT09IFRvbmUuVHlwZS5Qb3NpdGl2ZSB8fCB0aGlzLnVuaXRzID09PSBUb25lLlR5cGUuQlBNKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gMDtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVuaXRzID09PSBUb25lLlR5cGUuQXVkaW9SYW5nZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudW5pdHMgPT09IFRvbmUuVHlwZS5EZWNpYmVscykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJhbS5taW5WYWx1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG1heGltdW0gb3V0cHV0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXJcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QYXJhbSNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIHZhbHVlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYXJhbS5wcm90b3R5cGUsICdtYXhWYWx1ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMudW5pdHMgPT09IFRvbmUuVHlwZS5Ob3JtYWxSYW5nZSB8fCB0aGlzLnVuaXRzID09PSBUb25lLlR5cGUuQXVkaW9SYW5nZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyYW0ubWF4VmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDb252ZXJ0IHRoZSBnaXZlbiB2YWx1ZSBmcm9tIHRoZSB0eXBlIHNwZWNpZmllZCBieSBUb25lLlBhcmFtLnVuaXRzXG5cdFx0ICogIGludG8gdGhlIGRlc3RpbmF0aW9uIHZhbHVlIChzdWNoIGFzIEdhaW4gb3IgRnJlcXVlbmN5KS5cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHBhcmFtICB7Kn0gdmFsIHRoZSB2YWx1ZSB0byBjb252ZXJ0XG5cdFx0ICogIEByZXR1cm4ge251bWJlcn0gICAgIHRoZSBudW1iZXIgd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG9cblx0XHQgKi9cblx0ICAgIFRvbmUuUGFyYW0ucHJvdG90eXBlLl9mcm9tVW5pdHMgPSBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgaWYgKCh0aGlzLmNvbnZlcnQgfHwgVG9uZS5pc1VuZGVmKHRoaXMuY29udmVydCkpICYmICF0aGlzLm92ZXJyaWRkZW4pIHtcblx0ICAgICAgICAgICAgc3dpdGNoICh0aGlzLnVuaXRzKSB7XG5cdCAgICAgICAgICAgIGNhc2UgVG9uZS5UeXBlLlRpbWU6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b1NlY29uZHModmFsKTtcblx0ICAgICAgICAgICAgY2FzZSBUb25lLlR5cGUuRnJlcXVlbmN5OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9GcmVxdWVuY3kodmFsKTtcblx0ICAgICAgICAgICAgY2FzZSBUb25lLlR5cGUuRGVjaWJlbHM6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVG9uZS5kYlRvR2Fpbih2YWwpO1xuXHQgICAgICAgICAgICBjYXNlIFRvbmUuVHlwZS5Ob3JtYWxSYW5nZTpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWwsIDApLCAxKTtcblx0ICAgICAgICAgICAgY2FzZSBUb25lLlR5cGUuQXVkaW9SYW5nZTpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWwsIC0xKSwgMSk7XG5cdCAgICAgICAgICAgIGNhc2UgVG9uZS5UeXBlLlBvc2l0aXZlOlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHZhbCwgMCk7XG5cdCAgICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHZhbDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogQ29udmVydCB0aGUgcGFyYW1ldGVycyB2YWx1ZSBpbnRvIHRoZSB1bml0cyBzcGVjaWZpZWQgYnkgVG9uZS5QYXJhbS51bml0cy5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqIEBwYXJhbSAge251bWJlcn0gdmFsIHRoZSB2YWx1ZSB0byBjb252ZXJ0XG5cdFx0ICogQHJldHVybiB7bnVtYmVyfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJhbS5wcm90b3R5cGUuX3RvVW5pdHMgPSBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udmVydCB8fCBUb25lLmlzVW5kZWYodGhpcy5jb252ZXJ0KSkge1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHRoaXMudW5pdHMpIHtcblx0ICAgICAgICAgICAgY2FzZSBUb25lLlR5cGUuRGVjaWJlbHM6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gVG9uZS5nYWluVG9EYih2YWwpO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgbWluaW11bSBvdXRwdXQgdmFsdWVcblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFyYW0ucHJvdG90eXBlLl9taW5PdXRwdXQgPSAwLjAwMDAxO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBldmVudCB0eXBlc1xuXHRcdCAqICBAZW51bSB7U3RyaW5nfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZSA9IHtcblx0ICAgICAgICBMaW5lYXI6ICdsaW5lYXJSYW1wVG9WYWx1ZUF0VGltZScsXG5cdCAgICAgICAgRXhwb25lbnRpYWw6ICdleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lJyxcblx0ICAgICAgICBUYXJnZXQ6ICdzZXRUYXJnZXRBdFRpbWUnLFxuXHQgICAgICAgIFNldFZhbHVlOiAnc2V0VmFsdWVBdFRpbWUnXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNjaGVkdWxlcyBhIHBhcmFtZXRlciB2YWx1ZSBjaGFuZ2UgYXQgdGhlIGdpdmVuIHRpbWUuXG5cdFx0ICogIEBwYXJhbSB7Kn1cdHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHNpZ25hbC5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSAgdGltZSBUaGUgdGltZSB3aGVuIHRoZSBjaGFuZ2Ugc2hvdWxkIG9jY3VyLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QYXJhbX0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vc2V0IHRoZSBmcmVxdWVuY3kgdG8gXCJHNFwiIGluIGV4YWN0bHkgMSBzZWNvbmQgZnJvbSBub3cuXG5cdFx0ICogZnJlcS5zZXRWYWx1ZUF0VGltZShcIkc0XCIsIFwiKzFcIik7XG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5zZXRWYWx1ZUF0VGltZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB2YWx1ZSA9IHRoaXMuX2Zyb21Vbml0cyh2YWx1ZSk7XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmFkZCh7XG5cdCAgICAgICAgICAgICd0eXBlJzogVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5TZXRWYWx1ZSxcblx0ICAgICAgICAgICAgJ3ZhbHVlJzogdmFsdWUsXG5cdCAgICAgICAgICAgICd0aW1lJzogdGltZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRoaXMuX3BhcmFtLnNldFZhbHVlQXRUaW1lKHZhbHVlLCB0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgR2V0IHRoZSBzaWduYWxzIHZhbHVlIGF0IHRoZSBnaXZlbiB0aW1lLiBTdWJzZXF1ZW50IHNjaGVkdWxpbmdcblx0XHQgKiAgbWF5IGludmFsaWRhdGUgdGhlIHJldHVybmVkIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IHRpbWUgV2hlbiB0byBnZXQgdGhlIHZhbHVlXG5cdFx0ICogIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdGltZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJhbS5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB2YXIgYWZ0ZXIgPSB0aGlzLl9ldmVudHMuZ2V0QWZ0ZXIodGltZSk7XG5cdCAgICAgICAgdmFyIGJlZm9yZSA9IHRoaXMuX2V2ZW50cy5nZXQodGltZSk7XG5cdCAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IFRvbmUuZGVmYXVsdEFyZyh0aGlzLl9pbml0aWFsVmFsdWUsIHRoaXMuX3BhcmFtLmRlZmF1bHRWYWx1ZSk7XG5cdCAgICAgICAgdmFyIHZhbHVlID0gaW5pdGlhbFZhbHVlO1xuXHQgICAgICAgIC8vaWYgaXQgd2FzIHNldCBieVxuXHQgICAgICAgIGlmIChiZWZvcmUgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7XG5cdCAgICAgICAgfSBlbHNlIGlmIChiZWZvcmUudHlwZSA9PT0gVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5UYXJnZXQpIHtcblx0ICAgICAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy5fZXZlbnRzLmdldEJlZm9yZShiZWZvcmUudGltZSk7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c1ZhbDtcblx0ICAgICAgICAgICAgaWYgKHByZXZpb3VzID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICBwcmV2aW91c1ZhbCA9IGluaXRpYWxWYWx1ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHByZXZpb3VzVmFsID0gcHJldmlvdXMudmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9leHBvbmVudGlhbEFwcHJvYWNoKGJlZm9yZS50aW1lLCBwcmV2aW91c1ZhbCwgYmVmb3JlLnZhbHVlLCBiZWZvcmUuY29uc3RhbnQsIHRpbWUpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXIgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdmFsdWUgPSBiZWZvcmUudmFsdWU7XG5cdCAgICAgICAgfSBlbHNlIGlmIChhZnRlci50eXBlID09PSBUb25lLlBhcmFtLkF1dG9tYXRpb25UeXBlLkxpbmVhcikge1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2xpbmVhckludGVycG9sYXRlKGJlZm9yZS50aW1lLCBiZWZvcmUudmFsdWUsIGFmdGVyLnRpbWUsIGFmdGVyLnZhbHVlLCB0aW1lKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKGFmdGVyLnR5cGUgPT09IFRvbmUuUGFyYW0uQXV0b21hdGlvblR5cGUuRXhwb25lbnRpYWwpIHtcblx0ICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9leHBvbmVudGlhbEludGVycG9sYXRlKGJlZm9yZS50aW1lLCBiZWZvcmUudmFsdWUsIGFmdGVyLnRpbWUsIGFmdGVyLnZhbHVlLCB0aW1lKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB2YWx1ZSA9IGJlZm9yZS52YWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDcmVhdGVzIGEgc2NoZWR1bGUgcG9pbnQgd2l0aCB0aGUgY3VycmVudCB2YWx1ZSBhdCB0aGUgY3VycmVudCB0aW1lLlxuXHRcdCAqICBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgYW4gYXV0b21hdGlvbiBhbmNob3IgcG9pbnQgaW4gb3JkZXIgdG9cblx0XHQgKiAgc2NoZWR1bGUgY2hhbmdlcyBmcm9tIHRoZSBjdXJyZW50IHZhbHVlLlxuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyPX0gbm93IChPcHRpb25hbGx5KSBwYXNzIHRoZSBub3cgdmFsdWUgaW4uXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBhcmFtfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5zZXRSYW1wUG9pbnQgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB2YXIgY3VycmVudFZhbCA9IHRoaXMuZ2V0VmFsdWVBdFRpbWUodGltZSk7XG5cdCAgICAgICAgdGhpcy5jYW5jZWxBbmRIb2xkQXRUaW1lKHRpbWUpO1xuXHQgICAgICAgIGlmIChjdXJyZW50VmFsID09PSAwKSB7XG5cdCAgICAgICAgICAgIGN1cnJlbnRWYWwgPSB0aGlzLl9taW5PdXRwdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc2V0VmFsdWVBdFRpbWUodGhpcy5fdG9Vbml0cyhjdXJyZW50VmFsKSwgdGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNjaGVkdWxlcyBhIGxpbmVhciBjb250aW51b3VzIGNoYW5nZSBpbiBwYXJhbWV0ZXIgdmFsdWUgZnJvbSB0aGVcblx0XHQgKiAgcHJldmlvdXMgc2NoZWR1bGVkIHBhcmFtZXRlciB2YWx1ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7bnVtYmVyfSB2YWx1ZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBlbmRUaW1lXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBhcmFtfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5kVGltZSkge1xuXHQgICAgICAgIHZhbHVlID0gdGhpcy5fZnJvbVVuaXRzKHZhbHVlKTtcblx0ICAgICAgICBlbmRUaW1lID0gdGhpcy50b1NlY29uZHMoZW5kVGltZSk7XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmFkZCh7XG5cdCAgICAgICAgICAgICd0eXBlJzogVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXIsXG5cdCAgICAgICAgICAgICd2YWx1ZSc6IHZhbHVlLFxuXHQgICAgICAgICAgICAndGltZSc6IGVuZFRpbWVcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLl9wYXJhbS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh2YWx1ZSwgZW5kVGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNjaGVkdWxlcyBhbiBleHBvbmVudGlhbCBjb250aW51b3VzIGNoYW5nZSBpbiBwYXJhbWV0ZXIgdmFsdWUgZnJvbVxuXHRcdCAqICB0aGUgcHJldmlvdXMgc2NoZWR1bGVkIHBhcmFtZXRlciB2YWx1ZSB0byB0aGUgZ2l2ZW4gdmFsdWUuXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7bnVtYmVyfSB2YWx1ZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBlbmRUaW1lXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBhcmFtfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lID0gZnVuY3Rpb24gKHZhbHVlLCBlbmRUaW1lKSB7XG5cdCAgICAgICAgdmFsdWUgPSB0aGlzLl9mcm9tVW5pdHModmFsdWUpO1xuXHQgICAgICAgIHZhbHVlID0gTWF0aC5tYXgodGhpcy5fbWluT3V0cHV0LCB2YWx1ZSk7XG5cdCAgICAgICAgZW5kVGltZSA9IHRoaXMudG9TZWNvbmRzKGVuZFRpbWUpO1xuXHQgICAgICAgIC8vc3RvcmUgdGhlIGV2ZW50XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmFkZCh7XG5cdCAgICAgICAgICAgICd0eXBlJzogVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5FeHBvbmVudGlhbCxcblx0ICAgICAgICAgICAgJ3RpbWUnOiBlbmRUaW1lLFxuXHQgICAgICAgICAgICAndmFsdWUnOiB2YWx1ZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRoaXMuX3BhcmFtLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUodmFsdWUsIGVuZFRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTY2hlZHVsZXMgYW4gZXhwb25lbnRpYWwgY29udGludW91cyBjaGFuZ2UgaW4gcGFyYW1ldGVyIHZhbHVlIGZyb21cblx0XHQgKiAgdGhlIGN1cnJlbnQgdGltZSBhbmQgY3VycmVudCB2YWx1ZSB0byB0aGUgZ2l2ZW4gdmFsdWUgb3ZlciB0aGVcblx0XHQgKiAgZHVyYXRpb24gb2YgdGhlIHJhbXBUaW1lLlxuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSAge251bWJlcn0gdmFsdWUgICBUaGUgdmFsdWUgdG8gcmFtcCB0by5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gcmFtcFRpbWUgdGhlIHRpbWUgdGhhdCBpdCB0YWtlcyB0aGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB0byByYW1wIGZyb20gaXQncyBjdXJyZW50IHZhbHVlXG5cdFx0ICogIEBwYXJhbSB7VGltZX1cdFtzdGFydFRpbWU9bm93XSBcdFdoZW4gdGhlIHJhbXAgc2hvdWxkIHN0YXJ0LlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QYXJhbX0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vZXhwb25lbnRpYWxseSByYW1wIHRvIHRoZSB2YWx1ZSAyIG92ZXIgNCBzZWNvbmRzLlxuXHRcdCAqIHNpZ25hbC5leHBvbmVudGlhbFJhbXBUbygyLCA0KTtcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFyYW0ucHJvdG90eXBlLmV4cG9uZW50aWFsUmFtcFRvID0gZnVuY3Rpb24gKHZhbHVlLCByYW1wVGltZSwgc3RhcnRUaW1lKSB7XG5cdCAgICAgICAgc3RhcnRUaW1lID0gdGhpcy50b1NlY29uZHMoc3RhcnRUaW1lKTtcblx0ICAgICAgICB0aGlzLnNldFJhbXBQb2ludChzdGFydFRpbWUpO1xuXHQgICAgICAgIHRoaXMuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2YWx1ZSwgc3RhcnRUaW1lICsgdGhpcy50b1NlY29uZHMocmFtcFRpbWUpKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2NoZWR1bGVzIGFuIGxpbmVhciBjb250aW51b3VzIGNoYW5nZSBpbiBwYXJhbWV0ZXIgdmFsdWUgZnJvbVxuXHRcdCAqICB0aGUgY3VycmVudCB0aW1lIGFuZCBjdXJyZW50IHZhbHVlIHRvIHRoZSBnaXZlbiB2YWx1ZSBvdmVyIHRoZVxuXHRcdCAqICBkdXJhdGlvbiBvZiB0aGUgcmFtcFRpbWUuXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7bnVtYmVyfSB2YWx1ZSAgIFRoZSB2YWx1ZSB0byByYW1wIHRvLlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSByYW1wVGltZSB0aGUgdGltZSB0aGF0IGl0IHRha2VzIHRoZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHRvIHJhbXAgZnJvbSBpdCdzIGN1cnJlbnQgdmFsdWVcblx0XHQgKiAgQHBhcmFtIHtUaW1lfVx0W3N0YXJ0VGltZT1ub3ddIFx0V2hlbiB0aGUgcmFtcCBzaG91bGQgc3RhcnQuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBhcmFtfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9saW5lYXJseSByYW1wIHRvIHRoZSB2YWx1ZSA0IG92ZXIgMyBzZWNvbmRzLlxuXHRcdCAqIHNpZ25hbC5saW5lYXJSYW1wVG8oNCwgMyk7XG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5saW5lYXJSYW1wVG8gPSBmdW5jdGlvbiAodmFsdWUsIHJhbXBUaW1lLCBzdGFydFRpbWUpIHtcblx0ICAgICAgICBzdGFydFRpbWUgPSB0aGlzLnRvU2Vjb25kcyhzdGFydFRpbWUpO1xuXHQgICAgICAgIHRoaXMuc2V0UmFtcFBvaW50KHN0YXJ0VGltZSk7XG5cdCAgICAgICAgdGhpcy5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh2YWx1ZSwgc3RhcnRUaW1lICsgdGhpcy50b1NlY29uZHMocmFtcFRpbWUpKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU3RhcnQgZXhwb25lbnRpYWxseSBhcHByb2FjaGluZyB0aGUgdGFyZ2V0IHZhbHVlIGF0IHRoZSBnaXZlbiB0aW1lLiBTaW5jZSBpdFxuXHRcdCAqICBpcyBhbiBleHBvbmVudGlhbCBhcHByb2FjaCBpdCB3aWxsIGNvbnRpbnVlIGFwcHJvYWNoaW5nIGFmdGVyIHRoZSByYW1wIGR1cmF0aW9uLiBUaGVcblx0XHQgKiAgcmFtcFRpbWUgaXMgdGhlIHRpbWUgdGhhdCBpdCB0YWtlcyB0byByZWFjaCBvdmVyIDk5JSBvZiB0aGUgd2F5IHRvd2FyZHMgdGhlIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0gIHtudW1iZXJ9IHZhbHVlICAgVGhlIHZhbHVlIHRvIHJhbXAgdG8uXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IHJhbXBUaW1lIHRoZSB0aW1lIHRoYXQgaXQgdGFrZXMgdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgdG8gcmFtcCBmcm9tIGl0J3MgY3VycmVudCB2YWx1ZVxuXHRcdCAqICBAcGFyYW0ge1RpbWV9XHRbc3RhcnRUaW1lPW5vd10gXHRXaGVuIHRoZSByYW1wIHNob3VsZCBzdGFydC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGFyYW19IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2V4cG9uZW50aWFsbHkgcmFtcCB0byB0aGUgdmFsdWUgMiBvdmVyIDQgc2Vjb25kcy5cblx0XHQgKiBzaWduYWwuZXhwb25lbnRpYWxSYW1wVG8oMiwgNCk7XG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS50YXJnZXRSYW1wVG8gPSBmdW5jdGlvbiAodmFsdWUsIHJhbXBUaW1lLCBzdGFydFRpbWUpIHtcblx0ICAgICAgICBzdGFydFRpbWUgPSB0aGlzLnRvU2Vjb25kcyhzdGFydFRpbWUpO1xuXHQgICAgICAgIHRoaXMuc2V0UmFtcFBvaW50KHN0YXJ0VGltZSk7XG5cdCAgICAgICAgdGhpcy5leHBvbmVudGlhbEFwcHJvYWNoVmFsdWVBdFRpbWUodmFsdWUsIHN0YXJ0VGltZSwgcmFtcFRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdGFydCBleHBvbmVudGlhbGx5IGFwcHJvYWNoaW5nIHRoZSB0YXJnZXQgdmFsdWUgYXQgdGhlIGdpdmVuIHRpbWUuIFNpbmNlIGl0XG5cdFx0ICogIGlzIGFuIGV4cG9uZW50aWFsIGFwcHJvYWNoIGl0IHdpbGwgY29udGludWUgYXBwcm9hY2hpbmcgYWZ0ZXIgdGhlIHJhbXAgZHVyYXRpb24uIFRoZVxuXHRcdCAqICByYW1wVGltZSBpcyB0aGUgdGltZSB0aGF0IGl0IHRha2VzIHRvIHJlYWNoIG92ZXIgOTklIG9mIHRoZSB3YXkgdG93YXJkcyB0aGUgdmFsdWUuIFRoaXMgbWV0aG9kc1xuXHRcdCAqICBpcyBzaW1pbGFyIHRvIHNldFRhcmdldEF0VGltZSBleGNlcHQgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIGEgdGltZSBpbnN0ZWFkIG9mIGEgJ3RpbWVDb25zdGFudCdcblx0XHQgKiAgQHBhcmFtICB7bnVtYmVyfSB2YWx1ZSAgIFRoZSB2YWx1ZSB0byByYW1wIHRvLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9XHR0aW1lIFx0V2hlbiB0aGUgcmFtcCBzaG91bGQgc3RhcnQuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IHJhbXBUaW1lIHRoZSB0aW1lIHRoYXQgaXQgdGFrZXMgdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgdG8gcmFtcCBmcm9tIGl0J3MgY3VycmVudCB2YWx1ZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QYXJhbX0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vZXhwb25lbnRpYWxseSByYW1wIHRvIHRoZSB2YWx1ZSAyIG92ZXIgNCBzZWNvbmRzLlxuXHRcdCAqIHNpZ25hbC5leHBvbmVudGlhbFJhbXBUbygyLCA0KTtcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFyYW0ucHJvdG90eXBlLmV4cG9uZW50aWFsQXBwcm9hY2hWYWx1ZUF0VGltZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdGltZSwgcmFtcFRpbWUpIHtcblx0ICAgICAgICB2YXIgdGltZUNvbnN0YW50ID0gTWF0aC5sb2codGhpcy50b1NlY29uZHMocmFtcFRpbWUpICsgMSkgLyBNYXRoLmxvZygyMDApO1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5zZXRUYXJnZXRBdFRpbWUodmFsdWUsIHRpbWUsIHRpbWVDb25zdGFudCk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN0YXJ0IGV4cG9uZW50aWFsbHkgYXBwcm9hY2hpbmcgdGhlIHRhcmdldCB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdGltZSB3aXRoXG5cdFx0ICogIGEgcmF0ZSBoYXZpbmcgdGhlIGdpdmVuIHRpbWUgY29uc3RhbnQuXG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IHN0YXJ0VGltZVxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gdGltZUNvbnN0YW50XG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBhcmFtfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5zZXRUYXJnZXRBdFRpbWUgPSBmdW5jdGlvbiAodmFsdWUsIHN0YXJ0VGltZSwgdGltZUNvbnN0YW50KSB7XG5cdCAgICAgICAgdmFsdWUgPSB0aGlzLl9mcm9tVW5pdHModmFsdWUpO1xuXHQgICAgICAgIC8vIFRoZSB2YWx1ZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gYXBwcm9hY2ggd2l0aG91dCB0aW1lQ29uc3RhbnQgPiAwLlxuXHQgICAgICAgIGlmICh0aW1lQ29uc3RhbnQgPD0gMCkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbWVDb25zdGFudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHN0YXJ0VGltZSA9IHRoaXMudG9TZWNvbmRzKHN0YXJ0VGltZSk7XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmFkZCh7XG5cdCAgICAgICAgICAgICd0eXBlJzogVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5UYXJnZXQsXG5cdCAgICAgICAgICAgICd2YWx1ZSc6IHZhbHVlLFxuXHQgICAgICAgICAgICAndGltZSc6IHN0YXJ0VGltZSxcblx0ICAgICAgICAgICAgJ2NvbnN0YW50JzogdGltZUNvbnN0YW50XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fcGFyYW0uc2V0VGFyZ2V0QXRUaW1lKHZhbHVlLCBzdGFydFRpbWUsIHRpbWVDb25zdGFudCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNldHMgYW4gYXJyYXkgb2YgYXJiaXRyYXJ5IHBhcmFtZXRlciB2YWx1ZXMgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHRpbWVcblx0XHQgKiAgZm9yIHRoZSBnaXZlbiBkdXJhdGlvbi5cblx0XHQgKlxuXHRcdCAqICBAcGFyYW0ge0FycmF5fSB2YWx1ZXNcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBzdGFydFRpbWVcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBkdXJhdGlvblxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfSBbc2NhbGluZz0xXSBJZiB0aGUgdmFsdWVzIGluIHRoZSBjdXJ2ZSBzaG91bGQgYmUgc2NhbGVkIGJ5IHNvbWUgdmFsdWVcblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGFyYW19IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFyYW0ucHJvdG90eXBlLnNldFZhbHVlQ3VydmVBdFRpbWUgPSBmdW5jdGlvbiAodmFsdWVzLCBzdGFydFRpbWUsIGR1cmF0aW9uLCBzY2FsaW5nKSB7XG5cdCAgICAgICAgc2NhbGluZyA9IFRvbmUuZGVmYXVsdEFyZyhzY2FsaW5nLCAxKTtcblx0ICAgICAgICBkdXJhdGlvbiA9IHRoaXMudG9TZWNvbmRzKGR1cmF0aW9uKTtcblx0ICAgICAgICBzdGFydFRpbWUgPSB0aGlzLnRvU2Vjb25kcyhzdGFydFRpbWUpO1xuXHQgICAgICAgIHRoaXMuc2V0VmFsdWVBdFRpbWUodmFsdWVzWzBdICogc2NhbGluZywgc3RhcnRUaW1lKTtcblx0ICAgICAgICB2YXIgc2VnVGltZSA9IGR1cmF0aW9uIC8gKHZhbHVlcy5sZW5ndGggLSAxKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB0aGlzLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHZhbHVlc1tpXSAqIHNjYWxpbmcsIHN0YXJ0VGltZSArIGkgKiBzZWdUaW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENhbmNlbHMgYWxsIHNjaGVkdWxlZCBwYXJhbWV0ZXIgY2hhbmdlcyB3aXRoIHRpbWVzIGdyZWF0ZXIgdGhhbiBvclxuXHRcdCAqICBlcXVhbCB0byBzdGFydFRpbWUuXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gdGltZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QYXJhbX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJhbS5wcm90b3R5cGUuY2FuY2VsU2NoZWR1bGVkVmFsdWVzID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmNhbmNlbCh0aW1lKTtcblx0ICAgICAgICB0aGlzLl9wYXJhbS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXModGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoaXMgaXMgc2ltaWxhciB0byBbY2FuY2VsU2NoZWR1bGVkVmFsdWVzXSgjY2FuY2VsU2NoZWR1bGVkVmFsdWVzKSBleGNlcHRcblx0XHQgKiAgaXQgaG9sZHMgdGhlIGF1dG9tYXRlZCB2YWx1ZSBhdCB0aW1lIHVudGlsIHRoZSBuZXh0IGF1dG9tYXRlZCBldmVudC5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gdGltZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QYXJhbX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJhbS5wcm90b3R5cGUuY2FuY2VsQW5kSG9sZEF0VGltZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdmFyIHZhbHVlQXRUaW1lID0gdGhpcy5nZXRWYWx1ZUF0VGltZSh0aW1lKTtcblx0ICAgICAgICAvL2lmIHRoZXJlIGlzIGFuIGV2ZW50IGF0IHRoZSBnaXZlbiB0aW1lXG5cdCAgICAgICAgLy9hbmQgdGhhdCBldmVuIGlzIG5vdCBhIFwic2V0XCJcblx0ICAgICAgICB2YXIgYmVmb3JlID0gdGhpcy5fZXZlbnRzLmdldCh0aW1lKTtcblx0ICAgICAgICB2YXIgYWZ0ZXIgPSB0aGlzLl9ldmVudHMuZ2V0QWZ0ZXIodGltZSk7XG5cdCAgICAgICAgaWYgKGJlZm9yZSAmJiBiZWZvcmUudGltZSA9PT0gdGltZSkge1xuXHQgICAgICAgICAgICAvL3JlbW92ZSBldmVyeXRoaW5nIGFmdGVyXG5cdCAgICAgICAgICAgIGlmIChhZnRlcikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmNhbmNlbChhZnRlci50aW1lKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50cy5jYW5jZWwodGltZSArIDAuMDAwMDAxKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXIpIHtcblx0ICAgICAgICAgICAgLy9jYW5jZWwgdGhlIG5leHQgZXZlbnQocylcblx0ICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmNhbmNlbChhZnRlci50aW1lKTtcblx0ICAgICAgICAgICAgaWYgKCF0aGlzLl9wYXJhbS5jYW5jZWxBbmRIb2xkQXRUaW1lKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXModGltZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKGFmdGVyLnR5cGUgPT09IFRvbmUuUGFyYW0uQXV0b21hdGlvblR5cGUuTGluZWFyKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3BhcmFtLmNhbmNlbEFuZEhvbGRBdFRpbWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHZhbHVlQXRUaW1lLCB0aW1lKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmFkZCh7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXIsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IHZhbHVlQXRUaW1lLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAndGltZSc6IHRpbWVcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChhZnRlci50eXBlID09PSBUb25lLlBhcmFtLkF1dG9tYXRpb25UeXBlLkV4cG9uZW50aWFsKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3BhcmFtLmNhbmNlbEFuZEhvbGRBdFRpbWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUodmFsdWVBdFRpbWUsIHRpbWUpO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMuYWRkKHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiBUb25lLlBhcmFtLkF1dG9tYXRpb25UeXBlLkV4cG9uZW50aWFsLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWx1ZUF0VGltZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWUnOiB0aW1lXG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9zZXQgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiB0aW1lXG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmFkZCh7XG5cdCAgICAgICAgICAgICd0eXBlJzogVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5TZXRWYWx1ZSxcblx0ICAgICAgICAgICAgJ3ZhbHVlJzogdmFsdWVBdFRpbWUsXG5cdCAgICAgICAgICAgICd0aW1lJzogdGltZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGlmICh0aGlzLl9wYXJhbS5jYW5jZWxBbmRIb2xkQXRUaW1lKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3BhcmFtLmNhbmNlbEFuZEhvbGRBdFRpbWUodGltZSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGFyYW0uc2V0VmFsdWVBdFRpbWUodmFsdWVBdFRpbWUsIHRpbWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmFtcHMgdG8gdGhlIGdpdmVuIHZhbHVlIG92ZXIgdGhlIGR1cmF0aW9uIG9mIHRoZSByYW1wVGltZS5cblx0XHQgKiAgQXV0b21hdGljYWxseSBzZWxlY3RzIHRoZSBiZXN0IHJhbXAgdHlwZSAoZXhwb25lbnRpYWwgb3IgbGluZWFyKVxuXHRcdCAqICBkZXBlbmRpbmcgb24gdGhlIGB1bml0c2Agb2YgdGhlIHNpZ25hbFxuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSAge251bWJlcn0gdmFsdWVcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gcmFtcFRpbWUgXHRUaGUgdGltZSB0aGF0IGl0IHRha2VzIHRoZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgdG8gcmFtcCBmcm9tIGl0J3MgY3VycmVudCB2YWx1ZVxuXHRcdCAqICBAcGFyYW0ge1RpbWV9XHRbc3RhcnRUaW1lPW5vd10gXHRXaGVuIHRoZSByYW1wIHNob3VsZCBzdGFydC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGFyYW19IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL3JhbXAgdG8gdGhlIHZhbHVlIGVpdGhlciBsaW5lYXJseSBvciBleHBvbmVudGlhbGx5XG5cdFx0ICogLy9kZXBlbmRpbmcgb24gdGhlIFwidW5pdHNcIiB2YWx1ZSBvZiB0aGUgc2lnbmFsXG5cdFx0ICogc2lnbmFsLnJhbXBUbygwLCAxMCk7XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9zY2hlZHVsZSBpdCB0byByYW1wIHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWMgdGltZVxuXHRcdCAqIHNpZ25hbC5yYW1wVG8oMCwgMTAsIDUpXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5yYW1wVG8gPSBmdW5jdGlvbiAodmFsdWUsIHJhbXBUaW1lLCBzdGFydFRpbWUpIHtcblx0ICAgICAgICByYW1wVGltZSA9IFRvbmUuZGVmYXVsdEFyZyhyYW1wVGltZSwgMC4xKTtcblx0ICAgICAgICBpZiAodGhpcy51bml0cyA9PT0gVG9uZS5UeXBlLkZyZXF1ZW5jeSB8fCB0aGlzLnVuaXRzID09PSBUb25lLlR5cGUuQlBNIHx8IHRoaXMudW5pdHMgPT09IFRvbmUuVHlwZS5EZWNpYmVscykge1xuXHQgICAgICAgICAgICB0aGlzLmV4cG9uZW50aWFsUmFtcFRvKHZhbHVlLCByYW1wVGltZSwgc3RhcnRUaW1lKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmxpbmVhclJhbXBUbyh2YWx1ZSwgcmFtcFRpbWUsIHN0YXJ0VGltZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdEFVVE9NQVRJT04gQ1VSVkUgQ0FMQ1VMQVRJT05TXG5cdCAgICAvL1x0TUlUIExpY2Vuc2UsIGNvcHlyaWdodCAoYykgMjAxNCBKb3JkYW4gU2FudGVsbFxuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvLyBDYWxjdWxhdGVzIHRoZSB0aGUgdmFsdWUgYWxvbmcgdGhlIGN1cnZlIHByb2R1Y2VkIGJ5IHNldFRhcmdldEF0VGltZVxuXHQgICAgVG9uZS5QYXJhbS5wcm90b3R5cGUuX2V4cG9uZW50aWFsQXBwcm9hY2ggPSBmdW5jdGlvbiAodDAsIHYwLCB2MSwgdGltZUNvbnN0YW50LCB0KSB7XG5cdCAgICAgICAgcmV0dXJuIHYxICsgKHYwIC0gdjEpICogTWF0aC5leHAoLSh0IC0gdDApIC8gdGltZUNvbnN0YW50KTtcblx0ICAgIH07XG5cdCAgICAvLyBDYWxjdWxhdGVzIHRoZSB0aGUgdmFsdWUgYWxvbmcgdGhlIGN1cnZlIHByb2R1Y2VkIGJ5IGxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5fbGluZWFySW50ZXJwb2xhdGUgPSBmdW5jdGlvbiAodDAsIHYwLCB0MSwgdjEsIHQpIHtcblx0ICAgICAgICByZXR1cm4gdjAgKyAodjEgLSB2MCkgKiAoKHQgLSB0MCkgLyAodDEgLSB0MCkpO1xuXHQgICAgfTtcblx0ICAgIC8vIENhbGN1bGF0ZXMgdGhlIHRoZSB2YWx1ZSBhbG9uZyB0aGUgY3VydmUgcHJvZHVjZWQgYnkgZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZVxuXHQgICAgVG9uZS5QYXJhbS5wcm90b3R5cGUuX2V4cG9uZW50aWFsSW50ZXJwb2xhdGUgPSBmdW5jdGlvbiAodDAsIHYwLCB0MSwgdjEsIHQpIHtcblx0ICAgICAgICByZXR1cm4gdjAgKiBNYXRoLnBvdyh2MSAvIHYwLCAodCAtIHQwKSAvICh0MSAtIHQwKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBhcmFtfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fcGFyYW0gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2V2ZW50cyA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuUGFyYW07XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgV3JhcHBlciBhcm91bmQgdGhlIE9mZmxpbmVBdWRpb0NvbnRleHRcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQ29udGV4dH1cblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgY2hhbm5lbHMgIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gcmVuZGVyXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIGR1cmF0aW9uICBUaGUgZHVyYXRpb24gdG8gcmVuZGVyIGluIHNhbXBsZXNcblx0XHQgKiAgQHBhcmFtIHtOdW1iZXJ9IHNhbXBsZVJhdGUgdGhlIHNhbXBsZSByYXRlIHRvIHJlbmRlciBhdFxuXHRcdCAqL1xuXHQgICAgVG9uZS5PZmZsaW5lQ29udGV4dCA9IGZ1bmN0aW9uIChjaGFubmVscywgZHVyYXRpb24sIHNhbXBsZVJhdGUpIHtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgb2ZmbGluZSBjb250ZXh0XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqICBAdHlwZSAge09mZmxpbmVBdWRpb0NvbnRleHR9XG5cdFx0XHQgKi9cblx0ICAgICAgICB2YXIgb2ZmbGluZUNvbnRleHQgPSBuZXcgT2ZmbGluZUF1ZGlvQ29udGV4dChjaGFubmVscywgZHVyYXRpb24gKiBzYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTtcblx0ICAgICAgICAvL3dyYXAgdGhlIG1ldGhvZHMvbWVtYmVyc1xuXHQgICAgICAgIFRvbmUuQ29udGV4dC5jYWxsKHRoaXMsIHtcblx0ICAgICAgICAgICAgJ2NvbnRleHQnOiBvZmZsaW5lQ29udGV4dCxcblx0ICAgICAgICAgICAgJ2Nsb2NrU291cmNlJzogJ29mZmxpbmUnLFxuXHQgICAgICAgICAgICAnbG9va0FoZWFkJzogMCxcblx0ICAgICAgICAgICAgJ3VwZGF0ZUludGVydmFsJzogMTI4IC8gc2FtcGxlUmF0ZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEEgcHJpdmF0ZSByZWZlcmVuY2UgdG8gdGhlIGR1cmF0aW9uXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2R1cmF0aW9uID0gZHVyYXRpb247XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQW4gYXJ0aWZpY2lhbCBjbG9jayBzb3VyY2Vcblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fY3VycmVudFRpbWUgPSAwO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuT2ZmbGluZUNvbnRleHQsIFRvbmUuQ29udGV4dCk7XG5cdCAgICAvKipcblx0XHQgKiAgT3ZlcnJpZGUgdGhlIG5vdyBtZXRob2QgdG8gcG9pbnQgdG8gdGhlIGludGVybmFsIGNsb2NrIHRpbWVcblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKi9cblx0ICAgIFRvbmUuT2ZmbGluZUNvbnRleHQucHJvdG90eXBlLm5vdyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRpbWU7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJlbmRlciB0aGUgb3V0cHV0IG9mIHRoZSBPZmZsaW5lQ29udGV4dFxuXHRcdCAqICBAcmV0dXJuICB7UHJvbWlzZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuT2ZmbGluZUNvbnRleHQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB3aGlsZSAodGhpcy5fZHVyYXRpb24gLSB0aGlzLl9jdXJyZW50VGltZSA+PSAwKSB7XG5cdCAgICAgICAgICAgIC8vaW52b2tlIGFsbCB0aGUgY2FsbGJhY2tzIG9uIHRoYXQgdGltZVxuXHQgICAgICAgICAgICB0aGlzLmVtaXQoJ3RpY2snKTtcblx0ICAgICAgICAgICAgLy9pbmNyZW1lbnQgdGhlIGNsb2NrXG5cdCAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUaW1lICs9IHRoaXMuYmxvY2tUaW1lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy5fY29udGV4dC5zdGFydFJlbmRlcmluZygpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbG9zZSB0aGUgY29udGV4dFxuXHRcdCAqICBAcmV0dXJuICB7UHJvbWlzZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuT2ZmbGluZUNvbnRleHQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5PZmZsaW5lQ29udGV4dDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgaWYgKFRvbmUuc3VwcG9ydGVkKSB7XG5cdCAgICAgICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuXHQgICAgICAgIHZhciBpc01vYmlsZVNhZmFyaSA9IHVhLmluY2x1ZGVzKCdzYWZhcmknKSAmJiAhdWEuaW5jbHVkZXMoJ2Nocm9tZScpICYmIHVhLmluY2x1ZGVzKCdtb2JpbGUnKTtcblx0ICAgICAgICBpZiAoaXNNb2JpbGVTYWZhcmkpIHtcblx0ICAgICAgICAgICAgLy9tb2JpbGUgc2FmYXJpIGhhcyBhIGJpemFycmUgYnVnIHdpdGggdGhlIG9mZmxpbmUgY29udGV4dFxuXHQgICAgICAgICAgICAvL3doZW4gYSBCdWZmZXJTb3VyY2VOb2RlIGlzIHN0YXJ0ZWQsIGl0IHN0YXJ0cyB0aGUgb2ZmbGluZSBjb250ZXh0XG5cdCAgICAgICAgICAgIC8vXG5cdCAgICAgICAgICAgIC8vZGVmZXJyaW5nIGFsbCBCdWZmZXJTb3VyY2Ugc3RhcnRzIHRpbGwgdGhlIGxhc3QgcG9zc2libGUgbW9tZW50XG5cdCAgICAgICAgICAgIC8vcmVkdWNlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGlzIGhhcHBlbmluZ1xuXHQgICAgICAgICAgICBUb25lLk9mZmxpbmVDb250ZXh0LnByb3RvdHlwZS5jcmVhdGVCdWZmZXJTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYnVmZmVyU291cmNlID0gdGhpcy5fY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcblx0ICAgICAgICAgICAgICAgIHZhciBfbmF0aXZlX3N0YXJ0ID0gYnVmZmVyU291cmNlLnN0YXJ0O1xuXHQgICAgICAgICAgICAgICAgYnVmZmVyU291cmNlLnN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBfbmF0aXZlX3N0YXJ0LmNhbGwoYnVmZmVyU291cmNlLCB0aW1lKTtcblx0ICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIDApO1xuXHQgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclNvdXJjZTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBBIHRoaW4gd3JhcHBlciBhcm91bmQgdGhlIE5hdGl2ZSBXZWIgQXVkaW8gR2Fpbk5vZGUuXG5cdFx0ICogICAgICAgICBUaGUgR2Fpbk5vZGUgaXMgYSBiYXNpYyBidWlsZGluZyBibG9jayBvZiB0aGUgV2ViIEF1ZGlvXG5cdFx0ICogICAgICAgICBBUEkgYW5kIGlzIHVzZWZ1bCBmb3Igcm91dGluZyBhdWRpbyBhbmQgYWRqdXN0aW5nIGdhaW5zLlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyPX0gIGdhaW4gIFRoZSBpbml0aWFsIGdhaW4gb2YgdGhlIEdhaW5Ob2RlXG5cdFx0ICogIEBwYXJhbSB7VG9uZS5UeXBlPX0gdW5pdHMgVGhlIHVuaXRzIG9mIHRoZSBnYWluIHBhcmFtZXRlci5cblx0XHQgKi9cblx0ICAgIFRvbmUuR2FpbiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdnYWluJyxcblx0ICAgICAgICAgICAgJ3VuaXRzJ1xuXHQgICAgICAgIF0sIFRvbmUuR2Fpbik7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgR2Fpbk5vZGVcblx0XHRcdCAqICBAdHlwZSAge0dhaW5Ob2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSB0aGlzLl9nYWluTm9kZSA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGdhaW4gcGFyYW1ldGVyIG9mIHRoZSBnYWluIG5vZGUuXG5cdFx0XHQgKiAgQHR5cGUge0dhaW59XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5nYWluID0gbmV3IFRvbmUuUGFyYW0oe1xuXHQgICAgICAgICAgICAncGFyYW0nOiB0aGlzLl9nYWluTm9kZS5nYWluLFxuXHQgICAgICAgICAgICAndW5pdHMnOiBvcHRpb25zLnVuaXRzLFxuXHQgICAgICAgICAgICAndmFsdWUnOiBvcHRpb25zLmdhaW4sXG5cdCAgICAgICAgICAgICdjb252ZXJ0Jzogb3B0aW9ucy5jb252ZXJ0XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoJ2dhaW4nKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkdhaW4sIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5HYWluLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdnYWluJzogMSxcblx0ICAgICAgICAnY29udmVydCc6IHRydWVcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkdhaW59ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkdhaW4ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9nYWluTm9kZS5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgdGhpcy5fZ2Fpbk5vZGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCdnYWluJyk7XG5cdCAgICAgICAgdGhpcy5nYWluLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmdhaW4gPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkdhaW47XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIGlmIChUb25lLnN1cHBvcnRlZCAmJiAhQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDb25zdGFudFNvdXJjZSkge1xuXHQgICAgICAgIHZhciBDb25zdGFudFNvdXJjZU5vZGUgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXHQgICAgICAgICAgICB2YXIgYnVmZmVyID0gY29udGV4dC5jcmVhdGVCdWZmZXIoMSwgMTI4LCBjb250ZXh0LnNhbXBsZVJhdGUpO1xuXHQgICAgICAgICAgICB2YXIgYXJyID0gYnVmZmVyLmdldENoYW5uZWxEYXRhKDApO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgYXJyW2ldID0gMTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLl9idWZmZXJTb3VyY2UgPSBjb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuXHQgICAgICAgICAgICB0aGlzLl9idWZmZXJTb3VyY2UuY2hhbm5lbENvdW50ID0gMTtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVyU291cmNlLmNoYW5uZWxDb3VudE1vZGUgPSAnZXhwbGljaXQnO1xuXHQgICAgICAgICAgICB0aGlzLl9idWZmZXJTb3VyY2UuYnVmZmVyID0gYnVmZmVyO1xuXHQgICAgICAgICAgICB0aGlzLl9idWZmZXJTb3VyY2UubG9vcCA9IHRydWU7XG5cdCAgICAgICAgICAgIHZhciBnYWluTm9kZSA9IHRoaXMuX291dHB1dCA9IGNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHQgICAgICAgICAgICB0aGlzLm9mZnNldCA9IGdhaW5Ob2RlLmdhaW47XG5cdCAgICAgICAgICAgIHRoaXMuX2J1ZmZlclNvdXJjZS5jb25uZWN0KGdhaW5Ob2RlKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIENvbnN0YW50U291cmNlTm9kZS5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9idWZmZXJTb3VyY2Uuc3RhcnQodGltZSk7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgQ29uc3RhbnRTb3VyY2VOb2RlLnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVyU291cmNlLnN0b3AodGltZSk7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgQ29uc3RhbnRTb3VyY2VOb2RlLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0aGlzLl9vdXRwdXQuY29ubmVjdC5hcHBseSh0aGlzLl9vdXRwdXQsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgQ29uc3RhbnRTb3VyY2VOb2RlLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0aGlzLl9vdXRwdXQuZGlzY29ubmVjdC5hcHBseSh0aGlzLl9vdXRwdXQsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVDb25zdGFudFNvdXJjZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudFNvdXJjZU5vZGUodGhpcyk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBUb25lLkNvbnRleHQucHJvdG90eXBlLmNyZWF0ZUNvbnN0YW50U291cmNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IENvbnN0YW50U291cmNlTm9kZSh0aGlzKTtcblx0ICAgICAgICB9O1xuXHQgICAgfVxuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIEEgc2lnbmFsIGlzIGFuIGF1ZGlvLXJhdGUgdmFsdWUuIFRvbmUuU2lnbmFsIGlzIGEgY29yZSBjb21wb25lbnQgb2YgdGhlIGxpYnJhcnkuXG5cdFx0ICogICAgICAgICAgVW5saWtlIGEgbnVtYmVyLCBTaWduYWxzIGNhbiBiZSBzY2hlZHVsZWQgd2l0aCBzYW1wbGUtbGV2ZWwgYWNjdXJhY3kuIFRvbmUuU2lnbmFsXG5cdFx0ICogICAgICAgICAgaGFzIGFsbCBvZiB0aGUgbWV0aG9kcyBhdmFpbGFibGUgdG8gbmF0aXZlIFdlYiBBdWRpb1xuXHRcdCAqICAgICAgICAgIFtBdWRpb1BhcmFtXShodHRwOi8vd2ViYXVkaW8uZ2l0aHViLmlvL3dlYi1hdWRpby1hcGkvI3RoZS1hdWRpb3BhcmFtLWludGVyZmFjZSlcblx0XHQgKiAgICAgICAgICBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgY29udmVuaWVuY2VzLiBSZWFkIG1vcmUgYWJvdXQgd29ya2luZyB3aXRoIHNpZ25hbHNcblx0XHQgKiAgICAgICAgICBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL1RvbmVqcy9Ub25lLmpzL3dpa2kvU2lnbmFscykuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlBhcmFtfVxuXHRcdCAqICBAcGFyYW0ge051bWJlcnxBdWRpb1BhcmFtfSBbdmFsdWVdIEluaXRpYWwgdmFsdWUgb2YgdGhlIHNpZ25hbC4gSWYgYW4gQXVkaW9QYXJhbVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHBhc3NlZCBpbiwgdGhhdCBwYXJhbWV0ZXIgd2lsbCBiZSB3cmFwcGVkXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnRyb2xsZWQgYnkgdGhlIFNpZ25hbC5cblx0XHQgKiAgQHBhcmFtIHtzdHJpbmd9IFt1bml0cz1OdW1iZXJdIHVuaXQgVGhlIHVuaXRzIHRoZSBzaWduYWwgaXMgaW4uXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIHNpZ25hbCA9IG5ldyBUb25lLlNpZ25hbCgxMCk7XG5cdFx0ICovXG5cdCAgICBUb25lLlNpZ25hbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICd2YWx1ZScsXG5cdCAgICAgICAgICAgICd1bml0cydcblx0ICAgICAgICBdLCBUb25lLlNpZ25hbCk7XG5cdCAgICAgICAgVG9uZS5QYXJhbS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0KiBXaGVuIGEgc2lnbmFsIGlzIGNvbm5lY3RlZCB0byBhbm90aGVyIHNpZ25hbCBvciBhdWRpbyBwYXJhbSxcblx0XHRcdCogdGhpcyBzaWduYWwgYmVjb21lcyBhIHByb3h5IGZvciBpdFxuXHRcdFx0KiBAdHlwZSB7QXJyYXl9XG5cdFx0XHQqIEBwcml2YXRlXG5cdFx0XHQqL1xuXHQgICAgICAgIHRoaXMuX3Byb3hpZXMgPSBbXTtcblx0ICAgICAgICAvKipcblx0XHRcdCogSW5kaWNhdGVzIGlmIHRoZSBjb25zdGFudCBzb3VyY2Ugd2FzIHN0YXJ0ZWQgb3Igbm90XG5cdFx0XHQqIEBwcml2YXRlXG5cdFx0XHQqIEB0eXBlIHtCb29sZWFufVxuXHRcdFx0Ki9cblx0ICAgICAgICB0aGlzLl9zb3VyY2VTdGFydGVkID0gZmFsc2U7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgY29uc3RhbnQgc291cmNlIG5vZGUgd2hpY2ggZ2VuZXJhdGVzIHRoZSBzaWduYWxcblx0XHRcdCAqIEB0eXBlIHtDb25zdGFudFNvdXJjZU5vZGV9XG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fY29uc3RhbnRTb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQ29uc3RhbnRTb3VyY2UoKTtcblx0ICAgICAgICB0aGlzLl9wYXJhbSA9IHRoaXMuX2NvbnN0YW50U291cmNlLm9mZnNldDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBub2RlIHdoZXJlIHRoZSBjb25zdGFudCBzaWduYWwgdmFsdWUgaXMgc2NhbGVkLlxuXHRcdFx0ICogQHR5cGUge0dhaW5Ob2RlfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMub3V0cHV0ID0gdGhpcy5fY29uc3RhbnRTb3VyY2U7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgbm9kZSB3aGVyZSB0aGUgdmFsdWUgaXMgc2V0LlxuXHRcdFx0ICogQHR5cGUge1RvbmUuUGFyYW19XG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuX3BhcmFtID0gdGhpcy5vdXRwdXQub2Zmc2V0O1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuU2lnbmFsLCBUb25lLlBhcmFtKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdCB2YWx1ZXNcblx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICovXG5cdCAgICBUb25lLlNpZ25hbC5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAndmFsdWUnOiAwLFxuXHQgICAgICAgICd1bml0cyc6IFRvbmUuVHlwZS5EZWZhdWx0LFxuXHQgICAgICAgICdjb252ZXJ0JzogdHJ1ZVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBXaGVuIHNpZ25hbHMgY29ubmVjdCB0byBvdGhlciBzaWduYWxzIG9yIEF1ZGlvUGFyYW1zLFxuXHRcdCAqICB0aGV5IHRha2Ugb3ZlciB0aGUgb3V0cHV0IHZhbHVlIG9mIHRoYXQgc2lnbmFsIG9yIEF1ZGlvUGFyYW0uXG5cdFx0ICogIEZvciBhbGwgb3RoZXIgbm9kZXMsIHRoZSBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcyBhIGRlZmF1bHQgPGNvZGU+Y29ubmVjdDwvY29kZT4uXG5cdFx0ICpcblx0XHQgKiAgQG92ZXJyaWRlXG5cdFx0ICogIEBwYXJhbSB7QXVkaW9QYXJhbXxBdWRpb05vZGV8VG9uZS5TaWduYWx8VG9uZX0gbm9kZVxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW291dHB1dE51bWJlcj0wXSBUaGUgb3V0cHV0IG51bWJlciB0byBjb25uZWN0IGZyb20uXG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyfSBbaW5wdXROdW1iZXI9MF0gVGhlIGlucHV0IG51bWJlciB0byBjb25uZWN0IHRvLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5TaWduYWx9IHRoaXNcblx0XHQgKiAgQG1ldGhvZFxuXHRcdCAqL1xuXHQgICAgVG9uZS5TaWduYWwucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAobm9kZSkge1xuXHQgICAgICAgIC8vdGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gd2hlcmUgdGhpcyBub2RlIHdpbGwgZm9yd2FyZCBhdXRvbWF0aW9uc1xuXHQgICAgICAgIC8vdG8gY29ubmVjdGVkIG5vZGVzIHdpdGhvdXQgYW55IHNpZ25hbCBpZiBwb3NzaWJsZS5cblx0ICAgICAgICBpZiAodGhpcy5faXNQYXJhbShub2RlKSAmJiAhdGhpcy5fc291cmNlU3RhcnRlZCkge1xuXHQgICAgICAgICAgICB0aGlzLl9wcm94aWVzLnB1c2gobm9kZSk7XG5cdCAgICAgICAgICAgIG5vZGUub3ZlcnJpZGRlbiA9IHRydWU7XG5cdCAgICAgICAgICAgIHRoaXMuX2FwcGx5QXV0b21hdGlvbnMobm9kZSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5fc291cmNlU3RhcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlU3RhcnRlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9jb25zdGFudFNvdXJjZS5zdGFydCgwKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUYWtlcyBhIG5vZGUgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgaWYgaXQgaXMgYSBQYXJhbSBvciBBdWRpb1BhcmFtXG5cdFx0ICogQHBhcmFtICB7Kn0gbm9kZSBUaGUgbm9kZSB0byB0ZXN0XG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn1cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TaWduYWwucHJvdG90eXBlLl9pc1BhcmFtID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5QYXJhbSAmJiBUb25lLlBhcmFtID09PSBub2RlLmNvbnN0cnVjdG9yIHx8IG5vZGUgaW5zdGFuY2VvZiBBdWRpb1BhcmFtO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIERpc2NhcmQgdGhlIG9wdGltaXphdGlvbiBhbmQgY29ubmVjdCBhbGwgb2YgdGhlIHByb3hpZXNcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TaWduYWwucHJvdG90eXBlLl9jb25uZWN0UHJveGllcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZVN0YXJ0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc291cmNlU3RhcnRlZCA9IHRydWU7XG5cdCAgICAgICAgICAgIHRoaXMuX2NvbnN0YW50U291cmNlLnN0YXJ0KDApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9wcm94aWVzLmZvckVhY2goZnVuY3Rpb24gKHByb3h5KSB7XG5cdCAgICAgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5wcm90b3R5cGUuY29ubmVjdC5jYWxsKHRoaXMsIHByb3h5KTtcblx0ICAgICAgICAgICAgaWYgKHByb3h5Ll9wcm94aWVzKSB7XG5cdCAgICAgICAgICAgICAgICBwcm94eS5fY29ubmVjdFByb3hpZXMoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogSW52b2tlZCB3aGVuIGEgbm9kZSBpcyBjb25uZWN0ZWQgdG8gdGhpc1xuXHRcdCAqIEBwYXJhbSAge0F1ZGlvTm9kZX0gZnJvbVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlNpZ25hbC5wcm90b3R5cGUuX29uQ29ubmVjdCA9IGZ1bmN0aW9uIChmcm9tKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLl9pc1BhcmFtKGZyb20pKSB7XG5cdCAgICAgICAgICAgIC8vY29ubmVjdCBhbGwgdGhlIHByb3hpZXNcblx0ICAgICAgICAgICAgdGhpcy5fY29ubmVjdFByb3hpZXMoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogQXBwbHkgYWxsIHRoZSBjdXJyZW50IGF1dG9tYXRpb25zIHRvIHRoZSBnaXZlbiBwYXJhbWV0ZXJcblx0XHQgKiBAcGFyYW0gIHtBdWRpb1BhcmFtfSBwYXJhbVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlNpZ25hbC5wcm90b3R5cGUuX2FwcGx5QXV0b21hdGlvbnMgPSBmdW5jdGlvbiAocGFyYW0pIHtcblx0ICAgICAgICB2YXIgbm93ID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO1xuXHQgICAgICAgIHBhcmFtLmNhbmNlbFNjaGVkdWxlZFZhbHVlcyhub3cpO1xuXHQgICAgICAgIHZhciBjdXJyZW50VmFsID0gdGhpcy5nZXRWYWx1ZUF0VGltZShub3cpO1xuXHQgICAgICAgIHBhcmFtLnNldFZhbHVlQXRUaW1lKGN1cnJlbnRWYWwsIG5vdyk7XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmZvckVhY2hGcm9tKG5vdywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIHBhcmFtW2V2ZW50LnR5cGVdKGV2ZW50LnZhbHVlLCBldmVudC50aW1lLCBldmVudC5jb25zdGFudCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogRGlzY29ubmVjdCBmcm9tIHRoZSBnaXZlbiBub2RlIG9yIGFsbCBub2RlcyBpZiBubyBwYXJhbSBpcyBnaXZlbi5cblx0XHQgKiBAcGFyYW0gIHtBdWRpb05vZGV8QXVkaW9QYXJhbX0gbm9kZVxuXHRcdCAqIEByZXR1cm4ge1RvbmUuU2lnbmFsfSAgICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuU2lnbmFsLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBpZiAodGhpcy5fcHJveGllcy5pbmNsdWRlcyhub2RlKSkge1xuXHQgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9wcm94aWVzLmluZGV4T2Yobm9kZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX3Byb3hpZXMuc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKCFub2RlKSB7XG5cdCAgICAgICAgICAgIC8vbm8gYXJndW1lbnQsIGRpc2Nvbm5lY3QgZXZlcnl0aGluZ1xuXHQgICAgICAgICAgICB0aGlzLl9wcm94aWVzID0gW107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBUb25lLlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc2Nvbm5lY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc2lnbmFsIHZhbHVlIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqIEBwYXJhbSAge1RpbWV9IHRpbWUgV2hlbiB0byBnZXQgdGhlIHNpZ25hbCB2YWx1ZVxuXHRcdCAqIEByZXR1cm4ge051bWJlcn1cblx0XHQgKi9cblx0ICAgIFRvbmUuU2lnbmFsLnByb3RvdHlwZS5nZXRWYWx1ZUF0VGltZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX3BhcmFtLmdldFZhbHVlQXRUaW1lKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJhbS5nZXRWYWx1ZUF0VGltZSh0aW1lKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gVG9uZS5QYXJhbS5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWUuY2FsbCh0aGlzLCB0aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy93cmFwIGFsbCBvZiB0aGUgYXV0b21hdGlvbiBtZXRob2RzXG5cdCAgICBbXG5cdCAgICAgICAgJ3NldFZhbHVlQXRUaW1lJyxcblx0ICAgICAgICAnbGluZWFyUmFtcFRvVmFsdWVBdFRpbWUnLFxuXHQgICAgICAgICdleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lJyxcblx0ICAgICAgICAnc2V0VGFyZ2V0QXRUaW1lJ1xuXHQgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXNNZXRob2QgPSBUb25lLlNpZ25hbC5wcm90b3R5cGVbbWV0aG9kXTtcblx0ICAgICAgICBUb25lLlNpZ25hbC5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cdCAgICAgICAgICAgIHByZXZpb3VzTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgIGFyZ3NbMF0gPSB0aGlzLl9mcm9tVW5pdHMoYXJnc1swXSk7XG5cdCAgICAgICAgICAgIGFyZ3NbMV0gPSB0aGlzLnRvU2Vjb25kcyhhcmdzWzFdKTtcblx0ICAgICAgICAgICAgLy9hcHBseSBpdCB0byB0aGUgcHJveGllc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm94aWVzLmZvckVhY2goZnVuY3Rpb24gKHNpZ25hbCkge1xuXHQgICAgICAgICAgICAgICAgc2lnbmFsW21ldGhvZF0uYXBwbHkoc2lnbmFsLCBhcmdzKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfTtcblx0ICAgIH0pO1xuXHQgICAgW1xuXHQgICAgICAgICdjYW5jZWxTY2hlZHVsZWRWYWx1ZXMnLFxuXHQgICAgICAgICdjYW5jZWxBbmRIb2xkQXRUaW1lJ1xuXHQgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcblx0ICAgICAgICB2YXIgcHJldmlvdXNNZXRob2QgPSBUb25lLlNpZ25hbC5wcm90b3R5cGVbbWV0aG9kXTtcblx0ICAgICAgICBUb25lLlNpZ25hbC5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cdCAgICAgICAgICAgIHByZXZpb3VzTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgIGFyZ3NbMF0gPSB0aGlzLnRvU2Vjb25kcyhhcmdzWzBdKTtcblx0ICAgICAgICAgICAgLy9hcHBseSBpdCB0byB0aGUgcHJveGllc1xuXHQgICAgICAgICAgICB0aGlzLl9wcm94aWVzLmZvckVhY2goZnVuY3Rpb24gKHNpZ25hbCkge1xuXHQgICAgICAgICAgICAgICAgc2lnbmFsW21ldGhvZF0uYXBwbHkoc2lnbmFsLCBhcmdzKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfTtcblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIGRpc3Bvc2UgYW5kIGRpc2Nvbm5lY3Rcblx0XHQgKiAgQHJldHVybnMge1RvbmUuU2lnbmFsfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlNpZ25hbC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fY29uc3RhbnRTb3VyY2UuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX2NvbnN0YW50U291cmNlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9wcm94aWVzID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5TaWduYWw7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBQb3cgYXBwbGllcyBhbiBleHBvbmVudCB0byB0aGUgaW5jb21pbmcgc2lnbmFsLiBUaGUgaW5jb21pbmcgc2lnbmFsXG5cdFx0ICogICAgICAgICBtdXN0IGJlIEF1ZGlvUmFuZ2UuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuU2lnbmFsQmFzZX1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7UG9zaXRpdmV9IGV4cCBUaGUgZXhwb25lbnQgdG8gYXBwbHkgdG8gdGhlIGluY29taW5nIHNpZ25hbCwgbXVzdCBiZSBhdCBsZWFzdCAyLiBcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgcG93ID0gbmV3IFRvbmUuUG93KDIpO1xuXHRcdCAqIHZhciBzaWcgPSBuZXcgVG9uZS5TaWduYWwoMC41KS5jb25uZWN0KHBvdyk7XG5cdFx0ICogLy9vdXRwdXQgb2YgcG93IGlzIDAuMjUuIFxuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb3cgPSBmdW5jdGlvbiAoZXhwKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiB0aGUgZXhwb25lbnRcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZXhwID0gVG9uZS5kZWZhdWx0QXJnKGV4cCwgMSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1dhdmVTaGFwZXJOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9leHBTY2FsZXIgPSB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5XYXZlU2hhcGVyKHRoaXMuX2V4cEZ1bmModGhpcy5fZXhwKSwgODE5Mik7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5Qb3csIFRvbmUuU2lnbmFsQmFzZSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgdmFsdWUgb2YgdGhlIGV4cG9uZW50LlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlBvdyNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIHZhbHVlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Qb3cucHJvdG90eXBlLCAndmFsdWUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHA7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChleHApIHtcblx0ICAgICAgICAgICAgdGhpcy5fZXhwID0gZXhwO1xuXHQgICAgICAgICAgICB0aGlzLl9leHBTY2FsZXIuc2V0TWFwKHRoaXMuX2V4cEZ1bmModGhpcy5fZXhwKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGZ1bmN0aW9uIHdoaWNoIG1hcHMgdGhlIHdhdmVzaGFwZXJcblx0XHQgKiAgQHBhcmFtICAge251bWJlcn0gZXhwXG5cdFx0ICogIEByZXR1cm4ge2Z1bmN0aW9ufVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb3cucHJvdG90eXBlLl9leHBGdW5jID0gZnVuY3Rpb24gKGV4cCkge1xuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdyhNYXRoLmFicyh2YWwpLCBleHApO1xuXHQgICAgICAgIH07XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Qb3d9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUG93LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2V4cFNjYWxlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZXhwU2NhbGVyID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5Qb3c7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgVG9uZS5FbnZlbG9wZSBpcyBhbiBbQURTUl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ludGhlc2l6ZXIjQURTUl9lbnZlbG9wZSlcblx0XHQgKiAgICAgICAgICBlbnZlbG9wZSBnZW5lcmF0b3IuIFRvbmUuRW52ZWxvcGUgb3V0cHV0cyBhIHNpZ25hbCB3aGljaFxuXHRcdCAqICAgICAgICAgIGNhbiBiZSBjb25uZWN0ZWQgdG8gYW4gQXVkaW9QYXJhbSBvciBUb25lLlNpZ25hbC5cblx0XHQgKiAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvZS9lYS9BRFNSX3BhcmFtZXRlci5zdmdcIj5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFthdHRhY2tdIFRoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyBmb3IgdGhlIGVudmVsb3BlIHRvIGdvIGZyb21cblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAwIHRvIGl0J3MgbWF4aW11bSB2YWx1ZS5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbZGVjYXldXHRUaGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgdGhlIGF0dGFjayB0aGF0IGl0IHRha2VzIGZvciB0aGUgZW52ZWxvcGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgXHR0byBmYWxsIHRvIHRoZSBzdXN0YWluIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfSBbc3VzdGFpbl1cdFRoZSBwZXJjZW50IG9mIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIGVudmVsb3BlIHJlc3RzIGF0IHVudGlsXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0dGhlIHJlbGVhc2UgaXMgdHJpZ2dlcmVkLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFtyZWxlYXNlXVx0VGhlIGFtb3VudCBvZiB0aW1lIGFmdGVyIHRoZSByZWxlYXNlIGlzIHRyaWdnZXJlZCBpdCB0YWtlcyB0byByZWFjaCAwLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vYW4gYW1wbGl0dWRlIGVudmVsb3BlXG5cdFx0ICogdmFyIGdhaW5Ob2RlID0gVG9uZS5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0XHQgKiB2YXIgZW52ID0gbmV3IFRvbmUuRW52ZWxvcGUoe1xuXHRcdCAqIFx0XCJhdHRhY2tcIiA6IDAuMSxcblx0XHQgKiBcdFwiZGVjYXlcIiA6IDAuMixcblx0XHQgKiBcdFwic3VzdGFpblwiIDogMSxcblx0XHQgKiBcdFwicmVsZWFzZVwiIDogMC44LFxuXHRcdCAqIH0pO1xuXHRcdCAqIGVudi5jb25uZWN0KGdhaW5Ob2RlLmdhaW4pO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5FbnZlbG9wZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvL2dldCBhbGwgb2YgdGhlIGRlZmF1bHRzXG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnYXR0YWNrJyxcblx0ICAgICAgICAgICAgJ2RlY2F5Jyxcblx0ICAgICAgICAgICAgJ3N1c3RhaW4nLFxuXHQgICAgICAgICAgICAncmVsZWFzZSdcblx0ICAgICAgICBdLCBUb25lLkVudmVsb3BlKTtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFdoZW4gdHJpZ2dlckF0dGFjayBpcyBjYWxsZWQsIHRoZSBhdHRhY2sgdGltZSBpcyB0aGUgYW1vdW50IG9mXG5cdFx0XHQgKiAgdGltZSBpdCB0YWtlcyBmb3IgdGhlIGVudmVsb3BlIHRvIHJlYWNoIGl0J3MgbWF4aW11bSB2YWx1ZS5cblx0XHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuYXR0YWNrID0gb3B0aW9ucy5hdHRhY2s7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQWZ0ZXIgdGhlIGF0dGFjayBwb3J0aW9uIG9mIHRoZSBlbnZlbG9wZSwgdGhlIHZhbHVlIHdpbGwgZmFsbFxuXHRcdFx0ICogIG92ZXIgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWNheSB0aW1lIHRvIGl0J3Mgc3VzdGFpbiB2YWx1ZS5cblx0XHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGVjYXkgPSBvcHRpb25zLmRlY2F5O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogXHRUaGUgc3VzdGFpbiB2YWx1ZSBpcyB0aGUgdmFsdWVcblx0XHRcdCAqIFx0d2hpY2ggdGhlIGVudmVsb3BlIHJlc3RzIGF0IGFmdGVyIHRyaWdnZXJBdHRhY2sgaXNcblx0XHRcdCAqIFx0Y2FsbGVkLCBidXQgYmVmb3JlIHRyaWdnZXJSZWxlYXNlIGlzIGludm9rZWQuXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5zdXN0YWluID0gb3B0aW9ucy5zdXN0YWluO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEFmdGVyIHRyaWdnZXJSZWxlYXNlIGlzIGNhbGxlZCwgdGhlIGVudmVsb3BlJ3Ncblx0XHRcdCAqICB2YWx1ZSB3aWxsIGZhbGwgdG8gaXQncyBtaW1pbnVtIHZhbHVlIG92ZXIgdGhlXG5cdFx0XHQgKiAgZHVyYXRpb24gb2YgdGhlIHJlbGVhc2UgdGltZS5cblx0XHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucmVsZWFzZSA9IG9wdGlvbnMucmVsZWFzZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbmV4dCB0aW1lIHRoZSBlbnZlbG9wZSBpcyBhdCBzdGFuZGJ5XG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYXR0YWNrQ3VydmUgPSAnbGluZWFyJztcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbmV4dCB0aW1lIHRoZSBlbnZlbG9wZSBpcyBhdCBzdGFuZGJ5XG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcmVsZWFzZUN1cnZlID0gJ2V4cG9uZW50aWFsJztcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgc2lnbmFsXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuU2lnbmFsfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zaWcgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLlNpZ25hbCgwKTtcblx0ICAgICAgICAvL3NldCB0aGUgYXR0YWNrQ3VydmUgaW5pdGlhbGx5XG5cdCAgICAgICAgdGhpcy5hdHRhY2tDdXJ2ZSA9IG9wdGlvbnMuYXR0YWNrQ3VydmU7XG5cdCAgICAgICAgdGhpcy5yZWxlYXNlQ3VydmUgPSBvcHRpb25zLnJlbGVhc2VDdXJ2ZTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkVudmVsb3BlLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGRlZmF1bHQgcGFyYW1ldGVyc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqL1xuXHQgICAgVG9uZS5FbnZlbG9wZS5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnYXR0YWNrJzogMC4wMSxcblx0ICAgICAgICAnZGVjYXknOiAwLjEsXG5cdCAgICAgICAgJ3N1c3RhaW4nOiAwLjUsXG5cdCAgICAgICAgJ3JlbGVhc2UnOiAxLFxuXHQgICAgICAgICdhdHRhY2tDdXJ2ZSc6ICdsaW5lYXInLFxuXHQgICAgICAgICdyZWxlYXNlQ3VydmUnOiAnZXhwb25lbnRpYWwnXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogUmVhZCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZW52ZWxvcGUuIFVzZWZ1bCBmb3Jcblx0XHQgKiBzeW5jcm9uaXppbmcgdmlzdWFsIG91dHB1dCB0byB0aGUgZW52ZWxvcGUuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRW52ZWxvcGUjXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKiBAbmFtZSB2YWx1ZVxuXHRcdCAqIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRW52ZWxvcGUucHJvdG90eXBlLCAndmFsdWUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlQXRUaW1lKHRoaXMubm93KCkpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHNoYXBlIG9mIHRoZSBhdHRhY2suXG5cdFx0ICogQ2FuIGJlIGFueSBvZiB0aGVzZSBzdHJpbmdzOlxuXHRcdCAqIDx1bD5cblx0XHQgKiAgIDxsaT5saW5lYXI8L2xpPlxuXHRcdCAqICAgPGxpPmV4cG9uZW50aWFsPC9saT5cblx0XHQgKiAgIDxsaT5zaW5lPC9saT5cblx0XHQgKiAgIDxsaT5jb3NpbmU8L2xpPlxuXHRcdCAqICAgPGxpPmJvdW5jZTwvbGk+XG5cdFx0ICogICA8bGk+cmlwcGxlPC9saT5cblx0XHQgKiAgIDxsaT5zdGVwPC9saT5cblx0XHQgKiA8L3VsPlxuXHRcdCAqIENhbiBhbHNvIGJlIGFuIGFycmF5IHdoaWNoIGRlc2NyaWJlcyB0aGUgY3VydmUuIFZhbHVlc1xuXHRcdCAqIGluIHRoZSBhcnJheSBhcmUgZXZlbmx5IHN1YmRpdmlkZWQgYW5kIGxpbmVhcmx5XG5cdFx0ICogaW50ZXJwb2xhdGVkIG92ZXIgdGhlIGR1cmF0aW9uIG9mIHRoZSBhdHRhY2suXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRW52ZWxvcGUjXG5cdFx0ICogQHR5cGUge1N0cmluZ3xBcnJheX1cblx0XHQgKiBAbmFtZSBhdHRhY2tDdXJ2ZVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogZW52LmF0dGFja0N1cnZlID0gXCJsaW5lYXJcIjtcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vY2FuIGFsc28gYmUgYW4gYXJyYXlcblx0XHQgKiBlbnYuYXR0YWNrQ3VydmUgPSBbMCwgMC4yLCAwLjMsIDAuNCwgMV1cblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkVudmVsb3BlLnByb3RvdHlwZSwgJ2F0dGFja0N1cnZlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBpZiAoVG9uZS5pc1N0cmluZyh0aGlzLl9hdHRhY2tDdXJ2ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2tDdXJ2ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChUb25lLmlzQXJyYXkodGhpcy5fYXR0YWNrQ3VydmUpKSB7XG5cdCAgICAgICAgICAgICAgICAvL2xvb2sgdXAgdGhlIG5hbWUgaW4gdGhlIGN1cnZlcyBhcnJheVxuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgdHlwZSBpbiBUb25lLkVudmVsb3BlLlR5cGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoVG9uZS5FbnZlbG9wZS5UeXBlW3R5cGVdLkluID09PSB0aGlzLl9hdHRhY2tDdXJ2ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvL290aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgYXJyYXlcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRhY2tDdXJ2ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoY3VydmUpIHtcblx0ICAgICAgICAgICAgLy9jaGVjayBpZiBpdCdzIGEgdmFsaWQgdHlwZVxuXHQgICAgICAgICAgICBpZiAoVG9uZS5FbnZlbG9wZS5UeXBlLmhhc093blByb3BlcnR5KGN1cnZlKSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGN1cnZlRGVmID0gVG9uZS5FbnZlbG9wZS5UeXBlW2N1cnZlXTtcblx0ICAgICAgICAgICAgICAgIGlmIChUb25lLmlzT2JqZWN0KGN1cnZlRGVmKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2F0dGFja0N1cnZlID0gY3VydmVEZWYuSW47XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2F0dGFja0N1cnZlID0gY3VydmVEZWY7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoVG9uZS5pc0FycmF5KGN1cnZlKSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fYXR0YWNrQ3VydmUgPSBjdXJ2ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9uZS5FbnZlbG9wZTogaW52YWxpZCBjdXJ2ZTogJyArIGN1cnZlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHNoYXBlIG9mIHRoZSByZWxlYXNlLiBTZWUgdGhlIGF0dGFjayBjdXJ2ZSB0eXBlcy5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5FbnZlbG9wZSNcblx0XHQgKiBAdHlwZSB7U3RyaW5nfEFycmF5fVxuXHRcdCAqIEBuYW1lIHJlbGVhc2VDdXJ2ZVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogZW52LnJlbGVhc2VDdXJ2ZSA9IFwibGluZWFyXCI7XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5FbnZlbG9wZS5wcm90b3R5cGUsICdyZWxlYXNlQ3VydmUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmIChUb25lLmlzU3RyaW5nKHRoaXMuX3JlbGVhc2VDdXJ2ZSkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWxlYXNlQ3VydmU7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoVG9uZS5pc0FycmF5KHRoaXMuX3JlbGVhc2VDdXJ2ZSkpIHtcblx0ICAgICAgICAgICAgICAgIC8vbG9vayB1cCB0aGUgbmFtZSBpbiB0aGUgY3VydmVzIGFycmF5XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciB0eXBlIGluIFRvbmUuRW52ZWxvcGUuVHlwZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChUb25lLkVudmVsb3BlLlR5cGVbdHlwZV0uT3V0ID09PSB0aGlzLl9yZWxlYXNlQ3VydmUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy9vdGhlcndpc2UganVzdCByZXR1cm4gdGhlIGFycmF5XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVsZWFzZUN1cnZlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChjdXJ2ZSkge1xuXHQgICAgICAgICAgICAvL2NoZWNrIGlmIGl0J3MgYSB2YWxpZCB0eXBlXG5cdCAgICAgICAgICAgIGlmIChUb25lLkVudmVsb3BlLlR5cGUuaGFzT3duUHJvcGVydHkoY3VydmUpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY3VydmVEZWYgPSBUb25lLkVudmVsb3BlLlR5cGVbY3VydmVdO1xuXHQgICAgICAgICAgICAgICAgaWYgKFRvbmUuaXNPYmplY3QoY3VydmVEZWYpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVsZWFzZUN1cnZlID0gY3VydmVEZWYuT3V0O1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWxlYXNlQ3VydmUgPSBjdXJ2ZURlZjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIGlmIChUb25lLmlzQXJyYXkoY3VydmUpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9yZWxlYXNlQ3VydmUgPSBjdXJ2ZTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9uZS5FbnZlbG9wZTogaW52YWxpZCBjdXJ2ZTogJyArIGN1cnZlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRyaWdnZXIgdGhlIGF0dGFjay9kZWNheSBwb3J0aW9uIG9mIHRoZSBBRFNSIGVudmVsb3BlLlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbdGltZT1ub3ddIFdoZW4gdGhlIGF0dGFjayBzaG91bGQgc3RhcnQuXG5cdFx0ICogIEBwYXJhbSB7Tm9ybWFsUmFuZ2V9IFt2ZWxvY2l0eT0xXSBUaGUgdmVsb2NpdHkgb2YgdGhlIGVudmVsb3BlIHNjYWxlcyB0aGUgdmFsZXMuXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJldHdlZW4gMC0xXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkVudmVsb3BlfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogIC8vdHJpZ2dlciB0aGUgYXR0YWNrIDAuNSBzZWNvbmRzIGZyb20gbm93IHdpdGggYSB2ZWxvY2l0eSBvZiAwLjJcblx0XHQgKiAgZW52LnRyaWdnZXJBdHRhY2soXCIrMC41XCIsIDAuMik7XG5cdFx0ICovXG5cdCAgICBUb25lLkVudmVsb3BlLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrID0gZnVuY3Rpb24gKHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHZhciBvcmlnaW5hbEF0dGFjayA9IHRoaXMudG9TZWNvbmRzKHRoaXMuYXR0YWNrKTtcblx0ICAgICAgICB2YXIgYXR0YWNrID0gb3JpZ2luYWxBdHRhY2s7XG5cdCAgICAgICAgdmFyIGRlY2F5ID0gdGhpcy50b1NlY29uZHModGhpcy5kZWNheSk7XG5cdCAgICAgICAgdmVsb2NpdHkgPSBUb25lLmRlZmF1bHRBcmcodmVsb2NpdHksIDEpO1xuXHQgICAgICAgIC8vY2hlY2sgaWYgaXQncyBub3QgYSBjb21wbGV0ZSBhdHRhY2tcblx0ICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gdGhpcy5nZXRWYWx1ZUF0VGltZSh0aW1lKTtcblx0ICAgICAgICBpZiAoY3VycmVudFZhbHVlID4gMCkge1xuXHQgICAgICAgICAgICAvL3N1YnRyYWN0IHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIGF0dGFjayB0aW1lXG5cdCAgICAgICAgICAgIHZhciBhdHRhY2tSYXRlID0gMSAvIGF0dGFjaztcblx0ICAgICAgICAgICAgdmFyIHJlbWFpbmluZ0Rpc3RhbmNlID0gMSAtIGN1cnJlbnRWYWx1ZTtcblx0ICAgICAgICAgICAgLy90aGUgYXR0YWNrIGlzIG5vdyB0aGUgcmVtYWluaW5nIHRpbWVcblx0ICAgICAgICAgICAgYXR0YWNrID0gcmVtYWluaW5nRGlzdGFuY2UgLyBhdHRhY2tSYXRlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL2F0dGFja1xuXHQgICAgICAgIGlmICh0aGlzLl9hdHRhY2tDdXJ2ZSA9PT0gJ2xpbmVhcicpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc2lnLmxpbmVhclJhbXBUbyh2ZWxvY2l0eSwgYXR0YWNrLCB0aW1lKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2F0dGFja0N1cnZlID09PSAnZXhwb25lbnRpYWwnKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NpZy50YXJnZXRSYW1wVG8odmVsb2NpdHksIGF0dGFjaywgdGltZSk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChhdHRhY2sgPiAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NpZy5jYW5jZWxBbmRIb2xkQXRUaW1lKHRpbWUpO1xuXHQgICAgICAgICAgICB2YXIgY3VydmUgPSB0aGlzLl9hdHRhY2tDdXJ2ZTtcblx0ICAgICAgICAgICAgLy90YWtlIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSBjdXJ2ZVxuXHQgICAgICAgICAgICBpZiAoYXR0YWNrIDwgb3JpZ2luYWxBdHRhY2spIHtcblx0ICAgICAgICAgICAgICAgIHZhciBwZXJjZW50Q29tcGxldGUgPSAxIC0gYXR0YWNrIC8gb3JpZ2luYWxBdHRhY2s7XG5cdCAgICAgICAgICAgICAgICB2YXIgc2xpY2VJbmRleCA9IE1hdGguZmxvb3IocGVyY2VudENvbXBsZXRlICogdGhpcy5fYXR0YWNrQ3VydmUubGVuZ3RoKTtcblx0ICAgICAgICAgICAgICAgIGN1cnZlID0gdGhpcy5fYXR0YWNrQ3VydmUuc2xpY2Uoc2xpY2VJbmRleCk7XG5cdCAgICAgICAgICAgICAgICAvL3RoZSBmaXJzdCBpbmRleCBpcyB0aGUgY3VycmVudCB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgY3VydmVbMF0gPSBjdXJyZW50VmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5fc2lnLnNldFZhbHVlQ3VydmVBdFRpbWUoY3VydmUsIHRpbWUsIGF0dGFjaywgdmVsb2NpdHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL2RlY2F5XG5cdCAgICAgICAgaWYgKGRlY2F5KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NpZy50YXJnZXRSYW1wVG8odmVsb2NpdHkgKiB0aGlzLnN1c3RhaW4sIGRlY2F5LCBhdHRhY2sgKyB0aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRyaWdnZXJzIHRoZSByZWxlYXNlIG9mIHRoZSBlbnZlbG9wZS5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XSBXaGVuIHRoZSByZWxlYXNlIHBvcnRpb24gb2YgdGhlIGVudmVsb3BlIHNob3VsZCBzdGFydC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuRW52ZWxvcGV9IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAgLy90cmlnZ2VyIHJlbGVhc2UgaW1tZWRpYXRlbHlcblx0XHQgKiAgZW52LnRyaWdnZXJSZWxlYXNlKCk7XG5cdFx0ICovXG5cdCAgICBUb25lLkVudmVsb3BlLnByb3RvdHlwZS50cmlnZ2VyUmVsZWFzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSB0aGlzLmdldFZhbHVlQXRUaW1lKHRpbWUpO1xuXHQgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPiAwKSB7XG5cdCAgICAgICAgICAgIHZhciByZWxlYXNlID0gdGhpcy50b1NlY29uZHModGhpcy5yZWxlYXNlKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3JlbGVhc2VDdXJ2ZSA9PT0gJ2xpbmVhcicpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3NpZy5saW5lYXJSYW1wVG8oMCwgcmVsZWFzZSwgdGltZSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fcmVsZWFzZUN1cnZlID09PSAnZXhwb25lbnRpYWwnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9zaWcudGFyZ2V0UmFtcFRvKDAsIHJlbGVhc2UsIHRpbWUpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIGN1cnZlID0gdGhpcy5fcmVsZWFzZUN1cnZlO1xuXHQgICAgICAgICAgICAgICAgaWYgKFRvbmUuaXNBcnJheShjdXJ2ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaWcuY2FuY2VsQW5kSG9sZEF0VGltZSh0aW1lKTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaWcuc2V0VmFsdWVDdXJ2ZUF0VGltZShjdXJ2ZSwgdGltZSwgcmVsZWFzZSwgY3VycmVudFZhbHVlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgR2V0IHRoZSBzY2hlZHVsZWQgdmFsdWUgYXQgdGhlIGdpdmVuIHRpbWUuIFRoaXMgd2lsbFxuXHRcdCAqICByZXR1cm4gdGhlIHVuY29udmVydGVkIChyYXcpIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lICBUaGUgdGltZSBpbiBzZWNvbmRzLlxuXHRcdCAqICBAcmV0dXJuICB7TnVtYmVyfSAgVGhlIHNjaGVkdWxlZCB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKi9cblx0ICAgIFRvbmUuRW52ZWxvcGUucHJvdG90eXBlLmdldFZhbHVlQXRUaW1lID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fc2lnLmdldFZhbHVlQXRUaW1lKHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICB0cmlnZ2VyQXR0YWNrUmVsZWFzZSBpcyBzaG9ydGhhbmQgZm9yIHRyaWdnZXJBdHRhY2ssIHRoZW4gd2FpdGluZ1xuXHRcdCAqICBzb21lIGR1cmF0aW9uLCB0aGVuIHRyaWdnZXJSZWxlYXNlLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBvZiB0aGUgc3VzdGFpbi5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIFdoZW4gdGhlIGF0dGFjayBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW3ZlbG9jaXR5PTFdIFRoZSB2ZWxvY2l0eSBvZiB0aGUgZW52ZWxvcGUuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkVudmVsb3BlfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy90cmlnZ2VyIHRoZSBhdHRhY2sgYW5kIHRoZW4gdGhlIHJlbGVhc2UgYWZ0ZXIgMC42IHNlY29uZHMuXG5cdFx0ICogZW52LnRyaWdnZXJBdHRhY2tSZWxlYXNlKDAuNik7XG5cdFx0ICovXG5cdCAgICBUb25lLkVudmVsb3BlLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrUmVsZWFzZSA9IGZ1bmN0aW9uIChkdXJhdGlvbiwgdGltZSwgdmVsb2NpdHkpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy50cmlnZ2VyQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICB0aGlzLnRyaWdnZXJSZWxlYXNlKHRpbWUgKyB0aGlzLnRvU2Vjb25kcyhkdXJhdGlvbikpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDYW5jZWxzIGFsbCBzY2hlZHVsZWQgZW52ZWxvcGUgY2hhbmdlcyBhZnRlciB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gYWZ0ZXJcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRW52ZWxvcGV9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRW52ZWxvcGUucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uIChhZnRlcikge1xuXHQgICAgICAgIHRoaXMuX3NpZy5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoYWZ0ZXIpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBCb3Jyb3dzIHRoZSBjb25uZWN0IG1ldGhvZCBmcm9tIFRvbmUuU2lnbmFsLlxuXHRcdCAqICBAZnVuY3Rpb25cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuRW52ZWxvcGUucHJvdG90eXBlLmNvbm5lY3QgPSBUb25lLlNpZ25hbEJhc2UucHJvdG90eXBlLmNvbm5lY3Q7XG5cdCAgICAvKipcblx0IFx0ICogIEdlbmVyYXRlIHNvbWUgY29tcGxleCBlbnZlbG9wZSBjdXJ2ZXMuXG5cdCBcdCAqL1xuXHQgICAgKGZ1bmN0aW9uIF9jcmVhdGVDdXJ2ZXMoKSB7XG5cdCAgICAgICAgdmFyIGN1cnZlTGVuID0gMTI4O1xuXHQgICAgICAgIHZhciBpLCBrO1xuXHQgICAgICAgIC8vY29zaW5lIGN1cnZlXG5cdCAgICAgICAgdmFyIGNvc2luZUN1cnZlID0gW107XG5cdCAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnZlTGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgY29zaW5lQ3VydmVbaV0gPSBNYXRoLnNpbihpIC8gKGN1cnZlTGVuIC0gMSkgKiAoTWF0aC5QSSAvIDIpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9yaXBwbGUgY3VydmVcblx0ICAgICAgICB2YXIgcmlwcGxlQ3VydmUgPSBbXTtcblx0ICAgICAgICB2YXIgcmlwcGxlQ3VydmVGcmVxID0gNi40O1xuXHQgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJ2ZUxlbiAtIDE7IGkrKykge1xuXHQgICAgICAgICAgICBrID0gaSAvIChjdXJ2ZUxlbiAtIDEpO1xuXHQgICAgICAgICAgICB2YXIgc2luZVdhdmUgPSBNYXRoLnNpbihrICogKE1hdGguUEkgKiAyKSAqIHJpcHBsZUN1cnZlRnJlcSAtIE1hdGguUEkgLyAyKSArIDE7XG5cdCAgICAgICAgICAgIHJpcHBsZUN1cnZlW2ldID0gc2luZVdhdmUgLyAxMCArIGsgKiAwLjgzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByaXBwbGVDdXJ2ZVtjdXJ2ZUxlbiAtIDFdID0gMTtcblx0ICAgICAgICAvL3N0YWlycyBjdXJ2ZVxuXHQgICAgICAgIHZhciBzdGFpcnNDdXJ2ZSA9IFtdO1xuXHQgICAgICAgIHZhciBzdGVwcyA9IDU7XG5cdCAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnZlTGVuOyBpKyspIHtcblx0ICAgICAgICAgICAgc3RhaXJzQ3VydmVbaV0gPSBNYXRoLmNlaWwoaSAvIChjdXJ2ZUxlbiAtIDEpICogc3RlcHMpIC8gc3RlcHM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vaW4tb3V0IGVhc2luZyBjdXJ2ZVxuXHQgICAgICAgIHZhciBzaW5lQ3VydmUgPSBbXTtcblx0ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VydmVMZW47IGkrKykge1xuXHQgICAgICAgICAgICBrID0gaSAvIChjdXJ2ZUxlbiAtIDEpO1xuXHQgICAgICAgICAgICBzaW5lQ3VydmVbaV0gPSAwLjUgKiAoMSAtIE1hdGguY29zKE1hdGguUEkgKiBrKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vYSBib3VuY2UgY3VydmVcblx0ICAgICAgICB2YXIgYm91bmNlQ3VydmUgPSBbXTtcblx0ICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VydmVMZW47IGkrKykge1xuXHQgICAgICAgICAgICBrID0gaSAvIChjdXJ2ZUxlbiAtIDEpO1xuXHQgICAgICAgICAgICB2YXIgZnJlcSA9IE1hdGgucG93KGssIDMpICogNCArIDAuMjtcblx0ICAgICAgICAgICAgdmFyIHZhbCA9IE1hdGguY29zKGZyZXEgKiBNYXRoLlBJICogMiAqIGspO1xuXHQgICAgICAgICAgICBib3VuY2VDdXJ2ZVtpXSA9IE1hdGguYWJzKHZhbCAqICgxIC0gaykpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvKipcblx0XHRcdCAqICBJbnZlcnQgYSB2YWx1ZSBjdXJ2ZSB0byBtYWtlIGl0IHdvcmsgZm9yIHRoZSByZWxlYXNlXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIGZ1bmN0aW9uIGludmVydEN1cnZlKGN1cnZlKSB7XG5cdCAgICAgICAgICAgIHZhciBvdXQgPSBuZXcgQXJyYXkoY3VydmUubGVuZ3RoKTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjdXJ2ZS5sZW5ndGg7IGorKykge1xuXHQgICAgICAgICAgICAgICAgb3V0W2pdID0gMSAtIGN1cnZlW2pdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBvdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHJldmVyc2UgdGhlIGN1cnZlXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIGZ1bmN0aW9uIHJldmVyc2VDdXJ2ZShjdXJ2ZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gY3VydmUuc2xpY2UoMCkucmV2ZXJzZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvKipcblx0XHRcdCAqICBhdHRhY2sgYW5kIHJlbGVhc2UgY3VydmUgYXJyYXlzXG5cdFx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIFRvbmUuRW52ZWxvcGUuVHlwZSA9IHtcblx0ICAgICAgICAgICAgJ2xpbmVhcic6ICdsaW5lYXInLFxuXHQgICAgICAgICAgICAnZXhwb25lbnRpYWwnOiAnZXhwb25lbnRpYWwnLFxuXHQgICAgICAgICAgICAnYm91bmNlJzoge1xuXHQgICAgICAgICAgICAgICAgSW46IGludmVydEN1cnZlKGJvdW5jZUN1cnZlKSxcblx0ICAgICAgICAgICAgICAgIE91dDogYm91bmNlQ3VydmVcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgJ2Nvc2luZSc6IHtcblx0ICAgICAgICAgICAgICAgIEluOiBjb3NpbmVDdXJ2ZSxcblx0ICAgICAgICAgICAgICAgIE91dDogcmV2ZXJzZUN1cnZlKGNvc2luZUN1cnZlKVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAnc3RlcCc6IHtcblx0ICAgICAgICAgICAgICAgIEluOiBzdGFpcnNDdXJ2ZSxcblx0ICAgICAgICAgICAgICAgIE91dDogaW52ZXJ0Q3VydmUoc3RhaXJzQ3VydmUpXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgICdyaXBwbGUnOiB7XG5cdCAgICAgICAgICAgICAgICBJbjogcmlwcGxlQ3VydmUsXG5cdCAgICAgICAgICAgICAgICBPdXQ6IGludmVydEN1cnZlKHJpcHBsZUN1cnZlKVxuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICAnc2luZSc6IHtcblx0ICAgICAgICAgICAgICAgIEluOiBzaW5lQ3VydmUsXG5cdCAgICAgICAgICAgICAgICBPdXQ6IGludmVydEN1cnZlKHNpbmVDdXJ2ZSlcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICB9KCkpO1xuXHQgICAgLyoqXG5cdFx0ICogIERpc2Nvbm5lY3QgYW5kIGRpc3Bvc2UuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkVudmVsb3BlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc2lnLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9zaWcgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2F0dGFja0N1cnZlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9yZWxlYXNlQ3VydmUgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkVudmVsb3BlO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIFRvbmUuQW1wbGl0dWRlRW52ZWxvcGUgaXMgYSBUb25lLkVudmVsb3BlIGNvbm5lY3RlZCB0byBhIGdhaW4gbm9kZS5cblx0XHQgKiAgICAgICAgICBVbmxpa2UgVG9uZS5FbnZlbG9wZSwgd2hpY2ggb3V0cHV0cyB0aGUgZW52ZWxvcGUncyB2YWx1ZSwgVG9uZS5BbXBsaXR1ZGVFbnZlbG9wZSBhY2NlcHRzXG5cdFx0ICogICAgICAgICAgYW4gYXVkaW8gc2lnbmFsIGFzIHRoZSBpbnB1dCBhbmQgd2lsbCBhcHBseSB0aGUgZW52ZWxvcGUgdG8gdGhlIGFtcGxpdHVkZVxuXHRcdCAqICAgICAgICAgIG9mIHRoZSBzaWduYWwuIFJlYWQgbW9yZSBhYm91dCBBRFNSIEVudmVsb3BlcyBvbiBbV2lraXBlZGlhXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TeW50aGVzaXplciNBRFNSX2VudmVsb3BlKS5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuRW52ZWxvcGV9XG5cdFx0ICogIEBwYXJhbSB7VGltZXxPYmplY3R9IFthdHRhY2tdIFRoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyBmb3IgdGhlIGVudmVsb3BlIHRvIGdvIGZyb21cblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHRvIGl0J3MgbWF4aW11bSB2YWx1ZS5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbZGVjYXldXHRUaGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgdGhlIGF0dGFjayB0aGF0IGl0IHRha2VzIGZvciB0aGUgZW52ZWxvcGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgXHR0byBmYWxsIHRvIHRoZSBzdXN0YWluIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfSBbc3VzdGFpbl1cdFRoZSBwZXJjZW50IG9mIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIGVudmVsb3BlIHJlc3RzIGF0IHVudGlsXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0dGhlIHJlbGVhc2UgaXMgdHJpZ2dlcmVkLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFtyZWxlYXNlXVx0VGhlIGFtb3VudCBvZiB0aW1lIGFmdGVyIHRoZSByZWxlYXNlIGlzIHRyaWdnZXJlZCBpdCB0YWtlcyB0byByZWFjaCAwLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBhbXBFbnYgPSBuZXcgVG9uZS5BbXBsaXR1ZGVFbnZlbG9wZSh7XG5cdFx0ICogXHRcImF0dGFja1wiOiAwLjEsXG5cdFx0ICogXHRcImRlY2F5XCI6IDAuMixcblx0XHQgKiBcdFwic3VzdGFpblwiOiAxLjAsXG5cdFx0ICogXHRcInJlbGVhc2VcIjogMC44XG5cdFx0ICogfSkudG9NYXN0ZXIoKTtcblx0XHQgKiAvL2NyZWF0ZSBhbiBvc2NpbGxhdG9yIGFuZCBjb25uZWN0IGl0XG5cdFx0ICogdmFyIG9zYyA9IG5ldyBUb25lLk9zY2lsbGF0b3IoKS5jb25uZWN0KGFtcEVudikuc3RhcnQoKTtcblx0XHQgKiAvL3RyaWdnZXIgdGhlIGVudmVsb3BlcyBhdHRhY2sgYW5kIHJlbGVhc2UgXCI4dFwiIGFwYXJ0XG5cdFx0ICogYW1wRW52LnRyaWdnZXJBdHRhY2tSZWxlYXNlKFwiOHRcIik7XG5cdFx0ICovXG5cdCAgICBUb25lLkFtcGxpdHVkZUVudmVsb3BlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuRW52ZWxvcGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgaW5wdXQgbm9kZVxuXHRcdFx0ICogIEB0eXBlIHtHYWluTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIHRoaXMuX3NpZy5jb25uZWN0KHRoaXMub3V0cHV0LmdhaW4pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQW1wbGl0dWRlRW52ZWxvcGUsIFRvbmUuRW52ZWxvcGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkFtcGxpdHVkZUVudmVsb3BlfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5BbXBsaXR1ZGVFbnZlbG9wZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQW1wbGl0dWRlRW52ZWxvcGU7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBBbmFseXNlck5vZGUuZ2V0RmxvYXRUaW1lRG9tYWluRGF0YSBwb2x5ZmlsbFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgaWYgKFRvbmUuc3VwcG9ydGVkKSB7XG5cdCAgICAgICAgaWYgKCFBbmFseXNlck5vZGUucHJvdG90eXBlLmdldEZsb2F0VGltZURvbWFpbkRhdGEpIHtcblx0ICAgICAgICAgICAgLy9yZWZlcmVuY2VkIGh0dHBzOi8vZ2l0aHViLmNvbS9tb2hheW9uYW8vZ2V0LWZsb2F0LXRpbWUtZG9tYWluLWRhdGFcblx0ICAgICAgICAgICAgQW5hbHlzZXJOb2RlLnByb3RvdHlwZS5nZXRGbG9hdFRpbWVEb21haW5EYXRhID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgdWludDggPSBuZXcgVWludDhBcnJheShhcnJheS5sZW5ndGgpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5nZXRCeXRlVGltZURvbWFpbkRhdGEodWludDgpO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1aW50OC5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gKHVpbnQ4W2ldIC0gMTI4KSAvIDEyODtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgV3JhcHBlciBhcm91bmQgdGhlIG5hdGl2ZSBXZWIgQXVkaW8nc1xuXHRcdCAqICAgICAgICAgIFtBbmFseXNlck5vZGVdKGh0dHA6Ly93ZWJhdWRpby5naXRodWIuaW8vd2ViLWF1ZGlvLWFwaS8jaWRsLWRlZi1BbmFseXNlck5vZGUpLlxuXHRcdCAqICAgICAgICAgIEV4dHJhY3RzIEZGVCBvciBXYXZlZm9ybSBkYXRhIGZyb20gdGhlIGluY29taW5nIHNpZ25hbC5cblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAcGFyYW0ge1N0cmluZz19IHR5cGUgVGhlIHJldHVybiB0eXBlIG9mIHRoZSBhbmFseXNpcywgZWl0aGVyIFwiZmZ0XCIsIG9yIFwid2F2ZWZvcm1cIi5cblx0XHQgKiAgQHBhcmFtIHtOdW1iZXI9fSBzaXplIFRoZSBzaXplIG9mIHRoZSBGRlQuIFZhbHVlIG11c3QgYmUgYSBwb3dlciBvZlxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICB0d28gaW4gdGhlIHJhbmdlIDMyIHRvIDMyNzY4LlxuXHRcdCAqL1xuXHQgICAgVG9uZS5BbmFseXNlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICd0eXBlJyxcblx0ICAgICAgICAgICAgJ3NpemUnXG5cdCAgICAgICAgXSwgVG9uZS5BbmFseXNlcik7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW5hbHlzZXIgbm9kZS5cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtBbmFseXNlck5vZGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9hbmFseXNlciA9IHRoaXMuaW5wdXQgPSB0aGlzLm91dHB1dCA9IHRoaXMuY29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhbmFseXNpcyB0eXBlXG5cdFx0XHQgKiAgQHR5cGUge1N0cmluZ31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdHlwZSA9IG9wdGlvbnMudHlwZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYnVmZmVyIHRoYXQgdGhlIEZGVCBkYXRhIGlzIHdyaXR0ZW4gdG9cblx0XHRcdCAqICBAdHlwZSB7VHlwZWRBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYnVmZmVyID0gbnVsbDtcblx0ICAgICAgICAvL3NldCB0aGUgdmFsdWVzIGluaXRpYWxseVxuXHQgICAgICAgIHRoaXMuc2l6ZSA9IG9wdGlvbnMuc2l6ZTtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5BbmFseXNlciwgVG9uZS5BdWRpb05vZGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBkZWZhdWx0IHZhbHVlcy5cblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICovXG5cdCAgICBUb25lLkFuYWx5c2VyLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdzaXplJzogMTAyNCxcblx0ICAgICAgICAndHlwZSc6ICdmZnQnLFxuXHQgICAgICAgICdzbW9vdGhpbmcnOiAwLjhcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUG9zc2libGUgcmV0dXJuIHR5cGVzIG9mIGFuYWx5c2VyLmdldFZhbHVlKClcblx0XHQgKiAgQGVudW0ge1N0cmluZ31cblx0XHQgKi9cblx0ICAgIFRvbmUuQW5hbHlzZXIuVHlwZSA9IHtcblx0ICAgICAgICBXYXZlZm9ybTogJ3dhdmVmb3JtJyxcblx0ICAgICAgICBGRlQ6ICdmZnQnXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJ1biB0aGUgYW5hbHlzaXMgZ2l2ZW4gdGhlIGN1cnJlbnQgc2V0dGluZ3MgYW5kIHJldHVybiB0aGVcblx0XHQgKiAgcmVzdWx0IGFzIGEgVHlwZWRBcnJheS5cblx0XHQgKiAgQHJldHVybnMge1R5cGVkQXJyYXl9XG5cdFx0ICovXG5cdCAgICBUb25lLkFuYWx5c2VyLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5fdHlwZSA9PT0gVG9uZS5BbmFseXNlci5UeXBlLkZGVCkge1xuXHQgICAgICAgICAgICB0aGlzLl9hbmFseXNlci5nZXRGbG9hdEZyZXF1ZW5jeURhdGEodGhpcy5fYnVmZmVyKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFRvbmUuQW5hbHlzZXIuVHlwZS5XYXZlZm9ybSkge1xuXHQgICAgICAgICAgICB0aGlzLl9hbmFseXNlci5nZXRGbG9hdFRpbWVEb21haW5EYXRhKHRoaXMuX2J1ZmZlcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBzaXplIG9mIGFuYWx5c2lzLiBUaGlzIG11c3QgYmUgYSBwb3dlciBvZiB0d28gaW4gdGhlIHJhbmdlIDMyIHRvIDMyNzY4LlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5BbmFseXNlciNcblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG5hbWUgc2l6ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQW5hbHlzZXIucHJvdG90eXBlLCAnc2l6ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoc2l6ZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9hbmFseXNlci5mZnRTaXplID0gc2l6ZSAqIDI7XG5cdCAgICAgICAgICAgIHRoaXMuX2J1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGFuYWx5c2lzIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGFuYWx5c2VyLmdldFZhbHVlKCksIGVpdGhlciBcImZmdFwiIG9yIFwid2F2ZWZvcm1cIi5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuQW5hbHlzZXIjXG5cdFx0ICogIEB0eXBlIHtTdHJpbmd9XG5cdFx0ICogIEBuYW1lIHR5cGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkFuYWx5c2VyLnByb3RvdHlwZSwgJ3R5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgICAgICBpZiAodHlwZSAhPT0gVG9uZS5BbmFseXNlci5UeXBlLldhdmVmb3JtICYmIHR5cGUgIT09IFRvbmUuQW5hbHlzZXIuVHlwZS5GRlQpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RvbmUuQW5hbHlzZXI6IGludmFsaWQgdHlwZTogJyArIHR5cGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIDAgcmVwcmVzZW50cyBubyB0aW1lIGF2ZXJhZ2luZyB3aXRoIHRoZSBsYXN0IGFuYWx5c2lzIGZyYW1lLlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5BbmFseXNlciNcblx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdCAqICBAbmFtZSBzbW9vdGhpbmdcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkFuYWx5c2VyLnByb3RvdHlwZSwgJ3Ntb290aGluZycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FuYWx5c2VyLnNtb290aGluZ1RpbWVDb25zdGFudDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9hbmFseXNlci5zbW9vdGhpbmdUaW1lQ29uc3RhbnQgPSB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkFuYWx5c2VyfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5BbmFseXNlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2FuYWx5c2VyLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB0aGlzLl9hbmFseXNlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fYnVmZmVyID0gbnVsbDtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5BbmFseXNlcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuQ29tcHJlc3NvciBpcyBhIHRoaW4gd3JhcHBlciBhcm91bmQgdGhlIFdlYiBBdWRpb1xuXHRcdCAqICAgICAgICAgW0R5bmFtaWNzQ29tcHJlc3Nvck5vZGVdKGh0dHA6Ly93ZWJhdWRpby5naXRodWIuaW8vd2ViLWF1ZGlvLWFwaS8jdGhlLWR5bmFtaWNzY29tcHJlc3Nvcm5vZGUtaW50ZXJmYWNlKS5cblx0XHQgKiAgICAgICAgIENvbXByZXNzaW9uIHJlZHVjZXMgdGhlIHZvbHVtZSBvZiBsb3VkIHNvdW5kcyBvciBhbXBsaWZpZXMgcXVpZXQgc291bmRzXG5cdFx0ICogICAgICAgICBieSBuYXJyb3dpbmcgb3IgXCJjb21wcmVzc2luZ1wiIGFuIGF1ZGlvIHNpZ25hbCdzIGR5bmFtaWMgcmFuZ2UuXG5cdFx0ICogICAgICAgICBSZWFkIG1vcmUgb24gW1dpa2lwZWRpYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRHluYW1pY19yYW5nZV9jb21wcmVzc2lvbikuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQHBhcmFtIHtEZWNpYmVsc3xPYmplY3R9IFt0aHJlc2hvbGRdIFRoZSB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgY29tcHJlc3Npb24gc3RhcnRzIHRvIGJlIGFwcGxpZWQuXG5cdFx0ICogIEBwYXJhbSB7UG9zaXRpdmV9IFtyYXRpb10gVGhlIGdhaW4gcmVkdWN0aW9uIHJhdGlvLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBjb21wID0gbmV3IFRvbmUuQ29tcHJlc3NvcigtMzAsIDMpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Db21wcmVzc29yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ3RocmVzaG9sZCcsXG5cdCAgICAgICAgICAgICdyYXRpbydcblx0ICAgICAgICBdLCBUb25lLkNvbXByZXNzb3IpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGNvbXByZXNzb3Igbm9kZVxuXHRcdFx0ICogIEB0eXBlIHtEeW5hbWljc0NvbXByZXNzb3JOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9jb21wcmVzc29yID0gdGhpcy5pbnB1dCA9IHRoaXMub3V0cHV0ID0gdGhpcy5jb250ZXh0LmNyZWF0ZUR5bmFtaWNzQ29tcHJlc3NvcigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSB0aHJlc2hvbGQgdmF1ZVxuXHRcdFx0ICogIEB0eXBlIHtEZWNpYmVsc31cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnRocmVzaG9sZCA9IG5ldyBUb25lLlBhcmFtKHtcblx0ICAgICAgICAgICAgJ3BhcmFtJzogdGhpcy5fY29tcHJlc3Nvci50aHJlc2hvbGQsXG5cdCAgICAgICAgICAgICd1bml0cyc6IFRvbmUuVHlwZS5EZWNpYmVscyxcblx0ICAgICAgICAgICAgJ2NvbnZlcnQnOiBmYWxzZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhdHRhY2sgcGFyYW1ldGVyXG5cdFx0XHQgKiAgQHR5cGUge1RpbWV9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5hdHRhY2sgPSBuZXcgVG9uZS5QYXJhbSh0aGlzLl9jb21wcmVzc29yLmF0dGFjaywgVG9uZS5UeXBlLlRpbWUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSByZWxlYXNlIHBhcmFtZXRlclxuXHRcdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucmVsZWFzZSA9IG5ldyBUb25lLlBhcmFtKHRoaXMuX2NvbXByZXNzb3IucmVsZWFzZSwgVG9uZS5UeXBlLlRpbWUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBrbmVlIHBhcmFtZXRlclxuXHRcdFx0ICogIEB0eXBlIHtEZWNpYmVsc31cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmtuZWUgPSBuZXcgVG9uZS5QYXJhbSh7XG5cdCAgICAgICAgICAgICdwYXJhbSc6IHRoaXMuX2NvbXByZXNzb3Iua25lZSxcblx0ICAgICAgICAgICAgJ3VuaXRzJzogVG9uZS5UeXBlLkRlY2liZWxzLFxuXHQgICAgICAgICAgICAnY29udmVydCc6IGZhbHNlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHJhdGlvIHZhbHVlXG5cdFx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnJhdGlvID0gbmV3IFRvbmUuUGFyYW0oe1xuXHQgICAgICAgICAgICAncGFyYW0nOiB0aGlzLl9jb21wcmVzc29yLnJhdGlvLFxuXHQgICAgICAgICAgICAnY29udmVydCc6IGZhbHNlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgLy9zZXQgdGhlIGRlZmF1bHRzXG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAna25lZScsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJyxcblx0ICAgICAgICAgICAgJ2F0dGFjaycsXG5cdCAgICAgICAgICAgICdyYXRpbycsXG5cdCAgICAgICAgICAgICd0aHJlc2hvbGQnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5zZXQob3B0aW9ucyk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5Db21wcmVzc29yLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuQ29tcHJlc3Nvci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAncmF0aW8nOiAxMixcblx0ICAgICAgICAndGhyZXNob2xkJzogLTI0LFxuXHQgICAgICAgICdyZWxlYXNlJzogMC4yNSxcblx0ICAgICAgICAnYXR0YWNrJzogMC4wMDMsXG5cdCAgICAgICAgJ2tuZWUnOiAzMFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Db21wcmVzc29yfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkNvbXByZXNzb3IucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdrbmVlJyxcblx0ICAgICAgICAgICAgJ3JlbGVhc2UnLFxuXHQgICAgICAgICAgICAnYXR0YWNrJyxcblx0ICAgICAgICAgICAgJ3JhdGlvJyxcblx0ICAgICAgICAgICAgJ3RocmVzaG9sZCdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLl9jb21wcmVzc29yLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB0aGlzLl9jb21wcmVzc29yID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmF0dGFjay5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5hdHRhY2sgPSBudWxsO1xuXHQgICAgICAgIHRoaXMucmVsZWFzZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5yZWxlYXNlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnRocmVzaG9sZC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy50aHJlc2hvbGQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMucmF0aW8uZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMucmF0aW8gPSBudWxsO1xuXHQgICAgICAgIHRoaXMua25lZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5rbmVlID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5Db21wcmVzc29yO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgQWRkIGEgc2lnbmFsIGFuZCBhIG51bWJlciBvciB0d28gc2lnbmFscy4gV2hlbiBubyB2YWx1ZSBpc1xuXHRcdCAqICAgICAgICAgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLCBUb25lLkFkZCB3aWxsIHN1bSA8Y29kZT5pbnB1dFswXTwvY29kZT5cblx0XHQgKiAgICAgICAgIGFuZCA8Y29kZT5pbnB1dFsxXTwvY29kZT4uIElmIGEgdmFsdWUgaXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yLCBcblx0XHQgKiAgICAgICAgIHRoZSBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBpbnB1dC5cblx0XHQgKiAgXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TaWduYWx9XG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyPX0gdmFsdWUgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIFRvbmUuQWRkIHdpbGwgc3VtIHRoZSBmaXJzdFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWNvbmQgaW5wdXRzLiBcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgc2lnbmFsID0gbmV3IFRvbmUuU2lnbmFsKDIpO1xuXHRcdCAqIHZhciBhZGQgPSBuZXcgVG9uZS5BZGQoMik7XG5cdFx0ICogc2lnbmFsLmNvbm5lY3QoYWRkKTtcblx0XHQgKiAvL3RoZSBvdXRwdXQgb2YgYWRkIGVxdWFscyA0XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9pZiBjb25zdHJ1Y3RlZCB3aXRoIG5vIGFyZ3VtZW50c1xuXHRcdCAqIC8vaXQgd2lsbCBhZGQgdGhlIGZpcnN0IGFuZCBzZWNvbmQgaW5wdXRzXG5cdFx0ICogdmFyIGFkZCA9IG5ldyBUb25lLkFkZCgpO1xuXHRcdCAqIHZhciBzaWcwID0gbmV3IFRvbmUuU2lnbmFsKDMpLmNvbm5lY3QoYWRkLCAwLCAwKTtcblx0XHQgKiB2YXIgc2lnMSA9IG5ldyBUb25lLlNpZ25hbCg0KS5jb25uZWN0KGFkZCwgMCwgMSk7XG5cdFx0ICogLy90aGUgb3V0cHV0IG9mIGFkZCBlcXVhbHMgNy4gXG5cdFx0ICovXG5cdCAgICBUb25lLkFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5jcmVhdGVJbnNPdXRzKDIsIDApO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBzdW1taW5nIG5vZGVcblx0XHRcdCAqICBAdHlwZSB7R2Fpbk5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N1bSA9IHRoaXMuaW5wdXRbMF0gPSB0aGlzLmlucHV0WzFdID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5TaWduYWx9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9wYXJhbSA9IHRoaXMuaW5wdXRbMV0gPSBuZXcgVG9uZS5TaWduYWwodmFsdWUpO1xuXHQgICAgICAgIHRoaXMuX3BhcmFtLmNvbm5lY3QodGhpcy5fc3VtKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkFkZCwgVG9uZS5TaWduYWwpO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5BZGR9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQWRkLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc3VtLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9zdW0gPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkFkZDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBNdWx0aXBseSB0d28gaW5jb21pbmcgc2lnbmFscy4gT3IsIGlmIGEgbnVtYmVyIGlzIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3Rvcixcblx0XHQgKiAgICAgICAgICBtdWx0aXBsaWVzIHRoZSBpbmNvbWluZyBzaWduYWwgYnkgdGhhdCB2YWx1ZS5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuU2lnbmFsfVxuXHRcdCAqICBAcGFyYW0ge251bWJlcj19IHZhbHVlIENvbnN0YW50IHZhbHVlIHRvIG11bHRpcGxlLiBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCxcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICBpdCB3aWxsIHJldHVybiB0aGUgcHJvZHVjdCBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBpbnB1dHNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgbXVsdCA9IG5ldyBUb25lLk11bHRpcGx5KCk7XG5cdFx0ICogdmFyIHNpZ0EgPSBuZXcgVG9uZS5TaWduYWwoMyk7XG5cdFx0ICogdmFyIHNpZ0IgPSBuZXcgVG9uZS5TaWduYWwoNCk7XG5cdFx0ICogc2lnQS5jb25uZWN0KG11bHQsIDAsIDApO1xuXHRcdCAqIHNpZ0IuY29ubmVjdChtdWx0LCAwLCAxKTtcblx0XHQgKiAvL291dHB1dCBvZiBtdWx0IGlzIDEyLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBtdWx0ID0gbmV3IFRvbmUuTXVsdGlwbHkoMTApO1xuXHRcdCAqIHZhciBzaWcgPSBuZXcgVG9uZS5TaWduYWwoMikuY29ubmVjdChtdWx0KTtcblx0XHQgKiAvL3RoZSBvdXRwdXQgb2YgbXVsdCBpcyAyMC5cblx0XHQgKi9cblx0ICAgIFRvbmUuTXVsdGlwbHkgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICBUb25lLlNpZ25hbC5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY3JlYXRlSW5zT3V0cygyLCAwKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgaW5wdXQgbm9kZSBpcyB0aGUgc2FtZSBhcyB0aGUgb3V0cHV0IG5vZGVcblx0XHRcdCAqICBpdCBpcyBhbHNvIHRoZSBHYWluTm9kZSB3aGljaCBoYW5kbGVzIHRoZSBzY2FsaW5nIG9mIGluY29taW5nIHNpZ25hbFxuXHRcdFx0ICpcblx0XHRcdCAqICBAdHlwZSB7R2Fpbk5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX211bHQgPSB0aGlzLmlucHV0WzBdID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIHNjYWxpbmcgcGFyYW1ldGVyXG5cdFx0XHQgKiAgQHR5cGUge0F1ZGlvUGFyYW19XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3BhcmFtID0gdGhpcy5pbnB1dFsxXSA9IHRoaXMub3V0cHV0LmdhaW47XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IFRvbmUuZGVmYXVsdEFyZyh2YWx1ZSwgMCk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5NdWx0aXBseSwgVG9uZS5TaWduYWwpO1xuXHQgICAgLyoqXG5cdFx0ICogIGNsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk11bHRpcGx5fSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk11bHRpcGx5LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fbXVsdC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbXVsdCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fcGFyYW0gPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk11bHRpcGx5O1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgTmVnYXRlIHRoZSBpbmNvbWluZyBzaWduYWwuIGkuZS4gYW4gaW5wdXQgc2lnbmFsIG9mIDEwIHdpbGwgb3V0cHV0IC0xMFxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TaWduYWxCYXNlfVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBuZWcgPSBuZXcgVG9uZS5OZWdhdGUoKTtcblx0XHQgKiB2YXIgc2lnID0gbmV3IFRvbmUuU2lnbmFsKC0yKS5jb25uZWN0KG5lZyk7XG5cdFx0ICogLy9vdXRwdXQgb2YgbmVnIGlzIHBvc2l0aXZlIDIuIFxuXHRcdCAqL1xuXHQgICAgVG9uZS5OZWdhdGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgbmVnYXRpb24gaXMgZG9uZSBieSBtdWx0aXBseWluZyBieSAtMVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk11bHRpcGx5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tdWx0aXBseSA9IHRoaXMuaW5wdXQgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLk11bHRpcGx5KC0xKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLk5lZ2F0ZSwgVG9uZS5TaWduYWxCYXNlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5OZWdhdGV9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTmVnYXRlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX211bHRpcGx5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9tdWx0aXBseSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuTmVnYXRlO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgU3VidHJhY3QgdGhlIHNpZ25hbCBjb25uZWN0ZWQgdG8gPGNvZGU+aW5wdXRbMV08L2NvZGU+IGZyb20gdGhlIHNpZ25hbCBjb25uZWN0ZWQgXG5cdFx0ICogICAgICAgICB0byA8Y29kZT5pbnB1dFswXTwvY29kZT4uIElmIGFuIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3RvciwgdGhlIFxuXHRcdCAqICAgICAgICAgc2lnbmFscyA8Y29kZT4udmFsdWU8L2NvZGU+IHdpbGwgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBpbmNvbWluZyBzaWduYWwuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuU2lnbmFsfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQHBhcmFtIHtudW1iZXI9fSB2YWx1ZSBUaGUgdmFsdWUgdG8gc3VidHJhY3QgZnJvbSB0aGUgaW5jb21pbmcgc2lnbmFsLiBJZiB0aGUgdmFsdWVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbWl0dGVkLCBpdCB3aWxsIHN1YnRyYWN0IHRoZSBzZWNvbmQgc2lnbmFsIGZyb20gdGhlIGZpcnN0LlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBzdWIgPSBuZXcgVG9uZS5TdWJ0cmFjdCgxKTtcblx0XHQgKiB2YXIgc2lnID0gbmV3IFRvbmUuU2lnbmFsKDQpLmNvbm5lY3Qoc3ViKTtcblx0XHQgKiAvL3RoZSBvdXRwdXQgb2Ygc3ViIGlzIDMuIFxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBzdWIgPSBuZXcgVG9uZS5TdWJ0cmFjdCgpO1xuXHRcdCAqIHZhciBzaWdBID0gbmV3IFRvbmUuU2lnbmFsKDEwKTtcblx0XHQgKiB2YXIgc2lnQiA9IG5ldyBUb25lLlNpZ25hbCgyLjUpO1xuXHRcdCAqIHNpZ0EuY29ubmVjdChzdWIsIDAsIDApO1xuXHRcdCAqIHNpZ0IuY29ubmVjdChzdWIsIDAsIDEpO1xuXHRcdCAqIC8vb3V0cHV0IG9mIHN1YiBpcyA3LjVcblx0XHQgKi9cblx0ICAgIFRvbmUuU3VidHJhY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICBUb25lLlNpZ25hbC5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY3JlYXRlSW5zT3V0cygyLCAwKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgc3VtbWluZyBub2RlXG5cdFx0XHQgKiAgQHR5cGUge0dhaW5Ob2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zdW0gPSB0aGlzLmlucHV0WzBdID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgbmVnYXRlIHRoZSBpbnB1dCBvZiB0aGUgc2Vjb25kIGlucHV0IGJlZm9yZSBjb25uZWN0aW5nIGl0XG5cdFx0XHQgKiAgdG8gdGhlIHN1bW1pbmcgbm9kZS5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5OZWdhdGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX25lZyA9IG5ldyBUb25lLk5lZ2F0ZSgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBub2RlIHdoZXJlIHRoZSB2YWx1ZSBpcyBzZXRcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlNpZ25hbH1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3BhcmFtID0gdGhpcy5pbnB1dFsxXSA9IG5ldyBUb25lLlNpZ25hbCh2YWx1ZSk7XG5cdCAgICAgICAgdGhpcy5fcGFyYW0uY2hhaW4odGhpcy5fbmVnLCB0aGlzLl9zdW0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuU3VidHJhY3QsIFRvbmUuU2lnbmFsKTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuU2lnbmFsQmFzZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TdWJ0cmFjdC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlNpZ25hbC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX25lZy5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbmVnID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9zdW0uZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX3N1bSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuU3VidHJhY3Q7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBDb252ZXJ0IGFuIGluY29taW5nIHNpZ25hbCBiZXR3ZWVuIDAsIDEgdG8gYW4gZXF1YWwgcG93ZXIgZ2FpbiBzY2FsZS5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TaWduYWxCYXNlfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgZXFQb3dHYWluID0gbmV3IFRvbmUuRXF1YWxQb3dlckdhaW4oKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuRXF1YWxQb3dlckdhaW4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuV2F2ZVNoYXBlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZXFQb3dlciA9IHRoaXMuaW5wdXQgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLldhdmVTaGFwZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgICAgICBpZiAoTWF0aC5hYnModmFsKSA8IDAuMDAxKSB7XG5cdCAgICAgICAgICAgICAgICAvL3Nob3VsZCBvdXRwdXQgMCB3aGVuIGlucHV0IGlzIDBcblx0ICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFRvbmUuZXF1YWxQb3dlclNjYWxlKHZhbCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LmJpbmQodGhpcyksIDQwOTYpO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuRXF1YWxQb3dlckdhaW4sIFRvbmUuU2lnbmFsQmFzZSk7XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRXF1YWxQb3dlckdhaW59IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRXF1YWxQb3dlckdhaW4ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fZXFQb3dlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZXFQb3dlciA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuRXF1YWxQb3dlckdhaW47XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogQGNsYXNzICBUb25lLkNyb3NzZmFkZSBwcm92aWRlcyBlcXVhbCBwb3dlciBmYWRpbmcgYmV0d2VlbiB0d28gaW5wdXRzLlxuXHRcdCAqICAgICAgICAgTW9yZSBvbiBjcm9zc2ZhZGluZyB0ZWNobmlxdWUgW2hlcmVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZhZGVfKGF1ZGlvX2VuZ2luZWVyaW5nKSNDcm9zc2ZhZGluZykuXG5cdFx0ICpcblx0XHQgKiBAY29uc3RydWN0b3Jcblx0XHQgKiBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogQHBhcmFtIHtOb3JtYWxSYW5nZX0gW2luaXRpYWxGYWRlPTAuNV1cblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHZhciBjcm9zc0ZhZGUgPSBuZXcgVG9uZS5Dcm9zc0ZhZGUoMC41KTtcblx0XHQgKiAvL2Nvbm5lY3QgZWZmZWN0IEEgdG8gY3Jvc3NmYWRlIGZyb21cblx0XHQgKiAvL2VmZmVjdCBvdXRwdXQgMCB0byBjcm9zc2ZhZGUgaW5wdXQgMFxuXHRcdCAqIGVmZmVjdEEuY29ubmVjdChjcm9zc0ZhZGUsIDAsIDApO1xuXHRcdCAqIC8vY29ubmVjdCBlZmZlY3QgQiB0byBjcm9zc2ZhZGUgZnJvbVxuXHRcdCAqIC8vZWZmZWN0IG91dHB1dCAwIHRvIGNyb3NzZmFkZSBpbnB1dCAxXG5cdFx0ICogZWZmZWN0Qi5jb25uZWN0KGNyb3NzRmFkZSwgMCwgMSk7XG5cdFx0ICogY3Jvc3NGYWRlLmZhZGUudmFsdWUgPSAwO1xuXHRcdCAqIC8vIF4gb25seSBlZmZlY3RBIGlzIG91dHB1dFxuXHRcdCAqIGNyb3NzRmFkZS5mYWRlLnZhbHVlID0gMTtcblx0XHQgKiAvLyBeIG9ubHkgZWZmZWN0QiBpcyBvdXRwdXRcblx0XHQgKiBjcm9zc0ZhZGUuZmFkZS52YWx1ZSA9IDAuNTtcblx0XHQgKiAvLyBeIHRoZSB0d28gc2lnbmFscyBhcmUgbWl4ZWQgZXF1YWxseS5cblx0XHQgKi9cblx0ICAgIFRvbmUuQ3Jvc3NGYWRlID0gZnVuY3Rpb24gKGluaXRpYWxGYWRlKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmNyZWF0ZUluc091dHMoMiwgMSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQWxpYXMgZm9yIDxjb2RlPmlucHV0WzBdPC9jb2RlPi5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5HYWlufVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5hID0gdGhpcy5pbnB1dFswXSA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBbGlhcyBmb3IgPGNvZGU+aW5wdXRbMV08L2NvZGU+LlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmIgPSB0aGlzLmlucHV0WzFdID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogXHRUaGUgbWl4IGJldHdlZW4gdGhlIHR3byBpbnB1dHMuIEEgZmFkZSB2YWx1ZSBvZiAwXG5cdFx0XHQgKiBcdHdpbGwgb3V0cHV0IDEwMCUgPGNvZGU+aW5wdXRbMF08L2NvZGU+IGFuZFxuXHRcdFx0ICogXHRhIHZhbHVlIG9mIDEgd2lsbCBvdXRwdXQgMTAwJSA8Y29kZT5pbnB1dFsxXTwvY29kZT4uXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZmFkZSA9IG5ldyBUb25lLlNpZ25hbChUb25lLmRlZmF1bHRBcmcoaW5pdGlhbEZhZGUsIDAuNSksIFRvbmUuVHlwZS5Ob3JtYWxSYW5nZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgZXF1YWwgcG93ZXIgZ2FpbiBjcm9zcyBmYWRlXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5FcXVhbFBvd2VyR2Fpbn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2VxdWFsUG93ZXJBID0gbmV3IFRvbmUuRXF1YWxQb3dlckdhaW4oKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBlcXVhbCBwb3dlciBnYWluIGNyb3NzIGZhZGVcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkVxdWFsUG93ZXJHYWlufVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZXF1YWxQb3dlckIgPSBuZXcgVG9uZS5FcXVhbFBvd2VyR2FpbigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIGludmVydCB0aGUgaW5jb21pbmcgc2lnbmFsXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX29uZSA9IHRoaXMuY29udGV4dC5nZXRDb25zdGFudCgxKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBpbnZlcnQgdGhlIGluY29taW5nIHNpZ25hbFxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuU3VidHJhY3R9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9pbnZlcnQgPSBuZXcgVG9uZS5TdWJ0cmFjdCgpO1xuXHQgICAgICAgIC8vY29ubmVjdGlvbnNcblx0ICAgICAgICB0aGlzLmEuY29ubmVjdCh0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5iLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIHRoaXMuZmFkZS5jaGFpbih0aGlzLl9lcXVhbFBvd2VyQiwgdGhpcy5iLmdhaW4pO1xuXHQgICAgICAgIHRoaXMuX29uZS5jb25uZWN0KHRoaXMuX2ludmVydCwgMCwgMCk7XG5cdCAgICAgICAgdGhpcy5mYWRlLmNvbm5lY3QodGhpcy5faW52ZXJ0LCAwLCAxKTtcblx0ICAgICAgICB0aGlzLl9pbnZlcnQuY2hhaW4odGhpcy5fZXF1YWxQb3dlckEsIHRoaXMuYS5nYWluKTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seSgnZmFkZScpO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQ3Jvc3NGYWRlLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuQ3Jvc3NGYWRlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkNyb3NzRmFkZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCdmYWRlJyk7XG5cdCAgICAgICAgdGhpcy5fZXF1YWxQb3dlckEuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2VxdWFsUG93ZXJBID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9lcXVhbFBvd2VyQi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZXF1YWxQb3dlckIgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZmFkZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5mYWRlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9pbnZlcnQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2ludmVydCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fb25lID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmEuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuYSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5iLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmIgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkNyb3NzRmFkZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLkZpbHRlciBpcyBhIGZpbHRlciB3aGljaCBhbGxvd3MgZm9yIGFsbCBvZiB0aGUgc2FtZSBuYXRpdmUgbWV0aG9kc1xuXHRcdCAqICAgICAgICAgIGFzIHRoZSBbQmlxdWFkRmlsdGVyTm9kZV0oaHR0cDovL3dlYmF1ZGlvLmdpdGh1Yi5pby93ZWItYXVkaW8tYXBpLyN0aGUtYmlxdWFkZmlsdGVybm9kZS1pbnRlcmZhY2UpLlxuXHRcdCAqICAgICAgICAgIFRvbmUuRmlsdGVyIGhhcyB0aGUgYWRkZWQgYWJpbGl0eSB0byBzZXQgdGhlIGZpbHRlciByb2xsb2ZmIGF0IC0xMlxuXHRcdCAqICAgICAgICAgIChkZWZhdWx0KSwgLTI0IGFuZCAtNDguXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKiAgQHBhcmFtIHtGcmVxdWVuY3l8T2JqZWN0fSBbZnJlcXVlbmN5XSBUaGUgY3V0b2ZmIGZyZXF1ZW5jeSBvZiB0aGUgZmlsdGVyLlxuXHRcdCAqICBAcGFyYW0ge3N0cmluZz19IHR5cGUgVGhlIHR5cGUgb2YgZmlsdGVyLlxuXHRcdCAqICBAcGFyYW0ge251bWJlcj19IHJvbGxvZmYgVGhlIGRyb3AgaW4gZGVjaWJlbHMgcGVyIG9jdGF2ZSBhZnRlciB0aGUgY3V0b2ZmIGZyZXF1ZW5jeS5cblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIGNob2ljZXM6IC0xMiwgLTI0LCBhbmQgLTQ4XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogIHZhciBmaWx0ZXIgPSBuZXcgVG9uZS5GaWx0ZXIoMjAwLCBcImhpZ2hwYXNzXCIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5GaWx0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ3R5cGUnLFxuXHQgICAgICAgICAgICAncm9sbG9mZidcblx0ICAgICAgICBdLCBUb25lLkZpbHRlcik7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmNyZWF0ZUluc091dHMoMSwgMSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGZpbHRlcihzKVxuXHRcdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZmlsdGVycyA9IFtdO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBjdXRvZmYgZnJlcXVlbmN5IG9mIHRoZSBmaWx0ZXIuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLmZyZXF1ZW5jeSwgVG9uZS5UeXBlLkZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGRldHVuZSBwYXJhbWV0ZXJcblx0XHRcdCAqICBAdHlwZSB7Q2VudHN9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5kZXR1bmUgPSBuZXcgVG9uZS5TaWduYWwoMCwgVG9uZS5UeXBlLkNlbnRzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZ2FpbiBvZiB0aGUgZmlsdGVyLCBvbmx5IHVzZWQgaW4gY2VydGFpbiBmaWx0ZXIgdHlwZXNcblx0XHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZ2FpbiA9IG5ldyBUb25lLlNpZ25hbCh7XG5cdCAgICAgICAgICAgICd2YWx1ZSc6IG9wdGlvbnMuZ2Fpbixcblx0ICAgICAgICAgICAgJ2NvbnZlcnQnOiBmYWxzZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBRIG9yIFF1YWxpdHkgb2YgdGhlIGZpbHRlclxuXHRcdFx0ICogIEB0eXBlIHtQb3NpdGl2ZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLlEgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5RKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgdHlwZSBvZiB0aGUgZmlsdGVyXG5cdFx0XHQgKiAgQHR5cGUge3N0cmluZ31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdHlwZSA9IG9wdGlvbnMudHlwZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgcm9sbG9mZiB2YWx1ZSBvZiB0aGUgZmlsdGVyXG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcm9sbG9mZiA9IG9wdGlvbnMucm9sbG9mZjtcblx0ICAgICAgICAvL3NldCB0aGUgcm9sbG9mZjtcblx0ICAgICAgICB0aGlzLnJvbGxvZmYgPSBvcHRpb25zLnJvbGxvZmY7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnZGV0dW5lJyxcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdnYWluJyxcblx0ICAgICAgICAgICAgJ1EnXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5GaWx0ZXIsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzXG5cdFx0ICpcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5GaWx0ZXIuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3R5cGUnOiAnbG93cGFzcycsXG5cdCAgICAgICAgJ2ZyZXF1ZW5jeSc6IDM1MCxcblx0ICAgICAgICAncm9sbG9mZic6IC0xMixcblx0ICAgICAgICAnUSc6IDEsXG5cdCAgICAgICAgJ2dhaW4nOiAwXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHR5cGUgb2YgdGhlIGZpbHRlci4gVHlwZXM6IFwibG93cGFzc1wiLCBcImhpZ2hwYXNzXCIsXG5cdFx0ICogXCJiYW5kcGFzc1wiLCBcImxvd3NoZWxmXCIsIFwiaGlnaHNoZWxmXCIsIFwibm90Y2hcIiwgXCJhbGxwYXNzXCIsIG9yIFwicGVha2luZ1wiLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkZpbHRlciNcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxuXHRcdCAqIEBuYW1lIHR5cGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkZpbHRlci5wcm90b3R5cGUsICd0eXBlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHR5cGUpIHtcblx0ICAgICAgICAgICAgdmFyIHR5cGVzID0gW1xuXHQgICAgICAgICAgICAgICAgJ2xvd3Bhc3MnLFxuXHQgICAgICAgICAgICAgICAgJ2hpZ2hwYXNzJyxcblx0ICAgICAgICAgICAgICAgICdiYW5kcGFzcycsXG5cdCAgICAgICAgICAgICAgICAnbG93c2hlbGYnLFxuXHQgICAgICAgICAgICAgICAgJ2hpZ2hzaGVsZicsXG5cdCAgICAgICAgICAgICAgICAnbm90Y2gnLFxuXHQgICAgICAgICAgICAgICAgJ2FsbHBhc3MnLFxuXHQgICAgICAgICAgICAgICAgJ3BlYWtpbmcnXG5cdCAgICAgICAgICAgIF07XG5cdCAgICAgICAgICAgIGlmICh0eXBlcy5pbmRleE9mKHR5cGUpID09PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVG9uZS5GaWx0ZXI6IGludmFsaWQgdHlwZSAnICsgdHlwZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZmlsdGVycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyc1tpXS50eXBlID0gdHlwZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHJvbGxvZmYgb2YgdGhlIGZpbHRlciB3aGljaCBpcyB0aGUgZHJvcCBpbiBkYlxuXHRcdCAqIHBlciBvY3RhdmUuIEltcGxlbWVudGVkIGludGVybmFsbHkgYnkgY2FzY2FkaW5nIGZpbHRlcnMuXG5cdFx0ICogT25seSBhY2NlcHRzIHRoZSB2YWx1ZXMgLTEyLCAtMjQsIC00OCBhbmQgLTk2LlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkZpbHRlciNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIHJvbGxvZmZcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkZpbHRlci5wcm90b3R5cGUsICdyb2xsb2ZmJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9sbG9mZjtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJvbGxvZmYpIHtcblx0ICAgICAgICAgICAgcm9sbG9mZiA9IHBhcnNlSW50KHJvbGxvZmYsIDEwKTtcblx0ICAgICAgICAgICAgdmFyIHBvc3NpYmlsaXRpZXMgPSBbXG5cdCAgICAgICAgICAgICAgICAtMTIsXG5cdCAgICAgICAgICAgICAgICAtMjQsXG5cdCAgICAgICAgICAgICAgICAtNDgsXG5cdCAgICAgICAgICAgICAgICAtOTZcblx0ICAgICAgICAgICAgXTtcblx0ICAgICAgICAgICAgdmFyIGNhc2NhZGluZ0NvdW50ID0gcG9zc2liaWxpdGllcy5pbmRleE9mKHJvbGxvZmYpO1xuXHQgICAgICAgICAgICAvL2NoZWNrIHRoZSByb2xsb2ZmIGlzIHZhbGlkXG5cdCAgICAgICAgICAgIGlmIChjYXNjYWRpbmdDb3VudCA9PT0gLTEpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUb25lLkZpbHRlcjogcm9sbG9mZiBjYW4gb25seSBiZSAtMTIsIC0yNCwgLTQ4IG9yIC05NicpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhc2NhZGluZ0NvdW50ICs9IDE7XG5cdCAgICAgICAgICAgIHRoaXMuX3JvbGxvZmYgPSByb2xsb2ZmO1xuXHQgICAgICAgICAgICAvL2ZpcnN0IGRpc2Nvbm5lY3QgdGhlIGZpbHRlcnMgYW5kIHRocm93IHRoZW0gYXdheVxuXHQgICAgICAgICAgICB0aGlzLmlucHV0LmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9maWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJzW2ldLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnNbaV0gPSBudWxsO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnMgPSBuZXcgQXJyYXkoY2FzY2FkaW5nQ291bnQpO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBjb3VudCA9IDA7IGNvdW50IDwgY2FzY2FkaW5nQ291bnQ7IGNvdW50KyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQmlxdWFkRmlsdGVyKCk7XG5cdCAgICAgICAgICAgICAgICBmaWx0ZXIudHlwZSA9IHRoaXMuX3R5cGU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KGZpbHRlci5mcmVxdWVuY3kpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5kZXR1bmUuY29ubmVjdChmaWx0ZXIuZGV0dW5lKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuUS5jb25uZWN0KGZpbHRlci5RKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZ2Fpbi5jb25uZWN0KGZpbHRlci5nYWluKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnNbY291bnRdID0gZmlsdGVyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vY29ubmVjdCB0aGVtIHVwXG5cdCAgICAgICAgICAgIHZhciBjb25uZWN0aW9uQ2hhaW4gPSBbdGhpcy5pbnB1dF0uY29uY2F0KHRoaXMuX2ZpbHRlcnMpLmNvbmNhdChbdGhpcy5vdXRwdXRdKTtcblx0ICAgICAgICAgICAgVG9uZS5jb25uZWN0U2VyaWVzLmFwcGx5KFRvbmUsIGNvbm5lY3Rpb25DaGFpbik7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuRmlsdGVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkZpbHRlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZmlsdGVycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB0aGlzLl9maWx0ZXJzW2ldLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICAgICAgdGhpcy5fZmlsdGVyc1tpXSA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2ZpbHRlcnMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ2RldHVuZScsXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZ2FpbicsXG5cdCAgICAgICAgICAgICdRJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLlEuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLlEgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmRldHVuZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5nYWluLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmdhaW4gPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkZpbHRlcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFNwbGl0IHRoZSBpbmNvbWluZyBzaWduYWwgaW50byB0aHJlZSBiYW5kcyAobG93LCBtaWQsIGhpZ2gpXG5cdFx0ICogICAgICAgICB3aXRoIHR3byBjcm9zc292ZXIgZnJlcXVlbmN5IGNvbnRyb2xzLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fE9iamVjdH0gW2xvd0ZyZXF1ZW5jeV0gdGhlIGxvdy9taWQgY3Jvc3NvdmVyIGZyZXF1ZW5jeVxuXHRcdCAqICBAcGFyYW0ge0ZyZXF1ZW5jeX0gW2hpZ2hGcmVxdWVuY3ldIHRoZSBtaWQvaGlnaCBjcm9zc292ZXIgZnJlcXVlbmN5XG5cdFx0ICovXG5cdCAgICBUb25lLk11bHRpYmFuZFNwbGl0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2xvd0ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdoaWdoRnJlcXVlbmN5J1xuXHQgICAgICAgIF0sIFRvbmUuTXVsdGliYW5kU3BsaXQpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGlucHV0XG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5pbnB1dCA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgb3V0cHV0c1xuXHRcdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5vdXRwdXQgPSBuZXcgQXJyYXkoMyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGxvdyBiYW5kLiBBbGlhcyBmb3IgPGNvZGU+b3V0cHV0WzBdPC9jb2RlPlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkZpbHRlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMubG93ID0gdGhpcy5vdXRwdXRbMF0gPSBuZXcgVG9uZS5GaWx0ZXIoMCwgJ2xvd3Bhc3MnKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbG93ZXIgZmlsdGVyIG9mIHRoZSBtaWQgYmFuZFxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkZpbHRlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbG93TWlkRmlsdGVyID0gbmV3IFRvbmUuRmlsdGVyKDAsICdoaWdocGFzcycpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtaWQgYmFuZCBvdXRwdXQuIEFsaWFzIGZvciA8Y29kZT5vdXRwdXRbMV08L2NvZGU+XG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRmlsdGVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5taWQgPSB0aGlzLm91dHB1dFsxXSA9IG5ldyBUb25lLkZpbHRlcigwLCAnbG93cGFzcycpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBoaWdoIGJhbmQgb3V0cHV0LiBBbGlhcyBmb3IgPGNvZGU+b3V0cHV0WzJdPC9jb2RlPlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkZpbHRlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuaGlnaCA9IHRoaXMub3V0cHV0WzJdID0gbmV3IFRvbmUuRmlsdGVyKDAsICdoaWdocGFzcycpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBsb3cvbWlkIGNyb3Nzb3ZlciBmcmVxdWVuY3kuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmxvd0ZyZXF1ZW5jeSA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLmxvd0ZyZXF1ZW5jeSwgVG9uZS5UeXBlLkZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG1pZC9oaWdoIGNyb3Nzb3ZlciBmcmVxdWVuY3kuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmhpZ2hGcmVxdWVuY3kgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5oaWdoRnJlcXVlbmN5LCBUb25lLlR5cGUuRnJlcXVlbmN5KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgcXVhbGl0eSBvZiBhbGwgdGhlIGZpbHRlcnNcblx0XHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuUSA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLlEpO1xuXHQgICAgICAgIHRoaXMuaW5wdXQuZmFuKHRoaXMubG93LCB0aGlzLmhpZ2gpO1xuXHQgICAgICAgIHRoaXMuaW5wdXQuY2hhaW4odGhpcy5fbG93TWlkRmlsdGVyLCB0aGlzLm1pZCk7XG5cdCAgICAgICAgLy90aGUgZnJlcXVlbmN5IGNvbnRyb2wgc2lnbmFsXG5cdCAgICAgICAgdGhpcy5sb3dGcmVxdWVuY3kuY29ubmVjdCh0aGlzLmxvdy5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMubG93RnJlcXVlbmN5LmNvbm5lY3QodGhpcy5fbG93TWlkRmlsdGVyLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgdGhpcy5oaWdoRnJlcXVlbmN5LmNvbm5lY3QodGhpcy5taWQuZnJlcXVlbmN5KTtcblx0ICAgICAgICB0aGlzLmhpZ2hGcmVxdWVuY3kuY29ubmVjdCh0aGlzLmhpZ2guZnJlcXVlbmN5KTtcblx0ICAgICAgICAvL3RoZSBRIHZhbHVlXG5cdCAgICAgICAgdGhpcy5RLmNvbm5lY3QodGhpcy5sb3cuUSk7XG5cdCAgICAgICAgdGhpcy5RLmNvbm5lY3QodGhpcy5fbG93TWlkRmlsdGVyLlEpO1xuXHQgICAgICAgIHRoaXMuUS5jb25uZWN0KHRoaXMubWlkLlEpO1xuXHQgICAgICAgIHRoaXMuUS5jb25uZWN0KHRoaXMuaGlnaC5RKTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdoaWdoJyxcblx0ICAgICAgICAgICAgJ21pZCcsXG5cdCAgICAgICAgICAgICdsb3cnLFxuXHQgICAgICAgICAgICAnaGlnaEZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdsb3dGcmVxdWVuY3knXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5NdWx0aWJhbmRTcGxpdCwgVG9uZS5BdWRpb05vZGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuTXVsdGliYW5kU3BsaXQuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2xvd0ZyZXF1ZW5jeSc6IDQwMCxcblx0ICAgICAgICAnaGlnaEZyZXF1ZW5jeSc6IDI1MDAsXG5cdCAgICAgICAgJ1EnOiAxXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5NdWx0aWJhbmRTcGxpdH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NdWx0aWJhbmRTcGxpdC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ2hpZ2gnLFxuXHQgICAgICAgICAgICAnbWlkJyxcblx0ICAgICAgICAgICAgJ2xvdycsXG5cdCAgICAgICAgICAgICdoaWdoRnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2xvd0ZyZXF1ZW5jeSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmxvdy5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5sb3cgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2xvd01pZEZpbHRlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbG93TWlkRmlsdGVyID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm1pZC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5taWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuaGlnaC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5oaWdoID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmxvd0ZyZXF1ZW5jeS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5sb3dGcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuaGlnaEZyZXF1ZW5jeS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5oaWdoRnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLlEuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuUSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuTXVsdGliYW5kU3BsaXQ7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLkVRMyBpcyBhIHRocmVlIGJhbmQgRVEgd2l0aCBjb250cm9sIG92ZXIgbG93LCBtaWQsIGFuZCBoaWdoIGdhaW4gYXNcblx0XHQgKiAgICAgICAgIHdlbGwgYXMgdGhlIGxvdyBhbmQgaGlnaCBjcm9zc292ZXIgZnJlcXVlbmNpZXMuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKlxuXHRcdCAqICBAcGFyYW0ge0RlY2liZWxzfE9iamVjdH0gW2xvd0xldmVsXSBUaGUgZ2FpbiBhcHBsaWVkIHRvIHRoZSBsb3dzLlxuXHRcdCAqICBAcGFyYW0ge0RlY2liZWxzfSBbbWlkTGV2ZWxdIFRoZSBnYWluIGFwcGxpZWQgdG8gdGhlIG1pZC5cblx0XHQgKiAgQHBhcmFtIHtEZWNpYmVsc30gW2hpZ2hMZXZlbF0gVGhlIGdhaW4gYXBwbGllZCB0byB0aGUgaGlnaC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgZXEgPSBuZXcgVG9uZS5FUTMoLTEwLCAzLCAtMjApO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5FUTMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnbG93Jyxcblx0ICAgICAgICAgICAgJ21pZCcsXG5cdCAgICAgICAgICAgICdoaWdoJ1xuXHQgICAgICAgIF0sIFRvbmUuRVEzKTtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBvdXRwdXQgbm9kZVxuXHRcdFx0ICogIEB0eXBlIHtHYWluTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG11bHRpYmFuZCBzcGxpdFxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk11bHRpYmFuZFNwbGl0fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tdWx0aWJhbmRTcGxpdCA9IHRoaXMuaW5wdXQgPSBuZXcgVG9uZS5NdWx0aWJhbmRTcGxpdCh7XG5cdCAgICAgICAgICAgICdsb3dGcmVxdWVuY3knOiBvcHRpb25zLmxvd0ZyZXF1ZW5jeSxcblx0ICAgICAgICAgICAgJ2hpZ2hGcmVxdWVuY3knOiBvcHRpb25zLmhpZ2hGcmVxdWVuY3lcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZ2FpbiBmb3IgdGhlIGxvd2VyIHNpZ25hbHNcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbG93R2FpbiA9IG5ldyBUb25lLkdhaW4ob3B0aW9ucy5sb3csIFRvbmUuVHlwZS5EZWNpYmVscyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGdhaW4gZm9yIHRoZSBtaWQgc2lnbmFsc1xuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5HYWlufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9taWRHYWluID0gbmV3IFRvbmUuR2FpbihvcHRpb25zLm1pZCwgVG9uZS5UeXBlLkRlY2liZWxzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBnYWluIGluIGRlY2liZWxzIG9mIHRoZSBoaWdoIHBhcnRcblx0XHRcdCAqIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5faGlnaEdhaW4gPSBuZXcgVG9uZS5HYWluKG9wdGlvbnMuaGlnaCwgVG9uZS5UeXBlLkRlY2liZWxzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBnYWluIGluIGRlY2liZWxzIG9mIHRoZSBsb3cgcGFydFxuXHRcdFx0ICogQHR5cGUge0RlY2liZWxzfVxuXHRcdFx0ICogQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5sb3cgPSB0aGlzLl9sb3dHYWluLmdhaW47XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgZ2FpbiBpbiBkZWNpYmVscyBvZiB0aGUgbWlkIHBhcnRcblx0XHRcdCAqIEB0eXBlIHtEZWNpYmVsc31cblx0XHRcdCAqIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMubWlkID0gdGhpcy5fbWlkR2Fpbi5nYWluO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIGdhaW4gaW4gZGVjaWJlbHMgb2YgdGhlIGhpZ2ggcGFydFxuXHRcdFx0ICogQHR5cGUge0RlY2liZWxzfVxuXHRcdFx0ICogQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5oaWdoID0gdGhpcy5faGlnaEdhaW4uZ2Fpbjtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgUSB2YWx1ZSBmb3IgYWxsIG9mIHRoZSBmaWx0ZXJzLlxuXHRcdFx0ICogIEB0eXBlIHtQb3NpdGl2ZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLlEgPSB0aGlzLl9tdWx0aWJhbmRTcGxpdC5RO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBsb3cvbWlkIGNyb3Nzb3ZlciBmcmVxdWVuY3kuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmxvd0ZyZXF1ZW5jeSA9IHRoaXMuX211bHRpYmFuZFNwbGl0Lmxvd0ZyZXF1ZW5jeTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbWlkL2hpZ2ggY3Jvc3NvdmVyIGZyZXF1ZW5jeS5cblx0XHRcdCAqICBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuaGlnaEZyZXF1ZW5jeSA9IHRoaXMuX211bHRpYmFuZFNwbGl0LmhpZ2hGcmVxdWVuY3k7XG5cdCAgICAgICAgLy90aGUgZnJlcXVlbmN5IGJhbmRzXG5cdCAgICAgICAgdGhpcy5fbXVsdGliYW5kU3BsaXQubG93LmNoYWluKHRoaXMuX2xvd0dhaW4sIHRoaXMub3V0cHV0KTtcblx0ICAgICAgICB0aGlzLl9tdWx0aWJhbmRTcGxpdC5taWQuY2hhaW4odGhpcy5fbWlkR2FpbiwgdGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIHRoaXMuX211bHRpYmFuZFNwbGl0LmhpZ2guY2hhaW4odGhpcy5faGlnaEdhaW4sIHRoaXMub3V0cHV0KTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdsb3cnLFxuXHQgICAgICAgICAgICAnbWlkJyxcblx0ICAgICAgICAgICAgJ2hpZ2gnLFxuXHQgICAgICAgICAgICAnbG93RnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2hpZ2hGcmVxdWVuY3knXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5FUTMsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdCB2YWx1ZXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRVEzLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdsb3cnOiAwLFxuXHQgICAgICAgICdtaWQnOiAwLFxuXHQgICAgICAgICdoaWdoJzogMCxcblx0ICAgICAgICAnbG93RnJlcXVlbmN5JzogNDAwLFxuXHQgICAgICAgICdoaWdoRnJlcXVlbmN5JzogMjUwMFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5FUTN9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRVEzLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAnbG93Jyxcblx0ICAgICAgICAgICAgJ21pZCcsXG5cdCAgICAgICAgICAgICdoaWdoJyxcblx0ICAgICAgICAgICAgJ2xvd0ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdoaWdoRnJlcXVlbmN5J1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMuX211bHRpYmFuZFNwbGl0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9tdWx0aWJhbmRTcGxpdCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5sb3dGcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuaGlnaEZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbG93R2Fpbi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbG93R2FpbiA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbWlkR2Fpbi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbWlkR2FpbiA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5faGlnaEdhaW4uZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2hpZ2hHYWluID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmxvdyA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5taWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuaGlnaCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5RID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5FUTM7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgUGVyZm9ybXMgYSBsaW5lYXIgc2NhbGluZyBvbiBhbiBpbnB1dCBzaWduYWwuXG5cdFx0ICogICAgICAgICAgU2NhbGVzIGEgTm9ybWFsUmFuZ2UgaW5wdXQgdG8gYmV0d2VlblxuXHRcdCAqICAgICAgICAgIG91dHB1dE1pbiBhbmQgb3V0cHV0TWF4LlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TaWduYWxCYXNlfVxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW291dHB1dE1pbj0wXSBUaGUgb3V0cHV0IHZhbHVlIHdoZW4gdGhlIGlucHV0IGlzIDAuIFxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW291dHB1dE1heD0xXVx0VGhlIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyAxLiBcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgc2NhbGUgPSBuZXcgVG9uZS5TY2FsZSg1MCwgMTAwKTtcblx0XHQgKiB2YXIgc2lnbmFsID0gbmV3IFRvbmUuU2lnbmFsKDAuNSkuY29ubmVjdChzY2FsZSk7XG5cdFx0ICogLy90aGUgb3V0cHV0IG9mIHNjYWxlIGVxdWFscyA3NVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TY2FsZSA9IGZ1bmN0aW9uIChvdXRwdXRNaW4sIG91dHB1dE1heCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKiBcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtudW1iZXJ9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vdXRwdXRNaW4gPSBUb25lLmRlZmF1bHRBcmcob3V0cHV0TWluLCAwKTtcblx0ICAgICAgICAvKiogXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqICBAdHlwZSB7bnVtYmVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fb3V0cHV0TWF4ID0gVG9uZS5kZWZhdWx0QXJnKG91dHB1dE1heCwgMSk7XG5cdCAgICAgICAgLyoqIFxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTXVsdGlwbHl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NjYWxlID0gdGhpcy5pbnB1dCA9IG5ldyBUb25lLk11bHRpcGx5KDEpO1xuXHQgICAgICAgIC8qKiBcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkFkZH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYWRkID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5BZGQoMCk7XG5cdCAgICAgICAgdGhpcy5fc2NhbGUuY29ubmVjdCh0aGlzLl9hZGQpO1xuXHQgICAgICAgIHRoaXMuX3NldFJhbmdlKCk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5TY2FsZSwgVG9uZS5TaWduYWxCYXNlKTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBtaW5pbXVtIG91dHB1dCB2YWx1ZS4gVGhpcyBudW1iZXIgaXMgb3V0cHV0IHdoZW4gXG5cdFx0ICogdGhlIHZhbHVlIGlucHV0IHZhbHVlIGlzIDAuIFxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlNjYWxlI1xuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICogQG5hbWUgbWluXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5TY2FsZS5wcm90b3R5cGUsICdtaW4nLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdXRwdXRNaW47XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtaW4pIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3V0cHV0TWluID0gbWluO1xuXHQgICAgICAgICAgICB0aGlzLl9zZXRSYW5nZSgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG1heGltdW0gb3V0cHV0IHZhbHVlLiBUaGlzIG51bWJlciBpcyBvdXRwdXQgd2hlbiBcblx0XHQgKiB0aGUgdmFsdWUgaW5wdXQgdmFsdWUgaXMgMS4gXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuU2NhbGUjXG5cdFx0ICogQHR5cGUge251bWJlcn1cblx0XHQgKiBAbmFtZSBtYXhcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlNjYWxlLnByb3RvdHlwZSwgJ21heCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX291dHB1dE1heDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG1heCkge1xuXHQgICAgICAgICAgICB0aGlzLl9vdXRwdXRNYXggPSBtYXg7XG5cdCAgICAgICAgICAgIHRoaXMuX3NldFJhbmdlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgc2V0IHRoZSB2YWx1ZXNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuU2NhbGUucHJvdG90eXBlLl9zZXRSYW5nZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLl9hZGQudmFsdWUgPSB0aGlzLl9vdXRwdXRNaW47XG5cdCAgICAgICAgdGhpcy5fc2NhbGUudmFsdWUgPSB0aGlzLl9vdXRwdXRNYXggLSB0aGlzLl9vdXRwdXRNaW47XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5TY2FsZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TY2FsZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlNpZ25hbEJhc2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9hZGQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2FkZCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fc2NhbGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3NjYWxlID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5TY2FsZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgUGVyZm9ybXMgYW4gZXhwb25lbnRpYWwgc2NhbGluZyBvbiBhbiBpbnB1dCBzaWduYWwuXG5cdFx0ICogICAgICAgICAgU2NhbGVzIGEgTm9ybWFsUmFuZ2UgdmFsdWUgWzAsMV0gZXhwb25lbnRpYWxseVxuXHRcdCAqICAgICAgICAgIHRvIHRoZSBvdXRwdXQgcmFuZ2Ugb2Ygb3V0cHV0TWluIHRvIG91dHB1dE1heC5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuU2lnbmFsQmFzZX1cblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IFtvdXRwdXRNaW49MF0gVGhlIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyAwLlxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW291dHB1dE1heD0xXVx0VGhlIG91dHB1dCB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBpcyAxLlxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW2V4cG9uZW50PTJdIFRoZSBleHBvbmVudCB3aGljaCBzY2FsZXMgdGhlIGluY29taW5nIHNpZ25hbC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgc2NhbGVFeHAgPSBuZXcgVG9uZS5TY2FsZUV4cCgwLCAxMDAsIDIpO1xuXHRcdCAqIHZhciBzaWduYWwgPSBuZXcgVG9uZS5TaWduYWwoMC41KS5jb25uZWN0KHNjYWxlRXhwKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuU2NhbGVFeHAgPSBmdW5jdGlvbiAob3V0cHV0TWluLCBvdXRwdXRNYXgsIGV4cG9uZW50KSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgc2NhbGUgdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQgcmFuZ2Vcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5TY2FsZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc2NhbGUgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLlNjYWxlKG91dHB1dE1pbiwgb3V0cHV0TWF4KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlBvd31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZXhwID0gdGhpcy5pbnB1dCA9IG5ldyBUb25lLlBvdyhUb25lLmRlZmF1bHRBcmcoZXhwb25lbnQsIDIpKTtcblx0ICAgICAgICB0aGlzLl9leHAuY29ubmVjdCh0aGlzLl9zY2FsZSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5TY2FsZUV4cCwgVG9uZS5TaWduYWxCYXNlKTtcblx0ICAgIC8qKlxuXHRcdCAqIEluc3RlYWQgb2YgaW50ZXJwb2xhdGluZyBsaW5lYXJseSBiZXR3ZWVuIHRoZSA8Y29kZT5taW48L2NvZGU+IGFuZFxuXHRcdCAqIDxjb2RlPm1heDwvY29kZT4gdmFsdWVzLCBzZXR0aW5nIHRoZSBleHBvbmVudCB3aWxsIGludGVycG9sYXRlIGJldHdlZW5cblx0XHQgKiB0aGUgdHdvIHZhbHVlcyB3aXRoIGFuIGV4cG9uZW50aWFsIGN1cnZlLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlNjYWxlRXhwI1xuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICogQG5hbWUgZXhwb25lbnRcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlNjYWxlRXhwLnByb3RvdHlwZSwgJ2V4cG9uZW50Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwLnZhbHVlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoZXhwKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2V4cC52YWx1ZSA9IGV4cDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBtaW5pbXVtIG91dHB1dCB2YWx1ZS4gVGhpcyBudW1iZXIgaXMgb3V0cHV0IHdoZW5cblx0XHQgKiB0aGUgdmFsdWUgaW5wdXQgdmFsdWUgaXMgMC5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5TY2FsZUV4cCNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIG1pblxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuU2NhbGVFeHAucHJvdG90eXBlLCAnbWluJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2NhbGUubWluO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAobWluKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NjYWxlLm1pbiA9IG1pbjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBtYXhpbXVtIG91dHB1dCB2YWx1ZS4gVGhpcyBudW1iZXIgaXMgb3V0cHV0IHdoZW5cblx0XHQgKiB0aGUgdmFsdWUgaW5wdXQgdmFsdWUgaXMgMS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5TY2FsZUV4cCNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIG1heFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuU2NhbGVFeHAucHJvdG90eXBlLCAnbWF4Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2NhbGUubWF4O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAobWF4KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NjYWxlLm1heCA9IG1heDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuU2NhbGVFeHB9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuU2NhbGVFeHAucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc2NhbGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3NjYWxlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9leHAuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2V4cCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuU2NhbGVFeHA7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBXcmFwcGVyIGFyb3VuZCBXZWIgQXVkaW8ncyBuYXRpdmUgW0RlbGF5Tm9kZV0oaHR0cDovL3dlYmF1ZGlvLmdpdGh1Yi5pby93ZWItYXVkaW8tYXBpLyN0aGUtZGVsYXlub2RlLWludGVyZmFjZSkuXG5cdFx0ICogIEBleHRlbmRzIHtUb25lfVxuXHRcdCAqICBAcGFyYW0ge1RpbWU9fSBkZWxheVRpbWUgVGhlIGRlbGF5IGFwcGxpZWQgdG8gdGhlIGluY29taW5nIHNpZ25hbC5cblx0XHQgKiAgQHBhcmFtIHtUaW1lPX0gbWF4RGVsYXkgVGhlIG1heGltdW0gZGVsYXkgdGltZS5cblx0XHQgKi9cblx0ICAgIFRvbmUuRGVsYXkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZGVsYXlUaW1lJyxcblx0ICAgICAgICAgICAgJ21heERlbGF5J1xuXHQgICAgICAgIF0sIFRvbmUuRGVsYXkpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgbWF4aW11bSBkZWxheSB0aW1lIGluaXRpYWxpemVkIHdpdGggdGhlIG5vZGVcblx0XHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbWF4RGVsYXkgPSBNYXRoLm1heCh0aGlzLnRvU2Vjb25kcyhvcHRpb25zLm1heERlbGF5KSwgdGhpcy50b1NlY29uZHMob3B0aW9ucy5kZWxheVRpbWUpKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbmF0aXZlIGRlbGF5IG5vZGVcblx0XHRcdCAqICBAdHlwZSB7RGVsYXlOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9kZWxheU5vZGUgPSB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSB0aGlzLmNvbnRleHQuY3JlYXRlRGVsYXkodGhpcy5fbWF4RGVsYXkpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhbW91bnQgb2YgdGltZSB0aGUgaW5jb21pbmcgc2lnbmFsIGlzXG5cdFx0XHQgKiAgZGVsYXllZC5cblx0XHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmRlbGF5VGltZSA9IG5ldyBUb25lLlBhcmFtKHtcblx0ICAgICAgICAgICAgJ3BhcmFtJzogdGhpcy5fZGVsYXlOb2RlLmRlbGF5VGltZSxcblx0ICAgICAgICAgICAgJ3VuaXRzJzogVG9uZS5UeXBlLlRpbWUsXG5cdCAgICAgICAgICAgICd2YWx1ZSc6IG9wdGlvbnMuZGVsYXlUaW1lXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoJ2RlbGF5VGltZScpO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuRGVsYXksIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5EZWxheS5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnbWF4RGVsYXknOiAxLFxuXHQgICAgICAgICdkZWxheVRpbWUnOiAwXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG1heGltdW0gZGVsYXkgdGltZS4gVGhpcyBjYW5ub3QgYmUgY2hhbmdlZC4gVGhlIHZhbHVlIGlzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3Rvci5cblx0XHQgKiBAbWVtYmVyb2YgVG9uZS5EZWxheSNcblx0XHQgKiBAdHlwZSB7VGltZX1cblx0XHQgKiBAbmFtZSBtYXhEZWxheVxuXHRcdCAqIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRGVsYXkucHJvdG90eXBlLCAnbWF4RGVsYXknLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXhEZWxheTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuRGVsYXl9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkRlbGF5LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlOb2RlLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB0aGlzLl9kZWxheU5vZGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCdkZWxheVRpbWUnKTtcblx0ICAgICAgICB0aGlzLmRlbGF5VGltZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuRGVsYXk7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBDb21iIGZpbHRlcnMgYXJlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrcyBmb3IgcGh5c2ljYWwgbW9kZWxpbmcuIFJlYWQgbW9yZVxuXHRcdCAqICAgICAgICAgYWJvdXQgY29tYiBmaWx0ZXJzIG9uIFtDQ1JNQSdzIHdlYnNpdGVdKGh0dHBzOi8vY2NybWEuc3RhbmZvcmQuZWR1L35qb3MvcGFzcC9GZWVkYmFja19Db21iX0ZpbHRlcnMuaHRtbCkuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQHBhcmFtIHtUaW1lfE9iamVjdH0gW2RlbGF5VGltZV0gVGhlIGRlbGF5IHRpbWUgb2YgdGhlIGZpbHRlci5cblx0XHQgKiAgQHBhcmFtIHtOb3JtYWxSYW5nZT19IHJlc29uYW5jZSBUaGUgYW1vdW50IG9mIGZlZWRiYWNrIHRoZSBmaWx0ZXIgaGFzLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5GZWVkYmFja0NvbWJGaWx0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZGVsYXlUaW1lJyxcblx0ICAgICAgICAgICAgJ3Jlc29uYW5jZSdcblx0ICAgICAgICBdLCBUb25lLkZlZWRiYWNrQ29tYkZpbHRlcik7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgZGVsYXkgbm9kZVxuXHRcdFx0ICogIEB0eXBlIHtEZWxheU5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2RlbGF5ID0gdGhpcy5pbnB1dCA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuRGVsYXkob3B0aW9ucy5kZWxheVRpbWUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhbW91bnQgb2YgZGVsYXkgb2YgdGhlIGNvbWIgZmlsdGVyLlxuXHRcdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGVsYXlUaW1lID0gdGhpcy5fZGVsYXkuZGVsYXlUaW1lO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBmZWVkYmFjayBub2RlXG5cdFx0XHQgKiAgQHR5cGUge0dhaW5Ob2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mZWVkYmFjayA9IG5ldyBUb25lLkdhaW4ob3B0aW9ucy5yZXNvbmFuY2UsIFRvbmUuVHlwZS5Ob3JtYWxSYW5nZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGFtb3VudCBvZiBmZWVkYmFjayBvZiB0aGUgZGVsYXllZCBzaWduYWwuXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucmVzb25hbmNlID0gdGhpcy5fZmVlZGJhY2suZ2Fpbjtcblx0ICAgICAgICB0aGlzLl9kZWxheS5jaGFpbih0aGlzLl9mZWVkYmFjaywgdGhpcy5fZGVsYXkpO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFtcblx0ICAgICAgICAgICAgJ3Jlc29uYW5jZScsXG5cdCAgICAgICAgICAgICdkZWxheVRpbWUnXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5GZWVkYmFja0NvbWJGaWx0ZXIsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkZlZWRiYWNrQ29tYkZpbHRlci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZGVsYXlUaW1lJzogMC4xLFxuXHQgICAgICAgICdyZXNvbmFuY2UnOiAwLjVcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRmVlZGJhY2tDb21iRmlsdGVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkZlZWRiYWNrQ29tYkZpbHRlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ3Jlc29uYW5jZScsXG5cdCAgICAgICAgICAgICdkZWxheVRpbWUnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5fZGVsYXkuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmRlbGF5VGltZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2suZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2ZlZWRiYWNrID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnJlc29uYW5jZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuRmVlZGJhY2tDb21iRmlsdGVyO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBHZXQgdGhlIGN1cnJlbnQgd2F2ZWZvcm0gZGF0YSBvZiB0aGUgY29ubmVjdGVkIGF1ZGlvIHNvdXJjZS5cblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAcGFyYW0ge051bWJlcj19IHNpemUgVGhlIHNpemUgb2YgdGhlIEZGVC4gVmFsdWUgbXVzdCBiZSBhIHBvd2VyIG9mXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgIHR3byBpbiB0aGUgcmFuZ2UgMzIgdG8gMzI3NjguXG5cdFx0ICovXG5cdCAgICBUb25lLkZGVCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbJ3NpemUnXSwgVG9uZS5GRlQpO1xuXHQgICAgICAgIG9wdGlvbnMudHlwZSA9IFRvbmUuQW5hbHlzZXIuVHlwZS5GRlQ7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW5hbHlzZXIgbm9kZS5cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkFuYWx5c2VyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYW5hbHlzZXIgPSB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5BbmFseXNlcihvcHRpb25zKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkZGVCwgVG9uZS5BdWRpb05vZGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBkZWZhdWx0IHZhbHVlcy5cblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICovXG5cdCAgICBUb25lLkZGVC5kZWZhdWx0cyA9IHsgJ3NpemUnOiAxMDI0IH07XG5cdCAgICAvKipcblx0XHQgKiAgR2V0cyB0aGUgd2F2ZWZvcm0gb2YgdGhlIGF1ZGlvIHNvdXJjZS4gUmV0dXJucyB0aGUgd2F2ZWZvcm0gZGF0YVxuXHRcdCAqICBvZiBsZW5ndGggW3NpemVdKCNzaXplKSBhcyBhIEZsb2F0MzJBcnJheSB3aXRoIHZhbHVlcyBiZXR3ZWVuIC0xIGFuZCAxLlxuXHRcdCAqICBAcmV0dXJucyB7VHlwZWRBcnJheX1cblx0XHQgKi9cblx0ICAgIFRvbmUuRkZULnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fYW5hbHlzZXIuZ2V0VmFsdWUoKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHNpemUgb2YgYW5hbHlzaXMuIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBpbiB0aGUgcmFuZ2UgMzIgdG8gMzI3NjguXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkZGVCNcblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG5hbWUgc2l6ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRkZULnByb3RvdHlwZSwgJ3NpemUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbmFseXNlci5zaXplO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoc2l6ZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9hbmFseXNlci5zaXplID0gc2l6ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuRkZUfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5GRlQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9hbmFseXNlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fYW5hbHlzZXIgPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkZGVDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgYW4gaW5jb21pbmcgc2lnbmFsLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TaWduYWxCYXNlfVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBzaWduYWwgPSBuZXcgVG9uZS5TaWduYWwoLTEpO1xuXHRcdCAqIHZhciBhYnMgPSBuZXcgVG9uZS5BYnMoKTtcblx0XHQgKiBzaWduYWwuY29ubmVjdChhYnMpO1xuXHRcdCAqIC8vdGhlIG91dHB1dCBvZiBhYnMgaXMgMS5cblx0XHQgKi9cblx0ICAgIFRvbmUuQWJzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkxlc3NUaGFufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9hYnMgPSB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5XYXZlU2hhcGVyKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICAgICAgaWYgKE1hdGguYWJzKHZhbCkgPCAwLjAwMSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5hYnModmFsKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sIDEwMjQpO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQWJzLCBUb25lLlNpZ25hbEJhc2UpO1xuXHQgICAgLyoqXG5cdFx0ICogIGRpc3Bvc2UgbWV0aG9kXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkFic30gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5BYnMucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fYWJzLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9hYnMgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkFicztcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLkZvbGxvd2VyIGlzIGEgIGNydWRlIGVudmVsb3BlIGZvbGxvd2VyIHdoaWNoIHdpbGwgZm9sbG93XG5cdFx0ICogICAgICAgICAgdGhlIGFtcGxpdHVkZSBvZiBhbiBpbmNvbWluZyBzaWduYWwuXG5cdFx0ICogICAgICAgICAgVGFrZSBjYXJlIHdpdGggc21hbGwgKDwgMC4wMikgYXR0YWNrIG9yIGRlY2F5IHZhbHVlc1xuXHRcdCAqICAgICAgICAgIGFzIGZvbGxvd2VyIGhhcyBzb21lIHJpcHBsZSB3aGljaCBpcyBleGFnZ2VyYXRlZFxuXHRcdCAqICAgICAgICAgIGF0IHRoZXNlIHZhbHVlcy4gUmVhZCBtb3JlIGFib3V0IGVudmVsb3BlIGZvbGxvd2VycyAoYWxzbyBrbm93blxuXHRcdCAqICAgICAgICAgIGFzIGVudmVsb3BlIGRldGVjdG9ycykgb24gW1dpa2lwZWRpYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW52ZWxvcGVfZGV0ZWN0b3IpLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBwYXJhbSB7VGltZXxPYmplY3R9IFthdHRhY2tdIFRoZSByYXRlIGF0IHdoaWNoIHRoZSBmb2xsb3dlciByaXNlcy5cblx0XHQgKiAgQHBhcmFtIHtUaW1lPX0gcmVsZWFzZSBUaGUgcmF0ZSBhdCB3aGljaCB0aGUgZm9sb3dlciBmYWxscy5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgZm9sbG93ZXIgPSBuZXcgVG9uZS5Gb2xsb3dlcigwLjIsIDAuNCk7XG5cdFx0ICovXG5cdCAgICBUb25lLkZvbGxvd2VyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2F0dGFjaycsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJ1xuXHQgICAgICAgIF0sIFRvbmUuRm9sbG93ZXIpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5jcmVhdGVJbnNPdXRzKDEsIDEpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkFic31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYWJzID0gbmV3IFRvbmUuQWJzKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGxvd3Bhc3MgZmlsdGVyIHdoaWNoIHNtb290aHMgdGhlIGlucHV0XG5cdFx0XHQgKiAgQHR5cGUge0JpcXVhZEZpbHRlck5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2ZpbHRlciA9IHRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTtcblx0ICAgICAgICB0aGlzLl9maWx0ZXIudHlwZSA9ICdsb3dwYXNzJztcblx0ICAgICAgICB0aGlzLl9maWx0ZXIuZnJlcXVlbmN5LnZhbHVlID0gMDtcblx0ICAgICAgICB0aGlzLl9maWx0ZXIuUS52YWx1ZSA9IC0xMDA7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1dhdmVTaGFwZXJOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mcmVxdWVuY3lWYWx1ZXMgPSBuZXcgVG9uZS5XYXZlU2hhcGVyKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuU3VidHJhY3R9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N1YiA9IG5ldyBUb25lLlN1YnRyYWN0KCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRGVsYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2RlbGF5ID0gbmV3IFRvbmUuRGVsYXkodGhpcy5ibG9ja1RpbWUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoaXMga2VlcHMgaXQgZmFyIGZyb20gMCwgZXZlbiBmb3IgdmVyeSBzbWFsbCBkaWZmZXJlbmNlc1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLk11bHRpcGx5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tdWx0ID0gbmV3IFRvbmUuTXVsdGlwbHkoMTAwMDApO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2F0dGFjayA9IG9wdGlvbnMuYXR0YWNrO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3JlbGVhc2UgPSBvcHRpb25zLnJlbGVhc2U7XG5cdCAgICAgICAgLy90aGUgc21vb3RoZWQgc2lnbmFsIHRvIGdldCB0aGUgdmFsdWVzXG5cdCAgICAgICAgdGhpcy5pbnB1dC5jaGFpbih0aGlzLl9hYnMsIHRoaXMuX2ZpbHRlciwgdGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIC8vdGhlIGRpZmZlcmVuY2UgcGF0aFxuXHQgICAgICAgIHRoaXMuX2Ficy5jb25uZWN0KHRoaXMuX3N1YiwgMCwgMSk7XG5cdCAgICAgICAgdGhpcy5fZmlsdGVyLmNoYWluKHRoaXMuX2RlbGF5LCB0aGlzLl9zdWIpO1xuXHQgICAgICAgIC8vdGhyZXNob2xkIHRoZSBkaWZmZXJlbmNlIGFuZCB1c2UgdGhlIHRocmVzaCB0byBzZXQgdGhlIGZyZXF1ZW5jeVxuXHQgICAgICAgIHRoaXMuX3N1Yi5jaGFpbih0aGlzLl9tdWx0LCB0aGlzLl9mcmVxdWVuY3lWYWx1ZXMsIHRoaXMuX2ZpbHRlci5mcmVxdWVuY3kpO1xuXHQgICAgICAgIC8vc2V0IHRoZSBhdHRhY2sgYW5kIHJlbGVhc2UgdmFsdWVzIGluIHRoZSB0YWJsZVxuXHQgICAgICAgIHRoaXMuX3NldEF0dGFja1JlbGVhc2UodGhpcy5fYXR0YWNrLCB0aGlzLl9yZWxlYXNlKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkZvbGxvd2VyLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Gb2xsb3dlci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnYXR0YWNrJzogMC4wNSxcblx0ICAgICAgICAncmVsZWFzZSc6IDAuNVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBzZXRzIHRoZSBhdHRhY2sgYW5kIHJlbGVhc2UgdGltZXMgaW4gdGhlIHdhdmUgc2hhcGVyXG5cdFx0ICogIEBwYXJhbSAgIHtUaW1lfSBhdHRhY2tcblx0XHQgKiAgQHBhcmFtICAge1RpbWV9IHJlbGVhc2Vcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuRm9sbG93ZXIucHJvdG90eXBlLl9zZXRBdHRhY2tSZWxlYXNlID0gZnVuY3Rpb24gKGF0dGFjaywgcmVsZWFzZSkge1xuXHQgICAgICAgIHZhciBtaW5UaW1lID0gdGhpcy5ibG9ja1RpbWU7XG5cdCAgICAgICAgYXR0YWNrID0gVG9uZS5UaW1lKGF0dGFjaykudG9GcmVxdWVuY3koKTtcblx0ICAgICAgICByZWxlYXNlID0gVG9uZS5UaW1lKHJlbGVhc2UpLnRvRnJlcXVlbmN5KCk7XG5cdCAgICAgICAgYXR0YWNrID0gTWF0aC5tYXgoYXR0YWNrLCBtaW5UaW1lKTtcblx0ICAgICAgICByZWxlYXNlID0gTWF0aC5tYXgocmVsZWFzZSwgbWluVGltZSk7XG5cdCAgICAgICAgdGhpcy5fZnJlcXVlbmN5VmFsdWVzLnNldE1hcChmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgICAgIGlmICh2YWwgPD0gMCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGF0dGFjaztcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiByZWxlYXNlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGF0dGFjayB0aW1lLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkZvbGxvd2VyI1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIGF0dGFja1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRm9sbG93ZXIucHJvdG90eXBlLCAnYXR0YWNrJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNrO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoYXR0YWNrKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2F0dGFjayA9IGF0dGFjaztcblx0ICAgICAgICAgICAgdGhpcy5fc2V0QXR0YWNrUmVsZWFzZSh0aGlzLl9hdHRhY2ssIHRoaXMuX3JlbGVhc2UpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHJlbGVhc2UgdGltZS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5Gb2xsb3dlciNcblx0XHQgKiBAdHlwZSB7VGltZX1cblx0XHQgKiBAbmFtZSByZWxlYXNlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Gb2xsb3dlci5wcm90b3R5cGUsICdyZWxlYXNlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVsZWFzZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJlbGVhc2UpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcmVsZWFzZSA9IHJlbGVhc2U7XG5cdCAgICAgICAgICAgIHRoaXMuX3NldEF0dGFja1JlbGVhc2UodGhpcy5fYXR0YWNrLCB0aGlzLl9yZWxlYXNlKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBCb3Jyb3dzIHRoZSBjb25uZWN0IG1ldGhvZCBmcm9tIFNpZ25hbCBzbyB0aGF0IHRoZSBvdXRwdXQgY2FuIGJlIHVzZWRcblx0XHQgKiAgYXMgYSBUb25lLlNpZ25hbCBjb250cm9sIHNpZ25hbC5cblx0XHQgKiAgQGZ1bmN0aW9uXG5cdFx0ICovXG5cdCAgICBUb25lLkZvbGxvd2VyLnByb3RvdHlwZS5jb25uZWN0ID0gVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5jb25uZWN0O1xuXHQgICAgLyoqXG5cdFx0ICogIGRpc3Bvc2Vcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRm9sbG93ZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRm9sbG93ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9maWx0ZXIuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX2ZpbHRlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZnJlcXVlbmN5VmFsdWVzLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB0aGlzLl9mcmVxdWVuY3lWYWx1ZXMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9kZWxheSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fc3ViLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB0aGlzLl9zdWIgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2Ficy5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fYWJzID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9tdWx0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9tdWx0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9jdXJ2ZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuRm9sbG93ZXI7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLlNjYWxlZEVudmVsb3AgaXMgYW4gZW52ZWxvcGUgd2hpY2ggY2FuIGJlIHNjYWxlZFxuXHRcdCAqICAgICAgICAgdG8gYW55IHJhbmdlLiBJdCdzIHVzZWZ1bCBmb3IgYXBwbHlpbmcgYW4gZW52ZWxvcGVcblx0XHQgKiAgICAgICAgIHRvIGEgZnJlcXVlbmN5IG9yIGFueSBvdGhlciBub24tTm9ybWFsUmFuZ2Ugc2lnbmFsXG5cdFx0ICogICAgICAgICBwYXJhbWV0ZXIuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuRW52ZWxvcGV9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge1RpbWV8T2JqZWN0fSBbYXR0YWNrXVx0dGhlIGF0dGFjayB0aW1lIGluIHNlY29uZHNcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbZGVjYXldXHR0aGUgZGVjYXkgdGltZSBpbiBzZWNvbmRzXG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyfSBbc3VzdGFpbl0gXHRhIHBlcmNlbnRhZ2UgKDAtMSkgb2YgdGhlIGZ1bGwgYW1wbGl0dWRlXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gW3JlbGVhc2VdXHR0aGUgcmVsZWFzZSB0aW1lIGluIHNlY29uZHNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAgdmFyIHNjYWxlZEVudiA9IG5ldyBUb25lLlNjYWxlZEVudmVsb3BlKHtcblx0XHQgKiAgXHRcImF0dGFja1wiIDogMC4yLFxuXHRcdCAqICBcdFwibWluXCIgOiAyMDAsXG5cdFx0ICogIFx0XCJtYXhcIiA6IDIwMDBcblx0XHQgKiAgfSk7XG5cdFx0ICogIHNjYWxlZEVudi5jb25uZWN0KG9zY2lsbGF0b3IuZnJlcXVlbmN5KTtcblx0XHQgKi9cblx0ICAgIFRvbmUuU2NhbGVkRW52ZWxvcGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy9nZXQgYWxsIG9mIHRoZSBkZWZhdWx0c1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2F0dGFjaycsXG5cdCAgICAgICAgICAgICdkZWNheScsXG5cdCAgICAgICAgICAgICdzdXN0YWluJyxcblx0ICAgICAgICAgICAgJ3JlbGVhc2UnXG5cdCAgICAgICAgXSwgVG9uZS5FbnZlbG9wZSk7XG5cdCAgICAgICAgVG9uZS5FbnZlbG9wZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5TY2FsZWRFbnZlbG9wZS5kZWZhdWx0cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgc2NhbGUgdGhlIGluY29taW5nIHNpZ25hbCBieSBhbiBleHBvbmVudFxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlBvd31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZXhwID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5Qb3cob3B0aW9ucy5leHBvbmVudCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgc2NhbGUgdGhlIHNpZ25hbCB0byB0aGUgZGVzaXJlZCByYW5nZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk11bHRpcGx5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zY2FsZSA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuU2NhbGUob3B0aW9ucy5taW4sIG9wdGlvbnMubWF4KTtcblx0ICAgICAgICB0aGlzLl9zaWcuY2hhaW4odGhpcy5fZXhwLCB0aGlzLl9zY2FsZSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5TY2FsZWRFbnZlbG9wZSwgVG9uZS5FbnZlbG9wZSk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGRlZmF1bHQgcGFyYW1ldGVyc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICovXG5cdCAgICBUb25lLlNjYWxlZEVudmVsb3BlLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdtaW4nOiAwLFxuXHQgICAgICAgICdtYXgnOiAxLFxuXHQgICAgICAgICdleHBvbmVudCc6IDFcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUaGUgZW52ZWxvcGUncyBtaW4gb3V0cHV0IHZhbHVlLiBUaGlzIGlzIHRoZSB2YWx1ZSB3aGljaCBpdFxuXHRcdCAqIHN0YXJ0cyBhdC5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5TY2FsZWRFbnZlbG9wZSNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIG1pblxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuU2NhbGVkRW52ZWxvcGUucHJvdG90eXBlLCAnbWluJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2NhbGUubWluO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAobWluKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NjYWxlLm1pbiA9IG1pbjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBlbnZlbG9wZSdzIG1heCBvdXRwdXQgdmFsdWUuIEluIG90aGVyIHdvcmRzLCB0aGUgdmFsdWVcblx0XHQgKiBhdCB0aGUgcGVhayBvZiB0aGUgYXR0YWNrIHBvcnRpb24gb2YgdGhlIGVudmVsb3BlLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlNjYWxlZEVudmVsb3BlI1xuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICogQG5hbWUgbWF4XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5TY2FsZWRFbnZlbG9wZS5wcm90b3R5cGUsICdtYXgnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9zY2FsZS5tYXg7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtYXgpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc2NhbGUubWF4ID0gbWF4O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGVudmVsb3BlJ3MgZXhwb25lbnQgdmFsdWUuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuU2NhbGVkRW52ZWxvcGUjXG5cdFx0ICogQHR5cGUge251bWJlcn1cblx0XHQgKiBAbmFtZSBleHBvbmVudFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuU2NhbGVkRW52ZWxvcGUucHJvdG90eXBlLCAnZXhwb25lbnQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHAudmFsdWU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChleHApIHtcblx0ICAgICAgICAgICAgdGhpcy5fZXhwLnZhbHVlID0gZXhwO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIGNsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlNjYWxlZEVudmVsb3BlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlNjYWxlZEVudmVsb3BlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuRW52ZWxvcGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9zY2FsZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc2NhbGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2V4cC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZXhwID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5TY2FsZWRFbnZlbG9wZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuRnJlcXVlbmN5RW52ZWxvcGUgaXMgYSBUb25lLlNjYWxlZEVudmVsb3BlLCBidXQgaW5zdGVhZCBvZiBgbWluYCBhbmQgYG1heGBcblx0XHQgKiAgICAgICAgIGl0J3MgZ290IGEgYGJhc2VGcmVxdWVuY3lgIGFuZCBgb2N0YXZlc2AgcGFyYW1ldGVyLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkVudmVsb3BlfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQHBhcmFtIHtUaW1lfE9iamVjdH0gW2F0dGFja11cdHRoZSBhdHRhY2sgdGltZSBpbiBzZWNvbmRzXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gW2RlY2F5XVx0dGhlIGRlY2F5IHRpbWUgaW4gc2Vjb25kc1xuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW3N1c3RhaW5dIFx0YSBwZXJjZW50YWdlICgwLTEpIG9mIHRoZSBmdWxsIGFtcGxpdHVkZVxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFtyZWxlYXNlXVx0dGhlIHJlbGVhc2UgdGltZSBpbiBzZWNvbmRzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogIHZhciBmcmVxRW52ID0gbmV3IFRvbmUuRnJlcXVlbmN5RW52ZWxvcGUoe1xuXHRcdCAqICBcdFwiYXR0YWNrXCIgOiAwLjIsXG5cdFx0ICogIFx0XCJiYXNlRnJlcXVlbmN5XCIgOiBcIkMyXCIsXG5cdFx0ICogIFx0XCJvY3RhdmVzXCIgOiA0XG5cdFx0ICogIH0pO1xuXHRcdCAqICBmcmVxRW52LmNvbm5lY3Qob3NjaWxsYXRvci5mcmVxdWVuY3kpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5GcmVxdWVuY3lFbnZlbG9wZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdhdHRhY2snLFxuXHQgICAgICAgICAgICAnZGVjYXknLFxuXHQgICAgICAgICAgICAnc3VzdGFpbicsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJ1xuXHQgICAgICAgIF0sIFRvbmUuRW52ZWxvcGUpO1xuXHQgICAgICAgIFRvbmUuU2NhbGVkRW52ZWxvcGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvL21lcmdlIGl0IHdpdGggdGhlIGZyZXF1ZW5jeSBlbnZlbG9wZSBkZWZhdWx0c1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5GcmVxdWVuY3lFbnZlbG9wZS5kZWZhdWx0cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgU3RvcmVzIHRoZSBvY3RhdmUgdmFsdWVcblx0XHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX29jdGF2ZXMgPSBvcHRpb25zLm9jdGF2ZXM7XG5cdCAgICAgICAgLy9zZXR1cFxuXHQgICAgICAgIHRoaXMuYmFzZUZyZXF1ZW5jeSA9IG9wdGlvbnMuYmFzZUZyZXF1ZW5jeTtcblx0ICAgICAgICB0aGlzLm9jdGF2ZXMgPSBvcHRpb25zLm9jdGF2ZXM7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5GcmVxdWVuY3lFbnZlbG9wZSwgVG9uZS5FbnZlbG9wZSk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGRlZmF1bHQgcGFyYW1ldGVyc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICovXG5cdCAgICBUb25lLkZyZXF1ZW5jeUVudmVsb3BlLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdiYXNlRnJlcXVlbmN5JzogMjAwLFxuXHQgICAgICAgICdvY3RhdmVzJzogNCxcblx0ICAgICAgICAnZXhwb25lbnQnOiAyXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGVudmVsb3BlJ3MgbWluaW51bSBvdXRwdXQgdmFsdWUuIFRoaXMgaXMgdGhlIHZhbHVlIHdoaWNoIGl0XG5cdFx0ICogc3RhcnRzIGF0LlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkZyZXF1ZW5jeUVudmVsb3BlI1xuXHRcdCAqIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0ICogQG5hbWUgYmFzZUZyZXF1ZW5jeVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRnJlcXVlbmN5RW52ZWxvcGUucHJvdG90eXBlLCAnYmFzZUZyZXF1ZW5jeScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NjYWxlLm1pbjtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG1pbikge1xuXHQgICAgICAgICAgICB0aGlzLl9zY2FsZS5taW4gPSB0aGlzLnRvRnJlcXVlbmN5KG1pbik7XG5cdCAgICAgICAgICAgIC8vYWxzbyB1cGRhdGUgdGhlIG9jdGF2ZXNcblx0ICAgICAgICAgICAgdGhpcy5vY3RhdmVzID0gdGhpcy5fb2N0YXZlcztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBudW1iZXIgb2Ygb2N0YXZlcyBhYm92ZSB0aGUgYmFzZUZyZXF1ZW5jeSB0aGF0IHRoZVxuXHRcdCAqIGVudmVsb3BlIHdpbGwgc2NhbGUgdG8uXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRnJlcXVlbmN5RW52ZWxvcGUjXG5cdFx0ICogQHR5cGUge1Bvc2l0aXZlfVxuXHRcdCAqIEBuYW1lIG9jdGF2ZXNcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkZyZXF1ZW5jeUVudmVsb3BlLnByb3RvdHlwZSwgJ29jdGF2ZXMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vY3RhdmVzO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAob2N0YXZlcykge1xuXHQgICAgICAgICAgICB0aGlzLl9vY3RhdmVzID0gb2N0YXZlcztcblx0ICAgICAgICAgICAgdGhpcy5fc2NhbGUubWF4ID0gdGhpcy5iYXNlRnJlcXVlbmN5ICogTWF0aC5wb3coMiwgb2N0YXZlcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgZW52ZWxvcGUncyBleHBvbmVudCB2YWx1ZS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5GcmVxdWVuY3lFbnZlbG9wZSNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIGV4cG9uZW50XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5GcmVxdWVuY3lFbnZlbG9wZS5wcm90b3R5cGUsICdleHBvbmVudCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4cC52YWx1ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGV4cCkge1xuXHQgICAgICAgICAgICB0aGlzLl9leHAudmFsdWUgPSBleHA7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRnJlcXVlbmN5RW52ZWxvcGV9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRnJlcXVlbmN5RW52ZWxvcGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TY2FsZWRFbnZlbG9wZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkZyZXF1ZW5jeUVudmVsb3BlO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIEdyZWF0ZXJUaGFuWmVybyBvdXRwdXRzIDEgd2hlbiB0aGUgaW5wdXQgaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIHplcm9cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuU2lnbmFsQmFzZX1cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgZ3QwID0gbmV3IFRvbmUuR3JlYXRlclRoYW5aZXJvKCk7XG5cdFx0ICogdmFyIHNpZyA9IG5ldyBUb25lLlNpZ25hbCgwLjAxKS5jb25uZWN0KGd0MCk7XG5cdFx0ICogLy90aGUgb3V0cHV0IG9mIGd0MCBpcyAxLlxuXHRcdCAqIHNpZy52YWx1ZSA9IDA7XG5cdFx0ICogLy90aGUgb3V0cHV0IG9mIGd0MCBpcyAwLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5HcmVhdGVyVGhhblplcm8gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuV2F2ZVNoYXBlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdGhyZXNoID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5XYXZlU2hhcGVyKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbCA8PSAwKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gMDtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAxO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSwgMTI3KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBzY2FsZSB0aGUgZmlyc3QgdGhyZXNob2xkZWQgc2lnbmFsIGJ5IGEgbGFyZ2UgdmFsdWUuXG5cdFx0XHQgKiAgdGhpcyB3aWxsIGhlbHAgd2l0aCB2YWx1ZXMgd2hpY2ggYXJlIHZlcnkgY2xvc2UgdG8gMFxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk11bHRpcGx5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zY2FsZSA9IHRoaXMuaW5wdXQgPSBuZXcgVG9uZS5NdWx0aXBseSgxMDAwMCk7XG5cdCAgICAgICAgLy9jb25uZWN0aW9uc1xuXHQgICAgICAgIHRoaXMuX3NjYWxlLmNvbm5lY3QodGhpcy5fdGhyZXNoKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkdyZWF0ZXJUaGFuWmVybywgVG9uZS5TaWduYWxCYXNlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBkaXNwb3NlIG1ldGhvZFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5HcmVhdGVyVGhhblplcm99IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuR3JlYXRlclRoYW5aZXJvLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3NjYWxlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9zY2FsZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fdGhyZXNoLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl90aHJlc2ggPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkdyZWF0ZXJUaGFuWmVybztcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBPdXRwdXQgMSBpZiB0aGUgc2lnbmFsIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUsIG90aGVyd2lzZSBvdXRwdXRzIDAuXG5cdFx0ICogICAgICAgICAgY2FuIGNvbXBhcmUgdHdvIHNpZ25hbHMgb3IgYSBzaWduYWwgYW5kIGEgbnVtYmVyLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TaWduYWx9XG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyfSBbdmFsdWU9MF0gdGhlIHZhbHVlIHRvIGNvbXBhcmUgdG8gdGhlIGluY29taW5nIHNpZ25hbFxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBndCA9IG5ldyBUb25lLkdyZWF0ZXJUaGFuKDIpO1xuXHRcdCAqIHZhciBzaWcgPSBuZXcgVG9uZS5TaWduYWwoNCkuY29ubmVjdChndCk7XG5cdFx0ICogLy9vdXRwdXQgb2YgZ3QgaXMgZXF1YWwgMS5cblx0XHQgKi9cblx0ICAgIFRvbmUuR3JlYXRlclRoYW4gPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICBUb25lLlNpZ25hbC5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY3JlYXRlSW5zT3V0cygyLCAwKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBzdWJ0cmFjdCB0aGUgYW1vdW50IGZyb20gdGhlIGluY29taW5nIHNpZ25hbFxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlN1YnRyYWN0fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9wYXJhbSA9IHRoaXMuaW5wdXRbMF0gPSBuZXcgVG9uZS5TdWJ0cmFjdCh2YWx1ZSk7XG5cdCAgICAgICAgdGhpcy5pbnB1dFsxXSA9IHRoaXMuX3BhcmFtLmlucHV0WzFdO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIGNvbXBhcmUgdGhhdCBhbW91bnQgdG8gemVyb1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdyZWF0ZXJUaGFuWmVyb31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZ3R6ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5HcmVhdGVyVGhhblplcm8oKTtcblx0ICAgICAgICAvL2Nvbm5lY3Rcblx0ICAgICAgICB0aGlzLl9wYXJhbS5jb25uZWN0KHRoaXMuX2d0eik7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5HcmVhdGVyVGhhbiwgVG9uZS5TaWduYWwpO1xuXHQgICAgLyoqXG5cdFx0ICogIGRpc3Bvc2UgbWV0aG9kXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkdyZWF0ZXJUaGFufSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkdyZWF0ZXJUaGFuLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fZ3R6LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9ndHogPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkdyZWF0ZXJUaGFuO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIFRvbmUuR2F0ZSBvbmx5IHBhc3NlcyBhIHNpZ25hbCB0aHJvdWdoIHdoZW4gdGhlIGluY29taW5nXG5cdFx0ICogICAgICAgICAgc2lnbmFsIGV4Y2VlZHMgYSBzcGVjaWZpZWQgdGhyZXNob2xkLiBUbyBkbyB0aGlzLCBHYXRlIHVzZXNcblx0XHQgKiAgICAgICAgICBhIFRvbmUuRm9sbG93ZXIgdG8gZm9sbG93IHRoZSBhbXBsaXR1ZGUgb2YgdGhlIGluY29taW5nIHNpZ25hbC5cblx0XHQgKiAgICAgICAgICBBIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIGEgW05vaXNlIEdhdGVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL05vaXNlX2dhdGUpLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBwYXJhbSB7RGVjaWJlbHN8T2JqZWN0fSBbdGhyZXNob2xkXSBUaGUgdGhyZXNob2xkIGFib3ZlIHdoaWNoIHRoZSBnYXRlIHdpbGwgb3Blbi5cblx0XHQgKiAgQHBhcmFtIHtUaW1lPX0gYXR0YWNrIFRoZSBmb2xsb3dlcidzIGF0dGFjayB0aW1lXG5cdFx0ICogIEBwYXJhbSB7VGltZT19IHJlbGVhc2UgVGhlIGZvbGxvd2VyJ3MgcmVsZWFzZSB0aW1lXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIGdhdGUgPSBuZXcgVG9uZS5HYXRlKC0zMCwgMC4yLCAwLjMpLnRvTWFzdGVyKCk7XG5cdFx0ICogdmFyIG1pYyA9IG5ldyBUb25lLlVzZXJNZWRpYSgpLmNvbm5lY3QoZ2F0ZSk7XG5cdFx0ICogLy90aGUgZ2F0ZSB3aWxsIG9ubHkgcGFzcyB0aHJvdWdoIHRoZSBpbmNvbWluZ1xuXHRcdCAqIC8vc2lnbmFsIHdoZW4gaXQncyBsb3VkZXIgdGhhbiAtMzBkYlxuXHRcdCAqL1xuXHQgICAgVG9uZS5HYXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ3RocmVzaG9sZCcsXG5cdCAgICAgICAgICAgICdhdHRhY2snLFxuXHQgICAgICAgICAgICAncmVsZWFzZSdcblx0ICAgICAgICBdLCBUb25lLkdhdGUpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5jcmVhdGVJbnNPdXRzKDEsIDEpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkZvbGxvd2VyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mb2xsb3dlciA9IG5ldyBUb25lLkZvbGxvd2VyKG9wdGlvbnMuYXR0YWNrLCBvcHRpb25zLnJlbGVhc2UpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdyZWF0ZXJUaGFufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9ndCA9IG5ldyBUb25lLkdyZWF0ZXJUaGFuKFRvbmUuZGJUb0dhaW4ob3B0aW9ucy50aHJlc2hvbGQpKTtcblx0ICAgICAgICAvL3RoZSBjb25uZWN0aW9uc1xuXHQgICAgICAgIHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgLy90aGUgY29udHJvbCBzaWduYWxcblx0ICAgICAgICB0aGlzLmlucHV0LmNoYWluKHRoaXMuX2d0LCB0aGlzLl9mb2xsb3dlciwgdGhpcy5vdXRwdXQuZ2Fpbik7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5HYXRlLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuR2F0ZS5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnYXR0YWNrJzogMC4xLFxuXHQgICAgICAgICdyZWxlYXNlJzogMC4xLFxuXHQgICAgICAgICd0aHJlc2hvbGQnOiAtNDBcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUaGUgdGhyZXNob2xkIG9mIHRoZSBnYXRlIGluIGRlY2liZWxzXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuR2F0ZSNcblx0XHQgKiBAdHlwZSB7RGVjaWJlbHN9XG5cdFx0ICogQG5hbWUgdGhyZXNob2xkXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5HYXRlLnByb3RvdHlwZSwgJ3RocmVzaG9sZCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuZ2FpblRvRGIodGhpcy5fZ3QudmFsdWUpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodGhyZXNoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2d0LnZhbHVlID0gVG9uZS5kYlRvR2Fpbih0aHJlc2gpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGF0dGFjayBzcGVlZCBvZiB0aGUgZ2F0ZVxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkdhdGUjXG5cdFx0ICogQHR5cGUge1RpbWV9XG5cdFx0ICogQG5hbWUgYXR0YWNrXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5HYXRlLnByb3RvdHlwZSwgJ2F0dGFjaycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbGxvd2VyLmF0dGFjaztcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGF0dGFja1RpbWUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZm9sbG93ZXIuYXR0YWNrID0gYXR0YWNrVGltZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSByZWxlYXNlIHNwZWVkIG9mIHRoZSBnYXRlXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuR2F0ZSNcblx0XHQgKiBAdHlwZSB7VGltZX1cblx0XHQgKiBAbmFtZSByZWxlYXNlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5HYXRlLnByb3RvdHlwZSwgJ3JlbGVhc2UnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb2xsb3dlci5yZWxlYXNlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocmVsZWFzZVRpbWUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZm9sbG93ZXIucmVsZWFzZSA9IHJlbGVhc2VUaW1lO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5HYXRlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkdhdGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9mb2xsb3dlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZ3QuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2ZvbGxvd2VyID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9ndCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuR2F0ZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogQGNsYXNzIFRvbmUuVGlja1NpZ25hbCBleHRlbmRzIFRvbmUuU2lnbmFsLCBidXQgYWRkcyB0aGUgY2FwYWJpbGl0eVxuXHRcdCAqICAgICAgICB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGFwc2VkIHRpY2tzLiBleHBvbmVudGlhbCBhbmQgdGFyZ2V0IGN1cnZlc1xuXHRcdCAqICAgICAgICBhcmUgYXBwcm94aW1hdGVkIHdpdGggbXVsdGlwbGUgbGluZWFyIHJhbXBzLlxuXHRcdCAqXG5cdFx0ICogICAgICAgIFRoYW5rIHlvdSBCcnVubyBEaWFzLCBILiBTb2ZpYSBQaW50bywgYW5kIERhdmlkIE0uIE1hdG9zLCBmb3IgeW91ciBbV0FDIHBhcGVyXShodHRwczovL3NtYXJ0ZWNoLmdhdGVjaC5lZHUvYml0c3RyZWFtL2hhbmRsZS8xODUzLzU0NTg4L1dBQzIwMTYtNDkucGRmKVxuXHRcdCAqICAgICAgICBkZXNjcmliaW5nIGludGVncmF0aW5nIHRpbWluZyBmdW5jdGlvbnMgZm9yIHRlbXBvIGNhbGN1bGF0aW9ucy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2lnbmFsXG5cdFx0ICogQGV4dGVuZHMge1RvbmUuU2lnbmFsfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU2lnbmFsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgdmFsdWUgPSBUb25lLmRlZmF1bHRBcmcodmFsdWUsIDEpO1xuXHQgICAgICAgIFRvbmUuU2lnbmFsLmNhbGwodGhpcywge1xuXHQgICAgICAgICAgICAndW5pdHMnOiBUb25lLlR5cGUuVGlja3MsXG5cdCAgICAgICAgICAgICd2YWx1ZSc6IHZhbHVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgLy9leHRlbmQgdGhlIG1lbW9yeVxuXHQgICAgICAgIHRoaXMuX2V2ZW50cy5tZW1vcnkgPSBJbmZpbml0eTtcblx0ICAgICAgICAvL2NsZWFyIHRoZSBjbG9jayBmcm9tIHRoZSBiZWdpbm5pbmdcblx0ICAgICAgICB0aGlzLmNhbmNlbFNjaGVkdWxlZFZhbHVlcygwKTtcblx0ICAgICAgICAvL3NldCBhbiBpbml0aWFsIGV2ZW50XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmFkZCh7XG5cdCAgICAgICAgICAgICd0eXBlJzogVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5TZXRWYWx1ZSxcblx0ICAgICAgICAgICAgJ3RpbWUnOiAwLFxuXHQgICAgICAgICAgICAndmFsdWUnOiB2YWx1ZVxuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuVGlja1NpZ25hbCwgVG9uZS5TaWduYWwpO1xuXHQgICAgLyoqXG5cdFx0ICogV3JhcHMgVG9uZS5TaWduYWwgbWV0aG9kcyBzbyB0aGF0IHRoZXkgYWxzb1xuXHRcdCAqIHJlY29yZCB0aGUgdGlja3MuXG5cdFx0ICogQHBhcmFtICB7RnVuY3Rpb259IG1ldGhvZFxuXHRcdCAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBmdW5jdGlvbiBfd3JhcFNjaGVkdWxlTWV0aG9kcyhtZXRob2QpIHtcblx0ICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlLCB0aW1lKSB7XG5cdCAgICAgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICAgICAgbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgIHZhciBldmVudCA9IHRoaXMuX2V2ZW50cy5nZXQodGltZSk7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0V2ZW50ID0gdGhpcy5fZXZlbnRzLnByZXZpb3VzRXZlbnQoZXZlbnQpO1xuXHQgICAgICAgICAgICB2YXIgdGlja3NVbnRpbFRpbWUgPSB0aGlzLl9nZXRUaWNrc1VudGlsRXZlbnQocHJldmlvdXNFdmVudCwgdGltZSk7XG5cdCAgICAgICAgICAgIGV2ZW50LnRpY2tzID0gTWF0aC5tYXgodGlja3NVbnRpbFRpbWUsIDApO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9O1xuXHQgICAgfVxuXHQgICAgVG9uZS5UaWNrU2lnbmFsLnByb3RvdHlwZS5zZXRWYWx1ZUF0VGltZSA9IF93cmFwU2NoZWR1bGVNZXRob2RzKFRvbmUuU2lnbmFsLnByb3RvdHlwZS5zZXRWYWx1ZUF0VGltZSk7XG5cdCAgICBUb25lLlRpY2tTaWduYWwucHJvdG90eXBlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lID0gX3dyYXBTY2hlZHVsZU1ldGhvZHMoVG9uZS5TaWduYWwucHJvdG90eXBlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdGFydCBleHBvbmVudGlhbGx5IGFwcHJvYWNoaW5nIHRoZSB0YXJnZXQgdmFsdWUgYXQgdGhlIGdpdmVuIHRpbWUgd2l0aFxuXHRcdCAqICBhIHJhdGUgaGF2aW5nIHRoZSBnaXZlbiB0aW1lIGNvbnN0YW50LlxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gdmFsdWVcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBzdGFydFRpbWVcblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IHRpbWVDb25zdGFudFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaWNrU2lnbmFsfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRpY2tTaWduYWwucHJvdG90eXBlLnNldFRhcmdldEF0VGltZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdGltZSwgY29uc3RhbnQpIHtcblx0ICAgICAgICAvL2Fwcm94aW1hdGUgaXQgd2l0aCBtdWx0aXBsZSBsaW5lYXIgcmFtcHNcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5zZXRSYW1wUG9pbnQodGltZSk7XG5cdCAgICAgICAgdmFsdWUgPSB0aGlzLl9mcm9tVW5pdHModmFsdWUpO1xuXHQgICAgICAgIC8vc3RhcnQgZnJvbSBwcmV2aW91c2x5IHNjaGVkdWxlZCB2YWx1ZVxuXHQgICAgICAgIHZhciBwcmV2RXZlbnQgPSB0aGlzLl9ldmVudHMuZ2V0KHRpbWUpO1xuXHQgICAgICAgIHZhciBzZWdtZW50cyA9IE1hdGgucm91bmQoTWF0aC5tYXgoMSAvIGNvbnN0YW50LCAxKSk7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkrKykge1xuXHQgICAgICAgICAgICB2YXIgc2VnVGltZSA9IGNvbnN0YW50ICogaSArIHRpbWU7XG5cdCAgICAgICAgICAgIHZhciByYW1wVmFsID0gdGhpcy5fZXhwb25lbnRpYWxBcHByb2FjaChwcmV2RXZlbnQudGltZSwgcHJldkV2ZW50LnZhbHVlLCB2YWx1ZSwgY29uc3RhbnQsIHNlZ1RpbWUpO1xuXHQgICAgICAgICAgICB0aGlzLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHRoaXMuX3RvVW5pdHMocmFtcFZhbCksIHNlZ1RpbWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2NoZWR1bGVzIGFuIGV4cG9uZW50aWFsIGNvbnRpbnVvdXMgY2hhbmdlIGluIHBhcmFtZXRlciB2YWx1ZSBmcm9tXG5cdFx0ICogIHRoZSBwcmV2aW91cyBzY2hlZHVsZWQgcGFyYW1ldGVyIHZhbHVlIHRvIHRoZSBnaXZlbiB2YWx1ZS5cblx0XHQgKiAgQHBhcmFtICB7bnVtYmVyfSB2YWx1ZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBlbmRUaW1lXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlRpY2tTaWduYWx9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja1NpZ25hbC5wcm90b3R5cGUuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdGltZSkge1xuXHQgICAgICAgIC8vYXByb3hpbWF0ZSBpdCB3aXRoIG11bHRpcGxlIGxpbmVhciByYW1wc1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB2YWx1ZSA9IHRoaXMuX2Zyb21Vbml0cyh2YWx1ZSk7XG5cdCAgICAgICAgLy9zdGFydCBmcm9tIHByZXZpb3VzbHkgc2NoZWR1bGVkIHZhbHVlXG5cdCAgICAgICAgdmFyIHByZXZFdmVudCA9IHRoaXMuX2V2ZW50cy5nZXQodGltZSk7XG5cdCAgICAgICAgaWYgKHByZXZFdmVudCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICBwcmV2RXZlbnQgPSB7XG5cdCAgICAgICAgICAgICAgICAndmFsdWUnOiB0aGlzLl9pbml0aWFsVmFsdWUsXG5cdCAgICAgICAgICAgICAgICAndGltZSc6IDBcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9hcHByb3ggMTAgc2VnbWVudHMgcGVyIHNlY29uZFxuXHQgICAgICAgIHZhciBzZWdtZW50cyA9IE1hdGgucm91bmQoTWF0aC5tYXgoKHRpbWUgLSBwcmV2RXZlbnQudGltZSkgKiAxMCwgMSkpO1xuXHQgICAgICAgIHZhciBzZWdtZW50RHVyID0gKHRpbWUgLSBwcmV2RXZlbnQudGltZSkgLyBzZWdtZW50cztcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBzZWdtZW50czsgaSsrKSB7XG5cdCAgICAgICAgICAgIHZhciBzZWdUaW1lID0gc2VnbWVudER1ciAqIGkgKyBwcmV2RXZlbnQudGltZTtcblx0ICAgICAgICAgICAgdmFyIHJhbXBWYWwgPSB0aGlzLl9leHBvbmVudGlhbEludGVycG9sYXRlKHByZXZFdmVudC50aW1lLCBwcmV2RXZlbnQudmFsdWUsIHRpbWUsIHZhbHVlLCBzZWdUaW1lKTtcblx0ICAgICAgICAgICAgdGhpcy5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0aGlzLl90b1VuaXRzKHJhbXBWYWwpLCBzZWdUaW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogUmV0dXJucyB0aGUgdGljayB2YWx1ZSBhdCB0aGUgdGltZS4gVGFrZXMgaW50byBhY2NvdW50XG5cdFx0ICogYW55IGF1dG9tYXRpb24gY3VydmVzIHNjaGVkdWxlZCBvbiB0aGUgc2lnbmFsLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtICB7VGltZX0gdGltZSBUaGUgdGltZSB0byBnZXQgdGhlIHRpY2sgY291bnQgYXRcblx0XHQgKiBAcmV0dXJuIHtUaWNrc30gICAgICBUaGUgbnVtYmVyIG9mIHRpY2tzIHdoaWNoIGhhdmUgZWxhcHNlZCBhdCB0aGUgdGltZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBhbnkgYXV0b21hdGlvbnMuXG5cdFx0ICovXG5cdCAgICBUb25lLlRpY2tTaWduYWwucHJvdG90eXBlLl9nZXRUaWNrc1VudGlsRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQsIHRpbWUpIHtcblx0ICAgICAgICBpZiAoZXZlbnQgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgZXZlbnQgPSB7XG5cdCAgICAgICAgICAgICAgICAndGlja3MnOiAwLFxuXHQgICAgICAgICAgICAgICAgJ3RpbWUnOiAwXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfSBlbHNlIGlmIChUb25lLmlzVW5kZWYoZXZlbnQudGlja3MpKSB7XG5cdCAgICAgICAgICAgIHZhciBwcmV2aW91c0V2ZW50ID0gdGhpcy5fZXZlbnRzLnByZXZpb3VzRXZlbnQoZXZlbnQpO1xuXHQgICAgICAgICAgICBldmVudC50aWNrcyA9IHRoaXMuX2dldFRpY2tzVW50aWxFdmVudChwcmV2aW91c0V2ZW50LCBldmVudC50aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHZhbDAgPSB0aGlzLmdldFZhbHVlQXRUaW1lKGV2ZW50LnRpbWUpO1xuXHQgICAgICAgIHZhciB2YWwxID0gdGhpcy5nZXRWYWx1ZUF0VGltZSh0aW1lKTtcblx0ICAgICAgICAvL2lmIGl0J3MgcmlnaHQgb24gdGhlIGxpbmUsIHRha2UgdGhlIHByZXZpb3VzIHZhbHVlXG5cdCAgICAgICAgaWYgKHRoaXMuX2V2ZW50cy5nZXQodGltZSkudGltZSA9PT0gdGltZSAmJiB0aGlzLl9ldmVudHMuZ2V0KHRpbWUpLnR5cGUgPT09IFRvbmUuUGFyYW0uQXV0b21hdGlvblR5cGUuU2V0VmFsdWUpIHtcblx0ICAgICAgICAgICAgdmFsMSA9IHRoaXMuZ2V0VmFsdWVBdFRpbWUodGltZSAtIHRoaXMuc2FtcGxlVGltZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiAwLjUgKiAodGltZSAtIGV2ZW50LnRpbWUpICogKHZhbDAgKyB2YWwxKSArIGV2ZW50LnRpY2tzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFJldHVybnMgdGhlIHRpY2sgdmFsdWUgYXQgdGhlIHRpbWUuIFRha2VzIGludG8gYWNjb3VudFxuXHRcdCAqIGFueSBhdXRvbWF0aW9uIGN1cnZlcyBzY2hlZHVsZWQgb24gdGhlIHNpZ25hbC5cblx0XHQgKiBAcGFyYW0gIHtUaW1lfSB0aW1lIFRoZSB0aW1lIHRvIGdldCB0aGUgdGljayBjb3VudCBhdFxuXHRcdCAqIEByZXR1cm4ge1RpY2tzfSAgICAgIFRoZSBudW1iZXIgb2YgdGlja3Mgd2hpY2ggaGF2ZSBlbGFwc2VkIGF0IHRoZSB0aW1lXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGFueSBhdXRvbWF0aW9ucy5cblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja1NpZ25hbC5wcm90b3R5cGUuZ2V0VGlja3NBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB2YXIgZXZlbnQgPSB0aGlzLl9ldmVudHMuZ2V0KHRpbWUpO1xuXHQgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLl9nZXRUaWNrc1VudGlsRXZlbnQoZXZlbnQsIHRpbWUpLCAwKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBSZXR1cm4gdGhlIGVsYXBzZWQgdGltZSBvZiB0aGUgbnVtYmVyIG9mIHRpY2tzIGZyb20gdGhlIGdpdmVuIHRpbWVcblx0XHQgKiBAcGFyYW0ge1RpY2tzfSB0aWNrcyBUaGUgbnVtYmVyIG9mIHRpY2tzIHRvIGNhbGN1bGF0ZVxuXHRcdCAqIEBwYXJhbSAge1RpbWV9IHRpbWUgVGhlIHRpbWUgdG8gZ2V0IHRoZSBuZXh0IHRpY2sgZnJvbVxuXHRcdCAqIEByZXR1cm4ge1NlY29uZHN9IFRoZSBkdXJhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHRpY2tzIGZyb20gdGhlIGdpdmVuIHRpbWUgaW4gc2Vjb25kc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU2lnbmFsLnByb3RvdHlwZS5nZXREdXJhdGlvbk9mVGlja3MgPSBmdW5jdGlvbiAodGlja3MsIHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdmFyIGN1cnJlbnRUaWNrID0gdGhpcy5nZXRUaWNrc0F0VGltZSh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5nZXRUaW1lT2ZUaWNrKGN1cnJlbnRUaWNrICsgdGlja3MpIC0gdGltZTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBHaXZlbiBhIHRpY2ssIHJldHVybnMgdGhlIHRpbWUgdGhhdCB0aWNrIG9jY3VycyBhdC5cblx0XHQgKiBAcGFyYW0gIHtUaWNrc30gdGlja1xuXHRcdCAqIEByZXR1cm4ge1RpbWV9ICAgICAgVGhlIHRpbWUgdGhhdCB0aGUgdGljayBvY2N1cnMuXG5cdFx0ICovXG5cdCAgICBUb25lLlRpY2tTaWduYWwucHJvdG90eXBlLmdldFRpbWVPZlRpY2sgPSBmdW5jdGlvbiAodGljaykge1xuXHQgICAgICAgIHZhciBiZWZvcmUgPSB0aGlzLl9ldmVudHMuZ2V0KHRpY2ssICd0aWNrcycpO1xuXHQgICAgICAgIHZhciBhZnRlciA9IHRoaXMuX2V2ZW50cy5nZXRBZnRlcih0aWNrLCAndGlja3MnKTtcblx0ICAgICAgICBpZiAoYmVmb3JlICYmIGJlZm9yZS50aWNrcyA9PT0gdGljaykge1xuXHQgICAgICAgICAgICByZXR1cm4gYmVmb3JlLnRpbWU7XG5cdCAgICAgICAgfSBlbHNlIGlmIChiZWZvcmUgJiYgYWZ0ZXIgJiYgYWZ0ZXIudHlwZSA9PT0gVG9uZS5QYXJhbS5BdXRvbWF0aW9uVHlwZS5MaW5lYXIgJiYgYmVmb3JlLnZhbHVlICE9PSBhZnRlci52YWx1ZSkge1xuXHQgICAgICAgICAgICB2YXIgdmFsMCA9IHRoaXMuZ2V0VmFsdWVBdFRpbWUoYmVmb3JlLnRpbWUpO1xuXHQgICAgICAgICAgICB2YXIgdmFsMSA9IHRoaXMuZ2V0VmFsdWVBdFRpbWUoYWZ0ZXIudGltZSk7XG5cdCAgICAgICAgICAgIHZhciBkZWx0YSA9ICh2YWwxIC0gdmFsMCkgLyAoYWZ0ZXIudGltZSAtIGJlZm9yZS50aW1lKTtcblx0ICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnNxcnQoTWF0aC5wb3codmFsMCwgMikgLSAyICogZGVsdGEgKiAoYmVmb3JlLnRpY2tzIC0gdGljaykpO1xuXHQgICAgICAgICAgICB2YXIgc29sMSA9ICgtdmFsMCArIGspIC8gZGVsdGE7XG5cdCAgICAgICAgICAgIHZhciBzb2wyID0gKC12YWwwIC0gaykgLyBkZWx0YTtcblx0ICAgICAgICAgICAgcmV0dXJuIChzb2wxID4gMCA/IHNvbDEgOiBzb2wyKSArIGJlZm9yZS50aW1lO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoYmVmb3JlKSB7XG5cdCAgICAgICAgICAgIGlmIChiZWZvcmUudmFsdWUgPT09IDApIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBiZWZvcmUudGltZSArICh0aWNrIC0gYmVmb3JlLnRpY2tzKSAvIGJlZm9yZS52YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aWNrIC8gdGhpcy5faW5pdGlhbFZhbHVlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBDb252ZXJ0IHNvbWUgbnVtYmVyIG9mIHRpY2tzIHRoZWlyIHRoZSBkdXJhdGlvbiBpbiBzZWNvbmRzIGFjY291bnRpbmdcblx0XHQgKiBmb3IgYW55IGF1dG9tYXRpb24gY3VydmVzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqIEBwYXJhbSAge1RpY2tzfSB0aWNrcyBUaGUgbnVtYmVyIG9mIHRpY2tzIHRvIGNvbnZlcnQgdG8gc2Vjb25kcy5cblx0XHQgKiBAcGFyYW0gIHtUaW1lfSBbd2hlbj1ub3ddICBXaGVuIGFsb25nIHRoZSBhdXRvbWF0aW9uIHRpbWVsaW5lIHRvIGNvbnZlcnQgdGhlIHRpY2tzLlxuXHRcdCAqIEByZXR1cm4ge1RvbmUuVGltZX0gICAgICAgVGhlIGR1cmF0aW9uIGluIHNlY29uZHMgb2YgdGhlIHRpY2tzLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU2lnbmFsLnByb3RvdHlwZS50aWNrc1RvVGltZSA9IGZ1bmN0aW9uICh0aWNrcywgd2hlbikge1xuXHQgICAgICAgIHdoZW4gPSB0aGlzLnRvU2Vjb25kcyh3aGVuKTtcblx0ICAgICAgICByZXR1cm4gbmV3IFRvbmUuVGltZSh0aGlzLmdldER1cmF0aW9uT2ZUaWNrcyh0aWNrcywgd2hlbikpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBpbnZlcnNlIG9mIFt0aWNrc1RvVGltZV0oI3RpY2tzdG90aW1lKS4gQ29udmVydCBhIGR1cmF0aW9uIGluXG5cdFx0ICogc2Vjb25kcyB0byB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgdGlja3MgYWNjb3VudGluZyBmb3IgYW55XG5cdFx0ICogYXV0b21hdGlvbiBjdXJ2ZXMgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHRpbWUuXG5cdFx0ICogQHBhcmFtICB7VGltZX0gZHVyYXRpb24gVGhlIHRpbWUgaW50ZXJ2YWwgdG8gY29udmVydCB0byB0aWNrcy5cblx0XHQgKiBAcGFyYW0gIHtUaW1lfSBbd2hlbj1ub3ddICAgICBXaGVuIGFsb25nIHRoZSBhdXRvbWF0aW9uIHRpbWVsaW5lIHRvIGNvbnZlcnQgdGhlIHRpY2tzLlxuXHRcdCAqIEByZXR1cm4ge1RvbmUuVGlja3N9ICAgICAgICAgIFRoZSBkdXJhdGlvbiBpbiB0aWNrcy5cblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja1NpZ25hbC5wcm90b3R5cGUudGltZVRvVGlja3MgPSBmdW5jdGlvbiAoZHVyYXRpb24sIHdoZW4pIHtcblx0ICAgICAgICB3aGVuID0gdGhpcy50b1NlY29uZHMod2hlbik7XG5cdCAgICAgICAgZHVyYXRpb24gPSB0aGlzLnRvU2Vjb25kcyhkdXJhdGlvbik7XG5cdCAgICAgICAgdmFyIHN0YXJ0VGlja3MgPSB0aGlzLmdldFRpY2tzQXRUaW1lKHdoZW4pO1xuXHQgICAgICAgIHZhciBlbmRUaWNrcyA9IHRoaXMuZ2V0VGlja3NBdFRpbWUod2hlbiArIGR1cmF0aW9uKTtcblx0ICAgICAgICByZXR1cm4gbmV3IFRvbmUuVGlja3MoZW5kVGlja3MgLSBzdGFydFRpY2tzKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5UaWNrU2lnbmFsO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIEEgVGltZWxpbmUgU3RhdGUuIFByb3ZpZGVzIHRoZSBtZXRob2RzOiA8Y29kZT5zZXRTdGF0ZUF0VGltZShcInN0YXRlXCIsIHRpbWUpPC9jb2RlPlxuXHRcdCAqICAgICAgICAgIGFuZCA8Y29kZT5nZXRWYWx1ZUF0VGltZSh0aW1lKTwvY29kZT4uXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuVGltZWxpbmV9XG5cdFx0ICogIEBwYXJhbSB7U3RyaW5nfSBpbml0aWFsIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBUaW1lbGluZVN0YXRlLiBcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+dW5kZWZpbmVkPC9jb2RlPlxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaW1lbGluZVN0YXRlID0gZnVuY3Rpb24gKGluaXRpYWwpIHtcblx0ICAgICAgICBUb25lLlRpbWVsaW5lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGluaXRpYWwgc3RhdGVcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtTdHJpbmd9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9pbml0aWFsID0gaW5pdGlhbDtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlRpbWVsaW5lU3RhdGUsIFRvbmUuVGltZWxpbmUpO1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHNjaGVkdWxlZCBzdGF0ZSBzY2hlZHVsZWQgYmVmb3JlIG9yIGF0XG5cdFx0ICogIHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lICBUaGUgdGltZSB0byBxdWVyeS5cblx0XHQgKiAgQHJldHVybiAge1N0cmluZ30gIFRoZSBuYW1lIG9mIHRoZSBzdGF0ZSBpbnB1dCBpbiBzZXRTdGF0ZUF0VGltZS5cblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZWxpbmVTdGF0ZS5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHZhciBldmVudCA9IHRoaXMuZ2V0KHRpbWUpO1xuXHQgICAgICAgIGlmIChldmVudCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gZXZlbnQuc3RhdGU7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRpYWw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBBZGQgYSBzdGF0ZSB0byB0aGUgdGltZWxpbmUuXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ30gIHN0YXRlIFRoZSBuYW1lIG9mIHRoZSBzdGF0ZSB0byBzZXQuXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHRpbWUgIFRoZSB0aW1lIHRvIHF1ZXJ5LlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaW1lbGluZVN0YXRlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWVsaW5lU3RhdGUucHJvdG90eXBlLnNldFN0YXRlQXRUaW1lID0gZnVuY3Rpb24gKHN0YXRlLCB0aW1lKSB7XG5cdCAgICAgICAgLy9hbGwgc3RhdGUgY2hhbmdlcyBuZWVkIHRvIGJlID49IHRoZSBwcmV2aW91cyBzdGF0ZSB0aW1lXG5cdCAgICAgICAgLy9UT0RPIHRocm93IGVycm9yIGlmIHRpbWUgPCB0aGUgcHJldmlvdXMgZXZlbnQgdGltZVxuXHQgICAgICAgIHRoaXMuYWRkKHtcblx0ICAgICAgICAgICAgJ3N0YXRlJzogc3RhdGUsXG5cdCAgICAgICAgICAgICd0aW1lJzogdGltZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIGV2ZW50IGJlZm9yZSB0aGUgdGltZSB3aXRoIHRoZSBnaXZlbiBzdGF0ZVxuXHRcdCAqICBAcGFyYW0ge1RvbmUuU3RhdGV9IHN0YXRlIFRoZSBzdGF0ZSB0byBsb29rIGZvclxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSAgdGltZSAgV2hlbiB0byBjaGVjayBiZWZvcmVcdFx0XHRcblx0XHQgKiAgQHJldHVybiAge09iamVjdH0gIFRoZSBldmVudCB3aXRoIHRoZSBnaXZlbiBzdGF0ZSBiZWZvcmUgdGhlIHRpbWVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGltZWxpbmVTdGF0ZS5wcm90b3R5cGUuZ2V0TGFzdFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX3NlYXJjaCh0aW1lKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gaW5kZXg7IGkgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgIHZhciBldmVudCA9IHRoaXMuX3RpbWVsaW5lW2ldO1xuXHQgICAgICAgICAgICBpZiAoZXZlbnQuc3RhdGUgPT09IHN0YXRlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgZXZlbnQgYWZ0ZXIgdGhlIHRpbWUgd2l0aCB0aGUgZ2l2ZW4gc3RhdGVcblx0XHQgKiAgQHBhcmFtIHtUb25lLlN0YXRlfSBzdGF0ZSBUaGUgc3RhdGUgdG8gbG9vayBmb3Jcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gIHRpbWUgIFdoZW4gdG8gY2hlY2sgZnJvbVxuXHRcdCAqICBAcmV0dXJuICB7T2JqZWN0fSAgVGhlIGV2ZW50IHdpdGggdGhlIGdpdmVuIHN0YXRlIGFmdGVyIHRoZSB0aW1lXG5cdFx0ICovXG5cdCAgICBUb25lLlRpbWVsaW5lU3RhdGUucHJvdG90eXBlLmdldE5leHRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9zZWFyY2godGltZSk7XG5cdCAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXg7IGkgPCB0aGlzLl90aW1lbGluZS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gdGhpcy5fdGltZWxpbmVbaV07XG5cdCAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc3RhdGUgPT09IHN0YXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlRpbWVsaW5lU3RhdGU7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgVXNlcyBbVG9uZS5UaWNrU2lnbmFsXShUaWNrU2lnbmFsKSB0byB0cmFjayBlbGFwc2VkIHRpY2tzIHdpdGhcblx0XHQgKiAgXHRcdGNvbXBsZXggYXV0b21hdGlvbiBjdXJ2ZXMuXG5cdFx0ICpcblx0XHQgKiBcdEBjb25zdHJ1Y3RvclxuXHQgICAgICogIEBwYXJhbSB7RnJlcXVlbmN5fSBmcmVxdWVuY3kgVGhlIGluaXRpYWwgZnJlcXVlbmN5IHRoYXQgdGhlIHNpZ25hbCB0aWNrcyBhdFxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja1NvdXJjZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbJ2ZyZXF1ZW5jeSddLCBUb25lLlRpY2tTb3VyY2UpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBmcmVxdWVuY3kgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkLlxuXHRcdFx0ICogIEB0eXBlICB7RnJlcXVlbmN5fVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbmV3IFRvbmUuVGlja1NpZ25hbChvcHRpb25zLmZyZXF1ZW5jeSwgVG9uZS5UeXBlLkZyZXF1ZW5jeSk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoJ2ZyZXF1ZW5jeScpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBzdGF0ZSB0aW1lbGluZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlRpbWVsaW5lU3RhdGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N0YXRlID0gbmV3IFRvbmUuVGltZWxpbmVTdGF0ZShUb25lLlN0YXRlLlN0b3BwZWQpO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKFRvbmUuU3RhdGUuU3RvcHBlZCwgMCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgb2Zmc2V0IHZhbHVlcyBvZiB0aGUgdGlja3Ncblx0XHRcdCAqIEB0eXBlIHtUb25lLlRpbWVsaW5lfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3RpY2tPZmZzZXQgPSBuZXcgVG9uZS5UaW1lbGluZSgpO1xuXHQgICAgICAgIC8vYWRkIHRoZSBmaXJzdCBldmVudFxuXHQgICAgICAgIHRoaXMuc2V0VGlja3NBdFRpbWUoMCwgMCk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5UaWNrU291cmNlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU291cmNlLmRlZmF1bHRzID0geyAnZnJlcXVlbmN5JzogMSB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHBsYXliYWNrIHN0YXRlIG9mIHRoZSBzb3VyY2UsIGVpdGhlciBcInN0YXJ0ZWRcIiwgXCJzdG9wcGVkXCIgb3IgXCJwYXVzZWRcIi5cblx0XHQgKiAgQHR5cGUge1RvbmUuU3RhdGV9XG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5UaWNrU291cmNlI1xuXHRcdCAqICBAbmFtZSBzdGF0ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuVGlja1NvdXJjZS5wcm90b3R5cGUsICdzdGF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHRoaXMubm93KCkpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFN0YXJ0IHRoZSBjbG9jayBhdCB0aGUgZ2l2ZW4gdGltZS4gT3B0aW9uYWxseSBwYXNzIGluIGFuIG9mZnNldFxuXHRcdCAqICBvZiB3aGVyZSB0byBzdGFydCB0aGUgdGljayBjb3VudGVyIGZyb20uXG5cdFx0ICogIEBwYXJhbSAge1RpbWU9fSAgdGltZSAgICBUaGUgdGltZSB0aGUgY2xvY2sgc2hvdWxkIHN0YXJ0XG5cdFx0ICogIEBwYXJhbSB7VGlja3M9MH0gb2Zmc2V0IFRoZSBudW1iZXIgb2YgdGlja3MgdG8gc3RhcnQgdGhlIHNvdXJjZSBhdFxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5UaWNrU291cmNlfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU291cmNlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICh0aW1lLCBvZmZzZXQpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHRpbWUpICE9PSBUb25lLlN0YXRlLlN0YXJ0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUoVG9uZS5TdGF0ZS5TdGFydGVkLCB0aW1lKTtcblx0ICAgICAgICAgICAgaWYgKFRvbmUuaXNEZWZpbmVkKG9mZnNldCkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2V0VGlja3NBdFRpbWUob2Zmc2V0LCB0aW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU3RvcCB0aGUgY2xvY2suIFN0b3BwaW5nIHRoZSBjbG9jayByZXNldHMgdGhlIHRpY2sgY291bnRlciB0byAwLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gVGhlIHRpbWUgd2hlbiB0aGUgY2xvY2sgc2hvdWxkIHN0b3AuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlRpY2tTb3VyY2V9IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBjbG9jay5zdG9wKCk7XG5cdFx0ICovXG5cdCAgICBUb25lLlRpY2tTb3VyY2UucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICAvL2NhbmNlbCB0aGUgcHJldmlvdXMgc3RvcFxuXHQgICAgICAgIGlmICh0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aW1lKSA9PT0gVG9uZS5TdGF0ZS5TdG9wcGVkKSB7XG5cdCAgICAgICAgICAgIHZhciBldmVudCA9IHRoaXMuX3N0YXRlLmdldCh0aW1lKTtcblx0ICAgICAgICAgICAgaWYgKGV2ZW50LnRpbWUgPiAwKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl90aWNrT2Zmc2V0LmNhbmNlbChldmVudC50aW1lKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlLmNhbmNlbChldmVudC50aW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9zdGF0ZS5jYW5jZWwodGltZSk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUoVG9uZS5TdGF0ZS5TdG9wcGVkLCB0aW1lKTtcblx0ICAgICAgICB0aGlzLnNldFRpY2tzQXRUaW1lKDAsIHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBQYXVzZSB0aGUgY2xvY2suIFBhdXNpbmcgZG9lcyBub3QgcmVzZXQgdGhlIHRpY2sgY291bnRlci5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIFRoZSB0aW1lIHdoZW4gdGhlIGNsb2NrIHNob3VsZCBzdG9wLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaWNrU291cmNlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRpY2tTb3VyY2UucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHRpbWUpID09PSBUb25lLlN0YXRlLlN0YXJ0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUoVG9uZS5TdGF0ZS5QYXVzZWQsIHRpbWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2FuY2VsIHN0YXJ0L3N0b3AvcGF1c2UgYW5kIHNldFRpY2tBdFRpbWUgZXZlbnRzIHNjaGVkdWxlZCBhZnRlciB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIFdoZW4gdG8gY2xlYXIgdGhlIGV2ZW50cyBhZnRlclxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UaWNrU291cmNlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRpY2tTb3VyY2UucHJvdG90eXBlLmNhbmNlbCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLmNhbmNlbCh0aW1lKTtcblx0ICAgICAgICB0aGlzLl90aWNrT2Zmc2V0LmNhbmNlbCh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBHZXQgdGhlIGVsYXBzZWQgdGlja3MgYXQgdGhlIGdpdmVuIHRpbWVcblx0XHQgKiBAcGFyYW0gIHtUaW1lfSB0aW1lICBXaGVuIHRvIGdldCB0aGUgdGljayB2YWx1ZVxuXHRcdCAqIEByZXR1cm4ge1RpY2tzfSAgICAgVGhlIG51bWJlciBvZiB0aWNrc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU291cmNlLnByb3RvdHlwZS5nZXRUaWNrc0F0VGltZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHZhciBzdG9wRXZlbnQgPSB0aGlzLl9zdGF0ZS5nZXRMYXN0U3RhdGUoVG9uZS5TdGF0ZS5TdG9wcGVkLCB0aW1lKTtcblx0ICAgICAgICAvL3RoaXMgZXZlbnQgYWxsb3dzIGZvckVhY2hCZXR3ZWVuIHRvIGl0ZXJhdGUgdW50aWwgdGhlIGN1cnJlbnQgdGltZVxuXHQgICAgICAgIHZhciB0bXBFdmVudCA9IHtcblx0ICAgICAgICAgICAgc3RhdGU6IFRvbmUuU3RhdGUuUGF1c2VkLFxuXHQgICAgICAgICAgICB0aW1lOiB0aW1lXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5hZGQodG1wRXZlbnQpO1xuXHQgICAgICAgIC8va2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgb2Zmc2V0IGV2ZW50XG5cdCAgICAgICAgdmFyIGxhc3RTdGF0ZSA9IHN0b3BFdmVudDtcblx0ICAgICAgICB2YXIgZWxhcHNlZFRpY2tzID0gMDtcblx0ICAgICAgICAvL2l0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIGV2ZW50cyBzaW5jZSB0aGUgbGFzdCBzdG9wXG5cdCAgICAgICAgdGhpcy5fc3RhdGUuZm9yRWFjaEJldHdlZW4oc3RvcEV2ZW50LnRpbWUsIHRpbWUgKyB0aGlzLnNhbXBsZVRpbWUsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgIHZhciBwZXJpb2RTdGFydFRpbWUgPSBsYXN0U3RhdGUudGltZTtcblx0ICAgICAgICAgICAgLy9pZiB0aGVyZSBpcyBhbiBvZmZzZXQgZXZlbnQgaW4gdGhpcyBwZXJpb2QgdXNlIHRoYXRcblx0ICAgICAgICAgICAgdmFyIG9mZnNldEV2ZW50ID0gdGhpcy5fdGlja09mZnNldC5nZXQoZS50aW1lKTtcblx0ICAgICAgICAgICAgaWYgKG9mZnNldEV2ZW50LnRpbWUgPj0gbGFzdFN0YXRlLnRpbWUpIHtcblx0ICAgICAgICAgICAgICAgIGVsYXBzZWRUaWNrcyA9IG9mZnNldEV2ZW50LnRpY2tzO1xuXHQgICAgICAgICAgICAgICAgcGVyaW9kU3RhcnRUaW1lID0gb2Zmc2V0RXZlbnQudGltZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAobGFzdFN0YXRlLnN0YXRlID09PSBUb25lLlN0YXRlLlN0YXJ0ZWQgJiYgZS5zdGF0ZSAhPT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgICAgICBlbGFwc2VkVGlja3MgKz0gdGhpcy5mcmVxdWVuY3kuZ2V0VGlja3NBdFRpbWUoZS50aW1lKSAtIHRoaXMuZnJlcXVlbmN5LmdldFRpY2tzQXRUaW1lKHBlcmlvZFN0YXJ0VGltZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgbGFzdFN0YXRlID0gZTtcblx0ICAgICAgICB9LmJpbmQodGhpcykpO1xuXHQgICAgICAgIC8vcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZXZlbnRcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5yZW1vdmUodG1wRXZlbnQpO1xuXHQgICAgICAgIC8vcmV0dXJuIHRoZSB0aWNrc1xuXHQgICAgICAgIHJldHVybiBlbGFwc2VkVGlja3M7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGNhbGxiYWNrIHdhcyBpbnZva2VkLiBTdGFydHMgY291bnRpbmcgYXQgMFxuXHRcdCAqICBhbmQgaW5jcmVtZW50cyBhZnRlciB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQuIFJldHVybnMgLTEgd2hlbiBzdG9wcGVkLlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5UaWNrU291cmNlI1xuXHRcdCAqICBAbmFtZSB0aWNrc1xuXHRcdCAqICBAdHlwZSB7VGlja3N9XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5UaWNrU291cmNlLnByb3RvdHlwZSwgJ3RpY2tzJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRUaWNrc0F0VGltZSh0aGlzLm5vdygpKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHtcblx0ICAgICAgICAgICAgdGhpcy5zZXRUaWNrc0F0VGltZSh0LCB0aGlzLm5vdygpKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgdGltZSBzaW5jZSB0aWNrcz0wIHRoYXQgdGhlIFRpY2tTb3VyY2UgaGFzIGJlZW4gcnVubmluZy4gQWNjb3VudHNcblx0XHQgKiAgZm9yIHRlbXBvIGN1cnZlc1xuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5UaWNrU291cmNlI1xuXHRcdCAqICBAbmFtZSBzZWNvbmRzXG5cdFx0ICogIEB0eXBlIHtTZWNvbmRzfVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuVGlja1NvdXJjZS5wcm90b3R5cGUsICdzZWNvbmRzJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTZWNvbmRzQXRUaW1lKHRoaXMubm93KCkpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocykge1xuXHQgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5ub3coKTtcblx0ICAgICAgICAgICAgdmFyIHRpY2tzID0gdGhpcy5mcmVxdWVuY3kudGltZVRvVGlja3Mocywgbm93KTtcblx0ICAgICAgICAgICAgdGhpcy5zZXRUaWNrc0F0VGltZSh0aWNrcywgbm93KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIGVsYXBzZWQgc2Vjb25kcyBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gIHRpbWUgIFdoZW4gdG8gZ2V0IHRoZSBlbGFwc2VkIHNlY29uZHNcblx0XHQgKiAgQHJldHVybiAge1NlY29uZHN9ICBUaGUgbnVtYmVyIG9mIGVsYXBzZWQgc2Vjb25kc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU291cmNlLnByb3RvdHlwZS5nZXRTZWNvbmRzQXRUaW1lID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdmFyIHN0b3BFdmVudCA9IHRoaXMuX3N0YXRlLmdldExhc3RTdGF0ZShUb25lLlN0YXRlLlN0b3BwZWQsIHRpbWUpO1xuXHQgICAgICAgIC8vdGhpcyBldmVudCBhbGxvd3MgZm9yRWFjaEJldHdlZW4gdG8gaXRlcmF0ZSB1bnRpbCB0aGUgY3VycmVudCB0aW1lXG5cdCAgICAgICAgdmFyIHRtcEV2ZW50ID0ge1xuXHQgICAgICAgICAgICBzdGF0ZTogVG9uZS5TdGF0ZS5QYXVzZWQsXG5cdCAgICAgICAgICAgIHRpbWU6IHRpbWVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLmFkZCh0bXBFdmVudCk7XG5cdCAgICAgICAgLy9rZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBvZmZzZXQgZXZlbnRcblx0ICAgICAgICB2YXIgbGFzdFN0YXRlID0gc3RvcEV2ZW50O1xuXHQgICAgICAgIHZhciBlbGFwc2VkU2Vjb25kcyA9IDA7XG5cdCAgICAgICAgLy9pdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBldmVudHMgc2luY2UgdGhlIGxhc3Qgc3RvcFxuXHQgICAgICAgIHRoaXMuX3N0YXRlLmZvckVhY2hCZXR3ZWVuKHN0b3BFdmVudC50aW1lLCB0aW1lICsgdGhpcy5zYW1wbGVUaW1lLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICB2YXIgcGVyaW9kU3RhcnRUaW1lID0gbGFzdFN0YXRlLnRpbWU7XG5cdCAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgYW4gb2Zmc2V0IGV2ZW50IGluIHRoaXMgcGVyaW9kIHVzZSB0aGF0XG5cdCAgICAgICAgICAgIHZhciBvZmZzZXRFdmVudCA9IHRoaXMuX3RpY2tPZmZzZXQuZ2V0KGUudGltZSk7XG5cdCAgICAgICAgICAgIGlmIChvZmZzZXRFdmVudC50aW1lID49IGxhc3RTdGF0ZS50aW1lKSB7XG5cdCAgICAgICAgICAgICAgICBlbGFwc2VkU2Vjb25kcyA9IG9mZnNldEV2ZW50LnNlY29uZHM7XG5cdCAgICAgICAgICAgICAgICBwZXJpb2RTdGFydFRpbWUgPSBvZmZzZXRFdmVudC50aW1lO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChsYXN0U3RhdGUuc3RhdGUgPT09IFRvbmUuU3RhdGUuU3RhcnRlZCAmJiBlLnN0YXRlICE9PSBUb25lLlN0YXRlLlN0YXJ0ZWQpIHtcblx0ICAgICAgICAgICAgICAgIGVsYXBzZWRTZWNvbmRzICs9IGUudGltZSAtIHBlcmlvZFN0YXJ0VGltZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBsYXN0U3RhdGUgPSBlO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICAgICAgLy9yZW1vdmUgdGhlIHRlbXBvcmFyeSBldmVudFxuXHQgICAgICAgIHRoaXMuX3N0YXRlLnJlbW92ZSh0bXBFdmVudCk7XG5cdCAgICAgICAgLy9yZXR1cm4gdGhlIHRpY2tzXG5cdCAgICAgICAgcmV0dXJuIGVsYXBzZWRTZWNvbmRzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFNldCB0aGUgY2xvY2sncyB0aWNrcyBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiBAcGFyYW0gIHtUaWNrc30gdGlja3MgVGhlIHRpY2sgdmFsdWUgdG8gc2V0XG5cdFx0ICogQHBhcmFtICB7VGltZX0gdGltZSAgV2hlbiB0byBzZXQgdGhlIHRpY2sgdmFsdWVcblx0XHQgKiBAcmV0dXJuIHtUb25lLlRpY2tTb3VyY2V9ICAgICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja1NvdXJjZS5wcm90b3R5cGUuc2V0VGlja3NBdFRpbWUgPSBmdW5jdGlvbiAodGlja3MsIHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fdGlja09mZnNldC5jYW5jZWwodGltZSk7XG5cdCAgICAgICAgdGhpcy5fdGlja09mZnNldC5hZGQoe1xuXHQgICAgICAgICAgICAndGltZSc6IHRpbWUsXG5cdCAgICAgICAgICAgICd0aWNrcyc6IHRpY2tzLFxuXHQgICAgICAgICAgICAnc2Vjb25kcyc6IHRoaXMuZnJlcXVlbmN5LmdldER1cmF0aW9uT2ZUaWNrcyh0aWNrcywgdGltZSlcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgc2NoZWR1bGVkIHN0YXRlIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSAgdGltZSAgVGhlIHRpbWUgdG8gcXVlcnkuXG5cdFx0ICogIEByZXR1cm4gIHtTdHJpbmd9ICBUaGUgbmFtZSBvZiB0aGUgc3RhdGUgaW5wdXQgaW4gc2V0U3RhdGVBdFRpbWUuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogc291cmNlLnN0YXJ0KFwiKzAuMVwiKTtcblx0XHQgKiBzb3VyY2UuZ2V0U3RhdGVBdFRpbWUoXCIrMC4xXCIpOyAvL3JldHVybnMgXCJzdGFydGVkXCJcblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja1NvdXJjZS5wcm90b3R5cGUuZ2V0U3RhdGVBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUodGltZSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogR2V0IHRoZSB0aW1lIG9mIHRoZSBnaXZlbiB0aWNrLiBUaGUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ICogaXMgd2hlbiB0byB0ZXN0IGJlZm9yZS4gU2luY2UgdGlja3MgY2FuIGJlIHNldCAod2l0aCBzZXRUaWNrc0F0VGltZSlcblx0XHQgKiB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgdGltZXMgZm9yIGEgZ2l2ZW4gdGljayB2YWx1ZS4gXG5cdFx0ICogQHBhcmFtICB7VGlja3N9IHRpY2tzIFRoZSB0aWNrIG51bWJlci5cblx0XHQgKiBAcGFyYW0gIHtUaW1lPX0gYmVmb3JlIFdoZW4gdG8gbWVhc3VyZSB0aGUgdGljayB2YWx1ZSBmcm9tLiBcblx0XHQgKiBAcmV0dXJuIHtUaW1lfSAgICAgICBUaGUgdGltZSBvZiB0aGUgdGlja1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU291cmNlLnByb3RvdHlwZS5nZXRUaW1lT2ZUaWNrID0gZnVuY3Rpb24gKHRpY2ssIGJlZm9yZSkge1xuXHQgICAgICAgIGJlZm9yZSA9IFRvbmUuZGVmYXVsdEFyZyhiZWZvcmUsIHRoaXMubm93KCkpO1xuXHQgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl90aWNrT2Zmc2V0LmdldChiZWZvcmUpO1xuXHQgICAgICAgIHZhciBldmVudCA9IHRoaXMuX3N0YXRlLmdldChiZWZvcmUpO1xuXHQgICAgICAgIHZhciBzdGFydFRpbWUgPSBNYXRoLm1heChvZmZzZXQudGltZSwgZXZlbnQudGltZSk7XG5cdCAgICAgICAgdmFyIGFic29sdXRlVGlja3MgPSB0aGlzLmZyZXF1ZW5jeS5nZXRUaWNrc0F0VGltZShzdGFydFRpbWUpICsgdGljayAtIG9mZnNldC50aWNrcztcblx0ICAgICAgICByZXR1cm4gdGhpcy5mcmVxdWVuY3kuZ2V0VGltZU9mVGljayhhYnNvbHV0ZVRpY2tzKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgSW52b2tlIHRoZSBjYWxsYmFjayBldmVudCBhdCBhbGwgc2NoZWR1bGVkIHRpY2tzIGJldHdlZW4gdGhlIFxuXHRcdCAqICBzdGFydCB0aW1lIGFuZCB0aGUgZW5kIHRpbWVcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gICAgc3RhcnRUaW1lICBUaGUgYmVnaW5uaW5nIG9mIHRoZSBzZWFyY2ggcmFuZ2Vcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gICAgZW5kVGltZSAgICBUaGUgZW5kIG9mIHRoZSBzZWFyY2ggcmFuZ2Vcblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb248VGltZSxUaWNrcz59ICBjYWxsYmFjayAgIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2l0aCBlYWNoIHRpY2tcblx0XHQgKiAgQHJldHVybiAge1RvbmUuVGlja1NvdXJjZX0gICAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrU291cmNlLnByb3RvdHlwZS5mb3JFYWNoVGlja0JldHdlZW4gPSBmdW5jdGlvbiAoc3RhcnRUaW1lLCBlbmRUaW1lLCBjYWxsYmFjaykge1xuXHQgICAgICAgIC8vb25seSBpdGVyYXRlIHRocm91Z2ggdGhlIHNlY3Rpb25zIHdoZXJlIGl0IGlzIFwic3RhcnRlZFwiXG5cdCAgICAgICAgdmFyIGxhc3RTdGF0ZUV2ZW50ID0gdGhpcy5fc3RhdGUuZ2V0KHN0YXJ0VGltZSk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUuZm9yRWFjaEJldHdlZW4oc3RhcnRUaW1lLCBlbmRUaW1lLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgICAgaWYgKGxhc3RTdGF0ZUV2ZW50LnN0YXRlID09PSBUb25lLlN0YXRlLlN0YXJ0ZWQgJiYgZXZlbnQuc3RhdGUgIT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5mb3JFYWNoVGlja0JldHdlZW4oTWF0aC5tYXgobGFzdFN0YXRlRXZlbnQudGltZSwgc3RhcnRUaW1lKSwgZXZlbnQudGltZSAtIHRoaXMuc2FtcGxlVGltZSwgY2FsbGJhY2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGxhc3RTdGF0ZUV2ZW50ID0gZXZlbnQ7XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgICAgICBzdGFydFRpbWUgPSBNYXRoLm1heChsYXN0U3RhdGVFdmVudC50aW1lLCBzdGFydFRpbWUpO1xuXHQgICAgICAgIGlmIChsYXN0U3RhdGVFdmVudC5zdGF0ZSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkICYmIHRoaXMuX3N0YXRlKSB7XG5cdCAgICAgICAgICAgIC8vZmlndXJlIG91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmcmVxdWVuY3kgdGlja3MgYW5kIHRoZSBcblx0ICAgICAgICAgICAgdmFyIHN0YXJ0VGlja3MgPSB0aGlzLmZyZXF1ZW5jeS5nZXRUaWNrc0F0VGltZShzdGFydFRpbWUpO1xuXHQgICAgICAgICAgICB2YXIgdGlja3NBdFN0YXJ0ID0gdGhpcy5mcmVxdWVuY3kuZ2V0VGlja3NBdFRpbWUobGFzdFN0YXRlRXZlbnQudGltZSk7XG5cdCAgICAgICAgICAgIHZhciBkaWZmID0gc3RhcnRUaWNrcyAtIHRpY2tzQXRTdGFydDtcblx0ICAgICAgICAgICAgdmFyIG9mZnNldCA9IGRpZmYgJSAxO1xuXHQgICAgICAgICAgICBpZiAob2Zmc2V0ICE9PSAwKSB7XG5cdCAgICAgICAgICAgICAgICBvZmZzZXQgPSAxIC0gb2Zmc2V0O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHZhciBuZXh0VGlja1RpbWUgPSB0aGlzLmZyZXF1ZW5jeS5nZXRUaW1lT2ZUaWNrKHN0YXJ0VGlja3MgKyBvZmZzZXQpO1xuXHQgICAgICAgICAgICB2YXIgZXJyb3IgPSBudWxsO1xuXHQgICAgICAgICAgICB3aGlsZSAobmV4dFRpY2tUaW1lIDwgZW5kVGltZSAmJiB0aGlzLl9zdGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhuZXh0VGlja1RpbWUsIE1hdGgucm91bmQodGhpcy5nZXRUaWNrc0F0VGltZShuZXh0VGlja1RpbWUpKSk7XG5cdCAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbmV4dFRpY2tUaW1lICs9IHRoaXMuZnJlcXVlbmN5LmdldER1cmF0aW9uT2ZUaWNrcygxLCBuZXh0VGlja1RpbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChlcnJvcikge1xuXHQgICAgICAgICAgICB0aHJvdyBlcnJvcjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlRpY2tTb3VyY2V9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja1NvdXJjZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlBhcmFtLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl90aWNrT2Zmc2V0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl90aWNrT2Zmc2V0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZSgnZnJlcXVlbmN5Jyk7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5UaWNrU291cmNlO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIEEgc2FtcGxlIGFjY3VyYXRlIGNsb2NrIHdoaWNoIHByb3ZpZGVzIGEgY2FsbGJhY2sgYXQgdGhlIGdpdmVuIHJhdGUuXG5cdFx0ICogICAgICAgICAgV2hpbGUgdGhlIGNhbGxiYWNrIGlzIG5vdCBzYW1wbGUtYWNjdXJhdGUgKGl0IGlzIHN0aWxsIHN1c2NlcHRpYmxlIHRvXG5cdFx0ICogICAgICAgICAgbG9vc2UgSlMgdGltaW5nKSwgdGhlIHRpbWUgcGFzc2VkIGluIGFzIHRoZSBhcmd1bWVudCB0byB0aGUgY2FsbGJhY2tcblx0XHQgKiAgICAgICAgICBpcyBwcmVjaXNlLiBGb3IgbW9zdCBhcHBsaWNhdGlvbnMsIGl0IGlzIGJldHRlciB0byB1c2UgVG9uZS5UcmFuc3BvcnRcblx0XHQgKiAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBDbG9jayBieSBpdHNlbGYgc2luY2UgeW91IGNhbiBzeW5jaHJvbml6ZSBtdWx0aXBsZSBjYWxsYmFja3MuXG5cdFx0ICpcblx0XHQgKiBcdEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5FbWl0dGVyfVxuXHRcdCAqIFx0QHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2l0aCB0aGUgdGltZSBvZiB0aGUgYXVkaW8gZXZlbnRcblx0XHQgKiBcdEBwYXJhbSB7RnJlcXVlbmN5fSBmcmVxdWVuY3kgVGhlIHJhdGUgb2YgdGhlIGNhbGxiYWNrXG5cdFx0ICogXHRAZXhhbXBsZVxuXHRcdCAqIC8vdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBhcHByb3hpbWF0ZWx5IG9uY2UgYSBzZWNvbmRcblx0XHQgKiAvL2FuZCB3aWxsIHByaW50IHRoZSB0aW1lIGV4YWN0bHkgb25jZSBhIHNlY29uZCBhcGFydC5cblx0XHQgKiB2YXIgY2xvY2sgPSBuZXcgVG9uZS5DbG9jayhmdW5jdGlvbih0aW1lKXtcblx0XHQgKiBcdGNvbnNvbGUubG9nKHRpbWUpO1xuXHRcdCAqIH0sIDEpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5DbG9jayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdjYWxsYmFjaycsXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knXG5cdCAgICAgICAgXSwgVG9uZS5DbG9jayk7XG5cdCAgICAgICAgVG9uZS5FbWl0dGVyLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGludm9rZSBhdCB0aGUgc2NoZWR1bGVkIHRpY2suXG5cdFx0XHQgKiAgQHR5cGUgIHtGdW5jdGlvbn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBuZXh0IHRpbWUgdGhlIGNhbGxiYWNrIGlzIHNjaGVkdWxlZC5cblx0XHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9uZXh0VGljayA9IDA7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHRpY2sgY291bnRlclxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5UaWNrU291cmNlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl90aWNrU291cmNlID0gbmV3IFRvbmUuVGlja1NvdXJjZShvcHRpb25zLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGxhc3QgdGltZSB0aGUgbG9vcCBjYWxsYmFjayB3YXMgaW52b2tlZFxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xhc3RVcGRhdGUgPSAwO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSByYXRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgYmUgaW52b2tlZC5cblx0XHRcdCAqICBAdHlwZSAge0JQTX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IHRoaXMuX3RpY2tTb3VyY2UuZnJlcXVlbmN5O1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KCdmcmVxdWVuY3knKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgc3RhdGUgdGltZWxpbmVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5UaW1lbGluZVN0YXRlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zdGF0ZSA9IG5ldyBUb25lLlRpbWVsaW5lU3RhdGUoVG9uZS5TdGF0ZS5TdG9wcGVkKTtcblx0ICAgICAgICAvL2FkZCBhbiBpbml0aWFsIHN0YXRlXG5cdCAgICAgICAgdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUoVG9uZS5TdGF0ZS5TdG9wcGVkLCAwKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbG9vcCBmdW5jdGlvbiBib3VuZCB0byBpdHMgY29udGV4dC5cblx0XHRcdCAqICBUaGlzIGlzIG5lY2Vzc2FyeSB0byByZW1vdmUgdGhlIGV2ZW50IGluIHRoZSBlbmQuXG5cdFx0XHQgKiAgQHR5cGUge0Z1bmN0aW9ufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9ib3VuZExvb3AgPSB0aGlzLl9sb29wLmJpbmQodGhpcyk7XG5cdCAgICAgICAgLy9iaW5kIGEgY2FsbGJhY2sgdG8gdGhlIHdvcmtlciB0aHJlYWRcblx0ICAgICAgICB0aGlzLmNvbnRleHQub24oJ3RpY2snLCB0aGlzLl9ib3VuZExvb3ApO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQ2xvY2ssIFRvbmUuRW1pdHRlcik7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGRlZmF1bHRzXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSAge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuQ2xvY2suZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2NhbGxiYWNrJzogVG9uZS5ub09wLFxuXHQgICAgICAgICdmcmVxdWVuY3knOiAxXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHBsYXliYWNrIHN0YXRlIG9mIHRoZSBzb3VyY2UsIGVpdGhlciBcInN0YXJ0ZWRcIiwgXCJzdG9wcGVkXCIgb3IgXCJwYXVzZWRcIi5cblx0XHQgKiAgQHR5cGUge1RvbmUuU3RhdGV9XG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5DbG9jayNcblx0XHQgKiAgQG5hbWUgc3RhdGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkNsb2NrLnByb3RvdHlwZSwgJ3N0YXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUodGhpcy5ub3coKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgU3RhcnQgdGhlIGNsb2NrIGF0IHRoZSBnaXZlbiB0aW1lLiBPcHRpb25hbGx5IHBhc3MgaW4gYW4gb2Zmc2V0XG5cdFx0ICogIG9mIHdoZXJlIHRvIHN0YXJ0IHRoZSB0aWNrIGNvdW50ZXIgZnJvbS5cblx0XHQgKiAgQHBhcmFtICB7VGltZT19ICB0aW1lICAgIFRoZSB0aW1lIHRoZSBjbG9jayBzaG91bGQgc3RhcnRcblx0XHQgKiAgQHBhcmFtICB7VGlja3M9fSAgb2Zmc2V0ICBXaGVyZSB0aGUgdGljayBjb3VudGVyIHN0YXJ0cyBjb3VudGluZyBmcm9tLlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5DbG9ja30gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ2xvY2sucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUsIG9mZnNldCkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBpZiAodGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUodGltZSkgIT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICB0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZShUb25lLlN0YXRlLlN0YXJ0ZWQsIHRpbWUpO1xuXHQgICAgICAgICAgICB0aGlzLl90aWNrU291cmNlLnN0YXJ0KHRpbWUsIG9mZnNldCk7XG5cdCAgICAgICAgICAgIGlmICh0aW1lIDwgdGhpcy5fbGFzdFVwZGF0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGFydCcsIHRpbWUsIG9mZnNldCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN0b3AgdGhlIGNsb2NrLiBTdG9wcGluZyB0aGUgY2xvY2sgcmVzZXRzIHRoZSB0aWNrIGNvdW50ZXIgdG8gMC5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIFRoZSB0aW1lIHdoZW4gdGhlIGNsb2NrIHNob3VsZCBzdG9wLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5DbG9ja30gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIGNsb2NrLnN0b3AoKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuQ2xvY2sucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5jYW5jZWwodGltZSk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUoVG9uZS5TdGF0ZS5TdG9wcGVkLCB0aW1lKTtcblx0ICAgICAgICB0aGlzLl90aWNrU291cmNlLnN0b3AodGltZSk7XG5cdCAgICAgICAgaWYgKHRpbWUgPCB0aGlzLl9sYXN0VXBkYXRlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RvcCcsIHRpbWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUGF1c2UgdGhlIGNsb2NrLiBQYXVzaW5nIGRvZXMgbm90IHJlc2V0IHRoZSB0aWNrIGNvdW50ZXIuXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gW3RpbWU9bm93XSBUaGUgdGltZSB3aGVuIHRoZSBjbG9jayBzaG91bGQgc3RvcC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuQ2xvY2t9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ2xvY2sucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHRpbWUpID09PSBUb25lLlN0YXRlLlN0YXJ0ZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUoVG9uZS5TdGF0ZS5QYXVzZWQsIHRpbWUpO1xuXHQgICAgICAgICAgICB0aGlzLl90aWNrU291cmNlLnBhdXNlKHRpbWUpO1xuXHQgICAgICAgICAgICBpZiAodGltZSA8IHRoaXMuX2xhc3RVcGRhdGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncGF1c2UnLCB0aW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgY2FsbGJhY2sgd2FzIGludm9rZWQuIFN0YXJ0cyBjb3VudGluZyBhdCAwXG5cdFx0ICogIGFuZCBpbmNyZW1lbnRzIGFmdGVyIHRoZSBjYWxsYmFjayB3YXMgaW52b2tlZC5cblx0XHQgKiAgQHR5cGUge1RpY2tzfVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQ2xvY2sucHJvdG90eXBlLCAndGlja3MnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5nZXRUaWNrc0F0VGltZSh0aGlzLm5vdygpKSk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpY2tTb3VyY2UudGlja3MgPSB0O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSB0aW1lIHNpbmNlIHRpY2tzPTAgdGhhdCB0aGUgQ2xvY2sgaGFzIGJlZW4gcnVubmluZy4gQWNjb3VudHNcblx0XHQgKiAgZm9yIHRlbXBvIGN1cnZlc1xuXHRcdCAqICBAdHlwZSB7U2Vjb25kc31cblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkNsb2NrLnByb3RvdHlwZSwgJ3NlY29uZHMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl90aWNrU291cmNlLnNlY29uZHM7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChzKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3RpY2tTb3VyY2Uuc2Vjb25kcyA9IHM7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSBlbGFwc2VkIHNlY29uZHMgYXQgdGhlIGdpdmVuIHRpbWUuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9ICB0aW1lICBXaGVuIHRvIGdldCB0aGUgZWxhcHNlZCBzZWNvbmRzXG5cdFx0ICogIEByZXR1cm4gIHtTZWNvbmRzfSAgVGhlIG51bWJlciBvZiBlbGFwc2VkIHNlY29uZHNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ2xvY2sucHJvdG90eXBlLmdldFNlY29uZHNBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl90aWNrU291cmNlLmdldFNlY29uZHNBdFRpbWUodGltZSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU2V0IHRoZSBjbG9jaydzIHRpY2tzIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqIEBwYXJhbSAge1RpY2tzfSB0aWNrcyBUaGUgdGljayB2YWx1ZSB0byBzZXRcblx0XHQgKiBAcGFyYW0gIHtUaW1lfSB0aW1lICBXaGVuIHRvIHNldCB0aGUgdGljayB2YWx1ZVxuXHRcdCAqIEByZXR1cm4ge1RvbmUuQ2xvY2t9ICAgICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ2xvY2sucHJvdG90eXBlLnNldFRpY2tzQXRUaW1lID0gZnVuY3Rpb24gKHRpY2tzLCB0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fdGlja1NvdXJjZS5zZXRUaWNrc0F0VGltZSh0aWNrcywgdGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogR2V0IHRoZSBjbG9jaydzIHRpY2tzIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqIEBwYXJhbSAge1RpbWV9IHRpbWUgIFdoZW4gdG8gZ2V0IHRoZSB0aWNrIHZhbHVlXG5cdFx0ICogQHJldHVybiB7VGlja3N9ICAgICAgIFRoZSB0aWNrIHZhbHVlIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5DbG9jay5wcm90b3R5cGUuZ2V0VGlja3NBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl90aWNrU291cmNlLmdldFRpY2tzQXRUaW1lKHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIEdldCB0aGUgdGltZSBvZiB0aGUgbmV4dCB0aWNrXG5cdFx0ICogQHBhcmFtICB7VGlja3N9IHRpY2tzIFRoZSB0aWNrIG51bWJlci5cblx0XHQgKiBAcGFyYW0gIHtUaW1lfSBiZWZvcmUgXG5cdFx0ICogQHJldHVybiB7VG9uZS5DbG9ja30gICAgICAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5DbG9jay5wcm90b3R5cGUubmV4dFRpY2tUaW1lID0gZnVuY3Rpb24gKG9mZnNldCwgd2hlbikge1xuXHQgICAgICAgIHdoZW4gPSB0aGlzLnRvU2Vjb25kcyh3aGVuKTtcblx0ICAgICAgICB2YXIgY3VycmVudFRpY2sgPSB0aGlzLmdldFRpY2tzQXRUaW1lKHdoZW4pO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl90aWNrU291cmNlLmdldFRpbWVPZlRpY2soY3VycmVudFRpY2sgKyBvZmZzZXQsIHdoZW4pO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgc2NoZWR1bGluZyBsb29wLlxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5DbG9jay5wcm90b3R5cGUuX2xvb3AgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHRoaXMuX2xhc3RVcGRhdGU7XG5cdCAgICAgICAgdmFyIGVuZFRpbWUgPSB0aGlzLm5vdygpO1xuXHQgICAgICAgIHRoaXMuX2xhc3RVcGRhdGUgPSBlbmRUaW1lO1xuXHQgICAgICAgIGlmIChzdGFydFRpbWUgIT09IGVuZFRpbWUpIHtcblx0ICAgICAgICAgICAgLy90aGUgc3RhdGUgY2hhbmdlIGV2ZW50c1xuXHQgICAgICAgICAgICB0aGlzLl9zdGF0ZS5mb3JFYWNoQmV0d2VlbihzdGFydFRpbWUsIGVuZFRpbWUsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgICAgICBzd2l0Y2ggKGUuc3RhdGUpIHtcblx0ICAgICAgICAgICAgICAgIGNhc2UgVG9uZS5TdGF0ZS5TdGFydGVkOlxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSB0aGlzLl90aWNrU291cmNlLmdldFRpY2tzQXRUaW1lKGUudGltZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGFydCcsIGUudGltZSwgb2Zmc2V0KTtcblx0ICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgIGNhc2UgVG9uZS5TdGF0ZS5TdG9wcGVkOlxuXHQgICAgICAgICAgICAgICAgICAgIGlmIChlLnRpbWUgIT09IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzdG9wJywgZS50aW1lKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICBjYXNlIFRvbmUuU3RhdGUuUGF1c2VkOlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncGF1c2UnLCBlLnRpbWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXHQgICAgICAgICAgICAvL3RoZSB0aWNrIGNhbGxiYWNrc1xuXHQgICAgICAgICAgICB0aGlzLl90aWNrU291cmNlLmZvckVhY2hUaWNrQmV0d2VlbihzdGFydFRpbWUsIGVuZFRpbWUsIGZ1bmN0aW9uICh0aW1lLCB0aWNrcykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aW1lLCB0aWNrcyk7XG5cdCAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIHRoZSBzY2hlZHVsZWQgc3RhdGUgYXQgdGhlIGdpdmVuIHRpbWUuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9ICB0aW1lICBUaGUgdGltZSB0byBxdWVyeS5cblx0XHQgKiAgQHJldHVybiAge1N0cmluZ30gIFRoZSBuYW1lIG9mIHRoZSBzdGF0ZSBpbnB1dCBpbiBzZXRTdGF0ZUF0VGltZS5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBjbG9jay5zdGFydChcIiswLjFcIik7XG5cdFx0ICogY2xvY2suZ2V0U3RhdGVBdFRpbWUoXCIrMC4xXCIpOyAvL3JldHVybnMgXCJzdGFydGVkXCJcblx0XHQgKi9cblx0ICAgIFRvbmUuQ2xvY2sucHJvdG90eXBlLmdldFN0YXRlQXRUaW1lID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5DbG9ja30gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5DbG9jay5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkVtaXR0ZXIucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQub2ZmKCd0aWNrJywgdGhpcy5fYm91bmRMb29wKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZSgnZnJlcXVlbmN5Jyk7XG5cdCAgICAgICAgdGhpcy5fdGlja1NvdXJjZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fdGlja1NvdXJjZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2JvdW5kTG9vcCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbmV4dFRpY2sgPSBJbmZpbml0eTtcblx0ICAgICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUgPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkNsb2NrO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgU2ltaWxhciB0byBUb25lLlRpbWVsaW5lLCBidXQgYWxsIGV2ZW50cyByZXByZXNlbnRcblx0XHQgKiAgICAgICAgIGludGVydmFscyB3aXRoIGJvdGggXCJ0aW1lXCIgYW5kIFwiZHVyYXRpb25cIiB0aW1lcy4gVGhlXG5cdFx0ICogICAgICAgICBldmVudHMgYXJlIHBsYWNlZCBpbiBhIHRyZWUgc3RydWN0dXJlIG9wdGltaXplZFxuXHRcdCAqICAgICAgICAgZm9yIHF1ZXJ5aW5nIGFuIGludGVyc2VjdGlvbiBwb2ludCB3aXRoIHRoZSB0aW1lbGluZVxuXHRcdCAqICAgICAgICAgZXZlbnRzLiBJbnRlcm5hbGx5IHVzZXMgYW4gW0ludGVydmFsIFRyZWVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludGVydmFsX3RyZWUpXG5cdFx0ICogICAgICAgICB0byByZXByZXNlbnQgdGhlIGRhdGEuXG5cdFx0ICogIEBleHRlbmRzIHtUb25lfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnRlcnZhbFRpbWVsaW5lID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgcm9vdCBub2RlIG9mIHRoZSBpbnRldmFsIHRyZWVcblx0XHRcdCAqICBAdHlwZSAge0ludGVydmFsTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcm9vdCA9IG51bGw7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgS2VlcCB0cmFjayBvZiB0aGUgbGVuZ3RoIG9mIHRoZSB0aW1lbGluZS5cblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkludGVydmFsVGltZWxpbmUpO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBldmVudCB0byBhZGQgdG8gdGhlIHRpbWVsaW5lLiBBbGwgZXZlbnRzIG11c3Rcblx0XHQgKiAgaGF2ZSBhIHRpbWUgYW5kIGR1cmF0aW9uIHZhbHVlXG5cdFx0ICogIEBwYXJhbSAge09iamVjdH0gIGV2ZW50ICBUaGUgZXZlbnQgdG8gYWRkIHRvIHRoZSB0aW1lbGluZVxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5JbnRlcnZhbFRpbWVsaW5lfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc1VuZGVmKGV2ZW50LnRpbWUpIHx8IFRvbmUuaXNVbmRlZihldmVudC5kdXJhdGlvbikpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb25lLkludGVydmFsVGltZWxpbmU6IGV2ZW50cyBtdXN0IGhhdmUgdGltZSBhbmQgZHVyYXRpb24gcGFyYW1ldGVycycpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBldmVudC50aW1lID0gZXZlbnQudGltZS52YWx1ZU9mKCk7XG5cdCAgICAgICAgdmFyIG5vZGUgPSBuZXcgSW50ZXJ2YWxOb2RlKGV2ZW50LnRpbWUsIGV2ZW50LnRpbWUgKyBldmVudC5kdXJhdGlvbiwgZXZlbnQpO1xuXHQgICAgICAgIGlmICh0aGlzLl9yb290ID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBub2RlO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Jvb3QuaW5zZXJ0KG5vZGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9sZW5ndGgrKztcblx0ICAgICAgICAvLyBSZXN0cnVjdHVyZSB0cmVlIHRvIGJlIGJhbGFuY2VkXG5cdCAgICAgICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgbm9kZS51cGRhdGVIZWlnaHQoKTtcblx0ICAgICAgICAgICAgbm9kZS51cGRhdGVNYXgoKTtcblx0ICAgICAgICAgICAgdGhpcy5fcmViYWxhbmNlKG5vZGUpO1xuXHQgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZW1vdmUgYW4gZXZlbnQgZnJvbSB0aGUgdGltZWxpbmUuXG5cdFx0ICogIEBwYXJhbSAge09iamVjdH0gIGV2ZW50ICBUaGUgZXZlbnQgdG8gcmVtb3ZlIGZyb20gdGhlIHRpbWVsaW5lXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkludGVydmFsVGltZWxpbmV9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgIGlmICh0aGlzLl9yb290ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107XG5cdCAgICAgICAgICAgIHRoaXMuX3Jvb3Quc2VhcmNoKGV2ZW50LnRpbWUsIHJlc3VsdHMpO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBub2RlID0gcmVzdWx0c1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChub2RlLmV2ZW50ID09PSBldmVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZU5vZGUobm9kZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGVuZ3RoLS07XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRpbWVsaW5lLlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5JbnRlcnZhbFRpbWVsaW5lI1xuXHRcdCAqICBAbmFtZSBsZW5ndGhcblx0XHQgKiAgQHJlYWRPbmx5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZSwgJ2xlbmd0aCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xlbmd0aDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZW1vdmUgZXZlbnRzIHdob3NlIHRpbWUgdGltZSBpcyBhZnRlciB0aGUgZ2l2ZW4gdGltZVxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lICBUaGUgdGltZSB0byBxdWVyeS5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuSW50ZXJ2YWxUaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoYWZ0ZXIpIHtcblx0ICAgICAgICB0aGlzLmZvckVhY2hGcm9tKGFmdGVyLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy5yZW1vdmUoZXZlbnQpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNldCB0aGUgcm9vdCBub2RlIGFzIHRoZSBnaXZlbiBub2RlXG5cdFx0ICogIEBwYXJhbSB7SW50ZXJ2YWxOb2RlfSBub2RlXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkludGVydmFsVGltZWxpbmUucHJvdG90eXBlLl9zZXRSb290ID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICB0aGlzLl9yb290ID0gbm9kZTtcblx0ICAgICAgICBpZiAodGhpcy5fcm9vdCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9yb290LnBhcmVudCA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXBsYWNlIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBub2RlIGluIHRoZSBub2RlJ3MgcGFyZW50XG5cdFx0ICogIHdpdGggdGhlIHJlcGxhY2VtZW50IG5vZGUuXG5cdFx0ICogIEBwYXJhbSAge0ludGVydmFsTm9kZX0gIG5vZGVcblx0XHQgKiAgQHBhcmFtICB7SW50ZXJ2YWxOb2RlfSAgcmVwbGFjZW1lbnRcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuX3JlcGxhY2VOb2RlSW5QYXJlbnQgPSBmdW5jdGlvbiAobm9kZSwgcmVwbGFjZW1lbnQpIHtcblx0ICAgICAgICBpZiAobm9kZS5wYXJlbnQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgaWYgKG5vZGUuaXNMZWZ0Q2hpbGQoKSkge1xuXHQgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQubGVmdCA9IHJlcGxhY2VtZW50O1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQucmlnaHQgPSByZXBsYWNlbWVudDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLl9yZWJhbGFuY2Uobm9kZS5wYXJlbnQpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NldFJvb3QocmVwbGFjZW1lbnQpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIHRyZWUgYW5kIHJlcGxhY2UgaXQgd2l0aFxuXHRcdCAqICBhIHN1Y2Nlc3NvciB3aGljaCBmb2xsb3dzIHRoZSBzY2hlbWEuXG5cdFx0ICogIEBwYXJhbSAge0ludGVydmFsTm9kZX0gIG5vZGVcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuX3JlbW92ZU5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuXHQgICAgICAgIGlmIChub2RlLmxlZnQgPT09IG51bGwgJiYgbm9kZS5yaWdodCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9yZXBsYWNlTm9kZUluUGFyZW50KG5vZGUsIG51bGwpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAobm9kZS5yaWdodCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9yZXBsYWNlTm9kZUluUGFyZW50KG5vZGUsIG5vZGUubGVmdCk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChub2RlLmxlZnQgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcmVwbGFjZU5vZGVJblBhcmVudChub2RlLCBub2RlLnJpZ2h0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgYmFsYW5jZSA9IG5vZGUuZ2V0QmFsYW5jZSgpO1xuXHQgICAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQsIHRlbXA7XG5cdCAgICAgICAgICAgIGlmIChiYWxhbmNlID4gMCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdC5yaWdodCA9PT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gbm9kZS5sZWZ0O1xuXHQgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LnJpZ2h0ID0gbm9kZS5yaWdodDtcblx0ICAgICAgICAgICAgICAgICAgICB0ZW1wID0gcmVwbGFjZW1lbnQ7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gbm9kZS5sZWZ0LnJpZ2h0O1xuXHQgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXBsYWNlbWVudC5yaWdodCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnJpZ2h0O1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5wYXJlbnQucmlnaHQgPSByZXBsYWNlbWVudC5sZWZ0O1xuXHQgICAgICAgICAgICAgICAgICAgIHRlbXAgPSByZXBsYWNlbWVudC5wYXJlbnQ7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQubGVmdCA9IG5vZGUubGVmdDtcblx0ICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5yaWdodCA9IG5vZGUucmlnaHQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5yaWdodC5sZWZ0ID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IG5vZGUucmlnaHQ7XG5cdCAgICAgICAgICAgICAgICByZXBsYWNlbWVudC5sZWZ0ID0gbm9kZS5sZWZ0O1xuXHQgICAgICAgICAgICAgICAgdGVtcCA9IHJlcGxhY2VtZW50O1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBub2RlLnJpZ2h0LmxlZnQ7XG5cdCAgICAgICAgICAgICAgICB3aGlsZSAocmVwbGFjZW1lbnQubGVmdCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQubGVmdDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LnBhcmVudCA9IHJlcGxhY2VtZW50LnBhcmVudDtcblx0ICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LnBhcmVudC5sZWZ0ID0gcmVwbGFjZW1lbnQucmlnaHQ7XG5cdCAgICAgICAgICAgICAgICB0ZW1wID0gcmVwbGFjZW1lbnQucGFyZW50O1xuXHQgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQubGVmdCA9IG5vZGUubGVmdDtcblx0ICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LnJpZ2h0ID0gbm9kZS5yaWdodDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChub2RlLmlzTGVmdENoaWxkKCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5sZWZ0ID0gcmVwbGFjZW1lbnQ7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LnJpZ2h0ID0gcmVwbGFjZW1lbnQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9zZXRSb290KHJlcGxhY2VtZW50KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyB0aGlzLl9yZXBsYWNlTm9kZUluUGFyZW50KG5vZGUsIHJlcGxhY2VtZW50KTtcblx0ICAgICAgICAgICAgdGhpcy5fcmViYWxhbmNlKHRlbXApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBub2RlLmRpc3Bvc2UoKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUm90YXRlIHRoZSB0cmVlIHRvIHRoZSBsZWZ0XG5cdFx0ICogIEBwYXJhbSAge0ludGVydmFsTm9kZX0gIG5vZGVcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuX3JvdGF0ZUxlZnQgPSBmdW5jdGlvbiAobm9kZSkge1xuXHQgICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudDtcblx0ICAgICAgICB2YXIgaXNMZWZ0Q2hpbGQgPSBub2RlLmlzTGVmdENoaWxkKCk7XG5cdCAgICAgICAgLy8gTWFrZSBub2RlLnJpZ2h0IHRoZSBuZXcgcm9vdCBvZiB0aGlzIHN1YiB0cmVlIChpbnN0ZWFkIG9mIG5vZGUpXG5cdCAgICAgICAgdmFyIHBpdm90Tm9kZSA9IG5vZGUucmlnaHQ7XG5cdCAgICAgICAgbm9kZS5yaWdodCA9IHBpdm90Tm9kZS5sZWZ0O1xuXHQgICAgICAgIHBpdm90Tm9kZS5sZWZ0ID0gbm9kZTtcblx0ICAgICAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIGlmIChpc0xlZnRDaGlsZCkge1xuXHQgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSBwaXZvdE5vZGU7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSBwaXZvdE5vZGU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLl9zZXRSb290KHBpdm90Tm9kZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSb3RhdGUgdGhlIHRyZWUgdG8gdGhlIHJpZ2h0XG5cdFx0ICogIEBwYXJhbSAge0ludGVydmFsTm9kZX0gIG5vZGVcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuX3JvdGF0ZVJpZ2h0ID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cdCAgICAgICAgdmFyIGlzTGVmdENoaWxkID0gbm9kZS5pc0xlZnRDaGlsZCgpO1xuXHQgICAgICAgIC8vIE1ha2Ugbm9kZS5sZWZ0IHRoZSBuZXcgcm9vdCBvZiB0aGlzIHN1YiB0cmVlIChpbnN0ZWFkIG9mIG5vZGUpXG5cdCAgICAgICAgdmFyIHBpdm90Tm9kZSA9IG5vZGUubGVmdDtcblx0ICAgICAgICBub2RlLmxlZnQgPSBwaXZvdE5vZGUucmlnaHQ7XG5cdCAgICAgICAgcGl2b3ROb2RlLnJpZ2h0ID0gbm9kZTtcblx0ICAgICAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIGlmIChpc0xlZnRDaGlsZCkge1xuXHQgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSBwaXZvdE5vZGU7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSBwaXZvdE5vZGU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLl9zZXRSb290KHBpdm90Tm9kZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBCYWxhbmNlIHRoZSBCU1Rcblx0XHQgKiAgQHBhcmFtICB7SW50ZXJ2YWxOb2RlfSAgbm9kZVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5fcmViYWxhbmNlID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICB2YXIgYmFsYW5jZSA9IG5vZGUuZ2V0QmFsYW5jZSgpO1xuXHQgICAgICAgIGlmIChiYWxhbmNlID4gMSkge1xuXHQgICAgICAgICAgICBpZiAobm9kZS5sZWZ0LmdldEJhbGFuY2UoKSA8IDApIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3JvdGF0ZUxlZnQobm9kZS5sZWZ0KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3JvdGF0ZVJpZ2h0KG5vZGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIGlmIChiYWxhbmNlIDwgLTEpIHtcblx0ICAgICAgICAgICAgaWYgKG5vZGUucmlnaHQuZ2V0QmFsYW5jZSgpID4gMCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fcm90YXRlUmlnaHQobm9kZS5yaWdodCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9yb3RhdGVMZWZ0KG5vZGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBHZXQgYW4gZXZlbnQgd2hvc2UgdGltZSBhbmQgZHVyYXRpb24gc3BhbiB0aGUgZ2l2ZSB0aW1lLiBXaWxsXG5cdFx0ICogIHJldHVybiB0aGUgbWF0Y2ggd2hvc2UgXCJ0aW1lXCIgdmFsdWUgaXMgY2xvc2VzdCB0byB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7T2JqZWN0fSAgZXZlbnQgIFRoZSBldmVudCB0byBhZGQgdG8gdGhlIHRpbWVsaW5lXG5cdFx0ICogIEByZXR1cm4gIHtPYmplY3R9ICBUaGUgZXZlbnQgd2hpY2ggc3BhbnMgdGhlIGRlc2lyZWQgdGltZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIGlmICh0aGlzLl9yb290ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107XG5cdCAgICAgICAgICAgIHRoaXMuX3Jvb3Quc2VhcmNoKHRpbWUsIHJlc3VsdHMpO1xuXHQgICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbWF4ID0gcmVzdWx0c1swXTtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzW2ldLmxvdyA+IG1heC5sb3cpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gcmVzdWx0c1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gbWF4LmV2ZW50O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJdGVyYXRlIG92ZXIgZXZlcnl0aGluZyBpbiB0aGUgdGltZWxpbmUuXG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIGV2ZXJ5IGl0ZW1cblx0XHQgKiAgQHJldHVybnMge1RvbmUuSW50ZXJ2YWxUaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX3Jvb3QgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdmFyIGFsbE5vZGVzID0gW107XG5cdCAgICAgICAgICAgIHRoaXMuX3Jvb3QudHJhdmVyc2UoZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICAgICAgICAgIGFsbE5vZGVzLnB1c2gobm9kZSk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZXYgPSBhbGxOb2Rlc1tpXS5ldmVudDtcblx0ICAgICAgICAgICAgICAgIGlmIChldikge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgSXRlcmF0ZSBvdmVyIGV2ZXJ5dGhpbmcgaW4gdGhlIGFycmF5IGluIHdoaWNoIHRoZSBnaXZlbiB0aW1lXG5cdFx0ICogIG92ZXJsYXBzIHdpdGggdGhlIHRpbWUgYW5kIGR1cmF0aW9uIHRpbWUgb2YgdGhlIGV2ZW50LlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lIFRoZSB0aW1lIHRvIGNoZWNrIGlmIGl0ZW1zIGFyZSBvdmVybGFwcGluZ1xuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2l0aCBldmVyeSBpdGVtXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkludGVydmFsVGltZWxpbmV9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuSW50ZXJ2YWxUaW1lbGluZS5wcm90b3R5cGUuZm9yRWFjaEF0VGltZSA9IGZ1bmN0aW9uICh0aW1lLCBjYWxsYmFjaykge1xuXHQgICAgICAgIGlmICh0aGlzLl9yb290ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107XG5cdCAgICAgICAgICAgIHRoaXMuX3Jvb3Quc2VhcmNoKHRpbWUsIHJlc3VsdHMpO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHQgICAgICAgICAgICAgICAgdmFyIGV2ID0gcmVzdWx0c1tpXS5ldmVudDtcblx0ICAgICAgICAgICAgICAgIGlmIChldikge1xuXHQgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgSXRlcmF0ZSBvdmVyIGV2ZXJ5dGhpbmcgaW4gdGhlIGFycmF5IGluIHdoaWNoIHRoZSB0aW1lIGlzIGdyZWF0ZXJcblx0XHQgKiAgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgdGltZSBUaGUgdGltZSB0byBjaGVjayBpZiBpdGVtcyBhcmUgYmVmb3JlXG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIGV2ZXJ5IGl0ZW1cblx0XHQgKiAgQHJldHVybnMge1RvbmUuSW50ZXJ2YWxUaW1lbGluZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5mb3JFYWNoRnJvbSA9IGZ1bmN0aW9uICh0aW1lLCBjYWxsYmFjaykge1xuXHQgICAgICAgIGlmICh0aGlzLl9yb290ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107XG5cdCAgICAgICAgICAgIHRoaXMuX3Jvb3Quc2VhcmNoQWZ0ZXIodGltZSwgcmVzdWx0cyk7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZXYgPSByZXN1bHRzW2ldLmV2ZW50O1xuXHQgICAgICAgICAgICAgICAgY2FsbGJhY2soZXYpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5JbnRlcnZhbFRpbWVsaW5lfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnRlcnZhbFRpbWVsaW5lLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBhbGxOb2RlcyA9IFtdO1xuXHQgICAgICAgIGlmICh0aGlzLl9yb290ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Jvb3QudHJhdmVyc2UoZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICAgICAgICAgIGFsbE5vZGVzLnB1c2gobm9kZSk7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbE5vZGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGFsbE5vZGVzW2ldLmRpc3Bvc2UoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYWxsTm9kZXMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdElOVEVSVkFMIE5PREUgSEVMUEVSXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8qKlxuXHRcdCAqICBSZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgYmluYXJ5IHNlYXJjaCB0cmVlLCB3aXRoIHRoZSBhZGRpdGlvblxuXHRcdCAqICBvZiBhIFwiaGlnaFwiIHZhbHVlIHdoaWNoIGtlZXBzIHRyYWNrIG9mIHRoZSBoaWdoZXN0IHZhbHVlIG9mXG5cdFx0ICogIGl0cyBjaGlsZHJlbi5cblx0XHQgKiAgUmVmZXJlbmNlczpcblx0XHQgKiAgaHR0cHM6Ly9icm9va25vdmFrLndvcmRwcmVzcy5jb20vMjAxMy8xMi8wNy9hdWdtZW50ZWQtaW50ZXJ2YWwtdHJlZS1pbi1jL1xuXHRcdCAqICBodHRwOi8vd3d3Lm1pZi52dS5sdC9+dmFsZGFzL0FMR09SSVRNQUkvTElURVJBVFVSQS9Db3JtZW4vQ29ybWVuLnBkZlxuXHRcdCAqICBAcGFyYW0ge051bWJlcn0gbG93XG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBoaWdoXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICB2YXIgSW50ZXJ2YWxOb2RlID0gZnVuY3Rpb24gKGxvdywgaGlnaCwgZXZlbnQpIHtcblx0ICAgICAgICAvL3RoZSBldmVudCBjb250YWluZXJcblx0ICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7XG5cdCAgICAgICAgLy90aGUgbG93IHZhbHVlXG5cdCAgICAgICAgdGhpcy5sb3cgPSBsb3c7XG5cdCAgICAgICAgLy90aGUgaGlnaCB2YWx1ZVxuXHQgICAgICAgIHRoaXMuaGlnaCA9IGhpZ2g7XG5cdCAgICAgICAgLy90aGUgaGlnaCB2YWx1ZSBmb3IgdGhpcyBhbmQgYWxsIGNoaWxkIG5vZGVzXG5cdCAgICAgICAgdGhpcy5tYXggPSB0aGlzLmhpZ2g7XG5cdCAgICAgICAgLy90aGUgbm9kZXMgdG8gdGhlIGxlZnRcblx0ICAgICAgICB0aGlzLl9sZWZ0ID0gbnVsbDtcblx0ICAgICAgICAvL3RoZSBub2RlcyB0byB0aGUgcmlnaHRcblx0ICAgICAgICB0aGlzLl9yaWdodCA9IG51bGw7XG5cdCAgICAgICAgLy90aGUgcGFyZW50IG5vZGVcblx0ICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XG5cdCAgICAgICAgLy90aGUgbnVtYmVyIG9mIGNoaWxkIG5vZGVzXG5cdCAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJbnNlcnQgYSBub2RlIGludG8gdGhlIGNvcnJlY3Qgc3BvdCBpbiB0aGUgdHJlZVxuXHRcdCAqICBAcGFyYW0gIHtJbnRlcnZhbE5vZGV9ICBub2RlXG5cdFx0ICovXG5cdCAgICBJbnRlcnZhbE5vZGUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgaWYgKG5vZGUubG93IDw9IHRoaXMubG93KSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgPT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubGVmdCA9IG5vZGU7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmxlZnQuaW5zZXJ0KG5vZGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJpZ2h0ID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMucmlnaHQgPSBub2RlO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMucmlnaHQuaW5zZXJ0KG5vZGUpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2VhcmNoIHRoZSB0cmVlIGZvciBub2RlcyB3aGljaCBvdmVybGFwXG5cdFx0ICogIHdpdGggdGhlIGdpdmVuIHBvaW50XG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHBvaW50ICBUaGUgcG9pbnQgdG8gcXVlcnlcblx0XHQgKiAgQHBhcmFtICB7QXJyYXl9ICByZXN1bHRzICBUaGUgYXJyYXkgdG8gcHV0IHRoZSByZXN1bHRzXG5cdFx0ICovXG5cdCAgICBJbnRlcnZhbE5vZGUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChwb2ludCwgcmVzdWx0cykge1xuXHQgICAgICAgIC8vIElmIHAgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSByaWdodG1vc3QgcG9pbnQgb2YgYW55IGludGVydmFsXG5cdCAgICAgICAgLy8gaW4gdGhpcyBub2RlIGFuZCBhbGwgY2hpbGRyZW4sIHRoZXJlIHdvbid0IGJlIGFueSBtYXRjaGVzLlxuXHQgICAgICAgIGlmIChwb2ludCA+IHRoaXMubWF4KSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gU2VhcmNoIGxlZnQgY2hpbGRyZW5cblx0ICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMubGVmdC5zZWFyY2gocG9pbnQsIHJlc3VsdHMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBDaGVjayB0aGlzIG5vZGVcblx0ICAgICAgICBpZiAodGhpcy5sb3cgPD0gcG9pbnQgJiYgdGhpcy5oaWdoID4gcG9pbnQpIHtcblx0ICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBJZiBwIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSB0aW1lIG9mIHRoaXMgaW50ZXJ2YWwsXG5cdCAgICAgICAgLy8gdGhlbiBpdCBjYW4ndCBiZSBpbiBhbnkgY2hpbGQgdG8gdGhlIHJpZ2h0LlxuXHQgICAgICAgIGlmICh0aGlzLmxvdyA+IHBvaW50KSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gU2VhcmNoIHJpZ2h0IGNoaWxkcmVuXG5cdCAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdGhpcy5yaWdodC5zZWFyY2gocG9pbnQsIHJlc3VsdHMpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2VhcmNoIHRoZSB0cmVlIGZvciBub2RlcyB3aGljaCBhcmUgbGVzc1xuXHRcdCAqICB0aGFuIHRoZSBnaXZlbiBwb2ludFxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICBwb2ludCAgVGhlIHBvaW50IHRvIHF1ZXJ5XG5cdFx0ICogIEBwYXJhbSAge0FycmF5fSAgcmVzdWx0cyAgVGhlIGFycmF5IHRvIHB1dCB0aGUgcmVzdWx0c1xuXHRcdCAqL1xuXHQgICAgSW50ZXJ2YWxOb2RlLnByb3RvdHlwZS5zZWFyY2hBZnRlciA9IGZ1bmN0aW9uIChwb2ludCwgcmVzdWx0cykge1xuXHQgICAgICAgIC8vIENoZWNrIHRoaXMgbm9kZVxuXHQgICAgICAgIGlmICh0aGlzLmxvdyA+PSBwb2ludCkge1xuXHQgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcyk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMubGVmdC5zZWFyY2hBZnRlcihwb2ludCwgcmVzdWx0cyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gc2VhcmNoIHRoZSByaWdodCBzaWRlXG5cdCAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdGhpcy5yaWdodC5zZWFyY2hBZnRlcihwb2ludCwgcmVzdWx0cyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoaXMgZWxlbWVudCBhbmQgYm90aCBpdCdzIGJyYW5jaGVzXG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2tcblx0XHQgKi9cblx0ICAgIEludGVydmFsTm9kZS5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0ICAgICAgICBjYWxsYmFjayh0aGlzKTtcblx0ICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMubGVmdC50cmF2ZXJzZShjYWxsYmFjayk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMucmlnaHQudHJhdmVyc2UoY2FsbGJhY2spO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVXBkYXRlIHRoZSBoZWlnaHQgb2YgdGhlIG5vZGVcblx0XHQgKi9cblx0ICAgIEludGVydmFsTm9kZS5wcm90b3R5cGUudXBkYXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IG51bGwgJiYgdGhpcy5yaWdodCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGgubWF4KHRoaXMubGVmdC5oZWlnaHQsIHRoaXMucmlnaHQuaGVpZ2h0KSArIDE7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJpZ2h0ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5yaWdodC5oZWlnaHQgKyAxO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5sZWZ0LmhlaWdodCArIDE7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVXBkYXRlIHRoZSBoZWlnaHQgb2YgdGhlIG5vZGVcblx0XHQgKi9cblx0ICAgIEludGVydmFsTm9kZS5wcm90b3R5cGUudXBkYXRlTWF4ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMubWF4ID0gdGhpcy5oaWdoO1xuXHQgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLm1heCwgdGhpcy5sZWZ0Lm1heCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpcy5tYXgsIHRoaXMucmlnaHQubWF4KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBiYWxhbmNlIGlzIGhvdyB0aGUgbGVhZnMgYXJlIGRpc3RyaWJ1dGVkIG9uIHRoZSBub2RlXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9ICBOZWdhdGl2ZSBudW1iZXJzIGFyZSBiYWxhbmNlZCB0byB0aGUgcmlnaHRcblx0XHQgKi9cblx0ICAgIEludGVydmFsTm9kZS5wcm90b3R5cGUuZ2V0QmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgYmFsYW5jZSA9IDA7XG5cdCAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gbnVsbCAmJiB0aGlzLnJpZ2h0ICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIGJhbGFuY2UgPSB0aGlzLmxlZnQuaGVpZ2h0IC0gdGhpcy5yaWdodC5oZWlnaHQ7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxlZnQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgYmFsYW5jZSA9IHRoaXMubGVmdC5oZWlnaHQgKyAxO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yaWdodCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICBiYWxhbmNlID0gLSh0aGlzLnJpZ2h0LmhlaWdodCArIDEpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gYmFsYW5jZTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBub2RlIGlzIHRoZSBsZWZ0IGNoaWxkXG5cdFx0ICogIG9mIGl0cyBwYXJlbnRcblx0XHQgKi9cblx0ICAgIEludGVydmFsTm9kZS5wcm90b3R5cGUuaXNMZWZ0Q2hpbGQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ICE9PSBudWxsICYmIHRoaXMucGFyZW50LmxlZnQgPT09IHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGdldC9zZXQgdGhlIGxlZnQgbm9kZVxuXHRcdCAqICBAdHlwZSB7SW50ZXJ2YWxOb2RlfVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEludGVydmFsTm9kZS5wcm90b3R5cGUsICdsZWZ0Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGVmdDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbGVmdCA9IG5vZGU7XG5cdCAgICAgICAgICAgIGlmIChub2RlICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHRoaXM7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcblx0ICAgICAgICAgICAgdGhpcy51cGRhdGVNYXgoKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBnZXQvc2V0IHRoZSByaWdodCBub2RlXG5cdFx0ICogIEB0eXBlIHtJbnRlcnZhbE5vZGV9XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSW50ZXJ2YWxOb2RlLnByb3RvdHlwZSwgJ3JpZ2h0Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmlnaHQ7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3JpZ2h0ID0gbm9kZTtcblx0ICAgICAgICAgICAgaWYgKG5vZGUgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgIG5vZGUucGFyZW50ID0gdGhpcztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xuXHQgICAgICAgICAgICB0aGlzLnVwZGF0ZU1heCgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIG51bGwgb3V0IHJlZmVyZW5jZXMuXG5cdFx0ICovXG5cdCAgICBJbnRlcnZhbE5vZGUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2xlZnQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3JpZ2h0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmV2ZW50ID0gbnVsbDtcblx0ICAgIH07XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vXHRFTkQgSU5URVJWQUwgTk9ERSBIRUxQRVJcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgcmV0dXJuIFRvbmUuSW50ZXJ2YWxUaW1lbGluZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLlRpY2tzIGlzIGEgcHJpbWl0aXZlIHR5cGUgZm9yIGVuY29kaW5nIFRpbWUgdmFsdWVzLlxuXHRcdCAqICAgICAgICAgVG9uZS5UaWNrcyBjYW4gYmUgY29uc3RydWN0ZWQgd2l0aCBvciB3aXRob3V0IHRoZSBgbmV3YCBrZXl3b3JkLiBUb25lLlRpY2tzIGNhbiBiZSBwYXNzZWRcblx0XHQgKiAgICAgICAgIGludG8gdGhlIHBhcmFtZXRlciBvZiBhbnkgbWV0aG9kIHdoaWNoIHRha2VzIHRpbWUgYXMgYW4gYXJndW1lbnQuXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5UcmFuc3BvcnRUaW1lfVxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmd8TnVtYmVyfSAgdmFsICAgIFRoZSB0aW1lIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmc9fSAgdW5pdHMgIFRoZSB1bml0cyBvZiB0aGUgdmFsdWUuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIHQgPSBUb25lLlRpY2tzKFwiNG5cIik7Ly9hIHF1YXJ0ZXIgbm90ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrcyA9IGZ1bmN0aW9uICh2YWwsIHVuaXRzKSB7XG5cdCAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBUb25lLlRpY2tzKSB7XG5cdCAgICAgICAgICAgIFRvbmUuVHJhbnNwb3J0VGltZS5jYWxsKHRoaXMsIHZhbCwgdW5pdHMpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgVG9uZS5UaWNrcyh2YWwsIHVuaXRzKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5UaWNrcywgVG9uZS5UcmFuc3BvcnRUaW1lKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdCB1bml0cyBpZiBub25lIGFyZSBnaXZlbi5cblx0XHQgKiAgQHR5cGUge1N0cmluZ31cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja3MucHJvdG90eXBlLl9kZWZhdWx0VW5pdHMgPSAnaSc7XG5cdCAgICAvKipcblx0XHQgKiBHZXQgdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgZ2l2ZW4gdW5pdHNcblx0XHQgKiBAcmV0dXJuIHtUaWNrc31cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrcy5wcm90b3R5cGUuX25vdyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5UcmFuc3BvcnQudGlja3M7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGJlYXRzIGluIHRoZSBjdXJyZW50IHVuaXRzXG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBiZWF0c1xuXHRcdCAqICBAcmV0dXJuICB7TnVtYmVyfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UaWNrcy5wcm90b3R5cGUuX2JlYXRzVG9Vbml0cyA9IGZ1bmN0aW9uIChiZWF0cykge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9nZXRQUFEoKSAqIGJlYXRzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHNlY29uZCBpbiB0aGUgY3VycmVudCB1bml0c1xuXHRcdCAqICBAcGFyYW0ge1NlY29uZHN9IHNlY29uZHNcblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja3MucHJvdG90eXBlLl9zZWNvbmRzVG9Vbml0cyA9IGZ1bmN0aW9uIChzZWNvbmRzKSB7XG5cdCAgICAgICAgcmV0dXJuIHNlY29uZHMgLyAoNjAgLyB0aGlzLl9nZXRCcG0oKSkgKiB0aGlzLl9nZXRQUFEoKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgdmFsdWUgb2YgYSB0aWNrIGluIHRoZSBjdXJyZW50IHRpbWUgdW5pdHNcblx0XHQgKiAgQHBhcmFtIHtUaWNrc30gdGlja3Ncblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja3MucHJvdG90eXBlLl90aWNrc1RvVW5pdHMgPSBmdW5jdGlvbiAodGlja3MpIHtcblx0ICAgICAgICByZXR1cm4gdGlja3M7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgdGltZSBpbiB0aWNrc1xuXHRcdCAqICBAcmV0dXJuICB7VGlja3N9XG5cdFx0ICovXG5cdCAgICBUb25lLlRpY2tzLnByb3RvdHlwZS50b1RpY2tzID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIHRoZSB0aW1lIGluIHRpY2tzXG5cdFx0ICogIEByZXR1cm4gIHtUaWNrc31cblx0XHQgKi9cblx0ICAgIFRvbmUuVGlja3MucHJvdG90eXBlLnRvU2Vjb25kcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgLyB0aGlzLl9nZXRQUFEoKSAqICg2MCAvIHRoaXMuX2dldEJwbSgpKTtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5UaWNrcztcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLlRyYW5zcG9ydEV2ZW50IGlzIGFuIGludGVybmFsIGNsYXNzIHVzZWQgYnkgKFRvbmUuVHJhbnNwb3J0KVtUcmFuc3BvcnRdXG5cdFx0ICogICAgICAgICB0byBzY2hlZHVsZSBldmVudHMuIERvIG5vIGludm9rZSB0aGlzIGNsYXNzIGRpcmVjdGx5LCBpdCBpc1xuXHRcdCAqICAgICAgICAgaGFuZGxlZCBmcm9tIHdpdGhpbiBUb25lLlRyYW5zcG9ydC5cblx0XHQgKiAgQGV4dGVuZHMge1RvbmV9XG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydEV2ZW50ID0gZnVuY3Rpb24gKFRyYW5zcG9ydCwgb3B0aW9ucykge1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5UcmFuc3BvcnRFdmVudC5kZWZhdWx0cyk7XG5cdCAgICAgICAgVG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBUcmFuc3BvcnQgdGhhdCBjcmVhdGVkIGl0XG5cdFx0XHQgKiBAdHlwZSB7VG9uZS5UcmFuc3BvcnR9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLlRyYW5zcG9ydCA9IFRyYW5zcG9ydDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSB1bmlxdWUgaWQgb2YgdGhlIGV2ZW50XG5cdFx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5pZCA9IFRvbmUuVHJhbnNwb3J0RXZlbnQuX2V2ZW50SWQrKztcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSB0aW1lIHRoZSBldmVudCBzdGFydHNcblx0XHRcdCAqIEB0eXBlIHtUaWNrc31cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMudGltZSA9IFRvbmUuVGlja3Mob3B0aW9ucy50aW1lKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBjYWxsYmFjayB0byBpbnZva2Vcblx0XHRcdCAqIEB0eXBlIHtGdW5jdGlvbn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogSWYgdGhlIGV2ZW50IHNob3VsZCBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIGNyZWF0ZWQuXG5cdFx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vbmNlID0gb3B0aW9ucy5vbmNlO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuVHJhbnNwb3J0RXZlbnQpO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGRlZmF1bHRzXG5cdFx0ICogQHN0YXRpY1xuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydEV2ZW50LmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdvbmNlJzogZmFsc2UsXG5cdCAgICAgICAgJ2NhbGxiYWNrJzogVG9uZS5ub09wXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogQ3VycmVudCBJRCBjb3VudGVyXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAc3RhdGljXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0RXZlbnQuX2V2ZW50SWQgPSAwO1xuXHQgICAgLyoqXG5cdFx0ICogSW52b2tlIHRoZSBldmVudCBjYWxsYmFjay5cblx0XHQgKiBAcGFyYW0gIHtUaW1lfSB0aW1lICBUaGUgQXVkaW9Db250ZXh0IHRpbWUgaW4gc2Vjb25kcyBvZiB0aGUgZXZlbnRcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0RXZlbnQucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2spIHtcblx0ICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aW1lKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX29uY2UgJiYgdGhpcy5UcmFuc3BvcnQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuaWQpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIENsZWFuIHVwXG5cdFx0ICogQHJldHVybiB7VG9uZS5UcmFuc3BvcnRFdmVudH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnRFdmVudC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5UcmFuc3BvcnQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsO1xuXHQgICAgICAgIHRoaXMudGltZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuVHJhbnNwb3J0RXZlbnQ7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5UcmFuc3BvcnRSZXBlYXRFdmVudCBpcyBhbiBpbnRlcm5hbCBjbGFzcyB1c2VkIGJ5IFRvbmUuVHJhbnNwb3J0XG5cdFx0ICogICAgICAgICB0byBzY2hlZHVsZSByZXBlYXQgZXZlbnRzLiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5UcmFuc3BvcnRFdmVudH1cblx0XHQgKiAgQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0UmVwZWF0RXZlbnQgPSBmdW5jdGlvbiAoVHJhbnNwb3J0LCBvcHRpb25zKSB7XG5cdCAgICAgICAgVG9uZS5UcmFuc3BvcnRFdmVudC5jYWxsKHRoaXMsIFRyYW5zcG9ydCwgb3B0aW9ucyk7XG5cdCAgICAgICAgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdEFyZyhvcHRpb25zLCBUb25lLlRyYW5zcG9ydFJlcGVhdEV2ZW50LmRlZmF1bHRzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFdoZW4gdGhlIGV2ZW50IHNob3VsZCBzdG9wIHJlcGVhdGluZ1xuXHRcdFx0ICogQHR5cGUge1RpY2tzfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZHVyYXRpb24gPSBUb25lLlRpY2tzKG9wdGlvbnMuZHVyYXRpb24pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIGludGVydmFsIG9mIHRoZSByZXBlYXRlZCBldmVudFxuXHRcdFx0ICogQHR5cGUge1RpY2tzfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2ludGVydmFsID0gVG9uZS5UaWNrcyhvcHRpb25zLmludGVydmFsKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBJRCBvZiB0aGUgY3VycmVudCB0aW1lbGluZSBldmVudFxuXHRcdFx0ICogQHR5cGUge051bWJlcn1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9jdXJyZW50SWQgPSAtMTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBJRCBvZiB0aGUgbmV4dCB0aW1lbGluZSBldmVudFxuXHRcdFx0ICogQHR5cGUge051bWJlcn1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9uZXh0SWQgPSAtMTtcblx0ICAgICAgICAvKipcblx0XHRcdCAgKiBUaGUgdGltZSBvZiB0aGUgbmV4dCBldmVudFxuXHRcdFx0ICAqIEB0eXBlIHtUaWNrc31cblx0XHRcdCAgKiBAcHJpdmF0ZVxuXHRcdFx0ICAqL1xuXHQgICAgICAgIHRoaXMuX25leHRUaWNrID0gdGhpcy50aW1lO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogYSByZWZlcmVuY2UgdG8gdGhlIGJvdW5kIHN0YXJ0IG1ldGhvZFxuXHRcdFx0ICogQHR5cGUge0Z1bmN0aW9ufVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2JvdW5kUmVzdGFydCA9IHRoaXMuX3Jlc3RhcnQuYmluZCh0aGlzKTtcblx0ICAgICAgICB0aGlzLlRyYW5zcG9ydC5vbignc3RhcnQgbG9vcFN0YXJ0JywgdGhpcy5fYm91bmRSZXN0YXJ0KTtcblx0ICAgICAgICB0aGlzLl9yZXN0YXJ0KCk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5UcmFuc3BvcnRSZXBlYXRFdmVudCwgVG9uZS5UcmFuc3BvcnRFdmVudCk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgZGVmYXVsdHNcblx0XHQgKiBAc3RhdGljXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0UmVwZWF0RXZlbnQuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2R1cmF0aW9uJzogSW5maW5pdHksXG5cdCAgICAgICAgJ2ludGVydmFsJzogMVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIEludm9rZSB0aGUgY2FsbGJhY2suIFJldHVybnMgdGhlIHRpY2sgdGltZSB3aGljaFxuXHRcdCAqIHRoZSBuZXh0IGV2ZW50IHNob3VsZCBiZSBzY2hlZHVsZWQgYXQuXG5cdFx0ICogQHBhcmFtICB7TnVtYmVyfSB0aW1lICBUaGUgQXVkaW9Db250ZXh0IHRpbWUgaW4gc2Vjb25kcyBvZiB0aGUgZXZlbnRcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0UmVwZWF0RXZlbnQucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgLy9jcmVhdGUgbW9yZSBldmVudHMgaWYgbmVjZXNzYXJ5XG5cdCAgICAgICAgdGhpcy5fY3JlYXRlRXZlbnRzKHRpbWUpO1xuXHQgICAgICAgIC8vY2FsbCB0aGUgc3VwZXIgY2xhc3Ncblx0ICAgICAgICBUb25lLlRyYW5zcG9ydEV2ZW50LnByb3RvdHlwZS5pbnZva2UuY2FsbCh0aGlzLCB0aW1lKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBQdXNoIG1vcmUgZXZlbnRzIG9udG8gdGhlIHRpbWVsaW5lIHRvIGtlZXAgdXAgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIHRpbWVsaW5lXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0UmVwZWF0RXZlbnQucHJvdG90eXBlLl9jcmVhdGVFdmVudHMgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIC8vIHNjaGVkdWxlIHRoZSBuZXh0IGV2ZW50XG5cdCAgICAgICAgdmFyIHRpY2tzID0gdGhpcy5UcmFuc3BvcnQuZ2V0VGlja3NBdFRpbWUodGltZSk7XG5cdCAgICAgICAgaWYgKHRpY2tzID49IHRoaXMudGltZSAmJiB0aWNrcyA+PSB0aGlzLl9uZXh0VGljayAmJiB0aGlzLl9uZXh0VGljayArIHRoaXMuX2ludGVydmFsIDwgdGhpcy50aW1lICsgdGhpcy5kdXJhdGlvbikge1xuXHQgICAgICAgICAgICB0aGlzLl9uZXh0VGljayArPSB0aGlzLl9pbnRlcnZhbDtcblx0ICAgICAgICAgICAgdGhpcy5fY3VycmVudElkID0gdGhpcy5fbmV4dElkO1xuXHQgICAgICAgICAgICB0aGlzLl9uZXh0SWQgPSB0aGlzLlRyYW5zcG9ydC5zY2hlZHVsZU9uY2UodGhpcy5pbnZva2UuYmluZCh0aGlzKSwgVG9uZS5UaWNrcyh0aGlzLl9uZXh0VGljaykpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBQdXNoIG1vcmUgZXZlbnRzIG9udG8gdGhlIHRpbWVsaW5lIHRvIGtlZXAgdXAgd2l0aCB0aGUgcG9zaXRpb24gb2YgdGhlIHRpbWVsaW5lXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0UmVwZWF0RXZlbnQucHJvdG90eXBlLl9yZXN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLlRyYW5zcG9ydC5jbGVhcih0aGlzLl9jdXJyZW50SWQpO1xuXHQgICAgICAgIHRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuX25leHRJZCk7XG5cdCAgICAgICAgdGhpcy5fbmV4dFRpY2sgPSB0aGlzLnRpbWU7XG5cdCAgICAgICAgdmFyIHRpY2tzID0gdGhpcy5UcmFuc3BvcnQuZ2V0VGlja3NBdFRpbWUodGltZSk7XG5cdCAgICAgICAgaWYgKHRpY2tzID4gdGhpcy50aW1lKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX25leHRUaWNrID0gdGhpcy50aW1lICsgTWF0aC5jZWlsKCh0aWNrcyAtIHRoaXMudGltZSkgLyB0aGlzLl9pbnRlcnZhbCkgKiB0aGlzLl9pbnRlcnZhbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fY3VycmVudElkID0gdGhpcy5UcmFuc3BvcnQuc2NoZWR1bGVPbmNlKHRoaXMuaW52b2tlLmJpbmQodGhpcyksIFRvbmUuVGlja3ModGhpcy5fbmV4dFRpY2spKTtcblx0ICAgICAgICB0aGlzLl9uZXh0VGljayArPSB0aGlzLl9pbnRlcnZhbDtcblx0ICAgICAgICB0aGlzLl9uZXh0SWQgPSB0aGlzLlRyYW5zcG9ydC5zY2hlZHVsZU9uY2UodGhpcy5pbnZva2UuYmluZCh0aGlzKSwgVG9uZS5UaWNrcyh0aGlzLl9uZXh0VGljaykpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIENsZWFuIHVwXG5cdFx0ICogQHJldHVybiB7VG9uZS5UcmFuc3BvcnRSZXBlYXRFdmVudH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnRSZXBlYXRFdmVudC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLlRyYW5zcG9ydC5jbGVhcih0aGlzLl9jdXJyZW50SWQpO1xuXHQgICAgICAgIHRoaXMuVHJhbnNwb3J0LmNsZWFyKHRoaXMuX25leHRJZCk7XG5cdCAgICAgICAgdGhpcy5UcmFuc3BvcnQub2ZmKCdzdGFydCBsb29wU3RhcnQnLCB0aGlzLl9ib3VuZFJlc3RhcnQpO1xuXHQgICAgICAgIHRoaXMuX2JvdW5kQ3JlYXRlRXZlbnRzID0gbnVsbDtcblx0ICAgICAgICBUb25lLlRyYW5zcG9ydEV2ZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlRyYW5zcG9ydFJlcGVhdEV2ZW50O1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIFRyYW5zcG9ydCBmb3IgdGltaW5nIG11c2ljYWwgZXZlbnRzLlxuXHRcdCAqICAgICAgICAgIFN1cHBvcnRzIHRlbXBvIGN1cnZlcyBhbmQgdGltZSBjaGFuZ2VzLiBVbmxpa2UgYnJvd3Nlci1iYXNlZCB0aW1pbmcgKHNldEludGVydmFsLCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUpXG5cdFx0ICogICAgICAgICAgVG9uZS5UcmFuc3BvcnQgdGltaW5nIGV2ZW50cyBwYXNzIGluIHRoZSBleGFjdCB0aW1lIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnRcblx0XHQgKiAgICAgICAgICBpbiB0aGUgYXJndW1lbnQgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiBQYXNzIHRoYXQgdGltZSB2YWx1ZSB0byB0aGUgb2JqZWN0XG5cdFx0ICogICAgICAgICAgeW91J3JlIHNjaGVkdWxpbmcuIDxicj48YnI+XG5cdFx0ICogICAgICAgICAgQSBzaW5nbGUgdHJhbnNwb3J0IGlzIGNyZWF0ZWQgZm9yIHlvdSB3aGVuIHRoZSBsaWJyYXJ5IGlzIGluaXRpYWxpemVkLlxuXHRcdCAqICAgICAgICAgIDxicj48YnI+XG5cdFx0ICogICAgICAgICAgVGhlIHRyYW5zcG9ydCBlbWl0cyB0aGUgZXZlbnRzOiBcInN0YXJ0XCIsIFwic3RvcFwiLCBcInBhdXNlXCIsIGFuZCBcImxvb3BcIiB3aGljaCBhcmVcblx0XHQgKiAgICAgICAgICBjYWxsZWQgd2l0aCB0aGUgdGltZSBvZiB0aGF0IGV2ZW50IGFzIHRoZSBhcmd1bWVudC5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5FbWl0dGVyfVxuXHRcdCAqICBAc2luZ2xldG9uXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9yZXBlYXRlZCBldmVudCBldmVyeSA4dGggbm90ZVxuXHRcdCAqIFRvbmUuVHJhbnNwb3J0LnNjaGVkdWxlUmVwZWF0KGZ1bmN0aW9uKHRpbWUpe1xuXHRcdCAqIFx0Ly9kbyBzb21ldGhpbmcgd2l0aCB0aGUgdGltZVxuXHRcdCAqIH0sIFwiOG5cIik7XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9zY2hlZHVsZSBhbiBldmVudCBvbiB0aGUgMTZ0aCBtZWFzdXJlXG5cdFx0ICogVG9uZS5UcmFuc3BvcnQuc2NoZWR1bGUoZnVuY3Rpb24odGltZSl7XG5cdFx0ICogXHQvL2RvIHNvbWV0aGluZyB3aXRoIHRoZSB0aW1lXG5cdFx0ICogfSwgXCIxNjowOjBcIik7XG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkVtaXR0ZXIuY2FsbCh0aGlzKTtcblx0ICAgICAgICBUb25lLmdldENvbnRleHQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgICAgICAgICAvL1x0TE9PUElOR1xuXHQgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiBcdElmIHRoZSB0cmFuc3BvcnQgbG9vcHMgb3Igbm90LlxuXHRcdFx0XHQgKiAgQHR5cGUge2Jvb2xlYW59XG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB0aGlzLmxvb3AgPSBmYWxzZTtcblx0ICAgICAgICAgICAgLyoqXG5cdFx0XHRcdCAqIFx0VGhlIGxvb3Agc3RhcnQgcG9zaXRpb24gaW4gdGlja3Ncblx0XHRcdFx0ICogIEB0eXBlIHtUaWNrc31cblx0XHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB0aGlzLl9sb29wU3RhcnQgPSAwO1xuXHQgICAgICAgICAgICAvKipcblx0XHRcdFx0ICogXHRUaGUgbG9vcCBlbmQgcG9zaXRpb24gaW4gdGlja3Ncblx0XHRcdFx0ICogIEB0eXBlIHtUaWNrc31cblx0XHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB0aGlzLl9sb29wRW5kID0gMDtcblx0ICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgICAgICAgICAgLy9cdENMT0NLL1RFTVBPXG5cdCAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgICAgICAgICAgLyoqXG5cdFx0XHRcdCAqICBQdWxzZXMgcGVyIHF1YXJ0ZXIgaXMgdGhlIG51bWJlciBvZiB0aWNrcyBwZXIgcXVhcnRlciBub3RlLlxuXHRcdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdFx0ICogIEB0eXBlICB7TnVtYmVyfVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy5fcHBxID0gVHJhbnNwb3J0Q29uc3RydWN0b3IuZGVmYXVsdHMuUFBRO1xuXHQgICAgICAgICAgICAvKipcblx0XHRcdFx0ICogIHdhdGNoZXMgdGhlIG1haW4gb3NjaWxsYXRvciBmb3IgdGltaW5nIHRpY2tzXG5cdFx0XHRcdCAqICBpbml0aWFsbHkgc3RhcnRzIGF0IDEyMGJwbVxuXHRcdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdFx0ICogIEB0eXBlIHtUb25lLkNsb2NrfVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy5fY2xvY2sgPSBuZXcgVG9uZS5DbG9jayh7XG5cdCAgICAgICAgICAgICAgICAnY2FsbGJhY2snOiB0aGlzLl9wcm9jZXNzVGljay5iaW5kKHRoaXMpLFxuXHQgICAgICAgICAgICAgICAgJ2ZyZXF1ZW5jeSc6IDBcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2JpbmRDbG9ja0V2ZW50cygpO1xuXHQgICAgICAgICAgICAvKipcblx0XHRcdFx0ICogIFRoZSBCZWF0cyBQZXIgTWludXRlIG9mIHRoZSBUcmFuc3BvcnQuXG5cdFx0XHRcdCAqICBAdHlwZSB7QlBNfVxuXHRcdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0XHQgKiAgQGV4YW1wbGVcblx0XHRcdFx0ICogVG9uZS5UcmFuc3BvcnQuYnBtLnZhbHVlID0gODA7XG5cdFx0XHRcdCAqIC8vcmFtcCB0aGUgYnBtIHRvIDEyMCBvdmVyIDEwIHNlY29uZHNcblx0XHRcdFx0ICogVG9uZS5UcmFuc3BvcnQuYnBtLnJhbXBUbygxMjAsIDEwKTtcblx0XHRcdFx0ICovXG5cdCAgICAgICAgICAgIHRoaXMuYnBtID0gdGhpcy5fY2xvY2suZnJlcXVlbmN5O1xuXHQgICAgICAgICAgICB0aGlzLmJwbS5fdG9Vbml0cyA9IHRoaXMuX3RvVW5pdHMuYmluZCh0aGlzKTtcblx0ICAgICAgICAgICAgdGhpcy5icG0uX2Zyb21Vbml0cyA9IHRoaXMuX2Zyb21Vbml0cy5iaW5kKHRoaXMpO1xuXHQgICAgICAgICAgICB0aGlzLmJwbS51bml0cyA9IFRvbmUuVHlwZS5CUE07XG5cdCAgICAgICAgICAgIHRoaXMuYnBtLnZhbHVlID0gVHJhbnNwb3J0Q29uc3RydWN0b3IuZGVmYXVsdHMuYnBtO1xuXHQgICAgICAgICAgICB0aGlzLl9yZWFkT25seSgnYnBtJyk7XG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiAgVGhlIHRpbWUgc2lnbmF0dXJlLCBvciBtb3JlIGFjY3VyYXRlbHkgdGhlIG51bWVyYXRvclxuXHRcdFx0XHQgKiAgb2YgdGhlIHRpbWUgc2lnbmF0dXJlIG92ZXIgYSBkZW5vbWluYXRvciBvZiA0LlxuXHRcdFx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB0aGlzLl90aW1lU2lnbmF0dXJlID0gVHJhbnNwb3J0Q29uc3RydWN0b3IuZGVmYXVsdHMudGltZVNpZ25hdHVyZTtcblx0ICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgICAgICAgICAgLy9cdFRJTUVMSU5FIEVWRU5UU1xuXHQgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiAgQWxsIHRoZSBldmVudHMgaW4gYW4gb2JqZWN0IHRvIGtlZXAgdHJhY2sgYnkgSURcblx0XHRcdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVkRXZlbnRzID0ge307XG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiBcdFRoZSBzY2hlZHVsZWQgZXZlbnRzLlxuXHRcdFx0XHQgKiAgQHR5cGUge1RvbmUuVGltZWxpbmV9XG5cdFx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy5fdGltZWxpbmUgPSBuZXcgVG9uZS5UaW1lbGluZSgpO1xuXHQgICAgICAgICAgICAvKipcblx0XHRcdFx0ICogIFJlcGVhdGVkIGV2ZW50c1xuXHRcdFx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdFx0ICovXG5cdCAgICAgICAgICAgIHRoaXMuX3JlcGVhdGVkRXZlbnRzID0gbmV3IFRvbmUuSW50ZXJ2YWxUaW1lbGluZSgpO1xuXHQgICAgICAgICAgICAvKipcblx0XHRcdFx0ICogIEFsbCBvZiB0aGUgc3luY2VkIFNpZ25hbHNcblx0XHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHRcdCAqICBAdHlwZSB7QXJyYXl9XG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB0aGlzLl9zeW5jZWRTaWduYWxzID0gW107XG5cdCAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAgICAgICAgIC8vXHRTV0lOR1xuXHQgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiAgVGhlIHN1YmRpdmlzaW9uIG9mIHRoZSBzd2luZ1xuXHRcdFx0XHQgKiAgQHR5cGUgIHtUaWNrc31cblx0XHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB0aGlzLl9zd2luZ1RpY2tzID0gVHJhbnNwb3J0Q29uc3RydWN0b3IuZGVmYXVsdHMuUFBRIC8gMjtcblx0ICAgICAgICAgICAgLy84blxuXHQgICAgICAgICAgICAvKipcblx0XHRcdFx0ICogIFRoZSBzd2luZyBhbW91bnRcblx0XHRcdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB0aGlzLl9zd2luZ0Ftb3VudCA9IDA7XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlRyYW5zcG9ydCwgVG9uZS5FbWl0dGVyKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdHNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdicG0nOiAxMjAsXG5cdCAgICAgICAgJ3N3aW5nJzogMCxcblx0ICAgICAgICAnc3dpbmdTdWJkaXZpc2lvbic6ICc4bicsXG5cdCAgICAgICAgJ3RpbWVTaWduYXR1cmUnOiA0LFxuXHQgICAgICAgICdsb29wU3RhcnQnOiAwLFxuXHQgICAgICAgICdsb29wRW5kJzogJzRtJyxcblx0ICAgICAgICAnUFBRJzogMTkyXG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdFRJQ0tTXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgY2FsbGVkIG9uIGV2ZXJ5IHRpY2tcblx0XHQgKiAgQHBhcmFtICAge251bWJlcn0gdGlja1RpbWUgY2xvY2sgcmVsYXRpdmUgdGljayB0aW1lXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUuX3Byb2Nlc3NUaWNrID0gZnVuY3Rpb24gKHRpY2tUaW1lLCB0aWNrcykge1xuXHQgICAgICAgIC8vaGFuZGxlIHN3aW5nXG5cdCAgICAgICAgaWYgKHRoaXMuX3N3aW5nQW1vdW50ID4gMCAmJiB0aWNrcyAlIHRoaXMuX3BwcSAhPT0gMCAmJiAvL25vdCBvbiBhIGRvd25iZWF0XG5cdCAgICAgICAgICAgIHRpY2tzICUgKHRoaXMuX3N3aW5nVGlja3MgKiAyKSAhPT0gMCkge1xuXHQgICAgICAgICAgICAvL2FkZCBzb21lIHN3aW5nXG5cdCAgICAgICAgICAgIHZhciBwcm9ncmVzcyA9IHRpY2tzICUgKHRoaXMuX3N3aW5nVGlja3MgKiAyKSAvICh0aGlzLl9zd2luZ1RpY2tzICogMik7XG5cdCAgICAgICAgICAgIHZhciBhbW91bnQgPSBNYXRoLnNpbihwcm9ncmVzcyAqIE1hdGguUEkpICogdGhpcy5fc3dpbmdBbW91bnQ7XG5cdCAgICAgICAgICAgIHRpY2tUaW1lICs9IFRvbmUuVGlja3ModGhpcy5fc3dpbmdUaWNrcyAqIDIgLyAzKS50b1NlY29uZHMoKSAqIGFtb3VudDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9kbyB0aGUgbG9vcCB0ZXN0XG5cdCAgICAgICAgaWYgKHRoaXMubG9vcCkge1xuXHQgICAgICAgICAgICBpZiAodGlja3MgPj0gdGhpcy5fbG9vcEVuZCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdsb29wRW5kJywgdGlja1RpbWUpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fY2xvY2suc2V0VGlja3NBdFRpbWUodGhpcy5fbG9vcFN0YXJ0LCB0aWNrVGltZSk7XG5cdCAgICAgICAgICAgICAgICB0aWNrcyA9IHRoaXMuX2xvb3BTdGFydDtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnbG9vcFN0YXJ0JywgdGlja1RpbWUsIHRoaXMuX2Nsb2NrLmdldFNlY29uZHNBdFRpbWUodGlja1RpbWUpKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnbG9vcCcsIHRpY2tUaW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICAvL2ludm9rZSB0aGUgdGltZWxpbmUgZXZlbnRzIHNjaGVkdWxlZCBvbiB0aGlzIHRpY2tcblx0ICAgICAgICB0aGlzLl90aW1lbGluZS5mb3JFYWNoQXRUaW1lKHRpY2tzLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgICAgZXZlbnQuaW52b2tlKHRpY2tUaW1lKTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0U0NIRURVTEFCTEUgRVZFTlRTXG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgU2NoZWR1bGUgYW4gZXZlbnQgYWxvbmcgdGhlIHRpbWVsaW5lLlxuXHRcdCAqICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBhdCB0aGUgdGltZS5cblx0XHQgKiAgQHBhcmFtIHtUcmFuc3BvcnRUaW1lfSAgdGltZSBUaGUgdGltZSB0byBpbnZva2UgdGhlIGNhbGxiYWNrIGF0LlxuXHRcdCAqICBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBpZCBvZiB0aGUgZXZlbnQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGNhbmNlbGluZyB0aGUgZXZlbnQuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy90cmlnZ2VyIHRoZSBjYWxsYmFjayB3aGVuIHRoZSBUcmFuc3BvcnQgcmVhY2hlcyB0aGUgZGVzaXJlZCB0aW1lXG5cdFx0ICogVG9uZS5UcmFuc3BvcnQuc2NoZWR1bGUoZnVuY3Rpb24odGltZSl7XG5cdFx0ICogXHRlbnZlbG9wZS50cmlnZ2VyQXR0YWNrKHRpbWUpO1xuXHRcdCAqIH0sIFwiMTI4aVwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChjYWxsYmFjaywgdGltZSkge1xuXHQgICAgICAgIHZhciBldmVudCA9IG5ldyBUb25lLlRyYW5zcG9ydEV2ZW50KHRoaXMsIHtcblx0ICAgICAgICAgICAgJ3RpbWUnOiBUb25lLlRyYW5zcG9ydFRpbWUodGltZSksXG5cdCAgICAgICAgICAgICdjYWxsYmFjayc6IGNhbGxiYWNrXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2FkZEV2ZW50KGV2ZW50LCB0aGlzLl90aW1lbGluZSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNjaGVkdWxlIGEgcmVwZWF0ZWQgZXZlbnQgYWxvbmcgdGhlIHRpbWVsaW5lLiBUaGUgZXZlbnQgd2lsbCBmaXJlXG5cdFx0ICogIGF0IHRoZSBgaW50ZXJ2YWxgIHN0YXJ0aW5nIGF0IHRoZSBgc3RhcnRUaW1lYCBhbmQgZm9yIHRoZSBzcGVjaWZpZWRcblx0XHQgKiAgYGR1cmF0aW9uYC5cblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgIFRoZSBjYWxsYmFjayB0byBpbnZva2UuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9ICAgIGludGVydmFsICAgVGhlIGR1cmF0aW9uIGJldHdlZW4gc3VjY2Vzc2l2ZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy4gTXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci5cblx0XHQgKiAgQHBhcmFtICB7VHJhbnNwb3J0VGltZT19ICAgIHN0YXJ0VGltZSAgV2hlbiBhbG9uZyB0aGUgdGltZWxpbmUgdGhlIGV2ZW50cyBzaG91bGRcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBiZWluZyBpbnZva2VkLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFtkdXJhdGlvbj1JbmZpbml0eV0gSG93IGxvbmcgdGhlIGV2ZW50IHNob3VsZCByZXBlYXQuXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9ICAgIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50LiBVc2UgdGhpcyB0byBjYW5jZWxcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBldmVudC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2EgY2FsbGJhY2sgaW52b2tlZCBldmVyeSBlaWdodGggbm90ZSBhZnRlciB0aGUgZmlyc3QgbWVhc3VyZVxuXHRcdCAqIFRvbmUuVHJhbnNwb3J0LnNjaGVkdWxlUmVwZWF0KGNhbGxiYWNrLCBcIjhuXCIsIFwiMW1cIik7XG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUuc2NoZWR1bGVSZXBlYXQgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGludGVydmFsLCBzdGFydFRpbWUsIGR1cmF0aW9uKSB7XG5cdCAgICAgICAgdmFyIGV2ZW50ID0gbmV3IFRvbmUuVHJhbnNwb3J0UmVwZWF0RXZlbnQodGhpcywge1xuXHQgICAgICAgICAgICAnY2FsbGJhY2snOiBjYWxsYmFjayxcblx0ICAgICAgICAgICAgJ2ludGVydmFsJzogVG9uZS5UaW1lKGludGVydmFsKSxcblx0ICAgICAgICAgICAgJ3RpbWUnOiBUb25lLlRyYW5zcG9ydFRpbWUoc3RhcnRUaW1lKSxcblx0ICAgICAgICAgICAgJ2R1cmF0aW9uJzogVG9uZS5UaW1lKFRvbmUuZGVmYXVsdEFyZyhkdXJhdGlvbiwgSW5maW5pdHkpKVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8va2ljayBpdCBvZmYgaWYgdGhlIFRyYW5zcG9ydCBpcyBzdGFydGVkXG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2FkZEV2ZW50KGV2ZW50LCB0aGlzLl9yZXBlYXRlZEV2ZW50cyk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNjaGVkdWxlIGFuIGV2ZW50IHRoYXQgd2lsbCBiZSByZW1vdmVkIGFmdGVyIGl0IGlzIGludm9rZWQuXG5cdFx0ICogIE5vdGUgdGhhdCBpZiB0aGUgZ2l2ZW4gdGltZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgdHJhbnNwb3J0IHRpbWUsXG5cdFx0ICogIHRoZSBldmVudCB3aWxsIGJlIGludm9rZWQgaW1tZWRpYXRlbHkuXG5cdFx0ICogIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugb25jZS5cblx0XHQgKiAgQHBhcmFtIHtUcmFuc3BvcnRUaW1lfSB0aW1lIFRoZSB0aW1lIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZC5cblx0XHQgKiAgQHJldHVybnMge051bWJlcn0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQuXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUuc2NoZWR1bGVPbmNlID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0aW1lKSB7XG5cdCAgICAgICAgdmFyIGV2ZW50ID0gbmV3IFRvbmUuVHJhbnNwb3J0RXZlbnQodGhpcywge1xuXHQgICAgICAgICAgICAndGltZSc6IFRvbmUuVHJhbnNwb3J0VGltZSh0aW1lKSxcblx0ICAgICAgICAgICAgJ2NhbGxiYWNrJzogY2FsbGJhY2ssXG5cdCAgICAgICAgICAgICdvbmNlJzogdHJ1ZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9hZGRFdmVudChldmVudCwgdGhpcy5fdGltZWxpbmUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhciB0aGUgcGFzc2VkIGluIGV2ZW50IGlkIGZyb20gdGhlIHRpbWVsaW5lXG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBldmVudElkIFRoZSBpZCBvZiB0aGUgZXZlbnQuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlRyYW5zcG9ydH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKGV2ZW50SWQpIHtcblx0ICAgICAgICBpZiAodGhpcy5fc2NoZWR1bGVkRXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50SWQpKSB7XG5cdCAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5fc2NoZWR1bGVkRXZlbnRzW2V2ZW50SWQudG9TdHJpbmcoKV07XG5cdCAgICAgICAgICAgIGl0ZW0udGltZWxpbmUucmVtb3ZlKGl0ZW0uZXZlbnQpO1xuXHQgICAgICAgICAgICBpdGVtLmV2ZW50LmRpc3Bvc2UoKTtcblx0ICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3NjaGVkdWxlZEV2ZW50c1tldmVudElkLnRvU3RyaW5nKCldO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBBZGQgYW4gZXZlbnQgdG8gdGhlIGNvcnJlY3QgdGltZWxpbmUuIEtlZXAgdHJhY2sgb2YgdGhlXG5cdFx0ICogdGltZWxpbmUgaXQgd2FzIGFkZGVkIHRvLlxuXHRcdCAqIEBwYXJhbSB7VG9uZS5UcmFuc3BvcnRFdmVudH1cdGV2ZW50XG5cdFx0ICogQHBhcmFtIHtUb25lLlRpbWVsaW5lfSB0aW1lbGluZVxuXHRcdCAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSBldmVudCBpZCB3aGljaCB3YXMganVzdCBhZGRlZFxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUuX2FkZEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCB0aW1lbGluZSkge1xuXHQgICAgICAgIHRoaXMuX3NjaGVkdWxlZEV2ZW50c1tldmVudC5pZC50b1N0cmluZygpXSA9IHtcblx0ICAgICAgICAgICAgJ2V2ZW50JzogZXZlbnQsXG5cdCAgICAgICAgICAgICd0aW1lbGluZSc6IHRpbWVsaW5lXG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aW1lbGluZS5hZGQoZXZlbnQpO1xuXHQgICAgICAgIHJldHVybiBldmVudC5pZDtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmVtb3ZlIHNjaGVkdWxlZCBldmVudHMgZnJvbSB0aGUgdGltZWxpbmUgYWZ0ZXJcblx0XHQgKiAgdGhlIGdpdmVuIHRpbWUuIFJlcGVhdGVkIGV2ZW50cyB3aWxsIGJlIHJlbW92ZWRcblx0XHQgKiAgaWYgdGhlaXIgc3RhcnRUaW1lIGlzIGFmdGVyIHRoZSBnaXZlbiB0aW1lXG5cdFx0ICogIEBwYXJhbSB7VHJhbnNwb3J0VGltZX0gW2FmdGVyPTBdIENsZWFyIGFsbCBldmVudHMgYWZ0ZXJcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB0aW1lLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UcmFuc3BvcnR9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAoYWZ0ZXIpIHtcblx0ICAgICAgICBhZnRlciA9IFRvbmUuZGVmYXVsdEFyZyhhZnRlciwgMCk7XG5cdCAgICAgICAgYWZ0ZXIgPSB0aGlzLnRvVGlja3MoYWZ0ZXIpO1xuXHQgICAgICAgIHRoaXMuX3RpbWVsaW5lLmZvckVhY2hGcm9tKGFmdGVyLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgICAgdGhpcy5jbGVhcihldmVudC5pZCk7XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgICAgICB0aGlzLl9yZXBlYXRlZEV2ZW50cy5mb3JFYWNoRnJvbShhZnRlciwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIHRoaXMuY2xlYXIoZXZlbnQuaWQpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdFNUQVJUL1NUT1AvUEFVU0Vcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8qKlxuXHRcdCAqICBCaW5kIHN0YXJ0L3N0b3AvcGF1c2UgZXZlbnRzIGZyb20gdGhlIGNsb2NrIGFuZCBlbWl0IHRoZW0uXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUuX2JpbmRDbG9ja0V2ZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLl9jbG9jay5vbignc3RhcnQnLCBmdW5jdGlvbiAodGltZSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIG9mZnNldCA9IFRvbmUuVGlja3Mob2Zmc2V0KS50b1NlY29uZHMoKTtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGFydCcsIHRpbWUsIG9mZnNldCk7XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgICAgICB0aGlzLl9jbG9jay5vbignc3RvcCcsIGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RvcCcsIHRpbWUpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICAgICAgdGhpcy5fY2xvY2sub24oJ3BhdXNlJywgZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KCdwYXVzZScsIHRpbWUpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHBsYXliYWNrIHN0YXRlIG9mIHRoZSBzb3VyY2UsIGVpdGhlciBcInN0YXJ0ZWRcIiwgXCJzdG9wcGVkXCIsIG9yIFwicGF1c2VkXCJcblx0XHQgKiAgQHR5cGUge1RvbmUuU3RhdGV9XG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5UcmFuc3BvcnQjXG5cdFx0ICogIEBuYW1lIHN0YXRlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLCAnc3RhdGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbG9jay5nZXRTdGF0ZUF0VGltZSh0aGlzLm5vdygpKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdGFydCB0aGUgdHJhbnNwb3J0IGFuZCBhbGwgc291cmNlcyBzeW5jZWQgdG8gdGhlIHRyYW5zcG9ydC5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XSBUaGUgdGltZSB3aGVuIHRoZSB0cmFuc3BvcnQgc2hvdWxkIHN0YXJ0LlxuXHRcdCAqICBAcGFyYW0gIHtUcmFuc3BvcnRUaW1lPX0gb2Zmc2V0IFRoZSB0aW1lbGluZSBvZmZzZXQgdG8gc3RhcnQgdGhlIHRyYW5zcG9ydC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuVHJhbnNwb3J0fSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9zdGFydCB0aGUgdHJhbnNwb3J0IGluIG9uZSBzZWNvbmQgc3RhcnRpbmcgYXQgYmVnaW5uaW5nIG9mIHRoZSA1dGggbWVhc3VyZS5cblx0XHQgKiBUb25lLlRyYW5zcG9ydC5zdGFydChcIisxXCIsIFwiNDowOjBcIik7XG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgLy9zdGFydCB0aGUgY2xvY2tcblx0ICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQob2Zmc2V0KSkge1xuXHQgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnRvVGlja3Mob2Zmc2V0KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fY2xvY2suc3RhcnQodGltZSwgb2Zmc2V0KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU3RvcCB0aGUgdHJhbnNwb3J0IGFuZCBhbGwgc291cmNlcyBzeW5jZWQgdG8gdGhlIHRyYW5zcG9ydC5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XSBUaGUgdGltZSB3aGVuIHRoZSB0cmFuc3BvcnQgc2hvdWxkIHN0b3AuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlRyYW5zcG9ydH0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIFRvbmUuVHJhbnNwb3J0LnN0b3AoKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLl9jbG9jay5zdG9wKHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBQYXVzZSB0aGUgdHJhbnNwb3J0IGFuZCBhbGwgc291cmNlcyBzeW5jZWQgdG8gdGhlIHRyYW5zcG9ydC5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UcmFuc3BvcnR9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fY2xvY2sucGF1c2UodGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVG9nZ2xlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB0cmFuc3BvcnQuIElmIGl0IGlzXG5cdFx0ICogc3RhcnRlZCwgaXQgd2lsbCBzdG9wIGl0LCBvdGhlcndpc2UgaXQgd2lsbCBzdGFydCB0aGUgVHJhbnNwb3J0LlxuXHRcdCAqIEBwYXJhbSAge1RpbWU9fSB0aW1lIFRoZSB0aW1lIG9mIHRoZSBldmVudFxuXHRcdCAqIEByZXR1cm4ge1RvbmUuVHJhbnNwb3J0fSAgICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBpZiAodGhpcy5fY2xvY2suZ2V0U3RhdGVBdFRpbWUodGltZSkgIT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICB0aGlzLnN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuc3RvcCh0aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdFNFVFRFUlMvR0VUVEVSU1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSB0aW1lIHNpZ25hdHVyZSBhcyBqdXN0IHRoZSBudW1lcmF0b3Igb3ZlciA0LlxuXHRcdCAqICBGb3IgZXhhbXBsZSA0LzQgd291bGQgYmUganVzdCA0IGFuZCA2Lzggd291bGQgYmUgMy5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuVHJhbnNwb3J0I1xuXHRcdCAqICBAdHlwZSB7TnVtYmVyfEFycmF5fVxuXHRcdCAqICBAbmFtZSB0aW1lU2lnbmF0dXJlXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9jb21tb24gdGltZVxuXHRcdCAqIFRvbmUuVHJhbnNwb3J0LnRpbWVTaWduYXR1cmUgPSA0O1xuXHRcdCAqIC8vIDcvOFxuXHRcdCAqIFRvbmUuVHJhbnNwb3J0LnRpbWVTaWduYXR1cmUgPSBbNywgOF07XG5cdFx0ICogLy90aGlzIHdpbGwgYmUgcmVkdWNlZCB0byBhIHNpbmdsZSBudW1iZXJcblx0XHQgKiBUb25lLlRyYW5zcG9ydC50aW1lU2lnbmF0dXJlOyAvL3JldHVybnMgMy41XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLCAndGltZVNpZ25hdHVyZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVTaWduYXR1cmU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0aW1lU2lnKSB7XG5cdCAgICAgICAgICAgIGlmIChUb25lLmlzQXJyYXkodGltZVNpZykpIHtcblx0ICAgICAgICAgICAgICAgIHRpbWVTaWcgPSB0aW1lU2lnWzBdIC8gdGltZVNpZ1sxXSAqIDQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5fdGltZVNpZ25hdHVyZSA9IHRpbWVTaWc7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBXaGVuIHRoZSBUb25lLlRyYW5zcG9ydC5sb29wID0gdHJ1ZSwgdGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGxvb3AuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuVHJhbnNwb3J0I1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIGxvb3BTdGFydFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZSwgJ2xvb3BTdGFydCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVGlja3ModGhpcy5fbG9vcFN0YXJ0KS50b1NlY29uZHMoKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHN0YXJ0UG9zaXRpb24pIHtcblx0ICAgICAgICAgICAgdGhpcy5fbG9vcFN0YXJ0ID0gdGhpcy50b1RpY2tzKHN0YXJ0UG9zaXRpb24pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogV2hlbiB0aGUgVG9uZS5UcmFuc3BvcnQubG9vcCA9IHRydWUsIHRoaXMgaXMgdGhlIGVuZGluZyBwb3NpdGlvbiBvZiB0aGUgbG9vcC5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5UcmFuc3BvcnQjXG5cdFx0ICogQHR5cGUge1RpbWV9XG5cdFx0ICogQG5hbWUgbG9vcEVuZFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZSwgJ2xvb3BFbmQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUb25lLlRpY2tzKHRoaXMuX2xvb3BFbmQpLnRvU2Vjb25kcygpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoZW5kUG9zaXRpb24pIHtcblx0ICAgICAgICAgICAgdGhpcy5fbG9vcEVuZCA9IHRoaXMudG9UaWNrcyhlbmRQb3NpdGlvbik7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgU2V0IHRoZSBsb29wIHN0YXJ0IGFuZCBzdG9wIGF0IHRoZSBzYW1lIHRpbWUuXG5cdFx0ICogIEBwYXJhbSB7VHJhbnNwb3J0VGltZX0gc3RhcnRQb3NpdGlvblxuXHRcdCAqICBAcGFyYW0ge1RyYW5zcG9ydFRpbWV9IGVuZFBvc2l0aW9uXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlRyYW5zcG9ydH0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vbG9vcCBvdmVyIHRoZSBmaXJzdCBtZWFzdXJlXG5cdFx0ICogVG9uZS5UcmFuc3BvcnQuc2V0TG9vcFBvaW50cygwLCBcIjFtXCIpO1xuXHRcdCAqIFRvbmUuVHJhbnNwb3J0Lmxvb3AgPSB0cnVlO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLnNldExvb3BQb2ludHMgPSBmdW5jdGlvbiAoc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24pIHtcblx0ICAgICAgICB0aGlzLmxvb3BTdGFydCA9IHN0YXJ0UG9zaXRpb247XG5cdCAgICAgICAgdGhpcy5sb29wRW5kID0gZW5kUG9zaXRpb247XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBzd2luZyB2YWx1ZS4gQmV0d2VlbiAwLTEgd2hlcmUgMSBlcXVhbCB0b1xuXHRcdCAqICB0aGUgbm90ZSArIGhhbGYgdGhlIHN1YmRpdmlzaW9uLlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5UcmFuc3BvcnQjXG5cdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHQgKiAgQG5hbWUgc3dpbmdcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUsICdzd2luZycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N3aW5nQW1vdW50O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoYW1vdW50KSB7XG5cdCAgICAgICAgICAgIC8vc2NhbGUgdGhlIHZhbHVlcyB0byBhIG5vcm1hbCByYW5nZVxuXHQgICAgICAgICAgICB0aGlzLl9zd2luZ0Ftb3VudCA9IGFtb3VudDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBTZXQgdGhlIHN1YmRpdmlzaW9uIHdoaWNoIHRoZSBzd2luZyB3aWxsIGJlIGFwcGxpZWQgdG8uXG5cdFx0ICogIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIDh0aCBub3RlLiBWYWx1ZSBtdXN0IGJlIGxlc3Ncblx0XHQgKiAgdGhhbiBhIHF1YXJ0ZXIgbm90ZS5cblx0XHQgKlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5UcmFuc3BvcnQjXG5cdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdCAqICBAbmFtZSBzd2luZ1N1YmRpdmlzaW9uXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLCAnc3dpbmdTdWJkaXZpc2lvbicsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVGlja3ModGhpcy5fc3dpbmdUaWNrcykudG9Ob3RhdGlvbigpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoc3ViZGl2aXNpb24pIHtcblx0ICAgICAgICAgICAgdGhpcy5fc3dpbmdUaWNrcyA9IHRoaXMudG9UaWNrcyhzdWJkaXZpc2lvbik7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIFRyYW5zcG9ydCdzIHBvc2l0aW9uIGluIEJhcnM6QmVhdHM6U2l4dGVlbnRocy5cblx0XHQgKiAgU2V0dGluZyB0aGUgdmFsdWUgd2lsbCBqdW1wIHRvIHRoYXQgcG9zaXRpb24gcmlnaHQgYXdheS5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuVHJhbnNwb3J0I1xuXHRcdCAqICBAdHlwZSB7QmFyc0JlYXRzU2l4dGVlbnRoc31cblx0XHQgKiAgQG5hbWUgcG9zaXRpb25cblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUsICdwb3NpdGlvbicsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIG5vdyA9IHRoaXMubm93KCk7XG5cdCAgICAgICAgICAgIHZhciB0aWNrcyA9IHRoaXMuX2Nsb2NrLmdldFRpY2tzQXRUaW1lKG5vdyk7XG5cdCAgICAgICAgICAgIHJldHVybiBUb25lLlRpY2tzKHRpY2tzKS50b0JhcnNCZWF0c1NpeHRlZW50aHMoKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHByb2dyZXNzKSB7XG5cdCAgICAgICAgICAgIHZhciB0aWNrcyA9IHRoaXMudG9UaWNrcyhwcm9ncmVzcyk7XG5cdCAgICAgICAgICAgIHRoaXMudGlja3MgPSB0aWNrcztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgVHJhbnNwb3J0J3MgcG9zaXRpb24gaW4gc2Vjb25kc1xuXHRcdCAqICBTZXR0aW5nIHRoZSB2YWx1ZSB3aWxsIGp1bXAgdG8gdGhhdCBwb3NpdGlvbiByaWdodCBhd2F5LlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5UcmFuc3BvcnQjXG5cdFx0ICogIEB0eXBlIHtTZWNvbmRzfVxuXHRcdCAqICBAbmFtZSBzZWNvbmRzXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLCAnc2Vjb25kcycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb2NrLnNlY29uZHM7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChzKSB7XG5cdCAgICAgICAgICAgIHZhciBub3cgPSB0aGlzLm5vdygpO1xuXHQgICAgICAgICAgICB2YXIgdGlja3MgPSB0aGlzLmJwbS50aW1lVG9UaWNrcyhzLCBub3cpO1xuXHQgICAgICAgICAgICB0aGlzLnRpY2tzID0gdGlja3M7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIFRyYW5zcG9ydCdzIGxvb3AgcG9zaXRpb24gYXMgYSBub3JtYWxpemVkIHZhbHVlLiBBbHdheXNcblx0XHQgKiAgcmV0dXJucyAwIGlmIHRoZSB0cmFuc3BvcnQgaWYgbG9vcCBpcyBub3QgdHJ1ZS5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuVHJhbnNwb3J0I1xuXHRcdCAqICBAbmFtZSBwcm9ncmVzc1xuXHRcdCAqICBAdHlwZSB7Tm9ybWFsUmFuZ2V9XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLCAncHJvZ3Jlc3MnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmxvb3ApIHtcblx0ICAgICAgICAgICAgICAgIHZhciBub3cgPSB0aGlzLm5vdygpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHRpY2tzID0gdGhpcy5fY2xvY2suZ2V0VGlja3NBdFRpbWUobm93KTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAodGlja3MgLSB0aGlzLl9sb29wU3RhcnQpIC8gKHRoaXMuX2xvb3BFbmQgLSB0aGlzLl9sb29wU3RhcnQpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgdHJhbnNwb3J0cyBjdXJyZW50IHRpY2sgcG9zaXRpb24uXG5cdFx0ICpcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuVHJhbnNwb3J0I1xuXHRcdCAqICBAdHlwZSB7VGlja3N9XG5cdFx0ICogIEBuYW1lIHRpY2tzXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLCAndGlja3MnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbG9jay50aWNrcztcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2Nsb2NrLnRpY2tzICE9PSB0KSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5ub3coKTtcblx0ICAgICAgICAgICAgICAgIC8vc3RvcCBldmVyeXRoaW5nIHN5bmNlZCB0byB0aGUgdHJhbnNwb3J0XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzdG9wJywgbm93KTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbG9jay5zZXRUaWNrc0F0VGltZSh0LCBub3cpO1xuXHQgICAgICAgICAgICAgICAgICAgIC8vcmVzdGFydCBpdCB3aXRoIHRoZSBuZXcgdGltZVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhcnQnLCBub3csIHRoaXMuc2Vjb25kcyk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nsb2NrLnNldFRpY2tzQXRUaW1lKHQsIG5vdyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIEdldCB0aGUgY2xvY2sncyB0aWNrcyBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiBAcGFyYW0gIHtUaW1lfSB0aW1lICBXaGVuIHRvIGdldCB0aGUgdGljayB2YWx1ZVxuXHRcdCAqIEByZXR1cm4ge1RpY2tzfSAgICAgICBUaGUgdGljayB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZS5nZXRUaWNrc0F0VGltZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5fY2xvY2suZ2V0VGlja3NBdFRpbWUodGltZSkpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIGVsYXBzZWQgc2Vjb25kcyBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gIHRpbWUgIFdoZW4gdG8gZ2V0IHRoZSBlbGFwc2VkIHNlY29uZHNcblx0XHQgKiAgQHJldHVybiAge1NlY29uZHN9ICBUaGUgbnVtYmVyIG9mIGVsYXBzZWQgc2Vjb25kc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLmdldFNlY29uZHNBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9jbG9jay5nZXRTZWNvbmRzQXRUaW1lKHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBQdWxzZXMgUGVyIFF1YXJ0ZXIgbm90ZS4gVGhpcyBpcyB0aGUgc21hbGxlc3QgcmVzb2x1dGlvblxuXHRcdCAqICB0aGUgVHJhbnNwb3J0IHRpbWluZyBzdXBwb3J0cy4gVGhpcyBzaG91bGQgYmUgc2V0IG9uY2Vcblx0XHQgKiAgb24gaW5pdGlhbGl6YXRpb24gYW5kIG5vdCBzZXQgYWdhaW4uIENoYW5naW5nIHRoaXMgdmFsdWVcblx0XHQgKiAgYWZ0ZXIgb3RoZXIgb2JqZWN0cyBoYXZlIGJlZW4gY3JlYXRlZCBjYW4gY2F1c2UgcHJvYmxlbXMuXG5cdFx0ICpcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuVHJhbnNwb3J0I1xuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbmFtZSBQUFFcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUsICdQUFEnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcHE7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwcHEpIHtcblx0ICAgICAgICAgICAgdmFyIGJwbSA9IHRoaXMuYnBtLnZhbHVlO1xuXHQgICAgICAgICAgICB0aGlzLl9wcHEgPSBwcHE7XG5cdCAgICAgICAgICAgIHRoaXMuYnBtLnZhbHVlID0gYnBtO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENvbnZlcnQgZnJvbSBCUE0gdG8gZnJlcXVlbmN5IChmYWN0b3JpbmcgaW4gUFBRKVxuXHRcdCAqICBAcGFyYW0gIHtCUE19ICBicG0gVGhlIEJQTSB2YWx1ZSB0byBjb252ZXJ0IHRvIGZyZXF1ZW5jeVxuXHRcdCAqICBAcmV0dXJuICB7RnJlcXVlbmN5fSAgVGhlIEJQTSBhcyBhIGZyZXF1ZW5jeSB3aXRoIFBQUSBmYWN0b3JlZCBpbi5cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZS5fZnJvbVVuaXRzID0gZnVuY3Rpb24gKGJwbSkge1xuXHQgICAgICAgIHJldHVybiAxIC8gKDYwIC8gYnBtIC8gdGhpcy5QUFEpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDb252ZXJ0IGZyb20gZnJlcXVlbmN5ICh3aXRoIFBQUSkgaW50byBCUE1cblx0XHQgKiAgQHBhcmFtICB7RnJlcXVlbmN5fSAgZnJlcSBUaGUgY2xvY2tzIGZyZXF1ZW5jeSB0byBjb252ZXJ0IHRvIEJQTVxuXHRcdCAqICBAcmV0dXJuICB7QlBNfSAgVGhlIGZyZXF1ZW5jeSB2YWx1ZSBhcyBCUE0uXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUuX3RvVW5pdHMgPSBmdW5jdGlvbiAoZnJlcSkge1xuXHQgICAgICAgIHJldHVybiBmcmVxIC8gdGhpcy5QUFEgKiA2MDtcblx0ICAgIH07XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0U1lOQ0lOR1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHRpbWUgYWxpZ25lZCB0byB0aGUgbmV4dCBzdWJkaXZpc2lvblxuXHRcdCAqICBvZiB0aGUgVHJhbnNwb3J0LiBJZiB0aGUgVHJhbnNwb3J0IGlzIG5vdCBzdGFydGVkLFxuXHRcdCAqICBpdCB3aWxsIHJldHVybiAwLlxuXHRcdCAqICBOb3RlOiB0aGlzIHdpbGwgbm90IHdvcmsgcHJlY2lzZWx5IGR1cmluZyB0ZW1wbyByYW1wcy5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gIHN1YmRpdmlzaW9uICBUaGUgc3ViZGl2aXNpb24gdG8gcXVhbnRpemUgdG9cblx0XHQgKiAgQHJldHVybiAge051bWJlcn0gIFRoZSBjb250ZXh0IHRpbWUgb2YgdGhlIG5leHQgc3ViZGl2aXNpb24uXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogVG9uZS5UcmFuc3BvcnQuc3RhcnQoKTsgLy90aGUgdHJhbnNwb3J0IG11c3QgYmUgc3RhcnRlZFxuXHRcdCAqIFRvbmUuVHJhbnNwb3J0Lm5leHRTdWJkaXZpc2lvbihcIjRuXCIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLm5leHRTdWJkaXZpc2lvbiA9IGZ1bmN0aW9uIChzdWJkaXZpc2lvbikge1xuXHQgICAgICAgIHN1YmRpdmlzaW9uID0gdGhpcy50b1RpY2tzKHN1YmRpdmlzaW9uKTtcblx0ICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgIC8vaWYgdGhlIHRyYW5zcG9ydCdzIG5vdCBzdGFydGVkLCByZXR1cm4gMFxuXHQgICAgICAgICAgICByZXR1cm4gMDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5ub3coKTtcblx0ICAgICAgICAgICAgLy90aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IHRpY2tzIGFuZCB0aGUgc3ViZGl2aXNpb25cblx0ICAgICAgICAgICAgdmFyIHRyYW5zcG9ydFBvcyA9IHRoaXMuZ2V0VGlja3NBdFRpbWUobm93KTtcblx0ICAgICAgICAgICAgdmFyIHJlbWFpbmluZ1RpY2tzID0gc3ViZGl2aXNpb24gLSB0cmFuc3BvcnRQb3MgJSBzdWJkaXZpc2lvbjtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb2NrLm5leHRUaWNrVGltZShyZW1haW5pbmdUaWNrcywgbm93KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEF0dGFjaGVzIHRoZSBzaWduYWwgdG8gdGhlIHRlbXBvIGNvbnRyb2wgc2lnbmFsIHNvIHRoYXRcblx0XHQgKiAgYW55IGNoYW5nZXMgaW4gdGhlIHRlbXBvIHdpbGwgY2hhbmdlIHRoZSBzaWduYWwgaW4gdGhlIHNhbWVcblx0XHQgKiAgcmF0aW8uXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7VG9uZS5TaWduYWx9IHNpZ25hbFxuXHRcdCAqICBAcGFyYW0ge251bWJlcj19IHJhdGlvIE9wdGlvbmFsbHkgcGFzcyBpbiB0aGUgcmF0aW8gYmV0d2VlblxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0d28gc2lnbmFscy4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgY29tcHV0ZWRcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGVpciBjdXJyZW50IHZhbHVlcy5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuVHJhbnNwb3J0fSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydC5wcm90b3R5cGUuc3luY1NpZ25hbCA9IGZ1bmN0aW9uIChzaWduYWwsIHJhdGlvKSB7XG5cdCAgICAgICAgaWYgKCFyYXRpbykge1xuXHQgICAgICAgICAgICAvL2dldCB0aGUgc3luYyByYXRpb1xuXHQgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5ub3coKTtcblx0ICAgICAgICAgICAgaWYgKHNpZ25hbC5nZXRWYWx1ZUF0VGltZShub3cpICE9PSAwKSB7XG5cdCAgICAgICAgICAgICAgICByYXRpbyA9IHNpZ25hbC5nZXRWYWx1ZUF0VGltZShub3cpIC8gdGhpcy5icG0uZ2V0VmFsdWVBdFRpbWUobm93KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJhdGlvID0gMDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcmF0aW9TaWduYWwgPSBuZXcgVG9uZS5HYWluKHJhdGlvKTtcblx0ICAgICAgICB0aGlzLmJwbS5jaGFpbihyYXRpb1NpZ25hbCwgc2lnbmFsLl9wYXJhbSk7XG5cdCAgICAgICAgdGhpcy5fc3luY2VkU2lnbmFscy5wdXNoKHtcblx0ICAgICAgICAgICAgJ3JhdGlvJzogcmF0aW9TaWduYWwsXG5cdCAgICAgICAgICAgICdzaWduYWwnOiBzaWduYWwsXG5cdCAgICAgICAgICAgICdpbml0aWFsJzogc2lnbmFsLnZhbHVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgc2lnbmFsLnZhbHVlID0gMDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVW5zeW5jcyBhIHByZXZpb3VzbHkgc3luY2VkIHNpZ25hbCBmcm9tIHRoZSB0cmFuc3BvcnQncyBjb250cm9sLlxuXHRcdCAqICBTZWUgVG9uZS5UcmFuc3BvcnQuc3luY1NpZ25hbC5cblx0XHQgKiAgQHBhcmFtICB7VG9uZS5TaWduYWx9IHNpZ25hbFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UcmFuc3BvcnR9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0LnByb3RvdHlwZS51bnN5bmNTaWduYWwgPSBmdW5jdGlvbiAoc2lnbmFsKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX3N5bmNlZFNpZ25hbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgICAgICAgdmFyIHN5bmNlZFNpZ25hbCA9IHRoaXMuX3N5bmNlZFNpZ25hbHNbaV07XG5cdCAgICAgICAgICAgIGlmIChzeW5jZWRTaWduYWwuc2lnbmFsID09PSBzaWduYWwpIHtcblx0ICAgICAgICAgICAgICAgIHN5bmNlZFNpZ25hbC5yYXRpby5kaXNwb3NlKCk7XG5cdCAgICAgICAgICAgICAgICBzeW5jZWRTaWduYWwuc2lnbmFsLnZhbHVlID0gc3luY2VkU2lnbmFsLmluaXRpYWw7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9zeW5jZWRTaWduYWxzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlRyYW5zcG9ydH0gdGhpc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5FbWl0dGVyLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fY2xvY2suZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2Nsb2NrID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZSgnYnBtJyk7XG5cdCAgICAgICAgdGhpcy5icG0gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3RpbWVsaW5lLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl90aW1lbGluZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fcmVwZWF0ZWRFdmVudHMuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3JlcGVhdGVkRXZlbnRzID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvL1x0SU5JVElBTElaQVRJT05cblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIHZhciBUcmFuc3BvcnRDb25zdHJ1Y3RvciA9IFRvbmUuVHJhbnNwb3J0O1xuXHQgICAgVG9uZS5UcmFuc3BvcnQgPSBuZXcgVHJhbnNwb3J0Q29uc3RydWN0b3IoKTtcblx0ICAgIFRvbmUuQ29udGV4dC5vbignaW5pdCcsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cdCAgICAgICAgaWYgKGNvbnRleHQuVHJhbnNwb3J0IGluc3RhbmNlb2YgVHJhbnNwb3J0Q29uc3RydWN0b3IpIHtcblx0ICAgICAgICAgICAgVG9uZS5UcmFuc3BvcnQgPSBjb250ZXh0LlRyYW5zcG9ydDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBUb25lLlRyYW5zcG9ydCA9IG5ldyBUcmFuc3BvcnRDb25zdHJ1Y3RvcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL3N0b3JlIHRoZSBUcmFuc3BvcnQgb24gdGhlIGNvbnRleHQgc28gaXQgY2FuIGJlIHJldHJpZXZlZCBsYXRlclxuXHQgICAgICAgIGNvbnRleHQuVHJhbnNwb3J0ID0gVG9uZS5UcmFuc3BvcnQ7XG5cdCAgICB9KTtcblx0ICAgIFRvbmUuQ29udGV4dC5vbignY2xvc2UnLCBmdW5jdGlvbiAoY29udGV4dCkge1xuXHQgICAgICAgIGlmIChjb250ZXh0LlRyYW5zcG9ydCBpbnN0YW5jZW9mIFRyYW5zcG9ydENvbnN0cnVjdG9yKSB7XG5cdCAgICAgICAgICAgIGNvbnRleHQuVHJhbnNwb3J0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIHJldHVybiBUb25lLlRyYW5zcG9ydDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuVm9sdW1lIGlzIGEgc2ltcGxlIHZvbHVtZSBub2RlLCB1c2VmdWwgZm9yIGNyZWF0aW5nIGEgdm9sdW1lIGZhZGVyLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7RGVjaWJlbHN9IFt2b2x1bWU9MF0gdGhlIGluaXRpYWwgdm9sdW1lXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIHZvbCA9IG5ldyBUb25lLlZvbHVtZSgtMTIpO1xuXHRcdCAqIGluc3RydW1lbnQuY2hhaW4odm9sLCBUb25lLk1hc3Rlcik7XG5cdFx0ICovXG5cdCAgICBUb25lLlZvbHVtZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbJ3ZvbHVtZSddLCBUb25lLlZvbHVtZSk7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIHRoZSBvdXRwdXQgbm9kZVxuXHRcdFx0ICogQHR5cGUge0dhaW5Ob2RlfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMub3V0cHV0ID0gdGhpcy5pbnB1dCA9IG5ldyBUb25lLkdhaW4ob3B0aW9ucy52b2x1bWUsIFRvbmUuVHlwZS5EZWNpYmVscyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgdW5tdXRlZCB2b2x1bWVcblx0XHRcdCAqIEB0eXBlIHtEZWNpYmVsc31cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl91bm11dGVkVm9sdW1lID0gb3B0aW9ucy52b2x1bWU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHZvbHVtZSBjb250cm9sIGluIGRlY2liZWxzLlxuXHRcdFx0ICogIEB0eXBlIHtEZWNpYmVsc31cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnZvbHVtZSA9IHRoaXMub3V0cHV0LmdhaW47XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoJ3ZvbHVtZScpO1xuXHQgICAgICAgIC8vc2V0IHRoZSBtdXRlIGluaXRpYWxseVxuXHQgICAgICAgIHRoaXMubXV0ZSA9IG9wdGlvbnMubXV0ZTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlZvbHVtZSwgVG9uZS5BdWRpb05vZGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIERlZmF1bHRzXG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Wb2x1bWUuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3ZvbHVtZSc6IDAsXG5cdCAgICAgICAgJ211dGUnOiBmYWxzZVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIE11dGUgdGhlIG91dHB1dC5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5Wb2x1bWUjXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XG5cdFx0ICogQG5hbWUgbXV0ZVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy9tdXRlIHRoZSBvdXRwdXRcblx0XHQgKiB2b2x1bWUubXV0ZSA9IHRydWU7XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Wb2x1bWUucHJvdG90eXBlLCAnbXV0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMudm9sdW1lLnZhbHVlID09PSAtSW5maW5pdHk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtdXRlKSB7XG5cdCAgICAgICAgICAgIGlmICghdGhpcy5tdXRlICYmIG11dGUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3VubXV0ZWRWb2x1bWUgPSB0aGlzLnZvbHVtZS52YWx1ZTtcblx0ICAgICAgICAgICAgICAgIC8vbWF5YmUgaXQgc2hvdWxkIHJhbXAgaGVyZT9cblx0ICAgICAgICAgICAgICAgIHRoaXMudm9sdW1lLnZhbHVlID0gLUluZmluaXR5O1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubXV0ZSAmJiAhbXV0ZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy52b2x1bWUudmFsdWUgPSB0aGlzLl91bm11dGVkVm9sdW1lO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuVm9sdW1lfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlZvbHVtZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmlucHV0LmRpc3Bvc2UoKTtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCd2b2x1bWUnKTtcblx0ICAgICAgICB0aGlzLnZvbHVtZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy52b2x1bWUgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlZvbHVtZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBBIHNpbmdsZSBtYXN0ZXIgb3V0cHV0IHdoaWNoIGlzIGNvbm5lY3RlZCB0byB0aGVcblx0XHQgKiAgICAgICAgICBBdWRpb0Rlc3RpbmF0aW9uTm9kZSAoYWthIHlvdXIgc3BlYWtlcnMpLlxuXHRcdCAqICAgICAgICAgIEl0IHByb3ZpZGVzIHVzZWZ1bCBjb252ZW5pZW5jZXMgc3VjaCBhcyB0aGUgYWJpbGl0eVxuXHRcdCAqICAgICAgICAgIHRvIHNldCB0aGUgdm9sdW1lIGFuZCBtdXRlIHRoZSBlbnRpcmUgYXBwbGljYXRpb24uXG5cdFx0ICogICAgICAgICAgSXQgYWxzbyBnaXZlcyB5b3UgdGhlIGFiaWxpdHkgdG8gYXBwbHkgbWFzdGVyIGVmZmVjdHMgdG8geW91ciBhcHBsaWNhdGlvbi5cblx0XHQgKiAgICAgICAgICA8YnI+PGJyPlxuXHRcdCAqICAgICAgICAgIExpa2UgVG9uZS5UcmFuc3BvcnQsIEEgc2luZ2xlIFRvbmUuTWFzdGVyIGlzIGNyZWF0ZWRcblx0XHQgKiAgICAgICAgICBvbiBpbml0aWFsaXphdGlvbiBhbmQgeW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgY29uc3RydWN0IG9uZS5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmV9XG5cdFx0ICogIEBzaW5nbGV0b25cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL3RoZSBhdWRpbyB3aWxsIGdvIGZyb20gdGhlIG9zY2lsbGF0b3IgdG8gdGhlIHNwZWFrZXJzXG5cdFx0ICogb3NjaWxsYXRvci5jb25uZWN0KFRvbmUuTWFzdGVyKTtcblx0XHQgKiAvL2EgY29udmVuaWVuY2UgZm9yIGNvbm5lY3RpbmcgdG8gdGhlIG1hc3RlciBvdXRwdXQgaXMgYWxzbyBwcm92aWRlZDpcblx0XHQgKiBvc2NpbGxhdG9yLnRvTWFzdGVyKCk7XG5cdFx0ICogLy90aGUgYWJvdmUgdHdvIGV4YW1wbGVzIGFyZSBlcXVpdmFsZW50LlxuXHRcdCAqL1xuXHQgICAgVG9uZS5NYXN0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICBUb25lLmdldENvbnRleHQoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0aGlzLmNyZWF0ZUluc091dHMoMSwgMCk7XG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiAgVGhlIHByaXZhdGUgdm9sdW1lIG5vZGVcblx0XHRcdFx0ICogIEB0eXBlICB7VG9uZS5Wb2x1bWV9XG5cdFx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy5fdm9sdW1lID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5Wb2x1bWUoKTtcblx0ICAgICAgICAgICAgLyoqXG5cdFx0XHRcdCAqIFRoZSB2b2x1bWUgb2YgdGhlIG1hc3RlciBvdXRwdXQuXG5cdFx0XHRcdCAqIEB0eXBlIHtEZWNpYmVsc31cblx0XHRcdFx0ICogQHNpZ25hbFxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy52b2x1bWUgPSB0aGlzLl92b2x1bWUudm9sdW1lO1xuXHQgICAgICAgICAgICB0aGlzLl9yZWFkT25seSgndm9sdW1lJyk7XG5cdCAgICAgICAgICAgIC8vY29ubmVjdGlvbnNcblx0ICAgICAgICAgICAgdGhpcy5pbnB1dC5jaGFpbih0aGlzLm91dHB1dCwgdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTtcblx0ICAgICAgICB9LmJpbmQodGhpcykpO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuTWFzdGVyLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICovXG5cdCAgICBUb25lLk1hc3Rlci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAndm9sdW1lJzogMCxcblx0ICAgICAgICAnbXV0ZSc6IGZhbHNlXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogTXV0ZSB0aGUgb3V0cHV0LlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLk1hc3RlciNcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cblx0XHQgKiBAbmFtZSBtdXRlXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvL211dGUgdGhlIG91dHB1dFxuXHRcdCAqIFRvbmUuTWFzdGVyLm11dGUgPSB0cnVlO1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTWFzdGVyLnByb3RvdHlwZSwgJ211dGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl92b2x1bWUubXV0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG11dGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fdm9sdW1lLm11dGUgPSBtdXRlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIEFkZCBhIG1hc3RlciBlZmZlY3RzIGNoYWluLiBOT1RFOiB0aGlzIHdpbGwgZGlzY29ubmVjdCBhbnkgbm9kZXMgd2hpY2ggd2VyZSBwcmV2aW91c2x5XG5cdFx0ICogIGNoYWluZWQgaW4gdGhlIG1hc3RlciBlZmZlY3RzIGNoYWluLlxuXHRcdCAqICBAcGFyYW0ge0F1ZGlvTm9kZXxUb25lfSBhcmdzLi4uIEFsbCBhcmd1bWVudHMgd2lsbCBiZSBjb25uZWN0ZWQgaW4gYSByb3dcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIE1hc3RlciB3aWxsIGJlIHJvdXRlZCB0aHJvdWdoIGl0LlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5NYXN0ZXJ9ICB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9zb21lIG92ZXJhbGwgY29tcHJlc3Npb24gdG8ga2VlcCB0aGUgbGV2ZWxzIGluIGNoZWNrXG5cdFx0ICogdmFyIG1hc3RlckNvbXByZXNzb3IgPSBuZXcgVG9uZS5Db21wcmVzc29yKHtcblx0XHQgKiBcdFwidGhyZXNob2xkXCIgOiAtNixcblx0XHQgKiBcdFwicmF0aW9cIiA6IDMsXG5cdFx0ICogXHRcImF0dGFja1wiIDogMC41LFxuXHRcdCAqIFx0XCJyZWxlYXNlXCIgOiAwLjFcblx0XHQgKiB9KTtcblx0XHQgKiAvL2dpdmUgYSBsaXR0bGUgYm9vc3QgdG8gdGhlIGxvd3Ncblx0XHQgKiB2YXIgbG93QnVtcCA9IG5ldyBUb25lLkZpbHRlcigyMDAsIFwibG93c2hlbGZcIik7XG5cdFx0ICogLy9yb3V0ZSBldmVyeXRoaW5nIHRocm91Z2ggdGhlIGZpbHRlclxuXHRcdCAqIC8vYW5kIGNvbXByZXNzb3IgYmVmb3JlIGdvaW5nIHRvIHRoZSBzcGVha2Vyc1xuXHRcdCAqIFRvbmUuTWFzdGVyLmNoYWluKGxvd0J1bXAsIG1hc3RlckNvbXByZXNzb3IpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NYXN0ZXIucHJvdG90eXBlLmNoYWluID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuaW5wdXQuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuaW5wdXQuY2hhaW4uYXBwbHkodGhpcy5pbnB1dCwgYXJndW1lbnRzKTtcblx0ICAgICAgICBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5NYXN0ZXJ9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk1hc3Rlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCd2b2x1bWUnKTtcblx0ICAgICAgICB0aGlzLl92b2x1bWUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy52b2x1bWUgPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9cdEFVR01FTlQgVE9ORSdzIFBST1RPVFlQRVxuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICAvKipcblx0XHQgKiAgQ29ubmVjdCAndGhpcycgdG8gdGhlIG1hc3RlciBvdXRwdXQuIFNob3J0aGFuZCBmb3IgdGhpcy5jb25uZWN0KFRvbmUuTWFzdGVyKVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5BdWRpb05vZGV9IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2Nvbm5lY3QgYW4gb3NjaWxsYXRvciB0byB0aGUgbWFzdGVyIG91dHB1dFxuXHRcdCAqIHZhciBvc2MgPSBuZXcgVG9uZS5Pc2NpbGxhdG9yKCkudG9NYXN0ZXIoKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS50b01hc3RlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbm5lY3QoVG9uZS5NYXN0ZXIpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIGlmICh3aW5kb3cuQXVkaW9Ob2RlKSB7XG5cdCAgICAgICAgLy8gQWxzbyBhdWdtZW50IEF1ZGlvTm9kZSdzIHByb3RvdHlwZSB0byBpbmNsdWRlIHRvTWFzdGVyIGFzIGEgY29udmVuaWVuY2Vcblx0ICAgICAgICBBdWRpb05vZGUucHJvdG90eXBlLnRvTWFzdGVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB0aGlzLmNvbm5lY3QoVG9uZS5NYXN0ZXIpO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9O1xuXHQgICAgfVxuXHQgICAgLyoqXG5cdFx0ICogIGluaXRpYWxpemUgdGhlIG1vZHVsZSBhbmQgbGlzdGVuIGZvciBuZXcgYXVkaW8gY29udGV4dHNcblx0XHQgKi9cblx0ICAgIHZhciBNYXN0ZXJDb25zdHJ1Y3RvciA9IFRvbmUuTWFzdGVyO1xuXHQgICAgVG9uZS5NYXN0ZXIgPSBuZXcgTWFzdGVyQ29uc3RydWN0b3IoKTtcblx0ICAgIFRvbmUuQ29udGV4dC5vbignaW5pdCcsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cdCAgICAgICAgLy8gaWYgaXQgYWxyZWFkeSBleGlzdHMsIGp1c3QgcmVzdG9yZSBpdFxuXHQgICAgICAgIGlmIChjb250ZXh0Lk1hc3RlciBpbnN0YW5jZW9mIE1hc3RlckNvbnN0cnVjdG9yKSB7XG5cdCAgICAgICAgICAgIFRvbmUuTWFzdGVyID0gY29udGV4dC5NYXN0ZXI7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgVG9uZS5NYXN0ZXIgPSBuZXcgTWFzdGVyQ29uc3RydWN0b3IoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29udGV4dC5NYXN0ZXIgPSBUb25lLk1hc3Rlcjtcblx0ICAgIH0pO1xuXHQgICAgVG9uZS5Db250ZXh0Lm9uKCdjbG9zZScsIGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cdCAgICAgICAgaWYgKGNvbnRleHQuTWFzdGVyIGluc3RhbmNlb2YgTWFzdGVyQ29uc3RydWN0b3IpIHtcblx0ICAgICAgICAgICAgY29udGV4dC5NYXN0ZXIuZGlzcG9zZSgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgcmV0dXJuIFRvbmUuTWFzdGVyO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIEJhc2UgY2xhc3MgZm9yIHNvdXJjZXMuIFNvdXJjZXMgaGF2ZSBzdGFydC9zdG9wIG1ldGhvZHNcblx0XHQgKiAgICAgICAgICBhbmQgdGhlIGFiaWxpdHkgdG8gYmUgc3luY2VkIHRvIHRoZVxuXHRcdCAqICAgICAgICAgIHN0YXJ0L3N0b3Agb2YgVG9uZS5UcmFuc3BvcnQuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL011bHRpcGxlIHN0YXRlIGNoYW5nZSBldmVudHMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXIsXG5cdFx0ICogLy9idXQgbXVzdCBiZSBzZXQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgYW5kIHdpdGggYXNjZW5kaW5nIHRpbWVzXG5cdFx0ICpcblx0XHQgKiAvLyBPS1xuXHRcdCAqIHN0YXRlLnN0YXJ0KCkuc3RvcChcIiswLjJcIik7XG5cdFx0ICogLy8gQU5EXG5cdFx0ICogc3RhdGUuc3RhcnQoKS5zdG9wKFwiKzAuMlwiKS5zdGFydChcIiswLjRcIikuc3RvcChcIiswLjdcIilcblx0XHQgKlxuXHRcdCAqIC8vIEJBRFxuXHRcdCAqIHN0YXRlLnN0b3AoXCIrMC4yXCIpLnN0YXJ0KCk7XG5cdFx0ICogLy8gT1Jcblx0XHQgKiBzdGF0ZS5zdGFydChcIiswLjNcIikuc3RvcChcIiswLjJcIik7XG5cdFx0ICpcblx0XHQgKi9cblx0ICAgIFRvbmUuU291cmNlID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICBvcHRpb25zID0gVG9uZS5kZWZhdWx0QXJnKG9wdGlvbnMsIFRvbmUuU291cmNlLmRlZmF1bHRzKTtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBvdXRwdXQgdm9sdW1lIG5vZGVcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuVm9sdW1lfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl92b2x1bWUgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLlZvbHVtZShvcHRpb25zLnZvbHVtZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgdm9sdW1lIG9mIHRoZSBvdXRwdXQgaW4gZGVjaWJlbHMuXG5cdFx0XHQgKiBAdHlwZSB7RGVjaWJlbHN9XG5cdFx0XHQgKiBAc2lnbmFsXG5cdFx0XHQgKiBAZXhhbXBsZVxuXHRcdFx0ICogc291cmNlLnZvbHVtZS52YWx1ZSA9IC02O1xuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy52b2x1bWUgPSB0aGlzLl92b2x1bWUudm9sdW1lO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KCd2b2x1bWUnKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFx0S2VlcCB0cmFjayBvZiB0aGUgc2NoZWR1bGVkIHN0YXRlLlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlRpbWVsaW5lU3RhdGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N0YXRlID0gbmV3IFRvbmUuVGltZWxpbmVTdGF0ZShUb25lLlN0YXRlLlN0b3BwZWQpO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLm1lbW9yeSA9IDEwMDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgc3luY2VkIGBzdGFydGAgY2FsbGJhY2sgZnVuY3Rpb24gZnJvbSB0aGUgdHJhbnNwb3J0XG5cdFx0XHQgKiAgQHR5cGUge0Z1bmN0aW9ufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zeW5jZWQgPSBmYWxzZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBLZWVwIHRyYWNrIG9mIGFsbCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IGlkc1xuXHRcdFx0ICogIEB0eXBlICB7QXJyYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IFtdO1xuXHQgICAgICAgIC8vbWFrZSB0aGUgb3V0cHV0IGV4cGxpY2l0bHkgc3RlcmVvXG5cdCAgICAgICAgdGhpcy5fdm9sdW1lLm91dHB1dC5vdXRwdXQuY2hhbm5lbENvdW50ID0gMjtcblx0ICAgICAgICB0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnRNb2RlID0gJ2V4cGxpY2l0Jztcblx0ICAgICAgICAvL211dGUgaW5pdGlhbGx5XG5cdCAgICAgICAgdGhpcy5tdXRlID0gb3B0aW9ucy5tdXRlO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuU291cmNlLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGRlZmF1bHQgcGFyYW1ldGVyc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Tb3VyY2UuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3ZvbHVtZSc6IDAsXG5cdCAgICAgICAgJ211dGUnOiBmYWxzZVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgc291cmNlLCBlaXRoZXIgXCJzdGFydGVkXCIgb3IgXCJzdG9wcGVkXCIuXG5cdFx0ICogIEB0eXBlIHtUb25lLlN0YXRlfVxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuU291cmNlI1xuXHRcdCAqICBAbmFtZSBzdGF0ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuU291cmNlLnByb3RvdHlwZSwgJ3N0YXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc3luY2VkKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVG9uZS5UcmFuc3BvcnQuc3RhdGUgPT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShUb25lLlRyYW5zcG9ydC5zZWNvbmRzKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRvbmUuU3RhdGUuU3RvcHBlZDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aGlzLm5vdygpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogTXV0ZSB0aGUgb3V0cHV0LlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlNvdXJjZSNcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cblx0XHQgKiBAbmFtZSBtdXRlXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvL211dGUgdGhlIG91dHB1dFxuXHRcdCAqIHNvdXJjZS5tdXRlID0gdHJ1ZTtcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlNvdXJjZS5wcm90b3R5cGUsICdtdXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fdm9sdW1lLm11dGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtdXRlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3ZvbHVtZS5tdXRlID0gbXV0ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8vb3ZlcndyaXRlIHRoZXNlIGZ1bmN0aW9uc1xuXHQgICAgVG9uZS5Tb3VyY2UucHJvdG90eXBlLl9zdGFydCA9IFRvbmUubm9PcDtcblx0ICAgIFRvbmUuU291cmNlLnByb3RvdHlwZS5yZXN0YXJ0ID0gVG9uZS5ub09wO1xuXHQgICAgVG9uZS5Tb3VyY2UucHJvdG90eXBlLl9zdG9wID0gVG9uZS5ub09wO1xuXHQgICAgLyoqXG5cdFx0ICogIFN0YXJ0IHRoZSBzb3VyY2UgYXQgdGhlIHNwZWNpZmllZCB0aW1lLiBJZiBubyB0aW1lIGlzIGdpdmVuLFxuXHRcdCAqICBzdGFydCB0aGUgc291cmNlIG5vdy5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XSBXaGVuIHRoZSBzb3VyY2Ugc2hvdWxkIGJlIHN0YXJ0ZWQuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlNvdXJjZX0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHNvdXJjZS5zdGFydChcIiswLjVcIik7IC8vc3RhcnRzIHRoZSBzb3VyY2UgMC41IHNlY29uZHMgZnJvbSBub3dcblx0XHQgKi9cblx0ICAgIFRvbmUuU291cmNlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICh0aW1lLCBvZmZzZXQsIGR1cmF0aW9uKSB7XG5cdCAgICAgICAgaWYgKFRvbmUuaXNVbmRlZih0aW1lKSAmJiB0aGlzLl9zeW5jZWQpIHtcblx0ICAgICAgICAgICAgdGltZSA9IFRvbmUuVHJhbnNwb3J0LnNlY29uZHM7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL2lmIGl0J3Mgc3RhcnRlZCwgc3RvcCBpdCBhbmQgcmVzdGFydCBpdFxuXHQgICAgICAgIGlmICh0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aW1lKSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3N0YXRlLmNhbmNlbCh0aW1lKTtcblx0ICAgICAgICAgICAgdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUoVG9uZS5TdGF0ZS5TdGFydGVkLCB0aW1lKTtcblx0ICAgICAgICAgICAgdGhpcy5yZXN0YXJ0KHRpbWUsIG9mZnNldCwgZHVyYXRpb24pO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKFRvbmUuU3RhdGUuU3RhcnRlZCwgdGltZSk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zeW5jZWQpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgb2Zmc2V0IHRpbWUgdG8gdGhlIGV2ZW50XG5cdCAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSB0aGlzLl9zdGF0ZS5nZXQodGltZSk7XG5cdCAgICAgICAgICAgICAgICBldmVudC5vZmZzZXQgPSBUb25lLmRlZmF1bHRBcmcob2Zmc2V0LCAwKTtcblx0ICAgICAgICAgICAgICAgIGV2ZW50LmR1cmF0aW9uID0gZHVyYXRpb247XG5cdCAgICAgICAgICAgICAgICB2YXIgc2NoZWQgPSBUb25lLlRyYW5zcG9ydC5zY2hlZHVsZShmdW5jdGlvbiAodCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KHQsIG9mZnNldCwgZHVyYXRpb24pO1xuXHQgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCB0aW1lKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlZC5wdXNoKHNjaGVkKTtcblx0ICAgICAgICAgICAgICAgIC8vaWYgaXQncyBhbHJlYWR5IHN0YXJ0ZWRcblx0ICAgICAgICAgICAgICAgIGlmIChUb25lLlRyYW5zcG9ydC5zdGF0ZSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3luY2VkU3RhcnQodGhpcy5ub3coKSwgVG9uZS5UcmFuc3BvcnQuc2Vjb25kcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9zdGFydC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdG9wIHRoZSBzb3VyY2UgYXQgdGhlIHNwZWNpZmllZCB0aW1lLiBJZiBubyB0aW1lIGlzIGdpdmVuLFxuXHRcdCAqICBzdG9wIHRoZSBzb3VyY2Ugbm93LlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbdGltZT1ub3ddIFdoZW4gdGhlIHNvdXJjZSBzaG91bGQgYmUgc3RvcHBlZC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuU291cmNlfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogc291cmNlLnN0b3AoKTsgLy8gc3RvcHMgdGhlIHNvdXJjZSBpbW1lZGlhdGVseVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Tb3VyY2UucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIGlmIChUb25lLmlzVW5kZWYodGltZSkgJiYgdGhpcy5fc3luY2VkKSB7XG5cdCAgICAgICAgICAgIHRpbWUgPSBUb25lLlRyYW5zcG9ydC5zZWNvbmRzO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCF0aGlzLl9zeW5jZWQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc3RvcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBzY2hlZCA9IFRvbmUuVHJhbnNwb3J0LnNjaGVkdWxlKHRoaXMuX3N0b3AuYmluZCh0aGlzKSwgdGltZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlZC5wdXNoKHNjaGVkKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fc3RhdGUuY2FuY2VsKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKFRvbmUuU3RhdGUuU3RvcHBlZCwgdGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN5bmMgdGhlIHNvdXJjZSB0byB0aGUgVHJhbnNwb3J0IHNvIHRoYXQgYWxsIHN1YnNlcXVlbnRcblx0XHQgKiAgY2FsbHMgdG8gYHN0YXJ0YCBhbmQgYHN0b3BgIGFyZSBzeW5jZWQgdG8gdGhlIFRyYW5zcG9ydFRpbWVcblx0XHQgKiAgaW5zdGVhZCBvZiB0aGUgQXVkaW9Db250ZXh0IHRpbWUuXG5cdFx0ICpcblx0XHQgKiAgQHJldHVybnMge1RvbmUuU291cmNlfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9zeW5jIHRoZSBzb3VyY2Ugc28gdGhhdCBpdCBwbGF5cyBiZXR3ZWVuIDAgYW5kIDAuMyBvbiB0aGUgVHJhbnNwb3J0J3MgdGltZWxpbmVcblx0XHQgKiBzb3VyY2Uuc3luYygpLnN0YXJ0KDApLnN0b3AoMC4zKTtcblx0XHQgKiAvL3N0YXJ0IHRoZSB0cmFuc3BvcnQuXG5cdFx0ICogVG9uZS5UcmFuc3BvcnQuc3RhcnQoKTtcblx0XHQgKlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vc3RhcnQgdGhlIHRyYW5zcG9ydCB3aXRoIGFuIG9mZnNldCBhbmQgdGhlIHN5bmMnZWQgc291cmNlc1xuXHRcdCAqIC8vd2lsbCBzdGFydCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuXHRcdCAqIHNvdXJjZS5zeW5jKCkuc3RhcnQoMC4xKTtcblx0XHQgKiAvL3RoZSBzb3VyY2Ugd2lsbCBiZSBpbnZva2VkIHdpdGggYW4gb2Zmc2V0IG9mIDAuNFxuXHRcdCAqIFRvbmUuVHJhbnNwb3J0LnN0YXJ0KFwiKzAuNVwiLCAwLjUpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Tb3VyY2UucHJvdG90eXBlLnN5bmMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5fc3luY2VkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLl9zeW5jZWRTdGFydCA9IGZ1bmN0aW9uICh0aW1lLCBvZmZzZXQpIHtcblx0ICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcblx0ICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcGxheWJhY2sgc3RhdGUgYXQgdGhhdCB0aW1lXG5cdCAgICAgICAgICAgICAgICB2YXIgc3RhdGVFdmVudCA9IHRoaXMuX3N0YXRlLmdldChvZmZzZXQpO1xuXHQgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBzdGFydCBldmVudHMgd2hpY2ggbWF5IG9jY3VyIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN5bmMnZWQgdGltZVxuXHQgICAgICAgICAgICAgICAgaWYgKHN0YXRlRXZlbnQgJiYgc3RhdGVFdmVudC5zdGF0ZSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkICYmIHN0YXRlRXZlbnQudGltZSAhPT0gb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBvZmZzZXRcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRPZmZzZXQgPSBvZmZzZXQgLSB0aGlzLnRvU2Vjb25kcyhzdGF0ZUV2ZW50LnRpbWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBkdXJhdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVFdmVudC5kdXJhdGlvbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHRoaXMudG9TZWNvbmRzKHN0YXRlRXZlbnQuZHVyYXRpb24pIC0gc3RhcnRPZmZzZXQ7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KHRpbWUsIHRoaXMudG9TZWNvbmRzKHN0YXRlRXZlbnQub2Zmc2V0KSArIHN0YXJ0T2Zmc2V0LCBkdXJhdGlvbik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LmJpbmQodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc3luY2VkU3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgICAgIHZhciBzZWNvbmRzID0gVG9uZS5UcmFuc3BvcnQuZ2V0U2Vjb25kc0F0VGltZShNYXRoLm1heCh0aW1lIC0gdGhpcy5zYW1wbGVUaW1lLCAwKSk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZShzZWNvbmRzKSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9zdG9wKHRpbWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpO1xuXHQgICAgICAgIFRvbmUuVHJhbnNwb3J0Lm9uKCdzdGFydCBsb29wU3RhcnQnLCB0aGlzLl9zeW5jZWRTdGFydCk7XG5cdCAgICAgICAgVG9uZS5UcmFuc3BvcnQub24oJ3N0b3AgcGF1c2UgbG9vcEVuZCcsIHRoaXMuX3N5bmNlZFN0b3ApO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBVbnN5bmMgdGhlIHNvdXJjZSB0byB0aGUgVHJhbnNwb3J0LiBTZWUgVG9uZS5Tb3VyY2Uuc3luY1xuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Tb3VyY2V9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuU291cmNlLnByb3RvdHlwZS51bnN5bmMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX3N5bmNlZCkge1xuXHQgICAgICAgICAgICBUb25lLlRyYW5zcG9ydC5vZmYoJ3N0b3AgcGF1c2UgbG9vcEVuZCcsIHRoaXMuX3N5bmNlZFN0b3ApO1xuXHQgICAgICAgICAgICBUb25lLlRyYW5zcG9ydC5vZmYoJ3N0YXJ0IGxvb3BTdGFydCcsIHRoaXMuX3N5bmNlZFN0YXJ0KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fc3luY2VkID0gZmFsc2U7XG5cdCAgICAgICAgLy8gY2xlYXIgYWxsIG9mIHRoZSBzY2hlZHVsZWQgaWRzXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zY2hlZHVsZWQubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5fc2NoZWR1bGVkW2ldO1xuXHQgICAgICAgICAgICBUb25lLlRyYW5zcG9ydC5jbGVhcihpZCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IFtdO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLmNhbmNlbCgwKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKlx0Q2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuU291cmNlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMudW5zeW5jKCk7XG5cdCAgICAgICAgdGhpcy5fc2NoZWR1bGVkID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZSgndm9sdW1lJyk7XG5cdCAgICAgICAgdGhpcy5fdm9sdW1lLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl92b2x1bWUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMudm9sdW1lID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUgPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlNvdXJjZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogIEF1ZGlvQnVmZmVyLmNvcHlUby9Gcm9tQ2hhbm5lbCBwb2x5ZmlsbFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgaWYgKFRvbmUuc3VwcG9ydGVkKSB7XG5cdCAgICAgICAgaWYgKCFBdWRpb0J1ZmZlci5wcm90b3R5cGUuY29weVRvQ2hhbm5lbCkge1xuXHQgICAgICAgICAgICBBdWRpb0J1ZmZlci5wcm90b3R5cGUuY29weVRvQ2hhbm5lbCA9IGZ1bmN0aW9uIChzcmMsIGNoYW5OdW0sIHN0YXJ0KSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2hhbm5lbCA9IHRoaXMuZ2V0Q2hhbm5lbERhdGEoY2hhbk51bSk7XG5cdCAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5uZWwubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBjaGFubmVsW2kgKyBzdGFydF0gPSBzcmNbaV07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIEF1ZGlvQnVmZmVyLnByb3RvdHlwZS5jb3B5RnJvbUNoYW5uZWwgPSBmdW5jdGlvbiAoZGVzdCwgY2hhbk51bSwgc3RhcnQpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjaGFubmVsID0gdGhpcy5nZXRDaGFubmVsRGF0YShjaGFuTnVtKTtcblx0ICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVzdC5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBjaGFubmVsW2kgKyBzdGFydF07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIEJ1ZmZlciBsb2FkaW5nIGFuZCBzdG9yYWdlLiBUb25lLkJ1ZmZlciBpcyB1c2VkIGludGVybmFsbHkgYnkgYWxsXG5cdFx0ICogICAgICAgICAgY2xhc3NlcyB0aGF0IG1ha2UgcmVxdWVzdHMgZm9yIGF1ZGlvIGZpbGVzIHN1Y2ggYXMgVG9uZS5QbGF5ZXIsXG5cdFx0ICogICAgICAgICAgVG9uZS5TYW1wbGVyIGFuZCBUb25lLkNvbnZvbHZlci5cblx0XHQgKlxuXHRcdCAqICAgICAgICAgIEFzaWRlIGZyb20gbG9hZCBjYWxsYmFja3MgZnJvbSBpbmRpdmlkdWFsIGJ1ZmZlcnMsIFRvbmUuQnVmZmVyXG5cdFx0ICogIFx0XHRwcm92aWRlcyBldmVudHMgd2hpY2gga2VlcCB0cmFjayBvZiB0aGUgbG9hZGluZyBwcm9ncmVzc1xuXHRcdCAqICBcdFx0b2YgX2FsbF8gb2YgdGhlIGJ1ZmZlcnMuIFRoZXNlIGFyZSBUb25lLkJ1ZmZlci5vbihcImxvYWRcIiAvIFwicHJvZ3Jlc3NcIiAvIFwiZXJyb3JcIilcblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmV9XG5cdFx0ICogIEBwYXJhbSB7QXVkaW9CdWZmZXJ8U3RyaW5nfSB1cmwgVGhlIHVybCB0byBsb2FkLCBvciB0aGUgYXVkaW8gYnVmZmVyIHRvIHNldC5cblx0XHQgKiAgQHBhcmFtIHtGdW5jdGlvbj19IG9ubG9hZCBBIGNhbGxiYWNrIHdoaWNoIGlzIGludm9rZWQgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyBsb2FkZWQuXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQncyByZWNvbW1lbmRlZCB0byB1c2UgYFRvbmUuQnVmZmVyLm9uKCdsb2FkJywgY2FsbGJhY2spYCBpbnN0ZWFkXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luY2UgaXQgd2lsbCBnaXZlIHlvdSBhIGNhbGxiYWNrIHdoZW4gX2FsbF8gYnVmZmVycyBhcmUgbG9hZGVkLlxuXHRcdCAqICBAcGFyYW0ge0Z1bmN0aW9uPX0gb25lcnJvciBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGlmIHRoZXJlIGlzIGFuIGVycm9yXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIGJ1ZmZlciA9IG5ldyBUb25lLkJ1ZmZlcihcInBhdGgvdG8vc291bmQubXAzXCIsIGZ1bmN0aW9uKCl7XG5cdFx0ICogXHQvL3RoZSBidWZmZXIgaXMgbm93IGF2YWlsYWJsZS5cblx0XHQgKiBcdHZhciBidWZmID0gYnVmZmVyLmdldCgpO1xuXHRcdCAqIH0pO1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vY2FuIGxvYWQgcHJvdmlkZSBmYWxsYmFjayBleHRlbnNpb24gdHlwZXMgaWYgdGhlIGZpcnN0IHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cblx0XHQgKiB2YXIgYnVmZmVyID0gbmV3IFRvbmUuQnVmZmVyKFwicGF0aC90by9zb3VuZC5bbXAzfG9nZ3x3YXZdXCIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAndXJsJyxcblx0ICAgICAgICAgICAgJ29ubG9hZCcsXG5cdCAgICAgICAgICAgICdvbmVycm9yJ1xuXHQgICAgICAgIF0sIFRvbmUuQnVmZmVyKTtcblx0ICAgICAgICBUb25lLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgc3RvcmVzIHRoZSBsb2FkZWQgQXVkaW9CdWZmZXJcblx0XHRcdCAqICBAdHlwZSB7QXVkaW9CdWZmZXJ9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2J1ZmZlciA9IG51bGw7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgaW5kaWNhdGVzIGlmIHRoZSBidWZmZXIgc2hvdWxkIGJlIHJldmVyc2VkIG9yIG5vdFxuXHRcdFx0ICogIEB0eXBlIHtCb29sZWFufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9yZXZlcnNlZCA9IG9wdGlvbnMucmV2ZXJzZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgWEhSXG5cdFx0XHQgKiAgQHR5cGUgIHtYTUxIdHRwUmVxdWVzdH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFByaXZhdGUgY2FsbGJhY2sgd2hlbiB0aGUgYnVmZmVyIGlzIGxvYWRlZC5cblx0XHRcdCAqIEB0eXBlIHtGdW5jdGlvbn1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vbmxvYWQgPSBUb25lLm5vT3A7XG5cdCAgICAgICAgaWYgKG9wdGlvbnMudXJsIGluc3RhbmNlb2YgQXVkaW9CdWZmZXIgfHwgb3B0aW9ucy51cmwgaW5zdGFuY2VvZiBUb25lLkJ1ZmZlcikge1xuXHQgICAgICAgICAgICB0aGlzLnNldChvcHRpb25zLnVybCk7XG5cdCAgICAgICAgICAgIC8vIGludm9rZSB0aGUgb25sb2FkIGNhbGxiYWNrXG5cdCAgICAgICAgICAgIGlmIChvcHRpb25zLm9ubG9hZCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMubG9hZGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbmxvYWQodGhpcyk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX29ubG9hZCA9IG9wdGlvbnMub25sb2FkO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIGlmIChUb25lLmlzU3RyaW5nKG9wdGlvbnMudXJsKSkge1xuXHQgICAgICAgICAgICB0aGlzLmxvYWQob3B0aW9ucy51cmwpLnRoZW4ob3B0aW9ucy5vbmxvYWQpLmNhdGNoKG9wdGlvbnMub25lcnJvcik7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQnVmZmVyKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAndXJsJzogdW5kZWZpbmVkLFxuXHQgICAgICAgICdyZXZlcnNlJzogZmFsc2UsXG5cdCAgICAgICAgJ29ubG9hZCc6IFRvbmUubm9PcCxcblx0ICAgICAgICAnb25lcnJvcic6IFRvbmUubm9PcFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBQYXNzIGluIGFuIEF1ZGlvQnVmZmVyIG9yIFRvbmUuQnVmZmVyIHRvIHNldCB0aGUgdmFsdWVcblx0XHQgKiAgb2YgdGhpcyBidWZmZXIuXG5cdFx0ICogIEBwYXJhbSB7QXVkaW9CdWZmZXJ8VG9uZS5CdWZmZXJ9IGJ1ZmZlciB0aGUgYnVmZmVyXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkJ1ZmZlcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChidWZmZXIpIHtcblx0ICAgICAgICBpZiAoYnVmZmVyIGluc3RhbmNlb2YgVG9uZS5CdWZmZXIpIHtcblx0ICAgICAgICAgICAgaWYgKGJ1ZmZlci5sb2FkZWQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmZlciA9IGJ1ZmZlci5nZXQoKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGJ1ZmZlci5fb25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGJ1ZmZlcik7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25sb2FkKHRoaXMpO1xuXHQgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVyID0gYnVmZmVyO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQHJldHVybiB7QXVkaW9CdWZmZXJ9IFRoZSBhdWRpbyBidWZmZXIgc3RvcmVkIGluIHRoZSBvYmplY3QuXG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIE1ha2VzIGFuIHhociByZXFlc3QgZm9yIHRoZSBzZWxlY3RlZCB1cmwgdGhlbiBkZWNvZGVzXG5cdFx0ICogIHRoZSBmaWxlIGFzIGFuIGF1ZGlvIGJ1ZmZlci4gSW52b2tlc1xuXHRcdCAqICB0aGUgY2FsbGJhY2sgb25jZSB0aGUgYXVkaW8gYnVmZmVyIGxvYWRzLlxuXHRcdCAqICBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSB1cmwgb2YgdGhlIGJ1ZmZlciB0byBsb2FkLlxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgIGZpbGV0eXBlIHN1cHBvcnQgZGVwZW5kcyBvbiB0aGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICBicm93c2VyLlxuXHRcdCAqICBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyBhIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgVG9uZS5CdWZmZXJcblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKHVybCwgb25sb2FkLCBvbmVycm9yKSB7XG5cdCAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAobG9hZCwgZXJyb3IpIHtcblx0ICAgICAgICAgICAgdGhpcy5feGhyID0gVG9uZS5CdWZmZXIubG9hZCh1cmwsIC8vc3VjY2Vzc1xuXHQgICAgICAgICAgICBmdW5jdGlvbiAoYnVmZikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIHRoaXMuc2V0KGJ1ZmYpO1xuXHQgICAgICAgICAgICAgICAgbG9hZCh0aGlzKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX29ubG9hZCh0aGlzKTtcblx0ICAgICAgICAgICAgICAgIGlmIChvbmxvYWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvbmxvYWQodGhpcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgLy9lcnJvclxuXHQgICAgICAgICAgICBmdW5jdGlvbiAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl94aHIgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgZXJyb3IoZXJyKTtcblx0ICAgICAgICAgICAgICAgIGlmIChvbmVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb25lcnJvcihlcnIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICAgICAgcmV0dXJuIHByb21pc2U7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGRpc3Bvc2UgYW5kIGRpc2Nvbm5lY3Rcblx0XHQgKiAgQHJldHVybnMge1RvbmUuQnVmZmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fYnVmZmVyID0gbnVsbDtcblx0ICAgICAgICBpZiAodGhpcy5feGhyKSB7XG5cdCAgICAgICAgICAgIFRvbmUuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZSh0aGlzLl94aHIpO1xuXHQgICAgICAgICAgICB0aGlzLl94aHIuYWJvcnQoKTtcblx0ICAgICAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogSWYgdGhlIGJ1ZmZlciBpcyBsb2FkZWQgb3Igbm90XG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQnVmZmVyI1xuXHRcdCAqIEB0eXBlIHtCb29sZWFufVxuXHRcdCAqIEBuYW1lIGxvYWRlZFxuXHRcdCAqIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQnVmZmVyLnByb3RvdHlwZSwgJ2xvYWRlZCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gMDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgYnVmZmVyLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkJ1ZmZlciNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIGR1cmF0aW9uXG5cdFx0ICogQHJlYWRPbmx5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5CdWZmZXIucHJvdG90eXBlLCAnZHVyYXRpb24nLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9idWZmZXIpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIuZHVyYXRpb247XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gMDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGluIHNhbXBsZXNcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5CdWZmZXIjXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKiBAbmFtZSBsZW5ndGhcblx0XHQgKiBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkJ1ZmZlci5wcm90b3R5cGUsICdsZW5ndGgnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9idWZmZXIpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIubGVuZ3RoO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBudW1iZXIgb2YgZGlzY3JldGUgYXVkaW8gY2hhbm5lbHMuIFJldHVybnMgMCBpZiBubyBidWZmZXJcblx0XHQgKiBpcyBsb2FkZWQuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQnVmZmVyI1xuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogQG5hbWUgbnVtYmVyT2ZDaGFubmVsc1xuXHRcdCAqIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQnVmZmVyLnByb3RvdHlwZSwgJ251bWJlck9mQ2hhbm5lbHMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9idWZmZXIpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIubnVtYmVyT2ZDaGFubmVscztcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgU2V0IHRoZSBhdWRpbyBidWZmZXIgZnJvbSB0aGUgYXJyYXkuIFRvIGNyZWF0ZSBhIG11bHRpY2hhbm5lbCBBdWRpb0J1ZmZlcixcblx0XHQgKiAgcGFzcyBpbiBhIG11bHRpZGltZW5zaW9uYWwgYXJyYXkuXG5cdFx0ICogIEBwYXJhbSB7RmxvYXQzMkFycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbCB0aGUgYXVkaW8gYnVmZmVyXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuQnVmZmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5wcm90b3R5cGUuZnJvbUFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG5cdCAgICAgICAgdmFyIGlzTXVsdGlkaW1lbnNpb25hbCA9IGFycmF5WzBdLmxlbmd0aCA+IDA7XG5cdCAgICAgICAgdmFyIGNoYW5uZWxzID0gaXNNdWx0aWRpbWVuc2lvbmFsID8gYXJyYXkubGVuZ3RoIDogMTtcblx0ICAgICAgICB2YXIgbGVuID0gaXNNdWx0aWRpbWVuc2lvbmFsID8gYXJyYXlbMF0ubGVuZ3RoIDogYXJyYXkubGVuZ3RoO1xuXHQgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKGNoYW5uZWxzLCBsZW4sIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcblx0ICAgICAgICBpZiAoIWlzTXVsdGlkaW1lbnNpb25hbCAmJiBjaGFubmVscyA9PT0gMSkge1xuXHQgICAgICAgICAgICBhcnJheSA9IFthcnJheV07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykge1xuXHQgICAgICAgICAgICBidWZmZXIuY29weVRvQ2hhbm5lbChhcnJheVtjXSwgYyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2J1ZmZlciA9IGJ1ZmZlcjtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBcdFN1bXMgbXVsaXBsZSBjaGFubmVscyBpbnRvIDEgY2hhbm5lbFxuXHRcdCAqICBAcGFyYW0ge051bWJlcj19IGNoYW5uZWwgT3B0aW9uYWxseSBvbmx5IGNvcHkgYSBzaW5nbGUgY2hhbm5lbCBmcm9tIHRoZSBhcnJheS5cblx0XHQgKiAgQHJldHVybiB7QXJyYXl9XG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5wcm90b3R5cGUudG9Nb25vID0gZnVuY3Rpb24gKGNoYW5OdW0pIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc051bWJlcihjaGFuTnVtKSkge1xuXHQgICAgICAgICAgICB0aGlzLmZyb21BcnJheSh0aGlzLnRvQXJyYXkoY2hhbk51bSkpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBvdXRwdXRBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5sZW5ndGgpO1xuXHQgICAgICAgICAgICB2YXIgbnVtQ2hhbm5lbHMgPSB0aGlzLm51bWJlck9mQ2hhbm5lbHM7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbnVtQ2hhbm5lbHM7IGNoYW5uZWwrKykge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNoYW5uZWxBcnJheSA9IHRoaXMudG9BcnJheShjaGFubmVsKTtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbm5lbEFycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3V0cHV0QXJyYXlbaV0gKz0gY2hhbm5lbEFycmF5W2ldO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vZGl2aWRlIGJ5IHRoZSBudW1iZXIgb2YgY2hhbm5lbHNcblx0ICAgICAgICAgICAgb3V0cHV0QXJyYXkgPSBvdXRwdXRBcnJheS5tYXAoZnVuY3Rpb24gKHNhbXBsZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHNhbXBsZSAvIG51bUNoYW5uZWxzO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgdGhpcy5mcm9tQXJyYXkob3V0cHV0QXJyYXkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBcdEdldCB0aGUgYnVmZmVyIGFzIGFuIGFycmF5LiBTaW5nbGUgY2hhbm5lbCBidWZmZXJzIHdpbGwgcmV0dXJuIGEgMS1kaW1lbnNpb25hbFxuXHRcdCAqIFx0RmxvYXQzMkFycmF5LCBhbmQgbXVsdGljaGFubmVsIGJ1ZmZlcnMgd2lsbCByZXR1cm4gbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuXG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyPX0gY2hhbm5lbCBPcHRpb25hbGx5IG9ubHkgY29weSBhIHNpbmdsZSBjaGFubmVsIGZyb20gdGhlIGFycmF5LlxuXHRcdCAqICBAcmV0dXJuIHtBcnJheX1cblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVyLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKGNoYW5uZWwpIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc051bWJlcihjaGFubmVsKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGFubmVsRGF0YShjaGFubmVsKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHRoaXMubnVtYmVyT2ZDaGFubmVscyA9PT0gMSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5KDApO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciByZXQgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0aGlzLm51bWJlck9mQ2hhbm5lbHM7IGMrKykge1xuXHQgICAgICAgICAgICAgICAgcmV0W2NdID0gdGhpcy5nZXRDaGFubmVsRGF0YShjKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gcmV0O1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgRmxvYXQzMkFycmF5IHJlcHJlc2VudGluZyB0aGUgUENNIGF1ZGlvIGRhdGEgZm9yIHRoZSBzcGVjaWZpYyBjaGFubmVsLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICBjaGFubmVsICBUaGUgY2hhbm5lbCBudW1iZXIgdG8gcmV0dXJuXG5cdFx0ICogIEByZXR1cm4gIHtGbG9hdDMyQXJyYXl9ICBUaGUgYXVkaW8gYXMgYSBUeXBlZEFycmF5XG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5wcm90b3R5cGUuZ2V0Q2hhbm5lbERhdGEgPSBmdW5jdGlvbiAoY2hhbm5lbCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2hhbm5lbCk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEN1dCBhIHN1YnNlY3Rpb24gb2YgdGhlIGFycmF5IGFuZCByZXR1cm4gYSBidWZmZXIgb2YgdGhlXG5cdFx0ICogIHN1YnNlY3Rpb24uIERvZXMgbm90IG1vZGlmeSB0aGUgb3JpZ2luYWwgYnVmZmVyXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gc3RhcnQgVGhlIHRpbWUgdG8gc3RhcnQgdGhlIHNsaWNlXG5cdFx0ICogIEBwYXJhbSB7VGltZT19IGVuZCBUaGUgZW5kIHRpbWUgdG8gc2xpY2UuIElmIG5vbmUgaXMgZ2l2ZW5cblx0XHQgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgZGVmYXVsdCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXJcblx0XHQgKiAgQHJldHVybiB7VG9uZS5CdWZmZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG5cdCAgICAgICAgZW5kID0gVG9uZS5kZWZhdWx0QXJnKGVuZCwgdGhpcy5kdXJhdGlvbik7XG5cdCAgICAgICAgdmFyIHN0YXJ0U2FtcGxlcyA9IE1hdGguZmxvb3IodGhpcy5jb250ZXh0LnNhbXBsZVJhdGUgKiB0aGlzLnRvU2Vjb25kcyhzdGFydCkpO1xuXHQgICAgICAgIHZhciBlbmRTYW1wbGVzID0gTWF0aC5mbG9vcih0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZSAqIHRoaXMudG9TZWNvbmRzKGVuZCkpO1xuXHQgICAgICAgIHZhciByZXBsYWNlbWVudCA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5udW1iZXJPZkNoYW5uZWxzOyBpKyspIHtcblx0ICAgICAgICAgICAgcmVwbGFjZW1lbnRbaV0gPSB0aGlzLnRvQXJyYXkoaSkuc2xpY2Uoc3RhcnRTYW1wbGVzLCBlbmRTYW1wbGVzKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHJldEJ1ZmZlciA9IG5ldyBUb25lLkJ1ZmZlcigpLmZyb21BcnJheShyZXBsYWNlbWVudCk7XG5cdCAgICAgICAgcmV0dXJuIHJldEJ1ZmZlcjtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV2ZXJzZSB0aGUgYnVmZmVyLlxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqICBAcmV0dXJuIHtUb25lLkJ1ZmZlcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXIucHJvdG90eXBlLl9yZXZlcnNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmxvYWRlZCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZDaGFubmVsczsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUucmV2ZXJzZS5jYWxsKHRoaXMuZ2V0Q2hhbm5lbERhdGEoaSkpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFJldmVyc2UgdGhlIGJ1ZmZlci5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5CdWZmZXIjXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XG5cdFx0ICogQG5hbWUgcmV2ZXJzZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQnVmZmVyLnByb3RvdHlwZSwgJ3JldmVyc2UnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXZlcnNlZDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJldikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fcmV2ZXJzZWQgIT09IHJldikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fcmV2ZXJzZWQgPSByZXY7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9yZXZlcnNlKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8gU1RBVElDIE1FVEhPRFNcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9zdGF0aWNhbGx5IGluaGVyaXRzIEVtaXR0ZXIgbWV0aG9kc1xuXHQgICAgVG9uZS5FbWl0dGVyLm1peGluKFRvbmUuQnVmZmVyKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgc3RhdGljIHF1ZXVlIGZvciBhbGwgb2YgdGhlIHhociByZXF1ZXN0c1xuXHRcdCAqICBAdHlwZSB7QXJyYXl9XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5fZG93bmxvYWRRdWV1ZSA9IFtdO1xuXHQgICAgLyoqXG5cdFx0ICogIEEgcGF0aCB3aGljaCBpcyBwcmVmaXhlZCBiZWZvcmUgZXZlcnkgdXJsLlxuXHRcdCAqICBAdHlwZSAge1N0cmluZ31cblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXIuYmFzZVVybCA9ICcnO1xuXHQgICAgLyoqXG5cdFx0ICogIENyZWF0ZSBhIFRvbmUuQnVmZmVyIGZyb20gdGhlIGFycmF5LiBUbyBjcmVhdGUgYSBtdWx0aWNoYW5uZWwgQXVkaW9CdWZmZXIsXG5cdFx0ICogIHBhc3MgaW4gYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5LlxuXHRcdCAqICBAcGFyYW0ge0Zsb2F0MzJBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwgdGhlIGF1ZGlvIGJ1ZmZlclxuXHRcdCAqICBAcmV0dXJuIHtUb25lLkJ1ZmZlcn0gQSBUb25lLkJ1ZmZlciBjcmVhdGVkIGZyb20gdGhlIGFycmF5XG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5mcm9tQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcblx0ICAgICAgICByZXR1cm4gbmV3IFRvbmUuQnVmZmVyKCkuZnJvbUFycmF5KGFycmF5KTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBDcmVhdGVzIGEgVG9uZS5CdWZmZXIgZnJvbSBhIFVSTCwgcmV0dXJucyBhIHByb21pc2Vcblx0XHQgKiB3aGljaCByZXNvbHZlcyB0byBhIFRvbmUuQnVmZmVyXG5cdFx0ICogQHBhcmFtICB7U3RyaW5nfSB1cmwgVGhlIHVybCB0byBsb2FkLlxuXHRcdCAqIEByZXR1cm4ge1Byb21pc2U8VG9uZS5CdWZmZXI+fSAgICAgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGEgVG9uZS5CdWZmZXJcblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVyLmZyb21VcmwgPSBmdW5jdGlvbiAodXJsKSB7XG5cdCAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBUb25lLkJ1ZmZlcigpO1xuXHQgICAgICAgIHJldHVybiBidWZmZXIubG9hZCh1cmwpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFJlbW92ZSBhbiB4aHIgcmVxdWVzdCBmcm9tIHRoZSBkb3dubG9hZCBxdWV1ZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5fcmVtb3ZlRnJvbURvd25sb2FkUXVldWUgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuXHQgICAgICAgIHZhciBpbmRleCA9IFRvbmUuQnVmZmVyLl9kb3dubG9hZFF1ZXVlLmluZGV4T2YocmVxdWVzdCk7XG5cdCAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICBUb25lLkJ1ZmZlci5fZG93bmxvYWRRdWV1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgTG9hZHMgYSB1cmwgdXNpbmcgWE1MSHR0cFJlcXVlc3QuXG5cdFx0ICogIEBwYXJhbSB7U3RyaW5nfSB1cmxcblx0XHQgKiAgQHBhcmFtIHtGdW5jdGlvbn0gb25sb2FkXG5cdFx0ICogIEBwYXJhbSB7RnVuY3Rpb259IG9uZXJyb3Jcblx0XHQgKiAgQHBhcmFtIHtGdW5jdGlvbn0gb25wcm9ncmVzc1xuXHRcdCAqICBAcmV0dXJuIHtYTUxIdHRwUmVxdWVzdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVyLmxvYWQgPSBmdW5jdGlvbiAodXJsLCBvbmxvYWQsIG9uZXJyb3IpIHtcblx0ICAgICAgICAvL2RlZmF1bHRcblx0ICAgICAgICBvbmxvYWQgPSBUb25lLmRlZmF1bHRBcmcob25sb2FkLCBUb25lLm5vT3ApO1xuXHQgICAgICAgIC8vIHRlc3QgaWYgdGhlIHVybCBjb250YWlucyBtdWx0aXBsZSBleHRlbnNpb25zXG5cdCAgICAgICAgdmFyIG1hdGNoZXMgPSB1cmwubWF0Y2goL1xcWyguK1xcfD8pK1xcXSQvKTtcblx0ICAgICAgICBpZiAobWF0Y2hlcykge1xuXHQgICAgICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IG1hdGNoZXNbMV0uc3BsaXQoJ3wnKTtcblx0ICAgICAgICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbMF07XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgaWYgKFRvbmUuQnVmZmVyLnN1cHBvcnRzVHlwZShleHRlbnNpb25zW2ldKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UobWF0Y2hlc1swXSwgZXh0ZW5zaW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gb25FcnJvcihlKSB7XG5cdCAgICAgICAgICAgIFRvbmUuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZShyZXF1ZXN0KTtcblx0ICAgICAgICAgICAgVG9uZS5CdWZmZXIuZW1pdCgnZXJyb3InLCBlKTtcblx0ICAgICAgICAgICAgaWYgKG9uZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgIG9uZXJyb3IoZSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZ1bmN0aW9uIG9uUHJvZ3Jlc3MoKSB7XG5cdCAgICAgICAgICAgIC8vY2FsY3VsYXRlIHRoZSBwcm9ncmVzc1xuXHQgICAgICAgICAgICB2YXIgdG90YWxQcm9ncmVzcyA9IDA7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgVG9uZS5CdWZmZXIuX2Rvd25sb2FkUXVldWUubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHRvdGFsUHJvZ3Jlc3MgKz0gVG9uZS5CdWZmZXIuX2Rvd25sb2FkUXVldWVbaV0ucHJvZ3Jlc3M7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgVG9uZS5CdWZmZXIuZW1pdCgncHJvZ3Jlc3MnLCB0b3RhbFByb2dyZXNzIC8gVG9uZS5CdWZmZXIuX2Rvd25sb2FkUXVldWUubGVuZ3RoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0ICAgICAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIFRvbmUuQnVmZmVyLmJhc2VVcmwgKyB1cmwsIHRydWUpO1xuXHQgICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcblx0ICAgICAgICAvL3N0YXJ0IG91dCBhcyAwXG5cdCAgICAgICAgcmVxdWVzdC5wcm9ncmVzcyA9IDA7XG5cdCAgICAgICAgVG9uZS5CdWZmZXIuX2Rvd25sb2FkUXVldWUucHVzaChyZXF1ZXN0KTtcblx0ICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG5cdCAgICAgICAgICAgICAgICBUb25lLmNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKHJlcXVlc3QucmVzcG9uc2UpLnRoZW4oZnVuY3Rpb24gKGJ1ZmYpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnByb2dyZXNzID0gMTtcblx0ICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNzKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgb25sb2FkKGJ1ZmYpO1xuXHQgICAgICAgICAgICAgICAgICAgIFRvbmUuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZShyZXF1ZXN0KTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoVG9uZS5CdWZmZXIuX2Rvd25sb2FkUXVldWUubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vZW1pdCB0aGUgZXZlbnQgYXQgdGhlIGVuZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBUb25lLkJ1ZmZlci5lbWl0KCdsb2FkJyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgIFRvbmUuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZShyZXF1ZXN0KTtcblx0ICAgICAgICAgICAgICAgICAgICBvbkVycm9yKCdUb25lLkJ1ZmZlcjogY291bGQgbm90IGRlY29kZSBhdWRpbyBkYXRhOiAnICsgdXJsKTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgb25FcnJvcignVG9uZS5CdWZmZXI6IGNvdWxkIG5vdCBsb2NhdGUgZmlsZTogJyArIHVybCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG5cdCAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkge1xuXHQgICAgICAgICAgICAgICAgLy9vbmx5IGdvIHRvIDk1JSwgdGhlIGxhc3QgNSUgaXMgd2hlbiB0aGUgYXVkaW8gaXMgZGVjb2RlZFxuXHQgICAgICAgICAgICAgICAgcmVxdWVzdC5wcm9ncmVzcyA9IGV2ZW50LmxvYWRlZCAvIGV2ZW50LnRvdGFsICogMC45NTtcblx0ICAgICAgICAgICAgICAgIG9uUHJvZ3Jlc3MoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJlcXVlc3Quc2VuZCgpO1xuXHQgICAgICAgIHJldHVybiByZXF1ZXN0O1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdG9wIGFsbCBvZiB0aGUgZG93bmxvYWRzIGluIHByb2dyZXNzXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuQnVmZmVyfVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlci5jYW5jZWxEb3dubG9hZHMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5CdWZmZXIuX2Rvd25sb2FkUXVldWUuc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG5cdCAgICAgICAgICAgIFRvbmUuQnVmZmVyLl9yZW1vdmVGcm9tRG93bmxvYWRRdWV1ZShyZXF1ZXN0KTtcblx0ICAgICAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBUb25lLkJ1ZmZlcjtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2hlY2tzIGEgdXJsJ3MgZXh0ZW5zaW9uIHRvIHNlZSBpZiB0aGUgY3VycmVudCBicm93c2VyIGNhbiBwbGF5IHRoYXQgZmlsZSB0eXBlLlxuXHRcdCAqICBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSB1cmwvZXh0ZW5zaW9uIHRvIHRlc3Rcblx0XHQgKiAgQHJldHVybiB7Qm9vbGVhbn0gSWYgdGhlIGZpbGUgZXh0ZW5zaW9uIGNhbiBiZSBwbGF5ZWRcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIFRvbmUuQnVmZmVyLnN1cHBvcnRzVHlwZShcIndhdlwiKTsgLy9yZXR1cm5zIHRydWVcblx0XHQgKiBUb25lLkJ1ZmZlci5zdXBwb3J0c1R5cGUoXCJwYXRoL3RvL2ZpbGUud2F2XCIpOyAvL3JldHVybnMgdHJ1ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXIuc3VwcG9ydHNUeXBlID0gZnVuY3Rpb24gKHVybCkge1xuXHQgICAgICAgIHZhciBleHRlbnNpb24gPSB1cmwuc3BsaXQoJy4nKTtcblx0ICAgICAgICBleHRlbnNpb24gPSBleHRlbnNpb25bZXh0ZW5zaW9uLmxlbmd0aCAtIDFdO1xuXHQgICAgICAgIHZhciByZXNwb25zZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2F1ZGlvJykuY2FuUGxheVR5cGUoJ2F1ZGlvLycgKyBleHRlbnNpb24pO1xuXHQgICAgICAgIHJldHVybiByZXNwb25zZSAhPT0gJyc7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgYSBQcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gYWxsIG9mIHRoZSBidWZmZXJzIGhhdmUgbG9hZGVkXG5cdFx0ICogIEByZXR1cm4ge1Byb21pc2V9XG5cdFx0ICovXG5cdCAgICBUb25lLmxvYWRlZCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb25sb2FkLCBvbmVycm9yO1xuXHQgICAgICAgIGZ1bmN0aW9uIHJlbW92ZUV2ZW50cygpIHtcblx0ICAgICAgICAgICAgLy9yZW1vdmUgdGhlIGV2ZW50cyB3aGVuIGl0J3MgcmVzb2x2ZWRcblx0ICAgICAgICAgICAgVG9uZS5CdWZmZXIub2ZmKCdsb2FkJywgb25sb2FkKTtcblx0ICAgICAgICAgICAgVG9uZS5CdWZmZXIub2ZmKCdlcnJvcicsIG9uZXJyb3IpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHN1Y2Nlc3MsIGZhaWwpIHtcblx0ICAgICAgICAgICAgb25sb2FkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgc3VjY2VzcygpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBvbmVycm9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgZmFpbCgpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAvL2FkZCB0aGUgZXZlbnQgbGlzdGVuZXJzXG5cdCAgICAgICAgICAgIFRvbmUuQnVmZmVyLm9uKCdsb2FkJywgb25sb2FkKTtcblx0ICAgICAgICAgICAgVG9uZS5CdWZmZXIub24oJ2Vycm9yJywgb25lcnJvcik7XG5cdCAgICAgICAgfSkudGhlbihyZW1vdmVFdmVudHMpLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAgIHJlbW92ZUV2ZW50cygpO1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQnVmZmVyO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgZmlyZS1hbmQtZm9yZ2V0IE9zY2lsbGF0b3JOb2RlLiBBZGRzIHRoZVxuXHRcdCAqICAgICBhYmlsaXR5IHRvIHJlc2NoZWR1bGUgdGhlIHN0b3AgbWV0aG9kLlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBwYXJhbSAge0F1ZGlvQnVmZmVyfFRvbmUuQnVmZmVyfSAgYnVmZmVyICAgVGhlIGJ1ZmZlciB0byBwbGF5XG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9ufSAgb25sb2FkICBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGlzIGRvbmUgcGxheWluZy5cblx0XHQgKi9cblx0ICAgIFRvbmUuT3NjaWxsYXRvck5vZGUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ3R5cGUnXG5cdCAgICAgICAgXSwgVG9uZS5Pc2NpbGxhdG9yTm9kZSk7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGFmdGVyIHRoZVxuXHRcdFx0ICogIGJ1ZmZlciBzb3VyY2UgaXMgZG9uZSBwbGF5aW5nLlxuXHRcdFx0ICogIEB0eXBlICB7RnVuY3Rpb259XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm9uZW5kZWQgPSBvcHRpb25zLm9uZW5kZWQ7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG9zY2lsbGF0b3Igc3RhcnQgdGltZVxuXHRcdFx0ICogIEB0eXBlICB7TnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSAtMTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgb3NjaWxsYXRvciBzdG9wIHRpbWVcblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc3RvcFRpbWUgPSAtMTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZ2FpbiBub2RlIHdoaWNoIGVudmVsb3BlcyB0aGUgT3NjaWxsYXRvck5vZGVcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZ2Fpbk5vZGUgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICB0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG9zY2lsbGF0b3Jcblx0XHRcdCAqICBAdHlwZSAge09zY2lsbGF0b3JOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yID0gdGhpcy5jb250ZXh0LmNyZWF0ZU9zY2lsbGF0b3IoKTtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLmNvbm5lY3QodGhpcy5fZ2Fpbk5vZGUpO1xuXHQgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZnJlcXVlbmN5IG9mIHRoZSBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG5ldyBUb25lLlBhcmFtKHRoaXMuX29zY2lsbGF0b3IuZnJlcXVlbmN5LCBUb25lLlR5cGUuRnJlcXVlbmN5KTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeS52YWx1ZSA9IG9wdGlvbnMuZnJlcXVlbmN5O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBkZXR1bmUgb2YgdGhlIG9zY2lsbGF0b3Jcblx0XHRcdCAqICBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbmV3IFRvbmUuUGFyYW0odGhpcy5fb3NjaWxsYXRvci5kZXR1bmUsIFRvbmUuVHlwZS5DZW50cyk7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUudmFsdWUgPSBvcHRpb25zLmRldHVuZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdmFsdWUgdGhhdCB0aGUgYnVmZmVyIHJhbXBzIHRvXG5cdFx0XHQgKiAgQHR5cGUge0dhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2dhaW4gPSAxO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuT3NjaWxsYXRvck5vZGUsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Pc2NpbGxhdG9yTm9kZS5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZnJlcXVlbmN5JzogNDQwLFxuXHQgICAgICAgICdkZXR1bmUnOiAwLFxuXHQgICAgICAgICd0eXBlJzogJ3NpbmUnLFxuXHQgICAgICAgICdvbmVuZGVkJzogVG9uZS5ub09wXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHBsYXliYWNrIHN0YXRlIG9mIHRoZSBvc2NpbGxhdG9yLCBlaXRoZXIgXCJzdGFydGVkXCIgb3IgXCJzdG9wcGVkXCIuXG5cdFx0ICogIEB0eXBlIHtUb25lLlN0YXRlfVxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuT3NjaWxsYXRvck5vZGUjXG5cdFx0ICogIEBuYW1lIHN0YXRlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUsICdzdGF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGVBdFRpbWUodGhpcy5ub3coKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgR2V0IHRoZSBwbGF5YmFjayBzdGF0ZSBhdCB0aGUgZ2l2ZW4gdGltZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSAgdGltZSAgVGhlIHRpbWUgdG8gdGVzdCB0aGUgc3RhdGUgYXRcblx0XHQgKiAgQHJldHVybiAge1RvbmUuU3RhdGV9ICBUaGUgcGxheWJhY2sgc3RhdGUuIFxuXHRcdCAqL1xuXHQgICAgVG9uZS5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuZ2V0U3RhdGVBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBpZiAodGhpcy5fc3RhcnRUaW1lICE9PSAtMSAmJiB0aW1lID49IHRoaXMuX3N0YXJ0VGltZSAmJiAodGhpcy5fc3RvcFRpbWUgPT09IC0xIHx8IHRpbWUgPD0gdGhpcy5fc3RvcFRpbWUpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUb25lLlN0YXRlLlN0YXJ0ZWQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuU3RhdGUuU3RvcHBlZDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdCAgICAgKiBTdGFydCB0aGUgb3NjaWxsYXRvciBub2RlIGF0IHRoZSBnaXZlbiB0aW1lXG5cdCAgICAgKiBAcGFyYW0gIHtUaW1lPX0gdGltZSBXaGVuIHRvIHN0YXJ0IHRoZSBvc2NpbGxhdG9yXG5cdCAgICAgKiBAcmV0dXJuIHtPc2NpbGxhdG9yTm9kZX0gICAgICB0aGlzXG5cdCAgICAgKi9cblx0ICAgIFRvbmUuT3NjaWxsYXRvck5vZGUucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICBpZiAodGhpcy5fc3RhcnRUaW1lID09PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5zdGFydCh0aGlzLl9zdGFydFRpbWUpO1xuXHQgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO1xuXHQgICAgICAgICAgICB0aGlzLl9nYWluTm9kZS5nYWluLmNhbmNlbFNjaGVkdWxlZFZhbHVlcyhub3cpO1xuXHQgICAgICAgICAgICB0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsIG5vdyk7XG5cdCAgICAgICAgICAgIHRoaXMuX2dhaW5Ob2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMSwgdGhpcy5fc3RhcnRUaW1lKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBjYWxsIE9zY2lsbGF0b3JOb2RlLnN0YXJ0IG1vcmUgdGhhbiBvbmNlJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHQgICAgICogU2V0cyBhbiBhcmJpdHJhcnkgY3VzdG9tIHBlcmlvZGljIHdhdmVmb3JtIGdpdmVuIGEgUGVyaW9kaWNXYXZlLlxuXHQgICAgICogQHBhcmFtICB7UGVyaW9kaWNXYXZlfSBwZXJpb2RpY1dhdmUgUGVyaW9kaWNXYXZlIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggY29udGV4dC5jcmVhdGVQZXJpb2RpY1dhdmVcblx0ICAgICAqIEByZXR1cm4ge09zY2lsbGF0b3JOb2RlfSB0aGlzXG5cdCAgICAgKi9cblx0ICAgIFRvbmUuT3NjaWxsYXRvck5vZGUucHJvdG90eXBlLnNldFBlcmlvZGljV2F2ZSA9IGZ1bmN0aW9uIChwZXJpb2RpY1dhdmUpIHtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnNldFBlcmlvZGljV2F2ZShwZXJpb2RpY1dhdmUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHQgICAgICogU3RvcCB0aGUgb3NjaWxsYXRvciBub2RlIGF0IHRoZSBnaXZlbiB0aW1lXG5cdCAgICAgKiBAcGFyYW0gIHtUaW1lPX0gdGltZSBXaGVuIHRvIHN0b3AgdGhlIG9zY2lsbGF0b3Jcblx0ICAgICAqIEByZXR1cm4ge09zY2lsbGF0b3JOb2RlfSAgICAgIHRoaXNcblx0ICAgICAqL1xuXHQgICAgVG9uZS5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgLy9jYW5jZWwgdGhlIHByZXZpb3VzIHN0b3Bcblx0ICAgICAgICB0aGlzLmNhbmNlbFN0b3AoKTtcblx0ICAgICAgICAvL3Jlc2NoZWR1bGUgaXRcblx0ICAgICAgICB0aGlzLl9zdG9wVGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2dhaW5Ob2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMCwgdGhpcy5fc3RvcFRpbWUpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5jbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG5cdCAgICAgICAgdGhpcy5fdGltZW91dCA9IHRoaXMuY29udGV4dC5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5zdG9wKHRoaXMubm93KCkpO1xuXHQgICAgICAgICAgICB0aGlzLm9uZW5kZWQoKTtcblx0ICAgICAgICB9LmJpbmQodGhpcyksIHRoaXMuX3N0b3BUaW1lIC0gdGhpcy5ub3coKSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENhbmNlbCBhIHNjaGVkdWxlZCBzdG9wIGV2ZW50XG5cdFx0ICogIEByZXR1cm4gIHtUb25lLk9zY2lsbGF0b3JOb2RlfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuY2FuY2VsU3RvcCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5fc3RhcnRUaW1lICE9PSAtMSkge1xuXHQgICAgICAgICAgICAvL2NhbmNlbCB0aGUgc3RvcCBlbnZlbG9wZVxuXHQgICAgICAgICAgICB0aGlzLl9nYWluTm9kZS5nYWluLmNhbmNlbFNjaGVkdWxlZFZhbHVlcyh0aGlzLl9zdGFydFRpbWUgKyB0aGlzLnNhbXBsZVRpbWUpO1xuXHQgICAgICAgICAgICB0aGlzLl9nYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKDEsIE1hdGgubWF4KHRoaXMubm93KCksIHRoaXMuX3N0YXJ0VGltZSkpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuXHQgICAgICAgICAgICB0aGlzLl9zdG9wVGltZSA9IC0xO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUaGUgb3NjaWxsYXRvciB0eXBlLiBFaXRoZXIgJ3NpbmUnLCAnc2F3dG9vdGgnLCAnc3F1YXJlJywgb3IgJ3RyaWFuZ2xlJ1xuXHRcdCAqIEBtZW1iZXJPZiBUb25lLk9zY2lsbGF0b3JOb2RlI1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIHR5cGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk9zY2lsbGF0b3JOb2RlLnByb3RvdHlwZSwgJ3R5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vc2NpbGxhdG9yLnR5cGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0eXBlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3IudHlwZSA9IHR5cGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLk9zY2lsbGF0b3JOb2RlfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Pc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5vbmVuZGVkID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9nYWluTm9kZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZ2Fpbk5vZGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5Pc2NpbGxhdG9yTm9kZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuT3NjaWxsYXRvciBzdXBwb3J0cyBhIG51bWJlciBvZiBmZWF0dXJlcyBpbmNsdWRpbmdcblx0XHQgKiAgICAgICAgIHBoYXNlIHJvdGF0aW9uLCBtdWx0aXBsZSBvc2NpbGxhdG9yIHR5cGVzIChzZWUgVG9uZS5Pc2NpbGxhdG9yLnR5cGUpLFxuXHRcdCAqICAgICAgICAgYW5kIFRyYW5zcG9ydCBzeW5jaW5nIChzZWUgVG9uZS5Pc2NpbGxhdG9yLnN5bmNGcmVxdWVuY3kpLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5Tb3VyY2V9XG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBbZnJlcXVlbmN5XSBTdGFydGluZyBmcmVxdWVuY3lcblx0XHQgKiAgQHBhcmFtIHtzdHJpbmd9IFt0eXBlXSBUaGUgb3NjaWxsYXRvciB0eXBlLiBSZWFkIG1vcmUgYWJvdXQgdHlwZSBiZWxvdy5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL21ha2UgYW5kIHN0YXJ0IGEgNDQwaHogc2luZSB0b25lXG5cdFx0ICogdmFyIG9zYyA9IG5ldyBUb25lLk9zY2lsbGF0b3IoNDQwLCBcInNpbmVcIikudG9NYXN0ZXIoKS5zdGFydCgpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Pc2NpbGxhdG9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICd0eXBlJ1xuXHQgICAgICAgIF0sIFRvbmUuT3NjaWxsYXRvcik7XG5cdCAgICAgICAgVG9uZS5Tb3VyY2UuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbWFpbiBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUge09zY2lsbGF0b3JOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yID0gbnVsbDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZnJlcXVlbmN5IGNvbnRyb2wuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLmZyZXF1ZW5jeSwgVG9uZS5UeXBlLkZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGRldHVuZSBjb250cm9sIHNpZ25hbC5cblx0XHRcdCAqICBAdHlwZSB7Q2VudHN9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5kZXR1bmUgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5kZXR1bmUsIFRvbmUuVHlwZS5DZW50cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIHBlcmlvZGljIHdhdmVcblx0XHRcdCAqICBAdHlwZSB7UGVyaW9kaWNXYXZlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl93YXZlID0gbnVsbDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgcGFydGlhbHMgb2YgdGhlIG9zY2lsbGF0b3Jcblx0XHRcdCAqICBAdHlwZSB7QXJyYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3BhcnRpYWxzID0gVG9uZS5kZWZhdWx0QXJnKG9wdGlvbnMucGFydGlhbHMsIFsxXSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIHBoYXNlIG9mIHRoZSBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgYmV0d2VlbiAwIC0gMzYwXG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcGhhc2UgPSBvcHRpb25zLnBoYXNlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSB0eXBlIG9mIHRoZSBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUge3N0cmluZ31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdHlwZSA9IG51bGw7XG5cdCAgICAgICAgLy9zZXR1cFxuXHQgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcblx0ICAgICAgICB0aGlzLnBoYXNlID0gdGhpcy5fcGhhc2U7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RldHVuZSdcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLk9zY2lsbGF0b3IsIFRvbmUuU291cmNlKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLk9zY2lsbGF0b3IuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3R5cGUnOiAnc2luZScsXG5cdCAgICAgICAgJ2ZyZXF1ZW5jeSc6IDQ0MCxcblx0ICAgICAgICAnZGV0dW5lJzogMCxcblx0ICAgICAgICAncGhhc2UnOiAwLFxuXHQgICAgICAgICdwYXJ0aWFscyc6IFtdXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBPc2NpbGxhdG9yIHR5cGVzXG5cdFx0ICogIEBlbnVtIHtTdHJpbmd9XG5cdFx0ICovXG5cdCAgICBUb25lLk9zY2lsbGF0b3IuVHlwZSA9IHtcblx0ICAgICAgICBTaW5lOiAnc2luZScsXG5cdCAgICAgICAgVHJpYW5nbGU6ICd0cmlhbmdsZScsXG5cdCAgICAgICAgU2F3dG9vdGg6ICdzYXd0b290aCcsXG5cdCAgICAgICAgU3F1YXJlOiAnc3F1YXJlJyxcblx0ICAgICAgICBDdXN0b206ICdjdXN0b20nXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHN0YXJ0IHRoZSBvc2NpbGxhdG9yXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd11cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICAvL25ldyBvc2NpbGxhdG9yIHdpdGggcHJldmlvdXMgdmFsdWVzXG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvciA9IG5ldyBUb25lLk9zY2lsbGF0b3JOb2RlKCk7XG5cdCAgICAgICAgaWYgKHRoaXMuX3dhdmUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5zZXRQZXJpb2RpY1dhdmUodGhpcy5fd2F2ZSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci50eXBlID0gdGhpcy5fdHlwZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9jb25uZWN0IHRoZSBjb250cm9sIHNpZ25hbCB0byB0aGUgb3NjaWxsYXRvciBmcmVxdWVuY3kgJiBkZXR1bmVcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmNvbm5lY3QodGhpcy5fb3NjaWxsYXRvci5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lLmNvbm5lY3QodGhpcy5fb3NjaWxsYXRvci5kZXR1bmUpO1xuXHQgICAgICAgIC8vc3RhcnQgdGhlIG9zY2lsbGF0b3Jcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5zdGFydCh0aW1lKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc3RvcCB0aGUgb3NjaWxsYXRvclxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbdGltZT1ub3ddIChvcHRpb25hbCkgdGltaW5nIHBhcmFtZXRlclxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Pc2NpbGxhdG9yfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk9zY2lsbGF0b3IucHJvdG90eXBlLl9zdG9wID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICBpZiAodGhpcy5fb3NjaWxsYXRvcikge1xuXHQgICAgICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3Iuc3RvcCh0aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogUmVzdGFydCB0aGUgb3NjaWxsYXRvci4gRG9lcyBub3Qgc3RvcCB0aGUgb3NjaWxsYXRvciwgYnV0IGluc3RlYWRcblx0XHQgKiBqdXN0IGNhbmNlbHMgYW55IHNjaGVkdWxlZCAnc3RvcCcgZnJvbSBiZWluZyBpbnZva2VkLlxuXHRcdCAqIEBwYXJhbSAge1RpbWU9fSB0aW1lXG5cdFx0ICogQHJldHVybiB7VG9uZS5Pc2NpbGxhdG9yfSAgICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuT3NjaWxsYXRvci5wcm90b3R5cGUucmVzdGFydCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5jYW5jZWxTdG9wKCk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUuY2FuY2VsKHRoaXMudG9TZWNvbmRzKHRpbWUpKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU3luYyB0aGUgc2lnbmFsIHRvIHRoZSBUcmFuc3BvcnQncyBicG0uIEFueSBjaGFuZ2VzIHRvIHRoZSB0cmFuc3BvcnRzIGJwbSxcblx0XHQgKiAgd2lsbCBhbHNvIGFmZmVjdCB0aGUgb3NjaWxsYXRvcnMgZnJlcXVlbmN5LlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Pc2NpbGxhdG9yfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogVG9uZS5UcmFuc3BvcnQuYnBtLnZhbHVlID0gMTIwO1xuXHRcdCAqIG9zYy5mcmVxdWVuY3kudmFsdWUgPSA0NDA7XG5cdFx0ICogLy90aGUgcmF0aW9uIGJldHdlZW4gdGhlIGJwbSBhbmQgdGhlIGZyZXF1ZW5jeSB3aWxsIGJlIG1haW50YWluZWRcblx0XHQgKiBvc2Muc3luY0ZyZXF1ZW5jeSgpO1xuXHRcdCAqIFRvbmUuVHJhbnNwb3J0LmJwbS52YWx1ZSA9IDI0MDtcblx0XHQgKiAvLyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBvc2NpbGxhdG9yIGlzIGRvdWJsZWQgdG8gODgwXG5cdFx0ICovXG5cdCAgICBUb25lLk9zY2lsbGF0b3IucHJvdG90eXBlLnN5bmNGcmVxdWVuY3kgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5UcmFuc3BvcnQuc3luY1NpZ25hbCh0aGlzLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFVuc3luYyB0aGUgb3NjaWxsYXRvcidzIGZyZXF1ZW5jeSBmcm9tIHRoZSBUcmFuc3BvcnQuXG5cdFx0ICogIFNlZSBUb25lLk9zY2lsbGF0b3Iuc3luY0ZyZXF1ZW5jeVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Pc2NpbGxhdG9yfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk9zY2lsbGF0b3IucHJvdG90eXBlLnVuc3luY0ZyZXF1ZW5jeSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlRyYW5zcG9ydC51bnN5bmNTaWduYWwodGhpcy5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBvc2NpbGxhdG9yOiBlaXRoZXIgc2luZSwgc3F1YXJlLCB0cmlhbmdsZSwgb3Igc2F3dG9vdGguIEFsc28gY2FwYWJsZSBvZlxuXHRcdCAqIHNldHRpbmcgdGhlIGZpcnN0IHggbnVtYmVyIG9mIHBhcnRpYWxzIG9mIHRoZSBvc2NpbGxhdG9yLiBGb3IgZXhhbXBsZTogXCJzaW5lNFwiIHdvdWxkXG5cdFx0ICogc2V0IGJlIHRoZSBmaXJzdCA0IHBhcnRpYWxzIG9mIHRoZSBzaW5lIHdhdmUgYW5kIFwidHJpYW5nbGU4XCIgd291bGQgc2V0IHRoZSBmaXJzdFxuXHRcdCAqIDggcGFydGlhbHMgb2YgdGhlIHRyaWFuZ2xlIHdhdmUuXG5cdFx0ICogPGJyPjxicj5cblx0XHQgKiBVc2VzIFBlcmlvZGljV2F2ZSBpbnRlcm5hbGx5IGV2ZW4gZm9yIG5hdGl2ZSB0eXBlcyBzbyB0aGF0IGl0IGNhbiBzZXQgdGhlIHBoYXNlLlxuXHRcdCAqIFBlcmlvZGljV2F2ZSBlcXVhdGlvbnMgYXJlIGZyb20gdGhlXG5cdFx0ICogW1dlYmtpdCBXZWIgQXVkaW8gaW1wbGVtZW50YXRpb25dKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vY29kZXNlYXJjaCNjaHJvbWl1bS9zcmMvdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS9tb2R1bGVzL3dlYmF1ZGlvL1BlcmlvZGljV2F2ZS5jcHAmc3E9cGFja2FnZTpjaHJvbWl1bSkuXG5cdFx0ICpcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5Pc2NpbGxhdG9yI1xuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICogQG5hbWUgdHlwZVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy9zZXQgaXQgdG8gYSBzcXVhcmUgd2F2ZVxuXHRcdCAqIG9zYy50eXBlID0gXCJzcXVhcmVcIjtcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vc2V0IHRoZSBmaXJzdCA2IHBhcnRpYWxzIG9mIGEgc2F3dG9vdGggd2F2ZVxuXHRcdCAqIG9zYy50eXBlID0gXCJzYXd0b290aDZcIjtcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk9zY2lsbGF0b3IucHJvdG90eXBlLCAndHlwZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0eXBlKSB7XG5cdCAgICAgICAgICAgIHZhciBpc0Jhc2ljVHlwZSA9IFtcblx0ICAgICAgICAgICAgICAgIFRvbmUuT3NjaWxsYXRvci5UeXBlLlNpbmUsXG5cdCAgICAgICAgICAgICAgICBUb25lLk9zY2lsbGF0b3IuVHlwZS5TcXVhcmUsXG5cdCAgICAgICAgICAgICAgICBUb25lLk9zY2lsbGF0b3IuVHlwZS5UcmlhbmdsZSxcblx0ICAgICAgICAgICAgICAgIFRvbmUuT3NjaWxsYXRvci5UeXBlLlNhd3Rvb3RoXG5cdCAgICAgICAgICAgIF0uaW5jbHVkZXModHlwZSk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9waGFzZSA9PT0gMCAmJiBpc0Jhc2ljVHlwZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fd2F2ZSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAvL2p1c3QgZ28gd2l0aCB0aGUgYmFzaWMgYXBwcm9hY2hcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vc2NpbGxhdG9yICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci50eXBlID09PSB0eXBlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdmFyIGNvZWZzID0gdGhpcy5fZ2V0UmVhbEltYWdpbmFyeSh0eXBlLCB0aGlzLl9waGFzZSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgcGVyaW9kaWNXYXZlID0gdGhpcy5jb250ZXh0LmNyZWF0ZVBlcmlvZGljV2F2ZShjb2Vmc1swXSwgY29lZnNbMV0pO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fd2F2ZSA9IHBlcmlvZGljV2F2ZTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vc2NpbGxhdG9yICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5zZXRQZXJpb2RpY1dhdmUodGhpcy5fd2F2ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IGNvbXBvbmVudHMgYmFzZWRcblx0XHQgKiAgb24gdGhlIG9zY2lsbGF0b3IgdHlwZS5cblx0XHQgKiAgQHJldHVybnMge0FycmF5fSBbcmVhbCwgaW1hZ2luYXJ5XVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Pc2NpbGxhdG9yLnByb3RvdHlwZS5fZ2V0UmVhbEltYWdpbmFyeSA9IGZ1bmN0aW9uICh0eXBlLCBwaGFzZSkge1xuXHQgICAgICAgIHZhciBmZnRTaXplID0gNDA5Njtcblx0ICAgICAgICB2YXIgcGVyaW9kaWNXYXZlU2l6ZSA9IGZmdFNpemUgLyAyO1xuXHQgICAgICAgIHZhciByZWFsID0gbmV3IEZsb2F0MzJBcnJheShwZXJpb2RpY1dhdmVTaXplKTtcblx0ICAgICAgICB2YXIgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkocGVyaW9kaWNXYXZlU2l6ZSk7XG5cdCAgICAgICAgdmFyIHBhcnRpYWxDb3VudCA9IDE7XG5cdCAgICAgICAgaWYgKHR5cGUgPT09IFRvbmUuT3NjaWxsYXRvci5UeXBlLkN1c3RvbSkge1xuXHQgICAgICAgICAgICBwYXJ0aWFsQ291bnQgPSB0aGlzLl9wYXJ0aWFscy5sZW5ndGggKyAxO1xuXHQgICAgICAgICAgICBwZXJpb2RpY1dhdmVTaXplID0gcGFydGlhbENvdW50O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHZhciBwYXJ0aWFsID0gL14oc2luZXx0cmlhbmdsZXxzcXVhcmV8c2F3dG9vdGgpKFxcZCspJC8uZXhlYyh0eXBlKTtcblx0ICAgICAgICAgICAgaWYgKHBhcnRpYWwpIHtcblx0ICAgICAgICAgICAgICAgIHBhcnRpYWxDb3VudCA9IHBhcnNlSW50KHBhcnRpYWxbMl0pICsgMTtcblx0ICAgICAgICAgICAgICAgIHR5cGUgPSBwYXJ0aWFsWzFdO1xuXHQgICAgICAgICAgICAgICAgcGFydGlhbENvdW50ID0gTWF0aC5tYXgocGFydGlhbENvdW50LCAyKTtcblx0ICAgICAgICAgICAgICAgIHBlcmlvZGljV2F2ZVNpemUgPSBwYXJ0aWFsQ291bnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgZm9yICh2YXIgbiA9IDE7IG4gPCBwZXJpb2RpY1dhdmVTaXplOyArK24pIHtcblx0ICAgICAgICAgICAgdmFyIHBpRmFjdG9yID0gMiAvIChuICogTWF0aC5QSSk7XG5cdCAgICAgICAgICAgIHZhciBiO1xuXHQgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcblx0ICAgICAgICAgICAgY2FzZSBUb25lLk9zY2lsbGF0b3IuVHlwZS5TaW5lOlxuXHQgICAgICAgICAgICAgICAgYiA9IG4gPD0gcGFydGlhbENvdW50ID8gMSA6IDA7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSBUb25lLk9zY2lsbGF0b3IuVHlwZS5TcXVhcmU6XG5cdCAgICAgICAgICAgICAgICBiID0gbiAmIDEgPyAyICogcGlGYWN0b3IgOiAwO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgVG9uZS5Pc2NpbGxhdG9yLlR5cGUuU2F3dG9vdGg6XG5cdCAgICAgICAgICAgICAgICBiID0gcGlGYWN0b3IgKiAobiAmIDEgPyAxIDogLTEpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgVG9uZS5Pc2NpbGxhdG9yLlR5cGUuVHJpYW5nbGU6XG5cdCAgICAgICAgICAgICAgICBpZiAobiAmIDEpIHtcblx0ICAgICAgICAgICAgICAgICAgICBiID0gMiAqIChwaUZhY3RvciAqIHBpRmFjdG9yKSAqIChuIC0gMSA+PiAxICYgMSA/IC0xIDogMSk7XG5cdCAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGIgPSAwO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgVG9uZS5Pc2NpbGxhdG9yLlR5cGUuQ3VzdG9tOlxuXHQgICAgICAgICAgICAgICAgYiA9IHRoaXMuX3BhcnRpYWxzW24gLSAxXTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVG9uZS5Pc2NpbGxhdG9yOiBpbnZhbGlkIHR5cGU6ICcgKyB0eXBlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAoYiAhPT0gMCkge1xuXHQgICAgICAgICAgICAgICAgcmVhbFtuXSA9IC1iICogTWF0aC5zaW4ocGhhc2UgKiBuKTtcblx0ICAgICAgICAgICAgICAgIGltYWdbbl0gPSBiICogTWF0aC5jb3MocGhhc2UgKiBuKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJlYWxbbl0gPSAwO1xuXHQgICAgICAgICAgICAgICAgaW1hZ1tuXSA9IDA7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIFtcblx0ICAgICAgICAgICAgcmVhbCxcblx0ICAgICAgICAgICAgaW1hZ1xuXHQgICAgICAgIF07XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENvbXB1dGUgdGhlIGludmVyc2UgRkZUIGZvciBhIGdpdmVuIHBoYXNlLlxuXHRcdCAqICBAcGFyYW0gIHtGbG9hdDMyQXJyYXl9ICByZWFsXG5cdFx0ICogIEBwYXJhbSAge0Zsb2F0MzJBcnJheX0gIGltYWdcblx0XHQgKiAgQHBhcmFtICB7Tm9ybWFsUmFuZ2V9ICBwaGFzZVxuXHRcdCAqICBAcmV0dXJuICB7QXVkaW9SYW5nZX1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuT3NjaWxsYXRvci5wcm90b3R5cGUuX2ludmVyc2VGRlQgPSBmdW5jdGlvbiAocmVhbCwgaW1hZywgcGhhc2UpIHtcblx0ICAgICAgICB2YXIgc3VtID0gMDtcblx0ICAgICAgICB2YXIgbGVuID0gcmVhbC5sZW5ndGg7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHQgICAgICAgICAgICBzdW0gKz0gcmVhbFtpXSAqIE1hdGguY29zKGkgKiBwaGFzZSkgKyBpbWFnW2ldICogTWF0aC5zaW4oaSAqIHBoYXNlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHN1bTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgb3NjaWxsYXRvci5cblx0XHQgKiAgQHJldHVybiAge0F1ZGlvUmFuZ2V9XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLk9zY2lsbGF0b3IucHJvdG90eXBlLl9nZXRJbml0aWFsVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNvZWZzID0gdGhpcy5fZ2V0UmVhbEltYWdpbmFyeSh0aGlzLl90eXBlLCAwKTtcblx0ICAgICAgICB2YXIgcmVhbCA9IGNvZWZzWzBdO1xuXHQgICAgICAgIHZhciBpbWFnID0gY29lZnNbMV07XG5cdCAgICAgICAgdmFyIG1heFZhbHVlID0gMDtcblx0ICAgICAgICB2YXIgdHdvUGkgPSBNYXRoLlBJICogMjtcblx0ICAgICAgICAvL2NoZWNrIGZvciBwZWFrcyBpbiA4IHBsYWNlc1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7XG5cdCAgICAgICAgICAgIG1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5faW52ZXJzZUZGVChyZWFsLCBpbWFnLCBpIC8gOCAqIHR3b1BpKSwgbWF4VmFsdWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gLXRoaXMuX2ludmVyc2VGRlQocmVhbCwgaW1hZywgdGhpcy5fcGhhc2UpIC8gbWF4VmFsdWU7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBhcnRpYWxzIG9mIHRoZSB3YXZlZm9ybS4gQSBwYXJ0aWFsIHJlcHJlc2VudHNcblx0XHQgKiB0aGUgYW1wbGl0dWRlIGF0IGEgaGFybW9uaWMuIFRoZSBmaXJzdCBoYXJtb25pYyBpcyB0aGVcblx0XHQgKiBmdW5kYW1lbnRhbCBmcmVxdWVuY3ksIHRoZSBzZWNvbmQgaXMgdGhlIG9jdGF2ZSBhbmQgc28gb25cblx0XHQgKiBmb2xsb3dpbmcgdGhlIGhhcm1vbmljIHNlcmllcy5cblx0XHQgKiBTZXR0aW5nIHRoaXMgdmFsdWUgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdHlwZSB0byBcImN1c3RvbVwiLlxuXHRcdCAqIFRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSB0eXBlIGlzIG5vdCBcImN1c3RvbVwiLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLk9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge0FycmF5fVxuXHRcdCAqIEBuYW1lIHBhcnRpYWxzXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBvc2MucGFydGlhbHMgPSBbMSwgMC4yLCAwLjAxXTtcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk9zY2lsbGF0b3IucHJvdG90eXBlLCAncGFydGlhbHMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl90eXBlICE9PSBUb25lLk9zY2lsbGF0b3IuVHlwZS5DdXN0b20pIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBbXTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJ0aWFscztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocGFydGlhbHMpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGFydGlhbHMgPSBwYXJ0aWFscztcblx0ICAgICAgICAgICAgdGhpcy50eXBlID0gVG9uZS5Pc2NpbGxhdG9yLlR5cGUuQ3VzdG9tO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBoYXNlIG9mIHRoZSBvc2NpbGxhdG9yIGluIGRlZ3JlZXMuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuT3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7RGVncmVlc31cblx0XHQgKiBAbmFtZSBwaGFzZVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogb3NjLnBoYXNlID0gMTgwOyAvL2ZsaXBzIHRoZSBwaGFzZSBvZiB0aGUgb3NjaWxsYXRvclxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuT3NjaWxsYXRvci5wcm90b3R5cGUsICdwaGFzZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BoYXNlICogKDE4MCAvIE1hdGguUEkpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocGhhc2UpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGhhc2UgPSBwaGFzZSAqIE1hdGguUEkgLyAxODA7XG5cdCAgICAgICAgICAgIC8vcmVzZXQgdGhlIHR5cGVcblx0ICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy5fdHlwZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBEaXNwb3NlIGFuZCBkaXNjb25uZWN0LlxuXHRcdCAqICBAcmV0dXJuIHtUb25lLk9zY2lsbGF0b3J9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuT3NjaWxsYXRvci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIGlmICh0aGlzLl9vc2NpbGxhdG9yICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3IuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9yID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fd2F2ZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RldHVuZSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmRldHVuZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fcGFydGlhbHMgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk9zY2lsbGF0b3I7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBBdWRpb1RvR2FpbiBjb252ZXJ0cyBhbiBpbnB1dCBpbiBBdWRpb1JhbmdlIFstMSwxXSB0byBOb3JtYWxSYW5nZSBbMCwxXS4gXG5cdFx0ICogICAgICAgICBTZWUgVG9uZS5HYWluVG9BdWRpby5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TaWduYWxCYXNlfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAgdmFyIGEyZyA9IG5ldyBUb25lLkF1ZGlvVG9HYWluKCk7XG5cdFx0ICovXG5cdCAgICBUb25lLkF1ZGlvVG9HYWluID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEB0eXBlIHtXYXZlU2hhcGVyTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbm9ybSA9IHRoaXMuaW5wdXQgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLldhdmVTaGFwZXIoZnVuY3Rpb24gKHgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICh4ICsgMSkgLyAyO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQXVkaW9Ub0dhaW4sIFRvbmUuU2lnbmFsQmFzZSk7XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuQXVkaW9Ub0dhaW59IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQXVkaW9Ub0dhaW4ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fbm9ybS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbm9ybSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQXVkaW9Ub0dhaW47XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5aZXJvIG91dHB1dHMgMCdzIGF0IGF1ZGlvLXJhdGUuIFRoZSByZWFzb24gdGhpcyBoYXMgdG8gYmVcblx0XHQgKiAgICAgICAgIGl0J3Mgb3duIGNsYXNzIGlzIHRoYXQgbWFueSBicm93c2VycyBvcHRpbWl6ZSBvdXQgVG9uZS5TaWduYWxcblx0XHQgKiAgICAgICAgIHdpdGggYSB2YWx1ZSBvZiAwIGFuZCB3aWxsIG5vdCBwcm9jZXNzIG5vZGVzIGZ1cnRoZXIgZG93biB0aGUgZ3JhcGguXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlNpZ25hbEJhc2V9XG5cdFx0ICovXG5cdCAgICBUb25lLlplcm8gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGdhaW4gbm9kZVxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5HYWlufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9nYWluID0gdGhpcy5pbnB1dCA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIHRoaXMuY29udGV4dC5nZXRDb25zdGFudCgwKS5jb25uZWN0KHRoaXMuX2dhaW4pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuWmVybywgVG9uZS5TaWduYWxCYXNlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5aZXJvfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5aZXJvLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2dhaW4uZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2dhaW4gPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlplcm87XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgTEZPIHN0YW5kcyBmb3IgbG93IGZyZXF1ZW5jeSBvc2NpbGxhdG9yLiBUb25lLkxGTyBwcm9kdWNlcyBhbiBvdXRwdXQgc2lnbmFsXG5cdFx0ICogICAgICAgICAgd2hpY2ggY2FuIGJlIGF0dGFjaGVkIHRvIGFuIEF1ZGlvUGFyYW0gb3IgVG9uZS5TaWduYWxcblx0XHQgKiAgICAgICAgICBpbiBvcmRlciB0byBtb2R1bGF0ZSB0aGF0IHBhcmFtZXRlciB3aXRoIGFuIG9zY2lsbGF0b3IuIFRoZSBMRk8gY2FuXG5cdFx0ICogICAgICAgICAgYWxzbyBiZSBzeW5jZWQgdG8gdGhlIHRyYW5zcG9ydCB0byBzdGFydC9zdG9wIGFuZCBjaGFuZ2Ugd2hlbiB0aGUgdGVtcG8gY2hhbmdlcy5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAcGFyYW0ge0ZyZXF1ZW5jeXxPYmplY3R9IFtmcmVxdWVuY3ldIFRoZSBmcmVxdWVuY3kgb2YgdGhlIG9zY2lsbGF0aW9uLiBUeXBpY2FsbHksIExGT3Mgd2lsbCBiZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmcmVxdWVuY3kgcmFuZ2Ugb2YgMC4xIHRvIDEwIGhlcnR6LlxuXHRcdCAqICBAcGFyYW0ge251bWJlcj19IG1pbiBUaGUgbWluaW11bSBvdXRwdXQgdmFsdWUgb2YgdGhlIExGTy5cblx0XHQgKiAgQHBhcmFtIHtudW1iZXI9fSBtYXggVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIExGTy5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgbGZvID0gbmV3IFRvbmUuTEZPKFwiNG5cIiwgNDAwLCA0MDAwKTtcblx0XHQgKiBsZm8uY29ubmVjdChmaWx0ZXIuZnJlcXVlbmN5KTtcblx0XHQgKi9cblx0ICAgIFRvbmUuTEZPID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdtaW4nLFxuXHQgICAgICAgICAgICAnbWF4J1xuXHQgICAgICAgIF0sIFRvbmUuTEZPKTtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBvc2NpbGxhdG9yLlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk9zY2lsbGF0b3J9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX29zY2lsbGF0b3IgPSBuZXcgVG9uZS5Pc2NpbGxhdG9yKHtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeSc6IG9wdGlvbnMuZnJlcXVlbmN5LFxuXHQgICAgICAgICAgICAndHlwZSc6IG9wdGlvbnMudHlwZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBsZm8ncyBmcmVxdWVuY3lcblx0XHRcdCAqICBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gdGhpcy5fb3NjaWxsYXRvci5mcmVxdWVuY3k7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgYW1wbGl0dWRlIG9mIHRoZSBMRk8sIHdoaWNoIGNvbnRyb2xzIHRoZSBvdXRwdXQgcmFuZ2UgYmV0d2VlblxuXHRcdFx0ICogdGhlIG1pbiBhbmQgbWF4IG91dHB1dC4gRm9yIGV4YW1wbGUgaWYgdGhlIG1pbiBpcyAtMTAgYW5kIHRoZSBtYXhcblx0XHRcdCAqIGlzIDEwLCBzZXR0aW5nIHRoZSBhbXBsaXR1ZGUgdG8gMC41IHdvdWxkIG1ha2UgdGhlIExGTyBtb2R1bGF0ZVxuXHRcdFx0ICogYmV0d2VlbiAtNSBhbmQgNS5cblx0XHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0XHQgKiBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmFtcGxpdHVkZSA9IHRoaXMuX29zY2lsbGF0b3Iudm9sdW1lO1xuXHQgICAgICAgIHRoaXMuYW1wbGl0dWRlLnVuaXRzID0gVG9uZS5UeXBlLk5vcm1hbFJhbmdlO1xuXHQgICAgICAgIHRoaXMuYW1wbGl0dWRlLnZhbHVlID0gb3B0aW9ucy5hbXBsaXR1ZGU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHNpZ25hbCB3aGljaCBpcyBvdXRwdXQgd2hlbiB0aGUgTEZPIGlzIHN0b3BwZWRcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuU2lnbmFsfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zdG9wcGVkU2lnbmFsID0gbmV3IFRvbmUuU2lnbmFsKDAsIFRvbmUuVHlwZS5BdWRpb1JhbmdlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBKdXN0IG91dHB1dHMgemVyb3MuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuWmVyb31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5femVyb3MgPSBuZXcgVG9uZS5aZXJvKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHZhbHVlIHRoYXQgdGhlIExGTyBvdXRwdXRzIHdoZW4gaXQncyBzdG9wcGVkXG5cdFx0XHQgKiAgQHR5cGUge0F1ZGlvUmFuZ2V9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N0b3BwZWRWYWx1ZSA9IDA7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuQXVkaW9Ub0dhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2EyZyA9IG5ldyBUb25lLkF1ZGlvVG9HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuU2NhbGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NjYWxlciA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuU2NhbGUob3B0aW9ucy5taW4sIG9wdGlvbnMubWF4KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgdW5pdHMgb2YgdGhlIExGTyAodXNlZCBmb3IgY29udmVydGluZylcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5UeXBlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl91bml0cyA9IFRvbmUuVHlwZS5EZWZhdWx0O1xuXHQgICAgICAgIHRoaXMudW5pdHMgPSBvcHRpb25zLnVuaXRzO1xuXHQgICAgICAgIC8vY29ubmVjdCBpdCB1cFxuXHQgICAgICAgIHRoaXMuX29zY2lsbGF0b3IuY2hhaW4odGhpcy5fYTJnLCB0aGlzLl9zY2FsZXIpO1xuXHQgICAgICAgIHRoaXMuX3plcm9zLmNvbm5lY3QodGhpcy5fYTJnKTtcblx0ICAgICAgICB0aGlzLl9zdG9wcGVkU2lnbmFsLmNvbm5lY3QodGhpcy5fYTJnKTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdhbXBsaXR1ZGUnLFxuXHQgICAgICAgICAgICAnZnJlcXVlbmN5J1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMucGhhc2UgPSBvcHRpb25zLnBoYXNlO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuTEZPLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGRlZmF1bHQgcGFyYW1ldGVyc1xuXHRcdCAqXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkxGTy5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAndHlwZSc6ICdzaW5lJyxcblx0ICAgICAgICAnbWluJzogMCxcblx0ICAgICAgICAnbWF4JzogMSxcblx0ICAgICAgICAncGhhc2UnOiAwLFxuXHQgICAgICAgICdmcmVxdWVuY3knOiAnNG4nLFxuXHQgICAgICAgICdhbXBsaXR1ZGUnOiAxLFxuXHQgICAgICAgICd1bml0cyc6IFRvbmUuVHlwZS5EZWZhdWx0XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN0YXJ0IHRoZSBMRk8uXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdGhlIExGTyB3aWxsIHN0YXJ0XG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkxGT30gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5MRk8ucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fc3RvcHBlZFNpZ25hbC5zZXRWYWx1ZUF0VGltZSgwLCB0aW1lKTtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdG9wIHRoZSBMRk8uXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdGhlIExGTyB3aWxsIHN0b3Bcblx0XHQgKiAgQHJldHVybnMge1RvbmUuTEZPfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkxGTy5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX3N0b3BwZWRTaWduYWwuc2V0VmFsdWVBdFRpbWUodGhpcy5fc3RvcHBlZFZhbHVlLCB0aW1lKTtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnN0b3AodGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN5bmMgdGhlIHN0YXJ0L3N0b3AvcGF1c2UgdG8gdGhlIHRyYW5zcG9ydFxuXHRcdCAqICBhbmQgdGhlIGZyZXF1ZW5jeSB0byB0aGUgYnBtIG9mIHRoZSB0cmFuc3BvcnRcblx0XHQgKiAgQHJldHVybnMge1RvbmUuTEZPfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogIGxmby5mcmVxdWVuY3kudmFsdWUgPSBcIjhuXCI7XG5cdFx0ICogIGxmby5zeW5jKCkuc3RhcnQoMClcblx0XHQgKiAgLy90aGUgcmF0ZSBvZiB0aGUgTEZPIHdpbGwgYWx3YXlzIGJlIGFuIGVpZ2h0aCBub3RlLFxuXHRcdCAqICAvL2V2ZW4gYXMgdGhlIHRlbXBvIGNoYW5nZXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTEZPLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX29zY2lsbGF0b3Iuc3luYygpO1xuXHQgICAgICAgIHRoaXMuX29zY2lsbGF0b3Iuc3luY0ZyZXF1ZW5jeSgpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICB1bnN5bmMgdGhlIExGTyBmcm9tIHRyYW5zcG9ydCBjb250cm9sXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkxGT30gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5MRk8ucHJvdG90eXBlLnVuc3luYyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnVuc3luYygpO1xuXHQgICAgICAgIHRoaXMuX29zY2lsbGF0b3IudW5zeW5jRnJlcXVlbmN5KCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG1pbml1bXVtIG91dHB1dCBvZiB0aGUgTEZPLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkxGTyNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIG1pblxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTEZPLnByb3RvdHlwZSwgJ21pbicsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RvVW5pdHModGhpcy5fc2NhbGVyLm1pbik7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtaW4pIHtcblx0ICAgICAgICAgICAgbWluID0gdGhpcy5fZnJvbVVuaXRzKG1pbik7XG5cdCAgICAgICAgICAgIHRoaXMuX3NjYWxlci5taW4gPSBtaW47XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgbWF4aW11bSBvdXRwdXQgb2YgdGhlIExGTy5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5MRk8jXG5cdFx0ICogQHR5cGUge251bWJlcn1cblx0XHQgKiBAbmFtZSBtYXhcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkxGTy5wcm90b3R5cGUsICdtYXgnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl90b1VuaXRzKHRoaXMuX3NjYWxlci5tYXgpO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAobWF4KSB7XG5cdCAgICAgICAgICAgIG1heCA9IHRoaXMuX2Zyb21Vbml0cyhtYXgpO1xuXHQgICAgICAgICAgICB0aGlzLl9zY2FsZXIubWF4ID0gbWF4O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHR5cGUgb2YgdGhlIG9zY2lsbGF0b3I6IHNpbmUsIHNxdWFyZSwgc2F3dG9vdGgsIHRyaWFuZ2xlLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkxGTyNcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxuXHRcdCAqIEBuYW1lIHR5cGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkxGTy5wcm90b3R5cGUsICd0eXBlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3NjaWxsYXRvci50eXBlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLl9zdG9wcGVkVmFsdWUgPSB0aGlzLl9vc2NpbGxhdG9yLl9nZXRJbml0aWFsVmFsdWUoKTtcblx0ICAgICAgICAgICAgdGhpcy5fc3RvcHBlZFNpZ25hbC52YWx1ZSA9IHRoaXMuX3N0b3BwZWRWYWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBwaGFzZSBvZiB0aGUgTEZPLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkxGTyNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIHBoYXNlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5MRk8ucHJvdG90eXBlLCAncGhhc2UnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vc2NpbGxhdG9yLnBoYXNlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocGhhc2UpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5waGFzZSA9IHBoYXNlO1xuXHQgICAgICAgICAgICB0aGlzLl9zdG9wcGVkVmFsdWUgPSB0aGlzLl9vc2NpbGxhdG9yLl9nZXRJbml0aWFsVmFsdWUoKTtcblx0ICAgICAgICAgICAgdGhpcy5fc3RvcHBlZFNpZ25hbC52YWx1ZSA9IHRoaXMuX3N0b3BwZWRWYWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBvdXRwdXQgdW5pdHMgb2YgdGhlIExGTy5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5MRk8jXG5cdFx0ICogQHR5cGUge1RvbmUuVHlwZX1cblx0XHQgKiBAbmFtZSB1bml0c1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTEZPLnByb3RvdHlwZSwgJ3VuaXRzJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5pdHM7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICAgICAgdmFyIGN1cnJlbnRNaW4gPSB0aGlzLm1pbjtcblx0ICAgICAgICAgICAgdmFyIGN1cnJlbnRNYXggPSB0aGlzLm1heDtcblx0ICAgICAgICAgICAgLy9jb252ZXJ0IHRoZSBtaW4gYW5kIHRoZSBtYXhcblx0ICAgICAgICAgICAgdGhpcy5fdW5pdHMgPSB2YWw7XG5cdCAgICAgICAgICAgIHRoaXMubWluID0gY3VycmVudE1pbjtcblx0ICAgICAgICAgICAgdGhpcy5tYXggPSBjdXJyZW50TWF4O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogTXV0ZSB0aGUgb3V0cHV0LlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkxGTyNcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKiBAbmFtZSBtdXRlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5MRk8ucHJvdG90eXBlLCAnbXV0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29zY2lsbGF0b3IubXV0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG11dGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5tdXRlID0gbXV0ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgc291cmNlLCBlaXRoZXIgXCJzdGFydGVkXCIgb3IgXCJzdG9wcGVkXCIuXG5cdFx0ICogIEB0eXBlIHtUb25lLlN0YXRlfVxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTEZPI1xuXHRcdCAqICBAbmFtZSBzdGF0ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTEZPLnByb3RvdHlwZSwgJ3N0YXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5zdGF0ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDb25uZWN0IHRoZSBvdXRwdXQgb2YgdGhlIExGTyB0byBhbiBBdWRpb1BhcmFtLCBBdWRpb05vZGUsIG9yIFRvbmUgTm9kZS5cblx0XHQgKiAgVG9uZS5MRk8gd2lsbCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgdG8gdGhlIGRlc3RpbmF0aW9uIHVuaXRzIG9mIHRoZVxuXHRcdCAqICB3aWxsIGdldCB0aGUgdW5pdHMgZnJvbSB0aGUgY29ubmVjdGVkIG5vZGUuXG5cdFx0ICogIEBwYXJhbSAge1RvbmUgfCBBdWRpb1BhcmFtIHwgQXVkaW9Ob2RlfSBub2RlXG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyfSBbb3V0cHV0TnVtPTBdIG9wdGlvbmFsbHkgd2hpY2ggb3V0cHV0IHRvIGNvbm5lY3QgZnJvbVxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW2lucHV0TnVtPTBdIG9wdGlvbmFsbHkgd2hpY2ggaW5wdXQgdG8gY29ubmVjdCB0b1xuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5MRk99IHRoaXNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuTEZPLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24gKG5vZGUpIHtcblx0ICAgICAgICBpZiAobm9kZS5jb25zdHJ1Y3RvciA9PT0gVG9uZS5TaWduYWwgfHwgbm9kZS5jb25zdHJ1Y3RvciA9PT0gVG9uZS5QYXJhbSkge1xuXHQgICAgICAgICAgICB0aGlzLmNvbnZlcnQgPSBub2RlLmNvbnZlcnQ7XG5cdCAgICAgICAgICAgIHRoaXMudW5pdHMgPSBub2RlLnVuaXRzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBUb25lLlNpZ25hbEJhc2UucHJvdG90eXBlLmNvbm5lY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgcHJpdmF0ZSBtZXRob2QgYm9ycm93ZWQgZnJvbSBQYXJhbSBjb252ZXJ0c1xuXHRcdCAqICB1bml0cyBmcm9tIHRoZWlyIGRlc3RpbmF0aW9uIHZhbHVlXG5cdFx0ICogIEBmdW5jdGlvblxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5MRk8ucHJvdG90eXBlLl9mcm9tVW5pdHMgPSBUb25lLlBhcmFtLnByb3RvdHlwZS5fZnJvbVVuaXRzO1xuXHQgICAgLyoqXG5cdFx0ICogIHByaXZhdGUgbWV0aG9kIGJvcnJvd2VkIGZyb20gUGFyYW0gY29udmVydHNcblx0XHQgKiAgdW5pdHMgdG8gdGhlaXIgZGVzdGluYXRpb24gdmFsdWVcblx0XHQgKiAgQGZ1bmN0aW9uXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkxGTy5wcm90b3R5cGUuX3RvVW5pdHMgPSBUb25lLlBhcmFtLnByb3RvdHlwZS5fdG9Vbml0cztcblx0ICAgIC8qKlxuXHRcdCAqICBkaXNjb25uZWN0IGFuZCBkaXNwb3NlXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkxGT30gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5MRk8ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdhbXBsaXR1ZGUnLFxuXHQgICAgICAgICAgICAnZnJlcXVlbmN5J1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMuX29zY2lsbGF0b3IuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX29zY2lsbGF0b3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3N0b3BwZWRTaWduYWwuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3N0b3BwZWRTaWduYWwgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3plcm9zLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl96ZXJvcyA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fc2NhbGVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9zY2FsZXIgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2EyZy5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fYTJnID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5hbXBsaXR1ZGUgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkxGTztcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuTGltaXRlciB3aWxsIGxpbWl0IHRoZSBsb3VkbmVzcyBvZiBhbiBpbmNvbWluZyBzaWduYWwuXG5cdFx0ICogICAgICAgICBJdCBpcyBjb21wb3NlZCBvZiBhIFRvbmUuQ29tcHJlc3NvciB3aXRoIGEgZmFzdCBhdHRhY2tcblx0XHQgKiAgICAgICAgIGFuZCByZWxlYXNlLiBMaW1pdGVycyBhcmUgY29tbW9ubHkgdXNlZCB0byBzYWZlZ3VhcmQgYWdhaW5zdFxuXHRcdCAqICAgICAgICAgc2lnbmFsIGNsaXBwaW5nLiBVbmxpa2UgYSBjb21wcmVzc29yLCBsaW1pdGVycyBkbyBub3QgcHJvdmlkZVxuXHRcdCAqICAgICAgICAgc21vb3RoIGdhaW4gcmVkdWN0aW9uIGFuZCBhbG1vc3QgY29tcGxldGVseSBwcmV2ZW50XG5cdFx0ICogICAgICAgICBhZGRpdGlvbmFsIGdhaW4gYWJvdmUgdGhlIHRocmVzaG9sZC5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gdGhyZXNob2xkIFRoZSB0aGVzaG9sZCBhYm92ZSB3aGljaCB0aGUgbGltaXRpbmcgaXMgYXBwbGllZC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAgdmFyIGxpbWl0ZXIgPSBuZXcgVG9uZS5MaW1pdGVyKC02KTtcblx0XHQgKi9cblx0ICAgIFRvbmUuTGltaXRlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbJ3RocmVzaG9sZCddLCBUb25lLkxpbWl0ZXIpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGNvbXByZXNzb3Jcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkNvbXByZXNzb3J9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9jb21wcmVzc29yID0gdGhpcy5pbnB1dCA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuQ29tcHJlc3Nvcih7XG5cdCAgICAgICAgICAgICdhdHRhY2snOiAwLjAwMSxcblx0ICAgICAgICAgICAgJ2RlY2F5JzogMC4wMDEsXG5cdCAgICAgICAgICAgICd0aHJlc2hvbGQnOiBvcHRpb25zLnRocmVzaG9sZFxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIHRocmVzaG9sZCBvZiBvZiB0aGUgbGltaXRlclxuXHRcdFx0ICogQHR5cGUge0RlY2liZWx9XG5cdFx0XHQgKiBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRoaXMuX2NvbXByZXNzb3IudGhyZXNob2xkO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KCd0aHJlc2hvbGQnKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkxpbWl0ZXIsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdCB2YWx1ZVxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqL1xuXHQgICAgVG9uZS5MaW1pdGVyLmRlZmF1bHRzID0geyAndGhyZXNob2xkJzogLTEyIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkxpbWl0ZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTGltaXRlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2NvbXByZXNzb3IuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2NvbXByZXNzb3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCd0aHJlc2hvbGQnKTtcblx0ICAgICAgICB0aGlzLnRocmVzaG9sZCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuTGltaXRlcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuTG93cGFzcyBpcyBhIGxvd3Bhc3MgZmVlZGJhY2sgY29tYiBmaWx0ZXIuIEl0IGlzIHNpbWlsYXIgdG9cblx0XHQgKiAgICAgICAgIFRvbmUuRmVlZGJhY2tDb21iRmlsdGVyLCBidXQgaW5jbHVkZXMgYSBsb3dwYXNzIGZpbHRlci5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge1RpbWV8T2JqZWN0fSBbZGVsYXlUaW1lXSBUaGUgZGVsYXkgdGltZSBvZiB0aGUgY29tYiBmaWx0ZXJcblx0XHQgKiAgQHBhcmFtIHtOb3JtYWxSYW5nZT19IHJlc29uYW5jZSBUaGUgcmVzb25hbmNlIChmZWVkYmFjaykgb2YgdGhlIGNvbWIgZmlsdGVyXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5PX0gZGFtcGVuaW5nIFRoZSBjdXRvZmYgb2YgdGhlIGxvd3Bhc3MgZmlsdGVyIGRhbXBlbnMgdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCBhcyBpdCBpcyBmZWRiYWNrLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5Mb3dwYXNzQ29tYkZpbHRlciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdkZWxheVRpbWUnLFxuXHQgICAgICAgICAgICAncmVzb25hbmNlJyxcblx0ICAgICAgICAgICAgJ2RhbXBlbmluZydcblx0ICAgICAgICBdLCBUb25lLkxvd3Bhc3NDb21iRmlsdGVyKTtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY3JlYXRlSW5zT3V0cygxLCAxKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgZGVsYXkgbm9kZVxuXHRcdFx0ICogIEB0eXBlIHtEZWxheU5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2RlbGF5ID0gdGhpcy5pbnB1dCA9IG5ldyBUb25lLkRlbGF5KG9wdGlvbnMuZGVsYXlUaW1lKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGVsYXlUaW1lIG9mIHRoZSBjb21iIGZpbHRlci5cblx0XHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmRlbGF5VGltZSA9IHRoaXMuX2RlbGF5LmRlbGF5VGltZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbG93cGFzcyBmaWx0ZXJcblx0XHRcdCAqICBAdHlwZSAge0JpcXVhZEZpbHRlck5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xvd3Bhc3MgPSB0aGlzLm91dHB1dCA9IHRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTtcblx0ICAgICAgICB0aGlzLl9sb3dwYXNzLlEudmFsdWUgPSAtMy4wMTAyOTk5NTY2Mzk4MTI1O1xuXHQgICAgICAgIHRoaXMuX2xvd3Bhc3MudHlwZSA9ICdsb3dwYXNzJztcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGFtcGVuaW5nIGNvbnRyb2wgb2YgdGhlIGZlZWRiYWNrXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmRhbXBlbmluZyA9IG5ldyBUb25lLlBhcmFtKHtcblx0ICAgICAgICAgICAgJ3BhcmFtJzogdGhpcy5fbG93cGFzcy5mcmVxdWVuY3ksXG5cdCAgICAgICAgICAgICd1bml0cyc6IFRvbmUuVHlwZS5GcmVxdWVuY3ksXG5cdCAgICAgICAgICAgICd2YWx1ZSc6IG9wdGlvbnMuZGFtcGVuaW5nXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGZlZWRiYWNrIGdhaW5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5HYWlufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mZWVkYmFjayA9IG5ldyBUb25lLkdhaW4ob3B0aW9ucy5yZXNvbmFuY2UsIFRvbmUuVHlwZS5Ob3JtYWxSYW5nZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGFtb3VudCBvZiBmZWVkYmFjayBvZiB0aGUgZGVsYXllZCBzaWduYWwuXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucmVzb25hbmNlID0gdGhpcy5fZmVlZGJhY2suZ2Fpbjtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5fZGVsYXkuY2hhaW4odGhpcy5fbG93cGFzcywgdGhpcy5fZmVlZGJhY2ssIHRoaXMuX2RlbGF5KTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdkYW1wZW5pbmcnLFxuXHQgICAgICAgICAgICAncmVzb25hbmNlJyxcblx0ICAgICAgICAgICAgJ2RlbGF5VGltZSdcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkxvd3Bhc3NDb21iRmlsdGVyLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGRlZmF1bHQgcGFyYW1ldGVyc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Mb3dwYXNzQ29tYkZpbHRlci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZGVsYXlUaW1lJzogMC4xLFxuXHQgICAgICAgICdyZXNvbmFuY2UnOiAwLjUsXG5cdCAgICAgICAgJ2RhbXBlbmluZyc6IDMwMDBcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkxvd3Bhc3NDb21iRmlsdGVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkxvd3Bhc3NDb21iRmlsdGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAnZGFtcGVuaW5nJyxcblx0ICAgICAgICAgICAgJ3Jlc29uYW5jZScsXG5cdCAgICAgICAgICAgICdkZWxheVRpbWUnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5kYW1wZW5pbmcuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZGFtcGVuaW5nID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnJlc29uYW5jZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5yZXNvbmFuY2UgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9kZWxheSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5kZWxheVRpbWUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2xvd3Bhc3MuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX2xvd3Bhc3MgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2ZlZWRiYWNrLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB0aGlzLl9mZWVkYmFjayA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuTG93cGFzc0NvbWJGaWx0ZXI7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgVG9uZS5NZXJnZSBicmluZ3MgdHdvIHNpZ25hbHMgaW50byB0aGUgbGVmdCBhbmQgcmlnaHRcblx0XHQgKiAgICAgICAgICBjaGFubmVscyBvZiBhIHNpbmdsZSBzdGVyZW8gY2hhbm5lbC5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBtZXJnZSA9IG5ldyBUb25lLk1lcmdlKCkudG9NYXN0ZXIoKTtcblx0XHQgKiAvL3JvdXRpbmcgYSBzaW5lIHRvbmUgaW4gdGhlIGxlZnQgY2hhbm5lbFxuXHRcdCAqIC8vYW5kIG5vaXNlIGluIHRoZSByaWdodCBjaGFubmVsXG5cdFx0ICogdmFyIG9zYyA9IG5ldyBUb25lLk9zY2lsbGF0b3IoKS5jb25uZWN0KG1lcmdlLmxlZnQpO1xuXHRcdCAqIHZhciBub2lzZSA9IG5ldyBUb25lLk5vaXNlKCkuY29ubmVjdChtZXJnZS5yaWdodCk7XG5cdFx0ICogLy9zdGFydGluZyBvdXIgb3NjaWxsYXRvcnNcblx0XHQgKiBub2lzZS5zdGFydCgpO1xuXHRcdCAqIG9zYy5zdGFydCgpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NZXJnZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY3JlYXRlSW5zT3V0cygyLCAwKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbGVmdCBpbnB1dCBjaGFubmVsLlxuXHRcdFx0ICogIEFsaWFzIGZvciA8Y29kZT5pbnB1dFswXTwvY29kZT5cblx0XHRcdCAqICBAdHlwZSB7R2Fpbk5vZGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmlucHV0WzBdID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSByaWdodCBpbnB1dCBjaGFubmVsLlxuXHRcdFx0ICogIEFsaWFzIGZvciA8Y29kZT5pbnB1dFsxXTwvY29kZT4uXG5cdFx0XHQgKiAgQHR5cGUge0dhaW5Ob2RlfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHRoaXMuaW5wdXRbMV0gPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG1lcmdlciBub2RlIGZvciB0aGUgdHdvIGNoYW5uZWxzXG5cdFx0XHQgKiAgQHR5cGUge0NoYW5uZWxNZXJnZXJOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tZXJnZXIgPSB0aGlzLm91dHB1dCA9IHRoaXMuY29udGV4dC5jcmVhdGVDaGFubmVsTWVyZ2VyKDIpO1xuXHQgICAgICAgIC8vY29ubmVjdGlvbnNcblx0ICAgICAgICB0aGlzLmxlZnQuY29ubmVjdCh0aGlzLl9tZXJnZXIsIDAsIDApO1xuXHQgICAgICAgIHRoaXMucmlnaHQuY29ubmVjdCh0aGlzLl9tZXJnZXIsIDAsIDEpO1xuXHQgICAgICAgIHRoaXMubGVmdC5jaGFubmVsQ291bnQgPSAxO1xuXHQgICAgICAgIHRoaXMucmlnaHQuY2hhbm5lbENvdW50ID0gMTtcblx0ICAgICAgICB0aGlzLmxlZnQuY2hhbm5lbENvdW50TW9kZSA9ICdleHBsaWNpdCc7XG5cdCAgICAgICAgdGhpcy5yaWdodC5jaGFubmVsQ291bnRNb2RlID0gJ2V4cGxpY2l0Jztcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLk1lcmdlLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk1lcmdlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk1lcmdlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5sZWZ0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmxlZnQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMucmlnaHQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMucmlnaHQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX21lcmdlci5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgdGhpcy5fbWVyZ2VyID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5NZXJnZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLk1ldGVyIGdldHMgdGhlIFtSTVNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Jvb3RfbWVhbl9zcXVhcmUpXG5cdFx0ICogICAgICAgICAgb2YgYW4gaW5wdXQgc2lnbmFsIHdpdGggc29tZSBhdmVyYWdpbmcgYXBwbGllZC4gSXQgY2FuIGFsc28gZ2V0IHRoZSByYXdcblx0XHQgKiAgICAgICAgICB2YWx1ZSBvZiB0aGUgaW5wdXQgc2lnbmFsLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBzbW9vdGhpbmcgVGhlIGFtb3VudCBvZiBzbW9vdGhpbmcgYXBwbGllZCBiZXR3ZWVuIGZyYW1lcy5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgbWV0ZXIgPSBuZXcgVG9uZS5NZXRlcigpO1xuXHRcdCAqIHZhciBtaWMgPSBuZXcgVG9uZS5Vc2VyTWVkaWEoKS5vcGVuKCk7XG5cdFx0ICogLy9jb25uZWN0IG1pYyB0byB0aGUgbWV0ZXJcblx0XHQgKiBtaWMuY29ubmVjdChtZXRlcik7XG5cdFx0ICogLy90aGUgY3VycmVudCBsZXZlbCBvZiB0aGUgbWljIGlucHV0IGluIGRlY2liZWxzXG5cdFx0ICogdmFyIGxldmVsID0gbWV0ZXIuZ2V0VmFsdWUoKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuTWV0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydzbW9vdGhpbmcnXSwgVG9uZS5NZXRlcik7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW5hbHlzZXIgbm9kZSB3aGljaCBjb21wdXRlcyB0aGUgbGV2ZWxzLlxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLkFuYWx5c2VyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMub3V0cHV0ID0gdGhpcy5fYW5hbHlzZXIgPSBuZXcgVG9uZS5BbmFseXNlcignd2F2ZWZvcm0nLCAxMDI0KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW1vdW50IG9mIGNhcnJ5b3ZlciBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCBsYXN0IGZyYW1lLlxuXHRcdFx0ICogIE9ubHkgYXBwbGllZCBtZXRlciBmb3IgXCJsZXZlbFwiIHR5cGUuXG5cdFx0XHQgKiAgQHR5cGUgIHtOdW1iZXJ9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnNtb290aGluZyA9IG9wdGlvbnMuc21vb3RoaW5nO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuTWV0ZXIsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKi9cblx0ICAgIFRvbmUuTWV0ZXIuZGVmYXVsdHMgPSB7ICdzbW9vdGhpbmcnOiAwLjggfTtcblx0ICAgIC8qKlxuXHRcdCAqICBHZXQgdGhlIGN1cnJlbnQgZGVjaWJlbCB2YWx1ZSBvZiB0aGUgaW5jb21pbmcgc2lnbmFsXG5cdFx0ICogIEByZXR1cm5zIHtEZWNpYmVsc31cblx0XHQgKi9cblx0ICAgIFRvbmUuTWV0ZXIucHJvdG90eXBlLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX2FuYWx5c2VyLnR5cGUgPSAnZmZ0Jztcblx0ICAgICAgICB2YXIgdmFsdWVzID0gdGhpcy5fYW5hbHlzZXIuZ2V0VmFsdWUoKTtcblx0ICAgICAgICB2YXIgb2Zmc2V0ID0gMjg7XG5cdCAgICAgICAgLy8gbm9ybWFsaXplcyBtb3N0IHNpZ25hbCBsZXZlbHNcblx0ICAgICAgICAvLyBUT0RPOiBjb21wdXRlIGxvdWRuZXNzIGZyb20gRkZUXG5cdCAgICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KHRoaXMsIHZhbHVlcykgKyBvZmZzZXQ7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEdldCB0aGUgc2lnbmFsIHZhbHVlIG9mIHRoZSBpbmNvbWluZyBzaWduYWxcblx0XHQgKiAgQHJldHVybnMge051bWJlcn1cblx0XHQgKi9cblx0ICAgIFRvbmUuTWV0ZXIucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX2FuYWx5c2VyLnR5cGUgPSAnd2F2ZWZvcm0nO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX2FuYWx5c2VyLmdldFZhbHVlKCk7XG5cdCAgICAgICAgcmV0dXJuIHZhbHVlWzBdO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIEEgdmFsdWUgZnJvbSAwIC0+IDEgd2hlcmUgMCByZXByZXNlbnRzIG5vIHRpbWUgYXZlcmFnaW5nIHdpdGggdGhlIGxhc3QgYW5hbHlzaXMgZnJhbWUuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuTWV0ZXIjXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKiBAbmFtZSBzbW9vdGhpbmdcblx0XHQgKiBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk1ldGVyLnByb3RvdHlwZSwgJ3Ntb290aGluZycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FuYWx5c2VyLnNtb290aGluZztcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9hbmFseXNlci5zbW9vdGhpbmcgPSB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk1ldGVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk1ldGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fYW5hbHlzZXIuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2FuYWx5c2VyID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5NZXRlcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKlx0QGNsYXNzICBUb25lLlNwbGl0IHNwbGl0cyBhbiBpbmNvbWluZyBzaWduYWwgaW50byBsZWZ0IGFuZCByaWdodCBjaGFubmVscy5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBzcGxpdCA9IG5ldyBUb25lLlNwbGl0KCk7XG5cdFx0ICogc3RlcmVvU2lnbmFsLmNvbm5lY3Qoc3BsaXQpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TcGxpdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY3JlYXRlSW5zT3V0cygwLCAyKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBAdHlwZSB7Q2hhbm5lbFNwbGl0dGVyTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc3BsaXR0ZXIgPSB0aGlzLmlucHV0ID0gdGhpcy5jb250ZXh0LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcigyKTtcblx0ICAgICAgICB0aGlzLl9zcGxpdHRlci5jaGFubmVsQ291bnQgPSAyO1xuXHQgICAgICAgIHRoaXMuX3NwbGl0dGVyLmNoYW5uZWxDb3VudE1vZGUgPSAnZXhwbGljaXQnO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIExlZnQgY2hhbm5lbCBvdXRwdXQuXG5cdFx0XHQgKiAgQWxpYXMgZm9yIDxjb2RlPm91dHB1dFswXTwvY29kZT5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5HYWlufVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5vdXRwdXRbMF0gPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgUmlnaHQgY2hhbm5lbCBvdXRwdXQuXG5cdFx0XHQgKiAgQWxpYXMgZm9yIDxjb2RlPm91dHB1dFsxXTwvY29kZT5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5HYWlufVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5yaWdodCA9IHRoaXMub3V0cHV0WzFdID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIC8vY29ubmVjdGlvbnNcblx0ICAgICAgICB0aGlzLl9zcGxpdHRlci5jb25uZWN0KHRoaXMubGVmdCwgMCwgMCk7XG5cdCAgICAgICAgdGhpcy5fc3BsaXR0ZXIuY29ubmVjdCh0aGlzLnJpZ2h0LCAxLCAwKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlNwbGl0LCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlNwbGl0fSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlNwbGl0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc3BsaXR0ZXIuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMubGVmdC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5sZWZ0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnJpZ2h0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLnJpZ2h0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9zcGxpdHRlciA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuU3BsaXQ7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBNaWQvU2lkZSBwcm9jZXNzaW5nIHNlcGFyYXRlcyB0aGUgdGhlICdtaWQnIHNpZ25hbFxuXHRcdCAqICAgICAgICAgKHdoaWNoIGNvbWVzIG91dCBvZiBib3RoIHRoZSBsZWZ0IGFuZCB0aGUgcmlnaHQgY2hhbm5lbClcblx0XHQgKiAgICAgICAgIGFuZCB0aGUgJ3NpZGUnICh3aGljaCBvbmx5IGNvbWVzIG91dCBvZiB0aGUgdGhlIHNpZGUgY2hhbm5lbHMpLiA8YnI+PGJyPlxuXHRcdCAqICAgICAgICAgPGNvZGU+XG5cdFx0ICogICAgICAgICBNaWQgPSAoTGVmdCtSaWdodCkvc3FydCgyKTsgICAvLyBvYnRhaW4gbWlkLXNpZ25hbCBmcm9tIGxlZnQgYW5kIHJpZ2h0PGJyPlxuXHRcdCAqICAgICAgICAgU2lkZSA9IChMZWZ0LVJpZ2h0KS9zcXJ0KDIpOyAgIC8vIG9idGFpbiBzaWRlLXNpZ25hbCBmcm9tIGxlZnQgYW5kIHJpZ2g8YnI+XG5cdFx0ICogICAgICAgICA8L2NvZGU+XG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKi9cblx0ICAgIFRvbmUuTWlkU2lkZVNwbGl0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5jcmVhdGVJbnNPdXRzKDAsIDIpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHNwbGl0IHRoZSBpbmNvbWluZyBzaWduYWwgaW50byBsZWZ0IGFuZCByaWdodCBjaGFubmVsc1xuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5TcGxpdH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc3BsaXQgPSB0aGlzLmlucHV0ID0gbmV3IFRvbmUuU3BsaXQoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbWlkIHNlbmQuIENvbm5lY3QgdG8gbWlkIHByb2Nlc3NpbmcuIEFsaWFzIGZvclxuXHRcdFx0ICogIDxjb2RlPm91dHB1dFswXTwvY29kZT5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5BZGR9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9taWRBZGQgPSBuZXcgVG9uZS5BZGQoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIE11bHRpcGx5IHRoZSBfbWlkQWRkIGJ5IHNxcnQoMS8yKVxuXHRcdFx0ICogQHR5cGUge1RvbmUuTXVsdGlwbHl9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm1pZCA9IHRoaXMub3V0cHV0WzBdID0gbmV3IFRvbmUuTXVsdGlwbHkoTWF0aC5TUVJUMV8yKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgc2lkZSBvdXRwdXQuIENvbm5lY3QgdG8gc2lkZSBwcm9jZXNzaW5nLiBBbHNvIE91dHB1dCAxXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuU3VidHJhY3R9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zaWRlU3VidHJhY3QgPSBuZXcgVG9uZS5TdWJ0cmFjdCgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogTXVsdGlwbHkgdGhlIF9taWRBZGQgYnkgc3FydCgxLzIpXG5cdFx0XHQgKiBAdHlwZSB7VG9uZS5NdWx0aXBseX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuc2lkZSA9IHRoaXMub3V0cHV0WzFdID0gbmV3IFRvbmUuTXVsdGlwbHkoTWF0aC5TUVJUMV8yKTtcblx0ICAgICAgICB0aGlzLl9zcGxpdC5jb25uZWN0KHRoaXMuX21pZEFkZCwgMCwgMCk7XG5cdCAgICAgICAgdGhpcy5fc3BsaXQuY29ubmVjdCh0aGlzLl9taWRBZGQsIDEsIDEpO1xuXHQgICAgICAgIHRoaXMuX3NwbGl0LmNvbm5lY3QodGhpcy5fc2lkZVN1YnRyYWN0LCAwLCAwKTtcblx0ICAgICAgICB0aGlzLl9zcGxpdC5jb25uZWN0KHRoaXMuX3NpZGVTdWJ0cmFjdCwgMSwgMSk7XG5cdCAgICAgICAgdGhpcy5fbWlkQWRkLmNvbm5lY3QodGhpcy5taWQpO1xuXHQgICAgICAgIHRoaXMuX3NpZGVTdWJ0cmFjdC5jb25uZWN0KHRoaXMuc2lkZSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5NaWRTaWRlU3BsaXQsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5NaWRTaWRlU3BsaXR9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTWlkU2lkZVNwbGl0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5taWQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMubWlkID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnNpZGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuc2lkZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbWlkQWRkLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9taWRBZGQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3NpZGVTdWJ0cmFjdC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc2lkZVN1YnRyYWN0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9zcGxpdC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc3BsaXQgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk1pZFNpZGVTcGxpdDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIE1pZC9TaWRlIHByb2Nlc3Npbmcgc2VwYXJhdGVzIHRoZSB0aGUgJ21pZCcgc2lnbmFsXG5cdFx0ICogICAgICAgICAod2hpY2ggY29tZXMgb3V0IG9mIGJvdGggdGhlIGxlZnQgYW5kIHRoZSByaWdodCBjaGFubmVsKVxuXHRcdCAqICAgICAgICAgYW5kIHRoZSAnc2lkZScgKHdoaWNoIG9ubHkgY29tZXMgb3V0IG9mIHRoZSB0aGUgc2lkZSBjaGFubmVscykuXG5cdFx0ICogICAgICAgICBNaWRTaWRlTWVyZ2UgbWVyZ2VzIHRoZSBtaWQgYW5kIHNpZGUgc2lnbmFsIGFmdGVyIHRoZXkndmUgYmVlbiBzZXBlcmF0ZWRcblx0XHQgKiAgICAgICAgIGJ5IFRvbmUuTWlkU2lkZVNwbGl0Ljxicj48YnI+XG5cdFx0ICogICAgICAgICA8Y29kZT5cblx0XHQgKiAgICAgICAgIExlZnQgPSAoTWlkK1NpZGUpL3NxcnQoMik7ICAgLy8gb2J0YWluIGxlZnQgc2lnbmFsIGZyb20gbWlkIGFuZCBzaWRlPGJyPlxuXHRcdCAqICAgICAgICAgUmlnaHQgPSAoTWlkLVNpZGUpL3NxcnQoMik7ICAgLy8gb2J0YWluIHJpZ2h0IHNpZ25hbCBmcm9tIG1pZCBhbmQgc2lkZTxicj5cblx0XHQgKiAgICAgICAgIDwvY29kZT5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHQgICAgVG9uZS5NaWRTaWRlTWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmNyZWF0ZUluc091dHMoMiwgMCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG1pZCBzaWduYWwgaW5wdXQuIEFsaWFzIGZvclxuXHRcdFx0ICogIDxjb2RlPmlucHV0WzBdPC9jb2RlPlxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5HYWlufVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5taWQgPSB0aGlzLmlucHV0WzBdID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHJlY29tYmluZSB0aGUgbWlkL3NpZGUgaW50byBMZWZ0XG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuQWRkfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sZWZ0ID0gbmV3IFRvbmUuQWRkKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBNdWx0aXBseSB0aGUgbGVmdCBieSBzcXJ0KDEvMilcblx0XHRcdCAqIEB0eXBlIHtUb25lLk11bHRpcGx5fVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdGltZXNUd29MZWZ0ID0gbmV3IFRvbmUuTXVsdGlwbHkoTWF0aC5TUVJUMV8yKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgc2lkZSBzaWduYWwgaW5wdXQuIEFsaWFzIGZvclxuXHRcdFx0ICogIDxjb2RlPmlucHV0WzFdPC9jb2RlPlxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5HYWlufVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5zaWRlID0gdGhpcy5pbnB1dFsxXSA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICByZWNvbWJpbmUgdGhlIG1pZC9zaWRlIGludG8gUmlnaHRcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5TdWJ0cmFjdH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcmlnaHQgPSBuZXcgVG9uZS5TdWJ0cmFjdCgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogTXVsdGlwbHkgdGhlIHJpZ2h0IGJ5IHNxcnQoMS8yKVxuXHRcdFx0ICogQHR5cGUge1RvbmUuTXVsdGlwbHl9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl90aW1lc1R3b1JpZ2h0ID0gbmV3IFRvbmUuTXVsdGlwbHkoTWF0aC5TUVJUMV8yKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBNZXJnZSB0aGUgbGVmdC9yaWdodCBzaWduYWwgYmFjayBpbnRvIGEgc3RlcmVvIHNpZ25hbC5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5NZXJnZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbWVyZ2UgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLk1lcmdlKCk7XG5cdCAgICAgICAgdGhpcy5taWQuY29ubmVjdCh0aGlzLl9sZWZ0LCAwLCAwKTtcblx0ICAgICAgICB0aGlzLnNpZGUuY29ubmVjdCh0aGlzLl9sZWZ0LCAwLCAxKTtcblx0ICAgICAgICB0aGlzLm1pZC5jb25uZWN0KHRoaXMuX3JpZ2h0LCAwLCAwKTtcblx0ICAgICAgICB0aGlzLnNpZGUuY29ubmVjdCh0aGlzLl9yaWdodCwgMCwgMSk7XG5cdCAgICAgICAgdGhpcy5fbGVmdC5jb25uZWN0KHRoaXMuX3RpbWVzVHdvTGVmdCk7XG5cdCAgICAgICAgdGhpcy5fcmlnaHQuY29ubmVjdCh0aGlzLl90aW1lc1R3b1JpZ2h0KTtcblx0ICAgICAgICB0aGlzLl90aW1lc1R3b0xlZnQuY29ubmVjdCh0aGlzLl9tZXJnZSwgMCwgMCk7XG5cdCAgICAgICAgdGhpcy5fdGltZXNUd29SaWdodC5jb25uZWN0KHRoaXMuX21lcmdlLCAwLCAxKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLk1pZFNpZGVNZXJnZSwgVG9uZS5BdWRpb05vZGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIGNsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk1pZFNpZGVNZXJnZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NaWRTaWRlTWVyZ2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLm1pZC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5taWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuc2lkZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5zaWRlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9sZWZ0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9sZWZ0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl90aW1lc1R3b0xlZnQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3RpbWVzVHdvTGVmdCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fcmlnaHQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3JpZ2h0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl90aW1lc1R3b1JpZ2h0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl90aW1lc1R3b1JpZ2h0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9tZXJnZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbWVyZ2UgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk1pZFNpZGVNZXJnZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuTWlkU2lkZUNvbXByZXNzb3IgYXBwbGllcyB0d28gZGlmZmVyZW50IGNvbXByZXNzb3JzIHRvIHRoZSBtaWRcblx0XHQgKiAgICAgICAgIGFuZCBzaWRlIHNpZ25hbCBjb21wb25lbnRzLiBTZWUgVG9uZS5NaWRTaWRlU3BsaXQuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIG1pZCBhbmQgc2lkZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29ycy5cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICovXG5cdCAgICBUb25lLk1pZFNpZGVDb21wcmVzc29yID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5NaWRTaWRlQ29tcHJlc3Nvci5kZWZhdWx0cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG1pZC9zaWRlIHNwbGl0XG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLk1pZFNpZGVTcGxpdH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZVNwbGl0ID0gdGhpcy5pbnB1dCA9IG5ldyBUb25lLk1pZFNpZGVTcGxpdCgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBtaWQvc2lkZSByZWNvbWJpbmF0aW9uXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLk1pZFNpZGVNZXJnZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZU1lcmdlID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5NaWRTaWRlTWVyZ2UoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY29tcHJlc3NvciBhcHBsaWVkIHRvIHRoZSBtaWQgc2lnbmFsXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLkNvbXByZXNzb3J9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm1pZCA9IG5ldyBUb25lLkNvbXByZXNzb3Iob3B0aW9ucy5taWQpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBjb21wcmVzc29yIGFwcGxpZWQgdG8gdGhlIHNpZGUgc2lnbmFsXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLkNvbXByZXNzb3J9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnNpZGUgPSBuZXcgVG9uZS5Db21wcmVzc29yKG9wdGlvbnMuc2lkZSk7XG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZVNwbGl0Lm1pZC5jaGFpbih0aGlzLm1pZCwgdGhpcy5fbWlkU2lkZU1lcmdlLm1pZCk7XG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZVNwbGl0LnNpZGUuY2hhaW4odGhpcy5zaWRlLCB0aGlzLl9taWRTaWRlTWVyZ2Uuc2lkZSk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnbWlkJyxcblx0ICAgICAgICAgICAgJ3NpZGUnXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5NaWRTaWRlQ29tcHJlc3NvciwgVG9uZS5BdWRpb05vZGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLk1pZFNpZGVDb21wcmVzc29yLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdtaWQnOiB7XG5cdCAgICAgICAgICAgICdyYXRpbyc6IDMsXG5cdCAgICAgICAgICAgICd0aHJlc2hvbGQnOiAtMjQsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJzogMC4wMyxcblx0ICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDIsXG5cdCAgICAgICAgICAgICdrbmVlJzogMTZcblx0ICAgICAgICB9LFxuXHQgICAgICAgICdzaWRlJzoge1xuXHQgICAgICAgICAgICAncmF0aW8nOiA2LFxuXHQgICAgICAgICAgICAndGhyZXNob2xkJzogLTMwLFxuXHQgICAgICAgICAgICAncmVsZWFzZSc6IDAuMjUsXG5cdCAgICAgICAgICAgICdhdHRhY2snOiAwLjAzLFxuXHQgICAgICAgICAgICAna25lZSc6IDEwXG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuTWlkU2lkZUNvbXByZXNzb3J9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTWlkU2lkZUNvbXByZXNzb3IucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdtaWQnLFxuXHQgICAgICAgICAgICAnc2lkZSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLm1pZC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5taWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuc2lkZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5zaWRlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9taWRTaWRlU3BsaXQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21pZFNpZGVTcGxpdCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZU1lcmdlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9taWRTaWRlTWVyZ2UgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk1pZFNpZGVDb21wcmVzc29yO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5Nb25vIGNvZXJjZXMgdGhlIGluY29taW5nIG1vbm8gb3Igc3RlcmVvIHNpZ25hbCBpbnRvIGEgbW9ubyBzaWduYWxcblx0XHQgKiAgICAgICAgIHdoZXJlIGJvdGggbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4gVGhpcyBjYW4gYmUgdXNlZnVsXG5cdFx0ICogICAgICAgICBmb3IgW3N0ZXJlbyBpbWFnaW5nXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdGVyZW9faW1hZ2luZykuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKi9cblx0ICAgIFRvbmUuTW9ubyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuY3JlYXRlSW5zT3V0cygxLCAwKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBtZXJnZSB0aGUgc2lnbmFsXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTWVyZ2V9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX21lcmdlID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5NZXJnZSgpO1xuXHQgICAgICAgIHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLl9tZXJnZSwgMCwgMCk7XG5cdCAgICAgICAgdGhpcy5pbnB1dC5jb25uZWN0KHRoaXMuX21lcmdlLCAwLCAxKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLk1vbm8sIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Nb25vfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk1vbm8ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9tZXJnZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbWVyZ2UgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk1vbm87XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBBIGNvbXByZXNzb3Igd2l0aCBzZXBlcmF0ZSBjb250cm9scyBvdmVyIGxvdy9taWQvaGlnaCBkeW5hbWljc1xuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBsb3cvbWlkL2hpZ2ggY29tcHJlc3NvciBzZXR0aW5ncy5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAgdmFyIG11bHRpYmFuZCA9IG5ldyBUb25lLk11bHRpYmFuZENvbXByZXNzb3Ioe1xuXHRcdCAqICBcdFwibG93RnJlcXVlbmN5XCIgOiAyMDAsXG5cdFx0ICogIFx0XCJoaWdoRnJlcXVlbmN5XCIgOiAxMzAwXG5cdFx0ICogIFx0XCJsb3dcIiA6IHtcblx0XHQgKiAgXHRcdFwidGhyZXNob2xkXCIgOiAtMTJcblx0XHQgKiAgXHR9XG5cdFx0ICogIH0pXG5cdFx0ICovXG5cdCAgICBUb25lLk11bHRpYmFuZENvbXByZXNzb3IgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdEFyZyhhcmd1bWVudHMsIFRvbmUuTXVsdGliYW5kQ29tcHJlc3Nvci5kZWZhdWx0cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgc3BsaXQgdGhlIGluY29taW5nIHNpZ25hbCBpbnRvIGhpZ2gvbWlkL2xvd1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLk11bHRpYmFuZFNwbGl0fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zcGxpdHRlciA9IHRoaXMuaW5wdXQgPSBuZXcgVG9uZS5NdWx0aWJhbmRTcGxpdCh7XG5cdCAgICAgICAgICAgICdsb3dGcmVxdWVuY3knOiBvcHRpb25zLmxvd0ZyZXF1ZW5jeSxcblx0ICAgICAgICAgICAgJ2hpZ2hGcmVxdWVuY3knOiBvcHRpb25zLmhpZ2hGcmVxdWVuY3lcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBsb3cvbWlkIGNyb3Nzb3ZlciBmcmVxdWVuY3kuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmxvd0ZyZXF1ZW5jeSA9IHRoaXMuX3NwbGl0dGVyLmxvd0ZyZXF1ZW5jeTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBtaWQvaGlnaCBjcm9zc292ZXIgZnJlcXVlbmN5LlxuXHRcdFx0ICogIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5oaWdoRnJlcXVlbmN5ID0gdGhpcy5fc3BsaXR0ZXIuaGlnaEZyZXF1ZW5jeTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgb3V0cHV0XG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGNvbXByZXNzb3IgYXBwbGllZCB0byB0aGUgbG93IGZyZXF1ZW5jaWVzLlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkNvbXByZXNzb3J9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmxvdyA9IG5ldyBUb25lLkNvbXByZXNzb3Iob3B0aW9ucy5sb3cpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBjb21wcmVzc29yIGFwcGxpZWQgdG8gdGhlIG1pZCBmcmVxdWVuY2llcy5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5Db21wcmVzc29yfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5taWQgPSBuZXcgVG9uZS5Db21wcmVzc29yKG9wdGlvbnMubWlkKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY29tcHJlc3NvciBhcHBsaWVkIHRvIHRoZSBoaWdoIGZyZXF1ZW5jaWVzLlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkNvbXByZXNzb3J9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmhpZ2ggPSBuZXcgVG9uZS5Db21wcmVzc29yKG9wdGlvbnMuaGlnaCk7XG5cdCAgICAgICAgLy9jb25uZWN0IHRoZSBjb21wcmVzc29yXG5cdCAgICAgICAgdGhpcy5fc3BsaXR0ZXIubG93LmNoYWluKHRoaXMubG93LCB0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5fc3BsaXR0ZXIubWlkLmNoYWluKHRoaXMubWlkLCB0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5fc3BsaXR0ZXIuaGlnaC5jaGFpbih0aGlzLmhpZ2gsIHRoaXMub3V0cHV0KTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdoaWdoJyxcblx0ICAgICAgICAgICAgJ21pZCcsXG5cdCAgICAgICAgICAgICdsb3cnLFxuXHQgICAgICAgICAgICAnaGlnaEZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdsb3dGcmVxdWVuY3knXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5NdWx0aWJhbmRDb21wcmVzc29yLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuTXVsdGliYW5kQ29tcHJlc3Nvci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnbG93JzogVG9uZS5Db21wcmVzc29yLmRlZmF1bHRzLFxuXHQgICAgICAgICdtaWQnOiBUb25lLkNvbXByZXNzb3IuZGVmYXVsdHMsXG5cdCAgICAgICAgJ2hpZ2gnOiBUb25lLkNvbXByZXNzb3IuZGVmYXVsdHMsXG5cdCAgICAgICAgJ2xvd0ZyZXF1ZW5jeSc6IDI1MCxcblx0ICAgICAgICAnaGlnaEZyZXF1ZW5jeSc6IDIwMDBcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuTXVsdGliYW5kQ29tcHJlc3Nvcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NdWx0aWJhbmRDb21wcmVzc29yLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc3BsaXR0ZXIuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ2hpZ2gnLFxuXHQgICAgICAgICAgICAnbWlkJyxcblx0ICAgICAgICAgICAgJ2xvdycsXG5cdCAgICAgICAgICAgICdoaWdoRnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2xvd0ZyZXF1ZW5jeSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmxvdy5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5taWQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuaGlnaC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc3BsaXR0ZXIgPSBudWxsO1xuXHQgICAgICAgIHRoaXMubG93ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm1pZCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5oaWdoID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmxvd0ZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5oaWdoRnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5NdWx0aWJhbmRDb21wcmVzc29yO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBpZiAoVG9uZS5zdXBwb3J0ZWQgJiYgIXdpbmRvdy5TdGVyZW9QYW5uZXJOb2RlKSB7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBAY2xhc3MgU2hpbW1lZCBTdGVyZW9QYW5uZXJOb2RlXG5cdFx0XHQgKiBAcGFyYW0gIHtBdWRpb0NvbnRleHR9IGNvbnRleHRcblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB2YXIgU3RlcmVvUGFubmVyTm9kZSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiBUaGUgYXVkaW8gY29udGV4dFxuXHRcdFx0XHQgKiBAdHlwZSB7QXVkaW9Db250ZXh0fVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcblx0ICAgICAgICAgICAgLyoqXG5cdFx0XHRcdCAqIFRoZSBsZWZ0L3JpZ2h0IHBhbm5pbmcuIFstMSwgMV1cblx0XHRcdFx0ICogQHR5cGUge0F1ZGlvUmFuZ2V9XG5cdFx0XHRcdCAqIEBzaWduYWxcblx0XHRcdFx0ICovXG5cdCAgICAgICAgICAgIHRoaXMucGFuID0gbmV3IFRvbmUuU2lnbmFsKDAsIFRvbmUuVHlwZS5BdWRpb1JhbmdlKTtcblx0ICAgICAgICAgICAgLyoqXG5cdFx0XHRcdCAqIEVxdWFsIHBvd2VyIHNjYWxpbmcgb2YgdGhlIHJpZ2h0IGdhaW5cblx0XHRcdFx0ICogQHR5cGUge1RvbmUuV2F2ZVNoYXBlcn1cblx0XHRcdFx0ICovXG5cdCAgICAgICAgICAgIHZhciByaWdodFdhdmVTaGFwZXIgPSBuZXcgVG9uZS5XYXZlU2hhcGVyKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBUb25lLmVxdWFsUG93ZXJTY2FsZSgodmFsICsgMSkgLyAyKTtcblx0ICAgICAgICAgICAgfSwgNDA5Nik7XG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiBFcXVhbCBwb3dlciBzY2FsaW5nIG9mIHRoZSBsZWZ0IGdhaW5cblx0XHRcdFx0ICogQHR5cGUge1RvbmUuV2F2ZVNoYXBlcn1cblx0XHRcdFx0ICogQHByaXZhdGVcblx0XHRcdFx0ICovXG5cdCAgICAgICAgICAgIHZhciBsZWZ0V2F2ZVNoYXBlciA9IG5ldyBUb25lLldhdmVTaGFwZXIoZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFRvbmUuZXF1YWxQb3dlclNjYWxlKDEgLSAodmFsICsgMSkgLyAyKTtcblx0ICAgICAgICAgICAgfSwgNDA5Nik7XG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiBUaGUgbGVmdCBnYWluIHZhbHVlXG5cdFx0XHRcdCAqIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB2YXIgbGVmdEdhaW4gPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgICAgIC8qKlxuXHRcdFx0XHQgKiBUaGUgcmlnaHQgZ2FpbiB2YWx1ZVxuXHRcdFx0XHQgKiBAdHlwZSB7VG9uZS5HYWlufVxuXHRcdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0XHQgKi9cblx0ICAgICAgICAgICAgdmFyIHJpZ2h0R2FpbiA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAgICAgLyoqXG5cdFx0XHRcdCAqIFNwbGl0IHRoZSBpbmNvbWluZyBzaWduYWxcblx0XHRcdFx0ICogQHR5cGUge1RvbmUuU3BsaXR9XG5cdFx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB2YXIgc3BsaXQgPSB0aGlzLmlucHV0ID0gbmV3IFRvbmUuU3BsaXQoKTtcblx0ICAgICAgICAgICAgLyoqXG5cdFx0XHRcdCAqIEtlZXBzIHRoZSB3YXZlc2hhcGVycyBmcm9tIG9wdGltaXppbmcgMHNcblx0XHRcdFx0ICogQHR5cGUge1RvbmUuWmVyb31cblx0XHRcdFx0ICogQHByaXZhdGVcblx0XHRcdFx0ICovXG5cdCAgICAgICAgICAgIHZhciB6ZXJvID0gbmV3IFRvbmUuWmVybygpO1xuXHQgICAgICAgICAgICB6ZXJvLmZhbihyaWdodFdhdmVTaGFwZXIsIGxlZnRXYXZlU2hhcGVyKTtcblx0ICAgICAgICAgICAgLyoqXG5cdFx0XHRcdCAqIE1lcmdlIHRoZSBvdXRnb2luZyBzaWduYWxcblx0XHRcdFx0ICogQHR5cGUge1RvbmUuTWVyZ2V9XG5cdFx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHRcdCAqL1xuXHQgICAgICAgICAgICB2YXIgbWVyZ2UgPSB0aGlzLm91dHB1dCA9IG5ldyBUb25lLk1lcmdlKCk7XG5cdCAgICAgICAgICAgIC8vY29ubmVjdGlvbnNcblx0ICAgICAgICAgICAgc3BsaXQubGVmdC5jaGFpbihsZWZ0R2FpbiwgbWVyZ2UubGVmdCk7XG5cdCAgICAgICAgICAgIHNwbGl0LnJpZ2h0LmNoYWluKHJpZ2h0R2FpbiwgbWVyZ2UucmlnaHQpO1xuXHQgICAgICAgICAgICB0aGlzLnBhbi5jaGFpbihsZWZ0V2F2ZVNoYXBlciwgbGVmdEdhaW4uZ2Fpbik7XG5cdCAgICAgICAgICAgIHRoaXMucGFuLmNoYWluKHJpZ2h0V2F2ZVNoYXBlciwgcmlnaHRHYWluLmdhaW4pO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgU3RlcmVvUGFubmVyTm9kZS5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGhpcy5vdXRwdXQuZGlzY29ubmVjdC5hcHBseSh0aGlzLm91dHB1dCwgYXJndW1lbnRzKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIFN0ZXJlb1Bhbm5lck5vZGUucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHRoaXMub3V0cHV0LmNvbm5lY3QuYXBwbHkodGhpcy5vdXRwdXQsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICAvL2FkZCBpdCB0byB0aGUgQXVkaW9Db250ZXh0XG5cdCAgICAgICAgQXVkaW9Db250ZXh0LnByb3RvdHlwZS5jcmVhdGVTdGVyZW9QYW5uZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuZXcgU3RlcmVvUGFubmVyTm9kZSh0aGlzKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIFRvbmUuQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlU3RlcmVvUGFubmVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gbmV3IFN0ZXJlb1Bhbm5lck5vZGUodGhpcyk7XG5cdCAgICAgICAgfTtcblx0ICAgIH1cblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLlBhbm5lciBpcyBhbiBlcXVhbCBwb3dlciBMZWZ0L1JpZ2h0IFBhbm5lciBhbmQgZG9lcyBub3Rcblx0XHQgKiAgICAgICAgICBzdXBwb3J0IDNELiBQYW5uZXIgdXNlcyB0aGUgU3RlcmVvUGFubmVyTm9kZSB3aGVuIGF2YWlsYWJsZS5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfSBbaW5pdGlhbFBhbj0wXSBUaGUgaW5pdGFpbCBwYW5uZXIgdmFsdWUgKGNlbnRlcikuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogIC8vcGFuIHRoZSBpbnB1dCBzaWduYWwgaGFyZCByaWdodC5cblx0XHQgKiAgdmFyIHBhbm5lciA9IG5ldyBUb25lLlBhbm5lcigxKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFubmVyID0gZnVuY3Rpb24gKGluaXRpYWxQYW4pIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0KiAgdGhlIHBhbm5lciBub2RlXG5cdFx0XHQqICBAdHlwZSB7U3RlcmVvUGFubmVyTm9kZX1cblx0XHRcdCogIEBwcml2YXRlXG5cdFx0XHQqL1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lciA9IHRoaXMuaW5wdXQgPSB0aGlzLm91dHB1dCA9IHRoaXMuY29udGV4dC5jcmVhdGVTdGVyZW9QYW5uZXIoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCogIFRoZSBwYW4gY29udHJvbC4gLTEgPSBoYXJkIGxlZnQsIDEgPSBoYXJkIHJpZ2h0LlxuXHRcdFx0KiAgQHR5cGUge0F1ZGlvUmFuZ2V9XG5cdFx0XHQqICBAc2lnbmFsXG5cdFx0XHQqL1xuXHQgICAgICAgIHRoaXMucGFuID0gdGhpcy5fcGFubmVyLnBhbjtcblx0ICAgICAgICAvL2luaXRpYWwgdmFsdWVcblx0ICAgICAgICB0aGlzLnBhbi52YWx1ZSA9IFRvbmUuZGVmYXVsdEFyZyhpbml0aWFsUGFuLCAwKTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seSgncGFuJyk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5QYW5uZXIsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGFubmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhbm5lci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCdwYW4nKTtcblx0ICAgICAgICB0aGlzLl9wYW5uZXIuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5wYW4gPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlBhbm5lcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBBIHNwYXRpYWxpemVkIHBhbm5lciBub2RlIHdoaWNoIHN1cHBvcnRzIGVxdWFscG93ZXIgb3IgSFJURiBwYW5uaW5nLlxuXHRcdCAqICAgICAgICAgIFRyaWVzIHRvIG5vcm1hbGl6ZSB0aGUgQVBJIGFjcm9zcyB2YXJpb3VzIGJyb3dzZXJzLiBTZWUgVG9uZS5MaXN0ZW5lclxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvblggVGhlIGluaXRpYWwgeCBwb3NpdGlvbi5cblx0XHQgKiAgQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uWSBUaGUgaW5pdGlhbCB5IHBvc2l0aW9uLlxuXHRcdCAqICBAcGFyYW0ge051bWJlcn0gcG9zaXRpb25aIFRoZSBpbml0aWFsIHogcG9zaXRpb24uXG5cdFx0ICovXG5cdCAgICBUb25lLlBhbm5lcjNEID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ3Bvc2l0aW9uWCcsXG5cdCAgICAgICAgICAgICdwb3NpdGlvblknLFxuXHQgICAgICAgICAgICAncG9zaXRpb25aJ1xuXHQgICAgICAgIF0sIFRvbmUuUGFubmVyM0QpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHBhbm5lciBub2RlXG5cdFx0XHQgKiAgQHR5cGUge1Bhbm5lck5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lciA9IHRoaXMuaW5wdXQgPSB0aGlzLm91dHB1dCA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTtcblx0ICAgICAgICAvL3NldCBzb21lIHZhbHVlc1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lci5wYW5uaW5nTW9kZWwgPSBvcHRpb25zLnBhbm5pbmdNb2RlbDtcblx0ICAgICAgICB0aGlzLl9wYW5uZXIubWF4RGlzdGFuY2UgPSBvcHRpb25zLm1heERpc3RhbmNlO1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lci5kaXN0YW5jZU1vZGVsID0gb3B0aW9ucy5kaXN0YW5jZU1vZGVsO1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lci5jb25lT3V0ZXJHYWluID0gb3B0aW9ucy5jb25lT3V0ZXJHYWluO1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lci5jb25lT3V0ZXJBbmdsZSA9IG9wdGlvbnMuY29uZU91dGVyQW5nbGU7XG5cdCAgICAgICAgdGhpcy5fcGFubmVyLmNvbmVJbm5lckFuZ2xlID0gb3B0aW9ucy5jb25lSW5uZXJBbmdsZTtcblx0ICAgICAgICB0aGlzLl9wYW5uZXIucmVmRGlzdGFuY2UgPSBvcHRpb25zLnJlZkRpc3RhbmNlO1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lci5yb2xsb2ZmRmFjdG9yID0gb3B0aW9ucy5yb2xsb2ZmRmFjdG9yO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEhvbGRzIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uXG5cdFx0XHQgKiAgQHR5cGUgIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBbXG5cdCAgICAgICAgICAgIG9wdGlvbnMub3JpZW50YXRpb25YLFxuXHQgICAgICAgICAgICBvcHRpb25zLm9yaWVudGF0aW9uWSxcblx0ICAgICAgICAgICAgb3B0aW9ucy5vcmllbnRhdGlvblpcblx0ICAgICAgICBdO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEhvbGRzIHRoZSBjdXJyZW50IHBvc2l0aW9uXG5cdFx0XHQgKiAgQHR5cGUgIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBbXG5cdCAgICAgICAgICAgIG9wdGlvbnMucG9zaXRpb25YLFxuXHQgICAgICAgICAgICBvcHRpb25zLnBvc2l0aW9uWSxcblx0ICAgICAgICAgICAgb3B0aW9ucy5wb3NpdGlvblpcblx0ICAgICAgICBdO1xuXHQgICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCBwb3NpdGlvbi9vcmllbnRhdGlvblxuXHQgICAgICAgIHRoaXMub3JpZW50YXRpb25YID0gb3B0aW9ucy5vcmllbnRhdGlvblg7XG5cdCAgICAgICAgdGhpcy5vcmllbnRhdGlvblkgPSBvcHRpb25zLm9yaWVudGF0aW9uWTtcblx0ICAgICAgICB0aGlzLm9yaWVudGF0aW9uWiA9IG9wdGlvbnMub3JpZW50YXRpb25aO1xuXHQgICAgICAgIHRoaXMucG9zaXRpb25YID0gb3B0aW9ucy5wb3NpdGlvblg7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvblkgPSBvcHRpb25zLnBvc2l0aW9uWTtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uWiA9IG9wdGlvbnMucG9zaXRpb25aO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuUGFubmVyM0QsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBEZWZhdWx0cyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb25cblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuUGFubmVyM0QuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3Bvc2l0aW9uWCc6IDAsXG5cdCAgICAgICAgJ3Bvc2l0aW9uWSc6IDAsXG5cdCAgICAgICAgJ3Bvc2l0aW9uWic6IDAsXG5cdCAgICAgICAgJ29yaWVudGF0aW9uWCc6IDAsXG5cdCAgICAgICAgJ29yaWVudGF0aW9uWSc6IDAsXG5cdCAgICAgICAgJ29yaWVudGF0aW9uWic6IDAsXG5cdCAgICAgICAgJ3Bhbm5pbmdNb2RlbCc6ICdlcXVhbHBvd2VyJyxcblx0ICAgICAgICAnbWF4RGlzdGFuY2UnOiAxMDAwMCxcblx0ICAgICAgICAnZGlzdGFuY2VNb2RlbCc6ICdpbnZlcnNlJyxcblx0ICAgICAgICAnY29uZU91dGVyR2Fpbic6IDAsXG5cdCAgICAgICAgJ2NvbmVPdXRlckFuZ2xlJzogMzYwLFxuXHQgICAgICAgICdjb25lSW5uZXJBbmdsZSc6IDM2MCxcblx0ICAgICAgICAncmVmRGlzdGFuY2UnOiAxLFxuXHQgICAgICAgICdyb2xsb2ZmRmFjdG9yJzogMVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSByYW1wIHRpbWUgd2hpY2ggaXMgYXBwbGllZCB0byB0aGUgc2V0VGFyZ2V0QXRUaW1lXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYW5uZXIzRC5wcm90b3R5cGUuX3JhbXBUaW1lQ29uc3RhbnQgPSAwLjAxO1xuXHQgICAgLyoqXG5cdFx0ICogIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzb3VyY2UgaW4gM2Qgc3BhY2UuXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHhcblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgeVxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB6XG5cdFx0ICogIEByZXR1cm4ge1RvbmUuUGFubmVyM0R9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFubmVyM0QucHJvdG90eXBlLnNldFBvc2l0aW9uID0gZnVuY3Rpb24gKHgsIHksIHopIHtcblx0ICAgICAgICBpZiAodGhpcy5fcGFubmVyLnBvc2l0aW9uWCkge1xuXHQgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5ub3coKTtcblx0ICAgICAgICAgICAgdGhpcy5fcGFubmVyLnBvc2l0aW9uWC5zZXRUYXJnZXRBdFRpbWUoeCwgbm93LCB0aGlzLl9yYW1wVGltZUNvbnN0YW50KTtcblx0ICAgICAgICAgICAgdGhpcy5fcGFubmVyLnBvc2l0aW9uWS5zZXRUYXJnZXRBdFRpbWUoeSwgbm93LCB0aGlzLl9yYW1wVGltZUNvbnN0YW50KTtcblx0ICAgICAgICAgICAgdGhpcy5fcGFubmVyLnBvc2l0aW9uWi5zZXRUYXJnZXRBdFRpbWUoeiwgbm93LCB0aGlzLl9yYW1wVGltZUNvbnN0YW50KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLl9wYW5uZXIuc2V0UG9zaXRpb24oeCwgeSwgeik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2V0cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHNvdXJjZSBpbiAzZCBzcGFjZS5cblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgeFxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB5XG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHpcblx0XHQgKiAgQHJldHVybiB7VG9uZS5QYW5uZXIzRH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QYW5uZXIzRC5wcm90b3R5cGUuc2V0T3JpZW50YXRpb24gPSBmdW5jdGlvbiAoeCwgeSwgeikge1xuXHQgICAgICAgIGlmICh0aGlzLl9wYW5uZXIub3JpZW50YXRpb25YKSB7XG5cdCAgICAgICAgICAgIHZhciBub3cgPSB0aGlzLm5vdygpO1xuXHQgICAgICAgICAgICB0aGlzLl9wYW5uZXIub3JpZW50YXRpb25YLnNldFRhcmdldEF0VGltZSh4LCBub3csIHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpO1xuXHQgICAgICAgICAgICB0aGlzLl9wYW5uZXIub3JpZW50YXRpb25ZLnNldFRhcmdldEF0VGltZSh5LCBub3csIHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpO1xuXHQgICAgICAgICAgICB0aGlzLl9wYW5uZXIub3JpZW50YXRpb25aLnNldFRhcmdldEF0VGltZSh6LCBub3csIHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Bhbm5lci5zZXRPcmllbnRhdGlvbih4LCB5LCB6KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgeCBwb3NpdGlvbiBvZiB0aGUgcGFubmVyIG9iamVjdC5cblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGFubmVyM0QjXG5cdFx0ICogIEBuYW1lIHBvc2l0aW9uWFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGFubmVyM0QucHJvdG90eXBlLCAncG9zaXRpb25YJywge1xuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBvcykge1xuXHQgICAgICAgICAgICB0aGlzLl9wb3NpdGlvblswXSA9IHBvcztcblx0ICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbi5hcHBseSh0aGlzLCB0aGlzLl9wb3NpdGlvbik7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uWzBdO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSB5IHBvc2l0aW9uIG9mIHRoZSBwYW5uZXIgb2JqZWN0LlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYW5uZXIzRCNcblx0XHQgKiAgQG5hbWUgcG9zaXRpb25ZXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYW5uZXIzRC5wcm90b3R5cGUsICdwb3NpdGlvblknLCB7XG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocG9zKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uWzFdID0gcG9zO1xuXHQgICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uLmFwcGx5KHRoaXMsIHRoaXMuX3Bvc2l0aW9uKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9zaXRpb25bMV07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHogcG9zaXRpb24gb2YgdGhlIHBhbm5lciBvYmplY3QuXG5cdFx0ICogIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlBhbm5lcjNEI1xuXHRcdCAqICBAbmFtZSBwb3NpdGlvblpcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBhbm5lcjNELnByb3RvdHlwZSwgJ3Bvc2l0aW9uWicsIHtcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwb3MpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25bMl0gPSBwb3M7XG5cdCAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24uYXBwbHkodGhpcywgdGhpcy5fcG9zaXRpb24pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvblsyXTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgeCBvcmllbnRhdGlvbiBvZiB0aGUgcGFubmVyIG9iamVjdC5cblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGFubmVyM0QjXG5cdFx0ICogIEBuYW1lIG9yaWVudGF0aW9uWFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGFubmVyM0QucHJvdG90eXBlLCAnb3JpZW50YXRpb25YJywge1xuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBvcykge1xuXHQgICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvblswXSA9IHBvcztcblx0ICAgICAgICAgICAgdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLCB0aGlzLl9vcmllbnRhdGlvbik7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzBdO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSB5IG9yaWVudGF0aW9uIG9mIHRoZSBwYW5uZXIgb2JqZWN0LlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYW5uZXIzRCNcblx0XHQgKiAgQG5hbWUgb3JpZW50YXRpb25ZXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYW5uZXIzRC5wcm90b3R5cGUsICdvcmllbnRhdGlvblknLCB7XG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocG9zKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX29yaWVudGF0aW9uWzFdID0gcG9zO1xuXHQgICAgICAgICAgICB0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsIHRoaXMuX29yaWVudGF0aW9uKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bMV07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHogb3JpZW50YXRpb24gb2YgdGhlIHBhbm5lciBvYmplY3QuXG5cdFx0ICogIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlBhbm5lcjNEI1xuXHRcdCAqICBAbmFtZSBvcmllbnRhdGlvblpcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBhbm5lcjNELnByb3RvdHlwZSwgJ29yaWVudGF0aW9uWicsIHtcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwb3MpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb25bMl0gPSBwb3M7XG5cdCAgICAgICAgICAgIHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcywgdGhpcy5fb3JpZW50YXRpb24pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvblsyXTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBQcm94eSBhIHByb3BlcnR5IG9uIHRoZSBwYW5uZXIgdG8gYW4gZXhwb3NlZCBwdWJsaWMgcHJvcGVyeVxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmd9ICBwcm9wXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5ID0gZnVuY3Rpb24gKHByb3ApIHtcblx0ICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYW5uZXIzRC5wcm90b3R5cGUsIHByb3AsIHtcblx0ICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9wYW5uZXJbcHJvcF0gPSB2YWw7XG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bhbm5lcltwcm9wXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgcGFubmluZyBtb2RlbC4gRWl0aGVyIFwiZXF1YWxwb3dlclwiIG9yIFwiSFJURlwiLlxuXHRcdCAqICBAdHlwZSB7U3RyaW5nfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYW5uZXIzRCNcblx0XHQgKiAgQG5hbWUgcGFubmluZ01vZGVsXG5cdFx0ICovXG5cdCAgICBUb25lLlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KCdwYW5uaW5nTW9kZWwnKTtcblx0ICAgIC8qKlxuXHRcdCAqICBBIHJlZmVyZW5jZSBkaXN0YW5jZSBmb3IgcmVkdWNpbmcgdm9sdW1lIGFzIHNvdXJjZSBtb3ZlIGZ1cnRoZXIgZnJvbSB0aGUgbGlzdGVuZXJcblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGFubmVyM0QjXG5cdFx0ICogIEBuYW1lIHJlZkRpc3RhbmNlXG5cdFx0ICovXG5cdCAgICBUb25lLlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KCdyZWZEaXN0YW5jZScpO1xuXHQgICAgLyoqXG5cdFx0ICogIERlc2NyaWJlcyBob3cgcXVpY2tseSB0aGUgdm9sdW1lIGlzIHJlZHVjZWQgYXMgc291cmNlIG1vdmVzIGF3YXkgZnJvbSBsaXN0ZW5lci5cblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGFubmVyM0QjXG5cdFx0ICogIEBuYW1lIHJvbGxvZmZGYWN0b3Jcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFubmVyM0QuX2FsaWFzUHJvcGVydHkoJ3JvbGxvZmZGYWN0b3InKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGlzdGFuY2UgbW9kZWwgdXNlZCBieSwgIFwibGluZWFyXCIsIFwiaW52ZXJzZVwiLCBvciBcImV4cG9uZW50aWFsXCIuXG5cdFx0ICogIEB0eXBlIHtTdHJpbmd9XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlBhbm5lcjNEI1xuXHRcdCAqICBAbmFtZSBkaXN0YW5jZU1vZGVsXG5cdFx0ICovXG5cdCAgICBUb25lLlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KCdkaXN0YW5jZU1vZGVsJyk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGFuZ2xlLCBpbiBkZWdyZWVzLCBpbnNpZGUgb2Ygd2hpY2ggdGhlcmUgd2lsbCBiZSBubyB2b2x1bWUgcmVkdWN0aW9uXG5cdFx0ICogIEB0eXBlIHtEZWdyZWVzfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYW5uZXIzRCNcblx0XHQgKiAgQG5hbWUgY29uZUlubmVyQW5nbGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFubmVyM0QuX2FsaWFzUHJvcGVydHkoJ2NvbmVJbm5lckFuZ2xlJyk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGFuZ2xlLCBpbiBkZWdyZWVzLCBvdXRzaWRlIG9mIHdoaWNoIHRoZSB2b2x1bWUgd2lsbCBiZSByZWR1Y2VkXG5cdFx0ICogIHRvIGEgY29uc3RhbnQgdmFsdWUgb2YgY29uZU91dGVyR2FpblxuXHRcdCAqICBAdHlwZSB7RGVncmVlc31cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGFubmVyM0QjXG5cdFx0ICogIEBuYW1lIGNvbmVPdXRlckFuZ2xlXG5cdFx0ICovXG5cdCAgICBUb25lLlBhbm5lcjNELl9hbGlhc1Byb3BlcnR5KCdjb25lT3V0ZXJBbmdsZScpO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBnYWluIG91dHNpZGUgb2YgdGhlIGNvbmVPdXRlckFuZ2xlXG5cdFx0ICogIEB0eXBlIHtHYWlufVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYW5uZXIzRCNcblx0XHQgKiAgQG5hbWUgY29uZU91dGVyR2FpblxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eSgnY29uZU91dGVyR2FpbicpO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4gc291cmNlIGFuZCBsaXN0ZW5lcixcblx0XHQgKiAgYWZ0ZXIgd2hpY2ggdGhlIHZvbHVtZSB3aWxsIG5vdCBiZSByZWR1Y2VkIGFueSBmdXJ0aGVyLlxuXHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlBhbm5lcjNEI1xuXHRcdCAqICBAbmFtZSBtYXhEaXN0YW5jZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYW5uZXIzRC5fYWxpYXNQcm9wZXJ0eSgnbWF4RGlzdGFuY2UnKTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGFubmVyM0R9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFubmVyM0QucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9wYW5uZXIuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5QYW5uZXIzRDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuUGFuVm9sIGlzIGEgVG9uZS5QYW5uZXIgYW5kIFRvbmUuVm9sdW1lIGluIG9uZS5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge0F1ZGlvUmFuZ2V9IHBhbiB0aGUgaW5pdGlhbCBwYW5cblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IHZvbHVtZSBUaGUgb3V0cHV0IHZvbHVtZS5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL3BhbiB0aGUgaW5jb21pbmcgc2lnbmFsIGxlZnQgYW5kIGRyb3AgdGhlIHZvbHVtZVxuXHRcdCAqIHZhciBwYW5Wb2wgPSBuZXcgVG9uZS5QYW5Wb2woLTAuMjUsIC0xMik7XG5cdFx0ICovXG5cdCAgICBUb25lLlBhblZvbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdwYW4nLFxuXHQgICAgICAgICAgICAndm9sdW1lJ1xuXHQgICAgICAgIF0sIFRvbmUuUGFuVm9sKTtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBwYW5uaW5nIG5vZGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5QYW5uZXJ9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lciA9IHRoaXMuaW5wdXQgPSBuZXcgVG9uZS5QYW5uZXIob3B0aW9ucy5wYW4pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBML1IgcGFubmluZyBjb250cm9sLlxuXHRcdFx0ICogIEB0eXBlIHtBdWRpb1JhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucGFuID0gdGhpcy5fcGFubmVyLnBhbjtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdm9sdW1lIG5vZGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5Wb2x1bWV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZSA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuVm9sdW1lKG9wdGlvbnMudm9sdW1lKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdm9sdW1lIGNvbnRyb2wgaW4gZGVjaWJlbHMuXG5cdFx0XHQgKiAgQHR5cGUge0RlY2liZWxzfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMudm9sdW1lID0gdGhpcy5fdm9sdW1lLnZvbHVtZTtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5fcGFubmVyLmNvbm5lY3QodGhpcy5fdm9sdW1lKTtcblx0ICAgICAgICB0aGlzLm11dGUgPSBvcHRpb25zLm11dGU7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAncGFuJyxcblx0ICAgICAgICAgICAgJ3ZvbHVtZSdcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlBhblZvbCwgVG9uZS5BdWRpb05vZGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBkZWZhdWx0c1xuXHRcdCAqICBAdHlwZSAge09iamVjdH1cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFuVm9sLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdwYW4nOiAwLFxuXHQgICAgICAgICd2b2x1bWUnOiAwLFxuXHQgICAgICAgICdtdXRlJzogZmFsc2Vcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBNdXRlL3VubXV0ZSB0aGUgdm9sdW1lXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuUGFuVm9sI1xuXHRcdCAqIEBuYW1lIG11dGVcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBhblZvbC5wcm90b3R5cGUsICdtdXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fdm9sdW1lLm11dGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtdXRlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3ZvbHVtZS5tdXRlID0gbXV0ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QYW5Wb2x9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFuVm9sLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAncGFuJyxcblx0ICAgICAgICAgICAgJ3ZvbHVtZSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLl9wYW5uZXIuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3Bhbm5lciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5wYW4gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fdm9sdW1lID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnZvbHVtZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuUGFuVm9sO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuU29sbyBsZXRzIHlvdSBpc29sYXRlIGEgc3BlY2lmaWMgYXVkaW8gc3RyZWFtLiBXaGVuXG5cdFx0ICogICAgICAgICBhbiBpbnN0YW5jZSBpcyBzZXQgdG8gYHNvbG89dHJ1ZWAsIGl0IHdpbGwgbXV0ZSBhbGwgb3RoZXIgaW5zdGFuY2VzLlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIHNvbG9BID0gbmV3IFRvbmUuU29sbygpXG5cdFx0ICogdmFyIHNvbG9CID0gbmV3IFRvbmUuU29sbygpXG5cdFx0ICogc29sb0Euc29sbyA9IHRydWVcblx0XHQgKiAvL25vIGF1ZGlvIHdpbGwgcGFzcyB0aHJvdWdoIHNvbG9CXG5cdFx0ICovXG5cdCAgICBUb25lLlNvbG8gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydzb2xvJ10sIFRvbmUuU29sbyk7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgaW5wdXQgYW5kIG91dHB1dCBub2RlXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLkdhaW59XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQSBib3VuZCBfc29sb2VkIG1ldGhvZFxuXHRcdFx0ICogIEB0eXBlICB7RnVuY3Rpb259XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NvbG9CaW5kID0gdGhpcy5fc29sb2VkLmJpbmQodGhpcyk7XG5cdCAgICAgICAgLy9saXN0ZW4gZm9yIHNvbG8gZXZlbnRzIGNsYXNzLXdpZGUuXG5cdCAgICAgICAgdGhpcy5jb250ZXh0Lm9uKCdzb2xvJywgdGhpcy5fc29sb0JpbmQpO1xuXHQgICAgICAgIC8vc2V0IGluaXRpYWxseVxuXHQgICAgICAgIHRoaXMuc29sbyA9IG9wdGlvbnMuc29sbztcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlNvbG8sIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKi9cblx0ICAgIFRvbmUuU29sby5kZWZhdWx0cyA9IHsgc29sbzogZmFsc2UgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJc29sYXRlcyB0aGlzIGluc3RhbmNlIGFuZCBtdXRlcyBhbGwgb3RoZXIgaW5zdGFuY2VzIG9mIFRvbmUuU29sby5cblx0XHQgKiAgT25seSBvbmUgaW5zdGFuY2UgY2FuIGJlIHNvbG9lZCBhdCBhIHRpbWUuIEEgc29sb2VkXG5cdFx0ICogIGluc3RhbmNlIHdpbGwgcmVwb3J0IGBzb2xvPWZhbHNlYCB3aGVuIGFub3RoZXIgaW5zdGFuY2UgaXMgc29sb2VkLlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5Tb2xvI1xuXHRcdCAqICBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKiAgQG5hbWUgc29sb1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuU29sby5wcm90b3R5cGUsICdzb2xvJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faXNTb2xvZWQoKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHNvbG8pIHtcblx0ICAgICAgICAgICAgaWYgKHNvbG8pIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2FkZFNvbG8oKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVNvbG8oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuZW1pdCgnc29sbycsIHRoaXMpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIElmIHRoZSBjdXJyZW50IGluc3RhbmNlIGlzIG11dGVkLCBpLmUuIGFub3RoZXIgaW5zdGFuY2UgaXMgc29sb2VkXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlNvbG8jXG5cdFx0ICogIEB0eXBlIHtCb29sZWFufVxuXHRcdCAqICBAbmFtZSBtdXRlZFxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlNvbG8ucHJvdG90eXBlLCAnbXV0ZWQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0LmdhaW4udmFsdWUgPT09IDA7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBBZGQgdGhpcyB0byB0aGUgc29sb2VkIGFycmF5XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuU29sby5wcm90b3R5cGUuX2FkZFNvbG8gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKCFUb25lLmlzQXJyYXkodGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbykpIHtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbyA9IFtdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRoaXMuX2lzU29sb2VkKCkpIHtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0Ll9jdXJyZW50U29sby5wdXNoKHRoaXMpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBSZW1vdmUgdGhpcyBmcm9tIHRoZSBzb2xvZWQgYXJyYXlcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Tb2xvLnByb3RvdHlwZS5fcmVtb3ZlU29sbyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5faXNTb2xvZWQoKSkge1xuXHQgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmNvbnRleHQuX2N1cnJlbnRTb2xvLmluZGV4T2YodGhpcyk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5fY3VycmVudFNvbG8uc3BsaWNlKGluZGV4LCAxKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn0gSXMgdGhpcyBvbiB0aGUgc29sb2VkIGFycmF5XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuU29sby5wcm90b3R5cGUuX2lzU29sb2VkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmIChUb25lLmlzQXJyYXkodGhpcy5jb250ZXh0Ll9jdXJyZW50U29sbykpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5fY3VycmVudFNvbG8ubGVuZ3RoICE9PSAwICYmIHRoaXMuY29udGV4dC5fY3VycmVudFNvbG8uaW5kZXhPZih0aGlzKSAhPT0gLTE7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgbm8gb25lIGlzIHNvbG9lZFxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlNvbG8ucHJvdG90eXBlLl9ub1NvbG9zID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiAhVG9uZS5pc0FycmF5KHRoaXMuY29udGV4dC5fY3VycmVudFNvbG8pIHx8IHRoaXMuY29udGV4dC5fY3VycmVudFNvbG8ubGVuZ3RoID09PSAwO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTb2xvIHRoZSBjdXJyZW50IGluc3RhbmNlIGFuZCB1bnNvbG8gYWxsIG90aGVyIGluc3RhbmNlcy5cblx0XHQgKiAgQHBhcmFtICB7VG9uZS5Tb2xvfSAgaW5zdGFuY2UgIFRoZSBpbnN0YW5jZSB3aGljaCBpcyBiZWluZyBzb2xvZWQvdW5zb2xvZWQuXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlNvbG8ucHJvdG90eXBlLl9zb2xvZWQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX2lzU29sb2VkKCkpIHtcblx0ICAgICAgICAgICAgdGhpcy5pbnB1dC5nYWluLnZhbHVlID0gMTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25vU29sb3MoKSkge1xuXHQgICAgICAgICAgICAvL25vIG9uZSBpcyBzb2xvZWRcblx0ICAgICAgICAgICAgdGhpcy5pbnB1dC5nYWluLnZhbHVlID0gMTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmlucHV0LmdhaW4udmFsdWUgPSAwO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXBcblx0XHQgKiAgQHJldHVybiAge1RvbmUuU29sb30gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuU29sby5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLmNvbnRleHQub2ZmKCdzb2xvJywgdGhpcy5fc29sb0JpbmQpO1xuXHQgICAgICAgIHRoaXMuX3JlbW92ZVNvbG8oKTtcblx0ICAgICAgICB0aGlzLl9zb2xvQmluZCA9IG51bGw7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5Tb2xvO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBHZXQgdGhlIGN1cnJlbnQgd2F2ZWZvcm0gZGF0YSBvZiB0aGUgY29ubmVjdGVkIGF1ZGlvIHNvdXJjZS5cblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQXVkaW9Ob2RlfVxuXHRcdCAqICBAcGFyYW0ge051bWJlcj19IHNpemUgVGhlIHNpemUgb2YgdGhlIEZGVC4gVmFsdWUgbXVzdCBiZSBhIHBvd2VyIG9mXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgIHR3byBpbiB0aGUgcmFuZ2UgMzIgdG8gMzI3NjguXG5cdFx0ICovXG5cdCAgICBUb25lLldhdmVmb3JtID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFsnc2l6ZSddLCBUb25lLldhdmVmb3JtKTtcblx0ICAgICAgICBvcHRpb25zLnR5cGUgPSBUb25lLkFuYWx5c2VyLlR5cGUuV2F2ZWZvcm07XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW5hbHlzZXIgbm9kZS5cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkFuYWx5c2VyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYW5hbHlzZXIgPSB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5BbmFseXNlcihvcHRpb25zKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLldhdmVmb3JtLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGRlZmF1bHQgdmFsdWVzLlxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqICBAY29uc3Rcblx0XHQgKi9cblx0ICAgIFRvbmUuV2F2ZWZvcm0uZGVmYXVsdHMgPSB7ICdzaXplJzogMTAyNCB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEdldHMgdGhlIHdhdmVmb3JtIG9mIHRoZSBhdWRpbyBzb3VyY2UuIFJldHVybnMgdGhlIHdhdmVmb3JtIGRhdGFcblx0XHQgKiAgb2YgbGVuZ3RoIFtzaXplXSgjc2l6ZSkgYXMgYSBGbG9hdDMyQXJyYXkgd2l0aCB2YWx1ZXMgYmV0d2VlbiAtMSBhbmQgMS5cblx0XHQgKiAgQHJldHVybnMge1R5cGVkQXJyYXl9XG5cdFx0ICovXG5cdCAgICBUb25lLldhdmVmb3JtLnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fYW5hbHlzZXIuZ2V0VmFsdWUoKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHNpemUgb2YgYW5hbHlzaXMuIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBpbiB0aGUgcmFuZ2UgMzIgdG8gMzI3NjguXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLldhdmVmb3JtI1xuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbmFtZSBzaXplXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5XYXZlZm9ybS5wcm90b3R5cGUsICdzaXplJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5hbHlzZXIuc2l6ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHNpemUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fYW5hbHlzZXIuc2l6ZSA9IHNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLldhdmVmb3JtfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5XYXZlZm9ybS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkF1ZGlvTm9kZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2FuYWx5c2VyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9hbmFseXNlciA9IG51bGw7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuV2F2ZWZvcm07XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLkN0cmxJbnRlcnBvbGF0ZSB3aWxsIGludGVycG9sYXRlIGJldHdlZW4gZ2l2ZW4gdmFsdWVzIGJhc2VkXG5cdFx0ICogICAgICAgICBvbiB0aGUgXCJpbmRleFwiIHByb3BlcnR5LiBQYXNzaW5nIGluIGFuIGFycmF5IG9yIG9iamVjdCBsaXRlcmFsXG5cdFx0ICogICAgICAgICB3aWxsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIHBhcmFtZXRlcnMuIE5vdGUgKGkuZS4gXCJDM1wiKVxuXHRcdCAqICAgICAgICAgYW5kIFRpbWUgKGkuZS4gXCI0biArIDJcIikgY2FuIGJlIGludGVycG9sYXRlZC4gQWxsIG90aGVyIHZhbHVlcyBhcmVcblx0XHQgKiAgICAgICAgIGFzc3VtZWQgdG8gYmUgbnVtYmVycy4gXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIGludGVycCA9IG5ldyBUb25lLkN0cmxJbnRlcnBvbGF0ZShbMCwgMiwgOSwgNF0pO1xuXHRcdCAqIGludGVycC5pbmRleCA9IDAuNzU7XG5cdFx0ICogaW50ZXJwLnZhbHVlOyAvL3JldHVybnMgMS41XG5cdFx0ICpcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgaW50ZXJwID0gbmV3IFRvbmUuQ3RybEludGVycG9sYXRlKFtcblx0XHQgKiBcdFsyLCA0LCA1XSxcblx0XHQgKiBcdFs5LCAzLCAyXSxcblx0XHQgKiBdKTtcblx0XHQgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIGFycmF5IG9mIHZhbHVlcyB0byBpbnRlcnBvbGF0ZSBvdmVyXG5cdFx0ICogQHBhcmFtIHtQb3NpdGl2ZX0gaW5kZXggVGhlIGluaXRpYWwgaW50ZXJwb2xhdGlvbiBpbmRleC5cblx0XHQgKiBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybEludGVycG9sYXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ3ZhbHVlcycsXG5cdCAgICAgICAgICAgICdpbmRleCdcblx0ICAgICAgICBdLCBUb25lLkN0cmxJbnRlcnBvbGF0ZSk7XG5cdCAgICAgICAgVG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSB2YWx1ZXMgdG8gaW50ZXJwb2xhdGUgYmV0d2VlblxuXHRcdFx0ICogIEB0eXBlICB7QXJyYXl9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnZhbHVlcyA9IG9wdGlvbnMudmFsdWVzO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBpbnRlcnBvbGF0ZWQgaW5kZXggYmV0d2VlbiB2YWx1ZXMuIEZvciBleGFtcGxlOiBhIHZhbHVlIG9mIDEuNVxuXHRcdFx0ICogIHdvdWxkIGludGVycG9sYXRlIGVxdWFsbHkgYmV0d2VlbiB0aGUgdmFsdWUgYXQgaW5kZXggMVxuXHRcdFx0ICogIGFuZCB0aGUgdmFsdWUgYXQgaW5kZXggMi4gXG5cdFx0XHQgKiAgQGV4YW1wbGVcblx0XHRcdCAqIGludGVycC5pbmRleCA9IDA7IFxuXHRcdFx0ICogaW50ZXJwLnZhbHVlOyAvL3JldHVybnMgdGhlIHZhbHVlIGF0IDBcblx0XHRcdCAqIGludGVycC5pbmRleCA9IDAuNTtcblx0XHRcdCAqIGludGVycC52YWx1ZTsgLy9yZXR1cm5zIHRoZSB2YWx1ZSBiZXR3ZWVuIGluZGljZXMgMCBhbmQgMS4gXG5cdFx0XHQgKiAgQHR5cGUgIHtQb3NpdGl2ZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQ3RybEludGVycG9sYXRlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5DdHJsSW50ZXJwb2xhdGUuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2luZGV4JzogMCxcblx0ICAgICAgICAndmFsdWVzJzogW11cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGN1cnJlbnQgaW50ZXJwb2xhdGVkIHZhbHVlIGJhc2VkIG9uIHRoZSBpbmRleFxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuQ3RybEludGVycG9sYXRlI1xuXHRcdCAqICBAdHlwZSB7Kn1cblx0XHQgKiAgQG5hbWUgdmFsdWVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkN0cmxJbnRlcnBvbGF0ZS5wcm90b3R5cGUsICd2YWx1ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleDtcblx0ICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1pbihpbmRleCwgdGhpcy52YWx1ZXMubGVuZ3RoIC0gMSk7XG5cdCAgICAgICAgICAgIHZhciBsb3dlclBvc2l0aW9uID0gTWF0aC5mbG9vcihpbmRleCk7XG5cdCAgICAgICAgICAgIHZhciBsb3dlciA9IHRoaXMudmFsdWVzW2xvd2VyUG9zaXRpb25dO1xuXHQgICAgICAgICAgICB2YXIgdXBwZXIgPSB0aGlzLnZhbHVlc1tNYXRoLmNlaWwoaW5kZXgpXTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVycG9sYXRlKGluZGV4IC0gbG93ZXJQb3NpdGlvbiwgbG93ZXIsIHVwcGVyKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBJbnRlcm5hbCBpbnRlcnBvbGF0aW9uIHJvdXRpbmVcblx0XHQgKiAgQHBhcmFtICB7Tm9ybWFsUmFuZ2V9ICBpbmRleCAgVGhlIGluZGV4IGJldHdlZW4gdGhlIGxvd2VyIGFuZCB1cHBlclxuXHRcdCAqICBAcGFyYW0gIHsqfSAgbG93ZXIgXG5cdFx0ICogIEBwYXJhbSAgeyp9ICB1cHBlciBcblx0XHQgKiAgQHJldHVybiAgeyp9ICBUaGUgaW50ZXJwb2xhdGVkIHZhbHVlXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkN0cmxJbnRlcnBvbGF0ZS5wcm90b3R5cGUuX2ludGVycG9sYXRlID0gZnVuY3Rpb24gKGluZGV4LCBsb3dlciwgdXBwZXIpIHtcblx0ICAgICAgICBpZiAoVG9uZS5pc0FycmF5KGxvd2VyKSkge1xuXHQgICAgICAgICAgICB2YXIgcmV0QXJyYXkgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb3dlci5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgcmV0QXJyYXlbaV0gPSB0aGlzLl9pbnRlcnBvbGF0ZShpbmRleCwgbG93ZXJbaV0sIHVwcGVyW2ldKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gcmV0QXJyYXk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChUb25lLmlzT2JqZWN0KGxvd2VyKSkge1xuXHQgICAgICAgICAgICB2YXIgcmV0T2JqID0ge307XG5cdCAgICAgICAgICAgIGZvciAodmFyIGF0dHIgaW4gbG93ZXIpIHtcblx0ICAgICAgICAgICAgICAgIHJldE9ialthdHRyXSA9IHRoaXMuX2ludGVycG9sYXRlKGluZGV4LCBsb3dlclthdHRyXSwgdXBwZXJbYXR0cl0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiByZXRPYmo7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgbG93ZXIgPSB0aGlzLl90b051bWJlcihsb3dlcik7XG5cdCAgICAgICAgICAgIHVwcGVyID0gdGhpcy5fdG9OdW1iZXIodXBwZXIpO1xuXHQgICAgICAgICAgICByZXR1cm4gKDEgLSBpbmRleCkgKiBsb3dlciArIGluZGV4ICogdXBwZXI7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDb252ZXJ0IGZyb20gdGhlIGdpdmVuIHR5cGUgaW50byBhIG51bWJlclxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ8U3RyaW5nfSAgdmFsdWVcblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybEludGVycG9sYXRlLnByb3RvdHlwZS5fdG9OdW1iZXIgPSBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgaWYgKFRvbmUuaXNOdW1iZXIodmFsKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdmFsO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIC8vb3RoZXJ3aXNlIGFzc3VtZSB0aGF0IGl0J3MgVGltZS4uLlxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy50b1NlY29uZHModmFsKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkN0cmxJbnRlcnBvbGF0ZX0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybEludGVycG9sYXRlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMudmFsdWVzID0gbnVsbDtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5DdHJsSW50ZXJwb2xhdGU7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLkN0cmxNYXJrb3YgcmVwcmVzZW50cyBhIE1hcmtvdiBDaGFpbiB3aGVyZSBlYWNoIGNhbGxcblx0XHQgKiAgICAgICAgIHRvIFRvbmUuQ3RybE1hcmtvdi5uZXh0IHdpbGwgbW92ZSB0byB0aGUgbmV4dCBzdGF0ZS4gSWYgdGhlIG5leHRcblx0XHQgKiAgICAgICAgIHN0YXRlIGNob2ljZSBpcyBhbiBhcnJheSwgdGhlIG5leHQgc3RhdGUgaXMgY2hvc2VuIHJhbmRvbWx5IHdpdGhcblx0XHQgKiAgICAgICAgIGV2ZW4gcHJvYmFiaWxpdHkgZm9yIGFsbCBvZiB0aGUgY2hvaWNlcy4gRm9yIGEgd2VpZ2h0ZWQgcHJvYmFiaWxpdHlcblx0XHQgKiAgICAgICAgIG9mIHRoZSBuZXh0IGNob2ljZXMsIHBhc3MgaW4gYW4gb2JqZWN0IHdpdGggXCJzdGF0ZVwiIGFuZCBcInByb2JhYmlsaXR5XCIgYXR0cmlidXRlcy4gXG5cdFx0ICogICAgICAgICBUaGUgcHJvYmFiaWxpdGllcyB3aWxsIGJlIG5vcm1hbGl6ZWQgYW5kIHRoZW4gY2hvc2VuLiBJZiBubyBuZXh0IG9wdGlvbnNcblx0XHQgKiAgICAgICAgIGFyZSBnaXZlbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUsIHRoZSBzdGF0ZSB3aWxsIHN0YXkgdGhlcmUuIFxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgY2hhaW4gPSBuZXcgVG9uZS5DdHJsTWFya292KHtcblx0XHQgKiBcdFwiYmVnaW5uaW5nXCIgOiBbXCJlbmRcIiwgXCJtaWRkbGVcIl0sXG5cdFx0ICogXHRcIm1pZGRsZVwiIDogXCJlbmRcIlxuXHRcdCAqIH0pO1xuXHRcdCAqIGNoYWluLnZhbHVlID0gXCJiZWdpbm5pbmdcIjtcblx0XHQgKiBjaGFpbi5uZXh0KCk7IC8vcmV0dXJucyBcImVuZFwiIG9yIFwibWlkZGxlXCIgd2l0aCA1MCUgcHJvYmFiaWxpdHlcblx0XHQgKlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBjaGFpbiA9IG5ldyBUb25lLkN0cmxNYXJrb3Yoe1xuXHRcdCAqIFx0XCJiZWdpbm5pbmdcIiA6IFt7XCJ2YWx1ZVwiIDogXCJlbmRcIiwgXCJwcm9iYWJpbGl0eVwiIDogMC44fSwgXG5cdFx0ICogXHRcdFx0XHRcdHtcInZhbHVlXCIgOiBcIm1pZGRsZVwiLCBcInByb2JhYmlsaXR5XCIgOiAwLjJ9XSxcblx0XHQgKiBcdFwibWlkZGxlXCIgOiBcImVuZFwiXG5cdFx0ICogfSk7XG5cdFx0ICogY2hhaW4udmFsdWUgPSBcImJlZ2lubmluZ1wiO1xuXHRcdCAqIGNoYWluLm5leHQoKTsgLy9yZXR1cm5zIFwiZW5kXCIgd2l0aCA4MCUgcHJvYmFiaWxpdHkgb3IgXCJtaWRkbGVcIiB3aXRoIDIwJS5cblx0XHQgKiAgQHBhcmFtIHtPYmplY3R9IHZhbHVlcyBBbiBvYmplY3Qgd2l0aCB0aGUgc3RhdGUgbmFtZXMgYXMgdGhlIGtleXNcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIG5leHQgc3RhdGUocykgYXMgdGhlIHZhbHVlcy4gXG5cdFx0ICovXG5cdCAgICBUb25lLkN0cmxNYXJrb3YgPSBmdW5jdGlvbiAodmFsdWVzLCBpbml0aWFsKSB7XG5cdCAgICAgICAgVG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBNYXJrb3YgdmFsdWVzIHdpdGggc3RhdGVzIGFzIHRoZSBrZXlzXG5cdFx0XHQgKiAgYW5kIG5leHQgc3RhdGUocykgYXMgdGhlIHZhbHVlcy4gXG5cdFx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMudmFsdWVzID0gVG9uZS5kZWZhdWx0QXJnKHZhbHVlcywge30pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBNYXJrb3YgdmFsdWVzLiBUaGUgbmV4dFxuXHRcdFx0ICogIHN0YXRlIHdpbGwgYmUgZXZhbHVhdGVkIGFuZCByZXR1cm5lZCB3aGVuIFRvbmUuQ3RybE1hcmtvdi5uZXh0XG5cdFx0XHQgKiAgaXMgaW52b2tlZC5cblx0XHRcdCAqICBAdHlwZSB7U3RyaW5nfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IFRvbmUuZGVmYXVsdEFyZyhpbml0aWFsLCBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcylbMF0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQ3RybE1hcmtvdik7XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgbmV4dCBzdGF0ZSBvZiB0aGUgTWFya292IHZhbHVlcy4gXG5cdFx0ICogIEByZXR1cm4gIHtTdHJpbmd9XG5cdFx0ICovXG5cdCAgICBUb25lLkN0cmxNYXJrb3YucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMudmFsdWVzLmhhc093blByb3BlcnR5KHRoaXMudmFsdWUpKSB7XG5cdCAgICAgICAgICAgIHZhciBuZXh0ID0gdGhpcy52YWx1ZXNbdGhpcy52YWx1ZV07XG5cdCAgICAgICAgICAgIGlmIChUb25lLmlzQXJyYXkobmV4dCkpIHtcblx0ICAgICAgICAgICAgICAgIHZhciBkaXN0cmlidXRpb24gPSB0aGlzLl9nZXRQcm9iRGlzdHJpYnV0aW9uKG5leHQpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHJhbmQgPSBNYXRoLnJhbmRvbSgpO1xuXHQgICAgICAgICAgICAgICAgdmFyIHRvdGFsID0gMDtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzdHJpYnV0aW9uLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3QgPSBkaXN0cmlidXRpb25baV07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmQgPiB0b3RhbCAmJiByYW5kIDwgdG90YWwgKyBkaXN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaG9zZW4gPSBuZXh0W2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVG9uZS5pc09iamVjdChjaG9zZW4pKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gY2hvc2VuLnZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNob3Nlbjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBkaXN0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5leHQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENob29zZSByYW5kb21seSBmcm9tIGFuIGFycmF5IHdlaWdodGVkIG9wdGlvbnMgaW4gdGhlIGZvcm0gXG5cdFx0ICogIHtcInN0YXRlXCIgOiBzdHJpbmcsIFwicHJvYmFiaWxpdHlcIiA6IG51bWJlcn0gb3IgYW4gYXJyYXkgb2YgdmFsdWVzXG5cdFx0ICogIEBwYXJhbSAge0FycmF5fSAgb3B0aW9ucyBcblx0XHQgKiAgQHJldHVybiAge0FycmF5fSAgVGhlIHJhbmRvbWx5IHNlbGVjdGVkIGNob2ljZVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5DdHJsTWFya292LnByb3RvdHlwZS5fZ2V0UHJvYkRpc3RyaWJ1dGlvbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgdmFyIGRpc3RyaWJ1dGlvbiA9IFtdO1xuXHQgICAgICAgIHZhciB0b3RhbCA9IDA7XG5cdCAgICAgICAgdmFyIG5lZWRzTm9ybWFsaXppbmcgPSBmYWxzZTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNbaV07XG5cdCAgICAgICAgICAgIGlmIChUb25lLmlzT2JqZWN0KG9wdGlvbikpIHtcblx0ICAgICAgICAgICAgICAgIG5lZWRzTm9ybWFsaXppbmcgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uW2ldID0gb3B0aW9uLnByb2JhYmlsaXR5O1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uW2ldID0gMSAvIG9wdGlvbnMubGVuZ3RoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRvdGFsICs9IGRpc3RyaWJ1dGlvbltpXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG5lZWRzTm9ybWFsaXppbmcpIHtcblx0ICAgICAgICAgICAgLy9ub3JtYWxpemUgdGhlIHZhbHVlc1xuXHQgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRpc3RyaWJ1dGlvbi5sZW5ndGg7IGorKykge1xuXHQgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uW2pdID0gZGlzdHJpYnV0aW9uW2pdIC8gdG90YWw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIGRpc3RyaWJ1dGlvbjtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXBcblx0XHQgKiAgQHJldHVybiAge1RvbmUuQ3RybE1hcmtvdn0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybE1hcmtvdi5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLnZhbHVlcyA9IG51bGw7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQ3RybE1hcmtvdjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIEdlbmVyYXRlIHBhdHRlcm5zIGZyb20gYW4gYXJyYXkgb2YgdmFsdWVzLlxuXHRcdCAqICAgICAgICAgSGFzIGEgbnVtYmVyIG9mIGFycGVnZ2lhdGlvbiBhbmQgcmFuZG9taXplZFxuXHRcdCAqICAgICAgICAgc2VsZWN0aW9uIHBhdHRlcm5zLiBcblx0XHQgKiAgICAgICAgICAgPHVsPlxuXHRcdCAqICBcdCAgICAgICAgPGxpPlwidXBcIiAtIGN5Y2xlcyB1cHdhcmQ8L2xpPlxuXHRcdCAqICBcdFx0XHQ8bGk+XCJkb3duXCIgLSBjeWNsZXMgZG93bndhcmQ8L2xpPlxuXHRcdCAqICBcdFx0XHQ8bGk+XCJ1cERvd25cIiAtIHVwIHRoZW4gYW5kIGRvd248L2xpPlxuXHRcdCAqICBcdFx0XHQ8bGk+XCJkb3duVXBcIiAtIGN5Y2xlcyBkb3duIHRoZW4gYW5kIHVwPC9saT5cblx0XHQgKiAgXHRcdFx0PGxpPlwiYWx0ZXJuYXRlVXBcIiAtIGp1bXAgdXAgdHdvIGFuZCBkb3duIG9uZTwvbGk+XG5cdFx0ICogIFx0XHRcdDxsaT5cImFsdGVybmF0ZURvd25cIiAtIGp1bXAgZG93biB0d28gYW5kIHVwIG9uZTwvbGk+XG5cdFx0ICogIFx0XHRcdDxsaT5cInJhbmRvbVwiIC0gcmFuZG9tbHkgc2VsZWN0IGFuIGluZGV4PC9saT5cblx0XHQgKiAgXHRcdFx0PGxpPlwicmFuZG9tV2Fsa1wiIC0gcmFuZG9tbHkgbW92ZXMgb25lIGluZGV4IGF3YXkgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbjwvbGk+XG5cdFx0ICogIFx0XHRcdDxsaT5cInJhbmRvbU9uY2VcIiAtIHJhbmRvbWx5IHNlbGVjdCBhbiBpbmRleCB3aXRob3V0IHJlcGVhdGluZyB1bnRpbCBhbGwgdmFsdWVzIGhhdmUgYmVlbiBjaG9zZW4uPC9saT5cblx0XHQgKiAgICAgXHRcdDwvdWw+XG5cdFx0ICogIEBwYXJhbSAge0FycmF5fSAgdmFsdWVzICAgQW4gYXJyYXkgb2Ygb3B0aW9ucyB0byBjaG9vc2UgZnJvbS5cblx0XHQgKiAgQHBhcmFtICB7VG9uZS5DdHJsUGF0dGVybi5UeXBlPX0gIHR5cGUgIFRoZSBuYW1lIG9mIHRoZSBwYXR0ZXJuLlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybFBhdHRlcm4gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAndmFsdWVzJyxcblx0ICAgICAgICAgICAgJ3R5cGUnXG5cdCAgICAgICAgXSwgVG9uZS5DdHJsUGF0dGVybik7XG5cdCAgICAgICAgVG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhcnJheSBvZiB2YWx1ZXMgdG8gYXJwZWdnaWF0ZSBvdmVyXG5cdFx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy52YWx1ZXMgPSBvcHRpb25zLnZhbHVlcztcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgdmFsdWVzIGFycmF5XG5cdFx0XHQgKiAgQHR5cGUgIHtOdW1iZXJ9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmluZGV4ID0gMDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdHlwZSBwbGFjZWhvbGRlclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkN0cmxQYXR0ZXJuLlR5cGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3R5cGUgPSBudWxsO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFNodWZmbGVkIHZhbHVlcyBmb3IgdGhlIFJhbmRvbU9uY2UgdHlwZVxuXHRcdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc2h1ZmZsZWQgPSBudWxsO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBkaXJlY3Rpb24gb2YgdGhlIG1vdmVtZW50XG5cdFx0XHQgKiAgQHR5cGUge1N0cmluZ31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5DdHJsUGF0dGVybik7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIENvbnRyb2wgUGF0dGVybnNcblx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybFBhdHRlcm4uVHlwZSA9IHtcblx0ICAgICAgICBVcDogJ3VwJyxcblx0ICAgICAgICBEb3duOiAnZG93bicsXG5cdCAgICAgICAgVXBEb3duOiAndXBEb3duJyxcblx0ICAgICAgICBEb3duVXA6ICdkb3duVXAnLFxuXHQgICAgICAgIEFsdGVybmF0ZVVwOiAnYWx0ZXJuYXRlVXAnLFxuXHQgICAgICAgIEFsdGVybmF0ZURvd246ICdhbHRlcm5hdGVEb3duJyxcblx0ICAgICAgICBSYW5kb206ICdyYW5kb20nLFxuXHQgICAgICAgIFJhbmRvbVdhbGs6ICdyYW5kb21XYWxrJyxcblx0ICAgICAgICBSYW5kb21PbmNlOiAncmFuZG9tT25jZSdcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGRlZmF1bHQgdmFsdWVzLiBcblx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkN0cmxQYXR0ZXJuLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICd0eXBlJzogVG9uZS5DdHJsUGF0dGVybi5UeXBlLlVwLFxuXHQgICAgICAgICd2YWx1ZXMnOiBbXVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgdmFsdWUgYXQgdGhlIGN1cnJlbnQgaW5kZXggb2YgdGhlIHBhdHRlcm4uXG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5DdHJsUGF0dGVybiNcblx0XHQgKiAgQHR5cGUgeyp9XG5cdFx0ICogIEBuYW1lIHZhbHVlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5DdHJsUGF0dGVybi5wcm90b3R5cGUsICd2YWx1ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgLy9zb21lIHNhZmVndWFyZHNcblx0ICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzWzBdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuaW5kZXggPSBNYXRoLm1pbih0aGlzLmluZGV4LCB0aGlzLnZhbHVlcy5sZW5ndGggLSAxKTtcblx0ICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWVzW3RoaXMuaW5kZXhdO1xuXHQgICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuUmFuZG9tT25jZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCAhPT0gdGhpcy5fc2h1ZmZsZWQubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2h1ZmZsZVZhbHVlcygpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdmFsID0gdGhpcy52YWx1ZXNbdGhpcy5fc2h1ZmZsZWRbdGhpcy5pbmRleF1dO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHBhdHRlcm4gdXNlZCB0byBzZWxlY3QgdGhlIG5leHRcblx0XHQgKiAgaXRlbSBmcm9tIHRoZSB2YWx1ZXMgYXJyYXlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuQ3RybFBhdHRlcm4jXG5cdFx0ICogIEB0eXBlIHtUb25lLkN0cmxQYXR0ZXJuLlR5cGV9XG5cdFx0ICogIEBuYW1lIHR5cGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkN0cmxQYXR0ZXJuLnByb3RvdHlwZSwgJ3R5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcblx0ICAgICAgICAgICAgdGhpcy5fc2h1ZmZsZWQgPSBudWxsO1xuXHQgICAgICAgICAgICAvL3RoZSBmaXJzdCBpbmRleFxuXHQgICAgICAgICAgICBpZiAodGhpcy5fdHlwZSA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLlVwIHx8IHRoaXMuX3R5cGUgPT09IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5VcERvd24gfHwgdGhpcy5fdHlwZSA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLlJhbmRvbU9uY2UgfHwgdGhpcy5fdHlwZSA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLkFsdGVybmF0ZVVwKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gMDtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90eXBlID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuRG93biB8fCB0aGlzLl90eXBlID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuRG93blVwIHx8IHRoaXMuX3R5cGUgPT09IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5BbHRlcm5hdGVEb3duKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvL3RoZSBkaXJlY3Rpb25cblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5VcERvd24gfHwgdGhpcy5fdHlwZSA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLkFsdGVybmF0ZVVwKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuVXA7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLkRvd25VcCB8fCB0aGlzLl90eXBlID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuQWx0ZXJuYXRlRG93bikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLkRvd247XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy9yYW5kb21zXG5cdCAgICAgICAgICAgIGlmICh0aGlzLl90eXBlID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuUmFuZG9tT25jZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fc2h1ZmZsZVZhbHVlcygpO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFRvbmUuQ3RybFBhdHRlcm4uUmFuZG9tKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy52YWx1ZXMubGVuZ3RoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgbmV4dCB2YWx1ZSBnaXZlbiB0aGUgY3VycmVudCBwb3NpdGlvblxuXHRcdCAqICBhbmQgcGF0dGVybi5cblx0XHQgKiAgQHJldHVybiB7Kn0gVGhlIG5leHQgdmFsdWVcblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybFBhdHRlcm4ucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cdCAgICAgICAgLy9jaG9vc2UgdGhlIG5leHQgaW5kZXhcblx0ICAgICAgICBpZiAodHlwZSA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLlVwKSB7XG5cdCAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcblx0ICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPj0gdGhpcy52YWx1ZXMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gMDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLkRvd24pIHtcblx0ICAgICAgICAgICAgdGhpcy5pbmRleC0tO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5pbmRleCA8IDApIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSB0aGlzLnZhbHVlcy5sZW5ndGggLSAxO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuVXBEb3duIHx8IHR5cGUgPT09IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5Eb3duVXApIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLlVwKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4Kys7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4LS07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPCAwKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gMTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5VcDtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluZGV4ID49IHRoaXMudmFsdWVzLmxlbmd0aCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudmFsdWVzLmxlbmd0aCAtIDI7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuRG93bjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLlJhbmRvbSkge1xuXHQgICAgICAgICAgICB0aGlzLmluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy52YWx1ZXMubGVuZ3RoKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5SYW5kb21XYWxrKSB7XG5cdCAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpIDwgMC41KSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4LS07XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gTWF0aC5tYXgodGhpcy5pbmRleCwgMCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4Kys7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gTWF0aC5taW4odGhpcy5pbmRleCwgdGhpcy52YWx1ZXMubGVuZ3RoIC0gMSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5SYW5kb21PbmNlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuaW5kZXgrKztcblx0ICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPj0gdGhpcy52YWx1ZXMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gMDtcblx0ICAgICAgICAgICAgICAgIC8vcmVzaHVmZmxlIHRoZSB2YWx1ZXMgZm9yIG5leHQgdGltZVxuXHQgICAgICAgICAgICAgICAgdGhpcy5fc2h1ZmZsZVZhbHVlcygpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuQWx0ZXJuYXRlVXApIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2RpcmVjdGlvbiA9PT0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLlVwKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmluZGV4ICs9IDI7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuRG93bjtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggLT0gMTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5VcDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAodGhpcy5pbmRleCA+PSB0aGlzLnZhbHVlcy5sZW5ndGgpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLlVwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuQWx0ZXJuYXRlRG93bikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fZGlyZWN0aW9uID09PSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuVXApIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggKz0gMTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IFRvbmUuQ3RybFBhdHRlcm4uVHlwZS5Eb3duO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5pbmRleCAtPSAyO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVG9uZS5DdHJsUGF0dGVybi5UeXBlLlVwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmluZGV4IDwgMCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMudmFsdWVzLmxlbmd0aCAtIDE7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuRG93bjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2h1ZmZsZXMgdGhlIHZhbHVlcyBhbmQgcGxhY2VzIHRoZSByZXN1bHRzIGludG8gdGhlIF9zaHVmZmxlZFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5DdHJsUGF0dGVybi5wcm90b3R5cGUuX3NodWZmbGVWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIGNvcHkgPSBbXTtcblx0ICAgICAgICB0aGlzLl9zaHVmZmxlZCA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52YWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgY29weVtpXSA9IGk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHdoaWxlIChjb3B5Lmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgdmFyIHJhbmRWYWwgPSBjb3B5LnNwbGljZShNYXRoLmZsb29yKGNvcHkubGVuZ3RoICogTWF0aC5yYW5kb20oKSksIDEpO1xuXHQgICAgICAgICAgICB0aGlzLl9zaHVmZmxlZC5wdXNoKHJhbmRWYWxbMF0pO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuQ3RybFBhdHRlcm59IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybFBhdHRlcm4ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5fc2h1ZmZsZWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMudmFsdWVzID0gbnVsbDtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5DdHJsUGF0dGVybjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBDaG9vc2UgYSByYW5kb20gdmFsdWUuXG5cdFx0ICogIEBleHRlbmRzIHtUb25lfVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciByYW5kb21XYWxrID0gbmV3IFRvbmUuQ3RybFJhbmRvbSh7XG5cdFx0ICogXHRcIm1pblwiIDogMCxcblx0XHQgKiBcdFwibWF4XCIgOiAxMCxcblx0XHQgKiBcdFwiaW50ZWdlclwiIDogdHJ1ZVxuXHRcdCAqIH0pO1xuXHRcdCAqIHJhbmRvbVdhbGsuZXZhbCgpO1xuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfFRpbWU9fSBtaW4gVGhlIG1pbmltdW0gcmV0dXJuIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0ge051bWJlcnxUaW1lPX0gbWF4IFRoZSBtYXhpbXVtIHJldHVybiB2YWx1ZS5cblx0XHQgKi9cblx0ICAgIFRvbmUuQ3RybFJhbmRvbSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdtaW4nLFxuXHQgICAgICAgICAgICAnbWF4J1xuXHQgICAgICAgIF0sIFRvbmUuQ3RybFJhbmRvbSk7XG5cdCAgICAgICAgVG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtaW5pbXVtIHJldHVybiB2YWx1ZVxuXHRcdFx0ICogIEB0eXBlICB7TnVtYmVyfFRpbWV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm1pbiA9IG9wdGlvbnMubWluO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtYXhpbXVtIHJldHVybiB2YWx1ZVxuXHRcdFx0ICogIEB0eXBlICB7TnVtYmVyfFRpbWV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm1heCA9IG9wdGlvbnMubWF4O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIElmIHRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIGFuIGludGVnZXJcblx0XHRcdCAqICBAdHlwZSAge0Jvb2xlYW59XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmludGVnZXIgPSBvcHRpb25zLmludGVnZXI7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5DdHJsUmFuZG9tKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5DdHJsUmFuZG9tLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdtaW4nOiAwLFxuXHQgICAgICAgICdtYXgnOiAxLFxuXHQgICAgICAgICdpbnRlZ2VyJzogZmFsc2Vcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJuIGEgcmFuZG9tIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXguIFxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuQ3RybFJhbmRvbSNcblx0XHQgKiAgQHR5cGUgeyp9XG5cdFx0ICogIEBuYW1lIHZhbHVlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5DdHJsUmFuZG9tLnByb3RvdHlwZSwgJ3ZhbHVlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgbWluID0gdGhpcy50b1NlY29uZHModGhpcy5taW4pO1xuXHQgICAgICAgICAgICB2YXIgbWF4ID0gdGhpcy50b1NlY29uZHModGhpcy5tYXgpO1xuXHQgICAgICAgICAgICB2YXIgcmFuZCA9IE1hdGgucmFuZG9tKCk7XG5cdCAgICAgICAgICAgIHZhciB2YWwgPSByYW5kICogbWluICsgKDEgLSByYW5kKSAqIG1heDtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuaW50ZWdlcikge1xuXHQgICAgICAgICAgICAgICAgdmFsID0gTWF0aC5mbG9vcih2YWwpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICByZXR1cm4gVG9uZS5DdHJsUmFuZG9tO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIEEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgbXVsdGlwbGUgYnVmZmVycy5cblx0XHQgKiAgXG5cdFx0ICogIEBwYXJhbSAge09iamVjdHxBcnJheX0gICAgdXJscyAgICAgIEFuIG9iamVjdCBsaXRlcmFsIG9yIGFycmF5XG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHVybHMgdG8gbG9hZC5cblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb249fSAgY2FsbGJhY2sgIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlblxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ1ZmZlcnMgYXJlIGxvYWRlZC4gXG5cdFx0ICogIEBleHRlbmRzIHtUb25lfVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vbG9hZCBhIHdob2xlIGJhbmsgb2YgcGlhbm8gc2FtcGxlc1xuXHRcdCAqIHZhciBwaWFub1NhbXBsZXMgPSBuZXcgVG9uZS5CdWZmZXJzKHtcblx0XHQgKiBcdFwiQzRcIiA6IFwicGF0aC90by9DNC5tcDNcIlxuXHRcdCAqIFx0XCJDIzRcIiA6IFwicGF0aC90by9DIzQubXAzXCJcblx0XHQgKiBcdFwiRDRcIiA6IFwicGF0aC90by9ENC5tcDNcIlxuXHRcdCAqIFx0XCJEIzRcIiA6IFwicGF0aC90by9EIzQubXAzXCJcblx0XHQgKiBcdC4uLlxuXHRcdCAqIH0sIGZ1bmN0aW9uKCl7XG5cdFx0ICogXHQvL3BsYXkgb25lIG9mIHRoZSBzYW1wbGVzIHdoZW4gdGhleSBhbGwgbG9hZFxuXHRcdCAqIFx0cGxheWVyLmJ1ZmZlciA9IHBpYW5vU2FtcGxlcy5nZXQoXCJDNFwiKTtcblx0XHQgKiBcdHBsYXllci5zdGFydCgpO1xuXHRcdCAqIH0pO1xuXHRcdCAqIFx0QGV4YW1wbGVcblx0XHQgKiAvL1RvIHBhc3MgaW4gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGluIHRoZSBzZWNvbmQgcGFyYW1ldGVyXG5cdFx0ICogdmFyIGJ1ZmZlcnMgPSBuZXcgVG9uZS5CdWZmZXJzKHVybHMsIHtcblx0XHQgKiBcdFwib25sb2FkXCIgOiBjYWxsYmFjayxcblx0XHQgKiBcdFwiYmFzZVVybFwiIDogXCIuLi9wYXRoL3RvL2F1ZGlvL1wiXG5cdFx0ICogfSlcblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVycyA9IGZ1bmN0aW9uICh1cmxzKSB7XG5cdCAgICAgICAgLy9yZW1vdmUgdGhlIHVybHMgZnJvbSB0aGUgb3B0aW9uc1xuXHQgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0ICAgICAgICBhcmdzLnNoaWZ0KCk7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3MsIFtcblx0ICAgICAgICAgICAgJ29ubG9hZCcsXG5cdCAgICAgICAgICAgICdiYXNlVXJsJ1xuXHQgICAgICAgIF0sIFRvbmUuQnVmZmVycyk7XG5cdCAgICAgICAgVG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEFsbCBvZiB0aGUgYnVmZmVyc1xuXHRcdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9idWZmZXJzID0ge307XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQSBwYXRoIHdoaWNoIGlzIHByZWZpeGVkIGJlZm9yZSBldmVyeSB1cmwuXG5cdFx0XHQgKiAgQHR5cGUgIHtTdHJpbmd9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmw7XG5cdCAgICAgICAgdGhpcy5fbG9hZGluZ0NvdW50ID0gMDtcblx0ICAgICAgICAvL2FkZCBlYWNoIG9uZVxuXHQgICAgICAgIGZvciAodmFyIGtleSBpbiB1cmxzKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdDb3VudCsrO1xuXHQgICAgICAgICAgICB0aGlzLmFkZChrZXksIHVybHNba2V5XSwgdGhpcy5fYnVmZmVyTG9hZGVkLmJpbmQodGhpcywgb3B0aW9ucy5vbmxvYWQpKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5CdWZmZXJzKTtcblx0ICAgIC8qKlxuXHRcdCAqICBEZWZhdWx0c1xuXHRcdCAqICBAdHlwZSAge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVycy5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnb25sb2FkJzogVG9uZS5ub09wLFxuXHQgICAgICAgICdiYXNlVXJsJzogJydcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVHJ1ZSBpZiB0aGUgYnVmZmVycyBvYmplY3QgaGFzIGEgYnVmZmVyIGJ5IHRoYXQgbmFtZS5cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfE51bWJlcn0gIG5hbWUgIFRoZSBrZXkgb3IgaW5kZXggb2YgdGhlIFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLlxuXHRcdCAqICBAcmV0dXJuICB7Qm9vbGVhbn1cblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVycy5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgR2V0IGEgYnVmZmVyIGJ5IG5hbWUuIElmIGFuIGFycmF5IHdhcyBsb2FkZWQsIFxuXHRcdCAqICB0aGVuIHVzZSB0aGUgYXJyYXkgaW5kZXguXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ3xOdW1iZXJ9ICBuYW1lICBUaGUga2V5IG9yIGluZGV4IG9mIHRoZSBcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuQnVmZmVyfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmhhcyhuYW1lKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyc1tuYW1lXTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbmUuQnVmZmVyczogbm8gYnVmZmVyIG5hbWVkICcgKyBuYW1lKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEEgYnVmZmVyIHdhcyBsb2FkZWQuIGRlY3JlbWVudCB0aGUgY291bnRlci5cblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayBcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVycy5wcm90b3R5cGUuX2J1ZmZlckxvYWRlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgIHRoaXMuX2xvYWRpbmdDb3VudC0tO1xuXHQgICAgICAgIGlmICh0aGlzLl9sb2FkaW5nQ291bnQgPT09IDAgJiYgY2FsbGJhY2spIHtcblx0ICAgICAgICAgICAgY2FsbGJhY2sodGhpcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIElmIHRoZSBidWZmZXJzIGFyZSBsb2FkZWQgb3Igbm90XG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQnVmZmVycyNcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKiBAbmFtZSBsb2FkZWRcblx0XHQgKiBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkJ1ZmZlcnMucHJvdG90eXBlLCAnbG9hZGVkJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgaXNMb2FkZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBidWZmTmFtZSBpbiB0aGlzLl9idWZmZXJzKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgYnVmZiA9IHRoaXMuZ2V0KGJ1ZmZOYW1lKTtcblx0ICAgICAgICAgICAgICAgIGlzTG9hZGVkID0gaXNMb2FkZWQgJiYgYnVmZi5sb2FkZWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIGlzTG9hZGVkO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIEFkZCBhIGJ1ZmZlciBieSBuYW1lIGFuZCB1cmwgdG8gdGhlIEJ1ZmZlcnNcblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfSAgICBuYW1lICAgICAgQSB1bmlxdWUgbmFtZSB0byBnaXZlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXJcblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfFRvbmUuQnVmZmVyfEF1ZGlvYnVmZmVyfSAgdXJsICBFaXRoZXIgdGhlIHVybCBvZiB0aGUgYnVmZXIsIFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgYnVmZmVyIHdoaWNoIHdpbGwgYmUgYWRkZWRcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbj19ICBjYWxsYmFjayAgVGhlIGNhbGxiYWNrIHRvIGludm9rZSBcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHVybCBpcyBsb2FkZWQuXG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlcnMucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChuYW1lLCB1cmwsIGNhbGxiYWNrKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBUb25lLmRlZmF1bHRBcmcoY2FsbGJhY2ssIFRvbmUubm9PcCk7XG5cdCAgICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIFRvbmUuQnVmZmVyKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2J1ZmZlcnNbbmFtZV0gPSB1cmw7XG5cdCAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodXJsIGluc3RhbmNlb2YgQXVkaW9CdWZmZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVyc1tuYW1lXSA9IG5ldyBUb25lLkJ1ZmZlcih1cmwpO1xuXHQgICAgICAgICAgICBjYWxsYmFjayh0aGlzKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKFRvbmUuaXNTdHJpbmcodXJsKSkge1xuXHQgICAgICAgICAgICB0aGlzLl9idWZmZXJzW25hbWVdID0gbmV3IFRvbmUuQnVmZmVyKHRoaXMuYmFzZVVybCArIHVybCwgY2FsbGJhY2spO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkJ1ZmZlcnN9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVycy5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLl9idWZmZXJzKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2J1ZmZlcnNbbmFtZV0uZGlzcG9zZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9idWZmZXJzID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5CdWZmZXJzO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBidXNlcyBhcmUgYW5vdGhlciB3YXkgb2Ygcm91dGluZyBhdWRpb1xuXHRcdCAqXG5cdFx0ICogIGF1Z21lbnRzIFRvbmUucHJvdG90eXBlIHRvIGluY2x1ZGUgc2VuZCBhbmQgcmVjaWV2ZVxuXHRcdCAqL1xuXHQgICAgLyoqXG5cdFx0ICogIEFsbCBvZiB0aGUgcm91dGVzXG5cdFx0ICpcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgdmFyIEJ1c2VzID0ge307XG5cdCAgICAvKipcblx0XHQgKiAgU2VuZCB0aGlzIHNpZ25hbCB0byB0aGUgY2hhbm5lbCBuYW1lLlxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmd9IGNoYW5uZWxOYW1lIEEgbmFtZWQgY2hhbm5lbCB0byBzZW5kIHRoZSBzaWduYWwgdG8uXG5cdFx0ICogIEBwYXJhbSAge0RlY2liZWxzfSBhbW91bnQgVGhlIGFtb3VudCBvZiB0aGUgc291cmNlIHRvIHNlbmQgdG8gdGhlIGJ1cy5cblx0XHQgKiAgQHJldHVybiB7R2Fpbk5vZGV9IFRoZSBnYWluIG5vZGUgd2hpY2ggY29ubmVjdHMgdGhpcyBub2RlIHRvIHRoZSBkZXNpcmVkIGNoYW5uZWwuXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICBDYW4gYmUgdXNlZCB0byBhZGp1c3QgdGhlIGxldmVscyBvZiB0aGUgc2VuZC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBzb3VyY2Uuc2VuZChcInJldmVyYlwiLCAtMTIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChjaGFubmVsTmFtZSwgYW1vdW50KSB7XG5cdCAgICAgICAgaWYgKCFCdXNlcy5oYXNPd25Qcm9wZXJ0eShjaGFubmVsTmFtZSkpIHtcblx0ICAgICAgICAgICAgQnVzZXNbY2hhbm5lbE5hbWVdID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYW1vdW50ID0gVG9uZS5kZWZhdWx0QXJnKGFtb3VudCwgMCk7XG5cdCAgICAgICAgdmFyIHNlbmRLbm9iID0gbmV3IFRvbmUuR2FpbihhbW91bnQsIFRvbmUuVHlwZS5EZWNpYmVscyk7XG5cdCAgICAgICAgdGhpcy5jb25uZWN0KHNlbmRLbm9iKTtcblx0ICAgICAgICBzZW5kS25vYi5jb25uZWN0KEJ1c2VzW2NoYW5uZWxOYW1lXSk7XG5cdCAgICAgICAgcmV0dXJuIHNlbmRLbm9iO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZWNpZXZlIHRoZSBpbnB1dCBmcm9tIHRoZSBkZXNpcmVkIGNoYW5uZWxOYW1lIHRvIHRoZSBpbnB1dFxuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ30gY2hhbm5lbE5hbWUgQSBuYW1lZCBjaGFubmVsIHRvIHNlbmQgdGhlIHNpZ25hbCB0by5cblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyPX0gY2hhbm5lbE51bWJlciBUaGUgY2hhbm5lbCB0byBjb25uZWN0IHRvXG5cdFx0ICogIEByZXR1cm5zIHtUb25lfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogcmV2ZXJiRWZmZWN0LnJlY2VpdmUoXCJyZXZlcmJcIik7XG5cdFx0ICovXG5cdCAgICBUb25lLnByb3RvdHlwZS5yZWNlaXZlID0gZnVuY3Rpb24gKGNoYW5uZWxOYW1lLCBpbnB1dE51bSkge1xuXHQgICAgICAgIGlmICghQnVzZXMuaGFzT3duUHJvcGVydHkoY2hhbm5lbE5hbWUpKSB7XG5cdCAgICAgICAgICAgIEJ1c2VzW2NoYW5uZWxOYW1lXSA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIEJ1c2VzW2NoYW5uZWxOYW1lXS5jb25uZWN0KHRoaXMsIDAsIGlucHV0TnVtKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvL3JlbW92ZSBhbGwgdGhlIHNlbmQvcmVjZWl2ZXMgd2hlbiBhIG5ldyBhdWRpbyBjb250ZXh0IGlzIHBhc3NlZCBpblxuXHQgICAgVG9uZS5Db250ZXh0Lm9uKCdpbml0JywgZnVuY3Rpb24gKGNvbnRleHQpIHtcblx0ICAgICAgICBpZiAoY29udGV4dC5CdXNlcykge1xuXHQgICAgICAgICAgICBCdXNlcyA9IGNvbnRleHQuQnVzZXM7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgQnVzZXMgPSB7fTtcblx0ICAgICAgICAgICAgY29udGV4dC5CdXNlcyA9IEJ1c2VzO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgcmV0dXJuIFRvbmU7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLkRyYXcgaXMgdXNlZnVsIGZvciBzeW5jaHJvbml6aW5nIHZpc3VhbHMgYW5kIGF1ZGlvIGV2ZW50cy5cblx0XHQgKiAgICAgICAgIENhbGxiYWNrcyBmcm9tIFRvbmUuVHJhbnNwb3J0IG9yIGFueSBvZiB0aGUgVG9uZS5FdmVudCBjbGFzc2VzXG5cdFx0ICogICAgICAgICBhbHdheXMgaGFwcGVuIF9iZWZvcmVfIHRoZSBzY2hlZHVsZWQgdGltZSBhbmQgYXJlIG5vdCBzeW5jaHJvbml6ZWRcblx0XHQgKiAgICAgICAgIHRvIHRoZSBhbmltYXRpb24gZnJhbWUgc28gdGhleSBhcmUgbm90IGdvb2QgZm9yIHRyaWdnZXJpbmcgdGlnaHRseVxuXHRcdCAqICAgICAgICAgc3luY2hyb25pemVkIHZpc3VhbHMgYW5kIHNvdW5kLiBUb25lLkRyYXcgbWFrZXMgaXQgZWFzeSB0byBzY2hlZHVsZVxuXHRcdCAqICAgICAgICAgY2FsbGJhY2tzIHVzaW5nIHRoZSBBdWRpb0NvbnRleHQgdGltZSBhbmQgdXNlcyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG5cdFx0ICogICAgICAgICBcblx0XHQgKiAgQHNpbmdsZXRvblxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBUb25lLlRyYW5zcG9ydC5zY2hlZHVsZShmdW5jdGlvbih0aW1lKXtcblx0XHQgKiBcdC8vdXNlIHRoZSB0aW1lIGFyZ3VtZW50IHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgd2l0aCBUb25lLkRyYXdcblx0XHQgKiBcdFRvbmUuRHJhdy5zY2hlZHVsZShmdW5jdGlvbigpe1xuXHRcdCAqIFx0XHQvL2RvIGRyYXdpbmcgb3IgRE9NIG1hbmlwdWxhdGlvbiBoZXJlXG5cdFx0ICogXHR9LCB0aW1lKVxuXHRcdCAqIH0sIFwiKzAuNVwiKVxuXHRcdCAqL1xuXHQgICAgVG9uZS5EcmF3ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBbGwgb2YgdGhlIGV2ZW50cy5cblx0XHRcdCAqICBAdHlwZSAge1RvbmUuVGltZWxpbmV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBUb25lLlRpbWVsaW5lKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGR1cmF0aW9uIGFmdGVyIHdoaWNoIGV2ZW50cyBhcmUgbm90IGludm9rZWQuXG5cdFx0XHQgKiAgQHR5cGUgIHtOdW1iZXJ9XG5cdFx0XHQgKiAgQGRlZmF1bHQgMC4yNVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5leHBpcmF0aW9uID0gMC4yNTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW1vdW50IG9mIHRpbWUgYmVmb3JlIHRoZSBzY2hlZHVsZWQgdGltZSBcblx0XHRcdCAqICB0aGF0IHRoZSBjYWxsYmFjayBjYW4gYmUgaW52b2tlZC4gRGVmYXVsdCBpc1xuXHRcdFx0ICogIGhhbGYgdGhlIHRpbWUgb2YgYW4gYW5pbWF0aW9uIGZyYW1lICgwLjAwOCBzZWNvbmRzKS5cblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqICBAZGVmYXVsdCAwLjAwOFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5hbnRpY2lwYXRpb24gPSAwLjAwODtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZHJhdyBsb29wXG5cdFx0XHQgKiAgQHR5cGUgIHtGdW5jdGlvbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYm91bmREcmF3TG9vcCA9IHRoaXMuX2RyYXdMb29wLmJpbmQodGhpcyk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5EcmF3KTtcblx0ICAgIC8qKlxuXHRcdCAqICBTY2hlZHVsZSBhIGZ1bmN0aW9uIGF0IHRoZSBnaXZlbiB0aW1lIHRvIGJlIGludm9rZWRcblx0XHQgKiAgb24gdGhlIG5lYXJlc3QgYW5pbWF0aW9uIGZyYW1lLlxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICBDYWxsYmFjayBpcyBpbnZva2VkIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSAgICB0aW1lICAgICAgVGhlIHRpbWUgcmVsYXRpdmUgdG8gdGhlIEF1ZGlvQ29udGV4dCB0aW1lXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbnZva2UgdGhlIGNhbGxiYWNrLlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5EcmF3fSAgICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkRyYXcucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmFkZCh7XG5cdCAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcblx0ICAgICAgICAgICAgdGltZTogdGhpcy50b1NlY29uZHModGltZSlcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvL3N0YXJ0IHRoZSBkcmF3IGxvb3Agb24gdGhlIGZpcnN0IGV2ZW50XG5cdCAgICAgICAgaWYgKHRoaXMuX2V2ZW50cy5sZW5ndGggPT09IDEpIHtcblx0ICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2JvdW5kRHJhd0xvb3ApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2FuY2VsIGV2ZW50cyBzY2hlZHVsZWQgYWZ0ZXIgdGhlIGdpdmVuIHRpbWVcblx0XHQgKiAgQHBhcmFtICB7VGltZT19ICBhZnRlciAgVGltZSBhZnRlciB3aGljaCBzY2hlZHVsZWQgZXZlbnRzIHdpbGwgXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2NoZWR1bGluZyB0aW1lbGluZS5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuRHJhd30gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRHJhdy5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKGFmdGVyKSB7XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzLmNhbmNlbCh0aGlzLnRvU2Vjb25kcyhhZnRlcikpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZHJhdyBsb29wXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkRyYXcucHJvdG90eXBlLl9kcmF3TG9vcCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgbm93ID0gVG9uZS5ub3coKTtcblx0ICAgICAgICB3aGlsZSAodGhpcy5fZXZlbnRzLmxlbmd0aCAmJiB0aGlzLl9ldmVudHMucGVlaygpLnRpbWUgLSB0aGlzLmFudGljaXBhdGlvbiA8PSBub3cpIHtcblx0ICAgICAgICAgICAgdmFyIGV2ZW50ID0gdGhpcy5fZXZlbnRzLnNoaWZ0KCk7XG5cdCAgICAgICAgICAgIGlmIChub3cgLSBldmVudC50aW1lIDw9IHRoaXMuZXhwaXJhdGlvbikge1xuXHQgICAgICAgICAgICAgICAgZXZlbnQuY2FsbGJhY2soKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5fZXZlbnRzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2JvdW5kRHJhd0xvb3ApO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvL21ha2UgYSBzaW5nbGV0b25cblx0ICAgIFRvbmUuRHJhdyA9IG5ldyBUb25lLkRyYXcoKTtcblx0ICAgIHJldHVybiBUb25lLkRyYXc7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgQm90aCBUb25lLlBhbm5lcjNEIGFuZCBUb25lLkxpc3RlbmVyIGhhdmUgYSBwb3NpdGlvbiBpbiAzRCBzcGFjZVxuXHRcdCAqICAgICAgICAgIHVzaW5nIGEgcmlnaHQtaGFuZGVkIGNhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbS5cblx0XHQgKiAgICAgICAgICBUaGUgdW5pdHMgdXNlZCBpbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gYXJlIG5vdCBkZWZpbmVkO1xuXHRcdCAqICAgICAgICAgIHRoZXNlIGNvb3JkaW5hdGVzIGFyZSBpbmRlcGVuZGVudC9pbnZhcmlhbnQgb2YgYW55IHBhcnRpY3VsYXJcblx0XHQgKiAgICAgICAgICB1bml0cyBzdWNoIGFzIG1ldGVycyBvciBmZWV0LiBUb25lLlBhbm5lcjNEIG9iamVjdHMgaGF2ZSBhbiBmb3J3YXJkXG5cdFx0ICogICAgICAgICAgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgZGlyZWN0aW9uIHRoZSBzb3VuZCBpcyBwcm9qZWN0aW5nLiBBZGRpdGlvbmFsbHksXG5cdFx0ICogICAgICAgICAgdGhleSBoYXZlIGEgc291bmQgY29uZSByZXByZXNlbnRpbmcgaG93IGRpcmVjdGlvbmFsIHRoZSBzb3VuZCBpcy5cblx0XHQgKiAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIHNvdW5kIGNvdWxkIGJlIG9tbmlkaXJlY3Rpb25hbCwgaW4gd2hpY2ggY2FzZSBpdCB3b3VsZFxuXHRcdCAqICAgICAgICAgIGJlIGhlYXJkIGFueXdoZXJlIHJlZ2FyZGxlc3Mgb2YgaXRzIGZvcndhcmQsIG9yIGl0IGNhbiBiZSBtb3JlIGRpcmVjdGlvbmFsXG5cdFx0ICogICAgICAgICAgYW5kIGhlYXJkIG9ubHkgaWYgaXQgaXMgZmFjaW5nIHRoZSBsaXN0ZW5lci4gVG9uZS5MaXN0ZW5lciBvYmplY3RzXG5cdFx0ICogICAgICAgICAgKHJlcHJlc2VudGluZyBhIHBlcnNvbidzIGVhcnMpIGhhdmUgYW4gZm9yd2FyZCBhbmQgdXAgdmVjdG9yXG5cdFx0ICogICAgICAgICAgcmVwcmVzZW50aW5nIGluIHdoaWNoIGRpcmVjdGlvbiB0aGUgcGVyc29uIGlzIGZhY2luZy4gQmVjYXVzZSBib3RoIHRoZVxuXHRcdCAqICAgICAgICAgIHNvdXJjZSBzdHJlYW0gYW5kIHRoZSBsaXN0ZW5lciBjYW4gYmUgbW92aW5nLCB0aGV5IGJvdGggaGF2ZSBhIHZlbG9jaXR5XG5cdFx0ICogICAgICAgICAgdmVjdG9yIHJlcHJlc2VudGluZyBib3RoIHRoZSBzcGVlZCBhbmQgZGlyZWN0aW9uIG9mIG1vdmVtZW50LiBUYWtlbiB0b2dldGhlcixcblx0XHQgKiAgICAgICAgICB0aGVzZSB0d28gdmVsb2NpdGllcyBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGRvcHBsZXIgc2hpZnQgZWZmZWN0IHdoaWNoIGNoYW5nZXMgdGhlIHBpdGNoLlxuXHRcdCAqICAgICAgICAgIDxicj48YnI+XG5cdFx0ICogICAgICAgICAgTm90ZTogdGhlIHBvc2l0aW9uIG9mIHRoZSBMaXN0ZW5lciB3aWxsIGhhdmUgbm8gZWZmZWN0IG9uIG5vZGVzIG5vdCBjb25uZWN0ZWQgdG8gYSBUb25lLlBhbm5lcjNEXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lfVxuXHRcdCAqICBAc2luZ2xldG9uXG5cdFx0ICovXG5cdCAgICBUb25lLkxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBIb2xkcyB0aGUgY3VycmVudCBmb3J3YXJkIG9yaWVudGF0aW9uXG5cdFx0XHQgKiAgQHR5cGUgIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBbXG5cdCAgICAgICAgICAgIDAsXG5cdCAgICAgICAgICAgIDAsXG5cdCAgICAgICAgICAgIDAsXG5cdCAgICAgICAgICAgIDAsXG5cdCAgICAgICAgICAgIDAsXG5cdCAgICAgICAgICAgIDBcblx0ICAgICAgICBdO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEhvbGRzIHRoZSBjdXJyZW50IHBvc2l0aW9uXG5cdFx0XHQgKiAgQHR5cGUgIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBbXG5cdCAgICAgICAgICAgIDAsXG5cdCAgICAgICAgICAgIDAsXG5cdCAgICAgICAgICAgIDBcblx0ICAgICAgICBdO1xuXHQgICAgICAgIFRvbmUuZ2V0Q29udGV4dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCBwb3NpdGlvbi9mb3J3YXJkXG5cdCAgICAgICAgICAgIHRoaXMuc2V0KExpc3RlbmVyQ29uc3RydWN0b3IuZGVmYXVsdHMpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5MaXN0ZW5lcik7XG5cdCAgICAvKipcblx0XHQgKiAgRGVmYXVsdHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkxpc3RlbmVyLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdwb3NpdGlvblgnOiAwLFxuXHQgICAgICAgICdwb3NpdGlvblknOiAwLFxuXHQgICAgICAgICdwb3NpdGlvblonOiAwLFxuXHQgICAgICAgICdmb3J3YXJkWCc6IDAsXG5cdCAgICAgICAgJ2ZvcndhcmRZJzogMCxcblx0ICAgICAgICAnZm9yd2FyZFonOiAxLFxuXHQgICAgICAgICd1cFgnOiAwLFxuXHQgICAgICAgICd1cFknOiAxLFxuXHQgICAgICAgICd1cFonOiAwXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHJhbXAgdGltZSB3aGljaCBpcyBhcHBsaWVkIHRvIHRoZSBzZXRUYXJnZXRBdFRpbWVcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkxpc3RlbmVyLnByb3RvdHlwZS5fcmFtcFRpbWVDb25zdGFudCA9IDAuMDE7XG5cdCAgICAvKipcblx0XHQgKiAgU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyIGluIDNkIHNwYWNlLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB4XG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHlcblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgelxuXHRcdCAqICBAcmV0dXJuIHtUb25lLkxpc3RlbmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkxpc3RlbmVyLnByb3RvdHlwZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICh4LCB5LCB6KSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5saXN0ZW5lci5wb3NpdGlvblgpIHtcblx0ICAgICAgICAgICAgdmFyIG5vdyA9IHRoaXMubm93KCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5saXN0ZW5lci5wb3NpdGlvblguc2V0VGFyZ2V0QXRUaW1lKHgsIG5vdywgdGhpcy5fcmFtcFRpbWVDb25zdGFudCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5saXN0ZW5lci5wb3NpdGlvblkuc2V0VGFyZ2V0QXRUaW1lKHksIG5vdywgdGhpcy5fcmFtcFRpbWVDb25zdGFudCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5saXN0ZW5lci5wb3NpdGlvblouc2V0VGFyZ2V0QXRUaW1lKHosIG5vdywgdGhpcy5fcmFtcFRpbWVDb25zdGFudCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0Lmxpc3RlbmVyLnNldFBvc2l0aW9uKHgsIHksIHopO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNldHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsaXN0ZW5lciB1c2luZyB0d28gdmVjdG9ycywgdGhlIGZvcndhcmRcblx0XHQgKiAgdmVjdG9yICh3aGljaCBkaXJlY3Rpb24gdGhlIGxpc3RlbmVyIGlzIGZhY2luZykgYW5kIHRoZSB1cCB2ZWN0b3Jcblx0XHQgKiAgKHdoaWNoIHRoZSB1cCBkaXJlY3Rpb24gb2YgdGhlIGxpc3RlbmVyKS4gQW4gdXAgdmVjdG9yXG5cdFx0ICogIG9mIDAsIDAsIDEgaXMgZXF1aXZhbGVudCB0byB0aGUgbGlzdGVuZXIgc3RhbmRpbmcgdXAgaW4gdGhlIFogZGlyZWN0aW9uLlxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB4XG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHlcblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgelxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB1cFhcblx0XHQgKiAgQHBhcmFtICB7TnVtYmVyfSAgdXBZXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHVwWlxuXHRcdCAqICBAcmV0dXJuIHtUb25lLkxpc3RlbmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkxpc3RlbmVyLnByb3RvdHlwZS5zZXRPcmllbnRhdGlvbiA9IGZ1bmN0aW9uICh4LCB5LCB6LCB1cFgsIHVwWSwgdXBaKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuY29udGV4dC5saXN0ZW5lci5mb3J3YXJkWCkge1xuXHQgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5ub3coKTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0Lmxpc3RlbmVyLmZvcndhcmRYLnNldFRhcmdldEF0VGltZSh4LCBub3csIHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQubGlzdGVuZXIuZm9yd2FyZFkuc2V0VGFyZ2V0QXRUaW1lKHksIG5vdywgdGhpcy5fcmFtcFRpbWVDb25zdGFudCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5saXN0ZW5lci5mb3J3YXJkWi5zZXRUYXJnZXRBdFRpbWUoeiwgbm93LCB0aGlzLl9yYW1wVGltZUNvbnN0YW50KTtcblx0ICAgICAgICAgICAgdGhpcy5jb250ZXh0Lmxpc3RlbmVyLnVwWC5zZXRUYXJnZXRBdFRpbWUodXBYLCBub3csIHRoaXMuX3JhbXBUaW1lQ29uc3RhbnQpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQubGlzdGVuZXIudXBZLnNldFRhcmdldEF0VGltZSh1cFksIG5vdywgdGhpcy5fcmFtcFRpbWVDb25zdGFudCk7XG5cdCAgICAgICAgICAgIHRoaXMuY29udGV4dC5saXN0ZW5lci51cFouc2V0VGFyZ2V0QXRUaW1lKHVwWiwgbm93LCB0aGlzLl9yYW1wVGltZUNvbnN0YW50KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQubGlzdGVuZXIuc2V0T3JpZW50YXRpb24oeCwgeSwgeiwgdXBYLCB1cFksIHVwWik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHggcG9zaXRpb24gb2YgdGhlIHBhbm5lciBvYmplY3QuXG5cdFx0ICogIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkxpc3RlbmVyI1xuXHRcdCAqICBAbmFtZSBwb3NpdGlvblhcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkxpc3RlbmVyLnByb3RvdHlwZSwgJ3Bvc2l0aW9uWCcsIHtcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwb3MpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25bMF0gPSBwb3M7XG5cdCAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24uYXBwbHkodGhpcywgdGhpcy5fcG9zaXRpb24pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvblswXTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgeSBwb3NpdGlvbiBvZiB0aGUgcGFubmVyIG9iamVjdC5cblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTGlzdGVuZXIjXG5cdFx0ICogIEBuYW1lIHBvc2l0aW9uWVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTGlzdGVuZXIucHJvdG90eXBlLCAncG9zaXRpb25ZJywge1xuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBvcykge1xuXHQgICAgICAgICAgICB0aGlzLl9wb3NpdGlvblsxXSA9IHBvcztcblx0ICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbi5hcHBseSh0aGlzLCB0aGlzLl9wb3NpdGlvbik7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uWzFdO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSB6IHBvc2l0aW9uIG9mIHRoZSBwYW5uZXIgb2JqZWN0LlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5MaXN0ZW5lciNcblx0XHQgKiAgQG5hbWUgcG9zaXRpb25aXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5MaXN0ZW5lci5wcm90b3R5cGUsICdwb3NpdGlvblonLCB7XG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocG9zKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uWzJdID0gcG9zO1xuXHQgICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uLmFwcGx5KHRoaXMsIHRoaXMuX3Bvc2l0aW9uKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9zaXRpb25bMl07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbGlzdGVuZXJzIGZyb250IGRpcmVjdGlvbi4gaS5lLlxuXHRcdCAqICB3aGljaCB3YXkgdGhleSBhcmUgZmFjaW5nLlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5MaXN0ZW5lciNcblx0XHQgKiAgQG5hbWUgZm9yd2FyZFhcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkxpc3RlbmVyLnByb3RvdHlwZSwgJ2ZvcndhcmRYJywge1xuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBvcykge1xuXHQgICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvblswXSA9IHBvcztcblx0ICAgICAgICAgICAgdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLCB0aGlzLl9vcmllbnRhdGlvbik7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzBdO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIGxpc3RlbmVycyBmcm9udCBkaXJlY3Rpb24uIGkuZS5cblx0XHQgKiAgd2hpY2ggd2F5IHRoZXkgYXJlIGZhY2luZy5cblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTGlzdGVuZXIjXG5cdFx0ICogIEBuYW1lIGZvcndhcmRZXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5MaXN0ZW5lci5wcm90b3R5cGUsICdmb3J3YXJkWScsIHtcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwb3MpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb25bMV0gPSBwb3M7XG5cdCAgICAgICAgICAgIHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcywgdGhpcy5fb3JpZW50YXRpb24pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvblsxXTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgeiBjb29yZGluYXRlIG9mIHRoZSBsaXN0ZW5lcnMgZnJvbnQgZGlyZWN0aW9uLiBpLmUuXG5cdFx0ICogIHdoaWNoIHdheSB0aGV5IGFyZSBmYWNpbmcuXG5cdFx0ICogIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkxpc3RlbmVyI1xuXHRcdCAqICBAbmFtZSBmb3J3YXJkWlxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTGlzdGVuZXIucHJvdG90eXBlLCAnZm9yd2FyZFonLCB7XG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocG9zKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX29yaWVudGF0aW9uWzJdID0gcG9zO1xuXHQgICAgICAgICAgICB0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsIHRoaXMuX29yaWVudGF0aW9uKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bMl07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgbGlzdGVuZXIncyB1cCBkaXJlY3Rpb24uIGkuZS5cblx0XHQgKiAgdGhlIGRpcmVjdGlvbiB0aGUgbGlzdGVuZXIgaXMgc3RhbmRpbmcgaW4uXG5cdFx0ICogIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkxpc3RlbmVyI1xuXHRcdCAqICBAbmFtZSB1cFhcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkxpc3RlbmVyLnByb3RvdHlwZSwgJ3VwWCcsIHtcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwb3MpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb25bM10gPSBwb3M7XG5cdCAgICAgICAgICAgIHRoaXMuc2V0T3JpZW50YXRpb24uYXBwbHkodGhpcywgdGhpcy5fb3JpZW50YXRpb24pO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvblszXTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBsaXN0ZW5lcidzIHVwIGRpcmVjdGlvbi4gaS5lLlxuXHRcdCAqICB0aGUgZGlyZWN0aW9uIHRoZSBsaXN0ZW5lciBpcyBzdGFuZGluZyBpbi5cblx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTGlzdGVuZXIjXG5cdFx0ICogIEBuYW1lIHVwWVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTGlzdGVuZXIucHJvdG90eXBlLCAndXBZJywge1xuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBvcykge1xuXHQgICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbls0XSA9IHBvcztcblx0ICAgICAgICAgICAgdGhpcy5zZXRPcmllbnRhdGlvbi5hcHBseSh0aGlzLCB0aGlzLl9vcmllbnRhdGlvbik7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uWzRdO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSB6IGNvb3JkaW5hdGUgb2YgdGhlIGxpc3RlbmVyJ3MgdXAgZGlyZWN0aW9uLiBpLmUuXG5cdFx0ICogIHRoZSBkaXJlY3Rpb24gdGhlIGxpc3RlbmVyIGlzIHN0YW5kaW5nIGluLlxuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5MaXN0ZW5lciNcblx0XHQgKiAgQG5hbWUgdXBaXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5MaXN0ZW5lci5wcm90b3R5cGUsICd1cFonLCB7XG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocG9zKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX29yaWVudGF0aW9uWzVdID0gcG9zO1xuXHQgICAgICAgICAgICB0aGlzLnNldE9yaWVudGF0aW9uLmFwcGx5KHRoaXMsIHRoaXMuX29yaWVudGF0aW9uKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb25bNV07XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkxpc3RlbmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkxpc3RlbmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLy9TSU5HTEVUT04gU0VUVVBcblx0ICAgIHZhciBMaXN0ZW5lckNvbnN0cnVjdG9yID0gVG9uZS5MaXN0ZW5lcjtcblx0ICAgIFRvbmUuTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXJDb25zdHJ1Y3RvcigpO1xuXHQgICAgVG9uZS5Db250ZXh0Lm9uKCdpbml0JywgZnVuY3Rpb24gKGNvbnRleHQpIHtcblx0ICAgICAgICBpZiAoY29udGV4dC5MaXN0ZW5lciBpbnN0YW5jZW9mIExpc3RlbmVyQ29uc3RydWN0b3IpIHtcblx0ICAgICAgICAgICAgLy9hIHNpbmdsZSBsaXN0ZW5lciBvYmplY3Rcblx0ICAgICAgICAgICAgVG9uZS5MaXN0ZW5lciA9IGNvbnRleHQuTGlzdGVuZXI7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgLy9tYWtlIG5ldyBMaXN0ZW5lciBpbnNpZGVzXG5cdCAgICAgICAgICAgIFRvbmUuTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXJDb25zdHJ1Y3RvcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb250ZXh0Lkxpc3RlbmVyID0gVG9uZS5MaXN0ZW5lcjtcblx0ICAgIH0pO1xuXHQgICAgLy9FTkQgU0lOR0xFVE9OIFNFVFVQXG5cdCAgICByZXR1cm4gVG9uZS5MaXN0ZW5lcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogQmVjYXVzZSBvZiBhIGJ1ZyBpbiBpT1MgY2F1c2luZyB0aGUgY3VycmVudFRpbWUgdG8gaW5jcmVtZW50XG5cdFx0ICogYmVmb3JlIHRoZSByZW5kZXJpbmcgaXMgc3RhcnRlZCwgc29tZXRpbWVzIGl0IHRha2VzIG11bHRpcGxlXG5cdFx0ICogYXR0ZW1wdHMgdG8gcmVuZGVyIHRoZSBhdWRpbyBjb3JyZWN0bHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIGZ1bmN0aW9uIGF0dGVtcHRSZW5kZXIoY2FsbGJhY2ssIGR1cmF0aW9uLCBzYW1wbGVSYXRlLCB0cmllcykge1xuXHQgICAgICAgIHRyaWVzID0gVG9uZS5kZWZhdWx0QXJnKHRyaWVzLCAwKTtcblx0ICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBUb25lLk9mZmxpbmVDb250ZXh0KDIsIGR1cmF0aW9uLCBzYW1wbGVSYXRlKTtcblx0ICAgICAgICBUb25lLmNvbnRleHQgPSBjb250ZXh0O1xuXHQgICAgICAgIC8vaW52b2tlIHRoZSBjYWxsYmFjay9zY2hlZHVsaW5nXG5cdCAgICAgICAgdmFyIHJlc3BvbnNlID0gY2FsbGJhY2soVG9uZS5UcmFuc3BvcnQpO1xuXHQgICAgICAgIGlmIChjb250ZXh0LmN1cnJlbnRUaW1lID4gMCAmJiB0cmllcyA8IDEwMDApIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGF0dGVtcHRSZW5kZXIoY2FsbGJhY2ssIGR1cmF0aW9uLCBzYW1wbGVSYXRlLCArK3RyaWVzKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgJ3Jlc3BvbnNlJzogcmVzcG9uc2UsXG5cdCAgICAgICAgICAgICAgICAnY29udGV4dCc6IGNvbnRleHRcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvKipcblx0XHQgKiAgR2VuZXJhdGUgYSBidWZmZXIgYnkgcmVuZGVyaW5nIGFsbCBvZiB0aGUgVG9uZS5qcyBjb2RlIHdpdGhpbiB0aGUgY2FsbGJhY2sgdXNpbmcgdGhlIE9mZmxpbmVBdWRpb0NvbnRleHQuXG5cdFx0ICogIFRoZSBPZmZsaW5lQXVkaW9Db250ZXh0IGlzIGNhcGFibGUgb2YgcmVuZGVyaW5nIG11Y2ggZmFzdGVyIHRoYW4gcmVhbCB0aW1lIGluIG1hbnkgY2FzZXMuXG5cdFx0ICogIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhbHNvIHBhc3NlcyBpbiBhbiBvZmZsaW5lIGluc3RhbmNlIG9mIFRvbmUuVHJhbnNwb3J0IHdoaWNoIGNhbiBiZSB1c2VkXG5cdFx0ICogIHRvIHNjaGVkdWxlIGV2ZW50cyBhbG9uZyB0aGUgVHJhbnNwb3J0LiAqKk5PVEUqKiBPZmZsaW5lQXVkaW9Db250ZXh0IGhhcyB0aGUgc2FtZSByZXN0cmljdGlvbnNcblx0XHQgKiAgYXMgdGhlIEF1ZGlvQ29udGV4dCBpbiB0aGF0IG9uIGNlcnRhaW4gcGxhdGZvcm1zIChsaWtlIGlPUykgaXQgbXVzdCBiZSBpbnZva2VkIGJ5IGFuIGV4cGxpY2l0XG5cdFx0ICogIHVzZXIgYWN0aW9uIGxpa2UgYSBjbGljayBvciB0YXAuIFxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbn0gIGNhbGxiYWNrICBBbGwgVG9uZS5qcyBub2RlcyB3aGljaCBhcmUgY3JlYXRlZCBhbmQgc2NoZWR1bGVkIHdpdGhpbiB0aGlzIGNhbGxiYWNrIGFyZSByZWNvcmRlZCBpbnRvIHRoZSBvdXRwdXQgQnVmZmVyLlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSAgZHVyYXRpb24gICAgIHRoZSBhbW91bnQgb2YgdGltZSB0byByZWNvcmQgZm9yLlxuXHRcdCAqICBAcmV0dXJuICB7UHJvbWlzZX0gIFRoZSBwcm9taXNlIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgVG9uZS5CdWZmZXIgb2YgdGhlIHJlY29yZGVkIG91dHB1dC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL3JlbmRlciAyIHNlY29uZHMgb2YgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiBUb25lLk9mZmxpbmUoZnVuY3Rpb24oKXtcblx0XHQgKiBcdC8vb25seSBub2RlcyBjcmVhdGVkIGluIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSByZWNvcmRlZFxuXHRcdCAqIFx0dmFyIG9zY2lsbGF0b3IgPSBuZXcgVG9uZS5Pc2NpbGxhdG9yKCkudG9NYXN0ZXIoKS5zdGFydCgwKVxuXHRcdCAqIFx0Ly9zY2hlZHVsZSB0aGVpciBldmVudHNcblx0XHQgKiB9LCAyKS50aGVuKGZ1bmN0aW9uKGJ1ZmZlcil7XG5cdFx0ICogXHQvL2RvIHNvbWV0aGluZyB3aXRoIHRoZSBvdXRwdXQgYnVmZmVyXG5cdFx0ICogfSlcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vY2FuIGFsc28gc2NoZWR1bGUgZXZlbnRzIGFsb25nIHRoZSBUcmFuc3BvcnRcblx0XHQgKiAvL3VzaW5nIHRoZSBwYXNzZWQgaW4gT2ZmbGluZSBUcmFuc3BvcnRcblx0XHQgKiBUb25lLk9mZmxpbmUoZnVuY3Rpb24oVHJhbnNwb3J0KXtcblx0XHQgKiBcdHZhciBvc2MgPSBuZXcgVG9uZS5Pc2NpbGxhdG9yKCkudG9NYXN0ZXIoKVxuXHRcdCAqIFx0VHJhbnNwb3J0LnNjaGVkdWxlKGZ1bmN0aW9uKHRpbWUpe1xuXHRcdCAqIFx0XHRvc2Muc3RhcnQodGltZSkuc3RvcCh0aW1lICsgMC4xKVxuXHRcdCAqIFx0fSwgMSlcblx0XHQgKiBcdFRyYW5zcG9ydC5zdGFydCgwLjIpXG5cdFx0ICogfSwgNCkudGhlbihmdW5jdGlvbihidWZmZXIpe1xuXHRcdCAqIFx0Ly9kbyBzb21ldGhpbmcgd2l0aCB0aGUgb3V0cHV0IGJ1ZmZlclxuXHRcdCAqIH0pXG5cdFx0ICovXG5cdCAgICBUb25lLk9mZmxpbmUgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGR1cmF0aW9uKSB7XG5cdCAgICAgICAgLy9zZXQgdGhlIE9mZmxpbmVBdWRpb0NvbnRleHRcblx0ICAgICAgICB2YXIgc2FtcGxlUmF0ZSA9IFRvbmUuY29udGV4dC5zYW1wbGVSYXRlO1xuXHQgICAgICAgIHZhciBvcmlnaW5hbENvbnRleHQgPSBUb25lLmNvbnRleHQ7XG5cdCAgICAgICAgdmFyIHJlbmRlclJldCA9IGF0dGVtcHRSZW5kZXIoY2FsbGJhY2ssIGR1cmF0aW9uLCBzYW1wbGVSYXRlKTtcblx0ICAgICAgICB2YXIgcmVzcG9uc2UgPSByZW5kZXJSZXQucmVzcG9uc2U7XG5cdCAgICAgICAgdmFyIGNvbnRleHQgPSByZW5kZXJSZXQuY29udGV4dDtcblx0ICAgICAgICB2YXIgcmV0O1xuXHQgICAgICAgIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcblx0ICAgICAgICAgICAgLy93YWl0IGZvciB0aGUgcHJvbWlzZSB0byByZXNvbHZlXG5cdCAgICAgICAgICAgIHJldCA9IHJlc3BvbnNlLnRoZW4oZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgLy90aGVuIHJlbmRlciB0aGUgYXVkaW9cblx0ICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlbmRlcigpO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvL3Byb2Nlc3MgdGhlIGF1ZGlvXG5cdCAgICAgICAgICAgIHJldCA9IGNvbnRleHQucmVuZGVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vcmV0dXJuIHRoZSBvcmlnaW5hbCBBdWRpb0NvbnRleHRcblx0ICAgICAgICBUb25lLmNvbnRleHQgPSBvcmlnaW5hbENvbnRleHQ7XG5cdCAgICAgICAgLy9yZXR1cm4gdGhlIGF1ZGlvXG5cdCAgICAgICAgcmV0dXJuIHJldC50aGVuKGZ1bmN0aW9uIChidWZmZXIpIHtcblx0ICAgICAgICAgICAgLy93cmFwIGl0IGluIGEgVG9uZS5CdWZmZXJcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb25lLkJ1ZmZlcihidWZmZXIpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk9mZmxpbmU7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogXHRAY2xhc3MgIFRvbmUuRWZmZWN0IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBlZmZlY3RzLiBDb25uZWN0IHRoZSBlZmZlY3QgYmV0d2VlblxuXHRcdCAqIFx0ICAgICAgICB0aGUgZWZmZWN0U2VuZCBhbmQgZWZmZWN0UmV0dXJuIEdhaW5Ob2RlcywgdGhlbiBjb250cm9sIHRoZSBhbW91bnQgb2Zcblx0XHQgKiBcdCAgICAgICAgZWZmZWN0IHdoaWNoIGdvZXMgdG8gdGhlIG91dHB1dCB1c2luZyB0aGUgd2V0IGNvbnRyb2wuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKiAgQHBhcmFtIHtOb3JtYWxSYW5nZXxPYmplY3R9IFt3ZXRdIFRoZSBzdGFydGluZyB3ZXQgdmFsdWUuXG5cdFx0ICovXG5cdCAgICBUb25lLkVmZmVjdCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbJ3dldCddLCBUb25lLkVmZmVjdCk7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmNyZWF0ZUluc091dHMoMSwgMSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGRyeXdldCBrbm9iIHRvIGNvbnRyb2wgdGhlIGFtb3VudCBvZiBlZmZlY3Rcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5Dcm9zc0ZhZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2RyeVdldCA9IG5ldyBUb25lLkNyb3NzRmFkZShvcHRpb25zLndldCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHdldCBjb250cm9sIGlzIGhvdyBtdWNoIG9mIHRoZSBlZmZlY3RlZFxuXHRcdFx0ICogIHdpbGwgcGFzcyB0aHJvdWdoIHRvIHRoZSBvdXRwdXQuIDEgPSAxMDAlIGVmZmVjdGVkXG5cdFx0XHQgKiAgc2lnbmFsLCAwID0gMTAwJSBkcnkgc2lnbmFsLlxuXHRcdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLndldCA9IHRoaXMuX2RyeVdldC5mYWRlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIGNvbm5lY3QgdGhlIGVmZmVjdFNlbmQgdG8gdGhlIGlucHV0IG9mIGh0ZSBlZmZlY3Rcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5HYWlufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmQgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgY29ubmVjdCB0aGUgb3V0cHV0IG9mIHRoZSBlZmZlY3QgdG8gdGhlIGVmZmVjdFJldHVyblxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZWZmZWN0UmV0dXJuID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIC8vY29ubmVjdGlvbnNcblx0ICAgICAgICB0aGlzLmlucHV0LmNvbm5lY3QodGhpcy5fZHJ5V2V0LmEpO1xuXHQgICAgICAgIHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLmVmZmVjdFNlbmQpO1xuXHQgICAgICAgIHRoaXMuZWZmZWN0UmV0dXJuLmNvbm5lY3QodGhpcy5fZHJ5V2V0LmIpO1xuXHQgICAgICAgIHRoaXMuX2RyeVdldC5jb25uZWN0KHRoaXMub3V0cHV0KTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbJ3dldCddKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkVmZmVjdCwgVG9uZS5BdWRpb05vZGUpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuRWZmZWN0LmRlZmF1bHRzID0geyAnd2V0JzogMSB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGNoYWlucyB0aGUgZWZmZWN0IGluIGJldHdlZW4gdGhlIGVmZmVjdFNlbmQgYW5kIGVmZmVjdFJldHVyblxuXHRcdCAqICBAcGFyYW0gIHtUb25lfSBlZmZlY3Rcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRWZmZWN0fSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkVmZmVjdC5wcm90b3R5cGUuY29ubmVjdEVmZmVjdCA9IGZ1bmN0aW9uIChlZmZlY3QpIHtcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmQuY2hhaW4oZWZmZWN0LCB0aGlzLmVmZmVjdFJldHVybik7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5FZmZlY3R9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fZHJ5V2V0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9kcnlXZXQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZWZmZWN0U2VuZC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5lZmZlY3RTZW5kID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmVmZmVjdFJldHVybi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5lZmZlY3RSZXR1cm4gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFsnd2V0J10pO1xuXHQgICAgICAgIHRoaXMud2V0ID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5FZmZlY3Q7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLkF1dG9GaWx0ZXIgaXMgYSBUb25lLkZpbHRlciB3aXRoIGEgVG9uZS5MRk8gY29ubmVjdGVkIHRvIHRoZSBmaWx0ZXIgY3V0b2ZmIGZyZXF1ZW5jeS5cblx0XHQgKiAgICAgICAgIFNldHRpbmcgdGhlIExGTyByYXRlIGFuZCBkZXB0aCBhbGxvd3MgZm9yIGNvbnRyb2wgb3ZlciB0aGUgZmlsdGVyIG1vZHVsYXRpb24gcmF0ZSBcblx0XHQgKiAgICAgICAgIGFuZCBkZXB0aC5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuRWZmZWN0fVxuXHRcdCAqICBAcGFyYW0ge1RpbWV8T2JqZWN0fSBbZnJlcXVlbmN5XSBUaGUgcmF0ZSBvZiB0aGUgTEZPLlxuXHRcdCAqICBAcGFyYW0ge0ZyZXF1ZW5jeT19IGJhc2VGcmVxdWVuY3kgVGhlIGxvd2VyIHZhbHVlIG9mIHRoZSBMRk9zIG9zY2lsbGF0aW9uXG5cdCBcdCAqICBAcGFyYW0ge0ZyZXF1ZW5jeT19IG9jdGF2ZXMgVGhlIG51bWJlciBvZiBvY3RhdmVzIGFib3ZlIHRoZSBiYXNlRnJlcXVlbmN5XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9jcmVhdGUgYW4gYXV0b2ZpbHRlciBhbmQgc3RhcnQgaXQncyBMRk9cblx0XHQgKiB2YXIgYXV0b0ZpbHRlciA9IG5ldyBUb25lLkF1dG9GaWx0ZXIoXCI0blwiKS50b01hc3RlcigpLnN0YXJ0KCk7XG5cdFx0ICogLy9yb3V0ZSBhbiBvc2NpbGxhdG9yIHRocm91Z2ggdGhlIGZpbHRlciBhbmQgc3RhcnQgaXRcblx0XHQgKiB2YXIgb3NjaWxsYXRvciA9IG5ldyBUb25lLk9zY2lsbGF0b3IoKS5jb25uZWN0KGF1dG9GaWx0ZXIpLnN0YXJ0KCk7XG5cdFx0ICovXG5cdCAgICBUb25lLkF1dG9GaWx0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2Jhc2VGcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnb2N0YXZlcydcblx0ICAgICAgICBdLCBUb25lLkF1dG9GaWx0ZXIpO1xuXHQgICAgICAgIFRvbmUuRWZmZWN0LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGxmbyB3aGljaCBkcml2ZXMgdGhlIGZpbHRlciBjdXRvZmZcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5MRk99XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xmbyA9IG5ldyBUb25lLkxGTyh7XG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knOiBvcHRpb25zLmZyZXF1ZW5jeSxcblx0ICAgICAgICAgICAgJ2FtcGxpdHVkZSc6IG9wdGlvbnMuZGVwdGhcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSByYW5nZSBvZiB0aGUgZmlsdGVyIG1vZHVsYXRpbmcgYmV0d2VlbiB0aGUgbWluIGFuZCBtYXggZnJlcXVlbmN5LiBcblx0XHRcdCAqIDAgPSBubyBtb2R1bGF0aW9uLiAxID0gZnVsbCBtb2R1bGF0aW9uLlxuXHRcdFx0ICogQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5kZXB0aCA9IHRoaXMuX2xmby5hbXBsaXR1ZGU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBIb3cgZmFzdCB0aGUgZmlsdGVyIG1vZHVsYXRlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4LiBcblx0XHRcdCAqIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0XHQgKiBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IHRoaXMuX2xmby5mcmVxdWVuY3k7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGZpbHRlciBub2RlXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRmlsdGVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5maWx0ZXIgPSBuZXcgVG9uZS5GaWx0ZXIob3B0aW9ucy5maWx0ZXIpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBvY3RhdmVzIHBsYWNlaG9sZGVyXG5cdFx0XHQgKiAgQHR5cGUge1Bvc2l0aXZlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vY3RhdmVzID0gMDtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5jb25uZWN0RWZmZWN0KHRoaXMuZmlsdGVyKTtcblx0ICAgICAgICB0aGlzLl9sZm8uY29ubmVjdCh0aGlzLmZpbHRlci5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGVwdGgnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5vY3RhdmVzID0gb3B0aW9ucy5vY3RhdmVzO1xuXHQgICAgICAgIHRoaXMuYmFzZUZyZXF1ZW5jeSA9IG9wdGlvbnMuYmFzZUZyZXF1ZW5jeTtcblx0ICAgIH07XG5cdCAgICAvL2V4dGVuZCBFZmZlY3Rcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQXV0b0ZpbHRlciwgVG9uZS5FZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIGRlZmF1bHRzXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b0ZpbHRlci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZnJlcXVlbmN5JzogMSxcblx0ICAgICAgICAndHlwZSc6ICdzaW5lJyxcblx0ICAgICAgICAnZGVwdGgnOiAxLFxuXHQgICAgICAgICdiYXNlRnJlcXVlbmN5JzogMjAwLFxuXHQgICAgICAgICdvY3RhdmVzJzogMi42LFxuXHQgICAgICAgICdmaWx0ZXInOiB7XG5cdCAgICAgICAgICAgICd0eXBlJzogJ2xvd3Bhc3MnLFxuXHQgICAgICAgICAgICAncm9sbG9mZic6IC0xMixcblx0ICAgICAgICAgICAgJ1EnOiAxXG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFN0YXJ0IHRoZSBlZmZlY3QuXG5cdFx0ICogQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIFdoZW4gdGhlIExGTyB3aWxsIHN0YXJ0LiBcblx0XHQgKiBAcmV0dXJucyB7VG9uZS5BdXRvRmlsdGVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkF1dG9GaWx0ZXIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLl9sZm8uc3RhcnQodGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3RvcCB0aGUgZWZmZWN0LlxuXHRcdCAqIEBwYXJhbSB7VGltZX0gW3RpbWU9bm93XSBXaGVuIHRoZSBMRk8gd2lsbCBzdG9wLiBcblx0XHQgKiBAcmV0dXJucyB7VG9uZS5BdXRvRmlsdGVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkF1dG9GaWx0ZXIucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRoaXMuX2xmby5zdG9wKHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFN5bmMgdGhlIGZpbHRlciB0byB0aGUgdHJhbnNwb3J0LlxuXHRcdCAqIEBwYXJhbSB7VGltZX0gW2RlbGF5PTBdIERlbGF5IHRpbWUgYmVmb3JlIHN0YXJ0aW5nIHRoZSBlZmZlY3QgYWZ0ZXIgdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0IGhhcyBzdGFydGVkLiBcblx0XHQgKiBAcmV0dXJucyB7VG9uZS5BdXRvRmlsdGVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkF1dG9GaWx0ZXIucHJvdG90eXBlLnN5bmMgPSBmdW5jdGlvbiAoZGVsYXkpIHtcblx0ICAgICAgICB0aGlzLl9sZm8uc3luYyhkZWxheSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVW5zeW5jIHRoZSBmaWx0ZXIgZnJvbSB0aGUgdHJhbnNwb3J0LlxuXHRcdCAqIEByZXR1cm5zIHtUb25lLkF1dG9GaWx0ZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b0ZpbHRlci5wcm90b3R5cGUudW5zeW5jID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX2xmby51bnN5bmMoKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUeXBlIG9mIG9zY2lsbGF0b3IgYXR0YWNoZWQgdG8gdGhlIEF1dG9GaWx0ZXIuIFxuXHRcdCAqIFBvc3NpYmxlIHZhbHVlczogXCJzaW5lXCIsIFwic3F1YXJlXCIsIFwidHJpYW5nbGVcIiwgXCJzYXd0b290aFwiLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkF1dG9GaWx0ZXIjXG5cdFx0ICogQHR5cGUge3N0cmluZ31cblx0XHQgKiBAbmFtZSB0eXBlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5BdXRvRmlsdGVyLnByb3RvdHlwZSwgJ3R5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9sZm8udHlwZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHR5cGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIGZpbHRlcidzIGN1dG9mZiBmcmVxdWVuY3kuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQXV0b0ZpbHRlciNcblx0XHQgKiBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdCAqIEBuYW1lIG1pblxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQXV0b0ZpbHRlci5wcm90b3R5cGUsICdiYXNlRnJlcXVlbmN5Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGZvLm1pbjtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGZyZXEpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvLm1pbiA9IHRoaXMudG9GcmVxdWVuY3koZnJlcSk7XG5cdCAgICAgICAgICAgIC8vYW5kIHNldCB0aGUgbWF4XG5cdCAgICAgICAgICAgIHRoaXMub2N0YXZlcyA9IHRoaXMuX29jdGF2ZXM7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgZmlsdGVyJ3MgY3V0b2ZmIGZyZXF1ZW5jeS4gXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQXV0b0ZpbHRlciNcblx0XHQgKiBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0ICogQG5hbWUgb2N0YXZlc1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQXV0b0ZpbHRlci5wcm90b3R5cGUsICdvY3RhdmVzJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb2N0YXZlcztcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG9jdCkge1xuXHQgICAgICAgICAgICB0aGlzLl9vY3RhdmVzID0gb2N0O1xuXHQgICAgICAgICAgICB0aGlzLl9sZm8ubWF4ID0gdGhpcy5iYXNlRnJlcXVlbmN5ICogTWF0aC5wb3coMiwgb2N0KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC4gXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkF1dG9GaWx0ZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b0ZpbHRlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkVmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2xmby5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbGZvID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmZpbHRlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5maWx0ZXIgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdkZXB0aCdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5kZXB0aCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQXV0b0ZpbHRlcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuQXV0b1Bhbm5lciBpcyBhIFRvbmUuUGFubmVyIHdpdGggYW4gTEZPIGNvbm5lY3RlZCB0byB0aGUgcGFuIGFtb3VudC4gXG5cdFx0ICogICAgICAgICBNb3JlIG9uIHVzaW5nIGF1dG9wYW5uZXJzIFtoZXJlXShodHRwczovL3d3dy5hYmxldG9uLmNvbS9lbi9ibG9nL2F1dG9wYW4tY2hvcHBlci1lZmZlY3QtYW5kLW1vcmUtbGl2ZXNjaG9vbC8pLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5FZmZlY3R9XG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fE9iamVjdH0gW2ZyZXF1ZW5jeV0gUmF0ZSBvZiBsZWZ0LXJpZ2h0IG9zY2lsbGF0aW9uLiBcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2NyZWF0ZSBhbiBhdXRvcGFubmVyIGFuZCBzdGFydCBpdCdzIExGT1xuXHRcdCAqIHZhciBhdXRvUGFubmVyID0gbmV3IFRvbmUuQXV0b1Bhbm5lcihcIjRuXCIpLnRvTWFzdGVyKCkuc3RhcnQoKTtcblx0XHQgKiAvL3JvdXRlIGFuIG9zY2lsbGF0b3IgdGhyb3VnaCB0aGUgcGFubmVyIGFuZCBzdGFydCBpdFxuXHRcdCAqIHZhciBvc2NpbGxhdG9yID0gbmV3IFRvbmUuT3NjaWxsYXRvcigpLmNvbm5lY3QoYXV0b1Bhbm5lcikuc3RhcnQoKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b1Bhbm5lciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbJ2ZyZXF1ZW5jeSddLCBUb25lLkF1dG9QYW5uZXIpO1xuXHQgICAgICAgIFRvbmUuRWZmZWN0LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGxmbyB3aGljaCBkcml2ZXMgdGhlIHBhbm5pbmdcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5MRk99XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xmbyA9IG5ldyBUb25lLkxGTyh7XG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knOiBvcHRpb25zLmZyZXF1ZW5jeSxcblx0ICAgICAgICAgICAgJ2FtcGxpdHVkZSc6IG9wdGlvbnMuZGVwdGgsXG5cdCAgICAgICAgICAgICdtaW4nOiAtMSxcblx0ICAgICAgICAgICAgJ21heCc6IDFcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBhbW91bnQgb2YgcGFubmluZyBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0LiBcblx0XHRcdCAqIDAgPSBhbHdheXMgY2VudGVyLiAxID0gZnVsbCByYW5nZSBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0LiBcblx0XHRcdCAqIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHRcdCAqIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGVwdGggPSB0aGlzLl9sZm8uYW1wbGl0dWRlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBwYW5uZXIgbm9kZSB3aGljaCBkb2VzIHRoZSBwYW5uaW5nXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuUGFubmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9wYW5uZXIgPSBuZXcgVG9uZS5QYW5uZXIoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIEhvdyBmYXN0IHRoZSBwYW5uZXIgbW9kdWxhdGVzIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQuIFxuXHRcdFx0ICogQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gdGhpcy5fbGZvLmZyZXF1ZW5jeTtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5jb25uZWN0RWZmZWN0KHRoaXMuX3Bhbm5lcik7XG5cdCAgICAgICAgdGhpcy5fbGZvLmNvbm5lY3QodGhpcy5fcGFubmVyLnBhbik7XG5cdCAgICAgICAgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFtcblx0ICAgICAgICAgICAgJ2RlcHRoJyxcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeSdcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICAvL2V4dGVuZCBFZmZlY3Rcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuQXV0b1Bhbm5lciwgVG9uZS5FZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIGRlZmF1bHRzXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b1Bhbm5lci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZnJlcXVlbmN5JzogMSxcblx0ICAgICAgICAndHlwZSc6ICdzaW5lJyxcblx0ICAgICAgICAnZGVwdGgnOiAxXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3RhcnQgdGhlIGVmZmVjdC5cblx0XHQgKiBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gV2hlbiB0aGUgTEZPIHdpbGwgc3RhcnQuIFxuXHRcdCAqIEByZXR1cm5zIHtUb25lLkF1dG9QYW5uZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b1Bhbm5lci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRoaXMuX2xmby5zdGFydCh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBTdG9wIHRoZSBlZmZlY3QuXG5cdFx0ICogQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIFdoZW4gdGhlIExGTyB3aWxsIHN0b3AuIFxuXHRcdCAqIEByZXR1cm5zIHtUb25lLkF1dG9QYW5uZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b1Bhbm5lci5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fbGZvLnN0b3AodGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3luYyB0aGUgcGFubmVyIHRvIHRoZSB0cmFuc3BvcnQuXG5cdFx0ICogQHBhcmFtIHtUaW1lfSBbZGVsYXk9MF0gRGVsYXkgdGltZSBiZWZvcmUgc3RhcnRpbmcgdGhlIGVmZmVjdCBhZnRlciB0aGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgaGFzIHN0YXJ0ZWQuIFxuXHRcdCAqIEByZXR1cm5zIHtUb25lLkF1dG9QYW5uZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b1Bhbm5lci5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uIChkZWxheSkge1xuXHQgICAgICAgIHRoaXMuX2xmby5zeW5jKGRlbGF5KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBVbnN5bmMgdGhlIHBhbm5lciBmcm9tIHRoZSB0cmFuc3BvcnRcblx0XHQgKiBAcmV0dXJucyB7VG9uZS5BdXRvUGFubmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkF1dG9QYW5uZXIucHJvdG90eXBlLnVuc3luYyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLl9sZm8udW5zeW5jKCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVHlwZSBvZiBvc2NpbGxhdG9yIGF0dGFjaGVkIHRvIHRoZSBBdXRvRmlsdGVyLiBcblx0XHQgKiBQb3NzaWJsZSB2YWx1ZXM6IFwic2luZVwiLCBcInNxdWFyZVwiLCBcInRyaWFuZ2xlXCIsIFwic2F3dG9vdGhcIi5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5BdXRvRmlsdGVyI1xuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICogQG5hbWUgdHlwZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQXV0b1Bhbm5lci5wcm90b3R5cGUsICd0eXBlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGZvLnR5cGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0eXBlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2xmby50eXBlID0gdHlwZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5BdXRvUGFubmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkF1dG9QYW5uZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9sZm8uZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2xmbyA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fcGFubmVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9wYW5uZXIgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ2RlcHRoJyxcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5kZXB0aCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQXV0b1Bhbm5lcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLkF1dG9XYWggY29ubmVjdHMgYSBUb25lLkZvbGxvd2VyIHRvIGEgYmFuZHBhc3MgZmlsdGVyIChUb25lLkZpbHRlcikuXG5cdFx0ICogICAgICAgICAgVGhlIGZyZXF1ZW5jeSBvZiB0aGUgZmlsdGVyIGlzIGFkanVzdGVkIHByb3BvcnRpb25hbGx5IHRvIHRoZVxuXHRcdCAqICAgICAgICAgIGluY29taW5nIHNpZ25hbCdzIGFtcGxpdHVkZS4gSW5zcGlyYXRpb24gZnJvbSBbVHVuYS5qc10oaHR0cHM6Ly9naXRodWIuY29tL0RpbmFobW9lL3R1bmEpLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5FZmZlY3R9XG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fE9iamVjdH0gW2Jhc2VGcmVxdWVuY3ldIFRoZSBmcmVxdWVuY3kgdGhlIGZpbHRlciBpcyBzZXRcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYXQgdGhlIGxvdyBwb2ludCBvZiB0aGUgd2FoXG5cdFx0ICogIEBwYXJhbSB7UG9zaXRpdmV9IFtvY3RhdmVzXSBUaGUgbnVtYmVyIG9mIG9jdGF2ZXMgYWJvdmUgdGhlIGJhc2VGcmVxdWVuY3lcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbHRlciB3aWxsIHN3ZWVwIHRvIHdoZW4gZnVsbHkgb3BlblxuXHRcdCAqICBAcGFyYW0ge0RlY2liZWxzfSBbc2Vuc2l0aXZpdHldIFRoZSBkZWNpYmVsIHRocmVzaG9sZCBzZW5zaXRpdml0eSBmb3Jcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluY29taW5nIHNpZ25hbC4gTm9ybWFsIHJhbmdlIG9mIC00MCB0byAwLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBhdXRvV2FoID0gbmV3IFRvbmUuQXV0b1dhaCg1MCwgNiwgLTMwKS50b01hc3RlcigpO1xuXHRcdCAqIC8vaW5pdGlhbGl6ZSB0aGUgc3ludGggYW5kIGNvbm5lY3QgdG8gYXV0b3dhaFxuXHRcdCAqIHZhciBzeW50aCA9IG5ldyBTeW50aC5jb25uZWN0KGF1dG9XYWgpO1xuXHRcdCAqIC8vUSB2YWx1ZSBpbmZsdWVuY2VzIHRoZSBlZmZlY3Qgb2YgdGhlIHdhaCAtIGRlZmF1bHQgaXMgMlxuXHRcdCAqIGF1dG9XYWguUS52YWx1ZSA9IDY7XG5cdFx0ICogLy9tb3JlIGF1ZGlibGUgb24gaGlnaGVyIG5vdGVzXG5cdFx0ICogc3ludGgudHJpZ2dlckF0dGFja1JlbGVhc2UoXCJDNFwiLCBcIjhuXCIpXG5cdFx0ICovXG5cdCAgICBUb25lLkF1dG9XYWggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnYmFzZUZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdvY3RhdmVzJyxcblx0ICAgICAgICAgICAgJ3NlbnNpdGl2aXR5J1xuXHQgICAgICAgIF0sIFRvbmUuQXV0b1dhaCk7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZW52ZWxvcGUgZm9sbG93ZXIuIFNldCB0aGUgYXR0YWNrL3JlbGVhc2Vcblx0XHRcdCAqICB0aW1pbmcgdG8gYWRqdXN0IGhvdyB0aGUgZW52ZWxvcGUgaXMgZm9sbG93ZWQuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRm9sbG93ZXJ9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZm9sbG93ZXIgPSBuZXcgVG9uZS5Gb2xsb3dlcihvcHRpb25zLmZvbGxvd2VyKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBzY2FsZXMgdGhlIGZvbGxvd2VyIHZhbHVlIHRvIHRoZSBmcmVxdWVuY3kgZG9tYWluXG5cdFx0XHQgKiAgQHR5cGUge1RvbmV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N3ZWVwUmFuZ2UgPSBuZXcgVG9uZS5TY2FsZUV4cCgwLCAxLCAwLjUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEB0eXBlIHtudW1iZXJ9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2Jhc2VGcmVxdWVuY3kgPSBvcHRpb25zLmJhc2VGcmVxdWVuY3k7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fb2N0YXZlcyA9IG9wdGlvbnMub2N0YXZlcztcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgaW5wdXQgZ2FpbiB0byBhZGp1c3QgdGhlIHNlbnNpdGl2aXR5XG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5faW5wdXRCb29zdCA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBAdHlwZSB7QmlxdWFkRmlsdGVyTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYmFuZHBhc3MgPSBuZXcgVG9uZS5GaWx0ZXIoe1xuXHQgICAgICAgICAgICAncm9sbG9mZic6IC00OCxcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeSc6IDAsXG5cdCAgICAgICAgICAgICdRJzogb3B0aW9ucy5RXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRmlsdGVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9wZWFraW5nID0gbmV3IFRvbmUuRmlsdGVyKDAsICdwZWFraW5nJyk7XG5cdCAgICAgICAgdGhpcy5fcGVha2luZy5nYWluLnZhbHVlID0gb3B0aW9ucy5nYWluO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIGdhaW4gb2YgdGhlIGZpbHRlci5cblx0XHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0XHQgKiBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmdhaW4gPSB0aGlzLl9wZWFraW5nLmdhaW47XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgcXVhbGl0eSBvZiB0aGUgZmlsdGVyLlxuXHRcdFx0ICogQHR5cGUge1Bvc2l0aXZlfVxuXHRcdFx0ICogQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5RID0gdGhpcy5fYmFuZHBhc3MuUTtcblx0ICAgICAgICAvL3RoZSBjb250cm9sIHNpZ25hbCBwYXRoXG5cdCAgICAgICAgdGhpcy5lZmZlY3RTZW5kLmNoYWluKHRoaXMuX2lucHV0Qm9vc3QsIHRoaXMuZm9sbG93ZXIsIHRoaXMuX3N3ZWVwUmFuZ2UpO1xuXHQgICAgICAgIHRoaXMuX3N3ZWVwUmFuZ2UuY29ubmVjdCh0aGlzLl9iYW5kcGFzcy5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMuX3N3ZWVwUmFuZ2UuY29ubmVjdCh0aGlzLl9wZWFraW5nLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLy90aGUgZmlsdGVyZWQgcGF0aFxuXHQgICAgICAgIHRoaXMuZWZmZWN0U2VuZC5jaGFpbih0aGlzLl9iYW5kcGFzcywgdGhpcy5fcGVha2luZywgdGhpcy5lZmZlY3RSZXR1cm4pO1xuXHQgICAgICAgIC8vc2V0IHRoZSBpbml0aWFsIHZhbHVlXG5cdCAgICAgICAgdGhpcy5fc2V0U3dlZXBSYW5nZSgpO1xuXHQgICAgICAgIHRoaXMuc2Vuc2l0aXZpdHkgPSBvcHRpb25zLnNlbnNpdGl2aXR5O1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFtcblx0ICAgICAgICAgICAgJ2dhaW4nLFxuXHQgICAgICAgICAgICAnUSdcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkF1dG9XYWgsIFRvbmUuRWZmZWN0KTtcblx0ICAgIC8qKlxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkF1dG9XYWguZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2Jhc2VGcmVxdWVuY3knOiAxMDAsXG5cdCAgICAgICAgJ29jdGF2ZXMnOiA2LFxuXHQgICAgICAgICdzZW5zaXRpdml0eSc6IDAsXG5cdCAgICAgICAgJ1EnOiAyLFxuXHQgICAgICAgICdnYWluJzogMixcblx0ICAgICAgICAnZm9sbG93ZXInOiB7XG5cdCAgICAgICAgICAgICdhdHRhY2snOiAwLjMsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJzogMC41XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBudW1iZXIgb2Ygb2N0YXZlcyB0aGF0IHRoZSBmaWx0ZXIgd2lsbCBzd2VlcCBhYm92ZSB0aGVcblx0XHQgKiBiYXNlRnJlcXVlbmN5LlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkF1dG9XYWgjXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKiBAbmFtZSBvY3RhdmVzXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5BdXRvV2FoLnByb3RvdHlwZSwgJ29jdGF2ZXMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vY3RhdmVzO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAob2N0YXZlcykge1xuXHQgICAgICAgICAgICB0aGlzLl9vY3RhdmVzID0gb2N0YXZlcztcblx0ICAgICAgICAgICAgdGhpcy5fc2V0U3dlZXBSYW5nZSgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGJhc2UgZnJlcXVlbmN5IGZyb20gd2hpY2ggdGhlIHN3ZWVwIHdpbGwgc3RhcnQgZnJvbS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5BdXRvV2FoI1xuXHRcdCAqIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0ICogQG5hbWUgYmFzZUZyZXF1ZW5jeVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQXV0b1dhaC5wcm90b3R5cGUsICdiYXNlRnJlcXVlbmN5Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZUZyZXF1ZW5jeTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGJhc2VGcmVxKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2Jhc2VGcmVxdWVuY3kgPSBiYXNlRnJlcTtcblx0ICAgICAgICAgICAgdGhpcy5fc2V0U3dlZXBSYW5nZSgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHNlbnNpdGl2aXR5IHRvIGNvbnRyb2wgaG93IHJlc3BvbnNpdmUgdG8gdGhlIGlucHV0IHNpZ25hbCB0aGUgZmlsdGVyIGlzLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkF1dG9XYWgjXG5cdFx0ICogQHR5cGUge0RlY2liZWxzfVxuXHRcdCAqIEBuYW1lIHNlbnNpdGl2aXR5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5BdXRvV2FoLnByb3RvdHlwZSwgJ3NlbnNpdGl2aXR5Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gVG9uZS5nYWluVG9EYigxIC8gdGhpcy5faW5wdXRCb29zdC5nYWluLnZhbHVlKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHNlbnNpdGl2eSkge1xuXHQgICAgICAgICAgICB0aGlzLl9pbnB1dEJvb3N0LmdhaW4udmFsdWUgPSAxIC8gVG9uZS5kYlRvR2FpbihzZW5zaXRpdnkpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIHNldHMgdGhlIHN3ZWVwIHJhbmdlIG9mIHRoZSBzY2FsZXJcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuQXV0b1dhaC5wcm90b3R5cGUuX3NldFN3ZWVwUmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5fc3dlZXBSYW5nZS5taW4gPSB0aGlzLl9iYXNlRnJlcXVlbmN5O1xuXHQgICAgICAgIHRoaXMuX3N3ZWVwUmFuZ2UubWF4ID0gTWF0aC5taW4odGhpcy5fYmFzZUZyZXF1ZW5jeSAqIE1hdGgucG93KDIsIHRoaXMuX29jdGF2ZXMpLCB0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZSAvIDIpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuQXV0b1dhaH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5BdXRvV2FoLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5mb2xsb3dlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5mb2xsb3dlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fc3dlZXBSYW5nZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc3dlZXBSYW5nZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fYmFuZHBhc3MuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2JhbmRwYXNzID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9wZWFraW5nLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9wZWFraW5nID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9pbnB1dEJvb3N0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9pbnB1dEJvb3N0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdnYWluJyxcblx0ICAgICAgICAgICAgJ1EnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5nYWluID0gbnVsbDtcblx0ICAgICAgICB0aGlzLlEgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkF1dG9XYWg7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBTaWduYWwtcmF0ZSBtb2R1bG8gb3BlcmF0b3IuIE9ubHkgd29ya3MgaW4gQXVkaW9SYW5nZSBbLTEsIDFdIGFuZCBmb3IgbW9kdWx1c1xuXHRcdCAqICAgICAgICAgdmFsdWVzIGluIHRoZSBOb3JtYWxSYW5nZS5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuU2lnbmFsQmFzZX1cblx0XHQgKiAgQHBhcmFtIHtOb3JtYWxSYW5nZX0gbW9kdWx1cyBUaGUgbW9kdWx1cyB0byBhcHBseS5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgbW9kID0gbmV3IFRvbmUuTW9kdWxvKDAuMilcblx0XHQgKiB2YXIgc2lnID0gbmV3IFRvbmUuU2lnbmFsKDAuNSkuY29ubmVjdChtb2QpO1xuXHRcdCAqIC8vbW9kIG91dHB1dHMgMC4xXG5cdFx0ICovXG5cdCAgICBUb25lLk1vZHVsbyA9IGZ1bmN0aW9uIChtb2R1bHVzKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5jcmVhdGVJbnNPdXRzKDEsIDApO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEEgd2F2ZXNoYXBlciBnZXRzIHRoZSBpbnRlZ2VyIG11bHRpcGxlIG9mXG5cdFx0XHQgKiAgdGhlIGlucHV0IHNpZ25hbCBhbmQgdGhlIG1vZHVsdXMuXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5XYXZlU2hhcGVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc2hhcGVyID0gbmV3IFRvbmUuV2F2ZVNoYXBlcihNYXRoLnBvdygyLCAxNikpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBpbnRlZ2VyIG11bHRpcGxlIGlzIG11bHRpcGxpZWQgYnkgdGhlIG1vZHVsdXNcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuTXVsdGlwbHl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX211bHRpcGx5ID0gbmV3IFRvbmUuTXVsdGlwbHkoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBhbmQgc3VidHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBzaWduYWxcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuU3VidHJhY3R9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N1YnRyYWN0ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5TdWJ0cmFjdCgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBtb2R1bHVzIHNpZ25hbFxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5TaWduYWx9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX21vZFNpZ25hbCA9IG5ldyBUb25lLlNpZ25hbChtb2R1bHVzKTtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5pbnB1dC5mYW4odGhpcy5fc2hhcGVyLCB0aGlzLl9zdWJ0cmFjdCk7XG5cdCAgICAgICAgdGhpcy5fbW9kU2lnbmFsLmNvbm5lY3QodGhpcy5fbXVsdGlwbHksIDAsIDApO1xuXHQgICAgICAgIHRoaXMuX3NoYXBlci5jb25uZWN0KHRoaXMuX211bHRpcGx5LCAwLCAxKTtcblx0ICAgICAgICB0aGlzLl9tdWx0aXBseS5jb25uZWN0KHRoaXMuX3N1YnRyYWN0LCAwLCAxKTtcblx0ICAgICAgICB0aGlzLl9zZXRXYXZlU2hhcGVyKG1vZHVsdXMpO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuTW9kdWxvLCBUb25lLlNpZ25hbEJhc2UpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBwYXJhbSAge251bWJlcn0gIG1vZCAgdGhlIG1vZHVsdXMgdG8gYXBwbHlcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuTW9kdWxvLnByb3RvdHlwZS5fc2V0V2F2ZVNoYXBlciA9IGZ1bmN0aW9uIChtb2QpIHtcblx0ICAgICAgICB0aGlzLl9zaGFwZXIuc2V0TWFwKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICAgICAgdmFyIG11bHRpcGxlID0gTWF0aC5mbG9vcigodmFsICsgMC4wMDAxKSAvIG1vZCk7XG5cdCAgICAgICAgICAgIHJldHVybiBtdWx0aXBsZTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUaGUgbW9kdWx1cyB2YWx1ZS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5Nb2R1bG8jXG5cdFx0ICogQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdCAqIEBuYW1lIHZhbHVlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Nb2R1bG8ucHJvdG90eXBlLCAndmFsdWUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb2RTaWduYWwudmFsdWU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtb2QpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbW9kU2lnbmFsLnZhbHVlID0gbW9kO1xuXHQgICAgICAgICAgICB0aGlzLl9zZXRXYXZlU2hhcGVyKG1vZCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Nb2R1bG99IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTW9kdWxvLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsQmFzZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3NoYXBlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc2hhcGVyID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9tdWx0aXBseS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbXVsdGlwbHkgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3N1YnRyYWN0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9zdWJ0cmFjdCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbW9kU2lnbmFsLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9tb2RTaWduYWwgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk1vZHVsbztcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuQml0Y3J1c2hlciBkb3duc2FtcGxlcyB0aGUgaW5jb21pbmcgc2lnbmFsIHRvIGEgZGlmZmVyZW50IGJpdGRlcHRoLlxuXHRcdCAqICAgICAgICAgTG93ZXJpbmcgdGhlIGJpdGRlcHRoIG9mIHRoZSBzaWduYWwgY3JlYXRlcyBkaXN0b3J0aW9uLiBSZWFkIG1vcmUgYWJvdXQgQml0Y3J1c2hpbmdcblx0XHQgKiAgICAgICAgIG9uIFtXaWtpcGVkaWFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpdGNydXNoZXIpLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5FZmZlY3R9XG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBiaXRzIFRoZSBudW1iZXIgb2YgYml0cyB0byBkb3duc2FtcGxlIHRoZSBzaWduYWwuIE5vbWluYWwgcmFuZ2Vcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgb2YgMSB0byA4LlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vaW5pdGlhbGl6ZSBjcnVzaGVyIGFuZCByb3V0ZSBhIHN5bnRoIHRocm91Z2ggaXRcblx0XHQgKiB2YXIgY3J1c2hlciA9IG5ldyBUb25lLkJpdENydXNoZXIoNCkudG9NYXN0ZXIoKTtcblx0XHQgKiB2YXIgc3ludGggPSBuZXcgVG9uZS5Nb25vU3ludGgoKS5jb25uZWN0KGNydXNoZXIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5CaXRDcnVzaGVyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFsnYml0cyddLCBUb25lLkJpdENydXNoZXIpO1xuXHQgICAgICAgIFRvbmUuRWZmZWN0LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgdmFyIGludlN0ZXBTaXplID0gMSAvIE1hdGgucG93KDIsIG9wdGlvbnMuYml0cyAtIDEpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFN1YnRyYWN0IHRoZSBpbnB1dCBzaWduYWwgYW5kIHRoZSBtb2R1bHVzIG9mIHRoZSBpbnB1dCBzaWduYWxcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5TdWJ0cmFjdH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc3VidHJhY3QgPSBuZXcgVG9uZS5TdWJ0cmFjdCgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtb2QgZnVuY3Rpb25cblx0XHRcdCAqICBAdHlwZSAge1RvbmUuTW9kdWxvfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tb2R1bG8gPSBuZXcgVG9uZS5Nb2R1bG8oaW52U3RlcFNpemUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIGtlZXBzIHRyYWNrIG9mIHRoZSBiaXRzXG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYml0cyA9IG9wdGlvbnMuYml0cztcblx0ICAgICAgICAvL2Nvbm5lY3QgaXQgdXBcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmQuZmFuKHRoaXMuX3N1YnRyYWN0LCB0aGlzLl9tb2R1bG8pO1xuXHQgICAgICAgIHRoaXMuX21vZHVsby5jb25uZWN0KHRoaXMuX3N1YnRyYWN0LCAwLCAxKTtcblx0ICAgICAgICB0aGlzLl9zdWJ0cmFjdC5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkJpdENydXNoZXIsIFRvbmUuRWZmZWN0KTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdCB2YWx1ZXNcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5CaXRDcnVzaGVyLmRlZmF1bHRzID0geyAnYml0cyc6IDQgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBiaXQgZGVwdGggb2YgdGhlIGVmZmVjdC4gTm9taW5hbCByYW5nZSBvZiAxLTguXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQml0Q3J1c2hlciNcblx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdCAqIEBuYW1lIGJpdHNcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkJpdENydXNoZXIucHJvdG90eXBlLCAnYml0cycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JpdHM7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChiaXRzKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2JpdHMgPSBiaXRzO1xuXHQgICAgICAgICAgICB2YXIgaW52U3RlcFNpemUgPSAxIC8gTWF0aC5wb3coMiwgYml0cyAtIDEpO1xuXHQgICAgICAgICAgICB0aGlzLl9tb2R1bG8udmFsdWUgPSBpbnZTdGVwU2l6ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuQml0Q3J1c2hlcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5CaXRDcnVzaGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc3VidHJhY3QuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3N1YnRyYWN0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9tb2R1bG8uZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21vZHVsbyA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQml0Q3J1c2hlcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuQ2hlYnlTaGV2IGlzIGEgQ2hlYnlzaGV2IHdhdmVzaGFwZXIsIGFuIGVmZmVjdCB3aGljaCBpcyBnb29kIFxuXHRcdCAqICAgICAgICAgZm9yIG1ha2luZyBkaWZmZXJlbnQgdHlwZXMgb2YgZGlzdG9ydGlvbiBzb3VuZHMuXG5cdFx0ICogICAgICAgICBOb3RlIHRoYXQgb2RkIG9yZGVycyBzb3VuZCB2ZXJ5IGRpZmZlcmVudCBmcm9tIGV2ZW4gb25lcywgXG5cdFx0ICogICAgICAgICBhbmQgb3JkZXIgPSAxIGlzIG5vIGNoYW5nZS4gXG5cdFx0ICogICAgICAgICBSZWFkIG1vcmUgYXQgW211c2ljLmNvbHVtYmlhLmVkdV0oaHR0cDovL211c2ljLmNvbHVtYmlhLmVkdS9jbWMvbXVzaWNhbmRjb21wdXRlcnMvY2hhcHRlcjQvMDRfMDYucGhwKS5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5FZmZlY3R9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge1Bvc2l0aXZlfE9iamVjdH0gW29yZGVyXSBUaGUgb3JkZXIgb2YgdGhlIGNoZWJ5c2hldiBwb2x5bm9taWFsLiBOb3JtYWwgcmFuZ2UgYmV0d2VlbiAxLTEwMC4gXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9jcmVhdGUgYSBuZXcgY2hlYnlcblx0XHQgKiB2YXIgY2hlYnkgPSBuZXcgVG9uZS5DaGVieXNoZXYoNTApO1xuXHRcdCAqIC8vY3JlYXRlIGEgbW9ub3N5bnRoIGNvbm5lY3RlZCB0byBvdXIgY2hlYnlcblx0XHQgKiBzeW50aCA9IG5ldyBUb25lLk1vbm9TeW50aCgpLmNvbm5lY3QoY2hlYnkpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5DaGVieXNoZXYgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydvcmRlciddLCBUb25lLkNoZWJ5c2hldik7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBAdHlwZSB7V2F2ZVNoYXBlck5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NoYXBlciA9IG5ldyBUb25lLldhdmVTaGFwZXIoNDA5Nik7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBob2xkcyBvbnRvIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVyXG5cdFx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX29yZGVyID0gb3B0aW9ucy5vcmRlcjtcblx0ICAgICAgICB0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fc2hhcGVyKTtcblx0ICAgICAgICB0aGlzLm9yZGVyID0gb3B0aW9ucy5vcmRlcjtcblx0ICAgICAgICB0aGlzLm92ZXJzYW1wbGUgPSBvcHRpb25zLm92ZXJzYW1wbGU7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5DaGVieXNoZXYsIFRvbmUuRWZmZWN0KTtcblx0ICAgIC8qKlxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5DaGVieXNoZXYuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ29yZGVyJzogMSxcblx0ICAgICAgICAnb3ZlcnNhbXBsZSc6ICdub25lJ1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBnZXQgdGhlIGNvZWZmaWNpZW50IGZvciB0aGF0IGRlZ3JlZVxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0geCB0aGUgeCB2YWx1ZVxuXHRcdCAqICBAcGFyYW0gICB7bnVtYmVyfSBkZWdyZWUgXG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fSBtZW1vIG1lbW9pemUgdGhlIGNvbXB1dGVkIHZhbHVlLiBcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzcGVlZHMgdXAgY29tcHV0YXRpb24gZ3JlYXRseS4gXG5cdFx0ICogIEByZXR1cm4gIHtudW1iZXJ9ICAgICAgIHRoZSBjb2VmZmljaWVudCBcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuQ2hlYnlzaGV2LnByb3RvdHlwZS5fZ2V0Q29lZmZpY2llbnQgPSBmdW5jdGlvbiAoeCwgZGVncmVlLCBtZW1vKSB7XG5cdCAgICAgICAgaWYgKG1lbW8uaGFzT3duUHJvcGVydHkoZGVncmVlKSkge1xuXHQgICAgICAgICAgICByZXR1cm4gbWVtb1tkZWdyZWVdO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoZGVncmVlID09PSAwKSB7XG5cdCAgICAgICAgICAgIG1lbW9bZGVncmVlXSA9IDA7XG5cdCAgICAgICAgfSBlbHNlIGlmIChkZWdyZWUgPT09IDEpIHtcblx0ICAgICAgICAgICAgbWVtb1tkZWdyZWVdID0geDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBtZW1vW2RlZ3JlZV0gPSAyICogeCAqIHRoaXMuX2dldENvZWZmaWNpZW50KHgsIGRlZ3JlZSAtIDEsIG1lbW8pIC0gdGhpcy5fZ2V0Q29lZmZpY2llbnQoeCwgZGVncmVlIC0gMiwgbWVtbyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBtZW1vW2RlZ3JlZV07XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG9yZGVyIG9mIHRoZSBDaGVieXNoZXYgcG9seW5vbWlhbCB3aGljaCBjcmVhdGVzXG5cdFx0ICogdGhlIGVxdWF0aW9uIHdoaWNoIGlzIGFwcGxpZWQgdG8gdGhlIGluY29taW5nIFxuXHRcdCAqIHNpZ25hbCB0aHJvdWdoIGEgVG9uZS5XYXZlU2hhcGVyLiBUaGUgZXF1YXRpb25zXG5cdFx0ICogYXJlIGluIHRoZSBmb3JtOjxicj5cblx0XHQgKiBvcmRlciAyOiAyeF4yICsgMTxicj5cblx0XHQgKiBvcmRlciAzOiA0eF4zICsgM3ggPGJyPlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkNoZWJ5c2hldiNcblx0XHQgKiBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0ICogQG5hbWUgb3JkZXJcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkNoZWJ5c2hldi5wcm90b3R5cGUsICdvcmRlcicsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yZGVyO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAob3JkZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3JkZXIgPSBvcmRlcjtcblx0ICAgICAgICAgICAgdmFyIGN1cnZlID0gbmV3IEFycmF5KDQwOTYpO1xuXHQgICAgICAgICAgICB2YXIgbGVuID0gY3VydmUubGVuZ3RoO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgeCA9IGkgKiAyIC8gbGVuIC0gMTtcblx0ICAgICAgICAgICAgICAgIGlmICh4ID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9zaG91bGQgb3V0cHV0IDAgd2hlbiBpbnB1dCBpcyAwXG5cdCAgICAgICAgICAgICAgICAgICAgY3VydmVbaV0gPSAwO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtpXSA9IHRoaXMuX2dldENvZWZmaWNpZW50KHgsIG9yZGVyLCB7fSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5fc2hhcGVyLmN1cnZlID0gY3VydmU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgb3ZlcnNhbXBsaW5nIG9mIHRoZSBlZmZlY3QuIENhbiBlaXRoZXIgYmUgXCJub25lXCIsIFwiMnhcIiBvciBcIjR4XCIuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQ2hlYnlzaGV2I1xuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICogQG5hbWUgb3ZlcnNhbXBsZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQ2hlYnlzaGV2LnByb3RvdHlwZSwgJ292ZXJzYW1wbGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaGFwZXIub3ZlcnNhbXBsZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG92ZXJzYW1wbGluZykge1xuXHQgICAgICAgICAgICB0aGlzLl9zaGFwZXIub3ZlcnNhbXBsZSA9IG92ZXJzYW1wbGluZztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC4gXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkNoZWJ5c2hldn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5DaGVieXNoZXYucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9zaGFwZXIuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3NoYXBlciA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQ2hlYnlzaGV2O1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgQmFzZSBjbGFzcyBmb3IgU3RlcmVvIGVmZmVjdHMuIFByb3ZpZGVzIGVmZmVjdFNlbmRML1IgYW5kIGVmZmVjdFJldHVybkwvUi5cblx0XHQgKlxuXHRcdCAqXHRAY29uc3RydWN0b3Jcblx0XHQgKlx0QGV4dGVuZHMge1RvbmUuRWZmZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TdGVyZW9FZmZlY3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy9nZXQgdGhlIGRlZmF1bHRzXG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzKTtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbJ3dldCddLCBUb25lLkVmZmVjdCk7XG5cdCAgICAgICAgdGhpcy5jcmVhdGVJbnNPdXRzKDEsIDEpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBkcnl3ZXQga25vYiB0byBjb250cm9sIHRoZSBhbW91bnQgb2YgZWZmZWN0XG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuQ3Jvc3NGYWRlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9kcnlXZXQgPSBuZXcgVG9uZS5Dcm9zc0ZhZGUob3B0aW9ucy53ZXQpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSB3ZXQgY29udHJvbCwgaS5lLiBob3cgbXVjaCBvZiB0aGUgZWZmZWN0ZWRcblx0XHRcdCAqICB3aWxsIHBhc3MgdGhyb3VnaCB0byB0aGUgb3V0cHV0LlxuXHRcdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLndldCA9IHRoaXMuX2RyeVdldC5mYWRlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZW4gc3BsaXQgaXRcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5TcGxpdH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc3BsaXQgPSBuZXcgVG9uZS5TcGxpdCgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBlZmZlY3RzIHNlbmQgTEVGVFxuXHRcdFx0ICogIEB0eXBlIHtHYWluTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5lZmZlY3RTZW5kTCA9IHRoaXMuX3NwbGl0LmxlZnQ7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGVmZmVjdHMgc2VuZCBSSUdIVFxuXHRcdFx0ICogIEB0eXBlIHtHYWluTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5lZmZlY3RTZW5kUiA9IHRoaXMuX3NwbGl0LnJpZ2h0O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBzdGVyZW8gZWZmZWN0IG1lcmdlclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk1lcmdlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tZXJnZSA9IG5ldyBUb25lLk1lcmdlKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGVmZmVjdCByZXR1cm4gTEVGVFxuXHRcdFx0ICogIEB0eXBlIHtHYWluTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5lZmZlY3RSZXR1cm5MID0gdGhpcy5fbWVyZ2UubGVmdDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgZWZmZWN0IHJldHVybiBSSUdIVFxuXHRcdFx0ICogIEB0eXBlIHtHYWluTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5lZmZlY3RSZXR1cm5SID0gdGhpcy5fbWVyZ2UucmlnaHQ7XG5cdCAgICAgICAgLy9jb25uZWN0aW9uc1xuXHQgICAgICAgIHRoaXMuaW5wdXQuY29ubmVjdCh0aGlzLl9zcGxpdCk7XG5cdCAgICAgICAgLy9kcnkgd2V0IGNvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5pbnB1dC5jb25uZWN0KHRoaXMuX2RyeVdldCwgMCwgMCk7XG5cdCAgICAgICAgdGhpcy5fbWVyZ2UuY29ubmVjdCh0aGlzLl9kcnlXZXQsIDAsIDEpO1xuXHQgICAgICAgIHRoaXMuX2RyeVdldC5jb25uZWN0KHRoaXMub3V0cHV0KTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbJ3dldCddKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlN0ZXJlb0VmZmVjdCwgVG9uZS5FZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5TdGVyZW9FZmZlY3R9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuU3RlcmVvRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fZHJ5V2V0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9kcnlXZXQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3NwbGl0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9zcGxpdCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbWVyZ2UuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21lcmdlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmRMID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmRSID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmVmZmVjdFJldHVybkwgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZWZmZWN0UmV0dXJuUiA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoWyd3ZXQnXSk7XG5cdCAgICAgICAgdGhpcy53ZXQgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlN0ZXJlb0VmZmVjdDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuQ2hvcnVzIGlzIGEgc3RlcmVvIGNob3J1cyBlZmZlY3QgY29tcG9zZWQgb2Zcblx0XHQgKiAgICAgICAgIGEgbGVmdCBhbmQgcmlnaHQgZGVsYXkgd2l0aCBhIFRvbmUuTEZPIGFwcGxpZWQgdG8gdGhlIGRlbGF5VGltZSBvZiBlYWNoIGNoYW5uZWwuXG5cdFx0ICogICAgICAgICBJbnNwaXJhdGlvbiBmcm9tIFtUdW5hLmpzXShodHRwczovL2dpdGh1Yi5jb20vRGluYWhtb2UvdHVuYS9ibG9iL21hc3Rlci90dW5hLmpzKS5cblx0XHQgKiAgICAgICAgIFJlYWQgbW9yZSBvbiB0aGUgY2hvcnVzIGVmZmVjdCBvbiBbU291bmRPblNvdW5kXShodHRwOi8vd3d3LnNvdW5kb25zb3VuZC5jb20vc29zL2p1bjA0L2FydGljbGVzL3N5bnRoc2VjcmV0cy5odG0pLlxuXHRcdCAqXG5cdFx0ICpcdEBjb25zdHJ1Y3RvclxuXHRcdCAqXHRAZXh0ZW5kcyB7VG9uZS5TdGVyZW9FZmZlY3R9XG5cdFx0ICpcdEBwYXJhbSB7RnJlcXVlbmN5fE9iamVjdH0gW2ZyZXF1ZW5jeV0gVGhlIGZyZXF1ZW5jeSBvZiB0aGUgTEZPLlxuXHRcdCAqXHRAcGFyYW0ge01pbGxpc2Vjb25kc30gW2RlbGF5VGltZV0gVGhlIGRlbGF5IG9mIHRoZSBjaG9ydXMgZWZmZWN0IGluIG1zLlxuXHRcdCAqXHRAcGFyYW0ge05vcm1hbFJhbmdlfSBbZGVwdGhdIFRoZSBkZXB0aCBvZiB0aGUgY2hvcnVzLlxuXHRcdCAqXHRAZXhhbXBsZVxuXHRcdCAqIHZhciBjaG9ydXMgPSBuZXcgVG9uZS5DaG9ydXMoNCwgMi41LCAwLjUpO1xuXHRcdCAqIHZhciBzeW50aCA9IG5ldyBUb25lLlBvbHlTeW50aCg0LCBUb25lLk1vbm9TeW50aCkuY29ubmVjdChjaG9ydXMpO1xuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKFtcIkMzXCIsXCJFM1wiLFwiRzNcIl0sIFwiOG5cIik7XG5cdFx0ICovXG5cdCAgICBUb25lLkNob3J1cyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGVsYXlUaW1lJyxcblx0ICAgICAgICAgICAgJ2RlcHRoJ1xuXHQgICAgICAgIF0sIFRvbmUuQ2hvcnVzKTtcblx0ICAgICAgICBUb25lLlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBkZXB0aCBvZiB0aGUgY2hvcnVzXG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZGVwdGggPSBvcHRpb25zLmRlcHRoO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBkZWxheVRpbWVcblx0XHRcdCAqICBAdHlwZSB7bnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9kZWxheVRpbWUgPSBvcHRpb25zLmRlbGF5VGltZSAvIDEwMDA7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGxmbyB3aGljaCBjb250cm9scyB0aGUgZGVsYXlUaW1lXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTEZPfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sZm9MID0gbmV3IFRvbmUuTEZPKHtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeSc6IG9wdGlvbnMuZnJlcXVlbmN5LFxuXHQgICAgICAgICAgICAnbWluJzogMCxcblx0ICAgICAgICAgICAgJ21heCc6IDFcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBhbm90aGVyIExGTyBmb3IgdGhlIHJpZ2h0IHNpZGUgd2l0aCBhIDE4MCBkZWdyZWUgcGhhc2UgZGlmZlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkxGT31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbGZvUiA9IG5ldyBUb25lLkxGTyh7XG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knOiBvcHRpb25zLmZyZXF1ZW5jeSxcblx0ICAgICAgICAgICAgJ21pbic6IDAsXG5cdCAgICAgICAgICAgICdtYXgnOiAxLFxuXHQgICAgICAgICAgICAncGhhc2UnOiAxODBcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBkZWxheSBmb3IgbGVmdFxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkRlbGF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9kZWxheU5vZGVMID0gbmV3IFRvbmUuRGVsYXkoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBkZWxheSBmb3IgcmlnaHRcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5EZWxheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZGVsYXlOb2RlUiA9IG5ldyBUb25lLkRlbGF5KCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgZnJlcXVlbmN5IG9mIHRoZSBMRk8gd2hpY2ggbW9kdWxhdGVzIHRoZSBkZWxheVRpbWUuXG5cdFx0XHQgKiBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdFx0ICogQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSB0aGlzLl9sZm9MLmZyZXF1ZW5jeTtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5lZmZlY3RTZW5kTC5jaGFpbih0aGlzLl9kZWxheU5vZGVMLCB0aGlzLmVmZmVjdFJldHVybkwpO1xuXHQgICAgICAgIHRoaXMuZWZmZWN0U2VuZFIuY2hhaW4odGhpcy5fZGVsYXlOb2RlUiwgdGhpcy5lZmZlY3RSZXR1cm5SKTtcblx0ICAgICAgICAvL2FuZCBwYXNzIHRocm91Z2ggdG8gbWFrZSB0aGUgZGV0dW5lIGFwcGFyZW50XG5cdCAgICAgICAgdGhpcy5lZmZlY3RTZW5kTC5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuTCk7XG5cdCAgICAgICAgdGhpcy5lZmZlY3RTZW5kUi5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuUik7XG5cdCAgICAgICAgLy9sZm8gc2V0dXBcblx0ICAgICAgICB0aGlzLl9sZm9MLmNvbm5lY3QodGhpcy5fZGVsYXlOb2RlTC5kZWxheVRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2xmb1IuY29ubmVjdCh0aGlzLl9kZWxheU5vZGVSLmRlbGF5VGltZSk7XG5cdCAgICAgICAgLy9zdGFydCB0aGUgbGZvXG5cdCAgICAgICAgdGhpcy5fbGZvTC5zdGFydCgpO1xuXHQgICAgICAgIHRoaXMuX2xmb1Iuc3RhcnQoKTtcblx0ICAgICAgICAvL2hhdmUgb25lIExGTyBmcmVxdWVuY3kgY29udHJvbCB0aGUgb3RoZXJcblx0ICAgICAgICB0aGlzLl9sZm9MLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMuX2xmb1IuZnJlcXVlbmN5KTtcblx0ICAgICAgICAvL3NldCB0aGUgaW5pdGlhbCB2YWx1ZXNcblx0ICAgICAgICB0aGlzLmRlcHRoID0gdGhpcy5fZGVwdGg7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kudmFsdWUgPSBvcHRpb25zLmZyZXF1ZW5jeTtcblx0ICAgICAgICB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoWydmcmVxdWVuY3knXSk7XG5cdCAgICAgICAgdGhpcy5zcHJlYWQgPSBvcHRpb25zLnNwcmVhZDtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkNob3J1cywgVG9uZS5TdGVyZW9FZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuQ2hvcnVzLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdmcmVxdWVuY3knOiAxLjUsXG5cdCAgICAgICAgJ2RlbGF5VGltZSc6IDMuNSxcblx0ICAgICAgICAnZGVwdGgnOiAwLjcsXG5cdCAgICAgICAgJ3R5cGUnOiAnc2luZScsXG5cdCAgICAgICAgJ3NwcmVhZCc6IDE4MFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBkZXB0aCBvZiB0aGUgZWZmZWN0LiBBIGRlcHRoIG9mIDEgbWFrZXMgdGhlIGRlbGF5VGltZVxuXHRcdCAqIG1vZHVsYXRlIGJldHdlZW4gMCBhbmQgMipkZWxheVRpbWUgKGNlbnRlcmVkIGFyb3VuZCB0aGUgZGVsYXlUaW1lKS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5DaG9ydXMjXG5cdFx0ICogQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdCAqIEBuYW1lIGRlcHRoXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5DaG9ydXMucHJvdG90eXBlLCAnZGVwdGgnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZXB0aDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGRlcHRoKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2RlcHRoID0gZGVwdGg7XG5cdCAgICAgICAgICAgIHZhciBkZXZpYXRpb24gPSB0aGlzLl9kZWxheVRpbWUgKiBkZXB0aDtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvTC5taW4gPSBNYXRoLm1heCh0aGlzLl9kZWxheVRpbWUgLSBkZXZpYXRpb24sIDApO1xuXHQgICAgICAgICAgICB0aGlzLl9sZm9MLm1heCA9IHRoaXMuX2RlbGF5VGltZSArIGRldmlhdGlvbjtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvUi5taW4gPSBNYXRoLm1heCh0aGlzLl9kZWxheVRpbWUgLSBkZXZpYXRpb24sIDApO1xuXHQgICAgICAgICAgICB0aGlzLl9sZm9SLm1heCA9IHRoaXMuX2RlbGF5VGltZSArIGRldmlhdGlvbjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBkZWxheVRpbWUgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZSBjaG9ydXMuIEEgbGFyZ2VyIGRlbGF5VGltZVxuXHRcdCAqIHdpbGwgZ2l2ZSBhIG1vcmUgcHJvbm91bmNlZCBlZmZlY3QuIE5vbWluYWwgcmFuZ2UgYSBkZWxheVRpbWVcblx0XHQgKiBpcyBiZXR3ZWVuIDIgYW5kIDIwbXMuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQ2hvcnVzI1xuXHRcdCAqIEB0eXBlIHtNaWxsaXNlY29uZHN9XG5cdFx0ICogQG5hbWUgZGVsYXlUaW1lXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5DaG9ydXMucHJvdG90eXBlLCAnZGVsYXlUaW1lJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsYXlUaW1lICogMTAwMDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGRlbGF5VGltZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9kZWxheVRpbWUgPSBkZWxheVRpbWUgLyAxMDAwO1xuXHQgICAgICAgICAgICB0aGlzLmRlcHRoID0gdGhpcy5fZGVwdGg7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgb3NjaWxsYXRvciB0eXBlIG9mIHRoZSBMRk8uXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQ2hvcnVzI1xuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICogQG5hbWUgdHlwZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQ2hvcnVzLnByb3RvdHlwZSwgJ3R5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9sZm9MLnR5cGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0eXBlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2xmb0wudHlwZSA9IHR5cGU7XG5cdCAgICAgICAgICAgIHRoaXMuX2xmb1IudHlwZSA9IHR5cGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBBbW91bnQgb2Ygc3RlcmVvIHNwcmVhZC4gV2hlbiBzZXQgdG8gMCwgYm90aCBMRk8ncyB3aWxsIGJlIHBhbm5lZCBjZW50cmFsbHkuXG5cdFx0ICogV2hlbiBzZXQgdG8gMTgwLCBMRk8ncyB3aWxsIGJlIHBhbm5lZCBoYXJkIGxlZnQgYW5kIHJpZ2h0IHJlc3BlY3RpdmVseS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5DaG9ydXMjXG5cdFx0ICogQHR5cGUge0RlZ3JlZXN9XG5cdFx0ICogQG5hbWUgc3ByZWFkXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5DaG9ydXMucHJvdG90eXBlLCAnc3ByZWFkJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGZvUi5waGFzZSAtIHRoaXMuX2xmb0wucGhhc2U7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChzcHJlYWQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvTC5waGFzZSA9IDkwIC0gc3ByZWFkIC8gMjtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvUi5waGFzZSA9IHNwcmVhZCAvIDIgKyA5MDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuQ2hvcnVzfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkNob3J1cy5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2xmb0wuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2xmb0wgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2xmb1IuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2xmb1IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5Tm9kZUwuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5Tm9kZUwgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5Tm9kZVIuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5Tm9kZVIgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCdmcmVxdWVuY3knKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuQ2hvcnVzO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIFRvbmUuQ29udm9sdmVyIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIE5hdGl2ZSBXZWIgQXVkaW9cblx0XHQgKiAgICAgICAgICBbQ29udm9sdmVyTm9kZV0oaHR0cDovL3dlYmF1ZGlvLmdpdGh1Yi5pby93ZWItYXVkaW8tYXBpLyN0aGUtY29udm9sdmVybm9kZS1pbnRlcmZhY2UpLlxuXHRcdCAqICAgICAgICAgIENvbnZvbHV0aW9uIGlzIHVzZWZ1bCBmb3IgcmV2ZXJiIGFuZCBmaWx0ZXIgZW11bGF0aW9uLiBSZWFkIG1vcmUgYWJvdXQgY29udm9sdXRpb24gcmV2ZXJiIG9uXG5cdFx0ICogICAgICAgICAgW1dpa2lwZWRpYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29udm9sdXRpb25fcmV2ZXJiKS5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuRWZmZWN0fVxuXHRcdCAqICBAcGFyYW0ge3N0cmluZ3xUb25lLkJ1ZmZlcnxPYmplY3R9IFt1cmxdIFRoZSBVUkwgb2YgdGhlIGltcHVsc2UgcmVzcG9uc2Ugb3IgdGhlIFRvbmUuQnVmZmVyXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGlhbmluZyB0aGUgaW1wdWxzZSByZXNwb25zZS5cblx0XHQgKiAgQHBhcmFtIHtGdW5jdGlvbj19IG9ubG9hZCBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHVybCBpcyBsb2FkZWQuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9pbml0aWFsaXppbmcgdGhlIGNvbnZvbHZlciB3aXRoIGFuIGltcHVsc2UgcmVzcG9uc2Vcblx0XHQgKiB2YXIgY29udm9sdmVyID0gbmV3IFRvbmUuQ29udm9sdmVyKFwiLi9wYXRoL3RvL2lyLndhdlwiKS50b01hc3RlcigpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Db252b2x2ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAndXJsJyxcblx0ICAgICAgICAgICAgJ29ubG9hZCdcblx0ICAgICAgICBdLCBUb25lLkNvbnZvbHZlcik7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBjb252b2x2ZXIgbm9kZVxuXHRcdFx0ICogIEB0eXBlIHtDb252b2x2ZXJOb2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9jb252b2x2ZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQ29udm9sdmVyKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGNvbnZvbHV0aW9uIGJ1ZmZlclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkJ1ZmZlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYnVmZmVyID0gbmV3IFRvbmUuQnVmZmVyKG9wdGlvbnMudXJsLCBmdW5jdGlvbiAoYnVmZmVyKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2NvbnZvbHZlci5idWZmZXIgPSBidWZmZXIuZ2V0KCk7XG5cdCAgICAgICAgICAgIG9wdGlvbnMub25sb2FkKCk7XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgICAgICB0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fY29udm9sdmVyKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkNvbnZvbHZlciwgVG9uZS5FZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Db252b2x2ZXIuZGVmYXVsdHMgPSB7ICdvbmxvYWQnOiBUb25lLm5vT3AgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgY29udm9sdmVyJ3MgYnVmZmVyXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkNvbnZvbHZlciNcblx0XHQgKiAgQHR5cGUge0F1ZGlvQnVmZmVyfVxuXHRcdCAqICBAbmFtZSBidWZmZXJcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkNvbnZvbHZlci5wcm90b3R5cGUsICdidWZmZXInLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIuZ2V0KCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChidWZmZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVyLnNldChidWZmZXIpO1xuXHQgICAgICAgICAgICB0aGlzLl9jb252b2x2ZXIuYnVmZmVyID0gdGhpcy5fYnVmZmVyLmdldCgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIExvYWQgYW4gaW1wdWxzZSByZXNwb25zZSB1cmwgYXMgYW4gYXVkaW8gYnVmZmVyLlxuXHRcdCAqICBEZWNvZGVzIHRoZSBhdWRpbyBhc3luY2hyb25vdXNseSBhbmQgaW52b2tlc1xuXHRcdCAqICB0aGUgY2FsbGJhY2sgb25jZSB0aGUgYXVkaW8gYnVmZmVyIGxvYWRzLlxuXHRcdCAqICBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSB1cmwgb2YgdGhlIGJ1ZmZlciB0byBsb2FkLlxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgIGZpbGV0eXBlIHN1cHBvcnQgZGVwZW5kcyBvbiB0aGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICBicm93c2VyLlxuXHRcdCAqICBAcGFyYW0gIHtmdW5jdGlvbj19IGNhbGxiYWNrXG5cdFx0ICogIEByZXR1cm5zIHtQcm9taXNlfVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Db252b2x2ZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAodXJsLCBjYWxsYmFjaykge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIubG9hZCh1cmwsIGZ1bmN0aW9uIChidWZmKSB7XG5cdCAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZjtcblx0ICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG5cdCAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkNvbnZvbHZlcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Db252b2x2ZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9jb252b2x2ZXIuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX2NvbnZvbHZlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fYnVmZmVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9idWZmZXIgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkNvbnZvbHZlcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuRGlzdG9ydGlvbiBpcyBhIHNpbXBsZSBkaXN0b3J0aW9uIGVmZmVjdCB1c2luZyBUb25lLldhdmVTaGFwZXIuXG5cdFx0ICogICAgICAgICBBbGdvcml0aG0gZnJvbSBbYSBzdGFja292ZXJmbG93IGFuc3dlcl0oaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjIzMTM0MDgpLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkVmZmVjdH1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfE9iamVjdH0gW2Rpc3RvcnRpb25dIFRoZSBhbW91bnQgb2YgZGlzdG9ydGlvbiAobm9taW5hbCByYW5nZSBvZiAwLTEpXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIGRpc3QgPSBuZXcgVG9uZS5EaXN0b3J0aW9uKDAuOCkudG9NYXN0ZXIoKTtcblx0XHQgKiB2YXIgZm0gPSBuZXcgVG9uZS5TaW1wbGVGTSgpLmNvbm5lY3QoZGlzdCk7XG5cdFx0ICogLy90aGlzIHNvdW5kcyBnb29kIG9uIGJhc3Mgbm90ZXNcblx0XHQgKiBmbS50cmlnZ2VyQXR0YWNrUmVsZWFzZShcIkExXCIsIFwiOG5cIik7XG5cdFx0ICovXG5cdCAgICBUb25lLkRpc3RvcnRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydkaXN0b3J0aW9uJ10sIFRvbmUuRGlzdG9ydGlvbik7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5XYXZlU2hhcGVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zaGFwZXIgPSBuZXcgVG9uZS5XYXZlU2hhcGVyKDQwOTYpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogaG9sZHMgdGhlIGRpc3RvcnRpb24gYW1vdW50XG5cdFx0XHQgKiBAdHlwZSB7bnVtYmVyfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2Rpc3RvcnRpb24gPSBvcHRpb25zLmRpc3RvcnRpb247XG5cdCAgICAgICAgdGhpcy5jb25uZWN0RWZmZWN0KHRoaXMuX3NoYXBlcik7XG5cdCAgICAgICAgdGhpcy5kaXN0b3J0aW9uID0gb3B0aW9ucy5kaXN0b3J0aW9uO1xuXHQgICAgICAgIHRoaXMub3ZlcnNhbXBsZSA9IG9wdGlvbnMub3ZlcnNhbXBsZTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkRpc3RvcnRpb24sIFRvbmUuRWZmZWN0KTtcblx0ICAgIC8qKlxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5EaXN0b3J0aW9uLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdkaXN0b3J0aW9uJzogMC40LFxuXHQgICAgICAgICdvdmVyc2FtcGxlJzogJ25vbmUnXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGFtb3VudCBvZiBkaXN0b3J0aW9uLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkRpc3RvcnRpb24jXG5cdFx0ICogQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdCAqIEBuYW1lIGRpc3RvcnRpb25cblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkRpc3RvcnRpb24ucHJvdG90eXBlLCAnZGlzdG9ydGlvbicsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3RvcnRpb247XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChhbW91bnQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZGlzdG9ydGlvbiA9IGFtb3VudDtcblx0ICAgICAgICAgICAgdmFyIGsgPSBhbW91bnQgKiAxMDA7XG5cdCAgICAgICAgICAgIHZhciBkZWcgPSBNYXRoLlBJIC8gMTgwO1xuXHQgICAgICAgICAgICB0aGlzLl9zaGFwZXIuc2V0TWFwKGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoeCkgPCAwLjAwMSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vc2hvdWxkIG91dHB1dCAwIHdoZW4gaW5wdXQgaXMgMFxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDMgKyBrKSAqIHggKiAyMCAqIGRlZyAvIChNYXRoLlBJICsgayAqIE1hdGguYWJzKHgpKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgb3ZlcnNhbXBsaW5nIG9mIHRoZSBlZmZlY3QuIENhbiBlaXRoZXIgYmUgXCJub25lXCIsIFwiMnhcIiBvciBcIjR4XCIuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRGlzdG9ydGlvbiNcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxuXHRcdCAqIEBuYW1lIG92ZXJzYW1wbGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkRpc3RvcnRpb24ucHJvdG90eXBlLCAnb3ZlcnNhbXBsZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NoYXBlci5vdmVyc2FtcGxlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAob3ZlcnNhbXBsaW5nKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3NoYXBlci5vdmVyc2FtcGxlID0gb3ZlcnNhbXBsaW5nO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLiBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRGlzdG9ydGlvbn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5EaXN0b3J0aW9uLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc2hhcGVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9zaGFwZXIgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkRpc3RvcnRpb247XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogXHRAY2xhc3MgIFRvbmUuRmVlZGJhY2tFZmZlY3QgcHJvdmlkZXMgYSBsb29wIGJldHdlZW4gYW4gXG5cdFx0ICogXHQgICAgICAgIGF1ZGlvIHNvdXJjZSBhbmQgaXRzIG93biBvdXRwdXQuIFRoaXMgaXMgYSBiYXNlLWNsYXNzXG5cdFx0ICogXHQgICAgICAgIGZvciBmZWVkYmFjayBlZmZlY3RzLiBcblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuRWZmZWN0fVxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfE9iamVjdH0gW2ZlZWRiYWNrXSBUaGUgaW5pdGlhbCBmZWVkYmFjayB2YWx1ZS5cblx0XHQgKi9cblx0ICAgIFRvbmUuRmVlZGJhY2tFZmZlY3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydmZWVkYmFjayddLCBUb25lLkZlZWRiYWNrRWZmZWN0KTtcblx0ICAgICAgICBUb25lLkVmZmVjdC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBnYWluIHdoaWNoIGNvbnRyb2xzIHRoZSBmZWVkYmFja1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2ZlZWRiYWNrR2FpbiA9IG5ldyBUb25lLkdhaW4ob3B0aW9ucy5mZWVkYmFjaywgVG9uZS5UeXBlLk5vcm1hbFJhbmdlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW1vdW50IG9mIHNpZ25hbCB3aGljaCBpcyBmZWQgYmFjayBpbnRvIHRoZSBlZmZlY3QgaW5wdXQuIFxuXHRcdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZlZWRiYWNrID0gdGhpcy5fZmVlZGJhY2tHYWluLmdhaW47XG5cdCAgICAgICAgLy90aGUgZmVlZGJhY2sgbG9vcFxuXHQgICAgICAgIHRoaXMuZWZmZWN0UmV0dXJuLmNoYWluKHRoaXMuX2ZlZWRiYWNrR2FpbiwgdGhpcy5lZmZlY3RTZW5kKTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbJ2ZlZWRiYWNrJ10pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuRmVlZGJhY2tFZmZlY3QsIFRvbmUuRWZmZWN0KTtcblx0ICAgIC8qKlxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkZlZWRiYWNrRWZmZWN0LmRlZmF1bHRzID0geyAnZmVlZGJhY2snOiAwLjEyNSB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLiBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRmVlZGJhY2tFZmZlY3R9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRmVlZGJhY2tFZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbJ2ZlZWRiYWNrJ10pO1xuXHQgICAgICAgIHRoaXMuX2ZlZWRiYWNrR2Fpbi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tHYWluID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmZlZWRiYWNrID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5GZWVkYmFja0VmZmVjdDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLkZlZWRiYWNrRGVsYXkgaXMgYSBEZWxheU5vZGUgaW4gd2hpY2ggcGFydCBvZiBvdXRwdXRcblx0XHQgKiAgICAgICAgICBzaWduYWwgaXMgZmVkIGJhY2sgaW50byB0aGUgZGVsYXkuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkZlZWRiYWNrRWZmZWN0fVxuXHRcdCAqICBAcGFyYW0ge1RpbWV8T2JqZWN0fSBbZGVsYXlUaW1lXSBUaGUgZGVsYXkgYXBwbGllZCB0byB0aGUgaW5jb21pbmcgc2lnbmFsLlxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlPX0gZmVlZGJhY2sgVGhlIGFtb3VudCBvZiB0aGUgZWZmZWN0ZWQgc2lnbmFsIHdoaWNoXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZmVkIGJhY2sgdGhyb3VnaCB0aGUgZGVsYXkuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIGZlZWRiYWNrRGVsYXkgPSBuZXcgVG9uZS5GZWVkYmFja0RlbGF5KFwiOG5cIiwgMC41KS50b01hc3RlcigpO1xuXHRcdCAqIHZhciB0b20gPSBuZXcgVG9uZS5EcnVtU3ludGgoe1xuXHRcdCAqIFx0XCJvY3RhdmVzXCIgOiA0LFxuXHRcdCAqIFx0XCJwaXRjaERlY2F5XCIgOiAwLjFcblx0XHQgKiB9KS5jb25uZWN0KGZlZWRiYWNrRGVsYXkpO1xuXHRcdCAqIHRvbS50cmlnZ2VyQXR0YWNrUmVsZWFzZShcIkEyXCIsXCIzMm5cIik7XG5cdFx0ICovXG5cdCAgICBUb25lLkZlZWRiYWNrRGVsYXkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZGVsYXlUaW1lJyxcblx0ICAgICAgICAgICAgJ2ZlZWRiYWNrJ1xuXHQgICAgICAgIF0sIFRvbmUuRmVlZGJhY2tEZWxheSk7XG5cdCAgICAgICAgVG9uZS5GZWVkYmFja0VmZmVjdC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBkZWxheSBub2RlXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRGVsYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2RlbGF5Tm9kZSA9IG5ldyBUb25lLkRlbGF5KG9wdGlvbnMuZGVsYXlUaW1lLCBvcHRpb25zLm1heERlbGF5KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGVsYXlUaW1lIG9mIHRoZSBEZWxheU5vZGUuXG5cdFx0XHQgKiAgQHR5cGUge1RpbWV9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5kZWxheVRpbWUgPSB0aGlzLl9kZWxheU5vZGUuZGVsYXlUaW1lO1xuXHQgICAgICAgIC8vIGNvbm5lY3QgaXQgdXBcblx0ICAgICAgICB0aGlzLmNvbm5lY3RFZmZlY3QodGhpcy5fZGVsYXlOb2RlKTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbJ2RlbGF5VGltZSddKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkZlZWRiYWNrRGVsYXksIFRvbmUuRmVlZGJhY2tFZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBkZWZhdWx0IHZhbHVlcy5cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuRmVlZGJhY2tEZWxheS5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZGVsYXlUaW1lJzogMC4yNSxcblx0ICAgICAgICAnbWF4RGVsYXknOiAxXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGNsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkZlZWRiYWNrRGVsYXl9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRmVlZGJhY2tEZWxheS5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlOb2RlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9kZWxheU5vZGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFsnZGVsYXlUaW1lJ10pO1xuXHQgICAgICAgIHRoaXMuZGVsYXlUaW1lID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5GZWVkYmFja0RlbGF5O1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBhbiBhcnJheSBvZiBjb21iIGZpbHRlciBkZWxheSB2YWx1ZXMgZnJvbSBGcmVldmVyYiBpbXBsZW1lbnRhdGlvblxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHQgKi9cblx0ICAgIHZhciBjb21iRmlsdGVyVHVuaW5ncyA9IFtcblx0ICAgICAgICAxNTU3IC8gNDQxMDAsXG5cdCAgICAgICAgMTYxNyAvIDQ0MTAwLFxuXHQgICAgICAgIDE0OTEgLyA0NDEwMCxcblx0ICAgICAgICAxNDIyIC8gNDQxMDAsXG5cdCAgICAgICAgMTI3NyAvIDQ0MTAwLFxuXHQgICAgICAgIDEzNTYgLyA0NDEwMCxcblx0ICAgICAgICAxMTg4IC8gNDQxMDAsXG5cdCAgICAgICAgMTExNiAvIDQ0MTAwXG5cdCAgICBdO1xuXHQgICAgLyoqXG5cdFx0ICogIGFuIGFycmF5IG9mIGFsbHBhc3MgZmlsdGVyIGZyZXF1ZW5jeSB2YWx1ZXMgZnJvbSBGcmVldmVyYiBpbXBsZW1lbnRhdGlvblxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHQgKi9cblx0ICAgIHZhciBhbGxwYXNzRmlsdGVyRnJlcXVlbmNpZXMgPSBbXG5cdCAgICAgICAgMjI1LFxuXHQgICAgICAgIDU1Nixcblx0ICAgICAgICA0NDEsXG5cdCAgICAgICAgMzQxXG5cdCAgICBdO1xuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLkZyZWV2ZXJiIGlzIGEgcmV2ZXJiIGJhc2VkIG9uIFtGcmVldmVyYl0oaHR0cHM6Ly9jY3JtYS5zdGFuZm9yZC5lZHUvfmpvcy9wYXNwL0ZyZWV2ZXJiLmh0bWwpLlxuXHRcdCAqICAgICAgICAgUmVhZCBtb3JlIG9uIHJldmVyYiBvbiBbU291bmQgT24gU291bmRdKGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDA4MzkwMi9odHRwOi8vd3d3LnNvdW5kb25zb3VuZC5jb206ODAvc29zL2ZlYjAxL2FydGljbGVzL3N5bnRoc2VjcmV0cy5hc3ApLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkVmZmVjdH1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7Tm9ybWFsUmFuZ2V8T2JqZWN0fSBbcm9vbVNpemVdIENvcnJlbGF0ZWQgdG8gdGhlIGRlY2F5IHRpbWUuXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBbZGFtcGVuaW5nXSBUaGUgY3V0b2ZmIGZyZXF1ZW5jeSBvZiBhIGxvd3Bhc3MgZmlsdGVyIGFzIHBhcnRcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSByZXZlcmIuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIGZyZWV2ZXJiID0gbmV3IFRvbmUuRnJlZXZlcmIoKS50b01hc3RlcigpO1xuXHRcdCAqIGZyZWV2ZXJiLmRhbXBlbmluZy52YWx1ZSA9IDEwMDA7XG5cdFx0ICogLy9yb3V0aW5nIHN5bnRoIHRocm91Z2ggdGhlIHJldmVyYlxuXHRcdCAqIHZhciBzeW50aCA9IG5ldyBUb25lLkFNU3ludGgoKS5jb25uZWN0KGZyZWV2ZXJiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuRnJlZXZlcmIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAncm9vbVNpemUnLFxuXHQgICAgICAgICAgICAnZGFtcGVuaW5nJ1xuXHQgICAgICAgIF0sIFRvbmUuRnJlZXZlcmIpO1xuXHQgICAgICAgIFRvbmUuU3RlcmVvRWZmZWN0LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHJvb21TaXplIHZhbHVlIGJldHdlZW4uIEEgbGFyZ2VyIHJvb21TaXplXG5cdFx0XHQgKiAgd2lsbCByZXN1bHQgaW4gYSBsb25nZXIgZGVjYXkuXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucm9vbVNpemUgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5yb29tU2l6ZSwgVG9uZS5UeXBlLk5vcm1hbFJhbmdlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW1vdW50IG9mIGRhbXBlbmluZyBvZiB0aGUgcmV2ZXJiZXJhbnQgc2lnbmFsLlxuXHRcdFx0ICogIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5kYW1wZW5pbmcgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5kYW1wZW5pbmcsIFRvbmUuVHlwZS5GcmVxdWVuY3kpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBjb21iIGZpbHRlcnNcblx0XHRcdCAqICBAdHlwZSB7QXJyYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2NvbWJGaWx0ZXJzID0gW107XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGFsbHBhc3MgZmlsdGVycyBvbiB0aGUgbGVmdFxuXHRcdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYWxscGFzc0ZpbHRlcnNMID0gW107XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGFsbHBhc3MgZmlsdGVycyBvbiB0aGUgcmlnaHRcblx0XHRcdCAqICBAdHlwZSB7QXJyYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2FsbHBhc3NGaWx0ZXJzUiA9IFtdO1xuXHQgICAgICAgIC8vbWFrZSB0aGUgYWxscGFzcyBmaWx0ZXJzIG9uIHRoZSByaWdodFxuXHQgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgYWxscGFzc0ZpbHRlckZyZXF1ZW5jaWVzLmxlbmd0aDsgbCsrKSB7XG5cdCAgICAgICAgICAgIHZhciBhbGxwYXNzTCA9IHRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTtcblx0ICAgICAgICAgICAgYWxscGFzc0wudHlwZSA9ICdhbGxwYXNzJztcblx0ICAgICAgICAgICAgYWxscGFzc0wuZnJlcXVlbmN5LnZhbHVlID0gYWxscGFzc0ZpbHRlckZyZXF1ZW5jaWVzW2xdO1xuXHQgICAgICAgICAgICB0aGlzLl9hbGxwYXNzRmlsdGVyc0wucHVzaChhbGxwYXNzTCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vbWFrZSB0aGUgYWxscGFzcyBmaWx0ZXJzIG9uIHRoZSBsZWZ0XG5cdCAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBhbGxwYXNzRmlsdGVyRnJlcXVlbmNpZXMubGVuZ3RoOyByKyspIHtcblx0ICAgICAgICAgICAgdmFyIGFsbHBhc3NSID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpO1xuXHQgICAgICAgICAgICBhbGxwYXNzUi50eXBlID0gJ2FsbHBhc3MnO1xuXHQgICAgICAgICAgICBhbGxwYXNzUi5mcmVxdWVuY3kudmFsdWUgPSBhbGxwYXNzRmlsdGVyRnJlcXVlbmNpZXNbcl07XG5cdCAgICAgICAgICAgIHRoaXMuX2FsbHBhc3NGaWx0ZXJzUi5wdXNoKGFsbHBhc3NSKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9tYWtlIHRoZSBjb21iIGZpbHRlcnNcblx0ICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbWJGaWx0ZXJUdW5pbmdzLmxlbmd0aDsgYysrKSB7XG5cdCAgICAgICAgICAgIHZhciBsZnBmID0gbmV3IFRvbmUuTG93cGFzc0NvbWJGaWx0ZXIoY29tYkZpbHRlclR1bmluZ3NbY10pO1xuXHQgICAgICAgICAgICBpZiAoYyA8IGNvbWJGaWx0ZXJUdW5pbmdzLmxlbmd0aCAvIDIpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0U2VuZEwuY2hhaW4obGZwZiwgdGhpcy5fYWxscGFzc0ZpbHRlcnNMWzBdKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0U2VuZFIuY2hhaW4obGZwZiwgdGhpcy5fYWxscGFzc0ZpbHRlcnNSWzBdKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnJvb21TaXplLmNvbm5lY3QobGZwZi5yZXNvbmFuY2UpO1xuXHQgICAgICAgICAgICB0aGlzLmRhbXBlbmluZy5jb25uZWN0KGxmcGYuZGFtcGVuaW5nKTtcblx0ICAgICAgICAgICAgdGhpcy5fY29tYkZpbHRlcnMucHVzaChsZnBmKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9jaGFpbiB0aGUgYWxscGFzcyBmaWx0ZXJzIHRvZ2V0ZWhyXG5cdCAgICAgICAgVG9uZS5jb25uZWN0U2VyaWVzLmFwcGx5KFRvbmUsIHRoaXMuX2FsbHBhc3NGaWx0ZXJzTCk7XG5cdCAgICAgICAgVG9uZS5jb25uZWN0U2VyaWVzLmFwcGx5KFRvbmUsIHRoaXMuX2FsbHBhc3NGaWx0ZXJzUik7XG5cdCAgICAgICAgdGhpcy5fYWxscGFzc0ZpbHRlcnNMW3RoaXMuX2FsbHBhc3NGaWx0ZXJzTC5sZW5ndGggLSAxXS5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuTCk7XG5cdCAgICAgICAgdGhpcy5fYWxscGFzc0ZpbHRlcnNSW3RoaXMuX2FsbHBhc3NGaWx0ZXJzUi5sZW5ndGggLSAxXS5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuUik7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAncm9vbVNpemUnLFxuXHQgICAgICAgICAgICAnZGFtcGVuaW5nJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuRnJlZXZlcmIsIFRvbmUuU3RlcmVvRWZmZWN0KTtcblx0ICAgIC8qKlxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkZyZWV2ZXJiLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdyb29tU2l6ZSc6IDAuNyxcblx0ICAgICAgICAnZGFtcGVuaW5nJzogMzAwMFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuRnJlZXZlcmJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRnJlZXZlcmIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICBmb3IgKHZhciBhbCA9IDA7IGFsIDwgdGhpcy5fYWxscGFzc0ZpbHRlcnNMLmxlbmd0aDsgYWwrKykge1xuXHQgICAgICAgICAgICB0aGlzLl9hbGxwYXNzRmlsdGVyc0xbYWxdLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICAgICAgdGhpcy5fYWxscGFzc0ZpbHRlcnNMW2FsXSA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2FsbHBhc3NGaWx0ZXJzTCA9IG51bGw7XG5cdCAgICAgICAgZm9yICh2YXIgYXIgPSAwOyBhciA8IHRoaXMuX2FsbHBhc3NGaWx0ZXJzUi5sZW5ndGg7IGFyKyspIHtcblx0ICAgICAgICAgICAgdGhpcy5fYWxscGFzc0ZpbHRlcnNSW2FyXS5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgICAgIHRoaXMuX2FsbHBhc3NGaWx0ZXJzUlthcl0gPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9hbGxwYXNzRmlsdGVyc1IgPSBudWxsO1xuXHQgICAgICAgIGZvciAodmFyIGNmID0gMDsgY2YgPCB0aGlzLl9jb21iRmlsdGVycy5sZW5ndGg7IGNmKyspIHtcblx0ICAgICAgICAgICAgdGhpcy5fY29tYkZpbHRlcnNbY2ZdLmRpc3Bvc2UoKTtcblx0ICAgICAgICAgICAgdGhpcy5fY29tYkZpbHRlcnNbY2ZdID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fY29tYkZpbHRlcnMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ3Jvb21TaXplJyxcblx0ICAgICAgICAgICAgJ2RhbXBlbmluZydcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLnJvb21TaXplLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLnJvb21TaXplID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmRhbXBlbmluZy5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5kYW1wZW5pbmcgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkZyZWV2ZXJiO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBhbiBhcnJheSBvZiB0aGUgY29tYiBmaWx0ZXIgZGVsYXkgdGltZSB2YWx1ZXNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAdHlwZSB7QXJyYXl9XG5cdFx0ICovXG5cdCAgICB2YXIgY29tYkZpbHRlckRlbGF5VGltZXMgPSBbXG5cdCAgICAgICAgMTY4NyAvIDI1MDAwLFxuXHQgICAgICAgIDE2MDEgLyAyNTAwMCxcblx0ICAgICAgICAyMDUzIC8gMjUwMDAsXG5cdCAgICAgICAgMjI1MSAvIDI1MDAwXG5cdCAgICBdO1xuXHQgICAgLyoqXG5cdFx0ICogIHRoZSByZXNvbmFuY2VzIG9mIGVhY2ggb2YgdGhlIGNvbWIgZmlsdGVyc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHQgKi9cblx0ICAgIHZhciBjb21iRmlsdGVyUmVzb25hbmNlcyA9IFtcblx0ICAgICAgICAwLjc3Myxcblx0ICAgICAgICAwLjgwMixcblx0ICAgICAgICAwLjc1Myxcblx0ICAgICAgICAwLjczM1xuXHQgICAgXTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgYWxscGFzcyBmaWx0ZXIgZnJlcXVlbmNpZXNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAdHlwZSB7QXJyYXl9XG5cdFx0ICovXG5cdCAgICB2YXIgYWxscGFzc0ZpbHRlckZyZXFzID0gW1xuXHQgICAgICAgIDM0Nyxcblx0ICAgICAgICAxMTMsXG5cdCAgICAgICAgMzdcblx0ICAgIF07XG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuSkNSZXZlcmIgaXMgYSBzaW1wbGUgW1NjaHJvZWRlciBSZXZlcmJlcmF0b3JdKGh0dHBzOi8vY2NybWEuc3RhbmZvcmQuZWR1L35qb3MvcGFzcC9TY2hyb2VkZXJfUmV2ZXJiZXJhdG9ycy5odG1sKVxuXHRcdCAqICAgICAgICAgdHVuZWQgYnkgSm9obiBDaG93bmluZyBpbiAxOTcwLlxuXHRcdCAqICAgICAgICAgSXQgaXMgbWFkZSB1cCBvZiB0aHJlZSBhbGxwYXNzIGZpbHRlcnMgYW5kIGZvdXIgVG9uZS5GZWVkYmFja0NvbWJGaWx0ZXIuXG5cdFx0ICpcblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5FZmZlY3R9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfE9iamVjdH0gW3Jvb21TaXplXSBDb29yZWxhdGVzIHRvIHRoZSBkZWNheSB0aW1lLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciByZXZlcmIgPSBuZXcgVG9uZS5KQ1JldmVyYigwLjQpLmNvbm5lY3QoVG9uZS5NYXN0ZXIpO1xuXHRcdCAqIHZhciBkZWxheSA9IG5ldyBUb25lLkZlZWRiYWNrRGVsYXkoMC41KTtcblx0XHQgKiAvL2Nvbm5lY3RpbmcgdGhlIHN5bnRoIHRvIHJldmVyYiB0aHJvdWdoIGRlbGF5XG5cdFx0ICogdmFyIHN5bnRoID0gbmV3IFRvbmUuRHVvU3ludGgoKS5jaGFpbihkZWxheSwgcmV2ZXJiKTtcblx0XHQgKiBzeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZShcIkE0XCIsXCI4blwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuSkNSZXZlcmIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydyb29tU2l6ZSddLCBUb25lLkpDUmV2ZXJiKTtcblx0ICAgICAgICBUb25lLlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHJvb20gc2l6ZSBjb250cm9sIHZhbHVlcyBiZXR3ZWVuIFswLDFdXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucm9vbVNpemUgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5yb29tU2l6ZSwgVG9uZS5UeXBlLk5vcm1hbFJhbmdlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBzY2FsZSB0aGUgcm9vbSBzaXplXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuU2NhbGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NjYWxlUm9vbVNpemUgPSBuZXcgVG9uZS5TY2FsZSgtMC43MzMsIDAuMTk3KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBhIHNlcmllcyBvZiBhbGxwYXNzIGZpbHRlcnNcblx0XHRcdCAqICBAdHlwZSB7QXJyYXl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2FsbHBhc3NGaWx0ZXJzID0gW107XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgcGFyYWxsZWwgZmVlZGJhY2sgY29tYiBmaWx0ZXJzXG5cdFx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mZWVkYmFja0NvbWJGaWx0ZXJzID0gW107XG5cdCAgICAgICAgLy9tYWtlIHRoZSBhbGxwYXNzIGZpbHRlcnNcblx0ICAgICAgICBmb3IgKHZhciBhZiA9IDA7IGFmIDwgYWxscGFzc0ZpbHRlckZyZXFzLmxlbmd0aDsgYWYrKykge1xuXHQgICAgICAgICAgICB2YXIgYWxscGFzcyA9IHRoaXMuY29udGV4dC5jcmVhdGVCaXF1YWRGaWx0ZXIoKTtcblx0ICAgICAgICAgICAgYWxscGFzcy50eXBlID0gJ2FsbHBhc3MnO1xuXHQgICAgICAgICAgICBhbGxwYXNzLmZyZXF1ZW5jeS52YWx1ZSA9IGFsbHBhc3NGaWx0ZXJGcmVxc1thZl07XG5cdCAgICAgICAgICAgIHRoaXMuX2FsbHBhc3NGaWx0ZXJzLnB1c2goYWxscGFzcyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vYW5kIHRoZSBjb21iIGZpbHRlcnNcblx0ICAgICAgICBmb3IgKHZhciBjZiA9IDA7IGNmIDwgY29tYkZpbHRlckRlbGF5VGltZXMubGVuZ3RoOyBjZisrKSB7XG5cdCAgICAgICAgICAgIHZhciBmYmNmID0gbmV3IFRvbmUuRmVlZGJhY2tDb21iRmlsdGVyKGNvbWJGaWx0ZXJEZWxheVRpbWVzW2NmXSwgMC4xKTtcblx0ICAgICAgICAgICAgdGhpcy5fc2NhbGVSb29tU2l6ZS5jb25uZWN0KGZiY2YucmVzb25hbmNlKTtcblx0ICAgICAgICAgICAgZmJjZi5yZXNvbmFuY2UudmFsdWUgPSBjb21iRmlsdGVyUmVzb25hbmNlc1tjZl07XG5cdCAgICAgICAgICAgIHRoaXMuX2FsbHBhc3NGaWx0ZXJzW3RoaXMuX2FsbHBhc3NGaWx0ZXJzLmxlbmd0aCAtIDFdLmNvbm5lY3QoZmJjZik7XG5cdCAgICAgICAgICAgIGlmIChjZiA8IGNvbWJGaWx0ZXJEZWxheVRpbWVzLmxlbmd0aCAvIDIpIHtcblx0ICAgICAgICAgICAgICAgIGZiY2YuY29ubmVjdCh0aGlzLmVmZmVjdFJldHVybkwpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgZmJjZi5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuUik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5fZmVlZGJhY2tDb21iRmlsdGVycy5wdXNoKGZiY2YpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL2NoYWluIHRoZSBhbGxwYXNzIGZpbHRlcnMgdG9nZXRoZXJcblx0ICAgICAgICB0aGlzLnJvb21TaXplLmNvbm5lY3QodGhpcy5fc2NhbGVSb29tU2l6ZSk7XG5cdCAgICAgICAgVG9uZS5jb25uZWN0U2VyaWVzLmFwcGx5KFRvbmUsIHRoaXMuX2FsbHBhc3NGaWx0ZXJzKTtcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmRMLmNvbm5lY3QodGhpcy5fYWxscGFzc0ZpbHRlcnNbMF0pO1xuXHQgICAgICAgIHRoaXMuZWZmZWN0U2VuZFIuY29ubmVjdCh0aGlzLl9hbGxwYXNzRmlsdGVyc1swXSk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoWydyb29tU2l6ZSddKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkpDUmV2ZXJiLCBUb25lLlN0ZXJlb0VmZmVjdCk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGRlZmF1bHQgdmFsdWVzXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkpDUmV2ZXJiLmRlZmF1bHRzID0geyAncm9vbVNpemUnOiAwLjUgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuSkNSZXZlcmJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuSkNSZXZlcmIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICBmb3IgKHZhciBhcGYgPSAwOyBhcGYgPCB0aGlzLl9hbGxwYXNzRmlsdGVycy5sZW5ndGg7IGFwZisrKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2FsbHBhc3NGaWx0ZXJzW2FwZl0uZGlzY29ubmVjdCgpO1xuXHQgICAgICAgICAgICB0aGlzLl9hbGxwYXNzRmlsdGVyc1thcGZdID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fYWxscGFzc0ZpbHRlcnMgPSBudWxsO1xuXHQgICAgICAgIGZvciAodmFyIGZiY2YgPSAwOyBmYmNmIDwgdGhpcy5fZmVlZGJhY2tDb21iRmlsdGVycy5sZW5ndGg7IGZiY2YrKykge1xuXHQgICAgICAgICAgICB0aGlzLl9mZWVkYmFja0NvbWJGaWx0ZXJzW2ZiY2ZdLmRpc3Bvc2UoKTtcblx0ICAgICAgICAgICAgdGhpcy5fZmVlZGJhY2tDb21iRmlsdGVyc1tmYmNmXSA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2ZlZWRiYWNrQ29tYkZpbHRlcnMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFsncm9vbVNpemUnXSk7XG5cdCAgICAgICAgdGhpcy5yb29tU2l6ZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5yb29tU2l6ZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fc2NhbGVSb29tU2l6ZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc2NhbGVSb29tU2l6ZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuSkNSZXZlcmI7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBNaWQvU2lkZSBwcm9jZXNzaW5nIHNlcGFyYXRlcyB0aGUgdGhlICdtaWQnIHNpZ25hbFxuXHRcdCAqICAgICAgICAgKHdoaWNoIGNvbWVzIG91dCBvZiBib3RoIHRoZSBsZWZ0IGFuZCB0aGUgcmlnaHQgY2hhbm5lbClcblx0XHQgKiAgICAgICAgIGFuZCB0aGUgJ3NpZGUnICh3aGljaCBvbmx5IGNvbWVzIG91dCBvZiB0aGUgdGhlIHNpZGUgY2hhbm5lbHMpXG5cdFx0ICogICAgICAgICBhbmQgZWZmZWN0cyB0aGVtIHNlcGFyYXRlbHkgYmVmb3JlIGJlaW5nIHJlY29tYmluZWQuXG5cdFx0ICogICAgICAgICBBcHBsaWVzIGEgTWlkL1NpZGUgc2VwZXJhdGlvbiBhbmQgcmVjb21iaW5hdGlvbi5cblx0XHQgKiAgICAgICAgIEFsZ29yaXRobSBmb3VuZCBpbiBba3ZyYXVkaW8gZm9ydW1zXShodHRwOi8vd3d3Lmt2cmF1ZGlvLmNvbS9mb3J1bS92aWV3dG9waWMucGhwP3Q9MjEyNTg3KS5cblx0XHQgKiAgICAgICAgIDxicj48YnI+XG5cdFx0ICogICAgICAgICBUaGlzIGlzIGEgYmFzZS1jbGFzcyBmb3IgTWlkL1NpZGUgRWZmZWN0cy5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5FZmZlY3R9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqL1xuXHQgICAgVG9uZS5NaWRTaWRlRWZmZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuRWZmZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG1pZC9zaWRlIHNwbGl0XG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLk1pZFNpZGVTcGxpdH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZVNwbGl0ID0gbmV3IFRvbmUuTWlkU2lkZVNwbGl0KCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG1pZC9zaWRlIG1lcmdlXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLk1pZFNpZGVNZXJnZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZU1lcmdlID0gbmV3IFRvbmUuTWlkU2lkZU1lcmdlKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG1pZCBzZW5kLiBDb25uZWN0IHRvIG1pZCBwcm9jZXNzaW5nXG5cdFx0XHQgKiAgQHR5cGUge1RvbmV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMubWlkU2VuZCA9IHRoaXMuX21pZFNpZGVTcGxpdC5taWQ7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHNpZGUgc2VuZC4gQ29ubmVjdCB0byBzaWRlIHByb2Nlc3Npbmdcblx0XHRcdCAqICBAdHlwZSB7VG9uZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5zaWRlU2VuZCA9IHRoaXMuX21pZFNpZGVTcGxpdC5zaWRlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtaWQgcmV0dXJuIGNvbm5lY3Rpb25cblx0XHRcdCAqICBAdHlwZSB7R2Fpbk5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMubWlkUmV0dXJuID0gdGhpcy5fbWlkU2lkZU1lcmdlLm1pZDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgc2lkZSByZXR1cm4gY29ubmVjdGlvblxuXHRcdFx0ICogIEB0eXBlIHtHYWluTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5zaWRlUmV0dXJuID0gdGhpcy5fbWlkU2lkZU1lcmdlLnNpZGU7XG5cdCAgICAgICAgLy90aGUgY29ubmVjdGlvbnNcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmQuY29ubmVjdCh0aGlzLl9taWRTaWRlU3BsaXQpO1xuXHQgICAgICAgIHRoaXMuX21pZFNpZGVNZXJnZS5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLk1pZFNpZGVFZmZlY3QsIFRvbmUuRWZmZWN0KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuTWlkU2lkZUVmZmVjdH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NaWRTaWRlRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZVNwbGl0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9taWRTaWRlU3BsaXQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX21pZFNpZGVNZXJnZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbWlkU2lkZU1lcmdlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm1pZFNlbmQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuc2lkZVNlbmQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMubWlkUmV0dXJuID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnNpZGVSZXR1cm4gPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk1pZFNpZGVFZmZlY3Q7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLlBoYXNlciBpcyBhIHBoYXNlciBlZmZlY3QuIFBoYXNlcnMgd29yayBieSBjaGFuZ2luZyB0aGUgcGhhc2Vcblx0XHQgKiAgICAgICAgIG9mIGRpZmZlcmVudCBmcmVxdWVuY3kgY29tcG9uZW50cyBvZiBhbiBpbmNvbWluZyBzaWduYWwuIFJlYWQgbW9yZSBvblxuXHRcdCAqICAgICAgICAgW1dpa2lwZWRpYV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGhhc2VyXyhlZmZlY3QpKS5cblx0XHQgKiAgICAgICAgIEluc3BpcmF0aW9uIGZvciB0aGlzIHBoYXNlciBjb21lcyBmcm9tIFtUdW5hLmpzXShodHRwczovL2dpdGh1Yi5jb20vRGluYWhtb2UvdHVuYS8pLlxuXHRcdCAqXG5cdFx0ICpcdEBleHRlbmRzIHtUb25lLlN0ZXJlb0VmZmVjdH1cblx0XHQgKlx0QGNvbnN0cnVjdG9yXG5cdFx0ICpcdEBwYXJhbSB7RnJlcXVlbmN5fE9iamVjdH0gW2ZyZXF1ZW5jeV0gVGhlIHNwZWVkIG9mIHRoZSBwaGFzaW5nLlxuXHRcdCAqXHRAcGFyYW0ge251bWJlcn0gW29jdGF2ZXNdIFRoZSBvY3RhdmVzIG9mIHRoZSBlZmZlY3QuXG5cdFx0ICpcdEBwYXJhbSB7RnJlcXVlbmN5fSBbYmFzZUZyZXF1ZW5jeV0gVGhlIGJhc2UgZnJlcXVlbmN5IG9mIHRoZSBmaWx0ZXJzLlxuXHRcdCAqXHRAZXhhbXBsZVxuXHRcdCAqIHZhciBwaGFzZXIgPSBuZXcgVG9uZS5QaGFzZXIoe1xuXHRcdCAqIFx0XCJmcmVxdWVuY3lcIiA6IDE1LFxuXHRcdCAqIFx0XCJvY3RhdmVzXCIgOiA1LFxuXHRcdCAqIFx0XCJiYXNlRnJlcXVlbmN5XCIgOiAxMDAwXG5cdFx0ICogfSkudG9NYXN0ZXIoKTtcblx0XHQgKiB2YXIgc3ludGggPSBuZXcgVG9uZS5GTVN5bnRoKCkuY29ubmVjdChwaGFzZXIpO1xuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKFwiRTNcIiwgXCIyblwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuUGhhc2VyID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIC8vc2V0IHRoZSBkZWZhdWx0c1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdvY3RhdmVzJyxcblx0ICAgICAgICAgICAgJ2Jhc2VGcmVxdWVuY3knXG5cdCAgICAgICAgXSwgVG9uZS5QaGFzZXIpO1xuXHQgICAgICAgIFRvbmUuU3RlcmVvRWZmZWN0LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGxmbyB3aGljaCBjb250cm9scyB0aGUgZnJlcXVlbmN5IG9uIHRoZSBsZWZ0IHNpZGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5MRk99XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xmb0wgPSBuZXcgVG9uZS5MRk8ob3B0aW9ucy5mcmVxdWVuY3ksIDAsIDEpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBsZm8gd2hpY2ggY29udHJvbHMgdGhlIGZyZXF1ZW5jeSBvbiB0aGUgcmlnaHQgc2lkZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkxGT31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbGZvUiA9IG5ldyBUb25lLkxGTyhvcHRpb25zLmZyZXF1ZW5jeSwgMCwgMSk7XG5cdCAgICAgICAgdGhpcy5fbGZvUi5waGFzZSA9IDE4MDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgYmFzZSBtb2R1bGF0aW9uIGZyZXF1ZW5jeVxuXHRcdFx0ICogIEB0eXBlIHtudW1iZXJ9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2Jhc2VGcmVxdWVuY3kgPSBvcHRpb25zLmJhc2VGcmVxdWVuY3k7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG9jdGF2ZXMgb2YgdGhlIHBoYXNpbmdcblx0XHRcdCAqICBAdHlwZSB7bnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vY3RhdmVzID0gb3B0aW9ucy5vY3RhdmVzO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBxdWFsaXR5IGZhY3RvciBvZiB0aGUgZmlsdGVyc1xuXHRcdFx0ICogIEB0eXBlIHtQb3NpdGl2ZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLlEgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5RLCBUb25lLlR5cGUuUG9zaXRpdmUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBhcnJheSBvZiBmaWx0ZXJzIGZvciB0aGUgbGVmdCBzaWRlXG5cdFx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9maWx0ZXJzTCA9IHRoaXMuX21ha2VGaWx0ZXJzKG9wdGlvbnMuc3RhZ2VzLCB0aGlzLl9sZm9MLCB0aGlzLlEpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBhcnJheSBvZiBmaWx0ZXJzIGZvciB0aGUgbGVmdCBzaWRlXG5cdFx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9maWx0ZXJzUiA9IHRoaXMuX21ha2VGaWx0ZXJzKG9wdGlvbnMuc3RhZ2VzLCB0aGlzLl9sZm9SLCB0aGlzLlEpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogdGhlIGZyZXF1ZW5jeSBvZiB0aGUgZWZmZWN0XG5cdFx0XHQgKiBAdHlwZSB7VG9uZS5TaWduYWx9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IHRoaXMuX2xmb0wuZnJlcXVlbmN5O1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LnZhbHVlID0gb3B0aW9ucy5mcmVxdWVuY3k7XG5cdCAgICAgICAgLy9jb25uZWN0IHRoZW0gdXBcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmRMLmNvbm5lY3QodGhpcy5fZmlsdGVyc0xbMF0pO1xuXHQgICAgICAgIHRoaXMuZWZmZWN0U2VuZFIuY29ubmVjdCh0aGlzLl9maWx0ZXJzUlswXSk7XG5cdCAgICAgICAgdGhpcy5fZmlsdGVyc0xbb3B0aW9ucy5zdGFnZXMgLSAxXS5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuTCk7XG5cdCAgICAgICAgdGhpcy5fZmlsdGVyc1Jbb3B0aW9ucy5zdGFnZXMgLSAxXS5jb25uZWN0KHRoaXMuZWZmZWN0UmV0dXJuUik7XG5cdCAgICAgICAgLy9jb250cm9sIHRoZSBmcmVxdWVuY3kgd2l0aCBvbmUgTEZPXG5cdCAgICAgICAgdGhpcy5fbGZvTC5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9sZm9SLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLy9zZXQgdGhlIG9wdGlvbnNcblx0ICAgICAgICB0aGlzLmJhc2VGcmVxdWVuY3kgPSBvcHRpb25zLmJhc2VGcmVxdWVuY3k7XG5cdCAgICAgICAgdGhpcy5vY3RhdmVzID0gb3B0aW9ucy5vY3RhdmVzO1xuXHQgICAgICAgIC8vc3RhcnQgdGhlIGxmb1xuXHQgICAgICAgIHRoaXMuX2xmb0wuc3RhcnQoKTtcblx0ICAgICAgICB0aGlzLl9sZm9SLnN0YXJ0KCk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ1EnXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5QaGFzZXIsIFRvbmUuU3RlcmVvRWZmZWN0KTtcblx0ICAgIC8qKlxuXHRcdCAqICBkZWZhdWx0c1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtvYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLlBoYXNlci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZnJlcXVlbmN5JzogMC41LFxuXHQgICAgICAgICdvY3RhdmVzJzogMyxcblx0ICAgICAgICAnc3RhZ2VzJzogMTAsXG5cdCAgICAgICAgJ1EnOiAxMCxcblx0ICAgICAgICAnYmFzZUZyZXF1ZW5jeSc6IDM1MFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gc3RhZ2VzXG5cdFx0ICogIEByZXR1cm5zIHtBcnJheX0gdGhlIG51bWJlciBvZiBmaWx0ZXJzIGFsbCBjb25uZWN0ZWQgdG9nZXRoZXJcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUGhhc2VyLnByb3RvdHlwZS5fbWFrZUZpbHRlcnMgPSBmdW5jdGlvbiAoc3RhZ2VzLCBjb25uZWN0VG9GcmVxLCBRKSB7XG5cdCAgICAgICAgdmFyIGZpbHRlcnMgPSBuZXcgQXJyYXkoc3RhZ2VzKTtcblx0ICAgICAgICAvL21ha2UgYWxsIHRoZSBmaWx0ZXJzXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFnZXM7IGkrKykge1xuXHQgICAgICAgICAgICB2YXIgZmlsdGVyID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJpcXVhZEZpbHRlcigpO1xuXHQgICAgICAgICAgICBmaWx0ZXIudHlwZSA9ICdhbGxwYXNzJztcblx0ICAgICAgICAgICAgUS5jb25uZWN0KGZpbHRlci5RKTtcblx0ICAgICAgICAgICAgY29ubmVjdFRvRnJlcS5jb25uZWN0KGZpbHRlci5mcmVxdWVuY3kpO1xuXHQgICAgICAgICAgICBmaWx0ZXJzW2ldID0gZmlsdGVyO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBUb25lLmNvbm5lY3RTZXJpZXMuYXBwbHkoVG9uZSwgZmlsdGVycyk7XG5cdCAgICAgICAgcmV0dXJuIGZpbHRlcnM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG51bWJlciBvZiBvY3RhdmVzIHRoZSBwaGFzZSBnb2VzIGFib3ZlXG5cdFx0ICogdGhlIGJhc2VGcmVxdWVuY3lcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QaGFzZXIjXG5cdFx0ICogQHR5cGUge1Bvc2l0aXZlfVxuXHRcdCAqIEBuYW1lIG9jdGF2ZXNcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBoYXNlci5wcm90b3R5cGUsICdvY3RhdmVzJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb2N0YXZlcztcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG9jdGF2ZXMpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb2N0YXZlcyA9IG9jdGF2ZXM7XG5cdCAgICAgICAgICAgIHZhciBtYXggPSB0aGlzLl9iYXNlRnJlcXVlbmN5ICogTWF0aC5wb3coMiwgb2N0YXZlcyk7XG5cdCAgICAgICAgICAgIHRoaXMuX2xmb0wubWF4ID0gbWF4O1xuXHQgICAgICAgICAgICB0aGlzLl9sZm9SLm1heCA9IG1heDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB0aGUgYmFzZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlcnMuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuUGhhc2VyI1xuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICogQG5hbWUgYmFzZUZyZXF1ZW5jeVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGhhc2VyLnByb3RvdHlwZSwgJ2Jhc2VGcmVxdWVuY3knLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYXNlRnJlcXVlbmN5O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoZnJlcSkge1xuXHQgICAgICAgICAgICB0aGlzLl9iYXNlRnJlcXVlbmN5ID0gZnJlcTtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvTC5taW4gPSBmcmVxO1xuXHQgICAgICAgICAgICB0aGlzLl9sZm9SLm1pbiA9IGZyZXE7XG5cdCAgICAgICAgICAgIHRoaXMub2N0YXZlcyA9IHRoaXMuX29jdGF2ZXM7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGhhc2VyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBoYXNlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdRJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMuUS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5RID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9sZm9MLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9sZm9MID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9sZm9SLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9sZm9SID0gbnVsbDtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2ZpbHRlcnNMLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnNMW2ldLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICAgICAgdGhpcy5fZmlsdGVyc0xbaV0gPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9maWx0ZXJzTCA9IG51bGw7XG5cdCAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLl9maWx0ZXJzUi5sZW5ndGg7IGorKykge1xuXHQgICAgICAgICAgICB0aGlzLl9maWx0ZXJzUltqXS5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZpbHRlcnNSW2pdID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fZmlsdGVyc1IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5QaGFzZXI7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBKdXN0IGxpa2UgYSBzdGVyZW8gZmVlZGJhY2sgZWZmZWN0LCBidXQgdGhlIGZlZWRiYWNrIGlzIHJvdXRlZCBmcm9tIGxlZnQgdG8gcmlnaHRcblx0XHQgKiAgICAgICAgIGFuZCByaWdodCB0byBsZWZ0IGluc3RlYWQgb2Ygb24gdGhlIHNhbWUgY2hhbm5lbC5cblx0XHQgKlxuXHRcdCAqXHRAY29uc3RydWN0b3Jcblx0XHQgKlx0QGV4dGVuZHMge1RvbmUuU3RlcmVvRWZmZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TdGVyZW9YRmVlZGJhY2tFZmZlY3QgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydmZWVkYmFjayddLCBUb25lLkZlZWRiYWNrRWZmZWN0KTtcblx0ICAgICAgICBUb25lLlN0ZXJlb0VmZmVjdC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhbW91bnQgb2YgZmVlZGJhY2sgZnJvbSB0aGUgb3V0cHV0XG5cdFx0XHQgKiAgYmFjayBpbnRvIHRoZSBpbnB1dCBvZiB0aGUgZWZmZWN0IChyb3V0ZWRcblx0XHRcdCAqICBhY3Jvc3MgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMpLlxuXHRcdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZlZWRiYWNrID0gbmV3IFRvbmUuU2lnbmFsKG9wdGlvbnMuZmVlZGJhY2ssIFRvbmUuVHlwZS5Ob3JtYWxSYW5nZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGxlZnQgc2lkZSBmZWViYWNrXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tMUiA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgcmlnaHQgc2lkZSBmZWViYWNrXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tSTCA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAvL2Nvbm5lY3QgaXQgdXBcblx0ICAgICAgICB0aGlzLmVmZmVjdFJldHVybkwuY2hhaW4odGhpcy5fZmVlZGJhY2tMUiwgdGhpcy5lZmZlY3RTZW5kUik7XG5cdCAgICAgICAgdGhpcy5lZmZlY3RSZXR1cm5SLmNoYWluKHRoaXMuX2ZlZWRiYWNrUkwsIHRoaXMuZWZmZWN0U2VuZEwpO1xuXHQgICAgICAgIHRoaXMuZmVlZGJhY2suZmFuKHRoaXMuX2ZlZWRiYWNrTFIuZ2FpbiwgdGhpcy5fZmVlZGJhY2tSTC5nYWluKTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbJ2ZlZWRiYWNrJ10pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuU3RlcmVvWEZlZWRiYWNrRWZmZWN0LCBUb25lLlN0ZXJlb0VmZmVjdCk7XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuU3RlcmVvWEZlZWRiYWNrRWZmZWN0fSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlN0ZXJlb1hGZWVkYmFja0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlN0ZXJlb0VmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFsnZmVlZGJhY2snXSk7XG5cdCAgICAgICAgdGhpcy5mZWVkYmFjay5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5mZWVkYmFjayA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tMUi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tMUiA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tSTC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tSTCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuU3RlcmVvWEZlZWRiYWNrRWZmZWN0O1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIFRvbmUuUGluZ1BvbmdEZWxheSBpcyBhIGZlZWRiYWNrIGRlbGF5IGVmZmVjdCB3aGVyZSB0aGUgZWNobyBpcyBoZWFyZFxuXHRcdCAqICAgICAgICAgIGZpcnN0IGluIG9uZSBjaGFubmVsIGFuZCBuZXh0IGluIHRoZSBvcHBvc2l0ZSBjaGFubmVsLiBJbiBhIHN0ZXJlb1xuXHRcdCAqICAgICAgICAgIHN5c3RlbSB0aGVzZSBhcmUgdGhlIHJpZ2h0IGFuZCBsZWZ0IGNoYW5uZWxzLlxuXHRcdCAqICAgICAgICAgIFBpbmdQb25nRGVsYXkgaW4gbW9yZSBzaW1wbGlmaWVkIHRlcm1zIGlzIHR3byBUb25lLkZlZWRiYWNrRGVsYXlzXG5cdFx0ICogICAgICAgICAgd2l0aCBpbmRlcGVuZGVudCBkZWxheSB2YWx1ZXMuIEVhY2ggZGVsYXkgaXMgcm91dGVkIHRvIG9uZSBjaGFubmVsXG5cdFx0ICogICAgICAgICAgKGxlZnQgb3IgcmlnaHQpLCBhbmQgdGhlIGNoYW5uZWwgdHJpZ2dlcmVkIHNlY29uZCB3aWxsIGFsd2F5c1xuXHRcdCAqICAgICAgICAgIHRyaWdnZXIgYXQgdGhlIHNhbWUgaW50ZXJ2YWwgYWZ0ZXIgdGhlIGZpcnN0LlxuXHRcdCAqXG5cdFx0ICogXHRAY29uc3RydWN0b3Jcblx0XHQgKiBcdEBleHRlbmRzIHtUb25lLlN0ZXJlb1hGZWVkYmFja0VmZmVjdH1cblx0XHQgKiAgQHBhcmFtIHtUaW1lfE9iamVjdH0gW2RlbGF5VGltZV0gVGhlIGRlbGF5VGltZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGVjaG9zLlxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlPX0gZmVlZGJhY2sgVGhlIGFtb3VudCBvZiB0aGUgZWZmZWN0ZWQgc2lnbmFsIHdoaWNoXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBmZWQgYmFjayB0aHJvdWdoIHRoZSBkZWxheS5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgcGluZ1BvbmcgPSBuZXcgVG9uZS5QaW5nUG9uZ0RlbGF5KFwiNG5cIiwgMC4yKS50b01hc3RlcigpO1xuXHRcdCAqIHZhciBkcnVtID0gbmV3IFRvbmUuRHJ1bVN5bnRoKCkuY29ubmVjdChwaW5nUG9uZyk7XG5cdFx0ICogZHJ1bS50cmlnZ2VyQXR0YWNrUmVsZWFzZShcIkM0XCIsIFwiMzJuXCIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QaW5nUG9uZ0RlbGF5ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2RlbGF5VGltZScsXG5cdCAgICAgICAgICAgICdmZWVkYmFjaydcblx0ICAgICAgICBdLCBUb25lLlBpbmdQb25nRGVsYXkpO1xuXHQgICAgICAgIFRvbmUuU3RlcmVvWEZlZWRiYWNrRWZmZWN0LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGRlbGF5IG5vZGUgb24gdGhlIGxlZnQgc2lkZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkRlbGF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sZWZ0RGVsYXkgPSBuZXcgVG9uZS5EZWxheSgwLCBvcHRpb25zLm1heERlbGF5VGltZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGRlbGF5IG5vZGUgb24gdGhlIHJpZ2h0IHNpZGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5EZWxheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcmlnaHREZWxheSA9IG5ldyBUb25lLkRlbGF5KDAsIG9wdGlvbnMubWF4RGVsYXlUaW1lKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgcHJlZGVsYXkgb24gdGhlIHJpZ2h0IHNpZGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5EZWxheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcmlnaHRQcmVEZWxheSA9IG5ldyBUb25lLkRlbGF5KDAsIG9wdGlvbnMubWF4RGVsYXlUaW1lKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgZGVsYXkgdGltZSBzaWduYWxcblx0XHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmRlbGF5VGltZSA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLmRlbGF5VGltZSwgVG9uZS5UeXBlLlRpbWUpO1xuXHQgICAgICAgIC8vY29ubmVjdCBpdCB1cFxuXHQgICAgICAgIHRoaXMuZWZmZWN0U2VuZEwuY2hhaW4odGhpcy5fbGVmdERlbGF5LCB0aGlzLmVmZmVjdFJldHVybkwpO1xuXHQgICAgICAgIHRoaXMuZWZmZWN0U2VuZFIuY2hhaW4odGhpcy5fcmlnaHRQcmVEZWxheSwgdGhpcy5fcmlnaHREZWxheSwgdGhpcy5lZmZlY3RSZXR1cm5SKTtcblx0ICAgICAgICB0aGlzLmRlbGF5VGltZS5mYW4odGhpcy5fbGVmdERlbGF5LmRlbGF5VGltZSwgdGhpcy5fcmlnaHREZWxheS5kZWxheVRpbWUsIHRoaXMuX3JpZ2h0UHJlRGVsYXkuZGVsYXlUaW1lKTtcblx0ICAgICAgICAvL3JlYXJyYW5nZWQgdGhlIGZlZWRiYWNrIHRvIGJlIGFmdGVyIHRoZSByaWdodFByZURlbGF5XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tMUi5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tMUi5jb25uZWN0KHRoaXMuX3JpZ2h0RGVsYXkpO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFsnZGVsYXlUaW1lJ10pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuUGluZ1BvbmdEZWxheSwgVG9uZS5TdGVyZW9YRmVlZGJhY2tFZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuUGluZ1BvbmdEZWxheS5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZGVsYXlUaW1lJzogMC4yNSxcblx0ICAgICAgICAnbWF4RGVsYXlUaW1lJzogMVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGluZ1BvbmdEZWxheX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QaW5nUG9uZ0RlbGF5LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU3RlcmVvWEZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fbGVmdERlbGF5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9sZWZ0RGVsYXkgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3JpZ2h0RGVsYXkuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3JpZ2h0RGVsYXkgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3JpZ2h0UHJlRGVsYXkuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3JpZ2h0UHJlRGVsYXkgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFsnZGVsYXlUaW1lJ10pO1xuXHQgICAgICAgIHRoaXMuZGVsYXlUaW1lLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmRlbGF5VGltZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuUGluZ1BvbmdEZWxheTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuUGl0Y2hTaGlmdCBkb2VzIG5lYXItcmVhbHRpbWUgcGl0Y2ggc2hpZnRpbmcgdG8gdGhlIGluY29taW5nIHNpZ25hbC5cblx0XHQgKiAgICAgICAgIFRoZSBlZmZlY3QgaXMgYWNoaWV2ZWQgYnkgc3BlZWRpbmcgdXAgb3Igc2xvd2luZyBkb3duIHRoZSBkZWxheVRpbWVcblx0XHQgKiAgICAgICAgIG9mIGEgRGVsYXlOb2RlIHVzaW5nIGEgc2F3dG9vdGggd2F2ZS5cblx0XHQgKiAgICAgICAgIEFsZ29yaXRobSBmb3VuZCBpbiBbdGhpcyBwZGZdKGh0dHA6Ly9kc3AtYm9vay5uYXJvZC5ydS9zb3VuZHByb2MucGRmKS5cblx0XHQgKiAgICAgICAgIEFkZGl0aW9uYWwgcmVmZXJlbmNlIGJ5IFtNaWxsZXIgUHVja2V0XShodHRwOi8vbXNwLnVjc2QuZWR1L3RlY2huaXF1ZXMvdjAuMTEvYm9vay1odG1sL25vZGUxMTUuaHRtbCkuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuRmVlZGJhY2tFZmZlY3R9XG5cdFx0ICogIEBwYXJhbSB7SW50ZXJ2YWw9fSBwaXRjaCBUaGUgaW50ZXJ2YWwgdG8gdHJhbnNwb3NlIHRoZSBpbmNvbWluZyBzaWduYWwgYnkuXG5cdFx0ICovXG5cdCAgICBUb25lLlBpdGNoU2hpZnQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWydwaXRjaCddLCBUb25lLlBpdGNoU2hpZnQpO1xuXHQgICAgICAgIFRvbmUuRmVlZGJhY2tFZmZlY3QuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgcGl0Y2ggc2lnbmFsXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLlNpZ25hbH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZnJlcXVlbmN5ID0gbmV3IFRvbmUuU2lnbmFsKDApO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFVzZXMgdHdvIERlbGF5Tm9kZXMgdG8gY292ZXIgdXAgdGhlIGp1bXAgaW5cblx0XHRcdCAqICB0aGUgc2F3dG9vdGggd2F2ZS5cblx0XHRcdCAqICBAdHlwZSAge0RlbGF5Tm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZGVsYXlBID0gbmV3IFRvbmUuRGVsYXkoMCwgMSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGZpcnN0IExGTy5cblx0XHRcdCAqICBAdHlwZSAge1RvbmUuTEZPfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sZm9BID0gbmV3IFRvbmUuTEZPKHtcblx0ICAgICAgICAgICAgJ21pbic6IDAsXG5cdCAgICAgICAgICAgICdtYXgnOiAwLjEsXG5cdCAgICAgICAgICAgICd0eXBlJzogJ3Nhd3Rvb3RoJ1xuXHQgICAgICAgIH0pLmNvbm5lY3QodGhpcy5fZGVsYXlBLmRlbGF5VGltZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHNlY29uZCBEZWxheU5vZGVcblx0XHRcdCAqICBAdHlwZSAge0RlbGF5Tm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZGVsYXlCID0gbmV3IFRvbmUuRGVsYXkoMCwgMSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGZpcnN0IExGTy5cblx0XHRcdCAqICBAdHlwZSAge1RvbmUuTEZPfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sZm9CID0gbmV3IFRvbmUuTEZPKHtcblx0ICAgICAgICAgICAgJ21pbic6IDAsXG5cdCAgICAgICAgICAgICdtYXgnOiAwLjEsXG5cdCAgICAgICAgICAgICd0eXBlJzogJ3Nhd3Rvb3RoJyxcblx0ICAgICAgICAgICAgJ3BoYXNlJzogMTgwXG5cdCAgICAgICAgfSkuY29ubmVjdCh0aGlzLl9kZWxheUIuZGVsYXlUaW1lKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBDcm9zc2ZhZGUgcXVpY2tseSBiZXR3ZWVuIHRoZSB0d28gZGVsYXkgbGluZXNcblx0XHRcdCAqICB0byBjb3ZlciB1cCB0aGUganVtcCBpbiB0aGUgc2F3dG9vdGggd2F2ZVxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5Dcm9zc0ZhZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2Nyb3NzRmFkZSA9IG5ldyBUb25lLkNyb3NzRmFkZSgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIExGTyB3aGljaCBhbHRlcm5hdGVzIGJldHdlZW4gdGhlIHR3b1xuXHRcdFx0ICogIGRlbGF5IGxpbmVzIHRvIGNvdmVyIHVwIHRoZSBkaXNwYXJpdHkgaW4gdGhlXG5cdFx0XHQgKiAgc2F3dG9vdGggd2F2ZS5cblx0XHRcdCAqICBAdHlwZSAge1RvbmUuTEZPfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9jcm9zc0ZhZGVMRk8gPSBuZXcgVG9uZS5MRk8oe1xuXHQgICAgICAgICAgICAnbWluJzogMCxcblx0ICAgICAgICAgICAgJ21heCc6IDEsXG5cdCAgICAgICAgICAgICd0eXBlJzogJ3RyaWFuZ2xlJyxcblx0ICAgICAgICAgICAgJ3BoYXNlJzogOTBcblx0ICAgICAgICB9KS5jb25uZWN0KHRoaXMuX2Nyb3NzRmFkZS5mYWRlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGVsYXkgbm9kZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkRlbGF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mZWVkYmFja0RlbGF5ID0gbmV3IFRvbmUuRGVsYXkob3B0aW9ucy5kZWxheVRpbWUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhbW91bnQgb2YgZGVsYXkgb24gdGhlIGlucHV0IHNpZ25hbFxuXHRcdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGVsYXlUaW1lID0gdGhpcy5fZmVlZGJhY2tEZWxheS5kZWxheVRpbWU7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoJ2RlbGF5VGltZScpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEhvbGQgdGhlIGN1cnJlbnQgcGl0Y2hcblx0XHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9waXRjaCA9IG9wdGlvbnMucGl0Y2g7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgSG9sZCB0aGUgY3VycmVudCB3aW5kb3dTaXplXG5cdFx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fd2luZG93U2l6ZSA9IG9wdGlvbnMud2luZG93U2l6ZTtcblx0ICAgICAgICAvL2Nvbm5lY3QgdGhlIHR3byBkZWxheSBsaW5lcyB1cFxuXHQgICAgICAgIHRoaXMuX2RlbGF5QS5jb25uZWN0KHRoaXMuX2Nyb3NzRmFkZS5hKTtcblx0ICAgICAgICB0aGlzLl9kZWxheUIuY29ubmVjdCh0aGlzLl9jcm9zc0ZhZGUuYik7XG5cdCAgICAgICAgLy9jb25uZWN0IHRoZSBmcmVxdWVuY3lcblx0ICAgICAgICB0aGlzLl9mcmVxdWVuY3kuZmFuKHRoaXMuX2xmb0EuZnJlcXVlbmN5LCB0aGlzLl9sZm9CLmZyZXF1ZW5jeSwgdGhpcy5fY3Jvc3NGYWRlTEZPLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLy9yb3V0ZSB0aGUgaW5wdXRcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmQuZmFuKHRoaXMuX2RlbGF5QSwgdGhpcy5fZGVsYXlCKTtcblx0ICAgICAgICB0aGlzLl9jcm9zc0ZhZGUuY2hhaW4odGhpcy5fZmVlZGJhY2tEZWxheSwgdGhpcy5lZmZlY3RSZXR1cm4pO1xuXHQgICAgICAgIC8vc3RhcnQgdGhlIExGT3MgYXQgdGhlIHNhbWUgdGltZVxuXHQgICAgICAgIHZhciBub3cgPSB0aGlzLm5vdygpO1xuXHQgICAgICAgIHRoaXMuX2xmb0Euc3RhcnQobm93KTtcblx0ICAgICAgICB0aGlzLl9sZm9CLnN0YXJ0KG5vdyk7XG5cdCAgICAgICAgdGhpcy5fY3Jvc3NGYWRlTEZPLnN0YXJ0KG5vdyk7XG5cdCAgICAgICAgLy9zZXQgdGhlIGluaXRpYWwgdmFsdWVcblx0ICAgICAgICB0aGlzLndpbmRvd1NpemUgPSB0aGlzLl93aW5kb3dTaXplO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuUGl0Y2hTaGlmdCwgVG9uZS5GZWVkYmFja0VmZmVjdCk7XG5cdCAgICAvKipcblx0XHQgKiAgZGVmYXVsdCB2YWx1ZXNcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqICBAY29uc3Rcblx0XHQgKi9cblx0ICAgIFRvbmUuUGl0Y2hTaGlmdC5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAncGl0Y2gnOiAwLFxuXHQgICAgICAgICd3aW5kb3dTaXplJzogMC4xLFxuXHQgICAgICAgICdkZWxheVRpbWUnOiAwLFxuXHQgICAgICAgICdmZWVkYmFjayc6IDBcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBSZXBpdGNoIHRoZSBpbmNvbWluZyBzaWduYWwgYnkgc29tZSBpbnRlcnZhbCAobWVhc3VyZWRcblx0XHQgKiBpbiBzZW1pLXRvbmVzKS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QaXRjaFNoaWZ0I1xuXHRcdCAqIEB0eXBlIHtJbnRlcnZhbH1cblx0XHQgKiBAbmFtZSBwaXRjaFxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogcGl0Y2hTaGlmdC5waXRjaCA9IC0xMjsgLy9kb3duIG9uZSBvY3RhdmVcblx0XHQgKiBwaXRjaFNoaWZ0LnBpdGNoID0gNzsgLy91cCBhIGZpZnRoXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QaXRjaFNoaWZ0LnByb3RvdHlwZSwgJ3BpdGNoJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2g7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChpbnRlcnZhbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9waXRjaCA9IGludGVydmFsO1xuXHQgICAgICAgICAgICB2YXIgZmFjdG9yID0gMDtcblx0ICAgICAgICAgICAgaWYgKGludGVydmFsIDwgMCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbGZvQS5taW4gPSAwO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbGZvQS5tYXggPSB0aGlzLl93aW5kb3dTaXplO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbGZvQi5taW4gPSAwO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fbGZvQi5tYXggPSB0aGlzLl93aW5kb3dTaXplO1xuXHQgICAgICAgICAgICAgICAgZmFjdG9yID0gVG9uZS5pbnRlcnZhbFRvRnJlcXVlbmN5UmF0aW8oaW50ZXJ2YWwgLSAxKSArIDE7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9sZm9BLm1pbiA9IHRoaXMuX3dpbmRvd1NpemU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9sZm9BLm1heCA9IDA7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9sZm9CLm1pbiA9IHRoaXMuX3dpbmRvd1NpemU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9sZm9CLm1heCA9IDA7XG5cdCAgICAgICAgICAgICAgICBmYWN0b3IgPSBUb25lLmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyhpbnRlcnZhbCkgLSAxO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX2ZyZXF1ZW5jeS52YWx1ZSA9IGZhY3RvciAqICgxLjIgLyB0aGlzLl93aW5kb3dTaXplKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB3aW5kb3cgc2l6ZSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIHRoZSBzYW1wbGUgbGVuZ3RoIGluIGEgbG9vcGluZyBzYW1wbGVyLlxuXHRcdCAqIFNtYWxsZXIgdmFsdWVzIGFyZSBkZXNpcmFibGUgZm9yIGEgbGVzcyBub3RpY2VhYmxlIGRlbGF5IHRpbWUgb2YgdGhlIHBpdGNoIHNoaWZ0ZWRcblx0XHQgKiBzaWduYWwsIGJ1dCBsYXJnZXIgdmFsdWVzIHdpbGwgcmVzdWx0IGluIHNtb290aGVyIHBpdGNoIHNoaWZ0aW5nIGZvciBsYXJnZXIgaW50ZXJ2YWxzLlxuXHRcdCAqIEEgbm9taW5hbCByYW5nZSBvZiAwLjAzIHRvIDAuMSBpcyByZWNvbW1lbmRlZC5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QaXRjaFNoaWZ0I1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIHdpbmRvd1NpemVcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHBpdGNoU2hpZnQud2luZG93U2l6ZSA9IDAuMTtcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBpdGNoU2hpZnQucHJvdG90eXBlLCAnd2luZG93U2l6ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd1NpemU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChzaXplKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3dpbmRvd1NpemUgPSB0aGlzLnRvU2Vjb25kcyhzaXplKTtcblx0ICAgICAgICAgICAgdGhpcy5waXRjaCA9IHRoaXMuX3BpdGNoO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5QaXRjaFNoaWZ0fSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QaXRjaFNoaWZ0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuRmVlZGJhY2tFZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9mcmVxdWVuY3kuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlBLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICB0aGlzLl9kZWxheUEgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5Qi5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlCID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9sZm9BLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9sZm9BID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9sZm9CLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9sZm9CID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9jcm9zc0ZhZGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2Nyb3NzRmFkZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fY3Jvc3NGYWRlTEZPLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9jcm9zc0ZhZGVMRk8gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKCdkZWxheVRpbWUnKTtcblx0ICAgICAgICB0aGlzLl9mZWVkYmFja0RlbGF5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9mZWVkYmFja0RlbGF5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmRlbGF5VGltZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuUGl0Y2hTaGlmdDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBXcmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIEJ1ZmZlclNvdXJjZU5vZGUuXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKiAgQHBhcmFtICB7QXVkaW9CdWZmZXJ8VG9uZS5CdWZmZXJ9ICBidWZmZXIgICBUaGUgYnVmZmVyIHRvIHBsYXlcblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBvbmxvYWQgIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgaXMgZG9uZSBwbGF5aW5nLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXJTb3VyY2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnYnVmZmVyJyxcblx0ICAgICAgICAgICAgJ29ubG9hZCdcblx0ICAgICAgICBdLCBUb25lLkJ1ZmZlclNvdXJjZSk7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGFmdGVyIHRoZVxuXHRcdFx0ICogIGJ1ZmZlciBzb3VyY2UgaXMgZG9uZSBwbGF5aW5nLlxuXHRcdFx0ICogIEB0eXBlICB7RnVuY3Rpb259XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm9uZW5kZWQgPSBvcHRpb25zLm9uZW5kZWQ7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHRpbWUgdGhhdCB0aGUgYnVmZmVyIHdhcyBzdGFydGVkLlxuXHRcdFx0ICogIEB0eXBlICB7TnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSAtMTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBbiBhZGRpdGlvbmFsIGZsYWcgaWYgdGhlIGFjdHVhbCBCdWZmZXJTb3VyY2VOb2RlXG5cdFx0XHQgKiAgaGFzIGJlZW4gc3RhcnRlZC4gYi9jIHN0b3BwaW5nIGFuIHVuc3RhcnRlZCBidWZmZXJcblx0XHRcdCAqICB3aWxsIHRocm93IGl0IGludG8gYW4gaW52YWxpZCBzdGF0ZVxuXHRcdFx0ICogIEB0eXBlICB7Qm9vbGVhbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc291cmNlU3RhcnRlZCA9IGZhbHNlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEZsYWcgaWYgdGhlIHNvdXJjZSBoYXMgYWxyZWFkeSBiZWVuIHN0b3BwZWRcblx0XHRcdCAqICBAdHlwZSAge0Jvb2xlYW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NvdXJjZVN0b3BwZWQgPSBmYWxzZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdGltZSB0aGF0IHRoZSBidWZmZXIgaXMgc2NoZWR1bGVkIHRvIHN0b3AuXG5cdFx0XHQgKiAgQHR5cGUgIHtOdW1iZXJ9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N0b3BUaW1lID0gLTE7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGdhaW4gbm9kZSB3aGljaCBlbnZlbG9wZXMgdGhlIEJ1ZmZlclNvdXJjZVxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5HYWlufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9nYWluTm9kZSA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBidWZmZXIgc291cmNlXG5cdFx0XHQgKiAgQHR5cGUgIHtBdWRpb0J1ZmZlclNvdXJjZU5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcblx0ICAgICAgICB0aGlzLl9zb3VyY2UuY29ubmVjdCh0aGlzLl9nYWluTm9kZSk7XG5cdCAgICAgICAgdGhpcy5fc291cmNlLm9uZW5kZWQgPSB0aGlzLl9vbmVuZGVkLmJpbmQodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgcHJpdmF0ZSBidWZmZXIgaW5zdGFuY2Vcblx0XHRcdCAqIEB0eXBlIHtUb25lLkJ1ZmZlcn1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9idWZmZXIgPSBuZXcgVG9uZS5CdWZmZXIob3B0aW9ucy5idWZmZXIsIG9wdGlvbnMub25sb2FkKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgcGxheWJhY2tSYXRlIG9mIHRoZSBidWZmZXJcblx0XHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5wbGF5YmFja1JhdGUgPSBuZXcgVG9uZS5QYXJhbSh0aGlzLl9zb3VyY2UucGxheWJhY2tSYXRlLCBUb25lLlR5cGUuUG9zaXRpdmUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBmYWRlSW4gdGltZSBvZiB0aGUgYW1wbGl0dWRlIGVudmVsb3BlLlxuXHRcdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5mYWRlSW4gPSBvcHRpb25zLmZhZGVJbjtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZmFkZU91dCB0aW1lIG9mIHRoZSBhbXBsaXR1ZGUgZW52ZWxvcGUuXG5cdFx0XHQgKiAgQHR5cGUge1RpbWV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZhZGVPdXQgPSBvcHRpb25zLmZhZGVPdXQ7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgY3VydmUgYXBwbGllZCB0byB0aGUgZmFkZXMsIGVpdGhlciBcImxpbmVhclwiIG9yIFwiZXhwb25lbnRpYWxcIlxuXHRcdFx0ICogQHR5cGUge1N0cmluZ31cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuY3VydmUgPSBvcHRpb25zLmN1cnZlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSB2YWx1ZSB0aGF0IHRoZSBidWZmZXIgcmFtcHMgdG9cblx0XHRcdCAqICBAdHlwZSB7R2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZ2FpbiA9IDE7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgb25lbmRlZCB0aW1lb3V0XG5cdFx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX29uZW5kZWRUaW1lb3V0ID0gLTE7XG5cdCAgICAgICAgLy9zZXQgc29tZSB2YWx1ZXMgaW5pdGlhbGx5XG5cdCAgICAgICAgdGhpcy5sb29wID0gb3B0aW9ucy5sb29wO1xuXHQgICAgICAgIHRoaXMubG9vcFN0YXJ0ID0gb3B0aW9ucy5sb29wU3RhcnQ7XG5cdCAgICAgICAgdGhpcy5sb29wRW5kID0gb3B0aW9ucy5sb29wRW5kO1xuXHQgICAgICAgIHRoaXMucGxheWJhY2tSYXRlLnZhbHVlID0gb3B0aW9ucy5wbGF5YmFja1JhdGU7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5CdWZmZXJTb3VyY2UsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXJTb3VyY2UuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ29uZW5kZWQnOiBUb25lLm5vT3AsXG5cdCAgICAgICAgJ29ubG9hZCc6IFRvbmUubm9PcCxcblx0ICAgICAgICAnbG9vcCc6IGZhbHNlLFxuXHQgICAgICAgICdsb29wU3RhcnQnOiAwLFxuXHQgICAgICAgICdsb29wRW5kJzogMCxcblx0ICAgICAgICAnZmFkZUluJzogMCxcblx0ICAgICAgICAnZmFkZU91dCc6IDAsXG5cdCAgICAgICAgJ2N1cnZlJzogJ2xpbmVhcicsXG5cdCAgICAgICAgJ3BsYXliYWNrUmF0ZSc6IDFcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmV0dXJucyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIHNvdXJjZSwgZWl0aGVyIFwic3RhcnRlZFwiIG9yIFwic3RvcHBlZFwiLlxuXHRcdCAqICBAdHlwZSB7VG9uZS5TdGF0ZX1cblx0XHQgKiAgQHJlYWRPbmx5XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkJ1ZmZlclNvdXJjZSNcblx0XHQgKiAgQG5hbWUgc3RhdGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUsICdzdGF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGVBdFRpbWUodGhpcy5ub3coKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgR2V0IHRoZSBwbGF5YmFjayBzdGF0ZSBhdCB0aGUgZ2l2ZW4gdGltZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSAgdGltZSAgVGhlIHRpbWUgdG8gdGVzdCB0aGUgc3RhdGUgYXRcblx0XHQgKiAgQHJldHVybiAge1RvbmUuU3RhdGV9ICBUaGUgcGxheWJhY2sgc3RhdGUuIFxuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXJTb3VyY2UucHJvdG90eXBlLmdldFN0YXRlQXRUaW1lID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuX3N0YXJ0VGltZSAhPT0gLTEgJiYgdGltZSA+PSB0aGlzLl9zdGFydFRpbWUgJiYgIXRoaXMuX3NvdXJjZVN0b3BwZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuU3RhdGUuU3RhcnRlZDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gVG9uZS5TdGF0ZS5TdG9wcGVkO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU3RhcnQgdGhlIGJ1ZmZlclxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbc3RhcnRUaW1lPW5vd10gV2hlbiB0aGUgcGxheWVyIHNob3VsZCBzdGFydC5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW29mZnNldD0wXSBUaGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2FtcGxlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydCBhdC5cblx0XHQgKiAgQHBhcmFtICB7VGltZT19IGR1cmF0aW9uIEhvdyBsb25nIHRoZSBzYW1wbGUgc2hvdWxkIHBsYXkuIElmIG5vIGR1cmF0aW9uXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGdpdmVuLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIGZ1bGwgbGVuZ3RoXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzYW1wbGUgKG1pbnVzIGFueSBvZmZzZXQpXG5cdFx0ICogIEBwYXJhbSAge0dhaW59ICBbZ2Fpbj0xXSAgVGhlIGdhaW4gdG8gcGxheSB0aGUgYnVmZmVyIGJhY2sgYXQuXG5cdFx0ICogIEBwYXJhbSAge1RpbWU9fSAgZmFkZUluVGltZSAgVGhlIG9wdGlvbmFsIGZhZGVJbiByYW1wIHRpbWUuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkJ1ZmZlclNvdXJjZX0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQnVmZmVyU291cmNlLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICh0aW1lLCBvZmZzZXQsIGR1cmF0aW9uLCBnYWluLCBmYWRlSW5UaW1lKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX3N0YXJ0VGltZSAhPT0gLTEpIHtcblx0ICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb25lLkJ1ZmZlclNvdXJjZSBjYW4gb25seSBiZSBzdGFydGVkIG9uY2UuJyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghdGhpcy5idWZmZXIubG9hZGVkKSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9uZS5CdWZmZXJTb3VyY2U6IGJ1ZmZlciBpcyBlaXRoZXIgbm90IHNldCBvciBub3QgbG9hZGVkLicpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgLy9pZiBpdCdzIGEgbG9vcCB0aGUgZGVmYXVsdCBvZmZzZXQgaXMgdGhlIGxvb3BzdGFydCBwb2ludFxuXHQgICAgICAgIGlmICh0aGlzLmxvb3ApIHtcblx0ICAgICAgICAgICAgb2Zmc2V0ID0gVG9uZS5kZWZhdWx0QXJnKG9mZnNldCwgdGhpcy5sb29wU3RhcnQpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIC8vb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IG9mZnNldCBpcyAwXG5cdCAgICAgICAgICAgIG9mZnNldCA9IFRvbmUuZGVmYXVsdEFyZyhvZmZzZXQsIDApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBvZmZzZXQgPSB0aGlzLnRvU2Vjb25kcyhvZmZzZXQpO1xuXHQgICAgICAgIGdhaW4gPSBUb25lLmRlZmF1bHRBcmcoZ2FpbiwgMSk7XG5cdCAgICAgICAgdGhpcy5fZ2FpbiA9IGdhaW47XG5cdCAgICAgICAgZmFkZUluVGltZSA9IHRoaXMudG9TZWNvbmRzKFRvbmUuZGVmYXVsdEFyZyhmYWRlSW5UaW1lLCB0aGlzLmZhZGVJbikpO1xuXHQgICAgICAgIHRoaXMuZmFkZUluID0gZmFkZUluVGltZTtcblx0ICAgICAgICBpZiAoZmFkZUluVGltZSA+IDApIHtcblx0ICAgICAgICAgICAgdGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSgwLCB0aW1lKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuY3VydmUgPT09ICdsaW5lYXInKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9nYWluTm9kZS5nYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHRoaXMuX2dhaW4sIHRpbWUgKyBmYWRlSW5UaW1lKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2dhaW5Ob2RlLmdhaW4uZXhwb25lbnRpYWxBcHByb2FjaFZhbHVlQXRUaW1lKHRoaXMuX2dhaW4sIHRpbWUsIGZhZGVJblRpbWUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZShnYWluLCB0aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gdGltZTtcblx0ICAgICAgICB2YXIgY29tcHV0ZWREdXIgPSB0aGlzLnRvU2Vjb25kcyhUb25lLmRlZmF1bHRBcmcoZHVyYXRpb24sIHRoaXMuYnVmZmVyLmR1cmF0aW9uIC0gb2Zmc2V0ICUgdGhpcy5idWZmZXIuZHVyYXRpb24pKTtcblx0ICAgICAgICBjb21wdXRlZER1ciA9IE1hdGgubWF4KGNvbXB1dGVkRHVyLCAwKTtcblx0ICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQoZHVyYXRpb24pKSB7XG5cdCAgICAgICAgICAgIC8vY2xpcCB0aGUgZHVyYXRpb24gd2hlbiBub3QgbG9vcGluZ1xuXHQgICAgICAgICAgICBpZiAoIXRoaXMubG9vcCkge1xuXHQgICAgICAgICAgICAgICAgY29tcHV0ZWREdXIgPSBNYXRoLm1pbihjb21wdXRlZER1ciwgdGhpcy5idWZmZXIuZHVyYXRpb24gLSBvZmZzZXQgJSB0aGlzLmJ1ZmZlci5kdXJhdGlvbik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5zdG9wKHRpbWUgKyBjb21wdXRlZER1ciwgdGhpcy5mYWRlT3V0KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9zdGFydCB0aGUgYnVmZmVyIHNvdXJjZVxuXHQgICAgICAgIGlmICh0aGlzLmxvb3ApIHtcblx0ICAgICAgICAgICAgLy9tb2RpZnkgdGhlIG9mZnNldCBpZiBpdCdzIGdyZWF0ZXIgdGhhbiB0aGUgbG9vcCB0aW1lXG5cdCAgICAgICAgICAgIHZhciBsb29wRW5kID0gdGhpcy5sb29wRW5kIHx8IHRoaXMuYnVmZmVyLmR1cmF0aW9uO1xuXHQgICAgICAgICAgICB2YXIgbG9vcFN0YXJ0ID0gdGhpcy5sb29wU3RhcnQ7XG5cdCAgICAgICAgICAgIHZhciBsb29wRHVyYXRpb24gPSBsb29wRW5kIC0gbG9vcFN0YXJ0O1xuXHQgICAgICAgICAgICAvL21vdmUgdGhlIG9mZnNldCBiYWNrXG5cdCAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gbG9vcEVuZCkge1xuXHQgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCAtIGxvb3BTdGFydCkgJSBsb29wRHVyYXRpb24gKyBsb29wU3RhcnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fc291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyLmdldCgpO1xuXHQgICAgICAgIHRoaXMuX3NvdXJjZS5sb29wRW5kID0gdGhpcy5sb29wRW5kIHx8IHRoaXMuYnVmZmVyLmR1cmF0aW9uO1xuXHQgICAgICAgIGlmIChvZmZzZXQgPCB0aGlzLmJ1ZmZlci5kdXJhdGlvbikge1xuXHQgICAgICAgICAgICB0aGlzLl9zb3VyY2VTdGFydGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgdGhpcy5fc291cmNlLnN0YXJ0KHRpbWUsIG9mZnNldCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdG9wIHRoZSBidWZmZXIuIE9wdGlvbmFsbHkgYWRkIGEgcmFtcCB0aW1lIHRvIGZhZGUgdGhlXG5cdFx0ICogIGJ1ZmZlciBvdXQuXG5cdFx0ICogIEBwYXJhbSAge1RpbWU9fSAgdGltZSAgICAgICAgIFRoZSB0aW1lIHRoZSBidWZmZXIgc2hvdWxkIHN0b3AuXG5cdFx0ICogIEBwYXJhbSAge1RpbWU9fSAgZmFkZU91dFRpbWUgIEhvdyBsb25nIHRoZSBnYWluIHNob3VsZCBmYWRlIG91dCBmb3Jcblx0XHQgKiAgQHJldHVybiAge1RvbmUuQnVmZmVyU291cmNlfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXJTb3VyY2UucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAodGltZSwgZmFkZU91dFRpbWUpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuYnVmZmVyLmxvYWRlZCkge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbmUuQnVmZmVyU291cmNlOiBidWZmZXIgaXMgZWl0aGVyIG5vdCBzZXQgb3Igbm90IGxvYWRlZC4nKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRoaXMuX3NvdXJjZVN0b3BwZWQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgLy9pZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBzY2hlZHVsZWQsIGNsZWFyIGl0XG5cdCAgICAgICAgaWYgKHRoaXMuX3N0b3BUaW1lICE9PSAtMSkge1xuXHQgICAgICAgICAgICB0aGlzLmNhbmNlbFN0b3AoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9zdG9wIGlmIGl0J3Mgc2NoZWR1bGUgYmVmb3JlIHRoZSBzdGFydCB0aW1lXG5cdCAgICAgICAgaWYgKHRpbWUgPD0gdGhpcy5fc3RhcnRUaW1lKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2dhaW5Ob2RlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHRpbWUpO1xuXHQgICAgICAgICAgICB0aGlzLl9nYWluTm9kZS5nYWluLnZhbHVlID0gMDtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRpbWUgPSBNYXRoLm1heCh0aGlzLl9zdGFydFRpbWUgKyB0aGlzLmZhZGVJbiArIHRoaXMuc2FtcGxlVGltZSwgdGltZSk7XG5cdCAgICAgICAgLy9jYW5jZWwgdGhlIHByZXZpb3VzIGN1cnZlXG5cdCAgICAgICAgdGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXModGltZSk7XG5cdCAgICAgICAgdGhpcy5fc3RvcFRpbWUgPSB0aW1lO1xuXHQgICAgICAgIC8vdGhlIGZhZGVPdXQgdGltZVxuXHQgICAgICAgIGZhZGVPdXRUaW1lID0gdGhpcy50b1NlY29uZHMoVG9uZS5kZWZhdWx0QXJnKGZhZGVPdXRUaW1lLCB0aGlzLmZhZGVPdXQpKTtcblx0ICAgICAgICB2YXIgaGVsZER1cmF0aW9uID0gdGltZSAtIHRoaXMuX3N0YXJ0VGltZSAtIHRoaXMuZmFkZUluIC0gdGhpcy5zYW1wbGVUaW1lO1xuXHQgICAgICAgIGlmICghdGhpcy5sb29wKSB7XG5cdCAgICAgICAgICAgIC8vbWFrZSBzdXJlIHRoZSBmYWRlIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXJcblx0ICAgICAgICAgICAgaGVsZER1cmF0aW9uID0gTWF0aC5taW4oaGVsZER1cmF0aW9uLCB0aGlzLmJ1ZmZlci5kdXJhdGlvbik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZhZGVPdXRUaW1lID0gTWF0aC5taW4oaGVsZER1cmF0aW9uLCBmYWRlT3V0VGltZSk7XG5cdCAgICAgICAgdmFyIHN0YXJ0RmFkZSA9IHRpbWUgLSBmYWRlT3V0VGltZTtcblx0ICAgICAgICBpZiAoZmFkZU91dFRpbWUgPiB0aGlzLnNhbXBsZVRpbWUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh0aGlzLl9nYWluLCBzdGFydEZhZGUpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5jdXJ2ZSA9PT0gJ2xpbmVhcicpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2dhaW5Ob2RlLmdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoMCwgdGltZSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9nYWluTm9kZS5nYWluLmV4cG9uZW50aWFsQXBwcm9hY2hWYWx1ZUF0VGltZSgwLCBzdGFydEZhZGUsIGZhZGVPdXRUaW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2dhaW5Ob2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMCwgdGltZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIFRvbmUuY29udGV4dC5jbGVhclRpbWVvdXQodGhpcy5fb25lbmRlZFRpbWVvdXQpO1xuXHQgICAgICAgIHRoaXMuX29uZW5kZWRUaW1lb3V0ID0gVG9uZS5jb250ZXh0LnNldFRpbWVvdXQodGhpcy5fb25lbmRlZC5iaW5kKHRoaXMpLCB0aGlzLl9zdG9wVGltZSAtIHRoaXMubm93KCkpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDYW5jZWwgYSBzY2hlZHVsZWQgc3RvcCBldmVudFxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5CdWZmZXJTb3VyY2V9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUuY2FuY2VsU3RvcCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAodGhpcy5fc3RhcnRUaW1lICE9PSAtMSAmJiAhdGhpcy5fc291cmNlU3RvcHBlZCkge1xuXHQgICAgICAgICAgICAvL2NhbmNlbCB0aGUgc3RvcCBlbnZlbG9wZVxuXHQgICAgICAgICAgICB2YXIgZmFkZUluVGltZSA9IHRoaXMudG9TZWNvbmRzKHRoaXMuZmFkZUluKTtcblx0ICAgICAgICAgICAgdGhpcy5fZ2Fpbk5vZGUuZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXModGhpcy5fc3RhcnRUaW1lICsgZmFkZUluVGltZSArIHRoaXMuc2FtcGxlVGltZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2dhaW5Ob2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMSwgTWF0aC5tYXgodGhpcy5ub3coKSwgdGhpcy5fc3RhcnRUaW1lICsgZmFkZUluVGltZSArIHRoaXMuc2FtcGxlVGltZSkpO1xuXHQgICAgICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJUaW1lb3V0KHRoaXMuX29uZW5kZWRUaW1lb3V0KTtcblx0ICAgICAgICAgICAgdGhpcy5fc3RvcFRpbWUgPSAtMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEludGVybmFsIGNhbGxiYWNrIHdoZW4gdGhlIGJ1ZmZlciBpcyBlbmRlZC5cblx0XHQgKiAgSW52b2tlcyBgb25lbmRlZGAgYW5kIGRpc3Bvc2VzIHRoZSBub2RlLlxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXJTb3VyY2UucHJvdG90eXBlLl9vbmVuZGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICghdGhpcy5fc291cmNlU3RvcHBlZCkge1xuXHQgICAgICAgICAgICB0aGlzLl9zb3VyY2VTdG9wcGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgLy9hbGxvdyBhZGRpdGlvbmFsIHRpbWUgZm9yIHRoZSBleHBvbmVudGlhbCBjdXJ2ZSB0byBmdWxseSBkZWNheVxuXHQgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFRhaWwgPSB0aGlzLmN1cnZlID09PSAnZXhwb25lbnRpYWwnID8gdGhpcy5mYWRlT3V0ICogMiA6IDA7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VTdGFydGVkICYmIHRoaXMuX3N0b3BUaW1lICE9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlLnN0b3AodGhpcy5fc3RvcFRpbWUgKyBhZGRpdGlvbmFsVGFpbCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5vbmVuZGVkKHRoaXMpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBJZiBsb29wIGlzIHRydWUsIHRoZSBsb29wIHdpbGwgc3RhcnQgYXQgdGhpcyBwb3NpdGlvbi5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5CdWZmZXJTb3VyY2UjXG5cdFx0ICogQHR5cGUge1RpbWV9XG5cdFx0ICogQG5hbWUgbG9vcFN0YXJ0XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5CdWZmZXJTb3VyY2UucHJvdG90eXBlLCAnbG9vcFN0YXJ0Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLmxvb3BTdGFydDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGxvb3BTdGFydCkge1xuXHQgICAgICAgICAgICB0aGlzLl9zb3VyY2UubG9vcFN0YXJ0ID0gdGhpcy50b1NlY29uZHMobG9vcFN0YXJ0KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIElmIGxvb3AgaXMgdHJ1ZSwgdGhlIGxvb3Agd2lsbCBlbmQgYXQgdGhpcyBwb3NpdGlvbi5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5CdWZmZXJTb3VyY2UjXG5cdFx0ICogQHR5cGUge1RpbWV9XG5cdFx0ICogQG5hbWUgbG9vcEVuZFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQnVmZmVyU291cmNlLnByb3RvdHlwZSwgJ2xvb3BFbmQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2UubG9vcEVuZDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGxvb3BFbmQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc291cmNlLmxvb3BFbmQgPSB0aGlzLnRvU2Vjb25kcyhsb29wRW5kKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBhdWRpbyBidWZmZXIgYmVsb25naW5nIHRvIHRoZSBwbGF5ZXIuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQnVmZmVyU291cmNlI1xuXHRcdCAqIEB0eXBlIHtUb25lLkJ1ZmZlcn1cblx0XHQgKiBAbmFtZSBidWZmZXJcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkJ1ZmZlclNvdXJjZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChidWZmZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVyLnNldChidWZmZXIpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogSWYgdGhlIGJ1ZmZlciBzaG91bGQgbG9vcCBvbmNlIGl0J3Mgb3Zlci5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5CdWZmZXJTb3VyY2UjXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XG5cdFx0ICogQG5hbWUgbG9vcFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuQnVmZmVyU291cmNlLnByb3RvdHlwZSwgJ2xvb3AnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2UubG9vcDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGxvb3ApIHtcblx0ICAgICAgICAgICAgdGhpcy5fc291cmNlLmxvb3AgPSBsb29wO1xuXHQgICAgICAgICAgICB0aGlzLmNhbmNlbFN0b3AoKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuQnVmZmVyU291cmNlfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5CdWZmZXJTb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLm9uZW5kZWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3NvdXJjZS5vbmVuZGVkID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9zb3VyY2UuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX3NvdXJjZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZ2Fpbk5vZGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2dhaW5Ob2RlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9idWZmZXIuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2J1ZmZlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fc3RhcnRUaW1lID0gLTE7XG5cdCAgICAgICAgdGhpcy5wbGF5YmFja1JhdGUgPSBudWxsO1xuXHQgICAgICAgIFRvbmUuY29udGV4dC5jbGVhclRpbWVvdXQodGhpcy5fb25lbmRlZFRpbWVvdXQpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkJ1ZmZlclNvdXJjZTtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLk5vaXNlIGlzIGEgbm9pc2UgZ2VuZXJhdG9yLiBJdCB1c2VzIGxvb3BlZCBub2lzZSBidWZmZXJzIHRvIHNhdmUgb24gcGVyZm9ybWFuY2UuXG5cdFx0ICogICAgICAgICAgVG9uZS5Ob2lzZSBzdXBwb3J0cyB0aGUgbm9pc2UgdHlwZXM6IFwicGlua1wiLCBcIndoaXRlXCIsIGFuZCBcImJyb3duXCIuIFJlYWQgbW9yZSBhYm91dFxuXHRcdCAqICAgICAgICAgIGNvbG9ycyBvZiBub2lzZSBvbiBbV2lraXBlZGlhXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db2xvcnNfb2Zfbm9pc2UpLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5Tb3VyY2V9XG5cdFx0ICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIHRoZSBub2lzZSB0eXBlICh3aGl0ZXxwaW5rfGJyb3duKVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vaW5pdGlhbGl6ZSB0aGUgbm9pc2UgYW5kIHN0YXJ0XG5cdFx0ICogdmFyIG5vaXNlID0gbmV3IFRvbmUuTm9pc2UoXCJwaW5rXCIpLnN0YXJ0KCk7XG5cdFx0ICpcblx0XHQgKiAvL21ha2UgYW4gYXV0b2ZpbHRlciB0byBzaGFwZSB0aGUgbm9pc2Vcblx0XHQgKiB2YXIgYXV0b0ZpbHRlciA9IG5ldyBUb25lLkF1dG9GaWx0ZXIoe1xuXHRcdCAqIFx0XCJmcmVxdWVuY3lcIiA6IFwiOG1cIixcblx0XHQgKiBcdFwibWluXCIgOiA4MDAsXG5cdFx0ICogXHRcIm1heFwiIDogMTUwMDBcblx0XHQgKiB9KS5jb25uZWN0KFRvbmUuTWFzdGVyKTtcblx0XHQgKlxuXHRcdCAqIC8vY29ubmVjdCB0aGUgbm9pc2Vcblx0XHQgKiBub2lzZS5jb25uZWN0KGF1dG9GaWx0ZXIpO1xuXHRcdCAqIC8vc3RhcnQgdGhlIGF1dG9maWx0ZXIgTEZPXG5cdFx0ICogYXV0b0ZpbHRlci5zdGFydCgpXG5cdFx0ICovXG5cdCAgICBUb25lLk5vaXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFsndHlwZSddLCBUb25lLk5vaXNlKTtcblx0ICAgICAgICBUb25lLlNvdXJjZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge0F1ZGlvQnVmZmVyU291cmNlTm9kZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NvdXJjZSA9IG51bGw7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGJ1ZmZlclxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge0F1ZGlvQnVmZmVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdHlwZSA9IG9wdGlvbnMudHlwZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgcGxheWJhY2sgcmF0ZSBvZiB0aGUgbm9pc2UuIEFmZmVjdHNcblx0XHRcdCAqICB0aGUgXCJmcmVxdWVuY3lcIiBvZiB0aGUgbm9pc2UuXG5cdFx0XHQgKiAgQHR5cGUge1Bvc2l0aXZlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3BsYXliYWNrUmF0ZSA9IG9wdGlvbnMucGxheWJhY2tSYXRlO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuTm9pc2UsIFRvbmUuU291cmNlKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzXG5cdFx0ICpcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuTm9pc2UuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3R5cGUnOiAnd2hpdGUnLFxuXHQgICAgICAgICdwbGF5YmFja1JhdGUnOiAxXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHR5cGUgb2YgdGhlIG5vaXNlLiBDYW4gYmUgXCJ3aGl0ZVwiLCBcImJyb3duXCIsIG9yIFwicGlua1wiLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLk5vaXNlI1xuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICogQG5hbWUgdHlwZVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogbm9pc2UudHlwZSA9IFwid2hpdGVcIjtcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk5vaXNlLnByb3RvdHlwZSwgJ3R5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fdHlwZSAhPT0gdHlwZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW4gX25vaXNlQnVmZmVycykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICAgICAgICAgIC8vaWYgaXQncyBwbGF5aW5nLCBzdG9wIGFuZCByZXN0YXJ0IGl0XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5ub3coKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcChub3cpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydChub3cpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVG9uZS5Ob2lzZTogaW52YWxpZCB0eXBlOiAnICsgdHlwZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgcGxheWJhY2sgcmF0ZSBvZiB0aGUgbm9pc2UuIEFmZmVjdHNcblx0XHQgKiAgdGhlIFwiZnJlcXVlbmN5XCIgb2YgdGhlIG5vaXNlLlxuXHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0ICogIEBzaWduYWxcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk5vaXNlLnByb3RvdHlwZSwgJ3BsYXliYWNrUmF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJhdGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGxheWJhY2tSYXRlID0gcmF0ZTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlLnBsYXliYWNrUmF0ZS52YWx1ZSA9IHJhdGU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBpbnRlcm5hbCBzdGFydCBtZXRob2Rcblx0XHQgKlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IHRpbWVcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuTm9pc2UucHJvdG90eXBlLl9zdGFydCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdmFyIGJ1ZmZlciA9IF9ub2lzZUJ1ZmZlcnNbdGhpcy5fdHlwZV07XG5cdCAgICAgICAgdGhpcy5fc291cmNlID0gbmV3IFRvbmUuQnVmZmVyU291cmNlKGJ1ZmZlcikuY29ubmVjdCh0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5fc291cmNlLmxvb3AgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuX3NvdXJjZS5wbGF5YmFja1JhdGUudmFsdWUgPSB0aGlzLl9wbGF5YmFja1JhdGU7XG5cdCAgICAgICAgdGhpcy5fc291cmNlLnN0YXJ0KHRoaXMudG9TZWNvbmRzKHRpbWUpLCBNYXRoLnJhbmRvbSgpICogKGJ1ZmZlci5kdXJhdGlvbiAtIDAuMDAxKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGludGVybmFsIHN0b3AgbWV0aG9kXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSB0aW1lXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLk5vaXNlLnByb3RvdHlwZS5fc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9zb3VyY2Uuc3RvcCh0aGlzLnRvU2Vjb25kcyh0aW1lKSk7XG5cdCAgICAgICAgICAgIHRoaXMuX3NvdXJjZSA9IG51bGw7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFJlc3RhcnRzIHRoZSBub2lzZS5cblx0XHQgKiBAcGFyYW0gIHtbdHlwZV19IHRpbWUgW2Rlc2NyaXB0aW9uXVxuXHRcdCAqIEByZXR1cm4ge1t0eXBlXX0gICAgICBbZGVzY3JpcHRpb25dXG5cdFx0ICovXG5cdCAgICBUb25lLk5vaXNlLnByb3RvdHlwZS5yZXN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICAvL1RPRE8gY291bGQgYmUgb3B0aW1pemVkIGJ5IGNhbmNlbGxpbmcgdGhlIGJ1ZmZlciBzb3VyY2UgJ3N0b3AnXG5cdCAgICAgICAgLy9zdG9wIGFuZCByZXN0YXJ0XG5cdCAgICAgICAgdGhpcy5fc3RvcCh0aW1lKTtcblx0ICAgICAgICB0aGlzLl9zdGFydCh0aW1lKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk5vaXNlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk5vaXNlLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9zb3VyY2UuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgICAgICB0aGlzLl9zb3VyY2UgPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9idWZmZXIgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8gVEhFIEJVRkZFUlNcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy9Ob2lzZSBidWZmZXIgc3RhdHNcblx0ICAgIHZhciBidWZmZXJMZW5ndGggPSA0NDEwMCAqIDU7XG5cdCAgICB2YXIgY2hhbm5lbHMgPSAyO1xuXHQgICAgLyoqXG5cdFx0ICpcdFRoZSBub2lzZSBhcnJheXMuIEdlbmVyYXRlZCBvbiBpbml0aWFsaXphdGlvbi5cblx0XHQgKiAgYm9ycm93ZWQgaGVhdmlseSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS96YWNoYXJ5ZGVudG9uL25vaXNlLmpzXG5cdFx0ICogIChjKSAyMDEzIFphY2ggRGVudG9uIChNSVQpXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdCAqL1xuXHQgICAgdmFyIF9ub2lzZUFycmF5cyA9IHtcblx0ICAgICAgICAncGluayc6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBjaGFubmVsTnVtID0gMDsgY2hhbm5lbE51bSA8IGNoYW5uZWxzOyBjaGFubmVsTnVtKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjaGFubmVsID0gbmV3IEZsb2F0MzJBcnJheShidWZmZXJMZW5ndGgpO1xuXHQgICAgICAgICAgICAgICAgYnVmZmVyW2NoYW5uZWxOdW1dID0gY2hhbm5lbDtcblx0ICAgICAgICAgICAgICAgIHZhciBiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNjtcblx0ICAgICAgICAgICAgICAgIGIwID0gYjEgPSBiMiA9IGIzID0gYjQgPSBiNSA9IGI2ID0gMDtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyTGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgd2hpdGUgPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7XG5cdCAgICAgICAgICAgICAgICAgICAgYjAgPSAwLjk5ODg2ICogYjAgKyB3aGl0ZSAqIDAuMDU1NTE3OTtcblx0ICAgICAgICAgICAgICAgICAgICBiMSA9IDAuOTkzMzIgKiBiMSArIHdoaXRlICogMC4wNzUwNzU5O1xuXHQgICAgICAgICAgICAgICAgICAgIGIyID0gMC45NjkgKiBiMiArIHdoaXRlICogMC4xNTM4NTI7XG5cdCAgICAgICAgICAgICAgICAgICAgYjMgPSAwLjg2NjUgKiBiMyArIHdoaXRlICogMC4zMTA0ODU2O1xuXHQgICAgICAgICAgICAgICAgICAgIGI0ID0gMC41NSAqIGI0ICsgd2hpdGUgKiAwLjUzMjk1MjI7XG5cdCAgICAgICAgICAgICAgICAgICAgYjUgPSAtMC43NjE2ICogYjUgLSB3aGl0ZSAqIDAuMDE2ODk4O1xuXHQgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxbaV0gPSBiMCArIGIxICsgYjIgKyBiMyArIGI0ICsgYjUgKyBiNiArIHdoaXRlICogMC41MzYyO1xuXHQgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxbaV0gKj0gMC4xMTtcblx0ICAgICAgICAgICAgICAgICAgICAvLyAocm91Z2hseSkgY29tcGVuc2F0ZSBmb3IgZ2FpblxuXHQgICAgICAgICAgICAgICAgICAgIGI2ID0gd2hpdGUgKiAwLjExNTkyNjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuXHQgICAgICAgIH0oKSxcblx0ICAgICAgICAnYnJvd24nOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBidWZmZXIgPSBbXTtcblx0ICAgICAgICAgICAgZm9yICh2YXIgY2hhbm5lbE51bSA9IDA7IGNoYW5uZWxOdW0gPCBjaGFubmVsczsgY2hhbm5lbE51bSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyTGVuZ3RoKTtcblx0ICAgICAgICAgICAgICAgIGJ1ZmZlcltjaGFubmVsTnVtXSA9IGNoYW5uZWw7XG5cdCAgICAgICAgICAgICAgICB2YXIgbGFzdE91dCA9IDA7XG5cdCAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1ZmZlckxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIHdoaXRlID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxO1xuXHQgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxbaV0gPSAobGFzdE91dCArIDAuMDIgKiB3aGl0ZSkgLyAxLjAyO1xuXHQgICAgICAgICAgICAgICAgICAgIGxhc3RPdXQgPSBjaGFubmVsW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxbaV0gKj0gMy41OyAgICAvLyAocm91Z2hseSkgY29tcGVuc2F0ZSBmb3IgZ2FpblxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG5cdCAgICAgICAgfSgpLFxuXHQgICAgICAgICd3aGl0ZSc6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IFtdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBjaGFubmVsTnVtID0gMDsgY2hhbm5lbE51bSA8IGNoYW5uZWxzOyBjaGFubmVsTnVtKyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBjaGFubmVsID0gbmV3IEZsb2F0MzJBcnJheShidWZmZXJMZW5ndGgpO1xuXHQgICAgICAgICAgICAgICAgYnVmZmVyW2NoYW5uZWxOdW1dID0gY2hhbm5lbDtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyTGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBjaGFubmVsW2ldID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG5cdCAgICAgICAgfSgpXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICpcdHN0YXRpYyBub2lzZSBidWZmZXJzXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHR5cGUge1RvbmUuQnVmZmVyfVxuXHRcdCAqL1xuXHQgICAgdmFyIF9ub2lzZUJ1ZmZlcnMgPSB7fTtcblx0ICAgIC8vY3JlYXRlIHRoZSBUb25lLkJ1ZmZlcnNcblx0ICAgIGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlcnMoKSB7XG5cdCAgICAgICAgZm9yICh2YXIgdHlwZSBpbiBfbm9pc2VBcnJheXMpIHtcblx0ICAgICAgICAgICAgX25vaXNlQnVmZmVyc1t0eXBlXSA9IG5ldyBUb25lLkJ1ZmZlcigpLmZyb21BcnJheShfbm9pc2VBcnJheXNbdHlwZV0pO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIC8vY3JlYXRlIHRoZSBub2lzZSBidWZmZXJzXG5cdCAgICBUb25lLmdldENvbnRleHQoY3JlYXRlQnVmZmVycyk7XG5cdCAgICBUb25lLkNvbnRleHQub24oJ2luaXQnLCBjcmVhdGVCdWZmZXJzKTtcblx0ICAgIHJldHVybiBUb25lLk5vaXNlO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgU2ltcGxlIGNvbnZvbHV0aW9uIGNyZWF0ZWQgd2l0aCBkZWNheWluZyBub2lzZS5cblx0XHQgKiAgXHRcdEdlbmVyYXRlcyBhbiBJbXB1bHNlIFJlc3BvbnNlIEJ1ZmZlclxuXHRcdCAqIFx0XHRcdHdpdGggVG9uZS5PZmZsaW5lIHRoZW4gZmVlZHMgdGhlIElSIGludG8gQ29udm9sdmVyTm9kZS5cblx0XHQgKiBcdFx0XHROb3RlOiB0aGUgUmV2ZXJiIHdpbGwgbm90IG1ha2UgYW55IHNvdW5kIHVudGlsIFtnZW5lcmF0ZV0oI2dlbmVyYXRlKVxuXHRcdCAqIFx0XHRcdGhhcyBiZWVuIGludm9rZWQgYW5kIHJlc29sdmVkLlxuXHRcdCAqXG5cdFx0ICogXHRcdFx0SW5zcGlyYXRpb24gZnJvbSBbUmV2ZXJiR2VuXShodHRwczovL2dpdGh1Yi5jb20vYWRlbGVzcGluYXNzZS9yZXZlcmJHZW4pLlxuXHRcdCAqIFx0XHRcdENvcHlyaWdodCAoYykgMjAxNCBBbGFuIGRlTGVzcGluYXNzZSBBcGFjaGUgMi4wIExpY2Vuc2UuXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuQ29udm9sdmVyfVxuXHRcdCAqICBAcGFyYW0ge1RpbWU9fSBkZWNheSBUaGUgYW1vdW50IG9mIHRpbWUgaXQgd2lsbCByZXZlcmJlcmF0ZSBmb3IuXG5cdFx0ICovXG5cdCAgICBUb25lLlJldmVyYiA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbJ2RlY2F5J10sIFRvbmUuUmV2ZXJiKTtcblx0ICAgICAgICBUb25lLkVmZmVjdC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIENvbnZvbHZlciBub2RlXG5cdFx0XHQgKiAgQHR5cGUge0NvbnZvbHZlck5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2NvbnZvbHZlciA9IHRoaXMuY29udGV4dC5jcmVhdGVDb252b2x2ZXIoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBkdXJhdGlvbiBvZiB0aGUgcmV2ZXJiXG5cdFx0XHQgKiBAdHlwZSB7VGltZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGVjYXkgPSBvcHRpb25zLmRlY2F5O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIGFtb3VudCBvZiB0aW1lIGJlZm9yZSB0aGUgcmV2ZXJiIGlzIGZ1bGx5XG5cdFx0XHQgKiByYW1wZWQgaW4uXG5cdFx0XHQgKiBAdHlwZSB7VGltZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucHJlRGVsYXkgPSBvcHRpb25zLnByZURlbGF5O1xuXHQgICAgICAgIHRoaXMuY29ubmVjdEVmZmVjdCh0aGlzLl9jb252b2x2ZXIpO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuUmV2ZXJiLCBUb25lLkVmZmVjdCk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgZGVmYXVsdHNcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqIEBzdGF0aWNcblx0XHQgKi9cblx0ICAgIFRvbmUuUmV2ZXJiLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdkZWNheSc6IDEuNSxcblx0ICAgICAgICAncHJlRGVsYXknOiAwLjAxXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogR2VuZXJhdGUgdGhlIEltcHVsc2UgUmVzcG9uc2UuIFJldHVybnMgYSBwcm9taXNlIHdoaWxlIHRoZSBJUiBpcyBiZWluZ1xuXHRcdCAqIGdlbmVyYXRlZC5cblx0XHQgKiBAcmV0dXJuIHtQcm9taXNlPFRvbmUuUmV2ZXJiPn0gUHJvbWlzZSB3aGljaCByZXR1cm5zIHRoaXMgb2JqZWN0LlxuXHRcdCAqL1xuXHQgICAgVG9uZS5SZXZlcmIucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiBUb25lLk9mZmxpbmUoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAvL2NyZWF0ZSBhIG5vaXNlIGJ1cnN0IHdoaWNoIGRlY2F5cyBvdmVyIHRoZSBkdXJhdGlvblxuXHQgICAgICAgICAgICB2YXIgbm9pc2VMID0gbmV3IFRvbmUuTm9pc2UoKTtcblx0ICAgICAgICAgICAgdmFyIG5vaXNlUiA9IG5ldyBUb25lLk5vaXNlKCk7XG5cdCAgICAgICAgICAgIHZhciBtZXJnZSA9IG5ldyBUb25lLk1lcmdlKCk7XG5cdCAgICAgICAgICAgIG5vaXNlTC5jb25uZWN0KG1lcmdlLmxlZnQpO1xuXHQgICAgICAgICAgICBub2lzZVIuY29ubmVjdChtZXJnZS5yaWdodCk7XG5cdCAgICAgICAgICAgIHZhciBnYWluTm9kZSA9IG5ldyBUb25lLkdhaW4oKS50b01hc3RlcigpO1xuXHQgICAgICAgICAgICBtZXJnZS5jb25uZWN0KGdhaW5Ob2RlKTtcblx0ICAgICAgICAgICAgbm9pc2VMLnN0YXJ0KDApO1xuXHQgICAgICAgICAgICBub2lzZVIuc3RhcnQoMCk7XG5cdCAgICAgICAgICAgIC8vc2hvcnQgZmFkZSBpblxuXHQgICAgICAgICAgICBnYWluTm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKDAsIDApO1xuXHQgICAgICAgICAgICBnYWluTm9kZS5nYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKDEsIHRoaXMucHJlRGVsYXkpO1xuXHQgICAgICAgICAgICAvL2RlY2F5XG5cdCAgICAgICAgICAgIGdhaW5Ob2RlLmdhaW4uZXhwb25lbnRpYWxBcHByb2FjaFZhbHVlQXRUaW1lKDAsIHRoaXMucHJlRGVsYXksIHRoaXMuZGVjYXkgLSB0aGlzLnByZURlbGF5KTtcblx0ICAgICAgICB9LmJpbmQodGhpcyksIHRoaXMuZGVjYXkpLnRoZW4oZnVuY3Rpb24gKGJ1ZmZlcikge1xuXHQgICAgICAgICAgICB0aGlzLl9jb252b2x2ZXIuYnVmZmVyID0gYnVmZmVyLmdldCgpO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICB9LmJpbmQodGhpcykpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuUmV2ZXJifSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5SZXZlcmIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9jb252b2x2ZXIuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIHRoaXMuX2NvbnZvbHZlciA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuUmV2ZXJiO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgQmFzZSBjbGFzcyBmb3Igc3RlcmVvIGZlZWRiYWNrIGVmZmVjdHMgd2hlcmUgdGhlIGVmZmVjdFJldHVyblxuXHRcdCAqICAgICAgICAgaXMgZmVkIGJhY2sgaW50byB0aGUgc2FtZSBjaGFubmVsLlxuXHRcdCAqXG5cdFx0ICpcdEBjb25zdHJ1Y3RvclxuXHRcdCAqXHRAZXh0ZW5kcyB7VG9uZS5TdGVyZW9FZmZlY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLlN0ZXJlb0ZlZWRiYWNrRWZmZWN0ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFsnZmVlZGJhY2snXSwgVG9uZS5GZWVkYmFja0VmZmVjdCk7XG5cdCAgICAgICAgVG9uZS5TdGVyZW9FZmZlY3QuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBjb250cm9scyB0aGUgYW1vdW50IG9mIGZlZWRiYWNrXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZmVlZGJhY2sgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5mZWVkYmFjaywgVG9uZS5UeXBlLk5vcm1hbFJhbmdlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbGVmdCBzaWRlIGZlZWJhY2tcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5HYWlufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mZWVkYmFja0wgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIHJpZ2h0IHNpZGUgZmVlYmFja1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2ZlZWRiYWNrUiA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAvL2Nvbm5lY3QgaXQgdXBcblx0ICAgICAgICB0aGlzLmVmZmVjdFJldHVybkwuY2hhaW4odGhpcy5fZmVlZGJhY2tMLCB0aGlzLmVmZmVjdFNlbmRMKTtcblx0ICAgICAgICB0aGlzLmVmZmVjdFJldHVyblIuY2hhaW4odGhpcy5fZmVlZGJhY2tSLCB0aGlzLmVmZmVjdFNlbmRSKTtcblx0ICAgICAgICB0aGlzLmZlZWRiYWNrLmZhbih0aGlzLl9mZWVkYmFja0wuZ2FpbiwgdGhpcy5fZmVlZGJhY2tSLmdhaW4pO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFsnZmVlZGJhY2snXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5TdGVyZW9GZWVkYmFja0VmZmVjdCwgVG9uZS5TdGVyZW9FZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIGNsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlN0ZXJlb0ZlZWRiYWNrRWZmZWN0fSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlN0ZXJlb0ZlZWRiYWNrRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU3RlcmVvRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoWydmZWVkYmFjayddKTtcblx0ICAgICAgICB0aGlzLmZlZWRiYWNrLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmZlZWRiYWNrID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9mZWVkYmFja0wuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2ZlZWRiYWNrTCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZmVlZGJhY2tSLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9mZWVkYmFja1IgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlN0ZXJlb0ZlZWRiYWNrRWZmZWN0O1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgQXBwbGllcyBhIHdpZHRoIGZhY3RvciB0byB0aGUgbWlkL3NpZGUgc2VwZXJhdGlvbi5cblx0XHQgKiAgICAgICAgIDAgaXMgYWxsIG1pZCBhbmQgMSBpcyBhbGwgc2lkZS5cblx0XHQgKiAgICAgICAgIEFsZ29yaXRobSBmb3VuZCBpbiBba3ZyYXVkaW8gZm9ydW1zXShodHRwOi8vd3d3Lmt2cmF1ZGlvLmNvbS9mb3J1bS92aWV3dG9waWMucGhwP3Q9MjEyNTg3KS5cblx0XHQgKiAgICAgICAgIDxicj48YnI+XG5cdFx0ICogICAgICAgICA8Y29kZT5cblx0XHQgKiAgICAgICAgIE1pZCAqPSAyKigxLXdpZHRoKTxicj5cblx0XHQgKiAgICAgICAgIFNpZGUgKj0gMip3aWR0aFxuXHRcdCAqICAgICAgICAgPC9jb2RlPlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLk1pZFNpZGVFZmZlY3R9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfE9iamVjdH0gW3dpZHRoXSBUaGUgc3RlcmVvIHdpZHRoLiBBIHdpZHRoIG9mIDAgaXMgbW9ubyBhbmQgMSBpcyBzdGVyZW8uIDAuNSBpcyBubyBjaGFuZ2UuXG5cdFx0ICovXG5cdCAgICBUb25lLlN0ZXJlb1dpZGVuZXIgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWyd3aWR0aCddLCBUb25lLlN0ZXJlb1dpZGVuZXIpO1xuXHQgICAgICAgIFRvbmUuTWlkU2lkZUVmZmVjdC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSB3aWR0aCBjb250cm9sLiAwID0gMTAwJSBtaWQuIDEgPSAxMDAlIHNpZGUuIDAuNSA9IG5vIGNoYW5nZS5cblx0XHRcdCAqICBAdHlwZSB7Tm9ybWFsUmFuZ2V9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy53aWR0aCA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLndpZHRoLCBUb25lLlR5cGUuTm9ybWFsUmFuZ2UpO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFsnd2lkdGgnXSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUd28gdGltZXMgdGhlICgxLXdpZHRoKSBmb3IgdGhlIG1pZCBjaGFubmVsXG5cdFx0XHQgKiBAdHlwZSB7VG9uZS5NdWx0aXBseX1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl90d29UaW1lc1dpZHRoTWlkID0gbmV3IFRvbmUuTXVsdGlwbHkoMik7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUd28gdGltZXMgdGhlIHdpZHRoIGZvciB0aGUgc2lkZSBjaGFubmVsXG5cdFx0XHQgKiBAdHlwZSB7VG9uZS5NdWx0aXBseX1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl90d29UaW1lc1dpZHRoU2lkZSA9IG5ldyBUb25lLk11bHRpcGx5KDIpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIE1pZCBtdWx0aXBsaWVyXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTXVsdGlwbHl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX21pZE11bHQgPSBuZXcgVG9uZS5NdWx0aXBseSgpO1xuXHQgICAgICAgIHRoaXMuX3R3b1RpbWVzV2lkdGhNaWQuY29ubmVjdCh0aGlzLl9taWRNdWx0LCAwLCAxKTtcblx0ICAgICAgICB0aGlzLm1pZFNlbmQuY2hhaW4odGhpcy5fbWlkTXVsdCwgdGhpcy5taWRSZXR1cm4pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogMSAtIHdpZHRoXG5cdFx0XHQgKiBAdHlwZSB7VG9uZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX29uZU1pbnVzV2lkdGggPSBuZXcgVG9uZS5TdWJ0cmFjdCgpO1xuXHQgICAgICAgIHRoaXMuX29uZU1pbnVzV2lkdGguY29ubmVjdCh0aGlzLl90d29UaW1lc1dpZHRoTWlkKTtcblx0ICAgICAgICB0aGlzLmNvbnRleHQuZ2V0Q29uc3RhbnQoMSkuY29ubmVjdCh0aGlzLl9vbmVNaW51c1dpZHRoLCAwLCAwKTtcblx0ICAgICAgICB0aGlzLndpZHRoLmNvbm5lY3QodGhpcy5fb25lTWludXNXaWR0aCwgMCwgMSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgU2lkZSBtdWx0aXBsaWVyXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTXVsdGlwbHl9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NpZGVNdWx0ID0gbmV3IFRvbmUuTXVsdGlwbHkoKTtcblx0ICAgICAgICB0aGlzLndpZHRoLmNvbm5lY3QodGhpcy5fdHdvVGltZXNXaWR0aFNpZGUpO1xuXHQgICAgICAgIHRoaXMuX3R3b1RpbWVzV2lkdGhTaWRlLmNvbm5lY3QodGhpcy5fc2lkZU11bHQsIDAsIDEpO1xuXHQgICAgICAgIHRoaXMuc2lkZVNlbmQuY2hhaW4odGhpcy5fc2lkZU11bHQsIHRoaXMuc2lkZVJldHVybik7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5TdGVyZW9XaWRlbmVyLCBUb25lLk1pZFNpZGVFZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIHRoZSBkZWZhdWx0IHZhbHVlc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLlN0ZXJlb1dpZGVuZXIuZGVmYXVsdHMgPSB7ICd3aWR0aCc6IDAuNSB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5TdGVyZW9XaWRlbmVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlN0ZXJlb1dpZGVuZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5NaWRTaWRlRWZmZWN0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoWyd3aWR0aCddKTtcblx0ICAgICAgICB0aGlzLndpZHRoLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLndpZHRoID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9taWRNdWx0LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9taWRNdWx0ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9zaWRlTXVsdC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc2lkZU11bHQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3R3b1RpbWVzV2lkdGhNaWQuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3R3b1RpbWVzV2lkdGhNaWQgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3R3b1RpbWVzV2lkdGhTaWRlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl90d29UaW1lc1dpZHRoU2lkZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fb25lTWludXNXaWR0aC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fb25lTWludXNXaWR0aCA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuU3RlcmVvV2lkZW5lcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuVHJlbW9sbyBtb2R1bGF0ZXMgdGhlIGFtcGxpdHVkZSBvZiBhbiBpbmNvbWluZyBzaWduYWwgdXNpbmcgYSBUb25lLkxGTy5cblx0XHQgKiAgICAgICAgIFRoZSB0eXBlLCBmcmVxdWVuY3ksIGFuZCBkZXB0aCBvZiB0aGUgTEZPIGlzIGNvbnRyb2xsYWJsZS5cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TdGVyZW9FZmZlY3R9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge0ZyZXF1ZW5jeX0gW2ZyZXF1ZW5jeV0gVGhlIHJhdGUgb2YgdGhlIGVmZmVjdC5cblx0XHQgKiAgQHBhcmFtIHtOb3JtYWxSYW5nZX0gW2RlcHRoXSBUaGUgZGVwdGggb2YgdGhlIGVmZmVjdC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2NyZWF0ZSBhIHRyZW1vbG8gYW5kIHN0YXJ0IGl0J3MgTEZPXG5cdFx0ICogdmFyIHRyZW1vbG8gPSBuZXcgVG9uZS5UcmVtb2xvKDksIDAuNzUpLnRvTWFzdGVyKCkuc3RhcnQoKTtcblx0XHQgKiAvL3JvdXRlIGFuIG9zY2lsbGF0b3IgdGhyb3VnaCB0aGUgdHJlbW9sbyBhbmQgc3RhcnQgaXRcblx0XHQgKiB2YXIgb3NjaWxsYXRvciA9IG5ldyBUb25lLk9zY2lsbGF0b3IoKS5jb25uZWN0KHRyZW1vbG8pLnN0YXJ0KCk7XG5cdFx0ICovXG5cdCAgICBUb25lLlRyZW1vbG8gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RlcHRoJ1xuXHQgICAgICAgIF0sIFRvbmUuVHJlbW9sbyk7XG5cdCAgICAgICAgVG9uZS5TdGVyZW9FZmZlY3QuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdHJlbWVsbyBMRk8gaW4gdGhlIGxlZnQgY2hhbm5lbFxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5MRk99XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xmb0wgPSBuZXcgVG9uZS5MRk8oe1xuXHQgICAgICAgICAgICAncGhhc2UnOiBvcHRpb25zLnNwcmVhZCxcblx0ICAgICAgICAgICAgJ21pbic6IDEsXG5cdCAgICAgICAgICAgICdtYXgnOiAwXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHRyZW1lbG8gTEZPIGluIHRoZSBsZWZ0IGNoYW5uZWxcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuTEZPfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sZm9SID0gbmV3IFRvbmUuTEZPKHtcblx0ICAgICAgICAgICAgJ3BoYXNlJzogb3B0aW9ucy5zcHJlYWQsXG5cdCAgICAgICAgICAgICdtaW4nOiAxLFxuXHQgICAgICAgICAgICAnbWF4JzogMFxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFdoZXJlIHRoZSBnYWluIGlzIG11bHRpcGxpZWRcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYW1wbGl0dWRlTCA9IG5ldyBUb25lLkdhaW4oKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBXaGVyZSB0aGUgZ2FpbiBpcyBtdWx0aXBsaWVkXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLkdhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2FtcGxpdHVkZVIgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGZyZXF1ZW5jeSBvZiB0aGUgdHJlbW9sby5cblx0XHRcdCAqICBAdHlwZSAge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLmZyZXF1ZW5jeSwgVG9uZS5UeXBlLkZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGRlcHRoIG9mIHRoZSBlZmZlY3QuIEEgZGVwdGggb2YgMCwgaGFzIG5vIGVmZmVjdFxuXHRcdFx0ICogIG9uIHRoZSBhbXBsaXR1ZGUsIGFuZCBhIGRlcHRoIG9mIDEgbWFrZXMgdGhlIGFtcGxpdHVkZVxuXHRcdFx0ICogIG1vZHVsYXRlIGZ1bGx5IGJldHdlZW4gMCBhbmQgMS5cblx0XHRcdCAqICBAdHlwZSAge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGVwdGggPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5kZXB0aCwgVG9uZS5UeXBlLk5vcm1hbFJhbmdlKTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGVwdGgnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5lZmZlY3RTZW5kTC5jaGFpbih0aGlzLl9hbXBsaXR1ZGVMLCB0aGlzLmVmZmVjdFJldHVybkwpO1xuXHQgICAgICAgIHRoaXMuZWZmZWN0U2VuZFIuY2hhaW4odGhpcy5fYW1wbGl0dWRlUiwgdGhpcy5lZmZlY3RSZXR1cm5SKTtcblx0ICAgICAgICB0aGlzLl9sZm9MLmNvbm5lY3QodGhpcy5fYW1wbGl0dWRlTC5nYWluKTtcblx0ICAgICAgICB0aGlzLl9sZm9SLmNvbm5lY3QodGhpcy5fYW1wbGl0dWRlUi5nYWluKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeS5mYW4odGhpcy5fbGZvTC5mcmVxdWVuY3ksIHRoaXMuX2xmb1IuZnJlcXVlbmN5KTtcblx0ICAgICAgICB0aGlzLmRlcHRoLmZhbih0aGlzLl9sZm9SLmFtcGxpdHVkZSwgdGhpcy5fbGZvTC5hbXBsaXR1ZGUpO1xuXHQgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcblx0ICAgICAgICB0aGlzLnNwcmVhZCA9IG9wdGlvbnMuc3ByZWFkO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuVHJlbW9sbywgVG9uZS5TdGVyZW9FZmZlY3QpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLlRyZW1vbG8uZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2ZyZXF1ZW5jeSc6IDEwLFxuXHQgICAgICAgICd0eXBlJzogJ3NpbmUnLFxuXHQgICAgICAgICdkZXB0aCc6IDAuNSxcblx0ICAgICAgICAnc3ByZWFkJzogMTgwXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3RhcnQgdGhlIHRyZW1vbG8uXG5cdFx0ICogQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIFdoZW4gdGhlIHRyZW1vbG8gYmVnaW5zLlxuXHRcdCAqIEByZXR1cm5zIHtUb25lLlRyZW1vbG99IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJlbW9sby5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRoaXMuX2xmb0wuc3RhcnQodGltZSk7XG5cdCAgICAgICAgdGhpcy5fbGZvUi5zdGFydCh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBTdG9wIHRoZSB0cmVtb2xvLlxuXHRcdCAqIEBwYXJhbSB7VGltZX0gW3RpbWU9bm93XSBXaGVuIHRoZSB0cmVtb2xvIHN0b3BzLlxuXHRcdCAqIEByZXR1cm5zIHtUb25lLlRyZW1vbG99IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJlbW9sby5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fbGZvTC5zdG9wKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2xmb1Iuc3RvcCh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBTeW5jIHRoZSBlZmZlY3QgdG8gdGhlIHRyYW5zcG9ydC5cblx0XHQgKiBAcGFyYW0ge1RpbWV9IFtkZWxheT0wXSBEZWxheSB0aW1lIGJlZm9yZSBzdGFydGluZyB0aGUgZWZmZWN0IGFmdGVyIHRoZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0IGhhcyBzdGFydGVkLlxuXHRcdCAqIEByZXR1cm5zIHtUb25lLkF1dG9GaWx0ZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJlbW9sby5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uIChkZWxheSkge1xuXHQgICAgICAgIHRoaXMuX2xmb0wuc3luYyhkZWxheSk7XG5cdCAgICAgICAgdGhpcy5fbGZvUi5zeW5jKGRlbGF5KTtcblx0ICAgICAgICBUb25lLlRyYW5zcG9ydC5zeW5jU2lnbmFsKHRoaXMuZnJlcXVlbmN5KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBVbnN5bmMgdGhlIGZpbHRlciBmcm9tIHRoZSB0cmFuc3BvcnRcblx0XHQgKiBAcmV0dXJucyB7VG9uZS5UcmVtb2xvfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRyZW1vbG8ucHJvdG90eXBlLnVuc3luYyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLl9sZm9MLnVuc3luYygpO1xuXHQgICAgICAgIHRoaXMuX2xmb1IudW5zeW5jKCk7XG5cdCAgICAgICAgVG9uZS5UcmFuc3BvcnQudW5zeW5jU2lnbmFsKHRoaXMuZnJlcXVlbmN5KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUaGUgVHJlbW9sbydzIG9zY2lsbGF0b3IgdHlwZS5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5UcmVtb2xvI1xuXHRcdCAqIEB0eXBlIHtzdHJpbmd9XG5cdFx0ICogQG5hbWUgdHlwZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuVHJlbW9sby5wcm90b3R5cGUsICd0eXBlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGZvTC50eXBlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9sZm9MLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLl9sZm9SLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogQW1vdW50IG9mIHN0ZXJlbyBzcHJlYWQuIFdoZW4gc2V0IHRvIDAsIGJvdGggTEZPJ3Mgd2lsbCBiZSBwYW5uZWQgY2VudHJhbGx5LlxuXHRcdCAqIFdoZW4gc2V0IHRvIDE4MCwgTEZPJ3Mgd2lsbCBiZSBwYW5uZWQgaGFyZCBsZWZ0IGFuZCByaWdodCByZXNwZWN0aXZlbHkuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuVHJlbW9sbyNcblx0XHQgKiBAdHlwZSB7RGVncmVlc31cblx0XHQgKiBAbmFtZSBzcHJlYWRcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlRyZW1vbG8ucHJvdG90eXBlLCAnc3ByZWFkJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGZvUi5waGFzZSAtIHRoaXMuX2xmb0wucGhhc2U7ICAgIC8vMTgwXG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChzcHJlYWQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvTC5waGFzZSA9IDkwIC0gc3ByZWFkIC8gMjtcblx0ICAgICAgICAgICAgdGhpcy5fbGZvUi5waGFzZSA9IHNwcmVhZCAvIDIgKyA5MDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UcmVtb2xvfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRyZW1vbG8ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TdGVyZW9FZmZlY3QucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGVwdGgnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5fbGZvTC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbGZvTCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbGZvUi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbGZvUiA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fYW1wbGl0dWRlTC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fYW1wbGl0dWRlTCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fYW1wbGl0dWRlUi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fYW1wbGl0dWRlUiA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZGVwdGggPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlRyZW1vbG87XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBBIFZpYnJhdG8gZWZmZWN0IGNvbXBvc2VkIG9mIGEgVG9uZS5EZWxheSBhbmQgYSBUb25lLkxGTy4gVGhlIExGT1xuXHRcdCAqICAgICAgICAgbW9kdWxhdGVzIHRoZSBkZWxheVRpbWUgb2YgdGhlIGRlbGF5LCBjYXVzaW5nIHRoZSBwaXRjaCB0byByaXNlXG5cdFx0ICogICAgICAgICBhbmQgZmFsbC4gXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkVmZmVjdH1cblx0XHQgKiAgQHBhcmFtIHtGcmVxdWVuY3l9IGZyZXF1ZW5jeSBUaGUgZnJlcXVlbmN5IG9mIHRoZSB2aWJyYXRvLlxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfSBkZXB0aCBUaGUgYW1vdW50IHRoZSBwaXRjaCBpcyBtb2R1bGF0ZWQuXG5cdFx0ICovXG5cdCAgICBUb25lLlZpYnJhdG8gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RlcHRoJ1xuXHQgICAgICAgIF0sIFRvbmUuVmlicmF0byk7XG5cdCAgICAgICAgVG9uZS5FZmZlY3QuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGVsYXkgbm9kZSB1c2VkIGZvciB0aGUgdmlicmF0byBlZmZlY3Rcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5EZWxheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZGVsYXlOb2RlID0gbmV3IFRvbmUuRGVsYXkoMCwgb3B0aW9ucy5tYXhEZWxheSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIExGTyB1c2VkIHRvIGNvbnRyb2wgdGhlIHZpYnJhdG9cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5MRk99XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xmbyA9IG5ldyBUb25lLkxGTyh7XG5cdCAgICAgICAgICAgICd0eXBlJzogb3B0aW9ucy50eXBlLFxuXHQgICAgICAgICAgICAnbWluJzogMCxcblx0ICAgICAgICAgICAgJ21heCc6IG9wdGlvbnMubWF4RGVsYXksXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knOiBvcHRpb25zLmZyZXF1ZW5jeSxcblx0ICAgICAgICAgICAgJ3BoYXNlJzogLTkwICAgIC8vb2Zmc2UgdGhlIHBoYXNlIHNvIHRoZSByZXN0aW5nIHBvc2l0aW9uIGlzIGluIHRoZSBjZW50ZXJcblx0ICAgICAgICB9KS5zdGFydCgpLmNvbm5lY3QodGhpcy5fZGVsYXlOb2RlLmRlbGF5VGltZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGZyZXF1ZW5jeSBvZiB0aGUgdmlicmF0b1xuXHRcdFx0ICogIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSB0aGlzLl9sZm8uZnJlcXVlbmN5O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBkZXB0aCBvZiB0aGUgdmlicmF0by4gXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGVwdGggPSB0aGlzLl9sZm8uYW1wbGl0dWRlO1xuXHQgICAgICAgIHRoaXMuZGVwdGgudmFsdWUgPSBvcHRpb25zLmRlcHRoO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdkZXB0aCdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmVmZmVjdFNlbmQuY2hhaW4odGhpcy5fZGVsYXlOb2RlLCB0aGlzLmVmZmVjdFJldHVybik7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5WaWJyYXRvLCBUb25lLkVmZmVjdCk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGRlZmF1bHRzXG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqICBAY29uc3Rcblx0XHQgKi9cblx0ICAgIFRvbmUuVmlicmF0by5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnbWF4RGVsYXknOiAwLjAwNSxcblx0ICAgICAgICAnZnJlcXVlbmN5JzogNSxcblx0ICAgICAgICAnZGVwdGgnOiAwLjEsXG5cdCAgICAgICAgJ3R5cGUnOiAnc2luZSdcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUeXBlIG9mIG9zY2lsbGF0b3IgYXR0YWNoZWQgdG8gdGhlIFZpYnJhdG8uXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuVmlicmF0byNcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxuXHRcdCAqIEBuYW1lIHR5cGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlZpYnJhdG8ucHJvdG90eXBlLCAndHlwZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xmby50eXBlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9sZm8udHlwZSA9IHR5cGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlZpYnJhdG99IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVmlicmF0by5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkVmZmVjdC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2RlbGF5Tm9kZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZGVsYXlOb2RlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9sZm8uZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2xmbyA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RlcHRoJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmRlcHRoID0gbnVsbDtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5WaWJyYXRvO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIFRvbmUuRXZlbnQgYWJzdHJhY3RzIGF3YXkgVG9uZS5UcmFuc3BvcnQuc2NoZWR1bGUgYW5kIHByb3ZpZGVzIGEgc2NoZWR1bGFibGVcblx0XHQgKiAgICAgICAgICBjYWxsYmFjayBmb3IgYSBzaW5nbGUgb3IgcmVwZWF0YWJsZSBldmVudHMgYWxvbmcgdGhlIHRpbWVsaW5lLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lfVxuXHRcdCAqICBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGF0IHRoZSB0aW1lLlxuXHRcdCAqICBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvciB2YWx1ZXMgd2hpY2ggc2hvdWxkIGJlIHBhc3NlZCB0b1xuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvbiBpbnZvY2F0aW9uLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBjaG9yZCA9IG5ldyBUb25lLkV2ZW50KGZ1bmN0aW9uKHRpbWUsIGNob3JkKXtcblx0XHQgKiBcdC8vdGhlIGNob3JkIGFzIHdlbGwgYXMgdGhlIGV4YWN0IHRpbWUgb2YgdGhlIGV2ZW50XG5cdFx0ICogXHQvL2FyZSBwYXNzZWQgaW4gYXMgYXJndW1lbnRzIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHRcdCAqIH0sIFtcIkQ0XCIsIFwiRTRcIiwgXCJGNFwiXSk7XG5cdFx0ICogLy9zdGFydCB0aGUgY2hvcmQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhbnNwb3J0IHRpbWVsaW5lXG5cdFx0ICogY2hvcmQuc3RhcnQoKTtcblx0XHQgKiAvL2xvb3AgaXQgZXZlcnkgbWVhc3VyZSBmb3IgOCBtZWFzdXJlc1xuXHRcdCAqIGNob3JkLmxvb3AgPSA4O1xuXHRcdCAqIGNob3JkLmxvb3BFbmQgPSBcIjFtXCI7XG5cdFx0ICovXG5cdCAgICBUb25lLkV2ZW50ID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2NhbGxiYWNrJyxcblx0ICAgICAgICAgICAgJ3ZhbHVlJ1xuXHQgICAgICAgIF0sIFRvbmUuRXZlbnQpO1xuXHQgICAgICAgIFRvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBMb29wIHZhbHVlXG5cdFx0XHQgKiAgQHR5cGUgIHtCb29sZWFufFBvc2l0aXZlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sb29wID0gb3B0aW9ucy5sb29wO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBjYWxsYmFjayB0byBpbnZva2UuXG5cdFx0XHQgKiAgQHR5cGUgIHtGdW5jdGlvbn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSB2YWx1ZSB3aGljaCBpcyBwYXNzZWQgdG8gdGhlXG5cdFx0XHQgKiAgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdFx0XHQgKiAgQHR5cGUgIHsqfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBXaGVuIHRoZSBub3RlIGlzIHNjaGVkdWxlZCB0byBzdGFydC5cblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbG9vcFN0YXJ0ID0gdGhpcy50b1RpY2tzKG9wdGlvbnMubG9vcFN0YXJ0KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBXaGVuIHRoZSBub3RlIGlzIHNjaGVkdWxlZCB0byBzdGFydC5cblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbG9vcEVuZCA9IHRoaXMudG9UaWNrcyhvcHRpb25zLmxvb3BFbmQpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRyYWNrcyB0aGUgc2NoZWR1bGVkIGV2ZW50c1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLlRpbWVsaW5lU3RhdGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N0YXRlID0gbmV3IFRvbmUuVGltZWxpbmVTdGF0ZShUb25lLlN0YXRlLlN0b3BwZWQpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBwbGF5YmFjayBzcGVlZCBvZiB0aGUgbm90ZS4gQSBzcGVlZCBvZiAxXG5cdFx0XHQgKiAgaXMgbm8gY2hhbmdlLlxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge1Bvc2l0aXZlfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcGxheWJhY2tSYXRlID0gMTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBBIGRlbGF5IHRpbWUgZnJvbSB3aGVuIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gc3RhcnRcblx0XHRcdCAqICBAdHlwZSB7VGlja3N9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N0YXJ0T2Zmc2V0ID0gMDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBwcml2YXRlIGhvbGRlciBvZiBwcm9iYWJpbGl0eSB2YWx1ZVxuXHRcdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcHJvYmFiaWxpdHkgPSBvcHRpb25zLnByb2JhYmlsaXR5O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBhbW91bnQgb2YgdmFyaWF0aW9uIGZyb20gdGhlXG5cdFx0XHQgKiAgZ2l2ZW4gdGltZS5cblx0XHRcdCAqICBAdHlwZSB7Qm9vbGVhbnxUaW1lfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9odW1hbml6ZSA9IG9wdGlvbnMuaHVtYW5pemU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgSWYgbXV0ZSBpcyB0cnVlLCB0aGUgY2FsbGJhY2sgd29uJ3QgYmVcblx0XHRcdCAqICBpbnZva2VkLlxuXHRcdFx0ICogIEB0eXBlIHtCb29sZWFufVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5tdXRlID0gb3B0aW9ucy5tdXRlO1xuXHQgICAgICAgIC8vc2V0IHRoZSBpbml0aWFsIHZhbHVlc1xuXHQgICAgICAgIHRoaXMucGxheWJhY2tSYXRlID0gb3B0aW9ucy5wbGF5YmFja1JhdGU7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5FdmVudCk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGRlZmF1bHQgdmFsdWVzXG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqICBAY29uc3Rcblx0XHQgKi9cblx0ICAgIFRvbmUuRXZlbnQuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2NhbGxiYWNrJzogVG9uZS5ub09wLFxuXHQgICAgICAgICdsb29wJzogZmFsc2UsXG5cdCAgICAgICAgJ2xvb3BFbmQnOiAnMW0nLFxuXHQgICAgICAgICdsb29wU3RhcnQnOiAwLFxuXHQgICAgICAgICdwbGF5YmFja1JhdGUnOiAxLFxuXHQgICAgICAgICd2YWx1ZSc6IG51bGwsXG5cdCAgICAgICAgJ3Byb2JhYmlsaXR5JzogMSxcblx0ICAgICAgICAnbXV0ZSc6IGZhbHNlLFxuXHQgICAgICAgICdodW1hbml6ZSc6IGZhbHNlXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJlc2NoZWR1bGUgYWxsIG9mIHRoZSBldmVudHMgYWxvbmcgdGhlIHRpbWVsaW5lXG5cdFx0ICogIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWVzLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IGFmdGVyIE9ubHkgcmVzY2hlZHVsZXMgZXZlbnRzIGFmdGVyIHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5FdmVudH0gIHRoaXNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuRXZlbnQucHJvdG90eXBlLl9yZXNjaGVkdWxlRXZlbnRzID0gZnVuY3Rpb24gKGFmdGVyKSB7XG5cdCAgICAgICAgLy9pZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgc2NoZWR1bGVzIGFsbCBvZiB0aGUgZXZlbnRzXG5cdCAgICAgICAgYWZ0ZXIgPSBUb25lLmRlZmF1bHRBcmcoYWZ0ZXIsIC0xKTtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5mb3JFYWNoRnJvbShhZnRlciwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIHZhciBkdXJhdGlvbjtcblx0ICAgICAgICAgICAgaWYgKGV2ZW50LnN0YXRlID09PSBUb25lLlN0YXRlLlN0YXJ0ZWQpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChUb25lLmlzRGVmaW5lZChldmVudC5pZCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICBUb25lLlRyYW5zcG9ydC5jbGVhcihldmVudC5pZCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB2YXIgc3RhcnRUaWNrID0gZXZlbnQudGltZSArIE1hdGgucm91bmQodGhpcy5zdGFydE9mZnNldCAvIHRoaXMuX3BsYXliYWNrUmF0ZSk7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5fbG9vcCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gSW5maW5pdHk7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKFRvbmUuaXNOdW1iZXIodGhpcy5fbG9vcCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSB0aGlzLl9sb29wICogdGhpcy5fZ2V0TG9vcER1cmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0RXZlbnQgPSB0aGlzLl9zdGF0ZS5nZXRBZnRlcihzdGFydFRpY2spO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0RXZlbnQgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBNYXRoLm1pbihkdXJhdGlvbiwgbmV4dEV2ZW50LnRpbWUgLSBzdGFydFRpY2spO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT09IEluZmluaXR5KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vc2NoZWR1bGUgYSBzdG9wIHNpbmNlIGl0J3MgZmluaXRlIGR1cmF0aW9uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKFRvbmUuU3RhdGUuU3RvcHBlZCwgc3RhcnRUaWNrICsgZHVyYXRpb24gKyAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBUb25lLlRpY2tzKGR1cmF0aW9uKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIGludGVydmFsID0gVG9uZS5UaWNrcyh0aGlzLl9nZXRMb29wRHVyYXRpb24oKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgZXZlbnQuaWQgPSBUb25lLlRyYW5zcG9ydC5zY2hlZHVsZVJlcGVhdCh0aGlzLl90aWNrLmJpbmQodGhpcyksIGludGVydmFsLCBUb25lLlRpY2tzKHN0YXJ0VGljayksIGR1cmF0aW9uKTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZXZlbnQuaWQgPSBUb25lLlRyYW5zcG9ydC5zY2hlZHVsZSh0aGlzLl90aWNrLmJpbmQodGhpcyksIFRvbmUuVGlja3Moc3RhcnRUaWNrKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LmJpbmQodGhpcykpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbm90ZSwgZWl0aGVyIFwic3RhcnRlZFwiIG9yIFwic3RvcHBlZFwiLlxuXHRcdCAqICBAdHlwZSB7U3RyaW5nfVxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuRXZlbnQjXG5cdFx0ICogIEBuYW1lIHN0YXRlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5FdmVudC5wcm90b3R5cGUsICdzdGF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKFRvbmUuVHJhbnNwb3J0LnRpY2tzKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgc3RhcnQgZnJvbSB0aGUgc2NoZWR1bGVkIHN0YXJ0IHRpbWVcblx0XHQgKiAgQHR5cGUge1RpY2tzfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5FdmVudCNcblx0XHQgKiAgQG5hbWUgc3RhcnRPZmZzZXRcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkV2ZW50LnByb3RvdHlwZSwgJ3N0YXJ0T2Zmc2V0Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRPZmZzZXQ7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChvZmZzZXQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fc3RhcnRPZmZzZXQgPSBvZmZzZXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHByb2JhYmlsaXR5IG9mIHRoZSBub3RlcyBiZWluZyB0cmlnZ2VyZWQuXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkV2ZW50I1xuXHRcdCAqICBAdHlwZSB7Tm9ybWFsUmFuZ2V9XG5cdFx0ICogIEBuYW1lIHByb2JhYmlsaXR5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5FdmVudC5wcm90b3R5cGUsICdwcm9iYWJpbGl0eScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2JhYmlsaXR5O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocHJvYikge1xuXHQgICAgICAgICAgICB0aGlzLl9wcm9iYWJpbGl0eSA9IHByb2I7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgSWYgc2V0IHRvIHRydWUsIHdpbGwgYXBwbHkgc21hbGwgcmFuZG9tIHZhcmlhdGlvblxuXHRcdCAqICB0byB0aGUgY2FsbGJhY2sgdGltZS4gSWYgdGhlIHZhbHVlIGlzIGdpdmVuIGFzIGEgdGltZSwgaXQgd2lsbCByYW5kb21pemVcblx0XHQgKiAgYnkgdGhhdCBhbW91bnQuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogZXZlbnQuaHVtYW5pemUgPSB0cnVlO1xuXHRcdCAqICBAdHlwZSB7Qm9vbGVhbnxUaW1lfVxuXHRcdCAqICBAbmFtZSBodW1hbml6ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRXZlbnQucHJvdG90eXBlLCAnaHVtYW5pemUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9odW1hbml6ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHZhcmlhdGlvbikge1xuXHQgICAgICAgICAgICB0aGlzLl9odW1hbml6ZSA9IHZhcmlhdGlvbjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdGFydCB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7VGltZWxpbmVQb3NpdGlvbn0gIHRpbWUgIFdoZW4gdGhlIG5vdGUgc2hvdWxkIHN0YXJ0LlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5FdmVudH0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRXZlbnQucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1RpY2tzKHRpbWUpO1xuXHQgICAgICAgIGlmICh0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aW1lKSA9PT0gVG9uZS5TdGF0ZS5TdG9wcGVkKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3N0YXRlLmFkZCh7XG5cdCAgICAgICAgICAgICAgICAnc3RhdGUnOiBUb25lLlN0YXRlLlN0YXJ0ZWQsXG5cdCAgICAgICAgICAgICAgICAndGltZSc6IHRpbWUsXG5cdCAgICAgICAgICAgICAgICAnaWQnOiB1bmRlZmluZWRcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHRoaXMuX3Jlc2NoZWR1bGVFdmVudHModGltZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdG9wIHRoZSBFdmVudCBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgQHBhcmFtICB7VGltZWxpbmVQb3NpdGlvbn0gIHRpbWUgIFdoZW4gdGhlIG5vdGUgc2hvdWxkIHN0b3AuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkV2ZW50fSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5FdmVudC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5jYW5jZWwodGltZSk7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9UaWNrcyh0aW1lKTtcblx0ICAgICAgICBpZiAodGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUodGltZSkgPT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICB0aGlzLl9zdGF0ZS5zZXRTdGF0ZUF0VGltZShUb25lLlN0YXRlLlN0b3BwZWQsIHRpbWUpO1xuXHQgICAgICAgICAgICB2YXIgcHJldmlvdXNFdmVudCA9IHRoaXMuX3N0YXRlLmdldEJlZm9yZSh0aW1lKTtcblx0ICAgICAgICAgICAgdmFyIHJlc2NoZWR1bFRpbWUgPSB0aW1lO1xuXHQgICAgICAgICAgICBpZiAocHJldmlvdXNFdmVudCAhPT0gbnVsbCkge1xuXHQgICAgICAgICAgICAgICAgcmVzY2hlZHVsVGltZSA9IHByZXZpb3VzRXZlbnQudGltZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLl9yZXNjaGVkdWxlRXZlbnRzKHJlc2NoZWR1bFRpbWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2FuY2VsIGFsbCBzY2hlZHVsZWQgZXZlbnRzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gdGltZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lbGluZVBvc2l0aW9ufSAgW3RpbWU9MF0gIFRoZSB0aW1lIGFmdGVyIHdoaWNoIGV2ZW50cyB3aWxsIGJlIGNhbmNlbC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuRXZlbnR9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkV2ZW50LnByb3RvdHlwZS5jYW5jZWwgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSBUb25lLmRlZmF1bHRBcmcodGltZSwgLUluZmluaXR5KTtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1RpY2tzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLmZvckVhY2hGcm9tKHRpbWUsIGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICBUb25lLlRyYW5zcG9ydC5jbGVhcihldmVudC5pZCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUuY2FuY2VsKHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlci4gQWxzb1xuXHRcdCAqICBjaGVja3MgaWYgdGhlIEV2ZW50IGlzIGRvbmUgcGxheWluZ1xuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lICBUaGUgdGltZSBvZiB0aGUgZXZlbnQgaW4gc2Vjb25kc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5FdmVudC5wcm90b3R5cGUuX3RpY2sgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHZhciB0aWNrcyA9IFRvbmUuVHJhbnNwb3J0LmdldFRpY2tzQXRUaW1lKHRpbWUpO1xuXHQgICAgICAgIGlmICghdGhpcy5tdXRlICYmIHRoaXMuX3N0YXRlLmdldFZhbHVlQXRUaW1lKHRpY2tzKSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnByb2JhYmlsaXR5IDwgMSAmJiBNYXRoLnJhbmRvbSgpID4gdGhpcy5wcm9iYWJpbGl0eSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmh1bWFuaXplKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgdmFyaWF0aW9uID0gMC4wMjtcblx0ICAgICAgICAgICAgICAgIGlmICghVG9uZS5pc0Jvb2xlYW4odGhpcy5odW1hbml6ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YXJpYXRpb24gPSB0aGlzLnRvU2Vjb25kcyh0aGlzLmh1bWFuaXplKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRpbWUgKz0gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSkgKiB2YXJpYXRpb247XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aW1lLCB0aGlzLnZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEdldCB0aGUgZHVyYXRpb24gb2YgdGhlIGxvb3AuXG5cdFx0ICogIEByZXR1cm4gIHtUaWNrc31cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuRXZlbnQucHJvdG90eXBlLl9nZXRMb29wRHVyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKHRoaXMuX2xvb3BFbmQgLSB0aGlzLl9sb29wU3RhcnQpIC8gdGhpcy5fcGxheWJhY2tSYXRlKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgSWYgdGhlIG5vdGUgc2hvdWxkIGxvb3Agb3Igbm90XG5cdFx0ICogIGJldHdlZW4gVG9uZS5FdmVudC5sb29wU3RhcnQgYW5kXG5cdFx0ICogIFRvbmUuRXZlbnQubG9vcEVuZC4gQW4gaW50ZWdlclxuXHRcdCAqICB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mXG5cdFx0ICogIGxvb3BzIHRoZSBFdmVudCBkb2VzIGFmdGVyIGl0IHN0YXJ0cy5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuRXZlbnQjXG5cdFx0ICogIEB0eXBlIHtCb29sZWFufFBvc2l0aXZlfVxuXHRcdCAqICBAbmFtZSBsb29wXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5FdmVudC5wcm90b3R5cGUsICdsb29wJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9vcDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGxvb3ApIHtcblx0ICAgICAgICAgICAgdGhpcy5fbG9vcCA9IGxvb3A7XG5cdCAgICAgICAgICAgIHRoaXMuX3Jlc2NoZWR1bGVFdmVudHMoKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFx0VGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIG5vdGUuIERlZmF1bHRzIHRvIDEuXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkV2ZW50I1xuXHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0ICogIEBuYW1lIHBsYXliYWNrUmF0ZVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIG5vdGUubG9vcCA9IHRydWU7XG5cdFx0ICogLy9yZXBlYXQgdGhlIG5vdGUgdHdpY2UgYXMgZmFzdFxuXHRcdCAqIG5vdGUucGxheWJhY2tSYXRlID0gMjtcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkV2ZW50LnByb3RvdHlwZSwgJ3BsYXliYWNrUmF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJhdGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGxheWJhY2tSYXRlID0gcmF0ZTtcblx0ICAgICAgICAgICAgdGhpcy5fcmVzY2hlZHVsZUV2ZW50cygpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBsb29wRW5kIHBvaW50IGlzIHRoZSB0aW1lIHRoZSBldmVudCB3aWxsIGxvb3Bcblx0XHQgKiAgaWYgVG9uZS5FdmVudC5sb29wIGlzIHRydWUuXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkV2ZW50I1xuXHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHQgKiAgQG5hbWUgbG9vcEVuZFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRXZlbnQucHJvdG90eXBlLCAnbG9vcEVuZCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVGlja3ModGhpcy5fbG9vcEVuZCkudG9TZWNvbmRzKCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChsb29wRW5kKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2xvb3BFbmQgPSB0aGlzLnRvVGlja3MobG9vcEVuZCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9sb29wKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9yZXNjaGVkdWxlRXZlbnRzKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgdGltZSB3aGVuIHRoZSBsb29wIHNob3VsZCBzdGFydC5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuRXZlbnQjXG5cdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdCAqICBAbmFtZSBsb29wU3RhcnRcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkV2ZW50LnByb3RvdHlwZSwgJ2xvb3BTdGFydCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVGlja3ModGhpcy5fbG9vcFN0YXJ0KS50b1NlY29uZHMoKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGxvb3BTdGFydCkge1xuXHQgICAgICAgICAgICB0aGlzLl9sb29wU3RhcnQgPSB0aGlzLnRvVGlja3MobG9vcFN0YXJ0KTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2xvb3ApIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2NoZWR1bGVFdmVudHMoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBjdXJyZW50IHByb2dyZXNzIG9mIHRoZSBsb29wIGludGVydmFsLlxuXHRcdCAqICBSZXR1cm5zIDAgaWYgdGhlIGV2ZW50IGlzIG5vdCBzdGFydGVkIHlldCBvclxuXHRcdCAqICBpdCBpcyBub3Qgc2V0IHRvIGxvb3AuXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkV2ZW50I1xuXHRcdCAqICBAdHlwZSB7Tm9ybWFsUmFuZ2V9XG5cdFx0ICogIEBuYW1lIHByb2dyZXNzXG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRXZlbnQucHJvdG90eXBlLCAncHJvZ3Jlc3MnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9sb29wKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgdGlja3MgPSBUb25lLlRyYW5zcG9ydC50aWNrcztcblx0ICAgICAgICAgICAgICAgIHZhciBsYXN0RXZlbnQgPSB0aGlzLl9zdGF0ZS5nZXQodGlja3MpO1xuXHQgICAgICAgICAgICAgICAgaWYgKGxhc3RFdmVudCAhPT0gbnVsbCAmJiBsYXN0RXZlbnQuc3RhdGUgPT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhciBsb29wRHVyYXRpb24gPSB0aGlzLl9nZXRMb29wRHVyYXRpb24oKTtcblx0ICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZ3Jlc3MgPSAodGlja3MgLSBsYXN0RXZlbnQudGltZSkgJSBsb29wRHVyYXRpb247XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzIC8gbG9vcER1cmF0aW9uO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXBcblx0XHQgKiAgQHJldHVybiAge1RvbmUuRXZlbnR9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkV2ZW50LnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuY2FuY2VsKCk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5FdmVudDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLkxvb3AgY3JlYXRlcyBhIGxvb3BlZCBjYWxsYmFjayBhdCB0aGUgXG5cdFx0ICogICAgICAgICBzcGVjaWZpZWQgaW50ZXJ2YWwuIFRoZSBjYWxsYmFjayBjYW4gYmUgXG5cdFx0ICogICAgICAgICBzdGFydGVkLCBzdG9wcGVkIGFuZCBzY2hlZHVsZWQgYWxvbmdcblx0XHQgKiAgICAgICAgIHRoZSBUcmFuc3BvcnQncyB0aW1lbGluZS4gXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIGxvb3AgPSBuZXcgVG9uZS5Mb29wKGZ1bmN0aW9uKHRpbWUpe1xuXHRcdCAqIFx0Ly90cmlnZ2VyZWQgZXZlcnkgZWlnaHRoIG5vdGUuIFxuXHRcdCAqIFx0Y29uc29sZS5sb2codGltZSk7XG5cdFx0ICogfSwgXCI4blwiKS5zdGFydCgwKTtcblx0XHQgKiBUb25lLlRyYW5zcG9ydC5zdGFydCgpO1xuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZX1cblx0XHQgKiAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIHRoZSBldmVudC5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBpbnRlcnZhbCBUaGUgdGltZSBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbGJhY2sgY2FsbHMuIFxuXHRcdCAqL1xuXHQgICAgVG9uZS5Mb29wID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2NhbGxiYWNrJyxcblx0ICAgICAgICAgICAgJ2ludGVydmFsJ1xuXHQgICAgICAgIF0sIFRvbmUuTG9vcCk7XG5cdCAgICAgICAgVG9uZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBldmVudCB3aGljaCBwcm9kdWNlcyB0aGUgY2FsbGJhY2tzXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9ldmVudCA9IG5ldyBUb25lLkV2ZW50KHtcblx0ICAgICAgICAgICAgJ2NhbGxiYWNrJzogdGhpcy5fdGljay5iaW5kKHRoaXMpLFxuXHQgICAgICAgICAgICAnbG9vcCc6IHRydWUsXG5cdCAgICAgICAgICAgICdsb29wRW5kJzogb3B0aW9ucy5pbnRlcnZhbCxcblx0ICAgICAgICAgICAgJ3BsYXliYWNrUmF0ZSc6IG9wdGlvbnMucGxheWJhY2tSYXRlLFxuXHQgICAgICAgICAgICAncHJvYmFiaWxpdHknOiBvcHRpb25zLnByb2JhYmlsaXR5XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIHRoZSBuZXh0IGV2ZW50IGluIHRoZSBwYXR0ZXJuXG5cdFx0XHQgKiAgQHR5cGUge0Z1bmN0aW9ufVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5jYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG5cdCAgICAgICAgLy9zZXQgdGhlIGl0ZXJhdGlvbnNcblx0ICAgICAgICB0aGlzLml0ZXJhdGlvbnMgPSBvcHRpb25zLml0ZXJhdGlvbnM7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5Mb29wKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdHNcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Mb29wLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdpbnRlcnZhbCc6ICc0bicsXG5cdCAgICAgICAgJ2NhbGxiYWNrJzogVG9uZS5ub09wLFxuXHQgICAgICAgICdwbGF5YmFja1JhdGUnOiAxLFxuXHQgICAgICAgICdpdGVyYXRpb25zJzogSW5maW5pdHksXG5cdCAgICAgICAgJ3Byb2JhYmlsaXR5JzogdHJ1ZSxcblx0ICAgICAgICAnbXV0ZSc6IGZhbHNlXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN0YXJ0IHRoZSBsb29wIGF0IHRoZSBzcGVjaWZpZWQgdGltZSBhbG9uZyB0aGUgVHJhbnNwb3J0J3Ncblx0XHQgKiAgdGltZWxpbmUuXG5cdFx0ICogIEBwYXJhbSAge1RpbWVsaW5lUG9zaXRpb249fSAgdGltZSAgV2hlbiB0byBzdGFydCB0aGUgTG9vcC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuTG9vcH0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTG9vcC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRoaXMuX2V2ZW50LnN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdG9wIHRoZSBsb29wIGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lbGluZVBvc2l0aW9uPX0gIHRpbWUgIFdoZW4gdG8gc3RvcCB0aGUgQXJwZWdnaW9cblx0XHQgKiAgQHJldHVybiAge1RvbmUuTG9vcH0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTG9vcC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fZXZlbnQuc3RvcCh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2FuY2VsIGFsbCBzY2hlZHVsZWQgZXZlbnRzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gdGltZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lbGluZVBvc2l0aW9ufSAgW3RpbWU9MF0gIFRoZSB0aW1lIGFmdGVyIHdoaWNoIGV2ZW50cyB3aWxsIGJlIGNhbmNlbC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuTG9vcH0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTG9vcC5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLl9ldmVudC5jYW5jZWwodGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEludGVybmFsIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBub3RlcyBzaG91bGQgYmUgY2FsbGVkXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIHRpbWUgIFRoZSB0aW1lIHRoZSBldmVudCBvY2N1cnNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuTG9vcC5wcm90b3R5cGUuX3RpY2sgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2sodGltZSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBzdGF0ZSBvZiB0aGUgTG9vcCwgZWl0aGVyIHN0YXJ0ZWQgb3Igc3RvcHBlZC5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTG9vcCNcblx0XHQgKiAgQHR5cGUge1N0cmluZ31cblx0XHQgKiAgQG5hbWUgc3RhdGVcblx0XHQgKiAgQHJlYWRPbmx5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Mb29wLnByb3RvdHlwZSwgJ3N0YXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnQuc3RhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHByb2dyZXNzIG9mIHRoZSBsb29wIGFzIGEgdmFsdWUgYmV0d2VlbiAwLTEuIDAsIHdoZW5cblx0XHQgKiAgdGhlIGxvb3AgaXMgc3RvcHBlZCBvciBkb25lIGl0ZXJhdGluZy4gXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkxvb3AjXG5cdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHQgKiAgQG5hbWUgcHJvZ3Jlc3Ncblx0XHQgKiAgQHJlYWRPbmx5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Mb29wLnByb3RvdHlwZSwgJ3Byb2dyZXNzJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnQucHJvZ3Jlc3M7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHRpbWUgYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxiYWNrcy4gXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogbG9vcC5pbnRlcnZhbCA9IFwiOG5cIjsgLy9sb29wIGV2ZXJ5IDhuXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkxvb3AjXG5cdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdCAqICBAbmFtZSBpbnRlcnZhbFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTG9vcC5wcm90b3R5cGUsICdpbnRlcnZhbCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50Lmxvb3BFbmQ7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChpbnRlcnZhbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9ldmVudC5sb29wRW5kID0gaW50ZXJ2YWw7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIGxvb3AuIFRoZSBub3JtYWwgcGxheWJhY2sgcmF0ZSBpcyAxIChubyBjaGFuZ2UpLiBcblx0XHQgKiAgQSBgcGxheWJhY2tSYXRlYCBvZiAyIHdvdWxkIGJlIHR3aWNlIGFzIGZhc3QuIFxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5Mb29wI1xuXHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHQgKiAgQG5hbWUgcGxheWJhY2tSYXRlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Mb29wLnByb3RvdHlwZSwgJ3BsYXliYWNrUmF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50LnBsYXliYWNrUmF0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJhdGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZXZlbnQucGxheWJhY2tSYXRlID0gcmF0ZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBSYW5kb20gdmFyaWF0aW9uICsvLTAuMDFzIHRvIHRoZSBzY2hlZHVsZWQgdGltZS4gXG5cdFx0ICogIE9yIGdpdmUgaXQgYSB0aW1lIHZhbHVlIHdoaWNoIGl0IHdpbGwgcmFuZG9taXplIGJ5LlxuXHRcdCAqICBAdHlwZSB7Qm9vbGVhbnxUaW1lfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5Mb29wI1xuXHRcdCAqICBAbmFtZSBodW1hbml6ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTG9vcC5wcm90b3R5cGUsICdodW1hbml6ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50Lmh1bWFuaXplO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFyaWF0aW9uKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2V2ZW50Lmh1bWFuaXplID0gdmFyaWF0aW9uO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBwcm9iYWJseSBvZiB0aGUgY2FsbGJhY2sgYmVpbmcgaW52b2tlZC5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTG9vcCNcblx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdCAqICBAbmFtZSBwcm9iYWJpbGl0eVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTG9vcC5wcm90b3R5cGUsICdwcm9iYWJpbGl0eScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50LnByb2JhYmlsaXR5O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocHJvYikge1xuXHQgICAgICAgICAgICB0aGlzLl9ldmVudC5wcm9iYWJpbGl0eSA9IHByb2I7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgTXV0aW5nIHRoZSBMb29wIG1lYW5zIHRoYXQgbm8gY2FsbGJhY2tzIGFyZSBpbnZva2VkLlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5Mb29wI1xuXHRcdCAqICBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKiAgQG5hbWUgbXV0ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTG9vcC5wcm90b3R5cGUsICdtdXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnQubXV0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG11dGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fZXZlbnQubXV0ZSA9IG11dGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIHRoZSBsb29wLiBUaGUgZGVmYXVsdFxuXHRcdCAqICB2YWx1ZSBpcyBJbmZpbml0eSAobG9vcCBmb3JldmVyKS5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTG9vcCNcblx0XHQgKiAgQHR5cGUge1Bvc2l0aXZlfVxuXHRcdCAqICBAbmFtZSBpdGVyYXRpb25zXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Mb29wLnByb3RvdHlwZSwgJ2l0ZXJhdGlvbnMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9ldmVudC5sb29wID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnQubG9vcDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoaXRlcnMpIHtcblx0ICAgICAgICAgICAgaWYgKGl0ZXJzID09PSBJbmZpbml0eSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnQubG9vcCA9IHRydWU7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9ldmVudC5sb29wID0gaXRlcnM7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5Mb29wfSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Mb29wLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX2V2ZW50LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9ldmVudCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGw7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuTG9vcDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuUGFydCBpcyBhIGNvbGxlY3Rpb24gVG9uZS5FdmVudHMgd2hpY2ggY2FuIGJlXG5cdFx0ICogICAgICAgICBzdGFydGVkL3N0b3BwZWQgYW5kIGxvb3BlZCBhcyBhIHNpbmdsZSB1bml0LlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkV2ZW50fVxuXHRcdCAqICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIG9uIGVhY2ggZXZlbnRcblx0XHQgKiAgQHBhcmFtIHtBcnJheX0gZXZlbnRzIHRoZSBhcnJheSBvZiBldmVudHNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgcGFydCA9IG5ldyBUb25lLlBhcnQoZnVuY3Rpb24odGltZSwgbm90ZSl7XG5cdFx0ICogXHQvL3RoZSBub3RlcyBnaXZlbiBhcyB0aGUgc2Vjb25kIGVsZW1lbnQgaW4gdGhlIGFycmF5XG5cdFx0ICogXHQvL3dpbGwgYmUgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnRcblx0XHQgKiBcdHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKG5vdGUsIFwiOG5cIiwgdGltZSk7XG5cdFx0ICogfSwgW1swLCBcIkMyXCJdLCBbXCIwOjJcIiwgXCJDM1wiXSwgW1wiMDozOjJcIiwgXCJHMlwiXV0pO1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vdXNlIGFuIGFycmF5IG9mIG9iamVjdHMgYXMgbG9uZyBhcyB0aGUgb2JqZWN0IGhhcyBhIFwidGltZVwiIGF0dHJpYnV0ZVxuXHRcdCAqIHZhciBwYXJ0ID0gbmV3IFRvbmUuUGFydChmdW5jdGlvbih0aW1lLCB2YWx1ZSl7XG5cdFx0ICogXHQvL3RoZSB2YWx1ZSBpcyBhbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgYm90aCB0aGUgbm90ZSBhbmQgdGhlIHZlbG9jaXR5XG5cdFx0ICogXHRzeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZSh2YWx1ZS5ub3RlLCBcIjhuXCIsIHRpbWUsIHZhbHVlLnZlbG9jaXR5KTtcblx0XHQgKiB9LCBbe1widGltZVwiIDogMCwgXCJub3RlXCIgOiBcIkMzXCIsIFwidmVsb2NpdHlcIjogMC45fSxcblx0XHQgKiBcdCAgIHtcInRpbWVcIiA6IFwiMDoyXCIsIFwibm90ZVwiIDogXCJDNFwiLCBcInZlbG9jaXR5XCI6IDAuNX1cblx0XHQgKiBdKS5zdGFydCgwKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFydCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdjYWxsYmFjaycsXG5cdCAgICAgICAgICAgICdldmVudHMnXG5cdCAgICAgICAgXSwgVG9uZS5QYXJ0KTtcblx0ICAgICAgICBUb25lLkV2ZW50LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQW4gYXJyYXkgb2YgT2JqZWN0cy5cblx0XHRcdCAqICBAdHlwZSAge0FycmF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcblx0ICAgICAgICAvL2FkZCB0aGUgZXZlbnRzXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLmV2ZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmV2ZW50c1tpXSkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuYWRkKG9wdGlvbnMuZXZlbnRzW2ldWzBdLCBvcHRpb25zLmV2ZW50c1tpXVsxXSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmFkZChvcHRpb25zLmV2ZW50c1tpXSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5QYXJ0LCBUb25lLkV2ZW50KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdCB2YWx1ZXNcblx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0ICogIEBjb25zdFxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJ0LmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdjYWxsYmFjayc6IFRvbmUubm9PcCxcblx0ICAgICAgICAnbG9vcCc6IGZhbHNlLFxuXHQgICAgICAgICdsb29wRW5kJzogJzFtJyxcblx0ICAgICAgICAnbG9vcFN0YXJ0JzogMCxcblx0ICAgICAgICAncGxheWJhY2tSYXRlJzogMSxcblx0ICAgICAgICAncHJvYmFiaWxpdHknOiAxLFxuXHQgICAgICAgICdodW1hbml6ZSc6IGZhbHNlLFxuXHQgICAgICAgICdtdXRlJzogZmFsc2UsXG5cdCAgICAgICAgJ2V2ZW50cyc6IFtdXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN0YXJ0IHRoZSBwYXJ0IGF0IHRoZSBnaXZlbiB0aW1lLlxuXHRcdCAqICBAcGFyYW0gIHtUcmFuc3BvcnRUaW1lfSAgdGltZSAgICBXaGVuIHRvIHN0YXJ0IHRoZSBwYXJ0LlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lPX0gIG9mZnNldCAgVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGFydFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmVnaW4gcGxheWluZyBhdC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuUGFydH0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFydC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAodGltZSwgb2Zmc2V0KSB7XG5cdCAgICAgICAgdmFyIHRpY2tzID0gdGhpcy50b1RpY2tzKHRpbWUpO1xuXHQgICAgICAgIGlmICh0aGlzLl9zdGF0ZS5nZXRWYWx1ZUF0VGltZSh0aWNrcykgIT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fbG9vcCkge1xuXHQgICAgICAgICAgICAgICAgb2Zmc2V0ID0gVG9uZS5kZWZhdWx0QXJnKG9mZnNldCwgdGhpcy5fbG9vcFN0YXJ0KTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIG9mZnNldCA9IFRvbmUuZGVmYXVsdEFyZyhvZmZzZXQsIDApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG9mZnNldCA9IHRoaXMudG9UaWNrcyhvZmZzZXQpO1xuXHQgICAgICAgICAgICB0aGlzLl9zdGF0ZS5hZGQoe1xuXHQgICAgICAgICAgICAgICAgJ3N0YXRlJzogVG9uZS5TdGF0ZS5TdGFydGVkLFxuXHQgICAgICAgICAgICAgICAgJ3RpbWUnOiB0aWNrcyxcblx0ICAgICAgICAgICAgICAgICdvZmZzZXQnOiBvZmZzZXRcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9zdGFydE5vdGUoZXZlbnQsIHRpY2tzLCBvZmZzZXQpO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN0YXJ0IHRoZSBldmVudCBpbiB0aGUgZ2l2ZW4gZXZlbnQgYXQgdGhlIGNvcnJlY3QgdGltZSBnaXZlblxuXHRcdCAqICB0aGUgdGlja3MgYW5kIG9mZnNldCBhbmQgbG9vcGluZy5cblx0XHQgKiAgQHBhcmFtICB7VG9uZS5FdmVudH0gIGV2ZW50XG5cdFx0ICogIEBwYXJhbSAge1RpY2tzfSAgdGlja3Ncblx0XHQgKiAgQHBhcmFtICB7VGlja3N9ICBvZmZzZXRcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFydC5wcm90b3R5cGUuX3N0YXJ0Tm90ZSA9IGZ1bmN0aW9uIChldmVudCwgdGlja3MsIG9mZnNldCkge1xuXHQgICAgICAgIHRpY2tzIC09IG9mZnNldDtcblx0ICAgICAgICBpZiAodGhpcy5fbG9vcCkge1xuXHQgICAgICAgICAgICBpZiAoZXZlbnQuc3RhcnRPZmZzZXQgPj0gdGhpcy5fbG9vcFN0YXJ0ICYmIGV2ZW50LnN0YXJ0T2Zmc2V0IDwgdGhpcy5fbG9vcEVuZCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnN0YXJ0T2Zmc2V0IDwgb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9zdGFydCBpdCBvbiB0aGUgbmV4dCBsb29wXG5cdCAgICAgICAgICAgICAgICAgICAgdGlja3MgKz0gdGhpcy5fZ2V0TG9vcER1cmF0aW9uKCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBldmVudC5zdGFydChUb25lLlRpY2tzKHRpY2tzKSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc3RhcnRPZmZzZXQgPCB0aGlzLl9sb29wU3RhcnQgJiYgZXZlbnQuc3RhcnRPZmZzZXQgPj0gb2Zmc2V0KSB7XG5cdCAgICAgICAgICAgICAgICBldmVudC5sb29wID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBldmVudC5zdGFydChUb25lLlRpY2tzKHRpY2tzKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnN0YXJ0T2Zmc2V0ID49IG9mZnNldCkge1xuXHQgICAgICAgICAgICBldmVudC5zdGFydChUb25lLlRpY2tzKHRpY2tzKSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgc3RhcnQgZnJvbSB0aGUgc2NoZWR1bGVkIHN0YXJ0IHRpbWVcblx0XHQgKiAgQHR5cGUge1RpY2tzfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYXJ0I1xuXHRcdCAqICBAbmFtZSBzdGFydE9mZnNldFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGFydC5wcm90b3R5cGUsICdzdGFydE9mZnNldCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0T2Zmc2V0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAob2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3N0YXJ0T2Zmc2V0ID0gb2Zmc2V0O1xuXHQgICAgICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICAgICAgZXZlbnQuc3RhcnRPZmZzZXQgKz0gdGhpcy5fc3RhcnRPZmZzZXQ7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFN0b3AgdGhlIHBhcnQgYXQgdGhlIGdpdmVuIHRpbWUuXG5cdFx0ICogIEBwYXJhbSAge1RpbWVsaW5lUG9zaXRpb259ICB0aW1lICBXaGVuIHRvIHN0b3AgdGhlIHBhcnQuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLlBhcnR9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcnQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHZhciB0aWNrcyA9IHRoaXMudG9UaWNrcyh0aW1lKTtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5jYW5jZWwodGlja3MpO1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLnNldFN0YXRlQXRUaW1lKFRvbmUuU3RhdGUuU3RvcHBlZCwgdGlja3MpO1xuXHQgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICAgIGV2ZW50LnN0b3AodGltZSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEdldC9TZXQgYW4gRXZlbnQncyB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKiAgSWYgYSB2YWx1ZSBpcyBwYXNzZWQgaW4gYW5kIG5vIGV2ZW50IGV4aXN0cyBhdFxuXHRcdCAqICB0aGUgZ2l2ZW4gdGltZSwgb25lIHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoYXQgdmFsdWUuXG5cdFx0ICogIElmIHR3byBldmVudHMgYXJlIGF0IHRoZSBzYW1lIHRpbWUsIHRoZSBmaXJzdCBvbmUgd2lsbFxuXHRcdCAqICBiZSByZXR1cm5lZC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBwYXJ0LmF0KFwiMW1cIik7IC8vcmV0dXJucyB0aGUgcGFydCBhdCB0aGUgZmlyc3QgbWVhc3VyZVxuXHRcdCAqXG5cdFx0ICogcGFydC5hdChcIjJtXCIsIFwiQzJcIik7IC8vc2V0IHRoZSB2YWx1ZSBhdCBcIjJtXCIgdG8gQzIuXG5cdFx0ICogLy9pZiBhbiBldmVudCBkaWRuJ3QgZXhpc3QgYXQgdGhhdCB0aW1lLCBpdCB3aWxsIGJlIGNyZWF0ZWQuXG5cdFx0ICogIEBwYXJhbSB7VHJhbnNwb3J0VGltZX0gdGltZSBUaGUgdGltZSBvZiB0aGUgZXZlbnQgdG8gZ2V0IG9yIHNldC5cblx0XHQgKiAgQHBhcmFtIHsqPX0gdmFsdWUgSWYgYSB2YWx1ZSBpcyBwYXNzZWQgaW4sIHRoZSB2YWx1ZSBvZiB0aGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgZXZlbnQgYXQgdGhlIGdpdmVuIHRpbWUgd2lsbCBiZSBzZXQgdG8gaXQuXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuRXZlbnR9IHRoZSBldmVudCBhdCB0aGUgdGltZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJ0LnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uICh0aW1lLCB2YWx1ZSkge1xuXHQgICAgICAgIHRpbWUgPSBUb25lLlRyYW5zcG9ydFRpbWUodGltZSk7XG5cdCAgICAgICAgdmFyIHRpY2tUaW1lID0gVG9uZS5UaWNrcygxKS50b1NlY29uZHMoKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2V2ZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB2YXIgZXZlbnQgPSB0aGlzLl9ldmVudHNbaV07XG5cdCAgICAgICAgICAgIGlmIChNYXRoLmFicyh0aW1lLnRvVGlja3MoKSAtIGV2ZW50LnN0YXJ0T2Zmc2V0KSA8IHRpY2tUaW1lKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQodmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZXZlbnQudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBldmVudDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICAvL2lmIHRoZXJlIHdhcyBubyBldmVudCBhdCB0aGF0IHRpbWUsIGNyZWF0ZSBvbmVcblx0ICAgICAgICBpZiAoVG9uZS5pc0RlZmluZWQodmFsdWUpKSB7XG5cdCAgICAgICAgICAgIHRoaXMuYWRkKHRpbWUsIHZhbHVlKTtcblx0ICAgICAgICAgICAgLy9yZXR1cm4gdGhlIG5ldyBldmVudFxuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzW3RoaXMuX2V2ZW50cy5sZW5ndGggLSAxXTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEFkZCBhIGFuIGV2ZW50IHRvIHRoZSBwYXJ0LlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IHRpbWUgVGhlIHRpbWUgdGhlIG5vdGUgc2hvdWxkIHN0YXJ0LlxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGFuIG9iamVjdCBpcyBwYXNzZWQgaW4sIGl0IHNob3VsZFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYSAndGltZScgYXR0cmlidXRlIGFuZCB0aGUgcmVzdFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBvYmplY3Qgd2lsbCBiZSB1c2VkIGFzIHRoZSAndmFsdWUnLlxuXHRcdCAqICBAcGFyYW0gIHtUb25lLkV2ZW50fCp9ICB2YWx1ZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QYXJ0fSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogcGFydC5hZGQoXCIxbVwiLCBcIkMjKzExXCIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJ0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodGltZSwgdmFsdWUpIHtcblx0ICAgICAgICAvL2V4dHJhY3QgdGhlIHBhcmFtZXRlcnNcblx0ICAgICAgICBpZiAodGltZS5oYXNPd25Qcm9wZXJ0eSgndGltZScpKSB7XG5cdCAgICAgICAgICAgIHZhbHVlID0gdGltZTtcblx0ICAgICAgICAgICAgdGltZSA9IHZhbHVlLnRpbWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvVGlja3ModGltZSk7XG5cdCAgICAgICAgdmFyIGV2ZW50O1xuXHQgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRvbmUuRXZlbnQpIHtcblx0ICAgICAgICAgICAgZXZlbnQgPSB2YWx1ZTtcblx0ICAgICAgICAgICAgZXZlbnQuY2FsbGJhY2sgPSB0aGlzLl90aWNrLmJpbmQodGhpcyk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgZXZlbnQgPSBuZXcgVG9uZS5FdmVudCh7XG5cdCAgICAgICAgICAgICAgICAnY2FsbGJhY2snOiB0aGlzLl90aWNrLmJpbmQodGhpcyksXG5cdCAgICAgICAgICAgICAgICAndmFsdWUnOiB2YWx1ZVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy90aGUgc3RhcnQgb2Zmc2V0XG5cdCAgICAgICAgZXZlbnQuc3RhcnRPZmZzZXQgPSB0aW1lO1xuXHQgICAgICAgIC8vaW5pdGlhbGl6ZSB0aGUgdmFsdWVzXG5cdCAgICAgICAgZXZlbnQuc2V0KHtcblx0ICAgICAgICAgICAgJ2xvb3BFbmQnOiB0aGlzLmxvb3BFbmQsXG5cdCAgICAgICAgICAgICdsb29wU3RhcnQnOiB0aGlzLmxvb3BTdGFydCxcblx0ICAgICAgICAgICAgJ2xvb3AnOiB0aGlzLmxvb3AsXG5cdCAgICAgICAgICAgICdodW1hbml6ZSc6IHRoaXMuaHVtYW5pemUsXG5cdCAgICAgICAgICAgICdwbGF5YmFja1JhdGUnOiB0aGlzLnBsYXliYWNrUmF0ZSxcblx0ICAgICAgICAgICAgJ3Byb2JhYmlsaXR5JzogdGhpcy5wcm9iYWJpbGl0eVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRoaXMuX2V2ZW50cy5wdXNoKGV2ZW50KTtcblx0ICAgICAgICAvL3N0YXJ0IHRoZSBub3RlIGlmIGl0IHNob3VsZCBiZSBwbGF5ZWQgcmlnaHQgbm93XG5cdCAgICAgICAgdGhpcy5fcmVzdGFydEV2ZW50KGV2ZW50KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmVzdGFydCB0aGUgZ2l2ZW4gZXZlbnRcblx0XHQgKiAgQHBhcmFtICB7VG9uZS5FdmVudH0gIGV2ZW50XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcnQucHJvdG90eXBlLl9yZXN0YXJ0RXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZUV2ZW50KSB7XG5cdCAgICAgICAgICAgIGlmIChzdGF0ZUV2ZW50LnN0YXRlID09PSBUb25lLlN0YXRlLlN0YXJ0ZWQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0Tm90ZShldmVudCwgc3RhdGVFdmVudC50aW1lLCBzdGF0ZUV2ZW50Lm9mZnNldCk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvL3N0b3AgdGhlIG5vdGVcblx0ICAgICAgICAgICAgICAgIGV2ZW50LnN0b3AoVG9uZS5UaWNrcyhzdGF0ZUV2ZW50LnRpbWUpKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJlbW92ZSBhbiBldmVudCBmcm9tIHRoZSBwYXJ0LiBXaWxsIHJlY3Vyc2l2ZWx5IGl0ZXJhdGVcblx0XHQgKiAgaW50byBuZXN0ZWQgcGFydHMgdG8gZmluZCB0aGUgZXZlbnQuXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gdGltZSBUaGUgdGltZSBvZiB0aGUgZXZlbnRcblx0XHQgKiAgQHBhcmFtIHsqfSB2YWx1ZSBPcHRpb25hbGx5IHNlbGVjdCBvbmx5IGEgc3BlY2lmaWMgZXZlbnQgdmFsdWVcblx0XHQgKiAgQHJldHVybiAge1RvbmUuUGFydH0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFydC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHRpbWUsIHZhbHVlKSB7XG5cdCAgICAgICAgLy9leHRyYWN0IHRoZSBwYXJhbWV0ZXJzXG5cdCAgICAgICAgaWYgKHRpbWUuaGFzT3duUHJvcGVydHkoJ3RpbWUnKSkge1xuXHQgICAgICAgICAgICB2YWx1ZSA9IHRpbWU7XG5cdCAgICAgICAgICAgIHRpbWUgPSB2YWx1ZS50aW1lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aW1lID0gdGhpcy50b1RpY2tzKHRpbWUpO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9ldmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgICAgICAgdmFyIGV2ZW50ID0gdGhpcy5fZXZlbnRzW2ldO1xuXHQgICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBUb25lLlBhcnQpIHtcblx0ICAgICAgICAgICAgICAgIGV2ZW50LnJlbW92ZSh0aW1lLCB2YWx1ZSk7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc3RhcnRPZmZzZXQgPT09IHRpbWUpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChUb25lLmlzVW5kZWYodmFsdWUpIHx8IFRvbmUuaXNEZWZpbmVkKHZhbHVlKSAmJiBldmVudC52YWx1ZSA9PT0gdmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50LmRpc3Bvc2UoKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgUmVtb3ZlIGFsbCBvZiB0aGUgbm90ZXMgZnJvbSB0aGUgZ3JvdXAuXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLlBhcnR9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcnQucHJvdG90eXBlLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICBldmVudC5kaXNwb3NlKCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENhbmNlbCBzY2hlZHVsZWQgc3RhdGUgY2hhbmdlIGV2ZW50czogaS5lLiBcInN0YXJ0XCIgYW5kIFwic3RvcFwiLlxuXHRcdCAqICBAcGFyYW0ge1RpbWVsaW5lUG9zaXRpb259IGFmdGVyIFRoZSB0aW1lIGFmdGVyIHdoaWNoIHRvIGNhbmNlbCB0aGUgc2NoZWR1bGVkIGV2ZW50cy5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuUGFydH0gIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGFydC5wcm90b3R5cGUuY2FuY2VsID0gZnVuY3Rpb24gKGFmdGVyKSB7XG5cdCAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgICAgZXZlbnQuY2FuY2VsKGFmdGVyKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5jYW5jZWwodGhpcy50b1RpY2tzKGFmdGVyKSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGV2ZW50c1xuXHRcdCAqICBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuXHRcdCAqICBAcGFyYW0ge09iamVjdH0gY3R4IFRoZSBjb250ZXh0XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcnQucHJvdG90eXBlLl9mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBjdHgpIHtcblx0ICAgICAgICBpZiAodGhpcy5fZXZlbnRzKSB7XG5cdCAgICAgICAgICAgIGN0eCA9IFRvbmUuZGVmYXVsdEFyZyhjdHgsIHRoaXMpO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5fZXZlbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX2V2ZW50c1tpXTtcblx0ICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVG9uZS5QYXJ0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZS5fZm9yRWFjaChjYWxsYmFjaywgY3R4KTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChjdHgsIGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTZXQgdGhlIGF0dHJpYnV0ZSBvZiBhbGwgb2YgdGhlIGV2ZW50c1xuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmd9ICBhdHRyICB0aGUgYXR0cmlidXRlIHRvIHNldFxuXHRcdCAqICBAcGFyYW0gIHsqfSAgdmFsdWUgICAgICBUaGUgdmFsdWUgdG8gc2V0IGl0IHRvXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcnQucHJvdG90eXBlLl9zZXRBbGwgPSBmdW5jdGlvbiAoYXR0ciwgdmFsdWUpIHtcblx0ICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICBldmVudFthdHRyXSA9IHZhbHVlO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJbnRlcm5hbCB0aWNrIG1ldGhvZFxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lICBUaGUgdGltZSBvZiB0aGUgZXZlbnQgaW4gc2Vjb25kc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJ0LnByb3RvdHlwZS5fdGljayA9IGZ1bmN0aW9uICh0aW1lLCB2YWx1ZSkge1xuXHQgICAgICAgIGlmICghdGhpcy5tdXRlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sodGltZSwgdmFsdWUpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgRGV0ZXJtaW5lIGlmIHRoZSBldmVudCBzaG91bGQgYmUgY3VycmVudGx5IGxvb3Bpbmdcblx0XHQgKiAgZ2l2ZW4gdGhlIGxvb3AgYm91bmRyaWVzIG9mIHRoaXMgUGFydC5cblx0XHQgKiAgQHBhcmFtICB7VG9uZS5FdmVudH0gIGV2ZW50ICBUaGUgZXZlbnQgdG8gdGVzdFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXJ0LnByb3RvdHlwZS5fdGVzdExvb3BCb3VuZHJpZXMgPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICBpZiAoZXZlbnQuc3RhcnRPZmZzZXQgPCB0aGlzLl9sb29wU3RhcnQgfHwgZXZlbnQuc3RhcnRPZmZzZXQgPj0gdGhpcy5fbG9vcEVuZCkge1xuXHQgICAgICAgICAgICBldmVudC5jYW5jZWwoMCk7XG5cdCAgICAgICAgfSBlbHNlIGlmIChldmVudC5zdGF0ZSA9PT0gVG9uZS5TdGF0ZS5TdG9wcGVkKSB7XG5cdCAgICAgICAgICAgIC8vcmVzY2hlZHVsZSBpdCBpZiBpdCdzIHN0b3BwZWRcblx0ICAgICAgICAgICAgdGhpcy5fcmVzdGFydEV2ZW50KGV2ZW50KTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgbm90ZXMgYmVpbmcgdHJpZ2dlcmVkLlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYXJ0I1xuXHRcdCAqICBAdHlwZSB7Tm9ybWFsUmFuZ2V9XG5cdFx0ICogIEBuYW1lIHByb2JhYmlsaXR5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYXJ0LnByb3RvdHlwZSwgJ3Byb2JhYmlsaXR5Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvYmFiaWxpdHk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwcm9iKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3Byb2JhYmlsaXR5ID0gcHJvYjtcblx0ICAgICAgICAgICAgdGhpcy5fc2V0QWxsKCdwcm9iYWJpbGl0eScsIHByb2IpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIElmIHNldCB0byB0cnVlLCB3aWxsIGFwcGx5IHNtYWxsIHJhbmRvbSB2YXJpYXRpb25cblx0XHQgKiAgdG8gdGhlIGNhbGxiYWNrIHRpbWUuIElmIHRoZSB2YWx1ZSBpcyBnaXZlbiBhcyBhIHRpbWUsIGl0IHdpbGwgcmFuZG9taXplXG5cdFx0ICogIGJ5IHRoYXQgYW1vdW50LlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIGV2ZW50Lmh1bWFuaXplID0gdHJ1ZTtcblx0XHQgKiAgQHR5cGUge0Jvb2xlYW58VGltZX1cblx0XHQgKiAgQG5hbWUgaHVtYW5pemVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBhcnQucHJvdG90eXBlLCAnaHVtYW5pemUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9odW1hbml6ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHZhcmlhdGlvbikge1xuXHQgICAgICAgICAgICB0aGlzLl9odW1hbml6ZSA9IHZhcmlhdGlvbjtcblx0ICAgICAgICAgICAgdGhpcy5fc2V0QWxsKCdodW1hbml6ZScsIHZhcmlhdGlvbik7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgSWYgdGhlIHBhcnQgc2hvdWxkIGxvb3Agb3Igbm90XG5cdFx0ICogIGJldHdlZW4gVG9uZS5QYXJ0Lmxvb3BTdGFydCBhbmRcblx0XHQgKiAgVG9uZS5QYXJ0Lmxvb3BFbmQuIEFuIGludGVnZXJcblx0XHQgKiAgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZlxuXHRcdCAqICBsb29wcyB0aGUgUGFydCBkb2VzIGFmdGVyIGl0IHN0YXJ0cy5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGFydCNcblx0XHQgKiAgQHR5cGUge0Jvb2xlYW58UG9zaXRpdmV9XG5cdFx0ICogIEBuYW1lIGxvb3Bcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2xvb3AgdGhlIHBhcnQgOCB0aW1lc1xuXHRcdCAqIHBhcnQubG9vcCA9IDg7XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYXJ0LnByb3RvdHlwZSwgJ2xvb3AnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb29wO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAobG9vcCkge1xuXHQgICAgICAgICAgICB0aGlzLl9sb29wID0gbG9vcDtcblx0ICAgICAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgICAgICAgICAgICAgIGV2ZW50Ll9sb29wU3RhcnQgPSB0aGlzLl9sb29wU3RhcnQ7XG5cdCAgICAgICAgICAgICAgICBldmVudC5fbG9vcEVuZCA9IHRoaXMuX2xvb3BFbmQ7XG5cdCAgICAgICAgICAgICAgICBldmVudC5sb29wID0gbG9vcDtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3Rlc3RMb29wQm91bmRyaWVzKGV2ZW50KTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGxvb3BFbmQgcG9pbnQgZGV0ZXJtaW5lcyB3aGVuIGl0IHdpbGxcblx0XHQgKiAgbG9vcCBpZiBUb25lLlBhcnQubG9vcCBpcyB0cnVlLlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYXJ0I1xuXHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHQgKiAgQG5hbWUgbG9vcEVuZFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGFydC5wcm90b3R5cGUsICdsb29wRW5kJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gVG9uZS5UaWNrcyh0aGlzLl9sb29wRW5kKS50b1NlY29uZHMoKTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGxvb3BFbmQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbG9vcEVuZCA9IHRoaXMudG9UaWNrcyhsb29wRW5kKTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2xvb3ApIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZXZlbnQubG9vcEVuZCA9IGxvb3BFbmQ7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVzdExvb3BCb3VuZHJpZXMoZXZlbnQpO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgbG9vcFN0YXJ0IHBvaW50IGRldGVybWluZXMgd2hlbiBpdCB3aWxsXG5cdFx0ICogIGxvb3AgaWYgVG9uZS5QYXJ0Lmxvb3AgaXMgdHJ1ZS5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGFydCNcblx0XHQgKiAgQHR5cGUge1RpbWV9XG5cdFx0ICogIEBuYW1lIGxvb3BTdGFydFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGFydC5wcm90b3R5cGUsICdsb29wU3RhcnQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBUb25lLlRpY2tzKHRoaXMuX2xvb3BTdGFydCkudG9TZWNvbmRzKCk7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChsb29wU3RhcnQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbG9vcFN0YXJ0ID0gdGhpcy50b1RpY2tzKGxvb3BTdGFydCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9sb29wKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50Lmxvb3BTdGFydCA9IHRoaXMubG9vcFN0YXJ0O1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlc3RMb29wQm91bmRyaWVzKGV2ZW50KTtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBcdFRoZSBwbGF5YmFjayByYXRlIG9mIHRoZSBwYXJ0XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlBhcnQjXG5cdFx0ICogIEB0eXBlIHtQb3NpdGl2ZX1cblx0XHQgKiAgQG5hbWUgcGxheWJhY2tSYXRlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYXJ0LnByb3RvdHlwZSwgJ3BsYXliYWNrUmF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJhdGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGxheWJhY2tSYXRlID0gcmF0ZTtcblx0ICAgICAgICAgICAgdGhpcy5fc2V0QWxsKCdwbGF5YmFja1JhdGUnLCByYXRlKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFx0VGhlIG51bWJlciBvZiBzY2hlZHVsZWQgbm90ZXMgaW4gdGhlIHBhcnQuXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlBhcnQjXG5cdFx0ICogIEB0eXBlIHtQb3NpdGl2ZX1cblx0XHQgKiAgQG5hbWUgbGVuZ3RoXG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGFydC5wcm90b3R5cGUsICdsZW5ndGgnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudHMubGVuZ3RoO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLlBhcnR9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBhcnQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5yZW1vdmVBbGwoKTtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2V2ZW50cyA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuUGFydDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLlBhdHRlcm4gYXJwZWdnaWF0ZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gbm90ZXNcblx0XHQgKiAgICAgICAgIGluIGEgbnVtYmVyIG9mIHBhdHRlcm5zLiBTZWUgVG9uZS5DdHJsUGF0dGVybiBmb3Jcblx0XHQgKiAgICAgICAgIGEgZnVsbCBsaXN0IG9mIHBhdHRlcm5zLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBwYXR0ZXJuID0gbmV3IFRvbmUuUGF0dGVybihmdW5jdGlvbih0aW1lLCBub3RlKXtcblx0XHQgKiAgIC8vdGhlIG9yZGVyIG9mIHRoZSBub3RlcyBwYXNzZWQgaW4gZGVwZW5kcyBvbiB0aGUgcGF0dGVyblxuXHRcdCAqIH0sIFtcIkMyXCIsIFwiRDRcIiwgXCJFNVwiLCBcIkE2XCJdLCBcInVwRG93blwiKTtcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuTG9vcH1cblx0XHQgKiAgQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIHRoZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5cblx0XHQgKiAgQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYXJwZWdnaWF0ZSBvdmVyLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXR0ZXJuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2NhbGxiYWNrJyxcblx0ICAgICAgICAgICAgJ3ZhbHVlcycsXG5cdCAgICAgICAgICAgICdwYXR0ZXJuJ1xuXHQgICAgICAgIF0sIFRvbmUuUGF0dGVybik7XG5cdCAgICAgICAgVG9uZS5Mb29wLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHBhdHRlcm4gbWFuYWdlclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkN0cmxQYXR0ZXJufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9wYXR0ZXJuID0gbmV3IFRvbmUuQ3RybFBhdHRlcm4oe1xuXHQgICAgICAgICAgICAndmFsdWVzJzogb3B0aW9ucy52YWx1ZXMsXG5cdCAgICAgICAgICAgICd0eXBlJzogb3B0aW9ucy5wYXR0ZXJuLFxuXHQgICAgICAgICAgICAnaW5kZXgnOiBvcHRpb25zLmluZGV4XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5QYXR0ZXJuLCBUb25lLkxvb3ApO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBkZWZhdWx0c1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHR5cGUgIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLlBhdHRlcm4uZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3BhdHRlcm4nOiBUb25lLkN0cmxQYXR0ZXJuLlR5cGUuVXAsXG5cdCAgICAgICAgJ2NhbGxiYWNrJzogVG9uZS5ub09wLFxuXHQgICAgICAgICd2YWx1ZXMnOiBbXVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJbnRlcm5hbCBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgbm90ZXMgc2hvdWxkIGJlIGNhbGxlZFxuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICB0aW1lICBUaGUgdGltZSB0aGUgZXZlbnQgb2NjdXJzXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlBhdHRlcm4ucHJvdG90eXBlLl90aWNrID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLmNhbGxiYWNrKHRpbWUsIHRoaXMuX3BhdHRlcm4udmFsdWUpO1xuXHQgICAgICAgIHRoaXMuX3BhdHRlcm4ubmV4dCgpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgY3VycmVudCBpbmRleCBpbiB0aGUgdmFsdWVzIGFycmF5LlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5QYXR0ZXJuI1xuXHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0ICogIEBuYW1lIGluZGV4XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QYXR0ZXJuLnByb3RvdHlwZSwgJ2luZGV4Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGF0dGVybi5pbmRleDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGkpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGF0dGVybi5pbmRleCA9IGk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIGFycmF5IG9mIGV2ZW50cy5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGF0dGVybiNcblx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdCAqICBAbmFtZSB2YWx1ZXNcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBhdHRlcm4ucHJvdG90eXBlLCAndmFsdWVzJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGF0dGVybi52YWx1ZXM7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWxzKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3BhdHRlcm4udmFsdWVzID0gdmFscztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcGF0dGVybi5cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuUGF0dGVybiNcblx0XHQgKiAgQHR5cGUgeyp9XG5cdFx0ICogIEBuYW1lIHZhbHVlXG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGF0dGVybi5wcm90b3R5cGUsICd2YWx1ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm4udmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIHBhdHRlcm4gdHlwZS4gU2VlIFRvbmUuQ3RybFBhdHRlcm4gZm9yIHRoZSBmdWxsIGxpc3Qgb2YgcGF0dGVybnMuXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlBhdHRlcm4jXG5cdFx0ICogIEB0eXBlIHtTdHJpbmd9XG5cdFx0ICogIEBuYW1lIHBhdHRlcm5cblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBhdHRlcm4ucHJvdG90eXBlLCAncGF0dGVybicsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhdHRlcm4udHlwZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBhdHRlcm4pIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGF0dGVybi50eXBlID0gcGF0dGVybjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5QYXR0ZXJufSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QYXR0ZXJuLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuTG9vcC5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3BhdHRlcm4uZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3BhdHRlcm4gPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlBhdHRlcm47XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBBIHNlcXVlbmNlIGlzIGFuIGFsdGVybmF0ZSBub3RhdGlvbiBvZiBhIHBhcnQuIEluc3RlYWRcblx0XHQgKiAgICAgICAgIG9mIHBhc3NpbmcgaW4gYW4gYXJyYXkgb2YgW3RpbWUsIGV2ZW50XSBwYWlycywgcGFzc1xuXHRcdCAqICAgICAgICAgaW4gYW4gYXJyYXkgb2YgZXZlbnRzIHdoaWNoIHdpbGwgYmUgc3BhY2VkIGF0IHRoZVxuXHRcdCAqICAgICAgICAgZ2l2ZW4gc3ViZGl2aXNpb24uIFN1Yi1hcnJheXMgd2lsbCBzdWJkaXZpZGUgdGhhdCBiZWF0XG5cdFx0ICogICAgICAgICBieSB0aGUgbnVtYmVyIG9mIGl0ZW1zIGFyZSBpbiB0aGUgYXJyYXkuXG5cdFx0ICogICAgICAgICBTZXF1ZW5jZSBub3RhdGlvbiBpbnNwaXJhdGlvbiBmcm9tIFtUaWRhbF0oaHR0cDovL3lheHUub3JnL3RpZGFsLylcblx0XHQgKiAgQHBhcmFtICB7RnVuY3Rpb259ICBjYWxsYmFjayAgVGhlIGNhbGxiYWNrIHRvIGludm9rZSB3aXRoIGV2ZXJ5IG5vdGVcblx0XHQgKiAgQHBhcmFtICB7QXJyYXl9ICAgIGV2ZW50cyAgVGhlIHNlcXVlbmNlXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IHN1YmRpdmlzaW9uICBUaGUgc3ViZGl2aXNpb24gYmV0d2VlbiB3aGljaCBldmVudHMgYXJlIHBsYWNlZC5cblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuUGFydH1cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgc2VxID0gbmV3IFRvbmUuU2VxdWVuY2UoZnVuY3Rpb24odGltZSwgbm90ZSl7XG5cdFx0ICogXHRjb25zb2xlLmxvZyhub3RlKTtcblx0XHQgKiAvL3N0cmFpZ2h0IHF1YXRlciBub3Rlc1xuXHRcdCAqIH0sIFtcIkM0XCIsIFwiRTRcIiwgXCJHNFwiLCBcIkE0XCJdLCBcIjRuXCIpO1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBzZXEgPSBuZXcgVG9uZS5TZXF1ZW5jZShmdW5jdGlvbih0aW1lLCBub3RlKXtcblx0XHQgKiBcdGNvbnNvbGUubG9nKG5vdGUpO1xuXHRcdCAqIC8vc3ViZGl2aXNpb25zIGFyZSBnaXZlbiBhcyBzdWJhcnJheXNcblx0XHQgKiB9LCBbXCJDNFwiLCBbXCJFNFwiLCBcIkQ0XCIsIFwiRTRcIl0sIFwiRzRcIiwgW1wiQTRcIiwgXCJHNFwiXV0pO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TZXF1ZW5jZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdjYWxsYmFjaycsXG5cdCAgICAgICAgICAgICdldmVudHMnLFxuXHQgICAgICAgICAgICAnc3ViZGl2aXNpb24nXG5cdCAgICAgICAgXSwgVG9uZS5TZXF1ZW5jZSk7XG5cdCAgICAgICAgLy9yZW1vdmUgdGhlIGV2ZW50c1xuXHQgICAgICAgIHZhciBldmVudHMgPSBvcHRpb25zLmV2ZW50cztcblx0ICAgICAgICBkZWxldGUgb3B0aW9ucy5ldmVudHM7XG5cdCAgICAgICAgVG9uZS5QYXJ0LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHN1YmRpdmlzb24gb2YgZWFjaCBub3RlXG5cdFx0XHQgKiAgQHR5cGUgIHtUaWNrc31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc3ViZGl2aXNpb24gPSB0aGlzLnRvVGlja3Mob3B0aW9ucy5zdWJkaXZpc2lvbik7XG5cdCAgICAgICAgLy9pZiBubyB0aW1lIHdhcyBwYXNzZWQgaW4sIHRoZSBsb29wIGVuZCBpcyB0aGUgZW5kIG9mIHRoZSBjeWNsZVxuXHQgICAgICAgIGlmIChUb25lLmlzVW5kZWYob3B0aW9ucy5sb29wRW5kKSAmJiBUb25lLmlzRGVmaW5lZChldmVudHMpKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2xvb3BFbmQgPSBldmVudHMubGVuZ3RoICogdGhpcy5fc3ViZGl2aXNpb247XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vZGVmYXVsdHMgdG8gbG9vcGluZ1xuXHQgICAgICAgIHRoaXMuX2xvb3AgPSB0cnVlO1xuXHQgICAgICAgIC8vYWRkIGFsbCBvZiB0aGUgZXZlbnRzXG5cdCAgICAgICAgaWYgKFRvbmUuaXNEZWZpbmVkKGV2ZW50cykpIHtcblx0ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuYWRkKGksIGV2ZW50c1tpXSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5TZXF1ZW5jZSwgVG9uZS5QYXJ0KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdCB2YWx1ZXMuXG5cdFx0ICogIEB0eXBlICB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TZXF1ZW5jZS5kZWZhdWx0cyA9IHsgJ3N1YmRpdmlzaW9uJzogJzRuJyB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBzdWJkaXZpc2lvbiBvZiB0aGUgc2VxdWVuY2UuIFRoaXMgY2FuIG9ubHkgYmVcblx0XHQgKiAgc2V0IGluIHRoZSBjb25zdHJ1Y3Rvci4gVGhlIHN1YmRpdmlzaW9uIGlzIHRoZVxuXHRcdCAqICBpbnRlcnZhbCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgc3RlcHMuXG5cdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5TZXF1ZW5jZSNcblx0XHQgKiAgQG5hbWUgc3ViZGl2aXNpb25cblx0XHQgKiAgQHJlYWRPbmx5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5TZXF1ZW5jZS5wcm90b3R5cGUsICdzdWJkaXZpc2lvbicsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVGlja3ModGhpcy5fc3ViZGl2aXNpb24pLnRvU2Vjb25kcygpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIEdldC9TZXQgYW4gaW5kZXggb2YgdGhlIHNlcXVlbmNlLiBJZiB0aGUgaW5kZXggY29udGFpbnMgYSBzdWJhcnJheSxcblx0XHQgKiAgYSBUb25lLlNlcXVlbmNlIHJlcHJlc2VudGluZyB0aGF0IHN1Yi1hcnJheSB3aWxsIGJlIHJldHVybmVkLlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBzZXF1ZW5jZSA9IG5ldyBUb25lLlNlcXVlbmNlKHBsYXlOb3RlLCBbXCJFNFwiLCBcIkM0XCIsIFwiRiM0XCIsIFtcIkE0XCIsIFwiQmIzXCJdXSlcblx0XHQgKiBzZXF1ZW5jZS5hdCgwKS8vID0+IHJldHVybnMgXCJFNFwiXG5cdFx0ICogLy9zZXQgYSB2YWx1ZVxuXHRcdCAqIHNlcXVlbmNlLmF0KDAsIFwiRzNcIik7XG5cdFx0ICogLy9nZXQgYSBuZXN0ZWQgc2VxdWVuY2Vcblx0XHQgKiBzZXF1ZW5jZS5hdCgzKS5hdCgxKS8vID0+IHJldHVybnMgXCJCYjNcIlxuXHRcdCAqIEBwYXJhbSB7UG9zaXRpdmV9IGluZGV4IFRoZSBpbmRleCB0byBnZXQgb3Igc2V0XG5cdFx0ICogQHBhcmFtIHsqfSB2YWx1ZSBPcHRpb25hbGx5IHBhc3MgaW4gdGhlIHZhbHVlIHRvIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXguXG5cdFx0ICovXG5cdCAgICBUb25lLlNlcXVlbmNlLnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHtcblx0ICAgICAgICAvL2lmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSxcblx0ICAgICAgICBpZiAoVG9uZS5pc0FycmF5KHZhbHVlKSkge1xuXHQgICAgICAgICAgICAvL3JlbW92ZSB0aGUgY3VycmVudCBldmVudCBhdCB0aGF0IGluZGV4XG5cdCAgICAgICAgICAgIHRoaXMucmVtb3ZlKGluZGV4KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9jYWxsIHRoZSBwYXJlbnQncyBtZXRob2Rcblx0ICAgICAgICByZXR1cm4gVG9uZS5QYXJ0LnByb3RvdHlwZS5hdC5jYWxsKHRoaXMsIHRoaXMuX2luZGV4VGltZShpbmRleCksIHZhbHVlKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQWRkIGFuIGV2ZW50IGF0IGFuIGluZGV4LCBpZiB0aGVyZSdzIGFscmVhZHkgc29tZXRoaW5nXG5cdFx0ICogIGF0IHRoYXQgaW5kZXgsIG92ZXJ3cml0ZSBpdC4gSWYgYHZhbHVlYCBpcyBhbiBhcnJheSxcblx0XHQgKiAgaXQgd2lsbCBiZSBwYXJzZWQgYXMgYSBzdWJzZXF1ZW5jZS5cblx0XHQgKiAgQHBhcmFtIHtOdW1iZXJ9IGluZGV4IFRoZSBpbmRleCB0byBhZGQgdGhlIGV2ZW50IHRvXG5cdFx0ICogIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZCBhdCB0aGF0IGluZGV4XG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlNlcXVlbmNlfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlNlcXVlbmNlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG5cdCAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoVG9uZS5pc0FycmF5KHZhbHVlKSkge1xuXHQgICAgICAgICAgICAvL21ha2UgYSBzdWJzZXF1ZW5jZSBhbmQgYWRkIHRoYXQgdG8gdGhlIHNlcXVlbmNlXG5cdCAgICAgICAgICAgIHZhciBzdWJTdWJkaXZpc2lvbiA9IE1hdGgucm91bmQodGhpcy5fc3ViZGl2aXNpb24gLyB2YWx1ZS5sZW5ndGgpO1xuXHQgICAgICAgICAgICB2YWx1ZSA9IG5ldyBUb25lLlNlcXVlbmNlKHRoaXMuX3RpY2suYmluZCh0aGlzKSwgdmFsdWUsIFRvbmUuVGlja3Moc3ViU3ViZGl2aXNpb24pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgVG9uZS5QYXJ0LnByb3RvdHlwZS5hZGQuY2FsbCh0aGlzLCB0aGlzLl9pbmRleFRpbWUoaW5kZXgpLCB2YWx1ZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJlbW92ZSBhIHZhbHVlIGZyb20gdGhlIHNlcXVlbmNlIGJ5IGluZGV4XG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGV2ZW50IHRvIHJlbW92ZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5TZXF1ZW5jZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TZXF1ZW5jZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkge1xuXHQgICAgICAgIFRvbmUuUGFydC5wcm90b3R5cGUucmVtb3ZlLmNhbGwodGhpcywgdGhpcy5faW5kZXhUaW1lKGluZGV4KSwgdmFsdWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBHZXQgdGhlIHRpbWUgb2YgdGhlIGluZGV4IGdpdmVuIHRoZSBTZXF1ZW5jZSdzIHN1YmRpdmlzaW9uXG5cdFx0ICogIEBwYXJhbSAge051bWJlcn0gIGluZGV4XG5cdFx0ICogIEByZXR1cm4gIHtUaW1lfSAgVGhlIHRpbWUgb2YgdGhhdCBpbmRleFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TZXF1ZW5jZS5wcm90b3R5cGUuX2luZGV4VGltZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuXHQgICAgICAgIGlmIChpbmRleCBpbnN0YW5jZW9mIFRvbmUuVHJhbnNwb3J0VGltZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gaW5kZXg7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuVGlja3MoaW5kZXggKiB0aGlzLl9zdWJkaXZpc2lvbiArIHRoaXMuc3RhcnRPZmZzZXQpLnRvU2Vjb25kcygpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuU2VxdWVuY2V9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuU2VxdWVuY2UucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5QYXJ0LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuU2VxdWVuY2U7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLlB1bHNlT3NjaWxsYXRvciBpcyBhIHB1bHNlIG9zY2lsbGF0b3Igd2l0aCBjb250cm9sIG92ZXIgcHVsc2Ugd2lkdGgsXG5cdFx0ICogICAgICAgICBhbHNvIGtub3duIGFzIHRoZSBkdXR5IGN5Y2xlLiBBdCA1MCUgZHV0eSBjeWNsZSAod2lkdGggPSAwLjUpIHRoZSB3YXZlIGlzXG5cdFx0ICogICAgICAgICBhIHNxdWFyZSBhbmQgb25seSBvZGQtbnVtYmVyZWQgaGFybW9uaWNzIGFyZSBwcmVzZW50LiBBdCBhbGwgb3RoZXIgd2lkdGhzXG5cdFx0ICogICAgICAgICBldmVuLW51bWJlcmVkIGhhcm1vbmljcyBhcmUgcHJlc2VudC4gUmVhZCBtb3JlXG5cdFx0ICogICAgICAgICBbaGVyZV0oaHR0cHM6Ly93aWdnbGV3YXZlLndvcmRwcmVzcy5jb20vMjAxNC8wOC8xNi9wdWxzZS13YXZlZm9ybXMtYW5kLWhhcm1vbmljcy8pLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5Tb3VyY2V9XG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBbZnJlcXVlbmN5XSBUaGUgZnJlcXVlbmN5IG9mIHRoZSBvc2NpbGxhdG9yXG5cdFx0ICogIEBwYXJhbSB7Tm9ybWFsUmFuZ2V9IFt3aWR0aF0gVGhlIHdpZHRoIG9mIHRoZSBwdWxzZVxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBwdWxzZSA9IG5ldyBUb25lLlB1bHNlT3NjaWxsYXRvcihcIkU1XCIsIDAuNCkudG9NYXN0ZXIoKS5zdGFydCgpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QdWxzZU9zY2lsbGF0b3IgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ3dpZHRoJ1xuXHQgICAgICAgIF0sIFRvbmUuT3NjaWxsYXRvcik7XG5cdCAgICAgICAgVG9uZS5Tb3VyY2UuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgd2lkdGggb2YgdGhlIHB1bHNlLlxuXHRcdFx0ICogIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLndpZHRoID0gbmV3IFRvbmUuU2lnbmFsKG9wdGlvbnMud2lkdGgsIFRvbmUuVHlwZS5Ob3JtYWxSYW5nZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgZ2F0ZSB0aGUgd2lkdGggYW1vdW50XG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fd2lkdGhHYXRlID0gbmV3IFRvbmUuR2FpbigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBzYXd0b290aCBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuT3NjaWxsYXRvcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc2F3dG9vdGggPSBuZXcgVG9uZS5Pc2NpbGxhdG9yKHtcblx0ICAgICAgICAgICAgZnJlcXVlbmN5OiBvcHRpb25zLmZyZXF1ZW5jeSxcblx0ICAgICAgICAgICAgZGV0dW5lOiBvcHRpb25zLmRldHVuZSxcblx0ICAgICAgICAgICAgdHlwZTogJ3Nhd3Rvb3RoJyxcblx0ICAgICAgICAgICAgcGhhc2U6IG9wdGlvbnMucGhhc2Vcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZnJlcXVlbmN5IGNvbnRyb2wuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IHRoaXMuX3Nhd3Rvb3RoLmZyZXF1ZW5jeTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGV0dW5lIGluIGNlbnRzLlxuXHRcdFx0ICogIEB0eXBlIHtDZW50c31cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmRldHVuZSA9IHRoaXMuX3Nhd3Rvb3RoLmRldHVuZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaHJlc2hvbGQgdGhlIHNpZ25hbCB0byB0dXJuIGl0IGludG8gYSBzcXVhcmVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5XYXZlU2hhcGVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl90aHJlc2ggPSBuZXcgVG9uZS5XYXZlU2hhcGVyKGZ1bmN0aW9uICh2YWwpIHtcblx0ICAgICAgICAgICAgaWYgKHZhbCA8IDApIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAtMTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAxO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgLy9jb25uZWN0aW9uc1xuXHQgICAgICAgIHRoaXMuX3Nhd3Rvb3RoLmNoYWluKHRoaXMuX3RocmVzaCwgdGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIHRoaXMud2lkdGguY2hhaW4odGhpcy5fd2lkdGhHYXRlLCB0aGlzLl90aHJlc2gpO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFtcblx0ICAgICAgICAgICAgJ3dpZHRoJyxcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdkZXR1bmUnXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5QdWxzZU9zY2lsbGF0b3IsIFRvbmUuU291cmNlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgZGVmYXVsdCBwYXJhbWV0ZXJzLlxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QdWxzZU9zY2lsbGF0b3IuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2ZyZXF1ZW5jeSc6IDQ0MCxcblx0ICAgICAgICAnZGV0dW5lJzogMCxcblx0ICAgICAgICAncGhhc2UnOiAwLFxuXHQgICAgICAgICd3aWR0aCc6IDAuMlxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBzdGFydCB0aGUgb3NjaWxsYXRvclxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSB0aW1lXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fc2F3dG9vdGguc3RhcnQodGltZSk7XG5cdCAgICAgICAgdGhpcy5fd2lkdGhHYXRlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMSwgdGltZSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHN0b3AgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gdGltZVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QdWxzZU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdG9wID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fc2F3dG9vdGguc3RvcCh0aW1lKTtcblx0ICAgICAgICAvL3RoZSB3aWR0aCBpcyBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dC5cblx0ICAgICAgICAvL3RoYXQgbmVlZHMgdG8gYmUgc3RvcHBlZCBhbHNvXG5cdCAgICAgICAgdGhpcy5fd2lkdGhHYXRlLmdhaW4uc2V0VmFsdWVBdFRpbWUoMCwgdGltZSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHJlc3RhcnQgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gdGltZSAob3B0aW9uYWwpIHRpbWluZyBwYXJhbWV0ZXJcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUHVsc2VPc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLl9zYXd0b290aC5yZXN0YXJ0KHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBwaGFzZSBvZiB0aGUgb3NjaWxsYXRvciBpbiBkZWdyZWVzLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlB1bHNlT3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7RGVncmVlc31cblx0XHQgKiBAbmFtZSBwaGFzZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUHVsc2VPc2NpbGxhdG9yLnByb3RvdHlwZSwgJ3BoYXNlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2F3dG9vdGgucGhhc2U7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwaGFzZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9zYXd0b290aC5waGFzZSA9IHBoYXNlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHR5cGUgb2YgdGhlIG9zY2lsbGF0b3IuIEFsd2F5cyByZXR1cm5zIFwicHVsc2VcIi5cblx0XHQgKiBAcmVhZE9ubHlcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QdWxzZU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge3N0cmluZ31cblx0XHQgKiBAbmFtZSB0eXBlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QdWxzZU9zY2lsbGF0b3IucHJvdG90eXBlLCAndHlwZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICdwdWxzZSc7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgcGFydGlhbHMgb2YgdGhlIHdhdmVmb3JtLiBDYW5ub3Qgc2V0IHBhcnRpYWxzIGZvciB0aGlzIHdhdmVmb3JtIHR5cGVcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QdWxzZU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge0FycmF5fVxuXHRcdCAqIEBuYW1lIHBhcnRpYWxzXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlB1bHNlT3NjaWxsYXRvci5wcm90b3R5cGUsICdwYXJ0aWFscycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFtdO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwIG1ldGhvZC5cblx0XHQgKiAgQHJldHVybiB7VG9uZS5QdWxzZU9zY2lsbGF0b3J9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUHVsc2VPc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc2F3dG9vdGguZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3Nhd3Rvb3RoID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICd3aWR0aCcsXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGV0dW5lJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMud2lkdGguZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMud2lkdGggPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3dpZHRoR2F0ZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fd2lkdGhHYXRlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl90aHJlc2guZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3RocmVzaCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5QdWxzZU9zY2lsbGF0b3I7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBUb25lLlBXTU9zY2lsbGF0b3IgbW9kdWxhdGVzIHRoZSB3aWR0aCBvZiBhIFRvbmUuUHVsc2VPc2NpbGxhdG9yXG5cdFx0ICogICAgICAgICBhdCB0aGUgbW9kdWxhdGlvbkZyZXF1ZW5jeS4gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBjb250aW51b3VzbHlcblx0XHQgKiAgICAgICAgIGNoYW5naW5nIHRoZSB0aW1icmUgb2YgdGhlIG9zY2lsbGF0b3IgYnkgYWx0ZXJpbmcgdGhlIGhhcm1vbmljc1xuXHRcdCAqICAgICAgICAgZ2VuZXJhdGVkLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlNvdXJjZX1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBmcmVxdWVuY3kgVGhlIHN0YXJ0aW5nIGZyZXF1ZW5jeSBvZiB0aGUgb3NjaWxsYXRvci5cblx0XHQgKiAgQHBhcmFtIHtGcmVxdWVuY3l9IG1vZHVsYXRpb25GcmVxdWVuY3kgVGhlIG1vZHVsYXRpb24gZnJlcXVlbmN5IG9mIHRoZSB3aWR0aCBvZiB0aGUgcHVsc2UuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogIHZhciBwd20gPSBuZXcgVG9uZS5QV01Pc2NpbGxhdG9yKFwiQWIzXCIsIDAuMykudG9NYXN0ZXIoKS5zdGFydCgpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QV01Pc2NpbGxhdG9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdtb2R1bGF0aW9uRnJlcXVlbmN5J1xuXHQgICAgICAgIF0sIFRvbmUuUFdNT3NjaWxsYXRvcik7XG5cdCAgICAgICAgVG9uZS5Tb3VyY2UuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgcHVsc2Ugb3NjaWxsYXRvclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlB1bHNlT3NjaWxsYXRvcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcHVsc2UgPSBuZXcgVG9uZS5QdWxzZU9zY2lsbGF0b3Iob3B0aW9ucy5tb2R1bGF0aW9uRnJlcXVlbmN5KTtcblx0ICAgICAgICAvL2NoYW5nZSB0aGUgcHVsc2Ugb3NjaWxsYXRvciB0eXBlXG5cdCAgICAgICAgdGhpcy5fcHVsc2UuX3Nhd3Rvb3RoLnR5cGUgPSAnc2luZSc7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG1vZHVsYXRvclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk9zY2lsbGF0b3J9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRvciA9IG5ldyBUb25lLk9zY2lsbGF0b3Ioe1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jzogb3B0aW9ucy5mcmVxdWVuY3ksXG5cdCAgICAgICAgICAgICdkZXR1bmUnOiBvcHRpb25zLmRldHVuZSxcblx0ICAgICAgICAgICAgJ3BoYXNlJzogb3B0aW9ucy5waGFzZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFNjYWxlIHRoZSBvc2NpbGxhdG9yIHNvIGl0IGRvZXNuJ3QgZ28gc2lsZW50XG5cdFx0XHQgKiAgYXQgdGhlIGV4dHJlbWUgdmFsdWVzLlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk11bHRpcGx5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zY2FsZSA9IG5ldyBUb25lLk11bHRpcGx5KDIpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBmcmVxdWVuY3kgY29udHJvbC5cblx0XHRcdCAqICBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gdGhpcy5fbW9kdWxhdG9yLmZyZXF1ZW5jeTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGV0dW5lIG9mIHRoZSBvc2NpbGxhdG9yLlxuXHRcdFx0ICogIEB0eXBlIHtDZW50c31cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmRldHVuZSA9IHRoaXMuX21vZHVsYXRvci5kZXR1bmU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG1vZHVsYXRpb24gcmF0ZSBvZiB0aGUgb3NjaWxsYXRvci5cblx0XHRcdCAqICBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMubW9kdWxhdGlvbkZyZXF1ZW5jeSA9IHRoaXMuX3B1bHNlLmZyZXF1ZW5jeTtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLmNoYWluKHRoaXMuX3NjYWxlLCB0aGlzLl9wdWxzZS53aWR0aCk7XG5cdCAgICAgICAgdGhpcy5fcHVsc2UuY29ubmVjdCh0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnbW9kdWxhdGlvbkZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGV0dW5lJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuUFdNT3NjaWxsYXRvciwgVG9uZS5Tb3VyY2UpO1xuXHQgICAgLyoqXG5cdFx0ICogIGRlZmF1bHQgdmFsdWVzXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICovXG5cdCAgICBUb25lLlBXTU9zY2lsbGF0b3IuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2ZyZXF1ZW5jeSc6IDQ0MCxcblx0ICAgICAgICAnZGV0dW5lJzogMCxcblx0ICAgICAgICAncGhhc2UnOiAwLFxuXHQgICAgICAgICdtb2R1bGF0aW9uRnJlcXVlbmN5JzogMC40XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHN0YXJ0IHRoZSBvc2NpbGxhdG9yXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd11cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX3B1bHNlLnN0YXJ0KHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBzdG9wIHRoZSBvc2NpbGxhdG9yXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IHRpbWUgKG9wdGlvbmFsKSB0aW1pbmcgcGFyYW1ldGVyXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlBXTU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdG9wID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnN0b3AodGltZSk7XG5cdCAgICAgICAgdGhpcy5fcHVsc2Uuc3RvcCh0aW1lKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgcmVzdGFydCB0aGUgb3NjaWxsYXRvclxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSB0aW1lIChvcHRpb25hbCkgdGltaW5nIHBhcmFtZXRlclxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QV01Pc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IucmVzdGFydCh0aW1lKTtcblx0ICAgICAgICB0aGlzLl9wdWxzZS5yZXN0YXJ0KHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBvc2NpbGxhdG9yLiBBbHdheXMgcmV0dXJucyBcInB3bVwiLlxuXHRcdCAqIEByZWFkT25seVxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlBXTU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge3N0cmluZ31cblx0XHQgKiBAbmFtZSB0eXBlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QV01Pc2NpbGxhdG9yLnByb3RvdHlwZSwgJ3R5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiAncHdtJztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBwYXJ0aWFscyBvZiB0aGUgd2F2ZWZvcm0uIENhbm5vdCBzZXQgcGFydGlhbHMgZm9yIHRoaXMgd2F2ZWZvcm0gdHlwZVxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlBXTU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge0FycmF5fVxuXHRcdCAqIEBuYW1lIHBhcnRpYWxzXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBXTU9zY2lsbGF0b3IucHJvdG90eXBlLCAncGFydGlhbHMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBbXTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBwaGFzZSBvZiB0aGUgb3NjaWxsYXRvciBpbiBkZWdyZWVzLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlBXTU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge251bWJlcn1cblx0XHQgKiBAbmFtZSBwaGFzZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUsICdwaGFzZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vZHVsYXRvci5waGFzZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBoYXNlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX21vZHVsYXRvci5waGFzZSA9IHBoYXNlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJuIHtUb25lLlBXTU9zY2lsbGF0b3J9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUFdNT3NjaWxsYXRvci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3B1bHNlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9wdWxzZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fc2NhbGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3NjYWxlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRvciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAnbW9kdWxhdGlvbkZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGV0dW5lJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmRldHVuZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5tb2R1bGF0aW9uRnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5QV01Pc2NpbGxhdG9yO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5GTU9zY2lsbGF0b3Jcblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5Tb3VyY2V9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAcGFyYW0ge0ZyZXF1ZW5jeX0gZnJlcXVlbmN5IFRoZSBzdGFydGluZyBmcmVxdWVuY3kgb2YgdGhlIG9zY2lsbGF0b3IuXG5cdFx0ICogIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBjYXJyaWVyIG9zY2lsbGF0b3IuXG5cdFx0ICogIEBwYXJhbSB7U3RyaW5nfSBtb2R1bGF0aW9uVHlwZSBUaGUgdHlwZSBvZiB0aGUgbW9kdWxhdG9yIG9zY2lsbGF0b3IuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogLy9hIHNpbmUgb3NjaWxsYXRvciBmcmVxdWVuY3ktbW9kdWxhdGVkIGJ5IGEgc3F1YXJlIHdhdmVcblx0XHQgKiB2YXIgZm1Pc2MgPSBuZXcgVG9uZS5GTU9zY2lsbGF0b3IoXCJBYjNcIiwgXCJzaW5lXCIsIFwic3F1YXJlXCIpLnRvTWFzdGVyKCkuc3RhcnQoKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuRk1Pc2NpbGxhdG9yID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmd1bWVudHMsIFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICd0eXBlJyxcblx0ICAgICAgICAgICAgJ21vZHVsYXRpb25UeXBlJ1xuXHQgICAgICAgIF0sIFRvbmUuRk1Pc2NpbGxhdG9yKTtcblx0ICAgICAgICBUb25lLlNvdXJjZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBjYXJyaWVyIG9zY2lsbGF0b3Jcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5Pc2NpbGxhdG9yfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9jYXJyaWVyID0gbmV3IFRvbmUuT3NjaWxsYXRvcihvcHRpb25zLmZyZXF1ZW5jeSwgb3B0aW9ucy50eXBlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgb3NjaWxsYXRvcidzIGZyZXF1ZW5jeVxuXHRcdFx0ICogIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5mcmVxdWVuY3ksIFRvbmUuVHlwZS5GcmVxdWVuY3kpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBkZXR1bmUgY29udHJvbCBzaWduYWwuXG5cdFx0XHQgKiAgQHR5cGUge0NlbnRzfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gdGhpcy5fY2Fycmllci5kZXR1bmU7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUudmFsdWUgPSBvcHRpb25zLmRldHVuZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbW9kdWxhdGlvbiBpbmRleCB3aGljaCBpcyBpbiBlc3NlbmNlIHRoZSBkZXB0aCBvciBhbW91bnQgb2YgdGhlIG1vZHVsYXRpb24uIEluIG90aGVyIHRlcm1zIGl0IGlzIHRoZVxuXHRcdFx0ICogIHJhdGlvIG9mIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG1vZHVsYXRpbmcgc2lnbmFsIChtZikgdG8gdGhlIGFtcGxpdHVkZSBvZiB0aGVcblx0XHRcdCAqICBtb2R1bGF0aW5nIHNpZ25hbCAobWEpIC0tIGFzIGluIG1hL21mLlxuXHRcdFx0ICpcdEB0eXBlIHtQb3NpdGl2ZX1cblx0XHRcdCAqXHRAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb25JbmRleCA9IG5ldyBUb25lLk11bHRpcGx5KG9wdGlvbnMubW9kdWxhdGlvbkluZGV4KTtcblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb25JbmRleC51bml0cyA9IFRvbmUuVHlwZS5Qb3NpdGl2ZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbW9kdWxhdGluZyBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLk9zY2lsbGF0b3J9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRvciA9IG5ldyBUb25lLk9zY2lsbGF0b3Iob3B0aW9ucy5mcmVxdWVuY3ksIG9wdGlvbnMubW9kdWxhdGlvblR5cGUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEhhcm1vbmljaXR5IGlzIHRoZSBmcmVxdWVuY3kgcmF0aW8gYmV0d2VlbiB0aGUgY2FycmllciBhbmQgdGhlIG1vZHVsYXRvciBvc2NpbGxhdG9ycy5cblx0XHRcdCAqICBBIGhhcm1vbmljaXR5IG9mIDEgZ2l2ZXMgYm90aCBvc2NpbGxhdG9ycyB0aGUgc2FtZSBmcmVxdWVuY3kuXG5cdFx0XHQgKiAgSGFybW9uaWNpdHkgPSAyIG1lYW5zIGEgY2hhbmdlIG9mIGFuIG9jdGF2ZS5cblx0XHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICogIEBleGFtcGxlXG5cdFx0XHQgKiAvL3BpdGNoIHRoZSBtb2R1bGF0b3IgYW4gb2N0YXZlIGJlbG93IGNhcnJpZXJcblx0XHRcdCAqIHN5bnRoLmhhcm1vbmljaXR5LnZhbHVlID0gMC41O1xuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5oYXJtb25pY2l0eSA9IG5ldyBUb25lLk11bHRpcGx5KG9wdGlvbnMuaGFybW9uaWNpdHkpO1xuXHQgICAgICAgIHRoaXMuaGFybW9uaWNpdHkudW5pdHMgPSBUb25lLlR5cGUuUG9zaXRpdmU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG5vZGUgd2hlcmUgdGhlIG1vZHVsYXRpb24gaGFwcGVuc1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRpb25Ob2RlID0gbmV3IFRvbmUuR2FpbigwKTtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9jYXJyaWVyLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kuY2hhaW4odGhpcy5oYXJtb25pY2l0eSwgdGhpcy5fbW9kdWxhdG9yLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kuY2hhaW4odGhpcy5tb2R1bGF0aW9uSW5kZXgsIHRoaXMuX21vZHVsYXRpb25Ob2RlKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuY29ubmVjdCh0aGlzLl9tb2R1bGF0aW9uTm9kZS5nYWluKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0aW9uTm9kZS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KTtcblx0ICAgICAgICB0aGlzLl9jYXJyaWVyLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lLmNvbm5lY3QodGhpcy5fbW9kdWxhdG9yLmRldHVuZSk7XG5cdCAgICAgICAgdGhpcy5waGFzZSA9IG9wdGlvbnMucGhhc2U7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnbW9kdWxhdGlvbkluZGV4Jyxcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdkZXR1bmUnLFxuXHQgICAgICAgICAgICAnaGFybW9uaWNpdHknXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5GTU9zY2lsbGF0b3IsIFRvbmUuU291cmNlKTtcblx0ICAgIC8qKlxuXHRcdCAqICBkZWZhdWx0IHZhbHVlc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICogIEBjb25zdFxuXHRcdCAqL1xuXHQgICAgVG9uZS5GTU9zY2lsbGF0b3IuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2ZyZXF1ZW5jeSc6IDQ0MCxcblx0ICAgICAgICAnZGV0dW5lJzogMCxcblx0ICAgICAgICAncGhhc2UnOiAwLFxuXHQgICAgICAgICdtb2R1bGF0aW9uSW5kZXgnOiAyLFxuXHQgICAgICAgICdtb2R1bGF0aW9uVHlwZSc6ICdzcXVhcmUnLFxuXHQgICAgICAgICdoYXJtb25pY2l0eSc6IDFcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc3RhcnQgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5GTU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdGFydCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2NhcnJpZXIuc3RhcnQodGltZSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHN0b3AgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gdGltZSAob3B0aW9uYWwpIHRpbWluZyBwYXJhbWV0ZXJcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuRk1Pc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnN0b3AodGltZSk7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5zdG9wKHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBzdG9wIHRoZSBvc2NpbGxhdG9yXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IHRpbWUgKG9wdGlvbmFsKSB0aW1pbmcgcGFyYW1ldGVyXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkZNT3NjaWxsYXRvci5wcm90b3R5cGUucmVzdGFydCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnJlc3RhcnQodGltZSk7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5yZXN0YXJ0KHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBjYXJyaWVyIG9zY2lsbGF0b3Jcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5GTU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge3N0cmluZ31cblx0XHQgKiBAbmFtZSB0eXBlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5GTU9zY2lsbGF0b3IucHJvdG90eXBlLCAndHlwZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhcnJpZXIudHlwZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHR5cGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2Fycmllci50eXBlID0gdHlwZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBtb2R1bGF0b3Igb3NjaWxsYXRvclxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkZNT3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7U3RyaW5nfVxuXHRcdCAqIEBuYW1lIG1vZHVsYXRpb25UeXBlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5GTU9zY2lsbGF0b3IucHJvdG90eXBlLCAnbW9kdWxhdGlvblR5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb2R1bGF0b3IudHlwZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHR5cGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBoYXNlIG9mIHRoZSBvc2NpbGxhdG9yIGluIGRlZ3JlZXMuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRk1Pc2NpbGxhdG9yI1xuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICogQG5hbWUgcGhhc2Vcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkZNT3NjaWxsYXRvci5wcm90b3R5cGUsICdwaGFzZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhcnJpZXIucGhhc2U7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwaGFzZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9jYXJyaWVyLnBoYXNlID0gcGhhc2U7XG5cdCAgICAgICAgICAgIHRoaXMuX21vZHVsYXRvci5waGFzZSA9IHBoYXNlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBhcnRpYWxzIG9mIHRoZSBjYXJyaWVyIHdhdmVmb3JtLiBBIHBhcnRpYWwgcmVwcmVzZW50c1xuXHRcdCAqIHRoZSBhbXBsaXR1ZGUgYXQgYSBoYXJtb25pYy4gVGhlIGZpcnN0IGhhcm1vbmljIGlzIHRoZVxuXHRcdCAqIGZ1bmRhbWVudGFsIGZyZXF1ZW5jeSwgdGhlIHNlY29uZCBpcyB0aGUgb2N0YXZlIGFuZCBzbyBvblxuXHRcdCAqIGZvbGxvd2luZyB0aGUgaGFybW9uaWMgc2VyaWVzLlxuXHRcdCAqIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0eXBlIHRvIFwiY3VzdG9tXCIuXG5cdFx0ICogVGhlIHZhbHVlIGlzIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHR5cGUgaXMgbm90IFwiY3VzdG9tXCIuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRk1Pc2NpbGxhdG9yI1xuXHRcdCAqIEB0eXBlIHtBcnJheX1cblx0XHQgKiBAbmFtZSBwYXJ0aWFsc1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogb3NjLnBhcnRpYWxzID0gWzEsIDAuMiwgMC4wMV07XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5GTU9zY2lsbGF0b3IucHJvdG90eXBlLCAncGFydGlhbHMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYXJyaWVyLnBhcnRpYWxzO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocGFydGlhbHMpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2Fycmllci5wYXJ0aWFscyA9IHBhcnRpYWxzO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJuIHtUb25lLkZNT3NjaWxsYXRvcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5GTU9zY2lsbGF0b3IucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdtb2R1bGF0aW9uSW5kZXgnLFxuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RldHVuZScsXG5cdCAgICAgICAgICAgICdoYXJtb25pY2l0eSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmhhcm1vbmljaXR5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmhhcm1vbmljaXR5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9jYXJyaWVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9jYXJyaWVyID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRvciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdGlvbk5vZGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRpb25Ob2RlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb25JbmRleC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5tb2R1bGF0aW9uSW5kZXggPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkZNT3NjaWxsYXRvcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuQU1Pc2NpbGxhdG9yXG5cdFx0ICpcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuT3NjaWxsYXRvcn1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBmcmVxdWVuY3kgVGhlIHN0YXJ0aW5nIGZyZXF1ZW5jeSBvZiB0aGUgb3NjaWxsYXRvci5cblx0XHQgKiAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgdGhlIGNhcnJpZXIgb3NjaWxsYXRvci5cblx0XHQgKiAgQHBhcmFtIHtTdHJpbmd9IG1vZHVsYXRpb25UeXBlIFRoZSB0eXBlIG9mIHRoZSBtb2R1bGF0b3Igb3NjaWxsYXRvci5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2Egc2luZSBvc2NpbGxhdG9yIGZyZXF1ZW5jeS1tb2R1bGF0ZWQgYnkgYSBzcXVhcmUgd2F2ZVxuXHRcdCAqIHZhciBmbU9zYyA9IG5ldyBUb25lLkFNT3NjaWxsYXRvcihcIkFiM1wiLCBcInNpbmVcIiwgXCJzcXVhcmVcIikudG9NYXN0ZXIoKS5zdGFydCgpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5BTU9zY2lsbGF0b3IgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ3R5cGUnLFxuXHQgICAgICAgICAgICAnbW9kdWxhdGlvblR5cGUnXG5cdCAgICAgICAgXSwgVG9uZS5BTU9zY2lsbGF0b3IpO1xuXHQgICAgICAgIFRvbmUuU291cmNlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGNhcnJpZXIgb3NjaWxsYXRvclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk9zY2lsbGF0b3J9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2NhcnJpZXIgPSBuZXcgVG9uZS5Pc2NpbGxhdG9yKG9wdGlvbnMuZnJlcXVlbmN5LCBvcHRpb25zLnR5cGUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBvc2NpbGxhdG9yJ3MgZnJlcXVlbmN5XG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBkZXR1bmUgY29udHJvbCBzaWduYWwuXG5cdFx0XHQgKiAgQHR5cGUge0NlbnRzfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gdGhpcy5fY2Fycmllci5kZXR1bmU7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUudmFsdWUgPSBvcHRpb25zLmRldHVuZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbW9kdWxhdGluZyBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLk9zY2lsbGF0b3J9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRvciA9IG5ldyBUb25lLk9zY2lsbGF0b3Iob3B0aW9ucy5mcmVxdWVuY3ksIG9wdGlvbnMubW9kdWxhdGlvblR5cGUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIGNvbnZlcnQgdGhlIC0xLDEgb3V0cHV0IHRvIDAsMVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkF1ZGlvVG9HYWlufVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tb2R1bGF0aW9uU2NhbGUgPSBuZXcgVG9uZS5BdWRpb1RvR2FpbigpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEhhcm1vbmljaXR5IGlzIHRoZSBmcmVxdWVuY3kgcmF0aW8gYmV0d2VlbiB0aGUgY2FycmllciBhbmQgdGhlIG1vZHVsYXRvciBvc2NpbGxhdG9ycy5cblx0XHRcdCAqICBBIGhhcm1vbmljaXR5IG9mIDEgZ2l2ZXMgYm90aCBvc2NpbGxhdG9ycyB0aGUgc2FtZSBmcmVxdWVuY3kuXG5cdFx0XHQgKiAgSGFybW9uaWNpdHkgPSAyIG1lYW5zIGEgY2hhbmdlIG9mIGFuIG9jdGF2ZS5cblx0XHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICogIEBleGFtcGxlXG5cdFx0XHQgKiAvL3BpdGNoIHRoZSBtb2R1bGF0b3IgYW4gb2N0YXZlIGJlbG93IGNhcnJpZXJcblx0XHRcdCAqIHN5bnRoLmhhcm1vbmljaXR5LnZhbHVlID0gMC41O1xuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5oYXJtb25pY2l0eSA9IG5ldyBUb25lLk11bHRpcGx5KG9wdGlvbnMuaGFybW9uaWNpdHkpO1xuXHQgICAgICAgIHRoaXMuaGFybW9uaWNpdHkudW5pdHMgPSBUb25lLlR5cGUuUG9zaXRpdmU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG5vZGUgd2hlcmUgdGhlIG1vZHVsYXRpb24gaGFwcGVuc1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRpb25Ob2RlID0gbmV3IFRvbmUuR2FpbigwKTtcblx0ICAgICAgICAvL2Nvbm5lY3Rpb25zXG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kuY2hhaW4odGhpcy5oYXJtb25pY2l0eSwgdGhpcy5fbW9kdWxhdG9yLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUuY29ubmVjdCh0aGlzLl9tb2R1bGF0b3IuZGV0dW5lKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuY2hhaW4odGhpcy5fbW9kdWxhdGlvblNjYWxlLCB0aGlzLl9tb2R1bGF0aW9uTm9kZS5nYWluKTtcblx0ICAgICAgICB0aGlzLl9jYXJyaWVyLmNoYWluKHRoaXMuX21vZHVsYXRpb25Ob2RlLCB0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5waGFzZSA9IG9wdGlvbnMucGhhc2U7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RldHVuZScsXG5cdCAgICAgICAgICAgICdoYXJtb25pY2l0eSdcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkFNT3NjaWxsYXRvciwgVG9uZS5Pc2NpbGxhdG9yKTtcblx0ICAgIC8qKlxuXHRcdCAqICBkZWZhdWx0IHZhbHVlc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICogIEBjb25zdFxuXHRcdCAqL1xuXHQgICAgVG9uZS5BTU9zY2lsbGF0b3IuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2ZyZXF1ZW5jeSc6IDQ0MCxcblx0ICAgICAgICAnZGV0dW5lJzogMCxcblx0ICAgICAgICAncGhhc2UnOiAwLFxuXHQgICAgICAgICdtb2R1bGF0aW9uVHlwZSc6ICdzcXVhcmUnLFxuXHQgICAgICAgICdoYXJtb25pY2l0eSc6IDFcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc3RhcnQgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5BTU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdGFydCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2NhcnJpZXIuc3RhcnQodGltZSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHN0b3AgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gdGltZSAob3B0aW9uYWwpIHRpbWluZyBwYXJhbWV0ZXJcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuQU1Pc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnN0b3AodGltZSk7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5zdG9wKHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICByZXN0YXJ0IHRoZSBvc2NpbGxhdG9yXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IHRpbWUgKG9wdGlvbmFsKSB0aW1pbmcgcGFyYW1ldGVyXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkFNT3NjaWxsYXRvci5wcm90b3R5cGUucmVzdGFydCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnJlc3RhcnQodGltZSk7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5yZXN0YXJ0KHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBjYXJyaWVyIG9zY2lsbGF0b3Jcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5BTU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge3N0cmluZ31cblx0XHQgKiBAbmFtZSB0eXBlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5BTU9zY2lsbGF0b3IucHJvdG90eXBlLCAndHlwZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhcnJpZXIudHlwZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHR5cGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2Fycmllci50eXBlID0gdHlwZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBtb2R1bGF0b3Igb3NjaWxsYXRvclxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkFNT3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxuXHRcdCAqIEBuYW1lIG1vZHVsYXRpb25UeXBlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5BTU9zY2lsbGF0b3IucHJvdG90eXBlLCAnbW9kdWxhdGlvblR5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb2R1bGF0b3IudHlwZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHR5cGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBoYXNlIG9mIHRoZSBvc2NpbGxhdG9yIGluIGRlZ3JlZXMuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQU1Pc2NpbGxhdG9yI1xuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICogQG5hbWUgcGhhc2Vcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkFNT3NjaWxsYXRvci5wcm90b3R5cGUsICdwaGFzZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhcnJpZXIucGhhc2U7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChwaGFzZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9jYXJyaWVyLnBoYXNlID0gcGhhc2U7XG5cdCAgICAgICAgICAgIHRoaXMuX21vZHVsYXRvci5waGFzZSA9IHBoYXNlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBhcnRpYWxzIG9mIHRoZSBjYXJyaWVyIHdhdmVmb3JtLiBBIHBhcnRpYWwgcmVwcmVzZW50c1xuXHRcdCAqIHRoZSBhbXBsaXR1ZGUgYXQgYSBoYXJtb25pYy4gVGhlIGZpcnN0IGhhcm1vbmljIGlzIHRoZVxuXHRcdCAqIGZ1bmRhbWVudGFsIGZyZXF1ZW5jeSwgdGhlIHNlY29uZCBpcyB0aGUgb2N0YXZlIGFuZCBzbyBvblxuXHRcdCAqIGZvbGxvd2luZyB0aGUgaGFybW9uaWMgc2VyaWVzLlxuXHRcdCAqIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0eXBlIHRvIFwiY3VzdG9tXCIuXG5cdFx0ICogVGhlIHZhbHVlIGlzIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHR5cGUgaXMgbm90IFwiY3VzdG9tXCIuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuQU1Pc2NpbGxhdG9yI1xuXHRcdCAqIEB0eXBlIHtBcnJheX1cblx0XHQgKiBAbmFtZSBwYXJ0aWFsc1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogb3NjLnBhcnRpYWxzID0gWzEsIDAuMiwgMC4wMV07XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5BTU9zY2lsbGF0b3IucHJvdG90eXBlLCAncGFydGlhbHMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYXJyaWVyLnBhcnRpYWxzO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocGFydGlhbHMpIHtcblx0ICAgICAgICAgICAgdGhpcy5fY2Fycmllci5wYXJ0aWFscyA9IHBhcnRpYWxzO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJuIHtUb25lLkFNT3NjaWxsYXRvcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5BTU9zY2lsbGF0b3IucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5Tb3VyY2UucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGV0dW5lJyxcblx0ICAgICAgICAgICAgJ2hhcm1vbmljaXR5J1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmRldHVuZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5oYXJtb25pY2l0eS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5oYXJtb25pY2l0eSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fY2FycmllciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRpb25Ob2RlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0aW9uTm9kZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdGlvblNjYWxlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0aW9uU2NhbGUgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkFNT3NjaWxsYXRvcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIFRvbmUuRmF0T3NjaWxsYXRvclxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlNvdXJjZX1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBmcmVxdWVuY3kgVGhlIHN0YXJ0aW5nIGZyZXF1ZW5jeSBvZiB0aGUgb3NjaWxsYXRvci5cblx0XHQgKiAgQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgdGhlIGNhcnJpZXIgb3NjaWxsYXRvci5cblx0XHQgKiAgQHBhcmFtIHtTdHJpbmd9IG1vZHVsYXRpb25UeXBlIFRoZSB0eXBlIG9mIHRoZSBtb2R1bGF0b3Igb3NjaWxsYXRvci5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2Egc2luZSBvc2NpbGxhdG9yIGZyZXF1ZW5jeS1tb2R1bGF0ZWQgYnkgYSBzcXVhcmUgd2F2ZVxuXHRcdCAqIHZhciBmbU9zYyA9IG5ldyBUb25lLkZhdE9zY2lsbGF0b3IoXCJBYjNcIiwgXCJzaW5lXCIsIFwic3F1YXJlXCIpLnRvTWFzdGVyKCkuc3RhcnQoKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuRmF0T3NjaWxsYXRvciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAndHlwZScsXG5cdCAgICAgICAgICAgICdzcHJlYWQnXG5cdCAgICAgICAgXSwgVG9uZS5GYXRPc2NpbGxhdG9yKTtcblx0ICAgICAgICBUb25lLlNvdXJjZS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBvc2NpbGxhdG9yJ3MgZnJlcXVlbmN5XG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLmZyZXF1ZW5jeSwgVG9uZS5UeXBlLkZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGRldHVuZSBjb250cm9sIHNpZ25hbC5cblx0XHRcdCAqICBAdHlwZSB7Q2VudHN9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5kZXR1bmUgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5kZXR1bmUsIFRvbmUuVHlwZS5DZW50cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGFycmF5IG9mIG9zY2lsbGF0b3JzXG5cdFx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9ycyA9IFtdO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSB0b3RhbCBzcHJlYWQgb2YgdGhlIG9zY2lsbGF0b3JzXG5cdFx0XHQgKiAgQHR5cGUgIHtDZW50c31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fc3ByZWFkID0gb3B0aW9ucy5zcHJlYWQ7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIHR5cGUgb2YgdGhlIG9zY2lsbGF0b3Jcblx0XHRcdCAqICBAdHlwZSB7U3RyaW5nfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl90eXBlID0gb3B0aW9ucy50eXBlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBwaGFzZSBvZiB0aGUgb3NjaWxsYXRvcnNcblx0XHRcdCAqICBAdHlwZSB7RGVncmVlc31cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcGhhc2UgPSBvcHRpb25zLnBoYXNlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBwYXJ0aWFscyBhcnJheVxuXHRcdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcGFydGlhbHMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucy5wYXJ0aWFscywgW10pO1xuXHQgICAgICAgIC8vc2V0IHRoZSBjb3VudCBpbml0aWFsbHlcblx0ICAgICAgICB0aGlzLmNvdW50ID0gb3B0aW9ucy5jb3VudDtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGV0dW5lJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuRmF0T3NjaWxsYXRvciwgVG9uZS5Tb3VyY2UpO1xuXHQgICAgLyoqXG5cdFx0ICogIGRlZmF1bHQgdmFsdWVzXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICovXG5cdCAgICBUb25lLkZhdE9zY2lsbGF0b3IuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ2ZyZXF1ZW5jeSc6IDQ0MCxcblx0ICAgICAgICAnZGV0dW5lJzogMCxcblx0ICAgICAgICAncGhhc2UnOiAwLFxuXHQgICAgICAgICdzcHJlYWQnOiAyMCxcblx0ICAgICAgICAnY291bnQnOiAzLFxuXHQgICAgICAgICd0eXBlJzogJ3Nhd3Rvb3RoJ1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBzdGFydCB0aGUgb3NjaWxsYXRvclxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbdGltZT1ub3ddXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLl9zdGFydCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKG9zYykge1xuXHQgICAgICAgICAgICBvc2Muc3RhcnQodGltZSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHN0b3AgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5fc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKG9zYykge1xuXHQgICAgICAgICAgICBvc2Muc3RvcCh0aW1lKTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgcmVzdGFydCB0aGUgb3NjaWxsYXRvclxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSB0aW1lIChvcHRpb25hbCkgdGltaW5nIHBhcmFtZXRlclxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5yZXN0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAob3NjKSB7XG5cdCAgICAgICAgICAgIG9zYy5yZXN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBJdGVyYXRlIG92ZXIgYWxsIG9mIHRoZSBvc2NpbGxhdG9yc1xuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbn0gIGl0ZXJhdG9yICBUaGUgaXRlcmF0b3IgZnVuY3Rpb25cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuRmF0T3NjaWxsYXRvci5wcm90b3R5cGUuX2ZvckVhY2ggPSBmdW5jdGlvbiAoaXRlcmF0b3IpIHtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwodGhpcywgdGhpcy5fb3NjaWxsYXRvcnNbaV0sIGkpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBUaGUgdHlwZSBvZiB0aGUgY2FycmllciBvc2NpbGxhdG9yXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRmF0T3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxuXHRcdCAqIEBuYW1lIHR5cGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLCAndHlwZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0eXBlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChvc2MpIHtcblx0ICAgICAgICAgICAgICAgIG9zYy50eXBlID0gdHlwZTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgZGV0dW5lIHNwcmVhZCBiZXR3ZWVuIHRoZSBvc2NpbGxhdG9ycy4gSWYgXCJjb3VudFwiIGlzXG5cdFx0ICogc2V0IHRvIDMgb3NjaWxsYXRvcnMgYW5kIHRoZSBcInNwcmVhZFwiIGlzIHNldCB0byA0MCxcblx0XHQgKiB0aGUgdGhyZWUgb3NjaWxsYXRvcnMgd291bGQgYmUgZGV0dW5lZCBsaWtlIHRoaXM6IFstMjAsIDAsIDIwXVxuXHRcdCAqIGZvciBhIHRvdGFsIGRldHVuZSBzcHJlYWQgb2YgNDAgY2VudHMuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRmF0T3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7Q2VudHN9XG5cdFx0ICogQG5hbWUgc3ByZWFkXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZSwgJ3NwcmVhZCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NwcmVhZDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHNwcmVhZCkge1xuXHQgICAgICAgICAgICB0aGlzLl9zcHJlYWQgPSBzcHJlYWQ7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9vc2NpbGxhdG9ycy5sZW5ndGggPiAxKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSAtc3ByZWFkIC8gMjtcblx0ICAgICAgICAgICAgICAgIHZhciBzdGVwID0gc3ByZWFkIC8gKHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aCAtIDEpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAob3NjLCBpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb3NjLmRldHVuZS52YWx1ZSA9IHN0YXJ0ICsgc3RlcCAqIGk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG51bWJlciBvZiBkZXR1bmVkIG9zY2lsbGF0b3JzXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRmF0T3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIGNvdW50XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZSwgJ2NvdW50Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3NjaWxsYXRvcnMubGVuZ3RoO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoY291bnQpIHtcblx0ICAgICAgICAgICAgY291bnQgPSBNYXRoLm1heChjb3VudCwgMSk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9vc2NpbGxhdG9ycy5sZW5ndGggIT09IGNvdW50KSB7XG5cdCAgICAgICAgICAgICAgICAvLyB2YXIgcGFydGlhbHMgPSB0aGlzLnBhcnRpYWxzO1xuXHQgICAgICAgICAgICAgICAgLy8gdmFyIHR5cGUgPSB0aGlzLnR5cGU7XG5cdCAgICAgICAgICAgICAgICAvL2Rpc3Bvc2UgdGhlIHByZXZpb3VzIG9zY2lsbGF0b3JzXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChvc2MpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvc2MuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9ycyA9IFtdO1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdmFyIG9zYyA9IG5ldyBUb25lLk9zY2lsbGF0b3IoKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBUb25lLk9zY2lsbGF0b3IuVHlwZS5DdXN0b20pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3NjLnBhcnRpYWxzID0gdGhpcy5fcGFydGlhbHM7XG5cdCAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb3NjLnR5cGUgPSB0aGlzLl90eXBlO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBvc2MucGhhc2UgPSB0aGlzLl9waGFzZTtcblx0ICAgICAgICAgICAgICAgICAgICBvc2Mudm9sdW1lLnZhbHVlID0gLTYgLSBjb3VudCAqIDEuMTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KG9zYy5mcmVxdWVuY3kpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0dW5lLmNvbm5lY3Qob3NjLmRldHVuZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgb3NjLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3JzW2ldID0gb3NjO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy9zZXQgdGhlIHNwcmVhZFxuXHQgICAgICAgICAgICAgICAgdGhpcy5zcHJlYWQgPSB0aGlzLl9zcHJlYWQ7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAob3NjKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIG9zYy5zdGFydCgpO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgcGhhc2Ugb2YgdGhlIG9zY2lsbGF0b3IgaW4gZGVncmVlcy5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5GYXRPc2NpbGxhdG9yI1xuXHRcdCAqIEB0eXBlIHtOdW1iZXJ9XG5cdFx0ICogQG5hbWUgcGhhc2Vcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkZhdE9zY2lsbGF0b3IucHJvdG90eXBlLCAncGhhc2UnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9waGFzZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBoYXNlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3BoYXNlID0gcGhhc2U7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKG9zYykge1xuXHQgICAgICAgICAgICAgICAgb3NjLnBoYXNlID0gcGhhc2U7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBhcnRpYWxzIG9mIHRoZSBjYXJyaWVyIHdhdmVmb3JtLiBBIHBhcnRpYWwgcmVwcmVzZW50c1xuXHRcdCAqIHRoZSBhbXBsaXR1ZGUgYXQgYSBoYXJtb25pYy4gVGhlIGZpcnN0IGhhcm1vbmljIGlzIHRoZVxuXHRcdCAqIGZ1bmRhbWVudGFsIGZyZXF1ZW5jeSwgdGhlIHNlY29uZCBpcyB0aGUgb2N0YXZlIGFuZCBzbyBvblxuXHRcdCAqIGZvbGxvd2luZyB0aGUgaGFybW9uaWMgc2VyaWVzLlxuXHRcdCAqIFNldHRpbmcgdGhpcyB2YWx1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0eXBlIHRvIFwiY3VzdG9tXCIuXG5cdFx0ICogVGhlIHZhbHVlIGlzIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIHR5cGUgaXMgbm90IFwiY3VzdG9tXCIuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuRmF0T3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7QXJyYXl9XG5cdFx0ICogQG5hbWUgcGFydGlhbHNcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIG9zYy5wYXJ0aWFscyA9IFsxLCAwLjIsIDAuMDFdO1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuRmF0T3NjaWxsYXRvci5wcm90b3R5cGUsICdwYXJ0aWFscycsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxzO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocGFydGlhbHMpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGFydGlhbHMgPSBwYXJ0aWFscztcblx0ICAgICAgICAgICAgdGhpcy5fdHlwZSA9IFRvbmUuT3NjaWxsYXRvci5UeXBlLkN1c3RvbTtcblx0ICAgICAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAob3NjKSB7XG5cdCAgICAgICAgICAgICAgICBvc2MucGFydGlhbHMgPSBwYXJ0aWFscztcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuRmF0T3NjaWxsYXRvcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5GYXRPc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RldHVuZSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmRldHVuZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAob3NjKSB7XG5cdCAgICAgICAgICAgIG9zYy5kaXNwb3NlKCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvcnMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3BhcnRpYWxzID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5GYXRPc2NpbGxhdG9yO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5PbW5pT3NjaWxsYXRvciBhZ2dyZWdhdGVzIFRvbmUuT3NjaWxsYXRvciwgVG9uZS5QdWxzZU9zY2lsbGF0b3IsXG5cdFx0ICogICAgICAgICBUb25lLlBXTU9zY2lsbGF0b3IsIFRvbmUuRk1Pc2NpbGxhdG9yLCBUb25lLkFNT3NjaWxsYXRvciwgYW5kIFRvbmUuRmF0T3NjaWxsYXRvclxuXHRcdCAqICAgICAgICAgaW50byBvbmUgY2xhc3MuIFRoZSBvc2NpbGxhdG9yIGNsYXNzIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgdGhlIGB0eXBlYC5cblx0XHQgKiAgICAgICAgIGBvbW5pT3NjLnR5cGUgPSBcInB3bVwiYCB3aWxsIHNldCBpdCB0byB0aGUgVG9uZS5QV01Pc2NpbGxhdG9yLiBQcmVmaXhpbmdcblx0XHQgKiAgICAgICAgIGFueSBvZiB0aGUgYmFzaWMgdHlwZXMgKFwic2luZVwiLCBcInNxdWFyZTRcIiwgZXRjLikgd2l0aCBcImZtXCIsIFwiYW1cIiwgb3IgXCJmYXRcIlxuXHRcdCAqICAgICAgICAgd2lsbCB1c2UgdGhlIEZNT3NjaWxsYXRvciwgQU1Pc2NpbGxhdG9yIG9yIEZhdE9zY2lsbGF0b3IgcmVzcGVjdGl2ZWx5LlxuXHRcdCAqICAgICAgICAgRm9yIGV4YW1wbGU6IGBvbW5pT3NjLnR5cGUgPSBcImZhdHNhd3Rvb3RoXCJgIHdpbGwgY3JlYXRlIHNldCB0aGUgb3NjaWxsYXRvclxuXHRcdCAqICAgICAgICAgdG8gYSBGYXRPc2NpbGxhdG9yIG9mIHR5cGUgXCJzYXd0b290aFwiLlxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlNvdXJjZX1cblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBmcmVxdWVuY3kgVGhlIGluaXRpYWwgZnJlcXVlbmN5IG9mIHRoZSBvc2NpbGxhdG9yLlxuXHRcdCAqICBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgdHlwZSBvZiB0aGUgb3NjaWxsYXRvci5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAgdmFyIG9tbmlPc2MgPSBuZXcgVG9uZS5PbW5pT3NjaWxsYXRvcihcIkMjNFwiLCBcInB3bVwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuT21uaU9zY2lsbGF0b3IgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ3R5cGUnXG5cdCAgICAgICAgXSwgVG9uZS5PbW5pT3NjaWxsYXRvcik7XG5cdCAgICAgICAgVG9uZS5Tb3VyY2UuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZnJlcXVlbmN5IGNvbnRyb2wuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG5ldyBUb25lLlNpZ25hbChvcHRpb25zLmZyZXF1ZW5jeSwgVG9uZS5UeXBlLkZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGRldHVuZSBjb250cm9sXG5cdFx0XHQgKiAgQHR5cGUge0NlbnRzfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbmV3IFRvbmUuU2lnbmFsKG9wdGlvbnMuZGV0dW5lLCBUb25lLlR5cGUuQ2VudHMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSB0eXBlIG9mIHRoZSBvc2NpbGxhdG9yIHNvdXJjZVxuXHRcdFx0ICogIEB0eXBlIHtTdHJpbmd9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3NvdXJjZVR5cGUgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG9zY2lsbGF0b3Jcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5Pc2NpbGxhdG9yfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yID0gbnVsbDtcblx0ICAgICAgICAvL3NldCB0aGUgb3NjaWxsYXRvclxuXHQgICAgICAgIHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGV0dW5lJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIC8vc2V0IHRoZSBvcHRpb25zXG5cdCAgICAgICAgdGhpcy5zZXQob3B0aW9ucyk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5PbW5pT3NjaWxsYXRvciwgVG9uZS5Tb3VyY2UpO1xuXHQgICAgLyoqXG5cdFx0ICogIGRlZmF1bHQgdmFsdWVzXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKiAgQGNvbnN0XG5cdFx0ICovXG5cdCAgICBUb25lLk9tbmlPc2NpbGxhdG9yLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdmcmVxdWVuY3knOiA0NDAsXG5cdCAgICAgICAgJ2RldHVuZSc6IDAsXG5cdCAgICAgICAgJ3R5cGUnOiAnc2luZScsXG5cdCAgICAgICAgJ3BoYXNlJzogMFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBAZW51bSB7U3RyaW5nfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgdmFyIE9tbmlPc2NUeXBlID0ge1xuXHQgICAgICAgIFB1bHNlOiAnUHVsc2VPc2NpbGxhdG9yJyxcblx0ICAgICAgICBQV006ICdQV01Pc2NpbGxhdG9yJyxcblx0ICAgICAgICBPc2M6ICdPc2NpbGxhdG9yJyxcblx0ICAgICAgICBGTTogJ0ZNT3NjaWxsYXRvcicsXG5cdCAgICAgICAgQU06ICdBTU9zY2lsbGF0b3InLFxuXHQgICAgICAgIEZhdDogJ0ZhdE9zY2lsbGF0b3InXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHN0YXJ0IHRoZSBvc2NpbGxhdG9yXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gW3RpbWU9bm93XSB0aGUgdGltZSB0byBzdGFydCB0aGUgb3NjaWxsYXRvclxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBzdGFydCB0aGUgb3NjaWxsYXRvclxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdG8gc3RhcnQgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLl9zdG9wID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnN0b3AodGltZSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUucmVzdGFydCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5yZXN0YXJ0KHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB0eXBlIG9mIHRoZSBvc2NpbGxhdG9yLiBDYW4gYmUgYW55IG9mIHRoZSBiYXNpYyB0eXBlczogc2luZSwgc3F1YXJlLCB0cmlhbmdsZSwgc2F3dG9vdGguIE9yXG5cdFx0ICogcHJlZml4IHRoZSBiYXNpYyB0eXBlcyB3aXRoIFwiZm1cIiwgXCJhbVwiLCBvciBcImZhdFwiIHRvIHVzZSB0aGUgRk1Pc2NpbGxhdG9yLCBBTU9zY2lsbGF0b3Igb3IgRmF0T3NjaWxsYXRvclxuXHRcdCAqIHR5cGVzLiBUaGUgb3NjaWxsYXRvciBjb3VsZCBhbHNvIGJlIHNldCB0byBcInB3bVwiIG9yIFwicHVsc2VcIi4gQWxsIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZVxuXHRcdCAqIG9zY2lsbGF0b3IncyBjbGFzcyBhcmUgYWNjZXNzaWJsZSB3aGVuIHRoZSBvc2NpbGxhdG9yIGlzIHNldCB0byB0aGF0IHR5cGUsIGJ1dCB0aHJvd3MgYW4gZXJyb3Jcblx0XHQgKiB3aGVuIGl0J3Mgbm90LlxuXHRcdCAqXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuT21uaU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge1N0cmluZ31cblx0XHQgKiBAbmFtZSB0eXBlXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBvbW5pT3NjLnR5cGUgPSBcInB3bVwiO1xuXHRcdCAqIC8vbW9kdWxhdGlvbkZyZXF1ZW5jeSBpcyBwYXJhbWV0ZXIgd2hpY2ggaXMgYXZhaWxhYmxlXG5cdFx0ICogLy9vbmx5IHdoZW4gdGhlIHR5cGUgaXMgXCJwd21cIi5cblx0XHQgKiBvbW5pT3NjLm1vZHVsYXRpb25GcmVxdWVuY3kudmFsdWUgPSAwLjU7XG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvL2FuIHNxdWFyZSB3YXZlIGZyZXF1ZW5jeSBtb2R1bGF0ZWQgYnkgYSBzYXd0b290aFxuXHRcdCAqIG9tbmlPc2MudHlwZSA9IFwiZm1zcXVhcmVcIjtcblx0XHQgKiBvbW5pT3NjLm1vZHVsYXRpb25UeXBlID0gXCJzYXd0b290aFwiO1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLCAndHlwZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIHByZWZpeCA9ICcnO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc291cmNlVHlwZSA9PT0gT21uaU9zY1R5cGUuRk0pIHtcblx0ICAgICAgICAgICAgICAgIHByZWZpeCA9ICdmbSc7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlVHlwZSA9PT0gT21uaU9zY1R5cGUuQU0pIHtcblx0ICAgICAgICAgICAgICAgIHByZWZpeCA9ICdhbSc7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlVHlwZSA9PT0gT21uaU9zY1R5cGUuRmF0KSB7XG5cdCAgICAgICAgICAgICAgICBwcmVmaXggPSAnZmF0Jztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGhpcy5fb3NjaWxsYXRvci50eXBlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodHlwZSkge1xuXHQgICAgICAgICAgICBpZiAodHlwZS5zdWJzdHIoMCwgMikgPT09ICdmbScpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU5ld09zY2lsbGF0b3IoT21uaU9zY1R5cGUuRk0pO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci50eXBlID0gdHlwZS5zdWJzdHIoMik7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5zdWJzdHIoMCwgMikgPT09ICdhbScpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU5ld09zY2lsbGF0b3IoT21uaU9zY1R5cGUuQU0pO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci50eXBlID0gdHlwZS5zdWJzdHIoMik7XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5zdWJzdHIoMCwgMykgPT09ICdmYXQnKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVOZXdPc2NpbGxhdG9yKE9tbmlPc2NUeXBlLkZhdCk7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnR5cGUgPSB0eXBlLnN1YnN0cigzKTtcblx0ICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAncHdtJykge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTmV3T3NjaWxsYXRvcihPbW5pT3NjVHlwZS5QV00pO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdwdWxzZScpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU5ld09zY2lsbGF0b3IoT21uaU9zY1R5cGUuUHVsc2UpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTmV3T3NjaWxsYXRvcihPbW5pT3NjVHlwZS5Pc2MpO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci50eXBlID0gdHlwZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBhcnRpYWxzIG9mIHRoZSB3YXZlZm9ybS4gQSBwYXJ0aWFsIHJlcHJlc2VudHNcblx0XHQgKiB0aGUgYW1wbGl0dWRlIGF0IGEgaGFybW9uaWMuIFRoZSBmaXJzdCBoYXJtb25pYyBpcyB0aGVcblx0XHQgKiBmdW5kYW1lbnRhbCBmcmVxdWVuY3ksIHRoZSBzZWNvbmQgaXMgdGhlIG9jdGF2ZSBhbmQgc28gb25cblx0XHQgKiBmb2xsb3dpbmcgdGhlIGhhcm1vbmljIHNlcmllcy5cblx0XHQgKiBTZXR0aW5nIHRoaXMgdmFsdWUgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdHlwZSB0byBcImN1c3RvbVwiLlxuXHRcdCAqIFRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSB0eXBlIGlzIG5vdCBcImN1c3RvbVwiLlxuXHRcdCAqIFRoaXMgaXMgbm90IGF2YWlsYWJsZSBvbiBcInB3bVwiIGFuZCBcInB1bHNlXCIgb3NjaWxsYXRvciB0eXBlcy5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5PbW5pT3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7QXJyYXl9XG5cdFx0ICogQG5hbWUgcGFydGlhbHNcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIG9zYy5wYXJ0aWFscyA9IFsxLCAwLjIsIDAuMDFdO1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLCAncGFydGlhbHMnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vc2NpbGxhdG9yLnBhcnRpYWxzO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAocGFydGlhbHMpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5wYXJ0aWFscyA9IHBhcnRpYWxzO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFNldCBhIG1lbWJlci9hdHRyaWJ1dGUgb2YgdGhlIG9zY2lsbGF0b3IuXG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gcGFyYW1zXG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyPX0gdmFsdWVcblx0XHQgKiAgQHBhcmFtIHtUaW1lPX0gcmFtcFRpbWVcblx0XHQgKiAgQHJldHVybnMge1RvbmUuT21uaU9zY2lsbGF0b3J9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChwYXJhbXMsIHZhbHVlKSB7XG5cdCAgICAgICAgLy9tYWtlIHN1cmUgdGhlIHR5cGUgaXMgc2V0IGZpcnN0XG5cdCAgICAgICAgaWYgKHBhcmFtcyA9PT0gJ3R5cGUnKSB7XG5cdCAgICAgICAgICAgIHRoaXMudHlwZSA9IHZhbHVlO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoVG9uZS5pc09iamVjdChwYXJhbXMpICYmIHBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgndHlwZScpKSB7XG5cdCAgICAgICAgICAgIHRoaXMudHlwZSA9IHBhcmFtcy50eXBlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL3RoZW4gc2V0IHRoZSByZXN0XG5cdCAgICAgICAgVG9uZS5wcm90b3R5cGUuc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGNvbm5lY3QgdGhlIG9zY2lsbGF0b3IgdG8gdGhlIGZyZXF1ZW5jeSBhbmQgZGV0dW5lIHNpZ25hbHNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLl9jcmVhdGVOZXdPc2NpbGxhdG9yID0gZnVuY3Rpb24gKG9zY1R5cGUpIHtcblx0ICAgICAgICBpZiAob3NjVHlwZSAhPT0gdGhpcy5fc291cmNlVHlwZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9zb3VyY2VUeXBlID0gb3NjVHlwZTtcblx0ICAgICAgICAgICAgdmFyIE9zY2lsbGF0b3JDb25zdHJ1Y3RvciA9IFRvbmVbb3NjVHlwZV07XG5cdCAgICAgICAgICAgIC8vc2hvcnQgZGVsYXkgdG8gYXZvaWQgY2xpY2tzIG9uIHRoZSBjaGFuZ2Vcblx0ICAgICAgICAgICAgdmFyIG5vdyA9IHRoaXMubm93KCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9vc2NpbGxhdG9yICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgb2xkT3NjID0gdGhpcy5fb3NjaWxsYXRvcjtcblx0ICAgICAgICAgICAgICAgIG9sZE9zYy5zdG9wKG5vdyk7XG5cdCAgICAgICAgICAgICAgICAvL2Rpc3Bvc2UgdGhlIG9sZCBvbmVcblx0ICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvbGRPc2MuZGlzcG9zZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIG9sZE9zYyA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9LCB0aGlzLmJsb2NrVGltZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvciA9IG5ldyBPc2NpbGxhdG9yQ29uc3RydWN0b3IoKTtcblx0ICAgICAgICAgICAgdGhpcy5mcmVxdWVuY3kuY29ubmVjdCh0aGlzLl9vc2NpbGxhdG9yLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgICAgIHRoaXMuZGV0dW5lLmNvbm5lY3QodGhpcy5fb3NjaWxsYXRvci5kZXR1bmUpO1xuXHQgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9yLnN0YXJ0KG5vdyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBoYXNlIG9mIHRoZSBvc2NpbGxhdG9yIGluIGRlZ3JlZXMuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuT21uaU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge0RlZ3JlZXN9XG5cdFx0ICogQG5hbWUgcGhhc2Vcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSwgJ3BoYXNlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5waGFzZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHBoYXNlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3IucGhhc2UgPSBwaGFzZTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSB3aWR0aCBvZiB0aGUgb3NjaWxsYXRvciAob25seSBpZiB0aGUgb3NjaWxsYXRvciBpcyBzZXQgdG8gXCJwdWxzZVwiKVxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLk9tbmlPc2NpbGxhdG9yI1xuXHRcdCAqIEB0eXBlIHtOb3JtYWxSYW5nZX1cblx0XHQgKiBAc2lnbmFsXG5cdFx0ICogQG5hbWUgd2lkdGhcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIHZhciBvbW5pT3NjID0gbmV3IFRvbmUuT21uaU9zY2lsbGF0b3IoNDQwLCBcInB1bHNlXCIpO1xuXHRcdCAqIC8vY2FuIGFjY2VzcyB0aGUgd2lkdGggYXR0cmlidXRlIG9ubHkgaWYgdHlwZSA9PT0gXCJwdWxzZVwiXG5cdFx0ICogb21uaU9zYy53aWR0aC52YWx1ZSA9IDAuMjtcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZSwgJ3dpZHRoJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc291cmNlVHlwZSA9PT0gT21uaU9zY1R5cGUuUHVsc2UpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vc2NpbGxhdG9yLndpZHRoO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgbnVtYmVyIG9mIGRldHVuZWQgb3NjaWxsYXRvcnNcblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5PbW5pT3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIGNvdW50XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsICdjb3VudCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZVR5cGUgPT09IE9tbmlPc2NUeXBlLkZhdCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29zY2lsbGF0b3IuY291bnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGNvdW50KSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VUeXBlID09PSBPbW5pT3NjVHlwZS5GYXQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3IuY291bnQgPSBjb3VudDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGRldHVuZSBzcHJlYWQgYmV0d2VlbiB0aGUgb3NjaWxsYXRvcnMuIElmIFwiY291bnRcIiBpc1xuXHRcdCAqIHNldCB0byAzIG9zY2lsbGF0b3JzIGFuZCB0aGUgXCJzcHJlYWRcIiBpcyBzZXQgdG8gNDAsXG5cdFx0ICogdGhlIHRocmVlIG9zY2lsbGF0b3JzIHdvdWxkIGJlIGRldHVuZWQgbGlrZSB0aGlzOiBbLTIwLCAwLCAyMF1cblx0XHQgKiBmb3IgYSB0b3RhbCBkZXR1bmUgc3ByZWFkIG9mIDQwIGNlbnRzLiBTZWUgVG9uZS5GYXRPc2NpbGxhdG9yXG5cdFx0ICogZm9yIG1vcmUgaW5mby5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5PbW5pT3NjaWxsYXRvciNcblx0XHQgKiBAdHlwZSB7Q2VudHN9XG5cdFx0ICogQG5hbWUgc3ByZWFkXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsICdzcHJlYWQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VUeXBlID09PSBPbW5pT3NjVHlwZS5GYXQpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vc2NpbGxhdG9yLnNwcmVhZDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoc3ByZWFkKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VUeXBlID09PSBPbW5pT3NjVHlwZS5GYXQpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3Iuc3ByZWFkID0gc3ByZWFkO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgdHlwZSBvZiB0aGUgbW9kdWxhdG9yIG9zY2lsbGF0b3IuIE9ubHkgaWYgdGhlIG9zY2lsbGF0b3Jcblx0XHQgKiBpcyBzZXQgdG8gXCJhbVwiIG9yIFwiZm1cIiB0eXBlcy4gc2VlLiBUb25lLkFNT3NjaWxsYXRvciBvciBUb25lLkZNT3NjaWxsYXRvclxuXHRcdCAqIGZvciBtb3JlIGluZm8uXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuT21uaU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge1N0cmluZ31cblx0XHQgKiBAbmFtZSBtb2R1bGF0aW9uVHlwZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLCAnbW9kdWxhdGlvblR5cGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VUeXBlID09PSBPbW5pT3NjVHlwZS5GTSB8fCB0aGlzLl9zb3VyY2VUeXBlID09PSBPbW5pT3NjVHlwZS5BTSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29zY2lsbGF0b3IubW9kdWxhdGlvblR5cGU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG1UeXBlKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VUeXBlID09PSBPbW5pT3NjVHlwZS5GTSB8fCB0aGlzLl9zb3VyY2VUeXBlID09PSBPbW5pT3NjVHlwZS5BTSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5tb2R1bGF0aW9uVHlwZSA9IG1UeXBlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgbW9kdWxhdGlvbiBpbmRleCB3aGljaCBpcyBpbiBlc3NlbmNlIHRoZSBkZXB0aCBvciBhbW91bnQgb2YgdGhlIG1vZHVsYXRpb24uIEluIG90aGVyIHRlcm1zIGl0IGlzIHRoZVxuXHRcdCAqIHJhdGlvIG9mIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG1vZHVsYXRpbmcgc2lnbmFsIChtZikgdG8gdGhlIGFtcGxpdHVkZSBvZiB0aGVcblx0XHQgKiBtb2R1bGF0aW5nIHNpZ25hbCAobWEpIC0tIGFzIGluIG1hL21mLlxuXHRcdCAqIFNlZSBUb25lLkZNT3NjaWxsYXRvciBmb3IgbW9yZSBpbmZvLlxuXHRcdCAqIEB0eXBlIHtQb3NpdGl2ZX1cblx0XHQgKiBAc2lnbmFsXG5cdFx0ICogQG5hbWUgbW9kdWxhdGlvbkluZGV4XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsICdtb2R1bGF0aW9uSW5kZXgnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9zb3VyY2VUeXBlID09PSBPbW5pT3NjVHlwZS5GTSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29zY2lsbGF0b3IubW9kdWxhdGlvbkluZGV4O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgSGFybW9uaWNpdHkgaXMgdGhlIGZyZXF1ZW5jeSByYXRpbyBiZXR3ZWVuIHRoZSBjYXJyaWVyIGFuZCB0aGUgbW9kdWxhdG9yIG9zY2lsbGF0b3JzLlxuXHRcdCAqICBBIGhhcm1vbmljaXR5IG9mIDEgZ2l2ZXMgYm90aCBvc2NpbGxhdG9ycyB0aGUgc2FtZSBmcmVxdWVuY3kuXG5cdFx0ICogIEhhcm1vbmljaXR5ID0gMiBtZWFucyBhIGNoYW5nZSBvZiBhbiBvY3RhdmUuIFNlZSBUb25lLkFNT3NjaWxsYXRvciBvciBUb25lLkZNT3NjaWxsYXRvclxuXHRcdCAqICBmb3IgbW9yZSBpbmZvLlxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5PbW5pT3NjaWxsYXRvciNcblx0XHQgKiAgQHNpZ25hbFxuXHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0ICogIEBuYW1lIGhhcm1vbmljaXR5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5PbW5pT3NjaWxsYXRvci5wcm90b3R5cGUsICdoYXJtb25pY2l0eScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZVR5cGUgPT09IE9tbmlPc2NUeXBlLkZNIHx8IHRoaXMuX3NvdXJjZVR5cGUgPT09IE9tbmlPc2NUeXBlLkFNKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3NjaWxsYXRvci5oYXJtb25pY2l0eTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIG1vZHVsYXRpb25GcmVxdWVuY3kgU2lnbmFsIG9mIHRoZSBvc2NpbGxhdG9yXG5cdFx0ICogKG9ubHkgaWYgdGhlIG9zY2lsbGF0b3IgdHlwZSBpcyBzZXQgdG8gcHdtKS4gU2VlXG5cdFx0ICogVG9uZS5QV01Pc2NpbGxhdG9yIGZvciBtb3JlIGluZm8uXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuT21uaU9zY2lsbGF0b3IjXG5cdFx0ICogQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHQgKiBAc2lnbmFsXG5cdFx0ICogQG5hbWUgbW9kdWxhdGlvbkZyZXF1ZW5jeVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogdmFyIG9tbmlPc2MgPSBuZXcgVG9uZS5PbW5pT3NjaWxsYXRvcig0NDAsIFwicHdtXCIpO1xuXHRcdCAqIC8vY2FuIGFjY2VzcyB0aGUgbW9kdWxhdGlvbkZyZXF1ZW5jeSBhdHRyaWJ1dGUgb25seSBpZiB0eXBlID09PSBcInB3bVwiXG5cdFx0ICogb21uaU9zYy5tb2R1bGF0aW9uRnJlcXVlbmN5LnZhbHVlID0gMC4yO1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuT21uaU9zY2lsbGF0b3IucHJvdG90eXBlLCAnbW9kdWxhdGlvbkZyZXF1ZW5jeScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZVR5cGUgPT09IE9tbmlPc2NUeXBlLlBXTSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29zY2lsbGF0b3IubW9kdWxhdGlvbkZyZXF1ZW5jeTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJuIHtUb25lLk9tbmlPc2NpbGxhdG9yfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk9tbmlPc2NpbGxhdG9yLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU291cmNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RldHVuZSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLmRldHVuZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fc291cmNlVHlwZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuT21uaU9zY2lsbGF0b3I7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgQmFzZS1jbGFzcyBmb3IgYWxsIGluc3RydW1lbnRzXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuSW5zdHJ1bWVudCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgLy9nZXQgdGhlIGRlZmF1bHRzXG5cdCAgICAgICAgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdEFyZyhvcHRpb25zLCBUb25lLkluc3RydW1lbnQuZGVmYXVsdHMpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG91dHB1dCBhbmQgdm9sdW1lIHRyaW1pbmcgbm9kZVxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5Wb2x1bWV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZSA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuVm9sdW1lKG9wdGlvbnMudm9sdW1lKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSB2b2x1bWUgb2YgdGhlIG91dHB1dCBpbiBkZWNpYmVscy5cblx0XHRcdCAqIEB0eXBlIHtEZWNpYmVsc31cblx0XHRcdCAqIEBzaWduYWxcblx0XHRcdCAqIEBleGFtcGxlXG5cdFx0XHQgKiBzb3VyY2Uudm9sdW1lLnZhbHVlID0gLTY7XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnZvbHVtZSA9IHRoaXMuX3ZvbHVtZS52b2x1bWU7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoJ3ZvbHVtZScpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogS2VlcCB0cmFjayBvZiBhbGwgZXZlbnRzIHNjaGVkdWxlZCB0byB0aGUgdHJhbnNwb3J0XG5cdFx0XHQgKiB3aGVuIHRoZSBpbnN0cnVtZW50IGlzICdzeW5jZWQnXG5cdFx0XHQgKiBAdHlwZSB7QXJyYXk8TnVtYmVyPn1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9zY2hlZHVsZWRFdmVudHMgPSBbXTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkluc3RydW1lbnQsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqICB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzXG5cdFx0ICogIEB0eXBlIHtvYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLkluc3RydW1lbnQuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgLyoqIHRoZSB2b2x1bWUgb2YgdGhlIG91dHB1dCBpbiBkZWNpYmVscyAqL1xuXHQgICAgICAgICd2b2x1bWUnOiAwXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEBhYnN0cmFjdFxuXHRcdCAqICBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IG5vdGUgdGhlIG5vdGUgdG8gdHJpZ2dlclxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdG8gdHJpZ2dlciB0aGUgbnRvZVxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW3ZlbG9jaXR5PTFdIHRoZSB2ZWxvY2l0eSB0byB0cmlnZ2VyIHRoZSBub3RlXG5cdFx0ICovXG5cdCAgICBUb25lLkluc3RydW1lbnQucHJvdG90eXBlLnRyaWdnZXJBdHRhY2sgPSBUb25lLm5vT3A7XG5cdCAgICAvKipcblx0XHQgKiAgQGFic3RyYWN0XG5cdFx0ICogIEBwYXJhbSB7VGltZX0gW3RpbWU9bm93XSB3aGVuIHRvIHRyaWdnZXIgdGhlIHJlbGVhc2Vcblx0XHQgKi9cblx0ICAgIFRvbmUuSW5zdHJ1bWVudC5wcm90b3R5cGUudHJpZ2dlclJlbGVhc2UgPSBUb25lLm5vT3A7XG5cdCAgICAvKipcblx0XHQgKiBTeW5jIHRoZSBpbnN0cnVtZW50IHRvIHRoZSBUcmFuc3BvcnQuIEFsbCBzdWJzZXF1ZW50IGNhbGxzIG9mXG5cdFx0ICogW3RyaWdnZXJBdHRhY2tdKCN0cmlnZ2VyYXR0YWNrKSBhbmQgW3RyaWdnZXJSZWxlYXNlXSgjdHJpZ2dlcnJlbGVhc2UpXG5cdFx0ICogd2lsbCBiZSBzY2hlZHVsZWQgYWxvbmcgdGhlIHRyYW5zcG9ydC5cblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIGluc3RydW1lbnQuc3luYygpXG5cdFx0ICogLy9zY2hlZHVsZSAzIG5vdGVzIHdoZW4gdGhlIHRyYW5zcG9ydCBmaXJzdCBzdGFydHNcblx0XHQgKiBpbnN0cnVtZW50LnRyaWdnZXJBdHRhY2tSZWxlYXNlKCdDNCcsICc4bicsIDApXG5cdFx0ICogaW5zdHJ1bWVudC50cmlnZ2VyQXR0YWNrUmVsZWFzZSgnRTQnLCAnOG4nLCAnOG4nKVxuXHRcdCAqIGluc3RydW1lbnQudHJpZ2dlckF0dGFja1JlbGVhc2UoJ0c0JywgJzhuJywgJzRuJylcblx0XHQgKiAvL3N0YXJ0IHRoZSB0cmFuc3BvcnQgdG8gaGVhciB0aGUgbm90ZXNcblx0XHQgKiBUcmFuc3BvcnQuc3RhcnQoKVxuXHRcdCAqIEByZXR1cm5zIHtUb25lLkluc3RydW1lbnR9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuSW5zdHJ1bWVudC5wcm90b3R5cGUuc3luYyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB0aGlzLl9zeW5jTWV0aG9kKCd0cmlnZ2VyQXR0YWNrJywgMSk7XG5cdCAgICAgICAgdGhpcy5fc3luY01ldGhvZCgndHJpZ2dlclJlbGVhc2UnLCAwKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBXcmFwIHRoZSBnaXZlbiBtZXRob2Qgc28gdGhhdCBpdCBjYW4gYmUgc3luY2hyb25pemVkXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCBXaGljaCBtZXRob2QgdG8gd3JhcCBhbmQgc3luY1xuXHRcdCAqIEBwYXJhbSAge051bWJlcn0gdGltZVBvc2l0aW9uIFdoYXQgcG9zaXRpb24gdGhlIHRpbWUgYXJndW1lbnQgYXBwZWFycyBpblxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkluc3RydW1lbnQucHJvdG90eXBlLl9zeW5jTWV0aG9kID0gZnVuY3Rpb24gKG1ldGhvZCwgdGltZVBvc2l0aW9uKSB7XG5cdCAgICAgICAgdmFyIG9yaWdpbmFsTWV0aG9kID0gdGhpc1snX29yaWdpbmFsXycgKyBtZXRob2RdID0gdGhpc1ttZXRob2RdO1xuXHQgICAgICAgIHRoaXNbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICB2YXIgdGltZSA9IGFyZ3NbdGltZVBvc2l0aW9uXTtcblx0ICAgICAgICAgICAgdmFyIGlkID0gVG9uZS5UcmFuc3BvcnQuc2NoZWR1bGUoZnVuY3Rpb24gKHQpIHtcblx0ICAgICAgICAgICAgICAgIGFyZ3NbdGltZVBvc2l0aW9uXSA9IHQ7XG5cdCAgICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcblx0ICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCB0aW1lKTtcblx0ICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVkRXZlbnRzLnB1c2goaWQpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBVbnN5bmMgdGhlIGluc3RydW1lbnQgZnJvbSB0aGUgVHJhbnNwb3J0XG5cdFx0ICogQHJldHVybnMge1RvbmUuSW5zdHJ1bWVudH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5JbnN0cnVtZW50LnByb3RvdHlwZS51bnN5bmMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5fc2NoZWR1bGVkRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG5cdCAgICAgICAgICAgIFRvbmUuVHJhbnNwb3J0LmNsZWFyKGlkKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLl9zY2hlZHVsZWRFdmVudHMgPSBbXTtcblx0ICAgICAgICBpZiAodGhpcy5fb3JpZ2luYWxfdHJpZ2dlckF0dGFjaykge1xuXHQgICAgICAgICAgICB0aGlzLnRyaWdnZXJBdHRhY2sgPSB0aGlzLl9vcmlnaW5hbF90cmlnZ2VyQXR0YWNrO1xuXHQgICAgICAgICAgICB0aGlzLnRyaWdnZXJSZWxlYXNlID0gdGhpcy5fb3JpZ2luYWxfdHJpZ2dlclJlbGVhc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUcmlnZ2VyIHRoZSBhdHRhY2sgYW5kIHRoZW4gdGhlIHJlbGVhc2UgYWZ0ZXIgdGhlIGR1cmF0aW9uLlxuXHRcdCAqICBAcGFyYW0gIHtGcmVxdWVuY3l9IG5vdGUgICAgIFRoZSBub3RlIHRvIHRyaWdnZXIuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IGR1cmF0aW9uIEhvdyBsb25nIHRoZSBub3RlIHNob3VsZCBiZSBoZWxkIGZvciBiZWZvcmVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmluZyB0aGUgcmVsZWFzZS4gVGhpcyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gIFdoZW4gdGhlIG5vdGUgc2hvdWxkIGJlIHRyaWdnZXJlZC5cblx0XHQgKiAgQHBhcmFtICB7Tm9ybWFsUmFuZ2V9IFt2ZWxvY2l0eT0xXSBUaGUgdmVsb2NpdHkgdGhlIG5vdGUgc2hvdWxkIGJlIHRyaWdnZXJlZCBhdC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuSW5zdHJ1bWVudH0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vdHJpZ2dlciBcIkM0XCIgZm9yIHRoZSBkdXJhdGlvbiBvZiBhbiA4dGggbm90ZVxuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKFwiQzRcIiwgXCI4blwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuSW5zdHJ1bWVudC5wcm90b3R5cGUudHJpZ2dlckF0dGFja1JlbGVhc2UgPSBmdW5jdGlvbiAobm90ZSwgZHVyYXRpb24sIHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIGR1cmF0aW9uID0gdGhpcy50b1NlY29uZHMoZHVyYXRpb24pO1xuXHQgICAgICAgIHRoaXMudHJpZ2dlckF0dGFjayhub3RlLCB0aW1lLCB2ZWxvY2l0eSk7XG5cdCAgICAgICAgdGhpcy50cmlnZ2VyUmVsZWFzZSh0aW1lICsgZHVyYXRpb24pO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5JbnN0cnVtZW50fSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkluc3RydW1lbnQucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl92b2x1bWUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoWyd2b2x1bWUnXSk7XG5cdCAgICAgICAgdGhpcy52b2x1bWUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMudW5zeW5jKCk7XG5cdCAgICAgICAgdGhpcy5fc2NoZWR1bGVkRXZlbnRzID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5JbnN0cnVtZW50O1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIFRoaXMgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igb3RoZXIgbW9ub3Bob25pYyBpbnN0cnVtZW50cyB0byBcblx0XHQgKiAgICAgICAgICBleHRlbmQuIElNUE9SVEFOVDogSXQgZG9lcyBub3QgbWFrZSBhbnkgc291bmQgb24gaXRzIG93biBhbmRcblx0XHQgKiAgICAgICAgICBzaG91bGRuJ3QgYmUgZGlyZWN0bHkgaW5zdGFudGlhdGVkLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAYWJzdHJhY3Rcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuSW5zdHJ1bWVudH1cblx0XHQgKi9cblx0ICAgIFRvbmUuTW9ub3Bob25pYyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG5cdCAgICAgICAgLy9nZXQgdGhlIGRlZmF1bHRzXG5cdCAgICAgICAgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdEFyZyhvcHRpb25zLCBUb25lLk1vbm9waG9uaWMuZGVmYXVsdHMpO1xuXHQgICAgICAgIFRvbmUuSW5zdHJ1bWVudC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBnbGlkZSB0aW1lIGJldHdlZW4gbm90ZXMuIFxuXHRcdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5wb3J0YW1lbnRvID0gb3B0aW9ucy5wb3J0YW1lbnRvO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuTW9ub3Bob25pYywgVG9uZS5JbnN0cnVtZW50KTtcblx0ICAgIC8qKlxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Nb25vcGhvbmljLmRlZmF1bHRzID0geyAncG9ydGFtZW50byc6IDAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUcmlnZ2VyIHRoZSBhdHRhY2sgb2YgdGhlIG5vdGUgb3B0aW9uYWxseSB3aXRoIGEgZ2l2ZW4gdmVsb2NpdHkuIFxuXHRcdCAqICBcblx0XHQgKiAgXG5cdFx0ICogIEBwYXJhbSAge0ZyZXF1ZW5jeX0gbm90ZSAgICAgVGhlIG5vdGUgdG8gdHJpZ2dlci5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XSAgICAgV2hlbiB0aGUgbm90ZSBzaG91bGQgc3RhcnQuXG5cdFx0ICogIEBwYXJhbSAge251bWJlcn0gW3ZlbG9jaXR5PTFdIHZlbG9jaXR5IFRoZSB2ZWxvY2l0eSBzY2FsZXIgXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgaG93IFwibG91ZFwiIHRoZSBub3RlIFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHRyaWdnZXJlZC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuTW9ub3Bob25pY30gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2soXCJDNFwiKTtcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL3RyaWdnZXIgdGhlIG5vdGUgYSBoYWxmIHNlY29uZCBmcm9tIG5vdyBhdCBoYWxmIHZlbG9jaXR5XG5cdFx0ICogc3ludGgudHJpZ2dlckF0dGFjayhcIkM0XCIsIFwiKzAuNVwiLCAwLjUpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Nb25vcGhvbmljLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrID0gZnVuY3Rpb24gKG5vdGUsIHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0aW1lLCB2ZWxvY2l0eSk7XG5cdCAgICAgICAgdGhpcy5zZXROb3RlKG5vdGUsIHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUcmlnZ2VyIHRoZSByZWxlYXNlIHBvcnRpb24gb2YgdGhlIGVudmVsb3BlXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd10gSWYgbm8gdGltZSBpcyBnaXZlbiwgdGhlIHJlbGVhc2UgaGFwcGVucyBpbW1lZGlhdGx5XG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk1vbm9waG9uaWN9IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBzeW50aC50cmlnZ2VyUmVsZWFzZSgpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Nb25vcGhvbmljLnByb3RvdHlwZS50cmlnZ2VyUmVsZWFzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggdGhlIGFjdHVhbCBtZXRob2Rcblx0XHQgKiAgQGFic3RyYWN0XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLk1vbm9waG9uaWMucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2sgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHdpdGggdGhlIGFjdHVhbCBtZXRob2Rcblx0XHQgKiAgQGFic3RyYWN0XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLk1vbm9waG9uaWMucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBHZXQgdGhlIGxldmVsIG9mIHRoZSBvdXRwdXQgYXQgdGhlIGdpdmVuIHRpbWUuIE1lYXN1cmVzXG5cdFx0ICogIHRoZSBlbnZlbG9wZShzKSB2YWx1ZSBhdCB0aGUgdGltZS4gXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gdGltZSBUaGUgdGltZSB0byBxdWVyeSB0aGUgZW52ZWxvcGUgdmFsdWVcblx0XHQgKiAgQHJldHVybiB7Tm9ybWFsUmFuZ2V9IFRoZSBvdXRwdXQgbGV2ZWwgYmV0d2VlbiAwLTFcblx0XHQgKi9cblx0ICAgIFRvbmUuTW9ub3Bob25pYy5wcm90b3R5cGUuZ2V0TGV2ZWxBdFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5lbnZlbG9wZS5nZXRWYWx1ZUF0VGltZSh0aW1lKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2V0IHRoZSBub3RlIGF0IHRoZSBnaXZlbiB0aW1lLiBJZiBubyB0aW1lIGlzIGdpdmVuLCB0aGUgbm90ZVxuXHRcdCAqICB3aWxsIHNldCBpbW1lZGlhdGVseS4gXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBub3RlIFRoZSBub3RlIHRvIGNoYW5nZSB0by5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XSBUaGUgdGltZSB3aGVuIHRoZSBub3RlIHNob3VsZCBiZSBzZXQuIFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Nb25vcGhvbmljfSB0aGlzXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvL2NoYW5nZSB0byBGIzYgaW4gb25lIHF1YXJ0ZXIgbm90ZSBmcm9tIG5vdy5cblx0XHQgKiBzeW50aC5zZXROb3RlKFwiRiM2XCIsIFwiKzRuXCIpO1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy9jaGFuZ2UgdG8gQmI0IHJpZ2h0IG5vd1xuXHRcdCAqIHN5bnRoLnNldE5vdGUoXCJCYjRcIik7XG5cdFx0ICovXG5cdCAgICBUb25lLk1vbm9waG9uaWMucHJvdG90eXBlLnNldE5vdGUgPSBmdW5jdGlvbiAobm90ZSwgdGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBpZiAodGhpcy5wb3J0YW1lbnRvID4gMCAmJiB0aGlzLmdldExldmVsQXRUaW1lKHRpbWUpID4gMC4wNSkge1xuXHQgICAgICAgICAgICB2YXIgcG9ydFRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aGlzLnBvcnRhbWVudG8pO1xuXHQgICAgICAgICAgICB0aGlzLmZyZXF1ZW5jeS5leHBvbmVudGlhbFJhbXBUbyhub3RlLCBwb3J0VGltZSwgdGltZSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUobm90ZSwgdGltZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk1vbm9waG9uaWM7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgVG9uZS5TeW50aCBpcyBjb21wb3NlZCBzaW1wbHkgb2YgYSBUb25lLk9tbmlPc2NpbGxhdG9yXG5cdFx0ICogICAgICAgICAgcm91dGVkIHRocm91Z2ggYSBUb25lLkFtcGxpdHVkZUVudmVsb3BlLlxuXHRcdCAqICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZHJhd2luZ3MvZC8xLTFfMFlXMloxSjJFUEkzNlA4Zk5DTWNaRzdOMXcxR1psdVBzNG9nNGV2by9wdWI/dz0xMTYzJmg9MjMxXCI+XG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLk1vbm9waG9uaWN9XG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgc3ludGhcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGRlZmF1bHRzIGJlbG93XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIHN5bnRoID0gbmV3IFRvbmUuU3ludGgoKS50b01hc3RlcigpO1xuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKFwiQzRcIiwgXCI4blwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuU3ludGggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgICAgIC8vZ2V0IHRoZSBkZWZhdWx0c1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5TeW50aC5kZWZhdWx0cyk7XG5cdCAgICAgICAgVG9uZS5Nb25vcGhvbmljLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG9zY2lsbGF0b3IuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuT21uaU9zY2lsbGF0b3J9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3IgPSBuZXcgVG9uZS5PbW5pT3NjaWxsYXRvcihvcHRpb25zLm9zY2lsbGF0b3IpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBmcmVxdWVuY3kgY29udHJvbC5cblx0XHRcdCAqICBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gdGhpcy5vc2NpbGxhdG9yLmZyZXF1ZW5jeTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGV0dW5lIGNvbnRyb2wuXG5cdFx0XHQgKiAgQHR5cGUge0NlbnRzfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gdGhpcy5vc2NpbGxhdG9yLmRldHVuZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW1wbGl0dWRlIGVudmVsb3BlLlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkFtcGxpdHVkZUVudmVsb3BlfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5lbnZlbG9wZSA9IG5ldyBUb25lLkFtcGxpdHVkZUVudmVsb3BlKG9wdGlvbnMuZW52ZWxvcGUpO1xuXHQgICAgICAgIC8vY29ubmVjdCB0aGUgb3NjaWxsYXRvcnMgdG8gdGhlIG91dHB1dFxuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvci5jaGFpbih0aGlzLmVudmVsb3BlLCB0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnb3NjaWxsYXRvcicsXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnZGV0dW5lJyxcblx0ICAgICAgICAgICAgJ2VudmVsb3BlJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuU3ludGgsIFRvbmUuTW9ub3Bob25pYyk7XG5cdCAgICAvKipcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuU3ludGguZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ29zY2lsbGF0b3InOiB7ICd0eXBlJzogJ3RyaWFuZ2xlJyB9LFxuXHQgICAgICAgICdlbnZlbG9wZSc6IHtcblx0ICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDA1LFxuXHQgICAgICAgICAgICAnZGVjYXknOiAwLjEsXG5cdCAgICAgICAgICAgICdzdXN0YWluJzogMC4zLFxuXHQgICAgICAgICAgICAncmVsZWFzZSc6IDFcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIHN0YXJ0IHRoZSBhdHRhY2sgcG9ydGlvbiBvZiB0aGUgZW52ZWxvcGVcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIHRoZSB0aW1lIHRoZSBhdHRhY2sgc2hvdWxkIHN0YXJ0XG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyfSBbdmVsb2NpdHk9MV0gdGhlIHZlbG9jaXR5IG9mIHRoZSBub3RlICgwLTEpXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlN5bnRofSB0aGlzXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlN5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlQXR0YWNrID0gZnVuY3Rpb24gKHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgLy90aGUgZW52ZWxvcGVzXG5cdCAgICAgICAgdGhpcy5lbnZlbG9wZS50cmlnZ2VyQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3Iuc3RhcnQodGltZSk7XG5cdCAgICAgICAgLy9pZiB0aGVyZSBpcyBubyByZWxlYXNlIHBvcnRpb24sIHN0b3AgdGhlIG9zY2lsbGF0b3Jcblx0ICAgICAgICBpZiAodGhpcy5lbnZlbG9wZS5zdXN0YWluID09PSAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMub3NjaWxsYXRvci5zdG9wKHRpbWUgKyB0aGlzLmVudmVsb3BlLmF0dGFjayArIHRoaXMuZW52ZWxvcGUuZGVjYXkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc3RhcnQgdGhlIHJlbGVhc2UgcG9ydGlvbiBvZiB0aGUgZW52ZWxvcGVcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIHRoZSB0aW1lIHRoZSByZWxlYXNlIHNob3VsZCBzdGFydFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5TeW50aH0gdGhpc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlLnRyaWdnZXJSZWxlYXNlKHRpbWUpO1xuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvci5zdG9wKHRpbWUgKyB0aGlzLmVudmVsb3BlLnJlbGVhc2UpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5TeW50aH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TeW50aC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLk1vbm9waG9uaWMucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdvc2NpbGxhdG9yJyxcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdkZXR1bmUnLFxuXHQgICAgICAgICAgICAnZW52ZWxvcGUnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5vc2NpbGxhdG9yLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmRldHVuZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuU3ludGg7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgQU1TeW50aCB1c2VzIHRoZSBvdXRwdXQgb2Ygb25lIFRvbmUuU3ludGggdG8gbW9kdWxhdGUgdGhlXG5cdFx0ICogICAgICAgICAgYW1wbGl0dWRlIG9mIGFub3RoZXIgVG9uZS5TeW50aC4gVGhlIGhhcm1vbmljaXR5ICh0aGUgcmF0aW8gYmV0d2VlblxuXHRcdCAqICAgICAgICAgIHRoZSB0d28gc2lnbmFscykgYWZmZWN0cyB0aGUgdGltYnJlIG9mIHRoZSBvdXRwdXQgc2lnbmFsIGdyZWF0bHkuXG5cdFx0ICogICAgICAgICAgUmVhZCBtb3JlIGFib3V0IEFtcGxpdHVkZSBNb2R1bGF0aW9uIFN5bnRoZXNpcyBvblxuXHRcdCAqICAgICAgICAgIFtTb3VuZE9uU291bmRdKGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEwMzY1My9odHRwOi8vd3d3LnNvdW5kb25zb3VuZC5jb206ODAvc29zL21hcjAwL2FydGljbGVzL3N5bnRoc2VjcmV0cy5odG0pLlxuXHRcdCAqICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZHJhd2luZ3MvZC8xVFF1OEVkNGlGcjFZVExLcEIzVTFfaHVyLVV3QnJoNWdkQlhjOEJ4ZkdLdy9wdWI/dz0xMDA5Jmg9NDU3XCI+XG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLk1vbm9waG9uaWN9XG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgc3ludGhcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgZGVmYXVsdHMgYmVsb3dcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgc3ludGggPSBuZXcgVG9uZS5BTVN5bnRoKCkudG9NYXN0ZXIoKTtcblx0XHQgKiBzeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZShcIkM0XCIsIFwiNG5cIik7XG5cdFx0ICovXG5cdCAgICBUb25lLkFNU3ludGggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5BTVN5bnRoLmRlZmF1bHRzKTtcblx0ICAgICAgICBUb25lLk1vbm9waG9uaWMuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY2FycmllciB2b2ljZS5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5TeW50aH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fY2FycmllciA9IG5ldyBUb25lLlN5bnRoKCk7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci52b2x1bWUudmFsdWUgPSAtMTA7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGNhcnJpZXIncyBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuT3NjaWxsYXRvcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvciA9IHRoaXMuX2NhcnJpZXIub3NjaWxsYXRvcjtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY2FycmllcidzIGVudmVsb3BlXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuQW1wbGl0dWRlRW52ZWxvcGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmVudmVsb3BlID0gdGhpcy5fY2Fycmllci5lbnZlbG9wZS5zZXQob3B0aW9ucy5lbnZlbG9wZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG1vZHVsYXRvciB2b2ljZS5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5TeW50aH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yID0gbmV3IFRvbmUuU3ludGgoKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3Iudm9sdW1lLnZhbHVlID0gLTEwO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtb2R1bGF0b3IncyBvc2NpbGxhdG9yIHdoaWNoIGlzIGFwcGxpZWRcblx0XHRcdCAqICB0byB0aGUgYW1wbGl0dWRlIG9mIHRoZSBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuT3NjaWxsYXRvcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMubW9kdWxhdGlvbiA9IHRoaXMuX21vZHVsYXRvci5vc2NpbGxhdG9yLnNldChvcHRpb25zLm1vZHVsYXRpb24pO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtb2R1bGF0b3IncyBlbnZlbG9wZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkFtcGxpdHVkZUVudmVsb3BlfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5tb2R1bGF0aW9uRW52ZWxvcGUgPSB0aGlzLl9tb2R1bGF0b3IuZW52ZWxvcGUuc2V0KG9wdGlvbnMubW9kdWxhdGlvbkVudmVsb3BlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZnJlcXVlbmN5LlxuXHRcdFx0ICogIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBuZXcgVG9uZS5TaWduYWwoNDQwLCBUb25lLlR5cGUuRnJlcXVlbmN5KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGV0dW5lIGluIGNlbnRzXG5cdFx0XHQgKiAgQHR5cGUge0NlbnRzfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbmV3IFRvbmUuU2lnbmFsKG9wdGlvbnMuZGV0dW5lLCBUb25lLlR5cGUuQ2VudHMpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEhhcm1vbmljaXR5IGlzIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSB0d28gdm9pY2VzLiBBIGhhcm1vbmljaXR5IG9mXG5cdFx0XHQgKiAgMSBpcyBubyBjaGFuZ2UuIEhhcm1vbmljaXR5ID0gMiBtZWFucyBhIGNoYW5nZSBvZiBhbiBvY3RhdmUuXG5cdFx0XHQgKiAgQHR5cGUge1Bvc2l0aXZlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqICBAZXhhbXBsZVxuXHRcdFx0ICogLy9waXRjaCB2b2ljZTEgYW4gb2N0YXZlIGJlbG93IHZvaWNlMFxuXHRcdFx0ICogc3ludGguaGFybW9uaWNpdHkudmFsdWUgPSAwLjU7XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmhhcm1vbmljaXR5ID0gbmV3IFRvbmUuTXVsdGlwbHkob3B0aW9ucy5oYXJtb25pY2l0eSk7XG5cdCAgICAgICAgdGhpcy5oYXJtb25pY2l0eS51bml0cyA9IFRvbmUuVHlwZS5Qb3NpdGl2ZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBjb252ZXJ0IHRoZSAtMSwxIG91dHB1dCB0byAwLDFcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5BdWRpb1RvR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdGlvblNjYWxlID0gbmV3IFRvbmUuQXVkaW9Ub0dhaW4oKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbm9kZSB3aGVyZSB0aGUgbW9kdWxhdGlvbiBoYXBwZW5zXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdGlvbk5vZGUgPSBuZXcgVG9uZS5HYWluKCk7XG5cdCAgICAgICAgLy9jb250cm9sIHRoZSB0d28gdm9pY2VzIGZyZXF1ZW5jeVxuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmNvbm5lY3QodGhpcy5fY2Fycmllci5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMuaGFybW9uaWNpdHksIHRoaXMuX21vZHVsYXRvci5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lLmZhbih0aGlzLl9jYXJyaWVyLmRldHVuZSwgdGhpcy5fbW9kdWxhdG9yLmRldHVuZSk7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLmNoYWluKHRoaXMuX21vZHVsYXRpb25TY2FsZSwgdGhpcy5fbW9kdWxhdGlvbk5vZGUuZ2Fpbik7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5jaGFpbih0aGlzLl9tb2R1bGF0aW9uTm9kZSwgdGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdoYXJtb25pY2l0eScsXG5cdCAgICAgICAgICAgICdvc2NpbGxhdG9yJyxcblx0ICAgICAgICAgICAgJ2VudmVsb3BlJyxcblx0ICAgICAgICAgICAgJ21vZHVsYXRpb24nLFxuXHQgICAgICAgICAgICAnbW9kdWxhdGlvbkVudmVsb3BlJyxcblx0ICAgICAgICAgICAgJ2RldHVuZSdcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkFNU3ludGgsIFRvbmUuTW9ub3Bob25pYyk7XG5cdCAgICAvKipcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5BTVN5bnRoLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdoYXJtb25pY2l0eSc6IDMsXG5cdCAgICAgICAgJ2RldHVuZSc6IDAsXG5cdCAgICAgICAgJ29zY2lsbGF0b3InOiB7ICd0eXBlJzogJ3NpbmUnIH0sXG5cdCAgICAgICAgJ2VudmVsb3BlJzoge1xuXHQgICAgICAgICAgICAnYXR0YWNrJzogMC4wMSxcblx0ICAgICAgICAgICAgJ2RlY2F5JzogMC4wMSxcblx0ICAgICAgICAgICAgJ3N1c3RhaW4nOiAxLFxuXHQgICAgICAgICAgICAncmVsZWFzZSc6IDAuNVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgJ21vZHVsYXRpb24nOiB7ICd0eXBlJzogJ3NxdWFyZScgfSxcblx0ICAgICAgICAnbW9kdWxhdGlvbkVudmVsb3BlJzoge1xuXHQgICAgICAgICAgICAnYXR0YWNrJzogMC41LFxuXHQgICAgICAgICAgICAnZGVjYXknOiAwLFxuXHQgICAgICAgICAgICAnc3VzdGFpbic6IDEsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJzogMC41XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICB0cmlnZ2VyIHRoZSBhdHRhY2sgcG9ydGlvbiBvZiB0aGUgbm90ZVxuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdGhlIG5vdGUgd2lsbCBvY2N1clxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfSBbdmVsb2NpdHk9MV0gdGhlIHZlbG9jaXR5IG9mIHRoZSBub3RlXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkFNU3ludGh9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQU1TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayA9IGZ1bmN0aW9uICh0aW1lLCB2ZWxvY2l0eSkge1xuXHQgICAgICAgIC8vdGhlIHBvcnQgZ2xpZGVcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgLy90aGUgZW52ZWxvcGVzXG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5fdHJpZ2dlckVudmVsb3BlQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgdHJpZ2dlciB0aGUgcmVsZWFzZSBwb3J0aW9uIG9mIHRoZSBub3RlXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XSB0aGUgdGltZSB0aGUgbm90ZSB3aWxsIHJlbGVhc2Vcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHJldHVybnMge1RvbmUuQU1TeW50aH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5BTVN5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZSh0aW1lKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGNsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkFNU3ludGh9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuQU1TeW50aC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLk1vbm9waG9uaWMucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAnaGFybW9uaWNpdHknLFxuXHQgICAgICAgICAgICAnb3NjaWxsYXRvcicsXG5cdCAgICAgICAgICAgICdlbnZlbG9wZScsXG5cdCAgICAgICAgICAgICdtb2R1bGF0aW9uJyxcblx0ICAgICAgICAgICAgJ21vZHVsYXRpb25FbnZlbG9wZScsXG5cdCAgICAgICAgICAgICdkZXR1bmUnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fY2FycmllciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmhhcm1vbmljaXR5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmhhcm1vbmljaXR5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0aW9uU2NhbGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRpb25TY2FsZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdGlvbk5vZGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRpb25Ob2RlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMubW9kdWxhdGlvbkVudmVsb3BlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb24gPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkFNU3ludGg7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgVG9uZS5Nb25vU3ludGggaXMgY29tcG9zZWQgb2Ygb25lIG9zY2lsbGF0b3IsIG9uZSBmaWx0ZXIsIGFuZCB0d28gZW52ZWxvcGVzLlxuXHRcdCAqICAgICAgICAgIFRoZSBhbXBsaXR1ZGUgb2YgdGhlIFRvbmUuT3NjaWxsYXRvciBhbmQgdGhlIGN1dG9mZiBmcmVxdWVuY3kgb2YgdGhlXG5cdFx0ICogICAgICAgICAgVG9uZS5GaWx0ZXIgYXJlIGNvbnRyb2xsZWQgYnkgVG9uZS5FbnZlbG9wZXMuXG5cdFx0ICogICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kcmF3aW5ncy9kLzFnYVkxREY5X0h6a29kcWY4SkkxQ2cyVlpmd1NFbHBGUWZJOTRJUXdhZDM4L3B1Yj93PTkyNCZoPTI0MFwiPlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5Nb25vcGhvbmljfVxuXHRcdCAqICBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIHRoZSBvcHRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHN5bnRoXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBkZWZhdWx0cyBiZWxvd1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBzeW50aCA9IG5ldyBUb25lLk1vbm9TeW50aCh7XG5cdFx0ICogXHRcIm9zY2lsbGF0b3JcIiA6IHtcblx0XHQgKiBcdFx0XCJ0eXBlXCIgOiBcInNxdWFyZVwiXG5cdFx0ICogIH0sXG5cdFx0ICogIFwiZW52ZWxvcGVcIiA6IHtcblx0XHQgKiAgXHRcImF0dGFja1wiIDogMC4xXG5cdFx0ICogIH1cblx0XHQgKiB9KS50b01hc3RlcigpO1xuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKFwiQzRcIiwgXCI4blwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuTW9ub1N5bnRoID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICAvL2dldCB0aGUgZGVmYXVsdHNcblx0ICAgICAgICBvcHRpb25zID0gVG9uZS5kZWZhdWx0QXJnKG9wdGlvbnMsIFRvbmUuTW9ub1N5bnRoLmRlZmF1bHRzKTtcblx0ICAgICAgICBUb25lLk1vbm9waG9uaWMuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgb3NjaWxsYXRvci5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5PbW5pT3NjaWxsYXRvcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvciA9IG5ldyBUb25lLk9tbmlPc2NpbGxhdG9yKG9wdGlvbnMub3NjaWxsYXRvcik7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGZyZXF1ZW5jeSBjb250cm9sLlxuXHRcdFx0ICogIEB0eXBlIHtGcmVxdWVuY3l9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSB0aGlzLm9zY2lsbGF0b3IuZnJlcXVlbmN5O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBkZXR1bmUgY29udHJvbC5cblx0XHRcdCAqICBAdHlwZSB7Q2VudHN9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5kZXR1bmUgPSB0aGlzLm9zY2lsbGF0b3IuZGV0dW5lO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBmaWx0ZXIuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRmlsdGVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5maWx0ZXIgPSBuZXcgVG9uZS5GaWx0ZXIob3B0aW9ucy5maWx0ZXIpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBmaWx0ZXIgZW52ZWxvcGUuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRnJlcXVlbmN5RW52ZWxvcGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZpbHRlckVudmVsb3BlID0gbmV3IFRvbmUuRnJlcXVlbmN5RW52ZWxvcGUob3B0aW9ucy5maWx0ZXJFbnZlbG9wZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGFtcGxpdHVkZSBlbnZlbG9wZS5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5BbXBsaXR1ZGVFbnZlbG9wZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUgPSBuZXcgVG9uZS5BbXBsaXR1ZGVFbnZlbG9wZShvcHRpb25zLmVudmVsb3BlKTtcblx0ICAgICAgICAvL2Nvbm5lY3QgdGhlIG9zY2lsbGF0b3JzIHRvIHRoZSBvdXRwdXRcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3IuY2hhaW4odGhpcy5maWx0ZXIsIHRoaXMuZW52ZWxvcGUsIHRoaXMub3V0cHV0KTtcblx0ICAgICAgICAvL2Nvbm5lY3QgdGhlIGZpbHRlciBlbnZlbG9wZVxuXHQgICAgICAgIHRoaXMuZmlsdGVyRW52ZWxvcGUuY29ubmVjdCh0aGlzLmZpbHRlci5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFtcblx0ICAgICAgICAgICAgJ29zY2lsbGF0b3InLFxuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RldHVuZScsXG5cdCAgICAgICAgICAgICdmaWx0ZXInLFxuXHQgICAgICAgICAgICAnZmlsdGVyRW52ZWxvcGUnLFxuXHQgICAgICAgICAgICAnZW52ZWxvcGUnXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5Nb25vU3ludGgsIFRvbmUuTW9ub3Bob25pYyk7XG5cdCAgICAvKipcblx0XHQgKiAgQGNvbnN0XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuTW9ub1N5bnRoLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICdmcmVxdWVuY3knOiAnQzQnLFxuXHQgICAgICAgICdkZXR1bmUnOiAwLFxuXHQgICAgICAgICdvc2NpbGxhdG9yJzogeyAndHlwZSc6ICdzcXVhcmUnIH0sXG5cdCAgICAgICAgJ2ZpbHRlcic6IHtcblx0ICAgICAgICAgICAgJ1EnOiA2LFxuXHQgICAgICAgICAgICAndHlwZSc6ICdsb3dwYXNzJyxcblx0ICAgICAgICAgICAgJ3JvbGxvZmYnOiAtMjRcblx0ICAgICAgICB9LFxuXHQgICAgICAgICdlbnZlbG9wZSc6IHtcblx0ICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDA1LFxuXHQgICAgICAgICAgICAnZGVjYXknOiAwLjEsXG5cdCAgICAgICAgICAgICdzdXN0YWluJzogMC45LFxuXHQgICAgICAgICAgICAncmVsZWFzZSc6IDFcblx0ICAgICAgICB9LFxuXHQgICAgICAgICdmaWx0ZXJFbnZlbG9wZSc6IHtcblx0ICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDYsXG5cdCAgICAgICAgICAgICdkZWNheSc6IDAuMixcblx0ICAgICAgICAgICAgJ3N1c3RhaW4nOiAwLjUsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJzogMixcblx0ICAgICAgICAgICAgJ2Jhc2VGcmVxdWVuY3knOiAyMDAsXG5cdCAgICAgICAgICAgICdvY3RhdmVzJzogNyxcblx0ICAgICAgICAgICAgJ2V4cG9uZW50JzogMlxuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc3RhcnQgdGhlIGF0dGFjayBwb3J0aW9uIG9mIHRoZSBlbnZlbG9wZVxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdGhlIGF0dGFjayBzaG91bGQgc3RhcnRcblx0XHQgKiAgQHBhcmFtIHtOb3JtYWxSYW5nZX0gW3ZlbG9jaXR5PTFdIHRoZSB2ZWxvY2l0eSBvZiB0aGUgbm90ZSAoMC0xKVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Nb25vU3ludGh9IHRoaXNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuTW9ub1N5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlQXR0YWNrID0gZnVuY3Rpb24gKHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIC8vdGhlIGVudmVsb3Blc1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUudHJpZ2dlckF0dGFjayh0aW1lLCB2ZWxvY2l0eSk7XG5cdCAgICAgICAgdGhpcy5maWx0ZXJFbnZlbG9wZS50cmlnZ2VyQXR0YWNrKHRpbWUpO1xuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvci5zdGFydCh0aW1lKTtcblx0ICAgICAgICBpZiAodGhpcy5lbnZlbG9wZS5zdXN0YWluID09PSAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMub3NjaWxsYXRvci5zdG9wKHRpbWUgKyB0aGlzLmVudmVsb3BlLmF0dGFjayArIHRoaXMuZW52ZWxvcGUuZGVjYXkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc3RhcnQgdGhlIHJlbGVhc2UgcG9ydGlvbiBvZiB0aGUgZW52ZWxvcGVcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIHRoZSB0aW1lIHRoZSByZWxlYXNlIHNob3VsZCBzdGFydFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Nb25vU3ludGh9IHRoaXNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuTW9ub1N5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5lbnZlbG9wZS50cmlnZ2VyUmVsZWFzZSh0aW1lKTtcblx0ICAgICAgICB0aGlzLmZpbHRlckVudmVsb3BlLnRyaWdnZXJSZWxlYXNlKHRpbWUpO1xuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvci5zdG9wKHRpbWUgKyB0aGlzLmVudmVsb3BlLnJlbGVhc2UpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Nb25vU3ludGh9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTW9ub1N5bnRoLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuTW9ub3Bob25pYy5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX3dyaXRhYmxlKFtcblx0ICAgICAgICAgICAgJ29zY2lsbGF0b3InLFxuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2RldHVuZScsXG5cdCAgICAgICAgICAgICdmaWx0ZXInLFxuXHQgICAgICAgICAgICAnZmlsdGVyRW52ZWxvcGUnLFxuXHQgICAgICAgICAgICAnZW52ZWxvcGUnXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgdGhpcy5vc2NpbGxhdG9yLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZmlsdGVyRW52ZWxvcGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZmlsdGVyRW52ZWxvcGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZmlsdGVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmZpbHRlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5Nb25vU3ludGg7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgVG9uZS5EdW9TeW50aCBpcyBhIG1vbm9waG9uaWMgc3ludGggY29tcG9zZWQgb2YgdHdvXG5cdFx0ICogICAgICAgICAgTW9ub1N5bnRocyBydW4gaW4gcGFyYWxsZWwgd2l0aCBjb250cm9sIG92ZXIgdGhlXG5cdFx0ICogICAgICAgICAgZnJlcXVlbmN5IHJhdGlvIGJldHdlZW4gdGhlIHR3byB2b2ljZXMgYW5kIHZpYnJhdG8gZWZmZWN0LlxuXHRcdCAqICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZHJhd2luZ3MvZC8xYkw0R1h2ZlJNTWxxUzdYeUJtOUNqTDlLSlBTVUtiY2RCTnBxT2xrRkx4ay9wdWI/dz0xMDEyJmg9NDQ4XCI+XG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLk1vbm9waG9uaWN9XG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgc3ludGhcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGRlZmF1bHRzIGJlbG93XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIGR1b1N5bnRoID0gbmV3IFRvbmUuRHVvU3ludGgoKS50b01hc3RlcigpO1xuXHRcdCAqIGR1b1N5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKFwiQzRcIiwgXCIyblwiKTtcblx0XHQgKi9cblx0ICAgIFRvbmUuRHVvU3ludGggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5EdW9TeW50aC5kZWZhdWx0cyk7XG5cdCAgICAgICAgVG9uZS5Nb25vcGhvbmljLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIGZpcnN0IHZvaWNlXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTW9ub1N5bnRofVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy52b2ljZTAgPSBuZXcgVG9uZS5Nb25vU3ludGgob3B0aW9ucy52b2ljZTApO1xuXHQgICAgICAgIHRoaXMudm9pY2UwLnZvbHVtZS52YWx1ZSA9IC0xMDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgc2Vjb25kIHZvaWNlXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTW9ub1N5bnRofVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy52b2ljZTEgPSBuZXcgVG9uZS5Nb25vU3ludGgob3B0aW9ucy52b2ljZTEpO1xuXHQgICAgICAgIHRoaXMudm9pY2UxLnZvbHVtZS52YWx1ZSA9IC0xMDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgdmlicmF0byBMRk8uXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTEZPfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl92aWJyYXRvID0gbmV3IFRvbmUuTEZPKG9wdGlvbnMudmlicmF0b1JhdGUsIC01MCwgNTApO1xuXHQgICAgICAgIHRoaXMuX3ZpYnJhdG8uc3RhcnQoKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIHRoZSB2aWJyYXRvIGZyZXF1ZW5jeVxuXHRcdFx0ICogQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMudmlicmF0b1JhdGUgPSB0aGlzLl92aWJyYXRvLmZyZXF1ZW5jeTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgdmlicmF0byBnYWluXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuR2Fpbn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdmlicmF0b0dhaW4gPSBuZXcgVG9uZS5HYWluKG9wdGlvbnMudmlicmF0b0Ftb3VudCwgVG9uZS5UeXBlLlBvc2l0aXZlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBhbW91bnQgb2YgdmlicmF0b1xuXHRcdFx0ICogQHR5cGUge1Bvc2l0aXZlfVxuXHRcdFx0ICogQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy52aWJyYXRvQW1vdW50ID0gdGhpcy5fdmlicmF0b0dhaW4uZ2Fpbjtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgZnJlcXVlbmN5IGNvbnRyb2xcblx0XHRcdCAqICBAdHlwZSB7RnJlcXVlbmN5fVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbmV3IFRvbmUuU2lnbmFsKDQ0MCwgVG9uZS5UeXBlLkZyZXF1ZW5jeSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgSGFybW9uaWNpdHkgaXMgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHR3byB2b2ljZXMuIEEgaGFybW9uaWNpdHkgb2Zcblx0XHRcdCAqICAxIGlzIG5vIGNoYW5nZS4gSGFybW9uaWNpdHkgPSAyIG1lYW5zIGEgY2hhbmdlIG9mIGFuIG9jdGF2ZS5cblx0XHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICogIEBleGFtcGxlXG5cdFx0XHQgKiAvL3BpdGNoIHZvaWNlMSBhbiBvY3RhdmUgYmVsb3cgdm9pY2UwXG5cdFx0XHQgKiBkdW9TeW50aC5oYXJtb25pY2l0eS52YWx1ZSA9IDAuNTtcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuaGFybW9uaWNpdHkgPSBuZXcgVG9uZS5NdWx0aXBseShvcHRpb25zLmhhcm1vbmljaXR5KTtcblx0ICAgICAgICB0aGlzLmhhcm1vbmljaXR5LnVuaXRzID0gVG9uZS5UeXBlLlBvc2l0aXZlO1xuXHQgICAgICAgIC8vY29udHJvbCB0aGUgdHdvIHZvaWNlcyBmcmVxdWVuY3lcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeS5jb25uZWN0KHRoaXMudm9pY2UwLmZyZXF1ZW5jeSk7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kuY2hhaW4odGhpcy5oYXJtb25pY2l0eSwgdGhpcy52b2ljZTEuZnJlcXVlbmN5KTtcblx0ICAgICAgICB0aGlzLl92aWJyYXRvLmNvbm5lY3QodGhpcy5fdmlicmF0b0dhaW4pO1xuXHQgICAgICAgIHRoaXMuX3ZpYnJhdG9HYWluLmZhbih0aGlzLnZvaWNlMC5kZXR1bmUsIHRoaXMudm9pY2UxLmRldHVuZSk7XG5cdCAgICAgICAgdGhpcy52b2ljZTAuY29ubmVjdCh0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy52b2ljZTEuY29ubmVjdCh0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAndm9pY2UwJyxcblx0ICAgICAgICAgICAgJ3ZvaWNlMScsXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAndmlicmF0b0Ftb3VudCcsXG5cdCAgICAgICAgICAgICd2aWJyYXRvUmF0ZSdcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkR1b1N5bnRoLCBUb25lLk1vbm9waG9uaWMpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuRHVvU3ludGguZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3ZpYnJhdG9BbW91bnQnOiAwLjUsXG5cdCAgICAgICAgJ3ZpYnJhdG9SYXRlJzogNSxcblx0ICAgICAgICAnaGFybW9uaWNpdHknOiAxLjUsXG5cdCAgICAgICAgJ3ZvaWNlMCc6IHtcblx0ICAgICAgICAgICAgJ3ZvbHVtZSc6IC0xMCxcblx0ICAgICAgICAgICAgJ3BvcnRhbWVudG8nOiAwLFxuXHQgICAgICAgICAgICAnb3NjaWxsYXRvcic6IHsgJ3R5cGUnOiAnc2luZScgfSxcblx0ICAgICAgICAgICAgJ2ZpbHRlckVudmVsb3BlJzoge1xuXHQgICAgICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDEsXG5cdCAgICAgICAgICAgICAgICAnZGVjYXknOiAwLFxuXHQgICAgICAgICAgICAgICAgJ3N1c3RhaW4nOiAxLFxuXHQgICAgICAgICAgICAgICAgJ3JlbGVhc2UnOiAwLjVcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgJ2VudmVsb3BlJzoge1xuXHQgICAgICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDEsXG5cdCAgICAgICAgICAgICAgICAnZGVjYXknOiAwLFxuXHQgICAgICAgICAgICAgICAgJ3N1c3RhaW4nOiAxLFxuXHQgICAgICAgICAgICAgICAgJ3JlbGVhc2UnOiAwLjVcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgJ3ZvaWNlMSc6IHtcblx0ICAgICAgICAgICAgJ3ZvbHVtZSc6IC0xMCxcblx0ICAgICAgICAgICAgJ3BvcnRhbWVudG8nOiAwLFxuXHQgICAgICAgICAgICAnb3NjaWxsYXRvcic6IHsgJ3R5cGUnOiAnc2luZScgfSxcblx0ICAgICAgICAgICAgJ2ZpbHRlckVudmVsb3BlJzoge1xuXHQgICAgICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDEsXG5cdCAgICAgICAgICAgICAgICAnZGVjYXknOiAwLFxuXHQgICAgICAgICAgICAgICAgJ3N1c3RhaW4nOiAxLFxuXHQgICAgICAgICAgICAgICAgJ3JlbGVhc2UnOiAwLjVcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgJ2VudmVsb3BlJzoge1xuXHQgICAgICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDEsXG5cdCAgICAgICAgICAgICAgICAnZGVjYXknOiAwLFxuXHQgICAgICAgICAgICAgICAgJ3N1c3RhaW4nOiAxLFxuXHQgICAgICAgICAgICAgICAgJ3JlbGVhc2UnOiAwLjVcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc3RhcnQgdGhlIGF0dGFjayBwb3J0aW9uIG9mIHRoZSBlbnZlbG9wZXNcblx0XHQgKlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdGhlIGF0dGFjayBzaG91bGQgc3RhcnRcblx0XHQgKiAgQHBhcmFtIHtOb3JtYWxSYW5nZX0gW3ZlbG9jaXR5PTFdIHRoZSB2ZWxvY2l0eSBvZiB0aGUgbm90ZSAoMC0xKVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5EdW9TeW50aH0gdGhpc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5EdW9TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayA9IGZ1bmN0aW9uICh0aW1lLCB2ZWxvY2l0eSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB0aGlzLnZvaWNlMC5fdHJpZ2dlckVudmVsb3BlQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICB0aGlzLnZvaWNlMS5fdHJpZ2dlckVudmVsb3BlQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgc3RhcnQgdGhlIHJlbGVhc2UgcG9ydGlvbiBvZiB0aGUgZW52ZWxvcGVzXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIHRoZSB0aW1lIHRoZSByZWxlYXNlIHNob3VsZCBzdGFydFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5EdW9TeW50aH0gdGhpc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5EdW9TeW50aC5wcm90b3R5cGUuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRoaXMudm9pY2UwLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHRpbWUpO1xuXHQgICAgICAgIHRoaXMudm9pY2UxLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBHZXQgdGhlIGxldmVsIG9mIHRoZSBvdXRwdXQgYXQgdGhlIGdpdmVuIHRpbWUuIE1lYXN1cmVzXG5cdFx0ICogIHRoZSBlbnZlbG9wZShzKSB2YWx1ZSBhdCB0aGUgdGltZS4gXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gdGltZSBUaGUgdGltZSB0byBxdWVyeSB0aGUgZW52ZWxvcGUgdmFsdWVcblx0XHQgKiAgQHJldHVybiB7Tm9ybWFsUmFuZ2V9IFRoZSBvdXRwdXQgbGV2ZWwgYmV0d2VlbiAwLTFcblx0XHQgKi9cblx0ICAgIFRvbmUuRHVvU3ludGgucHJvdG90eXBlLmdldExldmVsQXRUaW1lID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICByZXR1cm4gKHRoaXMudm9pY2UwLmdldExldmVsQXRUaW1lKHRpbWUpICsgdGhpcy52b2ljZTEuZ2V0TGV2ZWxBdFRpbWUodGltZSkpIC8gMjtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRHVvU3ludGh9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuRHVvU3ludGgucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5Nb25vcGhvbmljLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAndm9pY2UwJyxcblx0ICAgICAgICAgICAgJ3ZvaWNlMScsXG5cdCAgICAgICAgICAgICdmcmVxdWVuY3knLFxuXHQgICAgICAgICAgICAndmlicmF0b0Ftb3VudCcsXG5cdCAgICAgICAgICAgICd2aWJyYXRvUmF0ZSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLnZvaWNlMC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy52b2ljZTAgPSBudWxsO1xuXHQgICAgICAgIHRoaXMudm9pY2UxLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLnZvaWNlMSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl92aWJyYXRvR2Fpbi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fdmlicmF0b0dhaW4gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3ZpYnJhdG8gPSBudWxsO1xuXHQgICAgICAgIHRoaXMuaGFybW9uaWNpdHkuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuaGFybW9uaWNpdHkgPSBudWxsO1xuXHQgICAgICAgIHRoaXMudmlicmF0b0Ftb3VudC5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy52aWJyYXRvQW1vdW50ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnZpYnJhdG9SYXRlID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5EdW9TeW50aDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBGTVN5bnRoIGlzIGNvbXBvc2VkIG9mIHR3byBUb25lLlN5bnRocyB3aGVyZSBvbmUgVG9uZS5TeW50aCBtb2R1bGF0ZXNcblx0XHQgKiAgICAgICAgICB0aGUgZnJlcXVlbmN5IG9mIGEgc2Vjb25kIFRvbmUuU3ludGguIEEgbG90IG9mIHNwZWN0cmFsIGNvbnRlbnRcblx0XHQgKiAgICAgICAgICBjYW4gYmUgZXhwbG9yZWQgdXNpbmcgdGhlIG1vZHVsYXRpb25JbmRleCBwYXJhbWV0ZXIuIFJlYWQgbW9yZSBhYm91dFxuXHRcdCAqICAgICAgICAgIGZyZXF1ZW5jeSBtb2R1bGF0aW9uIHN5bnRoZXNpcyBvbiBTb3VuZCBPbiBTb3VuZDogW1BhcnQgMV0oaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDAzMTIzNzA0L2h0dHA6Ly93d3cuc291bmRvbnNvdW5kLmNvbS9zb3MvYXByMDAvYXJ0aWNsZXMvc3ludGhzZWNyZXRzLmh0bSksIFtQYXJ0IDJdKGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwMzExNTgzNS9odHRwOi8vd3d3LnNvdW5kb25zb3VuZC5jb20vc29zL21heTAwL2FydGljbGVzL3N5bnRoLmh0bSkuXG5cdFx0ICogICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kcmF3aW5ncy9kLzFoMFBVRFpYUGdpNElreDZiVlQ2b25jcllQTGx1Rkt5N2xqNTNwdXhqLURNL3B1Yj93PTkwMiZoPTQ2MlwiPlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5Nb25vcGhvbmljfVxuXHRcdCAqICBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIHRoZSBvcHRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHN5bnRoXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBkZWZhdWx0cyBiZWxvd1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBmbVN5bnRoID0gbmV3IFRvbmUuRk1TeW50aCgpLnRvTWFzdGVyKCk7XG5cdFx0ICogZm1TeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZShcIkM1XCIsIFwiNG5cIik7XG5cdFx0ICovXG5cdCAgICBUb25lLkZNU3ludGggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5GTVN5bnRoLmRlZmF1bHRzKTtcblx0ICAgICAgICBUb25lLk1vbm9waG9uaWMuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY2FycmllciB2b2ljZS5cblx0XHRcdCAqICBAdHlwZSB7VG9uZS5TeW50aH1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fY2FycmllciA9IG5ldyBUb25lLlN5bnRoKG9wdGlvbnMuY2Fycmllcik7XG5cdCAgICAgICAgdGhpcy5fY2Fycmllci52b2x1bWUudmFsdWUgPSAtMTA7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGNhcnJpZXIncyBvc2NpbGxhdG9yXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuT3NjaWxsYXRvcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvciA9IHRoaXMuX2NhcnJpZXIub3NjaWxsYXRvcjtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgY2FycmllcidzIGVudmVsb3BlXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuT3NjaWxsYXRvcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUgPSB0aGlzLl9jYXJyaWVyLmVudmVsb3BlLnNldChvcHRpb25zLmVudmVsb3BlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbW9kdWxhdG9yIHZvaWNlLlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLlN5bnRofVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IgPSBuZXcgVG9uZS5TeW50aChvcHRpb25zLm1vZHVsYXRvcik7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLnZvbHVtZS52YWx1ZSA9IC0xMDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbW9kdWxhdG9yJ3Mgb3NjaWxsYXRvciB3aGljaCBpcyBhcHBsaWVkXG5cdFx0XHQgKiAgdG8gdGhlIGFtcGxpdHVkZSBvZiB0aGUgb3NjaWxsYXRvclxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk9zY2lsbGF0b3J9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb24gPSB0aGlzLl9tb2R1bGF0b3Iub3NjaWxsYXRvci5zZXQob3B0aW9ucy5tb2R1bGF0aW9uKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbW9kdWxhdG9yJ3MgZW52ZWxvcGVcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5Pc2NpbGxhdG9yfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5tb2R1bGF0aW9uRW52ZWxvcGUgPSB0aGlzLl9tb2R1bGF0b3IuZW52ZWxvcGUuc2V0KG9wdGlvbnMubW9kdWxhdGlvbkVudmVsb3BlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZnJlcXVlbmN5IGNvbnRyb2wuXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG5ldyBUb25lLlNpZ25hbCg0NDAsIFRvbmUuVHlwZS5GcmVxdWVuY3kpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBkZXR1bmUgaW4gY2VudHNcblx0XHRcdCAqICBAdHlwZSB7Q2VudHN9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5kZXR1bmUgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5kZXR1bmUsIFRvbmUuVHlwZS5DZW50cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgSGFybW9uaWNpdHkgaXMgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHR3byB2b2ljZXMuIEEgaGFybW9uaWNpdHkgb2Zcblx0XHRcdCAqICAxIGlzIG5vIGNoYW5nZS4gSGFybW9uaWNpdHkgPSAyIG1lYW5zIGEgY2hhbmdlIG9mIGFuIG9jdGF2ZS5cblx0XHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICogIEBleGFtcGxlXG5cdFx0XHQgKiAvL3BpdGNoIHZvaWNlMSBhbiBvY3RhdmUgYmVsb3cgdm9pY2UwXG5cdFx0XHQgKiBzeW50aC5oYXJtb25pY2l0eS52YWx1ZSA9IDAuNTtcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuaGFybW9uaWNpdHkgPSBuZXcgVG9uZS5NdWx0aXBseShvcHRpb25zLmhhcm1vbmljaXR5KTtcblx0ICAgICAgICB0aGlzLmhhcm1vbmljaXR5LnVuaXRzID0gVG9uZS5UeXBlLlBvc2l0aXZlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtb2R1bGF0aW9uIGluZGV4IHdoaWNoIGVzc2VudGlhbGx5IHRoZSBkZXB0aCBvciBhbW91bnQgb2YgdGhlIG1vZHVsYXRpb24uIEl0IGlzIHRoZVxuXHRcdFx0ICogIHJhdGlvIG9mIHRoZSBmcmVxdWVuY3kgb2YgdGhlIG1vZHVsYXRpbmcgc2lnbmFsIChtZikgdG8gdGhlIGFtcGxpdHVkZSBvZiB0aGVcblx0XHRcdCAqICBtb2R1bGF0aW5nIHNpZ25hbCAobWEpIC0tIGFzIGluIG1hL21mLlxuXHRcdFx0ICpcdEB0eXBlIHtQb3NpdGl2ZX1cblx0XHRcdCAqXHRAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb25JbmRleCA9IG5ldyBUb25lLk11bHRpcGx5KG9wdGlvbnMubW9kdWxhdGlvbkluZGV4KTtcblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb25JbmRleC51bml0cyA9IFRvbmUuVHlwZS5Qb3NpdGl2ZTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbm9kZSB3aGVyZSB0aGUgbW9kdWxhdGlvbiBoYXBwZW5zXG5cdFx0XHQgKiAgQHR5cGUge0dhaW5Ob2RlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9tb2R1bGF0aW9uTm9kZSA9IG5ldyBUb25lLkdhaW4oMCk7XG5cdCAgICAgICAgLy9jb250cm9sIHRoZSB0d28gdm9pY2VzIGZyZXF1ZW5jeVxuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmNvbm5lY3QodGhpcy5fY2Fycmllci5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMuaGFybW9uaWNpdHksIHRoaXMuX21vZHVsYXRvci5mcmVxdWVuY3kpO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmNoYWluKHRoaXMubW9kdWxhdGlvbkluZGV4LCB0aGlzLl9tb2R1bGF0aW9uTm9kZSk7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUuZmFuKHRoaXMuX2NhcnJpZXIuZGV0dW5lLCB0aGlzLl9tb2R1bGF0b3IuZGV0dW5lKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuY29ubmVjdCh0aGlzLl9tb2R1bGF0aW9uTm9kZS5nYWluKTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0aW9uTm9kZS5jb25uZWN0KHRoaXMuX2NhcnJpZXIuZnJlcXVlbmN5KTtcblx0ICAgICAgICB0aGlzLl9jYXJyaWVyLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KFtcblx0ICAgICAgICAgICAgJ2ZyZXF1ZW5jeScsXG5cdCAgICAgICAgICAgICdoYXJtb25pY2l0eScsXG5cdCAgICAgICAgICAgICdtb2R1bGF0aW9uSW5kZXgnLFxuXHQgICAgICAgICAgICAnb3NjaWxsYXRvcicsXG5cdCAgICAgICAgICAgICdlbnZlbG9wZScsXG5cdCAgICAgICAgICAgICdtb2R1bGF0aW9uJyxcblx0ICAgICAgICAgICAgJ21vZHVsYXRpb25FbnZlbG9wZScsXG5cdCAgICAgICAgICAgICdkZXR1bmUnXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5GTVN5bnRoLCBUb25lLk1vbm9waG9uaWMpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuRk1TeW50aC5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnaGFybW9uaWNpdHknOiAzLFxuXHQgICAgICAgICdtb2R1bGF0aW9uSW5kZXgnOiAxMCxcblx0ICAgICAgICAnZGV0dW5lJzogMCxcblx0ICAgICAgICAnb3NjaWxsYXRvcic6IHsgJ3R5cGUnOiAnc2luZScgfSxcblx0ICAgICAgICAnZW52ZWxvcGUnOiB7XG5cdCAgICAgICAgICAgICdhdHRhY2snOiAwLjAxLFxuXHQgICAgICAgICAgICAnZGVjYXknOiAwLjAxLFxuXHQgICAgICAgICAgICAnc3VzdGFpbic6IDEsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJzogMC41XG5cdCAgICAgICAgfSxcblx0ICAgICAgICAnbW9kdWxhdGlvbic6IHsgJ3R5cGUnOiAnc3F1YXJlJyB9LFxuXHQgICAgICAgICdtb2R1bGF0aW9uRW52ZWxvcGUnOiB7XG5cdCAgICAgICAgICAgICdhdHRhY2snOiAwLjUsXG5cdCAgICAgICAgICAgICdkZWNheSc6IDAsXG5cdCAgICAgICAgICAgICdzdXN0YWluJzogMSxcblx0ICAgICAgICAgICAgJ3JlbGVhc2UnOiAwLjVcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogXHR0cmlnZ2VyIHRoZSBhdHRhY2sgcG9ydGlvbiBvZiB0aGUgbm90ZVxuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdGhlIG5vdGUgd2lsbCBvY2N1clxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gW3ZlbG9jaXR5PTFdIHRoZSB2ZWxvY2l0eSBvZiB0aGUgbm90ZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5GTVN5bnRofSB0aGlzXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkZNU3ludGgucHJvdG90eXBlLl90cmlnZ2VyRW52ZWxvcGVBdHRhY2sgPSBmdW5jdGlvbiAodGltZSwgdmVsb2NpdHkpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgLy90aGUgZW52ZWxvcGVzXG5cdCAgICAgICAgdGhpcy5fY2Fycmllci5fdHJpZ2dlckVudmVsb3BlQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuX3RyaWdnZXJFbnZlbG9wZUF0dGFjayh0aW1lKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgdHJpZ2dlciB0aGUgcmVsZWFzZSBwb3J0aW9uIG9mIHRoZSBub3RlXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XSB0aGUgdGltZSB0aGUgbm90ZSB3aWxsIHJlbGVhc2Vcblx0XHQgKiAgQHJldHVybnMge1RvbmUuRk1TeW50aH0gdGhpc1xuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5GTVN5bnRoLnByb3RvdHlwZS5fdHJpZ2dlckVudmVsb3BlUmVsZWFzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2NhcnJpZXIuX3RyaWdnZXJFbnZlbG9wZVJlbGVhc2UodGltZSk7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdG9yLl90cmlnZ2VyRW52ZWxvcGVSZWxlYXNlKHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBjbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5GTVN5bnRofSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkZNU3ludGgucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5Nb25vcGhvbmljLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoW1xuXHQgICAgICAgICAgICAnZnJlcXVlbmN5Jyxcblx0ICAgICAgICAgICAgJ2hhcm1vbmljaXR5Jyxcblx0ICAgICAgICAgICAgJ21vZHVsYXRpb25JbmRleCcsXG5cdCAgICAgICAgICAgICdvc2NpbGxhdG9yJyxcblx0ICAgICAgICAgICAgJ2VudmVsb3BlJyxcblx0ICAgICAgICAgICAgJ21vZHVsYXRpb24nLFxuXHQgICAgICAgICAgICAnbW9kdWxhdGlvbkVudmVsb3BlJyxcblx0ICAgICAgICAgICAgJ2RldHVuZSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLl9jYXJyaWVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9jYXJyaWVyID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9tb2R1bGF0b3IuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRvciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5ID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmRldHVuZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5kZXR1bmUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMubW9kdWxhdGlvbkluZGV4LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb25JbmRleCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5oYXJtb25pY2l0eS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5oYXJtb25pY2l0eSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fbW9kdWxhdGlvbk5vZGUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX21vZHVsYXRpb25Ob2RlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3IgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUgPSBudWxsO1xuXHQgICAgICAgIHRoaXMubW9kdWxhdGlvbkVudmVsb3BlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm1vZHVsYXRpb24gPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkZNU3ludGg7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgVG9uZS5NZW1icmFuZVN5bnRoIG1ha2VzIGtpY2sgYW5kIHRvbSBzb3VuZHMgdXNpbmcgYSBzaW5nbGUgb3NjaWxsYXRvclxuXHRcdCAqICAgICAgICAgIHdpdGggYW4gYW1wbGl0dWRlIGVudmVsb3BlIGFuZCBmcmVxdWVuY3kgcmFtcC4gQSBUb25lLk9tbmlPc2NpbGxhdG9yXG5cdFx0ICogICAgICAgICAgaXMgcm91dGVkIHRocm91Z2ggYSBUb25lLkFtcGxpdHVkZUVudmVsb3BlIHRvIHRoZSBvdXRwdXQuIFRoZSBkcnVtXG5cdFx0ICogICAgICAgICAgcXVhbGl0eSBvZiB0aGUgc291bmQgY29tZXMgZnJvbSB0aGUgZnJlcXVlbmN5IGVudmVsb3BlIGFwcGxpZWRcblx0XHQgKiAgICAgICAgICBkdXJpbmcgVG9uZS5NZW1icmFuZVN5bnRoLnRyaWdnZXJBdHRhY2sobm90ZSkuIFRoZSBmcmVxdWVuY3kgZW52ZWxvcGVcblx0XHQgKiAgICAgICAgICBzdGFydHMgYXQgPGNvZGU+bm90ZSAqIC5vY3RhdmVzPC9jb2RlPiBhbmQgcmFtcHMgdG8gPGNvZGU+bm90ZTwvY29kZT5cblx0XHQgKiAgICAgICAgICBvdmVyIHRoZSBkdXJhdGlvbiBvZiA8Y29kZT4ucGl0Y2hEZWNheTwvY29kZT4uXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkluc3RydW1lbnR9XG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgc3ludGhcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGRlZmF1bHRzIGJlbG93XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIHN5bnRoID0gbmV3IFRvbmUuTWVtYnJhbmVTeW50aCgpLnRvTWFzdGVyKCk7XG5cdFx0ICogc3ludGgudHJpZ2dlckF0dGFja1JlbGVhc2UoXCJDMlwiLCBcIjhuXCIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NZW1icmFuZVN5bnRoID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICBvcHRpb25zID0gVG9uZS5kZWZhdWx0QXJnKG9wdGlvbnMsIFRvbmUuTWVtYnJhbmVTeW50aC5kZWZhdWx0cyk7XG5cdCAgICAgICAgVG9uZS5JbnN0cnVtZW50LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG9zY2lsbGF0b3IuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuT21uaU9zY2lsbGF0b3J9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3IgPSBuZXcgVG9uZS5PbW5pT3NjaWxsYXRvcihvcHRpb25zLm9zY2lsbGF0b3IpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhbXBsaXR1ZGUgZW52ZWxvcGUuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuQW1wbGl0dWRlRW52ZWxvcGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmVudmVsb3BlID0gbmV3IFRvbmUuQW1wbGl0dWRlRW52ZWxvcGUob3B0aW9ucy5lbnZlbG9wZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG51bWJlciBvZiBvY3RhdmVzIHRoZSBwaXRjaCBlbnZlbG9wZSByYW1wcy5cblx0XHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLm9jdGF2ZXMgPSBvcHRpb25zLm9jdGF2ZXM7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGFtb3VudCBvZiB0aW1lIHRoZSBmcmVxdWVuY3kgZW52ZWxvcGUgdGFrZXMuXG5cdFx0XHQgKiAgQHR5cGUge1RpbWV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLnBpdGNoRGVjYXkgPSBvcHRpb25zLnBpdGNoRGVjYXk7XG5cdCAgICAgICAgdGhpcy5vc2NpbGxhdG9yLmNoYWluKHRoaXMuZW52ZWxvcGUsIHRoaXMub3V0cHV0KTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seShbXG5cdCAgICAgICAgICAgICdvc2NpbGxhdG9yJyxcblx0ICAgICAgICAgICAgJ2VudmVsb3BlJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuTWVtYnJhbmVTeW50aCwgVG9uZS5JbnN0cnVtZW50KTtcblx0ICAgIC8qKlxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLk1lbWJyYW5lU3ludGguZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3BpdGNoRGVjYXknOiAwLjA1LFxuXHQgICAgICAgICdvY3RhdmVzJzogMTAsXG5cdCAgICAgICAgJ29zY2lsbGF0b3InOiB7ICd0eXBlJzogJ3NpbmUnIH0sXG5cdCAgICAgICAgJ2VudmVsb3BlJzoge1xuXHQgICAgICAgICAgICAnYXR0YWNrJzogMC4wMDEsXG5cdCAgICAgICAgICAgICdkZWNheSc6IDAuNCxcblx0ICAgICAgICAgICAgJ3N1c3RhaW4nOiAwLjAxLFxuXHQgICAgICAgICAgICAncmVsZWFzZSc6IDEuNCxcblx0ICAgICAgICAgICAgJ2F0dGFja0N1cnZlJzogJ2V4cG9uZW50aWFsJ1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVHJpZ2dlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gdGltZSB3aXRoIHRoZSBnaXZlbiB2ZWxvY2l0eS5cblx0XHQgKlxuXHRcdCAqICBAcGFyYW0gIHtGcmVxdWVuY3l9IG5vdGUgICAgIHRoZSBub3RlXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd10gICAgIHRoZSB0aW1lLCBpZiBub3QgZ2l2ZW4gaXMgbm93XG5cdFx0ICogIEBwYXJhbSAge251bWJlcn0gW3ZlbG9jaXR5PTFdIHZlbG9jaXR5IGRlZmF1bHRzIHRvIDFcblx0XHQgKiAgQHJldHVybnMge1RvbmUuTWVtYnJhbmVTeW50aH0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqICBraWNrLnRyaWdnZXJBdHRhY2soNjApO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NZW1icmFuZVN5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrID0gZnVuY3Rpb24gKG5vdGUsIHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIG5vdGUgPSB0aGlzLnRvRnJlcXVlbmN5KG5vdGUpO1xuXHQgICAgICAgIHZhciBtYXhOb3RlID0gbm90ZSAqIHRoaXMub2N0YXZlcztcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3IuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKG1heE5vdGUsIHRpbWUpO1xuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvci5mcmVxdWVuY3kuZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZShub3RlLCB0aW1lICsgdGhpcy50b1NlY29uZHModGhpcy5waXRjaERlY2F5KSk7XG5cdCAgICAgICAgdGhpcy5lbnZlbG9wZS50cmlnZ2VyQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3Iuc3RhcnQodGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRyaWdnZXIgdGhlIHJlbGVhc2UgcG9ydGlvbiBvZiB0aGUgbm90ZS5cblx0XHQgKlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbdGltZT1ub3ddIHRoZSB0aW1lIHRoZSBub3RlIHdpbGwgcmVsZWFzZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5NZW1icmFuZVN5bnRofSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk1lbWJyYW5lU3ludGgucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy5lbnZlbG9wZS50cmlnZ2VyUmVsZWFzZSh0aW1lKTtcblx0ICAgICAgICB0aGlzLm9zY2lsbGF0b3Iuc3RvcCh0aW1lICsgdGhpcy5lbnZlbG9wZS5yZWxlYXNlKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk1lbWJyYW5lU3ludGh9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTWVtYnJhbmVTeW50aC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkluc3RydW1lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdvc2NpbGxhdG9yJyxcblx0ICAgICAgICAgICAgJ2VudmVsb3BlJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMub3NjaWxsYXRvci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5vc2NpbGxhdG9yID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5NZW1icmFuZVN5bnRoO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvKipcblx0XHQgKiAgSW5oYXJtb25pYyByYXRpbyBvZiBmcmVxdWVuY2llcyBiYXNlZCBvbiB0aGUgUm9sYW5kIFRSLTgwOFxuXHRcdCAqICBUYWtlbiBmcm9tIGh0dHBzOi8vY2NybWEuc3RhbmZvcmQuZWR1L3BhcGVycy90ci04MDgtY3ltYmFsLXBoeXNpY2FsbHktaW5mb3JtZWQtY2lyY3VpdC1iZW5kYWJsZS1kaWdpdGFsLW1vZGVsXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdCAqL1xuXHQgICAgdmFyIGluaGFybVJhdGlvcyA9IFtcblx0ICAgICAgICAxLFxuXHQgICAgICAgIDEuNDgzLFxuXHQgICAgICAgIDEuOTMyLFxuXHQgICAgICAgIDIuNTQ2LFxuXHQgICAgICAgIDIuNjMsXG5cdCAgICAgICAgMy44OTdcblx0ICAgIF07XG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBBIGhpZ2hseSBpbmhhcm1vbmljIGFuZCBzcGVjdHJhbGx5IGNvbXBsZXggc291cmNlIHdpdGggYSBoaWdocGFzcyBmaWx0ZXJcblx0XHQgKiAgICAgICAgICBhbmQgYW1wbGl0dWRlIGVudmVsb3BlIHdoaWNoIGlzIGdvb2QgZm9yIG1ha2luZyBtZXRhbG9waG9uZSBzb3VuZHMuIEJhc2VkXG5cdFx0ICogICAgICAgICAgb24gQ3ltYmFsU3ludGggYnkgW0Bwb2x5cmh5dGhtYXRpY10oaHR0cHM6Ly9naXRodWIuY29tL3BvbHlyaHl0aG1hdGljKS5cblx0XHQgKiAgICAgICAgICBJbnNwaXJhdGlvbiBmcm9tIFtTb3VuZCBvbiBTb3VuZF0oaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNjEwMTQzOTI0L2h0dHBzOi8vd3d3LnNvdW5kb25zb3VuZC5jb20vc29zL2p1bDAyL2FydGljbGVzL3N5bnRoc2VjcmV0czA3MDIuYXNwKS5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuSW5zdHJ1bWVudH1cblx0XHQgKiAgQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBhdmFpbGJsZSBmb3IgdGhlIHN5bnRoXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBkZWZhdWx0cyBiZWxvd1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NZXRhbFN5bnRoID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICBvcHRpb25zID0gVG9uZS5kZWZhdWx0QXJnKG9wdGlvbnMsIFRvbmUuTWV0YWxTeW50aC5kZWZhdWx0cyk7XG5cdCAgICAgICAgVG9uZS5JbnN0cnVtZW50LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGZyZXF1ZW5jeSBvZiB0aGUgY3ltYmFsXG5cdFx0XHQgKiAgQHR5cGUgIHtGcmVxdWVuY3l9XG5cdFx0XHQgKiAgQHNpZ25hbFxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5mcmVxdWVuY3kgPSBuZXcgVG9uZS5TaWduYWwob3B0aW9ucy5mcmVxdWVuY3ksIFRvbmUuVHlwZS5GcmVxdWVuY3kpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhcnJheSBvZiBGTU9zY2lsbGF0b3JzXG5cdFx0XHQgKiAgQHR5cGUgIHtBcnJheX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvcnMgPSBbXTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZnJlcXVlbmN5IG11bHRpcGxpZXJzXG5cdFx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mcmVxTXVsdGlwbGllcnMgPSBbXTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW1wbGl0dWRlIGZvciB0aGUgYm9keVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkdhaW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2FtcGxpdHVlID0gbmV3IFRvbmUuR2FpbigwKS5jb25uZWN0KHRoaXMub3V0cHV0KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBoaWdocGFzcyB0aGUgb3V0cHV0XG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuRmlsdGVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9oaWdocGFzcyA9IG5ldyBUb25lLkZpbHRlcih7XG5cdCAgICAgICAgICAgICd0eXBlJzogJ2hpZ2hwYXNzJyxcblx0ICAgICAgICAgICAgJ1EnOiAtMy4wMTAyOTk5NTY2Mzk4MTI1XG5cdCAgICAgICAgfSkuY29ubmVjdCh0aGlzLl9hbXBsaXR1ZSk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG51bWJlciBvZiBvY3RhdmVzIHRoZSBoaWdocGFzc1xuXHRcdFx0ICogIGZpbHRlciBmcmVxdWVuY3kgcmFtcHNcblx0XHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9vY3RhdmVzID0gb3B0aW9ucy5vY3RhdmVzO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFNjYWxlIHRoZSBib2R5IGVudmVsb3BlXG5cdFx0XHQgKiAgZm9yIHRoZSBiYW5kcGFzc1xuXHRcdFx0ICogIEB0eXBlIHtUb25lLlNjYWxlfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9maWx0ZXJGcmVxU2NhbGVyID0gbmV3IFRvbmUuU2NhbGUob3B0aW9ucy5yZXNvbmFuY2UsIDcwMDApO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBlbnZlbG9wZSB3aGljaCBpcyBjb25uZWN0ZWQgYm90aCB0byB0aGVcblx0XHRcdCAqICBhbXBsaXR1ZGUgYW5kIGhpZ2hwYXNzIGZpbHRlcidzIGN1dG9mZiBmcmVxdWVuY3lcblx0XHRcdCAqICBAdHlwZSAge1RvbmUuRW52ZWxvcGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmVudmVsb3BlID0gbmV3IFRvbmUuRW52ZWxvcGUoe1xuXHQgICAgICAgICAgICAnYXR0YWNrJzogb3B0aW9ucy5lbnZlbG9wZS5hdHRhY2ssXG5cdCAgICAgICAgICAgICdhdHRhY2tDdXJ2ZSc6ICdsaW5lYXInLFxuXHQgICAgICAgICAgICAnZGVjYXknOiBvcHRpb25zLmVudmVsb3BlLmRlY2F5LFxuXHQgICAgICAgICAgICAnc3VzdGFpbic6IDAsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJzogb3B0aW9ucy5lbnZlbG9wZS5yZWxlYXNlXG5cdCAgICAgICAgfSkuY2hhaW4odGhpcy5fZmlsdGVyRnJlcVNjYWxlciwgdGhpcy5faGlnaHBhc3MuZnJlcXVlbmN5KTtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlLmNvbm5lY3QodGhpcy5fYW1wbGl0dWUuZ2Fpbik7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmhhcm1SYXRpb3MubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgdmFyIG9zYyA9IG5ldyBUb25lLkZNT3NjaWxsYXRvcih7XG5cdCAgICAgICAgICAgICAgICAndHlwZSc6ICdzcXVhcmUnLFxuXHQgICAgICAgICAgICAgICAgJ21vZHVsYXRpb25UeXBlJzogJ3NxdWFyZScsXG5cdCAgICAgICAgICAgICAgICAnaGFybW9uaWNpdHknOiBvcHRpb25zLmhhcm1vbmljaXR5LFxuXHQgICAgICAgICAgICAgICAgJ21vZHVsYXRpb25JbmRleCc6IG9wdGlvbnMubW9kdWxhdGlvbkluZGV4XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICBvc2MuY29ubmVjdCh0aGlzLl9oaWdocGFzcyk7XG5cdCAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3JzW2ldID0gb3NjO1xuXHQgICAgICAgICAgICB2YXIgbXVsdCA9IG5ldyBUb25lLk11bHRpcGx5KGluaGFybVJhdGlvc1tpXSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZyZXFNdWx0aXBsaWVyc1tpXSA9IG11bHQ7XG5cdCAgICAgICAgICAgIHRoaXMuZnJlcXVlbmN5LmNoYWluKG11bHQsIG9zYy5mcmVxdWVuY3kpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL3NldCB0aGUgb2N0YXZlc1xuXHQgICAgICAgIHRoaXMub2N0YXZlcyA9IG9wdGlvbnMub2N0YXZlcztcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLk1ldGFsU3ludGgsIFRvbmUuSW5zdHJ1bWVudCk7XG5cdCAgICAvKipcblx0XHQgKiAgZGVmYXVsdCB2YWx1ZXNcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuTWV0YWxTeW50aC5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnZnJlcXVlbmN5JzogMjAwLFxuXHQgICAgICAgICdlbnZlbG9wZSc6IHtcblx0ICAgICAgICAgICAgJ2F0dGFjayc6IDAuMDAxLFxuXHQgICAgICAgICAgICAnZGVjYXknOiAxLjQsXG5cdCAgICAgICAgICAgICdyZWxlYXNlJzogMC4yXG5cdCAgICAgICAgfSxcblx0ICAgICAgICAnaGFybW9uaWNpdHknOiA1LjEsXG5cdCAgICAgICAgJ21vZHVsYXRpb25JbmRleCc6IDMyLFxuXHQgICAgICAgICdyZXNvbmFuY2UnOiA0MDAwLFxuXHQgICAgICAgICdvY3RhdmVzJzogMS41XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRyaWdnZXIgdGhlIGF0dGFjay5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gIHRpbWUgICAgICBXaGVuIHRoZSBhdHRhY2sgc2hvdWxkIGJlIHRyaWdnZXJlZC5cblx0XHQgKiAgQHBhcmFtICB7Tm9ybWFsUmFuZ2V9ICBbdmVsb2NpdHk9MV0gIFRoZSB2ZWxvY2l0eSB0aGF0IHRoZSBlbnZlbG9wZSBzaG91bGQgYmUgdHJpZ2dlcmVkIGF0LlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5NZXRhbFN5bnRofSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NZXRhbFN5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrID0gZnVuY3Rpb24gKHRpbWUsIHZlbCkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB2ZWwgPSBUb25lLmRlZmF1bHRBcmcodmVsLCAxKTtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlLnRyaWdnZXJBdHRhY2sodGltZSwgdmVsKTtcblx0ICAgICAgICB0aGlzLl9vc2NpbGxhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChvc2MpIHtcblx0ICAgICAgICAgICAgb3NjLnN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIC8vaWYgdGhlIHN1c3RhaW4gaXMgMCwgc3RvcCB0aGUgb3NjaWxsYXRvciBhcyB3ZWxsXG5cdCAgICAgICAgaWYgKHRoaXMuZW52ZWxvcGUuc3VzdGFpbiA9PT0gMCkge1xuXHQgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uIChvc2MpIHtcblx0ICAgICAgICAgICAgICAgIG9zYy5zdG9wKHRpbWUgKyB0aGlzLmVudmVsb3BlLmF0dGFjayArIHRoaXMuZW52ZWxvcGUuZGVjYXkpO1xuXHQgICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVHJpZ2dlciB0aGUgcmVsZWFzZSBvZiB0aGUgZW52ZWxvcGUuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9ICB0aW1lICAgICAgV2hlbiB0aGUgcmVsZWFzZSBzaG91bGQgYmUgdHJpZ2dlcmVkLlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5NZXRhbFN5bnRofSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NZXRhbFN5bnRoLnByb3RvdHlwZS50cmlnZ2VyUmVsZWFzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuZW52ZWxvcGUudHJpZ2dlclJlbGVhc2UodGltZSk7XG5cdCAgICAgICAgdGhpcy5fb3NjaWxsYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAob3NjKSB7XG5cdCAgICAgICAgICAgIG9zYy5zdG9wKHRpbWUgKyB0aGlzLmVudmVsb3BlLnJlbGVhc2UpO1xuXHQgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3luYyB0aGUgaW5zdHJ1bWVudCB0byB0aGUgVHJhbnNwb3J0LiBBbGwgc3Vic2VxdWVudCBjYWxscyBvZlxuXHRcdCAqIFt0cmlnZ2VyQXR0YWNrXSgjdHJpZ2dlcmF0dGFjaykgYW5kIFt0cmlnZ2VyUmVsZWFzZV0oI3RyaWdnZXJyZWxlYXNlKVxuXHRcdCAqIHdpbGwgYmUgc2NoZWR1bGVkIGFsb25nIHRoZSB0cmFuc3BvcnQuXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBzeW50aC5zeW5jKClcblx0XHQgKiAvL3NjaGVkdWxlIDMgbm90ZXMgd2hlbiB0aGUgdHJhbnNwb3J0IGZpcnN0IHN0YXJ0c1xuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKCc4bicsIDApXG5cdFx0ICogc3ludGgudHJpZ2dlckF0dGFja1JlbGVhc2UoJzhuJywgJzhuJylcblx0XHQgKiBzeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZSgnOG4nLCAnNG4nKVxuXHRcdCAqIC8vc3RhcnQgdGhlIHRyYW5zcG9ydCB0byBoZWFyIHRoZSBub3Rlc1xuXHRcdCAqIFRyYW5zcG9ydC5zdGFydCgpXG5cdFx0ICogQHJldHVybnMge1RvbmUuSW5zdHJ1bWVudH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NZXRhbFN5bnRoLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX3N5bmNNZXRob2QoJ3RyaWdnZXJBdHRhY2snLCAwKTtcblx0ICAgICAgICB0aGlzLl9zeW5jTWV0aG9kKCd0cmlnZ2VyUmVsZWFzZScsIDApO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUcmlnZ2VyIHRoZSBhdHRhY2sgYW5kIHJlbGVhc2Ugb2YgdGhlIGVudmVsb3BlIGFmdGVyIHRoZSBnaXZlblxuXHRcdCAqICBkdXJhdGlvbi5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gIGR1cmF0aW9uICBUaGUgZHVyYXRpb24gYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlbGVhc2Vcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gIHRpbWUgICAgICBXaGVuIHRoZSBhdHRhY2sgc2hvdWxkIGJlIHRyaWdnZXJlZC5cblx0XHQgKiAgQHBhcmFtICB7Tm9ybWFsUmFuZ2V9ICBbdmVsb2NpdHk9MV0gIFRoZSB2ZWxvY2l0eSB0aGF0IHRoZSBlbnZlbG9wZSBzaG91bGQgYmUgdHJpZ2dlcmVkIGF0LlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5NZXRhbFN5bnRofSAgdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5NZXRhbFN5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrUmVsZWFzZSA9IGZ1bmN0aW9uIChkdXJhdGlvbiwgdGltZSwgdmVsb2NpdHkpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgZHVyYXRpb24gPSB0aGlzLnRvU2Vjb25kcyhkdXJhdGlvbik7XG5cdCAgICAgICAgdGhpcy50cmlnZ2VyQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICB0aGlzLnRyaWdnZXJSZWxlYXNlKHRpbWUgKyBkdXJhdGlvbik7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBtb2R1bGF0aW9uSW5kZXggb2YgdGhlIG9zY2lsbGF0b3JzIHdoaWNoIG1ha2UgdXAgdGhlIHNvdXJjZS5cblx0XHQgKiAgc2VlIFRvbmUuRk1Pc2NpbGxhdG9yLm1vZHVsYXRpb25JbmRleFxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5NZXRhbFN5bnRoI1xuXHRcdCAqICBAdHlwZSB7UG9zaXRpdmV9XG5cdFx0ICogIEBuYW1lICBtb2R1bGF0aW9uSW5kZXhcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk1ldGFsU3ludGgucHJvdG90eXBlLCAnbW9kdWxhdGlvbkluZGV4Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3NjaWxsYXRvcnNbMF0ubW9kdWxhdGlvbkluZGV4LnZhbHVlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG5cdCAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fb3NjaWxsYXRvcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX29zY2lsbGF0b3JzW2ldLm1vZHVsYXRpb25JbmRleC52YWx1ZSA9IHZhbDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBoYXJtb25pY2l0eSBvZiB0aGUgb3NjaWxsYXRvcnMgd2hpY2ggbWFrZSB1cCB0aGUgc291cmNlLlxuXHRcdCAqICBzZWUgVG9uZS5GTU9zY2lsbGF0b3IuaGFybW9uaWNpdHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTWV0YWxTeW50aCNcblx0XHQgKiAgQHR5cGUge1Bvc2l0aXZlfVxuXHRcdCAqICBAbmFtZSAgaGFybW9uaWNpdHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLk1ldGFsU3ludGgucHJvdG90eXBlLCAnaGFybW9uaWNpdHknLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9vc2NpbGxhdG9yc1swXS5oYXJtb25pY2l0eS52YWx1ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX29zY2lsbGF0b3JzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9yc1tpXS5oYXJtb25pY2l0eS52YWx1ZSA9IHZhbDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBmcmVxdWVuY3kgb2YgdGhlIGhpZ2hwYXNzIGZpbHRlciBhdHRhY2hlZCB0byB0aGUgZW52ZWxvcGVcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuTWV0YWxTeW50aCNcblx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHQgKiAgQG5hbWUgIHJlc29uYW5jZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTWV0YWxTeW50aC5wcm90b3R5cGUsICdyZXNvbmFuY2UnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJGcmVxU2NhbGVyLm1pbjtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuXHQgICAgICAgICAgICB0aGlzLl9maWx0ZXJGcmVxU2NhbGVyLm1pbiA9IHZhbDtcblx0ICAgICAgICAgICAgdGhpcy5vY3RhdmVzID0gdGhpcy5fb2N0YXZlcztcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBUaGUgbnVtYmVyIG9mIG9jdGF2ZXMgYWJvdmUgdGhlIFwicmVzb25hbmNlXCIgZnJlcXVlbmN5XG5cdFx0ICogIHRoYXQgdGhlIGZpbHRlciByYW1wcyBkdXJpbmcgdGhlIGF0dGFjay9kZWNheSBlbnZlbG9wZVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5NZXRhbFN5bnRoI1xuXHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqICBAbmFtZSAgb2N0YXZlc1xuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuTWV0YWxTeW50aC5wcm90b3R5cGUsICdvY3RhdmVzJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fb2N0YXZlcztcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG9jdHMpIHtcblx0ICAgICAgICAgICAgdGhpcy5fb2N0YXZlcyA9IG9jdHM7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZpbHRlckZyZXFTY2FsZXIubWF4ID0gdGhpcy5fZmlsdGVyRnJlcVNjYWxlci5taW4gKiBNYXRoLnBvdygyLCBvY3RzKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBDbGVhbiB1cFxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5NZXRhbFN5bnRofSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk1ldGFsU3ludGgucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5JbnN0cnVtZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9vc2NpbGxhdG9ycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB0aGlzLl9vc2NpbGxhdG9yc1tpXS5kaXNwb3NlKCk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZyZXFNdWx0aXBsaWVyc1tpXS5kaXNwb3NlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX29zY2lsbGF0b3JzID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9mcmVxTXVsdGlwbGllcnMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuZnJlcXVlbmN5LmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmZyZXF1ZW5jeSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZmlsdGVyRnJlcVNjYWxlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZmlsdGVyRnJlcVNjYWxlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fYW1wbGl0dWUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2FtcGxpdHVlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9oaWdocGFzcy5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5faGlnaHBhc3MgPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLk1ldGFsU3ludGg7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyAgVG9uZS5Ob2lzZVN5bnRoIGlzIGNvbXBvc2VkIG9mIGEgbm9pc2UgZ2VuZXJhdG9yIChUb25lLk5vaXNlKSwgb25lIGZpbHRlciAoVG9uZS5GaWx0ZXIpLFxuXHRcdCAqICAgICAgICAgIGFuZCB0d28gZW52ZWxvcGVzIChUb25lLkVudmVsb3ApLiBPbmUgZW52ZWxvcGUgY29udHJvbHMgdGhlIGFtcGxpdHVkZVxuXHRcdCAqICAgICAgICAgIG9mIHRoZSBub2lzZSBhbmQgdGhlIG90aGVyIGlzIGNvbnRyb2xzIHRoZSBjdXRvZmYgZnJlcXVlbmN5IG9mIHRoZSBmaWx0ZXIuXG5cdFx0ICogICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kcmF3aW5ncy9kLzFycXp1WDlyQmxoVDUwTVJ2RDJUS21sOWJuWmhjWm16WEYxcmZfbzd2ZG5FL3B1Yj93PTkxOCZoPTI0MlwiPlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5JbnN0cnVtZW50fVxuXHRcdCAqICBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIHRoZSBvcHRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHN5bnRoXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBkZWZhdWx0cyBiZWxvd1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogdmFyIG5vaXNlU3ludGggPSBuZXcgVG9uZS5Ob2lzZVN5bnRoKCkudG9NYXN0ZXIoKTtcblx0XHQgKiBub2lzZVN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKFwiOG5cIik7XG5cdFx0ICovXG5cdCAgICBUb25lLk5vaXNlU3ludGggPSBmdW5jdGlvbiAob3B0aW9ucykge1xuXHQgICAgICAgIC8vZ2V0IHRoZSBkZWZhdWx0c1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5Ob2lzZVN5bnRoLmRlZmF1bHRzKTtcblx0ICAgICAgICBUb25lLkluc3RydW1lbnQuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgbm9pc2Ugc291cmNlLlxuXHRcdFx0ICogIEB0eXBlIHtUb25lLk5vaXNlfVxuXHRcdFx0ICogIEBleGFtcGxlXG5cdFx0XHQgKiBub2lzZVN5bnRoLnNldChcIm5vaXNlLnR5cGVcIiwgXCJicm93blwiKTtcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMubm9pc2UgPSBuZXcgVG9uZS5Ob2lzZSgpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBhbXBsaXR1ZGUgZW52ZWxvcGUuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuQW1wbGl0dWRlRW52ZWxvcGV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmVudmVsb3BlID0gbmV3IFRvbmUuQW1wbGl0dWRlRW52ZWxvcGUob3B0aW9ucy5lbnZlbG9wZSk7XG5cdCAgICAgICAgLy9jb25uZWN0IHRoZSBub2lzZSB0byB0aGUgb3V0cHV0XG5cdCAgICAgICAgdGhpcy5ub2lzZS5jaGFpbih0aGlzLmVudmVsb3BlLCB0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAnbm9pc2UnLFxuXHQgICAgICAgICAgICAnZW52ZWxvcGUnXG5cdCAgICAgICAgXSk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5Ob2lzZVN5bnRoLCBUb25lLkluc3RydW1lbnQpO1xuXHQgICAgLyoqXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLk5vaXNlU3ludGguZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ25vaXNlJzogeyAndHlwZSc6ICd3aGl0ZScgfSxcblx0ICAgICAgICAnZW52ZWxvcGUnOiB7XG5cdCAgICAgICAgICAgICdhdHRhY2snOiAwLjAwNSxcblx0ICAgICAgICAgICAgJ2RlY2F5JzogMC4xLFxuXHQgICAgICAgICAgICAnc3VzdGFpbic6IDBcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFN0YXJ0IHRoZSBhdHRhY2sgcG9ydGlvbiBvZiB0aGUgZW52ZWxvcGVzLiBVbmxpa2Ugb3RoZXJcblx0XHQgKiAgaW5zdHJ1bWVudHMsIFRvbmUuTm9pc2VTeW50aCBkb2Vzbid0IGhhdmUgYSBub3RlLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gdGhlIHRpbWUgdGhlIGF0dGFjayBzaG91bGQgc3RhcnRcblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IFt2ZWxvY2l0eT0xXSB0aGUgdmVsb2NpdHkgb2YgdGhlIG5vdGUgKDAtMSlcblx0XHQgKiAgQHJldHVybnMge1RvbmUuTm9pc2VTeW50aH0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIG5vaXNlU3ludGgudHJpZ2dlckF0dGFjaygpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Ob2lzZVN5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrID0gZnVuY3Rpb24gKHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgLy90aGUgZW52ZWxvcGVzXG5cdCAgICAgICAgdGhpcy5lbnZlbG9wZS50cmlnZ2VyQXR0YWNrKHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICAvL3N0YXJ0IHRoZSBub2lzZVxuXHQgICAgICAgIHRoaXMubm9pc2Uuc3RhcnQodGltZSk7XG5cdCAgICAgICAgaWYgKHRoaXMuZW52ZWxvcGUuc3VzdGFpbiA9PT0gMCkge1xuXHQgICAgICAgICAgICB0aGlzLm5vaXNlLnN0b3AodGltZSA9IHRoaXMuZW52ZWxvcGUuYXR0YWNrICsgdGhpcy5lbnZlbG9wZS5kZWNheSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdGFydCB0aGUgcmVsZWFzZSBwb3J0aW9uIG9mIHRoZSBlbnZlbG9wZXMuXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gW3RpbWU9bm93XSB0aGUgdGltZSB0aGUgcmVsZWFzZSBzaG91bGQgc3RhcnRcblx0XHQgKiAgQHJldHVybnMge1RvbmUuTm9pc2VTeW50aH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Ob2lzZVN5bnRoLnByb3RvdHlwZS50cmlnZ2VyUmVsZWFzZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGhpcy5lbnZlbG9wZS50cmlnZ2VyUmVsZWFzZSh0aW1lKTtcblx0ICAgICAgICB0aGlzLm5vaXNlLnN0b3AodGltZSArIHRoaXMuZW52ZWxvcGUucmVsZWFzZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3luYyB0aGUgaW5zdHJ1bWVudCB0byB0aGUgVHJhbnNwb3J0LiBBbGwgc3Vic2VxdWVudCBjYWxscyBvZlxuXHRcdCAqIFt0cmlnZ2VyQXR0YWNrXSgjdHJpZ2dlcmF0dGFjaykgYW5kIFt0cmlnZ2VyUmVsZWFzZV0oI3RyaWdnZXJyZWxlYXNlKVxuXHRcdCAqIHdpbGwgYmUgc2NoZWR1bGVkIGFsb25nIHRoZSB0cmFuc3BvcnQuXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBzeW50aC5zeW5jKClcblx0XHQgKiAvL3NjaGVkdWxlIDMgbm90ZXMgd2hlbiB0aGUgdHJhbnNwb3J0IGZpcnN0IHN0YXJ0c1xuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKCc4bicsIDApXG5cdFx0ICogc3ludGgudHJpZ2dlckF0dGFja1JlbGVhc2UoJzhuJywgJzhuJylcblx0XHQgKiBzeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZSgnOG4nLCAnNG4nKVxuXHRcdCAqIC8vc3RhcnQgdGhlIHRyYW5zcG9ydCB0byBoZWFyIHRoZSBub3Rlc1xuXHRcdCAqIFRyYW5zcG9ydC5zdGFydCgpXG5cdFx0ICogQHJldHVybnMge1RvbmUuSW5zdHJ1bWVudH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Ob2lzZVN5bnRoLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX3N5bmNNZXRob2QoJ3RyaWdnZXJBdHRhY2snLCAwKTtcblx0ICAgICAgICB0aGlzLl9zeW5jTWV0aG9kKCd0cmlnZ2VyUmVsZWFzZScsIDApO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUcmlnZ2VyIHRoZSBhdHRhY2sgYW5kIHRoZW4gdGhlIHJlbGVhc2UuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IGR1cmF0aW9uIHRoZSBkdXJhdGlvbiBvZiB0aGUgbm90ZVxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbdGltZT1ub3ddICAgICB0aGUgdGltZSBvZiB0aGUgYXR0YWNrXG5cdFx0ICogIEBwYXJhbSAge251bWJlcn0gW3ZlbG9jaXR5PTFdIHRoZSB2ZWxvY2l0eVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Ob2lzZVN5bnRofSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLk5vaXNlU3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2tSZWxlYXNlID0gZnVuY3Rpb24gKGR1cmF0aW9uLCB0aW1lLCB2ZWxvY2l0eSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBkdXJhdGlvbiA9IHRoaXMudG9TZWNvbmRzKGR1cmF0aW9uKTtcblx0ICAgICAgICB0aGlzLnRyaWdnZXJBdHRhY2sodGltZSwgdmVsb2NpdHkpO1xuXHQgICAgICAgIHRoaXMudHJpZ2dlclJlbGVhc2UodGltZSArIGR1cmF0aW9uKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk5vaXNlU3ludGh9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuTm9pc2VTeW50aC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkluc3RydW1lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdub2lzZScsXG5cdCAgICAgICAgICAgICdlbnZlbG9wZSdcblx0ICAgICAgICBdKTtcblx0ICAgICAgICB0aGlzLm5vaXNlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLm5vaXNlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmVudmVsb3BlID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5Ob2lzZVN5bnRoO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgS2FycGx1cy1TdHJpbmcgc3RyaW5nIHN5bnRoZXNpcy4gT2Z0ZW4gb3V0IG9mIHR1bmUuXG5cdFx0ICogICAgICAgICBXaWxsIGNoYW5nZSB3aGVuIHRoZSBBdWRpb1dvcmtlck5vZGUgaXMgYXZhaWxhYmxlIGFjcm9zc1xuXHRcdCAqICAgICAgICAgYnJvd3NlcnMuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkluc3RydW1lbnR9XG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gc2VlIHRoZSBkZWZhdWx0c1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBwbHVja3kgPSBuZXcgVG9uZS5QbHVja1N5bnRoKCkudG9NYXN0ZXIoKTtcblx0XHQgKiBwbHVja3kudHJpZ2dlckF0dGFjayhcIkM0XCIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QbHVja1N5bnRoID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcblx0ICAgICAgICBvcHRpb25zID0gVG9uZS5kZWZhdWx0QXJnKG9wdGlvbnMsIFRvbmUuUGx1Y2tTeW50aC5kZWZhdWx0cyk7XG5cdCAgICAgICAgVG9uZS5JbnN0cnVtZW50LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuTm9pc2V9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX25vaXNlID0gbmV3IFRvbmUuTm9pc2UoJ3BpbmsnKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgYW1vdW50IG9mIG5vaXNlIGF0IHRoZSBhdHRhY2suXG5cdFx0XHQgKiAgTm9taW5hbCByYW5nZSBvZiBbMC4xLCAyMF1cblx0XHRcdCAqICBAdHlwZSB7bnVtYmVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5hdHRhY2tOb2lzZSA9IG9wdGlvbnMuYXR0YWNrTm9pc2U7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIExGQ0Zcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5Mb3dwYXNzQ29tYkZpbHRlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbGZjZiA9IG5ldyBUb25lLkxvd3Bhc3NDb21iRmlsdGVyKHtcblx0ICAgICAgICAgICAgJ3Jlc29uYW5jZSc6IG9wdGlvbnMucmVzb25hbmNlLFxuXHQgICAgICAgICAgICAnZGFtcGVuaW5nJzogb3B0aW9ucy5kYW1wZW5pbmdcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgcmVzb25hbmNlIGNvbnRyb2wuXG5cdFx0XHQgKiAgQHR5cGUge05vcm1hbFJhbmdlfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucmVzb25hbmNlID0gdGhpcy5fbGZjZi5yZXNvbmFuY2U7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGRhbXBlbmluZyBjb250cm9sLiBpLmUuIHRoZSBsb3dwYXNzIGZpbHRlciBmcmVxdWVuY3kgb2YgdGhlIGNvbWIgZmlsdGVyXG5cdFx0XHQgKiAgQHR5cGUge0ZyZXF1ZW5jeX1cblx0XHRcdCAqICBAc2lnbmFsXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmRhbXBlbmluZyA9IHRoaXMuX2xmY2YuZGFtcGVuaW5nO1xuXHQgICAgICAgIC8vY29ubmVjdGlvbnNcblx0ICAgICAgICB0aGlzLl9ub2lzZS5jb25uZWN0KHRoaXMuX2xmY2YpO1xuXHQgICAgICAgIHRoaXMuX2xmY2YuY29ubmVjdCh0aGlzLm91dHB1dCk7XG5cdCAgICAgICAgdGhpcy5fcmVhZE9ubHkoW1xuXHQgICAgICAgICAgICAncmVzb25hbmNlJyxcblx0ICAgICAgICAgICAgJ2RhbXBlbmluZydcblx0ICAgICAgICBdKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlBsdWNrU3ludGgsIFRvbmUuSW5zdHJ1bWVudCk7XG5cdCAgICAvKipcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuUGx1Y2tTeW50aC5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnYXR0YWNrTm9pc2UnOiAxLFxuXHQgICAgICAgICdkYW1wZW5pbmcnOiA0MDAwLFxuXHQgICAgICAgICdyZXNvbmFuY2UnOiAwLjdcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVHJpZ2dlciB0aGUgbm90ZS5cblx0XHQgKiAgQHBhcmFtIHtGcmVxdWVuY3l9IG5vdGUgVGhlIG5vdGUgdG8gdHJpZ2dlci5cblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBbdGltZT1ub3ddIFdoZW4gdGhlIG5vdGUgc2hvdWxkIGJlIHRyaWdnZXJlZC5cblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGx1Y2tTeW50aH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QbHVja1N5bnRoLnByb3RvdHlwZS50cmlnZ2VyQXR0YWNrID0gZnVuY3Rpb24gKG5vdGUsIHRpbWUpIHtcblx0ICAgICAgICBub3RlID0gdGhpcy50b0ZyZXF1ZW5jeShub3RlKTtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdmFyIGRlbGF5QW1vdW50ID0gMSAvIG5vdGU7XG5cdCAgICAgICAgdGhpcy5fbGZjZi5kZWxheVRpbWUuc2V0VmFsdWVBdFRpbWUoZGVsYXlBbW91bnQsIHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX25vaXNlLnN0YXJ0KHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX25vaXNlLnN0b3AodGltZSArIGRlbGF5QW1vdW50ICogdGhpcy5hdHRhY2tOb2lzZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIENsZWFuIHVwLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QbHVja1N5bnRofSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBsdWNrU3ludGgucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5JbnN0cnVtZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fbm9pc2UuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2xmY2YuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX25vaXNlID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9sZmNmID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl93cml0YWJsZShbXG5cdCAgICAgICAgICAgICdyZXNvbmFuY2UnLFxuXHQgICAgICAgICAgICAnZGFtcGVuaW5nJ1xuXHQgICAgICAgIF0pO1xuXHQgICAgICAgIHRoaXMuZGFtcGVuaW5nID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnJlc29uYW5jZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuUGx1Y2tTeW50aDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLlBvbHlTeW50aCBoYW5kbGVzIHZvaWNlIGNyZWF0aW9uIGFuZCBhbGxvY2F0aW9uIGZvciBhbnlcblx0XHQgKiAgICAgICAgICBpbnN0cnVtZW50cyBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBwYXJhbXRlci4gUG9seVN5bnRoIGlzXG5cdFx0ICogICAgICAgICAgbm90IGEgc3ludGhlc2l6ZXIgYnkgaXRzZWxmLCBpdCBtZXJlbHkgbWFuYWdlcyB2b2ljZXMgb2Zcblx0XHQgKiAgICAgICAgICBvbmUgb2YgdGhlIG90aGVyIHR5cGVzIG9mIHN5bnRocywgYWxsb3dpbmcgYW55IG9mIHRoZVxuXHRcdCAqICAgICAgICAgIG1vbm9waG9uaWMgc3ludGhlc2l6ZXJzIHRvIGJlIHBvbHlwaG9uaWMuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkluc3RydW1lbnR9XG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyfE9iamVjdH0gW3BvbHlwaG9ueT00XSBUaGUgbnVtYmVyIG9mIHZvaWNlcyB0byBjcmVhdGVcblx0XHQgKiAgQHBhcmFtIHtmdW5jdGlvbn0gW3ZvaWNlPVRvbmUuU3ludGhdIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgdm9pY2VzXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXMgVG9uZS5TeW50aCBieSBkZWZhdWx0LlxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vYSBwb2x5c3ludGggY29tcG9zZWQgb2YgNiBWb2ljZXMgb2YgU3ludGhcblx0XHQgKiB2YXIgc3ludGggPSBuZXcgVG9uZS5Qb2x5U3ludGgoNiwgVG9uZS5TeW50aCkudG9NYXN0ZXIoKTtcblx0XHQgKiAvL3NldCB0aGUgYXR0cmlidXRlcyB1c2luZyB0aGUgc2V0IGludGVyZmFjZVxuXHRcdCAqIHN5bnRoLnNldChcImRldHVuZVwiLCAtMTIwMCk7XG5cdFx0ICogLy9wbGF5IGEgY2hvcmRcblx0XHQgKiBzeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZShbXCJDNFwiLCBcIkU0XCIsIFwiQTRcIl0sIFwiNG5cIik7XG5cdFx0ICovXG5cdCAgICBUb25lLlBvbHlTeW50aCA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICdwb2x5cGhvbnknLFxuXHQgICAgICAgICAgICAndm9pY2UnXG5cdCAgICAgICAgXSwgVG9uZS5Qb2x5U3ludGgpO1xuXHQgICAgICAgIFRvbmUuSW5zdHJ1bWVudC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRBcmcob3B0aW9ucywgVG9uZS5JbnN0cnVtZW50LmRlZmF1bHRzKTtcblx0ICAgICAgICAvL21heCBwb2x5cGhvbnlcblx0ICAgICAgICBvcHRpb25zLnBvbHlwaG9ueSA9IE1hdGgubWluKFRvbmUuUG9seVN5bnRoLk1BWF9QT0xZUEhPTlksIG9wdGlvbnMucG9seXBob255KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgYXJyYXkgb2Ygdm9pY2VzXG5cdFx0XHQgKiAgQHR5cGUge0FycmF5fVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy52b2ljZXMgPSBuZXcgQXJyYXkob3B0aW9ucy5wb2x5cGhvbnkpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBxdWV1ZSBvZiB2b2ljZXMgd2l0aCBkYXRhIGFib3V0IGxhc3QgdHJpZ2dlclxuXHRcdFx0ICogIGFuZCB0aGUgdHJpZ2dlcmVkIG5vdGVcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtBcnJheX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3RyaWdnZXJzID0gbmV3IEFycmF5KG9wdGlvbnMucG9seXBob255KTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZGV0dW5lIGluIGNlbnRzXG5cdFx0XHQgKiAgQHR5cGUge0NlbnRzfVxuXHRcdFx0ICogIEBzaWduYWxcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gbmV3IFRvbmUuU2lnbmFsKG9wdGlvbnMuZGV0dW5lLCBUb25lLlR5cGUuQ2VudHMpO1xuXHQgICAgICAgIHRoaXMuX3JlYWRPbmx5KCdkZXR1bmUnKTtcblx0ICAgICAgICAvL2NyZWF0ZSB0aGUgdm9pY2VzXG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLnBvbHlwaG9ueTsgaSsrKSB7XG5cdCAgICAgICAgICAgIHZhciB2ID0gbmV3IG9wdGlvbnMudm9pY2UoYXJndW1lbnRzWzJdLCBhcmd1bWVudHNbM10pO1xuXHQgICAgICAgICAgICBpZiAoISh2IGluc3RhbmNlb2YgVG9uZS5Nb25vcGhvbmljKSkge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW50aCBjb25zdHJ1Y3RvciBtdXN0IGJlIGluc3RhbmNlIG9mIFRvbmUuTW9ub3Bob25pYycpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMudm9pY2VzW2ldID0gdjtcblx0ICAgICAgICAgICAgdi5jb25uZWN0KHRoaXMub3V0cHV0KTtcblx0ICAgICAgICAgICAgaWYgKHYuaGFzT3duUHJvcGVydHkoJ2RldHVuZScpKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmRldHVuZS5jb25uZWN0KHYuZGV0dW5lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLl90cmlnZ2Vyc1tpXSA9IHtcblx0ICAgICAgICAgICAgICAgIHJlbGVhc2U6IC0xLFxuXHQgICAgICAgICAgICAgICAgbm90ZTogbnVsbCxcblx0ICAgICAgICAgICAgICAgIHZvaWNlOiB2XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuUG9seVN5bnRoLCBUb25lLkluc3RydW1lbnQpO1xuXHQgICAgLyoqXG5cdFx0ICogIHRoZSBkZWZhdWx0c1xuXHRcdCAqICBAY29uc3Rcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb2x5U3ludGguZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3BvbHlwaG9ueSc6IDQsXG5cdCAgICAgICAgJ3ZvbHVtZSc6IDAsXG5cdCAgICAgICAgJ2RldHVuZSc6IDAsXG5cdCAgICAgICAgJ3ZvaWNlJzogVG9uZS5TeW50aFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBUcmlnZ2VyIHRoZSBhdHRhY2sgcG9ydGlvbiBvZiB0aGUgbm90ZVxuXHRcdCAqICBAcGFyYW0gIHtGcmVxdWVuY3l8QXJyYXl9IG5vdGVzIFRoZSBub3RlcyB0byBwbGF5LiBBY2NlcHRzIGEgc2luZ2xlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlcXVlbmN5IG9yIGFuIGFycmF5IG9mIGZyZXF1ZW5jaWVzLlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbdGltZT1ub3ddICBUaGUgc3RhcnQgdGltZSBvZiB0aGUgbm90ZS5cblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IFt2ZWxvY2l0eT0xXSBUaGUgdmVsb2NpdHkgb2YgdGhlIG5vdGUuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBvbHlTeW50aH0gdGhpc1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vdHJpZ2dlciBhIGNob3JkIGltbWVkaWF0ZWx5IHdpdGggYSB2ZWxvY2l0eSBvZiAwLjJcblx0XHQgKiBwb2x5LnRyaWdnZXJBdHRhY2soW1wiQWIzXCIsIFwiQzRcIiwgXCJGNVwiXSwgdW5kZWZpbmVkLCAwLjIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2sgPSBmdW5jdGlvbiAobm90ZXMsIHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5vdGVzKSkge1xuXHQgICAgICAgICAgICBub3RlcyA9IFtub3Rlc107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vdGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHZhciB2YWwgPSBub3Rlc1tpXTtcblx0ICAgICAgICAgICAgLy90cmlnZ2VyIHRoZSBvbGRlc3Qgdm9pY2Vcblx0ICAgICAgICAgICAgdmFyIG9sZGVzdCA9IHRoaXMuX3RyaWdnZXJzWzBdO1xuXHQgICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHRoaXMuX3RyaWdnZXJzLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcy5fdHJpZ2dlcnNbal0ucmVsZWFzZSA8IG9sZGVzdC5yZWxlYXNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb2xkZXN0ID0gdGhpcy5fdHJpZ2dlcnNbal07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgb2xkZXN0LnJlbGVhc2UgPSBJbmZpbml0eTtcblx0ICAgICAgICAgICAgb2xkZXN0Lm5vdGUgPSBKU09OLnN0cmluZ2lmeSh2YWwpO1xuXHQgICAgICAgICAgICBvbGRlc3Qudm9pY2UudHJpZ2dlckF0dGFjayh2YWwsIHRpbWUsIHZlbG9jaXR5KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRyaWdnZXIgdGhlIGF0dGFjayBhbmQgcmVsZWFzZSBhZnRlciB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uXG5cdFx0ICpcblx0XHQgKiAgQHBhcmFtICB7RnJlcXVlbmN5fEFycmF5fSBub3RlcyBUaGUgbm90ZXMgdG8gcGxheS4gQWNjZXB0cyBhIHNpbmdsZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZXF1ZW5jeSBvciBhbiBhcnJheSBvZiBmcmVxdWVuY2llcy5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gZHVyYXRpb24gdGhlIGR1cmF0aW9uIG9mIHRoZSBub3RlXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFt0aW1lPW5vd10gICAgIGlmIG5vIHRpbWUgaXMgZ2l2ZW4sIGRlZmF1bHRzIHRvIG5vd1xuXHRcdCAqICBAcGFyYW0gIHtudW1iZXJ9IFt2ZWxvY2l0eT0xXSB0aGUgdmVsb2NpdHkgb2YgdGhlIGF0dGFjayAoMC0xKVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Qb2x5U3ludGh9IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL3RyaWdnZXIgYSBjaG9yZCBmb3IgYSBkdXJhdGlvbiBvZiBhIGhhbGYgbm90ZVxuXHRcdCAqIHBvbHkudHJpZ2dlckF0dGFja1JlbGVhc2UoW1wiRWIzXCIsIFwiRzRcIiwgXCJDNVwiXSwgXCIyblwiKTtcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2NhbiBwYXNzIGluIGFuIGFycmF5IG9mIGR1cmF0aW9ucyBhcyB3ZWxsXG5cdFx0ICogcG9seS50cmlnZ2VyQXR0YWNrUmVsZWFzZShbXCJFYjNcIiwgXCJHNFwiLCBcIkM1XCJdLCBbXCIyblwiLCBcIjRuXCIsIFwiNG5cIl0pO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJBdHRhY2tSZWxlYXNlID0gZnVuY3Rpb24gKG5vdGVzLCBkdXJhdGlvbiwgdGltZSwgdmVsb2NpdHkpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgdGhpcy50cmlnZ2VyQXR0YWNrKG5vdGVzLCB0aW1lLCB2ZWxvY2l0eSk7XG5cdCAgICAgICAgaWYgKFRvbmUuaXNBcnJheShkdXJhdGlvbikgJiYgVG9uZS5pc0FycmF5KG5vdGVzKSkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vdGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZCA9IGR1cmF0aW9uW01hdGgubWluKGksIGR1cmF0aW9uLmxlbmd0aCAtIDEpXTtcblx0ICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlbGVhc2Uobm90ZXNbaV0sIHRpbWUgKyB0aGlzLnRvU2Vjb25kcyhkKSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLnRyaWdnZXJSZWxlYXNlKG5vdGVzLCB0aW1lICsgdGhpcy50b1NlY29uZHMoZHVyYXRpb24pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRyaWdnZXIgdGhlIHJlbGVhc2Ugb2YgdGhlIG5vdGUuIFVubGlrZSBtb25vcGhvbmljIGluc3RydW1lbnRzLFxuXHRcdCAqICBhIG5vdGUgKG9yIGFycmF5IG9mIG5vdGVzKSBuZWVkcyB0byBiZSBwYXNzZWQgaW4gYXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxuXHRcdCAqICBAcGFyYW0gIHtGcmVxdWVuY3l8QXJyYXl9IG5vdGVzIFRoZSBub3RlcyB0byBwbGF5LiBBY2NlcHRzIGEgc2luZ2xlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlcXVlbmN5IG9yIGFuIGFycmF5IG9mIGZyZXF1ZW5jaWVzLlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbdGltZT1ub3ddICBXaGVuIHRoZSByZWxlYXNlIHdpbGwgYmUgdHJpZ2dlcmVkLlxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5Qb2x5U3ludGh9IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBwb2x5LnRyaWdnZXJSZWxlYXNlKFtcIkFiM1wiLCBcIkM0XCIsIFwiRjVcIl0sIFwiKzJuXCIpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb2x5U3ludGgucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlID0gZnVuY3Rpb24gKG5vdGVzLCB0aW1lKSB7XG5cdCAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5vdGVzKSkge1xuXHQgICAgICAgICAgICBub3RlcyA9IFtub3Rlc107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vdGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIC8vZ2V0IHRoZSB2b2ljZVxuXHQgICAgICAgICAgICB2YXIgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeShub3Rlc1tpXSk7XG5cdCAgICAgICAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwgdGhpcy5fdHJpZ2dlcnMubGVuZ3RoOyB2KyspIHtcblx0ICAgICAgICAgICAgICAgIHZhciBkZXNjID0gdGhpcy5fdHJpZ2dlcnNbdl07XG5cdCAgICAgICAgICAgICAgICBpZiAoZGVzYy5ub3RlID09PSBzdHJpbmdpZmllZCAmJiBkZXNjLnJlbGVhc2UgPiB0aW1lKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGVzYy52b2ljZS50cmlnZ2VyUmVsZWFzZSh0aW1lKTtcblx0ICAgICAgICAgICAgICAgICAgICBkZXNjLnJlbGVhc2UgPSB0aW1lO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIFN5bmMgdGhlIGluc3RydW1lbnQgdG8gdGhlIFRyYW5zcG9ydC4gQWxsIHN1YnNlcXVlbnQgY2FsbHMgb2Zcblx0XHQgKiBbdHJpZ2dlckF0dGFja10oI3RyaWdnZXJhdHRhY2spIGFuZCBbdHJpZ2dlclJlbGVhc2VdKCN0cmlnZ2VycmVsZWFzZSlcblx0XHQgKiB3aWxsIGJlIHNjaGVkdWxlZCBhbG9uZyB0aGUgdHJhbnNwb3J0LlxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogc3ludGguc3luYygpXG5cdFx0ICogLy9zY2hlZHVsZSAzIG5vdGVzIHdoZW4gdGhlIHRyYW5zcG9ydCBmaXJzdCBzdGFydHNcblx0XHQgKiBzeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZSgnOG4nLCAwKVxuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKCc4bicsICc4bicpXG5cdFx0ICogc3ludGgudHJpZ2dlckF0dGFja1JlbGVhc2UoJzhuJywgJzRuJylcblx0XHQgKiAvL3N0YXJ0IHRoZSB0cmFuc3BvcnQgdG8gaGVhciB0aGUgbm90ZXNcblx0XHQgKiBUcmFuc3BvcnQuc3RhcnQoKVxuXHRcdCAqIEByZXR1cm5zIHtUb25lLkluc3RydW1lbnR9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUG9seVN5bnRoLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX3N5bmNNZXRob2QoJ3RyaWdnZXJBdHRhY2snLCAxKTtcblx0ICAgICAgICB0aGlzLl9zeW5jTWV0aG9kKCd0cmlnZ2VyUmVsZWFzZScsIDEpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTZXQgYSBtZW1iZXIvYXR0cmlidXRlIG9mIHRoZSB2b2ljZXMuXG5cdFx0ICogIEBwYXJhbSB7T2JqZWN0fHN0cmluZ30gcGFyYW1zXG5cdFx0ICogIEBwYXJhbSB7bnVtYmVyPX0gdmFsdWVcblx0XHQgKiAgQHBhcmFtIHtUaW1lPX0gcmFtcFRpbWVcblx0XHQgKiAgQHJldHVybnMge1RvbmUuUG9seVN5bnRofSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogcG9seS5zZXQoe1xuXHRcdCAqIFx0XCJmaWx0ZXJcIiA6IHtcblx0XHQgKiBcdFx0XCJ0eXBlXCIgOiBcImhpZ2hwYXNzXCJcblx0XHQgKiBcdH0sXG5cdFx0ICogXHRcImVudmVsb3BlXCIgOiB7XG5cdFx0ICogXHRcdFwiYXR0YWNrXCIgOiAwLjI1XG5cdFx0ICogXHR9XG5cdFx0ICogfSk7XG5cdFx0ICovXG5cdCAgICBUb25lLlBvbHlTeW50aC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHBhcmFtcywgdmFsdWUsIHJhbXBUaW1lKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB0aGlzLnZvaWNlc1tpXS5zZXQocGFyYW1zLCB2YWx1ZSwgcmFtcFRpbWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgR2V0IHRoZSBzeW50aCdzIGF0dHJpYnV0ZXMuIEdpdmVuIG5vIGFyZ3VtZW50cyBnZXRcblx0XHQgKiAgd2lsbCByZXR1cm4gYWxsIGF2YWlsYWJsZSBvYmplY3QgcHJvcGVydGllcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZ1xuXHRcdCAqICB2YWx1ZXMuIFBhc3MgaW4gYSBzaW5nbGUgYXR0cmlidXRlIHRvIHJldHJpZXZlIG9yIGFuIGFycmF5XG5cdFx0ICogIG9mIGF0dHJpYnV0ZXMuIFRoZSBhdHRyaWJ1dGUgc3RyaW5ncyBjYW4gYWxzbyBpbmNsdWRlIGEgXCIuXCJcblx0XHQgKiAgdG8gYWNjZXNzIGRlZXBlciBwcm9wZXJ0aWVzLlxuXHRcdCAqICBAcGFyYW0ge0FycmF5PX0gcGFyYW1zIHRoZSBwYXJhbWV0ZXJzIHRvIGdldCwgb3RoZXJ3aXNlIHdpbGwgcmV0dXJuXG5cdFx0ICogIFx0XHRcdFx0XHQgICBhbGwgYXZhaWxhYmxlLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb2x5U3ludGgucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy52b2ljZXNbMF0uZ2V0KHBhcmFtcyk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRyaWdnZXIgdGhlIHJlbGVhc2UgcG9ydGlvbiBvZiBhbGwgdGhlIGN1cnJlbnRseSBhY3RpdmUgdm9pY2VzLlxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IFt0aW1lPW5vd10gV2hlbiB0aGUgbm90ZXMgc2hvdWxkIGJlIHJlbGVhc2VkLlxuXHRcdCAqICBAcmV0dXJuIHtUb25lLlBvbHlTeW50aH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb2x5U3ludGgucHJvdG90eXBlLnJlbGVhc2VBbGwgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3RyaWdnZXJzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHZhciBkZXNjID0gdGhpcy5fdHJpZ2dlcnNbaV07XG5cdCAgICAgICAgICAgIGlmIChkZXNjLnJlbGVhc2UgPiB0aW1lKSB7XG5cdCAgICAgICAgICAgICAgICBkZXNjLnJlbGVhc2UgPSB0aW1lO1xuXHQgICAgICAgICAgICAgICAgZGVzYy52b2ljZS50cmlnZ2VyUmVsZWFzZSh0aW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xlYW4gdXAuXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBvbHlTeW50aH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Qb2x5U3ludGgucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5JbnN0cnVtZW50LnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZvaWNlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICB0aGlzLnZvaWNlc1tpXS5kaXNwb3NlKCk7XG5cdCAgICAgICAgICAgIHRoaXMudm9pY2VzW2ldID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoJ2RldHVuZScpO1xuXHQgICAgICAgIHRoaXMuZGV0dW5lLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmRldHVuZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy52b2ljZXMgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX3RyaWdnZXJzID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vdGVzIHRoYXQgY2FuIGJlIGFsbG9jYXRlZFxuXHRcdCAqICB0byBhIHBvbHlzeW50aC5cblx0XHQgKiAgQHR5cGUgIHtOdW1iZXJ9XG5cdFx0ICogIEBzdGF0aWNcblx0XHQgKi9cblx0ICAgIFRvbmUuUG9seVN5bnRoLk1BWF9QT0xZUEhPTlkgPSAyMDtcblx0ICAgIHJldHVybiBUb25lLlBvbHlTeW50aDtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgLyoqXG5cdFx0ICogQGNsYXNzIEF1dG9tYXRpY2FsbHkgaW50ZXJwb2xhdGVzIGJldHdlZW4gYSBzZXQgb2YgcGl0Y2hlZCBzYW1wbGVzLiBQYXNzIGluIGFuIG9iamVjdCB3aGljaCBtYXBzIHRoZSBub3RlJ3MgcGl0Y2ggb3IgbWlkaSB2YWx1ZSB0byB0aGUgdXJsLCB0aGVuIHlvdSBjYW4gdHJpZ2dlciB0aGUgYXR0YWNrIGFuZCByZWxlYXNlIG9mIHRoYXQgbm90ZSBsaWtlIG90aGVyIGluc3RydW1lbnRzLiBCeSBhdXRvbWF0aWNhbGx5IHJlcGl0Y2hpbmcgdGhlIHNhbXBsZXMsIGl0IGlzIHBvc3NpYmxlIHRvIHBsYXkgcGl0Y2hlcyB3aGljaCB3ZXJlIG5vdCBleHBsaWNpdGx5IGluY2x1ZGVkIHdoaWNoIGNhbiBzYXZlIGxvYWRpbmcgdGltZS5cblx0XHQgKiAgICAgICAgRm9yIHNhbXBsZSBvciBidWZmZXIgcGxheWJhY2sgd2hlcmUgcmVwaXRjaGluZyBpcyBub3QgbmVjZXNzYXJ5LCB1c2UgW1RvbmUuUGxheWVyXShodHRwczovL3RvbmVqcy5naXRodWIuaW8vZG9jcy9QbGF5ZXIpLlxuXHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBzYW1wbGVzIEFuIG9iamVjdCBvZiBzYW1wbGVzIG1hcHBpbmcgZWl0aGVyIE1pZGlcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIE51bWJlcnMgb3IgU2NpZW50aWZpYyBQaXRjaCBOb3RhdGlvblxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSB1cmwgb2YgdGhhdCBzYW1wbGUuXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbj19IG9ubG9hZCBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYWxsIG9mIHRoZSBzYW1wbGVzIGFyZSBsb2FkZWQuXG5cdFx0ICogQHBhcmFtIHtTdHJpbmc9fSBiYXNlVXJsIFRoZSByb290IFVSTCBvZiBhbGwgb2YgdGhlIHNhbXBsZXMsIHdoaWNoIGlzIHByZXBlbmRlZCB0byBhbGwgdGhlIFVSTHMuXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiB2YXIgc2FtcGxlciA9IG5ldyBUb25lLlNhbXBsZXIoe1xuXHRcdCAqIFx0XCJDM1wiIDogXCJwYXRoL3RvL0MzLm1wM1wiLFxuXHRcdCAqIFx0XCJEIzNcIiA6IFwicGF0aC90by9Ec2hhcnAzLm1wM1wiLFxuXHRcdCAqIFx0XCJGIzNcIiA6IFwicGF0aC90by9Gc2hhcnAzLm1wM1wiLFxuXHRcdCAqIFx0XCJBM1wiIDogXCJwYXRoL3RvL0EzLm1wM1wiLFxuXHRcdCAqIH0sIGZ1bmN0aW9uKCl7XG5cdFx0ICogXHQvL3NhbXBsZXIgd2lsbCByZXBpdGNoIHRoZSBjbG9zZXN0IHNhbXBsZVxuXHRcdCAqIFx0c2FtcGxlci50cmlnZ2VyQXR0YWNrKFwiRDNcIilcblx0XHQgKiB9KVxuXHRcdCAqIEBleHRlbmRzIHtUb25lLkluc3RydW1lbnR9XG5cdFx0ICovXG5cdCAgICBUb25lLlNhbXBsZXIgPSBmdW5jdGlvbiAodXJscykge1xuXHQgICAgICAgIC8vIHNoaWZ0IGFyZ3VtZW50cyBvdmVyIG9uZS4gVGhvc2UgYXJlIHRoZSByZW1haW5kZXIgb2YgdGhlIG9wdGlvbnNcblx0ICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdCAgICAgICAgYXJncy5zaGlmdCgpO1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmdzLCBbXG5cdCAgICAgICAgICAgICdvbmxvYWQnLFxuXHQgICAgICAgICAgICAnYmFzZVVybCdcblx0ICAgICAgICBdLCBUb25lLlNhbXBsZXIpO1xuXHQgICAgICAgIFRvbmUuSW5zdHJ1bWVudC5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXHQgICAgICAgIHZhciB1cmxNYXAgPSB7fTtcblx0ICAgICAgICBmb3IgKHZhciBub3RlIGluIHVybHMpIHtcblx0ICAgICAgICAgICAgaWYgKFRvbmUuaXNOb3RlKG5vdGUpKSB7XG5cdCAgICAgICAgICAgICAgICAvL2NvbnZlcnQgdGhlIG5vdGUgbmFtZSB0byBNSURJXG5cdCAgICAgICAgICAgICAgICB2YXIgbWlkID0gVG9uZS5GcmVxdWVuY3kobm90ZSkudG9NaWRpKCk7XG5cdCAgICAgICAgICAgICAgICB1cmxNYXBbbWlkXSA9IHVybHNbbm90ZV07XG5cdCAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKHBhcnNlRmxvYXQobm90ZSkpKSB7XG5cdCAgICAgICAgICAgICAgICAvL290aGVyd2lzZSBpZiBpdCdzIG51bWJlcnMgYXNzdW1lIGl0J3MgbWlkaVxuXHQgICAgICAgICAgICAgICAgdXJsTWFwW25vdGVdID0gdXJsc1tub3RlXTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9uZS5TYW1wbGVyOiB1cmwga2V5cyBtdXN0IGJlIHRoZSBub3RlXFwncyBwaXRjaCcpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIHN0b3JlZCBhbmQgbG9hZGVkIGJ1ZmZlcnNcblx0XHRcdCAqIEB0eXBlIHtUb25lLkJ1ZmZlcnN9XG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYnVmZmVycyA9IG5ldyBUb25lLkJ1ZmZlcnModXJsTWFwLCBvcHRpb25zLm9ubG9hZCwgb3B0aW9ucy5iYXNlVXJsKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSBvYmplY3Qgb2YgYWxsIGN1cnJlbnRseSBwbGF5aW5nIEJ1ZmZlclNvdXJjZXNcblx0XHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fYWN0aXZlU291cmNlcyA9IHt9O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIGVudmVsb3BlIGFwcGxpZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2FtcGxlLlxuXHRcdFx0ICogQHR5cGUge1RpbWV9XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmF0dGFjayA9IG9wdGlvbnMuYXR0YWNrO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIGVudmVsb3BlIGFwcGxpZWQgdG8gdGhlIGVuZCBvZiB0aGUgZW52ZWxvcGUuXG5cdFx0XHQgKiBAdHlwZSB7VGltZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMucmVsZWFzZSA9IG9wdGlvbnMucmVsZWFzZTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlNhbXBsZXIsIFRvbmUuSW5zdHJ1bWVudCk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgZGVmYXVsdHNcblx0XHQgKiBAY29uc3Rcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5TYW1wbGVyLmRlZmF1bHRzID0ge1xuXHQgICAgICAgIGF0dGFjazogMCxcblx0ICAgICAgICByZWxlYXNlOiAwLjEsXG5cdCAgICAgICAgb25sb2FkOiBUb25lLm5vT3AsXG5cdCAgICAgICAgYmFzZVVybDogJydcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGluIHN0ZXBzIGJldHdlZW4gdGhlIGdpdmVuIG1pZGkgbm90ZSBhdCB0aGUgY2xvc2V0cyBzYW1wbGUuXG5cdFx0ICogQHBhcmFtICB7TWlkaX0gbWlkaVxuXHRcdCAqIEByZXR1cm4ge0ludGVydmFsfVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLlNhbXBsZXIucHJvdG90eXBlLl9maW5kQ2xvc2VzdCA9IGZ1bmN0aW9uIChtaWRpKSB7XG5cdCAgICAgICAgLy9zZWFyY2hlcyB3aXRoaW4gOCBvY3RhdmVzIG9mIHRoZSBnaXZlbiBtaWRpIG5vdGVcblx0ICAgICAgICB2YXIgTUFYX0lOVEVSVkFMID0gOTY7XG5cdCAgICAgICAgdmFyIGludGVydmFsID0gMDtcblx0ICAgICAgICB3aGlsZSAoaW50ZXJ2YWwgPCBNQVhfSU5URVJWQUwpIHtcblx0ICAgICAgICAgICAgLy8gY2hlY2sgYWJvdmUgYW5kIGJlbG93XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9idWZmZXJzLmhhcyhtaWRpICsgaW50ZXJ2YWwpKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gLWludGVydmFsO1xuXHQgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2J1ZmZlcnMuaGFzKG1pZGkgLSBpbnRlcnZhbCkpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnZhbDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpbnRlcnZhbCsrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBAcGFyYW0gIHtGcmVxdWVuY3l9IG5vdGUgICAgIFRoZSBub3RlIHRvIHBsYXlcblx0XHQgKiBAcGFyYW0gIHtUaW1lPX0gdGltZSAgICAgV2hlbiB0byBwbGF5IHRoZSBub3RlXG5cdFx0ICogQHBhcmFtICB7Tm9ybWFsUmFuZ2U9fSB2ZWxvY2l0eSBUaGUgdmVsb2NpdHkgdG8gcGxheSB0aGUgc2FtcGxlIGJhY2suXG5cdFx0ICogQHJldHVybiB7VG9uZS5TYW1wbGVyfSAgICAgICAgICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlNhbXBsZXIucHJvdG90eXBlLnRyaWdnZXJBdHRhY2sgPSBmdW5jdGlvbiAobm90ZSwgdGltZSwgdmVsb2NpdHkpIHtcblx0ICAgICAgICB2YXIgbWlkaSA9IFRvbmUuRnJlcXVlbmN5KG5vdGUpLnRvTWlkaSgpO1xuXHQgICAgICAgIC8vIGZpbmQgdGhlIGNsb3Nlc3Qgbm90ZSBwaXRjaFxuXHQgICAgICAgIHZhciBkaWZmZXJlbmNlID0gdGhpcy5fZmluZENsb3Nlc3QobWlkaSk7XG5cdCAgICAgICAgaWYgKGRpZmZlcmVuY2UgIT09IG51bGwpIHtcblx0ICAgICAgICAgICAgdmFyIGNsb3Nlc3ROb3RlID0gbWlkaSAtIGRpZmZlcmVuY2U7XG5cdCAgICAgICAgICAgIHZhciBidWZmZXIgPSB0aGlzLl9idWZmZXJzLmdldChjbG9zZXN0Tm90ZSk7XG5cdCAgICAgICAgICAgIC8vIHBsYXkgdGhhdCBub3RlXG5cdCAgICAgICAgICAgIHZhciBzb3VyY2UgPSBuZXcgVG9uZS5CdWZmZXJTb3VyY2Uoe1xuXHQgICAgICAgICAgICAgICAgJ2J1ZmZlcic6IGJ1ZmZlcixcblx0ICAgICAgICAgICAgICAgICdwbGF5YmFja1JhdGUnOiBUb25lLmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyhkaWZmZXJlbmNlKSxcblx0ICAgICAgICAgICAgICAgICdmYWRlSW4nOiB0aGlzLmF0dGFjayxcblx0ICAgICAgICAgICAgICAgICdmYWRlT3V0JzogdGhpcy5yZWxlYXNlLFxuXHQgICAgICAgICAgICAgICAgJ2N1cnZlJzogJ2V4cG9uZW50aWFsJ1xuXHQgICAgICAgICAgICB9KS5jb25uZWN0KHRoaXMub3V0cHV0KTtcblx0ICAgICAgICAgICAgc291cmNlLnN0YXJ0KHRpbWUsIDAsIGJ1ZmZlci5kdXJhdGlvbiwgdmVsb2NpdHkpO1xuXHQgICAgICAgICAgICAvLyBhZGQgaXQgdG8gdGhlIGFjdGl2ZSBzb3VyY2VzXG5cdCAgICAgICAgICAgIGlmICghVG9uZS5pc0FycmF5KHRoaXMuX2FjdGl2ZVNvdXJjZXNbbWlkaV0pKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzW21pZGldID0gW107XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5fYWN0aXZlU291cmNlc1ttaWRpXS5wdXNoKHtcblx0ICAgICAgICAgICAgICAgIG5vdGU6IG1pZGksXG5cdCAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogQHBhcmFtICB7RnJlcXVlbmN5fSBub3RlICAgICBUaGUgbm90ZSB0byByZWxlYXNlLlxuXHRcdCAqIEBwYXJhbSAge1RpbWU9fSB0aW1lICAgICBcdFdoZW4gdG8gcmVsZWFzZSB0aGUgbm90ZS5cblx0XHQgKiBAcmV0dXJuIHtUb25lLlNhbXBsZXJ9XHR0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlNhbXBsZXIucHJvdG90eXBlLnRyaWdnZXJSZWxlYXNlID0gZnVuY3Rpb24gKG5vdGUsIHRpbWUpIHtcblx0ICAgICAgICB2YXIgbWlkaSA9IFRvbmUuRnJlcXVlbmN5KG5vdGUpLnRvTWlkaSgpO1xuXHQgICAgICAgIC8vIGZpbmQgdGhlIG5vdGVcblx0ICAgICAgICBpZiAodGhpcy5fYWN0aXZlU291cmNlc1ttaWRpXSAmJiB0aGlzLl9hY3RpdmVTb3VyY2VzW21pZGldLmxlbmd0aCkge1xuXHQgICAgICAgICAgICB2YXIgc291cmNlID0gdGhpcy5fYWN0aXZlU291cmNlc1ttaWRpXS5zaGlmdCgpLnNvdXJjZTtcblx0ICAgICAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgICAgICBzb3VyY2Uuc3RvcCh0aW1lICsgdGhpcy5yZWxlYXNlLCB0aGlzLnJlbGVhc2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBSZWxlYXNlIGFsbCBjdXJyZW50bHkgYWN0aXZlIG5vdGVzLlxuXHRcdCAqIEBwYXJhbSAge1RpbWU9fSB0aW1lICAgICBcdFdoZW4gdG8gcmVsZWFzZSB0aGUgbm90ZXMuXG5cdFx0ICogQHJldHVybiB7VG9uZS5TYW1wbGVyfVx0dGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TYW1wbGVyLnByb3RvdHlwZS5yZWxlYXNlQWxsID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgZm9yICh2YXIgbm90ZSBpbiB0aGlzLl9hY3RpdmVTb3VyY2VzKSB7XG5cdCAgICAgICAgICAgIHZhciBzb3VyY2VzID0gdGhpcy5fYWN0aXZlU291cmNlc1tub3RlXTtcblx0ICAgICAgICAgICAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gc291cmNlcy5zaGlmdCgpLnNvdXJjZTtcblx0ICAgICAgICAgICAgICAgIHNvdXJjZS5zdG9wKHRpbWUgKyB0aGlzLnJlbGVhc2UsIHRoaXMucmVsZWFzZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3luYyB0aGUgaW5zdHJ1bWVudCB0byB0aGUgVHJhbnNwb3J0LiBBbGwgc3Vic2VxdWVudCBjYWxscyBvZlxuXHRcdCAqIFt0cmlnZ2VyQXR0YWNrXSgjdHJpZ2dlcmF0dGFjaykgYW5kIFt0cmlnZ2VyUmVsZWFzZV0oI3RyaWdnZXJyZWxlYXNlKVxuXHRcdCAqIHdpbGwgYmUgc2NoZWR1bGVkIGFsb25nIHRoZSB0cmFuc3BvcnQuXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiBzeW50aC5zeW5jKClcblx0XHQgKiAvL3NjaGVkdWxlIDMgbm90ZXMgd2hlbiB0aGUgdHJhbnNwb3J0IGZpcnN0IHN0YXJ0c1xuXHRcdCAqIHN5bnRoLnRyaWdnZXJBdHRhY2tSZWxlYXNlKCc4bicsIDApXG5cdFx0ICogc3ludGgudHJpZ2dlckF0dGFja1JlbGVhc2UoJzhuJywgJzhuJylcblx0XHQgKiBzeW50aC50cmlnZ2VyQXR0YWNrUmVsZWFzZSgnOG4nLCAnNG4nKVxuXHRcdCAqIC8vc3RhcnQgdGhlIHRyYW5zcG9ydCB0byBoZWFyIHRoZSBub3Rlc1xuXHRcdCAqIFRyYW5zcG9ydC5zdGFydCgpXG5cdFx0ICogQHJldHVybnMge1RvbmUuSW5zdHJ1bWVudH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5TYW1wbGVyLnByb3RvdHlwZS5zeW5jID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHRoaXMuX3N5bmNNZXRob2QoJ3RyaWdnZXJBdHRhY2snLCAxKTtcblx0ICAgICAgICB0aGlzLl9zeW5jTWV0aG9kKCd0cmlnZ2VyUmVsZWFzZScsIDEpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIEludm9rZSB0aGUgYXR0YWNrIHBoYXNlLCB0aGVuIGFmdGVyIHRoZSBkdXJhdGlvbiwgaW52b2tlIHRoZSByZWxlYXNlLlxuXHRcdCAqIEBwYXJhbSAge0ZyZXF1ZW5jeX0gbm90ZSAgICAgVGhlIG5vdGUgdG8gcGxheVxuXHRcdCAqIEBwYXJhbSAge1RpbWV9IGR1cmF0aW9uIFRoZSB0aW1lIHRoZSBub3RlIHNob3VsZCBiZSBoZWxkXG5cdFx0ICogQHBhcmFtICB7VGltZT19IHRpbWUgICAgIFdoZW4gdG8gc3RhcnQgdGhlIGF0dGFja1xuXHRcdCAqIEBwYXJhbSAge05vcm1hbFJhbmdlfSBbdmVsb2NpdHk9MV0gVGhlIHZlbG9jaXR5IG9mIHRoZSBhdHRhY2tcblx0XHQgKiBAcmV0dXJuIHtUb25lLlNhbXBsZXJ9ICAgICAgICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuU2FtcGxlci5wcm90b3R5cGUudHJpZ2dlckF0dGFja1JlbGVhc2UgPSBmdW5jdGlvbiAobm90ZSwgZHVyYXRpb24sIHRpbWUsIHZlbG9jaXR5KSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIGR1cmF0aW9uID0gdGhpcy50b1NlY29uZHMoZHVyYXRpb24pO1xuXHQgICAgICAgIHRoaXMudHJpZ2dlckF0dGFjayhub3RlLCB0aW1lLCB2ZWxvY2l0eSk7XG5cdCAgICAgICAgdGhpcy50cmlnZ2VyUmVsZWFzZShub3RlLCB0aW1lICsgZHVyYXRpb24pO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBBZGQgYSBub3RlIHRvIHRoZSBzYW1wbGVyLlxuXHRcdCAqICBAcGFyYW0gIHtOb3RlfE1pZGl9ICAgbm90ZSAgICAgIFRoZSBidWZmZXIncyBwaXRjaC5cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfFRvbmUuQnVmZmVyfEF1ZGlvYnVmZmVyfSAgdXJsICBFaXRoZXIgdGhlIHVybCBvZiB0aGUgYnVmZXIsXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBidWZmZXIgd2hpY2ggd2lsbCBiZSBhZGRlZFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGdpdmVuIG5hbWUuXG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9uPX0gIGNhbGxiYWNrICBUaGUgY2FsbGJhY2sgdG8gaW52b2tlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB1cmwgaXMgbG9hZGVkLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5TYW1wbGVyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAobm90ZSwgdXJsLCBjYWxsYmFjaykge1xuXHQgICAgICAgIGlmIChUb25lLmlzTm90ZShub3RlKSkge1xuXHQgICAgICAgICAgICAvL2NvbnZlcnQgdGhlIG5vdGUgbmFtZSB0byBNSURJXG5cdCAgICAgICAgICAgIHZhciBtaWQgPSBUb25lLkZyZXF1ZW5jeShub3RlKS50b01pZGkoKTtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVycy5hZGQobWlkLCB1cmwsIGNhbGxiYWNrKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihwYXJzZUZsb2F0KG5vdGUpKSkge1xuXHQgICAgICAgICAgICAvL290aGVyd2lzZSBpZiBpdCdzIG51bWJlcnMgYXNzdW1lIGl0J3MgbWlkaVxuXHQgICAgICAgICAgICB0aGlzLl9idWZmZXJzLmFkZChub3RlLCB1cmwsIGNhbGxiYWNrKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbmUuU2FtcGxlcjogbm90ZSBtdXN0IGJlIHRoZSBub3RlXFwncyBwaXRjaC4gSW5zdGVhZCBnb3QgJyArIG5vdGUpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBJZiB0aGUgYnVmZmVycyBhcmUgbG9hZGVkIG9yIG5vdFxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlNhbXBsZXIjXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XG5cdFx0ICogQG5hbWUgbG9hZGVkXG5cdFx0ICogQHJlYWRPbmx5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5TYW1wbGVyLnByb3RvdHlwZSwgJ2xvYWRlZCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2J1ZmZlcnMubG9hZGVkO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogQ2xlYW4gdXBcblx0XHQgKiBAcmV0dXJuIHtUb25lLlNhbXBsZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuU2FtcGxlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLkluc3RydW1lbnQucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl9idWZmZXJzLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9idWZmZXJzID0gbnVsbDtcblx0ICAgICAgICBmb3IgKHZhciBtaWRpIGluIHRoaXMuX2FjdGl2ZVNvdXJjZXMpIHtcblx0ICAgICAgICAgICAgdGhpcy5fYWN0aXZlU291cmNlc1ttaWRpXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgICAgICAgICAgZXZlbnQuc291cmNlLmRpc3Bvc2UoKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX2FjdGl2ZVNvdXJjZXMgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlNhbXBsZXI7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIGlmIChUb25lLnN1cHBvcnRlZCkge1xuXHQgICAgICAgIGlmICghT3NjaWxsYXRvck5vZGUucHJvdG90eXBlLnNldFBlcmlvZGljV2F2ZSkge1xuXHQgICAgICAgICAgICBPc2NpbGxhdG9yTm9kZS5wcm90b3R5cGUuc2V0UGVyaW9kaWNXYXZlID0gT3NjaWxsYXRvck5vZGUucHJvdG90eXBlLnNldFdhdmVUYWJsZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCFBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZVBlcmlvZGljV2F2ZSkge1xuXHQgICAgICAgICAgICBBdWRpb0NvbnRleHQucHJvdG90eXBlLmNyZWF0ZVBlcmlvZGljV2F2ZSA9IEF1ZGlvQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlV2F2ZVRhYmxlO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzIE1hcHMgYSBOb3JtYWxSYW5nZSBbMCwgMV0gdG8gYW4gQXVkaW9SYW5nZSBbLTEsIDFdLiBcblx0XHQgKiAgICAgICAgIFNlZSBhbHNvIFRvbmUuQXVkaW9Ub0dhaW4uIFxuXHRcdCAqXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLlNpZ25hbEJhc2V9XG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIHZhciBnMmEgPSBuZXcgVG9uZS5HYWluVG9BdWRpbygpO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5HYWluVG9BdWRpbyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlNpZ25hbEJhc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBAdHlwZSB7V2F2ZVNoYXBlck5vZGV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX25vcm0gPSB0aGlzLmlucHV0ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5XYXZlU2hhcGVyKGZ1bmN0aW9uICh4KSB7XG5cdCAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyh4KSAqIDIgLSAxO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuR2FpblRvQXVkaW8sIFRvbmUuU2lnbmFsQmFzZSk7XG5cdCAgICAvKipcblx0XHQgKiAgY2xlYW4gdXBcblx0XHQgKiAgQHJldHVybnMge1RvbmUuR2FpblRvQXVkaW99IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuR2FpblRvQXVkaW8ucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fbm9ybS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fbm9ybSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuR2FpblRvQXVkaW87XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIFxuXHQgICAgLyoqXG5cdFx0ICogIEBjbGFzcyBOb3JtYWxpemUgdGFrZXMgYW4gaW5wdXQgbWluIGFuZCBtYXggYW5kIG1hcHMgaXQgbGluZWFybHkgdG8gTm9ybWFsUmFuZ2UgWzAsMV1cblx0XHQgKlxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5TaWduYWxCYXNlfVxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IGlucHV0TWluIHRoZSBtaW4gaW5wdXQgdmFsdWVcblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IGlucHV0TWF4IHRoZSBtYXggaW5wdXQgdmFsdWVcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgbm9ybSA9IG5ldyBUb25lLk5vcm1hbGl6ZSgyLCA0KTtcblx0XHQgKiB2YXIgc2lnID0gbmV3IFRvbmUuU2lnbmFsKDMpLmNvbm5lY3Qobm9ybSk7XG5cdFx0ICogLy9vdXRwdXQgb2Ygbm9ybSBpcyAwLjUuIFxuXHRcdCAqL1xuXHQgICAgVG9uZS5Ob3JtYWxpemUgPSBmdW5jdGlvbiAoaW5wdXRNaW4sIGlucHV0TWF4KSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgdGhlIG1pbiBpbnB1dCB2YWx1ZVxuXHRcdFx0ICogIEB0eXBlIHtudW1iZXJ9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2lucHV0TWluID0gVG9uZS5kZWZhdWx0QXJnKGlucHV0TWluLCAwKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICB0aGUgbWF4IGlucHV0IHZhbHVlXG5cdFx0XHQgKiAgQHR5cGUge251bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5faW5wdXRNYXggPSBUb25lLmRlZmF1bHRBcmcoaW5wdXRNYXgsIDEpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHN1YnRyYWN0IHRoZSBtaW4gZnJvbSB0aGUgaW5wdXRcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5BZGR9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N1YiA9IHRoaXMuaW5wdXQgPSBuZXcgVG9uZS5BZGQoMCk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgZGl2aWRlIGJ5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGlucHV0IGFuZCBvdXRwdXRcblx0XHRcdCAqICBAdHlwZSB7VG9uZS5NdWx0aXBseX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZGl2ID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5NdWx0aXBseSgxKTtcblx0ICAgICAgICB0aGlzLl9zdWIuY29ubmVjdCh0aGlzLl9kaXYpO1xuXHQgICAgICAgIHRoaXMuX3NldFJhbmdlKCk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5Ob3JtYWxpemUsIFRvbmUuU2lnbmFsQmFzZSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgbWluaW11bSB2YWx1ZSB0aGUgaW5wdXQgc2lnbmFsIHdpbGwgcmVhY2guXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuTm9ybWFsaXplI1xuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICogQG5hbWUgbWluXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Ob3JtYWxpemUucHJvdG90eXBlLCAnbWluJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRNaW47XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtaW4pIHtcblx0ICAgICAgICAgICAgdGhpcy5faW5wdXRNaW4gPSBtaW47XG5cdCAgICAgICAgICAgIHRoaXMuX3NldFJhbmdlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgbWF4aW11bSB2YWx1ZSB0aGUgaW5wdXQgc2lnbmFsIHdpbGwgcmVhY2guXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuTm9ybWFsaXplI1xuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICogQG5hbWUgbWF4XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Ob3JtYWxpemUucHJvdG90eXBlLCAnbWF4Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRNYXg7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChtYXgpIHtcblx0ICAgICAgICAgICAgdGhpcy5faW5wdXRNYXggPSBtYXg7XG5cdCAgICAgICAgICAgIHRoaXMuX3NldFJhbmdlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgc2V0IHRoZSB2YWx1ZXNcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuTm9ybWFsaXplLnByb3RvdHlwZS5fc2V0UmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdGhpcy5fc3ViLnZhbHVlID0gLXRoaXMuX2lucHV0TWluO1xuXHQgICAgICAgIHRoaXMuX2Rpdi52YWx1ZSA9IDEgLyAodGhpcy5faW5wdXRNYXggLSB0aGlzLl9pbnB1dE1pbik7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIGNsZWFuIHVwXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLk5vcm1hbGl6ZX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Ob3JtYWxpemUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5TaWduYWxCYXNlLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fc3ViLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9zdWIgPSBudWxsO1xuXHQgICAgICAgIHRoaXMuX2Rpdi5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZGl2ID0gbnVsbDtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICByZXR1cm4gVG9uZS5Ob3JtYWxpemU7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqIEBjbGFzcyBUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsIGV4dGVuZHMgVG9uZS5TaWduYWwsIGJ1dCBhZGRzIHRoZSBhYmlsaXR5IHRvIHN5bmNocm9uaXplIHRoZSBzaWduYWwgdG8gdGhlIHNpZ25hbCB0byB0aGUgVG9uZS5UcmFuc3BvcnRcblx0XHQgKiBAZXh0ZW5kcyB7VG9uZS5TaWduYWx9XG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIFRvbmUuU2lnbmFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgcmVhbCBzaWduYWwgb3V0cHV0XG5cdFx0XHQgKiBAdHlwZSB7VG9uZS5TaWduYWx9XG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5vdXRwdXQgPSB0aGlzLl9vdXRwdXRTaWcgPSBuZXcgVG9uZS5TaWduYWwodGhpcy5faW5pdGlhbFZhbHVlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIEtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgdmFsdWUuIChzbWFsbCBvcHRpbWl6YXRpb24pXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHR5cGUge051bWJlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xhc3RWYWwgPSB0aGlzLnZhbHVlO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIGV2ZW50IGlkIG9mIHRoZSB0aWNrIHVwZGF0ZSBsb29wXG5cdFx0XHQgKiBAcHJpdmF0ZVxuXHRcdFx0ICogQHR5cGUge051bWJlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N5bmNlZCA9IFRvbmUuVHJhbnNwb3J0LnNjaGVkdWxlUmVwZWF0KHRoaXMuX29uVGljay5iaW5kKHRoaXMpLCAnMWknKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIEEgYm91bmQgdmVyc2lvbiBvZiB0aGUgYW5jaG9yIHZhbHVlIG1ldGhvZHNcblx0XHRcdCAqIEB0eXBlIHtGdW5jdGlvbn1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9iaW5kQW5jaG9yVmFsdWUgPSB0aGlzLl9hbmNob3JWYWx1ZS5iaW5kKHRoaXMpO1xuXHQgICAgICAgIFRvbmUuVHJhbnNwb3J0Lm9uKCdzdGFydCBzdG9wIHBhdXNlJywgdGhpcy5fYmluZEFuY2hvclZhbHVlKTtcblx0ICAgICAgICB0aGlzLl9ldmVudHMubWVtb3J5ID0gSW5maW5pdHk7XG5cdCAgICB9O1xuXHQgICAgVG9uZS5leHRlbmQoVG9uZS5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbCwgVG9uZS5TaWduYWwpO1xuXHQgICAgLyoqXG5cdFx0ICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCBldmVyeSB0aWNrLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICogQHBhcmFtICB7TnVtYmVyfSB0aW1lXG5cdFx0ICogQHJldHVybiB7VG9uZS5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbH0gICAgICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5fb25UaWNrID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZUF0VGltZShUb25lLlRyYW5zcG9ydC5zZWNvbmRzKTtcblx0ICAgICAgICBpZiAodGhpcy5fbGFzdFZhbCAhPT0gdmFsKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2xhc3RWYWwgPSB2YWw7XG5cdCAgICAgICAgICAgIC8vYXBwcm94aW1hdGUgcmFtcCBjdXJ2ZXMgd2l0aCBsaW5lYXIgcmFtcHNcblx0ICAgICAgICAgICAgdGhpcy5fb3V0cHV0U2lnLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHZhbCwgdGltZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIEFuY2hvciB0aGUgdmFsdWUgYXQgdGhlIHN0YXJ0IGFuZCBzdG9wIG9mIHRoZSBUcmFuc3BvcnRcblx0XHQgKiBAcGFyYW0gIHtOdW1iZXJ9IHRpbWUgVGhlIHRpbWUgb2YgdGhlIGV2ZW50XG5cdFx0ICogQHJldHVybiB7VG9uZS5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbH0gICAgICB0aGlzXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0VGltZWxpbmVTaWduYWwucHJvdG90eXBlLl9hbmNob3JWYWx1ZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWVBdFRpbWUoVG9uZS5UcmFuc3BvcnQuc2Vjb25kcyk7XG5cdCAgICAgICAgdGhpcy5fbGFzdFZhbCA9IHZhbDtcblx0ICAgICAgICB0aGlzLl9vdXRwdXRTaWcuY2FuY2VsU2NoZWR1bGVkVmFsdWVzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX291dHB1dFNpZy5zZXRWYWx1ZUF0VGltZSh2YWwsIHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBHZXQgdGhlIHNjaGVkdWxlZCB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdGltZS4gVGhpcyB3aWxsXG5cdFx0ICogIHJldHVybiB0aGUgdW5jb252ZXJ0ZWQgKHJhdykgdmFsdWUuXG5cdFx0ICogIEBwYXJhbSAge1RyYW5zcG9ydFRpbWV9ICB0aW1lICBUaGUgdGltZSBpbiBzZWNvbmRzLlxuXHRcdCAqICBAcmV0dXJuICB7TnVtYmVyfSAgVGhlIHNjaGVkdWxlZCB2YWx1ZSBhdCB0aGUgZ2l2ZW4gdGltZS5cblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0VGltZWxpbmVTaWduYWwucHJvdG90eXBlLmdldFZhbHVlQXRUaW1lID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gVG9uZS5UcmFuc3BvcnRUaW1lKHRpbWUpO1xuXHQgICAgICAgIHJldHVybiBUb25lLlNpZ25hbC5wcm90b3R5cGUuZ2V0VmFsdWVBdFRpbWUuY2FsbCh0aGlzLCB0aW1lKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBTZXQgdGhlIG91dHB1dCBvZiB0aGUgc2lnbmFsIGF0IHRoZSBnaXZlbiB0aW1lXG5cdFx0ICogQHBhcmFtICB7TnVtYmVyfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hhbmdlIHRvIGF0IHRoZSBnaXZlbiB0aW1lXG5cdFx0ICogQHBhcmFtICB7VHJhbnNwb3J0VGltZX0gdGltZSAgVGhlIHRpbWUgdG8gY2hhbmdlIHRoZSBzaWduYWxcblx0XHQgKiBAcmV0dXJuIHtUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsfSAgICAgICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5zZXRWYWx1ZUF0VGltZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdGltZSkge1xuXHQgICAgICAgIHRpbWUgPSBUb25lLlRyYW5zcG9ydFRpbWUodGltZSk7XG5cdCAgICAgICAgVG9uZS5TaWduYWwucHJvdG90eXBlLnNldFZhbHVlQXRUaW1lLmNhbGwodGhpcywgdmFsdWUsIHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIExpbmVhciByYW1wIHRvIHRoZSBnaXZlbiB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBzY2hlZHVsZWQgcG9pbnQgdG8gdGhlIGdpdmVuIHZhbHVlXG5cdFx0ICogQHBhcmFtICB7TnVtYmVyfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hhbmdlIHRvIGF0IHRoZSBnaXZlbiB0aW1lXG5cdFx0ICogQHBhcmFtICB7VHJhbnNwb3J0VGltZX0gdGltZSAgVGhlIHRpbWUgdG8gY2hhbmdlIHRoZSBzaWduYWxcblx0XHQgKiBAcmV0dXJuIHtUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsfSAgICAgICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSA9IGZ1bmN0aW9uICh2YWx1ZSwgdGltZSkge1xuXHQgICAgICAgIHRpbWUgPSBUb25lLlRyYW5zcG9ydFRpbWUodGltZSk7XG5cdCAgICAgICAgVG9uZS5TaWduYWwucHJvdG90eXBlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lLmNhbGwodGhpcywgdmFsdWUsIHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIEV4cG9uZW50aWFsIHJhbXAgdG8gdGhlIGdpdmVuIHZhbHVlIGZyb20gdGhlIHByZXZpb3VzIHNjaGVkdWxlZCBwb2ludCB0byB0aGUgZ2l2ZW4gdmFsdWVcblx0XHQgKiBAcGFyYW0gIHtOdW1iZXJ9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGFuZ2UgdG8gYXQgdGhlIGdpdmVuIHRpbWVcblx0XHQgKiBAcGFyYW0gIHtUcmFuc3BvcnRUaW1lfSB0aW1lICBUaGUgdGltZSB0byBjaGFuZ2UgdGhlIHNpZ25hbFxuXHRcdCAqIEByZXR1cm4ge1RvbmUuVHJhbnNwb3J0VGltZWxpbmVTaWduYWx9ICAgICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0VGltZWxpbmVTaWduYWwucHJvdG90eXBlLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUgPSBmdW5jdGlvbiAodmFsdWUsIHRpbWUpIHtcblx0ICAgICAgICB0aW1lID0gVG9uZS5UcmFuc3BvcnRUaW1lKHRpbWUpO1xuXHQgICAgICAgIFRvbmUuU2lnbmFsLnByb3RvdHlwZS5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lLmNhbGwodGhpcywgdmFsdWUsIHRpbWUpO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBTdGFydCBleHBvbmVudGlhbGx5IGFwcHJvYWNoaW5nIHRoZSB0YXJnZXQgdmFsdWUgYXQgdGhlIGdpdmVuIHRpbWUgd2l0aFxuXHRcdCAqICBhIHJhdGUgaGF2aW5nIHRoZSBnaXZlbiB0aW1lIGNvbnN0YW50LlxuXHRcdCAqICBAcGFyYW0ge251bWJlcn0gdmFsdWVcblx0XHQgKiAgQHBhcmFtIHtUcmFuc3BvcnRUaW1lfSBzdGFydFRpbWVcblx0XHQgKiAgQHBhcmFtIHtudW1iZXJ9IHRpbWVDb25zdGFudFxuXHRcdCAqIEByZXR1cm4ge1RvbmUuVHJhbnNwb3J0VGltZWxpbmVTaWduYWx9ICAgICAgIHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuVHJhbnNwb3J0VGltZWxpbmVTaWduYWwucHJvdG90eXBlLnNldFRhcmdldEF0VGltZSA9IGZ1bmN0aW9uICh2YWx1ZSwgc3RhcnRUaW1lLCB0aW1lQ29uc3RhbnQpIHtcblx0ICAgICAgICBzdGFydFRpbWUgPSBUb25lLlRyYW5zcG9ydFRpbWUoc3RhcnRUaW1lKTtcblx0ICAgICAgICBUb25lLlNpZ25hbC5wcm90b3R5cGUuc2V0VGFyZ2V0QXRUaW1lLmNhbGwodGhpcywgdmFsdWUsIHN0YXJ0VGltZSwgdGltZUNvbnN0YW50KTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2FuY2VscyBhbGwgc2NoZWR1bGVkIHBhcmFtZXRlciBjaGFuZ2VzIHdpdGggdGltZXMgZ3JlYXRlciB0aGFuIG9yXG5cdFx0ICogIGVxdWFsIHRvIHN0YXJ0VGltZS5cblx0XHQgKiAgQHBhcmFtICB7VHJhbnNwb3J0VGltZX0gc3RhcnRUaW1lXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLlBhcmFtfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMgPSBmdW5jdGlvbiAoc3RhcnRUaW1lKSB7XG5cdCAgICAgICAgc3RhcnRUaW1lID0gVG9uZS5UcmFuc3BvcnRUaW1lKHN0YXJ0VGltZSk7XG5cdCAgICAgICAgVG9uZS5TaWduYWwucHJvdG90eXBlLmNhbmNlbFNjaGVkdWxlZFZhbHVlcy5jYWxsKHRoaXMsIHN0YXJ0VGltZSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFNldCBhbiBhcnJheSBvZiBhcmJpdHJhcnkgdmFsdWVzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiB0aW1lIGZvciB0aGUgZ2l2ZW4gZHVyYXRpb24uXG5cdFx0ICogIEBwYXJhbSB7RmxvYXQzMkFycmF5fSB2YWx1ZXNcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBzdGFydFRpbWVcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBkdXJhdGlvblxuXHRcdCAqICBAcGFyYW0ge05vcm1hbFJhbmdlfSBbc2NhbGluZz0xXSBJZiB0aGUgdmFsdWVzIGluIHRoZSBjdXJ2ZSBzaG91bGQgYmUgc2NhbGVkIGJ5IHNvbWUgdmFsdWVcblx0XHQgKiAgQHJldHVybnMge1RvbmUuU2lnbmFsfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsLnByb3RvdHlwZS5zZXRWYWx1ZUN1cnZlQXRUaW1lID0gZnVuY3Rpb24gKHZhbHVlcywgc3RhcnRUaW1lLCBkdXJhdGlvbiwgc2NhbGluZykge1xuXHQgICAgICAgIHN0YXJ0VGltZSA9IFRvbmUuVHJhbnNwb3J0VGltZShzdGFydFRpbWUpO1xuXHQgICAgICAgIGR1cmF0aW9uID0gVG9uZS5UcmFuc3BvcnRUaW1lKGR1cmF0aW9uKTtcblx0ICAgICAgICBUb25lLlNpZ25hbC5wcm90b3R5cGUuc2V0VmFsdWVDdXJ2ZUF0VGltZS5jYWxsKHRoaXMsIHZhbHVlcywgc3RhcnRUaW1lLCBkdXJhdGlvbiwgc2NhbGluZyk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFRoaXMgaXMgc2ltaWxhciB0byBbY2FuY2VsU2NoZWR1bGVkVmFsdWVzXSgjY2FuY2VsU2NoZWR1bGVkVmFsdWVzKSBleGNlcHRcblx0XHQgKiAgaXQgaG9sZHMgdGhlIGF1dG9tYXRlZCB2YWx1ZSBhdCB0aW1lIHVudGlsIHRoZSBuZXh0IGF1dG9tYXRlZCBldmVudC5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gdGltZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuY2FuY2VsQW5kSG9sZEF0VGltZSA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgcmV0dXJuIFRvbmUuU2lnbmFsLnByb3RvdHlwZS5jYW5jZWxBbmRIb2xkQXRUaW1lLmNhbGwodGhpcywgVG9uZS5UcmFuc3BvcnRUaW1lKHRpbWUpKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBEaXNwb3NlIGFuZCBkaXNjb25uZWN0XG5cdFx0ICogQHJldHVybiB7VG9uZS5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbH0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5UcmFuc3BvcnRUaW1lbGluZVNpZ25hbC5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlRyYW5zcG9ydC5jbGVhcih0aGlzLl9zeW5jZWQpO1xuXHQgICAgICAgIFRvbmUuVHJhbnNwb3J0Lm9mZignc3RhcnQgc3RvcCBwYXVzZScsIHRoaXMuX3N5bmNlZENhbGxiYWNrKTtcblx0ICAgICAgICB0aGlzLl9ldmVudHMuY2FuY2VsKDApO1xuXHQgICAgICAgIFRvbmUuU2lnbmFsLnByb3RvdHlwZS5kaXNwb3NlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgdGhpcy5fb3V0cHV0U2lnLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLl9vdXRwdXRTaWcgPSBudWxsO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlRyYW5zcG9ydFRpbWVsaW5lU2lnbmFsO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICAvKipcblx0XHQgKiBAY2xhc3MgVG9uZS5HcmFpblBsYXllciBpbXBsZW1lbnRzIFtncmFudWxhciBzeW50aGVzaXNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyYW51bGFyX3N5bnRoZXNpcykuXG5cdFx0ICogICAgICAgIEdyYW51bGFyIFN5bnRoZXNpcyBlbmFibGVzIHlvdSB0byBhZGp1c3QgcGl0Y2ggYW5kIHBsYXliYWNrIHJhdGUgaW5kZXBlbmRlbnRseS4gVGhlIGdyYWluU2l6ZSBpcyB0aGVcblx0XHQgKiAgICAgICAgYW1vdW50IG9mIHRpbWUgZWFjaCBzbWFsbCBjaHVuayBvZiBhdWRpbyBpcyBwbGF5ZWQgZm9yIGFuZCB0aGUgb3ZlcmxhcCBpcyB0aGVcblx0XHQgKiAgICAgICAgYW1vdW50IG9mIGNyb3NzZmFkaW5nIHRyYW5zaXRpb24gdGltZSBiZXR3ZWVuIHN1Y2Nlc3NpdmUgZ3JhaW5zLlxuXHRcdCAqIEBleHRlbmRzIHtUb25lLlNvdXJjZX1cblx0XHQgKiBAcGFyYW0ge1N0cmluZ3xUb25lLkJ1ZmZlcn0gdXJsXHRUaGUgdXJsIHRvIGxvYWQsIG9yIHRoZSBUb25lLkJ1ZmZlciB0byBwbGF5LlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb249fSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGFmdGVyIHRoZSB1cmwgaXMgbG9hZGVkLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5HcmFpblBsYXllciA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICd1cmwnLFxuXHQgICAgICAgICAgICAnb25sb2FkJ1xuXHQgICAgICAgIF0sIFRvbmUuR3JhaW5QbGF5ZXIpO1xuXHQgICAgICAgIFRvbmUuU291cmNlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGF1ZGlvIGJ1ZmZlciBiZWxvbmdpbmcgdG8gdGhlIHBsYXllci5cblx0XHRcdCAqICBAdHlwZSAge1RvbmUuQnVmZmVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVG9uZS5CdWZmZXIob3B0aW9ucy51cmwsIG9wdGlvbnMub25sb2FkKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBDcmVhdGUgYSByZXBlYXRpbmcgdGljayB0byBzY2hlZHVsZVxuXHRcdFx0ICogIHRoZSBncmFpbnMuXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLkNsb2NrfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9jbG9jayA9IG5ldyBUb25lLkNsb2NrKHRoaXMuX3RpY2suYmluZCh0aGlzKSwgb3B0aW9ucy5ncmFpblNpemUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEB0eXBlICB7TnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sb29wU3RhcnQgPSAwO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEB0eXBlICB7TnVtYmVyfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sb29wRW5kID0gMDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIEFsbCBvZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgQnVmZmVyU291cmNlc1xuXHRcdFx0ICogQHR5cGUge0FycmF5fVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2FjdGl2ZVNvdXJjZXMgPSBbXTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBAdHlwZSAge051bWJlcn1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcGxheWJhY2tSYXRlID0gb3B0aW9ucy5wbGF5YmFja1JhdGU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQHR5cGUgIHtOdW1iZXJ9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2dyYWluU2l6ZSA9IG9wdGlvbnMuZ3JhaW5TaXplO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKiAgQHR5cGUge051bWJlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX292ZXJsYXAgPSBvcHRpb25zLm92ZXJsYXA7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQWRqdXN0IHRoZSBwaXRjaCBpbmRlcGVuZGVudGx5IG9mIHRoZSBwbGF5YmFja1JhdGUuXG5cdFx0XHQgKiAgQHR5cGUgIHtDZW50c31cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZGV0dW5lID0gb3B0aW9ucy5kZXR1bmU7XG5cdCAgICAgICAgLy9zZXR1cFxuXHQgICAgICAgIHRoaXMub3ZlcmxhcCA9IG9wdGlvbnMub3ZlcmxhcDtcblx0ICAgICAgICB0aGlzLmxvb3AgPSBvcHRpb25zLmxvb3A7XG5cdCAgICAgICAgdGhpcy5wbGF5YmFja1JhdGUgPSBvcHRpb25zLnBsYXliYWNrUmF0ZTtcblx0ICAgICAgICB0aGlzLmdyYWluU2l6ZSA9IG9wdGlvbnMuZ3JhaW5TaXplO1xuXHQgICAgICAgIHRoaXMubG9vcFN0YXJ0ID0gb3B0aW9ucy5sb29wU3RhcnQ7XG5cdCAgICAgICAgdGhpcy5sb29wRW5kID0gb3B0aW9ucy5sb29wRW5kO1xuXHQgICAgICAgIHRoaXMucmV2ZXJzZSA9IG9wdGlvbnMucmV2ZXJzZTtcblx0ICAgICAgICB0aGlzLl9jbG9jay5vbignc3RvcCcsIHRoaXMuX29uc3RvcC5iaW5kKHRoaXMpKTtcblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLkdyYWluUGxheWVyLCBUb25lLlNvdXJjZSk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGRlZmF1bHQgcGFyYW1ldGVyc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5HcmFpblBsYXllci5kZWZhdWx0cyA9IHtcblx0ICAgICAgICAnb25sb2FkJzogVG9uZS5ub09wLFxuXHQgICAgICAgICdvdmVybGFwJzogMC4xLFxuXHQgICAgICAgICdncmFpblNpemUnOiAwLjIsXG5cdCAgICAgICAgJ3BsYXliYWNrUmF0ZSc6IDEsXG5cdCAgICAgICAgJ2RldHVuZSc6IDAsXG5cdCAgICAgICAgJ2xvb3AnOiBmYWxzZSxcblx0ICAgICAgICAnbG9vcFN0YXJ0JzogMCxcblx0ICAgICAgICAnbG9vcEVuZCc6IDAsXG5cdCAgICAgICAgJ3JldmVyc2UnOiBmYWxzZVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBQbGF5IHRoZSBidWZmZXIgYXQgdGhlIGdpdmVuIHN0YXJ0VGltZS4gT3B0aW9uYWxseSBhZGQgYW4gb2Zmc2V0XG5cdFx0ICogIGFuZC9vciBkdXJhdGlvbiB3aGljaCB3aWxsIHBsYXkgdGhlIGJ1ZmZlciBmcm9tIGEgcG9zaXRpb25cblx0XHQgKiAgd2l0aGluIHRoZSBidWZmZXIgZm9yIHRoZSBnaXZlbiBkdXJhdGlvbi5cblx0XHQgKlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbc3RhcnRUaW1lPW5vd10gV2hlbiB0aGUgcGxheWVyIHNob3VsZCBzdGFydC5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW29mZnNldD0wXSBUaGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2FtcGxlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydCBhdC5cblx0XHQgKiAgQHBhcmFtICB7VGltZT19IGR1cmF0aW9uIEhvdyBsb25nIHRoZSBzYW1wbGUgc2hvdWxkIHBsYXkuIElmIG5vIGR1cmF0aW9uXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGdpdmVuLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIGZ1bGwgbGVuZ3RoXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzYW1wbGUgKG1pbnVzIGFueSBvZmZzZXQpXG5cdFx0ICogIEByZXR1cm5zIHtUb25lLkdyYWluUGxheWVyfSB0aGlzXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLkdyYWluUGxheWVyI1xuXHRcdCAqICBAbWV0aG9kIHN0YXJ0XG5cdFx0ICogIEBuYW1lIHN0YXJ0XG5cdFx0ICovXG5cdCAgICAvKipcblx0XHQgKiAgSW50ZXJuYWwgc3RhcnQgbWV0aG9kXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gdGltZVxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IG9mZnNldFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5HcmFpblBsYXllci5wcm90b3R5cGUuX3N0YXJ0ID0gZnVuY3Rpb24gKHRpbWUsIG9mZnNldCwgZHVyYXRpb24pIHtcblx0ICAgICAgICBvZmZzZXQgPSBUb25lLmRlZmF1bHRBcmcob2Zmc2V0LCAwKTtcblx0ICAgICAgICBvZmZzZXQgPSB0aGlzLnRvU2Vjb25kcyhvZmZzZXQpO1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB0aGlzLl9vZmZzZXQgPSBvZmZzZXQ7XG5cdCAgICAgICAgdGhpcy5fY2xvY2suc3RhcnQodGltZSk7XG5cdCAgICAgICAgaWYgKGR1cmF0aW9uKSB7XG5cdCAgICAgICAgICAgIHRoaXMuc3RvcCh0aW1lICsgdGhpcy50b1NlY29uZHMoZHVyYXRpb24pKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIEludGVybmFsIHN0YXJ0IG1ldGhvZFxuXHRcdCAqICBAcGFyYW0ge1RpbWV9IHRpbWVcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuR3JhaW5QbGF5ZXIucHJvdG90eXBlLl9zdG9wID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICB0aGlzLl9jbG9jay5zdG9wKHRpbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIEludm9rZWQgd2hlbiB0aGUgY2xvY2sgaXMgc3RvcHBlZFxuXHRcdCAqIEBwYXJhbSAge051bWJlcn0gdGltZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkdyYWluUGxheWVyLnByb3RvdHlwZS5fb25zdG9wID0gZnVuY3Rpb24gKHRpbWUpIHtcblx0ICAgICAgICAvL3N0b3AgdGhlIHBsYXllcnNcblx0ICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuXHQgICAgICAgICAgICBzb3VyY2Uuc3RvcCh0aW1lLCAwKTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgSW52b2tlZCBvbiBlYWNoIGNsb2NrIHRpY2suIHNjaGVkdWxlZCBhIG5ld1xuXHRcdCAqICBncmFpbiBhdCB0aGlzIHRpbWUuXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9ICB0aW1lXG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLkdyYWluUGxheWVyLnByb3RvdHlwZS5fdGljayA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdmFyIGZhZGVJbiA9IHRoaXMuX29mZnNldCA8IHRoaXMuX292ZXJsYXAgPyAwIDogdGhpcy5fb3ZlcmxhcDtcblx0ICAgICAgICB2YXIgc291cmNlID0gbmV3IFRvbmUuQnVmZmVyU291cmNlKHtcblx0ICAgICAgICAgICAgJ2J1ZmZlcic6IHRoaXMuYnVmZmVyLFxuXHQgICAgICAgICAgICAnZmFkZUluJzogZmFkZUluLFxuXHQgICAgICAgICAgICAnZmFkZU91dCc6IHRoaXMuX292ZXJsYXAsXG5cdCAgICAgICAgICAgICdsb29wJzogdGhpcy5sb29wLFxuXHQgICAgICAgICAgICAnbG9vcFN0YXJ0JzogdGhpcy5fbG9vcFN0YXJ0LFxuXHQgICAgICAgICAgICAnbG9vcEVuZCc6IHRoaXMuX2xvb3BFbmQsXG5cdCAgICAgICAgICAgICdwbGF5YmFja1JhdGUnOiBUb25lLmludGVydmFsVG9GcmVxdWVuY3lSYXRpbyh0aGlzLmRldHVuZSAvIDEwMClcblx0ICAgICAgICB9KS5jb25uZWN0KHRoaXMub3V0cHV0KTtcblx0ICAgICAgICBzb3VyY2Uuc3RhcnQodGltZSwgdGhpcy5fb2Zmc2V0KTtcblx0ICAgICAgICB0aGlzLl9vZmZzZXQgKz0gdGhpcy5ncmFpblNpemU7XG5cdCAgICAgICAgc291cmNlLnN0b3AodGltZSArIHRoaXMuZ3JhaW5TaXplKTtcblx0ICAgICAgICAvL2FkZCBpdCB0byB0aGUgYWN0aXZlIHNvdXJjZXNcblx0ICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzLnB1c2goc291cmNlKTtcblx0ICAgICAgICAvL3JlbW92ZSBpdCB3aGVuIGl0J3MgZG9uZVxuXHQgICAgICAgIHNvdXJjZS5vbmVuZGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9hY3RpdmVTb3VyY2VzLmluZGV4T2Yoc291cmNlKTtcblx0ICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlU291cmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBKdW1wIHRvIGEgc3BlY2lmaWMgdGltZSBhbmQgcGxheSBpdC5cblx0XHQgKiAgQHBhcmFtICB7VGltZX0gIG9mZnNldCAgVGhlIG9mZnNldCB0byBqdW1wIHRvLlxuXHRcdCAqICBAcGFyYW0ge1RpbWU9fSB0aW1lIFdoZW4gdG8gbWFrZSB0aGUganVtcC5cblx0XHQgKiAgQHJldHVybiAge1RvbmUuR3JhaW5QbGF5ZXJ9ICB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLkdyYWluUGxheWVyLnByb3RvdHlwZS5zZWVrID0gZnVuY3Rpb24gKG9mZnNldCwgdGltZSkge1xuXHQgICAgICAgIHRoaXMuX29mZnNldCA9IHRoaXMudG9TZWNvbmRzKG9mZnNldCk7XG5cdCAgICAgICAgdGhpcy5fdGljayh0aGlzLnRvU2Vjb25kcyh0aW1lKSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIHNhbXBsZVxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkdyYWluUGxheWVyI1xuXHRcdCAqIEB0eXBlIHtQb3NpdGl2ZX1cblx0XHQgKiBAbmFtZSBwbGF5YmFja1JhdGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkdyYWluUGxheWVyLnByb3RvdHlwZSwgJ3BsYXliYWNrUmF0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJhdGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fcGxheWJhY2tSYXRlID0gcmF0ZTtcblx0ICAgICAgICAgICAgdGhpcy5ncmFpblNpemUgPSB0aGlzLl9ncmFpblNpemU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgbG9vcCBzdGFydCB0aW1lLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkdyYWluUGxheWVyI1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIGxvb3BTdGFydFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuR3JhaW5QbGF5ZXIucHJvdG90eXBlLCAnbG9vcFN0YXJ0Jywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9vcFN0YXJ0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9sb29wU3RhcnQgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBsb29wIGVuZCB0aW1lLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkdyYWluUGxheWVyI1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIGxvb3BFbmRcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLkdyYWluUGxheWVyLnByb3RvdHlwZSwgJ2xvb3BFbmQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb29wRW5kO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9sb29wRW5kID0gdGhpcy50b1NlY29uZHModGltZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgZGlyZWN0aW9uIHRoZSBidWZmZXIgc2hvdWxkIHBsYXkgaW5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5HcmFpblBsYXllciNcblx0XHQgKiBAdHlwZSB7Ym9vbGVhbn1cblx0XHQgKiBAbmFtZSByZXZlcnNlXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5HcmFpblBsYXllci5wcm90b3R5cGUsICdyZXZlcnNlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIucmV2ZXJzZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJldikge1xuXHQgICAgICAgICAgICB0aGlzLmJ1ZmZlci5yZXZlcnNlID0gcmV2O1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHNpemUgb2YgZWFjaCBjaHVuayBvZiBhdWRpbyB0aGF0IHRoZVxuXHRcdCAqIGJ1ZmZlciBpcyBjaG9wcGVkIGludG8gYW5kIHBsYXllZCBiYWNrIGF0LlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLkdyYWluUGxheWVyI1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIGdyYWluU2l6ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuR3JhaW5QbGF5ZXIucHJvdG90eXBlLCAnZ3JhaW5TaXplJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ3JhaW5TaXplO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoc2l6ZSkge1xuXHQgICAgICAgICAgICB0aGlzLl9ncmFpblNpemUgPSB0aGlzLnRvU2Vjb25kcyhzaXplKTtcblx0ICAgICAgICAgICAgdGhpcy5fY2xvY2suZnJlcXVlbmN5LnZhbHVlID0gdGhpcy5fcGxheWJhY2tSYXRlIC8gdGhpcy5fZ3JhaW5TaXplO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhpcyBpcyB0aGUgZHVyYXRpb24gb2YgdGhlIGNyb3NzLWZhZGUgYmV0d2VlblxuXHRcdCAqIHN1Y2Vzc2l2ZSBncmFpbnMuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuR3JhaW5QbGF5ZXIjXG5cdFx0ICogQHR5cGUge1RpbWV9XG5cdFx0ICogQG5hbWUgb3ZlcmxhcFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuR3JhaW5QbGF5ZXIucHJvdG90eXBlLCAnb3ZlcmxhcCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXA7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX292ZXJsYXAgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIENsZWFuIHVwXG5cdFx0ICogQHJldHVybiB7VG9uZS5HcmFpblBsYXllcn0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5HcmFpblBsYXllci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBUb25lLlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuYnVmZmVyLmRpc3Bvc2UoKTtcblx0ICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fY2xvY2suZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX2Nsb2NrID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuXHQgICAgICAgICAgICBzb3VyY2UuZGlzcG9zZSgpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHRoaXMuX2FjdGl2ZVNvdXJjZXMgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLkdyYWluUGxheWVyO1xuXHR9KTtcblx0TW9kdWxlKGZ1bmN0aW9uIChUb25lKSB7XG5cdCAgICBcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgIFRvbmUuUGxheWVyIGlzIGFuIGF1ZGlvIGZpbGUgcGxheWVyIHdpdGggc3RhcnQsIGxvb3AsIGFuZCBzdG9wIGZ1bmN0aW9ucy5cblx0XHQgKlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuU291cmNlfVxuXHRcdCAqICBAcGFyYW0ge3N0cmluZ3xBdWRpb0J1ZmZlcn0gdXJsIEVpdGhlciB0aGUgQXVkaW9CdWZmZXIgb3IgdGhlIHVybCBmcm9tXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdG8gbG9hZCB0aGUgQXVkaW9CdWZmZXJcblx0XHQgKiAgQHBhcmFtIHtGdW5jdGlvbj19IG9ubG9hZCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdGhlIGJ1ZmZlciBpcyBsb2FkZWQuXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb21tZW5kZWQgdG8gdXNlIFRvbmUuQnVmZmVyLm9uKCdsb2FkJykgaW5zdGVhZC5cblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiB2YXIgcGxheWVyID0gbmV3IFRvbmUuUGxheWVyKFwiLi9wYXRoL3RvL3NhbXBsZS5tcDNcIikudG9NYXN0ZXIoKTtcblx0XHQgKiAvL3BsYXkgYXMgc29vbiBhcyB0aGUgYnVmZmVyIGlzIGxvYWRlZFxuXHRcdCAqIHBsYXllci5hdXRvc3RhcnQgPSB0cnVlO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5QbGF5ZXIgPSBmdW5jdGlvbiAodXJsKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnM7XG5cdCAgICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIFRvbmUuQnVmZmVyICYmIHVybC5sb2FkZWQpIHtcblx0ICAgICAgICAgICAgdXJsID0gdXJsLmdldCgpO1xuXHQgICAgICAgICAgICBvcHRpb25zID0gVG9uZS5QbGF5ZXIuZGVmYXVsdHM7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgb3B0aW9ucyA9IFRvbmUuZGVmYXVsdHMoYXJndW1lbnRzLCBbXG5cdCAgICAgICAgICAgICAgICAndXJsJyxcblx0ICAgICAgICAgICAgICAgICdvbmxvYWQnXG5cdCAgICAgICAgICAgIF0sIFRvbmUuUGxheWVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgVG9uZS5Tb3VyY2UuY2FsbCh0aGlzLCBvcHRpb25zKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBJZiB0aGUgZmlsZSBzaG91bGQgcGxheSBhcyBzb29uXG5cdFx0XHQgKiAgYXMgdGhlIGJ1ZmZlciBpcyBsb2FkZWQuXG5cdFx0XHQgKiAgQHR5cGUge0Jvb2xlYW59XG5cdFx0XHQgKiAgQGV4YW1wbGVcblx0XHRcdCAqIC8vd2lsbCBwbGF5IGFzIHNvb24gYXMgaXQncyBsb2FkZWRcblx0XHRcdCAqIHZhciBwbGF5ZXIgPSBuZXcgVG9uZS5QbGF5ZXIoe1xuXHRcdFx0ICogXHRcInVybFwiIDogXCIuL3BhdGgvdG8vc2FtcGxlLm1wM1wiLFxuXHRcdFx0ICogXHRcImF1dG9zdGFydFwiIDogdHJ1ZSxcblx0XHRcdCAqIH0pLnRvTWFzdGVyKCk7XG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLmF1dG9zdGFydCA9IG9wdGlvbnMuYXV0b3N0YXJ0O1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBidWZmZXJcblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICogIEB0eXBlIHtUb25lLkJ1ZmZlcn1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2J1ZmZlciA9IG5ldyBUb25lLkJ1ZmZlcih7XG5cdCAgICAgICAgICAgICd1cmwnOiBvcHRpb25zLnVybCxcblx0ICAgICAgICAgICAgJ29ubG9hZCc6IHRoaXMuX29ubG9hZC5iaW5kKHRoaXMsIG9wdGlvbnMub25sb2FkKSxcblx0ICAgICAgICAgICAgJ3JldmVyc2UnOiBvcHRpb25zLnJldmVyc2Vcblx0ICAgICAgICB9KTtcblx0ICAgICAgICBpZiAodXJsIGluc3RhbmNlb2YgQXVkaW9CdWZmZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVyLnNldCh1cmwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvKipcblx0XHRcdCAqICBpZiB0aGUgYnVmZmVyIHNob3VsZCBsb29wIG9uY2UgaXQncyBvdmVyXG5cdFx0XHQgKiAgQHR5cGUge0Jvb2xlYW59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2xvb3AgPSBvcHRpb25zLmxvb3A7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgaWYgJ2xvb3AnIGlzIHRydWUsIHRoZSBsb29wIHdpbGwgc3RhcnQgYXQgdGhpcyBwb3NpdGlvblxuXHRcdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sb29wU3RhcnQgPSBvcHRpb25zLmxvb3BTdGFydDtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBpZiAnbG9vcCcgaXMgdHJ1ZSwgdGhlIGxvb3Agd2lsbCBlbmQgYXQgdGhpcyBwb3NpdGlvblxuXHRcdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICogIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sb29wRW5kID0gb3B0aW9ucy5sb29wRW5kO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIHRoZSBwbGF5YmFjayByYXRlXG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqICBAdHlwZSB7TnVtYmVyfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fcGxheWJhY2tSYXRlID0gb3B0aW9ucy5wbGF5YmFja1JhdGU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgQWxsIG9mIHRoZSBhY3RpdmUgYnVmZmVyIHNvdXJjZSBub2Rlc1xuXHRcdFx0ICogIEB0eXBlIHtBcnJheTxUb25lLkJ1ZmZlclNvdXJjZT59XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2FjdGl2ZVNvdXJjZXMgPSBbXTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZWxhcHNlZCB0aW1lIGNvdW50ZXIuXG5cdFx0XHQgKiAgQHR5cGUge1RvbmUuVGlja1NvdXJjZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fZWxhcHNlZFRpbWUgPSBuZXcgVG9uZS5UaWNrU291cmNlKG9wdGlvbnMucGxheWJhY2tSYXRlKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgZmFkZUluIHRpbWUgb2YgdGhlIGFtcGxpdHVkZSBlbnZlbG9wZS5cblx0XHRcdCAqICBAdHlwZSB7VGltZX1cblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuZmFkZUluID0gb3B0aW9ucy5mYWRlSW47XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIGZhZGVPdXQgdGltZSBvZiB0aGUgYW1wbGl0dWRlIGVudmVsb3BlLlxuXHRcdFx0ICogIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5mYWRlT3V0ID0gb3B0aW9ucy5mYWRlT3V0O1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuUGxheWVyLCBUb25lLlNvdXJjZSk7XG5cdCAgICAvKipcblx0XHQgKiAgdGhlIGRlZmF1bHQgcGFyYW1ldGVyc1xuXHRcdCAqICBAc3RhdGljXG5cdFx0ICogIEBjb25zdFxuXHRcdCAqICBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QbGF5ZXIuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ29ubG9hZCc6IFRvbmUubm9PcCxcblx0ICAgICAgICAncGxheWJhY2tSYXRlJzogMSxcblx0ICAgICAgICAnbG9vcCc6IGZhbHNlLFxuXHQgICAgICAgICdhdXRvc3RhcnQnOiBmYWxzZSxcblx0ICAgICAgICAnbG9vcFN0YXJ0JzogMCxcblx0ICAgICAgICAnbG9vcEVuZCc6IDAsXG5cdCAgICAgICAgJ3JldHJpZ2dlcic6IGZhbHNlLFxuXHQgICAgICAgICdyZXZlcnNlJzogZmFsc2UsXG5cdCAgICAgICAgJ2ZhZGVJbic6IDAsXG5cdCAgICAgICAgJ2ZhZGVPdXQnOiAwXG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIExvYWQgdGhlIGF1ZGlvIGZpbGUgYXMgYW4gYXVkaW8gYnVmZmVyLlxuXHRcdCAqICBEZWNvZGVzIHRoZSBhdWRpbyBhc3luY2hyb25vdXNseSBhbmQgaW52b2tlc1xuXHRcdCAqICB0aGUgY2FsbGJhY2sgb25jZSB0aGUgYXVkaW8gYnVmZmVyIGxvYWRzLlxuXHRcdCAqICBOb3RlOiB0aGlzIGRvZXMgbm90IG5lZWQgdG8gYmUgY2FsbGVkIGlmIGEgdXJsXG5cdFx0ICogIHdhcyBwYXNzZWQgaW4gdG8gdGhlIGNvbnN0cnVjdG9yLiBPbmx5IHVzZSB0aGlzXG5cdFx0ICogIGlmIHlvdSB3YW50IHRvIG1hbnVhbGx5IGxvYWQgYSBuZXcgdXJsLlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIHVybCBvZiB0aGUgYnVmZmVyIHRvIGxvYWQuXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICBGaWxldHlwZSBzdXBwb3J0IGRlcGVuZHMgb24gdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICBicm93c2VyLlxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbj19IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBpbnZva2Ugb25jZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1wbGUgaXMgbG9hZGVkLlxuXHRcdCAqICBAcmV0dXJucyB7UHJvbWlzZX1cblx0XHQgKi9cblx0ICAgIFRvbmUuUGxheWVyLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKHVybCwgY2FsbGJhY2spIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmxvYWQodXJsLCB0aGlzLl9vbmxvYWQuYmluZCh0aGlzLCBjYWxsYmFjaykpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIEludGVybmFsIGNhbGxiYWNrIHdoZW4gdGhlIGJ1ZmZlciBpcyBsb2FkZWQuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUGxheWVyLnByb3RvdHlwZS5fb25sb2FkID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdCAgICAgICAgY2FsbGJhY2sgPSBUb25lLmRlZmF1bHRBcmcoY2FsbGJhY2ssIFRvbmUubm9PcCk7XG5cdCAgICAgICAgY2FsbGJhY2sodGhpcyk7XG5cdCAgICAgICAgaWYgKHRoaXMuYXV0b3N0YXJ0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuc3RhcnQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogSW50ZXJuYWwgY2FsbGJhY2sgd2hlbiB0aGUgYnVmZmVyIGlzIGRvbmUgcGxheWluZy5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QbGF5ZXIucHJvdG90eXBlLl9vblNvdXJjZUVuZCA9IGZ1bmN0aW9uIChzb3VyY2UpIHtcblx0ICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9hY3RpdmVTb3VyY2VzLmluZGV4T2Yoc291cmNlKTtcblx0ICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzLnNwbGljZShpbmRleCwgMSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFBsYXkgdGhlIGJ1ZmZlciBhdCB0aGUgZ2l2ZW4gc3RhcnRUaW1lLiBPcHRpb25hbGx5IGFkZCBhbiBvZmZzZXRcblx0XHQgKiAgYW5kL29yIGR1cmF0aW9uIHdoaWNoIHdpbGwgcGxheSB0aGUgYnVmZmVyIGZyb20gYSBwb3NpdGlvblxuXHRcdCAqICB3aXRoaW4gdGhlIGJ1ZmZlciBmb3IgdGhlIGdpdmVuIGR1cmF0aW9uLlxuXHRcdCAqXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFtzdGFydFRpbWU9bm93XSBXaGVuIHRoZSBwbGF5ZXIgc2hvdWxkIHN0YXJ0LlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbb2Zmc2V0PTBdIFRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzYW1wbGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YXJ0IGF0LlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lPX0gZHVyYXRpb24gSG93IGxvbmcgdGhlIHNhbXBsZSBzaG91bGQgcGxheS4gSWYgbm8gZHVyYXRpb25cblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZ2l2ZW4sIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgZnVsbCBsZW5ndGhcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNhbXBsZSAobWludXMgYW55IG9mZnNldClcblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGxheWVyfSB0aGlzXG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlBsYXllciNcblx0XHQgKiAgQG1ldGhvZCBzdGFydFxuXHRcdCAqICBAbmFtZSBzdGFydFxuXHRcdCAqL1xuXHQgICAgLyoqXG5cdFx0ICogIEludGVybmFsIHN0YXJ0IG1ldGhvZFxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QbGF5ZXIucHJvdG90eXBlLl9zdGFydCA9IGZ1bmN0aW9uIChzdGFydFRpbWUsIG9mZnNldCwgZHVyYXRpb24pIHtcblx0ICAgICAgICAvL2lmIGl0J3MgYSBsb29wIHRoZSBkZWZhdWx0IG9mZnNldCBpcyB0aGUgbG9vcHN0YXJ0IHBvaW50XG5cdCAgICAgICAgaWYgKHRoaXMuX2xvb3ApIHtcblx0ICAgICAgICAgICAgb2Zmc2V0ID0gVG9uZS5kZWZhdWx0QXJnKG9mZnNldCwgdGhpcy5fbG9vcFN0YXJ0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAvL290aGVyd2lzZSB0aGUgZGVmYXVsdCBvZmZzZXQgaXMgMFxuXHQgICAgICAgICAgICBvZmZzZXQgPSBUb25lLmRlZmF1bHRBcmcob2Zmc2V0LCAwKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9jb21wdXRlIHRoZSB2YWx1ZXMgaW4gc2Vjb25kc1xuXHQgICAgICAgIG9mZnNldCA9IHRoaXMudG9TZWNvbmRzKG9mZnNldCk7XG5cdCAgICAgICAgdmFyIGNvbXB1dGVkRHVyYXRpb24gPSBUb25lLmRlZmF1bHRBcmcoZHVyYXRpb24sIE1hdGgubWF4KHRoaXMuX2J1ZmZlci5kdXJhdGlvbiAtIG9mZnNldCwgMCkpO1xuXHQgICAgICAgIGNvbXB1dGVkRHVyYXRpb24gPSB0aGlzLnRvU2Vjb25kcyhjb21wdXRlZER1cmF0aW9uKTtcblx0ICAgICAgICBzdGFydFRpbWUgPSB0aGlzLnRvU2Vjb25kcyhzdGFydFRpbWUpO1xuXHQgICAgICAgIC8vc3RhcnQgdGhlIGVsYXBzZWQgdGltZSBjb3VudGVyXG5cdCAgICAgICAgdGhpcy5fZWxhcHNlZFRpbWUuc3RhcnQoc3RhcnRUaW1lLCBvZmZzZXQpO1xuXHQgICAgICAgIC8vbWFrZSB0aGUgc291cmNlXG5cdCAgICAgICAgdmFyIHNvdXJjZSA9IG5ldyBUb25lLkJ1ZmZlclNvdXJjZSh7XG5cdCAgICAgICAgICAgICdidWZmZXInOiB0aGlzLl9idWZmZXIsXG5cdCAgICAgICAgICAgICdsb29wJzogdGhpcy5fbG9vcCxcblx0ICAgICAgICAgICAgJ2xvb3BTdGFydCc6IHRoaXMuX2xvb3BTdGFydCxcblx0ICAgICAgICAgICAgJ2xvb3BFbmQnOiB0aGlzLl9sb29wRW5kLFxuXHQgICAgICAgICAgICAnb25lbmRlZCc6IHRoaXMuX29uU291cmNlRW5kLmJpbmQodGhpcyksXG5cdCAgICAgICAgICAgICdwbGF5YmFja1JhdGUnOiB0aGlzLl9wbGF5YmFja1JhdGUsXG5cdCAgICAgICAgICAgICdmYWRlSW4nOiB0aGlzLmZhZGVJbixcblx0ICAgICAgICAgICAgJ2ZhZGVPdXQnOiB0aGlzLmZhZGVPdXRcblx0ICAgICAgICB9KS5jb25uZWN0KHRoaXMub3V0cHV0KTtcblx0ICAgICAgICAvL3NldCB0aGUgbG9vcGluZyBwcm9wZXJ0aWVzXG5cdCAgICAgICAgaWYgKCF0aGlzLl9sb29wICYmICF0aGlzLl9zeW5jZWQpIHtcblx0ICAgICAgICAgICAgLy9pZiBpdCdzIG5vdCBsb29waW5nLCBzZXQgdGhlIHN0YXRlIGNoYW5nZSBhdCB0aGUgZW5kIG9mIHRoZSBzYW1wbGVcblx0ICAgICAgICAgICAgdGhpcy5fc3RhdGUuc2V0U3RhdGVBdFRpbWUoVG9uZS5TdGF0ZS5TdG9wcGVkLCBzdGFydFRpbWUgKyBjb21wdXRlZER1cmF0aW9uIC8gdGhpcy5fcGxheWJhY2tSYXRlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy9hZGQgaXQgdG8gdGhlIGFycmF5IG9mIGFjdGl2ZSBzb3VyY2VzXG5cdCAgICAgICAgdGhpcy5fYWN0aXZlU291cmNlcy5wdXNoKHNvdXJjZSk7XG5cdCAgICAgICAgLy9zdGFydCBpdFxuXHQgICAgICAgIGlmICh0aGlzLl9sb29wICYmIFRvbmUuaXNVbmRlZihkdXJhdGlvbikpIHtcblx0ICAgICAgICAgICAgc291cmNlLnN0YXJ0KHN0YXJ0VGltZSwgb2Zmc2V0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBzb3VyY2Uuc3RhcnQoc3RhcnRUaW1lLCBvZmZzZXQsIGNvbXB1dGVkRHVyYXRpb24pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU3RvcCBwbGF5YmFjay5cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKiAgQHBhcmFtICB7VGltZX0gW3RpbWU9bm93XVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QbGF5ZXJ9IHRoaXNcblx0XHQgKi9cblx0ICAgIFRvbmUuUGxheWVyLnByb3RvdHlwZS5fc3RvcCA9IGZ1bmN0aW9uICh0aW1lKSB7XG5cdCAgICAgICAgdGltZSA9IHRoaXMudG9TZWNvbmRzKHRpbWUpO1xuXHQgICAgICAgIHRoaXMuX2VsYXBzZWRUaW1lLnN0b3AodGltZSk7XG5cdCAgICAgICAgdGhpcy5fYWN0aXZlU291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcblx0ICAgICAgICAgICAgc291cmNlLnN0b3AodGltZSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3RvcCBhbmQgdGhlbiByZXN0YXJ0IHRoZSBwbGF5ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIChvciBvZmZzZXQpXG5cdFx0ICogIEBwYXJhbSAge1RpbWV9IFtzdGFydFRpbWU9bm93XSBXaGVuIHRoZSBwbGF5ZXIgc2hvdWxkIHN0YXJ0LlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lfSBbb2Zmc2V0PTBdIFRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzYW1wbGVcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YXJ0IGF0LlxuXHRcdCAqICBAcGFyYW0gIHtUaW1lPX0gZHVyYXRpb24gSG93IGxvbmcgdGhlIHNhbXBsZSBzaG91bGQgcGxheS4gSWYgbm8gZHVyYXRpb25cblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZ2l2ZW4sIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgZnVsbCBsZW5ndGhcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHNhbXBsZSAobWludXMgYW55IG9mZnNldClcblx0XHQgKiAgQHJldHVybnMge1RvbmUuUGxheWVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBsYXllci5wcm90b3R5cGUucmVzdGFydCA9IGZ1bmN0aW9uICh0aW1lLCBvZmZzZXQsIGR1cmF0aW9uKSB7XG5cdCAgICAgICAgdGhpcy5fc3RvcCh0aW1lKTtcblx0ICAgICAgICB0aGlzLl9zdGFydCh0aW1lLCBvZmZzZXQsIGR1cmF0aW9uKTtcblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2VlayB0byBhIHNwZWNpZmljIHRpbWUgaW4gdGhlIHBsYXllcidzIGJ1ZmZlci4gSWYgdGhlXG5cdFx0ICogIHNvdXJjZSBpcyBubyBsb25nZXIgcGxheWluZyBhdCB0aGF0IHRpbWUsIGl0IHdpbGwgc3RvcC5cblx0XHQgKiAgSWYgeW91IHNlZWsgdG8gYSB0aW1lIHRoYXRcblx0XHQgKiAgQHBhcmFtIHtUaW1lfSBvZmZzZXQgVGhlIHRpbWUgdG8gc2VlayB0by5cblx0XHQgKiAgQHBhcmFtIHtUaW1lPX0gdGltZSBUaGUgdGltZSBmb3IgdGhlIHNlZWsgZXZlbnQgdG8gb2NjdXIuXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuUGxheWVyfSB0aGlzXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogc291cmNlLnN0YXJ0KDAuMik7XG5cdFx0ICogc291cmNlLnN0b3AoMC40KTtcblx0XHQgKi9cblx0ICAgIFRvbmUuUGxheWVyLnByb3RvdHlwZS5zZWVrID0gZnVuY3Rpb24gKG9mZnNldCwgdGltZSkge1xuXHQgICAgICAgIHRpbWUgPSB0aGlzLnRvU2Vjb25kcyh0aW1lKTtcblx0ICAgICAgICBpZiAodGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUodGltZSkgPT09IFRvbmUuU3RhdGUuU3RhcnRlZCkge1xuXHQgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnRvU2Vjb25kcyhvZmZzZXQpO1xuXHQgICAgICAgICAgICAvLyBpZiBpdCdzIGN1cnJlbnRseSBwbGF5aW5nLCBzdG9wIGl0XG5cdCAgICAgICAgICAgIHRoaXMuX3N0b3AodGltZSk7XG5cdCAgICAgICAgICAgIC8vcmVzdGFydCBpdCBhdCB0aGUgZ2l2ZW4gdGltZVxuXHQgICAgICAgICAgICB0aGlzLl9zdGFydCh0aW1lLCBvZmZzZXQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgU2V0IHRoZSBsb29wIHN0YXJ0IGFuZCBlbmQuIFdpbGwgb25seSBsb29wIGlmIGxvb3AgaXNcblx0XHQgKiAgc2V0IHRvIHRydWUuXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gbG9vcFN0YXJ0IFRoZSBsb29wIGVuZCB0aW1lXG5cdFx0ICogIEBwYXJhbSB7VGltZX0gbG9vcEVuZCBUaGUgbG9vcCBlbmQgdGltZVxuXHRcdCAqICBAcmV0dXJucyB7VG9uZS5QbGF5ZXJ9IHRoaXNcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiAvL2xvb3AgMC4xIHNlY29uZHMgb2YgdGhlIGZpbGUuXG5cdFx0ICogcGxheWVyLnNldExvb3BQb2ludHMoMC4yLCAwLjMpO1xuXHRcdCAqIHBsYXllci5sb29wID0gdHJ1ZTtcblx0XHQgKi9cblx0ICAgIFRvbmUuUGxheWVyLnByb3RvdHlwZS5zZXRMb29wUG9pbnRzID0gZnVuY3Rpb24gKGxvb3BTdGFydCwgbG9vcEVuZCkge1xuXHQgICAgICAgIHRoaXMubG9vcFN0YXJ0ID0gbG9vcFN0YXJ0O1xuXHQgICAgICAgIHRoaXMubG9vcEVuZCA9IGxvb3BFbmQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogSWYgbG9vcCBpcyB0cnVlLCB0aGUgbG9vcCB3aWxsIHN0YXJ0IGF0IHRoaXMgcG9zaXRpb24uXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuUGxheWVyI1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIGxvb3BTdGFydFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGxheWVyLnByb3RvdHlwZSwgJ2xvb3BTdGFydCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvb3BTdGFydDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGxvb3BTdGFydCkge1xuXHQgICAgICAgICAgICB0aGlzLl9sb29wU3RhcnQgPSBsb29wU3RhcnQ7XG5cdCAgICAgICAgICAgIC8vZ2V0IHRoZSBjdXJyZW50IHNvdXJjZVxuXHQgICAgICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuXHQgICAgICAgICAgICAgICAgc291cmNlLmxvb3BTdGFydCA9IGxvb3BTdGFydDtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBJZiBsb29wIGlzIHRydWUsIHRoZSBsb29wIHdpbGwgZW5kIGF0IHRoaXMgcG9zaXRpb24uXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuUGxheWVyI1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIGxvb3BFbmRcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBsYXllci5wcm90b3R5cGUsICdsb29wRW5kJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9vcEVuZDtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKGxvb3BFbmQpIHtcblx0ICAgICAgICAgICAgdGhpcy5fbG9vcEVuZCA9IGxvb3BFbmQ7XG5cdCAgICAgICAgICAgIC8vZ2V0IHRoZSBjdXJyZW50IHNvdXJjZVxuXHQgICAgICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuXHQgICAgICAgICAgICAgICAgc291cmNlLmxvb3BFbmQgPSBsb29wRW5kO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBhdWRpbyBidWZmZXIgYmVsb25naW5nIHRvIHRoZSBwbGF5ZXIuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuUGxheWVyI1xuXHRcdCAqIEB0eXBlIHtUb25lLkJ1ZmZlcn1cblx0XHQgKiBAbmFtZSBidWZmZXJcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBsYXllci5wcm90b3R5cGUsICdidWZmZXInLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChidWZmZXIpIHtcblx0ICAgICAgICAgICAgdGhpcy5fYnVmZmVyLnNldChidWZmZXIpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogSWYgdGhlIGJ1ZmZlciBzaG91bGQgbG9vcCBvbmNlIGl0J3Mgb3Zlci5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QbGF5ZXIjXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XG5cdFx0ICogQG5hbWUgbG9vcFxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGxheWVyLnByb3RvdHlwZSwgJ2xvb3AnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb29wO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAobG9vcCkge1xuXHQgICAgICAgICAgICAvL2lmIG5vIGNoYW5nZSwgZG8gbm90aGluZ1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fbG9vcCA9PT0gbG9vcCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX2xvb3AgPSBsb29wO1xuXHQgICAgICAgICAgICB2YXIgbm93ID0gdGhpcy5ub3coKTtcblx0ICAgICAgICAgICAgaWYgKCFsb29wKSB7XG5cdCAgICAgICAgICAgICAgICAvL3N0b3AgdGhlIHBsYXliYWNrIG9uIHRoZSBuZXh0IGN5Y2xlXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9zdG9wQXROZXh0SXRlcmF0aW9uKG5vdyk7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAvL3JlbW92ZSB0aGUgbmV4dCBzdG9wRXZlbnRcblx0ICAgICAgICAgICAgICAgIHZhciBzdG9wRXZlbnQgPSB0aGlzLl9zdGF0ZS5nZXROZXh0U3RhdGUoVG9uZS5TdGF0ZS5TdG9wcGVkLCBub3cpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHN0b3BFdmVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZVNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5sb29wID0gbG9vcDtcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZS5jYW5jZWwoc3RvcEV2ZW50LnRpbWUpO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsYXBzZWRUaW1lLmNhbmNlbChzdG9wRXZlbnQudGltZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBTY2hlZHVsZXMgYSBzdG9wIGV2ZW50IGF0IHRoZSBuZXh0IGZ1bGwgaXRlcmF0aW9uLiBVc2VkXG5cdFx0ICogIGZvciBzY2hlZHVsaW5nIHN0b3Agd2hlbiB0aGUgbG9vcCBzdGF0ZSBvciBwbGF5YmFja1JhdGUgY2hhbmdlc1xuXHRcdCAqICBAcGFyYW0gIHtOdW1iZXJ9ICBub3cgIFRoZSBjdXJyZW50IHRpbWVcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUGxheWVyLnByb3RvdHlwZS5fc3RvcEF0TmV4dEl0ZXJhdGlvbiA9IGZ1bmN0aW9uIChub3cpIHtcblx0ICAgICAgICBpZiAodGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUobm93KSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkKSB7XG5cdCAgICAgICAgICAgIHZhciBuZXh0U3RvcCA9IHRoaXMuX3N0YXRlLmdldE5leHRTdGF0ZShUb25lLlN0YXRlLlN0b3BwZWQsIG5vdyk7XG5cdCAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuX2VsYXBzZWRUaW1lLmdldFRpY2tzQXRUaW1lKG5vdyk7XG5cdCAgICAgICAgICAgIHZhciBpdGVyYXRpb25zID0gTWF0aC5tYXgoTWF0aC5jZWlsKHBvc2l0aW9uIC8gdGhpcy5idWZmZXIuZHVyYXRpb24pLCAxKTtcblx0ICAgICAgICAgICAgdmFyIHN0b3BUaW1lID0gdGhpcy5fZWxhcHNlZFRpbWUuZ2V0VGltZU9mVGljayhpdGVyYXRpb25zICogdGhpcy5idWZmZXIuZHVyYXRpb24sIG5leHRTdG9wID8gbmV4dFN0b3AudGltZSAtIHRoaXMuc2FtcGxlVGltZSA6IEluZmluaXR5KTtcblx0ICAgICAgICAgICAgdGhpcy5zdG9wKHN0b3BUaW1lKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHBsYXliYWNrIHNwZWVkLiAxIGlzIG5vcm1hbCBzcGVlZC4gVGhpcyBpcyBub3QgYSBzaWduYWwgYmVjYXVzZVxuXHRcdCAqIFNhZmFyaSBhbmQgaU9TIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IHBsYXliYWNrUmF0ZSBhcyBhIHNpZ25hbC5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QbGF5ZXIjXG5cdFx0ICogQHR5cGUge051bWJlcn1cblx0XHQgKiBAbmFtZSBwbGF5YmFja1JhdGVcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBsYXllci5wcm90b3R5cGUsICdwbGF5YmFja1JhdGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9wbGF5YmFja1JhdGU7XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChyYXRlKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3BsYXliYWNrUmF0ZSA9IHJhdGU7XG5cdCAgICAgICAgICAgIHZhciBub3cgPSB0aGlzLm5vdygpO1xuXHQgICAgICAgICAgICB0aGlzLl9lbGFwc2VkVGltZS5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUocmF0ZSwgbm93KTtcblx0ICAgICAgICAgICAgLy9pZiBpdCdzIG5vdCBsb29waW5nXG5cdCAgICAgICAgICAgIGlmICghdGhpcy5fbG9vcCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5fc3RvcEF0TmV4dEl0ZXJhdGlvbihub3cpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vc2V0IGFsbCB0aGUgc291cmNlc1xuXHQgICAgICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZSkge1xuXHQgICAgICAgICAgICAgICAgc291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShyYXRlLCBub3cpO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIG9mIHRoZSBidWZmZXIuIFxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlBsYXllciNcblx0XHQgKiBAdHlwZSB7TnVtYmVyfVxuXHRcdCAqIEBuYW1lIHBvc2l0aW9uXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QbGF5ZXIucHJvdG90eXBlLCAncG9zaXRpb24nLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHZhciBub3cgPSB0aGlzLm5vdygpO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUuZ2V0VmFsdWVBdFRpbWUobm93KSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkICYmIHRoaXMubG9hZGVkKSB7XG5cdCAgICAgICAgICAgICAgICB2YXIgZHVyYXRpb24gPSB0aGlzLmJ1ZmZlci5kdXJhdGlvbjtcblx0ICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IHRoaXMuX2VsYXBzZWRUaW1lLmdldFRpY2tzQXRUaW1lKG5vdyk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gJSBkdXJhdGlvbjtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAwO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBUaGUgZGlyZWN0aW9uIHRoZSBidWZmZXIgc2hvdWxkIHBsYXkgaW5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5QbGF5ZXIjXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XG5cdFx0ICogQG5hbWUgcmV2ZXJzZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGxheWVyLnByb3RvdHlwZSwgJ3JldmVyc2UnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIucmV2ZXJzZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKHJldikge1xuXHQgICAgICAgICAgICB0aGlzLl9idWZmZXIucmV2ZXJzZSA9IHJldjtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIElmIGFsbCB0aGUgYnVmZmVyIGlzIGxvYWRlZFxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlBsYXllciNcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKiBAbmFtZSBsb2FkZWRcblx0XHQgKiBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBsYXllci5wcm90b3R5cGUsICdsb2FkZWQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIubG9hZGVkO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogIERpc3Bvc2UgYW5kIGRpc2Nvbm5lY3QuXG5cdFx0ICogIEByZXR1cm4ge1RvbmUuUGxheWVyfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBsYXllci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAvL2Rpc2Nvbm5lY3QgYWxsIG9mIHRoZSBwbGF5ZXJzXG5cdCAgICAgICAgdGhpcy5fYWN0aXZlU291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2UpIHtcblx0ICAgICAgICAgICAgc291cmNlLmRpc3Bvc2UoKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLl9hY3RpdmVTb3VyY2VzID0gbnVsbDtcblx0ICAgICAgICBUb25lLlNvdXJjZS5wcm90b3R5cGUuZGlzcG9zZS5jYWxsKHRoaXMpO1xuXHQgICAgICAgIHRoaXMuX2J1ZmZlci5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fYnVmZmVyID0gbnVsbDtcblx0ICAgICAgICB0aGlzLl9lbGFwc2VkVGltZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fZWxhcHNlZFRpbWUgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIHJldHVybiBUb25lLlBsYXllcjtcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLlBsYXllcnMgY29tYmluZXMgbXVsdGlwbGUgW1RvbmUuUGxheWVyXShQbGF5ZXIpIG9iamVjdHMuXG5cdFx0ICpcblx0XHQgKiAgQGNvbnN0cnVjdG9yXG5cdFx0ICogIEBleHRlbmRzIHtUb25lLkF1ZGlvTm9kZX1cblx0XHQgKiAgQHBhcmFtIHtPYmplY3R9IHVybHMgQW4gb2JqZWN0IG1hcHBpbmcgYSBuYW1lIHRvIGEgdXJsLlxuXHRcdCAqICBAcGFyYW0ge2Z1bmN0aW9uPX0gb25sb2FkIFRoZSBmdW5jdGlvbiB0byBpbnZva2Ugd2hlbiBhbGwgYnVmZmVycyBhcmUgbG9hZGVkLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5QbGF5ZXJzID0gZnVuY3Rpb24gKHVybHMpIHtcblx0ICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdCAgICAgICAgYXJncy5zaGlmdCgpO1xuXHQgICAgICAgIHZhciBvcHRpb25zID0gVG9uZS5kZWZhdWx0cyhhcmdzLCBbJ29ubG9hZCddLCBUb25lLlBsYXllcnMpO1xuXHQgICAgICAgIFRvbmUuY2FsbCh0aGlzKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqICBUaGUgb3V0cHV0IHZvbHVtZSBub2RlXG5cdFx0XHQgKiAgQHR5cGUgIHtUb25lLlZvbHVtZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fdm9sdW1lID0gdGhpcy5vdXRwdXQgPSBuZXcgVG9uZS5Wb2x1bWUob3B0aW9ucy52b2x1bWUpO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogVGhlIHZvbHVtZSBvZiB0aGUgb3V0cHV0IGluIGRlY2liZWxzLlxuXHRcdFx0ICogQHR5cGUge0RlY2liZWxzfVxuXHRcdFx0ICogQHNpZ25hbFxuXHRcdFx0ICogQGV4YW1wbGVcblx0XHRcdCAqIHNvdXJjZS52b2x1bWUudmFsdWUgPSAtNjtcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMudm9sdW1lID0gdGhpcy5fdm9sdW1lLnZvbHVtZTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seSgndm9sdW1lJyk7XG5cdCAgICAgICAgLy9tYWtlIHRoZSBvdXRwdXQgZXhwbGljaXRseSBzdGVyZW9cblx0ICAgICAgICB0aGlzLl92b2x1bWUub3V0cHV0Lm91dHB1dC5jaGFubmVsQ291bnQgPSAyO1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZS5vdXRwdXQub3V0cHV0LmNoYW5uZWxDb3VudE1vZGUgPSAnZXhwbGljaXQnO1xuXHQgICAgICAgIC8vbXV0ZSBpbml0aWFsbHlcblx0ICAgICAgICB0aGlzLm11dGUgPSBvcHRpb25zLm11dGU7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgY29udGFpbmVyIG9mIGFsbCBvZiB0aGUgcGxheWVyc1xuXHRcdFx0ICogQHR5cGUge09iamVjdH1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9wbGF5ZXJzID0ge307XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiBUaGUgbG9hZGluZyBjb3VudFxuXHRcdFx0ICogQHR5cGUge051bWJlcn1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9sb2FkaW5nQ291bnQgPSAwO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogcHJpdmF0ZSBob2xkZXIgb2YgdGhlIGZhZGVJbiB0aW1lXG5cdFx0XHQgKiBAdHlwZSB7VGltZX1cblx0XHRcdCAqIEBwcml2YXRlXG5cdFx0XHQgKi9cblx0ICAgICAgICB0aGlzLl9mYWRlSW4gPSBvcHRpb25zLmZhZGVJbjtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIHByaXZhdGUgaG9sZGVyIG9mIHRoZSBmYWRlT3V0IHRpbWVcblx0XHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2ZhZGVPdXQgPSBvcHRpb25zLmZhZGVPdXQ7XG5cdCAgICAgICAgLy9hZGQgYWxsIG9mIHRoZSBwbGF5ZXJzXG5cdCAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB1cmxzKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdDb3VudCsrO1xuXHQgICAgICAgICAgICB0aGlzLmFkZChuYW1lLCB1cmxzW25hbWVdLCB0aGlzLl9idWZmZXJMb2FkZWQuYmluZCh0aGlzLCBvcHRpb25zLm9ubG9hZCkpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICBUb25lLmV4dGVuZChUb25lLlBsYXllcnMsIFRvbmUuQXVkaW9Ob2RlKTtcblx0ICAgIC8qKlxuXHRcdCAqIFRoZSBkZWZhdWx0IHZhbHVlc1xuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdCAgICBUb25lLlBsYXllcnMuZGVmYXVsdHMgPSB7XG5cdCAgICAgICAgJ3ZvbHVtZSc6IDAsXG5cdCAgICAgICAgJ211dGUnOiBmYWxzZSxcblx0ICAgICAgICAnb25sb2FkJzogVG9uZS5ub09wLFxuXHQgICAgICAgICdmYWRlSW4nOiAwLFxuXHQgICAgICAgICdmYWRlT3V0JzogMFxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBBIGJ1ZmZlciB3YXMgbG9hZGVkLiBkZWNyZW1lbnQgdGhlIGNvdW50ZXIuXG5cdFx0ICogIEBwYXJhbSAge0Z1bmN0aW9ufSAgY2FsbGJhY2tcblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuUGxheWVycy5wcm90b3R5cGUuX2J1ZmZlckxvYWRlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgIHRoaXMuX2xvYWRpbmdDb3VudC0tO1xuXHQgICAgICAgIGlmICh0aGlzLl9sb2FkaW5nQ291bnQgPT09IDAgJiYgY2FsbGJhY2spIHtcblx0ICAgICAgICAgICAgY2FsbGJhY2sodGhpcyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqIE11dGUgdGhlIG91dHB1dC5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5Tb3VyY2UjXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XG5cdFx0ICogQG5hbWUgbXV0ZVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy9tdXRlIHRoZSBvdXRwdXRcblx0XHQgKiBzb3VyY2UubXV0ZSA9IHRydWU7XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QbGF5ZXJzLnByb3RvdHlwZSwgJ211dGUnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl92b2x1bWUubXV0ZTtcblx0ICAgICAgICB9LFxuXHQgICAgICAgIHNldDogZnVuY3Rpb24gKG11dGUpIHtcblx0ICAgICAgICAgICAgdGhpcy5fdm9sdW1lLm11dGUgPSBtdXRlO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGZhZGVJbiB0aW1lIG9mIHRoZSBhbXBsaXR1ZGUgZW52ZWxvcGUuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuU291cmNlI1xuXHRcdCAqIEB0eXBlIHtUaW1lfVxuXHRcdCAqIEBuYW1lIGZhZGVJblxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuUGxheWVycy5wcm90b3R5cGUsICdmYWRlSW4nLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWRlSW47XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBzZXQ6IGZ1bmN0aW9uIChmYWRlSW4pIHtcblx0ICAgICAgICAgICAgdGhpcy5fZmFkZUluID0gZmFkZUluO1xuXHQgICAgICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChwbGF5ZXIpIHtcblx0ICAgICAgICAgICAgICAgIHBsYXllci5mYWRlSW4gPSBmYWRlSW47XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIGZhZGVPdXQgdGltZSBvZiB0aGUgYW1wbGl0dWRlIGVudmVsb3BlLlxuXHRcdCAqIEBtZW1iZXJPZiBUb25lLlNvdXJjZSNcblx0XHQgKiBAdHlwZSB7VGltZX1cblx0XHQgKiBAbmFtZSBmYWRlT3V0XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QbGF5ZXJzLnByb3RvdHlwZSwgJ2ZhZGVPdXQnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWRlT3V0O1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAoZmFkZU91dCkge1xuXHQgICAgICAgICAgICB0aGlzLl9mYWRlT3V0ID0gZmFkZU91dDtcblx0ICAgICAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7XG5cdCAgICAgICAgICAgICAgICBwbGF5ZXIuZmFkZU91dCA9IGZhZGVPdXQ7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogVGhlIHN0YXRlIG9mIHRoZSBwbGF5ZXJzIG9iamVjdC4gUmV0dXJucyBcInN0YXJ0ZWRcIiBpZiBhbnkgb2YgdGhlIHBsYXllcnMgYXJlIHBsYXlpbmcuXG5cdFx0ICogQG1lbWJlck9mIFRvbmUuUGxheWVycyNcblx0XHQgKiBAdHlwZSB7U3RyaW5nfVxuXHRcdCAqIEBuYW1lIHN0YXRlXG5cdFx0ICogQHJlYWRPbmx5XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5QbGF5ZXJzLnByb3RvdHlwZSwgJ3N0YXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgcGxheWluZyA9IGZhbHNlO1xuXHQgICAgICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChwbGF5ZXIpIHtcblx0ICAgICAgICAgICAgICAgIHBsYXlpbmcgPSBwbGF5aW5nIHx8IHBsYXllci5zdGF0ZSA9PT0gVG9uZS5TdGF0ZS5TdGFydGVkO1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgcmV0dXJuIHBsYXlpbmcgPyBUb25lLlN0YXRlLlN0YXJ0ZWQgOiBUb25lLlN0YXRlLlN0b3BwZWQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiAgVHJ1ZSBpZiB0aGUgYnVmZmVycyBvYmplY3QgaGFzIGEgYnVmZmVyIGJ5IHRoYXQgbmFtZS5cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfE51bWJlcn0gIG5hbWUgIFRoZSBrZXkgb3IgaW5kZXggb2YgdGhlXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuXG5cdFx0ICogIEByZXR1cm4gIHtCb29sZWFufVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QbGF5ZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9wbGF5ZXJzLmhhc093blByb3BlcnR5KG5hbWUpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBHZXQgYSBwbGF5ZXIgYnkgbmFtZS5cblx0XHQgKiAgQHBhcmFtICB7U3RyaW5nfSAgbmFtZSAgVGhlIHBsYXllcnMgbmFtZSBhcyBkZWZpbmVkIGluXG5cdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25zdHJ1Y3RvciBvYmplY3Qgb3IgYGFkZGAgbWV0aG9kLlxuXHRcdCAqICBAcmV0dXJuICB7VG9uZS5QbGF5ZXJ9XG5cdFx0ICovXG5cdCAgICBUb25lLlBsYXllcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuaGFzKG5hbWUpKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLl9wbGF5ZXJzW25hbWVdO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9uZS5QbGF5ZXJzOiBubyBwbGF5ZXIgbmFtZWQgJyArIG5hbWUpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiBJdGVyYXRlIG92ZXIgYWxsIG9mIHRoZSBwbGF5ZXJzXG5cdFx0ICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG5cdFx0ICogQHJldHVybiB7VG9uZS5QbGF5ZXJzfSAgICAgICAgICAgIHRoaXNcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5QbGF5ZXJzLnByb3RvdHlwZS5fZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgIGZvciAodmFyIHBsYXllck5hbWUgaW4gdGhpcy5fcGxheWVycykge1xuXHQgICAgICAgICAgICBjYWxsYmFjayh0aGlzLl9wbGF5ZXJzW3BsYXllck5hbWVdLCBwbGF5ZXJOYW1lKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogSWYgYWxsIHRoZSBidWZmZXJzIGFyZSBsb2FkZWQgb3Igbm90XG5cdFx0ICogQG1lbWJlck9mIFRvbmUuUGxheWVycyNcblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKiBAbmFtZSBsb2FkZWRcblx0XHQgKiBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlBsYXllcnMucHJvdG90eXBlLCAnbG9hZGVkJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICB2YXIgaXNMb2FkZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChwbGF5ZXIpIHtcblx0ICAgICAgICAgICAgICAgIGlzTG9hZGVkID0gaXNMb2FkZWQgJiYgcGxheWVyLmxvYWRlZDtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHJldHVybiBpc0xvYWRlZDtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqICBBZGQgYSBwbGF5ZXIgYnkgbmFtZSBhbmQgdXJsIHRvIHRoZSBQbGF5ZXJzXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ30gICAgbmFtZSAgICAgIEEgdW5pcXVlIG5hbWUgdG8gZ2l2ZSB0aGUgcGxheWVyXG5cdFx0ICogIEBwYXJhbSAge1N0cmluZ3xUb25lLkJ1ZmZlcnxBdWRpb2J1ZmZlcn0gIHVybCAgRWl0aGVyIHRoZSB1cmwgb2YgdGhlIGJ1ZmVyLFxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgYnVmZmVyIHdoaWNoIHdpbGwgYmUgYWRkZWRcblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuXHRcdCAqICBAcGFyYW0gIHtGdW5jdGlvbj19ICBjYWxsYmFjayAgVGhlIGNhbGxiYWNrIHRvIGludm9rZVxuXHRcdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgdXJsIGlzIGxvYWRlZC5cblx0XHQgKi9cblx0ICAgIFRvbmUuUGxheWVycy5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKG5hbWUsIHVybCwgY2FsbGJhY2spIHtcblx0ICAgICAgICB0aGlzLl9wbGF5ZXJzW25hbWVdID0gbmV3IFRvbmUuUGxheWVyKHVybCwgY2FsbGJhY2spLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgICAgIHRoaXMuX3BsYXllcnNbbmFtZV0uZmFkZUluID0gdGhpcy5fZmFkZUluO1xuXHQgICAgICAgIHRoaXMuX3BsYXllcnNbbmFtZV0uZmFkZU91dCA9IHRoaXMuX2ZhZGVPdXQ7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogU3RvcCBhbGwgb2YgdGhlIHBsYXllcnMgYXQgdGhlIGdpdmVuIHRpbWVcblx0XHQgKiBAcGFyYW0ge1RpbWV9IHRpbWUgVGhlIHRpbWUgdG8gc3RvcCBhbGwgb2YgdGhlIHBsYXllcnMuXG5cdFx0ICogQHJldHVybiB7VG9uZS5QbGF5ZXJzfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBsYXllcnMucHJvdG90eXBlLnN0b3BBbGwgPSBmdW5jdGlvbiAodGltZSkge1xuXHQgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKHBsYXllcikge1xuXHQgICAgICAgICAgICBwbGF5ZXIuc3RvcCh0aW1lKTtcblx0ICAgICAgICB9KTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgRGlzcG9zZSBhbmQgZGlzY29ubmVjdC5cblx0XHQgKiAgQHJldHVybiB7VG9uZS5QbGF5ZXJzfSB0aGlzXG5cdFx0ICovXG5cdCAgICBUb25lLlBsYXllcnMucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLl92b2x1bWUuZGlzcG9zZSgpO1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZSA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoJ3ZvbHVtZScpO1xuXHQgICAgICAgIHRoaXMudm9sdW1lID0gbnVsbDtcblx0ICAgICAgICB0aGlzLm91dHB1dCA9IG51bGw7XG5cdCAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAocGxheWVyKSB7XG5cdCAgICAgICAgICAgIHBsYXllci5kaXNwb3NlKCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5fcGxheWVycyA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuUGxheWVycztcblx0fSk7XG5cdE1vZHVsZShmdW5jdGlvbiAoVG9uZSkge1xuXHQgICAgXG5cdCAgICAvKipcblx0XHQgKiAgQGNsYXNzICBUb25lLlVzZXJNZWRpYSB1c2VzIE1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEgdG8gb3BlbiB1cFxuXHRcdCAqICAgICAgICAgIGFuZCBleHRlcm5hbCBtaWNyb3Bob25lIG9yIGF1ZGlvIGlucHV0LiBDaGVja1xuXHRcdCAqICAgICAgICAgIFtNZWRpYURldmljZXMgQVBJIFN1cHBvcnRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9NZWRpYURldmljZXMvZ2V0VXNlck1lZGlhKVxuXHRcdCAqICAgICAgICAgIHRvIHNlZSB3aGljaCBicm93c2VycyBhcmUgc3VwcG9ydGVkLiBBY2Nlc3MgdG8gYW4gZXh0ZXJuYWwgaW5wdXRcblx0XHQgKiAgICAgICAgICBpcyBsaW1pdGVkIHRvIHNlY3VyZSAoSFRUUFMpIGNvbm5lY3Rpb25zLlxuXHRcdCAqXG5cdFx0ICogIEBjb25zdHJ1Y3RvclxuXHRcdCAqICBAZXh0ZW5kcyB7VG9uZS5BdWRpb05vZGV9XG5cdFx0ICogIEBwYXJhbSB7RGVjaWJlbHM9fSB2b2x1bWUgVGhlIGxldmVsIG9mIHRoZSBpbnB1dFxuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIC8vbGlzdCB0aGUgaW5wdXRzIGFuZCBvcGVuIHRoZSB0aGlyZCBvbmVcblx0XHQgKiB2YXIgbW90dSA9IG5ldyBUb25lLlVzZXJNZWRpYSgpO1xuXHRcdCAqXG5cdFx0ICogLy9vcGVuaW5nIHRoZSBpbnB1dCBhc2tzIHRoZSB1c2VyIHRvIGFjdGl2YXRlIHRoZWlyIG1pY1xuXHRcdCAqIG1vdHUub3BlbigpLnRoZW4oZnVuY3Rpb24oKXtcblx0XHQgKiBcdC8vcHJvbWlzZSByZXNvbHZlcyB3aGVuIGlucHV0IGlzIGF2YWlsYWJsZVxuXHRcdCAqIH0pO1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Vc2VyTWVkaWEgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgdmFyIG9wdGlvbnMgPSBUb25lLmRlZmF1bHRzKGFyZ3VtZW50cywgWyd2b2x1bWUnXSwgVG9uZS5Vc2VyTWVkaWEpO1xuXHQgICAgICAgIFRvbmUuQXVkaW9Ob2RlLmNhbGwodGhpcyk7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIE1lZGlhU3RyZWFtTm9kZVxuXHRcdFx0ICogIEB0eXBlIHtNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZX1cblx0XHRcdCAqICBAcHJpdmF0ZVxuXHRcdFx0ICovXG5cdCAgICAgICAgdGhpcy5fbWVkaWFTdHJlYW0gPSBudWxsO1xuXHQgICAgICAgIC8qKlxuXHRcdFx0ICogIFRoZSBtZWRpYSBzdHJlYW0gY3JlYXRlZCBieSBnZXRVc2VyTWVkaWEuXG5cdFx0XHQgKiAgQHR5cGUge0xvY2FsTWVkaWFTdHJlYW19XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3N0cmVhbSA9IG51bGw7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG9wZW4gZGV2aWNlXG5cdFx0XHQgKiAgQHR5cGUgIHtNZWRpYURldmljZUluZm99XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX2RldmljZSA9IG51bGw7XG5cdCAgICAgICAgLyoqXG5cdFx0XHQgKiAgVGhlIG91dHB1dCB2b2x1bWUgbm9kZVxuXHRcdFx0ICogIEB0eXBlICB7VG9uZS5Wb2x1bWV9XG5cdFx0XHQgKiAgQHByaXZhdGVcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZSA9IHRoaXMub3V0cHV0ID0gbmV3IFRvbmUuVm9sdW1lKG9wdGlvbnMudm9sdW1lKTtcblx0ICAgICAgICAvKipcblx0XHRcdCAqIFRoZSB2b2x1bWUgb2YgdGhlIG91dHB1dCBpbiBkZWNpYmVscy5cblx0XHRcdCAqIEB0eXBlIHtEZWNpYmVsc31cblx0XHRcdCAqIEBzaWduYWxcblx0XHRcdCAqIEBleGFtcGxlXG5cdFx0XHQgKiBpbnB1dC52b2x1bWUudmFsdWUgPSAtNjtcblx0XHRcdCAqL1xuXHQgICAgICAgIHRoaXMudm9sdW1lID0gdGhpcy5fdm9sdW1lLnZvbHVtZTtcblx0ICAgICAgICB0aGlzLl9yZWFkT25seSgndm9sdW1lJyk7XG5cdCAgICAgICAgdGhpcy5tdXRlID0gb3B0aW9ucy5tdXRlO1xuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuVXNlck1lZGlhLCBUb25lLkF1ZGlvTm9kZSk7XG5cdCAgICAvKipcblx0XHQgKiB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0ICAgIFRvbmUuVXNlck1lZGlhLmRlZmF1bHRzID0ge1xuXHQgICAgICAgICd2b2x1bWUnOiAwLFxuXHQgICAgICAgICdtdXRlJzogZmFsc2Vcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgT3BlbiB0aGUgbWVkaWEgc3RyZWFtLiBJZiBhIHN0cmluZyBpcyBwYXNzZWQgaW4sIGl0IGlzIGFzc3VtZWRcblx0XHQgKiAgdG8gYmUgdGhlIGxhYmVsIG9yIGlkIG9mIHRoZSBzdHJlYW0sIGlmIGEgbnVtYmVyIGlzIHBhc3NlZCBpbixcblx0XHQgKiAgaXQgaXMgdGhlIGlucHV0IG51bWJlciBvZiB0aGUgc3RyZWFtLlxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmd8TnVtYmVyfSBbbGFiZWxPcklkPVwiZGVmYXVsdFwiXSBUaGUgbGFiZWwgb3IgaWQgb2YgdGhlIGF1ZGlvIGlucHV0IG1lZGlhIGRldmljZS5cblx0XHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGggbm8gYXJndW1lbnQsIHRoZSBkZWZhdWx0IHN0cmVhbSBpcyBvcGVuZWQuXG5cdFx0ICogIEByZXR1cm4ge1Byb21pc2V9IFRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuLlxuXHRcdCAqL1xuXHQgICAgVG9uZS5Vc2VyTWVkaWEucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAobGFiZWxPcklkKSB7XG5cdCAgICAgICAgcmV0dXJuIFRvbmUuVXNlck1lZGlhLmVudW1lcmF0ZURldmljZXMoKS50aGVuKGZ1bmN0aW9uIChkZXZpY2VzKSB7XG5cdCAgICAgICAgICAgIHZhciBkZXZpY2U7XG5cdCAgICAgICAgICAgIGlmIChUb25lLmlzTnVtYmVyKGxhYmVsT3JJZCkpIHtcblx0ICAgICAgICAgICAgICAgIGRldmljZSA9IGRldmljZXNbbGFiZWxPcklkXTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIGRldmljZSA9IGRldmljZXMuZmluZChmdW5jdGlvbiAoZGV2aWNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZS5sYWJlbCA9PT0gbGFiZWxPcklkIHx8IGRldmljZS5kZXZpY2VJZCA9PT0gbGFiZWxPcklkO1xuXHQgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAvL2RpZG4ndCBmaW5kIGEgbWF0Y2hpbmcgZGV2aWNlXG5cdCAgICAgICAgICAgICAgICBpZiAoIWRldmljZSAmJiBkZXZpY2VzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICBkZXZpY2UgPSBkZXZpY2VzWzBdO1xuXHQgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGV2aWNlICYmIFRvbmUuaXNEZWZpbmVkKGxhYmVsT3JJZCkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbmUuVXNlck1lZGlhOiBubyBtYXRjaGluZyBkZXZpY2U6ICcgKyBsYWJlbE9ySWQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX2RldmljZSA9IGRldmljZTtcblx0ICAgICAgICAgICAgLy9kbyBnZXRVc2VyTWVkaWFcblx0ICAgICAgICAgICAgdmFyIGNvbnN0cmFpbnRzID0ge1xuXHQgICAgICAgICAgICAgICAgYXVkaW86IHtcblx0ICAgICAgICAgICAgICAgICAgICAnZWNob0NhbmNlbGxhdGlvbic6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgICdzYW1wbGVSYXRlJzogdGhpcy5jb250ZXh0LnNhbXBsZVJhdGVcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgaWYgKGRldmljZSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3RyYWludHMuYXVkaW8uZGV2aWNlSWQgPSBkZXZpY2UuZGV2aWNlSWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGNvbnN0cmFpbnRzKS50aGVuKGZ1bmN0aW9uIChzdHJlYW0pIHtcblx0ICAgICAgICAgICAgICAgIC8vc3RhcnQgYSBuZXcgc291cmNlIG9ubHkgaWYgdGhlIHByZXZpb3VzIG9uZSBpcyBjbG9zZWRcblx0ICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc3RyZWFtKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RyZWFtID0gc3RyZWFtO1xuXHQgICAgICAgICAgICAgICAgICAgIC8vV3JhcCBhIE1lZGlhU3RyZWFtU291cmNlTm9kZSBhcm91bmQgdGhlIGxpdmUgaW5wdXQgc3RyZWFtLlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhU3RyZWFtID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHN0cmVhbSk7XG5cdCAgICAgICAgICAgICAgICAgICAgLy9Db25uZWN0IHRoZSBNZWRpYVN0cmVhbVNvdXJjZU5vZGUgdG8gYSBnYXRlIGdhaW4gbm9kZVxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhU3RyZWFtLmNvbm5lY3QodGhpcy5vdXRwdXQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cdCAgICAgICAgfS5iaW5kKHRoaXMpKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgQ2xvc2UgdGhlIG1lZGlhIHN0cmVhbVxuXHRcdCAqICBAcmV0dXJuIHtUb25lLlVzZXJNZWRpYX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Vc2VyTWVkaWEucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmICh0aGlzLl9zdHJlYW0pIHtcblx0ICAgICAgICAgICAgdGhpcy5fc3RyZWFtLmdldEF1ZGlvVHJhY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAodHJhY2spIHtcblx0ICAgICAgICAgICAgICAgIHRyYWNrLnN0b3AoKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIHRoaXMuX3N0cmVhbSA9IG51bGw7XG5cdCAgICAgICAgICAgIC8vcmVtb3ZlIHRoZSBvbGQgbWVkaWEgc3RyZWFtXG5cdCAgICAgICAgICAgIHRoaXMuX21lZGlhU3RyZWFtLmRpc2Nvbm5lY3QoKTtcblx0ICAgICAgICAgICAgdGhpcy5fbWVkaWFTdHJlYW0gPSBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9kZXZpY2UgPSBudWxsO1xuXHQgICAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIGEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aXRoIHRoZSBsaXN0IG9mIGF1ZGlvIGlucHV0IGRldmljZXMgYXZhaWxhYmxlLlxuXHRcdCAqICBAcmV0dXJuIHtQcm9taXNlfSBUaGUgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGggdGhlIGRldmljZXNcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAZXhhbXBsZVxuXHRcdCAqIFRvbmUuVXNlck1lZGlhLmVudW1lcmF0ZURldmljZXMoKS50aGVuKGZ1bmN0aW9uKGRldmljZXMpe1xuXHRcdCAqIFx0Y29uc29sZS5sb2coZGV2aWNlcylcblx0XHQgKiB9KVxuXHRcdCAqL1xuXHQgICAgVG9uZS5Vc2VyTWVkaWEuZW51bWVyYXRlRGV2aWNlcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbihmdW5jdGlvbiAoZGV2aWNlcykge1xuXHQgICAgICAgICAgICByZXR1cm4gZGV2aWNlcy5maWx0ZXIoZnVuY3Rpb24gKGRldmljZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZS5raW5kID09PSAnYXVkaW9pbnB1dCc7XG5cdCAgICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgc291cmNlLCBcInN0YXJ0ZWRcIiB3aGVuIHRoZSBtaWNyb3Bob25lIGlzIG9wZW5cblx0XHQgKiAgYW5kIFwic3RvcHBlZFwiIHdoZW4gdGhlIG1pYyBpcyBjbG9zZWQuXG5cdFx0ICogIEB0eXBlIHtUb25lLlN0YXRlfVxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuVXNlck1lZGlhI1xuXHRcdCAqICBAbmFtZSBzdGF0ZVxuXHRcdCAqL1xuXHQgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRvbmUuVXNlck1lZGlhLnByb3RvdHlwZSwgJ3N0YXRlJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyZWFtICYmIHRoaXMuX3N0cmVhbS5hY3RpdmUgPyBUb25lLlN0YXRlLlN0YXJ0ZWQgOiBUb25lLlN0YXRlLlN0b3BwZWQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBcdFJldHVybnMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHJlcHJlc2VudGVkIGRldmljZSB0aGF0IGlzXG5cdFx0ICogXHRwZXJzaXN0ZWQgYWNyb3NzIHNlc3Npb25zLiBJdCBpcyB1bi1ndWVzc2FibGUgYnkgb3RoZXIgYXBwbGljYXRpb25zIGFuZFxuXHRcdCAqIFx0dW5pcXVlIHRvIHRoZSBvcmlnaW4gb2YgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIEl0IGlzIHJlc2V0IHdoZW4gdGhlXG5cdFx0ICogXHR1c2VyIGNsZWFycyBjb29raWVzIChmb3IgUHJpdmF0ZSBCcm93c2luZywgYSBkaWZmZXJlbnQgaWRlbnRpZmllciBpc1xuXHRcdCAqIFx0dXNlZCB0aGF0IGlzIG5vdCBwZXJzaXN0ZWQgYWNyb3NzIHNlc3Npb25zKS4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGVcblx0XHQgKiBcdGRldmljZSBpcyBub3Qgb3Blbi5cblx0XHQgKiAgQHR5cGUge1N0cmluZ31cblx0XHQgKiAgQHJlYWRPbmx5XG5cdFx0ICogIEBtZW1iZXJPZiBUb25lLlVzZXJNZWRpYSNcblx0XHQgKiAgQG5hbWUgZGV2aWNlSWRcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlVzZXJNZWRpYS5wcm90b3R5cGUsICdkZXZpY2VJZCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2RldmljZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RldmljZS5kZXZpY2VJZDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgLyoqXG5cdFx0ICogXHRSZXR1cm5zIGEgZ3JvdXAgaWRlbnRpZmllci4gVHdvIGRldmljZXMgaGF2ZSB0aGVcblx0XHQgKiBcdHNhbWUgZ3JvdXAgaWRlbnRpZmllciBpZiB0aGV5IGJlbG9uZyB0byB0aGUgc2FtZSBwaHlzaWNhbCBkZXZpY2UuXG5cdFx0ICogXHRSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IG9wZW4uXG5cdFx0ICogIEB0eXBlIHtTdHJpbmd9XG5cdFx0ICogIEByZWFkT25seVxuXHRcdCAqICBAbWVtYmVyT2YgVG9uZS5Vc2VyTWVkaWEjXG5cdFx0ICogIEBuYW1lIGdyb3VwSWRcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlVzZXJNZWRpYS5wcm90b3R5cGUsICdncm91cElkJywge1xuXHQgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fZGV2aWNlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGV2aWNlLmdyb3VwSWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIFx0UmV0dXJucyBhIGxhYmVsIGRlc2NyaWJpbmcgdGhpcyBkZXZpY2UgKGZvciBleGFtcGxlIFwiQnVpbHQtaW4gTWljcm9waG9uZVwiKS5cblx0XHQgKiBcdFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGRldmljZSBpcyBub3Qgb3BlbiBvciBsYWJlbCBpcyBub3QgYXZhaWxhYmxlXG5cdFx0ICogXHRiZWNhdXNlIG9mIHBlcm1pc3Npb25zLlxuXHRcdCAqICBAdHlwZSB7U3RyaW5nfVxuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuVXNlck1lZGlhI1xuXHRcdCAqICBAbmFtZSBncm91cElkXG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Vc2VyTWVkaWEucHJvdG90eXBlLCAnbGFiZWwnLCB7XG5cdCAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLl9kZXZpY2UpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZXZpY2UubGFiZWw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIC8qKlxuXHRcdCAqIE11dGUgdGhlIG91dHB1dC5cblx0XHQgKiBAbWVtYmVyT2YgVG9uZS5Vc2VyTWVkaWEjXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XG5cdFx0ICogQG5hbWUgbXV0ZVxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy9tdXRlIHRoZSBvdXRwdXRcblx0XHQgKiB1c2VyTWVkaWEubXV0ZSA9IHRydWU7XG5cdFx0ICovXG5cdCAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVG9uZS5Vc2VyTWVkaWEucHJvdG90eXBlLCAnbXV0ZScsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZvbHVtZS5tdXRlO1xuXHQgICAgICAgIH0sXG5cdCAgICAgICAgc2V0OiBmdW5jdGlvbiAobXV0ZSkge1xuXHQgICAgICAgICAgICB0aGlzLl92b2x1bWUubXV0ZSA9IG11dGU7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICAvKipcblx0XHQgKiBDbGVhbiB1cC5cblx0XHQgKiBAcmV0dXJuIHtUb25lLlVzZXJNZWRpYX0gdGhpc1xuXHRcdCAqL1xuXHQgICAgVG9uZS5Vc2VyTWVkaWEucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgVG9uZS5BdWRpb05vZGUucHJvdG90eXBlLmRpc3Bvc2UuY2FsbCh0aGlzKTtcblx0ICAgICAgICB0aGlzLmNsb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fd3JpdGFibGUoJ3ZvbHVtZScpO1xuXHQgICAgICAgIHRoaXMuX3ZvbHVtZS5kaXNwb3NlKCk7XG5cdCAgICAgICAgdGhpcy5fdm9sdW1lID0gbnVsbDtcblx0ICAgICAgICB0aGlzLnZvbHVtZSA9IG51bGw7XG5cdCAgICAgICAgcmV0dXJuIHRoaXM7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIElmIGdldFVzZXJNZWRpYSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuXG5cdFx0ICogIEB0eXBlICB7Qm9vbGVhbn1cblx0XHQgKiAgQG1lbWJlck9mIFRvbmUuVXNlck1lZGlhI1xuXHRcdCAqICBAbmFtZSBzdXBwb3J0ZWRcblx0XHQgKiAgQHN0YXRpY1xuXHRcdCAqICBAcmVhZE9ubHlcblx0XHQgKi9cblx0ICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUb25lLlVzZXJNZWRpYSwgJ3N1cHBvcnRlZCcsIHtcblx0ICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIFRvbmUuaXNEZWZpbmVkKG5hdmlnYXRvci5tZWRpYURldmljZXMpICYmIFRvbmUuaXNGdW5jdGlvbihuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICByZXR1cm4gVG9uZS5Vc2VyTWVkaWE7XG5cdH0pO1xuXHRNb2R1bGUoZnVuY3Rpb24gKFRvbmUpIHtcblx0ICAgIC8qKlxuXHRcdCAqICBAY2xhc3MgVG9uZS5NaWRpIGlzIGEgcHJpbWl0aXZlIHR5cGUgZm9yIGVuY29kaW5nIFRpbWUgdmFsdWVzLlxuXHRcdCAqICAgICAgICAgVG9uZS5NaWRpIGNhbiBiZSBjb25zdHJ1Y3RlZCB3aXRoIG9yIHdpdGhvdXQgdGhlIGBuZXdgIGtleXdvcmQuIFRvbmUuTWlkaSBjYW4gYmUgcGFzc2VkXG5cdFx0ICogICAgICAgICBpbnRvIHRoZSBwYXJhbWV0ZXIgb2YgYW55IG1ldGhvZCB3aGljaCB0YWtlcyB0aW1lIGFzIGFuIGFyZ3VtZW50LlxuXHRcdCAqICBAY29uc3RydWN0b3Jcblx0XHQgKiAgQGV4dGVuZHMge1RvbmUuRnJlcXVlbmN5fVxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmd8TnVtYmVyfSAgdmFsICAgIFRoZSB0aW1lIHZhbHVlLlxuXHRcdCAqICBAcGFyYW0gIHtTdHJpbmc9fSAgdW5pdHMgIFRoZSB1bml0cyBvZiB0aGUgdmFsdWUuXG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogdmFyIHQgPSBUb25lLk1pZGkoXCI0blwiKTsvL2EgcXVhcnRlciBub3RlXG5cdFx0ICovXG5cdCAgICBUb25lLk1pZGkgPSBmdW5jdGlvbiAodmFsLCB1bml0cykge1xuXHQgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgVG9uZS5NaWRpKSB7XG5cdCAgICAgICAgICAgIFRvbmUuRnJlcXVlbmN5LmNhbGwodGhpcywgdmFsLCB1bml0cyk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5ldyBUb25lLk1pZGkodmFsLCB1bml0cyk7XG5cdCAgICAgICAgfVxuXHQgICAgfTtcblx0ICAgIFRvbmUuZXh0ZW5kKFRvbmUuTWlkaSwgVG9uZS5GcmVxdWVuY3kpO1xuXHQgICAgLyoqXG5cdFx0ICogIFRoZSBkZWZhdWx0IHVuaXRzIGlmIG5vbmUgYXJlIGdpdmVuLlxuXHRcdCAqICBAdHlwZSB7U3RyaW5nfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5NaWRpLnByb3RvdHlwZS5fZGVmYXVsdFVuaXRzID0gJ21pZGknO1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgZnJlcXVlbmN5IGluIHRoZSBjdXJyZW50IHVuaXRzXG5cdFx0ICogIEBwYXJhbSB7RnJlcXVlbmN5fSBmcmVxXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLk1pZGkucHJvdG90eXBlLl9mcmVxdWVuY3lUb1VuaXRzID0gZnVuY3Rpb24gKGZyZXEpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5GcmVxdWVuY3kuZnRvbShUb25lLkZyZXF1ZW5jeS5wcm90b3R5cGUuX2ZyZXF1ZW5jeVRvVW5pdHMuY2FsbCh0aGlzLCBmcmVxKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgdGljayBpbiB0aGUgY3VycmVudCB0aW1lIHVuaXRzXG5cdFx0ICogIEBwYXJhbSB7VGlja3N9IHRpY2tzXG5cdFx0ICogIEByZXR1cm4gIHtOdW1iZXJ9XG5cdFx0ICogIEBwcml2YXRlXG5cdFx0ICovXG5cdCAgICBUb25lLk1pZGkucHJvdG90eXBlLl90aWNrc1RvVW5pdHMgPSBmdW5jdGlvbiAodGlja3MpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5GcmVxdWVuY3kuZnRvbShUb25lLkZyZXF1ZW5jeS5wcm90b3R5cGUuX3RpY2tzVG9Vbml0cy5jYWxsKHRoaXMsIHRpY2tzKSk7XG5cdCAgICB9O1xuXHQgICAgLyoqXG5cdFx0ICogIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGJlYXRzIGluIHRoZSBjdXJyZW50IHVuaXRzXG5cdFx0ICogIEBwYXJhbSB7TnVtYmVyfSBiZWF0c1xuXHRcdCAqICBAcmV0dXJuICB7TnVtYmVyfVxuXHRcdCAqICBAcHJpdmF0ZVxuXHRcdCAqL1xuXHQgICAgVG9uZS5NaWRpLnByb3RvdHlwZS5fYmVhdHNUb1VuaXRzID0gZnVuY3Rpb24gKGJlYXRzKSB7XG5cdCAgICAgICAgcmV0dXJuIFRvbmUuRnJlcXVlbmN5LmZ0b20oVG9uZS5GcmVxdWVuY3kucHJvdG90eXBlLl9iZWF0c1RvVW5pdHMuY2FsbCh0aGlzLCBiZWF0cykpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHNlY29uZCBpbiB0aGUgY3VycmVudCB1bml0c1xuXHRcdCAqICBAcGFyYW0ge1NlY29uZHN9IHNlY29uZHNcblx0XHQgKiAgQHJldHVybiAge051bWJlcn1cblx0XHQgKiAgQHByaXZhdGVcblx0XHQgKi9cblx0ICAgIFRvbmUuTWlkaS5wcm90b3R5cGUuX3NlY29uZHNUb1VuaXRzID0gZnVuY3Rpb24gKHNlY29uZHMpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5GcmVxdWVuY3kuZnRvbShUb25lLkZyZXF1ZW5jeS5wcm90b3R5cGUuX3NlY29uZHNUb1VuaXRzLmNhbGwodGhpcywgc2Vjb25kcykpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmcmVxdWVuY3kgYXMgYSBNSURJIG5vdGVcblx0XHQgKiAgQHJldHVybiAge01JREl9XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogVG9uZS5NaWRpKDYwKS50b01pZGkoKTsgLy82MFxuXHRcdCAqL1xuXHQgICAgVG9uZS5NaWRpLnByb3RvdHlwZS50b01pZGkgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpO1xuXHQgICAgfTtcblx0ICAgIC8qKlxuXHRcdCAqICBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmcmVxdWVuY3kgYXMgYSBNSURJIG5vdGVcblx0XHQgKiAgQHJldHVybiAge01JREl9XG5cdFx0ICogIEBleGFtcGxlXG5cdFx0ICogVG9uZS5NaWRpKDYwKS50b01pZGkoKTsgLy82MFxuXHRcdCAqL1xuXHQgICAgVG9uZS5NaWRpLnByb3RvdHlwZS50b0ZyZXF1ZW5jeSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gVG9uZS5GcmVxdWVuY3kubXRvZih0aGlzLnRvTWlkaSgpKTtcblx0ICAgIH07XG5cdCAgICAvKipcblx0XHQgKiAgVHJhbnNwb3NlcyB0aGUgZnJlcXVlbmN5IGJ5IHRoZSBnaXZlbiBudW1iZXIgb2Ygc2VtaXRvbmVzLlxuXHRcdCAqICBAcGFyYW0gIHtJbnRlcnZhbH0gIGludGVydmFsXG5cdFx0ICogIEByZXR1cm4gIHtUb25lLkZyZXF1ZW5jeX0gQSBuZXcgdHJhbnNwb3NlZCBmcmVxdWVuY3lcblx0XHQgKiAgQGV4YW1wbGVcblx0XHQgKiBUb25lLkZyZXF1ZW5jeShcIkE0XCIpLnRyYW5zcG9zZSgzKTsgLy9cIkM1XCJcblx0XHQgKi9cblx0ICAgIFRvbmUuTWlkaS5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24gKGludGVydmFsKSB7XG5cdCAgICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMudG9NaWRpKCkgKyBpbnRlcnZhbCk7XG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIFRvbmUuTWlkaTtcblx0fSk7XG5cdFxuXHRyZXR1cm4gVG9uZTtcbn0pKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdG9uZS9idWlsZC9Ub25lLmpzXG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHRydWU7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19saWJyYXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAyNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1waWUuanNcbi8vIG1vZHVsZSBpZCA9IDI2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgaGFzID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgdGFnLCBzdGF0KXtcbiAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzXG4vLyBtb2R1bGUgaWQgPSAyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1vYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpZCA9IDBcbiAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzXG4vLyBtb2R1bGUgaWQgPSAyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdsb2JhbCAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBJdGVyYXRvcnMgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbmZvcih2YXIgY29sbGVjdGlvbnMgPSBbJ05vZGVMaXN0JywgJ0RPTVRva2VuTGlzdCcsICdNZWRpYUxpc3QnLCAnU3R5bGVTaGVldExpc3QnLCAnQ1NTUnVsZUxpc3QnXSwgaSA9IDA7IGkgPCA1OyBpKyspe1xuICB2YXIgTkFNRSAgICAgICA9IGNvbGxlY3Rpb25zW2ldXG4gICAgLCBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdXG4gICAgLCBwcm90byAgICAgID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYocHJvdG8gJiYgIXByb3RvW1RPX1NUUklOR19UQUddKWhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDMwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBUb25lIGZyb20gJ3RvbmUnXG5pbXBvcnQgU3RhcnRBdWRpb0NvbnRleHQgZnJvbSAnLi9zdGFydEF1ZGlvQ29udGV4dCdcblxuZXhwb3J0IGNvbnN0IGlzSXBob25lID0gKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZS9pKSkgfHwgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQb2QvaSkpXG5leHBvcnQgY29uc3QgaXNJcGFkID0gKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQYWQvaSkpXG5leHBvcnQgY29uc3QgaXNBbmRyb2lkID0gKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSkpXG5leHBvcnQgY29uc3QgaXNNb2JpbGUgPSBpc0lwaG9uZSB8fCBpc0lwYWQgfHwgaXNBbmRyb2lkXG5leHBvcnQgY29uc3QgaXNEZXNrdG9wID0gISBpc01vYmlsZVxuXG5kb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoaXNNb2JpbGUgPyAnbW9iaWxlJyA6ICdkZXNrdG9wJylcblxuZXhwb3J0IGNvbnN0IGJyb3dzZXIgPSB7IGlzSXBob25lLCBpc0lwYWQsIGlzTW9iaWxlLCBpc0Rlc2t0b3AgfVxuXG5leHBvcnQgZnVuY3Rpb24gY2hvaWNlIChhKXsgcmV0dXJuIGFbIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGEubGVuZ3RoKSBdIH1cbmV4cG9ydCBmdW5jdGlvbiBtb2QobixtKXsgcmV0dXJuIG4tKG0gKiBNYXRoLmZsb29yKG4vbSkpIH1cbmV4cG9ydCBmdW5jdGlvbiBub3JtKG4sIG1pbiwgbWF4KXsgcmV0dXJuIChuIC0gbWluKSAvIChtYXggLSBtaW4pIH1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RBdWRpb0NvbnRleHQgKGZuKSB7XG5cdGlmIChpc01vYmlsZSkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBidXR0b24uaW5uZXJIVE1MID0gJ1RhcCB0byBzdGFydCAtIHBsZWFzZSB1bm11dGUgeW91ciBwaG9uZSdcbiAgICBPYmplY3QuYXNzaWduKGNvbnRhaW5lci5zdHlsZSwge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB6SW5kZXg6ICcxMDAwMCcsXG4gICAgICB0b3A6ICcwcHgnLFxuICAgICAgbGVmdDogJzBweCcsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuOCknLFxuICAgIH0pXG5cdFx0T2JqZWN0LmFzc2lnbihidXR0b24uc3R5bGUsIHtcblx0XHQgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuXHRcdCAgbGVmdDogJzUwJScsXG5cdFx0ICB0b3A6ICc1MCUnLFxuXHRcdFx0cGFkZGluZzogJzIwcHgnLFxuXHRcdCAgYmFja2dyb3VuZENvbG9yOiAnIzdGMzNFRCcsXG5cdFx0ICBjb2xvcjogJ3doaXRlJyxcblx0XHQgIGZvbnRGYW1pbHk6ICdtb25vc3BhY2UnLFxuXHRcdCAgYm9yZGVyUmFkaXVzOiAnM3B4Jyxcblx0XHQgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKC01MCUsLTUwJSwwKScsXG5cdFx0ICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuXHRcdFx0bGluZUhlaWdodDogJzEuNScsXG4gICAgfSlcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKVxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKVxuICAgIFN0YXJ0QXVkaW9Db250ZXh0LnNldENvbnRleHQoVG9uZS5jb250ZXh0KVxuICAgIFN0YXJ0QXVkaW9Db250ZXh0Lm9uKGJ1dHRvbilcbiAgICBTdGFydEF1ZGlvQ29udGV4dC5vblN0YXJ0ZWQoXyA9PiB7XG4gICAgICBjb250YWluZXIucmVtb3ZlKClcblx0XHRcdGZuKClcbiAgXHR9KVxuXHR9IGVsc2Uge1xuXHRcdGZuKClcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YVVSSXRvQmxvYihkYXRhVVJJKSB7XG4gIC8vIGNvbnZlcnQgYmFzZTY0IHRvIHJhdyBiaW5hcnkgZGF0YSBoZWxkIGluIGEgc3RyaW5nXG4gIC8vIGRvZXNuJ3QgaGFuZGxlIFVSTEVuY29kZWQgRGF0YVVSSXMgLSBzZWUgU08gYW5zd2VyICM2ODUwMjc2IGZvciBjb2RlIHRoYXQgZG9lcyB0aGlzXG4gIHZhciBieXRlU3RyaW5nID0gYXRvYihkYXRhVVJJLnNwbGl0KCcsJylbMV0pO1xuXG4gIC8vIHNlcGFyYXRlIG91dCB0aGUgbWltZSBjb21wb25lbnRcbiAgdmFyIG1pbWVTdHJpbmcgPSBkYXRhVVJJLnNwbGl0KCcsJylbMF0uc3BsaXQoJzonKVsxXS5zcGxpdCgnOycpWzBdXG5cbiAgLy8gd3JpdGUgdGhlIGJ5dGVzIG9mIHRoZSBzdHJpbmcgdG8gYW4gQXJyYXlCdWZmZXJcbiAgdmFyIGFiID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcblxuICAvLyBjcmVhdGUgYSB2aWV3IGludG8gdGhlIGJ1ZmZlclxuICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XG5cbiAgLy8gc2V0IHRoZSBieXRlcyBvZiB0aGUgYnVmZmVyIHRvIHRoZSBjb3JyZWN0IHZhbHVlc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlhW2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG5cbiAgLy8gd3JpdGUgdGhlIEFycmF5QnVmZmVyIHRvIGEgYmxvYiwgYW5kIHlvdSdyZSBkb25lXG4gIHZhciBibG9iID0gbmV3IEJsb2IoW2FiXSwge3R5cGU6IG1pbWVTdHJpbmd9KTtcbiAgcmV0dXJuIGJsb2I7XG5cbn1cbmV4cG9ydCBmdW5jdGlvbiBmdG9tKGYpIHtcbiAgLy8gcmV0dXJuIChNYXRoLmxvZyhmKSAtIE1hdGgubG9nKDI2MS42MjYpKSAvIE1hdGgubG9nKDIpICsgNC4wXG4gIHJldHVybiA2OSArIDEyICogTWF0aC5sb2cyKGYgLyA0NDApXG59XG5leHBvcnQgZnVuY3Rpb24gbXRvZihtKSB7XG4gIHJldHVybiA0NDAgKiBNYXRoLnBvdygyLCAobSAtIDY5KSAvIDEyKVxufVxuZXhwb3J0IGZ1bmN0aW9uIHRhcCAoZm4pIHtcbiAgcmV0dXJuIChlKSA9PiB7XG4gICAgaWYgKGJyb3dzZXIuaXNNb2JpbGUpIGZuKClcbiAgICBlbHNlIGlmIChlLnByZXNzKSBmbigpXG4gIH1cbn1cblxuLyogZ2V0IG1pbmltdW0gYW5kIG1heGltdW0gdmFyaWFuY2UgZnJvbSByb3ctdG8tcm93ICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRfZGlmZl9ib3VuZHMocm93cyl7XG4gIGNvbnN0IGRpZmZzID0gcm93cy5tYXAocm93ID0+IHtcbiAgICBjb25zdCByb3dfbWluID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgcm93KVxuICAgIGNvbnN0IHJvd19tYXggPSBNYXRoLm1heC5hcHBseShNYXRoLCByb3cpXG4gICAgcmV0dXJuIHJvd19tYXggLSByb3dfbWluXG4gIH0pXG4gIGNvbnN0IG1pbiA9IE1hdGgubWluLmFwcGx5KE1hdGgsIGRpZmZzKVxuICBjb25zdCBtYXggPSBNYXRoLm1heC5hcHBseShNYXRoLCBkaWZmcylcbiAgcmV0dXJuIHsgbWluLCBtYXggfVxufVxuXG4vKiBnZXQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgZnJvbSBhIGRhdGFzZXQgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldF9ib3VuZHMoZGF0YXNldCl7XG4gIGxldCByb3dzID0gZGF0YXNldC5saW5lc1xuICAvLyByb3dzLmZvckVhY2gocm93ID0+IHJvdy5zaGlmdCgpKVxuICByb3dzID0gcm93cy5tYXAoYSA9PiBhLm1hcChuID0+IHBhcnNlRmxvYXQobikpKVxuICBjb25zdCBtYXggPSByb3dzLnJlZHVjZSgoYSxiKSA9PiB7XG4gICAgcmV0dXJuIGIucmVkdWNlKCh6LGJiKSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoeiwgYmIpXG4gICAgfSwgYSlcbiAgfSwgLUluZmluaXR5KVxuICBjb25zdCBtaW4gPSByb3dzLnJlZHVjZSgoYSxiKSA9PiB7XG4gICAgcmV0dXJuIGIucmVkdWNlKCh6LGJiKSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5taW4oeiwgYmIpXG4gICAgfSwgYSlcbiAgfSwgSW5maW5pdHkpXG4gIHJldHVybiB7IHJvd3MsIG1heCwgbWluIH1cbn1cblxuLyogdHJhbnNwb3NlIGEgMkQgYXJyYXkgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShhKSB7XG4gIGxldCBpX2xlbiA9IGFbMF0ubGVuZ3RoXG4gIGxldCBqX2xlbiA9IGEubGVuZ3RoXG4gIGxldCBUID0gbmV3IEFycmF5KGlfbGVuKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlfbGVuOyBpKyspIHtcbiAgICBUW2ldID0gbmV3IEFycmF5KGpfbGVuKVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgal9sZW47IGorKykge1xuICAgICAgVFtpXVtqXSA9IGFbal1baV1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFRcbn1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2xpYi91dGlsLmpzIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJyk7XG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlcjtcbnZhciBTbG93QnVmZmVyID0gYnVmZmVyLlNsb3dCdWZmZXI7XG52YXIgTUFYX0xFTiA9IGJ1ZmZlci5rTWF4TGVuZ3RoIHx8IDIxNDc0ODM2NDc7XG5leHBvcnRzLmFsbG9jID0gZnVuY3Rpb24gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBCdWZmZXIuYWxsb2MgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKTtcbiAgfVxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3Qgbm90IGJlIG51bWJlcicpO1xuICB9XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoc2l6ZSA+IE1BWF9MRU4pIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc2l6ZSBpcyB0b28gbGFyZ2UnKTtcbiAgfVxuICB2YXIgZW5jID0gZW5jb2Rpbmc7XG4gIHZhciBfZmlsbCA9IGZpbGw7XG4gIGlmIChfZmlsbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jID0gdW5kZWZpbmVkO1xuICAgIF9maWxsID0gMDtcbiAgfVxuICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzaXplKTtcbiAgaWYgKHR5cGVvZiBfZmlsbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgZmlsbEJ1ZiA9IG5ldyBCdWZmZXIoX2ZpbGwsIGVuYyk7XG4gICAgdmFyIGZsZW4gPSBmaWxsQnVmLmxlbmd0aDtcbiAgICB2YXIgaSA9IC0xO1xuICAgIHdoaWxlICgrK2kgPCBzaXplKSB7XG4gICAgICBidWZbaV0gPSBmaWxsQnVmW2kgJSBmbGVuXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoX2ZpbGwpO1xuICB9XG4gIHJldHVybiBidWY7XG59XG5leHBvcnRzLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gYWxsb2NVbnNhZmUoc2l6ZSkge1xuICBpZiAodHlwZW9mIEJ1ZmZlci5hbGxvY1Vuc2FmZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSk7XG4gIH1cbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NpemUgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIGlmIChzaXplID4gTUFYX0xFTikge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdzaXplIGlzIHRvbyBsYXJnZScpO1xuICB9XG4gIHJldHVybiBuZXcgQnVmZmVyKHNpemUpO1xufVxuZXhwb3J0cy5mcm9tID0gZnVuY3Rpb24gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgQnVmZmVyLmZyb20gPT09ICdmdW5jdGlvbicgJiYgKCFnbG9iYWwuVWludDhBcnJheSB8fCBVaW50OEFycmF5LmZyb20gIT09IEJ1ZmZlci5mcm9tKSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICB2YXIgb2Zmc2V0ID0gZW5jb2RpbmdPck9mZnNldDtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuICAgIHZhciBsZW4gPSBsZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBsZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoIC0gb2Zmc2V0O1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID49IHZhbHVlLmJ5dGVMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpO1xuICAgIH1cbiAgICBpZiAobGVuID4gdmFsdWUuYnl0ZUxlbmd0aCAtIG9mZnNldCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQnVmZmVyKHZhbHVlLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbGVuKSk7XG4gIH1cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcih2YWx1ZS5sZW5ndGgpO1xuICAgIHZhbHVlLmNvcHkob3V0LCAwLCAwLCB2YWx1ZS5sZW5ndGgpO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8ICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB8fCAnbGVuZ3RoJyBpbiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5kYXRhKSkge1xuICAgICAgcmV0dXJuIG5ldyBCdWZmZXIodmFsdWUuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCAnICsgJ0FycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJyk7XG59XG5leHBvcnRzLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIGFsbG9jVW5zYWZlU2xvdyhzaXplKSB7XG4gIGlmICh0eXBlb2YgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KHNpemUpO1xuICB9XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoc2l6ZSA+PSBNQVhfTEVOKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NpemUgaXMgdG9vIGxhcmdlJyk7XG4gIH1cbiAgcmV0dXJuIG5ldyBTbG93QnVmZmVyKHNpemUpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2J1ZmZlci1zaGltcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAzM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJylcbiAgLy8gRVMzIHdyb25nIGhlcmVcbiAgLCBBUkcgPSBjb2YoZnVuY3Rpb24oKXsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY2xhc3NvZi5qc1xuLy8gbW9kdWxlIGlkID0gMzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qc1xuLy8gbW9kdWxlIGlkID0gMzVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50XG4gIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZG9tLWNyZWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAzN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanNcbi8vIG1vZHVsZSBpZCA9IDM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLWtleS5qc1xuLy8gbW9kdWxlIGlkID0gMzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXydcbiAgLCBzdG9yZSAgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qc1xuLy8gbW9kdWxlIGlkID0gNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qc1xuLy8gbW9kdWxlIGlkID0gNDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanNcbi8vIG1vZHVsZSBpZCA9IDQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpe1xuICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzXG4vLyBtb2R1bGUgaWQgPSA0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGNvcmUgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgTElCUkFSWSAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCB3a3NFeHQgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcy1leHQnKVxuICAsIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG4gIHZhciAkU3ltYm9sID0gY29yZS5TeW1ib2wgfHwgKGNvcmUuU3ltYm9sID0gTElCUkFSWSA/IHt9IDogZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG4gIGlmKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwge3ZhbHVlOiB3a3NFeHQuZihuYW1lKX0pO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1kZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX3drcycpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fd2tzLWV4dC5qc1xuLy8gbW9kdWxlIGlkID0gNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1xuLy8gbW9kdWxlIGlkID0gNDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2V2ZW50cy9ldmVudHMuanNcbi8vIG1vZHVsZSBpZCA9IDQ3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuXG52YXIgaXNCdWZmZXJFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nXG4gIHx8IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgc3dpdGNoIChlbmNvZGluZyAmJiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICBjYXNlICdoZXgnOiBjYXNlICd1dGY4JzogY2FzZSAndXRmLTgnOiBjYXNlICdhc2NpaSc6IGNhc2UgJ2JpbmFyeSc6IGNhc2UgJ2Jhc2U2NCc6IGNhc2UgJ3VjczInOiBjYXNlICd1Y3MtMic6IGNhc2UgJ3V0ZjE2bGUnOiBjYXNlICd1dGYtMTZsZSc6IGNhc2UgJ3Jhdyc6IHJldHVybiB0cnVlO1xuICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgIH1cbiAgICAgfVxuXG5cbmZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIGlmIChlbmNvZGluZyAmJiAhaXNCdWZmZXJFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZyk7XG4gIH1cbn1cblxuLy8gU3RyaW5nRGVjb2RlciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IHNwbGl0dGluZyBhIHNlcmllcyBvZlxuLy8gYnVmZmVycyBpbnRvIGEgc2VyaWVzIG9mIEpTIHN0cmluZ3Mgd2l0aG91dCBicmVha2luZyBhcGFydCBtdWx0aS1ieXRlXG4vLyBjaGFyYWN0ZXJzLiBDRVNVLTggaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZSBVVEYtOCBlbmNvZGluZy5cbi8vXG4vLyBAVE9ETyBIYW5kbGluZyBhbGwgZW5jb2RpbmdzIGluc2lkZSBhIHNpbmdsZSBvYmplY3QgbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHRcbi8vIHRvIHJlYXNvbiBhYm91dCB0aGlzIGNvZGUsIHNvIGl0IHNob3VsZCBiZSBzcGxpdCB1cCBpbiB0aGUgZnV0dXJlLlxuLy8gQFRPRE8gVGhlcmUgc2hvdWxkIGJlIGEgdXRmOC1zdHJpY3QgZW5jb2RpbmcgdGhhdCByZWplY3RzIGludmFsaWQgVVRGLTggY29kZVxuLy8gcG9pbnRzIGFzIHVzZWQgYnkgQ0VTVS04LlxudmFyIFN0cmluZ0RlY29kZXIgPSBleHBvcnRzLlN0cmluZ0RlY29kZXIgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB0aGlzLmVuY29kaW5nID0gKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLV9dLywgJycpO1xuICBhc3NlcnRFbmNvZGluZyhlbmNvZGluZyk7XG4gIHN3aXRjaCAodGhpcy5lbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgLy8gQ0VTVS04IHJlcHJlc2VudHMgZWFjaCBvZiBTdXJyb2dhdGUgUGFpciBieSAzLWJ5dGVzXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICAvLyBVVEYtMTYgcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDItYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDI7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAvLyBCYXNlLTY0IHN0b3JlcyAzIGJ5dGVzIGluIDQgY2hhcnMsIGFuZCBwYWRzIHRoZSByZW1haW5kZXIuXG4gICAgICB0aGlzLnN1cnJvZ2F0ZVNpemUgPSAzO1xuICAgICAgdGhpcy5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRoaXMud3JpdGUgPSBwYXNzVGhyb3VnaFdyaXRlO1xuICAgICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRW5vdWdoIHNwYWNlIHRvIHN0b3JlIGFsbCBieXRlcyBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIuIFVURi04IG5lZWRzIDRcbiAgLy8gYnl0ZXMsIGJ1dCBDRVNVLTggbWF5IHJlcXVpcmUgdXAgdG8gNiAoMyBieXRlcyBwZXIgc3Vycm9nYXRlKS5cbiAgdGhpcy5jaGFyQnVmZmVyID0gbmV3IEJ1ZmZlcig2KTtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJSZWNlaXZlZCA9IDA7XG4gIC8vIE51bWJlciBvZiBieXRlcyBleHBlY3RlZCBmb3IgdGhlIGN1cnJlbnQgaW5jb21wbGV0ZSBtdWx0aS1ieXRlIGNoYXJhY3Rlci5cbiAgdGhpcy5jaGFyTGVuZ3RoID0gMDtcbn07XG5cblxuLy8gd3JpdGUgZGVjb2RlcyB0aGUgZ2l2ZW4gYnVmZmVyIGFuZCByZXR1cm5zIGl0IGFzIEpTIHN0cmluZyB0aGF0IGlzXG4vLyBndWFyYW50ZWVkIHRvIG5vdCBjb250YWluIGFueSBwYXJ0aWFsIG11bHRpLWJ5dGUgY2hhcmFjdGVycy4gQW55IHBhcnRpYWxcbi8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgYnVmZmVyZWQgdXAsIGFuZCB3aWxsIGJlXG4vLyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgd3JpdGUgYWdhaW4gd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzLlxuLy9cbi8vIE5vdGU6IENvbnZlcnRpbmcgYSBCdWZmZXIgY29udGFpbmluZyBhbiBvcnBoYW4gc3Vycm9nYXRlIHRvIGEgU3RyaW5nXG4vLyBjdXJyZW50bHkgd29ya3MsIGJ1dCBjb252ZXJ0aW5nIGEgU3RyaW5nIHRvIGEgQnVmZmVyICh2aWEgYG5ldyBCdWZmZXJgLCBvclxuLy8gQnVmZmVyI3dyaXRlKSB3aWxsIHJlcGxhY2UgaW5jb21wbGV0ZSBzdXJyb2dhdGVzIHdpdGggdGhlIHVuaWNvZGVcbi8vIHJlcGxhY2VtZW50IGNoYXJhY3Rlci4gU2VlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMTIxMTczMDA5LyAuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgY2hhclN0ciA9ICcnO1xuICAvLyBpZiBvdXIgbGFzdCB3cml0ZSBlbmRlZCB3aXRoIGFuIGluY29tcGxldGUgbXVsdGlieXRlIGNoYXJhY3RlclxuICB3aGlsZSAodGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGhvdyBtYW55IHJlbWFpbmluZyBieXRlcyB0aGlzIGJ1ZmZlciBoYXMgdG8gb2ZmZXIgZm9yIHRoaXMgY2hhclxuICAgIHZhciBhdmFpbGFibGUgPSAoYnVmZmVyLmxlbmd0aCA+PSB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCkgP1xuICAgICAgICB0aGlzLmNoYXJMZW5ndGggLSB0aGlzLmNoYXJSZWNlaXZlZCA6XG4gICAgICAgIGJ1ZmZlci5sZW5ndGg7XG5cbiAgICAvLyBhZGQgdGhlIG5ldyBieXRlcyB0byB0aGUgY2hhciBidWZmZXJcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIHRoaXMuY2hhclJlY2VpdmVkLCAwLCBhdmFpbGFibGUpO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IGF2YWlsYWJsZTtcblxuICAgIGlmICh0aGlzLmNoYXJSZWNlaXZlZCA8IHRoaXMuY2hhckxlbmd0aCkge1xuICAgICAgLy8gc3RpbGwgbm90IGVub3VnaCBjaGFycyBpbiB0aGlzIGJ1ZmZlcj8gd2FpdCBmb3IgbW9yZSAuLi5cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgYnl0ZXMgYmVsb25naW5nIHRvIHRoZSBjdXJyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBidWZmZXJcbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoYXZhaWxhYmxlLCBidWZmZXIubGVuZ3RoKTtcblxuICAgIC8vIGdldCB0aGUgY2hhcmFjdGVyIHRoYXQgd2FzIHNwbGl0XG4gICAgY2hhclN0ciA9IHRoaXMuY2hhckJ1ZmZlci5zbGljZSgwLCB0aGlzLmNoYXJMZW5ndGgpLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpO1xuXG4gICAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICAgIHZhciBjaGFyQ29kZSA9IGNoYXJTdHIuY2hhckNvZGVBdChjaGFyU3RyLmxlbmd0aCAtIDEpO1xuICAgIGlmIChjaGFyQ29kZSA+PSAweEQ4MDAgJiYgY2hhckNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggKz0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgICAgY2hhclN0ciA9ICcnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRoaXMuY2hhclJlY2VpdmVkID0gdGhpcy5jaGFyTGVuZ3RoID0gMDtcblxuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzIGluIHRoaXMgYnVmZmVyLCBqdXN0IGVtaXQgb3VyIGNoYXJcbiAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNoYXJTdHI7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGFuZCBzZXQgY2hhckxlbmd0aCAvIGNoYXJSZWNlaXZlZFxuICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcik7XG5cbiAgdmFyIGVuZCA9IGJ1ZmZlci5sZW5ndGg7XG4gIGlmICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBidWZmZXIgdGhlIGluY29tcGxldGUgY2hhcmFjdGVyIGJ5dGVzIHdlIGdvdFxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkLCBlbmQpO1xuICAgIGVuZCAtPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgfVxuXG4gIGNoYXJTdHIgKz0gYnVmZmVyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIGVuZCk7XG5cbiAgdmFyIGVuZCA9IGNoYXJTdHIubGVuZ3RoIC0gMTtcbiAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGVuZCk7XG4gIC8vIENFU1UtODogbGVhZCBzdXJyb2dhdGUgKEQ4MDAtREJGRikgaXMgYWxzbyB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXJcbiAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuc3Vycm9nYXRlU2l6ZTtcbiAgICB0aGlzLmNoYXJMZW5ndGggKz0gc2l6ZTtcbiAgICB0aGlzLmNoYXJSZWNlaXZlZCArPSBzaXplO1xuICAgIHRoaXMuY2hhckJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgc2l6ZSwgMCwgc2l6ZSk7XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCAwLCBzaXplKTtcbiAgICByZXR1cm4gY2hhclN0ci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgfVxuXG4gIC8vIG9yIGp1c3QgZW1pdCB0aGUgY2hhclN0clxuICByZXR1cm4gY2hhclN0cjtcbn07XG5cbi8vIGRldGVjdEluY29tcGxldGVDaGFyIGRldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gaW5jb21wbGV0ZSBVVEYtOCBjaGFyYWN0ZXIgYXRcbi8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gSWYgc28sIGl0IHNldHMgdGhpcy5jaGFyTGVuZ3RoIHRvIHRoZSBieXRlXG4vLyBsZW5ndGggdGhhdCBjaGFyYWN0ZXIsIGFuZCBzZXRzIHRoaXMuY2hhclJlY2VpdmVkIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXNcbi8vIHRoYXQgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGFyYWN0ZXIuXG5TdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5kZXRlY3RJbmNvbXBsZXRlQ2hhciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2UgaGF2ZSB0byBjaGVjayBhdCB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyXG4gIHZhciBpID0gKGJ1ZmZlci5sZW5ndGggPj0gMykgPyAzIDogYnVmZmVyLmxlbmd0aDtcblxuICAvLyBGaWd1cmUgb3V0IGlmIG9uZSBvZiB0aGUgbGFzdCBpIGJ5dGVzIG9mIG91ciBidWZmZXIgYW5ub3VuY2VzIGFuXG4gIC8vIGluY29tcGxldGUgY2hhci5cbiAgZm9yICg7IGkgPiAwOyBpLS0pIHtcbiAgICB2YXIgYyA9IGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gaV07XG5cbiAgICAvLyBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtOCNEZXNjcmlwdGlvblxuXG4gICAgLy8gMTEwWFhYWFhcbiAgICBpZiAoaSA9PSAxICYmIGMgPj4gNSA9PSAweDA2KSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAyO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMFhYWFhcbiAgICBpZiAoaSA8PSAyICYmIGMgPj4gNCA9PSAweDBFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSAzO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gMTExMTBYWFhcbiAgICBpZiAoaSA8PSAzICYmIGMgPj4gMyA9PSAweDFFKSB7XG4gICAgICB0aGlzLmNoYXJMZW5ndGggPSA0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gaTtcbn07XG5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICB2YXIgcmVzID0gJyc7XG4gIGlmIChidWZmZXIgJiYgYnVmZmVyLmxlbmd0aClcbiAgICByZXMgPSB0aGlzLndyaXRlKGJ1ZmZlcik7XG5cbiAgaWYgKHRoaXMuY2hhclJlY2VpdmVkKSB7XG4gICAgdmFyIGNyID0gdGhpcy5jaGFyUmVjZWl2ZWQ7XG4gICAgdmFyIGJ1ZiA9IHRoaXMuY2hhckJ1ZmZlcjtcbiAgICB2YXIgZW5jID0gdGhpcy5lbmNvZGluZztcbiAgICByZXMgKz0gYnVmLnNsaWNlKDAsIGNyKS50b1N0cmluZyhlbmMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn07XG5cbmZ1bmN0aW9uIHBhc3NUaHJvdWdoV3JpdGUoYnVmZmVyKSB7XG4gIHJldHVybiBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG59XG5cbmZ1bmN0aW9uIHV0ZjE2RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDI7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMiA6IDA7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NERldGVjdEluY29tcGxldGVDaGFyKGJ1ZmZlcikge1xuICB0aGlzLmNoYXJSZWNlaXZlZCA9IGJ1ZmZlci5sZW5ndGggJSAzO1xuICB0aGlzLmNoYXJMZW5ndGggPSB0aGlzLmNoYXJSZWNlaXZlZCA/IDMgOiAwO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L25vZGUtbGlicy1icm93c2VyL34vc3RyaW5nX2RlY29kZXIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDQ4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBuZXh0VGljaztcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5uZXh0VGljaztcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3Byb2Nlc3MtbmV4dGljay1hcmdzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA0OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYXN5bmNXcml0ZSA9ICFwcm9jZXNzLmJyb3dzZXIgJiYgWyd2MC4xMCcsICd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsIDUpKSA+IC0xID8gc2V0SW1tZWRpYXRlIDogcHJvY2Vzc05leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYnVmZmVyU2hpbSA9IHJlcXVpcmUoJ2J1ZmZlci1zaGltcycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRlUmVxKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5jaHVuayA9IGNodW5rO1xuICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7XG4gIHRoaXMuY2FsbGJhY2sgPSBjYjtcbiAgdGhpcy5uZXh0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+fnRoaXMuaGlnaFdhdGVyTWFyaztcblxuICAvLyBkcmFpbiBldmVudCBmbGFnLlxuICB0aGlzLm5lZWREcmFpbiA9IGZhbHNlO1xuICAvLyBhdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlO1xuICAvLyB3aGVuIGVuZCgpIGhhcyBiZWVuIGNhbGxlZCwgYW5kIHJldHVybmVkXG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgLy8gd2hlbiAnZmluaXNoJyBpcyBlbWl0dGVkXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcblxuICAvLyBzaG91bGQgd2UgZGVjb2RlIHN0cmluZ3MgaW50byBidWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRvIF93cml0ZT9cbiAgLy8gdGhpcyBpcyBoZXJlIHNvIHRoYXQgc29tZSBub2RlLWNvcmUgc3RyZWFtcyBjYW4gb3B0aW1pemUgc3RyaW5nXG4gIC8vIGhhbmRsaW5nIGF0IGEgbG93ZXIgbGV2ZWwuXG4gIHZhciBub0RlY29kZSA9IG9wdGlvbnMuZGVjb2RlU3RyaW5ncyA9PT0gZmFsc2U7XG4gIHRoaXMuZGVjb2RlU3RyaW5ncyA9ICFub0RlY29kZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyBub3QgYW4gYWN0dWFsIGJ1ZmZlciB3ZSBrZWVwIHRyYWNrIG9mLCBidXQgYSBtZWFzdXJlbWVudFxuICAvLyBvZiBob3cgbXVjaCB3ZSdyZSB3YWl0aW5nIHRvIGdldCBwdXNoZWQgdG8gc29tZSB1bmRlcmx5aW5nXG4gIC8vIHNvY2tldCBvciBmaWxlLlxuICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2U7XG5cbiAgLy8gd2hlbiB0cnVlIGFsbCB3cml0ZXMgd2lsbCBiZSBidWZmZXJlZCB1bnRpbCAudW5jb3JrKCkgY2FsbFxuICB0aGlzLmNvcmtlZCA9IDA7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gYSBmbGFnIHRvIGtub3cgaWYgd2UncmUgcHJvY2Vzc2luZyBwcmV2aW91c2x5IGJ1ZmZlcmVkIGl0ZW1zLCB3aGljaFxuICAvLyBtYXkgY2FsbCB0aGUgX3dyaXRlKCkgY2FsbGJhY2sgaW4gdGhlIHNhbWUgdGljaywgc28gdGhhdCB3ZSBkb24ndFxuICAvLyBlbmQgdXAgaW4gYW4gb3ZlcmxhcHBlZCBvbndyaXRlIHNpdHVhdGlvbi5cbiAgdGhpcy5idWZmZXJQcm9jZXNzaW5nID0gZmFsc2U7XG5cbiAgLy8gdGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLGNiKVxuICB0aGlzLm9ud3JpdGUgPSBmdW5jdGlvbiAoZXIpIHtcbiAgICBvbndyaXRlKHN0cmVhbSwgZXIpO1xuICB9O1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0IHRoZSB1c2VyIHN1cHBsaWVzIHRvIHdyaXRlKGNodW5rLGVuY29kaW5nLGNiKVxuICB0aGlzLndyaXRlY2IgPSBudWxsO1xuXG4gIC8vIHRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDA7XG5cbiAgdGhpcy5idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIG51bWJlciBvZiBwZW5kaW5nIHVzZXItc3VwcGxpZWQgd3JpdGUgY2FsbGJhY2tzXG4gIC8vIHRoaXMgbXVzdCBiZSAwIGJlZm9yZSAnZmluaXNoJyBjYW4gYmUgZW1pdHRlZFxuICB0aGlzLnBlbmRpbmdjYiA9IDA7XG5cbiAgLy8gZW1pdCBwcmVmaW5pc2ggaWYgdGhlIG9ubHkgdGhpbmcgd2UncmUgd2FpdGluZyBmb3IgaXMgX3dyaXRlIGNic1xuICAvLyBUaGlzIGlzIHJlbGV2YW50IGZvciBzeW5jaHJvbm91cyBUcmFuc2Zvcm0gc3RyZWFtc1xuICB0aGlzLnByZWZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gVHJ1ZSBpZiB0aGUgZXJyb3Igd2FzIGFscmVhZHkgZW1pdHRlZCBhbmQgc2hvdWxkIG5vdCBiZSB0aHJvd24gYWdhaW5cbiAgdGhpcy5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcblxuICAvLyBjb3VudCBidWZmZXJlZCByZXF1ZXN0c1xuICB0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAvLyBhbGxvY2F0ZSB0aGUgZmlyc3QgQ29ya2VkUmVxdWVzdCwgdGhlcmUgaXMgYWx3YXlzXG4gIC8vIG9uZSBhbGxvY2F0ZWQgYW5kIGZyZWUgdG8gdXNlLCBhbmQgd2UgbWFpbnRhaW4gYXQgbW9zdCB0d29cbiAgdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdCh0aGlzKTtcbn1cblxuV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24gZ2V0QnVmZmVyKCkge1xuICB2YXIgY3VycmVudCA9IHRoaXMuYnVmZmVyZWRSZXF1ZXN0O1xuICB2YXIgb3V0ID0gW107XG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgb3V0LnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGVTdGF0ZS5wcm90b3R5cGUsICdidWZmZXInLCB7XG4gICAgICBnZXQ6IGludGVybmFsVXRpbC5kZXByZWNhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH0sICdfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciAnICsgJ2luc3RlYWQuJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbi8vIFRlc3QgX3dyaXRhYmxlU3RhdGUgZm9yIGluaGVyaXRhbmNlIHRvIGFjY291bnQgZm9yIER1cGxleCBzdHJlYW1zLFxuLy8gd2hvc2UgcHJvdG90eXBlIGNoYWluIG9ubHkgcG9pbnRzIHRvIFJlYWRhYmxlLlxudmFyIHJlYWxIYXNJbnN0YW5jZTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgcmV0dXJuIG9iamVjdCAmJiBvYmplY3QuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICByZWFsSGFzSW5zdGFuY2UgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIHRoaXM7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRvby5cbiAgLy8gYHJlYWxIYXNJbnN0YW5jZWAgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdXNpbmcgcGxhaW4gYGluc3RhbmNlb2ZgXG4gIC8vIHdvdWxkIHJldHVybiBmYWxzZSwgYXMgbm8gYF93cml0YWJsZVN0YXRlYCBwcm9wZXJ0eSBpcyBhdHRhY2hlZC5cblxuICAvLyBUcnlpbmcgdG8gdXNlIHRoZSBjdXN0b20gYGluc3RhbmNlb2ZgIGZvciBXcml0YWJsZSBoZXJlIHdpbGwgYWxzbyBicmVhayB0aGVcbiAgLy8gTm9kZS5qcyBMYXp5VHJhbnNmb3JtIGltcGxlbWVudGF0aW9uLCB3aGljaCBoYXMgYSBub24tdHJpdmlhbCBnZXR0ZXIgZm9yXG4gIC8vIGBfd3JpdGFibGVTdGF0ZWAgdGhhdCB3b3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cbiAgaWYgKCFyZWFsSGFzSW5zdGFuY2UuY2FsbChXcml0YWJsZSwgdGhpcykgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkge1xuICAgIHJldHVybiBuZXcgV3JpdGFibGUob3B0aW9ucyk7XG4gIH1cblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwcm9jZXNzTmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYSB1c2VyLXN1cHBsaWVkIGNodW5rIGlzIHZhbGlkLCBlc3BlY2lhbGx5IGZvciB0aGUgcGFydGljdWxhclxuLy8gbW9kZSB0aGUgc3RyZWFtIGlzIGluLiBDdXJyZW50bHkgdGhpcyBtZWFucyB0aGF0IGBudWxsYCBpcyBuZXZlciBhY2NlcHRlZFxuLy8gYW5kIHVuZGVmaW5lZC9ub24tc3RyaW5nIHZhbHVlcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCBtb2RlLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7XG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwcm9jZXNzTmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSBCdWZmZXIuaXNCdWZmZXIoY2h1bmspO1xuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChpc0J1ZikgZW5jb2RpbmcgPSAnYnVmZmVyJztlbHNlIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nO1xuXG4gIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbm9wO1xuXG4gIGlmIChzdGF0ZS5lbmRlZCkgd3JpdGVBZnRlckVuZCh0aGlzLCBjYik7ZWxzZSBpZiAoaXNCdWYgfHwgdmFsaWRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssIGNiKSkge1xuICAgIHN0YXRlLnBlbmRpbmdjYisrO1xuICAgIHJldCA9IHdyaXRlT3JCdWZmZXIodGhpcywgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBzdGF0ZS5jb3JrZWQrKztcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgaWYgKHN0YXRlLmNvcmtlZCkge1xuICAgIHN0YXRlLmNvcmtlZC0tO1xuXG4gICAgaWYgKCFzdGF0ZS53cml0aW5nICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS5idWZmZXJQcm9jZXNzaW5nICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCkgY2xlYXJCdWZmZXIodGhpcywgc3RhdGUpO1xuICB9XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIShbJ2hleCcsICd1dGY4JywgJ3V0Zi04JywgJ2FzY2lpJywgJ2JpbmFyeScsICdiYXNlNjQnLCAndWNzMicsICd1Y3MtMicsICd1dGYxNmxlJywgJ3V0Zi0xNmxlJywgJ3JhdyddLmluZGV4T2YoKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKCkpID4gLTEpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZyA9IGVuY29kaW5nO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IGJ1ZmZlclNoaW0uZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuLy8gaWYgd2UncmUgYWxyZWFkeSB3cml0aW5nIHNvbWV0aGluZywgdGhlbiBqdXN0IHB1dCB0aGlzXG4vLyBpbiB0aGUgcXVldWUsIGFuZCB3YWl0IG91ciB0dXJuLiAgT3RoZXJ3aXNlLCBjYWxsIF93cml0ZVxuLy8gSWYgd2UgcmV0dXJuIGZhbHNlLCB0aGVuIHdlIG5lZWQgYSBkcmFpbiBldmVudCwgc28gc2V0IHRoYXQgZmxhZy5cbmZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIoc3RyZWFtLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKCFpc0J1Zikge1xuICAgIGNodW5rID0gZGVjb2RlQ2h1bmsoc3RhdGUsIGNodW5rLCBlbmNvZGluZyk7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIGVuY29kaW5nID0gJ2J1ZmZlcic7XG4gIH1cbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG5cbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG5ldyBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuICBpZiAoc3luYykgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7ZWxzZSBjYihlcik7XG5cbiAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgIGFzeW5jV3JpdGUoYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcblxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICBidWZmZXJbY291bnRdID0gZW50cnk7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBjb3VudCArPSAxO1xuICAgIH1cblxuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgdHJ1ZSwgc3RhdGUubGVuZ3RoLCBidWZmZXIsICcnLCBob2xkZXIuZmluaXNoKTtcblxuICAgIC8vIGRvV3JpdGUgaXMgYWxtb3N0IGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgaWYgKGhvbGRlci5uZXh0KSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBob2xkZXIubmV4dDtcbiAgICAgIGhvbGRlci5uZXh0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3Qoc3RhdGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICAvLyBpZiB3ZSBkaWRuJ3QgY2FsbCB0aGUgb253cml0ZSBpbW1lZGlhdGVseSwgdGhlblxuICAgICAgLy8gaXQgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXQgZG9lcy5cbiAgICAgIC8vIGFsc28sIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2h1bmsgYW5kIGNiIGFyZSBjdXJyZW50bHlcbiAgICAgIC8vIGJlaW5nIHByb2Nlc3NlZCwgc28gbW92ZSB0aGUgYnVmZmVyIGNvdW50ZXIgcGFzdCB0aGVtLlxuICAgICAgaWYgKHN0YXRlLndyaXRpbmcpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVudHJ5ID09PSBudWxsKSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gZW50cnk7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSBmYWxzZTtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG5ldyBFcnJvcignX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAodHlwZW9mIGNodW5rID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBjaHVuaztcbiAgICBjaHVuayA9IG51bGw7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcblxuICAvLyAuZW5kKCkgZnVsbHkgdW5jb3Jrc1xuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkID0gMTtcbiAgICB0aGlzLnVuY29yaygpO1xuICB9XG5cbiAgLy8gaWdub3JlIHVubmVjZXNzYXJ5IGVuZCgpIGNhbGxzLlxuICBpZiAoIXN0YXRlLmVuZGluZyAmJiAhc3RhdGUuZmluaXNoZWQpIGVuZFdyaXRhYmxlKHRoaXMsIHN0YXRlLCBjYik7XG59O1xuXG5mdW5jdGlvbiBuZWVkRmluaXNoKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5lbmRpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdCA9PT0gbnVsbCAmJiAhc3RhdGUuZmluaXNoZWQgJiYgIXN0YXRlLndyaXRpbmc7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucHJlZmluaXNoZWQpIHtcbiAgICBzdGF0ZS5wcmVmaW5pc2hlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIG5lZWQgPSBuZWVkRmluaXNoKHN0YXRlKTtcbiAgaWYgKG5lZWQpIHtcbiAgICBpZiAoc3RhdGUucGVuZGluZ2NiID09PSAwKSB7XG4gICAgICBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5maW5pc2hlZCA9IHRydWU7XG4gICAgICBzdHJlYW0uZW1pdCgnZmluaXNoJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHByb2Nlc3NOZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBlbnRyeSA9IF90aGlzLmVudHJ5O1xuICAgIF90aGlzLmVudHJ5ID0gbnVsbDtcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgICBjYihlcnIpO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgIH1cbiAgICBpZiAoc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlKSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dCA9IF90aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBfdGhpcztcbiAgICB9XG4gIH07XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcycpO1xuZXhwb3J0cy5TdHJlYW0gPSBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUtYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFRvbmUgZnJvbSAndG9uZSdcbmltcG9ydCB7IGNob2ljZSB9IGZyb20gJy4vdXRpbCdcblxuY29uc3QgcGxheWVyX2NvdW50ID0gMlxubGV0IHNhbXBsZV9pbmRleCA9IDBcblxuY29uc3QgY29tcHJlc3NvciA9IG5ldyBUb25lLkNvbXByZXNzb3IoLTMwLCAzKS50b01hc3RlcigpXG5cbmNvbnN0IHNhbXBsZXMgPSBbXG4gIHsgcm9vdDogMjI2LCBmbjogJ3NhbXBsZXMvMzgwNzM3X19jYWJsZWQtbWVzc19fc2Fuc3VsYS0wMS1hLXJhdy5tcDMnLCB9LFxuICB7IHJvb3Q6IDI2NywgZm46ICdzYW1wbGVzLzM4MDczNl9fY2FibGVkLW1lc3NfX3NhbnN1bGEtMDItYy1yYXcubXAzJywgfSxcbiAgeyByb290OiAzNDAsIGZuOiAnc2FtcGxlcy8zODA3MzVfX2NhYmxlZC1tZXNzX19zYW5zdWxhLTAzLWUtcmF3Lm1wMycsIH0sXG4gIHsgcm9vdDogNDUyLCBmbjogJ3NhbXBsZXMvMzgwNzMzX19jYWJsZWQtbWVzc19fc2Fuc3VsYS0wNi1hLTAyLXJhdy5tcDMnLCB9LFxuLy8gIHsgcm9vdDogNTA3LCBmbjogJ3NhbXBsZXMvMzgwNzM0X19jYWJsZWQtbWVzc19fc2Fuc3VsYS0wNy1iLWgtcmF3Lm1wMycsIH0sXG4vLyAgeyByb290OiA1MzUsIGZuOiAnc2FtcGxlcy8zODA3MzFfX2NhYmxlZC1tZXNzX19zYW5zdWxhLTA4LWMtcmF3Lm1wMycsIH0sXG4vLyAgeyByb290OiA2NzEsIGZuOiAnc2FtcGxlcy8zODA3MzJfX2NhYmxlZC1tZXNzX19zYW5zdWxhLTA5LWUtcmF3Lm1wMycsIH0sXG5dXG5cbnNhbXBsZXMuZm9yRWFjaCgoc2FtcGxlKSA9PiB7XG4gIHNhbXBsZS5wbGF5ZXJzID0gW11cbiAgc2FtcGxlLmluZGV4ID0gLTFcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGF5ZXJfY291bnQ7IGkrKykge1xuICAgIGxldCBmbiA9IHNhbXBsZS5mblxuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZi5tYXRjaCgvYXNkZi51cy8pKSB7XG4gICAgICBmbiA9ICcvL2FzZGYudXMva2FsaW1iYS8nICsgZm5cbiAgICB9XG4gICAgbGV0IHBsYXllciA9IG5ldyBUb25lLlBsYXllcih7XG4gICAgICB1cmw6IGZuLFxuICAgICAgcmV0cmlnZ2VyOiB0cnVlLFxuICAgICAgcGxheWJhY2tSYXRlOiAxLFxuICAgIH0pXG4gICAgcGxheWVyLmNvbm5lY3QoY29tcHJlc3NvcilcbiAgICBzYW1wbGUucGxheWVycy5wdXNoKHBsYXllcilcbiAgfVxufSlcblxuZnVuY3Rpb24gcGxheSAoZnJlcSwgdm9sdW1lID0gMC4wKSB7XG4gIGNvbnN0IGJlc3QgPSB7IHNhbXBsZTogc2FtcGxlc1tzYW1wbGVfaW5kZXhdIH1cbiAgc2FtcGxlX2luZGV4ID0gKHNhbXBsZV9pbmRleCArIDEpICUgc2FtcGxlcy5sZW5ndGhcbiAgYmVzdC5zYW1wbGUuaW5kZXggPSAoYmVzdC5zYW1wbGUuaW5kZXggKyAxKSAlIHBsYXllcl9jb3VudFxuXG4gIGNvbnN0IHBsYXllciA9IGJlc3Quc2FtcGxlLnBsYXllcnNbIGJlc3Quc2FtcGxlLmluZGV4IF1cbiAgcGxheWVyLnBsYXliYWNrUmF0ZSA9IGZyZXEgLyBiZXN0LnNhbXBsZS5yb290XG4gIC8vIGNvbnNvbGUubG9nKHBsYXllcilcbiAgcGxheWVyLnZvbHVtZS52YWx1ZSA9IHZvbHVtZVxuICBzZXRUaW1lb3V0KCgpID0+IHsgcGxheWVyLnN0YXJ0KCkgfSwgMClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBwbGF5IH1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2xpYi9rYWxpbWJhLmpzIiwiaW1wb3J0IEludG9uYXRpb24gZnJvbSAnLi9pbnRvbmF0aW9uJ1xuXG5jb25zdCBtZWFudG9uZSA9IGAhIG1lYW5xdWFyLnNjbFxuIVxuMS80LWNvbW1hIG1lYW50b25lIHNjYWxlLiBQaWV0cm8gQWFyb24ncyB0ZW1wZXJhbWVudCAoMTUyMylcbiAxMlxuIVxuIDc2LjA0OTAwXG4gMTkzLjE1Njg2XG4gMzEwLjI2NDcxXG4gNS80XG4gNTAzLjQyMTU3XG4gNTc5LjQ3MDU3XG4gNjk2LjU3ODQzXG4gMjUvMTZcbiA4ODkuNzM1MjlcbiAxMDA2Ljg0MzE0XG4gMTA4Mi44OTIxNFxuIDIvMVxuYFxuXG5jb25zdCBzaGFyZXMgPSBgISBzaGFyZXMuc2NsXG4hXG5BIHNjYWxlIGJhc2VkIG9uIHNoYXJlcyBvZiB3ZWFsdGhcbiFcbjEuXG41LlxuMTUuXG4zMi5cbjUyLlxuNzguXG4xMTYuXG4xODIuXG41MjEuXG4xMDAwLlxuYFxuXG5jb25zdCBzaGFyZXNfc3VtID0gYCEgc2hhcmVzX3N1bS5zY2xcbiFcbkEgc2NhbGUgYmFzZWQgb24gc3VtbWluZyBzaGFyZXMgb2Ygd2VhbHRoXG4hXG4xXG42LjBcbjIxLjBcbjUzLjBcbjEwNS4wXG4xODMuMFxuMjk5LjBcbjQ4MS4wXG4xMDAyLjBcbjIvMVxuYFxuXG5jb25zdCBtYXZpbGEgPSBgISBtYXZpbGExMi5zY2xcbiFcbkEgMTItbm90ZSBtYXZpbGEgc2NhbGUgKGZvciB3YXJwaW5nIG1lYW50b25lLWJhc2VkIG11c2ljKSwgNS1saW1pdCBUT1BcbiAxMlxuIVxuLTMwLjk5NzE5XG4gMTYzLjUwNzcwXG4gMzU4LjAxMjU4XG4gMzI3LjAxNTQwXG4gNTIxLjUyMDI4XG4gNDkwLjUyMzEwXG4gNjg1LjAyNzk4XG4gNjU0LjAzMDgwXG4gODQ4LjUzNTY4XG4gMTA0My4wNDA1N1xuIDEwMTIuMDQzMzhcbiAxMjA2LjU0ODI2XG5gXG5cbmNvbnN0IGNhcmxvc19hbHBoYSA9IGAhIGNhcmxvc19hbHBoYS5zY2xcbiFcbldlbmR5IENhcmxvcycgQWxwaGEgc2NhbGUgd2l0aCBwZXJmZWN0IGZpZnRoIGRpdmlkZWQgaW4gbmluZVxuIDE4XG4hXG4gNzguMDAwMDBcbiAxNTYuMDAwMDBcbiAyMzQuMDAwMDBcbiAzMTIuMDAwMDBcbiAzOTAuMDAwMDBcbiA0NjguMDAwMDBcbiA1NDYuMDAwMDBcbiA2MjQuMDAwMDBcbiA3MDIuMDAwMDBcbiA3ODAuMDAwMDBcbiA4NTguMDAwMDBcbiA5MzYuMDAwMDBcbiAxMDE0LjAwMDAwXG4gMTA5Mi4wMDAwMFxuIDExNzAuMDAwMDBcbiAxMjQ4LjAwMDAwXG4gMTMyNi4wMDAwMFxuIDE0MDQuMDAwMDBcbmBcblxuY29uc3QgbGFtb250ZSA9IGAhIHlvdW5nLWxtX3BpYW5vLnNjbFxuIVxuTGFNb250ZSBZb3VuZydzIFdlbGwtVGVtcGVyZWQgUGlhbm9cbjEyXG4hXG41NjcvNTEyXG45LzhcbjE0Ny8xMjhcbjIxLzE2XG4xMzIzLzEwMjRcbjE4OS8xMjhcbjMvMlxuNDkvMzJcbjcvNFxuNDQxLzI1NlxuNjMvMzJcbjIvMVxuYFxuXG5jb25zdCBjb2x1bmRpID0gYCEgY29sdW5kaS5zY2xcbiFcbkNvbHVuZGkgc2NhbGVcbjEwXG4hXG45LzhcbjE3MS8xNDBcbjEzNy8xMTJcbjQzLzM1XG4zLzJcbjQyMS8yODBcbjIxMy8xNDBcbjI2My8xNTBcbjY2LzM1XG4yLzFcbmBcblxuY29uc3QgbGl1X21ham9yID0gYCEgbGl1X21ham9yLnNjbFxuIVxuTGludXMgTGl1J3MgTWFqb3IgU2NhbGUsIHNlZSBoaXMgMTk3OCBib29rLCBcIkludG9uYXRpb24gVGhlb3J5XCIgICAgICAgICAgICAgICAgIFxuIDdcbiFcbiAxMC85XG4gMTAwLzgxXG4gNC8zXG4gMy8yXG4gNS8zXG4gNTAvMjdcbiAyLzFcbmBcbmNvbnN0IGxpdV9wZW50YXRvbmljID0gYCEgbGl1X3BlbnQuc2NsXG4hXG5MaW51cyBMaXUncyBcInBlbnRhdG9uaWMgc2NhbGVcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gN1xuIVxuIDkvOFxuIDgxLzY0XG4gMjcvMjBcbiAzLzJcbiAyNy8xNlxuIDI0My8xMjhcbiA4MS80MFxuYFxuXG5jb25zdCBsaXVfbWlub3IgPSBgISBMSVVfTUlOb3Iuc2NsXG4hXG5MaW51cyBMaXUncyBIYXJtb25pYyBNaW5vciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIDdcbiFcbiAxMC85XG4gNi81XG4gNC8zXG4gNDAvMjdcbiA4LzVcbiA1MC8yN1xuIDIvMVxuYFxuXG5jb25zdCBsaXVfbWVsb2RpY19taW5vciA9IGAhIGxpdV9tZWwuc2NsXG4hXG5MaW51cyBMaXUncyBNZWxvZGljIE1pbm9yLCB1c2UgNSBhbmQgNyBkZXNjZW5kaW5nIGFuZCA2IGFuZCA4IGFzY2VuZGluZyAgICAgICAgIFxuIDlcbiFcbiAxMC85XG4gNi81XG4gNC8zXG4gMy8yXG4gODEvNTBcbiA1LzNcbiA5LzVcbiA1MC8yN1xuIDIvMVxuYFxuXG5jb25zdCBzY2FsZXMgPSBbXG4gIHtcbiAgICBpbnRlcnZhbHM6ICcxLzEgOS84IDUvNCA0LzMgMy8yIDUvMyAxNS84IDIvMScsXG4gICAgbmFtZTogXCJoYXJtb25pYyBzY2FsZVwiLFxuICB9LFxuICB7XG4gICAgcm9vdDogNDUwLFxuICAgIGludGVydmFsczogJzEvMSA5LzggNS80IDQvMyAzLzIgNS8zIDE1LzggMi8xJyxcbiAgICBuYW1lOiBcImhhcm1vbmljIHNjYWxlIEAgNDUwXCIsXG4gIH0sXG4gIHtcbiAgICB0ZXQ6IDUsXG4gIH0sXG4gIHtcbiAgICB0ZXQ6IDEyLFxuICB9LFxuICB7XG4gICAgdGV0OiAxNyxcbiAgfSxcbiAge1xuICAgIGludGVydmFsczogJzEvMSA4MS84MCAzMy8zMiAyMS8yMCAxNi8xNSAxMi8xMSAxMS8xMCAxMC85IDkvOCA4LzcgNy82IDMyLzI3IDYvNSAxMS85IDUvNCAxNC8xMSA5LzcgMjEvMTYgNC8zIDI3LzIwIDExLzggNy81IDEwLzcgMTYvMTEgNDAvMjcgMy8yIDMyLzIxIDE0LzkgMTEvNyA4LzUgMTgvMTEgNS8zIDI3LzE2IDEyLzcgNy80IDE2LzkgOS81IDIwLzExIDExLzYgMTUvOCA0MC8yMSA2NC8zMyAxNjAvODEgMi8xJyxcbiAgICBuYW1lOiBcImhhcnJ5IHBhcnRjaCBzY2FsZVwiLFxuICB9LFxuICB7XG4gICAgc2NsOiBsYW1vbnRlLFxuICB9LFxuICB7XG4gICAgc2NsOiBtZWFudG9uZSxcbiAgfSxcbiAge1xuICAgIHNjbDogbWF2aWxhLFxuICB9LFxuICB7XG4gICAgc2NsOiBjYXJsb3NfYWxwaGEsXG4gIH0sXG4gIHtcbiAgICBzY2w6IGNvbHVuZGksXG4gIH0sXG4gIHtcbiAgICBzY2w6IHNoYXJlcyxcbiAgfSxcbiAge1xuICAgIHNjbDogc2hhcmVzX3N1bSxcbiAgfSxcbiAge1xuICAgIHNjbDogbGl1X21ham9yLFxuICB9LFxuICB7XG4gICAgc2NsOiBsaXVfbWlub3IsXG4gIH0sXG4gIHtcbiAgICBzY2w6IGxpdV9tZWxvZGljX21pbm9yLFxuICB9LFxuICB7XG4gICAgc2NsOiBsaXVfcGVudGF0b25pYyxcbiAgfVxuXS5tYXAoIChvcHQpID0+IG5ldyBJbnRvbmF0aW9uKG9wdCkgKVxuXG5sZXQgc2NhbGUgPSBzY2FsZXNbMF1cbmxldCBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbigpe31cblxuZnVuY3Rpb24gYnVpbGQgKCkge1xuICBzY2FsZXMuZm9yRWFjaCggKHNjYWxlLCBpKSA9PiB7XG4gICAgc2NhbGUuaGVhZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgc2NhbGUuaGVhZGluZy5pbm5lckhUTUwgPSBzY2FsZS5uYW1lXG4gICAgc2NhbGUuaGVhZGluZy5jbGFzc0xpc3QuYWRkKCdoZWFkaW5nJylcbiAgICBzY2FsZS5oZWFkaW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKXtcbiAgICAgIHBpY2soaSlcbiAgICB9KVxuICAgIHNjYWxlX2xpc3QuYXBwZW5kQ2hpbGQoc2NhbGUuaGVhZGluZylcbiAgfSlcbiAgcGljaygwKVxufVxuZnVuY3Rpb24gYnVpbGRfb3B0aW9ucyhlbCkge1xuICBzY2FsZXMuZm9yRWFjaCggKHNjYWxlLCBpKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJylcbiAgICBvcHRpb24uaW5uZXJIVE1MID0gc2NhbGUubmFtZVxuICAgIG9wdGlvbi52YWx1ZSA9IGlcbiAgICBlbC5hcHBlbmRDaGlsZChvcHRpb24pXG4gIH0pXG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oZSl7XG4gICAgcGljayhlLnRhcmdldC52YWx1ZSlcbiAgfSlcbiAgcGljaygwKVxufVxuXG5mdW5jdGlvbiBwaWNrIChpKSB7XG4gIGlmIChzY2FsZSkge1xuICAgIHNjYWxlLmhlYWRpbmcgJiYgc2NhbGUuaGVhZGluZy5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpXG4gIH1cbiAgc2NhbGUgPSBzY2FsZXNbaV1cbiAgc2NhbGUuaGVhZGluZyAmJiBzY2FsZS5oZWFkaW5nLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJylcblx0aGFuZGxlQ2hhbmdlKHNjYWxlKVxufVxuXG5mdW5jdGlvbiBjdXJyZW50ICgpIHtcbiAgcmV0dXJuIHNjYWxlXG59XG5cbmZ1bmN0aW9uIG9uQ2hhbmdlIChmbikge1xuXHRoYW5kbGVDaGFuZ2UgPSBmblxufVxuXG5mdW5jdGlvbiBuYW1lcyAoKSB7XG5cdHJldHVybiBzY2FsZXMubWFwKCBzY2FsZSA9PiBzY2FsZS5uYW1lIClcbn1cblxuXG5leHBvcnQgZGVmYXVsdCB7IHNjYWxlcywgY3VycmVudCwgYnVpbGQsIGJ1aWxkX29wdGlvbnMsIHBpY2ssIG5hbWVzLCBvbkNoYW5nZSB9XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvbGliL3NjYWxlcy5qcyIsImltcG9ydCBOZXh1cyBmcm9tICduZXh1c3VpJ1xuXG5leHBvcnQgY29uc3QgbnggPSB3aW5kb3cubnggPSB7fVxuXG4vKiB1aSAtIHVwZGF0ZSBhbiBpbnQvZmxvYXQgdmFsdWUgKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZV92YWx1ZV9vbl9jaGFuZ2UoZWwsIGlkLCBpc19pbnQsIGZuKSB7XG4gIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpZCArICcgKyAudmFsJylcbiAgY29uc3QgdXBkYXRlID0gdiA9PiB7XG4gICAgbGFiZWwuaW5uZXJIVE1MID0gaXNfaW50ID8gcGFyc2VJbnQodikgOiB2LnRvRml4ZWQoMilcbiAgICBmbiAmJiBmbih2KVxuICB9XG4gIGVsLm9uKCdjaGFuZ2UnLCB1cGRhdGUpXG4gIHVwZGF0ZShlbC52YWx1ZSlcbiAgZWwudXBkYXRlID0gdXBkYXRlXG59XG5cbi8qIHVpIC0gdXBkYXRlIGEgcmFkaW8gYnV0dG9uICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVfcmFkaW9fdmFsdWVfb25fY2hhbmdlKGVsLCBpZCwgdmFsdWVzLCBmbikge1xuICBsZXQgb2xkX3YgPSBlbC5hY3RpdmVcbiAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkICsgJyArIC52YWwnKVxuICBjb25zdCB1cGRhdGUgPSB2ID0+IHtcbiAgICBpZiAodiA9PT0gLTEpIHtcbiAgICAgIHYgPSBlbC5hY3RpdmUgPSBvbGRfdlxuICAgIH0gZWxzZSB7XG4gICAgICBvbGRfdiA9IHZcbiAgICB9XG4gICAgbGFiZWwuaW5uZXJIVE1MID0gdmFsdWVzW3ZdWzFdXG4gICAgZm4gJiYgZm4odilcbiAgfVxuICBlbC5vbignY2hhbmdlJywgdXBkYXRlKVxuICB1cGRhdGUoZWwuYWN0aXZlKVxuICBlbC51cGRhdGUgPSB1cGRhdGVcbn1cblxuLyogdWkgLSBiaW5kL2J1aWxkIGEgc2VsZWN0IGRyb3Bkb3duICovXG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZF9vcHRpb25zKGVsLCBsaXN0cywgZm4pIHtcbiAgT2JqZWN0LmtleXMobGlzdHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCBsaXN0ID0gbGlzdHNba2V5XVxuICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpXG4gICAgb3B0aW9uLmlubmVySFRNTCA9IGxpc3QubmFtZVxuICAgIG9wdGlvbi52YWx1ZSA9IGtleVxuICAgIGVsLmFwcGVuZENoaWxkKG9wdGlvbilcbiAgfSlcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbihlKXtcbiAgICBmbihlLnRhcmdldC52YWx1ZSlcbiAgfSlcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9saWIvdWkuanMiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pc0l0ZXJhYmxlMiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2lzLWl0ZXJhYmxlXCIpO1xuXG52YXIgX2lzSXRlcmFibGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNJdGVyYWJsZTIpO1xuXG52YXIgX2dldEl0ZXJhdG9yMiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL2dldC1pdGVyYXRvclwiKTtcblxudmFyIF9nZXRJdGVyYXRvcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRJdGVyYXRvcjIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIHNsaWNlSXRlcmF0b3IoYXJyLCBpKSB7XG4gICAgdmFyIF9hcnIgPSBbXTtcbiAgICB2YXIgX24gPSB0cnVlO1xuICAgIHZhciBfZCA9IGZhbHNlO1xuICAgIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBfaSA9ICgwLCBfZ2V0SXRlcmF0b3IzLmRlZmF1bHQpKGFyciksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSB0cnVlO1xuICAgICAgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBfYXJyO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChhcnIsIGkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgICByZXR1cm4gYXJyO1xuICAgIH0gZWxzZSBpZiAoKDAsIF9pc0l0ZXJhYmxlMy5kZWZhdWx0KShPYmplY3QoYXJyKSkpIHtcbiAgICAgIHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xuICAgIH1cbiAgfTtcbn0oKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFiZWwtcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIk5leHVzXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIk5leHVzXCJdID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2ludGVyb3BSZXF1aXJlID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqW1wiZGVmYXVsdFwiXSA6IG9iajsgfTtcblx0XG5cdHZhciBOZXh1c1VJID0gX2ludGVyb3BSZXF1aXJlKF9fd2VicGFja19yZXF1aXJlX18oMSkpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBOZXh1c1VJO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9O1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZSA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9ialtcImRlZmF1bHRcIl0gOiBvYmo7IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHRleHBvcnRzLmNvbG9ycyA9IGNvbG9ycztcblx0ZXhwb3J0cy5jb250ZXh0ID0gY29udGV4dDtcblx0ZXhwb3J0cy5jbG9jayA9IGNsb2NrO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgSW50ZXJmYWNlcyA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDIpKTtcblx0XG5cdHZhciBtYXRoID0gX2ludGVyb3BSZXF1aXJlKF9fd2VicGFja19yZXF1aXJlX18oNSkpO1xuXHRcblx0dmFyIFJhY2sgPSBfaW50ZXJvcFJlcXVpcmUoX193ZWJwYWNrX3JlcXVpcmVfXygzOCkpO1xuXHRcblx0dmFyIFR1bmUgPSBfaW50ZXJvcFJlcXVpcmUoX193ZWJwYWNrX3JlcXVpcmVfXyg0MCkpO1xuXHRcblx0dmFyIFRyYW5zZm9ybSA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9fd2VicGFja19yZXF1aXJlX18oMzkpKTtcblx0XG5cdHZhciBDb3VudGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOCk7XG5cdHZhciBSYWRpbyA9IF9fd2VicGFja19yZXF1aXJlX18oNDEpO1xuXHR2YXIgRHJ1bmsgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KTtcblx0dmFyIFNlcXVlbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNik7XG5cdHZhciBNYXRyaXggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0XG5cdHZhciBXQUFDbG9jayA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDQyKSk7XG5cdFxuXHR2YXIgSW50ZXJ2YWwgPSBfaW50ZXJvcFJlcXVpcmUoX193ZWJwYWNrX3JlcXVpcmVfXyg0NSkpO1xuXHRcblx0LyoqXG5cdE5leHVzVUkgPT4gY3JlYXRlZCBhcyBOZXh1c1xuXHQqL1xuXHRcblx0dmFyIE5leHVzVUkgPSAoZnVuY3Rpb24gKCkge1xuXHQgIGZ1bmN0aW9uIE5leHVzVUkoY29udGV4dCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5leHVzVUkpO1xuXHRcblx0ICAgIGZvciAodmFyIGtleSBpbiBJbnRlcmZhY2VzKSB7XG5cdCAgICAgIHRoaXNba2V5XSA9IEludGVyZmFjZXNba2V5XTtcblx0ICAgIH1cblx0XG5cdCAgICBmb3IgKHZhciBrZXkgaW4gbWF0aCkge1xuXHQgICAgICB0aGlzW2tleV0gPSBtYXRoW2tleV07XG5cdCAgICB9XG5cdFxuXHQgICAgdmFyIENvcmUgPSB7XG5cdCAgICAgIFJhY2s6IFJhY2tcblx0ICAgIH07XG5cdFxuXHQgICAgdmFyIE1vZGVscyA9IHtcblx0ICAgICAgQ291bnRlcjogQ291bnRlcixcblx0ICAgICAgUmFkaW86IFJhZGlvLFxuXHQgICAgICBEcnVuazogRHJ1bmssXG5cdCAgICAgIFNlcXVlbmNlOiBTZXF1ZW5jZSxcblx0ICAgICAgTWF0cml4OiBNYXRyaXhcblx0ICAgIH07XG5cdFxuXHQgICAgZm9yICh2YXIga2V5IGluIE1vZGVscykge1xuXHQgICAgICB0aGlzW2tleV0gPSBNb2RlbHNba2V5XTtcblx0ICAgIH1cblx0XG5cdCAgICBmb3IgKHZhciBrZXkgaW4gQ29yZSkge1xuXHQgICAgICB0aGlzW2tleV0gPSBDb3JlW2tleV07XG5cdCAgICB9XG5cdFxuXHQgICAgdmFyIERlZmF1bHRDb250ZXh0ID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0O1xuXHQgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQgfHwgbmV3IERlZmF1bHRDb250ZXh0KCk7XG5cdFxuXHQgICAgdGhpcy50dW5lID0gbmV3IFR1bmUoKTtcblx0ICAgIHRoaXMubm90ZSA9IHRoaXMudHVuZS5ub3RlLmJpbmQodGhpcy50dW5lKTtcblx0XG5cdCAgICB0aGlzLmNsb2NrID0gbmV3IFdBQUNsb2NrKHRoaXMuX2NvbnRleHQpO1xuXHQgICAgdGhpcy5jbG9jay5zdGFydCgpO1xuXHQgICAgdGhpcy5JbnRlcnZhbCA9IEludGVydmFsO1xuXHRcblx0ICAgIHRoaXMuY29sb3JzID0ge1xuXHQgICAgICBhY2NlbnQ6IFwiIzJiYlwiLFxuXHQgICAgICBmaWxsOiBcIiNlZWVcIixcblx0ICAgICAgbGlnaHQ6IFwiI2ZmZlwiLFxuXHQgICAgICBkYXJrOiBcIiMzMzNcIixcblx0ICAgICAgbWVkaXVtTGlnaHQ6IFwiI2NjY1wiLFxuXHQgICAgICBtZWRpdW1EYXJrOiBcIiM2NjZcIlxuXHQgICAgfTtcblx0XG5cdCAgICB0aGlzLnRyYW5zZm9ybSA9IFRyYW5zZm9ybTtcblx0ICAgIHRoaXMuYWRkID0gVHJhbnNmb3JtLmFkZDtcblx0XG5cdCAgICB0aGlzLkFkZCA9IHt9O1xuXHQgICAgZm9yICh2YXIga2V5IGluIEludGVyZmFjZXMpIHtcblx0ICAgICAgdGhpcy5BZGRba2V5XSA9IFRyYW5zZm9ybS5hZGQuYmluZCh0aGlzLCBrZXkpO1xuXHQgICAgfVxuXHRcblx0ICAgIC8qIGNyZWF0ZSBkZWZhdWx0IGNvbXBvbmVudCBzaXplICovXG5cdCAgICAvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdCAgICB2YXIgZXhpc3RpbmdTdHlsZXNoZWV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3R5bGVcIik7XG5cdCAgICB2YXIgZGVmYXVsdFNpemVEZWNsYXJhdGlvbiA9IFwiW25leHVzLXVpXXtoZWlnaHQ6NTAwMHB4O3dpZHRoOjUwMDBweH1cIjtcblx0ICAgIHZhciBkZWZhdWx0U3R5bGVOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHQgICAgZGVmYXVsdFN0eWxlTm9kZS50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuXHQgICAgZGVmYXVsdFN0eWxlTm9kZS5pbm5lckhUTUwgPSBkZWZhdWx0U2l6ZURlY2xhcmF0aW9uO1xuXHQgICAgaWYgKGV4aXN0aW5nU3R5bGVzaGVldHMubGVuZ3RoID4gMCkge1xuXHQgICAgICB2YXIgcGFyZW50ID0gZXhpc3RpbmdTdHlsZXNoZWV0c1swXS5wYXJlbnROb2RlO1xuXHQgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRlZmF1bHRTdHlsZU5vZGUsIGV4aXN0aW5nU3R5bGVzaGVldHNbMF0pO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgZG9jdW1lbnQud3JpdGUoXCI8c3R5bGU+XCIgKyBkZWZhdWx0U2l6ZURlY2xhcmF0aW9uICsgXCI8L3N0eWxlPlwiKTtcblx0ICAgIH1cblx0ICAgIC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cdCAgfVxuXHRcblx0ICBfY3JlYXRlQ2xhc3MoTmV4dXNVSSwge1xuXHQgICAgY29udGV4dDoge1xuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fY29udGV4dDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAoY3R4KSB7XG5cdCAgICAgICAgdGhpcy5jbG9jay5zdG9wKCk7XG5cdCAgICAgICAgdGhpcy5fY29udGV4dCA9IGN0eDtcblx0ICAgICAgICB0aGlzLmNsb2NrID0gbmV3IFdBQUNsb2NrKHRoaXMuY29udGV4dCk7XG5cdCAgICAgICAgdGhpcy5jbG9jay5zdGFydCgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBOZXh1c1VJO1xuXHR9KSgpO1xuXHRcblx0dmFyIE5leHVzID0gbmV3IE5leHVzVUkoKTtcblx0XG5cdGZ1bmN0aW9uIGNvbG9ycygpIHtcblx0ICByZXR1cm4gTmV4dXMuY29sb3JzO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBjb250ZXh0KCkge1xuXHQgIHJldHVybiBOZXh1cy5jb250ZXh0O1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBjbG9jaygpIHtcblx0ICByZXR1cm4gTmV4dXMuY2xvY2s7XG5cdH1cblx0XG5cdGV4cG9ydHNbXCJkZWZhdWx0XCJdID0gTmV4dXM7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdCAgUG9zaXRpb246IF9fd2VicGFja19yZXF1aXJlX18oMyksXG5cdCAgU2xpZGVyOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSxcblx0ICBUb2dnbGU6IF9fd2VicGFja19yZXF1aXJlX18oMTUpLFxuXHQgIC8qICBSYW5nZTogcmVxdWlyZSgnLi9yYW5nZXNsaWRlcicpLFxuXHQgICAgV2F2ZWZvcm06IHJlcXVpcmUoJy4vd2F2ZWZvcm0nKSwgKi9cblx0ICBCdXR0b246IF9fd2VicGFja19yZXF1aXJlX18oMTYpLFxuXHQgIFRleHRCdXR0b246IF9fd2VicGFja19yZXF1aXJlX18oMTgpLFxuXHQgIFJhZGlvQnV0dG9uOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KSxcblx0ICBOdW1iZXI6IF9fd2VicGFja19yZXF1aXJlX18oMjApLFxuXHQgIFNlbGVjdDogX193ZWJwYWNrX3JlcXVpcmVfXygyMSksXG5cdCAgRGlhbDogX193ZWJwYWNrX3JlcXVpcmVfXygyMiksXG5cdCAgUGlhbm86IF9fd2VicGFja19yZXF1aXJlX18oMjMpLFxuXHQgIFNlcXVlbmNlcjogX193ZWJwYWNrX3JlcXVpcmVfXygyNCksXG5cdCAgUGFuMkQ6IF9fd2VicGFja19yZXF1aXJlX18oMjkpLFxuXHQgIFRpbHQ6IF9fd2VicGFja19yZXF1aXJlX18oMzApLFxuXHQgIE11bHRpc2xpZGVyOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKSxcblx0ICBQYW46IF9fd2VicGFja19yZXF1aXJlX18oMzMpLFxuXHQgIEVudmVsb3BlOiBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KSxcblx0ICBTcGVjdHJvZ3JhbTogX193ZWJwYWNrX3JlcXVpcmVfXygzNSksXG5cdCAgTWV0ZXI6IF9fd2VicGFja19yZXF1aXJlX18oMzYpLFxuXHQgIE9zY2lsbG9zY29wZTogX193ZWJwYWNrX3JlcXVpcmVfXygzNylcblx0fTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChvYmplY3QsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MgJiYgZGVzYy53cml0YWJsZSkgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH07XG5cdFxuXHR2YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH07XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgc3ZnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyIEludGVyZmFjZSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdHZhciBTdGVwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdFxuXHR2YXIgSW50ZXJhY3Rpb24gPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSk7XG5cdFxuXHQvKipcblx0KiBQb3NpdGlvblxuXHQqXG5cdCogQGRlc2NyaXB0aW9uIFR3by1kaW1lbnNpb25hbCB0b3VjaCBzbGlkZXIuXG5cdCpcblx0KiBAZGVtbyA8c3BhbiBuZXh1cy11aT1cInBvc2l0aW9uXCI+PC9zcGFuPlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgcG9zaXRpb24gPSBuZXcgTmV4dXMuUG9zaXRpb24oJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgcG9zaXRpb24gPSBuZXcgTmV4dXMuUG9zaXRpb24oJyN0YXJnZXQnLHtcblx0KiAgICdzaXplJzogWzIwMCwyMDBdLFxuXHQqICAgJ21vZGUnOiAnYWJzb2x1dGUnLCAgLy8gXCJhYnNvbHV0ZVwiIG9yIFwicmVsYXRpdmVcIlxuXHQqICAgJ3gnOiAwLjUsICAvLyBpbml0aWFsIHggdmFsdWVcblx0KiAgICdtaW5YJzogMCxcblx0KiAgICdtYXhYJzogMSxcblx0KiAgICdzdGVwWCc6IDAsXG5cdCogICAneSc6IDAuNSwgIC8vIGluaXRpYWwgeSB2YWx1ZVxuXHQqICAgJ21pblknOiAwLFxuXHQqICAgJ21heFknOiAxLFxuXHQqICAgJ3N0ZXBZJzogMFxuXHQqIH0pXG5cdCpcblx0KiBAb3V0cHV0XG5cdCogY2hhbmdlXG5cdCogRmlyZXMgYW55IHRpbWUgdGhlIGludGVyZmFjZSdzIHZhbHVlIGNoYW5nZXMuIDxicj5cblx0KiBUaGUgZXZlbnQgZGF0YSBpcyBhbiBvYmplY3Qgd2l0aCB4IGFuZCB5IHByb3BlcnRpZXMgY29udGFpbmluZyB0aGUgeCBhbmQgeSB2YWx1ZXMgb2YgdGhlIGludGVyZmFjZS5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogcG9zaXRpb24ub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuXHQqICAgY29uc29sZS5sb2codik7XG5cdCogfSlcblx0KlxuXHQqXG5cdCovXG5cdFxuXHR2YXIgUG9zaXRpb24gPSAoZnVuY3Rpb24gKF9JbnRlcmZhY2UpIHtcblx0ICBmdW5jdGlvbiBQb3NpdGlvbigpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3NpdGlvbik7XG5cdFxuXHQgICAgdmFyIG9wdGlvbnMgPSBbXCJ2YWx1ZVwiXTtcblx0XG5cdCAgICB2YXIgZGVmYXVsdHMgPSB7XG5cdCAgICAgIHNpemU6IFsyMDAsIDIwMF0sXG5cdCAgICAgIG1vZGU6IFwiYWJzb2x1dGVcIixcblx0ICAgICAgbWluWDogMCxcblx0ICAgICAgbWF4WDogMSxcblx0ICAgICAgc3RlcFg6IDAsXG5cdCAgICAgIHg6IDAuNSxcblx0ICAgICAgbWluWTogMCxcblx0ICAgICAgbWF4WTogMSxcblx0ICAgICAgc3RlcFk6IDAsXG5cdCAgICAgIHk6IDAuNVxuXHQgICAgfTtcblx0XG5cdCAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihQb3NpdGlvbi5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgYXJndW1lbnRzLCBvcHRpb25zLCBkZWZhdWx0cyk7XG5cdFxuXHQgICAgdGhpcy5feCA9IG5ldyBTdGVwKHRoaXMuc2V0dGluZ3MubWluWCwgdGhpcy5zZXR0aW5ncy5tYXhYLCB0aGlzLnNldHRpbmdzLnN0ZXBYLCB0aGlzLnNldHRpbmdzLngpO1xuXHQgICAgdGhpcy5feSA9IG5ldyBTdGVwKHRoaXMuc2V0dGluZ3MubWluWSwgdGhpcy5zZXR0aW5ncy5tYXhZLCB0aGlzLnNldHRpbmdzLnN0ZXBZLCB0aGlzLnNldHRpbmdzLnkpO1xuXHRcblx0ICAgIHRoaXMucG9zaXRpb24gPSB7XG5cdCAgICAgIHg6IG5ldyBJbnRlcmFjdGlvbi5IYW5kbGUodGhpcy5zZXR0aW5ncy5tb2RlLCBcImhvcml6b250YWxcIiwgWzAsIHRoaXMud2lkdGhdLCBbdGhpcy5oZWlnaHQsIDBdKSxcblx0ICAgICAgeTogbmV3IEludGVyYWN0aW9uLkhhbmRsZSh0aGlzLnNldHRpbmdzLm1vZGUsIFwidmVydGljYWxcIiwgWzAsIHRoaXMud2lkdGhdLCBbdGhpcy5oZWlnaHQsIDBdKVxuXHQgICAgfTtcblx0ICAgIHRoaXMucG9zaXRpb24ueC52YWx1ZSA9IHRoaXMuX3gubm9ybWFsaXplZDtcblx0ICAgIHRoaXMucG9zaXRpb24ueS52YWx1ZSA9IHRoaXMuX3kubm9ybWFsaXplZDtcblx0XG5cdCAgICB0aGlzLmluaXQoKTtcblx0ICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoUG9zaXRpb24sIF9JbnRlcmZhY2UpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoUG9zaXRpb24sIHtcblx0ICAgIGJ1aWxkSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEludGVyZmFjZSgpIHtcblx0XG5cdCAgICAgICAgdGhpcy5rbm9iID0gc3ZnLmNyZWF0ZShcImNpcmNsZVwiKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5rbm9iKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMucG9zaXRpb24ueC5yZXNpemUoWzAsIHRoaXMud2lkdGhdLCBbdGhpcy5oZWlnaHQsIDBdKTtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLnkucmVzaXplKFswLCB0aGlzLndpZHRoXSwgW3RoaXMuaGVpZ2h0LCAwXSk7XG5cdFxuXHQgICAgICAgIHRoaXMuX21pbkRpbWVuc2lvbiA9IE1hdGgubWluKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0XG5cdCAgICAgICAgdGhpcy5rbm9iUmFkaXVzID0ge1xuXHQgICAgICAgICAgb2ZmOiB+IH4odGhpcy5fbWluRGltZW5zaW9uIC8gMTAwKSAqIDUgKyA1IH07XG5cdCAgICAgICAgdGhpcy5rbm9iUmFkaXVzLm9uID0gdGhpcy5rbm9iUmFkaXVzLm9mZiAqIDI7XG5cdFxuXHQgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB0aGlzLndpZHRoIC8gMik7XG5cdCAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImN5XCIsIHRoaXMuaGVpZ2h0IC8gMik7XG5cdCAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcInJcIiwgdGhpcy5rbm9iUmFkaXVzLm9mZik7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjb2xvckludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY29sb3JJbnRlcmZhY2UoKSB7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMuYWNjZW50KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbmRlcjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcblx0ICAgICAgICAgIC8vICB0aGlzLmtub2JSYWRpdXMgPSAzMDtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJyXCIsIHRoaXMua25vYlJhZGl1cy5vbik7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIC8vICB0aGlzLmtub2JSYWRpdXMgPSAxNTtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJyXCIsIHRoaXMua25vYlJhZGl1cy5vZmYpO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgdGhpcy5rbm9iQ29vcmRpbmF0ZXMgPSB7XG5cdCAgICAgICAgICB4OiB0aGlzLl94Lm5vcm1hbGl6ZWQgKiB0aGlzLndpZHRoLFxuXHQgICAgICAgICAgeTogdGhpcy5oZWlnaHQgLSB0aGlzLl95Lm5vcm1hbGl6ZWQgKiB0aGlzLmhlaWdodFxuXHQgICAgICAgIH07XG5cdFxuXHQgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB0aGlzLmtub2JDb29yZGluYXRlcy54KTtcblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3lcIiwgdGhpcy5rbm9iQ29vcmRpbmF0ZXMueSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGljazoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2soKSB7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi54LmFuY2hvciA9IHRoaXMubW91c2U7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi55LmFuY2hvciA9IHRoaXMubW91c2U7XG5cdCAgICAgICAgdGhpcy5tb3ZlKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtb3ZlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcblx0ICAgICAgICAgIHRoaXMucG9zaXRpb24ueC51cGRhdGUodGhpcy5tb3VzZSk7XG5cdCAgICAgICAgICB0aGlzLnBvc2l0aW9uLnkudXBkYXRlKHRoaXMubW91c2UpO1xuXHQgICAgICAgICAgdGhpcy5feC51cGRhdGVOb3JtYWwodGhpcy5wb3NpdGlvbi54LnZhbHVlKTtcblx0ICAgICAgICAgIHRoaXMuX3kudXBkYXRlTm9ybWFsKHRoaXMucG9zaXRpb24ueS52YWx1ZSk7XG5cdCAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgICB4OiB0aGlzLl94LnZhbHVlLFxuXHQgICAgICAgICAgICB5OiB0aGlzLl95LnZhbHVlXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVsZWFzZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVsZWFzZSgpIHtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgeDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgICogVGhlIGludGVyZmFjZSdzIHggdmFsdWUuIFdoZW4gc2V0LCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRvIGZpdCBtaW4vbWF4L3N0ZXAgc2V0dGluZ3Mgb2YgdGhlIGludGVyZmFjZS5cblx0ICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuXHQgICAgICAqIEBleGFtcGxlIHBvc2l0aW9uLnggPSAwLjU7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5feC52YWx1ZTtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICB0aGlzLl94LnVwZGF0ZSh2YWx1ZSk7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHtcblx0ICAgICAgICAgIHg6IHRoaXMuX3gudmFsdWUsXG5cdCAgICAgICAgICB5OiB0aGlzLl95LnZhbHVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHk6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICAqIFRoZSBpbnRlcmZhY2UncyB5IHZhbHVlcy4gV2hlbiBzZXQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBhZGp1c3QgdG8gZml0IG1pbi9tYXgvc3RlcCBzZXR0aW5ncyBvZiB0aGUgaW50ZXJmYWNlLlxuXHQgICAgICAqIEB0eXBlIHtvYmplY3R9XG5cdCAgICAgICogQGV4YW1wbGUgcG9zaXRpb24ueCA9IDAuNTtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl95LnZhbHVlO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuX3kudXBkYXRlKHZhbHVlKTtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgeDogdGhpcy5feC52YWx1ZSxcblx0ICAgICAgICAgIHk6IHRoaXMuX3kudmFsdWVcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbm9ybWFsaXplZDoge1xuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgeDogdGhpcy5feC5ub3JtYWxpemVkLFxuXHQgICAgICAgICAgeTogdGhpcy5feS5ub3JtYWxpemVkXG5cdCAgICAgICAgfTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1pblg6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICAqIFRoZSBsb3dlciBsaW1pdCBvZiB2YWx1ZSBvbiB0aGUgeCBheGlzXG5cdCAgICAgICogQHR5cGUge29iamVjdH1cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl94Lm1pbjtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3gubWluID0gdjtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbWluWToge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgICogVGhlIGxvd2VyIGxpbWl0IG9mIHZhbHVlIG9uIHRoZSB5IGF4aXNcblx0ICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3kubWluO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5feS5taW4gPSB2O1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtYXhYOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgKiBUaGUgdXBwZXIgbGltaXQgb2YgdmFsdWUgb24gdGhlIHggYXhpc1xuXHQgICAgICAqIEB0eXBlIHtvYmplY3R9XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5feC5tYXg7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcblx0ICAgICAgICB0aGlzLl94Lm1heCA9IHY7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1heFk6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICAqIFRoZSB1cHBlciBsaW1pdCBvZiB2YWx1ZSBvbiB0aGUgeSBheGlzXG5cdCAgICAgICogQHR5cGUge29iamVjdH1cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl95Lm1heDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3kubWF4ID0gdjtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc3RlcFg6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICAqIFRoZSBpbmNyZW1lbnRhbCBzdGVwIG9mIHZhbHVlcyBvbiB0aGUgeCBheGlzXG5cdCAgICAgICogQHR5cGUge29iamVjdH1cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl94LnN0ZXA7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcblx0ICAgICAgICB0aGlzLl94LnN0ZXAgPSB2O1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzdGVwWToge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgICogVGhlIGluY3JlbWVudGFsIHN0ZXAgb2YgdmFsdWVzIG9uIHRoZSB5IGF4aXNcblx0ICAgICAgKiBAdHlwZSB7b2JqZWN0fVxuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3kuc3RlcDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3kuc3RlcCA9IHY7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1vZGU6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBBYnNvbHV0ZSBtb2RlIChwb3NpdGlvbidzIHZhbHVlIGp1bXBzIHRvIG1vdXNlIGNsaWNrIHBvc2l0aW9uKSBvciByZWxhdGl2ZSBtb2RlIChtb3VzZSBkcmFnIGNoYW5nZXMgdmFsdWUgcmVsYXRpdmUgdG8gaXRzIGN1cnJlbnQgcG9zaXRpb24pLiBEZWZhdWx0OiBcImFic29sdXRlXCIuXG5cdCAgICAgIEB0eXBlIHtzdHJpbmd9XG5cdCAgICAgIEBleGFtcGxlIHBvc2l0aW9uLm1vZGUgPSBcInJlbGF0aXZlXCI7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi54Lm1vZGU7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLngubW9kZSA9IHY7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi55Lm1vZGUgPSB2O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBQb3NpdGlvbjtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gUG9zaXRpb247XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIG1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSB7XG5cdFxuXHQgIGNyZWF0ZTogZnVuY3Rpb24gKHR5cGUpIHtcblx0ICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB0eXBlKTtcblx0ICB9LFxuXHRcblx0ICBhcmM6IGZ1bmN0aW9uICh4LCB5LCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKSB7XG5cdFxuXHQgICAgdmFyIHN0YXJ0ID0gbWF0aC50b0NhcnRlc2lhbihyYWRpdXMsIGVuZEFuZ2xlKTtcblx0ICAgIHZhciBlbmQgPSBtYXRoLnRvQ2FydGVzaWFuKHJhZGl1cywgc3RhcnRBbmdsZSk7XG5cdFxuXHQgICAgdmFyIGxhcmdlQXJjRmxhZyA9IGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSA8PSAxODAgPyBcIjBcIiA6IFwiMVwiO1xuXHRcblx0ICAgIHZhciBkID0gW1wiTVwiLCBzdGFydC54ICsgeCwgc3RhcnQueSArIHksIFwiQVwiLCByYWRpdXMsIHJhZGl1cywgMCwgbGFyZ2VBcmNGbGFnLCAwLCBlbmQueCArIHgsIGVuZC55ICsgeV0uam9pbihcIiBcIik7XG5cdFxuXHQgICAgcmV0dXJuIGQ7XG5cdCAgfSxcblx0XG5cdCAgcmFkaWFsR3JhZGllbnQ6IGZ1bmN0aW9uIChkZWZzLCBudW1iZXJPZlN0b3BzKSB7XG5cdFxuXHQgICAgdmFyIGlkID0gXCJncmFkaWVudFwiICsgbWF0aC5yaSgxMDAwMDAwMDAwMDApO1xuXHQgICAgdmFyIHN0b3BzID0gW107XG5cdFxuXHQgICAgdmFyIGdyYWRpZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJyYWRpYWxHcmFkaWVudFwiKTtcblx0ICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZShcImlkXCIsIGlkKTtcblx0ICAgIGdyYWRpZW50LnNldEF0dHJpYnV0ZShcImN4XCIsIFwiNTAlXCIpO1xuXHQgICAgZ3JhZGllbnQuc2V0QXR0cmlidXRlKFwiY3lcIiwgXCI1MCVcIik7XG5cdCAgICBncmFkaWVudC5zZXRBdHRyaWJ1dGUoXCJyXCIsIFwiNTAlXCIpO1xuXHRcblx0ICAgIGRlZnMuYXBwZW5kQ2hpbGQoZ3JhZGllbnQpO1xuXHRcblx0ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyT2ZTdG9wczsgaSsrKSB7XG5cdCAgICAgIHZhciBfc3RvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3RvcFwiKTtcblx0ICAgICAgX3N0b3Auc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJzdG9wXCIgKyBpKTtcblx0ICAgICAgLy9zdG9wLnNldEF0dHJpYnV0ZSgnb2Zmc2V0JywgJzcwJScpO1xuXHQgICAgICAvL3N0b3Auc2V0QXR0cmlidXRlKCdzdG9wLWNvbG9yJywgJ1doaXRlJyk7XG5cdCAgICAgIGdyYWRpZW50LmFwcGVuZENoaWxkKF9zdG9wKTtcblx0ICAgICAgc3RvcHMucHVzaChfc3RvcCk7XG5cdCAgICB9XG5cdFxuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgaWQ6IGlkLFxuXHQgICAgICBzdG9wczogc3RvcHMsXG5cdCAgICAgIGVsZW1lbnQ6IGdyYWRpZW50XG5cdCAgICB9O1xuXHQgIH1cblx0XG5cdH07XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0LyoqXG5cdCAqIExpbWl0IGEgbnVtYmVyIHRvIHdpdGhpbiBhIG1pbmltdW0gYW5kIG1heGltdW1cblx0ICogQHBhcmFtICB7bnVtYmVyfSB2YWx1ZSBJbnB1dCB2YWx1ZVxuXHQgKiBAcGFyYW0gIHtudW1iZXJ9IG1pbiAgIExvd2VyIGxpbWl0XG5cdCAqIEBwYXJhbSAge251bWJlcn0gbWF4ICAgVXBwZXIgbGltaXRcblx0ICogQHJldHVybiB7bnVtYmVyfSAgICAgICBUaGUgaW5wdXQgdmFsdWUgY29uc3RyYWluZWQgd2l0aGluIHRoZSBsb3dlciBhbmQgdXBwZXIgbGltaXRzXG5cdCAqIEBleGFtcGxlXG5cdCAqIE5leHVzLmNsaXAoMTEsMCwxMCkgICAvLyByZXR1cm5zIDEwXG5cdCAqIE5leHVzLmNsaXAoLTEsMCwxMCkgICAvLyByZXR1cm5zIDBcblx0ICogTmV4dXMuY2xpcCg1LDAsMTApICAgIC8vIHJldHVybnMgNVxuXHQgKi9cblx0XG5cdGV4cG9ydHMuY2xpcCA9IGZ1bmN0aW9uICh2YWx1ZSwgbWluLCBtYXgpIHtcblx0ICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodmFsdWUsIG1pbiksIG1heCk7XG5cdH07XG5cdFxuXHRleHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgbWluLCBtYXgpIHtcblx0ICByZXR1cm4gKHZhbHVlIC0gbWluKSAvIChtYXggLSBtaW4pO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIFNjYWxlIGEgdmFsdWUgZnJvbSBvbmUgcmFuZ2UgdG8gYW5vdGhlciByYW5nZS5cblx0ICogQHBhcmFtICB7bnVtYmVyfSBpbk51bSAgSW5wdXQgdmFsdWVcblx0ICogQHBhcmFtICB7bnVtYmVyfSBpbk1pbiAgSW5wdXQgcmFuZ2UgbWluaW11bVxuXHQgKiBAcGFyYW0gIHtudW1iZXJ9IGluTWF4ICBJbnB1dCByYW5nZSBtYXhpbXVtXG5cdCAqIEBwYXJhbSAge251bWJlcn0gb3V0TWluIE91dHB1dCByYW5nZSBtaW5pbXVtXG5cdCAqIEBwYXJhbSAge251bWJlcn0gb3V0TWF4IE91dHB1dCByYW5nZSBtYXhpbXVtXG5cdCAqIEByZXR1cm4ge251bWJlcn0gICAgICAgIFRoZSBpbnB1dCB2YWx1ZSBzY2FsZWQgdG8gaXRzIG5ldyByYW5nZVxuXHQgKiBAZXhhbXBsZVxuXHQgKiBOZXh1cy5zY2FsZSgwLjUsMCwxLDAsMTApICAgLy8gcmV0dXJucyA1XG5cdCAqIE5leHVzLnNjYWxlKDAuOSwwLDEsMSwwKSAgICAvLyByZXR1cm5zIDAuMVxuXHQgKi9cblx0ZXhwb3J0cy5zY2FsZSA9IGZ1bmN0aW9uIChpbk51bSwgaW5NaW4sIGluTWF4LCBvdXRNaW4sIG91dE1heCkge1xuXHQgIGlmIChpbk1pbiA9PT0gaW5NYXgpIHtcblx0ICAgIHJldHVybiBvdXRNaW47XG5cdCAgfVxuXHQgIHJldHVybiAoaW5OdW0gLSBpbk1pbikgKiAob3V0TWF4IC0gb3V0TWluKSAvIChpbk1heCAtIGluTWluKSArIG91dE1pbjtcblx0fTtcblx0XG5cdGV4cG9ydHMudG9Qb2xhciA9IGZ1bmN0aW9uICh4LCB5KSB7XG5cdCAgdmFyIHIgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG5cdFxuXHQgIHZhciB0aGV0YSA9IE1hdGguYXRhbjIoeSwgeCk7XG5cdCAgaWYgKHRoZXRhIDwgMCkge1xuXHQgICAgdGhldGEgPSB0aGV0YSArIDIgKiBNYXRoLlBJO1xuXHQgIH1cblx0ICByZXR1cm4geyByYWRpdXM6IHIsIGFuZ2xlOiB0aGV0YSB9O1xuXHR9O1xuXHRcblx0ZXhwb3J0cy50b0NhcnRlc2lhbiA9IGZ1bmN0aW9uIChyYWRpdXMsIGFuZ2xlKSB7XG5cdCAgdmFyIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcblx0ICB2YXIgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuXHQgIHJldHVybiB7IHg6IHJhZGl1cyAqIGNvcywgeTogcmFkaXVzICogc2luICogLTEgfTtcblx0fTtcblx0Lypcblx0ZXhwb3J0cy5wb2xhclRvQ2FydGVzaWFuKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgYW5nbGVJbkRlZ3JlZXMpIHtcblx0ICB2YXIgYW5nbGVJblJhZGlhbnMgPSAoYW5nbGVJbkRlZ3JlZXMtOTApICogTWF0aC5QSSAvIDE4MC4wO1xuXHRcblx0ICByZXR1cm4ge1xuXHQgICAgeDogY2VudGVyWCArIChyYWRpdXMgKiBNYXRoLmNvcyhhbmdsZUluUmFkaWFucykpLFxuXHQgICAgeTogY2VudGVyWSArIChyYWRpdXMgKiBNYXRoLnNpbihhbmdsZUluUmFkaWFucykpXG5cdCAgfTtcblx0fSAgKi9cblx0XG5cdGV4cG9ydHMucHJ1bmUgPSBmdW5jdGlvbiAoZGF0YSwgc2NhbGUpIHtcblx0ICByZXR1cm4gcGFyc2VGbG9hdChkYXRhLnRvRml4ZWQoc2NhbGUpKTtcblx0fTtcblx0XG5cdGV4cG9ydHMuaW52ZXJ0ID0gZnVuY3Rpb24gKGluTnVtKSB7XG5cdCAgcmV0dXJuIGV4cG9ydHMuc2NhbGUoaW5OdW0sIDEsIDAsIDAsIDEpO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIENvbnZlcnQgYSBNSURpIG5vdGUgbnVtYmVyIHRvIGEgZnJlcXVlbmN5IHZhbHVlIGluIGVxdWFsIHRlbXBlcmFtZW50LlxuXHQgKiBAcGFyYW0gIHtudW1iZXJ9IG1pZGkgTUlESSBub3RlIHZhbHVlXG5cdCAqIEByZXR1cm4ge251bWJlcn0gICAgICBGcmVxdWVuY2UgdmFsdWVcblx0ICogQGV4YW1wbGVcblx0ICogTmV4dXMubXRvZig2MCkgIC8vIHJldHVybnMgdGhlIGZyZXF1ZW5jeSBudW1iZXIgb2YgTWlkZGxlIENcblx0ICovXG5cdGV4cG9ydHMubXRvZiA9IGZ1bmN0aW9uIChtaWRpKSB7XG5cdCAgcmV0dXJuIE1hdGgucG93KDIsIChtaWRpIC0gNjkpIC8gMTIpICogNDQwO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIEludGVycG9sYXRlIGJldHdlZW4gdHdvIG51bWJlcnNcblx0ICogQHBhcmFtICB7bnVtYmVyfSBsb2MgSW50ZXJwb2xhdGlvbiBpbmRleCAoMC0xKVxuXHQgKiBAcGFyYW0gIHtudW1iZXJ9IG1pbiBMb3dlciB2YWx1ZVxuXHQgKiBAcGFyYW0gIHtudW1iZXJ9IG1heCBVcHBlciB2YWx1ZVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICBJbnRlcnBvbGF0ZWQgdmFsdWVcblx0ICogQGV4YW1wbGVcblx0ICogTmV4dXMuaW50ZXJwKDAuNSwyLDQpICAgLy8gcmV0dXJucyAzXG5cdCAqIE5leHVzLmludGVycCgwLjEsMCwxMCkgICAgIC8vIHJldHVybnMgMVxuXHQgKi9cblx0ZXhwb3J0cy5pbnRlcnAgPSBmdW5jdGlvbiAobG9jLCBtaW4sIG1heCkge1xuXHQgIHJldHVybiBsb2MgKiAobWF4IC0gbWluKSArIG1pbjtcblx0fTtcblx0XG5cdC8qKlxuXHQgKiBSZXR1cm4gYSByYW5kb20gY2hvaWNlIGZyb20gYSBsaXN0IG9mIGFyZ3VtZW50c1xuXHQgKiBAcmV0dXJuIHt2YXJpb3VzfSBPbmUgcmFuZG9tIGFyZ3VtZW50XG5cdCAqIEBleGFtcGxlXG5cdCAqIE5leHVzLnBpY2soMSwyLDMsNCkgICAvLyByZXR1cm5zIDEsIDIsIDMsIG9yIDRcblx0ICogTmV4dXMucGljayhmdW5jdGlvbjEsZnVuY3Rpb24yKSAgIC8vIHJldHVybnMgZWl0aGVyIGZ1bmN0aW9uMSBvciBmdW5jdGlvbjJcblx0ICovXG5cdGV4cG9ydHMucGljayA9IGZ1bmN0aW9uICgpIHtcblx0ICByZXR1cm4gYXJndW1lbnRzW34gfihNYXRoLnJhbmRvbSgpICogYXJndW1lbnRzLmxlbmd0aCldO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIFJldHVybnMgYW4gb2N0YXZlIG11bHRpcGxpZXIgZm9yIGZyZXF1ZW5jeSB2YWx1ZXNcblx0ICogQHBhcmFtICB7bnVtYmVyfSBudW0gUmVsYXRpdmUgb2N0YXZlIG51bWJlciAoZS5nLiAtMSBmb3Igb25lIG9jdGF2ZSBkb3duLCAxIGZvciBvbmUgb2N0YXZlIHVwKVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICBPY3RhdmUgbXVsdGlwbGllclxuXHQgKiBAZXhhbXBsZVxuXHQgKiBOZXh1cy5vY3RhdmUoLTEpICAvLyByZXR1cm5zIDAuNVxuXHQgKiBOZXh1cy5vY3RhdmUoMCkgICAvLyByZXR1cm5zIDFcblx0ICogTmV4dXMub2N0YXZlKDEpICAgLy8gcmV0dXJucyAyXG5cdCAqIE5leHVzLm9jdGF2ZSgyKSAgIC8vIHJldHVybnMgNFxuXHQgKi9cblx0ZXhwb3J0cy5vY3RhdmUgPSBmdW5jdGlvbiAobnVtKSB7XG5cdCAgcmV0dXJuIE1hdGgucG93KDIsIG51bSk7XG5cdH07XG5cdFxuXHQvKipcblx0ICogUmFuZG9tIGludGVnZXIgZ2VuZXJhdG9yLiBJZiBubyBzZWNvbmQgYXJndW1lbnQgaXMgZ2l2ZW4sIHdpbGwgcmV0dXJuIHJhbmRvbSBpbnRlZ2VyIGZyb20gMCB0byBib3VuZDEuXG5cdCAqIEBwYXJhbSAge251bWJlcn0gYm91bmQxIE1pbmltdW0gcmFuZG9tIHZhbHVlXG5cdCAqIEBwYXJhbSAge251bWJlcn0gYm91bmQyIE1heGltdW0gcmFuZG9tIHZhbHVlXG5cdCAqIEByZXR1cm4ge251bWJlcn0gICAgICAgIFJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJ5XG5cdCAqIEBleGFtcGxlXG5cdCAqIE5leHVzLnJpKDEwKSAgICAvLyByZXR1cm5zIHJhbmRvbSBpbnQgZnJvbSAwIHRvIDEwXG5cdCAqIE5leHVzLnJpKDIwLDIwMDApIC8vIHJldHVybnMgcmFuZG9tIGludCBmcm9tIDIwIHRvIDIwMDBcblx0ICovXG5cdGV4cG9ydHMucmkgPSBmdW5jdGlvbiAoYm91bmQxLCBib3VuZDIpIHtcblx0ICBpZiAoIWJvdW5kMikge1xuXHQgICAgYm91bmQyID0gYm91bmQxO1xuXHQgICAgYm91bmQxID0gMDtcblx0ICB9XG5cdCAgdmFyIGxvdyA9IE1hdGgubWluKGJvdW5kMSwgYm91bmQyKTtcblx0ICB2YXIgaGlnaCA9IE1hdGgubWF4KGJvdW5kMSwgYm91bmQyKTtcblx0ICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGhpZ2ggLSBsb3cpICsgbG93KTtcblx0fTtcblx0XG5cdC8qKlxuXHQgKiBSYW5kb20gZmxvYXQgbnVtYmVyIGdlbmVyYXRvci4gSWYgbm8gc2Vjb25kIGFyZ3VtZW50IGlzIGdpdmVuLCB3aWxsIHJldHVybiByYW5kb20gZmxvYXQgZnJvbSAwIHRvIGJvdW5kMS5cblx0ICogQHBhcmFtICB7bnVtYmVyfSBib3VuZDEgTWluaW11bSByYW5kb20gdmFsdWVcblx0ICogQHBhcmFtICB7bnVtYmVyfSBib3VuZDIgTWF4aW11bSByYW5kb20gdmFsdWVcblx0ICogQHJldHVybiB7bnVtYmVyfSAgICAgICAgUmFuZG9tIGZsb2F0IGJldHdlZW4gbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJ5XG5cdCAqIEBleGFtcGxlXG5cdCAqIE5leHVzLnJmKDEpICAgIC8vIHJldHVybnMgcmFuZG9tIGZsb2F0IGZyb20gMCB0byAxXG5cdCAqIE5leHVzLnJmKDEsMikgLy8gcmV0dXJucyByYW5kb20gZmxvYXQgZnJvbSAxIHRvIDJcblx0ICovXG5cdGV4cG9ydHMucmYgPSBmdW5jdGlvbiAoYm91bmQxLCBib3VuZDIpIHtcblx0ICBpZiAoIWJvdW5kMikge1xuXHQgICAgYm91bmQyID0gYm91bmQxO1xuXHQgICAgYm91bmQxID0gMDtcblx0ICB9XG5cdCAgdmFyIGxvdyA9IE1hdGgubWluKGJvdW5kMSwgYm91bmQyKTtcblx0ICB2YXIgaGlnaCA9IE1hdGgubWF4KGJvdW5kMSwgYm91bmQyKTtcblx0ICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSArIGxvdztcblx0fTtcblx0XG5cdGV4cG9ydHMuY3ljbGUgPSBmdW5jdGlvbiAoaW5wdXQsIG1pbiwgbWF4KSB7XG5cdCAgaW5wdXQrKztcblx0ICBpZiAoaW5wdXQgPj0gbWF4KSB7XG5cdCAgICBpbnB1dCA9IG1pbjtcblx0ICB9XG5cdCAgcmV0dXJuIGlucHV0O1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIEF2ZXJhZ2UgYW4gYXJyYXkgb2YgbnVtYmVyc1xuXHQgKiBAcGFyYW0gIHtBcnJheX0gZGF0YSBBcnJheSBvZiBudW1iZXJzIHRvIGF2ZXJhZ2Vcblx0ICogQHJldHVybiB7bnVtYmVyfSAgICAgIEF2ZXJhZ2Ugb2YgdGhlIGlucHV0IGRhdGFcblx0ICogQGV4YW1wbGVcblx0ICogTmV4dXMuYXZlcmFnZShbMCwyLDQsNiw4LDEwXSkgICAvLyByZXR1cm5zIDVcblx0ICovXG5cdGV4cG9ydHMuYXZlcmFnZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG5cdCAgdmFyIHRvdGFsID0gMDtcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcblx0ICAgIHRvdGFsICs9IGRhdGFbaV07XG5cdCAgfVxuXHQgIHJldHVybiB0b3RhbCAvIGRhdGEubGVuZ3RoO1xuXHR9O1xuXHRcblx0LyoqXG5cdCAqIEdldCB0aGUgZGlzdGFuY2UgZnJvbSBvbmUgKHgseSkgcG9pbnQgdG8gYW5vdGhlciAoeCx5KSBwb2ludFxuXHQgKiBAcGFyYW0gIHtudW1iZXJ9IHgxIHggb2YgZmlyc3QgcG9pbnRcblx0ICogQHBhcmFtICB7bnVtYmVyfSB5MSB5IG9mIGZpcnN0IHBvaW50XG5cdCAqIEBwYXJhbSAge251bWJlcn0geDIgeCBvZiBzZWNvbmQgcG9pbnRcblx0ICogQHBhcmFtICB7bnVtYmVyfSB5MiB5IG9mIHNlY29uZCBwb2lueVxuXHQgKiBAcmV0dXJuIHtudW1iZXJ9ICAgIERpc3RhbmNlXG5cdCAqIEBleGFtcGxlXG5cdCAqIE5leHVzLmRpc3RhbmNlKDAsMCwzLDQpICAgLy8gcmV0dXJucyA1XG5cdCAqL1xuXHRleHBvcnRzLmRpc3RhbmNlID0gZnVuY3Rpb24gKHgxLCB5MSwgeDIsIHkyKSB7XG5cdCAgdmFyIGEgPSB4MSAtIHgyO1xuXHQgIHZhciBiID0geTEgLSB5Mjtcblx0ICByZXR1cm4gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xuXHR9O1xuXHRcblx0ZXhwb3J0cy5nYWluVG9EQiA9IGZ1bmN0aW9uIChnYWluKSB7XG5cdCAgcmV0dXJuIDIwICogTWF0aC5sb2cxMChnYWluKTtcblx0fTtcblx0XG5cdC8qKlxuXHQgKiBGbGlwIGEgY29pbiwgcmV0dXJuaW5nIGVpdGhlciAwIG9yIDEgYWNjb3JkaW5nIHRvIGEgcHJvYmFiaWxpdHlcblx0ICogQHBhcmFtICB7bnVtYmVyfSBbb2Rkcz0wLjVdIExpa2VsaWhvb2Qgb2YgcmV0dXJuaW5nIDFcblx0ICogQHJldHVybiB7bnVtYmVyfSAgICAgICAgICAgIDEgb3IgMFxuXHQgKiBAZXhhbXBsZVxuXHQgKiBOZXh1cy5jb2luKDAuMSkgICAvLyByZXR1cm5zIDEgKDEwJSBvZiB0aGUgdGltZSkgb3IgMCAoOTAlIG9mIHRoZSB0aW1lKVxuXHQgKi9cblx0ZXhwb3J0cy5jb2luID0gZnVuY3Rpb24gKCkge1xuXHQgIHZhciBvZGRzID0gYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAwLjUgOiBhcmd1bWVudHNbMF07XG5cdFxuXHQgIGlmIChleHBvcnRzLnJmKDAsIDEpIDwgb2Rkcykge1xuXHQgICAgcmV0dXJuIDE7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHJldHVybiAwO1xuXHQgIH1cblx0fTtcblxuLyoqKi8gfSksXG4vKiA2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChvYmplY3QsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MgJiYgZGVzYy53cml0YWJsZSkgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH07XG5cdFxuXHR2YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH07XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgc3ZnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyIGRvbSA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG5cdHZhciB1dGlsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblx0dmFyIHRvdWNoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblx0dmFyIEV2ZW50RW1pdHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXHRcblx0dmFyIGNvbG9ycyA9IF9fd2VicGFja19yZXF1aXJlX18oMSkuY29sb3JzO1xuXHRcblx0LyoqXG5cdEludGVyZmFjZVxuXHQqL1xuXHRcblx0dmFyIEludGVyZmFjZSA9IChmdW5jdGlvbiAoX0V2ZW50RW1pdHRlcikge1xuXHQgIGZ1bmN0aW9uIEludGVyZmFjZShhcmdzLCBvcHRpb25zLCBkZWZhdWx0cykge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEludGVyZmFjZSk7XG5cdFxuXHQgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW50ZXJmYWNlLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzKTtcblx0ICAgIHRoaXMudHlwZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcblx0ICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLnBhcnNlU2V0dGluZ3MoYXJncywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHQgICAgdGhpcy5tb3VzZSA9IHt9O1xuXHQgICAgdGhpcy53YWl0ID0gZmFsc2U7XG5cdCAgICB0aGlzLmNvbG9ycyA9IHt9O1xuXHQgICAgdmFyIGRlZmF1bHRDb2xvcnMgPSBjb2xvcnMoKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdCAgICB0aGlzLmNvbG9ycy5hY2NlbnQgPSBkZWZhdWx0Q29sb3JzLmFjY2VudDtcblx0ICAgIHRoaXMuY29sb3JzLmZpbGwgPSBkZWZhdWx0Q29sb3JzLmZpbGw7XG5cdCAgICB0aGlzLmNvbG9ycy5saWdodCA9IGRlZmF1bHRDb2xvcnMubGlnaHQ7XG5cdCAgICB0aGlzLmNvbG9ycy5kYXJrID0gZGVmYXVsdENvbG9ycy5kYXJrO1xuXHQgICAgdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQgPSBkZWZhdWx0Q29sb3JzLm1lZGl1bUxpZ2h0O1xuXHQgICAgdGhpcy5jb2xvcnMubWVkaXVtRGFyayA9IGRlZmF1bHRDb2xvcnMubWVkaXVtRGFyaztcblx0ICB9XG5cdFxuXHQgIF9pbmhlcml0cyhJbnRlcmZhY2UsIF9FdmVudEVtaXR0ZXIpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoSW50ZXJmYWNlLCB7XG5cdCAgICBwYXJzZVNldHRpbmdzOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVNldHRpbmdzKGFyZ3MsIG9wdGlvbnMsIGRlZmF1bHRzKSB7XG5cdFxuXHQgICAgICAgIG9wdGlvbnMudW5zaGlmdChcInRhcmdldFwiKTtcblx0ICAgICAgICBkZWZhdWx0cy5kZWZhdWx0U2l6ZSA9IGRlZmF1bHRzLnNpemUuc3BsaWNlKDAsIDIpO1xuXHQgICAgICAgIGRlZmF1bHRzLnNpemUgPSBmYWxzZTtcblx0XG5cdCAgICAgICAgdmFyIHNldHRpbmdzID0ge1xuXHQgICAgICAgICAgdGFyZ2V0OiBkb2N1bWVudC5ib2R5LFxuXHQgICAgICAgICAgY29sb3JzOiB7fSwgLy8gc2hvdWxkIGluaGVyaXQgZnJvbSBhIGNvbG9ycyBtb2R1bGUsXG5cdCAgICAgICAgICBzbmFwV2l0aFBhcmVudDogdHJ1ZSxcblx0ICAgICAgICAgIGV2ZW50OiBmdW5jdGlvbiBldmVudCgpIHt9LFxuXHQgICAgICAgICAgY29tcG9uZW50OiBmYWxzZVxuXHQgICAgICAgIH07XG5cdFxuXHQgICAgICAgIGZvciAodmFyIGtleSBpbiBkZWZhdWx0cykge1xuXHQgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IGRlZmF1bHRzW2tleV07XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIC8vIGdyYWJzIHRoZSBuZXh0IGFyZ3VtZW50XG5cdCAgICAgICAgICB2YXIgc2V0dGluZyA9IGFyZ3NbaV07XG5cdCAgICAgICAgICAvLyBpZiBpdCdzIGFuIG9iamVjdCwgaXQgbXVzdCBiZSB0aGUgc2V0dGluZ3Mgb2JqZWN0XG5cdCAgICAgICAgICBpZiAodXRpbC5pc09iamVjdChzZXR0aW5nKSkge1xuXHQgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc2V0dGluZykge1xuXHQgICAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBzZXR0aW5nW2tleV07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gaWYgaXQncyBhIGZ1bmN0aW9uLCBpdCBtdXN0IGJlIHRoZSBldmVudCBzZXR0aW5nXG5cdCAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcImZ1bmN0aW9uXCIpIHtcblx0ICAgICAgICAgICAgc2V0dGluZ3MuZXZlbnQgPSBzZXR0aW5nO1xuXHQgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGNvbnNpZGVyIGl0IG9uZSBvZiB0aGUgd2lkZ2V0J3MgY3VzdG9tIG9wdGlvbnNcblx0ICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5sZW5ndGggPj0gMSkge1xuXHQgICAgICAgICAgICAvLyBncmFiIHRoZSBmaXJzdCBvcHRpb24gLS0gaS5lLiAndGFyZ2V0J1xuXHQgICAgICAgICAgICB2YXIga2V5ID0gb3B0aW9ucy5zcGxpY2UoMCwgMSlbMF07XG5cdCAgICAgICAgICAgIHNldHRpbmdzW2tleV0gPSBzZXR0aW5nO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgLyogIGhhbmRsZSBjb21tb24gc2V0dGluZ3MgICovXG5cdFxuXHQgICAgICAgIC8vIHRhcmdldFxuXHQgICAgICAgIHRoaXMucGFyZW50ID0gZG9tLnBhcnNlRWxlbWVudChzZXR0aW5ncy50YXJnZXQpO1xuXHRcblx0ICAgICAgICAvLyBuZXh1cy11aSBhdHRyaWJ1dGVcblx0ICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiAhc2V0dGluZ3MuY29tcG9uZW50KSB7XG5cdCAgICAgICAgICBpZiAoIXRoaXMucGFyZW50Lmhhc0F0dHJpYnV0ZShcIm5leHVzLXVpXCIpKSB7XG5cdCAgICAgICAgICAgIHRoaXMucGFyZW50LnNldEF0dHJpYnV0ZShcIm5leHVzLXVpXCIsIFwiXCIpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgLy8gc2l6ZVxuXHRcblx0ICAgICAgICBpZiAoc2V0dGluZ3Muc2l6ZSAmJiBBcnJheS5pc0FycmF5KHNldHRpbmdzLnNpemUpICYmIHNldHRpbmdzLnNuYXBXaXRoUGFyZW50KSB7XG5cdCAgICAgICAgICB0aGlzLndpZHRoID0gc2V0dGluZ3Muc2l6ZVswXTtcblx0ICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gc2V0dGluZ3Muc2l6ZVsxXTtcblx0ICAgICAgICAgIHRoaXMucGFyZW50LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcblx0ICAgICAgICAgIHRoaXMucGFyZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgXCJweFwiO1xuXHQgICAgICAgIH0gZWxzZSBpZiAoc2V0dGluZ3Muc25hcFdpdGhQYXJlbnQgJiYgIXNldHRpbmdzLmNvbXBvbmVudCkge1xuXHRcblx0ICAgICAgICAgIHRoaXMud2lkdGggPSBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucGFyZW50LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIikucmVwbGFjZShcInB4XCIsIFwiXCIpKTtcblx0ICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gcGFyc2VGbG9hdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnBhcmVudCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShcImhlaWdodFwiKS5yZXBsYWNlKFwicHhcIiwgXCJcIikpO1xuXHRcblx0ICAgICAgICAgIGlmICh0aGlzLndpZHRoID09IDUwMDApIHtcblx0ICAgICAgICAgICAgdGhpcy53aWR0aCA9IHNldHRpbmdzLmRlZmF1bHRTaXplWzBdO1xuXHQgICAgICAgICAgICB0aGlzLnBhcmVudC5zdHlsZS53aWR0aCA9IHRoaXMucGFyZW50LndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIGlmICh0aGlzLmhlaWdodCA9PSA1MDAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gc2V0dGluZ3MuZGVmYXVsdFNpemVbMV07XG5cdCAgICAgICAgICAgIHRoaXMucGFyZW50LnN0eWxlLmhlaWdodCA9IHRoaXMucGFyZW50LmhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgXCJweFwiO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBzZXR0aW5ncy5zaXplID0gc2V0dGluZ3MuZGVmYXVsdFNpemU7XG5cdCAgICAgICAgICB0aGlzLndpZHRoID0gc2V0dGluZ3Muc2l6ZVswXTtcblx0ICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gc2V0dGluZ3Muc2l6ZVsxXTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIC8vIGV2ZW50XG5cdCAgICAgICAgaWYgKHNldHRpbmdzLmV2ZW50KSB7XG5cdCAgICAgICAgICB0aGlzLmV2ZW50ID0gdGhpcy5vbihcImNoYW5nZVwiLCBzZXR0aW5ncy5ldmVudCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuZXZlbnQgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHJldHVybiBzZXR0aW5ncztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGluaXQ6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG5cdCAgICAgICAgdGhpcy5idWlsZEZyYW1lKCk7XG5cdCAgICAgICAgdGhpcy5idWlsZEludGVyZmFjZSgpO1xuXHQgICAgICAgIHRoaXMuc2l6ZUludGVyZmFjZSgpO1xuXHQgICAgICAgIHRoaXMuYXR0YWNoTGlzdGVuZXJzKCk7XG5cdCAgICAgICAgdGhpcy5jb2xvckludGVyZmFjZSgpO1xuXHQgICAgICAgIHRoaXMuZmluYWxUb3VjaGVzKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBidWlsZEZyYW1lOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEZyYW1lKCkge1xuXHQgICAgICAgIHRoaXMuZWxlbWVudCA9IHN2Zy5jcmVhdGUoXCJzdmdcIik7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHRoaXMud2lkdGgpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgdGhpcy5oZWlnaHQpO1xuXHQgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7fVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7fVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHt9XG5cdCAgICB9LFxuXHQgICAgYXR0YWNoTGlzdGVuZXJzOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hMaXN0ZW5lcnMoKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgdGhpcy5pbnRlcmFjdGlvblRhcmdldCA9IHRoaXMuaW50ZXJhY3Rpb25UYXJnZXQgfHwgdGhpcy5lbGVtZW50O1xuXHRcblx0ICAgICAgICAvLyBTZXR1cCBpbnRlcmFjdGlvblxuXHQgICAgICAgIGlmICh0b3VjaC5leGlzdHMpIHtcblx0ICAgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25UYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgZnVuY3Rpb24gKGV2dCkge1xuXHQgICAgICAgICAgICByZXR1cm4gX3RoaXMucHJlVG91Y2goZXZ0KTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvblRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGZ1bmN0aW9uIChldnQpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIF90aGlzLnByZVRvdWNoTW92ZShldnQpO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB0aGlzLmludGVyYWN0aW9uVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCBmdW5jdGlvbiAoZXZ0KSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfdGhpcy5wcmVUb3VjaFJlbGVhc2UoZXZ0KTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmJvdW5kUHJlTW92ZSA9IGZ1bmN0aW9uIChldnQpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpcy5wcmVNb3ZlKGV2dCk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLmJvdW5kUHJlUmVsZWFzZSA9IGZ1bmN0aW9uIChldnQpIHtcblx0ICAgICAgICAgIHJldHVybiBfdGhpcy5wcmVSZWxlYXNlKGV2dCk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLmludGVyYWN0aW9uVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgZnVuY3Rpb24gKGV2dCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzLnByZUNsaWNrKGV2dCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBmaW5hbFRvdWNoZXM6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbmFsVG91Y2hlcygpIHtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCI7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVDbGljazoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcHJlQ2xpY2soZSkge1xuXHQgICAgICAgIC8vIDEwMDAwIGdldENvbXB1dGVkU3R5bGUgY2FsbHMgdGFrZXMgMTAwIG1zLlxuXHQgICAgICAgIC8vIC46LiBvbmUgdGFrZXMgYWJvdXQgLjAxbXNcblx0ICAgICAgICBpZiAodGhpcy5lbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcblx0ICAgICAgICAgIHRoaXMud2lkdGggPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiKS5yZXBsYWNlKFwicHhcIiwgXCJcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIDEwMDAwIGdldENvbXB1dGVkU3R5bGUgY2FsbHMgdGFrZXMgNDAgbXMuXG5cdCAgICAgICAgLy8gLjouIG9uZSB0YWtlcyBhYm91dCAuMDA0bXNcblx0ICAgICAgICB0aGlzLm9mZnNldCA9IGRvbS5maW5kUG9zaXRpb24odGhpcy5lbGVtZW50KTtcblx0ICAgICAgICB0aGlzLm1vdXNlID0gZG9tLmxvY2F0ZU1vdXNlKGUsIHRoaXMub2Zmc2V0KTtcblx0ICAgICAgICB0aGlzLmNsaWNrZWQgPSB0cnVlO1xuXHQgICAgICAgIHRoaXMuY2xpY2soKTtcblx0ICAgICAgICB0aGlzLm1vdmVFdmVudCA9IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5ib3VuZFByZU1vdmUpO1xuXHQgICAgICAgIHRoaXMucmVsZWFzZUV2ZW50ID0gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgdGhpcy5ib3VuZFByZVJlbGVhc2UpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNsaWNrXCIpO1xuXHQgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcHJlTW92ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcHJlTW92ZShlKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgaWYgKCF0aGlzLndhaXQpIHtcblx0ICAgICAgICAgIHRoaXMubW91c2UgPSBkb20ubG9jYXRlTW91c2UoZSwgdGhpcy5vZmZzZXQpO1xuXHQgICAgICAgICAgdGhpcy5tb3ZlKCk7XG5cdCAgICAgICAgICB0aGlzLndhaXQgPSB0cnVlO1xuXHQgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIF90aGlzLndhaXQgPSBmYWxzZTtcblx0ICAgICAgICAgIH0sIDI1KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwcmVSZWxlYXNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVSZWxlYXNlKGUpIHtcblx0ICAgICAgICB0aGlzLm1vdXNlID0gZG9tLmxvY2F0ZU1vdXNlKGUsIHRoaXMub2Zmc2V0KTtcblx0ICAgICAgICB0aGlzLmNsaWNrZWQgPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLnJlbGVhc2UoKTtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJyZWxlYXNlXCIpO1xuXHQgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5ib3VuZFByZU1vdmUpO1xuXHQgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuYm91bmRQcmVSZWxlYXNlKTtcblx0ICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsaWNrOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbGljaygpIHt9XG5cdCAgICB9LFxuXHQgICAgbW92ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZSgpIHt9XG5cdCAgICB9LFxuXHQgICAgcmVsZWFzZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVsZWFzZSgpIHt9XG5cdCAgICB9LFxuXHQgICAgcHJlVG91Y2g6IHtcblx0XG5cdCAgICAgIC8qIHRvdWNoICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcHJlVG91Y2goZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuXHQgICAgICAgICAgdGhpcy53aWR0aCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIpLnJlcGxhY2UoXCJweFwiLCBcIlwiKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5vZmZzZXQgPSBkb20uZmluZFBvc2l0aW9uKHRoaXMuZWxlbWVudCk7XG5cdCAgICAgICAgdGhpcy5tb3VzZSA9IGRvbS5sb2NhdGVUb3VjaChlLCB0aGlzLm9mZnNldCk7XG5cdCAgICAgICAgdGhpcy5jbGlja2VkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLnRvdWNoKGUpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNsaWNrXCIpO1xuXHQgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcHJlVG91Y2hNb3ZlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVUb3VjaE1vdmUoZSkge1xuXHQgICAgICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcblx0ICAgICAgICAgIHRoaXMubW91c2UgPSBkb20ubG9jYXRlVG91Y2goZSwgdGhpcy5vZmZzZXQpO1xuXHQgICAgICAgICAgdGhpcy50b3VjaE1vdmUoKTtcblx0ICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcHJlVG91Y2hSZWxlYXNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBwcmVUb3VjaFJlbGVhc2UoZSkge1xuXHQgICAgICAgIHRoaXMubW91c2UgPSBkb20ubG9jYXRlVG91Y2goZSwgdGhpcy5vZmZzZXQpO1xuXHQgICAgICAgIHRoaXMuY2xpY2tlZCA9IGZhbHNlO1xuXHQgICAgICAgIHRoaXMudG91Y2hSZWxlYXNlKCk7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwicmVsZWFzZVwiKTtcblx0ICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRvdWNoOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiB0b3VjaCgpIHtcblx0ICAgICAgICB0aGlzLmNsaWNrKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB0b3VjaE1vdmU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRvdWNoTW92ZSgpIHtcblx0ICAgICAgICB0aGlzLm1vdmUoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHRvdWNoUmVsZWFzZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdG91Y2hSZWxlYXNlKCkge1xuXHQgICAgICAgIHRoaXMucmVsZWFzZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVzaXplOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgKiBSZXNpemUgdGhlIGludGVyZmFjZVxuXHQgICAgICAqIEBwYXJhbSB3aWR0aCB7bnVtYmVyfSBOZXcgd2lkdGggaW4gcGl4ZWxzXG5cdCAgICAgICogQHBhcmFtIGhlaWdodCB7bnVtYmVyfSBOZXcgaGVpZ2h0IGluIHBpeGVsc1xuXHQgICAgICAqXG5cdCAgICAgICogQGV4YW1wbGVcblx0ICAgICAgKiBidXR0b24ucmVzaXplKDEwMCwxMDApO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG5cdCAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuXHQgICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXHQgICAgICAgIHRoaXMucGFyZW50LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcblx0ICAgICAgICB0aGlzLnBhcmVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCArIFwicHhcIjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgdGhpcy53aWR0aCk7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCB0aGlzLmhlaWdodCk7XG5cdCAgICAgICAgdGhpcy5zaXplSW50ZXJmYWNlKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBlbXB0eToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gZW1wdHkoKSB7XG5cdCAgICAgICAgd2hpbGUgKHRoaXMuZWxlbWVudC5sYXN0Q2hpbGQpIHtcblx0ICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQubGFzdENoaWxkKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBkZXN0cm95OiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgKiBSZW1vdmUgdGhlIGludGVyZmFjZSBmcm9tIHRoZSBwYWdlIGFuZCBjYW5jZWwgaXRzIGV2ZW50IGxpc3RlbmVyKHMpLlxuXHQgICAgICAqXG5cdCAgICAgICogQGV4YW1wbGVcblx0ICAgICAgKiBidXR0b24uZGVzdHJveSgpO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdCAgICAgICAgdGhpcy5lbXB0eSgpO1xuXHQgICAgICAgIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7XG5cdCAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcblx0ICAgICAgICBpZiAodGhpcy5pbnN0cnVtZW50KSB7XG5cdCAgICAgICAgICBkZWxldGUgdGhpcy5pbnN0cnVtZW50W3RoaXMuaWRdO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmN1c3RvbURlc3Ryb3koKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGN1c3RvbURlc3Ryb3k6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGN1c3RvbURlc3Ryb3koKSB7fVxuXHQgICAgfSxcblx0ICAgIGNvbG9yaXplOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvcml6ZSh0eXBlLCBjb2xvcikge1xuXHQgICAgICAgIHRoaXMuY29sb3JzW3R5cGVdID0gY29sb3I7XG5cdCAgICAgICAgdGhpcy5jb2xvckludGVyZmFjZSgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBJbnRlcmZhY2U7XG5cdH0pKEV2ZW50RW1pdHRlcik7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IEludGVyZmFjZTtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLmZpbmRQb3NpdGlvbiA9IGZ1bmN0aW9uIChlbCkge1xuXHQgIHZhciB2aWV3cG9ydE9mZnNldCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHQgIHZhciB0b3AgPSB2aWV3cG9ydE9mZnNldC50b3AgKyB3aW5kb3cuc2Nyb2xsWTtcblx0ICB2YXIgbGVmdCA9IHZpZXdwb3J0T2Zmc2V0LmxlZnQgKyB3aW5kb3cuc2Nyb2xsWDtcblx0ICByZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9O1xuXHR9O1xuXHRcblx0ZXhwb3J0cy5wYXJzZUVsZW1lbnQgPSBmdW5jdGlvbiAocGFyZW50KSB7XG5cdCAgaWYgKHR5cGVvZiBwYXJlbnQgPT09IFwic3RyaW5nXCIpIHtcblx0ICAgIHBhcmVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBhcmVudC5yZXBsYWNlKFwiI1wiLCBcIlwiKSk7XG5cdCAgfVxuXHRcblx0ICBpZiAocGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgcGFyZW50IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuXHQgICAgcmV0dXJuIHBhcmVudDtcblx0ICB9IGVsc2Uge1xuXHQgICAgcmV0dXJuIFwiTm8gdmFsaWQgcGFyZW50IGFyZ3VtZW50XCI7XG5cdCAgfVxuXHR9O1xuXHRcblx0ZXhwb3J0cy5sb2NhdGVNb3VzZSA9IGZ1bmN0aW9uIChlLCBvZmZzZXQpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgeDogZS5wYWdlWCAtIG9mZnNldC5sZWZ0LFxuXHQgICAgeTogZS5wYWdlWSAtIG9mZnNldC50b3Bcblx0ICB9O1xuXHR9O1xuXHRcblx0ZXhwb3J0cy5sb2NhdGVUb3VjaCA9IGZ1bmN0aW9uIChlLCBvZmZzZXQpIHtcblx0ICByZXR1cm4ge1xuXHQgICAgeDogZS50YXJnZXRUb3VjaGVzLmxlbmd0aCA/IGUudGFyZ2V0VG91Y2hlc1swXS5wYWdlWCAtIG9mZnNldC5sZWZ0IDogZmFsc2UsXG5cdCAgICB5OiBlLnRhcmdldFRvdWNoZXMubGVuZ3RoID8gZS50YXJnZXRUb3VjaGVzWzBdLnBhZ2VZIC0gb2Zmc2V0LnRvcCA6IGZhbHNlXG5cdCAgfTtcblx0fTtcblx0XG5cdGV4cG9ydHMuU21hcnRDYW52YXMgPSBmdW5jdGlvbiAocGFyZW50KSB7XG5cdCAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcblx0ICB0aGlzLmNvbnRleHQgPSB0aGlzLmVsZW1lbnQuZ2V0Q29udGV4dChcIjJkXCIpO1xuXHQgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXHRcblx0ICB0aGlzLnJlc2l6ZSA9IGZ1bmN0aW9uICh3LCBoKSB7XG5cdCAgICBfdGhpcy5lbGVtZW50LndpZHRoID0gdyAqIDI7XG5cdCAgICBfdGhpcy5lbGVtZW50LmhlaWdodCA9IGggKiAyO1xuXHQgICAgX3RoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9IHcgKyBcInB4XCI7XG5cdCAgICBfdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IGggKyBcInB4XCI7XG5cdCAgfTtcblx0fTtcblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHRleHBvcnRzLmlzT2JqZWN0ID0gZnVuY3Rpb24gKG9iaikge1xuXHQgIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KG9iaikgJiYgb2JqICE9PSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFNWR0VsZW1lbnQgPT09IGZhbHNlICYmIG9iaiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID09PSBmYWxzZSkge1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfSBlbHNlIHtcblx0ICAgIHJldHVybiBmYWxzZTtcblx0ICB9XG5cdH07XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0ZXhwb3J0cy5leGlzdHMgPSBcIm9udG91Y2hzdGFydFwiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdC8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuXHQvL1xuXHQvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuXHQvLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG5cdC8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuXHQvLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5cdC8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcblx0Ly8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG5cdC8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXHQvL1xuXHQvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuXHQvLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblx0Ly9cblx0Ly8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuXHQvLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5cdC8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cblx0Ly8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG5cdC8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuXHQvLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG5cdC8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cdFxuXHRmdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG5cdCAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuXHQgIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG5cdH1cblx0bW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cdFxuXHQvLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcblx0RXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblx0XG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcblx0RXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXHRcblx0Ly8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG5cdC8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5cdEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cdFxuXHQvLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncblx0Ly8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuXHQgIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG5cdCAgICB0aHJvdyBUeXBlRXJyb3IoJ24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuXHQgIHRoaXMuX21heExpc3RlbmVycyA9IG47XG5cdCAgcmV0dXJuIHRoaXM7XG5cdH07XG5cdFxuXHRFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG5cdCAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGxpc3RlbmVycztcblx0XG5cdCAgaWYgKCF0aGlzLl9ldmVudHMpXG5cdCAgICB0aGlzLl9ldmVudHMgPSB7fTtcblx0XG5cdCAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuXHQgIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG5cdCAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuXHQgICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuXHQgICAgICBlciA9IGFyZ3VtZW50c1sxXTtcblx0ICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0ICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG5cdCAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG5cdCAgICAgICAgZXJyLmNvbnRleHQgPSBlcjtcblx0ICAgICAgICB0aHJvdyBlcnI7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cdFxuXHQgIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcblx0ICAgIHJldHVybiBmYWxzZTtcblx0XG5cdCAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcblx0ICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuXHQgICAgICAvLyBmYXN0IGNhc2VzXG5cdCAgICAgIGNhc2UgMTpcblx0ICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIGNhc2UgMjpcblx0ICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcblx0ICAgICAgICBicmVhaztcblx0ICAgICAgY2FzZSAzOlxuXHQgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG5cdCAgICAgICAgYnJlYWs7XG5cdCAgICAgIC8vIHNsb3dlclxuXHQgICAgICBkZWZhdWx0OlxuXHQgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXHQgICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG5cdCAgICB9XG5cdCAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuXHQgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cdCAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG5cdCAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuXHQgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuXHQgICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gdHJ1ZTtcblx0fTtcblx0XG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuXHQgIHZhciBtO1xuXHRcblx0ICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuXHQgICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0XG5cdCAgaWYgKCF0aGlzLl9ldmVudHMpXG5cdCAgICB0aGlzLl9ldmVudHMgPSB7fTtcblx0XG5cdCAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcblx0ICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG5cdCAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcblx0ICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuXHQgICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cblx0ICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblx0XG5cdCAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG5cdCAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cblx0ICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuXHQgIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG5cdCAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG5cdCAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG5cdCAgZWxzZVxuXHQgICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG5cdCAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cdFxuXHQgIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG5cdCAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcblx0ICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuXHQgICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuXHQgICAgfVxuXHRcblx0ICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG5cdCAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuXHQgICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcblx0ICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcblx0ICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcblx0ICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuXHQgICAgICAgIGNvbnNvbGUudHJhY2UoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgcmV0dXJuIHRoaXM7XG5cdH07XG5cdFxuXHRFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblx0XG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG5cdCAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcblx0ICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdFxuXHQgIHZhciBmaXJlZCA9IGZhbHNlO1xuXHRcblx0ICBmdW5jdGlvbiBnKCkge1xuXHQgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblx0XG5cdCAgICBpZiAoIWZpcmVkKSB7XG5cdCAgICAgIGZpcmVkID0gdHJ1ZTtcblx0ICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgIH1cblx0ICB9XG5cdFxuXHQgIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcblx0ICB0aGlzLm9uKHR5cGUsIGcpO1xuXHRcblx0ICByZXR1cm4gdGhpcztcblx0fTtcblx0XG5cdC8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuXHQgIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXHRcblx0ICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuXHQgICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblx0XG5cdCAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcblx0ICAgIHJldHVybiB0aGlzO1xuXHRcblx0ICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXHQgIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuXHQgIHBvc2l0aW9uID0gLTE7XG5cdFxuXHQgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuXHQgICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcblx0ICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cdCAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuXHQgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXHRcblx0ICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG5cdCAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG5cdCAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuXHQgICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG5cdCAgICAgICAgcG9zaXRpb24gPSBpO1xuXHQgICAgICAgIGJyZWFrO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgaWYgKHBvc2l0aW9uIDwgMClcblx0ICAgICAgcmV0dXJuIHRoaXM7XG5cdFxuXHQgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgIGxpc3QubGVuZ3RoID0gMDtcblx0ICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcblx0ICAgIH1cblx0XG5cdCAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuXHQgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXHQgIH1cblx0XG5cdCAgcmV0dXJuIHRoaXM7XG5cdH07XG5cdFxuXHRFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcblx0ICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cdFxuXHQgIGlmICghdGhpcy5fZXZlbnRzKVxuXHQgICAgcmV0dXJuIHRoaXM7XG5cdFxuXHQgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcblx0ICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuXHQgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG5cdCAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXHQgICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuXHQgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXHQgICAgcmV0dXJuIHRoaXM7XG5cdCAgfVxuXHRcblx0ICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcblx0ICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHQgICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG5cdCAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuXHQgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG5cdCAgICB0aGlzLl9ldmVudHMgPSB7fTtcblx0ICAgIHJldHVybiB0aGlzO1xuXHQgIH1cblx0XG5cdCAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXHRcblx0ICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG5cdCAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG5cdCAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcblx0ICAgIC8vIExJRk8gb3JkZXJcblx0ICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuXHQgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuXHQgIH1cblx0ICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXHRcblx0ICByZXR1cm4gdGhpcztcblx0fTtcblx0XG5cdEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuXHQgIHZhciByZXQ7XG5cdCAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcblx0ICAgIHJldCA9IFtdO1xuXHQgIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcblx0ICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuXHQgIGVsc2Vcblx0ICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuXHQgIHJldHVybiByZXQ7XG5cdH07XG5cdFxuXHRFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG5cdCAgaWYgKHRoaXMuX2V2ZW50cykge1xuXHQgICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cdFxuXHQgICAgaWYgKGlzRnVuY3Rpb24oZXZsaXN0ZW5lcikpXG5cdCAgICAgIHJldHVybiAxO1xuXHQgICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcblx0ICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuXHQgIH1cblx0ICByZXR1cm4gMDtcblx0fTtcblx0XG5cdEV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuXHQgIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG5cdH07XG5cdFxuXHRmdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuXHQgIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xuXHR9XG5cdFxuXHRmdW5jdGlvbiBpc051bWJlcihhcmcpIHtcblx0ICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuXHQgIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuXHQgIHJldHVybiBhcmcgPT09IHZvaWQgMDtcblx0fVxuXG5cbi8qKiovIH0pLFxuLyogMTEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBtYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XG5cdC8qKlxuXHQgIENyZWF0ZXMgYSBzdGVwcGFibGUgdmFsdWUgd2l0aCBtaW5pbXVtLCBtYXhpbXVtLCBhbmQgc3RlcCBzaXplLiBUaGlzIGlzIHVzZWQgaW4gbWFueSBpbnRlcmZhY2VzIHRvIGNvbnN0cmljdCB0aGVpciB2YWx1ZXMgdG8gY2VydGFpbiByYW5nZXMuXG5cdCAgQHBhcmFtIHtudW1iZXJ9IFttaW49MF0gbWluaW11bVxuXHQgIEBwYXJhbSB7bnVtYmVyfSBbbWF4PTFdIG1heGltdW1cblx0ICBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MF1cblx0ICBAcGFyYW0ge251bWJlcn0gW3ZhbHVlPTBdIGluaXRpYWwgdmFsdWVcblx0ICBAcmV0dXJucyB7T2JqZWN0fSBTdGVwXG5cdCovXG5cdFxuXHR2YXIgU3RlcCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgZnVuY3Rpb24gU3RlcCgpIHtcblx0ICAgIHZhciBtaW4gPSBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG5cdCAgICB2YXIgbWF4ID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAxIDogYXJndW1lbnRzWzFdO1xuXHQgICAgdmFyIHN0ZXAgPSBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMl07XG5cdCAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbM107XG5cdFxuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0ZXApO1xuXHRcblx0ICAgIC8vT2JqZWN0LmFzc2lnbih0aGlzLHttaW4sbWF4LHN0ZXB9KTtcblx0ICAgIC8vQ2Fubm90IHVzZSBPYmplY3QuYXNzaWduIGJlY2F1c2Ugbm90IHN1cHBvcnRlZCBpbiBTYWZhcmkuXG5cdCAgICAvL0kgd291bGQgZXhwZWN0IGZvciBCYWJlbCB0byB0YWtlIGNhcmUgb2YgdGhpcyBidXQgaXQgaXMgbm90LlxuXHQgICAgdGhpcy5taW4gPSBtaW47XG5cdCAgICB0aGlzLm1heCA9IG1heDtcblx0ICAgIHRoaXMuc3RlcCA9IHN0ZXA7XG5cdCAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cdCAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTtcblx0ICAgIHRoaXMub2xkVmFsdWUgPSBmYWxzZTtcblx0ICAgIHRoaXMudXBkYXRlKHRoaXMudmFsdWUpO1xuXHQgIH1cblx0XG5cdCAgX2NyZWF0ZUNsYXNzKFN0ZXAsIHtcblx0ICAgIHVwZGF0ZToge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgICAgVXBkYXRlIHdpdGggYSBuZXcgdmFsdWUuIFRoZSB2YWx1ZSB3aWxsIGJlIGF1dG8tYWRqdXN0ZWQgdG8gZml0IHRoZSBtaW4vbWF4L3N0ZXAuXG5cdCAgICAgICAgQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKHZhbHVlKSB7XG5cdCAgICAgICAgaWYgKHRoaXMuc3RlcCkge1xuXHQgICAgICAgICAgLy8gdGhpcy52YWx1ZSA9IG1hdGguY2xpcChNYXRoLnJvdW5kKHZhbHVlIC8gKHRoaXMuc3RlcCkpICogdGhpcy5zdGVwLCB0aGlzLm1pbix0aGlzLm1heCk7XG5cdCAgICAgICAgICB0aGlzLnZhbHVlID0gbWF0aC5jbGlwKE1hdGgucm91bmQoKHZhbHVlIC0gdGhpcy5taW4pIC8gdGhpcy5zdGVwKSAqIHRoaXMuc3RlcCArIHRoaXMubWluLCB0aGlzLm1pbiwgdGhpcy5tYXgpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnZhbHVlID0gbWF0aC5jbGlwKHZhbHVlLCB0aGlzLm1pbiwgdGhpcy5tYXgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5vbGRWYWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuXHQgICAgICAgICAgdGhpcy5vbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG5cdCAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB1cGRhdGVOb3JtYWw6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICAgIFVwZGF0ZSB3aXRoIGEgbm9ybWFsaXplZCB2YWx1ZSAwLTEuXG5cdCAgICAgICAgQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlTm9ybWFsKHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IG1hdGguc2NhbGUodmFsdWUsIDAsIDEsIHRoaXMubWluLCB0aGlzLm1heCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHRoaXMudmFsdWUpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbm9ybWFsaXplZDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgICAgR2V0IGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoaXMudmFsdWUgLiBOb3Qgc2V0dGFibGUuXG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gbWF0aC5ub3JtYWxpemUodGhpcy52YWx1ZSwgdGhpcy5taW4sIHRoaXMubWF4KTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gU3RlcDtcblx0fSkoKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gU3RlcDtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZSA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9ialtcImRlZmF1bHRcIl0gOiBvYmo7IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgbWF0aCA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDUpKTtcblx0XG5cdHZhciBUb2dnbGVNb2RlbCA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKSk7XG5cdFxuXHQvKlxuXHRob3cgdG8gdXNlIDpcblx0XG5cdGRpYWwuaW50ZXJhY3Rpb24gPSBuZXcgSGFuZGxlKCdyYWRpYWwnLCdyZWxhdGl2ZScsdGhpcy53aWR0aCx0aGlzLmhlaWdodCk7XG5cdC8vIGRpYWwuaW50ZXJhY3Rpb24ubW9kZSA9ICdyZWxhdGl2ZSdcblx0Ly8gZGlhbC5pbnRlcmFjdGlvbi5kaXJlY3Rpb24gPSAncmFkaWFsJ1xuXHRcblx0b24gY2xpY2s6XG5cdGRpYWwuaW50ZXJhY3Rpb24uYW5jaG9yID0gdGhpcy5tb3VzZTtcblx0XG5cdG9uIG1vdmU6XG5cdGRpYWwuaW50ZXJhY3Rpb24udXBkYXRlKHRoaXMubW91c2UpO1xuXHRcblx0Y29uc29sZS5sb2coIGRpYWwuaW50ZXJhY3Rpb24udmFsdWUgKTsgc2hvdWxkIGJlIGEgbm9ybWFsaXplZCB2YWx1ZS5cblx0XG5cdCovXG5cdFxuXHQvKlxuXHQgIGFic29sdXRlL3JlbGF0aXZlIGFyZSBwcm9wZXJ0eTogbW9kZVxuXHQgIHJhZGlhbC92ZXJ0aWNhbC9ob3Jpem9udGFsLzJkIGFyZSBwcm9wZXJ0eTogZGlyZWN0aW9uXG5cdFxuXHQgIHBsYW4gOlxuXHRcblx0ICBpZiByZWxhdGl2ZSAtLVxuXHQgIE5PIG9uIGNsaWNrLCBnZXQgdmFsdWUgb2Zmc2V0IGJldHdlZW4gY3VycmVudCB2YWx1ZSBhbmQgY2xpY2sgdmFsdWUuXG5cdCAgTk8gb24gbW92ZSwgdXNlIGNsaWNrIHZhbHVlIC0gb2Zmc2V0XG5cdCAgSU5TVEVBRFxuXHQgIHVzZSBkZWx0YSAtLSBiYyB2ZXJ0aWNhbCBtb3Rpb24gb24gZGlhbCBpcyBpbXBvc3NpYmxlIG90aGVyd2lzZVxuXHQgIGFsc28gYWxsb3cgdG8gc2V0IHNlbnNpdGl2aXR5XG5cdFxuXHQqL1xuXHRcblx0dmFyIEhhbmRsZSA9IGV4cG9ydHMuSGFuZGxlID0gKGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBIYW5kbGUoKSB7XG5cdCAgICB2YXIgbW9kZSA9IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gXCJhYnNvbHV0ZVwiIDogYXJndW1lbnRzWzBdO1xuXHQgICAgdmFyIGRpcmVjdGlvbiA9IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gXCJ2ZXJ0aWNhbFwiIDogYXJndW1lbnRzWzFdO1xuXHQgICAgdmFyIHhib3VuZCA9IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gWzAsIDEwMF0gOiBhcmd1bWVudHNbMl07XG5cdCAgICB2YXIgeWJvdW5kID0gYXJndW1lbnRzWzNdID09PSB1bmRlZmluZWQgPyBbMCwgMTAwXSA6IGFyZ3VtZW50c1szXTtcblx0XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSGFuZGxlKTtcblx0XG5cdCAgICB0aGlzLm1vZGUgPSBtb2RlO1xuXHQgICAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG5cdCAgICB0aGlzLnByZXZpb3VzID0gMDtcblx0ICAgIHRoaXMudmFsdWUgPSAwO1xuXHQgICAgdGhpcy5zZW5zaXRpdml0eSA9IDE7XG5cdCAgICB0aGlzLnJlc2l6ZSh4Ym91bmQsIHlib3VuZCk7XG5cdCAgfVxuXHRcblx0ICBfY3JlYXRlQ2xhc3MoSGFuZGxlLCB7XG5cdCAgICByZXNpemU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZSh4Ym91bmQsIHlib3VuZCkge1xuXHQgICAgICAgIHRoaXMuYm91bmRhcnkgPSB7XG5cdCAgICAgICAgICBtaW46IHtcblx0ICAgICAgICAgICAgeDogeGJvdW5kWzBdLFxuXHQgICAgICAgICAgICB5OiB5Ym91bmRbMF1cblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICBtYXg6IHtcblx0ICAgICAgICAgICAgeDogeGJvdW5kWzFdLFxuXHQgICAgICAgICAgICB5OiB5Ym91bmRbMV1cblx0ICAgICAgICAgIH0sXG5cdCAgICAgICAgICBjZW50ZXI6IHtcblx0ICAgICAgICAgICAgeDogKHhib3VuZFsxXSAtIHhib3VuZFswXSkgLyAyICsgeGJvdW5kWzBdLFxuXHQgICAgICAgICAgICB5OiAoeWJvdW5kWzFdIC0geWJvdW5kWzBdKSAvIDIgKyB5Ym91bmRbMF1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgYW5jaG9yOiB7XG5cdCAgICAgIHNldDogZnVuY3Rpb24gKG1vdXNlKSB7XG5cdCAgICAgICAgdGhpcy5fYW5jaG9yID0gdGhpcy5jb252ZXJ0UG9zaXRpb25Ub1ZhbHVlKG1vdXNlKTtcblx0ICAgICAgfSxcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2FuY2hvcjtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVwZGF0ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKG1vdXNlKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJyZWxhdGl2ZVwiKSB7XG5cdCAgICAgICAgICB2YXIgaW5jcmVtZW50ID0gdGhpcy5jb252ZXJ0UG9zaXRpb25Ub1ZhbHVlKG1vdXNlKSAtIHRoaXMuYW5jaG9yO1xuXHQgICAgICAgICAgaWYgKE1hdGguYWJzKGluY3JlbWVudCkgPiAwLjUpIHtcblx0ICAgICAgICAgICAgaW5jcmVtZW50ID0gMDtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHRoaXMuYW5jaG9yID0gbW91c2U7XG5cdCAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZSArIGluY3JlbWVudCAqIHRoaXMuc2Vuc2l0aXZpdHk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnZlcnRQb3NpdGlvblRvVmFsdWUobW91c2UpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnZhbHVlID0gbWF0aC5jbGlwKHRoaXMudmFsdWUsIDAsIDEpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29udmVydFBvc2l0aW9uVG9WYWx1ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY29udmVydFBvc2l0aW9uVG9WYWx1ZShjdXJyZW50KSB7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLmRpcmVjdGlvbikge1xuXHQgICAgICAgICAgY2FzZSBcInJhZGlhbFwiOlxuXHQgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBtYXRoLnRvUG9sYXIoY3VycmVudC54IC0gdGhpcy5ib3VuZGFyeS5jZW50ZXIueCwgY3VycmVudC55IC0gdGhpcy5ib3VuZGFyeS5jZW50ZXIueSk7XG5cdCAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb24uYW5nbGUgLyAoTWF0aC5QSSAqIDIpO1xuXHQgICAgICAgICAgICBwb3NpdGlvbiA9IChwb3NpdGlvbiAtIDAuMjUgKyAxKSAlIDE7XG5cdCAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjtcblx0ICAgICAgICAgIGNhc2UgXCJ2ZXJ0aWNhbFwiOlxuXHQgICAgICAgICAgICByZXR1cm4gbWF0aC5zY2FsZShjdXJyZW50LnksIHRoaXMuYm91bmRhcnkubWluLnksIHRoaXMuYm91bmRhcnkubWF4LnksIDAsIDEpO1xuXHQgICAgICAgICAgY2FzZSBcImhvcml6b250YWxcIjpcblx0ICAgICAgICAgICAgcmV0dXJuIG1hdGguc2NhbGUoY3VycmVudC54LCB0aGlzLmJvdW5kYXJ5Lm1pbi54LCB0aGlzLmJvdW5kYXJ5Lm1heC54LCAwLCAxKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgcmV0dXJuIEhhbmRsZTtcblx0fSkoKTtcblx0XG5cdHZhciBCdXR0b24gPSBleHBvcnRzLkJ1dHRvbiA9IChmdW5jdGlvbiAoKSB7XG5cdCAgZnVuY3Rpb24gQnV0dG9uKCkge1xuXHQgICAgdmFyIG1vZGUgPSBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IFwiYnV0dG9uXCIgOiBhcmd1bWVudHNbMF07XG5cdFxuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1dHRvbik7XG5cdFxuXHQgICAgdGhpcy5tb2RlID0gbW9kZTtcblx0ICAgIHRoaXMuc3RhdGUgPSBuZXcgVG9nZ2xlTW9kZWwoKTtcblx0ICAgIHRoaXMucGFpbnRicnVzaCA9IGZhbHNlO1xuXHQgIH1cblx0XG5cdCAgX2NyZWF0ZUNsYXNzKEJ1dHRvbiwge1xuXHQgICAgY2xpY2s6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsaWNrKCkge1xuXHQgICAgICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG5cdCAgICAgICAgICBjYXNlIFwiaW1wdWxzZVwiOlxuXHQgICAgICAgICAgICB0aGlzLnN0YXRlLm9uKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcblx0ICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuc3RhdGUub2ZmLmJpbmQodGhpcyksIDMwKTtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMuc3RhdGUpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgXCJidXR0b25cIjpcblx0ICAgICAgICAgICAgdGhpcy50dXJuT24oKTtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMuc3RhdGUpO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgXCJhZnRlcnRvdWNoXCI6XG5cdCAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSB7XG5cdCAgICAgICAgICAgICAgeDogbWF0aC5jbGlwKHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgsIDAsIDEpLFxuXHQgICAgICAgICAgICAgIHk6IG1hdGguY2xpcCgxIC0gdGhpcy5tb3VzZS55IC8gdGhpcy5oZWlnaHQsIDAsIDEpXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIHRoaXMudHVybk9uKCk7XG5cdCAgICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB7XG5cdCAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG5cdCAgICAgICAgICAgICAgeDogdGhpcy5wb3NpdGlvbi54LFxuXHQgICAgICAgICAgICAgIHk6IHRoaXMucG9zaXRpb24ueSB9KTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIFwidG9nZ2xlXCI6XG5cdCAgICAgICAgICAgIHRoaXMuZmxpcCgpO1xuXHQgICAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwgdGhpcy5zdGF0ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1vdmU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmUoKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJhZnRlcnRvdWNoXCIpIHtcblx0ICAgICAgICAgIHRoaXMucG9zaXRpb24gPSB7XG5cdCAgICAgICAgICAgIHg6IG1hdGguY2xpcCh0aGlzLm1vdXNlLnggLyB0aGlzLndpZHRoLCAwLCAxKSxcblx0ICAgICAgICAgICAgeTogbWF0aC5jbGlwKDEgLSB0aGlzLm1vdXNlLnkgLyB0aGlzLmhlaWdodCwgMCwgMSlcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcblx0ICAgICAgICAgICAgeDogdGhpcy5wb3NpdGlvbi54LFxuXHQgICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uLnkgfSk7XG5cdCAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbGVhc2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbGVhc2UoKSB7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcblx0ICAgICAgICAgIGNhc2UgXCJidXR0b25cIjpcblx0ICAgICAgICAgICAgdGhpcy50dXJuT2ZmKCk7XG5cdCAgICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnN0YXRlKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIFwiYWZ0ZXJ0b3VjaFwiOlxuXHQgICAgICAgICAgICB0aGlzLnR1cm5PZmYoKTtcblx0ICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHtcblx0ICAgICAgICAgICAgICB4OiB0aGlzLm1vdXNlLnggLyB0aGlzLndpZHRoLFxuXHQgICAgICAgICAgICAgIHk6IDEgLSB0aGlzLm1vdXNlLnkgLyB0aGlzLmhlaWdodFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuXHQgICAgICAgICAgICAgIHg6IHRoaXMucG9zaXRpb24ueCxcblx0ICAgICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uLnkgfSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gQnV0dG9uO1xuXHR9KSgpO1xuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgVG9nZ2xlID0gKGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBUb2dnbGUoc3RhdGUpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb2dnbGUpO1xuXHRcblx0ICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCBmYWxzZTtcblx0ICB9XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhUb2dnbGUsIHtcblx0ICAgIGZsaXA6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZsaXAoc3RhdGUpIHtcblx0ICAgICAgICBpZiAoc3RhdGUgfHwgc3RhdGUgPT09IGZhbHNlKSB7XG5cdCAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuc3RhdGUgPSAhdGhpcy5zdGF0ZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBvbjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gb24oKSB7XG5cdCAgICAgICAgdGhpcy5zdGF0ZSA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBvZmY6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIG9mZigpIHtcblx0ICAgICAgICB0aGlzLnN0YXRlID0gZmFsc2U7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgcmV0dXJuIFRvZ2dsZTtcblx0fSkoKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gVG9nZ2xlO1xuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBzdmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgSW50ZXJmYWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0dmFyIFN0ZXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblx0XG5cdHZhciBJbnRlcmFjdGlvbiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9fd2VicGFja19yZXF1aXJlX18oMTIpKTtcblx0XG5cdC8qKlxuXHQqIFNsaWRlclxuXHQqXG5cdCogQGRlc2NyaXB0aW9uIEhvcml6b250YWwgb3IgdmVydGljYWwgc2xpZGVyIHdpdGggc2V0dGFibGUgaW50ZXJhY3Rpb24gbW9kZXMuXG5cdCpcblx0KiBAZGVtbyA8c3BhbiBuZXh1cy11aT1cInNsaWRlclwiIHN0ZXA9MC4yPjwvc3Bhbj5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIHNsaWRlciA9IG5ldyBOZXh1cy5TbGlkZXIoJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgc2xpZGVyID0gbmV3IE5leHVzLlNsaWRlcignI3RhcmdldCcse1xuXHQqICAgICAnc2l6ZSc6IFsxMjAsMjBdLFxuXHQqICAgICAnbW9kZSc6ICdyZWxhdGl2ZScsICAvLyAncmVsYXRpdmUnIG9yICdhYnNvbHV0ZSdcblx0KiAgICAgJ21pbic6IDAsXG5cdCogICAgICdtYXgnOiAxLFxuXHQqICAgICAnc3RlcCc6IDAsXG5cdCogICAgICd2YWx1ZSc6IDBcblx0KiB9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqIGNoYW5nZVxuXHQqIEZpcmVzIHdoZW4gdGhlIGludGVyZmFjZSdzIHZhbHVlIGNoYW5nZXMuIDxicj5cblx0KiBFdmVudCBkYXRhOiA8aT5udW1iZXI8L2k+IFRoZSBudW1iZXIgdmFsdWUgb2YgdGhlIGludGVyZmFjZS5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogc2xpZGVyLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcblx0KiAgIGNvbnNvbGUubG9nKHYpO1xuXHQqIH0pXG5cdCpcblx0KlxuXHQqL1xuXHRcblx0dmFyIFNsaWRlciA9IChmdW5jdGlvbiAoX0ludGVyZmFjZSkge1xuXHQgIGZ1bmN0aW9uIFNsaWRlcigpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTbGlkZXIpO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1wibWluXCIsIFwibWF4XCIsIFwidmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbMTIwLCAyMF0sXG5cdCAgICAgIG1vZGU6IFwicmVsYXRpdmVcIiwgLy8gJ3JlbGF0aXZlJyBvciAnYWJzb2x1dGUnXG5cdCAgICAgIG1pbjogMCxcblx0ICAgICAgbWF4OiAxLFxuXHQgICAgICBzdGVwOiAwLFxuXHQgICAgICB2YWx1ZTogMFxuXHQgICAgfTtcblx0XG5cdCAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihTbGlkZXIucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIGFyZ3VtZW50cywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHRcblx0ICAgIHRoaXMub3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCI7IC8vIFRoaXMgd2lsbCBjaGFuZ2UgYXV0b21hdGljYWxseSB0byAnaG9yaXpvbnRhbCdpZiB0aGUgaW50ZXJmYWNlIGlzIHdpZGVyIHRoYW4gaXQgaXMgdGFsbC5cblx0XG5cdCAgICB0aGlzLl92YWx1ZSA9IG5ldyBTdGVwKHRoaXMuc2V0dGluZ3MubWluLCB0aGlzLnNldHRpbmdzLm1heCwgdGhpcy5zZXR0aW5ncy5zdGVwLCB0aGlzLnNldHRpbmdzLnZhbHVlKTtcblx0XG5cdCAgICB0aGlzLnBvc2l0aW9uID0gbmV3IEludGVyYWN0aW9uLkhhbmRsZSh0aGlzLnNldHRpbmdzLm1vZGUsIHRoaXMub3JpZW50YXRpb24sIFswLCB0aGlzLndpZHRoXSwgW3RoaXMuaGVpZ2h0LCAwXSk7XG5cdCAgICB0aGlzLnBvc2l0aW9uLnZhbHVlID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblx0XG5cdCAgICB0aGlzLmluaXQoKTtcblx0XG5cdCAgICB0aGlzLnBvc2l0aW9uLmRpcmVjdGlvbiA9IHRoaXMub3JpZW50YXRpb247XG5cdFxuXHQgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMudmFsdWUpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKFNsaWRlciwgX0ludGVyZmFjZSk7XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhTbGlkZXIsIHtcblx0ICAgIGJ1aWxkSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEludGVyZmFjZSgpIHtcblx0XG5cdCAgICAgICAgdGhpcy5iYXIgPSBzdmcuY3JlYXRlKFwicmVjdFwiKTtcblx0ICAgICAgICB0aGlzLmZpbGxiYXIgPSBzdmcuY3JlYXRlKFwicmVjdFwiKTtcblx0ICAgICAgICB0aGlzLmtub2IgPSBzdmcuY3JlYXRlKFwiY2lyY2xlXCIpO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYXIpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmZpbGxiYXIpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmtub2IpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2l6ZUludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2l6ZUludGVyZmFjZSgpIHtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMud2lkdGggPCB0aGlzLmhlaWdodCkge1xuXHQgICAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IFwidmVydGljYWxcIjtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IFwiaG9yaXpvbnRhbFwiO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgaWYgKHRoaXMucG9zaXRpb24pIHtcblx0ICAgICAgICAgIHRoaXMucG9zaXRpb24ucmVzaXplKFswLCB0aGlzLndpZHRoXSwgW3RoaXMuaGVpZ2h0LCAwXSk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB2YXIgeCA9IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgeSA9IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgdyA9IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgaCA9IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgYmFyT2Zmc2V0ID0gdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICBjb3JuZXJSYWRpdXMgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgdGhpcy5rbm9iRGF0YSA9IHtcblx0ICAgICAgICAgIGxldmVsOiAwLFxuXHQgICAgICAgICAgcjogMFxuXHQgICAgICAgIH07XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcblx0ICAgICAgICAgIHRoaXMudGhpY2tuZXNzID0gdGhpcy53aWR0aCAvIDI7XG5cdCAgICAgICAgICB4ID0gdGhpcy53aWR0aCAvIDI7XG5cdCAgICAgICAgICB5ID0gMDtcblx0ICAgICAgICAgIHcgPSB0aGlzLnRoaWNrbmVzcztcblx0ICAgICAgICAgIGggPSB0aGlzLmhlaWdodDtcblx0ICAgICAgICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzICogMC44O1xuXHQgICAgICAgICAgdGhpcy5rbm9iRGF0YS5sZXZlbCA9IGggLSB0aGlzLmtub2JEYXRhLnIgLSB0aGlzLm5vcm1hbGl6ZWQgKiAoaCAtIHRoaXMua25vYkRhdGEuciAqIDIpO1xuXHQgICAgICAgICAgYmFyT2Zmc2V0ID0gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnRoaWNrbmVzcyAqIC0xIC8gMiArIFwiLDApXCI7XG5cdCAgICAgICAgICBjb3JuZXJSYWRpdXMgPSB3IC8gMjtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy50aGlja25lc3MgPSB0aGlzLmhlaWdodCAvIDI7XG5cdCAgICAgICAgICB4ID0gMDtcblx0ICAgICAgICAgIHkgPSB0aGlzLmhlaWdodCAvIDI7XG5cdCAgICAgICAgICB3ID0gdGhpcy53aWR0aDtcblx0ICAgICAgICAgIGggPSB0aGlzLnRoaWNrbmVzcztcblx0ICAgICAgICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzICogMC44O1xuXHQgICAgICAgICAgdGhpcy5rbm9iRGF0YS5sZXZlbCA9IHRoaXMubm9ybWFsaXplZCAqICh3IC0gdGhpcy5rbm9iRGF0YS5yICogMikgKyB0aGlzLmtub2JEYXRhLnI7XG5cdCAgICAgICAgICBiYXJPZmZzZXQgPSBcInRyYW5zbGF0ZSgwLFwiICsgdGhpcy50aGlja25lc3MgKiAtMSAvIDIgKyBcIilcIjtcblx0ICAgICAgICAgIGNvcm5lclJhZGl1cyA9IGggLyAyO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwieFwiLCB4KTtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHkpO1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCBiYXJPZmZzZXQpO1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcInJ4XCIsIGNvcm5lclJhZGl1cyk7IC8vIGNvcm5lciByYWRpdXNcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJyeVwiLCBjb3JuZXJSYWRpdXMpO1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHcpO1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoKTtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIikge1xuXHQgICAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcInhcIiwgeCk7XG5cdCAgICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwieVwiLCB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3KTtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgaCAtIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwieFwiLCAwKTtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHkpO1xuXHQgICAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCBiYXJPZmZzZXQpO1xuXHQgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJyeFwiLCBjb3JuZXJSYWRpdXMpO1xuXHQgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJyeVwiLCBjb3JuZXJSYWRpdXMpO1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiKSB7XG5cdCAgICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3hcIiwgeCk7XG5cdCAgICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3lcIiwgdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB5KTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcInJcIiwgdGhpcy5rbm9iRGF0YS5yKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmZpbGwpO1xuXHQgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMuYWNjZW50KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbmRlcjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgIGlmICghdGhpcy5jbGlja2VkKSB7XG5cdCAgICAgICAgICB0aGlzLmtub2JEYXRhLnIgPSB0aGlzLnRoaWNrbmVzcyAqIDAuNzU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJyXCIsIHRoaXMua25vYkRhdGEucik7XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcblx0ICAgICAgICAgIHRoaXMua25vYkRhdGEubGV2ZWwgPSB0aGlzLmtub2JEYXRhLnIgKyB0aGlzLl92YWx1ZS5ub3JtYWxpemVkICogKHRoaXMuaGVpZ2h0IC0gdGhpcy5rbm9iRGF0YS5yICogMik7XG5cdCAgICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3lcIiwgdGhpcy5oZWlnaHQgLSB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHRoaXMuaGVpZ2h0IC0gdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG5cdCAgICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLmtub2JEYXRhLmxldmVsID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZCAqICh0aGlzLndpZHRoIC0gdGhpcy5rbm9iRGF0YS5yICogMikgKyB0aGlzLmtub2JEYXRhLnI7XG5cdCAgICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3hcIiwgdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG5cdCAgICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwieFwiLCAwKTtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGljazoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2soKSB7XG5cdCAgICAgICAgdGhpcy5rbm9iRGF0YS5yID0gdGhpcy50aGlja25lc3MgKiAwLjk7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi5hbmNob3IgPSB0aGlzLm1vdXNlO1xuXHQgICAgICAgIHRoaXMubW92ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbW92ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZSgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jbGlja2VkKSB7XG5cdCAgICAgICAgICB0aGlzLnBvc2l0aW9uLnVwZGF0ZSh0aGlzLm1vdXNlKTtcblx0ICAgICAgICAgIHRoaXMuX3ZhbHVlLnVwZGF0ZU5vcm1hbCh0aGlzLnBvc2l0aW9uLnZhbHVlKTtcblx0ICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLl92YWx1ZS52YWx1ZSk7XG5cdCAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbGVhc2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbGVhc2UoKSB7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG5vcm1hbGl6ZWQ6IHtcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWx1ZToge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFRoZSBzbGlkZXIncyBjdXJyZW50IHZhbHVlLiBJZiBzZXQgbWFudWFsbHksIHdpbGwgdXBkYXRlIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgc2xpZGVyLnZhbHVlID0gMTA7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUudmFsdWU7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcblx0ICAgICAgICB0aGlzLl92YWx1ZS51cGRhdGUodik7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMuX3ZhbHVlLnZhbHVlKTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbWluOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgTG93ZXIgbGltaXQgb2YgdGhlIHNsaWRlcnMncyBvdXRwdXQgcmFuZ2Vcblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgc2xpZGVyLm1pbiA9IDEwMDA7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUubWluO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUubWluID0gdjtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1heDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFVwcGVyIGxpbWl0IG9mIHRoZSBzbGlkZXIncyBvdXRwdXQgcmFuZ2Vcblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgc2xpZGVyLm1heCA9IDEwMDA7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUubWF4O1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUubWF4ID0gdjtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHN0ZXA6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBUaGUgaW5jcmVtZW50IHRoYXQgdGhlIHNsaWRlcidzIHZhbHVlIGNoYW5nZXMgYnkuXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgIEBleGFtcGxlIHNsaWRlci5zdGVwID0gNTtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5zdGVwO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUuc3RlcCA9IHY7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtb2RlOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgQWJzb2x1dGUgbW9kZSAoc2xpZGVyJ3MgdmFsdWUganVtcHMgdG8gbW91c2UgY2xpY2sgcG9zaXRpb24pIG9yIHJlbGF0aXZlIG1vZGUgKG1vdXNlIGRyYWcgY2hhbmdlcyB2YWx1ZSByZWxhdGl2ZSB0byBpdHMgY3VycmVudCBwb3NpdGlvbikuIERlZmF1bHQ6IFwicmVsYXRpdmVcIi5cblx0ICAgICAgQHR5cGUge3N0cmluZ31cblx0ICAgICAgQGV4YW1wbGUgc2xpZGVyLm1vZGUgPSBcInJlbGF0aXZlXCI7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi5tb2RlO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi5tb2RlID0gdjtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gU2xpZGVyO1xuXHR9KShJbnRlcmZhY2UpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBTbGlkZXI7XG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBzdmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgVG9nZ2xlTW9kZWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0dmFyIEludGVyZmFjZSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdFxuXHQvKipcblx0KiBUb2dnbGVcblx0KlxuXHQqIEBkZXNjcmlwdGlvbiBCaW5hcnkgc3dpdGNoXG5cdCpcblx0KiBAZGVtbyA8c3BhbiBuZXh1cy11aT1cInRvZ2dsZVwiPjwvc3Bhbj5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIHRvZ2dsZSA9IG5ldyBOZXh1cy5Ub2dnbGUoJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgdG9nZ2xlID0gbmV3IE5leHVzLlRvZ2dsZSgnI3RhcmdldCcse1xuXHQqICAgICAnc2l6ZSc6IFs0MCwyMF0sXG5cdCogICAgICdzdGF0ZSc6IGZhbHNlXG5cdCogfSlcblx0KlxuXHQqIEBvdXRwdXRcblx0KiBjaGFuZ2Vcblx0KiBGaXJlcyBhbnkgdGltZSB0aGUgaW50ZXJmYWNlJ3MgdmFsdWUgY2hhbmdlcy4gPGJyPlxuXHQqIFBhcmFtZXRlcjogVGhlIGJvb2xlYW4gc3RhdGUgb2YgdGhlIGludGVyZmFjZS5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogdG9nZ2xlLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcblx0KiAgIGNvbnNvbGUubG9nKHYpO1xuXHQqIH0pXG5cdCpcblx0KlxuXHQqL1xuXHRcblx0dmFyIFRvZ2dsZSA9IChmdW5jdGlvbiAoX0ludGVyZmFjZSkge1xuXHQgIGZ1bmN0aW9uIFRvZ2dsZSgpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUb2dnbGUpO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1widmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbNDAsIDIwXSxcblx0ICAgICAgdGFyZ2V0OiBmYWxzZSxcblx0ICAgICAgc3RhdGU6IGZhbHNlXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRvZ2dsZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgYXJndW1lbnRzLCBvcHRpb25zLCBkZWZhdWx0cyk7XG5cdFxuXHQgICAgdGhpcy5fc3RhdGUgPSBuZXcgVG9nZ2xlTW9kZWwodGhpcy5zZXR0aW5ncy5zdGF0ZSk7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoVG9nZ2xlLCBfSW50ZXJmYWNlKTtcblx0XG5cdCAgX2NyZWF0ZUNsYXNzKFRvZ2dsZSwge1xuXHQgICAgYnVpbGRJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICB0aGlzLmJhciA9IHN2Zy5jcmVhdGUoXCJyZWN0XCIpO1xuXHQgICAgICAgIHRoaXMua25vYiA9IHN2Zy5jcmVhdGUoXCJjaXJjbGVcIik7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuYmFyKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5rbm9iKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLmhlaWdodCA8IHRoaXMud2lkdGggLyAyKSB7XG5cdCAgICAgICAgICB0aGlzLmtub2JTaXplID0gdGhpcy5oZWlnaHQgLyAyO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLmtub2JTaXplID0gdGhpcy53aWR0aCAvIDQ7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJ4XCIsIHRoaXMud2lkdGggLyAyIC0gdGhpcy5rbm9iU2l6ZSAqIDEuNSk7XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwieVwiLCB0aGlzLmhlaWdodCAvIDIgLSB0aGlzLmtub2JTaXplIC8gMik7XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwicnhcIiwgdGhpcy5rbm9iU2l6ZSAvIDIpO1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcInJ5XCIsIHRoaXMua25vYlNpemUgLyAyKTtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB0aGlzLmtub2JTaXplICogMyk7XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIHRoaXMua25vYlNpemUpO1xuXHRcblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3hcIiwgdGhpcy53aWR0aCAvIDIgLSB0aGlzLmtub2JTaXplKTtcblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3lcIiwgdGhpcy5oZWlnaHQgLyAyKTtcblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiclwiLCB0aGlzLmtub2JTaXplKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICByZW5kZXI6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuc3RhdGUpIHtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB0aGlzLndpZHRoIC8gMiAtIHRoaXMua25vYlNpemUpO1xuXHQgICAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5maWxsKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMud2lkdGggLyAyICsgdGhpcy5rbm9iU2l6ZSk7XG5cdCAgICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2xpY2s6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsaWNrKCkge1xuXHQgICAgICAgIHRoaXMuZmxpcCgpO1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMuc3RhdGUpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc3RhdGU6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBXaGV0aGVyIHRoZSB0b2dnbGUgaXMgY3VycmVudGx5IG9uIG9yIG9mZi4gU2V0dGluZyB0aGlzIHByb3BlcnR5IHdpbGwgdXBkYXRlIHRoZSB0b2dnbGUgaW50ZXJmYWNlIGFuZCB0cmlnZ2VyIHRoZSBvdXRwdXQgZXZlbnQuXG5cdCAgICAgIEB0eXBlIHtib29sZWFufVxuXHQgICAgICBAZXhhbXBsZSB0b2dnbGUuc3RhdGUgPSBmYWxzZTtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZS5zdGF0ZTtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5mbGlwKHZhbHVlKTtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwgdGhpcy5zdGF0ZSk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGZsaXA6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICAqIFN3aXRjaCB0aGUgdG9nZ2xlIHN0YXRlIHRvIGl0cyBvcHBvc2l0ZSBzdGF0ZVxuXHQgICAgICAqIEBleGFtcGxlXG5cdCAgICAgICogdG9nZ2xlLmZsaXAoKTtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBmbGlwKCkge1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLmZsaXAoKTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBUb2dnbGU7XG5cdH0pKEludGVyZmFjZSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IFRvZ2dsZTtcblxuLyoqKi8gfSksXG4vKiAxNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsgdmFyIHByb3AgPSBwcm9wc1trZXldOyBwcm9wLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChwcm9wLnZhbHVlKSBwcm9wLndyaXRhYmxlID0gdHJ1ZTsgfSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKTsgfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQob2JqZWN0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjICYmIGRlc2Mud3JpdGFibGUpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9O1xuXHRcblx0dmFyIF9pbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9O1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9O1xuXHRcblx0dmFyIHN2ZyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBCdXR0b25UZW1wbGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xuXHRcblx0LyoqXG5cdCogQnV0dG9uXG5cdCpcblx0KiBAZGVzY3JpcHRpb24gQ2lyY3VsYXIgYnV0dG9uIHdpdGggb3B0aW9uYWwgYWZ0ZXJ0b3VjaC5cblx0KlxuXHQqIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwiYnV0dG9uXCI+PC9zcGFuPlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgYnV0dG9uID0gbmV3IE5leHVzLkJ1dHRvbignI3RhcmdldCcpXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBidXR0b24gPSBuZXcgTmV4dXMuQnV0dG9uKCcjdGFyZ2V0Jyx7XG5cdCogICAnc2l6ZSc6IFs4MCw4MF0sXG5cdCogICAnbW9kZSc6ICdhZnRlcnRvdWNoJyxcblx0KiAgICdzdGF0ZSc6IGZhbHNlXG5cdCogfSlcblx0KlxuXHQqIEBvdXRwdXRcblx0KiBjaGFuZ2Vcblx0KiBGaXJlcyBhbnkgdGltZSB0aGUgaW50ZXJmYWNlJ3MgdmFsdWUgY2hhbmdlcy4gPGJyPlxuXHQqIEluIDxiPmJ1dHRvbiBtb2RlPC9iPiwgPGI+dG9nZ2xlIG1vZGU8L2I+LCBhbmQgPGI+aW1wdWxzZSBtb2RlPC9iPiwgdGhlIG91dHB1dCBkYXRhIGlzIGEgYm9vbGVhbiBkZXNjcmliaW5nIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uLjxicj5cblx0KiBJbiA8Yj5hZnRlcnRvdWNoIG1vZGU8L2I+LCB0aGUgb3V0cHV0IGRhdGEgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgeCAoMC0xKSBhbmQgeSAoMC0xKSBwb3NpdGlvbnMgb2YgYWZ0ZXJ0b3VjaC5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogYnV0dG9uLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcblx0KiAgIC8vIHYgaXMgdGhlIHZhbHVlIG9mIHRoZSBidXR0b25cblx0KiAgIGNvbnNvbGUubG9nKHYpO1xuXHQqIH0pXG5cdCpcblx0Ki9cblx0XG5cdHZhciBCdXR0b24gPSAoZnVuY3Rpb24gKF9CdXR0b25UZW1wbGF0ZSkge1xuXHQgIGZ1bmN0aW9uIEJ1dHRvbigpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCdXR0b24pO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1wibW9kZVwiXTtcblx0XG5cdCAgICB2YXIgZGVmYXVsdHMgPSB7XG5cdCAgICAgIHNpemU6IFs4MCwgODBdLFxuXHQgICAgICBtb2RlOiBcImFmdGVydG91Y2hcIiwgLy8gYnV0dG9uLCBhZnRlcnRvdWNoLCBpbXB1bHNlLCB0b2dnbGVcblx0ICAgICAgc3RhdGU6IGZhbHNlXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEJ1dHRvbi5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgYXJndW1lbnRzLCBvcHRpb25zLCBkZWZhdWx0cyk7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAqIEludGVyYWN0aW9uIG1vZGU6IHN1cHBvcnRzIFwiYnV0dG9uXCIsIFwiYWZ0ZXJ0b3VjaFwiLCBcImltcHVsc2VcIiwgb3IgXCJ0b2dnbGVcIlxuXHQgICAgKiBAdHlwZSB7c3RyaW5nfVxuXHQgICAgKiBAZXhhbXBsZSBidXR0b24ubW9kZSA9ICd0b2dnbGUnO1xuXHQgICAgKi9cblx0ICAgIHRoaXMubW9kZSA9IHRoaXMuc2V0dGluZ3MubW9kZTtcblx0XG5cdCAgICB0aGlzLmluaXQoKTtcblx0ICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoQnV0dG9uLCBfQnV0dG9uVGVtcGxhdGUpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoQnV0dG9uLCB7XG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7XG5cdCAgICAgICAgdGhpcy5wYWQgPSBzdmcuY3JlYXRlKFwiY2lyY2xlXCIpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnBhZCk7XG5cdFxuXHQgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25UYXJnZXQgPSB0aGlzLnBhZDtcblx0XG5cdCAgICAgICAgLy8gb25seSB1c2VkIGlmIGluICdhZnRlcnRvdWNoJyBtb2RlXG5cdCAgICAgICAgdGhpcy5kZWZzID0gc3ZnLmNyZWF0ZShcImRlZnNcIik7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZGVmcyk7XG5cdFxuXHQgICAgICAgIHRoaXMuZ3JhZGllbnQgPSBzdmcucmFkaWFsR3JhZGllbnQodGhpcy5kZWZzLCAyKTtcblx0XG5cdCAgICAgICAgdGhpcy5ncmFkaWVudC5zdG9wc1swXS5zZXRBdHRyaWJ1dGUoXCJvZmZzZXRcIiwgXCIzMCVcIik7XG5cdFxuXHQgICAgICAgIHRoaXMuZ3JhZGllbnQuc3RvcHNbMV0uc2V0QXR0cmlidXRlKFwib2Zmc2V0XCIsIFwiMTAwJVwiKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMud2lkdGggLyAyKTtcblx0ICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmhlaWdodCAvIDIpO1xuXHQgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcInJcIiwgTWF0aC5taW4odGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpIC8gMiAtIHRoaXMud2lkdGggLyA0MCk7XG5cdCAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIHRoaXMud2lkdGggLyAyMCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjb2xvckludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY29sb3JJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMuZ3JhZGllbnQuc3RvcHNbMF0uc2V0QXR0cmlidXRlKFwic3RvcC1jb2xvclwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgIHRoaXMuZ3JhZGllbnQuc3RvcHNbMV0uc2V0QXR0cmlidXRlKFwic3RvcC1jb2xvclwiLCB0aGlzLmNvbG9ycy5maWxsKTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVuZGVyOiB7XG5cdFxuXHQgICAgICAvKlxuXHQgICAgICAqIFVwZGF0ZSB0aGUgdmlzdWFsIGludGVyZmFjZSB1c2luZyBpdHMgY3VycmVudCBzdGF0ZVxuXHQgICAgICAqXG5cdCAgICAgICogQGV4YW1wbGVcblx0ICAgICAgKiBidXR0b24ucmVuZGVyKCk7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgIGlmICghdGhpcy5zdGF0ZSkge1xuXHQgICAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5maWxsKTtcblx0ICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiYWZ0ZXJ0b3VjaFwiKSB7XG5cdCAgICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcInVybCgjXCIgKyB0aGlzLmdyYWRpZW50LmlkICsgXCIpXCIpO1xuXHQgICAgICAgICAgICB0aGlzLmdyYWRpZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY3hcIiwgdGhpcy5wb3NpdGlvbi54ICogMTAwICsgXCIlXCIpO1xuXHQgICAgICAgICAgICB0aGlzLmdyYWRpZW50LmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY3lcIiwgKDEgLSB0aGlzLnBvc2l0aW9uLnkpICogMTAwICsgXCIlXCIpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBCdXR0b247XG5cdH0pKEJ1dHRvblRlbXBsYXRlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gQnV0dG9uO1xuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChvYmplY3QsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MgJiYgZGVzYy53cml0YWJsZSkgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH07XG5cdFxuXHR2YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH07XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgc3ZnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyIG1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHR2YXIgVG9nZ2xlTW9kZWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblx0dmFyIEludGVyZmFjZSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdFxuXHQvKipcblx0QnV0dG9uIFRlbXBsYXRlXG5cdCovXG5cdFxuXHR2YXIgQnV0dG9uVGVtcGxhdGUgPSAoZnVuY3Rpb24gKF9JbnRlcmZhY2UpIHtcblx0ICBmdW5jdGlvbiBCdXR0b25UZW1wbGF0ZShhcmdzLCBvcHRpb25zLCBkZWZhdWx0cykge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJ1dHRvblRlbXBsYXRlKTtcblx0XG5cdCAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihCdXR0b25UZW1wbGF0ZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgYXJncywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHRcblx0ICAgIHRoaXMubW9kZSA9IHRoaXMuc2V0dGluZ3MubW9kZSB8fCBcImJ1dHRvblwiO1xuXHRcblx0ICAgIHRoaXMucG9zaXRpb24gPSB7XG5cdCAgICAgIHg6IDAsXG5cdCAgICAgIHk6IDBcblx0ICAgIH07XG5cdFxuXHQgICAgdGhpcy5fc3RhdGUgPSBuZXcgVG9nZ2xlTW9kZWwodGhpcy5zZXR0aW5ncy5zdGF0ZSk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoQnV0dG9uVGVtcGxhdGUsIF9JbnRlcmZhY2UpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoQnV0dG9uVGVtcGxhdGUsIHtcblx0ICAgIGJ1aWxkSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEludGVyZmFjZSgpIHtcblx0ICAgICAgICB0aGlzLnBhZCA9IHN2Zy5jcmVhdGUoXCJjaXJjbGVcIik7XG5cdCAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIiNkMThcIik7XG5cdCAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIFwiI2QxOFwiKTtcblx0ICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgNCk7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnBhZCk7XG5cdFxuXHQgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25UYXJnZXQgPSB0aGlzLnBhZDtcblx0XG5cdCAgICAgICAgdGhpcy5zaXplSW50ZXJmYWNlKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzaXplSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplSW50ZXJmYWNlKCkge1xuXHQgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMud2lkdGggLyAyKTtcblx0ICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmhlaWdodCAvIDIpO1xuXHQgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcInJcIiwgTWF0aC5taW4odGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpIC8gMiAtIDIpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVuZGVyOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLnN0YXRlKSB7XG5cdCAgICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmZpbGwpO1xuXHQgICAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZG93bjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gZG93bihwYWludGJydXNoKSB7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcblx0ICAgICAgICAgIGNhc2UgXCJpbXB1bHNlXCI6XG5cdCAgICAgICAgICAgIHRoaXMudHVybk9uKCk7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcblx0ICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMudHVybk9mZi5iaW5kKHRoaXMpLCAzMCk7XG5cdCAgICAgICAgICAgIC8vICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnN0YXRlKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG5cdCAgICAgICAgICAgIHRoaXMudHVybk9uKCk7XG5cdCAgICAgICAgICAgIC8vICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnN0YXRlKTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICBjYXNlIFwiYWZ0ZXJ0b3VjaFwiOlxuXHQgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0ge1xuXHQgICAgICAgICAgICAgIHg6IG1hdGguY2xpcCh0aGlzLm1vdXNlLnggLyB0aGlzLndpZHRoLCAwLCAxKSxcblx0ICAgICAgICAgICAgICB5OiBtYXRoLmNsaXAoMSAtIHRoaXMubW91c2UueSAvIHRoaXMuaGVpZ2h0LCAwLCAxKVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB0aGlzLnR1cm5PbigpO1xuXHQgICAgICAgICAgICAvLyAgICB0aGlzLmVtaXQoJ2NoYW5nZScse1xuXHQgICAgICAgICAgICAvLyAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuXHQgICAgICAgICAgICAvLyAgICAgIHg6IHRoaXMucG9zaXRpb24ueCxcblx0ICAgICAgICAgICAgLy8gICAgICB5OiB0aGlzLnBvc2l0aW9uLnksXG5cdCAgICAgICAgICAgIC8vICAgIH0pO1xuXHQgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgIGNhc2UgXCJ0b2dnbGVcIjpcblx0ICAgICAgICAgICAgdGhpcy5mbGlwKHBhaW50YnJ1c2gpO1xuXHQgICAgICAgICAgICAvLyAgICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5zdGF0ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGJlbmQ6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJlbmQobW91c2UpIHtcblx0ICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcImFmdGVydG91Y2hcIikge1xuXHQgICAgICAgICAgdGhpcy5tb3VzZSA9IG1vdXNlIHx8IHRoaXMubW91c2U7XG5cdCAgICAgICAgICB0aGlzLnBvc2l0aW9uID0ge1xuXHQgICAgICAgICAgICB4OiBtYXRoLmNsaXAodGhpcy5tb3VzZS54IC8gdGhpcy53aWR0aCwgMCwgMSksXG5cdCAgICAgICAgICAgIHk6IG1hdGguY2xpcCgxIC0gdGhpcy5tb3VzZS55IC8gdGhpcy5oZWlnaHQsIDAsIDEpXG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHtcblx0ICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG5cdCAgICAgICAgICAgIHg6IHRoaXMucG9zaXRpb24ueCxcblx0ICAgICAgICAgICAgeTogdGhpcy5wb3NpdGlvbi55IH0pO1xuXHQgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB1cDoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdXAoKSB7XG5cdCAgICAgICAgc3dpdGNoICh0aGlzLm1vZGUpIHtcblx0ICAgICAgICAgIGNhc2UgXCJidXR0b25cIjpcblx0ICAgICAgICAgICAgdGhpcy50dXJuT2ZmKCk7XG5cdCAgICAgICAgICAgIC8vICB0aGlzLmVtaXQoJ2NoYW5nZScsdGhpcy5zdGF0ZSk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgY2FzZSBcImFmdGVydG91Y2hcIjpcblx0ICAgICAgICAgICAgdGhpcy50dXJuT2ZmKCk7XG5cdCAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSB7XG5cdCAgICAgICAgICAgICAgeDogbWF0aC5jbGlwKHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgsIDAsIDEpLFxuXHQgICAgICAgICAgICAgIHk6IG1hdGguY2xpcCgxIC0gdGhpcy5tb3VzZS55IC8gdGhpcy5oZWlnaHQsIDAsIDEpXG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIC8vICB0aGlzLmVtaXQoJ2NoYW5nZScse1xuXHQgICAgICAgICAgICAvLyAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcblx0ICAgICAgICAgICAgLy8gICAgeDogdGhpcy5wb3NpdGlvbi54LFxuXHQgICAgICAgICAgICAvLyAgICB5OiB0aGlzLnBvc2l0aW9uLnksXG5cdCAgICAgICAgICAgIC8vICB9KTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2xpY2s6IHtcblx0XG5cdCAgICAgIC8qIG92ZXJ3cml0YWJsZSBpbnRlcmFjdGlvbiBoYW5kbGVycyAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsaWNrKCkge1xuXHQgICAgICAgIHRoaXMuZG93bigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbW92ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZSgpIHtcblx0ICAgICAgICB0aGlzLmJlbmQoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbGVhc2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbGVhc2UoKSB7XG5cdCAgICAgICAgdGhpcy51cCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc3RhdGU6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBXaGV0aGVyIHRoZSBidXR0b24gaXMgb24gKHByZXNzZWQpIG9yIG9mZiAobm90IHByZXNzZWQpXG5cdCAgICAgIEB0eXBlIHtib29sZWFufVxuXHQgICAgICBAZXhhbXBsZSBidXR0b24uc3RhdGUgPSB0cnVlO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlLnN0YXRlO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLmZsaXAodmFsdWUpO1xuXHQgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiYWZ0ZXJ0b3VjaFwiKSB7XG5cdCAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcblx0ICAgICAgICAgICAgeDogdGhpcy5wb3NpdGlvbi54LFxuXHQgICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uLnkgfSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnN0YXRlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGZsaXA6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBDaGFuZ2UgdGhlIGJ1dHRvbiB0byBpdHMgYWx0ZXJuYXRlIHN0YXRlIChvZmY9Pm9uLCBvbj0+b2ZmKSwgb3IgZmxpcCBpdCB0byBhIHNwZWNpZmllZCBzdGF0ZS5cblx0ICAgICAgQHBhcmFtIHZhbHVlIHtib29sZWFufSAoT3B0aW9uYWwpIFN0YXRlIHRvIGZsaXAgdG8uXG5cdCAgICAgIEBleGFtcGxlIGJ1dHRvbi5mbGlwKCk7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gZmxpcCh2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuX3N0YXRlLmZsaXAodmFsdWUpO1xuXHQgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiYWZ0ZXJ0b3VjaFwiKSB7XG5cdCAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcblx0ICAgICAgICAgICAgeDogdGhpcy5wb3NpdGlvbi54LFxuXHQgICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uLnkgfSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnN0YXRlKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHR1cm5Pbjoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFR1cm4gdGhlIGJ1dHRvbidzIHN0YXRlIHRvIHRydWUuXG5cdCAgICAgIEBleGFtcGxlIGJ1dHRvbi50dXJuT24oKTtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiB0dXJuT24oZW1pdHRpbmcpIHtcblx0ICAgICAgICB0aGlzLl9zdGF0ZS5vbigpO1xuXHQgICAgICAgIGlmIChlbWl0dGluZyAhPT0gZmFsc2UpIHtcblx0ICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09IFwiYWZ0ZXJ0b3VjaFwiKSB7XG5cdCAgICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB7XG5cdCAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG5cdCAgICAgICAgICAgICAgeDogdGhpcy5wb3NpdGlvbi54LFxuXHQgICAgICAgICAgICAgIHk6IHRoaXMucG9zaXRpb24ueSB9KTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnN0YXRlKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHR1cm5PZmY6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBUdXJuIHRoZSBidXR0b24ncyBzdGF0ZSB0byBmYWxzZS5cblx0ICAgICAgQGV4YW1wbGUgYnV0dG9uLnR1cm5PZmYoKTtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiB0dXJuT2ZmKGVtaXR0aW5nKSB7XG5cdCAgICAgICAgdGhpcy5fc3RhdGUub2ZmKCk7XG5cdCAgICAgICAgaWYgKGVtaXR0aW5nICE9PSBmYWxzZSkge1xuXHQgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJhZnRlcnRvdWNoXCIpIHtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHtcblx0ICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSxcblx0ICAgICAgICAgICAgICB4OiB0aGlzLnBvc2l0aW9uLngsXG5cdCAgICAgICAgICAgICAgeTogdGhpcy5wb3NpdGlvbi55IH0pO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMuc3RhdGUpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBCdXR0b25UZW1wbGF0ZTtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gQnV0dG9uVGVtcGxhdGU7XG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBCdXR0b25UZW1wbGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xuXHRcblx0LyoqXG5cdCogVGV4dEJ1dHRvblxuXHQqXG5cdCogQGRlc2NyaXB0aW9uIFRleHQgYnV0dG9uXG5cdCpcblx0KiBAZGVtbyA8c3BhbiBuZXh1cy11aT1cInRleHRCdXR0b25cIj48L3NwYW4+XG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciB0ZXh0YnV0dG9uID0gbmV3IE5leHVzLlRleHRCdXR0b24oJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgdGV4dGJ1dHRvbiA9IG5ldyBOZXh1cy5UZXh0QnV0dG9uKCcjdGFyZ2V0Jyx7XG5cdCogICAgICdzaXplJzogWzE1MCw1MF0sXG5cdCogICAgICdzdGF0ZSc6IGZhbHNlLFxuXHQqICAgICAndGV4dCc6ICdQbGF5Jyxcblx0KiAgICAgJ2FsdGVybmF0ZVRleHQnOiAnU3RvcCdcblx0KiB9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqIGNoYW5nZVxuXHQqIEZpcmVzIGFueSB0aW1lIHRoZSBpbnRlcmZhY2UncyB2YWx1ZSBjaGFuZ2VzLiA8YnI+XG5cdCogVGhlIGV2ZW50IGRhdGEgaXMgYSA8aT5zdHJpbmc8L2k+IG9mIHRoZSB0ZXh0IG9uIHRoZSBidXR0b24gYXQgdGhlIG1vbWVudCBpdCB3YXMgY2xpY2tlZC5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogdGV4dGJ1dHRvbi5vbignY2hhbmdlJyxmdW5jdGlvbih2KSB7XG5cdCogICBjb25zb2xlLmxvZyh2KTtcblx0KiB9KVxuXHQqXG5cdCovXG5cdFxuXHR2YXIgVGV4dEJ1dHRvbiA9IChmdW5jdGlvbiAoX0J1dHRvblRlbXBsYXRlKSB7XG5cdCAgZnVuY3Rpb24gVGV4dEJ1dHRvbigpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0QnV0dG9uKTtcblx0XG5cdCAgICB2YXIgb3B0aW9ucyA9IFtcInZhbHVlXCJdO1xuXHRcblx0ICAgIHZhciBkZWZhdWx0cyA9IHtcblx0ICAgICAgc2l6ZTogWzE1MCwgNTBdLFxuXHQgICAgICBzdGF0ZTogZmFsc2UsXG5cdCAgICAgIHRleHQ6IFwiUGxheVwiXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRleHRCdXR0b24ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIGFyZ3VtZW50cywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHRcblx0ICAgIHRoaXMuX3RleHQgPSB0aGlzLnNldHRpbmdzLnRleHQ7XG5cdFxuXHQgICAgaWYgKHRoaXMuc2V0dGluZ3MuYWx0ZXJuYXRlKSB7XG5cdCAgICAgIC8vVE9ETzogUmVtb3ZlIHRoaXMgY29uZGl0aW9uYWwgaW4gYSBicmVha2luZy1jaGFuZ2VzIHJlbGVhc2Vcblx0ICAgICAgdGhpcy5zZXR0aW5ncy5hbHRlcm5hdGVUZXh0ID0gdGhpcy5zZXR0aW5ncy5hbHRlcm5hdGU7XG5cdCAgICAgIGNvbnNvbGUud2FybihcIidhbHRlcm5hdGUnIGluaXRpYXRvciBpcyBkZXByZWNhdGVkLiBVc2UgJ2FsdGVybmF0ZVRleHQnIGluc3RlYWQuXCIpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fYWx0ZXJuYXRlVGV4dCA9IHRoaXMuc2V0dGluZ3MuYWx0ZXJuYXRlVGV4dDtcblx0ICAgIHRoaXMubW9kZSA9IHRoaXMuc2V0dGluZ3MuYWx0ZXJuYXRlVGV4dCA/IFwidG9nZ2xlXCIgOiBcImJ1dHRvblwiO1xuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgICB0aGlzLnJlbmRlcigpO1xuXHRcblx0ICAgIHRoaXMuc3RhdGUgPSB0aGlzLnNldHRpbmdzLnN0YXRlO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKFRleHRCdXR0b24sIF9CdXR0b25UZW1wbGF0ZSk7XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhUZXh0QnV0dG9uLCB7XG5cdCAgICBidWlsZEZyYW1lOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEZyYW1lKCkge1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG5cdFxuXHQgICAgICAgIHRoaXMudGV4dEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fdGV4dDtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50ZXh0RWxlbWVudCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7fVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY29sb3IgPSB0aGlzLmNvbG9ycy5kYXJrO1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzaXplSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplSW50ZXJmYWNlKCkge1xuXHQgICAgICAgIHZhciB0ZXh0c2l6ZSA9IHRoaXMuaGVpZ2h0IC8gMztcblx0ICAgICAgICB2YXIgdGV4dHNpemUyID0gdGhpcy53aWR0aCAvICh0aGlzLl90ZXh0Lmxlbmd0aCArIDIpO1xuXHQgICAgICAgIHRleHRzaXplID0gTWF0aC5taW4odGV4dHNpemUsIHRleHRzaXplMik7XG5cdCAgICAgICAgaWYgKHRoaXMuYWx0ZXJuYXRlVGV4dCkge1xuXHQgICAgICAgICAgdmFyIHRleHRzaXplMyA9IHRoaXMud2lkdGggLyAodGhpcy5hbHRlcm5hdGVUZXh0Lmxlbmd0aCArIDIpO1xuXHQgICAgICAgICAgdGV4dHNpemUgPSBNYXRoLm1pbih0ZXh0c2l6ZSwgdGV4dHNpemUzKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHN0eWxlcyA9IFwid2lkdGg6IFwiICsgdGhpcy53aWR0aCArIFwicHg7XCI7XG5cdCAgICAgICAgc3R5bGVzICs9IFwiaGVpZ2h0OiBcIiArIHRoaXMuaGVpZ2h0ICsgXCJweDtcIjtcblx0ICAgICAgICBzdHlsZXMgKz0gXCJwYWRkaW5nOiBcIiArICh0aGlzLmhlaWdodCAtIHRleHRzaXplKSAvIDIgKyBcInB4IDBweDtcIjtcblx0ICAgICAgICBzdHlsZXMgKz0gXCJib3gtc2l6aW5nOiBib3JkZXItYm94O1wiO1xuXHQgICAgICAgIHN0eWxlcyArPSBcInRleHQtYWxpZ246IGNlbnRlcjtcIjtcblx0ICAgICAgICBzdHlsZXMgKz0gXCJmb250LWZhbWlseTogaW5oZXJpdDtcIjtcblx0ICAgICAgICBzdHlsZXMgKz0gXCJmb250LXdlaWdodDogNzAwO1wiO1xuXHQgICAgICAgIHN0eWxlcyArPSBcIm9wYWNpdHk6IDE7XCI7XG5cdCAgICAgICAgc3R5bGVzICs9IFwiZm9udC1zaXplOlwiICsgdGV4dHNpemUgKyBcInB4O1wiO1xuXHQgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IHN0eWxlcztcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVuZGVyOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLnN0YXRlKSB7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuZmlsbDtcblx0ICAgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuc3R5bGUuY29sb3IgPSB0aGlzLmNvbG9ycy5kYXJrO1xuXHQgICAgICAgICAgdGhpcy50ZXh0RWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLl90ZXh0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuXHQgICAgICAgICAgdGhpcy50ZXh0RWxlbWVudC5zdHlsZS5jb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgICBpZiAodGhpcy5hbHRlcm5hdGVUZXh0KSB7XG5cdCAgICAgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fYWx0ZXJuYXRlVGV4dDtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMudGV4dEVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fdGV4dDtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBhbHRlcm5hdGVUZXh0OiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgVGhlIHRleHQgdG8gZGlzcGxheSB3aGVuIHRoZSBidXR0b24gaXMgaW4gaXRzIFwib25cIiBzdGF0ZS4gSWYgc2V0LCB0aGlzIHB1dHMgdGhlIGJ1dHRvbiBpbiBcInRvZ2dsZVwiIG1vZGUuXG5cdCAgICAgIEB0eXBlIHtTdHJpbmd9XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fYWx0ZXJuYXRlVGV4dDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodGV4dCkge1xuXHQgICAgICAgIGlmICh0ZXh0KSB7XG5cdCAgICAgICAgICB0aGlzLm1vZGUgPSBcInRvZ2dsZVwiO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLm1vZGUgPSBcImJ1dHRvblwiO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLl9hbHRlcm5hdGVUZXh0ID0gdGV4dDtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdGV4dDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFRoZSB0ZXh0IHRvIGRpc3BsYXkuIChJZiAuYWx0ZXJuYXRlVGV4dCBleGlzdHMsIHRoZW4gdGhpcyAudGV4dCB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBpbiBpdHMgXCJvZmZcIiBzdGF0ZS4pXG5cdCAgICAgIEB0eXBlIHtTdHJpbmd9XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodGV4dCkge1xuXHQgICAgICAgIHRoaXMuX3RleHQgPSB0ZXh0O1xuXHQgICAgICAgIHRoaXMuc2l6ZUludGVyZmFjZSgpO1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgcmV0dXJuIFRleHRCdXR0b247XG5cdH0pKEJ1dHRvblRlbXBsYXRlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gVGV4dEJ1dHRvbjtcblxuLyoqKi8gfSksXG4vKiAxOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsgdmFyIHByb3AgPSBwcm9wc1trZXldOyBwcm9wLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChwcm9wLnZhbHVlKSBwcm9wLndyaXRhYmxlID0gdHJ1ZTsgfSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKTsgfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQob2JqZWN0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjICYmIGRlc2Mud3JpdGFibGUpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9O1xuXHRcblx0dmFyIF9pbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9O1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9O1xuXHRcblx0Ly9sZXQgc3ZnID0gcmVxdWlyZSgnLi4vdXRpbC9zdmcnKTtcblx0dmFyIEludGVyZmFjZSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdHZhciBCdXR0b24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KTtcblx0XG5cdC8qKlxuXHQqIFJhZGlvQnV0dG9uXG5cdCpcblx0KiBAZGVzY3JpcHRpb24gQW4gYXJyYXkgb2YgYnV0dG9ucy4gQnkgZGVmYXVsdCwgc2VsZWN0aW5nIG9uZSBidXR0b24gd2lsbCBkZXNlbGVjdCBhbGwgb3RoZXIgYnV0dG9ucywgYnV0IHRoaXMgY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIEFQSSBiZWxvdy5cblx0KlxuXHQqIEBkZW1vIDxkaXYgbmV4dXMtdWk9XCJSYWRpb0J1dHRvblwiPjwvZGl2PlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgcmFkaW9idXR0b24gPSBuZXcgTmV4dXMuUmFkaW9CdXR0b24oJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgcmFkaW9idXR0b24gPSBuZXcgTmV4dXMuUmFkaW9CdXR0b24oJyN0YXJnZXQnLHtcblx0KiAgICdzaXplJzogWzEyMCwyNV0sXG5cdCogICAnbnVtYmVyT2ZCdXR0b25zJzogNCxcblx0KiAgICdhY3RpdmUnOiAtMVxuXHQqIH0pXG5cdCpcblx0KiBAb3V0cHV0XG5cdCogY2hhbmdlXG5cdCogRmlyZXMgYW55IHRpbWUgdGhlIGludGVyZmFjZSdzIHZhbHVlIGNoYW5nZXMuIDxicj5cblx0KiBUaGUgZXZlbnQgZGF0YSBhbiA8aT5pbnRlZ2VyPC9pPiwgdGhlIGluZGV4IG9mIHRoZSBidXR0b24gdGhhdCBpcyBjdXJyZW50bHkgb24uIElmIG5vIGJ1dHRvbiBpcyBzZWxlY3RlZCwgdGhlIHZhbHVlIHdpbGwgYmUgLTEuXG5cdCpcblx0KiBAb3V0cHV0ZXhhbXBsZVxuXHQqIHJhZGlvYnV0dG9uLm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcblx0KiAgIGNvbnNvbGUubG9nKHYpO1xuXHQqIH0pXG5cdCpcblx0Ki9cblx0XG5cdHZhciBSYWRpb0J1dHRvbiA9IChmdW5jdGlvbiAoX0ludGVyZmFjZSkge1xuXHQgIGZ1bmN0aW9uIFJhZGlvQnV0dG9uKCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJhZGlvQnV0dG9uKTtcblx0XG5cdCAgICB2YXIgb3B0aW9ucyA9IFtcInZhbHVlXCJdO1xuXHRcblx0ICAgIHZhciBkZWZhdWx0cyA9IHtcblx0ICAgICAgc2l6ZTogWzEyMCwgMjVdLFxuXHQgICAgICBudW1iZXJPZkJ1dHRvbnM6IDQsXG5cdCAgICAgIGFjdGl2ZTogLTFcblx0ICAgIH07XG5cdFxuXHQgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoUmFkaW9CdXR0b24ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIGFyZ3VtZW50cywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHRcblx0ICAgIHRoaXMuYnV0dG9ucyA9IFtdO1xuXHQgICAgdGhpcy5fbnVtYmVyT2ZCdXR0b25zID0gdGhpcy5zZXR0aW5ncy5udW1iZXJPZkJ1dHRvbnM7XG5cdCAgICB0aGlzLmFjdGl2ZSA9IHRoaXMuc2V0dGluZ3MuYWN0aXZlO1xuXHRcblx0ICAgIHRoaXMuaW5pdCgpO1xuXHQgICAgdGhpcy5yZW5kZXIoKTtcblx0ICB9XG5cdFxuXHQgIF9pbmhlcml0cyhSYWRpb0J1dHRvbiwgX0ludGVyZmFjZSk7XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhSYWRpb0J1dHRvbiwge1xuXHQgICAgYnVpbGRGcmFtZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRGcmFtZSgpIHtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbnVtYmVyT2ZCdXR0b25zOyBpKyspIHtcblx0ICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcblx0XG5cdCAgICAgICAgICB2YXIgYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIHtcblx0ICAgICAgICAgICAgbW9kZTogXCJ0b2dnbGVcIixcblx0ICAgICAgICAgICAgY29tcG9uZW50OiB0cnVlIH0sIHRoaXMudXBkYXRlLmJpbmQodGhpcywgaSkpO1xuXHRcblx0ICAgICAgICAgIHRoaXMuYnV0dG9ucy5wdXNoKGJ1dHRvbik7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzaXplSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICB2YXIgYnV0dG9uV2lkdGggPSB0aGlzLndpZHRoIC8gdGhpcy5fbnVtYmVyT2ZCdXR0b25zO1xuXHQgICAgICAgIHZhciBidXR0b25IZWlnaHQgPSB0aGlzLmhlaWdodDtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9udW1iZXJPZkJ1dHRvbnM7IGkrKykge1xuXHQgICAgICAgICAgdGhpcy5idXR0b25zW2ldLnJlc2l6ZShidXR0b25XaWR0aCwgYnV0dG9uSGVpZ2h0KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjb2xvckludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY29sb3JJbnRlcmZhY2UoKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9udW1iZXJPZkJ1dHRvbnM7IGkrKykge1xuXHQgICAgICAgICAgdGhpcy5idXR0b25zW2ldLmNvbG9ycyA9IHRoaXMuY29sb3JzO1xuXHQgICAgICAgICAgdGhpcy5idXR0b25zW2ldLnJlbmRlcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVwZGF0ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGluZGV4KSB7XG5cdCAgICAgICAgaWYgKHRoaXMuYnV0dG9uc1tpbmRleF0uc3RhdGUpIHtcblx0ICAgICAgICAgIHRoaXMuc2VsZWN0KGluZGV4KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5kZXNlbGVjdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbmRlcjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5idXR0b25zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICBpZiAoaSA9PT0gdGhpcy5hY3RpdmUpIHtcblx0ICAgICAgICAgICAgdGhpcy5idXR0b25zW2ldLnR1cm5PbihmYWxzZSk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmJ1dHRvbnNbaV0udHVybk9mZihmYWxzZSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2VsZWN0OiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgU2VsZWN0IG9uZSBidXR0b24gYW5kIGRlc2VsZWN0IGFsbCBvdGhlciBidXR0b25zLlxuXHQgICAgICBAcGFyYW0gaW5kZXgge251bWJlcn0gVGhlIGluZGV4IG9mIHRoZSBidXR0b24gdG8gc2VsZWN0XG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2VsZWN0KGluZGV4KSB7XG5cdCAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmJ1dHRvbnMubGVuZ3RoKSB7XG5cdCAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGluZGV4O1xuXHQgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMuYWN0aXZlKTtcblx0ICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZGVzZWxlY3Q6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBEZXNlbGVjdCBhbGwgYnV0dG9ucy5cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBkZXNlbGVjdCgpIHtcblx0ICAgICAgICB0aGlzLmFjdGl2ZSA9IC0xO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLmFjdGl2ZSk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG51bWJlck9mQnV0dG9uczoge1xuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZCdXR0b25zO1xuXHQgICAgICB9LFxuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgICAqIFVwZGF0ZSBob3cgbWFueSBidXR0b25zIGFyZSBpbiB0aGUgaW50ZXJmYWNlXG5cdCAgICAgICAqIEBwYXJhbSAge251bWJlcn0gYnV0dG9ucyBIb3cgbWFueSBidXR0b25zIGFyZSBpbiB0aGUgaW50ZXJmYWNlXG5cdCAgICAgICAqL1xuXHQgICAgICBzZXQ6IGZ1bmN0aW9uIChidXR0b25zKSB7XG5cdCAgICAgICAgdGhpcy5fbnVtYmVyT2ZCdXR0b25zID0gYnV0dG9ucztcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYnV0dG9ucy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgdGhpcy5idXR0b25zW2ldLmRlc3Ryb3koKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5idXR0b25zID0gW107XG5cdCAgICAgICAgLy8gIGZvciAobGV0IGk9MDtpPHRoaXMuYnV0dG9ucy5sZW5ndGg7aSsrKSB7XG5cdCAgICAgICAgLy8gICAgdGhpcy5idXR0b25zW2ldLmRlc3Ryb3koKTtcblx0ICAgICAgICAvLyAgfVxuXHQgICAgICAgIHRoaXMuZW1wdHkoKTtcblx0ICAgICAgICB0aGlzLmJ1aWxkSW50ZXJmYWNlKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgcmV0dXJuIFJhZGlvQnV0dG9uO1xuXHR9KShJbnRlcmZhY2UpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBSYWRpb0J1dHRvbjtcblxuLyoqKi8gfSksXG4vKiAyMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsgdmFyIHByb3AgPSBwcm9wc1trZXldOyBwcm9wLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChwcm9wLnZhbHVlKSBwcm9wLndyaXRhYmxlID0gdHJ1ZTsgfSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKTsgfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQob2JqZWN0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjICYmIGRlc2Mud3JpdGFibGUpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9O1xuXHRcblx0dmFyIF9pbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9O1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9O1xuXHRcblx0dmFyIEludGVyZmFjZSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdHZhciBTdGVwID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cdHZhciBtYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XG5cdC8qKlxuXHQqIE51bWJlclxuXHQqXG5cdCogQGRlc2NyaXB0aW9uIE51bWJlciBpbnRlcmZhY2Ugd2hpY2ggaXMgY29udHJvbGxhYmxlIGJ5IGRyYWdnaW5nIG9yIHR5cGluZy5cblx0KlxuXHQqIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwibnVtYmVyXCI+PC9zcGFuPlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgbnVtYmVyID0gbmV3IE5leHVzLk51bWJlcignI3RhcmdldCcpXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBudW1iZXIgPSBuZXcgTmV4dXMuTnVtYmVyKCcjdGFyZ2V0Jyx7XG5cdCogICAnc2l6ZSc6IFs2MCwzMF0sXG5cdCogICAndmFsdWUnOiAwLFxuXHQqICAgJ21pbic6IDAsXG5cdCogICAnbWF4JzogMjAwMDAsXG5cdCogICAnc3RlcCc6IDFcblx0KiB9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqIGNoYW5nZVxuXHQqIEZpcmVzIGFueSB0aW1lIHRoZSBpbnRlcmZhY2UncyB2YWx1ZSBjaGFuZ2VzLiA8YnI+XG5cdCogVGhlIGV2ZW50IGRhdGEgaXMgdGhlIG51bWJlciB2YWx1ZSBvZiB0aGUgaW50ZXJmYWNlLlxuXHQqXG5cdCogQG91dHB1dGV4YW1wbGVcblx0KiBudW1iZXIub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuXHQqICAgY29uc29sZS5sb2codik7XG5cdCogfSlcblx0KlxuXHQqXG5cdCovXG5cdFxuXHR2YXIgTnVtYmVyID0gKGZ1bmN0aW9uIChfSW50ZXJmYWNlKSB7XG5cdCAgZnVuY3Rpb24gTnVtYmVyKCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE51bWJlcik7XG5cdFxuXHQgICAgdmFyIG9wdGlvbnMgPSBbXCJ2YWx1ZVwiXTtcblx0XG5cdCAgICB2YXIgZGVmYXVsdHMgPSB7XG5cdCAgICAgIHNpemU6IFs2MCwgMzBdLFxuXHQgICAgICB2YWx1ZTogMCxcblx0ICAgICAgbWluOiAwLFxuXHQgICAgICBtYXg6IDIwMDAwLFxuXHQgICAgICBzdGVwOiAxXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKE51bWJlci5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgYXJndW1lbnRzLCBvcHRpb25zLCBkZWZhdWx0cyk7XG5cdFxuXHQgICAgdGhpcy5fdmFsdWUgPSBuZXcgU3RlcCh0aGlzLnNldHRpbmdzLm1pbiwgdGhpcy5zZXR0aW5ncy5tYXgsIHRoaXMuc2V0dGluZ3Muc3RlcCwgdGhpcy5zZXR0aW5ncy52YWx1ZSk7XG5cdFxuXHQgICAgLypcblx0ICAgIERlZmF1bHQ6IDIuIEhvdyBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIGNsaXAgdGhlIG51bWJlcidzIHZpc3VhbCByZW5kZXJpbmcgdG8uIFRoaXMgZG9lcyBub3QgYWZmZWN0IG51bWJlcidzIGFjdHVhbCB2YWx1ZSBvdXRwdXQgLS0gZm9yIHRoYXQsIHNldCB0aGUgc3RlcCBwcm9wZXJ0eSB0byAuMDEsIC4xLCBvciAxLlxuXHQgICAgQHR5cGUge251bWJlcn1cblx0ICAgIEBleGFtcGxlIG51bWJlci5kZWNpbWFsUGxhY2VzID0gMjtcblx0ICAgICovXG5cdCAgICB0aGlzLmRlY2ltYWxQbGFjZXMgPSAyO1xuXHQgICAgdGhpcy5hY3R1YWwgPSAwO1xuXHRcblx0ICAgIHRoaXMubWF4ID0gdGhpcy5fdmFsdWUubWF4O1xuXHRcblx0ICAgIHRoaXMubWluID0gdGhpcy5fdmFsdWUubWluO1xuXHRcblx0ICAgIHRoaXMuc3RlcCA9IHRoaXMuX3ZhbHVlLnN0ZXA7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgICB0aGlzLnJlbmRlcigpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKE51bWJlciwgX0ludGVyZmFjZSk7XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhOdW1iZXIsIHtcblx0ICAgIGJ1aWxkRnJhbWU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkRnJhbWUoKSB7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC50eXBlID0gXCJ0ZXh0XCI7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY29sb3IgPSB0aGlzLmNvbG9ycy5kYXJrO1xuXHQgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC52YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuXHQgICAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyc2VGbG9hdCh0aGlzLmVsZW1lbnQudmFsdWUpO1xuXHQgICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pLmJpbmQodGhpcykpO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICBpZiAoZS53aGljaCA8IDQ4IHx8IGUud2hpY2ggPiA1Nykge1xuXHQgICAgICAgICAgICBpZiAoZS53aGljaCAhPT0gMTg5ICYmIGUud2hpY2ggIT09IDE5MCAmJiBlLndoaWNoICE9PSA4KSB7XG5cdCAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBpZiAoZS53aGljaCA9PT0gMTMpIHtcblx0ICAgICAgICAgICAgdGhpcy5lbGVtZW50LmJsdXIoKTtcblx0ICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuZWxlbWVudC52YWx1ZTtcblx0ICAgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMudmFsdWUpO1xuXHQgICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pLmJpbmQodGhpcykpO1xuXHRcblx0ICAgICAgICB0aGlzLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2l6ZUludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2l6ZUludGVyZmFjZSgpIHtcblx0XG5cdCAgICAgICAgdGhpcy5fbWluRGltZW5zaW9uID0gTWF0aC5taW4odGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuXHRcblx0ICAgICAgICB2YXIgc3R5bGVzID0gXCJ3aWR0aDogXCIgKyB0aGlzLndpZHRoICsgXCJweDtcIjtcblx0ICAgICAgICBzdHlsZXMgKz0gXCJoZWlnaHQ6IFwiICsgdGhpcy5oZWlnaHQgKyBcInB4O1wiO1xuXHQgICAgICAgIHN0eWxlcyArPSBcImJhY2tncm91bmQtY29sb3I6ICNlN2U3ZTc7XCI7XG5cdCAgICAgICAgc3R5bGVzICs9IFwiY29sb3I6ICMzMzM7XCI7XG5cdCAgICAgICAgc3R5bGVzICs9IFwiZm9udC1mYW1pbHk6IGFyaWFsO1wiO1xuXHQgICAgICAgIHN0eWxlcyArPSBcImZvbnQtd2VpZ2h0OiA1MDA7XCI7XG5cdCAgICAgICAgc3R5bGVzICs9IFwiZm9udC1zaXplOlwiICsgdGhpcy5fbWluRGltZW5zaW9uIC8gMiArIFwicHg7XCI7XG5cdCAgICAgICAgLy8gIHN0eWxlcyArPSAnaGlnaGxpZ2h0OiAjZDE4Oyc7XG5cdCAgICAgICAgc3R5bGVzICs9IFwiYm9yZGVyOiBub25lO1wiO1xuXHQgICAgICAgIHN0eWxlcyArPSBcIm91dGxpbmU6IG5vbmU7XCI7XG5cdCAgICAgICAgc3R5bGVzICs9IFwicGFkZGluZzogXCIgKyB0aGlzLl9taW5EaW1lbnNpb24gLyA0ICsgXCJweCBcIiArIHRoaXMuX21pbkRpbWVuc2lvbiAvIDQgKyBcInB4O1wiO1xuXHQgICAgICAgIHN0eWxlcyArPSBcImJveC1zaXppbmc6IGJvcmRlci1ib3g7XCI7XG5cdCAgICAgICAgc3R5bGVzICs9IFwidXNlclNlbGVjdDogdGV4dDtcIjtcblx0ICAgICAgICBzdHlsZXMgKz0gXCJtb3pVc2VyU2VsZWN0OiB0ZXh0O1wiO1xuXHQgICAgICAgIHN0eWxlcyArPSBcIndlYmtpdFVzZXJTZWxlY3Q6IHRleHQ7XCI7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmNzc1RleHQgKz0gc3R5bGVzO1xuXHRcblx0ICAgICAgICAvLyB0byBhZGQgZXZlbnR1YWxseVxuXHQgICAgICAgIC8vIHZhciBjc3MgPSAnIycrdGhpcy5lbGVtZW50SUQrJzo6c2VsZWN0aW9ueyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCB9Jztcblx0XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnZhbHVlID0gdGhpcy52YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuZmlsbDtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuY29sb3IgPSB0aGlzLmNvbG9ycy5kYXJrO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVuZGVyOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IG1hdGgucHJ1bmUodGhpcy52YWx1ZSwgdGhpcy5kZWNpbWFsUGxhY2VzKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsaWNrOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbGljaygpIHtcblx0ICAgICAgICB0aGlzLmhhc01vdmVkID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnJlYWRPbmx5ID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmFjdHVhbCA9IHRoaXMudmFsdWU7XG5cdCAgICAgICAgdGhpcy5pbml0aWFsID0geyB5OiB0aGlzLm1vdXNlLnkgfTtcblx0ICAgICAgICB0aGlzLmNoYW5nZUZhY3RvciA9IG1hdGguaW52ZXJ0KHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgpO1xuXHQgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY2hhbmdlRmFjdG9yKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1vdmU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmUoKSB7XG5cdCAgICAgICAgdGhpcy5oYXNNb3ZlZCA9IHRydWU7XG5cdCAgICAgICAgaWYgKHRoaXMuY2xpY2tlZCkge1xuXHRcblx0ICAgICAgICAgIHZhciBuZXd2YWx1ZSA9IHRoaXMuYWN0dWFsIC0gKHRoaXMubW91c2UueSAtIHRoaXMuaW5pdGlhbC55KSAqIChtYXRoLmNsaXAodGhpcy5tYXggLSB0aGlzLm1pbiwgMCwgMTAwMCkgLyAyMDApICogTWF0aC5wb3codGhpcy5jaGFuZ2VGYWN0b3IsIDIpO1xuXHQgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ld3ZhbHVlO1xuXHRcblx0ICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgICAgICBpZiAodGhpcy5fdmFsdWUuY2hhbmdlZCkge1xuXHQgICAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwgdGhpcy52YWx1ZSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVsZWFzZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVsZWFzZSgpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuaGFzTW92ZWQpIHtcblx0ICAgICAgICAgIHRoaXMuZWxlbWVudC5yZWFkT25seSA9IGZhbHNlO1xuXHQgICAgICAgICAgdGhpcy5lbGVtZW50LmZvY3VzKCk7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGhpcy5lbGVtZW50LnZhbHVlLmxlbmd0aCk7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuXHQgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmNvbG9yID0gdGhpcy5jb2xvcnMubGlnaHQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGRvY3VtZW50LmJvZHkuZm9jdXMoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBsaW5rOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgQ29ubmVjdCB0aGlzIG51bWJlciBpbnRlcmZhY2UgdG8gYSBkaWFsIG9yIHNsaWRlclxuXHQgICAgICBAcGFyYW0ge0ludGVyZmFjZX0gZWxlbWVudCBFbGVtZW50IHRvIGNvbm5lY3QgdG8uXG5cdCAgICAgIEBleGFtcGxlIG51bWJlci5saW5rKHNsaWRlcilcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBsaW5rKGRlc3RpbmF0aW9uKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgdGhpcy5taW4gPSBkZXN0aW5hdGlvbi5taW47XG5cdCAgICAgICAgdGhpcy5tYXggPSBkZXN0aW5hdGlvbi5tYXg7XG5cdCAgICAgICAgdGhpcy5zdGVwID0gZGVzdGluYXRpb24uc3RlcDtcblx0ICAgICAgICBkZXN0aW5hdGlvbi5vbihcImNoYW5nZVwiLCBmdW5jdGlvbiAodikge1xuXHQgICAgICAgICAgX3RoaXMucGFzc2l2ZVVwZGF0ZSh2KTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgICBkZXN0aW5hdGlvbi52YWx1ZSA9IHY7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IGRlc3RpbmF0aW9uLnZhbHVlO1xuXHQgICAgICAgIC8qICByZXR1cm4ge1xuXHQgICAgICAgICAgICBsaXN0ZW5lcjE6IGxpc3RlbmVyMSxcblx0ICAgICAgICAgICAgbGlzdGVuZXIyOiBsaXN0ZW5lcjIsXG5cdCAgICAgICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcblx0ICAgICAgICAgICAgICBsaXN0ZW5lcjEucmVtb3ZlKCkgKG9yIHNpbWlsYXIpXG5cdCAgICAgICAgICAgICAgbGlzdGVuZXIyLnJlbW92ZSgpIChvciBzaW1pbGFyKVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9ICovXG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBwYXNzaXZlVXBkYXRlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXNzaXZlVXBkYXRlKHYpIHtcblx0ICAgICAgICB0aGlzLl92YWx1ZS51cGRhdGUodik7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbHVlOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgVGhlIGludGVyZmFjZSdzIGN1cnJlbnQgdmFsdWUuIElmIHNldCBtYW51YWxseSwgd2lsbCB1cGRhdGUgdGhlIGludGVyZmFjZSBhbmQgdHJpZ2dlciB0aGUgb3V0cHV0IGV2ZW50LlxuXHQgICAgICBAdHlwZSB7bnVtYmVyfVxuXHQgICAgICBAZXhhbXBsZSBudW1iZXIudmFsdWUgPSAxMDtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS52YWx1ZTtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3ZhbHVlLnVwZGF0ZSh2KTtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwgdGhpcy52YWx1ZSk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1pbjoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIExvd2VyIGxpbWl0IG9mIHRoZSBudW1iZXIncyBvdXRwdXQgcmFuZ2Vcblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgbnVtYmVyLm1pbiA9IDEwMDA7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUubWluO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUubWluID0gdjtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1heDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFVwcGVyIGxpbWl0IG9mIHRoZSBudW1iZXIncyBvdXRwdXQgcmFuZ2Vcblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgbnVtYmVyLm1heCA9IDEwMDA7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUubWF4O1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUubWF4ID0gdjtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHN0ZXA6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBUaGUgaW5jcmVtZW50IHRoYXQgdGhlIG51bWJlcidzIHZhbHVlIGNoYW5nZXMgYnkuXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgIEBleGFtcGxlIG51bWJlci5zdGVwID0gNTtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5zdGVwO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUuc3RlcCA9IHY7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgcmV0dXJuIE51bWJlcjtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gTnVtYmVyO1xuXG4vKioqLyB9KSxcbi8qIDIxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChvYmplY3QsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MgJiYgZGVzYy53cml0YWJsZSkgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH07XG5cdFxuXHR2YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH07XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgSW50ZXJmYWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0XG5cdC8qKlxuXHQqIFNlbGVjdFxuXHQqXG5cdCogQGRlc2NyaXB0aW9uIERyb3Bkb3duIG1lbnVcblx0KlxuXHQqIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwic2VsZWN0XCI+PC9zcGFuPlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgc2VsZWN0ID0gbmV3IE5leHVzLlNlbGVjdCgnI3RhcmdldCcpXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBzZWxlY3QgPSBuZXcgTmV4dXMuU2VsZWN0KCcjdGFyZ2V0Jyx7XG5cdCogICAnc2l6ZSc6IFsxMDAsMzBdLFxuXHQqICAgJ29wdGlvbnMnOiBbJ2RlZmF1bHQnLCdvcHRpb25zJ11cblx0KiB9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqIGNoYW5nZVxuXHQqIEZpcmVzIGFueSB0aW1lIHRoZSBpbnRlcmZhY2UncyB2YWx1ZSBjaGFuZ2VzLiA8YnI+XG5cdCogVGhlIGV2ZW50IGRhdGEgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRleHQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIG9wdGlvbiwgYXMgd2VsbCBhcyB0aGUgbnVtZXJpYyBpbmRleCBvZiB0aGUgc2VsZWN0aW9uLlxuXHQqXG5cdCogQG91dHB1dGV4YW1wbGVcblx0KiBzZWxlY3Qub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuXHQqICAgY29uc29sZS5sb2codik7XG5cdCogfSlcblx0KlxuXHQqXG5cdCovXG5cdFxuXHR2YXIgU2VsZWN0ID0gKGZ1bmN0aW9uIChfSW50ZXJmYWNlKSB7XG5cdCAgZnVuY3Rpb24gU2VsZWN0KCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNlbGVjdCk7XG5cdFxuXHQgICAgdmFyIG9wdGlvbnMgPSBbXCJ2YWx1ZVwiXTtcblx0XG5cdCAgICB2YXIgZGVmYXVsdHMgPSB7XG5cdCAgICAgIHNpemU6IFsxMDAsIDMwXSxcblx0ICAgICAgb3B0aW9uczogW1wiZGVmYXVsdFwiLCBcIm9wdGlvbnNcIl1cblx0ICAgIH07XG5cdFxuXHQgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoU2VsZWN0LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gLTE7XG5cdCAgICB0aGlzLl92YWx1ZSA9IGZhbHNlO1xuXHRcblx0ICAgIHRoaXMuX29wdGlvbnMgPSB0aGlzLnNldHRpbmdzLm9wdGlvbnM7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgICB0aGlzLnJlbmRlcigpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKFNlbGVjdCwgX0ludGVyZmFjZSk7XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhTZWxlY3QsIHtcblx0ICAgIGJ1aWxkRnJhbWU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkRnJhbWUoKSB7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSB0aGlzLmhlaWdodCAvIDIgKyBcInB4XCI7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLm91dGxpbmUgPSBcIm5vbmVcIjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGlnaGxpZ2h0ID0gXCJub25lXCI7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy53aWR0aCArIFwicHhcIjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyBcInB4XCI7XG5cdFxuXHQgICAgICAgIHRoaXMuYm91bmRSZW5kZXIgPSB0aGlzLnJlbmRlci5iaW5kKHRoaXMpO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCB0aGlzLmJvdW5kUmVuZGVyKTtcblx0XG5cdCAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGF0dGFjaExpc3RlbmVyczoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYXR0YWNoTGlzdGVuZXJzKCkge31cblx0ICAgIH0sXG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMuZGVmaW5lT3B0aW9ucygpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29sb3JJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbG9ySW50ZXJmYWNlKCkge1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmNvbG9ycy5maWxsO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5jb2xvciA9IHRoaXMuY29sb3JzLmRhcms7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJvcmRlciA9IFwic29saWQgMHB4IFwiICsgdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQ7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICByZW5kZXI6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0XG5cdCAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLmVsZW1lbnQub3B0aW9uc1t0aGlzLmVsZW1lbnQuc2VsZWN0ZWRJbmRleF0udGV4dDtcblx0ICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gdGhpcy5lbGVtZW50LnNlbGVjdGVkSW5kZXg7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHtcblx0ICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZSxcblx0ICAgICAgICAgIGluZGV4OiB0aGlzLl9zZWxlY3RlZEluZGV4XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGljazoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2soKSB7fVxuXHQgICAgfSxcblx0ICAgIG1vdmU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmUoKSB7fVxuXHQgICAgfSxcblx0ICAgIHJlbGVhc2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbGVhc2UoKSB7fVxuXHQgICAgfSxcblx0ICAgIGRlZmluZU9wdGlvbnM6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICAgKiBVcGRhdGUgdGhlIGxpc3Qgb2Ygb3B0aW9ucy4gVGhpcyByZW1vdmVzIGFsbCBleGlzdGluZyBvcHRpb25zIGFuZCBjcmVhdGVzIGEgbmV3IGxpc3Qgb2Ygb3B0aW9ucy5cblx0ICAgICAgICogQHBhcmFtICB7YXJyYXl9IG9wdGlvbnMgTmV3IGFycmF5IG9mIG9wdGlvbnNcblx0ICAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gZGVmaW5lT3B0aW9ucyhvcHRpb25zKSB7XG5cdFxuXHQgICAgICAgIC8qICBmdW5jdGlvbiByZW1vdmVPcHRpb25zKHNlbGVjdGJveClcblx0ICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICB2YXIgaTtcblx0ICAgICAgICAgICAgICBmb3IoaSA9IHNlbGVjdGJveC5vcHRpb25zLmxlbmd0aCAtIDEgOyBpID49IDAgOyBpLS0pXG5cdCAgICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgICBzZWxlY3Rib3gucmVtb3ZlKGkpO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIC8vdXNpbmcgdGhlIGZ1bmN0aW9uOlxuXHQgICAgICAgICAgcmVtb3ZlT3B0aW9ucyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm15U2VsZWN0T2JqZWN0XCIpKTsgKi9cblx0XG5cdCAgICAgICAgaWYgKG9wdGlvbnMpIHtcblx0ICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuZWxlbWVudC5vcHRpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlKGkpO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQub3B0aW9ucy5hZGQobmV3IE9wdGlvbih0aGlzLl9vcHRpb25zW2ldLCBpKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBUaGUgdGV4dCBvZiB0aGUgb3B0aW9uIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLiBJZiBzZXQsIHdpbGwgdXBkYXRlIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cblx0ICAgICAgQHR5cGUge1N0cmluZ31cblx0ICAgICAgQGV4YW1wbGUgc2VsZWN0LnZhbHVlID0gXCJzYXd0b290aFwiO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUgPSB2O1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIGlmICh2ID09PSB0aGlzLmVsZW1lbnQub3B0aW9uc1tpXS50ZXh0KSB7XG5cdCAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGk7XG5cdCAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNlbGVjdGVkSW5kZXg6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBUaGUgbnVtZXJpYyBpbmRleCBvZiB0aGUgb3B0aW9uIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkLiBJZiBzZXQsIHdpbGwgdXBkYXRlIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgc2VsZWN0LnNlbGVjdGVkSW5kZXggPSAyO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSW5kZXg7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcblx0ICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gdjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc2VsZWN0ZWRJbmRleCA9IHY7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGN1c3RvbURlc3Ryb3k6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGN1c3RvbURlc3Ryb3koKSB7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcy5ib3VuZFJlbmRlcik7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgcmV0dXJuIFNlbGVjdDtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gU2VsZWN0O1xuXG4vKioqLyB9KSxcbi8qIDIyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBzdmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgbWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cdHZhciBJbnRlcmZhY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHR2YXIgU3RlcCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHRcblx0dmFyIEludGVyYWN0aW9uID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX193ZWJwYWNrX3JlcXVpcmVfXygxMikpO1xuXHRcblx0LyoqXG5cdCogRGlhbFxuXHQqXG5cdCpcblx0KiBAZGVzY3JpcHRpb24gRGlhbCB3aXRoIHJhZGlhbCBvciBsaW5lYXIgaW50ZXJhY3Rpb24uXG5cdCpcblx0KiBAZGVtbyA8c3BhbiBuZXh1cy11aT1cImRpYWxcIj48L3NwYW4+XG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBkaWFsID0gbmV3IE5leHVzLkRpYWwoJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgZGlhbCA9IG5ldyBOZXh1cy5EaWFsKCcjdGFyZ2V0Jyx7XG5cdCogICAnc2l6ZSc6IFs3NSw3NV0sXG5cdCogICAnaW50ZXJhY3Rpb24nOiAncmFkaWFsJywgLy8gXCJyYWRpYWxcIiwgXCJ2ZXJ0aWNhbFwiLCBvciBcImhvcml6b250YWxcIlxuXHQqICAgJ21vZGUnOiAncmVsYXRpdmUnLCAvLyBcImFic29sdXRlXCIgb3IgXCJyZWxhdGl2ZVwiXG5cdCogICAnbWluJzogMCxcblx0KiAgICdtYXgnOiAxLFxuXHQqICAgJ3N0ZXAnOiAwLFxuXHQqICAgJ3ZhbHVlJzogMFxuXHQqIH0pXG5cdCpcblx0KiBAb3V0cHV0XG5cdCogY2hhbmdlXG5cdCogRmlyZXMgYW55IHRpbWUgdGhlIGludGVyZmFjZSdzIHZhbHVlIGNoYW5nZXMuIDxicj5cblx0KiBUaGUgZXZlbnQgZGF0YSBpcyB0aGUgbnVtYmVyIHZhbHVlIG9mIHRoZSBpbnRlcmZhY2UuXG5cdCpcblx0KiBAb3V0cHV0ZXhhbXBsZVxuXHQqIGRpYWwub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuXHQqICAgY29uc29sZS5sb2codik7XG5cdCogfSlcblx0KlxuXHQqIEB0dXRvcmlhbFxuXHQqIERpYWxcblx0KiB5Z0dNeHFcblx0KlxuXHQqL1xuXHRcblx0dmFyIERpYWwgPSAoZnVuY3Rpb24gKF9JbnRlcmZhY2UpIHtcblx0ICBmdW5jdGlvbiBEaWFsKCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpYWwpO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1wibWluXCIsIFwibWF4XCIsIFwidmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbNzUsIDc1XSxcblx0ICAgICAgaW50ZXJhY3Rpb246IFwicmFkaWFsXCIsIC8vIHJhZGlhbCwgdmVydGljYWwsIGhvcml6b250YWxcblx0ICAgICAgbW9kZTogXCJyZWxhdGl2ZVwiLCAvLyBhYnNvbHV0ZSwgcmVsYXRpdmVcblx0ICAgICAgbWluOiAwLFxuXHQgICAgICBtYXg6IDEsXG5cdCAgICAgIHN0ZXA6IDAsXG5cdCAgICAgIHZhbHVlOiAwXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKERpYWwucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIGFyZ3VtZW50cywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHRcblx0ICAgIHRoaXMuaW50ZXJhY3Rpb24gPSB0aGlzLnNldHRpbmdzLmludGVyYWN0aW9uO1xuXHRcblx0ICAgIHRoaXMuX3ZhbHVlID0gbmV3IFN0ZXAodGhpcy5zZXR0aW5ncy5taW4sIHRoaXMuc2V0dGluZ3MubWF4LCB0aGlzLnNldHRpbmdzLnN0ZXAsIHRoaXMuc2V0dGluZ3MudmFsdWUpO1xuXHRcblx0ICAgIHRoaXMucG9zaXRpb24gPSBuZXcgSW50ZXJhY3Rpb24uSGFuZGxlKHRoaXMuc2V0dGluZ3MubW9kZSwgdGhpcy5pbnRlcmFjdGlvbiwgWzAsIHRoaXMud2lkdGhdLCBbdGhpcy5oZWlnaHQsIDBdKTtcblx0XG5cdCAgICB0aGlzLmluaXQoKTtcblx0XG5cdCAgICB0aGlzLnZhbHVlID0gdGhpcy5fdmFsdWUudmFsdWU7XG5cdFxuXHQgICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG5cdFxuXHQgICAgdGhpcy5wcmV2aW91c0FuZ2xlID0gZmFsc2U7XG5cdFxuXHQgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMudmFsdWUpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKERpYWwsIF9JbnRlcmZhY2UpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoRGlhbCwge1xuXHQgICAgYnVpbGRJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBzdmcuY3JlYXRlKFwiY2lyY2xlXCIpO1xuXHQgICAgICAgIHRoaXMuc2NyZXcgPSBzdmcuY3JlYXRlKFwiY2lyY2xlXCIpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlID0gc3ZnLmNyZWF0ZShcInBhdGhcIik7XG5cdCAgICAgICAgdGhpcy5oYW5kbGUyID0gc3ZnLmNyZWF0ZShcInBhdGhcIik7XG5cdCAgICAgICAgdGhpcy5oYW5kbGVGaWxsID0gc3ZnLmNyZWF0ZShcInBhdGhcIik7XG5cdCAgICAgICAgdGhpcy5oYW5kbGUyRmlsbCA9IHN2Zy5jcmVhdGUoXCJwYXRoXCIpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlTGluZSA9IHN2Zy5jcmVhdGUoXCJwYXRoXCIpO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYWNrZ3JvdW5kKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oYW5kbGUpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhhbmRsZTIpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhhbmRsZUZpbGwpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhhbmRsZTJGaWxsKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oYW5kbGVMaW5lKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zY3Jldyk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzaXplSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLnJlc2l6ZShbMCwgdGhpcy53aWR0aF0sIFt0aGlzLmhlaWdodCwgMF0pO1xuXHRcblx0ICAgICAgICB2YXIgY2VudGVyID0ge1xuXHQgICAgICAgICAgeDogdGhpcy53aWR0aCAvIDIsXG5cdCAgICAgICAgICB5OiB0aGlzLmhlaWdodCAvIDJcblx0ICAgICAgICB9O1xuXHRcblx0ICAgICAgICB2YXIgZGlhbWV0ZXIgPSBNYXRoLm1pbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG5cdFxuXHQgICAgICAgIHRoaXMuYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoXCJjeFwiLCBjZW50ZXIueCk7XG5cdCAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNldEF0dHJpYnV0ZShcImN5XCIsIGNlbnRlci55KTtcblx0ICAgICAgICB0aGlzLmJhY2tncm91bmQuc2V0QXR0cmlidXRlKFwiclwiLCBkaWFtZXRlciAvIDIgLSBkaWFtZXRlciAvIDQwKTtcblx0XG5cdCAgICAgICAgdGhpcy5zY3Jldy5zZXRBdHRyaWJ1dGUoXCJjeFwiLCBjZW50ZXIueCk7XG5cdCAgICAgICAgdGhpcy5zY3Jldy5zZXRBdHRyaWJ1dGUoXCJjeVwiLCBjZW50ZXIueSk7XG5cdCAgICAgICAgdGhpcy5zY3Jldy5zZXRBdHRyaWJ1dGUoXCJyXCIsIGRpYW1ldGVyIC8gMTIpO1xuXHRcblx0ICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuXHRcblx0ICAgICAgICB2YXIgaGFuZGxlUG9pbnRzID0ge1xuXHQgICAgICAgICAgc3RhcnQ6IE1hdGguUEkgKiAxLjUsXG5cdCAgICAgICAgICBlbmQ6IG1hdGguY2xpcChtYXRoLnNjYWxlKHZhbHVlLCAwLCAwLjUsIE1hdGguUEkgKiAxLjUsIE1hdGguUEkgKiAwLjUpLCBNYXRoLlBJICogMC41LCBNYXRoLlBJICogMS41KVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdmFyIGhhbmRsZTJQb2ludHMgPSB7XG5cdCAgICAgICAgICBzdGFydDogTWF0aC5QSSAqIDIuNSxcblx0ICAgICAgICAgIGVuZDogbWF0aC5jbGlwKG1hdGguc2NhbGUodmFsdWUsIDAuNSwgMSwgTWF0aC5QSSAqIDIuNSwgTWF0aC5QSSAqIDEuNSksIE1hdGguUEkgKiAxLjUsIE1hdGguUEkgKiAyLjUpXG5cdCAgICAgICAgfTtcblx0XG5cdCAgICAgICAgdmFyIGhhbmRsZVBhdGggPSBzdmcuYXJjKGNlbnRlci54LCBjZW50ZXIueSwgZGlhbWV0ZXIgLyAyIC0gZGlhbWV0ZXIgLyA0MCwgaGFuZGxlUG9pbnRzLnN0YXJ0LCBoYW5kbGVQb2ludHMuZW5kKTtcblx0ICAgICAgICB2YXIgaGFuZGxlMlBhdGggPSBzdmcuYXJjKGNlbnRlci54LCBjZW50ZXIueSwgZGlhbWV0ZXIgLyAyIC0gZGlhbWV0ZXIgLyA0MCwgaGFuZGxlMlBvaW50cy5zdGFydCwgaGFuZGxlMlBvaW50cy5lbmQpO1xuXHRcblx0ICAgICAgICB0aGlzLmhhbmRsZS5zZXRBdHRyaWJ1dGUoXCJkXCIsIGhhbmRsZVBhdGgpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBkaWFtZXRlciAvIDIwKTtcblx0ICAgICAgICB0aGlzLmhhbmRsZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwibm9uZVwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5oYW5kbGUyLnNldEF0dHJpYnV0ZShcImRcIiwgaGFuZGxlMlBhdGgpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlMi5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgZGlhbWV0ZXIgLyAyMCk7XG5cdCAgICAgICAgdGhpcy5oYW5kbGUyLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJub25lXCIpO1xuXHRcblx0ICAgICAgICBoYW5kbGVQYXRoICs9IFwiIEwgXCIgKyBjZW50ZXIueCArIFwiIFwiICsgY2VudGVyLnk7XG5cdFxuXHQgICAgICAgIHRoaXMuaGFuZGxlRmlsbC5zZXRBdHRyaWJ1dGUoXCJkXCIsIGhhbmRsZVBhdGgpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlRmlsbC5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgXCIwLjNcIik7XG5cdFxuXHQgICAgICAgIGhhbmRsZTJQYXRoICs9IFwiIEwgXCIgKyBjZW50ZXIueCArIFwiIFwiICsgY2VudGVyLnk7XG5cdFxuXHQgICAgICAgIHRoaXMuaGFuZGxlMkZpbGwuc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGUyUGF0aCk7XG5cdCAgICAgICAgdGhpcy5oYW5kbGUyRmlsbC5zZXRBdHRyaWJ1dGUoXCJmaWxsLW9wYWNpdHlcIiwgXCIwLjNcIik7XG5cdFxuXHQgICAgICAgIHZhciBhcmNFbmRpbmdBID0gdW5kZWZpbmVkO1xuXHQgICAgICAgIGlmICh2YWx1ZSA8IDAuNSkge1xuXHQgICAgICAgICAgYXJjRW5kaW5nQSA9IGhhbmRsZVBvaW50cy5lbmQ7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIGFyY0VuZGluZ0EgPSBoYW5kbGUyUG9pbnRzLmVuZDtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHZhciBhcmNFbmRpbmdYID0gY2VudGVyLnggKyBNYXRoLmNvcyhhcmNFbmRpbmdBKSAqIChkaWFtZXRlciAvIDIpO1xuXHQgICAgICAgIHZhciBhcmNFbmRpbmdZID0gY2VudGVyLnkgKyBNYXRoLnNpbihhcmNFbmRpbmdBKSAqIChkaWFtZXRlciAvIDIpICogLTE7XG5cdFxuXHQgICAgICAgIHRoaXMuaGFuZGxlTGluZS5zZXRBdHRyaWJ1dGUoXCJkXCIsIFwiTSBcIiArIGNlbnRlci54ICsgXCIgXCIgKyBjZW50ZXIueSArIFwiIEwgXCIgKyBhcmNFbmRpbmdYICsgXCIgXCIgKyBhcmNFbmRpbmdZKTtcblx0ICAgICAgICB0aGlzLmhhbmRsZUxpbmUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIGRpYW1ldGVyIC8gMjApO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29sb3JJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbG9ySW50ZXJmYWNlKCkge1xuXHQgICAgICAgIHRoaXMuYmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmZpbGwpO1xuXHQgICAgICAgIHRoaXMuc2NyZXcuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlMi5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMuYWNjZW50KTtcblx0ICAgICAgICB0aGlzLmhhbmRsZUZpbGwuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlMkZpbGwuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgIHRoaXMuaGFuZGxlTGluZS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMuYWNjZW50KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbmRlcjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG5cdFxuXHQgICAgICAgIHZhciBjZW50ZXIgPSB7XG5cdCAgICAgICAgICB4OiB0aGlzLndpZHRoIC8gMixcblx0ICAgICAgICAgIHk6IHRoaXMuaGVpZ2h0IC8gMlxuXHQgICAgICAgIH07XG5cdFxuXHQgICAgICAgIHZhciBkaWFtZXRlciA9IE1hdGgubWluKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0XG5cdCAgICAgICAgdmFyIGhhbmRsZVBvaW50cyA9IHtcblx0ICAgICAgICAgIHN0YXJ0OiBNYXRoLlBJICogMS41LFxuXHQgICAgICAgICAgZW5kOiBtYXRoLmNsaXAobWF0aC5zY2FsZSh2YWx1ZSwgMCwgMC41LCBNYXRoLlBJICogMS41LCBNYXRoLlBJICogMC41KSwgTWF0aC5QSSAqIDAuNSwgTWF0aC5QSSAqIDEuNSlcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHZhciBoYW5kbGUyUG9pbnRzID0ge1xuXHQgICAgICAgICAgc3RhcnQ6IE1hdGguUEkgKiAyLjUsXG5cdCAgICAgICAgICBlbmQ6IG1hdGguY2xpcChtYXRoLnNjYWxlKHZhbHVlLCAwLjUsIDEsIE1hdGguUEkgKiAyLjUsIE1hdGguUEkgKiAxLjUpLCBNYXRoLlBJICogMS41LCBNYXRoLlBJICogMi41KVxuXHQgICAgICAgIH07XG5cdFxuXHQgICAgICAgIHZhciBoYW5kbGVQYXRoID0gc3ZnLmFyYyhjZW50ZXIueCwgY2VudGVyLnksIGRpYW1ldGVyIC8gMiAtIGRpYW1ldGVyIC8gNDAsIGhhbmRsZVBvaW50cy5zdGFydCwgaGFuZGxlUG9pbnRzLmVuZCk7XG5cdCAgICAgICAgdmFyIGhhbmRsZTJQYXRoID0gc3ZnLmFyYyhjZW50ZXIueCwgY2VudGVyLnksIGRpYW1ldGVyIC8gMiAtIGRpYW1ldGVyIC8gNDAsIGhhbmRsZTJQb2ludHMuc3RhcnQsIGhhbmRsZTJQb2ludHMuZW5kKTtcblx0XG5cdCAgICAgICAgdGhpcy5oYW5kbGUuc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGVQYXRoKTtcblx0ICAgICAgICB0aGlzLmhhbmRsZTIuc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGUyUGF0aCk7XG5cdFxuXHQgICAgICAgIGhhbmRsZVBhdGggKz0gXCIgTCBcIiArIGNlbnRlci54ICsgXCIgXCIgKyBjZW50ZXIueTtcblx0XG5cdCAgICAgICAgdGhpcy5oYW5kbGVGaWxsLnNldEF0dHJpYnV0ZShcImRcIiwgaGFuZGxlUGF0aCk7XG5cdFxuXHQgICAgICAgIGhhbmRsZTJQYXRoICs9IFwiIEwgXCIgKyBjZW50ZXIueCArIFwiIFwiICsgY2VudGVyLnk7XG5cdFxuXHQgICAgICAgIHRoaXMuaGFuZGxlMkZpbGwuc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGUyUGF0aCk7XG5cdFxuXHQgICAgICAgIHZhciBhcmNFbmRpbmdBID0gdW5kZWZpbmVkO1xuXHQgICAgICAgIGlmICh2YWx1ZSA8PSAwLjUpIHtcblx0ICAgICAgICAgIGFyY0VuZGluZ0EgPSBoYW5kbGVQb2ludHMuZW5kO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBhcmNFbmRpbmdBID0gaGFuZGxlMlBvaW50cy5lbmQ7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB2YXIgYXJjRW5kaW5nWCA9IGNlbnRlci54ICsgTWF0aC5jb3MoYXJjRW5kaW5nQSkgKiAoZGlhbWV0ZXIgLyAyKTtcblx0ICAgICAgICB2YXIgYXJjRW5kaW5nWSA9IGNlbnRlci55ICsgTWF0aC5zaW4oYXJjRW5kaW5nQSkgKiAoZGlhbWV0ZXIgLyAyKSAqIC0xO1xuXHRcblx0ICAgICAgICB0aGlzLmhhbmRsZUxpbmUuc2V0QXR0cmlidXRlKFwiZFwiLCBcIk0gXCIgKyBjZW50ZXIueCArIFwiIFwiICsgY2VudGVyLnkgKyBcIiBMIFwiICsgYXJjRW5kaW5nWCArIFwiIFwiICsgYXJjRW5kaW5nWSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGljazoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2soKSB7XG5cdCAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJyZWxhdGl2ZVwiKSB7XG5cdCAgICAgICAgICB0aGlzLnByZXZpb3VzQW5nbGUgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi5hbmNob3IgPSB0aGlzLm1vdXNlO1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24udmFsdWUgPSB0aGlzLl92YWx1ZS5ub3JtYWxpemVkO1xuXHQgICAgICAgIHRoaXMubW92ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbW92ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZSgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jbGlja2VkKSB7XG5cdFxuXHQgICAgICAgICAgdGhpcy5wb3NpdGlvbi51cGRhdGUodGhpcy5tb3VzZSk7XG5cdFxuXHQgICAgICAgICAgdmFyIGFuZ2xlID0gdGhpcy5wb3NpdGlvbi52YWx1ZSAqIE1hdGguUEkgKiAyO1xuXHRcblx0ICAgICAgICAgIGlmIChhbmdsZSA8IDApIHtcblx0ICAgICAgICAgICAgYW5nbGUgKz0gTWF0aC5QSSAqIDI7XG5cdCAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gXCJyZWxhdGl2ZVwiKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzQW5nbGUgIT09IGZhbHNlICYmIE1hdGguYWJzKHRoaXMucHJldmlvdXNBbmdsZSAtIGFuZ2xlKSA+IDIpIHtcblx0ICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FuZ2xlID4gMykge1xuXHQgICAgICAgICAgICAgICAgYW5nbGUgPSBNYXRoLlBJICogMjtcblx0ICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYW5nbGUgPSAwO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfSAvKiBlbHNlIHtcblx0ICAgICAgICAgICAgaWYgKHRoaXMucHJldmlvdXNBbmdsZSAhPT0gZmFsc2UgJiYgTWF0aC5hYnModGhpcy5wcmV2aW91c0FuZ2xlIC0gYW5nbGUpID4gMikge1xuXHQgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzQW5nbGUgPiAzKSB7XG5cdCAgICAgICAgICAgICAgICBhbmdsZSA9IE1hdGguUEkqMjtcblx0ICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgYW5nbGUgPSAwO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9ICovXG5cdCAgICAgICAgICB0aGlzLnByZXZpb3VzQW5nbGUgPSBhbmdsZTtcblx0XG5cdCAgICAgICAgICB2YXIgcmVhbFZhbHVlID0gYW5nbGUgLyAoTWF0aC5QSSAqIDIpO1xuXHRcblx0ICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl92YWx1ZS51cGRhdGVOb3JtYWwocmVhbFZhbHVlKTtcblx0XG5cdCAgICAgICAgICBpZiAodGhpcy5tb2RlID09PSBcInJlbGF0aXZlXCIpIHtcblx0ICAgICAgICAgICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHJlYWxWYWx1ZTtcblx0ICAgICAgICAgIH1cblx0XG5cdCAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwgdGhpcy5fdmFsdWUudmFsdWUpO1xuXHRcblx0ICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVsZWFzZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVsZWFzZSgpIHt9XG5cdCAgICB9LFxuXHQgICAgdmFsdWU6IHtcblx0XG5cdCAgICAgIC8qXG5cdCAgICAgIERpYWwncyB2YWx1ZS4gV2hlbiBzZXQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBhZGp1c3QgdG8gZml0IG1pbi9tYXgvc3RlcCBzZXR0aW5ncyBvZiB0aGUgaW50ZXJmYWNlLlxuXHQgICAgICBAdHlwZSB7bnVtYmVyfVxuXHQgICAgICBAZXhhbXBsZSBkaWFsLnZhbHVlID0gMTA7XG5cdCAgICAgICBnZXQgdmFsdWUoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLnZhbHVlO1xuXHQgICAgICB9XG5cdCAgICAgICBzZXQgdmFsdWUodmFsdWUpIHtcblx0ICAgICAgICB0aGlzLl92YWx1ZS51cGRhdGUodmFsdWUpO1xuXHQgICAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJyx0aGlzLnZhbHVlKTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICAgICovXG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgRGlhbCdzIHZhbHVlLiBXaGVuIHNldCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkanVzdCB0byBmaXQgbWluL21heC9zdGVwIHNldHRpbmdzIG9mIHRoZSBpbnRlcmZhY2UuXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgIEBleGFtcGxlIGRpYWwudmFsdWUgPSAxMDtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS52YWx1ZTtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3ZhbHVlLnVwZGF0ZSh2KTtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLnZhbHVlID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwgdGhpcy5fdmFsdWUudmFsdWUpO1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtaW46IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBMb3dlciBsaW1pdCBvZiB0aGUgZGlhbCdzIG91dHB1dCByYW5nZVxuXHQgICAgICBAdHlwZSB7bnVtYmVyfVxuXHQgICAgICBAZXhhbXBsZSBkaWFsLm1pbiA9IDEwMDA7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUubWluO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUubWluID0gdjtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1heDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFVwcGVyIGxpbWl0IG9mIHRoZSBkaWFsJ3Mgb3V0cHV0IHJhbmdlXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgIEBleGFtcGxlIGRpYWwubWF4ID0gMTAwMDtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZS5tYXg7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcblx0ICAgICAgICB0aGlzLl92YWx1ZS5tYXggPSB2O1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc3RlcDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFRoZSBpbmNyZW1lbnQgdGhhdCB0aGUgZGlhbCdzIHZhbHVlIGNoYW5nZXMgYnkuXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgIEBleGFtcGxlIGRpYWwuc3RlcCA9IDU7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUuc3RlcDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3ZhbHVlLnN0ZXAgPSB2O1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbW9kZToge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIEFic29sdXRlIG1vZGUgKGRpYWwncyB2YWx1ZSBqdW1wcyB0byBtb3VzZSBjbGljayBwb3NpdGlvbikgb3IgcmVsYXRpdmUgbW9kZSAobW91c2UgZHJhZyBjaGFuZ2VzIHZhbHVlIHJlbGF0aXZlIHRvIGl0cyBjdXJyZW50IHBvc2l0aW9uKS4gRGVmYXVsdDogXCJyZWxhdGl2ZVwiLlxuXHQgICAgICBAdHlwZSB7c3RyaW5nfVxuXHQgICAgICBAZXhhbXBsZSBkaWFsLm1vZGUgPSBcInJlbGF0aXZlXCI7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbi5tb2RlO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi5tb2RlID0gdjtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG5vcm1hbGl6ZWQ6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBOb3JtYWxpemVkIHZhbHVlIG9mIHRoZSBkaWFsLlxuXHQgICAgICBAdHlwZSB7bnVtYmVyfVxuXHQgICAgICBAZXhhbXBsZSBkaWFsLm5vcm1hbGl6ZWQgPSAwLjU7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3ZhbHVlLnVwZGF0ZU5vcm1hbCh2KTtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwgdGhpcy52YWx1ZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgcmV0dXJuIERpYWw7XG5cdH0pKEludGVyZmFjZSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IERpYWw7XG5cbi8qKiovIH0pLFxuLyogMjMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBzdmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgSW50ZXJmYWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0dmFyIEJ1dHRvblRlbXBsYXRlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7XG5cdHZhciB0b3VjaCA9IF9fd2VicGFja19yZXF1aXJlX18oOSk7XG5cdFxuXHR2YXIgUGlhbm9LZXkgPSAoZnVuY3Rpb24gKF9CdXR0b25UZW1wbGF0ZSkge1xuXHQgIGZ1bmN0aW9uIFBpYW5vS2V5KCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBpYW5vS2V5KTtcblx0XG5cdCAgICB2YXIgb3B0aW9ucyA9IFtcInZhbHVlXCIsIFwibm90ZVwiLCBcImNvbG9yXCJdO1xuXHRcblx0ICAgIHZhciBkZWZhdWx0cyA9IHtcblx0ICAgICAgc2l6ZTogWzgwLCA4MF0sXG5cdCAgICAgIHRhcmdldDogZmFsc2UsXG5cdCAgICAgIG1vZGU6IFwiYnV0dG9uXCIsXG5cdCAgICAgIHZhbHVlOiAwXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFBpYW5vS2V5LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLm5vdGUgPSB0aGlzLnNldHRpbmdzLm5vdGU7XG5cdCAgICB0aGlzLmNvbG9yID0gdGhpcy5zZXR0aW5ncy5jb2xvcjtcblx0XG5cdCAgICB0aGlzLmNvbG9ycyA9IHtcblx0ICAgICAgdzogXCIjZmZmXCIsXG5cdCAgICAgIGI6IFwiIzY2NlwiIH07XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgICB0aGlzLnJlbmRlcigpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKFBpYW5vS2V5LCBfQnV0dG9uVGVtcGxhdGUpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoUGlhbm9LZXksIHtcblx0ICAgIGJ1aWxkRnJhbWU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkRnJhbWUoKSB7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50ID0gc3ZnLmNyZWF0ZShcInN2Z1wiKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgdGhpcy53aWR0aCk7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCB0aGlzLmhlaWdodCk7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGJ1aWxkSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEludGVyZmFjZSgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICB0aGlzLnBhZCA9IHN2Zy5jcmVhdGUoXCJyZWN0XCIpO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5wYWQpO1xuXHRcblx0ICAgICAgICB0aGlzLmludGVyYWN0aW9uVGFyZ2V0ID0gdGhpcy5wYWQ7XG5cdFxuXHQgICAgICAgIC8qIGV2ZW50cyAqL1xuXHRcblx0ICAgICAgICBpZiAoIXRvdWNoLmV4aXN0cykge1xuXHRcblx0ICAgICAgICAgIHRoaXMuY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZygnY2xpY2snKTtcblx0ICAgICAgICAgICAgX3RoaXMucGlhbm8uaW50ZXJhY3RpbmcgPSB0cnVlO1xuXHQgICAgICAgICAgICBfdGhpcy5waWFuby5wYWludGJydXNoID0gIV90aGlzLnN0YXRlO1xuXHQgICAgICAgICAgICBfdGhpcy5kb3duKF90aGlzLnBpYW5vLnBhaW50YnJ1c2gpO1xuXHQgICAgICAgICAgfTtcblx0XG5cdCAgICAgICAgICB0aGlzLnBhZC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKF90aGlzLnBpYW5vLmludGVyYWN0aW5nKSB7XG5cdCAgICAgICAgICAgICAgLy8gICAgY29uc29sZS5sb2coJ21vdXNlb3ZlcicpO1xuXHQgICAgICAgICAgICAgIF90aGlzLmRvd24oX3RoaXMucGlhbm8ucGFpbnRicnVzaCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0pO1xuXHRcblx0ICAgICAgICAgIHRoaXMubW92ZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKF90aGlzLnBpYW5vLmludGVyYWN0aW5nKSB7XG5cdCAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCdtb3ZlJyk7XG5cdCAgICAgICAgICAgICAgX3RoaXMuYmVuZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9O1xuXHRcblx0ICAgICAgICAgIHRoaXMucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgX3RoaXMucGlhbm8uaW50ZXJhY3RpbmcgPSBmYWxzZTtcblx0ICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKCdyZWxlYXNlJyk7XG5cdCAgICAgICAgICAgIC8vICB0aGlzLnVwKCk7XG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgICAgdGhpcy5wYWQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBpZiAoX3RoaXMucGlhbm8uaW50ZXJhY3RpbmcpIHtcblx0ICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coJ21vdXNldXAnKTtcblx0ICAgICAgICAgICAgICBfdGhpcy51cCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICAgIHRoaXMucGFkLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGlmIChfdGhpcy5waWFuby5pbnRlcmFjdGluZykge1xuXHQgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZygnbW91c2VvdXQnKTtcblx0ICAgICAgICAgICAgICBfdGhpcy51cCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzaXplSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICAvL2xldCByYWRpdXMgPSBNYXRoLm1pbih0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSAvIDU7XG5cdCAgICAgICAgdmFyIHJhZGl1cyA9IDA7XG5cdFxuXHQgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcInhcIiwgMC41KTtcblx0ICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIDAuNSk7XG5cdCAgICAgICAgaWYgKHRoaXMud2lkdGggPiAyKSB7XG5cdCAgICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB0aGlzLndpZHRoIC0gMSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHRoaXMud2lkdGgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodGhpcy5oZWlnaHQgPiAyKSB7XG5cdCAgICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgdGhpcy5oZWlnaHQpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgdGhpcy5oZWlnaHQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJyeFwiLCByYWRpdXMpO1xuXHQgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcInJ5XCIsIHJhZGl1cyk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICByZW5kZXI6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgICBpZiAoIXRoaXMuc3RhdGUpIHtcblx0ICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnNbdGhpcy5jb2xvcl0pO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBQaWFub0tleTtcblx0fSkoQnV0dG9uVGVtcGxhdGUpO1xuXHRcblx0LyoqXG5cdCogUGlhbm9cblx0KlxuXHQqIEBkZXNjcmlwdGlvbiBQaWFubyBrZXlib2FyZCBpbnRlcmZhY2Vcblx0KlxuXHQqIEBkZW1vIDxkaXYgbmV4dXMtdWk9XCJwaWFub1wiPjwvZGl2PlxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgcGlhbm8gPSBuZXcgTmV4dXMuUGlhbm8oJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgcGlhbm8gPSBuZXcgTmV4dXMuUGlhbm8oJyN0YXJnZXQnLHtcblx0KiAgICAgJ3NpemUnOiBbNTAwLDEyNV0sXG5cdCogICAgICdtb2RlJzogJ2J1dHRvbicsICAvLyAnYnV0dG9uJywgJ3RvZ2dsZScsIG9yICdpbXB1bHNlJ1xuXHQqICAgICAnbG93Tm90ZSc6IDI0LFxuXHQqICAgICAnaGlnaE5vdGUnOiA2MFxuXHQqIH0pXG5cdCpcblx0KiBAb3V0cHV0XG5cdCogY2hhbmdlXG5cdCogRmlyZXMgYW55IHRpbWUgYSBuZXcga2V5IGlzIHByZXNzZWQgb3IgcmVsZWFzZWQgPGJyPlxuXHQqIFRoZSBldmVudCBkYXRhIGlzIGFuIG9iamVjdCBjb250YWluaW5nIDxpPm5vdGU8L2k+IGFuZCA8aT5zdGF0ZTwvaT4gcHJvcGVydGllcy5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogcGlhbm8ub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuXHQqICAgY29uc29sZS5sb2codik7XG5cdCogfSlcblx0KlxuXHQqL1xuXHRcblx0dmFyIFBpYW5vID0gKGZ1bmN0aW9uIChfSW50ZXJmYWNlKSB7XG5cdCAgZnVuY3Rpb24gUGlhbm8oKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGlhbm8pO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1widmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbNTAwLCAxMjVdLFxuXHQgICAgICBsb3dOb3RlOiAyNCxcblx0ICAgICAgaGlnaE5vdGU6IDYwLFxuXHQgICAgICBtb2RlOiBcImJ1dHRvblwiXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFBpYW5vLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLmtleVBhdHRlcm4gPSBbXCJ3XCIsIFwiYlwiLCBcIndcIiwgXCJiXCIsIFwid1wiLCBcIndcIiwgXCJiXCIsIFwid1wiLCBcImJcIiwgXCJ3XCIsIFwiYlwiLCBcIndcIl07XG5cdFxuXHQgICAgdGhpcy5wYWludGJydXNoID0gZmFsc2U7XG5cdFxuXHQgICAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5tb2RlO1xuXHRcblx0ICAgIHRoaXMucmFuZ2UgPSB7XG5cdCAgICAgIGxvdzogdGhpcy5zZXR0aW5ncy5sb3dOb3RlLFxuXHQgICAgICBoaWdoOiB0aGlzLnNldHRpbmdzLmhpZ2hOb3RlXG5cdCAgICB9O1xuXHRcblx0ICAgIHRoaXMucmFuZ2Uuc2l6ZSA9IHRoaXMucmFuZ2UuaGlnaCAtIHRoaXMucmFuZ2UubG93O1xuXHRcblx0ICAgIHRoaXMua2V5cyA9IFtdO1xuXHRcblx0ICAgIHRoaXMudG9nZ2xlVG8gPSBmYWxzZTtcblx0XG5cdCAgICB0aGlzLmluaXQoKTtcblx0ICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoUGlhbm8sIF9JbnRlcmZhY2UpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoUGlhbm8sIHtcblx0ICAgIGJ1aWxkRnJhbWU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkRnJhbWUoKSB7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJvcmRlclJhZGl1cyA9IFwiMHB4XCI7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9IFwiMTAwJVwiO1xuXHQgICAgICAgIHRoaXMucGFyZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMua2V5cyA9IFtdO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2UuaGlnaCAtIHRoaXMucmFuZ2UubG93OyBpKyspIHtcblx0XG5cdCAgICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdCAgICAgICAgICB2YXIgc2NhbGVJbmRleCA9IChpICsgdGhpcy5yYW5nZS5sb3cpICUgdGhpcy5rZXlQYXR0ZXJuLmxlbmd0aDtcblx0XG5cdCAgICAgICAgICB2YXIga2V5ID0gbmV3IFBpYW5vS2V5KGNvbnRhaW5lciwge1xuXHQgICAgICAgICAgICBjb21wb25lbnQ6IHRydWUsXG5cdCAgICAgICAgICAgIG5vdGU6IGkgKyB0aGlzLnJhbmdlLmxvdyxcblx0ICAgICAgICAgICAgY29sb3I6IHRoaXMua2V5UGF0dGVybltzY2FsZUluZGV4XSxcblx0ICAgICAgICAgICAgbW9kZTogdGhpcy5tb2RlXG5cdCAgICAgICAgICB9LCB0aGlzLmtleUNoYW5nZS5iaW5kKHRoaXMsIGkgKyB0aGlzLnJhbmdlLmxvdykpO1xuXHRcblx0ICAgICAgICAgIGtleS5waWFubyA9IHRoaXM7XG5cdFxuXHQgICAgICAgICAgaWYgKHRvdWNoLmV4aXN0cykge1xuXHQgICAgICAgICAgICBrZXkucGFkLmluZGV4ID0gaTtcblx0ICAgICAgICAgICAga2V5LnByZUNsaWNrID0ga2V5LnByZU1vdmUgPSBrZXkucHJlUmVsZWFzZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgICAgICBrZXkuY2xpY2sgPSBrZXkubW92ZSA9IGtleS5yZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgICAgIGtleS5wcmVUb3VjaCA9IGtleS5wcmVUb3VjaE1vdmUgPSBrZXkucHJlVG91Y2hSZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgICAgIGtleS50b3VjaCA9IGtleS50b3VjaE1vdmUgPSBrZXkudG91Y2hSZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgdGhpcy5rZXlzLnB1c2goa2V5KTtcblx0ICAgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAodG91Y2guZXhpc3RzKSB7XG5cdCAgICAgICAgICB0aGlzLmFkZFRvdWNoTGlzdGVuZXJzKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2l6ZUludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2l6ZUludGVyZmFjZSgpIHtcblx0XG5cdCAgICAgICAgdmFyIGtleVggPSAwO1xuXHRcblx0ICAgICAgICB2YXIga2V5UG9zaXRpb25zID0gW107XG5cdFxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYW5nZS5oaWdoIC0gdGhpcy5yYW5nZS5sb3c7IGkrKykge1xuXHRcblx0ICAgICAgICAgIGtleVBvc2l0aW9ucy5wdXNoKGtleVgpO1xuXHRcblx0ICAgICAgICAgIHZhciBzY2FsZUluZGV4ID0gKGkgKyB0aGlzLnJhbmdlLmxvdykgJSB0aGlzLmtleVBhdHRlcm4ubGVuZ3RoO1xuXHQgICAgICAgICAgdmFyIG5leHRTY2FsZUluZGV4ID0gKGkgKyAxICsgdGhpcy5yYW5nZS5sb3cpICUgdGhpcy5rZXlQYXR0ZXJuLmxlbmd0aDtcblx0ICAgICAgICAgIGlmIChpICsgMSArIHRoaXMucmFuZ2UubG93ID49IHRoaXMucmFuZ2UuaGlnaCkge1xuXHQgICAgICAgICAgICBrZXlYICs9IDE7XG5cdCAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMua2V5UGF0dGVybltzY2FsZUluZGV4XSA9PT0gXCJ3XCIgJiYgdGhpcy5rZXlQYXR0ZXJuW25leHRTY2FsZUluZGV4XSA9PT0gXCJ3XCIpIHtcblx0ICAgICAgICAgICAga2V5WCArPSAxO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAga2V5WCArPSAwLjU7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBrZXlzV2lkZSA9IGtleVg7XG5cdFxuXHQgICAgICAgIC8vICBsZXQgcGFkZGluZyA9IHRoaXMud2lkdGggLyAxMjA7XG5cdCAgICAgICAgdmFyIHBhZGRpbmcgPSAxO1xuXHQgICAgICAgIHZhciBidXR0b25XaWR0aCA9ICh0aGlzLndpZHRoIC0gcGFkZGluZyAqIDIpIC8ga2V5c1dpZGU7XG5cdCAgICAgICAgdmFyIGJ1dHRvbkhlaWdodCA9ICh0aGlzLmhlaWdodCAtIHBhZGRpbmcgKiAyKSAvIDI7XG5cdFxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFxuXHQgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMua2V5c1tpXS5wYXJlbnQ7XG5cdCAgICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdCAgICAgICAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IGtleVBvc2l0aW9uc1tpXSAqIGJ1dHRvbldpZHRoICsgcGFkZGluZyArIFwicHhcIjtcblx0ICAgICAgICAgIGlmICh0aGlzLmtleXNbaV0uY29sb3IgPT09IFwid1wiKSB7XG5cdCAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50b3AgPSBwYWRkaW5nICsgXCJweFwiO1xuXHQgICAgICAgICAgICB0aGlzLmtleXNbaV0ucmVzaXplKGJ1dHRvbldpZHRoLCBidXR0b25IZWlnaHQgKiAyKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS56SW5kZXggPSAxO1xuXHQgICAgICAgICAgICBjb250YWluZXIuc3R5bGUudG9wID0gcGFkZGluZyArIFwicHhcIjtcblx0ICAgICAgICAgICAgdGhpcy5rZXlzW2ldLnJlc2l6ZShidXR0b25XaWR0aCwgYnV0dG9uSGVpZ2h0ICogMS4xKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjb2xvckludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY29sb3JJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIC8vIFBpYW5vIGtleXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIHN0cm9rZSBib3JkZXJcblx0ICAgICAgICAvLyBUaGV5IGhhdmUgc3BhY2UgYmV0d2VlbiB0aGVtLCB3aGljaCBzaG93cyB0aGUgUGlhbm8gYmcgY29sb3Jcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQ7XG5cdFxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5rZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICB0aGlzLmtleXNbaV0uY29sb3JzID0ge1xuXHQgICAgICAgICAgICB3OiB0aGlzLmNvbG9ycy5saWdodCxcblx0ICAgICAgICAgICAgYjogdGhpcy5jb2xvcnMuZGFyayxcblx0ICAgICAgICAgICAgYWNjZW50OiB0aGlzLmNvbG9ycy5hY2NlbnQsXG5cdCAgICAgICAgICAgIGJvcmRlcjogdGhpcy5jb2xvcnMubWVkaXVtTGlnaHRcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgICB0aGlzLmtleXNbaV0uY29sb3JJbnRlcmZhY2UoKTtcblx0ICAgICAgICAgIHRoaXMua2V5c1tpXS5yZW5kZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBrZXlDaGFuZ2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGtleUNoYW5nZShub3RlLCBvbikge1xuXHQgICAgICAgIC8vIGVtaXQgZGF0YSBmb3IgYW55IGtleSB0dXJuaW5nIG9uL29mZlxuXHQgICAgICAgIC8vIFwibm90ZVwiIGlzIHRoZSBub3RlIHZhbHVlXG5cdCAgICAgICAgLy8gXCJvblwiIGlzIGEgYm9vbGVhbiB3aGV0aGVyIGl0IGlzIG9uIG9yIG9mZlxuXHQgICAgICAgIC8vIGluIGFmdGVydG91Y2ggbW9kZSwgXCJvbjogaXMgYW4gb2JqZWN0IHdpdGggc3RhdGUveC95IHByb3BlcnRpZXNcblx0ICAgICAgICB2YXIgZGF0YSA9IHtcblx0ICAgICAgICAgIG5vdGU6IG5vdGVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGlmICh0eXBlb2Ygb24gPT09IFwib2JqZWN0XCIpIHtcblx0ICAgICAgICAgIGRhdGEuc3RhdGUgPSBvbi5zdGF0ZTtcblx0ICAgICAgICAgIC8vICBkYXRhLnggPSBvbi54XG5cdCAgICAgICAgICAvLyAgZGF0YS55ID0gb24ueVxuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICBkYXRhLnN0YXRlID0gb247XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCBkYXRhKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbmRlcjoge1xuXHRcblx0ICAgICAgLyogZHJhZyhub3RlLG9uKSB7XG5cdCAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLHtcblx0ICAgICAgICAgIG5vdGU6IG5vdGUsXG5cdCAgICAgICAgICBzdGF0ZTogb25cblx0ICAgICAgICB9KTtcblx0ICAgICAgfSAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHt9XG5cdCAgICB9LFxuXHQgICAgYWRkVG91Y2hMaXN0ZW5lcnM6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRvdWNoTGlzdGVuZXJzKCkge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICAgIHRoaXMucHJlQ2xpY2sgPSB0aGlzLnByZU1vdmUgPSB0aGlzLnByZVJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7fTtcblx0ICAgICAgICB0aGlzLmNsaWNrID0gdGhpcy5tb3ZlID0gdGhpcy5yZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgdGhpcy5wcmVUb3VjaCA9IHRoaXMucHJlVG91Y2hNb3ZlID0gdGhpcy5wcmVUb3VjaFJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7fTtcblx0ICAgICAgICB0aGlzLnRvdWNoID0gdGhpcy50b3VjaE1vdmUgPSB0aGlzLnRvdWNoUmVsZWFzZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHRcblx0ICAgICAgICB0aGlzLmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hzdGFydFwiLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgY29uc29sZS5sb2coXCJ0b3VjaHN0YXJ0XCIpO1xuXHQgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYLCBlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WSk7XG5cdCAgICAgICAgICB2YXIga2V5ID0gX3RoaXMua2V5c1tlbGVtZW50LmluZGV4XTtcblx0ICAgICAgICAgIF90aGlzLnBhaW50YnJ1c2ggPSAha2V5LnN0YXRlO1xuXHQgICAgICAgICAga2V5LmRvd24oX3RoaXMucGFpbnRicnVzaCk7XG5cdCAgICAgICAgICBfdGhpcy5jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQuaW5kZXg7XG5cdCAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgIH0pO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYLCBlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WSk7XG5cdCAgICAgICAgICB2YXIga2V5ID0gX3RoaXMua2V5c1tlbGVtZW50LmluZGV4XTtcblx0ICAgICAgICAgIGlmIChlbGVtZW50LmluZGV4ICE9PSBfdGhpcy5jdXJyZW50RWxlbWVudCkge1xuXHQgICAgICAgICAgICBpZiAoX3RoaXMuY3VycmVudEVsZW1lbnQpIHtcblx0ICAgICAgICAgICAgICB2YXIgcGFzdEtleSA9IF90aGlzLmtleXNbX3RoaXMuY3VycmVudEVsZW1lbnRdO1xuXHQgICAgICAgICAgICAgIHBhc3RLZXkudXAoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBrZXkuZG93bihfdGhpcy5wYWludGJydXNoKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGtleS5iZW5kKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBfdGhpcy5jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQuaW5kZXg7XG5cdCAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgIH0pO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICAvLyBubyB0b3VjaGVzIHRvIGNhbGN1bGF0ZSBiZWNhdXNlIG5vbmUgcmVtYWluaW5nXG5cdCAgICAgICAgICB2YXIga2V5ID0gX3RoaXMua2V5c1tfdGhpcy5jdXJyZW50RWxlbWVudF07XG5cdCAgICAgICAgICBrZXkudXAoKTtcblx0ICAgICAgICAgIF90aGlzLmludGVyYWN0aW5nID0gZmFsc2U7XG5cdCAgICAgICAgICBfdGhpcy5jdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuXHQgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNldFJhbmdlOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgRGVmaW5lIHRoZSBwaXRjaCByYW5nZSAobG93ZXN0IGFuZCBoaWdoZXN0IG5vdGUpIG9mIHRoZSBwaWFubyBrZXlib2FyZC5cblx0ICAgICAgQHBhcmFtIGxvdyB7bnVtYmVyfSBNSURJIG5vdGUgdmFsdWUgb2YgdGhlIGxvd2VzdCBub3RlIG9uIHRoZSBrZXlib2FyZFxuXHQgICAgICBAcGFyYW0gaGlnaCB7bnVtYmVyfSBNSURJIG5vdGUgdmFsdWUgb2YgdGhlIGhpZ2hlc3Qgbm90ZSBvbiB0aGUga2V5Ym9hcmRcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSYW5nZShsb3csIGhpZ2gpIHtcblx0ICAgICAgICB0aGlzLnJhbmdlLmxvdyA9IGxvdztcblx0ICAgICAgICB0aGlzLnJhbmdlLmhpZ2ggPSBoaWdoO1xuXHQgICAgICAgIHRoaXMuZW1wdHkoKTtcblx0ICAgICAgICB0aGlzLmJ1aWxkSW50ZXJmYWNlKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB0b2dnbGVLZXk6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBUdXJuIGEga2V5IG9uIG9yIG9mZiB1c2luZyBpdHMgTUlESSBub3RlIHZhbHVlO1xuXHQgICAgICBAcGFyYW0gbm90ZSB7bnVtYmVyfSBNSURJIG5vdGUgdmFsdWUgb2YgdGhlIGtleSB0byBjaGFuZ2Vcblx0ICAgICAgQHBhcmFtIG9uIHtib29sZWFufSBXaGV0aGVyIHRoZSBub3RlIHNob3VsZCB0dXJuIG9uIG9yIG9mZlxuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRvZ2dsZUtleShub3RlLCBvbikge1xuXHQgICAgICAgIHRoaXMua2V5c1tub3RlIC0gdGhpcy5yYW5nZS5sb3ddLmZsaXAob24pO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdG9nZ2xlSW5kZXg6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBUdXJuIGEga2V5IG9uIG9yIG9mZiB1c2luZyBpdHMga2V5IGluZGV4IG9uIHRoZSBwaWFubyBpbnRlcmZhY2UuXG5cdCAgICAgIEBwYXJhbSBpbmRleCB7bnVtYmVyfSBJbmRleCBvZiB0aGUga2V5IHRvIGNoYW5nZVxuXHQgICAgICBAcGFyYW0gb24ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5vdGUgc2hvdWxkIHR1cm4gb24gb3Igb2ZmXG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdG9nZ2xlSW5kZXgoaW5kZXgsIG9uKSB7XG5cdCAgICAgICAgdGhpcy5rZXlzW2luZGV4XS5mbGlwKG9uKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gUGlhbm87XG5cdH0pKEludGVyZmFjZSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IFBpYW5vO1xuXHRcblx0Ly8gbG9vcCB0aHJvdWdoIGFuZCByZW5kZXIgdGhlIGtleXM/XG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBzdmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHR2YXIgZG9tID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblx0dmFyIEludGVyZmFjZSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdHZhciBCdXR0b25UZW1wbGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTcpO1xuXHR2YXIgTWF0cml4TW9kZWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblx0dmFyIENvdW50ZXJNb2RlbCA9IF9fd2VicGFja19yZXF1aXJlX18oMjgpO1xuXHR2YXIgdG91Y2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHRcblx0dmFyIE1hdHJpeENlbGwgPSAoZnVuY3Rpb24gKF9CdXR0b25UZW1wbGF0ZSkge1xuXHQgIGZ1bmN0aW9uIE1hdHJpeENlbGwoKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWF0cml4Q2VsbCk7XG5cdFxuXHQgICAgdmFyIG9wdGlvbnMgPSBbXCJ2YWx1ZVwiXTtcblx0XG5cdCAgICB2YXIgZGVmYXVsdHMgPSB7XG5cdCAgICAgIHNpemU6IFs4MCwgODBdLFxuXHQgICAgICB0YXJnZXQ6IGZhbHNlLFxuXHQgICAgICBtb2RlOiBcInRvZ2dsZVwiLFxuXHQgICAgICB2YWx1ZTogMFxuXHQgICAgfTtcblx0XG5cdCAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihNYXRyaXhDZWxsLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLmluZGV4ID0gdGhpcy5zZXR0aW5ncy5pbmRleDtcblx0ICAgIHRoaXMucm93ID0gdGhpcy5zZXR0aW5ncy5yb3c7XG5cdCAgICB0aGlzLmNvbHVtbiA9IHRoaXMuc2V0dGluZ3MuY29sdW1uO1xuXHRcblx0ICAgIHRoaXMubWF0cml4ID0gdGhpcy5zZXR0aW5ncy5tYXRyaXg7XG5cdFxuXHQgICAgdGhpcy5pbnRlcmFjdGluZyA9IGZhbHNlO1xuXHQgICAgdGhpcy5wYWludGJydXNoID0gZmFsc2U7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgICB0aGlzLnJlbmRlcigpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKE1hdHJpeENlbGwsIF9CdXR0b25UZW1wbGF0ZSk7XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhNYXRyaXhDZWxsLCB7XG5cdCAgICBidWlsZEZyYW1lOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEZyYW1lKCkge1xuXHQgICAgICAgIHRoaXMuZWxlbWVudCA9IHN2Zy5jcmVhdGUoXCJzdmdcIik7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHRoaXMud2lkdGgpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgdGhpcy5oZWlnaHQpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50b3AgPSBcIjBweFwiO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGJ1aWxkSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEludGVyZmFjZSgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICB0aGlzLnBhZCA9IHN2Zy5jcmVhdGUoXCJyZWN0XCIpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnBhZCk7XG5cdFxuXHQgICAgICAgIHRoaXMuaW50ZXJhY3Rpb25UYXJnZXQgPSB0aGlzLnBhZDtcblx0XG5cdCAgICAgICAgLyogZXZlbnRzICovXG5cdFxuXHQgICAgICAgIGlmICghdG91Y2guZXhpc3RzKSB7XG5cdFxuXHQgICAgICAgICAgdGhpcy5jbGljayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgX3RoaXMubWF0cml4LmludGVyYWN0aW5nID0gdHJ1ZTtcblx0ICAgICAgICAgICAgX3RoaXMubWF0cml4LnBhaW50YnJ1c2ggPSAhX3RoaXMuc3RhdGU7XG5cdCAgICAgICAgICAgIF90aGlzLmRvd24oX3RoaXMubWF0cml4LnBhaW50YnJ1c2gpO1xuXHQgICAgICAgICAgfTtcblx0ICAgICAgICAgIHRoaXMucGFkLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBpZiAoX3RoaXMubWF0cml4LmludGVyYWN0aW5nKSB7XG5cdCAgICAgICAgICAgICAgX3RoaXMuZG93bihfdGhpcy5tYXRyaXgucGFpbnRicnVzaCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0pO1xuXHRcblx0ICAgICAgICAgIHRoaXMubW92ZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgICAgdGhpcy5wYWQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICBpZiAoX3RoaXMubWF0cml4LmludGVyYWN0aW5nKSB7XG5cdCAgICAgICAgICAgICAgaWYgKCFfdGhpcy5vZmZzZXQpIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLm9mZnNldCA9IGRvbS5maW5kUG9zaXRpb24oX3RoaXMuZWxlbWVudCk7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgIF90aGlzLm1vdXNlID0gZG9tLmxvY2F0ZU1vdXNlKGUsIF90aGlzLm9mZnNldCk7XG5cdCAgICAgICAgICAgICAgX3RoaXMuYmVuZCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9KTtcblx0XG5cdCAgICAgICAgICB0aGlzLnJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIF90aGlzLm1hdHJpeC5pbnRlcmFjdGluZyA9IGZhbHNlO1xuXHQgICAgICAgICAgfTtcblx0ICAgICAgICAgIHRoaXMucGFkLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKF90aGlzLm1hdHJpeC5pbnRlcmFjdGluZykge1xuXHQgICAgICAgICAgICAgIF90aGlzLnVwKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgdGhpcy5wYWQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKF90aGlzLm1hdHJpeC5pbnRlcmFjdGluZykge1xuXHQgICAgICAgICAgICAgIF90aGlzLnVwKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcInhcIiwgMSk7XG5cdCAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwieVwiLCAxKTtcblx0ICAgICAgICBpZiAodGhpcy53aWR0aCA+IDIpIHtcblx0ICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHRoaXMud2lkdGggLSAyKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgdGhpcy53aWR0aCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICh0aGlzLmhlaWdodCA+IDIpIHtcblx0ICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCB0aGlzLmhlaWdodCAtIDIpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgdGhpcy5oZWlnaHQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL3RoaXMucGFkLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5oZWlnaHQgLSAyKTtcblx0ICAgICAgICB0aGlzLnBhZC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMubWF0cml4LmNvbG9ycy5maWxsKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbmRlcjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgIGlmICghdGhpcy5zdGF0ZSkge1xuXHQgICAgICAgICAgdGhpcy5wYWQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLm1hdHJpeC5jb2xvcnMuZmlsbCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMucGFkLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5tYXRyaXguY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBNYXRyaXhDZWxsO1xuXHR9KShCdXR0b25UZW1wbGF0ZSk7XG5cdFxuXHQvKipcblx0KiBTZXF1ZW5jZXJcblx0KlxuXHQqIEBkZXNjcmlwdGlvbiBHcmlkIG9mIGJ1dHRvbnMgd2l0aCBidWlsdC1pbiBzdGVwIHNlcXVlbmNlci5cblx0KlxuXHQqIEBkZW1vIDxkaXYgbmV4dXMtdWk9XCJzZXF1ZW5jZXJcIiBzdHlsZT1cIndpZHRoOjQwMHB4O2hlaWdodDoyMDBweDtcIj48L2Rpdj5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIHNlcXVlbmNlciA9IG5ldyBOZXh1cy5TZXF1ZW5jZXIoJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgc2VxdWVuY2VyID0gbmV3IE5leHVzLlNlcXVlbmNlcignI3RhcmdldCcse1xuXHQqICAnc2l6ZSc6IFs0MDAsMjAwXSxcblx0KiAgJ21vZGUnOiAndG9nZ2xlJyxcblx0KiAgJ3Jvd3MnOiA1LFxuXHQqICAnY29sdW1ucyc6IDEwXG5cdCp9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqIGNoYW5nZVxuXHQqIEZpcmVzIGFueSB0aW1lIHRoZSBpbnRlcmZhY2UncyBtYXRyaXggY2hhbmdlcy4gPGJyPlxuXHQqIFRoZSBldmVudCBkYXRhIGlzIGFuIG9iamVjdCBjb250YWluaW5nIDxpPnJvdzwvaT4gKG51bWJlciksIDxpPmNvbHVtbjwvaT4gKG51bWJlciksIGFuZCA8aT5zdGF0ZTwvaT4gKGJvb2xlYW4pIHByb3BlcnRpZXMuXG5cdCpcblx0KiBAb3V0cHV0ZXhhbXBsZVxuXHQqIHNlcXVlbmNlci5vbignY2hhbmdlJyxmdW5jdGlvbih2KSB7XG5cdCogICBjb25zb2xlLmxvZyh2KTtcblx0KiB9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqIHN0ZXBcblx0KiBGaXJlcyBhbnkgdGltZSB0aGUgc2VxdWVuY2VyIHN0ZXBzIHRvIHRoZSBuZXh0IGNvbHVtbiwgaW4gc2VxdWVjZSBtb2RlLiA8YnI+XG5cdCogVGhlIGV2ZW50IGRhdGEgaXMgYW4gPGk+YXJyYXk8L2k+IGNvbnRhaW5pbmcgYWxsIHZhbHVlcyBpbiB0aGUgY29sdW1uLCA8aT5ib3R0b20gcm93IGZpcnN0PC9pPi5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogc2VxdWVuY2VyLm9uKCdzdGVwJyxmdW5jdGlvbih2KSB7XG5cdCogICBjb25zb2xlLmxvZyh2KTtcblx0KiB9KVxuXHQqL1xuXHRcblx0dmFyIFNlcXVlbmNlciA9IChmdW5jdGlvbiAoX0ludGVyZmFjZSkge1xuXHQgIGZ1bmN0aW9uIFNlcXVlbmNlcigpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTZXF1ZW5jZXIpO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1widmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbNDAwLCAyMDBdLFxuXHQgICAgICBtb2RlOiBcInRvZ2dsZVwiLFxuXHQgICAgICByb3dzOiA1LFxuXHQgICAgICBjb2x1bW5zOiAxMFxuXHQgICAgfTtcblx0XG5cdCAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihTZXF1ZW5jZXIucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIGFyZ3VtZW50cywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHRcblx0ICAgIHRoaXMuYWN0aXZlID0gLTE7XG5cdFxuXHQgICAgLyoqXG5cdCAgICAqIEJ1dHRvbiBpbnRlcmFjdGlvbiBtb2RlOiBzZWUgQnV0dG9uXG5cdCAgICAqIEB0eXBlIHtzdHJpbmd9XG5cdCAgICAqIEBleGFtcGxlIGJ1dHRvbi5tb2RlID0gJ3RvZ2dsZSc7XG5cdCAgICAqL1xuXHQgICAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5tb2RlO1xuXHRcblx0ICAgIC8qKlxuXHQgICAgKiBUaGUgaW50ZXJ2YWwgb2JqZWN0IHdoaWNoIGNvbnRyb2xzIHRpbWluZyBhbmQgc2VxdWVuY2Ugc2NoZWR1bGluZy5cblx0ICAgICogQHR5cGUge2ludGVydmFsfVxuXHQgICAgKi9cblx0ICAgIHRoaXMuaW50ZXJ2YWwgPSBuZXcgTmV4dXMuSW50ZXJ2YWwoMjAwLCBmdW5jdGlvbiAoKSB7fSwgZmFsc2UpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XG5cdCAgICAvKipcblx0ICAgICogQSBNYXRyaXggbW9kZWwgY29udGFpbmluZyBtZXRob2RzIGZvciBtYW5pcHVsYXRpbmcgdGhlIHNlcXVlbmNlcidzIGFycmF5IG9mIHZhbHVlcy4gVG8gbGVhcm4gaG93IHRvIG1hbmlwdWxhdGUgdGhlIG1hdHJpeCwgcmVhZCBhYm91dCB0aGUgbWF0cml4IG1vZGVsLlxuXHQgICAgKiBAdHlwZSB7bWF0cml4fVxuXHQgICAgKi9cblx0ICAgIHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeE1vZGVsKHRoaXMuc2V0dGluZ3Mucm93cywgdGhpcy5zZXR0aW5ncy5jb2x1bW5zKTtcblx0ICAgIHRoaXMubWF0cml4LnVpID0gdGhpcztcblx0XG5cdCAgICAvKipcblx0ICAgICogQSBDb3VudGVyIG1vZGVsIHdoaWNoIHRoZSBzZXF1ZW5jZXIgc3RlcHMgdGhyb3VnaC4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgdGhpcyBtb2RlbCB0byBzdGVwIHRocm91Z2ggdGhlIHNlcXVlbmNlciBpbiByZXZlcnNlLCByYW5kb21seSwgb3IgaW4gYSBkcnVuayB3YWxrLlxuXHQgICAgKiBAdHlwZSB7Y291bnRlcn1cblx0ICAgICovXG5cdCAgICB0aGlzLnN0ZXBwZXIgPSBuZXcgQ291bnRlck1vZGVsKDAsIHRoaXMuY29sdW1ucyk7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoU2VxdWVuY2VyLCBfSW50ZXJmYWNlKTtcblx0XG5cdCAgX2NyZWF0ZUNsYXNzKFNlcXVlbmNlciwge1xuXHQgICAgYnVpbGRGcmFtZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRGcmFtZSgpIHtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XG5cdCAgICAgICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcblx0ICAgICAgICBpZiAodG91Y2guZXhpc3RzKSB7XG5cdCAgICAgICAgICB0aGlzLmFkZFRvdWNoTGlzdGVuZXJzKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgYnVpbGRJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICB0aGlzLmNlbGxzID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hdHJpeC5sZW5ndGg7IGkrKykge1xuXHRcblx0ICAgICAgICAgIHZhciBfbG9jYXRpb24gPSB0aGlzLm1hdHJpeC5sb2NhdGUoaSk7XG5cdCAgICAgICAgICAvLyByZXR1cm5zIHtyb3csY29sfVxuXHRcblx0ICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcblx0ICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XG5cdCAgICAgICAgICB2YXIgY2VsbCA9IG5ldyBNYXRyaXhDZWxsKGNvbnRhaW5lciwge1xuXHQgICAgICAgICAgICBjb21wb25lbnQ6IHRydWUsXG5cdCAgICAgICAgICAgIGluZGV4OiBpLFxuXHQgICAgICAgICAgICByb3c6IF9sb2NhdGlvbi5yb3csXG5cdCAgICAgICAgICAgIGNvbHVtbjogX2xvY2F0aW9uLmNvbHVtbixcblx0ICAgICAgICAgICAgbW9kZTogdGhpcy5tb2RlLFxuXHQgICAgICAgICAgICBtYXRyaXg6IHRoaXNcblx0ICAgICAgICAgIH0sIHRoaXMua2V5Q2hhbmdlLmJpbmQodGhpcywgaSkpO1xuXHRcblx0ICAgICAgICAgIC8vICBjZWxsLm1hdHJpeCA9IHRoaXM7XG5cdCAgICAgICAgICBpZiAodG91Y2guZXhpc3RzKSB7XG5cdCAgICAgICAgICAgIGNlbGwucGFkLmluZGV4ID0gaTtcblx0ICAgICAgICAgICAgY2VsbC5wcmVDbGljayA9IGNlbGwucHJlTW92ZSA9IGNlbGwucHJlUmVsZWFzZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgICAgICBjZWxsLmNsaWNrID0gY2VsbC5tb3ZlID0gY2VsbC5yZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgICAgIGNlbGwucHJlVG91Y2ggPSBjZWxsLnByZVRvdWNoTW92ZSA9IGNlbGwucHJlVG91Y2hSZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgICAgIGNlbGwudG91Y2ggPSBjZWxsLnRvdWNoTW92ZSA9IGNlbGwudG91Y2hSZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgdGhpcy5jZWxscy5wdXNoKGNlbGwpO1xuXHQgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc2l6ZUludGVyZmFjZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2l6ZUludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2l6ZUludGVyZmFjZSgpIHtcblx0XG5cdCAgICAgICAgdmFyIGNlbGxXaWR0aCA9IHRoaXMud2lkdGggLyB0aGlzLmNvbHVtbnM7XG5cdCAgICAgICAgdmFyIGNlbGxIZWlnaHQgPSB0aGlzLmhlaWdodCAvIHRoaXMucm93cztcblx0XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jZWxsc1tpXS5wYXJlbnQ7XG5cdCAgICAgICAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IHRoaXMuY2VsbHNbaV0uY29sdW1uICogY2VsbFdpZHRoICsgXCJweFwiO1xuXHQgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IHRoaXMuY2VsbHNbaV0ucm93ICogY2VsbEhlaWdodCArIFwicHhcIjtcblx0ICAgICAgICAgIHRoaXMuY2VsbHNbaV0ucmVzaXplKGNlbGxXaWR0aCwgY2VsbEhlaWdodCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29sb3JJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbG9ySW50ZXJmYWNlKCkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgdGhpcy5jZWxsc1tpXS5yZW5kZXIoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB1cGRhdGU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICAvLyAgY29uc29sZS5sb2coXCJ1cGRhdGluZy4uLlwiKVxuXHQgICAgICAgIC8vb24gPSBvbiB8fCBmYWxzZTtcblx0ICAgICAgICB0aGlzLm1hdHJpeC5pdGVyYXRlKGZ1bmN0aW9uIChyLCBjLCBpKSB7XG5cdCAgICAgICAgICAvLyAgY29uc29sZS5sb2codGhpcy5tYXRyaXgucGF0dGVybltyXVtjXSwgdGhpcy5jZWxsc1tpXS5zdGF0ZSk7XG5cdCAgICAgICAgICBpZiAoX3RoaXMubWF0cml4LnBhdHRlcm5bcl1bY10gIT09IF90aGlzLmNlbGxzW2ldLnN0YXRlKSB7XG5cdCAgICAgICAgICAgIGlmIChfdGhpcy5tYXRyaXgucGF0dGVybltyXVtjXSA+IDApIHtcblx0ICAgICAgICAgICAgICBfdGhpcy5jZWxsc1tpXS50dXJuT24oKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICBfdGhpcy5jZWxsc1tpXS50dXJuT2ZmKCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGtleUNoYW5nZToge1xuXHRcblx0ICAgICAgLy8gdXBkYXRlID0+IGNlbGwudHVybk9uID0+IGNlbGwuZW1pdCA9PiBrZXlDaGFuZ2UgKHNlcS5lbWl0KSA9PiBtYXRyaXguc2V0LmNlbGwgPT4gdXBkYXRlXG5cdCAgICAgIC8vXG5cdCAgICAgIC8vIGludGVyYWN0aW9uID0+IGtleUNoYW5nZSA9PiBtYXRyaXguc2V0LmNlbGwgPT4gdXBkYXRlID0+IGNlbGwudHVybk9uXG5cdCAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gZW1pdFxuXHQgICAgICAvL1xuXHQgICAgICAvLyBzZXQuY2VsbCA9PiB1cGRhdGUgPT4gbmVlZHMgdG8gZW1pdC5cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBrZXlDaGFuZ2Uobm90ZSwgb24pIHtcblx0ICAgICAgICAvLyBlbWl0IGRhdGEgZm9yIGFueSBrZXkgdHVybmluZyBvbi9vZmZcblx0ICAgICAgICAvLyBpIGlzIHRoZSBub3RlIGluZGV4XG5cdCAgICAgICAgLy8gdiBpcyB3aGV0aGVyIGl0IGlzIG9uIG9yIG9mZlxuXHQgICAgICAgIHZhciBjZWxsID0gdGhpcy5tYXRyaXgubG9jYXRlKG5vdGUpO1xuXHQgICAgICAgIC8vICB0aGlzLm1hdHJpeC5zZXQuY2VsbChjZWxsLmNvbHVtbixjZWxsLnJvdyxvbik7XG5cdCAgICAgICAgdGhpcy5tYXRyaXgucGF0dGVybltjZWxsLnJvd11bY2VsbC5jb2x1bW5dID0gb247XG5cdCAgICAgICAgdmFyIGRhdGEgPSB7XG5cdCAgICAgICAgICByb3c6IGNlbGwucm93LFxuXHQgICAgICAgICAgY29sdW1uOiBjZWxsLmNvbHVtbixcblx0ICAgICAgICAgIHN0YXRlOiBvblxuXHQgICAgICAgIH07XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIGRhdGEpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVuZGVyOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgaWYgKHRoaXMuc3RlcHBlci52YWx1ZSA+PSAwKSB7XG5cdCAgICAgICAgICB0aGlzLm1hdHJpeC5pdGVyYXRlKGZ1bmN0aW9uIChyLCBjLCBpKSB7XG5cdCAgICAgICAgICAgIGlmIChjID09PSBfdGhpcy5zdGVwcGVyLnZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgX3RoaXMuY2VsbHNbaV0ucGFkLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBfdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQpO1xuXHQgICAgICAgICAgICAgIF90aGlzLmNlbGxzW2ldLnBhZC5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgXCIxXCIpO1xuXHQgICAgICAgICAgICAgIF90aGlzLmNlbGxzW2ldLnBhZC5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utb3BhY2l0eVwiLCBcIjFcIik7XG5cdCAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgX3RoaXMuY2VsbHNbaV0ucGFkLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCBcIm5vbmVcIik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHN0YXJ0OiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgICogU3RhcnQgc2VxdWVuY2luZ1xuXHQgICAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IG1zIEJlYXQgdGVtcG8gaW4gbWlsbGlzZWNvbmRzXG5cdCAgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KG1zKSB7XG5cdCAgICAgICAgdGhpcy5pbnRlcnZhbC5ldmVudCA9IHRoaXMubmV4dC5iaW5kKHRoaXMpO1xuXHQgICAgICAgIGlmIChtcykge1xuXHQgICAgICAgICAgdGhpcy5pbnRlcnZhbC5tcyhtcyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuaW50ZXJ2YWwuc3RhcnQoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHN0b3A6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBTdG9wIHNlcXVlbmNpbmdcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuXHQgICAgICAgIHRoaXMuaW50ZXJ2YWwuc3RvcCgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbmV4dDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIE1hbnVhbGx5IGp1bXAgdG8gdGhlIG5leHQgY29sdW1uIGFuZCB0cmlnZ2VyIHRoZSAnY2hhbmdlJyBldmVudC4gVGhlIFwibmV4dFwiIGNvbHVtbiBpcyBkZXRlcm1pbmVkIGJ5IHlvdXIgbW9kZSBvZiBzZXF1ZW5jaW5nLlxuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIG5leHQoKSB7XG5cdCAgICAgICAgdGhpcy5zdGVwcGVyLm5leHQoKTtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJzdGVwXCIsIHRoaXMubWF0cml4LmNvbHVtbih0aGlzLnN0ZXBwZXIudmFsdWUpLnJldmVyc2UoKSk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGFkZFRvdWNoTGlzdGVuZXJzOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRUb3VjaExpc3RlbmVycygpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICB0aGlzLnByZUNsaWNrID0gdGhpcy5wcmVNb3ZlID0gdGhpcy5wcmVSZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgdGhpcy5jbGljayA9IHRoaXMubW92ZSA9IHRoaXMucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgIHRoaXMucHJlVG91Y2ggPSB0aGlzLnByZVRvdWNoTW92ZSA9IHRoaXMucHJlVG91Y2hSZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgdGhpcy50b3VjaCA9IHRoaXMudG91Y2hNb3ZlID0gdGhpcy50b3VjaFJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7fTtcblx0XG5cdCAgICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WCwgZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFkpO1xuXHQgICAgICAgICAgdmFyIGNlbGwgPSBfdGhpcy5jZWxsc1tlbGVtZW50LmluZGV4XTtcblx0ICAgICAgICAgIF90aGlzLnBhaW50YnJ1c2ggPSAhY2VsbC5zdGF0ZTtcblx0ICAgICAgICAgIGNlbGwuZG93bihfdGhpcy5wYWludGJydXNoKTtcblx0ICAgICAgICAgIF90aGlzLmN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5pbmRleDtcblx0ICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgfSk7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFgsIGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZKTtcblx0ICAgICAgICAgIHZhciBjZWxsID0gX3RoaXMuY2VsbHNbZWxlbWVudC5pbmRleF07XG5cdCAgICAgICAgICBpZiAoZWxlbWVudC5pbmRleCAhPT0gX3RoaXMuY3VycmVudEVsZW1lbnQpIHtcblx0ICAgICAgICAgICAgaWYgKF90aGlzLmN1cnJlbnRFbGVtZW50ID49IDApIHtcblx0ICAgICAgICAgICAgICB2YXIgcGFzdENlbGwgPSBfdGhpcy5jZWxsc1tfdGhpcy5jdXJyZW50RWxlbWVudF07XG5cdCAgICAgICAgICAgICAgcGFzdENlbGwudXAoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjZWxsLmRvd24oX3RoaXMucGFpbnRicnVzaCk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBjZWxsLmJlbmQoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIF90aGlzLmN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5pbmRleDtcblx0ICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgfSk7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIC8vIG5vIHRvdWNoZXMgdG8gY2FsY3VsYXRlIGJlY2F1c2Ugbm9uZSByZW1haW5pbmdcblx0ICAgICAgICAgIHZhciBjZWxsID0gX3RoaXMuY2VsbHNbX3RoaXMuY3VycmVudEVsZW1lbnRdO1xuXHQgICAgICAgICAgY2VsbC51cCgpO1xuXHQgICAgICAgICAgX3RoaXMuaW50ZXJhY3RpbmcgPSBmYWxzZTtcblx0ICAgICAgICAgIF90aGlzLmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcm93czoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIE51bWJlciBvZiByb3dzIGluIHRoZSBzZXF1ZW5jZXJcblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm1hdHJpeC5yb3dzO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5tYXRyaXgucm93cyA9IHY7XG5cdCAgICAgICAgdGhpcy5lbXB0eSgpO1xuXHQgICAgICAgIHRoaXMuYnVpbGRJbnRlcmZhY2UoKTtcblx0ICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29sdW1uczoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIE51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBzZXF1ZW5jZXJcblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLm1hdHJpeC5jb2x1bW5zO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5tYXRyaXguY29sdW1ucyA9IHY7XG5cdCAgICAgICAgdGhpcy5zdGVwcGVyLm1heCA9IHY7XG5cdCAgICAgICAgdGhpcy5lbXB0eSgpO1xuXHQgICAgICAgIHRoaXMuYnVpbGRJbnRlcmZhY2UoKTtcblx0ICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBTZXF1ZW5jZXI7XG5cdH0pKEludGVyZmFjZSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IFNlcXVlbmNlcjtcblxuLyoqKi8gfSksXG4vKiAyNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZSA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9ialtcImRlZmF1bHRcIl0gOiBvYmo7IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgbWF0aCA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDUpKTtcblx0XG5cdHZhciBTZXF1ZW5jZSA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KSk7XG5cdFxuXHQvLyBGb3IgdGhlIHR1dG9yaWFsLCBsb29raW5nIGF0XG5cdFxuXHQvL1BhdHRlcm4gc2VjdGlvbjpcblx0Ly8gLmNyZWF0ZSgpLCAucm93cywgLmNvbHVtbnMsXG5cdC8vIC5wYXR0ZXJuLCAubGVuZ3RoLCAuZm9ybWF0QXNUZXh0KCksIC5sb2coKSxcblx0Ly8gLmxvY2F0ZShpKSwgLmluZGV4T2YoYyxyKVxuXHQvLyByb3coKSwgY29sdW1uKCkgKHJldHVybnMgY29udGVudHMgb2Ygcm93IG9yIGNvbHVtKVxuXHRcblx0Ly9Db250cm9sIHNlY3Rpb246XG5cdC8vIHRvZ2dsZSB4M1xuXHQvLyBzZXQgeDRcblx0Ly8gcm90YXRlIHgzXG5cdC8vIHBvcHVsYXRlIHgzXG5cdC8vIGVyYXNlIHgzXG5cdFxuXHQvLyBzaG91bGQgc29tZSB2ZXJzaW9uIG9mIHRoaXMgaGF2ZSBhIGZsb2F0IHZhbHVlIGZvciBlYWNoIGNlbGw/XG5cdC8vIGNvdWxkIGJlIGxpa2UgYSBtaXJyb3IgLnBhdHRlcm4gdGhhdCBoYXMgdmFsdWVzLiBieSBkZWZhdWx0LCBldmVyeXRoaW5nIGlzIDEsIGJ1dCBjb3VsZCBiZSBzZXQuLi5cblx0Ly8gbm90IGEgZ29vZCB3YXkgdG8gZG8gdGhhdCBvbiBpbnRlcmZhY2UsIGJ1dCBhcyBhIG1vZGVsIGl0IHdvdWxkIGJlIG5pY2UuLi5cblx0Ly8gZm9yIC5mb3JtYXRBc1RleHQoKSwgY291bGQgbXVsdGlwbHkgYnkgMTAwIGFuZCBmbG9vciwgc28gZWFjaCBjZWxsIGlzIGFuIGludCBmcm9tIDAgdG8gOVxuXHRcblx0dmFyIE1hdHJpeCA9IChmdW5jdGlvbiAoKSB7XG5cdCAgZnVuY3Rpb24gTWF0cml4KHJvd3MsIGNvbHVtbnMpIHtcblx0ICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1hdHJpeCk7XG5cdFxuXHQgICAgLy8gc2hvdWxkIGFsc28gaGF2ZSBhYmlsaXR5IHRvIGNyZWF0ZSB1c2luZyBhbiBleGlzdGluZyBtYXRyaXggKDJkIGFycmF5KVxuXHQgICAgdGhpcy5wYXR0ZXJuID0gW107XG5cdCAgICB0aGlzLmNyZWF0ZShyb3dzLCBjb2x1bW5zKTtcblx0XG5cdCAgICB0aGlzLnRvZ2dsZSA9IHtcblx0ICAgICAgY2VsbDogZnVuY3Rpb24gKGNvbHVtbiwgcm93KSB7XG5cdCAgICAgICAgX3RoaXMucGF0dGVybltyb3ddW2NvbHVtbl0gPSAhX3RoaXMucGF0dGVybltyb3ddW2NvbHVtbl07IC8vIG1hdGguaW52ZXJ0KHRoaXMucGF0dGVybltyb3ddW2NvbHVtbl0pO1xuXHQgICAgICAgIGlmIChfdGhpcy51aSkge1xuXHQgICAgICAgICAgX3RoaXMudWkudXBkYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBfdGhpcy5wYXR0ZXJuW3Jvd11bY29sdW1uXTtcblx0ICAgICAgfSxcblx0ICAgICAgYWxsOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgX3RoaXMuaXRlcmF0ZShmdW5jdGlvbiAociwgYykge1xuXHQgICAgICAgICAgX3RoaXMudG9nZ2xlLmNlbGwoYywgcik7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKF90aGlzLnVpKSB7XG5cdCAgICAgICAgICBfdGhpcy51aS51cGRhdGUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIHJvdzogZnVuY3Rpb24gKHJvdykge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3RoaXMuY29sdW1uczsgaSsrKSB7XG5cdCAgICAgICAgICBfdGhpcy50b2dnbGUuY2VsbChpLCByb3cpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoX3RoaXMudWkpIHtcblx0ICAgICAgICAgIF90aGlzLnVpLnVwZGF0ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgY29sdW1uOiBmdW5jdGlvbiAoY29sdW1uKSB7XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpcy5yb3dzOyBpKyspIHtcblx0ICAgICAgICAgIF90aGlzLnRvZ2dsZS5jZWxsKGNvbHVtbiwgaSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChfdGhpcy51aSkge1xuXHQgICAgICAgICAgX3RoaXMudWkudXBkYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIHRoaXMuc2V0ID0ge1xuXHQgICAgICBjZWxsOiBmdW5jdGlvbiAoY29sdW1uLCByb3csIHZhbHVlKSB7XG5cdCAgICAgICAgX3RoaXMucGF0dGVybltyb3ddW2NvbHVtbl0gPSB2YWx1ZTtcblx0ICAgICAgICBpZiAoX3RoaXMudWkpIHtcblx0ICAgICAgICAgIF90aGlzLnVpLnVwZGF0ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgYWxsOiBmdW5jdGlvbiAodmFsdWVzKSB7XG5cdCAgICAgICAgLy8gc2V0IHRoZSB3aG9sZSBtYXRyaXggdXNpbmcgYSAyZCBhcnJheSBhcyBpbnB1dFxuXHQgICAgICAgIC8vIHRoaXMgc2hvdWxkIGFsc28gcmVzaXplIHRoZSBhcnJheT9cblx0ICAgICAgICBfdGhpcy5wYXR0ZXJuID0gdmFsdWVzO1xuXHQgICAgICAgIGlmIChfdGhpcy51aSkge1xuXHQgICAgICAgICAgX3RoaXMudWkudXBkYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICByb3c6IGZ1bmN0aW9uIChyb3csIHZhbHVlcykge1xuXHQgICAgICAgIC8vIHNldCBhIHJvdyB1c2luZyBhbiBhcnJheSBhcyBpbnB1dFxuXHQgICAgICAgIF90aGlzLnBhdHRlcm5bcm93XSA9IHZhbHVlcztcblx0ICAgICAgICBpZiAoX3RoaXMudWkpIHtcblx0ICAgICAgICAgIF90aGlzLnVpLnVwZGF0ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgY29sdW1uOiBmdW5jdGlvbiAoY29sdW1uLCB2YWx1ZXMpIHtcblx0ICAgICAgICAvLyBzZXQgYSBjb2x1bW4gdXNpbmcgYW4gYXJyYXkgYXMgaW5wdXRcblx0ICAgICAgICBfdGhpcy5wYXR0ZXJuLmZvckVhY2goZnVuY3Rpb24gKHJvdywgaSkge1xuXHQgICAgICAgICAgX3RoaXMucGF0dGVybltpXVtjb2x1bW5dID0gdmFsdWVzW2ldO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIGlmIChfdGhpcy51aSkge1xuXHQgICAgICAgICAgX3RoaXMudWkudXBkYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9O1xuXHRcblx0ICAgIHRoaXMucm90YXRlID0ge1xuXHQgICAgICAvL3Nob3VsZCBldmVudHVhbGx5IGRvIChhbW91bnRYLCBhbW91bnRZKSBoZXJlXG5cdCAgICAgIC8vIGNvdWxkIGp1c3QgdXNlIGEgbG9vcCBhbmQgdGhpcy5yb3RhdGUucm93KGksYW1vdW50WCk7XG5cdCAgICAgIGFsbDogZnVuY3Rpb24gKGFtb3VudCkge1xuXHQgICAgICAgIGlmICghYW1vdW50ICYmIGFtb3VudCAhPT0gMCkge1xuXHQgICAgICAgICAgYW1vdW50ID0gMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYW1vdW50ICU9IF90aGlzLnBhdHRlcm5bMF0ubGVuZ3RoO1xuXHQgICAgICAgIGlmIChhbW91bnQgPCAwKSB7XG5cdCAgICAgICAgICBhbW91bnQgPSBfdGhpcy5wYXR0ZXJuWzBdLmxlbmd0aCArIGFtb3VudDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdGhpcy5yb3dzOyBpKyspIHtcblx0ICAgICAgICAgIHZhciBjdXQgPSBfdGhpcy5wYXR0ZXJuW2ldLnNwbGljZShfdGhpcy5wYXR0ZXJuW2ldLmxlbmd0aCAtIGFtb3VudCwgYW1vdW50KTtcblx0ICAgICAgICAgIF90aGlzLnBhdHRlcm5baV0gPSBjdXQuY29uY2F0KF90aGlzLnBhdHRlcm5baV0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoX3RoaXMudWkpIHtcblx0ICAgICAgICAgIF90aGlzLnVpLnVwZGF0ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSxcblx0ICAgICAgcm93OiBmdW5jdGlvbiAocm93LCBhbW91bnQpIHtcblx0ICAgICAgICBpZiAoIWFtb3VudCAmJiBhbW91bnQgIT09IDApIHtcblx0ICAgICAgICAgIGFtb3VudCA9IDE7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGFtb3VudCAlPSBfdGhpcy5wYXR0ZXJuWzBdLmxlbmd0aDtcblx0ICAgICAgICBpZiAoYW1vdW50IDwgMCkge1xuXHQgICAgICAgICAgYW1vdW50ID0gX3RoaXMucGF0dGVyblswXS5sZW5ndGggKyBhbW91bnQ7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHZhciBjdXQgPSBfdGhpcy5wYXR0ZXJuW3Jvd10uc3BsaWNlKF90aGlzLnBhdHRlcm5bcm93XS5sZW5ndGggLSBhbW91bnQsIGFtb3VudCk7XG5cdCAgICAgICAgX3RoaXMucGF0dGVybltyb3ddID0gY3V0LmNvbmNhdChfdGhpcy5wYXR0ZXJuW3Jvd10pO1xuXHQgICAgICAgIGlmIChfdGhpcy51aSkge1xuXHQgICAgICAgICAgX3RoaXMudWkudXBkYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICBjb2x1bW46IGZ1bmN0aW9uIChjb2x1bW4sIGFtb3VudCkge1xuXHQgICAgICAgIGlmICghYW1vdW50ICYmIGFtb3VudCAhPT0gMCkge1xuXHQgICAgICAgICAgYW1vdW50ID0gMTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYW1vdW50ICU9IF90aGlzLnBhdHRlcm4ubGVuZ3RoO1xuXHQgICAgICAgIGlmIChhbW91bnQgPCAwKSB7XG5cdCAgICAgICAgICBhbW91bnQgPSBfdGhpcy5wYXR0ZXJuLmxlbmd0aCArIGFtb3VudDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdmFyIHByb3h5ID0gW107XG5cdCAgICAgICAgX3RoaXMucGF0dGVybi5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcblx0ICAgICAgICAgIHByb3h5LnB1c2gocm93W2NvbHVtbl0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHZhciBjdXQgPSBwcm94eS5zcGxpY2UocHJveHkubGVuZ3RoIC0gYW1vdW50LCBhbW91bnQpO1xuXHQgICAgICAgIHByb3h5ID0gY3V0LmNvbmNhdChwcm94eSk7XG5cdCAgICAgICAgX3RoaXMucGF0dGVybi5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcblx0ICAgICAgICAgIHJvd1tjb2x1bW5dID0gcHJveHlbaV07XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKF90aGlzLnVpKSB7XG5cdCAgICAgICAgICBfdGhpcy51aS51cGRhdGUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgLy8gdGhlIGlkZWEgYmVoaW5kIHBvcHVsYXRlIGlzIHRvIGJlIGFibGUgdG8gc2V0IGEgd2hvbGUgcm93IG9yIGNvbHVtbiB0byAwIG9yIDFcblx0ICAgIC8vIElGIHRoZSB2YWx1ZSBpcyBhIGZsb2F0LCBzdWNoIGFzIDAuNywgdGhlbiBpdCB3b3VsZCBiZWNvbWUgYSBwcm9iYWJpbGl0eVxuXHQgICAgLy8gc28gcG9wdWxhdGUoMC43KSB3b3VsZCBnaXZlIGVhY2ggY2VsbCBhIDcwJSBjaGFuY2Ugb2YgYmVpbmcgMVxuXHQgICAgdGhpcy5wb3B1bGF0ZSA9IHtcblx0ICAgICAgYWxsOiBmdW5jdGlvbiAob2Rkcykge1xuXHQgICAgICAgIHZhciBvZGRzU2VxdWVuY2UgPSBuZXcgU2VxdWVuY2Uob2Rkcyk7XG5cdCAgICAgICAgX3RoaXMuaXRlcmF0ZShmdW5jdGlvbiAociwgYykge1xuXHQgICAgICAgICAgX3RoaXMucGF0dGVybltyXVtjXSA9IG1hdGguY29pbihvZGRzU2VxdWVuY2UubmV4dCgpKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICAvLyBUaGlzIGNvdWxkIGJlIHVzZWQgc28gdGhhdCBlYWNoIHJvdyBoYXMgc2FtZSBvZGRzIHBhdHRlcm4sIGV2ZW4gaWYgcm93IGxlbmd0aCBpcyBub3QgZGl2aXNpYmx5IGJ5IHNlcXVlbmNlIGxlbmd0aC5cblx0ICAgICAgICAvLywoKSA9PiB7XG5cdCAgICAgICAgLy8gIG9kZHMucG9zID0gLTE7XG5cdCAgICAgICAgLy8gfVxuXHQgICAgICAgIGlmIChfdGhpcy51aSkge1xuXHQgICAgICAgICAgX3RoaXMudWkudXBkYXRlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9LFxuXHQgICAgICByb3c6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICB2YXIgcm93ID0gYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAwIDogYXJndW1lbnRzWzBdO1xuXHQgICAgICAgIHZhciBvZGRzID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAxIDogYXJndW1lbnRzWzFdO1xuXHRcblx0ICAgICAgICB2YXIgb2Rkc1NlcXVlbmNlID0gbmV3IFNlcXVlbmNlKG9kZHMpO1xuXHQgICAgICAgIF90aGlzLnBhdHRlcm5bcm93XS5mb3JFYWNoKGZ1bmN0aW9uIChjZWxsLCBpKSB7XG5cdCAgICAgICAgICBfdGhpcy5wYXR0ZXJuW3Jvd11baV0gPSBtYXRoLmNvaW4ob2Rkc1NlcXVlbmNlLm5leHQoKSk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgICAgaWYgKF90aGlzLnVpKSB7XG5cdCAgICAgICAgICBfdGhpcy51aS51cGRhdGUoKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0sXG5cdCAgICAgIGNvbHVtbjogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHZhciBjb2x1bW4gPSBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgdmFyIG9kZHMgPSBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IDEgOiBhcmd1bWVudHNbMV07XG5cdFxuXHQgICAgICAgIHZhciBvZGRzU2VxdWVuY2UgPSBuZXcgU2VxdWVuY2Uob2Rkcyk7XG5cdCAgICAgICAgX3RoaXMucGF0dGVybi5mb3JFYWNoKGZ1bmN0aW9uIChyb3csIGkpIHtcblx0ICAgICAgICAgIF90aGlzLnBhdHRlcm5baV1bY29sdW1uXSA9IG1hdGguY29pbihvZGRzU2VxdWVuY2UubmV4dCgpKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICBpZiAoX3RoaXMudWkpIHtcblx0ICAgICAgICAgIF90aGlzLnVpLnVwZGF0ZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfTtcblx0XG5cdCAgICAvLyBlc3NlbnRpYWxsIHBvcHVsYXRlKDApIHNvIGknbSBub3Qgc3VyZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeSBidXQgaXMgbmljZVxuXHQgICAgdGhpcy5lcmFzZSA9IHtcblx0ICAgICAgYWxsOiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgX3RoaXMuc2V0LmFsbCgwKTtcblx0ICAgICAgfSxcblx0ICAgICAgcm93OiBmdW5jdGlvbiAocm93KSB7XG5cdCAgICAgICAgX3RoaXMuc2V0LnJvdyhyb3csIDApO1xuXHQgICAgICB9LFxuXHQgICAgICBjb2x1bW46IGZ1bmN0aW9uIChjb2x1bW4pIHtcblx0ICAgICAgICBfdGhpcy5zZXQuY29sdW1uKGNvbHVtbiwgMCk7XG5cdCAgICAgIH1cblx0ICAgIH07XG5cdFxuXHQgICAgLy8gZW5kIGNvbnN0cnVjdG9yXG5cdCAgfVxuXHRcblx0ICBfY3JlYXRlQ2xhc3MoTWF0cml4LCB7XG5cdCAgICBjcmVhdGU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZShyb3dzLCBjb2x1bW5zKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgdGhpcy5wYXR0ZXJuID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcblx0ICAgICAgICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoY29sdW1ucyk7XG5cdCAgICAgICAgICB0aGlzLnBhdHRlcm4ucHVzaChhcnIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLml0ZXJhdGUoZnVuY3Rpb24gKHIsIGMpIHtcblx0ICAgICAgICAgIF90aGlzLnBhdHRlcm5bcl1bY10gPSBmYWxzZTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGl0ZXJhdGU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGl0ZXJhdGUoZiwgZjIpIHtcblx0ICAgICAgICB2YXIgaSA9IDA7XG5cdCAgICAgICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgdGhpcy5yb3dzOyByb3crKykge1xuXHQgICAgICAgICAgaWYgKGYyKSB7XG5cdCAgICAgICAgICAgIGYyKHJvdyk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBmb3IgKHZhciBjb2x1bW4gPSAwOyBjb2x1bW4gPCB0aGlzLmNvbHVtbnM7IGNvbHVtbisrKSB7XG5cdCAgICAgICAgICAgIGYocm93LCBjb2x1bW4sIGkpO1xuXHQgICAgICAgICAgICBpKys7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZm9ybWF0QXNUZXh0OiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JtYXRBc1RleHQoKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgdmFyIHBhdHRlcm5TdHJpbmcgPSBcIlwiO1xuXHQgICAgICAgIHRoaXMuaXRlcmF0ZShmdW5jdGlvbiAociwgYykge1xuXHQgICAgICAgICAgcGF0dGVyblN0cmluZyArPSAoX3RoaXMucGF0dGVybltyXVtjXSA/IDEgOiAwKSArIFwiIFwiO1xuXHQgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIHBhdHRlcm5TdHJpbmcgKz0gXCJcXG5cIjtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICByZXR1cm4gcGF0dGVyblN0cmluZztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGxvZzoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbG9nKCkge1xuXHQgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZm9ybWF0QXNUZXh0KCkpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgdXBkYXRlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUocGF0dGVybikge1xuXHQgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm4gfHwgdGhpcy5wYXR0ZXJuO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbGVuZ3RoOiB7XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnJvd3MgKiB0aGlzLmNvbHVtbnM7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBsb2NhdGU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGxvY2F0ZShpbmRleCkge1xuXHQgICAgICAgIC8vIHJldHVybnMgcm93IGFuZCBjb2x1bW4gb2YgY2VsbCBieSBpbmRleFxuXHQgICAgICAgIHJldHVybiB7XG5cdCAgICAgICAgICByb3c6IH4gfihpbmRleCAvIHRoaXMuY29sdW1ucyksXG5cdCAgICAgICAgICBjb2x1bW46IGluZGV4ICUgdGhpcy5jb2x1bW5zXG5cdCAgICAgICAgfTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGluZGV4T2Y6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluZGV4T2Yocm93LCBjb2x1bW4pIHtcblx0ICAgICAgICByZXR1cm4gY29sdW1uICsgcm93ICogdGhpcy5jb2x1bW5zO1xuXHQgICAgICAgIC8vIHJldHVybnMgaW5kZXggb2YgY2VsbCBieSByb3cgYW5kIGNvbHVtblxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcm93OiB7XG5cdCAgICAgIHZhbHVlOiAoZnVuY3Rpb24gKF9yb3cpIHtcblx0ICAgICAgICB2YXIgX3Jvd1dyYXBwZXIgPSBmdW5jdGlvbiByb3coX3gpIHtcblx0ICAgICAgICAgIHJldHVybiBfcm93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgfTtcblx0XG5cdCAgICAgICAgX3Jvd1dyYXBwZXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICByZXR1cm4gX3Jvdy50b1N0cmluZygpO1xuXHQgICAgICAgIH07XG5cdFxuXHQgICAgICAgIHJldHVybiBfcm93V3JhcHBlcjtcblx0ICAgICAgfSkoZnVuY3Rpb24gKHJvdykge1xuXHQgICAgICAgIHZhciBkYXRhID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnM7IGkrKykge1xuXHQgICAgICAgICAgZGF0YS5wdXNoKHRoaXMucGF0dGVybltyb3ddID8gMSA6IDApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZGF0YTtcblx0ICAgICAgfSlcblx0ICAgIH0sXG5cdCAgICBjb2x1bW46IHtcblx0ICAgICAgdmFsdWU6IChmdW5jdGlvbiAoX2NvbHVtbikge1xuXHQgICAgICAgIHZhciBfY29sdW1uV3JhcHBlciA9IGZ1bmN0aW9uIGNvbHVtbihfeDIpIHtcblx0ICAgICAgICAgIHJldHVybiBfY29sdW1uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgfTtcblx0XG5cdCAgICAgICAgX2NvbHVtbldyYXBwZXIudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICByZXR1cm4gX2NvbHVtbi50b1N0cmluZygpO1xuXHQgICAgICAgIH07XG5cdFxuXHQgICAgICAgIHJldHVybiBfY29sdW1uV3JhcHBlcjtcblx0ICAgICAgfSkoZnVuY3Rpb24gKGNvbHVtbikge1xuXHQgICAgICAgIHZhciBkYXRhID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuXHQgICAgICAgICAgZGF0YS5wdXNoKHRoaXMucGF0dGVybltpXVtjb2x1bW5dID8gMSA6IDApO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gZGF0YTtcblx0ICAgICAgfSlcblx0ICAgIH0sXG5cdCAgICByb3dzOiB7XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm4ubGVuZ3RoO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgdmFyIHByZXZpb3VzID0gdGhpcy5wYXR0ZXJuLnNsaWNlKDApO1xuXHQgICAgICAgIHRoaXMuY3JlYXRlKHYsIHRoaXMuY29sdW1ucyk7XG5cdCAgICAgICAgdGhpcy5pdGVyYXRlKGZ1bmN0aW9uIChyLCBjKSB7XG5cdCAgICAgICAgICBpZiAocHJldmlvdXNbcl0gJiYgcHJldmlvdXNbcl1bY10pIHtcblx0ICAgICAgICAgICAgX3RoaXMucGF0dGVybltyXVtjXSA9IHByZXZpb3VzW3JdW2NdO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29sdW1uczoge1xuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5wYXR0ZXJuWzBdLmxlbmd0aDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMucGF0dGVybi5zbGljZSgwKTtcblx0ICAgICAgICB0aGlzLmNyZWF0ZSh0aGlzLnJvd3MsIHYpO1xuXHQgICAgICAgIHRoaXMuaXRlcmF0ZShmdW5jdGlvbiAociwgYykge1xuXHQgICAgICAgICAgaWYgKHByZXZpb3VzW3JdICYmIHByZXZpb3VzW3JdW2NdKSB7XG5cdCAgICAgICAgICAgIF90aGlzLnBhdHRlcm5bcl1bY10gPSBwcmV2aW91c1tyXVtjXTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gTWF0cml4O1xuXHR9KSgpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBNYXRyaXg7XG5cbi8qKiovIH0pLFxuLyogMjYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfaW50ZXJvcFJlcXVpcmUgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmpbXCJkZWZhdWx0XCJdIDogb2JqOyB9O1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsgdmFyIHByb3AgPSBwcm9wc1trZXldOyBwcm9wLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChwcm9wLnZhbHVlKSBwcm9wLndyaXRhYmxlID0gdHJ1ZTsgfSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKTsgfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9O1xuXHRcblx0dmFyIG1hdGggPSBfaW50ZXJvcFJlcXVpcmUoX193ZWJwYWNrX3JlcXVpcmVfXyg1KSk7XG5cdFxuXHR2YXIgRHJ1bmsgPSBfaW50ZXJvcFJlcXVpcmUoX193ZWJwYWNrX3JlcXVpcmVfXygyNykpO1xuXHRcblx0dmFyIFNlcXVlbmNlID0gKGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBTZXF1ZW5jZSgpIHtcblx0ICAgIHZhciBzZXF1ZW5jZSA9IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gWzAsIDEwLCAyMCwgMzBdIDogYXJndW1lbnRzWzBdO1xuXHQgICAgdmFyIG1vZGUgPSBhcmd1bWVudHNbMV0gPT09IHVuZGVmaW5lZCA/IFwidXBcIiA6IGFyZ3VtZW50c1sxXTtcblx0ICAgIHZhciBwb3NpdGlvbiA9IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBhcmd1bWVudHNbMl07XG5cdFxuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNlcXVlbmNlKTtcblx0XG5cdCAgICB0aGlzLnZhbHVlcyA9IHNlcXVlbmNlO1xuXHQgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmFsdWVzKSkge1xuXHQgICAgICB0aGlzLnZhbHVlcyA9IFt0aGlzLnZhbHVlc107XG5cdCAgICB9XG5cdCAgICB0aGlzLl9tb2RlID0gbW9kZTtcblx0ICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcblx0XG5cdCAgICB0aGlzLmRydW5rV2FsayA9IG5ldyBEcnVuaygwLCB0aGlzLnZhbHVlcy5sZW5ndGggLSAxKTtcblx0XG5cdCAgICB0aGlzLnN0YXJ0VmFsdWVzID0ge1xuXHQgICAgICB1cDogMCxcblx0ICAgICAgZG93bjogdGhpcy52YWx1ZXMubGVuZ3RoIC0gMSxcblx0ICAgICAgZHJ1bms6IH4gfih0aGlzLnZhbHVlcy5sZW5ndGggLyAyKSxcblx0ICAgICAgcmFuZG9tOiBtYXRoLnJpKHRoaXMudmFsdWVzLmxlbmd0aClcblx0ICAgIH07XG5cdFxuXHQgICAgaWYgKHRoaXMucG9zaXRpb24gIT09IGZhbHNlKSB7XG5cdCAgICAgIHRoaXMubmV4dCA9IHRoaXNbdGhpcy5fbW9kZV07XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLm5leHQgPSB0aGlzLmZpcnN0O1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgX2NyZWF0ZUNsYXNzKFNlcXVlbmNlLCB7XG5cdCAgICBtb2RlOiB7XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9tb2RlO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uIChtb2RlKSB7XG5cdCAgICAgICAgaWYgKCEobW9kZSA9PT0gXCJ1cFwiIHx8IG1vZGUgPT09IFwiZG93blwiIHx8IG1vZGUgPT09IFwicmFuZG9tXCIgfHwgbW9kZSA9PT0gXCJkcnVua1wiKSkge1xuXHQgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBvbmx5IG1vZGVzIGN1cnJlbnRseSBhbGxvd2VkIGFyZTogdXAsIGRvd24sIHJhbmRvbSwgZHJ1bmtcIik7XG5cdCAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuX21vZGUgPSBtb2RlO1xuXHQgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uKSB7XG5cdCAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzW3RoaXMuX21vZGVdO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHZhbHVlOiB7XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnZhbHVlc1t0aGlzLnBvc2l0aW9uXTtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLnZhbHVlcy5pbmRleE9mKHYpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZmlyc3Q6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZpcnN0KCkge1xuXHQgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uICE9PSBmYWxzZSkge1xuXHQgICAgICAgICAgdGhpcy5uZXh0ID0gdGhpc1t0aGlzLl9tb2RlXTtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHRoaXMuc3RhcnRWYWx1ZXNbdGhpcy5fbW9kZV07XG5cdCAgICAgICAgdGhpcy5uZXh0ID0gdGhpc1t0aGlzLl9tb2RlXTtcblx0ICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVwOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiB1cCgpIHtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uKys7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbiAlPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBkb3duOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBkb3duKCkge1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24tLTtcblx0ICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA8IDApIHtcblx0ICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAodGhpcy5wb3NpdGlvbiArIHRoaXMudmFsdWVzLmxlbmd0aCkgJSB0aGlzLnZhbHVlcy5sZW5ndGg7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmFuZG9tOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiByYW5kb20oKSB7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG1hdGgucmkoMCwgdGhpcy52YWx1ZXMubGVuZ3RoKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGRydW5rOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBkcnVuaygpIHtcblx0ICAgICAgICB0aGlzLmRydW5rV2Fsay5tYXggPSB0aGlzLnZhbHVlcy5sZW5ndGg7XG5cdCAgICAgICAgdGhpcy5kcnVua1dhbGsudmFsdWUgPSB0aGlzLnBvc2l0aW9uO1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24gPSB0aGlzLmRydW5rV2Fsay5uZXh0KCk7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIC8qIGZ1dHVyZSBtZXRob2RzXHJcblx0ICAgICAgLmdyb3VwKHN0YXJ0LHN0b3ApIC0tIG91dHB1dHMgYSBncm91cCBvZiBuIGl0ZW1zIGZyb20gdGhlIGxpc3QsIHdpdGggd3JhcHBpbmdcclxuXHQgICAgICAubG9vcChzdGFydCxzdG9wKSAtLSBjb25maW5lcyBzZXF1ZW5jaW5nIHRvIGEgc3Vic2V0IG9mIHRoZSB2YWx1ZXNcclxuXHQgICAgICAgICAgKGNvdWxkIGV2ZW4gaGF2ZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gLm9yaWdpbmFsVmFsdWVzIGFuZCB0aGUgYXJyYXkgb2YgdmFsdWVzIGJlaW5nIHVzZWQpXHJcblx0ICAgICAgKi9cblx0XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBTZXF1ZW5jZTtcblx0fSkoKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gU2VxdWVuY2U7XG5cbi8qKiovIH0pLFxuLyogMjcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfaW50ZXJvcFJlcXVpcmUgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmpbXCJkZWZhdWx0XCJdIDogb2JqOyB9O1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsgdmFyIHByb3AgPSBwcm9wc1trZXldOyBwcm9wLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChwcm9wLnZhbHVlKSBwcm9wLndyaXRhYmxlID0gdHJ1ZTsgfSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKTsgfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9O1xuXHRcblx0dmFyIG1hdGggPSBfaW50ZXJvcFJlcXVpcmUoX193ZWJwYWNrX3JlcXVpcmVfXyg1KSk7XG5cdFxuXHR2YXIgRHJ1bmsgPSAoZnVuY3Rpb24gKCkge1xuXHQgICAgZnVuY3Rpb24gRHJ1bmsoKSB7XG5cdCAgICAgICAgdmFyIG1pbiA9IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1swXTtcblx0ICAgICAgICB2YXIgbWF4ID0gYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyA5IDogYXJndW1lbnRzWzFdO1xuXHQgICAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1syXSA9PT0gdW5kZWZpbmVkID8gMCA6IGFyZ3VtZW50c1syXTtcblx0ICAgICAgICB2YXIgaW5jcmVtZW50ID0gYXJndW1lbnRzWzNdID09PSB1bmRlZmluZWQgPyAxIDogYXJndW1lbnRzWzNdO1xuXHQgICAgICAgIHZhciBsb29wID0gYXJndW1lbnRzWzRdID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGFyZ3VtZW50c1s0XTtcblx0XG5cdCAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERydW5rKTtcblx0XG5cdCAgICAgICAgdGhpcy5taW4gPSBtaW47XG5cdCAgICAgICAgdGhpcy5tYXggPSBtYXg7XG5cdCAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXHQgICAgICAgIHRoaXMuaW5jcmVtZW50ID0gaW5jcmVtZW50O1xuXHQgICAgICAgIHRoaXMubG9vcCA9IGxvb3A7XG5cdCAgICB9XG5cdFxuXHQgICAgX2NyZWF0ZUNsYXNzKERydW5rLCB7XG5cdCAgICAgICAgbmV4dDoge1xuXHQgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dCgpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gbWF0aC5waWNrKC0xICogdGhpcy5pbmNyZW1lbnQsIHRoaXMuaW5jcmVtZW50KTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlID4gdGhpcy5tYXgpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sb29wKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1pbjtcblx0ICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXggLSB0aGlzLmluY3JlbWVudDtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgPCB0aGlzLm1pbikge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvb3ApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4O1xuXHQgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1pbiArIHRoaXMuaW5jcmVtZW50O1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdFxuXHQgICAgcmV0dXJuIERydW5rO1xuXHR9KSgpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBEcnVuaztcblxuLyoqKi8gfSksXG4vKiAyOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZSA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9ialtcImRlZmF1bHRcIl0gOiBvYmo7IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgbWF0aCA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDUpKTtcblx0XG5cdHZhciBEcnVuayA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDI3KSk7XG5cdFxuXHR2YXIgQ291bnRlciA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICBmdW5jdGlvbiBDb3VudGVyKCkge1xuXHQgICAgICAgIHZhciBtaW4gPSBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IDAgOiBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgdmFyIG1heCA9IGFyZ3VtZW50c1sxXSA9PT0gdW5kZWZpbmVkID8gMTAgOiBhcmd1bWVudHNbMV07XG5cdCAgICAgICAgdmFyIG1vZGUgPSBhcmd1bWVudHNbMl0gPT09IHVuZGVmaW5lZCA/IFwidXBcIiA6IGFyZ3VtZW50c1syXTtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHNbM10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogYXJndW1lbnRzWzNdO1xuXHRcblx0ICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ291bnRlcik7XG5cdFxuXHQgICAgICAgIHRoaXMubWluID0gbWluO1xuXHQgICAgICAgIHRoaXMubWF4ID0gbWF4O1xuXHQgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuXHQgICAgICAgIHRoaXMuZHJ1bmtXYWxrID0gbmV3IERydW5rKHRoaXMubWluLCB0aGlzLm1heCk7XG5cdCAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IGZhbHNlKSB7XG5cdCAgICAgICAgICAgIHRoaXMubmV4dCA9IHRoaXNbdGhpcy5fbW9kZV07XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgdGhpcy5uZXh0ID0gdGhpcy5maXJzdDtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgX2NyZWF0ZUNsYXNzKENvdW50ZXIsIHtcblx0ICAgICAgICBtb2RlOiB7XG5cdCAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKG1vZGUpIHtcblx0ICAgICAgICAgICAgICAgIGlmICghKG1vZGUgPT09IFwidXBcIiB8fCBtb2RlID09PSBcImRvd25cIiB8fCBtb2RlID09PSBcInJhbmRvbVwiIHx8IG1vZGUgPT09IFwiZHJ1bmtcIikpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlIG9ubHkgbW9kZXMgY3VycmVudGx5IGFsbG93ZWQgYXJlOiB1cCwgZG93biwgcmFuZG9tLCBkcnVua1wiKTtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLl9tb2RlID0gbW9kZTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0ID0gdGhpc1t0aGlzLl9tb2RlXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9kZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZmlyc3Q6IHtcblx0ICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZpcnN0KCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IGZhbHNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0ID0gdGhpc1t0aGlzLl9tb2RlXTtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0VmFsdWVzID0ge1xuXHQgICAgICAgICAgICAgICAgICAgIHVwOiB0aGlzLm1pbixcblx0ICAgICAgICAgICAgICAgICAgICBkb3duOiB0aGlzLm1heCxcblx0ICAgICAgICAgICAgICAgICAgICBkcnVuazogfiB+bWF0aC5hdmVyYWdlKHRoaXMubWluLCB0aGlzLm1heCksXG5cdCAgICAgICAgICAgICAgICAgICAgcmFuZG9tOiBtYXRoLnJpKHRoaXMubWluLCB0aGlzLm1heClcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5zdGFydFZhbHVlc1t0aGlzLl9tb2RlXTtcblx0ICAgICAgICAgICAgICAgIHRoaXMubmV4dCA9IHRoaXNbdGhpcy5fbW9kZV07XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgdXA6IHtcblx0ICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHVwKCkge1xuXHQgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSsrO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgPj0gdGhpcy5tYXgpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5taW47XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgZG93bjoge1xuXHQgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZG93bigpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMudmFsdWUtLTtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlIDwgdGhpcy5taW4pIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXg7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH0sXG5cdCAgICAgICAgcmFuZG9tOiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByYW5kb20oKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbWF0aC5yaSh0aGlzLm1pbiwgdGhpcy5tYXgpO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIGRydW5rOiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBkcnVuaygpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuZHJ1bmtXYWxrLm1pbiA9IHRoaXMubWluO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5kcnVua1dhbGsubWF4ID0gdGhpcy5tYXg7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmRydW5rV2Fsay52YWx1ZSA9IHRoaXMudmFsdWU7XG5cdCAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5kcnVua1dhbGsubmV4dCgpO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0XG5cdCAgICByZXR1cm4gQ291bnRlcjtcblx0fSkoKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gQ291bnRlcjtcblxuLyoqKi8gfSksXG4vKiAyOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChvYmplY3QsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MgJiYgZGVzYy53cml0YWJsZSkgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH07XG5cdFxuXHR2YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH07XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgc3ZnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyIG1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHR2YXIgSW50ZXJmYWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0dmFyIFN0ZXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblx0XG5cdHZhciBJbnRlcmFjdGlvbiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9fd2VicGFja19yZXF1aXJlX18oMTIpKTtcblx0XG5cdC8qKlxuXHQqIFBhbjJEXG5cdCpcblx0KiBAZGVzY3JpcHRpb24gSW50ZXJmYWNlIGZvciBtb3ZpbmcgYSBzb3VuZCBhcm91bmQgYW4gYXJyYXkgb2Ygc3BlYWtlcnMuIFNwZWFrZXIgbG9jYXRpb25zIGNhbiBiZSBjdXN0b21pemVkLiBUaGUgaW50ZXJmYWNlIGNhbGN1bGF0ZXMgdGhlIGNsb3NlbmVzcyBvZiB0aGUgc291bmQgc291cmNlIHRvIGVhY2ggc3BlYWtlciBhbmQgcmV0dXJucyB0aGF0IGRpc3RhbmNlIGFzIGEgbnVtZXJpYyB2YWx1ZS5cblx0KlxuXHQqIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwicGFuMkRcIj48L3NwYW4+XG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBwYW4yZCA9IG5ldyBOZXh1cy5QYW4yZCgnI3RhcmdldCcpXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBwYW4yZCA9IG5ldyBOZXh1cy5QYW4yRCgnI3RhcmdldCcse1xuXHQqICAgJ3NpemUnOiBbMjAwLDIwMF0sXG5cdCogICAncmFuZ2UnOiAwLjUsICAvLyBkZXRlY3Rpb24gcmFkaXVzIG9mIGVhY2ggc3BlYWtlclxuXHQqICAgJ21vZGUnOiAnYWJzb2x1dGUnLCAgIC8vICdhYnNvbHV0ZScgb3IgJ3JlbGF0aXZlJyBzb3VuZCBtb3ZlbWVudFxuXHQqICAgJ3NwZWFrZXJzJzogWyAgLy8gdGhlIHNwZWFrZXIgW3gseV0gcG9zaXRpb25zXG5cdCogICAgICAgWzAuNSwwLjJdLFxuXHQqICAgICAgIFswLjc1LDAuMjVdLFxuXHQqICAgICAgIFswLjgsMC41XSxcblx0KiAgICAgICBbMC43NSwwLjc1XSxcblx0KiAgICAgICBbMC41LDAuOF0sXG5cdCogICAgICAgWzAuMjUsMC43NV1cblx0KiAgICAgICBbMC4yLDAuNV0sXG5cdCogICAgICAgWzAuMjUsMC4yNV1cblx0KiAgIF1cblx0KiB9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqIGNoYW5nZVxuXHQqIEZpcmVzIGFueSB0aW1lIHRoZSBcInNvdXJjZVwiIG5vZGUncyBwb3NpdGlvbiBjaGFuZ2VzLiA8YnI+XG5cdCogVGhlIGV2ZW50IGRhdGEgaXMgYW4gYXJyYXkgb2YgdGhlIGFtcGxpdHVkZXMgKDAtMSksIHJlcHJlc2VudGluZyB0aGUgbGV2ZWwgb2YgZWFjaCBzcGVha2VyIChhcyBjYWxjdWxhdGVkIGJ5IGl0cyBkaXN0YW5jZSB0byB0aGUgYXVkaW8gc291cmNlKS5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogcGFuMmQub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuXHQqICAgY29uc29sZS5sb2codik7XG5cdCogfSlcblx0KlxuXHQqL1xuXHRcblx0dmFyIFBhbjJEID0gKGZ1bmN0aW9uIChfSW50ZXJmYWNlKSB7XG5cdCAgZnVuY3Rpb24gUGFuMkQoKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFuMkQpO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1wicmFuZ2VcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbMjAwLCAyMDBdLFxuXHQgICAgICByYW5nZTogMC41LFxuXHQgICAgICBtb2RlOiBcImFic29sdXRlXCIsXG5cdCAgICAgIHNwZWFrZXJzOiBbWzAuNSwgMC4yXSwgWzAuNzUsIDAuMjVdLCBbMC44LCAwLjVdLCBbMC43NSwgMC43NV0sIFswLjUsIDAuOF0sIFswLjI1LCAwLjc1XSwgWzAuMiwgMC41XSwgWzAuMjUsIDAuMjVdXVxuXHQgICAgfTtcblx0XG5cdCAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihQYW4yRC5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgYXJndW1lbnRzLCBvcHRpb25zLCBkZWZhdWx0cyk7XG5cdFxuXHQgICAgdGhpcy52YWx1ZSA9IHtcblx0ICAgICAgeDogbmV3IFN0ZXAoMCwgMSwgMCwgMC41KSxcblx0ICAgICAgeTogbmV3IFN0ZXAoMCwgMSwgMCwgMC41KVxuXHQgICAgfTtcblx0XG5cdCAgICAvKipcblx0ICAgIEFic29sdXRlIG9yIHJlbGF0aXZlIG1vdXNlIGludGVyYWN0aW9uLiBJbiBcImFic29sdXRlXCIgbW9kZSwgdGhlIHNvdXJjZSBub2RlIHdpbGwganVtcCB0byB5b3VyIG1vdXNlIHBvc2l0aW9uIG9uIG1vdXNlIGNsaWNrLiBJbiBcInJlbGF0aXZlXCIgbW9kZSwgaXQgZG9lcyBub3QuXG5cdCAgICAqL1xuXHQgICAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5tb2RlO1xuXHRcblx0ICAgIHRoaXMucG9zaXRpb24gPSB7XG5cdCAgICAgIHg6IG5ldyBJbnRlcmFjdGlvbi5IYW5kbGUodGhpcy5tb2RlLCBcImhvcml6b250YWxcIiwgWzAsIHRoaXMud2lkdGhdLCBbdGhpcy5oZWlnaHQsIDBdKSxcblx0ICAgICAgeTogbmV3IEludGVyYWN0aW9uLkhhbmRsZSh0aGlzLm1vZGUsIFwidmVydGljYWxcIiwgWzAsIHRoaXMud2lkdGhdLCBbdGhpcy5oZWlnaHQsIDBdKVxuXHQgICAgfTtcblx0ICAgIHRoaXMucG9zaXRpb24ueC52YWx1ZSA9IHRoaXMudmFsdWUueC5ub3JtYWxpemVkO1xuXHQgICAgdGhpcy5wb3NpdGlvbi55LnZhbHVlID0gdGhpcy52YWx1ZS55Lm5vcm1hbGl6ZWQ7XG5cdFxuXHQgICAgLyoqXG5cdCAgICBBbiBhcnJheSBvZiBzcGVha2VyIGxvY2F0aW9ucy4gVXBkYXRlIHRoaXMgd2l0aCAubW92ZVNwZWFrZXIoKSBvciAubW92ZUFsbFNwZWFrZXJzKClcblx0ICAgICovXG5cdCAgICB0aGlzLnNwZWFrZXJzID0gdGhpcy5zZXR0aW5ncy5zcGVha2Vycztcblx0XG5cdCAgICAvKipcblx0ICAgIFJld3JpdGU6IFRoZSBtYXhpbXVtIGRpc3RhbmNlIGZyb20gYSBzcGVha2VyIHRoYXQgdGhlIHNvdXJjZSBub2RlIGNhbiBiZSBmb3IgaXQgdG8gYmUgaGVhcmQgZnJvbSB0aGF0IHNwZWFrZXIuIEEgbG93IHJhbmdlICgwLjEpIHdpbGwgcmVzdWx0IGluIHNwZWFrZXJzIG9ubHkgcGxheWluZyB3aGVuIHRoZSBzb3VuZCBpcyB2ZXJ5IGNsb3NlIGl0LiBEZWZhdWx0IGlzIDAuNSAoaGFsZiBvZiB0aGUgaW50ZXJmYWNlKS5cblx0ICAgICovXG5cdCAgICB0aGlzLnJhbmdlID0gdGhpcy5zZXR0aW5ncy5yYW5nZTtcblx0XG5cdCAgICAvKipcblx0ICAgIFRoZSBjdXJyZW50IGxldmVscyBmb3IgZWFjaCBzcGVha2VyLiBUaGlzIGlzIGNhbGN1bGF0ZWQgd2hlbiBhIHNvdXJjZSBub2RlIG9yIHNwZWFrZXIgbm9kZSBpcyBtb3ZlZCB0aHJvdWdoIGludGVyYWN0aW9uIG9yIHByb2dyYW1hdGljYWxseS5cblx0ICAgICovXG5cdCAgICB0aGlzLmxldmVscyA9IFtdO1xuXHRcblx0ICAgIHRoaXMuaW5pdCgpO1xuXHRcblx0ICAgIHRoaXMuY2FsY3VsYXRlTGV2ZWxzKCk7XG5cdCAgICB0aGlzLnJlbmRlcigpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKFBhbjJELCBfSW50ZXJmYWNlKTtcblx0XG5cdCAgX2NyZWF0ZUNsYXNzKFBhbjJELCB7XG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMua25vYiA9IHN2Zy5jcmVhdGUoXCJjaXJjbGVcIik7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmtub2IpO1xuXHRcblx0ICAgICAgICAvLyBhZGQgc3BlYWtlcnNcblx0ICAgICAgICB0aGlzLnNwZWFrZXJFbGVtZW50cyA9IFtdO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3BlYWtlcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIHZhciBzcGVha2VyRWxlbWVudCA9IHN2Zy5jcmVhdGUoXCJjaXJjbGVcIik7XG5cdFxuXHQgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHNwZWFrZXJFbGVtZW50KTtcblx0XG5cdCAgICAgICAgICB0aGlzLnNwZWFrZXJFbGVtZW50cy5wdXNoKHNwZWFrZXJFbGVtZW50KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzaXplSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICB0aGlzLl9taW5EaW1lbnNpb24gPSBNYXRoLm1pbih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG5cdFxuXHQgICAgICAgIHRoaXMua25vYlJhZGl1cyA9IHtcblx0ICAgICAgICAgIG9mZjogfiB+KHRoaXMuX21pbkRpbWVuc2lvbiAvIDEwMCkgKiAzICsgNSB9O1xuXHQgICAgICAgIHRoaXMua25vYlJhZGl1cy5vbiA9IHRoaXMua25vYlJhZGl1cy5vZmYgKiAyO1xuXHRcblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3hcIiwgdGhpcy53aWR0aCAvIDIpO1xuXHQgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmhlaWdodCAvIDIpO1xuXHQgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJyXCIsIHRoaXMua25vYlJhZGl1cy5vZmYpO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3BlYWtlcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIHZhciBzcGVha2VyRWxlbWVudCA9IHRoaXMuc3BlYWtlckVsZW1lbnRzW2ldO1xuXHQgICAgICAgICAgdmFyIHNwZWFrZXIgPSB0aGlzLnNwZWFrZXJzW2ldO1xuXHQgICAgICAgICAgc3BlYWtlckVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY3hcIiwgc3BlYWtlclswXSAqIHRoaXMud2lkdGgpO1xuXHQgICAgICAgICAgc3BlYWtlckVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY3lcIiwgc3BlYWtlclsxXSAqIHRoaXMuaGVpZ2h0KTtcblx0ICAgICAgICAgIHNwZWFrZXJFbGVtZW50LnNldEF0dHJpYnV0ZShcInJcIiwgdGhpcy5fbWluRGltZW5zaW9uIC8gMjAgKyA1KTtcblx0ICAgICAgICAgIHNwZWFrZXJFbGVtZW50LnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBcIjBcIik7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLngucmVzaXplKFswLCB0aGlzLndpZHRoXSwgW3RoaXMuaGVpZ2h0LCAwXSk7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi55LnJlc2l6ZShbMCwgdGhpcy53aWR0aF0sIFt0aGlzLmhlaWdodCwgMF0pO1xuXHRcblx0ICAgICAgICAvLyBuZXh0LCBuZWVkIHRvXG5cdCAgICAgICAgLy8gcmVzaXplIHBvc2l0aW9uc1xuXHQgICAgICAgIC8vIGNhbGN1bGF0ZSBzcGVha2VyIGRpc3RhbmNlc1xuXHQgICAgICAgIHRoaXMuY2FsY3VsYXRlTGV2ZWxzKCk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQpO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3BlYWtlcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIHZhciBzcGVha2VyRWxlbWVudCA9IHRoaXMuc3BlYWtlckVsZW1lbnRzW2ldO1xuXHQgICAgICAgICAgc3BlYWtlckVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgICAgc3BlYWtlckVsZW1lbnQuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVuZGVyOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgICAgdGhpcy5rbm9iQ29vcmRpbmF0ZXMgPSB7XG5cdCAgICAgICAgICB4OiB0aGlzLnZhbHVlLngubm9ybWFsaXplZCAqIHRoaXMud2lkdGgsXG5cdCAgICAgICAgICB5OiB0aGlzLmhlaWdodCAtIHRoaXMudmFsdWUueS5ub3JtYWxpemVkICogdGhpcy5oZWlnaHRcblx0ICAgICAgICB9O1xuXHRcblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3hcIiwgdGhpcy5rbm9iQ29vcmRpbmF0ZXMueCk7XG5cdCAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImN5XCIsIHRoaXMua25vYkNvb3JkaW5hdGVzLnkpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2xpY2s6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsaWNrKCkge1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24ueC5hbmNob3IgPSB0aGlzLm1vdXNlO1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24ueS5hbmNob3IgPSB0aGlzLm1vdXNlO1xuXHQgICAgICAgIHRoaXMubW92ZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbW92ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZSgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jbGlja2VkKSB7XG5cdCAgICAgICAgICB0aGlzLnBvc2l0aW9uLngudXBkYXRlKHRoaXMubW91c2UpO1xuXHQgICAgICAgICAgdGhpcy5wb3NpdGlvbi55LnVwZGF0ZSh0aGlzLm1vdXNlKTtcblx0ICAgICAgICAgIC8vIHBvc2l0aW9uLnggYW5kIHBvc2l0aW9uLnkgYXJlIG5vcm1hbGl6ZWRcblx0ICAgICAgICAgIC8vIHNvIGFyZSB0aGUgbGV2ZWxzXG5cdCAgICAgICAgICAvLyBsaWtlbHkgZG9uJ3QgbmVlZCB0aGlzLnZhbHVlIGF0IGFsbCAtLSBvbmx5IHVzZWQgZm9yIGRyYXdpbmdcblx0ICAgICAgICAgIC8vIG5vdCBnb2luZyB0byBiZSBhICdzdGVwJyBvciAnbWluJyBhbmQgJ21heCcgaW4gdGhpcyBvbmUuXG5cdCAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUxldmVscygpO1xuXHQgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMubGV2ZWxzKTtcblx0ICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVsZWFzZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVsZWFzZSgpIHtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbm9ybWFsaXplZDoge1xuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgeDogdGhpcy52YWx1ZS54Lm5vcm1hbGl6ZWQsXG5cdCAgICAgICAgICB5OiB0aGlzLnZhbHVlLnkubm9ybWFsaXplZFxuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjYWxjdWxhdGVMZXZlbHM6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNhbGN1bGF0ZUxldmVscygpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICB0aGlzLnZhbHVlLngudXBkYXRlTm9ybWFsKHRoaXMucG9zaXRpb24ueC52YWx1ZSk7XG5cdCAgICAgICAgdGhpcy52YWx1ZS55LnVwZGF0ZU5vcm1hbCh0aGlzLnBvc2l0aW9uLnkudmFsdWUpO1xuXHQgICAgICAgIHRoaXMubGV2ZWxzID0gW107XG5cdCAgICAgICAgdGhpcy5zcGVha2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChzLCBpKSB7XG5cdCAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBtYXRoLmRpc3RhbmNlKHNbMF0gKiBfdGhpcy53aWR0aCwgc1sxXSAqIF90aGlzLmhlaWdodCwgX3RoaXMucG9zaXRpb24ueC52YWx1ZSAqIF90aGlzLndpZHRoLCAoMSAtIF90aGlzLnBvc2l0aW9uLnkudmFsdWUpICogX3RoaXMuaGVpZ2h0KTtcblx0ICAgICAgICAgIHZhciBsZXZlbCA9IG1hdGguY2xpcCgxIC0gZGlzdGFuY2UgLyAoX3RoaXMucmFuZ2UgKiBfdGhpcy53aWR0aCksIDAsIDEpO1xuXHQgICAgICAgICAgX3RoaXMubGV2ZWxzLnB1c2gobGV2ZWwpO1xuXHQgICAgICAgICAgX3RoaXMuc3BlYWtlckVsZW1lbnRzW2ldLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBsZXZlbCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtb3ZlU291cmNlOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgTW92ZSB0aGUgYXVkaW8gc291cmNlIG5vZGUgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cblx0ICAgICAgQHBhcmFtIHgge251bWJlcn0gTmV3IHggbG9jYXRpb24sIG5vcm1hbGl6ZWQgMC0xXG5cdCAgICAgIEBwYXJhbSB5IHtudW1iZXJ9IE5ldyB5IGxvY2F0aW9uLCBub3JtYWxpemVkIDAtMVxuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1vdmVTb3VyY2UoeCwgeSkge1xuXHQgICAgICAgIHZhciBsb2NhdGlvbiA9IHtcblx0ICAgICAgICAgIHg6IHggKiB0aGlzLndpZHRoLFxuXHQgICAgICAgICAgeTogeSAqIHRoaXMuaGVpZ2h0XG5cdCAgICAgICAgfTtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLngudXBkYXRlKGxvY2F0aW9uKTtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLnkudXBkYXRlKGxvY2F0aW9uKTtcblx0ICAgICAgICB0aGlzLmNhbGN1bGF0ZUxldmVscygpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLmxldmVscyk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1vdmVTcGVha2VyOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgTW92ZSBhIHNwZWFrZXIgbm9kZSBhbmQgdHJpZ2dlciB0aGUgb3V0cHV0IGV2ZW50LlxuXHQgICAgICBAcGFyYW0gaW5kZXgge251bWJlcn0gSW5kZXggb2YgdGhlIHNwZWFrZXIgdG8gbW92ZVxuXHQgICAgICBAcGFyYW0geCB7bnVtYmVyfSBOZXcgeCBsb2NhdGlvbiwgbm9ybWFsaXplZCAwLTFcblx0ICAgICAgQHBhcmFtIHkge251bWJlcn0gTmV3IHkgbG9jYXRpb24sIG5vcm1hbGl6ZWQgMC0xXG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZVNwZWFrZXIoaW5kZXgsIHgsIHkpIHtcblx0XG5cdCAgICAgICAgdGhpcy5zcGVha2Vyc1tpbmRleF0gPSBbeCwgeV07XG5cdCAgICAgICAgdGhpcy5zcGVha2VyRWxlbWVudHNbaW5kZXhdLnNldEF0dHJpYnV0ZShcImN4XCIsIHggKiB0aGlzLndpZHRoKTtcblx0ICAgICAgICB0aGlzLnNwZWFrZXJFbGVtZW50c1tpbmRleF0uc2V0QXR0cmlidXRlKFwiY3lcIiwgeSAqIHRoaXMuaGVpZ2h0KTtcblx0ICAgICAgICB0aGlzLmNhbGN1bGF0ZUxldmVscygpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLmxldmVscyk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFNldCBhbGwgc3BlYWtlciBsb2NhdGlvbnNcblx0ICAgICAgQHBhcmFtIGxvY2F0aW9ucyB7QXJyYXl9IEFycmF5IG9mIHNwZWFrZXIgbG9jYXRpb25zLiBFYWNoIGl0ZW0gaW4gdGhlIGFycmF5IHNob3VsZCBiZSBhbiBhcnJheSBvZiBub3JtYWxpemVkIHggYW5kIHkgY29vcmRpbmF0ZXMuXG5cdCAgICAgICBzZXRTcGVha2Vycyhsb2NhdGlvbnMpIHtcblx0ICAgICAgIH1cblx0ICAgICAgKi9cblx0XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBQYW4yRDtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gUGFuMkQ7XG5cbi8qKiovIH0pLFxuLyogMzAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBtYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0dmFyIHN2ZyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBJbnRlcmZhY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHRcblx0LyoqXG5cdCogVGlsdFxuXHQqXG5cdCogQGRlc2NyaXB0aW9uIERldmljZSB0aWx0IHNlbnNvciB3aXRoIDIgb3IgMyBheGVzIChkZXBlbmRpbmcgb24geW91ciBkZXZpY2UgYW5kIGJyb3dzZXIpLlxuXHQqXG5cdCogQGRlbW8gPHNwYW4gbmV4dXMtdWk9J3RpbHQnPjwvc3Bhbj5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIHRpbHQgPSBuZXcgTmV4dXMuVGlsdCgnI3RhcmdldCcpXG5cdCpcblx0KiBAb3V0cHV0XG5cdCogY2hhbmdlXG5cdCogRmlyZXMgYXQgYSByZWd1bGFyIGludGVydmFsLCBhcyBsb25nIGFzIHRoaXMgaW50ZXJmYWNlIGlzIGFjdGl2ZSAoc2VlIHRoZSBpbnRlcmZhY2UncyA8aT4uYWN0aXZlPC9pPiBwcm9wZXJ0eSk8YnI+XG5cdCogVGhlIGV2ZW50IGRhdGEgaXMgYW4gPGk+b2JqZWN0PC9pPiBjb250YWluaW5nIHggKG51bWJlcikgYW5kIHkgKG51bWJlcikgcHJvcGVydGllcyB3aGljaCByZXByZXNlbnQgdGhlIGN1cnJlbnQgdGlsdCBzdGF0ZSBvZiB0aGUgZGV2aWNlLlxuXHQqXG5cdCogQG91dHB1dGV4YW1wbGVcblx0KiB0aWx0Lm9uKCdjaGFuZ2UnLGZ1bmN0aW9uKHYpIHtcblx0KiAgIGNvbnNvbGUubG9nKHYpO1xuXHQqIH0pXG5cdCpcblx0KlxuXHQqL1xuXHRcblx0dmFyIFRpbHQgPSAoZnVuY3Rpb24gKF9JbnRlcmZhY2UpIHtcblx0ICBmdW5jdGlvbiBUaWx0KCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRpbHQpO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1widmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbODAsIDgwXVxuXHQgICAgfTtcblx0XG5cdCAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUaWx0LnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuXHRcblx0ICAgIHRoaXMuaW5pdCgpO1xuXHRcblx0ICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lciBmb3IgZGV2aWNlIG9yaWVudGF0aW9uXG5cdFxuXHQgICAgdGhpcy5ib3VuZFVwZGF0ZSA9IHRoaXMudXBkYXRlLmJpbmQodGhpcyk7XG5cdCAgICAvL1x0dGhpcy5ib3VuZE1velRpbHQgPSB0aGlzLm1velRpbHQuYmluZCh0aGlzKVxuXHRcblx0ICAgIGlmICh3aW5kb3cuRGV2aWNlT3JpZW50YXRpb25FdmVudCkge1xuXHQgICAgICB0aGlzLm9yaWVudGF0aW9uTGlzdGVuZXIgPSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImRldmljZW9yaWVudGF0aW9uXCIsIHRoaXMuYm91bmRVcGRhdGUsIGZhbHNlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXHQgICAgICB0aGlzLmNvbG9ySW50ZXJmYWNlKCk7XG5cdCAgICB9XG5cdFxuXHQgICAgLyplbHNlIGlmICh3aW5kb3cuT3JpZW50YXRpb25FdmVudCkge1xuXHQgICAgLy9cdCAgXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignTW96T3JpZW50YXRpb24nLCB0aGlzLmJvdW5kTW96VGlsdCwgZmFsc2UpO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgIGNvbnNvbGUubG9nKCdOb3Qgc3VwcG9ydGVkIG9uIHlvdXIgZGV2aWNlIG9yIGJyb3dzZXIuJyk7XG5cdCAgICB9ICovXG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoVGlsdCwgX0ludGVyZmFjZSk7XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhUaWx0LCB7XG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMudGl0bGUgPSBzdmcuY3JlYXRlKFwidGV4dFwiKTtcblx0ICAgICAgICB0aGlzLmNpcmNsZVggPSBzdmcuY3JlYXRlKFwiY2lyY2xlXCIpO1xuXHQgICAgICAgIHRoaXMuY2lyY2xlWSA9IHN2Zy5jcmVhdGUoXCJjaXJjbGVcIik7XG5cdCAgICAgICAgdGhpcy5jaXJjbGVaID0gc3ZnLmNyZWF0ZShcImNpcmNsZVwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5iYXJYID0gc3ZnLmNyZWF0ZShcInBhdGhcIik7XG5cdCAgICAgICAgdGhpcy5iYXJZID0gc3ZnLmNyZWF0ZShcInBhdGhcIik7XG5cdCAgICAgICAgdGhpcy5iYXJaID0gc3ZnLmNyZWF0ZShcInBhdGhcIik7XG5cdFxuXHQgICAgICAgIHRoaXMuYmFyWDIgPSBzdmcuY3JlYXRlKFwicGF0aFwiKTtcblx0ICAgICAgICB0aGlzLmJhclkyID0gc3ZnLmNyZWF0ZShcInBhdGhcIik7XG5cdCAgICAgICAgdGhpcy5iYXJaMiA9IHN2Zy5jcmVhdGUoXCJwYXRoXCIpO1xuXHRcblx0ICAgICAgICB0aGlzLmJhclguc2V0QXR0cmlidXRlKFwib3BhY2l0eVwiLCBcIjAuOFwiKTtcblx0ICAgICAgICB0aGlzLmJhclkuc2V0QXR0cmlidXRlKFwib3BhY2l0eVwiLCBcIjAuOFwiKTtcblx0ICAgICAgICB0aGlzLmJhclouc2V0QXR0cmlidXRlKFwib3BhY2l0eVwiLCBcIjAuOFwiKTtcblx0ICAgICAgICB0aGlzLmJhclgyLnNldEF0dHJpYnV0ZShcIm9wYWNpdHlcIiwgXCIwLjhcIik7XG5cdCAgICAgICAgdGhpcy5iYXJZMi5zZXRBdHRyaWJ1dGUoXCJvcGFjaXR5XCIsIFwiMC44XCIpO1xuXHQgICAgICAgIHRoaXMuYmFyWjIuc2V0QXR0cmlidXRlKFwib3BhY2l0eVwiLCBcIjAuOFwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5jaXJjbGVYLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMud2lkdGggKiAzIC8gMTIpO1xuXHQgICAgICAgIHRoaXMuY2lyY2xlWC5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmhlaWdodCAqIDMgLyA0KTtcblx0ICAgICAgICB0aGlzLmNpcmNsZVguc2V0QXR0cmlidXRlKFwiclwiLCB0aGlzLmhlaWdodCAvIDEwKTtcblx0ICAgICAgICB0aGlzLmNpcmNsZVguc2V0QXR0cmlidXRlKFwib3BhY2l0eVwiLCBcIjAuNFwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5jaXJjbGVZLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMud2lkdGggKiA2IC8gMTIpO1xuXHQgICAgICAgIHRoaXMuY2lyY2xlWS5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmhlaWdodCAqIDMgLyA0KTtcblx0ICAgICAgICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKFwiclwiLCB0aGlzLmhlaWdodCAvIDEwKTtcblx0ICAgICAgICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKFwib3BhY2l0eVwiLCBcIjAuNFwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5jaXJjbGVaLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMud2lkdGggKiA5IC8gMTIpO1xuXHQgICAgICAgIHRoaXMuY2lyY2xlWi5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmhlaWdodCAqIDMgLyA0KTtcblx0ICAgICAgICB0aGlzLmNpcmNsZVouc2V0QXR0cmlidXRlKFwiclwiLCB0aGlzLmhlaWdodCAvIDEwKTtcblx0ICAgICAgICB0aGlzLmNpcmNsZVouc2V0QXR0cmlidXRlKFwib3BhY2l0eVwiLCBcIjAuNFwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5iYXJYLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0IC8gMzApKTtcblx0ICAgICAgICB0aGlzLmJhclkuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsIE1hdGgucm91bmQodGhpcy5oZWlnaHQgLyAzMCkpO1xuXHQgICAgICAgIHRoaXMuYmFyWi5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIiwgTWF0aC5yb3VuZCh0aGlzLmhlaWdodCAvIDMwKSk7XG5cdFxuXHQgICAgICAgIHRoaXMuYmFyWC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwibm9uZVwiKTtcblx0ICAgICAgICB0aGlzLmJhclkuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cdCAgICAgICAgdGhpcy5iYXJaLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJub25lXCIpO1xuXHRcblx0ICAgICAgICB0aGlzLmJhclgyLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0IC8gMzApKTtcblx0ICAgICAgICB0aGlzLmJhclkyLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0IC8gMzApKTtcblx0ICAgICAgICB0aGlzLmJhcloyLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCBNYXRoLnJvdW5kKHRoaXMuaGVpZ2h0IC8gMzApKTtcblx0XG5cdCAgICAgICAgdGhpcy5iYXJYMi5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIFwibm9uZVwiKTtcblx0ICAgICAgICB0aGlzLmJhclkyLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgXCJub25lXCIpO1xuXHQgICAgICAgIHRoaXMuYmFyWjIuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cdFxuXHQgICAgICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKFwieFwiLCB0aGlzLndpZHRoIC8gMik7XG5cdCAgICAgICAgdGhpcy50aXRsZS5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHRoaXMuaGVpZ2h0IC8gMyArIDcpO1xuXHQgICAgICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKFwiZm9udC1zaXplXCIsIFwiMTVweFwiKTtcblx0ICAgICAgICB0aGlzLnRpdGxlLnNldEF0dHJpYnV0ZShcImZvbnQtd2VpZ2h0XCIsIFwiYm9sZFwiKTtcblx0ICAgICAgICB0aGlzLnRpdGxlLnNldEF0dHJpYnV0ZShcImxldHRlci1zcGFjaW5nXCIsIFwiMnB4XCIpO1xuXHQgICAgICAgIHRoaXMudGl0bGUuc2V0QXR0cmlidXRlKFwib3BhY2l0eVwiLCBcIjAuN1wiKTtcblx0ICAgICAgICB0aGlzLnRpdGxlLnNldEF0dHJpYnV0ZShcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpO1xuXHQgICAgICAgIHRoaXMudGl0bGUudGV4dENvbnRlbnQgPSBcIlRJTFRcIjtcblx0XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY2lyY2xlWCk7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY2lyY2xlWSk7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuY2lyY2xlWik7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmJhclgpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmJhclkpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmJhclopO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5iYXJYMik7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuYmFyWTIpO1xuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmJhcloyKTtcblx0XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudGl0bGUpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29sb3JJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbG9ySW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuXHQgICAgICAgICAgdGhpcy5jaXJjbGVYLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMubGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5jaXJjbGVZLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMubGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5jaXJjbGVaLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMubGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5jaXJjbGVYLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5saWdodCk7XG5cdCAgICAgICAgICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3JzLmxpZ2h0KTtcblx0ICAgICAgICAgIHRoaXMuY2lyY2xlWi5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMubGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5iYXJYLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5saWdodCk7XG5cdCAgICAgICAgICB0aGlzLmJhclkuc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3JzLmxpZ2h0KTtcblx0ICAgICAgICAgIHRoaXMuYmFyWi5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMubGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5iYXJYMi5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMubGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5iYXJZMi5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMubGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5iYXJaMi5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMubGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy50aXRsZS5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmxpZ2h0KTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgICB0aGlzLmNpcmNsZVguc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgICB0aGlzLmNpcmNsZVouc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgICB0aGlzLmNpcmNsZVguc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcblx0ICAgICAgICAgIHRoaXMuY2lyY2xlWS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5jaXJjbGVaLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgICB0aGlzLmJhclguc2V0QXR0cmlidXRlKFwic3Ryb2tlXCIsIHRoaXMuY29sb3JzLm1lZGl1bUxpZ2h0KTtcblx0ICAgICAgICAgIHRoaXMuYmFyWS5zZXRBdHRyaWJ1dGUoXCJzdHJva2VcIiwgdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5iYXJaLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgICB0aGlzLmJhclgyLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgICB0aGlzLmJhclkyLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgICB0aGlzLmJhcloyLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5tZWRpdW1MaWdodCk7XG5cdCAgICAgICAgICB0aGlzLnRpdGxlLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMubWVkaXVtTGlnaHQpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVwZGF0ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKHYpIHtcblx0ICAgICAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG5cdFxuXHQgICAgICAgICAgdmFyIHkgPSB2LmJldGE7XG5cdCAgICAgICAgICB2YXIgeCA9IHYuZ2FtbWE7XG5cdCAgICAgICAgICB2YXIgeiA9IHYuYWxwaGE7XG5cdFxuXHQgICAgICAgICAgLy8gdGFrZSB0aGUgb3JpZ2luYWwgLTkwIHRvIDkwIHNjYWxlIGFuZCBub3JtYWxpemUgaXQgMC0xXG5cdCAgICAgICAgICB4ID0gbWF0aC5zY2FsZSh4LCAtOTAsIDkwLCAwLCAxKTtcblx0ICAgICAgICAgIHkgPSBtYXRoLnNjYWxlKHksIC05MCwgOTAsIDAsIDEpO1xuXHQgICAgICAgICAgeiA9IG1hdGguc2NhbGUoeiwgMCwgMzYwLCAwLCAxKTtcblx0XG5cdCAgICAgICAgICB2YXIgaGFuZGxlUG9pbnRzID0ge1xuXHQgICAgICAgICAgICBzdGFydDogTWF0aC5QSSAqIDEuNSxcblx0ICAgICAgICAgICAgZW5kOiBtYXRoLmNsaXAobWF0aC5zY2FsZSh4LCAwLCAwLjUsIE1hdGguUEkgKiAxLjUsIE1hdGguUEkgKiAwLjUpLCBNYXRoLlBJICogMC41LCBNYXRoLlBJICogMS41KVxuXHQgICAgICAgICAgfTtcblx0ICAgICAgICAgIHZhciBoYW5kbGUyUG9pbnRzID0ge1xuXHQgICAgICAgICAgICBzdGFydDogTWF0aC5QSSAqIDIuNSxcblx0ICAgICAgICAgICAgZW5kOiBtYXRoLmNsaXAobWF0aC5zY2FsZSh4LCAwLjUsIDEsIE1hdGguUEkgKiAyLjUsIE1hdGguUEkgKiAxLjUpLCBNYXRoLlBJICogMS41LCBNYXRoLlBJICogMi41KVxuXHQgICAgICAgICAgfTtcblx0XG5cdCAgICAgICAgICB2YXIgaGFuZGxlUGF0aCA9IHN2Zy5hcmModGhpcy5jaXJjbGVYLmN4LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWC5jeS5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVguci5iYXNlVmFsLnZhbHVlLCBoYW5kbGVQb2ludHMuc3RhcnQsIGhhbmRsZVBvaW50cy5lbmQpO1xuXHQgICAgICAgICAgdmFyIGhhbmRsZTJQYXRoID0gc3ZnLmFyYyh0aGlzLmNpcmNsZVguY3guYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVYLmN5LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWC5yLmJhc2VWYWwudmFsdWUsIGhhbmRsZTJQb2ludHMuc3RhcnQsIGhhbmRsZTJQb2ludHMuZW5kKTtcblx0XG5cdCAgICAgICAgICB0aGlzLmJhclguc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGVQYXRoKTtcblx0ICAgICAgICAgIHRoaXMuYmFyWDIuc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGUyUGF0aCk7XG5cdFxuXHQgICAgICAgICAgaGFuZGxlUG9pbnRzID0ge1xuXHQgICAgICAgICAgICBzdGFydDogTWF0aC5QSSAqIDEuNSxcblx0ICAgICAgICAgICAgZW5kOiBtYXRoLmNsaXAobWF0aC5zY2FsZSh5LCAwLCAwLjUsIE1hdGguUEkgKiAxLjUsIE1hdGguUEkgKiAwLjUpLCBNYXRoLlBJICogMC41LCBNYXRoLlBJICogMS41KVxuXHQgICAgICAgICAgfTtcblx0ICAgICAgICAgIGhhbmRsZTJQb2ludHMgPSB7XG5cdCAgICAgICAgICAgIHN0YXJ0OiBNYXRoLlBJICogMi41LFxuXHQgICAgICAgICAgICBlbmQ6IG1hdGguY2xpcChtYXRoLnNjYWxlKHksIDAuNSwgMSwgTWF0aC5QSSAqIDIuNSwgTWF0aC5QSSAqIDEuNSksIE1hdGguUEkgKiAxLjUsIE1hdGguUEkgKiAyLjUpXG5cdCAgICAgICAgICB9O1xuXHRcblx0ICAgICAgICAgIGhhbmRsZVBhdGggPSBzdmcuYXJjKHRoaXMuY2lyY2xlWS5jeC5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVkuY3kuYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVZLnIuYmFzZVZhbC52YWx1ZSwgaGFuZGxlUG9pbnRzLnN0YXJ0LCBoYW5kbGVQb2ludHMuZW5kKTtcblx0ICAgICAgICAgIGhhbmRsZTJQYXRoID0gc3ZnLmFyYyh0aGlzLmNpcmNsZVkuY3guYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVZLmN5LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWS5yLmJhc2VWYWwudmFsdWUsIGhhbmRsZTJQb2ludHMuc3RhcnQsIGhhbmRsZTJQb2ludHMuZW5kKTtcblx0XG5cdCAgICAgICAgICB0aGlzLmJhclkuc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGVQYXRoKTtcblx0ICAgICAgICAgIHRoaXMuYmFyWTIuc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGUyUGF0aCk7XG5cdFxuXHQgICAgICAgICAgaGFuZGxlUG9pbnRzID0ge1xuXHQgICAgICAgICAgICBzdGFydDogTWF0aC5QSSAqIDEuNSxcblx0ICAgICAgICAgICAgZW5kOiBtYXRoLmNsaXAobWF0aC5zY2FsZSh6LCAwLCAwLjUsIE1hdGguUEkgKiAxLjUsIE1hdGguUEkgKiAwLjUpLCBNYXRoLlBJICogMC41LCBNYXRoLlBJICogMS41KVxuXHQgICAgICAgICAgfTtcblx0ICAgICAgICAgIGhhbmRsZTJQb2ludHMgPSB7XG5cdCAgICAgICAgICAgIHN0YXJ0OiBNYXRoLlBJICogMi41LFxuXHQgICAgICAgICAgICBlbmQ6IG1hdGguY2xpcChtYXRoLnNjYWxlKHosIDAuNSwgMSwgTWF0aC5QSSAqIDIuNSwgTWF0aC5QSSAqIDEuNSksIE1hdGguUEkgKiAxLjUsIE1hdGguUEkgKiAyLjUpXG5cdCAgICAgICAgICB9O1xuXHRcblx0ICAgICAgICAgIGhhbmRsZVBhdGggPSBzdmcuYXJjKHRoaXMuY2lyY2xlWi5jeC5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVouY3kuYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVaLnIuYmFzZVZhbC52YWx1ZSwgaGFuZGxlUG9pbnRzLnN0YXJ0LCBoYW5kbGVQb2ludHMuZW5kKTtcblx0ICAgICAgICAgIGhhbmRsZTJQYXRoID0gc3ZnLmFyYyh0aGlzLmNpcmNsZVouY3guYmFzZVZhbC52YWx1ZSwgdGhpcy5jaXJjbGVaLmN5LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWi5yLmJhc2VWYWwudmFsdWUsIGhhbmRsZTJQb2ludHMuc3RhcnQsIGhhbmRsZTJQb2ludHMuZW5kKTtcblx0XG5cdCAgICAgICAgICB0aGlzLmJhclouc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGVQYXRoKTtcblx0ICAgICAgICAgIHRoaXMuYmFyWjIuc2V0QXR0cmlidXRlKFwiZFwiLCBoYW5kbGUyUGF0aCk7XG5cdFxuXHQgICAgICAgICAgLypcblx0ICAgICAgICAgICBsZXQgcG9pbnRzWCA9IHtcblx0ICAgICAgICAgICAgc3RhcnQ6IDAsXG5cdCAgICAgICAgICAgIGVuZDogbWF0aC5zY2FsZSggeCwgMCwgMSwgMCwgTWF0aC5QSSoyIClcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgICAvLyAgY29uc29sZS5sb2codGhpcy5jaXJjbGVYLmN4LmJhc2VWYWwudmFsdWUpO1xuXHQgICAgICAgICAgIGxldCBwYXRoWCA9IHN2Zy5hcmModGhpcy5jaXJjbGVYLmN4LmJhc2VWYWwudmFsdWUsIHRoaXMuY2lyY2xlWC5jeS5iYXNlVmFsLnZhbHVlLCB0aGlzLmNpcmNsZVguci5iYXNlVmFsLnZhbHVlKjIsIHBvaW50c1guc3RhcnQsIHBvaW50c1guZW5kKTtcblx0ICAgICAgICAgICB0aGlzLmJhclguc2V0QXR0cmlidXRlKCdkJyxwYXRoWCk7ICovXG5cdFxuXHQgICAgICAgICAgLy90aGlzLnRleHRILnRleHRDb250ZW50ID0gbWF0aC5wcnVuZSh4LDIpO1xuXHQgICAgICAgICAgLy90aGlzLnRleHRWLnRleHRDb250ZW50ID0gbWF0aC5wcnVuZSh5LDIpO1xuXHQgICAgICAgICAgLy9cblx0ICAgICAgICAgIC8vICB0aGlzLmNpcmNsZVguc2V0QXR0cmlidXRlKCdvcGFjaXR5Jyx4KTtcblx0ICAgICAgICAgIC8vICB0aGlzLmNpcmNsZVkuc2V0QXR0cmlidXRlKCdvcGFjaXR5Jyx5KTtcblx0ICAgICAgICAgIC8vICB0aGlzLmNpcmNsZVouc2V0QXR0cmlidXRlKCdvcGFjaXR5Jyx6KTtcblx0XG5cdCAgICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgICB4OiB4LFxuXHQgICAgICAgICAgICB5OiB5LFxuXHQgICAgICAgICAgICB6OiB6XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGljazoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2soKSB7XG5cdCAgICAgICAgaWYgKHdpbmRvdy5EZXZpY2VPcmllbnRhdGlvbkV2ZW50KSB7XG5cdCAgICAgICAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBhY3RpdmU6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBXaGV0aGVyIHRoZSBpbnRlcmZhY2UgaXMgb24gKGVtaXR0aW5nIHZhbHVlcykgb3Igb2ZmIChwYXVzZWQgJiBub3QgZW1pdHRpbmcgdmFsdWVzKS4gU2V0dGluZyB0aGlzIHByb3BlcnR5IHdpbGwgdXBkYXRlIGl0LlxuXHQgICAgICBAdHlwZSB7Ym9vbGVhbn1cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKG9uKSB7XG5cdCAgICAgICAgdGhpcy5fYWN0aXZlID0gb247XG5cdCAgICAgICAgdGhpcy5jb2xvckludGVyZmFjZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY3VzdG9tRGVzdHJveToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY3VzdG9tRGVzdHJveSgpIHtcblx0ICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRldmljZW9yaWVudGF0aW9uXCIsIHRoaXMuYm91bmRVcGRhdGUsIGZhbHNlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gVGlsdDtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gVGlsdDtcblxuLyoqKi8gfSksXG4vKiAzMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsgdmFyIHByb3AgPSBwcm9wc1trZXldOyBwcm9wLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChwcm9wLnZhbHVlKSBwcm9wLndyaXRhYmxlID0gdHJ1ZTsgfSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKTsgfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQob2JqZWN0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjICYmIGRlc2Mud3JpdGFibGUpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9O1xuXHRcblx0dmFyIF9pbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9O1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9O1xuXHRcblx0dmFyIGRvbSA9IF9fd2VicGFja19yZXF1aXJlX18oNyk7XG5cdHZhciBtYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0dmFyIEludGVyZmFjZSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cdHZhciBTbGlkZXJUZW1wbGF0ZSA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpO1xuXHR2YXIgdG91Y2ggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXHRcblx0dmFyIFNpbmdsZVNsaWRlciA9IChmdW5jdGlvbiAoX1NsaWRlclRlbXBsYXRlKSB7XG5cdCAgZnVuY3Rpb24gU2luZ2xlU2xpZGVyKCkge1xuXHQgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2luZ2xlU2xpZGVyKTtcblx0XG5cdCAgICB2YXIgb3B0aW9ucyA9IFtcInNjYWxlXCIsIFwidmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbMTIwLCAyMF0sXG5cdCAgICAgIG9yaWVudGF0aW9uOiBcInZlcnRpY2FsXCIsXG5cdCAgICAgIG1vZGU6IFwiYWJzb2x1dGVcIixcblx0ICAgICAgc2NhbGU6IFswLCAxXSxcblx0ICAgICAgc3RlcDogMCxcblx0ICAgICAgdmFsdWU6IDAsXG5cdCAgICAgIGhhc0tub2I6IHRydWVcblx0ICAgIH07XG5cdFxuXHQgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoU2luZ2xlU2xpZGVyLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICAvKiBldmVudHMgKi9cblx0XG5cdCAgICBpZiAoIXRvdWNoLmV4aXN0cykge1xuXHRcblx0ICAgICAgdGhpcy5jbGljayA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBfdGhpcy5tdWx0aXNsaWRlci5pbnRlcmFjdGluZyA9IHRydWU7XG5cdCAgICAgICAgX3RoaXMubXVsdGlzbGlkZXIuaW50ZXJwb2xhdGlvbiA9IHtcblx0ICAgICAgICAgIGluZGV4OiBfdGhpcy5pbmRleCxcblx0ICAgICAgICAgIHZhbHVlOiBfdGhpcy52YWx1ZVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgX3RoaXMuZG93bigpO1xuXHQgICAgICAgIF90aGlzLm11bHRpc2xpZGVyLnZhbHVlc1tfdGhpcy5pbmRleF0gPSBfdGhpcy52YWx1ZTtcblx0ICAgICAgfTtcblx0ICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBpZiAoX3RoaXMubXVsdGlzbGlkZXIuaW50ZXJhY3RpbmcpIHtcblx0ICAgICAgICAgIGlmICghX3RoaXMub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIF90aGlzLm9mZnNldCA9IGRvbS5maW5kUG9zaXRpb24oX3RoaXMuZWxlbWVudCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBfdGhpcy5tb3VzZSA9IGRvbS5sb2NhdGVNb3VzZShlLCBfdGhpcy5vZmZzZXQpO1xuXHQgICAgICAgICAgX3RoaXMuZG93bigpO1xuXHQgICAgICAgICAgX3RoaXMubXVsdGlzbGlkZXIudmFsdWVzW190aGlzLmluZGV4XSA9IF90aGlzLnZhbHVlO1xuXHQgICAgICAgICAgaWYgKF90aGlzLm11bHRpc2xpZGVyLmludGVycG9sYXRpb24pIHtcblx0ICAgICAgICAgICAgdmFyIGRpc3RhbmNlID0gTWF0aC5hYnMoX3RoaXMubXVsdGlzbGlkZXIuaW50ZXJwb2xhdGlvbi5pbmRleCAtIF90aGlzLmluZGV4KTtcblx0ICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gMSkge1xuXHQgICAgICAgICAgICAgIHZhciBsb3cgPSBNYXRoLm1pbihfdGhpcy5tdWx0aXNsaWRlci5pbnRlcnBvbGF0aW9uLmluZGV4LCBfdGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgICAgdmFyIGhpZ2ggPSBNYXRoLm1heChfdGhpcy5tdWx0aXNsaWRlci5pbnRlcnBvbGF0aW9uLmluZGV4LCBfdGhpcy5pbmRleCk7XG5cdCAgICAgICAgICAgICAgdmFyIGxvd1ZhbHVlID0gX3RoaXMubXVsdGlzbGlkZXIuc2xpZGVyc1tsb3ddLnZhbHVlO1xuXHQgICAgICAgICAgICAgIHZhciBoaWdoVmFsdWUgPSBfdGhpcy5tdWx0aXNsaWRlci5zbGlkZXJzW2hpZ2hdLnZhbHVlO1xuXHQgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBsb3c7IGkgPCBoaWdoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgIF90aGlzLm11bHRpc2xpZGVyLnNsaWRlcnNbaV0udmFsdWUgPSBtYXRoLmludGVycCgoaSAtIGxvdykgLyBkaXN0YW5jZSwgbG93VmFsdWUsIGhpZ2hWYWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB2YXIgc21vb3RoZWRWYWx1ZSA9IF90aGlzLm11bHRpc2xpZGVyLnNsaWRlcnNbaV0udmFsdWU7XG5cdCAgICAgICAgICAgICAgICBfdGhpcy5tdWx0aXNsaWRlci52YWx1ZXNbaV0gPSBzbW9vdGhlZFZhbHVlO1xuXHQgICAgICAgICAgICAgICAgX3RoaXMubXVsdGlzbGlkZXIudXBkYXRlKGksIHNtb290aGVkVmFsdWUpO1xuXHQgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgIF90aGlzLm11bHRpc2xpZGVyLmludGVycG9sYXRpb24gPSB7XG5cdCAgICAgICAgICAgIGluZGV4OiBfdGhpcy5pbmRleCxcblx0ICAgICAgICAgICAgdmFsdWU6IF90aGlzLnZhbHVlXG5cdCAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICB0aGlzLm1vdmUgPSBmdW5jdGlvbiAoKSB7fTtcblx0ICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICBpZiAoX3RoaXMubXVsdGlzbGlkZXIuaW50ZXJhY3RpbmcpIHtcblx0ICAgICAgICAgIGlmICghX3RoaXMub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIF90aGlzLm9mZnNldCA9IGRvbS5maW5kUG9zaXRpb24oX3RoaXMuZWxlbWVudCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgICBfdGhpcy5tb3VzZSA9IGRvbS5sb2NhdGVNb3VzZShlLCBfdGhpcy5vZmZzZXQpO1xuXHQgICAgICAgICAgX3RoaXMuc2xpZGUoKTtcblx0ICAgICAgICAgIF90aGlzLm11bHRpc2xpZGVyLnZhbHVlc1tfdGhpcy5pbmRleF0gPSBfdGhpcy52YWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgdGhpcy5yZWxlYXNlID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIF90aGlzLm11bHRpc2xpZGVyLmludGVyYWN0aW5nID0gZmFsc2U7XG5cdCAgICAgICAgX3RoaXMubXVsdGlzbGlkZXIuaW50ZXJwb2xhdGlvbiA9IGZhbHNlO1xuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGlmIChfdGhpcy5tdWx0aXNsaWRlci5pbnRlcmFjdGluZykge1xuXHQgICAgICAgICAgX3RoaXMudXAoKTtcblx0ICAgICAgICAgIF90aGlzLm11bHRpc2xpZGVyLmludGVycG9sYXRpb24gPSBmYWxzZTtcblx0ICAgICAgICAgIF90aGlzLm11bHRpc2xpZGVyLnZhbHVlc1tfdGhpcy5pbmRleF0gPSBfdGhpcy52YWx1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBpZiAoX3RoaXMubXVsdGlzbGlkZXIuaW50ZXJhY3RpbmcpIHtcblx0ICAgICAgICAgIF90aGlzLnVwKCk7XG5cdCAgICAgICAgICBfdGhpcy5tdWx0aXNsaWRlci52YWx1ZXNbX3RoaXMuaW5kZXhdID0gX3RoaXMudmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0ICAgIH1cblx0XG5cdCAgICB0aGlzLmN1c3RvbVN0eWxlKCk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoU2luZ2xlU2xpZGVyLCBfU2xpZGVyVGVtcGxhdGUpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoU2luZ2xlU2xpZGVyLCB7XG5cdCAgICBjdXN0b21TdHlsZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY3VzdG9tU3R5bGUoKSB7XG5cdFxuXHQgICAgICAgIC8qIHN0eWxlIGNoYW5nZXMgKi9cblx0XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwieFwiLCAwKTtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoMCwwKVwiKTtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJyeFwiLCAwKTsgLy8gY29ybmVyIHJhZGl1c1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcInJ5XCIsIDApO1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHRoaXMud2lkdGgpO1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCB0aGlzLmhlaWdodCk7XG5cdFxuXHQgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ4XCIsIDApO1xuXHQgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoMCwwKVwiKTtcblx0ICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwicnhcIiwgMCk7IC8vIGNvcm5lciByYWRpdXNcblx0ICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwicnlcIiwgMCk7XG5cdCAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHRoaXMud2lkdGgpO1xuXHQgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgdGhpcy5oZWlnaHQpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBTaW5nbGVTbGlkZXI7XG5cdH0pKFNsaWRlclRlbXBsYXRlKTtcblx0XG5cdC8qKlxuXHQqIE11bHRpc2xpZGVyXG5cdCpcblx0KiBAZGVzY3JpcHRpb24gTXVsdGlzbGlkZXJcblx0KlxuXHQqIEBkZW1vIDxzcGFuIG5leHVzLXVpPVwibXVsdGlzbGlkZXJcIj48L3NwYW4+XG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBtdWx0aXNsaWRlciA9IG5ldyBOZXh1cy5NdWx0aXNsaWRlcignI3RhcmdldCcpXG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBtdWx0aXNsaWRlciA9IG5ldyBOZXh1cy5NdWx0aXNsaWRlcignI3RhcmdldCcse1xuXHQqICAnc2l6ZSc6IFsyMDAsMTAwXSxcblx0KiAgJ251bWJlck9mU2xpZGVycyc6IDUsXG5cdCogICdtaW4nOiAwLFxuXHQqICAnbWF4JzogMSxcblx0KiAgJ3N0ZXAnOiAwLFxuXHQqICAndmFsdWVzJzogWzAuNywwLjcsMC43LDAuNywwLjddXG5cdCogfSlcblx0KlxuXHQqIEBvdXRwdXRcblx0KiBjaGFuZ2Vcblx0KiBGaXJlcyBhbnkgdGltZSB0aGUgaW50ZXJmYWNlJ3MgdmFsdWUgY2hhbmdlcy4gPGJyPlxuXHQqIFRoZSBldmVudCBkYXRhIGFuIG9iamVjdCBjb250YWluaW5nIDxpPmluZGV4PC9pPiBhbmQgPGk+dmFsdWU8L2k+IHByb3BlcnRpZXNcblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogbXVsdGlzbGlkZXIub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuXHQqICAgY29uc29sZS5sb2codik7XG5cdCogfSlcblx0KlxuXHQqL1xuXHRcblx0Lypcblx0UHJvcGVydGllc1xuXHQudmFsdWVzXG5cdFxuXHQqL1xuXHRcblx0dmFyIE11bHRpc2xpZGVyID0gKGZ1bmN0aW9uIChfSW50ZXJmYWNlKSB7XG5cdCAgZnVuY3Rpb24gTXVsdGlzbGlkZXIoKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTXVsdGlzbGlkZXIpO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1widmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbMjAwLCAxMDBdLFxuXHQgICAgICBudW1iZXJPZlNsaWRlcnM6IDUsXG5cdCAgICAgIG1pbjogMCxcblx0ICAgICAgbWF4OiAxLFxuXHQgICAgICBzdGVwOiAwLFxuXHQgICAgICB2YWx1ZXM6IFswLjcsIDAuNywgMC43LCAwLjcsIDAuN11cblx0ICAgIH07XG5cdFxuXHQgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoTXVsdGlzbGlkZXIucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIGFyZ3VtZW50cywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHRcblx0ICAgIHRoaXMuX251bWJlck9mU2xpZGVycyA9IHRoaXMuc2V0dGluZ3MubnVtYmVyT2ZTbGlkZXJzO1xuXHQgICAgdGhpcy52YWx1ZXMgPSB0aGlzLnNldHRpbmdzLnZhbHVlcztcblx0XG5cdCAgICB0aGlzLnNsaWRlcnMgPSBbXTtcblx0XG5cdCAgICB0aGlzLmludGVyYWN0aW5nID0gZmFsc2U7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoTXVsdGlzbGlkZXIsIF9JbnRlcmZhY2UpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoTXVsdGlzbGlkZXIsIHtcblx0ICAgIGJ1aWxkRnJhbWU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkRnJhbWUoKSB7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgICAgICB0aGlzLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgYnVpbGRJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICB2YXIgbWluID0gdGhpcy5zZXR0aW5ncy5taW47XG5cdCAgICAgICAgdmFyIG1heCA9IHRoaXMuc2V0dGluZ3MubWF4O1xuXHQgICAgICAgIHZhciBzdGVwID0gdGhpcy5zZXR0aW5ncy5zdGVwO1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5zbGlkZXJzLmxlbmd0aCkge1xuXHQgICAgICAgICAgbWluID0gdGhpcy5zbGlkZXJzWzBdLm1pbjtcblx0ICAgICAgICAgIG1heCA9IHRoaXMuc2xpZGVyc1swXS5tYXg7XG5cdCAgICAgICAgICBzdGVwID0gdGhpcy5zbGlkZXJzWzBdLnN0ZXA7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLnNsaWRlcnMgPSBbXTtcblx0XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9udW1iZXJPZlNsaWRlcnM7IGkrKykge1xuXHQgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHRcblx0ICAgICAgICAgIHZhciBzbGlkZXIgPSBuZXcgU2luZ2xlU2xpZGVyKGNvbnRhaW5lciwge1xuXHQgICAgICAgICAgICBzY2FsZTogW21pbiwgbWF4XSxcblx0ICAgICAgICAgICAgc3RlcDogc3RlcCxcblx0ICAgICAgICAgICAgbW9kZTogXCJhYnNvbHV0ZVwiLFxuXHQgICAgICAgICAgICBvcmllbnRhdGlvbjogXCJ2ZXJ0aWNhbFwiLFxuXHQgICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZXNbaV0sXG5cdCAgICAgICAgICAgIGhhc0tub2I6IGZhbHNlLFxuXHQgICAgICAgICAgICBjb21wb25lbnQ6IHRydWUgfSwgdGhpcy51cGRhdGUuYmluZCh0aGlzLCBpKSk7XG5cdCAgICAgICAgICBzbGlkZXIubXVsdGlzbGlkZXIgPSB0aGlzO1xuXHRcblx0ICAgICAgICAgIHNsaWRlci5pbmRleCA9IGk7XG5cdCAgICAgICAgICBpZiAodG91Y2guZXhpc3RzKSB7XG5cdCAgICAgICAgICAgIHNsaWRlci5iYXIuaW5kZXggPSBpO1xuXHQgICAgICAgICAgICBzbGlkZXIuZmlsbGJhci5pbmRleCA9IGk7XG5cdCAgICAgICAgICAgIHNsaWRlci5wcmVDbGljayA9IHNsaWRlci5wcmVNb3ZlID0gc2xpZGVyLnByZVJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7fTtcblx0ICAgICAgICAgICAgc2xpZGVyLmNsaWNrID0gc2xpZGVyLm1vdmUgPSBzbGlkZXIucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgICAgICBzbGlkZXIucHJlVG91Y2ggPSBzbGlkZXIucHJlVG91Y2hNb3ZlID0gc2xpZGVyLnByZVRvdWNoUmVsZWFzZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgICAgICBzbGlkZXIudG91Y2ggPSBzbGlkZXIudG91Y2hNb3ZlID0gc2xpZGVyLnRvdWNoUmVsZWFzZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgIHRoaXMuc2xpZGVycy5wdXNoKHNsaWRlcik7XG5cdCAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRvdWNoLmV4aXN0cykge1xuXHQgICAgICAgICAgdGhpcy5hZGRUb3VjaExpc3RlbmVycygpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2xpZGVycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgdGhpcy5zbGlkZXJzW2ldLmNvbG9ycyA9IHRoaXMuY29sb3JzO1xuXHQgICAgICAgICAgdGhpcy5zbGlkZXJzW2ldLmNvbG9ySW50ZXJmYWNlKCk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2l6ZUludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2l6ZUludGVyZmFjZSgpIHtcblx0XG5cdCAgICAgICAgdmFyIHNsaWRlcldpZHRoID0gdGhpcy53aWR0aCAvIHRoaXMuc2xpZGVycy5sZW5ndGg7XG5cdCAgICAgICAgdmFyIHNsaWRlckhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2xpZGVycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgdGhpcy5zbGlkZXJzW2ldLnJlc2l6ZShzbGlkZXJXaWR0aCwgc2xpZGVySGVpZ2h0KTtcblx0ICAgICAgICAgIHRoaXMuc2xpZGVyc1tpXS5jdXN0b21TdHlsZSgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHVwZGF0ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKGluZGV4LCB2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB7XG5cdCAgICAgICAgICBpbmRleDogaW5kZXgsXG5cdCAgICAgICAgICB2YWx1ZTogdmFsdWVcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGFkZFRvdWNoTGlzdGVuZXJzOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRUb3VjaExpc3RlbmVycygpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICB0aGlzLnByZUNsaWNrID0gdGhpcy5wcmVNb3ZlID0gdGhpcy5wcmVSZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgdGhpcy5jbGljayA9IHRoaXMubW92ZSA9IHRoaXMucmVsZWFzZSA9IGZ1bmN0aW9uICgpIHt9O1xuXHQgICAgICAgIHRoaXMucHJlVG91Y2ggPSB0aGlzLnByZVRvdWNoTW92ZSA9IHRoaXMucHJlVG91Y2hSZWxlYXNlID0gZnVuY3Rpb24gKCkge307XG5cdCAgICAgICAgdGhpcy50b3VjaCA9IHRoaXMudG91Y2hNb3ZlID0gdGhpcy50b3VjaFJlbGVhc2UgPSBmdW5jdGlvbiAoKSB7fTtcblx0XG5cdCAgICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IGZhbHNlO1xuXHRcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChlLnRhcmdldFRvdWNoZXNbMF0uY2xpZW50WCwgZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFkpO1xuXHQgICAgICAgICAgdmFyIHNsaWRlciA9IF90aGlzLnNsaWRlcnNbZWxlbWVudC5pbmRleF07XG5cdCAgICAgICAgICBpZiAoIXNsaWRlci5vZmZzZXQpIHtcblx0ICAgICAgICAgICAgc2xpZGVyLm9mZnNldCA9IGRvbS5maW5kUG9zaXRpb24oc2xpZGVyLmVsZW1lbnQpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgc2xpZGVyLm1vdXNlID0gZG9tLmxvY2F0ZU1vdXNlKGUsIHNsaWRlci5vZmZzZXQpO1xuXHQgICAgICAgICAgc2xpZGVyLmRvd24oKTtcblx0ICAgICAgICAgIF90aGlzLmN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5pbmRleDtcblx0ICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgfSk7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGZ1bmN0aW9uIChlKSB7XG5cdCAgICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFgsIGUudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZKTtcblx0ICAgICAgICAgIHZhciBzbGlkZXIgPSBfdGhpcy5zbGlkZXJzW2VsZW1lbnQuaW5kZXhdO1xuXHQgICAgICAgICAgaWYgKCFzbGlkZXIub2Zmc2V0KSB7XG5cdCAgICAgICAgICAgIHNsaWRlci5vZmZzZXQgPSBkb20uZmluZFBvc2l0aW9uKHNsaWRlci5lbGVtZW50KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHNsaWRlci5tb3VzZSA9IGRvbS5sb2NhdGVNb3VzZShlLCBzbGlkZXIub2Zmc2V0KTtcblx0ICAgICAgICAgIGlmIChlbGVtZW50LmluZGV4ICE9PSBfdGhpcy5jdXJyZW50RWxlbWVudCkge1xuXHQgICAgICAgICAgICBpZiAoX3RoaXMuY3VycmVudEVsZW1lbnQgPj0gMCkge1xuXHQgICAgICAgICAgICAgIHZhciBwYXN0c2xpZGVyID0gX3RoaXMuc2xpZGVyc1tfdGhpcy5jdXJyZW50RWxlbWVudF07XG5cdCAgICAgICAgICAgICAgcGFzdHNsaWRlci51cCgpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHNsaWRlci5kb3duKCk7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBzbGlkZXIuc2xpZGUoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIF90aGlzLmN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5pbmRleDtcblx0ICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgfSk7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgZnVuY3Rpb24gKGUpIHtcblx0ICAgICAgICAgIC8vIG5vIHRvdWNoZXMgdG8gY2FsY3VsYXRlIGJlY2F1c2Ugbm9uZSByZW1haW5pbmdcblx0ICAgICAgICAgIHZhciBzbGlkZXIgPSBfdGhpcy5zbGlkZXJzW190aGlzLmN1cnJlbnRFbGVtZW50XTtcblx0ICAgICAgICAgIHNsaWRlci51cCgpO1xuXHQgICAgICAgICAgX3RoaXMuaW50ZXJhY3RpbmcgPSBmYWxzZTtcblx0ICAgICAgICAgIF90aGlzLmN1cnJlbnRFbGVtZW50ID0gZmFsc2U7XG5cdCAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbnVtYmVyT2ZTbGlkZXJzOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgR2V0IG9yIHNldCB0aGUgbnVtYmVyIG9mIHNsaWRlcnNcblx0ICAgICAgQHR5cGUge051bWJlcn1cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnNsaWRlcnMubGVuZ3RoO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgaWYgKHYgPT09IHRoaXMuc2xpZGVycy5sZW5ndGgpIHtcblx0ICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5zbGlkZXJzLmZvckVhY2goZnVuY3Rpb24gKHNsaWRlcikge1xuXHQgICAgICAgICAgc2xpZGVyLmRlc3Ryb3koKTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLmVtcHR5KCk7XG5cdCAgICAgICAgdGhpcy5fbnVtYmVyT2ZTbGlkZXJzID0gdjtcblx0ICAgICAgICB0aGlzLmJ1aWxkSW50ZXJmYWNlKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtaW46IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBMb3dlciBsaW1pdCBvZiB0aGUgbXVsdGlzbGlkZXIncyBvdXRwdXQgcmFuZ2Vcblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgbXVsdGlzbGlkZXIubWluID0gMTAwMDtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnNsaWRlcnNbMF0ubWluO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5zbGlkZXJzLmZvckVhY2goZnVuY3Rpb24gKHNsaWRlcikge1xuXHQgICAgICAgICAgc2xpZGVyLm1pbiA9IHY7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtYXg6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBVcHBlciBsaW1pdCBvZiB0aGUgbXVsdGlzbGlkZXIncyBvdXRwdXQgcmFuZ2Vcblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgbXVsdGlzbGlkZXIubWF4ID0gMTAwMDtcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLnNsaWRlcnNbMF0ubWF4O1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5zbGlkZXJzLmZvckVhY2goZnVuY3Rpb24gKHNsaWRlcikge1xuXHQgICAgICAgICAgc2xpZGVyLm1heCA9IHY7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzdGVwOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgVGhlIGluY3JlbWVudCB0aGF0IHRoZSBtdWx0aXNsaWRlcidzIHZhbHVlIGNoYW5nZXMgYnkuXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgIEBleGFtcGxlIG11bHRpc2xpZGVyLnN0ZXAgPSA1O1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuc2xpZGVyc1swXS5zdGVwO1xuXHQgICAgICB9LFxuXHQgICAgICBzZXQ6IGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgdGhpcy5zbGlkZXJzLmZvckVhY2goZnVuY3Rpb24gKHNsaWRlcikge1xuXHQgICAgICAgICAgc2xpZGVyLnN0ZXAgPSB2O1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2V0U2xpZGVyOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgU2V0IHRoZSB2YWx1ZSBvZiBhbiBpbmRpdmlkdWFsIHNsaWRlclxuXHQgICAgICBAcGFyYW0gaW5kZXgge251bWJlcn0gU2xpZGVyIGluZGV4XG5cdCAgICAgIEBwYXJhbSB2YWx1ZSB7bnVtYmVyfSBOZXcgc2xpZGVyIHZhbHVlXG5cdCAgICAgIEBleGFtcGxlXG5cdCAgICAgIC8vIFNldCB0aGUgZmlyc3Qgc2xpZGVyIHRvIHZhbHVlIDAuNVxuXHQgICAgICBtdWx0aXNsaWRlci5zZXRTbGlkZXIoMCwwLjUpXG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2xpZGVyKGluZGV4LCB2YWx1ZSkge1xuXHQgICAgICAgIHRoaXMuc2xpZGVyc1tpbmRleF0udmFsdWUgPSB2YWx1ZTtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgaW5kZXg6IGluZGV4LFxuXHQgICAgICAgICAgdmFsdWU6IHZhbHVlXG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzZXRBbGxTbGlkZXJzOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgU2V0IHRoZSB2YWx1ZSBvZiBhbGwgc2xpZGVycyBhdCBvbmNlLiBJZiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgYXJyYXkgZG9lcyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHNsaWRlcnMsIHRoZSB2YWx1ZSBhcnJheSB3aWxsIHJlcGVhdCB1bnRpbCBhbGwgc2xpZGVycyBoYXZlIGJlZW4gc2V0LiBJLmUuIGFuIGlucHV0IGFycmF5IG9mIGxlbmd0aCAxIHdpbGwgc2V0IGFsbCBzbGlkZXJzIHRvIHRoYXQgdmFsdWUuXG5cdCAgICAgIEBwYXJhbSB2YWx1ZXMge0FycmF5fSBBbGwgc2xpZGVyIHZhbHVlc1xuXHQgICAgICBAZXhhbXBsZVxuXHQgICAgICBtdWx0aXNsaWRlci5zZXRBbGxTbGlkZXJzKFswLjIsMC4zLDAuNCwwLjUsMC42XSlcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRBbGxTbGlkZXJzKHZhbHVlcykge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuXHQgICAgICAgIHRoaXMuc2xpZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzbGlkZXIsIGkpIHtcblx0ICAgICAgICAgIHNsaWRlci52YWx1ZSA9IHZhbHVlc1tpICUgdmFsdWVzLmxlbmd0aF07XG5cdCAgICAgICAgICBfdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHtcblx0ICAgICAgICAgICAgaW5kZXg6IGksXG5cdCAgICAgICAgICAgIHZhbHVlOiBzbGlkZXIudmFsdWVcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBNdWx0aXNsaWRlcjtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gTXVsdGlzbGlkZXI7XG5cbi8qKiovIH0pLFxuLyogMzIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9O1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsgdmFyIHByb3AgPSBwcm9wc1trZXldOyBwcm9wLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChwcm9wLnZhbHVlKSBwcm9wLndyaXRhYmxlID0gdHJ1ZTsgfSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKTsgfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQob2JqZWN0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyByZXR1cm4gZ2V0KHBhcmVudCwgcHJvcGVydHksIHJlY2VpdmVyKTsgfSB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiBkZXNjICYmIGRlc2Mud3JpdGFibGUpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9O1xuXHRcblx0dmFyIF9pbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9O1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9O1xuXHRcblx0dmFyIHN2ZyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBJbnRlcmZhY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHR2YXIgU3RlcCA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXHRcblx0dmFyIEludGVyYWN0aW9uID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX193ZWJwYWNrX3JlcXVpcmVfXygxMikpO1xuXHRcblx0dmFyIFNsaWRlclRlbXBsYXRlID0gKGZ1bmN0aW9uIChfSW50ZXJmYWNlKSB7XG5cdCAgZnVuY3Rpb24gU2xpZGVyVGVtcGxhdGUoYXJncywgb3B0aW9ucywgZGVmYXVsdHMpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTbGlkZXJUZW1wbGF0ZSk7XG5cdFxuXHQgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoU2xpZGVyVGVtcGxhdGUucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIGFyZ3MsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLm9yaWVudGF0aW9uID0gdGhpcy5zZXR0aW5ncy5vcmllbnRhdGlvbjtcblx0XG5cdCAgICAvLyAgdGhpcy5tb2RlID0gdGhpcy5zZXR0aW5ncy5tb2RlO1xuXHRcblx0ICAgIHRoaXMuaGFzS25vYiA9IHRoaXMuc2V0dGluZ3MuaGFzS25vYjtcblx0XG5cdCAgICAvLyB0aGlzLnN0ZXAgc2hvdWxkIGV2ZW50dWFsbHkgYmUgZ2V0L3NldFxuXHQgICAgLy8gdXBkYXRpbmcgaXQgd2lsbCB1cGRhdGUgdGhlIF92YWx1ZSBzdGVwIG1vZGVsXG5cdCAgICAvLyAgdGhpcy5zdGVwID0gdGhpcy5zZXR0aW5ncy5zdGVwOyAvLyBmbG9hdFxuXHRcblx0ICAgIHRoaXMuX3ZhbHVlID0gbmV3IFN0ZXAodGhpcy5zZXR0aW5ncy5zY2FsZVswXSwgdGhpcy5zZXR0aW5ncy5zY2FsZVsxXSwgdGhpcy5zZXR0aW5ncy5zdGVwLCB0aGlzLnNldHRpbmdzLnZhbHVlKTtcblx0XG5cdCAgICB0aGlzLmluaXQoKTtcblx0XG5cdCAgICB0aGlzLnBvc2l0aW9uID0gbmV3IEludGVyYWN0aW9uLkhhbmRsZSh0aGlzLnNldHRpbmdzLm1vZGUsIHRoaXMub3JpZW50YXRpb24sIFswLCB0aGlzLndpZHRoXSwgW3RoaXMuaGVpZ2h0LCAwXSk7XG5cdCAgICB0aGlzLnBvc2l0aW9uLnZhbHVlID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblx0XG5cdCAgICB0aGlzLnZhbHVlID0gdGhpcy5fdmFsdWUudmFsdWU7XG5cdFxuXHQgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMudmFsdWUpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKFNsaWRlclRlbXBsYXRlLCBfSW50ZXJmYWNlKTtcblx0XG5cdCAgX2NyZWF0ZUNsYXNzKFNsaWRlclRlbXBsYXRlLCB7XG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMuYmFyID0gc3ZnLmNyZWF0ZShcInJlY3RcIik7XG5cdCAgICAgICAgdGhpcy5maWxsYmFyID0gc3ZnLmNyZWF0ZShcInJlY3RcIik7XG5cdCAgICAgICAgdGhpcy5rbm9iID0gc3ZnLmNyZWF0ZShcImNpcmNsZVwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuYmFyKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5maWxsYmFyKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5rbm9iKTtcblx0XG5cdCAgICAgICAgdGhpcy5zaXplSW50ZXJmYWNlKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzaXplSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3Mub3JpZW50YXRpb24pIHtcblx0ICAgICAgICAgIGlmICh0aGlzLndpZHRoIDwgdGhpcy5oZWlnaHQpIHtcblx0ICAgICAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IFwidmVydGljYWxcIjtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBcImhvcml6b250YWxcIjtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHZhciB4ID0gdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICB5ID0gdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICB3ID0gdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICBoID0gdW5kZWZpbmVkLFxuXHQgICAgICAgICAgICBiYXJPZmZzZXQgPSB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgIGNvcm5lclJhZGl1cyA9IHVuZGVmaW5lZDtcblx0ICAgICAgICB0aGlzLmtub2JEYXRhID0ge1xuXHQgICAgICAgICAgbGV2ZWw6IDAsXG5cdCAgICAgICAgICByOiAwXG5cdCAgICAgICAgfTtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIikge1xuXHQgICAgICAgICAgdGhpcy50aGlja25lc3MgPSB0aGlzLndpZHRoIC8gMjtcblx0ICAgICAgICAgIHggPSB0aGlzLndpZHRoIC8gMjtcblx0ICAgICAgICAgIHkgPSAwO1xuXHQgICAgICAgICAgdyA9IHRoaXMudGhpY2tuZXNzO1xuXHQgICAgICAgICAgaCA9IHRoaXMuaGVpZ2h0O1xuXHQgICAgICAgICAgdGhpcy5rbm9iRGF0YS5yID0gdGhpcy50aGlja25lc3MgKiAwLjg7XG5cdCAgICAgICAgICB0aGlzLmtub2JEYXRhLmxldmVsID0gaCAtIHRoaXMubm9ybWFsaXplZCAqIGg7XG5cdCAgICAgICAgICBiYXJPZmZzZXQgPSBcInRyYW5zbGF0ZShcIiArIHRoaXMudGhpY2tuZXNzICogLTEgLyAyICsgXCIsMClcIjtcblx0ICAgICAgICAgIGNvcm5lclJhZGl1cyA9IHcgLyAyO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnRoaWNrbmVzcyA9IHRoaXMuaGVpZ2h0IC8gMjtcblx0ICAgICAgICAgIHggPSAwO1xuXHQgICAgICAgICAgeSA9IHRoaXMuaGVpZ2h0IC8gMjtcblx0ICAgICAgICAgIHcgPSB0aGlzLndpZHRoO1xuXHQgICAgICAgICAgaCA9IHRoaXMudGhpY2tuZXNzO1xuXHQgICAgICAgICAgdGhpcy5rbm9iRGF0YS5yID0gdGhpcy50aGlja25lc3MgKiAwLjg7XG5cdCAgICAgICAgICB0aGlzLmtub2JEYXRhLmxldmVsID0gdGhpcy5ub3JtYWxpemVkICogdztcblx0ICAgICAgICAgIGJhck9mZnNldCA9IFwidHJhbnNsYXRlKDAsXCIgKyB0aGlzLnRoaWNrbmVzcyAqIC0xIC8gMiArIFwiKVwiO1xuXHQgICAgICAgICAgY29ybmVyUmFkaXVzID0gaCAvIDI7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJ4XCIsIHgpO1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcInlcIiwgeSk7XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIGJhck9mZnNldCk7XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwicnhcIiwgY29ybmVyUmFkaXVzKTsgLy8gY29ybmVyIHJhZGl1c1xuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcInJ5XCIsIGNvcm5lclJhZGl1cyk7XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgdyk7XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGgpO1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiKSB7XG5cdCAgICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwieFwiLCB4KTtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ5XCIsIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHcpO1xuXHQgICAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBoIC0gdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ4XCIsIDApO1xuXHQgICAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcInlcIiwgeSk7XG5cdCAgICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG5cdCAgICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmZpbGxiYXIuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIGJhck9mZnNldCk7XG5cdCAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcInJ4XCIsIGNvcm5lclJhZGl1cyk7XG5cdCAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcInJ5XCIsIGNvcm5lclJhZGl1cyk7XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB4KTtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImN5XCIsIHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiclwiLCB0aGlzLmtub2JEYXRhLnIpO1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuXHQgICAgICAgICAgdGhpcy5wb3NpdGlvbi5yZXNpemUoWzAsIHRoaXMud2lkdGhdLCBbdGhpcy5oZWlnaHQsIDBdKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjb2xvckludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY29sb3JJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMuZmlsbCk7XG5cdCAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5jb2xvcnMuYWNjZW50KTtcblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgIGlmICghdGhpcy5oYXNLbm9iKSB7XG5cdCAgICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmVuZGVyOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgICAgaWYgKCF0aGlzLmNsaWNrZWQpIHtcblx0ICAgICAgICAgIHRoaXMua25vYkRhdGEuciA9IHRoaXMudGhpY2tuZXNzICogMC43NTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcInJcIiwgdGhpcy5rbm9iRGF0YS5yKTtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIikge1xuXHQgICAgICAgICAgdGhpcy5rbm9iRGF0YS5sZXZlbCA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQgKiB0aGlzLmhlaWdodDtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmhlaWdodCAtIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcInlcIiwgdGhpcy5oZWlnaHQgLSB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgdGhpcy5rbm9iRGF0YS5sZXZlbCk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMua25vYkRhdGEubGV2ZWwgPSB0aGlzLl92YWx1ZS5ub3JtYWxpemVkICogdGhpcy53aWR0aDtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICAgIHRoaXMuZmlsbGJhci5zZXRBdHRyaWJ1dGUoXCJ4XCIsIDApO1xuXHQgICAgICAgICAgdGhpcy5maWxsYmFyLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGRvd246IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRvd24oKSB7XG5cdCAgICAgICAgdGhpcy5jbGlja2VkID0gdHJ1ZTtcblx0ICAgICAgICB0aGlzLmtub2JEYXRhLnIgPSB0aGlzLnRoaWNrbmVzcyAqIDAuOTtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLmFuY2hvciA9IHRoaXMubW91c2U7XG5cdCAgICAgICAgdGhpcy5zbGlkZSgpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2xpZGU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNsaWRlKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcblx0ICAgICAgICAgIHRoaXMucG9zaXRpb24udXBkYXRlKHRoaXMubW91c2UpO1xuXHQgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuX3ZhbHVlLnVwZGF0ZU5vcm1hbCh0aGlzLnBvc2l0aW9uLnZhbHVlKTtcblx0ICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnZhbHVlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB1cDoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gdXAoKSB7XG5cdCAgICAgICAgdGhpcy5jbGlja2VkID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG5vcm1hbGl6ZWQ6IHtcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWx1ZToge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFRoZSBzbGlkZXIncyBjdXJyZW50IHZhbHVlLiBJZiBzZXQgbWFudWFsbHksIHdpbGwgdXBkYXRlIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXIgdGhlIG91dHB1dCBldmVudC5cblx0ICAgICAgQHR5cGUge251bWJlcn1cblx0ICAgICAgQGV4YW1wbGUgc2xpZGVyLnZhbHVlID0gMTA7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUudmFsdWU7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcblx0ICAgICAgICB0aGlzLl92YWx1ZS51cGRhdGUodik7XG5cdCAgICAgICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1pbjoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIExvd2VyIGxpbWl0IG9mIHRoZSBzbGlkZXJzJ3Mgb3V0cHV0IHJhbmdlXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgIEBleGFtcGxlIHNsaWRlci5taW4gPSAxMDAwO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLm1pbjtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3ZhbHVlLm1pbiA9IHY7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtYXg6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBVcHBlciBsaW1pdCBvZiB0aGUgc2xpZGVyJ3Mgb3V0cHV0IHJhbmdlXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgIEBleGFtcGxlIHNsaWRlci5tYXggPSAxMDAwO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlLm1heDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3ZhbHVlLm1heCA9IHY7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzdGVwOiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgVGhlIGluY3JlbWVudCB0aGF0IHRoZSBzbGlkZXIncyB2YWx1ZSBjaGFuZ2VzIGJ5LlxuXHQgICAgICBAdHlwZSB7bnVtYmVyfVxuXHQgICAgICBAZXhhbXBsZSBzbGlkZXIuc3RlcCA9IDU7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUuc3RlcDtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMuX3ZhbHVlLnN0ZXAgPSB2O1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbW9kZToge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIEFic29sdXRlIG1vZGUgKHNsaWRlcidzIHZhbHVlIGp1bXBzIHRvIG1vdXNlIGNsaWNrIHBvc2l0aW9uKSBvciByZWxhdGl2ZSBtb2RlIChtb3VzZSBkcmFnIGNoYW5nZXMgdmFsdWUgcmVsYXRpdmUgdG8gaXRzIGN1cnJlbnQgcG9zaXRpb24pLiBEZWZhdWx0OiBcInJlbGF0aXZlXCIuXG5cdCAgICAgIEB0eXBlIHtzdHJpbmd9XG5cdCAgICAgIEBleGFtcGxlIHNsaWRlci5tb2RlID0gXCJyZWxhdGl2ZVwiO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24ubW9kZTtcblx0ICAgICAgfSxcblx0ICAgICAgc2V0OiBmdW5jdGlvbiAodikge1xuXHQgICAgICAgIHRoaXMucG9zaXRpb24ubW9kZSA9IHY7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9KTtcblx0XG5cdCAgcmV0dXJuIFNsaWRlclRlbXBsYXRlO1xuXHR9KShJbnRlcmZhY2UpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBTbGlkZXJUZW1wbGF0ZTtcblxuLyoqKi8gfSksXG4vKiAzMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChvYmplY3QsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MgJiYgZGVzYy53cml0YWJsZSkgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH07XG5cdFxuXHR2YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH07XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgc3ZnID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblx0dmFyIG1hdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXHR2YXIgSW50ZXJmYWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0dmFyIFN0ZXAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKTtcblx0XG5cdHZhciBJbnRlcmFjdGlvbiA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9fd2VicGFja19yZXF1aXJlX18oMTIpKTtcblx0XG5cdC8qKlxuXHQqIFBhblxuXHQqXG5cdCogQGRlc2NyaXB0aW9uIFN0ZXJlbyBjcm9zc2ZhZGVyLlxuXHQqXG5cdCogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJwYW5cIj48L3NwYW4+XG5cdCpcblx0KiBAZXhhbXBsZVxuXHQqIHZhciBwYW4gPSBuZXcgTmV4dXMuUGFuKCcjdGFyZ2V0Jylcblx0KlxuXHQqIEBvdXRwdXRcblx0KiBjaGFuZ2Vcblx0KiBGaXJlcyBhbnkgdGltZSB0aGUgaW50ZXJmYWNlJ3MgdmFsdWUgY2hhbmdlcy4gPGJyPlxuXHQqIFRoZSBldmVudCBkYXRhIGlzIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBpbnRlcmZhY2UncyA8aT52YWx1ZTwvaT4gKC0xIHRvIDEpLCBhcyB3ZWxsIGFzIDxpPkw8L2k+IGFuZCA8aT5SPC9pPiBhbXBsaXR1ZGUgdmFsdWVzICgwLTEpIGZvciBsZWZ0IGFuZCByaWdodCBzcGVha2VycywgY2FsY3VsYXRlZCBieSBhIHNxdWFyZS1yb290IGNyb3NzZmFkZSBhbGdvcml0aG0uXG5cdCpcblx0KiBAb3V0cHV0ZXhhbXBsZVxuXHQqIHBhbi5vbignY2hhbmdlJyxmdW5jdGlvbih2KSB7XG5cdCogICBjb25zb2xlLmxvZyh2KTtcblx0KiB9KVxuXHQqXG5cdCpcblx0Ki9cblx0XG5cdHZhciBQYW4gPSAoZnVuY3Rpb24gKF9JbnRlcmZhY2UpIHtcblx0ICBmdW5jdGlvbiBQYW4oKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFuKTtcblx0XG5cdCAgICB2YXIgb3B0aW9ucyA9IFtcInNjYWxlXCIsIFwidmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbMTIwLCAyMF0sXG5cdCAgICAgIG9yaWVudGF0aW9uOiBcImhvcml6b250YWxcIixcblx0ICAgICAgbW9kZTogXCJyZWxhdGl2ZVwiLFxuXHQgICAgICBzY2FsZTogWy0xLCAxXSxcblx0ICAgICAgc3RlcDogMCxcblx0ICAgICAgdmFsdWU6IDAsXG5cdCAgICAgIGhhc0tub2I6IHRydWVcblx0ICAgIH07XG5cdFxuXHQgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoUGFuLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLm9yaWVudGF0aW9uID0gdGhpcy5zZXR0aW5ncy5vcmllbnRhdGlvbjtcblx0XG5cdCAgICB0aGlzLm1vZGUgPSB0aGlzLnNldHRpbmdzLm1vZGU7XG5cdFxuXHQgICAgdGhpcy5oYXNLbm9iID0gdGhpcy5zZXR0aW5ncy5oYXNLbm9iO1xuXHRcblx0ICAgIC8vIHRoaXMuc3RlcCBzaG91bGQgZXZlbnR1YWxseSBiZSBnZXQvc2V0XG5cdCAgICAvLyB1cGRhdGluZyBpdCB3aWxsIHVwZGF0ZSB0aGUgX3ZhbHVlIHN0ZXAgbW9kZWxcblx0ICAgIHRoaXMuc3RlcCA9IHRoaXMuc2V0dGluZ3Muc3RlcDsgLy8gZmxvYXRcblx0XG5cdCAgICB0aGlzLl92YWx1ZSA9IG5ldyBTdGVwKHRoaXMuc2V0dGluZ3Muc2NhbGVbMF0sIHRoaXMuc2V0dGluZ3Muc2NhbGVbMV0sIHRoaXMuc2V0dGluZ3Muc3RlcCwgdGhpcy5zZXR0aW5ncy52YWx1ZSk7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdFxuXHQgICAgdGhpcy5wb3NpdGlvbiA9IG5ldyBJbnRlcmFjdGlvbi5IYW5kbGUodGhpcy5tb2RlLCB0aGlzLm9yaWVudGF0aW9uLCBbMCwgdGhpcy53aWR0aF0sIFt0aGlzLmhlaWdodCwgMF0pO1xuXHQgICAgdGhpcy5wb3NpdGlvbi52YWx1ZSA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQ7XG5cdFxuXHQgICAgdGhpcy52YWx1ZSA9IHRoaXMuX3ZhbHVlLnZhbHVlO1xuXHRcblx0ICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnZhbHVlKTtcblx0ICB9XG5cdFxuXHQgIF9pbmhlcml0cyhQYW4sIF9JbnRlcmZhY2UpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoUGFuLCB7XG5cdCAgICBidWlsZEludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIHRoaXMuYmFyID0gc3ZnLmNyZWF0ZShcInJlY3RcIik7XG5cdCAgICAgICAgdGhpcy5rbm9iID0gc3ZnLmNyZWF0ZShcImNpcmNsZVwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuYmFyKTtcblx0ICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5rbm9iKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uKSB7XG5cdCAgICAgICAgICB0aGlzLnBvc2l0aW9uLnJlc2l6ZShbMCwgdGhpcy53aWR0aF0sIFt0aGlzLmhlaWdodCwgMF0pO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgaWYgKHRoaXMud2lkdGggPCB0aGlzLmhlaWdodCkge1xuXHQgICAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IFwidmVydGljYWxcIjtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IFwiaG9yaXpvbnRhbFwiO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgdmFyIHggPSB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgIHkgPSB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgIHcgPSB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgIGggPSB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgIGJhck9mZnNldCA9IHVuZGVmaW5lZCxcblx0ICAgICAgICAgICAgY29ybmVyUmFkaXVzID0gdW5kZWZpbmVkO1xuXHQgICAgICAgIHRoaXMua25vYkRhdGEgPSB7XG5cdCAgICAgICAgICBsZXZlbDogMCxcblx0ICAgICAgICAgIHI6IDBcblx0ICAgICAgICB9O1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiKSB7XG5cdCAgICAgICAgICB0aGlzLnRoaWNrbmVzcyA9IHRoaXMud2lkdGggLyAyO1xuXHQgICAgICAgICAgeCA9IHRoaXMud2lkdGggLyAyO1xuXHQgICAgICAgICAgeSA9IDA7XG5cdCAgICAgICAgICB3ID0gdGhpcy50aGlja25lc3M7XG5cdCAgICAgICAgICBoID0gdGhpcy5oZWlnaHQ7XG5cdCAgICAgICAgICB0aGlzLmtub2JEYXRhLnIgPSB0aGlzLnRoaWNrbmVzcyAqIDAuODtcblx0ICAgICAgICAgIHRoaXMua25vYkRhdGEubGV2ZWwgPSBoIC0gdGhpcy5rbm9iRGF0YS5yIC0gdGhpcy5ub3JtYWxpemVkICogKGggLSB0aGlzLmtub2JEYXRhLnIgKiAyKTtcblx0ICAgICAgICAgIGJhck9mZnNldCA9IFwidHJhbnNsYXRlKFwiICsgdGhpcy50aGlja25lc3MgKiAtMSAvIDIgKyBcIiwwKVwiO1xuXHQgICAgICAgICAgY29ybmVyUmFkaXVzID0gdyAvIDI7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMudGhpY2tuZXNzID0gdGhpcy5oZWlnaHQgLyAyO1xuXHQgICAgICAgICAgeCA9IDA7XG5cdCAgICAgICAgICB5ID0gdGhpcy5oZWlnaHQgLyAyO1xuXHQgICAgICAgICAgdyA9IHRoaXMud2lkdGg7XG5cdCAgICAgICAgICBoID0gdGhpcy50aGlja25lc3M7XG5cdCAgICAgICAgICB0aGlzLmtub2JEYXRhLnIgPSB0aGlzLnRoaWNrbmVzcyAqIDAuODtcblx0ICAgICAgICAgIHRoaXMua25vYkRhdGEubGV2ZWwgPSB0aGlzLm5vcm1hbGl6ZWQgKiAodyAtIHRoaXMua25vYkRhdGEuciAqIDIpICsgdGhpcy5rbm9iRGF0YS5yO1xuXHQgICAgICAgICAgYmFyT2Zmc2V0ID0gXCJ0cmFuc2xhdGUoMCxcIiArIHRoaXMudGhpY2tuZXNzICogLTEgLyAyICsgXCIpXCI7XG5cdCAgICAgICAgICBjb3JuZXJSYWRpdXMgPSBoIC8gMjtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcInhcIiwgeCk7XG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwieVwiLCB5KTtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgYmFyT2Zmc2V0KTtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJyeFwiLCBjb3JuZXJSYWRpdXMpOyAvLyBjb3JuZXIgcmFkaXVzXG5cdCAgICAgICAgdGhpcy5iYXIuc2V0QXR0cmlidXRlKFwicnlcIiwgY29ybmVyUmFkaXVzKTtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCB3KTtcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgaCk7XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeFwiLCB4KTtcblx0ICAgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImN5XCIsIHkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiclwiLCB0aGlzLmtub2JEYXRhLnIpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29sb3JJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbG9ySW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICB0aGlzLmJhci5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmZpbGwpO1xuXHQgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdFxuXHQgICAgICAgIGlmICghdGhpcy5oYXNLbm9iKSB7XG5cdCAgICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcInRyYW5zcGFyZW50XCIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbmRlcjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgIGlmICghdGhpcy5jbGlja2VkKSB7XG5cdCAgICAgICAgICB0aGlzLmtub2JEYXRhLnIgPSB0aGlzLnRoaWNrbmVzcyAqIDAuNzU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMua25vYi5zZXRBdHRyaWJ1dGUoXCJyXCIsIHRoaXMua25vYkRhdGEucik7XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSBcInZlcnRpY2FsXCIpIHtcblx0ICAgICAgICAgIHRoaXMua25vYkRhdGEubGV2ZWwgPSB0aGlzLmtub2JEYXRhLnIgKyB0aGlzLl92YWx1ZS5ub3JtYWxpemVkICogKHRoaXMuaGVpZ2h0IC0gdGhpcy5rbm9iRGF0YS5yICogMik7XG5cdCAgICAgICAgICB0aGlzLmtub2Iuc2V0QXR0cmlidXRlKFwiY3lcIiwgdGhpcy5oZWlnaHQgLSB0aGlzLmtub2JEYXRhLmxldmVsKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgdGhpcy5rbm9iRGF0YS5sZXZlbCA9IHRoaXMuX3ZhbHVlLm5vcm1hbGl6ZWQgKiAodGhpcy53aWR0aCAtIHRoaXMua25vYkRhdGEuciAqIDIpICsgdGhpcy5rbm9iRGF0YS5yO1xuXHQgICAgICAgICAgdGhpcy5rbm9iLnNldEF0dHJpYnV0ZShcImN4XCIsIHRoaXMua25vYkRhdGEubGV2ZWwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsaWNrOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbGljaygpIHtcblx0ICAgICAgICB0aGlzLmtub2JEYXRhLnIgPSB0aGlzLnRoaWNrbmVzcyAqIDAuOTtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLmFuY2hvciA9IHRoaXMubW91c2U7XG5cdCAgICAgICAgdGhpcy5tb3ZlKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBtb3ZlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmNsaWNrZWQpIHtcblx0ICAgICAgICAgIHRoaXMucG9zaXRpb24udXBkYXRlKHRoaXMubW91c2UpO1xuXHRcblx0ICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl92YWx1ZS51cGRhdGVOb3JtYWwodGhpcy5wb3NpdGlvbi52YWx1ZSk7XG5cdFxuXHQgICAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHtcblx0ICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG5cdCAgICAgICAgICAgIEw6IE1hdGgucG93KG1hdGguc2NhbGUodGhpcy52YWx1ZSwgLTEsIDEsIDEsIDApLCAyKSxcblx0ICAgICAgICAgICAgUjogTWF0aC5wb3cobWF0aC5zY2FsZSh0aGlzLnZhbHVlLCAtMSwgMSwgMCwgMSksIDIpXG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICByZWxlYXNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiByZWxlYXNlKCkge1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICB2YWx1ZToge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFRoZSBwb3NpdGlvbiBvZiBjcm9zc2ZhZGVyLCBmcm9tIC0xIChsZWZ0KSB0byAxIChyaWdodCkuIFNldHRpbmcgdGhpcyB2YWx1ZSB1cGRhdGVzIHRoZSBpbnRlcmZhY2UgYW5kIHRyaWdnZXJzIHRoZSBvdXRwdXQgZXZlbnQuXG5cdCAgICAgIEB0eXBlIHtudW1iZXJ9XG5cdCAgICAgICovXG5cdFxuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUudmFsdWU7XG5cdCAgICAgIH0sXG5cdCAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG5cdCAgICAgICAgdGhpcy5fdmFsdWUudXBkYXRlKHZhbHVlKTtcblx0ICAgICAgICB0aGlzLnBvc2l0aW9uLnZhbHVlID0gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblx0ICAgICAgICB0aGlzLmVtaXQoXCJjaGFuZ2VcIiwge1xuXHQgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG5cdCAgICAgICAgICBMOiBNYXRoLnBvdyhtYXRoLnNjYWxlKHRoaXMudmFsdWUsIC0xLCAxLCAxLCAwKSwgMiksXG5cdCAgICAgICAgICBSOiBNYXRoLnBvdyhtYXRoLnNjYWxlKHRoaXMudmFsdWUsIC0xLCAxLCAwLCAxKSwgMilcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbm9ybWFsaXplZDoge1xuXHQgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUubm9ybWFsaXplZDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gUGFuO1xuXHR9KShJbnRlcmZhY2UpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBQYW47XG5cbi8qKiovIH0pLFxuLyogMzQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBtYXRoID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0dmFyIHN2ZyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdHZhciBJbnRlcmZhY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHRcblx0dmFyIFBvaW50ID0gZnVuY3Rpb24gUG9pbnQocG9pbnQsIGVudmVsb3BlKSB7XG5cdFxuXHQgIHRoaXMueCA9IHBvaW50Lng7XG5cdCAgdGhpcy55ID0gcG9pbnQueTtcblx0ICB0aGlzLmVudmVsb3BlID0gZW52ZWxvcGU7XG5cdFxuXHQgIHRoaXMuZWxlbWVudCA9IHN2Zy5jcmVhdGUoXCJjaXJjbGVcIik7XG5cdCAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdGhpcy5lbnZlbG9wZS5jb2xvcnMuYWNjZW50KTtcblx0XG5cdCAgdGhpcy5lbnZlbG9wZS5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7XG5cdFxuXHQgIHRoaXMucmVzaXplID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdmFyIHIgPSB+IH4oTWF0aC5taW4odGhpcy5lbnZlbG9wZS53aWR0aCwgdGhpcy5lbnZlbG9wZS5oZWlnaHQpIC8gNTApICsgMjtcblx0ICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJyXCIsIHIpO1xuXHQgIH07XG5cdFxuXHQgIHRoaXMubW92ZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG5cdFxuXHQgICAgdGhpcy54ID0geCB8fCB4ID09PSAwID8geCA6IHRoaXMueDtcblx0ICAgIHRoaXMueSA9IHkgfHwgeSA9PT0gMCA/IHkgOiB0aGlzLnk7XG5cdFxuXHQgICAgaWYgKHRoaXMuZW52ZWxvcGUubm9kZXMuaW5kZXhPZih0aGlzKSA+PSAwKSB7XG5cdFxuXHQgICAgICB2YXIgcHJldkluZGV4ID0gdGhpcy5lbnZlbG9wZS5ub2Rlcy5pbmRleE9mKHRoaXMpIC0gMTtcblx0ICAgICAgdmFyIG5leHRJbmRleCA9IHRoaXMuZW52ZWxvcGUubm9kZXMuaW5kZXhPZih0aGlzKSArIDE7XG5cdFxuXHQgICAgICB2YXIgcHJldk5vZGUgPSB0aGlzLmVudmVsb3BlLm5vZGVzW3ByZXZJbmRleF07XG5cdCAgICAgIHZhciBuZXh0Tm9kZSA9IHRoaXMuZW52ZWxvcGUubm9kZXNbbmV4dEluZGV4XTtcblx0XG5cdCAgICAgIHZhciBsb3dYID0gcHJldkluZGV4ID49IDAgPyBwcmV2Tm9kZS54IDogMDtcblx0ICAgICAgdmFyIGhpZ2hYID0gbmV4dEluZGV4IDwgdGhpcy5lbnZlbG9wZS5ub2Rlcy5sZW5ndGggPyBuZXh0Tm9kZS54IDogMTtcblx0XG5cdCAgICAgIGlmICh0aGlzLnggPCBsb3dYKSB7XG5cdCAgICAgICAgdGhpcy54ID0gbG93WDtcblx0ICAgICAgfVxuXHQgICAgICBpZiAodGhpcy54ID4gaGlnaFgpIHtcblx0ICAgICAgICB0aGlzLnggPSBoaWdoWDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHRcblx0ICAgIHRoaXMubG9jYXRpb24gPSB0aGlzLmdldENvb3JkaW5hdGVzKCk7XG5cdCAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiY3hcIiwgdGhpcy5sb2NhdGlvbi54KTtcblx0ICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjeVwiLCB0aGlzLmxvY2F0aW9uLnkpO1xuXHQgIH07XG5cdFxuXHQgIHRoaXMuZ2V0Q29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICByZXR1cm4ge1xuXHQgICAgICB4OiB0aGlzLnggKiB0aGlzLmVudmVsb3BlLndpZHRoLFxuXHQgICAgICB5OiAoMSAtIHRoaXMueSkgKiB0aGlzLmVudmVsb3BlLmhlaWdodFxuXHQgICAgfTtcblx0ICB9O1xuXHRcblx0ICB0aGlzLm1vdmUodGhpcy54LCB0aGlzLnksIHRydWUpO1xuXHQgIHRoaXMucmVzaXplKCk7XG5cdFxuXHQgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRoaXMuZW52ZWxvcGUuZWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXHQgICAgdGhpcy5lbnZlbG9wZS5ub2Rlcy5zcGxpY2UodGhpcy5lbnZlbG9wZS5ub2Rlcy5pbmRleE9mKHRoaXMpLCAxKTtcblx0ICB9O1xuXHR9O1xuXHRcblx0LyoqXG5cdCogRW52ZWxvcGVcblx0KlxuXHQqIEBkZXNjcmlwdGlvbiBJbnRlcmFjdGl2ZSBsaW5lYXIgcmFtcCB2aXN1YWxpemF0aW9uLlxuXHQqXG5cdCogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJlbnZlbG9wZVwiPjwvc3Bhbj5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIGVudmVsb3BlID0gbmV3IE5leHVzLkVudmVsb3BlKCcjdGFyZ2V0Jylcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIGVudmVsb3BlID0gbmV3IE5leHVzLkVudmVsb3BlKCcjdGFyZ2V0Jyx7XG5cdCogICAnc2l6ZSc6IFszMDAsMTUwXSxcblx0KiAgICdwb2ludHMnOiBbXG5cdCogICAgIHtcblx0KiAgICAgICB4OiAwLjEsXG5cdCogICAgICAgeTogMC40XG5cdCogICAgIH0sXG5cdCogICAgIHtcblx0KiAgICAgICB4OiAwLjM1LFxuXHQqICAgICAgIHk6IDAuNlxuXHQqICAgICB9LFxuXHQqICAgICB7XG5cdCogICAgICAgeDogMC42NSxcblx0KiAgICAgICB5OiAwLjJcblx0KiAgICAgfSxcblx0KiAgICAge1xuXHQqICAgICAgIHg6IDAuOSxcblx0KiAgICAgICB5OiAwLjRcblx0KiAgICAgfSxcblx0KiAgIF1cblx0KiB9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqIGNoYW5nZVxuXHQqIEZpcmVzIGFueSB0aW1lIGEgbm9kZSBpcyBtb3ZlZC4gPGJyPlxuXHQqIFRoZSBldmVudCBkYXRhIGlzIGFuIGFycmF5IG9mIHBvaW50IGxvY2F0aW9ucy4gRWFjaCBpdGVtIGluIHRoZSBhcnJheSBpcyBhbiBvYmplY3QgY29udGFpbmluZyA8aT54PC9pPiBhbmQgPGk+eTwvaT4gcHJvcGVydGllcyBkZXNjcmliaW5nIHRoZSBsb2NhdGlvbiBvZiBhIHBvaW50IG9uIHRoZSBlbnZlbG9wZS5cblx0KlxuXHQqIEBvdXRwdXRleGFtcGxlXG5cdCogZW52ZWxvcGUub24oJ2NoYW5nZScsZnVuY3Rpb24odikge1xuXHQqICAgY29uc29sZS5sb2codik7XG5cdCogfSlcblx0KlxuXHQqL1xuXHRcblx0dmFyIEVudmVsb3BlID0gKGZ1bmN0aW9uIChfSW50ZXJmYWNlKSB7XG5cdCAgZnVuY3Rpb24gRW52ZWxvcGUoKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW52ZWxvcGUpO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1widmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbMzAwLCAxNTBdLFxuXHQgICAgICBwb2ludHM6IFt7XG5cdCAgICAgICAgeDogMC4xLFxuXHQgICAgICAgIHk6IDAuNFxuXHQgICAgICB9LCB7XG5cdCAgICAgICAgeDogMC4zNSxcblx0ICAgICAgICB5OiAwLjZcblx0ICAgICAgfSwge1xuXHQgICAgICAgIHg6IDAuNjUsXG5cdCAgICAgICAgeTogMC4yXG5cdCAgICAgIH0sIHtcblx0ICAgICAgICB4OiAwLjksXG5cdCAgICAgICAgeTogMC40XG5cdCAgICAgIH1dXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKEVudmVsb3BlLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLnBvaW50cyA9IHRoaXMuc2V0dGluZ3MucG9pbnRzO1xuXHRcblx0ICAgIHRoaXMubm9kZXMgPSBbXTtcblx0XG5cdCAgICB0aGlzLnNlbGVjdGVkID0gZmFsc2U7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdCAgfVxuXHRcblx0ICBfaW5oZXJpdHMoRW52ZWxvcGUsIF9JbnRlcmZhY2UpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoRW52ZWxvcGUsIHtcblx0ICAgIGJ1aWxkSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEludGVyZmFjZSgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICB0aGlzLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uIChwb2ludCkge1xuXHQgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgUG9pbnQocG9pbnQsIF90aGlzKTtcblx0ICAgICAgICAgIF90aGlzLm5vZGVzLnB1c2gobm9kZSk7XG5cdCAgICAgICAgfSk7XG5cdFxuXHQgICAgICAgIHRoaXMuc29ydFBvaW50cygpO1xuXHRcblx0ICAgICAgICB0aGlzLmxpbmUgPSBzdmcuY3JlYXRlKFwicG9seWxpbmVcIik7XG5cdCAgICAgICAgdGhpcy5saW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZS13aWR0aFwiLCAyKTtcblx0ICAgICAgICB0aGlzLmxpbmUuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBcIm5vbmVcIik7XG5cdFxuXHQgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmxpbmUpO1xuXHRcblx0ICAgICAgICB0aGlzLmZpbGwgPSBzdmcuY3JlYXRlKFwicG9seWxpbmVcIik7XG5cdCAgICAgICAgdGhpcy5maWxsLnNldEF0dHJpYnV0ZShcImZpbGwtb3BhY2l0eVwiLCBcIjAuMlwiKTtcblx0XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZmlsbCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzaXplSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaXplSW50ZXJmYWNlKCkge1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIHRoaXMubm9kZXNbaV0ucmVzaXplKCk7XG5cdCAgICAgICAgICB0aGlzLm5vZGVzW2ldLm1vdmUoKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjb2xvckludGVyZmFjZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY29sb3JJbnRlcmZhY2UoKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgdGhpcy5saW5lLnNldEF0dHJpYnV0ZShcInN0cm9rZVwiLCB0aGlzLmNvbG9ycy5hY2NlbnQpO1xuXHQgICAgICAgIHRoaXMuZmlsbC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHRoaXMuY29sb3JzLmFjY2VudCk7XG5cdCAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICBub2RlLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZmlsbFwiLCBfdGhpcy5jb2xvcnMuYWNjZW50KTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbmRlcjoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuXHQgICAgICAgIC8vICB0aGlzLm5vZGVzW3RoaXMuc2VsZWN0ZWRdLm1vdmUoIHRoaXMucG9pbnRzIClcblx0ICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhdGgoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNhbGN1bGF0ZVBvaW50czoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2FsY3VsYXRlUG9pbnRzKCkge1xuXHQgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cdFxuXHQgICAgICAgIHRoaXMucG9pbnRzID0gW107XG5cdCAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICBfdGhpcy5wb2ludHMucHVzaCh7IHg6IG5vZGUueCwgeTogbm9kZS55IH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2FsY3VsYXRlUGF0aDoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2FsY3VsYXRlUGF0aCgpIHtcblx0XG5cdCAgICAgICAgLy9zdHJva2UgZGF0YVxuXHQgICAgICAgIHZhciBkYXRhID0gXCIwIFwiICsgdGhpcy5ub2Rlc1swXS5sb2NhdGlvbi55ICsgXCIsIFwiO1xuXHRcblx0ICAgICAgICAvLyBkYXRhIHNob3VsZCBiZSByZS1vcmRlcmVkIGJhc2VkIG9uIHggbG9jYXRpb24uXG5cdCAgICAgICAgLy8gd2hhdGV2ZXIgZnVuY3Rpb24gYWRkcyBhIG5vZGUgc2hvdWxkIGFkZCBpdCBhdCB0aGUgcmlnaHQgaW5kZXhcblx0XG5cdCAgICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdCAgICAgICAgICAvLyAgbGV0IGxvY2F0aW9uID0gbm9kZS5nZXRDb29yZGluYXRlcygpO1xuXHQgICAgICAgICAgZGF0YSArPSBub2RlLmxvY2F0aW9uLnggKyBcIiBcIiArIG5vZGUubG9jYXRpb24ueSArIFwiLCBcIjtcblx0ICAgICAgICB9KTtcblx0XG5cdCAgICAgICAgLy8gIGRhdGEgKz0gcG9pbnQueCp0aGlzLndpZHRoKycgJysgcG9pbnQueSp0aGlzLmhlaWdodCsnLCAnO1xuXHQgICAgICAgIGRhdGEgKz0gdGhpcy53aWR0aCArIFwiIFwiICsgdGhpcy5ub2Rlc1t0aGlzLm5vZGVzLmxlbmd0aCAtIDFdLmxvY2F0aW9uLnk7XG5cdFxuXHQgICAgICAgIHRoaXMubGluZS5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgZGF0YSk7XG5cdFxuXHQgICAgICAgIC8vIGZpbGwgZGF0YVxuXHQgICAgICAgIC8vIGFkZCBib3R0b20gY29ybmVyc1xuXHRcblx0ICAgICAgICBkYXRhICs9IFwiLCBcIiArIHRoaXMud2lkdGggKyBcIiBcIiArIHRoaXMuaGVpZ2h0ICsgXCIsIFwiO1xuXHQgICAgICAgIGRhdGEgKz0gXCIwIFwiICsgdGhpcy5oZWlnaHQ7XG5cdFxuXHQgICAgICAgIHRoaXMuZmlsbC5zZXRBdHRyaWJ1dGUoXCJwb2ludHNcIiwgZGF0YSk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGljazoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2soKSB7XG5cdCAgICAgICAgLy8gZmluZCBuZWFyZXN0IG5vZGUgYW5kIHNldCB0aGlzLnNlbGVjdGVkIChpbmRleClcblx0ICAgICAgICB0aGlzLmhhc01vdmVkID0gZmFsc2U7XG5cdCAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuZmluZE5lYXJlc3ROb2RlKCk7XG5cdFxuXHQgICAgICAgIHRoaXMubm9kZXNbdGhpcy5zZWxlY3RlZF0ubW92ZSh0aGlzLm1vdXNlLnggLyB0aGlzLndpZHRoLCAxIC0gdGhpcy5tb3VzZS55IC8gdGhpcy5oZWlnaHQpO1xuXHQgICAgICAgIHRoaXMuc2NhbGVOb2RlKHRoaXMuc2VsZWN0ZWQpO1xuXHRcblx0ICAgICAgICAvLyBtdXN0IGRvIHRoaXMgYi9jIG5ldyBub2RlIG1heSBoYXZlIGJlZW4gY3JlYXRlZFxuXHQgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9pbnRzKCk7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMucG9pbnRzKTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgbW92ZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbW92ZSgpIHtcblx0ICAgICAgICBpZiAodGhpcy5jbGlja2VkKSB7XG5cdCAgICAgICAgICB0aGlzLm1vdXNlLnggPSBtYXRoLmNsaXAodGhpcy5tb3VzZS54LCAwLCB0aGlzLndpZHRoKTtcblx0ICAgICAgICAgIHRoaXMuaGFzTW92ZWQgPSB0cnVlO1xuXHRcblx0ICAgICAgICAgIHRoaXMubm9kZXNbdGhpcy5zZWxlY3RlZF0ubW92ZSh0aGlzLm1vdXNlLnggLyB0aGlzLndpZHRoLCAxIC0gdGhpcy5tb3VzZS55IC8gdGhpcy5oZWlnaHQpO1xuXHQgICAgICAgICAgdGhpcy5zY2FsZU5vZGUodGhpcy5zZWxlY3RlZCk7XG5cdFxuXHQgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb2ludHMoKTtcblx0ICAgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnBvaW50cyk7XG5cdCAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHJlbGVhc2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbGVhc2UoKSB7XG5cdFxuXHQgICAgICAgIGlmICghdGhpcy5oYXNNb3ZlZCkge1xuXHQgICAgICAgICAgdGhpcy5ub2Rlc1t0aGlzLnNlbGVjdGVkXS5kZXN0cm95KCk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvaW50cygpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnBvaW50cyk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0XG5cdCAgICAgICAgLy8gcmVzZXQgdGhpcy5zZWxlY3RlZFxuXHQgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZmluZE5lYXJlc3ROb2RlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBmaW5kTmVhcmVzdE5vZGUoKSB7XG5cdCAgICAgICAgdmFyIG5lYXJlc3RJbmRleCA9IG51bGw7XG5cdCAgICAgICAgLy8gc2V0IHRoaXMgdW5yZWFzb25hYmx5IGhpZ2ggc28gdGhhdCBldmVyeSBkaXN0YW5jZSB3aWxsIGJlIGxvd2VyIHRoYW4gaXQuXG5cdCAgICAgICAgdmFyIG5lYXJlc3REaXN0ID0gMTAwMDA7XG5cdCAgICAgICAgdmFyIGJlZm9yZSA9IGZhbHNlO1xuXHQgICAgICAgIHZhciB4ID0gdGhpcy5tb3VzZS54IC8gdGhpcy53aWR0aDtcblx0ICAgICAgICB2YXIgeSA9IDEgLSB0aGlzLm1vdXNlLnkgLyB0aGlzLmhlaWdodDtcblx0ICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcblx0XG5cdCAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGZyb20gbW91c2UgdG8gdGhpcyBub2RlIHVzaW5nIHB5dGhhZ29yZWFuIHRoZW9yZW1cblx0ICAgICAgICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChNYXRoLnBvdyhub2Rlc1tpXS54IC0geCwgMikgKyBNYXRoLnBvdyhub2Rlc1tpXS55IC0geSwgMikpO1xuXHRcblx0ICAgICAgICAgIC8vIGlmIHRoaXMgZGlzdGFuY2UgaXMgbGVzcyB0aGFuIHRoZSBwcmV2aW91cyBzaG9ydGVzdCBkaXN0YW5jZSwgdXNlIHRoaXMgaW5kZXhcblx0ICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG5lYXJlc3REaXN0KSB7XG5cdCAgICAgICAgICAgIG5lYXJlc3REaXN0ID0gZGlzdGFuY2U7XG5cdCAgICAgICAgICAgIG5lYXJlc3RJbmRleCA9IGk7XG5cdCAgICAgICAgICAgIGJlZm9yZSA9IHggPiBub2Rlc1tpXS54O1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgLy8gaWYgbm90IHZlcnkgY2xvc2UgdG8gYW55IG5vZGUsIGNyZWF0ZSBhIG5vZGVcblx0ICAgICAgICBpZiAobmVhcmVzdERpc3QgPiAwLjA3KSB7XG5cdFxuXHQgICAgICAgICAgbmVhcmVzdEluZGV4ID0gdGhpcy5nZXRJbmRleEZyb21YKHRoaXMubW91c2UueCAvIHRoaXMud2lkdGgpO1xuXHRcblx0ICAgICAgICAgIHRoaXMubm9kZXMuc3BsaWNlKG5lYXJlc3RJbmRleCwgMCwgbmV3IFBvaW50KHtcblx0ICAgICAgICAgICAgeDogdGhpcy5tb3VzZS54IC8gdGhpcy53aWR0aCxcblx0ICAgICAgICAgICAgeTogMSAtIHRoaXMubW91c2UueSAvIHRoaXMuaGVpZ2h0XG5cdCAgICAgICAgICB9LCB0aGlzKSk7XG5cdCAgICAgICAgICB0aGlzLmhhc01vdmVkID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHJldHVybiBuZWFyZXN0SW5kZXg7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBnZXRJbmRleEZyb21YOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJbmRleEZyb21YKHgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICB2YXIgaW5kZXggPSAwO1xuXHQgICAgICAgIHRoaXMubm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSwgaSkge1xuXHQgICAgICAgICAgaWYgKF90aGlzLm5vZGVzW2ldLnggPD0geCkge1xuXHQgICAgICAgICAgICBpbmRleCA9IGkgKyAxO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICAgIHJldHVybiBpbmRleDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNjYWxlTm9kZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2NhbGVOb2RlKGkpIHtcblx0XG5cdCAgICAgICAgdmFyIGNsaXBwZWRYID0gbWF0aC5jbGlwKHRoaXMubm9kZXNbaV0ueCwgMCwgMSk7XG5cdCAgICAgICAgdmFyIGNsaXBwZWRZID0gbWF0aC5jbGlwKHRoaXMubm9kZXNbaV0ueSwgMCwgMSk7XG5cdFxuXHQgICAgICAgIHRoaXMubm9kZXNbaV0ubW92ZShjbGlwcGVkWCwgY2xpcHBlZFkpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc29ydFBvaW50czoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFNvcnQgdGhlIHRoaXMucG9pbnRzIGFycmF5IGZyb20gbGVmdC1tb3N0IHBvaW50IHRvIHJpZ2h0LW1vc3QgcG9pbnQuIFlvdSBzaG91bGQgbm90IHJlZ3VsYXJseSBuZWVkIHRvIHVzZSB0aGlzLCBob3dldmVyIGl0IG1heSBiZSB1c2VmdWwgaWYgdGhlIHBvaW50cyBnZXQgdW5vcmRlcmVkLlxuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNvcnRQb2ludHMoKSB7XG5cdCAgICAgICAgdGhpcy5ub2Rlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG5cdCAgICAgICAgICByZXR1cm4gYS54ID4gYi54O1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgYWRkUG9pbnQ6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBBZGQgYSBicmVha3BvaW50IG9uIHRoZSBlbnZlbG9wZS5cblx0ICAgICAgQHBhcmFtIHgge251bWJlcn0geCBsb2NhdGlvbiBvZiB0aGUgcG9pbnQsIG5vcm1hbGl6ZWQgKDAtMSlcblx0ICAgICAgQHBhcmFtIHkge251bWJlcn0geSBsb2NhdGlvbiBvZiB0aGUgcG9pbnQsIG5vcm1hbGl6ZWQgKDAtMSlcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRQb2ludCh4LCB5KSB7XG5cdCAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5ub2Rlcy5sZW5ndGg7XG5cdFxuXHQgICAgICAgIHRoaXMuc29ydFBvaW50cygpO1xuXHRcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubm9kZXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIGlmICh4IDwgdGhpcy5ub2Rlc1tpXS54KSB7XG5cdCAgICAgICAgICAgIGluZGV4ID0gaTtcblx0ICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLm5vZGVzLnNwbGljZShpbmRleCwgMCwgbmV3IFBvaW50KHtcblx0ICAgICAgICAgIHg6IHgsXG5cdCAgICAgICAgICB5OiB5XG5cdCAgICAgICAgfSwgdGhpcykpO1xuXHRcblx0ICAgICAgICB0aGlzLnNjYWxlTm9kZShpbmRleCk7XG5cdFxuXHQgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9pbnRzKCk7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMucG9pbnRzKTtcblx0XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNjYW46IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBGaW5kIHRoZSBsZXZlbCBhdCBhIGNlcnRhaW4geCBsb2NhdGlvbiBvbiB0aGUgZW52ZWxvcGUuXG5cdCAgICAgIEBwYXJhbSB4IHtudW1iZXJ9IFRoZSB4IGxvY2F0aW9uIHRvIGZpbmQgdGhlIGxldmVsIG9mLCBub3JtYWxpemVkIDAtMVxuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNjYW4oeCkge1xuXHQgICAgICAgIC8vIGZpbmQgc3Vycm91bmRpbmcgcG9pbnRzXG5cdCAgICAgICAgdmFyIG5leHRJbmRleCA9IHRoaXMuZ2V0SW5kZXhGcm9tWCh4KTtcblx0ICAgICAgICB2YXIgcHJpb3JJbmRleCA9IG5leHRJbmRleCAtIDE7XG5cdCAgICAgICAgaWYgKHByaW9ySW5kZXggPCAwKSB7XG5cdCAgICAgICAgICBwcmlvckluZGV4ID0gMDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKG5leHRJbmRleCA+PSB0aGlzLm5vZGVzLmxlbmd0aCkge1xuXHQgICAgICAgICAgbmV4dEluZGV4ID0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB2YXIgcHJpb3JQb2ludCA9IHRoaXMubm9kZXNbcHJpb3JJbmRleF07XG5cdCAgICAgICAgdmFyIG5leHRQb2ludCA9IHRoaXMubm9kZXNbbmV4dEluZGV4XTtcblx0ICAgICAgICB2YXIgbG9jID0gbWF0aC5zY2FsZSh4LCBwcmlvclBvaW50LngsIG5leHRQb2ludC54LCAwLCAxKTtcblx0ICAgICAgICB2YXIgdmFsdWUgPSBtYXRoLmludGVycChsb2MsIHByaW9yUG9pbnQueSwgbmV4dFBvaW50LnkpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcInNjYW5cIiwgdmFsdWUpO1xuXHQgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1vdmVQb2ludDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIE1vdmUgYSBicmVha3BvaW50IG9uIHRoZSBlbnZlbG9wZS5cblx0ICAgICAgQHBhcmFtIGluZGV4IHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgYnJlYWtwb2ludCB0byBtb3ZlXG5cdCAgICAgIEBwYXJhbSB4IHtudW1iZXJ9IE5ldyB4IGxvY2F0aW9uLCBub3JtYWxpemVkIDAtMVxuXHQgICAgICBAcGFyYW0geSB7bnVtYmVyfSBOZXcgeSBsb2NhdGlvbiwgbm9ybWFsaXplZCAwLTFcblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBtb3ZlUG9pbnQoaW5kZXgsIHgsIHkpIHtcblx0ICAgICAgICB0aGlzLm5vZGVzW2luZGV4XS5tb3ZlKHgsIHkpO1xuXHQgICAgICAgIHRoaXMuc2NhbGVOb2RlKGluZGV4KTtcblx0ICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvaW50cygpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnBvaW50cyk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGFkanVzdFBvaW50OiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgTW92ZSBhIGJyZWFrcG9pbnQgb24gdGhlIGVudmVsb3BlIGJ5IGEgY2VydGFpbiBhbW91bnQuXG5cdCAgICAgIEBwYXJhbSBpbmRleCB7bnVtYmVyfSBUaGUgaW5kZXggb2YgdGhlIGJyZWFrcG9pbnQgdG8gbW92ZVxuXHQgICAgICBAcGFyYW0geE9mZnNldCB7bnVtYmVyfSBYIGRpc3BsYWNlbWVudCwgbm9ybWFsaXplZCAwLTFcblx0ICAgICAgQHBhcmFtIHlPZmZzZXQge251bWJlcn0gWSBkaXNwbGFjZW1lbnQsIG5vcm1hbGl6ZWQgMC0xXG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gYWRqdXN0UG9pbnQoaW5kZXgsIHhPZmZzZXQsIHlPZmZzZXQpIHtcblx0ICAgICAgICB0aGlzLm5vZGVzW2luZGV4XS5tb3ZlKHRoaXMubm9kZXNbaW5kZXhdLnggKyB4T2Zmc2V0LCB0aGlzLm5vZGVzW2luZGV4XS55ICsgeU9mZnNldCk7XG5cdCAgICAgICAgdGhpcy5zY2FsZU5vZGUoaW5kZXgpO1xuXHQgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9pbnRzKCk7XG5cdCAgICAgICAgdGhpcy5lbWl0KFwiY2hhbmdlXCIsIHRoaXMucG9pbnRzKTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgZGVzdHJveVBvaW50OiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgUmVtb3ZlIGEgYnJlYWtwb2ludCBmcm9tIHRoZSBlbnZlbG9wZS5cblx0ICAgICAgQHBhcmFtIGluZGV4IHtudW1iZXJ9IEluZGV4IG9mIHRoZSBicmVha3BvaW50IHRvIHJlbW92ZVxuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3lQb2ludChpbmRleCkge1xuXHQgICAgICAgIHRoaXMubm9kZXNbaW5kZXhdLmRlc3Ryb3koKTtcblx0ICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvaW50cygpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnBvaW50cyk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNldFBvaW50czoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIFJlbW92ZSBhbGwgZXhpc3RpbmcgYnJlYWtwb2ludHMgYW5kIGFkZCBhbiBlbnRpcmVseSBuZXcgc2V0IG9mIGJyZWFrcG9pbnRzLlxuXHQgICAgICBAcGFyYW0gYWxsUG9pbnRzIHthcnJheX0gQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHgveSBwcm9wZXJ0aWVzIChub3JtYWxpemVkIDAtMSkuIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheSBzcGVjaWZpY2VzIHRoZSB4L3kgbG9jYXRpb24gb2YgYSBuZXcgYnJlYWtwb2ludCB0byBiZSBhZGRlZC5cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQb2ludHMoYWxsUG9pbnRzKSB7XG5cdCAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblx0XG5cdCAgICAgICAgd2hpbGUgKHRoaXMubm9kZXMubGVuZ3RoKSB7XG5cdCAgICAgICAgICB0aGlzLm5vZGVzWzBdLmRlc3Ryb3koKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYWxsUG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHBvaW50KSB7XG5cdCAgICAgICAgICBfdGhpcy5hZGRQb2ludChwb2ludC54LCBwb2ludC55KTtcblx0ICAgICAgICB9KTtcblx0ICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvaW50cygpO1xuXHQgICAgICAgIHRoaXMuZW1pdChcImNoYW5nZVwiLCB0aGlzLnBvaW50cyk7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gRW52ZWxvcGU7XG5cdH0pKEludGVyZmFjZSk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IEVudmVsb3BlO1xuXG4vKioqLyB9KSxcbi8qIDM1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2dldCA9IGZ1bmN0aW9uIGdldChvYmplY3QsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IHJldHVybiBnZXQocGFyZW50LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpOyB9IH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MgJiYgZGVzYy53cml0YWJsZSkgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH07XG5cdFxuXHR2YXIgX2luaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH07XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHR2YXIgZG9tID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblx0Ly9sZXQgbWF0aCA9IHJlcXVpcmUoJy4uL3V0aWwvbWF0aCcpO1xuXHR2YXIgSW50ZXJmYWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0XG5cdC8qKlxuXHQqIFNwZWN0cm9ncmFtXG5cdCpcblx0KiBAZGVzY3JpcHRpb24gQXVkaW8gc3BlY3RydW0gdmlzdWFsaXphdGlvblxuXHQqXG5cdCogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJzcGVjdHJvZ3JhbVwiPjwvc3Bhbj5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIHNwZWN0cm9ncmFtID0gbmV3IE5leHVzLlNwZWN0cm9ncmFtKCcjdGFyZ2V0Jylcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIHNwZWN0cm9ncmFtID0gbmV3IE5leHVzLlNwZWN0cm9ncmFtKCcjdGFyZ2V0Jyx7XG5cdCogICAnc2l6ZSc6IFszMDAsMTUwXVxuXHQqIH0pXG5cdCpcblx0KiBAb3V0cHV0XG5cdCogJm5ic3A7XG5cdCogTm8gZXZlbnRzXG5cdCpcblx0Ki9cblx0XG5cdHZhciBjb250ZXh0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKS5jb250ZXh0O1xuXHRcblx0dmFyIFNwZWN0cm9ncmFtID0gKGZ1bmN0aW9uIChfSW50ZXJmYWNlKSB7XG5cdCAgZnVuY3Rpb24gU3BlY3Ryb2dyYW0oKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3BlY3Ryb2dyYW0pO1xuXHRcblx0ICAgIHZhciBvcHRpb25zID0gW1wic2NhbGVcIiwgXCJ2YWx1ZVwiXTtcblx0XG5cdCAgICB2YXIgZGVmYXVsdHMgPSB7XG5cdCAgICAgIHNpemU6IFszMDAsIDE1MF1cblx0ICAgIH07XG5cdFxuXHQgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoU3BlY3Ryb2dyYW0ucHJvdG90eXBlKSwgXCJjb25zdHJ1Y3RvclwiLCB0aGlzKS5jYWxsKHRoaXMsIGFyZ3VtZW50cywgb3B0aW9ucywgZGVmYXVsdHMpO1xuXHRcblx0ICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQoKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFxuXHQgICAgdGhpcy5hbmFseXNlciA9IHRoaXMuY29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuXHQgICAgdGhpcy5hbmFseXNlci5mZnRTaXplID0gMjA0ODtcblx0ICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudDtcblx0ICAgIHRoaXMuZGF0YUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXJMZW5ndGgpO1xuXHRcblx0ICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcblx0XG5cdCAgICB0aGlzLnNvdXJjZSA9IGZhbHNlO1xuXHRcblx0ICAgIHRoaXMuaW5pdCgpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKFNwZWN0cm9ncmFtLCBfSW50ZXJmYWNlKTtcblx0XG5cdCAgX2NyZWF0ZUNsYXNzKFNwZWN0cm9ncmFtLCB7XG5cdCAgICBidWlsZEZyYW1lOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEZyYW1lKCkge1xuXHQgICAgICAgIHRoaXMuY2FudmFzID0gbmV3IGRvbS5TbWFydENhbnZhcyh0aGlzLnBhcmVudCk7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5jYW52YXMuZWxlbWVudDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7XG5cdCAgICAgICAgdGhpcy5jYW52YXMucmVzaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0ICAgICAgICB0aGlzLmNhbnZhcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICByZW5kZXI6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG5cdCAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXIuYmluZCh0aGlzKSk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YUFycmF5KTtcblx0XG5cdCAgICAgICAgdGhpcy5jYW52YXMuY29udGV4dC5maWxsU3R5bGUgPSB0aGlzLmNvbG9ycy5maWxsO1xuXHQgICAgICAgIHRoaXMuY2FudmFzLmNvbnRleHQuZmlsbFJlY3QoMCwgMCwgdGhpcy5jYW52YXMuZWxlbWVudC53aWR0aCwgdGhpcy5jYW52YXMuZWxlbWVudC5oZWlnaHQpO1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5zb3VyY2UgJiYgdGhpcy5kYXRhQXJyYXkpIHtcblx0XG5cdCAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuZGF0YUFycmF5KTtcblx0XG5cdCAgICAgICAgICB2YXIgYmFyV2lkdGggPSB0aGlzLmNhbnZhcy5lbGVtZW50LndpZHRoIC8gdGhpcy5idWZmZXJMZW5ndGg7XG5cdCAgICAgICAgICB2YXIgYmFySGVpZ2h0ID0gdW5kZWZpbmVkO1xuXHQgICAgICAgICAgdmFyIHggPSAwO1xuXHRcblx0ICAgICAgICAgIHZhciBkZWZpbml0aW9uID0gdGhpcy5jYW52YXMuZWxlbWVudC53aWR0aCAvIDUwO1xuXHRcblx0ICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5idWZmZXJMZW5ndGg7IGkgPSBpICsgZGVmaW5pdGlvbikge1xuXHQgICAgICAgICAgICBiYXJIZWlnaHQgPSBNYXRoLm1heC5hcHBseShudWxsLCB0aGlzLmRhdGFBcnJheS5zdWJhcnJheShpLCBpICsgZGVmaW5pdGlvbikpO1xuXHQgICAgICAgICAgICBiYXJIZWlnaHQgLz0gMjU1O1xuXHQgICAgICAgICAgICBiYXJIZWlnaHQgKj0gdGhpcy5jYW52YXMuZWxlbWVudC5oZWlnaHQ7XG5cdFxuXHQgICAgICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxTdHlsZSA9IHRoaXMuY29sb3JzLmFjY2VudDtcblx0ICAgICAgICAgICAgdGhpcy5jYW52YXMuY29udGV4dC5maWxsUmVjdCh4LCB0aGlzLmNhbnZhcy5lbGVtZW50LmhlaWdodCAtIGJhckhlaWdodCwgYmFyV2lkdGggKiBkZWZpbml0aW9uLCBiYXJIZWlnaHQpO1xuXHRcblx0ICAgICAgICAgICAgeCArPSBiYXJXaWR0aCAqIGRlZmluaXRpb247XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29ubmVjdDoge1xuXHRcblx0ICAgICAgLyoqXG5cdCAgICAgIEVxdWl2YWxlbnQgdG8gXCJwYXRjaGluZyBpblwiIGFuIGF1ZGlvIG5vZGUgdG8gdmlzdWFsaXplLiBOT1RFOiBZb3UgY2Fubm90IGNvbm5lY3QgYXVkaW8gbm9kZXMgYWNyb3NzIHR3byBkaWZmZXJlbnQgYXVkaW8gY29udGV4dHMuIE5leHVzVUkgcnVucyBpdHMgYXVkaW8gYW5hbHlzaXMgb24gaXRzIG93biBhdWRpbyBjb250ZXh0LCBOZXh1cy5jb250ZXh0LiBJZiB0aGUgYXVkaW8gbm9kZSB5b3UgYXJlIHZpc3VhbGl6aW5nIGlzIGNyZWF0ZWQgb24gYSBkaWZmZXJlbnQgYXVkaW8gY29udGV4dCwgeW91IHdpbGwgbmVlZCB0byB0ZWxsIE5leHVzVUkgdG8gdXNlIHRoYXQgY29udGV4dCBpbnN0ZWFkOiBpLmUuIE5leHVzLmNvbnRleHQgPSBZb3VyQXVkaW9Db250ZXh0TmFtZS4gRm9yIGV4YW1wbGUsIGluIFRvbmVKUyBwcm9qZWN0cywgdGhlIGxpbmUgd291bGQgYmU6IE5leHVzLmNvbnRleHQgPSBUb25lLmNvbnRleHQgLiBXZSByZWNvbW1lbmQgdGhhdCB5b3Ugd3JpdGUgdGhhdCBsaW5lIG9mIGNvZGUgb25seSBvbmNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgeW91ciBwcm9qZWN0LlxuXHQgICAgICBAcGFyYW0gbm9kZSB7QXVkaW9Ob2RlfSBUaGUgYXVkaW8gbm9kZSB0byB2aXN1YWxpemVcblx0ICAgICAgQGV4YW1wbGUgTmV4dXMuY29udGV4dCA9IFRvbmUuY29udGV4dCAvLyBvciBhbm90aGVyIGF1ZGlvIGNvbnRleHQgeW91IGhhdmUgY3JlYXRlZFxuXHQgICAgICBzcGVjdHJvZ3JhbS5jb25uZWN0KCBUb25lLk1hc3RlciApO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbm5lY3Qobm9kZSkge1xuXHQgICAgICAgIGlmICh0aGlzLnNvdXJjZSkge1xuXHQgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMuc291cmNlID0gbm9kZTtcblx0ICAgICAgICB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpO1xuXHQgICAgICAgIHRoaXMucmVuZGVyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBkaXNjb25uZWN0OiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgU3RvcCB2aXN1YWxpemluZyB0aGUgc291cmNlIG5vZGUgYW5kIGRpc2Nvbm5lY3QgaXQuXG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzY29ubmVjdCgpIHtcblx0ICAgICAgICB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuYW5hbHlzZXIpO1xuXHQgICAgICAgIHRoaXMuc291cmNlID0gbnVsbDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsaWNrOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbGljaygpIHtcblx0ICAgICAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY3VzdG9tRGVzdHJveToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY3VzdG9tRGVzdHJveSgpIHtcblx0ICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBTcGVjdHJvZ3JhbTtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gU3BlY3Ryb2dyYW07XG5cbi8qKiovIH0pLFxuLyogMzYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBkb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXHR2YXIgbWF0aCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cdHZhciBJbnRlcmZhY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpO1xuXHRcblx0LyoqXG5cdCogTWV0ZXJcblx0KlxuXHQqIEBkZXNjcmlwdGlvbiBTdGVyZW8gZGVjaWJlbCBtZXRlclxuXHQqXG5cdCogQGRlbW8gPHNwYW4gbmV4dXMtdWk9XCJtZXRlclwiPjwvc3Bhbj5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIG1ldGVyID0gbmV3IE5leHVzLk1ldGVyKCcjdGFyZ2V0Jylcblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIG1ldGVyID0gbmV3IE5leHVzLk1ldGVyKCcjdGFyZ2V0Jyx7XG5cdCogICBzaXplOiBbNzUsNzVdXG5cdCogfSlcblx0KlxuXHQqIEBvdXRwdXRcblx0KiAmbmJzcDtcblx0KiBObyBldmVudHNcblx0KlxuXHQqL1xuXHRcblx0dmFyIGNvbnRleHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLmNvbnRleHQ7XG5cdFxuXHR2YXIgTWV0ZXIgPSAoZnVuY3Rpb24gKF9JbnRlcmZhY2UpIHtcblx0ICBmdW5jdGlvbiBNZXRlcigpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNZXRlcik7XG5cdFxuXHQgICAgdmFyIG9wdGlvbnMgPSBbXCJzY2FsZVwiLCBcInZhbHVlXCJdO1xuXHRcblx0ICAgIHZhciBkZWZhdWx0cyA9IHtcblx0ICAgICAgc2l6ZTogWzMwLCAxMDBdXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKE1ldGVyLnByb3RvdHlwZSksIFwiY29uc3RydWN0b3JcIiwgdGhpcykuY2FsbCh0aGlzLCBhcmd1bWVudHMsIG9wdGlvbnMsIGRlZmF1bHRzKTtcblx0XG5cdCAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0KCk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuXHRcblx0ICAgIHRoaXMuY2hhbm5lbHMgPSAyO1xuXHRcblx0ICAgIHRoaXMuc3BsaXR0ZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKHRoaXMuY2hhbm5lbHMpO1xuXHRcblx0ICAgIHRoaXMuYW5hbHlzZXJzID0gW107XG5cdFxuXHQgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoYW5uZWxzOyBpKyspIHtcblx0ICAgICAgdmFyIGFuYWx5c2VyID0gdGhpcy5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG5cdCAgICAgIHRoaXMuc3BsaXR0ZXIuY29ubmVjdChhbmFseXNlciwgaSk7XG5cdCAgICAgIGFuYWx5c2VyLmZmdFNpemUgPSAxMDI0O1xuXHQgICAgICBhbmFseXNlci5zbW9vdGhpbmdUaW1lQ29uc3RhbnQgPSAxO1xuXHQgICAgICB0aGlzLmFuYWx5c2Vycy5wdXNoKGFuYWx5c2VyKTtcblx0ICAgIH1cblx0ICAgIHRoaXMuYnVmZmVyTGVuZ3RoID0gdGhpcy5hbmFseXNlcnNbMF0uZnJlcXVlbmN5QmluQ291bnQ7XG5cdCAgICB0aGlzLmRhdGFBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5idWZmZXJMZW5ndGgpO1xuXHRcblx0ICAgIC8qXG5cdCAgICAgICAgLy8gYWRkIGxpbmVhciBncmFkaWVudFxuXHQgICAgICAgIHZhciBncmQgPSBjYW52YXNDdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMCwgY2FudmFzLmhlaWdodCk7XG5cdCAgICAgICAgLy8gbGlnaHQgYmx1ZVxuXHQgICAgICAgIGdyZC5hZGRDb2xvclN0b3AoMCwgJyMwMDAnKTtcblx0ICAgICAgICBncmQuYWRkQ29sb3JTdG9wKDAuMiwgJyNiYmInKTtcblx0ICAgICAgICBncmQuYWRkQ29sb3JTdG9wKDAuNCwgJyNkMTgnKTtcblx0ICAgICAgICAvLyBkYXJrIGJsdWVcblx0ICAgICAgICBncmQuYWRkQ29sb3JTdG9wKDEsICcjZDE4Jyk7XG5cdCAgICAgICAgY2FudmFzQ3R4LmZpbGxTdHlsZSA9IGdyZDsgKi9cblx0XG5cdCAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cdFxuXHQgICAgdGhpcy5kYiA9IC1JbmZpbml0eTtcblx0XG5cdCAgICB0aGlzLmluaXQoKTtcblx0XG5cdCAgICB0aGlzLm1ldGVyV2lkdGggPSB0aGlzLmNhbnZhcy5lbGVtZW50LndpZHRoIC8gdGhpcy5jaGFubmVscztcblx0XG5cdCAgICB0aGlzLnJlbmRlcigpO1xuXHQgIH1cblx0XG5cdCAgX2luaGVyaXRzKE1ldGVyLCBfSW50ZXJmYWNlKTtcblx0XG5cdCAgX2NyZWF0ZUNsYXNzKE1ldGVyLCB7XG5cdCAgICBidWlsZEZyYW1lOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEZyYW1lKCkge1xuXHQgICAgICAgIHRoaXMuY2FudmFzID0gbmV3IGRvbS5TbWFydENhbnZhcyh0aGlzLnBhcmVudCk7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5jYW52YXMuZWxlbWVudDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7XG5cdCAgICAgICAgdGhpcy5jYW52YXMucmVzaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0ICAgICAgICB0aGlzLmNhbnZhcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICByZW5kZXI6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG5cdCAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXIuYmluZCh0aGlzKSk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxTdHlsZSA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgdGhpcy5jYW52YXMuY29udGV4dC5maWxsUmVjdCgwLCAwLCB0aGlzLmNhbnZhcy5lbGVtZW50LndpZHRoLCB0aGlzLmNhbnZhcy5lbGVtZW50LmhlaWdodCk7XG5cdFxuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hbmFseXNlcnMubGVuZ3RoOyBpKyspIHtcblx0XG5cdCAgICAgICAgICBpZiAodGhpcy5zb3VyY2UpIHtcblx0XG5cdCAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldLmdldEZsb2F0VGltZURvbWFpbkRhdGEodGhpcy5kYXRhQXJyYXkpO1xuXHRcblx0ICAgICAgICAgICAgdmFyIHJtcyA9IDA7XG5cdFxuXHQgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5kYXRhQXJyYXkubGVuZ3RoOyBfaSsrKSB7XG5cdCAgICAgICAgICAgICAgcm1zICs9IHRoaXMuZGF0YUFycmF5W19pXSAqIHRoaXMuZGF0YUFycmF5W19pXTtcblx0ICAgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgICAgcm1zID0gTWF0aC5zcXJ0KHJtcyAvIHRoaXMuZGF0YUFycmF5Lmxlbmd0aCk7XG5cdFxuXHQgICAgICAgICAgICB0aGlzLmRiID0gMjAgKiBNYXRoLmxvZzEwKHJtcyk7XG5cdCAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGIgPiAtMjAwICYmIHRoaXMuZGIgIT09IC1JbmZpbml0eSkge1xuXHQgICAgICAgICAgICB0aGlzLmRiIC09IDE7XG5cdCAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICB0aGlzLmRiID0gLUluZmluaXR5O1xuXHQgICAgICAgICAgfVxuXHRcblx0ICAgICAgICAgIC8vY29uc29sZS5sb2coZGIpXG5cdFxuXHQgICAgICAgICAgaWYgKHRoaXMuZGIgPiAtNzApIHtcblx0XG5cdCAgICAgICAgICAgIHZhciBsaW5lYXIgPSBtYXRoLm5vcm1hbGl6ZSh0aGlzLmRiLCAtNzAsIDUpO1xuXHQgICAgICAgICAgICB2YXIgZXhwID0gbGluZWFyICogbGluZWFyO1xuXHQgICAgICAgICAgICB2YXIgeSA9IG1hdGguc2NhbGUoZXhwLCAwLCAxLCB0aGlzLmVsZW1lbnQuaGVpZ2h0LCAwKTtcblx0XG5cdCAgICAgICAgICAgIHRoaXMuY2FudmFzLmNvbnRleHQuZmlsbFN0eWxlID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuXHQgICAgICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxSZWN0KHRoaXMubWV0ZXJXaWR0aCAqIGksIHksIHRoaXMubWV0ZXJXaWR0aCwgdGhpcy5jYW52YXMuZWxlbWVudC5oZWlnaHQgLSB5KTtcblx0XG5cdCAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJyZW5kZXJpbmcuLi5cIilcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjb25uZWN0OiB7XG5cdFxuXHQgICAgICAvKipcblx0ICAgICAgRXF1aXZhbGVudCB0byBcInBhdGNoaW5nIGluXCIgYW4gYXVkaW8gbm9kZSB0byB2aXN1YWxpemUuIE5PVEU6IFlvdSBjYW5ub3QgY29ubmVjdCBhdWRpbyBub2RlcyBhY3Jvc3MgdHdvIGRpZmZlcmVudCBhdWRpbyBjb250ZXh0cy4gTmV4dXNVSSBydW5zIGl0cyBhdWRpbyBhbmFseXNpcyBvbiBpdHMgb3duIGF1ZGlvIGNvbnRleHQsIE5leHVzLmNvbnRleHQuIElmIHRoZSBhdWRpbyBub2RlIHlvdSBhcmUgdmlzdWFsaXppbmcgaXMgY3JlYXRlZCBvbiBhIGRpZmZlcmVudCBhdWRpbyBjb250ZXh0LCB5b3Ugd2lsbCBuZWVkIHRvIHRlbGwgTmV4dXNVSSB0byB1c2UgdGhhdCBjb250ZXh0IGluc3RlYWQ6IGkuZS4gTmV4dXMuY29udGV4dCA9IFlvdXJBdWRpb0NvbnRleHROYW1lLiBGb3IgZXhhbXBsZSwgaW4gVG9uZUpTIHByb2plY3RzLCB0aGUgbGluZSB3b3VsZCBiZTogTmV4dXMuY29udGV4dCA9IFRvbmUuY29udGV4dCAuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSB3cml0ZSB0aGF0IGxpbmUgb2YgY29kZSBvbmx5IG9uY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB5b3VyIHByb2plY3QuXG5cdCAgICAgIEBwYXJhbSBub2RlIHtBdWRpb05vZGV9IFRoZSBhdWRpbyBub2RlIHRvIHZpc3VhbGl6ZVxuXHQgICAgICBAcGFyYW0gY2hhbm5lbHMge251bWJlcn0gKG9wdGlvbmFsKSBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBzb3VyY2Ugbm9kZSB0byB3YXRjaC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGludGVyZmFjZSB3aWxsIGxvb2sgZm9yIGEgLmNoYW5uZWxDb3VudCBwcm9wZXJ0eSBvbiB0aGUgaW5wdXQgbm9kZS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIHRoZSBpbnRlcmZhY2Ugd2lsbCBkZWZhdWx0IHRvIDEgY2hhbm5lbC5cblx0ICAgICAgQGV4YW1wbGUgTmV4dXMuY29udGV4dCA9IFRvbmUuY29udGV4dCAvLyBvciBhbm90aGVyIGF1ZGlvIGNvbnRleHQgeW91IGhhdmUgY3JlYXRlZFxuXHQgICAgICBtZXRlci5jb25uZWN0KCBUb25lLk1hc3RlciwgMiApO1xuXHQgICAgICAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbm5lY3Qobm9kZSwgY2hhbm5lbHMpIHtcblx0ICAgICAgICBpZiAodGhpcy5zb3VyY2UpIHtcblx0ICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvL3RoaXMuZHVtbXkuZGlzY29ubmVjdCh0aGlzLnNwbGl0dGVyKTtcblx0XG5cdCAgICAgICAgaWYgKGNoYW5uZWxzKSB7XG5cdCAgICAgICAgICB0aGlzLmNoYW5uZWxzID0gY2hhbm5lbHM7XG5cdCAgICAgICAgfSBlbHNlIGlmIChub2RlLmNoYW5uZWxDb3VudCkge1xuXHQgICAgICAgICAgdGhpcy5jaGFubmVscyA9IG5vZGUuY2hhbm5lbENvdW50O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLmNoYW5uZWxzID0gMjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgdGhpcy5tZXRlcldpZHRoID0gdGhpcy5jYW52YXMuZWxlbWVudC53aWR0aCAvIHRoaXMuY2hhbm5lbHM7XG5cdFxuXHQgICAgICAgIHRoaXMuc291cmNlID0gbm9kZTtcblx0ICAgICAgICB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuc3BsaXR0ZXIpO1xuXHRcblx0ICAgICAgICAvLyAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGRpc2Nvbm5lY3Q6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBTdG9wIHZpc3VhbGl6aW5nIHRoZSBzb3VyY2Ugbm9kZSBhbmQgZGlzY29ubmVjdCBpdC5cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNjb25uZWN0KCkge1xuXHRcblx0ICAgICAgICB0aGlzLnNvdXJjZS5kaXNjb25uZWN0KHRoaXMuc3BsaXR0ZXIpO1xuXHQgICAgICAgIHRoaXMuc291cmNlID0gZmFsc2U7XG5cdCAgICAgICAgLy8gIHRoaXMuZHVtbXkuY29ubmVjdCh0aGlzLnNwbGl0dGVyKTtcblx0ICAgICAgICB0aGlzLm1ldGVyV2lkdGggPSB0aGlzLmNhbnZhcy5lbGVtZW50LndpZHRoIC8gdGhpcy5jaGFubmVscztcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNsaWNrOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbGljaygpIHtcblx0ICAgICAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcblx0ICAgICAgICB0aGlzLnJlbmRlcigpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY3VzdG9tRGVzdHJveToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY3VzdG9tRGVzdHJveSgpIHtcblx0ICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSk7XG5cdFxuXHQgIHJldHVybiBNZXRlcjtcblx0fSkoSW50ZXJmYWNlKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gTWV0ZXI7XG5cbi8qKiovIH0pLFxuLyogMzcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KG9iamVjdCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgcmV0dXJuIGdldChwYXJlbnQsIHByb3BlcnR5LCByZWNlaXZlcik7IH0gfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gZGVzYyAmJiBkZXNjLndyaXRhYmxlKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfTtcblx0XG5cdHZhciBfaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBkb20gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXHR2YXIgSW50ZXJmYWNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblx0XG5cdC8qKlxuXHQqIE9zY2lsbG9zY29wZVxuXHQqXG5cdCogQGRlc2NyaXB0aW9uIFZpc3VhbGl6ZXMgYSB3YXZlZm9ybSdzIHN0cmVhbSBvZiB2YWx1ZXMuXG5cdCpcblx0KiBAZGVtbyA8c3BhbiBuZXh1cy11aT1cIm9zY2lsbG9zY29wZVwiPjwvc3Bhbj5cblx0KlxuXHQqIEBleGFtcGxlXG5cdCogdmFyIG9zY2lsbG9zY29wZSA9IG5ldyBOZXh1cy5Pc2NpbGxvc2NvcGUoJyN0YXJnZXQnKVxuXHQqXG5cdCogQGV4YW1wbGVcblx0KiB2YXIgb3NjaWxsb3Njb3BlID0gbmV3IE5leHVzLk9zY2lsbG9zY29wZSgnI3RhcmdldCcse1xuXHQqICAgJ3NpemUnOiBbMzAwLDE1MF1cblx0KiB9KVxuXHQqXG5cdCogQG91dHB1dFxuXHQqICZuYnNwO1xuXHQqIE5vIGV2ZW50c1xuXHQqXG5cdCovXG5cdFxuXHR2YXIgY29udGV4dCA9IF9fd2VicGFja19yZXF1aXJlX18oMSkuY29udGV4dDtcblx0XG5cdHZhciBPc2NpbGxvc2NvcGUgPSAoZnVuY3Rpb24gKF9JbnRlcmZhY2UpIHtcblx0ICBmdW5jdGlvbiBPc2NpbGxvc2NvcGUoKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT3NjaWxsb3Njb3BlKTtcblx0XG5cdCAgICB2YXIgb3B0aW9ucyA9IFtcInNjYWxlXCIsIFwidmFsdWVcIl07XG5cdFxuXHQgICAgdmFyIGRlZmF1bHRzID0ge1xuXHQgICAgICBzaXplOiBbMzAwLCAxNTBdXG5cdCAgICB9O1xuXHRcblx0ICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKE9zY2lsbG9zY29wZS5wcm90b3R5cGUpLCBcImNvbnN0cnVjdG9yXCIsIHRoaXMpLmNhbGwodGhpcywgYXJndW1lbnRzLCBvcHRpb25zLCBkZWZhdWx0cyk7XG5cdFxuXHQgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dCgpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0XG5cdCAgICB0aGlzLmFuYWx5c2VyID0gdGhpcy5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG5cdCAgICB0aGlzLmFuYWx5c2VyLmZmdFNpemUgPSAyMDQ4O1xuXHQgICAgdGhpcy5idWZmZXJMZW5ndGggPSB0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50O1xuXHQgICAgdGhpcy5kYXRhQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlckxlbmd0aCk7XG5cdCAgICB0aGlzLmFuYWx5c2VyLmdldEJ5dGVUaW1lRG9tYWluRGF0YSh0aGlzLmRhdGFBcnJheSk7XG5cdFxuXHQgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuXHRcblx0ICAgIHRoaXMuc291cmNlID0gZmFsc2U7XG5cdFxuXHQgICAgdGhpcy5pbml0KCk7XG5cdFxuXHQgICAgdGhpcy5yZW5kZXIoKTtcblx0ICB9XG5cdFxuXHQgIF9pbmhlcml0cyhPc2NpbGxvc2NvcGUsIF9JbnRlcmZhY2UpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoT3NjaWxsb3Njb3BlLCB7XG5cdCAgICBidWlsZEZyYW1lOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEZyYW1lKCkge1xuXHQgICAgICAgIHRoaXMuY2FudmFzID0gbmV3IGRvbS5TbWFydENhbnZhcyh0aGlzLnBhcmVudCk7XG5cdCAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5jYW52YXMuZWxlbWVudDtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIHNpemVJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNpemVJbnRlcmZhY2UoKSB7XG5cdCAgICAgICAgdGhpcy5jYW52YXMucmVzaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9ySW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvckludGVyZmFjZSgpIHtcblx0ICAgICAgICB0aGlzLmNhbnZhcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3JzLmZpbGw7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICByZW5kZXI6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMuYWN0aXZlKSB7XG5cdCAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXIuYmluZCh0aGlzKSk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLmFuYWx5c2VyLmdldEJ5dGVUaW1lRG9tYWluRGF0YSh0aGlzLmRhdGFBcnJheSk7XG5cdFxuXHQgICAgICAgIHRoaXMuY2FudmFzLmNvbnRleHQuZmlsbFN0eWxlID0gdGhpcy5jb2xvcnMuZmlsbDtcblx0ICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmZpbGxSZWN0KDAsIDAsIHRoaXMuY2FudmFzLmVsZW1lbnQud2lkdGgsIHRoaXMuY2FudmFzLmVsZW1lbnQuaGVpZ2h0KTtcblx0XG5cdCAgICAgICAgdGhpcy5jYW52YXMuY29udGV4dC5saW5lV2lkdGggPSB+IH4odGhpcy5oZWlnaHQgLyAxMDAgKyAyKTtcblx0ICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gdGhpcy5jb2xvcnMuYWNjZW50O1xuXHRcblx0ICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5zb3VyY2UpIHtcblx0XG5cdCAgICAgICAgICB2YXIgc2xpY2VXaWR0aCA9IHRoaXMuY2FudmFzLmVsZW1lbnQud2lkdGggKiAxIC8gdGhpcy5idWZmZXJMZW5ndGg7XG5cdCAgICAgICAgICB2YXIgeCA9IDA7XG5cdFxuXHQgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJ1ZmZlckxlbmd0aDsgaSsrKSB7XG5cdFxuXHQgICAgICAgICAgICB2YXIgdiA9IHRoaXMuZGF0YUFycmF5W2ldIC8gMTI4O1xuXHQgICAgICAgICAgICB2YXIgeSA9IHYgKiB0aGlzLmNhbnZhcy5lbGVtZW50LmhlaWdodCAvIDI7XG5cdFxuXHQgICAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuXHQgICAgICAgICAgICAgIHRoaXMuY2FudmFzLmNvbnRleHQubW92ZVRvKHgsIHkpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgIHRoaXMuY2FudmFzLmNvbnRleHQubGluZVRvKHgsIHkpO1xuXHQgICAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgICB4ICs9IHNsaWNlV2lkdGg7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHRoaXMuY2FudmFzLmNvbnRleHQubW92ZVRvKDAsIHRoaXMuY2FudmFzLmVsZW1lbnQuaGVpZ2h0IC8gMik7XG5cdCAgICAgICAgICB0aGlzLmNhbnZhcy5jb250ZXh0LmxpbmVUbyh0aGlzLmNhbnZhcy5lbGVtZW50LndpZHRoLCB0aGlzLmNhbnZhcy5lbGVtZW50LmhlaWdodCAvIDIpO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgdGhpcy5jYW52YXMuY29udGV4dC5zdHJva2UoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbm5lY3Q6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBFcXVpdmFsZW50IHRvIFwicGF0Y2hpbmcgaW5cIiBhbiBhdWRpbyBub2RlIHRvIHZpc3VhbGl6ZS4gTk9URTogWW91IGNhbm5vdCBjb25uZWN0IGF1ZGlvIG5vZGVzIGFjcm9zcyB0d28gZGlmZmVyZW50IGF1ZGlvIGNvbnRleHRzLiBOZXh1c1VJIHJ1bnMgaXRzIGF1ZGlvIGFuYWx5c2lzIG9uIGl0cyBvd24gYXVkaW8gY29udGV4dCwgTmV4dXMuY29udGV4dC4gSWYgdGhlIGF1ZGlvIG5vZGUgeW91IGFyZSB2aXN1YWxpemluZyBpcyBjcmVhdGVkIG9uIGEgZGlmZmVyZW50IGF1ZGlvIGNvbnRleHQsIHlvdSB3aWxsIG5lZWQgdG8gdGVsbCBOZXh1c1VJIHRvIHVzZSB0aGF0IGNvbnRleHQgaW5zdGVhZDogaS5lLiBOZXh1cy5jb250ZXh0ID0gWW91ckF1ZGlvQ29udGV4dE5hbWUuIEZvciBleGFtcGxlLCBpbiBUb25lSlMgcHJvamVjdHMsIHRoZSBsaW5lIHdvdWxkIGJlOiBOZXh1cy5jb250ZXh0ID0gVG9uZS5jb250ZXh0IC4gV2UgcmVjb21tZW5kIHRoYXQgeW91IHdyaXRlIHRoYXQgbGluZSBvZiBjb2RlIG9ubHkgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHlvdXIgcHJvamVjdC5cblx0ICAgICAgQHBhcmFtIG5vZGUge0F1ZGlvTm9kZX0gVGhlIGF1ZGlvIG5vZGUgdG8gdmlzdWFsaXplXG5cdCAgICAgIEBleGFtcGxlIE5leHVzLmNvbnRleHQgPSBUb25lLmNvbnRleHQgLy8gb3IgYW5vdGhlciBhdWRpbyBjb250ZXh0IHlvdSBoYXZlIGNyZWF0ZWRcblx0ICAgICAgb3NjaWxsb3Njb3BlLmNvbm5lY3QoIFRvbmUuTWFzdGVyICk7XG5cdCAgICAgICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY29ubmVjdChub2RlKSB7XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLnNvdXJjZSkge1xuXHQgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLnNvdXJjZSA9IG5vZGU7XG5cdCAgICAgICAgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmFuYWx5c2VyKTtcblx0XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGRpc2Nvbm5lY3Q6IHtcblx0XG5cdCAgICAgIC8qKlxuXHQgICAgICBTdG9wIHZpc3VhbGl6aW5nIHRoZSBzb3VyY2Ugbm9kZSBhbmQgZGlzY29ubmVjdCBpdC5cblx0ICAgICAgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNjb25uZWN0KCkge1xuXHQgICAgICAgIGlmICh0aGlzLnNvdXJjZSkge1xuXHQgICAgICAgICAgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmFuYWx5c2VyKTtcblx0ICAgICAgICAgIHRoaXMuc291cmNlID0gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjbGljazoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xpY2soKSB7XG5cdCAgICAgICAgdGhpcy5hY3RpdmUgPSAhdGhpcy5hY3RpdmU7XG5cdCAgICAgICAgdGhpcy5yZW5kZXIoKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGN1c3RvbURlc3Ryb3k6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGN1c3RvbURlc3Ryb3koKSB7XG5cdCAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gT3NjaWxsb3Njb3BlO1xuXHR9KShJbnRlcmZhY2UpO1xuXHRcblx0bW9kdWxlLmV4cG9ydHMgPSBPc2NpbGxvc2NvcGU7XG5cbi8qKiovIH0pLFxuLyogMzggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfaW50ZXJvcFJlcXVpcmUgPSBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmpbXCJkZWZhdWx0XCJdIDogb2JqOyB9O1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGtleSBpbiBwcm9wcykgeyB2YXIgcHJvcCA9IHByb3BzW2tleV07IHByb3AuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKHByb3AudmFsdWUpIHByb3Aud3JpdGFibGUgPSB0cnVlOyB9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpOyB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cdFxuXHR2YXIgX2NsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH07XG5cdFxuXHQvKlxuXHRNYWluIGNvbmNlcHQ6XG5cdHN5bnRoID0gbmV3IE5leHVzLlJhY2soJ2VsZW1lbnRJRCcpO1xuXHRcblx0VHJhbnNmb3JtIGFsbCBlbGVtZW50cyBpbnNpZGUgdGhlIGRpdlxuXHRzeW50aC5lbGVtZW50SUQgd2lsbCBob2xkIHRoZSBmaXJzdCBzbGlkZXIgaW50ZXJmYWNlXG5cdFxuXHQyKSBJbiBmdXR1cmUsIHBvdGVudGlhbGx5IHdyaXRpbmcgYSByYWNrIHRoYXQgaXMgcmUtdXNhYmxlP1xuXHRDb3VsZCBhbHNvIHRha2UgSlNPTlxuXHRcblx0bmV3IE5leHVzLlJhY2soJyN0YXJnZXQnLHtcblx0ICBwcmU6ICgpID0+IHtcblx0ICAgIGNyZWF0ZSBzb21lIGRpdnMgaGVyZSwgb3Igc29tZSBhdWRpbyBjb2RlXG5cdCAgfSxcblx0ICBpbnRlcmZhY2U6IHtcblx0ICAgIHNsaWRlcjE6IE5leHVzLmFkZC5zbGlkZXIoe1xuXHQgICAgICB0b3A6MTAsXG5cdCAgICAgIGxlZnQ6MTAsXG5cdCAgICAgIHdpZHRoOjUwLFxuXHQgICAgICBoZWlnaHQ6MTAwLFxuXHQgICAgICBtaW46IDAsXG5cdCAgICAgIG1heDogMTAwLFxuXHQgICAgICBzdGVwOiAxXG5cdCAgICB9KSxcblx0ICAgIHdhdmUxOiBOZXh1cy5hZGQud2F2ZWZvcm0oe1xuXHQgICAgICBmaWxlOiAnLi9wYXRoL3RvL2ZpbGUubXAzJyxcblx0ICAgICAgd2lkdGg6NTAwLFxuXHQgICAgICBoZWlnaHQ6MTAwLFxuXHQgICAgICBtb2RlOiAncmFuZ2UnXG5cdCAgICB9KVxuXHQgIH0sXG5cdCAgaW5pdDogKCkgPT4ge1xuXHQgICAgLy8gc29tZSBhdWRpbyBpbml0IGNvZGUgZ29lcyBoZXJlLi4uXG5cdCAgfVxuXHR9KTtcblx0XG5cdCovXG5cdFxuXHR2YXIgdHJhbnNmb3JtID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX193ZWJwYWNrX3JlcXVpcmVfXygzOSkpO1xuXHRcblx0dmFyIGRvbSA9IF9pbnRlcm9wUmVxdWlyZShfX3dlYnBhY2tfcmVxdWlyZV9fKDcpKTtcblx0XG5cdHZhciBjb2xvcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLmNvbG9ycztcblx0XG5cdHZhciBSYWNrID0gKGZ1bmN0aW9uICgpIHtcblx0ICBmdW5jdGlvbiBSYWNrKHRhcmdldCwgc2V0dGluZ3MpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBSYWNrKTtcblx0XG5cdCAgICB0aGlzLm1ldGEgPSB7fTtcblx0ICAgIHRoaXMubWV0YS50YXJnZXQgPSB0YXJnZXQ7XG5cdCAgICB0aGlzLm1ldGEucGFyZW50ID0gZG9tLnBhcnNlRWxlbWVudCh0YXJnZXQpOyAvLyBzaG91bGQgYmUgYSBnZW5lcmljIGZ1bmN0aW9uIGZvciBwYXJzaW5nIGEgJ3RhcmdldCcgYXJndW1lbnQgdGhhdCBjaGVja3MgZm9yIHN0cmluZy9ET00valFVRVJZXG5cdCAgICB0aGlzLm1ldGEuY29sb3JzID0ge307XG5cdFxuXHQgICAgaWYgKHNldHRpbmdzKSB7XG5cdCAgICAgIHRoaXMubWV0YS5hdHRyaWJ1dGUgPSBzZXR0aW5ncy5hdHRyaWJ1dGUgfHwgXCJuZXh1cy11aVwiO1xuXHQgICAgICB0aGlzLm1ldGEudGl0bGUgPSBzZXR0aW5ncy5uYW1lIHx8IGZhbHNlO1xuXHQgICAgICB0aGlzLm1ldGEub3BlbiA9IHNldHRpbmdzLm9wZW4gfHwgZmFsc2U7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLm1ldGEuYXR0cmlidXRlID0gXCJuZXh1cy11aVwiO1xuXHQgICAgICB0aGlzLm1ldGEudGl0bGUgPSBmYWxzZTtcblx0ICAgICAgdGhpcy5tZXRhLm9wZW4gPSBmYWxzZTtcblx0ICAgIH1cblx0XG5cdCAgICB2YXIgZGVmYXVsdENvbG9ycyA9IGNvbG9ycygpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcblx0ICAgIHRoaXMubWV0YS5jb2xvcnMuYWNjZW50ID0gZGVmYXVsdENvbG9ycy5hY2NlbnQ7XG5cdCAgICB0aGlzLm1ldGEuY29sb3JzLmZpbGwgPSBkZWZhdWx0Q29sb3JzLmZpbGw7XG5cdCAgICB0aGlzLm1ldGEuY29sb3JzLmxpZ2h0ID0gZGVmYXVsdENvbG9ycy5saWdodDtcblx0ICAgIHRoaXMubWV0YS5jb2xvcnMuZGFyayA9IGRlZmF1bHRDb2xvcnMuZGFyaztcblx0ICAgIHRoaXMubWV0YS5jb2xvcnMubWVkaXVtTGlnaHQgPSBkZWZhdWx0Q29sb3JzLm1lZGl1bUxpZ2h0O1xuXHQgICAgdGhpcy5tZXRhLmNvbG9ycy5tZWRpdW1EYXJrID0gZGVmYXVsdENvbG9ycy5tZWRpdW1EYXJrO1xuXHQgICAgdGhpcy5idWlsZEludGVyZmFjZSgpO1xuXHQgICAgdGhpcy5jb2xvckludGVyZmFjZSgpO1xuXHQgIH1cblx0XG5cdCAgX2NyZWF0ZUNsYXNzKFJhY2ssIHtcblx0ICAgIGJ1aWxkSW50ZXJmYWNlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEludGVyZmFjZSgpIHtcblx0ICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXHRcblx0ICAgICAgICB0aGlzLm1ldGEucGFyZW50LnN0eWxlLmJveFNpemluZyA9IFwiYm9yZGVyLWJveFwiO1xuXHQgICAgICAgIHRoaXMubWV0YS5wYXJlbnQuc3R5bGUudXNlclNlbGVjdCA9IFwibm9uZVwiO1xuXHQgICAgICAgIHRoaXMubWV0YS5wYXJlbnQuc3R5bGUubW96VXNlclNlbGVjdCA9IFwibm9uZVwiO1xuXHQgICAgICAgIHRoaXMubWV0YS5wYXJlbnQuc3R5bGUud2Via2l0VXNlclNlbGVjdCA9IFwibm9uZVwiO1xuXHRcblx0ICAgICAgICB0aGlzLm1ldGEuY29udGVudHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcblx0ICAgICAgICB3aGlsZSAodGhpcy5tZXRhLnBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgIHRoaXMubWV0YS5jb250ZW50cy5hcHBlbmRDaGlsZCh0aGlzLm1ldGEucGFyZW50LmNoaWxkTm9kZXNbMF0pO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgdGhpcy5tZXRhLmNvbnRlbnRzLnN0eWxlLnBhZGRpbmcgPSBcIjBweFwiO1xuXHQgICAgICAgIHRoaXMubWV0YS5jb250ZW50cy5zdHlsZS5ib3hTaXppbmcgPSBcImJvcmRlci1ib3hcIjtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMubWV0YS50aXRsZSkge1xuXHQgICAgICAgICAgdGhpcy5tZXRhLnRpdGxlQmFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0ICAgICAgICAgIHRoaXMubWV0YS50aXRsZUJhci5pbm5lckhUTUwgPSB0aGlzLm1ldGEudGl0bGU7XG5cdCAgICAgICAgICB0aGlzLm1ldGEudGl0bGVCYXIuc3R5bGUuZm9udEZhbWlseSA9IFwiYXJpYWxcIjtcblx0ICAgICAgICAgIHRoaXMubWV0YS50aXRsZUJhci5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0ICAgICAgICAgIHRoaXMubWV0YS50aXRsZUJhci5zdHlsZS5jb2xvciA9IFwiIzg4OFwiO1xuXHQgICAgICAgICAgdGhpcy5tZXRhLnRpdGxlQmFyLnN0eWxlLnBhZGRpbmcgPSBcIjdweFwiO1xuXHQgICAgICAgICAgdGhpcy5tZXRhLnRpdGxlQmFyLnN0eWxlLmZvbnRTaXplID0gXCIxMnB4XCI7XG5cdFxuXHQgICAgICAgICAgdGhpcy5tZXRhLmJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdCAgICAgICAgICB0aGlzLm1ldGEuYnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXHQgICAgICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS50b3AgPSBcIjVweFwiO1xuXHQgICAgICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5yaWdodCA9IFwiNXB4XCI7XG5cdCAgICAgICAgICB0aGlzLm1ldGEuYnV0dG9uLmlubmVySFRNTCA9IFwiLVwiO1xuXHQgICAgICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5wYWRkaW5nID0gXCIwcHggNXB4IDJweFwiO1xuXHQgICAgICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5saW5lSGVpZ2h0ID0gXCIxMnB4XCI7XG5cdCAgICAgICAgICB0aGlzLm1ldGEuYnV0dG9uLnN0eWxlLmZvbnRTaXplID0gXCIxNXB4XCI7XG5cdFxuXHQgICAgICAgICAgdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5jdXJzb3IgPSBcInBvaW50ZXJcIjtcblx0XG5cdCAgICAgICAgICB0aGlzLm1ldGEuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBfdGhpcy5tZXRhLmJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBfdGhpcy5tZXRhLmNvbG9ycy5tZWRpdW1EYXJrO1xuXHQgICAgICAgICAgfSk7XG5cdCAgICAgICAgICB0aGlzLm1ldGEuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgX3RoaXMubWV0YS5idXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gX3RoaXMubWV0YS5jb2xvcnMubWVkaXVtTGlnaHQ7XG5cdCAgICAgICAgICB9KTtcblx0ICAgICAgICAgIHRoaXMubWV0YS5idXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKF90aGlzLm1ldGEub3Blbikge1xuXHQgICAgICAgICAgICAgIF90aGlzLmhpZGUoKTtcblx0ICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICBfdGhpcy5zaG93KCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH0pO1xuXHRcblx0ICAgICAgICAgIHRoaXMubWV0YS50aXRsZUJhci5hcHBlbmRDaGlsZCh0aGlzLm1ldGEuYnV0dG9uKTtcblx0XG5cdCAgICAgICAgICB0aGlzLm1ldGEucGFyZW50LmFwcGVuZENoaWxkKHRoaXMubWV0YS50aXRsZUJhcik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubWV0YS5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5tZXRhLmNvbnRlbnRzKTtcblx0XG5cdCAgICAgICAgLy8gIHZhciB3aWR0aCA9IHRoaXMubWV0YS5wYXJlbnQuc3R5bGUud2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMubWV0YS5wYXJlbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyk7XG5cdCAgICAgICAgLy8gICAgdGhpcy5tZXRhLnBhcmVudC5zdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcblx0ICAgICAgICB2YXIgdWkgPSB0cmFuc2Zvcm0uc2VjdGlvbih0aGlzLm1ldGEudGFyZ2V0LCB0aGlzLm1ldGEuYXR0cmlidXRlKTtcblx0ICAgICAgICBmb3IgKHZhciBrZXkgaW4gdWkpIHtcblx0ICAgICAgICAgIHRoaXNba2V5XSA9IHVpW2tleV07XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY29sb3JJbnRlcmZhY2U6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbG9ySW50ZXJmYWNlKCkge1xuXHQgICAgICAgIGlmICh0aGlzLm1ldGEudGl0bGUpIHtcblx0ICAgICAgICAgIHRoaXMubWV0YS5idXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5tZXRhLmNvbG9ycy5tZWRpdW1MaWdodDtcblx0ICAgICAgICAgIHRoaXMubWV0YS5idXR0b24uc3R5bGUuYm9yZGVyID0gXCJzb2xpZCAwcHggXCIgKyB0aGlzLm1ldGEuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgICB0aGlzLm1ldGEucGFyZW50LnN0eWxlLmJvcmRlciA9IFwic29saWQgMXB4IFwiICsgdGhpcy5tZXRhLmNvbG9ycy5tZWRpdW1MaWdodDtcblx0ICAgICAgICAgIHRoaXMubWV0YS5wYXJlbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5tZXRhLmNvbG9ycy5saWdodDtcblx0ICAgICAgICAgIHRoaXMubWV0YS50aXRsZUJhci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1ldGEuY29sb3JzLmZpbGw7XG5cdCAgICAgICAgfVxuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2hvdzoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdygpIHtcblx0ICAgICAgICB0aGlzLm1ldGEuY29udGVudHMuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0ICAgICAgICB0aGlzLm1ldGEub3BlbiA9IHRydWU7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBoaWRlOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBoaWRlKCkge1xuXHQgICAgICAgIHRoaXMubWV0YS5jb250ZW50cy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdCAgICAgICAgdGhpcy5tZXRhLm9wZW4gPSBmYWxzZTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNvbG9yaXplOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb2xvcml6ZSh0eXBlLCBjb2xvcikge1xuXHQgICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzKSB7XG5cdCAgICAgICAgICBpZiAodGhpc1trZXldLmNvbG9yaXplKSB7XG5cdCAgICAgICAgICAgIHRoaXNba2V5XS5jb2xvcml6ZSh0eXBlLCBjb2xvcik7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubWV0YS5jb2xvcnNbdHlwZV0gPSBjb2xvcjtcblx0ICAgICAgICB0aGlzLmNvbG9ySW50ZXJmYWNlKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBlbXB0eToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gZW1wdHkoKSB7XG5cdCAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMpIHtcblx0ICAgICAgICAgIGlmICh0aGlzW2tleV0uZGVzdHJveSkge1xuXHQgICAgICAgICAgICB0aGlzW2tleV0uZGVzdHJveSgpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gUmFjaztcblx0fSkoKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gUmFjaztcblxuLyoqKi8gfSksXG4vKiAzOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9pbnRlcm9wUmVxdWlyZSA9IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9ialtcImRlZmF1bHRcIl0gOiBvYmo7IH07XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgZG9tID0gX2ludGVyb3BSZXF1aXJlKF9fd2VicGFja19yZXF1aXJlX18oNykpO1xuXHRcblx0dmFyIEludGVyZmFjZXMgPSBfaW50ZXJvcFJlcXVpcmUoX193ZWJwYWNrX3JlcXVpcmVfXygyKSk7XG5cdFxuXHR2YXIgY3JlYXRlSW50ZXJmYWNlSUQgPSBmdW5jdGlvbiAod2lkZ2V0LCBpbnRlcmZhY2VJRHMpIHtcblx0ICB2YXIgdHlwZSA9IHdpZGdldC50eXBlO1xuXHQgIGlmIChpbnRlcmZhY2VJRHNbdHlwZV0pIHtcblx0ICAgIGludGVyZmFjZUlEc1t0eXBlXSsrO1xuXHQgIH0gZWxzZSB7XG5cdCAgICBpbnRlcmZhY2VJRHNbdHlwZV0gPSAxO1xuXHQgIH1cblx0ICByZXR1cm4gdHlwZSArIGludGVyZmFjZUlEc1t0eXBlXTtcblx0fTtcblx0XG5cdHZhciBlbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9wdGlvbnMpIHtcblx0ICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblx0ICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgdmFyIGF0dCA9IGVsZW1lbnQuYXR0cmlidXRlc1tpXTtcblx0ICAgIC8vICB0cnkge1xuXHQgICAgLy8gICAgb3B0aW9uc1thdHQubm9kZU5hbWVdID0gZXZhbChhdHQubm9kZVZhbHVlKTtcblx0ICAgIC8vICB9IGNhdGNoKGUpIHtcblx0ICAgIG9wdGlvbnNbYXR0Lm5vZGVOYW1lXSA9IGF0dC5ub2RlVmFsdWU7XG5cdCAgICAvLyAgfVxuXHQgIH1cblx0ICB0eXBlID0gdHlwZVswXS50b1VwcGVyQ2FzZSgpICsgdHlwZS5zbGljZSgxKTtcblx0ICB2YXIgd2lkZ2V0ID0gbmV3IEludGVyZmFjZXNbdHlwZV0oZWxlbWVudCwgb3B0aW9ucyk7XG5cdCAgd2lkZ2V0LmlkID0gZWxlbWVudC5pZDtcblx0ICByZXR1cm4gd2lkZ2V0O1xuXHR9O1xuXHRcblx0dmFyIHNlY3Rpb24gPSBmdW5jdGlvbiAocGFyZW50LCBrZXl3b3JkKSB7XG5cdFxuXHQgIGtleXdvcmQgPSBrZXl3b3JkIHx8IFwibmV4dXMtdWlcIjtcblx0XG5cdCAgdmFyIGludGVyZmFjZUlEcyA9IHt9O1xuXHRcblx0ICB2YXIgY29udGFpbmVyID0gZG9tLnBhcnNlRWxlbWVudChwYXJlbnQpO1xuXHRcblx0ICB2YXIgdWkgPSB7fTtcblx0XG5cdCAgdmFyIGh0bWxFbGVtZW50cyA9IGNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIik7XG5cdCAgdmFyIGVsZW1lbnRzID0gW107XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG1sRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgIGVsZW1lbnRzLnB1c2goaHRtbEVsZW1lbnRzW2ldKTtcblx0ICB9XG5cdCAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgdmFyIHR5cGUgPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoa2V5d29yZCk7XG5cdCAgICBpZiAodHlwZSkge1xuXHQgICAgICB2YXIgZm9ybWF0dGVkVHlwZSA9IGZhbHNlO1xuXHQgICAgICBmb3IgKHZhciBrZXkgaW4gSW50ZXJmYWNlcykge1xuXHQgICAgICAgIGlmICh0eXBlLnRvTG93ZXJDYXNlKCkgPT09IGtleS50b0xvd2VyQ2FzZSgpKSB7XG5cdCAgICAgICAgICBmb3JtYXR0ZWRUeXBlID0ga2V5O1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBjb25zb2xlLmxvZyhmb3JtYXR0ZWRUeXBlKTtcblx0ICAgICAgdmFyIHdpZGdldCA9IGVsZW1lbnQoZWxlbWVudHNbaV0sIGZvcm1hdHRlZFR5cGUpO1xuXHQgICAgICBpZiAod2lkZ2V0LmlkKSB7XG5cdCAgICAgICAgdWlbd2lkZ2V0LmlkXSA9IHdpZGdldDtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICB2YXIgaWQgPSBjcmVhdGVJbnRlcmZhY2VJRCh3aWRnZXQsIGludGVyZmFjZUlEcyk7XG5cdCAgICAgICAgdWlbaWRdID0gd2lkZ2V0O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfVxuXHRcblx0ICByZXR1cm4gdWk7XG5cdH07XG5cdFxuXHR2YXIgYWRkID0gZnVuY3Rpb24gKHR5cGUsIHBhcmVudCwgb3B0aW9ucykge1xuXHQgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHQgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXHQgIGlmIChwYXJlbnQpIHtcblx0ICAgIHBhcmVudCA9IGRvbS5wYXJzZUVsZW1lbnQocGFyZW50KTtcblx0ICB9IGVsc2Uge1xuXHQgICAgcGFyZW50ID0gZG9jdW1lbnQuYm9keTtcblx0ICB9XG5cdCAgcGFyZW50LmFwcGVuZENoaWxkKHRhcmdldCk7XG5cdCAgb3B0aW9ucy50YXJnZXQgPSB0YXJnZXQ7XG5cdCAgaWYgKG9wdGlvbnMuc2l6ZSkge1xuXHQgICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gb3B0aW9ucy5zaXplWzBdICsgXCJweFwiO1xuXHQgICAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IG9wdGlvbnMuc2l6ZVsxXSArIFwicHhcIjtcblx0ICB9XG5cdCAgcmV0dXJuIGVsZW1lbnQodGFyZ2V0LCB0eXBlLCBvcHRpb25zKTtcblx0fTtcblx0XG5cdGV4cG9ydHMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cdGV4cG9ydHMuc2VjdGlvbiA9IHNlY3Rpb247XG5cdGV4cG9ydHMuYWRkID0gYWRkO1xuXG4vKioqLyB9KSxcbi8qIDQwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdFxuXHR2YXIgX2ludGVyb3BSZXF1aXJlID0gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqW1wiZGVmYXVsdFwiXSA6IG9iajsgfTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBtYXRoID0gX2ludGVyb3BSZXF1aXJlKF9fd2VicGFja19yZXF1aXJlX18oNSkpO1xuXHRcblx0dmFyIFR1bmUgPSAoZnVuY3Rpb24gKCkge1xuXHQgIGZ1bmN0aW9uIFR1bmUoKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHVuZSk7XG5cdFxuXHQgICAgLy8gdGhlIHNjYWxlIGFzIHJhdGlvc1xuXHQgICAgdGhpcy5zY2FsZSA9IFtdO1xuXHRcblx0ICAgIC8vIGkvbyBtb2Rlc1xuXHQgICAgdGhpcy5tb2RlID0ge1xuXHQgICAgICBvdXRwdXQ6IFwiZnJlcXVlbmN5XCIsXG5cdCAgICAgIGlucHV0OiBcInN0ZXBcIlxuXHQgICAgfTtcblx0XG5cdCAgICAvLyBFVCBtYWpvclxuXHQgICAgdGhpcy5ldG1ham9yID0gWzI2MS42MjU1OCwgMjkzLjY2NDc2NCwgMzI5LjYyNzU2MywgMzQ5LjIyODI0MSwgMzkxLjk5NTQyMiwgNDQwLCA0OTMuODgzMzAxLCA1MjMuMjUxMTZdO1xuXHRcblx0ICAgIC8vIFJvb3QgZnJlcXVlbmN5LlxuXHQgICAgdGhpcy5yb290ID0gbWF0aC5tdG9mKDYwKTsgLy8gKiBNYXRoLnBvdygyLCg2MC02OSkvMTIpO1xuXHRcblx0ICAgIC8vIGRlZmF1bHQgaXMgYSBtYWpvciBzY2FsZVxuXHQgICAgdGhpcy5jcmVhdGVTY2FsZSgwLCAyLCA0LCA1LCA3LCA5LCAxMSk7XG5cdCAgfVxuXHRcblx0ICBfY3JlYXRlQ2xhc3MoVHVuZSwge1xuXHQgICAgbm90ZToge1xuXHRcblx0ICAgICAgLyogUmV0dXJuIGRhdGEgaW4gdGhlIG1vZGUgeW91IGFyZSBpbiAoZnJlcSwgcmF0aW8sIG9yIG1pZGkpICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gbm90ZShpbnB1dCwgb2N0YXZlKSB7XG5cdFxuXHQgICAgICAgIHZhciBuZXd2YWx1ZSA9IHVuZGVmaW5lZDtcblx0XG5cdCAgICAgICAgaWYgKHRoaXMubW9kZS5vdXRwdXQgPT09IFwiZnJlcXVlbmN5XCIpIHtcblx0ICAgICAgICAgIG5ld3ZhbHVlID0gdGhpcy5mcmVxdWVuY3koaW5wdXQsIG9jdGF2ZSk7XG5cdCAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUub3V0cHV0ID09PSBcInJhdGlvXCIpIHtcblx0ICAgICAgICAgIG5ld3ZhbHVlID0gdGhpcy5yYXRpbyhpbnB1dCwgb2N0YXZlKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZS5vdXRwdXQgPT09IFwiTUlESVwiKSB7XG5cdCAgICAgICAgICBuZXd2YWx1ZSA9IHRoaXMuTUlESShpbnB1dCwgb2N0YXZlKTtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgbmV3dmFsdWUgPSB0aGlzLmZyZXF1ZW5jeShpbnB1dCwgb2N0YXZlKTtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIHJldHVybiBuZXd2YWx1ZTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGZyZXF1ZW5jeToge1xuXHRcblx0ICAgICAgLyogUmV0dXJuIGZyZXEgZGF0YSAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZyZXF1ZW5jeShzdGVwSW4sIG9jdGF2ZUluKSB7XG5cdFxuXHQgICAgICAgIGlmICh0aGlzLm1vZGUuaW5wdXQgPT09IFwibWlkaVwiIHx8IHRoaXMubW9kZS5pbnB1dCA9PT0gXCJNSURJXCIpIHtcblx0ICAgICAgICAgIHRoaXMuc3RlcEluICs9IDYwO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgLy8gd2hhdCBvY3RhdmUgaXMgb3VyIGlucHV0XG5cdCAgICAgICAgdmFyIG9jdGF2ZSA9IE1hdGguZmxvb3Ioc3RlcEluIC8gdGhpcy5zY2FsZS5sZW5ndGgpO1xuXHRcblx0ICAgICAgICBpZiAob2N0YXZlSW4pIHtcblx0ICAgICAgICAgIG9jdGF2ZSArPSBvY3RhdmVJbjtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIC8vIHdoaWNoIHNjYWxlIGRlZ3JlZSAoMCAtIHNjYWxlIGxlbmd0aCkgaXMgb3VyIGlucHV0XG5cdCAgICAgICAgdmFyIHNjYWxlRGVncmVlID0gc3RlcEluICUgdGhpcy5zY2FsZS5sZW5ndGg7XG5cdFxuXHQgICAgICAgIHdoaWxlIChzY2FsZURlZ3JlZSA8IDApIHtcblx0ICAgICAgICAgIHNjYWxlRGVncmVlICs9IHRoaXMuc2NhbGUubGVuZ3RoO1xuXHQgICAgICAgIH1cblx0XG5cdCAgICAgICAgdmFyIHJhdGlvID0gdGhpcy5zY2FsZVtzY2FsZURlZ3JlZV07XG5cdFxuXHQgICAgICAgIHZhciBmcmVxID0gdGhpcy5yb290ICogcmF0aW87XG5cdFxuXHQgICAgICAgIGZyZXEgPSBmcmVxICogTWF0aC5wb3coMiwgb2N0YXZlKTtcblx0XG5cdCAgICAgICAgLy8gdHJ1bmNhdGUgaXJyYXRpb25hbCBudW1iZXJzXG5cdCAgICAgICAgZnJlcSA9IE1hdGguZmxvb3IoZnJlcSAqIDEwMDAwMDAwMDAwMCkgLyAxMDAwMDAwMDAwMDA7XG5cdFxuXHQgICAgICAgIHJldHVybiBmcmVxO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgcmF0aW86IHtcblx0XG5cdCAgICAgIC8qIEZvcmNlIHJldHVybiByYXRpbyBkYXRhICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gcmF0aW8oc3RlcEluLCBvY3RhdmVJbikge1xuXHRcblx0ICAgICAgICBpZiAodGhpcy5tb2RlLmlucHV0ID09PSBcIm1pZGlcIiB8fCB0aGlzLm1vZGUuaW5wdXQgPT09IFwiTUlESVwiKSB7XG5cdCAgICAgICAgICB0aGlzLnN0ZXBJbiArPSA2MDtcblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIC8vIHdoYXQgb2N0YXZlIGlzIG91ciBpbnB1dFxuXHQgICAgICAgIHZhciBvY3RhdmUgPSBNYXRoLmZsb29yKHN0ZXBJbiAvIHRoaXMuc2NhbGUubGVuZ3RoKTtcblx0XG5cdCAgICAgICAgaWYgKG9jdGF2ZUluKSB7XG5cdCAgICAgICAgICBvY3RhdmUgKz0gb2N0YXZlSW47XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICAvLyB3aGljaCBzY2FsZSBkZWdyZWUgKDAgLSBzY2FsZSBsZW5ndGgpIGlzIG91ciBpbnB1dFxuXHQgICAgICAgIHZhciBzY2FsZURlZ3JlZSA9IHN0ZXBJbiAlIHRoaXMuc2NhbGUubGVuZ3RoO1xuXHRcblx0ICAgICAgICAvLyB3aGF0IHJhdGlvIGlzIG91ciBpbnB1dCB0byBvdXIga2V5XG5cdCAgICAgICAgdmFyIHJhdGlvID0gTWF0aC5wb3coMiwgb2N0YXZlKSAqIHRoaXMuc2NhbGVbc2NhbGVEZWdyZWVdO1xuXHRcblx0ICAgICAgICByYXRpbyA9IE1hdGguZmxvb3IocmF0aW8gKiAxMDAwMDAwMDAwMDApIC8gMTAwMDAwMDAwMDAwO1xuXHRcblx0ICAgICAgICByZXR1cm4gcmF0aW87XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBNSURJOiB7XG5cdFxuXHQgICAgICAvKiBGb3JjZSByZXR1cm4gYWRqdXN0ZWQgTUlESSBkYXRhICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gTUlESShzdGVwSW4sIG9jdGF2ZUluKSB7XG5cdFxuXHQgICAgICAgIHZhciBuZXd2YWx1ZSA9IHRoaXMuZnJlcXVlbmN5KHN0ZXBJbiwgb2N0YXZlSW4pO1xuXHRcblx0ICAgICAgICB2YXIgbiA9IDY5ICsgMTIgKiBNYXRoLmxvZyhuZXd2YWx1ZSAvIDQ0MCkgLyBNYXRoLmxvZygyKTtcblx0XG5cdCAgICAgICAgbiA9IE1hdGguZmxvb3IobiAqIDEwMDAwMDAwMDApIC8gMTAwMDAwMDAwMDtcblx0XG5cdCAgICAgICAgcmV0dXJuIG47XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBjcmVhdGVTY2FsZToge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlU2NhbGUoKSB7XG5cdCAgICAgICAgdmFyIG5ld1NjYWxlID0gW107XG5cdCAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgIG5ld1NjYWxlLnB1c2gobWF0aC5tdG9mKDYwICsgYXJndW1lbnRzW2ldKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRoaXMubG9hZFNjYWxlRnJvbUZyZXF1ZW5jaWVzKG5ld1NjYWxlKTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGNyZWF0ZUpJU2NhbGU6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUpJU2NhbGUoKSB7XG5cdCAgICAgICAgdGhpcy5zY2FsZSA9IFtdO1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICB0aGlzLnNjYWxlLnB1c2goYXJndW1lbnRzW2ldKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBsb2FkU2NhbGVGcm9tRnJlcXVlbmNpZXM6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWRTY2FsZUZyb21GcmVxdWVuY2llcyhmcmVxcykge1xuXHQgICAgICAgIHRoaXMuc2NhbGUgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyZXFzLmxlbmd0aCAtIDE7IGkrKykge1xuXHQgICAgICAgICAgdGhpcy5zY2FsZS5wdXNoKGZyZXFzW2ldIC8gZnJlcXNbMF0pO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIGxvYWRTY2FsZToge1xuXHRcblx0ICAgICAgLyogTG9hZCBhIG5ldyBzY2FsZSAqL1xuXHRcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWRTY2FsZShuYW1lKSB7XG5cdFxuXHQgICAgICAgIC8qIGxvYWQgdGhlIHNjYWxlICovXG5cdCAgICAgICAgdmFyIGZyZXFzID0gdGhpcy5zY2FsZXNbbmFtZV0uZnJlcXVlbmNpZXM7XG5cdCAgICAgICAgdGhpcy5sb2FkU2NhbGVGcm9tRnJlcXVlbmNpZXMoZnJlcXMpO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgc2VhcmNoOiB7XG5cdFxuXHQgICAgICAvKiBTZWFyY2ggdGhlIG5hbWVzIG9mIHR1bmluZ3Ncblx0ICAgICAgXHQgUmV0dXJucyBhbiBhcnJheSBvZiBuYW1lcyBvZiB0dW5pbmdzICovXG5cdFxuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc2VhcmNoKGxldHRlcnMpIHtcblx0ICAgICAgICB2YXIgcG9zc2libGUgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5zY2FsZXMpIHtcblx0ICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGxldHRlcnMudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG5cdCAgICAgICAgICAgIHBvc3NpYmxlLnB1c2goa2V5KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHBvc3NpYmxlO1xuXHQgICAgICB9XG5cdCAgICB9LFxuXHQgICAgY2hvcmQ6IHtcblx0XG5cdCAgICAgIC8qIFJldHVybiBhIGNvbGxlY3Rpb24gb2Ygbm90ZXMgYXMgYW4gYXJyYXkgKi9cblx0XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBjaG9yZChtaWRpcykge1xuXHQgICAgICAgIHZhciBvdXRwdXQgPSBbXTtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1pZGlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICBvdXRwdXQucHVzaCh0aGlzLm5vdGUobWlkaXNbaV0pKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG91dHB1dDtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gVHVuZTtcblx0fSkoKTtcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gVHVuZTtcblxuLyoqKi8gfSksXG4vKiA0MSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0dmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsgdmFyIHByb3AgPSBwcm9wc1trZXldOyBwcm9wLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChwcm9wLnZhbHVlKSBwcm9wLndyaXRhYmxlID0gdHJ1ZTsgfSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKTsgfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXHRcblx0dmFyIF9jbGFzc0NhbGxDaGVjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9O1xuXHRcblx0Ly9EaXNhYmxlIGpzaGludCB3YXJuaW5nIGNvbmNlcm5pbmcgdHJhaWxpbmcgcmVndWxhciBwYXJhbXNcblx0Lypqc2hpbnQgLVcxMzggKi9cblx0XG5cdHZhciBSYWRpbyA9IChmdW5jdGlvbiAoKSB7XG5cdCAgICAvL2lmIG5vbi1leGlzdGVudCBidXR0b25zIGFyZSBzd2l0Y2hlZCwgdGhleSBhcmUgaWdub3JlZFxuXHRcblx0ICAgIGZ1bmN0aW9uIFJhZGlvKCkge1xuXHQgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBvblZhbHMgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG5cdCAgICAgICAgICAgIG9uVmFsc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyAzIDogYXJndW1lbnRzWzBdO1xuXHRcblx0ICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmFkaW8pO1xuXHRcblx0ICAgICAgICAvL2VhY2ggb3B0aW9uYWwgJ29uVmFscycgYXJndW1lbnQgc3dpdGNoZXMgb24gdGhhdCB2YWx1ZSBpbiB0aGUgUmFkaW8gaWYgaXQgZXhpc3RzXG5cdCAgICAgICAgLy9JbiB0aGUgZXhhbXBsZSBiZWxvdywgYSAzLWJ1dHRvbiByYWRpbyBpcyBjcmVhdGVkLCBpbmRleCAwIGlzIHN3aXRjaGVkIG9uLCBpbmRleCAxIGlzIHN3aXRjaGVkIG9uIHRoZW4gdGhlbiBhdHRlbXB0ZWQgYWdhaW4gcHJvZHVjaW5nIGFuIHdhcm5pbmcsIGFuZCB0aGUgZmluYWwgYXJndW1lbnQgcHJvZHVjZXMgYSB3YXJuaW5nIGJlY2F1c2UgdGhlIGluZGV4IHZhbHVlIGRvZXMgbm90IGV4aXN0LlxuXHQgICAgICAgIC8vRXhhbXBsZTpcblx0ICAgICAgICAvL2AgIHJhZGlvID0gbmV3IFJhZGlvKDMsIDAsIDEsIDEsIDMpO1xuXHQgICAgICAgIC8v4oCmICBbMSwxLDBdXG5cdFxuXHQgICAgICAgIGlmIChsZW5ndGggPCAwKSB7XG5cdCAgICAgICAgICAgIGxlbmd0aCA9IDE7XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcblx0ICAgICAgICB0aGlzLm9uVmFscyA9IG9uVmFscztcblx0ICAgICAgICB0aGlzLmFycmF5ID0gbmV3IEFycmF5KGxlbmd0aCkuZmlsbCgwKTtcblx0XG5cdCAgICAgICAgaWYgKG9uVmFscy5sZW5ndGggPiAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMub24uYXBwbHkodGhpcywgb25WYWxzKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHQgICAgX2NyZWF0ZUNsYXNzKFJhZGlvLCB7XG5cdCAgICAgICAgc2VsZWN0OiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZWxlY3QodmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuYXJyYXkuZmlsbCgwKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuYXJyYXlbdmFsdWVdID0gMTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSxcblx0ICAgICAgICBmbGlwOiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBmbGlwKCkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHZhbHVlcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgICAgICAgICAgICAgIH1cblx0XG5cdCAgICAgICAgICAgICAgICAvL2ZsaXBzIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQsIGZsaXBzIGFsbCBidXR0b25zXG5cdCAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuYXJyYXk7XG5cdCAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA+IGEubGVuZ3RoIC0gMSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiV2FybmluZzogQW5vblJhZGlvW1wiICsgdiArIFwiXSBkb2VzIG5vdCBleGlzdFwiKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbdl0gPSBhW3ZdID8gMCA6IDE7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYS5mb3JFYWNoKGZ1bmN0aW9uICh2LCBpLCBhcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXJyW2ldID0gdiA/IDAgOiAxO1xuXHQgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIG9uOiB7XG5cdCAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBvbigpIHtcblx0ICAgICAgICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB2YWx1ZXMgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG5cdCAgICAgICAgICAgICAgICB9XG5cdFxuXHQgICAgICAgICAgICAgICAgLy9zd2l0Y2ggb24gdGhlIHNwZWNpZmllZCB2YWx1ZXMuIGlmIG5vIHZhbHVlIHNwZWNpZmllZCwgZmxpcHMgb24gYWxsIGJ1dHRvbnNcblx0ICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5hcnJheTtcblx0ICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID4gYS5sZW5ndGggLSAxKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiBBbm9uUmFkaW9bXCIgKyB2ICsgXCJdIGV4Y2VlZHMgc2l6ZSBvZiBvYmplY3RcIik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVt2XSA9PT0gMSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIldhcm5pbmc6IEFub25SYWRpb1tcIiArIHYgKyBcIl0gd2FzIGFscmVhZHkgb24uXCIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVt2XSA9IDE7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYS5maWxsKDEpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9LFxuXHQgICAgICAgIG9mZjoge1xuXHQgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gb2ZmKCkge1xuXHQgICAgICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHZhbHVlcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcblx0ICAgICAgICAgICAgICAgIH1cblx0XG5cdCAgICAgICAgICAgICAgICAvL3N3aXRjaCBvZmYgdGhlIHNwZWNpZmllZCB2YWx1ZXMuIGlmIG5vIHZhbHVlIHNwZWNpZmllZCwgZmxpcHMgb2ZmIGFsbCBidXR0b25zXG5cdCAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuYXJyYXk7XG5cdCAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBhW3ZdID0gMDtcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgYS5maWxsKDApO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0XG5cdCAgICByZXR1cm4gUmFkaW87XG5cdH0pKCk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IFJhZGlvO1xuXG4vKioqLyB9KSxcbi8qIDQyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0dmFyIFdBQUNsb2NrID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mylcblx0XG5cdG1vZHVsZS5leHBvcnRzID0gV0FBQ2xvY2tcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB3aW5kb3cuV0FBQ2xvY2sgPSBXQUFDbG9ja1xuXG5cbi8qKiovIH0pLFxuLyogNDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24ocHJvY2Vzcykge3ZhciBpc0Jyb3dzZXIgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpXG5cdFxuXHR2YXIgQ0xPQ0tfREVGQVVMVFMgPSB7XG5cdCAgdG9sZXJhbmNlTGF0ZTogMC4xMCxcblx0ICB0b2xlcmFuY2VFYXJseTogMC4wMDFcblx0fVxuXHRcblx0Ly8gPT09PT09PT09PT09PT09PT09PT0gRXZlbnQgPT09PT09PT09PT09PT09PT09PT0gLy9cblx0dmFyIEV2ZW50ID0gZnVuY3Rpb24oY2xvY2ssIGRlYWRsaW5lLCBmdW5jKSB7XG5cdCAgdGhpcy5jbG9jayA9IGNsb2NrXG5cdCAgdGhpcy5mdW5jID0gZnVuY1xuXHQgIHRoaXMuX2NsZWFyZWQgPSBmYWxzZSAvLyBGbGFnIHVzZWQgdG8gY2xlYXIgYW4gZXZlbnQgaW5zaWRlIGNhbGxiYWNrXG5cdFxuXHQgIHRoaXMudG9sZXJhbmNlTGF0ZSA9IGNsb2NrLnRvbGVyYW5jZUxhdGVcblx0ICB0aGlzLnRvbGVyYW5jZUVhcmx5ID0gY2xvY2sudG9sZXJhbmNlRWFybHlcblx0ICB0aGlzLl9sYXRlc3RUaW1lID0gbnVsbFxuXHQgIHRoaXMuX2VhcmxpZXN0VGltZSA9IG51bGxcblx0ICB0aGlzLmRlYWRsaW5lID0gbnVsbFxuXHQgIHRoaXMucmVwZWF0VGltZSA9IG51bGxcblx0XG5cdCAgdGhpcy5zY2hlZHVsZShkZWFkbGluZSlcblx0fVxuXHRcblx0Ly8gVW5zY2hlZHVsZXMgdGhlIGV2ZW50XG5cdEV2ZW50LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXHQgIHRoaXMuY2xvY2suX3JlbW92ZUV2ZW50KHRoaXMpXG5cdCAgdGhpcy5fY2xlYXJlZCA9IHRydWVcblx0ICByZXR1cm4gdGhpc1xuXHR9XG5cdFxuXHQvLyBTZXRzIHRoZSBldmVudCB0byByZXBlYXQgZXZlcnkgYHRpbWVgIHNlY29uZHMuXG5cdEV2ZW50LnByb3RvdHlwZS5yZXBlYXQgPSBmdW5jdGlvbih0aW1lKSB7XG5cdCAgaWYgKHRpbWUgPT09IDApXG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlbGF5IGNhbm5vdCBiZSAwJylcblx0ICB0aGlzLnJlcGVhdFRpbWUgPSB0aW1lXG5cdCAgaWYgKCF0aGlzLmNsb2NrLl9oYXNFdmVudCh0aGlzKSlcblx0ICAgIHRoaXMuc2NoZWR1bGUodGhpcy5kZWFkbGluZSArIHRoaXMucmVwZWF0VGltZSlcblx0ICByZXR1cm4gdGhpc1xuXHR9XG5cdFxuXHQvLyBTZXRzIHRoZSB0aW1lIHRvbGVyYW5jZSBvZiB0aGUgZXZlbnQuXG5cdC8vIFRoZSBldmVudCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBpbnRlcnZhbCBgW2RlYWRsaW5lIC0gZWFybHksIGRlYWRsaW5lICsgbGF0ZV1gXG5cdC8vIElmIHRoZSBjbG9jayBmYWlscyB0byBleGVjdXRlIHRoZSBldmVudCBpbiB0aW1lLCB0aGUgZXZlbnQgd2lsbCBiZSBkcm9wcGVkLlxuXHRFdmVudC5wcm90b3R5cGUudG9sZXJhbmNlID0gZnVuY3Rpb24odmFsdWVzKSB7XG5cdCAgaWYgKHR5cGVvZiB2YWx1ZXMubGF0ZSA9PT0gJ251bWJlcicpXG5cdCAgICB0aGlzLnRvbGVyYW5jZUxhdGUgPSB2YWx1ZXMubGF0ZVxuXHQgIGlmICh0eXBlb2YgdmFsdWVzLmVhcmx5ID09PSAnbnVtYmVyJylcblx0ICAgIHRoaXMudG9sZXJhbmNlRWFybHkgPSB2YWx1ZXMuZWFybHlcblx0ICB0aGlzLl9yZWZyZXNoRWFybHlMYXRlRGF0ZXMoKVxuXHQgIGlmICh0aGlzLmNsb2NrLl9oYXNFdmVudCh0aGlzKSkge1xuXHQgICAgdGhpcy5jbG9jay5fcmVtb3ZlRXZlbnQodGhpcylcblx0ICAgIHRoaXMuY2xvY2suX2luc2VydEV2ZW50KHRoaXMpXG5cdCAgfVxuXHQgIHJldHVybiB0aGlzXG5cdH1cblx0XG5cdC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgaXMgcmVwZWF0ZWQsIGZhbHNlIG90aGVyd2lzZVxuXHRFdmVudC5wcm90b3R5cGUuaXNSZXBlYXRlZCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5yZXBlYXRUaW1lICE9PSBudWxsIH1cblx0XG5cdC8vIFNjaGVkdWxlcyB0aGUgZXZlbnQgdG8gYmUgcmFuIGJlZm9yZSBgZGVhZGxpbmVgLlxuXHQvLyBJZiB0aGUgdGltZSBpcyB3aXRoaW4gdGhlIGV2ZW50IHRvbGVyYW5jZSwgd2UgaGFuZGxlIHRoZSBldmVudCBpbW1lZGlhdGVseS5cblx0Ly8gSWYgdGhlIGV2ZW50IHdhcyBhbHJlYWR5IHNjaGVkdWxlZCBhdCBhIGRpZmZlcmVudCB0aW1lLCBpdCBpcyByZXNjaGVkdWxlZC5cblx0RXZlbnQucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24oZGVhZGxpbmUpIHtcblx0ICB0aGlzLl9jbGVhcmVkID0gZmFsc2Vcblx0ICB0aGlzLmRlYWRsaW5lID0gZGVhZGxpbmVcblx0ICB0aGlzLl9yZWZyZXNoRWFybHlMYXRlRGF0ZXMoKVxuXHRcblx0ICBpZiAodGhpcy5jbG9jay5jb250ZXh0LmN1cnJlbnRUaW1lID49IHRoaXMuX2VhcmxpZXN0VGltZSkge1xuXHQgICAgdGhpcy5fZXhlY3V0ZSgpXG5cdCAgXG5cdCAgfSBlbHNlIGlmICh0aGlzLmNsb2NrLl9oYXNFdmVudCh0aGlzKSkge1xuXHQgICAgdGhpcy5jbG9jay5fcmVtb3ZlRXZlbnQodGhpcylcblx0ICAgIHRoaXMuY2xvY2suX2luc2VydEV2ZW50KHRoaXMpXG5cdCAgXG5cdCAgfSBlbHNlIHRoaXMuY2xvY2suX2luc2VydEV2ZW50KHRoaXMpXG5cdH1cblx0XG5cdEV2ZW50LnByb3RvdHlwZS50aW1lU3RyZXRjaCA9IGZ1bmN0aW9uKHRSZWYsIHJhdGlvKSB7XG5cdCAgaWYgKHRoaXMuaXNSZXBlYXRlZCgpKVxuXHQgICAgdGhpcy5yZXBlYXRUaW1lID0gdGhpcy5yZXBlYXRUaW1lICogcmF0aW9cblx0XG5cdCAgdmFyIGRlYWRsaW5lID0gdFJlZiArIHJhdGlvICogKHRoaXMuZGVhZGxpbmUgLSB0UmVmKVxuXHQgIC8vIElmIHRoZSBkZWFkbGluZSBpcyB0b28gY2xvc2Ugb3IgcGFzdCwgYW5kIHRoZSBldmVudCBoYXMgYSByZXBlYXQsXG5cdCAgLy8gd2UgY2FsY3VsYXRlIHRoZSBuZXh0IHJlcGVhdCBwb3NzaWJsZSBpbiB0aGUgc3RyZXRjaGVkIHNwYWNlLlxuXHQgIGlmICh0aGlzLmlzUmVwZWF0ZWQoKSkge1xuXHQgICAgd2hpbGUgKHRoaXMuY2xvY2suY29udGV4dC5jdXJyZW50VGltZSA+PSBkZWFkbGluZSAtIHRoaXMudG9sZXJhbmNlRWFybHkpXG5cdCAgICAgIGRlYWRsaW5lICs9IHRoaXMucmVwZWF0VGltZVxuXHQgIH1cblx0ICB0aGlzLnNjaGVkdWxlKGRlYWRsaW5lKVxuXHR9XG5cdFxuXHQvLyBFeGVjdXRlcyB0aGUgZXZlbnRcblx0RXZlbnQucHJvdG90eXBlLl9leGVjdXRlID0gZnVuY3Rpb24oKSB7XG5cdCAgaWYgKHRoaXMuY2xvY2suX3N0YXJ0ZWQgPT09IGZhbHNlKSByZXR1cm5cblx0ICB0aGlzLmNsb2NrLl9yZW1vdmVFdmVudCh0aGlzKVxuXHRcblx0ICBpZiAodGhpcy5jbG9jay5jb250ZXh0LmN1cnJlbnRUaW1lIDwgdGhpcy5fbGF0ZXN0VGltZSlcblx0ICAgIHRoaXMuZnVuYyh0aGlzKVxuXHQgIGVsc2Uge1xuXHQgICAgaWYgKHRoaXMub25leHBpcmVkKSB0aGlzLm9uZXhwaXJlZCh0aGlzKVxuXHQgICAgY29uc29sZS53YXJuKCdldmVudCBleHBpcmVkJylcblx0ICB9XG5cdCAgLy8gSW4gdGhlIGNhc2UgYHNjaGVkdWxlYCBpcyBjYWxsZWQgaW5zaWRlIGBmdW5jYCwgd2UgbmVlZCB0byBhdm9pZFxuXHQgIC8vIG92ZXJyd3JpdGluZyB3aXRoIHlldCBhbm90aGVyIGBzY2hlZHVsZWAuXG5cdCAgaWYgKCF0aGlzLmNsb2NrLl9oYXNFdmVudCh0aGlzKSAmJiB0aGlzLmlzUmVwZWF0ZWQoKSAmJiAhdGhpcy5fY2xlYXJlZClcblx0ICAgIHRoaXMuc2NoZWR1bGUodGhpcy5kZWFkbGluZSArIHRoaXMucmVwZWF0VGltZSkgXG5cdH1cblx0XG5cdC8vIFVwZGF0ZXMgY2FjaGVkIHRpbWVzXG5cdEV2ZW50LnByb3RvdHlwZS5fcmVmcmVzaEVhcmx5TGF0ZURhdGVzID0gZnVuY3Rpb24oKSB7XG5cdCAgdGhpcy5fbGF0ZXN0VGltZSA9IHRoaXMuZGVhZGxpbmUgKyB0aGlzLnRvbGVyYW5jZUxhdGVcblx0ICB0aGlzLl9lYXJsaWVzdFRpbWUgPSB0aGlzLmRlYWRsaW5lIC0gdGhpcy50b2xlcmFuY2VFYXJseVxuXHR9XG5cdFxuXHQvLyA9PT09PT09PT09PT09PT09PT09PSBXQUFDbG9jayA9PT09PT09PT09PT09PT09PT09PSAvL1xuXHR2YXIgV0FBQ2xvY2sgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbnRleHQsIG9wdHMpIHtcblx0ICB2YXIgc2VsZiA9IHRoaXNcblx0ICBvcHRzID0gb3B0cyB8fCB7fVxuXHQgIHRoaXMudGlja01ldGhvZCA9IG9wdHMudGlja01ldGhvZCB8fCAnU2NyaXB0UHJvY2Vzc29yTm9kZSdcblx0ICB0aGlzLnRvbGVyYW5jZUVhcmx5ID0gb3B0cy50b2xlcmFuY2VFYXJseSB8fCBDTE9DS19ERUZBVUxUUy50b2xlcmFuY2VFYXJseVxuXHQgIHRoaXMudG9sZXJhbmNlTGF0ZSA9IG9wdHMudG9sZXJhbmNlTGF0ZSB8fCBDTE9DS19ERUZBVUxUUy50b2xlcmFuY2VMYXRlXG5cdCAgdGhpcy5jb250ZXh0ID0gY29udGV4dFxuXHQgIHRoaXMuX2V2ZW50cyA9IFtdXG5cdCAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG5cdH1cblx0XG5cdC8vIC0tLS0tLS0tLS0gUHVibGljIEFQSSAtLS0tLS0tLS0tIC8vXG5cdC8vIFNjaGVkdWxlcyBgZnVuY2AgdG8gcnVuIGFmdGVyIGBkZWxheWAgc2Vjb25kcy5cblx0V0FBQ2xvY2sucHJvdG90eXBlLnNldFRpbWVvdXQgPSBmdW5jdGlvbihmdW5jLCBkZWxheSkge1xuXHQgIHJldHVybiB0aGlzLl9jcmVhdGVFdmVudChmdW5jLCB0aGlzLl9hYnNUaW1lKGRlbGF5KSlcblx0fVxuXHRcblx0Ly8gU2NoZWR1bGVzIGBmdW5jYCB0byBydW4gYmVmb3JlIGBkZWFkbGluZWAuXG5cdFdBQUNsb2NrLnByb3RvdHlwZS5jYWxsYmFja0F0VGltZSA9IGZ1bmN0aW9uKGZ1bmMsIGRlYWRsaW5lKSB7XG5cdCAgcmV0dXJuIHRoaXMuX2NyZWF0ZUV2ZW50KGZ1bmMsIGRlYWRsaW5lKVxuXHR9XG5cdFxuXHQvLyBTdHJldGNoZXMgYGRlYWRsaW5lYCBhbmQgYHJlcGVhdGAgb2YgYWxsIHNjaGVkdWxlZCBgZXZlbnRzYCBieSBgcmF0aW9gLCBrZWVwaW5nXG5cdC8vIHRoZWlyIHJlbGF0aXZlIGRpc3RhbmNlIHRvIGB0UmVmYC4gSW4gZmFjdCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gY2hhbmdpbmcgdGhlIHRlbXBvLlxuXHRXQUFDbG9jay5wcm90b3R5cGUudGltZVN0cmV0Y2ggPSBmdW5jdGlvbih0UmVmLCBldmVudHMsIHJhdGlvKSB7XG5cdCAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHsgZXZlbnQudGltZVN0cmV0Y2godFJlZiwgcmF0aW8pIH0pXG5cdCAgcmV0dXJuIGV2ZW50c1xuXHR9XG5cdFxuXHQvLyBSZW1vdmVzIGFsbCBzY2hlZHVsZWQgZXZlbnRzIGFuZCBzdGFydHMgdGhlIGNsb2NrIFxuXHRXQUFDbG9jay5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0ICBpZiAodGhpcy5fc3RhcnRlZCA9PT0gZmFsc2UpIHtcblx0ICAgIHZhciBzZWxmID0gdGhpc1xuXHQgICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcblx0ICAgIHRoaXMuX2V2ZW50cyA9IFtdXG5cdFxuXHQgICAgaWYgKHRoaXMudGlja01ldGhvZCA9PT0gJ1NjcmlwdFByb2Nlc3Nvck5vZGUnKSB7XG5cdCAgICAgIHZhciBidWZmZXJTaXplID0gMjU2XG5cdCAgICAgIC8vIFdlIGhhdmUgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgbm9kZSB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb25cblx0ICAgICAgdGhpcy5fY2xvY2tOb2RlID0gdGhpcy5jb250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3NvcihidWZmZXJTaXplLCAxLCAxKVxuXHQgICAgICB0aGlzLl9jbG9ja05vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pXG5cdCAgICAgIHRoaXMuX2Nsb2NrTm9kZS5vbmF1ZGlvcHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkgeyBzZWxmLl90aWNrKCkgfSlcblx0ICAgICAgfVxuXHQgICAgfSBlbHNlIGlmICh0aGlzLnRpY2tNZXRob2QgPT09ICdtYW51YWwnKSBudWxsIC8vIF90aWNrIGlzIGNhbGxlZCBtYW51YWxseVxuXHRcblx0ICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRpY2tNZXRob2QgJyArIHRoaXMudGlja01ldGhvZClcblx0ICB9XG5cdH1cblx0XG5cdC8vIFN0b3BzIHRoZSBjbG9ja1xuXHRXQUFDbG9jay5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHQgIGlmICh0aGlzLl9zdGFydGVkID09PSB0cnVlKSB7XG5cdCAgICB0aGlzLl9zdGFydGVkID0gZmFsc2Vcblx0ICAgIHRoaXMuX2Nsb2NrTm9kZS5kaXNjb25uZWN0KClcblx0ICB9ICBcblx0fVxuXHRcblx0Ly8gLS0tLS0tLS0tLSBQcml2YXRlIC0tLS0tLS0tLS0gLy9cblx0XG5cdC8vIFRoaXMgZnVuY3Rpb24gaXMgcmFuIHBlcmlvZGljYWxseSwgYW5kIGF0IGVhY2ggdGljayBpdCBleGVjdXRlc1xuXHQvLyBldmVudHMgZm9yIHdoaWNoIGBjdXJyZW50VGltZWAgaXMgaW5jbHVkZWQgaW4gdGhlaXIgdG9sZXJhbmNlIGludGVydmFsLlxuXHRXQUFDbG9jay5wcm90b3R5cGUuX3RpY2sgPSBmdW5jdGlvbigpIHtcblx0ICB2YXIgZXZlbnQgPSB0aGlzLl9ldmVudHMuc2hpZnQoKVxuXHRcblx0ICB3aGlsZShldmVudCAmJiBldmVudC5fZWFybGllc3RUaW1lIDw9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSkge1xuXHQgICAgZXZlbnQuX2V4ZWN1dGUoKVxuXHQgICAgZXZlbnQgPSB0aGlzLl9ldmVudHMuc2hpZnQoKVxuXHQgIH1cblx0XG5cdCAgLy8gUHV0IGJhY2sgdGhlIGxhc3QgZXZlbnRcblx0ICBpZihldmVudCkgdGhpcy5fZXZlbnRzLnVuc2hpZnQoZXZlbnQpXG5cdH1cblx0XG5cdC8vIENyZWF0ZXMgYW4gZXZlbnQgYW5kIGluc2VydCBpdCB0byB0aGUgbGlzdFxuXHRXQUFDbG9jay5wcm90b3R5cGUuX2NyZWF0ZUV2ZW50ID0gZnVuY3Rpb24oZnVuYywgZGVhZGxpbmUpIHtcblx0ICByZXR1cm4gbmV3IEV2ZW50KHRoaXMsIGRlYWRsaW5lLCBmdW5jKVxuXHR9XG5cdFxuXHQvLyBJbnNlcnRzIGFuIGV2ZW50IHRvIHRoZSBsaXN0XG5cdFdBQUNsb2NrLnByb3RvdHlwZS5faW5zZXJ0RXZlbnQgPSBmdW5jdGlvbihldmVudCkge1xuXHQgIHRoaXMuX2V2ZW50cy5zcGxpY2UodGhpcy5faW5kZXhCeVRpbWUoZXZlbnQuX2VhcmxpZXN0VGltZSksIDAsIGV2ZW50KVxuXHR9XG5cdFxuXHQvLyBSZW1vdmVzIGFuIGV2ZW50IGZyb20gdGhlIGxpc3Rcblx0V0FBQ2xvY2sucHJvdG90eXBlLl9yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdCAgdmFyIGluZCA9IHRoaXMuX2V2ZW50cy5pbmRleE9mKGV2ZW50KVxuXHQgIGlmIChpbmQgIT09IC0xKSB0aGlzLl9ldmVudHMuc3BsaWNlKGluZCwgMSlcblx0fVxuXHRcblx0Ly8gUmV0dXJucyB0cnVlIGlmIGBldmVudGAgaXMgaW4gcXVldWUsIGZhbHNlIG90aGVyd2lzZVxuXHRXQUFDbG9jay5wcm90b3R5cGUuX2hhc0V2ZW50ID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0IHJldHVybiB0aGlzLl9ldmVudHMuaW5kZXhPZihldmVudCkgIT09IC0xXG5cdH1cblx0XG5cdC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBldmVudCB3aG9zZSBkZWFkbGluZSBpcyA+PSB0byBgZGVhZGxpbmVgXG5cdFdBQUNsb2NrLnByb3RvdHlwZS5faW5kZXhCeVRpbWUgPSBmdW5jdGlvbihkZWFkbGluZSkge1xuXHQgIC8vIHBlcmZvcm1zIGEgYmluYXJ5IHNlYXJjaFxuXHQgIHZhciBsb3cgPSAwXG5cdCAgICAsIGhpZ2ggPSB0aGlzLl9ldmVudHMubGVuZ3RoXG5cdCAgICAsIG1pZFxuXHQgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG5cdCAgICBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG5cdCAgICBpZiAodGhpcy5fZXZlbnRzW21pZF0uX2VhcmxpZXN0VGltZSA8IGRlYWRsaW5lKVxuXHQgICAgICBsb3cgPSBtaWQgKyAxXG5cdCAgICBlbHNlIGhpZ2ggPSBtaWRcblx0ICB9XG5cdCAgcmV0dXJuIGxvd1xuXHR9XG5cdFxuXHQvLyBDb252ZXJ0cyBmcm9tIHJlbGF0aXZlIHRpbWUgdG8gYWJzb2x1dGUgdGltZVxuXHRXQUFDbG9jay5wcm90b3R5cGUuX2Fic1RpbWUgPSBmdW5jdGlvbihyZWxUaW1lKSB7XG5cdCAgcmV0dXJuIHJlbFRpbWUgKyB0aGlzLmNvbnRleHQuY3VycmVudFRpbWVcblx0fVxuXHRcblx0Ly8gQ29udmVydHMgZnJvbSBhYnNvbHV0ZSB0aW1lIHRvIHJlbGF0aXZlIHRpbWUgXG5cdFdBQUNsb2NrLnByb3RvdHlwZS5fcmVsVGltZSA9IGZ1bmN0aW9uKGFic1RpbWUpIHtcblx0ICByZXR1cm4gYWJzVGltZSAtIHRoaXMuY29udGV4dC5jdXJyZW50VGltZVxuXHR9XG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KSkpXG5cbi8qKiovIH0pLFxuLyogNDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblx0dmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXHRcblx0Ly8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG5cdC8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuXHQvLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG5cdC8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cdFxuXHR2YXIgY2FjaGVkU2V0VGltZW91dDtcblx0dmFyIGNhY2hlZENsZWFyVGltZW91dDtcblx0XG5cdGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHRmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICB9XG5cdH0gKCkpXG5cdGZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG5cdCAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9XG5cdCAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG5cdCAgICAgICAgfSBjYXRjaChlKXtcblx0ICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3Jcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHR9XG5cdGZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcblx0ICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblx0ICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblx0ICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3Ncblx0ICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9IGNhdGNoIChlKXtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cblx0ICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHRcblx0XG5cdH1cblx0dmFyIHF1ZXVlID0gW107XG5cdHZhciBkcmFpbmluZyA9IGZhbHNlO1xuXHR2YXIgY3VycmVudFF1ZXVlO1xuXHR2YXIgcXVldWVJbmRleCA9IC0xO1xuXHRcblx0ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuXHQgICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgfVxuXHQgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICAgIGRyYWluUXVldWUoKTtcblx0ICAgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcblx0ICAgIGlmIChkcmFpbmluZykge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuXHQgICAgZHJhaW5pbmcgPSB0cnVlO1xuXHRcblx0ICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB3aGlsZShsZW4pIHtcblx0ICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcblx0ICAgICAgICBxdWV1ZSA9IFtdO1xuXHQgICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcblx0ICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuXHQgICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB9XG5cdCAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0fVxuXHRcblx0cHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcblx0ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG5cdCAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuXHQgICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG5cdCAgICB9XG5cdH07XG5cdFxuXHQvLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5cdGZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuXHQgICAgdGhpcy5mdW4gPSBmdW47XG5cdCAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG5cdH1cblx0SXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG5cdH07XG5cdHByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5cdHByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5cdHByb2Nlc3MuZW52ID0ge307XG5cdHByb2Nlc3MuYXJndiA9IFtdO1xuXHRwcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcblx0cHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXHRcblx0ZnVuY3Rpb24gbm9vcCgpIHt9XG5cdFxuXHRwcm9jZXNzLm9uID0gbm9vcDtcblx0cHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3Mub25jZSA9IG5vb3A7XG5cdHByb2Nlc3Mub2ZmID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcblx0cHJvY2Vzcy5lbWl0ID0gbm9vcDtcblx0cHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xuXHRwcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXHRcblx0cHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXHRcblx0cHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0XG5cdHByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5cdHByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9O1xuXHRwcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuXG5cbi8qKiovIH0pLFxuLyogNDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIga2V5IGluIHByb3BzKSB7IHZhciBwcm9wID0gcHJvcHNba2V5XTsgcHJvcC5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAocHJvcC52YWx1ZSkgcHJvcC53cml0YWJsZSA9IHRydWU7IH0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcyk7IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblx0XG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfTtcblx0XG5cdHZhciBjbG9jayA9IF9fd2VicGFja19yZXF1aXJlX18oMSkuY2xvY2s7XG5cdFxuXHR2YXIgSW50ZXJ2YWwgPSAoZnVuY3Rpb24gKCkge1xuXHQgIGZ1bmN0aW9uIEludGVydmFsKHJhdGUsIGZ1bmMsIG9uKSB7XG5cdCAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50ZXJ2YWwpO1xuXHRcblx0ICAgIHRoaXMucmF0ZSA9IHJhdGU7XG5cdCAgICB0aGlzLm9uID0gb247XG5cdCAgICB0aGlzLmNsb2NrID0gY2xvY2soKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG5cdFxuXHQgICAgdGhpcy5wYXR0ZXJuID0gWzFdO1xuXHQgICAgdGhpcy5pbmRleCA9IDA7XG5cdFxuXHQgICAgdGhpcy5ldmVudCA9IGZ1bmMgPyBmdW5jIDogZnVuY3Rpb24gKCkge307XG5cdFxuXHQgICAgaWYgKHRoaXMub24pIHtcblx0ICAgICAgdGhpcy5zdGFydCgpO1xuXHQgICAgfVxuXHQgIH1cblx0XG5cdCAgX2NyZWF0ZUNsYXNzKEludGVydmFsLCB7XG5cdCAgICBfZXZlbnQ6IHtcblx0ICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9ldmVudChlKSB7XG5cdCAgICAgICAgLy8gIGlmICh0aGlzLnBhdHRlcm5bdGhpcy5pbmRleCV0aGlzLnBhdHRlcm4ubGVuZ3RoXSkge1xuXHQgICAgICAgIHRoaXMuZXZlbnQoZSk7XG5cdCAgICAgICAgLy8gIH1cblx0ICAgICAgICB0aGlzLmluZGV4Kys7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzdG9wOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuXHQgICAgICAgIHRoaXMub24gPSBmYWxzZTtcblx0ICAgICAgICB0aGlzLmludGVydmFsLmNsZWFyKCk7XG5cdCAgICAgIH1cblx0ICAgIH0sXG5cdCAgICBzdGFydDoge1xuXHQgICAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnQoKSB7XG5cdCAgICAgICAgdGhpcy5vbiA9IHRydWU7XG5cdCAgICAgICAgdGhpcy5pbnRlcnZhbCA9IHRoaXMuY2xvY2suY2FsbGJhY2tBdFRpbWUodGhpcy5fZXZlbnQuYmluZCh0aGlzKSwgdGhpcy5jbG9jay5jb250ZXh0LmN1cnJlbnRUaW1lKS5yZXBlYXQodGhpcy5yYXRlIC8gMTAwMCkudG9sZXJhbmNlKHsgZWFybHk6IDAuMSwgbGF0ZTogMSB9KTtcblx0ICAgICAgfVxuXHQgICAgfSxcblx0ICAgIG1zOiB7XG5cdCAgICAgIHZhbHVlOiBmdW5jdGlvbiBtcyhuZXdyYXRlKSB7XG5cdCAgICAgICAgaWYgKHRoaXMub24pIHtcblx0ICAgICAgICAgIHZhciByYXRpbyA9IG5ld3JhdGUgLyB0aGlzLnJhdGU7XG5cdCAgICAgICAgICB0aGlzLnJhdGUgPSBuZXdyYXRlO1xuXHQgICAgICAgICAgdGhpcy5jbG9jay50aW1lU3RyZXRjaCh0aGlzLmNsb2NrLmNvbnRleHQuY3VycmVudFRpbWUsIFt0aGlzLmludGVydmFsXSwgcmF0aW8pO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aGlzLnJhdGUgPSBuZXdyYXRlO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0pO1xuXHRcblx0ICByZXR1cm4gSW50ZXJ2YWw7XG5cdH0pKCk7XG5cdFxuXHRtb2R1bGUuZXhwb3J0cyA9IEludGVydmFsO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW5kbFluQmhZMnM2THk4dmQyVmljR0ZqYXk5MWJtbDJaWEp6WVd4TmIyUjFiR1ZFWldacGJtbDBhVzl1SWl3aWQyVmljR0ZqYXpvdkx5OTNaV0p3WVdOckwySnZiM1J6ZEhKaGNDQmlNalk1WVdObFpqaGpZV1JoTnpBNE5EVXdNaUlzSW5kbFluQmhZMnM2THk4dkxpOXBibVJsZUM1cWN5SXNJbmRsWW5CaFkyczZMeTh2TGk5c2FXSXZiV0ZwYmk1cWN5SXNJbmRsWW5CaFkyczZMeTh2TGk5c2FXSXZhVzUwWlhKbVlXTmxjeTlwYm1SbGVDNXFjeUlzSW5kbFluQmhZMnM2THk4dkxpOXNhV0l2YVc1MFpYSm1ZV05sY3k5d2IzTnBkR2x2Ymk1cWN5SXNJbmRsWW5CaFkyczZMeTh2TGk5c2FXSXZkWFJwYkM5emRtY3Vhbk1pTENKM1pXSndZV05yT2k4dkx5NHZiR2xpTDNWMGFXd3ZiV0YwYUM1cWN5SXNJbmRsWW5CaFkyczZMeTh2TGk5c2FXSXZZMjl5WlM5cGJuUmxjbVpoWTJVdWFuTWlMQ0ozWldKd1lXTnJPaTh2THk0dmJHbGlMM1YwYVd3dlpHOXRMbXB6SWl3aWQyVmljR0ZqYXpvdkx5OHVMMnhwWWk5MWRHbHNMM1YwYVd3dWFuTWlMQ0ozWldKd1lXTnJPaTh2THk0dmJHbGlMM1YwYVd3dmRHOTFZMmd1YW5NaUxDSjNaV0p3WVdOck9pOHZMeTR2Zmk5bGRtVnVkSE12WlhabGJuUnpMbXB6SWl3aWQyVmljR0ZqYXpvdkx5OHVMMnhwWWk5dGIyUmxiSE12YzNSbGNDNXFjeUlzSW5kbFluQmhZMnM2THk4dkxpOXNhV0l2ZFhScGJDOXBiblJsY21GamRHbHZiaTVxY3lJc0luZGxZbkJoWTJzNkx5OHZMaTlzYVdJdmJXOWtaV3h6TDNSdloyZHNaUzVxY3lJc0luZGxZbkJoWTJzNkx5OHZMaTlzYVdJdmFXNTBaWEptWVdObGN5OXpiR2xrWlhJdWFuTWlMQ0ozWldKd1lXTnJPaTh2THk0dmJHbGlMMmx1ZEdWeVptRmpaWE12ZEc5bloyeGxMbXB6SWl3aWQyVmljR0ZqYXpvdkx5OHVMMnhwWWk5cGJuUmxjbVpoWTJWekwySjFkSFJ2Ymk1cWN5SXNJbmRsWW5CaFkyczZMeTh2TGk5c2FXSXZZMjl0Y0c5dVpXNTBjeTlpZFhSMGIyNTBaVzF3YkdGMFpTNXFjeUlzSW5kbFluQmhZMnM2THk4dkxpOXNhV0l2YVc1MFpYSm1ZV05sY3k5MFpYaDBZblYwZEc5dUxtcHpJaXdpZDJWaWNHRmphem92THk4dUwyeHBZaTlwYm5SbGNtWmhZMlZ6TDNKaFpHbHZZblYwZEc5dUxtcHpJaXdpZDJWaWNHRmphem92THk4dUwyeHBZaTlwYm5SbGNtWmhZMlZ6TDI1MWJXSmxjaTVxY3lJc0luZGxZbkJoWTJzNkx5OHZMaTlzYVdJdmFXNTBaWEptWVdObGN5OXpaV3hsWTNRdWFuTWlMQ0ozWldKd1lXTnJPaTh2THk0dmJHbGlMMmx1ZEdWeVptRmpaWE12WkdsaGJDNXFjeUlzSW5kbFluQmhZMnM2THk4dkxpOXNhV0l2YVc1MFpYSm1ZV05sY3k5d2FXRnVieTVxY3lJc0luZGxZbkJoWTJzNkx5OHZMaTlzYVdJdmFXNTBaWEptWVdObGN5OXpaWEYxWlc1alpYSXVhbk1pTENKM1pXSndZV05yT2k4dkx5NHZiR2xpTDIxdlpHVnNjeTl0WVhSeWFYZ3Vhbk1pTENKM1pXSndZV05yT2k4dkx5NHZiR2xpTDIxdlpHVnNjeTl6WlhGMVpXNWpaUzVxY3lJc0luZGxZbkJoWTJzNkx5OHZMaTlzYVdJdmJXOWtaV3h6TDJSeWRXNXJMbXB6SWl3aWQyVmljR0ZqYXpvdkx5OHVMMnhwWWk5dGIyUmxiSE12WTI5MWJuUmxjaTVxY3lJc0luZGxZbkJoWTJzNkx5OHZMaTlzYVdJdmFXNTBaWEptWVdObGN5OXdZVzR5WkM1cWN5SXNJbmRsWW5CaFkyczZMeTh2TGk5c2FXSXZhVzUwWlhKbVlXTmxjeTkwYVd4MExtcHpJaXdpZDJWaWNHRmphem92THk4dUwyeHBZaTlwYm5SbGNtWmhZMlZ6TDIxMWJIUnBjMnhwWkdWeUxtcHpJaXdpZDJWaWNHRmphem92THk4dUwyeHBZaTlqYjIxd2IyNWxiblJ6TDNOc2FXUmxjblJsYlhCc1lYUmxMbXB6SWl3aWQyVmljR0ZqYXpvdkx5OHVMMnhwWWk5cGJuUmxjbVpoWTJWekwzQmhiaTVxY3lJc0luZGxZbkJoWTJzNkx5OHZMaTlzYVdJdmFXNTBaWEptWVdObGN5OWxiblpsYkc5d1pTNXFjeUlzSW5kbFluQmhZMnM2THk4dkxpOXNhV0l2YVc1MFpYSm1ZV05sY3k5emNHVmpkSEp2WjNKaGJTNXFjeUlzSW5kbFluQmhZMnM2THk4dkxpOXNhV0l2YVc1MFpYSm1ZV05sY3k5dFpYUmxjaTVxY3lJc0luZGxZbkJoWTJzNkx5OHZMaTlzYVdJdmFXNTBaWEptWVdObGN5OXZjMk5wYkd4dmMyTnZjR1V1YW5NaUxDSjNaV0p3WVdOck9pOHZMeTR2YkdsaUwyTnZjbVV2Y21GamF5NXFjeUlzSW5kbFluQmhZMnM2THk4dkxpOXNhV0l2ZFhScGJDOTBjbUZ1YzJadmNtMHVhbk1pTENKM1pXSndZV05yT2k4dkx5NHZiR2xpTDNSMWJtbHVaeTkwZFc1cGJtY3Vhbk1pTENKM1pXSndZV05yT2k4dkx5NHZiR2xpTDIxdlpHVnNjeTl5WVdScGJ5NXFjeUlzSW5kbFluQmhZMnM2THk4dkxpOStMM2RoWVdOc2IyTnJMMmx1WkdWNExtcHpJaXdpZDJWaWNHRmphem92THk4dUwzNHZkMkZoWTJ4dlkyc3ZiR2xpTDFkQlFVTnNiMk5yTG1weklpd2lkMlZpY0dGamF6b3ZMeTh1TDM0dmNISnZZMlZ6Y3k5aWNtOTNjMlZ5TG1weklpd2lkMlZpY0dGamF6b3ZMeTh1TDJ4cFlpOTBhVzFsTDJsdWRHVnlkbUZzTG1weklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJMRU5CUVVNN1FVRkRSQ3hQTzBGRFZrRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk8wRkJRMEVzZFVKQlFXVTdRVUZEWmp0QlFVTkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUczdRVUZGUVR0QlFVTkJPenRCUVVWQk8wRkJRMEU3UVVGRFFUczdPMEZCUjBFN1FVRkRRVHM3UVVGRlFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUczdPenM3T3p0QlEzUkRRU3hoUVVGWkxFTkJRVU03T3pzN1MwRkZUaXhQUVVGUExIVkRRVUZOTEVOQlFWazdPMnRDUVVWcVFpeFBRVUZQTEVNN096czdPenM3T3pzN096czdPenM3VTBOdFNFNHNUVUZCVFN4SFFVRk9MRTFCUVUwN1UwRkhUaXhQUVVGUExFZEJRVkFzVDBGQlR6dFRRVWRRTEV0QlFVc3NSMEZCVEN4TFFVRkxPenM3TzBGQk4waHlRaXhoUVVGWkxFTkJRVU03TzB0QlJVNHNWVUZCVlN4MVEwRkJUU3hEUVVGbE96dExRVU12UWl4SlFVRkpMSFZEUVVGTkxFTkJRV0U3TzB0QlEzWkNMRWxCUVVrc2RVTkJRVTBzUlVGQllUczdTMEZEZGtJc1NVRkJTU3gxUTBGQlRTeEZRVUZwUWpzN1MwRkRkRUlzVTBGQlV5d3JRMEZCVFN4RlFVRnJRanM3UVVGRk4wTXNTMEZCU1N4UFFVRlBMRWRCUVVjc2JVSkJRVThzUTBGQlF5eEZRVUZyUWl4RFFVRkRMRU5CUVVNN1FVRkRNVU1zUzBGQlNTeExRVUZMTEVkQlFVY3NiVUpCUVU4c1EwRkJReXhGUVVGblFpeERRVUZETEVOQlFVTTdRVUZEZEVNc1MwRkJTU3hMUVVGTExFZEJRVWNzYlVKQlFVOHNRMEZCUXl4RlFVRm5RaXhEUVVGRExFTkJRVU03UVVGRGRFTXNTMEZCU1N4UlFVRlJMRWRCUVVjc2JVSkJRVThzUTBGQlF5eEZRVUZ0UWl4RFFVRkRMRU5CUVVNN1FVRkROVU1zUzBGQlNTeE5RVUZOTEVkQlFVY3NiVUpCUVU4c1EwRkJReXhGUVVGcFFpeERRVUZETEVOQlFVTTdPMHRCUldwRExGRkJRVkVzZFVOQlFVMHNSVUZCVlRzN1MwRkRlRUlzVVVGQlVTeDFRMEZCVFN4RlFVRnBRanM3T3pzN08wdEJUMmhETEU5QlFVODdRVUZGUlN4WlFVWlVMRTlCUVU4c1EwRkZSeXhQUVVGUExFVkJRVVU3TWtKQlJtNUNMRTlCUVU4N08wRkJTVXdzVlVGQlN5eEpRVUZKTEVkQlFVY3NTVUZCU1N4VlFVRlZMRVZCUVVVN1FVRkRlRUlzVjBGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRlZCUVZVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dE5RVU12UWpzN1FVRkZSQ3hWUVVGTExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVsQlFVa3NSVUZCUlR0QlFVTnNRaXhYUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8wMUJRM3BDT3p0QlFVVkVMRk5CUVVrc1NVRkJTU3hIUVVGSE8wRkJRMVFzWVVGQlVTeEpRVUZKTzAxQlEySXNRMEZCUXpzN1FVRkZSaXhUUVVGSkxFMUJRVTBzUjBGQlJ6dEJRVU5ZTEdkQ1FVRlhMRTlCUVU4N1FVRkRiRUlzWTBGQlV5eExRVUZMTzBGQlEyUXNZMEZCVXl4TFFVRkxPMEZCUTJRc2FVSkJRVmtzVVVGQlVUdEJRVU53UWl4bFFVRlZMRTFCUVUwN1RVRkRha0lzUTBGQlF6czdRVUZGUml4VlFVRkxMRWxCUVVrc1IwRkJSeXhKUVVGSkxFMUJRVTBzUlVGQlJUdEJRVU4wUWl4WFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMDFCUTNwQ096dEJRVVZFTEZWQlFVc3NTVUZCU1N4SFFVRkhMRWxCUVVrc1NVRkJTU3hGUVVGRk8wRkJRM0JDTEZkQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdUVUZEZGtJN08wRkJSVVFzVTBGQlNTeGpRVUZqTEVkQlFVY3NUVUZCVFN4RFFVRkRMRmxCUVZrc1NVRkJTU3hOUVVGTkxFTkJRVU1zYTBKQlFXdENMRU5CUVVNN1FVRkRkRVVzVTBGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4UFFVRlBMRWxCUVVrc1NVRkJTU3hqUVVGakxFVkJRVVVzUTBGQlF6czdRVUZGYUVRc1UwRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTNaQ0xGTkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenM3UVVGRk0wTXNVMEZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxGRkJRVkVzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1FVRkRla01zVTBGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRVZCUVVVc1EwRkJRenRCUVVOdVFpeFRRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhMRkZCUVZFc1EwRkJRenM3UVVGRmVrSXNVMEZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSenRCUVVOYUxHRkJRVTBzUlVGQlJTeE5RVUZOTzBGQlEyUXNWMEZCU1N4RlFVRkZMRTFCUVUwN1FVRkRXaXhaUVVGTExFVkJRVVVzVFVGQlRUdEJRVU5pTEZkQlFVa3NSVUZCUlN4TlFVRk5PMEZCUTFvc2EwSkJRVmNzUlVGQlJTeE5RVUZOTzBGQlEyNUNMR2xDUVVGVkxFVkJRVVVzVFVGQlRUdE5RVU51UWl4RFFVRkRPenRCUVVWR0xGTkJRVWtzUTBGQlF5eFRRVUZUTEVkQlFVY3NVMEZCVXl4RFFVRkRPMEZCUXpOQ0xGTkJRVWtzUTBGQlF5eEhRVUZITEVkQlFVY3NVMEZCVXl4RFFVRkRMRWRCUVVjc1EwRkJRenM3UVVGSGVrSXNVMEZCU1N4RFFVRkRMRWRCUVVjc1IwRkJSeXhGUVVGRkxFTkJRVU03UVVGRFpDeFZRVUZMTEVsQlFVa3NSMEZCUnl4SlFVRkpMRlZCUVZVc1JVRkJSVHRCUVVNeFFpeFhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExGTkJRVk1zUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1JVRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dE5RVU01UXpzN096dEJRVTlFTEZOQlFVa3NiVUpCUVcxQ0xFZEJRVWNzVVVGQlVTeERRVUZETEc5Q1FVRnZRaXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzBGQlEycEZMRk5CUVVrc2MwSkJRWE5DTEVkQlFVY3NkME5CUVhkRExFTkJRVU03UVVGRGRFVXNVMEZCU1N4blFrRkJaMElzUjBGQlJ5eFJRVUZSTEVOQlFVTXNZVUZCWVN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8wRkJRM1pFTEhGQ1FVRm5RaXhEUVVGRExFbEJRVWtzUjBGQlJ5eFZRVUZWTEVOQlFVTTdRVUZEYmtNc2NVSkJRV2RDTEVOQlFVTXNVMEZCVXl4SFFVRkhMSE5DUVVGelFpeERRVUZETzBGQlEzQkVMRk5CUVVrc2JVSkJRVzFDTEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1JVRkJSVHRCUVVOc1F5eFhRVUZKTEUxQlFVMHNSMEZCUnl4dFFrRkJiVUlzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4VlFVRlZPMEZCUXpsRExHRkJRVTBzUTBGQlF5eFpRVUZaTEVOQlFVVXNaMEpCUVdkQ0xFVkJRVVVzYlVKQlFXMUNMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VFVGREwwUXNUVUZCVFR0QlFVTk1MR1ZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zVTBGQlV5eEhRVUZETEhOQ1FVRnpRaXhIUVVGRExGVkJRVmNzUTBGQlF5eERRVUZETzAxQlF6bEVPenRKUVVkS08wRkJTRWs3WjBKQk0wVklMRTlCUVU4N1FVRnZSa3dzV1VGQlR6dFpRVXBCTEZsQlFVYzdRVUZEV2l4blFrRkJUeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETzFGQlEzUkNPMWxCUlZVc1ZVRkJReXhIUVVGSExFVkJRVVU3UVVGRFppeGhRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRE8wRkJRMnhDTEdGQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1IwRkJSeXhEUVVGRE8wRkJRM0JDTEdGQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUTNoRExHRkJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTMEZCU3l4RlFVRkZMRU5CUVVNN1VVRkRjRUk3T3pzN1ZVRjZSa01zVDBGQlR6czdPMEZCSzBaaUxFdEJRVWtzUzBGQlN5eEhRVUZITEVsQlFVa3NUMEZCVHl4RlFVRkZMRU5CUVVNN08wRkJSVzVDTEZWQlFWTXNUVUZCVFN4SFFVRkhPMEZCUTNKQ0xGVkJRVThzUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXp0RlFVTjJRanM3UVVGRFRTeFZRVUZUTEU5QlFVOHNSMEZCUnp0QlFVTjBRaXhWUVVGUExFdEJRVXNzUTBGQlF5eFBRVUZQTEVOQlFVTTdSVUZEZUVJN08wRkJRMDBzVlVGQlV5eExRVUZMTEVkQlFVYzdRVUZEY0VJc1ZVRkJUeXhMUVVGTExFTkJRVU1zUzBGQlN5eERRVUZETzBWQlEzUkNPenR6UWtGRll5eExRVUZMTEVNN096czdPenM3TzJ0Q1EycEpURHRCUVVOaUxGZEJRVkVzUlVGQlJTeHRRa0ZCVHl4RFFVRkRMRU5CUVZrc1EwRkJRenRCUVVNdlFpeFRRVUZOTEVWQlFVVXNiVUpCUVU4c1EwRkJReXhGUVVGVkxFTkJRVU03UVVGRE0wSXNVMEZCVFN4RlFVRkZMRzFDUVVGUExFTkJRVU1zUlVGQlZTeERRVUZET3pzN1FVRkhNMElzVTBGQlRTeEZRVUZGTEcxQ1FVRlBMRU5CUVVNc1JVRkJWU3hEUVVGRE8wRkJRek5DTEdGQlFWVXNSVUZCUlN4dFFrRkJUeXhEUVVGRExFVkJRV01zUTBGQlF6dEJRVU51UXl4alFVRlhMRVZCUVVVc2JVSkJRVThzUTBGQlF5eEZRVUZsTEVOQlFVTTdRVUZEY2tNc1UwRkJUU3hGUVVGRkxHMUNRVUZQTEVOQlFVTXNSVUZCVlN4RFFVRkRPMEZCUXpOQ0xGTkJRVTBzUlVGQlJTeHRRa0ZCVHl4RFFVRkRMRVZCUVZVc1EwRkJRenRCUVVNelFpeFBRVUZKTEVWQlFVVXNiVUpCUVU4c1EwRkJReXhGUVVGUkxFTkJRVU03UVVGRGRrSXNVVUZCU3l4RlFVRkZMRzFDUVVGUExFTkJRVU1zUlVGQlV5eERRVUZETzBGQlEzcENMRmxCUVZNc1JVRkJSU3h0UWtGQlR5eERRVUZETEVWQlFXRXNRMEZCUXp0QlFVTnFReXhSUVVGTExFVkJRVVVzYlVKQlFVOHNRMEZCUXl4RlFVRlRMRU5CUVVNN1FVRkRla0lzVDBGQlNTeEZRVUZGTEcxQ1FVRlBMRU5CUVVNc1JVRkJVU3hEUVVGRE8wRkJRM1pDTEdOQlFWY3NSVUZCUlN4dFFrRkJUeXhEUVVGRExFVkJRV1VzUTBGQlF6dEJRVU55UXl4TlFVRkhMRVZCUVVVc2JVSkJRVThzUTBGQlF5eEZRVUZQTEVOQlFVTTdRVUZEY2tJc1YwRkJVU3hGUVVGRkxHMUNRVUZQTEVOQlFVTXNSVUZCV1N4RFFVRkRPMEZCUXk5Q0xHTkJRVmNzUlVGQlJTeHRRa0ZCVHl4RFFVRkRMRVZCUVdVc1EwRkJRenRCUVVOeVF5eFJRVUZMTEVWQlFVVXNiVUpCUVU4c1EwRkJReXhGUVVGVExFTkJRVU03UVVGRGVrSXNaVUZCV1N4RlFVRkZMRzFDUVVGUExFTkJRVU1zUlVGQlowSXNRMEZCUXp0RlFVTjRReXhET3pzN096czdPMEZEY2tKRUxHRkJRVmtzUTBGQlF6czdPenM3T3pzN096czdPMEZCUldJc1MwRkJTU3hIUVVGSExFZEJRVWNzYlVKQlFVOHNRMEZCUXl4RFFVRmhMRU5CUVVNc1EwRkJRenRCUVVOcVF5eExRVUZKTEZOQlFWTXNSMEZCUnl4dFFrRkJUeXhEUVVGRExFTkJRVzFDTEVOQlFVTXNRMEZCUXp0QlFVTTNReXhMUVVGSkxFbEJRVWtzUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRVZCUVdkQ0xFTkJRVU1zUTBGQlF6czdTMEZEZWtJc1YwRkJWeXdyUTBGQlRTeEZRVUZ4UWpzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN08wdEJkVU0zUWl4UlFVRlJPMEZCUldoQ0xGbEJSbEVzVVVGQlVTeEhRVVZpT3pKQ1FVWkxMRkZCUVZFN08wRkJTWHBDTEZOQlFVa3NUMEZCVHl4SFFVRkhMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03TzBGQlJYaENMRk5CUVVrc1VVRkJVU3hIUVVGSE8wRkJRMklzWVVGQlVTeERRVUZETEVkQlFVY3NSVUZCUXl4SFFVRkhMRU5CUVVNN1FVRkRha0lzWVVGQlVTeFZRVUZWTzBGQlEyeENMR0ZCUVZFc1EwRkJRenRCUVVOVUxHRkJRVkVzUTBGQlF6dEJRVU5VTEdOQlFWTXNRMEZCUXp0QlFVTldMRlZCUVVzc1IwRkJSenRCUVVOU0xHRkJRVkVzUTBGQlF6dEJRVU5VTEdGQlFWRXNRMEZCUXp0QlFVTlVMR05CUVZNc1EwRkJRenRCUVVOV0xGVkJRVXNzUjBGQlJ6dE5RVU5VTEVOQlFVTTdPMEZCUlVZc1owTkJia0pwUWl4UlFVRlJMRFpEUVcxQ2JrSXNVMEZCVXl4RlFVRkRMRTlCUVU4c1JVRkJReXhSUVVGUkxFVkJRVVU3TzBGQlIyeERMRk5CUVVrc1EwRkJReXhGUVVGRkxFZEJRVWNzU1VGQlNTeEpRVUZKTEVOQlFVVXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhKUVVGSkxFVkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRVZCUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVWQlFVVXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVVVzUTBGQlF6dEJRVU51Unl4VFFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGSExFbEJRVWtzU1VGQlNTeERRVUZGTEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1NVRkJTU3hGUVVGRkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RlFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eEZRVUZGTEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRkxFTkJRVU03TzBGQlJXNUhMRk5CUVVrc1EwRkJReXhSUVVGUkxFZEJRVWM3UVVGRFpDeFJRVUZETEVWQlFVVXNTVUZCU1N4WFFVRlhMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RlFVRkRMRmxCUVZrc1JVRkJReXhEUVVGRExFTkJRVU1zUlVGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRVZCUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTNwR0xGRkJRVU1zUlVGQlJTeEpRVUZKTEZkQlFWY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eEpRVUZKTEVWQlFVTXNWVUZCVlN4RlFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdUVUZEZUVZc1EwRkJRenRCUVVOR0xGTkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEZWQlFWVXNRMEZCUXp0QlFVTXpReXhUUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eFZRVUZWTEVOQlFVTTdPMEZCUlRORExGTkJRVWtzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXp0QlFVTmFMRk5CUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dEpRVVZtT3p0aFFXNURhMElzVVVGQlVUczdaMEpCUVZJc1VVRkJVVHRCUVhGRE0wSXNiVUpCUVdNN1kwRkJRU3d3UWtGQlJ6czdRVUZGWml4aFFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFZEJRVWNzUTBGQlF5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1FVRkRha01zWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzFGQlJYSkRPenRCUVVWRUxHdENRVUZoTzJOQlFVRXNlVUpCUVVjN08wRkJSVm9zWVVGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1JVRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOMlJDeGhRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhGUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE96dEJRVVYyUkN4aFFVRkpMRU5CUVVNc1lVRkJZU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdPMEZCUlhSRUxHRkJRVWtzUTBGQlF5eFZRVUZWTEVkQlFVYzdRVUZEYUVJc1kwRkJSeXhGUVVGRkxFVkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNZVUZCWVN4SFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlEzaERMRU5CUVVNN1FVRkRSaXhoUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEVWQlFVVXNSMEZCUnl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTTdPMEZCUlRkRExHRkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1JVRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpGRExHRkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1JVRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpORExHRkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWRCUVVjc1JVRkJReXhKUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTI1RU96dEJRVVZFTEcxQ1FVRmpPMk5CUVVFc01FSkJRVWM3UVVGRFlpeGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhsUVVGbExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRkRVFzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1VVRkRkRVE3TzBGQlJVUXNWMEZCVFR0alFVRkJMR3RDUVVGSE8wRkJRMUFzWVVGQlNTeEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZPenRCUVVWb1FpeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhIUVVGSExFVkJRVU1zU1VGQlNTeERRVUZETEZWQlFWVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRWUVVOb1JDeE5RVUZOT3p0QlFVVk1MR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVkQlFVY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFWQlEycEVPenRCUVVWRUxHRkJRVWtzUTBGQlF5eGxRVUZsTEVkQlFVYzdRVUZEY2tJc1dVRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTE8wRkJRMnhETEZsQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTk8xVkJRMnhFTEVOQlFVTTdPMEZCUlVZc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkRMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEY0VRc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkRMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY2tRN08wRkJSMFFzVlVGQlN6dGpRVUZCTEdsQ1FVRkhPMEZCUTA0c1lVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU03UVVGRGNFTXNZVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNN1FVRkRjRU1zWVVGQlNTeERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRPMUZCUTJJN08wRkJSVVFzVTBGQlNUdGpRVUZCTEdkQ1FVRkhPMEZCUTB3c1lVRkJTU3hKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTzBGQlEyaENMR1ZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGJrTXNaVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVOdVF5eGxRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRmxCUVZrc1EwRkJSU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVVc1EwRkJRenRCUVVNNVF5eGxRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRmxCUVZrc1EwRkJSU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVVc1EwRkJRenRCUVVNNVF5eGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJRenRCUVVOcVFpeGpRVUZETEVWQlFVVXNTVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhMUVVGTE8wRkJRMmhDTEdOQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFdEJRVXM3V1VGRGFrSXNRMEZCUXl4RFFVRkRPMEZCUTBnc1pVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFWQlEyWTdVVUZEUmpzN1FVRkZSQ3haUVVGUE8yTkJRVUVzYlVKQlFVYzdRVUZEVWl4aFFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VVVGRFpqczdRVUZaUnl4TlFVRkRPenM3T3pzN096dFpRVXBCTEZsQlFVYzdRVUZEVGl4blFrRkJUeXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEV0QlFVc3NRMEZCUXp0UlFVTjBRanRaUVVWSkxGVkJRVU1zUzBGQlN5eEZRVUZGTzBGQlExZ3NZVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhOUVVGTkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZEZEVJc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVTTdRVUZEYWtJc1dVRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNTMEZCU3p0QlFVTm9RaXhaUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEVWQlFVVXNRMEZCUXl4TFFVRkxPMVZCUTJwQ0xFTkJRVU1zUTBGQlF6dEJRVU5JTEdGQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRSUVVObU96dEJRVmxITEUxQlFVTTdPenM3T3pzN08xbEJTa0VzV1VGQlJ6dEJRVU5PTEdkQ1FVRlBMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUzBGQlN5eERRVUZETzFGQlEzUkNPMWxCUlVrc1ZVRkJReXhMUVVGTExFVkJRVVU3UVVGRFdDeGhRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRTFCUVUwc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU4wUWl4aFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUlVGQlF6dEJRVU5xUWl4WlFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eExRVUZMTzBGQlEyaENMRmxCUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEV0QlFVczdWVUZEYWtJc1EwRkJReXhEUVVGRE8wRkJRMGdzWVVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMUZCUTJZN08wRkJTVWNzWlVGQlZUdFpRVUZCTEZsQlFVYzdRVUZEWml4blFrRkJUenRCUVVOTUxGbEJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRlZCUVZVN1FVRkRja0lzV1VGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1ZVRkJWVHRWUVVOMFFpeERRVUZETzFGQlEwZzdPMEZCVlVjc1UwRkJTVHM3T3pzN096dFpRVXBCTEZsQlFVYzdRVUZEVkN4blFrRkJUeXhKUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUXp0UlFVTndRanRaUVVWUExGVkJRVU1zUTBGQlF5eEZRVUZGTzBGQlExWXNZVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF5eERRVUZETzBGQlEyaENMR0ZCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFJRVU5tT3p0QlFWVkhMRk5CUVVrN096czdPenM3V1VGS1FTeFpRVUZITzBGQlExUXNaMEpCUVU4c1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTTdVVUZEY0VJN1dVRkZUeXhWUVVGRExFTkJRVU1zUlVGQlJUdEJRVU5XTEdGQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU5vUWl4aFFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VVVGRFpqczdRVUZYUnl4VFFVRkpPenM3T3pzN08xbEJTa0VzV1VGQlJ6dEJRVU5VTEdkQ1FVRlBMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eERRVUZETzFGQlEzQkNPMWxCUlU4c1ZVRkJReXhEUVVGRExFVkJRVVU3UVVGRFZpeGhRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGRGFFSXNZVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8xRkJRMlk3TzBGQlYwY3NVMEZCU1RzN096czdPenRaUVVwQkxGbEJRVWM3UVVGRFZDeG5Ra0ZCVHl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzUTBGQlF6dFJRVU53UWp0WlFVVlBMRlZCUVVNc1EwRkJReXhGUVVGRk8wRkJRMVlzWVVGQlNTeERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRMmhDTEdGQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRSUVVObU96dEJRVmRITEZWQlFVczdPenM3T3pzN1dVRktRU3haUVVGSE8wRkJRMVlzWjBKQlFVOHNTVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU03VVVGRGNrSTdXVUZGVVN4VlFVRkRMRU5CUVVNc1JVRkJSVHRCUVVOWUxHRkJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOcVFpeGhRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1VVRkRaanM3UVVGWFJ5eFZRVUZMT3pzN096czdPMWxCU2tFc1dVRkJSenRCUVVOV0xHZENRVUZQTEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRE8xRkJRM0pDTzFsQlJWRXNWVUZCUXl4RFFVRkRMRVZCUVVVN1FVRkRXQ3hoUVVGSkxFTkJRVU1zUlVGQlJTeERRVUZETEVsQlFVa3NSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRha0lzWVVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMUZCUTJZN08wRkJWMGNzVTBGQlNUczdPenM3T3pzN1dVRklRU3haUVVGSE8wRkJRMVFzWjBKQlFVOHNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETzFGQlF6ZENPMWxCUTA4c1ZVRkJReXhEUVVGRExFVkJRVVU3UVVGRFZpeGhRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFZEJRVWNzUTBGQlF5eERRVUZETzBGQlEzcENMR0ZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRNVUk3T3pzN1ZVRXhVR3RDTEZGQlFWRTdTVUZCVXl4VFFVRlRPenRyUWtGQk1VSXNVVUZCVVN4RE96czdPenM3UVVNM1F6ZENMR0ZCUVZrc1EwRkJRenM3UVVGRllpeExRVUZKTEVsQlFVa3NSMEZCUnl4dFFrRkJUeXhEUVVGRExFTkJRV01zUTBGQlF5eERRVUZET3p0clFrRkZjRUk3TzBGQlJXSXNVMEZCVFN4RlFVRkZMRlZCUVVNc1NVRkJTU3hGUVVGTE8wRkJRMmhDTEZsQlFVOHNVVUZCVVN4RFFVRkRMR1ZCUVdVc1EwRkJReXcwUWtGQk5FSXNSVUZCUlN4SlFVRkpMRU5CUVVNc1EwRkJRenRKUVVOeVJUczdRVUZGUkN4TlFVRkhMRVZCUVVVc1ZVRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEUxQlFVMHNSVUZCUlN4VlFVRlZMRVZCUVVVc1VVRkJVU3hGUVVGTE96dEJRVVV6UXl4VFFVRkpMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEUxQlFVMHNSVUZCUlN4UlFVRlJMRU5CUVVNc1EwRkJRenRCUVVNdlF5eFRRVUZKTEVkQlFVY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1YwRkJWeXhEUVVGRExFMUJRVTBzUlVGQlJTeFZRVUZWTEVOQlFVTXNRMEZCUXpzN1FVRkZMME1zVTBGQlNTeFpRVUZaTEVkQlFVY3NVVUZCVVN4SFFVRkhMRlZCUVZVc1NVRkJTU3hIUVVGSExFZEJRVWNzUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXpzN1FVRkZOVVFzVTBGQlNTeERRVUZETEVkQlFVY3NRMEZEU2l4SFFVRkhMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU1zUjBGQlF5eERRVUZETEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNc1IwRkJReXhEUVVGRExFVkJRM3BDTEVkQlFVY3NSVUZCUlN4TlFVRk5MRVZCUVVVc1RVRkJUU3hGUVVGRkxFTkJRVU1zUlVGQlJTeFpRVUZaTEVWQlFVVXNRMEZCUXl4RlFVRkZMRWRCUVVjc1EwRkJReXhEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRMRWRCUVVNc1EwRkJReXhEUVVNMVJDeERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenM3UVVGRldpeFpRVUZQTEVOQlFVTXNRMEZCUXp0SlFVTldPenRCUVVWRUxHbENRVUZqTEVWQlFVVXNWVUZCUXl4SlFVRkpMRVZCUVVNc1lVRkJZU3hGUVVGTE96dEJRVVYwUXl4VFFVRkpMRVZCUVVVc1IwRkJSeXhWUVVGVkxFZEJRVWNzU1VGQlNTeERRVUZETEVWQlFVVXNRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJRenRCUVVNMVF5eFRRVUZKTEV0QlFVc3NSMEZCUnl4RlFVRkZMRU5CUVVNN08wRkJSV1lzVTBGQlNTeFJRVUZSTEVkQlFVY3NVVUZCVVN4RFFVRkRMR1ZCUVdVc1EwRkJReXcwUWtGQk5FSXNSVUZCUlN4blFrRkJaMElzUTBGQlF5eERRVUZETzBGQlEzaEdMR0ZCUVZFc1EwRkJReXhaUVVGWkxFTkJRVU1zU1VGQlNTeEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRPMEZCUTJoRExHRkJRVkVzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRMjVETEdGQlFWRXNRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEyNURMR0ZCUVZFc1EwRkJReXhaUVVGWkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPenRCUVVWc1F5eFRRVUZKTEVOQlFVTXNWMEZCVnl4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE96dEJRVVV6UWl4VlFVRkxMRWxCUVVrc1EwRkJReXhIUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVkQlFVTXNZVUZCWVN4RlFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRk8wRkJRMmhETEZkQlFVa3NTMEZCU1N4SFFVRkhMRkZCUVZFc1EwRkJReXhsUVVGbExFTkJRVU1zTkVKQlFUUkNMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRE1VVXNXVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVVVzVFVGQlRTeEhRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPenM3UVVGSGJFTXNaVUZCVVN4RFFVRkRMRmRCUVZjc1EwRkJReXhMUVVGSkxFTkJRVU1zUTBGQlF6dEJRVU16UWl4WlFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVWtzUTBGQlF5eERRVUZETzAxQlEyeENPenRCUVVWRUxGbEJRVTg3UVVGRFRDeFRRVUZGTEVWQlFVVXNSVUZCUlR0QlFVTk9MRmxCUVVzc1JVRkJSU3hMUVVGTE8wRkJRMW9zWTBGQlR5eEZRVUZGTEZGQlFWRTdUVUZEYkVJc1EwRkJRenRKUVVWSU96dEZRVVZHTEVNN096czdPenRCUTNaRVJDeGhRVUZaTEVOQlFVTTdPenM3T3pzN096czdPenM3TzBGQlkySXNVVUZCVHl4RFFVRkRMRWxCUVVrc1IwRkJSeXhWUVVGRExFdEJRVXNzUlVGQlF5eEhRVUZITEVWQlFVTXNSMEZCUnl4RlFVRkxPMEZCUTJoRExGVkJRVThzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFdEJRVXNzUlVGQlF5eEhRVUZITEVOQlFVTXNSVUZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRGUVVNeFF5eERRVUZET3p0QlFVVkdMRkZCUVU4c1EwRkJReXhUUVVGVExFZEJRVWNzVlVGQlF5eExRVUZMTEVWQlFVTXNSMEZCUnl4RlFVRkRMRWRCUVVjc1JVRkJTenRCUVVOeVF5eFZRVUZUTEVOQlFVTXNTMEZCU3l4SFFVRkRMRWRCUVVjc1MwRkJTeXhIUVVGSExFZEJRVU1zUjBGQlJ5eERRVUZETEVOQlFVYzdSVUZEY0VNc1EwRkJRenM3T3pzN096czdPenM3T3pzN1FVRmpSaXhSUVVGUExFTkJRVU1zUzBGQlN5eEhRVUZITEZWQlFVTXNTMEZCU3l4RlFVRkZMRXRCUVVzc1JVRkJSU3hMUVVGTExFVkJRVVVzVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCU3p0QlFVTjJSQ3hQUVVGSkxFdEJRVXNzUzBGQlN5eExRVUZMTEVWQlFVVTdRVUZEYmtJc1dVRkJUeXhOUVVGTkxFTkJRVU03U1VGRFpqdEJRVU5FTEZWQlFWTXNRMEZCUXl4TFFVRkxMRWRCUVVjc1MwRkJTeXhMUVVGTExFMUJRVTBzUjBGQlJ5eE5RVUZOTEVOQlFVTXNTVUZCU3l4TFFVRkxMRWRCUVVjc1MwRkJTeXhEUVVGRExFZEJRVWtzVFVGQlRTeERRVUZETzBWQlF6TkZMRU5CUVVNN08wRkJSVVlzVVVGQlR5eERRVUZETEU5QlFVOHNSMEZCUnl4VlFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFVkJRVXM3UVVGRGVrSXNUMEZCU1N4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVkQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6czdRVUZGTjBJc1QwRkJTU3hMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRE5VSXNUMEZCU1N4TFFVRkxMRWRCUVVjc1EwRkJReXhGUVVGRk8wRkJRMklzVlVGQlN5eEhRVUZITEV0QlFVc3NSMEZCU1N4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFVkJRVWNzUTBGQlF6dEpRVU12UWp0QlFVTkVMRlZCUVU4c1JVRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF5eEZRVUZGTEV0QlFVc3NSVUZCUlN4TFFVRkxMRVZCUVVNc1EwRkJRenRGUVVOc1F5eERRVUZET3p0QlFVVkdMRkZCUVU4c1EwRkJReXhYUVVGWExFZEJRVWNzVlVGQlV5eE5RVUZOTEVWQlFVVXNTMEZCU3l4RlFVRkRPMEZCUXpORExFOUJRVWtzUjBGQlJ5eEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRE1VSXNUMEZCU1N4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTXhRaXhWUVVGUExFVkJRVU1zUTBGQlF5eEZRVUZGTEUxQlFVMHNSMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhGUVVGRkxFMUJRVTBzUjBGQlF5eEhRVUZITEVkQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVNc1EwRkJRenRGUVVNeFF5eERRVUZET3pzN096czdPenM3T3p0QlFXRkdMRkZCUVU4c1EwRkJReXhMUVVGTExFZEJRVWNzVlVGQlV5eEpRVUZKTEVWQlFVVXNTMEZCU3l4RlFVRkZPMEZCUTNCRExGVkJRVThzVlVGQlZTeERRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF6dEZRVU40UXl4RFFVRkRPenRCUVVWR0xGRkJRVThzUTBGQlF5eE5RVUZOTEVkQlFVY3NWVUZCVlN4TFFVRkxMRVZCUVVVN1FVRkRhRU1zVlVGQlR5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMRXRCUVVzc1JVRkJSU3hEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenRGUVVONlF5eERRVUZET3pzN096czdPenM3UVVGVFJpeFJRVUZQTEVOQlFVTXNTVUZCU1N4SFFVRkhMRlZCUVZNc1NVRkJTU3hGUVVGRk8wRkJRelZDTEZWQlFVOHNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFVkJRVWNzUTBGQlF5eEpRVUZKTEVkQlFVTXNSVUZCUlN4SlFVRkZMRVZCUVVVc1EwRkJSU3hIUVVGSExFZEJRVWNzUTBGQlF6dEZRVU14UXl4RFFVRkRPenM3T3pzN096czdPenM3UVVGWlJpeFJRVUZQTEVOQlFVTXNUVUZCVFN4SFFVRkhMRlZCUVZNc1IwRkJSeXhGUVVGRExFZEJRVWNzUlVGQlF5eEhRVUZITEVWQlFVVTdRVUZEY2tNc1ZVRkJUeXhIUVVGSExFbEJRVWtzUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJRenRGUVVOb1F5eERRVUZET3pzN096czdPenM3UVVGVFJpeFJRVUZQTEVOQlFVTXNTVUZCU1N4SFFVRkhMRmxCUVZjN1FVRkRlRUlzVlVGQlR5eFRRVUZUTEVOQlFVTXNSVUZCUXl4RlFVRkZMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUjBGQlF5eFRRVUZUTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJRenRGUVVOMFJDeERRVUZET3pzN096czdPenM3T3pzN1FVRlpSaXhSUVVGUExFTkJRVU1zVFVGQlRTeEhRVUZITEZWQlFWTXNSMEZCUnl4RlFVRkZPMEZCUXpkQ0xGVkJRVThzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRVZCUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03UlVGRGVFSXNRMEZCUXpzN096czdPenM3T3pzN1FVRlhSaXhSUVVGUExFTkJRVU1zUlVGQlJTeEhRVUZITEZWQlFWTXNUVUZCVFN4RlFVRkRMRTFCUVUwc1JVRkJSVHRCUVVOdVF5eFBRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUTFnc1YwRkJUU3hIUVVGSExFMUJRVTBzUTBGQlF6dEJRVU5vUWl4WFFVRk5MRWRCUVVjc1EwRkJReXhEUVVGRE8wbEJRMW83UVVGRFJDeFBRVUZKTEVkQlFVY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFMUJRVTBzUlVGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTnNReXhQUVVGSkxFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRTFCUVUwc1JVRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU51UXl4VlFVRlBMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4SlFVRkZMRWxCUVVrc1IwRkJReXhIUVVGSExFTkJRVU1zUjBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0RlFVTnFSQ3hEUVVGRE96czdPenM3T3pzN096dEJRVmRHTEZGQlFVOHNRMEZCUXl4RlFVRkZMRWRCUVVjc1ZVRkJVeXhOUVVGTkxFVkJRVU1zVFVGQlRTeEZRVUZGTzBGQlEyNURMRTlCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVU3UVVGRFdDeFhRVUZOTEVkQlFVY3NUVUZCVFN4RFFVRkRPMEZCUTJoQ0xGZEJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTTdTVUZEV2p0QlFVTkVMRTlCUVVrc1IwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCVFN4RlFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRMnhETEU5QlFVa3NTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zVFVGQlRTeEZRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMEZCUTI1RExGVkJRVThzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4SlFVRkZMRWxCUVVrc1IwRkJReXhIUVVGSExFTkJRVU1zUjBGQlF5eEhRVUZITEVOQlFVTTdSVUZEY2tNc1EwRkJRenM3UVVGSFJpeFJRVUZQTEVOQlFVTXNTMEZCU3l4SFFVRkhMRlZCUVZNc1MwRkJTeXhGUVVGRExFZEJRVWNzUlVGQlF5eEhRVUZITEVWQlFVVTdRVUZEZEVNc1VVRkJTeXhGUVVGRkxFTkJRVU03UVVGRFVpeFBRVUZKTEV0QlFVc3NTVUZCU1N4SFFVRkhMRVZCUVVVN1FVRkRhRUlzVlVGQlN5eEhRVUZITEVkQlFVY3NRMEZCUXp0SlFVTmlPMEZCUTBRc1ZVRkJUeXhMUVVGTExFTkJRVU03UlVGRFpDeERRVUZET3pzN096czdPenM3UVVGVFJpeFJRVUZQTEVOQlFVTXNUMEZCVHl4SFFVRkhMRlZCUVZNc1NVRkJTU3hGUVVGRk8wRkJReTlDTEU5QlFVa3NTMEZCU3l4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOa0xGRkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZPMEZCUXpsQ0xGVkJRVXNzU1VGQlNTeEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRiRUk3UVVGRFJDeFZRVUZQTEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRE8wVkJRelZDTEVOQlFVTTdPenM3T3pzN096czdPenRCUVZsR0xGRkJRVThzUTBGQlF5eFJRVUZSTEVkQlFVY3NWVUZCVXl4RlFVRkZMRVZCUVVNc1JVRkJSU3hGUVVGRExFVkJRVVVzUlVGQlF5eEZRVUZGTEVWQlFVVTdRVUZEZGtNc1QwRkJTU3hEUVVGRExFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNRMEZCUXp0QlFVTm9RaXhQUVVGSkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTJoQ0xGVkJRVThzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUlN4RFFVRkRMRWRCUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlF5eERRVUZETEVOQlFVVXNRMEZCUXp0RlFVTXZRaXhEUVVGRE96dEJRVVZHTEZGQlFVOHNRMEZCUXl4UlFVRlJMRWRCUVVjc1ZVRkJVeXhKUVVGSkxFVkJRVVU3UVVGRGFFTXNWVUZCVHl4RlFVRkZMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0RlFVTTVRaXhEUVVGRE96czdPenM3T3pzN1FVRlRSaXhSUVVGUExFTkJRVU1zU1VGQlNTeEhRVUZITEZsQlFXMUNPMDlCUVZZc1NVRkJTU3huUTBGQlF5eEhRVUZIT3p0QlFVTTVRaXhQUVVGSkxFOUJRVThzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUlVGQlJUdEJRVU14UWl4WlFVRlBMRU5CUVVNc1EwRkJRenRKUVVOV0xFMUJRVTA3UVVGRFRDeFpRVUZQTEVOQlFVTXNRMEZCUXp0SlFVTldPMFZCUTBZc1F6czdPenM3TzBGRE4wNUVMR0ZCUVZrc1EwRkJRenM3T3pzN096czdPenRCUVVWaUxFdEJRVWtzUjBGQlJ5eEhRVUZITEcxQ1FVRlBMRU5CUVVNc1EwRkJZU3hEUVVGRExFTkJRVU03UVVGRGFrTXNTMEZCU1N4SFFVRkhMRWRCUVVjc2JVSkJRVThzUTBGQlF5eERRVUZoTEVOQlFVTXNRMEZCUXp0QlFVTnFReXhMUVVGSkxFbEJRVWtzUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRU5CUVdNc1EwRkJReXhEUVVGRE8wRkJRMjVETEV0QlFVa3NTMEZCU3l4SFFVRkhMRzFDUVVGUExFTkJRVU1zUTBGQlpTeERRVUZETEVOQlFVTTdRVUZEY2tNc1MwRkJUU3haUVVGWkxFZEJRVWNzYlVKQlFVOHNRMEZCUXl4RlFVRlJMRU5CUVVNc1EwRkJRenM3UzBGRk9VSXNUVUZCVFN4MVFrRkJVU3hEUVVGVExFVkJRWFpDTEUxQlFVMDdPenM3T3p0TFFVdE5MRk5CUVZNN1FVRkZha0lzV1VGR1VTeFRRVUZUTEVOQlJXaENMRWxCUVVrc1JVRkJReXhQUVVGUExFVkJRVU1zVVVGQlVTeEZRVUZGT3pKQ1FVWm9RaXhUUVVGVE96dEJRVWN4UWl4blEwRklhVUlzVTBGQlV5dzJRMEZIYkVJN1FVRkRVaXhUUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRE8wRkJRMnhETEZOQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExHRkJRV0VzUTBGQlF5eEpRVUZKTEVWQlFVTXNUMEZCVHl4RlFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8wRkJRekZFTEZOQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRMmhDTEZOQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1MwRkJTeXhEUVVGRE8wRkJRMnhDTEZOQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRMnBDTEZOQlFVa3NZVUZCWVN4SFFVRkhMRTFCUVUwc1JVRkJSU3hEUVVGRE8wRkJRemRDTEZOQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hIUVVGSExHRkJRV0VzUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZETVVNc1UwRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVkQlFVY3NZVUZCWVN4RFFVRkRMRWxCUVVrc1EwRkJRenRCUVVOMFF5eFRRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1IwRkJSeXhoUVVGaExFTkJRVU1zUzBGQlN5eERRVUZETzBGQlEzaERMRk5CUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeEhRVUZITEdGQlFXRXNRMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRkRU1zVTBGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4WFFVRlhMRWRCUVVjc1lVRkJZU3hEUVVGRExGZEJRVmNzUTBGQlF6dEJRVU53UkN4VFFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGVkJRVlVzUjBGQlJ5eGhRVUZoTEVOQlFVTXNWVUZCVlN4RFFVRkRPMGxCUTI1RU96dGhRV2hDYTBJc1UwRkJVenM3WjBKQlFWUXNVMEZCVXp0QlFXdENOVUlzYTBKQlFXRTdZMEZCUVN4MVFrRkJReXhKUVVGSkxFVkJRVU1zVDBGQlR5eEZRVUZETEZGQlFWRXNSVUZCUlRzN1FVRkZia01zWjBKQlFVOHNRMEZCUXl4UFFVRlBMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03UVVGRE1VSXNhVUpCUVZFc1EwRkJReXhYUVVGWExFZEJRVWNzVVVGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlEycEVMR2xDUVVGUkxFTkJRVU1zU1VGQlNTeEhRVUZITEV0QlFVc3NRMEZCUXpzN1FVRkZkRUlzWVVGQlNTeFJRVUZSTEVkQlFVYzdRVUZEWWl4dFFrRkJWU3hSUVVGUkxFTkJRVU1zU1VGQlNUdEJRVU4yUWl4dFFrRkJWU3hGUVVGRk8wRkJRMW9zTWtKQlFXdENMRWxCUVVrN1FVRkRkRUlzYTBKQlFWTXNhVUpCUVZjc1JVRkJSVHRCUVVOMFFpeHpRa0ZCWVN4TFFVRkxPMVZCUTI1Q0xFTkJRVU03TzBGQlJVWXNZMEZCU3l4SlFVRkpMRWRCUVVjc1NVRkJTU3hSUVVGUkxFVkJRVVU3UVVGRGVFSXNiVUpCUVZFc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1ZVRkRMMEk3TzBGQlJVUXNZMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3TzBGQlJXaERMR1ZCUVVrc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXpzN1FVRkZkRUlzWlVGQlN5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRTlCUVU4c1EwRkJReXhGUVVGSE8wRkJRelZDTEd0Q1FVRk5MRWxCUVVrc1IwRkJSeXhKUVVGSkxFOUJRVThzUlVGQlJ6dEJRVU42UWl4MVFrRkJVU3hEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRqUVVNNVFqczdRVUZCUVN4WlFVVkdMRTFCUVUwc1NVRkJTU3hQUVVGUExFOUJRVThzUzBGQlN5eFZRVUZWTEVWQlFVVTdRVUZEZUVNc2NVSkJRVkVzUTBGQlF5eExRVUZMTEVkQlFVY3NUMEZCVHl4RFFVRkRPenRaUVVVeFFpeE5RVUZOTEVsQlFVa3NUMEZCVHl4RFFVRkRMRTFCUVUwc1NVRkJSU3hEUVVGRExFVkJRVVU3TzBGQlJUVkNMR2xDUVVGSkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnFReXh4UWtGQlVTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRTlCUVU4c1EwRkJRenRaUVVONlFqdFZRVU5HT3pzN096dEJRVXRFTEdGQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN096dEJRVWRvUkN4aFFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFbEJRVWtzU1VGQlNTeERRVUZETEUxQlFVMHNXVUZCV1N4WFFVRlhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zVTBGQlV5eEZRVUZGTzBGQlF6VkZMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZsQlFWa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1JVRkJSVHRCUVVONlF5eHBRa0ZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhaUVVGWkxFTkJRVU1zVlVGQlZTeEZRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRPMWxCUTNwRE8xVkJRMFk3T3pzN1FVRkpSQ3hoUVVGSkxGRkJRVkVzUTBGQlF5eEpRVUZKTEVsQlFVa3NTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NVVUZCVVN4RFFVRkRMR05CUVdNc1JVRkJSVHRCUVVNMVJTeGxRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRkZCUVZFc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZET1VJc1pVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wRkJReTlDTEdWQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVNMVF5eGxRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNN1ZVRkRMME1zVFVGQlRTeEpRVUZKTEZGQlFWRXNRMEZCUXl4alFVRmpMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zVTBGQlV5eEZRVUZGT3p0QlFVVjZSQ3hsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEZWQlFWVXNRMEZCUXl4TlFVRk5MRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eFBRVUZQTEVOQlFVTXNTVUZCU1N4RlFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03UVVGREwwY3NaVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZETEdkQ1FVRm5RaXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNTVUZCU1N4RFFVRkRMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUlVGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPenRCUVVWcVNDeGxRVUZKTEVsQlFVa3NRMEZCUXl4TFFVRkxMRWxCUVVVc1NVRkJTU3hGUVVGRk8wRkJRM0JDTEdsQ1FVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSExGRkJRVkVzUTBGQlF5eFhRVUZYTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRja01zYVVKQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXp0WlFVTnFSVHRCUVVORUxHVkJRVWtzU1VGQlNTeERRVUZETEUxQlFVMHNTVUZCUlN4SlFVRkpMRVZCUVVVN1FVRkRja0lzYVVKQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1VVRkJVU3hEUVVGRExGZEJRVmNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTjBReXhwUWtGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETzFsQlEzQkZPMVZCUlVZc1RVRkJUVHRCUVVOTUxHMUNRVUZSTEVOQlFVTXNTVUZCU1N4SFFVRkhMRkZCUVZFc1EwRkJReXhYUVVGWExFTkJRVU03UVVGRGNrTXNaVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhSUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpsQ0xHVkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NVVUZCVVN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFZRVU5vUXpzN08wRkJSMFFzWVVGQlNTeFJRVUZSTEVOQlFVTXNTMEZCU3l4RlFVRkZPMEZCUTJ4Q0xHVkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhSUVVGUkxFVkJRVVVzVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMVZCUTJoRUxFMUJRVTA3UVVGRFRDeGxRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRXRCUVVzc1EwRkJRenRWUVVOd1FqczdRVUZGUkN4blFrRkJUeXhSUVVGUkxFTkJRVU03VVVGRmFrSTdPMEZCUlVRc1UwRkJTVHRqUVVGQkxHZENRVUZITzBGQlEwd3NZVUZCU1N4RFFVRkRMRlZCUVZVc1JVRkJSU3hEUVVGRE8wRkJRMnhDTEdGQlFVa3NRMEZCUXl4alFVRmpMRVZCUVVVc1EwRkJRenRCUVVOMFFpeGhRVUZKTEVOQlFVTXNZVUZCWVN4RlFVRkZMRU5CUVVNN1FVRkRja0lzWVVGQlNTeERRVUZETEdWQlFXVXNSVUZCUlN4RFFVRkRPMEZCUTNaQ0xHRkJRVWtzUTBGQlF5eGpRVUZqTEVWQlFVVXNRMEZCUXp0QlFVTjBRaXhoUVVGSkxFTkJRVU1zV1VGQldTeEZRVUZGTEVOQlFVTTdVVUZEY2tJN08wRkJSVVFzWlVGQlZUdGpRVUZCTEhOQ1FVRkhPMEZCUTFnc1lVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRMnBETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFOUJRVThzUlVGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1FVRkRPVU1zWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1VVRkJVU3hGUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTm9SQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZkQlFWY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03VVVGRGRrTTdPMEZCUlVRc2JVSkJRV003WTBGQlFTd3dRa0ZCUnl4RlFVRkZPenRCUVVOdVFpeHJRa0ZCWVR0alFVRkJMSGxDUVVGSExFVkJRVVU3TzBGQlEyeENMRzFDUVVGak8yTkJRVUVzTUVKQlFVY3NSVUZCUlRzN1FVRkZia0lzYjBKQlFXVTdZMEZCUVN3eVFrRkJSenM3TzBGQlJXaENMR0ZCUVVrc1EwRkJReXhwUWtGQmFVSXNSMEZCUnl4SlFVRkpMRU5CUVVNc2FVSkJRV2xDTEVsQlFVa3NTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJRenM3TzBGQlIyaEZMR0ZCUVVrc1MwRkJTeXhEUVVGRExFMUJRVTBzUlVGQlJUdEJRVU5vUWl4bFFVRkpMRU5CUVVNc2FVSkJRV2xDTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zV1VGQldTeEZRVUZGTEdGQlFVYzdiMEpCUVVrc1RVRkJTeXhSUVVGUkxFTkJRVU1zUjBGQlJ5eERRVUZETzFsQlFVRXNRMEZCUXl4RFFVRkRPMEZCUTJwR0xHVkJRVWtzUTBGQlF5eHBRa0ZCYVVJc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4WFFVRlhMRVZCUVVVc1lVRkJSenR2UWtGQlNTeE5RVUZMTEZsQlFWa3NRMEZCUXl4SFFVRkhMRU5CUVVNN1dVRkJRU3hEUVVGRExFTkJRVU03UVVGRGNFWXNaVUZCU1N4RFFVRkRMR2xDUVVGcFFpeERRVUZETEdkQ1FVRm5RaXhEUVVGRExGVkJRVlVzUlVGQlJTeGhRVUZITzI5Q1FVRkpMRTFCUVVzc1pVRkJaU3hEUVVGRExFZEJRVWNzUTBGQlF6dFpRVUZCTEVOQlFVTXNRMEZCUXp0VlFVTjJSanRCUVVORUxHRkJRVWtzUTBGQlF5eFpRVUZaTEVkQlFVY3NZVUZCUnp0clFrRkJTU3hOUVVGTExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTTdWVUZCUVN4RFFVRkRPMEZCUXpkRExHRkJRVWtzUTBGQlF5eGxRVUZsTEVkQlFVY3NZVUZCUnp0clFrRkJTU3hOUVVGTExGVkJRVlVzUTBGQlF5eEhRVUZITEVOQlFVTTdWVUZCUVN4RFFVRkRPMEZCUTI1RUxHRkJRVWtzUTBGQlF5eHBRa0ZCYVVJc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4WFFVRlhMRVZCUVVVc1lVRkJSenRyUWtGQlNTeE5RVUZMTEZGQlFWRXNRMEZCUXl4SFFVRkhMRU5CUVVNN1ZVRkJRU3hEUVVGRExFTkJRVU03VVVGRGFrWTdPMEZCUlVRc2FVSkJRVms3WTBGQlFTeDNRa0ZCUnp0QlFVTmlMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNSMEZCUnl4VFFVRlRMRU5CUVVNN1VVRkRka003TzBGQlJVUXNZVUZCVVR0alFVRkJMR3RDUVVGRExFTkJRVU1zUlVGQlJUczdPMEZCUjFZc1lVRkJTU3hKUVVGSkxFTkJRVU1zVDBGQlR5eFpRVUZaTEZkQlFWY3NSVUZCUlR0QlFVTjJReXhsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEUxQlFVMHNRMEZCUXl4blFrRkJaMElzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZMRWxCUVVrc1EwRkJReXhEUVVGRExHZENRVUZuUWl4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVWQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNN1ZVRkRja2M3T3p0QlFVZEVMR0ZCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03UVVGRE4wTXNZVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhIUVVGSExFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRE5VTXNZVUZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU03UVVGRGNFSXNZVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJSU3hEUVVGRE8wRkJRMklzWVVGQlNTeERRVUZETEZOQlFWTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNWMEZCVnl4RlFVRkZMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6dEJRVU16UlN4aFFVRkpMRU5CUVVNc1dVRkJXU3hIUVVGSExGRkJRVkVzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhUUVVGVExFVkJRVVVzU1VGQlNTeERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRPMEZCUXk5RkxHRkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1FVRkRia0lzVlVGQlF5eERRVUZETEdOQlFXTXNSVUZCUlN4RFFVRkRPMEZCUTI1Q0xGVkJRVU1zUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0UlFVTnlRanM3UVVGRlJDeFpRVUZQTzJOQlFVRXNhVUpCUVVNc1EwRkJReXhGUVVGRk96czdRVUZEVkN4aFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUlVGQlJUdEJRVU5rTEdWQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1IwRkJSeXhEUVVGRExGZEJRVmNzUTBGQlF5eERRVUZETEVWQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRelZETEdWQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRCUVVOYUxHVkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUTJwQ0xIRkNRVUZWTEVOQlFVTXNXVUZCVFR0QlFVRkZMRzFDUVVGTExFbEJRVWtzUjBGQlJ5eExRVUZMTEVOQlFVTTdXVUZCUlN4RlFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRE8xVkJRemRETzBGQlEwUXNWVUZCUXl4RFFVRkRMR05CUVdNc1JVRkJSU3hEUVVGRE8wRkJRMjVDTEZWQlFVTXNRMEZCUXl4bFFVRmxMRVZCUVVVc1EwRkJRenRSUVVOeVFqczdRVUZGUkN4bFFVRlZPMk5CUVVFc2IwSkJRVU1zUTBGQlF5eEZRVUZGTzBGQlExb3NZVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhIUVVGSExFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRE5VTXNZVUZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhMUVVGTExFTkJRVU03UVVGRGNrSXNZVUZCU1N4RFFVRkRMRTlCUVU4c1JVRkJSU3hEUVVGRE8wRkJRMllzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJRenRCUVVOeVFpeHBRa0ZCVVN4RFFVRkRMRzFDUVVGdFFpeERRVUZETEZkQlFWY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03UVVGRE5VUXNhVUpCUVZFc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4VFFVRlRMRVZCUVVNc1NVRkJTU3hEUVVGRExHVkJRV1VzUTBGQlF5eERRVUZETzBGQlF6ZEVMRlZCUVVNc1EwRkJReXhqUVVGakxFVkJRVVVzUTBGQlF6dEJRVU51UWl4VlFVRkRMRU5CUVVNc1pVRkJaU3hGUVVGRkxFTkJRVU03VVVGRGNrSTdPMEZCUlVRc1ZVRkJTenRqUVVGQkxHbENRVUZITEVWQlJWQTdPMEZCUlVRc1UwRkJTVHRqUVVGQkxHZENRVUZITEVWQlJVNDdPMEZCUlVRc1dVRkJUenRqUVVGQkxHMUNRVUZITEVWQlJWUTdPMEZCUzBRc1lVRkJVVHM3T3p0alFVRkJMR3RDUVVGRExFTkJRVU1zUlVGQlJUdEJRVU5XTEdGQlFVa3NTVUZCU1N4RFFVRkRMRTlCUVU4c1dVRkJXU3hYUVVGWExFVkJRVVU3UVVGRGRrTXNaVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhOUVVGTkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUlVGQlJTeEpRVUZKTEVOQlFVTXNRMEZCUXl4blFrRkJaMElzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1NVRkJTU3hGUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETzFWQlEzSkhPMEZCUTBRc1lVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6dEJRVU0zUXl4aFFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSExFZEJRVWNzUTBGQlF5eFhRVUZYTEVOQlFVTXNRMEZCUXl4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU0xUXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF6dEJRVU53UWl4aFFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlEyUXNZVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6dEJRVU51UWl4VlFVRkRMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU03UVVGRGJrSXNWVUZCUXl4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8xRkJRM0pDT3p0QlFVVkVMR2xDUVVGWk8yTkJRVUVzYzBKQlFVTXNRMEZCUXl4RlFVRkZPMEZCUTJRc1lVRkJTU3hKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTzBGQlEyaENMR1ZCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUjBGQlJ5eERRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRMRVZCUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBGQlF6VkRMR1ZCUVVrc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF6dEJRVU5xUWl4WlFVRkRMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU03UVVGRGJrSXNXVUZCUXl4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8xVkJRM0pDTzFGQlEwWTdPMEZCUlVRc2IwSkJRV1U3WTBGQlFTeDVRa0ZCUXl4RFFVRkRMRVZCUVVVN1FVRkRha0lzWVVGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4SFFVRkhMRU5CUVVNc1YwRkJWeXhEUVVGRExFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1FVRkROME1zWVVGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRja0lzWVVGQlNTeERRVUZETEZsQlFWa3NSVUZCUlN4RFFVRkRPMEZCUTNCQ0xHRkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkRMRU5CUVVNN1FVRkRja0lzVlVGQlF5eERRVUZETEdOQlFXTXNSVUZCUlN4RFFVRkRPMEZCUTI1Q0xGVkJRVU1zUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0UlFVTnlRanM3UVVGRlJDeFZRVUZMTzJOQlFVRXNhVUpCUVVjN1FVRkRUaXhoUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZGTEVOQlFVTTdVVUZEWkRzN1FVRkZSQ3hqUVVGVE8yTkJRVUVzY1VKQlFVYzdRVUZEVml4aFFVRkpMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03VVVGRFlqczdRVUZGUkN4cFFrRkJXVHRqUVVGQkxIZENRVUZITzBGQlEySXNZVUZCU1N4RFFVRkRMRTlCUVU4c1JVRkJSU3hEUVVGRE8xRkJRMmhDT3p0QlFWVkVMRmRCUVUwN096czdPenM3T3pzN08yTkJRVUVzWjBKQlFVTXNTMEZCU3l4RlFVRkRMRTFCUVUwc1JVRkJSVHRCUVVOdVFpeGhRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRXRCUVVzc1EwRkJRenRCUVVOdVFpeGhRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJRenRCUVVOeVFpeGhRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRNVU1zWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVTXNTVUZCU1N4RFFVRkRPMEZCUXpWRExHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRTlCUVU4c1JVRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZET1VNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU5vUkN4aFFVRkpMRU5CUVVNc1lVRkJZU3hGUVVGRkxFTkJRVU03VVVGRGRFSTdPMEZCUlVRc1ZVRkJTenRqUVVGQkxHbENRVUZITzBGQlEwNHNaMEpCUVU4c1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFRRVUZUTEVWQlFVVTdRVUZETjBJc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dFZRVU5zUkR0UlFVTkdPenRCUVZGRUxGbEJRVTg3T3pzN096czdPenRqUVVGQkxHMUNRVUZITzBGQlExSXNZVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJSU3hEUVVGRE8wRkJRMklzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzBGQlEzUkRMR0ZCUVVrc1EwRkJReXhyUWtGQmEwSXNSVUZCUlN4RFFVRkRPMEZCUXpGQ0xHRkJRVWtzU1VGQlNTeERRVUZETEZWQlFWVXNSVUZCUlR0QlFVTnVRaXhyUWtGQlR5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dFZRVU5xUXp0QlFVTkVMR0ZCUVVrc1EwRkJReXhoUVVGaExFVkJRVVVzUTBGQlF6dFJRVU4wUWpzN1FVRkZSQ3hyUWtGQllUdGpRVUZCTEhsQ1FVRkhMRVZCUldZN08wRkJSVVFzWVVGQlVUdGpRVUZCTEd0Q1FVRkRMRWxCUVVrc1JVRkJReXhMUVVGTExFVkJRVVU3UVVGRGJrSXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eExRVUZMTEVOQlFVTTdRVUZETVVJc1lVRkJTU3hEUVVGRExHTkJRV01zUlVGQlJTeERRVUZETzFGQlEzWkNPenM3TzFWQmJGTnJRaXhUUVVGVE8wbEJRVk1zV1VGQldUczdhMEpCUVRsQ0xGTkJRVk1zUXpzN096czdPMEZEWWpsQ0xHRkJRVmtzUTBGQlF6czdRVUZGWWl4UlFVRlBMRU5CUVVNc1dVRkJXU3hIUVVGSExGVkJRVU1zUlVGQlJTeEZRVUZMTzBGQlF6ZENMRTlCUVVrc1kwRkJZeXhIUVVGSExFVkJRVVVzUTBGQlF5eHhRa0ZCY1VJc1JVRkJSU3hEUVVGRE8wRkJRMmhFTEU5QlFVa3NSMEZCUnl4SFFVRkhMR05CUVdNc1EwRkJReXhIUVVGSExFZEJRVWNzVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXp0QlFVTTVReXhQUVVGSkxFbEJRVWtzUjBGQlJ5eGpRVUZqTEVOQlFVTXNTVUZCU1N4SFFVRkhMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU03UVVGRGFFUXNWVUZCVHl4RlFVRkRMRWRCUVVjc1JVRkJTQ3hIUVVGSExFVkJRVU1zU1VGQlNTeEZRVUZLTEVsQlFVa3NSVUZCUXl4RFFVRkRPMFZCUTI1Q0xFTkJRVU03TzBGQlJVWXNVVUZCVHl4RFFVRkRMRmxCUVZrc1IwRkJSeXhWUVVGRExFMUJRVTBzUlVGQlN6dEJRVU5xUXl4UFFVRkpMRTlCUVU4c1RVRkJUU3hMUVVGTExGRkJRVkVzUlVGQlJUdEJRVU01UWl4WFFVRk5MRWRCUVVjc1VVRkJVU3hEUVVGRExHTkJRV01zUTBGQlF5eE5RVUZOTEVOQlFVTXNUMEZCVHl4RFFVRkRMRWRCUVVjc1JVRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6RkVPenRCUVVWRUxFOUJRVWtzVFVGQlRTeFpRVUZaTEZkQlFWY3NTVUZCU1N4TlFVRk5MRmxCUVZrc1ZVRkJWU3hGUVVGRE8wRkJRMmhGTEZsQlFVOHNUVUZCVFN4RFFVRkRPMGxCUTJZc1RVRkJUVHRCUVVOTUxGbEJRVThzTUVKQlFUQkNMRU5CUVVNN1NVRkRia003UlVGRFJpeERRVUZET3p0QlFVVkdMRkZCUVU4c1EwRkJReXhYUVVGWExFZEJRVWNzVlVGQlF5eERRVUZETEVWQlFVTXNUVUZCVFN4RlFVRkxPMEZCUTJ4RExGVkJRVTg3UVVGRFRDeE5RVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRXRCUVVzc1IwRkJSeXhOUVVGTkxFTkJRVU1zU1VGQlNUdEJRVU40UWl4TlFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFdEJRVXNzUjBGQlJ5eE5RVUZOTEVOQlFVTXNSMEZCUnp0SlFVTjRRaXhEUVVGRE8wVkJRMGdzUTBGQlF6czdRVUZGUml4UlFVRlBMRU5CUVVNc1YwRkJWeXhIUVVGSExGVkJRVU1zUTBGQlF5eEZRVUZETEUxQlFVMHNSVUZCU3p0QlFVTnNReXhWUVVGUE8wRkJRMHdzVFVGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4aFFVRmhMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUTBGQlF5eGhRVUZoTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhIUVVGSExFMUJRVTBzUTBGQlF5eEpRVUZKTEVkQlFVY3NTMEZCU3p0QlFVTXhSU3hOUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEdGQlFXRXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRWRCUVVjc1RVRkJUU3hEUVVGRExFZEJRVWNzUjBGQlJ5eExRVUZMTzBsQlF6RkZMRU5CUVVNN1JVRkRTQ3hEUVVGRE96dEJRVVZHTEZGQlFVOHNRMEZCUXl4WFFVRlhMRWRCUVVjc1ZVRkJVeXhOUVVGTkxFVkJRVVU3T3p0QlFVVnlReXhQUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEZGQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03UVVGRGFFUXNUMEZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZWQlFWVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRCUVVNM1F5eFRRVUZOTEVOQlFVTXNWMEZCVnl4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6czdRVUZGYWtNc1QwRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eFZRVUZETEVOQlFVTXNSVUZCUXl4RFFVRkRMRVZCUVVzN1FVRkRja0lzVjBGQlN5eFBRVUZQTEVOQlFVTXNTMEZCU3l4SFFVRkhMRU5CUVVNc1IwRkJReXhEUVVGRExFTkJRVU03UVVGRGVrSXNWMEZCU3l4UFFVRlBMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUjBGQlF5eERRVUZETEVOQlFVTTdRVUZETVVJc1YwRkJTeXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEV0QlFVc3NSMEZCUnl4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRE8wRkJRMnhETEZkQlFVc3NUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFZEJRVWNzUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXp0SlFVTndReXhEUVVGRE8wVkJSVWdzUXpzN096czdPMEZEYUVSRUxHRkJRVmtzUTBGQlF6czdRVUZGWWl4UlFVRlBMRU5CUVVNc1VVRkJVU3hIUVVGSExGVkJRVU1zUjBGQlJ5eEZRVUZMTzBGQlF6RkNMRTlCUVVrc1QwRkJUeXhIUVVGSExFdEJRVXNzVVVGQlVTeEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeEhRVUZITEV0QlFVc3NTVUZCU1N4SlFVRkpMRWRCUVVjc1dVRkJXU3hWUVVGVkxFdEJRVXNzUzBGQlN5eEpRVUZKTEVkQlFVY3NXVUZCV1N4WFFVRlhMRXRCUVVzc1MwRkJTeXhGUVVGSE8wRkJRMnhLTEZsQlFVOHNTVUZCU1N4RFFVRkRPMGxCUTJJc1RVRkJUVHRCUVVOTUxGbEJRVThzUzBGQlN5eERRVUZETzBsQlEyUTdSVUZEUml4RE96czdPenM3UVVOU1JDeGhRVUZaTEVOQlFVTTdPMEZCUldJc1VVRkJUeXhEUVVGRExFMUJRVTBzUjBGQlNTeGpRVUZqTEVsQlFVa3NVVUZCVVN4RFFVRkRMR1ZCUVdkQ0xFTTdPenM3T3p0QlEwWTNSRHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUczdRVUZGUVR0QlFVTkJPenRCUVVWQk8wRkJRMEU3UVVGRFFUczdRVUZGUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUczdRVUZGUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTeHJRa0ZCYVVJN1FVRkRha0lzVVVGQlR6dEJRVU5RTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRVVZCT3p0QlFVVkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQkxFbEJRVWM3UVVGRFNEdEJRVU5CTzBGQlEwRTdRVUZEUVN4blFrRkJaU3hUUVVGVE8wRkJRM2hDTzBGQlEwRTdPMEZCUlVFN1FVRkRRVHM3UVVGRlFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUczdRVUZGUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEVzVFVGQlN6dEJRVU5NTzBGQlEwRTdPMEZCUlVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdPMEZCUlVFN08wRkJSVUU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPenRCUVVWQk8wRkJRMEU3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVGRlFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUczdRVUZGUVR0QlFVTkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVRkZRU3hKUVVGSE8wRkJRMGdzY1VKQlFXOUNMRk5CUVZNN1FVRkROMEk3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUVVWQk8wRkJRMEU3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFc1RVRkJTenRCUVVOTU8wRkJRMEU3TzBGQlJVRTdRVUZEUVR0QlFVTkJPenRCUVVWQk8wRkJRMEU3TzBGQlJVRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZCUlVFN08wRkJSVUU3UVVGRFFUdEJRVU5CTEVsQlFVYzdRVUZEU0R0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdPMEZCUlVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN1FVRkRRVHM3UVVGRlFUdEJRVU5CTzBGQlEwRTdPMEZCUlVFN1FVRkRRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk8wRkJRMEU3T3pzN096czdRVU0zVTBFc1lVRkJXU3hEUVVGRE96czdPenM3UVVGRllpeExRVUZKTEVsQlFVa3NSMEZCUnl4dFFrRkJUeXhEUVVGRExFTkJRV01zUTBGQlF5eERRVUZET3pzN096czdPenM3T3p0TFFWZGtMRWxCUVVrN1FVRkZXaXhaUVVaUkxFbEJRVWtzUjBGRmVVSTdVMEZCY0VNc1IwRkJSeXhuUTBGQlJ5eERRVUZETzFOQlFVTXNSMEZCUnl4blEwRkJSeXhEUVVGRE8xTkJRVU1zU1VGQlNTeG5RMEZCUnl4RFFVRkRPMU5CUVVNc1MwRkJTeXhuUTBGQlJ5eERRVUZET3pzeVFrRkdNMElzU1VGQlNUczdPenM3UVVGTmNrSXNVMEZCU1N4RFFVRkRMRWRCUVVjc1IwRkJSeXhIUVVGSExFTkJRVU03UVVGRFppeFRRVUZKTEVOQlFVTXNSMEZCUnl4SFFVRkhMRWRCUVVjc1EwRkJRenRCUVVObUxGTkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUTJwQ0xGTkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTMEZCU3l4RFFVRkRPMEZCUTI1Q0xGTkJRVWtzUTBGQlF5eFBRVUZQTEVkQlFVY3NTMEZCU3l4RFFVRkRPMEZCUTNKQ0xGTkJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NTMEZCU3l4RFFVRkRPMEZCUTNSQ0xGTkJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wbEJRM3BDT3p0blFrRmlhMElzU1VGQlNUdEJRVzlDZGtJc1YwRkJUVHM3T3pzN096dGpRVUZCTEdkQ1FVRkRMRXRCUVVzc1JVRkJSVHRCUVVOYUxHRkJRVWtzU1VGQlNTeERRVUZETEVsQlFVa3NSVUZCUlRzN1FVRkZZaXhsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEV0QlFVc3NSMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhKUVVGTExFbEJRVWtzUTBGQlF5eEpRVUZMTEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVWQlFVVXNTVUZCU1N4RFFVRkRMRWRCUVVjc1JVRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdWVUZET1Vjc1RVRkJUVHRCUVVOTUxHVkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03VlVGRGFrUTdRVUZEUkN4aFFVRkpMRWxCUVVrc1EwRkJReXhSUVVGUkxFdEJRVXNzU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUlR0QlFVTm9ReXhsUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNN1FVRkRNMElzWlVGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNN1ZVRkRja0lzVFVGQlRUdEJRVU5NTEdWQlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1MwRkJTeXhEUVVGRE8xVkJRM1JDTzBGQlEwUXNaMEpCUVU4c1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dFJRVU51UWpzN1FVRk5SQ3hwUWtGQldUczdPenM3T3p0alFVRkJMSE5DUVVGRExFdEJRVXNzUlVGQlJUdEJRVU5zUWl4aFFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTMEZCU3l4RlFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFVkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGRGNrUXNaMEpCUVU4c1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRhRU03TzBGQlMwY3NaVUZCVlRzN096czdPMWxCUVVFc1dVRkJSenRCUVVObUxHZENRVUZQTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUlVGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU55UkRzN096dFZRV3hFYTBJc1NVRkJTVHM3TzJ0Q1FVRktMRWxCUVVrc1F6czdPenM3T3pzN096czdPenM3T3pzN1FVTmlla0lzWVVGQldTeERRVUZET3p0TFFVVk9MRWxCUVVrc2RVTkJRVTBzUTBGQll6czdTMEZEZUVJc1YwRkJWeXgxUTBGQlRTeEZRVUZyUWpzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenRMUVcxRE4wSXNUVUZCVFN4WFFVRk9MRTFCUVUwN1FVRkZUaXhaUVVaQkxFMUJRVTBzUjBGRkswUTdVMEZCY0VVc1NVRkJTU3huUTBGQlF5eFZRVUZWTzFOQlFVTXNVMEZCVXl4blEwRkJReXhWUVVGVk8xTkJRVU1zVFVGQlRTeG5RMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJReXhIUVVGSExFTkJRVU03VTBGQlF5eE5RVUZOTEdkRFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRExFZEJRVWNzUTBGQlF6czdNa0pCUm01RkxFMUJRVTA3TzBGQlIyWXNVMEZCU1N4RFFVRkRMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU03UVVGRGFrSXNVMEZCU1N4RFFVRkRMRk5CUVZNc1IwRkJSeXhUUVVGVExFTkJRVU03UVVGRE0wSXNVMEZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGRGJFSXNVMEZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGRFppeFRRVUZKTEVOQlFVTXNWMEZCVnl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOeVFpeFRRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1JVRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEpRVU0xUWpzN1owSkJWRlVzVFVGQlRUdEJRVmRxUWl4WFFVRk5PMk5CUVVFc1owSkJRVU1zVFVGQlRTeEZRVUZETEUxQlFVMHNSVUZCUlR0QlFVTndRaXhoUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITzBGQlEyUXNZMEZCUnl4RlFVRkZPMEZCUTBnc1kwRkJReXhGUVVGRkxFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEV2l4alFVRkRMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF6dFpRVU5pTzBGQlEwUXNZMEZCUnl4RlFVRkZPMEZCUTBnc1kwRkJReXhGUVVGRkxFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEV2l4alFVRkRMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF6dFpRVU5pTzBGQlEwUXNhVUpCUVUwc1JVRkJSVHRCUVVOT0xHTkJRVU1zUlVGQlJTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVVXNRMEZCUXl4SFFVRkhMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGVFTXNZMEZCUXl4RlFVRkZMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJSU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTjZRenRWUVVOR0xFTkJRVU03VVVGRFNEczdRVUZOUnl4WFFVRk5PMWxCU2tFc1ZVRkJReXhMUVVGTExFVkJRVVU3UVVGRGFFSXNZVUZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU1zYzBKQlFYTkNMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRGJrUTdXVUZGVXl4WlFVRkhPMEZCUTFnc1owSkJRVThzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXp0UlFVTnlRanM3UVVGSFJDeFhRVUZOTzJOQlFVRXNaMEpCUVVNc1MwRkJTeXhGUVVGRk8wRkJRMW9zWVVGQlNTeEpRVUZKTEVOQlFVTXNTVUZCU1N4TFFVRkhMRlZCUVZVc1JVRkJSVHRCUVVNeFFpeGxRVUZKTEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc2MwSkJRWE5DTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF6dEJRVU5xUlN4bFFVRkpMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zVTBGQlV5eERRVUZETEVkQlFVY3NSMEZCUnl4RlFVRkZPMEZCUVVVc2MwSkJRVk1zUjBGQlJ5eERRVUZETEVOQlFVTTdXVUZCUlR0QlFVTnFSQ3hsUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTndRaXhsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF5eFhRVUZYTEVOQlFVTTdWVUZEZUVRc1RVRkJUVHRCUVVOTUxHVkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMSE5DUVVGelFpeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMVZCUTJwRU8wRkJRMFFzWVVGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVWQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM2hET3p0QlFVVkVMREpDUVVGelFqdGpRVUZCTEdkRFFVRkRMRTlCUVU4c1JVRkJSVHRCUVVNNVFpeHBRa0ZCVHl4SlFVRkpMRU5CUVVNc1UwRkJVenRCUVVOdVFpeG5Ra0ZCU3l4UlFVRlJPMEZCUTFnc2FVSkJRVWtzVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFVkJRVVVzVDBGQlR5eERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTndSeXh4UWtGQlVTeEhRVUZITEZGQlFWRXNRMEZCUXl4TFFVRkxMRWxCUVVrc1NVRkJTU3hEUVVGRExFVkJRVVVzUjBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTjRReXh4UWtGQlVTeEhRVUZITEVOQlFVVXNVVUZCVVN4SFFVRkhMRWxCUVVrc1IwRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzBGQlEzWkRMRzlDUVVGUExGRkJRVkVzUTBGQlF6dEJRVU5zUWl4blFrRkJTeXhWUVVGVk8wRkJRMklzYjBKQlFVOHNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eEZRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUlVGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpORkxHZENRVUZMTEZsQlFWazdRVUZEWml4dlFrRkJUeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRVZCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RlFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNSVUZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGQlFTeFZRVU0xUlR0UlFVTkdPenM3TzFWQk4wUlZMRTFCUVUwN096dExRV3RGVGl4TlFVRk5MRmRCUVU0c1RVRkJUVHRCUVVWT0xGbEJSa0VzVFVGQlRTeEhRVVZWTzFOQlFXWXNTVUZCU1N4blEwRkJReXhSUVVGUk96c3lRa0ZHWkN4TlFVRk5PenRCUVVkbUxGTkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUTJwQ0xGTkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4WFFVRlhMRVZCUVVVc1EwRkJRenRCUVVNdlFpeFRRVUZKTEVOQlFVTXNWVUZCVlN4SFFVRkhMRXRCUVVzc1EwRkJRenRKUVVONlFqczdaMEpCVGxVc1RVRkJUVHRCUVZGcVFpeFZRVUZMTzJOQlFVRXNhVUpCUVVjN1FVRkRUaXhwUWtGQlVTeEpRVUZKTEVOQlFVTXNTVUZCU1R0QlFVTm1MR2RDUVVGTExGTkJRVk03UVVGRFdpeHBRa0ZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF6dEJRVU5vUWl4cFFrRkJTU3hKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTzBGQlEyaENMREpDUVVGWkxFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMk5CUXpWQ08wRkJRMFFzYVVKQlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1ZVRkJWU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXp0QlFVTjRSQ3hwUWtGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlF5OUNMRzFDUVVGTk8wRkJRMUlzWjBKQlFVc3NVVUZCVVR0QlFVTllMR2xDUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdRVUZEWkN4cFFrRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJReTlDTEcxQ1FVRk5PMEZCUTFJc1owSkJRVXNzV1VGQldUdEJRVU5tTEdsQ1FVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSE8wRkJRMlFzWjBKQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNRMEZCUXp0QlFVTXpReXhuUWtGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNRMEZCUXp0alFVTnFSQ3hEUVVGRE8wRkJRMFlzYVVKQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRCUVVOa0xHbENRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJRenRCUVVOcVFpeHZRa0ZCU3l4RlFVRkZMRWxCUVVrc1EwRkJReXhMUVVGTE8wRkJRMnBDTEdkQ1FVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzBGQlEyeENMR2RDUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRVZCUTI1Q0xFTkJRVU1zUTBGQlF6dEJRVU5JTEcxQ1FVRk5PMEZCUTFJc1owSkJRVXNzVVVGQlVUdEJRVU5ZTEdsQ1FVRkpMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03UVVGRFdpeHBRa0ZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFVkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUXk5Q0xHMUNRVUZOTzBGQlFVRXNWVUZEVkR0UlFVVkdPenRCUVVWRUxGTkJRVWs3WTBGQlFTeG5Ra0ZCUnp0QlFVTk1MR0ZCUVVrc1NVRkJTU3hEUVVGRExFbEJRVWtzUzBGQlJ5eFpRVUZaTEVWQlFVVTdRVUZETlVJc1pVRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ6dEJRVU5rTEdOQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNRMEZCUXp0QlFVTXpReXhqUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eERRVUZETzFsQlEycEVMRU5CUVVNN1FVRkRSaXhsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUXp0QlFVTnFRaXhyUWtGQlN5eEZRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxPMEZCUTJwQ0xHTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1FVRkRiRUlzWTBGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhGUVVOdVFpeERRVUZETEVOQlFVTTdRVUZEU0N4bFFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VlVGRFpqdFJRVU5HT3p0QlFVVkVMRmxCUVU4N1kwRkJRU3h0UWtGQlJ6dEJRVU5TTEdsQ1FVRlJMRWxCUVVrc1EwRkJReXhKUVVGSk8wRkJRMllzWjBKQlFVc3NVVUZCVVR0QlFVTllMR2xDUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTEVOQlFVTTdRVUZEWml4cFFrRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJReTlDTEcxQ1FVRk5PMEZCUTFJc1owSkJRVXNzV1VGQldUdEJRVU5tTEdsQ1FVRkpMRU5CUVVNc1QwRkJUeXhGUVVGRkxFTkJRVU03UVVGRFppeHBRa0ZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSenRCUVVOa0xHZENRVUZETEVWQlFVVXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVczdRVUZETlVJc1owSkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMDdZMEZEYkVNc1EwRkJRenRCUVVOR0xHbENRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJRenRCUVVOcVFpeHZRa0ZCU3l4RlFVRkZMRWxCUVVrc1EwRkJReXhMUVVGTE8wRkJRMnBDTEdkQ1FVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzBGQlEyeENMR2RDUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRVZCUTI1Q0xFTkJRVU1zUTBGQlF6dEJRVU5JTEcxQ1FVRk5PMEZCUVVFc1ZVRkRWRHRSUVVOR096czdPMVZCTlVWVkxFMUJRVTA3T3pzN096czdRVU40UjI1Q0xHRkJRVmtzUTBGQlF6czdPenM3TzB0QlJWRXNUVUZCVFR0QlFVVmtMRmxCUmxFc1RVRkJUU3hEUVVWaUxFdEJRVXNzUlVGQlJUc3lRa0ZHUVN4TlFVRk5PenRCUVVkMlFpeFRRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRXRCUVVzc1NVRkJTU3hMUVVGTExFTkJRVU03U1VGRE4wSTdPMmRDUVVwclFpeE5RVUZOTzBGQlRYcENMRk5CUVVrN1kwRkJRU3hqUVVGRExFdEJRVXNzUlVGQlJUdEJRVU5XTEdGQlFVa3NTMEZCU3l4SlFVRkpMRXRCUVVzc1MwRkJTeXhMUVVGTExFVkJRVVU3UVVGRE5VSXNaVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhMUVVGTExFTkJRVU03VlVGRGNFSXNUVUZCVFR0QlFVTk1MR1ZCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMVZCUXpGQ08xRkJRMFk3TzBGQlJVUXNUMEZCUlR0alFVRkJMR05CUVVjN1FVRkRTQ3hoUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXp0UlFVTnVRanM3UVVGRlJDeFJRVUZITzJOQlFVRXNaVUZCUnp0QlFVTktMR0ZCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUzBGQlN5eERRVUZETzFGQlEzQkNPenM3TzFWQmNFSnJRaXhOUVVGTk96czdhMEpCUVU0c1RVRkJUU3hET3pzN096czdRVU5HTTBJc1lVRkJXU3hEUVVGRE96czdPenM3T3pzN096czdRVUZGWWl4TFFVRkpMRWRCUVVjc1IwRkJSeXh0UWtGQlR5eERRVUZETEVOQlFXRXNRMEZCUXl4RFFVRkRPMEZCUTJwRExFdEJRVWtzVTBGQlV5eEhRVUZITEcxQ1FVRlBMRU5CUVVNc1EwRkJiVUlzUTBGQlF5eERRVUZETzBGQlF6ZERMRXRCUVVrc1NVRkJTU3hIUVVGSExHMUNRVUZQTEVOQlFVTXNSVUZCWjBJc1EwRkJReXhEUVVGRE96dExRVU42UWl4WFFVRlhMQ3REUVVGTkxFVkJRWEZDT3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenRMUVcxRE4wSXNUVUZCVFR0QlFVVmtMRmxCUmxFc1RVRkJUU3hIUVVWWU96SkNRVVpMTEUxQlFVMDdPMEZCU1haQ0xGTkJRVWtzVDBGQlR5eEhRVUZITEVOQlFVTXNTMEZCU3l4RlFVRkRMRXRCUVVzc1JVRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6czdRVUZGY0VNc1UwRkJTU3hSUVVGUkxFZEJRVWM3UVVGRFlpeGhRVUZSTEVOQlFVTXNSMEZCUnl4RlFVRkRMRVZCUVVVc1EwRkJRenRCUVVOb1FpeGhRVUZSTEZWQlFWVTdRVUZEYkVJc1dVRkJUeXhEUVVGRE8wRkJRMUlzV1VGQlR5eERRVUZETzBGQlExSXNZVUZCVVN4RFFVRkRPMEZCUTFRc1kwRkJVeXhEUVVGRE8wMUJRMWdzUTBGQlF6czdRVUZGUml4blEwRm1hVUlzVFVGQlRTdzJRMEZsYWtJc1UwRkJVeXhGUVVGRExFOUJRVThzUlVGQlF5eFJRVUZSTEVWQlFVVTdPMEZCUld4RExGTkJRVWtzUTBGQlF5eFhRVUZYTEVkQlFVY3NWVUZCVlN4RFFVRkRPenRCUVVVNVFpeFRRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNSMEZCUnl4RlFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1NVRkJTU3hGUVVGRkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN08wRkJSWFJITEZOQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1NVRkJTU3hYUVVGWExFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1NVRkJTU3hGUVVGRExFbEJRVWtzUTBGQlF5eFhRVUZYTEVWQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6TkhMRk5CUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1ZVRkJWU3hEUVVGRE96dEJRVVUzUXl4VFFVRkpMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03TzBGQlJWb3NVMEZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETEZkQlFWY3NRMEZCUXpzN1FVRkZNME1zVTBGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBsQlJXaERPenRoUVRsQ2EwSXNUVUZCVFRzN1owSkJRVTRzVFVGQlRUdEJRV2REZWtJc2JVSkJRV003WTBGQlFTd3dRa0ZCUnpzN1FVRkZaaXhoUVVGSkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRE9VSXNZVUZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMEZCUTJ4RExHRkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVRkRMRTFCUVUwc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6czdRVUZGYWtNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRMjVETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTjJReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03VVVGRmNrTTdPMEZCUlVRc2EwSkJRV0U3WTBGQlFTeDVRa0ZCUnpzN1FVRkZaQ3hoUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSVHRCUVVNMVFpeGxRVUZKTEVOQlFVTXNWMEZCVnl4SFFVRkhMRlZCUVZVc1EwRkJRenRWUVVNdlFpeE5RVUZOTzBGQlEwd3NaVUZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXhaUVVGWkxFTkJRVU03VlVGRGFrTTdPMEZCUlVRc1lVRkJTU3hKUVVGSkxFTkJRVU1zVVVGQlVTeEZRVUZGTzBGQlEycENMR1ZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUlVGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFZRVU4wUkRzN1FVRkZSQ3hoUVVGSkxFTkJRVU03WVVGQlJTeERRVUZETzJGQlFVVXNRMEZCUXp0aFFVRkZMRU5CUVVNN1lVRkJSU3hUUVVGVE8yRkJRVVVzV1VGQldTeGhRVUZETzBGQlEzaERMR0ZCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWM3UVVGRFpDeG5Ra0ZCU3l4RlFVRkZMRU5CUVVNN1FVRkRVaXhaUVVGRExFVkJRVVVzUTBGQlF6dFZRVU5NTEVOQlFVTTdPMEZCUlVZc1lVRkJTU3hKUVVGSkxFTkJRVU1zVjBGQlZ5eExRVUZMTEZWQlFWVXNSVUZCUlR0QlFVTnVReXhsUVVGSkxFTkJRVU1zVTBGQlV5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRMnBETEZsQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGRExFTkJRVU1zUTBGQlF6dEJRVU5xUWl4WlFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRMDRzV1VGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNN1FVRkRia0lzV1VGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNN1FVRkRaaXhsUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1UwRkJVeXhIUVVGSExFZEJRVWNzUTBGQlF6dEJRVU40UXl4bFFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUjBGQlJ5eERRVUZETEVkQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFZEJRVU1zU1VGQlNTeERRVUZETEZWQlFWVXNTVUZCUlN4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVkQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkROMFVzYjBKQlFWTXNSMEZCUnl4WlFVRlpMRWRCUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJTeERRVUZETEVOQlFVVXNSMEZCUXl4RFFVRkRMRWRCUVVNc1MwRkJTeXhEUVVGRE8wRkJRM0pFTEhWQ1FVRlpMRWRCUVVjc1EwRkJReXhIUVVGRExFTkJRVU1zUTBGQlF6dFZRVU53UWl4TlFVRk5PMEZCUTB3c1pVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOc1F5eFpRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUTA0c1dVRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTJ4Q0xGbEJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTJZc1dVRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTTdRVUZEYkVJc1pVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRk5CUVZNc1IwRkJSeXhIUVVGSExFTkJRVU03UVVGRGVFTXNaVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEZWQlFWVXNTVUZCUlN4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVkQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTTdRVUZETTBVc2IwSkJRVk1zUjBGQlJ5eGpRVUZqTEVkQlFVTXNTVUZCU1N4RFFVRkRMRk5CUVZNc1IwRkJSU3hEUVVGRExFTkJRVVVzUjBGQlF5eERRVUZETEVkQlFVTXNSMEZCUnl4RFFVRkRPMEZCUTNKRUxIVkNRVUZaTEVkQlFVY3NRMEZCUXl4SFFVRkRMRU5CUVVNc1EwRkJRenRWUVVOd1FqczdRVUZGUkN4aFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkROMElzWVVGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4WlFVRlpMRU5CUVVNc1IwRkJSeXhGUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6ZENMR0ZCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEZkQlFWY3NSVUZCUXl4VFFVRlRMRU5CUVVNc1EwRkJRenRCUVVNM1F5eGhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdRVUZEZWtNc1lVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRE8wRkJRM3BETEdGQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1dVRkJXU3hEUVVGRExFOUJRVThzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnFReXhoUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03TzBGQlJXeERMR0ZCUVVrc1NVRkJTU3hEUVVGRExGZEJRVmNzUzBGQlN5eFZRVUZWTEVWQlFVVTdRVUZEYmtNc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNSMEZCUnl4RlFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wRkJRMnBETEdWQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFZEJRVWNzUlVGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRMjVFTEdWQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFOUJRVThzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnlReXhsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1EwRkJReXhIUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1ZVRkRNMFFzVFVGQlRUdEJRVU5NTEdWQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFZEJRVWNzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnFReXhsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGFrTXNaVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zVDBGQlR5eEZRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGRrUXNaVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zVVVGQlVTeEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMVZCUTNaRE8wRkJRMFFzWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1YwRkJWeXhGUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETzBGQlEycEVMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUXl4WlFVRlpMRU5CUVVNc1EwRkJRenRCUVVNM1F5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdPMEZCUlRkRExHRkJRVWtzU1VGQlNTeERRVUZETEZkQlFWY3NTMEZCU3l4VlFVRlZMRVZCUVVVN1FVRkRia01zWlVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF5OUNMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFWQlEyeEVMRTFCUVUwN1FVRkRUQ3hsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTnFSQ3hsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VlVGRGFFTTdRVUZEUkN4aFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVVUzUXpzN1FVRkZSQ3h0UWtGQll6dGpRVUZCTERCQ1FVRkhPMEZCUTJZc1lVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdRVUZEYUVRc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdRVUZEZEVRc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdVVUZEY0VRN08wRkJSMFFzVjBGQlRUdGpRVUZCTEd0Q1FVRkhPMEZCUTFBc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVWQlFVVTdRVUZEYWtJc1pVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRk5CUVZNc1IwRkJReXhKUVVGSkxFTkJRVU03VlVGRGRrTTdRVUZEUkN4aFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6czdRVUZGTlVNc1lVRkJTU3hKUVVGSkxFTkJRVU1zVjBGQlZ5eExRVUZMTEZWQlFWVXNSVUZCUlR0QlFVTnVReXhsUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUjBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRlZCUVZVc1NVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhIUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6VkdMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1FVRkRMMFFzWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1IwRkJSeXhGUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU5xUlN4bFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eFJRVUZSTEVWQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFZRVU14UkN4TlFVRk5PMEZCUTB3c1pVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhWUVVGVkxFbEJRVVVzU1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUjBGQlF5eERRVUZETEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU16Uml4bFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU5xUkN4bFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRha01zWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1QwRkJUeXhGUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1ZVRkRla1E3VVVGRFJqczdRVUZIUkN4VlFVRkxPMk5CUVVFc2FVSkJRVWM3UVVGRFRpeGhRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVTBGQlV5eEhRVUZETEVkQlFVY3NRMEZCUXp0QlFVTnlReXhoUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRE8wRkJRMnhETEdGQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRSUVVOaU96dEJRVVZFTEZOQlFVazdZMEZCUVN4blFrRkJSenRCUVVOTUxHRkJRVWtzU1VGQlNTeERRVUZETEU5QlFVOHNSVUZCUlR0QlFVTm9RaXhsUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGFrTXNaVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhaUVVGWkxFTkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVVc1EwRkJRenRCUVVOb1JDeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTNSRExHVkJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0VlFVVm1PMUZCUTBZN08wRkJSVVFzV1VGQlR6dGpRVUZCTEcxQ1FVRkhPMEZCUTFJc1lVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFGQlEyWTdPMEZCUlVjc1pVRkJWVHRaUVVGQkxGbEJRVWM3UVVGRFppeG5Ra0ZCVHl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGVkJRVlVzUTBGQlF6dFJRVU12UWpzN1FVRlZSeXhWUVVGTE96czdPenM3T3p0WlFVaEJMRmxCUVVjN1FVRkRWaXhuUWtGQlR5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJRenRSUVVNeFFqdFpRVU5STEZWQlFVTXNRMEZCUXl4RlFVRkZPMEZCUTFnc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRkRUlzWVVGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFZRVUZWTEVOQlFVTTdRVUZETjBNc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU4wUXl4aFFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VVVGRFpqczdRVUZWUnl4UlFVRkhPenM3T3pzN096dFpRVWhCTEZsQlFVYzdRVUZEVWl4blFrRkJUeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXp0UlFVTjRRanRaUVVOTkxGVkJRVU1zUTBGQlF5eEZRVUZGTzBGQlExUXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF5eERRVUZETzFGQlEzSkNPenRCUVZWSExGRkJRVWM3T3pzN096czdPMWxCU0VFc1dVRkJSenRCUVVOU0xHZENRVUZQTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRE8xRkJRM2hDTzFsQlEwMHNWVUZCUXl4RFFVRkRMRVZCUVVVN1FVRkRWQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRja0k3TzBGQlZVY3NVMEZCU1RzN096czdPenM3V1VGSVFTeFpRVUZITzBGQlExUXNaMEpCUVU4c1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTTdVVUZEZWtJN1dVRkRUeXhWUVVGRExFTkJRVU1zUlVGQlJUdEJRVU5XTEdGQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTU3hIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU4wUWpzN1FVRlZSeXhUUVVGSk96czdPenM3T3p0WlFVaEJMRmxCUVVjN1FVRkRWQ3huUWtGQlR5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRWxCUVVrc1EwRkJRenRSUVVNelFqdFpRVU5QTEZWQlFVTXNRMEZCUXl4RlFVRkZPMEZCUTFZc1lVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eEpRVUZKTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTNoQ096czdPMVZCZEU5clFpeE5RVUZOTzBsQlFWTXNVMEZCVXpzN2EwSkJRWGhDTEUxQlFVMHNRenM3T3pzN08wRkRlRU16UWl4aFFVRlpMRU5CUVVNN096czdPenM3T3pzN1FVRkZZaXhMUVVGSkxFZEJRVWNzUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRU5CUVdFc1EwRkJReXhEUVVGRE8wRkJRMnBETEV0QlFVa3NWMEZCVnl4SFFVRkhMRzFDUVVGUExFTkJRVU1zUlVGQmEwSXNRMEZCUXl4RFFVRkRPMEZCUXpsRExFdEJRVWtzVTBGQlV5eEhRVUZITEcxQ1FVRlBMRU5CUVVNc1EwRkJiVUlzUTBGQlF5eERRVUZET3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN08wdEJPRUo0UWl4TlFVRk5PMEZCUldRc1dVRkdVU3hOUVVGTkxFZEJSVmc3TWtKQlJrc3NUVUZCVFRzN1FVRkpka0lzVTBGQlNTeFBRVUZQTEVkQlFVY3NRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenM3UVVGRmVFSXNVMEZCU1N4UlFVRlJMRWRCUVVjN1FVRkRZaXhoUVVGUkxFTkJRVU1zUlVGQlJTeEZRVUZETEVWQlFVVXNRMEZCUXp0QlFVTm1MR1ZCUVZVc1MwRkJTenRCUVVObUxHTkJRVk1zUzBGQlN6dE5RVU5tTEVOQlFVTTdPMEZCUlVZc1owTkJXbWxDTEUxQlFVMHNOa05CV1dwQ0xGTkJRVk1zUlVGQlF5eFBRVUZQTEVWQlFVTXNVVUZCVVN4RlFVRkZPenRCUVVWc1F5eFRRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN08wRkJSVzVFTEZOQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRKUVVWaU96dGhRV3hDYTBJc1RVRkJUVHM3WjBKQlFVNHNUVUZCVFR0QlFXOUNla0lzYlVKQlFXTTdZMEZCUVN3d1FrRkJSenM3UVVGRlppeGhRVUZKTEVOQlFVTXNSMEZCUnl4SFFVRkhMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdRVUZET1VJc1lVRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8wRkJRMnBETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTnVReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03VVVGRmNrTTdPMEZCUlVRc2EwSkJRV0U3WTBGQlFTeDVRa0ZCUnpzN1FVRkZaQ3hoUVVGSkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJReXhEUVVGRExFVkJRVVU3UVVGRE9VSXNaVUZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZETEVOQlFVTXNRMEZCUXp0VlFVTXZRaXhOUVVGTk8wRkJRMHdzWlVGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGRExFTkJRVU1zUTBGQlF6dFZRVU01UWpzN1FVRkZSQ3hoUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1IwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU0xUkN4aFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNSMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNelJDeGhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNMVF5eGhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNMVF5eGhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhQUVVGUExFVkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNdlF5eGhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhSUVVGUkxFVkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPenRCUVVVNVF5eGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzBGQlF6RkVMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6TkRMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVkQlFVY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03VVVGRk0wTTdPMEZCUlVRc2JVSkJRV003WTBGQlFTd3dRa0ZCUnp0QlFVTm1MR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUlN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBGQlEyNUVMR0ZCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFJRVU5tT3p0QlFVVkVMRmRCUVUwN1kwRkJRU3hyUWtGQlJ6dEJRVU5RTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhGUVVGRk8wRkJRMllzWlVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6dEJRVU14UkN4bFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eE5RVUZOTEVWQlFVVXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6dFZRVU5xUkN4TlFVRk5PMEZCUTB3c1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFZEJRVU1zUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRCUVVNeFJDeGxRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhOUVVGTkxFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRWUVVOdVJEdFJRVU5HT3p0QlFVVkVMRlZCUVVzN1kwRkJRU3hwUWtGQlJ6dEJRVU5PTEdGQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRCUVVOYUxHRkJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0QlFVTmtMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEZRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRSUVVOb1F6czdRVUZWUnl4VlFVRkxPenM3T3pzN096dFpRVWhCTEZsQlFVYzdRVUZEVml4blFrRkJUeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEV0QlFVc3NRMEZCUXp0UlFVTXhRanRaUVVOUkxGVkJRVU1zUzBGQlN5eEZRVUZGTzBGQlEyWXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZEZUVJc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJReTlDTEdGQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRSUVVObU96dEJRVkZFTEZOQlFVazdPenM3T3pzN08yTkJRVUVzWjBKQlFVYzdRVUZEVEN4aFFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzBGQlEyNUNMR0ZCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFJRVU5tT3pzN08xVkJPVVpyUWl4TlFVRk5PMGxCUVZNc1UwRkJVenM3YTBKQlFYaENMRTFCUVUwc1F6czdPenM3TzBGRGJFTXpRaXhoUVVGWkxFTkJRVU03T3pzN096czdPenM3UVVGRllpeExRVUZKTEVkQlFVY3NSMEZCUnl4dFFrRkJUeXhEUVVGRExFTkJRV0VzUTBGQlF5eERRVUZETzBGQlEycERMRXRCUVVrc1kwRkJZeXhIUVVGSExHMUNRVUZQTEVOQlFVTXNSVUZCT0VJc1EwRkJReXhEUVVGRE96czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3UzBGcFEzaERMRTFCUVUwN1FVRkZaQ3haUVVaUkxFMUJRVTBzUjBGRldEc3lRa0ZHU3l4TlFVRk5PenRCUVVsMlFpeFRRVUZKTEU5QlFVOHNSMEZCUnl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE96dEJRVWQyUWl4VFFVRkpMRkZCUVZFc1IwRkJSenRCUVVOaUxHRkJRVkVzUTBGQlF5eEZRVUZGTEVWQlFVTXNSVUZCUlN4RFFVRkRPMEZCUTJZc1lVRkJVU3haUVVGWk8wRkJRM0JDTEdOQlFWTXNTMEZCU3p0TlFVTm1MRU5CUVVNN08wRkJSVVlzWjBOQlltbENMRTFCUVUwc05rTkJZV3BDTEZOQlFWTXNSVUZCUXl4UFFVRlBMRVZCUVVNc1VVRkJVU3hGUVVGRk96czdPenM3TzBGQlVXeERMRk5CUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRU5CUVVNN08wRkJSUzlDTEZOQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRCUVVOYUxGTkJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0SlFVVm1PenRoUVRGQ2EwSXNUVUZCVFRzN1owSkJRVTRzVFVGQlRUdEJRVFJDZWtJc2JVSkJRV003WTBGQlFTd3dRa0ZCUnp0QlFVTm1MR0ZCUVVrc1EwRkJReXhIUVVGSExFZEJRVWNzUjBGQlJ5eERRVUZETEUxQlFVMHNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRCUVVOb1F5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdPMEZCUlc1RExHRkJRVWtzUTBGQlF5eHBRa0ZCYVVJc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZET3pzN1FVRkhiRU1zWVVGQlNTeERRVUZETEVsQlFVa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBGQlF5OUNMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVjBGQlZ5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenM3UVVGRmNFTXNZVUZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhIUVVGSExFTkJRVU1zWTBGQll5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03TzBGQlJXaEVMR0ZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRmxCUVZrc1EwRkJReXhSUVVGUkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdPMEZCUlhKRUxHRkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExGbEJRVmtzUTBGQlF5eFJRVUZSTEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNN1VVRkZka1E3TzBGQlJVUXNhMEpCUVdFN1kwRkJRU3g1UWtGQlJ6czdRVUZGWkN4aFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU42UXl4aFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU14UXl4aFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVVXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRCUVVOcVJpeGhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhqUVVGakxFVkJRVVVzU1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRSUVVOMFJEczdRVUZGUkN4dFFrRkJZenRqUVVGQkxEQkNRVUZIT3p0QlFVVm1MR0ZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRmxCUVZrc1EwRkJReXhaUVVGWkxFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVOMFJTeGhRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eFpRVUZaTEVOQlFVTXNXVUZCV1N4RlFVRkZMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdRVUZEY0VVc1lVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFGQlEyWTdPMEZCVVVRc1YwRkJUVHM3T3pzN096czdPMk5CUVVFc2EwSkJRVWM3UVVGRFVDeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJSVHRCUVVObUxHVkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMEZCUTJoRUxHVkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRkZCUVZFc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRPMVZCUXpGRUxFMUJRVTA3UVVGRFRDeGxRVUZKTEVsQlFVa3NRMEZCUXl4SlFVRkpMRXRCUVVjc1dVRkJXU3hGUVVGRk8wRkJRelZDTEdsQ1FVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eFJRVUZSTEVWQlFVVXNUMEZCVHl4SFFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUlVGQlJTeEhRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUXpsRUxHbENRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zU1VGQlNTeEZRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhIUVVGRExFZEJRVWNzUjBGQlJTeEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTndSU3hwUWtGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFbEJRVWtzUlVGQlJ5eERRVUZETEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zU1VGQlJTeEhRVUZITEVkQlFVVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRla1VzVFVGQlRUdEJRVU5NTEdsQ1FVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eFJRVUZSTEVWQlFVVXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dFpRVU55UkR0QlFVTkVMR1ZCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUlN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzFWQlEyNUVPMUZCUTBZN096czdWVUZxUm10Q0xFMUJRVTA3U1VGQlV5eGpRVUZqT3p0clFrRkJOMElzVFVGQlRTeERPenM3T3pzN1FVTndRek5DTEdGQlFWa3NRMEZCUXpzN096czdPenM3T3p0QlFVVmlMRXRCUVVrc1IwRkJSeXhIUVVGSExHMUNRVUZQTEVOQlFVTXNRMEZCWVN4RFFVRkRMRU5CUVVNN1FVRkRha01zUzBGQlNTeEpRVUZKTEVkQlFVY3NiVUpCUVU4c1EwRkJReXhEUVVGakxFTkJRVU1zUTBGQlF6dEJRVU51UXl4TFFVRkpMRmRCUVZjc1IwRkJSeXh0UWtGQlR5eERRVUZETEVWQlFXdENMRU5CUVVNc1EwRkJRenRCUVVNNVF5eExRVUZKTEZOQlFWTXNSMEZCUnl4dFFrRkJUeXhEUVVGRExFTkJRVzFDTEVOQlFVTXNRMEZCUXpzN096czdPMHRCVFhoQ0xHTkJRV003UVVGRmRFSXNXVUZHVVN4alFVRmpMRU5CUlhKQ0xFbEJRVWtzUlVGQlF5eFBRVUZQTEVWQlFVTXNVVUZCVVN4RlFVRkZPekpDUVVab1FpeGpRVUZqT3p0QlFVa3ZRaXhuUTBGS2FVSXNZMEZCWXl3MlEwRkpla0lzU1VGQlNTeEZRVUZETEU5QlFVOHNSVUZCUXl4UlFVRlJMRVZCUVVVN08wRkJSVGRDTEZOQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eEpRVUZKTEVsQlFVa3NVVUZCVVN4RFFVRkRPenRCUVVVelF5eFRRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhPMEZCUTJRc1VVRkJReXhGUVVGRkxFTkJRVU03UVVGRFNpeFJRVUZETEVWQlFVVXNRMEZCUXp0TlFVTk1MRU5CUVVNN08wRkJSVVlzVTBGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMGxCUlhCRU96dGhRV1pyUWl4alFVRmpPenRuUWtGQlpDeGpRVUZqTzBGQmFVSnFReXh0UWtGQll6dGpRVUZCTERCQ1FVRkhPMEZCUTJZc1lVRkJTU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8wRkJRMmhETEdGQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1dVRkJXU3hEUVVGRExFMUJRVTBzUlVGQlJTeE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTjBReXhoUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRGVFTXNZVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zWTBGQll5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPenRCUVVWNlF5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdPMEZCUlc1RExHRkJRVWtzUTBGQlF5eHBRa0ZCYVVJc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZET3p0QlFVVnNReXhoUVVGSkxFTkJRVU1zWVVGQllTeEZRVUZGTEVOQlFVTTdVVUZEZEVJN08wRkJSVVFzYTBKQlFXRTdZMEZCUVN4NVFrRkJSenRCUVVOa0xHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1JVRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTNwRExHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1JVRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpGRExHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRWRCUVVjc1JVRkJSU3hKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOMFJUczdRVUZGUkN4WFFVRk5PMk5CUVVFc2EwSkJRVWM3UVVGRFVDeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJSVHRCUVVObUxHVkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMEZCUTJoRUxHVkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRkZCUVZFc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRPMVZCUXpGRUxFMUJRVTA3UVVGRFRDeGxRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhOUVVGTkxFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVOc1JDeGxRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhSUVVGUkxFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRWUVVOeVJEdFJRVU5HT3p0QlFVVkVMRk5CUVVrN1kwRkJRU3hqUVVGRExGVkJRVlVzUlVGQlJUdEJRVU5tTEdsQ1FVRlJMRWxCUVVrc1EwRkJReXhKUVVGSk8wRkJRMllzWjBKQlFVc3NVMEZCVXp0QlFVTmFMR2xDUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdRVUZEWkN4cFFrRkJTU3hKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGTzBGQlEyaENMREpDUVVGWkxFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMk5CUXpWQ08wRkJRMFFzYVVKQlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1ZVRkJWU3hEUVVGRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRExFVkJRVVVzUTBGQlF5eERRVUZET3p0QlFVVjBSQ3h0UWtGQlRUdEJRVU5TTEdkQ1FVRkxMRkZCUVZFN1FVRkRXQ3hwUWtGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPenRCUVVWa0xHMUNRVUZOTzBGQlExSXNaMEpCUVVzc1dVRkJXVHRCUVVObUxHbENRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhPMEZCUTJRc1owSkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUTBGQlF6dEJRVU16UXl4blFrRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUTBGQlF6dGpRVU12UXl4RFFVRkRPMEZCUTBZc2FVSkJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXpzN096czdPMEZCVFdRc2JVSkJRVTA3UVVGRFVpeG5Ra0ZCU3l4UlFVRlJPMEZCUTFnc2FVSkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNN08wRkJSWFJDTEcxQ1FVRk5PMEZCUVVFc1ZVRkRWRHRSUVVWR096dEJRVVZFTEZOQlFVazdZMEZCUVN4alFVRkRMRXRCUVVzc1JVRkJSVHRCUVVOV0xHRkJRVWtzU1VGQlNTeERRVUZETEVsQlFVa3NTMEZCUnl4WlFVRlpMRVZCUVVVN1FVRkROVUlzWlVGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4TFFVRkxMRWxCUVVrc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dEJRVU5xUXl4bFFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSE8wRkJRMlFzWTBGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eERRVUZETzBGQlF6TkRMR05CUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFTkJRVU03V1VGRGFrUXNRMEZCUXp0QlFVTkdMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEZRVUZETzBGQlEycENMR3RDUVVGTExFVkJRVVVzU1VGQlNTeERRVUZETEV0QlFVczdRVUZEYWtJc1kwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0QlFVTnNRaXhqUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRVZCUTI1Q0xFTkJRVU1zUTBGQlF6dEJRVU5JTEdWQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRWUVVObU8xRkJRMFk3TzBGQlJVUXNUMEZCUlR0alFVRkJMR05CUVVjN1FVRkRTQ3hwUWtGQlVTeEpRVUZKTEVOQlFVTXNTVUZCU1R0QlFVTm1MR2RDUVVGTExGRkJRVkU3UVVGRFdDeHBRa0ZCU1N4RFFVRkRMRTlCUVU4c1JVRkJSU3hEUVVGRE96dEJRVVZtTEcxQ1FVRk5PMEZCUTFJc1owSkJRVXNzV1VGQldUdEJRVU5tTEdsQ1FVRkpMRU5CUVVNc1QwRkJUeXhGUVVGRkxFTkJRVU03UVVGRFppeHBRa0ZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSenRCUVVOa0xHZENRVUZETEVWQlFVVXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhGUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVOQlFVTTdRVUZETTBNc1owSkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVOQlFVTTdZMEZEYWtRc1EwRkJRenM3T3pzN08wRkJUVVlzYlVKQlFVMDdRVUZCUVN4VlFVTlVPMUZCUTBZN08wRkJTVVFzVlVGQlN6czdPenRqUVVGQkxHbENRVUZITzBGQlEwNHNZVUZCU1N4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRE8xRkJRMkk3TzBGQlEwUXNVMEZCU1R0alFVRkJMR2RDUVVGSE8wRkJRMHdzWVVGQlNTeERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRPMUZCUTJJN08wRkJRMFFzV1VGQlR6dGpRVUZCTEcxQ1FVRkhPMEZCUTFJc1lVRkJTU3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETzFGQlExZzdPMEZCVlVjc1ZVRkJTenM3T3pzN096czdXVUZJUVN4WlFVRkhPMEZCUTFZc1owSkJRVThzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TFFVRkxMRU5CUVVNN1VVRkRNVUk3V1VGRFVTeFZRVUZETEV0QlFVc3NSVUZCUlR0QlFVTm1MR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTNoQ0xHRkJRVWtzU1VGQlNTeERRVUZETEVsQlFVa3NTMEZCUnl4WlFVRlpMRVZCUVVVN1FVRkROVUlzWlVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNN1FVRkRha0lzYTBKQlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1MwRkJTenRCUVVOcVFpeGpRVUZETEVWQlFVVXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8wRkJRMnhDTEdOQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUlVGRGJrSXNRMEZCUXl4RFFVRkRPMVZCUTBvc1RVRkJUVHRCUVVOTUxHVkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFZRVU5vUXp0QlFVTkVMR0ZCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFJRVU5tT3p0QlFVOUVMRk5CUVVrN096czdPenM3TzJOQlFVRXNZMEZCUXl4TFFVRkxMRVZCUVVVN1FVRkRWaXhoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVONFFpeGhRVUZKTEVsQlFVa3NRMEZCUXl4SlFVRkpMRXRCUVVjc1dVRkJXU3hGUVVGRk8wRkJRelZDTEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRE8wRkJRMnBDTEd0Q1FVRkxMRVZCUVVVc1NVRkJTU3hEUVVGRExFdEJRVXM3UVVGRGFrSXNZMEZCUXl4RlFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6dEJRVU5zUWl4alFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVWQlEyNUNMRU5CUVVNc1EwRkJRenRWUVVOS0xFMUJRVTA3UVVGRFRDeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdWVUZEYUVNN1FVRkRSQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZEWmpzN1FVRk5SQ3hYUVVGTk96czdPenM3TzJOQlFVRXNaMEpCUVVNc1VVRkJVU3hGUVVGRk8wRkJRMllzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJRenRCUVVOcVFpeGhRVUZKTEZGQlFWRXNTMEZCUnl4TFFVRkxMRVZCUVVVN1FVRkRjRUlzWlVGQlNTeEpRVUZKTEVOQlFVTXNTVUZCU1N4TFFVRkhMRmxCUVZrc1JVRkJSVHRCUVVNMVFpeHBRa0ZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFVkJRVU03UVVGRGFrSXNiMEpCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zUzBGQlN6dEJRVU5xUWl4blFrRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0QlFVTnNRaXhuUWtGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhGUVVOdVFpeERRVUZETEVOQlFVTTdXVUZEU2l4TlFVRk5PMEZCUTB3c2FVSkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFpRVU5vUXp0VlFVTkdPMEZCUTBRc1lVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFGQlEyWTdPMEZCVFVRc1dVRkJUenM3T3pzN096dGpRVUZCTEdsQ1FVRkRMRkZCUVZFc1JVRkJSVHRCUVVOb1FpeGhRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRE8wRkJRMnhDTEdGQlFVa3NVVUZCVVN4TFFVRkhMRXRCUVVzc1JVRkJSVHRCUVVOd1FpeGxRVUZKTEVsQlFVa3NRMEZCUXl4SlFVRkpMRXRCUVVjc1dVRkJXU3hGUVVGRk8wRkJRelZDTEdsQ1FVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUlVGQlF6dEJRVU5xUWl4dlFrRkJTeXhGUVVGRkxFbEJRVWtzUTBGQlF5eExRVUZMTzBGQlEycENMR2RDUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTJ4Q0xHZENRVUZETEVWQlFVVXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFVkJRMjVDTEVOQlFVTXNRMEZCUXp0WlFVTktMRTFCUVUwN1FVRkRUQ3hwUWtGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFsQlEyaERPMVZCUTBZN1FVRkRSQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZEWmpzN096dFZRV2hPYTBJc1kwRkJZenRKUVVGVExGTkJRVk03TzJ0Q1FVRm9ReXhqUVVGakxFTTdPenM3T3p0QlExaHVReXhoUVVGWkxFTkJRVU03T3pzN096czdPenM3UVVGRllpeExRVUZKTEdOQlFXTXNSMEZCUnl4dFFrRkJUeXhEUVVGRExFVkJRVGhDTEVOQlFVTXNRMEZCUXpzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdTMEZuUTNoRExGVkJRVlU3UVVGRmJFSXNXVUZHVVN4VlFVRlZMRWRCUldZN01rSkJSa3NzVlVGQlZUczdRVUZKTTBJc1UwRkJTU3hQUVVGUExFZEJRVWNzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXpzN1FVRkZlRUlzVTBGQlNTeFJRVUZSTEVkQlFVYzdRVUZEWWl4aFFVRlJMRU5CUVVNc1IwRkJSeXhGUVVGRExFVkJRVVVzUTBGQlF6dEJRVU5vUWl4alFVRlRMRXRCUVVzN1FVRkRaQ3hoUVVGUkxFMUJRVTA3VFVGRFppeERRVUZET3p0QlFVVkdMR2REUVZwcFFpeFZRVUZWTERaRFFWbHlRaXhUUVVGVExFVkJRVU1zVDBGQlR5eEZRVUZETEZGQlFWRXNSVUZCUlRzN1FVRkZiRU1zVTBGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF6czdRVUZGYUVNc1UwRkJSeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEZOQlFWTXNSVUZCUXpzN1FVRkRla0lzVjBGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4aFFVRmhMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eFRRVUZUTEVOQlFVTTdRVUZEZEVRc1kwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eHRSVUZCYlVVc1EwRkJReXhEUVVGRE8wMUJRMjVHTzBGQlEwUXNVMEZCU1N4RFFVRkRMR05CUVdNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEdGQlFXRXNRMEZCUXp0QlFVTnNSQ3hUUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZKTEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1lVRkJZU3hIUVVGSkxGRkJRVkVzUjBGQlJ5eFJRVUZSTEVOQlFVTTdRVUZEYUVVc1UwRkJTU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzBGQlExb3NVMEZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE96dEJRVVZrTEZOQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVOQlFVTTdTVUZGYkVNN08yRkJNMEpyUWl4VlFVRlZPenRuUWtGQlZpeFZRVUZWTzBGQk5rSTNRaXhsUVVGVk8yTkJRVUVzYzBKQlFVYzdPMEZCUlZnc1lVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eFJRVUZSTEVOQlFVTXNZVUZCWVN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRemRETEdGQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXpzN1FVRkZkRU1zWVVGQlNTeERRVUZETEZkQlFWY3NSMEZCUnl4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEycEVMR0ZCUVVrc1EwRkJReXhYUVVGWExFTkJRVU1zVTBGQlV5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNN1FVRkRlRU1zWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF5eERRVUZETzFGQlF6VkRPenRCUVVWRUxHMUNRVUZqTzJOQlFVRXNNRUpCUVVjc1JVRkZhRUk3TzBGQlJVUXNiVUpCUVdNN1kwRkJRU3d3UWtGQlJ6dEJRVU5tTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJRenRCUVVNMVF5eGhRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1VVRkRaanM3UVVGRlJDeHJRa0ZCWVR0alFVRkJMSGxDUVVGSE8wRkJRMW9zWVVGQlNTeFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJReXhEUVVGRExFTkJRVU03UVVGRE4wSXNZVUZCU1N4VFFVRlRMRWRCUVVrc1NVRkJTU3hEUVVGRExFdEJRVXNzU1VGQlNTeEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVWNzUTBGQlF6dEJRVU40UkN4cFFrRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNVVUZCVVN4RlFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRE8wRkJRM2hETEdGQlFVa3NTVUZCU1N4RFFVRkRMR0ZCUVdFc1JVRkJSVHRCUVVOMFFpeGxRVUZKTEZOQlFWTXNSMEZCU1N4SlFVRkpMRU5CUVVNc1MwRkJTeXhKUVVGSkxFbEJRVWtzUTBGQlF5eGhRVUZoTEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJSeXhEUVVGRE8wRkJRMmhGTEcxQ1FVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFJRVUZSTEVWQlFVTXNVMEZCVXl4RFFVRkRMRU5CUVVNN1ZVRkRla003UVVGRFJDeGhRVUZKTEUxQlFVMHNSMEZCUnl4VFFVRlRMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eExRVUZMTEVOQlFVTTdRVUZETlVNc1pVRkJUU3hKUVVGSkxGVkJRVlVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRXRCUVVzc1EwRkJRenRCUVVNelF5eGxRVUZOTEVsQlFVa3NWMEZCVnl4SFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlF5eFJRVUZSTEVsQlFVVXNRMEZCUXl4SFFVRkRMRk5CUVZNc1EwRkJRenRCUVVONlJDeGxRVUZOTEVsQlFVa3NlVUpCUVhsQ0xFTkJRVU03UVVGRGNFTXNaVUZCVFN4SlFVRkpMSEZDUVVGeFFpeERRVUZETzBGQlEyaERMR1ZCUVUwc1NVRkJTU3gxUWtGQmRVSXNRMEZCUXp0QlFVTnNReXhsUVVGTkxFbEJRVWtzYlVKQlFXMUNMRU5CUVVNN1FVRkRPVUlzWlVGQlRTeEpRVUZKTEdGQlFXRXNRMEZCUXp0QlFVTjRRaXhsUVVGTkxFbEJRVWtzV1VGQldTeEhRVUZITEZGQlFWRXNSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRNVU1zWVVGQlNTeERRVUZETEZkQlFWY3NRMEZCUXl4TFFVRkxMRU5CUVVNc1QwRkJUeXhIUVVGSExFMUJRVTBzUTBGQlF6dEJRVU40UXl4aFFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VVVGRGFrSTdPMEZCUlVRc1YwRkJUVHRqUVVGQkxHdENRVUZITzBGQlExQXNZVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVVU3UVVGRFppeGxRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhsUVVGbExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRkRVFzWlVGQlNTeERRVUZETEZkQlFWY3NRMEZCUXl4TFFVRkxMRU5CUVVNc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRPMEZCUTJoRUxHVkJRVWtzUTBGQlF5eFhRVUZYTEVOQlFVTXNVMEZCVXl4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU03VlVGRGVrTXNUVUZCVFR0QlFVTk1MR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEdWQlFXVXNSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF6dEJRVU40UkN4bFFVRkpMRU5CUVVNc1YwRkJWeXhEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU03UVVGRGFFUXNaVUZCU1N4SlFVRkpMRU5CUVVNc1lVRkJZU3hGUVVGRk8wRkJRM1JDTEdsQ1FVRkpMRU5CUVVNc1YwRkJWeXhEUVVGRExGTkJRVk1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNZMEZCWXl4RFFVRkRPMWxCUTJ4RUxFMUJRVTA3UVVGRFRDeHBRa0ZCU1N4RFFVRkRMRmRCUVZjc1EwRkJReXhUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXp0WlFVTjZRenRWUVVOR08xRkJRMFk3TzBGQlZVY3NhMEpCUVdFN096czdPenM3V1VGS1FTeFpRVUZITzBGQlEyeENMR2RDUVVGUExFbEJRVWtzUTBGQlF5eGpRVUZqTEVOQlFVTTdVVUZETlVJN1dVRkZaMElzVlVGQlF5eEpRVUZKTEVWQlFVVTdRVUZEZEVJc1lVRkJTU3hKUVVGSkxFVkJRVVU3UVVGRFVpeGxRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRkZCUVZFc1EwRkJRenRWUVVOMFFpeE5RVUZOTzBGQlEwd3NaVUZCU1N4RFFVRkRMRWxCUVVrc1IwRkJSeXhSUVVGUkxFTkJRVU03VlVGRGRFSTdRVUZEUkN4aFFVRkpMRU5CUVVNc1kwRkJZeXhIUVVGSExFbEJRVWtzUTBGQlF6dEJRVU16UWl4aFFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VVVGRFpqczdRVUZYUnl4VFFVRkpPenM3T3pzN08xbEJTa0VzV1VGQlJ6dEJRVU5VTEdkQ1FVRlBMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU03VVVGRGJrSTdXVUZGVHl4VlFVRkRMRWxCUVVrc1JVRkJSVHRCUVVOaUxHRkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUTJ4Q0xHRkJRVWtzUTBGQlF5eGhRVUZoTEVWQlFVVXNRMEZCUXp0QlFVTnlRaXhoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZEWmpzN096dFZRWEJJYTBJc1ZVRkJWVHRKUVVGVExHTkJRV003TzJ0Q1FVRnFReXhWUVVGVkxFTTdPenM3T3p0QlEyeERMMElzWVVGQldTeERRVUZET3pzN096czdPenM3T3p0QlFVZGlMRXRCUVVrc1UwRkJVeXhIUVVGSExHMUNRVUZQTEVOQlFVTXNRMEZCYlVJc1EwRkJReXhEUVVGRE8wRkJRemRETEV0QlFVa3NUVUZCVFN4SFFVRkhMRzFDUVVGUExFTkJRVU1zUlVGQmMwSXNRMEZCUXl4RFFVRkRPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3TzB0QkswSjRRaXhYUVVGWE8wRkJSVzVDTEZsQlJsRXNWMEZCVnl4SFFVVm9RanN5UWtGR1N5eFhRVUZYT3p0QlFVazFRaXhUUVVGSkxFOUJRVThzUjBGQlJ5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPenRCUVVWNFFpeFRRVUZKTEZGQlFWRXNSMEZCUnp0QlFVTmlMR0ZCUVZFc1EwRkJReXhIUVVGSExFVkJRVU1zUlVGQlJTeERRVUZETzBGQlEyaENMSGRDUVVGdFFpeERRVUZETzBGQlEzQkNMR1ZCUVZVc1EwRkJReXhEUVVGRE8wMUJRMklzUTBGQlF6czdRVUZGUml4blEwRmFhVUlzVjBGQlZ5dzJRMEZaZEVJc1UwRkJVeXhGUVVGRExFOUJRVThzUlVGQlF5eFJRVUZSTEVWQlFVVTdPMEZCUld4RExGTkJRVWtzUTBGQlF5eFBRVUZQTEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTJ4Q0xGTkJRVWtzUTBGQlF5eG5Ra0ZCWjBJc1IwRkJSeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEdWQlFXVXNRMEZCUXp0QlFVTjBSQ3hUUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRE96dEJRVVZ1UXl4VFFVRkpMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03UVVGRFdpeFRRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1NVRkZaanM3WVVGeVFtdENMRmRCUVZjN08yZENRVUZZTEZkQlFWYzdRVUYxUWpsQ0xHVkJRVlU3WTBGQlFTeHpRa0ZCUnp0QlFVTllMR0ZCUVVrc1EwRkJReXhQUVVGUExFZEJRVWNzVVVGQlVTeERRVUZETEdGQlFXRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVNM1F5eGhRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdVVUZEZGtNN08wRkJSVVFzYlVKQlFXTTdZMEZCUVN3d1FrRkJSenM3UVVGRlppeGpRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFZEJRVU1zU1VGQlNTeERRVUZETEdkQ1FVRm5RaXhGUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEzaERMR1ZCUVVrc1UwRkJVeXhIUVVGSExGRkJRVkVzUTBGQlF5eGhRVUZoTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN08wRkJSUzlETEdWQlFVa3NUVUZCVFN4SFFVRkhMRWxCUVVrc1RVRkJUU3hEUVVGRExGTkJRVk1zUlVGQlJUdEJRVU12UWl4cFFrRkJTU3hGUVVGRkxGRkJRVkU3UVVGRFpDeHpRa0ZCVXl4RlFVRkZMRWxCUVVrc1JVRkRhRUlzUlVGQlJTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXpzN1FVRkZMMElzWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRE1VSXNaVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhYUVVGWExFTkJRVU1zVTBGQlV5eERRVUZETEVOQlFVTTdWVUZEY2tNN1VVRkZSanM3UVVGRlJDeHJRa0ZCWVR0alFVRkJMSGxDUVVGSE96dEJRVVZrTEdGQlFVa3NWMEZCVnl4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEdkQ1FVRm5RaXhEUVVGRE8wRkJRM0pFTEdGQlFVa3NXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU03TzBGQlJTOUNMR05CUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1owSkJRV2RDTEVWQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVN1FVRkRlRU1zWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eEZRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMVZCUTJ4RU8xRkJSVVk3TzBGQlJVUXNiVUpCUVdNN1kwRkJRU3d3UWtGQlJ6dEJRVU5tTEdOQlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUjBGQlF5eEpRVUZKTEVOQlFVTXNaMEpCUVdkQ0xFVkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVTdRVUZEZUVNc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF6dEJRVU55UXl4bFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMVZCUXpGQ08xRkJRMFk3TzBGQlJVUXNWMEZCVFR0alFVRkJMR2RDUVVGRExFdEJRVXNzUlVGQlJUdEJRVU5hTEdGQlFVa3NTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eExRVUZMTEVWQlFVVTdRVUZETjBJc1pVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0VlFVTndRaXhOUVVGTk8wRkJRMHdzWlVGQlNTeERRVUZETEZGQlFWRXNSVUZCUlN4RFFVRkRPMVZCUTJwQ096dEJRVUZCTEZGQlJVWTdPMEZCUlVRc1YwRkJUVHRqUVVGQkxHdENRVUZITzBGQlExQXNZMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEzUkRMR1ZCUVVrc1EwRkJReXhMUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVTdRVUZEYmtJc2FVSkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFsQlF5OUNMRTFCUVUwN1FVRkRUQ3hwUWtGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdXVUZEYUVNN1ZVRkRSanRSUVVOR096dEJRVTFFTEZkQlFVMDdPenM3T3pzN1kwRkJRU3huUWtGQlF5eExRVUZMTEVWQlFVVTdRVUZEV2l4aFFVRkpMRXRCUVVzc1NVRkJSU3hEUVVGRExFbEJRVWtzUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRk8wRkJRek5ETEdWQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1MwRkJTeXhEUVVGRE8wRkJRM0JDTEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTm9ReXhsUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdWVUZEWmp0UlFVTkdPenRCUVV0RUxHRkJRVkU3T3pzN096dGpRVUZCTEc5Q1FVRkhPMEZCUTFRc1lVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnFRaXhoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRGFFTXNZVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8xRkJRMlk3TzBGQlZVY3NiMEpCUVdVN1dVRlNRU3haUVVGSE8wRkJRM0JDTEdkQ1FVRlBMRWxCUVVrc1EwRkJReXhuUWtGQlowSXNRMEZCUXp0UlFVTTVRanM3T3pzN08xbEJUV3RDTEZWQlFVTXNUMEZCVHl4RlFVRkZPMEZCUXpOQ0xHRkJRVWtzUTBGQlF5eG5Ra0ZCWjBJc1IwRkJSeXhQUVVGUExFTkJRVU03UVVGRGFFTXNZMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEzUkRMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RlFVRkZMRU5CUVVNN1ZVRkRNMEk3UVVGRFJDeGhRVUZKTEVOQlFVTXNUMEZCVHl4SFFVRkhMRVZCUVVVc1EwRkJRenM3T3p0QlFVbHNRaXhoUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZGTEVOQlFVTTdRVUZEWWl4aFFVRkpMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU03VVVGRGRrSTdPenM3VlVGNlNHdENMRmRCUVZjN1NVRkJVeXhUUVVGVE96dHJRa0ZCTjBJc1YwRkJWeXhET3pzN096czdRVU51UTJoRExHRkJRVmtzUTBGQlF6czdPenM3T3pzN096dEJRVVZpTEV0QlFVa3NVMEZCVXl4SFFVRkhMRzFDUVVGUExFTkJRVU1zUTBGQmJVSXNRMEZCUXl4RFFVRkRPMEZCUXpkRExFdEJRVWtzU1VGQlNTeEhRVUZITEcxQ1FVRlBMRU5CUVVNc1JVRkJaMElzUTBGQlF5eERRVUZETzBGQlEzSkRMRXRCUVVrc1NVRkJTU3hIUVVGSExHMUNRVUZQTEVOQlFVTXNRMEZCWXl4RFFVRkRMRU5CUVVNN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3UzBGdFEyUXNUVUZCVFR0QlFVVmtMRmxCUmxFc1RVRkJUU3hIUVVWWU96SkNRVVpMTEUxQlFVMDdPMEZCU1haQ0xGTkJRVWtzVDBGQlR5eEhRVUZITEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN08wRkJSWGhDTEZOQlFVa3NVVUZCVVN4SFFVRkhPMEZCUTJJc1lVRkJVU3hEUVVGRExFVkJRVVVzUlVGQlF5eEZRVUZGTEVOQlFVTTdRVUZEWml4alFVRlRMRU5CUVVNN1FVRkRWaXhaUVVGUExFTkJRVU03UVVGRFVpeFpRVUZQTEV0QlFVczdRVUZEV2l4aFFVRlJMRU5CUVVNN1RVRkRWaXhEUVVGRE96dEJRVVZHTEdkRFFXUnBRaXhOUVVGTkxEWkRRV05xUWl4VFFVRlRMRVZCUVVNc1QwRkJUeXhGUVVGRExGRkJRVkVzUlVGQlJUczdRVUZGYkVNc1UwRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEpRVUZKTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFZEJRVWNzUlVGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRWRCUVVjc1JVRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVsQlFVa3NSVUZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZET3pzN096czdPMEZCVDI1SExGTkJRVWtzUTBGQlF5eGhRVUZoTEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUTNaQ0xGTkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4RFFVRkRPenRCUVVWb1FpeFRRVUZKTEVOQlFVTXNSMEZCUnl4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZET3p0QlFVVXpRaXhUUVVGSkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRE96dEJRVVV6UWl4VFFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRPenRCUVVVM1FpeFRRVUZKTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN1FVRkRXaXhUUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdTVUZGWmpzN1lVRnVRMnRDTEUxQlFVMDdPMmRDUVVGT0xFMUJRVTA3UVVGeFEzcENMR1ZCUVZVN1kwRkJRU3h6UWtGQlJ6dEJRVU5ZTEdGQlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTXZReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVsQlFVa3NSMEZCUnl4TlFVRk5MRU5CUVVNN08wRkJSVE5DTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNUVUZCVFN4RlFVRkZMR0ZCUVZrN1FVRkRha1FzWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1pVRkJaU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRPMEZCUTNSRUxHVkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXp0QlFVTTFReXhsUVVGSkxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4TFFVRkxMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVVU3UVVGRGNFTXNhVUpCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzVlVGQlZTeERRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRE5VTXNhVUpCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFpRVU5vUWp0VlFVTkdMRVZCUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTTdPMEZCUjJJc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhUUVVGVExFVkJRVVVzVjBGQlZTeERRVUZETEVWQlFVVTdRVUZEY2tRc1pVRkJTU3hEUVVGRExFTkJRVU1zUzBGQlN5eEhRVUZITEVWQlFVVXNTVUZCU1N4RFFVRkRMRU5CUVVNc1MwRkJTeXhIUVVGSExFVkJRVVVzUlVGQlJUdEJRVU5xUXl4cFFrRkJTU3hEUVVGRExFTkJRVU1zUzBGQlN5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRU5CUVVNc1MwRkJTeXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEVOQlFVTXNTMEZCU3l4TFFVRkxMRU5CUVVNc1JVRkJSVHRCUVVONFJDeG5Ra0ZCUXl4RFFVRkRMR05CUVdNc1JVRkJSU3hEUVVGRE8yTkJRMjVDTzFsQlEwUTdRVUZEUkN4bFFVRkpMRU5CUVVNc1EwRkJReXhMUVVGTExFdEJRVWNzUlVGQlJTeEZRVUZGTzBGQlEycENMR2xDUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTJ4Q0xHbENRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETzBGQlEyaERMR2xDUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGREwwSXNhVUpCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFpRVU5vUWp0VlFVTkdMRVZCUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTTdPMEZCUldJc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8xRkJSWFpET3p0QlFVVkVMR3RDUVVGaE8yTkJRVUVzZVVKQlFVYzdPMEZCUldRc1lVRkJTU3hEUVVGRExHRkJRV0VzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPenRCUVVWMFJDeGhRVUZKTEUxQlFVMHNSMEZCUnl4VFFVRlRMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eExRVUZMTEVOQlFVTTdRVUZETlVNc1pVRkJUU3hKUVVGSkxGVkJRVlVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRXRCUVVzc1EwRkJRenRCUVVNelF5eGxRVUZOTEVsQlFVa3NORUpCUVRSQ0xFTkJRVU03UVVGRGRrTXNaVUZCVFN4SlFVRkpMR05CUVdNc1EwRkJRenRCUVVONlFpeGxRVUZOTEVsQlFVa3NjVUpCUVhGQ0xFTkJRVU03UVVGRGFFTXNaVUZCVFN4SlFVRkpMRzFDUVVGdFFpeERRVUZETzBGQlF6bENMR1ZCUVUwc1NVRkJTU3haUVVGWkxFZEJRVWNzU1VGQlNTeERRVUZETEdGQlFXRXNSMEZCUXl4RFFVRkRMRWRCUVVjc1MwRkJTeXhEUVVGRE96dEJRVVYwUkN4bFFVRk5MRWxCUVVrc1pVRkJaU3hEUVVGRE8wRkJRekZDTEdWQlFVMHNTVUZCU1N4blFrRkJaMElzUTBGQlF6dEJRVU16UWl4bFFVRk5MRWxCUVVrc1YwRkJWeXhIUVVGRExFbEJRVWtzUTBGQlF5eGhRVUZoTEVkQlFVTXNRMEZCUXl4SFFVRkRMRXRCUVVzc1IwRkJReXhKUVVGSkxFTkJRVU1zWVVGQllTeEhRVUZETEVOQlFVTXNSMEZCUXl4TFFVRkxMRU5CUVVNN1FVRkROVVVzWlVGQlRTeEpRVUZKTEhsQ1FVRjVRaXhEUVVGRE8wRkJRM0JETEdWQlFVMHNTVUZCU1N4dFFrRkJiVUlzUTBGQlF6dEJRVU01UWl4bFFVRk5MRWxCUVVrc2MwSkJRWE5DTEVOQlFVTTdRVUZEYWtNc1pVRkJUU3hKUVVGSkxIbENRVUY1UWl4RFFVRkRPMEZCUTNCRExHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1NVRkJTU3hOUVVGTkxFTkJRVU03T3pzN08wRkJTM0pETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTTdVVUZGYWtNN08wRkJSVVFzYlVKQlFXTTdZMEZCUVN3d1FrRkJSenRCUVVOaUxHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMR1ZCUVdVc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXp0QlFVTjBSQ3hoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTTdVVUZETDBNN08wRkJSVVFzVjBGQlRUdGpRVUZCTEd0Q1FVRkhPenRCUVVWUUxHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUXl4SlFVRkpMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU03VVVGRmFFVTdPMEZCUlVRc1ZVRkJTenRqUVVGQkxHbENRVUZITzBGQlEwNHNZVUZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhMUVVGTExFTkJRVU03UVVGRGRFSXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETzBGQlF6bENMR0ZCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXp0QlFVTjRRaXhoUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEVWQlFVVXNRMEZCUXl4RlFVRkZMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTTdRVUZEYmtNc1lVRkJTU3hEUVVGRExGbEJRVmtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkZMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVVc1EwRkJRenRCUVVNM1JDeG5Ra0ZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdVVUZEYUVNN08wRkJSVVFzVTBGQlNUdGpRVUZCTEdkQ1FVRkhPMEZCUTB3c1lVRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTTdRVUZEY2tJc1lVRkJTU3hKUVVGSkxFTkJRVU1zVDBGQlR5eEZRVUZGT3p0QlFVVm9RaXhsUVVGSkxGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExFdEJRVTBzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUlN4SlFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4RlFVRkZMRWxCUVVrc1EwRkJSU3hIUVVGSExFZEJRVWNzUTBGQlJTeEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnFTaXhsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEZGQlFWRXNRMEZCUXpzN1FVRkZlRUlzWlVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMEZCUTFvc1pVRkJTU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNSVUZCUlR0QlFVTjJRaXhwUWtGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFsQlEyaERPMVZCUlVnN1VVRkRSRHM3UVVGRlJDeFpRVUZQTzJOQlFVRXNiVUpCUVVjN1FVRkRVaXhoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUlR0QlFVTnNRaXhsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZGQlFWRXNSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRhRU1zWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRVZCUVVVc1EwRkJRenRCUVVOeVFpeGxRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMR2xDUVVGcFFpeERRVUZETEVOQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTTNSQ3hsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4bFFVRmxMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZEZUVRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUzBGQlN5eERRVUZETzFWQlF6VkRMRTFCUVUwN1FVRkRUQ3h0UWtGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVVc1EwRkJRenRWUVVOMlFqdFJRVU5HT3p0QlFVOUVMRk5CUVVrN096czdPenM3TzJOQlFVRXNZMEZCUXl4WFFVRlhMRVZCUVVVN096dEJRVU5vUWl4aFFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGSExGZEJRVmNzUTBGQlF5eEhRVUZITEVOQlFVTTdRVUZETTBJc1lVRkJTU3hEUVVGRExFZEJRVWNzUjBGQlJ5eFhRVUZYTEVOQlFVTXNSMEZCUnl4RFFVRkRPMEZCUXpOQ0xHRkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NWMEZCVnl4RFFVRkRMRWxCUVVrc1EwRkJRenRCUVVNM1FpeHZRa0ZCVnl4RFFVRkRMRVZCUVVVc1EwRkJReXhSUVVGUkxFVkJRVU1zVlVGQlF5eERRVUZETEVWQlFVczdRVUZETjBJc2FVSkJRVXNzWVVGQllTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMVZCUTNaQ0xFTkJRVU1zUTBGQlF6dEJRVU5JTEdGQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1VVRkJVU3hGUVVGRExGVkJRVU1zUTBGQlF5eEZRVUZMTzBGQlEzUkNMSE5DUVVGWExFTkJRVU1zUzBGQlN5eEhRVUZITEVOQlFVTXNRMEZCUXp0VlFVTjJRaXhEUVVGRExFTkJRVU03UVVGRFNDeGhRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRmRCUVZjc1EwRkJReXhMUVVGTExFTkJRVU03T3pzN096czdPenRSUVZOb1F6czdRVUZGUkN4clFrRkJZVHRqUVVGQkxIVkNRVUZETEVOQlFVTXNSVUZCUlR0QlFVTm1MR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTNSQ0xHRkJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0UlFVTm1PenRCUVZWSExGVkJRVXM3T3pzN096czdPMWxCU0VFc1dVRkJSenRCUVVOV0xHZENRVUZQTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRE8xRkJRekZDTzFsQlExRXNWVUZCUXl4RFFVRkRMRVZCUVVVN1FVRkRXQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOMFFpeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZETDBJc1lVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFGQlEyWTdPMEZCVlVjc1VVRkJSenM3T3pzN096czdXVUZJUVN4WlFVRkhPMEZCUTFJc1owSkJRVThzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SFFVRkhMRU5CUVVNN1VVRkRlRUk3V1VGRFRTeFZRVUZETEVOQlFVTXNSVUZCUlR0QlFVTlVMR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTnlRanM3UVVGVlJ5eFJRVUZIT3pzN096czdPenRaUVVoQkxGbEJRVWM3UVVGRFVpeG5Ra0ZCVHl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF6dFJRVU40UWp0WlFVTk5MRlZCUVVNc1EwRkJReXhGUVVGRk8wRkJRMVFzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRM0pDT3p0QlFWVkhMRk5CUVVrN096czdPenM3TzFsQlNFRXNXVUZCUnp0QlFVTlVMR2RDUVVGUExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRPMUZCUTNwQ08xbEJRMDhzVlVGQlF5eERRVUZETEVWQlFVVTdRVUZEVml4aFFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZEZEVJN096czdWVUV2VG10Q0xFMUJRVTA3U1VGQlV5eFRRVUZUT3p0clFrRkJlRUlzVFVGQlRTeERPenM3T3pzN1FVTjJRek5DTEdGQlFWa3NRMEZCUXpzN096czdPenM3T3p0QlFVVmlMRXRCUVVrc1UwRkJVeXhIUVVGSExHMUNRVUZQTEVOQlFVTXNRMEZCYlVJc1EwRkJReXhEUVVGRE96czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPMHRCWjBONFFpeE5RVUZOTzBGQlJXUXNXVUZHVVN4TlFVRk5MRWRCUlZnN01rSkJSa3NzVFVGQlRUczdRVUZKZGtJc1UwRkJTU3hQUVVGUExFZEJRVWNzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXpzN1FVRkZlRUlzVTBGQlNTeFJRVUZSTEVkQlFVYzdRVUZEV2l4aFFVRlJMRU5CUVVNc1IwRkJSeXhGUVVGRExFVkJRVVVzUTBGQlF6dEJRVU5vUWl4blFrRkJWeXhEUVVGRExGTkJRVk1zUlVGQlF5eFRRVUZUTEVOQlFVTTdUVUZEYkVNc1EwRkJRenM3UVVGRlJpeG5RMEZZYVVJc1RVRkJUU3cyUTBGWGFrSXNVMEZCVXl4RlFVRkRMRTlCUVU4c1JVRkJReXhSUVVGUkxFVkJRVVU3TzBGQlJXeERMRk5CUVVrc1EwRkJReXhqUVVGakxFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEZWtJc1UwRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eExRVUZMTEVOQlFVTTdPMEZCUlhCQ0xGTkJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhQUVVGUExFTkJRVU03TzBGQlJYUkRMRk5CUVVrc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dEJRVU5hTEZOQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRKUVVWbU96dGhRWEpDYTBJc1RVRkJUVHM3WjBKQlFVNHNUVUZCVFR0QlFYVkNla0lzWlVGQlZUdGpRVUZCTEhOQ1FVRkhPMEZCUTFnc1lVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eFJRVUZSTEVOQlFVTXNZVUZCWVN4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8wRkJRMmhFTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU03UVVGRGFrUXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zVDBGQlR5eEhRVUZITEUxQlFVMHNRMEZCUXp0QlFVTndReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4VFFVRlRMRWRCUVVjc1RVRkJUU3hEUVVGRE8wRkJRM1JETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkRMRWxCUVVrc1EwRkJRenRCUVVNelF5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUXl4SlFVRkpMRU5CUVVNN08wRkJSVGRETEdGQlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN08wRkJSVEZETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNVVUZCVVN4RlFVRkZMRWxCUVVrc1EwRkJReXhYUVVGWExFTkJRVU1zUTBGQlF6czdRVUZGTVVRc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8xRkJSWFpET3p0QlFVVkVMRzlDUVVGbE8yTkJRVUVzTWtKQlFVY3NSVUZGYWtJN08wRkJSVVFzYlVKQlFXTTdZMEZCUVN3d1FrRkJSenM3UVVGRlppeGhRVUZKTEVOQlFVTXNZVUZCWVN4RlFVRkZMRU5CUVVNN1VVRkZkRUk3TzBGQlJVUXNiVUpCUVdNN1kwRkJRU3d3UWtGQlJ6dEJRVU5tTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExHVkJRV1VzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJRenRCUVVOMFJDeGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkROVU1zWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hIUVVGSExGbEJRVmtzUjBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmRCUVZjc1EwRkJRenRSUVVOc1JUczdRVUZGUkN4WFFVRk5PMk5CUVVFc2EwSkJRVWM3TzBGQlJWQXNZVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXp0QlFVTndSU3hoUVVGSkxFTkJRVU1zWTBGQll5eEhRVUZITEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1lVRkJZU3hEUVVGRE8wRkJRMnBFTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRE8wRkJRMnBDTEdkQ1FVRkxMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTA3UVVGRGJFSXNaMEpCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zWTBGQll6dFZRVU16UWl4RFFVRkRMRU5CUVVNN1VVRkZTanM3UVVGRlJDeFZRVUZMTzJOQlFVRXNhVUpCUVVjc1JVRkZVRHM3UVVGRlJDeFRRVUZKTzJOQlFVRXNaMEpCUVVjc1JVRkZUanM3UVVGRlJDeFpRVUZQTzJOQlFVRXNiVUpCUVVjc1JVRkZWRHM3UVVGUFJDeHJRa0ZCWVRzN096czdPenRqUVVGQkxIVkNRVUZETEU5QlFVOHNSVUZCUlRzN096czdPenM3T3pzN096dEJRV055UWl4aFFVRkpMRTlCUVU4c1JVRkJSVHRCUVVOWUxHVkJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NUMEZCVHl4RFFVRkRPMVZCUTNwQ096dEJRVVZFTEdOQlFVa3NTVUZCU1N4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMEZCUTNCRUxHVkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xVkJRM2hDT3p0QlFVVkVMR05CUVVrc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFMUJRVTBzUlVGQlF5eERRVUZETEVWQlFVVXNSVUZCUlR0QlFVTjBReXhsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFWQlF6TkVPMUZCUlVZN08wRkJWMGNzVlVGQlN6czdPenM3T3pzN1dVRklRU3haUVVGSE8wRkJRMVlzWjBKQlFVOHNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJRenRSUVVOd1FqdFpRVU5STEZWQlFVTXNRMEZCUXl4RlFVRkZPMEZCUTFnc1lVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTTdRVUZEYUVJc1kwRkJTU3hKUVVGSkxFTkJRVU1zUjBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSVHRCUVVNM1F5eGxRVUZKTEVOQlFVTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRVZCUVVVN1FVRkRkRU1zYVVKQlFVa3NRMEZCUXl4aFFVRmhMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRM1pDTEcxQ1FVRk5PMWxCUTFBN1ZVRkRSanRSUVVOR096dEJRVmRITEd0Q1FVRmhPenM3T3pzN096dFpRVWhCTEZsQlFVYzdRVUZEYkVJc1owSkJRVThzU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUXp0UlFVTTFRanRaUVVOblFpeFZRVUZETEVOQlFVTXNSVUZCUlR0QlFVTnVRaXhoUVVGSkxFTkJRVU1zWTBGQll5eEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTjRRaXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEdGQlFXRXNSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRMMElzWVVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMUZCUTJZN08wRkJSVVFzYTBKQlFXRTdZMEZCUVN4NVFrRkJSenRCUVVOa0xHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNiVUpCUVcxQ0xFTkJRVU1zVVVGQlVTeEZRVUZGTEVsQlFVa3NRMEZCUXl4WFFVRlhMRU5CUVVNc1EwRkJRenRSUVVNNVJEczdPenRWUVc1S2EwSXNUVUZCVFR0SlFVRlRMRk5CUVZNN08ydENRVUY0UWl4TlFVRk5MRU03T3pzN096dEJRMnhETTBJc1lVRkJXU3hEUVVGRE96czdPenM3T3pzN096czdRVUZGWWl4TFFVRkpMRWRCUVVjc1IwRkJSeXh0UWtGQlR5eERRVUZETEVOQlFXRXNRMEZCUXl4RFFVRkRPMEZCUTJwRExFdEJRVWtzU1VGQlNTeEhRVUZITEcxQ1FVRlBMRU5CUVVNc1EwRkJZeXhEUVVGRExFTkJRVU03UVVGRGJrTXNTMEZCU1N4VFFVRlRMRWRCUVVjc2JVSkJRVThzUTBGQlF5eERRVUZ0UWl4RFFVRkRMRU5CUVVNN1FVRkROME1zUzBGQlNTeEpRVUZKTEVkQlFVY3NiVUpCUVU4c1EwRkJReXhGUVVGblFpeERRVUZETEVOQlFVTTdPMHRCUTNwQ0xGZEJRVmNzSzBOQlFVMHNSVUZCY1VJN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdTMEYzUXpkQ0xFbEJRVWs3UVVGRldpeFpRVVpSTEVsQlFVa3NSMEZGVkRzeVFrRkdTeXhKUVVGSk96dEJRVWx5UWl4VFFVRkpMRTlCUVU4c1IwRkJSeXhEUVVGRExFdEJRVXNzUlVGQlF5eExRVUZMTEVWQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN08wRkJSWEJETEZOQlFVa3NVVUZCVVN4SFFVRkhPMEZCUTJJc1lVRkJVU3hEUVVGRExFVkJRVVVzUlVGQlF5eEZRVUZGTEVOQlFVTTdRVUZEWml4dlFrRkJaU3hSUVVGUk8wRkJRM1pDTEdGQlFWRXNWVUZCVlR0QlFVTnNRaXhaUVVGUExFTkJRVU03UVVGRFVpeFpRVUZQTEVOQlFVTTdRVUZEVWl4aFFVRlJMRU5CUVVNN1FVRkRWQ3hqUVVGVExFTkJRVU03VFVGRFdDeERRVUZET3p0QlFVVkdMR2REUVdoQ2FVSXNTVUZCU1N3MlEwRm5RbVlzVTBGQlV5eEZRVUZETEU5QlFVOHNSVUZCUXl4UlFVRlJMRVZCUVVVN08wRkJSV3hETEZOQlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eFhRVUZYTEVOQlFVTTdPMEZCUlRkRExGTkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NTVUZCU1N4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eEhRVUZITEVWQlFVVXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhIUVVGSExFVkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRVZCUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXpzN1FVRkZkRWNzVTBGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4SlFVRkpMRmRCUVZjc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRVZCUVVNc1NVRkJTU3hEUVVGRExGZEJRVmNzUlVGQlF5eERRVUZETEVOQlFVTXNSVUZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03TzBGQlJUTkhMRk5CUVVrc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6czdRVUZGV2l4VFFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTMEZCU3l4RFFVRkRPenRCUVVVdlFpeFRRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXpzN1FVRkZOME1zVTBGQlNTeERRVUZETEdGQlFXRXNSMEZCUnl4TFFVRkxMRU5CUVVNN08wRkJSVE5DTEZOQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0SlFVVm9RenM3WVVGc1EydENMRWxCUVVrN08yZENRVUZLTEVsQlFVazdRVUZ2UTNaQ0xHMUNRVUZqTzJOQlFVRXNNRUpCUVVjN08wRkJSV1lzWVVGQlNTeERRVUZETEZWQlFWVXNSMEZCUnl4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzBGQlEzWkRMR0ZCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUjBGQlJ5eERRVUZETEUxQlFVMHNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRCUVVOc1F5eGhRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdRVUZEYWtNc1lVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRMnhETEdGQlFVa3NRMEZCUXl4VlFVRlZMRWRCUVVjc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTnlReXhoUVVGSkxFTkJRVU1zVjBGQlZ5eEhRVUZITEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRGRFTXNZVUZCU1N4RFFVRkRMRlZCUVZVc1IwRkJSeXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPenRCUVVWeVF5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTTdRVUZETVVNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRM1JETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTjJReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03UVVGRE1VTXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhYUVVGWExFTkJRVU1zU1VGQlNTeERRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRPMEZCUXpORExHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNWMEZCVnl4RFFVRkRMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF6dEJRVU14UXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkZkRU03TzBGQlIwUXNhMEpCUVdFN1kwRkJRU3g1UWtGQlJ6czdRVUZGWkN4aFFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03TzBGQlJYSkVMR0ZCUVVrc1RVRkJUU3hIUVVGSE8wRkJRMWdzV1VGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVNc1EwRkJRenRCUVVObUxGbEJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNN1ZVRkRha0lzUTBGQlF6czdRVUZGUml4aFFVRkpMRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZET3p0QlFVVm9SQ3hoUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6ZERMR0ZCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUlN4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRE4wTXNZVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhaUVVGWkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEZGQlFWRXNSMEZCUXl4RFFVRkRMRWRCUVVNc1VVRkJVU3hIUVVGRExFVkJRVVVzUTBGQlF5eERRVUZET3p0QlFVVXhSQ3hoUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlEzaERMR0ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUlN4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGVFTXNZVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhaUVVGWkxFTkJRVU1zUjBGQlJ5eEZRVUZGTEZGQlFWRXNSMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenM3UVVGRk1VTXNZVUZCU1N4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6czdRVUZGZGtJc1lVRkJTU3haUVVGWkxFZEJRVWM3UVVGRGFrSXNaMEpCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZETEVkQlFVYzdRVUZEYkVJc1kwRkJSeXhGUVVGRkxFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVVXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFVkJRVU1zUTBGQlF5eEZRVUZETEVkQlFVY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGRExFZEJRVWNzUlVGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4SFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGSExFbEJRVWtzUTBGQlF5eEZRVUZGTEVkQlFVTXNSMEZCUnl4RlFVRkZMRWxCUVVrc1EwRkJReXhGUVVGRkxFZEJRVU1zUjBGQlJ5eERRVUZGTzFWQlF6ZEdMRU5CUVVNN1FVRkRSaXhoUVVGSkxHRkJRV0VzUjBGQlJ6dEJRVU5zUWl4blFrRkJTeXhGUVVGRkxFbEJRVWtzUTBGQlF5eEZRVUZGTEVkQlFVTXNSMEZCUnp0QlFVTnNRaXhqUVVGSExFVkJRVVVzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUlN4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUlVGQlF5eEhRVUZITEVWQlFVTXNRMEZCUXl4RlFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFZEJRVU1zUjBGQlJ5eEZRVUZETEVsQlFVa3NRMEZCUXl4RlFVRkZMRWRCUVVNc1IwRkJSeXhEUVVGRExFVkJRVWNzU1VGQlNTeERRVUZETEVWQlFVVXNSMEZCUXl4SFFVRkhMRVZCUVVVc1NVRkJTU3hEUVVGRExFVkJRVVVzUjBGQlF5eEhRVUZITEVOQlFVVTdWVUZETjBZc1EwRkJRenM3UVVGRlJpeGhRVUZKTEZWQlFWVXNSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNc1JVRkJSU3hSUVVGUkxFZEJRVU1zUTBGQlF5eEhRVUZETEZGQlFWRXNSMEZCUXl4RlFVRkZMRVZCUVVVc1dVRkJXU3hEUVVGRExFdEJRVXNzUlVGQlJTeFpRVUZaTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRNMGNzWVVGQlNTeFhRVUZYTEVkQlFVY3NSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEZRVUZGTEUxQlFVMHNRMEZCUXl4RFFVRkRMRVZCUVVVc1VVRkJVU3hIUVVGRExFTkJRVU1zUjBGQlF5eFJRVUZSTEVkQlFVTXNSVUZCUlN4RlFVRkZMR0ZCUVdFc1EwRkJReXhMUVVGTExFVkJRVVVzWVVGQllTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPenRCUVVVNVJ5eGhRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmxCUVZrc1EwRkJReXhIUVVGSExFVkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTTdRVUZEZWtNc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVOQlFVTXNZMEZCWXl4RlFVRkZMRkZCUVZFc1IwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dEJRVU4wUkN4aFFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eE5RVUZOTEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNN08wRkJSWHBETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFZEJRVWNzUlVGQlF5eFhRVUZYTEVOQlFVTXNRMEZCUXp0QlFVTXpReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4alFVRmpMRVZCUVVVc1VVRkJVU3hIUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETzBGQlEzWkVMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUlN4TlFVRk5MRU5CUVVNc1EwRkJRenM3UVVGRk1VTXNiVUpCUVZVc1NVRkJTU3hMUVVGTExFZEJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUXl4SFFVRkhMRWRCUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF6czdRVUZGTVVNc1lVRkJTU3hEUVVGRExGVkJRVlVzUTBGQlF5eFpRVUZaTEVOQlFVTXNSMEZCUnl4RlFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRE8wRkJRemRETEdGQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1dVRkJXU3hEUVVGRExHTkJRV01zUlVGQlJTeExRVUZMTEVOQlFVTXNRMEZCUXpzN1FVRkZjRVFzYjBKQlFWY3NTVUZCU1N4TFFVRkxMRWRCUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUjBGQlF5eEhRVUZITEVkQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJRenM3UVVGRk0wTXNZVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJReXhaUVVGWkxFTkJRVU1zUjBGQlJ5eEZRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRPMEZCUXk5RExHRkJRVWtzUTBGQlF5eFhRVUZYTEVOQlFVTXNXVUZCV1N4RFFVRkRMR05CUVdNc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6czdRVUZGY2tRc1lVRkJTU3hWUVVGVkxHRkJRVU03UVVGRFppeGhRVUZKTEV0QlFVc3NSMEZCUnl4SFFVRkhMRVZCUVVVN1FVRkRaaXh4UWtGQlZTeEhRVUZITEZsQlFWa3NRMEZCUXl4SFFVRkhMRU5CUVVNN1ZVRkRMMElzVFVGQlRUdEJRVU5NTEhGQ1FVRlZMRWRCUVVjc1lVRkJZU3hEUVVGRExFZEJRVWNzUTBGQlF6dFZRVU5vUXpzN1FVRkZSQ3hoUVVGSkxGVkJRVlVzUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zVlVGQlZTeERRVUZETEVsQlFVa3NVVUZCVVN4SFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wRkJRMmhGTEdGQlFVa3NWVUZCVlN4SFFVRkhMRTFCUVUwc1EwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4VlFVRlZMRU5CUVVNc1NVRkJTU3hSUVVGUkxFZEJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN08wRkJSWEpGTEdGQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1dVRkJXU3hEUVVGRExFZEJRVWNzUlVGQlF5eEpRVUZKTEVkQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1IwRkJReXhIUVVGSExFZEJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUXl4TFFVRkxMRWRCUVVNc1ZVRkJWU3hIUVVGRExFZEJRVWNzUjBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXp0QlFVTTNSaXhoUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEZsQlFWa3NRMEZCUXl4alFVRmpMRVZCUVVVc1VVRkJVU3hIUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETzFGQlJUTkVPenRCUVVWRUxHMUNRVUZqTzJOQlFVRXNNRUpCUVVjN1FVRkRaaXhoUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0QlFVTjJSQ3hoUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTndSQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTjJSQ3hoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTjRSQ3hoUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTjZSQ3hoUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTXhSQ3hoUVVGSkxFTkJRVU1zVlVGQlZTeERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0UlFVVTFSRHM3UVVGRlJDeFhRVUZOTzJOQlFVRXNhMEpCUVVjN1FVRkRVQ3hoUVVGSkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRlZCUVZVc1EwRkJRenM3UVVGRmJrTXNZVUZCU1N4TlFVRk5MRWRCUVVjN1FVRkRXQ3haUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUXl4RFFVRkRPMEZCUTJZc1dVRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVTXNRMEZCUXp0VlFVTnFRaXhEUVVGRE96dEJRVVZHTEdGQlFVa3NVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03TzBGQlJXaEVMR0ZCUVVrc1dVRkJXU3hIUVVGSE8wRkJRMnBDTEdkQ1FVRkxMRVZCUVVVc1NVRkJTU3hEUVVGRExFVkJRVVVzUjBGQlF5eEhRVUZITzBGQlEyeENMR05CUVVjc1JVRkJSU3hKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1MwRkJTeXhGUVVGRExFTkJRVU1zUlVGQlF5eEhRVUZITEVWQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1IwRkJReXhIUVVGSExFVkJRVU1zU1VGQlNTeERRVUZETEVWQlFVVXNSMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSeXhKUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZETEVkQlFVY3NSVUZCUlN4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGRExFZEJRVWNzUTBGQlJUdFZRVU0zUml4RFFVRkRPMEZCUTBZc1lVRkJTU3hoUVVGaExFZEJRVWM3UVVGRGJFSXNaMEpCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZGTEVkQlFVYzdRVUZEYmtJc1kwRkJSeXhGUVVGRkxFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVVXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFVkJRVU1zUjBGQlJ5eEZRVUZETEVOQlFVTXNSVUZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGRExFZEJRVWNzUlVGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4SFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGSExFbEJRVWtzUTBGQlF5eEZRVUZGTEVkQlFVTXNSMEZCUnl4RlFVRkZMRWxCUVVrc1EwRkJReXhGUVVGRkxFZEJRVU1zUjBGQlJ5eERRVUZGTzFWQlF6ZEdMRU5CUVVNN08wRkJSVVlzWVVGQlNTeFZRVUZWTEVkQlFVY3NSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEZRVUZGTEUxQlFVMHNRMEZCUXl4RFFVRkRMRVZCUVVVc1VVRkJVU3hIUVVGRExFTkJRVU1zUjBGQlF5eFJRVUZSTEVkQlFVTXNSVUZCUlN4RlFVRkZMRmxCUVZrc1EwRkJReXhMUVVGTExFVkJRVVVzV1VGQldTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUXpOSExHRkJRVWtzVjBGQlZ5eEhRVUZITEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUlVGQlJTeE5RVUZOTEVOQlFVTXNRMEZCUXl4RlFVRkZMRkZCUVZFc1IwRkJReXhEUVVGRExFZEJRVU1zVVVGQlVTeEhRVUZETEVWQlFVVXNSVUZCUlN4aFFVRmhMRU5CUVVNc1MwRkJTeXhGUVVGRkxHRkJRV0VzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXpzN1FVRkZPVWNzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4WlFVRlpMRU5CUVVNc1IwRkJSeXhGUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETzBGQlEzcERMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEVkQlFVY3NSVUZCUXl4WFFVRlhMRU5CUVVNc1EwRkJRenM3UVVGSE0wTXNiVUpCUVZVc1NVRkJTU3hMUVVGTExFZEJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUXl4SFFVRkhMRWRCUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF6czdRVUZGTVVNc1lVRkJTU3hEUVVGRExGVkJRVlVzUTBGQlF5eFpRVUZaTEVOQlFVTXNSMEZCUnl4RlFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRE96dEJRVVUzUXl4dlFrRkJWeXhKUVVGSkxFdEJRVXNzUjBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SFFVRkRMRWRCUVVjc1IwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZET3p0QlFVVXpReXhoUVVGSkxFTkJRVU1zVjBGQlZ5eERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVNc1YwRkJWeXhEUVVGRExFTkJRVU03TzBGQlJTOURMR0ZCUVVrc1ZVRkJWU3hoUVVGRE8wRkJRMllzWVVGQlNTeExRVUZMTEVsQlFVa3NSMEZCUnl4RlFVRkZPMEZCUTJoQ0xIRkNRVUZWTEVkQlFVY3NXVUZCV1N4RFFVRkRMRWRCUVVjc1EwRkJRenRWUVVNdlFpeE5RVUZOTzBGQlEwd3NjVUpCUVZVc1IwRkJSeXhoUVVGaExFTkJRVU1zUjBGQlJ5eERRVUZETzFWQlEyaERPenRCUVVWRUxHRkJRVWtzVlVGQlZTeEhRVUZITEUxQlFVMHNRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFZRVUZWTEVOQlFVTXNTVUZCU1N4UlFVRlJMRWRCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGFFVXNZVUZCU1N4VlFVRlZMRWRCUVVjc1RVRkJUU3hEUVVGRExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRlZCUVZVc1EwRkJReXhKUVVGSkxGRkJRVkVzUjBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenM3UVVGRmNrVXNZVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhaUVVGWkxFTkJRVU1zUjBGQlJ5eEZRVUZETEVsQlFVa3NSMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhIUVVGRExFZEJRVWNzUjBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SFFVRkRMRXRCUVVzc1IwRkJReXhWUVVGVkxFZEJRVU1zUjBGQlJ5eEhRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRPMUZCUlRsR096dEJRVWRFTEZWQlFVczdZMEZCUVN4cFFrRkJSenRCUVVOT0xHRkJRVWtzU1VGQlNTeERRVUZETEVsQlFVa3NTMEZCUnl4VlFVRlZMRVZCUVVVN1FVRkRNVUlzWlVGQlNTeERRVUZETEdGQlFXRXNSMEZCUnl4TFFVRkxMRU5CUVVNN1ZVRkROVUk3UVVGRFJDeGhRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETzBGQlEyeERMR0ZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1ZVRkJWU3hEUVVGRE8wRkJRemRETEdGQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRSUVVOYU96dEJRVVZHTEZOQlFVazdZMEZCUVN4blFrRkJSenRCUVVOTUxHRkJRVWtzU1VGQlNTeERRVUZETEU5QlFVOHNSVUZCUlRzN1FVRkZhRUlzWlVGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZET3p0QlFVVnFReXhsUVVGSkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1IwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZETEVOQlFVTXNRMEZCUXpzN1FVRkZNVU1zWlVGQlNTeExRVUZMTEVkQlFVY3NRMEZCUXl4RlFVRkhPMEZCUVVVc2EwSkJRVXNzU1VGQlN5eEpRVUZKTEVOQlFVTXNSVUZCUlN4SFFVRkRMRU5CUVVVc1EwRkJRenRaUVVGRk96dEJRVVY2UXl4bFFVRkpMRWxCUVVrc1EwRkJReXhKUVVGSkxFdEJRVXNzVlVGQlZTeEZRVUZGTzBGQlF6VkNMR2xDUVVGSkxFbEJRVWtzUTBGQlF5eGhRVUZoTEV0QlFVc3NTMEZCU3l4SlFVRkpMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEdGQlFXRXNSMEZCUnl4TFFVRkxMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVU3UVVGRE5VVXNiVUpCUVVrc1NVRkJTU3hEUVVGRExHRkJRV0VzUjBGQlJ5eERRVUZETEVWQlFVVTdRVUZETVVJc2MwSkJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSVUZCUlN4SFFVRkRMRU5CUVVNc1EwRkJRenRuUWtGRGJrSXNUVUZCVFR0QlFVTk1MSE5DUVVGTExFZEJRVWNzUTBGQlF5eERRVUZETzJkQ1FVTllPMk5CUTBZN1dVRkRSanM3T3pzN096czdPMEZCVTBRc1pVRkJTU3hEUVVGRExHRkJRV0VzUjBGQlJ5eExRVUZMTEVOQlFVTTdPMEZCUlROQ0xHVkJRVWtzVTBGQlV5eEhRVUZITEV0QlFVc3NTVUZCU1N4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGRExFTkJRVU1zUTBGQlF5eERRVUZET3p0QlFVVndReXhsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1dVRkJXU3hEUVVGRkxGTkJRVk1zUTBGQlJTeERRVUZET3p0QlFVVnVSQ3hsUVVGSkxFbEJRVWtzUTBGQlF5eEpRVUZKTEV0QlFVc3NWVUZCVlN4RlFVRkZPMEZCUXpWQ0xHbENRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1IwRkJSeXhUUVVGVExFTkJRVU03V1VGRGFrTTdPMEZCUlVRc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6czdRVUZGZEVNc1pVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFWQlJXWTdVVUZEUmpzN1FVRkZSQ3haUVVGUE8yTkJRVUVzYlVKQlFVY3NSVUZEVkRzN1FVRXdRa3NzVlVGQlN6czdPenM3T3pzN096czdPenM3T3pzN096czdPenRaUVVoQkxGbEJRVWM3UVVGRFZpeG5Ra0ZCVHl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF6dFJRVU14UWp0WlFVTlJMRlZCUVVNc1EwRkJReXhGUVVGRk8wRkJRMWdzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGRFSXNZVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4VlFVRlZMRU5CUVVNN1FVRkROME1zWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTjBReXhoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZEWmpzN1FVRlZSeXhSUVVGSE96czdPenM3T3p0WlFVaEJMRmxCUVVjN1FVRkRVaXhuUWtGQlR5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJRenRSUVVONFFqdFpRVU5OTEZWQlFVTXNRMEZCUXl4RlFVRkZPMEZCUTFRc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTNKQ096dEJRVlZITEZGQlFVYzdPenM3T3pzN08xbEJTRUVzV1VGQlJ6dEJRVU5TTEdkQ1FVRlBMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETzFGQlEzaENPMWxCUTAwc1ZVRkJReXhEUVVGRExFVkJRVVU3UVVGRFZDeGhRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRGNrSTdPMEZCVlVjc1UwRkJTVHM3T3pzN096czdXVUZJUVN4WlFVRkhPMEZCUTFRc1owSkJRVThzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNN1VVRkRla0k3V1VGRFR5eFZRVUZETEVOQlFVTXNSVUZCUlR0QlFVTldMR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTjBRanM3UVVGVlJ5eFRRVUZKT3pzN096czdPenRaUVVoQkxGbEJRVWM3UVVGRFZDeG5Ra0ZCVHl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF6dFJRVU16UWp0WlFVTlBMRlZCUVVNc1EwRkJReXhGUVVGRk8wRkJRMVlzWVVGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRM2hDT3p0QlFWbERMR1ZCUVZVN096czdPenM3TzFsQlNrRXNXVUZCUnp0QlFVTm1MR2RDUVVGUExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNWVUZCVlN4RFFVRkRPMUZCUXk5Q08xbEJSV0VzVlVGQlF5eERRVUZETEVWQlFVVTdRVUZEYUVJc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkROVUlzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEyaERPenM3TzFWQk1WVnJRaXhKUVVGSk8wbEJRVk1zVTBGQlV6czdhMEpCUVhSQ0xFbEJRVWtzUXpzN096czdPMEZET1VONlFpeGhRVUZaTEVOQlFVTTdPenM3T3pzN096czdRVUZGWWl4TFFVRkpMRWRCUVVjc1IwRkJSeXh0UWtGQlR5eERRVUZETEVOQlFXRXNRMEZCUXl4RFFVRkRPMEZCUTJwRExFdEJRVWtzVTBGQlV5eEhRVUZITEcxQ1FVRlBMRU5CUVVNc1EwRkJiVUlzUTBGQlF5eERRVUZETzBGQlF6ZERMRXRCUVVrc1kwRkJZeXhIUVVGSExHMUNRVUZQTEVOQlFVTXNSVUZCT0VJc1EwRkJReXhEUVVGRE8wRkJRemRFTEV0QlFVa3NTMEZCU3l4SFFVRkhMRzFDUVVGUExFTkJRVU1zUTBGQlpTeERRVUZETEVOQlFVTTdPMHRCUlM5Q0xGRkJRVkU3UVVGRlJDeFpRVVpRTEZGQlFWRXNSMEZGUlRzeVFrRkdWaXhSUVVGUk96dEJRVWxXTEZOQlFVa3NUMEZCVHl4SFFVRkhMRU5CUVVNc1QwRkJUeXhGUVVGRExFMUJRVTBzUlVGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXpzN1FVRkZka01zVTBGQlNTeFJRVUZSTEVkQlFVYzdRVUZEWWl4aFFVRlJMRU5CUVVNc1JVRkJSU3hGUVVGRExFVkJRVVVzUTBGQlF6dEJRVU5tTEdWQlFWVXNTMEZCU3p0QlFVTm1MR0ZCUVZFc1VVRkJVVHRCUVVOb1FpeGpRVUZUTEVOQlFVTTdUVUZEV0N4RFFVRkRPenRCUVVWR0xHZERRV0pGTEZGQlFWRXNOa05CWVVvc1UwRkJVeXhGUVVGRExFOUJRVThzUlVGQlF5eFJRVUZSTEVWQlFVVTdPMEZCUld4RExGTkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhKUVVGSkxFTkJRVU03UVVGREwwSXNVMEZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXpzN1FVRkZha01zVTBGQlNTeERRVUZETEUxQlFVMHNSMEZCUnp0QlFVTmFMRlZCUVVzc1RVRkJUVHRCUVVOWUxGVkJRVXNzVFVGQlRTeEZRVU5hTEVOQlFVTTdPMEZCUlVZc1UwRkJTU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzBGQlExb3NVMEZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8wbEJSV1k3TzJGQk1VSkhMRkZCUVZFN08yZENRVUZTTEZGQlFWRTdRVUUwUWxvc1pVRkJWVHRqUVVGQkxITkNRVUZITzBGQlExZ3NZVUZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTJwRExHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRTlCUVU4c1JVRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZET1VNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU5vUkN4aFFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1VVRkRka003TzBGQlJVUXNiVUpCUVdNN1kwRkJRU3d3UWtGQlJ6czdPMEZCUldZc1lVRkJTU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE96dEJRVVU1UWl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN08wRkJSVzVETEdGQlFVa3NRMEZCUXl4cFFrRkJhVUlzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRPenM3TzBGQlNXeERMR0ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeEZRVUZGT3p0QlFVVnFRaXhsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEZsQlFVMDdPMEZCUldwQ0xHMUNRVUZMTEV0QlFVc3NRMEZCUXl4WFFVRlhMRWRCUVVjc1NVRkJTU3hEUVVGRE8wRkJRemxDTEcxQ1FVRkxMRXRCUVVzc1EwRkJReXhWUVVGVkxFZEJRVWNzUTBGQlF5eE5RVUZMTEV0QlFVc3NRMEZCUXp0QlFVTndReXh0UWtGQlN5eEpRVUZKTEVOQlFVTXNUVUZCU3l4TFFVRkxMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU03V1VGRGJFTXNRMEZCUXpzN1FVRkZSaXhsUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEdkQ1FVRm5RaXhEUVVGRExGZEJRVmNzUlVGQlJTeFpRVUZOTzBGQlF6TkRMR2xDUVVGSkxFMUJRVXNzUzBGQlN5eERRVUZETEZkQlFWY3NSVUZCUlRzN1FVRkZNVUlzY1VKQlFVc3NTVUZCU1N4RFFVRkRMRTFCUVVzc1MwRkJTeXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETzJOQlEyeERPMWxCUTBZc1EwRkJReXhEUVVGRE96dEJRVWRJTEdWQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1dVRkJUVHRCUVVOb1FpeHBRa0ZCU1N4TlFVRkxMRXRCUVVzc1EwRkJReXhYUVVGWExFVkJRVVU3TzBGQlJURkNMSEZDUVVGTExFbEJRVWtzUlVGQlJTeERRVUZETzJOQlEySTdXVUZEUml4RFFVRkRPenRCUVVkR0xHVkJRVWtzUTBGQlF5eFBRVUZQTEVkQlFVY3NXVUZCVFR0QlFVTnVRaXh0UWtGQlN5eExRVUZMTEVOQlFVTXNWMEZCVnl4SFFVRkhMRXRCUVVzc1EwRkJRenM3TzFsQlIyaERMRU5CUVVNN1FVRkRSaXhsUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEdkQ1FVRm5RaXhEUVVGRExGTkJRVk1zUlVGQlJTeFpRVUZOTzBGQlEzcERMR2xDUVVGSkxFMUJRVXNzUzBGQlN5eERRVUZETEZkQlFWY3NSVUZCUlRzN1FVRkZNVUlzY1VKQlFVc3NSVUZCUlN4RlFVRkZMRU5CUVVNN1kwRkRXRHRaUVVOR0xFTkJRVU1zUTBGQlF6dEJRVU5JTEdWQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNWVUZCVlN4RlFVRkZMRmxCUVUwN1FVRkRNVU1zYVVKQlFVa3NUVUZCU3l4TFFVRkxMRU5CUVVNc1YwRkJWeXhGUVVGRk96dEJRVVV4UWl4eFFrRkJTeXhGUVVGRkxFVkJRVVVzUTBGQlF6dGpRVU5ZTzFsQlEwWXNRMEZCUXl4RFFVRkRPMVZCUlVvN1VVRkZSanM3UVVGRlJDeHJRa0ZCWVR0alFVRkJMSGxDUVVGSE96czdRVUZIVml4aFFVRkpMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU03TzBGQlJXWXNZVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zUjBGQlJ5eEZRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUXk5Q0xHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRWRCUVVjc1JVRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU12UWl4aFFVRkpMRWxCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUTBGQlF5eEZRVUZGTzBGQlEyeENMR1ZCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEU5QlFVOHNSVUZCUlN4SlFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzFWQlEyaEVMRTFCUVUwN1FVRkRUQ3hsUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4UFFVRlBMRVZCUVVVc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFWQlF6VkRPMEZCUTBRc1lVRkJTU3hKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNSVUZCUlR0QlFVTnVRaXhsUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzFWQlF6bERMRTFCUVUwN1FVRkRUQ3hsUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4UlFVRlJMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzFWQlF6bERPMEZCUTBRc1lVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRM0JETEdGQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1dVRkJXU3hEUVVGRExFbEJRVWtzUlVGQlJTeE5RVUZOTEVOQlFVTXNRMEZCUXp0UlFVVjZRenM3UVVGRlJDeFhRVUZOTzJOQlFVRXNhMEpCUVVjN1FVRkRVQ3hoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUlR0QlFVTm1MR1ZCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUlN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRPMVZCUTNoRUxFMUJRVTA3UVVGRFRDeGxRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhOUVVGTkxFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRWUVVOdVJEdFJRVU5HT3pzN08xVkJlRWhITEZGQlFWRTdTVUZCVXl4alFVRmpPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3p0TFFUQkthRUlzUzBGQlN6dEJRVVZpTEZsQlJsRXNTMEZCU3l4SFFVVldPekpDUVVaTExFdEJRVXM3TzBGQlNYUkNMRk5CUVVrc1QwRkJUeXhIUVVGSExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdPMEZCUlhoQ0xGTkJRVWtzVVVGQlVTeEhRVUZITzBGQlEySXNZVUZCVVN4RFFVRkRMRWRCUVVjc1JVRkJReXhIUVVGSExFTkJRVU03UVVGRGFrSXNaMEpCUVZjc1JVRkJSVHRCUVVOaUxHbENRVUZaTEVWQlFVVTdRVUZEWkN4aFFVRlJMRkZCUVZFN1RVRkRha0lzUTBGQlF6czdRVUZGUml4blEwRmlhVUlzUzBGQlN5dzJRMEZoYUVJc1UwRkJVeXhGUVVGRExFOUJRVThzUlVGQlF5eFJRVUZSTEVWQlFVVTdPMEZCUld4RExGTkJRVWtzUTBGQlF5eFZRVUZWTEVkQlFVY3NRMEZCUXl4SFFVRkhMRVZCUVVNc1IwRkJSeXhGUVVGRExFZEJRVWNzUlVGQlF5eEhRVUZITEVWQlFVTXNSMEZCUnl4RlFVRkRMRWRCUVVjc1JVRkJReXhIUVVGSExFVkJRVU1zUjBGQlJ5eEZRVUZETEVkQlFVY3NSVUZCUXl4SFFVRkhMRVZCUVVNc1IwRkJSeXhGUVVGRExFZEJRVWNzUTBGQlF5eERRVUZET3p0QlFVVndSU3hUUVVGSkxFTkJRVU1zVlVGQlZTeEhRVUZITEV0QlFVc3NRMEZCUXpzN1FVRkZlRUlzVTBGQlNTeERRVUZETEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF6czdRVUZGTDBJc1UwRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ6dEJRVU5ZTEZWQlFVY3NSVUZCUlN4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFOUJRVTg3UVVGRE1VSXNWMEZCU1N4RlFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zVVVGQlVUdE5RVU0zUWl4RFFVRkRPenRCUVVWR0xGTkJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1IwRkJSeXhEUVVGRE96dEJRVVZ1UkN4VFFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFVkJRVVVzUTBGQlF6czdRVUZGWml4VFFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExFdEJRVXNzUTBGQlF6czdRVUZGZEVJc1UwRkJTU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzBGQlExb3NVMEZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8wbEJSV1k3TzJGQmJrTnJRaXhMUVVGTE96dG5Ra0ZCVEN4TFFVRkxPMEZCY1VONFFpeGxRVUZWTzJOQlFVRXNjMEpCUVVjN1FVRkRXQ3hoUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEZGQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRE4wTXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zVVVGQlVTeEhRVUZITEZWQlFWVXNRMEZCUXp0QlFVTjZReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4WlFVRlpMRWRCUVVjc1MwRkJTeXhEUVVGRE8wRkJRM2hETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFOUJRVThzUjBGQlJ5eFBRVUZQTEVOQlFVTTdRVUZEY2tNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNTMEZCU3l4SFFVRkhMRTFCUVUwc1EwRkJRenRCUVVOc1F5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFZEJRVWNzVFVGQlRTeERRVUZETzBGQlEyNURMR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRSUVVOMlF6czdRVUZGUkN4dFFrRkJZenRqUVVGQkxEQkNRVUZIT3p0QlFVVm1MR0ZCUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzUlVGQlJTeERRVUZET3p0QlFVVm1MR05CUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWRCUVVjc1JVRkJReXhEUVVGRExFVkJRVVVzUlVGQlJUczdRVUZGYmtRc1pVRkJTU3hUUVVGVExFZEJRVWNzVVVGQlVTeERRVUZETEdGQlFXRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVNdlF5eGxRVUZKTEZWQlFWVXNSMEZCUnl4RFFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVkQlFVY3NTVUZCU1N4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExFMUJRVTBzUTBGQlF6czdRVUZGTjBRc1pVRkJTU3hIUVVGSExFZEJRVWNzU1VGQlNTeFJRVUZSTEVOQlFVTXNVMEZCVXl4RlFVRkZPMEZCUXpsQ0xITkNRVUZUTEVWQlFVVXNTVUZCU1R0QlFVTm1MR2xDUVVGSkxFVkJRVVVzUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1IwRkJSenRCUVVOMFFpeHJRa0ZCU3l4RlFVRkZMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zVlVGQlZTeERRVUZETzBGQlEyeERMR2xDUVVGSkxFVkJRVVVzU1VGQlNTeERRVUZETEVsQlFVazdXVUZEYUVJc1JVRkJSU3hKUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1EwRkJReXhIUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenM3UVVGRmFrUXNZMEZCUnl4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU03TzBGQlJXcENMR1ZCUVVrc1MwRkJTeXhEUVVGRExFMUJRVTBzUlVGQlJUdEJRVU5vUWl4blFrRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eExRVUZMTEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUTJ4Q0xHZENRVUZITEVOQlFVTXNVVUZCVVN4SFFVRkhMRWRCUVVjc1EwRkJReXhQUVVGUExFZEJRVWNzUjBGQlJ5eERRVUZETEZWQlFWVXNSMEZCUnl4WlFVRk5MRVZCUVVVc1EwRkJRenRCUVVOMlJDeG5Ra0ZCUnl4RFFVRkRMRXRCUVVzc1IwRkJSeXhIUVVGSExFTkJRVU1zU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4UFFVRlBMRWRCUVVjc1dVRkJUU3hGUVVGRkxFTkJRVU03UVVGRE9VTXNaMEpCUVVjc1EwRkJReXhSUVVGUkxFZEJRVWNzUjBGQlJ5eERRVUZETEZsQlFWa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1pVRkJaU3hIUVVGSExGbEJRVTBzUlVGQlJTeERRVUZETzBGQlEycEZMR2RDUVVGSExFTkJRVU1zUzBGQlN5eEhRVUZITEVkQlFVY3NRMEZCUXl4VFFVRlRMRWRCUVVjc1IwRkJSeXhEUVVGRExGbEJRVmtzUjBGQlJ5eFpRVUZOTEVWQlFVVXNRMEZCUXp0WlFVTjZSRHM3UVVGRlJDeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU53UWl4bFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGZEJRVmNzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXp0VlFVVnlRenRCUVVORUxHRkJRVWtzUzBGQlN5eERRVUZETEUxQlFVMHNSVUZCUlR0QlFVTm9RaXhsUVVGSkxFTkJRVU1zYVVKQlFXbENMRVZCUVVVc1EwRkJRenRWUVVNeFFqdFJRVVZHT3p0QlFVVkVMR3RDUVVGaE8yTkJRVUVzZVVKQlFVYzdPMEZCUldRc1lVRkJTU3hKUVVGSkxFZEJRVWNzUTBGQlF5eERRVUZET3p0QlFVVmlMR0ZCUVVrc1dVRkJXU3hIUVVGSExFVkJRVVVzUTBGQlF6czdRVUZGZEVJc1kwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1IwRkJSeXhGUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGT3p0QlFVVnVSQ3gxUWtGQldTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenM3UVVGRmVFSXNaVUZCU1N4VlFVRlZMRWRCUVVjc1EwRkJReXhEUVVGRExFZEJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SFFVRkhMRWxCUVVrc1NVRkJTU3hEUVVGRExGVkJRVlVzUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZETjBRc1pVRkJTU3hqUVVGakxFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVTXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1RVRkJUU3hEUVVGRE8wRkJRMjVGTEdWQlFVa3NRMEZCUXl4SFFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVkQlFVY3NTVUZCU1N4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUlVGQlJUdEJRVU42UXl4cFFrRkJTU3hKUVVGSkxFTkJRVU1zUTBGQlF6dFpRVU5ZTEUxQlFVMHNTVUZCU1N4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExGVkJRVlVzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4SlFVRkpMRU5CUVVNc1ZVRkJWU3hEUVVGRExHTkJRV01zUTBGQlF5eExRVUZMTEVkQlFVY3NSVUZCUlR0QlFVTjZSaXhwUWtGQlNTeEpRVUZKTEVOQlFVTXNRMEZCUXp0WlFVTllMRTFCUVUwN1FVRkRUQ3hwUWtGQlNTeEpRVUZKTEVkQlFVY3NRMEZCUXp0WlFVTmlPMVZCUTBZN1FVRkRSQ3hoUVVGSkxGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTTdPenRCUVVsd1FpeGhRVUZKTEU5QlFVOHNSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRhRUlzWVVGQlNTeFhRVUZYTEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGRExFOUJRVThzUjBGQlF5eERRVUZETEVsQlFVa3NVVUZCVVN4RFFVRkRPMEZCUTNCRUxHRkJRVWtzV1VGQldTeEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJReXhQUVVGUExFZEJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXpzN1FVRkZMME1zWTBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhIUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRk96dEJRVVZ1UXl4bFFVRkpMRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJRenRCUVVOd1F5eHZRa0ZCVXl4RFFVRkRMRXRCUVVzc1EwRkJReXhSUVVGUkxFZEJRVWNzVlVGQlZTeERRVUZETzBGQlEzUkRMRzlDUVVGVExFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NSMEZCU1N4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVU1zVjBGQlZ5eEhRVUZETEU5QlFVOHNSMEZCU1N4SlFVRkpMRU5CUVVNN1FVRkRjRVVzWlVGQlNTeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUzBGQlN5eEhRVUZITEVWQlFVVTdRVUZET1VJc2MwSkJRVk1zUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4SFFVRkpMRTlCUVU4c1IwRkJTU3hKUVVGSkxFTkJRVU03UVVGRGRrTXNhVUpCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRmRCUVZjc1JVRkJSU3haUVVGWkxFZEJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEYkVRc1RVRkJUVHRCUVVOTUxITkNRVUZUTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGRE0wSXNjMEpCUVZNc1EwRkJReXhMUVVGTExFTkJRVU1zUjBGQlJ5eEhRVUZITEU5QlFVOHNSMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRia01zYVVKQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETEZkQlFWY3NSVUZCUlN4WlFVRlpMRWRCUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGRGNFUTdWVUZGUmp0UlFVVkdPenRCUVVWRUxHMUNRVUZqTzJOQlFVRXNNRUpCUVVjN096czdRVUZKWml4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eGxRVUZsTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFTkJRVU03TzBGQlJUZEVMR05CUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlF5eERRVUZETEVWQlFVVXNSVUZCUlR0QlFVTnVReXhsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1IwRkJSenRCUVVOd1FpeG5Ra0ZCU3l4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXM3UVVGRGRFSXNaMEpCUVVzc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTzBGQlEzSkNMSEZDUVVGVkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFR0QlFVTTFRaXh4UWtGQlZTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmRCUVZjN1dVRkRiRU1zUTBGQlF6dEJRVU5HTEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zWTBGQll5eEZRVUZGTEVOQlFVTTdRVUZET1VJc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRWUVVOMlFqdFJRVWRHT3p0QlFVVkVMR05CUVZNN1kwRkJRU3h0UWtGQlF5eEpRVUZKTEVWQlFVTXNSVUZCUlN4RlFVRkZPenM3T3p0QlFVdHFRaXhoUVVGSkxFbEJRVWtzUjBGQlJ6dEJRVU5VTEdWQlFVa3NSVUZCUlN4SlFVRkpPMVZCUTFnc1EwRkJRenRCUVVOR0xHRkJRVWtzVDBGQlR5eEZRVUZGTEV0QlFVc3NVVUZCVVN4RlFVRkZPMEZCUXpGQ0xHVkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NSVUZCUlN4RFFVRkRMRXRCUVVzc1EwRkJRenM3TzFWQlIzWkNMRTFCUVUwN1FVRkRUQ3hsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVWQlFVVXNRMEZCUXp0VlFVTnFRanRCUVVORUxHRkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE8xRkJRekZDT3p0QlFWTkVMRmRCUVUwN096czdPenM3T3p0alFVRkJMR3RDUVVGSExFVkJSVkk3TzBGQlIwUXNjMEpCUVdsQ08yTkJRVUVzTmtKQlFVYzdPenRCUVVWc1FpeGhRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhQUVVGUExFZEJRVWNzU1VGQlNTeERRVUZETEZWQlFWVXNSMEZCUnl4WlFVRk5MRVZCUVVVc1EwRkJRenRCUVVNeFJDeGhRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4WlFVRk5MRVZCUVVVc1EwRkJRenRCUVVOcVJDeGhRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxFZEJRVWNzU1VGQlNTeERRVUZETEdWQlFXVXNSMEZCUnl4WlFVRk5MRVZCUVVVc1EwRkJRenRCUVVOd1JTeGhRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NSMEZCUnl4WlFVRk5MRVZCUVVVc1EwRkJRenM3UVVGRk0wUXNZVUZCU1N4RFFVRkRMR05CUVdNc1IwRkJSeXhMUVVGTExFTkJRVU03TzBGQlJUVkNMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1dVRkJXU3hGUVVGRkxGVkJRVU1zUTBGQlF5eEZRVUZMTzBGQlEycEVMR3RDUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMEZCUXpGQ0xHVkJRVWtzVDBGQlR5eEhRVUZITEZGQlFWRXNRMEZCUXl4blFrRkJaMElzUTBGQlF5eERRVUZETEVOQlFVTXNZVUZCWVN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFOUJRVThzUlVGQlF5eERRVUZETEVOQlFVTXNZVUZCWVN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzBGQlF5OUdMR1ZCUVVrc1IwRkJSeXhIUVVGSExFMUJRVXNzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVOdVF5eHBRa0ZCU3l4VlFVRlZMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUzBGQlN5eERRVUZETzBGQlF6ZENMR05CUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlN5eFZRVUZWTEVOQlFVTXNRMEZCUXp0QlFVTXhRaXhwUWtGQlN5eGpRVUZqTEVkQlFVY3NUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJRenRCUVVOd1F5eFpRVUZETEVOQlFVTXNZMEZCWXl4RlFVRkZMRU5CUVVNN1FVRkRia0lzV1VGQlF5eERRVUZETEdWQlFXVXNSVUZCUlN4RFFVRkRPMVZCUTNKQ0xFTkJRVU1zUTBGQlF6czdRVUZGU0N4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExHZENRVUZuUWl4RFFVRkRMRmRCUVZjc1JVRkJSU3hWUVVGRExFTkJRVU1zUlVGQlN6dEJRVU5vUkN4bFFVRkpMRTlCUVU4c1IwRkJSeXhSUVVGUkxFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1EwRkJReXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4UFFVRlBMRVZCUVVNc1EwRkJReXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRCUVVNdlJpeGxRVUZKTEVkQlFVY3NSMEZCUnl4TlFVRkxMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZEYmtNc1pVRkJTU3hQUVVGUExFTkJRVU1zUzBGQlN5eExRVUZITEUxQlFVc3NZMEZCWXl4RlFVRkZPMEZCUTNaRExHbENRVUZKTEUxQlFVc3NZMEZCWXl4RlFVRkZPMEZCUTNaQ0xHMUNRVUZKTEU5QlFVOHNSMEZCUnl4TlFVRkxMRWxCUVVrc1EwRkJReXhOUVVGTExHTkJRV01zUTBGQlF5eERRVUZETzBGQlF6ZERMSE5DUVVGUExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTTdZMEZEWkR0QlFVTkVMR2RDUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVc3NWVUZCVlN4RFFVRkRMRU5CUVVNN1dVRkRNMElzVFVGQlRUdEJRVU5NTEdkQ1FVRkhMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03V1VGRFdqdEJRVU5FTEdsQ1FVRkxMR05CUVdNc1IwRkJSeXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETzBGQlEzQkRMRmxCUVVNc1EwRkJReXhqUVVGakxFVkJRVVVzUTBGQlF6dEJRVU51UWl4WlFVRkRMRU5CUVVNc1pVRkJaU3hGUVVGRkxFTkJRVU03VlVGRGNrSXNRMEZCUXl4RFFVRkRPenRCUVVWSUxHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zVlVGQlZTeEZRVUZGTEZWQlFVTXNRMEZCUXl4RlFVRkxPenRCUVVVdlF5eGxRVUZKTEVkQlFVY3NSMEZCUnl4TlFVRkxMRWxCUVVrc1EwRkJReXhOUVVGTExHTkJRV01zUTBGQlF5eERRVUZETzBGQlEzcERMR05CUVVjc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF6dEJRVU5VTEdsQ1FVRkxMRmRCUVZjc1IwRkJSeXhMUVVGTExFTkJRVU03UVVGRGVrSXNhVUpCUVVzc1kwRkJZeXhIUVVGSExFdEJRVXNzUTBGQlF6dEJRVU0xUWl4WlFVRkRMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU03UVVGRGJrSXNXVUZCUXl4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8xVkJRM0pDTEVOQlFVTXNRMEZCUXp0UlFVVktPenRCUVU5RUxHRkJRVkU3T3pzN096czdPMk5CUVVFc2EwSkJRVU1zUjBGQlJ5eEZRVUZETEVsQlFVa3NSVUZCUlR0QlFVTnFRaXhoUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVkQlFVY3NSMEZCUnl4SFFVRkhMRU5CUVVNN1FVRkRja0lzWVVGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRE8wRkJRM1pDTEdGQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVVc1EwRkJRenRCUVVOaUxHRkJRVWtzUTBGQlF5eGpRVUZqTEVWQlFVVXNRMEZCUXp0UlFVTjJRanM3UVVGUFJDeGpRVUZUT3pzN096czdPenRqUVVGQkxHMUNRVUZETEVsQlFVa3NSVUZCUlN4RlFVRkZMRVZCUVVVN1FVRkRiRUlzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU03VVVGRGVrTTdPMEZCVDBRc1owSkJRVmM3T3pzN096czdPMk5CUVVFc2NVSkJRVU1zUzBGQlN5eEZRVUZGTEVWQlFVVXNSVUZCUlR0QlFVTnlRaXhoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dFJRVU16UWpzN096dFZRV2hSYTBJc1MwRkJTenRKUVVGVExGTkJRVk03TzJ0Q1FVRjJRaXhMUVVGTE96czdPenM3T3p0QlEycExNVUlzWVVGQldTeERRVUZET3pzN096czdPenM3TzBGQlJXSXNTMEZCU1N4SFFVRkhMRWRCUVVjc2JVSkJRVThzUTBGQlF5eERRVUZoTEVOQlFVTXNRMEZCUXp0QlFVTnFReXhMUVVGSkxFZEJRVWNzUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRU5CUVdFc1EwRkJReXhEUVVGRE8wRkJRMnBETEV0QlFVa3NVMEZCVXl4SFFVRkhMRzFDUVVGUExFTkJRVU1zUTBGQmJVSXNRMEZCUXl4RFFVRkRPMEZCUXpkRExFdEJRVWtzWTBGQll5eEhRVUZITEcxQ1FVRlBMRU5CUVVNc1JVRkJPRUlzUTBGQlF5eERRVUZETzBGQlF6ZEVMRXRCUVVrc1YwRkJWeXhIUVVGSExHMUNRVUZQTEVOQlFVTXNSVUZCYTBJc1EwRkJReXhEUVVGRE8wRkJRemxETEV0QlFVa3NXVUZCV1N4SFFVRkhMRzFDUVVGUExFTkJRVU1zUlVGQmJVSXNRMEZCUXl4RFFVRkRPMEZCUTJoRUxFdEJRVWtzUzBGQlN5eEhRVUZITEcxQ1FVRlBMRU5CUVVNc1EwRkJaU3hEUVVGRExFTkJRVU03TzB0QlNTOUNMRlZCUVZVN1FVRkZTQ3haUVVaUUxGVkJRVlVzUjBGRlFUc3lRa0ZHVml4VlFVRlZPenRCUVVsYUxGTkJRVWtzVDBGQlR5eEhRVUZITEVOQlFVTXNUMEZCVHl4RFFVRkZMRU5CUVVNN08wRkJSWHBDTEZOQlFVa3NVVUZCVVN4SFFVRkhPMEZCUTJJc1lVRkJVU3hEUVVGRExFVkJRVVVzUlVGQlF5eEZRVUZGTEVOQlFVTTdRVUZEWml4bFFVRlZMRXRCUVVzN1FVRkRaaXhoUVVGUkxGRkJRVkU3UVVGRGFFSXNZMEZCVXl4RFFVRkRPMDFCUTFnc1EwRkJRenM3UVVGRlJpeG5RMEZpUlN4VlFVRlZMRFpEUVdGT0xGTkJRVk1zUlVGQlF5eFBRVUZQTEVWQlFVTXNVVUZCVVN4RlFVRkZPenRCUVVWc1F5eFRRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eERRVUZETzBGQlEycERMRk5CUVVrc1EwRkJReXhIUVVGSExFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4SFFVRkhMRU5CUVVNN1FVRkROMElzVTBGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF6czdRVUZGYmtNc1UwRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJRenM3UVVGRmJrTXNVMEZCU1N4RFFVRkRMRmRCUVZjc1IwRkJSeXhMUVVGTExFTkJRVU03UVVGRGVrSXNVMEZCU1N4RFFVRkRMRlZCUVZVc1IwRkJSeXhMUVVGTExFTkJRVU03TzBGQlJYaENMRk5CUVVrc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dEJRVU5hTEZOQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRKUVVWbU96dGhRVE5DUnl4VlFVRlZPenRuUWtGQlZpeFZRVUZWTzBGQk5rSmtMR1ZCUVZVN1kwRkJRU3h6UWtGQlJ6dEJRVU5ZTEdGQlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTnFReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4UFFVRlBMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlF6bERMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRGFFUXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zUjBGQlJ5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTXZRaXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRWRCUVVjc1MwRkJTeXhEUVVGRE8wRkJRMmhETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExGRkJRVkVzUjBGQlJ5eFZRVUZWTEVOQlFVTTdRVUZEZWtNc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8xRkJRM1pET3p0QlFVVkVMRzFDUVVGak8yTkJRVUVzTUVKQlFVYzdPenRCUVVWbUxHRkJRVWtzUTBGQlF5eEhRVUZITEVkQlFVY3NSMEZCUnl4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU01UWl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN08wRkJSVzVETEdGQlFVa3NRMEZCUXl4cFFrRkJhVUlzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRPenM3TzBGQlNXeERMR0ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeEZRVUZGT3p0QlFVVnFRaXhsUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEZsQlFVMDdRVUZEYWtJc2JVSkJRVXNzVFVGQlRTeERRVUZETEZkQlFWY3NSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkRMMElzYlVKQlFVc3NUVUZCVFN4RFFVRkRMRlZCUVZVc1IwRkJSeXhEUVVGRExFMUJRVXNzUzBGQlN5eERRVUZETzBGQlEzSkRMRzFDUVVGTExFbEJRVWtzUTBGQlF5eE5RVUZMTEUxQlFVMHNRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJRenRaUVVOdVF5eERRVUZETzBGQlEwWXNaVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4WFFVRlhMRVZCUVVVc1dVRkJUVHRCUVVNelF5eHBRa0ZCU1N4TlFVRkxMRTFCUVUwc1EwRkJReXhYUVVGWExFVkJRVVU3UVVGRE0wSXNjVUpCUVVzc1NVRkJTU3hEUVVGRExFMUJRVXNzVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRPMk5CUTI1RE8xbEJRMFlzUTBGQlF5eERRVUZET3p0QlFVZElMR1ZCUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzV1VGQlRTeEZRVU5xUWl4RFFVRkRPMEZCUTBZc1pVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhYUVVGWExFVkJRVVVzVlVGQlF5eERRVUZETEVWQlFVczdRVUZETlVNc2FVSkJRVWtzVFVGQlN5eE5RVUZOTEVOQlFVTXNWMEZCVnl4RlFVRkZPMEZCUXpOQ0xHMUNRVUZKTEVOQlFVTXNUVUZCU3l4TlFVRk5MRVZCUVVVN1FVRkRhRUlzZFVKQlFVc3NUVUZCVFN4SFFVRkhMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlN5eFBRVUZQTEVOQlFVTXNRMEZCUXp0blFrRkRPVU03UVVGRFJDeHhRa0ZCU3l4TFFVRkxMRWRCUVVjc1IwRkJSeXhEUVVGRExGZEJRVmNzUTBGQlF5eERRVUZETEVWQlFVTXNUVUZCU3l4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVNMVF5eHhRa0ZCU3l4SlFVRkpMRVZCUVVVc1EwRkJRenRqUVVOaU8xbEJRMFlzUTBGQlF5eERRVUZET3p0QlFVZElMR1ZCUVVrc1EwRkJReXhQUVVGUExFZEJRVWNzV1VGQlRUdEJRVU51UWl4dFFrRkJTeXhOUVVGTkxFTkJRVU1zVjBGQlZ5eEhRVUZITEV0QlFVc3NRMEZCUXp0WlFVTnFReXhEUVVGRE8wRkJRMFlzWlVGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4blFrRkJaMElzUTBGQlF5eFRRVUZUTEVWQlFVVXNXVUZCVFR0QlFVTjZReXhwUWtGQlNTeE5RVUZMTEUxQlFVMHNRMEZCUXl4WFFVRlhMRVZCUVVVN1FVRkRNMElzY1VKQlFVc3NSVUZCUlN4RlFVRkZMRU5CUVVNN1kwRkRXRHRaUVVOR0xFTkJRVU1zUTBGQlF6dEJRVU5JTEdWQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNWVUZCVlN4RlFVRkZMRmxCUVUwN1FVRkRNVU1zYVVKQlFVa3NUVUZCU3l4TlFVRk5MRU5CUVVNc1YwRkJWeXhGUVVGRk8wRkJRek5DTEhGQ1FVRkxMRVZCUVVVc1JVRkJSU3hEUVVGRE8yTkJRMWc3V1VGRFJpeERRVUZETEVOQlFVTTdWVUZEU2p0UlFVVkdPenRCUVVWRUxHdENRVUZoTzJOQlFVRXNlVUpCUVVjN08wRkJSV1FzWVVGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4WlFVRlpMRU5CUVVNc1IwRkJSeXhGUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6ZENMR0ZCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEVkQlFVY3NSVUZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNM1FpeGhRVUZKTEVsQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1EwRkJReXhGUVVGRk8wRkJRMnhDTEdWQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1dVRkJXU3hEUVVGRExFOUJRVThzUlVGQlJTeEpRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRE8xVkJRMmhFTEUxQlFVMDdRVUZEVEN4bFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eFBRVUZQTEVWQlFVVXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8xVkJRelZETzBGQlEwUXNZVUZCU1N4SlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUlVGQlJUdEJRVU51UWl4bFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eFJRVUZSTEVWQlFVVXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dFZRVU5zUkN4TlFVRk5PMEZCUTB3c1pVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkZMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dFZRVU01UXpzN1FVRkZSQ3hoUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1VVRkZlRVE3TzBGQlJVUXNWMEZCVFR0alFVRkJMR3RDUVVGSE8wRkJRMUFzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVVN1FVRkRaaXhsUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1ZVRkRlRVFzVFVGQlRUdEJRVU5NTEdWQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1dVRkJXU3hEUVVGRExFMUJRVTBzUlVGQlJTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dFZRVU14UkR0UlFVTkdPenM3TzFWQmNraEhMRlZCUVZVN1NVRkJVeXhqUVVGak96czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenRMUVdkTGJFSXNVMEZCVXp0QlFVVnFRaXhaUVVaUkxGTkJRVk1zUjBGRlpEc3lRa0ZHU3l4VFFVRlRPenRCUVVreFFpeFRRVUZKTEU5QlFVOHNSMEZCUnl4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE96dEJRVVY0UWl4VFFVRkpMRkZCUVZFc1IwRkJSenRCUVVOaUxHRkJRVkVzUTBGQlF5eEhRVUZITEVWQlFVTXNSMEZCUnl4RFFVRkRPMEZCUTJwQ0xHRkJRVkVzVVVGQlVUdEJRVU5vUWl4aFFVRlJMRU5CUVVNN1FVRkRWQ3huUWtGQlZ5eEZRVUZGTzAxQlEyUXNRMEZCUXpzN1FVRkZSaXhuUTBGaWFVSXNVMEZCVXl3MlEwRmhjRUlzVTBGQlV5eEZRVUZETEU5QlFVOHNSVUZCUXl4UlFVRlJMRVZCUVVVN08wRkJSV3hETEZOQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU03T3pzN096czdRVUZQYWtJc1UwRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRWxCUVVrc1EwRkJRenM3T3pzN08wRkJUUzlDTEZOQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1NVRkJTU3hMUVVGTExFTkJRVU1zVVVGQlVTeERRVUZETEVkQlFVY3NSVUZCUXl4WlFVRlhMRVZCUVVVc1JVRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6czdPenM3TzBGQlRUVkVMRk5CUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhKUVVGSkxFVkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenRCUVVONFJTeFRRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVc1IwRkJSeXhKUVVGSkxFTkJRVU03T3pzN096dEJRVTEwUWl4VFFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEVOQlFVTXNSVUZCUXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03TzBGQlJXaEVMRk5CUVVrc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dEpRVVZpT3p0aFFUZERhMElzVTBGQlV6czdaMEpCUVZRc1UwRkJVenRCUVN0RE5VSXNaVUZCVlR0alFVRkJMSE5DUVVGSE8wRkJRMWdzWVVGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlF6ZERMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEZGQlFWRXNSMEZCUnl4VlFVRlZMRU5CUVVNN1FVRkRla01zWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1QwRkJUeXhIUVVGSExFOUJRVThzUTBGQlF6dEJRVU55UXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVkQlFVY3NUVUZCVFN4RFFVRkRPMEZCUTJ4RExHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRGJrTXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUTNSRExHRkJRVWtzUzBGQlN5eERRVUZETEUxQlFVMHNSVUZCUlR0QlFVTm9RaXhsUVVGSkxFTkJRVU1zYVVKQlFXbENMRVZCUVVVc1EwRkJRenRWUVVNeFFqdFJRVU5HT3p0QlFVVkVMRzFDUVVGak8yTkJRVUVzTUVKQlFVYzdPMEZCUldZc1lVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eEZRVUZGTEVOQlFVTTdRVUZEYUVJc1kwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeEZRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZPenRCUVVWeVF5eGxRVUZKTEZOQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXpzN08wRkJSM0pETEdWQlFVa3NVMEZCVXl4SFFVRkhMRkZCUVZFc1EwRkJReXhoUVVGaExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdRVUZETDBNc2IwSkJRVk1zUTBGQlF5eExRVUZMTEVOQlFVTXNVVUZCVVN4SFFVRkhMRlZCUVZVc1EwRkJRenM3UVVGSGRFTXNaVUZCU1N4SlFVRkpMRWRCUVVjc1NVRkJTU3hWUVVGVkxFTkJRVU1zVTBGQlV5eEZRVUZGTzBGQlEycERMSE5DUVVGVExFVkJRVVVzU1VGQlNUdEJRVU5tTEd0Q1FVRkxMRVZCUVVVc1EwRkJRenRCUVVOU0xHZENRVUZITEVWQlFVVXNVMEZCVVN4RFFVRkRMRWRCUVVjN1FVRkRha0lzYlVKQlFVMHNSVUZCUlN4VFFVRlJMRU5CUVVNc1RVRkJUVHRCUVVOMlFpeHBRa0ZCU1N4RlFVRkZMRWxCUVVrc1EwRkJReXhKUVVGSk8wRkJRMllzYlVKQlFVMHNSVUZCUlN4SlFVRkpPMWxCUTJJc1JVRkJSU3hKUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6czdPMEZCUjJ4RExHVkJRVWtzUzBGQlN5eERRVUZETEUxQlFVMHNSVUZCUlR0QlFVTm9RaXhwUWtGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4TFFVRkxMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRMjVDTEdsQ1FVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF5eFBRVUZQTEVkQlFVY3NTVUZCU1N4RFFVRkRMRlZCUVZVc1IwRkJSeXhaUVVGTkxFVkJRVVVzUTBGQlF6dEJRVU14UkN4cFFrRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXhQUVVGUExFZEJRVWNzV1VGQlRTeEZRVUZGTEVOQlFVTTdRVUZEYWtRc2FVSkJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRmxCUVZrc1IwRkJSeXhKUVVGSkxFTkJRVU1zWlVGQlpTeEhRVUZITEZsQlFVMHNSVUZCUlN4RFFVRkRPMEZCUTNCRkxHbENRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NSMEZCUnl4WlFVRk5MRVZCUVVVc1EwRkJRenRaUVVNMVJEczdRVUZGUkN4bFFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0QlFVTjBRaXhsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJRenRWUVVWeVF6dEJRVU5FTEdGQlFVa3NRMEZCUXl4aFFVRmhMRVZCUVVVc1EwRkJRenRSUVVOMFFqczdRVUZGUkN4clFrRkJZVHRqUVVGQkxIbENRVUZIT3p0QlFVVmtMR0ZCUVVrc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJRenRCUVVNeFF5eGhRVUZKTEZWQlFWVXNSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTTdPMEZCUlhwRExHTkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRCUVVOMFF5eGxRVUZKTEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEUxQlFVMHNRMEZCUXp0QlFVTnlReXh2UWtGQlV5eERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF6dEJRVU12UkN4dlFrRkJVeXhEUVVGRExFdEJRVXNzUTBGQlF5eEhRVUZITEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVkQlFVY3NWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVNMVJDeGxRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eFRRVUZUTEVWQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNN1ZVRkROVU03VVVGSFJqczdRVUZGUkN4dFFrRkJZenRqUVVGQkxEQkNRVUZITzBGQlEyWXNZMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEzUkRMR1ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1ZVRkRlRUk3VVVGRFJqczdRVUZGUkN4WFFVRk5PMk5CUVVFc2EwSkJRVWM3T3pzN08wRkJSMUFzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1ZVRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSVUZCU3pzN1FVRkZOMElzWlVGQlNTeE5RVUZMTEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NUVUZCU3l4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eEZRVUZGTzBGQlEzSkVMR2xDUVVGSkxFMUJRVXNzVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVTdRVUZEYWtNc2NVSkJRVXNzUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8yTkJRM2hDTEUxQlFVMDdRVUZEVEN4eFFrRkJTeXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RlFVRkZMRU5CUVVNN1kwRkRla0k3V1VGRFJqdFZRVU5HTEVOQlFVTXNRMEZCUXp0UlFVTktPenRCUVZORUxHTkJRVk03T3pzN096czdPenRqUVVGQkxHMUNRVUZETEVsQlFVa3NSVUZCUXl4RlFVRkZMRVZCUVVVN096czdRVUZKYWtJc1lVRkJTU3hKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03TzBGQlJYQkRMR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTJoRUxHRkJRVWtzU1VGQlNTeEhRVUZITzBGQlExUXNZMEZCUnl4RlFVRkZMRWxCUVVrc1EwRkJReXhIUVVGSE8wRkJRMklzYVVKQlFVMHNSVUZCUlN4SlFVRkpMRU5CUVVNc1RVRkJUVHRCUVVOdVFpeG5Ra0ZCU3l4RlFVRkZMRVZCUVVVN1ZVRkRWaXhEUVVGRE8wRkJRMFlzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03VVVGRE1VSTdPMEZCUlVRc1YwRkJUVHRqUVVGQkxHdENRVUZIT3pzN1FVRkRVQ3hoUVVGSkxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1JVRkJSVHRCUVVNelFpeGxRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhWUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkxPMEZCUXpkQ0xHbENRVUZKTEVOQlFVTXNTMEZCUnl4TlFVRkxMRTlCUVU4c1EwRkJReXhMUVVGTExFVkJRVVU3UVVGRE1VSXNjVUpCUVVzc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4WlFVRlpMRU5CUVVNc1VVRkJVU3hGUVVGRExFMUJRVXNzVFVGQlRTeERRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRPMEZCUTJwRkxIRkNRVUZMTEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEdOQlFXTXNSVUZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOdVJDeHhRa0ZCU3l4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4blFrRkJaMElzUlVGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0alFVTjBSQ3hOUVVGTk8wRkJRMHdzY1VKQlFVc3NTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8yTkJRMnBFTzFsQlEwWXNRMEZCUXl4RFFVRkRPMVZCUTBvN1VVRkRSanM3UVVGTlJDeFZRVUZMT3pzN096czdPMk5CUVVFc1pVRkJReXhGUVVGRkxFVkJRVVU3UVVGRFVpeGhRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRCUVVNelF5eGhRVUZKTEVWQlFVVXNSVUZCUlR0QlFVTk9MR1ZCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRPMVZCUTNSQ08wRkJRMFFzWVVGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRVZCUVVVc1EwRkJRenRSUVVOMlFqczdRVUZMUkN4VFFVRkpPenM3T3pzN1kwRkJRU3huUWtGQlJ6dEJRVU5NTEdGQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03VVVGRGRFSTdPMEZCUzBRc1UwRkJTVHM3T3pzN08yTkJRVUVzWjBKQlFVYzdRVUZEVEN4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzBGQlEzQkNMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1QwRkJUeXhGUVVGRkxFTkJRVU1zUTBGQlF6dEJRVU51UlN4aFFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VVVGRFpqczdRVUZGUkN4elFrRkJhVUk3WTBGQlFTdzJRa0ZCUnpzN08wRkJSV3hDTEdGQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eEpRVUZKTEVOQlFVTXNWVUZCVlN4SFFVRkhMRmxCUVUwc1JVRkJSU3hEUVVGRE8wRkJRekZFTEdGQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUMEZCVHl4SFFVRkhMRmxCUVUwc1JVRkJSU3hEUVVGRE8wRkJRMnBFTEdGQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNaVUZCWlN4SFFVRkhMRmxCUVUwc1JVRkJSU3hEUVVGRE8wRkJRM0JGTEdGQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNXVUZCV1N4SFFVRkhMRmxCUVUwc1JVRkJSU3hEUVVGRE96dEJRVVV6UkN4aFFVRkpMRU5CUVVNc1kwRkJZeXhIUVVGSExFdEJRVXNzUTBGQlF6czdRVUZGTlVJc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhaUVVGWkxFVkJRVVVzVlVGQlF5eERRVUZETEVWQlFVczdRVUZEYWtRc1pVRkJTU3hQUVVGUExFZEJRVWNzVVVGQlVTeERRVUZETEdkQ1FVRm5RaXhEUVVGRExFTkJRVU1zUTBGQlF5eGhRVUZoTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhGUVVGRExFTkJRVU1zUTBGQlF5eGhRVUZoTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03UVVGREwwWXNaVUZCU1N4SlFVRkpMRWRCUVVjc1RVRkJTeXhMUVVGTExFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTNKRExHbENRVUZMTEZWQlFWVXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU03UVVGRE9VSXNaVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTExGVkJRVlVzUTBGQlF5eERRVUZETzBGQlF6TkNMR2xDUVVGTExHTkJRV01zUjBGQlJ5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTNCRExGbEJRVU1zUTBGQlF5eGpRVUZqTEVWQlFVVXNRMEZCUXp0QlFVTnVRaXhaUVVGRExFTkJRVU1zWlVGQlpTeEZRVUZGTEVOQlFVTTdWVUZEY2tJc1EwRkJReXhEUVVGRE96dEJRVVZJTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNWMEZCVnl4RlFVRkZMRlZCUVVNc1EwRkJReXhGUVVGTE8wRkJRMmhFTEdWQlFVa3NUMEZCVHl4SFFVRkhMRkZCUVZFc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4RFFVRkRMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNSVUZCUXl4RFFVRkRMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUXk5R0xHVkJRVWtzU1VGQlNTeEhRVUZITEUxQlFVc3NTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU55UXl4bFFVRkpMRTlCUVU4c1EwRkJReXhMUVVGTExFdEJRVWNzVFVGQlN5eGpRVUZqTEVWQlFVVTdRVUZEZGtNc2FVSkJRVWtzVFVGQlN5eGpRVUZqTEVsQlFVa3NRMEZCUXl4RlFVRkZPMEZCUXpWQ0xHMUNRVUZKTEZGQlFWRXNSMEZCUnl4TlFVRkxMRXRCUVVzc1EwRkJReXhOUVVGTExHTkJRV01zUTBGQlF5eERRVUZETzBGQlF5OURMSFZDUVVGUkxFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTTdZMEZEWmp0QlFVTkVMR2xDUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVc3NWVUZCVlN4RFFVRkRMRU5CUVVNN1dVRkROVUlzVFVGQlRUdEJRVU5NTEdsQ1FVRkpMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03V1VGRFlqdEJRVU5FTEdsQ1FVRkxMR05CUVdNc1IwRkJSeXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETzBGQlEzQkRMRmxCUVVNc1EwRkJReXhqUVVGakxFVkJRVVVzUTBGQlF6dEJRVU51UWl4WlFVRkRMRU5CUVVNc1pVRkJaU3hGUVVGRkxFTkJRVU03VlVGRGNrSXNRMEZCUXl4RFFVRkRPenRCUVVWSUxHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNaMEpCUVdkQ0xFTkJRVU1zVlVGQlZTeEZRVUZGTEZWQlFVTXNRMEZCUXl4RlFVRkxPenRCUVVVdlF5eGxRVUZKTEVsQlFVa3NSMEZCUnl4TlFVRkxMRXRCUVVzc1EwRkJReXhOUVVGTExHTkJRV01zUTBGQlF5eERRVUZETzBGQlF6TkRMR1ZCUVVrc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF6dEJRVU5XTEdsQ1FVRkxMRmRCUVZjc1IwRkJSeXhMUVVGTExFTkJRVU03UVVGRGVrSXNhVUpCUVVzc1kwRkJZeXhIUVVGSExFdEJRVXNzUTBGQlF6dEJRVU0xUWl4WlFVRkRMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU03UVVGRGJrSXNXVUZCUXl4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8xVkJRM0pDTEVOQlFVTXNRMEZCUXp0UlFVVktPenRCUVZWSExGTkJRVWs3T3pzN096czdXVUZLUVN4WlFVRkhPMEZCUTFRc1owSkJRVThzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNN1VVRkRla0k3V1VGRlR5eFZRVUZETEVOQlFVTXNSVUZCUlR0QlFVTldMR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTnlRaXhoUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZGTEVOQlFVTTdRVUZEWWl4aFFVRkpMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU03UVVGRGRFSXNZVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8xRkJRMlk3TzBGQlZVY3NXVUZCVHpzN096czdPenRaUVVwQkxGbEJRVWM3UVVGRFdpeG5Ra0ZCVHl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF6dFJRVU0xUWp0WlFVVlZMRlZCUVVNc1EwRkJReXhGUVVGRk8wRkJRMklzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4UFFVRlBMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRM2hDTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU55UWl4aFFVRkpMRU5CUVVNc1MwRkJTeXhGUVVGRkxFTkJRVU03UVVGRFlpeGhRVUZKTEVOQlFVTXNZMEZCWXl4RlFVRkZMRU5CUVVNN1FVRkRkRUlzWVVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMUZCUTJZN096czdWVUZxVW10Q0xGTkJRVk03U1VGQlV5eFRRVUZUT3p0clFrRkJNMElzVTBGQlV5eERPenM3T3pzN1FVTTFTemxDTEdGQlFWa3NRMEZCUXpzN096czdPenM3UzBGRlRpeEpRVUZKTEhWRFFVRk5MRU5CUVdNN08wdEJRM2hDTEZGQlFWRXNkVU5CUVUwc1JVRkJiMEk3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN1MwRjFRbkJDTEUxQlFVMDdRVUZGWkN4WlFVWlJMRTFCUVUwc1EwRkZZaXhKUVVGSkxFVkJRVU1zVDBGQlR5eEZRVUZGT3pzN01rSkJSbEFzVFVGQlRUczdPMEZCU1haQ0xGTkJRVWtzUTBGQlF5eFBRVUZQTEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTJ4Q0xGTkJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RlFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE96dEJRVVV4UWl4VFFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSE8wRkJRMW9zVjBGQlNTeEZRVUZGTEZWQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1JVRkJTenRCUVVOeVFpeGxRVUZMTEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEUxQlFVc3NUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBGQlEzWkVMR0ZCUVVrc1RVRkJTeXhGUVVGRkxFVkJRVVU3UVVGQlJTeHBRa0ZCU3l4RlFVRkZMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VlVGQlJUdEJRVU5zUXl4blFrRkJUeXhOUVVGTExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRSUVVOc1F6dEJRVU5FTEZWQlFVY3NSVUZCUlN4WlFVRk5PMEZCUTFRc1pVRkJTeXhQUVVGUExFTkJRVU1zVlVGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkxPMEZCUVVVc2FVSkJRVXNzVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VlVGQlJTeERRVUZETEVOQlFVTTdRVUZEYkVRc1lVRkJTU3hOUVVGTExFVkJRVVVzUlVGQlJUdEJRVUZGTEdsQ1FVRkxMRVZCUVVVc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFZRVUZGTzFGQlEyNURPMEZCUTBRc1ZVRkJSeXhGUVVGRkxGVkJRVU1zUjBGQlJ5eEZRVUZMTzBGQlExb3NZMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZETEUxQlFVc3NUMEZCVHl4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8wRkJRMnBETEdsQ1FVRkxMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEZRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMVZCUTNwQ08wRkJRMFFzWVVGQlNTeE5RVUZMTEVWQlFVVXNSVUZCUlR0QlFVRkZMR2xDUVVGTExFVkJRVVVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0VlFVRkZPMUZCUTI1RE8wRkJRMFFzWVVGQlRTeEZRVUZGTEZWQlFVTXNUVUZCVFN4RlFVRkxPMEZCUTJ4Q0xHTkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJReXhOUVVGTExFbEJRVWtzUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlR0QlFVTTVRaXhwUWtGQlN5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFZRVU0xUWp0QlFVTkVMR0ZCUVVrc1RVRkJTeXhGUVVGRkxFVkJRVVU3UVVGQlJTeHBRa0ZCU3l4RlFVRkZMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VlVGQlJUdFJRVU51UXp0TlFVTkdMRU5CUVVNN08wRkJSVVlzVTBGQlNTeERRVUZETEVkQlFVY3NSMEZCUnp0QlFVTlVMRmRCUVVrc1JVRkJSU3hWUVVGRExFMUJRVTBzUlVGQlJTeEhRVUZITEVWQlFVVXNTMEZCU3l4RlFVRkxPMEZCUXpWQ0xHVkJRVXNzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFdEJRVXNzUTBGQlF6dEJRVU5zUXl4aFFVRkpMRTFCUVVzc1JVRkJSU3hGUVVGRk8wRkJRVVVzYVVKQlFVc3NSVUZCUlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8xVkJRVVU3VVVGRGJrTTdRVUZEUkN4VlFVRkhMRVZCUVVVc1ZVRkJReXhOUVVGTkxFVkJRVXM3T3p0QlFVZG1MR1ZCUVVzc1QwRkJUeXhIUVVGSExFMUJRVTBzUTBGQlF6dEJRVU4wUWl4aFFVRkpMRTFCUVVzc1JVRkJSU3hGUVVGRk8wRkJRVVVzYVVKQlFVc3NSVUZCUlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8xVkJRVVU3VVVGRGJrTTdRVUZEUkN4VlFVRkhMRVZCUVVVc1ZVRkJReXhIUVVGSExFVkJRVU1zVFVGQlRTeEZRVUZMT3p0QlFVVnVRaXhsUVVGTExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNN1FVRkRNMElzWVVGQlNTeE5RVUZMTEVWQlFVVXNSVUZCUlR0QlFVRkZMR2xDUVVGTExFVkJRVVVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0VlFVRkZPMUZCUTI1RE8wRkJRMFFzWVVGQlRTeEZRVUZGTEZWQlFVTXNUVUZCVFN4RlFVRkRMRTFCUVUwc1JVRkJTenM3UVVGRmVrSXNaVUZCU3l4UFFVRlBMRU5CUVVNc1QwRkJUeXhEUVVGRExGVkJRVU1zUjBGQlJ5eEZRVUZETEVOQlFVTXNSVUZCU3p0QlFVTTVRaXhwUWtGQlN5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMVZCUTNKRExFTkJRVU1zUTBGQlF6dEJRVU5JTEdGQlFVa3NUVUZCU3l4RlFVRkZMRVZCUVVVN1FVRkJSU3hwUWtGQlN5eEZRVUZGTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1ZVRkJSVHRSUVVOdVF6dE5RVU5HTEVOQlFVTTdPMEZCUlVZc1UwRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ6czdPMEZCUjFvc1ZVRkJSeXhGUVVGRkxGVkJRVU1zVFVGQlRTeEZRVUZMTzBGQlEyWXNZVUZCU1N4RFFVRkRMRTFCUVUwc1NVRkJTU3hOUVVGTkxFdEJRVWNzUTBGQlF5eEZRVUZGTzBGQlEzcENMR2xDUVVGTkxFZEJRVWNzUTBGQlF5eERRVUZETzFWQlExbzdRVUZEUkN4bFFVRk5MRWxCUVVrc1RVRkJTeXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRPMEZCUTJwRExHRkJRVWtzVFVGQlRTeEhRVUZITEVOQlFVTXNSVUZCUlR0QlFVTmtMR2xDUVVGTkxFZEJRVWNzVFVGQlN5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hIUVVGSExFMUJRVTBzUTBGQlF6dFZRVU14UXp0QlFVTkVMR05CUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUXl4TlFVRkxMRWxCUVVrc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdEJRVU01UWl4bFFVRkpMRWRCUVVjc1IwRkJSeXhOUVVGTExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVVc1RVRkJTeXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1JVRkJSU3hOUVVGTkxFTkJRVVVzUTBGQlF6dEJRVU0xUlN4cFFrRkJTeXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRTFCUVUwc1EwRkJSU3hOUVVGTExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUlN4RFFVRkRPMVZCUTJwRU8wRkJRMFFzWVVGQlNTeE5RVUZMTEVWQlFVVXNSVUZCUlR0QlFVRkZMR2xDUVVGTExFVkJRVVVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0VlFVRkZPMUZCUTI1RE8wRkJRMFFzVlVGQlJ5eEZRVUZGTEZWQlFVTXNSMEZCUnl4RlFVRkRMRTFCUVUwc1JVRkJTenRCUVVOdVFpeGhRVUZKTEVOQlFVTXNUVUZCVFN4SlFVRkpMRTFCUVUwc1MwRkJSeXhEUVVGRExFVkJRVVU3UVVGRGVrSXNhVUpCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU03VlVGRFdqdEJRVU5FTEdWQlFVMHNTVUZCU1N4TlFVRkxMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZEYWtNc1lVRkJTU3hOUVVGTkxFZEJRVWNzUTBGQlF5eEZRVUZGTzBGQlEyUXNhVUpCUVUwc1IwRkJSeXhOUVVGTExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1RVRkJUU3hEUVVGRE8xVkJRekZETzBGQlEwUXNZVUZCU1N4SFFVRkhMRWRCUVVjc1RVRkJTeXhQUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkZMRTFCUVVzc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEUxQlFVMHNSMEZCUnl4TlFVRk5MRVZCUVVVc1RVRkJUU3hEUVVGRkxFTkJRVU03UVVGRGFFWXNaVUZCU3l4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETEUxQlFVMHNRMEZCUlN4TlFVRkxMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlJTeERRVUZETzBGQlEzQkVMR0ZCUVVrc1RVRkJTeXhGUVVGRkxFVkJRVVU3UVVGQlJTeHBRa0ZCU3l4RlFVRkZMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VlVGQlJUdFJRVU51UXp0QlFVTkVMR0ZCUVUwc1JVRkJSU3hWUVVGRExFMUJRVTBzUlVGQlJTeE5RVUZOTEVWQlFVczdRVUZETVVJc1lVRkJTU3hEUVVGRExFMUJRVTBzU1VGQlNTeE5RVUZOTEV0QlFVY3NRMEZCUXl4RlFVRkZPMEZCUTNwQ0xHbENRVUZOTEVkQlFVY3NRMEZCUXl4RFFVRkRPMVZCUTFvN1FVRkRSQ3hsUVVGTkxFbEJRVWtzVFVGQlN5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRPMEZCUXpsQ0xHRkJRVWtzVFVGQlRTeEhRVUZITEVOQlFVTXNSVUZCUlR0QlFVTmtMR2xDUVVGTkxFZEJRVWNzVFVGQlN5eFBRVUZQTEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJRenRWUVVOMlF6dEJRVU5FTEdGQlFVa3NTMEZCU3l4SFFVRkhMRVZCUVVVc1EwRkJRenRCUVVObUxHVkJRVXNzVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkRMRWRCUVVjc1JVRkJTenRCUVVNMVFpeG5Ra0ZCU3l4RFFVRkRMRWxCUVVrc1EwRkJSU3hIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVVXNRMEZCUXp0VlFVTXpRaXhEUVVGRExFTkJRVU03UVVGRFNDeGhRVUZKTEVkQlFVY3NSMEZCUnl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRkxFdEJRVXNzUTBGQlF5eE5RVUZOTEVkQlFVY3NUVUZCVFN4RlFVRkZMRTFCUVUwc1EwRkJSU3hEUVVGRE8wRkJRM2hFTEdOQlFVc3NSMEZCUnl4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRkxFdEJRVXNzUTBGQlJTeERRVUZETzBGQlF6VkNMR1ZCUVVzc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eFZRVUZETEVkQlFVY3NSVUZCUXl4RFFVRkRMRVZCUVVzN1FVRkRPVUlzWTBGQlJ5eERRVUZETEUxQlFVMHNRMEZCUXl4SFFVRkhMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFZRVU40UWl4RFFVRkRMRU5CUVVNN1FVRkRTQ3hoUVVGSkxFMUJRVXNzUlVGQlJTeEZRVUZGTzBGQlFVVXNhVUpCUVVzc1JVRkJSU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFWQlFVVTdVVUZEYmtNN1RVRkRSaXhEUVVGRE96czdPenRCUVV0R0xGTkJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVYzdRVUZEWkN4VlFVRkhMRVZCUVVVc1ZVRkJReXhKUVVGSkxFVkJRVXM3UVVGRFlpeGhRVUZKTEZsQlFWa3NSMEZCUnl4SlFVRkpMRkZCUVZFc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6dEJRVU4wUXl4bFFVRkxMRTlCUVU4c1EwRkJReXhWUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVWQlFVczdRVUZEY0VJc2FVSkJRVXNzVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRExFTkJRVU03VlVGRGNrUXNRMEZCUXl4RFFVRkRPenM3T3p0QlFVdElMR0ZCUVVrc1RVRkJTeXhGUVVGRkxFVkJRVVU3UVVGQlJTeHBRa0ZCU3l4RlFVRkZMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03VlVGQlJUdFJRVU51UXp0QlFVTkVMRlZCUVVjc1JVRkJSU3haUVVGclFqdGhRVUZxUWl4SFFVRkhMR2REUVVGRExFTkJRVU03WVVGQlF5eEpRVUZKTEdkRFFVRkRMRU5CUVVNN08wRkJRMmhDTEdGQlFVa3NXVUZCV1N4SFFVRkhMRWxCUVVrc1VVRkJVU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzBGQlEzUkRMR1ZCUVVzc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkRMRWxCUVVrc1JVRkJReXhEUVVGRExFVkJRVXM3UVVGRGNFTXNhVUpCUVVzc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRMRU5CUVVNN1ZVRkRka1FzUTBGQlF5eERRVUZETzBGQlEwZ3NZVUZCU1N4TlFVRkxMRVZCUVVVc1JVRkJSVHRCUVVGRkxHbENRVUZMTEVWQlFVVXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRWUVVGRk8xRkJRMjVETzBGQlEwUXNZVUZCVFN4RlFVRkZMRmxCUVhGQ08yRkJRWEJDTEUxQlFVMHNaME5CUVVNc1EwRkJRenRoUVVGRExFbEJRVWtzWjBOQlFVTXNRMEZCUXpzN1FVRkRkRUlzWVVGQlNTeFpRVUZaTEVkQlFVY3NTVUZCU1N4UlFVRlJMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03UVVGRGRFTXNaVUZCU3l4UFFVRlBMRU5CUVVNc1QwRkJUeXhEUVVGRExGVkJRVU1zUjBGQlJ5eEZRVUZETEVOQlFVTXNSVUZCU3p0QlFVTTVRaXhwUWtGQlN5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU1zUTBGQlF6dFZRVU14UkN4RFFVRkRMRU5CUVVNN1FVRkRTQ3hoUVVGSkxFMUJRVXNzUlVGQlJTeEZRVUZGTzBGQlFVVXNhVUpCUVVzc1JVRkJSU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFWQlFVVTdVVUZEYmtNN1RVRkRSaXhEUVVGRE96czdRVUZIUml4VFFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSE8wRkJRMWdzVlVGQlJ5eEZRVUZGTEZsQlFVMDdRVUZEVkN4bFFVRkxMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEYWtJN1FVRkRSQ3hWUVVGSExFVkJRVVVzVlVGQlF5eEhRVUZITEVWQlFVczdRVUZEV2l4bFFVRkxMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTNKQ08wRkJRMFFzWVVGQlRTeEZRVUZGTEZWQlFVTXNUVUZCVFN4RlFVRkxPMEZCUTJ4Q0xHVkJRVXNzUjBGQlJ5eERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRE0wSTdUVUZEUml4RFFVRkRPenM3U1VGSFNEczdaMEpCZGtwclFpeE5RVUZOTzBGQk1FcDZRaXhYUVVGTk8yTkJRVUVzWjBKQlFVTXNTVUZCU1N4RlFVRkRMRTlCUVU4c1JVRkJSVHM3TzBGQlEyNUNMR0ZCUVVrc1EwRkJReXhQUVVGUExFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEyeENMR05CUVUwc1NVRkJTU3hIUVVGSExFZEJRVU1zUTBGQlF5eEZRVUZGTEVkQlFVY3NSMEZCUnl4SlFVRkpMRVZCUVVVc1IwRkJSeXhGUVVGRkxFVkJRVWM3UVVGRGJrTXNaVUZCU1N4SFFVRkhMRWRCUVVjc1NVRkJTU3hMUVVGTExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdRVUZETjBJc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1ZVRkRlRUk3UVVGRFJDeGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRlZCUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUlVGQlN6dEJRVUZGTEdsQ1FVRkxMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4TFFVRkxMRU5CUVVNN1ZVRkJSU3hEUVVGRExFTkJRVU03VVVGRGVFUTdPMEZCUlVRc1dVRkJUenRqUVVGQkxHbENRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVN1FVRkRZaXhoUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdRVUZEVml4alFVRk5MRWxCUVVrc1IwRkJSeXhIUVVGRExFTkJRVU1zUlVGQlJTeEhRVUZITEVkQlFVY3NTVUZCU1N4RFFVRkRMRWxCUVVrc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJ6dEJRVU40UXl4bFFVRkpMRVZCUVVVc1JVRkJSVHRCUVVGRkxHVkJRVVVzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0WlFVRkZPMEZCUTNCQ0xHZENRVUZOTEVsQlFVa3NUVUZCVFN4SFFVRkRMRU5CUVVNc1JVRkJSU3hOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEU5QlFVOHNSVUZCUlN4TlFVRk5MRVZCUVVVc1JVRkJSenRCUVVOd1JDeGpRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkRMRTFCUVUwc1JVRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU5vUWl4alFVRkRMRVZCUVVVc1EwRkJRenRaUVVOTU8xVkJRMFk3VVVGRFJqczdRVUZGUkN4cFFrRkJXVHRqUVVGQkxIZENRVUZIT3pzN1FVRkRZaXhoUVVGSkxHRkJRV0VzUjBGQlJ5eEZRVUZGTEVOQlFVTTdRVUZEZGtJc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGRFZpeFZRVUZETEVOQlFVTXNSVUZCUXl4RFFVRkRMRVZCUVVzN1FVRkJSU3gzUWtGQllTeEpRVUZKTEVOQlFVTXNUVUZCU3l4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hIUVVGSExFTkJRVU03VlVGQlJTeEZRVU5xUlN4WlFVRk5PMEZCUVVVc2QwSkJRV0VzU1VGQlNTeEpRVUZKTEVOQlFVTTdWVUZCUlN4RFFVTnFReXhEUVVGRE8wRkJRMFlzWjBKQlFVOHNZVUZCWVN4RFFVRkRPMUZCUTNSQ096dEJRVVZFTEZGQlFVYzdZMEZCUVN4bFFVRkhPMEZCUTBvc1owSkJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1JVRkJSU3hEUVVGRExFTkJRVU03VVVGRGJFTTdPMEZCUlVRc1YwRkJUVHRqUVVGQkxHZENRVUZETEU5QlFVOHNSVUZCUlR0QlFVTmtMR0ZCUVVrc1EwRkJReXhQUVVGUExFZEJRVWNzVDBGQlR5eEpRVUZKTEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNN1VVRkRlRU03TzBGQlJVY3NWMEZCVFR0WlFVRkJMRmxCUVVjN1FVRkRXQ3huUWtGQlR5eEpRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU03VVVGREwwSTdPMEZCUlVRc1YwRkJUVHRqUVVGQkxHZENRVUZETEV0QlFVc3NSVUZCUlRzN1FVRkZXaXhuUWtGQlR6dEJRVU5NTEdOQlFVY3NSVUZCUlN4RlFVRkRMRVZCUVVjc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVVTdRVUZETDBJc2FVSkJRVTBzUlVGQlJTeExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTlCUVU4N1ZVRkROMElzUTBGQlF6dFJRVU5JT3p0QlFVVkVMRmxCUVU4N1kwRkJRU3hwUWtGQlF5eEhRVUZITEVWQlFVTXNUVUZCVFN4RlFVRkZPMEZCUTJ4Q0xHZENRVUZQTEUxQlFVMHNSMEZCUnl4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF6czdVVUZGY0VNN08wRkJSVVFzVVVGQlJ6czdPenM3T3pzN096czdWVUZCUVN4VlFVRkRMRWRCUVVjc1JVRkJSVHRCUVVOUUxHRkJRVWtzU1VGQlNTeEhRVUZITEVWQlFVVXNRMEZCUXp0QlFVTmtMR05CUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEycERMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTTdWVUZEZEVNN1FVRkRSQ3huUWtGQlR5eEpRVUZKTEVOQlFVTTdVVUZEWWpzN1FVRkZSQ3hYUVVGTk96czdPenM3T3pzN096dFZRVUZCTEZWQlFVTXNUVUZCVFN4RlFVRkZPMEZCUTJJc1lVRkJTU3hKUVVGSkxFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEyUXNZMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3UVVGRE9VSXNaVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0VlFVTTFRenRCUVVORUxHZENRVUZQTEVsQlFVa3NRMEZCUXp0UlFVTmlPenRCUVV0SExGTkJRVWs3V1VGSVFTeFpRVUZITzBGQlExUXNaMEpCUVU4c1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTTdVVUZETlVJN1dVRkRUeXhWUVVGRExFTkJRVU1zUlVGQlJUczdPMEZCUTFZc1lVRkJTU3hSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGNrTXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFVkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUXpWQ0xHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNWVUZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhGUVVGTE8wRkJRM0JDTEdWQlFVa3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSVHRCUVVOcVF5eHRRa0ZCU3l4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFsQlEzSkRPMVZCUTBZc1EwRkJReXhEUVVGRE8xRkJRMG83TzBGQlMwY3NXVUZCVHp0WlFVaEJMRmxCUVVjN1FVRkRXaXhuUWtGQlR5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF6dFJRVU12UWp0WlFVTlZMRlZCUVVNc1EwRkJReXhGUVVGRk96czdRVUZEWWl4aFFVRkpMRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOeVF5eGhRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEZWtJc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFZRVUZETEVOQlFVTXNSVUZCUXl4RFFVRkRMRVZCUVVzN1FVRkRjRUlzWlVGQlNTeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZPMEZCUTJwRExHMUNRVUZMTEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGNrTTdWVUZEUml4RFFVRkRMRU5CUVVNN1VVRkRTanM3T3p0VlFYaFFhMElzVFVGQlRUczdPMnRDUVVGT0xFMUJRVTBzUXpzN096czdPMEZETVVJelFpeGhRVUZaTEVOQlFVTTdPenM3T3pzN08wdEJSVTRzU1VGQlNTeDFRMEZCVFN4RFFVRmpPenRMUVVONFFpeExRVUZMTEhWRFFVRk5MRVZCUVZNN08wdEJSVTRzVVVGQlVUdEJRVVZrTEZsQlJrMHNVVUZCVVN4SFFVVjFRenRUUVVGd1JDeFJRVUZSTEdkRFFVRkhMRU5CUVVNc1EwRkJReXhGUVVGRExFVkJRVVVzUlVGQlF5eEZRVUZGTEVWQlFVTXNSVUZCUlN4RFFVRkRPMU5CUVVVc1NVRkJTU3huUTBGQlF5eEpRVUZKTzFOQlFVVXNVVUZCVVN4blEwRkJReXhMUVVGTE96c3lRa0ZHTjBNc1VVRkJVVHM3UVVGSGNrSXNVMEZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhSUVVGUkxFTkJRVU03UVVGRGRrSXNVMEZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4RlFVRkZPMEZCUXk5Q0xGZEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03VFVGRE4wSTdRVUZEUkN4VFFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF6dEJRVU5zUWl4VFFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExGRkJRVkVzUTBGQlF6czdRVUZGZWtJc1UwRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJ5eEpRVUZKTEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN08wRkJSWFJFTEZOQlFVa3NRMEZCUXl4WFFVRlhMRWRCUVVjN1FVRkRha0lzVjBGQlRTeERRVUZETzBGQlExQXNZVUZCVVN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETzBGQlF6bENMR05CUVZNc1JVRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOcVF5eGxRVUZWTEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTTdUVUZEZEVNc1EwRkJRenM3UVVGRlJpeFRRVUZKTEVsQlFVa3NRMEZCUXl4UlFVRlJMRXRCUVVjc1MwRkJTeXhGUVVGRk8wRkJRM3BDTEZkQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0TlFVTTVRaXhOUVVGTk8wRkJRMHdzVjBGQlNTeERRVUZETEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRE8wMUJRM2hDTzBsQlIwbzdPMmRDUVRGQ1owSXNVVUZCVVR0QlFXZERja0lzVTBGQlNUdFpRVXBCTEZsQlFVYzdRVUZEVkN4blFrRkJUeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETzFGQlEyNUNPMWxCUlU4c1ZVRkJReXhKUVVGSkxFVkJRVVU3UVVGRFdDeGhRVUZKTEVWQlFVVXNTVUZCU1N4TFFVRkxMRWxCUVVrc1NVRkJTU3hKUVVGSkxFdEJRVXNzVFVGQlRTeEpRVUZKTEVsQlFVa3NTMEZCU3l4UlFVRlJMRWxCUVVrc1NVRkJTU3hMUVVGTExFOUJRVThzUTBGQlF5eEZRVUZGTzBGQlF6bEZMR3RDUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEN0RVFVRXJSQ3hEUVVGRExFTkJRVU03UVVGREwwVXNhMEpCUVU4N1ZVRkRWanRCUVVORUxHRkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUTJ4Q0xHRkJRVWtzU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUlR0QlFVTnFRaXhsUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03VlVGRE9VSTdVVUZEU2pzN1FVRk5SeXhWUVVGTE8xbEJTa0VzV1VGQlJ6dEJRVU5XTEdkQ1FVRlBMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMUZCUTI1RE8xbEJSVkVzVlVGQlF5eERRVUZETEVWQlFVVTdRVUZEV0N4aFFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM2hET3p0QlFVVkVMRlZCUVVzN1kwRkJRU3hwUWtGQlJ6dEJRVU5PTEdGQlFVa3NTVUZCU1N4RFFVRkRMRkZCUVZFc1MwRkJSeXhMUVVGTExFVkJRVVU3UVVGRGVrSXNaVUZCU1N4RFFVRkRMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUXpkQ0xHdENRVUZQTEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenRWUVVOd1FqdEJRVU5FTEdGQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1FVRkROME1zWVVGQlNTeERRVUZETEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlF6ZENMR2RDUVVGUExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTTdVVUZEYmtJN08wRkJSVVFzVDBGQlJUdGpRVUZCTEdOQlFVYzdRVUZEU0N4aFFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRkxFTkJRVU03UVVGRGFFSXNZVUZCU1N4RFFVRkRMRkZCUVZFc1NVRkJTU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXp0QlFVTndReXhuUWtGQlR5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMUZCUTI1Q096dEJRVVZFTEZOQlFVazdZMEZCUVN4blFrRkJSenRCUVVOTUxHRkJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVVXNRMEZCUXp0QlFVTm9RaXhoUVVGSkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NRMEZCUXl4RlFVRkZPMEZCUTNKQ0xHVkJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4SlFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETzFWQlF6TkZPMEZCUTBRc1owSkJRVThzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXp0UlFVTnVRanM3UVVGRlJDeFhRVUZOTzJOQlFVRXNhMEpCUVVjN1FVRkRVQ3hoUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1FVRkRMME1zWjBKQlFVOHNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJRenRSUVVOdVFqczdRVUZGUkN4VlFVRkxPMk5CUVVFc2FVSkJRVWM3UVVGRFRpeGhRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkRMRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXp0QlFVTjRReXhoUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRE8wRkJRM0pETEdGQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXp0QlFVTjBReXhuUWtGQlR5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMUZCUTI1Q096czdPenM3TzBGQlFVRTdPenM3VlVGeVJtZENMRkZCUVZFN096dHJRa0ZCVWl4UlFVRlJMRU03T3pzN096dEJRMHczUWl4aFFVRlpMRU5CUVVNN096czdPenM3TzB0QlJVNHNTVUZCU1N4MVEwRkJUU3hEUVVGak96dExRVVZXTEV0QlFVczdRVUZGV0N4alFVWk5MRXRCUVVzc1IwRkZjME03WVVGQmFFUXNSMEZCUnl4blEwRkJReXhEUVVGRE8yRkJRVVVzUjBGQlJ5eG5RMEZCUXl4RFFVRkRPMkZCUVVVc1MwRkJTeXhuUTBGQlF5eERRVUZETzJGQlFVVXNVMEZCVXl4blEwRkJReXhEUVVGRE8yRkJRVVVzU1VGQlNTeG5RMEZCUXl4TFFVRkxPenNyUWtGR2VrTXNTMEZCU3pzN1FVRkhiRUlzWVVGQlNTeERRVUZETEVkQlFVY3NSMEZCUnl4SFFVRkhMRU5CUVVNN1FVRkRaaXhoUVVGSkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXp0QlFVTm1MR0ZCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUzBGQlN5eERRVUZETzBGQlEyNUNMR0ZCUVVrc1EwRkJReXhUUVVGVExFZEJRVWNzVTBGQlV5eERRVUZETzBGQlF6TkNMR0ZCUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETzAxQlEzQkNPenRyUWtGU1owSXNTMEZCU3p0QlFWVjBRaXhoUVVGSk8yOUNRVUZCTEdkQ1FVRkhPMEZCUTBnc2NVSkJRVWtzUTBGQlF5eExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNVMEZCVXl4RlFVRkZMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dEJRVU0zUkN4eFFrRkJTU3hKUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRVZCUVVVN1FVRkRka0lzZVVKQlFVa3NTVUZCU1N4RFFVRkRMRWxCUVVrc1JVRkJSVHRCUVVOWUxEWkNRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU03YzBKQlEzcENMRTFCUVUwN1FVRkRTQ3cyUWtGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTTdjMEpCUXpGRE8ydENRVU5LT3p0QlFVVkVMSEZDUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1JVRkJSVHRCUVVOMlFpeDVRa0ZCU1N4SlFVRkpMRU5CUVVNc1NVRkJTU3hGUVVGRk8wRkJRMWdzTmtKQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF6dHpRa0ZEZWtJc1RVRkJUVHRCUVVOSUxEWkNRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFZEJRVWNzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXp0elFrRkRNVU03YTBKQlEwbzdRVUZEUkN4M1FrRkJUeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETzJOQlEzSkNPenM3TzFsQk5VSm5RaXhMUVVGTE96czdhMEpCUVV3c1MwRkJTeXhET3pzN096czdRVU5LTVVJc1lVRkJXU3hEUVVGRE96czdPenM3T3p0TFFVVk9MRWxCUVVrc2RVTkJRVTBzUTBGQll6czdTMEZEZUVJc1MwRkJTeXgxUTBGQlRTeEZRVUZUT3p0TFFVVk9MRTlCUVU4N1FVRkZZaXhqUVVaTkxFOUJRVThzUjBGRk1rSTdZVUZCZGtNc1IwRkJSeXhuUTBGQlF5eERRVUZETzJGQlFVVXNSMEZCUnl4blEwRkJReXhGUVVGRk8yRkJRVVVzU1VGQlNTeG5RMEZCUXl4SlFVRkpPMkZCUVVVc1MwRkJTeXhuUTBGQlF5eExRVUZMT3pzclFrRkdhRU1zVDBGQlR6czdRVUZIY0VJc1lVRkJTU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEhRVUZITEVOQlFVTTdRVUZEWml4aFFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGSExFZEJRVWNzUTBGQlF6dEJRVU5tTEdGQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1MwRkJTeXhEUVVGRE8wRkJRMjVDTEdGQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRE8wRkJRMnBDTEdGQlFVa3NRMEZCUXl4VFFVRlRMRWRCUVVjc1NVRkJTU3hMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NSVUZCUlN4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGREwwTXNZVUZCU1N4SlFVRkpMRU5CUVVNc1MwRkJTeXhMUVVGSExFdEJRVXNzUlVGQlJUdEJRVU4wUWl4cFFrRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8xVkJRemxDTEUxQlFVMDdRVUZEVEN4cFFrRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMVZCUTNoQ08wMUJRMG83TzJ0Q1FXSm5RaXhQUVVGUE8wRkJNRUp3UWl4aFFVRkpPMnRDUVZoQkxGVkJRVU1zU1VGQlNTeEZRVUZGTzBGQlExZ3NjVUpCUVVrc1JVRkJSU3hKUVVGSkxFdEJRVXNzU1VGQlNTeEpRVUZKTEVsQlFVa3NTMEZCU3l4TlFVRk5MRWxCUVVrc1NVRkJTU3hMUVVGTExGRkJRVkVzU1VGQlNTeEpRVUZKTEV0QlFVc3NUMEZCVHl4RFFVRkRMRVZCUVVVN1FVRkRPVVVzTkVKQlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc0swUkJRU3RFTEVOQlFVTXNRMEZCUXp0QlFVTXZSU3cwUWtGQlR6dHJRa0ZEVmp0QlFVTkVMSEZDUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXp0QlFVTnNRaXh4UWtGQlNTeEpRVUZKTEVOQlFVTXNTMEZCU3l4RlFVRkZPMEZCUTJRc2VVSkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dHJRa0ZET1VJN1kwRkRTanRyUWtGRlR5eFpRVUZITzBGQlExQXNkMEpCUVU4c1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dGpRVU55UWpzN1FVRkZSQ3hqUVVGTE8yOUNRVUZCTEdsQ1FVRkhPMEZCUTA0c2NVSkJRVWtzU1VGQlNTeERRVUZETEV0QlFVc3NTMEZCUnl4TFFVRkxMRVZCUVVVN1FVRkRkRUlzZVVKQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTTNRaXcwUWtGQlR5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN2EwSkJRM0JDTzBGQlEwUXNjVUpCUVVrc1EwRkJReXhYUVVGWExFZEJRVWM3UVVGRGFrSXNlVUpCUVUwc1NVRkJTU3hEUVVGRExFZEJRVWM3UVVGRFpDd3lRa0ZCVVN4SlFVRkpMRU5CUVVNc1IwRkJSenRCUVVOb1FpdzBRa0ZCVXl4RlFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU03UVVGRE1VTXNOa0pCUVZVc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU03YTBKQlEzSkRMRU5CUVVNN1FVRkRSaXh4UWtGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTXhReXh4UWtGQlNTeERRVUZETEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlF6ZENMSGRDUVVGUExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTTdZMEZEYmtJN08wRkJSVVFzVjBGQlJUdHZRa0ZCUVN4alFVRkhPMEZCUTBRc2NVSkJRVWtzUTBGQlF5eExRVUZMTEVWQlFVVXNRMEZCUXp0QlFVTmlMSEZDUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRMRWRCUVVjc1JVRkJSVHRCUVVONFFpeDVRa0ZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETzJ0Q1FVTjZRanRCUVVORUxIZENRVUZQTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNN1kwRkRja0k3TzBGQlJVUXNZVUZCU1R0dlFrRkJRU3huUWtGQlJ6dEJRVU5JTEhGQ1FVRkpMRU5CUVVNc1MwRkJTeXhGUVVGRkxFTkJRVU03UVVGRFlpeHhRa0ZCU1N4SlFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVWQlFVVTdRVUZEZGtJc2VVSkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJRenRyUWtGRGVrSTdRVUZEUkN4M1FrRkJUeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETzJOQlEzSkNPenRCUVVWRUxHVkJRVTA3YjBKQlFVRXNhMEpCUVVjN1FVRkRUQ3h4UWtGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVWQlFVVXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRM3BETEhkQ1FVRlBMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU03WTBGRGNrSTdPMEZCUlVRc1kwRkJTenR2UWtGQlFTeHBRa0ZCUnp0QlFVTktMSEZDUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETEVkQlFVY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRE8wRkJRemxDTEhGQ1FVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExFZEJRVWNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRPMEZCUXpsQ0xIRkNRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETzBGQlEyeERMSEZDUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03UVVGRGJrTXNkMEpCUVU4c1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dGpRVU55UWpzN096dFpRWHBGWjBJc1QwRkJUenM3TzJ0Q1FVRlFMRTlCUVU4c1F6czdPenM3TzBGRFREVkNMR0ZCUVZrc1EwRkJRenM3T3pzN096czdPenM3TzBGQlJXSXNTMEZCU1N4SFFVRkhMRWRCUVVjc2JVSkJRVThzUTBGQlF5eERRVUZoTEVOQlFVTXNRMEZCUXp0QlFVTnFReXhMUVVGSkxFbEJRVWtzUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRU5CUVdNc1EwRkJReXhEUVVGRE8wRkJRMjVETEV0QlFVa3NVMEZCVXl4SFFVRkhMRzFDUVVGUExFTkJRVU1zUTBGQmJVSXNRMEZCUXl4RFFVRkRPMEZCUXpkRExFdEJRVWtzU1VGQlNTeEhRVUZITEcxQ1FVRlBMRU5CUVVNc1JVRkJaMElzUTBGQlF5eERRVUZET3p0TFFVTjZRaXhYUVVGWExDdERRVUZOTEVWQlFYRkNPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3p0TFFYbEROMElzUzBGQlN6dEJRVVZpTEZsQlJsRXNTMEZCU3l4SFFVVldPekpDUVVaTExFdEJRVXM3TzBGQlNYUkNMRk5CUVVrc1QwRkJUeXhIUVVGSExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdPMEZCUlhoQ0xGTkJRVWtzVVVGQlVTeEhRVUZITzBGQlEySXNZVUZCVVN4RFFVRkRMRWRCUVVjc1JVRkJReXhIUVVGSExFTkJRVU03UVVGRGFrSXNZMEZCVXl4SFFVRkhPMEZCUTFvc1lVRkJVU3hWUVVGVk8wRkJRMnhDTEdsQ1FVRlpMRU5CUTFZc1EwRkJReXhIUVVGSExFVkJRVU1zUjBGQlJ5eERRVUZETEVWQlExUXNRMEZCUXl4SlFVRkpMRVZCUVVNc1NVRkJTU3hEUVVGRExFVkJRMWdzUTBGQlF5eEhRVUZITEVWQlFVTXNSMEZCUnl4RFFVRkRMRVZCUTFRc1EwRkJReXhKUVVGSkxFVkJRVU1zU1VGQlNTeERRVUZETEVWQlExZ3NRMEZCUXl4SFFVRkhMRVZCUVVNc1IwRkJSeXhEUVVGRExFVkJRMVFzUTBGQlF5eEpRVUZKTEVWQlFVTXNTVUZCU1N4RFFVRkRMRVZCUTFnc1EwRkJReXhIUVVGSExFVkJRVU1zUjBGQlJ5eERRVUZETEVWQlExUXNRMEZCUXl4SlFVRkpMRVZCUVVNc1NVRkJTU3hEUVVGRExFTkJRMW83VFVGRFJpeERRVUZET3p0QlFVVkdMR2REUVhSQ2FVSXNTMEZCU3l3MlEwRnpRbWhDTEZOQlFWTXNSVUZCUXl4UFFVRlBMRVZCUVVNc1VVRkJVU3hGUVVGRk96dEJRVVZzUXl4VFFVRkpMRU5CUVVNc1MwRkJTeXhIUVVGSE8wRkJRMWdzVVVGQlF5eEZRVUZGTEVsQlFVa3NTVUZCU1N4RFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVkQlFVY3NRMEZCUXp0QlFVTjBRaXhSUVVGRExFVkJRVVVzU1VGQlNTeEpRVUZKTEVOQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFVkJRVU1zUjBGQlJ5eERRVUZETzAxQlEzWkNMRU5CUVVNN096czdPMEZCUzBZc1UwRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRWxCUVVrc1EwRkJRenM3UVVGRkwwSXNVMEZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSenRCUVVOa0xGRkJRVU1zUlVGQlJTeEpRVUZKTEZkQlFWY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUlVGQlF5eFpRVUZaTEVWQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU5vUml4UlFVRkRMRVZCUVVVc1NVRkJTU3hYUVVGWExFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1ZVRkJWU3hGUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1JVRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1RVRkRMMFVzUTBGQlF6dEJRVU5HTEZOQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhWUVVGVkxFTkJRVU03UVVGRGFFUXNVMEZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExGVkJRVlVzUTBGQlF6czdPenM3UVVGTGFFUXNVMEZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEZGQlFWRXNRMEZCUXpzN096czdRVUZMZGtNc1UwRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1EwRkJRenM3T3pzN1FVRkxha01zVTBGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4RlFVRkZMRU5CUVVNN08wRkJSV3BDTEZOQlFVa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJRenM3UVVGRldpeFRRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1FVRkRka0lzVTBGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMGxCUldZN08yRkJOMFJyUWl4TFFVRkxPenRuUWtGQlRDeExRVUZMTzBGQkswUjRRaXh0UWtGQll6dGpRVUZCTERCQ1FVRkhPenRCUVVWbUxHRkJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVRkRMRTFCUVUwc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6czdRVUZIYWtNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE96czdRVUZKY0VNc1lVRkJTU3hEUVVGRExHVkJRV1VzUjBGQlJ5eEZRVUZGTEVOQlFVTTdPMEZCUlRGQ0xHTkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNSVUZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSVHRCUVVOMlF5eGxRVUZKTEdOQlFXTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZET3p0QlFVVXhReXhsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NRMEZCUXl4alFVRmpMRU5CUVVNc1EwRkJRenM3UVVGRmVrTXNaVUZCU1N4RFFVRkRMR1ZCUVdVc1EwRkJReXhKUVVGSkxFTkJRVU1zWTBGQll5eERRVUZETEVOQlFVTTdWVUZETTBNN1VVRkZSanM3UVVGRlJDeHJRa0ZCWVR0alFVRkJMSGxDUVVGSE96dEJRVVZXTEdGQlFVa3NRMEZCUXl4aFFVRmhMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6czdRVUZGZEVRc1lVRkJTU3hEUVVGRExGVkJRVlVzUjBGQlJ6dEJRVU5vUWl4alFVRkhMRVZCUVVVc1JVRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eGhRVUZoTEVkQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGRGVFTXNRMEZCUXp0QlFVTkdMR0ZCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zUlVGQlJTeEhRVUZITEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF6czdRVUZGTjBNc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFZEJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZETVVNc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZETTBNc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhWUVVGVkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdPMEZCUldoRUxHTkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNSVUZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSVHRCUVVOMlF5eGxRVUZKTEdOQlFXTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6ZERMR1ZCUVVrc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRMMElzZVVKQlFXTXNRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGVFUXNlVUpCUVdNc1EwRkJReXhaUVVGWkxFTkJRVU1zU1VGQlNTeEZRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdRVUZEZWtRc2VVSkJRV01zUTBGQlF5eFpRVUZaTEVOQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhoUVVGaExFZEJRVU1zUlVGQlJTeEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpORUxIbENRVUZqTEVOQlFVTXNXVUZCV1N4RFFVRkRMR05CUVdNc1JVRkJSU3hIUVVGSExFTkJRVU1zUTBGQlF6dFZRVU5zUkRzN1FVRkZTQ3hoUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTNaRUxHRkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRVZCUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN096czdPMEZCUzNaRUxHRkJRVWtzUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0QlFVTjJRaXhoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZGYWtJN08wRkJSVVFzYlVKQlFXTTdZMEZCUVN3d1FrRkJSenM3UVVGRlppeGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhsUVVGbExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRkRVFzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1RVRkJUU3hGUVVGRkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNWMEZCVnl4RFFVRkRMRU5CUVVNN08wRkJSWGhFTEdOQlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUjBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1JVRkJReXhEUVVGRExFVkJRVVVzUlVGQlJUdEJRVU4yUXl4bFFVRkpMR05CUVdNc1IwRkJSeXhKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpkRExIbENRVUZqTEVOQlFVTXNXVUZCV1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMEZCUTNoRUxIbENRVUZqTEVOQlFVTXNXVUZCV1N4RFFVRkRMRkZCUVZFc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMVZCUXpORU8xRkJSVVk3TzBGQlJVUXNWMEZCVFR0alFVRkJMR3RDUVVGSE8wRkJRMUFzWVVGQlNTeERRVUZETEdWQlFXVXNSMEZCUnp0QlFVTnlRaXhaUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1ZVRkJWU3hIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTzBGQlEzWkRMRmxCUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExGVkJRVlVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFR0VlFVTjJSQ3hEUVVGRE96dEJRVVZHTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFbEJRVWtzUlVGQlF5eEpRVUZKTEVOQlFVTXNaVUZCWlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wRkJRM0JFTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFbEJRVWtzUlVGQlF5eEpRVUZKTEVOQlFVTXNaVUZCWlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0pFT3p0QlFVZEVMRlZCUVVzN1kwRkJRU3hwUWtGQlJ6dEJRVU5PTEdGQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTNCRExHRkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETzBGQlEzQkRMR0ZCUVVrc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dFJRVU5pT3p0QlFVVkVMRk5CUVVrN1kwRkJRU3huUWtGQlJ6dEJRVU5NTEdGQlFVa3NTVUZCU1N4RFFVRkRMRTlCUVU4c1JVRkJSVHRCUVVOb1FpeGxRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTI1RExHVkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdPenM3TzBGQlMyNURMR1ZCUVVrc1EwRkJReXhsUVVGbExFVkJRVVVzUTBGQlF6dEJRVU4yUWl4bFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUlVGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1FVRkRhRU1zWlVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMVZCUTJZN1VVRkRSanM3UVVGRlJDeFpRVUZQTzJOQlFVRXNiVUpCUVVjN1FVRkRVaXhoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZEWmpzN1FVRkZSeXhsUVVGVk8xbEJRVUVzV1VGQlJ6dEJRVU5tTEdkQ1FVRlBPMEZCUTB3c1dVRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRlZCUVZVN1FVRkRNVUlzV1VGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExGVkJRVlU3VlVGRE0wSXNRMEZCUXp0UlFVTklPenRCUVVWRUxHOUNRVUZsTzJOQlFVRXNNa0pCUVVjN096dEJRVU5vUWl4aFFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eFpRVUZaTEVOQlFVVXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZGTEVOQlFVTTdRVUZEYmtRc1lVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNXVUZCV1N4RFFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUlN4RFFVRkRPMEZCUTI1RUxHRkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTJwQ0xHRkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNUMEZCVHl4RFFVRkRMRlZCUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUlVGQlN6dEJRVU0zUWl4bFFVRkpMRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJReXhOUVVGTExFdEJRVXNzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVNc1RVRkJTeXhOUVVGTkxFVkJRVU1zVFVGQlN5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1IwRkJReXhOUVVGTExFdEJRVXNzUlVGQlF5eERRVUZETEVOQlFVTXNSMEZCUXl4TlFVRkxMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eEpRVUZGTEUxQlFVc3NUVUZCVFN4RFFVRkRMRU5CUVVNN1FVRkRkRWtzWlVGQlNTeExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFZEJRVU1zVVVGQlVTeEpRVUZGTEUxQlFVc3NTMEZCU3l4SFFVRkRMRTFCUVVzc1MwRkJTeXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpsRUxHbENRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGVFSXNhVUpCUVVzc1pVRkJaU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEZsQlFWa3NRMEZCUXl4alFVRmpMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03VlVGRE4wUXNRMEZCUXl4RFFVRkRPMUZCUTBvN08wRkJUMFFzWlVGQlZUczdPenM3T3pzN1kwRkJRU3h2UWtGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkZPMEZCUTJRc1lVRkJTU3hSUVVGUkxFZEJRVWM3UVVGRFlpeFpRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTE8wRkJRMllzV1VGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUVHRWUVVOcVFpeERRVUZETzBGQlEwWXNZVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTJwRExHRkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6dEJRVU5xUXl4aFFVRkpMRU5CUVVNc1pVRkJaU3hGUVVGRkxFTkJRVU03UVVGRGRrSXNZVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFVkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMEZCUTJoRExHRkJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0UlFVTm1PenRCUVZGRUxHZENRVUZYT3pzN096czdPenM3WTBGQlFTeHhRa0ZCUXl4TFFVRkxMRVZCUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUlVGQlJUczdRVUZGY2tJc1lVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU0zUWl4aFFVRkpMRU5CUVVNc1pVRkJaU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJReXhIUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTTNSQ3hoUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVNNVJDeGhRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1FVRkRka0lzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBGQlEyaERMR0ZCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFJRVVZtT3pzN096czdPenM3UVVGQlFUczdPMVZCZUU1clFpeExRVUZMTzBsQlFWTXNVMEZCVXpzN2EwSkJRWFpDTEV0QlFVc3NRenM3T3pzN08wRkRMME14UWl4aFFVRlpMRU5CUVVNN096czdPenM3T3pzN1FVRkZZaXhMUVVGSkxFbEJRVWtzUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRU5CUVdNc1EwRkJReXhEUVVGRE8wRkJRMjVETEV0QlFVa3NSMEZCUnl4SFFVRkhMRzFDUVVGUExFTkJRVU1zUTBGQllTeERRVUZETEVOQlFVTTdRVUZEYWtNc1MwRkJTU3hUUVVGVExFZEJRVWNzYlVKQlFVOHNRMEZCUXl4RFFVRnRRaXhEUVVGRExFTkJRVU03T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdTMEY1UW5oQ0xFbEJRVWs3UVVGRldpeFpRVVpSTEVsQlFVa3NSMEZGVkRzeVFrRkdTeXhKUVVGSk96dEJRVWx5UWl4VFFVRkpMRTlCUVU4c1IwRkJSeXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZET3p0QlFVVjRRaXhUUVVGSkxGRkJRVkVzUjBGQlJ6dEJRVU5pTEdGQlFWRXNRMEZCUXl4RlFVRkZMRVZCUVVNc1JVRkJSU3hEUVVGRE8wMUJRMmhDTEVOQlFVTTdPMEZCUlVZc1owTkJWbWxDTEVsQlFVa3NOa05CVldZc1UwRkJVeXhGUVVGRExFOUJRVThzUlVGQlF5eFJRVUZSTEVWQlFVVTdPMEZCUld4RExGTkJRVWtzUTBGQlF5eFBRVUZQTEVkQlFVY3NTVUZCU1N4RFFVRkRPenRCUVVWd1FpeFRRVUZKTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN096czdRVUZKWWl4VFFVRkpMRU5CUVVNc1YwRkJWeXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE96czdRVUZITVVNc1UwRkJTU3hOUVVGTkxFTkJRVU1zYzBKQlFYTkNMRVZCUVVVN1FVRkRiRU1zVjBGQlNTeERRVUZETEcxQ1FVRnRRaXhIUVVGSExFMUJRVTBzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXh0UWtGQmJVSXNSVUZCUlN4SlFVRkpMRU5CUVVNc1YwRkJWeXhGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzAxQlEycEhMRTFCUVUwN1FVRkRTaXhYUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTnlRaXhYUVVGSkxFTkJRVU1zWTBGQll5eEZRVUZGTEVOQlFVTTdUVUZEZGtJN096czdPenM3U1VGWFJqdEJRVmhGTzJGQk1VSm5RaXhKUVVGSk96dG5Ra0ZCU2l4SlFVRkpPMEZCZDBOMlFpeHRRa0ZCWXp0alFVRkJMREJDUVVGSE96dEJRVVZtTEdGQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTm9ReXhoUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03UVVGRGNFTXNZVUZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNCRExHRkJRVWtzUTBGQlF5eFBRVUZQTEVkQlFVY3NSMEZCUnl4RFFVRkRMRTFCUVUwc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6czdRVUZGY0VNc1lVRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJReTlDTEdGQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTXZRaXhoUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03TzBGQlJTOUNMR0ZCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUjBGQlJ5eERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVOb1F5eGhRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdRVUZEYUVNc1lVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE96dEJRVVZvUXl4aFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eFRRVUZUTEVWQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1FVRkRlRU1zWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1UwRkJVeXhGUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzaERMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZOQlFWTXNSVUZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVONFF5eGhRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRmxCUVZrc1EwRkJReXhUUVVGVExFVkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZEZWtNc1lVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFpRVUZaTEVOQlFVTXNVMEZCVXl4RlFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRM3BETEdGQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1dVRkJXU3hEUVVGRExGTkJRVk1zUlVGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXpzN1FVRkZla01zWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVTXNRMEZCUXl4SFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRE8wRkJRMmhFTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFbEJRVWtzUlVGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1IwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU5vUkN4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dEJRVU01UXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eFRRVUZUTEVWQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN08wRkJSVE5ETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFbEJRVWtzUlVGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkRMRU5CUVVNc1IwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dEJRVU5vUkN4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJReXhEUVVGRExFZEJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEYUVRc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVU1zUlVGQlJTeERRVUZETEVOQlFVTTdRVUZET1VNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNVMEZCVXl4RlFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE96dEJRVVV6UXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJReXhEUVVGRExFZEJRVU1zUlVGQlJTeERRVUZETEVOQlFVTTdRVUZEYUVRc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVU1zUTBGQlF5eEhRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTJoRUxHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWRCUVVjc1JVRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRPMEZCUXpsRExHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRk5CUVZNc1JVRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6czdRVUZITTBNc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNZMEZCWXl4RlFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNSMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRE8wRkJRMnhGTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExHTkJRV01zUlVGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnNSU3hoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4alFVRmpMRVZCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03TzBGQlJXeEZMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUlN4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVOMlF5eGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhOUVVGTkxFVkJRVVVzVFVGQlRTeERRVUZETEVOQlFVTTdRVUZEZGtNc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRE96dEJRVVYyUXl4aFFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGbEJRVmtzUTBGQlF5eGpRVUZqTEVWQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRia1VzWVVGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4WlFVRlpMRU5CUVVNc1kwRkJZeXhGUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzBGQlEyNUZMR0ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEdOQlFXTXNSVUZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenM3UVVGRmJrVXNZVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlRTeEZRVUZGTEUxQlFVMHNRMEZCUXl4RFFVRkRPMEZCUTNoRExHRkJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNXVUZCV1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU40UXl4aFFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGbEJRVmtzUTBGQlF5eE5RVUZOTEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNN08wRkJSM2hETEdGQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1dVRkJXU3hEUVVGRExFZEJRVWNzUlVGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wRkJRekZETEdGQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1dVRkJXU3hEUVVGRExFZEJRVWNzUlVGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1IwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU0zUXl4aFFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGbEJRVmtzUTBGQlF5eFhRVUZYTEVWQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1FVRkROVU1zWVVGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4WlFVRlpMRU5CUVVNc1lVRkJZU3hGUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBGQlF6bERMR0ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEdkQ1FVRm5RaXhGUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEyaEVMR0ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEZOQlFWTXNSVUZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVONlF5eGhRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRmxCUVZrc1EwRkJReXhoUVVGaExFVkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTTdRVUZEYUVRc1lVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFhRVUZYTEVkQlFVY3NUVUZCVFN4RFFVRkRPenRCUVVkb1F5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdRVUZEZGtNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8wRkJRM1pETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXpzN1FVRkZka01zWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETzBGQlEzQkRMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVjBGQlZ5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRCUVVOd1F5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdPMEZCUlhCRExHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNWMEZCVnl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU55UXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1FVRkRja01zWVVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZET3p0QlFVVnlReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRmRFTTdPMEZCUlVRc2JVSkJRV003WTBGQlFTd3dRa0ZCUnpzN1FVRkZaaXhoUVVGSkxFbEJRVWtzUTBGQlF5eFBRVUZQTEVWQlFVVTdRVUZEYUVJc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNaVUZCWlN4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeERRVUZETzBGQlEzaEVMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzQkVMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzQkVMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzQkVMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzUkVMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzUkVMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzUkVMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEyNUVMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEyNUVMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEyNUVMR1ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzQkVMR1ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzQkVMR1ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzQkVMR1ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFWQlEyNUVMRTFCUVUwN1FVRkRUQ3hsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4bFFVRmxMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTTdRVUZEZEVRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETVVRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETVVRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETVVRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETlVRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETlVRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETlVRc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZEZWtRc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZEZWtRc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZEZWtRc1pVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETVVRc1pVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETVVRc1pVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdRVUZETVVRc1pVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFpRVUZaTEVOQlFVTXNUVUZCVFN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eERRVUZETEVOQlFVTTdWVUZEZWtRN1VVRkZSanM3UVVGRlJDeFhRVUZOTzJOQlFVRXNaMEpCUVVNc1EwRkJReXhGUVVGRk8wRkJRMUlzWVVGQlNTeEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkRPenRCUVVWbUxHVkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNN1FVRkRaaXhsUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTJoQ0xHVkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVNN096dEJRVWRvUWl4WlFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVNc1JVRkJSU3hGUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTTNRaXhaUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhGUVVGRkxFVkJRVU1zUlVGQlJTeEZRVUZETEVOQlFVTXNSVUZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNM1FpeFpRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVkQlFVY3NSVUZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03TzBGQlJ6VkNMR1ZCUVVrc1dVRkJXU3hIUVVGSE8wRkJRMnBDTEd0Q1FVRkxMRVZCUVVVc1NVRkJTU3hEUVVGRExFVkJRVVVzUjBGQlF5eEhRVUZITzBGQlEyeENMR2RDUVVGSExFVkJRVVVzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUlN4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVWQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFZEJRVU1zUjBGQlJ5eEZRVUZETEVsQlFVa3NRMEZCUXl4RlFVRkZMRWRCUVVNc1IwRkJSeXhEUVVGRExFVkJRVWNzU1VGQlNTeERRVUZETEVWQlFVVXNSMEZCUXl4SFFVRkhMRVZCUVVVc1NVRkJTU3hEUVVGRExFVkJRVVVzUjBGQlF5eEhRVUZITEVOQlFVVTdXVUZEZWtZc1EwRkJRenRCUVVOR0xHVkJRVWtzWVVGQllTeEhRVUZITzBGQlEyeENMR3RDUVVGTExFVkJRVVVzU1VGQlNTeERRVUZETEVWQlFVVXNSMEZCUXl4SFFVRkhPMEZCUTJ4Q0xHZENRVUZITEVWQlFVVXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJSU3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUXl4SFFVRkhMRVZCUVVNc1EwRkJReXhGUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVkQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFZEJRVU1zUjBGQlJ5eERRVUZETEVWQlFVY3NTVUZCU1N4RFFVRkRMRVZCUVVVc1IwRkJReXhIUVVGSExFVkJRVVVzU1VGQlNTeERRVUZETEVWQlFVVXNSMEZCUXl4SFFVRkhMRU5CUVVVN1dVRkRla1lzUTBGQlF6czdRVUZGUml4bFFVRkpMRlZCUVZVc1IwRkJSeXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1JVRkJSU3hEUVVGRExFOUJRVThzUTBGQlF5eExRVUZMTEVWQlFVVXNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhGUVVGRkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RlFVRkZMRmxCUVZrc1EwRkJReXhMUVVGTExFVkJRVVVzV1VGQldTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUXpOS0xHVkJRVWtzVjBGQlZ5eEhRVUZITEVkQlFVY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eEZRVUZGTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1JVRkJSU3hKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVWQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhGUVVGRkxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFVkJRVVVzWVVGQllTeERRVUZETEV0QlFVc3NSVUZCUlN4aFFVRmhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03TzBGQlJUbEtMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVkQlFVY3NSVUZCUlN4VlFVRlZMRU5CUVVNc1EwRkJRenRCUVVONFF5eGxRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRmxCUVZrc1EwRkJReXhIUVVGSExFVkJRVVVzVjBGQlZ5eERRVUZETEVOQlFVTTdPMEZCVFRGRExIVkNRVUZaTEVkQlFVYzdRVUZEWWl4clFrRkJTeXhGUVVGRkxFbEJRVWtzUTBGQlF5eEZRVUZGTEVkQlFVTXNSMEZCUnp0QlFVTnNRaXhuUWtGQlJ5eEZRVUZGTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVVc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkRMRWRCUVVjc1JVRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZETEVkQlFVY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZITEVsQlFVa3NRMEZCUXl4RlFVRkZMRWRCUVVNc1IwRkJSeXhGUVVGRkxFbEJRVWtzUTBGQlF5eEZRVUZGTEVkQlFVTXNSMEZCUnl4RFFVRkZPMWxCUTNwR0xFTkJRVU03UVVGRFJpeDNRa0ZCWVN4SFFVRkhPMEZCUTJRc2EwSkJRVXNzUlVGQlJTeEpRVUZKTEVOQlFVTXNSVUZCUlN4SFFVRkRMRWRCUVVjN1FVRkRiRUlzWjBKQlFVY3NSVUZCUlN4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkRMRWRCUVVjc1JVRkJReXhEUVVGRExFVkJRVU1zU1VGQlNTeERRVUZETEVWQlFVVXNSMEZCUXl4SFFVRkhMRVZCUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUjBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUnl4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGRExFZEJRVWNzUlVGQlJTeEpRVUZKTEVOQlFVTXNSVUZCUlN4SFFVRkRMRWRCUVVjc1EwRkJSVHRaUVVONlJpeERRVUZET3p0QlFVVkdMSEZDUVVGVkxFZEJRVWNzUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFVkJRVVVzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RlFVRkZMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUlVGQlJTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRVZCUVVVc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1JVRkJSU3haUVVGWkxFTkJRVU1zUzBGQlN5eEZRVUZGTEZsQlFWa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOMlNpeHpRa0ZCVnl4SFFVRkhMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RlFVRkZMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUlVGQlJTeEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRVZCUVVVc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eEZRVUZGTEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eExRVUZMTEVWQlFVVXNZVUZCWVN4RFFVRkRMRXRCUVVzc1JVRkJSU3hoUVVGaExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdPMEZCUlRGS0xHVkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWRCUVVjc1JVRkJSU3hWUVVGVkxFTkJRVU1zUTBGQlF6dEJRVU40UXl4bFFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVVXNWMEZCVnl4RFFVRkRMRU5CUVVNN08wRkJUekZETEhWQ1FVRlpMRWRCUVVjN1FVRkRZaXhyUWtGQlN5eEZRVUZGTEVsQlFVa3NRMEZCUXl4RlFVRkZMRWRCUVVNc1IwRkJSenRCUVVOc1FpeG5Ra0ZCUnl4RlFVRkZMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVVVzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhGUVVGRExFZEJRVWNzUlVGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4SFFVRkRMRWRCUVVjc1JVRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkhMRWxCUVVrc1EwRkJReXhGUVVGRkxFZEJRVU1zUjBGQlJ5eEZRVUZGTEVsQlFVa3NRMEZCUXl4RlFVRkZMRWRCUVVNc1IwRkJSeXhEUVVGRk8xbEJRM3BHTEVOQlFVTTdRVUZEUml4M1FrRkJZU3hIUVVGSE8wRkJRMlFzYTBKQlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGRExFZEJRVWM3UVVGRGJFSXNaMEpCUVVjc1JVRkJSU3hKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhGUVVGRExFZEJRVWNzUlVGQlF5eERRVUZETEVWQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1IwRkJReXhIUVVGSExFVkJRVU1zU1VGQlNTeERRVUZETEVWQlFVVXNSMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSeXhKUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZETEVkQlFVY3NSVUZCUlN4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGRExFZEJRVWNzUTBGQlJUdFpRVU42Uml4RFFVRkRPenRCUVVWR0xIRkNRVUZWTEVkQlFVY3NSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVWQlFVVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhGUVVGRkxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFVkJRVVVzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUlVGQlJTeFpRVUZaTEVOQlFVTXNTMEZCU3l4RlFVRkZMRmxCUVZrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU4yU2l4elFrRkJWeXhIUVVGSExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhGUVVGRkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFVkJRVVVzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RlFVRkZMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRVZCUVVVc1lVRkJZU3hEUVVGRExFdEJRVXNzUlVGQlJTeGhRVUZoTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN08wRkJSVEZLTEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFZEJRVWNzUlVGQlJTeFZRVUZWTEVOQlFVTXNRMEZCUXp0QlFVTjRReXhsUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVVc1YwRkJWeXhEUVVGRExFTkJRVU03T3pzN096czdPenM3T3pzN096czdPenRCUVhWQ01VTXNaVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFVkJRVVU3UVVGRGJFSXNZMEZCUXl4RlFVRkZMRU5CUVVNN1FVRkRTaXhqUVVGRExFVkJRVVVzUTBGQlF6dEJRVU5LTEdOQlFVTXNSVUZCUlN4RFFVRkRPMWxCUTB3c1EwRkJReXhEUVVGRE8xVkJSVW83VVVGRlJqczdRVUZGUkN4VlFVRkxPMk5CUVVFc2FVSkJRVWM3UVVGRFRpeGhRVUZKTEUxQlFVMHNRMEZCUXl4elFrRkJjMElzUlVGQlJUdEJRVU5xUXl4bFFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXp0VlFVTTFRanRSUVVOR096dEJRVmRITEZkQlFVMDdPenM3T3pzN1dVRktRU3haUVVGSE8wRkJRMWdzWjBKQlFVOHNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJRenRSUVVOeVFqdFpRVVZUTEZWQlFVTXNSVUZCUlN4RlFVRkZPMEZCUTJJc1lVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eEZRVUZGTEVOQlFVTTdRVUZEYkVJc1lVRkJTU3hEUVVGRExHTkJRV01zUlVGQlJTeERRVUZETzFGQlEzWkNPenRCUVVWRUxHdENRVUZoTzJOQlFVRXNlVUpCUVVjN1FVRkRaQ3hsUVVGTkxFTkJRVU1zYlVKQlFXMUNMRU5CUVVNc2JVSkJRVzFDTEVWQlFVVXNTVUZCU1N4RFFVRkRMRmRCUVZjc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU14UlRzN096dFZRWEpTYTBJc1NVRkJTVHRKUVVGVExGTkJRVk03TzJ0Q1FVRjBRaXhKUVVGSkxFTTdPenM3T3p0QlF6ZENla0lzWVVGQldTeERRVUZET3pzN096czdPenM3TzBGQlJXSXNTMEZCU1N4SFFVRkhMRWRCUVVjc2JVSkJRVThzUTBGQlF5eERRVUZoTEVOQlFVTXNRMEZCUXp0QlFVTnFReXhMUVVGSkxFbEJRVWtzUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRU5CUVdNc1EwRkJReXhEUVVGRE8wRkJRMjVETEV0QlFVa3NVMEZCVXl4SFFVRkhMRzFDUVVGUExFTkJRVU1zUTBGQmJVSXNRMEZCUXl4RFFVRkRPMEZCUXpkRExFdEJRVWtzWTBGQll5eEhRVUZITEcxQ1FVRlBMRU5CUVVNc1JVRkJPRUlzUTBGQlF5eERRVUZETzBGQlF6ZEVMRXRCUVVrc1MwRkJTeXhIUVVGSExHMUNRVUZQTEVOQlFVTXNRMEZCWlN4RFFVRkRMRU5CUVVNN08wdEJTUzlDTEZsQlFWazdRVUZGVEN4WlFVWlFMRmxCUVZrc1IwRkZSanM3T3pKQ1FVWldMRmxCUVZrN08wRkJTV1FzVTBGQlNTeFBRVUZQTEVkQlFVY3NRMEZCUXl4UFFVRlBMRVZCUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03TzBGQlJXaERMRk5CUVVrc1VVRkJVU3hIUVVGSE8wRkJRMklzWVVGQlVTeERRVUZETEVkQlFVY3NSVUZCUXl4RlFVRkZMRU5CUVVNN1FVRkRhRUlzYjBKQlFXVXNWVUZCVlR0QlFVTjZRaXhoUVVGUkxGVkJRVlU3UVVGRGJFSXNZMEZCVXl4RFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFTkJRVU03UVVGRFpDeGhRVUZSTEVOQlFVTTdRVUZEVkN4alFVRlRMRU5CUVVNN1FVRkRWaXhuUWtGQlZ5eEpRVUZKTzAxQlEyaENMRU5CUVVNN08wRkJSVVlzWjBOQmFFSkZMRmxCUVZrc05rTkJaMEpTTEZOQlFWTXNSVUZCUXl4UFFVRlBMRVZCUVVNc1VVRkJVU3hGUVVGRk96czdPMEZCUzJ4RExGTkJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4RlFVRkZPenRCUVVWcVFpeFhRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRmxCUVUwN1FVRkRha0lzWlVGQlN5eFhRVUZYTEVOQlFVTXNWMEZCVnl4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVOd1F5eGxRVUZMTEZkQlFWY3NRMEZCUXl4aFFVRmhMRWRCUVVjN1FVRkRMMElzWjBKQlFVc3NSVUZCUlN4TlFVRkxMRXRCUVVzN1FVRkRha0lzWjBKQlFVc3NSVUZCUlN4TlFVRkxMRXRCUVVzN1ZVRkRiRUlzUTBGQlF6dEJRVU5HTEdWQlFVc3NTVUZCU1N4RlFVRkZMRU5CUVVNN1FVRkRXaXhsUVVGTExGZEJRVmNzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCU3l4TFFVRkxMRU5CUVVNc1IwRkJSeXhOUVVGTExFdEJRVXNzUTBGQlF6dFJRVU5zUkN4RFFVRkRPMEZCUTBZc1YwRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhYUVVGWExFVkJRVVVzVlVGQlF5eERRVUZETEVWQlFVczdRVUZEYUVRc1lVRkJTU3hOUVVGTExGZEJRVmNzUTBGQlF5eFhRVUZYTEVWQlFVVTdRVUZEYUVNc1pVRkJTU3hEUVVGRExFMUJRVXNzVFVGQlRTeEZRVUZGTzBGQlEyaENMRzFDUVVGTExFMUJRVTBzUjBGQlJ5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRTFCUVVzc1QwRkJUeXhEUVVGRExFTkJRVU03V1VGRE9VTTdRVUZEUkN4cFFrRkJTeXhMUVVGTExFZEJRVWNzUjBGQlJ5eERRVUZETEZkQlFWY3NRMEZCUXl4RFFVRkRMRVZCUVVNc1RVRkJTeXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU0xUXl4cFFrRkJTeXhKUVVGSkxFVkJRVVVzUTBGQlF6dEJRVU5hTEdsQ1FVRkxMRmRCUVZjc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlN5eExRVUZMTEVOQlFVTXNSMEZCUnl4TlFVRkxMRXRCUVVzc1EwRkJRenRCUVVOcVJDeGxRVUZKTEUxQlFVc3NWMEZCVnl4RFFVRkRMR0ZCUVdFc1JVRkJSVHRCUVVOc1F5eHBRa0ZCU1N4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eE5RVUZMTEZkQlFWY3NRMEZCUXl4aFFVRmhMRU5CUVVNc1MwRkJTeXhIUVVGRExFMUJRVXNzUzBGQlN5eERRVUZETEVOQlFVTTdRVUZEZWtVc2FVSkJRVXNzVVVGQlVTeEhRVUZITEVOQlFVTXNSVUZCUnp0QlFVTnNRaXh0UWtGQlNTeEhRVUZITEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhOUVVGTExGZEJRVmNzUTBGQlF5eGhRVUZoTEVOQlFVTXNTMEZCU3l4RlFVRkRMRTFCUVVzc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGNFVXNiVUpCUVVrc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCU3l4WFFVRlhMRU5CUVVNc1lVRkJZU3hEUVVGRExFdEJRVXNzUlVGQlF5eE5RVUZMTEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTNKRkxHMUNRVUZKTEZGQlFWRXNSMEZCUnl4TlFVRkxMRmRCUVZjc1EwRkJReXhQUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTI1RUxHMUNRVUZKTEZOQlFWTXNSMEZCUnl4TlFVRkxMRmRCUVZjc1EwRkJReXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTNKRUxHOUNRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkRMRWRCUVVjc1JVRkJReXhEUVVGRExFZEJRVU1zU1VGQlNTeEZRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZPMEZCUTNwQ0xIVkNRVUZMTEZkQlFWY3NRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVVc1EwRkJReXhEUVVGRExFZEJRVU1zUjBGQlJ5eEpRVUZGTEZGQlFWRXNSVUZCUlN4UlFVRlJMRVZCUVVVc1UwRkJVeXhEUVVGRkxFTkJRVU03UVVGRGVrWXNjVUpCUVVrc1lVRkJZU3hIUVVGSExFMUJRVXNzVjBGQlZ5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU03UVVGRGRFUXNkVUpCUVVzc1YwRkJWeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4aFFVRmhMRU5CUVVNN1FVRkRNME1zZFVKQlFVc3NWMEZCVnl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFVkJRVU1zWVVGQllTeERRVUZETEVOQlFVTTdaMEpCUXpGRE8yTkJRMFk3V1VGRFJqczdRVUZGUkN4cFFrRkJTeXhYUVVGWExFTkJRVU1zWVVGQllTeEhRVUZITzBGQlF5OUNMR3RDUVVGTExFVkJRVVVzVFVGQlN5eExRVUZMTzBGQlEycENMR3RDUVVGTExFVkJRVVVzVFVGQlN5eExRVUZMTzFsQlEyeENMRU5CUVVNN1ZVRkRTRHRSUVVOR0xFTkJRVU1zUTBGQlF6czdRVUZIU0N4WFFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExGbEJRVTBzUlVGRGFrSXNRMEZCUXp0QlFVTkdMRmRCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zWjBKQlFXZENMRU5CUVVNc1YwRkJWeXhGUVVGRkxGVkJRVU1zUTBGQlF5eEZRVUZMTzBGQlEyaEVMR0ZCUVVrc1RVRkJTeXhYUVVGWExFTkJRVU1zVjBGQlZ5eEZRVUZGTzBGQlEyaERMR1ZCUVVrc1EwRkJReXhOUVVGTExFMUJRVTBzUlVGQlJUdEJRVU5vUWl4dFFrRkJTeXhOUVVGTkxFZEJRVWNzUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRkxMRTlCUVU4c1EwRkJReXhEUVVGRE8xbEJRemxETzBGQlEwUXNhVUpCUVVzc1MwRkJTeXhIUVVGSExFZEJRVWNzUTBGQlF5eFhRVUZYTEVOQlFVTXNRMEZCUXl4RlFVRkRMRTFCUVVzc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRE5VTXNhVUpCUVVzc1MwRkJTeXhGUVVGRkxFTkJRVU03UVVGRFlpeHBRa0ZCU3l4WFFVRlhMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVXNzUzBGQlN5eERRVUZETEVkQlFVY3NUVUZCU3l4TFFVRkxMRU5CUVVNN1ZVRkRiRVE3VVVGRFJpeERRVUZETEVOQlFVTTdPMEZCUjBnc1YwRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eFpRVUZOTzBGQlEyNUNMR1ZCUVVzc1YwRkJWeXhEUVVGRExGZEJRVmNzUjBGQlJ5eExRVUZMTEVOQlFVTTdRVUZEY2tNc1pVRkJTeXhYUVVGWExFTkJRVU1zWVVGQllTeEhRVUZITEV0QlFVc3NRMEZCUXp0UlFVTjRReXhEUVVGRE8wRkJRMFlzVjBGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4blFrRkJaMElzUTBGQlF5eFRRVUZUTEVWQlFVVXNXVUZCVFR0QlFVTTNReXhoUVVGSkxFMUJRVXNzVjBGQlZ5eERRVUZETEZkQlFWY3NSVUZCUlR0QlFVTm9ReXhwUWtGQlN5eEZRVUZGTEVWQlFVVXNRMEZCUXp0QlFVTldMR2xDUVVGTExGZEJRVmNzUTBGQlF5eGhRVUZoTEVkQlFVY3NTMEZCU3l4RFFVRkRPMEZCUTNaRExHbENRVUZMTEZkQlFWY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJTeXhMUVVGTExFTkJRVU1zUjBGQlJ5eE5RVUZMTEV0QlFVc3NRMEZCUXp0VlFVTnNSRHRSUVVOR0xFTkJRVU1zUTBGQlF6dEJRVU5JTEZkQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNWVUZCVlN4RlFVRkZMRmxCUVUwN1FVRkRPVU1zWVVGQlNTeE5RVUZMTEZkQlFWY3NRMEZCUXl4WFFVRlhMRVZCUVVVN1FVRkRhRU1zYVVKQlFVc3NSVUZCUlN4RlFVRkZMRU5CUVVNN1FVRkRWaXhwUWtGQlN5eFhRVUZYTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVVzc1MwRkJTeXhEUVVGRExFZEJRVWNzVFVGQlN5eExRVUZMTEVOQlFVTTdWVUZEYkVRN1VVRkRSaXhEUVVGRExFTkJRVU03VFVGRlNqczdRVUZGUkN4VFFVRkpMRU5CUVVNc1YwRkJWeXhGUVVGRkxFTkJRVU03U1VGRGNFSTdPMkZCYmtkSExGbEJRVms3TzJkQ1FVRmFMRmxCUVZrN1FVRnhSMmhDTEdkQ1FVRlhPMk5CUVVFc2RVSkJRVWM3T3pzN1FVRkpXaXhoUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRE4wSXNZVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zVjBGQlZ5eEZRVUZETEdkQ1FVRm5RaXhEUVVGRExFTkJRVU03UVVGRGNFUXNZVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zU1VGQlNTeEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpsQ0xHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1JVRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU01UWl4aFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eFBRVUZQTEVWQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRekZETEdGQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1dVRkJXU3hEUVVGRExGRkJRVkVzUlVGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN08wRkJSVFZETEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1dVRkJXU3hEUVVGRExFZEJRVWNzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnFReXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4WFFVRlhMRVZCUVVNc1owSkJRV2RDTEVOQlFVTXNRMEZCUXp0QlFVTjRSQ3hoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGJFTXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zU1VGQlNTeEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTJ4RExHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRTlCUVU4c1JVRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZET1VNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dFJRVVZxUkRzN096dFZRWFpJUnl4WlFVRlpPMGxCUVZNc1kwRkJZenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3p0TFFXbExjRUlzVjBGQlZ6dEJRVVZ1UWl4WlFVWlJMRmRCUVZjc1IwRkZhRUk3TWtKQlJrc3NWMEZCVnpzN1FVRkpOVUlzVTBGQlNTeFBRVUZQTEVkQlFVY3NRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJRenM3UVVGRmVFSXNVMEZCU1N4UlFVRlJMRWRCUVVjN1FVRkRZaXhoUVVGUkxFTkJRVU1zUjBGQlJ5eEZRVUZETEVkQlFVY3NRMEZCUXp0QlFVTnFRaXgzUWtGQmJVSXNRMEZCUXp0QlFVTndRaXhaUVVGUExFTkJRVU03UVVGRFVpeFpRVUZQTEVOQlFVTTdRVUZEVWl4aFFVRlJMRU5CUVVNN1FVRkRWQ3hsUVVGVkxFTkJRVU1zUjBGQlJ5eEZRVUZETEVkQlFVY3NSVUZCUXl4SFFVRkhMRVZCUVVNc1IwRkJSeXhGUVVGRExFZEJRVWNzUTBGQlF6dE5RVU5vUXl4RFFVRkRPenRCUVVWR0xHZERRV1pwUWl4WFFVRlhMRFpEUVdWMFFpeFRRVUZUTEVWQlFVTXNUMEZCVHl4RlFVRkRMRkZCUVZFc1JVRkJSVHM3UVVGRmJFTXNVMEZCU1N4RFFVRkRMR2RDUVVGblFpeEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1pVRkJaU3hEUVVGRE8wRkJRM1JFTEZOQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTTdPMEZCUlc1RExGTkJRVWtzUTBGQlF5eFBRVUZQTEVkQlFVY3NSVUZCUlN4RFFVRkRPenRCUVVWc1FpeFRRVUZKTEVOQlFVTXNWMEZCVnl4SFFVRkhMRXRCUVVzc1EwRkJRenM3UVVGRmVrSXNVMEZCU1N4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRE8wbEJSV0k3TzJGQk1VSnJRaXhYUVVGWE96dG5Ra0ZCV0N4WFFVRlhPMEZCTkVJNVFpeGxRVUZWTzJOQlFVRXNjMEpCUVVjN1FVRkRXQ3hoUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEZGQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRE4wTXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMUZCUTNaRE96dEJRVVZFTEcxQ1FVRmpPMk5CUVVFc01FSkJRVWM3TzBGQlJXWXNZVUZCU1N4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eEhRVUZITEVOQlFVTTdRVUZETlVJc1lVRkJTU3hIUVVGSExFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4SFFVRkhMRU5CUVVNN1FVRkROVUlzWVVGQlNTeEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhKUVVGSkxFTkJRVU03TzBGQlJUbENMR0ZCUVVrc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVWQlFVVTdRVUZEZGtJc1kwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRE8wRkJRekZDTEdOQlFVY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXp0QlFVTXhRaXhsUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU03VlVGRE4wSTdPMEZCUlVRc1lVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eEZRVUZGTEVOQlFVTTdPMEZCUld4Q0xHTkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zWjBKQlFXZENMRVZCUVVNc1EwRkJReXhGUVVGRkxFVkJRVVU3UVVGRGVFTXNaVUZCU1N4VFFVRlRMRWRCUVVjc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXpzN1FVRkZMME1zWlVGQlNTeE5RVUZOTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1UwRkJVeXhGUVVGRk8wRkJRM0pETEd0Q1FVRkxMRVZCUVVVc1EwRkJReXhIUVVGSExFVkJRVU1zUjBGQlJ5eERRVUZETzBGQlEyaENMR2xDUVVGSkxFVkJRVVVzU1VGQlNUdEJRVU5XTEdsQ1FVRkpMRVZCUVVVc1ZVRkJWVHRCUVVOb1FpeDNRa0ZCVnl4RlFVRkZMRlZCUVZVN1FVRkRka0lzYTBKQlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU55UWl4dlFrRkJUeXhGUVVGRkxFdEJRVXM3UVVGRFpDeHpRa0ZCVXl4RlFVRkZMRWxCUVVrc1JVRkRhRUlzUlVGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTTVRaXhwUWtGQlRTeERRVUZETEZkQlFWY3NSMEZCUnl4SlFVRkpMRU5CUVVNN08wRkJSVEZDTEdsQ1FVRk5MRU5CUVVNc1MwRkJTeXhIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU5xUWl4bFFVRkpMRXRCUVVzc1EwRkJReXhOUVVGTkxFVkJRVVU3UVVGRGFFSXNiVUpCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zUzBGQlN5eEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTnlRaXh0UWtGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRM3BDTEcxQ1FVRk5MRU5CUVVNc1VVRkJVU3hIUVVGSExFMUJRVTBzUTBGQlF5eFBRVUZQTEVkQlFVY3NUVUZCVFN4RFFVRkRMRlZCUVZVc1IwRkJSeXhaUVVGTkxFVkJRVVVzUTBGQlF6dEJRVU5vUlN4dFFrRkJUU3hEUVVGRExFdEJRVXNzUjBGQlJ5eE5RVUZOTEVOQlFVTXNTVUZCU1N4SFFVRkhMRTFCUVUwc1EwRkJReXhQUVVGUExFZEJRVWNzV1VGQlRTeEZRVUZGTEVOQlFVTTdRVUZEZGtRc2JVSkJRVTBzUTBGQlF5eFJRVUZSTEVkQlFVY3NUVUZCVFN4RFFVRkRMRmxCUVZrc1IwRkJSeXhOUVVGTkxFTkJRVU1zWlVGQlpTeEhRVUZITEZsQlFVMHNSVUZCUlN4RFFVRkRPMEZCUXpGRkxHMUNRVUZOTEVOQlFVTXNTMEZCU3l4SFFVRkhMRTFCUVUwc1EwRkJReXhUUVVGVExFZEJRVWNzVFVGQlRTeERRVUZETEZsQlFWa3NSMEZCUnl4WlFVRk5MRVZCUVVVc1EwRkJRenRaUVVOc1JUczdRVUZGUkN4bFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTXhRaXhsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZkQlFWY3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJRenRWUVVWeVF6dEJRVU5FTEdGQlFVa3NTMEZCU3l4RFFVRkRMRTFCUVUwc1JVRkJSVHRCUVVOb1FpeGxRVUZKTEVOQlFVTXNhVUpCUVdsQ0xFVkJRVVVzUTBGQlF6dFZRVU14UWp0UlFVVkdPenRCUVVWRUxHMUNRVUZqTzJOQlFVRXNNRUpCUVVjN1FVRkRaaXhqUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZETEVOQlFVTXNSVUZCUXl4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVWQlFVTXNRMEZCUXl4RlFVRkZMRVZCUVVVN1FVRkRkRU1zWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXp0QlFVTnlReXhsUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMR05CUVdNc1JVRkJSU3hEUVVGRE8xVkJRMnhETzFGQlEwWTdPMEZCUlVRc2EwSkJRV0U3WTBGQlFTeDVRa0ZCUnpzN1FVRkZaQ3hoUVVGSkxGZEJRVmNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVFVGQlRTeERRVUZETzBGQlEyNUVMR0ZCUVVrc1dVRkJXU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTTdPMEZCUlM5Q0xHTkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEUxQlFVMHNSVUZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSVHRCUVVOMFF5eGxRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVWQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1FVRkRha1FzWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF6dFZRVU12UWp0UlFVZEdPenRCUVVWRUxGZEJRVTA3WTBGQlFTeG5Ra0ZCUXl4TFFVRkxMRVZCUVVNc1MwRkJTeXhGUVVGRk8wRkJRMnhDTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRE8wRkJRMnBDTEd0Q1FVRlRMRXRCUVVzN1FVRkRaQ3hyUWtGQlV5eExRVUZMTzFWQlEyWXNRMEZCUXl4RFFVRkRPMUZCUTBvN08wRkJSVVFzYzBKQlFXbENPMk5CUVVFc05rSkJRVWM3T3p0QlFVVnNRaXhoUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1NVRkJTU3hEUVVGRExGVkJRVlVzUjBGQlJ5eFpRVUZOTEVWQlFVVXNRMEZCUXp0QlFVTXhSQ3hoUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eFpRVUZOTEVWQlFVVXNRMEZCUXp0QlFVTnFSQ3hoUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4WlFVRlpMRWRCUVVjc1NVRkJTU3hEUVVGRExHVkJRV1VzUjBGQlJ5eFpRVUZOTEVWQlFVVXNRMEZCUXp0QlFVTndSU3hoUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4VFFVRlRMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUjBGQlJ5eFpRVUZOTEVWQlFVVXNRMEZCUXpzN1FVRkZNMFFzWVVGQlNTeERRVUZETEdOQlFXTXNSMEZCUnl4TFFVRkxMRU5CUVVNN08wRkJSVFZDTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNXVUZCV1N4RlFVRkZMRlZCUVVNc1EwRkJReXhGUVVGTE8wRkJRMnBFTEdWQlFVa3NUMEZCVHl4SFFVRkhMRkZCUVZFc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4RFFVRkRMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNSVUZCUXl4RFFVRkRMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUXk5R0xHVkJRVWtzVFVGQlRTeEhRVUZITEUxQlFVc3NUMEZCVHl4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU42UXl4bFFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUlVGQlJUdEJRVU5zUWl4dFFrRkJUU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF6dFpRVU5zUkR0QlFVTkVMR2xDUVVGTkxFTkJRVU1zUzBGQlN5eEhRVUZITEVkQlFVY3NRMEZCUXl4WFFVRlhMRU5CUVVNc1EwRkJReXhGUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTm9SQ3hwUWtGQlRTeERRVUZETEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTJRc2FVSkJRVXNzWTBGQll5eEhRVUZITEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNN1FVRkRjRU1zV1VGQlF5eERRVUZETEdOQlFXTXNSVUZCUlN4RFFVRkRPMEZCUTI1Q0xGbEJRVU1zUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0VlFVTnlRaXhEUVVGRExFTkJRVU03TzBGQlJVZ3NZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhuUWtGQlowSXNRMEZCUXl4WFFVRlhMRVZCUVVVc1ZVRkJReXhEUVVGRExFVkJRVXM3UVVGRGFFUXNaVUZCU1N4UFFVRlBMRWRCUVVjc1VVRkJVU3hEUVVGRExHZENRVUZuUWl4RFFVRkRMRU5CUVVNc1EwRkJReXhoUVVGaExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RlFVRkRMRU5CUVVNc1EwRkJReXhoUVVGaExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN1FVRkRMMFlzWlVGQlNTeE5RVUZOTEVkQlFVY3NUVUZCU3l4UFFVRlBMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzcERMR1ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVFVGQlRTeEZRVUZGTzBGQlEyeENMRzFDUVVGTkxFTkJRVU1zVFVGQlRTeEhRVUZITEVkQlFVY3NRMEZCUXl4WlFVRlpMRU5CUVVNc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzFsQlEyeEVPMEZCUTBRc2FVSkJRVTBzUTBGQlF5eExRVUZMTEVkQlFVY3NSMEZCUnl4RFFVRkRMRmRCUVZjc1EwRkJReXhEUVVGRExFVkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMEZCUTJoRUxHVkJRVWtzVDBGQlR5eERRVUZETEV0QlFVc3NTMEZCUnl4TlFVRkxMR05CUVdNc1JVRkJSVHRCUVVOMlF5eHBRa0ZCU1N4TlFVRkxMR05CUVdNc1NVRkJTU3hEUVVGRExFVkJRVVU3UVVGRE5VSXNiVUpCUVVrc1ZVRkJWU3hIUVVGSExFMUJRVXNzVDBGQlR5eERRVUZETEUxQlFVc3NZMEZCWXl4RFFVRkRMRU5CUVVNN1FVRkRia1FzZVVKQlFWVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJRenRqUVVOcVFqdEJRVU5FTEcxQ1FVRk5MRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU03V1VGRFppeE5RVUZOTzBGQlEwd3NiVUpCUVUwc1EwRkJReXhMUVVGTExFVkJRVVVzUTBGQlF6dFpRVU5vUWp0QlFVTkVMR2xDUVVGTExHTkJRV01zUjBGQlJ5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTNCRExGbEJRVU1zUTBGQlF5eGpRVUZqTEVWQlFVVXNRMEZCUXp0QlFVTnVRaXhaUVVGRExFTkJRVU1zWlVGQlpTeEZRVUZGTEVOQlFVTTdWVUZEY2tJc1EwRkJReXhEUVVGRE96dEJRVVZJTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1owSkJRV2RDTEVOQlFVTXNWVUZCVlN4RlFVRkZMRlZCUVVNc1EwRkJReXhGUVVGTE96dEJRVVV2UXl4bFFVRkpMRTFCUVUwc1IwRkJSeXhOUVVGTExFOUJRVThzUTBGQlF5eE5RVUZMTEdOQlFXTXNRMEZCUXl4RFFVRkRPMEZCUXk5RExHbENRVUZOTEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNN1FVRkRXaXhwUWtGQlN5eFhRVUZYTEVkQlFVY3NTMEZCU3l4RFFVRkRPMEZCUTNwQ0xHbENRVUZMTEdOQlFXTXNSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkROVUlzV1VGQlF5eERRVUZETEdOQlFXTXNSVUZCUlN4RFFVRkRPMEZCUTI1Q0xGbEJRVU1zUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0VlFVTnlRaXhEUVVGRExFTkJRVU03VVVGRlNqczdRVUZWUnl4dlFrRkJaVHM3T3pzN096dFpRVXBCTEZsQlFVYzdRVUZEY0VJc1owSkJRVThzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNN1VVRkROVUk3V1VGRmEwSXNWVUZCUXl4RFFVRkRMRVZCUVVVN1FVRkRja0lzWVVGQlNTeERRVUZETEV0QlFVY3NTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFVkJRVVU3UVVGRE0wSXNhMEpCUVU4N1ZVRkRVanRCUVVORUxHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUMEZCVHl4RFFVRkRMRlZCUVVNc1RVRkJUU3hGUVVGSE8wRkJRemRDTEdsQ1FVRk5MRU5CUVVNc1QwRkJUeXhGUVVGRkxFTkJRVU03VlVGRGJFSXNRMEZCUXl4RFFVRkRPMEZCUTBnc1lVRkJTU3hEUVVGRExFdEJRVXNzUlVGQlJTeERRVUZETzBGQlEySXNZVUZCU1N4RFFVRkRMR2RDUVVGblFpeEhRVUZITEVOQlFVTXNRMEZCUXp0QlFVTXhRaXhoUVVGSkxFTkJRVU1zWTBGQll5eEZRVUZGTEVOQlFVTTdVVUZEZGtJN08wRkJXVWNzVVVGQlJ6czdPenM3T3pzN1dVRklRU3haUVVGSE8wRkJRMUlzWjBKQlFVOHNTVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTTdVVUZETlVJN1dVRkRUU3hWUVVGRExFTkJRVU1zUlVGQlJUdEJRVU5VTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1QwRkJUeXhEUVVGRExGVkJRVU1zVFVGQlRTeEZRVUZITzBGQlF6ZENMR2xDUVVGTkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTXNRMEZCUXp0VlFVTm9RaXhEUVVGRExFTkJRVU03VVVGRFNqczdRVUZWUnl4UlFVRkhPenM3T3pzN096dFpRVWhCTEZsQlFVYzdRVUZEVWl4blFrRkJUeXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJRenRSUVVNMVFqdFpRVU5OTEZWQlFVTXNRMEZCUXl4RlFVRkZPMEZCUTFRc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFBRVUZQTEVOQlFVTXNWVUZCUXl4TlFVRk5MRVZCUVVjN1FVRkROMElzYVVKQlFVMHNRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJReXhEUVVGRE8xVkJRMmhDTEVOQlFVTXNRMEZCUXp0UlFVTktPenRCUVZWSExGTkJRVWs3T3pzN096czdPMWxCU0VFc1dVRkJSenRCUVVOVUxHZENRVUZQTEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETzFGQlF6ZENPMWxCUTA4c1ZVRkJReXhEUVVGRExFVkJRVVU3UVVGRFZpeGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRTlCUVU4c1EwRkJReXhWUVVGRExFMUJRVTBzUlVGQlJ6dEJRVU0zUWl4cFFrRkJUU3hEUVVGRExFbEJRVWtzUjBGQlJ5eERRVUZETEVOQlFVTTdWVUZEYWtJc1EwRkJReXhEUVVGRE8xRkJRMG83TzBGQlZVUXNZMEZCVXpzN096czdPenM3T3pzN1kwRkJRU3h0UWtGQlF5eExRVUZMTEVWQlFVTXNTMEZCU3l4RlFVRkZPMEZCUTNKQ0xHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1MwRkJTeXhIUVVGSExFdEJRVXNzUTBGQlF6dEJRVU5zUXl4aFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUlVGQlF6dEJRVU5xUWl4clFrRkJVeXhMUVVGTE8wRkJRMlFzYTBKQlFWTXNTMEZCU3p0VlFVTm1MRU5CUVVNc1EwRkJRenRSUVVOS096dEJRVkZFTEd0Q1FVRmhPenM3T3pzN096czdZMEZCUVN4MVFrRkJReXhOUVVGTkxFVkJRVVU3T3p0QlFVTndRaXhoUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEUxQlFVMHNRMEZCUXp0QlFVTnlRaXhoUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXl4VlFVRkRMRTFCUVUwc1JVRkJReXhEUVVGRExFVkJRVWM3UVVGREwwSXNhVUpCUVUwc1EwRkJReXhMUVVGTExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRGRrTXNhVUpCUVVzc1NVRkJTU3hEUVVGRExGRkJRVkVzUlVGQlF6dEJRVU5xUWl4dlFrRkJVeXhEUVVGRE8wRkJRMVlzYjBKQlFWTXNUVUZCVFN4RFFVRkRMRXRCUVVzN1dVRkRkRUlzUTBGQlF5eERRVUZETzFWQlEwb3NRMEZCUXl4RFFVRkRPMUZCUTBvN096czdWVUZzVVd0Q0xGZEJRVmM3U1VGQlV5eFRRVUZUT3p0clFrRkJOMElzVjBGQlZ5eERPenM3T3pzN1FVTXpTMmhETEdGQlFWa3NRMEZCUXpzN096czdPenM3T3pzN08wRkJSV0lzUzBGQlNTeEhRVUZITEVkQlFVY3NiVUpCUVU4c1EwRkJReXhEUVVGaExFTkJRVU1zUTBGQlF6dEJRVU5xUXl4TFFVRkpMRk5CUVZNc1IwRkJSeXh0UWtGQlR5eERRVUZETEVOQlFXMUNMRU5CUVVNc1EwRkJRenRCUVVNM1F5eExRVUZKTEVsQlFVa3NSMEZCUnl4dFFrRkJUeXhEUVVGRExFVkJRV2RDTEVOQlFVTXNRMEZCUXpzN1MwRkRla0lzVjBGQlZ5d3JRMEZCVFN4RlFVRnhRanM3UzBGRk4wSXNZMEZCWXp0QlFVVjBRaXhaUVVaUkxHTkJRV01zUTBGRmNrSXNTVUZCU1N4RlFVRkRMRTlCUVU4c1JVRkJReXhSUVVGUkxFVkJRVVU3TWtKQlJtaENMR05CUVdNN08wRkJTUzlDTEdkRFFVcHBRaXhqUVVGakxEWkRRVWw2UWl4SlFVRkpMRVZCUVVNc1QwRkJUeXhGUVVGRExGRkJRVkVzUlVGQlJUczdRVUZGTjBJc1UwRkJTU3hEUVVGRExGZEJRVmNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRmRCUVZjc1EwRkJRenM3T3p0QlFVazNReXhUUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRE96czdPenM3UVVGTmNrTXNVMEZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhKUVVGSkxFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRWxCUVVrc1JVRkJSU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPenRCUVVWb1NDeFRRVUZKTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN08wRkJSVm9zVTBGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4SlFVRkpMRmRCUVZjc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4SlFVRkpMRVZCUVVNc1NVRkJTU3hEUVVGRExGZEJRVmNzUlVGQlF5eERRVUZETEVOQlFVTXNSVUZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRE0wY3NVMEZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4VlFVRlZMRU5CUVVNN08wRkJSVGRETEZOQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTTdPMEZCUlM5Q0xGTkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RlFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEpRVVZvUXpzN1lVRXpRbXRDTEdOQlFXTTdPMmRDUVVGa0xHTkJRV003UVVFMlFtcERMRzFDUVVGak8yTkJRVUVzTUVKQlFVYzdPMEZCUldZc1lVRkJTU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRemxDTEdGQlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTnNReXhoUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03TzBGQlJXcERMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVjBGQlZ5eERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOdVF5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdRVUZEZGtNc1lVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRE96dEJRVVZ3UXl4aFFVRkpMRU5CUVVNc1lVRkJZU3hGUVVGRkxFTkJRVU03VVVGSmRFSTdPMEZCUlVRc2EwSkJRV0U3WTBGQlFTeDVRa0ZCUnpzN1FVRkhaQ3hoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4WFFVRlhMRVZCUVVVN1FVRkRPVUlzWlVGQlNTeEpRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVU3UVVGRE5VSXNhVUpCUVVrc1EwRkJReXhYUVVGWExFZEJRVWNzVlVGQlZTeERRVUZETzFsQlF5OUNMRTFCUVUwN1FVRkRUQ3hwUWtGQlNTeERRVUZETEZkQlFWY3NSMEZCUnl4WlFVRlpMRU5CUVVNN1dVRkRha003VlVGRFJqczdRVUZGUkN4aFFVRkpMRU5CUVVNN1lVRkJSU3hEUVVGRE8yRkJRVVVzUTBGQlF6dGhRVUZGTEVOQlFVTTdZVUZCUlN4VFFVRlRPMkZCUVVVc1dVRkJXU3hoUVVGRE8wRkJRM2hETEdGQlFVa3NRMEZCUXl4UlFVRlJMRWRCUVVjN1FVRkRaQ3huUWtGQlN5eEZRVUZGTEVOQlFVTTdRVUZEVWl4WlFVRkRMRVZCUVVVc1EwRkJRenRWUVVOTUxFTkJRVU03TzBGQlJVWXNZVUZCU1N4SlFVRkpMRU5CUVVNc1YwRkJWeXhMUVVGTExGVkJRVlVzUlVGQlJUdEJRVU51UXl4bFFVRkpMRU5CUVVNc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUTJwRExGbEJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOcVFpeFpRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUTA0c1dVRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTTdRVUZEYmtJc1dVRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTTdRVUZEWml4bFFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNVMEZCVXl4SFFVRkhMRWRCUVVjc1EwRkJRenRCUVVONFF5eGxRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1IwRkJSeXhEUVVGRExFZEJRVU1zU1VGQlNTeERRVUZETEZWQlFWVXNSMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRla01zYjBKQlFWTXNSMEZCUnl4WlFVRlpMRWRCUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJTeERRVUZETEVOQlFVVXNSMEZCUXl4RFFVRkRMRWRCUVVNc1MwRkJTeXhEUVVGRE8wRkJRM0pFTEhWQ1FVRlpMRWRCUVVjc1EwRkJReXhIUVVGRExFTkJRVU1zUTBGQlF6dFZRVU53UWl4TlFVRk5PMEZCUTB3c1pVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOc1F5eFpRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMEZCUTA0c1dVRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTJ4Q0xGbEJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTJZc1dVRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTTdRVUZEYkVJc1pVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRk5CUVZNc1IwRkJSeXhIUVVGSExFTkJRVU03UVVGRGVFTXNaVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEZWQlFWVXNSMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRka01zYjBKQlFWTXNSMEZCUnl4alFVRmpMRWRCUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJTeERRVUZETEVOQlFVVXNSMEZCUXl4RFFVRkRMRWRCUVVNc1IwRkJSeXhEUVVGRE8wRkJRM0pFTEhWQ1FVRlpMRWRCUVVjc1EwRkJReXhIUVVGRExFTkJRVU1zUTBGQlF6dFZRVU53UWpzN1FVRkZSQ3hoUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRE4wSXNZVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zUjBGQlJ5eEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpkQ0xHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRmRCUVZjc1JVRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dEJRVU0zUXl4aFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1FVRkRla01zWVVGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzBGQlEzcERMR0ZCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEU5QlFVOHNSVUZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOcVF5eGhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhSUVVGUkxFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdPMEZCUld4RExHRkJRVWtzU1VGQlNTeERRVUZETEZkQlFWY3NTMEZCU3l4VlFVRlZMRVZCUVVVN1FVRkRia01zWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1IwRkJSeXhGUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlEycERMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEVkQlFVY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEyNUVMR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEU5QlFVOHNSVUZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOeVF5eGxRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmxCUVZrc1EwRkJReXhSUVVGUkxFVkJRVU1zUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03VlVGRE0wUXNUVUZCVFR0QlFVTk1MR1ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEVkQlFVY3NSVUZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOcVF5eGxRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmxCUVZrc1EwRkJReXhIUVVGSExFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEYWtNc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNUMEZCVHl4RlFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZEZGtRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNVVUZCVVN4RlFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xVkJRM1pETzBGQlEwUXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zVjBGQlZ5eEZRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRPMEZCUTJwRUxHRkJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1JVRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6dEJRVU0zUXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN08wRkJSVGRETEdGQlFVa3NTVUZCU1N4RFFVRkRMRmRCUVZjc1MwRkJTeXhWUVVGVkxFVkJRVVU3UVVGRGJrTXNaVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zU1VGQlNTeEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXk5Q0xHVkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRWxCUVVrc1JVRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMVZCUTJ4RUxFMUJRVTA3UVVGRFRDeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVOcVJDeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdWVUZEYUVNN1FVRkRSQ3hoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXpzN1FVRkhOVU1zWVVGQlNTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RlFVRkZPMEZCUTJwQ0xHVkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0VlFVTjBSRHRSUVVWR096dEJRVVZFTEcxQ1FVRmpPMk5CUVVFc01FSkJRVWM3TzBGQlJXWXNZVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03UVVGRGFFUXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRGRFUXNZVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRGJrUXNZVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFVkJRVVU3UVVGRGFrSXNaVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlRTeEZRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMVZCUTNaRE8xRkJSVVk3TzBGQlJVUXNWMEZCVFR0alFVRkJMR3RDUVVGSE8wRkJRMUFzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UFFVRlBMRVZCUVVVN1FVRkRha0lzWlVGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlF5eEpRVUZKTEVOQlFVTTdWVUZEZGtNN1FVRkRSQ3hoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXpzN1FVRkZOVU1zWVVGQlNTeEpRVUZKTEVOQlFVTXNWMEZCVnl4TFFVRkxMRlZCUVZVc1JVRkJSVHRCUVVOc1F5eGxRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZWQlFWVXNSMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRE8wRkJRM3BFTEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFbEJRVWtzUlVGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdRVUZETDBRc1pVRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNSMEZCUnl4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVOcVJTeGxRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmxCUVZrc1EwRkJReXhSUVVGUkxFVkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRWUVVNeFJDeE5RVUZOTzBGQlEwb3NaVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4VlFVRlZMRWRCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF6dEJRVU40UkN4bFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU5xUkN4bFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRha01zWlVGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4WlFVRlpMRU5CUVVNc1QwRkJUeXhGUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1ZVRkRla1E3VVVGRFJqczdRVUZGUkN4VFFVRkpPMk5CUVVFc1owSkJRVWM3UVVGRFRDeGhRVUZKTEVOQlFVTXNUMEZCVHl4SFFVRkhMRWxCUVVrc1EwRkJRenRCUVVOd1FpeGhRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVTBGQlV5eEhRVUZETEVkQlFVY3NRMEZCUXp0QlFVTnlReXhoUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRE8wRkJRMnhETEdGQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVVc1EwRkJRenRSUVVOa096dEJRVVZFTEZWQlFVczdZMEZCUVN4cFFrRkJSenRCUVVOT0xHRkJRVWtzU1VGQlNTeERRVUZETEU5QlFVOHNSVUZCUlR0QlFVTm9RaXhsUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGFrTXNaVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZsQlFWa3NRMEZCUlN4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUTBGQlJTeERRVUZETzBGQlF6ZEVMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEZRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRWUVVOb1F6dFJRVU5HT3p0QlFVVkVMRTlCUVVVN1kwRkJRU3hqUVVGSE8wRkJRMGdzWVVGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRja0lzWVVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMUZCUTJZN08wRkJSVWNzWlVGQlZUdFpRVUZCTEZsQlFVYzdRVUZEWml4blFrRkJUeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXp0UlFVTXZRanM3UVVGVlJ5eFZRVUZMT3pzN096czdPenRaUVVoQkxGbEJRVWM3UVVGRFZpeG5Ra0ZCVHl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF6dFJRVU14UWp0WlFVTlJMRlZCUVVNc1EwRkJReXhGUVVGRk8wRkJRMWdzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGRFSXNZVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4VlFVRlZMRU5CUVVNN1FVRkROME1zWVVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMUZCUTJZN08wRkJWVWNzVVVGQlJ6czdPenM3T3pzN1dVRklRU3haUVVGSE8wRkJRMUlzWjBKQlFVOHNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU03VVVGRGVFSTdXVUZEVFN4VlFVRkRMRU5CUVVNc1JVRkJSVHRCUVVOVUxHRkJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOeVFqczdRVUZWUnl4UlFVRkhPenM3T3pzN096dFpRVWhCTEZsQlFVYzdRVUZEVWl4blFrRkJUeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXp0UlFVTjRRanRaUVVOTkxGVkJRVU1zUTBGQlF5eEZRVUZGTzBGQlExUXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF5eERRVUZETzFGQlEzSkNPenRCUVZWSExGTkJRVWs3T3pzN096czdPMWxCU0VFc1dVRkJSenRCUVVOVUxHZENRVUZQTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRE8xRkJRM3BDTzFsQlEwOHNWVUZCUXl4RFFVRkRMRVZCUVVVN1FVRkRWaXhoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRkRUk3TzBGQlZVY3NVMEZCU1RzN096czdPenM3V1VGSVFTeFpRVUZITzBGQlExUXNaMEpCUVU4c1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eEpRVUZKTEVOQlFVTTdVVUZETTBJN1dVRkRUeXhWUVVGRExFTkJRVU1zUlVGQlJUdEJRVU5XTEdGQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1NVRkJTU3hIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU40UWpzN096dFZRVGRQYTBJc1kwRkJZenRKUVVGVExGTkJRVk03TzJ0Q1FVRm9ReXhqUVVGakxFTTdPenM3T3p0QlExQnVReXhoUVVGWkxFTkJRVU03T3pzN096czdPenM3T3p0QlFVVmlMRXRCUVVrc1IwRkJSeXhIUVVGSExHMUNRVUZQTEVOQlFVTXNRMEZCWVN4RFFVRkRMRU5CUVVNN1FVRkRha01zUzBGQlNTeEpRVUZKTEVkQlFVY3NiVUpCUVU4c1EwRkJReXhEUVVGakxFTkJRVU1zUTBGQlF6dEJRVU51UXl4TFFVRkpMRk5CUVZNc1IwRkJSeXh0UWtGQlR5eERRVUZETEVOQlFXMUNMRU5CUVVNc1EwRkJRenRCUVVNM1F5eExRVUZKTEVsQlFVa3NSMEZCUnl4dFFrRkJUeXhEUVVGRExFVkJRV2RDTEVOQlFVTXNRMEZCUXpzN1MwRkRla0lzVjBGQlZ5d3JRMEZCVFN4RlFVRnhRanM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096dExRWGxDTjBJc1IwRkJSenRCUVVWWUxGbEJSbEVzUjBGQlJ5eEhRVVZTT3pKQ1FVWkxMRWRCUVVjN08wRkJTWEJDTEZOQlFVa3NUMEZCVHl4SFFVRkhMRU5CUVVNc1QwRkJUeXhGUVVGRExFOUJRVThzUTBGQlF5eERRVUZET3p0QlFVVm9ReXhUUVVGSkxGRkJRVkVzUjBGQlJ6dEJRVU5pTEdGQlFWRXNRMEZCUXl4SFFVRkhMRVZCUVVNc1JVRkJSU3hEUVVGRE8wRkJRMmhDTEc5Q1FVRmxMRmxCUVZrN1FVRkRNMElzWVVGQlVTeFZRVUZWTzBGQlEyeENMR05CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVOQlFVTTdRVUZEWml4aFFVRlJMRU5CUVVNN1FVRkRWQ3hqUVVGVExFTkJRVU03UVVGRFZpeG5Ra0ZCVnl4SlFVRkpPMDFCUTJoQ0xFTkJRVU03TzBGQlJVWXNaME5CYUVKcFFpeEhRVUZITERaRFFXZENaQ3hUUVVGVExFVkJRVU1zVDBGQlR5eEZRVUZETEZGQlFWRXNSVUZCUlRzN1FVRkZiRU1zVTBGQlNTeERRVUZETEZkQlFWY3NSMEZCUnl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExGZEJRVmNzUTBGQlF6czdRVUZGTjBNc1UwRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRWxCUVVrc1EwRkJRenM3UVVGRkwwSXNVMEZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEU5QlFVOHNRMEZCUXpzN096dEJRVWx5UXl4VFFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RFFVRkRPenRCUVVVdlFpeFRRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RlFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdPMEZCUldoSUxGTkJRVWtzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXpzN1FVRkZXaXhUUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NWMEZCVnl4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeEZRVUZETEVsQlFVa3NRMEZCUXl4WFFVRlhMRVZCUVVNc1EwRkJReXhEUVVGRExFVkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTJ4SExGTkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVlVGQlZTeERRVUZET3p0QlFVVTNReXhUUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRE96dEJRVVV2UWl4VFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUlVGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1NVRkZhRU03TzJGQmRrTnJRaXhIUVVGSE96dG5Ra0ZCU0N4SFFVRkhPMEZCZVVOMFFpeHRRa0ZCWXp0alFVRkJMREJDUVVGSE96dEJRVVZtTEdGQlFVa3NRMEZCUXl4SFFVRkhMRWRCUVVjc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTTVRaXhoUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03TzBGQlJXcERMR0ZCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVjBGQlZ5eERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOdVF5eGhRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTTdVVUZGY2tNN08wRkJSVVFzYTBKQlFXRTdZMEZCUVN4NVFrRkJSenM3UVVGRlpDeGhRVUZKTEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVVN1FVRkRha0lzWlVGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMVZCUTNSRU96dEJRVVZFTEdGQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTzBGQlF6VkNMR1ZCUVVrc1EwRkJReXhYUVVGWExFZEJRVWNzVlVGQlZTeERRVUZETzFWQlF5OUNMRTFCUVUwN1FVRkRUQ3hsUVVGSkxFTkJRVU1zVjBGQlZ5eEhRVUZITEZsQlFWa3NRMEZCUXp0VlFVTnFRenM3UVVGRlJDeGhRVUZKTEVOQlFVTTdZVUZCUlN4RFFVRkRPMkZCUVVVc1EwRkJRenRoUVVGRkxFTkJRVU03WVVGQlJTeFRRVUZUTzJGQlFVVXNXVUZCV1N4aFFVRkRPMEZCUTNoRExHRkJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVYzdRVUZEWkN4blFrRkJTeXhGUVVGRkxFTkJRVU03UVVGRFVpeFpRVUZETEVWQlFVVXNRMEZCUXp0VlFVTk1MRU5CUVVNN08wRkJSVVlzWVVGQlNTeEpRVUZKTEVOQlFVTXNWMEZCVnl4TFFVRkxMRlZCUVZVc1JVRkJSVHRCUVVOdVF5eGxRVUZKTEVOQlFVTXNVMEZCVXl4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUTBGQlF5eERRVUZETzBGQlEycERMRmxCUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eEhRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnFRaXhaUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzBGQlEwNHNXVUZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU03UVVGRGJrSXNXVUZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU03UVVGRFppeGxRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVTBGQlV5eEhRVUZITEVkQlFVY3NRMEZCUXp0QlFVTjRReXhsUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NSMEZCUnl4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVkQlFVTXNTVUZCU1N4RFFVRkRMRlZCUVZVc1NVRkJSU3hEUVVGRExFZEJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRWRCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRE4wVXNiMEpCUVZNc1IwRkJSeXhaUVVGWkxFZEJRVU1zU1VGQlNTeERRVUZETEZOQlFWTXNSMEZCUlN4RFFVRkRMRU5CUVVVc1IwRkJReXhEUVVGRExFZEJRVU1zUzBGQlN5eERRVUZETzBGQlEzSkVMSFZDUVVGWkxFZEJRVWNzUTBGQlF5eEhRVUZETEVOQlFVTXNRMEZCUXp0VlFVTndRaXhOUVVGTk8wRkJRMHdzWlVGQlNTeERRVUZETEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUTBGQlF6dEJRVU5zUXl4WlFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8wRkJRMDRzV1VGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVNc1EwRkJReXhEUVVGRE8wRkJRMnhDTEZsQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRE8wRkJRMllzV1VGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNN1FVRkRiRUlzWlVGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJ5eEhRVUZITEVOQlFVTTdRVUZEZUVNc1pVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRlZCUVZVc1NVRkJSU3hEUVVGRExFZEJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRWRCUVVNc1EwRkJReXhEUVVGRExFZEJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRNMFVzYjBKQlFWTXNSMEZCUnl4alFVRmpMRWRCUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJTeERRVUZETEVOQlFVVXNSMEZCUXl4RFFVRkRMRWRCUVVNc1IwRkJSeXhEUVVGRE8wRkJRM0pFTEhWQ1FVRlpMRWRCUVVjc1EwRkJReXhIUVVGRExFTkJRVU1zUTBGQlF6dFZRVU53UWpzN1FVRkZSQ3hoUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4SFFVRkhMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRE4wSXNZVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zUjBGQlJ5eEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpkQ0xHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRmRCUVZjc1JVRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dEJRVU0zUXl4aFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eEpRVUZKTEVWQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1FVRkRla01zWVVGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzBGQlEzcERMR0ZCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zV1VGQldTeERRVUZETEU5QlFVOHNSVUZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOcVF5eGhRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhSUVVGUkxFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdPMEZCUld4RExHRkJRVWtzU1VGQlNTeERRVUZETEZkQlFWY3NTMEZCU3l4VlFVRlZMRVZCUVVVN1FVRkRia01zWlVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1NVRkJTU3hGUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF5OUNMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVsQlFVa3NSVUZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzFWQlEyeEVMRTFCUVUwN1FVRkRUQ3hsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTnFSQ3hsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4SlFVRkpMRVZCUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VlVGRGFFTTdRVUZEUkN4aFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVVUzUXpzN1FVRkZSQ3h0UWtGQll6dGpRVUZCTERCQ1FVRkhPenRCUVVWbUxHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPMEZCUTJoRUxHRkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPenRCUVVWdVJDeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTlCUVU4c1JVRkJSVHRCUVVOcVFpeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhOUVVGTkxFVkJRVU1zWVVGQllTeERRVUZETEVOQlFVTTdWVUZET1VNN1VVRkZSanM3UVVGRlJDeFhRVUZOTzJOQlFVRXNhMEpCUVVjN1FVRkRVQ3hoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNSVUZCUlR0QlFVTnFRaXhsUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1UwRkJVeXhIUVVGRExFbEJRVWtzUTBGQlF6dFZRVU4yUXp0QlFVTkVMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVkQlFVY3NSVUZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZET3p0QlFVVTFReXhoUVVGSkxFbEJRVWtzUTBGQlF5eFhRVUZYTEV0QlFVc3NWVUZCVlN4RlFVRkZPMEZCUTI1RExHVkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1ZVRkJWU3hKUVVGRkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFZEJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZETlVZc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRWUVVOcVJTeE5RVUZOTzBGQlEwd3NaVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4VlFVRlZMRWxCUVVVc1NVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1IwRkJReXhEUVVGRExFTkJRVU1zUjBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVNelJpeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhKUVVGSkxFVkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRWUVVOdVJEdFJRVU5HT3p0QlFVZEVMRlZCUVVzN1kwRkJRU3hwUWtGQlJ6dEJRVU5PTEdGQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eFRRVUZUTEVkQlFVTXNSMEZCUnl4RFFVRkRPMEZCUTNKRExHRkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU03UVVGRGJFTXNZVUZCU1N4RFFVRkRMRWxCUVVrc1JVRkJSU3hEUVVGRE8xRkJRMkk3TzBGQlJVUXNVMEZCU1R0alFVRkJMR2RDUVVGSE8wRkJRMHdzWVVGQlNTeEpRVUZKTEVOQlFVTXNUMEZCVHl4RlFVRkZPMEZCUTJoQ0xHVkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6czdRVUZGYWtNc1pVRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmxCUVZrc1EwRkJSU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUlN4RFFVRkRPenRCUVVVM1JDeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJRenRCUVVOcVFpeHJRa0ZCU3l4RlFVRkZMRWxCUVVrc1EwRkJReXhMUVVGTE8wRkJRMnBDTEdOQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJReXhEUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF6dEJRVU5vUkN4alFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlJTeEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFVkJRVU1zUTBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTTdXVUZEYWtRc1EwRkJReXhEUVVGRE8xVkJSVW83VVVGRFJqczdRVUZGUkN4WlFVRlBPMk5CUVVFc2JVSkJRVWM3UVVGRFVpeGhRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1VVRkRaanM3UVVGVlJ5eFZRVUZMT3pzN096czdPMWxCU2tFc1dVRkJSenRCUVVOV0xHZENRVUZQTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRE8xRkJRekZDTzFsQlJWRXNWVUZCUXl4TFFVRkxMRVZCUVVVN1FVRkRaaXhoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVNeFFpeGhRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXp0QlFVTTNReXhoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUXp0QlFVTnFRaXhuUWtGQlN5eEZRVUZGTEVsQlFVa3NRMEZCUXl4TFFVRkxPMEZCUTJwQ0xGbEJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkZMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUXl4RFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRCUVVOb1JDeFpRVUZETEVWQlFVVXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJSU3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVNc1EwRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSVUZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU03VlVGRGFrUXNRMEZCUXl4RFFVRkRPMEZCUTBnc1lVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFGQlEyWTdPMEZCUlVjc1pVRkJWVHRaUVVGQkxGbEJRVWM3UVVGRFppeG5Ra0ZCVHl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGVkJRVlVzUTBGQlF6dFJRVU12UWpzN096dFZRWFpNYTBJc1IwRkJSenRKUVVGVExGTkJRVk03TzJ0Q1FVRnlRaXhIUVVGSExFTTdPenM3T3p0QlF5OUNlRUlzWVVGQldTeERRVUZET3pzN096czdPenM3TzBGQlJXSXNTMEZCU1N4SlFVRkpMRWRCUVVjc2JVSkJRVThzUTBGQlF5eERRVUZqTEVOQlFVTXNRMEZCUXp0QlFVTnVReXhMUVVGSkxFZEJRVWNzUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRU5CUVdFc1EwRkJReXhEUVVGRE8wRkJRMnBETEV0QlFVa3NVMEZCVXl4SFFVRkhMRzFDUVVGUExFTkJRVU1zUTBGQmJVSXNRMEZCUXl4RFFVRkRPenRCUVVjM1F5eExRVUZKTEV0QlFVc3NSMEZCUnl4bFFVRlRMRXRCUVVzc1JVRkJReXhSUVVGUkxFVkJRVVU3TzBGQlJXNURMRTlCUVVrc1EwRkJReXhEUVVGRExFZEJRVWNzUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnFRaXhQUVVGSkxFTkJRVU1zUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRha0lzVDBGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4UlFVRlJMRU5CUVVNN08wRkJSWHBDTEU5QlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0QlFVTndReXhQUVVGSkxFTkJRVU1zVDBGQlR5eERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRVZCUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN08wRkJSVGxFTEU5QlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNN08wRkJSV2hFTEU5QlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1dVRkJWenRCUVVOMlFpeFRRVUZKTEVOQlFVTXNSMEZCUnl4RlFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1JVRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4SFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGRExFTkJRVU1zUTBGQlF6dEJRVU53UlN4VFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZITEVWQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRiRU1zUTBGQlF6czdRVUZGUml4UFFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExGVkJRVk1zUTBGQlF5eEZRVUZETEVOQlFVTXNSVUZCUlRzN1FVRkZlRUlzVTBGQlNTeERRVUZETEVOQlFVTXNSMEZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGSExFTkJRVU1zUjBGQlNTeERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJRenRCUVVOdVF5eFRRVUZKTEVOQlFVTXNRMEZCUXl4SFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVWNzUTBGQlF5eEhRVUZKTEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRE96dEJRVVZ1UXl4VFFVRkpMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUzBGQlN5eERRVUZETEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJSU3hEUVVGRExFVkJRVVU3TzBGQlJYaERMRmRCUVVrc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlF5eERRVUZETEVOQlFVTTdRVUZEY0VRc1YwRkJTU3hUUVVGVExFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZETEVOQlFVTXNRMEZCUXpzN1FVRkZjRVFzVjBGQlNTeFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhMUVVGTExFTkJRVU1zVTBGQlV5eERRVUZETEVOQlFVTTdRVUZET1VNc1YwRkJTU3hSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4TFFVRkxMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU03TzBGQlJUbERMRmRCUVVrc1NVRkJTU3hIUVVGSExGTkJRVk1zU1VGQlNTeERRVUZETEVkQlFVY3NVVUZCVVN4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGRE0wTXNWMEZCU1N4TFFVRkxMRWRCUVVjc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1IwRkJSeXhSUVVGUkxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXpzN1FVRkZjRVVzVjBGQlNTeEpRVUZKTEVOQlFVTXNRMEZCUXl4SFFVRkhMRWxCUVVrc1JVRkJSVHRCUVVGRkxHRkJRVWtzUTBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRPMUZCUVVVN1FVRkRja01zVjBGQlNTeEpRVUZKTEVOQlFVTXNRMEZCUXl4SFFVRkhMRXRCUVVzc1JVRkJSVHRCUVVGRkxHRkJRVWtzUTBGQlF5eERRVUZETEVkQlFVY3NTMEZCU3l4RFFVRkRPMUZCUVVVN1RVRkZlRU03TzBGQlJVUXNVMEZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zWTBGQll5eEZRVUZGTEVOQlFVTTdRVUZEZEVNc1UwRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEYWtRc1UwRkJTU3hEUVVGRExFOUJRVThzUTBGQlF5eFpRVUZaTEVOQlFVTXNTVUZCU1N4RlFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZEYkVRc1EwRkJRenM3UVVGRlJpeFBRVUZKTEVOQlFVTXNZMEZCWXl4SFFVRkhMRmxCUVZjN1FVRkRMMElzV1VGQlR6dEJRVU5NTEZGQlFVTXNSVUZCUlN4SlFVRkpMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3p0QlFVTXZRaXhSUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVkQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1NVRkJTU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMDdUVUZEY2tNc1EwRkJRenRKUVVOSUxFTkJRVU03TzBGQlJVWXNUMEZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEZRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRVZCUVVNc1NVRkJTU3hEUVVGRExFTkJRVU03UVVGRE9VSXNUMEZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE96dEJRVVZrTEU5QlFVa3NRMEZCUXl4UFFVRlBMRWRCUVVjc1dVRkJWenRCUVVONFFpeFRRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRTlCUVU4c1EwRkJReXhYUVVGWExFTkJRVU1zU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPMEZCUTJoRUxGTkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdTVUZEYWtVc1EwRkJRenRGUVVkSUxFTkJRVU03T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3TzB0QlowUnRRaXhSUVVGUk8wRkJSV2hDTEZsQlJsRXNVVUZCVVN4SFFVVmlPekpDUVVaTExGRkJRVkU3TzBGQlNYcENMRk5CUVVrc1QwRkJUeXhIUVVGSExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTTdPMEZCUlhoQ0xGTkJRVWtzVVVGQlVTeEhRVUZITzBGQlEySXNZVUZCVVN4RFFVRkRMRWRCUVVjc1JVRkJReXhIUVVGSExFTkJRVU03UVVGRGFrSXNaVUZCVlN4RFFVTllPMEZCUTBNc1ZVRkJReXhGUVVGRkxFZEJRVWM3UVVGRFRpeFZRVUZETEVWQlFVVXNSMEZCUnp0UlFVTk9MRVZCUTBRN1FVRkRReXhWUVVGRExFVkJRVVVzU1VGQlNUdEJRVU5RTEZWQlFVTXNSVUZCUlN4SFFVRkhPMUZCUTA0c1JVRkRSRHRCUVVORExGVkJRVU1zUlVGQlJTeEpRVUZKTzBGQlExQXNWVUZCUXl4RlFVRkZMRWRCUVVjN1VVRkRUaXhGUVVORU8wRkJRME1zVlVGQlF5eEZRVUZGTEVkQlFVYzdRVUZEVGl4VlFVRkRMRVZCUVVVc1IwRkJSenRSUVVOT0xFTkJRMFE3VFVGRFFTeERRVUZET3p0QlFVVkdMR2REUVRWQ2FVSXNVVUZCVVN3MlEwRTBRbTVDTEZOQlFWTXNSVUZCUXl4UFFVRlBMRVZCUVVNc1VVRkJVU3hGUVVGRk96dEJRVVZzUXl4VFFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRPenRCUVVWdVF5eFRRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRVZCUVVVc1EwRkJRenM3UVVGRmFFSXNVMEZCU1N4RFFVRkRMRkZCUVZFc1IwRkJSeXhMUVVGTExFTkJRVU03TzBGQlJYUkNMRk5CUVVrc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dEpRVWRpT3p0aFFYWkRhMElzVVVGQlVUczdaMEpCUVZJc1VVRkJVVHRCUVhsRE0wSXNiVUpCUVdNN1kwRkJRU3d3UWtGQlJ6czdPMEZCUjJZc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFBRVUZQTEVOQlFVTXNWVUZCUXl4TFFVRkxMRVZCUVVzN1FVRkROMElzWlVGQlNTeEpRVUZKTEVkQlFVY3NTVUZCU1N4TFFVRkxMRU5CUVVNc1MwRkJTeXhSUVVGTkxFTkJRVU03UVVGRGFrTXNhVUpCUVVzc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXp0VlFVTjJRaXhEUVVGRExFTkJRVU03TzBGQlJVZ3NZVUZCU1N4RFFVRkRMRlZCUVZVc1JVRkJSU3hEUVVGRE96dEJRVVZzUWl4aFFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFZEJRVWNzUTBGQlF5eE5RVUZOTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNN1FVRkRia01zWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6RkRMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEUxQlFVMHNSVUZCUlN4TlFVRk5MRU5CUVVNc1EwRkJRenM3UVVGRmRrTXNZVUZCU1N4RFFVRkRMRTlCUVU4c1EwRkJReXhYUVVGWExFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRPenRCUVVWd1F5eGhRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zVlVGQlZTeERRVUZETEVOQlFVTTdRVUZEYmtNc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNZMEZCWXl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE96dEJRVVU1UXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNN1VVRkZja003TzBGQlJVUXNhMEpCUVdFN1kwRkJRU3g1UWtGQlJ6czdRVUZGWkN4alFVRkxMRWxCUVVrc1EwRkJReXhIUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdRVUZEZEVNc1pVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRCUVVOMlFpeGxRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzFWQlEzUkNPenRCUVVWRUxHRkJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXp0UlFVVm1PenRCUVVWRUxHMUNRVUZqTzJOQlFVRXNNRUpCUVVjN096dEJRVVZtTEdGQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExHVkJRV1VzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJRenRCUVVOMFJDeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhSUVVGUkxFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVOeVJDeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhOUVVGTkxFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVOdVJDeGhRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1EwRkJReXhWUVVGRExFbEJRVWtzUlVGQlN6dEJRVU16UWl4bFFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExGbEJRVmtzUTBGQlF5eE5RVUZOTEVWQlFVTXNUVUZCU3l4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03VlVGRGRFUXNRMEZCUXl4RFFVRkRPMUZCUlVvN08wRkJSVVFzVjBGQlRUdGpRVUZCTEd0Q1FVRkhPenRCUVVWUUxHRkJRVWtzUTBGQlF5eGhRVUZoTEVWQlFVVXNRMEZCUXp0UlFVTjBRanM3UVVGRlJDeHZRa0ZCWlR0alFVRkJMREpDUVVGSE96czdRVUZEYUVJc1lVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEZRVUZGTEVOQlFVTTdRVUZEYWtJc1lVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFBRVUZQTEVOQlFVTXNWVUZCUXl4SlFVRkpMRVZCUVVzN1FVRkRNMElzYVVKQlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXp0VlFVTTFReXhEUVVGRExFTkJRVU03VVVGRFNqczdRVUZGUkN4clFrRkJZVHRqUVVGQkxIbENRVUZIT3pzN1FVRkhaQ3hoUVVGSkxFbEJRVWtzUjBGQlJ5eEpRVUZKTEVkQlFVVXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJRenM3T3pzN1FVRkxMME1zWVVGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4UFFVRlBMRU5CUVVNc1ZVRkJReXhKUVVGSkxFVkJRVXM3TzBGQlJUTkNMR1ZCUVVrc1NVRkJTU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNSMEZCUnl4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRPMVZCUTNoRUxFTkJRVU1zUTBGQlF6czdPMEZCU1Vnc1lVRkJTU3hKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NSMEZCUnl4SFFVRkZMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TlFVRk5MRWRCUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXpzN1FVRkZja1VzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1VVRkJVU3hGUVVGRkxFbEJRVWtzUTBGQlF5eERRVUZET3pzN096dEJRVXQyUXl4aFFVRkpMRWxCUVVrc1NVRkJTU3hIUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVkQlFVVXNSMEZCUnl4SFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVU1zU1VGQlNTeERRVUZETzBGQlF6bERMR0ZCUVVrc1NVRkJTU3hKUVVGSkxFZEJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXpzN1FVRkZla0lzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1VVRkJVU3hGUVVGRkxFbEJRVWtzUTBGQlF5eERRVUZETzFGQlJYaERPenRCUVVsRUxGVkJRVXM3WTBGQlFTeHBRa0ZCUnpzN1FVRkZUaXhoUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEV0QlFVc3NRMEZCUXp0QlFVTjJRaXhoUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4bFFVRmxMRVZCUVVVc1EwRkJRenM3UVVGRmRFTXNZVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVNc1EwRkJReXhIUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU51Uml4aFFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXpzN08wRkJSemxDTEdGQlFVa3NRMEZCUXl4bFFVRmxMRVZCUVVVc1EwRkJRenRCUVVOMlFpeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdRVUZEYWtNc1lVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETzFGQlEyUTdPMEZCUlVRc1UwRkJTVHRqUVVGQkxHZENRVUZITzBGQlEwNHNZVUZCU1N4SlFVRkpMRU5CUVVNc1QwRkJUeXhGUVVGRk8wRkJRMllzWlVGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFVkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTNCRUxHVkJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRPenRCUVVWeVFpeGxRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFZEJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSVUZCUXl4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVkQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRM0JHTEdWQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZET3p0QlFVVTNRaXhsUVVGSkxFTkJRVU1zWlVGQlpTeEZRVUZGTEVOQlFVTTdRVUZEZWtJc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVWQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE8wRkJRMmhETEdWQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRWUVVOa08xRkJRMFE3TzBGQlJVUXNXVUZCVHp0alFVRkJMRzFDUVVGSE96dEJRVVZVTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRk8wRkJRMnBDTEdWQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEU5QlFVOHNSVUZCUlN4RFFVRkRPMVZCUTNSRE96dEJRVVZCTEdGQlFVa3NRMEZCUXl4bFFVRmxMRVZCUVVVc1EwRkJRenRCUVVOMlFpeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1JVRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdRVUZEYWtNc1lVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZET3pzN1FVRkhaQ3hoUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXp0UlFVTnlRanM3UVVGSFJDeHZRa0ZCWlR0alFVRkJMREpDUVVGSE8wRkJRMnBDTEdGQlFVa3NXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJRenM3UVVGRmVFSXNZVUZCU1N4WFFVRlhMRWRCUVVjc1MwRkJTeXhEUVVGRE8wRkJRM2hDTEdGQlFVa3NUVUZCVFN4SFFVRkhMRXRCUVVzc1EwRkJRenRCUVVOc1FpeGhRVUZKTEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUjBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUTJoRExHRkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUjBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRPMEZCUTI1RExHRkJRVWtzUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNN1FVRkRlRUlzWTBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN096dEJRVWR3UXl4bFFVRkpMRkZCUVZFc1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVjc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVjc1EwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUlN4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUnl4RFFVRkRMRU5CUVVNc1EwRkJSU3hEUVVGRE96czdRVUZITlVZc1pVRkJTU3hSUVVGUkxFZEJRVWNzVjBGQlZ5eEZRVUZGTzBGQlF6TkNMSGRDUVVGWExFZEJRVWNzVVVGQlVTeERRVUZETzBGQlEzWkNMSGxDUVVGWkxFZEJRVWNzUTBGQlF5eERRVUZETzBGQlEycENMRzFDUVVGTkxFZEJRVWNzUTBGQlF5eEhRVUZITEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGVFSTdWVUZGUkRzN08wRkJSMFFzWVVGQlNTeFhRVUZYTEVkQlFVTXNTVUZCU1N4RlFVRkZPenRCUVVWdVFpeDFRa0ZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhoUVVGaExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWRCUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZET3p0QlFVVTNSQ3hsUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXl4WlFVRlpMRVZCUVVNc1EwRkJReXhGUVVGRkxFbEJRVWtzUzBGQlN5eERRVUZETzBGQlF6TkRMR05CUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTenRCUVVNeFFpeGpRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEhRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5PMWxCUXpkQ0xFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXp0QlFVTlNMR1ZCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETzFWQlJYWkNPenRCUVVWRUxHZENRVUZQTEZsQlFWa3NRMEZCUXp0UlFVTndRanM3UVVGRlJDeHJRa0ZCWVR0alFVRkJMSFZDUVVGRExFTkJRVU1zUlVGQlJUczdPMEZCUTJZc1lVRkJTU3hMUVVGTExFZEJRVWNzUTBGQlF5eERRVUZETzBGQlEyUXNZVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhQUVVGUExFTkJRVU1zVlVGQlF5eEpRVUZKTEVWQlFVTXNRMEZCUXl4RlFVRkxPMEZCUXpkQ0xHVkJRVWtzVFVGQlN5eExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJUdEJRVU40UWl4clFrRkJTeXhIUVVGSExFTkJRVU1zUjBGQlF5eERRVUZETEVOQlFVTTdXVUZEWWp0VlFVTkdMRU5CUVVNc1EwRkJRenRCUVVOSUxHZENRVUZQTEV0QlFVc3NRMEZCUXp0UlFVTmtPenRCUVVWRUxHTkJRVk03WTBGQlFTeHRRa0ZCUXl4RFFVRkRMRVZCUVVVN08wRkJSVm9zWVVGQlNTeFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEYUVRc1lVRkJTU3hSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03TzBGQlJTOURMR0ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkZMRkZCUVZFc1JVRkJSU3hSUVVGUkxFTkJRVVVzUTBGQlF6dFJRVVV4UXpzN1FVRkxSQ3hsUVVGVk96czdPenM3WTBGQlFTeHpRa0ZCUnp0QlFVTllMR0ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEZWQlFWTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJRenRCUVVNMVFpeHJRa0ZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdWVUZEYkVJc1EwRkJReXhEUVVGRE8xRkJRMG83TzBGQlVVUXNZVUZCVVRzN096czdPenM3WTBGQlFTeHJRa0ZCUXl4RFFVRkRMRVZCUVVNc1EwRkJReXhGUVVGRk8wRkJRMW9zWVVGQlNTeExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRVU03TzBGQlJUbENMR0ZCUVVrc1EwRkJReXhWUVVGVkxFVkJRVVVzUTBGQlF6czdRVUZGYkVJc1kwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMEZCUTNoRExHVkJRVWtzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTzBGQlEzWkNMR3RDUVVGTExFZEJRVWNzUTBGQlF5eERRVUZETzBGQlExWXNiVUpCUVUwN1dVRkRVRHRWUVVOSU96dEJRVVZCTEdGQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUlVGQlJTeERRVUZETEVWQlFVVXNTVUZCU1N4TFFVRkxMRU5CUVVNN1FVRkRjRU1zV1VGQlF5eEZRVUZGTEVOQlFVTTdRVUZEU2l4WlFVRkRMRVZCUVVVc1EwRkJRenRWUVVOTUxFVkJRVVVzU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXpzN1FVRkZWaXhoUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPenRCUVVWMFFpeGhRVUZKTEVOQlFVTXNaVUZCWlN4RlFVRkZMRU5CUVVNN1FVRkRka0lzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRVZCUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZET3p0QlFVVm9ReXhoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZEWmpzN1FVRlBSQ3hUUVVGSk96czdPenM3TzJOQlFVRXNZMEZCUXl4RFFVRkRMRVZCUVVVN08wRkJSVTRzWVVGQlNTeFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU4wUXl4aFFVRkpMRlZCUVZVc1IwRkJSeXhUUVVGVExFZEJRVU1zUTBGQlF5eERRVUZETzBGQlF6ZENMR0ZCUVVrc1ZVRkJWU3hIUVVGSExFTkJRVU1zUlVGQlJUdEJRVU5zUWl4eFFrRkJWU3hIUVVGSExFTkJRVU1zUTBGQlF6dFZRVU5vUWp0QlFVTkVMR0ZCUVVrc1UwRkJVeXhKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUTJ4RExHOUNRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFZEJRVU1zUTBGQlF5eERRVUZETzFWQlEycERPMEZCUTBRc1lVRkJTU3hWUVVGVkxFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJRenRCUVVONFF5eGhRVUZKTEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETzBGQlEzUkRMR0ZCUVVrc1IwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRExFVkJRVVVzVTBGQlV5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRGVFUXNZVUZCU1N4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEhRVUZITEVWQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1JVRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZEZEVRc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1FVRkRlRUlzWjBKQlFVOHNTMEZCU3l4RFFVRkRPMUZCUTJRN08wRkJVMFFzWTBGQlV6czdPenM3T3pzN08yTkJRVUVzYlVKQlFVTXNTMEZCU3l4RlFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFVkJRVVU3UVVGRGJrSXNZVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wRkJRelZDTEdGQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGRFSXNZVUZCU1N4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8wRkJRM1pDTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTm9ReXhoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZEWmpzN1FVRlRSQ3huUWtGQlZ6czdPenM3T3pzN08yTkJRVUVzY1VKQlFVTXNTMEZCU3l4RlFVRkRMRTlCUVU4c1JVRkJReXhQUVVGUExFVkJRVVU3UVVGRGFrTXNZVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVTXNUMEZCVHl4RlFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE8wRkJRMmhHTEdGQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03UVVGRGRFSXNZVUZCU1N4RFFVRkRMR1ZCUVdVc1JVRkJSU3hEUVVGRE8wRkJRM1pDTEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hGUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0QlFVTm9ReXhoUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZEWmpzN1FVRlBSQ3hwUWtGQldUczdPenM3T3p0alFVRkJMSE5DUVVGRExFdEJRVXNzUlVGQlJUdEJRVU5zUWl4aFFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEU5QlFVOHNSVUZCUlN4RFFVRkRPMEZCUXpWQ0xHRkJRVWtzUTBGQlF5eGxRVUZsTEVWQlFVVXNRMEZCUXp0QlFVTjJRaXhoUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNSVUZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGRGFFTXNZVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRE8xRkJRMlk3TzBGQlQwUXNZMEZCVXpzN096czdPenRqUVVGQkxHMUNRVUZETEZOQlFWTXNSVUZCUlRzN08wRkJRMjVDTEdkQ1FVRlBMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeEZRVUZGTzBGQlEzaENMR1ZCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RlFVRkZMRU5CUVVNN1ZVRkRla0k3UVVGRFJDeHJRa0ZCVXl4RFFVRkRMRTlCUVU4c1EwRkJReXhWUVVGRExFdEJRVXNzUlVGQlN6dEJRVU16UWl4cFFrRkJTeXhSUVVGUkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VlVGRGFFTXNRMEZCUXl4RFFVRkRPMEZCUTBnc1lVRkJTU3hEUVVGRExHVkJRV1VzUlVGQlJTeERRVUZETzBGQlEzWkNMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEZRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVOb1F5eGhRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1VVRkRaanM3T3p0VlFUZFdhMElzVVVGQlVUdEpRVUZUTEZOQlFWTTdPMnRDUVVFeFFpeFJRVUZSTEVNN096czdPenRCUTJwSU4wSXNZVUZCV1N4RFFVRkRPenM3T3pzN096czdPMEZCUldJc1MwRkJTU3hIUVVGSExFZEJRVWNzYlVKQlFVOHNRMEZCUXl4RFFVRmhMRU5CUVVNc1EwRkJRenM3UVVGRmFrTXNTMEZCU1N4VFFVRlRMRWRCUVVjc2JVSkJRVThzUTBGQlF5eERRVUZ0UWl4RFFVRkRMRU5CUVVNN096czdPenM3T3pzN096czdPenM3T3pzN096czdPMHRCZFVKd1F5eFBRVUZQTEhWQ1FVRlJMRU5CUVZNc1JVRkJlRUlzVDBGQlR6czdTMEZGU3l4WFFVRlhPMEZCUlc1Q0xGbEJSbEVzVjBGQlZ5eEhRVVZvUWpzeVFrRkdTeXhYUVVGWE96dEJRVWsxUWl4VFFVRkpMRTlCUVU4c1IwRkJSeXhEUVVGRExFOUJRVThzUlVGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXpzN1FVRkZhRU1zVTBGQlNTeFJRVUZSTEVkQlFVYzdRVUZEWWl4aFFVRlJMRU5CUVVNc1IwRkJSeXhGUVVGRExFZEJRVWNzUTBGQlF6dE5RVU5zUWl4RFFVRkRPenRCUVVWR0xHZERRVlpwUWl4WFFVRlhMRFpEUVZWMFFpeFRRVUZUTEVWQlFVTXNUMEZCVHl4RlFVRkRMRkZCUVZFc1JVRkJSVHM3UVVGRmJFTXNVMEZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhQUVVGUExFVkJRVVVzUTBGQlF6czdRVUZGZWtJc1UwRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMR05CUVdNc1JVRkJSU3hEUVVGRE8wRkJRemxETEZOQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF6dEJRVU0zUWl4VFFVRkpMRU5CUVVNc1dVRkJXU3hIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNhVUpCUVdsQ0xFTkJRVU03UVVGRGNFUXNVMEZCU1N4RFFVRkRMRk5CUVZNc1IwRkJSeXhKUVVGSkxGVkJRVlVzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN08wRkJSVzVFTEZOQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRE96dEJRVVZ1UWl4VFFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFdEJRVXNzUTBGQlF6czdRVUZGY0VJc1UwRkJTU3hEUVVGRExFbEJRVWtzUlVGQlJTeERRVUZETzBsQlJXSTdPMkZCZWtKclFpeFhRVUZYT3p0blFrRkJXQ3hYUVVGWE8wRkJNa0k1UWl4bFFVRlZPMk5CUVVFc2MwSkJRVWM3UVVGRFdDeGhRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWxCUVVrc1IwRkJSeXhEUVVGRExGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1FVRkRMME1zWVVGQlNTeERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF6dFJRVU53UXpzN1FVRkZSQ3hyUWtGQllUdGpRVUZCTEhsQ1FVRkhPMEZCUTJRc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1JVRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdVVUZETlVNN08wRkJSVVFzYlVKQlFXTTdZMEZCUVN3d1FrRkJSenRCUVVObUxHRkJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhsUVVGbExFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNN1VVRkRPVVE3TzBGQlJVUXNWMEZCVFR0alFVRkJMR3RDUVVGSE96dEJRVVZRTEdGQlFVa3NTVUZCU1N4RFFVRkRMRTFCUVUwc1JVRkJSVHRCUVVObUxHZERRVUZ4UWl4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNN1ZVRkRMME03TzBGQlJVUXNZVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXh2UWtGQmIwSXNRMEZCUXl4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU03TzBGQlJXNUVMR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF6dEJRVU5xUkN4aFFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN08wRkJSVEZHTEdGQlFVa3NTVUZCU1N4RFFVRkRMRTFCUVUwc1NVRkJTU3hKUVVGSkxFTkJRVU1zVTBGQlV5eEZRVUZGT3pzN08wRkJTV3BETEdWQlFVa3NVVUZCVVN4SFFVRkpMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJZU3hEUVVGRE8wRkJReTlFTEdWQlFVa3NVMEZCVXl4aFFVRkRPMEZCUTJRc1pVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZET3p0QlFVVldMR1ZCUVVrc1ZVRkJWU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1IwRkJReXhGUVVGRkxFTkJRVU03TzBGQlJUbERMR2RDUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkRMRlZCUVZVc1JVRkJSVHRCUVVOMlJDeHpRa0ZCVXl4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NSVUZCUlN4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4SFFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRExFTkJRVU03UVVGRE1VVXNjMEpCUVZNc1NVRkJTU3hIUVVGSExFTkJRVU03UVVGRGFrSXNjMEpCUVZNc1NVRkJTU3hKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNN08wRkJSWGhETEdsQ1FVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF5eFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFTkJRVU03UVVGRGJrUXNhVUpCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRVZCUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4SFFVRkRMRk5CUVZNc1JVRkJReXhSUVVGUkxFZEJRVU1zVlVGQlZTeEZRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRPenRCUVVWdVJ5eGpRVUZETEVsQlFVc3NVVUZCVVN4SFFVRkRMRlZCUVZjc1EwRkJRenRaUVVNMVFqdFZRVU5HTzFGQlEwWTdPMEZCVVVRc1dVRkJUenM3T3pzN096czdPMk5CUVVFc2FVSkJRVU1zU1VGQlNTeEZRVUZGTzBGQlExb3NZVUZCU1N4SlFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRk8wRkJRMllzWlVGQlNTeERRVUZETEZWQlFWVXNSVUZCUlN4RFFVRkRPMVZCUTI1Q08wRkJRMFFzWVVGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkRia0lzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzBGQlEyNURMR0ZCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFJRVU5tT3p0QlFVdEVMR1ZCUVZVN096czdPenRqUVVGQkxITkNRVUZITzBGQlExZ3NZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhWUVVGVkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNSRExHRkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NTVUZCU1N4RFFVRkRPMUZCUTNCQ096dEJRVVZFTEZWQlFVczdZMEZCUVN4cFFrRkJSenRCUVVOT0xHRkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRE8wRkJRek5DTEdGQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJRenRSUVVObU96dEJRVVZFTEd0Q1FVRmhPMk5CUVVFc2VVSkJRVWM3UVVGRFpDeGhRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRXRCUVVzc1EwRkJRenRSUVVOeVFqczdPenRWUVhoSGEwSXNWMEZCVnp0SlFVRlRMRk5CUVZNN08ydENRVUUzUWl4WFFVRlhMRU03T3pzN096dEJRemRDYUVNc1lVRkJXU3hEUVVGRE96czdPenM3T3pzN08wRkJSV0lzUzBGQlNTeEhRVUZITEVkQlFVY3NiVUpCUVU4c1EwRkJReXhEUVVGaExFTkJRVU1zUTBGQlF6dEJRVU5xUXl4TFFVRkpMRWxCUVVrc1IwRkJSeXh0UWtGQlR5eERRVUZETEVOQlFXTXNRMEZCUXl4RFFVRkRPMEZCUTI1RExFdEJRVWtzVTBGQlV5eEhRVUZITEcxQ1FVRlBMRU5CUVVNc1EwRkJiVUlzUTBGQlF5eERRVUZET3pzN096czdPenM3T3pzN096czdPenM3T3pzN096dExRWGRDY0VNc1QwRkJUeXgxUWtGQlVTeERRVUZUTEVWQlFYaENMRTlCUVU4N08wdEJSVXNzUzBGQlN6dEJRVVZpTEZsQlJsRXNTMEZCU3l4SFFVVldPekpDUVVaTExFdEJRVXM3TzBGQlNYUkNMRk5CUVVrc1QwRkJUeXhIUVVGSExFTkJRVU1zVDBGQlR5eEZRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRPenRCUVVWb1F5eFRRVUZKTEZGQlFWRXNSMEZCUnp0QlFVTmlMR0ZCUVZFc1EwRkJReXhGUVVGRkxFVkJRVU1zUjBGQlJ5eERRVUZETzAxQlEycENMRU5CUVVNN08wRkJSVVlzWjBOQlZtbENMRXRCUVVzc05rTkJWV2hDTEZOQlFWTXNSVUZCUXl4UFFVRlBMRVZCUVVNc1VVRkJVU3hGUVVGRk96dEJRVVZzUXl4VFFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFOUJRVThzUlVGQlJTeERRVUZET3p0QlFVVjZRaXhUUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVOQlFVTXNRMEZCUXpzN1FVRkZiRUlzVTBGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExIRkNRVUZ4UWl4RFFVRkZMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVVVzUTBGQlF6czdRVUZGY0VVc1UwRkJTU3hEUVVGRExGTkJRVk1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdPMEZCUlhCQ0xGVkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMEZCUTJ4RExGZEJRVWtzVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU03UVVGRE4wTXNWMEZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhQUVVGUExFTkJRVU1zVVVGQlVTeEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTJ4RExHVkJRVkVzUTBGQlF5eFBRVUZQTEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUTNoQ0xHVkJRVkVzUTBGQlF5eHhRa0ZCY1VJc1IwRkJSeXhEUVVGRExFTkJRVU03UVVGRGJrTXNWMEZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhKUVVGSkxFTkJRVVVzVVVGQlVTeERRVUZGTEVOQlFVTTdUVUZEYWtNN1FVRkRSQ3hUUVVGSkxFTkJRVU1zV1VGQldTeEhRVUZITEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zYVVKQlFXbENMRU5CUVVNN1FVRkRlRVFzVTBGQlNTeERRVUZETEZOQlFWTXNSMEZCUnl4SlFVRkpMRmxCUVZrc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdPenM3T3pzN096czdPenM3UVVGaGNrUXNVMEZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhKUVVGSkxFTkJRVU03TzBGQlJXNUNMRk5CUVVrc1EwRkJReXhGUVVGRkxFZEJRVWNzUTBGQlF5eFJRVUZSTEVOQlFVTTdPMEZCUlhCQ0xGTkJRVWtzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXpzN1FVRkZXaXhUUVVGSkxFTkJRVU1zVlVGQlZTeEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUjBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRPenRCUVVVeFJDeFRRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNN1NVRkZaanM3WVVGdVJHdENMRXRCUVVzN08yZENRVUZNTEV0QlFVczdRVUZ4UkhoQ0xHVkJRVlU3WTBGQlFTeHpRa0ZCUnp0QlFVTllMR0ZCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeEhRVUZITEVOQlFVTXNWMEZCVnl4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU12UXl4aFFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUMEZCVHl4RFFVRkRPMUZCUTNCRE96dEJRVVZFTEd0Q1FVRmhPMk5CUVVFc2VVSkJRVWM3UVVGRFpDeGhRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eEZRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRSUVVNMVF6czdRVUZGUkN4dFFrRkJZenRqUVVGQkxEQkNRVUZITzBGQlEyWXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEdWQlFXVXNSMEZCUnl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF6dFJRVU01UkRzN1FVRkZSQ3hYUVVGTk8yTkJRVUVzYTBKQlFVYzdPMEZCUlZBc1lVRkJTU3hKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTzBGQlEyWXNaME5CUVhGQ0xFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF6dFZRVU12UXpzN1FVRkZSQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4VFFVRlRMRWRCUVVjc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTTdRVUZEYWtRc1lVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFBRVUZQTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1MwRkJTeXhGUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRE96dEJRVVV6Uml4alFVRkxMRWxCUVVrc1EwRkJReXhIUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVkQlFVTXNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhOUVVGTkxFVkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVTdPMEZCUlhoRExHVkJRVWtzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlRzN1FVRkZaaXhwUWtGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXh6UWtGQmMwSXNRMEZCUXl4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU03TzBGQlJYcEVMR2xDUVVGSkxFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTTdPMEZCUlZvc2EwSkJRVXNzU1VGQlNTeEZRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRVZCUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkRMRVZCUVVVc1JVRkJRenRCUVVNeFF5eHJRa0ZCUnl4SlFVRkxMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUlVGQlF5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhGUVVGRExFTkJRVVVzUTBGQlF6dGpRVU51UkRzN1FVRkZSQ3huUWtGQlJ5eEhRVUZITEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN08wRkJSVGRETEdsQ1FVRkpMRU5CUVVNc1JVRkJSU3hIUVVGSExFVkJRVVVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8xbEJSV2hETEUxQlFVMHNTVUZCU1N4SlFVRkpMRU5CUVVNc1JVRkJSU3hIUVVGSExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVsQlFVa3NRMEZCUXl4RlFVRkZMRXRCUVVzc1EwRkJReXhSUVVGUkxFVkJRVVU3UVVGRGJFUXNhVUpCUVVrc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eERRVUZETzFsQlEyUXNUVUZCVFR0QlFVTk1MR2xDUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZITEVOQlFVTXNVVUZCVVN4RFFVRkRPMWxCUTNKQ096czdPMEZCUzBRc1pVRkJTU3hKUVVGSkxFTkJRVU1zUlVGQlJTeEhRVUZITEVOQlFVTXNSVUZCUlN4RlFVRkZPenRCUVVWcVFpeHBRa0ZCU1N4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RlFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBGQlF6TkRMR2xDUVVGSkxFZEJRVWNzUjBGQlJ5eE5RVUZOTEVkQlFVY3NUVUZCVFN4RFFVRkRPMEZCUXpGQ0xHbENRVUZKTEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFZEJRVWNzUlVGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkRMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zVFVGQlRTeEZRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPenRCUVVWc1JDeHBRa0ZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zVTBGQlV5eEhRVUZITEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hEUVVGRE8wRkJRMjVFTEdsQ1FVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RFFVRkRMRlZCUVZVc1IwRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVsQlFVa3NRMEZCUXl4VlFVRlZMRVZCUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRE96czdXVUZKYkVjN1ZVRkZSanRSUVVWR096dEJRVlZFTEZsQlFVODdPenM3T3pzN096czdZMEZCUVN4cFFrRkJReXhKUVVGSkxFVkJRVU1zVVVGQlVTeEZRVUZGTzBGQlEzSkNMR0ZCUVVrc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJUdEJRVU5tTEdWQlFVa3NRMEZCUXl4VlFVRlZMRVZCUVVVc1EwRkJRenRWUVVOdVFqczdPMEZCUjBRc1lVRkJTU3hSUVVGUkxFVkJRVVU3UVVGRFdpeGxRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhMRkZCUVZFc1EwRkJRenRWUVVNeFFpeE5RVUZOTEVsQlFVa3NTVUZCU1N4RFFVRkRMRmxCUVZrc1JVRkJSVHRCUVVNMVFpeGxRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU03VlVGRGJrTXNUVUZCVFR0QlFVTk1MR1ZCUVVrc1EwRkJReXhSUVVGUkxFZEJRVWNzUTBGQlF5eERRVUZETzFWQlEyNUNPMEZCUTBRc1lVRkJTU3hEUVVGRExGVkJRVlVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFZEJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXpzN1FVRkZNVVFzWVVGQlNTeERRVUZETEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkRia0lzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZET3pzN1VVRkhjRU03TzBGQlMwUXNaVUZCVlRzN096czdPMk5CUVVFc2MwSkJRVWM3TzBGQlJWZ3NZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhWUVVGVkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMEZCUTNSRExHRkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NTMEZCU3l4RFFVRkRPenRCUVVWd1FpeGhRVUZKTEVOQlFVTXNWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NSMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRE8xRkJSVE5FT3p0QlFVVkVMRlZCUVVzN1kwRkJRU3hwUWtGQlJ6dEJRVU5PTEdGQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETzBGQlF6TkNMR0ZCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFJRVU5tT3p0QlFVVkVMR3RDUVVGaE8yTkJRVUVzZVVKQlFVYzdRVUZEWkN4aFFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFdEJRVXNzUTBGQlF6dFJRVU55UWpzN096dFZRWEpMYTBJc1MwRkJTenRKUVVGVExGTkJRVk03TzJ0Q1FVRjJRaXhMUVVGTExFTTdPenM3T3p0QlF6bENNVUlzWVVGQldTeERRVUZET3pzN096czdPenM3TzBGQlJXSXNTMEZCU1N4SFFVRkhMRWRCUVVjc2JVSkJRVThzUTBGQlF5eERRVUZoTEVOQlFVTXNRMEZCUXp0QlFVTnFReXhMUVVGSkxGTkJRVk1zUjBGQlJ5eHRRa0ZCVHl4RFFVRkRMRU5CUVcxQ0xFTkJRVU1zUTBGQlF6czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3UzBGMVFuQkRMRTlCUVU4c2RVSkJRVkVzUTBGQlV5eEZRVUY0UWl4UFFVRlBPenRMUVVWTExGbEJRVms3UVVGRmNFSXNXVUZHVVN4WlFVRlpMRWRCUldwQ096SkNRVVpMTEZsQlFWazdPMEZCU1RkQ0xGTkJRVWtzVDBGQlR5eEhRVUZITEVOQlFVTXNUMEZCVHl4RlFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRE96dEJRVVZvUXl4VFFVRkpMRkZCUVZFc1IwRkJSenRCUVVOaUxHRkJRVkVzUTBGQlF5eEhRVUZITEVWQlFVTXNSMEZCUnl4RFFVRkRPMDFCUTJ4Q0xFTkJRVU03TzBGQlJVWXNaME5CVm1sQ0xGbEJRVmtzTmtOQlZYWkNMRk5CUVZNc1JVRkJReXhQUVVGUExFVkJRVU1zVVVGQlVTeEZRVUZGT3p0QlFVVnNReXhUUVVGSkxFTkJRVU1zVDBGQlR5eEhRVUZITEU5QlFVOHNSVUZCUlN4RFFVRkRPenRCUVVWNlFpeFRRVUZKTEVOQlFVTXNVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zWTBGQll5eEZRVUZGTEVOQlFVTTdRVUZET1VNc1UwRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eFBRVUZQTEVkQlFVY3NTVUZCU1N4RFFVRkRPMEZCUXpkQ0xGTkJRVWtzUTBGQlF5eFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhwUWtGQmFVSXNRMEZCUXp0QlFVTndSQ3hUUVVGSkxFTkJRVU1zVTBGQlV5eEhRVUZITEVsQlFVa3NWVUZCVlN4RFFVRkRMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6dEJRVU51UkN4VFFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExIRkNRVUZ4UWl4RFFVRkRMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6czdRVUZGY0VRc1UwRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEpRVUZKTEVOQlFVTTdPMEZCUlc1Q0xGTkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NTMEZCU3l4RFFVRkRPenRCUVVWd1FpeFRRVUZKTEVOQlFVTXNTVUZCU1N4RlFVRkZMRU5CUVVNN08wRkJSVm9zVTBGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMGxCUTJZN08yRkJNMEpyUWl4WlFVRlpPenRuUWtGQldpeFpRVUZaTzBGQk5rSXZRaXhsUVVGVk8yTkJRVUVzYzBKQlFVYzdRVUZEV0N4aFFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFbEJRVWtzUjBGQlJ5eERRVUZETEZkQlFWY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03UVVGREwwTXNZVUZCU1N4RFFVRkRMRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXp0UlFVTndRenM3UVVGRlJDeHJRa0ZCWVR0alFVRkJMSGxDUVVGSE8wRkJRMlFzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUlVGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1VVRkROVU03TzBGQlJVUXNiVUpCUVdNN1kwRkJRU3d3UWtGQlJ6dEJRVU5tTEdGQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eGxRVUZsTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU03VVVGRE9VUTdPMEZCUlVRc1YwRkJUVHRqUVVGQkxHdENRVUZIT3p0QlFVVlFMR0ZCUVVrc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJUdEJRVU5tTEdkRFFVRnhRaXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU03VlVGREwwTTdPMEZCUlVRc1lVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eHhRa0ZCY1VJc1EwRkJReXhKUVVGSkxFTkJRVU1zVTBGQlV5eERRVUZETEVOQlFVTTdPMEZCUlhCRUxHRkJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUMEZCVHl4RFFVRkRMRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXp0QlFVTnFSQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhMUVVGTExFVkJRVVVzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU03TzBGQlJURkdMR0ZCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEZOQlFWTXNSMEZCUnl4RlFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1FVRkRNVVFzWVVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1YwRkJWeXhIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUVUZCVFN4RFFVRkRPenRCUVVWeVJDeGhRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF6czdRVUZGYUVNc1lVRkJTU3hKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGT3p0QlFVVm1MR1ZCUVVrc1ZVRkJWU3hIUVVGSExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNUMEZCVHl4RFFVRkRMRXRCUVVzc1IwRkJSeXhEUVVGSExFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXp0QlFVTnlSU3hsUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdPMEZCUlZZc1owSkJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPenRCUVVVeFF5eHBRa0ZCU1N4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SFFVRkxMRU5CUVVNN1FVRkRiRU1zYVVKQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhEUVVGRE96dEJRVVV6UXl4cFFrRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZGTzBGQlExZ3NiVUpCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03WTBGRGJFTXNUVUZCVFR0QlFVTk1MRzFDUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzJOQlEyeERPenRCUVVWRUxHTkJRVU1zU1VGQlNTeFZRVUZWTEVOQlFVTTdXVUZEYWtJN1ZVRkRSaXhOUVVGTk8wRkJRMGdzWlVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFZEJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdRVUZETlVRc1pVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEV0QlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVkQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1ZVRkRka1k3TzBGQlJVUXNZVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTTdVVUZET1VJN08wRkJVMFFzV1VGQlR6czdPenM3T3pzN08yTkJRVUVzYVVKQlFVTXNTVUZCU1N4RlFVRkZPenRCUVVWYUxHRkJRVWtzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlR0QlFVTm1MR1ZCUVVrc1EwRkJReXhWUVVGVkxFVkJRVVVzUTBGQlF6dFZRVU51UWpzN1FVRkZSQ3hoUVVGSkxFTkJRVU1zVFVGQlRTeEhRVUZITEVsQlFVa3NRMEZCUXp0QlFVTnVRaXhoUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03TzBGQlJXNURMR0ZCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF6dFJRVU5tT3p0QlFVdEVMR1ZCUVZVN096czdPenRqUVVGQkxITkNRVUZITzBGQlExZ3NZVUZCU1N4SlFVRkpMRU5CUVVNc1RVRkJUU3hGUVVGRk8wRkJRMllzWlVGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4VlFVRlZMRU5CUVVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzBGQlEzUkRMR1ZCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETzFWQlEzQkNPMUZCUlVZN08wRkJSVVFzVlVGQlN6dGpRVUZCTEdsQ1FVRkhPMEZCUTA0c1lVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNN1FVRkRNMElzWVVGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRPMUZCUTJZN08wRkJSVVFzYTBKQlFXRTdZMEZCUVN4NVFrRkJSenRCUVVOa0xHRkJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NTMEZCU3l4RFFVRkRPMUZCUTNKQ096czdPMVZCZWtoclFpeFpRVUZaTzBsQlFWTXNVMEZCVXpzN2EwSkJRVGxDTEZsQlFWa3NRenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPenM3T3pzN096czdPMHREVlhKQ0xGTkJRVk1zSzBOQlFVMHNSVUZCYlVJN08wdEJRM1pETEVkQlFVY3NkVU5CUVUwc1EwRkJZVHM3UzBGRmNFSXNUVUZCVFN4MVFrRkJVU3hEUVVGVExFVkJRWFpDTEUxQlFVMDdPMHRCUlUwc1NVRkJTVHRCUVVWYUxGbEJSbEVzU1VGQlNTeERRVVZZTEUxQlFVMHNSVUZCUlN4UlFVRlJMRVZCUVVVN01rSkJSbGdzU1VGQlNUczdRVUZKY2tJc1UwRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEZRVUZGTEVOQlFVTTdRVUZEWml4VFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eE5RVUZOTEVOQlFVTTdRVUZETVVJc1UwRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEJRVU0xUXl4VFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eEZRVUZGTEVOQlFVTTdPMEZCUlhSQ0xGTkJRVWtzVVVGQlVTeEZRVUZGTzBGQlExb3NWMEZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhUUVVGVExFZEJRVWNzVVVGQlVTeERRVUZETEZOQlFWTXNTVUZCU1N4VlFVRlZMRU5CUVVNN1FVRkRka1FzVjBGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRWRCUVVjc1VVRkJVU3hEUVVGRExFbEJRVWtzU1VGQlNTeExRVUZMTEVOQlFVTTdRVUZEZWtNc1YwRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVkQlFVY3NVVUZCVVN4RFFVRkRMRWxCUVVrc1NVRkJTU3hMUVVGTExFTkJRVU03VFVGRGVrTXNUVUZCVFR0QlFVTk1MRmRCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVTBGQlV5eEhRVUZITEZWQlFWVXNRMEZCUXp0QlFVTnFReXhYUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRlRUlzVjBGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRWRCUVVjc1MwRkJTeXhEUVVGRE8wMUJRM2hDT3p0QlFVVkVMRk5CUVVrc1lVRkJZU3hIUVVGSExFMUJRVTBzUlVGQlJTeERRVUZETzBGQlF6ZENMRk5CUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNSMEZCUnl4aFFVRmhMRU5CUVVNc1RVRkJUU3hEUVVGRE8wRkJReTlETEZOQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFbEJRVWtzUjBGQlJ5eGhRVUZoTEVOQlFVTXNTVUZCU1N4RFFVRkRPMEZCUXpORExGTkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1IwRkJSeXhoUVVGaExFTkJRVU1zUzBGQlN5eERRVUZETzBGQlF6ZERMRk5CUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NSMEZCUnl4aFFVRmhMRU5CUVVNc1NVRkJTU3hEUVVGRE8wRkJRek5ETEZOQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGZEJRVmNzUjBGQlJ5eGhRVUZoTEVOQlFVTXNWMEZCVnl4RFFVRkRPMEZCUTNwRUxGTkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRlZCUVZVc1IwRkJSeXhoUVVGaExFTkJRVU1zVlVGQlZTeERRVUZETzBGQlEzWkVMRk5CUVVrc1EwRkJReXhqUVVGakxFVkJRVVVzUTBGQlF6dEJRVU4wUWl4VFFVRkpMRU5CUVVNc1kwRkJZeXhGUVVGRkxFTkJRVU03U1VGRGRrSTdPMmRDUVRWQ2EwSXNTVUZCU1R0QlFUaENka0lzYlVKQlFXTTdZMEZCUVN3d1FrRkJSenM3TzBGQlEyWXNZVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUzBGQlN5eERRVUZETEZOQlFWTXNSMEZCUnl4WlFVRlpMRU5CUVVNN1FVRkRhRVFzWVVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRExGVkJRVlVzUjBGQlJ5eE5RVUZOTEVOQlFVTTdRVUZETTBNc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTMEZCU3l4RFFVRkRMR0ZCUVdFc1IwRkJSeXhOUVVGTkxFTkJRVU03UVVGRE9VTXNZVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUzBGQlN5eERRVUZETEdkQ1FVRm5RaXhIUVVGSExFMUJRVTBzUTBGQlF6czdRVUZGYWtRc1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVkQlFVY3NVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6czdRVUZGYmtRc1owSkJRVThzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1ZVRkJWU3hEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVWQlFVVTdRVUZETTBNc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNWMEZCVnl4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xVkJRMnhGT3p0QlFVVkVMR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4UFFVRlBMRWRCUVVjc1MwRkJTeXhEUVVGRE8wRkJRM3BETEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUTBGQlF5eFRRVUZUTEVkQlFVY3NXVUZCV1N4RFFVRkRPenRCUVVWc1JDeGhRVUZKTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhGUVVGRk8wRkJRMjVDTEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hIUVVGSExGRkJRVkVzUTBGQlF5eGhRVUZoTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1FVRkRia1FzWlVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1UwRkJVeXhIUVVGSExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRPMEZCUXk5RExHVkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1EwRkJReXhWUVVGVkxFZEJRVWNzVDBGQlR5eERRVUZETzBGQlF6bERMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4UlFVRlJMRWRCUVVjc1ZVRkJWU3hEUVVGRE8wRkJReTlETEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVkQlFVY3NUVUZCVFN4RFFVRkRPMEZCUTNoRExHVkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRXRCUVVzc1EwRkJReXhQUVVGUExFZEJRVWNzUzBGQlN5eERRVUZETzBGQlEzcERMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4UlFVRlJMRWRCUVVjc1RVRkJUU3hEUVVGRE96dEJRVVV6UXl4bFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUjBGQlJ5eFJRVUZSTEVOQlFVTXNZVUZCWVN4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRMnBFTEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFdEJRVXNzUTBGQlF5eFJRVUZSTEVkQlFVY3NWVUZCVlN4RFFVRkRPMEZCUXpkRExHVkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhIUVVGSExFZEJRVWNzUzBGQlN5eERRVUZGTzBGQlEzQkRMR1ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRWRCUVVjc1MwRkJTeXhEUVVGRk8wRkJRM1JETEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGTkJRVk1zUjBGQlJ5eEhRVUZITEVOQlFVTTdRVUZEYWtNc1pVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1IwRkJSeXhoUVVGaExFTkJRVU03UVVGREwwTXNaVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUzBGQlN5eERRVUZETEZWQlFWVXNSMEZCUnl4TlFVRk5MRU5CUVVNN1FVRkRNME1zWlVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRExGRkJRVkVzUjBGQlJ5eE5RVUZOTEVOQlFVTTdPMEZCUlhwRExHVkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFZEJRVWNzVTBGQlV5eERRVUZET3p0QlFVVXhReXhsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4blFrRkJaMElzUTBGQlF5eFhRVUZYTEVWQlFVVXNXVUZCVFR0QlFVTnVSQ3h0UWtGQlN5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhsUVVGbExFZEJRVWNzVFVGQlN5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRlZCUVZVc1EwRkJRenRaUVVOMFJTeERRVUZETEVOQlFVTTdRVUZEU0N4bFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eG5Ra0ZCWjBJc1EwRkJReXhaUVVGWkxFVkJRVVVzV1VGQlRUdEJRVU53UkN4dFFrRkJTeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEV0QlFVc3NRMEZCUXl4bFFVRmxMRWRCUVVjc1RVRkJTeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZkQlFWY3NRMEZCUXp0WlFVTjJSU3hEUVVGRExFTkJRVU03UVVGRFNDeGxRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhuUWtGQlowSXNRMEZCUXl4UFFVRlBMRVZCUVVVc1dVRkJUVHRCUVVNdlF5eHBRa0ZCU1N4TlFVRkxMRWxCUVVrc1EwRkJReXhKUVVGSkxFVkJRVVU3UVVGRGJFSXNjVUpCUVVzc1NVRkJTU3hGUVVGRkxFTkJRVU03WTBGRFlpeE5RVUZOTzBGQlEwd3NjVUpCUVVzc1NVRkJTU3hGUVVGRkxFTkJRVU03WTBGRFlqdFpRVU5HTEVOQlFVTXNRMEZCUXpzN1FVRkhTQ3hsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXpzN1FVRkZha1FzWlVGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1ZVRkRiRVE3UVVGRFJDeGhRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenM3T3pzN1FVRkxha1FzWVVGQlNTeEZRVUZGTEVkQlFVY3NVMEZCVXl4RFFVRkRMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETzBGQlEyeEZMR05CUVVzc1NVRkJTU3hIUVVGSExFbEJRVWtzUlVGQlJTeEZRVUZGTzBGQlEyeENMR1ZCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1ZVRkRja0k3VVVGRFJqczdRVUZGUkN4dFFrRkJZenRqUVVGQkxEQkNRVUZITzBGQlEyWXNZVUZCU1N4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUlVGQlJUdEJRVU51UWl4bFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eExRVUZMTEVOQlFVTXNaVUZCWlN4SFFVRkhMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEZkQlFWY3NRMEZCUXp0QlFVTjBSU3hsUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hIUVVGSExGbEJRVmtzUjBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU03UVVGRGJrVXNaVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNSMEZCUnl4WlFVRlpMRWRCUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNWMEZCVnl4RFFVRkRPMEZCUXpGRkxHVkJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRXRCUVVzc1EwRkJReXhsUVVGbExFZEJRVWNzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1MwRkJTeXhEUVVGRE8wRkJRMmhGTEdWQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExFdEJRVXNzUTBGQlF5eGxRVUZsTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETzFWQlEyeEZPMUZCUTBZN08wRkJSVVFzVTBGQlNUdGpRVUZCTEdkQ1FVRkhPMEZCUTB3c1lVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1IwRkJSeXhQUVVGUExFTkJRVU03UVVGRE0wTXNZVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETzFGQlEzWkNPenRCUVVWRUxGTkJRVWs3WTBGQlFTeG5Ra0ZCUnp0QlFVTk1MR0ZCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEV0QlFVc3NRMEZCUXl4UFFVRlBMRWRCUVVjc1RVRkJUU3hEUVVGRE8wRkJRekZETEdGQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hIUVVGSExFdEJRVXNzUTBGQlF6dFJRVU40UWpzN1FVRkZSQ3hoUVVGUk8yTkJRVUVzYTBKQlFVTXNTVUZCU1N4RlFVRkRMRXRCUVVzc1JVRkJSVHRCUVVOdVFpeGpRVUZMTEVsQlFVa3NSMEZCUnl4SlFVRkpMRWxCUVVrc1JVRkJSVHRCUVVOd1FpeGxRVUZKTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhSUVVGUkxFVkJRVVU3UVVGRGRFSXNhVUpCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RlFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRE8xbEJRMmhETzFWQlEwWTdRVUZEUkN4aFFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4TFFVRkxMRU5CUVVNN1FVRkRMMElzWVVGQlNTeERRVUZETEdOQlFXTXNSVUZCUlN4RFFVRkRPMUZCUTNaQ096dEJRVVZFTEZWQlFVczdZMEZCUVN4cFFrRkJSenRCUVVOT0xHTkJRVXNzU1VGQlNTeEhRVUZITEVsQlFVa3NTVUZCU1N4RlFVRkZPMEZCUTNCQ0xHVkJRVWtzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRTlCUVU4c1JVRkJSVHRCUVVOeVFpeHBRa0ZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFOUJRVThzUlVGQlJTeERRVUZETzFsQlEzSkNPMVZCUTBZN1VVRkRSanM3T3p0VlFXNUphMElzU1VGQlNUczdPMnRDUVVGS0xFbEJRVWtzUXpzN096czdPenM3T3pzN096dEJRek5EZWtJc1lVRkJXU3hEUVVGRE96dExRVVZPTEVkQlFVY3NkVU5CUVUwc1EwRkJZVHM3UzBGRGRFSXNWVUZCVlN4MVEwRkJUU3hEUVVGblFqczdRVUZGZGtNc1MwRkJTU3hwUWtGQmFVSXNSMEZCUnl4VlFVRkRMRTFCUVUwc1JVRkJReXhaUVVGWkxFVkJRVXM3UVVGREwwTXNUMEZCU1N4SlFVRkpMRWRCUVVjc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF6dEJRVU4yUWl4UFFVRkpMRmxCUVZrc1EwRkJReXhKUVVGSkxFTkJRVU1zUlVGQlJUdEJRVU4wUWl4cFFrRkJXU3hEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTTdTVUZEZEVJc1RVRkJUVHRCUVVOTUxHbENRVUZaTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8wbEJRM2hDTzBGQlEwUXNWVUZCVXl4SlFVRkpMRWRCUVVjc1dVRkJXU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZITzBWQlEzUkRMRU5CUVVNN08wRkJSVVlzUzBGQlNTeFBRVUZQTEVkQlFVY3NWVUZCUXl4UFFVRlBMRVZCUVVNc1NVRkJTU3hGUVVGRExFOUJRVThzUlVGQlN6dEJRVU4wUXl4VlFVRlBMRWRCUVVjc1QwRkJUeXhKUVVGSkxFVkJRVVVzUTBGQlF6dEJRVU40UWl4UlFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NUMEZCVHl4RFFVRkRMRlZCUVZVc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVTTdRVUZEYWtRc1UwRkJTU3hIUVVGSExFZEJRVWNzVDBGQlR5eERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenM3T3p0QlFVazVRaXhaUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEZGQlFWRXNRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJReXhUUVVGVExFTkJRVU03TzBsQlJYcERPMEZCUTBRc1QwRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4WFFVRlhMRVZCUVVVc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUXpkRExFOUJRVWtzVFVGQlRTeEhRVUZITEVsQlFVa3NWVUZCVlN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFOUJRVThzUlVGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTnVSQ3hUUVVGTkxFTkJRVU1zUlVGQlJTeEhRVUZITEU5QlFVOHNRMEZCUXl4RlFVRkZMRU5CUVVNN1FVRkRka0lzVlVGQlR5eE5RVUZOTEVOQlFVTTdSVUZEWml4RFFVRkRPenRCUVVkR0xFdEJRVWtzVDBGQlR5eEhRVUZITEZWQlFVTXNUVUZCVFN4RlFVRkRMRTlCUVU4c1JVRkJTenM3UVVGRmFFTXNWVUZCVHl4SFFVRkhMRTlCUVU4c1NVRkJTU3hWUVVGVkxFTkJRVU03TzBGQlJXaERMRTlCUVVrc1dVRkJXU3hIUVVGSExFVkJRVVVzUTBGQlF6czdRVUZGZEVJc1QwRkJTU3hUUVVGVExFZEJRVWNzUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenM3UVVGRmVrTXNUMEZCU1N4RlFVRkZMRWRCUVVjc1JVRkJSU3hEUVVGRE96dEJRVVZhTEU5QlFVa3NXVUZCV1N4SFFVRkhMRk5CUVZNc1EwRkJReXh2UWtGQmIwSXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRCUVVOMlJDeFBRVUZKTEZGQlFWRXNSMEZCUnl4RlFVRkZMRU5CUVVNN1FVRkRiRUlzVVVGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGRExGbEJRVmtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1FVRkRlRU1zWVVGQlVTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU5vUXp0QlFVTkVMRkZCUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSMEZCUXl4UlFVRlJMRU5CUVVNc1RVRkJUU3hGUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEyeERMRk5CUVVrc1NVRkJTU3hIUVVGSExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4WlFVRlpMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU03UVVGRE4wTXNVMEZCU1N4SlFVRkpMRVZCUVVVN1FVRkRVaXhYUVVGSkxHRkJRV0VzUjBGQlJ5eExRVUZMTEVOQlFVTTdRVUZETVVJc1dVRkJTeXhKUVVGSkxFZEJRVWNzU1VGQlNTeFZRVUZWTEVWQlFVVTdRVUZETVVJc1lVRkJTU3hKUVVGSkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEV0QlFVY3NSMEZCUnl4RFFVRkRMRmRCUVZjc1JVRkJSU3hGUVVGRk8wRkJRekZETEhkQ1FVRmhMRWRCUVVjc1IwRkJSeXhEUVVGRE8xVkJRM0pDTzFGQlEwWTdRVUZEUkN4alFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETzBGQlF6TkNMRmRCUVVrc1RVRkJUU3hIUVVGSExFOUJRVThzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVNc1lVRkJZU3hEUVVGRExFTkJRVU03UVVGRGFFUXNWMEZCU1N4TlFVRk5MRU5CUVVNc1JVRkJSU3hGUVVGRk8wRkJRMklzVjBGQlJTeERRVUZETEUxQlFVMHNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU03VVVGRGVFSXNUVUZCVFR0QlFVTk1MR0ZCUVVrc1JVRkJSU3hIUVVGSExHbENRVUZwUWl4RFFVRkRMRTFCUVUwc1JVRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6dEJRVU5vUkN4WFFVRkZMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETzFGQlEycENPMDFCUTBZN1NVRkRSanM3UVVGRlJDeFZRVUZQTEVWQlFVVXNRMEZCUXp0RlFVVllMRU5CUVVNN08wRkJSVVlzUzBGQlNTeEhRVUZITEVkQlFVY3NWVUZCUXl4SlFVRkpMRVZCUVVNc1RVRkJUU3hGUVVGRExFOUJRVThzUlVGQlN6dEJRVU5xUXl4UFFVRkpMRTFCUVUwc1IwRkJSeXhSUVVGUkxFTkJRVU1zWVVGQllTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUXpORExGVkJRVThzUjBGQlJ5eFBRVUZQTEVsQlFVa3NSVUZCUlN4RFFVRkRPMEZCUTNoQ0xFOUJRVWtzVFVGQlRTeEZRVUZGTzBGQlExWXNWMEZCVFN4SFFVRkhMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdTVUZEYmtNc1RVRkJUVHRCUVVOTUxGZEJRVTBzUjBGQlJ5eFJRVUZSTEVOQlFVTXNTVUZCU1N4RFFVRkRPMGxCUTNoQ08wRkJRMFFzVTBGQlRTeERRVUZETEZkQlFWY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJRenRCUVVNelFpeFZRVUZQTEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJRenRCUVVONFFpeFBRVUZKTEU5QlFVOHNRMEZCUXl4SlFVRkpMRVZCUVVVN1FVRkRhRUlzVjBGQlRTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRWRCUVVjc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkROVU1zVjBGQlRTeERRVUZETEV0QlFVc3NRMEZCUXl4TlFVRk5MRWRCUVVjc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNN1NVRkRPVU03UVVGRFJDeFZRVUZQTEU5QlFVOHNRMEZCUXl4TlFVRk5MRVZCUVVNc1NVRkJTU3hGUVVGRExFOUJRVThzUTBGQlF5eERRVUZETzBWQlEzSkRMRU5CUVVNN08xTkJSVThzVDBGQlR5eEhRVUZRTEU5QlFVODdVMEZEVUN4UFFVRlBMRWRCUVZBc1QwRkJUenRUUVVOUUxFZEJRVWNzUjBGQlNDeEhRVUZITEVNN096czdPenRCUXpGR1dpeGhRVUZaTEVOQlFVTTdPenM3T3pzN08wdEJSVTRzU1VGQlNTeDFRMEZCVFN4RFFVRmpPenRMUVVWV0xFbEJRVWs3UVVGRldpeFpRVVpSTEVsQlFVa3NSMEZGVkRzeVFrRkdTeXhKUVVGSk96czdRVUZMZEVJc1UwRkJTU3hEUVVGRExFdEJRVXNzUjBGQlJ5eEZRVUZGTEVOQlFVTTdPenRCUVVkb1FpeFRRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkhPMEZCUTFnc1lVRkJUU3hGUVVGRkxGZEJRVmM3UVVGRGJrSXNXVUZCU3l4RlFVRkZMRTFCUVUwN1RVRkRZaXhEUVVGRE96czdRVUZIUml4VFFVRkpMRU5CUVVNc1QwRkJUeXhIUVVGSExFTkJRVVVzVTBGQlV5eEZRVU42UWl4VlFVRlZMRVZCUTFZc1ZVRkJWU3hGUVVOV0xGVkJRVlVzUlVGRFZpeFZRVUZWTEVWQlExWXNSMEZCUnl4RlFVTklMRlZCUVZVc1JVRkRWaXhUUVVGVExFTkJRMVFzUTBGQlF6czdPMEZCUjBZc1UwRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRE96czdRVUZIZWtJc1UwRkJTU3hEUVVGRExGZEJRVmNzUTBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSVUZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRKUVVWc1F6czdaMEpCT1VKclFpeEpRVUZKTzBGQmFVTjJRaXhUUVVGSk96czdPMk5CUVVFc1kwRkJReXhMUVVGTExFVkJRVU1zVFVGQlRTeEZRVUZGT3p0QlFVVnNRaXhoUVVGSkxGRkJRVkVzWVVGQlF6czdRVUZGWWl4aFFVRkpMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeExRVUZMTEZkQlFWY3NSVUZCUlR0QlFVTnlReXh0UWtGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1MwRkJTeXhGUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzFWQlEzaERMRTFCUVUwc1NVRkJTU3hKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEUxQlFVMHNTMEZCU3l4UFFVRlBMRVZCUVVVN1FVRkRlRU1zYlVKQlFWRXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUlVGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0VlFVTndReXhOUVVGTkxFbEJRVWtzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRXRCUVVzc1RVRkJUU3hGUVVGRk8wRkJRM1pETEcxQ1FVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVWQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1ZVRkRia01zVFVGQlRUdEJRVU5PTEcxQ1FVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlF5eExRVUZMTEVWQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1ZVRkRlRU03TzBGQlJVUXNaMEpCUVU4c1VVRkJVU3hEUVVGRE8xRkJSV2hDT3p0QlFVbEVMR05CUVZNN096czdZMEZCUVN4dFFrRkJReXhOUVVGTkxFVkJRVVVzVVVGQlVTeEZRVUZGT3p0QlFVVXpRaXhoUVVGSkxFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4TFFVRkxMRTFCUVUwc1NVRkJTU3hKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NTMEZCU3l4TlFVRk5MRVZCUVVjN1FVRkRPVVFzWlVGQlNTeERRVUZETEUxQlFVMHNTVUZCU1N4RlFVRkZMRU5CUVVNN1ZVRkRiRUk3T3p0QlFVZEVMR0ZCUVVrc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNUVUZCVFN4SFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdPMEZCUld4RUxHRkJRVWtzVVVGQlVTeEZRVUZGTzBGQlEySXNhVUpCUVUwc1NVRkJTU3hSUVVGUkxFTkJRVU03VlVGRGJrSTdPenRCUVVkRUxHRkJRVWtzVjBGQlZ5eEhRVUZITEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF6czdRVUZGTjBNc1owSkJRVThzVjBGQlZ5eEhRVUZITEVOQlFVTXNSVUZCUlR0QlFVTjJRaXh6UWtGQlZ5eEpRVUZKTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hEUVVGRE8xVkJRMnBET3p0QlFVVkJMR0ZCUVVrc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNWMEZCVnl4RFFVRkRMRU5CUVVNN08wRkJSWEpETEdGQlFVa3NTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzUzBGQlN5eERRVUZET3p0QlFVVTNRaXhoUVVGSkxFZEJRVWNzU1VGQlNTeEhRVUZGTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhGUVVGRExFMUJRVTBzUTBGQlJTeERRVUZET3pzN1FVRkhha01zWVVGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hIUVVGRExGbEJRVmtzUTBGQlF5eEhRVUZETEZsQlFWa3NRMEZCUXpzN1FVRkZiRVFzWjBKQlFVOHNTVUZCU1N4RFFVRkRPMUZCUlZvN08wRkJTVVFzVlVGQlN6czdPenRqUVVGQkxHVkJRVU1zVFVGQlRTeEZRVUZGTEZGQlFWRXNSVUZCUlRzN1FVRkZka0lzWVVGQlNTeEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1MwRkJTeXhOUVVGTkxFbEJRVWtzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRXRCUVVzc1RVRkJUU3hGUVVGSE8wRkJRemxFTEdWQlFVa3NRMEZCUXl4TlFVRk5MRWxCUVVrc1JVRkJSU3hEUVVGRE8xVkJRMnhDT3pzN1FVRkhSQ3hoUVVGSkxFMUJRVTBzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTFCUVUwc1IwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPenRCUVVWc1JDeGhRVUZKTEZGQlFWRXNSVUZCUlR0QlFVTmlMR2xDUVVGTkxFbEJRVWtzVVVGQlVTeERRVUZETzFWQlEyNUNPenM3UVVGSFJDeGhRVUZKTEZkQlFWY3NSMEZCUnl4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTTdPenRCUVVjM1F5eGhRVUZKTEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUlVGQlF5eE5RVUZOTEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGZEJRVmNzUTBGQlF5eERRVUZET3p0QlFVVjJSQ3hqUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRWRCUVVNc1dVRkJXU3hEUVVGRExFZEJRVU1zV1VGQldTeERRVUZET3p0QlFVVndSQ3huUWtGQlR5eExRVUZMTEVOQlFVTTdVVUZGWWpzN1FVRkpSQ3hUUVVGSk96czdPMk5CUVVFc1kwRkJReXhOUVVGTkxFVkJRVU1zVVVGQlVTeEZRVUZGT3p0QlFVVnlRaXhoUVVGSkxGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1JVRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6czdRVUZGTDBNc1lVRkJTU3hEUVVGRExFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGRkJRVkVzUjBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZET3p0QlFVVnVSQ3hWUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWRCUVVNc1ZVRkJWU3hEUVVGRExFZEJRVU1zVlVGQlZTeERRVUZET3p0QlFVVjRReXhuUWtGQlR5eERRVUZETEVOQlFVTTdVVUZGVkRzN1FVRkZSQ3huUWtGQlZ6dGpRVUZCTEhWQ1FVRkhPMEZCUTFvc1lVRkJTU3hSUVVGUkxFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEyeENMR05CUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSMEZCUXl4VFFVRlRMRU5CUVVNc1RVRkJUU3hGUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlEyNURMRzFDUVVGUkxFTkJRVU1zU1VGQlNTeERRVUZGTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVVc1JVRkJSU3hIUVVGSExGTkJRVk1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUlN4RFFVRkZMRU5CUVVNN1ZVRkRha1E3UVVGRFJDeGhRVUZKTEVOQlFVTXNkMEpCUVhkQ0xFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTTdVVUZEZWtNN08wRkJSVVFzYTBKQlFXRTdZMEZCUVN4NVFrRkJSenRCUVVOa0xHRkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NSVUZCUlN4RFFVRkRPMEZCUTJoQ0xHTkJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkRMRU5CUVVNc1IwRkJReXhUUVVGVExFTkJRVU1zVFVGQlRTeEZRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZPMEZCUTI1RExHVkJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFWQlF5OUNPMUZCUTBZN08wRkJSVVFzTmtKQlFYZENPMk5CUVVFc2EwTkJRVU1zUzBGQlN5eEZRVUZGTzBGQlF6bENMR0ZCUVVrc1EwRkJReXhMUVVGTExFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEyaENMR05CUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZETEVOQlFVTXNSMEZCUXl4TFFVRkxMRU5CUVVNc1RVRkJUU3hIUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVWQlFVVXNSVUZCUlR0QlFVTnFReXhsUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1ZVRkRjRU03VVVGRFJqczdRVUZKUkN4alFVRlRPenM3TzJOQlFVRXNiVUpCUVVNc1NVRkJTU3hGUVVGRE96czdRVUZIWkN4aFFVRkpMRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJRenRCUVVONlF5eGhRVUZKTEVOQlFVTXNkMEpCUVhkQ0xFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdVVUZGZEVNN08wRkJTMFFzVjBGQlRUczdPenM3WTBGQlFTeG5Ra0ZCUXl4UFFVRlBMRVZCUVVVN1FVRkRaaXhoUVVGSkxGRkJRVkVzUjBGQlJ5eEZRVUZGTEVOQlFVTTdRVUZEYkVJc1kwRkJTeXhKUVVGSkxFZEJRVWNzU1VGQlNTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZPMEZCUXpWQ0xHVkJRVWtzUjBGQlJ5eERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRMRTlCUVU4c1EwRkJReXhQUVVGUExFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1JVRkJSVHRCUVVNMVJDeHhRa0ZCVVN4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFpRVU51UWp0VlFVTkVPMEZCUTBRc1owSkJRVThzVVVGQlVTeERRVUZETzFGQlEyaENPenRCUVVsRUxGVkJRVXM3T3pzN1kwRkJRU3hsUVVGRExFdEJRVXNzUlVGQlJUdEJRVU5hTEdGQlFVa3NUVUZCVFN4SFFVRkhMRVZCUVVVc1EwRkJRenRCUVVOb1FpeGpRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFZEJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNSVUZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSVHRCUVVOb1F5eHBRa0ZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VlVGRGFrTTdRVUZEUkN4blFrRkJUeXhOUVVGTkxFTkJRVU03VVVGRFpEczdPenRWUVhCTWEwSXNTVUZCU1RzN08ydENRVUZLTEVsQlFVa3NRenM3T3pzN08wRkRTbnBDTEdGQlFWa3NRMEZCUXpzN096czdPenM3TzB0QlMxRXNTMEZCU3pzN08wRkJSMWdzWTBGSVRTeExRVUZMTEVkQlIyRTdNa05CUVZJc1RVRkJUVHRCUVVGT0xHMUNRVUZOT3pzN1lVRkJja0lzVFVGQlRTeG5RMEZCUnl4RFFVRkRPenNyUWtGSVRDeExRVUZMT3pzN096czdPenRCUVZWc1FpeGhRVUZKTEUxQlFVMHNSMEZCUnl4RFFVRkRMRVZCUVVVN1FVRkJSU3h0UWtGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXp0VlFVRkZPenRCUVVVdlFpeGhRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJRenRCUVVOeVFpeGhRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRTFCUVUwc1EwRkJRenRCUVVOeVFpeGhRVUZKTEVOQlFVTXNTMEZCU3l4SFFVRkhMRWxCUVVrc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenM3UVVGRmRrTXNZVUZCU1N4TlFVRk5MRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUlVGQlJUdEJRVU51UWl4cFFrRkJTU3hEUVVGRExFVkJRVVVzVDBGQlVDeEpRVUZKTEVWQlFVOHNUVUZCVFN4RFFVRkRMRU5CUVVNN1ZVRkRkRUk3VFVGRFNqczdhMEpCYmtKblFpeExRVUZMTzBGQmNVSjBRaXhsUVVGTk8yOUNRVUZCTEdkQ1FVRkRMRXRCUVVzc1JVRkJSVHRCUVVOV0xIRkNRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEJRVU51UWl4eFFrRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1FVRkRkRUlzZDBKQlFVOHNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJRenRqUVVOeVFqczdRVUZGUkN4aFFVRkpPMjlDUVVGQkxHZENRVUZaTzIxRVFVRlNMRTFCUVUwN1FVRkJUaXd5UWtGQlRUczdPenRCUVVWV0xIRkNRVUZKTEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRE8wRkJRMjVDTEhGQ1FVRkpMRTFCUVUwc1EwRkJReXhOUVVGTkxFZEJRVWNzUTBGQlF5eEZRVUZGTzBGQlEyNUNMREpDUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEZWQlFWTXNRMEZCUXl4RlFVRkZPMEZCUTNaQ0xEWkNRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUlVGQlJUdEJRVU5zUWl4dlEwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eHhRa0ZCY1VJc1IwRkJSeXhEUVVGRExFZEJRVWNzYTBKQlFXdENMRU5CUVVNc1EwRkJRenN3UWtGRGFFVXNUVUZCVFR0QlFVTklMRGhDUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eERRVUZGTEVOQlFVTTdNRUpCUTNwQ08zTkNRVU5LTEVOQlFVTXNRMEZCUXp0clFrRkRUaXhOUVVGTk8wRkJRMGdzYzBKQlFVTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1ZVRkJVeXhEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEVkQlFVY3NSVUZCUlR0QlFVTXhRaXcwUWtGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlJTeERRVUZETzNOQ1FVTjRRaXhEUVVGRExFTkJRVU03YTBKQlEwNDdRVUZEUkN4M1FrRkJUeXhEUVVGRExFTkJRVU03WTBGRFdqczdRVUZGUkN4WFFVRkZPMjlDUVVGQkxHTkJRVms3YlVSQlFWSXNUVUZCVFR0QlFVRk9MREpDUVVGTk96czdPMEZCUlZJc2NVSkJRVWtzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNN1FVRkRia0lzY1VKQlFVa3NUVUZCVFN4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFVkJRVVU3UVVGRGJrSXNNa0pCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zVlVGQlV5eERRVUZETEVWQlFVVTdRVUZEZGtJc05rSkJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhGUVVGRk8wRkJRMnhDTEc5RFFVRlBMRU5CUVVNc1NVRkJTU3hEUVVGRExIRkNRVUZ4UWl4SFFVRkhMRU5CUVVNc1IwRkJSeXd3UWtGQk1FSXNRMEZCUXl4RFFVRkRPekJDUVVONFJTeE5RVUZOTzBGQlEwZ3NhVU5CUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUlR0QlFVRkZMSGREUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEhGQ1FVRnhRaXhIUVVGSExFTkJRVU1zUjBGQlJ5eHRRa0ZCYlVJc1EwRkJReXhEUVVGRE96aENRVUZGTzBGQlEyeEdMRGhDUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPekJDUVVOYU8zTkNRVU5LTEVOQlFVTXNRMEZCUXp0clFrRkRUaXhOUVVGTk8wRkJRMGdzYzBKQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03YTBKQlEySTdRVUZEUkN4M1FrRkJUeXhEUVVGRExFTkJRVU03WTBGRFdqczdRVUZGUkN4WlFVRkhPMjlDUVVGQkxHVkJRVms3YlVSQlFWSXNUVUZCVFR0QlFVRk9MREpDUVVGTk96czdPMEZCUlZRc2NVSkJRVWtzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNN1FVRkRia0lzY1VKQlFVa3NUVUZCVFN4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFVkJRVVU3UVVGRGJrSXNNa0pCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zVlVGQlV5eERRVUZETEVWQlFVVTdRVUZEZGtJc01FSkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN2MwSkJRMW9zUTBGQlF5eERRVUZETzJ0Q1FVTk9MRTFCUVUwN1FVRkRTQ3h6UWtGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRyUWtGRFlqdEJRVU5FTEhkQ1FVRlBMRU5CUVVNc1EwRkJRenRqUVVOYU96czdPMWxCTTBWblFpeExRVUZMT3pzN2EwSkJRVXdzUzBGQlN5eERPenM3T3pzN1FVTk1NVUk3TzBGQlJVRTdRVUZEUVRzN096czdPenRCUTBoQk96dEJRVVZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUVVWQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZCUlVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUVVWQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkJSVUU3UVVGRFFTd3dRMEZCZVVNN08wRkJSWHBETzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdPMEZCUlVFc1NVRkJSenRCUVVOSU8wRkJRMEU3TzBGQlJVRXNTVUZCUnp0QlFVTklPenRCUVVWQk8wRkJRMEU3UVVGRFFUczdRVUZGUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZCUlVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVUZGUVR0QlFVTkJPMEZCUTBFN1FVRkRRU3h0UTBGQmEwTXNhVU5CUVdsRE8wRkJRMjVGTzBGQlEwRTdPMEZCUlVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTEhORFFVRnhReXhsUVVGbE8wRkJRM0JFTzBGQlEwRXNUVUZCU3pzN1FVRkZURHRCUVVOQk8wRkJRMEU3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQkxFazdRVUZEUVRzN1FVRkZRVHM3UVVGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFUczdRVUZGUVR0QlFVTkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdPMEZCUlVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3TzBGQlJVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CT3p0QlFVVkJPMEZCUTBFN1FVRkRRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdRVUZEUVR0QlFVTkJMRVU3T3pzN096czdRVU42VDBFN1FVRkRRVHM3UVVGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk96dEJRVVZCTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRXNWVUZCVXp0QlFVTlVPMEZCUTBFN1FVRkRRU3hOUVVGTE8wRkJRMHc3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJMRlZCUVZNN1FVRkRWRHRCUVVOQk8wRkJRMEVzVFVGQlN6dEJRVU5NTzBGQlEwRTdRVUZEUVN4RlFVRkRPMEZCUTBRN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTeE5RVUZMTzBGQlEwdzdRVUZEUVR0QlFVTkJPMEZCUTBFc1ZVRkJVenRCUVVOVU8wRkJRMEU3UVVGRFFUdEJRVU5CT3pzN1FVRkhRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRXNUVUZCU3p0QlFVTk1PMEZCUTBFN1FVRkRRVHRCUVVOQkxGVkJRVk03UVVGRFZEdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenM3TzBGQlNVRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHM3UVVGRlFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQkxFMUJRVXM3UVVGRFREdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN08wRkJSVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUVVWQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUVVWQk8wRkJRMEU3UVVGRFFUdEJRVU5CTEhkQ1FVRjFRaXh6UWtGQmMwSTdRVUZETjBNN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVRzN1FVRkZRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTeHpRa0ZCY1VJN1FVRkRja0k3TzBGQlJVRTdPMEZCUlVFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPenRCUVVWQkxITkRRVUZ4UXpzN1FVRkZja003UVVGRFFUdEJRVU5CT3p0QlFVVkJMRFJDUVVFeVFqdEJRVU16UWp0QlFVTkJPMEZCUTBFN1FVRkRRU3cyUWtGQk5FSXNWVUZCVlRzN096czdPenRCUTNaTWRFTXNZVUZCV1N4RFFVRkRPenM3T3pzN1MwRkZTaXhMUVVGTExIVkNRVUZSTEVOQlFWTXNSVUZCZEVJc1MwRkJTenM3UzBGRlR5eFJRVUZSTzBGQlJXaENMRmxCUmxFc1VVRkJVU3hEUVVWbUxFbEJRVWtzUlVGQlF5eEpRVUZKTEVWQlFVTXNSVUZCUlN4RlFVRkZPekpDUVVaUUxGRkJRVkU3TzBGQlNYcENMRk5CUVVrc1EwRkJReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETzBGQlEycENMRk5CUVVrc1EwRkJReXhGUVVGRkxFZEJRVWNzUlVGQlJTeERRVUZETzBGQlEySXNVMEZCU1N4RFFVRkRMRXRCUVVzc1IwRkJSeXhMUVVGTExFVkJRVVVzUTBGQlF6czdRVUZGY2tJc1UwRkJTU3hEUVVGRExFOUJRVThzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTI1Q0xGTkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NRMEZCUXl4RFFVRkRPenRCUVVWbUxGTkJRVWtzUTBGQlF5eExRVUZMTEVkQlFVY3NTVUZCU1N4SFFVRkhMRWxCUVVrc1IwRkJSeXhaUVVGWExFVkJRVWNzUTBGQlF6czdRVUZGTVVNc1UwRkJTU3hKUVVGSkxFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlExZ3NWMEZCU1N4RFFVRkRMRXRCUVVzc1JVRkJSU3hEUVVGRE8wMUJRMlE3U1VGRlJqczdaMEpCYWtKclFpeFJRVUZSTzBGQmJVSXpRaXhYUVVGTk8yTkJRVUVzWjBKQlFVTXNRMEZCUXl4RlFVRkZPenRCUVVWT0xHRkJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN08wRkJSV2hDTEdGQlFVa3NRMEZCUXl4TFFVRkxMRVZCUVVVc1EwRkJRenRSUVVOa096dEJRVVZFTEZOQlFVazdZMEZCUVN4blFrRkJSenRCUVVOTUxHRkJRVWtzUTBGQlF5eEZRVUZGTEVkQlFVY3NTMEZCU3l4RFFVRkRPMEZCUTJoQ0xHRkJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNTMEZCU3l4RlFVRkZMRU5CUVVNN1VVRkRka0k3TzBGQlJVUXNWVUZCU3p0alFVRkJMR2xDUVVGSE8wRkJRMDRzWVVGQlNTeERRVUZETEVWQlFVVXNSMEZCUnl4SlFVRkpMRU5CUVVNN1FVRkRaaXhoUVVGSkxFTkJRVU1zVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1kwRkJZeXhEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmRCUVZjc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4SFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExGTkJRVk1zUTBGQlF5eEZRVUZETEV0QlFVc3NSVUZCUlN4SFFVRkhMRVZCUVVVc1NVRkJTU3hGUVVGRExFTkJRVU1zUlVGQlF5eERRVUZETEVOQlFVTTdVVUZETVVvN08wRkJSVVFzVDBGQlJUdGpRVUZCTEZsQlFVTXNUMEZCVHl4RlFVRkZPMEZCUTFZc1lVRkJTU3hKUVVGSkxFTkJRVU1zUlVGQlJTeEZRVUZGTzBGQlExZ3NaVUZCU1N4TFFVRkxMRWRCUVVjc1QwRkJUeXhIUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTTdRVUZET1VJc1pVRkJTU3hEUVVGRExFbEJRVWtzUjBGQlJ5eFBRVUZQTEVOQlFVTTdRVUZEY0VJc1pVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eFhRVUZYTEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhQUVVGUExFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFWQlEyaEdMRTFCUVUwN1FVRkRUQ3hsUVVGSkxFTkJRVU1zU1VGQlNTeEhRVUZITEU5QlFVOHNRMEZCUXp0VlFVTnlRanRSUVVOR096czdPMVZCTlVOclFpeFJRVUZST3pzN2EwSkJRVklzVVVGQlVTeERJaXdpWm1sc1pTSTZJaTR2WkdsemRDOU9aWGgxYzFWSkxtcHpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpS0daMWJtTjBhVzl1SUhkbFluQmhZMnRWYm1sMlpYSnpZV3hOYjJSMWJHVkVaV1pwYm1sMGFXOXVLSEp2YjNRc0lHWmhZM1J2Y25rcElIdGNibHgwYVdZb2RIbHdaVzltSUdWNGNHOXlkSE1nUFQwOUlDZHZZbXBsWTNRbklDWW1JSFI1Y0dWdlppQnRiMlIxYkdVZ1BUMDlJQ2R2WW1wbFkzUW5LVnh1WEhSY2RHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1ptRmpkRzl5ZVNncE8xeHVYSFJsYkhObElHbG1LSFI1Y0dWdlppQmtaV1pwYm1VZ1BUMDlJQ2RtZFc1amRHbHZiaWNnSmlZZ1pHVm1hVzVsTG1GdFpDbGNibHgwWEhSa1pXWnBibVVvVzEwc0lHWmhZM1J2Y25rcE8xeHVYSFJsYkhObElHbG1LSFI1Y0dWdlppQmxlSEJ2Y25SeklEMDlQU0FuYjJKcVpXTjBKeWxjYmx4MFhIUmxlSEJ2Y25Selcxd2lUbVY0ZFhOY0lsMGdQU0JtWVdOMGIzSjVLQ2s3WEc1Y2RHVnNjMlZjYmx4MFhIUnliMjkwVzF3aVRtVjRkWE5jSWwwZ1BTQm1ZV04wYjNKNUtDazdYRzU5S1NoMGFHbHpMQ0JtZFc1amRHbHZiaWdwSUh0Y2JuSmxkSFZ5YmlCY2JseHVYRzR2THlCWFJVSlFRVU5MSUVaUFQxUkZVaUF2TDF4dUx5OGdkMlZpY0dGamF5OTFibWwyWlhKellXeE5iMlIxYkdWRVpXWnBibWwwYVc5dUlpd2lJRngwTHk4Z1ZHaGxJRzF2WkhWc1pTQmpZV05vWlZ4dUlGeDBkbUZ5SUdsdWMzUmhiR3hsWkUxdlpIVnNaWE1nUFNCN2ZUdGNibHh1SUZ4MEx5OGdWR2hsSUhKbGNYVnBjbVVnWm5WdVkzUnBiMjVjYmlCY2RHWjFibU4wYVc5dUlGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOG9iVzlrZFd4bFNXUXBJSHRjYmx4dUlGeDBYSFF2THlCRGFHVmpheUJwWmlCdGIyUjFiR1VnYVhNZ2FXNGdZMkZqYUdWY2JpQmNkRngwYVdZb2FXNXpkR0ZzYkdWa1RXOWtkV3hsYzF0dGIyUjFiR1ZKWkYwcFhHNGdYSFJjZEZ4MGNtVjBkWEp1SUdsdWMzUmhiR3hsWkUxdlpIVnNaWE5iYlc5a2RXeGxTV1JkTG1WNGNHOXlkSE03WEc1Y2JpQmNkRngwTHk4Z1EzSmxZWFJsSUdFZ2JtVjNJRzF2WkhWc1pTQW9ZVzVrSUhCMWRDQnBkQ0JwYm5SdklIUm9aU0JqWVdOb1pTbGNiaUJjZEZ4MGRtRnlJRzF2WkhWc1pTQTlJR2x1YzNSaGJHeGxaRTF2WkhWc1pYTmJiVzlrZFd4bFNXUmRJRDBnZTF4dUlGeDBYSFJjZEdWNGNHOXlkSE02SUh0OUxGeHVJRngwWEhSY2RHbGtPaUJ0YjJSMWJHVkpaQ3hjYmlCY2RGeDBYSFJzYjJGa1pXUTZJR1poYkhObFhHNGdYSFJjZEgwN1hHNWNiaUJjZEZ4MEx5OGdSWGhsWTNWMFpTQjBhR1VnYlc5a2RXeGxJR1oxYm1OMGFXOXVYRzRnWEhSY2RHMXZaSFZzWlhOYmJXOWtkV3hsU1dSZExtTmhiR3dvYlc5a2RXeGxMbVY0Y0c5eWRITXNJRzF2WkhWc1pTd2diVzlrZFd4bExtVjRjRzl5ZEhNc0lGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOHBPMXh1WEc0Z1hIUmNkQzh2SUVac1lXY2dkR2hsSUcxdlpIVnNaU0JoY3lCc2IyRmtaV1JjYmlCY2RGeDBiVzlrZFd4bExteHZZV1JsWkNBOUlIUnlkV1U3WEc1Y2JpQmNkRngwTHk4Z1VtVjBkWEp1SUhSb1pTQmxlSEJ2Y25SeklHOW1JSFJvWlNCdGIyUjFiR1ZjYmlCY2RGeDBjbVYwZFhKdUlHMXZaSFZzWlM1bGVIQnZjblJ6TzF4dUlGeDBmVnh1WEc1Y2JpQmNkQzh2SUdWNGNHOXpaU0IwYUdVZ2JXOWtkV3hsY3lCdlltcGxZM1FnS0Y5ZmQyVmljR0ZqYTE5dGIyUjFiR1Z6WDE4cFhHNGdYSFJmWDNkbFluQmhZMnRmY21WeGRXbHlaVjlmTG0wZ1BTQnRiMlIxYkdWek8xeHVYRzRnWEhRdkx5QmxlSEJ2YzJVZ2RHaGxJRzF2WkhWc1pTQmpZV05vWlZ4dUlGeDBYMTkzWldKd1lXTnJYM0psY1hWcGNtVmZYeTVqSUQwZ2FXNXpkR0ZzYkdWa1RXOWtkV3hsY3p0Y2JseHVJRngwTHk4Z1gxOTNaV0p3WVdOclgzQjFZbXhwWTE5d1lYUm9YMTljYmlCY2RGOWZkMlZpY0dGamExOXlaWEYxYVhKbFgxOHVjQ0E5SUZ3aVhDSTdYRzVjYmlCY2RDOHZJRXh2WVdRZ1pXNTBjbmtnYlc5a2RXeGxJR0Z1WkNCeVpYUjFjbTRnWlhod2IzSjBjMXh1SUZ4MGNtVjBkWEp1SUY5ZmQyVmljR0ZqYTE5eVpYRjFhWEpsWDE4b01DazdYRzVjYmx4dVhHNHZMeUJYUlVKUVFVTkxJRVpQVDFSRlVpQXZMMXh1THk4Z2QyVmljR0ZqYXk5aWIyOTBjM1J5WVhBZ1lqSTJPV0ZqWldZNFkyRmtZVGN3T0RRMU1ESWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibWx0Y0c5eWRDQk9aWGgxYzFWSklHWnliMjBnSnk0dmJHbGlMMjFoYVc0bk8xeHVYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQk9aWGgxYzFWSk8xeHVYRzVjYmx4dUx5OGdWMFZDVUVGRFN5QkdUMDlVUlZJZ0x5OWNiaTh2SUM0dmZpOXFjMmhwYm5RdGJHOWhaR1Z5SVM0dmFXNWtaWGd1YW5NaUxDSW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JtbHRjRzl5ZENCSmJuUmxjbVpoWTJWeklHWnliMjBnSnk0dmFXNTBaWEptWVdObGN5OG5PMXh1YVcxd2IzSjBJRzFoZEdnZ1puSnZiU0FuTGk5MWRHbHNMMjFoZEdnbk8xeHVhVzF3YjNKMElGSmhZMnNnWm5KdmJTQW5MaTlqYjNKbEwzSmhZMnNuTzF4dWFXMXdiM0owSUZSMWJtVWdabkp2YlNBbkxpOTBkVzVwYm1jdmRIVnVhVzVuSnp0Y2JtbHRjRzl5ZENBcUlHRnpJRlJ5WVc1elptOXliU0JtY205dElDY3VMM1YwYVd3dmRISmhibk5tYjNKdEp6dGNibHh1YkdWMElFTnZkVzUwWlhJZ1BTQnlaWEYxYVhKbEtDY3VMMjF2WkdWc2N5OWpiM1Z1ZEdWeUp5azdYRzVzWlhRZ1VtRmthVzhnUFNCeVpYRjFhWEpsS0NjdUwyMXZaR1ZzY3k5eVlXUnBieWNwTzF4dWJHVjBJRVJ5ZFc1cklEMGdjbVZ4ZFdseVpTZ25MaTl0YjJSbGJITXZaSEoxYm1zbktUdGNibXhsZENCVFpYRjFaVzVqWlNBOUlISmxjWFZwY21Vb0p5NHZiVzlrWld4ekwzTmxjWFZsYm1ObEp5azdYRzVzWlhRZ1RXRjBjbWw0SUQwZ2NtVnhkV2x5WlNnbkxpOXRiMlJsYkhNdmJXRjBjbWw0SnlrN1hHNWNibWx0Y0c5eWRDQlhRVUZEYkc5amF5Qm1jbTl0SUNkM1lXRmpiRzlqYXljN1hHNXBiWEJ2Y25RZ1NXNTBaWEoyWVd3Z1puSnZiU0FuTGk5MGFXMWxMMmx1ZEdWeWRtRnNKenRjYmx4dVhHNHZLaXBjYms1bGVIVnpWVWtnUFQ0Z1kzSmxZWFJsWkNCaGN5Qk9aWGgxYzF4dUtpOWNibHh1WTJ4aGMzTWdUbVY0ZFhOVlNTQjdYRzVjYmlBZ0lDQmpiMjV6ZEhKMVkzUnZjaWhqYjI1MFpYaDBLU0I3WEc1Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2hzWlhRZ2EyVjVJR2x1SUVsdWRHVnlabUZqWlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUhSb2FYTmJhMlY1WFNBOUlFbHVkR1Z5Wm1GalpYTmJhMlY1WFR0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJR1p2Y2lBb2JHVjBJR3RsZVNCcGJpQnRZWFJvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdselcydGxlVjBnUFNCdFlYUm9XMnRsZVYwN1hHNGdJQ0FnSUNBZ0lIMWNibHh1SUNBZ0lDQWdJQ0JzWlhRZ1EyOXlaU0E5SUh0Y2JpQWdJQ0FnSUNBZ0lDQW5VbUZqYXljNklGSmhZMnRjYmlBZ0lDQWdJQ0FnZlR0Y2JseHVJQ0FnSUNBZ0lDQnNaWFFnVFc5a1pXeHpJRDBnZTF4dUlDQWdJQ0FnSUNBZ0lDZERiM1Z1ZEdWeUp6b2dRMjkxYm5SbGNpeGNiaUFnSUNBZ0lDQWdJQ0FuVW1Ga2FXOG5PaUJTWVdScGJ5eGNiaUFnSUNBZ0lDQWdJQ0FuUkhKMWJtc25PaUJFY25WdWF5eGNiaUFnSUNBZ0lDQWdJQ0FuVTJWeGRXVnVZMlVuT2lCVFpYRjFaVzVqWlN4Y2JpQWdJQ0FnSUNBZ0lDQW5UV0YwY21sNEp6b2dUV0YwY21sNFhHNGdJQ0FnSUNBZ0lIMDdYRzVjYmlBZ0lDQWdJQ0FnWm05eUlDaHNaWFFnYTJWNUlHbHVJRTF2WkdWc2N5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTmJhMlY1WFNBOUlFMXZaR1ZzYzF0clpYbGRPMXh1SUNBZ0lDQWdJQ0I5WEc1Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2hzWlhRZ2EyVjVJR2x1SUVOdmNtVXBJSHRjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpXMnRsZVYwZ1BTQkRiM0psVzJ0bGVWMDdYRzRnSUNBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnSUNCc1pYUWdSR1ZtWVhWc2RFTnZiblJsZUhRZ1BTQjNhVzVrYjNjdVFYVmthVzlEYjI1MFpYaDBJSHg4SUhkcGJtUnZkeTUzWldKcmFYUkJkV1JwYjBOdmJuUmxlSFE3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVYMk52Ym5SbGVIUWdQU0JqYjI1MFpYaDBJSHg4SUc1bGR5QkVaV1poZFd4MFEyOXVkR1Y0ZENncE8xeHVYRzRnSUNBZ0lDQWdJSFJvYVhNdWRIVnVaU0E5SUc1bGR5QlVkVzVsS0NrN1hHNGdJQ0FnSUNBZ0lIUm9hWE11Ym05MFpTQTlJSFJvYVhNdWRIVnVaUzV1YjNSbExtSnBibVFvZEdocGN5NTBkVzVsS1R0Y2JseHVJQ0FnSUNBZ0lDQjBhR2x6TG1Oc2IyTnJJRDBnYm1WM0lGZEJRVU5zYjJOcktIUm9hWE11WDJOdmJuUmxlSFFwTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbU5zYjJOckxuTjBZWEowS0NrN1hHNGdJQ0FnSUNBZ0lIUm9hWE11U1c1MFpYSjJZV3dnUFNCSmJuUmxjblpoYkR0Y2JseHVJQ0FnSUNBZ0lDQjBhR2x6TG1OdmJHOXljeUE5SUh0Y2JpQWdJQ0FnSUNBZ0lDQmhZMk5sYm5RNklDY2pNbUppSnl4Y2JpQWdJQ0FnSUNBZ0lDQm1hV3hzT2lBbkkyVmxaU2NzWEc0Z0lDQWdJQ0FnSUNBZ2JHbG5hSFE2SUNjalptWm1KeXhjYmlBZ0lDQWdJQ0FnSUNCa1lYSnJPaUFuSXpNek15Y3NYRzRnSUNBZ0lDQWdJQ0FnYldWa2FYVnRUR2xuYUhRNklDY2pZMk5qSnl4Y2JpQWdJQ0FnSUNBZ0lDQnRaV1JwZFcxRVlYSnJPaUFuSXpZMk5pZGNiaUFnSUNBZ0lDQWdmVHRjYmx4dUlDQWdJQ0FnSUNCMGFHbHpMblJ5WVc1elptOXliU0E5SUZSeVlXNXpabTl5YlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVoWkdRZ1BTQlVjbUZ1YzJadmNtMHVZV1JrTzF4dVhHNWNiaUFnSUNBZ0lDQWdkR2hwY3k1QlpHUWdQU0I3ZlR0Y2JpQWdJQ0FnSUNBZ1ptOXlJQ2hzWlhRZ2EyVjVJR2x1SUVsdWRHVnlabUZqWlhNcElIdGNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxrRmtaRnRyWlhsZElEMGdWSEpoYm5ObWIzSnRMbUZrWkM1aWFXNWtLSFJvYVhNc2EyVjVLVHRjYmlBZ0lDQWdJQ0FnZlZ4dVhHNWNibHh1WEc0Z0lDQWdJQ0FnSUM4cUlHTnlaV0YwWlNCa1pXWmhkV3gwSUdOdmJYQnZibVZ1ZENCemFYcGxJQ292WEc0Z0lDQWdJQ0FnSUM4cUlHcHphR2x1ZENCcFoyNXZjbVU2YzNSaGNuUWdLaTljYmlBZ0lDQWdJQ0FnZG1GeUlHVjRhWE4wYVc1blUzUjViR1Z6YUdWbGRITWdQU0JrYjJOMWJXVnVkQzVuWlhSRmJHVnRaVzUwYzBKNVZHRm5UbUZ0WlNoY0luTjBlV3hsWENJcE8xeHVJQ0FnSUNBZ0lDQjJZWElnWkdWbVlYVnNkRk5wZW1WRVpXTnNZWEpoZEdsdmJpQTlJQ2RiYm1WNGRYTXRkV2xkZTJobGFXZG9kRG8xTURBd2NIZzdkMmxrZEdnNk5UQXdNSEI0ZlNjN1hHNGdJQ0FnSUNBZ0lIWmhjaUJrWldaaGRXeDBVM1I1YkdWT2IyUmxJRDBnWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDZ25jM1I1YkdVbktUdGNiaUFnSUNBZ0lDQWdaR1ZtWVhWc2RGTjBlV3hsVG05a1pTNTBlWEJsSUQwZ0ozUmxlSFF2WTNOekp6dGNiaUFnSUNBZ0lDQWdaR1ZtWVhWc2RGTjBlV3hsVG05a1pTNXBibTVsY2toVVRVd2dQU0JrWldaaGRXeDBVMmw2WlVSbFkyeGhjbUYwYVc5dU8xeHVJQ0FnSUNBZ0lDQnBaaUFvWlhocGMzUnBibWRUZEhsc1pYTm9aV1YwY3k1c1pXNW5kR2dnUGlBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnZG1GeUlIQmhjbVZ1ZENBOUlHVjRhWE4wYVc1blUzUjViR1Z6YUdWbGRITmJNRjB1Y0dGeVpXNTBUbTlrWlZ4dUlDQWdJQ0FnSUNBZ0lIQmhjbVZ1ZEM1cGJuTmxjblJDWldadmNtVW9JR1JsWm1GMWJIUlRkSGxzWlU1dlpHVXNJR1Y0YVhOMGFXNW5VM1I1YkdWemFHVmxkSE5iTUYwcFhHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdaRzlqZFcxbGJuUXVkM0pwZEdVb0p6eHpkSGxzWlQ0bksyUmxabUYxYkhSVGFYcGxSR1ZqYkdGeVlYUnBiMjRySnp4Y1hDOXpkSGxzWlQ0bktUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0F2S2lCcWMyaHBiblFnYVdkdWIzSmxPbVZ1WkNBcUwxeHVYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1oyVjBJR052Ym5SbGVIUW9LU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1ZlkyOXVkR1Y0ZER0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J6WlhRZ1kyOXVkR1Y0ZENoamRIZ3BJSHRjYmlBZ0lDQWdJSFJvYVhNdVkyeHZZMnN1YzNSdmNDZ3BPMXh1SUNBZ0lDQWdkR2hwY3k1ZlkyOXVkR1Y0ZENBOUlHTjBlRHRjYmlBZ0lDQWdJSFJvYVhNdVkyeHZZMnNnUFNCdVpYY2dWMEZCUTJ4dlkyc29kR2hwY3k1amIyNTBaWGgwS1R0Y2JpQWdJQ0FnSUhSb2FYTXVZMnh2WTJzdWMzUmhjblFvS1R0Y2JpQWdJQ0I5WEc1Y2JseHVYRzU5WEc1Y2JteGxkQ0JPWlhoMWN5QTlJRzVsZHlCT1pYaDFjMVZKS0NrN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQmpiMnh2Y25Nb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUU1bGVIVnpMbU52Ykc5eWN6dGNibjFjYm1WNGNHOXlkQ0JtZFc1amRHbHZiaUJqYjI1MFpYaDBLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQk9aWGgxY3k1amIyNTBaWGgwTzF4dWZWeHVaWGh3YjNKMElHWjFibU4wYVc5dUlHTnNiMk5yS0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUJPWlhoMWN5NWpiRzlqYXp0Y2JuMWNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdUbVY0ZFhNN1hHNWNibHh1WEc0dkx5QlhSVUpRUVVOTElFWlBUMVJGVWlBdkwxeHVMeThnTGk5K0wycHphR2x1ZEMxc2IyRmtaWEloTGk5c2FXSXZiV0ZwYmk1cWN5SXNJbVY0Y0c5eWRDQmtaV1poZFd4MElIdGNiaUFnVUc5emFYUnBiMjQ2SUhKbGNYVnBjbVVvSnk0dmNHOXphWFJwYjI0bktTeGNiaUFnVTJ4cFpHVnlPaUJ5WlhGMWFYSmxLQ2N1TDNOc2FXUmxjaWNwTEZ4dUlDQlViMmRuYkdVNklISmxjWFZwY21Vb0p5NHZkRzluWjJ4bEp5a3NYRzR2S2lBZ1VtRnVaMlU2SUhKbGNYVnBjbVVvSnk0dmNtRnVaMlZ6Ykdsa1pYSW5LU3hjYmlBZ1YyRjJaV1p2Y20wNklISmxjWFZwY21Vb0p5NHZkMkYyWldadmNtMG5LU3dnS2k5Y2JpQWdRblYwZEc5dU9pQnlaWEYxYVhKbEtDY3VMMkoxZEhSdmJpY3BMRnh1SUNCVVpYaDBRblYwZEc5dU9pQnlaWEYxYVhKbEtDY3VMM1JsZUhSaWRYUjBiMjRuS1N4Y2JpQWdVbUZrYVc5Q2RYUjBiMjQ2SUhKbGNYVnBjbVVvSnk0dmNtRmthVzlpZFhSMGIyNG5LU3hjYmlBZ1RuVnRZbVZ5T2lCeVpYRjFhWEpsS0NjdUwyNTFiV0psY2ljcExGeHVJQ0JUWld4bFkzUTZJSEpsY1hWcGNtVW9KeTR2YzJWc1pXTjBKeWtzWEc0Z0lFUnBZV3c2SUhKbGNYVnBjbVVvSnk0dlpHbGhiQ2NwTEZ4dUlDQlFhV0Z1YnpvZ2NtVnhkV2x5WlNnbkxpOXdhV0Z1YnljcExGeHVJQ0JUWlhGMVpXNWpaWEk2SUhKbGNYVnBjbVVvSnk0dmMyVnhkV1Z1WTJWeUp5a3NYRzRnSUZCaGJqSkVPaUJ5WlhGMWFYSmxLQ2N1TDNCaGJqSmtKeWtzWEc0Z0lGUnBiSFE2SUhKbGNYVnBjbVVvSnk0dmRHbHNkQ2NwTEZ4dUlDQk5kV3gwYVhOc2FXUmxjam9nY21WeGRXbHlaU2duTGk5dGRXeDBhWE5zYVdSbGNpY3BMRnh1SUNCUVlXNDZJSEpsY1hWcGNtVW9KeTR2Y0dGdUp5a3NYRzRnSUVWdWRtVnNiM0JsT2lCeVpYRjFhWEpsS0NjdUwyVnVkbVZzYjNCbEp5a3NYRzRnSUZOd1pXTjBjbTluY21GdE9pQnlaWEYxYVhKbEtDY3VMM053WldOMGNtOW5jbUZ0Snlrc1hHNGdJRTFsZEdWeU9pQnlaWEYxYVhKbEtDY3VMMjFsZEdWeUp5a3NYRzRnSUU5elkybHNiRzl6WTI5d1pUb2djbVZ4ZFdseVpTZ25MaTl2YzJOcGJHeHZjMk52Y0dVbktWeHVmVHRjYmx4dVhHNWNiaTh2SUZkRlFsQkJRMHNnUms5UFZFVlNJQzh2WEc0dkx5QXVMMzR2YW5Ob2FXNTBMV3h2WVdSbGNpRXVMMnhwWWk5cGJuUmxjbVpoWTJWekwybHVaR1Y0TG1weklpd2lYRzRuZFhObElITjBjbWxqZENjN1hHNWNibXhsZENCemRtY2dQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNMM04yWnljcE8xeHViR1YwSUVsdWRHVnlabUZqWlNBOUlISmxjWFZwY21Vb0p5NHVMMk52Y21VdmFXNTBaWEptWVdObEp5azdYRzVzWlhRZ1UzUmxjQ0E5SUhKbGNYVnBjbVVvSnk0dUwyMXZaR1ZzY3k5emRHVndKeWs3WEc1cGJYQnZjblFnS2lCaGN5QkpiblJsY21GamRHbHZiaUJtY205dElDY3VMaTkxZEdsc0wybHVkR1Z5WVdOMGFXOXVKenRjYmx4dUx5b3FYRzRxSUZCdmMybDBhVzl1WEc0cVhHNHFJRUJrWlhOamNtbHdkR2x2YmlCVWQyOHRaR2x0Wlc1emFXOXVZV3dnZEc5MVkyZ2djMnhwWkdWeUxseHVLbHh1S2lCQVpHVnRieUE4YzNCaGJpQnVaWGgxY3kxMWFUMWNJbkJ2YzJsMGFXOXVYQ0krUEM5emNHRnVQbHh1S2x4dUtpQkFaWGhoYlhCc1pWeHVLaUIyWVhJZ2NHOXphWFJwYjI0Z1BTQnVaWGNnVG1WNGRYTXVVRzl6YVhScGIyNG9KeU4wWVhKblpYUW5LVnh1S2x4dUtpQkFaWGhoYlhCc1pWeHVLaUIyWVhJZ2NHOXphWFJwYjI0Z1BTQnVaWGNnVG1WNGRYTXVVRzl6YVhScGIyNG9KeU4wWVhKblpYUW5MSHRjYmlvZ0lDQW5jMmw2WlNjNklGc3lNREFzTWpBd1hTeGNiaW9nSUNBbmJXOWtaU2M2SUNkaFluTnZiSFYwWlNjc0lDQXZMeUJjSW1GaWMyOXNkWFJsWENJZ2IzSWdYQ0p5Wld4aGRHbDJaVndpWEc0cUlDQWdKM2duT2lBd0xqVXNJQ0F2THlCcGJtbDBhV0ZzSUhnZ2RtRnNkV1ZjYmlvZ0lDQW5iV2x1V0NjNklEQXNYRzRxSUNBZ0oyMWhlRmduT2lBeExGeHVLaUFnSUNkemRHVndXQ2M2SURBc1hHNHFJQ0FnSjNrbk9pQXdMalVzSUNBdkx5QnBibWwwYVdGc0lIa2dkbUZzZFdWY2Jpb2dJQ0FuYldsdVdTYzZJREFzWEc0cUlDQWdKMjFoZUZrbk9pQXhMRnh1S2lBZ0lDZHpkR1Z3V1NjNklEQmNiaW9nZlNsY2JpcGNiaW9nUUc5MWRIQjFkRnh1S2lCamFHRnVaMlZjYmlvZ1JtbHlaWE1nWVc1NUlIUnBiV1VnZEdobElHbHVkR1Z5Wm1GalpTZHpJSFpoYkhWbElHTm9ZVzVuWlhNdUlEeGljajVjYmlvZ1ZHaGxJR1YyWlc1MElHUmhkR0VnYVhNZ1lXNGdiMkpxWldOMElIZHBkR2dnZUNCaGJtUWdlU0J3Y205d1pYSjBhV1Z6SUdOdmJuUmhhVzVwYm1jZ2RHaGxJSGdnWVc1a0lIa2dkbUZzZFdWeklHOW1JSFJvWlNCcGJuUmxjbVpoWTJVdVhHNHFYRzRxSUVCdmRYUndkWFJsZUdGdGNHeGxYRzRxSUhCdmMybDBhVzl1TG05dUtDZGphR0Z1WjJVbkxHWjFibU4wYVc5dUtIWXBJSHRjYmlvZ0lDQmpiMjV6YjJ4bExteHZaeWgyS1R0Y2Jpb2dmU2xjYmlwY2JpcGNiaW92WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdOc1lYTnpJRkJ2YzJsMGFXOXVJR1Y0ZEdWdVpITWdTVzUwWlhKbVlXTmxJSHRjYmx4dUlDQmpiMjV6ZEhKMVkzUnZjaWdwSUh0Y2JseHVJQ0FnSUd4bGRDQnZjSFJwYjI1eklEMGdXeWQyWVd4MVpTZGRPMXh1WEc0Z0lDQWdiR1YwSUdSbFptRjFiSFJ6SUQwZ2UxeHVJQ0FnSUNBZ0ozTnBlbVVuT2lCYk1qQXdMREl3TUYwc1hHNGdJQ0FnSUNBbmJXOWtaU2M2SUNkaFluTnZiSFYwWlNjc1hHNGdJQ0FnSUNBbmJXbHVXQ2M2SURBc1hHNGdJQ0FnSUNBbmJXRjRXQ2M2SURFc1hHNGdJQ0FnSUNBbmMzUmxjRmduT2lBd0xGeHVJQ0FnSUNBZ0ozZ25PaUF3TGpVc1hHNGdJQ0FnSUNBbmJXbHVXU2M2SURBc1hHNGdJQ0FnSUNBbmJXRjRXU2M2SURFc1hHNGdJQ0FnSUNBbmMzUmxjRmtuT2lBd0xGeHVJQ0FnSUNBZ0oza25PaUF3TGpWY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnYzNWd1pYSW9ZWEpuZFcxbGJuUnpMRzl3ZEdsdmJuTXNaR1ZtWVhWc2RITXBPMXh1WEc1Y2JpQWdJQ0IwYUdsekxsOTRJRDBnYm1WM0lGTjBaWEFvSUhSb2FYTXVjMlYwZEdsdVozTXViV2x1V0N3Z2RHaHBjeTV6WlhSMGFXNW5jeTV0WVhoWUxDQjBhR2x6TG5ObGRIUnBibWR6TG5OMFpYQllMQ0IwYUdsekxuTmxkSFJwYm1kekxuZ2dLVHRjYmlBZ0lDQjBhR2x6TGw5NUlEMGdibVYzSUZOMFpYQW9JSFJvYVhNdWMyVjBkR2x1WjNNdWJXbHVXU3dnZEdocGN5NXpaWFIwYVc1bmN5NXRZWGhaTENCMGFHbHpMbk5sZEhScGJtZHpMbk4wWlhCWkxDQjBhR2x6TG5ObGRIUnBibWR6TG5rZ0tUdGNibHh1SUNBZ0lIUm9hWE11Y0c5emFYUnBiMjRnUFNCN1hHNGdJQ0FnSUNCNE9pQnVaWGNnU1c1MFpYSmhZM1JwYjI0dVNHRnVaR3hsS0hSb2FYTXVjMlYwZEdsdVozTXViVzlrWlN3bmFHOXlhWHB2Ym5SaGJDY3NXekFzZEdocGN5NTNhV1IwYUYwc1czUm9hWE11YUdWcFoyaDBMREJkS1N4Y2JpQWdJQ0FnSUhrNklHNWxkeUJKYm5SbGNtRmpkR2x2Ymk1SVlXNWtiR1VvZEdocGN5NXpaWFIwYVc1bmN5NXRiMlJsTENkMlpYSjBhV05oYkNjc1d6QXNkR2hwY3k1M2FXUjBhRjBzVzNSb2FYTXVhR1ZwWjJoMExEQmRLVnh1SUNBZ0lIMDdYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaTU0TG5aaGJIVmxJRDBnZEdocGN5NWZlQzV1YjNKdFlXeHBlbVZrTzF4dUlDQWdJSFJvYVhNdWNHOXphWFJwYjI0dWVTNTJZV3gxWlNBOUlIUm9hWE11WDNrdWJtOXliV0ZzYVhwbFpEdGNibHh1SUNBZ0lIUm9hWE11YVc1cGRDZ3BPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrU1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzRnSUNBZ2RHaHBjeTVyYm05aUlEMGdjM1puTG1OeVpXRjBaU2duWTJseVkyeGxKeWs3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG1Gd2NHVnVaRU5vYVd4a0tIUm9hWE11YTI1dllpazdYRzRnSUNBZ1hHNGdJSDFjYmx4dUlDQnphWHBsU1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzRnSUNBZ0lDQjBhR2x6TG5CdmMybDBhVzl1TG5ndWNtVnphWHBsS0Zzd0xIUm9hWE11ZDJsa2RHaGRMRnQwYUdsekxtaGxhV2RvZEN3d1hTazdYRzRnSUNBZ0lDQjBhR2x6TG5CdmMybDBhVzl1TG5rdWNtVnphWHBsS0Zzd0xIUm9hWE11ZDJsa2RHaGRMRnQwYUdsekxtaGxhV2RvZEN3d1hTazdYRzVjYmlBZ0lDQWdJSFJvYVhNdVgyMXBia1JwYldWdWMybHZiaUE5SUUxaGRHZ3ViV2x1S0hSb2FYTXVkMmxrZEdnc2RHaHBjeTVvWldsbmFIUXBPMXh1WEc0Z0lDQWdJQ0IwYUdsekxtdHViMkpTWVdScGRYTWdQU0I3WEc0Z0lDQWdJQ0FnSUc5bVpqb2dmbjRvZEdocGN5NWZiV2x1UkdsdFpXNXphVzl1THpFd01Da2dLaUExSUNzZ05TeGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ0lDQjBhR2x6TG10dWIySlNZV1JwZFhNdWIyNGdQU0IwYUdsekxtdHViMkpTWVdScGRYTXViMlptSUNvZ01qdGNibHh1SUNBZ0lDQWdkR2hwY3k1cmJtOWlMbk5sZEVGMGRISnBZblYwWlNnblkzZ25MSFJvYVhNdWQybGtkR2d2TWlrN1hHNGdJQ0FnSUNCMGFHbHpMbXR1YjJJdWMyVjBRWFIwY21saWRYUmxLQ2RqZVNjc2RHaHBjeTVvWldsbmFIUXZNaWs3WEc0Z0lDQWdJQ0IwYUdsekxtdHViMkl1YzJWMFFYUjBjbWxpZFhSbEtDZHlKeXgwYUdsekxtdHViMkpTWVdScGRYTXViMlptS1R0Y2JpQWdmVnh1WEc0Z0lHTnZiRzl5U1c1MFpYSm1ZV05sS0NrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk4wZVd4bExtSmhZMnRuY205MWJtUkRiMnh2Y2lBOUlIUm9hWE11WTI5c2IzSnpMbVpwYkd3N1hHNGdJQ0FnSUNCMGFHbHpMbXR1YjJJdWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5d2dkR2hwY3k1amIyeHZjbk11WVdOalpXNTBLVHRjYmlBZ2ZWeHVYRzRnSUhKbGJtUmxjaWdwSUh0Y2JpQWdJQ0JwWmlBb2RHaHBjeTVqYkdsamEyVmtLU0I3WEc0Z0lDQWdMeThnSUhSb2FYTXVhMjV2WWxKaFpHbDFjeUE5SURNd08xeHVJQ0FnSUNBZ2RHaHBjeTVyYm05aUxuTmxkRUYwZEhKcFluVjBaU2duY2ljc2RHaHBjeTVyYm05aVVtRmthWFZ6TG05dUtUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQzh2SUNCMGFHbHpMbXR1YjJKU1lXUnBkWE1nUFNBeE5UdGNiaUFnSUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjNJbkxIUm9hWE11YTI1dllsSmhaR2wxY3k1dlptWXBPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIUm9hWE11YTI1dllrTnZiM0prYVc1aGRHVnpJRDBnZTF4dUlDQWdJQ0FnZURvZ2RHaHBjeTVmZUM1dWIzSnRZV3hwZW1Wa0lDb2dkR2hwY3k1M2FXUjBhQ3hjYmlBZ0lDQWdJSGs2SUhSb2FYTXVhR1ZwWjJoMElDMGdkR2hwY3k1ZmVTNXViM0p0WVd4cGVtVmtJQ29nZEdocGN5NW9aV2xuYUhSY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnZEdocGN5NXJibTlpTG5ObGRFRjBkSEpwWW5WMFpTZ25ZM2duTEhSb2FYTXVhMjV2WWtOdmIzSmthVzVoZEdWekxuZ3BPMXh1SUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjJONUp5eDBhR2x6TG10dWIySkRiMjl5WkdsdVlYUmxjeTU1S1R0Y2JpQWdmVnh1WEc1Y2JpQWdZMnhwWTJzb0tTQjdYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaTU0TG1GdVkyaHZjaUE5SUhSb2FYTXViVzkxYzJVN1hHNGdJQ0FnZEdocGN5NXdiM05wZEdsdmJpNTVMbUZ1WTJodmNpQTlJSFJvYVhNdWJXOTFjMlU3WEc0Z0lDQWdkR2hwY3k1dGIzWmxLQ2s3WEc0Z0lIMWNibHh1SUNCdGIzWmxLQ2tnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbU5zYVdOclpXUXBJSHRjYmlBZ0lDQWdJSFJvYVhNdWNHOXphWFJwYjI0dWVDNTFjR1JoZEdVb2RHaHBjeTV0YjNWelpTazdYRzRnSUNBZ0lDQjBhR2x6TG5CdmMybDBhVzl1TG5rdWRYQmtZWFJsS0hSb2FYTXViVzkxYzJVcE8xeHVJQ0FnSUNBZ2RHaHBjeTVmZUM1MWNHUmhkR1ZPYjNKdFlXd29JSFJvYVhNdWNHOXphWFJwYjI0dWVDNTJZV3gxWlNBcE8xeHVJQ0FnSUNBZ2RHaHBjeTVmZVM1MWNHUmhkR1ZPYjNKdFlXd29JSFJvYVhNdWNHOXphWFJwYjI0dWVTNTJZV3gxWlNBcE8xeHVJQ0FnSUNBZ2RHaHBjeTVsYldsMEtDZGphR0Z1WjJVbkxIdGNiaUFnSUNBZ0lDQWdlRG9nZEdocGN5NWZlQzUyWVd4MVpTeGNiaUFnSUNBZ0lDQWdlVG9nZEdocGN5NWZlUzUyWVd4MVpWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQjBhR2x6TG5KbGJtUmxjaWdwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGJHVmhjMlVvS1NCN1hHNGdJQ0FnZEdocGN5NXlaVzVrWlhJb0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQXFJRlJvWlNCcGJuUmxjbVpoWTJVbmN5QjRJSFpoYkhWbExpQlhhR1Z1SUhObGRDd2dhWFFnZDJsc2JDQmhkWFJ2YldGMGFXTmhiR3g1SUdGa2FuVnpkQ0IwYnlCbWFYUWdiV2x1TDIxaGVDOXpkR1Z3SUhObGRIUnBibWR6SUc5bUlIUm9aU0JwYm5SbGNtWmhZMlV1WEc0Z0lDb2dRSFI1Y0dVZ2UyOWlhbVZqZEgxY2JpQWdLaUJBWlhoaGJYQnNaU0J3YjNOcGRHbHZiaTU0SUQwZ01DNDFPMXh1SUNBcUwxeHVYRzRnSUdkbGRDQjRLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5NExuWmhiSFZsTzF4dUlDQjlYRzVjYmlBZ2MyVjBJSGdvZG1Gc2RXVXBJSHRjYmlBZ0lDQjBhR2x6TGw5NExuVndaR0YwWlNoMllXeDFaU2s3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSHRjYmlBZ0lDQWdJSGc2SUhSb2FYTXVYM2d1ZG1Gc2RXVXNYRzRnSUNBZ0lDQjVPaUIwYUdsekxsOTVMblpoYkhWbFhHNGdJQ0FnZlNrN1hHNGdJQ0FnZEdocGN5NXlaVzVrWlhJb0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQXFJRlJvWlNCcGJuUmxjbVpoWTJVbmN5QjVJSFpoYkhWbGN5NGdWMmhsYmlCelpYUXNJR2wwSUhkcGJHd2dZWFYwYjIxaGRHbGpZV3hzZVNCaFpHcDFjM1FnZEc4Z1ptbDBJRzFwYmk5dFlYZ3ZjM1JsY0NCelpYUjBhVzVuY3lCdlppQjBhR1VnYVc1MFpYSm1ZV05sTGx4dUlDQXFJRUIwZVhCbElIdHZZbXBsWTNSOVhHNGdJQ29nUUdWNFlXMXdiR1VnY0c5emFYUnBiMjR1ZUNBOUlEQXVOVHRjYmlBZ0tpOWNibHh1SUNCblpYUWdlU2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1ZmVTNTJZV3gxWlR0Y2JpQWdmVnh1WEc0Z0lITmxkQ0I1S0haaGJIVmxLU0I3WEc0Z0lDQWdkR2hwY3k1ZmVTNTFjR1JoZEdVb2RtRnNkV1VwTzF4dUlDQWdJSFJvYVhNdVpXMXBkQ2duWTJoaGJtZGxKeXg3WEc0Z0lDQWdJQ0I0T2lCMGFHbHpMbDk0TG5aaGJIVmxMRnh1SUNBZ0lDQWdlVG9nZEdocGN5NWZlUzUyWVd4MVpWeHVJQ0FnSUgwcE8xeHVJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDazdYRzRnSUgxY2JseHVYRzVjYmlBZ1oyVjBJRzV2Y20xaGJHbDZaV1FvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSHRjYmlBZ0lDQWdJSGc2SUhSb2FYTXVYM2d1Ym05eWJXRnNhWHBsWkN4Y2JpQWdJQ0FnSUhrNklIUm9hWE11WDNrdWJtOXliV0ZzYVhwbFpGeHVJQ0FnSUgwN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0tpQlVhR1VnYkc5M1pYSWdiR2x0YVhRZ2IyWWdkbUZzZFdVZ2IyNGdkR2hsSUhnZ1lYaHBjMXh1SUNBcUlFQjBlWEJsSUh0dlltcGxZM1I5WEc0Z0lDb3ZYRzRnSUdkbGRDQnRhVzVZS0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxsOTRMbTFwYmp0Y2JpQWdmVnh1WEc0Z0lITmxkQ0J0YVc1WUtIWXBJSHRjYmlBZ0lDQjBhR2x6TGw5NExtMXBiaUE5SUhZN1hHNGdJQ0FnZEdocGN5NXlaVzVrWlhJb0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQXFJRlJvWlNCc2IzZGxjaUJzYVcxcGRDQnZaaUIyWVd4MVpTQnZiaUIwYUdVZ2VTQmhlR2x6WEc0Z0lDb2dRSFI1Y0dVZ2UyOWlhbVZqZEgxY2JpQWdLaTljYmlBZ1oyVjBJRzFwYmxrb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVYM2t1YldsdU8xeHVJQ0I5WEc1Y2JpQWdjMlYwSUcxcGJsa29kaWtnZTF4dUlDQWdJSFJvYVhNdVgza3ViV2x1SUQwZ2RqdGNiaUFnSUNCMGFHbHpMbkpsYm1SbGNpZ3BPMXh1SUNCOVhHNWNibHh1SUNBdktpcGNiaUFnS2lCVWFHVWdkWEJ3WlhJZ2JHbHRhWFFnYjJZZ2RtRnNkV1VnYjI0Z2RHaGxJSGdnWVhocGMxeHVJQ0FxSUVCMGVYQmxJSHR2WW1wbFkzUjlYRzRnSUNvdlhHNGdJR2RsZENCdFlYaFlLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5NExtMWhlRHRjYmlBZ2ZWeHVYRzRnSUhObGRDQnRZWGhZS0hZcElIdGNiaUFnSUNCMGFHbHpMbDk0TG0xaGVDQTlJSFk3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdmVnh1WEc1Y2JpQWdMeW9xWEc0Z0lDb2dWR2hsSUhWd2NHVnlJR3hwYldsMElHOW1JSFpoYkhWbElHOXVJSFJvWlNCNUlHRjRhWE5jYmlBZ0tpQkFkSGx3WlNCN2IySnFaV04wZlZ4dUlDQXFMMXh1SUNCblpYUWdiV0Y0V1NncElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NWZlUzV0WVhnN1hHNGdJSDFjYmx4dUlDQnpaWFFnYldGNFdTaDJLU0I3WEc0Z0lDQWdkR2hwY3k1ZmVTNXRZWGdnUFNCMk8xeHVJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDazdYRzRnSUgxY2JseHVYRzRnSUM4cUtseHVJQ0FxSUZSb1pTQnBibU55WlcxbGJuUmhiQ0J6ZEdWd0lHOW1JSFpoYkhWbGN5QnZiaUIwYUdVZ2VDQmhlR2x6WEc0Z0lDb2dRSFI1Y0dVZ2UyOWlhbVZqZEgxY2JpQWdLaTljYmlBZ1oyVjBJSE4wWlhCWUtDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbDk0TG5OMFpYQTdYRzRnSUgxY2JseHVJQ0J6WlhRZ2MzUmxjRmdvZGlrZ2UxeHVJQ0FnSUhSb2FYTXVYM2d1YzNSbGNDQTlJSFk3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdmVnh1WEc1Y2JpQWdMeW9xWEc0Z0lDb2dWR2hsSUdsdVkzSmxiV1Z1ZEdGc0lITjBaWEFnYjJZZ2RtRnNkV1Z6SUc5dUlIUm9aU0I1SUdGNGFYTmNiaUFnS2lCQWRIbHdaU0I3YjJKcVpXTjBmVnh1SUNBcUwxeHVJQ0JuWlhRZ2MzUmxjRmtvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVgza3VjM1JsY0R0Y2JpQWdmVnh1WEc0Z0lITmxkQ0J6ZEdWd1dTaDJLU0I3WEc0Z0lDQWdkR2hwY3k1ZmVTNXpkR1Z3SUQwZ2RqdGNiaUFnSUNCMGFHbHpMbkpsYm1SbGNpZ3BPMXh1SUNCOVhHNWNibHh1SUNBdktpcGNiaUFnUVdKemIyeDFkR1VnYlc5a1pTQW9jRzl6YVhScGIyNG5jeUIyWVd4MVpTQnFkVzF3Y3lCMGJ5QnRiM1Z6WlNCamJHbGpheUJ3YjNOcGRHbHZiaWtnYjNJZ2NtVnNZWFJwZG1VZ2JXOWtaU0FvYlc5MWMyVWdaSEpoWnlCamFHRnVaMlZ6SUhaaGJIVmxJSEpsYkdGMGFYWmxJSFJ2SUdsMGN5QmpkWEp5Wlc1MElIQnZjMmwwYVc5dUtTNGdSR1ZtWVhWc2REb2dYQ0poWW5OdmJIVjBaVndpTGx4dUlDQkFkSGx3WlNCN2MzUnlhVzVuZlZ4dUlDQkFaWGhoYlhCc1pTQndiM05wZEdsdmJpNXRiMlJsSUQwZ1hDSnlaV3hoZEdsMlpWd2lPMXh1SUNBcUwxeHVJQ0JuWlhRZ2JXOWtaU2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1d2IzTnBkR2x2Ymk1NExtMXZaR1U3WEc0Z0lIMWNiaUFnYzJWMElHMXZaR1VvZGlrZ2UxeHVJQ0FnSUhSb2FYTXVjRzl6YVhScGIyNHVlQzV0YjJSbElEMGdkanRjYmlBZ0lDQjBhR2x6TG5CdmMybDBhVzl1TG5rdWJXOWtaU0E5SUhZN1hHNGdJSDFjYmx4dVhHNWNibHh1ZlZ4dVhHNWNibHh1THk4Z1YwVkNVRUZEU3lCR1QwOVVSVklnTHk5Y2JpOHZJQzR2Zmk5cWMyaHBiblF0Ykc5aFpHVnlJUzR2YkdsaUwybHVkR1Z5Wm1GalpYTXZjRzl6YVhScGIyNHVhbk1pTENJbmRYTmxJSE4wY21samRDYzdYRzVjYm14bGRDQnRZWFJvSUQwZ2NtVnhkV2x5WlNnbkxpNHZkWFJwYkM5dFlYUm9KeWs3WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUh0Y2JseHVJQ0JqY21WaGRHVTZJQ2gwZVhCbEtTQTlQaUI3WEc0Z0lDQWdjbVYwZFhKdUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblJPVXlnbmFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jbkxDQjBlWEJsS1R0Y2JpQWdmU3hjYmx4dUlDQmhjbU02SUNoNExDQjVMQ0J5WVdScGRYTXNJSE4wWVhKMFFXNW5iR1VzSUdWdVpFRnVaMnhsS1NBOVBpQjdYRzVjYmlBZ0lDQjJZWElnYzNSaGNuUWdQU0J0WVhSb0xuUnZRMkZ5ZEdWemFXRnVLSEpoWkdsMWN5d2daVzVrUVc1bmJHVXBPMXh1SUNBZ0lIWmhjaUJsYm1RZ1BTQnRZWFJvTG5SdlEyRnlkR1Z6YVdGdUtISmhaR2wxY3l3Z2MzUmhjblJCYm1kc1pTazdYRzVjYmlBZ0lDQjJZWElnYkdGeVoyVkJjbU5HYkdGbklEMGdaVzVrUVc1bmJHVWdMU0J6ZEdGeWRFRnVaMnhsSUR3OUlERTRNQ0EvSUNjd0p5QTZJQ2N4Snp0Y2JseHVJQ0FnSUhaaGNpQmtJRDBnVzF4dUlDQWdJQ0FnSUNBblRTY3NJSE4wWVhKMExuZ3JlQ3dnYzNSaGNuUXVlU3Q1TEZ4dUlDQWdJQ0FnSUNBblFTY3NJSEpoWkdsMWN5d2djbUZrYVhWekxDQXdMQ0JzWVhKblpVRnlZMFpzWVdjc0lEQXNJR1Z1WkM1NEszZ3NJR1Z1WkM1NUszbGNiaUFnSUNCZExtcHZhVzRvSnlBbktUdGNibHh1SUNBZ0lISmxkSFZ5YmlCa08xeHVJQ0I5TEZ4dVhHNGdJSEpoWkdsaGJFZHlZV1JwWlc1ME9pQW9aR1ZtY3l4dWRXMWlaWEpQWmxOMGIzQnpLU0E5UGlCN1hHNWNiaUFnSUNCc1pYUWdhV1FnUFNBblozSmhaR2xsYm5RbklDc2diV0YwYUM1eWFTZ3hNREF3TURBd01EQXdNREFwTzF4dUlDQWdJR3hsZENCemRHOXdjeUE5SUZ0ZE8xeHVYRzRnSUNBZ2JHVjBJR2R5WVdScFpXNTBJRDBnWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRFNVRLQ2RvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeWNzSUNkeVlXUnBZV3hIY21Ga2FXVnVkQ2NwTzF4dUlDQWdJR2R5WVdScFpXNTBMbk5sZEVGMGRISnBZblYwWlNnbmFXUW5MQ0JwWkNrN1hHNGdJQ0FnWjNKaFpHbGxiblF1YzJWMFFYUjBjbWxpZFhSbEtDZGplQ2NzSUNjMU1DVW5LVHRjYmlBZ0lDQm5jbUZrYVdWdWRDNXpaWFJCZEhSeWFXSjFkR1VvSjJONUp5d2dKelV3SlNjcE8xeHVJQ0FnSUdkeVlXUnBaVzUwTG5ObGRFRjBkSEpwWW5WMFpTZ25jaWNzSUNjMU1DVW5LVHRjYmx4dUlDQWdJR1JsWm5NdVlYQndaVzVrUTJocGJHUW9aM0poWkdsbGJuUXBPMXh1WEc0Z0lDQWdabTl5SUNoc1pYUWdhVDB3TzJrOGJuVnRZbVZ5VDJaVGRHOXdjenRwS3lzcElIdGNiaUFnSUNBZ0lHeGxkQ0J6ZEc5d0lEMGdaRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZEU1VEtDZG9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5Y3NJQ2R6ZEc5d0p5azdYRzRnSUNBZ0lDQnpkRzl3TG5ObGRFRjBkSEpwWW5WMFpTZ25hV1FuTENBbmMzUnZjQ2NyYVNrN1hHNGdJQ0FnSUNBdkwzTjBiM0F1YzJWMFFYUjBjbWxpZFhSbEtDZHZabVp6WlhRbkxDQW5OekFsSnlrN1hHNGdJQ0FnSUNBdkwzTjBiM0F1YzJWMFFYUjBjbWxpZFhSbEtDZHpkRzl3TFdOdmJHOXlKeXdnSjFkb2FYUmxKeWs3WEc0Z0lDQWdJQ0JuY21Ga2FXVnVkQzVoY0hCbGJtUkRhR2xzWkNoemRHOXdLVHRjYmlBZ0lDQWdJSE4wYjNCekxuQjFjMmdvYzNSdmNDazdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2NtVjBkWEp1SUh0Y2JpQWdJQ0FnSUdsa09pQnBaQ3hjYmlBZ0lDQWdJSE4wYjNCek9pQnpkRzl3Y3l4Y2JpQWdJQ0FnSUdWc1pXMWxiblE2SUdkeVlXUnBaVzUwWEc0Z0lDQWdmVHRjYmx4dUlDQjlYRzVjYm4wN1hHNWNibHh1WEc0dkx5QlhSVUpRUVVOTElFWlBUMVJGVWlBdkwxeHVMeThnTGk5K0wycHphR2x1ZEMxc2IyRmtaWEloTGk5c2FXSXZkWFJwYkM5emRtY3Vhbk1pTENJbmRYTmxJSE4wY21samRDYzdYRzVjYmk4cUtseHVJQ29nVEdsdGFYUWdZU0J1ZFcxaVpYSWdkRzhnZDJsMGFHbHVJR0VnYldsdWFXMTFiU0JoYm1RZ2JXRjRhVzExYlZ4dUlDb2dRSEJoY21GdElDQjdiblZ0WW1WeWZTQjJZV3gxWlNCSmJuQjFkQ0IyWVd4MVpWeHVJQ29nUUhCaGNtRnRJQ0I3Ym5WdFltVnlmU0J0YVc0Z0lDQk1iM2RsY2lCc2FXMXBkRnh1SUNvZ1FIQmhjbUZ0SUNCN2JuVnRZbVZ5ZlNCdFlYZ2dJQ0JWY0hCbGNpQnNhVzFwZEZ4dUlDb2dRSEpsZEhWeWJpQjdiblZ0WW1WeWZTQWdJQ0FnSUNCVWFHVWdhVzV3ZFhRZ2RtRnNkV1VnWTI5dWMzUnlZV2x1WldRZ2QybDBhR2x1SUhSb1pTQnNiM2RsY2lCaGJtUWdkWEJ3WlhJZ2JHbHRhWFJ6WEc0Z0tpQkFaWGhoYlhCc1pWeHVJQ29nVG1WNGRYTXVZMnhwY0NneE1Td3dMREV3S1NBZ0lDOHZJSEpsZEhWeWJuTWdNVEJjYmlBcUlFNWxlSFZ6TG1Oc2FYQW9MVEVzTUN3eE1Da2dJQ0F2THlCeVpYUjFjbTV6SURCY2JpQXFJRTVsZUhWekxtTnNhWEFvTlN3d0xERXdLU0FnSUNBdkx5QnlaWFIxY201eklEVmNiaUFxTDF4dVhHNWxlSEJ2Y25SekxtTnNhWEFnUFNBb2RtRnNkV1VzYldsdUxHMWhlQ2tnUFQ0Z2UxeHVJQ0J5WlhSMWNtNGdUV0YwYUM1dGFXNG9UV0YwYUM1dFlYZ29kbUZzZFdVc2JXbHVLU3h0WVhncE8xeHVmVHRjYmx4dVpYaHdiM0owY3k1dWIzSnRZV3hwZW1VZ1BTQW9kbUZzZFdVc2JXbHVMRzFoZUNrZ1BUNGdlMXh1SUNCeVpYUjFjbTRnS0NBb2RtRnNkV1V0YldsdUtTQXZJQ2h0WVhndGJXbHVLU0FwTzF4dWZUdGNibHh1THlvcVhHNGdLaUJUWTJGc1pTQmhJSFpoYkhWbElHWnliMjBnYjI1bElISmhibWRsSUhSdklHRnViM1JvWlhJZ2NtRnVaMlV1WEc0Z0tpQkFjR0Z5WVcwZ0lIdHVkVzFpWlhKOUlHbHVUblZ0SUNCSmJuQjFkQ0IyWVd4MVpWeHVJQ29nUUhCaGNtRnRJQ0I3Ym5WdFltVnlmU0JwYmsxcGJpQWdTVzV3ZFhRZ2NtRnVaMlVnYldsdWFXMTFiVnh1SUNvZ1FIQmhjbUZ0SUNCN2JuVnRZbVZ5ZlNCcGJrMWhlQ0FnU1c1d2RYUWdjbUZ1WjJVZ2JXRjRhVzExYlZ4dUlDb2dRSEJoY21GdElDQjdiblZ0WW1WeWZTQnZkWFJOYVc0Z1QzVjBjSFYwSUhKaGJtZGxJRzFwYm1sdGRXMWNiaUFxSUVCd1lYSmhiU0FnZTI1MWJXSmxjbjBnYjNWMFRXRjRJRTkxZEhCMWRDQnlZVzVuWlNCdFlYaHBiWFZ0WEc0Z0tpQkFjbVYwZFhKdUlIdHVkVzFpWlhKOUlDQWdJQ0FnSUNCVWFHVWdhVzV3ZFhRZ2RtRnNkV1VnYzJOaGJHVmtJSFJ2SUdsMGN5QnVaWGNnY21GdVoyVmNiaUFxSUVCbGVHRnRjR3hsWEc0Z0tpQk9aWGgxY3k1elkyRnNaU2d3TGpVc01Dd3hMREFzTVRBcElDQWdMeThnY21WMGRYSnVjeUExWEc0Z0tpQk9aWGgxY3k1elkyRnNaU2d3TGprc01Dd3hMREVzTUNrZ0lDQWdMeThnY21WMGRYSnVjeUF3TGpGY2JpQXFMMXh1Wlhod2IzSjBjeTV6WTJGc1pTQTlJQ2hwYms1MWJTd2dhVzVOYVc0c0lHbHVUV0Y0TENCdmRYUk5hVzRzSUc5MWRFMWhlQ2tnUFQ0Z2UxeHVJQ0JwWmlBb2FXNU5hVzRnUFQwOUlHbHVUV0Y0S1NCN1hHNGdJQ0FnY21WMGRYSnVJRzkxZEUxcGJqdGNiaUFnZlZ4dUlDQnlaWFIxY200Z0tDZ29hVzVPZFcwZ0xTQnBiazFwYmlrZ0tpQW9iM1YwVFdGNElDMGdiM1YwVFdsdUtTa2dMeUFvYVc1TllYZ2dMU0JwYmsxcGJpa3BJQ3NnYjNWMFRXbHVPMXh1ZlR0Y2JseHVaWGh3YjNKMGN5NTBiMUJ2YkdGeUlEMGdLSGdzZVNrZ1BUNGdlMXh1SUNCMllYSWdjaUE5SUUxaGRHZ3VjM0Z5ZENoNEtuZ2dLeUI1S25rcE8xeHVYRzRnSUhaaGNpQjBhR1YwWVNBOUlFMWhkR2d1WVhSaGJqSW9lU3g0S1R0Y2JpQWdhV1lnS0hSb1pYUmhJRHdnTUNrZ2UxeHVJQ0FnSUhSb1pYUmhJRDBnZEdobGRHRWdLeUFvTWlBcUlFMWhkR2d1VUVrcE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCN2NtRmthWFZ6T2lCeUxDQmhibWRzWlRvZ2RHaGxkR0Y5TzF4dWZUdGNibHh1Wlhod2IzSjBjeTUwYjBOaGNuUmxjMmxoYmlBOUlHWjFibU4wYVc5dUtISmhaR2wxY3l3Z1lXNW5iR1VwZTF4dUlDQjJZWElnWTI5eklEMGdUV0YwYUM1amIzTW9ZVzVuYkdVcE8xeHVJQ0IyWVhJZ2MybHVJRDBnVFdGMGFDNXphVzRvWVc1bmJHVXBPMXh1SUNCeVpYUjFjbTRnZTNnNklISmhaR2wxY3lwamIzTXNJSGs2SUhKaFpHbDFjeXB6YVc0cUxURjlPMXh1ZlR0Y2JpOHFYRzVsZUhCdmNuUnpMbkJ2YkdGeVZHOURZWEowWlhOcFlXNG9ZMlZ1ZEdWeVdDd2dZMlZ1ZEdWeVdTd2djbUZrYVhWekxDQmhibWRzWlVsdVJHVm5jbVZsY3lrZ2UxeHVJQ0IyWVhJZ1lXNW5iR1ZKYmxKaFpHbGhibk1nUFNBb1lXNW5iR1ZKYmtSbFozSmxaWE10T1RBcElDb2dUV0YwYUM1UVNTQXZJREU0TUM0d08xeHVYRzRnSUhKbGRIVnliaUI3WEc0Z0lDQWdlRG9nWTJWdWRHVnlXQ0FySUNoeVlXUnBkWE1nS2lCTllYUm9MbU52Y3loaGJtZHNaVWx1VW1Ga2FXRnVjeWtwTEZ4dUlDQWdJSGs2SUdObGJuUmxjbGtnS3lBb2NtRmthWFZ6SUNvZ1RXRjBhQzV6YVc0b1lXNW5iR1ZKYmxKaFpHbGhibk1wS1Z4dUlDQjlPMXh1ZlNBZ0tpOWNibHh1WEc1Y2JtVjRjRzl5ZEhNdWNISjFibVVnUFNCbWRXNWpkR2x2Ymloa1lYUmhMQ0J6WTJGc1pTa2dlMXh1SUNCeVpYUjFjbTRnY0dGeWMyVkdiRzloZENoa1lYUmhMblJ2Um1sNFpXUW9jMk5oYkdVcEtUdGNibjA3WEc1Y2JtVjRjRzl5ZEhNdWFXNTJaWEowSUQwZ1puVnVZM1JwYjI0Z0tHbHVUblZ0S1NCN1hHNGdJSEpsZEhWeWJpQmxlSEJ2Y25SekxuTmpZV3hsS0dsdVRuVnRMQ0F4TENBd0xDQXdMQ0F4S1R0Y2JuMDdYRzVjYmk4cUtseHVJQ29nUTI5dWRtVnlkQ0JoSUUxSlJHa2dibTkwWlNCdWRXMWlaWElnZEc4Z1lTQm1jbVZ4ZFdWdVkza2dkbUZzZFdVZ2FXNGdaWEYxWVd3Z2RHVnRjR1Z5WVcxbGJuUXVYRzRnS2lCQWNHRnlZVzBnSUh0dWRXMWlaWEo5SUcxcFpHa2dUVWxFU1NCdWIzUmxJSFpoYkhWbFhHNGdLaUJBY21WMGRYSnVJSHR1ZFcxaVpYSjlJQ0FnSUNBZ1JuSmxjWFZsYm1ObElIWmhiSFZsWEc0Z0tpQkFaWGhoYlhCc1pWeHVJQ29nVG1WNGRYTXViWFJ2WmlnMk1Da2dJQzh2SUhKbGRIVnlibk1nZEdobElHWnlaWEYxWlc1amVTQnVkVzFpWlhJZ2IyWWdUV2xrWkd4bElFTmNiaUFxTDF4dVpYaHdiM0owY3k1dGRHOW1JRDBnWm5WdVkzUnBiMjRvYldsa2FTa2dlMXh1SUNCeVpYUjFjbTRnVFdGMGFDNXdiM2NvTWl3Z0tDaHRhV1JwTFRZNUtTOHhNaWtwSUNvZ05EUXdPMXh1ZlR0Y2JseHVMeW9xWEc0Z0tpQkpiblJsY25CdmJHRjBaU0JpWlhSM1pXVnVJSFIzYnlCdWRXMWlaWEp6WEc0Z0tpQkFjR0Z5WVcwZ0lIdHVkVzFpWlhKOUlHeHZZeUJKYm5SbGNuQnZiR0YwYVc5dUlHbHVaR1Y0SUNnd0xURXBYRzRnS2lCQWNHRnlZVzBnSUh0dWRXMWlaWEo5SUcxcGJpQk1iM2RsY2lCMllXeDFaVnh1SUNvZ1FIQmhjbUZ0SUNCN2JuVnRZbVZ5ZlNCdFlYZ2dWWEJ3WlhJZ2RtRnNkV1ZjYmlBcUlFQnlaWFIxY200Z2UyNTFiV0psY24wZ0lDQWdJRWx1ZEdWeWNHOXNZWFJsWkNCMllXeDFaVnh1SUNvZ1FHVjRZVzF3YkdWY2JpQXFJRTVsZUhWekxtbHVkR1Z5Y0Nnd0xqVXNNaXcwS1NBZ0lDOHZJSEpsZEhWeWJuTWdNMXh1SUNvZ1RtVjRkWE11YVc1MFpYSndLREF1TVN3d0xERXdLU0FnSUNBZ0x5OGdjbVYwZFhKdWN5QXhYRzRnS2k5Y2JtVjRjRzl5ZEhNdWFXNTBaWEp3SUQwZ1puVnVZM1JwYjI0b2JHOWpMRzFwYml4dFlYZ3BJSHRjYmlBZ2NtVjBkWEp1SUd4dll5QXFJQ2h0WVhnZ0xTQnRhVzRwSUNzZ2JXbHVPMXh1ZlR0Y2JseHVMeW9xWEc0Z0tpQlNaWFIxY200Z1lTQnlZVzVrYjIwZ1kyaHZhV05sSUdaeWIyMGdZU0JzYVhOMElHOW1JR0Z5WjNWdFpXNTBjMXh1SUNvZ1FISmxkSFZ5YmlCN2RtRnlhVzkxYzMwZ1QyNWxJSEpoYm1SdmJTQmhjbWQxYldWdWRGeHVJQ29nUUdWNFlXMXdiR1ZjYmlBcUlFNWxlSFZ6TG5CcFkyc29NU3d5TERNc05Da2dJQ0F2THlCeVpYUjFjbTV6SURFc0lESXNJRE1zSUc5eUlEUmNiaUFxSUU1bGVIVnpMbkJwWTJzb1puVnVZM1JwYjI0eExHWjFibU4wYVc5dU1pa2dJQ0F2THlCeVpYUjFjbTV6SUdWcGRHaGxjaUJtZFc1amRHbHZiakVnYjNJZ1puVnVZM1JwYjI0eVhHNGdLaTljYm1WNGNHOXlkSE11Y0dsamF5QTlJR1oxYm1OMGFXOXVLQ2tnZTF4dUlDQnlaWFIxY200Z1lYSm5kVzFsYm5SelczNStLRTFoZEdndWNtRnVaRzl0S0NrcVlYSm5kVzFsYm5SekxteGxibWQwYUNsZE8xeHVmVHRjYmx4dUx5b3FYRzRnS2lCU1pYUjFjbTV6SUdGdUlHOWpkR0YyWlNCdGRXeDBhWEJzYVdWeUlHWnZjaUJtY21WeGRXVnVZM2tnZG1Gc2RXVnpYRzRnS2lCQWNHRnlZVzBnSUh0dWRXMWlaWEo5SUc1MWJTQlNaV3hoZEdsMlpTQnZZM1JoZG1VZ2JuVnRZbVZ5SUNobExtY3VJQzB4SUdadmNpQnZibVVnYjJOMFlYWmxJR1J2ZDI0c0lERWdabTl5SUc5dVpTQnZZM1JoZG1VZ2RYQXBYRzRnS2lCQWNtVjBkWEp1SUh0dWRXMWlaWEo5SUNBZ0lDQlBZM1JoZG1VZ2JYVnNkR2x3YkdsbGNseHVJQ29nUUdWNFlXMXdiR1ZjYmlBcUlFNWxlSFZ6TG05amRHRjJaU2d0TVNrZ0lDOHZJSEpsZEhWeWJuTWdNQzQxWEc0Z0tpQk9aWGgxY3k1dlkzUmhkbVVvTUNrZ0lDQXZMeUJ5WlhSMWNtNXpJREZjYmlBcUlFNWxlSFZ6TG05amRHRjJaU2d4S1NBZ0lDOHZJSEpsZEhWeWJuTWdNbHh1SUNvZ1RtVjRkWE11YjJOMFlYWmxLRElwSUNBZ0x5OGdjbVYwZFhKdWN5QTBYRzRnS2k5Y2JtVjRjRzl5ZEhNdWIyTjBZWFpsSUQwZ1puVnVZM1JwYjI0b2JuVnRLU0I3WEc0Z0lISmxkSFZ5YmlCTllYUm9MbkJ2ZHlneUxHNTFiU2s3WEc1OU8xeHVYRzR2S2lwY2JpQXFJRkpoYm1SdmJTQnBiblJsWjJWeUlHZGxibVZ5WVhSdmNpNGdTV1lnYm04Z2MyVmpiMjVrSUdGeVozVnRaVzUwSUdseklHZHBkbVZ1TENCM2FXeHNJSEpsZEhWeWJpQnlZVzVrYjIwZ2FXNTBaV2RsY2lCbWNtOXRJREFnZEc4Z1ltOTFibVF4TGx4dUlDb2dRSEJoY21GdElDQjdiblZ0WW1WeWZTQmliM1Z1WkRFZ1RXbHVhVzExYlNCeVlXNWtiMjBnZG1Gc2RXVmNiaUFxSUVCd1lYSmhiU0FnZTI1MWJXSmxjbjBnWW05MWJtUXlJRTFoZUdsdGRXMGdjbUZ1Wkc5dElIWmhiSFZsWEc0Z0tpQkFjbVYwZFhKdUlIdHVkVzFpWlhKOUlDQWdJQ0FnSUNCU1lXNWtiMjBnYVc1MFpXZGxjaUJpWlhSM1pXVnVJR3h2ZDJWeUlHRnVaQ0IxY0hCbGNpQmliM1Z1WkdGeWVWeHVJQ29nUUdWNFlXMXdiR1ZjYmlBcUlFNWxlSFZ6TG5KcEtERXdLU0FnSUNBdkx5QnlaWFIxY201eklISmhibVJ2YlNCcGJuUWdabkp2YlNBd0lIUnZJREV3WEc0Z0tpQk9aWGgxY3k1eWFTZ3lNQ3d5TURBd0tTQXZMeUJ5WlhSMWNtNXpJSEpoYm1SdmJTQnBiblFnWm5KdmJTQXlNQ0IwYnlBeU1EQXdYRzRnS2k5Y2JtVjRjRzl5ZEhNdWNta2dQU0JtZFc1amRHbHZiaWhpYjNWdVpERXNZbTkxYm1ReUtTQjdYRzRnSUdsbUlDZ2hZbTkxYm1ReUtTQjdYRzRnSUNBZ1ltOTFibVF5SUQwZ1ltOTFibVF4TzF4dUlDQWdJR0p2ZFc1a01TQTlJREE3WEc0Z0lIMWNiaUFnZG1GeUlHeHZkeUE5SUUxaGRHZ3ViV2x1S0dKdmRXNWtNU3hpYjNWdVpESXBPMXh1SUNCMllYSWdhR2xuYUNBOUlFMWhkR2d1YldGNEtHSnZkVzVrTVN4aWIzVnVaRElwTzF4dUlDQnlaWFIxY200Z1RXRjBhQzVtYkc5dmNpaE5ZWFJvTG5KaGJtUnZiU2dwS2lob2FXZG9MV3h2ZHlrcmJHOTNLVHRjYm4wN1hHNWNiaThxS2x4dUlDb2dVbUZ1Wkc5dElHWnNiMkYwSUc1MWJXSmxjaUJuWlc1bGNtRjBiM0l1SUVsbUlHNXZJSE5sWTI5dVpDQmhjbWQxYldWdWRDQnBjeUJuYVhabGJpd2dkMmxzYkNCeVpYUjFjbTRnY21GdVpHOXRJR1pzYjJGMElHWnliMjBnTUNCMGJ5QmliM1Z1WkRFdVhHNGdLaUJBY0dGeVlXMGdJSHR1ZFcxaVpYSjlJR0p2ZFc1a01TQk5hVzVwYlhWdElISmhibVJ2YlNCMllXeDFaVnh1SUNvZ1FIQmhjbUZ0SUNCN2JuVnRZbVZ5ZlNCaWIzVnVaRElnVFdGNGFXMTFiU0J5WVc1a2IyMGdkbUZzZFdWY2JpQXFJRUJ5WlhSMWNtNGdlMjUxYldKbGNuMGdJQ0FnSUNBZ0lGSmhibVJ2YlNCbWJHOWhkQ0JpWlhSM1pXVnVJR3h2ZDJWeUlHRnVaQ0IxY0hCbGNpQmliM1Z1WkdGeWVWeHVJQ29nUUdWNFlXMXdiR1ZjYmlBcUlFNWxlSFZ6TG5KbUtERXBJQ0FnSUM4dklISmxkSFZ5Ym5NZ2NtRnVaRzl0SUdac2IyRjBJR1p5YjIwZ01DQjBieUF4WEc0Z0tpQk9aWGgxY3k1eVppZ3hMRElwSUM4dklISmxkSFZ5Ym5NZ2NtRnVaRzl0SUdac2IyRjBJR1p5YjIwZ01TQjBieUF5WEc0Z0tpOWNibVY0Y0c5eWRITXVjbVlnUFNCbWRXNWpkR2x2YmloaWIzVnVaREVzWW05MWJtUXlLU0I3WEc0Z0lHbG1JQ2doWW05MWJtUXlLU0I3WEc0Z0lDQWdZbTkxYm1ReUlEMGdZbTkxYm1ReE8xeHVJQ0FnSUdKdmRXNWtNU0E5SURBN1hHNGdJSDFjYmlBZ2RtRnlJR3h2ZHlBOUlFMWhkR2d1YldsdUtHSnZkVzVrTVN4aWIzVnVaRElwTzF4dUlDQjJZWElnYUdsbmFDQTlJRTFoZEdndWJXRjRLR0p2ZFc1a01TeGliM1Z1WkRJcE8xeHVJQ0J5WlhSMWNtNGdUV0YwYUM1eVlXNWtiMjBvS1Nvb2FHbG5hQzFzYjNjcEsyeHZkenRjYm4wN1hHNWNibHh1Wlhod2IzSjBjeTVqZVdOc1pTQTlJR1oxYm1OMGFXOXVLR2x1Y0hWMExHMXBiaXh0WVhncElIdGNiaUFnYVc1d2RYUXJLenRjYmlBZ2FXWWdLR2x1Y0hWMElENDlJRzFoZUNrZ2UxeHVJQ0FnSUdsdWNIVjBJRDBnYldsdU8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCcGJuQjFkRHRjYm4wN1hHNWNiaThxS2x4dUlDb2dRWFpsY21GblpTQmhiaUJoY25KaGVTQnZaaUJ1ZFcxaVpYSnpYRzRnS2lCQWNHRnlZVzBnSUh0QmNuSmhlWDBnWkdGMFlTQkJjbkpoZVNCdlppQnVkVzFpWlhKeklIUnZJR0YyWlhKaFoyVmNiaUFxSUVCeVpYUjFjbTRnZTI1MWJXSmxjbjBnSUNBZ0lDQkJkbVZ5WVdkbElHOW1JSFJvWlNCcGJuQjFkQ0JrWVhSaFhHNGdLaUJBWlhoaGJYQnNaVnh1SUNvZ1RtVjRkWE11WVhabGNtRm5aU2hiTUN3eUxEUXNOaXc0TERFd1hTa2dJQ0F2THlCeVpYUjFjbTV6SURWY2JpQXFMMXh1Wlhod2IzSjBjeTVoZG1WeVlXZGxJRDBnWm5WdVkzUnBiMjRvWkdGMFlTa2dlMXh1SUNCc1pYUWdkRzkwWVd3Z1BTQXdPMXh1SUNCbWIzSWdLSFpoY2lCcFBUQTdhVHhrWVhSaExteGxibWQwYUR0cEt5c3BJSHRjYmlBZ0lDQjBiM1JoYkNBclBTQmtZWFJoVzJsZE8xeHVJQ0I5WEc0Z0lISmxkSFZ5YmlCMGIzUmhiQ0F2SUdSaGRHRXViR1Z1WjNSb08xeHVmVHRjYmx4dUx5b3FYRzRnS2lCSFpYUWdkR2hsSUdScGMzUmhibU5sSUdaeWIyMGdiMjVsSUNoNExIa3BJSEJ2YVc1MElIUnZJR0Z1YjNSb1pYSWdLSGdzZVNrZ2NHOXBiblJjYmlBcUlFQndZWEpoYlNBZ2UyNTFiV0psY24wZ2VERWdlQ0J2WmlCbWFYSnpkQ0J3YjJsdWRGeHVJQ29nUUhCaGNtRnRJQ0I3Ym5WdFltVnlmU0I1TVNCNUlHOW1JR1pwY25OMElIQnZhVzUwWEc0Z0tpQkFjR0Z5WVcwZ0lIdHVkVzFpWlhKOUlIZ3lJSGdnYjJZZ2MyVmpiMjVrSUhCdmFXNTBYRzRnS2lCQWNHRnlZVzBnSUh0dWRXMWlaWEo5SUhreUlIa2diMllnYzJWamIyNWtJSEJ2YVc1NVhHNGdLaUJBY21WMGRYSnVJSHR1ZFcxaVpYSjlJQ0FnSUVScGMzUmhibU5sWEc0Z0tpQkFaWGhoYlhCc1pWeHVJQ29nVG1WNGRYTXVaR2x6ZEdGdVkyVW9NQ3d3TERNc05Da2dJQ0F2THlCeVpYUjFjbTV6SURWY2JpQXFMMXh1Wlhod2IzSjBjeTVrYVhOMFlXNWpaU0E5SUdaMWJtTjBhVzl1S0hneExIa3hMSGd5TEhreUtTQjdYRzRnSUd4bGRDQmhJRDBnZURFZ0xTQjRNanRjYmlBZ2JHVjBJR0lnUFNCNU1TQXRJSGt5TzF4dUlDQnlaWFIxY200Z1RXRjBhQzV6Y1hKMEtDQmhLbUVnS3lCaUttSWdLVHRjYm4wN1hHNWNibVY0Y0c5eWRITXVaMkZwYmxSdlJFSWdQU0JtZFc1amRHbHZiaWhuWVdsdUtTQjdYRzRnSUhKbGRIVnliaUF5TUNBcUlFMWhkR2d1Ykc5bk1UQW9aMkZwYmlrN1hHNTlPMXh1WEc0dktpcGNiaUFxSUVac2FYQWdZU0JqYjJsdUxDQnlaWFIxY201cGJtY2daV2wwYUdWeUlEQWdiM0lnTVNCaFkyTnZjbVJwYm1jZ2RHOGdZU0J3Y205aVlXSnBiR2wwZVZ4dUlDb2dRSEJoY21GdElDQjdiblZ0WW1WeWZTQmJiMlJrY3owd0xqVmRJRXhwYTJWc2FXaHZiMlFnYjJZZ2NtVjBkWEp1YVc1bklERmNiaUFxSUVCeVpYUjFjbTRnZTI1MWJXSmxjbjBnSUNBZ0lDQWdJQ0FnSUNBeElHOXlJREJjYmlBcUlFQmxlR0Z0Y0d4bFhHNGdLaUJPWlhoMWN5NWpiMmx1S0RBdU1Ta2dJQ0F2THlCeVpYUjFjbTV6SURFZ0tERXdKU0J2WmlCMGFHVWdkR2x0WlNrZ2IzSWdNQ0FvT1RBbElHOW1JSFJvWlNCMGFXMWxLVnh1SUNvdlhHNWxlSEJ2Y25SekxtTnZhVzRnUFNCbWRXNWpkR2x2YmlodlpHUnpQVEF1TlNrZ2UxeHVJQ0JwWmlBb1pYaHdiM0owY3k1eVppZ3dMREVwSUR3Z2IyUmtjeWtnZTF4dUlDQWdJSEpsZEhWeWJpQXhPMXh1SUNCOUlHVnNjMlVnZTF4dUlDQWdJSEpsZEhWeWJpQXdPMXh1SUNCOVhHNTlPMXh1WEc1Y2JseHVMeThnVjBWQ1VFRkRTeUJHVDA5VVJWSWdMeTljYmk4dklDNHZmaTlxYzJocGJuUXRiRzloWkdWeUlTNHZiR2xpTDNWMGFXd3ZiV0YwYUM1cWN5SXNJaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHViR1YwSUhOMlp5QTlJSEpsY1hWcGNtVW9KeTR1TDNWMGFXd3ZjM1puSnlrN1hHNXNaWFFnWkc5dElEMGdjbVZ4ZFdseVpTZ25MaTR2ZFhScGJDOWtiMjBuS1R0Y2JteGxkQ0IxZEdsc0lEMGdjbVZ4ZFdseVpTZ25MaTR2ZFhScGJDOTFkR2xzSnlrN1hHNXNaWFFnZEc5MVkyZ2dQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNMM1J2ZFdOb0p5azdYRzVqYjI1emRDQkZkbVZ1ZEVWdGFYUjBaWElnUFNCeVpYRjFhWEpsS0NkbGRtVnVkSE1uS1R0Y2JseHVhVzF3YjNKMElIc2dZMjlzYjNKeklIMGdabkp2YlNBbkxpNHZiV0ZwYmljN1hHNWNiaThxS2x4dVNXNTBaWEptWVdObFhHNHFMMXh1Wlhod2IzSjBJR1JsWm1GMWJIUWdZMnhoYzNNZ1NXNTBaWEptWVdObElHVjRkR1Z1WkhNZ1JYWmxiblJGYldsMGRHVnlJSHRjYmx4dUlDQmpiMjV6ZEhKMVkzUnZjaWhoY21kekxHOXdkR2x2Ym5Nc1pHVm1ZWFZzZEhNcElIdGNiaUFnSUNCemRYQmxjaWdwTzF4dUlDQWdJSFJvYVhNdWRIbHdaU0E5SUhSb2FYTXVZMjl1YzNSeWRXTjBiM0l1Ym1GdFpUdGNiaUFnSUNCMGFHbHpMbk5sZEhScGJtZHpJRDBnZEdocGN5NXdZWEp6WlZObGRIUnBibWR6S0dGeVozTXNiM0IwYVc5dWN5eGtaV1poZFd4MGN5azdYRzRnSUNBZ2RHaHBjeTV0YjNWelpTQTlJSHQ5TzF4dUlDQWdJSFJvYVhNdWQyRnBkQ0E5SUdaaGJITmxPMXh1SUNBZ0lIUm9hWE11WTI5c2IzSnpJRDBnZTMwN1hHNGdJQ0FnYkdWMElHUmxabUYxYkhSRGIyeHZjbk1nUFNCamIyeHZjbk1vS1RzZ0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYRzRnSUNBZ2RHaHBjeTVqYjJ4dmNuTXVZV05qWlc1MElEMGdaR1ZtWVhWc2RFTnZiRzl5Y3k1aFkyTmxiblE3WEc0Z0lDQWdkR2hwY3k1amIyeHZjbk11Wm1sc2JDQTlJR1JsWm1GMWJIUkRiMnh2Y25NdVptbHNiRHRjYmlBZ0lDQjBhR2x6TG1OdmJHOXljeTVzYVdkb2RDQTlJR1JsWm1GMWJIUkRiMnh2Y25NdWJHbG5hSFE3WEc0Z0lDQWdkR2hwY3k1amIyeHZjbk11WkdGeWF5QTlJR1JsWm1GMWJIUkRiMnh2Y25NdVpHRnlhenRjYmlBZ0lDQjBhR2x6TG1OdmJHOXljeTV0WldScGRXMU1hV2RvZENBOUlHUmxabUYxYkhSRGIyeHZjbk11YldWa2FYVnRUR2xuYUhRN1hHNGdJQ0FnZEdocGN5NWpiMnh2Y25NdWJXVmthWFZ0UkdGeWF5QTlJR1JsWm1GMWJIUkRiMnh2Y25NdWJXVmthWFZ0UkdGeWF6dGNiaUFnZlZ4dVhHNGdJSEJoY25ObFUyVjBkR2x1WjNNb1lYSm5jeXh2Y0hScGIyNXpMR1JsWm1GMWJIUnpLU0I3WEc1Y2JpQWdJQ0J2Y0hScGIyNXpMblZ1YzJocFpuUW9KM1JoY21kbGRDY3BPMXh1SUNBZ0lHUmxabUYxYkhSekxtUmxabUYxYkhSVGFYcGxJRDBnWkdWbVlYVnNkSE11YzJsNlpTNXpjR3hwWTJVb01Dd3lLVHRjYmlBZ0lDQmtaV1poZFd4MGN5NXphWHBsSUQwZ1ptRnNjMlU3WEc1Y2JpQWdJQ0JzWlhRZ2MyVjBkR2x1WjNNZ1BTQjdYRzRnSUNBZ0lDQW5kR0Z5WjJWMEp6b2daRzlqZFcxbGJuUXVZbTlrZVN4Y2JpQWdJQ0FnSUNkamIyeHZjbk1uT2lCN2ZTd2dMeThnYzJodmRXeGtJR2x1YUdWeWFYUWdabkp2YlNCaElHTnZiRzl5Y3lCdGIyUjFiR1VzWEc0Z0lDQWdJQ0FuYzI1aGNGZHBkR2hRWVhKbGJuUW5PaUIwY25WbExGeHVJQ0FnSUNBZ0oyVjJaVzUwSnpvZ1puVnVZM1JwYjI0b0tTQjdmU3hjYmlBZ0lDQWdJQ2RqYjIxd2IyNWxiblFuT2lCbVlXeHpaVnh1SUNBZ0lIMDdYRzVjYmlBZ0lDQm1iM0lnS0d4bGRDQnJaWGtnYVc0Z1pHVm1ZWFZzZEhNcElIdGNiaUFnSUNBZ0lITmxkSFJwYm1kelcydGxlVjBnUFNCa1pXWmhkV3gwYzF0clpYbGRPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWnZjaUFvYkdWMElHazlNRHNnYVR4aGNtZHpMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNBdkx5Qm5jbUZpY3lCMGFHVWdibVY0ZENCaGNtZDFiV1Z1ZEZ4dUlDQWdJQ0FnYkdWMElITmxkSFJwYm1jZ1BTQmhjbWR6VzJsZE8xeHVJQ0FnSUNBZ0x5OGdhV1lnYVhRbmN5QmhiaUJ2WW1wbFkzUXNJR2wwSUcxMWMzUWdZbVVnZEdobElITmxkSFJwYm1keklHOWlhbVZqZEZ4dUlDQWdJQ0FnYVdZZ0tDQjFkR2xzTG1selQySnFaV04wS0hObGRIUnBibWNwSUNrZ2UxeHVJQ0FnSUNBZ0lDQm1iM0lnS0NCc1pYUWdhMlY1SUdsdUlITmxkSFJwYm1jZ0tTQjdYRzRnSUNBZ0lDQWdJQ0FnYzJWMGRHbHVaM05iYTJWNVhTQTlJSE5sZEhScGJtZGJhMlY1WFR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0x5OGdhV1lnYVhRbmN5QmhJR1oxYm1OMGFXOXVMQ0JwZENCdGRYTjBJR0psSUhSb1pTQmxkbVZ1ZENCelpYUjBhVzVuWEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hSNWNHVnZaaUJ6WlhSMGFXNW5JRDA5UFNBblpuVnVZM1JwYjI0bktTQjdYRzRnSUNBZ0lDQWdJSE5sZEhScGJtZHpMbVYyWlc1MElEMGdjMlYwZEdsdVp6dGNiaUFnSUNBZ0lDOHZJRzkwYUdWeWQybHpaU3dnWTI5dWMybGtaWElnYVhRZ2IyNWxJRzltSUhSb1pTQjNhV1JuWlhRbmN5QmpkWE4wYjIwZ2IzQjBhVzl1YzF4dUlDQWdJQ0FnZlNCbGJITmxJR2xtSUNodmNIUnBiMjV6TG14bGJtZDBhRDQ5TVNrZ2UxeHVJQ0FnSUNBZ0lDQXZMeUJuY21GaUlIUm9aU0JtYVhKemRDQnZjSFJwYjI0Z0xTMGdhUzVsTGlBbmRHRnlaMlYwSjF4dUlDQWdJQ0FnSUNCc1pYUWdhMlY1SUQwZ2IzQjBhVzl1Y3k1emNHeHBZMlVvTUN3eEtWc3dYVHRjYmlBZ0lDQWdJQ0FnYzJWMGRHbHVaM05iYTJWNVhTQTlJSE5sZEhScGJtYzdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ0x5b2dJR2hoYm1Sc1pTQmpiMjF0YjI0Z2MyVjBkR2x1WjNNZ0lDb3ZYRzVjYmlBZ0lDQXZMeUIwWVhKblpYUmNiaUFnSUNCMGFHbHpMbkJoY21WdWRDQTlJR1J2YlM1d1lYSnpaVVZzWlcxbGJuUW9jMlYwZEdsdVozTXVkR0Z5WjJWMEtUdGNibHh1SUNBZ0lDOHZJRzVsZUhWekxYVnBJR0YwZEhKcFluVjBaVnh1SUNBZ0lHbG1JQ2gwYUdsekxuQmhjbVZ1ZENBbUppQjBhR2x6TG5CaGNtVnVkQ0JwYm5OMFlXNWpaVzltSUVoVVRVeEZiR1Z0Wlc1MElDWW1JQ0Z6WlhSMGFXNW5jeTVqYjIxd2IyNWxiblFwSUh0Y2JpQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1d1lYSmxiblF1YUdGelFYUjBjbWxpZFhSbEtDZHVaWGgxY3kxMWFTY3BLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjR0Z5Wlc1MExuTmxkRUYwZEhKcFluVjBaU2duYm1WNGRYTXRkV2tuTENjbktUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNBdkx5QnphWHBsWEc1Y2JpQWdJQ0JwWmlBb2MyVjBkR2x1WjNNdWMybDZaU0FtSmlCQmNuSmhlUzVwYzBGeWNtRjVLSE5sZEhScGJtZHpMbk5wZW1VcElDWW1JSE5sZEhScGJtZHpMbk51WVhCWGFYUm9VR0Z5Wlc1MEtTQjdYRzRnSUNBZ0lDQjBhR2x6TG5kcFpIUm9JRDBnYzJWMGRHbHVaM011YzJsNlpWc3dYVHRjYmlBZ0lDQWdJSFJvYVhNdWFHVnBaMmgwSUQwZ2MyVjBkR2x1WjNNdWMybDZaVnN4WFR0Y2JpQWdJQ0FnSUhSb2FYTXVjR0Z5Wlc1MExuTjBlV3hsTG5kcFpIUm9JRDBnZEdocGN5NTNhV1IwYUNBcklDZHdlQ2M3WEc0Z0lDQWdJQ0IwYUdsekxuQmhjbVZ1ZEM1emRIbHNaUzVvWldsbmFIUWdQU0IwYUdsekxtaGxhV2RvZENBcklDZHdlQ2M3WEc0Z0lDQWdmU0JsYkhObElHbG1JQ2h6WlhSMGFXNW5jeTV6Ym1Gd1YybDBhRkJoY21WdWRDQW1KaUFoYzJWMGRHbHVaM011WTI5dGNHOXVaVzUwS1NCN1hHNWNiaUFnSUNBZ0lIUm9hWE11ZDJsa2RHZ2dQU0J3WVhKelpVWnNiMkYwS0hkcGJtUnZkeTVuWlhSRGIyMXdkWFJsWkZOMGVXeGxLSFJvYVhNdWNHRnlaVzUwTENCdWRXeHNLUzVuWlhSUWNtOXdaWEowZVZaaGJIVmxLQ2QzYVdSMGFDY3BMbkpsY0d4aFkyVW9KM0I0Snl3bkp5a3BPMXh1SUNBZ0lDQWdkR2hwY3k1b1pXbG5hSFFnUFNCd1lYSnpaVVpzYjJGMEtIZHBibVJ2ZHk1blpYUkRiMjF3ZFhSbFpGTjBlV3hsS0hSb2FYTXVjR0Z5Wlc1MExDQnVkV3hzS1M1blpYUlFjbTl3WlhKMGVWWmhiSFZsS0Nkb1pXbG5hSFFuS1M1eVpYQnNZV05sS0Nkd2VDY3NKeWNwS1R0Y2JseHVJQ0FnSUNBZ2FXWWdLSFJvYVhNdWQybGtkR2c5UFRVd01EQXBJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTNhV1IwYUNBOUlITmxkSFJwYm1kekxtUmxabUYxYkhSVGFYcGxXekJkTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbkJoY21WdWRDNXpkSGxzWlM1M2FXUjBhQ0E5SUhSb2FYTXVjR0Z5Wlc1MExuZHBaSFJvSUQwZ2RHaHBjeTUzYVdSMGFDQXJJQ2R3ZUNjN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCcFppQW9kR2hwY3k1b1pXbG5hSFE5UFRVd01EQXBJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NW9aV2xuYUhRZ1BTQnpaWFIwYVc1bmN5NWtaV1poZFd4MFUybDZaVnN4WFR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV3WVhKbGJuUXVjM1I1YkdVdWFHVnBaMmgwSUQwZ2RHaHBjeTV3WVhKbGJuUXVhR1ZwWjJoMElEMGdkR2hwY3k1b1pXbG5hSFFnS3lBbmNIZ25PMXh1SUNBZ0lDQWdmVnh1WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lITmxkSFJwYm1kekxuTnBlbVVnUFNCelpYUjBhVzVuY3k1a1pXWmhkV3gwVTJsNlpUdGNiaUFnSUNBZ0lIUm9hWE11ZDJsa2RHZ2dQU0J6WlhSMGFXNW5jeTV6YVhwbFd6QmRPMXh1SUNBZ0lDQWdkR2hwY3k1b1pXbG5hSFFnUFNCelpYUjBhVzVuY3k1emFYcGxXekZkTzF4dUlDQWdJSDFjYmx4dUlDQWdJQzh2SUdWMlpXNTBYRzRnSUNBZ2FXWWdLSE5sZEhScGJtZHpMbVYyWlc1MEtTQjdYRzRnSUNBZ0lDQjBhR2x6TG1WMlpXNTBJRDBnZEdocGN5NXZiaWduWTJoaGJtZGxKeXdnYzJWMGRHbHVaM011WlhabGJuUXBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFHbHpMbVYyWlc1MElEMGdabUZzYzJVN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY21WMGRYSnVJSE5sZEhScGJtZHpPMXh1WEc0Z0lIMWNibHh1SUNCcGJtbDBLQ2tnZTF4dUlDQWdJSFJvYVhNdVluVnBiR1JHY21GdFpTZ3BPMXh1SUNBZ0lIUm9hWE11WW5WcGJHUkpiblJsY21aaFkyVW9LVHRjYmlBZ0lDQjBhR2x6TG5OcGVtVkpiblJsY21aaFkyVW9LVHRjYmlBZ0lDQjBhR2x6TG1GMGRHRmphRXhwYzNSbGJtVnljeWdwTzF4dUlDQWdJSFJvYVhNdVkyOXNiM0pKYm5SbGNtWmhZMlVvS1R0Y2JpQWdJQ0IwYUdsekxtWnBibUZzVkc5MVkyaGxjeWdwTzF4dUlDQjlYRzVjYmlBZ1luVnBiR1JHY21GdFpTZ3BJSHRjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblFnUFNCemRtY3VZM0psWVhSbEtDZHpkbWNuS1R0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWMyVjBRWFIwY21saWRYUmxLQ2QzYVdSMGFDY3NkR2hwY3k1M2FXUjBhQ2s3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG5ObGRFRjBkSEpwWW5WMFpTZ25hR1ZwWjJoMEp5eDBhR2x6TG1obGFXZG9kQ2s3WEc0Z0lDQWdkR2hwY3k1d1lYSmxiblF1WVhCd1pXNWtRMmhwYkdRb2RHaHBjeTVsYkdWdFpXNTBLVHRjYmlBZ2ZWeHVYRzRnSUdKMWFXeGtTVzUwWlhKbVlXTmxLQ2tnZTMxY2JpQWdjMmw2WlVsdWRHVnlabUZqWlNncElIdDlYRzRnSUdOdmJHOXlTVzUwWlhKbVlXTmxLQ2tnZTMxY2JseHVJQ0JoZEhSaFkyaE1hWE4wWlc1bGNuTW9LU0I3WEc1Y2JpQWdJQ0IwYUdsekxtbHVkR1Z5WVdOMGFXOXVWR0Z5WjJWMElEMGdkR2hwY3k1cGJuUmxjbUZqZEdsdmJsUmhjbWRsZENCOGZDQjBhR2x6TG1Wc1pXMWxiblE3WEc1Y2JpQWdJQ0F2THlCVFpYUjFjQ0JwYm5SbGNtRmpkR2x2Ymx4dUlDQWdJR2xtSUNoMGIzVmphQzVsZUdsemRITXBJSHRjYmlBZ0lDQWdJSFJvYVhNdWFXNTBaWEpoWTNScGIyNVVZWEpuWlhRdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnbmRHOTFZMmh6ZEdGeWRDY3NJR1YyZENBOVBpQjBhR2x6TG5CeVpWUnZkV05vS0dWMmRDa3BPMXh1SUNBZ0lDQWdkR2hwY3k1cGJuUmxjbUZqZEdsdmJsUmhjbWRsZEM1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5S0NkMGIzVmphRzF2ZG1VbkxDQmxkblFnUFQ0Z2RHaHBjeTV3Y21WVWIzVmphRTF2ZG1Vb1pYWjBLU2s3WEc0Z0lDQWdJQ0IwYUdsekxtbHVkR1Z5WVdOMGFXOXVWR0Z5WjJWMExtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0ozUnZkV05vWlc1a0p5d2daWFowSUQwK0lIUm9hWE11Y0hKbFZHOTFZMmhTWld4bFlYTmxLR1YyZENrcE8xeHVJQ0FnSUgxY2JpQWdJQ0IwYUdsekxtSnZkVzVrVUhKbFRXOTJaU0E5SUdWMmRDQTlQaUIwYUdsekxuQnlaVTF2ZG1Vb1pYWjBLVHRjYmlBZ0lDQjBhR2x6TG1KdmRXNWtVSEpsVW1Wc1pXRnpaU0E5SUdWMmRDQTlQaUIwYUdsekxuQnlaVkpsYkdWaGMyVW9aWFowS1R0Y2JpQWdJQ0IwYUdsekxtbHVkR1Z5WVdOMGFXOXVWR0Z5WjJWMExtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0oyMXZkWE5sWkc5M2JpY3NJR1YyZENBOVBpQjBhR2x6TG5CeVpVTnNhV05yS0dWMmRDa3BPMXh1SUNCOVhHNWNiaUFnWm1sdVlXeFViM1ZqYUdWektDa2dlMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzV6ZEhsc1pTNWpkWEp6YjNJZ1BTQW5jRzlwYm5SbGNpYzdYRzRnSUgxY2JseHVJQ0J3Y21WRGJHbGpheWhsS1NCN1hHNGdJQ0FnTHk4Z01UQXdNREFnWjJWMFEyOXRjSFYwWldSVGRIbHNaU0JqWVd4c2N5QjBZV3RsY3lBeE1EQWdiWE11WEc0Z0lDQWdMeThnTGpvdUlHOXVaU0IwWVd0bGN5QmhZbTkxZENBdU1ERnRjMXh1SUNBZ0lHbG1JQ2gwYUdsekxtVnNaVzFsYm5RZ2FXNXpkR0Z1WTJWdlppQklWRTFNUld4bGJXVnVkQ2tnZTF4dUlDQWdJQ0FnZEdocGN5NTNhV1IwYUNBOUlIZHBibVJ2ZHk1blpYUkRiMjF3ZFhSbFpGTjBlV3hsS0hSb2FYTXVaV3hsYldWdWRDd2diblZzYkNrdVoyVjBVSEp2Y0dWeWRIbFdZV3gxWlNnbmQybGtkR2duS1M1eVpYQnNZV05sS0Nkd2VDY3NKeWNwTzF4dUlDQWdJSDFjYmlBZ0lDQXZMeUF4TURBd01DQm5aWFJEYjIxd2RYUmxaRk4wZVd4bElHTmhiR3h6SUhSaGEyVnpJRFF3SUcxekxseHVJQ0FnSUM4dklDNDZMaUJ2Ym1VZ2RHRnJaWE1nWVdKdmRYUWdMakF3TkcxelhHNGdJQ0FnZEdocGN5NXZabVp6WlhRZ1BTQmtiMjB1Wm1sdVpGQnZjMmwwYVc5dUtIUm9hWE11Wld4bGJXVnVkQ2s3WEc0Z0lDQWdkR2hwY3k1dGIzVnpaU0E5SUdSdmJTNXNiMk5oZEdWTmIzVnpaU2hsTEhSb2FYTXViMlptYzJWMEtUdGNiaUFnSUNCMGFHbHpMbU5zYVdOclpXUWdQU0IwY25WbE8xeHVJQ0FnSUhSb2FYTXVZMnhwWTJzb0tUdGNiaUFnSUNCMGFHbHpMbTF2ZG1WRmRtVnVkQ0E5SUdSdlkzVnRaVzUwTG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjIxdmRYTmxiVzkyWlNjc0lIUm9hWE11WW05MWJtUlFjbVZOYjNabEtUdGNiaUFnSUNCMGFHbHpMbkpsYkdWaGMyVkZkbVZ1ZENBOUlHUnZZM1Z0Wlc1MExtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0oyMXZkWE5sZFhBbkxDQjBhR2x6TG1KdmRXNWtVSEpsVW1Wc1pXRnpaU2s3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RqYkdsamF5Y3BPMXh1SUNBZ0lHVXVjSEpsZG1WdWRFUmxabUYxYkhRb0tUdGNiaUFnSUNCbExuTjBiM0JRY205d1lXZGhkR2x2YmlncE8xeHVJQ0I5WEc1Y2JpQWdjSEpsVFc5MlpTaGxLU0I3WEc0Z0lDQWdhV1lnS0NGMGFHbHpMbmRoYVhRcElIdGNiaUFnSUNBZ0lIUm9hWE11Ylc5MWMyVWdQU0JrYjIwdWJHOWpZWFJsVFc5MWMyVW9aU3gwYUdsekxtOW1abk5sZENrN1hHNGdJQ0FnSUNCMGFHbHpMbTF2ZG1Vb0tUdGNiaUFnSUNBZ0lIUm9hWE11ZDJGcGRDQTlJSFJ5ZFdVN1hHNGdJQ0FnSUNCelpYUlVhVzFsYjNWMEtDZ3BJRDArSUhzZ2RHaHBjeTUzWVdsMElEMGdabUZzYzJVN0lIMHNNalVwTzF4dUlDQWdJSDFjYmlBZ0lDQmxMbkJ5WlhabGJuUkVaV1poZFd4MEtDazdYRzRnSUNBZ1pTNXpkRzl3VUhKdmNHRm5ZWFJwYjI0b0tUdGNiaUFnZlZ4dVhHNGdJSEJ5WlZKbGJHVmhjMlVvWlNrZ2UxeHVJQ0FnSUhSb2FYTXViVzkxYzJVZ1BTQmtiMjB1Ykc5allYUmxUVzkxYzJVb1pTeDBhR2x6TG05bVpuTmxkQ2s3WEc0Z0lDQWdkR2hwY3k1amJHbGphMlZrSUQwZ1ptRnNjMlU3WEc0Z0lDQWdkR2hwY3k1eVpXeGxZWE5sS0NrN1hHNGdJQ0FnZEdocGN5NWxiV2wwS0NkeVpXeGxZWE5sSnlrN1hHNGdJQ0FnWkc5amRXMWxiblF1Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lnbmJXOTFjMlZ0YjNabEp5eDBhR2x6TG1KdmRXNWtVSEpsVFc5MlpTazdYRzRnSUNBZ1pHOWpkVzFsYm5RdWNtVnRiM1psUlhabGJuUk1hWE4wWlc1bGNpZ25iVzkxYzJWMWNDY3NkR2hwY3k1aWIzVnVaRkJ5WlZKbGJHVmhjMlVwTzF4dUlDQWdJR1V1Y0hKbGRtVnVkRVJsWm1GMWJIUW9LVHRjYmlBZ0lDQmxMbk4wYjNCUWNtOXdZV2RoZEdsdmJpZ3BPMXh1SUNCOVhHNWNiaUFnWTJ4cFkyc29LU0I3WEc1Y2JpQWdmVnh1WEc0Z0lHMXZkbVVvS1NCN1hHNWNiaUFnZlZ4dVhHNGdJSEpsYkdWaGMyVW9LU0I3WEc1Y2JpQWdmVnh1WEc1Y2JpQWdMeW9nZEc5MVkyZ2dLaTljYmx4dUlDQndjbVZVYjNWamFDaGxLU0I3WEc0Z0lDQWdhV1lnS0hSb2FYTXVaV3hsYldWdWRDQnBibk4wWVc1alpXOW1JRWhVVFV4RmJHVnRaVzUwS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbmRwWkhSb0lEMGdkMmx1Wkc5M0xtZGxkRU52YlhCMWRHVmtVM1I1YkdVb2RHaHBjeTVsYkdWdFpXNTBMQ0J1ZFd4c0tTNW5aWFJRY205d1pYSjBlVlpoYkhWbEtDZDNhV1IwYUNjcExuSmxjR3hoWTJVb0ozQjRKeXduSnlrN1hHNGdJQ0FnZlZ4dUlDQWdJSFJvYVhNdWIyWm1jMlYwSUQwZ1pHOXRMbVpwYm1SUWIzTnBkR2x2YmloMGFHbHpMbVZzWlcxbGJuUXBPMXh1SUNBZ0lIUm9hWE11Ylc5MWMyVWdQU0JrYjIwdWJHOWpZWFJsVkc5MVkyZ29aU3gwYUdsekxtOW1abk5sZENrN1hHNGdJQ0FnZEdocGN5NWpiR2xqYTJWa0lEMGdkSEoxWlR0Y2JpQWdJQ0IwYUdsekxuUnZkV05vS0dVcE8xeHVJQ0FnSUhSb2FYTXVaVzFwZENnblkyeHBZMnNuS1R0Y2JpQWdJQ0JsTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEc0Z0lDQWdaUzV6ZEc5d1VISnZjR0ZuWVhScGIyNG9LVHRjYmlBZ2ZWeHVYRzRnSUhCeVpWUnZkV05vVFc5MlpTaGxLU0I3WEc0Z0lDQWdhV1lnS0hSb2FYTXVZMnhwWTJ0bFpDa2dlMXh1SUNBZ0lDQWdkR2hwY3k1dGIzVnpaU0E5SUdSdmJTNXNiMk5oZEdWVWIzVmphQ2hsTEhSb2FYTXViMlptYzJWMEtUdGNiaUFnSUNBZ0lIUm9hWE11ZEc5MVkyaE5iM1psS0NrN1hHNGdJQ0FnSUNCbExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hHNGdJQ0FnSUNCbExuTjBiM0JRY205d1lXZGhkR2x2YmlncE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lIQnlaVlJ2ZFdOb1VtVnNaV0Z6WlNobEtTQjdYRzRnSUNBZ2RHaHBjeTV0YjNWelpTQTlJR1J2YlM1c2IyTmhkR1ZVYjNWamFDaGxMQ0IwYUdsekxtOW1abk5sZENrN1hHNGdJQ0FnZEdocGN5NWpiR2xqYTJWa0lEMGdabUZzYzJVN1hHNGdJQ0FnZEdocGN5NTBiM1ZqYUZKbGJHVmhjMlVvS1R0Y2JpQWdJQ0IwYUdsekxtVnRhWFFvSjNKbGJHVmhjMlVuS1R0Y2JpQWdJQ0JsTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEc0Z0lDQWdaUzV6ZEc5d1VISnZjR0ZuWVhScGIyNG9LVHRjYmlBZ2ZWeHVYRzRnSUhSdmRXTm9LQ2tnZTF4dUlDQWdJSFJvYVhNdVkyeHBZMnNvS1R0Y2JpQWdmVnh1WEc0Z0lIUnZkV05vVFc5MlpTZ3BJSHRjYmlBZ0lDQjBhR2x6TG0xdmRtVW9LVHRjYmlBZ2ZWeHVYRzRnSUhSdmRXTm9VbVZzWldGelpTZ3BJSHRjYmlBZ0lDQjBhR2x6TG5KbGJHVmhjMlVvS1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBcUlGSmxjMmw2WlNCMGFHVWdhVzUwWlhKbVlXTmxYRzRnSUNvZ1FIQmhjbUZ0SUhkcFpIUm9JSHR1ZFcxaVpYSjlJRTVsZHlCM2FXUjBhQ0JwYmlCd2FYaGxiSE5jYmlBZ0tpQkFjR0Z5WVcwZ2FHVnBaMmgwSUh0dWRXMWlaWEo5SUU1bGR5Qm9aV2xuYUhRZ2FXNGdjR2w0Wld4elhHNGdJQ3BjYmlBZ0tpQkFaWGhoYlhCc1pWeHVJQ0FxSUdKMWRIUnZiaTV5WlhOcGVtVW9NVEF3TERFd01DazdYRzRnSUNvdlhHNGdJSEpsYzJsNlpTaDNhV1IwYUN4b1pXbG5hSFFwSUh0Y2JpQWdJQ0IwYUdsekxuZHBaSFJvSUQwZ2QybGtkR2c3WEc0Z0lDQWdkR2hwY3k1b1pXbG5hSFFnUFNCb1pXbG5hSFE3WEc0Z0lDQWdkR2hwY3k1d1lYSmxiblF1YzNSNWJHVXVkMmxrZEdnZ1BTQjBhR2x6TG5kcFpIUm9LeWR3ZUNjN1hHNGdJQ0FnZEdocGN5NXdZWEpsYm5RdWMzUjViR1V1YUdWcFoyaDBJRDBnZEdocGN5NW9aV2xuYUhRckozQjRKenRjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1YzJWMFFYUjBjbWxpZFhSbEtDZDNhV1IwYUNjc2RHaHBjeTUzYVdSMGFDazdYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk5sZEVGMGRISnBZblYwWlNnbmFHVnBaMmgwSnl4MGFHbHpMbWhsYVdkb2RDazdYRzRnSUNBZ2RHaHBjeTV6YVhwbFNXNTBaWEptWVdObEtDazdYRzRnSUgxY2JseHVJQ0JsYlhCMGVTZ3BJSHRjYmlBZ0lDQjNhR2xzWlNBb2RHaHBjeTVsYkdWdFpXNTBMbXhoYzNSRGFHbHNaQ2tnZTF4dUlDQWdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExuSmxiVzkyWlVOb2FXeGtLSFJvYVhNdVpXeGxiV1Z1ZEM1c1lYTjBRMmhwYkdRcE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBcUlGSmxiVzkyWlNCMGFHVWdhVzUwWlhKbVlXTmxJR1p5YjIwZ2RHaGxJSEJoWjJVZ1lXNWtJR05oYm1ObGJDQnBkSE1nWlhabGJuUWdiR2x6ZEdWdVpYSW9jeWt1WEc0Z0lDcGNiaUFnS2lCQVpYaGhiWEJzWlZ4dUlDQXFJR0oxZEhSdmJpNWtaWE4wY205NUtDazdYRzRnSUNvdlhHNGdJR1JsYzNSeWIza29LU0I3WEc0Z0lDQWdkR2hwY3k1bGJYQjBlU2dwTzF4dUlDQWdJSFJvYVhNdWNHRnlaVzUwTG5KbGJXOTJaVU5vYVd4a0tIUm9hWE11Wld4bGJXVnVkQ2s3WEc0Z0lDQWdkR2hwY3k1eVpXMXZkbVZCYkd4TWFYTjBaVzVsY25Nb0tUdGNiaUFnSUNCcFppQW9kR2hwY3k1cGJuTjBjblZ0Wlc1MEtTQjdYRzRnSUNBZ0lDQmtaV3hsZEdVZ2RHaHBjeTVwYm5OMGNuVnRaVzUwVzNSb2FYTXVhV1JkTzF4dUlDQWdJSDFjYmlBZ0lDQjBhR2x6TG1OMWMzUnZiVVJsYzNSeWIza29LVHRjYmlBZ2ZWeHVYRzRnSUdOMWMzUnZiVVJsYzNSeWIza29LU0I3WEc1Y2JpQWdmVnh1WEc0Z0lHTnZiRzl5YVhwbEtIUjVjR1VzWTI5c2IzSXBJSHRjYmlBZ0lDQjBhR2x6TG1OdmJHOXljMXQwZVhCbFhTQTlJR052Ykc5eU8xeHVJQ0FnSUhSb2FYTXVZMjlzYjNKSmJuUmxjbVpoWTJVb0tUdGNiaUFnZlZ4dVhHNTlYRzVjYmx4dVhHNHZMeUJYUlVKUVFVTkxJRVpQVDFSRlVpQXZMMXh1THk4Z0xpOStMMnB6YUdsdWRDMXNiMkZrWlhJaExpOXNhV0l2WTI5eVpTOXBiblJsY21aaFkyVXVhbk1pTENJbmRYTmxJSE4wY21samRDYzdYRzVjYm1WNGNHOXlkSE11Wm1sdVpGQnZjMmwwYVc5dUlEMGdLR1ZzS1NBOVBpQjdYRzRnSUd4bGRDQjJhV1YzY0c5eWRFOW1abk5sZENBOUlHVnNMbWRsZEVKdmRXNWthVzVuUTJ4cFpXNTBVbVZqZENncE8xeHVJQ0JzWlhRZ2RHOXdJRDBnZG1sbGQzQnZjblJQWm1aelpYUXVkRzl3SUNzZ2QybHVaRzkzTG5OamNtOXNiRms3WEc0Z0lHeGxkQ0JzWldaMElEMGdkbWxsZDNCdmNuUlBabVp6WlhRdWJHVm1kQ0FySUhkcGJtUnZkeTV6WTNKdmJHeFlPMXh1SUNCeVpYUjFjbTRnZTNSdmNDeHNaV1owZlR0Y2JuMDdYRzVjYm1WNGNHOXlkSE11Y0dGeWMyVkZiR1Z0Wlc1MElEMGdLSEJoY21WdWRDa2dQVDRnZTF4dUlDQnBaaUFvZEhsd1pXOW1JSEJoY21WdWRDQTlQVDBnSjNOMGNtbHVaeWNwSUh0Y2JpQWdJQ0J3WVhKbGJuUWdQU0JrYjJOMWJXVnVkQzVuWlhSRmJHVnRaVzUwUW5sSlpDaHdZWEpsYm5RdWNtVndiR0ZqWlNnbkl5Y3NKeWNwS1R0Y2JpQWdmVnh1WEc0Z0lHbG1JQ2h3WVhKbGJuUWdhVzV6ZEdGdVkyVnZaaUJJVkUxTVJXeGxiV1Z1ZENCOGZDQndZWEpsYm5RZ2FXNXpkR0Z1WTJWdlppQlRWa2RGYkdWdFpXNTBLWHRjYmlBZ0lDQnlaWFIxY200Z2NHRnlaVzUwTzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUhKbGRIVnliaUFuVG04Z2RtRnNhV1FnY0dGeVpXNTBJR0Z5WjNWdFpXNTBKenRjYmlBZ2ZWeHVmVHRjYmx4dVpYaHdiM0owY3k1c2IyTmhkR1ZOYjNWelpTQTlJQ2hsTEc5bVpuTmxkQ2tnUFQ0Z2UxeHVJQ0J5WlhSMWNtNGdlMXh1SUNBZ0lIZzZJR1V1Y0dGblpWZ2dMU0J2Wm1aelpYUXViR1ZtZEN4Y2JpQWdJQ0I1T2lCbExuQmhaMlZaSUMwZ2IyWm1jMlYwTG5SdmNGeHVJQ0I5TzF4dWZUdGNibHh1Wlhod2IzSjBjeTVzYjJOaGRHVlViM1ZqYUNBOUlDaGxMRzltWm5ObGRDa2dQVDRnZTF4dUlDQnlaWFIxY200Z2UxeHVJQ0FnSUhnNklHVXVkR0Z5WjJWMFZHOTFZMmhsY3k1c1pXNW5kR2dnUHlCbExuUmhjbWRsZEZSdmRXTm9aWE5iTUYwdWNHRm5aVmdnTFNCdlptWnpaWFF1YkdWbWRDQTZJR1poYkhObExGeHVJQ0FnSUhrNklHVXVkR0Z5WjJWMFZHOTFZMmhsY3k1c1pXNW5kR2dnUHlCbExuUmhjbWRsZEZSdmRXTm9aWE5iTUYwdWNHRm5aVmtnTFNCdlptWnpaWFF1ZEc5d0lEb2dabUZzYzJWY2JpQWdmVHRjYm4wN1hHNWNibVY0Y0c5eWRITXVVMjFoY25SRFlXNTJZWE1nUFNCbWRXNWpkR2x2Ymlod1lYSmxiblFwSUh0Y2JseHVJQ0IwYUdsekxtVnNaVzFsYm5RZ1BTQmtiMk4xYldWdWRDNWpjbVZoZEdWRmJHVnRaVzUwS0NkallXNTJZWE1uS1R0Y2JpQWdkR2hwY3k1amIyNTBaWGgwSUQwZ2RHaHBjeTVsYkdWdFpXNTBMbWRsZEVOdmJuUmxlSFFvSnpKa0p5azdYRzRnSUhCaGNtVnVkQzVoY0hCbGJtUkRhR2xzWkNoMGFHbHpMbVZzWlcxbGJuUXBPMXh1WEc0Z0lIUm9hWE11Y21WemFYcGxJRDBnS0hjc2FDa2dQVDRnZTF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1M2FXUjBhQ0E5SUhjcU1qdGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVhR1ZwWjJoMElEMGdhQ295TzF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1emRIbHNaUzUzYVdSMGFDQTlJSGNySjNCNEp6dGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVjM1I1YkdVdWFHVnBaMmgwSUQwZ2FDc25jSGduTzF4dUlDQjlPMXh1WEc1OU8xeHVYRzVjYmx4dUx5OGdWMFZDVUVGRFN5QkdUMDlVUlZJZ0x5OWNiaTh2SUM0dmZpOXFjMmhwYm5RdGJHOWhaR1Z5SVM0dmJHbGlMM1YwYVd3dlpHOXRMbXB6SWl3aUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc1bGVIQnZjblJ6TG1selQySnFaV04wSUQwZ0tHOWlhaWtnUFQ0Z2UxeHVJQ0JwWmlBb2RIbHdaVzltSUc5aWFpQTlQVDBnSjI5aWFtVmpkQ2NnSmlZZ0lVRnljbUY1TG1selFYSnlZWGtvYjJKcUtTQW1KaUJ2WW1vZ0lUMDlJRzUxYkd3Z0ppWWdiMkpxSUdsdWMzUmhibU5sYjJZZ1UxWkhSV3hsYldWdWRDQTlQVDBnWm1Gc2MyVWdKaVlnYjJKcUlHbHVjM1JoYm1ObGIyWWdTRlJOVEVWc1pXMWxiblFnUFQwOUlHWmhiSE5sSUNrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwY25WbE8xeHVJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lISmxkSFZ5YmlCbVlXeHpaVHRjYmlBZ2ZWeHVmVHRjYmx4dVhHNWNiaTh2SUZkRlFsQkJRMHNnUms5UFZFVlNJQzh2WEc0dkx5QXVMMzR2YW5Ob2FXNTBMV3h2WVdSbGNpRXVMMnhwWWk5MWRHbHNMM1YwYVd3dWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibVY0Y0c5eWRITXVaWGhwYzNSeklEMGdLQ2R2Ym5SdmRXTm9jM1JoY25RbklHbHVJR1J2WTNWdFpXNTBMbVJ2WTNWdFpXNTBSV3hsYldWdWRDazdYRzVjYmx4dVhHNHZMeUJYUlVKUVFVTkxJRVpQVDFSRlVpQXZMMXh1THk4Z0xpOStMMnB6YUdsdWRDMXNiMkZrWlhJaExpOXNhV0l2ZFhScGJDOTBiM1ZqYUM1cWN5SXNJaTh2SUVOdmNIbHlhV2RvZENCS2IzbGxiblFzSUVsdVl5NGdZVzVrSUc5MGFHVnlJRTV2WkdVZ1kyOXVkSEpwWW5WMGIzSnpMbHh1THk5Y2JpOHZJRkJsY20xcGMzTnBiMjRnYVhNZ2FHVnlaV0o1SUdkeVlXNTBaV1FzSUdaeVpXVWdiMllnWTJoaGNtZGxMQ0IwYnlCaGJua2djR1Z5YzI5dUlHOWlkR0ZwYm1sdVp5QmhYRzR2THlCamIzQjVJRzltSUhSb2FYTWdjMjltZEhkaGNtVWdZVzVrSUdGemMyOWphV0YwWldRZ1pHOWpkVzFsYm5SaGRHbHZiaUJtYVd4bGN5QW9kR2hsWEc0dkx5QmNJbE52Wm5SM1lYSmxYQ0lwTENCMGJ5QmtaV0ZzSUdsdUlIUm9aU0JUYjJaMGQyRnlaU0IzYVhSb2IzVjBJSEpsYzNSeWFXTjBhVzl1TENCcGJtTnNkV1JwYm1kY2JpOHZJSGRwZEdodmRYUWdiR2x0YVhSaGRHbHZiaUIwYUdVZ2NtbG5hSFJ6SUhSdklIVnpaU3dnWTI5d2VTd2diVzlrYVdaNUxDQnRaWEpuWlN3Z2NIVmliR2x6YUN4Y2JpOHZJR1JwYzNSeWFXSjFkR1VzSUhOMVlteHBZMlZ1YzJVc0lHRnVaQzl2Y2lCelpXeHNJR052Y0dsbGN5QnZaaUIwYUdVZ1UyOW1kSGRoY21Vc0lHRnVaQ0IwYnlCd1pYSnRhWFJjYmk4dklIQmxjbk52Ym5NZ2RHOGdkMmh2YlNCMGFHVWdVMjltZEhkaGNtVWdhWE1nWm5WeWJtbHphR1ZrSUhSdklHUnZJSE52TENCemRXSnFaV04wSUhSdklIUm9aVnh1THk4Z1ptOXNiRzkzYVc1bklHTnZibVJwZEdsdmJuTTZYRzR2TDF4dUx5OGdWR2hsSUdGaWIzWmxJR052Y0hseWFXZG9kQ0J1YjNScFkyVWdZVzVrSUhSb2FYTWdjR1Z5YldsemMybHZiaUJ1YjNScFkyVWdjMmhoYkd3Z1ltVWdhVzVqYkhWa1pXUmNiaTh2SUdsdUlHRnNiQ0JqYjNCcFpYTWdiM0lnYzNWaWMzUmhiblJwWVd3Z2NHOXlkR2x2Ym5NZ2IyWWdkR2hsSUZOdlpuUjNZWEpsTGx4dUx5OWNiaTh2SUZSSVJTQlRUMFpVVjBGU1JTQkpVeUJRVWs5V1NVUkZSQ0JjSWtGVElFbFRYQ0lzSUZkSlZFaFBWVlFnVjBGU1VrRk9WRmtnVDBZZ1FVNVpJRXRKVGtRc0lFVllVRkpGVTFOY2JpOHZJRTlTSUVsTlVFeEpSVVFzSUVsT1EweFZSRWxPUnlCQ1ZWUWdUazlVSUV4SlRVbFVSVVFnVkU4Z1ZFaEZJRmRCVWxKQlRsUkpSVk1nVDBaY2JpOHZJRTFGVWtOSVFVNVVRVUpKVEVsVVdTd2dSa2xVVGtWVFV5QkdUMUlnUVNCUVFWSlVTVU5WVEVGU0lGQlZVbEJQVTBVZ1FVNUVJRTVQVGtsT1JsSkpUa2RGVFVWT1ZDNGdTVTVjYmk4dklFNVBJRVZXUlU1VUlGTklRVXhNSUZSSVJTQkJWVlJJVDFKVElFOVNJRU5QVUZsU1NVZElWQ0JJVDB4RVJWSlRJRUpGSUV4SlFVSk1SU0JHVDFJZ1FVNVpJRU5NUVVsTkxGeHVMeThnUkVGTlFVZEZVeUJQVWlCUFZFaEZVaUJNU1VGQ1NVeEpWRmtzSUZkSVJWUklSVklnU1U0Z1FVNGdRVU5VU1U5T0lFOUdJRU5QVGxSU1FVTlVMQ0JVVDFKVUlFOVNYRzR2THlCUFZFaEZVbGRKVTBVc0lFRlNTVk5KVGtjZ1JsSlBUU3dnVDFWVUlFOUdJRTlTSUVsT0lFTlBUazVGUTFSSlQwNGdWMGxVU0NCVVNFVWdVMDlHVkZkQlVrVWdUMUlnVkVoRlhHNHZMeUJWVTBVZ1QxSWdUMVJJUlZJZ1JFVkJURWxPUjFNZ1NVNGdWRWhGSUZOUFJsUlhRVkpGTGx4dVhHNW1kVzVqZEdsdmJpQkZkbVZ1ZEVWdGFYUjBaWElvS1NCN1hHNGdJSFJvYVhNdVgyVjJaVzUwY3lBOUlIUm9hWE11WDJWMlpXNTBjeUI4ZkNCN2ZUdGNiaUFnZEdocGN5NWZiV0Y0VEdsemRHVnVaWEp6SUQwZ2RHaHBjeTVmYldGNFRHbHpkR1Z1WlhKeklIeDhJSFZ1WkdWbWFXNWxaRHRjYm4xY2JtMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1JYWmxiblJGYldsMGRHVnlPMXh1WEc0dkx5QkNZV05yZDJGeVpITXRZMjl0Y0dGMElIZHBkR2dnYm05a1pTQXdMakV3TG5oY2JrVjJaVzUwUlcxcGRIUmxjaTVGZG1WdWRFVnRhWFIwWlhJZ1BTQkZkbVZ1ZEVWdGFYUjBaWEk3WEc1Y2JrVjJaVzUwUlcxcGRIUmxjaTV3Y205MGIzUjVjR1V1WDJWMlpXNTBjeUE5SUhWdVpHVm1hVzVsWkR0Y2JrVjJaVzUwUlcxcGRIUmxjaTV3Y205MGIzUjVjR1V1WDIxaGVFeHBjM1JsYm1WeWN5QTlJSFZ1WkdWbWFXNWxaRHRjYmx4dUx5OGdRbmtnWkdWbVlYVnNkQ0JGZG1WdWRFVnRhWFIwWlhKeklIZHBiR3dnY0hKcGJuUWdZU0IzWVhKdWFXNW5JR2xtSUcxdmNtVWdkR2hoYmlBeE1DQnNhWE4wWlc1bGNuTWdZWEpsWEc0dkx5QmhaR1JsWkNCMGJ5QnBkQzRnVkdocGN5QnBjeUJoSUhWelpXWjFiQ0JrWldaaGRXeDBJSGRvYVdOb0lHaGxiSEJ6SUdacGJtUnBibWNnYldWdGIzSjVJR3hsWVd0ekxseHVSWFpsYm5SRmJXbDBkR1Z5TG1SbFptRjFiSFJOWVhoTWFYTjBaVzVsY25NZ1BTQXhNRHRjYmx4dUx5OGdUMkoyYVc5MWMyeDVJRzV2ZENCaGJHd2dSVzFwZEhSbGNuTWdjMmh2ZFd4a0lHSmxJR3hwYldsMFpXUWdkRzhnTVRBdUlGUm9hWE1nWm5WdVkzUnBiMjRnWVd4c2IzZHpYRzR2THlCMGFHRjBJSFJ2SUdKbElHbHVZM0psWVhObFpDNGdVMlYwSUhSdklIcGxjbThnWm05eUlIVnViR2x0YVhSbFpDNWNia1YyWlc1MFJXMXBkSFJsY2k1d2NtOTBiM1I1Y0dVdWMyVjBUV0Y0VEdsemRHVnVaWEp6SUQwZ1puVnVZM1JwYjI0b2Jpa2dlMXh1SUNCcFppQW9JV2x6VG5WdFltVnlLRzRwSUh4OElHNGdQQ0F3SUh4OElHbHpUbUZPS0c0cEtWeHVJQ0FnSUhSb2NtOTNJRlI1Y0dWRmNuSnZjaWduYmlCdGRYTjBJR0psSUdFZ2NHOXphWFJwZG1VZ2JuVnRZbVZ5SnlrN1hHNGdJSFJvYVhNdVgyMWhlRXhwYzNSbGJtVnljeUE5SUc0N1hHNGdJSEpsZEhWeWJpQjBhR2x6TzF4dWZUdGNibHh1UlhabGJuUkZiV2wwZEdWeUxuQnliM1J2ZEhsd1pTNWxiV2wwSUQwZ1puVnVZM1JwYjI0b2RIbHdaU2tnZTF4dUlDQjJZWElnWlhJc0lHaGhibVJzWlhJc0lHeGxiaXdnWVhKbmN5d2dhU3dnYkdsemRHVnVaWEp6TzF4dVhHNGdJR2xtSUNnaGRHaHBjeTVmWlhabGJuUnpLVnh1SUNBZ0lIUm9hWE11WDJWMlpXNTBjeUE5SUh0OU8xeHVYRzRnSUM4dklFbG1JSFJvWlhKbElHbHpJRzV2SUNkbGNuSnZjaWNnWlhabGJuUWdiR2x6ZEdWdVpYSWdkR2hsYmlCMGFISnZkeTVjYmlBZ2FXWWdLSFI1Y0dVZ1BUMDlJQ2RsY25KdmNpY3BJSHRjYmlBZ0lDQnBaaUFvSVhSb2FYTXVYMlYyWlc1MGN5NWxjbkp2Y2lCOGZGeHVJQ0FnSUNBZ0lDQW9hWE5QWW1wbFkzUW9kR2hwY3k1ZlpYWmxiblJ6TG1WeWNtOXlLU0FtSmlBaGRHaHBjeTVmWlhabGJuUnpMbVZ5Y205eUxteGxibWQwYUNrcElIdGNiaUFnSUNBZ0lHVnlJRDBnWVhKbmRXMWxiblJ6V3pGZE8xeHVJQ0FnSUNBZ2FXWWdLR1Z5SUdsdWMzUmhibU5sYjJZZ1JYSnliM0lwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHliM2NnWlhJN0lDOHZJRlZ1YUdGdVpHeGxaQ0FuWlhKeWIzSW5JR1YyWlc1MFhHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBdkx5QkJkQ0JzWldGemRDQm5hWFpsSUhOdmJXVWdhMmx1WkNCdlppQmpiMjUwWlhoMElIUnZJSFJvWlNCMWMyVnlYRzRnSUNBZ0lDQWdJSFpoY2lCbGNuSWdQU0J1WlhjZ1JYSnliM0lvSjFWdVkyRjFaMmgwTENCMWJuTndaV05wWm1sbFpDQmNJbVZ5Y205eVhDSWdaWFpsYm5RdUlDZ25JQ3NnWlhJZ0t5QW5LU2NwTzF4dUlDQWdJQ0FnSUNCbGNuSXVZMjl1ZEdWNGRDQTlJR1Z5TzF4dUlDQWdJQ0FnSUNCMGFISnZkeUJsY25JN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2FHRnVaR3hsY2lBOUlIUm9hWE11WDJWMlpXNTBjMXQwZVhCbFhUdGNibHh1SUNCcFppQW9hWE5WYm1SbFptbHVaV1FvYUdGdVpHeGxjaWtwWEc0Z0lDQWdjbVYwZFhKdUlHWmhiSE5sTzF4dVhHNGdJR2xtSUNocGMwWjFibU4wYVc5dUtHaGhibVJzWlhJcEtTQjdYRzRnSUNBZ2MzZHBkR05vSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNBdkx5Qm1ZWE4wSUdOaGMyVnpYRzRnSUNBZ0lDQmpZWE5sSURFNlhHNGdJQ0FnSUNBZ0lHaGhibVJzWlhJdVkyRnNiQ2gwYUdsektUdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCallYTmxJREk2WEc0Z0lDQWdJQ0FnSUdoaGJtUnNaWEl1WTJGc2JDaDBhR2x6TENCaGNtZDFiV1Z1ZEhOYk1WMHBPMXh1SUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNBZ0lHTmhjMlVnTXpwY2JpQWdJQ0FnSUNBZ2FHRnVaR3hsY2k1allXeHNLSFJvYVhNc0lHRnlaM1Z0Wlc1MGMxc3hYU3dnWVhKbmRXMWxiblJ6V3pKZEtUdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNBdkx5QnpiRzkzWlhKY2JpQWdJQ0FnSUdSbFptRjFiSFE2WEc0Z0lDQWdJQ0FnSUdGeVozTWdQU0JCY25KaGVTNXdjbTkwYjNSNWNHVXVjMnhwWTJVdVkyRnNiQ2hoY21kMWJXVnVkSE1zSURFcE8xeHVJQ0FnSUNBZ0lDQm9ZVzVrYkdWeUxtRndjR3g1S0hSb2FYTXNJR0Z5WjNNcE8xeHVJQ0FnSUgxY2JpQWdmU0JsYkhObElHbG1JQ2hwYzA5aWFtVmpkQ2hvWVc1a2JHVnlLU2tnZTF4dUlDQWdJR0Z5WjNNZ1BTQkJjbkpoZVM1d2NtOTBiM1I1Y0dVdWMyeHBZMlV1WTJGc2JDaGhjbWQxYldWdWRITXNJREVwTzF4dUlDQWdJR3hwYzNSbGJtVnljeUE5SUdoaGJtUnNaWEl1YzJ4cFkyVW9LVHRjYmlBZ0lDQnNaVzRnUFNCc2FYTjBaVzVsY25NdWJHVnVaM1JvTzF4dUlDQWdJR1p2Y2lBb2FTQTlJREE3SUdrZ1BDQnNaVzQ3SUdrckt5bGNiaUFnSUNBZ0lHeHBjM1JsYm1WeWMxdHBYUzVoY0hCc2VTaDBhR2x6TENCaGNtZHpLVHRjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUIwY25WbE8xeHVmVHRjYmx4dVJYWmxiblJGYldsMGRHVnlMbkJ5YjNSdmRIbHdaUzVoWkdSTWFYTjBaVzVsY2lBOUlHWjFibU4wYVc5dUtIUjVjR1VzSUd4cGMzUmxibVZ5S1NCN1hHNGdJSFpoY2lCdE8xeHVYRzRnSUdsbUlDZ2hhWE5HZFc1amRHbHZiaWhzYVhOMFpXNWxjaWtwWEc0Z0lDQWdkR2h5YjNjZ1ZIbHdaVVZ5Y205eUtDZHNhWE4wWlc1bGNpQnRkWE4wSUdKbElHRWdablZ1WTNScGIyNG5LVHRjYmx4dUlDQnBaaUFvSVhSb2FYTXVYMlYyWlc1MGN5bGNiaUFnSUNCMGFHbHpMbDlsZG1WdWRITWdQU0I3ZlR0Y2JseHVJQ0F2THlCVWJ5QmhkbTlwWkNCeVpXTjFjbk5wYjI0Z2FXNGdkR2hsSUdOaGMyVWdkR2hoZENCMGVYQmxJRDA5UFNCY0ltNWxkMHhwYzNSbGJtVnlYQ0loSUVKbFptOXlaVnh1SUNBdkx5QmhaR1JwYm1jZ2FYUWdkRzhnZEdobElHeHBjM1JsYm1WeWN5d2dabWx5YzNRZ1pXMXBkQ0JjSW01bGQweHBjM1JsYm1WeVhDSXVYRzRnSUdsbUlDaDBhR2x6TGw5bGRtVnVkSE11Ym1WM1RHbHpkR1Z1WlhJcFhHNGdJQ0FnZEdocGN5NWxiV2wwS0NkdVpYZE1hWE4wWlc1bGNpY3NJSFI1Y0dVc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUdselJuVnVZM1JwYjI0b2JHbHpkR1Z1WlhJdWJHbHpkR1Z1WlhJcElEOWNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2JHbHpkR1Z1WlhJdWJHbHpkR1Z1WlhJZ09pQnNhWE4wWlc1bGNpazdYRzVjYmlBZ2FXWWdLQ0YwYUdsekxsOWxkbVZ1ZEhOYmRIbHdaVjBwWEc0Z0lDQWdMeThnVDNCMGFXMXBlbVVnZEdobElHTmhjMlVnYjJZZ2IyNWxJR3hwYzNSbGJtVnlMaUJFYjI0bmRDQnVaV1ZrSUhSb1pTQmxlSFJ5WVNCaGNuSmhlU0J2WW1wbFkzUXVYRzRnSUNBZ2RHaHBjeTVmWlhabGJuUnpXM1I1Y0dWZElEMGdiR2x6ZEdWdVpYSTdYRzRnSUdWc2MyVWdhV1lnS0dselQySnFaV04wS0hSb2FYTXVYMlYyWlc1MGMxdDBlWEJsWFNrcFhHNGdJQ0FnTHk4Z1NXWWdkMlVuZG1VZ1lXeHlaV0ZrZVNCbmIzUWdZVzRnWVhKeVlYa3NJR3AxYzNRZ1lYQndaVzVrTGx4dUlDQWdJSFJvYVhNdVgyVjJaVzUwYzF0MGVYQmxYUzV3ZFhOb0tHeHBjM1JsYm1WeUtUdGNiaUFnWld4elpWeHVJQ0FnSUM4dklFRmtaR2x1WnlCMGFHVWdjMlZqYjI1a0lHVnNaVzFsYm5Rc0lHNWxaV1FnZEc4Z1kyaGhibWRsSUhSdklHRnljbUY1TGx4dUlDQWdJSFJvYVhNdVgyVjJaVzUwYzF0MGVYQmxYU0E5SUZ0MGFHbHpMbDlsZG1WdWRITmJkSGx3WlYwc0lHeHBjM1JsYm1WeVhUdGNibHh1SUNBdkx5QkRhR1ZqYXlCbWIzSWdiR2x6ZEdWdVpYSWdiR1ZoYTF4dUlDQnBaaUFvYVhOUFltcGxZM1FvZEdocGN5NWZaWFpsYm5SelczUjVjR1ZkS1NBbUppQWhkR2hwY3k1ZlpYWmxiblJ6VzNSNWNHVmRMbmRoY201bFpDa2dlMXh1SUNBZ0lHbG1JQ2doYVhOVmJtUmxabWx1WldRb2RHaHBjeTVmYldGNFRHbHpkR1Z1WlhKektTa2dlMXh1SUNBZ0lDQWdiU0E5SUhSb2FYTXVYMjFoZUV4cGMzUmxibVZ5Y3p0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdiU0E5SUVWMlpXNTBSVzFwZEhSbGNpNWtaV1poZFd4MFRXRjRUR2x6ZEdWdVpYSnpPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHbG1JQ2h0SUNZbUlHMGdQaUF3SUNZbUlIUm9hWE11WDJWMlpXNTBjMXQwZVhCbFhTNXNaVzVuZEdnZ1BpQnRLU0I3WEc0Z0lDQWdJQ0IwYUdsekxsOWxkbVZ1ZEhOYmRIbHdaVjB1ZDJGeWJtVmtJRDBnZEhKMVpUdGNiaUFnSUNBZ0lHTnZibk52YkdVdVpYSnliM0lvSnlodWIyUmxLU0IzWVhKdWFXNW5PaUJ3YjNOemFXSnNaU0JGZG1WdWRFVnRhWFIwWlhJZ2JXVnRiM0o1SUNjZ0sxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FuYkdWaGF5QmtaWFJsWTNSbFpDNGdKV1FnYkdsemRHVnVaWEp6SUdGa1pHVmtMaUFuSUN0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdKMVZ6WlNCbGJXbDBkR1Z5TG5ObGRFMWhlRXhwYzNSbGJtVnljeWdwSUhSdklHbHVZM0psWVhObElHeHBiV2wwTGljc1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdVgyVjJaVzUwYzF0MGVYQmxYUzVzWlc1bmRHZ3BPMXh1SUNBZ0lDQWdhV1lnS0hSNWNHVnZaaUJqYjI1emIyeGxMblJ5WVdObElEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lDOHZJRzV2ZENCemRYQndiM0owWldRZ2FXNGdTVVVnTVRCY2JpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1MGNtRmpaU2dwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhKbGRIVnliaUIwYUdsek8xeHVmVHRjYmx4dVJYWmxiblJGYldsMGRHVnlMbkJ5YjNSdmRIbHdaUzV2YmlBOUlFVjJaVzUwUlcxcGRIUmxjaTV3Y205MGIzUjVjR1V1WVdSa1RHbHpkR1Z1WlhJN1hHNWNia1YyWlc1MFJXMXBkSFJsY2k1d2NtOTBiM1I1Y0dVdWIyNWpaU0E5SUdaMWJtTjBhVzl1S0hSNWNHVXNJR3hwYzNSbGJtVnlLU0I3WEc0Z0lHbG1JQ2doYVhOR2RXNWpkR2x2Ymloc2FYTjBaVzVsY2lrcFhHNGdJQ0FnZEdoeWIzY2dWSGx3WlVWeWNtOXlLQ2RzYVhOMFpXNWxjaUJ0ZFhOMElHSmxJR0VnWm5WdVkzUnBiMjRuS1R0Y2JseHVJQ0IyWVhJZ1ptbHlaV1FnUFNCbVlXeHpaVHRjYmx4dUlDQm1kVzVqZEdsdmJpQm5LQ2tnZTF4dUlDQWdJSFJvYVhNdWNtVnRiM1psVEdsemRHVnVaWElvZEhsd1pTd2daeWs3WEc1Y2JpQWdJQ0JwWmlBb0lXWnBjbVZrS1NCN1hHNGdJQ0FnSUNCbWFYSmxaQ0E5SUhSeWRXVTdYRzRnSUNBZ0lDQnNhWE4wWlc1bGNpNWhjSEJzZVNoMGFHbHpMQ0JoY21kMWJXVnVkSE1wTzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUdjdWJHbHpkR1Z1WlhJZ1BTQnNhWE4wWlc1bGNqdGNiaUFnZEdocGN5NXZiaWgwZVhCbExDQm5LVHRjYmx4dUlDQnlaWFIxY200Z2RHaHBjenRjYm4wN1hHNWNiaTh2SUdWdGFYUnpJR0VnSjNKbGJXOTJaVXhwYzNSbGJtVnlKeUJsZG1WdWRDQnBabVlnZEdobElHeHBjM1JsYm1WeUlIZGhjeUJ5WlcxdmRtVmtYRzVGZG1WdWRFVnRhWFIwWlhJdWNISnZkRzkwZVhCbExuSmxiVzkyWlV4cGMzUmxibVZ5SUQwZ1puVnVZM1JwYjI0b2RIbHdaU3dnYkdsemRHVnVaWElwSUh0Y2JpQWdkbUZ5SUd4cGMzUXNJSEJ2YzJsMGFXOXVMQ0JzWlc1bmRHZ3NJR2s3WEc1Y2JpQWdhV1lnS0NGcGMwWjFibU4wYVc5dUtHeHBjM1JsYm1WeUtTbGNiaUFnSUNCMGFISnZkeUJVZVhCbFJYSnliM0lvSjJ4cGMzUmxibVZ5SUcxMWMzUWdZbVVnWVNCbWRXNWpkR2x2YmljcE8xeHVYRzRnSUdsbUlDZ2hkR2hwY3k1ZlpYWmxiblJ6SUh4OElDRjBhR2x6TGw5bGRtVnVkSE5iZEhsd1pWMHBYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTTdYRzVjYmlBZ2JHbHpkQ0E5SUhSb2FYTXVYMlYyWlc1MGMxdDBlWEJsWFR0Y2JpQWdiR1Z1WjNSb0lEMGdiR2x6ZEM1c1pXNW5kR2c3WEc0Z0lIQnZjMmwwYVc5dUlEMGdMVEU3WEc1Y2JpQWdhV1lnS0d4cGMzUWdQVDA5SUd4cGMzUmxibVZ5SUh4OFhHNGdJQ0FnSUNBb2FYTkdkVzVqZEdsdmJpaHNhWE4wTG14cGMzUmxibVZ5S1NBbUppQnNhWE4wTG14cGMzUmxibVZ5SUQwOVBTQnNhWE4wWlc1bGNpa3BJSHRjYmlBZ0lDQmtaV3hsZEdVZ2RHaHBjeTVmWlhabGJuUnpXM1I1Y0dWZE8xeHVJQ0FnSUdsbUlDaDBhR2x6TGw5bGRtVnVkSE11Y21WdGIzWmxUR2x6ZEdWdVpYSXBYRzRnSUNBZ0lDQjBhR2x6TG1WdGFYUW9KM0psYlc5MlpVeHBjM1JsYm1WeUp5d2dkSGx3WlN3Z2JHbHpkR1Z1WlhJcE8xeHVYRzRnSUgwZ1pXeHpaU0JwWmlBb2FYTlBZbXBsWTNRb2JHbHpkQ2twSUh0Y2JpQWdJQ0JtYjNJZ0tHa2dQU0JzWlc1bmRHZzdJR2t0TFNBK0lEQTdLU0I3WEc0Z0lDQWdJQ0JwWmlBb2JHbHpkRnRwWFNBOVBUMGdiR2x6ZEdWdVpYSWdmSHhjYmlBZ0lDQWdJQ0FnSUNBb2JHbHpkRnRwWFM1c2FYTjBaVzVsY2lBbUppQnNhWE4wVzJsZExteHBjM1JsYm1WeUlEMDlQU0JzYVhOMFpXNWxjaWtwSUh0Y2JpQWdJQ0FnSUNBZ2NHOXphWFJwYjI0Z1BTQnBPMXh1SUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9jRzl6YVhScGIyNGdQQ0F3S1Z4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNN1hHNWNiaUFnSUNCcFppQW9iR2x6ZEM1c1pXNW5kR2dnUFQwOUlERXBJSHRjYmlBZ0lDQWdJR3hwYzNRdWJHVnVaM1JvSUQwZ01EdGNiaUFnSUNBZ0lHUmxiR1YwWlNCMGFHbHpMbDlsZG1WdWRITmJkSGx3WlYwN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJR3hwYzNRdWMzQnNhV05sS0hCdmMybDBhVzl1TENBeEtUdGNiaUFnSUNCOVhHNWNiaUFnSUNCcFppQW9kR2hwY3k1ZlpYWmxiblJ6TG5KbGJXOTJaVXhwYzNSbGJtVnlLVnh1SUNBZ0lDQWdkR2hwY3k1bGJXbDBLQ2R5WlcxdmRtVk1hWE4wWlc1bGNpY3NJSFI1Y0dVc0lHeHBjM1JsYm1WeUtUdGNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQjBhR2x6TzF4dWZUdGNibHh1UlhabGJuUkZiV2wwZEdWeUxuQnliM1J2ZEhsd1pTNXlaVzF2ZG1WQmJHeE1hWE4wWlc1bGNuTWdQU0JtZFc1amRHbHZiaWgwZVhCbEtTQjdYRzRnSUhaaGNpQnJaWGtzSUd4cGMzUmxibVZ5Y3p0Y2JseHVJQ0JwWmlBb0lYUm9hWE11WDJWMlpXNTBjeWxjYmlBZ0lDQnlaWFIxY200Z2RHaHBjenRjYmx4dUlDQXZMeUJ1YjNRZ2JHbHpkR1Z1YVc1bklHWnZjaUJ5WlcxdmRtVk1hWE4wWlc1bGNpd2dibThnYm1WbFpDQjBieUJsYldsMFhHNGdJR2xtSUNnaGRHaHBjeTVmWlhabGJuUnpMbkpsYlc5MlpVeHBjM1JsYm1WeUtTQjdYRzRnSUNBZ2FXWWdLR0Z5WjNWdFpXNTBjeTVzWlc1bmRHZ2dQVDA5SURBcFhHNGdJQ0FnSUNCMGFHbHpMbDlsZG1WdWRITWdQU0I3ZlR0Y2JpQWdJQ0JsYkhObElHbG1JQ2gwYUdsekxsOWxkbVZ1ZEhOYmRIbHdaVjBwWEc0Z0lDQWdJQ0JrWld4bGRHVWdkR2hwY3k1ZlpYWmxiblJ6VzNSNWNHVmRPMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpPMXh1SUNCOVhHNWNiaUFnTHk4Z1pXMXBkQ0J5WlcxdmRtVk1hWE4wWlc1bGNpQm1iM0lnWVd4c0lHeHBjM1JsYm1WeWN5QnZiaUJoYkd3Z1pYWmxiblJ6WEc0Z0lHbG1JQ2hoY21kMWJXVnVkSE11YkdWdVozUm9JRDA5UFNBd0tTQjdYRzRnSUNBZ1ptOXlJQ2hyWlhrZ2FXNGdkR2hwY3k1ZlpYWmxiblJ6S1NCN1hHNGdJQ0FnSUNCcFppQW9hMlY1SUQwOVBTQW5jbVZ0YjNabFRHbHpkR1Z1WlhJbktTQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lIUm9hWE11Y21WdGIzWmxRV3hzVEdsemRHVnVaWEp6S0d0bGVTazdYRzRnSUNBZ2ZWeHVJQ0FnSUhSb2FYTXVjbVZ0YjNabFFXeHNUR2x6ZEdWdVpYSnpLQ2R5WlcxdmRtVk1hWE4wWlc1bGNpY3BPMXh1SUNBZ0lIUm9hWE11WDJWMlpXNTBjeUE5SUh0OU8xeHVJQ0FnSUhKbGRIVnliaUIwYUdsek8xeHVJQ0I5WEc1Y2JpQWdiR2x6ZEdWdVpYSnpJRDBnZEdocGN5NWZaWFpsYm5SelczUjVjR1ZkTzF4dVhHNGdJR2xtSUNocGMwWjFibU4wYVc5dUtHeHBjM1JsYm1WeWN5a3BJSHRjYmlBZ0lDQjBhR2x6TG5KbGJXOTJaVXhwYzNSbGJtVnlLSFI1Y0dVc0lHeHBjM1JsYm1WeWN5azdYRzRnSUgwZ1pXeHpaU0JwWmlBb2JHbHpkR1Z1WlhKektTQjdYRzRnSUNBZ0x5OGdURWxHVHlCdmNtUmxjbHh1SUNBZ0lIZG9hV3hsSUNoc2FYTjBaVzVsY25NdWJHVnVaM1JvS1Z4dUlDQWdJQ0FnZEdocGN5NXlaVzF2ZG1WTWFYTjBaVzVsY2loMGVYQmxMQ0JzYVhOMFpXNWxjbk5iYkdsemRHVnVaWEp6TG14bGJtZDBhQ0F0SURGZEtUdGNiaUFnZlZ4dUlDQmtaV3hsZEdVZ2RHaHBjeTVmWlhabGJuUnpXM1I1Y0dWZE8xeHVYRzRnSUhKbGRIVnliaUIwYUdsek8xeHVmVHRjYmx4dVJYWmxiblJGYldsMGRHVnlMbkJ5YjNSdmRIbHdaUzVzYVhOMFpXNWxjbk1nUFNCbWRXNWpkR2x2YmloMGVYQmxLU0I3WEc0Z0lIWmhjaUJ5WlhRN1hHNGdJR2xtSUNnaGRHaHBjeTVmWlhabGJuUnpJSHg4SUNGMGFHbHpMbDlsZG1WdWRITmJkSGx3WlYwcFhHNGdJQ0FnY21WMElEMGdXMTA3WEc0Z0lHVnNjMlVnYVdZZ0tHbHpSblZ1WTNScGIyNG9kR2hwY3k1ZlpYWmxiblJ6VzNSNWNHVmRLU2xjYmlBZ0lDQnlaWFFnUFNCYmRHaHBjeTVmWlhabGJuUnpXM1I1Y0dWZFhUdGNiaUFnWld4elpWeHVJQ0FnSUhKbGRDQTlJSFJvYVhNdVgyVjJaVzUwYzF0MGVYQmxYUzV6YkdsalpTZ3BPMXh1SUNCeVpYUjFjbTRnY21WME8xeHVmVHRjYmx4dVJYWmxiblJGYldsMGRHVnlMbkJ5YjNSdmRIbHdaUzVzYVhOMFpXNWxja052ZFc1MElEMGdablZ1WTNScGIyNG9kSGx3WlNrZ2UxeHVJQ0JwWmlBb2RHaHBjeTVmWlhabGJuUnpLU0I3WEc0Z0lDQWdkbUZ5SUdWMmJHbHpkR1Z1WlhJZ1BTQjBhR2x6TGw5bGRtVnVkSE5iZEhsd1pWMDdYRzVjYmlBZ0lDQnBaaUFvYVhOR2RXNWpkR2x2YmlobGRteHBjM1JsYm1WeUtTbGNiaUFnSUNBZ0lISmxkSFZ5YmlBeE8xeHVJQ0FnSUdWc2MyVWdhV1lnS0dWMmJHbHpkR1Z1WlhJcFhHNGdJQ0FnSUNCeVpYUjFjbTRnWlhac2FYTjBaVzVsY2k1c1pXNW5kR2c3WEc0Z0lIMWNiaUFnY21WMGRYSnVJREE3WEc1OU8xeHVYRzVGZG1WdWRFVnRhWFIwWlhJdWJHbHpkR1Z1WlhKRGIzVnVkQ0E5SUdaMWJtTjBhVzl1S0dWdGFYUjBaWElzSUhSNWNHVXBJSHRjYmlBZ2NtVjBkWEp1SUdWdGFYUjBaWEl1YkdsemRHVnVaWEpEYjNWdWRDaDBlWEJsS1R0Y2JuMDdYRzVjYm1aMWJtTjBhVzl1SUdselJuVnVZM1JwYjI0b1lYSm5LU0I3WEc0Z0lISmxkSFZ5YmlCMGVYQmxiMllnWVhKbklEMDlQU0FuWm5WdVkzUnBiMjRuTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJwYzA1MWJXSmxjaWhoY21jcElIdGNiaUFnY21WMGRYSnVJSFI1Y0dWdlppQmhjbWNnUFQwOUlDZHVkVzFpWlhJbk8xeHVmVnh1WEc1bWRXNWpkR2x2YmlCcGMwOWlhbVZqZENoaGNtY3BJSHRjYmlBZ2NtVjBkWEp1SUhSNWNHVnZaaUJoY21jZ1BUMDlJQ2R2WW1wbFkzUW5JQ1ltSUdGeVp5QWhQVDBnYm5Wc2JEdGNibjFjYmx4dVpuVnVZM1JwYjI0Z2FYTlZibVJsWm1sdVpXUW9ZWEpuS1NCN1hHNGdJSEpsZEhWeWJpQmhjbWNnUFQwOUlIWnZhV1FnTUR0Y2JuMWNibHh1WEc1Y2JpOHZMeTh2THk4dkx5OHZMeTh2THk4dkwxeHVMeThnVjBWQ1VFRkRTeUJHVDA5VVJWSmNiaTh2SUM0dmZpOWxkbVZ1ZEhNdlpYWmxiblJ6TG1welhHNHZMeUJ0YjJSMWJHVWdhV1FnUFNBeE1GeHVMeThnYlc5a2RXeGxJR05vZFc1cmN5QTlJREFpTENJbmRYTmxJSE4wY21samRDYzdYRzVjYm14bGRDQnRZWFJvSUQwZ2NtVnhkV2x5WlNnbkxpNHZkWFJwYkM5dFlYUm9KeWs3WEc1Y2JpOHFLbHh1SUNCRGNtVmhkR1Z6SUdFZ2MzUmxjSEJoWW14bElIWmhiSFZsSUhkcGRHZ2diV2x1YVcxMWJTd2diV0Y0YVcxMWJTd2dZVzVrSUhOMFpYQWdjMmw2WlM0Z1ZHaHBjeUJwY3lCMWMyVmtJR2x1SUcxaGJua2dhVzUwWlhKbVlXTmxjeUIwYnlCamIyNXpkSEpwWTNRZ2RHaGxhWElnZG1Gc2RXVnpJSFJ2SUdObGNuUmhhVzRnY21GdVoyVnpMbHh1SUNCQWNHRnlZVzBnZTI1MWJXSmxjbjBnVzIxcGJqMHdYU0J0YVc1cGJYVnRYRzRnSUVCd1lYSmhiU0I3Ym5WdFltVnlmU0JiYldGNFBURmRJRzFoZUdsdGRXMWNiaUFnUUhCaGNtRnRJSHR1ZFcxaVpYSjlJRnR6ZEdWd1BUQmRYRzRnSUVCd1lYSmhiU0I3Ym5WdFltVnlmU0JiZG1Gc2RXVTlNRjBnYVc1cGRHbGhiQ0IyWVd4MVpWeHVJQ0JBY21WMGRYSnVjeUI3VDJKcVpXTjBmU0JUZEdWd1hHNHFMMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JqYkdGemN5QlRkR1Z3SUh0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2lodGFXNGdQU0F3TEcxaGVDQTlJREVzYzNSbGNDQTlJREFzZG1Gc2RXVWdQU0F3S1NCN1hHNGdJQ0FnTHk5UFltcGxZM1F1WVhOemFXZHVLSFJvYVhNc2UyMXBiaXh0WVhnc2MzUmxjSDBwTzF4dUlDQWdJQzh2UTJGdWJtOTBJSFZ6WlNCUFltcGxZM1F1WVhOemFXZHVJR0psWTJGMWMyVWdibTkwSUhOMWNIQnZjblJsWkNCcGJpQlRZV1poY21rdVhHNGdJQ0FnTHk5SklIZHZkV3hrSUdWNGNHVmpkQ0JtYjNJZ1FtRmlaV3dnZEc4Z2RHRnJaU0JqWVhKbElHOW1JSFJvYVhNZ1luVjBJR2wwSUdseklHNXZkQzVjYmlBZ0lDQjBhR2x6TG0xcGJpQTlJRzFwYmp0Y2JpQWdJQ0IwYUdsekxtMWhlQ0E5SUcxaGVEdGNiaUFnSUNCMGFHbHpMbk4wWlhBZ1BTQnpkR1Z3TzF4dUlDQWdJSFJvYVhNdWRtRnNkV1VnUFNCMllXeDFaVHRjYmlBZ0lDQjBhR2x6TG1Ob1lXNW5aV1FnUFNCbVlXeHpaVHRjYmlBZ0lDQjBhR2x6TG05c1pGWmhiSFZsSUQwZ1ptRnNjMlU3WEc0Z0lDQWdkR2hwY3k1MWNHUmhkR1VvZEdocGN5NTJZV3gxWlNrN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ0lDQlZjR1JoZEdVZ2QybDBhQ0JoSUc1bGR5QjJZV3gxWlM0Z1ZHaGxJSFpoYkhWbElIZHBiR3dnWW1VZ1lYVjBieTFoWkdwMWMzUmxaQ0IwYnlCbWFYUWdkR2hsSUcxcGJpOXRZWGd2YzNSbGNDNWNiaUFnSUNCQWNHRnlZVzBnZTI1MWJXSmxjbjBnZG1Gc2RXVmNiaUFnS2k5Y2JseHVJQ0IxY0dSaGRHVW9kbUZzZFdVcElIdGNiaUFnSUNCcFppQW9kR2hwY3k1emRHVndLU0I3WEc0Z0lDQWdJQ0F2THlCMGFHbHpMblpoYkhWbElEMGdiV0YwYUM1amJHbHdLRTFoZEdndWNtOTFibVFvZG1Gc2RXVWdMeUFvZEdocGN5NXpkR1Z3S1NrZ0tpQjBhR2x6TG5OMFpYQXNJSFJvYVhNdWJXbHVMSFJvYVhNdWJXRjRLVHRjYmlBZ0lDQWdJSFJvYVhNdWRtRnNkV1VnUFNCdFlYUm9MbU5zYVhBb1RXRjBhQzV5YjNWdVpDZ29kbUZzZFdVdGRHaHBjeTV0YVc0cElDOGdLSFJvYVhNdWMzUmxjQ2twSUNvZ2RHaHBjeTV6ZEdWd0lDc2dkR2hwY3k1dGFXNHNJSFJvYVhNdWJXbHVMSFJvYVhNdWJXRjRLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RHaHBjeTUyWVd4MVpTQTlJRzFoZEdndVkyeHBjQ2gyWVd4MVpTeDBhR2x6TG0xcGJpeDBhR2x6TG0xaGVDazdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaDBhR2x6TG05c1pGWmhiSFZsSUNFOVBTQjBhR2x6TG5aaGJIVmxLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtOXNaRlpoYkhWbElEMGdkR2hwY3k1MllXeDFaVHRjYmlBZ0lDQWdJSFJvYVhNdVkyaGhibWRsWkNBOUlIUnlkV1U3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIUm9hWE11WTJoaGJtZGxaQ0E5SUdaaGJITmxPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NTJZV3gxWlR0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNBZ0lGVndaR0YwWlNCM2FYUm9JR0VnYm05eWJXRnNhWHBsWkNCMllXeDFaU0F3TFRFdVhHNGdJQ0FnUUhCaGNtRnRJSHR1ZFcxaVpYSjlJSFpoYkhWbFhHNGdJQ292WEc0Z0lIVndaR0YwWlU1dmNtMWhiQ2gyWVd4MVpTa2dlMXh1SUNBZ0lIUm9hWE11ZG1Gc2RXVWdQU0J0WVhSb0xuTmpZV3hsS0haaGJIVmxMREFzTVN4MGFHbHpMbTFwYml4MGFHbHpMbTFoZUNrN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdWRYQmtZWFJsS0hSb2FYTXVkbUZzZFdVcE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQWdSMlYwSUdFZ2JtOXliV0ZzYVhwbFpDQjJaWEp6YVc5dUlHOW1JSFJvYVhNdWRtRnNkV1VnTGlCT2IzUWdjMlYwZEdGaWJHVXVYRzRnSUNvdlhHNGdJR2RsZENCdWIzSnRZV3hwZW1Wa0tDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCdFlYUm9MbTV2Y20xaGJHbDZaU2gwYUdsekxuWmhiSFZsTEhSb2FYTXViV2x1TEhSb2FYTXViV0Y0S1R0Y2JpQWdmVnh1WEc1OVhHNWNibHh1WEc0dkx5QlhSVUpRUVVOTElFWlBUMVJGVWlBdkwxeHVMeThnTGk5K0wycHphR2x1ZEMxc2IyRmtaWEloTGk5c2FXSXZiVzlrWld4ekwzTjBaWEF1YW5NaUxDSW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JtbHRjRzl5ZENCdFlYUm9JR1p5YjIwZ0p5NHVMM1YwYVd3dmJXRjBhQ2M3WEc1cGJYQnZjblFnVkc5bloyeGxUVzlrWld3Z1puSnZiU0FuTGk0dmJXOWtaV3h6TDNSdloyZHNaU2M3WEc1Y2JseHVMeXBjYm1odmR5QjBieUIxYzJVZ09seHVYRzVrYVdGc0xtbHVkR1Z5WVdOMGFXOXVJRDBnYm1WM0lFaGhibVJzWlNnbmNtRmthV0ZzSnl3bmNtVnNZWFJwZG1VbkxIUm9hWE11ZDJsa2RHZ3NkR2hwY3k1b1pXbG5hSFFwTzF4dUx5OGdaR2xoYkM1cGJuUmxjbUZqZEdsdmJpNXRiMlJsSUQwZ0ozSmxiR0YwYVhabEoxeHVMeThnWkdsaGJDNXBiblJsY21GamRHbHZiaTVrYVhKbFkzUnBiMjRnUFNBbmNtRmthV0ZzSjF4dVhHNXZiaUJqYkdsamF6cGNibVJwWVd3dWFXNTBaWEpoWTNScGIyNHVZVzVqYUc5eUlEMGdkR2hwY3k1dGIzVnpaVHRjYmx4dWIyNGdiVzkyWlRwY2JtUnBZV3d1YVc1MFpYSmhZM1JwYjI0dWRYQmtZWFJsS0hSb2FYTXViVzkxYzJVcE8xeHVYRzVqYjI1emIyeGxMbXh2WnlnZ1pHbGhiQzVwYm5SbGNtRmpkR2x2Ymk1MllXeDFaU0FwT3lCemFHOTFiR1FnWW1VZ1lTQnViM0p0WVd4cGVtVmtJSFpoYkhWbExseHVYRzRxTDF4dVhHNHZLbHh1SUNCaFluTnZiSFYwWlM5eVpXeGhkR2wyWlNCaGNtVWdjSEp2Y0dWeWRIazZJRzF2WkdWY2JpQWdjbUZrYVdGc0wzWmxjblJwWTJGc0wyaHZjbWw2YjI1MFlXd3ZNbVFnWVhKbElIQnliM0JsY25SNU9pQmthWEpsWTNScGIyNWNibHh1SUNCd2JHRnVJRHBjYmx4dUlDQnBaaUJ5Wld4aGRHbDJaU0F0TFZ4dUlDQk9UeUJ2YmlCamJHbGpheXdnWjJWMElIWmhiSFZsSUc5bVpuTmxkQ0JpWlhSM1pXVnVJR04xY25KbGJuUWdkbUZzZFdVZ1lXNWtJR05zYVdOcklIWmhiSFZsTGx4dUlDQk9UeUJ2YmlCdGIzWmxMQ0IxYzJVZ1kyeHBZMnNnZG1Gc2RXVWdMU0J2Wm1aelpYUmNiaUFnU1U1VFZFVkJSRnh1SUNCMWMyVWdaR1ZzZEdFZ0xTMGdZbU1nZG1WeWRHbGpZV3dnYlc5MGFXOXVJRzl1SUdScFlXd2dhWE1nYVcxd2IzTnphV0pzWlNCdmRHaGxjbmRwYzJWY2JpQWdZV3h6YnlCaGJHeHZkeUIwYnlCelpYUWdjMlZ1YzJsMGFYWnBkSGxjYmx4dUtpOWNibHh1Wlhod2IzSjBJR05zWVhOeklFaGhibVJzWlNCN1hHNWNiaUFnWTI5dWMzUnlkV04wYjNJb2JXOWtaVDBuWVdKemIyeDFkR1VuTEdScGNtVmpkR2x2YmowbmRtVnlkR2xqWVd3bkxIaGliM1Z1WkQxYk1Dd3hNREJkTEhsaWIzVnVaRDFiTUN3eE1EQmRLU0I3WEc0Z0lDQWdkR2hwY3k1dGIyUmxJRDBnYlc5a1pUdGNiaUFnSUNCMGFHbHpMbVJwY21WamRHbHZiaUE5SUdScGNtVmpkR2x2Ymp0Y2JpQWdJQ0IwYUdsekxuQnlaWFpwYjNWeklEMGdNRHRjYmlBZ0lDQjBhR2x6TG5aaGJIVmxJRDBnTUR0Y2JpQWdJQ0IwYUdsekxuTmxibk5wZEdsMmFYUjVJRDBnTVR0Y2JpQWdJQ0IwYUdsekxuSmxjMmw2WlNoNFltOTFibVFzZVdKdmRXNWtLVHRjYmlBZ2ZWeHVYRzRnSUhKbGMybDZaU2g0WW05MWJtUXNlV0p2ZFc1a0tTQjdYRzRnSUNBZ2RHaHBjeTVpYjNWdVpHRnllU0E5SUh0Y2JpQWdJQ0FnSUcxcGJqb2dlMXh1SUNBZ0lDQWdJQ0I0T2lCNFltOTFibVJiTUYwc1hHNGdJQ0FnSUNBZ0lIazZJSGxpYjNWdVpGc3dYVnh1SUNBZ0lDQWdmU3hjYmlBZ0lDQWdJRzFoZURvZ2UxeHVJQ0FnSUNBZ0lDQjRPaUI0WW05MWJtUmJNVjBzWEc0Z0lDQWdJQ0FnSUhrNklIbGliM1Z1WkZzeFhWeHVJQ0FnSUNBZ2ZTeGNiaUFnSUNBZ0lHTmxiblJsY2pvZ2UxeHVJQ0FnSUNBZ0lDQjRPaUFvZUdKdmRXNWtXekZkSUMwZ2VHSnZkVzVrV3pCZEtTOHlJQ3NnZUdKdmRXNWtXekJkTEZ4dUlDQWdJQ0FnSUNCNU9pQW9lV0p2ZFc1a1d6RmRJQzBnZVdKdmRXNWtXekJkS1M4eUlDc2dlV0p2ZFc1a1d6QmRYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZUdGNiaUFnZlZ4dVhHNGdJSE5sZENCaGJtTm9iM0lvYlc5MWMyVXBJSHRjYmlBZ0lDQjBhR2x6TGw5aGJtTm9iM0lnUFNCMGFHbHpMbU52Ym5abGNuUlFiM05wZEdsdmJsUnZWbUZzZFdVb2JXOTFjMlVwTzF4dUlDQjlYRzVjYmlBZ1oyVjBJR0Z1WTJodmNpZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVmWVc1amFHOXlPMXh1SUNCOVhHNWNibHh1SUNCMWNHUmhkR1VvYlc5MWMyVXBJSHRjYmlBZ0lDQnBaaUFvZEdocGN5NXRiMlJsUFQwOUozSmxiR0YwYVhabEp5a2dlMXh1SUNBZ0lDQWdiR1YwSUdsdVkzSmxiV1Z1ZENBOUlIUm9hWE11WTI5dWRtVnlkRkJ2YzJsMGFXOXVWRzlXWVd4MVpTaHRiM1Z6WlNrZ0xTQjBhR2x6TG1GdVkyaHZjanRjYmlBZ0lDQWdJR2xtSUNoTllYUm9MbUZpY3locGJtTnlaVzFsYm5RcElENGdNQzQxS1NCN0lHbHVZM0psYldWdWRDQTlJREE3SUgxY2JpQWdJQ0FnSUhSb2FYTXVZVzVqYUc5eUlEMGdiVzkxYzJVN1hHNGdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdkR2hwY3k1MllXeDFaU0FySUdsdVkzSmxiV1Z1ZENBcUlIUm9hWE11YzJWdWMybDBhWFpwZEhrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSFJvYVhNdWRtRnNkV1VnUFNCMGFHbHpMbU52Ym5abGNuUlFiM05wZEdsdmJsUnZWbUZzZFdVb2JXOTFjMlVwTzF4dUlDQWdJSDFjYmlBZ0lDQjBhR2x6TG5aaGJIVmxJRDBnYldGMGFDNWpiR2x3S0hSb2FYTXVkbUZzZFdVc01Dd3hLVHRjYmlBZ2ZWeHVYRzRnSUdOdmJuWmxjblJRYjNOcGRHbHZibFJ2Vm1Gc2RXVW9ZM1Z5Y21WdWRDa2dlMXh1SUNBZ0lITjNhWFJqYUNoMGFHbHpMbVJwY21WamRHbHZiaWtnZTF4dUlDQWdJQ0FnWTJGelpTQW5jbUZrYVdGc0p6cGNiaUFnSUNBZ0lDQWdiR1YwSUhCdmMybDBhVzl1SUQwZ2JXRjBhQzUwYjFCdmJHRnlLR04xY25KbGJuUXVlQ0F0SUhSb2FYTXVZbTkxYm1SaGNua3VZMlZ1ZEdWeUxuZ3NJR04xY25KbGJuUXVlU0F0SUhSb2FYTXVZbTkxYm1SaGNua3VZMlZ1ZEdWeUxua3BPMXh1SUNBZ0lDQWdJQ0J3YjNOcGRHbHZiaUE5SUhCdmMybDBhVzl1TG1GdVoyeGxJQzhnS0UxaGRHZ3VVRWtxTWlrN1hHNGdJQ0FnSUNBZ0lIQnZjMmwwYVc5dUlEMGdLQ2h3YjNOcGRHbHZiaUF0SURBdU1qVXBJQ3NnTVNrZ0pTQXhPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjRzl6YVhScGIyNDdYRzRnSUNBZ0lDQmpZWE5sSUNkMlpYSjBhV05oYkNjNlhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCdFlYUm9Mbk5qWVd4bEtHTjFjbkpsYm5RdWVTeDBhR2x6TG1KdmRXNWtZWEo1TG0xcGJpNTVMSFJvYVhNdVltOTFibVJoY25rdWJXRjRMbmtzTUN3eEtUdGNiaUFnSUNBZ0lHTmhjMlVnSjJodmNtbDZiMjUwWVd3bk9seHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2JXRjBhQzV6WTJGc1pTaGpkWEp5Wlc1MExuZ3NkR2hwY3k1aWIzVnVaR0Z5ZVM1dGFXNHVlQ3gwYUdsekxtSnZkVzVrWVhKNUxtMWhlQzU0TERBc01TazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JuMWNibHh1WEc1bGVIQnZjblFnWTJ4aGMzTWdRblYwZEc5dUlIdGNibHh1SUNCamIyNXpkSEoxWTNSdmNpaHRiMlJsUFNkaWRYUjBiMjRuS1NCN1hHNGdJQ0FnZEdocGN5NXRiMlJsSUQwZ2JXOWtaVHRjYmlBZ0lDQjBhR2x6TG5OMFlYUmxJRDBnYm1WM0lGUnZaMmRzWlUxdlpHVnNLQ2s3WEc0Z0lDQWdkR2hwY3k1d1lXbHVkR0p5ZFhOb0lEMGdabUZzYzJVN1hHNGdJSDFjYmx4dUlDQmpiR2xqYXlncElIdGNiaUFnSUNCemQybDBZMmdnS0hSb2FYTXViVzlrWlNrZ2UxeHVJQ0FnSUNBZ1kyRnpaU0FuYVcxd2RXeHpaU2M2WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjM1JoZEdVdWIyNG9LVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11ZEdsdFpXOTFkQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHTnNaV0Z5VkdsdFpXOTFkQ2gwYUdsekxuUnBiV1Z2ZFhRcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJSFJvYVhNdWRHbHRaVzkxZENBOUlITmxkRlJwYldWdmRYUW9kR2hwY3k1emRHRjBaUzV2Wm1ZdVltbHVaQ2gwYUdsektTd3pNQ2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVaVzFwZENnblkyaGhibWRsSnl4MGFHbHpMbk4wWVhSbEtUdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCallYTmxJQ2RpZFhSMGIyNG5PbHh1SUNBZ0lDQWdJQ0IwYUdsekxuUjFjbTVQYmlncE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG1WdGFYUW9KMk5vWVc1blpTY3NkR2hwY3k1emRHRjBaU2s3WEc0Z0lDQWdJQ0FnSUdKeVpXRnJPMXh1SUNBZ0lDQWdZMkZ6WlNBbllXWjBaWEowYjNWamFDYzZYRzRnSUNBZ0lDQWdJSFJvYVhNdWNHOXphWFJwYjI0Z1BTQjdYRzRnSUNBZ0lDQWdJQ0FnZURvZ2JXRjBhQzVqYkdsd0tIUm9hWE11Ylc5MWMyVXVlQ0F2SUhSb2FYTXVkMmxrZEdnc01Dd3hLU3hjYmlBZ0lDQWdJQ0FnSUNCNU9pQnRZWFJvTG1Oc2FYQW9NU0F0SUhSb2FYTXViVzkxYzJVdWVTQXZJSFJvYVhNdWFHVnBaMmgwTERBc01TbGNiaUFnSUNBZ0lDQWdmVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTBkWEp1VDI0b0tUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSHRjYmlBZ0lDQWdJQ0FnSUNCemRHRjBaVG9nZEdocGN5NXpkR0YwWlN4Y2JpQWdJQ0FnSUNBZ0lDQjRPaUIwYUdsekxuQnZjMmwwYVc5dUxuZ3NYRzRnSUNBZ0lDQWdJQ0FnZVRvZ2RHaHBjeTV3YjNOcGRHbHZiaTU1TEZ4dUlDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdZbkpsWVdzN1hHNGdJQ0FnSUNCallYTmxJQ2QwYjJkbmJHVW5PbHh1SUNBZ0lDQWdJQ0IwYUdsekxtWnNhWEFvS1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVsYldsMEtDZGphR0Z1WjJVbkxIUm9hWE11YzNSaGRHVXBPMXh1SUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNCOVhHNWNiaUFnZlZ4dVhHNGdJRzF2ZG1Vb0tTQjdYRzRnSUNBZ2FXWWdLSFJvYVhNdWJXOWtaVDA5UFNkaFpuUmxjblJ2ZFdOb0p5a2dlMXh1SUNBZ0lDQWdkR2hwY3k1d2IzTnBkR2x2YmlBOUlIdGNiaUFnSUNBZ0lDQWdlRG9nYldGMGFDNWpiR2x3S0hSb2FYTXViVzkxYzJVdWVDQXZJSFJvYVhNdWQybGtkR2dzTUN3eEtTeGNiaUFnSUNBZ0lDQWdlVG9nYldGMGFDNWpiR2x3S0RFZ0xTQjBhR2x6TG0xdmRYTmxMbmtnTHlCMGFHbHpMbWhsYVdkb2RDd3dMREVwWEc0Z0lDQWdJQ0I5TzF4dUlDQWdJQ0FnZEdocGN5NWxiV2wwS0NkamFHRnVaMlVuTEh0Y2JpQWdJQ0FnSUNBZ2MzUmhkR1U2SUhSb2FYTXVjM1JoZEdVc1hHNGdJQ0FnSUNBZ0lIZzZJSFJvYVhNdWNHOXphWFJwYjI0dWVDeGNiaUFnSUNBZ0lDQWdlVG9nZEdocGN5NXdiM05wZEdsdmJpNTVMRnh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0IwYUdsekxuSmxibVJsY2lncE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxiR1ZoYzJVb0tTQjdYRzRnSUNBZ2MzZHBkR05vSUNoMGFHbHpMbTF2WkdVcElIdGNiaUFnSUNBZ0lHTmhjMlVnSjJKMWRIUnZiaWM2WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkSFZ5Yms5bVppZ3BPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzZEdocGN5NXpkR0YwWlNrN1hHNGdJQ0FnSUNBZ0lHSnlaV0ZyTzF4dUlDQWdJQ0FnWTJGelpTQW5ZV1owWlhKMGIzVmphQ2M2WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkSFZ5Yms5bVppZ3BPMXh1SUNBZ0lDQWdJQ0IwYUdsekxuQnZjMmwwYVc5dUlEMGdlMXh1SUNBZ0lDQWdJQ0FnSUhnNklIUm9hWE11Ylc5MWMyVXVlQ0F2SUhSb2FYTXVkMmxrZEdnc1hHNGdJQ0FnSUNBZ0lDQWdlVG9nTVNBdElIUm9hWE11Ylc5MWMyVXVlU0F2SUhSb2FYTXVhR1ZwWjJoMFhHNGdJQ0FnSUNBZ0lIMDdYRzRnSUNBZ0lDQWdJSFJvYVhNdVpXMXBkQ2duWTJoaGJtZGxKeXg3WEc0Z0lDQWdJQ0FnSUNBZ2MzUmhkR1U2SUhSb2FYTXVjM1JoZEdVc1hHNGdJQ0FnSUNBZ0lDQWdlRG9nZEdocGN5NXdiM05wZEdsdmJpNTRMRnh1SUNBZ0lDQWdJQ0FnSUhrNklIUm9hWE11Y0c5emFYUnBiMjR1ZVN4Y2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUgxY2JpQWdmVnh1ZlZ4dVhHNWNibHh1THk4Z1YwVkNVRUZEU3lCR1QwOVVSVklnTHk5Y2JpOHZJQzR2Zmk5cWMyaHBiblF0Ykc5aFpHVnlJUzR2YkdsaUwzVjBhV3d2YVc1MFpYSmhZM1JwYjI0dWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHTnNZWE56SUZSdloyZHNaU0I3WEc1Y2JpQWdZMjl1YzNSeWRXTjBiM0lvYzNSaGRHVXBJSHRjYmlBZ0lDQjBhR2x6TG5OMFlYUmxJRDBnYzNSaGRHVWdmSHdnWm1Gc2MyVTdYRzRnSUgxY2JseHVJQ0JtYkdsd0tITjBZWFJsS1NCN1hHNGdJQ0FnYVdZZ0tITjBZWFJsSUh4OElITjBZWFJsSUQwOVBTQm1ZV3h6WlNrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV6ZEdGMFpTQTlJSE4wWVhSbE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IwYUdsekxuTjBZWFJsSUQwZ0lYUm9hWE11YzNSaGRHVTdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdiMjRvS1NCN1hHNGdJQ0FnZEdocGN5NXpkR0YwWlNBOUlIUnlkV1U3WEc0Z0lIMWNibHh1SUNCdlptWW9LU0I3WEc0Z0lDQWdkR2hwY3k1emRHRjBaU0E5SUdaaGJITmxPMXh1SUNCOVhHNWNibjFjYmx4dVhHNWNiaTh2SUZkRlFsQkJRMHNnUms5UFZFVlNJQzh2WEc0dkx5QXVMMzR2YW5Ob2FXNTBMV3h2WVdSbGNpRXVMMnhwWWk5dGIyUmxiSE12ZEc5bloyeGxMbXB6SWl3aUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc1c1pYUWdjM1puSUQwZ2NtVnhkV2x5WlNnbkxpNHZkWFJwYkM5emRtY25LVHRjYm14bGRDQkpiblJsY21aaFkyVWdQU0J5WlhGMWFYSmxLQ2N1TGk5amIzSmxMMmx1ZEdWeVptRmpaU2NwTzF4dWJHVjBJRk4wWlhBZ1BTQnlaWEYxYVhKbEtDY3VMaTl0YjJSbGJITXZjM1JsY0NjcE8xeHVhVzF3YjNKMElDb2dZWE1nU1c1MFpYSmhZM1JwYjI0Z1puSnZiU0FuTGk0dmRYUnBiQzlwYm5SbGNtRmpkR2x2YmljN1hHNWNiaThxS2x4dUtpQlRiR2xrWlhKY2JpcGNiaW9nUUdSbGMyTnlhWEIwYVc5dUlFaHZjbWw2YjI1MFlXd2diM0lnZG1WeWRHbGpZV3dnYzJ4cFpHVnlJSGRwZEdnZ2MyVjBkR0ZpYkdVZ2FXNTBaWEpoWTNScGIyNGdiVzlrWlhNdVhHNHFYRzRxSUVCa1pXMXZJRHh6Y0dGdUlHNWxlSFZ6TFhWcFBWd2ljMnhwWkdWeVhDSWdjM1JsY0Qwd0xqSStQQzl6Y0dGdVBseHVLbHh1S2lCQVpYaGhiWEJzWlZ4dUtpQjJZWElnYzJ4cFpHVnlJRDBnYm1WM0lFNWxlSFZ6TGxOc2FXUmxjaWduSTNSaGNtZGxkQ2NwWEc0cVhHNHFJRUJsZUdGdGNHeGxYRzRxSUhaaGNpQnpiR2xrWlhJZ1BTQnVaWGNnVG1WNGRYTXVVMnhwWkdWeUtDY2pkR0Z5WjJWMEp5eDdYRzRxSUNBZ0lDQW5jMmw2WlNjNklGc3hNakFzTWpCZExGeHVLaUFnSUNBZ0oyMXZaR1VuT2lBbmNtVnNZWFJwZG1VbkxDQWdMeThnSjNKbGJHRjBhWFpsSnlCdmNpQW5ZV0p6YjJ4MWRHVW5YRzRxSUNBZ0lDQW5iV2x1SnpvZ01DeGNiaW9nSUNBZ0lDZHRZWGduT2lBeExGeHVLaUFnSUNBZ0ozTjBaWEFuT2lBd0xGeHVLaUFnSUNBZ0ozWmhiSFZsSnpvZ01GeHVLaUI5S1Z4dUtseHVLaUJBYjNWMGNIVjBYRzRxSUdOb1lXNW5aVnh1S2lCR2FYSmxjeUIzYUdWdUlIUm9aU0JwYm5SbGNtWmhZMlVuY3lCMllXeDFaU0JqYUdGdVoyVnpMaUE4WW5JK1hHNHFJRVYyWlc1MElHUmhkR0U2SUR4cFBtNTFiV0psY2p3dmFUNGdWR2hsSUc1MWJXSmxjaUIyWVd4MVpTQnZaaUIwYUdVZ2FXNTBaWEptWVdObExseHVLbHh1S2lCQWIzVjBjSFYwWlhoaGJYQnNaVnh1S2lCemJHbGtaWEl1YjI0b0oyTm9ZVzVuWlNjc1puVnVZM1JwYjI0b2Rpa2dlMXh1S2lBZ0lHTnZibk52YkdVdWJHOW5LSFlwTzF4dUtpQjlLVnh1S2x4dUtseHVLaTljYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnWTJ4aGMzTWdVMnhwWkdWeUlHVjRkR1Z1WkhNZ1NXNTBaWEptWVdObElIdGNibHh1SUNCamIyNXpkSEoxWTNSdmNpZ3BJSHRjYmx4dUlDQWdJR3hsZENCdmNIUnBiMjV6SUQwZ1d5ZHRhVzRuTENkdFlYZ25MQ2QyWVd4MVpTZGRPMXh1WEc0Z0lDQWdiR1YwSUdSbFptRjFiSFJ6SUQwZ2UxeHVJQ0FnSUNBZ0ozTnBlbVVuT2lCYk1USXdMREl3WFN4Y2JpQWdJQ0FnSUNkdGIyUmxKem9nSjNKbGJHRjBhWFpsSnl3Z0lDOHZJQ2R5Wld4aGRHbDJaU2NnYjNJZ0oyRmljMjlzZFhSbEoxeHVJQ0FnSUNBZ0oyMXBiaWM2SURBc1hHNGdJQ0FnSUNBbmJXRjRKem9nTVN4Y2JpQWdJQ0FnSUNkemRHVndKem9nTUN4Y2JpQWdJQ0FnSUNkMllXeDFaU2M2SURCY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnYzNWd1pYSW9ZWEpuZFcxbGJuUnpMRzl3ZEdsdmJuTXNaR1ZtWVhWc2RITXBPMXh1WEc0Z0lDQWdkR2hwY3k1dmNtbGxiblJoZEdsdmJpQTlJQ2QyWlhKMGFXTmhiQ2M3SUM4dklGUm9hWE1nZDJsc2JDQmphR0Z1WjJVZ1lYVjBiMjFoZEdsallXeHNlU0IwYnlBbmFHOXlhWHB2Ym5SaGJDZHBaaUIwYUdVZ2FXNTBaWEptWVdObElHbHpJSGRwWkdWeUlIUm9ZVzRnYVhRZ2FYTWdkR0ZzYkM1Y2JseHVJQ0FnSUhSb2FYTXVYM1poYkhWbElEMGdibVYzSUZOMFpYQW9kR2hwY3k1elpYUjBhVzVuY3k1dGFXNHNJSFJvYVhNdWMyVjBkR2x1WjNNdWJXRjRMQ0IwYUdsekxuTmxkSFJwYm1kekxuTjBaWEFzSUhSb2FYTXVjMlYwZEdsdVozTXVkbUZzZFdVcE8xeHVYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaUE5SUc1bGR5QkpiblJsY21GamRHbHZiaTVJWVc1a2JHVW9kR2hwY3k1elpYUjBhVzVuY3k1dGIyUmxMSFJvYVhNdWIzSnBaVzUwWVhScGIyNHNXekFzZEdocGN5NTNhV1IwYUYwc1czUm9hWE11YUdWcFoyaDBMREJkS1R0Y2JpQWdJQ0IwYUdsekxuQnZjMmwwYVc5dUxuWmhiSFZsSUQwZ2RHaHBjeTVmZG1Gc2RXVXVibTl5YldGc2FYcGxaRHRjYmx4dUlDQWdJSFJvYVhNdWFXNXBkQ2dwTzF4dVhHNGdJQ0FnZEdocGN5NXdiM05wZEdsdmJpNWthWEpsWTNScGIyNGdQU0IwYUdsekxtOXlhV1Z1ZEdGMGFXOXVPMXh1WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSFJvYVhNdWRtRnNkV1VwTzF4dVhHNGdJSDFjYmx4dUlDQmlkV2xzWkVsdWRHVnlabUZqWlNncElIdGNibHh1SUNBZ0lIUm9hWE11WW1GeUlEMGdjM1puTG1OeVpXRjBaU2duY21WamRDY3BPMXh1SUNBZ0lIUm9hWE11Wm1sc2JHSmhjaUE5SUhOMlp5NWpjbVZoZEdVb0ozSmxZM1FuS1R0Y2JpQWdJQ0IwYUdsekxtdHViMklnUFNCemRtY3VZM0psWVhSbEtDZGphWEpqYkdVbktUdGNibHh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzVoY0hCbGJtUkRhR2xzWkNoMGFHbHpMbUpoY2lrN1hHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdVptbHNiR0poY2lrN1hHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdWEyNXZZaWs3WEc1Y2JpQWdmVnh1WEc0Z0lITnBlbVZKYm5SbGNtWmhZMlVvS1NCN1hHNWNiaUFnSUNCcFppQW9kR2hwY3k1M2FXUjBhQ0E4SUhSb2FYTXVhR1ZwWjJoMEtTQjdYRzRnSUNBZ0lDQjBhR2x6TG05eWFXVnVkR0YwYVc5dUlEMGdKM1psY25ScFkyRnNKenRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV2Y21sbGJuUmhkR2x2YmlBOUlDZG9iM0pwZW05dWRHRnNKenRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvZEdocGN5NXdiM05wZEdsdmJpa2dlMXh1SUNBZ0lDQWdkR2hwY3k1d2IzTnBkR2x2Ymk1eVpYTnBlbVVvV3pBc2RHaHBjeTUzYVdSMGFGMHNXM1JvYVhNdWFHVnBaMmgwTERCZEtUdGNiaUFnSUNCOVhHNWNiaUFnSUNCc1pYUWdlQ3dnZVN3Z2R5d2dhQ3dnWW1GeVQyWm1jMlYwTENCamIzSnVaWEpTWVdScGRYTTdYRzRnSUNBZ2RHaHBjeTVyYm05aVJHRjBZU0E5SUh0Y2JpQWdJQ0FnSUd4bGRtVnNPaUF3TEZ4dUlDQWdJQ0FnY2pvZ01GeHVJQ0FnSUgwN1hHNWNiaUFnSUNCcFppQW9kR2hwY3k1dmNtbGxiblJoZEdsdmJpQTlQVDBnSjNabGNuUnBZMkZzSnlrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTUwYUdsamEyNWxjM01nUFNCMGFHbHpMbmRwWkhSb0lDOGdNanRjYmlBZ0lDQmNkSGdnUFNCMGFHbHpMbmRwWkhSb0x6STdYRzRnSUNBZ1hIUjVJRDBnTUR0Y2JpQWdJQ0JjZEhjZ1BTQjBhR2x6TG5Sb2FXTnJibVZ6Y3p0Y2JpQWdJQ0JjZEdnZ1BTQjBhR2x6TG1obGFXZG9kRHRjYmlBZ0lDQWdJSFJvYVhNdWEyNXZZa1JoZEdFdWNpQTlJSFJvYVhNdWRHaHBZMnR1WlhOeklDb2dNQzQ0TzF4dUlDQWdJRngwZEdocGN5NXJibTlpUkdGMFlTNXNaWFpsYkNBOUlHZ3RkR2hwY3k1cmJtOWlSR0YwWVM1eUxYUm9hWE11Ym05eWJXRnNhWHBsWkNvb2FDMTBhR2x6TG10dWIySkVZWFJoTG5JcU1pazdYRzRnSUNBZ0lDQmlZWEpQWm1aelpYUWdQU0FuZEhKaGJuTnNZWFJsS0NjcmRHaHBjeTUwYUdsamEyNWxjM01xS0MweEtTOHlLeWNzTUNrbk8xeHVJQ0FnSUNBZ1kyOXlibVZ5VW1Ga2FYVnpJRDBnZHk4eU8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IwYUdsekxuUm9hV05yYm1WemN5QTlJSFJvYVhNdWFHVnBaMmgwSUM4Z01qdGNiaUFnSUNCY2RIZ2dQU0F3TzF4dUlDQWdJRngwZVNBOUlIUm9hWE11YUdWcFoyaDBMekk3WEc0Z0lDQWdYSFIzSUQwZ2RHaHBjeTUzYVdSMGFEdGNiaUFnSUNCY2RHZ2dQU0IwYUdsekxuUm9hV05yYm1WemN6dGNiaUFnSUNBZ0lIUm9hWE11YTI1dllrUmhkR0V1Y2lBOUlIUm9hWE11ZEdocFkydHVaWE56SUNvZ01DNDRPMXh1SUNBZ0lGeDBkR2hwY3k1cmJtOWlSR0YwWVM1c1pYWmxiQ0E5SUhSb2FYTXVibTl5YldGc2FYcGxaQ29vZHkxMGFHbHpMbXR1YjJKRVlYUmhMbklxTWlrcmRHaHBjeTVyYm05aVJHRjBZUzV5TzF4dUlDQWdJQ0FnWW1GeVQyWm1jMlYwSUQwZ0ozUnlZVzV6YkdGMFpTZ3dMQ2NyZEdocGN5NTBhR2xqYTI1bGMzTXFLQzB4S1M4eUt5Y3BKenRjYmlBZ0lDQWdJR052Y201bGNsSmhaR2wxY3lBOUlHZ3ZNanRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjBhR2x6TG1KaGNpNXpaWFJCZEhSeWFXSjFkR1VvSjNnbkxIZ3BPMXh1SUNBZ0lIUm9hWE11WW1GeUxuTmxkRUYwZEhKcFluVjBaU2duZVNjc2VTazdYRzRnSUNBZ2RHaHBjeTVpWVhJdWMyVjBRWFIwY21saWRYUmxLQ2QwY21GdWMyWnZjbTBuTEdKaGNrOW1abk5sZENrN1hHNGdJQ0FnZEdocGN5NWlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZHllQ2NzWTI5eWJtVnlVbUZrYVhWektUc2dMeThnWTI5eWJtVnlJSEpoWkdsMWMxeHVJQ0FnSUhSb2FYTXVZbUZ5TG5ObGRFRjBkSEpwWW5WMFpTZ25jbmtuTEdOdmNtNWxjbEpoWkdsMWN5azdYRzRnSUNBZ2RHaHBjeTVpWVhJdWMyVjBRWFIwY21saWRYUmxLQ2QzYVdSMGFDY3NkeWs3WEc0Z0lDQWdkR2hwY3k1aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0Nkb1pXbG5hSFFuTEdncE8xeHVYRzRnSUNBZ2FXWWdLSFJvYVhNdWIzSnBaVzUwWVhScGIyNGdQVDA5SUNkMlpYSjBhV05oYkNjcElIdGNiaUFnSUNBZ0lIUm9hWE11Wm1sc2JHSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0ozZ25MSGdwTzF4dUlDQWdJQ0FnZEdocGN5NW1hV3hzWW1GeUxuTmxkRUYwZEhKcFluVjBaU2duZVNjc2RHaHBjeTVyYm05aVJHRjBZUzVzWlhabGJDazdYRzRnSUNBZ0lDQjBhR2x6TG1acGJHeGlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZDNhV1IwYUNjc2R5azdYRzRnSUNBZ0lDQjBhR2x6TG1acGJHeGlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZG9aV2xuYUhRbkxHZ3RkR2hwY3k1cmJtOWlSR0YwWVM1c1pYWmxiQ2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIUm9hWE11Wm1sc2JHSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0ozZ25MREFwTzF4dUlDQWdJQ0FnZEdocGN5NW1hV3hzWW1GeUxuTmxkRUYwZEhKcFluVjBaU2duZVNjc2VTazdYRzRnSUNBZ0lDQjBhR2x6TG1acGJHeGlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZDNhV1IwYUNjc2RHaHBjeTVyYm05aVJHRjBZUzVzWlhabGJDazdYRzRnSUNBZ0lDQjBhR2x6TG1acGJHeGlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZG9aV2xuYUhRbkxHZ3BPMXh1SUNBZ0lIMWNiaUFnSUNCMGFHbHpMbVpwYkd4aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkMGNtRnVjMlp2Y20wbkxHSmhjazltWm5ObGRDazdYRzRnSUNBZ2RHaHBjeTVtYVd4c1ltRnlMbk5sZEVGMGRISnBZblYwWlNnbmNuZ25MR052Y201bGNsSmhaR2wxY3lrN1hHNGdJQ0FnZEdocGN5NW1hV3hzWW1GeUxuTmxkRUYwZEhKcFluVjBaU2duY25rbkxHTnZjbTVsY2xKaFpHbDFjeWs3WEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTV2Y21sbGJuUmhkR2x2YmlBOVBUMGdKM1psY25ScFkyRnNKeWtnZTF4dUlDQWdJQ0FnZEdocGN5NXJibTlpTG5ObGRFRjBkSEpwWW5WMFpTZ25ZM2duTEhncE8xeHVJQ0FnSUNBZ2RHaHBjeTVyYm05aUxuTmxkRUYwZEhKcFluVjBaU2duWTNrbkxIUm9hWE11YTI1dllrUmhkR0V1YkdWMlpXd3BPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFHbHpMbXR1YjJJdWMyVjBRWFIwY21saWRYUmxLQ2RqZUNjc2RHaHBjeTVyYm05aVJHRjBZUzVzWlhabGJDazdYRzRnSUNBZ0lDQjBhR2x6TG10dWIySXVjMlYwUVhSMGNtbGlkWFJsS0NkamVTY3NlU2s3WEc0Z0lDQWdmVnh1SUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjNJbkxIUm9hWE11YTI1dllrUmhkR0V1Y2lrN1hHNWNiaUFnZlZ4dVhHNGdJR052Ykc5eVNXNTBaWEptWVdObEtDa2dlMXh1SUNBZ0lIUm9hWE11WW1GeUxuTmxkRUYwZEhKcFluVjBaU2duWm1sc2JDY3NJSFJvYVhNdVkyOXNiM0p6TG1acGJHd3BPMXh1SUNBZ0lIUm9hWE11Wm1sc2JHSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0oyWnBiR3duTENCMGFHbHpMbU52Ykc5eWN5NWhZMk5sYm5RcE8xeHVJQ0FnSUhSb2FYTXVhMjV2WWk1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3bkxDQjBhR2x6TG1OdmJHOXljeTVoWTJObGJuUXBPMXh1SUNCOVhHNWNibHh1SUNCeVpXNWtaWElvS1NCN1hHNGdJQ0FnYVdZZ0tDRjBhR2x6TG1Oc2FXTnJaV1FwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVhMjV2WWtSaGRHRXVjaUE5SUhSb2FYTXVkR2hwWTJ0dVpYTnpLakF1TnpVN1hHNGdJQ0FnZlZ4dUlDQWdJSFJvYVhNdWEyNXZZaTV6WlhSQmRIUnlhV0oxZEdVb0ozSW5MSFJvYVhNdWEyNXZZa1JoZEdFdWNpazdYRzVjYmlBZ0lDQnBaaUFvZEdocGN5NXZjbWxsYm5SaGRHbHZiaUE5UFQwZ0ozWmxjblJwWTJGc0p5a2dlMXh1SUNCY2RDQWdJSFJvYVhNdWEyNXZZa1JoZEdFdWJHVjJaV3dnUFNCMGFHbHpMbXR1YjJKRVlYUmhMbklyZEdocGN5NWZkbUZzZFdVdWJtOXliV0ZzYVhwbFpDb29kR2hwY3k1b1pXbG5hSFF0ZEdocGN5NXJibTlpUkdGMFlTNXlLaklwTzF4dUlDQWdJQ0FnSUhSb2FYTXVhMjV2WWk1elpYUkJkSFJ5YVdKMWRHVW9KMk41Snl4MGFHbHpMbWhsYVdkb2RDQXRJSFJvYVhNdWEyNXZZa1JoZEdFdWJHVjJaV3dwTzF4dUlDQWdJQ0FnSUhSb2FYTXVabWxzYkdKaGNpNXpaWFJCZEhSeWFXSjFkR1VvSjNrbkxIUm9hWE11YUdWcFoyaDBJQzBnZEdocGN5NXJibTlpUkdGMFlTNXNaWFpsYkNrN1hHNGdJQ0FnSUNBZ2RHaHBjeTVtYVd4c1ltRnlMbk5sZEVGMGRISnBZblYwWlNnbmFHVnBaMmgwSnl4MGFHbHpMbXR1YjJKRVlYUmhMbXhsZG1Wc0tUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQmNkQ0FnSUhSb2FYTXVhMjV2WWtSaGRHRXViR1YyWld3Z1BTQjBhR2x6TGw5MllXeDFaUzV1YjNKdFlXeHBlbVZrS2loMGFHbHpMbmRwWkhSb0xYUm9hWE11YTI1dllrUmhkR0V1Y2lveUtTdDBhR2x6TG10dWIySkVZWFJoTG5JN1hHNGdJQ0FnSUNBZ2RHaHBjeTVyYm05aUxuTmxkRUYwZEhKcFluVjBaU2duWTNnbkxIUm9hWE11YTI1dllrUmhkR0V1YkdWMlpXd3BPMXh1SUNBZ0lDQWdJSFJvYVhNdVptbHNiR0poY2k1elpYUkJkSFJ5YVdKMWRHVW9KM2duTERBcE8xeHVJQ0FnSUNBZ0lIUm9hWE11Wm1sc2JHSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0ozZHBaSFJvSnl4MGFHbHpMbXR1YjJKRVlYUmhMbXhsZG1Wc0tUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dVhHNGdJR05zYVdOcktDa2dlMXh1SUNBZ0lIUm9hWE11YTI1dllrUmhkR0V1Y2lBOUlIUm9hWE11ZEdocFkydHVaWE56S2pBdU9UdGNiaUFnSUNCMGFHbHpMbkJ2YzJsMGFXOXVMbUZ1WTJodmNpQTlJSFJvYVhNdWJXOTFjMlU3WEc0Z0lDQWdkR2hwY3k1dGIzWmxLQ2s3WEc0Z0lIMWNibHh1SUNCdGIzWmxLQ2tnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbU5zYVdOclpXUXBJSHRjYmlBZ0lDQWdJSFJvYVhNdWNHOXphWFJwYjI0dWRYQmtZWFJsS0hSb2FYTXViVzkxYzJVcE8xeHVJQ0FnSUNBZ2RHaHBjeTVmZG1Gc2RXVXVkWEJrWVhSbFRtOXliV0ZzS0NCMGFHbHpMbkJ2YzJsMGFXOXVMblpoYkhWbElDazdYRzRnSUNBZ0lDQjBhR2x6TG1WdGFYUW9KMk5vWVc1blpTY3NkR2hwY3k1ZmRtRnNkV1V1ZG1Gc2RXVXBPMXh1SUNBZ0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JseHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxiR1ZoYzJVb0tTQjdYRzRnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ2ZWeHVYRzRnSUdkbGRDQnViM0p0WVd4cGVtVmtLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5MllXeDFaUzV1YjNKdFlXeHBlbVZrTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUZSb1pTQnpiR2xrWlhJbmN5QmpkWEp5Wlc1MElIWmhiSFZsTGlCSlppQnpaWFFnYldGdWRXRnNiSGtzSUhkcGJHd2dkWEJrWVhSbElIUm9aU0JwYm5SbGNtWmhZMlVnWVc1a0lIUnlhV2RuWlhJZ2RHaGxJRzkxZEhCMWRDQmxkbVZ1ZEM1Y2JpQWdRSFI1Y0dVZ2UyNTFiV0psY24xY2JpQWdRR1Y0WVcxd2JHVWdjMnhwWkdWeUxuWmhiSFZsSUQwZ01UQTdYRzRnSUNvdlhHNGdJR2RsZENCMllXeDFaU2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1ZmRtRnNkV1V1ZG1Gc2RXVTdYRzRnSUgxY2JpQWdjMlYwSUhaaGJIVmxLSFlwSUh0Y2JpQWdJQ0IwYUdsekxsOTJZV3gxWlM1MWNHUmhkR1VvZGlrN1hHNGdJQ0FnZEdocGN5NXdiM05wZEdsdmJpNTJZV3gxWlNBOUlIUm9hWE11WDNaaGJIVmxMbTV2Y20xaGJHbDZaV1E3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSFJvYVhNdVgzWmhiSFZsTG5aaGJIVmxLVHRjYmlBZ0lDQjBhR2x6TG5KbGJtUmxjaWdwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUV4dmQyVnlJR3hwYldsMElHOW1JSFJvWlNCemJHbGtaWEp6SjNNZ2IzVjBjSFYwSUhKaGJtZGxYRzRnSUVCMGVYQmxJSHR1ZFcxaVpYSjlYRzRnSUVCbGVHRnRjR3hsSUhOc2FXUmxjaTV0YVc0Z1BTQXhNREF3TzF4dUlDQXFMMXh1SUNCblpYUWdiV2x1S0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxsOTJZV3gxWlM1dGFXNDdYRzRnSUgxY2JpQWdjMlYwSUcxcGJpaDJLU0I3WEc0Z0lDQWdkR2hwY3k1ZmRtRnNkV1V1YldsdUlEMGdkanRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0JWY0hCbGNpQnNhVzFwZENCdlppQjBhR1VnYzJ4cFpHVnlKM01nYjNWMGNIVjBJSEpoYm1kbFhHNGdJRUIwZVhCbElIdHVkVzFpWlhKOVhHNGdJRUJsZUdGdGNHeGxJSE5zYVdSbGNpNXRZWGdnUFNBeE1EQXdPMXh1SUNBcUwxeHVJQ0JuWlhRZ2JXRjRLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5MllXeDFaUzV0WVhnN1hHNGdJSDFjYmlBZ2MyVjBJRzFoZUNoMktTQjdYRzRnSUNBZ2RHaHBjeTVmZG1Gc2RXVXViV0Y0SUQwZ2RqdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQlVhR1VnYVc1amNtVnRaVzUwSUhSb1lYUWdkR2hsSUhOc2FXUmxjaWR6SUhaaGJIVmxJR05vWVc1blpYTWdZbmt1WEc0Z0lFQjBlWEJsSUh0dWRXMWlaWEo5WEc0Z0lFQmxlR0Z0Y0d4bElITnNhV1JsY2k1emRHVndJRDBnTlR0Y2JpQWdLaTljYmlBZ1oyVjBJSE4wWlhBb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVYM1poYkhWbExuTjBaWEE3WEc0Z0lIMWNiaUFnYzJWMElITjBaWEFvZGlrZ2UxeHVJQ0FnSUhSb2FYTXVYM1poYkhWbExuTjBaWEFnUFNCMk8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lFRmljMjlzZFhSbElHMXZaR1VnS0hOc2FXUmxjaWR6SUhaaGJIVmxJR3AxYlhCeklIUnZJRzF2ZFhObElHTnNhV05ySUhCdmMybDBhVzl1S1NCdmNpQnlaV3hoZEdsMlpTQnRiMlJsSUNodGIzVnpaU0JrY21GbklHTm9ZVzVuWlhNZ2RtRnNkV1VnY21Wc1lYUnBkbVVnZEc4Z2FYUnpJR04xY25KbGJuUWdjRzl6YVhScGIyNHBMaUJFWldaaGRXeDBPaUJjSW5KbGJHRjBhWFpsWENJdVhHNGdJRUIwZVhCbElIdHpkSEpwYm1kOVhHNGdJRUJsZUdGdGNHeGxJSE5zYVdSbGNpNXRiMlJsSUQwZ1hDSnlaV3hoZEdsMlpWd2lPMXh1SUNBcUwxeHVJQ0JuWlhRZ2JXOWtaU2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1d2IzTnBkR2x2Ymk1dGIyUmxPMXh1SUNCOVhHNGdJSE5sZENCdGIyUmxLSFlwSUh0Y2JpQWdJQ0IwYUdsekxuQnZjMmwwYVc5dUxtMXZaR1VnUFNCMk8xeHVJQ0I5WEc1Y2JseHVYRzU5WEc1Y2JseHVYRzR2THlCWFJVSlFRVU5MSUVaUFQxUkZVaUF2TDF4dUx5OGdMaTkrTDJwemFHbHVkQzFzYjJGa1pYSWhMaTlzYVdJdmFXNTBaWEptWVdObGN5OXpiR2xrWlhJdWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibXhsZENCemRtY2dQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNMM04yWnljcE8xeHViR1YwSUZSdloyZHNaVTF2WkdWc0lEMGdjbVZ4ZFdseVpTZ25MaTR2Ylc5a1pXeHpMM1J2WjJkc1pTY3BPMXh1YkdWMElFbHVkR1Z5Wm1GalpTQTlJSEpsY1hWcGNtVW9KeTR1TDJOdmNtVXZhVzUwWlhKbVlXTmxKeWs3WEc1Y2JpOHFLbHh1S2lCVWIyZG5iR1ZjYmlwY2Jpb2dRR1JsYzJOeWFYQjBhVzl1SUVKcGJtRnllU0J6ZDJsMFkyaGNiaXBjYmlvZ1FHUmxiVzhnUEhOd1lXNGdibVY0ZFhNdGRXazlYQ0owYjJkbmJHVmNJajQ4TDNOd1lXNCtYRzRxWEc0cUlFQmxlR0Z0Y0d4bFhHNHFJSFpoY2lCMGIyZG5iR1VnUFNCdVpYY2dUbVY0ZFhNdVZHOW5aMnhsS0NjamRHRnlaMlYwSnlsY2JpcGNiaW9nUUdWNFlXMXdiR1ZjYmlvZ2RtRnlJSFJ2WjJkc1pTQTlJRzVsZHlCT1pYaDFjeTVVYjJkbmJHVW9KeU4wWVhKblpYUW5MSHRjYmlvZ0lDQWdJQ2R6YVhwbEp6b2dXelF3TERJd1hTeGNiaW9nSUNBZ0lDZHpkR0YwWlNjNklHWmhiSE5sWEc0cUlIMHBYRzRxWEc0cUlFQnZkWFJ3ZFhSY2Jpb2dZMmhoYm1kbFhHNHFJRVpwY21WeklHRnVlU0IwYVcxbElIUm9aU0JwYm5SbGNtWmhZMlVuY3lCMllXeDFaU0JqYUdGdVoyVnpMaUE4WW5JK1hHNHFJRkJoY21GdFpYUmxjam9nVkdobElHSnZiMnhsWVc0Z2MzUmhkR1VnYjJZZ2RHaGxJR2x1ZEdWeVptRmpaUzVjYmlwY2Jpb2dRRzkxZEhCMWRHVjRZVzF3YkdWY2Jpb2dkRzluWjJ4bExtOXVLQ2RqYUdGdVoyVW5MR1oxYm1OMGFXOXVLSFlwSUh0Y2Jpb2dJQ0JqYjI1emIyeGxMbXh2WnloMktUdGNiaW9nZlNsY2JpcGNiaXBjYmlvdlhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamJHRnpjeUJVYjJkbmJHVWdaWGgwWlc1a2N5QkpiblJsY21aaFkyVWdlMXh1WEc0Z0lHTnZibk4wY25WamRHOXlLQ2tnZTF4dVhHNGdJQ0FnYkdWMElHOXdkR2x2Ym5NZ1BTQmJKM1poYkhWbEoxMDdYRzVjYmlBZ0lDQnNaWFFnWkdWbVlYVnNkSE1nUFNCN1hHNGdJQ0FnSUNBbmMybDZaU2M2SUZzME1Dd3lNRjBzWEc0Z0lDQWdJQ0FuZEdGeVoyVjBKem9nWm1Gc2MyVXNYRzRnSUNBZ0lDQW5jM1JoZEdVbk9pQm1ZV3h6WlZ4dUlDQWdJSDA3WEc1Y2JpQWdJQ0J6ZFhCbGNpaGhjbWQxYldWdWRITXNiM0IwYVc5dWN5eGtaV1poZFd4MGN5azdYRzVjYmlBZ0lDQjBhR2x6TGw5emRHRjBaU0E5SUc1bGR5QlViMmRuYkdWTmIyUmxiQ2gwYUdsekxuTmxkSFJwYm1kekxuTjBZWFJsS1R0Y2JseHVJQ0FnSUhSb2FYTXVhVzVwZENncE8xeHVYRzRnSUgxY2JseHVJQ0JpZFdsc1pFbHVkR1Z5Wm1GalpTZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdVltRnlJRDBnYzNabkxtTnlaV0YwWlNnbmNtVmpkQ2NwTzF4dUlDQWdJSFJvYVhNdWEyNXZZaUE5SUhOMlp5NWpjbVZoZEdVb0oyTnBjbU5zWlNjcE8xeHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNWhjSEJsYm1SRGFHbHNaQ2gwYUdsekxtSmhjaWs3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG1Gd2NHVnVaRU5vYVd4a0tIUm9hWE11YTI1dllpazdYRzVjYmlBZ2ZWeHVYRzRnSUhOcGVtVkpiblJsY21aaFkyVW9LU0I3WEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTVvWldsbmFIUWdQQ0IwYUdsekxuZHBaSFJvTHpJcElIdGNiaUFnSUNBZ0lIUm9hWE11YTI1dllsTnBlbVVnUFNCMGFHbHpMbWhsYVdkb2RDOHlPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFHbHpMbXR1YjJKVGFYcGxJRDBnZEdocGN5NTNhV1IwYUM4ME8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhSb2FYTXVZbUZ5TG5ObGRFRjBkSEpwWW5WMFpTZ25lQ2NzZEdocGN5NTNhV1IwYUM4eUlDMGdkR2hwY3k1cmJtOWlVMmw2WlNveExqVXBPMXh1SUNBZ0lIUm9hWE11WW1GeUxuTmxkRUYwZEhKcFluVjBaU2duZVNjc2RHaHBjeTVvWldsbmFIUXZNaUF0SUhSb2FYTXVhMjV2WWxOcGVtVXZNaWs3WEc0Z0lDQWdkR2hwY3k1aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkeWVDY3NkR2hwY3k1cmJtOWlVMmw2WlM4eUtUdGNiaUFnSUNCMGFHbHpMbUpoY2k1elpYUkJkSFJ5YVdKMWRHVW9KM0o1Snl4MGFHbHpMbXR1YjJKVGFYcGxMeklwTzF4dUlDQWdJSFJvYVhNdVltRnlMbk5sZEVGMGRISnBZblYwWlNnbmQybGtkR2duTEhSb2FYTXVhMjV2WWxOcGVtVXFNeWs3WEc0Z0lDQWdkR2hwY3k1aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0Nkb1pXbG5hSFFuTEhSb2FYTXVhMjV2WWxOcGVtVXBPMXh1WEc0Z0lDQWdkR2hwY3k1cmJtOWlMbk5sZEVGMGRISnBZblYwWlNnblkzZ25MSFJvYVhNdWQybGtkR2d2TWlBdElIUm9hWE11YTI1dllsTnBlbVVwTzF4dUlDQWdJSFJvYVhNdWEyNXZZaTV6WlhSQmRIUnlhV0oxZEdVb0oyTjVKeXgwYUdsekxtaGxhV2RvZEM4eUtUdGNiaUFnSUNCMGFHbHpMbXR1YjJJdWMyVjBRWFIwY21saWRYUmxLQ2R5Snl4MGFHbHpMbXR1YjJKVGFYcGxLVHRjYmx4dUlDQjlYRzVjYmlBZ1kyOXNiM0pKYm5SbGNtWmhZMlVvS1NCN1hHNGdJQ0FnZEdocGN5NXJibTlpTG5ObGRFRjBkSEpwWW5WMFpTZ25abWxzYkNjc0lIUm9hWE11WTI5c2IzSnpMbUZqWTJWdWRDazdYRzRnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ2ZWeHVYRzRnSUhKbGJtUmxjaWdwSUh0Y2JpQWdJQ0JwWmlBb0lYUm9hWE11YzNSaGRHVXBJSHRjYmlBZ0lDQWdJSFJvYVhNdWEyNXZZaTV6WlhSQmRIUnlhV0oxZEdVb0oyTjRKeXgwYUdsekxuZHBaSFJvTHpJZ0xTQjBhR2x6TG10dWIySlRhWHBsS1R0Y2JpQWdJQ0FnSUhSb2FYTXVZbUZ5TG5ObGRFRjBkSEpwWW5WMFpTZ25abWxzYkNjc0lIUm9hWE11WTI5c2IzSnpMbVpwYkd3cE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IwYUdsekxtdHViMkl1YzJWMFFYUjBjbWxpZFhSbEtDZGplQ2NzZEdocGN5NTNhV1IwYUM4eUlDc2dkR2hwY3k1cmJtOWlVMmw2WlNrN1hHNGdJQ0FnSUNCMGFHbHpMbUpoY2k1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3bkxDQjBhR2x6TG1OdmJHOXljeTVoWTJObGJuUXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJR05zYVdOcktDa2dlMXh1SUNBZ0lIUm9hWE11Wm14cGNDZ3BPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSFJvYVhNdWMzUmhkR1VwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUZkb1pYUm9aWElnZEdobElIUnZaMmRzWlNCcGN5QmpkWEp5Wlc1MGJIa2diMjRnYjNJZ2IyWm1MaUJUWlhSMGFXNW5JSFJvYVhNZ2NISnZjR1Z5ZEhrZ2QybHNiQ0IxY0dSaGRHVWdkR2hsSUhSdloyZHNaU0JwYm5SbGNtWmhZMlVnWVc1a0lIUnlhV2RuWlhJZ2RHaGxJRzkxZEhCMWRDQmxkbVZ1ZEM1Y2JpQWdRSFI1Y0dVZ2UySnZiMnhsWVc1OVhHNGdJRUJsZUdGdGNHeGxJSFJ2WjJkc1pTNXpkR0YwWlNBOUlHWmhiSE5sTzF4dUlDQXFMMXh1SUNCblpYUWdjM1JoZEdVb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVYM04wWVhSbExuTjBZWFJsTzF4dUlDQjlYRzRnSUhObGRDQnpkR0YwWlNoMllXeDFaU2tnZTF4dUlDQWdJSFJvYVhNdVgzTjBZWFJsTG1ac2FYQW9kbUZzZFdVcE8xeHVJQ0FnSUhSb2FYTXVaVzFwZENnblkyaGhibWRsSnl4MGFHbHpMbk4wWVhSbEtUdGNiaUFnSUNCMGFHbHpMbkpsYm1SbGNpZ3BPMXh1SUNCOVhHNWNibHh1SUNBdktpcGNiaUFnS2lCVGQybDBZMmdnZEdobElIUnZaMmRzWlNCemRHRjBaU0IwYnlCcGRITWdiM0J3YjNOcGRHVWdjM1JoZEdWY2JpQWdLaUJBWlhoaGJYQnNaVnh1SUNBcUlIUnZaMmRzWlM1bWJHbHdLQ2s3WEc0Z0lDb3ZYRzRnSUdac2FYQW9LU0I3WEc0Z0lDQWdkR2hwY3k1ZmMzUmhkR1V1Wm14cGNDZ3BPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc0Z0lIMWNibHh1ZlZ4dVhHNWNibHh1THk4Z1YwVkNVRUZEU3lCR1QwOVVSVklnTHk5Y2JpOHZJQzR2Zmk5cWMyaHBiblF0Ykc5aFpHVnlJUzR2YkdsaUwybHVkR1Z5Wm1GalpYTXZkRzluWjJ4bExtcHpJaXdpSjNWelpTQnpkSEpwWTNRbk8xeHVYRzVzWlhRZ2MzWm5JRDBnY21WeGRXbHlaU2duTGk0dmRYUnBiQzl6ZG1jbktUdGNibXhsZENCQ2RYUjBiMjVVWlcxd2JHRjBaU0E5SUhKbGNYVnBjbVVvSnk0dUwyTnZiWEJ2Ym1WdWRITXZZblYwZEc5dWRHVnRjR3hoZEdVbktUdGNibHh1THlvcVhHNHFJRUoxZEhSdmJseHVLbHh1S2lCQVpHVnpZM0pwY0hScGIyNGdRMmx5WTNWc1lYSWdZblYwZEc5dUlIZHBkR2dnYjNCMGFXOXVZV3dnWVdaMFpYSjBiM1ZqYUM1Y2JpcGNiaW9nUUdSbGJXOGdQSE53WVc0Z2JtVjRkWE10ZFdrOVhDSmlkWFIwYjI1Y0lqNDhMM053WVc0K1hHNHFYRzRxSUVCbGVHRnRjR3hsWEc0cUlIWmhjaUJpZFhSMGIyNGdQU0J1WlhjZ1RtVjRkWE11UW5WMGRHOXVLQ2NqZEdGeVoyVjBKeWxjYmlwY2Jpb2dRR1Y0WVcxd2JHVmNiaW9nZG1GeUlHSjFkSFJ2YmlBOUlHNWxkeUJPWlhoMWN5NUNkWFIwYjI0b0p5TjBZWEpuWlhRbkxIdGNiaW9nSUNBbmMybDZaU2M2SUZzNE1DdzRNRjBzWEc0cUlDQWdKMjF2WkdVbk9pQW5ZV1owWlhKMGIzVmphQ2NzWEc0cUlDQWdKM04wWVhSbEp6b2dabUZzYzJWY2Jpb2dmU2xjYmlwY2Jpb2dRRzkxZEhCMWRGeHVLaUJqYUdGdVoyVmNiaW9nUm1seVpYTWdZVzU1SUhScGJXVWdkR2hsSUdsdWRHVnlabUZqWlNkeklIWmhiSFZsSUdOb1lXNW5aWE11SUR4aWNqNWNiaW9nU1c0Z1BHSStZblYwZEc5dUlHMXZaR1U4TDJJK0xDQThZajUwYjJkbmJHVWdiVzlrWlR3dllqNHNJR0Z1WkNBOFlqNXBiWEIxYkhObElHMXZaR1U4TDJJK0xDQjBhR1VnYjNWMGNIVjBJR1JoZEdFZ2FYTWdZU0JpYjI5c1pXRnVJR1JsYzJOeWFXSnBibWNnZEdobElITjBZWFJsSUc5bUlIUm9aU0JpZFhSMGIyNHVQR0p5UGx4dUtpQkpiaUE4WWo1aFpuUmxjblJ2ZFdOb0lHMXZaR1U4TDJJK0xDQjBhR1VnYjNWMGNIVjBJR1JoZEdFZ2FYTWdZVzRnYjJKcVpXTjBJR052Ym5SaGFXNXBibWNnZUNBb01DMHhLU0JoYm1RZ2VTQW9NQzB4S1NCd2IzTnBkR2x2Ym5NZ2IyWWdZV1owWlhKMGIzVmphQzVjYmlwY2Jpb2dRRzkxZEhCMWRHVjRZVzF3YkdWY2Jpb2dZblYwZEc5dUxtOXVLQ2RqYUdGdVoyVW5MR1oxYm1OMGFXOXVLSFlwSUh0Y2Jpb2dJQ0F2THlCMklHbHpJSFJvWlNCMllXeDFaU0J2WmlCMGFHVWdZblYwZEc5dVhHNHFJQ0FnWTI5dWMyOXNaUzVzYjJjb2RpazdYRzRxSUgwcFhHNHFYRzRxTDF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamJHRnpjeUJDZFhSMGIyNGdaWGgwWlc1a2N5QkNkWFIwYjI1VVpXMXdiR0YwWlNCN1hHNWNiaUFnWTI5dWMzUnlkV04wYjNJb0tTQjdYRzVjYmlBZ0lDQnNaWFFnYjNCMGFXOXVjeUE5SUZzbmJXOWtaU2RkTzF4dVhHNWNiaUFnSUNCc1pYUWdaR1ZtWVhWc2RITWdQU0I3WEc0Z0lDQWdJQ0FuYzJsNlpTYzZJRnM0TUN3NE1GMHNYRzRnSUNBZ0lDQW5iVzlrWlNjNklDZGhablJsY25SdmRXTm9KeXdnTHk4Z1luVjBkRzl1TENCaFpuUmxjblJ2ZFdOb0xDQnBiWEIxYkhObExDQjBiMmRuYkdWY2JpQWdJQ0FnSUNkemRHRjBaU2M2SUdaaGJITmxYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lITjFjR1Z5S0dGeVozVnRaVzUwY3l4dmNIUnBiMjV6TEdSbFptRjFiSFJ6S1R0Y2JseHVYRzRnSUNBZ0x5b3FYRzRnSUNBZ0tpQkpiblJsY21GamRHbHZiaUJ0YjJSbE9pQnpkWEJ3YjNKMGN5QmNJbUoxZEhSdmJsd2lMQ0JjSW1GbWRHVnlkRzkxWTJoY0lpd2dYQ0pwYlhCMWJITmxYQ0lzSUc5eUlGd2lkRzluWjJ4bFhDSmNiaUFnSUNBcUlFQjBlWEJsSUh0emRISnBibWQ5WEc0Z0lDQWdLaUJBWlhoaGJYQnNaU0JpZFhSMGIyNHViVzlrWlNBOUlDZDBiMmRuYkdVbk8xeHVJQ0FnSUNvdlhHNGdJQ0FnZEdocGN5NXRiMlJsSUQwZ2RHaHBjeTV6WlhSMGFXNW5jeTV0YjJSbE8xeHVYRzRnSUNBZ2RHaHBjeTVwYm1sMEtDazdYRzRnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmx4dUlDQjlYRzVjYmlBZ1luVnBiR1JKYm5SbGNtWmhZMlVvS1NCN1hHNGdJQ0FnZEdocGN5NXdZV1FnUFNCemRtY3VZM0psWVhSbEtDZGphWEpqYkdVbktUdGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVZWEJ3Wlc1a1EyaHBiR1FvZEdocGN5NXdZV1FwTzF4dVhHNGdJQ0FnZEdocGN5NXBiblJsY21GamRHbHZibFJoY21kbGRDQTlJSFJvYVhNdWNHRmtPMXh1WEc0Z0lDQWdMeThnYjI1c2VTQjFjMlZrSUdsbUlHbHVJQ2RoWm5SbGNuUnZkV05vSnlCdGIyUmxYRzRnSUNBZ2RHaHBjeTVrWldaeklEMGdjM1puTG1OeVpXRjBaU2duWkdWbWN5Y3BPMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzVoY0hCbGJtUkRhR2xzWkNoMGFHbHpMbVJsWm5NcE8xeHVYRzRnSUNBZ2RHaHBjeTVuY21Ga2FXVnVkQ0E5SUhOMlp5NXlZV1JwWVd4SGNtRmthV1Z1ZENoMGFHbHpMbVJsWm5Nc01pazdYRzVjYmlBZ0lDQjBhR2x6TG1keVlXUnBaVzUwTG5OMGIzQnpXekJkTG5ObGRFRjBkSEpwWW5WMFpTZ25iMlptYzJWMEp5d2dKek13SlNjcE8xeHVYRzRnSUNBZ2RHaHBjeTVuY21Ga2FXVnVkQzV6ZEc5d2Mxc3hYUzV6WlhSQmRIUnlhV0oxZEdVb0oyOW1abk5sZENjc0lDY3hNREFsSnlrN1hHNWNiaUFnZlZ4dVhHNGdJSE5wZW1WSmJuUmxjbVpoWTJVb0tTQjdYRzVjYmlBZ0lDQjBhR2x6TG5CaFpDNXpaWFJCZEhSeWFXSjFkR1VvSjJONEp5eDBhR2x6TG5kcFpIUm9MeklwTzF4dUlDQWdJSFJvYVhNdWNHRmtMbk5sZEVGMGRISnBZblYwWlNnblkza25MSFJvYVhNdWFHVnBaMmgwTHpJcE8xeHVJQ0FnSUhSb2FYTXVjR0ZrTG5ObGRFRjBkSEpwWW5WMFpTZ25jaWNzSUUxaGRHZ3ViV2x1S0hSb2FYTXVkMmxrZEdnc2RHaHBjeTVvWldsbmFIUXBJQzhnTWlBdElIUm9hWE11ZDJsa2RHZ3ZOREFwTzF4dUlDQWdJSFJvYVhNdWNHRmtMbk5sZEVGMGRISnBZblYwWlNnbmMzUnliMnRsTFhkcFpIUm9KeXdnZEdocGN5NTNhV1IwYUM4eU1DazdYRzRnSUgxY2JseHVJQ0JqYjJ4dmNrbHVkR1Z5Wm1GalpTZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdVozSmhaR2xsYm5RdWMzUnZjSE5iTUYwdWMyVjBRWFIwY21saWRYUmxLQ2R6ZEc5d0xXTnZiRzl5Snl3Z2RHaHBjeTVqYjJ4dmNuTXVZV05qWlc1MEtUdGNiaUFnSUNCMGFHbHpMbWR5WVdScFpXNTBMbk4wYjNCeld6RmRMbk5sZEVGMGRISnBZblYwWlNnbmMzUnZjQzFqYjJ4dmNpY3NJSFJvYVhNdVkyOXNiM0p6TG1acGJHd3BPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc0Z0lIMWNibHh1SUNBdktseHVJQ0FxSUZWd1pHRjBaU0IwYUdVZ2RtbHpkV0ZzSUdsdWRHVnlabUZqWlNCMWMybHVaeUJwZEhNZ1kzVnljbVZ1ZENCemRHRjBaVnh1SUNBcVhHNGdJQ29nUUdWNFlXMXdiR1ZjYmlBZ0tpQmlkWFIwYjI0dWNtVnVaR1Z5S0NrN1hHNGdJQ292WEc0Z0lISmxibVJsY2lncElIdGNiaUFnSUNCcFppQW9JWFJvYVhNdWMzUmhkR1VwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVjR0ZrTG5ObGRFRjBkSEpwWW5WMFpTZ25abWxzYkNjc0lIUm9hWE11WTI5c2IzSnpMbVpwYkd3cE8xeHVJQ0FnSUNBZ2RHaHBjeTV3WVdRdWMyVjBRWFIwY21saWRYUmxLQ2R6ZEhKdmEyVW5MQ0IwYUdsekxtTnZiRzl5Y3k1dFpXUnBkVzFNYVdkb2RDazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG0xdlpHVTlQVDBuWVdaMFpYSjBiM1ZqYUNjcElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1d1lXUXVjMlYwUVhSMGNtbGlkWFJsS0NkemRISnZhMlVuTENBbmRYSnNLQ01uSzNSb2FYTXVaM0poWkdsbGJuUXVhV1FySnlrbktUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1bmNtRmthV1Z1ZEM1bGJHVnRaVzUwTG5ObGRFRjBkSEpwWW5WMFpTZ25ZM2duTENBb2RHaHBjeTV3YjNOcGRHbHZiaTU0S2pFd01Da3JKeVVuS1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVuY21Ga2FXVnVkQzVsYkdWdFpXNTBMbk5sZEVGMGRISnBZblYwWlNnblkza25MQ0FvS0RFdGRHaHBjeTV3YjNOcGRHbHZiaTU1S1NveE1EQXBLeWNsSnlrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbkJoWkM1elpYUkJkSFJ5YVdKMWRHVW9KM04wY205clpTY3NJSFJvYVhNdVkyOXNiM0p6TG1GalkyVnVkQ2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0IwYUdsekxuQmhaQzV6WlhSQmRIUnlhV0oxZEdVb0oyWnBiR3duTENCMGFHbHpMbU52Ykc5eWN5NWhZMk5sYm5RcE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc1OVhHNWNibHh1WEc0dkx5QlhSVUpRUVVOTElFWlBUMVJGVWlBdkwxeHVMeThnTGk5K0wycHphR2x1ZEMxc2IyRmtaWEloTGk5c2FXSXZhVzUwWlhKbVlXTmxjeTlpZFhSMGIyNHVhbk1pTENJbmRYTmxJSE4wY21samRDYzdYRzVjYm14bGRDQnpkbWNnUFNCeVpYRjFhWEpsS0NjdUxpOTFkR2xzTDNOMlp5Y3BPMXh1YkdWMElHMWhkR2dnUFNCeVpYRjFhWEpsS0NjdUxpOTFkR2xzTDIxaGRHZ25LVHRjYm14bGRDQlViMmRuYkdWTmIyUmxiQ0E5SUhKbGNYVnBjbVVvSnk0dUwyMXZaR1ZzY3k5MGIyZG5iR1VuS1R0Y2JteGxkQ0JKYm5SbGNtWmhZMlVnUFNCeVpYRjFhWEpsS0NjdUxpOWpiM0psTDJsdWRHVnlabUZqWlNjcE8xeHVYRzR2S2lwY2JrSjFkSFJ2YmlCVVpXMXdiR0YwWlZ4dUtpOWNibHh1Wlhod2IzSjBJR1JsWm1GMWJIUWdZMnhoYzNNZ1FuVjBkRzl1VkdWdGNHeGhkR1VnWlhoMFpXNWtjeUJKYm5SbGNtWmhZMlVnZTF4dVhHNGdJR052Ym5OMGNuVmpkRzl5S0dGeVozTXNiM0IwYVc5dWN5eGtaV1poZFd4MGN5a2dlMXh1WEc0Z0lDQWdjM1Z3WlhJb1lYSm5jeXh2Y0hScGIyNXpMR1JsWm1GMWJIUnpLVHRjYmx4dUlDQWdJSFJvYVhNdWJXOWtaU0E5SUhSb2FYTXVjMlYwZEdsdVozTXViVzlrWlNCOGZDQW5ZblYwZEc5dUp6dGNibHh1SUNBZ0lIUm9hWE11Y0c5emFYUnBiMjRnUFNCN1hHNGdJQ0FnSUNCNE9pQXdMRnh1SUNBZ0lDQWdlVG9nTUZ4dUlDQWdJSDA3WEc1Y2JpQWdJQ0IwYUdsekxsOXpkR0YwWlNBOUlHNWxkeUJVYjJkbmJHVk5iMlJsYkNoMGFHbHpMbk5sZEhScGJtZHpMbk4wWVhSbEtUdGNibHh1SUNCOVhHNWNiaUFnWW5WcGJHUkpiblJsY21aaFkyVW9LU0I3WEc0Z0lDQWdkR2hwY3k1d1lXUWdQU0J6ZG1jdVkzSmxZWFJsS0NkamFYSmpiR1VuS1R0Y2JpQWdJQ0IwYUdsekxuQmhaQzV6WlhSQmRIUnlhV0oxZEdVb0oyWnBiR3duTENBbkkyUXhPQ2NwTzF4dUlDQWdJSFJvYVhNdWNHRmtMbk5sZEVGMGRISnBZblYwWlNnbmMzUnliMnRsSnl3Z0p5TmtNVGduS1R0Y2JpQWdJQ0IwYUdsekxuQmhaQzV6WlhSQmRIUnlhV0oxZEdVb0ozTjBjbTlyWlMxM2FXUjBhQ2NzSURRcE8xeHVYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbUZ3Y0dWdVpFTm9hV3hrS0hSb2FYTXVjR0ZrS1R0Y2JseHVJQ0FnSUhSb2FYTXVhVzUwWlhKaFkzUnBiMjVVWVhKblpYUWdQU0IwYUdsekxuQmhaRHRjYmx4dUlDQWdJSFJvYVhNdWMybDZaVWx1ZEdWeVptRmpaU2dwTzF4dUlDQjlYRzVjYmlBZ2MybDZaVWx1ZEdWeVptRmpaU2dwSUh0Y2JpQWdJQ0IwYUdsekxuQmhaQzV6WlhSQmRIUnlhV0oxZEdVb0oyTjRKeXgwYUdsekxuZHBaSFJvTHpJcE8xeHVJQ0FnSUhSb2FYTXVjR0ZrTG5ObGRFRjBkSEpwWW5WMFpTZ25ZM2tuTEhSb2FYTXVhR1ZwWjJoMEx6SXBPMXh1SUNBZ0lIUm9hWE11Y0dGa0xuTmxkRUYwZEhKcFluVjBaU2duY2ljc0lFMWhkR2d1YldsdUtIUm9hWE11ZDJsa2RHZ3NkR2hwY3k1b1pXbG5hSFFwSUM4Z01pQXRJRElwTzF4dUlDQjlYRzVjYmlBZ2NtVnVaR1Z5S0NrZ2UxeHVJQ0FnSUdsbUlDZ2hkR2hwY3k1emRHRjBaU2tnZTF4dUlDQWdJQ0FnZEdocGN5NXdZV1F1YzJWMFFYUjBjbWxpZFhSbEtDZG1hV3hzSnl3Z2RHaHBjeTVqYjJ4dmNuTXVabWxzYkNrN1hHNGdJQ0FnSUNCMGFHbHpMbkJoWkM1elpYUkJkSFJ5YVdKMWRHVW9KM04wY205clpTY3NJSFJvYVhNdVkyOXNiM0p6TG0xbFpHbDFiVXhwWjJoMEtUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnZEdocGN5NXdZV1F1YzJWMFFYUjBjbWxpZFhSbEtDZG1hV3hzSnl3Z2RHaHBjeTVqYjJ4dmNuTXVZV05qWlc1MEtUdGNiaUFnSUNBZ0lIUm9hWE11Y0dGa0xuTmxkRUYwZEhKcFluVjBaU2duYzNSeWIydGxKeXdnZEdocGN5NWpiMnh2Y25NdVlXTmpaVzUwS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCa2IzZHVLSEJoYVc1MFluSjFjMmdwSUh0Y2JpQWdJQ0J6ZDJsMFkyZ2dLSFJvYVhNdWJXOWtaU2tnZTF4dUlDQWdJQ0FnWTJGelpTQW5hVzF3ZFd4elpTYzZYRzRnSUNBZ0lDQWdJSFJvYVhNdWRIVnliazl1S0NrN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxuUnBiV1Z2ZFhRcElIdGNiaUFnSUNBZ0lDQWdJQ0JqYkdWaGNsUnBiV1Z2ZFhRb2RHaHBjeTUwYVcxbGIzVjBLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCMGFHbHpMblJwYldWdmRYUWdQU0J6WlhSVWFXMWxiM1YwS0hSb2FYTXVkSFZ5Yms5bVppNWlhVzVrS0hSb2FYTXBMRE13S1R0Y2JpQWdJQ0F2THlBZ0lDQjBhR2x6TG1WdGFYUW9KMk5vWVc1blpTY3NkR2hwY3k1emRHRjBaU2s3WEc0Z0lDQWdJQ0FnSUdKeVpXRnJPMXh1SUNBZ0lDQWdZMkZ6WlNBblluVjBkRzl1SnpwY2JpQWdJQ0FnSUNBZ2RHaHBjeTUwZFhKdVQyNG9LVHRjYmlBZ0lDQXZMeUFnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc2RHaHBjeTV6ZEdGMFpTazdYRzRnSUNBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUNBZ1kyRnpaU0FuWVdaMFpYSjBiM1ZqYUNjNlhHNGdJQ0FnSUNBZ0lIUm9hWE11Y0c5emFYUnBiMjRnUFNCN1hHNGdJQ0FnSUNBZ0lDQWdlRG9nYldGMGFDNWpiR2x3S0hSb2FYTXViVzkxYzJVdWVDQXZJSFJvYVhNdWQybGtkR2dzTUN3eEtTeGNiaUFnSUNBZ0lDQWdJQ0I1T2lCdFlYUm9MbU5zYVhBb01TMTBhR2x6TG0xdmRYTmxMbmtnTHlCMGFHbHpMbWhsYVdkb2RDd3dMREVwWEc0Z0lDQWdJQ0FnSUgwN1hHNGdJQ0FnSUNBZ0lIUm9hWE11ZEhWeWJrOXVLQ2s3WEc0Z0lDQWdMeThnSUNBZ2RHaHBjeTVsYldsMEtDZGphR0Z1WjJVbkxIdGNiaUFnSUNBdkx5QWdJQ0FnSUhOMFlYUmxPaUIwYUdsekxuTjBZWFJsTEZ4dUlDQWdJQzh2SUNBZ0lDQWdlRG9nZEdocGN5NXdiM05wZEdsdmJpNTRMRnh1SUNBZ0lDOHZJQ0FnSUNBZ2VUb2dkR2hwY3k1d2IzTnBkR2x2Ymk1NUxGeHVJQ0FnSUM4dklDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCaWNtVmhhenRjYmlBZ0lDQWdJR05oYzJVZ0ozUnZaMmRzWlNjNlhHNGdJQ0FnSUNBZ0lIUm9hWE11Wm14cGNDaHdZV2x1ZEdKeWRYTm9LVHRjYmlBZ0lDQXZMeUFnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc2RHaHBjeTV6ZEdGMFpTazdYRzRnSUNBZ0lDQWdJR0p5WldGck8xeHVJQ0FnSUgxY2JseHVJQ0I5WEc1Y2JpQWdZbVZ1WkNodGIzVnpaU2tnZTF4dUlDQWdJR2xtSUNoMGFHbHpMbTF2WkdVOVBUMG5ZV1owWlhKMGIzVmphQ2NwSUh0Y2JpQWdJQ0FnSUhSb2FYTXViVzkxYzJVZ1BTQnRiM1Z6WlNCOGZDQjBhR2x6TG0xdmRYTmxPMXh1SUNBZ0lDQWdkR2hwY3k1d2IzTnBkR2x2YmlBOUlIdGNiaUFnSUNBZ0lDQWdlRG9nYldGMGFDNWpiR2x3S0hSb2FYTXViVzkxYzJVdWVDQXZJSFJvYVhNdWQybGtkR2dzTUN3eEtTeGNiaUFnSUNBZ0lDQWdlVG9nYldGMGFDNWpiR2x3S0RFZ0xTQjBhR2x6TG0xdmRYTmxMbmtnTHlCMGFHbHpMbWhsYVdkb2RDd3dMREVwWEc0Z0lDQWdJQ0I5TzF4dUlDQWdJQ0FnZEdocGN5NWxiV2wwS0NkamFHRnVaMlVuTEh0Y2JpQWdJQ0FnSUNBZ2MzUmhkR1U2SUhSb2FYTXVjM1JoZEdVc1hHNGdJQ0FnSUNBZ0lIZzZJSFJvYVhNdWNHOXphWFJwYjI0dWVDeGNiaUFnSUNBZ0lDQWdlVG9nZEdocGN5NXdiM05wZEdsdmJpNTVMRnh1SUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0IwYUdsekxuSmxibVJsY2lncE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lIVndLQ2tnZTF4dUlDQWdJSE4zYVhSamFDQW9kR2hwY3k1dGIyUmxLU0I3WEc0Z0lDQWdJQ0JqWVhObElDZGlkWFIwYjI0bk9seHVJQ0FnSUNBZ0lDQjBhR2x6TG5SMWNtNVBabVlvS1R0Y2JpQWdJQ0FnSUM4dklDQjBhR2x6TG1WdGFYUW9KMk5vWVc1blpTY3NkR2hwY3k1emRHRjBaU2s3WEc0Z0lDQWdJQ0FnSUdKeVpXRnJPMXh1SUNBZ0lDQWdZMkZ6WlNBbllXWjBaWEowYjNWamFDYzZYRzRnSUNBZ0lDQWdJSFJvYVhNdWRIVnliazltWmlncE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5CdmMybDBhVzl1SUQwZ2UxeHVJQ0FnSUNBZ0lDQWdJSGc2SUcxaGRHZ3VZMnhwY0NoMGFHbHpMbTF2ZFhObExuZ2dMeUIwYUdsekxuZHBaSFJvTERBc01Ta3NYRzRnSUNBZ0lDQWdJQ0FnZVRvZ2JXRjBhQzVqYkdsd0tERWdMU0IwYUdsekxtMXZkWE5sTG5rZ0x5QjBhR2x6TG1obGFXZG9kQ3d3TERFcFhHNGdJQ0FnSUNBZ0lIMDdYRzRnSUNBZ0lDQXZMeUFnZEdocGN5NWxiV2wwS0NkamFHRnVaMlVuTEh0Y2JpQWdJQ0FnSUM4dklDQWdJSE4wWVhSbE9pQjBhR2x6TG5OMFlYUmxMRnh1SUNBZ0lDQWdMeThnSUNBZ2VEb2dkR2hwY3k1d2IzTnBkR2x2Ymk1NExGeHVJQ0FnSUNBZ0x5OGdJQ0FnZVRvZ2RHaHBjeTV3YjNOcGRHbHZiaTU1TEZ4dUlDQWdJQ0FnTHk4Z0lIMHBPMXh1SUNBZ0lDQWdJQ0JpY21WaGF6dGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaUJ2ZG1WeWQzSnBkR0ZpYkdVZ2FXNTBaWEpoWTNScGIyNGdhR0Z1Wkd4bGNuTWdLaTljYmx4dUlDQmpiR2xqYXlncElIdGNiaUFnSUNCMGFHbHpMbVJ2ZDI0b0tUdGNiaUFnZlZ4dUlDQnRiM1psS0NrZ2UxeHVJQ0FnSUhSb2FYTXVZbVZ1WkNncE8xeHVJQ0I5WEc0Z0lISmxiR1ZoYzJVb0tTQjdYRzRnSUNBZ2RHaHBjeTUxY0NncE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lGZG9aWFJvWlhJZ2RHaGxJR0oxZEhSdmJpQnBjeUJ2YmlBb2NISmxjM05sWkNrZ2IzSWdiMlptSUNodWIzUWdjSEpsYzNObFpDbGNiaUFnUUhSNWNHVWdlMkp2YjJ4bFlXNTlYRzRnSUVCbGVHRnRjR3hsSUdKMWRIUnZiaTV6ZEdGMFpTQTlJSFJ5ZFdVN1hHNGdJQ292WEc0Z0lHZGxkQ0J6ZEdGMFpTZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVmYzNSaGRHVXVjM1JoZEdVN1hHNGdJSDFjYmlBZ2MyVjBJSE4wWVhSbEtIWmhiSFZsS1NCN1hHNGdJQ0FnZEdocGN5NWZjM1JoZEdVdVpteHBjQ2gyWVd4MVpTazdYRzRnSUNBZ2FXWWdLSFJvYVhNdWJXOWtaVDA5UFNkaFpuUmxjblJ2ZFdOb0p5a2dlMXh1SUNBZ0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSHRjYmlBZ0lDQWdJQ0FnYzNSaGRHVTZJSFJvYVhNdWMzUmhkR1VzWEc0Z0lDQWdJQ0FnSUhnNklIUm9hWE11Y0c5emFYUnBiMjR1ZUN4Y2JpQWdJQ0FnSUNBZ2VUb2dkR2hwY3k1d2IzTnBkR2x2Ymk1NUxGeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhSb2FYTXVaVzFwZENnblkyaGhibWRsSnl4MGFHbHpMbk4wWVhSbEtUdGNiaUFnSUNCOVhHNGdJQ0FnZEdocGN5NXlaVzVrWlhJb0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQkRhR0Z1WjJVZ2RHaGxJR0oxZEhSdmJpQjBieUJwZEhNZ1lXeDBaWEp1WVhSbElITjBZWFJsSUNodlptWTlQbTl1TENCdmJqMCtiMlptS1N3Z2IzSWdabXhwY0NCcGRDQjBieUJoSUhOd1pXTnBabWxsWkNCemRHRjBaUzVjYmlBZ1FIQmhjbUZ0SUhaaGJIVmxJSHRpYjI5c1pXRnVmU0FvVDNCMGFXOXVZV3dwSUZOMFlYUmxJSFJ2SUdac2FYQWdkRzh1WEc0Z0lFQmxlR0Z0Y0d4bElHSjFkSFJ2Ymk1bWJHbHdLQ2s3WEc0Z0lDb3ZYRzRnSUdac2FYQW9kbUZzZFdVcElIdGNiaUFnSUNCMGFHbHpMbDl6ZEdGMFpTNW1iR2x3S0haaGJIVmxLVHRjYmlBZ0lDQnBaaUFvZEdocGN5NXRiMlJsUFQwOUoyRm1kR1Z5ZEc5MVkyZ25LU0I3WEc0Z0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzZTF4dUlDQWdJQ0FnSUNCemRHRjBaVG9nZEdocGN5NXpkR0YwWlN4Y2JpQWdJQ0FnSUNBZ2VEb2dkR2hwY3k1d2IzTnBkR2x2Ymk1NExGeHVJQ0FnSUNBZ0lDQjVPaUIwYUdsekxuQnZjMmwwYVc5dUxua3NYRzRnSUNBZ0lDQjlLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVsYldsMEtDZGphR0Z1WjJVbkxIUm9hWE11YzNSaGRHVXBPMXh1SUNBZ0lIMWNiaUFnSUNCMGFHbHpMbkpsYm1SbGNpZ3BPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJRlIxY200Z2RHaGxJR0oxZEhSdmJpZHpJSE4wWVhSbElIUnZJSFJ5ZFdVdVhHNGdJRUJsZUdGdGNHeGxJR0oxZEhSdmJpNTBkWEp1VDI0b0tUdGNiaUFnS2k5Y2JpQWdkSFZ5Yms5dUtHVnRhWFIwYVc1bktTQjdYRzRnSUNBZ2RHaHBjeTVmYzNSaGRHVXViMjRvS1R0Y2JpQWdJQ0JwWmlBb1pXMXBkSFJwYm1jaFBUMW1ZV3h6WlNrZ2UxeHVJQ0FnSUNBZ2FXWWdLSFJvYVhNdWJXOWtaVDA5UFNkaFpuUmxjblJ2ZFdOb0p5a2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzZTF4dUlDQWdJQ0FnSUNBZ0lITjBZWFJsT2lCMGFHbHpMbk4wWVhSbExGeHVJQ0FnSUNBZ0lDQWdJSGc2SUhSb2FYTXVjRzl6YVhScGIyNHVlQ3hjYmlBZ0lDQWdJQ0FnSUNCNU9pQjBhR2x6TG5CdmMybDBhVzl1TG5rc1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSFJvYVhNdWMzUmhkR1VwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQjBhR2x6TG5KbGJtUmxjaWdwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUZSMWNtNGdkR2hsSUdKMWRIUnZiaWR6SUhOMFlYUmxJSFJ2SUdaaGJITmxMbHh1SUNCQVpYaGhiWEJzWlNCaWRYUjBiMjR1ZEhWeWJrOW1aaWdwTzF4dUlDQXFMMXh1SUNCMGRYSnVUMlptS0dWdGFYUjBhVzVuS1NCN1hHNGdJQ0FnZEdocGN5NWZjM1JoZEdVdWIyWm1LQ2s3WEc0Z0lDQWdhV1lnS0dWdGFYUjBhVzVuSVQwOVptRnNjMlVwSUh0Y2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG0xdlpHVTlQVDBuWVdaMFpYSjBiM1ZqYUNjcElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSHRjYmlBZ0lDQWdJQ0FnSUNCemRHRjBaVG9nZEdocGN5NXpkR0YwWlN4Y2JpQWdJQ0FnSUNBZ0lDQjRPaUIwYUdsekxuQnZjMmwwYVc5dUxuZ3NYRzRnSUNBZ0lDQWdJQ0FnZVRvZ2RHaHBjeTV3YjNOcGRHbHZiaTU1TEZ4dUlDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WlcxcGRDZ25ZMmhoYm1kbEp5eDBhR2x6TG5OMFlYUmxLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ2ZWeHVYRzU5WEc1Y2JseHVYRzR2THlCWFJVSlFRVU5MSUVaUFQxUkZVaUF2TDF4dUx5OGdMaTkrTDJwemFHbHVkQzFzYjJGa1pYSWhMaTlzYVdJdlkyOXRjRzl1Wlc1MGN5OWlkWFIwYjI1MFpXMXdiR0YwWlM1cWN5SXNJaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHViR1YwSUVKMWRIUnZibFJsYlhCc1lYUmxJRDBnY21WeGRXbHlaU2duTGk0dlkyOXRjRzl1Wlc1MGN5OWlkWFIwYjI1MFpXMXdiR0YwWlNjcE8xeHVYRzR2S2lwY2Jpb2dWR1Y0ZEVKMWRIUnZibHh1S2x4dUtpQkFaR1Z6WTNKcGNIUnBiMjRnVkdWNGRDQmlkWFIwYjI1Y2JpcGNiaW9nUUdSbGJXOGdQSE53WVc0Z2JtVjRkWE10ZFdrOVhDSjBaWGgwUW5WMGRHOXVYQ0krUEM5emNHRnVQbHh1S2x4dUtpQkFaWGhoYlhCc1pWeHVLaUIyWVhJZ2RHVjRkR0oxZEhSdmJpQTlJRzVsZHlCT1pYaDFjeTVVWlhoMFFuVjBkRzl1S0NjamRHRnlaMlYwSnlsY2JpcGNiaW9nUUdWNFlXMXdiR1ZjYmlvZ2RtRnlJSFJsZUhSaWRYUjBiMjRnUFNCdVpYY2dUbVY0ZFhNdVZHVjRkRUoxZEhSdmJpZ25JM1JoY21kbGRDY3NlMXh1S2lBZ0lDQWdKM05wZW1Vbk9pQmJNVFV3TERVd1hTeGNiaW9nSUNBZ0lDZHpkR0YwWlNjNklHWmhiSE5sTEZ4dUtpQWdJQ0FnSjNSbGVIUW5PaUFuVUd4aGVTY3NYRzRxSUNBZ0lDQW5ZV3gwWlhKdVlYUmxWR1Y0ZENjNklDZFRkRzl3SjF4dUtpQjlLVnh1S2x4dUtpQkFiM1YwY0hWMFhHNHFJR05vWVc1blpWeHVLaUJHYVhKbGN5QmhibmtnZEdsdFpTQjBhR1VnYVc1MFpYSm1ZV05sSjNNZ2RtRnNkV1VnWTJoaGJtZGxjeTRnUEdKeVBseHVLaUJVYUdVZ1pYWmxiblFnWkdGMFlTQnBjeUJoSUR4cFBuTjBjbWx1Wnp3dmFUNGdiMllnZEdobElIUmxlSFFnYjI0Z2RHaGxJR0oxZEhSdmJpQmhkQ0IwYUdVZ2JXOXRaVzUwSUdsMElIZGhjeUJqYkdsamEyVmtMbHh1S2x4dUtpQkFiM1YwY0hWMFpYaGhiWEJzWlZ4dUtpQjBaWGgwWW5WMGRHOXVMbTl1S0NkamFHRnVaMlVuTEdaMWJtTjBhVzl1S0hZcElIdGNiaW9nSUNCamIyNXpiMnhsTG14dlp5aDJLVHRjYmlvZ2ZTbGNiaXBjYmlvdlhHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHTnNZWE56SUZSbGVIUkNkWFIwYjI0Z1pYaDBaVzVrY3lCQ2RYUjBiMjVVWlcxd2JHRjBaU0I3WEc1Y2JpQWdZMjl1YzNSeWRXTjBiM0lvS1NCN1hHNWNiaUFnSUNCc1pYUWdiM0IwYVc5dWN5QTlJRnNuZG1Gc2RXVW5YVHRjYmx4dUlDQWdJR3hsZENCa1pXWmhkV3gwY3lBOUlIdGNiaUFnSUNBZ0lDZHphWHBsSnpvZ1d6RTFNQ3cxTUYwc1hHNGdJQ0FnSUNBbmMzUmhkR1VuT2lCbVlXeHpaU3hjYmlBZ0lDQWdJQ2QwWlhoMEp6b2dKMUJzWVhrblhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUhOMWNHVnlLR0Z5WjNWdFpXNTBjeXh2Y0hScGIyNXpMR1JsWm1GMWJIUnpLVHRjYmx4dUlDQWdJSFJvYVhNdVgzUmxlSFFnUFNCMGFHbHpMbk5sZEhScGJtZHpMblJsZUhRN1hHNWNiaUFnSUNCcFppaDBhR2x6TG5ObGRIUnBibWR6TG1Gc2RHVnlibUYwWlNsN0lDOHZWRTlFVHpvZ1VtVnRiM1psSUhSb2FYTWdZMjl1WkdsMGFXOXVZV3dnYVc0Z1lTQmljbVZoYTJsdVp5MWphR0Z1WjJWeklISmxiR1ZoYzJWY2JpQWdJQ0FnSUhSb2FYTXVjMlYwZEdsdVozTXVZV3gwWlhKdVlYUmxWR1Y0ZENBOUlIUm9hWE11YzJWMGRHbHVaM011WVd4MFpYSnVZWFJsTzF4dUlDQWdJQ0FnWTI5dWMyOXNaUzUzWVhKdUtGd2lKMkZzZEdWeWJtRjBaU2NnYVc1cGRHbGhkRzl5SUdseklHUmxjSEpsWTJGMFpXUXVJRlZ6WlNBbllXeDBaWEp1WVhSbFZHVjRkQ2NnYVc1emRHVmhaQzVjSWlrN1hHNGdJQ0FnZlZ4dUlDQWdJSFJvYVhNdVgyRnNkR1Z5Ym1GMFpWUmxlSFFnUFNCMGFHbHpMbk5sZEhScGJtZHpMbUZzZEdWeWJtRjBaVlJsZUhRN1hHNGdJQ0FnZEdocGN5NXRiMlJsSUQwZ0tIUm9hWE11YzJWMGRHbHVaM011WVd4MFpYSnVZWFJsVkdWNGRDa2dQeUFuZEc5bloyeGxKeUE2SUNkaWRYUjBiMjRuTzF4dUlDQWdJSFJvYVhNdWFXNXBkQ2dwTzF4dUlDQWdJSFJvYVhNdWNtVnVaR1Z5S0NrN1hHNWNiaUFnSUNCMGFHbHpMbk4wWVhSbElEMGdkR2hwY3k1elpYUjBhVzVuY3k1emRHRjBaVHRjYmx4dUlDQjlYRzVjYmlBZ1luVnBiR1JHY21GdFpTZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZENBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblFvSjJScGRpY3BPMXh1SUNBZ0lIUm9hWE11Y0dGeVpXNTBMbUZ3Y0dWdVpFTm9hV3hrS0hSb2FYTXVaV3hsYldWdWRDazdYRzVjYmlBZ0lDQjBhR2x6TG5SbGVIUkZiR1Z0Wlc1MElEMGdaRzlqZFcxbGJuUXVZM0psWVhSbFJXeGxiV1Z1ZENnblpHbDJKeWs3WEc0Z0lDQWdkR2hwY3k1MFpYaDBSV3hsYldWdWRDNXBibTVsY2toVVRVd2dQU0IwYUdsekxsOTBaWGgwTzF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1aGNIQmxibVJEYUdsc1pDaDBhR2x6TG5SbGVIUkZiR1Z0Wlc1MEtUdGNiaUFnZlZ4dVhHNGdJR0oxYVd4a1NXNTBaWEptWVdObEtDa2dlMXh1WEc0Z0lIMWNibHh1SUNCamIyeHZja2x1ZEdWeVptRmpaU2dwSUh0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWMzUjViR1V1WTI5c2IzSWdQU0IwYUdsekxtTnZiRzl5Y3k1a1lYSnJPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc0Z0lIMWNibHh1SUNCemFYcGxTVzUwWlhKbVlXTmxLQ2tnZTF4dUlDQWdJQ0FnYkdWMElIUmxlSFJ6YVhwbElEMGdkR2hwY3k1b1pXbG5hSFF2TXp0Y2JpQWdJQ0FnSUd4bGRDQjBaWGgwYzJsNlpUSWdQU0FvZEdocGN5NTNhV1IwYUNBdklDaDBhR2x6TGw5MFpYaDBMbXhsYm1kMGFDQXJJRElwSUNrN1hHNGdJQ0FnSUNCMFpYaDBjMmw2WlNBOUlFMWhkR2d1YldsdUtIUmxlSFJ6YVhwbExIUmxlSFJ6YVhwbE1pazdYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NWhiSFJsY201aGRHVlVaWGgwS1NCN1hHNGdJQ0FnSUNBZ0lHeGxkQ0IwWlhoMGMybDZaVE1nUFNBb2RHaHBjeTUzYVdSMGFDQXZJQ2gwYUdsekxtRnNkR1Z5Ym1GMFpWUmxlSFF1YkdWdVozUm9JQ3NnTWlrZ0tUdGNiaUFnSUNBZ0lDQWdkR1Y0ZEhOcGVtVWdQU0JOWVhSb0xtMXBiaWgwWlhoMGMybDZaU3gwWlhoMGMybDZaVE1wTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYkdWMElITjBlV3hsY3lBOUlDZDNhV1IwYURvZ0p5QXJJSFJvYVhNdWQybGtkR2dnS3lBbmNIZzdKenRjYmlBZ0lDQWdJSE4wZVd4bGN5QXJQU0FuYUdWcFoyaDBPaUFuSUNzZ2RHaHBjeTVvWldsbmFIUWdLeUFuY0hnN0p6dGNiaUFnSUNBZ0lITjBlV3hsY3lBclBTQW5jR0ZrWkdsdVp6b2dKeXNvZEdocGN5NW9aV2xuYUhRdGRHVjRkSE5wZW1VcEx6SXJKM0I0SURCd2VEc25PMXh1SUNBZ0lDQWdjM1I1YkdWeklDczlJQ2RpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE95YzdYRzRnSUNBZ0lDQnpkSGxzWlhNZ0t6MGdKM1JsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanNuTzF4dUlDQWdJQ0FnYzNSNWJHVnpJQ3M5SUNkbWIyNTBMV1poYldsc2VUb2dhVzVvWlhKcGREc25PMXh1SUNBZ0lDQWdjM1I1YkdWeklDczlJQ2RtYjI1MExYZGxhV2RvZERvZ056QXdPeWM3WEc0Z0lDQWdJQ0J6ZEhsc1pYTWdLejBnSjI5d1lXTnBkSGs2SURFN0p6dGNiaUFnSUNBZ0lITjBlV3hsY3lBclBTQW5abTl1ZEMxemFYcGxPaWNnS3lCMFpYaDBjMmw2WlNBcklDZHdlRHNuTzF4dUlDQWdJQ0FnZEdocGN5NTBaWGgwUld4bGJXVnVkQzV6ZEhsc1pTNWpjM05VWlhoMElEMGdjM1I1YkdWek8xeHVJQ0FnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ2ZWeHVYRzRnSUhKbGJtUmxjaWdwSUh0Y2JpQWdJQ0JwWmlBb0lYUm9hWE11YzNSaGRHVXBJSHRjYmlBZ0lDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1emRIbHNaUzVpWVdOclozSnZkVzVrUTI5c2IzSWdQU0IwYUdsekxtTnZiRzl5Y3k1bWFXeHNPMXh1SUNBZ0lDQWdkR2hwY3k1MFpYaDBSV3hsYldWdWRDNXpkSGxzWlM1amIyeHZjaUE5SUhSb2FYTXVZMjlzYjNKekxtUmhjbXM3WEc0Z0lDQWdJQ0IwYUdsekxuUmxlSFJGYkdWdFpXNTBMbWx1Ym1WeVNGUk5UQ0E5SUhSb2FYTXVYM1JsZUhRN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1emRIbHNaUzVpWVdOclozSnZkVzVrUTI5c2IzSWdQU0IwYUdsekxtTnZiRzl5Y3k1aFkyTmxiblE3WEc0Z0lDQWdJQ0IwYUdsekxuUmxlSFJGYkdWdFpXNTBMbk4wZVd4bExtTnZiRzl5SUQwZ2RHaHBjeTVqYjJ4dmNuTXVabWxzYkR0Y2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG1Gc2RHVnlibUYwWlZSbGVIUXBJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTBaWGgwUld4bGJXVnVkQzVwYm01bGNraFVUVXdnUFNCMGFHbHpMbDloYkhSbGNtNWhkR1ZVWlhoME8xeHVJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUwWlhoMFJXeGxiV1Z1ZEM1cGJtNWxja2hVVFV3Z1BTQjBhR2x6TGw5MFpYaDBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQlVhR1VnZEdWNGRDQjBieUJrYVhOd2JHRjVJSGRvWlc0Z2RHaGxJR0oxZEhSdmJpQnBjeUJwYmlCcGRITWdYQ0p2Ymx3aUlITjBZWFJsTGlCSlppQnpaWFFzSUhSb2FYTWdjSFYwY3lCMGFHVWdZblYwZEc5dUlHbHVJRndpZEc5bloyeGxYQ0lnYlc5a1pTNWNiaUFnUUhSNWNHVWdlMU4wY21sdVozMWNiaUFnS2k5Y2JpQWdaMlYwSUdGc2RHVnlibUYwWlZSbGVIUW9LU0I3WEc0Z0lDQWdjbVYwZFhKdUlIUm9hWE11WDJGc2RHVnlibUYwWlZSbGVIUTdYRzRnSUgxY2JseHVJQ0J6WlhRZ1lXeDBaWEp1WVhSbFZHVjRkQ2gwWlhoMEtTQjdYRzRnSUNBZ2FXWWdLSFJsZUhRcElIdGNiaUFnSUNBZ0lIUm9hWE11Ylc5a1pTQTlJQ2QwYjJkbmJHVW5PMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFHbHpMbTF2WkdVZ1BTQW5ZblYwZEc5dUp6dGNiaUFnSUNCOVhHNGdJQ0FnZEdocGN5NWZZV3gwWlhKdVlYUmxWR1Y0ZENBOUlIUmxlSFE3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdmVnh1WEc1Y2JpQWdMeW9xWEc0Z0lGUm9aU0IwWlhoMElIUnZJR1JwYzNCc1lYa3VJQ2hKWmlBdVlXeDBaWEp1WVhSbFZHVjRkQ0JsZUdsemRITXNJSFJvWlc0Z2RHaHBjeUF1ZEdWNGRDQjNhV3hzSUc5dWJIa2dZbVVnWkdsemNHeGhlV1ZrSUhkb1pXNGdkR2hsSUdKMWRIUnZiaUJwY3lCcGJpQnBkSE1nWENKdlptWmNJaUJ6ZEdGMFpTNHBYRzRnSUVCMGVYQmxJSHRUZEhKcGJtZDlYRzRnSUNvdlhHNGdJR2RsZENCMFpYaDBLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5MFpYaDBPMXh1SUNCOVhHNWNiaUFnYzJWMElIUmxlSFFvZEdWNGRDa2dlMXh1SUNBZ0lIUm9hWE11WDNSbGVIUWdQU0IwWlhoME8xeHVJQ0FnSUhSb2FYTXVjMmw2WlVsdWRHVnlabUZqWlNncE8xeHVJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDazdYRzRnSUgxY2JseHVYRzU5WEc1Y2JseHVYRzR2THlCWFJVSlFRVU5MSUVaUFQxUkZVaUF2TDF4dUx5OGdMaTkrTDJwemFHbHVkQzFzYjJGa1pYSWhMaTlzYVdJdmFXNTBaWEptWVdObGN5OTBaWGgwWW5WMGRHOXVMbXB6SWl3aUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc0dkwyeGxkQ0J6ZG1jZ1BTQnlaWEYxYVhKbEtDY3VMaTkxZEdsc0wzTjJaeWNwTzF4dWJHVjBJRWx1ZEdWeVptRmpaU0E5SUhKbGNYVnBjbVVvSnk0dUwyTnZjbVV2YVc1MFpYSm1ZV05sSnlrN1hHNXNaWFFnUW5WMGRHOXVJRDBnY21WeGRXbHlaU2duTGk0dmFXNTBaWEptWVdObGN5OWlkWFIwYjI0bktUdGNibHh1THlvcVhHNHFJRkpoWkdsdlFuVjBkRzl1WEc0cVhHNHFJRUJrWlhOamNtbHdkR2x2YmlCQmJpQmhjbkpoZVNCdlppQmlkWFIwYjI1ekxpQkNlU0JrWldaaGRXeDBMQ0J6Wld4bFkzUnBibWNnYjI1bElHSjFkSFJ2YmlCM2FXeHNJR1JsYzJWc1pXTjBJR0ZzYkNCdmRHaGxjaUJpZFhSMGIyNXpMQ0JpZFhRZ2RHaHBjeUJqWVc0Z1ltVWdZM1Z6ZEc5dGFYcGxaQ0IxYzJsdVp5QjBhR1VnUVZCSklHSmxiRzkzTGx4dUtseHVLaUJBWkdWdGJ5QThaR2wySUc1bGVIVnpMWFZwUFZ3aVVtRmthVzlDZFhSMGIyNWNJajQ4TDJScGRqNWNiaXBjYmlvZ1FHVjRZVzF3YkdWY2Jpb2dkbUZ5SUhKaFpHbHZZblYwZEc5dUlEMGdibVYzSUU1bGVIVnpMbEpoWkdsdlFuVjBkRzl1S0NjamRHRnlaMlYwSnlsY2JpcGNiaW9nUUdWNFlXMXdiR1ZjYmlvZ2RtRnlJSEpoWkdsdlluVjBkRzl1SUQwZ2JtVjNJRTVsZUhWekxsSmhaR2x2UW5WMGRHOXVLQ2NqZEdGeVoyVjBKeXg3WEc0cUlDQWdKM05wZW1Vbk9pQmJNVEl3TERJMVhTeGNiaW9nSUNBbmJuVnRZbVZ5VDJaQ2RYUjBiMjV6SnpvZ05DeGNiaW9nSUNBbllXTjBhWFpsSnpvZ0xURmNiaW9nZlNsY2JpcGNiaW9nUUc5MWRIQjFkRnh1S2lCamFHRnVaMlZjYmlvZ1JtbHlaWE1nWVc1NUlIUnBiV1VnZEdobElHbHVkR1Z5Wm1GalpTZHpJSFpoYkhWbElHTm9ZVzVuWlhNdUlEeGljajVjYmlvZ1ZHaGxJR1YyWlc1MElHUmhkR0VnWVc0Z1BHaythVzUwWldkbGNqd3ZhVDRzSUhSb1pTQnBibVJsZUNCdlppQjBhR1VnWW5WMGRHOXVJSFJvWVhRZ2FYTWdZM1Z5Y21WdWRHeDVJRzl1TGlCSlppQnVieUJpZFhSMGIyNGdhWE1nYzJWc1pXTjBaV1FzSUhSb1pTQjJZV3gxWlNCM2FXeHNJR0psSUMweExseHVLbHh1S2lCQWIzVjBjSFYwWlhoaGJYQnNaVnh1S2lCeVlXUnBiMkoxZEhSdmJpNXZiaWduWTJoaGJtZGxKeXhtZFc1amRHbHZiaWgyS1NCN1hHNHFJQ0FnWTI5dWMyOXNaUzVzYjJjb2RpazdYRzRxSUgwcFhHNHFYRzRxTDF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamJHRnpjeUJTWVdScGIwSjFkSFJ2YmlCbGVIUmxibVJ6SUVsdWRHVnlabUZqWlNCN1hHNWNiaUFnWTI5dWMzUnlkV04wYjNJb0tTQjdYRzVjYmlBZ0lDQnNaWFFnYjNCMGFXOXVjeUE5SUZzbmRtRnNkV1VuWFR0Y2JseHVJQ0FnSUd4bGRDQmtaV1poZFd4MGN5QTlJSHRjYmlBZ0lDQWdJQ2R6YVhwbEp6b2dXekV5TUN3eU5WMHNYRzRnSUNBZ0lDQW5iblZ0WW1WeVQyWkNkWFIwYjI1ekp6b2dOQ3hjYmlBZ0lDQWdJQ2RoWTNScGRtVW5PaUF0TVZ4dUlDQWdJSDA3WEc1Y2JpQWdJQ0J6ZFhCbGNpaGhjbWQxYldWdWRITXNiM0IwYVc5dWN5eGtaV1poZFd4MGN5azdYRzVjYmlBZ0lDQjBhR2x6TG1KMWRIUnZibk1nUFNCYlhUdGNiaUFnSUNCMGFHbHpMbDl1ZFcxaVpYSlBaa0oxZEhSdmJuTWdQU0IwYUdsekxuTmxkSFJwYm1kekxtNTFiV0psY2s5bVFuVjBkRzl1Y3p0Y2JpQWdJQ0IwYUdsekxtRmpkR2wyWlNBOUlIUm9hWE11YzJWMGRHbHVaM011WVdOMGFYWmxPMXh1WEc0Z0lDQWdkR2hwY3k1cGJtbDBLQ2s3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JseHVJQ0I5WEc1Y2JpQWdZblZwYkdSR2NtRnRaU2dwSUh0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RZ1BTQmtiMk4xYldWdWRDNWpjbVZoZEdWRmJHVnRaVzUwS0Nka2FYWW5LVHRjYmlBZ0lDQjBhR2x6TG5CaGNtVnVkQzVoY0hCbGJtUkRhR2xzWkNoMGFHbHpMbVZzWlcxbGJuUXBPMXh1SUNCOVhHNWNiaUFnWW5WcGJHUkpiblJsY21aaFkyVW9LU0I3WEc1Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwUFRBN2FUeDBhR2x6TGw5dWRXMWlaWEpQWmtKMWRIUnZibk03YVNzcktTQjdYRzRnSUNBZ0lDQnNaWFFnWTI5dWRHRnBibVZ5SUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2duYzNCaGJpY3BPMXh1WEc0Z0lDQWdJQ0JzWlhRZ1luVjBkRzl1SUQwZ2JtVjNJRUoxZEhSdmJpaGpiMjUwWVdsdVpYSXNJSHRjYmlBZ0lDQWdJQ0FnSUNCdGIyUmxPaUFuZEc5bloyeGxKeXhjYmlBZ0lDQWdJQ0FnSUNCamIyMXdiMjVsYm5RNklIUnlkV1VzWEc0Z0lDQWdJQ0FnSUgwc0lIUm9hWE11ZFhCa1lYUmxMbUpwYm1Rb2RHaHBjeXhwS1NrN1hHNWNiaUFnSUNBZ0lIUm9hWE11WW5WMGRHOXVjeTV3ZFhOb0tHSjFkSFJ2YmlrN1hHNGdJQ0FnSUNCMGFHbHpMbVZzWlcxbGJuUXVZWEJ3Wlc1a1EyaHBiR1FvWTI5dWRHRnBibVZ5S1R0Y2JpQWdJQ0I5WEc1Y2JpQWdmVnh1WEc0Z0lITnBlbVZKYm5SbGNtWmhZMlVvS1NCN1hHNWNiaUFnSUNCc1pYUWdZblYwZEc5dVYybGtkR2dnUFNCMGFHbHpMbmRwWkhSb0lDOGdkR2hwY3k1ZmJuVnRZbVZ5VDJaQ2RYUjBiMjV6TzF4dUlDQWdJR3hsZENCaWRYUjBiMjVJWldsbmFIUWdQU0IwYUdsekxtaGxhV2RvZER0Y2JseHVJQ0FnSUdadmNpQW9iR1YwSUdrOU1EdHBQSFJvYVhNdVgyNTFiV0psY2s5bVFuVjBkRzl1Y3p0cEt5c3BJSHRjYmlBZ0lDQWdJSFJvYVhNdVluVjBkRzl1YzF0cFhTNXlaWE5wZW1Vb1luVjBkRzl1VjJsa2RHZ3NZblYwZEc5dVNHVnBaMmgwS1R0Y2JpQWdJQ0I5WEc1Y2JpQWdmVnh1WEc0Z0lHTnZiRzl5U1c1MFpYSm1ZV05sS0NrZ2UxeHVJQ0FnSUdadmNpQW9iR1YwSUdrOU1EdHBQSFJvYVhNdVgyNTFiV0psY2s5bVFuVjBkRzl1Y3p0cEt5c3BJSHRjYmlBZ0lDQWdJSFJvYVhNdVluVjBkRzl1YzF0cFhTNWpiMnh2Y25NZ1BTQjBhR2x6TG1OdmJHOXljenRjYmlBZ0lDQWdJSFJvYVhNdVluVjBkRzl1YzF0cFhTNXlaVzVrWlhJb0tUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQjFjR1JoZEdVb2FXNWtaWGdwSUh0Y2JpQWdJQ0JwWmlBb2RHaHBjeTVpZFhSMGIyNXpXMmx1WkdWNFhTNXpkR0YwWlNrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV6Wld4bFkzUW9hVzVrWlhncE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IwYUdsekxtUmxjMlZzWldOMEtDazdYRzRnSUNBZ2ZWeHVJQ0F2THlBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ2ZWeHVYRzRnSUhKbGJtUmxjaWdwSUh0Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwUFRBN2FUeDBhR2x6TG1KMWRIUnZibk11YkdWdVozUm9PMmtyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLR2s5UFQxMGFHbHpMbUZqZEdsMlpTa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtSjFkSFJ2Ym5OYmFWMHVkSFZ5Yms5dUtHWmhiSE5sS1R0Y2JpQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVZblYwZEc5dWMxdHBYUzUwZFhKdVQyWm1LR1poYkhObEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ1UyVnNaV04wSUc5dVpTQmlkWFIwYjI0Z1lXNWtJR1JsYzJWc1pXTjBJR0ZzYkNCdmRHaGxjaUJpZFhSMGIyNXpMbHh1SUNCQWNHRnlZVzBnYVc1a1pYZ2dlMjUxYldKbGNuMGdWR2hsSUdsdVpHVjRJRzltSUhSb1pTQmlkWFIwYjI0Z2RHOGdjMlZzWldOMFhHNGdJQ292WEc0Z0lITmxiR1ZqZENocGJtUmxlQ2tnZTF4dUlDQWdJR2xtSUNocGJtUmxlRDQ5TUNBbUppQnBibVJsZUNBOElIUm9hWE11WW5WMGRHOXVjeTVzWlc1bmRHZ3BJSHRjYmlBZ0lDQWdJSFJvYVhNdVlXTjBhWFpsSUQwZ2FXNWtaWGc3WEc0Z0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzZEdocGN5NWhZM1JwZG1VcE8xeHVJQ0FnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdSR1Z6Wld4bFkzUWdZV3hzSUdKMWRIUnZibk11WEc0Z0lDb3ZYRzRnSUdSbGMyVnNaV04wS0NrZ2UxeHVJQ0FnSUhSb2FYTXVZV04wYVhabElEMGdMVEU3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSFJvYVhNdVlXTjBhWFpsS1R0Y2JpQWdJQ0IwYUdsekxuSmxibVJsY2lncE8xeHVJQ0I5WEc1Y2JpQWdaMlYwSUc1MWJXSmxjazltUW5WMGRHOXVjeWdwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1ZmJuVnRZbVZ5VDJaQ2RYUjBiMjV6TzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUNBcUlGVndaR0YwWlNCb2IzY2diV0Z1ZVNCaWRYUjBiMjV6SUdGeVpTQnBiaUIwYUdVZ2FXNTBaWEptWVdObFhHNGdJQ0FxSUVCd1lYSmhiU0FnZTI1MWJXSmxjbjBnWW5WMGRHOXVjeUJJYjNjZ2JXRnVlU0JpZFhSMGIyNXpJR0Z5WlNCcGJpQjBhR1VnYVc1MFpYSm1ZV05sWEc0Z0lDQXFMMXh1SUNCelpYUWdiblZ0WW1WeVQyWkNkWFIwYjI1ektHSjFkSFJ2Ym5NcElIdGNiaUFnSUNCMGFHbHpMbDl1ZFcxaVpYSlBaa0oxZEhSdmJuTWdQU0JpZFhSMGIyNXpPMXh1SUNBZ0lHWnZjaUFvYkdWMElHazlNRHRwUEhSb2FYTXVZblYwZEc5dWN5NXNaVzVuZEdnN2FTc3JLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtSjFkSFJ2Ym5OYmFWMHVaR1Z6ZEhKdmVTZ3BPMXh1SUNBZ0lIMWNiaUFnSUNCMGFHbHpMbUoxZEhSdmJuTWdQU0JiWFR0Y2JpQWdMeThnSUdadmNpQW9iR1YwSUdrOU1EdHBQSFJvYVhNdVluVjBkRzl1Y3k1c1pXNW5kR2c3YVNzcktTQjdYRzRnSUM4dklDQWdJSFJvYVhNdVluVjBkRzl1YzF0cFhTNWtaWE4wY205NUtDazdYRzRnSUM4dklDQjlYRzRnSUNBZ2RHaHBjeTVsYlhCMGVTZ3BPMXh1SUNBZ0lIUm9hWE11WW5WcGJHUkpiblJsY21aaFkyVW9LVHRjYmlBZ2ZWeHVYRzU5WEc1Y2JseHVYRzR2THlCWFJVSlFRVU5MSUVaUFQxUkZVaUF2TDF4dUx5OGdMaTkrTDJwemFHbHVkQzFzYjJGa1pYSWhMaTlzYVdJdmFXNTBaWEptWVdObGN5OXlZV1JwYjJKMWRIUnZiaTVxY3lJc0lpZDFjMlVnYzNSeWFXTjBKenRjYmx4dWJHVjBJRWx1ZEdWeVptRmpaU0E5SUhKbGNYVnBjbVVvSnk0dUwyTnZjbVV2YVc1MFpYSm1ZV05sSnlrN1hHNXNaWFFnVTNSbGNDQTlJSEpsY1hWcGNtVW9KeTR1TDIxdlpHVnNjeTl6ZEdWd0p5azdYRzVzWlhRZ2JXRjBhQ0E5SUhKbGNYVnBjbVVvSnk0dUwzVjBhV3d2YldGMGFDY3BPMXh1WEc0dktpcGNiaW9nVG5WdFltVnlYRzRxWEc0cUlFQmtaWE5qY21sd2RHbHZiaUJPZFcxaVpYSWdhVzUwWlhKbVlXTmxJSGRvYVdOb0lHbHpJR052Ym5SeWIyeHNZV0pzWlNCaWVTQmtjbUZuWjJsdVp5QnZjaUIwZVhCcGJtY3VYRzRxWEc0cUlFQmtaVzF2SUR4emNHRnVJRzVsZUhWekxYVnBQVndpYm5WdFltVnlYQ0krUEM5emNHRnVQbHh1S2x4dUtpQkFaWGhoYlhCc1pWeHVLaUIyWVhJZ2JuVnRZbVZ5SUQwZ2JtVjNJRTVsZUhWekxrNTFiV0psY2lnbkkzUmhjbWRsZENjcFhHNHFYRzRxSUVCbGVHRnRjR3hsWEc0cUlIWmhjaUJ1ZFcxaVpYSWdQU0J1WlhjZ1RtVjRkWE11VG5WdFltVnlLQ2NqZEdGeVoyVjBKeXg3WEc0cUlDQWdKM05wZW1Vbk9pQmJOakFzTXpCZExGeHVLaUFnSUNkMllXeDFaU2M2SURBc1hHNHFJQ0FnSjIxcGJpYzZJREFzWEc0cUlDQWdKMjFoZUNjNklESXdNREF3TEZ4dUtpQWdJQ2R6ZEdWd0p6b2dNVnh1S2lCOUtWeHVLbHh1S2lCQWIzVjBjSFYwWEc0cUlHTm9ZVzVuWlZ4dUtpQkdhWEpsY3lCaGJua2dkR2x0WlNCMGFHVWdhVzUwWlhKbVlXTmxKM01nZG1Gc2RXVWdZMmhoYm1kbGN5NGdQR0p5UGx4dUtpQlVhR1VnWlhabGJuUWdaR0YwWVNCcGN5QjBhR1VnYm5WdFltVnlJSFpoYkhWbElHOW1JSFJvWlNCcGJuUmxjbVpoWTJVdVhHNHFYRzRxSUVCdmRYUndkWFJsZUdGdGNHeGxYRzRxSUc1MWJXSmxjaTV2YmlnblkyaGhibWRsSnl4bWRXNWpkR2x2YmloMktTQjdYRzRxSUNBZ1kyOXVjMjlzWlM1c2IyY29kaWs3WEc0cUlIMHBYRzRxWEc0cVhHNHFMMXh1WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdOc1lYTnpJRTUxYldKbGNpQmxlSFJsYm1SeklFbHVkR1Z5Wm1GalpTQjdYRzVjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9LU0I3WEc1Y2JpQWdJQ0JzWlhRZ2IzQjBhVzl1Y3lBOUlGc25kbUZzZFdVblhUdGNibHh1SUNBZ0lHeGxkQ0JrWldaaGRXeDBjeUE5SUh0Y2JpQWdJQ0FnSUNkemFYcGxKem9nV3pZd0xETXdYU3hjYmlBZ0lDQWdJQ2QyWVd4MVpTYzZJREFzWEc0Z0lDQWdJQ0FuYldsdUp6b2dNQ3hjYmlBZ0lDQWdJQ2R0WVhnbk9pQXlNREF3TUN4Y2JpQWdJQ0FnSUNkemRHVndKem9nTVZ4dUlDQWdJSDA3WEc1Y2JpQWdJQ0J6ZFhCbGNpaGhjbWQxYldWdWRITXNiM0IwYVc5dWN5eGtaV1poZFd4MGN5azdYRzVjYmlBZ0lDQjBhR2x6TGw5MllXeDFaU0E5SUc1bGR5QlRkR1Z3S0hSb2FYTXVjMlYwZEdsdVozTXViV2x1TEhSb2FYTXVjMlYwZEdsdVozTXViV0Y0TEhSb2FYTXVjMlYwZEdsdVozTXVjM1JsY0N4MGFHbHpMbk5sZEhScGJtZHpMblpoYkhWbEtUdGNibHh1SUNBZ0lDOHFYRzRnSUNBZ1JHVm1ZWFZzZERvZ01pNGdTRzkzSUcxaGJua2daR1ZqYVcxaGJDQndiR0ZqWlhNZ2RHOGdZMnhwY0NCMGFHVWdiblZ0WW1WeUozTWdkbWx6ZFdGc0lISmxibVJsY21sdVp5QjBieTRnVkdocGN5QmtiMlZ6SUc1dmRDQmhabVpsWTNRZ2JuVnRZbVZ5SjNNZ1lXTjBkV0ZzSUhaaGJIVmxJRzkxZEhCMWRDQXRMU0JtYjNJZ2RHaGhkQ3dnYzJWMElIUm9aU0J6ZEdWd0lIQnliM0JsY25SNUlIUnZJQzR3TVN3Z0xqRXNJRzl5SURFdVhHNGdJQ0FnUUhSNWNHVWdlMjUxYldKbGNuMWNiaUFnSUNCQVpYaGhiWEJzWlNCdWRXMWlaWEl1WkdWamFXMWhiRkJzWVdObGN5QTlJREk3WEc0Z0lDQWdLaTljYmlBZ0lDQjBhR2x6TG1SbFkybHRZV3hRYkdGalpYTWdQU0F5TzF4dUlDQWdJSFJvYVhNdVlXTjBkV0ZzSUQwZ01EdGNibHh1SUNBZ0lIUm9hWE11YldGNElEMGdkR2hwY3k1ZmRtRnNkV1V1YldGNE8xeHVYRzRnSUNBZ2RHaHBjeTV0YVc0Z1BTQjBhR2x6TGw5MllXeDFaUzV0YVc0N1hHNWNiaUFnSUNCMGFHbHpMbk4wWlhBZ1BTQjBhR2x6TGw5MllXeDFaUzV6ZEdWd08xeHVYRzRnSUNBZ2RHaHBjeTVwYm1sMEtDazdYRzRnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmx4dUlDQjlYRzVjYmlBZ1luVnBiR1JHY21GdFpTZ3BJSHRjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblFnUFNCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZGYkdWdFpXNTBLQ2RwYm5CMWRDY3BPMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzUwZVhCbElEMGdKM1JsZUhRbk8xeHVYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbUZrWkVWMlpXNTBUR2x6ZEdWdVpYSW9KMkpzZFhJbkxDQm1kVzVqZEdsdmJpQW9LU0I3WEc0Z0lGeDBJQ0IwYUdsekxtVnNaVzFsYm5RdWMzUjViR1V1WW1GamEyZHliM1Z1WkVOdmJHOXlJRDBnZEdocGN5NWpiMnh2Y25NdVptbHNiRHRjYmlBZ1hIUWdJSFJvYVhNdVpXeGxiV1Z1ZEM1emRIbHNaUzVqYjJ4dmNpQTlJSFJvYVhNdVkyOXNiM0p6TG1SaGNtczdYRzRnSUZ4MElDQnBaaUFvZEdocGN5NWxiR1Z0Wlc1MExuWmhiSFZsSUNFOVBTQjBhR2x6TG5aaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkbUZzZFdVZ1BTQndZWEp6WlVac2IyRjBLSFJvYVhNdVpXeGxiV1Z1ZEM1MllXeDFaU2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDazdYRzRnSUZ4MElDQjlYRzRnSUZ4MGZTNWlhVzVrS0hSb2FYTXBLVHRjYmx4dVhHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0oydGxlV1J2ZDI0bkxDQm1kVzVqZEdsdmJpQW9aU2tnZTF4dUlDQmNkQ0FnYVdZZ0tHVXVkMmhwWTJnZ1BDQTBPQ0I4ZkNCbExuZG9hV05vSUQ0Z05UY3BJSHRjYmlBZ1hIUWdJRngwYVdZZ0tHVXVkMmhwWTJnZ0lUMDlJREU0T1NBbUppQmxMbmRvYVdOb0lDRTlQU0F4T1RBZ0ppWWdaUzUzYUdsamFDQWhQVDBnT0NrZ2UxeHVJQ0JjZENBZ1hIUmNkR1V1Y0hKbGRtVnVkRVJsWm1GMWJIUW9LVHRjYmlBZ1hIUWdJRngwZlZ4dUlDQmNkQ0FnZlZ4dUlDQmNkQ0FnYVdZZ0tHVXVkMmhwWTJnOVBUMHhNeWtnZTF4dUlDQmNkQ0FnWEhSMGFHbHpMbVZzWlcxbGJuUXVZbXgxY2lncE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5aaGJIVmxJRDBnZEdocGN5NWxiR1Z0Wlc1MExuWmhiSFZsTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc2RHaHBjeTUyWVd4MVpTazdYRzRnSUNBZ0lDQWdJSFJvYVhNdWNtVnVaR1Z5S0NrN1hHNGdJRngwSUNCOVhHNGdJRngwZlM1aWFXNWtLSFJvYVhNcEtUdGNibHh1SUNBZ0lIUm9hWE11Y0dGeVpXNTBMbUZ3Y0dWdVpFTm9hV3hrS0hSb2FYTXVaV3hsYldWdWRDazdYRzVjYmlBZ2ZWeHVYRzRnSUhOcGVtVkpiblJsY21aaFkyVW9LU0I3WEc1Y2JpQWdJQ0IwYUdsekxsOXRhVzVFYVcxbGJuTnBiMjRnUFNCTllYUm9MbTFwYmloMGFHbHpMbmRwWkhSb0xIUm9hWE11YUdWcFoyaDBLVHRjYmx4dUlDQWdJR3hsZENCemRIbHNaWE1nUFNBbmQybGtkR2c2SUNjZ0t5QjBhR2x6TG5kcFpIUm9JQ3NnSjNCNE95YzdYRzRnSUNBZ2MzUjViR1Z6SUNzOUlDZG9aV2xuYUhRNklDY2dLeUIwYUdsekxtaGxhV2RvZENBcklDZHdlRHNuTzF4dUlDQWdJSE4wZVd4bGN5QXJQU0FuWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJVM1pUZGxOenNuTzF4dUlDQWdJSE4wZVd4bGN5QXJQU0FuWTI5c2IzSTZJQ016TXpNN0p6dGNiaUFnSUNCemRIbHNaWE1nS3owZ0oyWnZiblF0Wm1GdGFXeDVPaUJoY21saGJEc25PMXh1SUNBZ0lITjBlV3hsY3lBclBTQW5abTl1ZEMxM1pXbG5hSFE2SURVd01Ec25PMXh1SUNBZ0lITjBlV3hsY3lBclBTQW5abTl1ZEMxemFYcGxPaWNnS3lCMGFHbHpMbDl0YVc1RWFXMWxibk5wYjI0dk1pQXJJQ2R3ZURzbk8xeHVJQ0F2THlBZ2MzUjViR1Z6SUNzOUlDZG9hV2RvYkdsbmFIUTZJQ05rTVRnN0p6dGNiaUFnSUNCemRIbHNaWE1nS3owZ0oySnZjbVJsY2pvZ2JtOXVaVHNuTzF4dUlDQWdJSE4wZVd4bGN5QXJQU0FuYjNWMGJHbHVaVG9nYm05dVpUc25PMXh1SUNBZ0lITjBlV3hsY3lBclBTQW5jR0ZrWkdsdVp6b2dKeXQwYUdsekxsOXRhVzVFYVcxbGJuTnBiMjR2TkNzbmNIZ2dKeXQwYUdsekxsOXRhVzVFYVcxbGJuTnBiMjR2TkNzbmNIZzdKenRjYmlBZ0lDQnpkSGxzWlhNZ0t6MGdKMkp2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN0p6dGNiaUFnSUNCemRIbHNaWE1nS3owZ0ozVnpaWEpUWld4bFkzUTZJSFJsZUhRN0p6dGNiaUFnSUNCemRIbHNaWE1nS3owZ0oyMXZlbFZ6WlhKVFpXeGxZM1E2SUhSbGVIUTdKenRjYmlBZ0lDQnpkSGxzWlhNZ0t6MGdKM2RsWW10cGRGVnpaWEpUWld4bFkzUTZJSFJsZUhRN0p6dGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVjM1I1YkdVdVkzTnpWR1Y0ZENBclBTQnpkSGxzWlhNN1hHNWNiaUFnSUNBdkx5QjBieUJoWkdRZ1pYWmxiblIxWVd4c2VWeHVJQ0FnSUM4dklIWmhjaUJqYzNNZ1BTQW5JeWNyZEdocGN5NWxiR1Z0Wlc1MFNVUXJKem82YzJWc1pXTjBhVzl1ZXlCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCMGNtRnVjM0JoY21WdWRDQjlKenRjYmx4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1MllXeDFaU0E5SUhSb2FYTXVkbUZzZFdVN1hHNWNiaUFnZlZ4dVhHNGdJR052Ykc5eVNXNTBaWEptWVdObEtDa2dlMXh1SUNBZ0lDQWdkR2hwY3k1bGJHVnRaVzUwTG5OMGVXeGxMbUpoWTJ0bmNtOTFibVJEYjJ4dmNpQTlJSFJvYVhNdVkyOXNiM0p6TG1acGJHdzdYRzRnSUNBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1YzNSNWJHVXVZMjlzYjNJZ1BTQjBhR2x6TG1OdmJHOXljeTVrWVhKck8xeHVJQ0I5WEc1Y2JpQWdjbVZ1WkdWeUtDa2dlMXh1WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG5aaGJIVmxJRDBnYldGMGFDNXdjblZ1WlNoMGFHbHpMblpoYkhWbExIUm9hWE11WkdWamFXMWhiRkJzWVdObGN5azdYRzVjYmlBZ2ZWeHVYRzRnSUdOc2FXTnJLQ2tnZTF4dUlDQWdJSFJvYVhNdWFHRnpUVzkyWldRZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWNtVmhaRTl1YkhrZ1BTQjBjblZsTzF4dVhIUWdJSFJvYVhNdVlXTjBkV0ZzSUQwZ2RHaHBjeTUyWVd4MVpUdGNiaUFnSUNCMGFHbHpMbWx1YVhScFlXd2dQU0I3SUhrNklIUm9hWE11Ylc5MWMyVXVlU0I5TzF4dUlDQWdJSFJvYVhNdVkyaGhibWRsUm1GamRHOXlJRDBnYldGMGFDNXBiblpsY25Rb0lIUm9hWE11Ylc5MWMyVXVlQ0F2SUhSb2FYTXVkMmxrZEdnZ0tUdGNiaUFnSUNCamIyNXpiMnhsTG14dlp5aDBhR2x6TG1Ob1lXNW5aVVpoWTNSdmNpazdYRzRnSUgxY2JseHVJQ0J0YjNabEtDa2dlMXh1SUNBZ0lIUm9hWE11YUdGelRXOTJaV1FnUFNCMGNuVmxPMXh1SUNBZ0lHbG1JQ2gwYUdsekxtTnNhV05yWldRcElIdGNibHh1SUNBZ0lDQWdiR1YwSUc1bGQzWmhiSFZsSUQwZ2RHaHBjeTVoWTNSMVlXd2dMU0FvZEdocGN5NXRiM1Z6WlM1NUlDMGdkR2hwY3k1cGJtbDBhV0ZzTG5rcElDb2dLQ0J0WVhSb0xtTnNhWEFvSUhSb2FYTXViV0Y0TFhSb2FYTXViV2x1TENBd0xDQXhNREF3SUNrZ0x5QXlNREFnS1NBcUlFMWhkR2d1Y0c5M0tIUm9hWE11WTJoaGJtZGxSbUZqZEc5eUxESXBPMXh1SUNBZ0lDQWdkR2hwY3k1MllXeDFaU0E5SUc1bGQzWmhiSFZsTzF4dVhHNGdJRngwWEhSMGFHbHpMbkpsYm1SbGNpZ3BPMXh1SUNBZ0lDQWdhV1lnS0hSb2FYTXVYM1poYkhWbExtTm9ZVzVuWldRcElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSFJvYVhNdWRtRnNkV1VwTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJRngwZlZ4dUlDQjlYRzVjYmlBZ2NtVnNaV0Z6WlNncElIdGNiaUFnSUNCcFppQW9JWFJvYVhNdWFHRnpUVzkyWldRcElIdGNiaUFnSUNBZ0lIUm9hWE11Wld4bGJXVnVkQzV5WldGa1QyNXNlU0E5SUdaaGJITmxPMXh1SUNCY2RGeDBkR2hwY3k1bGJHVnRaVzUwTG1adlkzVnpLQ2s3WEc0Z0lGeDBYSFIwYUdsekxtVnNaVzFsYm5RdWMyVjBVMlZzWldOMGFXOXVVbUZ1WjJVb01Dd2dkR2hwY3k1bGJHVnRaVzUwTG5aaGJIVmxMbXhsYm1kMGFDazdYRzRnSUZ4MFhIUjBhR2x6TG1Wc1pXMWxiblF1YzNSNWJHVXVZbUZqYTJkeWIzVnVaRU52Ykc5eUlEMGdkR2hwY3k1amIyeHZjbk11WVdOalpXNTBPMXh1SUNCY2RGeDBkR2hwY3k1bGJHVnRaVzUwTG5OMGVXeGxMbU52Ykc5eUlEMGdkR2hwY3k1amIyeHZjbk11YkdsbmFIUTdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUdSdlkzVnRaVzUwTG1KdlpIa3VabTlqZFhNb0tUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ1EyOXVibVZqZENCMGFHbHpJRzUxYldKbGNpQnBiblJsY21aaFkyVWdkRzhnWVNCa2FXRnNJRzl5SUhOc2FXUmxjbHh1SUNCQWNHRnlZVzBnZTBsdWRHVnlabUZqWlgwZ1pXeGxiV1Z1ZENCRmJHVnRaVzUwSUhSdklHTnZibTVsWTNRZ2RHOHVYRzRnSUVCbGVHRnRjR3hsSUc1MWJXSmxjaTVzYVc1cktITnNhV1JsY2lsY2JpQWdLaTljYmlBZ2JHbHVheWhrWlhOMGFXNWhkR2x2YmlrZ2UxeHVJQ0FnSUhSb2FYTXViV2x1SUQwZ1pHVnpkR2x1WVhScGIyNHViV2x1TzF4dUlDQWdJSFJvYVhNdWJXRjRJRDBnWkdWemRHbHVZWFJwYjI0dWJXRjRPMXh1SUNBZ0lIUm9hWE11YzNSbGNDQTlJR1JsYzNScGJtRjBhVzl1TG5OMFpYQTdYRzRnSUNBZ1pHVnpkR2x1WVhScGIyNHViMjRvSjJOb1lXNW5aU2NzS0hZcElEMCtJSHRjYmlBZ0lDQWdJSFJvYVhNdWNHRnpjMmwyWlZWd1pHRjBaU2gyS1R0Y2JpQWdJQ0I5S1R0Y2JpQWdJQ0IwYUdsekxtOXVLQ2RqYUdGdVoyVW5MQ2gyS1NBOVBpQjdYRzRnSUNBZ0lDQmtaWE4wYVc1aGRHbHZiaTUyWVd4MVpTQTlJSFk3WEc0Z0lDQWdmU2s3WEc0Z0lDQWdkR2hwY3k1MllXeDFaU0E5SUdSbGMzUnBibUYwYVc5dUxuWmhiSFZsTzF4dUlDQXZLaUFnY21WMGRYSnVJSHRjYmlBZ0lDQWdJR3hwYzNSbGJtVnlNVG9nYkdsemRHVnVaWEl4TEZ4dUlDQWdJQ0FnYkdsemRHVnVaWEl5T2lCc2FYTjBaVzVsY2pJc1hHNGdJQ0FnSUNCa1pYTjBjbTk1T2lBb0tTQTlQaUI3WEc0Z0lDQWdJQ0FnSUd4cGMzUmxibVZ5TVM1eVpXMXZkbVVvS1NBb2IzSWdjMmx0YVd4aGNpbGNiaUFnSUNBZ0lDQWdiR2x6ZEdWdVpYSXlMbkpsYlc5MlpTZ3BJQ2h2Y2lCemFXMXBiR0Z5S1Z4dUlDQWdJQ0FnZlZ4dUlDQWdJSDBnS2k5Y2JpQWdmVnh1WEc0Z0lIQmhjM05wZG1WVmNHUmhkR1VvZGlrZ2UxeHVJQ0FnSUhSb2FYTXVYM1poYkhWbExuVndaR0YwWlNoMktUdGNiaUFnSUNCMGFHbHpMbkpsYm1SbGNpZ3BPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJRlJvWlNCcGJuUmxjbVpoWTJVbmN5QmpkWEp5Wlc1MElIWmhiSFZsTGlCSlppQnpaWFFnYldGdWRXRnNiSGtzSUhkcGJHd2dkWEJrWVhSbElIUm9aU0JwYm5SbGNtWmhZMlVnWVc1a0lIUnlhV2RuWlhJZ2RHaGxJRzkxZEhCMWRDQmxkbVZ1ZEM1Y2JpQWdRSFI1Y0dVZ2UyNTFiV0psY24xY2JpQWdRR1Y0WVcxd2JHVWdiblZ0WW1WeUxuWmhiSFZsSUQwZ01UQTdYRzRnSUNvdlhHNGdJR2RsZENCMllXeDFaU2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1ZmRtRnNkV1V1ZG1Gc2RXVTdYRzRnSUgxY2JpQWdjMlYwSUhaaGJIVmxLSFlwSUh0Y2JpQWdJQ0IwYUdsekxsOTJZV3gxWlM1MWNHUmhkR1VvZGlrN1hHNGdJQ0FnZEdocGN5NWxiV2wwS0NkamFHRnVaMlVuTEhSb2FYTXVkbUZzZFdVcE8xeHVJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDazdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdURzkzWlhJZ2JHbHRhWFFnYjJZZ2RHaGxJRzUxYldKbGNpZHpJRzkxZEhCMWRDQnlZVzVuWlZ4dUlDQkFkSGx3WlNCN2JuVnRZbVZ5ZlZ4dUlDQkFaWGhoYlhCc1pTQnVkVzFpWlhJdWJXbHVJRDBnTVRBd01EdGNiaUFnS2k5Y2JpQWdaMlYwSUcxcGJpZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVmZG1Gc2RXVXViV2x1TzF4dUlDQjlYRzRnSUhObGRDQnRhVzRvZGlrZ2UxeHVJQ0FnSUhSb2FYTXVYM1poYkhWbExtMXBiaUE5SUhZN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ1ZYQndaWElnYkdsdGFYUWdiMllnZEdobElHNTFiV0psY2lkeklHOTFkSEIxZENCeVlXNW5aVnh1SUNCQWRIbHdaU0I3Ym5WdFltVnlmVnh1SUNCQVpYaGhiWEJzWlNCdWRXMWlaWEl1YldGNElEMGdNVEF3TUR0Y2JpQWdLaTljYmlBZ1oyVjBJRzFoZUNncElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NWZkbUZzZFdVdWJXRjRPMXh1SUNCOVhHNGdJSE5sZENCdFlYZ29kaWtnZTF4dUlDQWdJSFJvYVhNdVgzWmhiSFZsTG0xaGVDQTlJSFk3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnVkdobElHbHVZM0psYldWdWRDQjBhR0YwSUhSb1pTQnVkVzFpWlhJbmN5QjJZV3gxWlNCamFHRnVaMlZ6SUdKNUxseHVJQ0JBZEhsd1pTQjdiblZ0WW1WeWZWeHVJQ0JBWlhoaGJYQnNaU0J1ZFcxaVpYSXVjM1JsY0NBOUlEVTdYRzRnSUNvdlhHNGdJR2RsZENCemRHVndLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5MllXeDFaUzV6ZEdWd08xeHVJQ0I5WEc0Z0lITmxkQ0J6ZEdWd0tIWXBJSHRjYmlBZ0lDQjBhR2x6TGw5MllXeDFaUzV6ZEdWd0lEMGdkanRjYmlBZ2ZWeHVYRzU5WEc1Y2JseHVYRzR2THlCWFJVSlFRVU5MSUVaUFQxUkZVaUF2TDF4dUx5OGdMaTkrTDJwemFHbHVkQzFzYjJGa1pYSWhMaTlzYVdJdmFXNTBaWEptWVdObGN5OXVkVzFpWlhJdWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibXhsZENCSmJuUmxjbVpoWTJVZ1BTQnlaWEYxYVhKbEtDY3VMaTlqYjNKbEwybHVkR1Z5Wm1GalpTY3BPMXh1WEc0dktpcGNiaW9nVTJWc1pXTjBYRzRxWEc0cUlFQmtaWE5qY21sd2RHbHZiaUJFY205d1pHOTNiaUJ0Wlc1MVhHNHFYRzRxSUVCa1pXMXZJRHh6Y0dGdUlHNWxlSFZ6TFhWcFBWd2ljMlZzWldOMFhDSStQQzl6Y0dGdVBseHVLbHh1S2lCQVpYaGhiWEJzWlZ4dUtpQjJZWElnYzJWc1pXTjBJRDBnYm1WM0lFNWxlSFZ6TGxObGJHVmpkQ2duSTNSaGNtZGxkQ2NwWEc0cVhHNHFJRUJsZUdGdGNHeGxYRzRxSUhaaGNpQnpaV3hsWTNRZ1BTQnVaWGNnVG1WNGRYTXVVMlZzWldOMEtDY2pkR0Z5WjJWMEp5eDdYRzRxSUNBZ0ozTnBlbVVuT2lCYk1UQXdMRE13WFN4Y2Jpb2dJQ0FuYjNCMGFXOXVjeWM2SUZzblpHVm1ZWFZzZENjc0oyOXdkR2x2Ym5NblhWeHVLaUI5S1Z4dUtseHVLaUJBYjNWMGNIVjBYRzRxSUdOb1lXNW5aVnh1S2lCR2FYSmxjeUJoYm5rZ2RHbHRaU0IwYUdVZ2FXNTBaWEptWVdObEozTWdkbUZzZFdVZ1kyaGhibWRsY3k0Z1BHSnlQbHh1S2lCVWFHVWdaWFpsYm5RZ1pHRjBZU0JwY3lCaGJpQnZZbXBsWTNRZ1kyOXVkR0ZwYm1sdVp5QjBhR1VnZEdWNGRDQjJZV3gxWlNCdlppQjBhR1VnYzJWc1pXTjBaV1FnYjNCMGFXOXVMQ0JoY3lCM1pXeHNJR0Z6SUhSb1pTQnVkVzFsY21saklHbHVaR1Y0SUc5bUlIUm9aU0J6Wld4bFkzUnBiMjR1WEc0cVhHNHFJRUJ2ZFhSd2RYUmxlR0Z0Y0d4bFhHNHFJSE5sYkdWamRDNXZiaWduWTJoaGJtZGxKeXhtZFc1amRHbHZiaWgyS1NCN1hHNHFJQ0FnWTI5dWMyOXNaUzVzYjJjb2RpazdYRzRxSUgwcFhHNHFYRzRxWEc0cUwxeHVYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR05zWVhOeklGTmxiR1ZqZENCbGVIUmxibVJ6SUVsdWRHVnlabUZqWlNCN1hHNWNiaUFnWTI5dWMzUnlkV04wYjNJb0tTQjdYRzVjYmlBZ0lDQnNaWFFnYjNCMGFXOXVjeUE5SUZzbmRtRnNkV1VuWFR0Y2JseHVJQ0FnSUd4bGRDQmtaV1poZFd4MGN5QTlJSHRjYmlBZ0lDQWdJQ0FuYzJsNlpTYzZJRnN4TURBc016QmRMRnh1SUNBZ0lDQWdJQ2R2Y0hScGIyNXpKem9nV3lka1pXWmhkV3gwSnl3bmIzQjBhVzl1Y3lkZFhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUhOMWNHVnlLR0Z5WjNWdFpXNTBjeXh2Y0hScGIyNXpMR1JsWm1GMWJIUnpLVHRjYmx4dUlDQWdJSFJvYVhNdVgzTmxiR1ZqZEdWa1NXNWtaWGdnUFNBdE1UdGNiaUFnSUNCMGFHbHpMbDkyWVd4MVpTQTlJR1poYkhObE8xeHVYRzRnSUNBZ2RHaHBjeTVmYjNCMGFXOXVjeUE5SUhSb2FYTXVjMlYwZEdsdVozTXViM0IwYVc5dWN6dGNibHh1SUNBZ0lIUm9hWE11YVc1cGRDZ3BPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrUm5KaGJXVW9LU0I3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwSUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2duYzJWc1pXTjBKeWs3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG5OMGVXeGxMbVp2Ym5SVGFYcGxJRDBnZEdocGN5NW9aV2xuYUhRdk1pc25jSGduTzF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1emRIbHNaUzV2ZFhSc2FXNWxJRDBnSjI1dmJtVW5PMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzV6ZEhsc1pTNW9hV2RvYkdsbmFIUWdQU0FuYm05dVpTYzdYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk4wZVd4bExuZHBaSFJvSUQwZ2RHaHBjeTUzYVdSMGFDc25jSGduTzF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1emRIbHNaUzVvWldsbmFIUWdQU0IwYUdsekxtaGxhV2RvZENzbmNIZ25PMXh1WEc0Z0lDQWdkR2hwY3k1aWIzVnVaRkpsYm1SbGNpQTlJSFJvYVhNdWNtVnVaR1Z5TG1KcGJtUW9kR2hwY3lrN1hHNWNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVZV1JrUlhabGJuUk1hWE4wWlc1bGNpZ25ZMmhoYm1kbEp5d2dkR2hwY3k1aWIzVnVaRkpsYm1SbGNpazdYRzVjYmlBZ0lDQjBhR2x6TG5CaGNtVnVkQzVoY0hCbGJtUkRhR2xzWkNoMGFHbHpMbVZzWlcxbGJuUXBPMXh1WEc0Z0lIMWNibHh1SUNCaGRIUmhZMmhNYVhOMFpXNWxjbk1vS1NCN1hHNWNiaUFnZlZ4dVhHNGdJR0oxYVd4a1NXNTBaWEptWVdObEtDa2dlMXh1WEc0Z0lDQWdkR2hwY3k1a1pXWnBibVZQY0hScGIyNXpLQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lHTnZiRzl5U1c1MFpYSm1ZV05sS0NrZ2UxeHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNXpkSGxzWlM1aVlXTnJaM0p2ZFc1a1EyOXNiM0lnUFNCMGFHbHpMbU52Ykc5eWN5NW1hV3hzTzF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1emRIbHNaUzVqYjJ4dmNpQTlJSFJvYVhNdVkyOXNiM0p6TG1SaGNtczdYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk4wZVd4bExtSnZjbVJsY2lBOUlDZHpiMnhwWkNBd2NIZ2dKeXQwYUdsekxtTnZiRzl5Y3k1dFpXUnBkVzFNYVdkb2REdGNiaUFnZlZ4dVhHNGdJSEpsYm1SbGNpZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdVgzWmhiSFZsSUQwZ2RHaHBjeTVsYkdWdFpXNTBMbTl3ZEdsdmJuTmJkR2hwY3k1bGJHVnRaVzUwTG5ObGJHVmpkR1ZrU1c1a1pYaGRMblJsZUhRN1hHNGdJQ0FnZEdocGN5NWZjMlZzWldOMFpXUkpibVJsZUNBOUlIUm9hWE11Wld4bGJXVnVkQzV6Wld4bFkzUmxaRWx1WkdWNE8xeHVJQ0FnSUhSb2FYTXVaVzFwZENnblkyaGhibWRsSnl4N1hHNGdJQ0FnSUNCMllXeDFaVG9nZEdocGN5NWZkbUZzZFdVc1hHNGdJQ0FnSUNCcGJtUmxlRG9nZEdocGN5NWZjMlZzWldOMFpXUkpibVJsZUZ4dUlDQWdJSDBwTzF4dVhHNGdJSDFjYmx4dUlDQmpiR2xqYXlncElIdGNibHh1SUNCOVhHNWNiaUFnYlc5MlpTZ3BJSHRjYmx4dUlDQjlYRzVjYmlBZ2NtVnNaV0Z6WlNncElIdGNibHh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJQ0FxSUZWd1pHRjBaU0IwYUdVZ2JHbHpkQ0J2WmlCdmNIUnBiMjV6TGlCVWFHbHpJSEpsYlc5MlpYTWdZV3hzSUdWNGFYTjBhVzVuSUc5d2RHbHZibk1nWVc1a0lHTnlaV0YwWlhNZ1lTQnVaWGNnYkdsemRDQnZaaUJ2Y0hScGIyNXpMbHh1SUNBZ0tpQkFjR0Z5WVcwZ0lIdGhjbkpoZVgwZ2IzQjBhVzl1Y3lCT1pYY2dZWEp5WVhrZ2IyWWdiM0IwYVc5dWMxeHVJQ0FnS2k5Y2JseHVJQ0JrWldacGJtVlBjSFJwYjI1ektHOXdkR2x2Ym5NcElIdGNibHh1SUNBdktpQWdablZ1WTNScGIyNGdjbVZ0YjNabFQzQjBhVzl1Y3loelpXeGxZM1JpYjNncFhHNGdJQ0FnZTF4dUlDQWdJQ0FnSUNCMllYSWdhVHRjYmlBZ0lDQWdJQ0FnWm05eUtHa2dQU0J6Wld4bFkzUmliM2d1YjNCMGFXOXVjeTVzWlc1bmRHZ2dMU0F4SURzZ2FTQStQU0F3SURzZ2FTMHRLVnh1SUNBZ0lDQWdJQ0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnpaV3hsWTNSaWIzZ3VjbVZ0YjNabEtHa3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNBZ0lDOHZkWE5wYm1jZ2RHaGxJR1oxYm1OMGFXOXVPbHh1SUNBZ0lISmxiVzkyWlU5d2RHbHZibk1vWkc5amRXMWxiblF1WjJWMFJXeGxiV1Z1ZEVKNVNXUW9YQ0p0ZVZObGJHVmpkRTlpYW1WamRGd2lLU2s3SUNvdlhHNWNibHh1SUNBZ0lHbG1JQ2h2Y0hScGIyNXpLU0I3WEc0Z0lDQWdJQ0IwYUdsekxsOXZjSFJwYjI1eklEMGdiM0IwYVc5dWN6dGNiaUFnSUNCOVhHNWNiaUFnSUNCbWIzSW9iR1YwSUdrOWRHaHBjeTVsYkdWdFpXNTBMbTl3ZEdsdmJuTXViR1Z1WjNSb0xURTdJR2tnUGowZ01Ec2dhUzB0S1NCN1hHNGdJQ0FnSUNCMGFHbHpMbVZzWlcxbGJuUXVjbVZ0YjNabEtHa3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lHWnZjaWhzWlhRZ2FUMHdPMms4ZEdocGN5NWZiM0IwYVc5dWN5NXNaVzVuZEdnN2FTc3JLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWIzQjBhVzl1Y3k1aFpHUW9ibVYzSUU5d2RHbHZiaWgwYUdsekxsOXZjSFJwYjI1elcybGRMQ0JwS1NrN1hHNGdJQ0FnZlZ4dVhHNGdJSDFjYmx4dVhHNGdJQzhxS2x4dUlDQlVhR1VnZEdWNGRDQnZaaUIwYUdVZ2IzQjBhVzl1SUhSb1lYUWdhWE1nWTNWeWNtVnVkR3g1SUhObGJHVmpkR1ZrTGlCSlppQnpaWFFzSUhkcGJHd2dkWEJrWVhSbElIUm9aU0JwYm5SbGNtWmhZMlVnWVc1a0lIUnlhV2RuWlhJZ2RHaGxJRzkxZEhCMWRDQmxkbVZ1ZEM1Y2JpQWdRSFI1Y0dVZ2UxTjBjbWx1WjMxY2JpQWdRR1Y0WVcxd2JHVWdjMlZzWldOMExuWmhiSFZsSUQwZ1hDSnpZWGQwYjI5MGFGd2lPMXh1SUNBcUwxeHVJQ0JuWlhRZ2RtRnNkV1VvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVgzWmhiSFZsTzF4dUlDQjlYRzRnSUhObGRDQjJZV3gxWlNoMktTQjdYRzRnSUNBZ2RHaHBjeTVmZG1Gc2RXVWdQU0IyTzF4dUlDQWdJR1p2Y2loc1pYUWdhVDB3TzJrOGRHaHBjeTVsYkdWdFpXNTBMbTl3ZEdsdmJuTXViR1Z1WjNSb08ya3JLeWtnZTF4dUlDQWdJQ0FnYVdZZ0tIWWdQVDA5SUhSb2FYTXVaV3hsYldWdWRDNXZjSFJwYjI1elcybGRMblJsZUhRcElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1elpXeGxZM1JsWkVsdVpHVjRJRDBnYVR0Y2JpQWdJQ0FnSUNBZ1luSmxZV3M3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNWNibHh1SUNBdktpcGNiaUFnVkdobElHNTFiV1Z5YVdNZ2FXNWtaWGdnYjJZZ2RHaGxJRzl3ZEdsdmJpQjBhR0YwSUdseklHTjFjbkpsYm5Sc2VTQnpaV3hsWTNSbFpDNGdTV1lnYzJWMExDQjNhV3hzSUhWd1pHRjBaU0IwYUdVZ2FXNTBaWEptWVdObElHRnVaQ0IwY21sbloyVnlJSFJvWlNCdmRYUndkWFFnWlhabGJuUXVYRzRnSUVCMGVYQmxJSHR1ZFcxaVpYSjlYRzRnSUVCbGVHRnRjR3hsSUhObGJHVmpkQzV6Wld4bFkzUmxaRWx1WkdWNElEMGdNanRjYmlBZ0tpOWNiaUFnWjJWMElITmxiR1ZqZEdWa1NXNWtaWGdvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVgzTmxiR1ZqZEdWa1NXNWtaWGc3WEc0Z0lIMWNiaUFnYzJWMElITmxiR1ZqZEdWa1NXNWtaWGdvZGlrZ2UxeHVJQ0FnSUhSb2FYTXVYM05sYkdWamRHVmtTVzVrWlhnZ1BTQjJPMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzV6Wld4bFkzUmxaRWx1WkdWNElEMGdkanRjYmlBZ0lDQjBhR2x6TG5KbGJtUmxjaWdwTzF4dUlDQjlYRzVjYmlBZ1kzVnpkRzl0UkdWemRISnZlU2dwSUh0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWNtVnRiM1psUlhabGJuUk1hWE4wWlc1bGNpZ25ZMmhoYm1kbEp5d2dkR2hwY3k1aWIzVnVaRkpsYm1SbGNpazdYRzRnSUgxY2JseHVYRzU5WEc1Y2JseHVYRzR2THlCWFJVSlFRVU5MSUVaUFQxUkZVaUF2TDF4dUx5OGdMaTkrTDJwemFHbHVkQzFzYjJGa1pYSWhMaTlzYVdJdmFXNTBaWEptWVdObGN5OXpaV3hsWTNRdWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibXhsZENCemRtY2dQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNMM04yWnljcE8xeHViR1YwSUcxaGRHZ2dQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNMMjFoZEdnbktUdGNibXhsZENCSmJuUmxjbVpoWTJVZ1BTQnlaWEYxYVhKbEtDY3VMaTlqYjNKbEwybHVkR1Z5Wm1GalpTY3BPMXh1YkdWMElGTjBaWEFnUFNCeVpYRjFhWEpsS0NjdUxpOXRiMlJsYkhNdmMzUmxjQ2NwTzF4dWFXMXdiM0owSUNvZ1lYTWdTVzUwWlhKaFkzUnBiMjRnWm5KdmJTQW5MaTR2ZFhScGJDOXBiblJsY21GamRHbHZiaWM3WEc1Y2JpOHFLbHh1S2lCRWFXRnNYRzRxWEc0cVhHNHFJRUJrWlhOamNtbHdkR2x2YmlCRWFXRnNJSGRwZEdnZ2NtRmthV0ZzSUc5eUlHeHBibVZoY2lCcGJuUmxjbUZqZEdsdmJpNWNiaXBjYmlvZ1FHUmxiVzhnUEhOd1lXNGdibVY0ZFhNdGRXazlYQ0prYVdGc1hDSStQQzl6Y0dGdVBseHVLbHh1S2lCQVpYaGhiWEJzWlZ4dUtpQjJZWElnWkdsaGJDQTlJRzVsZHlCT1pYaDFjeTVFYVdGc0tDY2pkR0Z5WjJWMEp5bGNiaXBjYmlvZ1FHVjRZVzF3YkdWY2Jpb2dkbUZ5SUdScFlXd2dQU0J1WlhjZ1RtVjRkWE11UkdsaGJDZ25JM1JoY21kbGRDY3NlMXh1S2lBZ0lDZHphWHBsSnpvZ1d6YzFMRGMxWFN4Y2Jpb2dJQ0FuYVc1MFpYSmhZM1JwYjI0bk9pQW5jbUZrYVdGc0p5d2dMeThnWENKeVlXUnBZV3hjSWl3Z1hDSjJaWEowYVdOaGJGd2lMQ0J2Y2lCY0ltaHZjbWw2YjI1MFlXeGNJbHh1S2lBZ0lDZHRiMlJsSnpvZ0ozSmxiR0YwYVhabEp5d2dMeThnWENKaFluTnZiSFYwWlZ3aUlHOXlJRndpY21Wc1lYUnBkbVZjSWx4dUtpQWdJQ2R0YVc0bk9pQXdMRnh1S2lBZ0lDZHRZWGduT2lBeExGeHVLaUFnSUNkemRHVndKem9nTUN4Y2Jpb2dJQ0FuZG1Gc2RXVW5PaUF3WEc0cUlIMHBYRzRxWEc0cUlFQnZkWFJ3ZFhSY2Jpb2dZMmhoYm1kbFhHNHFJRVpwY21WeklHRnVlU0IwYVcxbElIUm9aU0JwYm5SbGNtWmhZMlVuY3lCMllXeDFaU0JqYUdGdVoyVnpMaUE4WW5JK1hHNHFJRlJvWlNCbGRtVnVkQ0JrWVhSaElHbHpJSFJvWlNCdWRXMWlaWElnZG1Gc2RXVWdiMllnZEdobElHbHVkR1Z5Wm1GalpTNWNiaXBjYmlvZ1FHOTFkSEIxZEdWNFlXMXdiR1ZjYmlvZ1pHbGhiQzV2YmlnblkyaGhibWRsSnl4bWRXNWpkR2x2YmloMktTQjdYRzRxSUNBZ1kyOXVjMjlzWlM1c2IyY29kaWs3WEc0cUlIMHBYRzRxWEc0cUlFQjBkWFJ2Y21saGJGeHVLaUJFYVdGc1hHNHFJSGxuUjAxNGNWeHVLbHh1S2k5Y2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1kyeGhjM01nUkdsaGJDQmxlSFJsYm1SeklFbHVkR1Z5Wm1GalpTQjdYRzVjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9LU0I3WEc1Y2JpQWdJQ0JzWlhRZ2IzQjBhVzl1Y3lBOUlGc25iV2x1Snl3bmJXRjRKeXduZG1Gc2RXVW5YVHRjYmx4dUlDQWdJR3hsZENCa1pXWmhkV3gwY3lBOUlIdGNiaUFnSUNBZ0lDZHphWHBsSnpvZ1d6YzFMRGMxWFN4Y2JpQWdJQ0FnSUNkcGJuUmxjbUZqZEdsdmJpYzZJQ2R5WVdScFlXd25MQ0F2THlCeVlXUnBZV3dzSUhabGNuUnBZMkZzTENCb2IzSnBlbTl1ZEdGc1hHNGdJQ0FnSUNBbmJXOWtaU2M2SUNkeVpXeGhkR2wyWlNjc0lDOHZJR0ZpYzI5c2RYUmxMQ0J5Wld4aGRHbDJaVnh1SUNBZ0lDQWdKMjFwYmljNklEQXNYRzRnSUNBZ0lDQW5iV0Y0SnpvZ01TeGNiaUFnSUNBZ0lDZHpkR1Z3SnpvZ01DeGNiaUFnSUNBZ0lDZDJZV3gxWlNjNklEQmNiaUFnSUNCOU8xeHVYRzRnSUNBZ2MzVndaWElvWVhKbmRXMWxiblJ6TEc5d2RHbHZibk1zWkdWbVlYVnNkSE1wTzF4dVhHNGdJQ0FnZEdocGN5NXBiblJsY21GamRHbHZiaUE5SUhSb2FYTXVjMlYwZEdsdVozTXVhVzUwWlhKaFkzUnBiMjQ3WEc1Y2JpQWdJQ0IwYUdsekxsOTJZV3gxWlNBOUlHNWxkeUJUZEdWd0tIUm9hWE11YzJWMGRHbHVaM011YldsdUxDQjBhR2x6TG5ObGRIUnBibWR6TG0xaGVDd2dkR2hwY3k1elpYUjBhVzVuY3k1emRHVndMQ0IwYUdsekxuTmxkSFJwYm1kekxuWmhiSFZsS1R0Y2JseHVJQ0FnSUhSb2FYTXVjRzl6YVhScGIyNGdQU0J1WlhjZ1NXNTBaWEpoWTNScGIyNHVTR0Z1Wkd4bEtIUm9hWE11YzJWMGRHbHVaM011Ylc5a1pTeDBhR2x6TG1sdWRHVnlZV04wYVc5dUxGc3dMSFJvYVhNdWQybGtkR2hkTEZ0MGFHbHpMbWhsYVdkb2RDd3dYU2s3WEc1Y2JpQWdJQ0IwYUdsekxtbHVhWFFvS1R0Y2JseHVJQ0FnSUhSb2FYTXVkbUZzZFdVZ1BTQjBhR2x6TGw5MllXeDFaUzUyWVd4MVpUdGNibHh1SUNBZ0lIUm9hWE11Y0c5emFYUnBiMjR1ZG1Gc2RXVWdQU0IwYUdsekxsOTJZV3gxWlM1dWIzSnRZV3hwZW1Wa08xeHVYRzRnSUNBZ2RHaHBjeTV3Y21WMmFXOTFjMEZ1WjJ4bElEMGdabUZzYzJVN1hHNWNiaUFnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc2RHaHBjeTUyWVd4MVpTazdYRzVjYmlBZ2ZWeHVYRzRnSUdKMWFXeGtTVzUwWlhKbVlXTmxLQ2tnZTF4dVhHNGdJQ0FnZEdocGN5NWlZV05yWjNKdmRXNWtJRDBnYzNabkxtTnlaV0YwWlNnblkybHlZMnhsSnlrN1hHNGdJQ0FnZEdocGN5NXpZM0psZHlBOUlITjJaeTVqY21WaGRHVW9KMk5wY21Oc1pTY3BPMXh1SUNBZ0lIUm9hWE11YUdGdVpHeGxJRDBnYzNabkxtTnlaV0YwWlNnbmNHRjBhQ2NwTzF4dUlDQWdJSFJvYVhNdWFHRnVaR3hsTWlBOUlITjJaeTVqY21WaGRHVW9KM0JoZEdnbktUdGNiaUFnSUNCMGFHbHpMbWhoYm1Sc1pVWnBiR3dnUFNCemRtY3VZM0psWVhSbEtDZHdZWFJvSnlrN1hHNGdJQ0FnZEdocGN5NW9ZVzVrYkdVeVJtbHNiQ0E5SUhOMlp5NWpjbVZoZEdVb0ozQmhkR2duS1R0Y2JpQWdJQ0IwYUdsekxtaGhibVJzWlV4cGJtVWdQU0J6ZG1jdVkzSmxZWFJsS0Nkd1lYUm9KeWs3WEc1Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdVlYQndaVzVrUTJocGJHUW9kR2hwY3k1aVlXTnJaM0p2ZFc1a0tUdGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVZWEJ3Wlc1a1EyaHBiR1FvZEdocGN5NW9ZVzVrYkdVcE8xeHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNWhjSEJsYm1SRGFHbHNaQ2gwYUdsekxtaGhibVJzWlRJcE8xeHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNWhjSEJsYm1SRGFHbHNaQ2gwYUdsekxtaGhibVJzWlVacGJHd3BPMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzVoY0hCbGJtUkRhR2xzWkNoMGFHbHpMbWhoYm1Sc1pUSkdhV3hzS1R0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdVlYQndaVzVrUTJocGJHUW9kR2hwY3k1b1lXNWtiR1ZNYVc1bEtUdGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVZWEJ3Wlc1a1EyaHBiR1FvZEdocGN5NXpZM0psZHlrN1hHNWNiaUFnZlZ4dVhHNWNiaUFnYzJsNlpVbHVkR1Z5Wm1GalpTZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdWNHOXphWFJwYjI0dWNtVnphWHBsS0Zzd0xIUm9hWE11ZDJsa2RHaGRMRnQwYUdsekxtaGxhV2RvZEN3d1hTazdYRzVjYmlBZ0lDQnNaWFFnWTJWdWRHVnlJRDBnZTF4dUlDQWdJQ0FnZURvZ2RHaHBjeTUzYVdSMGFDOHlMRnh1SUNBZ0lDQWdlVG9nZEdocGN5NW9aV2xuYUhRdk1seHVJQ0FnSUgwN1hHNWNiaUFnSUNCc1pYUWdaR2xoYldWMFpYSWdQU0JOWVhSb0xtMXBiaWgwYUdsekxuZHBaSFJvTEhSb2FYTXVhR1ZwWjJoMEtUdGNibHh1SUNBZ0lIUm9hWE11WW1GamEyZHliM1Z1WkM1elpYUkJkSFJ5YVdKMWRHVW9KMk40Snl3Z1kyVnVkR1Z5TG5ncE8xeHVJQ0FnSUhSb2FYTXVZbUZqYTJkeWIzVnVaQzV6WlhSQmRIUnlhV0oxZEdVb0oyTjVKeXdnWTJWdWRHVnlMbmtwTzF4dUlDQWdJSFJvYVhNdVltRmphMmR5YjNWdVpDNXpaWFJCZEhSeWFXSjFkR1VvSjNJbkxDQmthV0Z0WlhSbGNpOHlMV1JwWVcxbGRHVnlMelF3S1R0Y2JseHVJQ0FnSUhSb2FYTXVjMk55WlhjdWMyVjBRWFIwY21saWRYUmxLQ2RqZUNjc0lHTmxiblJsY2k1NEtUdGNiaUFnSUNCMGFHbHpMbk5qY21WM0xuTmxkRUYwZEhKcFluVjBaU2duWTNrbkxDQmpaVzUwWlhJdWVTazdYRzRnSUNBZ2RHaHBjeTV6WTNKbGR5NXpaWFJCZEhSeWFXSjFkR1VvSjNJbkxDQmthV0Z0WlhSbGNpOHhNaWs3WEc1Y2JpQWdJQ0JzWlhRZ2RtRnNkV1VnUFNCMGFHbHpMblpoYkhWbE8xeHVYRzRnSUNBZ2JHVjBJR2hoYm1Sc1pWQnZhVzUwY3lBOUlIdGNiaUFnSUNBZ0lITjBZWEowT2lCTllYUm9MbEJKS2pFdU5TeGNiaUFnSUNBZ0lHVnVaRG9nYldGMGFDNWpiR2x3S0NCdFlYUm9Mbk5qWVd4bEtIWmhiSFZsTERBc01DNDFMRTFoZEdndVVFa3FNUzQxTEUxaGRHZ3VVRWtxTUM0MUtTQXNJRTFoZEdndVVFa3FNQzQxTENCTllYUm9MbEJKS2pFdU5TQXBYRzRnSUNBZ2ZUdGNiaUFnSUNCc1pYUWdhR0Z1Wkd4bE1sQnZhVzUwY3lBOUlIdGNiaUFnSUNBZ0lITjBZWEowT2lCTllYUm9MbEJKS2pJdU5TeGNiaUFnSUNBZ0lHVnVaRG9nYldGMGFDNWpiR2x3S0NCdFlYUm9Mbk5qWVd4bEtIWmhiSFZsTERBdU5Td3hMRTFoZEdndVVFa3FNaTQxTEUxaGRHZ3VVRWtxTVM0MUtTQXNJRTFoZEdndVVFa3FNUzQxTENCTllYUm9MbEJKS2pJdU5TQXBYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lHeGxkQ0JvWVc1a2JHVlFZWFJvSUQwZ2MzWm5MbUZ5WXloalpXNTBaWEl1ZUN3Z1kyVnVkR1Z5TG5rc0lHUnBZVzFsZEdWeUx6SXRaR2xoYldWMFpYSXZOREFzSUdoaGJtUnNaVkJ2YVc1MGN5NXpkR0Z5ZEN3Z2FHRnVaR3hsVUc5cGJuUnpMbVZ1WkNrN1hHNGdJQ0FnYkdWMElHaGhibVJzWlRKUVlYUm9JRDBnYzNabkxtRnlZeWhqWlc1MFpYSXVlQ3dnWTJWdWRHVnlMbmtzSUdScFlXMWxkR1Z5THpJdFpHbGhiV1YwWlhJdk5EQXNJR2hoYm1Sc1pUSlFiMmx1ZEhNdWMzUmhjblFzSUdoaGJtUnNaVEpRYjJsdWRITXVaVzVrS1R0Y2JseHVJQ0FnSUhSb2FYTXVhR0Z1Wkd4bExuTmxkRUYwZEhKcFluVjBaU2duWkNjc2FHRnVaR3hsVUdGMGFDazdYRzRnSUNBZ2RHaHBjeTVvWVc1a2JHVXVjMlYwUVhSMGNtbGlkWFJsS0NkemRISnZhMlV0ZDJsa2RHZ25MQ0JrYVdGdFpYUmxjaTh5TUNrN1hHNGdJQ0FnZEdocGN5NW9ZVzVrYkdVdWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5d2dKMjV2Ym1VbktUdGNibHh1SUNBZ0lIUm9hWE11YUdGdVpHeGxNaTV6WlhSQmRIUnlhV0oxZEdVb0oyUW5MR2hoYm1Sc1pUSlFZWFJvS1R0Y2JpQWdJQ0IwYUdsekxtaGhibVJzWlRJdWMyVjBRWFIwY21saWRYUmxLQ2R6ZEhKdmEyVXRkMmxrZEdnbkxDQmthV0Z0WlhSbGNpOHlNQ2s3WEc0Z0lDQWdkR2hwY3k1b1lXNWtiR1V5TG5ObGRFRjBkSEpwWW5WMFpTZ25abWxzYkNjc0lDZHViMjVsSnlrN1hHNWNiaUFnSUNCb1lXNWtiR1ZRWVhSb0lDczlJQ2NnVENBbksyTmxiblJsY2k1NEt5Y2dKeXRqWlc1MFpYSXVlVHRjYmx4dUlDQWdJSFJvYVhNdWFHRnVaR3hsUm1sc2JDNXpaWFJCZEhSeWFXSjFkR1VvSjJRbkxHaGhibVJzWlZCaGRHZ3BPMXh1SUNBZ0lIUm9hWE11YUdGdVpHeGxSbWxzYkM1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3dGIzQmhZMmwwZVNjc0lDY3dMak1uS1R0Y2JseHVJQ0FnSUdoaGJtUnNaVEpRWVhSb0lDczlJQ2NnVENBbksyTmxiblJsY2k1NEt5Y2dKeXRqWlc1MFpYSXVlVHRjYmx4dUlDQWdJSFJvYVhNdWFHRnVaR3hsTWtacGJHd3VjMlYwUVhSMGNtbGlkWFJsS0Nka0p5eG9ZVzVrYkdVeVVHRjBhQ2s3WEc0Z0lDQWdkR2hwY3k1b1lXNWtiR1V5Um1sc2JDNXpaWFJCZEhSeWFXSjFkR1VvSjJacGJHd3RiM0JoWTJsMGVTY3NJQ2N3TGpNbktUdGNibHh1SUNBZ0lHeGxkQ0JoY21ORmJtUnBibWRCTzF4dUlDQWdJR2xtSUNoMllXeDFaU0E4SURBdU5Ta2dlMXh1SUNBZ0lDQWdZWEpqUlc1a2FXNW5RU0E5SUdoaGJtUnNaVkJ2YVc1MGN5NWxibVE3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lHRnlZMFZ1WkdsdVowRWdQU0JvWVc1a2JHVXlVRzlwYm5SekxtVnVaRHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnNaWFFnWVhKalJXNWthVzVuV0NBOUlHTmxiblJsY2k1NElDc2dUV0YwYUM1amIzTW9ZWEpqUlc1a2FXNW5RU2tnS2lBb1pHbGhiV1YwWlhJdk1pazdYRzRnSUNBZ2JHVjBJR0Z5WTBWdVpHbHVaMWtnUFNCalpXNTBaWEl1ZVNBcklFMWhkR2d1YzJsdUtHRnlZMFZ1WkdsdVowRXBJQ29nS0dScFlXMWxkR1Z5THpJcElDb2dMVEU3WEc1Y2JpQWdJQ0IwYUdsekxtaGhibVJzWlV4cGJtVXVjMlYwUVhSMGNtbGlkWFJsS0Nka0p5d25UU0FuSzJObGJuUmxjaTU0S3ljZ0p5dGpaVzUwWlhJdWVTc25JRXdnSnl0aGNtTkZibVJwYm1kWUt5Y2dKeXRoY21ORmJtUnBibWRaS1R0Y2JpQWdJQ0IwYUdsekxtaGhibVJzWlV4cGJtVXVjMlYwUVhSMGNtbGlkWFJsS0NkemRISnZhMlV0ZDJsa2RHZ25MQ0JrYVdGdFpYUmxjaTh5TUNrN1hHNWNiaUFnZlZ4dVhHNGdJR052Ykc5eVNXNTBaWEptWVdObEtDa2dlMXh1SUNBZ0lIUm9hWE11WW1GamEyZHliM1Z1WkM1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3bkxDQjBhR2x6TG1OdmJHOXljeTVtYVd4c0tUdGNiaUFnSUNCMGFHbHpMbk5qY21WM0xuTmxkRUYwZEhKcFluVjBaU2duWm1sc2JDY3NJSFJvYVhNdVkyOXNiM0p6TG1GalkyVnVkQ2s3WEc0Z0lDQWdkR2hwY3k1b1lXNWtiR1V1YzJWMFFYUjBjbWxpZFhSbEtDZHpkSEp2YTJVbkxDQjBhR2x6TG1OdmJHOXljeTVoWTJObGJuUXBPMXh1SUNBZ0lIUm9hWE11YUdGdVpHeGxNaTV6WlhSQmRIUnlhV0oxZEdVb0ozTjBjbTlyWlNjc0lIUm9hWE11WTI5c2IzSnpMbUZqWTJWdWRDazdYRzRnSUNBZ2RHaHBjeTVvWVc1a2JHVkdhV3hzTG5ObGRFRjBkSEpwWW5WMFpTZ25abWxzYkNjc0lIUm9hWE11WTI5c2IzSnpMbUZqWTJWdWRDazdYRzRnSUNBZ2RHaHBjeTVvWVc1a2JHVXlSbWxzYkM1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3bkxDQjBhR2x6TG1OdmJHOXljeTVoWTJObGJuUXBPMXh1SUNBZ0lIUm9hWE11YUdGdVpHeGxUR2x1WlM1elpYUkJkSFJ5YVdKMWRHVW9KM04wY205clpTY3NJSFJvYVhNdVkyOXNiM0p6TG1GalkyVnVkQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lISmxibVJsY2lncElIdGNiaUFnSUNCc1pYUWdkbUZzZFdVZ1BTQjBhR2x6TGw5MllXeDFaUzV1YjNKdFlXeHBlbVZrTzF4dVhHNGdJQ0FnYkdWMElHTmxiblJsY2lBOUlIdGNiaUFnSUNBZ0lIZzZJSFJvYVhNdWQybGtkR2d2TWl4Y2JpQWdJQ0FnSUhrNklIUm9hWE11YUdWcFoyaDBMekpjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdiR1YwSUdScFlXMWxkR1Z5SUQwZ1RXRjBhQzV0YVc0b2RHaHBjeTUzYVdSMGFDeDBhR2x6TG1obGFXZG9kQ2s3WEc1Y2JpQWdJQ0JzWlhRZ2FHRnVaR3hsVUc5cGJuUnpJRDBnZTF4dUlDQWdJQ0FnYzNSaGNuUTZJRTFoZEdndVVFa3FNUzQxTEZ4dUlDQWdJQ0FnWlc1a09pQnRZWFJvTG1Oc2FYQW9JRzFoZEdndWMyTmhiR1VvZG1Gc2RXVXNNQ3d3TGpVc1RXRjBhQzVRU1NveExqVXNUV0YwYUM1UVNTb3dMalVwSUN3Z1RXRjBhQzVRU1Nvd0xqVXNJRTFoZEdndVVFa3FNUzQxSUNsY2JpQWdJQ0I5TzF4dUlDQWdJR3hsZENCb1lXNWtiR1V5VUc5cGJuUnpJRDBnZTF4dUlDQWdJQ0FnYzNSaGNuUTZJRTFoZEdndVVFa2dLakl1TlN4Y2JpQWdJQ0FnSUdWdVpEb2diV0YwYUM1amJHbHdLQ0J0WVhSb0xuTmpZV3hsS0haaGJIVmxMREF1TlN3eExFMWhkR2d1VUVrcU1pNDFMRTFoZEdndVVFa3FNUzQxS1NBc0lFMWhkR2d1VUVrcU1TNDFMQ0JOWVhSb0xsQkpLakl1TlNBcFhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUd4bGRDQm9ZVzVrYkdWUVlYUm9JRDBnYzNabkxtRnlZeWhqWlc1MFpYSXVlQ3dnWTJWdWRHVnlMbmtzSUdScFlXMWxkR1Z5THpJdFpHbGhiV1YwWlhJdk5EQXNJR2hoYm1Sc1pWQnZhVzUwY3k1emRHRnlkQ3dnYUdGdVpHeGxVRzlwYm5SekxtVnVaQ2s3WEc0Z0lDQWdiR1YwSUdoaGJtUnNaVEpRWVhSb0lEMGdjM1puTG1GeVl5aGpaVzUwWlhJdWVDd2dZMlZ1ZEdWeUxua3NJR1JwWVcxbGRHVnlMekl0WkdsaGJXVjBaWEl2TkRBc0lHaGhibVJzWlRKUWIybHVkSE11YzNSaGNuUXNJR2hoYm1Sc1pUSlFiMmx1ZEhNdVpXNWtLVHRjYmx4dUlDQWdJSFJvYVhNdWFHRnVaR3hsTG5ObGRFRjBkSEpwWW5WMFpTZ25aQ2NzYUdGdVpHeGxVR0YwYUNrN1hHNGdJQ0FnZEdocGN5NW9ZVzVrYkdVeUxuTmxkRUYwZEhKcFluVjBaU2duWkNjc2FHRnVaR3hsTWxCaGRHZ3BPMXh1WEc1Y2JpQWdJQ0JvWVc1a2JHVlFZWFJvSUNzOUlDY2dUQ0FuSzJObGJuUmxjaTU0S3ljZ0p5dGpaVzUwWlhJdWVUdGNibHh1SUNBZ0lIUm9hWE11YUdGdVpHeGxSbWxzYkM1elpYUkJkSFJ5YVdKMWRHVW9KMlFuTEdoaGJtUnNaVkJoZEdncE8xeHVYRzRnSUNBZ2FHRnVaR3hsTWxCaGRHZ2dLejBnSnlCTUlDY3JZMlZ1ZEdWeUxuZ3JKeUFuSzJObGJuUmxjaTU1TzF4dVhHNGdJQ0FnZEdocGN5NW9ZVzVrYkdVeVJtbHNiQzV6WlhSQmRIUnlhV0oxZEdVb0oyUW5MR2hoYm1Sc1pUSlFZWFJvS1R0Y2JseHVJQ0FnSUd4bGRDQmhjbU5GYm1ScGJtZEJPMXh1SUNBZ0lHbG1JQ2gyWVd4MVpTQThQU0F3TGpVcElIdGNiaUFnSUNBZ0lHRnlZMFZ1WkdsdVowRWdQU0JvWVc1a2JHVlFiMmx1ZEhNdVpXNWtPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCaGNtTkZibVJwYm1kQklEMGdhR0Z1Wkd4bE1sQnZhVzUwY3k1bGJtUTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2JHVjBJR0Z5WTBWdVpHbHVaMWdnUFNCalpXNTBaWEl1ZUNBcklFMWhkR2d1WTI5ektHRnlZMFZ1WkdsdVowRXBJQ29nS0dScFlXMWxkR1Z5THpJcE8xeHVJQ0FnSUd4bGRDQmhjbU5GYm1ScGJtZFpJRDBnWTJWdWRHVnlMbmtnS3lCTllYUm9Mbk5wYmloaGNtTkZibVJwYm1kQktTQXFJQ2hrYVdGdFpYUmxjaTh5S1NBcUlDMHhPMXh1WEc0Z0lDQWdkR2hwY3k1b1lXNWtiR1ZNYVc1bExuTmxkRUYwZEhKcFluVjBaU2duWkNjc0owMGdKeXRqWlc1MFpYSXVlQ3NuSUNjclkyVnVkR1Z5TG5rckp5Qk1JQ2NyWVhKalJXNWthVzVuV0NzbklDY3JZWEpqUlc1a2FXNW5XU2s3WEc1Y2JpQWdmVnh1WEc1Y2JpQWdZMnhwWTJzb0tTQjdYRzRnSUNBZ2FXWWdLSFJvYVhNdWJXOWtaVDA5UFNkeVpXeGhkR2wyWlNjcElIdGNiaUFnSUNBZ0lIUm9hWE11Y0hKbGRtbHZkWE5CYm1kc1pTQTlJR1poYkhObE8xeHVJQ0FnSUgxY2JpQWdJQ0IwYUdsekxuQnZjMmwwYVc5dUxtRnVZMmh2Y2lBOUlIUm9hWE11Ylc5MWMyVTdYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaTUyWVd4MVpTQTlJSFJvYVhNdVgzWmhiSFZsTG01dmNtMWhiR2w2WldRN1hHNGdJQ0FnZEdocGN5NXRiM1psS0NrN1hHNGdJQ0I5WEc1Y2JpQWdiVzkyWlNncElIdGNiaUFnSUNCcFppQW9kR2hwY3k1amJHbGphMlZrS1NCN1hHNWNiaUFnSUNBZ0lIUm9hWE11Y0c5emFYUnBiMjR1ZFhCa1lYUmxLSFJvYVhNdWJXOTFjMlVwTzF4dVhHNGdJQ0FnSUNCc1pYUWdZVzVuYkdVZ1BTQjBhR2x6TG5CdmMybDBhVzl1TG5aaGJIVmxLazFoZEdndVVFa3FNanRjYmx4dUlDQWdJQ0FnYVdZZ0tHRnVaMnhsSUR3Z01DQXBJSHNnWVc1bmJHVWdLejBnS0UxaGRHZ3VVRWtxTWlrN0lIMWNibHh1SUNBZ0lDQWdhV1lnS0hSb2FYTXViVzlrWlNBOVBUMGdKM0psYkdGMGFYWmxKeWtnZTF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1d2NtVjJhVzkxYzBGdVoyeGxJQ0U5UFNCbVlXeHpaU0FtSmlCTllYUm9MbUZpY3loMGFHbHpMbkJ5WlhacGIzVnpRVzVuYkdVZ0xTQmhibWRzWlNrZ1BpQXlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWNISmxkbWx2ZFhOQmJtZHNaU0ErSURNcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdGdVoyeGxJRDBnVFdGMGFDNVFTU295TzF4dUlDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JoYm1kc1pTQTlJREE3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlJQzhxSUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV3Y21WMmFXOTFjMEZ1WjJ4bElDRTlQU0JtWVd4elpTQW1KaUJOWVhSb0xtRmljeWgwYUdsekxuQnlaWFpwYjNWelFXNW5iR1VnTFNCaGJtZHNaU2tnUGlBeUtTQjdYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11Y0hKbGRtbHZkWE5CYm1kc1pTQStJRE1wSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR0Z1WjJ4bElEMGdUV0YwYUM1UVNTb3lPMXh1SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmhibWRzWlNBOUlEQTdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUlDb3ZYRzRnSUNBZ0lDQjBhR2x6TG5CeVpYWnBiM1Z6UVc1bmJHVWdQU0JoYm1kc1pUdGNibHh1SUNBZ0lDQWdiR1YwSUhKbFlXeFdZV3gxWlNBOUlHRnVaMnhsSUM4Z0tFMWhkR2d1VUVrcU1pazdYRzVjYmlBZ0lDQWdJSFJvYVhNdWRtRnNkV1VnUFNCMGFHbHpMbDkyWVd4MVpTNTFjR1JoZEdWT2IzSnRZV3dvSUhKbFlXeFdZV3gxWlNBcE8xeHVYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NXRiMlJsSUQwOVBTQW5jbVZzWVhScGRtVW5LU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjRzl6YVhScGIyNHVkbUZzZFdVZ1BTQnlaV0ZzVm1Gc2RXVTdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJSFJvYVhNdVpXMXBkQ2duWTJoaGJtZGxKeXgwYUdsekxsOTJZV3gxWlM1MllXeDFaU2s3WEc1Y2JpQWdJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDazdYRzVjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0J5Wld4bFlYTmxLQ2tnZTF4dUlDQjlYRzVjYmlBZ0x5cGNiaUFnUkdsaGJDZHpJSFpoYkhWbExpQlhhR1Z1SUhObGRDd2dhWFFnZDJsc2JDQmhkWFJ2YldGMGFXTmhiR3g1SUdKbElHRmthblZ6ZENCMGJ5Qm1hWFFnYldsdUwyMWhlQzl6ZEdWd0lITmxkSFJwYm1keklHOW1JSFJvWlNCcGJuUmxjbVpoWTJVdVhHNGdJRUIwZVhCbElIdHVkVzFpWlhKOVhHNGdJRUJsZUdGdGNHeGxJR1JwWVd3dWRtRnNkV1VnUFNBeE1EdGNibHh1SUNCblpYUWdkbUZzZFdVb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVYM1poYkhWbExuWmhiSFZsTzF4dUlDQjlYRzVjYmlBZ2MyVjBJSFpoYkhWbEtIWmhiSFZsS1NCN1hHNGdJQ0FnZEdocGN5NWZkbUZzZFdVdWRYQmtZWFJsS0haaGJIVmxLVHRjYmlBZ0lDQjBhR2x6TG1WdGFYUW9KMk5vWVc1blpTY3NkR2hwY3k1MllXeDFaU2s3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdmVnh1S2k5Y2JseHVJQ0FnSUM4cUtseHVJQ0FnSUVScFlXd25jeUIyWVd4MVpTNGdWMmhsYmlCelpYUXNJR2wwSUhkcGJHd2dZWFYwYjIxaGRHbGpZV3hzZVNCaVpTQmhaR3AxYzNRZ2RHOGdabWwwSUcxcGJpOXRZWGd2YzNSbGNDQnpaWFIwYVc1bmN5QnZaaUIwYUdVZ2FXNTBaWEptWVdObExseHVJQ0FnSUVCMGVYQmxJSHR1ZFcxaVpYSjlYRzRnSUNBZ1FHVjRZVzF3YkdVZ1pHbGhiQzUyWVd4MVpTQTlJREV3TzF4dUlDQWdJQ292WEc0Z0lDQWdaMlYwSUhaaGJIVmxLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVgzWmhiSFZsTG5aaGJIVmxPMXh1SUNBZ0lIMWNiaUFnSUNCelpYUWdkbUZzZFdVb2Rpa2dlMXh1SUNBZ0lDQWdkR2hwY3k1ZmRtRnNkV1V1ZFhCa1lYUmxLSFlwTzF4dUlDQWdJQ0FnZEdocGN5NXdiM05wZEdsdmJpNTJZV3gxWlNBOUlIUm9hWE11WDNaaGJIVmxMbTV2Y20xaGJHbDZaV1E3WEc0Z0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzZEdocGN5NWZkbUZzZFdVdWRtRnNkV1VwTzF4dUlDQWdJQ0FnZEdocGN5NXlaVzVrWlhJb0tUdGNiaUFnSUNCOVhHNWNiaUFnSUNBdktpcGNiaUFnSUNCTWIzZGxjaUJzYVcxcGRDQnZaaUIwYUdVZ1pHbGhiQ2R6SUc5MWRIQjFkQ0J5WVc1blpWeHVJQ0FnSUVCMGVYQmxJSHR1ZFcxaVpYSjlYRzRnSUNBZ1FHVjRZVzF3YkdVZ1pHbGhiQzV0YVc0Z1BTQXhNREF3TzF4dUlDQWdJQ292WEc0Z0lDQWdaMlYwSUcxcGJpZ3BJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TGw5MllXeDFaUzV0YVc0N1hHNGdJQ0FnZlZ4dUlDQWdJSE5sZENCdGFXNG9kaWtnZTF4dUlDQWdJQ0FnZEdocGN5NWZkbUZzZFdVdWJXbHVJRDBnZGp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0F2S2lwY2JpQWdJQ0JWY0hCbGNpQnNhVzFwZENCdlppQjBhR1VnWkdsaGJDZHpJRzkxZEhCMWRDQnlZVzVuWlZ4dUlDQWdJRUIwZVhCbElIdHVkVzFpWlhKOVhHNGdJQ0FnUUdWNFlXMXdiR1VnWkdsaGJDNXRZWGdnUFNBeE1EQXdPMXh1SUNBZ0lDb3ZYRzRnSUNBZ1oyVjBJRzFoZUNncElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbDkyWVd4MVpTNXRZWGc3WEc0Z0lDQWdmVnh1SUNBZ0lITmxkQ0J0WVhnb2Rpa2dlMXh1SUNBZ0lDQWdkR2hwY3k1ZmRtRnNkV1V1YldGNElEMGdkanRjYmlBZ0lDQjlYRzVjYmlBZ0lDQXZLaXBjYmlBZ0lDQlVhR1VnYVc1amNtVnRaVzUwSUhSb1lYUWdkR2hsSUdScFlXd25jeUIyWVd4MVpTQmphR0Z1WjJWeklHSjVMbHh1SUNBZ0lFQjBlWEJsSUh0dWRXMWlaWEo5WEc0Z0lDQWdRR1Y0WVcxd2JHVWdaR2xoYkM1emRHVndJRDBnTlR0Y2JpQWdJQ0FxTDF4dUlDQWdJR2RsZENCemRHVndLQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVgzWmhiSFZsTG5OMFpYQTdYRzRnSUNBZ2ZWeHVJQ0FnSUhObGRDQnpkR1Z3S0hZcElIdGNiaUFnSUNBZ0lIUm9hWE11WDNaaGJIVmxMbk4wWlhBZ1BTQjJPMXh1SUNBZ0lIMWNibHh1SUNBZ0lDOHFLbHh1SUNBZ0lFRmljMjlzZFhSbElHMXZaR1VnS0dScFlXd25jeUIyWVd4MVpTQnFkVzF3Y3lCMGJ5QnRiM1Z6WlNCamJHbGpheUJ3YjNOcGRHbHZiaWtnYjNJZ2NtVnNZWFJwZG1VZ2JXOWtaU0FvYlc5MWMyVWdaSEpoWnlCamFHRnVaMlZ6SUhaaGJIVmxJSEpsYkdGMGFYWmxJSFJ2SUdsMGN5QmpkWEp5Wlc1MElIQnZjMmwwYVc5dUtTNGdSR1ZtWVhWc2REb2dYQ0p5Wld4aGRHbDJaVndpTGx4dUlDQWdJRUIwZVhCbElIdHpkSEpwYm1kOVhHNGdJQ0FnUUdWNFlXMXdiR1VnWkdsaGJDNXRiMlJsSUQwZ1hDSnlaV3hoZEdsMlpWd2lPMXh1SUNBZ0lDb3ZYRzRnSUNBZ1oyVjBJRzF2WkdVb0tTQjdYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV3YjNOcGRHbHZiaTV0YjJSbE8xeHVJQ0FnSUgxY2JpQWdJQ0J6WlhRZ2JXOWtaU2gyS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbkJ2YzJsMGFXOXVMbTF2WkdVZ1BTQjJPMXh1SUNBZ0lIMWNibHh1WEc0Z0lDOHFLbHh1SUNCT2IzSnRZV3hwZW1Wa0lIWmhiSFZsSUc5bUlIUm9aU0JrYVdGc0xseHVJQ0JBZEhsd1pTQjdiblZ0WW1WeWZWeHVJQ0JBWlhoaGJYQnNaU0JrYVdGc0xtNXZjbTFoYkdsNlpXUWdQU0F3TGpVN1hHNGdJQ292WEc0Z0lHZGxkQ0J1YjNKdFlXeHBlbVZrS0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxsOTJZV3gxWlM1dWIzSnRZV3hwZW1Wa08xeHVJQ0I5WEc1Y2JpQWdjMlYwSUc1dmNtMWhiR2w2WldRb2Rpa2dlMXh1SUNBZ0lIUm9hWE11WDNaaGJIVmxMblZ3WkdGMFpVNXZjbTFoYkNoMktUdGNiaUFnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc2RHaHBjeTUyWVd4MVpTazdYRzRnSUgxY2JseHVmVnh1WEc1Y2JseHVMeThnVjBWQ1VFRkRTeUJHVDA5VVJWSWdMeTljYmk4dklDNHZmaTlxYzJocGJuUXRiRzloWkdWeUlTNHZiR2xpTDJsdWRHVnlabUZqWlhNdlpHbGhiQzVxY3lJc0lpZDFjMlVnYzNSeWFXTjBKenRjYmx4dWJHVjBJSE4yWnlBOUlISmxjWFZwY21Vb0p5NHVMM1YwYVd3dmMzWm5KeWs3WEc1c1pYUWdTVzUwWlhKbVlXTmxJRDBnY21WeGRXbHlaU2duTGk0dlkyOXlaUzlwYm5SbGNtWmhZMlVuS1R0Y2JteGxkQ0JDZFhSMGIyNVVaVzF3YkdGMFpTQTlJSEpsY1hWcGNtVW9KeTR1TDJOdmJYQnZibVZ1ZEhNdlluVjBkRzl1ZEdWdGNHeGhkR1VuS1R0Y2JteGxkQ0IwYjNWamFDQTlJSEpsY1hWcGNtVW9KeTR1TDNWMGFXd3ZkRzkxWTJnbktUdGNibHh1WTJ4aGMzTWdVR2xoYm05TFpYa2daWGgwWlc1a2N5QkNkWFIwYjI1VVpXMXdiR0YwWlNCN1hHNWNiaUFnWTI5dWMzUnlkV04wYjNJb0tTQjdYRzVjYmlBZ0lDQnNaWFFnYjNCMGFXOXVjeUE5SUZzbmRtRnNkV1VuTENkdWIzUmxKeXduWTI5c2IzSW5YVHRjYmx4dUlDQWdJR3hsZENCa1pXWmhkV3gwY3lBOUlIdGNiaUFnSUNBZ0lDZHphWHBsSnpvZ1d6Z3dMRGd3WFN4Y2JpQWdJQ0FnSUNkMFlYSm5aWFFuT2lCbVlXeHpaU3hjYmlBZ0lDQWdJQ2R0YjJSbEp6b2dKMkoxZEhSdmJpY3NYRzRnSUNBZ0lDQW5kbUZzZFdVbk9pQXdYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lITjFjR1Z5S0dGeVozVnRaVzUwY3l4dmNIUnBiMjV6TEdSbFptRjFiSFJ6S1R0Y2JseHVJQ0FnSUhSb2FYTXVibTkwWlNBOUlIUm9hWE11YzJWMGRHbHVaM011Ym05MFpUdGNiaUFnSUNCMGFHbHpMbU52Ykc5eUlEMGdkR2hwY3k1elpYUjBhVzVuY3k1amIyeHZjanRjYmx4dUlDQWdJSFJvYVhNdVkyOXNiM0p6SUQwZ2UxeHVJQ0FnSUNBZ0ozY25PaUFuSTJabVppY3NYRzRnSUNBZ0lDQW5ZaWM2SUNjak5qWTJKeXhjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdkR2hwY3k1cGJtbDBLQ2s3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JseHVJQ0I5WEc1Y2JpQWdZblZwYkdSR2NtRnRaU2dwSUh0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RZ1BTQnpkbWN1WTNKbFlYUmxLQ2R6ZG1jbktUdGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVjMlYwUVhSMGNtbGlkWFJsS0NkM2FXUjBhQ2NzZEdocGN5NTNhV1IwYUNrN1hHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExuTmxkRUYwZEhKcFluVjBaU2duYUdWcFoyaDBKeXgwYUdsekxtaGxhV2RvZENrN1hHNGdJQ0FnZEdocGN5NXdZWEpsYm5RdVlYQndaVzVrUTJocGJHUW9kR2hwY3k1bGJHVnRaVzUwS1R0Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrU1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzRnSUNBZ2RHaHBjeTV3WVdRZ1BTQnpkbWN1WTNKbFlYUmxLQ2R5WldOMEp5azdYRzVjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1WVhCd1pXNWtRMmhwYkdRb2RHaHBjeTV3WVdRcE8xeHVYRzRnSUNBZ2RHaHBjeTVwYm5SbGNtRmpkR2x2YmxSaGNtZGxkQ0E5SUhSb2FYTXVjR0ZrTzF4dVhHNGdJQ0FnTHlvZ1pYWmxiblJ6SUNvdlhHNWNiaUFnSUNCcFppQW9JWFJ2ZFdOb0xtVjRhWE4wY3lrZ2UxeHVYRzRnSUNBZ0lDQjBhR2x6TG1Oc2FXTnJJRDBnS0NrZ1BUNGdlMXh1SUNBZ0lDQWdMeThnSUdOdmJuTnZiR1V1Ykc5bktDZGpiR2xqYXljcE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5CcFlXNXZMbWx1ZEdWeVlXTjBhVzVuSUQwZ2RISjFaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXdhV0Z1Ynk1d1lXbHVkR0p5ZFhOb0lEMGdJWFJvYVhNdWMzUmhkR1U3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVaRzkzYmloMGFHbHpMbkJwWVc1dkxuQmhhVzUwWW5KMWMyZ3BPMXh1SUNBZ0lDQWdmVHRjYmx4dUlDQWdJQ0FnZEdocGN5NXdZV1F1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWduYlc5MWMyVnZkbVZ5Snl3Z0tDa2dQVDRnZTF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1d2FXRnVieTVwYm5SbGNtRmpkR2x1WnlrZ2UxeHVJQ0FnSUNBZ0x5OGdJQ0FnWTI5dWMyOXNaUzVzYjJjb0oyMXZkWE5sYjNabGNpY3BPMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVaRzkzYmloMGFHbHpMbkJwWVc1dkxuQmhhVzUwWW5KMWMyZ3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5S1R0Y2JseHVYRzRnSUNBZ0lDQjBhR2x6TG0xdmRtVWdQU0FvS1NBOVBpQjdYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMbkJwWVc1dkxtbHVkR1Z5WVdOMGFXNW5LU0I3WEc0Z0lDQWdJQ0FnSUM4dklDQmpiMjV6YjJ4bExteHZaeWduYlc5MlpTY3BPMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVZbVZ1WkNncE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlPMXh1WEc1Y2JpQWdJQ0FnSUhSb2FYTXVjbVZzWldGelpTQTlJQ2dwSUQwK0lIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1d2FXRnVieTVwYm5SbGNtRmpkR2x1WnlBOUlHWmhiSE5sTzF4dUlDQWdJQ0FnTHk4Z0lHTnZibk52YkdVdWJHOW5LQ2R5Wld4bFlYTmxKeWs3WEc0Z0lDQWdJQ0F2THlBZ2RHaHBjeTUxY0NncE8xeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lIUm9hWE11Y0dGa0xtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0oyMXZkWE5sZFhBbkxDQW9LU0E5UGlCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxuQnBZVzV2TG1sdWRHVnlZV04wYVc1bktTQjdYRzRnSUNBZ0lDQWdJQzh2SUNCamIyNXpiMnhsTG14dlp5Z25iVzkxYzJWMWNDY3BPMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVkWEFvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQjBhR2x6TG5CaFpDNWhaR1JGZG1WdWRFeHBjM1JsYm1WeUtDZHRiM1Z6Wlc5MWRDY3NJQ2dwSUQwK0lIdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjR2xoYm04dWFXNTBaWEpoWTNScGJtY3BJSHRjYmlBZ0lDQWdJQ0FnTHk4Z0lHTnZibk52YkdVdWJHOW5LQ2R0YjNWelpXOTFkQ2NwTzF4dUlDQWdJQ0FnSUNBZ0lIUm9hWE11ZFhBb0tUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmU2s3WEc1Y2JpQWdJQ0I5WEc1Y2JpQWdmVnh1WEc0Z0lITnBlbVZKYm5SbGNtWmhZMlVvS1NCN1hHNWNiaUFnSUNBZ0lDQWdMeTlzWlhRZ2NtRmthWFZ6SUQwZ1RXRjBhQzV0YVc0b2RHaHBjeTUzYVdSMGFDeDBhR2x6TG1obGFXZG9kQ2tnTHlBMU8xeHVJQ0FnSUNBZ0lDQnNaWFFnY21Ga2FYVnpJRDBnTUR0Y2JseHVJQ0FnSUNBZ0lDQjBhR2x6TG5CaFpDNXpaWFJCZEhSeWFXSjFkR1VvSjNnbkxEQXVOU2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjR0ZrTG5ObGRFRjBkSEpwWW5WMFpTZ25lU2NzTUM0MUtUdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXVkMmxrZEdnZ1BpQXlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTV3WVdRdWMyVjBRWFIwY21saWRYUmxLQ2QzYVdSMGFDY3NJSFJvYVhNdWQybGtkR2dnTFNBeEtUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxuQmhaQzV6WlhSQmRIUnlhV0oxZEdVb0ozZHBaSFJvSnl3Z2RHaHBjeTUzYVdSMGFDazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YUdWcFoyaDBJRDRnTWlrZ2UxeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNHRmtMbk5sZEVGMGRISnBZblYwWlNnbmFHVnBaMmgwSnl3Z2RHaHBjeTVvWldsbmFIUXBPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVjR0ZrTG5ObGRFRjBkSEpwWW5WMFpTZ25hR1ZwWjJoMEp5d2dkR2hwY3k1b1pXbG5hSFFwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIUm9hWE11Y0dGa0xuTmxkRUYwZEhKcFluVjBaU2duY25nbkxDQnlZV1JwZFhNcE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5CaFpDNXpaWFJCZEhSeWFXSjFkR1VvSjNKNUp5d2djbUZrYVhWektUdGNibHh1SUNCOVhHNWNiaUFnY21WdVpHVnlLQ2tnZTF4dUlDQWdJR2xtSUNnaGRHaHBjeTV6ZEdGMFpTa2dlMXh1SUNBZ0lDQWdkR2hwY3k1d1lXUXVjMlYwUVhSMGNtbGlkWFJsS0NkbWFXeHNKeXdnZEdocGN5NWpiMnh2Y25OYmRHaHBjeTVqYjJ4dmNsMHBPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFHbHpMbkJoWkM1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3bkxDQjBhR2x6TG1OdmJHOXljeTVoWTJObGJuUXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNTlYRzVjYmk4cUtseHVLaUJRYVdGdWIxeHVLbHh1S2lCQVpHVnpZM0pwY0hScGIyNGdVR2xoYm04Z2EyVjVZbTloY21RZ2FXNTBaWEptWVdObFhHNHFYRzRxSUVCa1pXMXZJRHhrYVhZZ2JtVjRkWE10ZFdrOVhDSndhV0Z1YjF3aVBqd3ZaR2wyUGx4dUtseHVLaUJBWlhoaGJYQnNaVnh1S2lCMllYSWdjR2xoYm04Z1BTQnVaWGNnVG1WNGRYTXVVR2xoYm04b0p5TjBZWEpuWlhRbktWeHVLbHh1S2lCQVpYaGhiWEJzWlZ4dUtpQjJZWElnY0dsaGJtOGdQU0J1WlhjZ1RtVjRkWE11VUdsaGJtOG9KeU4wWVhKblpYUW5MSHRjYmlvZ0lDQWdJQ2R6YVhwbEp6b2dXelV3TUN3eE1qVmRMRnh1S2lBZ0lDQWdKMjF2WkdVbk9pQW5ZblYwZEc5dUp5d2dJQzh2SUNkaWRYUjBiMjRuTENBbmRHOW5aMnhsSnl3Z2IzSWdKMmx0Y0hWc2MyVW5YRzRxSUNBZ0lDQW5iRzkzVG05MFpTYzZJREkwTEZ4dUtpQWdJQ0FnSjJocFoyaE9iM1JsSnpvZ05qQmNiaW9nZlNsY2JpcGNiaW9nUUc5MWRIQjFkRnh1S2lCamFHRnVaMlZjYmlvZ1JtbHlaWE1nWVc1NUlIUnBiV1VnWVNCdVpYY2dhMlY1SUdseklIQnlaWE56WldRZ2IzSWdjbVZzWldGelpXUWdQR0p5UGx4dUtpQlVhR1VnWlhabGJuUWdaR0YwWVNCcGN5QmhiaUJ2WW1wbFkzUWdZMjl1ZEdGcGJtbHVaeUE4YVQ1dWIzUmxQQzlwUGlCaGJtUWdQR2srYzNSaGRHVThMMmsrSUhCeWIzQmxjblJwWlhNdVhHNHFYRzRxSUVCdmRYUndkWFJsZUdGdGNHeGxYRzRxSUhCcFlXNXZMbTl1S0NkamFHRnVaMlVuTEdaMWJtTjBhVzl1S0hZcElIdGNiaW9nSUNCamIyNXpiMnhsTG14dlp5aDJLVHRjYmlvZ2ZTbGNiaXBjYmlvdlhHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHTnNZWE56SUZCcFlXNXZJR1Y0ZEdWdVpITWdTVzUwWlhKbVlXTmxJSHRjYmx4dUlDQmpiMjV6ZEhKMVkzUnZjaWdwSUh0Y2JseHVJQ0FnSUd4bGRDQnZjSFJwYjI1eklEMGdXeWQyWVd4MVpTZGRPMXh1WEc0Z0lDQWdiR1YwSUdSbFptRjFiSFJ6SUQwZ2UxeHVJQ0FnSUNBZ0ozTnBlbVVuT2lCYk5UQXdMREV5TlYwc1hHNGdJQ0FnSUNBbmJHOTNUbTkwWlNjNklESTBMRnh1SUNBZ0lDQWdKMmhwWjJoT2IzUmxKem9nTmpBc1hHNGdJQ0FnSUNBbmJXOWtaU2M2SUNkaWRYUjBiMjRuWEc0Z0lDQWdmVHRjYmx4dUlDQWdJSE4xY0dWeUtHRnlaM1Z0Wlc1MGN5eHZjSFJwYjI1ekxHUmxabUYxYkhSektUdGNibHh1SUNBZ0lIUm9hWE11YTJWNVVHRjBkR1Z5YmlBOUlGc25keWNzSjJJbkxDZDNKeXduWWljc0ozY25MQ2QzSnl3bllpY3NKM2NuTENkaUp5d25keWNzSjJJbkxDZDNKMTA3WEc1Y2JpQWdJQ0IwYUdsekxuQmhhVzUwWW5KMWMyZ2dQU0JtWVd4elpUdGNibHh1SUNBZ0lIUm9hWE11Ylc5a1pTQTlJSFJvYVhNdWMyVjBkR2x1WjNNdWJXOWtaVHRjYmx4dUlDQWdJSFJvYVhNdWNtRnVaMlVnUFNCN1hHNGdJQ0FnSUNCc2IzYzZJSFJvYVhNdWMyVjBkR2x1WjNNdWJHOTNUbTkwWlN4Y2JpQWdJQ0FnSUdocFoyZzZJSFJvYVhNdWMyVjBkR2x1WjNNdWFHbG5hRTV2ZEdWY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnZEdocGN5NXlZVzVuWlM1emFYcGxJRDBnZEdocGN5NXlZVzVuWlM1b2FXZG9JQzBnZEdocGN5NXlZVzVuWlM1c2IzYzdYRzVjYmlBZ0lDQjBhR2x6TG10bGVYTWdQU0JiWFR0Y2JseHVJQ0FnSUhSb2FYTXVkRzluWjJ4bFZHOGdQU0JtWVd4elpUdGNibHh1SUNBZ0lIUm9hWE11YVc1cGRDZ3BPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrUm5KaGJXVW9LU0I3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwSUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2duWkdsMkp5azdYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk4wZVd4bExuQnZjMmwwYVc5dUlEMGdKM0psYkdGMGFYWmxKenRjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1YzNSNWJHVXVZbTl5WkdWeVVtRmthWFZ6SUQwZ0p6QndlQ2M3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG5OMGVXeGxMbVJwYzNCc1lYa2dQU0FuWW14dlkyc25PMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzV6ZEhsc1pTNTNhV1IwYUNBOUlDY3hNREFsSnp0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWMzUjViR1V1YUdWcFoyaDBJRDBnSnpFd01DVW5PMXh1SUNBZ0lIUm9hWE11Y0dGeVpXNTBMbUZ3Y0dWdVpFTm9hV3hrS0hSb2FYTXVaV3hsYldWdWRDazdYRzRnSUgxY2JseHVJQ0JpZFdsc1pFbHVkR1Z5Wm1GalpTZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdWEyVjVjeUE5SUZ0ZE8xeHVYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FUMHdPMms4ZEdocGN5NXlZVzVuWlM1b2FXZG9JQzBnZEdocGN5NXlZVzVuWlM1c2IzYzdhU3NyS1NCN1hHNWNiaUFnSUNBZ0lHeGxkQ0JqYjI1MFlXbHVaWElnUFNCa2IyTjFiV1Z1ZEM1amNtVmhkR1ZGYkdWdFpXNTBLQ2R6Y0dGdUp5azdYRzRnSUNBZ0lDQnNaWFFnYzJOaGJHVkpibVJsZUNBOUlDaHBLM1JvYVhNdWNtRnVaMlV1Ykc5M0tTQWxJSFJvYVhNdWEyVjVVR0YwZEdWeWJpNXNaVzVuZEdnN1hHNWNiaUFnSUNBZ0lHeGxkQ0JyWlhrZ1BTQnVaWGNnVUdsaGJtOUxaWGtvWTI5dWRHRnBibVZ5TENCN1hHNGdJQ0FnSUNBZ0lDQWdZMjl0Y0c5dVpXNTBPaUIwY25WbExGeHVJQ0FnSUNBZ0lDQWdJRzV2ZEdVNklHa3JkR2hwY3k1eVlXNW5aUzVzYjNjc1hHNGdJQ0FnSUNBZ0lDQWdZMjlzYjNJNklIUm9hWE11YTJWNVVHRjBkR1Z5Ymx0elkyRnNaVWx1WkdWNFhTeGNiaUFnSUNBZ0lDQWdJQ0J0YjJSbE9pQjBhR2x6TG0xdlpHVmNiaUFnSUNBZ0lDQWdmU3dnZEdocGN5NXJaWGxEYUdGdVoyVXVZbWx1WkNoMGFHbHpMR2tyZEdocGN5NXlZVzVuWlM1c2IzY3BLVHRjYmx4dUlDQWdJQ0FnYTJWNUxuQnBZVzV2SUQwZ2RHaHBjenRjYmx4dUlDQWdJQ0FnYVdZZ0tIUnZkV05vTG1WNGFYTjBjeWtnZTF4dUlDQWdJQ0FnSUNCclpYa3VjR0ZrTG1sdVpHVjRJRDBnYVR0Y2JpQWdJQ0FnSUNBZ2EyVjVMbkJ5WlVOc2FXTnJJRDBnYTJWNUxuQnlaVTF2ZG1VZ1BTQnJaWGt1Y0hKbFVtVnNaV0Z6WlNBOUlDZ3BJRDArSUh0OU8xeHVJQ0FnSUNBZ0lDQnJaWGt1WTJ4cFkyc2dQU0JyWlhrdWJXOTJaU0E5SUd0bGVTNXlaV3hsWVhObElEMGdLQ2tnUFQ0Z2UzMDdYRzRnSUNBZ0lDQWdJR3RsZVM1d2NtVlViM1ZqYUNBOUlHdGxlUzV3Y21WVWIzVmphRTF2ZG1VZ1BTQnJaWGt1Y0hKbFZHOTFZMmhTWld4bFlYTmxJRDBnS0NrZ1BUNGdlMzA3WEc0Z0lDQWdJQ0FnSUd0bGVTNTBiM1ZqYUNBOUlHdGxlUzUwYjNWamFFMXZkbVVnUFNCclpYa3VkRzkxWTJoU1pXeGxZWE5sSUQwZ0tDa2dQVDRnZTMwN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lIUm9hWE11YTJWNWN5NXdkWE5vS0d0bGVTazdYRzRnSUNBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1WVhCd1pXNWtRMmhwYkdRb1kyOXVkR0ZwYm1WeUtUdGNibHh1SUNBZ0lIMWNiaUFnSUNCcFppQW9kRzkxWTJndVpYaHBjM1J6S1NCN1hHNGdJQ0FnSUNCMGFHbHpMbUZrWkZSdmRXTm9UR2x6ZEdWdVpYSnpLQ2s3WEc0Z0lDQWdmVnh1WEc0Z0lIMWNibHh1SUNCemFYcGxTVzUwWlhKbVlXTmxLQ2tnZTF4dVhHNGdJQ0FnYkdWMElHdGxlVmdnUFNBd08xeHVYRzRnSUNBZ2JHVjBJR3RsZVZCdmMybDBhVzl1Y3lBOUlGdGRPMXh1WEc0Z0lDQWdabTl5SUNoc1pYUWdhVDB3TzJrOGRHaHBjeTV5WVc1blpTNW9hV2RvSUMwZ2RHaHBjeTV5WVc1blpTNXNiM2M3YVNzcktTQjdYRzVjYmlBZ0lDQWdJR3RsZVZCdmMybDBhVzl1Y3k1d2RYTm9LR3RsZVZncE8xeHVYRzRnSUNBZ0lDQnNaWFFnYzJOaGJHVkpibVJsZUNBOUlDaHBLM1JvYVhNdWNtRnVaMlV1Ykc5M0tTQWxJSFJvYVhNdWEyVjVVR0YwZEdWeWJpNXNaVzVuZEdnN1hHNGdJQ0FnSUNCc1pYUWdibVY0ZEZOallXeGxTVzVrWlhnZ1BTQW9hU3N4SzNSb2FYTXVjbUZ1WjJVdWJHOTNLU0FsSUhSb2FYTXVhMlY1VUdGMGRHVnliaTVzWlc1bmRHZzdYRzRnSUNBZ0lDQnBaaUFvYVNzeEszUm9hWE11Y21GdVoyVXViRzkzSUQ0OUlIUm9hWE11Y21GdVoyVXVhR2xuYUNrZ2UxeHVJQ0FnSUNBZ0lDQnJaWGxZSUNzOUlERTdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLSFJvYVhNdWEyVjVVR0YwZEdWeWJsdHpZMkZzWlVsdVpHVjRYU0E5UFQwZ0ozY25JQ1ltSUhSb2FYTXVhMlY1VUdGMGRHVnlibHR1WlhoMFUyTmhiR1ZKYm1SbGVGMGdQVDA5SUNkM0p5a2dlMXh1SUNBZ0lDQWdJQ0JyWlhsWUlDczlJREU3WEc0Z0lDQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdJQ0JyWlhsWUlDczlJREF1TlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdiR1YwSUd0bGVYTlhhV1JsSUQwZ2EyVjVXRHRjYmx4dVhHNGdJQzh2SUNCc1pYUWdjR0ZrWkdsdVp5QTlJSFJvYVhNdWQybGtkR2dnTHlBeE1qQTdYRzRnSUNBZ2JHVjBJSEJoWkdScGJtY2dQU0F4TzF4dUlDQWdJR3hsZENCaWRYUjBiMjVYYVdSMGFDQTlJQ2gwYUdsekxuZHBaSFJvTFhCaFpHUnBibWNxTWlrZ0x5QnJaWGx6VjJsa1pUdGNiaUFnSUNCc1pYUWdZblYwZEc5dVNHVnBaMmgwSUQwZ0tIUm9hWE11YUdWcFoyaDBMWEJoWkdScGJtY3FNaWtnTHlBeU8xeHVYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FUMHdPMms4ZEdocGN5NXJaWGx6TG14bGJtZDBhRHRwS3lzcElIdGNibHh1SUNBZ0lDQWdiR1YwSUdOdmJuUmhhVzVsY2lBOUlIUm9hWE11YTJWNWMxdHBYUzV3WVhKbGJuUTdYRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXVjM1I1YkdVdWNHOXphWFJwYjI0Z1BTQW5ZV0p6YjJ4MWRHVW5PMXh1SUNBZ0lDQWdZMjl1ZEdGcGJtVnlMbk4wZVd4bExteGxablFnUFNBb2EyVjVVRzl6YVhScGIyNXpXMmxkS21KMWRIUnZibGRwWkhSb0szQmhaR1JwYm1jcElDc2dKM0I0Snp0Y2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG10bGVYTmJhVjB1WTI5c2IzSWdQVDA5SUNkM0p5a2dlMXh1SUNBZ0lDQWdJQ0JqYjI1MFlXbHVaWEl1YzNSNWJHVXVkRzl3SUQwZ0tIQmhaR1JwYm1jcElDc2dKM0I0Snp0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVyWlhselcybGRMbkpsYzJsNlpTaGlkWFIwYjI1WGFXUjBhQ3dnWW5WMGRHOXVTR1ZwWjJoMEtqSXBPMXh1SUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdZMjl1ZEdGcGJtVnlMbk4wZVd4bExucEpibVJsZUNBOUlERTdYRzRnSUNBZ0lDQWdJR052Ym5SaGFXNWxjaTV6ZEhsc1pTNTBiM0FnUFNCd1lXUmthVzVuS3lkd2VDYzdYRzRnSUNBZ0lDQWdJSFJvYVhNdWEyVjVjMXRwWFM1eVpYTnBlbVVvWW5WMGRHOXVWMmxrZEdnc0lHSjFkSFJ2YmtobGFXZG9kQ294TGpFcE8xeHVJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ2ZWeHVYRzRnSUgxY2JseHVJQ0JqYjJ4dmNrbHVkR1Z5Wm1GalpTZ3BJSHRjYmx4dUlDQWdJQzh2SUZCcFlXNXZJR3RsZVhNZ1pHOXVKM1FnWVdOMGRXRnNiSGtnYUdGMlpTQmhJSE4wY205clpTQmliM0prWlhKY2JpQWdJQ0F2THlCVWFHVjVJR2hoZG1VZ2MzQmhZMlVnWW1WMGQyVmxiaUIwYUdWdExDQjNhR2xqYUNCemFHOTNjeUIwYUdVZ1VHbGhibThnWW1jZ1kyOXNiM0pjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1YzNSNWJHVXVZbUZqYTJkeWIzVnVaRU52Ykc5eUlEMGdkR2hwY3k1amIyeHZjbk11YldWa2FYVnRUR2xuYUhRN1hHNWNiaUFnSUNCbWIzSWdLR3hsZENCcFBUQTdhVHgwYUdsekxtdGxlWE11YkdWdVozUm9PMmtyS3lrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVyWlhselcybGRMbU52Ykc5eWN5QTlJSHRjYmlBZ0lDQWdJQ0FnSjNjbk9pQjBhR2x6TG1OdmJHOXljeTVzYVdkb2RDeGNiaUFnSUNBZ0lDQWdKMkluT2lCMGFHbHpMbU52Ykc5eWN5NWtZWEpyTEZ4dUlDQWdJQ0FnSUNBbllXTmpaVzUwSnpvZ2RHaHBjeTVqYjJ4dmNuTXVZV05qWlc1MExGeHVJQ0FnSUNBZ0lDQW5ZbTl5WkdWeUp6b2dkR2hwY3k1amIyeHZjbk11YldWa2FYVnRUR2xuYUhSY2JpQWdJQ0FnSUgwN1hHNGdJQ0FnSUNCMGFHbHpMbXRsZVhOYmFWMHVZMjlzYjNKSmJuUmxjbVpoWTJVb0tUdGNiaUFnSUNBZ0lIUm9hWE11YTJWNWMxdHBYUzV5Wlc1a1pYSW9LVHRjYmlBZ0lDQjlYRzVjYmx4dUlDQjlYRzVjYmlBZ2EyVjVRMmhoYm1kbEtHNXZkR1VzYjI0cElIdGNiaUFnSUNBdkx5QmxiV2wwSUdSaGRHRWdabTl5SUdGdWVTQnJaWGtnZEhWeWJtbHVaeUJ2Ymk5dlptWmNiaUFnSUNBdkx5QmNJbTV2ZEdWY0lpQnBjeUIwYUdVZ2JtOTBaU0IyWVd4MVpWeHVJQ0FnSUM4dklGd2liMjVjSWlCcGN5QmhJR0p2YjJ4bFlXNGdkMmhsZEdobGNpQnBkQ0JwY3lCdmJpQnZjaUJ2Wm1aY2JpQWdJQ0F2THlCcGJpQmhablJsY25SdmRXTm9JRzF2WkdVc0lGd2liMjQ2SUdseklHRnVJRzlpYW1WamRDQjNhWFJvSUhOMFlYUmxMM2d2ZVNCd2NtOXdaWEowYVdWelhHNGdJQ0FnZG1GeUlHUmhkR0VnUFNCN1hHNGdJQ0FnSUNCdWIzUmxPaUJ1YjNSbFhHNGdJQ0FnZlR0Y2JpQWdJQ0JwWmlBb2RIbHdaVzltSUc5dUlEMDlQU0FuYjJKcVpXTjBKeWtnZTF4dUlDQWdJQ0FnWkdGMFlTNXpkR0YwWlNBOUlHOXVMbk4wWVhSbE8xeHVJQ0FnSUM4dklDQmtZWFJoTG5nZ1BTQnZiaTU0WEc0Z0lDQWdMeThnSUdSaGRHRXVlU0E5SUc5dUxubGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnWkdGMFlTNXpkR0YwWlNBOUlHOXVPMXh1SUNBZ0lIMWNiaUFnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc1pHRjBZU2s3WEc0Z0lIMWNibHh1SUNBdktpQmtjbUZuS0c1dmRHVXNiMjRwSUh0Y2JpQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzZTF4dUlDQWdJQ0FnYm05MFpUb2dibTkwWlN4Y2JpQWdJQ0FnSUhOMFlYUmxPaUJ2Ymx4dUlDQWdJSDBwTzF4dUlDQjlJQ292WEc1Y2JpQWdjbVZ1WkdWeUtDa2dlMXh1SUNBZ0lDOHZJR3h2YjNBZ2RHaHliM1ZuYUNCaGJtUWdjbVZ1WkdWeUlIUm9aU0JyWlhselAxeHVJQ0I5WEc1Y2JseHVJQ0JoWkdSVWIzVmphRXhwYzNSbGJtVnljeWdwSUh0Y2JseHVJQ0FnSUhSb2FYTXVjSEpsUTJ4cFkyc2dQU0IwYUdsekxuQnlaVTF2ZG1VZ1BTQjBhR2x6TG5CeVpWSmxiR1ZoYzJVZ1BTQW9LU0E5UGlCN2ZUdGNiaUFnSUNCMGFHbHpMbU5zYVdOcklEMGdkR2hwY3k1dGIzWmxJRDBnZEdocGN5NXlaV3hsWVhObElEMGdLQ2tnUFQ0Z2UzMDdYRzRnSUNBZ2RHaHBjeTV3Y21WVWIzVmphQ0E5SUhSb2FYTXVjSEpsVkc5MVkyaE5iM1psSUQwZ2RHaHBjeTV3Y21WVWIzVmphRkpsYkdWaGMyVWdQU0FvS1NBOVBpQjdmVHRjYmlBZ0lDQjBhR2x6TG5SdmRXTm9JRDBnZEdocGN5NTBiM1ZqYUUxdmRtVWdQU0IwYUdsekxuUnZkV05vVW1Wc1pXRnpaU0E5SUNncElEMCtJSHQ5TzF4dVhHNGdJQ0FnZEdocGN5NWpkWEp5Wlc1MFJXeGxiV1Z1ZENBOUlHWmhiSE5sTzF4dVhHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0ozUnZkV05vYzNSaGNuUW5MQ0FvWlNrZ1BUNGdlMXh1SUNBZ0lDQWdZMjl1YzI5c1pTNXNiMmNvSjNSdmRXTm9jM1JoY25RbktUdGNiaUFnSUNBZ0lHeGxkQ0JsYkdWdFpXNTBJRDBnWkc5amRXMWxiblF1Wld4bGJXVnVkRVp5YjIxUWIybHVkQ2hsTG5SaGNtZGxkRlJ2ZFdOb1pYTmJNRjB1WTJ4cFpXNTBXQ3hsTG5SaGNtZGxkRlJ2ZFdOb1pYTmJNRjB1WTJ4cFpXNTBXU2s3WEc0Z0lDQWdJQ0JzWlhRZ2EyVjVJRDBnZEdocGN5NXJaWGx6VzJWc1pXMWxiblF1YVc1a1pYaGRPMXh1SUNBZ0lDQWdkR2hwY3k1d1lXbHVkR0p5ZFhOb0lEMGdJV3RsZVM1emRHRjBaVHRjYmlBZ0lDQWdJR3RsZVM1a2IzZHVLSFJvYVhNdWNHRnBiblJpY25WemFDazdYRzRnSUNBZ0lDQjBhR2x6TG1OMWNuSmxiblJGYkdWdFpXNTBJRDBnWld4bGJXVnVkQzVwYm1SbGVEdGNiaUFnSUNBZ0lHVXVjSEpsZG1WdWRFUmxabUYxYkhRb0tUdGNiaUFnSUNBZ0lHVXVjM1J2Y0ZCeWIzQmhaMkYwYVc5dUtDazdYRzRnSUNBZ2ZTazdYRzVjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWduZEc5MVkyaHRiM1psSnl3Z0tHVXBJRDArSUh0Y2JpQWdJQ0FnSUd4bGRDQmxiR1Z0Wlc1MElEMGdaRzlqZFcxbGJuUXVaV3hsYldWdWRFWnliMjFRYjJsdWRDaGxMblJoY21kbGRGUnZkV05vWlhOYk1GMHVZMnhwWlc1MFdDeGxMblJoY21kbGRGUnZkV05vWlhOYk1GMHVZMnhwWlc1MFdTazdYRzRnSUNBZ0lDQnNaWFFnYTJWNUlEMGdkR2hwY3k1clpYbHpXMlZzWlcxbGJuUXVhVzVrWlhoZE8xeHVJQ0FnSUNBZ2FXWWdLR1ZzWlcxbGJuUXVhVzVrWlhnaFBUMTBhR2x6TG1OMWNuSmxiblJGYkdWdFpXNTBLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaDBhR2x6TG1OMWNuSmxiblJGYkdWdFpXNTBLU0I3WEc0Z0lDQWdJQ0FnSUNBZ2JHVjBJSEJoYzNSTFpYa2dQU0IwYUdsekxtdGxlWE5iZEdocGN5NWpkWEp5Wlc1MFJXeGxiV1Z1ZEYwN1hHNGdJQ0FnSUNBZ0lDQWdjR0Z6ZEV0bGVTNTFjQ2dwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHdGxlUzVrYjNkdUtIUm9hWE11Y0dGcGJuUmljblZ6YUNrN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCclpYa3VZbVZ1WkNncE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2RHaHBjeTVqZFhKeVpXNTBSV3hsYldWdWRDQTlJR1ZzWlcxbGJuUXVhVzVrWlhnN1hHNGdJQ0FnSUNCbExuQnlaWFpsYm5SRVpXWmhkV3gwS0NrN1hHNGdJQ0FnSUNCbExuTjBiM0JRY205d1lXZGhkR2x2YmlncE8xeHVJQ0FnSUgwcE8xeHVYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbUZrWkVWMlpXNTBUR2x6ZEdWdVpYSW9KM1J2ZFdOb1pXNWtKeXdnS0dVcElEMCtJSHRjYmlBZ0lDQWdJQzh2SUc1dklIUnZkV05vWlhNZ2RHOGdZMkZzWTNWc1lYUmxJR0psWTJGMWMyVWdibTl1WlNCeVpXMWhhVzVwYm1kY2JpQWdJQ0FnSUd4bGRDQnJaWGtnUFNCMGFHbHpMbXRsZVhOYmRHaHBjeTVqZFhKeVpXNTBSV3hsYldWdWRGMDdYRzRnSUNBZ0lDQnJaWGt1ZFhBb0tUdGNiaUFnSUNBZ0lIUm9hWE11YVc1MFpYSmhZM1JwYm1jZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUhSb2FYTXVZM1Z5Y21WdWRFVnNaVzFsYm5RZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUdVdWNISmxkbVZ1ZEVSbFptRjFiSFFvS1R0Y2JpQWdJQ0FnSUdVdWMzUnZjRkJ5YjNCaFoyRjBhVzl1S0NrN1hHNGdJQ0FnZlNrN1hHNWNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQkVaV1pwYm1VZ2RHaGxJSEJwZEdOb0lISmhibWRsSUNoc2IzZGxjM1FnWVc1a0lHaHBaMmhsYzNRZ2JtOTBaU2tnYjJZZ2RHaGxJSEJwWVc1dklHdGxlV0p2WVhKa0xseHVJQ0JBY0dGeVlXMGdiRzkzSUh0dWRXMWlaWEo5SUUxSlJFa2dibTkwWlNCMllXeDFaU0J2WmlCMGFHVWdiRzkzWlhOMElHNXZkR1VnYjI0Z2RHaGxJR3RsZVdKdllYSmtYRzRnSUVCd1lYSmhiU0JvYVdkb0lIdHVkVzFpWlhKOUlFMUpSRWtnYm05MFpTQjJZV3gxWlNCdlppQjBhR1VnYUdsbmFHVnpkQ0J1YjNSbElHOXVJSFJvWlNCclpYbGliMkZ5WkZ4dUlDQXFMMXh1SUNCelpYUlNZVzVuWlNoc2IzY3NhR2xuYUNrZ2UxeHVJQ0FnSUhSb2FYTXVjbUZ1WjJVdWJHOTNJRDBnYkc5M08xeHVJQ0FnSUhSb2FYTXVjbUZ1WjJVdWFHbG5hQ0E5SUdocFoyZzdYRzRnSUNBZ2RHaHBjeTVsYlhCMGVTZ3BPMXh1SUNBZ0lIUm9hWE11WW5WcGJHUkpiblJsY21aaFkyVW9LVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0JVZFhKdUlHRWdhMlY1SUc5dUlHOXlJRzltWmlCMWMybHVaeUJwZEhNZ1RVbEVTU0J1YjNSbElIWmhiSFZsTzF4dUlDQkFjR0Z5WVcwZ2JtOTBaU0I3Ym5WdFltVnlmU0JOU1VSSklHNXZkR1VnZG1Gc2RXVWdiMllnZEdobElHdGxlU0IwYnlCamFHRnVaMlZjYmlBZ1FIQmhjbUZ0SUc5dUlIdGliMjlzWldGdWZTQlhhR1YwYUdWeUlIUm9aU0J1YjNSbElITm9iM1ZzWkNCMGRYSnVJRzl1SUc5eUlHOW1abHh1SUNBcUwxeHVJQ0IwYjJkbmJHVkxaWGtvYm05MFpTd2diMjRwSUh0Y2JpQWdJQ0IwYUdsekxtdGxlWE5iYm05MFpTMTBhR2x6TG5KaGJtZGxMbXh2ZDEwdVpteHBjQ2h2YmlrN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ1ZIVnliaUJoSUd0bGVTQnZiaUJ2Y2lCdlptWWdkWE5wYm1jZ2FYUnpJR3RsZVNCcGJtUmxlQ0J2YmlCMGFHVWdjR2xoYm04Z2FXNTBaWEptWVdObExseHVJQ0JBY0dGeVlXMGdhVzVrWlhnZ2UyNTFiV0psY24wZ1NXNWtaWGdnYjJZZ2RHaGxJR3RsZVNCMGJ5QmphR0Z1WjJWY2JpQWdRSEJoY21GdElHOXVJSHRpYjI5c1pXRnVmU0JYYUdWMGFHVnlJSFJvWlNCdWIzUmxJSE5vYjNWc1pDQjBkWEp1SUc5dUlHOXlJRzltWmx4dUlDQXFMMXh1SUNCMGIyZG5iR1ZKYm1SbGVDaHBibVJsZUN3Z2IyNHBJSHRjYmlBZ0lDQjBhR2x6TG10bGVYTmJhVzVrWlhoZExtWnNhWEFvYjI0cE8xeHVJQ0I5WEc1Y2JuMWNibHh1WEc1Y2JpOHZJRmRGUWxCQlEwc2dSazlQVkVWU0lDOHZYRzR2THlBdUwzNHZhbk5vYVc1MExXeHZZV1JsY2lFdUwyeHBZaTlwYm5SbGNtWmhZMlZ6TDNCcFlXNXZMbXB6SWl3aUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc1c1pYUWdjM1puSUQwZ2NtVnhkV2x5WlNnbkxpNHZkWFJwYkM5emRtY25LVHRjYm14bGRDQmtiMjBnUFNCeVpYRjFhWEpsS0NjdUxpOTFkR2xzTDJSdmJTY3BPMXh1YkdWMElFbHVkR1Z5Wm1GalpTQTlJSEpsY1hWcGNtVW9KeTR1TDJOdmNtVXZhVzUwWlhKbVlXTmxKeWs3WEc1c1pYUWdRblYwZEc5dVZHVnRjR3hoZEdVZ1BTQnlaWEYxYVhKbEtDY3VMaTlqYjIxd2IyNWxiblJ6TDJKMWRIUnZiblJsYlhCc1lYUmxKeWs3WEc1c1pYUWdUV0YwY21sNFRXOWtaV3dnUFNCeVpYRjFhWEpsS0NjdUxpOXRiMlJsYkhNdmJXRjBjbWw0SnlrN1hHNXNaWFFnUTI5MWJuUmxjazF2WkdWc0lEMGdjbVZ4ZFdseVpTZ25MaTR2Ylc5a1pXeHpMMk52ZFc1MFpYSW5LVHRjYm14bGRDQjBiM1ZqYUNBOUlISmxjWFZwY21Vb0p5NHVMM1YwYVd3dmRHOTFZMmduS1R0Y2JseHVYRzVjYm1Oc1lYTnpJRTFoZEhKcGVFTmxiR3dnWlhoMFpXNWtjeUJDZFhSMGIyNVVaVzF3YkdGMFpTQjdYRzVjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9LU0I3WEc1Y2JpQWdJQ0JzWlhRZ2IzQjBhVzl1Y3lBOUlGc25kbUZzZFdVbkxGMDdYRzVjYmlBZ0lDQnNaWFFnWkdWbVlYVnNkSE1nUFNCN1hHNGdJQ0FnSUNBbmMybDZaU2M2SUZzNE1DdzRNRjBzWEc0Z0lDQWdJQ0FuZEdGeVoyVjBKem9nWm1Gc2MyVXNYRzRnSUNBZ0lDQW5iVzlrWlNjNklDZDBiMmRuYkdVbkxGeHVJQ0FnSUNBZ0ozWmhiSFZsSnpvZ01GeHVJQ0FnSUgwN1hHNWNiaUFnSUNCemRYQmxjaWhoY21kMWJXVnVkSE1zYjNCMGFXOXVjeXhrWldaaGRXeDBjeWs3WEc1Y2JpQWdJQ0IwYUdsekxtbHVaR1Y0SUQwZ2RHaHBjeTV6WlhSMGFXNW5jeTVwYm1SbGVEdGNiaUFnSUNCMGFHbHpMbkp2ZHlBOUlIUm9hWE11YzJWMGRHbHVaM011Y205M08xeHVJQ0FnSUhSb2FYTXVZMjlzZFcxdUlEMGdkR2hwY3k1elpYUjBhVzVuY3k1amIyeDFiVzQ3WEc1Y2JpQWdJQ0IwYUdsekxtMWhkSEpwZUNBOUlIUm9hWE11YzJWMGRHbHVaM011YldGMGNtbDRPMXh1WEc0Z0lDQWdkR2hwY3k1cGJuUmxjbUZqZEdsdVp5QTlJR1poYkhObE8xeHVJQ0FnSUhSb2FYTXVjR0ZwYm5SaWNuVnphQ0E5SUdaaGJITmxPMXh1WEc0Z0lDQWdkR2hwY3k1cGJtbDBLQ2s3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JseHVJQ0I5WEc1Y2JpQWdZblZwYkdSR2NtRnRaU2dwSUh0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RZ1BTQnpkbWN1WTNKbFlYUmxLQ2R6ZG1jbktUdGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVjMlYwUVhSMGNtbGlkWFJsS0NkM2FXUjBhQ2NzZEdocGN5NTNhV1IwYUNrN1hHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExuTmxkRUYwZEhKcFluVjBaU2duYUdWcFoyaDBKeXgwYUdsekxtaGxhV2RvZENrN1hHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExuTjBlV3hsTG5SdmNDQTlJQ2N3Y0hnbk8xeHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNXpkSGxzWlM1c1pXWjBJRDBnSnpCd2VDYzdYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk4wZVd4bExuQnZjMmwwYVc5dUlEMGdKMkZpYzI5c2RYUmxKenRjYmlBZ0lDQjBhR2x6TG5CaGNtVnVkQzVoY0hCbGJtUkRhR2xzWkNoMGFHbHpMbVZzWlcxbGJuUXBPMXh1SUNCOVhHNWNiaUFnWW5WcGJHUkpiblJsY21aaFkyVW9LU0I3WEc1Y2JpQWdJQ0IwYUdsekxuQmhaQ0E5SUhOMlp5NWpjbVZoZEdVb0ozSmxZM1FuS1R0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdVlYQndaVzVrUTJocGJHUW9kR2hwY3k1d1lXUXBPMXh1WEc0Z0lDQWdkR2hwY3k1cGJuUmxjbUZqZEdsdmJsUmhjbWRsZENBOUlIUm9hWE11Y0dGa08xeHVYRzRnSUNBZ0x5b2daWFpsYm5SeklDb3ZYRzVjYmlBZ0lDQnBaaUFvSVhSdmRXTm9MbVY0YVhOMGN5a2dlMXh1WEc0Z0lDQWdJQ0IwYUdsekxtTnNhV05ySUQwZ0tDa2dQVDRnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbTFoZEhKcGVDNXBiblJsY21GamRHbHVaeUE5SUhSeWRXVTdYRzRnSUNBZ0lDQWdJSFJvYVhNdWJXRjBjbWw0TG5CaGFXNTBZbkoxYzJnZ1BTQWhkR2hwY3k1emRHRjBaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWtiM2R1S0hSb2FYTXViV0YwY21sNExuQmhhVzUwWW5KMWMyZ3BPMXh1SUNBZ0lDQWdmVHRjYmlBZ0lDQWdJSFJvYVhNdWNHRmtMbUZrWkVWMlpXNTBUR2x6ZEdWdVpYSW9KMjF2ZFhObGIzWmxjaWNzSUNncElEMCtJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YldGMGNtbDRMbWx1ZEdWeVlXTjBhVzVuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdkR2hwY3k1a2IzZHVLSFJvYVhNdWJXRjBjbWw0TG5CaGFXNTBZbkoxYzJncE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlLVHRjYmx4dVhHNGdJQ0FnSUNCMGFHbHpMbTF2ZG1VZ1BTQW9LU0E5UGlCN1hHNGdJQ0FnSUNCOU8xeHVJQ0FnSUNBZ2RHaHBjeTV3WVdRdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnbmJXOTFjMlZ0YjNabEp5d2dLR1VwSUQwK0lIdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXViV0YwY21sNExtbHVkR1Z5WVdOMGFXNW5LU0I3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLQ0YwYUdsekxtOW1abk5sZENrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXZabVp6WlhRZ1BTQmtiMjB1Wm1sdVpGQnZjMmwwYVc5dUtIUm9hWE11Wld4bGJXVnVkQ2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdWJXOTFjMlVnUFNCa2IyMHViRzlqWVhSbFRXOTFjMlVvWlN4MGFHbHpMbTltWm5ObGRDazdYRzRnSUNBZ0lDQWdJQ0FnZEdocGN5NWlaVzVrS0NrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMHBPMXh1WEc1Y2JpQWdJQ0FnSUhSb2FYTXVjbVZzWldGelpTQTlJQ2dwSUQwK0lIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1dFlYUnlhWGd1YVc1MFpYSmhZM1JwYm1jZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUgwN1hHNGdJQ0FnSUNCMGFHbHpMbkJoWkM1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5S0NkdGIzVnpaWFZ3Snl3Z0tDa2dQVDRnZTF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1dFlYUnlhWGd1YVc1MFpYSmhZM1JwYm1jcElIdGNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxuVndLQ2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ2RHaHBjeTV3WVdRdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnbmJXOTFjMlZ2ZFhRbkxDQW9LU0E5UGlCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxtMWhkSEpwZUM1cGJuUmxjbUZqZEdsdVp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVkWEFvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZWeHVYRzRnSUgxY2JseHVJQ0J6YVhwbFNXNTBaWEptWVdObEtDa2dlMXh1WEc0Z0lDQWdkR2hwY3k1d1lXUXVjMlYwUVhSMGNtbGlkWFJsS0NkNEp5d3hLVHRjYmlBZ0lDQjBhR2x6TG5CaFpDNXpaWFJCZEhSeWFXSjFkR1VvSjNrbkxERXBPMXh1SUNBZ0lHbG1JQ2gwYUdsekxuZHBaSFJvSUQ0Z01pa2dlMXh1SUNBZ0lDQWdkR2hwY3k1d1lXUXVjMlYwUVhSMGNtbGlkWFJsS0NkM2FXUjBhQ2NzSUhSb2FYTXVkMmxrZEdnZ0xTQXlLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV3WVdRdWMyVjBRWFIwY21saWRYUmxLQ2QzYVdSMGFDY3NJSFJvYVhNdWQybGtkR2dwTzF4dUlDQWdJSDFjYmlBZ0lDQnBaaUFvZEdocGN5NW9aV2xuYUhRZ1BpQXlLU0I3WEc0Z0lDQWdJQ0IwYUdsekxuQmhaQzV6WlhSQmRIUnlhV0oxZEdVb0oyaGxhV2RvZENjc0lIUm9hWE11YUdWcFoyaDBJQzBnTWlrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJSFJvYVhNdWNHRmtMbk5sZEVGMGRISnBZblYwWlNnbmFHVnBaMmgwSnl3Z2RHaHBjeTVvWldsbmFIUXBPMXh1SUNBZ0lIMWNiaUFnSUNBdkwzUm9hWE11Y0dGa0xuTmxkRUYwZEhKcFluVjBaU2duYUdWcFoyaDBKeXdnZEdocGN5NW9aV2xuYUhRZ0xTQXlLVHRjYmlBZ0lDQjBhR2x6TG5CaFpDNXpaWFJCZEhSeWFXSjFkR1VvSjJacGJHd25MQ0IwYUdsekxtMWhkSEpwZUM1amIyeHZjbk11Wm1sc2JDazdYRzVjYmlBZ2ZWeHVYRzRnSUhKbGJtUmxjaWdwSUh0Y2JpQWdJQ0JwWmlBb0lYUm9hWE11YzNSaGRHVXBJSHRjYmlBZ0lDQWdJSFJvYVhNdWNHRmtMbk5sZEVGMGRISnBZblYwWlNnblptbHNiQ2NzSUhSb2FYTXViV0YwY21sNExtTnZiRzl5Y3k1bWFXeHNLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV3WVdRdWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5d2dkR2hwY3k1dFlYUnlhWGd1WTI5c2IzSnpMbUZqWTJWdWRDazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JuMWNibHh1THlvcVhHNHFJRk5sY1hWbGJtTmxjbHh1S2x4dUtpQkFaR1Z6WTNKcGNIUnBiMjRnUjNKcFpDQnZaaUJpZFhSMGIyNXpJSGRwZEdnZ1luVnBiSFF0YVc0Z2MzUmxjQ0J6WlhGMVpXNWpaWEl1WEc0cVhHNHFJRUJrWlcxdklEeGthWFlnYm1WNGRYTXRkV2s5WENKelpYRjFaVzVqWlhKY0lpQnpkSGxzWlQxY0luZHBaSFJvT2pRd01IQjRPMmhsYVdkb2REb3lNREJ3ZUR0Y0lqNDhMMlJwZGo1Y2JpcGNiaW9nUUdWNFlXMXdiR1ZjYmlvZ2RtRnlJSE5sY1hWbGJtTmxjaUE5SUc1bGR5Qk9aWGgxY3k1VFpYRjFaVzVqWlhJb0p5TjBZWEpuWlhRbktWeHVLbHh1S2lCQVpYaGhiWEJzWlZ4dUtpQjJZWElnYzJWeGRXVnVZMlZ5SUQwZ2JtVjNJRTVsZUhWekxsTmxjWFZsYm1ObGNpZ25JM1JoY21kbGRDY3NlMXh1S2lBZ0ozTnBlbVVuT2lCYk5EQXdMREl3TUYwc1hHNHFJQ0FuYlc5a1pTYzZJQ2QwYjJkbmJHVW5MRnh1S2lBZ0ozSnZkM01uT2lBMUxGeHVLaUFnSjJOdmJIVnRibk1uT2lBeE1GeHVLbjBwWEc0cVhHNHFJRUJ2ZFhSd2RYUmNiaW9nWTJoaGJtZGxYRzRxSUVacGNtVnpJR0Z1ZVNCMGFXMWxJSFJvWlNCcGJuUmxjbVpoWTJVbmN5QnRZWFJ5YVhnZ1kyaGhibWRsY3k0Z1BHSnlQbHh1S2lCVWFHVWdaWFpsYm5RZ1pHRjBZU0JwY3lCaGJpQnZZbXBsWTNRZ1kyOXVkR0ZwYm1sdVp5QThhVDV5YjNjOEwyaytJQ2h1ZFcxaVpYSXBMQ0E4YVQ1amIyeDFiVzQ4TDJrK0lDaHVkVzFpWlhJcExDQmhibVFnUEdrK2MzUmhkR1U4TDJrK0lDaGliMjlzWldGdUtTQndjbTl3WlhKMGFXVnpMbHh1S2x4dUtpQkFiM1YwY0hWMFpYaGhiWEJzWlZ4dUtpQnpaWEYxWlc1alpYSXViMjRvSjJOb1lXNW5aU2NzWm5WdVkzUnBiMjRvZGlrZ2UxeHVLaUFnSUdOdmJuTnZiR1V1Ykc5bktIWXBPMXh1S2lCOUtWeHVLbHh1S2lCQWIzVjBjSFYwWEc0cUlITjBaWEJjYmlvZ1JtbHlaWE1nWVc1NUlIUnBiV1VnZEdobElITmxjWFZsYm1ObGNpQnpkR1Z3Y3lCMGJ5QjBhR1VnYm1WNGRDQmpiMngxYlc0c0lHbHVJSE5sY1hWbFkyVWdiVzlrWlM0Z1BHSnlQbHh1S2lCVWFHVWdaWFpsYm5RZ1pHRjBZU0JwY3lCaGJpQThhVDVoY25KaGVUd3ZhVDRnWTI5dWRHRnBibWx1WnlCaGJHd2dkbUZzZFdWeklHbHVJSFJvWlNCamIyeDFiVzRzSUR4cFBtSnZkSFJ2YlNCeWIzY2dabWx5YzNROEwyaytMbHh1S2x4dUtpQkFiM1YwY0hWMFpYaGhiWEJzWlZ4dUtpQnpaWEYxWlc1alpYSXViMjRvSjNOMFpYQW5MR1oxYm1OMGFXOXVLSFlwSUh0Y2Jpb2dJQ0JqYjI1emIyeGxMbXh2WnloMktUdGNiaW9nZlNsY2Jpb3ZYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR05zWVhOeklGTmxjWFZsYm1ObGNpQmxlSFJsYm1SeklFbHVkR1Z5Wm1GalpTQjdYRzVjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9LU0I3WEc1Y2JpQWdJQ0JzWlhRZ2IzQjBhVzl1Y3lBOUlGc25kbUZzZFdVblhUdGNibHh1SUNBZ0lHeGxkQ0JrWldaaGRXeDBjeUE5SUh0Y2JpQWdJQ0FnSUNkemFYcGxKem9nV3pRd01Dd3lNREJkTEZ4dUlDQWdJQ0FnSjIxdlpHVW5PaUFuZEc5bloyeGxKeXhjYmlBZ0lDQWdJQ2R5YjNkekp6b2dOU3hjYmlBZ0lDQWdJQ2RqYjJ4MWJXNXpKem9nTVRCY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnYzNWd1pYSW9ZWEpuZFcxbGJuUnpMRzl3ZEdsdmJuTXNaR1ZtWVhWc2RITXBPMXh1WEc0Z0lDQWdkR2hwY3k1aFkzUnBkbVVnUFNBdE1UdGNibHh1SUNBZ0lDOHFLbHh1SUNBZ0lDb2dRblYwZEc5dUlHbHVkR1Z5WVdOMGFXOXVJRzF2WkdVNklITmxaU0JDZFhSMGIyNWNiaUFnSUNBcUlFQjBlWEJsSUh0emRISnBibWQ5WEc0Z0lDQWdLaUJBWlhoaGJYQnNaU0JpZFhSMGIyNHViVzlrWlNBOUlDZDBiMmRuYkdVbk8xeHVJQ0FnSUNvdlhHNGdJQ0FnZEdocGN5NXRiMlJsSUQwZ2RHaHBjeTV6WlhSMGFXNW5jeTV0YjJSbE8xeHVYRzRnSUNBZ0x5b3FYRzRnSUNBZ0tpQlVhR1VnYVc1MFpYSjJZV3dnYjJKcVpXTjBJSGRvYVdOb0lHTnZiblJ5YjJ4eklIUnBiV2x1WnlCaGJtUWdjMlZ4ZFdWdVkyVWdjMk5vWldSMWJHbHVaeTVjYmlBZ0lDQXFJRUIwZVhCbElIdHBiblJsY25aaGJIMWNiaUFnSUNBcUwxeHVJQ0FnSUhSb2FYTXVhVzUwWlhKMllXd2dQU0J1WlhjZ1RtVjRkWE11U1c1MFpYSjJZV3dvTWpBd0xHWjFibU4wYVc5dUtDa2dlMzBzWm1Gc2MyVXBPeUF2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2JseHVJQ0FnSUM4cUtseHVJQ0FnSUNvZ1FTQk5ZWFJ5YVhnZ2JXOWtaV3dnWTI5dWRHRnBibWx1WnlCdFpYUm9iMlJ6SUdadmNpQnRZVzVwY0hWc1lYUnBibWNnZEdobElITmxjWFZsYm1ObGNpZHpJR0Z5Y21GNUlHOW1JSFpoYkhWbGN5NGdWRzhnYkdWaGNtNGdhRzkzSUhSdklHMWhibWx3ZFd4aGRHVWdkR2hsSUcxaGRISnBlQ3dnY21WaFpDQmhZbTkxZENCMGFHVWdiV0YwY21sNElHMXZaR1ZzTGx4dUlDQWdJQ29nUUhSNWNHVWdlMjFoZEhKcGVIMWNiaUFnSUNBcUwxeHVJQ0FnSUhSb2FYTXViV0YwY21sNElEMGdibVYzSUUxaGRISnBlRTF2WkdWc0tIUm9hWE11YzJWMGRHbHVaM011Y205M2N5eDBhR2x6TG5ObGRIUnBibWR6TG1OdmJIVnRibk1wTzF4dUlDQWdJSFJvYVhNdWJXRjBjbWw0TG5WcElEMGdkR2hwY3p0Y2JseHVJQ0FnSUM4cUtseHVJQ0FnSUNvZ1FTQkRiM1Z1ZEdWeUlHMXZaR1ZzSUhkb2FXTm9JSFJvWlNCelpYRjFaVzVqWlhJZ2MzUmxjSE1nZEdoeWIzVm5hQzRnUm05eUlHVjRZVzF3YkdVc0lIbHZkU0JqYjNWc1pDQjFjMlVnZEdocGN5QnRiMlJsYkNCMGJ5QnpkR1Z3SUhSb2NtOTFaMmdnZEdobElITmxjWFZsYm1ObGNpQnBiaUJ5WlhabGNuTmxMQ0J5WVc1a2IyMXNlU3dnYjNJZ2FXNGdZU0JrY25WdWF5QjNZV3hyTGx4dUlDQWdJQ29nUUhSNWNHVWdlMk52ZFc1MFpYSjlYRzRnSUNBZ0tpOWNiaUFnSUNCMGFHbHpMbk4wWlhCd1pYSWdQU0J1WlhjZ1EyOTFiblJsY2sxdlpHVnNLREFzZEdocGN5NWpiMngxYlc1ektUdGNibHh1SUNBZ0lIUm9hWE11YVc1cGRDZ3BPMXh1WEc0Z0lIMWNibHh1SUNCaWRXbHNaRVp5WVcxbEtDa2dlMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQ0E5SUdSdlkzVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUW9KMlJwZGljcE8xeHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNXpkSGxzWlM1d2IzTnBkR2x2YmlBOUlDZHlaV3hoZEdsMlpTYzdYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk4wZVd4bExtUnBjM0JzWVhrZ1BTQW5ZbXh2WTJzbk8xeHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNXpkSGxzWlM1M2FXUjBhQ0E5SUNjeE1EQWxKenRjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1YzNSNWJHVXVhR1ZwWjJoMElEMGdKekV3TUNVbk8xeHVJQ0FnSUhSb2FYTXVjR0Z5Wlc1MExtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdVpXeGxiV1Z1ZENrN1hHNGdJQ0FnYVdZZ0tIUnZkV05vTG1WNGFYTjBjeWtnZTF4dUlDQWdJQ0FnZEdocGN5NWhaR1JVYjNWamFFeHBjM1JsYm1WeWN5Z3BPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJR0oxYVd4a1NXNTBaWEptWVdObEtDa2dlMXh1WEc0Z0lDQWdkR2hwY3k1alpXeHNjeUE5SUZ0ZE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrOU1EdHBQSFJvYVhNdWJXRjBjbWw0TG14bGJtZDBhRHRwS3lzcElIdGNibHh1SUNBZ0lDQWdiR1YwSUd4dlkyRjBhVzl1SUQwZ2RHaHBjeTV0WVhSeWFYZ3ViRzlqWVhSbEtHa3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdjbVYwZFhKdWN5QjdjbTkzTEdOdmJIMWNibHh1SUNBZ0lDQWdiR1YwSUdOdmJuUmhhVzVsY2lBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblFvSjNOd1lXNG5LVHRjYmlBZ0lDQWdJR052Ym5SaGFXNWxjaTV6ZEhsc1pTNXdiM05wZEdsdmJpQTlJQ2RoWW5OdmJIVjBaU2M3WEc1Y2JseHVJQ0FnSUNBZ2JHVjBJR05sYkd3Z1BTQnVaWGNnVFdGMGNtbDRRMlZzYkNoamIyNTBZV2x1WlhJc0lIdGNiaUFnSUNBZ0lDQWdJQ0JqYjIxd2IyNWxiblE2SUhSeWRXVXNYRzRnSUNBZ0lDQWdJQ0FnYVc1a1pYZzZJR2tzWEc0Z0lDQWdJQ0FnSUNBZ2NtOTNPaUJzYjJOaGRHbHZiaTV5YjNjc1hHNGdJQ0FnSUNBZ0lDQWdZMjlzZFcxdU9pQnNiMk5oZEdsdmJpNWpiMngxYlc0c1hHNGdJQ0FnSUNBZ0lDQWdiVzlrWlRvZ2RHaHBjeTV0YjJSbExGeHVJQ0FnSUNBZ0lDQWdJRzFoZEhKcGVEb2dkR2hwYzF4dUlDQWdJQ0FnSUNCOUxDQjBhR2x6TG10bGVVTm9ZVzVuWlM1aWFXNWtLSFJvYVhNc2FTa3BPMXh1WEc0Z0lDQWdMeThnSUdObGJHd3ViV0YwY21sNElEMGdkR2hwY3p0Y2JpQWdJQ0FnSUdsbUlDaDBiM1ZqYUM1bGVHbHpkSE1wSUh0Y2JpQWdJQ0FnSUNBZ1kyVnNiQzV3WVdRdWFXNWtaWGdnUFNCcE8xeHVJQ0FnSUNBZ0lDQmpaV3hzTG5CeVpVTnNhV05ySUQwZ1kyVnNiQzV3Y21WTmIzWmxJRDBnWTJWc2JDNXdjbVZTWld4bFlYTmxJRDBnS0NrZ1BUNGdlMzA3WEc0Z0lDQWdJQ0FnSUdObGJHd3VZMnhwWTJzZ1BTQmpaV3hzTG0xdmRtVWdQU0JqWld4c0xuSmxiR1ZoYzJVZ1BTQW9LU0E5UGlCN2ZUdGNiaUFnSUNBZ0lDQWdZMlZzYkM1d2NtVlViM1ZqYUNBOUlHTmxiR3d1Y0hKbFZHOTFZMmhOYjNabElEMGdZMlZzYkM1d2NtVlViM1ZqYUZKbGJHVmhjMlVnUFNBb0tTQTlQaUI3ZlR0Y2JpQWdJQ0FnSUNBZ1kyVnNiQzUwYjNWamFDQTlJR05sYkd3dWRHOTFZMmhOYjNabElEMGdZMlZzYkM1MGIzVmphRkpsYkdWaGMyVWdQU0FvS1NBOVBpQjdmVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnZEdocGN5NWpaV3hzY3k1d2RYTm9LR05sYkd3cE8xeHVJQ0FnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbUZ3Y0dWdVpFTm9hV3hrS0dOdmJuUmhhVzVsY2lrN1hHNWNiaUFnSUNCOVhHNGdJQ0FnZEdocGN5NXphWHBsU1c1MFpYSm1ZV05sS0NrN1hHNGdJSDFjYmx4dUlDQnphWHBsU1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzRnSUNBZ2JHVjBJR05sYkd4WGFXUjBhQ0E5SUhSb2FYTXVkMmxrZEdnZ0x5QjBhR2x6TG1OdmJIVnRibk03WEc0Z0lDQWdiR1YwSUdObGJHeElaV2xuYUhRZ1BTQjBhR2x6TG1obGFXZG9kQ0F2SUhSb2FYTXVjbTkzY3p0Y2JseHVJQ0FnSUdadmNpQW9iR1YwSUdrOU1Ec2dhVHgwYUdsekxtTmxiR3h6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQnNaWFFnWTI5dWRHRnBibVZ5SUQwZ2RHaHBjeTVqWld4c2MxdHBYUzV3WVhKbGJuUTdYRzRnSUNBZ0lDQmpiMjUwWVdsdVpYSXVjM1I1YkdVdWJHVm1kQ0E5SUhSb2FYTXVZMlZzYkhOYmFWMHVZMjlzZFcxdUlDb2dZMlZzYkZkcFpIUm9JQ3NnSjNCNEp6dGNiaUFnSUNBZ0lHTnZiblJoYVc1bGNpNXpkSGxzWlM1MGIzQWdQU0IwYUdsekxtTmxiR3h6VzJsZExuSnZkeUFxSUdObGJHeElaV2xuYUhRZ0t5QW5jSGduTzF4dUlDQWdJQ0FnZEdocGN5NWpaV3hzYzF0cFhTNXlaWE5wZW1Vb1kyVnNiRmRwWkhSb0xHTmxiR3hJWldsbmFIUXBPMXh1SUNBZ0lIMWNibHh1WEc0Z0lIMWNibHh1SUNCamIyeHZja2x1ZEdWeVptRmpaU2dwSUh0Y2JpQWdJQ0JtYjNJZ0tIWmhjaUJwUFRBN0lHazhkR2hwY3k1alpXeHNjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVqWld4c2MxdHBYUzV5Wlc1a1pYSW9LVHRjYmlBZ0lDQjlYRzRnSUgxY2JseHVJQ0IxY0dSaGRHVW9LU0I3WEc0Z0lDOHZJQ0JqYjI1emIyeGxMbXh2WnloY0luVndaR0YwYVc1bkxpNHVYQ0lwWEc0Z0lDQWdMeTl2YmlBOUlHOXVJSHg4SUdaaGJITmxPMXh1SUNBZ0lIUm9hWE11YldGMGNtbDRMbWwwWlhKaGRHVW9LSElzWXl4cEtTQTlQaUI3WEc0Z0lDQWdJQ0F2THlBZ1kyOXVjMjlzWlM1c2IyY29kR2hwY3k1dFlYUnlhWGd1Y0dGMGRHVnlibHR5WFZ0alhTd2dkR2hwY3k1alpXeHNjMXRwWFM1emRHRjBaU2s3WEc0Z0lDQWdJQ0JwWmlBb2RHaHBjeTV0WVhSeWFYZ3VjR0YwZEdWeWJsdHlYVnRqWFNBaFBUMGdkR2hwY3k1alpXeHNjMXRwWFM1emRHRjBaU2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1dFlYUnlhWGd1Y0dGMGRHVnlibHR5WFZ0alhTQStJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG1ObGJHeHpXMmxkTG5SMWNtNVBiaWdwTzF4dUlDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lIUm9hWE11WTJWc2JITmJhVjB1ZEhWeWJrOW1aaWdwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNrN1hHNGdJSDFjYmx4dUx5OGdkWEJrWVhSbElEMCtJR05sYkd3dWRIVnliazl1SUQwK0lHTmxiR3d1WlcxcGRDQTlQaUJyWlhsRGFHRnVaMlVnS0hObGNTNWxiV2wwS1NBOVBpQnRZWFJ5YVhndWMyVjBMbU5sYkd3Z1BUNGdkWEJrWVhSbFhHNHZMMXh1THk4Z2FXNTBaWEpoWTNScGIyNGdQVDRnYTJWNVEyaGhibWRsSUQwK0lHMWhkSEpwZUM1elpYUXVZMlZzYkNBOVBpQjFjR1JoZEdVZ1BUNGdZMlZzYkM1MGRYSnVUMjVjYmk4dklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1BUNGdaVzFwZEZ4dUx5OWNiaTh2SUhObGRDNWpaV3hzSUQwK0lIVndaR0YwWlNBOVBpQnVaV1ZrY3lCMGJ5QmxiV2wwTGx4dVhHNGdJR3RsZVVOb1lXNW5aU2h1YjNSbExHOXVLU0I3WEc0Z0lDQWdMeThnWlcxcGRDQmtZWFJoSUdadmNpQmhibmtnYTJWNUlIUjFjbTVwYm1jZ2IyNHZiMlptWEc0Z0lDQWdMeThnYVNCcGN5QjBhR1VnYm05MFpTQnBibVJsZUZ4dUlDQWdJQzh2SUhZZ2FYTWdkMmhsZEdobGNpQnBkQ0JwY3lCdmJpQnZjaUJ2Wm1aY2JpQWdJQ0JzWlhRZ1kyVnNiQ0E5SUhSb2FYTXViV0YwY21sNExteHZZMkYwWlNodWIzUmxLVHRjYmlBZ0x5OGdJSFJvYVhNdWJXRjBjbWw0TG5ObGRDNWpaV3hzS0dObGJHd3VZMjlzZFcxdUxHTmxiR3d1Y205M0xHOXVLVHRjYmlBZ0lDQjBhR2x6TG0xaGRISnBlQzV3WVhSMFpYSnVXMk5sYkd3dWNtOTNYVnRqWld4c0xtTnZiSFZ0YmwwZ1BTQnZianRjYmlBZ0lDQjJZWElnWkdGMFlTQTlJSHRjYmlBZ0lDQWdJSEp2ZHpvZ1kyVnNiQzV5YjNjc1hHNGdJQ0FnSUNCamIyeDFiVzQ2SUdObGJHd3VZMjlzZFcxdUxGeHVJQ0FnSUNBZ2MzUmhkR1U2SUc5dVhHNGdJQ0FnZlR0Y2JpQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzWkdGMFlTazdYRzRnSUgxY2JseHVJQ0J5Wlc1a1pYSW9LU0I3WEc0Z0lDQWdhV1lnS0hSb2FYTXVjM1JsY0hCbGNpNTJZV3gxWlNBK1BTQXdLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtMWhkSEpwZUM1cGRHVnlZWFJsS0NoeUxHTXNhU2tnUFQ0Z2UxeHVJQ0FnSUNBZ0lDQnBaaUFvWXowOVBYUm9hWE11YzNSbGNIQmxjaTUyWVd4MVpTa2dlMXh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVZMlZzYkhOYmFWMHVjR0ZrTG5ObGRFRjBkSEpwWW5WMFpTZ25jM1J5YjJ0bEp5eDBhR2x6TG1OdmJHOXljeTV0WldScGRXMU1hV2RvZENrN1hHNGdJQ0FnSUNBZ0lDQWdkR2hwY3k1alpXeHNjMXRwWFM1d1lXUXVjMlYwUVhSMGNtbGlkWFJsS0NkemRISnZhMlV0ZDJsa2RHZ25MQ2N4SnlrN1hHNGdJQ0FnSUNBZ0lDQWdkR2hwY3k1alpXeHNjMXRwWFM1d1lXUXVjMlYwUVhSMGNtbGlkWFJsS0NkemRISnZhMlV0YjNCaFkybDBlU2NzSnpFbktUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxtTmxiR3h6VzJsZExuQmhaQzV6WlhSQmRIUnlhV0oxZEdVb0ozTjBjbTlyWlNjc0oyNXZibVVuS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZTazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lDQXFJRk4wWVhKMElITmxjWFZsYm1OcGJtZGNiaUFnSUNvZ1FIQmhjbUZ0SUNCN2JuVnRZbVZ5ZlNCdGN5QkNaV0YwSUhSbGJYQnZJR2x1SUcxcGJHeHBjMlZqYjI1a2MxeHVJQ0FnS2k5Y2JpQWdjM1JoY25Rb2JYTXBJSHRjYmlBZ0lDQjBhR2x6TG1sdWRHVnlkbUZzTG1WMlpXNTBJRDBnZEdocGN5NXVaWGgwTG1KcGJtUW9kR2hwY3lrN1hHNGdJQ0FnYVdZZ0tHMXpLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtbHVkR1Z5ZG1Gc0xtMXpLRzF6S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdkR2hwY3k1cGJuUmxjblpoYkM1emRHRnlkQ2dwTzF4dUlDQjlYRzVjYmlBZ0x5b3FYRzRnSUZOMGIzQWdjMlZ4ZFdWdVkybHVaMXh1SUNBcUwxeHVJQ0J6ZEc5d0tDa2dlMXh1SUNBZ0lIUm9hWE11YVc1MFpYSjJZV3d1YzNSdmNDZ3BPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJRTFoYm5WaGJHeDVJR3AxYlhBZ2RHOGdkR2hsSUc1bGVIUWdZMjlzZFcxdUlHRnVaQ0IwY21sbloyVnlJSFJvWlNBblkyaGhibWRsSnlCbGRtVnVkQzRnVkdobElGd2libVY0ZEZ3aUlHTnZiSFZ0YmlCcGN5QmtaWFJsY20xcGJtVmtJR0o1SUhsdmRYSWdiVzlrWlNCdlppQnpaWEYxWlc1amFXNW5MbHh1SUNBcUwxeHVJQ0J1WlhoMEtDa2dlMXh1SUNBZ0lIUm9hWE11YzNSbGNIQmxjaTV1WlhoMEtDazdYRzRnSUNBZ2RHaHBjeTVsYldsMEtDZHpkR1Z3Snl4MGFHbHpMbTFoZEhKcGVDNWpiMngxYlc0b2RHaHBjeTV6ZEdWd2NHVnlMblpoYkhWbEtTNXlaWFpsY25ObEtDa3BPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc0Z0lIMWNibHh1SUNCaFpHUlViM1ZqYUV4cGMzUmxibVZ5Y3lncElIdGNibHh1SUNBZ0lIUm9hWE11Y0hKbFEyeHBZMnNnUFNCMGFHbHpMbkJ5WlUxdmRtVWdQU0IwYUdsekxuQnlaVkpsYkdWaGMyVWdQU0FvS1NBOVBpQjdmVHRjYmlBZ0lDQjBhR2x6TG1Oc2FXTnJJRDBnZEdocGN5NXRiM1psSUQwZ2RHaHBjeTV5Wld4bFlYTmxJRDBnS0NrZ1BUNGdlMzA3WEc0Z0lDQWdkR2hwY3k1d2NtVlViM1ZqYUNBOUlIUm9hWE11Y0hKbFZHOTFZMmhOYjNabElEMGdkR2hwY3k1d2NtVlViM1ZqYUZKbGJHVmhjMlVnUFNBb0tTQTlQaUI3ZlR0Y2JpQWdJQ0IwYUdsekxuUnZkV05vSUQwZ2RHaHBjeTUwYjNWamFFMXZkbVVnUFNCMGFHbHpMblJ2ZFdOb1VtVnNaV0Z6WlNBOUlDZ3BJRDArSUh0OU8xeHVYRzRnSUNBZ2RHaHBjeTVqZFhKeVpXNTBSV3hsYldWdWRDQTlJR1poYkhObE8xeHVYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbUZrWkVWMlpXNTBUR2x6ZEdWdVpYSW9KM1J2ZFdOb2MzUmhjblFuTENBb1pTa2dQVDRnZTF4dUlDQWdJQ0FnYkdWMElHVnNaVzFsYm5RZ1BTQmtiMk4xYldWdWRDNWxiR1Z0Wlc1MFJuSnZiVkJ2YVc1MEtHVXVkR0Z5WjJWMFZHOTFZMmhsYzFzd1hTNWpiR2xsYm5SWUxHVXVkR0Z5WjJWMFZHOTFZMmhsYzFzd1hTNWpiR2xsYm5SWktUdGNiaUFnSUNBZ0lHeGxkQ0JqWld4c0lEMGdkR2hwY3k1alpXeHNjMXRsYkdWdFpXNTBMbWx1WkdWNFhUdGNiaUFnSUNBZ0lIUm9hWE11Y0dGcGJuUmljblZ6YUNBOUlDRmpaV3hzTG5OMFlYUmxPMXh1SUNBZ0lDQWdZMlZzYkM1a2IzZHVLSFJvYVhNdWNHRnBiblJpY25WemFDazdYRzRnSUNBZ0lDQjBhR2x6TG1OMWNuSmxiblJGYkdWdFpXNTBJRDBnWld4bGJXVnVkQzVwYm1SbGVEdGNiaUFnSUNBZ0lHVXVjSEpsZG1WdWRFUmxabUYxYkhRb0tUdGNiaUFnSUNBZ0lHVXVjM1J2Y0ZCeWIzQmhaMkYwYVc5dUtDazdYRzRnSUNBZ2ZTazdYRzVjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWduZEc5MVkyaHRiM1psSnl3Z0tHVXBJRDArSUh0Y2JpQWdJQ0FnSUd4bGRDQmxiR1Z0Wlc1MElEMGdaRzlqZFcxbGJuUXVaV3hsYldWdWRFWnliMjFRYjJsdWRDaGxMblJoY21kbGRGUnZkV05vWlhOYk1GMHVZMnhwWlc1MFdDeGxMblJoY21kbGRGUnZkV05vWlhOYk1GMHVZMnhwWlc1MFdTazdYRzRnSUNBZ0lDQnNaWFFnWTJWc2JDQTlJSFJvYVhNdVkyVnNiSE5iWld4bGJXVnVkQzVwYm1SbGVGMDdYRzRnSUNBZ0lDQnBaaUFvWld4bGJXVnVkQzVwYm1SbGVDRTlQWFJvYVhNdVkzVnljbVZ1ZEVWc1pXMWxiblFwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdVkzVnljbVZ1ZEVWc1pXMWxiblFnUGowZ01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUd4bGRDQndZWE4wUTJWc2JDQTlJSFJvYVhNdVkyVnNiSE5iZEdocGN5NWpkWEp5Wlc1MFJXeGxiV1Z1ZEYwN1hHNGdJQ0FnSUNBZ0lDQWdjR0Z6ZEVObGJHd3VkWEFvS1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQmpaV3hzTG1SdmQyNG9kR2hwY3k1d1lXbHVkR0p5ZFhOb0tUdGNiaUFnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lHTmxiR3d1WW1WdVpDZ3BPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdkR2hwY3k1amRYSnlaVzUwUld4bGJXVnVkQ0E5SUdWc1pXMWxiblF1YVc1a1pYZzdYRzRnSUNBZ0lDQmxMbkJ5WlhabGJuUkVaV1poZFd4MEtDazdYRzRnSUNBZ0lDQmxMbk4wYjNCUWNtOXdZV2RoZEdsdmJpZ3BPMXh1SUNBZ0lIMHBPMXh1WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjNSdmRXTm9aVzVrSnl3Z0tHVXBJRDArSUh0Y2JpQWdJQ0FnSUM4dklHNXZJSFJ2ZFdOb1pYTWdkRzhnWTJGc1kzVnNZWFJsSUdKbFkyRjFjMlVnYm05dVpTQnlaVzFoYVc1cGJtZGNiaUFnSUNBZ0lHeGxkQ0JqWld4c0lEMGdkR2hwY3k1alpXeHNjMXQwYUdsekxtTjFjbkpsYm5SRmJHVnRaVzUwWFR0Y2JpQWdJQ0FnSUdObGJHd3VkWEFvS1R0Y2JpQWdJQ0FnSUhSb2FYTXVhVzUwWlhKaFkzUnBibWNnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJSFJvYVhNdVkzVnljbVZ1ZEVWc1pXMWxiblFnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJR1V1Y0hKbGRtVnVkRVJsWm1GMWJIUW9LVHRjYmlBZ0lDQWdJR1V1YzNSdmNGQnliM0JoWjJGMGFXOXVLQ2s3WEc0Z0lDQWdmU2s3WEc1Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNCT2RXMWlaWElnYjJZZ2NtOTNjeUJwYmlCMGFHVWdjMlZ4ZFdWdVkyVnlYRzRnSUVCMGVYQmxJSHR1ZFcxaVpYSjlYRzRnSUNvdlhHNGdJR2RsZENCeWIzZHpLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG0xaGRISnBlQzV5YjNkek8xeHVJQ0I5WEc1Y2JpQWdjMlYwSUhKdmQzTW9kaWtnZTF4dUlDQWdJSFJvYVhNdWJXRjBjbWw0TG5KdmQzTWdQU0IyTzF4dUlDQWdJSFJvYVhNdVpXMXdkSGtvS1R0Y2JpQWdJQ0IwYUdsekxtSjFhV3hrU1c1MFpYSm1ZV05sS0NrN1hHNGdJQ0FnZEdocGN5NTFjR1JoZEdVb0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQk9kVzFpWlhJZ2IyWWdZMjlzZFcxdWN5QnBiaUIwYUdVZ2MyVnhkV1Z1WTJWeVhHNGdJRUIwZVhCbElIdHVkVzFpWlhKOVhHNGdJQ292WEc0Z0lHZGxkQ0JqYjJ4MWJXNXpLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG0xaGRISnBlQzVqYjJ4MWJXNXpPMXh1SUNCOVhHNWNiaUFnYzJWMElHTnZiSFZ0Ym5Nb2Rpa2dlMXh1SUNBZ0lIUm9hWE11YldGMGNtbDRMbU52YkhWdGJuTWdQU0IyTzF4dUlDQWdJSFJvYVhNdWMzUmxjSEJsY2k1dFlYZ2dQU0IyTzF4dUlDQWdJSFJvYVhNdVpXMXdkSGtvS1R0Y2JpQWdJQ0IwYUdsekxtSjFhV3hrU1c1MFpYSm1ZV05sS0NrN1hHNGdJQ0FnZEdocGN5NTFjR1JoZEdVb0tUdGNiaUFnZlZ4dVhHNTlYRzVjYmx4dVhHNHZMeUJYUlVKUVFVTkxJRVpQVDFSRlVpQXZMMXh1THk4Z0xpOStMMnB6YUdsdWRDMXNiMkZrWlhJaExpOXNhV0l2YVc1MFpYSm1ZV05sY3k5elpYRjFaVzVqWlhJdWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibWx0Y0c5eWRDQnRZWFJvSUdaeWIyMGdKeTR1TDNWMGFXd3ZiV0YwYUNjN1hHNXBiWEJ2Y25RZ1UyVnhkV1Z1WTJVZ1puSnZiU0FuTGk0dmJXOWtaV3h6TDNObGNYVmxibU5sSnp0Y2JseHVMeThnUm05eUlIUm9aU0IwZFhSdmNtbGhiQ3dnYkc5dmEybHVaeUJoZEZ4dVhHNHZMMUJoZEhSbGNtNGdjMlZqZEdsdmJqcGNiaTh2SUM1amNtVmhkR1VvS1N3Z0xuSnZkM01zSUM1amIyeDFiVzV6TEZ4dUx5OGdMbkJoZEhSbGNtNHNJQzVzWlc1bmRHZ3NJQzVtYjNKdFlYUkJjMVJsZUhRb0tTd2dMbXh2WnlncExGeHVMeThnTG14dlkyRjBaU2hwS1N3Z0xtbHVaR1Y0VDJZb1l5eHlLVnh1THk4Z2NtOTNLQ2tzSUdOdmJIVnRiaWdwSUNoeVpYUjFjbTV6SUdOdmJuUmxiblJ6SUc5bUlISnZkeUJ2Y2lCamIyeDFiU2xjYmx4dUx5OURiMjUwY205c0lITmxZM1JwYjI0NlhHNHZMeUIwYjJkbmJHVWdlRE5jYmk4dklITmxkQ0I0TkZ4dUx5OGdjbTkwWVhSbElIZ3pYRzR2THlCd2IzQjFiR0YwWlNCNE0xeHVMeThnWlhKaGMyVWdlRE5jYmx4dVhHNHZMeUJ6YUc5MWJHUWdjMjl0WlNCMlpYSnphVzl1SUc5bUlIUm9hWE1nYUdGMlpTQmhJR1pzYjJGMElIWmhiSFZsSUdadmNpQmxZV05vSUdObGJHdy9YRzR2THlCamIzVnNaQ0JpWlNCc2FXdGxJR0VnYldseWNtOXlJQzV3WVhSMFpYSnVJSFJvWVhRZ2FHRnpJSFpoYkhWbGN5NGdZbmtnWkdWbVlYVnNkQ3dnWlhabGNubDBhR2x1WnlCcGN5QXhMQ0JpZFhRZ1kyOTFiR1FnWW1VZ2MyVjBMaTR1WEc0dkx5QnViM1FnWVNCbmIyOWtJSGRoZVNCMGJ5QmtieUIwYUdGMElHOXVJR2x1ZEdWeVptRmpaU3dnWW5WMElHRnpJR0VnYlc5a1pXd2dhWFFnZDI5MWJHUWdZbVVnYm1salpTNHVMbHh1THk4Z1ptOXlJQzVtYjNKdFlYUkJjMVJsZUhRb0tTd2dZMjkxYkdRZ2JYVnNkR2x3YkhrZ1lua2dNVEF3SUdGdVpDQm1iRzl2Y2l3Z2MyOGdaV0ZqYUNCalpXeHNJR2x6SUdGdUlHbHVkQ0JtY205dElEQWdkRzhnT1Z4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamJHRnpjeUJOWVhSeWFYZ2dlMXh1WEc0Z0lHTnZibk4wY25WamRHOXlLSEp2ZDNNc1kyOXNkVzF1Y3lrZ2UxeHVJQ0FnSUM4dklITm9iM1ZzWkNCaGJITnZJR2hoZG1VZ1lXSnBiR2wwZVNCMGJ5QmpjbVZoZEdVZ2RYTnBibWNnWVc0Z1pYaHBjM1JwYm1jZ2JXRjBjbWw0SUNneVpDQmhjbkpoZVNsY2JpQWdJQ0IwYUdsekxuQmhkSFJsY200Z1BTQmJYVHRjYmlBZ0lDQjBhR2x6TG1OeVpXRjBaU2h5YjNkekxHTnZiSFZ0Ym5NcE8xeHVYRzRnSUNBZ2RHaHBjeTUwYjJkbmJHVWdQU0I3WEc0Z0lDQWdJQ0JqWld4c09pQW9ZMjlzZFcxdUxDQnliM2NwSUQwK0lIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1d1lYUjBaWEp1VzNKdmQxMWJZMjlzZFcxdVhTQTlJQ0YwYUdsekxuQmhkSFJsY201YmNtOTNYVnRqYjJ4MWJXNWRPeUF2THlCdFlYUm9MbWx1ZG1WeWRDaDBhR2x6TG5CaGRIUmxjbTViY205M1hWdGpiMngxYlc1ZEtUdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXVkV2twSUhzZ2RHaHBjeTUxYVM1MWNHUmhkR1VvS1RzZ2ZWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTV3WVhSMFpYSnVXM0p2ZDExYlkyOXNkVzF1WFR0Y2JpQWdJQ0FnSUgwc1hHNGdJQ0FnSUNCaGJHdzZJQ2dwSUQwK0lIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1cGRHVnlZWFJsS0NoeUxHTXBJRDArSUhzZ2RHaHBjeTUwYjJkbmJHVXVZMlZzYkNoakxISXBPeUI5S1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWRXa3BJSHNnZEdocGN5NTFhUzUxY0dSaGRHVW9LVHNnZlZ4dUlDQWdJQ0FnZlN4Y2JpQWdJQ0FnSUhKdmR6b2dLSEp2ZHlrZ1BUNGdlMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tHeGxkQ0JwUFRBN0lHazhkR2hwY3k1amIyeDFiVzV6T3lCcEt5c3BJSHRjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpMblJ2WjJkc1pTNWpaV3hzS0drc2NtOTNLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1MWFTa2dleUIwYUdsekxuVnBMblZ3WkdGMFpTZ3BPeUI5WEc0Z0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnWTI5c2RXMXVPaUFvWTI5c2RXMXVLU0E5UGlCN1hHNGdJQ0FnSUNBZ0lHWnZjaUFvYkdWMElHazlNRHNnYVR4MGFHbHpMbkp2ZDNNN0lHa3JLeWtnZTF4dUlDQWdJQ0FnSUNBZ0lIUm9hWE11ZEc5bloyeGxMbU5sYkd3b1kyOXNkVzF1TEdrcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMblZwS1NCN0lIUm9hWE11ZFdrdWRYQmtZWFJsS0NrN0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ2RHaHBjeTV6WlhRZ1BTQjdYRzRnSUNBZ0lDQmpaV3hzT2lBb1kyOXNkVzF1TENCeWIzY3NJSFpoYkhWbEtTQTlQaUI3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjR0YwZEdWeWJsdHliM2RkVzJOdmJIVnRibDBnUFNCMllXeDFaVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11ZFdrcElIc2dkR2hwY3k1MWFTNTFjR1JoZEdVb0tUc2dmVnh1SUNBZ0lDQWdmU3hjYmlBZ0lDQWdJR0ZzYkRvZ0tIWmhiSFZsY3lrZ1BUNGdlMXh1SUNBZ0lDQWdJQ0F2THlCelpYUWdkR2hsSUhkb2IyeGxJRzFoZEhKcGVDQjFjMmx1WnlCaElESmtJR0Z5Y21GNUlHRnpJR2x1Y0hWMFhHNGdJQ0FnSUNBZ0lDOHZJSFJvYVhNZ2MyaHZkV3hrSUdGc2MyOGdjbVZ6YVhwbElIUm9aU0JoY25KaGVUOWNiaUFnSUNBZ0lDQWdkR2hwY3k1d1lYUjBaWEp1SUQwZ2RtRnNkV1Z6TzF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1MWFTa2dleUIwYUdsekxuVnBMblZ3WkdGMFpTZ3BPeUI5WEc0Z0lDQWdJQ0I5TEZ4dUlDQWdJQ0FnY205M09pQW9jbTkzTEhaaGJIVmxjeWtnUFQ0Z2UxeHVJQ0FnSUNBZ0lDQXZMeUJ6WlhRZ1lTQnliM2NnZFhOcGJtY2dZVzRnWVhKeVlYa2dZWE1nYVc1d2RYUmNiaUFnSUNBZ0lDQWdkR2hwY3k1d1lYUjBaWEp1VzNKdmQxMGdQU0IyWVd4MVpYTTdYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMblZwS1NCN0lIUm9hWE11ZFdrdWRYQmtZWFJsS0NrN0lIMWNiaUFnSUNBZ0lIMHNYRzRnSUNBZ0lDQmpiMngxYlc0NklDaGpiMngxYlc0c2RtRnNkV1Z6S1NBOVBpQjdYRzRnSUNBZ0lDQWdJQzh2SUhObGRDQmhJR052YkhWdGJpQjFjMmx1WnlCaGJpQmhjbkpoZVNCaGN5QnBibkIxZEZ4dUlDQWdJQ0FnSUNCMGFHbHpMbkJoZEhSbGNtNHVabTl5UldGamFDZ29jbTkzTEdrcElEMCtJSHRjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpMbkJoZEhSbGNtNWJhVjFiWTI5c2RXMXVYU0E5SUhaaGJIVmxjMXRwWFR0Y2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMblZwS1NCN0lIUm9hWE11ZFdrdWRYQmtZWFJsS0NrN0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ2RHaHBjeTV5YjNSaGRHVWdQU0I3WEc0Z0lDQWdJQ0F2TDNOb2IzVnNaQ0JsZG1WdWRIVmhiR3g1SUdSdklDaGhiVzkxYm5SWUxDQmhiVzkxYm5SWktTQm9aWEpsWEc0Z0lDQWdJQ0F2THlCamIzVnNaQ0JxZFhOMElIVnpaU0JoSUd4dmIzQWdZVzVrSUhSb2FYTXVjbTkwWVhSbExuSnZkeWhwTEdGdGIzVnVkRmdwTzF4dUlDQWdJQ0FnWVd4c09pQW9ZVzF2ZFc1MEtTQTlQaUI3WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hZVzF2ZFc1MElDWW1JR0Z0YjNWdWRDRTlQVEFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQmhiVzkxYm5RZ1BTQXhPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUdGdGIzVnVkQ0FsUFNCMGFHbHpMbkJoZEhSbGNtNWJNRjB1YkdWdVozUm9PMXh1SUNBZ0lDQWdJQ0JwWmlBb1lXMXZkVzUwSUR3Z01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUdGdGIzVnVkQ0E5SUhSb2FYTXVjR0YwZEdWeWJsc3dYUzVzWlc1bmRHZ2dLeUJoYlc5MWJuUTdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnWm05eUlDaHNaWFFnYVQwd095QnBQSFJvYVhNdWNtOTNjenNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdWMElHTjFkQ0E5SUhSb2FYTXVjR0YwZEdWeWJsdHBYUzV6Y0d4cFkyVW9JSFJvYVhNdWNHRjBkR1Z5Ymx0cFhTNXNaVzVuZEdnZ0xTQmhiVzkxYm5Rc0lHRnRiM1Z1ZENBcE8xeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdWNHRjBkR1Z5Ymx0cFhTQTlJR04xZEM1amIyNWpZWFFvSUhSb2FYTXVjR0YwZEdWeWJsdHBYU0FwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxuVnBLU0I3SUhSb2FYTXVkV2t1ZFhCa1lYUmxLQ2s3SUgxY2JpQWdJQ0FnSUgwc1hHNGdJQ0FnSUNCeWIzYzZJQ2h5YjNjc1lXMXZkVzUwS1NBOVBpQjdYRzRnSUNBZ0lDQWdJR2xtSUNnaFlXMXZkVzUwSUNZbUlHRnRiM1Z1ZENFOVBUQXBJSHRjYmlBZ0lDQWdJQ0FnSUNCaGJXOTFiblFnUFNBeE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJR0Z0YjNWdWRDQWxQU0IwYUdsekxuQmhkSFJsY201Yk1GMHViR1Z1WjNSb08xeHVJQ0FnSUNBZ0lDQnBaaUFvWVcxdmRXNTBJRHdnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR0Z0YjNWdWRDQTlJSFJvYVhNdWNHRjBkR1Z5Ymxzd1hTNXNaVzVuZEdnZ0t5QmhiVzkxYm5RN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdiR1YwSUdOMWRDQTlJSFJvYVhNdWNHRjBkR1Z5Ymx0eWIzZGRMbk53YkdsalpTZ2dkR2hwY3k1d1lYUjBaWEp1VzNKdmQxMHViR1Z1WjNSb0lDMGdZVzF2ZFc1MExDQmhiVzkxYm5RZ0tUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1d1lYUjBaWEp1VzNKdmQxMGdQU0JqZFhRdVkyOXVZMkYwS0NCMGFHbHpMbkJoZEhSbGNtNWJjbTkzWFNBcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NTFhU2tnZXlCMGFHbHpMblZwTG5Wd1pHRjBaU2dwT3lCOVhHNGdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ1kyOXNkVzF1T2lBb1kyOXNkVzF1TENCaGJXOTFiblFwSUQwK0lIdGNiaUFnSUNBZ0lDQWdhV1lnS0NGaGJXOTFiblFnSmlZZ1lXMXZkVzUwSVQwOU1Da2dlMXh1SUNBZ0lDQWdJQ0FnSUdGdGIzVnVkQ0E5SURFN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdZVzF2ZFc1MElDVTlJSFJvYVhNdWNHRjBkR1Z5Ymk1c1pXNW5kR2c3WEc0Z0lDQWdJQ0FnSUdsbUlDaGhiVzkxYm5RZ1BDQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1lXMXZkVzUwSUQwZ2RHaHBjeTV3WVhSMFpYSnVMbXhsYm1kMGFDQXJJR0Z0YjNWdWREdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JzWlhRZ2NISnZlSGtnUFNCYlhUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1d1lYUjBaWEp1TG1admNrVmhZMmdvS0hKdmR5a2dQVDRnZTF4dUlDQWdJQ0FnSUNBZ0lIQnliM2g1TG5CMWMyZ29JSEp2ZDF0amIyeDFiVzVkSUNrN1hHNGdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0JzWlhRZ1kzVjBJRDBnY0hKdmVIa3VjM0JzYVdObEtDQndjbTk0ZVM1c1pXNW5kR2dnTFNCaGJXOTFiblFzSUdGdGIzVnVkQ0FwTzF4dUlDQWdJQ0FnSUNCd2NtOTRlU0E5SUdOMWRDNWpiMjVqWVhRb0lIQnliM2g1SUNrN1hHNGdJQ0FnSUNBZ0lIUm9hWE11Y0dGMGRHVnliaTVtYjNKRllXTm9LQ2h5YjNjc2FTa2dQVDRnZTF4dUlDQWdJQ0FnSUNBZ0lISnZkMXRqYjJ4MWJXNWRJRDBnY0hKdmVIbGJhVjA3WEc0Z0lDQWdJQ0FnSUgwcE8xeHVJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NTFhU2tnZXlCMGFHbHpMblZwTG5Wd1pHRjBaU2dwT3lCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUM4dklIUm9aU0JwWkdWaElHSmxhR2x1WkNCd2IzQjFiR0YwWlNCcGN5QjBieUJpWlNCaFlteGxJSFJ2SUhObGRDQmhJSGRvYjJ4bElISnZkeUJ2Y2lCamIyeDFiVzRnZEc4Z01DQnZjaUF4WEc0Z0lDQWdMeThnU1VZZ2RHaGxJSFpoYkhWbElHbHpJR0VnWm14dllYUXNJSE4xWTJnZ1lYTWdNQzQzTENCMGFHVnVJR2wwSUhkdmRXeGtJR0psWTI5dFpTQmhJSEJ5YjJKaFltbHNhWFI1WEc0Z0lDQWdMeThnYzI4Z2NHOXdkV3hoZEdVb01DNDNLU0IzYjNWc1pDQm5hWFpsSUdWaFkyZ2dZMlZzYkNCaElEY3dKU0JqYUdGdVkyVWdiMllnWW1WcGJtY2dNVnh1SUNBZ0lIUm9hWE11Y0c5d2RXeGhkR1VnUFNCN1hHNGdJQ0FnSUNCaGJHdzZJQ2h2WkdSektTQTlQaUI3WEc0Z0lDQWdJQ0FnSUd4bGRDQnZaR1J6VTJWeGRXVnVZMlVnUFNCdVpYY2dVMlZ4ZFdWdVkyVW9iMlJrY3lrN1hHNGdJQ0FnSUNBZ0lIUm9hWE11YVhSbGNtRjBaU2dvY2l4aktTQTlQaUI3WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTV3WVhSMFpYSnVXM0pkVzJOZElEMGdiV0YwYUM1amIybHVLRzlrWkhOVFpYRjFaVzVqWlM1dVpYaDBLQ2twTzF4dUlDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdMeThnVkdocGN5QmpiM1ZzWkNCaVpTQjFjMlZrSUhOdklIUm9ZWFFnWldGamFDQnliM2NnYUdGeklITmhiV1VnYjJSa2N5QndZWFIwWlhKdUxDQmxkbVZ1SUdsbUlISnZkeUJzWlc1bmRHZ2dhWE1nYm05MElHUnBkbWx6YVdKc2VTQmllU0J6WlhGMVpXNWpaU0JzWlc1bmRHZ3VYRzRnSUNBZ0lDQWdJQzh2TENncElEMCtJSHRjYmlBZ0lDQWdJQ0FnTHk4Z0lHOWtaSE11Y0c5eklEMGdMVEU3WEc0Z0lDQWdJQ0FnSUM4dklIMWNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXVkV2twSUhzZ2RHaHBjeTUxYVM1MWNHUmhkR1VvS1RzZ2ZWeHVJQ0FnSUNBZ2ZTeGNiaUFnSUNBZ0lISnZkem9nS0hKdmR6MHdMRzlrWkhNOU1Ta2dQVDRnZTF4dUlDQWdJQ0FnSUNCc1pYUWdiMlJrYzFObGNYVmxibU5sSUQwZ2JtVjNJRk5sY1hWbGJtTmxLRzlrWkhNcE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG5CaGRIUmxjbTViY205M1hTNW1iM0pGWVdOb0tDaGpaV3hzTEdrcElEMCtJSHRjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpMbkJoZEhSbGNtNWJjbTkzWFZ0cFhTQTlJRzFoZEdndVkyOXBiaWh2WkdSelUyVnhkV1Z1WTJVdWJtVjRkQ2dwS1R0Y2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMblZwS1NCN0lIUm9hWE11ZFdrdWRYQmtZWFJsS0NrN0lIMWNiaUFnSUNBZ0lIMHNYRzRnSUNBZ0lDQmpiMngxYlc0NklDaGpiMngxYlc0OU1DeHZaR1J6UFRFcElEMCtJSHRjYmlBZ0lDQWdJQ0FnYkdWMElHOWtaSE5UWlhGMVpXNWpaU0E5SUc1bGR5QlRaWEYxWlc1alpTaHZaR1J6S1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV3WVhSMFpYSnVMbVp2Y2tWaFkyZ29LSEp2ZHl4cEtTQTlQaUI3WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTV3WVhSMFpYSnVXMmxkVzJOdmJIVnRibDBnUFNCdFlYUm9MbU52YVc0b2IyUmtjMU5sY1hWbGJtTmxMbTVsZUhRb0tTazdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1MWFTa2dleUIwYUdsekxuVnBMblZ3WkdGMFpTZ3BPeUI5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVHRjYmx4dUlDQWdJQzh2SUdWemMyVnVkR2xoYkd3Z2NHOXdkV3hoZEdVb01Da2djMjhnYVNkdElHNXZkQ0J6ZFhKbElHbG1JSFJvYVhNZ2FYTWdibVZqWlhOellYSjVJR0oxZENCcGN5QnVhV05sWEc0Z0lDQWdkR2hwY3k1bGNtRnpaU0E5SUh0Y2JpQWdJQ0FnSUdGc2JEb2dLQ2tnUFQ0Z2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TG5ObGRDNWhiR3dvTUNrN1hHNGdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ2NtOTNPaUFvY205M0tTQTlQaUI3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVjMlYwTG5KdmR5aHliM2NzTUNrN1hHNGdJQ0FnSUNCOUxGeHVJQ0FnSUNBZ1kyOXNkVzF1T2lBb1kyOXNkVzF1S1NBOVBpQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdWMyVjBMbU52YkhWdGJpaGpiMngxYlc0c01DazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZUdGNibHh1SUNBdkx5QmxibVFnWTI5dWMzUnlkV04wYjNKY2JpQWdmVnh1WEc1Y2JpQWdZM0psWVhSbEtISnZkM01zWTI5c2RXMXVjeWtnZTF4dUlDQWdJSFJvYVhNdWNHRjBkR1Z5YmlBOUlGdGRPMXh1SUNBZ0lHWnZjaUFvSUd4bGRDQnliM2M5TURzZ2NtOTNJRHdnY205M2N6c2djbTkzS3lzZ0tTQjdYRzRnSUNBZ0lDQnNaWFFnWVhKeUlEMGdibVYzSUVGeWNtRjVLR052YkhWdGJuTXBPMXh1SUNBZ0lDQWdkR2hwY3k1d1lYUjBaWEp1TG5CMWMyZ29ZWEp5S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdkR2hwY3k1cGRHVnlZWFJsS0NoeUxHTXBJRDArSUhzZ2RHaHBjeTV3WVhSMFpYSnVXM0pkVzJOZElEMGdabUZzYzJVN0lIMHBPMXh1SUNCOVhHNWNiaUFnYVhSbGNtRjBaU2htTENCbU1pa2dlMXh1SUNBZ0lHeGxkQ0JwSUQwZ01EdGNiaUFnSUNCbWIzSWdLQ0JzWlhRZ2NtOTNQVEE3SUhKdmR5QThJSFJvYVhNdWNtOTNjenNnY205M0t5c2dLU0I3WEc0Z0lDQWdJQ0JwWmlBb1pqSXBJSHNnWmpJb2NtOTNLVHNnZlZ4dUlDQWdJQ0FnWm05eUlDZ2diR1YwSUdOdmJIVnRiajB3T3lCamIyeDFiVzRnUENCMGFHbHpMbU52YkhWdGJuTTdJR052YkhWdGJpc3JJQ2tnZTF4dUlDQWdJQ0FnSUNCbUtISnZkeXhqYjJ4MWJXNHNhU2s3WEc0Z0lDQWdJQ0FnSUdrckt6dGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQm1iM0p0WVhSQmMxUmxlSFFvS1NCN1hHNGdJQ0FnYkdWMElIQmhkSFJsY201VGRISnBibWNnUFNBbkp6dGNiaUFnSUNCMGFHbHpMbWwwWlhKaGRHVW9YRzRnSUNBZ0lDQW9jaXhqS1NBOVBpQjdJSEJoZEhSbGNtNVRkSEpwYm1jZ0t6MGdLSFJvYVhNdWNHRjBkR1Z5Ymx0eVhWdGpYU0EvSURFZ09pQXdLU0FySUNjZ0p6c2dmU3hjYmlBZ0lDQWdJQ2dwSUQwK0lIc2djR0YwZEdWeWJsTjBjbWx1WnlBclBTQW5YRnh1SnpzZ2ZWeHVJQ0FnSUNrN1hHNGdJQ0FnY21WMGRYSnVJSEJoZEhSbGNtNVRkSEpwYm1jN1hHNGdJSDFjYmx4dUlDQnNiMmNvS1NCN1hHNGdJQ0FnWTI5dWMyOXNaUzVzYjJjb2RHaHBjeTVtYjNKdFlYUkJjMVJsZUhRb0tTazdYRzRnSUgxY2JseHVJQ0IxY0dSaGRHVW9jR0YwZEdWeWJpa2dlMXh1SUNBZ0lIUm9hWE11Y0dGMGRHVnliaUE5SUhCaGRIUmxjbTRnZkh3Z2RHaHBjeTV3WVhSMFpYSnVPMXh1SUNCOVhHNWNiaUFnWjJWMElHeGxibWQwYUNncElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NXliM2R6S25Sb2FYTXVZMjlzZFcxdWN6dGNiaUFnZlZ4dVhHNGdJR3h2WTJGMFpTaHBibVJsZUNrZ2UxeHVJQ0FnSUM4dklISmxkSFZ5Ym5NZ2NtOTNJR0Z1WkNCamIyeDFiVzRnYjJZZ1kyVnNiQ0JpZVNCcGJtUmxlRnh1SUNBZ0lISmxkSFZ5YmlCN1hHNGdJQ0FnSUNCeWIzYzZJSDUrS0NCcGJtUmxlQ0F2SUhSb2FYTXVZMjlzZFcxdWN5QXBMRnh1SUNBZ0lDQWdZMjlzZFcxdU9pQnBibVJsZUNBbElIUm9hWE11WTI5c2RXMXVjMXh1SUNBZ0lIMDdYRzRnSUgxY2JseHVJQ0JwYm1SbGVFOW1LSEp2ZHl4amIyeDFiVzRwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdZMjlzZFcxdUlDc2djbTkzSUNvZ2RHaHBjeTVqYjJ4MWJXNXpPMXh1SUNBZ0lDOHZJSEpsZEhWeWJuTWdhVzVrWlhnZ2IyWWdZMlZzYkNCaWVTQnliM2NnWVc1a0lHTnZiSFZ0Ymx4dUlDQjlYRzVjYmlBZ2NtOTNLSEp2ZHlrZ2UxeHVJQ0FnSUd4bGRDQmtZWFJoSUQwZ1cxMDdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FUMHdPeUJwUEhSb2FYTXVZMjlzZFcxdWN6c2dhU3NyS1NCN1hHNGdJQ0FnSUNCa1lYUmhMbkIxYzJnb2RHaHBjeTV3WVhSMFpYSnVXM0p2ZDEwZ1B5QXhJRG9nTUNrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQmtZWFJoTzF4dUlDQjlYRzVjYmlBZ1kyOXNkVzF1S0dOdmJIVnRiaWtnZTF4dUlDQWdJR3hsZENCa1lYUmhJRDBnVzEwN1hHNGdJQ0FnWm05eUlDaHNaWFFnYVQwd095QnBQSFJvYVhNdWNtOTNjenNnYVNzcktTQjdYRzRnSUNBZ0lDQmtZWFJoTG5CMWMyZ29kR2hwY3k1d1lYUjBaWEp1VzJsZFcyTnZiSFZ0YmwwZ1B5QXhJRG9nTUNrN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQmtZWFJoTzF4dUlDQjlYRzVjYmlBZ1oyVjBJSEp2ZDNNb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjR0YwZEdWeWJpNXNaVzVuZEdnN1hHNGdJSDFjYmlBZ2MyVjBJSEp2ZDNNb2Rpa2dlMXh1SUNBZ0lHeGxkQ0J3Y21WMmFXOTFjeUE5SUhSb2FYTXVjR0YwZEdWeWJpNXpiR2xqWlNnd0tUdGNiaUFnSUNCMGFHbHpMbU55WldGMFpTaDJMSFJvYVhNdVkyOXNkVzF1Y3lrN1hHNGdJQ0FnZEdocGN5NXBkR1Z5WVhSbEtDaHlMR01wSUQwK0lIdGNiaUFnSUNBZ0lHbG1JQ2h3Y21WMmFXOTFjMXR5WFNBbUppQndjbVYyYVc5MWMxdHlYVnRqWFNrZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TG5CaGRIUmxjbTViY2wxYlkxMGdQU0J3Y21WMmFXOTFjMXR5WFZ0alhUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOUtUdGNiaUFnZlZ4dVhHNGdJR2RsZENCamIyeDFiVzV6S0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxuQmhkSFJsY201Yk1GMHViR1Z1WjNSb08xeHVJQ0I5WEc0Z0lITmxkQ0JqYjJ4MWJXNXpLSFlwSUh0Y2JpQWdJQ0JzWlhRZ2NISmxkbWx2ZFhNZ1BTQjBhR2x6TG5CaGRIUmxjbTR1YzJ4cFkyVW9NQ2s3WEc0Z0lDQWdkR2hwY3k1amNtVmhkR1VvZEdocGN5NXliM2R6TEhZcE8xeHVJQ0FnSUhSb2FYTXVhWFJsY21GMFpTZ29jaXhqS1NBOVBpQjdYRzRnSUNBZ0lDQnBaaUFvY0hKbGRtbHZkWE5iY2wwZ0ppWWdjSEpsZG1sdmRYTmJjbDFiWTEwcElIdGNiaUFnSUNBZ0lDQWdkR2hwY3k1d1lYUjBaWEp1VzNKZFcyTmRJRDBnY0hKbGRtbHZkWE5iY2wxYlkxMDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZTazdYRzRnSUgxY2JseHVmVnh1WEc1Y2JseHVMeThnVjBWQ1VFRkRTeUJHVDA5VVJWSWdMeTljYmk4dklDNHZmaTlxYzJocGJuUXRiRzloWkdWeUlTNHZiR2xpTDIxdlpHVnNjeTl0WVhSeWFYZ3Vhbk1pTENJbmRYTmxJSE4wY21samRDYzdYSEpjYmx4eVhHNXBiWEJ2Y25RZ2JXRjBhQ0JtY205dElDY3VMaTkxZEdsc0wyMWhkR2duTzF4eVhHNXBiWEJ2Y25RZ1JISjFibXNnWm5KdmJTQW5MaTlrY25WdWF5YzdYSEpjYmx4eVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamJHRnpjeUJUWlhGMVpXNWpaU0I3WEhKY2JseHlYRzRnSUNBZ1kyOXVjM1J5ZFdOMGIzSW9jMlZ4ZFdWdVkyVWdQU0JiTUN3eE1Dd3lNQ3d6TUYwc0lHMXZaR1U5SjNWd0p5d2djRzl6YVhScGIyNDlabUZzYzJVcElIdGNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxuWmhiSFZsY3lBOUlITmxjWFZsYm1ObE8xeHlYRzRnSUNBZ0lDQWdJR2xtSUNnaFFYSnlZWGt1YVhOQmNuSmhlU2gwYUdsekxuWmhiSFZsY3lrcElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhSb2FYTXVkbUZzZFdWeklEMGdXM1JvYVhNdWRtRnNkV1Z6WFR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NWZiVzlrWlNBOUlHMXZaR1U3WEhKY2JpQWdJQ0FnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaUE5SUhCdmMybDBhVzl1TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0IwYUdsekxtUnlkVzVyVjJGc2F5QTlJRzVsZHlCRWNuVnVheWd3TENCMGFHbHpMblpoYkhWbGN5NXNaVzVuZEdnZ0xTQXhLVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdkR2hwY3k1emRHRnlkRlpoYkhWbGN5QTlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDZDFjQ2M2SURBc1hISmNiaUFnSUNBZ0lDQWdJQ0FuWkc5M2JpYzZJSFJvYVhNdWRtRnNkV1Z6TG14bGJtZDBhQ0F0SURFc1hISmNiaUFnSUNBZ0lDQWdJQ0FuWkhKMWJtc25PaUIrZmloMGFHbHpMblpoYkhWbGN5NXNaVzVuZEdndk1pa3NYSEpjYmlBZ0lDQWdJQ0FnSUNBbmNtRnVaRzl0SnpvZ2JXRjBhQzV5YVNoMGFHbHpMblpoYkhWbGN5NXNaVzVuZEdncFhISmNiaUFnSUNBZ0lDQWdmVHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXVjRzl6YVhScGIyNGhQVDFtWVd4elpTa2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTV1WlhoMElEMGdkR2hwYzF0MGFHbHpMbDl0YjJSbFhUdGNjbHh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RHaHBjeTV1WlhoMElEMGdkR2hwY3k1bWFYSnpkRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNibHh5WEc1Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQm5aWFFnYlc5a1pTZ3BJSHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdVgyMXZaR1U3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ2MyVjBJRzF2WkdVb2JXOWtaU2tnZTF4eVhHNGdJQ0FnSUNBZ0lHbG1JQ2doS0cxdlpHVWdQVDA5SUNkMWNDY2dmSHdnYlc5a1pTQTlQVDBnSjJSdmQyNG5JSHg4SUcxdlpHVWdQVDA5SUNkeVlXNWtiMjBuSUh4OElHMXZaR1VnUFQwOUlDZGtjblZ1YXljcEtTQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZibk52YkdVdVpYSnliM0lvSjFSb1pTQnZibXg1SUcxdlpHVnpJR04xY25KbGJuUnNlU0JoYkd4dmQyVmtJR0Z5WlRvZ2RYQXNJR1J2ZDI0c0lISmhibVJ2YlN3Z1pISjFibXNuS1R0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ0lDQjBhR2x6TGw5dGIyUmxJRDBnYlc5a1pUdGNjbHh1SUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV3YjNOcGRHbHZiaWtnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkR2hwY3k1dVpYaDBJRDBnZEdocGMxdDBhR2x6TGw5dGIyUmxYVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdaMlYwSUhaaGJIVmxLQ2tnZTF4eVhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NTJZV3gxWlhOYmRHaHBjeTV3YjNOcGRHbHZibDA3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ2MyVjBJSFpoYkhWbEtIWXBJSHRjY2x4dUlDQWdJQ0FnZEdocGN5NXdiM05wZEdsdmJpQTlJSFJvYVhNdWRtRnNkV1Z6TG1sdVpHVjRUMllvZGlrN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdabWx5YzNRb0tTQjdYSEpjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbkJ2YzJsMGFXOXVJVDA5Wm1Gc2MyVXBJSHRjY2x4dUlDQWdJQ0FnSUNCMGFHbHpMbTVsZUhRZ1BTQjBhR2x6VzNSb2FYTXVYMjF2WkdWZE8xeHlYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG01bGVIUW9LVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCMGFHbHpMbkJ2YzJsMGFXOXVJRDBnZEdocGN5NXpkR0Z5ZEZaaGJIVmxjMXQwYUdsekxsOXRiMlJsWFR0Y2NseHVJQ0FnSUNBZ2RHaHBjeTV1WlhoMElEMGdkR2hwYzF0MGFHbHpMbDl0YjJSbFhUdGNjbHh1SUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11ZG1Gc2RXVTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnZFhBb0tTQjdYSEpjYmlBZ0lDQWdJSFJvYVhNdWNHOXphWFJwYjI0ckt6dGNjbHh1SUNBZ0lDQWdkR2hwY3k1d2IzTnBkR2x2YmlBbFBTQjBhR2x6TG5aaGJIVmxjeTVzWlc1bmRHZzdYSEpjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5aaGJIVmxPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUdSdmQyNG9LU0I3WEhKY2JpQWdJQ0FnSUhSb2FYTXVjRzl6YVhScGIyNHRMVHRjY2x4dUlDQWdJQ0FnYVdZZ0tIUm9hWE11Y0c5emFYUnBiMjRnUENBd0tTQjdYSEpjYmlBZ0lDQWdJQ0FnZEdocGN5NXdiM05wZEdsdmJpQTlJQ2gwYUdsekxuQnZjMmwwYVc5dUlDc2dkR2hwY3k1MllXeDFaWE11YkdWdVozUm9LU0FsSUhSb2FYTXVkbUZzZFdWekxteGxibWQwYUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQnlaWFIxY200Z2RHaHBjeTUyWVd4MVpUdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0J5WVc1a2IyMG9LU0I3WEhKY2JpQWdJQ0FnSUhSb2FYTXVjRzl6YVhScGIyNGdQU0J0WVhSb0xuSnBLREFzSUhSb2FYTXVkbUZzZFdWekxteGxibWQwYUNrN1hISmNiaUFnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMblpoYkhWbE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJR1J5ZFc1cktDa2dlMXh5WEc0Z0lDQWdJQ0IwYUdsekxtUnlkVzVyVjJGc2F5NXRZWGdnUFNCMGFHbHpMblpoYkhWbGN5NXNaVzVuZEdnN1hISmNiaUFnSUNBZ0lIUm9hWE11WkhKMWJtdFhZV3hyTG5aaGJIVmxJRDBnZEdocGN5NXdiM05wZEdsdmJqdGNjbHh1SUNBZ0lDQWdkR2hwY3k1d2IzTnBkR2x2YmlBOUlIUm9hWE11WkhKMWJtdFhZV3hyTG01bGVIUW9LVHRjY2x4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWRtRnNkV1U3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0x5b2dablYwZFhKbElHMWxkR2h2WkhOY2NseHVJQ0FnSUM1bmNtOTFjQ2h6ZEdGeWRDeHpkRzl3S1NBdExTQnZkWFJ3ZFhSeklHRWdaM0p2ZFhBZ2IyWWdiaUJwZEdWdGN5Qm1jbTl0SUhSb1pTQnNhWE4wTENCM2FYUm9JSGR5WVhCd2FXNW5YSEpjYmlBZ0lDQXViRzl2Y0NoemRHRnlkQ3h6ZEc5d0tTQXRMU0JqYjI1bWFXNWxjeUJ6WlhGMVpXNWphVzVuSUhSdklHRWdjM1ZpYzJWMElHOW1JSFJvWlNCMllXeDFaWE5jY2x4dUlDQWdJQ0FnSUNBb1kyOTFiR1FnWlhabGJpQm9ZWFpsSUdFZ1pHbHpkR2x1WTNScGIyNGdZbVYwZDJWbGJpQXViM0pwWjJsdVlXeFdZV3gxWlhNZ1lXNWtJSFJvWlNCaGNuSmhlU0J2WmlCMllXeDFaWE1nWW1WcGJtY2dkWE5sWkNsY2NseHVJQ0FnSUNvdlhISmNibjFjY2x4dVhHNWNibHh1THk4Z1YwVkNVRUZEU3lCR1QwOVVSVklnTHk5Y2JpOHZJQzR2Zmk5cWMyaHBiblF0Ykc5aFpHVnlJUzR2YkdsaUwyMXZaR1ZzY3k5elpYRjFaVzVqWlM1cWN5SXNJaWQxYzJVZ2MzUnlhV04wSnp0Y2JseHVhVzF3YjNKMElHMWhkR2dnWm5KdmJTQW5MaTR2ZFhScGJDOXRZWFJvSnp0Y2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1kyeGhjM01nUkhKMWJtc2dlMXh1WEc0Z0lDQWdZMjl1YzNSeWRXTjBiM0lvYldsdVBUQXNJRzFoZUQwNUxDQjJZV3gxWlQwd0xDQnBibU55WlcxbGJuUTlNU3dnYkc5dmNEMW1ZV3h6WlNrZ2UxeHVJQ0FnSUNBZ0lDQjBhR2x6TG0xcGJpQTlJRzFwYmp0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV0WVhnZ1BTQnRZWGc3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkbUZzZFdVZ1BTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVwYm1OeVpXMWxiblFnUFNCcGJtTnlaVzFsYm5RN1hHNGdJQ0FnSUNBZ0lIUm9hWE11Ykc5dmNDQTlJR3h2YjNBN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnYm1WNGRDZ3BJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTJZV3gxWlNBclBTQnRZWFJvTG5CcFkyc29MVEVnS2lCMGFHbHpMbWx1WTNKbGJXVnVkQ3dnZEdocGN5NXBibU55WlcxbGJuUXBPMXh1SUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTUyWVd4MVpTQStJSFJvYVhNdWJXRjRLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQnBaaUFvZEdocGN5NXNiMjl3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTUyWVd4MVpTQTlJSFJvYVhNdWJXbHVPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdkR2hwY3k1dFlYZ2dMU0IwYUdsekxtbHVZM0psYldWdWREdGNiaUFnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJR2xtSUNoMGFHbHpMblpoYkhWbElEd2dkR2hwY3k1dGFXNHBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2gwYUdsekxteHZiM0FwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdkR2hwY3k1dFlYZzdYRzRnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXVkbUZzZFdVZ1BTQjBhR2x6TG0xcGJpQXJJSFJvYVhNdWFXNWpjbVZ0Wlc1ME8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMblpoYkhWbE8xeHVJQ0FnSUgxY2JuMWNibHh1WEc1Y2JpOHZJRmRGUWxCQlEwc2dSazlQVkVWU0lDOHZYRzR2THlBdUwzNHZhbk5vYVc1MExXeHZZV1JsY2lFdUwyeHBZaTl0YjJSbGJITXZaSEoxYm1zdWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibWx0Y0c5eWRDQnRZWFJvSUdaeWIyMGdKeTR1TDNWMGFXd3ZiV0YwYUNjN1hHNXBiWEJ2Y25RZ1JISjFibXNnWm5KdmJTQW5MaTlrY25WdWF5YzdYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR05zWVhOeklFTnZkVzUwWlhJZ2UxeHVYRzRnSUNBZ1kyOXVjM1J5ZFdOMGIzSW9iV2x1UFRBc0lHMWhlRDB4TUN3Z2JXOWtaVDBuZFhBbkxDQjJZV3gxWlQxbVlXeHpaU2tnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbTFwYmlBOUlHMXBianRjYmlBZ0lDQWdJQ0FnZEdocGN5NXRZWGdnUFNCdFlYZzdYRzRnSUNBZ0lDQWdJSFJvYVhNdWRtRnNkV1VnUFNCMllXeDFaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXRiMlJsSUQwZ2JXOWtaVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWtjblZ1YTFkaGJHc2dQU0J1WlhjZ1JISjFibXNvZEdocGN5NXRhVzRzSUhSb2FYTXViV0Y0S1R0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWRtRnNkV1VoUFQxbVlXeHpaU2tnZTF4dUlDQWdJQ0FnSUNBZ0lIUm9hWE11Ym1WNGRDQTlJSFJvYVhOYmRHaHBjeTVmYlc5a1pWMDdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnZEdocGN5NXVaWGgwSUQwZ2RHaHBjeTVtYVhKemREdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lITmxkQ0J0YjJSbEtHMXZaR1VwSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLQ0VvYlc5a1pTQTlQVDBnSjNWd0p5QjhmQ0J0YjJSbElEMDlQU0FuWkc5M2JpY2dmSHdnYlc5a1pTQTlQVDBnSjNKaGJtUnZiU2NnZkh3Z2JXOWtaU0E5UFQwZ0oyUnlkVzVySnlrcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOdmJuTnZiR1V1WlhKeWIzSW9KMVJvWlNCdmJteDVJRzF2WkdWeklHTjFjbkpsYm5Sc2VTQmhiR3h2ZDJWa0lHRnlaVG9nZFhBc0lHUnZkMjRzSUhKaGJtUnZiU3dnWkhKMWJtc25LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQjBhR2x6TGw5dGIyUmxJRDBnYlc5a1pUdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXVkbUZzZFdVcElIdGNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxtNWxlSFFnUFNCMGFHbHpXM1JvYVhNdVgyMXZaR1ZkTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnWjJWMElHMXZaR1VvS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMbDl0YjJSbE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdacGNuTjBLQ2tnZTF4dUlDQWdJQ0FnYVdZZ0tIUm9hWE11ZG1Gc2RXVWhQVDFtWVd4elpTa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtNWxlSFFnUFNCMGFHbHpXM1JvYVhNdVgyMXZaR1ZkTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NXVaWGgwS0NrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCMGFHbHpMbk4wWVhKMFZtRnNkV1Z6SUQwZ2UxeHVJQ0FnSUNBZ0lDQW5kWEFuT2lCMGFHbHpMbTFwYml4Y2JpQWdJQ0FnSUNBZ0oyUnZkMjRuT2lCMGFHbHpMbTFoZUN4Y2JpQWdJQ0FnSUNBZ0oyUnlkVzVySnpvZ2ZuNXRZWFJvTG1GMlpYSmhaMlVvZEdocGN5NXRhVzRzZEdocGN5NXRZWGdwTEZ4dUlDQWdJQ0FnSUNBbmNtRnVaRzl0SnpvZ2JXRjBhQzV5YVNoMGFHbHpMbTFwYml4MGFHbHpMbTFoZUNsY2JpQWdJQ0FnSUgwN1hHNGdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdkR2hwY3k1emRHRnlkRlpoYkhWbGMxdDBhR2x6TGw5dGIyUmxYVHRjYmlBZ0lDQWdJSFJvYVhNdWJtVjRkQ0E5SUhSb2FYTmJkR2hwY3k1ZmJXOWtaVjA3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1MllXeDFaVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjFjQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTUyWVd4MVpTc3JPMXh1SUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTUyWVd4MVpTQStQU0IwYUdsekxtMWhlQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1MllXeDFaU0E5SUhSb2FYTXViV2x1TzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCMGFHbHpMblpoYkhWbE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUdSdmQyNG9LU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVkbUZzZFdVdExUdGNiaUFnSUNBZ0lDQWdhV1lnS0hSb2FYTXVkbUZzZFdVZ1BDQjBhR2x6TG0xcGJpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTUyWVd4MVpTQTlJSFJvYVhNdWJXRjRPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuWmhiSFZsTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEpoYm1SdmJTZ3BJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NTJZV3gxWlNBOUlHMWhkR2d1Y21rb2RHaHBjeTV0YVc0c0lIUm9hWE11YldGNEtUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9hWE11ZG1Gc2RXVTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ1pISjFibXNvS1NCN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WkhKMWJtdFhZV3hyTG0xcGJpQTlJSFJvYVhNdWJXbHVPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtUnlkVzVyVjJGc2F5NXRZWGdnUFNCMGFHbHpMbTFoZUR0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVrY25WdWExZGhiR3N1ZG1Gc2RXVWdQU0IwYUdsekxuWmhiSFZsTzF4dUlDQWdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdkR2hwY3k1a2NuVnVhMWRoYkdzdWJtVjRkQ2dwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NTJZV3gxWlR0Y2JpQWdJQ0I5WEc1OVhHNWNibHh1WEc0dkx5QlhSVUpRUVVOTElFWlBUMVJGVWlBdkwxeHVMeThnTGk5K0wycHphR2x1ZEMxc2IyRmtaWEloTGk5c2FXSXZiVzlrWld4ekwyTnZkVzUwWlhJdWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibXhsZENCemRtY2dQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNMM04yWnljcE8xeHViR1YwSUcxaGRHZ2dQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNMMjFoZEdnbktUdGNibXhsZENCSmJuUmxjbVpoWTJVZ1BTQnlaWEYxYVhKbEtDY3VMaTlqYjNKbEwybHVkR1Z5Wm1GalpTY3BPMXh1YkdWMElGTjBaWEFnUFNCeVpYRjFhWEpsS0NjdUxpOXRiMlJsYkhNdmMzUmxjQ2NwTzF4dWFXMXdiM0owSUNvZ1lYTWdTVzUwWlhKaFkzUnBiMjRnWm5KdmJTQW5MaTR2ZFhScGJDOXBiblJsY21GamRHbHZiaWM3WEc1Y2JpOHFLbHh1S2lCUVlXNHlSRnh1S2x4dUtpQkFaR1Z6WTNKcGNIUnBiMjRnU1c1MFpYSm1ZV05sSUdadmNpQnRiM1pwYm1jZ1lTQnpiM1Z1WkNCaGNtOTFibVFnWVc0Z1lYSnlZWGtnYjJZZ2MzQmxZV3RsY25NdUlGTndaV0ZyWlhJZ2JHOWpZWFJwYjI1eklHTmhiaUJpWlNCamRYTjBiMjFwZW1Wa0xpQlVhR1VnYVc1MFpYSm1ZV05sSUdOaGJHTjFiR0YwWlhNZ2RHaGxJR05zYjNObGJtVnpjeUJ2WmlCMGFHVWdjMjkxYm1RZ2MyOTFjbU5sSUhSdklHVmhZMmdnYzNCbFlXdGxjaUJoYm1RZ2NtVjBkWEp1Y3lCMGFHRjBJR1JwYzNSaGJtTmxJR0Z6SUdFZ2JuVnRaWEpwWXlCMllXeDFaUzVjYmlwY2Jpb2dRR1JsYlc4Z1BITndZVzRnYm1WNGRYTXRkV2s5WENKd1lXNHlSRndpUGp3dmMzQmhiajVjYmlwY2Jpb2dRR1Y0WVcxd2JHVmNiaW9nZG1GeUlIQmhiakprSUQwZ2JtVjNJRTVsZUhWekxsQmhiakprS0NjamRHRnlaMlYwSnlsY2JpcGNiaW9nUUdWNFlXMXdiR1ZjYmlvZ2RtRnlJSEJoYmpKa0lEMGdibVYzSUU1bGVIVnpMbEJoYmpKRUtDY2pkR0Z5WjJWMEp5eDdYRzRxSUNBZ0ozTnBlbVVuT2lCYk1qQXdMREl3TUYwc1hHNHFJQ0FnSjNKaGJtZGxKem9nTUM0MUxDQWdMeThnWkdWMFpXTjBhVzl1SUhKaFpHbDFjeUJ2WmlCbFlXTm9JSE53WldGclpYSmNiaW9nSUNBbmJXOWtaU2M2SUNkaFluTnZiSFYwWlNjc0lDQWdMeThnSjJGaWMyOXNkWFJsSnlCdmNpQW5jbVZzWVhScGRtVW5JSE52ZFc1a0lHMXZkbVZ0Wlc1MFhHNHFJQ0FnSjNOd1pXRnJaWEp6SnpvZ1d5QWdMeThnZEdobElITndaV0ZyWlhJZ1czZ3NlVjBnY0c5emFYUnBiMjV6WEc0cUlDQWdJQ0FnSUZzd0xqVXNNQzR5WFN4Y2Jpb2dJQ0FnSUNBZ1d6QXVOelVzTUM0eU5WMHNYRzRxSUNBZ0lDQWdJRnN3TGpnc01DNDFYU3hjYmlvZ0lDQWdJQ0FnV3pBdU56VXNNQzQzTlYwc1hHNHFJQ0FnSUNBZ0lGc3dMalVzTUM0NFhTeGNiaW9nSUNBZ0lDQWdXekF1TWpVc01DNDNOVjFjYmlvZ0lDQWdJQ0FnV3pBdU1pd3dMalZkTEZ4dUtpQWdJQ0FnSUNCYk1DNHlOU3d3TGpJMVhWeHVLaUFnSUYxY2Jpb2dmU2xjYmlwY2Jpb2dRRzkxZEhCMWRGeHVLaUJqYUdGdVoyVmNiaW9nUm1seVpYTWdZVzU1SUhScGJXVWdkR2hsSUZ3aWMyOTFjbU5sWENJZ2JtOWtaU2R6SUhCdmMybDBhVzl1SUdOb1lXNW5aWE11SUR4aWNqNWNiaW9nVkdobElHVjJaVzUwSUdSaGRHRWdhWE1nWVc0Z1lYSnlZWGtnYjJZZ2RHaGxJR0Z0Y0d4cGRIVmtaWE1nS0RBdE1Ta3NJSEpsY0hKbGMyVnVkR2x1WnlCMGFHVWdiR1YyWld3Z2IyWWdaV0ZqYUNCemNHVmhhMlZ5SUNoaGN5QmpZV3hqZFd4aGRHVmtJR0o1SUdsMGN5QmthWE4wWVc1alpTQjBieUIwYUdVZ1lYVmthVzhnYzI5MWNtTmxLUzVjYmlwY2Jpb2dRRzkxZEhCMWRHVjRZVzF3YkdWY2Jpb2djR0Z1TW1RdWIyNG9KMk5vWVc1blpTY3NablZ1WTNScGIyNG9kaWtnZTF4dUtpQWdJR052Ym5OdmJHVXViRzluS0hZcE8xeHVLaUI5S1Z4dUtseHVLaTljYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnWTJ4aGMzTWdVR0Z1TWtRZ1pYaDBaVzVrY3lCSmJuUmxjbVpoWTJVZ2UxeHVYRzRnSUdOdmJuTjBjblZqZEc5eUtDa2dlMXh1WEc0Z0lDQWdiR1YwSUc5d2RHbHZibk1nUFNCYkozSmhibWRsSjEwN1hHNWNiaUFnSUNCc1pYUWdaR1ZtWVhWc2RITWdQU0I3WEc0Z0lDQWdJQ0FuYzJsNlpTYzZJRnN5TURBc01qQXdYU3hjYmlBZ0lDQWdJQ2R5WVc1blpTYzZJREF1TlN4Y2JpQWdJQ0FnSUNkdGIyUmxKem9nSjJGaWMyOXNkWFJsSnl4Y2JpQWdJQ0FnSUNkemNHVmhhMlZ5Y3ljNklGdGNiaUFnSUNBZ0lDQWdXekF1TlN3d0xqSmRMRnh1SUNBZ0lDQWdJQ0JiTUM0M05Td3dMakkxWFN4Y2JpQWdJQ0FnSUNBZ1d6QXVPQ3d3TGpWZExGeHVJQ0FnSUNBZ0lDQmJNQzQzTlN3d0xqYzFYU3hjYmlBZ0lDQWdJQ0FnV3pBdU5Td3dMamhkTEZ4dUlDQWdJQ0FnSUNCYk1DNHlOU3d3TGpjMVhTeGNiaUFnSUNBZ0lDQWdXekF1TWl3d0xqVmRMRnh1SUNBZ0lDQWdJQ0JiTUM0eU5Td3dMakkxWFZ4dUlDQWdJQ0FnWFZ4dUlDQWdJSDA3WEc1Y2JpQWdJQ0J6ZFhCbGNpaGhjbWQxYldWdWRITXNiM0IwYVc5dWN5eGtaV1poZFd4MGN5azdYRzVjYmlBZ0lDQjBhR2x6TG5aaGJIVmxJRDBnZTF4dUlDQWdJQ0FnZURvZ2JtVjNJRk4wWlhBb01Dd3hMREFzTUM0MUtTeGNiaUFnSUNBZ0lIazZJRzVsZHlCVGRHVndLREFzTVN3d0xEQXVOU2xjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdMeW9xWEc0Z0lDQWdRV0p6YjJ4MWRHVWdiM0lnY21Wc1lYUnBkbVVnYlc5MWMyVWdhVzUwWlhKaFkzUnBiMjR1SUVsdUlGd2lZV0p6YjJ4MWRHVmNJaUJ0YjJSbExDQjBhR1VnYzI5MWNtTmxJRzV2WkdVZ2QybHNiQ0JxZFcxd0lIUnZJSGx2ZFhJZ2JXOTFjMlVnY0c5emFYUnBiMjRnYjI0Z2JXOTFjMlVnWTJ4cFkyc3VJRWx1SUZ3aWNtVnNZWFJwZG1WY0lpQnRiMlJsTENCcGRDQmtiMlZ6SUc1dmRDNWNiaUFnSUNBcUwxeHVJQ0FnSUhSb2FYTXViVzlrWlNBOUlIUm9hWE11YzJWMGRHbHVaM011Ylc5a1pUdGNibHh1SUNBZ0lIUm9hWE11Y0c5emFYUnBiMjRnUFNCN1hHNGdJQ0FnSUNCNE9pQnVaWGNnU1c1MFpYSmhZM1JwYjI0dVNHRnVaR3hsS0hSb2FYTXViVzlrWlN3bmFHOXlhWHB2Ym5SaGJDY3NXekFzZEdocGN5NTNhV1IwYUYwc1czUm9hWE11YUdWcFoyaDBMREJkS1N4Y2JpQWdJQ0FnSUhrNklHNWxkeUJKYm5SbGNtRmpkR2x2Ymk1SVlXNWtiR1VvZEdocGN5NXRiMlJsTENkMlpYSjBhV05oYkNjc1d6QXNkR2hwY3k1M2FXUjBhRjBzVzNSb2FYTXVhR1ZwWjJoMExEQmRLVnh1SUNBZ0lIMDdYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaTU0TG5aaGJIVmxJRDBnZEdocGN5NTJZV3gxWlM1NExtNXZjbTFoYkdsNlpXUTdYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaTU1TG5aaGJIVmxJRDBnZEdocGN5NTJZV3gxWlM1NUxtNXZjbTFoYkdsNlpXUTdYRzVjYmlBZ0lDQXZLaXBjYmlBZ0lDQkJiaUJoY25KaGVTQnZaaUJ6Y0dWaGEyVnlJR3h2WTJGMGFXOXVjeTRnVlhCa1lYUmxJSFJvYVhNZ2QybDBhQ0F1Ylc5MlpWTndaV0ZyWlhJb0tTQnZjaUF1Ylc5MlpVRnNiRk53WldGclpYSnpLQ2xjYmlBZ0lDQXFMMXh1SUNBZ0lIUm9hWE11YzNCbFlXdGxjbk1nUFNCMGFHbHpMbk5sZEhScGJtZHpMbk53WldGclpYSnpPMXh1WEc0Z0lDQWdMeW9xWEc0Z0lDQWdVbVYzY21sMFpUb2dWR2hsSUcxaGVHbHRkVzBnWkdsemRHRnVZMlVnWm5KdmJTQmhJSE53WldGclpYSWdkR2hoZENCMGFHVWdjMjkxY21ObElHNXZaR1VnWTJGdUlHSmxJR1p2Y2lCcGRDQjBieUJpWlNCb1pXRnlaQ0JtY205dElIUm9ZWFFnYzNCbFlXdGxjaTRnUVNCc2IzY2djbUZ1WjJVZ0tEQXVNU2tnZDJsc2JDQnlaWE4xYkhRZ2FXNGdjM0JsWVd0bGNuTWdiMjVzZVNCd2JHRjVhVzVuSUhkb1pXNGdkR2hsSUhOdmRXNWtJR2x6SUhabGNua2dZMnh2YzJVZ2FYUXVJRVJsWm1GMWJIUWdhWE1nTUM0MUlDaG9ZV3htSUc5bUlIUm9aU0JwYm5SbGNtWmhZMlVwTGx4dUlDQWdJQ292WEc0Z0lDQWdkR2hwY3k1eVlXNW5aU0E5SUhSb2FYTXVjMlYwZEdsdVozTXVjbUZ1WjJVN1hHNWNiaUFnSUNBdktpcGNiaUFnSUNCVWFHVWdZM1Z5Y21WdWRDQnNaWFpsYkhNZ1ptOXlJR1ZoWTJnZ2MzQmxZV3RsY2k0Z1ZHaHBjeUJwY3lCallXeGpkV3hoZEdWa0lIZG9aVzRnWVNCemIzVnlZMlVnYm05a1pTQnZjaUJ6Y0dWaGEyVnlJRzV2WkdVZ2FYTWdiVzkyWldRZ2RHaHliM1ZuYUNCcGJuUmxjbUZqZEdsdmJpQnZjaUJ3Y205bmNtRnRZWFJwWTJGc2JIa3VYRzRnSUNBZ0tpOWNiaUFnSUNCMGFHbHpMbXhsZG1Wc2N5QTlJRnRkTzF4dVhHNGdJQ0FnZEdocGN5NXBibWwwS0NrN1hHNWNiaUFnSUNCMGFHbHpMbU5oYkdOMWJHRjBaVXhsZG1Wc2N5Z3BPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrU1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzRnSUNBZ2RHaHBjeTVyYm05aUlEMGdjM1puTG1OeVpXRjBaU2duWTJseVkyeGxKeWs3WEc1Y2JseHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNWhjSEJsYm1SRGFHbHNaQ2gwYUdsekxtdHViMklwTzF4dVhHNWNiaUFnSUNBdkx5QmhaR1FnYzNCbFlXdGxjbk5jYmlBZ0lDQjBhR2x6TG5Od1pXRnJaWEpGYkdWdFpXNTBjeUE5SUZ0ZE8xeHVYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FUMHdPMms4ZEdocGN5NXpjR1ZoYTJWeWN5NXNaVzVuZEdnN2FTc3JLU0I3WEc0Z0lDQWdJQ0JzWlhRZ2MzQmxZV3RsY2tWc1pXMWxiblFnUFNCemRtY3VZM0psWVhSbEtDZGphWEpqYkdVbktUdGNibHh1SUNBZ0lDQWdkR2hwY3k1bGJHVnRaVzUwTG1Gd2NHVnVaRU5vYVd4a0tITndaV0ZyWlhKRmJHVnRaVzUwS1R0Y2JseHVJQ0FnSUNBZ2RHaHBjeTV6Y0dWaGEyVnlSV3hsYldWdWRITXVjSFZ6YUNoemNHVmhhMlZ5Uld4bGJXVnVkQ2s3WEc0Z0lDQWdmVnh1WEc0Z0lIMWNibHh1SUNCemFYcGxTVzUwWlhKbVlXTmxLQ2tnZTF4dVhHNGdJQ0FnSUNBZ0lIUm9hWE11WDIxcGJrUnBiV1Z1YzJsdmJpQTlJRTFoZEdndWJXbHVLSFJvYVhNdWQybGtkR2dzZEdocGN5NW9aV2xuYUhRcE8xeHVYRzRnSUNBZ0lDQWdJSFJvYVhNdWEyNXZZbEpoWkdsMWN5QTlJSHRjYmlBZ0lDQWdJQ0FnSUNCdlptWTZJSDUrS0hSb2FYTXVYMjFwYmtScGJXVnVjMmx2Ymk4eE1EQXBJQ29nTXlBcklEVXNYRzRnSUNBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhMjV2WWxKaFpHbDFjeTV2YmlBOUlIUm9hWE11YTI1dllsSmhaR2wxY3k1dlptWWdLaUF5TzF4dVhHNGdJQ0FnSUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjJONEp5eDBhR2x6TG5kcFpIUm9MeklwTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbXR1YjJJdWMyVjBRWFIwY21saWRYUmxLQ2RqZVNjc2RHaHBjeTVvWldsbmFIUXZNaWs3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhMjV2WWk1elpYUkJkSFJ5YVdKMWRHVW9KM0luTEhSb2FYTXVhMjV2WWxKaFpHbDFjeTV2Wm1ZcE8xeHVYRzRnSUNBZ0lDQWdJR1p2Y2lBb2JHVjBJR2s5TUR0cFBIUm9hWE11YzNCbFlXdGxjbk11YkdWdVozUm9PMmtyS3lrZ2UxeHVJQ0FnSUNBZ0lDQWdJR3hsZENCemNHVmhhMlZ5Uld4bGJXVnVkQ0E5SUhSb2FYTXVjM0JsWVd0bGNrVnNaVzFsYm5SelcybGRPMXh1SUNBZ0lDQWdJQ0FnSUd4bGRDQnpjR1ZoYTJWeUlEMGdkR2hwY3k1emNHVmhhMlZ5YzF0cFhUdGNiaUFnSUNBZ0lDQWdJQ0J6Y0dWaGEyVnlSV3hsYldWdWRDNXpaWFJCZEhSeWFXSjFkR1VvSjJONEp5eHpjR1ZoYTJWeVd6QmRLblJvYVhNdWQybGtkR2dwTzF4dUlDQWdJQ0FnSUNBZ0lITndaV0ZyWlhKRmJHVnRaVzUwTG5ObGRFRjBkSEpwWW5WMFpTZ25ZM2tuTEhOd1pXRnJaWEpiTVYwcWRHaHBjeTVvWldsbmFIUXBPMXh1SUNBZ0lDQWdJQ0FnSUhOd1pXRnJaWEpGYkdWdFpXNTBMbk5sZEVGMGRISnBZblYwWlNnbmNpY3NkR2hwY3k1ZmJXbHVSR2x0Wlc1emFXOXVMekl3SUNzZ05TazdYRzRnSUNBZ0lDQWdJQ0FnYzNCbFlXdGxja1ZzWlcxbGJuUXVjMlYwUVhSMGNtbGlkWFJsS0NkbWFXeHNMVzl3WVdOcGRIa25MQ0FuTUNjcE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJSFJvYVhNdWNHOXphWFJwYjI0dWVDNXlaWE5wZW1Vb1d6QXNkR2hwY3k1M2FXUjBhRjBzVzNSb2FYTXVhR1ZwWjJoMExEQmRLVHRjYmlBZ0lDQWdJSFJvYVhNdWNHOXphWFJwYjI0dWVTNXlaWE5wZW1Vb1d6QXNkR2hwY3k1M2FXUjBhRjBzVzNSb2FYTXVhR1ZwWjJoMExEQmRLVHRjYmx4dUlDQWdJQ0FnSUNBdkx5QnVaWGgwTENCdVpXVmtJSFJ2WEc0Z0lDQWdJQ0FnSUM4dklISmxjMmw2WlNCd2IzTnBkR2x2Ym5OY2JpQWdJQ0FnSUNBZ0x5OGdZMkZzWTNWc1lYUmxJSE53WldGclpYSWdaR2x6ZEdGdVkyVnpYRzRnSUNBZ0lDQjBhR2x6TG1OaGJHTjFiR0YwWlV4bGRtVnNjeWdwTzF4dUlDQWdJQ0FnZEdocGN5NXlaVzVrWlhJb0tUdGNibHh1SUNCOVhHNWNiaUFnWTI5c2IzSkpiblJsY21aaFkyVW9LU0I3WEc1Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWMzUjViR1V1WW1GamEyZHliM1Z1WkVOdmJHOXlJRDBnZEdocGN5NWpiMnh2Y25NdVptbHNiRHRjYmlBZ0lDQjBhR2x6TG10dWIySXVjMlYwUVhSMGNtbGlkWFJsS0NkbWFXeHNKeXdnZEdocGN5NWpiMnh2Y25NdWJXVmthWFZ0VEdsbmFIUXBPMXh1WEc0Z0lDQWdabTl5SUNoc1pYUWdhVDB3TzJrOGRHaHBjeTV6Y0dWaGEyVnljeTVzWlc1bmRHZzdhU3NyS1NCN1hHNGdJQ0FnSUNCc1pYUWdjM0JsWVd0bGNrVnNaVzFsYm5RZ1BTQjBhR2x6TG5Od1pXRnJaWEpGYkdWdFpXNTBjMXRwWFR0Y2JpQWdJQ0FnSUhOd1pXRnJaWEpGYkdWdFpXNTBMbk5sZEVGMGRISnBZblYwWlNnblptbHNiQ2NzSUhSb2FYTXVZMjlzYjNKekxtRmpZMlZ1ZENrN1hHNGdJQ0FnSUNCemNHVmhhMlZ5Uld4bGJXVnVkQzV6WlhSQmRIUnlhV0oxZEdVb0ozTjBjbTlyWlNjc0lIUm9hWE11WTI5c2IzSnpMbUZqWTJWdWRDazdYRzRnSUNBZ2ZWeHVYRzRnSUgxY2JseHVJQ0J5Wlc1a1pYSW9LU0I3WEc0Z0lDQWdkR2hwY3k1cmJtOWlRMjl2Y21ScGJtRjBaWE1nUFNCN1hHNGdJQ0FnSUNCNE9pQjBhR2x6TG5aaGJIVmxMbmd1Ym05eWJXRnNhWHBsWkNBcUlIUm9hWE11ZDJsa2RHZ3NYRzRnSUNBZ0lDQjVPaUIwYUdsekxtaGxhV2RvZENBdElIUm9hWE11ZG1Gc2RXVXVlUzV1YjNKdFlXeHBlbVZrSUNvZ2RHaHBjeTVvWldsbmFIUmNiaUFnSUNCOU8xeHVYRzRnSUNBZ2RHaHBjeTVyYm05aUxuTmxkRUYwZEhKcFluVjBaU2duWTNnbkxIUm9hWE11YTI1dllrTnZiM0prYVc1aGRHVnpMbmdwTzF4dUlDQWdJSFJvYVhNdWEyNXZZaTV6WlhSQmRIUnlhV0oxZEdVb0oyTjVKeXgwYUdsekxtdHViMkpEYjI5eVpHbHVZWFJsY3k1NUtUdGNiaUFnZlZ4dVhHNWNiaUFnWTJ4cFkyc29LU0I3WEc0Z0lDQWdkR2hwY3k1d2IzTnBkR2x2Ymk1NExtRnVZMmh2Y2lBOUlIUm9hWE11Ylc5MWMyVTdYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaTU1TG1GdVkyaHZjaUE5SUhSb2FYTXViVzkxYzJVN1hHNGdJQ0FnZEdocGN5NXRiM1psS0NrN1hHNGdJSDFjYmx4dUlDQnRiM1psS0NrZ2UxeHVJQ0FnSUdsbUlDaDBhR2x6TG1Oc2FXTnJaV1FwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVjRzl6YVhScGIyNHVlQzUxY0dSaGRHVW9kR2hwY3k1dGIzVnpaU2s3WEc0Z0lDQWdJQ0IwYUdsekxuQnZjMmwwYVc5dUxua3VkWEJrWVhSbEtIUm9hWE11Ylc5MWMyVXBPMXh1SUNBZ0lDQWdMeThnY0c5emFYUnBiMjR1ZUNCaGJtUWdjRzl6YVhScGIyNHVlU0JoY21VZ2JtOXliV0ZzYVhwbFpGeHVJQ0FnSUNBZ0x5OGdjMjhnWVhKbElIUm9aU0JzWlhabGJITmNiaUFnSUNBZ0lDOHZJR3hwYTJWc2VTQmtiMjRuZENCdVpXVmtJSFJvYVhNdWRtRnNkV1VnWVhRZ1lXeHNJQzB0SUc5dWJIa2dkWE5sWkNCbWIzSWdaSEpoZDJsdVoxeHVJQ0FnSUNBZ0x5OGdibTkwSUdkdmFXNW5JSFJ2SUdKbElHRWdKM04wWlhBbklHOXlJQ2R0YVc0bklHRnVaQ0FuYldGNEp5QnBiaUIwYUdseklHOXVaUzVjYmlBZ0lDQWdJSFJvYVhNdVkyRnNZM1ZzWVhSbFRHVjJaV3h6S0NrN1hHNGdJQ0FnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc2RHaHBjeTVzWlhabGJITXBPMXh1SUNBZ0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCeVpXeGxZWE5sS0NrZ2UxeHVJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDazdYRzRnSUgxY2JseHVJQ0JuWlhRZ2JtOXliV0ZzYVhwbFpDZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z2UxeHVJQ0FnSUNBZ2VEb2dkR2hwY3k1MllXeDFaUzU0TG01dmNtMWhiR2w2WldRc1hHNGdJQ0FnSUNCNU9pQjBhR2x6TG5aaGJIVmxMbmt1Ym05eWJXRnNhWHBsWkZ4dUlDQWdJSDA3WEc0Z0lIMWNibHh1SUNCallXeGpkV3hoZEdWTVpYWmxiSE1vS1NCN1hHNGdJQ0FnZEdocGN5NTJZV3gxWlM1NExuVndaR0YwWlU1dmNtMWhiQ2dnZEdocGN5NXdiM05wZEdsdmJpNTRMblpoYkhWbElDazdYRzRnSUNBZ2RHaHBjeTUyWVd4MVpTNTVMblZ3WkdGMFpVNXZjbTFoYkNnZ2RHaHBjeTV3YjNOcGRHbHZiaTU1TG5aaGJIVmxJQ2s3WEc0Z0lDQWdkR2hwY3k1c1pYWmxiSE1nUFNCYlhUdGNiaUFnSUNCMGFHbHpMbk53WldGclpYSnpMbVp2Y2tWaFkyZ29LSE1zYVNrZ1BUNGdlMXh1SUNBZ0lDQWdiR1YwSUdScGMzUmhibU5sSUQwZ2JXRjBhQzVrYVhOMFlXNWpaU2h6V3pCZEtuUm9hWE11ZDJsa2RHZ3NjMXN4WFNwMGFHbHpMbWhsYVdkb2RDeDBhR2x6TG5CdmMybDBhVzl1TG5ndWRtRnNkV1VxZEdocGN5NTNhV1IwYUN3b01TMTBhR2x6TG5CdmMybDBhVzl1TG5rdWRtRnNkV1VwS25Sb2FYTXVhR1ZwWjJoMEtUdGNiaUFnSUNBZ0lHeGxkQ0JzWlhabGJDQTlJRzFoZEdndVkyeHBjQ2d4TFdScGMzUmhibU5sTHloMGFHbHpMbkpoYm1kbEtuUm9hWE11ZDJsa2RHZ3BMREFzTVNrN1hHNGdJQ0FnSUNCMGFHbHpMbXhsZG1Wc2N5NXdkWE5vS0d4bGRtVnNLVHRjYmlBZ0lDQWdJSFJvYVhNdWMzQmxZV3RsY2tWc1pXMWxiblJ6VzJsZExuTmxkRUYwZEhKcFluVjBaU2duWm1sc2JDMXZjR0ZqYVhSNUp5d2diR1YyWld3cE8xeHVJQ0FnSUgwcE8xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lFMXZkbVVnZEdobElHRjFaR2x2SUhOdmRYSmpaU0J1YjJSbElHRnVaQ0IwY21sbloyVnlJSFJvWlNCdmRYUndkWFFnWlhabGJuUXVYRzRnSUVCd1lYSmhiU0I0SUh0dWRXMWlaWEo5SUU1bGR5QjRJR3h2WTJGMGFXOXVMQ0J1YjNKdFlXeHBlbVZrSURBdE1WeHVJQ0JBY0dGeVlXMGdlU0I3Ym5WdFltVnlmU0JPWlhjZ2VTQnNiMk5oZEdsdmJpd2dibTl5YldGc2FYcGxaQ0F3TFRGY2JpQWdLaTljYmlBZ2JXOTJaVk52ZFhKalpTaDRMSGtwSUh0Y2JpQWdJQ0JzWlhRZ2JHOWpZWFJwYjI0Z1BTQjdYRzRnSUNBZ0lDQjRPaUI0S25Sb2FYTXVkMmxrZEdnc1hHNGdJQ0FnSUNCNU9pQjVLblJvYVhNdWFHVnBaMmgwWEc0Z0lDQWdmVHRjYmlBZ0lDQjBhR2x6TG5CdmMybDBhVzl1TG5ndWRYQmtZWFJsS0d4dlkyRjBhVzl1S1R0Y2JpQWdJQ0IwYUdsekxuQnZjMmwwYVc5dUxua3VkWEJrWVhSbEtHeHZZMkYwYVc5dUtUdGNiaUFnSUNCMGFHbHpMbU5oYkdOMWJHRjBaVXhsZG1Wc2N5Z3BPMXh1SUNBZ0lIUm9hWE11WlcxcGRDZ25ZMmhoYm1kbEp5eDBhR2x6TG14bGRtVnNjeWs3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNCTmIzWmxJR0VnYzNCbFlXdGxjaUJ1YjJSbElHRnVaQ0IwY21sbloyVnlJSFJvWlNCdmRYUndkWFFnWlhabGJuUXVYRzRnSUVCd1lYSmhiU0JwYm1SbGVDQjdiblZ0WW1WeWZTQkpibVJsZUNCdlppQjBhR1VnYzNCbFlXdGxjaUIwYnlCdGIzWmxYRzRnSUVCd1lYSmhiU0I0SUh0dWRXMWlaWEo5SUU1bGR5QjRJR3h2WTJGMGFXOXVMQ0J1YjNKdFlXeHBlbVZrSURBdE1WeHVJQ0JBY0dGeVlXMGdlU0I3Ym5WdFltVnlmU0JPWlhjZ2VTQnNiMk5oZEdsdmJpd2dibTl5YldGc2FYcGxaQ0F3TFRGY2JpQWdLaTljYmlBZ2JXOTJaVk53WldGclpYSW9hVzVrWlhnc2VDeDVLU0I3WEc1Y2JpQWdJQ0IwYUdsekxuTndaV0ZyWlhKelcybHVaR1Y0WFNBOUlGdDRMSGxkTzF4dUlDQWdJSFJvYVhNdWMzQmxZV3RsY2tWc1pXMWxiblJ6VzJsdVpHVjRYUzV6WlhSQmRIUnlhV0oxZEdVb0oyTjRKeXdnZUNwMGFHbHpMbmRwWkhSb0tUdGNiaUFnSUNCMGFHbHpMbk53WldGclpYSkZiR1Z0Wlc1MGMxdHBibVJsZUYwdWMyVjBRWFIwY21saWRYUmxLQ2RqZVNjc0lIa3FkR2hwY3k1b1pXbG5hSFFwTzF4dUlDQWdJSFJvYVhNdVkyRnNZM1ZzWVhSbFRHVjJaV3h6S0NrN1hHNGdJQ0FnZEdocGN5NWxiV2wwS0NkamFHRnVaMlVuTEhSb2FYTXViR1YyWld4ektUdGNiaUFnSUNCMGFHbHpMbkpsYm1SbGNpZ3BPMXh1WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnVTJWMElHRnNiQ0J6Y0dWaGEyVnlJR3h2WTJGMGFXOXVjMXh1SUNCQWNHRnlZVzBnYkc5allYUnBiMjV6SUh0QmNuSmhlWDBnUVhKeVlYa2diMllnYzNCbFlXdGxjaUJzYjJOaGRHbHZibk11SUVWaFkyZ2dhWFJsYlNCcGJpQjBhR1VnWVhKeVlYa2djMmh2ZFd4a0lHSmxJR0Z1SUdGeWNtRjVJRzltSUc1dmNtMWhiR2w2WldRZ2VDQmhibVFnZVNCamIyOXlaR2x1WVhSbGN5NWNibHh1SUNCelpYUlRjR1ZoYTJWeWN5aHNiMk5oZEdsdmJuTXBJSHRjYmx4dUlDQjlYRzRnSUNvdlhHNWNibjFjYmx4dVhHNWNiaTh2SUZkRlFsQkJRMHNnUms5UFZFVlNJQzh2WEc0dkx5QXVMMzR2YW5Ob2FXNTBMV3h2WVdSbGNpRXVMMnhwWWk5cGJuUmxjbVpoWTJWekwzQmhiakprTG1weklpd2lKM1Z6WlNCemRISnBZM1FuTzF4dVhHNXNaWFFnYldGMGFDQTlJSEpsY1hWcGNtVW9KeTR1TDNWMGFXd3ZiV0YwYUNjcE8xeHViR1YwSUhOMlp5QTlJSEpsY1hWcGNtVW9KeTR1TDNWMGFXd3ZjM1puSnlrN1hHNXNaWFFnU1c1MFpYSm1ZV05sSUQwZ2NtVnhkV2x5WlNnbkxpNHZZMjl5WlM5cGJuUmxjbVpoWTJVbktUdGNibHh1THlvcVhHNHFJRlJwYkhSY2JpcGNiaW9nUUdSbGMyTnlhWEIwYVc5dUlFUmxkbWxqWlNCMGFXeDBJSE5sYm5OdmNpQjNhWFJvSURJZ2IzSWdNeUJoZUdWeklDaGtaWEJsYm1ScGJtY2diMjRnZVc5MWNpQmtaWFpwWTJVZ1lXNWtJR0p5YjNkelpYSXBMbHh1S2x4dUtpQkFaR1Z0YnlBOGMzQmhiaUJ1WlhoMWN5MTFhVDBuZEdsc2RDYytQQzl6Y0dGdVBseHVLbHh1S2lCQVpYaGhiWEJzWlZ4dUtpQjJZWElnZEdsc2RDQTlJRzVsZHlCT1pYaDFjeTVVYVd4MEtDY2pkR0Z5WjJWMEp5bGNiaXBjYmlvZ1FHOTFkSEIxZEZ4dUtpQmphR0Z1WjJWY2Jpb2dSbWx5WlhNZ1lYUWdZU0J5WldkMWJHRnlJR2x1ZEdWeWRtRnNMQ0JoY3lCc2IyNW5JR0Z6SUhSb2FYTWdhVzUwWlhKbVlXTmxJR2x6SUdGamRHbDJaU0FvYzJWbElIUm9aU0JwYm5SbGNtWmhZMlVuY3lBOGFUNHVZV04wYVhabFBDOXBQaUJ3Y205d1pYSjBlU2s4WW5JK1hHNHFJRlJvWlNCbGRtVnVkQ0JrWVhSaElHbHpJR0Z1SUR4cFBtOWlhbVZqZER3dmFUNGdZMjl1ZEdGcGJtbHVaeUI0SUNodWRXMWlaWElwSUdGdVpDQjVJQ2h1ZFcxaVpYSXBJSEJ5YjNCbGNuUnBaWE1nZDJocFkyZ2djbVZ3Y21WelpXNTBJSFJvWlNCamRYSnlaVzUwSUhScGJIUWdjM1JoZEdVZ2IyWWdkR2hsSUdSbGRtbGpaUzVjYmlwY2Jpb2dRRzkxZEhCMWRHVjRZVzF3YkdWY2Jpb2dkR2xzZEM1dmJpZ25ZMmhoYm1kbEp5eG1kVzVqZEdsdmJpaDJLU0I3WEc0cUlDQWdZMjl1YzI5c1pTNXNiMmNvZGlrN1hHNHFJSDBwWEc0cVhHNHFYRzRxTDF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamJHRnpjeUJVYVd4MElHVjRkR1Z1WkhNZ1NXNTBaWEptWVdObElIdGNibHh1SUNCamIyNXpkSEoxWTNSdmNpZ3BJSHRjYmx4dUlDQWdJR3hsZENCdmNIUnBiMjV6SUQwZ1d5ZDJZV3gxWlNkZE8xeHVYRzRnSUNBZ2JHVjBJR1JsWm1GMWJIUnpJRDBnZTF4dUlDQWdJQ0FnSjNOcGVtVW5PaUJiT0RBc09EQmRYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lITjFjR1Z5S0dGeVozVnRaVzUwY3l4dmNIUnBiMjV6TEdSbFptRjFiSFJ6S1R0Y2JseHVJQ0FnSUhSb2FYTXVYMkZqZEdsMlpTQTlJSFJ5ZFdVN1hHNWNiaUFnSUNCMGFHbHpMbWx1YVhRb0tUdGNibHh1SUNBZ0lDOHZJR0ZrWkNCbGRtVnVkQ0JzYVhOMFpXNWxjaUJtYjNJZ1pHVjJhV05sSUc5eWFXVnVkR0YwYVc5dVhHNWNiaUFnWEhSMGFHbHpMbUp2ZFc1a1ZYQmtZWFJsSUQwZ2RHaHBjeTUxY0dSaGRHVXVZbWx1WkNoMGFHbHpLVHRjYmlBZ0x5OWNkSFJvYVhNdVltOTFibVJOYjNwVWFXeDBJRDBnZEdocGN5NXRiM3BVYVd4MExtSnBibVFvZEdocGN5bGNibHh1SUNCY2RHbG1JQ2gzYVc1a2IzY3VSR1YyYVdObFQzSnBaVzUwWVhScGIyNUZkbVZ1ZENrZ2UxeHVJQ0JjZEZ4MGRHaHBjeTV2Y21sbGJuUmhkR2x2Ymt4cGMzUmxibVZ5SUQwZ2QybHVaRzkzTG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjJSbGRtbGpaVzl5YVdWdWRHRjBhVzl1Snl3Z2RHaHBjeTVpYjNWdVpGVndaR0YwWlN3Z1ptRnNjMlVwTzF4dUlDQmNkSDBnWld4elpTQjdYRzRnSUNBZ0lDQjBhR2x6TGw5aFkzUnBkbVVnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJSFJvYVhNdVkyOXNiM0pKYm5SbGNtWmhZMlVvS1R0Y2JpQWdJQ0I5WEc1Y2JseHVYRzRnSUNBZ0lDQXZLbVZzYzJVZ2FXWWdLSGRwYm1SdmR5NVBjbWxsYm5SaGRHbHZia1YyWlc1MEtTQjdYRzRnSUM4dlhIUWdJRngwZDJsdVpHOTNMbUZrWkVWMlpXNTBUR2x6ZEdWdVpYSW9KMDF2ZWs5eWFXVnVkR0YwYVc5dUp5d2dkR2hwY3k1aWIzVnVaRTF2ZWxScGJIUXNJR1poYkhObEtUdGNiaUFnWEhSOUlHVnNjMlVnZTF4dUlDQmNkQ0FnWEhSamIyNXpiMnhsTG14dlp5Z25UbTkwSUhOMWNIQnZjblJsWkNCdmJpQjViM1Z5SUdSbGRtbGpaU0J2Y2lCaWNtOTNjMlZ5TGljcE8xeHVJQ0JjZEgwZ0tpOWNibHh1WEc0Z0lIMWNibHh1WEc0Z0lHSjFhV3hrU1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzRnSUNBZ2RHaHBjeTUwYVhSc1pTQTlJSE4yWnk1amNtVmhkR1VvSjNSbGVIUW5LVHRjYmlBZ0lDQjBhR2x6TG1OcGNtTnNaVmdnUFNCemRtY3VZM0psWVhSbEtDZGphWEpqYkdVbktUdGNiaUFnSUNCMGFHbHpMbU5wY21Oc1pWa2dQU0J6ZG1jdVkzSmxZWFJsS0NkamFYSmpiR1VuS1R0Y2JpQWdJQ0IwYUdsekxtTnBjbU5zWlZvZ1BTQnpkbWN1WTNKbFlYUmxLQ2RqYVhKamJHVW5LVHRjYmx4dUlDQWdJSFJvYVhNdVltRnlXQ0E5SUhOMlp5NWpjbVZoZEdVb0ozQmhkR2duS1R0Y2JpQWdJQ0IwYUdsekxtSmhjbGtnUFNCemRtY3VZM0psWVhSbEtDZHdZWFJvSnlrN1hHNGdJQ0FnZEdocGN5NWlZWEphSUQwZ2MzWm5MbU55WldGMFpTZ25jR0YwYUNjcE8xeHVYRzRnSUNBZ2RHaHBjeTVpWVhKWU1pQTlJSE4yWnk1amNtVmhkR1VvSjNCaGRHZ25LVHRjYmlBZ0lDQjBhR2x6TG1KaGNsa3lJRDBnYzNabkxtTnlaV0YwWlNnbmNHRjBhQ2NwTzF4dUlDQWdJSFJvYVhNdVltRnlXaklnUFNCemRtY3VZM0psWVhSbEtDZHdZWFJvSnlrN1hHNWNiaUFnSUNCMGFHbHpMbUpoY2xndWMyVjBRWFIwY21saWRYUmxLQ2R2Y0dGamFYUjVKeXduTUM0NEp5azdYRzRnSUNBZ2RHaHBjeTVpWVhKWkxuTmxkRUYwZEhKcFluVjBaU2duYjNCaFkybDBlU2NzSnpBdU9DY3BPMXh1SUNBZ0lIUm9hWE11WW1GeVdpNXpaWFJCZEhSeWFXSjFkR1VvSjI5d1lXTnBkSGtuTENjd0xqZ25LVHRjYmlBZ0lDQjBhR2x6TG1KaGNsZ3lMbk5sZEVGMGRISnBZblYwWlNnbmIzQmhZMmwwZVNjc0p6QXVPQ2NwTzF4dUlDQWdJSFJvYVhNdVltRnlXVEl1YzJWMFFYUjBjbWxpZFhSbEtDZHZjR0ZqYVhSNUp5d25NQzQ0SnlrN1hHNGdJQ0FnZEdocGN5NWlZWEphTWk1elpYUkJkSFJ5YVdKMWRHVW9KMjl3WVdOcGRIa25MQ2N3TGpnbktUdGNibHh1SUNBZ0lIUm9hWE11WTJseVkyeGxXQzV6WlhSQmRIUnlhV0oxZEdVb0oyTjRKeXgwYUdsekxuZHBaSFJvS2pNdk1USXBPMXh1SUNBZ0lIUm9hWE11WTJseVkyeGxXQzV6WlhSQmRIUnlhV0oxZEdVb0oyTjVKeXgwYUdsekxtaGxhV2RvZENvekx6UXBPMXh1SUNBZ0lIUm9hWE11WTJseVkyeGxXQzV6WlhSQmRIUnlhV0oxZEdVb0ozSW5MSFJvYVhNdWFHVnBaMmgwTHpFd0tUdGNiaUFnSUNCMGFHbHpMbU5wY21Oc1pWZ3VjMlYwUVhSMGNtbGlkWFJsS0NkdmNHRmphWFI1Snl3bk1DNDBKeWs3WEc1Y2JpQWdJQ0IwYUdsekxtTnBjbU5zWlZrdWMyVjBRWFIwY21saWRYUmxLQ2RqZUNjc2RHaHBjeTUzYVdSMGFDbzJMekV5S1R0Y2JpQWdJQ0IwYUdsekxtTnBjbU5zWlZrdWMyVjBRWFIwY21saWRYUmxLQ2RqZVNjc2RHaHBjeTVvWldsbmFIUXFNeTgwS1R0Y2JpQWdJQ0IwYUdsekxtTnBjbU5zWlZrdWMyVjBRWFIwY21saWRYUmxLQ2R5Snl4MGFHbHpMbWhsYVdkb2RDOHhNQ2s3WEc0Z0lDQWdkR2hwY3k1amFYSmpiR1ZaTG5ObGRFRjBkSEpwWW5WMFpTZ25iM0JoWTJsMGVTY3NKekF1TkNjcE8xeHVYRzRnSUNBZ2RHaHBjeTVqYVhKamJHVmFMbk5sZEVGMGRISnBZblYwWlNnblkzZ25MSFJvYVhNdWQybGtkR2dxT1M4eE1pazdYRzRnSUNBZ2RHaHBjeTVqYVhKamJHVmFMbk5sZEVGMGRISnBZblYwWlNnblkza25MSFJvYVhNdWFHVnBaMmgwS2pNdk5DazdYRzRnSUNBZ2RHaHBjeTVqYVhKamJHVmFMbk5sZEVGMGRISnBZblYwWlNnbmNpY3NkR2hwY3k1b1pXbG5hSFF2TVRBcE8xeHVJQ0FnSUhSb2FYTXVZMmx5WTJ4bFdpNXpaWFJCZEhSeWFXSjFkR1VvSjI5d1lXTnBkSGtuTENjd0xqUW5LVHRjYmx4dVhHNGdJQ0FnZEdocGN5NWlZWEpZTG5ObGRFRjBkSEpwWW5WMFpTZ25jM1J5YjJ0bExYZHBaSFJvSnl4TllYUm9Mbkp2ZFc1a0tIUm9hWE11YUdWcFoyaDBMek13S1NrN1hHNGdJQ0FnZEdocGN5NWlZWEpaTG5ObGRFRjBkSEpwWW5WMFpTZ25jM1J5YjJ0bExYZHBaSFJvSnl4TllYUm9Mbkp2ZFc1a0tIUm9hWE11YUdWcFoyaDBMek13S1NrN1hHNGdJQ0FnZEdocGN5NWlZWEphTG5ObGRFRjBkSEpwWW5WMFpTZ25jM1J5YjJ0bExYZHBaSFJvSnl4TllYUm9Mbkp2ZFc1a0tIUm9hWE11YUdWcFoyaDBMek13S1NrN1hHNWNiaUFnSUNCMGFHbHpMbUpoY2xndWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5d2dKMjV2Ym1VbktUdGNiaUFnSUNCMGFHbHpMbUpoY2xrdWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5d2dKMjV2Ym1VbktUdGNiaUFnSUNCMGFHbHpMbUpoY2xvdWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5d2dKMjV2Ym1VbktUdGNibHh1SUNBZ0lIUm9hWE11WW1GeVdESXVjMlYwUVhSMGNtbGlkWFJsS0NkemRISnZhMlV0ZDJsa2RHZ25MRTFoZEdndWNtOTFibVFvZEdocGN5NW9aV2xuYUhRdk16QXBLVHRjYmlBZ0lDQjBhR2x6TG1KaGNsa3lMbk5sZEVGMGRISnBZblYwWlNnbmMzUnliMnRsTFhkcFpIUm9KeXhOWVhSb0xuSnZkVzVrS0hSb2FYTXVhR1ZwWjJoMEx6TXdLU2s3WEc0Z0lDQWdkR2hwY3k1aVlYSmFNaTV6WlhSQmRIUnlhV0oxZEdVb0ozTjBjbTlyWlMxM2FXUjBhQ2NzVFdGMGFDNXliM1Z1WkNoMGFHbHpMbWhsYVdkb2RDOHpNQ2twTzF4dVhHNGdJQ0FnZEdocGN5NWlZWEpZTWk1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3bkxDQW5ibTl1WlNjcE8xeHVJQ0FnSUhSb2FYTXVZbUZ5V1RJdWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5d2dKMjV2Ym1VbktUdGNiaUFnSUNCMGFHbHpMbUpoY2xveUxuTmxkRUYwZEhKcFluVjBaU2duWm1sc2JDY3NJQ2R1YjI1bEp5azdYRzVjYmx4dUlDQWdJSFJvYVhNdWRHbDBiR1V1YzJWMFFYUjBjbWxpZFhSbEtDZDRKeXgwYUdsekxuZHBaSFJvTHpJcE8xeHVJQ0FnSUhSb2FYTXVkR2wwYkdVdWMyVjBRWFIwY21saWRYUmxLQ2Q1Snl4MGFHbHpMbWhsYVdkb2RDOHpLemNwTzF4dUlDQWdJSFJvYVhNdWRHbDBiR1V1YzJWMFFYUjBjbWxpZFhSbEtDZG1iMjUwTFhOcGVtVW5MQ2N4TlhCNEp5azdYRzRnSUNBZ2RHaHBjeTUwYVhSc1pTNXpaWFJCZEhSeWFXSjFkR1VvSjJadmJuUXRkMlZwWjJoMEp5d25ZbTlzWkNjcE8xeHVJQ0FnSUhSb2FYTXVkR2wwYkdVdWMyVjBRWFIwY21saWRYUmxLQ2RzWlhSMFpYSXRjM0JoWTJsdVp5Y3NKekp3ZUNjcE8xeHVJQ0FnSUhSb2FYTXVkR2wwYkdVdWMyVjBRWFIwY21saWRYUmxLQ2R2Y0dGamFYUjVKeXduTUM0M0p5azdYRzRnSUNBZ2RHaHBjeTUwYVhSc1pTNXpaWFJCZEhSeWFXSjFkR1VvSjNSbGVIUXRZVzVqYUc5eUp5d25iV2xrWkd4bEp5azdYRzRnSUNBZ2RHaHBjeTUwYVhSc1pTNTBaWGgwUTI5dWRHVnVkQ0E5SUNkVVNVeFVKenRjYmx4dVhHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdVkybHlZMnhsV0NrN1hHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdVkybHlZMnhsV1NrN1hHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdVkybHlZMnhsV2lrN1hHNWNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVZWEJ3Wlc1a1EyaHBiR1FvZEdocGN5NWlZWEpZS1R0Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdVlYQndaVzVrUTJocGJHUW9kR2hwY3k1aVlYSlpLVHRjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1WVhCd1pXNWtRMmhwYkdRb2RHaHBjeTVpWVhKYUtUdGNibHh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQzVoY0hCbGJtUkRhR2xzWkNoMGFHbHpMbUpoY2xneUtUdGNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVZWEJ3Wlc1a1EyaHBiR1FvZEdocGN5NWlZWEpaTWlrN1hHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdVltRnlXaklwTzF4dVhHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdWRHbDBiR1VwTzF4dVhHNGdJSDFjYmx4dUlDQmpiMnh2Y2tsdWRHVnlabUZqWlNncElIdGNibHh1SUNBZ0lHbG1JQ2gwYUdsekxsOWhZM1JwZG1VcElIdGNiaUFnSUNBZ0lIUm9hWE11Wld4bGJXVnVkQzV6ZEhsc1pTNWlZV05yWjNKdmRXNWtRMjlzYjNJZ1BTQjBhR2x6TG1OdmJHOXljeTVoWTJObGJuUTdYRzRnSUNBZ0lDQjBhR2x6TG1OcGNtTnNaVmd1YzJWMFFYUjBjbWxpZFhSbEtDZG1hV3hzSnl4MGFHbHpMbU52Ykc5eWN5NXNhV2RvZENrN1hHNGdJQ0FnSUNCMGFHbHpMbU5wY21Oc1pWa3VjMlYwUVhSMGNtbGlkWFJsS0NkbWFXeHNKeXgwYUdsekxtTnZiRzl5Y3k1c2FXZG9kQ2s3WEc0Z0lDQWdJQ0IwYUdsekxtTnBjbU5zWlZvdWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5eDBhR2x6TG1OdmJHOXljeTVzYVdkb2RDazdYRzRnSUNBZ0lDQjBhR2x6TG1OcGNtTnNaVmd1YzJWMFFYUjBjbWxpZFhSbEtDZHpkSEp2YTJVbkxIUm9hWE11WTI5c2IzSnpMbXhwWjJoMEtUdGNiaUFnSUNBZ0lIUm9hWE11WTJseVkyeGxXUzV6WlhSQmRIUnlhV0oxZEdVb0ozTjBjbTlyWlNjc2RHaHBjeTVqYjJ4dmNuTXViR2xuYUhRcE8xeHVJQ0FnSUNBZ2RHaHBjeTVqYVhKamJHVmFMbk5sZEVGMGRISnBZblYwWlNnbmMzUnliMnRsSnl4MGFHbHpMbU52Ykc5eWN5NXNhV2RvZENrN1hHNGdJQ0FnSUNCMGFHbHpMbUpoY2xndWMyVjBRWFIwY21saWRYUmxLQ2R6ZEhKdmEyVW5MSFJvYVhNdVkyOXNiM0p6TG14cFoyaDBLVHRjYmlBZ0lDQWdJSFJvYVhNdVltRnlXUzV6WlhSQmRIUnlhV0oxZEdVb0ozTjBjbTlyWlNjc2RHaHBjeTVqYjJ4dmNuTXViR2xuYUhRcE8xeHVJQ0FnSUNBZ2RHaHBjeTVpWVhKYUxuTmxkRUYwZEhKcFluVjBaU2duYzNSeWIydGxKeXgwYUdsekxtTnZiRzl5Y3k1c2FXZG9kQ2s3WEc0Z0lDQWdJQ0IwYUdsekxtSmhjbGd5TG5ObGRFRjBkSEpwWW5WMFpTZ25jM1J5YjJ0bEp5eDBhR2x6TG1OdmJHOXljeTVzYVdkb2RDazdYRzRnSUNBZ0lDQjBhR2x6TG1KaGNsa3lMbk5sZEVGMGRISnBZblYwWlNnbmMzUnliMnRsSnl4MGFHbHpMbU52Ykc5eWN5NXNhV2RvZENrN1hHNGdJQ0FnSUNCMGFHbHpMbUpoY2xveUxuTmxkRUYwZEhKcFluVjBaU2duYzNSeWIydGxKeXgwYUdsekxtTnZiRzl5Y3k1c2FXZG9kQ2s3WEc0Z0lDQWdJQ0IwYUdsekxuUnBkR3hsTG5ObGRFRjBkSEpwWW5WMFpTZ25abWxzYkNjc2RHaHBjeTVqYjJ4dmNuTXViR2xuYUhRcE8xeHVJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0IwYUdsekxtVnNaVzFsYm5RdWMzUjViR1V1WW1GamEyZHliM1Z1WkVOdmJHOXlJRDBnZEdocGN5NWpiMnh2Y25NdVptbHNiRHRjYmlBZ0lDQWdJSFJvYVhNdVkybHlZMnhsV0M1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3bkxIUm9hWE11WTI5c2IzSnpMbTFsWkdsMWJVeHBaMmgwS1R0Y2JpQWdJQ0FnSUhSb2FYTXVZMmx5WTJ4bFdTNXpaWFJCZEhSeWFXSjFkR1VvSjJacGJHd25MSFJvYVhNdVkyOXNiM0p6TG0xbFpHbDFiVXhwWjJoMEtUdGNiaUFnSUNBZ0lIUm9hWE11WTJseVkyeGxXaTV6WlhSQmRIUnlhV0oxZEdVb0oyWnBiR3duTEhSb2FYTXVZMjlzYjNKekxtMWxaR2wxYlV4cFoyaDBLVHRjYmlBZ0lDQWdJSFJvYVhNdVkybHlZMnhsV0M1elpYUkJkSFJ5YVdKMWRHVW9KM04wY205clpTY3NkR2hwY3k1amIyeHZjbk11YldWa2FYVnRUR2xuYUhRcE8xeHVJQ0FnSUNBZ2RHaHBjeTVqYVhKamJHVlpMbk5sZEVGMGRISnBZblYwWlNnbmMzUnliMnRsSnl4MGFHbHpMbU52Ykc5eWN5NXRaV1JwZFcxTWFXZG9kQ2s3WEc0Z0lDQWdJQ0IwYUdsekxtTnBjbU5zWlZvdWMyVjBRWFIwY21saWRYUmxLQ2R6ZEhKdmEyVW5MSFJvYVhNdVkyOXNiM0p6TG0xbFpHbDFiVXhwWjJoMEtUdGNiaUFnSUNBZ0lIUm9hWE11WW1GeVdDNXpaWFJCZEhSeWFXSjFkR1VvSjNOMGNtOXJaU2NzZEdocGN5NWpiMnh2Y25NdWJXVmthWFZ0VEdsbmFIUXBPMXh1SUNBZ0lDQWdkR2hwY3k1aVlYSlpMbk5sZEVGMGRISnBZblYwWlNnbmMzUnliMnRsSnl4MGFHbHpMbU52Ykc5eWN5NXRaV1JwZFcxTWFXZG9kQ2s3WEc0Z0lDQWdJQ0IwYUdsekxtSmhjbG91YzJWMFFYUjBjbWxpZFhSbEtDZHpkSEp2YTJVbkxIUm9hWE11WTI5c2IzSnpMbTFsWkdsMWJVeHBaMmgwS1R0Y2JpQWdJQ0FnSUhSb2FYTXVZbUZ5V0RJdWMyVjBRWFIwY21saWRYUmxLQ2R6ZEhKdmEyVW5MSFJvYVhNdVkyOXNiM0p6TG0xbFpHbDFiVXhwWjJoMEtUdGNiaUFnSUNBZ0lIUm9hWE11WW1GeVdUSXVjMlYwUVhSMGNtbGlkWFJsS0NkemRISnZhMlVuTEhSb2FYTXVZMjlzYjNKekxtMWxaR2wxYlV4cFoyaDBLVHRjYmlBZ0lDQWdJSFJvYVhNdVltRnlXakl1YzJWMFFYUjBjbWxpZFhSbEtDZHpkSEp2YTJVbkxIUm9hWE11WTI5c2IzSnpMbTFsWkdsMWJVeHBaMmgwS1R0Y2JpQWdJQ0FnSUhSb2FYTXVkR2wwYkdVdWMyVjBRWFIwY21saWRYUmxLQ2RtYVd4c0p5eDBhR2x6TG1OdmJHOXljeTV0WldScGRXMU1hV2RvZENrN1hHNGdJQ0FnZlZ4dVhHNGdJSDFjYmx4dUlDQjFjR1JoZEdVb2Rpa2dlMXh1SUNBZ0lHbG1JQ2gwYUdsekxsOWhZM1JwZG1VcGUxeHVYRzRnSUNBZ0lDQnNaWFFnZVNBOUlIWXVZbVYwWVR0Y2JpQWdJQ0FnSUd4bGRDQjRJRDBnZGk1bllXMXRZVHRjYmlBZ0lDQWdJR3hsZENCNklEMGdkaTVoYkhCb1lUdGNibHh1SUNBZ0lDQWdMeThnZEdGclpTQjBhR1VnYjNKcFoybHVZV3dnTFRrd0lIUnZJRGt3SUhOallXeGxJR0Z1WkNCdWIzSnRZV3hwZW1VZ2FYUWdNQzB4WEc0Z0lDQWdJQ0I0SUQwZ2JXRjBhQzV6WTJGc1pTaDRMQzA1TUN3NU1Dd3dMREVwTzF4dUlDQWdJQ0FnZVNBOUlHMWhkR2d1YzJOaGJHVW9lU3d0T1RBc09UQXNNQ3d4S1R0Y2JpQWdJQ0FnSUhvZ1BTQnRZWFJvTG5OallXeGxLSG9zTUN3ek5qQXNNQ3d4S1R0Y2JseHVYRzRnSUNBZ0lDQnNaWFFnYUdGdVpHeGxVRzlwYm5SeklEMGdlMXh1SUNBZ0lDQWdJQ0J6ZEdGeWREb2dUV0YwYUM1UVNTb3hMalVzWEc0Z0lDQWdJQ0FnSUdWdVpEb2diV0YwYUM1amJHbHdLQ0J0WVhSb0xuTmpZV3hsS0hnc01Dd3dMalVzVFdGMGFDNVFTU294TGpVc1RXRjBhQzVRU1Nvd0xqVXBJQ3dnVFdGMGFDNVFTU293TGpVc0lFMWhkR2d1VUVrcU1TNDFJQ2xjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0JzWlhRZ2FHRnVaR3hsTWxCdmFXNTBjeUE5SUh0Y2JpQWdJQ0FnSUNBZ2MzUmhjblE2SUUxaGRHZ3VVRWtxTWk0MUxGeHVJQ0FnSUNBZ0lDQmxibVE2SUcxaGRHZ3VZMnhwY0NnZ2JXRjBhQzV6WTJGc1pTaDRMREF1TlN3eExFMWhkR2d1VUVrcU1pNDFMRTFoZEdndVVFa3FNUzQxS1NBc0lFMWhkR2d1VUVrcU1TNDFMQ0JOWVhSb0xsQkpLakl1TlNBcFhHNGdJQ0FnSUNCOU8xeHVYRzRnSUNBZ0lDQnNaWFFnYUdGdVpHeGxVR0YwYUNBOUlITjJaeTVoY21Nb2RHaHBjeTVqYVhKamJHVllMbU40TG1KaGMyVldZV3d1ZG1Gc2RXVXNJSFJvYVhNdVkybHlZMnhsV0M1amVTNWlZWE5sVm1Gc0xuWmhiSFZsTENCMGFHbHpMbU5wY21Oc1pWZ3VjaTVpWVhObFZtRnNMblpoYkhWbExDQm9ZVzVrYkdWUWIybHVkSE11YzNSaGNuUXNJR2hoYm1Sc1pWQnZhVzUwY3k1bGJtUXBPMXh1SUNBZ0lDQWdiR1YwSUdoaGJtUnNaVEpRWVhSb0lEMGdjM1puTG1GeVl5aDBhR2x6TG1OcGNtTnNaVmd1WTNndVltRnpaVlpoYkM1MllXeDFaU3dnZEdocGN5NWphWEpqYkdWWUxtTjVMbUpoYzJWV1lXd3VkbUZzZFdVc0lIUm9hWE11WTJseVkyeGxXQzV5TG1KaGMyVldZV3d1ZG1Gc2RXVXNJR2hoYm1Sc1pUSlFiMmx1ZEhNdWMzUmhjblFzSUdoaGJtUnNaVEpRYjJsdWRITXVaVzVrS1R0Y2JseHVJQ0FnSUNBZ2RHaHBjeTVpWVhKWUxuTmxkRUYwZEhKcFluVjBaU2duWkNjc0lHaGhibVJzWlZCaGRHZ3BPMXh1SUNBZ0lDQWdkR2hwY3k1aVlYSllNaTV6WlhSQmRIUnlhV0oxZEdVb0oyUW5MQ0JvWVc1a2JHVXlVR0YwYUNrN1hHNWNibHh1WEc1Y2JseHVJQ0FnSUNBZ2FHRnVaR3hsVUc5cGJuUnpJRDBnZTF4dUlDQWdJQ0FnSUNCemRHRnlkRG9nVFdGMGFDNVFTU294TGpVc1hHNGdJQ0FnSUNBZ0lHVnVaRG9nYldGMGFDNWpiR2x3S0NCdFlYUm9Mbk5qWVd4bEtIa3NNQ3d3TGpVc1RXRjBhQzVRU1NveExqVXNUV0YwYUM1UVNTb3dMalVwSUN3Z1RXRjBhQzVRU1Nvd0xqVXNJRTFoZEdndVVFa3FNUzQxSUNsY2JpQWdJQ0FnSUgwN1hHNGdJQ0FnSUNCb1lXNWtiR1V5VUc5cGJuUnpJRDBnZTF4dUlDQWdJQ0FnSUNCemRHRnlkRG9nVFdGMGFDNVFTU295TGpVc1hHNGdJQ0FnSUNBZ0lHVnVaRG9nYldGMGFDNWpiR2x3S0NCdFlYUm9Mbk5qWVd4bEtIa3NNQzQxTERFc1RXRjBhQzVRU1NveUxqVXNUV0YwYUM1UVNTb3hMalVwSUN3Z1RXRjBhQzVRU1NveExqVXNJRTFoZEdndVVFa3FNaTQxSUNsY2JpQWdJQ0FnSUgwN1hHNWNiaUFnSUNBZ0lHaGhibVJzWlZCaGRHZ2dQU0J6ZG1jdVlYSmpLSFJvYVhNdVkybHlZMnhsV1M1amVDNWlZWE5sVm1Gc0xuWmhiSFZsTENCMGFHbHpMbU5wY21Oc1pWa3VZM2t1WW1GelpWWmhiQzUyWVd4MVpTd2dkR2hwY3k1amFYSmpiR1ZaTG5JdVltRnpaVlpoYkM1MllXeDFaU3dnYUdGdVpHeGxVRzlwYm5SekxuTjBZWEowTENCb1lXNWtiR1ZRYjJsdWRITXVaVzVrS1R0Y2JpQWdJQ0FnSUdoaGJtUnNaVEpRWVhSb0lEMGdjM1puTG1GeVl5aDBhR2x6TG1OcGNtTnNaVmt1WTNndVltRnpaVlpoYkM1MllXeDFaU3dnZEdocGN5NWphWEpqYkdWWkxtTjVMbUpoYzJWV1lXd3VkbUZzZFdVc0lIUm9hWE11WTJseVkyeGxXUzV5TG1KaGMyVldZV3d1ZG1Gc2RXVXNJR2hoYm1Sc1pUSlFiMmx1ZEhNdWMzUmhjblFzSUdoaGJtUnNaVEpRYjJsdWRITXVaVzVrS1R0Y2JseHVJQ0FnSUNBZ2RHaHBjeTVpWVhKWkxuTmxkRUYwZEhKcFluVjBaU2duWkNjc0lHaGhibVJzWlZCaGRHZ3BPMXh1SUNBZ0lDQWdkR2hwY3k1aVlYSlpNaTV6WlhSQmRIUnlhV0oxZEdVb0oyUW5MQ0JvWVc1a2JHVXlVR0YwYUNrN1hHNWNibHh1WEc1Y2JseHVYRzRnSUNBZ0lDQm9ZVzVrYkdWUWIybHVkSE1nUFNCN1hHNGdJQ0FnSUNBZ0lITjBZWEowT2lCTllYUm9MbEJKS2pFdU5TeGNiaUFnSUNBZ0lDQWdaVzVrT2lCdFlYUm9MbU5zYVhBb0lHMWhkR2d1YzJOaGJHVW9laXd3TERBdU5TeE5ZWFJvTGxCSktqRXVOU3hOWVhSb0xsQkpLakF1TlNrZ0xDQk5ZWFJvTGxCSktqQXVOU3dnVFdGMGFDNVFTU294TGpVZ0tWeHVJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lHaGhibVJzWlRKUWIybHVkSE1nUFNCN1hHNGdJQ0FnSUNBZ0lITjBZWEowT2lCTllYUm9MbEJKS2pJdU5TeGNiaUFnSUNBZ0lDQWdaVzVrT2lCdFlYUm9MbU5zYVhBb0lHMWhkR2d1YzJOaGJHVW9laXd3TGpVc01TeE5ZWFJvTGxCSktqSXVOU3hOWVhSb0xsQkpLakV1TlNrZ0xDQk5ZWFJvTGxCSktqRXVOU3dnVFdGMGFDNVFTU295TGpVZ0tWeHVJQ0FnSUNBZ2ZUdGNibHh1SUNBZ0lDQWdhR0Z1Wkd4bFVHRjBhQ0E5SUhOMlp5NWhjbU1vZEdocGN5NWphWEpqYkdWYUxtTjRMbUpoYzJWV1lXd3VkbUZzZFdVc0lIUm9hWE11WTJseVkyeGxXaTVqZVM1aVlYTmxWbUZzTG5aaGJIVmxMQ0IwYUdsekxtTnBjbU5zWlZvdWNpNWlZWE5sVm1Gc0xuWmhiSFZsTENCb1lXNWtiR1ZRYjJsdWRITXVjM1JoY25Rc0lHaGhibVJzWlZCdmFXNTBjeTVsYm1RcE8xeHVJQ0FnSUNBZ2FHRnVaR3hsTWxCaGRHZ2dQU0J6ZG1jdVlYSmpLSFJvYVhNdVkybHlZMnhsV2k1amVDNWlZWE5sVm1Gc0xuWmhiSFZsTENCMGFHbHpMbU5wY21Oc1pWb3VZM2t1WW1GelpWWmhiQzUyWVd4MVpTd2dkR2hwY3k1amFYSmpiR1ZhTG5JdVltRnpaVlpoYkM1MllXeDFaU3dnYUdGdVpHeGxNbEJ2YVc1MGN5NXpkR0Z5ZEN3Z2FHRnVaR3hsTWxCdmFXNTBjeTVsYm1RcE8xeHVYRzRnSUNBZ0lDQjBhR2x6TG1KaGNsb3VjMlYwUVhSMGNtbGlkWFJsS0Nka0p5d2dhR0Z1Wkd4bFVHRjBhQ2s3WEc0Z0lDQWdJQ0IwYUdsekxtSmhjbG95TG5ObGRFRjBkSEpwWW5WMFpTZ25aQ2NzSUdoaGJtUnNaVEpRWVhSb0tUdGNibHh1WEc0Z0lDQWdJQ0F2S2x4dVhHNGdJQ0FnSUNCc1pYUWdjRzlwYm5SeldDQTlJSHRjYmlBZ0lDQWdJQ0FnYzNSaGNuUTZJREFzWEc0Z0lDQWdJQ0FnSUdWdVpEb2diV0YwYUM1elkyRnNaU2dnZUN3Z01Dd2dNU3dnTUN3Z1RXRjBhQzVRU1NveUlDbGNiaUFnSUNBZ0lIMDdYRzVjYmlBZ0lDQXZMeUFnWTI5dWMyOXNaUzVzYjJjb2RHaHBjeTVqYVhKamJHVllMbU40TG1KaGMyVldZV3d1ZG1Gc2RXVXBPMXh1WEc0Z0lDQWdJQ0JzWlhRZ2NHRjBhRmdnUFNCemRtY3VZWEpqS0hSb2FYTXVZMmx5WTJ4bFdDNWplQzVpWVhObFZtRnNMblpoYkhWbExDQjBhR2x6TG1OcGNtTnNaVmd1WTNrdVltRnpaVlpoYkM1MllXeDFaU3dnZEdocGN5NWphWEpqYkdWWUxuSXVZbUZ6WlZaaGJDNTJZV3gxWlNveUxDQndiMmx1ZEhOWUxuTjBZWEowTENCd2IybHVkSE5ZTG1WdVpDazdYRzVjYmlBZ0lDQWdJSFJvYVhNdVltRnlXQzV6WlhSQmRIUnlhV0oxZEdVb0oyUW5MSEJoZEdoWUtUc2dLaTljYmx4dUlDQWdJQ0FnTHk5MGFHbHpMblJsZUhSSUxuUmxlSFJEYjI1MFpXNTBJRDBnYldGMGFDNXdjblZ1WlNoNExESXBPMXh1SUNBZ0lDQWdMeTkwYUdsekxuUmxlSFJXTG5SbGVIUkRiMjUwWlc1MElEMGdiV0YwYUM1d2NuVnVaU2g1TERJcE8xeHVJQ0FnSUNBZ0x5OWNiaUFnSUNBdkx5QWdkR2hwY3k1amFYSmpiR1ZZTG5ObGRFRjBkSEpwWW5WMFpTZ25iM0JoWTJsMGVTY3NlQ2s3WEc0Z0lDQWdMeThnSUhSb2FYTXVZMmx5WTJ4bFdTNXpaWFJCZEhSeWFXSjFkR1VvSjI5d1lXTnBkSGtuTEhrcE8xeHVJQ0FnSUM4dklDQjBhR2x6TG1OcGNtTnNaVm91YzJWMFFYUjBjbWxpZFhSbEtDZHZjR0ZqYVhSNUp5eDZLVHRjYmx4dUlDQWdJQ0FnZEdocGN5NWxiV2wwS0NkamFHRnVaMlVuTENCN1hHNGdJQ0FnSUNBZ0lIZzZJSGdzWEc0Z0lDQWdJQ0FnSUhrNklIa3NYRzRnSUNBZ0lDQWdJSG82SUhwY2JpQWdJQ0FnSUgwcE8xeHVYRzRnSUNBZ2ZWeHVYRzRnSUgxY2JseHVJQ0JqYkdsamF5Z3BJSHRjYmlBZ0lDQnBaaUFvZDJsdVpHOTNMa1JsZG1salpVOXlhV1Z1ZEdGMGFXOXVSWFpsYm5RcElIdGNiaUFnSUNBZ0lIUm9hWE11WVdOMGFYWmxJRDBnSVhSb2FYTXVZV04wYVhabE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNCWGFHVjBhR1Z5SUhSb1pTQnBiblJsY21aaFkyVWdhWE1nYjI0Z0tHVnRhWFIwYVc1bklIWmhiSFZsY3lrZ2IzSWdiMlptSUNod1lYVnpaV1FnSmlCdWIzUWdaVzFwZEhScGJtY2dkbUZzZFdWektTNGdVMlYwZEdsdVp5QjBhR2x6SUhCeWIzQmxjblI1SUhkcGJHd2dkWEJrWVhSbElHbDBMbHh1SUNCQWRIbHdaU0I3WW05dmJHVmhibjFjYmlBZ0tpOWNibHh1SUNCblpYUWdZV04wYVhabEtDa2dlMXh1SUNBZ0lISmxkSFZ5YmlCMGFHbHpMbDloWTNScGRtVTdYRzRnSUgxY2JseHVJQ0J6WlhRZ1lXTjBhWFpsS0c5dUtTQjdYRzRnSUNBZ2RHaHBjeTVmWVdOMGFYWmxJRDBnYjI0N1hHNGdJQ0FnZEdocGN5NWpiMnh2Y2tsdWRHVnlabUZqWlNncE8xeHVJQ0I5WEc1Y2JpQWdZM1Z6ZEc5dFJHVnpkSEp2ZVNncElIdGNiaUFnSUNCM2FXNWtiM2N1Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lnblpHVjJhV05sYjNKcFpXNTBZWFJwYjI0bkxDQjBhR2x6TG1KdmRXNWtWWEJrWVhSbExDQm1ZV3h6WlNrN1hHNGdJSDFjYmx4dWZWeHVYRzVjYmx4dUx5OGdWMFZDVUVGRFN5QkdUMDlVUlZJZ0x5OWNiaTh2SUM0dmZpOXFjMmhwYm5RdGJHOWhaR1Z5SVM0dmJHbGlMMmx1ZEdWeVptRmpaWE12ZEdsc2RDNXFjeUlzSWlkMWMyVWdjM1J5YVdOMEp6dGNibHh1YkdWMElHUnZiU0E5SUhKbGNYVnBjbVVvSnk0dUwzVjBhV3d2Wkc5dEp5azdYRzVzWlhRZ2JXRjBhQ0E5SUhKbGNYVnBjbVVvSnk0dUwzVjBhV3d2YldGMGFDY3BPMXh1YkdWMElFbHVkR1Z5Wm1GalpTQTlJSEpsY1hWcGNtVW9KeTR1TDJOdmNtVXZhVzUwWlhKbVlXTmxKeWs3WEc1c1pYUWdVMnhwWkdWeVZHVnRjR3hoZEdVZ1BTQnlaWEYxYVhKbEtDY3VMaTlqYjIxd2IyNWxiblJ6TDNOc2FXUmxjblJsYlhCc1lYUmxKeWs3WEc1c1pYUWdkRzkxWTJnZ1BTQnlaWEYxYVhKbEtDY3VMaTkxZEdsc0wzUnZkV05vSnlrN1hHNWNibHh1WEc1amJHRnpjeUJUYVc1bmJHVlRiR2xrWlhJZ1pYaDBaVzVrY3lCVGJHbGtaWEpVWlcxd2JHRjBaU0I3WEc1Y2JpQWdZMjl1YzNSeWRXTjBiM0lvS1NCN1hHNWNiaUFnSUNCc1pYUWdiM0IwYVc5dWN5QTlJRnNuYzJOaGJHVW5MQ2QyWVd4MVpTZGRPMXh1WEc0Z0lDQWdiR1YwSUdSbFptRjFiSFJ6SUQwZ2UxeHVJQ0FnSUNBZ0ozTnBlbVVuT2lCYk1USXdMREl3WFN4Y2JpQWdJQ0FnSUNkdmNtbGxiblJoZEdsdmJpYzZJQ2QyWlhKMGFXTmhiQ2NzWEc0Z0lDQWdJQ0FuYlc5a1pTYzZJQ2RoWW5OdmJIVjBaU2NzWEc0Z0lDQWdJQ0FuYzJOaGJHVW5PaUJiTUN3eFhTeGNiaUFnSUNBZ0lDZHpkR1Z3SnpvZ01DeGNiaUFnSUNBZ0lDZDJZV3gxWlNjNklEQXNYRzRnSUNBZ0lDQW5hR0Z6UzI1dllpYzZJSFJ5ZFdWY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnYzNWd1pYSW9ZWEpuZFcxbGJuUnpMRzl3ZEdsdmJuTXNaR1ZtWVhWc2RITXBPMXh1WEc1Y2JpQWdJQ0F2S2lCbGRtVnVkSE1nS2k5Y2JseHVJQ0FnSUdsbUlDZ2hkRzkxWTJndVpYaHBjM1J6S1NCN1hHNWNiaUFnSUNBZ0lIUm9hWE11WTJ4cFkyc2dQU0FvS1NBOVBpQjdYRzRnSUNBZ0lDQWdJSFJvYVhNdWJYVnNkR2x6Ykdsa1pYSXVhVzUwWlhKaFkzUnBibWNnUFNCMGNuVmxPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtMTFiSFJwYzJ4cFpHVnlMbWx1ZEdWeWNHOXNZWFJwYjI0Z1BTQjdYRzRnSUNBZ0lDQWdJQ0FnYVc1a1pYZzZJSFJvYVhNdWFXNWtaWGdzWEc0Z0lDQWdJQ0FnSUNBZ2RtRnNkV1U2SUhSb2FYTXVkbUZzZFdWY2JpQWdJQ0FnSUNBZ2ZUdGNiaUFnSUNBZ0lDQWdkR2hwY3k1a2IzZHVLQ2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXViWFZzZEdsemJHbGtaWEl1ZG1Gc2RXVnpXM1JvYVhNdWFXNWtaWGhkSUQwZ2RHaHBjeTUyWVd4MVpUdGNiaUFnSUNBZ0lIMDdYRzRnSUNBZ0lDQjBhR2x6TG1Wc1pXMWxiblF1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWduYlc5MWMyVnZkbVZ5Snl3Z0tHVXBJRDArSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWJYVnNkR2x6Ykdsa1pYSXVhVzUwWlhKaFkzUnBibWNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvSVhSb2FYTXViMlptYzJWMEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFHbHpMbTltWm5ObGRDQTlJR1J2YlM1bWFXNWtVRzl6YVhScGIyNG9kR2hwY3k1bGJHVnRaVzUwS1R0Y2JpQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnZEdocGN5NXRiM1Z6WlNBOUlHUnZiUzVzYjJOaGRHVk5iM1Z6WlNobExIUm9hWE11YjJabWMyVjBLVHRjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpMbVJ2ZDI0b0tUdGNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxtMTFiSFJwYzJ4cFpHVnlMblpoYkhWbGMxdDBhR2x6TG1sdVpHVjRYU0E5SUhSb2FYTXVkbUZzZFdVN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0hSb2FYTXViWFZzZEdsemJHbGtaWEl1YVc1MFpYSndiMnhoZEdsdmJpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2JHVjBJR1JwYzNSaGJtTmxJRDBnVFdGMGFDNWhZbk1vZEdocGN5NXRkV3gwYVhOc2FXUmxjaTVwYm5SbGNuQnZiR0YwYVc5dUxtbHVaR1Y0TFhSb2FYTXVhVzVrWlhncE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tDQmthWE4wWVc1alpTQStJREVnS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUd4bGRDQnNiM2NnUFNCTllYUm9MbTFwYmloMGFHbHpMbTExYkhScGMyeHBaR1Z5TG1sdWRHVnljRzlzWVhScGIyNHVhVzVrWlhnc2RHaHBjeTVwYm1SbGVDazdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lHeGxkQ0JvYVdkb0lEMGdUV0YwYUM1dFlYZ29kR2hwY3k1dGRXeDBhWE5zYVdSbGNpNXBiblJsY25CdmJHRjBhVzl1TG1sdVpHVjRMSFJvYVhNdWFXNWtaWGdwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JzWlhRZ2JHOTNWbUZzZFdVZ1BTQjBhR2x6TG0xMWJIUnBjMnhwWkdWeUxuTnNhV1JsY25OYmJHOTNYUzUyWVd4MVpUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2JHVjBJR2hwWjJoV1lXeDFaU0E5SUhSb2FYTXViWFZzZEdsemJHbGtaWEl1YzJ4cFpHVnljMXRvYVdkb1hTNTJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05eUlDaHNaWFFnYVQxc2IzYzdhVHhvYVdkb08ya3JLeWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViWFZzZEdsemJHbGtaWEl1YzJ4cFpHVnljMXRwWFM1MllXeDFaU0E5SUcxaGRHZ3VhVzUwWlhKd0tDQW9hUzFzYjNjcEwyUnBjM1JoYm1ObExDQnNiM2RXWVd4MVpTd2dhR2xuYUZaaGJIVmxJQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdWMElITnRiMjkwYUdWa1ZtRnNkV1VnUFNCMGFHbHpMbTExYkhScGMyeHBaR1Z5TG5Oc2FXUmxjbk5iYVYwdWRtRnNkV1U3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXRkV3gwYVhOc2FXUmxjaTUyWVd4MVpYTmJhVjBnUFNCemJXOXZkR2hsWkZaaGJIVmxPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWJYVnNkR2x6Ykdsa1pYSXVkWEJrWVhSbEtHa3NjMjF2YjNSb1pXUldZV3gxWlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lDQWdJQ0IwYUdsekxtMTFiSFJwYzJ4cFpHVnlMbWx1ZEdWeWNHOXNZWFJwYjI0Z1BTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcGJtUmxlRG9nZEdocGN5NXBibVJsZUN4Y2JpQWdJQ0FnSUNBZ0lDQWdJSFpoYkhWbE9pQjBhR2x6TG5aaGJIVmxYRzRnSUNBZ0lDQWdJQ0FnZlR0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZTazdYRzVjYmx4dUlDQWdJQ0FnZEdocGN5NXRiM1psSUQwZ0tDa2dQVDRnZTF4dUlDQWdJQ0FnZlR0Y2JpQWdJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNWhaR1JGZG1WdWRFeHBjM1JsYm1WeUtDZHRiM1Z6WlcxdmRtVW5MQ0FvWlNrZ1BUNGdlMXh1SUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV0ZFd4MGFYTnNhV1JsY2k1cGJuUmxjbUZqZEdsdVp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDZ2hkR2hwY3k1dlptWnpaWFFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvYVhNdWIyWm1jMlYwSUQwZ1pHOXRMbVpwYm1SUWIzTnBkR2x2YmloMGFHbHpMbVZzWlcxbGJuUXBPMXh1SUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG0xdmRYTmxJRDBnWkc5dExteHZZMkYwWlUxdmRYTmxLR1VzZEdocGN5NXZabVp6WlhRcE8xeHVJQ0FnSUNBZ0lDQWdJSFJvYVhNdWMyeHBaR1VvS1R0Y2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG0xMWJIUnBjMnhwWkdWeUxuWmhiSFZsYzF0MGFHbHpMbWx1WkdWNFhTQTlJSFJvYVhNdWRtRnNkV1U3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgwcE8xeHVYRzVjYmlBZ0lDQWdJSFJvYVhNdWNtVnNaV0Z6WlNBOUlDZ3BJRDArSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV0ZFd4MGFYTnNhV1JsY2k1cGJuUmxjbUZqZEdsdVp5QTlJR1poYkhObE8xeHVJQ0FnSUNBZ0lDQjBhR2x6TG0xMWJIUnBjMnhwWkdWeUxtbHVkR1Z5Y0c5c1lYUnBiMjRnUFNCbVlXeHpaVHRjYmlBZ0lDQWdJSDA3WEc0Z0lDQWdJQ0IwYUdsekxtVnNaVzFsYm5RdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnbmJXOTFjMlYxY0Njc0lDZ3BJRDArSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFJvYVhNdWJYVnNkR2x6Ykdsa1pYSXVhVzUwWlhKaFkzUnBibWNwSUh0Y2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG5Wd0tDazdYRzRnSUNBZ0lDQWdJQ0FnZEdocGN5NXRkV3gwYVhOc2FXUmxjaTVwYm5SbGNuQnZiR0YwYVc5dUlEMGdabUZzYzJVN1hHNGdJQ0FnSUNBZ0lDQWdkR2hwY3k1dGRXeDBhWE5zYVdSbGNpNTJZV3gxWlhOYmRHaHBjeTVwYm1SbGVGMGdQU0IwYUdsekxuWmhiSFZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lIUm9hWE11Wld4bGJXVnVkQzVoWkdSRmRtVnVkRXhwYzNSbGJtVnlLQ2R0YjNWelpXOTFkQ2NzSUNncElEMCtJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIUm9hWE11YlhWc2RHbHpiR2xrWlhJdWFXNTBaWEpoWTNScGJtY3BJSHRjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpMblZ3S0NrN1hHNGdJQ0FnSUNBZ0lDQWdkR2hwY3k1dGRXeDBhWE5zYVdSbGNpNTJZV3gxWlhOYmRHaHBjeTVwYm1SbGVGMGdQU0IwYUdsekxuWmhiSFZsTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOUtUdGNibHh1SUNBZ0lIMWNibHh1SUNBZ0lIUm9hWE11WTNWemRHOXRVM1I1YkdVb0tUdGNiaUFnZlZ4dVhHNGdJR04xYzNSdmJWTjBlV3hsS0NrZ2UxeHVYRzRnSUNBZ0x5b2djM1I1YkdVZ1kyaGhibWRsY3lBcUwxeHVYRzRnSUNBZ2RHaHBjeTVpWVhJdWMyVjBRWFIwY21saWRYUmxLQ2Q0Snl3d0tUdGNiaUFnSUNCMGFHbHpMbUpoY2k1elpYUkJkSFJ5YVdKMWRHVW9KM1J5WVc1elptOXliU2NzSjNSeVlXNXpiR0YwWlNnd0xEQXBKeWs3WEc0Z0lDQWdkR2hwY3k1aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkeWVDY3NNQ2s3SUM4dklHTnZjbTVsY2lCeVlXUnBkWE5jYmlBZ0lDQjBhR2x6TG1KaGNpNXpaWFJCZEhSeWFXSjFkR1VvSjNKNUp5d3dLVHRjYmlBZ0lDQjBhR2x6TG1KaGNpNXpaWFJCZEhSeWFXSjFkR1VvSjNkcFpIUm9KeXgwYUdsekxuZHBaSFJvS1R0Y2JpQWdJQ0IwYUdsekxtSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0oyaGxhV2RvZENjc2RHaHBjeTVvWldsbmFIUXBPMXh1WEc0Z0lDQWdkR2hwY3k1bWFXeHNZbUZ5TG5ObGRFRjBkSEpwWW5WMFpTZ25lQ2NzTUNrN1hHNGdJQ0FnZEdocGN5NW1hV3hzWW1GeUxuTmxkRUYwZEhKcFluVjBaU2duZEhKaGJuTm1iM0p0Snl3bmRISmhibk5zWVhSbEtEQXNNQ2tuS1R0Y2JpQWdJQ0IwYUdsekxtWnBiR3hpWVhJdWMyVjBRWFIwY21saWRYUmxLQ2R5ZUNjc01DazdJQzh2SUdOdmNtNWxjaUJ5WVdScGRYTmNiaUFnSUNCMGFHbHpMbVpwYkd4aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkeWVTY3NNQ2s3WEc0Z0lDQWdkR2hwY3k1bWFXeHNZbUZ5TG5ObGRFRjBkSEpwWW5WMFpTZ25kMmxrZEdnbkxIUm9hWE11ZDJsa2RHZ3BPMXh1SUNBZ0lIUm9hWE11Wm1sc2JHSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0oyaGxhV2RvZENjc2RHaHBjeTVvWldsbmFIUXBPMXh1WEc0Z0lIMWNibHh1ZlZ4dVhHNHZLaXBjYmlvZ1RYVnNkR2x6Ykdsa1pYSmNiaXBjYmlvZ1FHUmxjMk55YVhCMGFXOXVJRTExYkhScGMyeHBaR1Z5WEc0cVhHNHFJRUJrWlcxdklEeHpjR0Z1SUc1bGVIVnpMWFZwUFZ3aWJYVnNkR2x6Ykdsa1pYSmNJajQ4TDNOd1lXNCtYRzRxWEc0cUlFQmxlR0Z0Y0d4bFhHNHFJSFpoY2lCdGRXeDBhWE5zYVdSbGNpQTlJRzVsZHlCT1pYaDFjeTVOZFd4MGFYTnNhV1JsY2lnbkkzUmhjbWRsZENjcFhHNHFYRzRxSUVCbGVHRnRjR3hsWEc0cUlIWmhjaUJ0ZFd4MGFYTnNhV1JsY2lBOUlHNWxkeUJPWlhoMWN5NU5kV3gwYVhOc2FXUmxjaWduSTNSaGNtZGxkQ2NzZTF4dUtpQWdKM05wZW1Vbk9pQmJNakF3TERFd01GMHNYRzRxSUNBbmJuVnRZbVZ5VDJaVGJHbGtaWEp6SnpvZ05TeGNiaW9nSUNkdGFXNG5PaUF3TEZ4dUtpQWdKMjFoZUNjNklERXNYRzRxSUNBbmMzUmxjQ2M2SURBc1hHNHFJQ0FuZG1Gc2RXVnpKem9nV3pBdU55d3dMamNzTUM0M0xEQXVOeXd3TGpkZFhHNHFJSDBwWEc0cVhHNHFJRUJ2ZFhSd2RYUmNiaW9nWTJoaGJtZGxYRzRxSUVacGNtVnpJR0Z1ZVNCMGFXMWxJSFJvWlNCcGJuUmxjbVpoWTJVbmN5QjJZV3gxWlNCamFHRnVaMlZ6TGlBOFluSStYRzRxSUZSb1pTQmxkbVZ1ZENCa1lYUmhJR0Z1SUc5aWFtVmpkQ0JqYjI1MFlXbHVhVzVuSUR4cFBtbHVaR1Y0UEM5cFBpQmhibVFnUEdrK2RtRnNkV1U4TDJrK0lIQnliM0JsY25ScFpYTmNiaXBjYmlvZ1FHOTFkSEIxZEdWNFlXMXdiR1ZjYmlvZ2JYVnNkR2x6Ykdsa1pYSXViMjRvSjJOb1lXNW5aU2NzWm5WdVkzUnBiMjRvZGlrZ2UxeHVLaUFnSUdOdmJuTnZiR1V1Ykc5bktIWXBPMXh1S2lCOUtWeHVLbHh1S2k5Y2JseHVMeXBjYmxCeWIzQmxjblJwWlhOY2JpNTJZV3gxWlhOY2JseHVLaTljYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnWTJ4aGMzTWdUWFZzZEdsemJHbGtaWElnWlhoMFpXNWtjeUJKYm5SbGNtWmhZMlVnZTF4dVhHNGdJR052Ym5OMGNuVmpkRzl5S0NrZ2UxeHVYRzRnSUNBZ2JHVjBJRzl3ZEdsdmJuTWdQU0JiSjNaaGJIVmxKMTA3WEc1Y2JpQWdJQ0JzWlhRZ1pHVm1ZWFZzZEhNZ1BTQjdYRzRnSUNBZ0lDQW5jMmw2WlNjNklGc3lNREFzTVRBd1hTeGNiaUFnSUNBZ0lDZHVkVzFpWlhKUFpsTnNhV1JsY25Nbk9pQTFMRnh1SUNBZ0lDQWdKMjFwYmljNklEQXNYRzRnSUNBZ0lDQW5iV0Y0SnpvZ01TeGNiaUFnSUNBZ0lDZHpkR1Z3SnpvZ01DeGNiaUFnSUNBZ0lDZDJZV3gxWlhNbk9pQmJNQzQzTERBdU55d3dMamNzTUM0M0xEQXVOMTFjYmlBZ0lDQjlPMXh1WEc0Z0lDQWdjM1Z3WlhJb1lYSm5kVzFsYm5SekxHOXdkR2x2Ym5Nc1pHVm1ZWFZzZEhNcE8xeHVYRzRnSUNBZ2RHaHBjeTVmYm5WdFltVnlUMlpUYkdsa1pYSnpJRDBnZEdocGN5NXpaWFIwYVc1bmN5NXVkVzFpWlhKUFpsTnNhV1JsY25NN1hHNGdJQ0FnZEdocGN5NTJZV3gxWlhNZ1BTQjBhR2x6TG5ObGRIUnBibWR6TG5aaGJIVmxjenRjYmx4dUlDQWdJSFJvYVhNdWMyeHBaR1Z5Y3lBOUlGdGRPMXh1WEc0Z0lDQWdkR2hwY3k1cGJuUmxjbUZqZEdsdVp5QTlJR1poYkhObE8xeHVYRzRnSUNBZ2RHaHBjeTVwYm1sMEtDazdYRzVjYmlBZ2ZWeHVYRzRnSUdKMWFXeGtSbkpoYldVb0tTQjdYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBJRDBnWkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDZ25aR2wySnlrN1hHNGdJQ0FnZEdocGN5NXdZWEpsYm5RdVlYQndaVzVrUTJocGJHUW9kR2hwY3k1bGJHVnRaVzUwS1R0Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrU1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzRnSUNBZ2JHVjBJRzFwYmlBOUlIUm9hWE11YzJWMGRHbHVaM011YldsdU8xeHVJQ0FnSUd4bGRDQnRZWGdnUFNCMGFHbHpMbk5sZEhScGJtZHpMbTFoZUR0Y2JpQWdJQ0JzWlhRZ2MzUmxjQ0E5SUhSb2FYTXVjMlYwZEdsdVozTXVjM1JsY0R0Y2JseHVJQ0FnSUdsbUlDaDBhR2x6TG5Oc2FXUmxjbk11YkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0J0YVc0Z1BTQjBhR2x6TG5Oc2FXUmxjbk5iTUYwdWJXbHVPMXh1SUNBZ0lDQWdiV0Y0SUQwZ2RHaHBjeTV6Ykdsa1pYSnpXekJkTG0xaGVEdGNiaUFnSUNBZ0lITjBaWEFnUFNCMGFHbHpMbk5zYVdSbGNuTmJNRjB1YzNSbGNEdGNiaUFnSUNCOVhHNWNiaUFnSUNCMGFHbHpMbk5zYVdSbGNuTWdQU0JiWFR0Y2JseHVJQ0FnSUdadmNpQW9iR1YwSUdrOU1EdHBQSFJvYVhNdVgyNTFiV0psY2s5bVUyeHBaR1Z5Y3p0cEt5c3BJSHRjYmlBZ0lDQWdJR3hsZENCamIyNTBZV2x1WlhJZ1BTQmtiMk4xYldWdWRDNWpjbVZoZEdWRmJHVnRaVzUwS0NkemNHRnVKeWs3WEc1Y2JpQWdJQ0FnSUd4bGRDQnpiR2xrWlhJZ1BTQnVaWGNnVTJsdVoyeGxVMnhwWkdWeUtHTnZiblJoYVc1bGNpd2dlMXh1SUNBZ0lDQWdJQ0FnSUhOallXeGxPaUJiYldsdUxHMWhlRjBzWEc0Z0lDQWdJQ0FnSUNBZ2MzUmxjRG9nYzNSbGNDeGNiaUFnSUNBZ0lDQWdJQ0J0YjJSbE9pQW5ZV0p6YjJ4MWRHVW5MRnh1SUNBZ0lDQWdJQ0FnSUc5eWFXVnVkR0YwYVc5dU9pQW5kbVZ5ZEdsallXd25MRnh1SUNBZ0lDQWdJQ0FnSUhaaGJIVmxPaUIwYUdsekxuWmhiSFZsYzF0cFhTeGNiaUFnSUNBZ0lDQWdJQ0JvWVhOTGJtOWlPaUJtWVd4elpTeGNiaUFnSUNBZ0lDQWdJQ0JqYjIxd2IyNWxiblE2SUhSeWRXVXNYRzRnSUNBZ0lDQWdJSDBzZEdocGN5NTFjR1JoZEdVdVltbHVaQ2gwYUdsekxHa3BLVHRjYmlBZ0lDQWdJSE5zYVdSbGNpNXRkV3gwYVhOc2FXUmxjaUE5SUhSb2FYTTdYRzVjYmlBZ0lDQWdJSE5zYVdSbGNpNXBibVJsZUNBOUlHazdYRzRnSUNBZ0lDQnBaaUFvZEc5MVkyZ3VaWGhwYzNSektTQjdYRzRnSUNBZ0lDQWdJSE5zYVdSbGNpNWlZWEl1YVc1a1pYZ2dQU0JwTzF4dUlDQWdJQ0FnSUNCemJHbGtaWEl1Wm1sc2JHSmhjaTVwYm1SbGVDQTlJR2s3WEc0Z0lDQWdJQ0FnSUhOc2FXUmxjaTV3Y21WRGJHbGpheUE5SUhOc2FXUmxjaTV3Y21WTmIzWmxJRDBnYzJ4cFpHVnlMbkJ5WlZKbGJHVmhjMlVnUFNBb0tTQTlQaUI3ZlR0Y2JpQWdJQ0FnSUNBZ2MyeHBaR1Z5TG1Oc2FXTnJJRDBnYzJ4cFpHVnlMbTF2ZG1VZ1BTQnpiR2xrWlhJdWNtVnNaV0Z6WlNBOUlDZ3BJRDArSUh0OU8xeHVJQ0FnSUNBZ0lDQnpiR2xrWlhJdWNISmxWRzkxWTJnZ1BTQnpiR2xrWlhJdWNISmxWRzkxWTJoTmIzWmxJRDBnYzJ4cFpHVnlMbkJ5WlZSdmRXTm9VbVZzWldGelpTQTlJQ2dwSUQwK0lIdDlPMXh1SUNBZ0lDQWdJQ0J6Ykdsa1pYSXVkRzkxWTJnZ1BTQnpiR2xrWlhJdWRHOTFZMmhOYjNabElEMGdjMnhwWkdWeUxuUnZkV05vVW1Wc1pXRnpaU0E5SUNncElEMCtJSHQ5TzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCMGFHbHpMbk5zYVdSbGNuTXVjSFZ6YUNoemJHbGtaWElwTzF4dUlDQWdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLR052Ym5SaGFXNWxjaWs3WEc1Y2JpQWdJQ0I5WEc0Z0lDQWdhV1lnS0hSdmRXTm9MbVY0YVhOMGN5a2dlMXh1SUNBZ0lDQWdkR2hwY3k1aFpHUlViM1ZqYUV4cGMzUmxibVZ5Y3lncE8xeHVJQ0FnSUgxY2JseHVJQ0I5WEc1Y2JpQWdZMjlzYjNKSmJuUmxjbVpoWTJVb0tTQjdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FUMHdPMms4ZEdocGN5NXpiR2xrWlhKekxteGxibWQwYUR0cEt5c3BJSHRjYmlBZ0lDQWdJSFJvYVhNdWMyeHBaR1Z5YzF0cFhTNWpiMnh2Y25NZ1BTQjBhR2x6TG1OdmJHOXljenRjYmlBZ0lDQWdJSFJvYVhNdWMyeHBaR1Z5YzF0cFhTNWpiMnh2Y2tsdWRHVnlabUZqWlNncE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lITnBlbVZKYm5SbGNtWmhZMlVvS1NCN1hHNWNiaUFnSUNCc1pYUWdjMnhwWkdWeVYybGtkR2dnUFNCMGFHbHpMbmRwWkhSb0lDOGdkR2hwY3k1emJHbGtaWEp6TG14bGJtZDBhRHRjYmlBZ0lDQnNaWFFnYzJ4cFpHVnlTR1ZwWjJoMElEMGdkR2hwY3k1b1pXbG5hSFE3WEc1Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwUFRBN2FUeDBhR2x6TG5Oc2FXUmxjbk11YkdWdVozUm9PMmtyS3lrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV6Ykdsa1pYSnpXMmxkTG5KbGMybDZaU2h6Ykdsa1pYSlhhV1IwYUN4emJHbGtaWEpJWldsbmFIUXBPMXh1SUNBZ0lDQWdkR2hwY3k1emJHbGtaWEp6VzJsZExtTjFjM1J2YlZOMGVXeGxLQ2s3WEc0Z0lDQWdmVnh1WEc1Y2JpQWdmVnh1WEc0Z0lIVndaR0YwWlNocGJtUmxlQ3gyWVd4MVpTa2dlMXh1SUNBZ0lIUm9hWE11WlcxcGRDZ25ZMmhoYm1kbEp5eDdYRzRnSUNBZ0lDQW5hVzVrWlhnbk9pQnBibVJsZUN4Y2JpQWdJQ0FnSUNkMllXeDFaU2M2SUhaaGJIVmxYRzRnSUNBZ2ZTazdYRzRnSUgxY2JseHVJQ0JoWkdSVWIzVmphRXhwYzNSbGJtVnljeWdwSUh0Y2JseHVJQ0FnSUhSb2FYTXVjSEpsUTJ4cFkyc2dQU0IwYUdsekxuQnlaVTF2ZG1VZ1BTQjBhR2x6TG5CeVpWSmxiR1ZoYzJVZ1BTQW9LU0E5UGlCN2ZUdGNiaUFnSUNCMGFHbHpMbU5zYVdOcklEMGdkR2hwY3k1dGIzWmxJRDBnZEdocGN5NXlaV3hsWVhObElEMGdLQ2tnUFQ0Z2UzMDdYRzRnSUNBZ2RHaHBjeTV3Y21WVWIzVmphQ0E5SUhSb2FYTXVjSEpsVkc5MVkyaE5iM1psSUQwZ2RHaHBjeTV3Y21WVWIzVmphRkpsYkdWaGMyVWdQU0FvS1NBOVBpQjdmVHRjYmlBZ0lDQjBhR2x6TG5SdmRXTm9JRDBnZEdocGN5NTBiM1ZqYUUxdmRtVWdQU0IwYUdsekxuUnZkV05vVW1Wc1pXRnpaU0E5SUNncElEMCtJSHQ5TzF4dVhHNGdJQ0FnZEdocGN5NWpkWEp5Wlc1MFJXeGxiV1Z1ZENBOUlHWmhiSE5sTzF4dVhHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0ozUnZkV05vYzNSaGNuUW5MQ0FvWlNrZ1BUNGdlMXh1SUNBZ0lDQWdiR1YwSUdWc1pXMWxiblFnUFNCa2IyTjFiV1Z1ZEM1bGJHVnRaVzUwUm5KdmJWQnZhVzUwS0dVdWRHRnlaMlYwVkc5MVkyaGxjMXN3WFM1amJHbGxiblJZTEdVdWRHRnlaMlYwVkc5MVkyaGxjMXN3WFM1amJHbGxiblJaS1R0Y2JpQWdJQ0FnSUd4bGRDQnpiR2xrWlhJZ1BTQjBhR2x6TG5Oc2FXUmxjbk5iWld4bGJXVnVkQzVwYm1SbGVGMDdYRzRnSUNBZ0lDQnBaaUFvSVhOc2FXUmxjaTV2Wm1aelpYUXBJSHRjYmlBZ0lDQWdJQ0FnYzJ4cFpHVnlMbTltWm5ObGRDQTlJR1J2YlM1bWFXNWtVRzl6YVhScGIyNG9jMnhwWkdWeUxtVnNaVzFsYm5RcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2MyeHBaR1Z5TG0xdmRYTmxJRDBnWkc5dExteHZZMkYwWlUxdmRYTmxLR1VzYzJ4cFpHVnlMbTltWm5ObGRDazdYRzRnSUNBZ0lDQnpiR2xrWlhJdVpHOTNiaWdwTzF4dUlDQWdJQ0FnZEdocGN5NWpkWEp5Wlc1MFJXeGxiV1Z1ZENBOUlHVnNaVzFsYm5RdWFXNWtaWGc3WEc0Z0lDQWdJQ0JsTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEc0Z0lDQWdJQ0JsTG5OMGIzQlFjbTl3WVdkaGRHbHZiaWdwTzF4dUlDQWdJSDBwTzF4dVhHNGdJQ0FnZEdocGN5NWxiR1Z0Wlc1MExtRmtaRVYyWlc1MFRHbHpkR1Z1WlhJb0ozUnZkV05vYlc5MlpTY3NJQ2hsS1NBOVBpQjdYRzRnSUNBZ0lDQnNaWFFnWld4bGJXVnVkQ0E5SUdSdlkzVnRaVzUwTG1Wc1pXMWxiblJHY205dFVHOXBiblFvWlM1MFlYSm5aWFJVYjNWamFHVnpXekJkTG1Oc2FXVnVkRmdzWlM1MFlYSm5aWFJVYjNWamFHVnpXekJkTG1Oc2FXVnVkRmtwTzF4dUlDQWdJQ0FnYkdWMElITnNhV1JsY2lBOUlIUm9hWE11YzJ4cFpHVnljMXRsYkdWdFpXNTBMbWx1WkdWNFhUdGNiaUFnSUNBZ0lHbG1JQ2doYzJ4cFpHVnlMbTltWm5ObGRDa2dlMXh1SUNBZ0lDQWdJQ0J6Ykdsa1pYSXViMlptYzJWMElEMGdaRzl0TG1acGJtUlFiM05wZEdsdmJpaHpiR2xrWlhJdVpXeGxiV1Z1ZENrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCemJHbGtaWEl1Ylc5MWMyVWdQU0JrYjIwdWJHOWpZWFJsVFc5MWMyVW9aU3h6Ykdsa1pYSXViMlptYzJWMEtUdGNiaUFnSUNBZ0lHbG1JQ2hsYkdWdFpXNTBMbWx1WkdWNElUMDlkR2hwY3k1amRYSnlaVzUwUld4bGJXVnVkQ2tnZTF4dUlDQWdJQ0FnSUNCcFppQW9kR2hwY3k1amRYSnlaVzUwUld4bGJXVnVkQ0ErUFNBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnYkdWMElIQmhjM1J6Ykdsa1pYSWdQU0IwYUdsekxuTnNhV1JsY25OYmRHaHBjeTVqZFhKeVpXNTBSV3hsYldWdWRGMDdYRzRnSUNBZ0lDQWdJQ0FnY0dGemRITnNhV1JsY2k1MWNDZ3BPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUhOc2FXUmxjaTVrYjNkdUtDazdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnpiR2xrWlhJdWMyeHBaR1VvS1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUhSb2FYTXVZM1Z5Y21WdWRFVnNaVzFsYm5RZ1BTQmxiR1Z0Wlc1MExtbHVaR1Y0TzF4dUlDQWdJQ0FnWlM1d2NtVjJaVzUwUkdWbVlYVnNkQ2dwTzF4dUlDQWdJQ0FnWlM1emRHOXdVSEp2Y0dGbllYUnBiMjRvS1R0Y2JpQWdJQ0I5S1R0Y2JseHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNWhaR1JGZG1WdWRFeHBjM1JsYm1WeUtDZDBiM1ZqYUdWdVpDY3NJQ2hsS1NBOVBpQjdYRzRnSUNBZ0lDQXZMeUJ1YnlCMGIzVmphR1Z6SUhSdklHTmhiR04xYkdGMFpTQmlaV05oZFhObElHNXZibVVnY21WdFlXbHVhVzVuWEc0Z0lDQWdJQ0JzWlhRZ2MyeHBaR1Z5SUQwZ2RHaHBjeTV6Ykdsa1pYSnpXM1JvYVhNdVkzVnljbVZ1ZEVWc1pXMWxiblJkTzF4dUlDQWdJQ0FnYzJ4cFpHVnlMblZ3S0NrN1hHNGdJQ0FnSUNCMGFHbHpMbWx1ZEdWeVlXTjBhVzVuSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0IwYUdsekxtTjFjbkpsYm5SRmJHVnRaVzUwSUQwZ1ptRnNjMlU3WEc0Z0lDQWdJQ0JsTG5CeVpYWmxiblJFWldaaGRXeDBLQ2s3WEc0Z0lDQWdJQ0JsTG5OMGIzQlFjbTl3WVdkaGRHbHZiaWdwTzF4dUlDQWdJSDBwTzF4dVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ1IyVjBJRzl5SUhObGRDQjBhR1VnYm5WdFltVnlJRzltSUhOc2FXUmxjbk5jYmlBZ1FIUjVjR1VnZTA1MWJXSmxjbjFjYmlBZ0tpOWNiaUFnWjJWMElHNTFiV0psY2s5bVUyeHBaR1Z5Y3lncElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NXpiR2xrWlhKekxteGxibWQwYUR0Y2JpQWdmVnh1WEc0Z0lITmxkQ0J1ZFcxaVpYSlBabE5zYVdSbGNuTW9kaWtnZTF4dUlDQWdJR2xtSUNoMlBUMDlkR2hwY3k1emJHbGtaWEp6TG14bGJtZDBhQ2tnZTF4dUlDQWdJQ0FnY21WMGRYSnVPMXh1SUNBZ0lIMWNiaUFnSUNCMGFHbHpMbk5zYVdSbGNuTXVabTl5UldGamFDZ29jMnhwWkdWeUtUMCtlMXh1SUNBZ0lDQWdjMnhwWkdWeUxtUmxjM1J5YjNrb0tUdGNiaUFnSUNCOUtUdGNiaUFnSUNCMGFHbHpMbVZ0Y0hSNUtDazdYRzRnSUNBZ2RHaHBjeTVmYm5WdFltVnlUMlpUYkdsa1pYSnpJRDBnZGp0Y2JpQWdJQ0IwYUdsekxtSjFhV3hrU1c1MFpYSm1ZV05sS0NrN1hHNGdJSDFjYmx4dVhHNWNiaUFnTHlvcVhHNGdJRXh2ZDJWeUlHeHBiV2wwSUc5bUlIUm9aU0J0ZFd4MGFYTnNhV1JsY2lkeklHOTFkSEIxZENCeVlXNW5aVnh1SUNCQWRIbHdaU0I3Ym5WdFltVnlmVnh1SUNCQVpYaGhiWEJzWlNCdGRXeDBhWE5zYVdSbGNpNXRhVzRnUFNBeE1EQXdPMXh1SUNBcUwxeHVJQ0JuWlhRZ2JXbHVLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TG5Oc2FXUmxjbk5iTUYwdWJXbHVPMXh1SUNCOVhHNGdJSE5sZENCdGFXNG9kaWtnZTF4dUlDQWdJSFJvYVhNdWMyeHBaR1Z5Y3k1bWIzSkZZV05vS0NoemJHbGtaWElwUFQ1N1hHNGdJQ0FnSUNCemJHbGtaWEl1YldsdUlEMGdkanRjYmlBZ0lDQjlLVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0JWY0hCbGNpQnNhVzFwZENCdlppQjBhR1VnYlhWc2RHbHpiR2xrWlhJbmN5QnZkWFJ3ZFhRZ2NtRnVaMlZjYmlBZ1FIUjVjR1VnZTI1MWJXSmxjbjFjYmlBZ1FHVjRZVzF3YkdVZ2JYVnNkR2x6Ykdsa1pYSXViV0Y0SUQwZ01UQXdNRHRjYmlBZ0tpOWNiaUFnWjJWMElHMWhlQ2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1emJHbGtaWEp6V3pCZExtMWhlRHRjYmlBZ2ZWeHVJQ0J6WlhRZ2JXRjRLSFlwSUh0Y2JpQWdJQ0IwYUdsekxuTnNhV1JsY25NdVptOXlSV0ZqYUNnb2MyeHBaR1Z5S1QwK2UxeHVJQ0FnSUNBZ2MyeHBaR1Z5TG0xaGVDQTlJSFk3WEc0Z0lDQWdmU2s3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnVkdobElHbHVZM0psYldWdWRDQjBhR0YwSUhSb1pTQnRkV3gwYVhOc2FXUmxjaWR6SUhaaGJIVmxJR05vWVc1blpYTWdZbmt1WEc0Z0lFQjBlWEJsSUh0dWRXMWlaWEo5WEc0Z0lFQmxlR0Z0Y0d4bElHMTFiSFJwYzJ4cFpHVnlMbk4wWlhBZ1BTQTFPMXh1SUNBcUwxeHVJQ0JuWlhRZ2MzUmxjQ2dwSUh0Y2JpQWdJQ0J5WlhSMWNtNGdkR2hwY3k1emJHbGtaWEp6V3pCZExuTjBaWEE3WEc0Z0lIMWNiaUFnYzJWMElITjBaWEFvZGlrZ2UxeHVJQ0FnSUhSb2FYTXVjMnhwWkdWeWN5NW1iM0pGWVdOb0tDaHpiR2xrWlhJcFBUNTdYRzRnSUNBZ0lDQnpiR2xrWlhJdWMzUmxjQ0E5SUhZN1hHNGdJQ0FnZlNrN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ1UyVjBJSFJvWlNCMllXeDFaU0J2WmlCaGJpQnBibVJwZG1sa2RXRnNJSE5zYVdSbGNseHVJQ0JBY0dGeVlXMGdhVzVrWlhnZ2UyNTFiV0psY24wZ1UyeHBaR1Z5SUdsdVpHVjRYRzRnSUVCd1lYSmhiU0IyWVd4MVpTQjdiblZ0WW1WeWZTQk9aWGNnYzJ4cFpHVnlJSFpoYkhWbFhHNGdJRUJsZUdGdGNHeGxYRzRnSUM4dklGTmxkQ0IwYUdVZ1ptbHljM1FnYzJ4cFpHVnlJSFJ2SUhaaGJIVmxJREF1TlZ4dUlDQnRkV3gwYVhOc2FXUmxjaTV6WlhSVGJHbGtaWElvTUN3d0xqVXBYRzRnSUNvdlhHNGdJSE5sZEZOc2FXUmxjaWhwYm1SbGVDeDJZV3gxWlNrZ2UxeHVJQ0FnSUhSb2FYTXVjMnhwWkdWeWMxdHBibVJsZUYwdWRtRnNkV1VnUFNCMllXeDFaVHRjYmlBZ0lDQjBhR2x6TG1WdGFYUW9KMk5vWVc1blpTY3NlMXh1SUNBZ0lDQWdKMmx1WkdWNEp6b2dhVzVrWlhnc1hHNGdJQ0FnSUNBbmRtRnNkV1VuT2lCMllXeDFaVnh1SUNBZ0lIMHBPMXh1SUNCOVhHNWNiaUFnTHlvcVhHNGdJRk5sZENCMGFHVWdkbUZzZFdVZ2IyWWdZV3hzSUhOc2FXUmxjbk1nWVhRZ2IyNWpaUzRnU1dZZ2RHaGxJSE5wZW1VZ2IyWWdkR2hsSUdsdWNIVjBJR0Z5Y21GNUlHUnZaWE1nYm05MElHMWhkR05vSUhSb1pTQmpkWEp5Wlc1MElHNTFiV0psY2lCdlppQnpiR2xrWlhKekxDQjBhR1VnZG1Gc2RXVWdZWEp5WVhrZ2QybHNiQ0J5WlhCbFlYUWdkVzUwYVd3Z1lXeHNJSE5zYVdSbGNuTWdhR0YyWlNCaVpXVnVJSE5sZEM0Z1NTNWxMaUJoYmlCcGJuQjFkQ0JoY25KaGVTQnZaaUJzWlc1bmRHZ2dNU0IzYVd4c0lITmxkQ0JoYkd3Z2MyeHBaR1Z5Y3lCMGJ5QjBhR0YwSUhaaGJIVmxMbHh1SUNCQWNHRnlZVzBnZG1Gc2RXVnpJSHRCY25KaGVYMGdRV3hzSUhOc2FXUmxjaUIyWVd4MVpYTmNiaUFnUUdWNFlXMXdiR1ZjYmlBZ2JYVnNkR2x6Ykdsa1pYSXVjMlYwUVd4c1UyeHBaR1Z5Y3loYk1DNHlMREF1TXl3d0xqUXNNQzQxTERBdU5sMHBYRzRnSUNvdlhHNGdJSE5sZEVGc2JGTnNhV1JsY25Nb2RtRnNkV1Z6S1NCN1hHNGdJQ0FnZEdocGN5NTJZV3gxWlhNZ1BTQjJZV3gxWlhNN1hHNGdJQ0FnZEdocGN5NXpiR2xrWlhKekxtWnZja1ZoWTJnb0tITnNhV1JsY2l4cEtUMCtlMXh1SUNBZ0lDQWdjMnhwWkdWeUxuWmhiSFZsSUQwZ2RtRnNkV1Z6VzJrbGRtRnNkV1Z6TG14bGJtZDBhRjA3WEc0Z0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzZTF4dUlDQWdJQ0FnSUNBbmFXNWtaWGduT2lCcExGeHVJQ0FnSUNBZ0lDQW5kbUZzZFdVbk9pQnpiR2xrWlhJdWRtRnNkV1ZjYmlBZ0lDQWdJSDBwTzF4dUlDQWdJSDBwTzF4dUlDQjlYRzVjYm4xY2JseHVYRzVjYmk4dklGZEZRbEJCUTBzZ1JrOVBWRVZTSUM4dlhHNHZMeUF1TDM0dmFuTm9hVzUwTFd4dllXUmxjaUV1TDJ4cFlpOXBiblJsY21aaFkyVnpMMjExYkhScGMyeHBaR1Z5TG1weklpd2lKM1Z6WlNCemRISnBZM1FuTzF4dVhHNXNaWFFnYzNabklEMGdjbVZ4ZFdseVpTZ25MaTR2ZFhScGJDOXpkbWNuS1R0Y2JteGxkQ0JKYm5SbGNtWmhZMlVnUFNCeVpYRjFhWEpsS0NjdUxpOWpiM0psTDJsdWRHVnlabUZqWlNjcE8xeHViR1YwSUZOMFpYQWdQU0J5WlhGMWFYSmxLQ2N1TGk5dGIyUmxiSE12YzNSbGNDY3BPMXh1YVcxd2IzSjBJQ29nWVhNZ1NXNTBaWEpoWTNScGIyNGdabkp2YlNBbkxpNHZkWFJwYkM5cGJuUmxjbUZqZEdsdmJpYzdYRzVjYm1WNGNHOXlkQ0JrWldaaGRXeDBJR05zWVhOeklGTnNhV1JsY2xSbGJYQnNZWFJsSUdWNGRHVnVaSE1nU1c1MFpYSm1ZV05sSUh0Y2JseHVJQ0JqYjI1emRISjFZM1J2Y2loaGNtZHpMRzl3ZEdsdmJuTXNaR1ZtWVhWc2RITXBJSHRjYmx4dUlDQWdJSE4xY0dWeUtHRnlaM01zYjNCMGFXOXVjeXhrWldaaGRXeDBjeWs3WEc1Y2JpQWdJQ0IwYUdsekxtOXlhV1Z1ZEdGMGFXOXVJRDBnZEdocGN5NXpaWFIwYVc1bmN5NXZjbWxsYm5SaGRHbHZianRjYmx4dUlDQXZMeUFnZEdocGN5NXRiMlJsSUQwZ2RHaHBjeTV6WlhSMGFXNW5jeTV0YjJSbE8xeHVYRzRnSUNBZ2RHaHBjeTVvWVhOTGJtOWlJRDBnZEdocGN5NXpaWFIwYVc1bmN5NW9ZWE5MYm05aU8xeHVYRzRnSUNBZ0x5OGdkR2hwY3k1emRHVndJSE5vYjNWc1pDQmxkbVZ1ZEhWaGJHeDVJR0psSUdkbGRDOXpaWFJjYmlBZ0lDQXZMeUIxY0dSaGRHbHVaeUJwZENCM2FXeHNJSFZ3WkdGMFpTQjBhR1VnWDNaaGJIVmxJSE4wWlhBZ2JXOWtaV3hjYmlBZ0x5OGdJSFJvYVhNdWMzUmxjQ0E5SUhSb2FYTXVjMlYwZEdsdVozTXVjM1JsY0RzZ0x5OGdabXh2WVhSY2JseHVJQ0FnSUhSb2FYTXVYM1poYkhWbElEMGdibVYzSUZOMFpYQW9kR2hwY3k1elpYUjBhVzVuY3k1elkyRnNaVnN3WFN3Z2RHaHBjeTV6WlhSMGFXNW5jeTV6WTJGc1pWc3hYU3dnZEdocGN5NXpaWFIwYVc1bmN5NXpkR1Z3TENCMGFHbHpMbk5sZEhScGJtZHpMblpoYkhWbEtUdGNibHh1SUNBZ0lIUm9hWE11YVc1cGRDZ3BPMXh1WEc0Z0lDQWdkR2hwY3k1d2IzTnBkR2x2YmlBOUlHNWxkeUJKYm5SbGNtRmpkR2x2Ymk1SVlXNWtiR1VvZEdocGN5NXpaWFIwYVc1bmN5NXRiMlJsTEhSb2FYTXViM0pwWlc1MFlYUnBiMjRzV3pBc2RHaHBjeTUzYVdSMGFGMHNXM1JvYVhNdWFHVnBaMmgwTERCZEtUdGNiaUFnSUNCMGFHbHpMbkJ2YzJsMGFXOXVMblpoYkhWbElEMGdkR2hwY3k1ZmRtRnNkV1V1Ym05eWJXRnNhWHBsWkR0Y2JseHVJQ0FnSUhSb2FYTXVkbUZzZFdVZ1BTQjBhR2x6TGw5MllXeDFaUzUyWVd4MVpUdGNibHh1SUNBZ0lIUm9hWE11WlcxcGRDZ25ZMmhoYm1kbEp5eDBhR2x6TG5aaGJIVmxLVHRjYmx4dUlDQjlYRzVjYmlBZ1luVnBiR1JKYm5SbGNtWmhZMlVvS1NCN1hHNWNiaUFnSUNCMGFHbHpMbUpoY2lBOUlITjJaeTVqY21WaGRHVW9KM0psWTNRbktUdGNiaUFnSUNCMGFHbHpMbVpwYkd4aVlYSWdQU0J6ZG1jdVkzSmxZWFJsS0NkeVpXTjBKeWs3WEc0Z0lDQWdkR2hwY3k1cmJtOWlJRDBnYzNabkxtTnlaV0YwWlNnblkybHlZMnhsSnlrN1hHNWNiaUFnSUNCMGFHbHpMbVZzWlcxbGJuUXVZWEJ3Wlc1a1EyaHBiR1FvZEdocGN5NWlZWElwTzF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1aGNIQmxibVJEYUdsc1pDaDBhR2x6TG1acGJHeGlZWElwTzF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1aGNIQmxibVJEYUdsc1pDaDBhR2x6TG10dWIySXBPMXh1WEc0Z0lDQWdkR2hwY3k1emFYcGxTVzUwWlhKbVlXTmxLQ2s3WEc1Y2JseHVYRzRnSUgxY2JseHVJQ0J6YVhwbFNXNTBaWEptWVdObEtDa2dlMXh1WEc1Y2JpQWdJQ0JwWmlBb0lYUm9hWE11YzJWMGRHbHVaM011YjNKcFpXNTBZWFJwYjI0cElIdGNiaUFnSUNBZ0lHbG1JQ2gwYUdsekxuZHBaSFJvSUR3Z2RHaHBjeTVvWldsbmFIUXBJSHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXZjbWxsYm5SaGRHbHZiaUE5SUNkMlpYSjBhV05oYkNjN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbTl5YVdWdWRHRjBhVzl1SUQwZ0oyaHZjbWw2YjI1MFlXd25PMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lHeGxkQ0I0TENCNUxDQjNMQ0JvTENCaVlYSlBabVp6WlhRc0lHTnZjbTVsY2xKaFpHbDFjenRjYmlBZ0lDQjBhR2x6TG10dWIySkVZWFJoSUQwZ2UxeHVJQ0FnSUNBZ2JHVjJaV3c2SURBc1hHNGdJQ0FnSUNCeU9pQXdYRzRnSUNBZ2ZUdGNibHh1SUNBZ0lHbG1JQ2gwYUdsekxtOXlhV1Z1ZEdGMGFXOXVJRDA5UFNBbmRtVnlkR2xqWVd3bktTQjdYRzRnSUNBZ0lDQjBhR2x6TG5Sb2FXTnJibVZ6Y3lBOUlIUm9hWE11ZDJsa2RHZ2dMeUF5TzF4dUlDQWdJRngwZUNBOUlIUm9hWE11ZDJsa2RHZ3ZNanRjYmlBZ0lDQmNkSGtnUFNBd08xeHVJQ0FnSUZ4MGR5QTlJSFJvYVhNdWRHaHBZMnR1WlhOek8xeHVJQ0FnSUZ4MGFDQTlJSFJvYVhNdWFHVnBaMmgwTzF4dUlDQWdJQ0FnZEdocGN5NXJibTlpUkdGMFlTNXlJRDBnZEdocGN5NTBhR2xqYTI1bGMzTWdLaUF3TGpnN1hHNGdJQ0FnWEhSMGFHbHpMbXR1YjJKRVlYUmhMbXhsZG1Wc0lEMGdhQzEwYUdsekxtNXZjbTFoYkdsNlpXUXFhRHRjYmlBZ0lDQWdJR0poY2s5bVpuTmxkQ0E5SUNkMGNtRnVjMnhoZEdVb0p5dDBhR2x6TG5Sb2FXTnJibVZ6Y3lvb0xURXBMeklySnl3d0tTYzdYRzRnSUNBZ0lDQmpiM0p1WlhKU1lXUnBkWE1nUFNCM0x6STdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhSb2FYTXVkR2hwWTJ0dVpYTnpJRDBnZEdocGN5NW9aV2xuYUhRZ0x5QXlPMXh1SUNBZ0lGeDBlQ0E5SURBN1hHNGdJQ0FnWEhSNUlEMGdkR2hwY3k1b1pXbG5hSFF2TWp0Y2JpQWdJQ0JjZEhjZ1BTQjBhR2x6TG5kcFpIUm9PMXh1SUNBZ0lGeDBhQ0E5SUhSb2FYTXVkR2hwWTJ0dVpYTnpPMXh1SUNBZ0lDQWdkR2hwY3k1cmJtOWlSR0YwWVM1eUlEMGdkR2hwY3k1MGFHbGphMjVsYzNNZ0tpQXdMamc3WEc0Z0lDQWdYSFIwYUdsekxtdHViMkpFWVhSaExteGxkbVZzSUQwZ2RHaHBjeTV1YjNKdFlXeHBlbVZrS25jN1hHNGdJQ0FnSUNCaVlYSlBabVp6WlhRZ1BTQW5kSEpoYm5Oc1lYUmxLREFzSnl0MGFHbHpMblJvYVdOcmJtVnpjeW9vTFRFcEx6SXJKeWtuTzF4dUlDQWdJQ0FnWTI5eWJtVnlVbUZrYVhWeklEMGdhQzh5TzF4dUlDQWdJSDFjYmx4dUlDQWdJSFJvYVhNdVltRnlMbk5sZEVGMGRISnBZblYwWlNnbmVDY3NlQ2s3WEc0Z0lDQWdkR2hwY3k1aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkNUp5eDVLVHRjYmlBZ0lDQjBhR2x6TG1KaGNpNXpaWFJCZEhSeWFXSjFkR1VvSjNSeVlXNXpabTl5YlNjc1ltRnlUMlptYzJWMEtUdGNiaUFnSUNCMGFHbHpMbUpoY2k1elpYUkJkSFJ5YVdKMWRHVW9KM0o0Snl4amIzSnVaWEpTWVdScGRYTXBPeUF2THlCamIzSnVaWElnY21Ga2FYVnpYRzRnSUNBZ2RHaHBjeTVpWVhJdWMyVjBRWFIwY21saWRYUmxLQ2R5ZVNjc1kyOXlibVZ5VW1Ga2FYVnpLVHRjYmlBZ0lDQjBhR2x6TG1KaGNpNXpaWFJCZEhSeWFXSjFkR1VvSjNkcFpIUm9KeXgzS1R0Y2JpQWdJQ0IwYUdsekxtSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0oyaGxhV2RvZENjc2FDazdYRzVjYmlBZ0lDQnBaaUFvZEdocGN5NXZjbWxsYm5SaGRHbHZiaUE5UFQwZ0ozWmxjblJwWTJGc0p5a2dlMXh1SUNBZ0lDQWdkR2hwY3k1bWFXeHNZbUZ5TG5ObGRFRjBkSEpwWW5WMFpTZ25lQ2NzZUNrN1hHNGdJQ0FnSUNCMGFHbHpMbVpwYkd4aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkNUp5eDBhR2x6TG10dWIySkVZWFJoTG14bGRtVnNLVHRjYmlBZ0lDQWdJSFJvYVhNdVptbHNiR0poY2k1elpYUkJkSFJ5YVdKMWRHVW9KM2RwWkhSb0p5eDNLVHRjYmlBZ0lDQWdJSFJvYVhNdVptbHNiR0poY2k1elpYUkJkSFJ5YVdKMWRHVW9KMmhsYVdkb2RDY3NhQzEwYUdsekxtdHViMkpFWVhSaExteGxkbVZzS1R0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdkR2hwY3k1bWFXeHNZbUZ5TG5ObGRFRjBkSEpwWW5WMFpTZ25lQ2NzTUNrN1hHNGdJQ0FnSUNCMGFHbHpMbVpwYkd4aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkNUp5eDVLVHRjYmlBZ0lDQWdJSFJvYVhNdVptbHNiR0poY2k1elpYUkJkSFJ5YVdKMWRHVW9KM2RwWkhSb0p5eDBhR2x6TG10dWIySkVZWFJoTG14bGRtVnNLVHRjYmlBZ0lDQWdJSFJvYVhNdVptbHNiR0poY2k1elpYUkJkSFJ5YVdKMWRHVW9KMmhsYVdkb2RDY3NhQ2s3WEc0Z0lDQWdmVnh1SUNBZ0lIUm9hWE11Wm1sc2JHSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0ozUnlZVzV6Wm05eWJTY3NZbUZ5VDJabWMyVjBLVHRjYmlBZ0lDQjBhR2x6TG1acGJHeGlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZHllQ2NzWTI5eWJtVnlVbUZrYVhWektUdGNiaUFnSUNCMGFHbHpMbVpwYkd4aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkeWVTY3NZMjl5Ym1WeVVtRmthWFZ6S1R0Y2JseHVJQ0FnSUdsbUlDaDBhR2x6TG05eWFXVnVkR0YwYVc5dUlEMDlQU0FuZG1WeWRHbGpZV3duS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbXR1YjJJdWMyVjBRWFIwY21saWRYUmxLQ2RqZUNjc2VDazdYRzRnSUNBZ0lDQjBhR2x6TG10dWIySXVjMlYwUVhSMGNtbGlkWFJsS0NkamVTY3NkR2hwY3k1cmJtOWlSR0YwWVM1c1pYWmxiQ2s3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjJONEp5eDBhR2x6TG10dWIySkVZWFJoTG14bGRtVnNLVHRjYmlBZ0lDQWdJSFJvYVhNdWEyNXZZaTV6WlhSQmRIUnlhV0oxZEdVb0oyTjVKeXg1S1R0Y2JpQWdJQ0I5WEc0Z0lDQWdkR2hwY3k1cmJtOWlMbk5sZEVGMGRISnBZblYwWlNnbmNpY3NkR2hwY3k1cmJtOWlSR0YwWVM1eUtUdGNibHh1WEc0Z0lDQWdhV1lnS0hSb2FYTXVjRzl6YVhScGIyNHBJSHRjYmlBZ0lDQWdJSFJvYVhNdWNHOXphWFJwYjI0dWNtVnphWHBsS0Zzd0xIUm9hWE11ZDJsa2RHaGRMRnQwYUdsekxtaGxhV2RvZEN3d1hTazdYRzRnSUNBZ2ZWeHVYRzRnSUgxY2JseHVJQ0JqYjJ4dmNrbHVkR1Z5Wm1GalpTZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdVltRnlMbk5sZEVGMGRISnBZblYwWlNnblptbHNiQ2NzSUhSb2FYTXVZMjlzYjNKekxtWnBiR3dwTzF4dUlDQWdJSFJvYVhNdVptbHNiR0poY2k1elpYUkJkSFJ5YVdKMWRHVW9KMlpwYkd3bkxDQjBhR2x6TG1OdmJHOXljeTVoWTJObGJuUXBPMXh1SUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjJacGJHd25MQ0IwYUdsekxtTnZiRzl5Y3k1aFkyTmxiblFwTzF4dUlDQWdJR2xtSUNnaGRHaHBjeTVvWVhOTGJtOWlLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtdHViMkl1YzJWMFFYUjBjbWxpZFhSbEtDZG1hV3hzSnl3bmJtOXVaU2NwTzF4dUlDQWdJSDFjYmx4dUlDQjlYRzVjYmlBZ2NtVnVaR1Z5S0NrZ2UxeHVJQ0FnSUdsbUlDZ2hkR2hwY3k1amJHbGphMlZrS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbXR1YjJKRVlYUmhMbklnUFNCMGFHbHpMblJvYVdOcmJtVnpjeW93TGpjMU8xeHVJQ0FnSUgxY2JpQWdJQ0IwYUdsekxtdHViMkl1YzJWMFFYUjBjbWxpZFhSbEtDZHlKeXgwYUdsekxtdHViMkpFWVhSaExuSXBPMXh1WEc0Z0lDQWdhV1lnS0hSb2FYTXViM0pwWlc1MFlYUnBiMjRnUFQwOUlDZDJaWEowYVdOaGJDY3BJSHRjYmlBZ0lDQWdJQ0IwYUdsekxtdHViMkpFWVhSaExteGxkbVZzSUQwZ2RHaHBjeTVmZG1Gc2RXVXVibTl5YldGc2FYcGxaQ3AwYUdsekxtaGxhV2RvZER0Y2JpQWdJQ0FnSUNCMGFHbHpMbXR1YjJJdWMyVjBRWFIwY21saWRYUmxLQ2RqZVNjc2RHaHBjeTVvWldsbmFIUWdMU0IwYUdsekxtdHViMkpFWVhSaExteGxkbVZzS1R0Y2JpQWdJQ0FnSUNCMGFHbHpMbVpwYkd4aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkNUp5eDBhR2x6TG1obGFXZG9kQ0F0SUhSb2FYTXVhMjV2WWtSaGRHRXViR1YyWld3cE8xeHVJQ0FnSUNBZ0lIUm9hWE11Wm1sc2JHSmhjaTV6WlhSQmRIUnlhV0oxZEdVb0oyaGxhV2RvZENjc2RHaHBjeTVyYm05aVJHRjBZUzVzWlhabGJDazdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNCMGFHbHpMbXR1YjJKRVlYUmhMbXhsZG1Wc0lEMGdkR2hwY3k1ZmRtRnNkV1V1Ym05eWJXRnNhWHBsWkNwMGFHbHpMbmRwWkhSb08xeHVJQ0FnSUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjJONEp5eDBhR2x6TG10dWIySkVZWFJoTG14bGRtVnNLVHRjYmlBZ0lDQWdJQ0IwYUdsekxtWnBiR3hpWVhJdWMyVjBRWFIwY21saWRYUmxLQ2Q0Snl3d0tUdGNiaUFnSUNBZ0lDQjBhR2x6TG1acGJHeGlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZDNhV1IwYUNjc2RHaHBjeTVyYm05aVJHRjBZUzVzWlhabGJDazdYRzRnSUNBZ2ZWeHVJQ0I5WEc1Y2JpQWdaRzkzYmlncElIdGNiaUFnSUNCMGFHbHpMbU5zYVdOclpXUWdQU0IwY25WbE8xeHVJQ0FnSUhSb2FYTXVhMjV2WWtSaGRHRXVjaUE5SUhSb2FYTXVkR2hwWTJ0dVpYTnpLakF1T1R0Y2JpQWdJQ0IwYUdsekxuQnZjMmwwYVc5dUxtRnVZMmh2Y2lBOUlIUm9hWE11Ylc5MWMyVTdYRzRnSUNBZ2RHaHBjeTV6Ykdsa1pTZ3BPMXh1SUNCOVhHNWNiaUFnYzJ4cFpHVW9LU0I3WEc0Z0lDQWdhV1lnS0hSb2FYTXVZMnhwWTJ0bFpDa2dlMXh1SUNBZ0lDQWdkR2hwY3k1d2IzTnBkR2x2Ymk1MWNHUmhkR1VvZEdocGN5NXRiM1Z6WlNrN1hHNGdJQ0FnSUNCMGFHbHpMblpoYkhWbElEMGdkR2hwY3k1ZmRtRnNkV1V1ZFhCa1lYUmxUbTl5YldGc0tDQjBhR2x6TG5CdmMybDBhVzl1TG5aaGJIVmxJQ2s3WEc0Z0lDQWdJQ0IwYUdsekxtVnRhWFFvSjJOb1lXNW5aU2NzZEdocGN5NTJZV3gxWlNrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2RYQW9LU0I3WEc0Z0lDQWdkR2hwY3k1amJHbGphMlZrSUQwZ1ptRnNjMlU3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdmVnh1WEc0Z0lHZGxkQ0J1YjNKdFlXeHBlbVZrS0NrZ2UxeHVJQ0FnSUhKbGRIVnliaUIwYUdsekxsOTJZV3gxWlM1dWIzSnRZV3hwZW1Wa08xeHVJQ0I5WEc1Y2JpQWdMeW9xWEc0Z0lGUm9aU0J6Ykdsa1pYSW5jeUJqZFhKeVpXNTBJSFpoYkhWbExpQkpaaUJ6WlhRZ2JXRnVkV0ZzYkhrc0lIZHBiR3dnZFhCa1lYUmxJSFJvWlNCcGJuUmxjbVpoWTJVZ1lXNWtJSFJ5YVdkblpYSWdkR2hsSUc5MWRIQjFkQ0JsZG1WdWRDNWNiaUFnUUhSNWNHVWdlMjUxYldKbGNuMWNiaUFnUUdWNFlXMXdiR1VnYzJ4cFpHVnlMblpoYkhWbElEMGdNVEE3WEc0Z0lDb3ZYRzRnSUdkbGRDQjJZV3gxWlNncElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NWZkbUZzZFdVdWRtRnNkV1U3WEc0Z0lIMWNiaUFnYzJWMElIWmhiSFZsS0hZcElIdGNiaUFnSUNCMGFHbHpMbDkyWVd4MVpTNTFjR1JoZEdVb2RpazdYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaTUyWVd4MVpTQTlJSFJvYVhNdVgzWmhiSFZsTG01dmNtMWhiR2w2WldRN1hHNGdJQ0FnZEdocGN5NXlaVzVrWlhJb0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQk1iM2RsY2lCc2FXMXBkQ0J2WmlCMGFHVWdjMnhwWkdWeWN5ZHpJRzkxZEhCMWRDQnlZVzVuWlZ4dUlDQkFkSGx3WlNCN2JuVnRZbVZ5ZlZ4dUlDQkFaWGhoYlhCc1pTQnpiR2xrWlhJdWJXbHVJRDBnTVRBd01EdGNiaUFnS2k5Y2JpQWdaMlYwSUcxcGJpZ3BJSHRjYmlBZ0lDQnlaWFIxY200Z2RHaHBjeTVmZG1Gc2RXVXViV2x1TzF4dUlDQjlYRzRnSUhObGRDQnRhVzRvZGlrZ2UxeHVJQ0FnSUhSb2FYTXVYM1poYkhWbExtMXBiaUE5SUhZN1hHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ1ZYQndaWElnYkdsdGFYUWdiMllnZEdobElITnNhV1JsY2lkeklHOTFkSEIxZENCeVlXNW5aVnh1SUNCQWRIbHdaU0I3Ym5WdFltVnlmVnh1SUNCQVpYaGhiWEJzWlNCemJHbGtaWEl1YldGNElEMGdNVEF3TUR0Y2JpQWdLaTljYmlBZ1oyVjBJRzFoZUNncElIdGNiaUFnSUNCeVpYUjFjbTRnZEdocGN5NWZkbUZzZFdVdWJXRjRPMXh1SUNCOVhHNGdJSE5sZENCdFlYZ29kaWtnZTF4dUlDQWdJSFJvYVhNdVgzWmhiSFZsTG0xaGVDQTlJSFk3WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnVkdobElHbHVZM0psYldWdWRDQjBhR0YwSUhSb1pTQnpiR2xrWlhJbmN5QjJZV3gxWlNCamFHRnVaMlZ6SUdKNUxseHVJQ0JBZEhsd1pTQjdiblZ0WW1WeWZWeHVJQ0JBWlhoaGJYQnNaU0J6Ykdsa1pYSXVjM1JsY0NBOUlEVTdYRzRnSUNvdlhHNGdJR2RsZENCemRHVndLQ2tnZTF4dUlDQWdJSEpsZEhWeWJpQjBhR2x6TGw5MllXeDFaUzV6ZEdWd08xeHVJQ0I5WEc0Z0lITmxkQ0J6ZEdWd0tIWXBJSHRjYmlBZ0lDQjBhR2x6TGw5MllXeDFaUzV6ZEdWd0lEMGdkanRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0JCWW5OdmJIVjBaU0J0YjJSbElDaHpiR2xrWlhJbmN5QjJZV3gxWlNCcWRXMXdjeUIwYnlCdGIzVnpaU0JqYkdsamF5QndiM05wZEdsdmJpa2diM0lnY21Wc1lYUnBkbVVnYlc5a1pTQW9iVzkxYzJVZ1pISmhaeUJqYUdGdVoyVnpJSFpoYkhWbElISmxiR0YwYVhabElIUnZJR2wwY3lCamRYSnlaVzUwSUhCdmMybDBhVzl1S1M0Z1JHVm1ZWFZzZERvZ1hDSnlaV3hoZEdsMlpWd2lMbHh1SUNCQWRIbHdaU0I3YzNSeWFXNW5mVnh1SUNCQVpYaGhiWEJzWlNCemJHbGtaWEl1Ylc5a1pTQTlJRndpY21Wc1lYUnBkbVZjSWp0Y2JpQWdLaTljYmlBZ1oyVjBJRzF2WkdVb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVjRzl6YVhScGIyNHViVzlrWlR0Y2JpQWdmVnh1SUNCelpYUWdiVzlrWlNoMktTQjdYRzRnSUNBZ2RHaHBjeTV3YjNOcGRHbHZiaTV0YjJSbElEMGdkanRjYmlBZ2ZWeHVYRzVjYm4xY2JseHVYRzVjYmk4dklGZEZRbEJCUTBzZ1JrOVBWRVZTSUM4dlhHNHZMeUF1TDM0dmFuTm9hVzUwTFd4dllXUmxjaUV1TDJ4cFlpOWpiMjF3YjI1bGJuUnpMM05zYVdSbGNuUmxiWEJzWVhSbExtcHpJaXdpSjNWelpTQnpkSEpwWTNRbk8xeHVYRzVzWlhRZ2MzWm5JRDBnY21WeGRXbHlaU2duTGk0dmRYUnBiQzl6ZG1jbktUdGNibXhsZENCdFlYUm9JRDBnY21WeGRXbHlaU2duTGk0dmRYUnBiQzl0WVhSb0p5azdYRzVzWlhRZ1NXNTBaWEptWVdObElEMGdjbVZ4ZFdseVpTZ25MaTR2WTI5eVpTOXBiblJsY21aaFkyVW5LVHRjYm14bGRDQlRkR1Z3SUQwZ2NtVnhkV2x5WlNnbkxpNHZiVzlrWld4ekwzTjBaWEFuS1R0Y2JtbHRjRzl5ZENBcUlHRnpJRWx1ZEdWeVlXTjBhVzl1SUdaeWIyMGdKeTR1TDNWMGFXd3ZhVzUwWlhKaFkzUnBiMjRuTzF4dVhHNHZLaXBjYmlvZ1VHRnVYRzRxWEc0cUlFQmtaWE5qY21sd2RHbHZiaUJUZEdWeVpXOGdZM0p2YzNObVlXUmxjaTVjYmlwY2Jpb2dRR1JsYlc4Z1BITndZVzRnYm1WNGRYTXRkV2s5WENKd1lXNWNJajQ4TDNOd1lXNCtYRzRxWEc0cUlFQmxlR0Z0Y0d4bFhHNHFJSFpoY2lCd1lXNGdQU0J1WlhjZ1RtVjRkWE11VUdGdUtDY2pkR0Z5WjJWMEp5bGNiaXBjYmlvZ1FHOTFkSEIxZEZ4dUtpQmphR0Z1WjJWY2Jpb2dSbWx5WlhNZ1lXNTVJSFJwYldVZ2RHaGxJR2x1ZEdWeVptRmpaU2R6SUhaaGJIVmxJR05vWVc1blpYTXVJRHhpY2o1Y2Jpb2dWR2hsSUdWMlpXNTBJR1JoZEdFZ2FYTWdZVzRnYjJKcVpXTjBJR052Ym5SaGFXNXBibWNnZEdobElHbHVkR1Z5Wm1GalpTZHpJRHhwUG5aaGJIVmxQQzlwUGlBb0xURWdkRzhnTVNrc0lHRnpJSGRsYkd3Z1lYTWdQR2srVER3dmFUNGdZVzVrSUR4cFBsSThMMmsrSUdGdGNHeHBkSFZrWlNCMllXeDFaWE1nS0RBdE1Ta2dabTl5SUd4bFpuUWdZVzVrSUhKcFoyaDBJSE53WldGclpYSnpMQ0JqWVd4amRXeGhkR1ZrSUdKNUlHRWdjM0YxWVhKbExYSnZiM1FnWTNKdmMzTm1ZV1JsSUdGc1oyOXlhWFJvYlM1Y2JpcGNiaW9nUUc5MWRIQjFkR1Y0WVcxd2JHVmNiaW9nY0dGdUxtOXVLQ2RqYUdGdVoyVW5MR1oxYm1OMGFXOXVLSFlwSUh0Y2Jpb2dJQ0JqYjI1emIyeGxMbXh2WnloMktUdGNiaW9nZlNsY2JpcGNiaXBjYmlvdlhHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHTnNZWE56SUZCaGJpQmxlSFJsYm1SeklFbHVkR1Z5Wm1GalpTQjdYRzVjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9LU0I3WEc1Y2JpQWdJQ0JzWlhRZ2IzQjBhVzl1Y3lBOUlGc25jMk5oYkdVbkxDZDJZV3gxWlNkZE8xeHVYRzRnSUNBZ2JHVjBJR1JsWm1GMWJIUnpJRDBnZTF4dUlDQWdJQ0FnSjNOcGVtVW5PaUJiTVRJd0xESXdYU3hjYmlBZ0lDQWdJQ2R2Y21sbGJuUmhkR2x2YmljNklDZG9iM0pwZW05dWRHRnNKeXhjYmlBZ0lDQWdJQ2R0YjJSbEp6b2dKM0psYkdGMGFYWmxKeXhjYmlBZ0lDQWdJQ2R6WTJGc1pTYzZJRnN0TVN3eFhTeGNiaUFnSUNBZ0lDZHpkR1Z3SnpvZ01DeGNiaUFnSUNBZ0lDZDJZV3gxWlNjNklEQXNYRzRnSUNBZ0lDQW5hR0Z6UzI1dllpYzZJSFJ5ZFdWY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnYzNWd1pYSW9ZWEpuZFcxbGJuUnpMRzl3ZEdsdmJuTXNaR1ZtWVhWc2RITXBPMXh1WEc0Z0lDQWdkR2hwY3k1dmNtbGxiblJoZEdsdmJpQTlJSFJvYVhNdWMyVjBkR2x1WjNNdWIzSnBaVzUwWVhScGIyNDdYRzVjYmlBZ0lDQjBhR2x6TG0xdlpHVWdQU0IwYUdsekxuTmxkSFJwYm1kekxtMXZaR1U3WEc1Y2JpQWdJQ0IwYUdsekxtaGhjMHR1YjJJZ1BTQjBhR2x6TG5ObGRIUnBibWR6TG1oaGMwdHViMkk3WEc1Y2JpQWdJQ0F2THlCMGFHbHpMbk4wWlhBZ2MyaHZkV3hrSUdWMlpXNTBkV0ZzYkhrZ1ltVWdaMlYwTDNObGRGeHVJQ0FnSUM4dklIVndaR0YwYVc1bklHbDBJSGRwYkd3Z2RYQmtZWFJsSUhSb1pTQmZkbUZzZFdVZ2MzUmxjQ0J0YjJSbGJGeHVJQ0FnSUhSb2FYTXVjM1JsY0NBOUlIUm9hWE11YzJWMGRHbHVaM011YzNSbGNEc2dMeThnWm14dllYUmNibHh1SUNBZ0lIUm9hWE11WDNaaGJIVmxJRDBnYm1WM0lGTjBaWEFvZEdocGN5NXpaWFIwYVc1bmN5NXpZMkZzWlZzd1hTd2dkR2hwY3k1elpYUjBhVzVuY3k1elkyRnNaVnN4WFN3Z2RHaHBjeTV6WlhSMGFXNW5jeTV6ZEdWd0xDQjBhR2x6TG5ObGRIUnBibWR6TG5aaGJIVmxLVHRjYmx4dUlDQWdJSFJvYVhNdWFXNXBkQ2dwTzF4dVhHNGdJQ0FnZEdocGN5NXdiM05wZEdsdmJpQTlJRzVsZHlCSmJuUmxjbUZqZEdsdmJpNUlZVzVrYkdVb2RHaHBjeTV0YjJSbExIUm9hWE11YjNKcFpXNTBZWFJwYjI0c1d6QXNkR2hwY3k1M2FXUjBhRjBzVzNSb2FYTXVhR1ZwWjJoMExEQmRLVHRjYmlBZ0lDQjBhR2x6TG5CdmMybDBhVzl1TG5aaGJIVmxJRDBnZEdocGN5NWZkbUZzZFdVdWJtOXliV0ZzYVhwbFpEdGNibHh1SUNBZ0lIUm9hWE11ZG1Gc2RXVWdQU0IwYUdsekxsOTJZV3gxWlM1MllXeDFaVHRjYmx4dUlDQWdJSFJvYVhNdVpXMXBkQ2duWTJoaGJtZGxKeXgwYUdsekxuWmhiSFZsS1R0Y2JseHVJQ0I5WEc1Y2JpQWdZblZwYkdSSmJuUmxjbVpoWTJVb0tTQjdYRzVjYmlBZ0lDQjBhR2x6TG1KaGNpQTlJSE4yWnk1amNtVmhkR1VvSjNKbFkzUW5LVHRjYmlBZ0lDQjBhR2x6TG10dWIySWdQU0J6ZG1jdVkzSmxZWFJsS0NkamFYSmpiR1VuS1R0Y2JseHVJQ0FnSUhSb2FYTXVaV3hsYldWdWRDNWhjSEJsYm1SRGFHbHNaQ2gwYUdsekxtSmhjaWs3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG1Gd2NHVnVaRU5vYVd4a0tIUm9hWE11YTI1dllpazdYRzVjYmlBZ2ZWeHVYRzRnSUhOcGVtVkpiblJsY21aaFkyVW9LU0I3WEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTV3YjNOcGRHbHZiaWtnZTF4dUlDQWdJQ0FnZEdocGN5NXdiM05wZEdsdmJpNXlaWE5wZW1Vb1d6QXNkR2hwY3k1M2FXUjBhRjBzVzNSb2FYTXVhR1ZwWjJoMExEQmRLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnBaaUFvZEdocGN5NTNhV1IwYUNBOElIUm9hWE11YUdWcFoyaDBLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtOXlhV1Z1ZEdGMGFXOXVJRDBnSjNabGNuUnBZMkZzSnp0Y2JpQWdJQ0I5SUdWc2MyVWdlMXh1SUNBZ0lDQWdkR2hwY3k1dmNtbGxiblJoZEdsdmJpQTlJQ2RvYjNKcGVtOXVkR0ZzSnp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0JzWlhRZ2VDd2dlU3dnZHl3Z2FDd2dZbUZ5VDJabWMyVjBMQ0JqYjNKdVpYSlNZV1JwZFhNN1hHNGdJQ0FnZEdocGN5NXJibTlpUkdGMFlTQTlJSHRjYmlBZ0lDQWdJR3hsZG1Wc09pQXdMRnh1SUNBZ0lDQWdjam9nTUZ4dUlDQWdJSDA3WEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTV2Y21sbGJuUmhkR2x2YmlBOVBUMGdKM1psY25ScFkyRnNKeWtnZTF4dUlDQWdJQ0FnZEdocGN5NTBhR2xqYTI1bGMzTWdQU0IwYUdsekxuZHBaSFJvSUM4Z01qdGNiaUFnSUNCY2RIZ2dQU0IwYUdsekxuZHBaSFJvTHpJN1hHNGdJQ0FnWEhSNUlEMGdNRHRjYmlBZ0lDQmNkSGNnUFNCMGFHbHpMblJvYVdOcmJtVnpjenRjYmlBZ0lDQmNkR2dnUFNCMGFHbHpMbWhsYVdkb2REdGNiaUFnSUNBZ0lIUm9hWE11YTI1dllrUmhkR0V1Y2lBOUlIUm9hWE11ZEdocFkydHVaWE56SUNvZ01DNDRPMXh1SUNBZ0lGeDBkR2hwY3k1cmJtOWlSR0YwWVM1c1pYWmxiQ0E5SUdndGRHaHBjeTVyYm05aVJHRjBZUzV5TFhSb2FYTXVibTl5YldGc2FYcGxaQ29vYUMxMGFHbHpMbXR1YjJKRVlYUmhMbklxTWlrN1hHNGdJQ0FnSUNCaVlYSlBabVp6WlhRZ1BTQW5kSEpoYm5Oc1lYUmxLQ2NyZEdocGN5NTBhR2xqYTI1bGMzTXFLQzB4S1M4eUt5Y3NNQ2tuTzF4dUlDQWdJQ0FnWTI5eWJtVnlVbUZrYVhWeklEMGdkeTh5TzF4dUlDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQjBhR2x6TG5Sb2FXTnJibVZ6Y3lBOUlIUm9hWE11YUdWcFoyaDBJQzhnTWp0Y2JpQWdJQ0JjZEhnZ1BTQXdPMXh1SUNBZ0lGeDBlU0E5SUhSb2FYTXVhR1ZwWjJoMEx6STdYRzRnSUNBZ1hIUjNJRDBnZEdocGN5NTNhV1IwYUR0Y2JpQWdJQ0JjZEdnZ1BTQjBhR2x6TG5Sb2FXTnJibVZ6Y3p0Y2JpQWdJQ0FnSUhSb2FYTXVhMjV2WWtSaGRHRXVjaUE5SUhSb2FYTXVkR2hwWTJ0dVpYTnpJQ29nTUM0NE8xeHVJQ0FnSUZ4MGRHaHBjeTVyYm05aVJHRjBZUzVzWlhabGJDQTlJSFJvYVhNdWJtOXliV0ZzYVhwbFpDb29keTEwYUdsekxtdHViMkpFWVhSaExuSXFNaWtyZEdocGN5NXJibTlpUkdGMFlTNXlPMXh1SUNBZ0lDQWdZbUZ5VDJabWMyVjBJRDBnSjNSeVlXNXpiR0YwWlNnd0xDY3JkR2hwY3k1MGFHbGphMjVsYzNNcUtDMHhLUzh5S3ljcEp6dGNiaUFnSUNBZ0lHTnZjbTVsY2xKaFpHbDFjeUE5SUdndk1qdGNiaUFnSUNCOVhHNWNiaUFnSUNCMGFHbHpMbUpoY2k1elpYUkJkSFJ5YVdKMWRHVW9KM2duTEhncE8xeHVJQ0FnSUhSb2FYTXVZbUZ5TG5ObGRFRjBkSEpwWW5WMFpTZ25lU2NzZVNrN1hHNGdJQ0FnZEdocGN5NWlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZDBjbUZ1YzJadmNtMG5MR0poY2s5bVpuTmxkQ2s3WEc0Z0lDQWdkR2hwY3k1aVlYSXVjMlYwUVhSMGNtbGlkWFJsS0NkeWVDY3NZMjl5Ym1WeVVtRmthWFZ6S1RzZ0x5OGdZMjl5Ym1WeUlISmhaR2wxYzF4dUlDQWdJSFJvYVhNdVltRnlMbk5sZEVGMGRISnBZblYwWlNnbmNua25MR052Y201bGNsSmhaR2wxY3lrN1hHNGdJQ0FnZEdocGN5NWlZWEl1YzJWMFFYUjBjbWxpZFhSbEtDZDNhV1IwYUNjc2R5azdYRzRnSUNBZ2RHaHBjeTVpWVhJdWMyVjBRWFIwY21saWRYUmxLQ2RvWldsbmFIUW5MR2dwTzF4dVhHNGdJQ0FnYVdZZ0tIUm9hWE11YjNKcFpXNTBZWFJwYjI0Z1BUMDlJQ2QyWlhKMGFXTmhiQ2NwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVhMjV2WWk1elpYUkJkSFJ5YVdKMWRHVW9KMk40Snl4NEtUdGNiaUFnSUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjJONUp5eDBhR2x6TG10dWIySkVZWFJoTG14bGRtVnNLVHRjYmlBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVyYm05aUxuTmxkRUYwZEhKcFluVjBaU2duWTNnbkxIUm9hWE11YTI1dllrUmhkR0V1YkdWMlpXd3BPMXh1SUNBZ0lDQWdkR2hwY3k1cmJtOWlMbk5sZEVGMGRISnBZblYwWlNnblkza25MSGtwTzF4dUlDQWdJSDFjYmlBZ0lDQjBhR2x6TG10dWIySXVjMlYwUVhSMGNtbGlkWFJsS0NkeUp5eDBhR2x6TG10dWIySkVZWFJoTG5JcE8xeHVYRzRnSUgxY2JseHVJQ0JqYjJ4dmNrbHVkR1Z5Wm1GalpTZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdVltRnlMbk5sZEVGMGRISnBZblYwWlNnblptbHNiQ2NzSUhSb2FYTXVZMjlzYjNKekxtWnBiR3dwTzF4dUlDQWdJSFJvYVhNdWEyNXZZaTV6WlhSQmRIUnlhV0oxZEdVb0oyWnBiR3duTENCMGFHbHpMbU52Ykc5eWN5NWhZMk5sYm5RcE8xeHVYRzRnSUNBZ2FXWWdLQ0YwYUdsekxtaGhjMHR1YjJJcElIdGNiaUFnSUNBZ0lIUm9hWE11YTI1dllpNXpaWFJCZEhSeWFXSjFkR1VvSjJacGJHd25MQ2QwY21GdWMzQmhjbVZ1ZENjcE8xeHVJQ0FnSUgxY2JseHVJQ0I5WEc1Y2JpQWdjbVZ1WkdWeUtDa2dlMXh1SUNBZ0lHbG1JQ2doZEdocGN5NWpiR2xqYTJWa0tTQjdYRzRnSUNBZ0lDQjBhR2x6TG10dWIySkVZWFJoTG5JZ1BTQjBhR2x6TG5Sb2FXTnJibVZ6Y3lvd0xqYzFPMXh1SUNBZ0lIMWNiaUFnSUNCMGFHbHpMbXR1YjJJdWMyVjBRWFIwY21saWRYUmxLQ2R5Snl4MGFHbHpMbXR1YjJKRVlYUmhMbklwTzF4dVhHNGdJQ0FnYVdZZ0tIUm9hWE11YjNKcFpXNTBZWFJwYjI0Z1BUMDlJQ2QyWlhKMGFXTmhiQ2NwSUh0Y2JpQWdYSFFnSUNCMGFHbHpMbXR1YjJKRVlYUmhMbXhsZG1Wc0lEMGdkR2hwY3k1cmJtOWlSR0YwWVM1eUszUm9hWE11WDNaaGJIVmxMbTV2Y20xaGJHbDZaV1FxS0hSb2FYTXVhR1ZwWjJoMExYUm9hWE11YTI1dllrUmhkR0V1Y2lveUtUdGNiaUFnSUNBZ0lDQjBhR2x6TG10dWIySXVjMlYwUVhSMGNtbGlkWFJsS0NkamVTY3NkR2hwY3k1b1pXbG5hSFFnTFNCMGFHbHpMbXR1YjJKRVlYUmhMbXhsZG1Wc0tUdGNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQmNkQ0FnSUhSb2FYTXVhMjV2WWtSaGRHRXViR1YyWld3Z1BTQjBhR2x6TGw5MllXeDFaUzV1YjNKdFlXeHBlbVZrS2loMGFHbHpMbmRwWkhSb0xYUm9hWE11YTI1dllrUmhkR0V1Y2lveUtTdDBhR2x6TG10dWIySkVZWFJoTG5JN1hHNGdJQ0FnSUNBZ2RHaHBjeTVyYm05aUxuTmxkRUYwZEhKcFluVjBaU2duWTNnbkxIUm9hWE11YTI1dllrUmhkR0V1YkdWMlpXd3BPMXh1SUNBZ0lIMWNiaUFnZlZ4dVhHNWNiaUFnWTJ4cFkyc29LU0I3WEc0Z0lDQWdkR2hwY3k1cmJtOWlSR0YwWVM1eUlEMGdkR2hwY3k1MGFHbGphMjVsYzNNcU1DNDVPMXh1SUNBZ0lIUm9hWE11Y0c5emFYUnBiMjR1WVc1amFHOXlJRDBnZEdocGN5NXRiM1Z6WlR0Y2JpQWdJQ0IwYUdsekxtMXZkbVVvS1R0Y2JpQWdmVnh1WEc0Z0lHMXZkbVVvS1NCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11WTJ4cFkydGxaQ2tnZTF4dUlDQWdJQ0FnZEdocGN5NXdiM05wZEdsdmJpNTFjR1JoZEdVb2RHaHBjeTV0YjNWelpTazdYRzVjYmlBZ0lDQWdJSFJvYVhNdWRtRnNkV1VnUFNCMGFHbHpMbDkyWVd4MVpTNTFjR1JoZEdWT2IzSnRZV3dvSUhSb2FYTXVjRzl6YVhScGIyNHVkbUZzZFdVZ0tUdGNibHh1SUNBZ0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSHRjYmlBZ0lDQWdJQ0FnZG1Gc2RXVTZJSFJvYVhNdWRtRnNkV1VzWEc0Z0lDQWdJQ0FnSUV3NklFMWhkR2d1Y0c5M0tDQnRZWFJvTG5OallXeGxLSFJvYVhNdWRtRnNkV1VzTFRFc01Td3hMREFwTENBeUtTeGNiaUFnSUNBZ0lDQWdVam9nVFdGMGFDNXdiM2NvSUcxaGRHZ3VjMk5oYkdVb2RHaHBjeTUyWVd4MVpTd3RNU3d4TERBc01Ta3NJRElwWEc0Z0lDQWdJQ0I5S1R0Y2JseHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lISmxiR1ZoYzJVb0tTQjdYRzRnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0JVYUdVZ2NHOXphWFJwYjI0Z2IyWWdZM0p2YzNObVlXUmxjaXdnWm5KdmJTQXRNU0FvYkdWbWRDa2dkRzhnTVNBb2NtbG5hSFFwTGlCVFpYUjBhVzVuSUhSb2FYTWdkbUZzZFdVZ2RYQmtZWFJsY3lCMGFHVWdhVzUwWlhKbVlXTmxJR0Z1WkNCMGNtbG5aMlZ5Y3lCMGFHVWdiM1YwY0hWMElHVjJaVzUwTGx4dUlDQkFkSGx3WlNCN2JuVnRZbVZ5ZlZ4dUlDQXFMMXh1SUNCblpYUWdkbUZzZFdVb0tTQjdYRzRnSUNBZ2NtVjBkWEp1SUhSb2FYTXVYM1poYkhWbExuWmhiSFZsTzF4dUlDQjlYRzVjYmlBZ2MyVjBJSFpoYkhWbEtIWmhiSFZsS1NCN1hHNGdJQ0FnZEdocGN5NWZkbUZzZFdVdWRYQmtZWFJsS0haaGJIVmxLVHRjYmlBZ0lDQjBhR2x6TG5CdmMybDBhVzl1TG5aaGJIVmxJRDBnZEdocGN5NWZkbUZzZFdVdWJtOXliV0ZzYVhwbFpEdGNiaUFnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc2UxeHVJQ0FnSUNBZ2RtRnNkV1U2SUhSb2FYTXVkbUZzZFdVc1hHNGdJQ0FnSUNCTU9pQk5ZWFJvTG5CdmR5Z2diV0YwYUM1elkyRnNaU2gwYUdsekxuWmhiSFZsTEMweExERXNNU3d3S1N3Z01pa3NYRzRnSUNBZ0lDQlNPaUJOWVhSb0xuQnZkeWdnYldGMGFDNXpZMkZzWlNoMGFHbHpMblpoYkhWbExDMHhMREVzTUN3eEtTd2dNaWxjYmlBZ0lDQjlLVHRjYmlBZ0lDQjBhR2x6TG5KbGJtUmxjaWdwTzF4dUlDQjlYRzVjYmlBZ1oyVjBJRzV2Y20xaGJHbDZaV1FvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSFJvYVhNdVgzWmhiSFZsTG01dmNtMWhiR2w2WldRN1hHNGdJSDFjYmx4dWZWeHVYRzVjYmx4dUx5OGdWMFZDVUVGRFN5QkdUMDlVUlZJZ0x5OWNiaTh2SUM0dmZpOXFjMmhwYm5RdGJHOWhaR1Z5SVM0dmJHbGlMMmx1ZEdWeVptRmpaWE12Y0dGdUxtcHpJaXdpSjNWelpTQnpkSEpwWTNRbk8xeHVYRzVzWlhRZ2JXRjBhQ0E5SUhKbGNYVnBjbVVvSnk0dUwzVjBhV3d2YldGMGFDY3BPMXh1YkdWMElITjJaeUE5SUhKbGNYVnBjbVVvSnk0dUwzVjBhV3d2YzNabkp5azdYRzVzWlhRZ1NXNTBaWEptWVdObElEMGdjbVZ4ZFdseVpTZ25MaTR2WTI5eVpTOXBiblJsY21aaFkyVW5LVHRjYmx4dVhHNXNaWFFnVUc5cGJuUWdQU0JtZFc1amRHbHZiaWh3YjJsdWRDeGxiblpsYkc5d1pTa2dlMXh1WEc0Z0lIUm9hWE11ZUNBOUlIQnZhVzUwTG5nN1hHNGdJSFJvYVhNdWVTQTlJSEJ2YVc1MExuazdYRzRnSUhSb2FYTXVaVzUyWld4dmNHVWdQU0JsYm5abGJHOXdaVHRjYmx4dUlDQjBhR2x6TG1Wc1pXMWxiblFnUFNCemRtY3VZM0psWVhSbEtDZGphWEpqYkdVbktUdGNiaUFnZEdocGN5NWxiR1Z0Wlc1MExuTmxkRUYwZEhKcFluVjBaU2duWm1sc2JDY3NkR2hwY3k1bGJuWmxiRzl3WlM1amIyeHZjbk11WVdOalpXNTBLVHRjYmx4dUlDQjBhR2x6TG1WdWRtVnNiM0JsTG1Wc1pXMWxiblF1WVhCd1pXNWtRMmhwYkdRb2RHaHBjeTVsYkdWdFpXNTBLVHRjYmx4dUlDQjBhR2x6TG5KbGMybDZaU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUd4bGRDQnlJRDBnZm40b1RXRjBhQzV0YVc0b2RHaHBjeTVsYm5abGJHOXdaUzUzYVdSMGFDeDBhR2x6TG1WdWRtVnNiM0JsTG1obGFXZG9kQ2t2TlRBcEt6STdYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk5sZEVGMGRISnBZblYwWlNnbmNpY3NjaWs3WEc0Z0lIMDdYRzVjYmlBZ2RHaHBjeTV0YjNabElEMGdablZ1WTNScGIyNG9lQ3g1S1NCN1hHNWNiaUFnSUNCMGFHbHpMbmdnUFNBb2VDQjhmQ0I0UFQwOU1Da2dQeUI0SURvZ2RHaHBjeTU0TzF4dUlDQWdJSFJvYVhNdWVTQTlJQ2g1SUh4OElIazlQVDB3S1NBL0lIa2dPaUIwYUdsekxuazdYRzVjYmlBZ0lDQnBaaUFvZEdocGN5NWxiblpsYkc5d1pTNXViMlJsY3k1cGJtUmxlRTltS0hSb2FYTXBQajB3S1NCN1hHNWNiaUFnSUNBZ0lHeGxkQ0J3Y21WMlNXNWtaWGdnUFNCMGFHbHpMbVZ1ZG1Wc2IzQmxMbTV2WkdWekxtbHVaR1Y0VDJZb2RHaHBjeWt0TVR0Y2JpQWdJQ0FnSUd4bGRDQnVaWGgwU1c1a1pYZ2dQU0IwYUdsekxtVnVkbVZzYjNCbExtNXZaR1Z6TG1sdVpHVjRUMllvZEdocGN5a3JNVHRjYmx4dUlDQWdJQ0FnYkdWMElIQnlaWFpPYjJSbElEMGdkR2hwY3k1bGJuWmxiRzl3WlM1dWIyUmxjMXR3Y21WMlNXNWtaWGhkTzF4dUlDQWdJQ0FnYkdWMElHNWxlSFJPYjJSbElEMGdkR2hwY3k1bGJuWmxiRzl3WlM1dWIyUmxjMXR1WlhoMFNXNWtaWGhkTzF4dVhHNGdJQ0FnSUNCc1pYUWdiRzkzV0NBOUlIQnlaWFpKYm1SbGVDQStQU0F3SUQ4Z2NISmxkazV2WkdVdWVDQTZJREE3WEc0Z0lDQWdJQ0JzWlhRZ2FHbG5hRmdnUFNCdVpYaDBTVzVrWlhnZ1BDQjBhR2x6TG1WdWRtVnNiM0JsTG01dlpHVnpMbXhsYm1kMGFDQS9JRzVsZUhST2IyUmxMbmdnT2lBeE8xeHVYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NTRJRHdnYkc5M1dDa2dleUIwYUdsekxuZ2dQU0JzYjNkWU95QjlYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NTRJRDRnYUdsbmFGZ3BJSHNnZEdocGN5NTRJRDBnYUdsbmFGZzdJSDFjYmx4dUlDQWdJSDFjYmx4dUlDQWdJSFJvYVhNdWJHOWpZWFJwYjI0Z1BTQjBhR2x6TG1kbGRFTnZiM0prYVc1aGRHVnpLQ2s3WEc0Z0lDQWdkR2hwY3k1bGJHVnRaVzUwTG5ObGRFRjBkSEpwWW5WMFpTZ25ZM2duTENCMGFHbHpMbXh2WTJGMGFXOXVMbmdwTzF4dUlDQWdJSFJvYVhNdVpXeGxiV1Z1ZEM1elpYUkJkSFJ5YVdKMWRHVW9KMk41Snl3Z2RHaHBjeTVzYjJOaGRHbHZiaTU1S1R0Y2JpQWdmVHRjYmx4dUlDQjBhR2x6TG1kbGRFTnZiM0prYVc1aGRHVnpJRDBnWm5WdVkzUnBiMjRvS1NCN1hHNGdJQ0FnY21WMGRYSnVJSHRjYmlBZ0lDQWdJSGc2SUhSb2FYTXVlQ0FxSUhSb2FYTXVaVzUyWld4dmNHVXVkMmxrZEdnc1hHNGdJQ0FnSUNCNU9pQW9NUzEwYUdsekxua3BJQ29nZEdocGN5NWxiblpsYkc5d1pTNW9aV2xuYUhSY2JpQWdJQ0I5TzF4dUlDQjlPMXh1WEc0Z0lIUm9hWE11Ylc5MlpTaDBhR2x6TG5nc2RHaHBjeTU1TEhSeWRXVXBPMXh1SUNCMGFHbHpMbkpsYzJsNlpTZ3BPMXh1WEc0Z0lIUm9hWE11WkdWemRISnZlU0E5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0FnSUhSb2FYTXVaVzUyWld4dmNHVXVaV3hsYldWdWRDNXlaVzF2ZG1WRGFHbHNaQ2gwYUdsekxtVnNaVzFsYm5RcE8xeHVJQ0FnSUhSb2FYTXVaVzUyWld4dmNHVXVibTlrWlhNdWMzQnNhV05sS0hSb2FYTXVaVzUyWld4dmNHVXVibTlrWlhNdWFXNWtaWGhQWmloMGFHbHpLU3d4S1R0Y2JpQWdmVHRjYmx4dVhHNTlPMXh1WEc1Y2JpOHFLbHh1S2lCRmJuWmxiRzl3WlZ4dUtseHVLaUJBWkdWelkzSnBjSFJwYjI0Z1NXNTBaWEpoWTNScGRtVWdiR2x1WldGeUlISmhiWEFnZG1semRXRnNhWHBoZEdsdmJpNWNiaXBjYmlvZ1FHUmxiVzhnUEhOd1lXNGdibVY0ZFhNdGRXazlYQ0psYm5abGJHOXdaVndpUGp3dmMzQmhiajVjYmlwY2Jpb2dRR1Y0WVcxd2JHVmNiaW9nZG1GeUlHVnVkbVZzYjNCbElEMGdibVYzSUU1bGVIVnpMa1Z1ZG1Wc2IzQmxLQ2NqZEdGeVoyVjBKeWxjYmlwY2Jpb2dRR1Y0WVcxd2JHVmNiaW9nZG1GeUlHVnVkbVZzYjNCbElEMGdibVYzSUU1bGVIVnpMa1Z1ZG1Wc2IzQmxLQ2NqZEdGeVoyVjBKeXg3WEc0cUlDQWdKM05wZW1Vbk9pQmJNekF3TERFMU1GMHNYRzRxSUNBZ0ozQnZhVzUwY3ljNklGdGNiaW9nSUNBZ0lIdGNiaW9nSUNBZ0lDQWdlRG9nTUM0eExGeHVLaUFnSUNBZ0lDQjVPaUF3TGpSY2Jpb2dJQ0FnSUgwc1hHNHFJQ0FnSUNCN1hHNHFJQ0FnSUNBZ0lIZzZJREF1TXpVc1hHNHFJQ0FnSUNBZ0lIazZJREF1Tmx4dUtpQWdJQ0FnZlN4Y2Jpb2dJQ0FnSUh0Y2Jpb2dJQ0FnSUNBZ2VEb2dNQzQyTlN4Y2Jpb2dJQ0FnSUNBZ2VUb2dNQzR5WEc0cUlDQWdJQ0I5TEZ4dUtpQWdJQ0FnZTF4dUtpQWdJQ0FnSUNCNE9pQXdMamtzWEc0cUlDQWdJQ0FnSUhrNklEQXVORnh1S2lBZ0lDQWdmU3hjYmlvZ0lDQmRYRzRxSUgwcFhHNHFYRzRxSUVCdmRYUndkWFJjYmlvZ1kyaGhibWRsWEc0cUlFWnBjbVZ6SUdGdWVTQjBhVzFsSUdFZ2JtOWtaU0JwY3lCdGIzWmxaQzRnUEdKeVBseHVLaUJVYUdVZ1pYWmxiblFnWkdGMFlTQnBjeUJoYmlCaGNuSmhlU0J2WmlCd2IybHVkQ0JzYjJOaGRHbHZibk11SUVWaFkyZ2dhWFJsYlNCcGJpQjBhR1VnWVhKeVlYa2dhWE1nWVc0Z2IySnFaV04wSUdOdmJuUmhhVzVwYm1jZ1BHaytlRHd2YVQ0Z1lXNWtJRHhwUG5rOEwyaytJSEJ5YjNCbGNuUnBaWE1nWkdWelkzSnBZbWx1WnlCMGFHVWdiRzlqWVhScGIyNGdiMllnWVNCd2IybHVkQ0J2YmlCMGFHVWdaVzUyWld4dmNHVXVYRzRxWEc0cUlFQnZkWFJ3ZFhSbGVHRnRjR3hsWEc0cUlHVnVkbVZzYjNCbExtOXVLQ2RqYUdGdVoyVW5MR1oxYm1OMGFXOXVLSFlwSUh0Y2Jpb2dJQ0JqYjI1emIyeGxMbXh2WnloMktUdGNiaW9nZlNsY2JpcGNiaW92WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdOc1lYTnpJRVZ1ZG1Wc2IzQmxJR1Y0ZEdWdVpITWdTVzUwWlhKbVlXTmxJSHRjYmx4dUlDQmpiMjV6ZEhKMVkzUnZjaWdwSUh0Y2JseHVJQ0FnSUd4bGRDQnZjSFJwYjI1eklEMGdXeWQyWVd4MVpTZGRPMXh1WEc0Z0lDQWdiR1YwSUdSbFptRjFiSFJ6SUQwZ2UxeHVJQ0FnSUNBZ0ozTnBlbVVuT2lCYk16QXdMREUxTUYwc1hHNGdJQ0FnSUNBbmNHOXBiblJ6SnpvZ1cxeHVJQ0JjZEZ4MFhIUjdYRzRnSUZ4MFhIUmNkRngwZURvZ01DNHhMRnh1SUNCY2RGeDBYSFJjZEhrNklEQXVORnh1SUNCY2RGeDBYSFI5TEZ4dUlDQmNkRngwWEhSN1hHNGdJRngwWEhSY2RGeDBlRG9nTUM0ek5TeGNiaUFnWEhSY2RGeDBYSFI1T2lBd0xqWmNiaUFnWEhSY2RGeDBmU3hjYmlBZ1hIUmNkRngwZTF4dUlDQmNkRngwWEhSY2RIZzZJREF1TmpVc1hHNGdJRngwWEhSY2RGeDBlVG9nTUM0eVhHNGdJRngwWEhSY2RIMHNYRzRnSUZ4MFhIUmNkSHRjYmlBZ1hIUmNkRngwWEhSNE9pQXdMamtzWEc0Z0lGeDBYSFJjZEZ4MGVUb2dNQzQwWEc0Z0lGeDBYSFJjZEgxY2JpQWdYSFJjZEYxY2JpQWdJQ0I5TzF4dVhHNGdJQ0FnYzNWd1pYSW9ZWEpuZFcxbGJuUnpMRzl3ZEdsdmJuTXNaR1ZtWVhWc2RITXBPMXh1WEc0Z0lDQWdkR2hwY3k1d2IybHVkSE1nUFNCMGFHbHpMbk5sZEhScGJtZHpMbkJ2YVc1MGN6dGNibHh1SUNBZ0lIUm9hWE11Ym05a1pYTWdQU0JiWFR0Y2JseHVJQ0FnSUhSb2FYTXVjMlZzWldOMFpXUWdQU0JtWVd4elpUdGNibHh1SUNBZ0lIUm9hWE11YVc1cGRDZ3BPMXh1WEc1Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrU1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzVjYmlBZ0lDQjBhR2x6TG5CdmFXNTBjeTVtYjNKRllXTm9LQ2h3YjJsdWRDa2dQVDRnZTF4dUlDQWdJQ0FnYkdWMElHNXZaR1VnUFNCdVpYY2dVRzlwYm5Rb2NHOXBiblFzZEdocGN5azdYRzRnSUNBZ0lDQjBhR2x6TG01dlpHVnpMbkIxYzJnb2JtOWtaU2s3WEc0Z0lDQWdmU2s3WEc1Y2JpQWdJQ0IwYUdsekxuTnZjblJRYjJsdWRITW9LVHRjYmx4dUlDQWdJSFJvYVhNdWJHbHVaU0E5SUhOMlp5NWpjbVZoZEdVb0ozQnZiSGxzYVc1bEp5azdYRzRnSUNBZ2RHaHBjeTVzYVc1bExuTmxkRUYwZEhKcFluVjBaU2duYzNSeWIydGxMWGRwWkhSb0p5d2dNaWs3WEc0Z0lDQWdkR2hwY3k1c2FXNWxMbk5sZEVGMGRISnBZblYwWlNnblptbHNiQ2NzSUNkdWIyNWxKeWs3WEc1Y2JpQWdJQ0IwYUdsekxtVnNaVzFsYm5RdVlYQndaVzVrUTJocGJHUW9kR2hwY3k1c2FXNWxLVHRjYmx4dUlDQWdJSFJvYVhNdVptbHNiQ0E5SUhOMlp5NWpjbVZoZEdVb0ozQnZiSGxzYVc1bEp5azdYRzRnSUNBZ2RHaHBjeTVtYVd4c0xuTmxkRUYwZEhKcFluVjBaU2duWm1sc2JDMXZjR0ZqYVhSNUp5d2dKekF1TWljcE8xeHVYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbUZ3Y0dWdVpFTm9hV3hrS0hSb2FYTXVabWxzYkNrN1hHNWNiaUFnZlZ4dVhHNGdJSE5wZW1WSmJuUmxjbVpoWTJVb0tTQjdYRzVjYmlBZ0lDQm1iM0lnS0d4bGRDQnBQVEE3SUdrOGRHaHBjeTV1YjJSbGN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnZEdocGN5NXViMlJsYzF0cFhTNXlaWE5wZW1Vb0tUdGNiaUFnSUNBZ0lIUm9hWE11Ym05a1pYTmJhVjB1Ylc5MlpTZ3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lHTnZiRzl5U1c1MFpYSm1ZV05sS0NrZ2UxeHVYRzRnSUNBZ2RHaHBjeTVsYkdWdFpXNTBMbk4wZVd4bExtSmhZMnRuY205MWJtUkRiMnh2Y2lBOUlIUm9hWE11WTI5c2IzSnpMbVpwYkd3N1hHNGdJQ0FnZEdocGN5NXNhVzVsTG5ObGRFRjBkSEpwWW5WMFpTZ25jM1J5YjJ0bEp5d2dkR2hwY3k1amIyeHZjbk11WVdOalpXNTBLVHRjYmlBZ0lDQjBhR2x6TG1acGJHd3VjMlYwUVhSMGNtbGlkWFJsS0NkbWFXeHNKeXdnZEdocGN5NWpiMnh2Y25NdVlXTmpaVzUwS1R0Y2JpQWdJQ0IwYUdsekxtNXZaR1Z6TG1admNrVmhZMmdvS0c1dlpHVXBJRDArSUh0Y2JpQWdJQ0FnSUc1dlpHVXVaV3hsYldWdWRDNXpaWFJCZEhSeWFXSjFkR1VvSjJacGJHd25MSFJvYVhNdVkyOXNiM0p6TG1GalkyVnVkQ2s3WEc0Z0lDQWdmU2s3WEc1Y2JpQWdmVnh1WEc0Z0lISmxibVJsY2lncElIdGNiaUFnTHk4Z0lIUm9hWE11Ym05a1pYTmJkR2hwY3k1elpXeGxZM1JsWkYwdWJXOTJaU2dnZEdocGN5NXdiMmx1ZEhNZ0tWeHVJQ0FnSUhSb2FYTXVZMkZzWTNWc1lYUmxVR0YwYUNncE8xeHVJQ0I5WEc1Y2JpQWdZMkZzWTNWc1lYUmxVRzlwYm5SektDa2dlMXh1SUNBZ0lIUm9hWE11Y0c5cGJuUnpJRDBnVzEwN1hHNGdJQ0FnZEdocGN5NXViMlJsY3k1bWIzSkZZV05vS0NodWIyUmxLU0E5UGlCN1hHNGdJQ0FnSUNCMGFHbHpMbkJ2YVc1MGN5NXdkWE5vS0hzZ2VEb2dibTlrWlM1NExDQjVPaUJ1YjJSbExua2dmU2s3WEc0Z0lDQWdmU2s3WEc0Z0lIMWNibHh1SUNCallXeGpkV3hoZEdWUVlYUm9LQ2tnZTF4dVhHNGdJQ0FnTHk5emRISnZhMlVnWkdGMFlWeHVJQ0FnSUd4bGRDQmtZWFJoSUQwZ0p6QWdKeXNnZEdocGN5NXViMlJsYzFzd1hTNXNiMk5oZEdsdmJpNTVLeWNzSUNjN1hHNWNiaUFnSUNBdkx5QmtZWFJoSUhOb2IzVnNaQ0JpWlNCeVpTMXZjbVJsY21Wa0lHSmhjMlZrSUc5dUlIZ2diRzlqWVhScGIyNHVYRzRnSUNBZ0x5OGdkMmhoZEdWMlpYSWdablZ1WTNScGIyNGdZV1JrY3lCaElHNXZaR1VnYzJodmRXeGtJR0ZrWkNCcGRDQmhkQ0IwYUdVZ2NtbG5hSFFnYVc1a1pYaGNibHh1SUNBZ0lIUm9hWE11Ym05a1pYTXVabTl5UldGamFDZ29ibTlrWlNrZ1BUNGdlMXh1SUNBZ0lDOHZJQ0JzWlhRZ2JHOWpZWFJwYjI0Z1BTQnViMlJsTG1kbGRFTnZiM0prYVc1aGRHVnpLQ2s3WEc0Z0lDQWdJQ0JrWVhSaElDczlJRzV2WkdVdWJHOWpZWFJwYjI0dWVDQXJJQ2NnSnlBcklHNXZaR1V1Ykc5allYUnBiMjR1ZVNBcklDY3NJQ2M3WEc0Z0lDQWdmU2s3WEc1Y2JseHVJQ0F2THlBZ1pHRjBZU0FyUFNCd2IybHVkQzU0S25Sb2FYTXVkMmxrZEdnckp5QW5LeUJ3YjJsdWRDNTVLblJvYVhNdWFHVnBaMmgwS3ljc0lDYzdYRzRnSUNBZ1pHRjBZU0FyUFNCMGFHbHpMbmRwWkhSb0lDc2dKeUFuS3lCMGFHbHpMbTV2WkdWelczUm9hWE11Ym05a1pYTXViR1Z1WjNSb0xURmRMbXh2WTJGMGFXOXVMbms3WEc1Y2JpQWdJQ0IwYUdsekxteHBibVV1YzJWMFFYUjBjbWxpZFhSbEtDZHdiMmx1ZEhNbkxDQmtZWFJoS1R0Y2JseHVJQ0FnSUM4dklHWnBiR3dnWkdGMFlWeHVJQ0FnSUM4dklHRmtaQ0JpYjNSMGIyMGdZMjl5Ym1WeWMxeHVYRzRnSUNBZ1pHRjBZU0FyUFNBbkxDQW5LM1JvYVhNdWQybGtkR2dnS3ljZ0p5dDBhR2x6TG1obGFXZG9kQ3NuTENBbk8xeHVJQ0FnSUdSaGRHRWdLejBnSnpBZ0p5dDBhR2x6TG1obGFXZG9kRHRjYmx4dUlDQWdJSFJvYVhNdVptbHNiQzV6WlhSQmRIUnlhV0oxZEdVb0ozQnZhVzUwY3ljc0lHUmhkR0VwTzF4dVhHNGdJSDFjYmx4dVhHNWNiaUFnWTJ4cFkyc29LU0I3WEc0Z0lGeDBMeThnWm1sdVpDQnVaV0Z5WlhOMElHNXZaR1VnWVc1a0lITmxkQ0IwYUdsekxuTmxiR1ZqZEdWa0lDaHBibVJsZUNsY2JpQWdJQ0IwYUdsekxtaGhjMDF2ZG1Wa0lEMGdabUZzYzJVN1hHNGdJRngwZEdocGN5NXpaV3hsWTNSbFpDQTlJSFJvYVhNdVptbHVaRTVsWVhKbGMzUk9iMlJsS0NrN1hHNWNiaUFnSUNCMGFHbHpMbTV2WkdWelczUm9hWE11YzJWc1pXTjBaV1JkTG0xdmRtVW9kR2hwY3k1dGIzVnpaUzU0TDNSb2FYTXVkMmxrZEdnc01TMTBhR2x6TG0xdmRYTmxMbmt2ZEdocGN5NW9aV2xuYUhRcE8xeHVJQ0FnSUhSb2FYTXVjMk5oYkdWT2IyUmxLSFJvYVhNdWMyVnNaV04wWldRcE8xeHVYRzRnSUNBZ0x5OGdiWFZ6ZENCa2J5QjBhR2x6SUdJdll5QnVaWGNnYm05a1pTQnRZWGtnYUdGMlpTQmlaV1Z1SUdOeVpXRjBaV1JjYmlBZ0lDQjBhR2x6TG1OaGJHTjFiR0YwWlZCdmFXNTBjeWdwTzF4dUlDQWdJSFJvYVhNdVpXMXBkQ2duWTJoaGJtZGxKeXgwYUdsekxuQnZhVzUwY3lrN1hHNGdJRngwZEdocGN5NXlaVzVrWlhJb0tUdGNiaUFnZlZ4dVhHNGdJRzF2ZG1Vb0tTQjdYRzRnSUZ4MGFXWWdLSFJvYVhNdVkyeHBZMnRsWkNrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTV0YjNWelpTNTRJRDBnYldGMGFDNWpiR2x3S0hSb2FYTXViVzkxYzJVdWVDd3dMSFJvYVhNdWQybGtkR2dwTzF4dUlDQWdJQ0FnZEdocGN5NW9ZWE5OYjNabFpDQTlJSFJ5ZFdVN1hHNWNiaUFnSUNBZ0lIUm9hWE11Ym05a1pYTmJkR2hwY3k1elpXeGxZM1JsWkYwdWJXOTJaU2gwYUdsekxtMXZkWE5sTG5ndmRHaHBjeTUzYVdSMGFDd3hMWFJvYVhNdWJXOTFjMlV1ZVM5MGFHbHpMbWhsYVdkb2RDazdYRzRnSUNBZ1hIUjBhR2x6TG5OallXeGxUbTlrWlNoMGFHbHpMbk5sYkdWamRHVmtLVHRjYmx4dUlDQWdJQ0FnZEdocGN5NWpZV3hqZFd4aGRHVlFiMmx1ZEhNb0tUdGNiaUFnWEhSY2RIUm9hWE11WlcxcGRDZ25ZMmhoYm1kbEp5eDBhR2x6TG5CdmFXNTBjeWs3WEc0Z0lGeDBYSFIwYUdsekxuSmxibVJsY2lncE8xeHVJQ0JjZEgxY2JpQWdmVnh1WEc0Z0lISmxiR1ZoYzJVb0tTQjdYRzVjYmlBZ1hIUnBaaUFvSVhSb2FYTXVhR0Z6VFc5MlpXUXBJSHRjYmlBZ0lDQWdJSFJvYVhNdWJtOWtaWE5iZEdocGN5NXpaV3hsWTNSbFpGMHVaR1Z6ZEhKdmVTZ3BPMXh1SUNCY2RIMWNibHh1SUNBZ0lIUm9hWE11WTJGc1kzVnNZWFJsVUc5cGJuUnpLQ2s3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2RqYUdGdVoyVW5MSFJvYVhNdWNHOXBiblJ6S1R0Y2JpQWdYSFIwYUdsekxuSmxibVJsY2lncE8xeHVYRzRnSUZ4MEx5OGdjbVZ6WlhRZ2RHaHBjeTV6Wld4bFkzUmxaRnh1SUNCY2RIUm9hWE11YzJWc1pXTjBaV1FnUFNCdWRXeHNPMXh1SUNCOVhHNWNibHh1SUNCbWFXNWtUbVZoY21WemRFNXZaR1VvS1NCN1hHNGdJRngwZG1GeUlHNWxZWEpsYzNSSmJtUmxlQ0E5SUc1MWJHdzdYRzRnSUNBZ0x5OGdjMlYwSUhSb2FYTWdkVzV5WldGemIyNWhZbXg1SUdocFoyZ2djMjhnZEdoaGRDQmxkbVZ5ZVNCa2FYTjBZVzVqWlNCM2FXeHNJR0psSUd4dmQyVnlJSFJvWVc0Z2FYUXVYRzRnSUZ4MGRtRnlJRzVsWVhKbGMzUkVhWE4wSUQwZ01UQXdNREE3WEc0Z0lGeDBkbUZ5SUdKbFptOXlaU0E5SUdaaGJITmxPMXh1SUNBZ0lHeGxkQ0I0SUQwZ2RHaHBjeTV0YjNWelpTNTRMM1JvYVhNdWQybGtkR2c3WEc0Z0lDQWdiR1YwSUhrZ1BTQXhMWFJvYVhNdWJXOTFjMlV1ZVM5MGFHbHpMbWhsYVdkb2REdGNiaUFnSUNCc1pYUWdibTlrWlhNZ1BTQjBhR2x6TG01dlpHVnpPMXh1SUNCY2RHWnZjaUFvYkdWMElHa2dQU0F3T3lCcFBHNXZaR1Z6TG14bGJtZDBhRHNnYVNzcktTQjdYRzVjYmlBZ0lDQWdJQzh2SUdOaGJHTjFiR0YwWlNCMGFHVWdaR2x6ZEdGdVkyVWdabkp2YlNCdGIzVnpaU0IwYnlCMGFHbHpJRzV2WkdVZ2RYTnBibWNnY0hsMGFHRm5iM0psWVc0Z2RHaGxiM0psYlZ4dUlDQmNkRngwZG1GeUlHUnBjM1JoYm1ObElEMGdUV0YwYUM1emNYSjBLQ0FnVFdGMGFDNXdiM2NvSUNodWIyUmxjMXRwWFM1NElDMGdlQ2tzSURJcElDc2dUV0YwYUM1d2IzY29LRzV2WkdWelcybGRMbmtnTFNCNUtTd2dNaWtnS1R0Y2JseHVJQ0FnSUNBZ0x5OGdhV1lnZEdocGN5QmthWE4wWVc1alpTQnBjeUJzWlhOeklIUm9ZVzRnZEdobElIQnlaWFpwYjNWeklITm9iM0owWlhOMElHUnBjM1JoYm1ObExDQjFjMlVnZEdocGN5QnBibVJsZUZ4dUlDQmNkRngwYVdZZ0tHUnBjM1JoYm1ObElEd2dibVZoY21WemRFUnBjM1FwSUh0Y2JpQWdYSFJjZEZ4MGJtVmhjbVZ6ZEVScGMzUWdQU0JrYVhOMFlXNWpaVHRjYmlBZ1hIUmNkRngwYm1WaGNtVnpkRWx1WkdWNElEMGdhVHRjYmlBZ1hIUmNkRngwWW1WbWIzSmxJRDBnZUNBK0lHNXZaR1Z6VzJsZExuZzdYRzRnSUZ4MFhIUjlYRzVjYmlBZ1hIUjlYRzVjYmlBZ0lDQXZMeUJwWmlCdWIzUWdkbVZ5ZVNCamJHOXpaU0IwYnlCaGJua2dibTlrWlN3Z1kzSmxZWFJsSUdFZ2JtOWtaVnh1SUNCY2RHbG1JQ2h1WldGeVpYTjBSR2x6ZEQ0d0xqQTNLU0I3WEc1Y2JpQWdJQ0FnSUc1bFlYSmxjM1JKYm1SbGVDQTlJSFJvYVhNdVoyVjBTVzVrWlhoR2NtOXRXQ2gwYUdsekxtMXZkWE5sTG5ndmRHaHBjeTUzYVdSMGFDazdYRzVjYmlBZ1hIUmNkSFJvYVhNdWJtOWtaWE11YzNCc2FXTmxLRzVsWVhKbGMzUkpibVJsZUN3d0xDQnVaWGNnVUc5cGJuUW9lMXh1SUNCY2RGeDBYSFI0T2lCMGFHbHpMbTF2ZFhObExuZ3ZkR2hwY3k1M2FXUjBhQ3hjYmlBZ1hIUmNkRngwZVRvZ01TMTBhR2x6TG0xdmRYTmxMbmt2ZEdocGN5NW9aV2xuYUhSY2JpQWdYSFJjZEgwc0lIUm9hWE1wS1R0Y2JpQWdJQ0FnSUhSb2FYTXVhR0Z6VFc5MlpXUWdQU0IwY25WbE8xeHVYRzRnSUZ4MGZWeHVYRzRnSUZ4MGNtVjBkWEp1SUc1bFlYSmxjM1JKYm1SbGVEdGNiaUFnZlZ4dVhHNGdJR2RsZEVsdVpHVjRSbkp2YlZnb2VDa2dlMXh1SUNBZ0lHeGxkQ0JwYm1SbGVDQTlJREE3WEc0Z0lDQWdkR2hwY3k1dWIyUmxjeTVtYjNKRllXTm9LQ2h1YjJSbExHa3BJRDArSUh0Y2JpQWdJQ0FnSUdsbUlDaDBhR2x6TG01dlpHVnpXMmxkTG5nZ1BEMGdlQ2tnZTF4dUlDQWdJQ0FnSUNCcGJtUmxlQ0E5SUdrck1UdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOUtUdGNiaUFnSUNCeVpYUjFjbTRnYVc1a1pYZzdYRzRnSUgxY2JseHVJQ0J6WTJGc1pVNXZaR1VvYVNrZ2UxeHVYRzRnSUZ4MGJHVjBJR05zYVhCd1pXUllJRDBnYldGMGFDNWpiR2x3S0hSb2FYTXVibTlrWlhOYmFWMHVlQ3dnTUN3Z01TazdYRzRnSUZ4MGJHVjBJR05zYVhCd1pXUlpJRDBnYldGMGFDNWpiR2x3S0hSb2FYTXVibTlrWlhOYmFWMHVlU3dnTUN3Z01TazdYRzVjYmlBZ0lDQjBhR2x6TG01dlpHVnpXMmxkTG0xdmRtVW9JR05zYVhCd1pXUllMQ0JqYkdsd2NHVmtXU0FwTzF4dVhHNGdJSDFjYmx4dUlDQXZLaXBjYmlBZ1UyOXlkQ0IwYUdVZ2RHaHBjeTV3YjJsdWRITWdZWEp5WVhrZ1puSnZiU0JzWldaMExXMXZjM1FnY0c5cGJuUWdkRzhnY21sbmFIUXRiVzl6ZENCd2IybHVkQzRnV1c5MUlITm9iM1ZzWkNCdWIzUWdjbVZuZFd4aGNteDVJRzVsWldRZ2RHOGdkWE5sSUhSb2FYTXNJR2h2ZDJWMlpYSWdhWFFnYldGNUlHSmxJSFZ6WldaMWJDQnBaaUIwYUdVZ2NHOXBiblJ6SUdkbGRDQjFibTl5WkdWeVpXUXVYRzRnSUNvdlhHNGdJSE52Y25SUWIybHVkSE1vS1NCN1hHNGdJQ0FnZEdocGN5NXViMlJsY3k1emIzSjBLR1oxYm1OMGFXOXVLR0VzSUdJcGUxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdFdWVDQStJR0l1ZUR0Y2JpQWdJQ0I5S1R0Y2JpQWdmVnh1WEc1Y2JpQWdMeW9xWEc0Z0lFRmtaQ0JoSUdKeVpXRnJjRzlwYm5RZ2IyNGdkR2hsSUdWdWRtVnNiM0JsTGx4dUlDQkFjR0Z5WVcwZ2VDQjdiblZ0WW1WeWZTQjRJR3h2WTJGMGFXOXVJRzltSUhSb1pTQndiMmx1ZEN3Z2JtOXliV0ZzYVhwbFpDQW9NQzB4S1Z4dUlDQkFjR0Z5WVcwZ2VTQjdiblZ0WW1WeWZTQjVJR3h2WTJGMGFXOXVJRzltSUhSb1pTQndiMmx1ZEN3Z2JtOXliV0ZzYVhwbFpDQW9NQzB4S1Z4dUlDQXFMMXh1SUNCaFpHUlFiMmx1ZENoNExIa3BJSHRjYmlBZ0lDQnNaWFFnYVc1a1pYZ2dQU0IwYUdsekxtNXZaR1Z6TG14bGJtZDBhRHRjYmx4dUlDQWdJSFJvYVhNdWMyOXlkRkJ2YVc1MGN5Z3BPMXh1WEc0Z0lDQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHazhkR2hwY3k1dWIyUmxjeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLSGdnUENCMGFHbHpMbTV2WkdWelcybGRMbmdwSUh0Y2JpQWdJQ0FnSUNBZ2FXNWtaWGdnUFNCcE8xeHVJQ0FnSUNBZ0lDQmljbVZoYXp0Y2JpQWdJQ0FnSUgxY2JpQWdYSFI5WEc1Y2JpQWdJQ0IwYUdsekxtNXZaR1Z6TG5Od2JHbGpaU2hwYm1SbGVDd2dNQ3dnYm1WM0lGQnZhVzUwS0h0Y2JpQWdJQ0FnSUhnNklIZ3NYRzRnSUNBZ0lDQjVPaUI1WEc0Z0lDQWdmU3dnZEdocGN5a3BPMXh1WEc0Z0lDQWdkR2hwY3k1elkyRnNaVTV2WkdVb2FXNWtaWGdwTzF4dVhHNGdJQ0FnZEdocGN5NWpZV3hqZFd4aGRHVlFiMmx1ZEhNb0tUdGNiaUFnSUNCMGFHbHpMbVZ0YVhRb0oyTm9ZVzVuWlNjc2RHaHBjeTV3YjJsdWRITXBPMXh1WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdmVnh1WEc1Y2JpQWdMeW9xWEc0Z0lFWnBibVFnZEdobElHeGxkbVZzSUdGMElHRWdZMlZ5ZEdGcGJpQjRJR3h2WTJGMGFXOXVJRzl1SUhSb1pTQmxiblpsYkc5d1pTNWNiaUFnUUhCaGNtRnRJSGdnZTI1MWJXSmxjbjBnVkdobElIZ2diRzlqWVhScGIyNGdkRzhnWm1sdVpDQjBhR1VnYkdWMlpXd2diMllzSUc1dmNtMWhiR2w2WldRZ01DMHhYRzRnSUNvdlhHNGdJSE5qWVc0b2VDa2dlMXh1SUNBZ0lDOHZJR1pwYm1RZ2MzVnljbTkxYm1ScGJtY2djRzlwYm5SelhHNGdJQ0FnYkdWMElHNWxlSFJKYm1SbGVDQTlJSFJvYVhNdVoyVjBTVzVrWlhoR2NtOXRXQ2g0S1R0Y2JpQWdJQ0JzWlhRZ2NISnBiM0pKYm1SbGVDQTlJRzVsZUhSSmJtUmxlQzB4TzF4dUlDQWdJR2xtSUNod2NtbHZja2x1WkdWNElEd2dNQ2tnZTF4dUlDQWdJQ0FnY0hKcGIzSkpibVJsZUNBOUlEQTdYRzRnSUNBZ2ZWeHVJQ0FnSUdsbUlDaHVaWGgwU1c1a1pYZ2dQajBnZEdocGN5NXViMlJsY3k1c1pXNW5kR2dwSUh0Y2JpQWdJQ0FnSUc1bGVIUkpibVJsZUNBOUlIUm9hWE11Ym05a1pYTXViR1Z1WjNSb0xURTdYRzRnSUNBZ2ZWeHVJQ0FnSUd4bGRDQndjbWx2Y2xCdmFXNTBJRDBnZEdocGN5NXViMlJsYzF0d2NtbHZja2x1WkdWNFhUdGNiaUFnSUNCc1pYUWdibVY0ZEZCdmFXNTBJRDBnZEdocGN5NXViMlJsYzF0dVpYaDBTVzVrWlhoZE8xeHVJQ0FnSUd4bGRDQnNiMk1nUFNCdFlYUm9Mbk5qWVd4bEtIZ3NjSEpwYjNKUWIybHVkQzU0TENCdVpYaDBVRzlwYm5RdWVDd2dNQ3dnTVNrN1hHNGdJQ0FnYkdWMElIWmhiSFZsSUQwZ2JXRjBhQzVwYm5SbGNuQW9iRzlqTEhCeWFXOXlVRzlwYm5RdWVTeHVaWGgwVUc5cGJuUXVlU2s3WEc0Z0lDQWdkR2hwY3k1bGJXbDBLQ2R6WTJGdUp5eDJZV3gxWlNrN1hHNGdJQ0FnY21WMGRYSnVJSFpoYkhWbE8xeHVJQ0I5WEc1Y2JseHVJQ0F2S2lwY2JpQWdUVzkyWlNCaElHSnlaV0ZyY0c5cGJuUWdiMjRnZEdobElHVnVkbVZzYjNCbExseHVJQ0JBY0dGeVlXMGdhVzVrWlhnZ2UyNTFiV0psY24wZ1ZHaGxJR2x1WkdWNElHOW1JSFJvWlNCaWNtVmhhM0J2YVc1MElIUnZJRzF2ZG1WY2JpQWdRSEJoY21GdElIZ2dlMjUxYldKbGNuMGdUbVYzSUhnZ2JHOWpZWFJwYjI0c0lHNXZjbTFoYkdsNlpXUWdNQzB4WEc0Z0lFQndZWEpoYlNCNUlIdHVkVzFpWlhKOUlFNWxkeUI1SUd4dlkyRjBhVzl1TENCdWIzSnRZV3hwZW1Wa0lEQXRNVnh1SUNBcUwxeHVJQ0J0YjNabFVHOXBiblFvYVc1a1pYZ3NlQ3g1S1NCN1hHNGdJQ0FnZEdocGN5NXViMlJsYzF0cGJtUmxlRjB1Ylc5MlpTaDRMSGtwTzF4dUlDQWdJSFJvYVhNdWMyTmhiR1ZPYjJSbEtHbHVaR1Y0S1R0Y2JpQWdJQ0IwYUdsekxtTmhiR04xYkdGMFpWQnZhVzUwY3lncE8xeHVJQ0FnSUhSb2FYTXVaVzFwZENnblkyaGhibWRsSnl4MGFHbHpMbkJ2YVc1MGN5azdYRzRnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ2ZWeHVYRzVjYmlBZ0x5b3FYRzRnSUUxdmRtVWdZU0JpY21WaGEzQnZhVzUwSUc5dUlIUm9aU0JsYm5abGJHOXdaU0JpZVNCaElHTmxjblJoYVc0Z1lXMXZkVzUwTGx4dUlDQkFjR0Z5WVcwZ2FXNWtaWGdnZTI1MWJXSmxjbjBnVkdobElHbHVaR1Y0SUc5bUlIUm9aU0JpY21WaGEzQnZhVzUwSUhSdklHMXZkbVZjYmlBZ1FIQmhjbUZ0SUhoUFptWnpaWFFnZTI1MWJXSmxjbjBnV0NCa2FYTndiR0ZqWlcxbGJuUXNJRzV2Y20xaGJHbDZaV1FnTUMweFhHNGdJRUJ3WVhKaGJTQjVUMlptYzJWMElIdHVkVzFpWlhKOUlGa2daR2x6Y0d4aFkyVnRaVzUwTENCdWIzSnRZV3hwZW1Wa0lEQXRNVnh1SUNBcUwxeHVJQ0JoWkdwMWMzUlFiMmx1ZENocGJtUmxlQ3g0VDJabWMyVjBMSGxQWm1aelpYUXBJSHRjYmlBZ0lDQjBhR2x6TG01dlpHVnpXMmx1WkdWNFhTNXRiM1psS0hSb2FYTXVibTlrWlhOYmFXNWtaWGhkTG5ncmVFOW1abk5sZEN4MGFHbHpMbTV2WkdWelcybHVaR1Y0WFM1NUszbFBabVp6WlhRcE8xeHVJQ0FnSUhSb2FYTXVjMk5oYkdWT2IyUmxLR2x1WkdWNEtUdGNiaUFnSUNCMGFHbHpMbU5oYkdOMWJHRjBaVkJ2YVc1MGN5Z3BPMXh1SUNBZ0lIUm9hWE11WlcxcGRDZ25ZMmhoYm1kbEp5eDBhR2x6TG5CdmFXNTBjeWs3WEc0Z0lDQWdkR2hwY3k1eVpXNWtaWElvS1R0Y2JpQWdmVnh1WEc1Y2JpQWdMeW9xWEc0Z0lGSmxiVzkyWlNCaElHSnlaV0ZyY0c5cGJuUWdabkp2YlNCMGFHVWdaVzUyWld4dmNHVXVYRzRnSUVCd1lYSmhiU0JwYm1SbGVDQjdiblZ0WW1WeWZTQkpibVJsZUNCdlppQjBhR1VnWW5KbFlXdHdiMmx1ZENCMGJ5QnlaVzF2ZG1WY2JpQWdLaTljYmlBZ1pHVnpkSEp2ZVZCdmFXNTBLR2x1WkdWNEtTQjdYRzRnSUNBZ2RHaHBjeTV1YjJSbGMxdHBibVJsZUYwdVpHVnpkSEp2ZVNncE8xeHVJQ0FnSUhSb2FYTXVZMkZzWTNWc1lYUmxVRzlwYm5SektDazdYRzRnSUNBZ2RHaHBjeTVsYldsMEtDZGphR0Z1WjJVbkxIUm9hWE11Y0c5cGJuUnpLVHRjYmlBZ0lDQjBhR2x6TG5KbGJtUmxjaWdwTzF4dUlDQjlYRzVjYmx4dUlDQXZLaXBjYmlBZ1VtVnRiM1psSUdGc2JDQmxlR2x6ZEdsdVp5QmljbVZoYTNCdmFXNTBjeUJoYm1RZ1lXUmtJR0Z1SUdWdWRHbHlaV3g1SUc1bGR5QnpaWFFnYjJZZ1luSmxZV3R3YjJsdWRITXVYRzRnSUVCd1lYSmhiU0JoYkd4UWIybHVkSE1nZTJGeWNtRjVmU0JCYmlCaGNuSmhlU0J2WmlCdlltcGxZM1J6SUhkcGRHZ2dlQzk1SUhCeWIzQmxjblJwWlhNZ0tHNXZjbTFoYkdsNlpXUWdNQzB4S1M0Z1JXRmphQ0J2WW1wbFkzUWdhVzRnZEdobElHRnljbUY1SUhOd1pXTnBabWxqWlhNZ2RHaGxJSGd2ZVNCc2IyTmhkR2x2YmlCdlppQmhJRzVsZHlCaWNtVmhhM0J2YVc1MElIUnZJR0psSUdGa1pHVmtMbHh1SUNBcUwxeHVJQ0J6WlhSUWIybHVkSE1vWVd4c1VHOXBiblJ6S1NCN1hHNGdJQ0FnZDJocGJHVWdLSFJvYVhNdWJtOWtaWE11YkdWdVozUm9LU0I3WEc0Z0lDQWdJQ0IwYUdsekxtNXZaR1Z6V3pCZExtUmxjM1J5YjNrb0tUdGNiaUFnSUNCOVhHNGdJQ0FnWVd4c1VHOXBiblJ6TG1admNrVmhZMmdvS0hCdmFXNTBLU0E5UGlCN1hHNGdJQ0FnSUNCMGFHbHpMbUZrWkZCdmFXNTBLSEJ2YVc1MExuZ3NjRzlwYm5RdWVTazdYRzRnSUNBZ2ZTazdYRzRnSUNBZ2RHaHBjeTVqWVd4amRXeGhkR1ZRYjJsdWRITW9LVHRjYmlBZ0lDQjBhR2x6TG1WdGFYUW9KMk5vWVc1blpTY3NkR2hwY3k1d2IybHVkSE1wTzF4dUlDQWdJSFJvYVhNdWNtVnVaR1Z5S0NrN1hHNGdJSDFjYmx4dWZWeHVYRzVjYmx4dUx5OGdWMFZDVUVGRFN5QkdUMDlVUlZJZ0x5OWNiaTh2SUM0dmZpOXFjMmhwYm5RdGJHOWhaR1Z5SVM0dmJHbGlMMmx1ZEdWeVptRmpaWE12Wlc1MlpXeHZjR1V1YW5NaUxDSW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JteGxkQ0JrYjIwZ1BTQnlaWEYxYVhKbEtDY3VMaTkxZEdsc0wyUnZiU2NwTzF4dUx5OXNaWFFnYldGMGFDQTlJSEpsY1hWcGNtVW9KeTR1TDNWMGFXd3ZiV0YwYUNjcE8xeHViR1YwSUVsdWRHVnlabUZqWlNBOUlISmxjWFZwY21Vb0p5NHVMMk52Y21VdmFXNTBaWEptWVdObEp5azdYRzVjYmk4cUtseHVLaUJUY0dWamRISnZaM0poYlZ4dUtseHVLaUJBWkdWelkzSnBjSFJwYjI0Z1FYVmthVzhnYzNCbFkzUnlkVzBnZG1semRXRnNhWHBoZEdsdmJseHVLbHh1S2lCQVpHVnRieUE4YzNCaGJpQnVaWGgxY3kxMWFUMWNJbk53WldOMGNtOW5jbUZ0WENJK1BDOXpjR0Z1UGx4dUtseHVLaUJBWlhoaGJYQnNaVnh1S2lCMllYSWdjM0JsWTNSeWIyZHlZVzBnUFNCdVpYY2dUbVY0ZFhNdVUzQmxZM1J5YjJkeVlXMG9KeU4wWVhKblpYUW5LVnh1S2x4dUtpQkFaWGhoYlhCc1pWeHVLaUIyWVhJZ2MzQmxZM1J5YjJkeVlXMGdQU0J1WlhjZ1RtVjRkWE11VTNCbFkzUnliMmR5WVcwb0p5TjBZWEpuWlhRbkxIdGNiaW9nSUNBbmMybDZaU2M2SUZzek1EQXNNVFV3WFZ4dUtpQjlLVnh1S2x4dUtpQkFiM1YwY0hWMFhHNHFJQ1p1WW5Od08xeHVLaUJPYnlCbGRtVnVkSE5jYmlwY2Jpb3ZYRzVjYm1sdGNHOXlkQ0I3SUdOdmJuUmxlSFFnZlNCbWNtOXRJQ2N1TGk5dFlXbHVKenRjYmx4dVpYaHdiM0owSUdSbFptRjFiSFFnWTJ4aGMzTWdVM0JsWTNSeWIyZHlZVzBnWlhoMFpXNWtjeUJKYm5SbGNtWmhZMlVnZTF4dVhHNGdJR052Ym5OMGNuVmpkRzl5S0NrZ2UxeHVYRzRnSUNBZ2JHVjBJRzl3ZEdsdmJuTWdQU0JiSjNOallXeGxKeXduZG1Gc2RXVW5YVHRjYmx4dUlDQWdJR3hsZENCa1pXWmhkV3gwY3lBOUlIdGNiaUFnSUNBZ0lDZHphWHBsSnpvZ1d6TXdNQ3d4TlRCZFhHNGdJQ0FnZlR0Y2JseHVJQ0FnSUhOMWNHVnlLR0Z5WjNWdFpXNTBjeXh2Y0hScGIyNXpMR1JsWm1GMWJIUnpLVHRjYmx4dUlDQWdJSFJvYVhNdVkyOXVkR1Y0ZENBOUlHTnZiblJsZUhRb0tUc2dMeThnYW5Ob2FXNTBJR2xuYm05eVpUcHNhVzVsWEc1Y2JpQWdJQ0IwYUdsekxtRnVZV3g1YzJWeUlEMGdkR2hwY3k1amIyNTBaWGgwTG1OeVpXRjBaVUZ1WVd4NWMyVnlLQ2s3WEc0Z0lDQWdkR2hwY3k1aGJtRnNlWE5sY2k1bVpuUlRhWHBsSUQwZ01qQTBPRHRjYmlBZ0lDQjBhR2x6TG1KMVptWmxja3hsYm1kMGFDQTlJSFJvYVhNdVlXNWhiSGx6WlhJdVpuSmxjWFZsYm1ONVFtbHVRMjkxYm5RN1hHNGdJQ0FnZEdocGN5NWtZWFJoUVhKeVlYa2dQU0J1WlhjZ1ZXbHVkRGhCY25KaGVTaDBhR2x6TG1KMVptWmxja3hsYm1kMGFDazdYRzVjYmlBZ0lDQjBhR2x6TG1GamRHbDJaU0E5SUhSeWRXVTdYRzVjYmlBZ0lDQjBhR2x6TG5OdmRYSmpaU0E5SUdaaGJITmxPMXh1WEc0Z0lDQWdkR2hwY3k1cGJtbDBLQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrUm5KaGJXVW9LU0I3WEc0Z0lDQWdkR2hwY3k1allXNTJZWE1nUFNCdVpYY2daRzl0TGxOdFlYSjBRMkZ1ZG1GektIUm9hWE11Y0dGeVpXNTBLVHRjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblFnUFNCMGFHbHpMbU5oYm5aaGN5NWxiR1Z0Wlc1ME8xeHVJQ0I5WEc1Y2JpQWdjMmw2WlVsdWRHVnlabUZqWlNncElIdGNiaUFnSUNCMGFHbHpMbU5oYm5aaGN5NXlaWE5wZW1Vb2RHaHBjeTUzYVdSMGFDeDBhR2x6TG1obGFXZG9kQ2s3WEc0Z0lIMWNibHh1SUNCamIyeHZja2x1ZEdWeVptRmpaU2dwSUh0Y2JpQWdJQ0IwYUdsekxtTmhiblpoY3k1bGJHVnRaVzUwTG5OMGVXeGxMbUpoWTJ0bmNtOTFibVJEYjJ4dmNpQTlJSFJvYVhNdVkyOXNiM0p6TG1acGJHdzdYRzRnSUgxY2JseHVJQ0J5Wlc1a1pYSW9LU0I3WEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTVoWTNScGRtVXBJSHRjYmlBZ0lDQWdJSEpsY1hWbGMzUkJibWx0WVhScGIyNUdjbUZ0WlNoMGFHbHpMbkpsYm1SbGNpNWlhVzVrS0hSb2FYTXBLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjBhR2x6TG1GdVlXeDVjMlZ5TG1kbGRFSjVkR1ZHY21WeGRXVnVZM2xFWVhSaEtIUm9hWE11WkdGMFlVRnljbUY1S1R0Y2JseHVJQ0FnSUhSb2FYTXVZMkZ1ZG1GekxtTnZiblJsZUhRdVptbHNiRk4wZVd4bElEMGdkR2hwY3k1amIyeHZjbk11Wm1sc2JEdGNiaUFnSUNCMGFHbHpMbU5oYm5aaGN5NWpiMjUwWlhoMExtWnBiR3hTWldOMEtEQXNJREFzSUhSb2FYTXVZMkZ1ZG1GekxtVnNaVzFsYm5RdWQybGtkR2dzSUhSb2FYTXVZMkZ1ZG1GekxtVnNaVzFsYm5RdWFHVnBaMmgwS1R0Y2JseHVJQ0FnSUdsbUlDaDBhR2x6TG5OdmRYSmpaU0FtSmlCMGFHbHpMbVJoZEdGQmNuSmhlU2tnZTF4dVhHNGdJQ0FnSUNBdkwyTnZibk52YkdVdWJHOW5LSFJvYVhNdVpHRjBZVUZ5Y21GNUtUdGNibHh1SUNBZ0lDQWdiR1YwSUdKaGNsZHBaSFJvSUQwZ0tIUm9hWE11WTJGdWRtRnpMbVZzWlcxbGJuUXVkMmxrZEdnZ0x5QjBhR2x6TG1KMVptWmxja3hsYm1kMGFDazdYRzRnSUNBZ0lDQnNaWFFnWW1GeVNHVnBaMmgwTzF4dUlDQWdJQ0FnYkdWMElIZ2dQU0F3TzF4dVhHNGdJQ0FnSUNCc1pYUWdaR1ZtYVc1cGRHbHZiaUE5SUhSb2FYTXVZMkZ1ZG1GekxtVnNaVzFsYm5RdWQybGtkR2d2TlRBN1hHNWNiaUFnSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkR2hwY3k1aWRXWm1aWEpNWlc1bmRHZzdJR2tnUFNCcEsyUmxabWx1YVhScGIyNHBJSHRjYmlBZ0lDQWdJQ0FnWW1GeVNHVnBaMmgwSUQwZ1RXRjBhQzV0WVhndVlYQndiSGtvYm5Wc2JDd2dkR2hwY3k1a1lYUmhRWEp5WVhrdWMzVmlZWEp5WVhrb2FTeHBLMlJsWm1sdWFYUnBiMjRwS1R0Y2JpQWdJQ0FnSUNBZ1ltRnlTR1ZwWjJoMElDODlJREkxTlR0Y2JpQWdJQ0FnSUNBZ1ltRnlTR1ZwWjJoMElDbzlJSFJvYVhNdVkyRnVkbUZ6TG1Wc1pXMWxiblF1YUdWcFoyaDBPMXh1WEc0Z0lDQWdJQ0FnSUhSb2FYTXVZMkZ1ZG1GekxtTnZiblJsZUhRdVptbHNiRk4wZVd4bElEMGdkR2hwY3k1amIyeHZjbk11WVdOalpXNTBPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtTmhiblpoY3k1amIyNTBaWGgwTG1acGJHeFNaV04wS0hnc2RHaHBjeTVqWVc1MllYTXVaV3hsYldWdWRDNW9aV2xuYUhRdFltRnlTR1ZwWjJoMExHSmhjbGRwWkhSb0ttUmxabWx1YVhScGIyNHNZbUZ5U0dWcFoyaDBLVHRjYmx4dUlDQWdJQ0FnSUNCNElDczlJQ2hpWVhKWGFXUjBhQ3BrWldacGJtbDBhVzl1S1R0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNBdktpcGNiaUFnUlhGMWFYWmhiR1Z1ZENCMGJ5QmNJbkJoZEdOb2FXNW5JR2x1WENJZ1lXNGdZWFZrYVc4Z2JtOWtaU0IwYnlCMmFYTjFZV3hwZW1VdUlFNVBWRVU2SUZsdmRTQmpZVzV1YjNRZ1kyOXVibVZqZENCaGRXUnBieUJ1YjJSbGN5QmhZM0p2YzNNZ2RIZHZJR1JwWm1abGNtVnVkQ0JoZFdScGJ5QmpiMjUwWlhoMGN5NGdUbVY0ZFhOVlNTQnlkVzV6SUdsMGN5QmhkV1JwYnlCaGJtRnNlWE5wY3lCdmJpQnBkSE1nYjNkdUlHRjFaR2x2SUdOdmJuUmxlSFFzSUU1bGVIVnpMbU52Ym5SbGVIUXVJRWxtSUhSb1pTQmhkV1JwYnlCdWIyUmxJSGx2ZFNCaGNtVWdkbWx6ZFdGc2FYcHBibWNnYVhNZ1kzSmxZWFJsWkNCdmJpQmhJR1JwWm1abGNtVnVkQ0JoZFdScGJ5QmpiMjUwWlhoMExDQjViM1VnZDJsc2JDQnVaV1ZrSUhSdklIUmxiR3dnVG1WNGRYTlZTU0IwYnlCMWMyVWdkR2hoZENCamIyNTBaWGgwSUdsdWMzUmxZV1E2SUdrdVpTNGdUbVY0ZFhNdVkyOXVkR1Y0ZENBOUlGbHZkWEpCZFdScGIwTnZiblJsZUhST1lXMWxMaUJHYjNJZ1pYaGhiWEJzWlN3Z2FXNGdWRzl1WlVwVElIQnliMnBsWTNSekxDQjBhR1VnYkdsdVpTQjNiM1ZzWkNCaVpUb2dUbVY0ZFhNdVkyOXVkR1Y0ZENBOUlGUnZibVV1WTI5dWRHVjRkQ0F1SUZkbElISmxZMjl0YldWdVpDQjBhR0YwSUhsdmRTQjNjbWwwWlNCMGFHRjBJR3hwYm1VZ2IyWWdZMjlrWlNCdmJteDVJRzl1WTJVZ1lYUWdkR2hsSUdKbFoybHVibWx1WnlCdlppQjViM1Z5SUhCeWIycGxZM1F1WEc0Z0lFQndZWEpoYlNCdWIyUmxJSHRCZFdScGIwNXZaR1Y5SUZSb1pTQmhkV1JwYnlCdWIyUmxJSFJ2SUhacGMzVmhiR2w2WlZ4dUlDQkFaWGhoYlhCc1pTQk9aWGgxY3k1amIyNTBaWGgwSUQwZ1ZHOXVaUzVqYjI1MFpYaDBJQzh2SUc5eUlHRnViM1JvWlhJZ1lYVmthVzhnWTI5dWRHVjRkQ0I1YjNVZ2FHRjJaU0JqY21WaGRHVmtYRzRnSUhOd1pXTjBjbTluY21GdExtTnZibTVsWTNRb0lGUnZibVV1VFdGemRHVnlJQ2s3WEc0Z0lDb3ZYRzRnSUdOdmJtNWxZM1FvYm05a1pTa2dlMXh1SUNBZ0lHbG1JQ2gwYUdsekxuTnZkWEpqWlNrZ2UxeHVJQ0FnSUNBZ2RHaHBjeTVrYVhOamIyNXVaV04wS0NrN1hHNGdJQ0FnZlZ4dUlDQWdJSFJvYVhNdWMyOTFjbU5sSUQwZ2JtOWtaVHRjYmlBZ0lDQjBhR2x6TG5OdmRYSmpaUzVqYjI1dVpXTjBLSFJvYVhNdVlXNWhiSGx6WlhJcE8xeHVJQ0FnSUhSb2FYTXVjbVZ1WkdWeUtDazdYRzRnSUgxY2JseHVJQ0F2S2lwY2JpQWdVM1J2Y0NCMmFYTjFZV3hwZW1sdVp5QjBhR1VnYzI5MWNtTmxJRzV2WkdVZ1lXNWtJR1JwYzJOdmJtNWxZM1FnYVhRdVhHNGdJQ292WEc0Z0lHUnBjMk52Ym01bFkzUW9LU0I3WEc0Z0lDQWdkR2hwY3k1emIzVnlZMlV1WkdselkyOXVibVZqZENoMGFHbHpMbUZ1WVd4NWMyVnlLVHRjYmlBZ0lDQjBhR2x6TG5OdmRYSmpaU0E5SUc1MWJHdzdYRzRnSUgxY2JseHVJQ0JqYkdsamF5Z3BJSHRjYmlBZ0lDQjBhR2x6TG1GamRHbDJaU0E5SUNGMGFHbHpMbUZqZEdsMlpUdGNiaUFnSUNCMGFHbHpMbkpsYm1SbGNpZ3BPMXh1SUNCOVhHNWNiaUFnWTNWemRHOXRSR1Z6ZEhKdmVTZ3BJSHRjYmlBZ0lDQjBhR2x6TG1GamRHbDJaU0E5SUdaaGJITmxPMXh1SUNCOVhHNWNibjFjYmx4dVhHNWNiaTh2SUZkRlFsQkJRMHNnUms5UFZFVlNJQzh2WEc0dkx5QXVMMzR2YW5Ob2FXNTBMV3h2WVdSbGNpRXVMMnhwWWk5cGJuUmxjbVpoWTJWekwzTndaV04wY205bmNtRnRMbXB6SWl3aUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc1c1pYUWdaRzl0SUQwZ2NtVnhkV2x5WlNnbkxpNHZkWFJwYkM5a2IyMG5LVHRjYm14bGRDQnRZWFJvSUQwZ2NtVnhkV2x5WlNnbkxpNHZkWFJwYkM5dFlYUm9KeWs3WEc1c1pYUWdTVzUwWlhKbVlXTmxJRDBnY21WeGRXbHlaU2duTGk0dlkyOXlaUzlwYm5SbGNtWmhZMlVuS1R0Y2JseHVYRzR2S2lwY2Jpb2dUV1YwWlhKY2JpcGNiaW9nUUdSbGMyTnlhWEIwYVc5dUlGTjBaWEpsYnlCa1pXTnBZbVZzSUcxbGRHVnlYRzRxWEc0cUlFQmtaVzF2SUR4emNHRnVJRzVsZUhWekxYVnBQVndpYldWMFpYSmNJajQ4TDNOd1lXNCtYRzRxWEc0cUlFQmxlR0Z0Y0d4bFhHNHFJSFpoY2lCdFpYUmxjaUE5SUc1bGR5Qk9aWGgxY3k1TlpYUmxjaWduSTNSaGNtZGxkQ2NwWEc0cVhHNHFJRUJsZUdGdGNHeGxYRzRxSUhaaGNpQnRaWFJsY2lBOUlHNWxkeUJPWlhoMWN5NU5aWFJsY2lnbkkzUmhjbWRsZENjc2UxeHVLaUFnSUhOcGVtVTZJRnMzTlN3M05WMWNiaW9nZlNsY2JpcGNiaW9nUUc5MWRIQjFkRnh1S2lBbWJtSnpjRHRjYmlvZ1RtOGdaWFpsYm5SelhHNHFYRzRxTDF4dVhHNXBiWEJ2Y25RZ2V5QmpiMjUwWlhoMElIMGdabkp2YlNBbkxpNHZiV0ZwYmljN1hHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHTnNZWE56SUUxbGRHVnlJR1Y0ZEdWdVpITWdTVzUwWlhKbVlXTmxJSHRjYmx4dUlDQmpiMjV6ZEhKMVkzUnZjaWdwSUh0Y2JseHVJQ0FnSUd4bGRDQnZjSFJwYjI1eklEMGdXeWR6WTJGc1pTY3NKM1poYkhWbEoxMDdYRzVjYmlBZ0lDQnNaWFFnWkdWbVlYVnNkSE1nUFNCN1hHNGdJQ0FnSUNBbmMybDZaU2M2SUZzek1Dd3hNREJkWEc0Z0lDQWdmVHRjYmx4dUlDQWdJSE4xY0dWeUtHRnlaM1Z0Wlc1MGN5eHZjSFJwYjI1ekxHUmxabUYxYkhSektUdGNibHh1SUNBZ0lIUm9hWE11WTI5dWRHVjRkQ0E5SUdOdmJuUmxlSFFvS1RzZ0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYRzVjYmlBZ0lDQjBhR2x6TG1Ob1lXNXVaV3h6SUQwZ01qdGNibHh1SUNBZ0lIUm9hWE11YzNCc2FYUjBaWElnUFNCMGFHbHpMbU52Ym5SbGVIUXVZM0psWVhSbFEyaGhibTVsYkZOd2JHbDBkR1Z5S0NCMGFHbHpMbU5vWVc1dVpXeHpJQ2s3WEc1Y2JpQWdJQ0IwYUdsekxtRnVZV3g1YzJWeWN5QTlJRnRkTzF4dVhHNGdJQ0FnWm05eUlDaHNaWFFnYVQwd095QnBQSFJvYVhNdVkyaGhibTVsYkhNN0lHa3JLeWtnZTF4dUlDQWdJQ0FnYkdWMElHRnVZV3g1YzJWeUlEMGdkR2hwY3k1amIyNTBaWGgwTG1OeVpXRjBaVUZ1WVd4NWMyVnlLQ2s3WEc0Z0lDQWdJQ0IwYUdsekxuTndiR2wwZEdWeUxtTnZibTVsWTNRb1lXNWhiSGx6WlhJc2FTazdYRzRnSUNBZ0lDQmhibUZzZVhObGNpNW1ablJUYVhwbElEMGdNVEF5TkR0Y2JpQWdJQ0FnSUdGdVlXeDVjMlZ5TG5OdGIyOTBhR2x1WjFScGJXVkRiMjV6ZEdGdWRDQTlJREU3WEc0Z0lDQWdJQ0IwYUdsekxtRnVZV3g1YzJWeWN5NXdkWE5vS0NCaGJtRnNlWE5sY2lBcE8xeHVJQ0FnSUgxY2JpQWdJQ0IwYUdsekxtSjFabVpsY2t4bGJtZDBhQ0E5SUhSb2FYTXVZVzVoYkhselpYSnpXekJkTG1aeVpYRjFaVzVqZVVKcGJrTnZkVzUwTzF4dUlDQWdJSFJvYVhNdVpHRjBZVUZ5Y21GNUlEMGdibVYzSUVac2IyRjBNekpCY25KaGVTaDBhR2x6TG1KMVptWmxja3hsYm1kMGFDazdYRzVjYmk4cVhHNGdJQ0FnTHk4Z1lXUmtJR3hwYm1WaGNpQm5jbUZrYVdWdWRGeHVJQ0FnSUhaaGNpQm5jbVFnUFNCallXNTJZWE5EZEhndVkzSmxZWFJsVEdsdVpXRnlSM0poWkdsbGJuUW9NQ3dnTUN3Z01Dd2dZMkZ1ZG1GekxtaGxhV2RvZENrN1hHNGdJQ0FnTHk4Z2JHbG5hSFFnWW14MVpWeHVJQ0FnSUdkeVpDNWhaR1JEYjJ4dmNsTjBiM0FvTUN3Z0p5TXdNREFuS1R0Y2JpQWdJQ0JuY21RdVlXUmtRMjlzYjNKVGRHOXdLREF1TWl3Z0p5TmlZbUluS1R0Y2JpQWdJQ0JuY21RdVlXUmtRMjlzYjNKVGRHOXdLREF1TkN3Z0p5TmtNVGduS1R0Y2JpQWdJQ0F2THlCa1lYSnJJR0pzZFdWY2JpQWdJQ0JuY21RdVlXUmtRMjlzYjNKVGRHOXdLREVzSUNjalpERTRKeWs3WEc0Z0lDQWdZMkZ1ZG1GelEzUjRMbVpwYkd4VGRIbHNaU0E5SUdkeVpEc2dLaTljYmx4dUlDQWdJSFJvYVhNdVlXTjBhWFpsSUQwZ2RISjFaVHRjYmx4dUlDQWdJSFJvYVhNdVpHSWdQU0F0U1c1bWFXNXBkSGs3WEc1Y2JpQWdJQ0IwYUdsekxtbHVhWFFvS1R0Y2JseHVJQ0FnSUhSb2FYTXViV1YwWlhKWGFXUjBhQ0E5SUhSb2FYTXVZMkZ1ZG1GekxtVnNaVzFsYm5RdWQybGtkR2d2ZEdocGN5NWphR0Z1Ym1Wc2N6dGNibHh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc1Y2JpQWdmVnh1WEc0Z0lHSjFhV3hrUm5KaGJXVW9LU0I3WEc0Z0lDQWdkR2hwY3k1allXNTJZWE1nUFNCdVpYY2daRzl0TGxOdFlYSjBRMkZ1ZG1GektIUm9hWE11Y0dGeVpXNTBLVHRjYmlBZ0lDQjBhR2x6TG1Wc1pXMWxiblFnUFNCMGFHbHpMbU5oYm5aaGN5NWxiR1Z0Wlc1ME8xeHVJQ0I5WEc1Y2JpQWdjMmw2WlVsdWRHVnlabUZqWlNncElIdGNiaUFnSUNCMGFHbHpMbU5oYm5aaGN5NXlaWE5wZW1Vb2RHaHBjeTUzYVdSMGFDeDBhR2x6TG1obGFXZG9kQ2s3WEc0Z0lIMWNibHh1SUNCamIyeHZja2x1ZEdWeVptRmpaU2dwSUh0Y2JpQWdJQ0IwYUdsekxtTmhiblpoY3k1bGJHVnRaVzUwTG5OMGVXeGxMbUpoWTJ0bmNtOTFibVJEYjJ4dmNpQTlJSFJvYVhNdVkyOXNiM0p6TG1acGJHdzdYRzRnSUgxY2JseHVJQ0J5Wlc1a1pYSW9LU0I3WEc1Y2JpQWdJQ0JwWmlBb2RHaHBjeTVoWTNScGRtVXBJSHRjYmlBZ0lDQWdJSEpsY1hWbGMzUkJibWx0WVhScGIyNUdjbUZ0WlNoMGFHbHpMbkpsYm1SbGNpNWlhVzVrS0hSb2FYTXBLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQjBhR2x6TG1OaGJuWmhjeTVqYjI1MFpYaDBMbVpwYkd4VGRIbHNaU0E5SUhSb2FYTXVZMjlzYjNKekxtWnBiR3c3WEc0Z0lDQWdkR2hwY3k1allXNTJZWE11WTI5dWRHVjRkQzVtYVd4c1VtVmpkQ2d3TENBd0xDQjBhR2x6TG1OaGJuWmhjeTVsYkdWdFpXNTBMbmRwWkhSb0lDd2dkR2hwY3k1allXNTJZWE11Wld4bGJXVnVkQzVvWldsbmFIUXBPMXh1WEc0Z0lDQWdabTl5SUNoc1pYUWdhVDB3TzJrOGRHaHBjeTVoYm1Gc2VYTmxjbk11YkdWdVozUm9PMmtyS3lrZ2UxeHVYRzRnSUNBZ0lDQnBaaUFvZEdocGN5NXpiM1Z5WTJVcElIdGNibHh1SUNBZ0lDQWdJQ0IwYUdsekxtRnVZV3g1YzJWeWMxdHBYUzVuWlhSR2JHOWhkRlJwYldWRWIyMWhhVzVFWVhSaEtIUm9hWE11WkdGMFlVRnljbUY1S1R0Y2JseHVJQ0FnSUNBZ0lDQnNaWFFnY20xeklEMGdNRHRjYmx4dUlDQWdJQ0FnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElIUm9hWE11WkdGMFlVRnljbUY1TG14bGJtZDBhRHNnYVNzcktYdGNiaUFnSUNBZ0lDQWdJQ0FnSUNCeWJYTWdLejBnS0hSb2FYTXVaR0YwWVVGeWNtRjVXMmxkSUNvZ2RHaHBjeTVrWVhSaFFYSnlZWGxiYVYwcE8xeHVJQ0FnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJQ0FnY20xeklEMGdUV0YwYUM1emNYSjBLSEp0Y3lBdklIUm9hWE11WkdGMFlVRnljbUY1TG14bGJtZDBhQ2s3WEc1Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVrWWlBOUlESXdJQ29nVFdGMGFDNXNiMmN4TUNoeWJYTXBPMXh1WEc0Z0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0hSb2FYTXVaR0lnUGlBdE1qQXdJQ1ltSUhSb2FYTXVaR0lnSVQwOUlDMUpibVpwYm1sMGVTa2dlMXh1SUNBZ0lDQWdJQ0IwYUdsekxtUmlJQzA5SURFN1hHNGdJQ0FnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbVJpSUQwZ0xVbHVabWx1YVhSNU8xeHVJQ0FnSUNBZ2ZWeHVYRzVjYmlBZ0lDQWdJQzh2WTI5dWMyOXNaUzVzYjJjb1pHSXBYRzVjYmlBZ0lDQWdJR2xtSUNoMGFHbHpMbVJpSUQ0Z0xUY3dLU0I3WEc1Y2JpQWdJQ0FnSUNBZ2JHVjBJR3hwYm1WaGNpQTlJRzFoZEdndWJtOXliV0ZzYVhwbEtIUm9hWE11WkdJc0xUY3dMRFVwTzF4dUlDQWdJQ0FnSUNCc1pYUWdaWGh3SUQwZ2JHbHVaV0Z5SUNvZ2JHbHVaV0Z5TzF4dUlDQWdJQ0FnSUNCc1pYUWdlU0E5SUcxaGRHZ3VjMk5oYkdVb1pYaHdMREFzTVN4MGFHbHpMbVZzWlcxbGJuUXVhR1ZwWjJoMExEQXBPMXh1WEc0Z0lDQWdJQ0FnSUhSb2FYTXVZMkZ1ZG1GekxtTnZiblJsZUhRdVptbHNiRk4wZVd4bElEMGdkR2hwY3k1amIyeHZjbk11WVdOalpXNTBPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtTmhiblpoY3k1amIyNTBaWGgwTG1acGJHeFNaV04wS0hSb2FYTXViV1YwWlhKWGFXUjBhQ3BwTEhrc2RHaHBjeTV0WlhSbGNsZHBaSFJvTEhSb2FYTXVZMkZ1ZG1GekxtVnNaVzFsYm5RdWFHVnBaMmgwSUMwZ2VTazdYRzVjYmlBZ0lDQWdJQ0FnTHk5amIyNXpiMnhsTG14dlp5aGNJbkpsYm1SbGNtbHVaeTR1TGx3aUtWeHVYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQjlYRzVjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0JGY1hWcGRtRnNaVzUwSUhSdklGd2ljR0YwWTJocGJtY2dhVzVjSWlCaGJpQmhkV1JwYnlCdWIyUmxJSFJ2SUhacGMzVmhiR2w2WlM0Z1RrOVVSVG9nV1c5MUlHTmhibTV2ZENCamIyNXVaV04wSUdGMVpHbHZJRzV2WkdWeklHRmpjbTl6Y3lCMGQyOGdaR2xtWm1WeVpXNTBJR0YxWkdsdklHTnZiblJsZUhSekxpQk9aWGgxYzFWSklISjFibk1nYVhSeklHRjFaR2x2SUdGdVlXeDVjMmx6SUc5dUlHbDBjeUJ2ZDI0Z1lYVmthVzhnWTI5dWRHVjRkQ3dnVG1WNGRYTXVZMjl1ZEdWNGRDNGdTV1lnZEdobElHRjFaR2x2SUc1dlpHVWdlVzkxSUdGeVpTQjJhWE4xWVd4cGVtbHVaeUJwY3lCamNtVmhkR1ZrSUc5dUlHRWdaR2xtWm1WeVpXNTBJR0YxWkdsdklHTnZiblJsZUhRc0lIbHZkU0IzYVd4c0lHNWxaV1FnZEc4Z2RHVnNiQ0JPWlhoMWMxVkpJSFJ2SUhWelpTQjBhR0YwSUdOdmJuUmxlSFFnYVc1emRHVmhaRG9nYVM1bExpQk9aWGgxY3k1amIyNTBaWGgwSUQwZ1dXOTFja0YxWkdsdlEyOXVkR1Y0ZEU1aGJXVXVJRVp2Y2lCbGVHRnRjR3hsTENCcGJpQlViMjVsU2xNZ2NISnZhbVZqZEhNc0lIUm9aU0JzYVc1bElIZHZkV3hrSUdKbE9pQk9aWGgxY3k1amIyNTBaWGgwSUQwZ1ZHOXVaUzVqYjI1MFpYaDBJQzRnVjJVZ2NtVmpiMjF0Wlc1a0lIUm9ZWFFnZVc5MUlIZHlhWFJsSUhSb1lYUWdiR2x1WlNCdlppQmpiMlJsSUc5dWJIa2diMjVqWlNCaGRDQjBhR1VnWW1WbmFXNXVhVzVuSUc5bUlIbHZkWElnY0hKdmFtVmpkQzVjYmlBZ1FIQmhjbUZ0SUc1dlpHVWdlMEYxWkdsdlRtOWtaWDBnVkdobElHRjFaR2x2SUc1dlpHVWdkRzhnZG1semRXRnNhWHBsWEc0Z0lFQndZWEpoYlNCamFHRnVibVZzY3lCN2JuVnRZbVZ5ZlNBb2IzQjBhVzl1WVd3cElGUm9aU0J1ZFcxaVpYSWdiMllnWTJoaGJtNWxiSE1nYVc0Z2RHaGxJSE52ZFhKalpTQnViMlJsSUhSdklIZGhkR05vTGlCSlppQnViM1FnYzNCbFkybG1hV1ZrTENCMGFHVWdhVzUwWlhKbVlXTmxJSGRwYkd3Z2JHOXZheUJtYjNJZ1lTQXVZMmhoYm01bGJFTnZkVzUwSUhCeWIzQmxjblI1SUc5dUlIUm9aU0JwYm5CMWRDQnViMlJsTGlCSlppQnBkQ0JrYjJWeklHNXZkQ0JsZUdsemRDd2dkR2hsSUdsdWRHVnlabUZqWlNCM2FXeHNJR1JsWm1GMWJIUWdkRzhnTVNCamFHRnVibVZzTGx4dUlDQkFaWGhoYlhCc1pTQk9aWGgxY3k1amIyNTBaWGgwSUQwZ1ZHOXVaUzVqYjI1MFpYaDBJQzh2SUc5eUlHRnViM1JvWlhJZ1lYVmthVzhnWTI5dWRHVjRkQ0I1YjNVZ2FHRjJaU0JqY21WaGRHVmtYRzRnSUcxbGRHVnlMbU52Ym01bFkzUW9JRlJ2Ym1VdVRXRnpkR1Z5TENBeUlDazdYRzRnSUNvdlhHNWNiaUFnWTI5dWJtVmpkQ2h1YjJSbExHTm9ZVzV1Wld4ektTQjdYRzRnSUNBZ2FXWWdLSFJvYVhNdWMyOTFjbU5sS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbVJwYzJOdmJtNWxZM1FvS1R0Y2JpQWdJQ0I5WEc0Z0lDQWdMeTkwYUdsekxtUjFiVzE1TG1ScGMyTnZibTVsWTNRb2RHaHBjeTV6Y0d4cGRIUmxjaWs3WEc1Y2JpQWdJQ0JwWmlBb1kyaGhibTVsYkhNcElIdGNiaUFnSUNBZ0lIUm9hWE11WTJoaGJtNWxiSE1nUFNCamFHRnVibVZzY3p0Y2JpQWdJQ0I5SUdWc2MyVWdhV1lnS0c1dlpHVXVZMmhoYm01bGJFTnZkVzUwS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbU5vWVc1dVpXeHpJRDBnYm05a1pTNWphR0Z1Ym1Wc1EyOTFiblE3WEc0Z0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lIUm9hWE11WTJoaGJtNWxiSE1nUFNBeU8xeHVJQ0FnSUgxY2JpQWdJQ0IwYUdsekxtMWxkR1Z5VjJsa2RHZ2dQU0IwYUdsekxtTmhiblpoY3k1bGJHVnRaVzUwTG5kcFpIUm9MM1JvYVhNdVkyaGhibTVsYkhNN1hHNWNiaUFnSUNCMGFHbHpMbk52ZFhKalpTQTlJRzV2WkdVN1hHNGdJQ0FnZEdocGN5NXpiM1Z5WTJVdVkyOXVibVZqZENoMGFHbHpMbk53YkdsMGRHVnlLVHRjYmx4dUlDQXZMeUFnZEdocGN5NXlaVzVrWlhJb0tUdGNiaUFnZlZ4dVhHNGdJQzhxS2x4dUlDQlRkRzl3SUhacGMzVmhiR2w2YVc1bklIUm9aU0J6YjNWeVkyVWdibTlrWlNCaGJtUWdaR2x6WTI5dWJtVmpkQ0JwZEM1Y2JpQWdLaTljYmlBZ1pHbHpZMjl1Ym1WamRDZ3BJSHRjYmx4dUlDQWdJSFJvYVhNdWMyOTFjbU5sTG1ScGMyTnZibTVsWTNRb2RHaHBjeTV6Y0d4cGRIUmxjaWs3WEc0Z0lDQWdkR2hwY3k1emIzVnlZMlVnUFNCbVlXeHpaVHRjYmlBZ0x5OGdJSFJvYVhNdVpIVnRiWGt1WTI5dWJtVmpkQ2gwYUdsekxuTndiR2wwZEdWeUtUdGNiaUFnSUNCMGFHbHpMbTFsZEdWeVYybGtkR2dnUFNCMGFHbHpMbU5oYm5aaGN5NWxiR1Z0Wlc1MExuZHBaSFJvTDNSb2FYTXVZMmhoYm01bGJITTdYRzVjYmlBZ2ZWeHVYRzRnSUdOc2FXTnJLQ2tnZTF4dUlDQWdJSFJvYVhNdVlXTjBhWFpsSUQwZ0lYUm9hWE11WVdOMGFYWmxPMXh1SUNBZ0lIUm9hWE11Y21WdVpHVnlLQ2s3WEc0Z0lIMWNibHh1SUNCamRYTjBiMjFFWlhOMGNtOTVLQ2tnZTF4dUlDQWdJSFJvYVhNdVlXTjBhWFpsSUQwZ1ptRnNjMlU3WEc0Z0lIMWNibHh1ZlZ4dVhHNWNibHh1THk4Z1YwVkNVRUZEU3lCR1QwOVVSVklnTHk5Y2JpOHZJQzR2Zmk5cWMyaHBiblF0Ykc5aFpHVnlJUzR2YkdsaUwybHVkR1Z5Wm1GalpYTXZiV1YwWlhJdWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibXhsZENCa2IyMGdQU0J5WlhGMWFYSmxLQ2N1TGk5MWRHbHNMMlJ2YlNjcE8xeHViR1YwSUVsdWRHVnlabUZqWlNBOUlISmxjWFZwY21Vb0p5NHVMMk52Y21VdmFXNTBaWEptWVdObEp5azdYRzVjYmk4cUtseHVLaUJQYzJOcGJHeHZjMk52Y0dWY2JpcGNiaW9nUUdSbGMyTnlhWEIwYVc5dUlGWnBjM1ZoYkdsNlpYTWdZU0IzWVhabFptOXliU2R6SUhOMGNtVmhiU0J2WmlCMllXeDFaWE11WEc0cVhHNHFJRUJrWlcxdklEeHpjR0Z1SUc1bGVIVnpMWFZwUFZ3aWIzTmphV3hzYjNOamIzQmxYQ0krUEM5emNHRnVQbHh1S2x4dUtpQkFaWGhoYlhCc1pWeHVLaUIyWVhJZ2IzTmphV3hzYjNOamIzQmxJRDBnYm1WM0lFNWxlSFZ6TGs5elkybHNiRzl6WTI5d1pTZ25JM1JoY21kbGRDY3BYRzRxWEc0cUlFQmxlR0Z0Y0d4bFhHNHFJSFpoY2lCdmMyTnBiR3h2YzJOdmNHVWdQU0J1WlhjZ1RtVjRkWE11VDNOamFXeHNiM05qYjNCbEtDY2pkR0Z5WjJWMEp5eDdYRzRxSUNBZ0ozTnBlbVVuT2lCYk16QXdMREUxTUYxY2Jpb2dmU2xjYmlwY2Jpb2dRRzkxZEhCMWRGeHVLaUFtYm1KemNEdGNiaW9nVG04Z1pYWmxiblJ6WEc0cVhHNHFMMXh1WEc1cGJYQnZjblFnZXlCamIyNTBaWGgwSUgwZ1puSnZiU0FuTGk0dmJXRnBiaWM3WEc1Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUdOc1lYTnpJRTl6WTJsc2JHOXpZMjl3WlNCbGVIUmxibVJ6SUVsdWRHVnlabUZqWlNCN1hHNWNiaUFnWTI5dWMzUnlkV04wYjNJb0tTQjdYRzVjYmlBZ0lDQnNaWFFnYjNCMGFXOXVjeUE5SUZzbmMyTmhiR1VuTENkMllXeDFaU2RkTzF4dVhHNGdJQ0FnYkdWMElHUmxabUYxYkhSeklEMGdlMXh1SUNBZ0lDQWdKM05wZW1Vbk9pQmJNekF3TERFMU1GMWNiaUFnSUNCOU8xeHVYRzRnSUNBZ2MzVndaWElvWVhKbmRXMWxiblJ6TEc5d2RHbHZibk1zWkdWbVlYVnNkSE1wTzF4dVhHNGdJQ0FnZEdocGN5NWpiMjUwWlhoMElEMGdZMjl1ZEdWNGRDZ3BPeUF2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2JseHVJQ0FnSUhSb2FYTXVZVzVoYkhselpYSWdQU0IwYUdsekxtTnZiblJsZUhRdVkzSmxZWFJsUVc1aGJIbHpaWElvS1R0Y2JpQWdJQ0IwYUdsekxtRnVZV3g1YzJWeUxtWm1kRk5wZW1VZ1BTQXlNRFE0TzF4dUlDQWdJSFJvYVhNdVluVm1abVZ5VEdWdVozUm9JRDBnZEdocGN5NWhibUZzZVhObGNpNW1jbVZ4ZFdWdVkzbENhVzVEYjNWdWREdGNiaUFnSUNCMGFHbHpMbVJoZEdGQmNuSmhlU0E5SUc1bGR5QlZhVzUwT0VGeWNtRjVLSFJvYVhNdVluVm1abVZ5VEdWdVozUm9LVHRjYmlBZ0lDQjBhR2x6TG1GdVlXeDVjMlZ5TG1kbGRFSjVkR1ZVYVcxbFJHOXRZV2x1UkdGMFlTaDBhR2x6TG1SaGRHRkJjbkpoZVNrN1hHNWNiaUFnSUNCMGFHbHpMbUZqZEdsMlpTQTlJSFJ5ZFdVN1hHNWNiaUFnSUNCMGFHbHpMbk52ZFhKalpTQTlJR1poYkhObE8xeHVYRzRnSUNBZ2RHaHBjeTVwYm1sMEtDazdYRzVjYmlBZ0lDQjBhR2x6TG5KbGJtUmxjaWdwTzF4dUlDQjlYRzVjYmlBZ1luVnBiR1JHY21GdFpTZ3BJSHRjYmlBZ0lDQjBhR2x6TG1OaGJuWmhjeUE5SUc1bGR5QmtiMjB1VTIxaGNuUkRZVzUyWVhNb2RHaHBjeTV3WVhKbGJuUXBPMXh1SUNBZ0lIUm9hWE11Wld4bGJXVnVkQ0E5SUhSb2FYTXVZMkZ1ZG1GekxtVnNaVzFsYm5RN1hHNGdJSDFjYmx4dUlDQnphWHBsU1c1MFpYSm1ZV05sS0NrZ2UxeHVJQ0FnSUhSb2FYTXVZMkZ1ZG1GekxuSmxjMmw2WlNoMGFHbHpMbmRwWkhSb0xIUm9hWE11YUdWcFoyaDBLVHRjYmlBZ2ZWeHVYRzRnSUdOdmJHOXlTVzUwWlhKbVlXTmxLQ2tnZTF4dUlDQWdJSFJvYVhNdVkyRnVkbUZ6TG1Wc1pXMWxiblF1YzNSNWJHVXVZbUZqYTJkeWIzVnVaRU52Ykc5eUlEMGdkR2hwY3k1amIyeHZjbk11Wm1sc2JEdGNiaUFnZlZ4dVhHNGdJSEpsYm1SbGNpZ3BJSHRjYmx4dUlDQWdJR2xtSUNoMGFHbHpMbUZqZEdsMlpTa2dlMXh1SUNBZ0lDQWdjbVZ4ZFdWemRFRnVhVzFoZEdsdmJrWnlZVzFsS0hSb2FYTXVjbVZ1WkdWeUxtSnBibVFvZEdocGN5a3BPMXh1SUNBZ0lIMWNibHh1SUNBZ0lIUm9hWE11WVc1aGJIbHpaWEl1WjJWMFFubDBaVlJwYldWRWIyMWhhVzVFWVhSaEtIUm9hWE11WkdGMFlVRnljbUY1S1R0Y2JseHVJQ0FnSUhSb2FYTXVZMkZ1ZG1GekxtTnZiblJsZUhRdVptbHNiRk4wZVd4bElEMGdkR2hwY3k1amIyeHZjbk11Wm1sc2JEdGNiaUFnSUNCMGFHbHpMbU5oYm5aaGN5NWpiMjUwWlhoMExtWnBiR3hTWldOMEtEQXNJREFzSUhSb2FYTXVZMkZ1ZG1GekxtVnNaVzFsYm5RdWQybGtkR2dzSUhSb2FYTXVZMkZ1ZG1GekxtVnNaVzFsYm5RdWFHVnBaMmgwS1R0Y2JseHVJQ0FnSUhSb2FYTXVZMkZ1ZG1GekxtTnZiblJsZUhRdWJHbHVaVmRwWkhSb0lEMGdmbjRvZEdocGN5NW9aV2xuYUhRZ0x5QXhNREFnS3lBeUtUdGNiaUFnSUNCMGFHbHpMbU5oYm5aaGN5NWpiMjUwWlhoMExuTjBjbTlyWlZOMGVXeGxJRDBnZEdocGN5NWpiMnh2Y25NdVlXTmpaVzUwTzF4dVhHNGdJQ0FnZEdocGN5NWpZVzUyWVhNdVkyOXVkR1Y0ZEM1aVpXZHBibEJoZEdnb0tUdGNibHh1SUNBZ0lHbG1JQ2gwYUdsekxuTnZkWEpqWlNrZ2UxeHVYRzRnSUNBZ0lDQjJZWElnYzJ4cFkyVlhhV1IwYUNBOUlIUm9hWE11WTJGdWRtRnpMbVZzWlcxbGJuUXVkMmxrZEdnZ0tpQXhMakFnTHlCMGFHbHpMbUoxWm1abGNreGxibWQwYUR0Y2JpQWdJQ0FnSUhaaGNpQjRJRDBnTUR0Y2JseHVJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BDQjBhR2x6TG1KMVptWmxja3hsYm1kMGFEc2dhU3NyS1NCN1hHNWNiaUFnSUNBZ0lDQWdkbUZ5SUhZZ1BTQjBhR2x6TG1SaGRHRkJjbkpoZVZ0cFhTQXZJREV5T0M0d08xeHVJQ0FnSUNBZ0lDQjJZWElnZVNBOUlIWWdLaUIwYUdsekxtTmhiblpoY3k1bGJHVnRaVzUwTG1obGFXZG9kQ0F2SURJN1hHNWNiaUFnSUNBZ0lDQWdhV1lnS0drZ1BUMDlJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG1OaGJuWmhjeTVqYjI1MFpYaDBMbTF2ZG1WVWJ5aDRMQ0I1S1R0Y2JpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG1OaGJuWmhjeTVqYjI1MFpYaDBMbXhwYm1WVWJ5aDRMQ0I1S1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVYRzRnSUNBZ0lDQWdJSGdnS3owZ2MyeHBZMlZYYVdSMGFEdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQ0FnSUNCMGFHbHpMbU5oYm5aaGN5NWpiMjUwWlhoMExtMXZkbVZVYnlnd0xDQjBhR2x6TG1OaGJuWmhjeTVsYkdWdFpXNTBMbWhsYVdkb2RDOHlLVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NWpZVzUyWVhNdVkyOXVkR1Y0ZEM1c2FXNWxWRzhvZEdocGN5NWpZVzUyWVhNdVpXeGxiV1Z1ZEM1M2FXUjBhQ3dnZEdocGN5NWpZVzUyWVhNdVpXeGxiV1Z1ZEM1b1pXbG5hSFF2TWlrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnZEdocGN5NWpZVzUyWVhNdVkyOXVkR1Y0ZEM1emRISnZhMlVvS1R0Y2JpQWdmVnh1WEc0Z0lDOHFLbHh1SUNCRmNYVnBkbUZzWlc1MElIUnZJRndpY0dGMFkyaHBibWNnYVc1Y0lpQmhiaUJoZFdScGJ5QnViMlJsSUhSdklIWnBjM1ZoYkdsNlpTNGdUazlVUlRvZ1dXOTFJR05oYm01dmRDQmpiMjV1WldOMElHRjFaR2x2SUc1dlpHVnpJR0ZqY205emN5QjBkMjhnWkdsbVptVnlaVzUwSUdGMVpHbHZJR052Ym5SbGVIUnpMaUJPWlhoMWMxVkpJSEoxYm5NZ2FYUnpJR0YxWkdsdklHRnVZV3g1YzJseklHOXVJR2wwY3lCdmQyNGdZWFZrYVc4Z1kyOXVkR1Y0ZEN3Z1RtVjRkWE11WTI5dWRHVjRkQzRnU1dZZ2RHaGxJR0YxWkdsdklHNXZaR1VnZVc5MUlHRnlaU0IyYVhOMVlXeHBlbWx1WnlCcGN5QmpjbVZoZEdWa0lHOXVJR0VnWkdsbVptVnlaVzUwSUdGMVpHbHZJR052Ym5SbGVIUXNJSGx2ZFNCM2FXeHNJRzVsWldRZ2RHOGdkR1ZzYkNCT1pYaDFjMVZKSUhSdklIVnpaU0IwYUdGMElHTnZiblJsZUhRZ2FXNXpkR1ZoWkRvZ2FTNWxMaUJPWlhoMWN5NWpiMjUwWlhoMElEMGdXVzkxY2tGMVpHbHZRMjl1ZEdWNGRFNWhiV1V1SUVadmNpQmxlR0Z0Y0d4bExDQnBiaUJVYjI1bFNsTWdjSEp2YW1WamRITXNJSFJvWlNCc2FXNWxJSGR2ZFd4a0lHSmxPaUJPWlhoMWN5NWpiMjUwWlhoMElEMGdWRzl1WlM1amIyNTBaWGgwSUM0Z1YyVWdjbVZqYjIxdFpXNWtJSFJvWVhRZ2VXOTFJSGR5YVhSbElIUm9ZWFFnYkdsdVpTQnZaaUJqYjJSbElHOXViSGtnYjI1alpTQmhkQ0IwYUdVZ1ltVm5hVzV1YVc1bklHOW1JSGx2ZFhJZ2NISnZhbVZqZEM1Y2JpQWdRSEJoY21GdElHNXZaR1VnZTBGMVpHbHZUbTlrWlgwZ1ZHaGxJR0YxWkdsdklHNXZaR1VnZEc4Z2RtbHpkV0ZzYVhwbFhHNGdJRUJsZUdGdGNHeGxJRTVsZUhWekxtTnZiblJsZUhRZ1BTQlViMjVsTG1OdmJuUmxlSFFnTHk4Z2IzSWdZVzV2ZEdobGNpQmhkV1JwYnlCamIyNTBaWGgwSUhsdmRTQm9ZWFpsSUdOeVpXRjBaV1JjYmlBZ2IzTmphV3hzYjNOamIzQmxMbU52Ym01bFkzUW9JRlJ2Ym1VdVRXRnpkR1Z5SUNrN1hHNGdJQ292WEc1Y2JpQWdZMjl1Ym1WamRDaHViMlJsS1NCN1hHNWNiaUFnSUNCcFppQW9kR2hwY3k1emIzVnlZMlVwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVaR2x6WTI5dWJtVmpkQ2dwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSFJvYVhNdWMyOTFjbU5sSUQwZ2JtOWtaVHRjYmlBZ0lDQjBhR2x6TG5OdmRYSmpaUzVqYjI1dVpXTjBLSFJvYVhNdVlXNWhiSGx6WlhJcE8xeHVYRzRnSUNBZ2RHaHBjeTV5Wlc1a1pYSW9LVHRjYmlBZ2ZWeHVYRzRnSUM4cUtseHVJQ0JUZEc5d0lIWnBjM1ZoYkdsNmFXNW5JSFJvWlNCemIzVnlZMlVnYm05a1pTQmhibVFnWkdselkyOXVibVZqZENCcGRDNWNiaUFnS2k5Y2JpQWdaR2x6WTI5dWJtVmpkQ2dwSUh0Y2JpQWdJQ0JwWmlBb2RHaHBjeTV6YjNWeVkyVXBJSHRjYmlBZ0lDQWdJSFJvYVhNdWMyOTFjbU5sTG1ScGMyTnZibTVsWTNRb2RHaHBjeTVoYm1Gc2VYTmxjaWs3WEc0Z0lDQWdJQ0IwYUdsekxuTnZkWEpqWlNBOUlHNTFiR3c3WEc0Z0lDQWdmVnh1WEc0Z0lIMWNibHh1SUNCamJHbGpheWdwSUh0Y2JpQWdJQ0IwYUdsekxtRmpkR2wyWlNBOUlDRjBhR2x6TG1GamRHbDJaVHRjYmlBZ0lDQjBhR2x6TG5KbGJtUmxjaWdwTzF4dUlDQjlYRzVjYmlBZ1kzVnpkRzl0UkdWemRISnZlU2dwSUh0Y2JpQWdJQ0IwYUdsekxtRmpkR2wyWlNBOUlHWmhiSE5sTzF4dUlDQjlYRzVjYm4xY2JseHVYRzVjYmk4dklGZEZRbEJCUTBzZ1JrOVBWRVZTSUM4dlhHNHZMeUF1TDM0dmFuTm9hVzUwTFd4dllXUmxjaUV1TDJ4cFlpOXBiblJsY21aaFkyVnpMMjl6WTJsc2JHOXpZMjl3WlM1cWN5SXNJaThxWEc1TllXbHVJR052Ym1ObGNIUTZYRzV6ZVc1MGFDQTlJRzVsZHlCT1pYaDFjeTVTWVdOcktDZGxiR1Z0Wlc1MFNVUW5LVHRjYmx4dVZISmhibk5tYjNKdElHRnNiQ0JsYkdWdFpXNTBjeUJwYm5OcFpHVWdkR2hsSUdScGRseHVjM2x1ZEdndVpXeGxiV1Z1ZEVsRUlIZHBiR3dnYUc5c1pDQjBhR1VnWm1seWMzUWdjMnhwWkdWeUlHbHVkR1Z5Wm1GalpWeHVYRzR5S1NCSmJpQm1kWFIxY21Vc0lIQnZkR1Z1ZEdsaGJHeDVJSGR5YVhScGJtY2dZU0J5WVdOcklIUm9ZWFFnYVhNZ2NtVXRkWE5oWW14bFAxeHVRMjkxYkdRZ1lXeHpieUIwWVd0bElFcFRUMDVjYmx4dWJtVjNJRTVsZUhWekxsSmhZMnNvSnlOMFlYSm5aWFFuTEh0Y2JpQWdjSEpsT2lBb0tTQTlQaUI3WEc0Z0lDQWdZM0psWVhSbElITnZiV1VnWkdsMmN5Qm9aWEpsTENCdmNpQnpiMjFsSUdGMVpHbHZJR052WkdWY2JpQWdmU3hjYmlBZ2FXNTBaWEptWVdObE9pQjdYRzRnSUNBZ2MyeHBaR1Z5TVRvZ1RtVjRkWE11WVdSa0xuTnNhV1JsY2loN1hHNGdJQ0FnSUNCMGIzQTZNVEFzWEc0Z0lDQWdJQ0JzWldaME9qRXdMRnh1SUNBZ0lDQWdkMmxrZEdnNk5UQXNYRzRnSUNBZ0lDQm9aV2xuYUhRNk1UQXdMRnh1SUNBZ0lDQWdiV2x1T2lBd0xGeHVJQ0FnSUNBZ2JXRjRPaUF4TURBc1hHNGdJQ0FnSUNCemRHVndPaUF4WEc0Z0lDQWdmU2tzWEc0Z0lDQWdkMkYyWlRFNklFNWxlSFZ6TG1Ga1pDNTNZWFpsWm05eWJTaDdYRzRnSUNBZ0lDQm1hV3hsT2lBbkxpOXdZWFJvTDNSdkwyWnBiR1V1YlhBekp5eGNiaUFnSUNBZ0lIZHBaSFJvT2pVd01DeGNiaUFnSUNBZ0lHaGxhV2RvZERveE1EQXNYRzRnSUNBZ0lDQnRiMlJsT2lBbmNtRnVaMlVuWEc0Z0lDQWdmU2xjYmlBZ2ZTeGNiaUFnYVc1cGREb2dLQ2tnUFQ0Z2UxeHVJQ0FnSUM4dklITnZiV1VnWVhWa2FXOGdhVzVwZENCamIyUmxJR2R2WlhNZ2FHVnlaUzR1TGx4dUlDQjlYRzU5S1R0Y2JseHVLaTljYmx4dWFXMXdiM0owSUNvZ1lYTWdkSEpoYm5ObWIzSnRJR1p5YjIwZ0p5NHVMM1YwYVd3dmRISmhibk5tYjNKdEp6dGNibWx0Y0c5eWRDQmtiMjBnWm5KdmJTQW5MaTR2ZFhScGJDOWtiMjBuTzF4dVhHNXBiWEJ2Y25RZ2V5QmpiMnh2Y25NZ2ZTQm1jbTl0SUNjdUxpOXRZV2x1Snp0Y2JseHVaWGh3YjNKMElHUmxabUYxYkhRZ1kyeGhjM01nVW1GamF5QjdYRzVjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9kR0Z5WjJWMExDQnpaWFIwYVc1bmN5a2dlMXh1WEc0Z0lDQWdkR2hwY3k1dFpYUmhJRDBnZTMwN1hHNGdJQ0FnZEdocGN5NXRaWFJoTG5SaGNtZGxkQ0E5SUhSaGNtZGxkRHRjYmlBZ0lDQjBhR2x6TG0xbGRHRXVjR0Z5Wlc1MElEMGdaRzl0TG5CaGNuTmxSV3hsYldWdWRDaDBZWEpuWlhRcE95QXZMeUJ6YUc5MWJHUWdZbVVnWVNCblpXNWxjbWxqSUdaMWJtTjBhVzl1SUdadmNpQndZWEp6YVc1bklHRWdKM1JoY21kbGRDY2dZWEpuZFcxbGJuUWdkR2hoZENCamFHVmphM01nWm05eUlITjBjbWx1Wnk5RVQwMHZhbEZWUlZKWlhHNGdJQ0FnZEdocGN5NXRaWFJoTG1OdmJHOXljeUE5SUh0OU8xeHVYRzRnSUNBZ2FXWWdLSE5sZEhScGJtZHpLU0I3WEc0Z0lDQWdJQ0IwYUdsekxtMWxkR0V1WVhSMGNtbGlkWFJsSUQwZ2MyVjBkR2x1WjNNdVlYUjBjbWxpZFhSbElIeDhJQ2R1WlhoMWN5MTFhU2M3WEc0Z0lDQWdJQ0IwYUdsekxtMWxkR0V1ZEdsMGJHVWdQU0J6WlhSMGFXNW5jeTV1WVcxbElIeDhJR1poYkhObE8xeHVJQ0FnSUNBZ2RHaHBjeTV0WlhSaExtOXdaVzRnUFNCelpYUjBhVzVuY3k1dmNHVnVJSHg4SUdaaGJITmxPMXh1SUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNCMGFHbHpMbTFsZEdFdVlYUjBjbWxpZFhSbElEMGdKMjVsZUhWekxYVnBKenRjYmlBZ0lDQWdJSFJvYVhNdWJXVjBZUzUwYVhSc1pTQTlJR1poYkhObE8xeHVJQ0FnSUNBZ2RHaHBjeTV0WlhSaExtOXdaVzRnUFNCbVlXeHpaVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQnNaWFFnWkdWbVlYVnNkRU52Ykc5eWN5QTlJR052Ykc5eWN5Z3BPeUF2THlCcWMyaHBiblFnYVdkdWIzSmxPbXhwYm1WY2JpQWdJQ0IwYUdsekxtMWxkR0V1WTI5c2IzSnpMbUZqWTJWdWRDQTlJR1JsWm1GMWJIUkRiMnh2Y25NdVlXTmpaVzUwTzF4dUlDQWdJSFJvYVhNdWJXVjBZUzVqYjJ4dmNuTXVabWxzYkNBOUlHUmxabUYxYkhSRGIyeHZjbk11Wm1sc2JEdGNiaUFnSUNCMGFHbHpMbTFsZEdFdVkyOXNiM0p6TG14cFoyaDBJRDBnWkdWbVlYVnNkRU52Ykc5eWN5NXNhV2RvZER0Y2JpQWdJQ0IwYUdsekxtMWxkR0V1WTI5c2IzSnpMbVJoY21zZ1BTQmtaV1poZFd4MFEyOXNiM0p6TG1SaGNtczdYRzRnSUNBZ2RHaHBjeTV0WlhSaExtTnZiRzl5Y3k1dFpXUnBkVzFNYVdkb2RDQTlJR1JsWm1GMWJIUkRiMnh2Y25NdWJXVmthWFZ0VEdsbmFIUTdYRzRnSUNBZ2RHaHBjeTV0WlhSaExtTnZiRzl5Y3k1dFpXUnBkVzFFWVhKcklEMGdaR1ZtWVhWc2RFTnZiRzl5Y3k1dFpXUnBkVzFFWVhKck8xeHVJQ0FnSUhSb2FYTXVZblZwYkdSSmJuUmxjbVpoWTJVb0tUdGNiaUFnSUNCMGFHbHpMbU52Ykc5eVNXNTBaWEptWVdObEtDazdYRzRnSUgxY2JseHVJQ0JpZFdsc1pFbHVkR1Z5Wm1GalpTZ3BJSHRjYmlBZ0lDQjBhR2x6TG0xbGRHRXVjR0Z5Wlc1MExuTjBlV3hsTG1KdmVGTnBlbWx1WnlBOUlDZGliM0prWlhJdFltOTRKenRjYmlBZ0lDQjBhR2x6TG0xbGRHRXVjR0Z5Wlc1MExuTjBlV3hsTG5WelpYSlRaV3hsWTNRZ1BTQW5ibTl1WlNjN1hHNGdJQ0FnZEdocGN5NXRaWFJoTG5CaGNtVnVkQzV6ZEhsc1pTNXRiM3BWYzJWeVUyVnNaV04wSUQwZ0oyNXZibVVuTzF4dUlDQWdJSFJvYVhNdWJXVjBZUzV3WVhKbGJuUXVjM1I1YkdVdWQyVmlhMmwwVlhObGNsTmxiR1ZqZENBOUlDZHViMjVsSnp0Y2JseHVJQ0FnSUhSb2FYTXViV1YwWVM1amIyNTBaVzUwY3lBOUlHUnZZM1Z0Wlc1MExtTnlaV0YwWlVWc1pXMWxiblFvSjJScGRpY3BPMXh1WEc0Z0lDQWdkMmhwYkdVZ0tIUm9hWE11YldWMFlTNXdZWEpsYm5RdVkyaHBiR1JPYjJSbGN5NXNaVzVuZEdnZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXViV1YwWVM1amIyNTBaVzUwY3k1aGNIQmxibVJEYUdsc1pDaDBhR2x6TG0xbGRHRXVjR0Z5Wlc1MExtTm9hV3hrVG05a1pYTmJNRjBwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSFJvYVhNdWJXVjBZUzVqYjI1MFpXNTBjeTV6ZEhsc1pTNXdZV1JrYVc1bklEMGdKekJ3ZUNjN1hHNGdJQ0FnZEdocGN5NXRaWFJoTG1OdmJuUmxiblJ6TG5OMGVXeGxMbUp2ZUZOcGVtbHVaeUE5SUNkaWIzSmtaWEl0WW05NEp6dGNibHh1SUNBZ0lHbG1JQ2gwYUdsekxtMWxkR0V1ZEdsMGJHVXBJSHRjYmlBZ0lDQWdJSFJvYVhNdWJXVjBZUzUwYVhSc1pVSmhjaUE5SUdSdlkzVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUW9KMlJwZGljcE8xeHVJQ0FnSUNBZ2RHaHBjeTV0WlhSaExuUnBkR3hsUW1GeUxtbHVibVZ5U0ZSTlRDQTlJSFJvYVhNdWJXVjBZUzUwYVhSc1pUdGNiaUFnSUNBZ0lIUm9hWE11YldWMFlTNTBhWFJzWlVKaGNpNXpkSGxzWlM1bWIyNTBSbUZ0YVd4NUlEMGdKMkZ5YVdGc0p6dGNiaUFnSUNBZ0lIUm9hWE11YldWMFlTNTBhWFJzWlVKaGNpNXpkSGxzWlM1d2IzTnBkR2x2YmlBOUlDZHlaV3hoZEdsMlpTYzdYRzRnSUNBZ0lDQjBhR2x6TG0xbGRHRXVkR2wwYkdWQ1lYSXVjM1I1YkdVdVkyOXNiM0lnUFNBbkl6ZzRPQ2M3WEc0Z0lDQWdJQ0IwYUdsekxtMWxkR0V1ZEdsMGJHVkNZWEl1YzNSNWJHVXVjR0ZrWkdsdVp5QTlJQ2MzY0hnbk8xeHVJQ0FnSUNBZ2RHaHBjeTV0WlhSaExuUnBkR3hsUW1GeUxuTjBlV3hsTG1admJuUlRhWHBsSUQwZ0p6RXljSGduTzF4dVhHNGdJQ0FnSUNCMGFHbHpMbTFsZEdFdVluVjBkRzl1SUQwZ1pHOWpkVzFsYm5RdVkzSmxZWFJsUld4bGJXVnVkQ2duWkdsMkp5azdYRzRnSUNBZ0lDQjBhR2x6TG0xbGRHRXVZblYwZEc5dUxuTjBlV3hsTG5CdmMybDBhVzl1SUQwZ0oyRmljMjlzZFhSbEp6dGNiaUFnSUNBZ0lIUm9hWE11YldWMFlTNWlkWFIwYjI0dWMzUjViR1V1ZEc5d0lEMGdKelZ3ZUNjZ08xeHVJQ0FnSUNBZ2RHaHBjeTV0WlhSaExtSjFkSFJ2Ymk1emRIbHNaUzV5YVdkb2RDQTlJQ2MxY0hnbklEdGNiaUFnSUNBZ0lIUm9hWE11YldWMFlTNWlkWFIwYjI0dWFXNXVaWEpJVkUxTUlEMGdKeTBuTzF4dUlDQWdJQ0FnZEdocGN5NXRaWFJoTG1KMWRIUnZiaTV6ZEhsc1pTNXdZV1JrYVc1bklEMGdKekJ3ZUNBMWNIZ2dNbkI0Snp0Y2JpQWdJQ0FnSUhSb2FYTXViV1YwWVM1aWRYUjBiMjR1YzNSNWJHVXViR2x1WlVobGFXZG9kQ0E5SUNjeE1uQjRKenRjYmlBZ0lDQWdJSFJvYVhNdWJXVjBZUzVpZFhSMGIyNHVjM1I1YkdVdVptOXVkRk5wZW1VZ1BTQW5NVFZ3ZUNjN1hHNWNiaUFnSUNBZ0lIUm9hWE11YldWMFlTNWlkWFIwYjI0dWMzUjViR1V1WTNWeWMyOXlJRDBnSjNCdmFXNTBaWEluTzF4dVhHNGdJQ0FnSUNCMGFHbHpMbTFsZEdFdVluVjBkRzl1TG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjIxdmRYTmxiM1psY2ljc0lDZ3BJRDArSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV0WlhSaExtSjFkSFJ2Ymk1emRIbHNaUzVpWVdOclozSnZkVzVrUTI5c2IzSWdQU0IwYUdsekxtMWxkR0V1WTI5c2IzSnpMbTFsWkdsMWJVUmhjbXM3WEc0Z0lDQWdJQ0I5S1R0Y2JpQWdJQ0FnSUhSb2FYTXViV1YwWVM1aWRYUjBiMjR1WVdSa1JYWmxiblJNYVhOMFpXNWxjaWduYlc5MWMyVnNaV0YyWlNjc0lDZ3BJRDArSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV0WlhSaExtSjFkSFJ2Ymk1emRIbHNaUzVpWVdOclozSnZkVzVrUTI5c2IzSWdQU0IwYUdsekxtMWxkR0V1WTI5c2IzSnpMbTFsWkdsMWJVeHBaMmgwTzF4dUlDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNCMGFHbHpMbTFsZEdFdVluVjBkRzl1TG1Ga1pFVjJaVzUwVEdsemRHVnVaWElvSjJOc2FXTnJKeXdnS0NrZ1BUNGdlMXh1SUNBZ0lDQWdJQ0JwWmlBb2RHaHBjeTV0WlhSaExtOXdaVzRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQjBhR2x6TG1ocFpHVW9LVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNCMGFHbHpMbk5vYjNjb0tUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmU2s3WEc1Y2JseHVJQ0FnSUNBZ2RHaHBjeTV0WlhSaExuUnBkR3hsUW1GeUxtRndjR1Z1WkVOb2FXeGtLSFJvYVhNdWJXVjBZUzVpZFhSMGIyNHBPMXh1WEc0Z0lDQWdJQ0IwYUdsekxtMWxkR0V1Y0dGeVpXNTBMbUZ3Y0dWdVpFTm9hV3hrS0hSb2FYTXViV1YwWVM1MGFYUnNaVUpoY2lrN1hHNGdJQ0FnZlZ4dUlDQWdJSFJvYVhNdWJXVjBZUzV3WVhKbGJuUXVZWEJ3Wlc1a1EyaHBiR1FvZEdocGN5NXRaWFJoTG1OdmJuUmxiblJ6S1R0Y2JseHVJQ0F2THlBZ2RtRnlJSGRwWkhSb0lEMGdkR2hwY3k1dFpYUmhMbkJoY21WdWRDNXpkSGxzWlM1M2FXUjBhQ0E5SUdkbGRFTnZiWEIxZEdWa1UzUjViR1VvZEdocGN5NXRaWFJoTG5CaGNtVnVkQ2t1WjJWMFVISnZjR1Z5ZEhsV1lXeDFaU2duZDJsa2RHZ25LVHRjYmk4dklDQWdJSFJvYVhNdWJXVjBZUzV3WVhKbGJuUXVjM1I1YkdVdWQybGtkR2dnUFNCM2FXUjBhRHRjYmx4dUlDQWdJR3hsZENCMWFTQTlJSFJ5WVc1elptOXliUzV6WldOMGFXOXVLSFJvYVhNdWJXVjBZUzUwWVhKblpYUXNJSFJvYVhNdWJXVjBZUzVoZEhSeWFXSjFkR1VwTzF4dUlDQWdJR1p2Y2lBb2RtRnlJR3RsZVNCcGJpQjFhU2tnZTF4dUlDQWdJQ0FnZEdocGMxdHJaWGxkSUQwZ2RXbGJhMlY1WFR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCamIyeHZja2x1ZEdWeVptRmpaU2dwSUh0Y2JpQWdJQ0JwWmlBb2RHaHBjeTV0WlhSaExuUnBkR3hsS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbTFsZEdFdVluVjBkRzl1TG5OMGVXeGxMbUpoWTJ0bmNtOTFibVJEYjJ4dmNpQTlJSFJvYVhNdWJXVjBZUzVqYjJ4dmNuTXViV1ZrYVhWdFRHbG5hSFE3WEc0Z0lDQWdJQ0IwYUdsekxtMWxkR0V1WW5WMGRHOXVMbk4wZVd4bExtSnZjbVJsY2lBOUlDZHpiMnhwWkNBd2NIZ2dKeXQwYUdsekxtMWxkR0V1WTI5c2IzSnpMbVpwYkd3N1hHNGdJQ0FnSUNCMGFHbHpMbTFsZEdFdWNHRnlaVzUwTG5OMGVXeGxMbUp2Y21SbGNpQTlJQ2R6YjJ4cFpDQXhjSGdnSnl0MGFHbHpMbTFsZEdFdVkyOXNiM0p6TG0xbFpHbDFiVXhwWjJoME8xeHVJQ0FnSUNBZ2RHaHBjeTV0WlhSaExuQmhjbVZ1ZEM1emRIbHNaUzVpWVdOclozSnZkVzVrUTI5c2IzSWdQU0IwYUdsekxtMWxkR0V1WTI5c2IzSnpMbXhwWjJoME8xeHVJQ0FnSUNBZ2RHaHBjeTV0WlhSaExuUnBkR3hsUW1GeUxuTjBlV3hsTG1KaFkydG5jbTkxYm1SRGIyeHZjaUE5SUhSb2FYTXViV1YwWVM1amIyeHZjbk11Wm1sc2JEdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQnphRzkzS0NrZ2UxeHVJQ0FnSUhSb2FYTXViV1YwWVM1amIyNTBaVzUwY3k1emRIbHNaUzVrYVhOd2JHRjVJRDBnSjJKc2IyTnJKenRjYmlBZ0lDQjBhR2x6TG0xbGRHRXViM0JsYmlBOUlIUnlkV1U3WEc0Z0lIMWNibHh1SUNCb2FXUmxLQ2tnZTF4dUlDQWdJSFJvYVhNdWJXVjBZUzVqYjI1MFpXNTBjeTV6ZEhsc1pTNWthWE53YkdGNUlEMGdKMjV2Ym1Vbk8xeHVJQ0FnSUhSb2FYTXViV1YwWVM1dmNHVnVJRDBnWm1Gc2MyVTdYRzRnSUgxY2JseHVJQ0JqYjJ4dmNtbDZaU2gwZVhCbExHTnZiRzl5S1NCN1hHNGdJQ0FnWm05eUlDaDJZWElnYTJWNUlHbHVJSFJvYVhNcElIdGNiaUFnSUNBZ0lHbG1JQ2gwYUdselcydGxlVjB1WTI5c2IzSnBlbVVwSUh0Y2JpQWdJQ0FnSUNBZ2RHaHBjMXRyWlhsZExtTnZiRzl5YVhwbEtIUjVjR1VzWTI5c2IzSXBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnSUNCMGFHbHpMbTFsZEdFdVkyOXNiM0p6VzNSNWNHVmRJRDBnWTI5c2IzSTdYRzRnSUNBZ2RHaHBjeTVqYjJ4dmNrbHVkR1Z5Wm1GalpTZ3BPMXh1SUNCOVhHNWNiaUFnWlcxd2RIa29LU0I3WEc0Z0lDQWdabTl5SUNoMllYSWdhMlY1SUdsdUlIUm9hWE1wSUh0Y2JpQWdJQ0FnSUdsbUlDaDBhR2x6VzJ0bGVWMHVaR1Z6ZEhKdmVTa2dlMXh1SUNBZ0lDQWdJQ0IwYUdselcydGxlVjB1WkdWemRISnZlU2dwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVYRzU5WEc1Y2JseHVYRzR2THlCWFJVSlFRVU5MSUVaUFQxUkZVaUF2TDF4dUx5OGdMaTkrTDJwemFHbHVkQzFzYjJGa1pYSWhMaTlzYVdJdlkyOXlaUzl5WVdOckxtcHpJaXdpSjNWelpTQnpkSEpwWTNRbk8xeHVYRzVwYlhCdmNuUWdaRzl0SUdaeWIyMGdKeTR1TDNWMGFXd3ZaRzl0Snp0Y2JtbHRjRzl5ZENCSmJuUmxjbVpoWTJWeklHWnliMjBnSnk0dUwybHVkR1Z5Wm1GalpYTXZKenRjYmx4dWJHVjBJR055WldGMFpVbHVkR1Z5Wm1GalpVbEVJRDBnS0hkcFpHZGxkQ3hwYm5SbGNtWmhZMlZKUkhNcElEMCtJSHRjYmlBZ2JHVjBJSFI1Y0dVZ1BTQjNhV1JuWlhRdWRIbHdaVHRjYmlBZ2FXWWdLR2x1ZEdWeVptRmpaVWxFYzF0MGVYQmxYU2tnZTF4dUlDQWdJR2x1ZEdWeVptRmpaVWxFYzF0MGVYQmxYU3NyTzF4dUlDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUdsdWRHVnlabUZqWlVsRWMxdDBlWEJsWFNBOUlERTdYRzRnSUgxY2JpQWdjbVYwZFhKdUlDZ2dkSGx3WlNBcklHbHVkR1Z5Wm1GalpVbEVjMXQwZVhCbFhTQXBPMXh1ZlR0Y2JseHViR1YwSUdWc1pXMWxiblFnUFNBb1pXeGxiV1Z1ZEN4MGVYQmxMRzl3ZEdsdmJuTXBJRDArSUh0Y2JpQWdiM0IwYVc5dWN5QTlJRzl3ZEdsdmJuTWdmSHdnZTMwN1hHNGdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnWld4bGJXVnVkQzVoZEhSeWFXSjFkR1Z6TG14bGJtZDBhRHNnYVNzcktYdGNiaUFnSUNCc1pYUWdZWFIwSUQwZ1pXeGxiV1Z1ZEM1aGRIUnlhV0oxZEdWelcybGRPMXh1SUNBdkx5QWdkSEo1SUh0Y2JpQWdMeThnSUNBZ2IzQjBhVzl1YzF0aGRIUXVibTlrWlU1aGJXVmRJRDBnWlhaaGJDaGhkSFF1Ym05a1pWWmhiSFZsS1R0Y2JpQWdMeThnSUgwZ1kyRjBZMmdvWlNrZ2UxeHVJQ0FnSUNBZ2IzQjBhVzl1YzF0aGRIUXVibTlrWlU1aGJXVmRJRDBnWVhSMExtNXZaR1ZXWVd4MVpUdGNiaUFnTHk4Z0lIMWNiaUFnZlZ4dUlDQjBlWEJsSUQwZ2RIbHdaVnN3WFM1MGIxVndjR1Z5UTJGelpTZ3BJQ3NnZEhsd1pTNXpiR2xqWlNneEtUdGNiaUFnYkdWMElIZHBaR2RsZENBOUlHNWxkeUJKYm5SbGNtWmhZMlZ6VzNSNWNHVmRLR1ZzWlcxbGJuUXNiM0IwYVc5dWN5azdYRzRnSUhkcFpHZGxkQzVwWkNBOUlHVnNaVzFsYm5RdWFXUTdYRzRnSUhKbGRIVnliaUIzYVdSblpYUTdYRzU5TzF4dVhHNWNibXhsZENCelpXTjBhVzl1SUQwZ0tIQmhjbVZ1ZEN4clpYbDNiM0prS1NBOVBpQjdYRzVjYmlBZ2EyVjVkMjl5WkNBOUlHdGxlWGR2Y21RZ2ZId2dKMjVsZUhWekxYVnBKenRjYmx4dUlDQnNaWFFnYVc1MFpYSm1ZV05sU1VSeklEMGdlMzA3WEc1Y2JpQWdiR1YwSUdOdmJuUmhhVzVsY2lBOUlHUnZiUzV3WVhKelpVVnNaVzFsYm5Rb2NHRnlaVzUwS1R0Y2JseHVJQ0JzWlhRZ2RXa2dQU0I3ZlR0Y2JseHVJQ0JzWlhRZ2FIUnRiRVZzWlcxbGJuUnpJRDBnWTI5dWRHRnBibVZ5TG1kbGRFVnNaVzFsYm5SelFubFVZV2RPWVcxbEtDY3FKeWs3WEc0Z0lHeGxkQ0JsYkdWdFpXNTBjeUE5SUZ0ZE8xeHVJQ0JtYjNJZ0tHeGxkQ0JwUFRBN0lHazhhSFJ0YkVWc1pXMWxiblJ6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ1pXeGxiV1Z1ZEhNdWNIVnphQ2hvZEcxc1JXeGxiV1Z1ZEhOYmFWMHBPMXh1SUNCOVhHNGdJR1p2Y2lBb2JHVjBJR2s5TUR0cFBHVnNaVzFsYm5SekxteGxibWQwYUR0cEt5c3BJSHRjYmlBZ0lDQnNaWFFnZEhsd1pTQTlJR1ZzWlcxbGJuUnpXMmxkTG1kbGRFRjBkSEpwWW5WMFpTaHJaWGwzYjNKa0tUdGNiaUFnSUNCcFppQW9kSGx3WlNrZ2UxeHVJQ0FnSUNBZ2JHVjBJR1p2Y20xaGRIUmxaRlI1Y0dVZ1BTQm1ZV3h6WlR0Y2JpQWdJQ0FnSUdadmNpQW9iR1YwSUd0bGVTQnBiaUJKYm5SbGNtWmhZMlZ6S1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbExuUnZURzkzWlhKRFlYTmxLQ2s5UFQxclpYa3VkRzlNYjNkbGNrTmhjMlVvS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJR1p2Y20xaGRIUmxaRlI1Y0dVZ1BTQnJaWGs3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0FnSUdOdmJuTnZiR1V1Ykc5bktHWnZjbTFoZEhSbFpGUjVjR1VwTzF4dUlDQWdJQ0FnYkdWMElIZHBaR2RsZENBOUlHVnNaVzFsYm5Rb1pXeGxiV1Z1ZEhOYmFWMHNabTl5YldGMGRHVmtWSGx3WlNrN1hHNGdJQ0FnSUNCcFppQW9kMmxrWjJWMExtbGtLU0I3WEc0Z0lDQWdJQ0FnSUhWcFczZHBaR2RsZEM1cFpGMGdQU0IzYVdSblpYUTdYRzRnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQnNaWFFnYVdRZ1BTQmpjbVZoZEdWSmJuUmxjbVpoWTJWSlJDaDNhV1JuWlhRc2FXNTBaWEptWVdObFNVUnpLVHRjYmlBZ0lDQWdJQ0FnZFdsYmFXUmRJRDBnZDJsa1oyVjBPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNiaUFnZlZ4dVhHNGdJSEpsZEhWeWJpQjFhVHRjYmx4dWZUdGNibHh1YkdWMElHRmtaQ0E5SUNoMGVYQmxMSEJoY21WdWRDeHZjSFJwYjI1ektTQTlQaUI3WEc0Z0lHeGxkQ0IwWVhKblpYUWdQU0JrYjJOMWJXVnVkQzVqY21WaGRHVkZiR1Z0Wlc1MEtDZGthWFluS1R0Y2JpQWdiM0IwYVc5dWN5QTlJRzl3ZEdsdmJuTWdmSHdnZTMwN1hHNGdJR2xtSUNod1lYSmxiblFwSUh0Y2JpQWdJQ0J3WVhKbGJuUWdQU0JrYjIwdWNHRnljMlZGYkdWdFpXNTBLSEJoY21WdWRDazdYRzRnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdjR0Z5Wlc1MElEMGdaRzlqZFcxbGJuUXVZbTlrZVR0Y2JpQWdmVnh1SUNCd1lYSmxiblF1WVhCd1pXNWtRMmhwYkdRb2RHRnlaMlYwS1R0Y2JpQWdiM0IwYVc5dWN5NTBZWEpuWlhRZ1BTQjBZWEpuWlhRN1hHNGdJR2xtSUNodmNIUnBiMjV6TG5OcGVtVXBJSHRjYmlBZ0lDQjBZWEpuWlhRdWMzUjViR1V1ZDJsa2RHZ2dQU0J2Y0hScGIyNXpMbk5wZW1WYk1GMGdLeUFuY0hnbk8xeHVJQ0FnSUhSaGNtZGxkQzV6ZEhsc1pTNW9aV2xuYUhRZ1BTQnZjSFJwYjI1ekxuTnBlbVZiTVYwZ0t5QW5jSGduTzF4dUlDQjlYRzRnSUhKbGRIVnliaUJsYkdWdFpXNTBLSFJoY21kbGRDeDBlWEJsTEc5d2RHbHZibk1wTzF4dWZUdGNibHh1Wlhod2IzSjBJSHNnWld4bGJXVnVkQ0I5TzF4dVpYaHdiM0owSUhzZ2MyVmpkR2x2YmlCOU8xeHVaWGh3YjNKMElIc2dZV1JrSUgwN1hHNWNibHh1WEc0dkx5QlhSVUpRUVVOTElFWlBUMVJGVWlBdkwxeHVMeThnTGk5K0wycHphR2x1ZEMxc2IyRmtaWEloTGk5c2FXSXZkWFJwYkM5MGNtRnVjMlp2Y20wdWFuTWlMQ0luZFhObElITjBjbWxqZENjN1hHNWNibWx0Y0c5eWRDQnRZWFJvSUdaeWIyMGdKeTR1TDNWMGFXd3ZiV0YwYUNjN1hHNWNibVY0Y0c5eWRDQmtaV1poZFd4MElHTnNZWE56SUZSMWJtVWdlMXh1WEc0Z0lHTnZibk4wY25WamRHOXlLQ2tnZTF4dVhHNGdJRngwTHk4Z2RHaGxJSE5qWVd4bElHRnpJSEpoZEdsdmMxeHVJQ0JjZEhSb2FYTXVjMk5oYkdVZ1BTQmJYVHRjYmx4dUlDQmNkQzh2SUdrdmJ5QnRiMlJsYzF4dUlDQmNkSFJvYVhNdWJXOWtaU0E5SUh0Y2JpQWdYSFJjZEc5MWRIQjFkRG9nSjJaeVpYRjFaVzVqZVNjc1hHNGdJRngwWEhScGJuQjFkRG9nSjNOMFpYQW5YRzRnSUZ4MGZUdGNibHh1SUNCY2RDOHZJRVZVSUcxaGFtOXlYRzRnSUZ4MGRHaHBjeTVsZEcxaGFtOXlJRDBnV3lBeU5qRXVOakkxTlRnc1hHNGdJRngwWEhReU9UTXVOalkwTnpZMExGeHVJQ0JjZEZ4ME16STVMall5TnpVMk15eGNiaUFnWEhSY2RETTBPUzR5TWpneU5ERXNYRzRnSUZ4MFhIUXpPVEV1T1RrMU5ESXlMRnh1SUNCY2RGeDBORFF3TEZ4dUlDQmNkRngwTkRrekxqZzRNek13TVN4Y2JpQWdYSFJjZERVeU15NHlOVEV4Tmx4dUlDQmNkRjA3WEc1Y2JpQWdYSFF2THlCU2IyOTBJR1p5WlhGMVpXNWplUzVjYmlBZ1hIUjBhR2x6TG5KdmIzUWdQU0J0WVhSb0xtMTBiMllvTmpBcE95QWdJQ0FnTHk4Z0tpQk5ZWFJvTG5CdmR5Z3lMQ2cyTUMwMk9Ta3ZNVElwTzF4dVhHNGdJQ0FnTHk4Z1pHVm1ZWFZzZENCcGN5QmhJRzFoYW05eUlITmpZV3hsWEc0Z0lDQWdkR2hwY3k1amNtVmhkR1ZUWTJGc1pTZ3dMRElzTkN3MUxEY3NPU3d4TVNrN1hHNWNiaUFnZlZ4dVhHNGdJQzhxSUZKbGRIVnliaUJrWVhSaElHbHVJSFJvWlNCdGIyUmxJSGx2ZFNCaGNtVWdhVzRnS0daeVpYRXNJSEpoZEdsdkxDQnZjaUJ0YVdScEtTQXFMMXh1SUNCdWIzUmxLR2x1Y0hWMExHOWpkR0YyWlNrZ2UxeHVYRzRnSUZ4MGJHVjBJRzVsZDNaaGJIVmxPMXh1WEc0Z0lGeDBhV1lnS0hSb2FYTXViVzlrWlM1dmRYUndkWFFnUFQwOUlDZG1jbVZ4ZFdWdVkza25LU0I3WEc0Z0lGeDBYSFJ1WlhkMllXeDFaU0E5SUhSb2FYTXVabkpsY1hWbGJtTjVLR2x1Y0hWMExHOWpkR0YyWlNrN1hHNGdJRngwZlNCbGJITmxJR2xtSUNoMGFHbHpMbTF2WkdVdWIzVjBjSFYwSUQwOVBTQW5jbUYwYVc4bktTQjdYRzRnSUZ4MFhIUnVaWGQyWVd4MVpTQTlJSFJvYVhNdWNtRjBhVzhvYVc1d2RYUXNiMk4wWVhabEtUdGNiaUFnWEhSOUlHVnNjMlVnYVdZZ0tIUm9hWE11Ylc5a1pTNXZkWFJ3ZFhRZ1BUMDlJQ2ROU1VSSkp5a2dlMXh1SUNCY2RGeDBibVYzZG1Gc2RXVWdQU0IwYUdsekxrMUpSRWtvYVc1d2RYUXNiMk4wWVhabEtUdGNiaUFnWEhSOUlHVnNjMlVnZTF4dUlDQmNkRngwYm1WM2RtRnNkV1VnUFNCMGFHbHpMbVp5WlhGMVpXNWplU2hwYm5CMWRDeHZZM1JoZG1VcE8xeHVJQ0JjZEgxY2JseHVJQ0JjZEhKbGRIVnliaUJ1WlhkMllXeDFaVHRjYmx4dUlDQjlYRzVjYmx4dUlDQXZLaUJTWlhSMWNtNGdabkpsY1NCa1lYUmhJQ292WEc0Z0lHWnlaWEYxWlc1amVTaHpkR1Z3U1c0c0lHOWpkR0YyWlVsdUtTQjdYRzVjYmlBZ1hIUnBaaUFvZEdocGN5NXRiMlJsTG1sdWNIVjBJRDA5UFNBbmJXbGthU2NnZkh3Z2RHaHBjeTV0YjJSbExtbHVjSFYwSUQwOVBTQW5UVWxFU1NjZ0tTQjdYRzRnSUZ4MFhIUjBhR2x6TG5OMFpYQkpiaUFyUFNBMk1EdGNiaUFnWEhSOVhHNWNiaUFnWEhRdkx5QjNhR0YwSUc5amRHRjJaU0JwY3lCdmRYSWdhVzV3ZFhSY2JpQWdYSFJzWlhRZ2IyTjBZWFpsSUQwZ1RXRjBhQzVtYkc5dmNpaHpkR1Z3U1c0dmRHaHBjeTV6WTJGc1pTNXNaVzVuZEdncE8xeHVYRzRnSUZ4MGFXWWdLRzlqZEdGMlpVbHVLU0I3WEc0Z0lGeDBYSFJ2WTNSaGRtVWdLejBnYjJOMFlYWmxTVzQ3WEc0Z0lGeDBmVnh1WEc0Z0lGeDBMeThnZDJocFkyZ2djMk5oYkdVZ1pHVm5jbVZsSUNnd0lDMGdjMk5oYkdVZ2JHVnVaM1JvS1NCcGN5QnZkWElnYVc1d2RYUmNiaUFnWEhSc1pYUWdjMk5oYkdWRVpXZHlaV1VnUFNCemRHVndTVzRnSlNCMGFHbHpMbk5qWVd4bExteGxibWQwYUR0Y2JseHVJQ0JjZEhkb2FXeGxJQ2h6WTJGc1pVUmxaM0psWlNBOElEQXBJSHRjYmlBZ1hIUmNkSE5qWVd4bFJHVm5jbVZsSUNzOUlIUm9hWE11YzJOaGJHVXViR1Z1WjNSb08xeHVJQ0JjZEgxY2JseHVJQ0FnSUd4bGRDQnlZWFJwYnlBOUlIUm9hWE11YzJOaGJHVmJjMk5oYkdWRVpXZHlaV1ZkTzF4dVhHNGdJRngwYkdWMElHWnlaWEVnUFNCMGFHbHpMbkp2YjNRZ0tpQnlZWFJwYnp0Y2JseHVJQ0JjZEdaeVpYRWdQU0JtY21WeEtpaE5ZWFJvTG5CdmR5Z3lMRzlqZEdGMlpTa3BPMXh1WEc0Z0lGeDBMeThnZEhKMWJtTmhkR1VnYVhKeVlYUnBiMjVoYkNCdWRXMWlaWEp6WEc0Z0lGeDBabkpsY1NBOUlFMWhkR2d1Wm14dmIzSW9abkpsY1NveE1EQXdNREF3TURBd01EQXBMekV3TURBd01EQXdNREF3TUR0Y2JseHVJQ0JjZEhKbGRIVnliaUJtY21WeE8xeHVYRzRnSUgxY2JseHVJQ0F2S2lCR2IzSmpaU0J5WlhSMWNtNGdjbUYwYVc4Z1pHRjBZU0FxTDF4dVhHNGdJSEpoZEdsdktITjBaWEJKYml3Z2IyTjBZWFpsU1c0cElIdGNibHh1SUNCY2RHbG1JQ2gwYUdsekxtMXZaR1V1YVc1d2RYUWdQVDA5SUNkdGFXUnBKeUI4ZkNCMGFHbHpMbTF2WkdVdWFXNXdkWFFnUFQwOUlDZE5TVVJKSnlBcElIdGNiaUFnWEhSY2RIUm9hWE11YzNSbGNFbHVJQ3M5SURZd08xeHVJQ0JjZEgxY2JseHVJQ0JjZEM4dklIZG9ZWFFnYjJOMFlYWmxJR2x6SUc5MWNpQnBibkIxZEZ4dUlDQmNkR3hsZENCdlkzUmhkbVVnUFNCTllYUm9MbVpzYjI5eUtITjBaWEJKYmk5MGFHbHpMbk5qWVd4bExteGxibWQwYUNrN1hHNWNiaUFnWEhScFppQW9iMk4wWVhabFNXNHBJSHRjYmlBZ1hIUmNkRzlqZEdGMlpTQXJQU0J2WTNSaGRtVkpianRjYmlBZ1hIUjlYRzVjYmlBZ1hIUXZMeUIzYUdsamFDQnpZMkZzWlNCa1pXZHlaV1VnS0RBZ0xTQnpZMkZzWlNCc1pXNW5kR2dwSUdseklHOTFjaUJwYm5CMWRGeHVJQ0JjZEd4bGRDQnpZMkZzWlVSbFozSmxaU0E5SUhOMFpYQkpiaUFsSUhSb2FYTXVjMk5oYkdVdWJHVnVaM1JvTzF4dVhHNGdJRngwTHk4Z2QyaGhkQ0J5WVhScGJ5QnBjeUJ2ZFhJZ2FXNXdkWFFnZEc4Z2IzVnlJR3RsZVZ4dUlDQmNkR3hsZENCeVlYUnBieUE5SUUxaGRHZ3VjRzkzS0RJc2IyTjBZWFpsS1NwMGFHbHpMbk5qWVd4bFczTmpZV3hsUkdWbmNtVmxYVHRjYmx4dUlDQmNkSEpoZEdsdklEMGdUV0YwYUM1bWJHOXZjaWh5WVhScGJ5b3hNREF3TURBd01EQXdNREFwTHpFd01EQXdNREF3TURBd01EdGNibHh1SUNCY2RISmxkSFZ5YmlCeVlYUnBienRjYmx4dUlDQjlYRzVjYmlBZ0x5b2dSbTl5WTJVZ2NtVjBkWEp1SUdGa2FuVnpkR1ZrSUUxSlJFa2daR0YwWVNBcUwxeHVYRzRnSUUxSlJFa29jM1JsY0VsdUxHOWpkR0YyWlVsdUtTQjdYRzVjYmlBZ1hIUnNaWFFnYm1WM2RtRnNkV1VnUFNCMGFHbHpMbVp5WlhGMVpXNWplU2h6ZEdWd1NXNHNiMk4wWVhabFNXNHBPMXh1WEc0Z0lGeDBiR1YwSUc0Z1BTQTJPU0FySURFeUtrMWhkR2d1Ykc5bktHNWxkM1poYkhWbEx6UTBNQ2t2VFdGMGFDNXNiMmNvTWlrN1hHNWNiaUFnWEhSdUlEMGdUV0YwYUM1bWJHOXZjaWh1S2pFd01EQXdNREF3TURBcEx6RXdNREF3TURBd01EQTdYRzVjYmlBZ1hIUnlaWFIxY200Z2JqdGNibHh1SUNCOVhHNWNiaUFnWTNKbFlYUmxVMk5oYkdVb0tTQjdYRzRnSUNBZ2JHVjBJRzVsZDFOallXeGxJRDBnVzEwN1hHNGdJQ0FnWm05eUlDaHNaWFFnYVQwd08yazhZWEpuZFcxbGJuUnpMbXhsYm1kMGFEdHBLeXNwSUh0Y2JpQWdJQ0FnSUc1bGQxTmpZV3hsTG5CMWMyZ29JRzFoZEdndWJYUnZaaWdnTmpBZ0t5QmhjbWQxYldWdWRITmJhVjBnS1NBcE8xeHVJQ0FnSUgxY2JpQWdJQ0IwYUdsekxteHZZV1JUWTJGc1pVWnliMjFHY21WeGRXVnVZMmxsY3lodVpYZFRZMkZzWlNrN1hHNGdJSDFjYmx4dUlDQmpjbVZoZEdWS1NWTmpZV3hsS0NrZ2UxeHVJQ0FnSUhSb2FYTXVjMk5oYkdVZ1BTQmJYVHRjYmlBZ0lDQm1iM0lnS0d4bGRDQnBQVEE3YVR4aGNtZDFiV1Z1ZEhNdWJHVnVaM1JvTzJrckt5a2dlMXh1SUNBZ0lDQWdkR2hwY3k1elkyRnNaUzV3ZFhOb0tHRnlaM1Z0Wlc1MGMxdHBYU2s3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnYkc5aFpGTmpZV3hsUm5KdmJVWnlaWEYxWlc1amFXVnpLR1p5WlhGektTQjdYRzRnSUNBZ2RHaHBjeTV6WTJGc1pTQTlJRnRkTzF4dUlDQWdJR1p2Y2lBb2JHVjBJR2s5TUR0cFBHWnlaWEZ6TG14bGJtZDBhQzB4TzJrckt5a2dlMXh1SUNBZ0lDQWdkR2hwY3k1elkyRnNaUzV3ZFhOb0tHWnlaWEZ6VzJsZEwyWnlaWEZ6V3pCZEtUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQXZLaUJNYjJGa0lHRWdibVYzSUhOallXeGxJQ292WEc1Y2JpQWdiRzloWkZOallXeGxLRzVoYldVcGUxeHVYRzRnSUZ4MEx5b2diRzloWkNCMGFHVWdjMk5oYkdVZ0tpOWNiaUFnWEhSc1pYUWdabkpsY1hNZ1BTQjBhR2x6TG5OallXeGxjMXR1WVcxbFhTNW1jbVZ4ZFdWdVkybGxjenRjYmlBZ0lDQjBhR2x6TG14dllXUlRZMkZzWlVaeWIyMUdjbVZ4ZFdWdVkybGxjeWhtY21WeGN5azdYRzVjYmlBZ2ZWeHVYRzRnSUM4cUlGTmxZWEpqYUNCMGFHVWdibUZ0WlhNZ2IyWWdkSFZ1YVc1bmMxeHVJQ0JjZENCU1pYUjFjbTV6SUdGdUlHRnljbUY1SUc5bUlHNWhiV1Z6SUc5bUlIUjFibWx1WjNNZ0tpOWNibHh1SUNCelpXRnlZMmdvYkdWMGRHVnljeWtnZTF4dUlDQmNkR3hsZENCd2IzTnphV0pzWlNBOUlGdGRPMXh1SUNCY2RHWnZjaUFvYkdWMElHdGxlU0JwYmlCMGFHbHpMbk5qWVd4bGN5a2dlMXh1SUNCY2RGeDBhV1lnS0d0bGVTNTBiMHh2ZDJWeVEyRnpaU2dwTG1sdVpHVjRUMllvYkdWMGRHVnljeTUwYjB4dmQyVnlRMkZ6WlNncEtTQWhQVDBnTFRFcElIdGNiaUFnWEhSY2RGeDBjRzl6YzJsaWJHVXVjSFZ6YUNoclpYa3BPMXh1SUNCY2RGeDBmVnh1SUNCY2RIMWNiaUFnWEhSeVpYUjFjbTRnY0c5emMybGliR1U3WEc0Z0lIMWNibHh1SUNBdktpQlNaWFIxY200Z1lTQmpiMnhzWldOMGFXOXVJRzltSUc1dmRHVnpJR0Z6SUdGdUlHRnljbUY1SUNvdlhHNWNiaUFnWTJodmNtUW9iV2xrYVhNcElIdGNiaUFnWEhSc1pYUWdiM1YwY0hWMElEMGdXMTA3WEc0Z0lGeDBabTl5SUNoc1pYUWdhVDB3TzJrOGJXbGthWE11YkdWdVozUm9PMmtyS3lrZ2UxeHVJQ0JjZEZ4MGIzVjBjSFYwTG5CMWMyZ29kR2hwY3k1dWIzUmxLRzFwWkdselcybGRLU2s3WEc0Z0lGeDBmVnh1SUNCY2RISmxkSFZ5YmlCdmRYUndkWFE3WEc0Z0lIMWNibHh1ZlZ4dVhHNWNibHh1THk4Z1YwVkNVRUZEU3lCR1QwOVVSVklnTHk5Y2JpOHZJQzR2Zmk5cWMyaHBiblF0Ykc5aFpHVnlJUzR2YkdsaUwzUjFibWx1Wnk5MGRXNXBibWN1YW5NaUxDSW5kWE5sSUhOMGNtbGpkQ2M3WEc1Y2JpOHZSR2x6WVdKc1pTQnFjMmhwYm5RZ2QyRnlibWx1WnlCamIyNWpaWEp1YVc1bklIUnlZV2xzYVc1bklISmxaM1ZzWVhJZ2NHRnlZVzF6WEc0dkttcHphR2x1ZENBdFZ6RXpPQ0FxTDF4dVhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCamJHRnpjeUJTWVdScGJ5QjdYRzRnSUNBZ0x5OXBaaUJ1YjI0dFpYaHBjM1JsYm5RZ1luVjBkRzl1Y3lCaGNtVWdjM2RwZEdOb1pXUXNJSFJvWlhrZ1lYSmxJR2xuYm05eVpXUmNibHh1SUNBZ0lHTnZibk4wY25WamRHOXlLR3hsYm1kMGFDQTlJRE1zSUM0dUxtOXVWbUZzY3lrZ2UxeHVJQ0FnSUNBZ0lDQXZMMlZoWTJnZ2IzQjBhVzl1WVd3Z0oyOXVWbUZzY3ljZ1lYSm5kVzFsYm5RZ2MzZHBkR05vWlhNZ2IyNGdkR2hoZENCMllXeDFaU0JwYmlCMGFHVWdVbUZrYVc4Z2FXWWdhWFFnWlhocGMzUnpYRzRnSUNBZ0lDQWdJQzh2U1c0Z2RHaGxJR1Y0WVcxd2JHVWdZbVZzYjNjc0lHRWdNeTFpZFhSMGIyNGdjbUZrYVc4Z2FYTWdZM0psWVhSbFpDd2dhVzVrWlhnZ01DQnBjeUJ6ZDJsMFkyaGxaQ0J2Yml3Z2FXNWtaWGdnTVNCcGN5QnpkMmwwWTJobFpDQnZiaUIwYUdWdUlIUm9aVzRnWVhSMFpXMXdkR1ZrSUdGbllXbHVJSEJ5YjJSMVkybHVaeUJoYmlCM1lYSnVhVzVuTENCaGJtUWdkR2hsSUdacGJtRnNJR0Z5WjNWdFpXNTBJSEJ5YjJSMVkyVnpJR0VnZDJGeWJtbHVaeUJpWldOaGRYTmxJSFJvWlNCcGJtUmxlQ0IyWVd4MVpTQmtiMlZ6SUc1dmRDQmxlR2x6ZEM1Y2JpQWdJQ0FnSUNBZ0x5OUZlR0Z0Y0d4bE9seHVJQ0FnSUNBZ0lDQXZMMkFnSUhKaFpHbHZJRDBnYm1WM0lGSmhaR2x2S0RNc0lEQXNJREVzSURFc0lETXBPMXh1SUNBZ0lDQWdJQ0F2TCtLQXBpQWdXekVzTVN3d1hWeHVYRzRnSUNBZ0lDQWdJR2xtSUNoc1pXNW5kR2dnUENBd0tTQjdJR3hsYm1kMGFDQTlJREU3SUgxY2JseHVJQ0FnSUNBZ0lDQjBhR2x6TG14bGJtZDBhQ0E5SUd4bGJtZDBhRHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXZibFpoYkhNZ1BTQnZibFpoYkhNN1hHNGdJQ0FnSUNBZ0lIUm9hWE11WVhKeVlYa2dQU0J1WlhjZ1FYSnlZWGtvYkdWdVozUm9LUzVtYVd4c0tEQXBPMXh1WEc0Z0lDQWdJQ0FnSUdsbUlDaHZibFpoYkhNdWJHVnVaM1JvSUQ0Z01Da2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV2YmlndUxpNXZibFpoYkhNcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2MyVnNaV04wS0haaGJIVmxLU0I3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVZWEp5WVhrdVptbHNiQ2d3S1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTVoY25KaGVWdDJZV3gxWlYwZ1BTQXhPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdkR2hwY3k1aGNuSmhlVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQm1iR2x3S0M0dUxuWmhiSFZsY3lrZ2UxeHVJQ0FnSUNBZ0lDQXZMMlpzYVhCeklIUm9aU0J6Y0dWamFXWnBaV1FnZG1Gc2RXVnpMaUJwWmlCdWJ5QjJZV3gxWlNCcGN5QnpjR1ZqYVdacFpXUXNJR1pzYVhCeklHRnNiQ0JpZFhSMGIyNXpYRzRnSUNBZ0lDQWdJR3hsZENCaElEMGdkR2hwY3k1aGNuSmhlVHRjYmlBZ0lDQWdJQ0FnYVdZZ0tIWmhiSFZsY3k1c1pXNW5kR2dnUGlBd0tTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCMllXeDFaWE11Wm05eVJXRmphQ2htZFc1amRHbHZiaWgyS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLSFlnUGlCaExteGxibWQwYUNBdElERXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1M1lYSnVLQ2RYWVhKdWFXNW5PaUJCYm05dVVtRmthVzliSnlBcklIWWdLeUFuWFNCa2IyVnpJRzV2ZENCbGVHbHpkQ2NwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lHRmJkbDBnUFNBb1lWdDJYU0EvSURBZ09pQXhLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHRXVabTl5UldGamFDaG1kVzVqZEdsdmJpaDJMQ0JwTENCaGNuSXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JoY25KYmFWMGdQU0FvZGlBL0lEQWdPaUF4S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCaE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUc5dUtDNHVMblpoYkhWbGN5a2dlMXh1SUNBZ0lDQWdJQ0F2TDNOM2FYUmphQ0J2YmlCMGFHVWdjM0JsWTJsbWFXVmtJSFpoYkhWbGN5NGdhV1lnYm04Z2RtRnNkV1VnYzNCbFkybG1hV1ZrTENCbWJHbHdjeUJ2YmlCaGJHd2dZblYwZEc5dWMxeHVJQ0FnSUNBZ0lDQnNaWFFnWVNBOUlIUm9hWE11WVhKeVlYazdYRzRnSUNBZ0lDQWdJR2xtSUNoMllXeDFaWE11YkdWdVozUm9JRDRnTUNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnZG1Gc2RXVnpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9kaWtnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaDJJRDRnWVM1c1pXNW5kR2dnTFNBeEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdOdmJuTnZiR1V1ZDJGeWJpZ25WMkZ5Ym1sdVp6b2dRVzV2YmxKaFpHbHZXeWNnS3lCMklDc2dKMTBnWlhoalpXVmtjeUJ6YVhwbElHOW1JRzlpYW1WamRDY3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGhXM1pkSUQwOVBTQXhLU0I3SUdOdmJuTnZiR1V1ZDJGeWJpZ25WMkZ5Ym1sdVp6b2dRVzV2YmxKaFpHbHZXeWNnS3lCMklDc2dKMTBnZDJGeklHRnNjbVZoWkhrZ2IyNHVKeWs3SUgxY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZVnQyWFNBOUlERTdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCaExtWnBiR3dvTVNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHRTdYRzRnSUNBZ2ZWeHVYRzRnSUNBZ2IyWm1LQzR1TG5aaGJIVmxjeWtnZTF4dUlDQWdJQ0FnSUNBdkwzTjNhWFJqYUNCdlptWWdkR2hsSUhOd1pXTnBabWxsWkNCMllXeDFaWE11SUdsbUlHNXZJSFpoYkhWbElITndaV05wWm1sbFpDd2dabXhwY0hNZ2IyWm1JR0ZzYkNCaWRYUjBiMjV6WEc0Z0lDQWdJQ0FnSUd4bGRDQmhJRDBnZEdocGN5NWhjbkpoZVR0Y2JpQWdJQ0FnSUNBZ2FXWWdLSFpoYkhWbGN5NXNaVzVuZEdnZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjJZV3gxWlhNdVptOXlSV0ZqYUNobWRXNWpkR2x2YmloMktTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdZVnQyWFNBOUlEQTdYRzRnSUNBZ0lDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdFdVptbHNiQ2d3S1R0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1lUdGNiaUFnSUNCOVhHNTlYRzVjYmx4dVhHNHZMeUJYUlVKUVFVTkxJRVpQVDFSRlVpQXZMMXh1THk4Z0xpOStMMnB6YUdsdWRDMXNiMkZrWlhJaExpOXNhV0l2Ylc5a1pXeHpMM0poWkdsdkxtcHpJaXdpZG1GeUlGZEJRVU5zYjJOcklEMGdjbVZ4ZFdseVpTZ25MaTlzYVdJdlYwRkJRMnh2WTJzbktWeHVYRzV0YjJSMWJHVXVaWGh3YjNKMGN5QTlJRmRCUVVOc2IyTnJYRzVwWmlBb2RIbHdaVzltSUhkcGJtUnZkeUFoUFQwZ0ozVnVaR1ZtYVc1bFpDY3BJSGRwYm1SdmR5NVhRVUZEYkc5amF5QTlJRmRCUVVOc2IyTnJYRzVjYmx4dVhHNHZMeTh2THk4dkx5OHZMeTh2THk4dkx5OWNiaTh2SUZkRlFsQkJRMHNnUms5UFZFVlNYRzR2THlBdUwzNHZkMkZoWTJ4dlkyc3ZhVzVrWlhndWFuTmNiaTh2SUcxdlpIVnNaU0JwWkNBOUlEUXlYRzR2THlCdGIyUjFiR1VnWTJoMWJtdHpJRDBnTUNJc0luWmhjaUJwYzBKeWIzZHpaWElnUFNBb2RIbHdaVzltSUhkcGJtUnZkeUFoUFQwZ0ozVnVaR1ZtYVc1bFpDY3BYRzVjYm5aaGNpQkRURTlEUzE5RVJVWkJWVXhVVXlBOUlIdGNiaUFnZEc5c1pYSmhibU5sVEdGMFpUb2dNQzR4TUN4Y2JpQWdkRzlzWlhKaGJtTmxSV0Z5YkhrNklEQXVNREF4WEc1OVhHNWNiaTh2SUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUlFVjJaVzUwSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUlDOHZYRzUyWVhJZ1JYWmxiblFnUFNCbWRXNWpkR2x2YmloamJHOWpheXdnWkdWaFpHeHBibVVzSUdaMWJtTXBJSHRjYmlBZ2RHaHBjeTVqYkc5amF5QTlJR05zYjJOclhHNGdJSFJvYVhNdVpuVnVZeUE5SUdaMWJtTmNiaUFnZEdocGN5NWZZMnhsWVhKbFpDQTlJR1poYkhObElDOHZJRVpzWVdjZ2RYTmxaQ0IwYnlCamJHVmhjaUJoYmlCbGRtVnVkQ0JwYm5OcFpHVWdZMkZzYkdKaFkydGNibHh1SUNCMGFHbHpMblJ2YkdWeVlXNWpaVXhoZEdVZ1BTQmpiRzlqYXk1MGIyeGxjbUZ1WTJWTVlYUmxYRzRnSUhSb2FYTXVkRzlzWlhKaGJtTmxSV0Z5YkhrZ1BTQmpiRzlqYXk1MGIyeGxjbUZ1WTJWRllYSnNlVnh1SUNCMGFHbHpMbDlzWVhSbGMzUlVhVzFsSUQwZ2JuVnNiRnh1SUNCMGFHbHpMbDlsWVhKc2FXVnpkRlJwYldVZ1BTQnVkV3hzWEc0Z0lIUm9hWE11WkdWaFpHeHBibVVnUFNCdWRXeHNYRzRnSUhSb2FYTXVjbVZ3WldGMFZHbHRaU0E5SUc1MWJHeGNibHh1SUNCMGFHbHpMbk5qYUdWa2RXeGxLR1JsWVdSc2FXNWxLVnh1ZlZ4dVhHNHZMeUJWYm5OamFHVmtkV3hsY3lCMGFHVWdaWFpsYm5SY2JrVjJaVzUwTG5CeWIzUnZkSGx3WlM1amJHVmhjaUE5SUdaMWJtTjBhVzl1S0NrZ2UxeHVJQ0IwYUdsekxtTnNiMk5yTGw5eVpXMXZkbVZGZG1WdWRDaDBhR2x6S1Z4dUlDQjBhR2x6TGw5amJHVmhjbVZrSUQwZ2RISjFaVnh1SUNCeVpYUjFjbTRnZEdocGMxeHVmVnh1WEc0dkx5QlRaWFJ6SUhSb1pTQmxkbVZ1ZENCMGJ5QnlaWEJsWVhRZ1pYWmxjbmtnWUhScGJXVmdJSE5sWTI5dVpITXVYRzVGZG1WdWRDNXdjbTkwYjNSNWNHVXVjbVZ3WldGMElEMGdablZ1WTNScGIyNG9kR2x0WlNrZ2UxeHVJQ0JwWmlBb2RHbHRaU0E5UFQwZ01DbGNiaUFnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjJSbGJHRjVJR05oYm01dmRDQmlaU0F3SnlsY2JpQWdkR2hwY3k1eVpYQmxZWFJVYVcxbElEMGdkR2x0WlZ4dUlDQnBaaUFvSVhSb2FYTXVZMnh2WTJzdVgyaGhjMFYyWlc1MEtIUm9hWE1wS1Z4dUlDQWdJSFJvYVhNdWMyTm9aV1IxYkdVb2RHaHBjeTVrWldGa2JHbHVaU0FySUhSb2FYTXVjbVZ3WldGMFZHbHRaU2xjYmlBZ2NtVjBkWEp1SUhSb2FYTmNibjFjYmx4dUx5OGdVMlYwY3lCMGFHVWdkR2x0WlNCMGIyeGxjbUZ1WTJVZ2IyWWdkR2hsSUdWMlpXNTBMbHh1THk4Z1ZHaGxJR1YyWlc1MElIZHBiR3dnWW1VZ1pYaGxZM1YwWldRZ2FXNGdkR2hsSUdsdWRHVnlkbUZzSUdCYlpHVmhaR3hwYm1VZ0xTQmxZWEpzZVN3Z1pHVmhaR3hwYm1VZ0t5QnNZWFJsWFdCY2JpOHZJRWxtSUhSb1pTQmpiRzlqYXlCbVlXbHNjeUIwYnlCbGVHVmpkWFJsSUhSb1pTQmxkbVZ1ZENCcGJpQjBhVzFsTENCMGFHVWdaWFpsYm5RZ2QybHNiQ0JpWlNCa2NtOXdjR1ZrTGx4dVJYWmxiblF1Y0hKdmRHOTBlWEJsTG5SdmJHVnlZVzVqWlNBOUlHWjFibU4wYVc5dUtIWmhiSFZsY3lrZ2UxeHVJQ0JwWmlBb2RIbHdaVzltSUhaaGJIVmxjeTVzWVhSbElEMDlQU0FuYm5WdFltVnlKeWxjYmlBZ0lDQjBhR2x6TG5SdmJHVnlZVzVqWlV4aGRHVWdQU0IyWVd4MVpYTXViR0YwWlZ4dUlDQnBaaUFvZEhsd1pXOW1JSFpoYkhWbGN5NWxZWEpzZVNBOVBUMGdKMjUxYldKbGNpY3BYRzRnSUNBZ2RHaHBjeTUwYjJ4bGNtRnVZMlZGWVhKc2VTQTlJSFpoYkhWbGN5NWxZWEpzZVZ4dUlDQjBhR2x6TGw5eVpXWnlaWE5vUldGeWJIbE1ZWFJsUkdGMFpYTW9LVnh1SUNCcFppQW9kR2hwY3k1amJHOWpheTVmYUdGelJYWmxiblFvZEdocGN5a3BJSHRjYmlBZ0lDQjBhR2x6TG1Oc2IyTnJMbDl5WlcxdmRtVkZkbVZ1ZENoMGFHbHpLVnh1SUNBZ0lIUm9hWE11WTJ4dlkyc3VYMmx1YzJWeWRFVjJaVzUwS0hSb2FYTXBYRzRnSUgxY2JpQWdjbVYwZFhKdUlIUm9hWE5jYm4xY2JseHVMeThnVW1WMGRYSnVjeUIwY25WbElHbG1JSFJvWlNCbGRtVnVkQ0JwY3lCeVpYQmxZWFJsWkN3Z1ptRnNjMlVnYjNSb1pYSjNhWE5sWEc1RmRtVnVkQzV3Y205MGIzUjVjR1V1YVhOU1pYQmxZWFJsWkNBOUlHWjFibU4wYVc5dUtDa2dleUJ5WlhSMWNtNGdkR2hwY3k1eVpYQmxZWFJVYVcxbElDRTlQU0J1ZFd4c0lIMWNibHh1THk4Z1UyTm9aV1IxYkdWeklIUm9aU0JsZG1WdWRDQjBieUJpWlNCeVlXNGdZbVZtYjNKbElHQmtaV0ZrYkdsdVpXQXVYRzR2THlCSlppQjBhR1VnZEdsdFpTQnBjeUIzYVhSb2FXNGdkR2hsSUdWMlpXNTBJSFJ2YkdWeVlXNWpaU3dnZDJVZ2FHRnVaR3hsSUhSb1pTQmxkbVZ1ZENCcGJXMWxaR2xoZEdWc2VTNWNiaTh2SUVsbUlIUm9aU0JsZG1WdWRDQjNZWE1nWVd4eVpXRmtlU0J6WTJobFpIVnNaV1FnWVhRZ1lTQmthV1ptWlhKbGJuUWdkR2x0WlN3Z2FYUWdhWE1nY21WelkyaGxaSFZzWldRdVhHNUZkbVZ1ZEM1d2NtOTBiM1I1Y0dVdWMyTm9aV1IxYkdVZ1BTQm1kVzVqZEdsdmJpaGtaV0ZrYkdsdVpTa2dlMXh1SUNCMGFHbHpMbDlqYkdWaGNtVmtJRDBnWm1Gc2MyVmNiaUFnZEdocGN5NWtaV0ZrYkdsdVpTQTlJR1JsWVdSc2FXNWxYRzRnSUhSb2FYTXVYM0psWm5KbGMyaEZZWEpzZVV4aGRHVkVZWFJsY3lncFhHNWNiaUFnYVdZZ0tIUm9hWE11WTJ4dlkyc3VZMjl1ZEdWNGRDNWpkWEp5Wlc1MFZHbHRaU0ErUFNCMGFHbHpMbDlsWVhKc2FXVnpkRlJwYldVcElIdGNiaUFnSUNCMGFHbHpMbDlsZUdWamRYUmxLQ2xjYmlBZ1hHNGdJSDBnWld4elpTQnBaaUFvZEdocGN5NWpiRzlqYXk1ZmFHRnpSWFpsYm5Rb2RHaHBjeWtwSUh0Y2JpQWdJQ0IwYUdsekxtTnNiMk5yTGw5eVpXMXZkbVZGZG1WdWRDaDBhR2x6S1Z4dUlDQWdJSFJvYVhNdVkyeHZZMnN1WDJsdWMyVnlkRVYyWlc1MEtIUm9hWE1wWEc0Z0lGeHVJQ0I5SUdWc2MyVWdkR2hwY3k1amJHOWpheTVmYVc1elpYSjBSWFpsYm5Rb2RHaHBjeWxjYm4xY2JseHVSWFpsYm5RdWNISnZkRzkwZVhCbExuUnBiV1ZUZEhKbGRHTm9JRDBnWm5WdVkzUnBiMjRvZEZKbFppd2djbUYwYVc4cElIdGNiaUFnYVdZZ0tIUm9hWE11YVhOU1pYQmxZWFJsWkNncEtWeHVJQ0FnSUhSb2FYTXVjbVZ3WldGMFZHbHRaU0E5SUhSb2FYTXVjbVZ3WldGMFZHbHRaU0FxSUhKaGRHbHZYRzVjYmlBZ2RtRnlJR1JsWVdSc2FXNWxJRDBnZEZKbFppQXJJSEpoZEdsdklDb2dLSFJvYVhNdVpHVmhaR3hwYm1VZ0xTQjBVbVZtS1Z4dUlDQXZMeUJKWmlCMGFHVWdaR1ZoWkd4cGJtVWdhWE1nZEc5dklHTnNiM05sSUc5eUlIQmhjM1FzSUdGdVpDQjBhR1VnWlhabGJuUWdhR0Z6SUdFZ2NtVndaV0YwTEZ4dUlDQXZMeUIzWlNCallXeGpkV3hoZEdVZ2RHaGxJRzVsZUhRZ2NtVndaV0YwSUhCdmMzTnBZbXhsSUdsdUlIUm9aU0J6ZEhKbGRHTm9aV1FnYzNCaFkyVXVYRzRnSUdsbUlDaDBhR2x6TG1selVtVndaV0YwWldRb0tTa2dlMXh1SUNBZ0lIZG9hV3hsSUNoMGFHbHpMbU5zYjJOckxtTnZiblJsZUhRdVkzVnljbVZ1ZEZScGJXVWdQajBnWkdWaFpHeHBibVVnTFNCMGFHbHpMblJ2YkdWeVlXNWpaVVZoY214NUtWeHVJQ0FnSUNBZ1pHVmhaR3hwYm1VZ0t6MGdkR2hwY3k1eVpYQmxZWFJVYVcxbFhHNGdJSDFjYmlBZ2RHaHBjeTV6WTJobFpIVnNaU2hrWldGa2JHbHVaU2xjYm4xY2JseHVMeThnUlhobFkzVjBaWE1nZEdobElHVjJaVzUwWEc1RmRtVnVkQzV3Y205MGIzUjVjR1V1WDJWNFpXTjFkR1VnUFNCbWRXNWpkR2x2YmlncElIdGNiaUFnYVdZZ0tIUm9hWE11WTJ4dlkyc3VYM04wWVhKMFpXUWdQVDA5SUdaaGJITmxLU0J5WlhSMWNtNWNiaUFnZEdocGN5NWpiRzlqYXk1ZmNtVnRiM1psUlhabGJuUW9kR2hwY3lsY2JseHVJQ0JwWmlBb2RHaHBjeTVqYkc5amF5NWpiMjUwWlhoMExtTjFjbkpsYm5SVWFXMWxJRHdnZEdocGN5NWZiR0YwWlhOMFZHbHRaU2xjYmlBZ0lDQjBhR2x6TG1aMWJtTW9kR2hwY3lsY2JpQWdaV3h6WlNCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11YjI1bGVIQnBjbVZrS1NCMGFHbHpMbTl1Wlhod2FYSmxaQ2gwYUdsektWeHVJQ0FnSUdOdmJuTnZiR1V1ZDJGeWJpZ25aWFpsYm5RZ1pYaHdhWEpsWkNjcFhHNGdJSDFjYmlBZ0x5OGdTVzRnZEdobElHTmhjMlVnWUhOamFHVmtkV3hsWUNCcGN5QmpZV3hzWldRZ2FXNXphV1JsSUdCbWRXNWpZQ3dnZDJVZ2JtVmxaQ0IwYnlCaGRtOXBaRnh1SUNBdkx5QnZkbVZ5Y25keWFYUnBibWNnZDJsMGFDQjVaWFFnWVc1dmRHaGxjaUJnYzJOb1pXUjFiR1ZnTGx4dUlDQnBaaUFvSVhSb2FYTXVZMnh2WTJzdVgyaGhjMFYyWlc1MEtIUm9hWE1wSUNZbUlIUm9hWE11YVhOU1pYQmxZWFJsWkNncElDWW1JQ0YwYUdsekxsOWpiR1ZoY21Wa0tWeHVJQ0FnSUhSb2FYTXVjMk5vWldSMWJHVW9kR2hwY3k1a1pXRmtiR2x1WlNBcklIUm9hWE11Y21Wd1pXRjBWR2x0WlNrZ1hHNTlYRzVjYmk4dklGVndaR0YwWlhNZ1kyRmphR1ZrSUhScGJXVnpYRzVGZG1WdWRDNXdjbTkwYjNSNWNHVXVYM0psWm5KbGMyaEZZWEpzZVV4aGRHVkVZWFJsY3lBOUlHWjFibU4wYVc5dUtDa2dlMXh1SUNCMGFHbHpMbDlzWVhSbGMzUlVhVzFsSUQwZ2RHaHBjeTVrWldGa2JHbHVaU0FySUhSb2FYTXVkRzlzWlhKaGJtTmxUR0YwWlZ4dUlDQjBhR2x6TGw5bFlYSnNhV1Z6ZEZScGJXVWdQU0IwYUdsekxtUmxZV1JzYVc1bElDMGdkR2hwY3k1MGIyeGxjbUZ1WTJWRllYSnNlVnh1ZlZ4dVhHNHZMeUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNCWFFVRkRiRzlqYXlBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXZMMXh1ZG1GeUlGZEJRVU5zYjJOcklEMGdiVzlrZFd4bExtVjRjRzl5ZEhNZ1BTQm1kVzVqZEdsdmJpaGpiMjUwWlhoMExDQnZjSFJ6S1NCN1hHNGdJSFpoY2lCelpXeG1JRDBnZEdocGMxeHVJQ0J2Y0hSeklEMGdiM0IwY3lCOGZDQjdmVnh1SUNCMGFHbHpMblJwWTJ0TlpYUm9iMlFnUFNCdmNIUnpMblJwWTJ0TlpYUm9iMlFnZkh3Z0oxTmpjbWx3ZEZCeWIyTmxjM052Y2s1dlpHVW5YRzRnSUhSb2FYTXVkRzlzWlhKaGJtTmxSV0Z5YkhrZ1BTQnZjSFJ6TG5SdmJHVnlZVzVqWlVWaGNteDVJSHg4SUVOTVQwTkxYMFJGUmtGVlRGUlRMblJ2YkdWeVlXNWpaVVZoY214NVhHNGdJSFJvYVhNdWRHOXNaWEpoYm1ObFRHRjBaU0E5SUc5d2RITXVkRzlzWlhKaGJtTmxUR0YwWlNCOGZDQkRURTlEUzE5RVJVWkJWVXhVVXk1MGIyeGxjbUZ1WTJWTVlYUmxYRzRnSUhSb2FYTXVZMjl1ZEdWNGRDQTlJR052Ym5SbGVIUmNiaUFnZEdocGN5NWZaWFpsYm5SeklEMGdXMTFjYmlBZ2RHaHBjeTVmYzNSaGNuUmxaQ0E5SUdaaGJITmxYRzU5WEc1Y2JpOHZJQzB0TFMwdExTMHRMUzBnVUhWaWJHbGpJRUZRU1NBdExTMHRMUzB0TFMwdElDOHZYRzR2THlCVFkyaGxaSFZzWlhNZ1lHWjFibU5nSUhSdklISjFiaUJoWm5SbGNpQmdaR1ZzWVhsZ0lITmxZMjl1WkhNdVhHNVhRVUZEYkc5amF5NXdjbTkwYjNSNWNHVXVjMlYwVkdsdFpXOTFkQ0E5SUdaMWJtTjBhVzl1S0daMWJtTXNJR1JsYkdGNUtTQjdYRzRnSUhKbGRIVnliaUIwYUdsekxsOWpjbVZoZEdWRmRtVnVkQ2htZFc1akxDQjBhR2x6TGw5aFluTlVhVzFsS0dSbGJHRjVLU2xjYm4xY2JseHVMeThnVTJOb1pXUjFiR1Z6SUdCbWRXNWpZQ0IwYnlCeWRXNGdZbVZtYjNKbElHQmtaV0ZrYkdsdVpXQXVYRzVYUVVGRGJHOWpheTV3Y205MGIzUjVjR1V1WTJGc2JHSmhZMnRCZEZScGJXVWdQU0JtZFc1amRHbHZiaWhtZFc1akxDQmtaV0ZrYkdsdVpTa2dlMXh1SUNCeVpYUjFjbTRnZEdocGN5NWZZM0psWVhSbFJYWmxiblFvWm5WdVl5d2daR1ZoWkd4cGJtVXBYRzU5WEc1Y2JpOHZJRk4wY21WMFkyaGxjeUJnWkdWaFpHeHBibVZnSUdGdVpDQmdjbVZ3WldGMFlDQnZaaUJoYkd3Z2MyTm9aV1IxYkdWa0lHQmxkbVZ1ZEhOZ0lHSjVJR0J5WVhScGIyQXNJR3RsWlhCcGJtZGNiaTh2SUhSb1pXbHlJSEpsYkdGMGFYWmxJR1JwYzNSaGJtTmxJSFJ2SUdCMFVtVm1ZQzRnU1c0Z1ptRmpkQ0IwYUdseklHbHpJR1Z4ZFdsMllXeGxiblFnZEc4Z1kyaGhibWRwYm1jZ2RHaGxJSFJsYlhCdkxseHVWMEZCUTJ4dlkyc3VjSEp2ZEc5MGVYQmxMblJwYldWVGRISmxkR05vSUQwZ1puVnVZM1JwYjI0b2RGSmxaaXdnWlhabGJuUnpMQ0J5WVhScGJ5a2dlMXh1SUNCbGRtVnVkSE11Wm05eVJXRmphQ2htZFc1amRHbHZiaWhsZG1WdWRDa2dleUJsZG1WdWRDNTBhVzFsVTNSeVpYUmphQ2gwVW1WbUxDQnlZWFJwYnlrZ2ZTbGNiaUFnY21WMGRYSnVJR1YyWlc1MGMxeHVmVnh1WEc0dkx5QlNaVzF2ZG1WeklHRnNiQ0J6WTJobFpIVnNaV1FnWlhabGJuUnpJR0Z1WkNCemRHRnlkSE1nZEdobElHTnNiMk5ySUZ4dVYwRkJRMnh2WTJzdWNISnZkRzkwZVhCbExuTjBZWEowSUQwZ1puVnVZM1JwYjI0b0tTQjdYRzRnSUdsbUlDaDBhR2x6TGw5emRHRnlkR1ZrSUQwOVBTQm1ZV3h6WlNrZ2UxeHVJQ0FnSUhaaGNpQnpaV3htSUQwZ2RHaHBjMXh1SUNBZ0lIUm9hWE11WDNOMFlYSjBaV1FnUFNCMGNuVmxYRzRnSUNBZ2RHaHBjeTVmWlhabGJuUnpJRDBnVzExY2JseHVJQ0FnSUdsbUlDaDBhR2x6TG5ScFkydE5aWFJvYjJRZ1BUMDlJQ2RUWTNKcGNIUlFjbTlqWlhOemIzSk9iMlJsSnlrZ2UxeHVJQ0FnSUNBZ2RtRnlJR0oxWm1abGNsTnBlbVVnUFNBeU5UWmNiaUFnSUNBZ0lDOHZJRmRsSUdoaGRtVWdkRzhnYTJWbGNDQmhJSEpsWm1WeVpXNWpaU0IwYnlCMGFHVWdibTlrWlNCMGJ5QmhkbTlwWkNCbllYSmlZV2RsSUdOdmJHeGxZM1JwYjI1Y2JpQWdJQ0FnSUhSb2FYTXVYMk5zYjJOclRtOWtaU0E5SUhSb2FYTXVZMjl1ZEdWNGRDNWpjbVZoZEdWVFkzSnBjSFJRY205alpYTnpiM0lvWW5WbVptVnlVMmw2WlN3Z01Td2dNU2xjYmlBZ0lDQWdJSFJvYVhNdVgyTnNiMk5yVG05a1pTNWpiMjV1WldOMEtIUm9hWE11WTI5dWRHVjRkQzVrWlhOMGFXNWhkR2x2YmlsY2JpQWdJQ0FnSUhSb2FYTXVYMk5zYjJOclRtOWtaUzV2Ym1GMVpHbHZjSEp2WTJWemN5QTlJR1oxYm1OMGFXOXVJQ2dwSUh0Y2JpQWdJQ0FnSUNBZ2NISnZZMlZ6Y3k1dVpYaDBWR2xqYXlobWRXNWpkR2x2YmlncElIc2djMlZzWmk1ZmRHbGpheWdwSUgwcFhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlNCbGJITmxJR2xtSUNoMGFHbHpMblJwWTJ0TlpYUm9iMlFnUFQwOUlDZHRZVzUxWVd3bktTQnVkV3hzSUM4dklGOTBhV05ySUdseklHTmhiR3hsWkNCdFlXNTFZV3hzZVZ4dVhHNGdJQ0FnWld4elpTQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0oybHVkbUZzYVdRZ2RHbGphMDFsZEdodlpDQW5JQ3NnZEdocGN5NTBhV05yVFdWMGFHOWtLVnh1SUNCOVhHNTlYRzVjYmk4dklGTjBiM0J6SUhSb1pTQmpiRzlqYTF4dVYwRkJRMnh2WTJzdWNISnZkRzkwZVhCbExuTjBiM0FnUFNCbWRXNWpkR2x2YmlncElIdGNiaUFnYVdZZ0tIUm9hWE11WDNOMFlYSjBaV1FnUFQwOUlIUnlkV1VwSUh0Y2JpQWdJQ0IwYUdsekxsOXpkR0Z5ZEdWa0lEMGdabUZzYzJWY2JpQWdJQ0IwYUdsekxsOWpiRzlqYTA1dlpHVXVaR2x6WTI5dWJtVmpkQ2dwWEc0Z0lIMGdJRnh1ZlZ4dVhHNHZMeUF0TFMwdExTMHRMUzB0SUZCeWFYWmhkR1VnTFMwdExTMHRMUzB0TFNBdkwxeHVYRzR2THlCVWFHbHpJR1oxYm1OMGFXOXVJR2x6SUhKaGJpQndaWEpwYjJScFkyRnNiSGtzSUdGdVpDQmhkQ0JsWVdOb0lIUnBZMnNnYVhRZ1pYaGxZM1YwWlhOY2JpOHZJR1YyWlc1MGN5Qm1iM0lnZDJocFkyZ2dZR04xY25KbGJuUlVhVzFsWUNCcGN5QnBibU5zZFdSbFpDQnBiaUIwYUdWcGNpQjBiMnhsY21GdVkyVWdhVzUwWlhKMllXd3VYRzVYUVVGRGJHOWpheTV3Y205MGIzUjVjR1V1WDNScFkyc2dQU0JtZFc1amRHbHZiaWdwSUh0Y2JpQWdkbUZ5SUdWMlpXNTBJRDBnZEdocGN5NWZaWFpsYm5SekxuTm9hV1owS0NsY2JseHVJQ0IzYUdsc1pTaGxkbVZ1ZENBbUppQmxkbVZ1ZEM1ZlpXRnliR2xsYzNSVWFXMWxJRHc5SUhSb2FYTXVZMjl1ZEdWNGRDNWpkWEp5Wlc1MFZHbHRaU2tnZTF4dUlDQWdJR1YyWlc1MExsOWxlR1ZqZFhSbEtDbGNiaUFnSUNCbGRtVnVkQ0E5SUhSb2FYTXVYMlYyWlc1MGN5NXphR2xtZENncFhHNGdJSDFjYmx4dUlDQXZMeUJRZFhRZ1ltRmpheUIwYUdVZ2JHRnpkQ0JsZG1WdWRGeHVJQ0JwWmlobGRtVnVkQ2tnZEdocGN5NWZaWFpsYm5SekxuVnVjMmhwWm5Rb1pYWmxiblFwWEc1OVhHNWNiaTh2SUVOeVpXRjBaWE1nWVc0Z1pYWmxiblFnWVc1a0lHbHVjMlZ5ZENCcGRDQjBieUIwYUdVZ2JHbHpkRnh1VjBGQlEyeHZZMnN1Y0hKdmRHOTBlWEJsTGw5amNtVmhkR1ZGZG1WdWRDQTlJR1oxYm1OMGFXOXVLR1oxYm1Nc0lHUmxZV1JzYVc1bEtTQjdYRzRnSUhKbGRIVnliaUJ1WlhjZ1JYWmxiblFvZEdocGN5d2daR1ZoWkd4cGJtVXNJR1oxYm1NcFhHNTlYRzVjYmk4dklFbHVjMlZ5ZEhNZ1lXNGdaWFpsYm5RZ2RHOGdkR2hsSUd4cGMzUmNibGRCUVVOc2IyTnJMbkJ5YjNSdmRIbHdaUzVmYVc1elpYSjBSWFpsYm5RZ1BTQm1kVzVqZEdsdmJpaGxkbVZ1ZENrZ2UxeHVJQ0IwYUdsekxsOWxkbVZ1ZEhNdWMzQnNhV05sS0hSb2FYTXVYMmx1WkdWNFFubFVhVzFsS0dWMlpXNTBMbDlsWVhKc2FXVnpkRlJwYldVcExDQXdMQ0JsZG1WdWRDbGNibjFjYmx4dUx5OGdVbVZ0YjNabGN5QmhiaUJsZG1WdWRDQm1jbTl0SUhSb1pTQnNhWE4wWEc1WFFVRkRiRzlqYXk1d2NtOTBiM1I1Y0dVdVgzSmxiVzkyWlVWMlpXNTBJRDBnWm5WdVkzUnBiMjRvWlhabGJuUXBJSHRjYmlBZ2RtRnlJR2x1WkNBOUlIUm9hWE11WDJWMlpXNTBjeTVwYm1SbGVFOW1LR1YyWlc1MEtWeHVJQ0JwWmlBb2FXNWtJQ0U5UFNBdE1Ta2dkR2hwY3k1ZlpYWmxiblJ6TG5Od2JHbGpaU2hwYm1Rc0lERXBYRzU5WEc1Y2JpOHZJRkpsZEhWeWJuTWdkSEoxWlNCcFppQmdaWFpsYm5SZ0lHbHpJR2x1SUhGMVpYVmxMQ0JtWVd4elpTQnZkR2hsY25kcGMyVmNibGRCUVVOc2IyTnJMbkJ5YjNSdmRIbHdaUzVmYUdGelJYWmxiblFnUFNCbWRXNWpkR2x2YmlobGRtVnVkQ2tnZTF4dUlISmxkSFZ5YmlCMGFHbHpMbDlsZG1WdWRITXVhVzVrWlhoUFppaGxkbVZ1ZENrZ0lUMDlJQzB4WEc1OVhHNWNiaTh2SUZKbGRIVnlibk1nZEdobElHbHVaR1Y0SUc5bUlIUm9aU0JtYVhKemRDQmxkbVZ1ZENCM2FHOXpaU0JrWldGa2JHbHVaU0JwY3lBK1BTQjBieUJnWkdWaFpHeHBibVZnWEc1WFFVRkRiRzlqYXk1d2NtOTBiM1I1Y0dVdVgybHVaR1Y0UW5sVWFXMWxJRDBnWm5WdVkzUnBiMjRvWkdWaFpHeHBibVVwSUh0Y2JpQWdMeThnY0dWeVptOXliWE1nWVNCaWFXNWhjbmtnYzJWaGNtTm9YRzRnSUhaaGNpQnNiM2NnUFNBd1hHNGdJQ0FnTENCb2FXZG9JRDBnZEdocGN5NWZaWFpsYm5SekxteGxibWQwYUZ4dUlDQWdJQ3dnYldsa1hHNGdJSGRvYVd4bElDaHNiM2NnUENCb2FXZG9LU0I3WEc0Z0lDQWdiV2xrSUQwZ1RXRjBhQzVtYkc5dmNpZ29iRzkzSUNzZ2FHbG5hQ2tnTHlBeUtWeHVJQ0FnSUdsbUlDaDBhR2x6TGw5bGRtVnVkSE5iYldsa1hTNWZaV0Z5YkdsbGMzUlVhVzFsSUR3Z1pHVmhaR3hwYm1VcFhHNGdJQ0FnSUNCc2IzY2dQU0J0YVdRZ0t5QXhYRzRnSUNBZ1pXeHpaU0JvYVdkb0lEMGdiV2xrWEc0Z0lIMWNiaUFnY21WMGRYSnVJR3h2ZDF4dWZWeHVYRzR2THlCRGIyNTJaWEowY3lCbWNtOXRJSEpsYkdGMGFYWmxJSFJwYldVZ2RHOGdZV0p6YjJ4MWRHVWdkR2x0WlZ4dVYwRkJRMnh2WTJzdWNISnZkRzkwZVhCbExsOWhZbk5VYVcxbElEMGdablZ1WTNScGIyNG9jbVZzVkdsdFpTa2dlMXh1SUNCeVpYUjFjbTRnY21Wc1ZHbHRaU0FySUhSb2FYTXVZMjl1ZEdWNGRDNWpkWEp5Wlc1MFZHbHRaVnh1ZlZ4dVhHNHZMeUJEYjI1MlpYSjBjeUJtY205dElHRmljMjlzZFhSbElIUnBiV1VnZEc4Z2NtVnNZWFJwZG1VZ2RHbHRaU0JjYmxkQlFVTnNiMk5yTG5CeWIzUnZkSGx3WlM1ZmNtVnNWR2x0WlNBOUlHWjFibU4wYVc5dUtHRmljMVJwYldVcElIdGNiaUFnY21WMGRYSnVJR0ZpYzFScGJXVWdMU0IwYUdsekxtTnZiblJsZUhRdVkzVnljbVZ1ZEZScGJXVmNibjFjYmx4dVhHNHZMeTh2THk4dkx5OHZMeTh2THk4dkx5OWNiaTh2SUZkRlFsQkJRMHNnUms5UFZFVlNYRzR2THlBdUwzNHZkMkZoWTJ4dlkyc3ZiR2xpTDFkQlFVTnNiMk5yTG1welhHNHZMeUJ0YjJSMWJHVWdhV1FnUFNBME0xeHVMeThnYlc5a2RXeGxJR05vZFc1cmN5QTlJREFpTENJdkx5QnphR2x0SUdadmNpQjFjMmx1WnlCd2NtOWpaWE56SUdsdUlHSnliM2R6WlhKY2JuWmhjaUJ3Y205alpYTnpJRDBnYlc5a2RXeGxMbVY0Y0c5eWRITWdQU0I3ZlR0Y2JseHVMeThnWTJGamFHVmtJR1p5YjIwZ2QyaGhkR1YyWlhJZ1oyeHZZbUZzSUdseklIQnlaWE5sYm5RZ2MyOGdkR2hoZENCMFpYTjBJSEoxYm01bGNuTWdkR2hoZENCemRIVmlJR2wwWEc0dkx5QmtiMjRuZENCaWNtVmhheUIwYUdsdVozTXVJQ0JDZFhRZ2QyVWdibVZsWkNCMGJ5QjNjbUZ3SUdsMElHbHVJR0VnZEhKNUlHTmhkR05vSUdsdUlHTmhjMlVnYVhRZ2FYTmNiaTh2SUhkeVlYQndaV1FnYVc0Z2MzUnlhV04wSUcxdlpHVWdZMjlrWlNCM2FHbGphQ0JrYjJWemJpZDBJR1JsWm1sdVpTQmhibmtnWjJ4dlltRnNjeTRnSUVsMEozTWdhVzV6YVdSbElHRmNiaTh2SUdaMWJtTjBhVzl1SUdKbFkyRjFjMlVnZEhKNUwyTmhkR05vWlhNZ1pHVnZjSFJwYldsNlpTQnBiaUJqWlhKMFlXbHVJR1Z1WjJsdVpYTXVYRzVjYm5aaGNpQmpZV05vWldSVFpYUlVhVzFsYjNWME8xeHVkbUZ5SUdOaFkyaGxaRU5zWldGeVZHbHRaVzkxZER0Y2JseHVablZ1WTNScGIyNGdaR1ZtWVhWc2RGTmxkRlJwYlc5MWRDZ3BJSHRjYmlBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0ozTmxkRlJwYldWdmRYUWdhR0Z6SUc1dmRDQmlaV1Z1SUdSbFptbHVaV1FuS1R0Y2JuMWNibVoxYm1OMGFXOXVJR1JsWm1GMWJIUkRiR1ZoY2xScGJXVnZkWFFnS0NrZ2UxeHVJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduWTJ4bFlYSlVhVzFsYjNWMElHaGhjeUJ1YjNRZ1ltVmxiaUJrWldacGJtVmtKeWs3WEc1OVhHNG9ablZ1WTNScGIyNGdLQ2tnZTF4dUlDQWdJSFJ5ZVNCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2gwZVhCbGIyWWdjMlYwVkdsdFpXOTFkQ0E5UFQwZ0oyWjFibU4wYVc5dUp5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyRmphR1ZrVTJWMFZHbHRaVzkxZENBOUlITmxkRlJwYldWdmRYUTdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCallXTm9aV1JUWlhSVWFXMWxiM1YwSUQwZ1pHVm1ZWFZzZEZObGRGUnBiVzkxZER0Y2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNBZ0lDQWdZMkZqYUdWa1UyVjBWR2x0Wlc5MWRDQTlJR1JsWm1GMWJIUlRaWFJVYVcxdmRYUTdYRzRnSUNBZ2ZWeHVJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJR2xtSUNoMGVYQmxiMllnWTJ4bFlYSlVhVzFsYjNWMElEMDlQU0FuWm5WdVkzUnBiMjRuS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JqWVdOb1pXUkRiR1ZoY2xScGJXVnZkWFFnUFNCamJHVmhjbFJwYldWdmRYUTdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCallXTm9aV1JEYkdWaGNsUnBiV1Z2ZFhRZ1BTQmtaV1poZFd4MFEyeGxZWEpVYVcxbGIzVjBPMXh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdmU0JqWVhSamFDQW9aU2tnZTF4dUlDQWdJQ0FnSUNCallXTm9aV1JEYkdWaGNsUnBiV1Z2ZFhRZ1BTQmtaV1poZFd4MFEyeGxZWEpVYVcxbGIzVjBPMXh1SUNBZ0lIMWNibjBnS0NrcFhHNW1kVzVqZEdsdmJpQnlkVzVVYVcxbGIzVjBLR1oxYmlrZ2UxeHVJQ0FnSUdsbUlDaGpZV05vWldSVFpYUlVhVzFsYjNWMElEMDlQU0J6WlhSVWFXMWxiM1YwS1NCN1hHNGdJQ0FnSUNBZ0lDOHZibTl5YldGc0lHVnVkbWx5YjIxbGJuUnpJR2x1SUhOaGJtVWdjMmwwZFdGMGFXOXVjMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdjMlYwVkdsdFpXOTFkQ2htZFc0c0lEQXBPMXh1SUNBZ0lIMWNiaUFnSUNBdkx5QnBaaUJ6WlhSVWFXMWxiM1YwSUhkaGMyNG5kQ0JoZG1GcGJHRmliR1VnWW5WMElIZGhjeUJzWVhSMFpYSWdaR1ZtYVc1bFpGeHVJQ0FnSUdsbUlDZ29ZMkZqYUdWa1UyVjBWR2x0Wlc5MWRDQTlQVDBnWkdWbVlYVnNkRk5sZEZScGJXOTFkQ0I4ZkNBaFkyRmphR1ZrVTJWMFZHbHRaVzkxZENrZ0ppWWdjMlYwVkdsdFpXOTFkQ2tnZTF4dUlDQWdJQ0FnSUNCallXTm9aV1JUWlhSVWFXMWxiM1YwSUQwZ2MyVjBWR2x0Wlc5MWREdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlITmxkRlJwYldWdmRYUW9ablZ1TENBd0tUdGNiaUFnSUNCOVhHNGdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lDQWdMeThnZDJobGJpQjNhR1Z1SUhOdmJXVmliMlI1SUdoaGN5QnpZM0psZDJWa0lIZHBkR2dnYzJWMFZHbHRaVzkxZENCaWRYUWdibThnU1M1RkxpQnRZV1JrYm1WemMxeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyRmphR1ZrVTJWMFZHbHRaVzkxZENobWRXNHNJREFwTzF4dUlDQWdJSDBnWTJGMFkyZ29aU2w3WEc0Z0lDQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBdkx5QlhhR1Z1SUhkbElHRnlaU0JwYmlCSkxrVXVJR0oxZENCMGFHVWdjMk55YVhCMElHaGhjeUJpWldWdUlHVjJZV3hsWkNCemJ5QkpMa1V1SUdSdlpYTnVKM1FnZEhKMWMzUWdkR2hsSUdkc2IySmhiQ0J2WW1wbFkzUWdkMmhsYmlCallXeHNaV1FnYm05eWJXRnNiSGxjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlCallXTm9aV1JUWlhSVWFXMWxiM1YwTG1OaGJHd29iblZzYkN3Z1puVnVMQ0F3S1R0Y2JpQWdJQ0FnSUNBZ2ZTQmpZWFJqYUNobEtYdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklITmhiV1VnWVhNZ1lXSnZkbVVnWW5WMElIZG9aVzRnYVhRbmN5QmhJSFpsY25OcGIyNGdiMllnU1M1RkxpQjBhR0YwSUcxMWMzUWdhR0YyWlNCMGFHVWdaMnh2WW1Gc0lHOWlhbVZqZENCbWIzSWdKM1JvYVhNbkxDQm9iM0JtZFd4c2VTQnZkWElnWTI5dWRHVjRkQ0JqYjNKeVpXTjBJRzkwYUdWeWQybHpaU0JwZENCM2FXeHNJSFJvY205M0lHRWdaMnh2WW1Gc0lHVnljbTl5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1kyRmphR1ZrVTJWMFZHbHRaVzkxZEM1allXeHNLSFJvYVhNc0lHWjFiaXdnTUNrN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOVhHNWNibHh1ZlZ4dVpuVnVZM1JwYjI0Z2NuVnVRMnhsWVhKVWFXMWxiM1YwS0cxaGNtdGxjaWtnZTF4dUlDQWdJR2xtSUNoallXTm9aV1JEYkdWaGNsUnBiV1Z2ZFhRZ1BUMDlJR05zWldGeVZHbHRaVzkxZENrZ2UxeHVJQ0FnSUNBZ0lDQXZMMjV2Y20xaGJDQmxiblpwY205dFpXNTBjeUJwYmlCellXNWxJSE5wZEhWaGRHbHZibk5jYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR05zWldGeVZHbHRaVzkxZENodFlYSnJaWElwTzF4dUlDQWdJSDFjYmlBZ0lDQXZMeUJwWmlCamJHVmhjbFJwYldWdmRYUWdkMkZ6YmlkMElHRjJZV2xzWVdKc1pTQmlkWFFnZDJGeklHeGhkSFJsY2lCa1pXWnBibVZrWEc0Z0lDQWdhV1lnS0NoallXTm9aV1JEYkdWaGNsUnBiV1Z2ZFhRZ1BUMDlJR1JsWm1GMWJIUkRiR1ZoY2xScGJXVnZkWFFnZkh3Z0lXTmhZMmhsWkVOc1pXRnlWR2x0Wlc5MWRDa2dKaVlnWTJ4bFlYSlVhVzFsYjNWMEtTQjdYRzRnSUNBZ0lDQWdJR05oWTJobFpFTnNaV0Z5VkdsdFpXOTFkQ0E5SUdOc1pXRnlWR2x0Wlc5MWREdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlHTnNaV0Z5VkdsdFpXOTFkQ2h0WVhKclpYSXBPMXh1SUNBZ0lIMWNiaUFnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0F2THlCM2FHVnVJSGRvWlc0Z2MyOXRaV0p2WkhrZ2FHRnpJSE5qY21WM1pXUWdkMmwwYUNCelpYUlVhVzFsYjNWMElHSjFkQ0J1YnlCSkxrVXVJRzFoWkdSdVpYTnpYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQmpZV05vWldSRGJHVmhjbFJwYldWdmRYUW9iV0Z5YTJWeUtUdGNiaUFnSUNCOUlHTmhkR05vSUNobEtYdGNiaUFnSUNBZ0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQzh2SUZkb1pXNGdkMlVnWVhKbElHbHVJRWt1UlM0Z1luVjBJSFJvWlNCelkzSnBjSFFnYUdGeklHSmxaVzRnWlhaaGJHVmtJSE52SUVrdVJTNGdaRzlsYzI0bmRDQWdkSEoxYzNRZ2RHaGxJR2RzYjJKaGJDQnZZbXBsWTNRZ2QyaGxiaUJqWVd4c1pXUWdibTl5YldGc2JIbGNiaUFnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUJqWVdOb1pXUkRiR1ZoY2xScGJXVnZkWFF1WTJGc2JDaHVkV3hzTENCdFlYSnJaWElwTzF4dUlDQWdJQ0FnSUNCOUlHTmhkR05vSUNobEtYdGNiaUFnSUNBZ0lDQWdJQ0FnSUM4dklITmhiV1VnWVhNZ1lXSnZkbVVnWW5WMElIZG9aVzRnYVhRbmN5QmhJSFpsY25OcGIyNGdiMllnU1M1RkxpQjBhR0YwSUcxMWMzUWdhR0YyWlNCMGFHVWdaMnh2WW1Gc0lHOWlhbVZqZENCbWIzSWdKM1JvYVhNbkxDQm9iM0JtZFd4c2VTQnZkWElnWTI5dWRHVjRkQ0JqYjNKeVpXTjBJRzkwYUdWeWQybHpaU0JwZENCM2FXeHNJSFJvY205M0lHRWdaMnh2WW1Gc0lHVnljbTl5TGx4dUlDQWdJQ0FnSUNBZ0lDQWdMeThnVTI5dFpTQjJaWEp6YVc5dWN5QnZaaUJKTGtVdUlHaGhkbVVnWkdsbVptVnlaVzUwSUhKMWJHVnpJR1p2Y2lCamJHVmhjbFJwYldWdmRYUWdkbk1nYzJWMFZHbHRaVzkxZEZ4dUlDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlHTmhZMmhsWkVOc1pXRnlWR2x0Wlc5MWRDNWpZV3hzS0hSb2FYTXNJRzFoY210bGNpazdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmx4dVhHNTlYRzUyWVhJZ2NYVmxkV1VnUFNCYlhUdGNiblpoY2lCa2NtRnBibWx1WnlBOUlHWmhiSE5sTzF4dWRtRnlJR04xY25KbGJuUlJkV1YxWlR0Y2JuWmhjaUJ4ZFdWMVpVbHVaR1Y0SUQwZ0xURTdYRzVjYm1aMWJtTjBhVzl1SUdOc1pXRnVWWEJPWlhoMFZHbGpheWdwSUh0Y2JpQWdJQ0JwWmlBb0lXUnlZV2x1YVc1bklIeDhJQ0ZqZFhKeVpXNTBVWFZsZFdVcElIdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdU8xeHVJQ0FnSUgxY2JpQWdJQ0JrY21GcGJtbHVaeUE5SUdaaGJITmxPMXh1SUNBZ0lHbG1JQ2hqZFhKeVpXNTBVWFZsZFdVdWJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNBZ0lIRjFaWFZsSUQwZ1kzVnljbVZ1ZEZGMVpYVmxMbU52Ym1OaGRDaHhkV1YxWlNrN1hHNGdJQ0FnZlNCbGJITmxJSHRjYmlBZ0lDQWdJQ0FnY1hWbGRXVkpibVJsZUNBOUlDMHhPMXh1SUNBZ0lIMWNiaUFnSUNCcFppQW9jWFZsZFdVdWJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNBZ0lHUnlZV2x1VVhWbGRXVW9LVHRjYmlBZ0lDQjlYRzU5WEc1Y2JtWjFibU4wYVc5dUlHUnlZV2x1VVhWbGRXVW9LU0I3WEc0Z0lDQWdhV1lnS0dSeVlXbHVhVzVuS1NCN1hHNGdJQ0FnSUNBZ0lISmxkSFZ5Ymp0Y2JpQWdJQ0I5WEc0Z0lDQWdkbUZ5SUhScGJXVnZkWFFnUFNCeWRXNVVhVzFsYjNWMEtHTnNaV0Z1VlhCT1pYaDBWR2xqYXlrN1hHNGdJQ0FnWkhKaGFXNXBibWNnUFNCMGNuVmxPMXh1WEc0Z0lDQWdkbUZ5SUd4bGJpQTlJSEYxWlhWbExteGxibWQwYUR0Y2JpQWdJQ0IzYUdsc1pTaHNaVzRwSUh0Y2JpQWdJQ0FnSUNBZ1kzVnljbVZ1ZEZGMVpYVmxJRDBnY1hWbGRXVTdYRzRnSUNBZ0lDQWdJSEYxWlhWbElEMGdXMTA3WEc0Z0lDQWdJQ0FnSUhkb2FXeGxJQ2dySzNGMVpYVmxTVzVrWlhnZ1BDQnNaVzRwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNoamRYSnlaVzUwVVhWbGRXVXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqZFhKeVpXNTBVWFZsZFdWYmNYVmxkV1ZKYm1SbGVGMHVjblZ1S0NrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2NYVmxkV1ZKYm1SbGVDQTlJQzB4TzF4dUlDQWdJQ0FnSUNCc1pXNGdQU0J4ZFdWMVpTNXNaVzVuZEdnN1hHNGdJQ0FnZlZ4dUlDQWdJR04xY25KbGJuUlJkV1YxWlNBOUlHNTFiR3c3WEc0Z0lDQWdaSEpoYVc1cGJtY2dQU0JtWVd4elpUdGNiaUFnSUNCeWRXNURiR1ZoY2xScGJXVnZkWFFvZEdsdFpXOTFkQ2s3WEc1OVhHNWNibkJ5YjJObGMzTXVibVY0ZEZScFkyc2dQU0JtZFc1amRHbHZiaUFvWm5WdUtTQjdYRzRnSUNBZ2RtRnlJR0Z5WjNNZ1BTQnVaWGNnUVhKeVlYa29ZWEpuZFcxbGJuUnpMbXhsYm1kMGFDQXRJREVwTzF4dUlDQWdJR2xtSUNoaGNtZDFiV1Z1ZEhNdWJHVnVaM1JvSUQ0Z01Ta2dlMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tIWmhjaUJwSUQwZ01Uc2dhU0E4SUdGeVozVnRaVzUwY3k1c1pXNW5kR2c3SUdrckt5a2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1lYSm5jMXRwSUMwZ01WMGdQU0JoY21kMWJXVnVkSE5iYVYwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY1hWbGRXVXVjSFZ6YUNodVpYY2dTWFJsYlNobWRXNHNJR0Z5WjNNcEtUdGNiaUFnSUNCcFppQW9jWFZsZFdVdWJHVnVaM1JvSUQwOVBTQXhJQ1ltSUNGa2NtRnBibWx1WnlrZ2UxeHVJQ0FnSUNBZ0lDQnlkVzVVYVcxbGIzVjBLR1J5WVdsdVVYVmxkV1VwTzF4dUlDQWdJSDFjYm4wN1hHNWNiaTh2SUhZNElHeHBhMlZ6SUhCeVpXUnBZM1JwWW14bElHOWlhbVZqZEhOY2JtWjFibU4wYVc5dUlFbDBaVzBvWm5WdUxDQmhjbkpoZVNrZ2UxeHVJQ0FnSUhSb2FYTXVablZ1SUQwZ1puVnVPMXh1SUNBZ0lIUm9hWE11WVhKeVlYa2dQU0JoY25KaGVUdGNibjFjYmtsMFpXMHVjSEp2ZEc5MGVYQmxMbkoxYmlBOUlHWjFibU4wYVc5dUlDZ3BJSHRjYmlBZ0lDQjBhR2x6TG1aMWJpNWhjSEJzZVNodWRXeHNMQ0IwYUdsekxtRnljbUY1S1R0Y2JuMDdYRzV3Y205alpYTnpMblJwZEd4bElEMGdKMkp5YjNkelpYSW5PMXh1Y0hKdlkyVnpjeTVpY205M2MyVnlJRDBnZEhKMVpUdGNibkJ5YjJObGMzTXVaVzUySUQwZ2UzMDdYRzV3Y205alpYTnpMbUZ5WjNZZ1BTQmJYVHRjYm5CeWIyTmxjM011ZG1WeWMybHZiaUE5SUNjbk95QXZMeUJsYlhCMGVTQnpkSEpwYm1jZ2RHOGdZWFp2YVdRZ2NtVm5aWGh3SUdsemMzVmxjMXh1Y0hKdlkyVnpjeTUyWlhKemFXOXVjeUE5SUh0OU8xeHVYRzVtZFc1amRHbHZiaUJ1YjI5d0tDa2dlMzFjYmx4dWNISnZZMlZ6Y3k1dmJpQTlJRzV2YjNBN1hHNXdjbTlqWlhOekxtRmtaRXhwYzNSbGJtVnlJRDBnYm05dmNEdGNibkJ5YjJObGMzTXViMjVqWlNBOUlHNXZiM0E3WEc1d2NtOWpaWE56TG05bVppQTlJRzV2YjNBN1hHNXdjbTlqWlhOekxuSmxiVzkyWlV4cGMzUmxibVZ5SUQwZ2JtOXZjRHRjYm5CeWIyTmxjM011Y21WdGIzWmxRV3hzVEdsemRHVnVaWEp6SUQwZ2JtOXZjRHRjYm5CeWIyTmxjM011WlcxcGRDQTlJRzV2YjNBN1hHNXdjbTlqWlhOekxuQnlaWEJsYm1STWFYTjBaVzVsY2lBOUlHNXZiM0E3WEc1d2NtOWpaWE56TG5CeVpYQmxibVJQYm1ObFRHbHpkR1Z1WlhJZ1BTQnViMjl3TzF4dVhHNXdjbTlqWlhOekxteHBjM1JsYm1WeWN5QTlJR1oxYm1OMGFXOXVJQ2h1WVcxbEtTQjdJSEpsZEhWeWJpQmJYU0I5WEc1Y2JuQnliMk5sYzNNdVltbHVaR2x1WnlBOUlHWjFibU4wYVc5dUlDaHVZVzFsS1NCN1hHNGdJQ0FnZEdoeWIzY2dibVYzSUVWeWNtOXlLQ2R3Y205alpYTnpMbUpwYm1ScGJtY2dhWE1nYm05MElITjFjSEJ2Y25SbFpDY3BPMXh1ZlR0Y2JseHVjSEp2WTJWemN5NWpkMlFnUFNCbWRXNWpkR2x2YmlBb0tTQjdJSEpsZEhWeWJpQW5MeWNnZlR0Y2JuQnliMk5sYzNNdVkyaGthWElnUFNCbWRXNWpkR2x2YmlBb1pHbHlLU0I3WEc0Z0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZHdjbTlqWlhOekxtTm9aR2x5SUdseklHNXZkQ0J6ZFhCd2IzSjBaV1FuS1R0Y2JuMDdYRzV3Y205alpYTnpMblZ0WVhOcklEMGdablZ1WTNScGIyNG9LU0I3SUhKbGRIVnliaUF3T3lCOU8xeHVYRzVjYmx4dUx5OHZMeTh2THk4dkx5OHZMeTh2THk4dlhHNHZMeUJYUlVKUVFVTkxJRVpQVDFSRlVseHVMeThnTGk5K0wzQnliMk5sYzNNdlluSnZkM05sY2k1cWMxeHVMeThnYlc5a2RXeGxJR2xrSUQwZ05EUmNiaTh2SUcxdlpIVnNaU0JqYUhWdWEzTWdQU0F3SWl3aUozVnpaU0J6ZEhKcFkzUW5PMXh1WEc1cGJYQnZjblFnZXlCamJHOWpheUI5SUdaeWIyMGdKeTR1TDIxaGFXNG5PMXh1WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JqYkdGemN5QkpiblJsY25aaGJDQjdYRzVjYmlBZ1kyOXVjM1J5ZFdOMGIzSW9jbUYwWlN4bWRXNWpMRzl1S1NCN1hHNWNiaUFnSUNCMGFHbHpMbkpoZEdVZ1BTQnlZWFJsTzF4dUlDQWdJSFJvYVhNdWIyNGdQU0J2Ymp0Y2JpQWdJQ0IwYUdsekxtTnNiMk5ySUQwZ1kyeHZZMnNvS1RzZ0x5OGdhbk5vYVc1MElHbG5ibTl5WlRwc2FXNWxYRzVjYmlBZ0lDQjBhR2x6TG5CaGRIUmxjbTRnUFNCYk1WMDdYRzRnSUNBZ2RHaHBjeTVwYm1SbGVDQTlJREE3WEc1Y2JpQWdJQ0IwYUdsekxtVjJaVzUwSUQwZ1puVnVZeUEvSUdaMWJtTWdPaUJtZFc1amRHbHZiaWdwSUhzZ2ZUdGNibHh1SUNBZ0lHbG1JQ2gwYUdsekxtOXVLU0I3WEc0Z0lDQWdJQ0IwYUdsekxuTjBZWEowS0NrN1hHNGdJQ0FnZlZ4dVhHNGdJSDFjYmx4dUlDQmZaWFpsYm5Rb1pTa2dlMXh1SUNBdkx5QWdhV1lnS0hSb2FYTXVjR0YwZEdWeWJsdDBhR2x6TG1sdVpHVjRKWFJvYVhNdWNHRjBkR1Z5Ymk1c1pXNW5kR2hkS1NCN1hHNGdJQ0FnSUNCMGFHbHpMbVYyWlc1MEtHVXBPMXh1SUNBdkx5QWdmVnh1SUNBZ0lIUm9hWE11YVc1a1pYZ3JLenRjYmlBZ2ZWeHVYRzRnSUhOMGIzQW9LU0I3WEc0Z0lDQWdkR2hwY3k1dmJpQTlJR1poYkhObE8xeHVJQ0FnSUhSb2FYTXVhVzUwWlhKMllXd3VZMnhsWVhJb0tUdGNiaUFnZlZ4dVhHNGdJSE4wWVhKMEtDa2dlMXh1SUNBZ0lIUm9hWE11YjI0Z1BTQjBjblZsTzF4dUlDQWdJSFJvYVhNdWFXNTBaWEoyWVd3Z1BTQjBhR2x6TG1Oc2IyTnJMbU5oYkd4aVlXTnJRWFJVYVcxbEtIUm9hWE11WDJWMlpXNTBMbUpwYm1Rb2RHaHBjeWtzSUhSb2FYTXVZMnh2WTJzdVkyOXVkR1Y0ZEM1amRYSnlaVzUwVkdsdFpTa3VjbVZ3WldGMEtIUm9hWE11Y21GMFpTOHhNREF3S1M1MGIyeGxjbUZ1WTJVb2UyVmhjbXg1T2lBd0xqRXNJR3hoZEdVNk1YMHBPMXh1SUNCOVhHNWNiaUFnYlhNb2JtVjNjbUYwWlNrZ2UxeHVJQ0FnSUdsbUlDaDBhR2x6TG05dUtTQjdYRzRnSUNBZ0lDQjJZWElnY21GMGFXOGdQU0J1WlhkeVlYUmxMM1JvYVhNdWNtRjBaVHRjYmlBZ0lDQWdJSFJvYVhNdWNtRjBaU0E5SUc1bGQzSmhkR1U3WEc0Z0lDQWdJQ0IwYUdsekxtTnNiMk5yTG5ScGJXVlRkSEpsZEdOb0tIUm9hWE11WTJ4dlkyc3VZMjl1ZEdWNGRDNWpkWEp5Wlc1MFZHbHRaU3dnVzNSb2FYTXVhVzUwWlhKMllXeGRMQ0J5WVhScGJ5azdYRzRnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUhSb2FYTXVjbUYwWlNBOUlHNWxkM0poZEdVN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYm4xY2JseHVYRzVjYmk4dklGZEZRbEJCUTBzZ1JrOVBWRVZTSUM4dlhHNHZMeUF1TDM0dmFuTm9hVzUwTFd4dllXUmxjaUV1TDJ4cFlpOTBhVzFsTDJsdWRHVnlkbUZzTG1weklsMHNJbk52ZFhKalpWSnZiM1FpT2lJaWZRPT1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbmV4dXN1aS9kaXN0L05leHVzVUkuanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzXG4vLyBtb2R1bGUgaWQgPSA1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2h0bWwuanNcbi8vIG1vZHVsZSBpZCA9IDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gNTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSA2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgSVRFUkFUT1IgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qc1xuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpe1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2goZSl7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZihyZXQgIT09IHVuZGVmaW5lZClhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanNcbi8vIG1vZHVsZSBpZCA9IDYyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzXG4vLyBtb2R1bGUgaWQgPSA2M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanNcbi8vIG1vZHVsZSBpZCA9IDY0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcbiAgICAsIGx0ICAgICA9ICc8J1xuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuICB2YXIgcmVzdWx0O1xuICBpZihPICE9PSBudWxsKXtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qc1xuLy8gbW9kdWxlIGlkID0gNjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyICRrZXlzICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpXG4gICwgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKXtcbiAgcmV0dXJuICRrZXlzKE8sIGhpZGRlbktleXMpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLmpzXG4vLyBtb2R1bGUgaWQgPSA2NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaGFzICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b0lPYmplY3QgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxuICAsIElFX1BST1RPICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSlpZihoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpe1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1xuLy8gbW9kdWxlIGlkID0gNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gNjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgaW52b2tlICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faW52b2tlJylcbiAgLCBodG1sICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19odG1sJylcbiAgLCBjZWwgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgc2V0VGFzayAgICAgICAgICAgID0gZ2xvYmFsLnNldEltbWVkaWF0ZVxuICAsIGNsZWFyVGFzayAgICAgICAgICA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZVxuICAsIE1lc3NhZ2VDaGFubmVsICAgICA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbFxuICAsIGNvdW50ZXIgICAgICAgICAgICA9IDBcbiAgLCBxdWV1ZSAgICAgICAgICAgICAgPSB7fVxuICAsIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24oKXtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIGlmKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSl7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYoIXNldFRhc2sgfHwgIWNsZWFyVGFzayl7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pe1xuICAgIHZhciBhcmdzID0gW10sIGkgPSAxO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uKCl7XG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpe1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZihyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcycpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmKE1lc3NhZ2VDaGFubmVsKXtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsO1xuICAgIHBvcnQgICAgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZihPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbigpe1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogICBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdGFzay5qc1xuLy8gbW9kdWxlIGlkID0gNjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vaXNhcnJheS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnaXNhcnJheScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRHVwbGV4O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cblJlYWRhYmxlLlJlYWRhYmxlU3RhdGUgPSBSZWFkYWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xuXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYnVmZmVyU2hpbSA9IHJlcXVpcmUoJ2J1ZmZlci1zaGltcycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBTdHJpbmdEZWNvZGVyO1xuXG51dGlsLmluaGVyaXRzKFJlYWRhYmxlLCBTdHJlYW0pO1xuXG52YXIga1Byb3h5RXZlbnRzID0gWydlcnJvcicsICdjbG9zZScsICdkZXN0cm95JywgJ3BhdXNlJywgJ3Jlc3VtZSddO1xuXG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAgIC8vIHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLiBUaGlzIGlzIGhlcmUgb25seSBiZWNhdXNlIHRoaXMgY29kZSBuZWVkc1xuICAgIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gICAgaWYgKCFlbWl0dGVyLl9ldmVudHMgfHwgIWVtaXR0ZXIuX2V2ZW50c1tldmVudF0pIGVtaXR0ZXIub24oZXZlbnQsIGZuKTtlbHNlIGlmIChpc0FycmF5KGVtaXR0ZXIuX2V2ZW50c1tldmVudF0pKSBlbWl0dGVyLl9ldmVudHNbZXZlbnRdLnVuc2hpZnQoZm4pO2Vsc2UgZW1pdHRlci5fZXZlbnRzW2V2ZW50XSA9IFtmbiwgZW1pdHRlci5fZXZlbnRzW2V2ZW50XV07XG4gIH1cbn1cblxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheVxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggaXQgc3RvcHMgY2FsbGluZyBfcmVhZCgpIHRvIGZpbGwgdGhlIGJ1ZmZlclxuICAvLyBOb3RlOiAwIGlzIGEgdmFsaWQgdmFsdWUsIG1lYW5zIFwiZG9uJ3QgY2FsbCBfcmVhZCBwcmVlbXB0aXZlbHkgZXZlclwiXG4gIHZhciBod20gPSBvcHRpb25zLmhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bSB8fCBod20gPT09IDAgPyBod20gOiBkZWZhdWx0SHdtO1xuXG4gIC8vIGNhc3QgdG8gaW50cy5cbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gfn50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgLy8gQSBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIHN0b3JlIGRhdGEgY2h1bmtzIGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZSB0aGVcbiAgLy8gbGlua2VkIGxpc3QgY2FuIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBiZWdpbm5pbmcgZmFzdGVyIHRoYW5cbiAgLy8gYXJyYXkuc2hpZnQoKVxuICB0aGlzLmJ1ZmZlciA9IG5ldyBCdWZmZXJMaXN0KCk7XG4gIHRoaXMubGVuZ3RoID0gMDtcbiAgdGhpcy5waXBlcyA9IG51bGw7XG4gIHRoaXMucGlwZXNDb3VudCA9IDA7XG4gIHRoaXMuZmxvd2luZyA9IG51bGw7XG4gIHRoaXMuZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIHRoaXMucmVhZGluZyA9IGZhbHNlO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gd2hlbiBwaXBpbmcsIHdlIG9ubHkgY2FyZSBhYm91dCAncmVhZGFibGUnIGV2ZW50cyB0aGF0IGhhcHBlblxuICAvLyBhZnRlciByZWFkKClpbmcgYWxsIHRoZSBieXRlcyBhbmQgbm90IGdldHRpbmcgYW55IHB1c2hiYWNrLlxuICB0aGlzLnJhbk91dCA9IGZhbHNlO1xuXG4gIC8vIHRoZSBudW1iZXIgb2Ygd3JpdGVycyB0aGF0IGFyZSBhd2FpdGluZyBhIGRyYWluIGV2ZW50IGluIC5waXBlKClzXG4gIHRoaXMuYXdhaXREcmFpbiA9IDA7XG5cbiAgLy8gaWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZFxuICB0aGlzLnJlYWRpbmdNb3JlID0gZmFsc2U7XG5cbiAgdGhpcy5kZWNvZGVyID0gbnVsbDtcbiAgdGhpcy5lbmNvZGluZyA9IG51bGw7XG4gIGlmIChvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgICB0aGlzLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihvcHRpb25zLmVuY29kaW5nKTtcbiAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBidWZmZXJTaGltLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgIGVuY29kaW5nID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgZmFsc2UpO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgJycsIHRydWUpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID09PSBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250KSB7XG4gIHZhciBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICBpZiAoZXIpIHtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gICAgb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKTtcbiAgfSBlbHNlIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rICYmIGNodW5rLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RhdGUuZW5kZWQgJiYgIWFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBlID0gbmV3IEVycm9yKCdzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRicpO1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZSk7XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRFbWl0dGVkICYmIGFkZFRvRnJvbnQpIHtcbiAgICAgIHZhciBfZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIF9lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNraXBBZGQ7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhYWRkVG9Gcm9udCAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICAgICAgc2tpcEFkZCA9ICFzdGF0ZS5vYmplY3RNb2RlICYmIGNodW5rLmxlbmd0aCA9PT0gMDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhZGRUb0Zyb250KSBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG5cbiAgICAgIC8vIERvbid0IGFkZCB0byB0aGUgYnVmZmVyIGlmIHdlJ3ZlIGRlY29kZWQgdG8gYW4gZW1wdHkgc3RyaW5nIGNodW5rIGFuZFxuICAgICAgLy8gd2UncmUgbm90IGluIG9iamVjdCBtb2RlXG4gICAgICBpZiAoIXNraXBBZGQpIHtcbiAgICAgICAgLy8gaWYgd2Ugd2FudCB0aGUgZGF0YSBub3csIGp1c3QgZW1pdCBpdC5cbiAgICAgICAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICAgICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgICAgICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIG5lZWRNb3JlRGF0YShzdGF0ZSk7XG59XG5cbi8vIGlmIGl0J3MgcGFzdCB0aGUgaGlnaCB3YXRlciBtYXJrLCB3ZSBjYW4gcHVzaCBpbiBzb21lIG1vcmUuXG4vLyBBbHNvLCBpZiB3ZSBoYXZlIG5vIGRhdGEgeWV0LCB3ZSBjYW4gc3RhbmQgc29tZVxuLy8gbW9yZSBieXRlcy4gIFRoaXMgaXMgdG8gd29yayBhcm91bmQgY2FzZXMgd2hlcmUgaHdtPTAsXG4vLyBzdWNoIGFzIHRoZSByZXBsLiAgQWxzbywgaWYgdGhlIHB1c2goKSB0cmlnZ2VyZWQgYVxuLy8gcmVhZGFibGUgZXZlbnQsIGFuZCB0aGUgdXNlciBjYWxsZWQgcmVhZChsYXJnZU51bWJlcikgc3VjaCB0aGF0XG4vLyBuZWVkUmVhZGFibGUgd2FzIHNldCwgdGhlbiB3ZSBvdWdodCB0byBwdXNoIG1vcmUsIHNvIHRoYXQgYW5vdGhlclxuLy8gJ3JlYWRhYmxlJyBldmVudCB3aWxsIGJlIHRyaWdnZXJlZC5cbmZ1bmN0aW9uIG5lZWRNb3JlRGF0YShzdGF0ZSkge1xuICByZXR1cm4gIXN0YXRlLmVuZGVkICYmIChzdGF0ZS5uZWVkUmVhZGFibGUgfHwgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApO1xufVxuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gY2h1bmtJbnZhbGlkKHN0YXRlLCBjaHVuaykge1xuICB2YXIgZXIgPSBudWxsO1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rJyk7XG4gIH1cbiAgcmV0dXJuIGVyO1xufVxuXG5mdW5jdGlvbiBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmVuZGVkKSByZXR1cm47XG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgdmFyIGNodW5rID0gc3RhdGUuZGVjb2Rlci5lbmQoKTtcbiAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSB7XG4gICAgICBzdGF0ZS5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgfVxuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcblxuICAvLyBlbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIGlmICghc3RhdGUuZW1pdHRlZFJlYWRhYmxlKSB7XG4gICAgZGVidWcoJ2VtaXRSZWFkYWJsZScsIHN0YXRlLmZsb3dpbmcpO1xuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgaWYgKHN0YXRlLnN5bmMpIHByb2Nlc3NOZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pO2Vsc2UgZW1pdFJlYWRhYmxlXyhzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGRlYnVnKCdlbWl0IHJlYWRhYmxlJyk7XG4gIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpO1xuICBmbG93KHN0cmVhbSk7XG59XG5cbi8vIGF0IHRoaXMgcG9pbnQsIHRoZSB1c2VyIGhhcyBwcmVzdW1hYmx5IHNlZW4gdGhlICdyZWFkYWJsZScgZXZlbnQsXG4vLyBhbmQgY2FsbGVkIHJlYWQoKSB0byBjb25zdW1lIHNvbWUgZGF0YS4gIHRoYXQgbWF5IGhhdmUgdHJpZ2dlcmVkXG4vLyBpbiB0dXJuIGFub3RoZXIgX3JlYWQobikgY2FsbCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nID0gdHJ1ZSBpZlxuLy8gaXQncyBpbiBwcm9ncmVzcy5cbi8vIEhvd2V2ZXIsIGlmIHdlJ3JlIG5vdCBlbmRlZCwgb3IgcmVhZGluZywgYW5kIHRoZSBsZW5ndGggPCBod20sXG4vLyB0aGVuIGdvIGFoZWFkIGFuZCB0cnkgdG8gcmVhZCBzb21lIG1vcmUgcHJlZW1wdGl2ZWx5LlxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZ01vcmUpIHtcbiAgICBzdGF0ZS5yZWFkaW5nTW9yZSA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKG1heWJlUmVhZE1vcmVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlXyhzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIHdoaWxlICghc3RhdGUucmVhZGluZyAmJiAhc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRlYnVnKCdtYXliZVJlYWRNb3JlIHJlYWQgMCcpO1xuICAgIHN0cmVhbS5yZWFkKDApO1xuICAgIGlmIChsZW4gPT09IHN0YXRlLmxlbmd0aClcbiAgICAgIC8vIGRpZG4ndCBnZXQgYW55IGRhdGEsIHN0b3Agc3Bpbm5pbmcuXG4gICAgICBicmVhaztlbHNlIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgfVxuICBzdGF0ZS5yZWFkaW5nTW9yZSA9IGZhbHNlO1xufVxuXG4vLyBhYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ19yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3NOZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIC8vIElmIHRoZSB1c2VyIHB1c2hlcyBtb3JlIGRhdGEgd2hpbGUgd2UncmUgd3JpdGluZyB0byBkZXN0IHRoZW4gd2UnbGwgZW5kIHVwXG4gIC8vIGluIG9uZGF0YSBhZ2Fpbi4gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIGluY3JlYXNlIGF3YWl0RHJhaW4gb25jZSBiZWNhdXNlXG4gIC8vIGRlc3Qgd2lsbCBvbmx5IGVtaXQgb25lICdkcmFpbicgZXZlbnQgZm9yIHRoZSBtdWx0aXBsZSB3cml0ZXMuXG4gIC8vID0+IEludHJvZHVjZSBhIGd1YXJkIG9uIGluY3JlYXNpbmcgYXdhaXREcmFpbi5cbiAgdmFyIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgc3JjLm9uKCdkYXRhJywgb25kYXRhKTtcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgZGVidWcoJ29uZGF0YScpO1xuICAgIGluY3JlYXNlZEF3YWl0RHJhaW4gPSBmYWxzZTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQgJiYgIWluY3JlYXNlZEF3YWl0RHJhaW4pIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICAvLyA9PiBDaGVjayB3aGV0aGVyIGBkZXN0YCBpcyBzdGlsbCBhIHBpcGluZyBkZXN0aW5hdGlvbi5cbiAgICAgIGlmICgoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlcyA9PT0gZGVzdCB8fCBzdGF0ZS5waXBlc0NvdW50ID4gMSAmJiBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KSAhPT0gLTEpICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgICAgaW5jcmVhc2VkQXdhaXREcmFpbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBzcmMucGF1c2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gaG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcik7XG4gICAgdW5waXBlKCk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBpZiAoRUVsaXN0ZW5lckNvdW50KGRlc3QsICdlcnJvcicpID09PSAwKSBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgLy8gQm90aCBjbG9zZSBhbmQgZmluaXNoIHNob3VsZCB0cmlnZ2VyIHVucGlwZSwgYnV0IG9ubHkgb25jZS5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpO1xuICBmdW5jdGlvbiBvbmZpbmlzaCgpIHtcbiAgICBkZWJ1Zygnb25maW5pc2gnKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIHVucGlwZSgpO1xuICB9XG4gIGRlc3Qub25jZSgnZmluaXNoJywgb25maW5pc2gpO1xuXG4gIGZ1bmN0aW9uIHVucGlwZSgpIHtcbiAgICBkZWJ1ZygndW5waXBlJyk7XG4gICAgc3JjLnVucGlwZShkZXN0KTtcbiAgfVxuXG4gIC8vIHRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvXG4gIGRlc3QuZW1pdCgncGlwZScsIHNyYyk7XG5cbiAgLy8gc3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGlwZSByZXN1bWUnKTtcbiAgICBzcmMucmVzdW1lKCk7XG4gIH1cblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmZ1bmN0aW9uIHBpcGVPbkRyYWluKHNyYykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZTtcbiAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbikgc3RhdGUuYXdhaXREcmFpbi0tO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluID09PSAwICYmIEVFbGlzdGVuZXJDb3VudChzcmMsICdkYXRhJykpIHtcbiAgICAgIHN0YXRlLmZsb3dpbmcgPSB0cnVlO1xuICAgICAgZmxvdyhzcmMpO1xuICAgIH1cbiAgfTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgfXJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGluZGV4ID0gaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzO1xuXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgIC8vIFN0YXJ0IGZsb3dpbmcgb24gbmV4dCB0aWNrIGlmIHN0cmVhbSBpc24ndCBleHBsaWNpdGx5IHBhdXNlZFxuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgIT09IGZhbHNlKSB0aGlzLnJlc3VtZSgpO1xuICB9IGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgIXN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nKSB7XG4gICAgICBzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZyA9IHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBwcm9jZXNzTmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcywgc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdGF0ZS5hd2FpdERyYWluID0gMDtcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpO1xuICBmbG93KHN0cmVhbSk7XG4gIGlmIChzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5yZWFkaW5nKSBzdHJlYW0ucmVhZCgwKTtcbn1cblxuUmVhZGFibGUucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICBkZWJ1ZygnY2FsbCBwYXVzZSBmbG93aW5nPSVqJywgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKTtcbiAgaWYgKGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncGF1c2UnKTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXQoJ3BhdXNlJyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBmbG93KHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZyk7XG4gIHdoaWxlIChzdGF0ZS5mbG93aW5nICYmIHN0cmVhbS5yZWFkKCkgIT09IG51bGwpIHt9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCBrUHJveHlFdmVudHMubGVuZ3RoOyBuKyspIHtcbiAgICBzdHJlYW0ub24oa1Byb3h5RXZlbnRzW25dLCBzZWxmLmVtaXQuYmluZChzZWxmLCBrUHJveHlFdmVudHNbbl0pKTtcbiAgfVxuXG4gIC8vIHdoZW4gd2UgdHJ5IHRvIGNvbnN1bWUgc29tZSBtb3JlIGJ5dGVzLCBzaW1wbHkgdW5wYXVzZSB0aGVcbiAgLy8gdW5kZXJseWluZyBzdHJlYW0uXG4gIHNlbGYuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgIGRlYnVnKCd3cmFwcGVkIF9yZWFkJywgbik7XG4gICAgaWYgKHBhdXNlZCkge1xuICAgICAgcGF1c2VkID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVzdW1lKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxmO1xufTtcblxuLy8gZXhwb3NlZCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuUmVhZGFibGUuX2Zyb21MaXN0ID0gZnJvbUxpc3Q7XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWRcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHJldDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpO2Vsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gcmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0XG4gICAgaWYgKHN0YXRlLmRlY29kZXIpIHJldCA9IHN0YXRlLmJ1ZmZlci5qb2luKCcnKTtlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuaGVhZC5kYXRhO2Vsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpO1xuICAgIHN0YXRlLmJ1ZmZlci5jbGVhcigpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQgcGFydCBvZiBsaXN0XG4gICAgcmV0ID0gZnJvbUxpc3RQYXJ0aWFsKG4sIHN0YXRlLmJ1ZmZlciwgc3RhdGUuZGVjb2Rlcik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBFeHRyYWN0cyBvbmx5IGVub3VnaCBidWZmZXJlZCBkYXRhIHRvIHNhdGlzZnkgdGhlIGFtb3VudCByZXF1ZXN0ZWQuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0UGFydGlhbChuLCBsaXN0LCBoYXNTdHJpbmdzKSB7XG4gIHZhciByZXQ7XG4gIGlmIChuIDwgbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gc2xpY2UgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3NcbiAgICByZXQgPSBsaXN0LmhlYWQuZGF0YS5zbGljZSgwLCBuKTtcbiAgICBsaXN0LmhlYWQuZGF0YSA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKG4pO1xuICB9IGVsc2UgaWYgKG4gPT09IGxpc3QuaGVhZC5kYXRhLmxlbmd0aCkge1xuICAgIC8vIGZpcnN0IGNodW5rIGlzIGEgcGVyZmVjdCBtYXRjaFxuICAgIHJldCA9IGxpc3Quc2hpZnQoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXJcbiAgICByZXQgPSBoYXNTdHJpbmdzID8gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkgOiBjb3B5RnJvbUJ1ZmZlcihuLCBsaXN0KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhXG4vLyBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyU3RyaW5nKG4sIGxpc3QpIHtcbiAgdmFyIHAgPSBsaXN0LmhlYWQ7XG4gIHZhciBjID0gMTtcbiAgdmFyIHJldCA9IHAuZGF0YTtcbiAgbiAtPSByZXQubGVuZ3RoO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHZhciBzdHIgPSBwLmRhdGE7XG4gICAgdmFyIG5iID0gbiA+IHN0ci5sZW5ndGggPyBzdHIubGVuZ3RoIDogbjtcbiAgICBpZiAobmIgPT09IHN0ci5sZW5ndGgpIHJldCArPSBzdHI7ZWxzZSByZXQgKz0gc3RyLnNsaWNlKDAsIG4pO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBzdHIuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG4vLyBDb3BpZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVyZWQgZGF0YSBjaHVua3MuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpIHtcbiAgdmFyIHJldCA9IGJ1ZmZlclNoaW0uYWxsb2NVbnNhZmUobik7XG4gIHZhciBwID0gbGlzdC5oZWFkO1xuICB2YXIgYyA9IDE7XG4gIHAuZGF0YS5jb3B5KHJldCk7XG4gIG4gLT0gcC5kYXRhLmxlbmd0aDtcbiAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICB2YXIgYnVmID0gcC5kYXRhO1xuICAgIHZhciBuYiA9IG4gPiBidWYubGVuZ3RoID8gYnVmLmxlbmd0aCA6IG47XG4gICAgYnVmLmNvcHkocmV0LCByZXQubGVuZ3RoIC0gbiwgMCwgbmIpO1xuICAgIG4gLT0gbmI7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmIChuYiA9PT0gYnVmLmxlbmd0aCkge1xuICAgICAgICArK2M7XG4gICAgICAgIGlmIChwLm5leHQpIGxpc3QuaGVhZCA9IHAubmV4dDtlbHNlIGxpc3QuaGVhZCA9IGxpc3QudGFpbCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0LmhlYWQgPSBwO1xuICAgICAgICBwLmRhdGEgPSBidWYuc2xpY2UobmIpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgICsrYztcbiAgfVxuICBsaXN0Lmxlbmd0aCAtPSBjO1xuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBlbmRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXG4gIC8vIElmIHdlIGdldCBoZXJlIGJlZm9yZSBjb25zdW1pbmcgYWxsIHRoZSBieXRlcywgdGhlbiB0aGF0IGlzIGFcbiAgLy8gYnVnIGluIG5vZGUuICBTaG91bGQgbmV2ZXIgaGFwcGVuLlxuICBpZiAoc3RhdGUubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdcImVuZFJlYWRhYmxlKClcIiBjYWxsZWQgb24gbm9uLWVtcHR5IHN0cmVhbScpO1xuXG4gIGlmICghc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2soZW5kUmVhZGFibGVOVCwgc3RhdGUsIHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzdGF0ZSwgc3RyZWFtKSB7XG4gIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IGdldCBvbmUgbGFzdCB1bnNoaWZ0LlxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2goeHMsIGYpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB4cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmKHhzW2ldLCBpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qc1xuLy8gbW9kdWxlIGlkID0gNzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG52YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBUcmFuc2Zvcm1TdGF0ZShzdHJlYW0pIHtcbiAgdGhpcy5hZnRlclRyYW5zZm9ybSA9IGZ1bmN0aW9uIChlciwgZGF0YSkge1xuICAgIHJldHVybiBhZnRlclRyYW5zZm9ybShzdHJlYW0sIGVyLCBkYXRhKTtcbiAgfTtcblxuICB0aGlzLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgdGhpcy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcbiAgdGhpcy53cml0ZWNodW5rID0gbnVsbDtcbiAgdGhpcy53cml0ZWVuY29kaW5nID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSkge1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuICB0cy50cmFuc2Zvcm1pbmcgPSBmYWxzZTtcblxuICB2YXIgY2IgPSB0cy53cml0ZWNiO1xuXG4gIGlmICghY2IpIHJldHVybiBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ25vIHdyaXRlY2IgaW4gVHJhbnNmb3JtIGNsYXNzJykpO1xuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIGNiKGVyKTtcblxuICB2YXIgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgc3RyZWFtLl9yZWFkKHJzLmhpZ2hXYXRlck1hcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIFRyYW5zZm9ybShvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKSByZXR1cm4gbmV3IFRyYW5zZm9ybShvcHRpb25zKTtcblxuICBEdXBsZXguY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKTtcblxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB0aGlzLm9uY2UoJ3ByZWZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaChmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICAgIGRvbmUoc3RyZWFtLCBlciwgZGF0YSk7XG4gICAgfSk7ZWxzZSBkb25lKHN0cmVhbSk7XG4gIH0pO1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIGlmIChkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHVuZGVmaW5lZCkgc3RyZWFtLnB1c2goZGF0YSk7XG5cbiAgLy8gaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoZW4gdGhhdCBtZWFuc1xuICAvLyB0aGF0IG5vdGhpbmcgbW9yZSB3aWxsIGV2ZXIgYmUgcHJvdmlkZWRcbiAgdmFyIHdzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgdHMgPSBzdHJlYW0uX3RyYW5zZm9ybVN0YXRlO1xuXG4gIGlmICh3cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwJyk7XG5cbiAgaWYgKHRzLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzXG4vLyBtb2R1bGUgaWQgPSA3M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvc3RyZWFtLWJyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IDc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcblxuLy8gRE9NIEFQSXMsIGZvciBjb21wbGV0ZW5lc3NcblxuZXhwb3J0cy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldFRpbWVvdXQsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJUaW1lb3V0KTtcbn07XG5leHBvcnRzLnNldEludGVydmFsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGltZW91dChhcHBseS5jYWxsKHNldEludGVydmFsLCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gc2V0aW1tZWRpYXRlIGF0dGFjaGVzIGl0c2VsZiB0byB0aGUgZ2xvYmFsIG9iamVjdFxucmVxdWlyZShcInNldGltbWVkaWF0ZVwiKTtcbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuZXhwb3J0cy5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3RpbWVycy1icm93c2VyaWZ5L21haW4uanNcbi8vIG1vZHVsZSBpZCA9IDc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImNvbnN0IGZpbGVzID0gW1xuICAvLyBcImd1bl92aW9sZW5jZVwiLFxuICBcIm1hc3Nfc2hvb3RpbmdzX2Zyb21fY29sdW1iaW5lXCIsXG4gIFwiZ3VuX3Zpb2xlbmNlX2J5X21vbnRoXCIsXG5dXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJ2Nzdi1wYXJzZScpXG5cbmNvbnN0IGRhdGFQcm9taXNlcyA9IGZpbGVzLm1hcChuYW1lID0+IHtcbiAgcmV0dXJuIGZldGNoKCcuL2RhdGEvJyArIG5hbWUgKyAnLmNzdicpLnRoZW4ocm93cyA9PiB7XG4gICAgcmV0dXJuIHJvd3MudGV4dCgpXG4gIH0pLnRoZW4odGV4dCA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHBhcnNlKHRleHQsIHt9LCAoXywgbGluZXMpID0+IHJlc29sdmUobGluZXMpKVxuICAgIH0pXG4gIH0pLnRoZW4obGluZXMgPT4ge1xuICAgIC8vIGNvbnNvbGUubG9nKG5hbWUsIGxpbmVzKVxuICAgIGNvbnN0IGggPSBsaW5lcy5zaGlmdCgpXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICBoLFxuICAgICAgbGluZXM6IGxpbmVzLmZpbHRlcihzID0+ICEhcylcbiAgICB9XG4gIH0pXG59KVxuY29uc3QgYWxsUHJvbWlzZXMgPSBQcm9taXNlLmFsbChkYXRhUHJvbWlzZXMpLnRoZW4oZGF0YSA9PiB7XG4gIHJldHVybiBkYXRhLnJlZHVjZSgoYSxiKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coYilcbiAgICBhW2IubmFtZV0gPSBiXG4gICAgcmV0dXJuIGFcbiAgfSwge30pXG59KVxuY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgcmV0dXJuIGFsbFByb21pc2VzXG59XG5cbmV4cG9ydCB7IGxvYWQgfVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9kYXRhLmpzIiwiY29uc3Qga2V5cyA9IHt9XG5jb25zdCBrZXlfbnVtYmVycyA9IHt9XG5jb25zdCBsZXR0ZXJzID0gXCJ6eGN2Ym5tYXNkZmdoamtscXdlcnR5dWlvcFwiXG5jb25zdCBudW1iZXJzID0gXCIxMjM0NTY3ODkwXCJcblxubGV0IGNhbGxiYWNrID0gZnVuY3Rpb24oKXt9XG5cbmxldHRlcnMudG9VcHBlckNhc2UoKS5zcGxpdChcIlwiKS5tYXAoZnVuY3Rpb24oayxpKXtcbiAga2V5c1trLmNoYXJDb2RlQXQoMCldID0gaVxufSlcblxubnVtYmVycy5zcGxpdChcIlwiKS5tYXAoZnVuY3Rpb24oayxpKXtcbiAga2V5c1trLmNoYXJDb2RlQXQoMCldID0gaStsZXR0ZXJzLmxlbmd0aFxuICBrZXlfbnVtYmVyc1trLmNoYXJDb2RlQXQoMCldID0gdHJ1ZVxufSlcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGtleWRvd24sIHRydWUpXG5mdW5jdGlvbiBrZXlkb3duIChlKSB7XG4gIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgKGUua2V5Q29kZSBpbiBrZXlfbnVtYmVycykpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKCEgKGUua2V5Q29kZSBpbiBrZXlzKSkgcmV0dXJuXG4gIHZhciBpbmRleCA9IGtleXNbZS5rZXlDb2RlXVxuICBpZiAoZS5zaGlmdEtleSkgaW5kZXggKz0gbGV0dGVycy5sZW5ndGhcbiAgaW5kZXggLT0gN1xuICBjYWxsYmFjayhpbmRleClcbn1cblxuZnVuY3Rpb24gbGlzdGVuIChmbikge1xuICBjYWxsYmFjayA9IGZuXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgbGlzdGVuIH1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvbGliL2tleXMuanMiLCJpbXBvcnQgVG9uZSBmcm9tICd0b25lJ1xuaW1wb3J0IFdlYk1pZGkgZnJvbSAnd2VibWlkaSdcbmltcG9ydCBzY2FsZXMgZnJvbSAnLi9zY2FsZXMnXG5pbXBvcnQgeyBmdG9tLCBub3JtLCBkYXRhVVJJdG9CbG9iIH0gZnJvbSAnLi91dGlsJ1xuaW1wb3J0IGthbGltYmEgZnJvbSAnLi9rYWxpbWJhJ1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlci9GaWxlU2F2ZXInXG5cbmltcG9ydCB7IG54IH0gZnJvbSAnLi91aSdcblxubGV0IG1pZGlEZXZpY2VcbmxldCBzZW5kUGl0Y2hCZW5kID0gZmFsc2VcblxuZXhwb3J0IGNvbnN0IE1pZGlXcml0ZXIgPSByZXF1aXJlKCdtaWRpLXdyaXRlci1qcycpXG5cbmV4cG9ydCBjb25zdCBub3RlX3ZhbHVlcyA9IFtcbiAgWzgsICc4IG1lYXN1cmVzJywgOCAqIDUxMl0sXG4gIFs0LCAnNCBtZWFzdXJlcycsIDQgKiA1MTJdLFxuICBbMiwgJzIgbWVhc3VyZXMnLCAyICogNTEyXSxcbiAgWzEsICd3aG9sZSBub3RlJywgNTEyXSxcbiAgWzEvMiwgJ2hhbGYgbm90ZScsIDI1Nl0sXG4gIFsxLzMsICd0aGlyZCBub3RlJywgWzE3MCwgMTcwLCAxNzFdXSxcbiAgWzEvNCwgJ3F1YXJ0ZXIgbm90ZScsIDEyOF0sXG4gIFsxLzUsICdmaWZ0aCBub3RlJywgWzUxLDUxLDUxLDUxLDUyXV0sXG4gIFsxLzYsICdzaXh0aCBub3RlJywgWzg1LCA4NSwgODYsIDg1LCA4NSwgODZdXSxcbiAgWzEvOCwgJ2VpZ2h0aCBub3RlJywgNjRdLFxuICBbMS8xMCwgJ3RlbnRoIG5vdGUnLCBbMjUsMjYsMjYsMjUsMjYsMjUsMjYsMjYsMjUsMjZdXSxcbiAgWzEvMTIsICd0d2VsZnRoIG5vdGUnLCBbMjEsMjEsMjIsIDIxLDIxLDIyLCAyMSwyMSwyMiwgMjEsMjEsMjJdXSxcbiAgWzEvMTYsICdzaXh0ZWVudGggbm90ZScsIDMyXSxcbiAgWzEvMzIsICd0aGlydHlzZWNvbmQgbm90ZScsIDE2XSxcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pZGlfaW5pdCgpIHtcbiAgV2ViTWlkaS5lbmFibGUobWlkaV9yZWFkeSlcbiAgZnVuY3Rpb24gbWlkaV9yZWFkeShlcnIpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd3ZWJtaWRpIGZhaWxlZCB0byBpbml0aWFsaXplJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIVdlYk1pZGkub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ25vIE1JREkgb3V0cHV0IGZvdW5kJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhXZWJNaWRpLmlucHV0cylcbiAgICBjb25zb2xlLmxvZyhXZWJNaWRpLm91dHB1dHMpXG4gICAgaWYgKFdlYk1pZGkub3V0cHV0cy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IFdlYk1pZGkub3V0cHV0cy5maWx0ZXIob3V0cHV0ID0+IG91dHB1dC5uYW1lLm1hdGNoKC9wcm9kaXBlL2kpKVxuICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCkge1xuICAgICAgICAvLyBtaWRpRGV2aWNlID0gZmlsdGVyZWRbMF1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbWlkaURldmljZSA9IG1pZGlEZXZpY2UgfHwgV2ViTWlkaS5vdXRwdXRzWzBdXG4gICAgLy8gY29uc29sZS5sb2cobWlkaURldmljZS5uYW1lKVxuICB9XG59XG5cbi8qIHBsYXkgYSBzaW5nbGUgbm90ZSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGxheV9ub3RlKGluZGV4LCBkdXJhdGlvbiwgY2hhbm5lbD1cImFsbFwiLCBleHBvcnRpbmc9ZmFsc2UsIHJlc3Q9MCwgZGVmZXI9MCl7XG4gIC8vIGNvbnNvbGUubG9nKGluZGV4KVxuICBjb25zdCBzY2FsZSA9IHNjYWxlcy5jdXJyZW50KClcbiAgY29uc3QgZnJlcSA9IHNjYWxlLmluZGV4KGluZGV4ICsgTWF0aC5yb3VuZChueC5vZmZzZXQudmFsdWUpLCBueC5vY3RhdmUudmFsdWUpXG4gIGxldCBtaWRpX25vdGUgPSBmdG9tKGZyZXEpXG4gIGxldCBjZW50cyA9IG1pZGlfbm90ZSAlIDFcbiAgaWYgKGNlbnRzID4gMC41KSB7XG4gICAgbWlkaV9ub3RlICs9IDFcbiAgICBjZW50cyAtPSAxXG4gIH1cbiAgY2VudHMgKj0gMlxuICBtaWRpX25vdGUgPSBNYXRoLmZsb29yKG1pZGlfbm90ZSlcbiAgaWYgKChtaWRpRGV2aWNlIHx8IGV4cG9ydGluZykgJiYgbWlkaV9ub3RlID4gMTI3KSByZXR1cm4gMFxuICBjb25zdCBub3RlID0gVG9uZS5GcmVxdWVuY3koTWF0aC5mbG9vcihtaWRpX25vdGUpLCBcIm1pZGlcIikudG9Ob3RlKClcbiAgY29uc3QgZGVmZXJfdGltZSA9IDMwMDAwIC8gVG9uZS5UcmFuc3BvcnQuYnBtLnZhbHVlICogZGVmZXIgLyAxMjhcbiAgY29uc29sZS5sb2coZGVmZXIsIGRlZmVyX3RpbWUpXG4gIGlmIChleHBvcnRpbmcpIHtcbiAgICByZXR1cm4gbm90ZVxuICB9XG4gIGlmIChtaWRpRGV2aWNlKSB7XG4gICAgZHVyYXRpb24gPSBkdXJhdGlvbiB8fCA2MDAwMCAvIFRvbmUuVHJhbnNwb3J0LmJwbS52YWx1ZVxuICAgIGlmICghIGV4cG9ydGluZykge1xuICAgICAgaWYgKGRlZmVyKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHBsYXlfbWlkaV9ub3RlKG5vdGUsIGNlbnRzLCBjaGFubmVsLCBkdXJhdGlvbilcbiAgICAgICAgfSwgZGVmZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwbGF5X21pZGlfbm90ZShub3RlLCBjZW50cywgY2hhbm5lbCwgZHVyYXRpb24pXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2UgaWYgKGRlZmVyKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBrYWxpbWJhLnBsYXkoZnJlcSlcbiAgICB9LCBkZWZlcl90aW1lKVxuICB9IGVsc2Uge1xuICAgIGthbGltYmEucGxheShmcmVxKVxuICB9XG4gIHJldHVybiBub3RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF5X21pZGlfbm90ZShub3RlLCBjZW50cywgY2hhbm5lbCwgZHVyYXRpb24pIHtcbiAgbWlkaURldmljZS5wbGF5Tm90ZShub3RlLCBjaGFubmVsLCB7IGR1cmF0aW9uIH0pXG4gIGlmIChzZW5kUGl0Y2hCZW5kKSB7XG4gICAgbWlkaURldmljZS5zZW5kUGl0Y2hCZW5kKGNlbnRzLCBjaGFubmVsKVxuICB9XG59XG5cbi8qIHBsYXkgdGhlIG5leHQgbm90ZSBpbiBzZXF1ZW5jZSAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGxheV9zZXF1ZW5jZShpLCBib3VuZHMsIGRpZmYsIG5vdGVfdGltZSwgY2hhbm5lbD1cImFsbFwiLCBleHBvcnRpbmcpIHtcbiAgY29uc3QgeyByb3dzLCBtaW4sIG1heCB9ID0gYm91bmRzXG4gIGNvbnN0IGNvdW50ID0gcm93cy5sZW5ndGggKiByb3dzWzBdLmxlbmd0aFxuICBpZiAoaSA+PSBjb3VudCkgaSA9IDBcbiAgY29uc3QgeSA9IE1hdGguZmxvb3IoaSAvIHJvd3NbMF0ubGVuZ3RoKVxuICBjb25zdCB4ID0gaSAlIHJvd3NbMF0ubGVuZ3RoXG4gIC8vIGlmICgheCkgY29uc29sZS5sb2coeSlcbiAgY29uc3QgbiA9IHJvd3NbeV1beF1cbiAgaSArPSAxXG4gIGlmIChpID49IGNvdW50KSBpID0gMFxuICBjb25zdCBtaWRpX25vdGUgPSBwbGF5X25vdGUoIG5vcm0obiwgbWluLCBtYXgpICogbngubXVsdGlwbHkudmFsdWUsIG5vdGVfdGltZSwgY2hhbm5lbCwgZXhwb3J0aW5nKVxuICByZXR1cm4gW2ksIFttaWRpX25vdGVdXVxufVxuXG4vKiBwbGF5IHRoZSBuZXh0IHJvdyBhcyBhbiBpbnRlcnZhbCAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGxheV9pbnRlcnZhbF9zZXF1ZW5jZShpLCBib3VuZHMsIGRpZmYsIG5vdGVfdGltZSwgY2hhbm5lbD1cImFsbFwiLCBleHBvcnRpbmcpIHtcbiAgY29uc3QgeyByb3dzLCBtaW4sIG1heCB9ID0gYm91bmRzXG4gIGNvbnN0IGNvdW50ID0gcm93cy5sZW5ndGhcbiAgaWYgKGkgPj0gY291bnQpIGkgPSAwXG4gIGNvbnN0IHkgPSBpICUgY291bnRcbiAgY29uc3Qgcm93ID0gcm93c1t5XVxuICBpZiAoISByb3cpIHsgaSA9IDA7IHJldHVybiB9XG4gIGNvbnN0IHJvd19taW4gPSBNYXRoLm1pbi5hcHBseShNYXRoLCByb3cpXG4gIC8vIGNvbnN0IHJvd19tYXggPSBNYXRoLm1heC5hcHBseShNYXRoLCByb3cpXG4gIGNvbnN0IHJvd19mMCA9IG5vcm0ocm93X21pbiwgbWluLCBtYXgpXG4gIGNvbnN0IHJvd19yb290ID0gcm93X2YwICogbngubXVsdGlwbHkudmFsdWVcbiAgY29uc3Qgbm90ZXMgPSByb3cubWFwKG4gPT4ge1xuICAgIGNvbnN0IG5vdGUgPSByb3dfcm9vdCArIG5vcm0obiAtIHJvd19taW4sIGRpZmYubWluLCBkaWZmLm1heCkgKiBueC5pbnRlcnZhbC52YWx1ZVxuICAgIHBsYXlfbm90ZShub3RlLCBub3RlX3RpbWUsIGNoYW5uZWwsIGV4cG9ydGluZylcbiAgfSlcbiAgaSArPSAxXG4gIHJldHVybiBbaSwgbm90ZXNdXG59XG5cbi8qIGdlbmVyYXRlIGEgMS10cmFjayBtaWRpIGZpbGUgYnkgY2FsbGluZyB0aGUgcGxheSBmdW5jdGlvbiByZXBlYXRlZGx5ICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRfcGF0dGVybl9hc19taWRpKGRhdGFzZXROYW1lLCBib3VuZHMsIGRpZmYsIHRlbXBvLCB0aW1pbmdJbmRleCwgcGxheV9mbikge1xuICAvLyBjb25zdCBiZWhhdmlvciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNiZWhhdmlvcicpLnZhbHVlXG4gIGNvbnN0IHsgcm93cyB9ID0gYm91bmRzXG4gIC8vIGxldCBjb3VudCA9IGJlaGF2aW9yID09PSAnc2VxdWVuY2UnID8gcm93c1swXS5sZW5ndGggKiByb3dzLmxlbmd0aCA6IHJvd3MubGVuZ3RoXG4gIGxldCBjb3VudCA9IHJvd3NbMF0ubGVuZ3RoXG4gIGxldCBub3RlcywgdGltaW5ncywgd2FpdFxuICBsZXQgbm90ZV90aW1lXG4gIC8vIGxldCB0aW1pbmcgPSBub3RlX3ZhbHVlc1t0aW1pbmdJbmRleF1bMl1cbiAgbGV0IG1pZGlfdHJhY2sgPSBuZXcgTWlkaVdyaXRlci5UcmFjaygpXG4gIG1pZGlfdHJhY2suc2V0VGVtcG8odGVtcG8pXG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjb3VudDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgW2ksIG5vdGVzLCB0aW1pbmdzLCB3YWl0XSA9IHBsYXlfZm4oaSwgYm91bmRzLCBub3RlX3RpbWUsIFwiYWxsXCIsIHRydWUpXG4gICAgLy8gaWYgKHRpbWluZy5sZW5ndGgpIHtcbiAgICAvLyAgIG5vdGVfdGltZSA9IHRpbWluZ1tpICUgdGltaW5nLmxlbmd0aF1cbiAgICAvLyB9IGVsc2Uge1xuICAgIC8vICAgbm90ZV90aW1lID0gdGltaW5nXG4gICAgLy8gfVxuICAgIC8vIG1pZGlfdHJhY2suYWRkRXZlbnQobmV3IE1pZGlXcml0ZXIuTm90ZUV2ZW50KHsgcGl0Y2g6IG5vdGVzLCBkdXJhdGlvbjogJ3QnICsgbm90ZV90aW1lIH0pKVxuICAgIGNvbnNvbGUubG9nKGksIG5vdGVzLCB0aW1pbmdzLCB3YWl0KVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm90ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIG1pZGlfdHJhY2suYWRkRXZlbnQobmV3IE1pZGlXcml0ZXIuTm90ZUV2ZW50KHtcbiAgICAgICAgcGl0Y2g6IG5vdGVzW2pdLFxuICAgICAgICBkdXJhdGlvbjogJ3QnICsgdGltaW5nc1tqXSxcbiAgICAgICAgd2FpdDogKGogPT09IDApID8gd2FpdCA6IDAsXG4gICAgICB9KSlcbiAgICB9XG4gIH1cbiAgY29uc3Qgd3JpdGVyID0gbmV3IE1pZGlXcml0ZXIuV3JpdGVyKFttaWRpX3RyYWNrXSlcbiAgY29uc3QgYmxvYiA9IGRhdGFVUkl0b0Jsb2Iod3JpdGVyLmRhdGFVcmkoKSlcbiAgc2F2ZUFzKGJsb2IsICdSZWNvcmRpbmcgLSAnICsgZGF0YXNldE5hbWUgKyAnLm1pZCcpXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9jbGllbnQvbGliL21pZGkuanMiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9mcm9tID0gcmVxdWlyZShcIi4uL2NvcmUtanMvYXJyYXkvZnJvbVwiKTtcblxudmFyIF9mcm9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Zyb20pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFycikgPyBhcnIgOiAoMCwgX2Zyb20yLmRlZmF1bHQpKGFycik7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iYWJlbC1ydW50aW1lL2hlbHBlcnMvdG9BcnJheS5qc1xuLy8gbW9kdWxlIGlkID0gNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFRvbmUgZnJvbSAndG9uZSdcbmltcG9ydCBOZXh1cyBmcm9tICduZXh1c3VpJ1xuXG5pbXBvcnQga2V5cyBmcm9tICcuL2xpYi9rZXlzJ1xuaW1wb3J0IHNjYWxlcyBmcm9tICcuL2xpYi9zY2FsZXMnXG5pbXBvcnQga2FsaW1iYSBmcm9tICcuL2xpYi9rYWxpbWJhJ1xuaW1wb3J0IHtcbiAgbWlkaV9pbml0LFxuICBwbGF5X25vdGUsXG4gIHBsYXlfc2VxdWVuY2UsXG4gIGV4cG9ydF9wYXR0ZXJuX2FzX21pZGksXG4gIG5vdGVfdmFsdWVzLFxuICBNaWRpV3JpdGVyLFxufSBmcm9tICcuL2xpYi9taWRpJ1xuaW1wb3J0IHtcbiAgcmVxdWVzdEF1ZGlvQ29udGV4dCwgbm9ybSwgZGF0YVVSSXRvQmxvYixcbiAgZ2V0X2JvdW5kcywgZ2V0X2RpZmZfYm91bmRzLFxuICB0cmFuc3Bvc2UsXG59IGZyb20gJy4vbGliL3V0aWwnXG5pbXBvcnQge1xuICB1cGRhdGVfdmFsdWVfb25fY2hhbmdlLFxuICB1cGRhdGVfcmFkaW9fdmFsdWVfb25fY2hhbmdlLFxuICBidWlsZF9vcHRpb25zLFxuICBueFxufSBmcm9tICcuL2xpYi91aSdcblxuaW1wb3J0ICogYXMgZGF0YSBmcm9tICcuL2RhdGEnXG5cbmNvbnN0IERFRkFVTFRfQlBNID0gNjBcblxubGV0IHJlY29yZGVyID0gbnVsbFxubGV0IHJlY29yZGluZyA9IGZhbHNlXG5cbm1pZGlfaW5pdCgpXG5cbi8qIGluaXRpYWxpemF0aW9uICovXG5cbmNvbnN0IG1hc3NfZmllbGRzID0gW1xuICBcImRhdGVcIiwgXCJ0aW1lc3RhbXBcIixcbiAgXCJmYXRhbGl0aWVzXCIsIFwiaW5qdXJlZFwiLCBcInRvdGFsX3ZpY3RpbXNcIixcbiAgXCJhZ2VcIiwgXCJjYXNlXCIsIFwid2VhcG9uX3R5cGVcIiwgXCJ3ZWFwb25fZGV0YWlsc1wiXG5dLnJlZHVjZSgoYSxiLGkpID0+IHtcbiAgYVtiXSA9IGlcbiAgcmV0dXJuIGFcbn0sIHt9KVxuXG5sZXQgaSA9IDAsIG1hc3NfaSA9IDAsIGRhdGFzZXRzID0ge30sIGRhdGFzZXQgPSB7fSwgYm91bmRzID0ge30sIGRpZmYgPSBbXVxubGV0IHBsYXlfZm4gPSBwbGF5X3NlcXVlbmNlXG5kYXRhLmxvYWQoKS50aGVuKGxpc3RzID0+IHtcbiAgY29uc29sZS5sb2cobGlzdHMpXG4gIHRyYW5zcG9zZShsaXN0cy5ndW5fdmlvbGVuY2VfYnlfbW9udGgubGluZXMpLmZvckVhY2goKHJvdywgaSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBsaXN0cy5ndW5fdmlvbGVuY2VfYnlfbW9udGguaFtpXVxuICAgIGlmIChuYW1lID09PSAnRGF0ZScpIHJldHVyblxuICAgIGNvbnNvbGUubG9nKG5hbWUsIHJvdylcbiAgICBkYXRhc2V0c1tuYW1lXSA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBoOiBbbmFtZV0sXG4gICAgICBsaW5lczogW3Jvdy5tYXAobiA9PiBwYXJzZUludChuKSldLFxuICAgICAgcGxheV9mbjogcGxheV9zZXF1ZW5jZSxcbiAgICB9XG4gIH0pXG4gIGRhdGFzZXRzW1wiTWFzcyBTaG9vdGluZ3NcIl0gPSBsaXN0cy5tYXNzX3Nob290aW5nc19mcm9tX2NvbHVtYmluZVxuICBkYXRhc2V0c1tcIk1hc3MgU2hvb3RpbmdzXCJdLm5hbWUgPSBcIk1hc3MgU2hvb3RpbmdzXCJcbiAgZGF0YXNldHNbXCJNYXNzIFNob290aW5nc1wiXS5wbGF5X2ZuID0gcGxheV9tYXNzX3Nob290aW5nc1xuICBjb25zdCBsaW5lcyA9IGRhdGFzZXRzW1wiTWFzcyBTaG9vdGluZ3NcIl0ubGluZXMucmV2ZXJzZSgpXG4gIGNvbnN0IFttaW5feSwgLi4ucmVzdF0gPSBsaW5lc1swXVttYXNzX2ZpZWxkcy5kYXRlXS5zcGxpdCgnLycpXG5cbiAgZGF0YXNldHNbXCJNYXNzIFNob290aW5nc1wiXS5kYXRlcyA9IGxpbmVzLm1hcChyb3cgPT4ge1xuICAgIGNvbnN0IFt5LCBtLCBkXSA9IHJvd1ttYXNzX2ZpZWxkcy5kYXRlXS5zcGxpdCgnLycpXG4gICAgcmV0dXJuIChwYXJzZUludCh5KSAtIHBhcnNlSW50KG1pbl95KSkgKiAxMiArIHBhcnNlSW50KG0pXG4gIH0pXG4gIGRhdGFzZXRzW1wiTWFzcyBTaG9vdGluZ3NcIl0uZGF0YSA9IGxpbmVzXG4gIGRhdGFzZXRzW1wiTWFzcyBTaG9vdGluZ3NcIl0ubGluZXMgPSBbbGluZXMubWFwKHJvdyA9PiByb3dbbWFzc19maWVsZHMudG90YWxfdmljdGltc10pXVxuICByZXF1ZXN0QXVkaW9Db250ZXh0KHJlYWR5KVxufSlcblxuLyogcGxheSBmdW5jdGlvbiBmb3IgbWFzcyBzaG9vdGluZyBkYXRhIHcvIGN1c3RvbSB0aW1pbmcgKi9cblxubGV0IG1hc3NfcmVzdCA9IDBcblxuLy8gZXhwb3J0IGNvbnN0IG5vdGVfdmFsdWVzID0gW1xuLy8gICBbOCwgJzggbWVhc3VyZXMnLCA4ICogNTEyXSxcbi8vICAgWzQsICc0IG1lYXN1cmVzJywgNCAqIDUxMl0sXG4vLyAgIFsyLCAnMiBtZWFzdXJlcycsIDIgKiA1MTJdLFxuLy8gICBbMSwgJ3dob2xlIG5vdGUnLCA1MTJdLFxuLy8gICBbMS8yLCAnaGFsZiBub3RlJywgMjU2XSxcbi8vICAgWzEvMywgJ3RoaXJkIG5vdGUnLCBbMTcwLCAxNzAsIDE3MV1dLFxuLy8gICBbMS80LCAncXVhcnRlciBub3RlJywgMTI4XSxcbi8vICAgWzEvNSwgJ2ZpZnRoIG5vdGUnLCBbNTEsNTEsNTEsNTEsNTJdXSxcbi8vICAgWzEvNiwgJ3NpeHRoIG5vdGUnLCBbODUsIDg1LCA4NiwgODUsIDg1LCA4Nl1dLFxuLy8gICBbMS84LCAnZWlnaHRoIG5vdGUnLCA2NF0sXG4vLyAgIFsxLzEwLCAndGVudGggbm90ZScsIFsyNSwyNiwyNiwyNSwyNiwyNSwyNiwyNiwyNSwyNl1dLFxuLy8gICBbMS8xMiwgJ3R3ZWxmdGggbm90ZScsIFsyMSwyMSwyMiwgMjEsMjEsMjIsIDIxLDIxLDIyLCAyMSwyMSwyMl1dLFxuLy8gICBbMS8xNiwgJ3NpeHRlZW50aCBub3RlJywgMzJdLFxuLy8gICBbMS8zMiwgJ3RoaXJ0eXNlY29uZCBub3RlJywgMTZdLFxuLy8gXVxuXG5mdW5jdGlvbiBwbGF5X21hc3Nfc2hvb3RpbmdzKGksIGJvdW5kcywgZGlmZiwgbm90ZV90aW1lLCBjaGFubmVsPVwiYWxsXCIsIGV4cG9ydGluZykge1xuICBjb25zdCB7IHJvd3MsIG1pbiwgbWF4IH0gPSBib3VuZHNcbiAgY29uc3QgeSA9IDBcbiAgY29uc3QgeCA9IGkgJSByb3dzWzBdLmxlbmd0aFxuICBjb25zdCBuID0gcm93c1t5XVt4XVxuICBjb25zdCB0b3RhbCA9IGRhdGFzZXQuZGF0ZXMubGVuZ3RoXG4gIGxldCBub3RlcyA9IFtdLCBtaWRpX25vdGVzID0gW10sIGNhc2VzID0gW10sIHRpbWluZ3NcbiAgY29uc29sZS5sb2coaSwgbWFzc19pLCBkYXRhc2V0LmRhdGVzW21hc3NfaV0pXG4gIHdoaWxlIChpID49IGRhdGFzZXQuZGF0ZXNbbWFzc19pXSAmJiBtYXNzX2kgPCB0b3RhbCkge1xuICAgIG5vdGVzLnB1c2goZGF0YXNldC5saW5lc1swXVttYXNzX2ldKVxuICAgIGNhc2VzLnB1c2goZGF0YXNldC5kYXRhW21hc3NfaV1bbWFzc19maWVsZHMuZGF0ZV0gKyAnICcgKyBkYXRhc2V0LmRhdGFbbWFzc19pXVttYXNzX2ZpZWxkcy5jYXNlXSArXG4gICAgICBcIiwgXCIgKyBkYXRhc2V0LmRhdGFbbWFzc19pXVttYXNzX2ZpZWxkcy5mYXRhbGl0aWVzXSArICcgZGVhZCwgJyArIGRhdGFzZXQuZGF0YVttYXNzX2ldW21hc3NfZmllbGRzLmluanVyZWRdICsgJyBpbmp1cmVkJylcbiAgICBjb25zb2xlLmxvZygncHVzaCBjYXNlJywgZGF0YXNldC5kYXRhW21hc3NfaV1bbWFzc19maWVsZHMuZGF0ZV0gKyAnICcgKyBkYXRhc2V0LmRhdGFbbWFzc19pXVttYXNzX2ZpZWxkcy5jYXNlXSlcbiAgICBtYXNzX2kgKz0gMVxuICB9XG4gIHN3aXRjaCAobm90ZXMubGVuZ3RoKSB7XG4gICAgZGVmYXVsdDpcbiAgICBjYXNlIDA6XG4gICAgICBtYXNzX3Jlc3QgKz0gMVxuICAgICAgYnJlYWtcbiAgICBjYXNlIDE6XG4gICAgICBtaWRpX25vdGVzLnB1c2gocGxheV9ub3RlKCBub3JtKG5vdGVzWzBdLCBtaW4sIG1heCkgKiBueC5tdWx0aXBseS52YWx1ZSwgMTI4LCBjaGFubmVsLCBleHBvcnRpbmcsIG1hc3NfcmVzdCwgMCkpXG4gICAgICB0aW1pbmdzID0gWzEyOF1cbiAgICAgIGJyZWFrXG4gICAgY2FzZSAyOlxuICAgICAgbWlkaV9ub3Rlcy5wdXNoKHBsYXlfbm90ZSggbm9ybShub3Rlc1swXSwgbWluLCBtYXgpICogbngubXVsdGlwbHkudmFsdWUsIDY0LCBjaGFubmVsLCBleHBvcnRpbmcsIG1hc3NfcmVzdCwgMCkpXG4gICAgICBtaWRpX25vdGVzLnB1c2gocGxheV9ub3RlKCBub3JtKG5vdGVzWzFdLCBtaW4sIG1heCkgKiBueC5tdWx0aXBseS52YWx1ZSwgNjQsIGNoYW5uZWwsIGV4cG9ydGluZywgMCwgNjQpKVxuICAgICAgdGltaW5ncyA9IFs2NCwgNjRdXG4gICAgICBicmVha1xuICAgIGNhc2UgMzpcbiAgICAgIG1pZGlfbm90ZXMucHVzaChwbGF5X25vdGUoIG5vcm0obm90ZXNbMF0sIG1pbiwgbWF4KSAqIG54Lm11bHRpcGx5LnZhbHVlLCA0MywgY2hhbm5lbCwgZXhwb3J0aW5nLCBtYXNzX3Jlc3QsIDApKVxuICAgICAgbWlkaV9ub3Rlcy5wdXNoKHBsYXlfbm90ZSggbm9ybShub3Rlc1sxXSwgbWluLCBtYXgpICogbngubXVsdGlwbHkudmFsdWUsIDQzLCBjaGFubmVsLCBleHBvcnRpbmcsIDAsIDQzKSlcbiAgICAgIG1pZGlfbm90ZXMucHVzaChwbGF5X25vdGUoIG5vcm0obm90ZXNbMl0sIG1pbiwgbWF4KSAqIG54Lm11bHRpcGx5LnZhbHVlLCA0MiwgY2hhbm5lbCwgZXhwb3J0aW5nLCAwLCA4NSkpXG4gICAgICB0aW1pbmdzID0gWzQzLCA0MyAsNDJdXG4gICAgICBicmVha1xuICAgIGNhc2UgNDpcbiAgICAgIG1pZGlfbm90ZXMucHVzaChwbGF5X25vdGUoIG5vcm0obm90ZXNbMF0sIG1pbiwgbWF4KSAqIG54Lm11bHRpcGx5LnZhbHVlLCAzMiwgY2hhbm5lbCwgZXhwb3J0aW5nLCBtYXNzX3Jlc3QsIDApKVxuICAgICAgbWlkaV9ub3Rlcy5wdXNoKHBsYXlfbm90ZSggbm9ybShub3Rlc1sxXSwgbWluLCBtYXgpICogbngubXVsdGlwbHkudmFsdWUsIDMyLCBjaGFubmVsLCBleHBvcnRpbmcsIDAsIDMyKSlcbiAgICAgIG1pZGlfbm90ZXMucHVzaChwbGF5X25vdGUoIG5vcm0obm90ZXNbMl0sIG1pbiwgbWF4KSAqIG54Lm11bHRpcGx5LnZhbHVlLCAzMiwgY2hhbm5lbCwgZXhwb3J0aW5nLCAwLCA2NCkpXG4gICAgICBtaWRpX25vdGVzLnB1c2gocGxheV9ub3RlKCBub3JtKG5vdGVzWzNdLCBtaW4sIG1heCkgKiBueC5tdWx0aXBseS52YWx1ZSwgMzIsIGNoYW5uZWwsIGV4cG9ydGluZywgMCwgOTYpKVxuICAgICAgdGltaW5ncyA9IFszMiwgMzIsIDMyLCAzMl1cbiAgICAgIGJyZWFrXG4gIH1cbiAgaWYgKGNhc2VzLmxlbmd0aCkge1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjYXNlcycpLmlubmVySFRNTCA9IGNhc2VzLmpvaW4oJzxicj4nKVxuICB9XG4gIGlmICh0b3RhbCA8PSBtYXNzX2kpIHtcbiAgICBtYXNzX3Jlc3QgPSAwXG4gICAgbWFzc19pID0gMFxuICAgIGkgPSAwXG4gIH0gZWxzZSB7XG4gICAgaSArPSAxXG4gIH1cbiAga2FsaW1iYS5wbGF5KDIyMCwgLTEyKVxuICBpZiAobm90ZXMubGVuZ3RoKSB7XG4gICAgbWFzc19yZXN0ID0gMFxuICAgIHJldHVybiBbaSwgbWlkaV9ub3RlcywgdGltaW5ncywgbWFzc19yZXN0XVxuICB9XG4gIG1hc3NfcmVzdCArPSAxMjhcbiAgcmV0dXJuIFtpLCBbXSwgW10sIDBdXG59XG5cbi8qIHBsYXkgbmV4dCBub3RlIGFjY29yZGluZyB0byBzb25pZmljYXRpb24gKi9cblxuZnVuY3Rpb24gcGxheV9uZXh0KCl7XG4gIGxldCBub3RlX3RpbWUgPSAxMjAwMDAgLyBUb25lLlRyYW5zcG9ydC5icG0udmFsdWUgKiBub3RlX3ZhbHVlc1tueC50aW1pbmcuYWN0aXZlXVswXVxuICBzZXRUaW1lb3V0KHBsYXlfbmV4dCwgbm90ZV90aW1lKVxuICBsZXQgW25ld19pLCBub3RlcywgdGltaW5nc10gPSBwbGF5X2ZuKGksIGJvdW5kcywgZGlmZiwgbm90ZV90aW1lKVxuICBpID0gbmV3X2lcbiAgaWYgKHJlY29yZGluZykge1xuICAgIGxldCB0aW1pbmcgPSBub3RlX3ZhbHVlc1tueC50aW1pbmcuYWN0aXZlXVsyXVxuICAgIGlmICh0aW1pbmcubGVuZ3RoKSB0aW1pbmcgPSB0aW1pbmdbaSAlIHRpbWluZy5sZW5ndGhdXG4gICAgcmVjb3JkZXIuYWRkRXZlbnQobmV3IE1pZGlXcml0ZXIuTm90ZUV2ZW50KHsgcGl0Y2g6IG5vdGVzLCBkdXJhdGlvbjogJ3QnICsgdGltaW5nIH0pKVxuICB9XG59XG5cbi8qIGJpbmQgc2VsZWN0cyAqL1xuXG5mdW5jdGlvbiBwaWNrX2RhdGFzZXQoa2V5KXtcbiAgY29uc29sZS5sb2coJ3BpY2sgZGF0YXNldDonLCBrZXksIGRhdGFzZXRzW2tleV0pXG4gIGkgPSAwXG4gIG1hc3NfaSA9IDBcbiAgbWFzc19yZXN0ID0gMFxuICBkYXRhc2V0ID0gZGF0YXNldHNba2V5XVxuICBib3VuZHMgPSBnZXRfYm91bmRzKGRhdGFzZXQpXG4gIGRpZmYgPSBnZXRfZGlmZl9ib3VuZHMoYm91bmRzLnJvd3MpXG4gIHBsYXlfZm4gPSBkYXRhc2V0LnBsYXlfZm5cbn1cblxuLyogYnVpbGQgYW5kIGJpbmQgdGhlIFVJICovXG5cbmZ1bmN0aW9uIHJlYWR5KCkge1xuICBzY2FsZXMuYnVpbGRfb3B0aW9ucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2NhbGUnKSlcbiAgYnVpbGRfb3B0aW9ucyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZGF0YXNldCcpLCBkYXRhc2V0cywgcGlja19kYXRhc2V0KVxuXG4gIGNvbnN0IGRpYWxfc2l6ZSA9IFs1MCwgNTBdXG5cblx0VG9uZS5UcmFuc3BvcnQuYnBtLnZhbHVlID0gREVGQVVMVF9CUE1cbiAgbngudGVtcG8gPSBuZXcgTmV4dXMuRGlhbCgnI3RlbXBvJywge1xuICAgIHNpemU6IGRpYWxfc2l6ZSxcbiAgICBtaW46IDEwLFxuICAgIG1heDogMzAwLFxuICAgIHN0ZXA6IDEsXG4gICAgdmFsdWU6IERFRkFVTFRfQlBNLFxuICB9KVxuICB1cGRhdGVfdmFsdWVfb25fY2hhbmdlKG54LnRlbXBvLCAnI3RlbXBvJywgdHJ1ZSwgdiA9PiBUb25lLlRyYW5zcG9ydC5icG0udmFsdWUgPSB2KVxuXG4gIG54LnRpbWluZyA9IG5ldyBOZXh1cy5SYWRpb0J1dHRvbignI3RpbWluZycsIHtcbiAgICBzaXplOiBbNDAwLDI1XSxcbiAgICBudW1iZXJPZkJ1dHRvbnM6IG5vdGVfdmFsdWVzLmxlbmd0aCxcbiAgICBhY3RpdmU6IDYsXG4gIH0pXG4gIHVwZGF0ZV9yYWRpb192YWx1ZV9vbl9jaGFuZ2UobngudGltaW5nLCAnI3RpbWluZycsIG5vdGVfdmFsdWVzKVxuXG4gIG54LmR1cmF0aW9uID0gbmV3IE5leHVzLkRpYWwoJyNkdXJhdGlvbicsIHtcbiAgICBzaXplOiBkaWFsX3NpemUsXG4gICAgbWluOiAwLFxuICAgIG1heDogMixcbiAgICBzdGVwOiAwLjAxLFxuICAgIHZhbHVlOiAwLjgsXG4gIH0pXG4gIHVwZGF0ZV92YWx1ZV9vbl9jaGFuZ2UobnguZHVyYXRpb24sICcjZHVyYXRpb24nLCBmYWxzZSlcblxuICBueC5vZmZzZXQgPSBuZXcgTmV4dXMuRGlhbCgnI29mZnNldCcsIHtcbiAgICBzaXplOiBkaWFsX3NpemUsXG4gICAgbWluOiAtMjQsXG4gICAgbWF4OiAyNCxcbiAgICBzdGVwOiAxLFxuICAgIHZhbHVlOiAtNSxcbiAgfSlcbiAgdXBkYXRlX3ZhbHVlX29uX2NoYW5nZShueC5vZmZzZXQsICcjb2Zmc2V0JywgdHJ1ZSlcblxuICBueC5vY3RhdmUgPSBuZXcgTmV4dXMuRGlhbCgnI29jdGF2ZScsIHtcbiAgICBzaXplOiBkaWFsX3NpemUsXG4gICAgbWluOiAtNCxcbiAgICBtYXg6IDQsXG4gICAgc3RlcDogMSxcbiAgICB2YWx1ZTogMCxcbiAgfSlcbiAgdXBkYXRlX3ZhbHVlX29uX2NoYW5nZShueC5vY3RhdmUsICcjb2N0YXZlJywgdHJ1ZSlcblxuICBueC5tdWx0aXBseSA9IG5ldyBOZXh1cy5EaWFsKCcjbXVsdGlwbHknLCB7XG4gICAgc2l6ZTogZGlhbF9zaXplLFxuICAgIG1pbjogLTY0LFxuICAgIG1heDogNjQsXG4gICAgc3RlcDogMSxcbiAgICB2YWx1ZTogMTksXG4gIH0pXG4gIHVwZGF0ZV92YWx1ZV9vbl9jaGFuZ2UobngubXVsdGlwbHksICcjbXVsdGlwbHknLCB0cnVlKVxuXG4gIG54LmludGVydmFsID0gbmV3IE5leHVzLkRpYWwoJyNpbnRlcnZhbCcsIHtcbiAgICBzaXplOiBkaWFsX3NpemUsXG4gICAgbWluOiAtNjQsXG4gICAgbWF4OiA2NCxcbiAgICBzdGVwOiAxLFxuICAgIHZhbHVlOiAxMCxcbiAgfSlcbiAgdXBkYXRlX3ZhbHVlX29uX2NoYW5nZShueC5pbnRlcnZhbCwgJyNpbnRlcnZhbCcsIHRydWUpXG5cbiAgY29uc3QgZXhwb3J0X21pZGlfYnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2V4cG9ydF9taWRpJylcbiAgZXhwb3J0X21pZGlfYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGV4cG9ydF9wYXR0ZXJuX2FzX21pZGkoZGF0YXNldC5uYW1lLCBib3VuZHMsIGRpZmYsIG54LnRlbXBvLnZhbHVlLCBueC50aW1pbmcuYWN0aXZlLCBwbGF5X2ZuKVxuICB9KVxuXG4gIGNvbnN0IHJlY29yZF9taWRpX2J1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNyZWNvcmRfbWlkaScpXG4gIHJlY29yZF9taWRpX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAocmVjb3JkaW5nKSB7XG4gICAgICByZWNvcmRfbWlkaV9idXR0b24uaW5uZXJIVE1MID0gJ1JlY29yZCBNSURJJ1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdyZWNvcmRpbmcnKVxuICAgICAgcmVjb3JkaW5nID0gZmFsc2VcbiAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBNaWRpV3JpdGVyLldyaXRlcihbcmVjb3JkZXJdKVxuICAgICAgY29uc3QgYmxvYiA9IGRhdGFVUkl0b0Jsb2Iod3JpdGVyLmRhdGFVcmkoKSlcbiAgICAgIHNhdmVBcyhibG9iLCAnUmVjb3JkaW5nIC0gJyArIGRhdGFzZXQubmFtZSArICcubWlkJylcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3JkX21pZGlfYnV0dG9uLmlubmVySFRNTCA9ICdTYXZlIFJlY29yZGluZydcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgncmVjb3JkaW5nJylcbiAgICAgIHJlY29yZGluZyA9IHRydWVcbiAgICAgIHJlY29yZGVyID0gbmV3IE1pZGlXcml0ZXIuVHJhY2soKVxuICAgICAgcmVjb3JkZXIuc2V0VGVtcG8obngudGVtcG8udmFsdWUpXG4gICAgfVxuICB9KVxuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sb2FkaW5nJykuY2xhc3NMaXN0LnJlbW92ZSgnbG9hZGluZycpXG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2RhdGFzZXQnKS52YWx1ZSA9ICdNYXNzIFNob290aW5ncydcbiAgcGlja19kYXRhc2V0KCdNYXNzIFNob290aW5ncycpXG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NjYWxlJykudmFsdWUgPSAnMTQnXG4gIHNjYWxlcy5waWNrKDE0KVxuXG4gIHBsYXlfbmV4dCgpXG59XG5cbi8qIGtleXMgKi9cblxua2V5cy5saXN0ZW4oaW5kZXggPT4ge1xuICBueC5vZmZzZXQudmFsdWUgPSBpbmRleFxuICBueC5vZmZzZXQudXBkYXRlKGluZGV4KVxufSlcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NsaWVudC9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uKCl7XG4gIHZhciBJbnRvbmF0aW9uID0gZnVuY3Rpb24ob3B0KXtcbiAgICBvcHQgPSB0aGlzLm9wdCA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgbmFtZTogXCJcIixcbiAgICAgIHJvb3Q6IDQ0MCxcbiAgICAgIG9jdGF2ZTogMCxcbiAgICAgIGludGVydmFsOiAyLFxuICAgICAgdGV0OiAwLFxuICAgICAgaW50ZXJ2YWxzOiBudWxsLFxuICAgIH0sIG9wdCB8fCB7fSlcbiAgICB0aGlzLmdlbmVyYXRlKClcbiAgfVxuICBJbnRvbmF0aW9uLnByb3RvdHlwZS5nZW5lcmF0ZSA9IGZ1bmN0aW9uKG9wdCl7XG4gICAgb3B0ID0gT2JqZWN0LmFzc2lnbih0aGlzLm9wdCwgb3B0IHx8IHt9KVxuICAgIGlmIChvcHQuc2NsKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlX3NjbCgpXG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdC50ZXQpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVfdGV0KClcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0LmludGVydmFscykge1xuICAgICAgdGhpcy5nZW5lcmF0ZV9pbnRlcnZhbHMoKVxuICAgIH1cbiAgfVxuICBJbnRvbmF0aW9uLnByb3RvdHlwZS5nZW5lcmF0ZV9pbnRlcnZhbHMgPSBmdW5jdGlvbigpe1xuICAgIHZhciByb290ID0gdGhpcy5vcHQucm9vdFxuICAgIHZhciBpbnRlcnZhbF9saXN0ID0gdGhpcy5vcHQuaW50ZXJ2YWxzXG4gICAgaWYgKHR5cGVvZiBpbnRlcnZhbF9saXN0ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIGludGVydmFsX2xpc3QgPSBpbnRlcnZhbF9saXN0LnNwbGl0KFwiIFwiKVxuICAgIH1cbiAgICB0aGlzLm5hbWUgPSB0aGlzLm9wdC5uYW1lIHx8IFwiaW50ZXJ2YWwgbGlzdFwiXG4gICAgdGhpcy5pbnRlcnZhbHMgPSBpbnRlcnZhbF9saXN0XG4gICAgdGhpcy5pbnRlcnZhbCA9IHRoaXMub3B0LmludGVydmFsID0gcGFyc2VJbnRlcnZhbC5jYWxsKHRoaXMsIGludGVydmFsX2xpc3QucG9wKCkgKVxuICAgIHRoaXMuc2NhbGUgPSBpbnRlcnZhbF9saXN0Lm1hcCggcGFyc2VJbnRlcnZhbFN0cmluZy5iaW5kKHRoaXMpICkuZmlsdGVyKGZ1bmN0aW9uKHYpe1xuICAgICAgcmV0dXJuICEhIHZcbiAgICB9KVxuICB9XG4gIEludG9uYXRpb24ucHJvdG90eXBlLmdlbmVyYXRlX3RldCA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHNjYWxlID0gdGhpcy5zY2FsZSA9IFtdXG4gICAgdmFyIHJvb3QgPSB0aGlzLm9wdC5yb290XG4gICAgdmFyIHRldCA9IHRoaXMub3B0LnRldFxuICAgIHZhciBpbnRlcnZhbCA9IHRoaXMuaW50ZXJ2YWwgPSB0aGlzLm9wdC5pbnRlcnZhbFxuICAgIHZhciByYXRpbyA9IE1hdGgucG93KCBpbnRlcnZhbCwgMS90ZXQgKVxuICAgIHZhciBuID0gcm9vdFxuICAgIHNjYWxlLnB1c2gobilcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRldC0xOyBpKyspIHtcbiAgICAgIG4gKj0gcmF0aW9cbiAgICAgIHNjYWxlLnB1c2gobilcbiAgICB9XG4gICAgdGhpcy5uYW1lID0gdGhpcy5vcHQubmFtZSB8fCB0ZXQgKyBcIi10b25lIGVxdWFsIHRlbXBlcmFtZW50XCJcbiAgICB0aGlzLmludGVydmFscyA9IG51bGxcbiAgfVxuICBJbnRvbmF0aW9uLnByb3RvdHlwZS5nZW5lcmF0ZV9zY2wgPSBmdW5jdGlvbigpe1xuICAgIHZhciByb290ID0gdGhpcy5vcHQucm9vdFxuICAgIHZhciBzY2wgPSB0aGlzLnBhcnNlX3NjbCggdGhpcy5vcHQuc2NsIClcbiAgICB0aGlzLmludGVydmFscyA9IHNjbC5ub3Rlc1xuICAgIHRoaXMuaW50ZXJ2YWwgPSBzY2wubm90ZXMucG9wKClcbiAgICB0aGlzLm5hbWUgPSB0aGlzLm9wdC5uYW1lIHx8IHNjbC5kZXNjcmlwdGlvblxuICAgIHRoaXMuc2NhbGUgPSBzY2wubm90ZXMubWFwKGZ1bmN0aW9uKHYpe1xuICAgICAgcmV0dXJuIHYgKiByb290XG4gICAgfSlcbiAgfVxuICBJbnRvbmF0aW9uLnByb3RvdHlwZS5wYXJzZV9zY2wgPSBmdW5jdGlvbihzKXtcbiAgICB2YXIgc2NsID0ge31cbiAgICBzY2wuY29tbWVudHMgPSBbXVxuICAgIHNjbC5ub3RlcyA9IFtdXG4gICAgcy50cmltKCkuc3BsaXQoXCJcXG5cIikuZm9yRWFjaChmdW5jdGlvbihsaW5lKXtcbiAgICAgIC8vIExpbmVzIGJlZ2lubmluZyB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsgYXJlIHJlZ2FyZGVkIGFzIGNvbW1lbnRzXG4gICAgICAvLyBhbmQgYXJlIHRvIGJlIGlnbm9yZWQuXG4gICAgICBpZiAoIGxpbmUuaW5kZXhPZihcIiFcIikgIT09IC0xICkge1xuICAgICAgICBzY2wuY29tbWVudHMucHVzaChsaW5lKVxuICAgICAgfVxuICAgICAgLy8gVGhlIGZpcnN0IChub24gY29tbWVudCkgbGluZSBjb250YWlucyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBzY2FsZS5cbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGRlc2NyaXB0aW9uLCB0aGVyZSBzaG91bGQgYmUgYW4gZW1wdHkgbGluZS4gKG5iOiB3aGljaCBpcyBmYWxzZXkpXG4gICAgICBlbHNlIGlmICggISAoJ2Rlc2NyaXB0aW9uJyBpbiBzY2wpICkge1xuICAgICAgICBzY2wuZGVzY3JpcHRpb24gPSBsaW5lXG4gICAgICB9XG4gICAgICAvLyBUaGUgc2Vjb25kIGxpbmUgY29udGFpbnMgdGhlIG51bWJlciBvZiBub3Rlcy5cbiAgICAgIC8vIFRoZSBmaXJzdCBub3RlIG9mIDEvMSBvciAwLjAgY2VudHMgaXMgaW1wbGljaXQgYW5kIG5vdCBpbiB0aGUgZmlsZXMuXG4gICAgICBlbHNlIGlmICggISBzY2wubm90ZXMubGVuZ3RoKSB7XG4gICAgICAgIHNjbC5ub3Rlcy5wdXNoKDEpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGNvbnRhaW5zIGEgcGVyaW9kLCBpdCBpcyBhIGNlbnRzIHZhbHVlLCBvdGhlcndpc2UgYSByYXRpby5cbiAgICAgICAgdmFyIG5vdGUgPSBsaW5lLnJlcGxhY2UoL15bXi1cXC4wLTldKy8sXCJcIikucmVwbGFjZSgvW14tXFwvXFwuMC05XSskLyxcIlwiKVxuICAgICAgICBpZiAoIG5vdGUuaW5kZXhPZihcIi5cIikgIT09IC0xICkge1xuICAgICAgICAgIG5vdGUgPSBNYXRoLnBvdyggMiwgKHBhcnNlRmxvYXQobm90ZSkgLyAxMjAwKSApXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbm90ZSA9IHBhcnNlSW50ZXJ2YWwobm90ZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobm90ZSkge1xuICAgICAgICAgIHNjbC5ub3Rlcy5wdXNoKG5vdGUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzY2xcbiAgfVxuICBJbnRvbmF0aW9uLnByb3RvdHlwZS5pbmRleCA9IGZ1bmN0aW9uKGksIG9jdGF2ZSl7XG4gICAgb2N0YXZlID0gb2N0YXZlIHx8IHRoaXMub3B0Lm9jdGF2ZVxuICAgIHZhciBmID0gdGhpcy5zY2FsZVsgbW9kKGksIHRoaXMuc2NhbGUubGVuZ3RoKXwwIF1cbiAgICB2YXIgcG93ID0gTWF0aC5mbG9vcihub3JtKGksIDAsIHRoaXMuc2NhbGUubGVuZ3RoKSkgKyBvY3RhdmVcbiAgICBmICo9IE1hdGgucG93KHRoaXMuaW50ZXJ2YWwsIHBvdylcbiAgICByZXR1cm4gZlxuICB9XG4gIEludG9uYXRpb24ucHJvdG90eXBlLnJhbmdlID0gZnVuY3Rpb24obWluLCBtYXgpe1xuICAgIHZhciBhID0gW11cbiAgICBmb3IgKHZhciBpID0gbWluOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgIGEucHVzaCggdGhpcy5pbmRleChpKSApXG4gICAgfVxuICAgIHJldHVybiBhXG4gIH1cbiAgSW50b25hdGlvbi5wcm90b3R5cGUuc2V0X3Jvb3QgPSBmdW5jdGlvbihmKXtcbiAgICB0aGlzLm9wdC5yb290ID0gZlxuICAgIHRoaXMuZ2VuZXJhdGUoKVxuICB9XG4gIEludG9uYXRpb24ucHJvdG90eXBlLnF1YW50aXplX2ZyZXF1ZW5jeSA9IGZ1bmN0aW9uKGYpe1xuICAgIGlmIChmID09IDApIHJldHVybiAwXG4gICAgdmFyIHNjYWxlX2YgPSBmXG4gICAgdmFyIHBvdyA9IDBcbiAgICB2YXIgaW50ZXJ2YWwgPSB0aGlzLmludGVydmFsXG4gICAgdmFyIHNjYWxlID0gdGhpcy5zY2FsZVxuICAgIHdoaWxlIChzY2FsZV9mIDwgcm9vdCkge1xuICAgICAgc2NhbGVfZiAqPSBpbnRlcnZhbFxuICAgICAgcG93IC09IDFcbiAgICB9XG4gICAgd2hpbGUgKHNjYWxlX2YgPiByb290ICogaW50ZXJ2YWwpIHtcbiAgICAgIHNjYWxlX2YgLz0gaW50ZXJ2YWxcbiAgICAgIHBvdyArPSAxXG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NhbGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzY2FsZV9mID4gc2NhbGVbaV0pIGNvbnRpbnVlXG4gICAgICBzY2FsZV9mID0gc2NhbGVbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIHNjYWxlX2YgKj0gTWF0aC5wb3coMiwgcG93KVxuICAgIHJldHVybiBzY2FsZV9mXG4gIH1cbiAgSW50b25hdGlvbi5wcm90b3R5cGUucXVhbnRpemVfaW5kZXggPSBmdW5jdGlvbihpKXtcbiAgICByZXR1cm4gbW9kKGluZGV4LTEsIHRoaXMuc2NhbGUubGVuZ3RoKXwwXG4gIH1cbiAgdmFyIHBhcnNlSW50ZXJ2YWwgPSBJbnRvbmF0aW9uLnByb3RvdHlwZS5wYXJzZV9pbnRlcnZhbCA9IGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHR5cGVvZiBzID09IFwibnVtYmVyXCIpIHJldHVybiBzXG4gICAgaWYgKCEgcy5pbmRleE9mKFwiL1wiKSA9PSAtMSkgcmV0dXJuIHBhcnNlSW50KHMpXG4gICAgdmFyIHBwID0gcy5zcGxpdChcIi9cIilcbiAgICB2YXIgbnVtID0gcGFyc2VJbnQocHBbMF0pXG4gICAgdmFyIGRlbiA9IHBhcnNlSW50KHBwWzFdKVxuICAgIGlmIChpc05hTihudW0pKSByZXR1cm4gMVxuICAgIGlmIChpc05hTihkZW4pIHx8IGRlbiA9PSAwKSByZXR1cm4gbnVtXG4gICAgaWYgKG51bSA9PSBkZW4pIHJldHVybiAxXG4gICAgcmV0dXJuIG51bSAvIGRlblxuICB9XG4gIHZhciBwYXJzZUludGVydmFsU3RyaW5nID0gSW50b25hdGlvbi5wcm90b3R5cGUucGFyc2VfaW50ZXJ2YWxfc3RyaW5nID0gZnVuY3Rpb24ocyl7XG4gICAgaWYgKHMuaW5kZXhPZihcIi9cIikgIT09IC0xKSByZXR1cm4gcGFyc2VJbnRlcnZhbChzKSAqIHRoaXMub3B0LnJvb3QgLy8gaW50ZXJ2YWxzXG4gICAgaWYgKHMuaW5kZXhPZihcImZcIikgIT09IC0xKSByZXR1cm4gcGFyc2VGbG9hdChzKSAgICAvLyBwdXJlIGZyZXF1ZW5jaWVzXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocylcbiAgfVxuICBmdW5jdGlvbiBub3JtKG4sYSxiKXsgcmV0dXJuIChuLWEpIC8gKGItYSkgfVxuICBmdW5jdGlvbiBtb2QobixtKXsgcmV0dXJuIG4tKG0gKiBNYXRoLmZsb29yKG4vbSkpIH1cblxuICByZXR1cm4gSW50b25hdGlvblxufSkoKVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2xpYi9pbnRvbmF0aW9uLmpzIiwiLyoqXG4gKiAgU3RhcnRBdWRpb0NvbnRleHQuanNcbiAqICBAYXV0aG9yIFlvdGFtIE1hbm5cbiAqICBAbGljZW5zZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIE1JVCBMaWNlbnNlXG4gKiAgQGNvcHlyaWdodCAyMDE2IFlvdGFtIE1hbm5cbiAqL1xuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XG4gICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIHJvb3QuU3RhcnRBdWRpb0NvbnRleHQgPSBmYWN0b3J5KCk7XG4gIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuXG4gIC8qKlxuICAgKiBUaGUgU3RhcnRBdWRpb0NvbnRleHQgb2JqZWN0XG4gICAqL1xuICB2YXIgU3RhcnRBdWRpb0NvbnRleHQgPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1ZGlvIGNvbnRleHQgcGFzc2VkIGluIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge0F1ZGlvQ29udGV4dH1cbiAgICAgKi9cbiAgICBjb250ZXh0IDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBUaGUgVGFwTGlzdGVuZXJzIGJvdW5kIHRvIHRoZSBlbGVtZW50c1xuICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF90YXBMaXN0ZW5lcnMgOiBbXSxcbiAgICAvKipcbiAgICAgKiBDYWxsYmFja3MgdG8gaW52b2tlIHdoZW4gdGhlIGF1ZGlvIGNvbnRleHQgaXMgc3RhcnRlZFxuICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vblN0YXJ0ZWQgOiBbXSxcbiAgfTtcblxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbnRleHRcbiAgICogQHBhcmFtIHtBdWRpb0NvbnRleHR9IGN0eFxuICAgKiBAcmV0dXJucyB7U3RhcnRBdWRpb0NvbnRleHR9XG4gICAqL1xuICBTdGFydEF1ZGlvQ29udGV4dC5zZXRDb250ZXh0ID0gZnVuY3Rpb24oY3R4KXtcbiAgICBTdGFydEF1ZGlvQ29udGV4dC5jb250ZXh0ID0gY3R4O1xuICAgIHJldHVybiBTdGFydEF1ZGlvQ29udGV4dDtcbiAgfTtcblxuICAvKipcbiAgICogQWRkIGEgdGFwIGxpc3RlbmVyIHRvIHRoZSBhdWRpbyBjb250ZXh0XG4gICAqIEBwYXJhbSAge0FycmF5fEVsZW1lbnR8U3RyaW5nfGpRdWVyeX0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7U3RhcnRBdWRpb0NvbnRleHR9XG4gICAqL1xuICBTdGFydEF1ZGlvQ29udGV4dC5vbiA9IGZ1bmN0aW9uKGVsZW1lbnQpe1xuICAgIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpIHx8IChOb2RlTGlzdCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QpKXtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5sZW5ndGg7IGkrKyl7XG4gICAgICAgIFN0YXJ0QXVkaW9Db250ZXh0Lm9uKGVsZW1lbnRbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpe1xuICAgICAgU3RhcnRBdWRpb0NvbnRleHQub24oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlbGVtZW50KSk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50LmpxdWVyeSAmJiB0eXBlb2YgZWxlbWVudC50b0FycmF5ID09PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgU3RhcnRBdWRpb0NvbnRleHQub24oZWxlbWVudC50b0FycmF5KCkpO1xuICAgIH0gZWxzZSBpZiAoRWxlbWVudCAmJiBlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCl7XG4gICAgICAvL2lmIGl0J3MgYW4gZWxlbWVudCwgY3JlYXRlIGEgVGFwTGlzdGVuZXJcbiAgICAgIHZhciB0YXAgPSBuZXcgVGFwTGlzdGVuZXIoZWxlbWVudCwgb25UYXApO1xuICAgICAgU3RhcnRBdWRpb0NvbnRleHQuX3RhcExpc3RlbmVycy5wdXNoKHRhcCk7XG4gICAgfSBcbiAgICByZXR1cm4gU3RhcnRBdWRpb0NvbnRleHQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJpbmQgYSBjYWxsYmFjayB0byB3aGVuIHRoZSBhdWRpbyBjb250ZXh0IGlzIHN0YXJ0ZWQuIFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYlxuICAgKiBAcmV0dXJuIHtTdGFydEF1ZGlvQ29udGV4dH1cbiAgICovXG4gIFN0YXJ0QXVkaW9Db250ZXh0Lm9uU3RhcnRlZCA9IGZ1bmN0aW9uKGNiKXtcbiAgICAvL2lmIGl0J3MgYWxyZWFkeSBzdGFydGVkLCBpbnZva2UgdGhlIGNhbGxiYWNrXG4gICAgaWYgKFN0YXJ0QXVkaW9Db250ZXh0LmlzU3RhcnRlZCgpKXtcbiAgICAgIGNiKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFN0YXJ0QXVkaW9Db250ZXh0Ll9vblN0YXJ0ZWQucHVzaChjYik7XG4gICAgfVxuICAgIHJldHVybiBTdGFydEF1ZGlvQ29udGV4dDtcbiAgfTtcblxuICAvKipcbiAgICogcmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZXh0IGlzIHN0YXJ0ZWRcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIFN0YXJ0QXVkaW9Db250ZXh0LmlzU3RhcnRlZCA9IGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIChTdGFydEF1ZGlvQ29udGV4dC5jb250ZXh0ICE9PSBudWxsICYmIFN0YXJ0QXVkaW9Db250ZXh0LmNvbnRleHQuc3RhdGUgPT09IFwicnVubmluZ1wiKTtcbiAgfTtcblxuICAvKipcbiAgICogQGNsYXNzICBMaXN0ZW5zIGZvciBub24tZHJhZ2dpbmcgdGFwIGVuZHMgb24gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdmFyIFRhcExpc3RlbmVyID0gZnVuY3Rpb24oZWxlbWVudCl7XG5cbiAgICB0aGlzLl9kcmFnZ2VkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcblxuICAgIHRoaXMuX2JpbmRlZE1vdmUgPSB0aGlzLl9tb3ZlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2JpbmRlZEVuZCA9IHRoaXMuX2VuZGVkLmJpbmQodGhpcyk7XG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgdGhpcy5fYmluZGVkTW92ZSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5fYmluZGVkRW5kKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuX2JpbmRlZEVuZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGRyYWcgbW92ZSBldmVudFxuICAgKi9cbiAgVGFwTGlzdGVuZXIucHJvdG90eXBlLl9tb3ZlZCA9IGZ1bmN0aW9uKGUpe1xuICAgIHRoaXMuX2RyYWdnZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiB0YXAgZW5kZWQgbGlzdGVuZXJcbiAgICovXG4gIFRhcExpc3RlbmVyLnByb3RvdHlwZS5fZW5kZWQgPSBmdW5jdGlvbihlKXtcbiAgICBpZiAoIXRoaXMuX2RyYWdnZWQpe1xuICAgICAgb25UYXAoKTtcbiAgICB9XG4gICAgdGhpcy5fZHJhZ2dlZCA9IGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZW1vdmUgYWxsIHRoZSBib3VuZCBldmVudHNcbiAgICovXG4gIFRhcExpc3RlbmVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKXtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgdGhpcy5fYmluZGVkTW92ZSk7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5fYmluZGVkRW5kKTtcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMuX2JpbmRlZEVuZCk7XG4gICAgdGhpcy5fYmluZGVkTW92ZSA9IG51bGw7XG4gICAgdGhpcy5fYmluZGVkRW5kID0gbnVsbDtcbiAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogSW52b2tlZCB0aGUgZmlyc3QgdGltZSBvZiB0aGUgZWxlbWVudHMgaXMgdGFwcGVkLlxuICAgKiBDcmVhdGVzIGEgc2lsZW50IG9zY2lsbGF0b3Igd2hlbiBhIG5vbi1kcmFnZ2luZyB0b3VjaGVuZCBcbiAgICogZXZlbnQgaGFzIGJlZW4gdHJpZ2dlcmVkLlxuICAgKi9cbiAgZnVuY3Rpb24gb25UYXAoKXtcbiAgICAvL3N0YXJ0IHRoZSBhdWRpbyBjb250ZXh0IHdpdGggYSBzaWxlbnQgb3NjaWxsYXRvclxuICAgIGlmIChTdGFydEF1ZGlvQ29udGV4dC5jb250ZXh0ICYmICFTdGFydEF1ZGlvQ29udGV4dC5pc1N0YXJ0ZWQoKSl7XG4gICAgICB2YXIgb3NjID0gU3RhcnRBdWRpb0NvbnRleHQuY29udGV4dC5jcmVhdGVPc2NpbGxhdG9yKCk7XG4gICAgICB2YXIgc2lsZW50ID0gU3RhcnRBdWRpb0NvbnRleHQuY29udGV4dC5jcmVhdGVHYWluKCk7XG4gICAgICBzaWxlbnQuZ2Fpbi52YWx1ZSA9IDA7XG4gICAgICBvc2MuY29ubmVjdChzaWxlbnQpO1xuICAgICAgc2lsZW50LmNvbm5lY3QoU3RhcnRBdWRpb0NvbnRleHQuY29udGV4dC5kZXN0aW5hdGlvbik7XG4gICAgICB2YXIgbm93ID0gU3RhcnRBdWRpb0NvbnRleHQuY29udGV4dC5jdXJyZW50VGltZTtcbiAgICAgIG9zYy5zdGFydChub3cpO1xuICAgICAgb3NjLnN0b3Aobm93KzAuNSk7XG4gICAgfVxuXG4gICAgLy9kaXNwb3NlIGFsbCB0aGUgdGFwIGxpc3RlbmVyc1xuICAgIGlmIChTdGFydEF1ZGlvQ29udGV4dC5fdGFwTGlzdGVuZXJzKXtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgU3RhcnRBdWRpb0NvbnRleHQuX3RhcExpc3RlbmVycy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIFN0YXJ0QXVkaW9Db250ZXh0Ll90YXBMaXN0ZW5lcnNbaV0uZGlzcG9zZSgpO1xuICAgICAgfVxuICAgICAgU3RhcnRBdWRpb0NvbnRleHQuX3RhcExpc3RlbmVycyA9IG51bGw7XG4gICAgfVxuICAgIC8vdGhlIG9uc3RhcnRlZCBjYWxsYmFja3NcbiAgICBpZiAoU3RhcnRBdWRpb0NvbnRleHQuX29uU3RhcnRlZCl7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IFN0YXJ0QXVkaW9Db250ZXh0Ll9vblN0YXJ0ZWQubGVuZ3RoOyBqKyspe1xuICAgICAgICBTdGFydEF1ZGlvQ29udGV4dC5fb25TdGFydGVkW2pdKCk7XG4gICAgICB9XG4gICAgICBTdGFydEF1ZGlvQ29udGV4dC5fb25TdGFydGVkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gU3RhcnRBdWRpb0NvbnRleHQ7XG59KSk7XG5cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vY2xpZW50L2xpYi9zdGFydEF1ZGlvQ29udGV4dC5qcyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tLmpzXG4vLyBtb2R1bGUgaWQgPSA4M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9nZXQtaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9pcy1pdGVyYWJsZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iYWJlbC1ydW50aW1lL2NvcmUtanMvaXMtaXRlcmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9tYXRoL2xvZzJcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFiZWwtcnVudGltZS9jb3JlLWpzL21hdGgvbG9nMi5qc1xuLy8gbW9kdWxlIGlkID0gODZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3Qva2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3Byb21pc2VcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IDg4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2xcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC5qc1xuLy8gbW9kdWxlIGlkID0gODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSA5MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cbnZhciBfc3ltYm9sID0gcmVxdWlyZShcIi4uL2NvcmUtanMvc3ltYm9sXCIpO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIF9pdGVyYXRvcjIuZGVmYXVsdCA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vYmFiZWwtcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qc1xuLy8gbW9kdWxlIGlkID0gOTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gcGxhY2VIb2xkZXJzQ291bnQgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gdGhlIG51bWJlciBvZiBlcXVhbCBzaWducyAocGxhY2UgaG9sZGVycylcbiAgLy8gaWYgdGhlcmUgYXJlIHR3byBwbGFjZWhvbGRlcnMsIHRoYW4gdGhlIHR3byBjaGFyYWN0ZXJzIGJlZm9yZSBpdFxuICAvLyByZXByZXNlbnQgb25lIGJ5dGVcbiAgLy8gaWYgdGhlcmUgaXMgb25seSBvbmUsIHRoZW4gdGhlIHRocmVlIGNoYXJhY3RlcnMgYmVmb3JlIGl0IHJlcHJlc2VudCAyIGJ5dGVzXG4gIC8vIHRoaXMgaXMganVzdCBhIGNoZWFwIGhhY2sgdG8gbm90IGRvIGluZGV4T2YgdHdpY2VcbiAgcmV0dXJuIGI2NFtsZW4gLSAyXSA9PT0gJz0nID8gMiA6IGI2NFtsZW4gLSAxXSA9PT0gJz0nID8gMSA6IDBcbn1cblxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIC8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuICByZXR1cm4gYjY0Lmxlbmd0aCAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciBpLCBqLCBsLCB0bXAsIHBsYWNlSG9sZGVycywgYXJyXG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIHBsYWNlSG9sZGVycyA9IHBsYWNlSG9sZGVyc0NvdW50KGI2NClcblxuICBhcnIgPSBuZXcgQXJyKGxlbiAqIDMgLyA0IC0gcGxhY2VIb2xkZXJzKVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgbCA9IHBsYWNlSG9sZGVycyA+IDAgPyBsZW4gLSA0IDogbGVuXG5cbiAgdmFyIEwgPSAwXG5cbiAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDQsIGogKz0gMykge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfCByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltMKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVycyA9PT0gMikge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH0gZWxzZSBpZiAocGxhY2VIb2xkZXJzID09PSAxKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICsgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICsgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gKyBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID0gKHVpbnQ4W2ldIDw8IDE2KSArICh1aW50OFtpICsgMV0gPDwgOCkgKyAodWludDhbaSArIDJdKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgb3V0cHV0ID0gJydcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDJdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz09J1xuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyAodWludDhbbGVuIC0gMV0pXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMTBdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPSdcbiAgfVxuXG4gIHBhcnRzLnB1c2gob3V0cHV0KVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Jhc2U2NC1qcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gOTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5BcnJheS5mcm9tO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvZnJvbS5qc1xuLy8gbW9kdWxlIGlkID0gOTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvcicpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSA5NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGUnKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L2ZuL2lzLWl0ZXJhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzInKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk1hdGgubG9nMjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L2ZuL21hdGgvbG9nMi5qc1xuLy8gbW9kdWxlIGlkID0gOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmFzc2lnbjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ24uanNcbi8vIG1vZHVsZSBpZCA9IDk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5rZXlzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Qua2V5cztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSA5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuUHJvbWlzZTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L2ZuL3Byb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IDk5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuU3ltYm9sO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fd2tzLWV4dCcpLmYoJ2l0ZXJhdG9yJyk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDEwMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanNcbi8vIG1vZHVsZSBpZCA9IDEwMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpe1xuICBpZighKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSl7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4taW5zdGFuY2UuanNcbi8vIG1vZHVsZSBpZCA9IDEwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgdG9JbmRleCAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoJHRoaXMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuICAgICAgLCB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKWlmKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pe1xuICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qc1xuLy8gbW9kdWxlIGlkID0gMTA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGNyZWF0ZURlc2MgICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIGluZGV4LCB2YWx1ZSl7XG4gIGlmKGluZGV4IGluIG9iamVjdCkkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2luZGV4XSA9IHZhbHVlO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NyZWF0ZS1wcm9wZXJ0eS5qc1xuLy8gbW9kdWxlIGlkID0gMTA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BTICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIHBJRSAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHJlc3VsdCAgICAgPSBnZXRLZXlzKGl0KVxuICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYoZ2V0U3ltYm9scyl7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuICAgICAgLCBpc0VudW0gID0gcElFLmZcbiAgICAgICwgaSAgICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlyZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1rZXlzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGN0eCAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBjYWxsICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgLCBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9MZW5ndGggICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGdldEl0ZXJGbiAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKVxuICAsIEJSRUFLICAgICAgID0ge31cbiAgLCBSRVRVUk4gICAgICA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1Ipe1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbigpeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpXG4gICAgLCBmICAgICAgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSlcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYoaXNBcnJheUl0ZXIoaXRlckZuKSlmb3IobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgKXtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZihyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKXJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLICA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mb3Itb2YuanNcbi8vIG1vZHVsZSBpZCA9IDEwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIGFyZ3MsIHRoYXQpe1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaChhcmdzLmxlbmd0aCl7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pbnZva2UuanNcbi8vIG1vZHVsZSBpZCA9IDEwOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKXtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDEwOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBkZXNjcmlwdG9yICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbigpeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpe1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHtuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG4gIHJldHVybiB7dmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmV9O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qc1xuLy8gbW9kdWxlIGlkID0gMTExXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnZXRLZXlzICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIGVsKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaW5kZXggID0gMFxuICAgICwga2V5O1xuICB3aGlsZShsZW5ndGggPiBpbmRleClpZihPW2tleSA9IGtleXNbaW5kZXgrK11dID09PSBlbClyZXR1cm4ga2V5O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2tleW9mLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIE1FVEEgICAgID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKVxuICAsIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBoYXMgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgc2V0RGVzYyAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgaWQgICAgICAgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBpc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbnZhciBzZXRNZXRhID0gZnVuY3Rpb24oaXQpe1xuICBzZXREZXNjKGl0LCBNRVRBLCB7dmFsdWU6IHtcbiAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9fSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcbiAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZighaXNPYmplY3QoaXQpKXJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmKCFoYXMoaXQsIE1FVEEpKXtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmKCFpc0V4dGVuc2libGUoaXQpKXJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZighY3JlYXRlKXJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24oaXQsIGNyZWF0ZSl7XG4gIGlmKCFoYXMoaXQsIE1FVEEpKXtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmKCFpc0V4dGVuc2libGUoaXQpKXJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKXNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiAgICAgIE1FVEEsXG4gIE5FRUQ6ICAgICBmYWxzZSxcbiAgZmFzdEtleTogIGZhc3RLZXksXG4gIGdldFdlYWs6ICBnZXRXZWFrLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19tZXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgbWFjcm90YXNrID0gcmVxdWlyZSgnLi9fdGFzaycpLnNldFxuICAsIE9ic2VydmVyICA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyXG4gICwgcHJvY2VzcyAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBQcm9taXNlICAgPSBnbG9iYWwuUHJvbWlzZVxuICAsIGlzTm9kZSAgICA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpe1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHBhcmVudCwgZm47XG4gICAgaWYoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZShoZWFkKXtcbiAgICAgIGZuICAgPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoKGUpe1xuICAgICAgICBpZihoZWFkKW5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmKHBhcmVudClwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmKGlzTm9kZSl7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlclxuICB9IGVsc2UgaWYoT2JzZXJ2ZXIpe1xuICAgIHZhciB0b2dnbGUgPSB0cnVlXG4gICAgICAsIG5vZGUgICA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpe1xuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICAvLyBzdHJhbmdlIElFICsgd2VicGFjayBkZXYgc2VydmVyIGJ1ZyAtIHVzZSAuY2FsbChnbG9iYWwpXG4gICAgICBtYWNyb3Rhc2suY2FsbChnbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGZuKXtcbiAgICB2YXIgdGFzayA9IHtmbjogZm4sIG5leHQ6IHVuZGVmaW5lZH07XG4gICAgaWYobGFzdClsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmKCFoZWFkKXtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19taWNyb3Rhc2suanNcbi8vIG1vZHVsZSBpZCA9IDExNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QUyAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpXG4gICwgcElFICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJylcbiAgLCB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSU9iamVjdCAgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCAkYXNzaWduICA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHZhciBBID0ge31cbiAgICAsIEIgPSB7fVxuICAgICwgUyA9IFN5bWJvbCgpXG4gICAgLCBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24oayl7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSl7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgICAgID0gdG9PYmplY3QodGFyZ2V0KVxuICAgICwgYUxlbiAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBpbmRleCA9IDFcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmZcbiAgICAsIGlzRW51bSAgICAgPSBwSUUuZjtcbiAgd2hpbGUoYUxlbiA+IGluZGV4KXtcbiAgICB2YXIgUyAgICAgID0gSU9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pXG4gICAgICAsIGtleXMgICA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUylcbiAgICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAgICwgaiAgICAgID0gMFxuICAgICAgLCBrZXk7XG4gICAgd2hpbGUobGVuZ3RoID4gailpZihpc0VudW0uY2FsbChTLCBrZXkgPSBrZXlzW2orK10pKVRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qc1xuLy8gbW9kdWxlIGlkID0gMTE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBkUCAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGdldEtleXMgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgICA9IGdldEtleXMoUHJvcGVydGllcylcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpID0gMFxuICAgICwgUDtcbiAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHBJRSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCB0b0lPYmplY3QgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgZ09QRCAgICAgICAgICAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKXtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBnT1BEKE8sIFApO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIGlmKGhhcyhPLCBQKSlyZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanNcbi8vIG1vZHVsZSBpZCA9IDExN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgZ09QTiAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mXG4gICwgdG9TdHJpbmcgID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbihpdCl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdPUE4oaXQpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJyA/IGdldFdpbmRvd05hbWVzKGl0KSA6IGdPUE4odG9JT2JqZWN0KGl0KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanNcbi8vIG1vZHVsZSBpZCA9IDExOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qc1xuLy8gbW9kdWxlIGlkID0gMTE5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIG1vc3QgT2JqZWN0IG1ldGhvZHMgYnkgRVM2IHNob3VsZCBhY2NlcHQgcHJpbWl0aXZlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIGNvcmUgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBmYWlscyAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oS0VZLCBleGVjKXtcbiAgdmFyIGZuICA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXVxuICAgICwgZXhwID0ge307XG4gIGV4cFtLRVldID0gZXhlYyhmbik7XG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24oKXsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qtc2FwLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHRhcmdldCwgc3JjLCBzYWZlKXtcbiAgZm9yKHZhciBrZXkgaW4gc3JjKXtcbiAgICBpZihzYWZlICYmIHRhcmdldFtrZXldKXRhcmdldFtrZXldID0gc3JjW2tleV07XG4gICAgZWxzZSBoaWRlKHRhcmdldCwga2V5LCBzcmNba2V5XSk7XG4gIH0gcmV0dXJuIHRhcmdldDtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS1hbGwuanNcbi8vIG1vZHVsZSBpZCA9IDEyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGNvcmUgICAgICAgID0gcmVxdWlyZSgnLi9fY29yZScpXG4gICwgZFAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsIFNQRUNJRVMgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihLRVkpe1xuICB2YXIgQyA9IHR5cGVvZiBjb3JlW0tFWV0gPT0gJ2Z1bmN0aW9uJyA/IGNvcmVbS0VZXSA6IGdsb2JhbFtLRVldO1xuICBpZihERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKWRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NldC1zcGVjaWVzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJylcbiAgLCBTUEVDSUVTICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBEKXtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvciwgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDEyM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgZGVmaW5lZCAgID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oVE9fU1RSSU5HKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKHRoYXQsIHBvcyl7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSlcbiAgICAgICwgaSA9IHRvSW50ZWdlcihwb3MpXG4gICAgICAsIGwgPSBzLmxlbmd0aFxuICAgICAgLCBhLCBiO1xuICAgIGlmKGkgPCAwIHx8IGkgPj0gbClyZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3N0cmluZy1hdC5qc1xuLy8gbW9kdWxlIGlkID0gMTI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpbmRleCwgbGVuZ3RoKXtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZ2V0ICAgICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBpdGVyRm4gPSBnZXQoaXQpO1xuICBpZih0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIHJldHVybiBhbk9iamVjdChpdGVyRm4uY2FsbChpdCkpO1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDEyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY2xhc3NvZiAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgSVRFUkFUT1IgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmlzSXRlcmFibGUgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBPID0gT2JqZWN0KGl0KTtcbiAgcmV0dXJuIE9bSVRFUkFUT1JdICE9PSB1bmRlZmluZWRcbiAgICB8fCAnQEBpdGVyYXRvcicgaW4gT1xuICAgIHx8IEl0ZXJhdG9ycy5oYXNPd25Qcm9wZXJ0eShjbGFzc29mKE8pKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuaXMtaXRlcmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDEyN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgY3R4ICAgICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCB0b09iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgY2FsbCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKVxuICAsIGlzQXJyYXlJdGVyICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpXG4gICwgdG9MZW5ndGggICAgICAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5JylcbiAgLCBnZXRJdGVyRm4gICAgICA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24oaXRlcil7IEFycmF5LmZyb20oaXRlcik7IH0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4xIEFycmF5LmZyb20oYXJyYXlMaWtlLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgZnJvbTogZnVuY3Rpb24gZnJvbShhcnJheUxpa2UvKiwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQqLyl7XG4gICAgdmFyIE8gICAgICAgPSB0b09iamVjdChhcnJheUxpa2UpXG4gICAgICAsIEMgICAgICAgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5XG4gICAgICAsIGFMZW4gICAgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgICAsIG1hcGZuICAgPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZFxuICAgICAgLCBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZFxuICAgICAgLCBpbmRleCAgID0gMFxuICAgICAgLCBpdGVyRm4gID0gZ2V0SXRlckZuKE8pXG4gICAgICAsIGxlbmd0aCwgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZihtYXBwaW5nKW1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhKEMgPT0gQXJyYXkgJiYgaXNBcnJheUl0ZXIoaXRlckZuKSkpe1xuICAgICAgZm9yKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4Kyspe1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvcihyZXN1bHQgPSBuZXcgQyhsZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanNcbi8vIG1vZHVsZSBpZCA9IDEyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpXG4gICwgc3RlcCAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpXG4gICwgSXRlcmF0b3JzICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgdG9JT2JqZWN0ICAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbihpdGVyYXRlZCwga2luZCl7XG4gIHRoaXMuX3QgPSB0b0lPYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24oKXtcbiAgdmFyIE8gICAgID0gdGhpcy5fdFxuICAgICwga2luZCAgPSB0aGlzLl9rXG4gICAgLCBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpe1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYoa2luZCA9PSAna2V5cycgIClyZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmKGtpbmQgPT0gJ3ZhbHVlcycpcmV0dXJuIHN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gc3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbmFkZFRvVW5zY29wYWJsZXMoJ2tleXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ3ZhbHVlcycpO1xuYWRkVG9VbnNjb3BhYmxlcygnZW50cmllcycpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDEyOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAyMC4yLjIuMjIgTWF0aC5sb2cyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCl7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpIC8gTWF0aC5MTjI7XG4gIH1cbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0Jywge2Fzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpfSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsICRrZXlzICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpe1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMTMyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2xhc3NvZiAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgJGV4cG9ydCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBpc09iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuSW5zdGFuY2UgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIHRhc2sgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBtaWNyb3Rhc2sgICAgICAgICAgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpXG4gICwgUFJPTUlTRSAgICAgICAgICAgID0gJ1Byb21pc2UnXG4gICwgVHlwZUVycm9yICAgICAgICAgID0gZ2xvYmFsLlR5cGVFcnJvclxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgJFByb21pc2UgICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgICAgICAgICAgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGVtcHR5ICAgICAgICAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBJbnRlcm5hbCwgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24oKXtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSAgICAgPSAkUHJvbWlzZS5yZXNvbHZlKDEpXG4gICAgICAsIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbihleGVjKXsgZXhlYyhlbXB0eSwgZW1wdHkpOyB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICByZXR1cm4gc2FtZUNvbnN0cnVjdG9yKCRQcm9taXNlLCBDKVxuICAgID8gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgOiBuZXcgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbigkJHJlc29sdmUsICQkcmVqZWN0KXtcbiAgICBpZihyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ICA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCAgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihwcm9taXNlLCBpc1JlamVjdCl7XG4gIGlmKHByb21pc2UuX24pcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBvayAgICA9IHByb21pc2UuX3MgPT0gMVxuICAgICAgLCBpICAgICA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uKHJlYWN0aW9uKXtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWxcbiAgICAgICAgLCByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZVxuICAgICAgICAsIHJlamVjdCAgPSByZWFjdGlvbi5yZWplY3RcbiAgICAgICAgLCBkb21haW4gID0gcmVhY3Rpb24uZG9tYWluXG4gICAgICAgICwgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoaGFuZGxlcil7XG4gICAgICAgICAgaWYoIW9rKXtcbiAgICAgICAgICAgIGlmKHByb21pc2UuX2ggPT0gMilvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihoYW5kbGVyID09PSB0cnVlKXJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgYWJydXB0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZihhYnJ1cHQpdGhyb3cgYWJydXB0LmVycm9yO1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgaWYocHJvbWlzZS5faCA9PSAxKXJldHVybiBmYWxzZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jXG4gICAgLCBpICAgICA9IDBcbiAgICAsIHJlYWN0aW9uO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmKGlzTm9kZSl7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpe1xuICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92fSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZighcHJvbWlzZS5fYSlwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXNcbiAgICAsIHRoZW47XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocHJvbWlzZSA9PT0gdmFsdWUpdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKXtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgICAgICB2YXIgd3JhcHBlciA9IHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7X3c6IHByb21pc2UsIF9kOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2goZXJyKXtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpe1xuICAgICAgdmFyIHJlYWN0aW9uICAgID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayAgICAgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgICA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX2EpdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX3Mpbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGVkKXtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHByb21pc2UgID0gbmV3IEludGVybmFsO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCAgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtQcm9taXNlOiAkUHJvbWlzZX0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVqZWN0ICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpe1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZih4IGluc3RhbmNlb2YgJFByb21pc2UgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpKXJldHVybiB4O1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZXNvbHZlICA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICAkJHJlc29sdmUoeCk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZXNvbHZlICAgID0gY2FwYWJpbGl0eS5yZXNvbHZlXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgdmFyIHZhbHVlcyAgICA9IFtdXG4gICAgICAgICwgaW5kZXggICAgID0gMFxuICAgICAgICAsIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICB2YXIgJGluZGV4ICAgICAgICA9IGluZGV4KytcbiAgICAgICAgICAsIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICBpZihhbHJlYWR5Q2FsbGVkKXJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkICA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gMTMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIERFU0NSSVBUT1JTICAgID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBNRVRBICAgICAgICAgICA9IHJlcXVpcmUoJy4vX21ldGEnKS5LRVlcbiAgLCAkZmFpbHMgICAgICAgICA9IHJlcXVpcmUoJy4vX2ZhaWxzJylcbiAgLCBzaGFyZWQgICAgICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgdWlkICAgICAgICAgICAgPSByZXF1aXJlKCcuL191aWQnKVxuICAsIHdrcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJylcbiAgLCB3a3NFeHQgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcy1leHQnKVxuICAsIHdrc0RlZmluZSAgICAgID0gcmVxdWlyZSgnLi9fd2tzLWRlZmluZScpXG4gICwga2V5T2YgICAgICAgICAgPSByZXF1aXJlKCcuL19rZXlvZicpXG4gICwgZW51bUtleXMgICAgICAgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKVxuICAsIGlzQXJyYXkgICAgICAgID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKVxuICAsIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0lPYmplY3QgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBjcmVhdGVEZXNjICAgICA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKVxuICAsIF9jcmVhdGUgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgZ09QTkV4dCAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKVxuICAsICRHT1BEICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKVxuICAsICREUCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCAka2V5cyAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BEICAgICAgICAgICA9ICRHT1BELmZcbiAgLCBkUCAgICAgICAgICAgICA9ICREUC5mXG4gICwgZ09QTiAgICAgICAgICAgPSBnT1BORXh0LmZcbiAgLCAkU3ltYm9sICAgICAgICA9IGdsb2JhbC5TeW1ib2xcbiAgLCAkSlNPTiAgICAgICAgICA9IGdsb2JhbC5KU09OXG4gICwgX3N0cmluZ2lmeSAgICAgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnlcbiAgLCBQUk9UT1RZUEUgICAgICA9ICdwcm90b3R5cGUnXG4gICwgSElEREVOICAgICAgICAgPSB3a3MoJ19oaWRkZW4nKVxuICAsIFRPX1BSSU1JVElWRSAgID0gd2tzKCd0b1ByaW1pdGl2ZScpXG4gICwgaXNFbnVtICAgICAgICAgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZVxuICAsIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKVxuICAsIEFsbFN5bWJvbHMgICAgID0gc2hhcmVkKCdzeW1ib2xzJylcbiAgLCBPUFN5bWJvbHMgICAgICA9IHNoYXJlZCgnb3Atc3ltYm9scycpXG4gICwgT2JqZWN0UHJvdG8gICAgPSBPYmplY3RbUFJPVE9UWVBFXVxuICAsIFVTRV9OQVRJVkUgICAgID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJ1xuICAsIFFPYmplY3QgICAgICAgID0gZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBfY3JlYXRlKGRQKHt9LCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiBkUCh0aGlzLCAnYScsIHt2YWx1ZTogN30pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24oaXQsIGtleSwgRCl7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEKE9iamVjdFByb3RvLCBrZXkpO1xuICBpZihwcm90b0Rlc2MpZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZihwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvKWRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24odGFnKXtcbiAgdmFyIHN5bSA9IEFsbFN5bWJvbHNbdGFnXSA9IF9jcmVhdGUoJFN5bWJvbFtQUk9UT1RZUEVdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCl7XG4gIGlmKGl0ID09PSBPYmplY3RQcm90bykkZGVmaW5lUHJvcGVydHkoT1BTeW1ib2xzLCBrZXksIEQpO1xuICBhbk9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEQpO1xuICBpZihoYXMoQWxsU3ltYm9scywga2V5KSl7XG4gICAgaWYoIUQuZW51bWVyYWJsZSl7XG4gICAgICBpZighaGFzKGl0LCBISURERU4pKWRQKGl0LCBISURERU4sIGNyZWF0ZURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0paXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX2NyZWF0ZShELCB7ZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSl9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKXtcbiAgYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IGVudW1LZXlzKFAgPSB0b0lPYmplY3QoUCkpXG4gICAgLCBpICAgID0gMFxuICAgICwgbCA9IGtleXMubGVuZ3RoXG4gICAgLCBrZXk7XG4gIHdoaWxlKGwgPiBpKSRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApe1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX2NyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfY3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSl7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybiBmYWxzZTtcbiAgcmV0dXJuIEUgfHwgIWhhcyh0aGlzLCBrZXkpIHx8ICFoYXMoQWxsU3ltYm9scywga2V5KSB8fCBoYXModGhpcywgSElEREVOKSAmJiB0aGlzW0hJRERFTl1ba2V5XSA/IEUgOiB0cnVlO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpe1xuICBpdCAgPSB0b0lPYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZihpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmKEQgJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSlELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgdmFyIG5hbWVzICA9IGdPUE4odG9JT2JqZWN0KGl0KSlcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuICAgIGlmKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSlyZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpe1xuICB2YXIgSVNfT1AgID0gaXQgPT09IE9iamVjdFByb3RvXG4gICAgLCBuYW1lcyAgPSBnT1BOKElTX09QID8gT1BTeW1ib2xzIDogdG9JT2JqZWN0KGl0KSlcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCBrZXk7XG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpe1xuICAgIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSlyZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmKCFVU0VfTkFUSVZFKXtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpe1xuICAgIGlmKHRoaXMgaW5zdGFuY2VvZiAkU3ltYm9sKXRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuICAgIHZhciB0YWcgPSB1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICAgIHZhciAkc2V0ID0gZnVuY3Rpb24odmFsdWUpe1xuICAgICAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8pJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYoaGFzKHRoaXMsIEhJRERFTikgJiYgaGFzKHRoaXNbSElEREVOXSwgdGFnKSl0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmKERFU0NSSVBUT1JTICYmIHNldHRlcilzZXRTeW1ib2xEZXNjKE9iamVjdFByb3RvLCB0YWcsIHtjb25maWd1cmFibGU6IHRydWUsIHNldDogJHNldH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgJEdPUEQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG4gICREUC5mICAgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiAgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJykuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgaWYoREVTQ1JJUFRPUlMgJiYgIXJlcXVpcmUoJy4vX2xpYnJhcnknKSl7XG4gICAgcmVkZWZpbmUoT2JqZWN0UHJvdG8sICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICB3a3NFeHQuZiA9IGZ1bmN0aW9uKG5hbWUpe1xuICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG4gIH1cbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwge1N5bWJvbDogJFN5bWJvbH0pO1xuXG5mb3IodmFyIHN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrcyhzeW1ib2xzW2krK10pO1xuXG5mb3IodmFyIHN5bWJvbHMgPSAka2V5cyh3a3Muc3RvcmUpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApd2tzRGVmaW5lKHN5bWJvbHNbaSsrXSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24oa2V5KXtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKGtleSl7XG4gICAgaWYoaXNTeW1ib2woa2V5KSlyZXR1cm4ga2V5T2YoU3ltYm9sUmVnaXN0cnksIGtleSk7XG4gICAgdGhyb3cgVHlwZUVycm9yKGtleSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uKCl7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24oKXsgc2V0dGVyID0gZmFsc2U7IH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICghVVNFX05BVElWRSB8fCAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoe2E6IFN9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSkpLCAnSlNPTicsIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpe1xuICAgIGlmKGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKXJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIHZhciBhcmdzID0gW2l0XVxuICAgICAgLCBpICAgID0gMVxuICAgICAgLCByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcmVwbGFjZXIgPSBhcmdzWzFdO1xuICAgIGlmKHR5cGVvZiByZXBsYWNlciA9PSAnZnVuY3Rpb24nKSRyZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIGlmKCRyZXBsYWNlciB8fCAhaXNBcnJheShyZXBsYWNlcikpcmVwbGFjZXIgPSBmdW5jdGlvbihrZXksIHZhbHVlKXtcbiAgICAgIGlmKCRyZXBsYWNlcil2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYoIWlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3ltYm9sLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDEzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAyLjMuMVxuLy8gIyBDU1YgUGFyc2VyXG5cbi8vIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgQ1NWIHBhcnNlciB0ZXN0ZWQgYW5kIHVzZWQgYWdhaW5zdCBsYXJnZSBkYXRhc2V0cy4gT3ZlclxuLy8gdGhlIHllYXIsIGl0IGhhcyBiZWVuIGVuaGFuY2UgYW5kIGlzIG5vdyBmdWxsIG9mIHVzZWZ1bCBvcHRpb25zLlxuXG4vLyBQbGVhc2UgbG9vayBhdCB0aGUgW1JFQURNRV0sIHRoZSBbcHJvamVjdCB3ZWJzaXRlXVtzaXRlXSB0aGUgW3NhbXBsZXNdIGFuZCB0aGVcbi8vIFt0ZXN0c10gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uXG52YXIgUGFyc2VyLCBTdHJpbmdEZWNvZGVyLCBpc09iakxpdGVyYWwsIHN0cmVhbSwgdXRpbDtcblxuc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5cbnV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cblN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXI7XG5cbi8vICMjIFVzYWdlXG5cbi8vIENhbGxiYWNrIGFwcHJvYWNoLCBmb3IgZWFzZSBvZiB1c2U6ICAgXG5cbi8vIGBwYXJzZShkYXRhLCBbb3B0aW9uc10sIGNhbGxiYWNrKWAgICAgIFxuXG4vLyBbTm9kZS5qcyBTdHJlYW0gQVBJXVtzdHJlYW1dLCBmb3IgbWF4aW11bSBvZiBwb3dlcjogICBcblxuLy8gYHBhcnNlKFtvcHRpb25zXSwgW2NhbGxiYWNrXSlgICAgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2ssIGNhbGxlZCwgY2h1bmtzLCBkYXRhLCBlcnIsIG9wdGlvbnMsIHBhcnNlcjtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkYXRhID0gYXJndW1lbnRzWzBdO1xuICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMV07XG4gICAgY2FsbGJhY2sgPSBhcmd1bWVudHNbMl07XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgY2FsbGJhY2sgYXJndW1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoY2FsbGJhY2spfWApO1xuICAgIH1cbiAgICBpZiAoISh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgfHwgQnVmZmVyLmlzQnVmZmVyKGFyZ3VtZW50c1swXSkpKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soRXJyb3IoYEludmFsaWQgZGF0YSBhcmd1bWVudDogJHtKU09OLnN0cmluZ2lmeShkYXRhKX1gKSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyAxc3QgYXJnIGlzIGRhdGE6c3RyaW5nIG9yIG9wdGlvbnM6b2JqZWN0XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnIHx8IEJ1ZmZlci5pc0J1ZmZlcihhcmd1bWVudHNbMF0pKSB7XG4gICAgICBkYXRhID0gYXJndW1lbnRzWzBdO1xuICAgIH0gZWxzZSBpZiAoaXNPYmpMaXRlcmFsKGFyZ3VtZW50c1swXSkpIHtcbiAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVyciA9IGBJbnZhbGlkIGZpcnN0IGFyZ3VtZW50OiAke0pTT04uc3RyaW5naWZ5KGFyZ3VtZW50c1swXSl9YDtcbiAgICB9XG4gICAgLy8gMm5kIGFyZyBpcyBvcHRpb25zOm9iamVjdCBvciBjYWxsYmFjazpmdW5jdGlvblxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZ3VtZW50c1sxXTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqTGl0ZXJhbChhcmd1bWVudHNbMV0pKSB7XG4gICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBlcnIgPSAnSW52YWxpZCBhcmd1bWVudHM6IGdvdCBvcHRpb25zIHR3aWNlIGFzIGZpcnN0IGFuZCBzZWNvbmQgYXJndW1lbnRzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVyciA9IGBJbnZhbGlkIGZpcnN0IGFyZ3VtZW50OiAke0pTT04uc3RyaW5naWZ5KGFyZ3VtZW50c1sxXSl9YDtcbiAgICB9XG4gICAgaWYgKGVycikge1xuICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICB0aHJvdyBFcnJvcihlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEVycm9yKGVycikpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gYXJndW1lbnRzWzBdO1xuICAgIH1cbiAgfVxuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIHBhcnNlciA9IG5ldyBQYXJzZXIob3B0aW9ucyk7XG4gIGlmIChkYXRhICE9IG51bGwpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAgcGFyc2VyLndyaXRlKGRhdGEpO1xuICAgICAgcmV0dXJuIHBhcnNlci5lbmQoKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoY2FsbGJhY2spIHtcbiAgICBjYWxsZWQgPSBmYWxzZTtcbiAgICBjaHVua3MgPSBvcHRpb25zLm9iam5hbWUgPyB7fSA6IFtdO1xuICAgIHBhcnNlci5vbigncmVhZGFibGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjaHVuaywgcmVzdWx0cztcbiAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgIHdoaWxlIChjaHVuayA9IHBhcnNlci5yZWFkKCkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMub2JqbmFtZSkge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChjaHVua3NbY2h1bmtbMF1dID0gY2h1bmtbMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChjaHVua3MucHVzaChjaHVuaykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KTtcbiAgICBwYXJzZXIub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfSk7XG4gICAgcGFyc2VyLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBjaHVua3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXJzZXI7XG59O1xuXG4vLyAjIyBgUGFyc2VyKFtvcHRpb25zXSlgXG5cbi8vIE9wdGlvbnMgYXJlIGRvY3VtZW50ZWQgW2hlcmVdKGh0dHA6Ly9jc3YuYWRhbHRhcy5jb20vcGFyc2UvKS5cblBhcnNlciA9IGZ1bmN0aW9uKG9wdGlvbnMgPSB7fSkge1xuICB2YXIgYmFzZSwgYmFzZTEsIGJhc2UxMCwgYmFzZTExLCBiYXNlMTIsIGJhc2UxMywgYmFzZTE0LCBiYXNlMTUsIGJhc2UxNiwgYmFzZTE3LCBiYXNlMiwgYmFzZTMsIGJhc2U0LCBiYXNlNSwgYmFzZTYsIGJhc2U3LCBiYXNlOCwgYmFzZTksIGssIHY7XG4gIC8vIEBvcHRpb25zID0gb3B0aW9uc1xuICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgZm9yIChrIGluIG9wdGlvbnMpIHtcbiAgICB2ID0gb3B0aW9uc1trXTtcbiAgICB0aGlzLm9wdGlvbnNba10gPSB2O1xuICB9XG4gIHRoaXMub3B0aW9ucy5vYmplY3RNb2RlID0gdHJ1ZTtcbiAgc3RyZWFtLlRyYW5zZm9ybS5jYWxsKHRoaXMsIHRoaXMub3B0aW9ucyk7XG4gIGlmICgoYmFzZSA9IHRoaXMub3B0aW9ucykucm93RGVsaW1pdGVyID09IG51bGwpIHtcbiAgICBiYXNlLnJvd0RlbGltaXRlciA9IG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIgPSBbdGhpcy5vcHRpb25zLnJvd0RlbGltaXRlcl07XG4gIH1cbiAgaWYgKChiYXNlMSA9IHRoaXMub3B0aW9ucykuZGVsaW1pdGVyID09IG51bGwpIHtcbiAgICBiYXNlMS5kZWxpbWl0ZXIgPSAnLCc7XG4gIH1cbiAgaWYgKHRoaXMub3B0aW9ucy5xdW90ZSAhPT0gdm9pZCAwICYmICF0aGlzLm9wdGlvbnMucXVvdGUpIHtcbiAgICB0aGlzLm9wdGlvbnMucXVvdGUgPSAnJztcbiAgfVxuICBpZiAoKGJhc2UyID0gdGhpcy5vcHRpb25zKS5xdW90ZSA9PSBudWxsKSB7XG4gICAgYmFzZTIucXVvdGUgPSAnXCInO1xuICB9XG4gIGlmICgoYmFzZTMgPSB0aGlzLm9wdGlvbnMpLmVzY2FwZSA9PSBudWxsKSB7XG4gICAgYmFzZTMuZXNjYXBlID0gJ1wiJztcbiAgfVxuICBpZiAoKGJhc2U0ID0gdGhpcy5vcHRpb25zKS5jb2x1bW5zID09IG51bGwpIHtcbiAgICBiYXNlNC5jb2x1bW5zID0gbnVsbDtcbiAgfVxuICBpZiAoKGJhc2U1ID0gdGhpcy5vcHRpb25zKS5jb21tZW50ID09IG51bGwpIHtcbiAgICBiYXNlNS5jb21tZW50ID0gJyc7XG4gIH1cbiAgaWYgKChiYXNlNiA9IHRoaXMub3B0aW9ucykub2JqbmFtZSA9PSBudWxsKSB7XG4gICAgYmFzZTYub2JqbmFtZSA9IGZhbHNlO1xuICB9XG4gIGlmICgoYmFzZTcgPSB0aGlzLm9wdGlvbnMpLnRyaW0gPT0gbnVsbCkge1xuICAgIGJhc2U3LnRyaW0gPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2U4ID0gdGhpcy5vcHRpb25zKS5sdHJpbSA9PSBudWxsKSB7XG4gICAgYmFzZTgubHRyaW0gPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2U5ID0gdGhpcy5vcHRpb25zKS5ydHJpbSA9PSBudWxsKSB7XG4gICAgYmFzZTkucnRyaW0gPSBmYWxzZTtcbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLmF1dG9fcGFyc2UgIT0gbnVsbCkge1xuICAgIHRoaXMub3B0aW9ucy5jYXN0ID0gdGhpcy5vcHRpb25zLmF1dG9fcGFyc2U7XG4gIH1cbiAgaWYgKChiYXNlMTAgPSB0aGlzLm9wdGlvbnMpLmNhc3QgPT0gbnVsbCkge1xuICAgIGJhc2UxMC5jYXN0ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHRoaXMub3B0aW9ucy5hdXRvX3BhcnNlX2RhdGUgIT0gbnVsbCkge1xuICAgIHRoaXMub3B0aW9ucy5jYXN0X2RhdGUgPSB0aGlzLm9wdGlvbnMuYXV0b19wYXJzZV9kYXRlO1xuICB9XG4gIGlmICgoYmFzZTExID0gdGhpcy5vcHRpb25zKS5jYXN0X2RhdGUgPT0gbnVsbCkge1xuICAgIGJhc2UxMS5jYXN0X2RhdGUgPSBmYWxzZTtcbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLmNhc3RfZGF0ZSA9PT0gdHJ1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5jYXN0X2RhdGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG07XG4gICAgICBtID0gRGF0ZS5wYXJzZSh2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKG0pKSB7XG4gICAgICAgIHZhbHVlID0gbmV3IERhdGUobSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfVxuICBpZiAoKGJhc2UxMiA9IHRoaXMub3B0aW9ucykucmVsYXggPT0gbnVsbCkge1xuICAgIGJhc2UxMi5yZWxheCA9IGZhbHNlO1xuICB9XG4gIGlmICgoYmFzZTEzID0gdGhpcy5vcHRpb25zKS5yZWxheF9jb2x1bW5fY291bnQgPT0gbnVsbCkge1xuICAgIGJhc2UxMy5yZWxheF9jb2x1bW5fY291bnQgPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2UxNCA9IHRoaXMub3B0aW9ucykuc2tpcF9lbXB0eV9saW5lcyA9PSBudWxsKSB7XG4gICAgYmFzZTE0LnNraXBfZW1wdHlfbGluZXMgPSBmYWxzZTtcbiAgfVxuICBpZiAoKGJhc2UxNSA9IHRoaXMub3B0aW9ucykubWF4X2xpbWl0X29uX2RhdGFfcmVhZCA9PSBudWxsKSB7XG4gICAgYmFzZTE1Lm1heF9saW1pdF9vbl9kYXRhX3JlYWQgPSAxMjgwMDA7XG4gIH1cbiAgaWYgKChiYXNlMTYgPSB0aGlzLm9wdGlvbnMpLnNraXBfbGluZXNfd2l0aF9lbXB0eV92YWx1ZXMgPT0gbnVsbCkge1xuICAgIGJhc2UxNi5za2lwX2xpbmVzX3dpdGhfZW1wdHlfdmFsdWVzID0gZmFsc2U7XG4gIH1cbiAgaWYgKChiYXNlMTcgPSB0aGlzLm9wdGlvbnMpLnNraXBfbGluZXNfd2l0aF9lcnJvciA9PSBudWxsKSB7XG4gICAgYmFzZTE3LnNraXBfbGluZXNfd2l0aF9lcnJvciA9IGZhbHNlO1xuICB9XG4gIC8vIENvdW50ZXJzXG4gIC8vIGxpbmVzID0gY291bnQgKyBza2lwcGVkX2xpbmVfY291bnQgKyBlbXB0eV9saW5lX2NvdW50XG4gIHRoaXMubGluZXMgPSAwOyAvLyBOdW1iZXIgb2YgbGluZXMgZW5jb3VudGVyZWQgaW4gdGhlIHNvdXJjZSBkYXRhc2V0XG4gIHRoaXMuY291bnQgPSAwOyAvLyBOdW1iZXIgb2YgcmVjb3JkcyBiZWluZyBwcm9jZXNzZWRcbiAgdGhpcy5za2lwcGVkX2xpbmVfY291bnQgPSAwOyAvLyBOdW1iZXIgb2YgcmVjb3JkcyBza2lwcGVkIGR1ZSB0byBlcnJvcnNcbiAgdGhpcy5lbXB0eV9saW5lX2NvdW50ID0gMDsgLy8gTnVtYmVyIG9mIGVtcHR5IGxpbmVzXG4gIC8vIENvbnN0YW50c1xuICB0aGlzLmlzX2ludCA9IC9eKFxcLXxcXCspPyhbMS05XStbMC05XSopJC87XG4gIC8vIEBpc19mbG9hdCA9IC9eKFxcLXxcXCspPyhbMC05XSsoXFwuWzAtOV0rKShbZUVdWzAtOV0rKT98SW5maW5pdHkpJC9cbiAgLy8gQGlzX2Zsb2F0ID0gL14oXFwtfFxcKyk/KCgoWzAtOV0pfChbMS05XStbMC05XSopKShcXC5bMC05XSspKFtlRV1bMC05XSspP3xJbmZpbml0eSkkL1xuICB0aGlzLmlzX2Zsb2F0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlIC0gcGFyc2VGbG9hdCh2YWx1ZSkgKyAxKSA+PSAwOyAvLyBCb3Jyb3dlZCBmcm9tIGpxdWVyeVxuICB9O1xuICAvLyBJbnRlcm5hbCBzdGF0ZVxuICB0aGlzLl8gPSB7XG4gICAgZGVjb2RlcjogbmV3IFN0cmluZ0RlY29kZXIoKSxcbiAgICBxdW90aW5nOiBmYWxzZSxcbiAgICBjb21tZW50aW5nOiBmYWxzZSxcbiAgICBmaWVsZDogbnVsbCxcbiAgICBuZXh0Q2hhcjogbnVsbCxcbiAgICBjbG9zaW5nUXVvdGU6IDAsXG4gICAgbGluZTogW10sXG4gICAgY2h1bmtzOiBbXSxcbiAgICByYXdCdWY6ICcnLFxuICAgIGJ1ZjogJycsXG4gICAgcm93RGVsaW1pdGVyTGVuZ3RoOiB0aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyID8gTWF0aC5tYXgoLi4udGhpcy5vcHRpb25zLnJvd0RlbGltaXRlci5tYXAoZnVuY3Rpb24odikge1xuICAgICAgcmV0dXJuIHYubGVuZ3RoO1xuICAgIH0pKSA6IHZvaWQgMCxcbiAgICBsaW5lSGFzRXJyb3I6IGZhbHNlLFxuICAgIGlzRW5kZWQ6IGZhbHNlXG4gIH07XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gIyMgSW50ZXJuYWwgQVBJXG5cbi8vIFRoZSBQYXJzZXIgaW1wbGVtZW50IGEgW2BzdHJlYW0uVHJhbnNmb3JtYCBjbGFzc11bdHJhbnNmb3JtXS5cblxuLy8gIyMjIEV2ZW50c1xuXG4vLyBUaGUgbGlicmFyeSBleHRlbmRzIE5vZGUgW0V2ZW50RW1pdHRlcl1bZXZlbnRdIGNsYXNzIGFuZCBlbWl0IGFsbFxuLy8gdGhlIGV2ZW50cyBvZiB0aGUgV3JpdGFibGUgYW5kIFJlYWRhYmxlIFtTdHJlYW0gQVBJXVtzdHJlYW1dLiBcbnV0aWwuaW5oZXJpdHMoUGFyc2VyLCBzdHJlYW0uVHJhbnNmb3JtKTtcblxuLy8gRm9yIGV4dHJhIGZsZXhpYmlsaXR5LCB5b3UgY2FuIGdldCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIFBhcnNlclxuLy8gY2xhc3M6IGByZXF1aXJlKCdjc3YtcGFyc2UnKS5QYXJzZXJgLlxubW9kdWxlLmV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuXG4vLyAjIyMgYF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaylgXG5cbi8vICogICBgY2h1bmtgIEJ1ZmZlciB8IFN0cmluZyAgIFxuLy8gICAgIFRoZSBjaHVuayB0byBiZSB0cmFuc2Zvcm1lZC4gV2lsbCBhbHdheXMgYmUgYSBidWZmZXIgdW5sZXNzIHRoZSBkZWNvZGVTdHJpbmdzIG9wdGlvbiB3YXMgc2V0IHRvIGZhbHNlLlxuLy8gKiAgIGBlbmNvZGluZ2AgU3RyaW5nICAgXG4vLyAgICAgSWYgdGhlIGNodW5rIGlzIGEgc3RyaW5nLCB0aGVuIHRoaXMgaXMgdGhlIGVuY29kaW5nIHR5cGUuIChJZ25vcmUgaWYgZGVjb2RlU3RyaW5ncyBjaHVuayBpcyBhIGJ1ZmZlci4pXG4vLyAqICAgYGNhbGxiYWNrYCBGdW5jdGlvbiAgIFxuLy8gICAgIENhbGwgdGhpcyBmdW5jdGlvbiAob3B0aW9uYWxseSB3aXRoIGFuIGVycm9yIGFyZ3VtZW50KSB3aGVuIHlvdSBhcmUgZG9uZSBwcm9jZXNzaW5nIHRoZSBzdXBwbGllZCBjaHVuay5cblxuLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIFtgc3RyZWFtLlRyYW5zZm9ybWAgQVBJXVt0cmFuc2Zvcm1dXG5QYXJzZXIucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgIHZhciBlcnI7XG4gICAgaWYgKGNodW5rIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICBjaHVuayA9IHRoaXMuXy5kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICB9XG4gICAgZXJyID0gdGhpcy5fX3dyaXRlKGNodW5rLCBmYWxzZSk7XG4gICAgaWYgKGVycikge1xuICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgIH1cbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfSk7XG59O1xuXG5QYXJzZXIucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiBjYWxsYmFjayh0aGlzLl9fZmx1c2goKSk7XG59O1xuXG5QYXJzZXIucHJvdG90eXBlLl9fZmx1c2ggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGVycjtcbiAgZXJyID0gdGhpcy5fX3dyaXRlKHRoaXMuXy5kZWNvZGVyLmVuZCgpLCB0cnVlKTtcbiAgaWYgKGVycikge1xuICAgIHJldHVybiBlcnI7XG4gIH1cbiAgaWYgKHRoaXMuXy5xdW90aW5nKSB7XG4gICAgZXJyID0gdGhpcy5lcnJvcihgUXVvdGVkIGZpZWxkIG5vdCB0ZXJtaW5hdGVkIGF0IGxpbmUgJHt0aGlzLmxpbmVzICsgMX1gKTtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIGlmICh0aGlzLl8ubGluZS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wdXNoKHRoaXMuXy5saW5lKTtcbiAgfVxufTtcblxuUGFyc2VyLnByb3RvdHlwZS5fX3B1c2ggPSBmdW5jdGlvbihsaW5lKSB7XG4gIHZhciBjYWxsX2NvbHVtbl91ZGYsIGNvbHVtbnMsIGVyciwgZmllbGQsIGksIGosIGxlbiwgbGluZUFzQ29sdW1ucywgcmVjb3JkO1xuICBpZiAodGhpcy5fLmlzRW5kZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRoaXMub3B0aW9ucy5za2lwX2xpbmVzX3dpdGhfZW1wdHlfdmFsdWVzICYmIGxpbmUuam9pbignJykudHJpbSgpID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuICByZWNvcmQgPSBudWxsO1xuICBpZiAodGhpcy5vcHRpb25zLmNvbHVtbnMgPT09IHRydWUpIHtcbiAgICB0aGlzLm9wdGlvbnMuY29sdW1ucyA9IGxpbmU7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuY29sdW1ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxfY29sdW1uX3VkZiA9IGZ1bmN0aW9uKGZuLCBsaW5lKSB7XG4gICAgICB2YXIgY29sdW1ucywgZXJyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29sdW1ucyA9IGZuLmNhbGwobnVsbCwgbGluZSk7XG4gICAgICAgIHJldHVybiBbbnVsbCwgY29sdW1uc107XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlcnIgPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuIFtlcnJdO1xuICAgICAgfVxuICAgIH07XG4gICAgW2VyciwgY29sdW1uc10gPSBjYWxsX2NvbHVtbl91ZGYodGhpcy5vcHRpb25zLmNvbHVtbnMsIGxpbmUpO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucy5jb2x1bW5zID0gY29sdW1ucztcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCF0aGlzLl8ubGluZV9sZW5ndGggJiYgbGluZS5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5fLmxpbmVfbGVuZ3RoID0gdGhpcy5vcHRpb25zLmNvbHVtbnMgPyB0aGlzLm9wdGlvbnMuY29sdW1ucy5sZW5ndGggOiBsaW5lLmxlbmd0aDtcbiAgfVxuICAvLyBEb250IGNoZWNrIGNvbHVtbiBjb3VudCBvbiBlbXB0eSBsaW5lc1xuICBpZiAobGluZS5sZW5ndGggPT09IDEgJiYgbGluZVswXSA9PT0gJycpIHtcbiAgICB0aGlzLmVtcHR5X2xpbmVfY291bnQrKztcbiAgfSBlbHNlIGlmIChsaW5lLmxlbmd0aCAhPT0gdGhpcy5fLmxpbmVfbGVuZ3RoKSB7XG4gICAgLy8gRG9udCBjaGVjayBjb2x1bW4gY291bnQgd2l0aCByZWxheF9jb2x1bW5fY291bnRcbiAgICBpZiAodGhpcy5vcHRpb25zLnJlbGF4X2NvbHVtbl9jb3VudCkge1xuICAgICAgdGhpcy5jb3VudCsrO1xuICAgICAgdGhpcy5za2lwcGVkX2xpbmVfY291bnQrKztcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jb2x1bW5zICE9IG51bGwpIHtcbiAgICAgIC8vIFN1Z2dlc3Q6IEluY29uc2lzdGVudCBoZWFkZXIgYW5kIGNvbHVtbiBudW1iZXJzOiBoZWFkZXIgaXMgMSBhbmQgbnVtYmVyIG9mIGNvbHVtbnMgaXMgMSBvbiBsaW5lIDFcbiAgICAgIGVyciA9IHRoaXMuZXJyb3IoYE51bWJlciBvZiBjb2x1bW5zIG9uIGxpbmUgJHt0aGlzLmxpbmVzfSBkb2VzIG5vdCBtYXRjaCBoZWFkZXJgKTtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVyciA9IHRoaXMuZXJyb3IoYE51bWJlciBvZiBjb2x1bW5zIGlzIGluY29uc2lzdGVudCBvbiBsaW5lICR7dGhpcy5saW5lc31gKTtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMuY291bnQrKztcbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLmNvbHVtbnMgIT0gbnVsbCkge1xuICAgIGxpbmVBc0NvbHVtbnMgPSB7fTtcbiAgICBmb3IgKGkgPSBqID0gMCwgbGVuID0gbGluZS5sZW5ndGg7IGogPCBsZW47IGkgPSArK2opIHtcbiAgICAgIGZpZWxkID0gbGluZVtpXTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sdW1uc1tpXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsaW5lQXNDb2x1bW5zW3RoaXMub3B0aW9ucy5jb2x1bW5zW2ldXSA9IGZpZWxkO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLm9iam5hbWUpIHtcbiAgICAgIHJlY29yZCA9IFtsaW5lQXNDb2x1bW5zW3RoaXMub3B0aW9ucy5vYmpuYW1lXSwgbGluZUFzQ29sdW1uc107XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29yZCA9IGxpbmVBc0NvbHVtbnM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlY29yZCA9IGxpbmU7XG4gIH1cbiAgaWYgKHRoaXMuY291bnQgPCB0aGlzLm9wdGlvbnMuZnJvbSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLnJhdykge1xuICAgIHRoaXMucHVzaCh7XG4gICAgICByYXc6IHRoaXMuXy5yYXdCdWYsXG4gICAgICByb3c6IHJlY29yZFxuICAgIH0pO1xuICAgIHRoaXMuXy5yYXdCdWYgPSAnJztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnB1c2gocmVjb3JkKTtcbiAgfVxuICBpZiAodGhpcy5saXN0ZW5lckNvdW50KCdyZWNvcmQnKSkge1xuICAgIHRoaXMuZW1pdCgncmVjb3JkJywgcmVjb3JkKTtcbiAgfVxuICAvLyBXaGVuIHRvIGlzIHJlYWNoZWQgc2V0IGlnbm9yZSBhbnkgZnV0dXJlIGNhbGxzXG4gIGlmICh0aGlzLmNvdW50ID49IHRoaXMub3B0aW9ucy50bykge1xuICAgIHRoaXMuXy5pc0VuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5wdXNoKG51bGwpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuUGFyc2VyLnByb3RvdHlwZS5fX3dyaXRlID0gZnVuY3Rpb24oY2hhcnMsIGVuZCkge1xuICB2YXIgYXJlTmV4dENoYXJzRGVsaW1pdGVyLCBhcmVOZXh0Q2hhcnNSb3dEZWxpbWl0ZXJzLCBjYXN0LCBjaGFyLCBlcnIsIGVzY2FwZUlzUXVvdGUsIGksIGlzRGVsaW1pdGVyLCBpc0VzY2FwZSwgaXNOZXh0Q2hhckFDb21tZW50LCBpc05leHRDaGFyVHJpbWFibGUsIGlzUXVvdGUsIGlzUm93RGVsaW1pdGVyLCBpc1Jvd0RlbGltaXRlckxlbmd0aCwgaXNfZmxvYXQsIGlzX2ludCwgbCwgbHRyaW0sIG5leHRDaGFyUG9zLCByZWYsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlbWFpbmluZ0J1ZmZlciwgcm93RGVsaW1pdGVyLCBydHJpbSwgd2FzQ29tbWVudGluZztcbiAgaXNfaW50ID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmlzX2ludCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuaXNfaW50KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaXNfaW50LnRlc3QodmFsdWUpO1xuICAgIH1cbiAgfTtcbiAgaXNfZmxvYXQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAodHlwZW9mIHRoaXMuaXNfZmxvYXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzX2Zsb2F0KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaXNfZmxvYXQudGVzdCh2YWx1ZSk7XG4gICAgfVxuICB9O1xuICBjYXN0ID0gKHZhbHVlLCBjb250ZXh0ID0ge30pID0+IHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5jYXN0KSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LnF1b3RpbmcgPT0gbnVsbCkge1xuICAgICAgY29udGV4dC5xdW90aW5nID0gISF0aGlzLl8uY2xvc2luZ1F1b3RlO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC5saW5lcyA9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LmxpbmVzID0gdGhpcy5saW5lcztcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuY291bnQgPT0gbnVsbCkge1xuICAgICAgY29udGV4dC5jb3VudCA9IHRoaXMuY291bnQ7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmluZGV4ID09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuaW5kZXggPSB0aGlzLl8ubGluZS5sZW5ndGg7XG4gICAgfVxuICAgIC8vIGNvbnRleHQuaGVhZGVyID89IGlmIEBvcHRpb25zLmNvbHVtbiBhbmQgQGxpbmVzIGlzIDEgYW5kIEBjb3VudCBpcyAwIHRoZW4gdHJ1ZSBlbHNlIGZhbHNlXG4gICAgaWYgKGNvbnRleHQuaGVhZGVyID09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuaGVhZGVyID0gdGhpcy5vcHRpb25zLmNvbHVtbnMgPT09IHRydWU7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmNvbHVtbiA9PSBudWxsKSB7XG4gICAgICBjb250ZXh0LmNvbHVtbiA9IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmNvbHVtbnMpID8gdGhpcy5vcHRpb25zLmNvbHVtbnNbY29udGV4dC5pbmRleF0gOiBjb250ZXh0LmluZGV4O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5jYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmNhc3QodmFsdWUsIGNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAoaXNfaW50KHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChpc19mbG9hdCh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuY2FzdF9kYXRlKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMub3B0aW9ucy5jYXN0X2RhdGUodmFsdWUsIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIGx0cmltID0gdGhpcy5vcHRpb25zLnRyaW0gfHwgdGhpcy5vcHRpb25zLmx0cmltO1xuICBydHJpbSA9IHRoaXMub3B0aW9ucy50cmltIHx8IHRoaXMub3B0aW9ucy5ydHJpbTtcbiAgY2hhcnMgPSB0aGlzLl8uYnVmICsgY2hhcnM7XG4gIGwgPSBjaGFycy5sZW5ndGg7XG4gIGkgPSAwO1xuICBpZiAodGhpcy5saW5lcyA9PT0gMCAmJiAweEZFRkYgPT09IGNoYXJzLmNoYXJDb2RlQXQoMCkpIHtcbiAgICAvLyBTdHJpcCBCT00gaGVhZGVyXG4gICAgaSsrO1xuICB9XG4gIHdoaWxlIChpIDwgbCkge1xuICAgIC8vIEVuc3VyZSB3ZSBnZXQgZW5vdWdoIHNwYWNlIHRvIGxvb2sgYWhlYWRcbiAgICBpZiAoIWVuZCkge1xuICAgICAgcmVtYWluaW5nQnVmZmVyID0gY2hhcnMuc3Vic3RyKGksIGwgLSBpKTtcbiAgICAgIC8vIChpKzEwMDAgPj0gbCkgb3JcbiAgICAgIC8vIFNraXAgaWYgdGhlIHJlbWFpbmluZyBidWZmZXIgY2FuIGJlIGNvbW1lbnRcbiAgICAgIC8vIFNraXAgaWYgdGhlIHJlbWFpbmluZyBidWZmZXIgY2FuIGJlIHJvdyBkZWxpbWl0ZXJcbiAgICAgIGlmICgoIXRoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIgJiYgaSArIDMgPiBsKSB8fCAoIXRoaXMuXy5jb21tZW50aW5nICYmIGwgLSBpIDwgdGhpcy5vcHRpb25zLmNvbW1lbnQubGVuZ3RoICYmIHRoaXMub3B0aW9ucy5jb21tZW50LnN1YnN0cigwLCBsIC0gaSkgPT09IHJlbWFpbmluZ0J1ZmZlcikgfHwgKHRoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIgJiYgbCAtIGkgPCB0aGlzLl8ucm93RGVsaW1pdGVyTGVuZ3RoICYmIHRoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIuc29tZShmdW5jdGlvbihyZCkge1xuICAgICAgICByZXR1cm4gcmQuc3Vic3RyKDAsIGwgLSBpKSA9PT0gcmVtYWluaW5nQnVmZmVyO1xuICAgICAgLy8gU2tpcCBpZiB0aGUgcmVtYWluaW5nIGJ1ZmZlciBjYW4gYmUgcm93IGRlbGltaXRlciBmb2xsb3dpbmcgdGhlIGNsb3NpbmcgcXVvdGVcbiAgICAgIH0pKSB8fCAodGhpcy5vcHRpb25zLnJvd0RlbGltaXRlciAmJiB0aGlzLl8ucXVvdGluZyAmJiBsIC0gaSA8ICh0aGlzLm9wdGlvbnMucXVvdGUubGVuZ3RoICsgdGhpcy5fLnJvd0RlbGltaXRlckxlbmd0aCkgJiYgdGhpcy5vcHRpb25zLnJvd0RlbGltaXRlci5zb21lKChyZCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMub3B0aW9ucy5xdW90ZSArIHJkKS5zdWJzdHIoMCwgbCAtIGkpID09PSByZW1haW5pbmdCdWZmZXI7XG4gICAgICAvLyBTa2lwIGlmIHRoZSByZW1haW5pbmcgYnVmZmVyIGNhbiBiZSBkZWxpbWl0ZXJcbiAgICAgIC8vIFNraXAgaWYgdGhlIHJlbWFpbmluZyBidWZmZXIgY2FuIGJlIGVzY2FwZSBzZXF1ZW5jZVxuICAgICAgfSkpIHx8IChsIC0gaSA8PSB0aGlzLm9wdGlvbnMuZGVsaW1pdGVyLmxlbmd0aCAmJiB0aGlzLm9wdGlvbnMuZGVsaW1pdGVyLnN1YnN0cigwLCBsIC0gaSkgPT09IHJlbWFpbmluZ0J1ZmZlcikgfHwgKGwgLSBpIDw9IHRoaXMub3B0aW9ucy5lc2NhcGUubGVuZ3RoICYmIHRoaXMub3B0aW9ucy5lc2NhcGUuc3Vic3RyKDAsIGwgLSBpKSA9PT0gcmVtYWluaW5nQnVmZmVyKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY2hhciA9IHRoaXMuXy5uZXh0Q2hhciA/IHRoaXMuXy5uZXh0Q2hhciA6IGNoYXJzLmNoYXJBdChpKTtcbiAgICB0aGlzLl8ubmV4dENoYXIgPSBsID4gaSArIDEgPyBjaGFycy5jaGFyQXQoaSArIDEpIDogbnVsbDtcbiAgICBpZiAodGhpcy5vcHRpb25zLnJhdykge1xuICAgICAgdGhpcy5fLnJhd0J1ZiArPSBjaGFyO1xuICAgIH1cbiAgICAvLyBBdXRvIGRpc2NvdmVyeSBvZiByb3dEZWxpbWl0ZXIsIHVuaXgsIG1hYyBhbmQgd2luZG93cyBzdXBwb3J0ZWRcbiAgICBpZiAodGhpcy5vcHRpb25zLnJvd0RlbGltaXRlciA9PSBudWxsKSB7XG4gICAgICBuZXh0Q2hhclBvcyA9IGk7XG4gICAgICByb3dEZWxpbWl0ZXIgPSBudWxsO1xuICAgICAgLy8gRmlyc3QgZW1wdHkgbGluZVxuICAgICAgaWYgKCF0aGlzLl8ucXVvdGluZyAmJiAoY2hhciA9PT0gJ1xcbicgfHwgY2hhciA9PT0gJ1xccicpKSB7XG4gICAgICAgIHJvd0RlbGltaXRlciA9IGNoYXI7XG4gICAgICAgIG5leHRDaGFyUG9zICs9IDE7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuXy5xdW90aW5nICYmIGNoYXIgPT09IHRoaXMub3B0aW9ucy5xdW90ZSAmJiAoKHJlZiA9IHRoaXMuXy5uZXh0Q2hhcikgPT09ICdcXG4nIHx8IHJlZiA9PT0gJ1xccicpKSB7XG4gICAgICAgIHJvd0RlbGltaXRlciA9IHRoaXMuXy5uZXh0Q2hhcjtcbiAgICAgICAgbmV4dENoYXJQb3MgKz0gMjtcbiAgICAgIH1cbiAgICAgIGlmIChyb3dEZWxpbWl0ZXIpIHtcbiAgICAgICAgaWYgKHJvd0RlbGltaXRlciA9PT0gJ1xccicgJiYgY2hhcnMuY2hhckF0KG5leHRDaGFyUG9zKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICByb3dEZWxpbWl0ZXIgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zLnJvd0RlbGltaXRlciA9IFtyb3dEZWxpbWl0ZXJdO1xuICAgICAgICB0aGlzLl8ucm93RGVsaW1pdGVyTGVuZ3RoID0gcm93RGVsaW1pdGVyLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUGFyc2UgdGhhdCBkYW1uIGNoYXJcbiAgICAvLyBOb3RlLCBzaG91bGRuJ3Qgd2UgaGF2ZSBzdGggbGlrZSBjaGFycy5zdWJzdHIoaSwgQG9wdGlvbnMuZXNjYXBlLmxlbmd0aClcbiAgICBpZiAoIXRoaXMuXy5jb21tZW50aW5nICYmIGNoYXIgPT09IHRoaXMub3B0aW9ucy5lc2NhcGUpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXNjYXBlIGlzIHJlYWxseSBoZXJlIGZvciBlc2NhcGluZzpcbiAgICAgIC8vIElmIGVzY2FwZSBpcyBzYW1lIGFzIHF1b3RlLCBhbmQgZXNjYXBlIGlzIGZpcnN0IGNoYXIgb2YgYSBmaWVsZCBcbiAgICAgIC8vIGFuZCBpdCdzIG5vdCBxdW90ZWQsIHRoZW4gaXQgaXMgYSBxdW90ZVxuICAgICAgLy8gTmV4dCBjaGFyIHNob3VsZCBiZSBhbiBlc2NhcGUgb3IgYSBxdW90ZVxuICAgICAgZXNjYXBlSXNRdW90ZSA9IHRoaXMub3B0aW9ucy5lc2NhcGUgPT09IHRoaXMub3B0aW9ucy5xdW90ZTtcbiAgICAgIGlzRXNjYXBlID0gdGhpcy5fLm5leHRDaGFyID09PSB0aGlzLm9wdGlvbnMuZXNjYXBlO1xuICAgICAgaXNRdW90ZSA9IHRoaXMuXy5uZXh0Q2hhciA9PT0gdGhpcy5vcHRpb25zLnF1b3RlO1xuICAgICAgaWYgKCEoZXNjYXBlSXNRdW90ZSAmJiAhdGhpcy5fLmZpZWxkICYmICF0aGlzLl8ucXVvdGluZykgJiYgKGlzRXNjYXBlIHx8IGlzUXVvdGUpKSB7XG4gICAgICAgIGkrKztcbiAgICAgICAgY2hhciA9IHRoaXMuXy5uZXh0Q2hhcjtcbiAgICAgICAgdGhpcy5fLm5leHRDaGFyID0gY2hhcnMuY2hhckF0KGkgKyAxKTtcbiAgICAgICAgaWYgKHRoaXMuXy5maWVsZCA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fLmZpZWxkID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fLmZpZWxkICs9IGNoYXI7XG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIHNraXBwaW5nIHRoZSBuZXh0IG9uZSwgYmV0dGVyIGFkZCBpdCBub3cgaWYgaW4gcmF3IG1vZGUuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmF3KSB7XG4gICAgICAgICAgdGhpcy5fLnJhd0J1ZiArPSBjaGFyO1xuICAgICAgICB9XG4gICAgICAgIGkrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENoYXIgbWF0Y2ggcXVvdGVcbiAgICBpZiAoIXRoaXMuXy5jb21tZW50aW5nICYmIGNoYXIgPT09IHRoaXMub3B0aW9ucy5xdW90ZSkge1xuICAgICAgaWYgKHRoaXMuXy5hY2NlcHRPbmx5RW1wdHlDaGFycyAmJiAoY2hhciAhPT0gJyAnICYmIGNoYXIgIT09ICdcXHQnKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvcignT25seSB0cmltYWJsZSBjaGFyYWN0ZXJzIGFyZSBhY2NlcHRlZCBhZnRlciBxdW90ZXMnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl8ucXVvdGluZykge1xuICAgICAgICAvLyBNYWtlIHN1cmUgYSBjbG9zaW5nIHF1b3RlIGlzIGZvbGxvd2VkIGJ5IGEgZGVsaW1pdGVyXG4gICAgICAgIC8vIElmIHdlIGhhdmUgYSBuZXh0IGNoYXJhY3RlciBhbmQgXG4gICAgICAgIC8vIGl0IGlzbnQgYSByb3dEZWxpbWl0ZXIgYW5kIFxuICAgICAgICAvLyBpdCBpc250IGFuIGNvbHVtbiBkZWxpbWl0ZXIgYW5kXG4gICAgICAgIC8vIGl0IGlzbnQgdGhlIGJlZ2luaW5nIG9mIGEgY29tbWVudFxuICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoaXMgaXMgbm90IFwicmVsYXhcIiBtb2RlLCB0aHJvdyBhbiBlcnJvclxuICAgICAgICBpc05leHRDaGFyVHJpbWFibGUgPSBydHJpbSAmJiAoKHJlZjEgPSB0aGlzLl8ubmV4dENoYXIpID09PSAnICcgfHwgcmVmMSA9PT0gJ1xcdCcpO1xuICAgICAgICBhcmVOZXh0Q2hhcnNSb3dEZWxpbWl0ZXJzID0gdGhpcy5vcHRpb25zLnJvd0RlbGltaXRlciAmJiB0aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyLnNvbWUoZnVuY3Rpb24ocmQpIHtcbiAgICAgICAgICByZXR1cm4gY2hhcnMuc3Vic3RyKGkgKyAxLCByZC5sZW5ndGgpID09PSByZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGFyZU5leHRDaGFyc0RlbGltaXRlciA9IGNoYXJzLnN1YnN0cihpICsgMSwgdGhpcy5vcHRpb25zLmRlbGltaXRlci5sZW5ndGgpID09PSB0aGlzLm9wdGlvbnMuZGVsaW1pdGVyO1xuICAgICAgICBpc05leHRDaGFyQUNvbW1lbnQgPSB0aGlzLl8ubmV4dENoYXIgPT09IHRoaXMub3B0aW9ucy5jb21tZW50O1xuICAgICAgICBpZiAoKHRoaXMuXy5uZXh0Q2hhciAhPSBudWxsKSAmJiAhaXNOZXh0Q2hhclRyaW1hYmxlICYmICFhcmVOZXh0Q2hhcnNSb3dEZWxpbWl0ZXJzICYmICFhcmVOZXh0Q2hhcnNEZWxpbWl0ZXIgJiYgIWlzTmV4dENoYXJBQ29tbWVudCkge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVsYXgpIHtcbiAgICAgICAgICAgIHRoaXMuXy5xdW90aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5fLmZpZWxkKSB7XG4gICAgICAgICAgICAgIHRoaXMuXy5maWVsZCA9IGAke3RoaXMub3B0aW9ucy5xdW90ZX0ke3RoaXMuXy5maWVsZH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZXJyID0gdGhpcy5lcnJvcihgSW52YWxpZCBjbG9zaW5nIHF1b3RlIGF0IGxpbmUgJHt0aGlzLmxpbmVzICsgMX07IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fLm5leHRDaGFyKX0gaW5zdGVhZCBvZiBkZWxpbWl0ZXIgJHtKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMuZGVsaW1pdGVyKX1gKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgodGhpcy5fLm5leHRDaGFyICE9IG51bGwpICYmIGlzTmV4dENoYXJUcmltYWJsZSkge1xuICAgICAgICAgIGkrKztcbiAgICAgICAgICB0aGlzLl8ucXVvdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuXy5jbG9zaW5nUXVvdGUgPSB0aGlzLm9wdGlvbnMucXVvdGUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMuXy5hY2NlcHRPbmx5RW1wdHlDaGFycyA9IHRydWU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIHRoaXMuXy5xdW90aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fLmNsb3NpbmdRdW90ZSA9IHRoaXMub3B0aW9ucy5xdW90ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKGVuZCAmJiBpID09PSBsKSB7XG4gICAgICAgICAgICB0aGlzLl8ubGluZS5wdXNoKGNhc3QodGhpcy5fLmZpZWxkIHx8ICcnKSk7XG4gICAgICAgICAgICB0aGlzLl8uZmllbGQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5fLmZpZWxkKSB7XG4gICAgICAgIHRoaXMuXy5xdW90aW5nID0gdHJ1ZTtcbiAgICAgICAgaSsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoKHRoaXMuXy5maWVsZCAhPSBudWxsKSAmJiAhdGhpcy5vcHRpb25zLnJlbGF4KSB7XG4gICAgICAgIGlmIChlcnIgPSB0aGlzLmVycm9yKGBJbnZhbGlkIG9wZW5pbmcgcXVvdGUgYXQgbGluZSAke3RoaXMubGluZXMgKyAxfWApKSB7XG4gICAgICAgICAgcmV0dXJuIGVycjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBPdGhlcndpc2UsIHRyZWF0IHF1b3RlIGFzIGEgcmVndWxhciBjaGFyYWN0ZXJcbiAgICBpc1Jvd0RlbGltaXRlciA9IHRoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIgJiYgdGhpcy5vcHRpb25zLnJvd0RlbGltaXRlci5zb21lKGZ1bmN0aW9uKHJkKSB7XG4gICAgICByZXR1cm4gY2hhcnMuc3Vic3RyKGksIHJkLmxlbmd0aCkgPT09IHJkO1xuICAgIH0pO1xuICAgIGlmIChpc1Jvd0RlbGltaXRlciB8fCAoZW5kICYmIGkgPT09IGwgLSAxKSkge1xuICAgICAgdGhpcy5saW5lcysrO1xuICAgIH1cbiAgICAvLyBTZXQgdGhlIGNvbW1lbnRpbmcgZmxhZ1xuICAgIHdhc0NvbW1lbnRpbmcgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuXy5jb21tZW50aW5nICYmICF0aGlzLl8ucXVvdGluZyAmJiB0aGlzLm9wdGlvbnMuY29tbWVudCAmJiBjaGFycy5zdWJzdHIoaSwgdGhpcy5vcHRpb25zLmNvbW1lbnQubGVuZ3RoKSA9PT0gdGhpcy5vcHRpb25zLmNvbW1lbnQpIHtcbiAgICAgIHRoaXMuXy5jb21tZW50aW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuXy5jb21tZW50aW5nICYmIGlzUm93RGVsaW1pdGVyKSB7XG4gICAgICB3YXNDb21tZW50aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuXy5jb21tZW50aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlzRGVsaW1pdGVyID0gY2hhcnMuc3Vic3RyKGksIHRoaXMub3B0aW9ucy5kZWxpbWl0ZXIubGVuZ3RoKSA9PT0gdGhpcy5vcHRpb25zLmRlbGltaXRlcjtcbiAgICBpZiAodGhpcy5fLmFjY2VwdE9ubHlFbXB0eUNoYXJzKSB7XG4gICAgICBpZiAoaXNEZWxpbWl0ZXIgfHwgaXNSb3dEZWxpbWl0ZXIpIHtcbiAgICAgICAgdGhpcy5fLmFjY2VwdE9ubHlFbXB0eUNoYXJzID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2hhciA9PT0gJyAnIHx8IGNoYXIgPT09ICdcXHQnKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKCdPbmx5IHRyaW1hYmxlIGNoYXJhY3RlcnMgYXJlIGFjY2VwdGVkIGFmdGVyIHF1b3RlcycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy5fLmNvbW1lbnRpbmcgJiYgIXRoaXMuXy5xdW90aW5nICYmIChpc0RlbGltaXRlciB8fCBpc1Jvd0RlbGltaXRlcikpIHtcbiAgICAgIGlmIChpc1Jvd0RlbGltaXRlcikge1xuICAgICAgICBpc1Jvd0RlbGltaXRlckxlbmd0aCA9IHRoaXMub3B0aW9ucy5yb3dEZWxpbWl0ZXIuZmlsdGVyKGZ1bmN0aW9uKHJkKSB7XG4gICAgICAgICAgcmV0dXJuIGNoYXJzLnN1YnN0cihpLCByZC5sZW5ndGgpID09PSByZDtcbiAgICAgICAgfSlbMF0ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gRW1wdHkgbGluZXNcbiAgICAgIGlmIChpc1Jvd0RlbGltaXRlciAmJiB0aGlzLl8ubGluZS5sZW5ndGggPT09IDAgJiYgKHRoaXMuXy5maWVsZCA9PSBudWxsKSkge1xuICAgICAgICBpZiAod2FzQ29tbWVudGluZyB8fCB0aGlzLm9wdGlvbnMuc2tpcF9lbXB0eV9saW5lcykge1xuICAgICAgICAgIGkgKz0gaXNSb3dEZWxpbWl0ZXJMZW5ndGg7XG4gICAgICAgICAgdGhpcy5fLm5leHRDaGFyID0gY2hhcnMuY2hhckF0KGkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocnRyaW0pIHtcbiAgICAgICAgaWYgKCF0aGlzLl8uY2xvc2luZ1F1b3RlKSB7XG4gICAgICAgICAgdGhpcy5fLmZpZWxkID0gKHJlZjIgPSB0aGlzLl8uZmllbGQpICE9IG51bGwgPyByZWYyLnRyaW1SaWdodCgpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl8ubGluZS5wdXNoKGNhc3QodGhpcy5fLmZpZWxkIHx8ICcnKSk7XG4gICAgICB0aGlzLl8uY2xvc2luZ1F1b3RlID0gMDtcbiAgICAgIHRoaXMuXy5maWVsZCA9IG51bGw7XG4gICAgICBpZiAoaXNEZWxpbWl0ZXIpIHsgLy8gRW5kIG9mIGZpZWxkXG4gICAgICAgIGkgKz0gdGhpcy5vcHRpb25zLmRlbGltaXRlci5sZW5ndGg7XG4gICAgICAgIHRoaXMuXy5uZXh0Q2hhciA9IGNoYXJzLmNoYXJBdChpKTtcbiAgICAgICAgaWYgKGVuZCAmJiAhdGhpcy5fLm5leHRDaGFyKSB7XG4gICAgICAgICAgaXNSb3dEZWxpbWl0ZXIgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuXy5saW5lLnB1c2goJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNSb3dEZWxpbWl0ZXIpIHsgLy8gRW5kIG9mIHJlY29yZFxuICAgICAgICBpZiAoIXRoaXMuXy5saW5lSGFzRXJyb3IpIHtcbiAgICAgICAgICBlcnIgPSB0aGlzLl9fcHVzaCh0aGlzLl8ubGluZSk7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuXy5saW5lSGFzRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl8ubGluZUhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29tZSBjbGVhbnVwIGZvciB0aGUgbmV4dCByZWNvcmRcbiAgICAgICAgdGhpcy5fLmxpbmUgPSBbXTtcbiAgICAgICAgaSArPSBpc1Jvd0RlbGltaXRlckxlbmd0aDtcbiAgICAgICAgdGhpcy5fLm5leHRDaGFyID0gY2hhcnMuY2hhckF0KGkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCF0aGlzLl8uY29tbWVudGluZyAmJiAhdGhpcy5fLnF1b3RpbmcgJiYgKGNoYXIgPT09ICcgJyB8fCBjaGFyID09PSAnXFx0JykpIHtcbiAgICAgIGlmICh0aGlzLl8uZmllbGQgPT0gbnVsbCkge1xuICAgICAgICAvLyBMZWZ0IHRyaW0gdW5sZXNzIHdlIGFyZSBxdW90aW5nIG9yIGZpZWxkIGFscmVhZHkgZmlsbGVkXG4gICAgICAgIHRoaXMuXy5maWVsZCA9ICcnO1xuICAgICAgfVxuICAgICAgaWYgKCEobHRyaW0gJiYgIXRoaXMuXy5maWVsZCkpIHtcbiAgICAgICAgdGhpcy5fLmZpZWxkICs9IGNoYXI7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfSBlbHNlIGlmICghdGhpcy5fLmNvbW1lbnRpbmcpIHtcbiAgICAgIGlmICh0aGlzLl8uZmllbGQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl8uZmllbGQgPSAnJztcbiAgICAgIH1cbiAgICAgIHRoaXMuXy5maWVsZCArPSBjaGFyO1xuICAgICAgaSsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBpKys7XG4gICAgfVxuICAgIGlmICghdGhpcy5fLmNvbW1lbnRpbmcgJiYgKChyZWYzID0gdGhpcy5fLmZpZWxkKSAhPSBudWxsID8gcmVmMy5sZW5ndGggOiB2b2lkIDApID4gdGhpcy5vcHRpb25zLm1heF9saW1pdF9vbl9kYXRhX3JlYWQpIHtcbiAgICAgIHJldHVybiBFcnJvcihgRmllbGQgZXhjZWVkcyBtYXhfbGltaXRfb25fZGF0YV9yZWFkIHNldHRpbmcgKCR7dGhpcy5vcHRpb25zLm1heF9saW1pdF9vbl9kYXRhX3JlYWR9KSAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5kZWxpbWl0ZXIpfWApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuXy5jb21tZW50aW5nICYmICgocmVmNCA9IHRoaXMuXy5saW5lKSAhPSBudWxsID8gcmVmNC5sZW5ndGggOiB2b2lkIDApID4gdGhpcy5vcHRpb25zLm1heF9saW1pdF9vbl9kYXRhX3JlYWQpIHtcbiAgICAgIHJldHVybiBFcnJvcihgUm93IGRlbGltaXRlciBub3QgZm91bmQgaW4gdGhlIGZpbGUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucm93RGVsaW1pdGVyKX1gKTtcbiAgICB9XG4gIH1cbiAgLy8gRmx1c2ggcmVtYWluaW5nIGZpZWxkcyBhbmQgbGluZXNcbiAgaWYgKGVuZCkge1xuICAgIGlmIChsID09PSAwKSB7XG4gICAgICB0aGlzLmxpbmVzKys7XG4gICAgfVxuICAgIGlmICh0aGlzLl8uZmllbGQgIT0gbnVsbCkge1xuICAgICAgaWYgKHJ0cmltKSB7XG4gICAgICAgIGlmICghdGhpcy5fLmNsb3NpbmdRdW90ZSkge1xuICAgICAgICAgIHRoaXMuXy5maWVsZCA9IChyZWY1ID0gdGhpcy5fLmZpZWxkKSAhPSBudWxsID8gcmVmNS50cmltUmlnaHQoKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fLmxpbmUucHVzaChjYXN0KHRoaXMuXy5maWVsZCB8fCAnJykpO1xuICAgICAgdGhpcy5fLmZpZWxkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCgocmVmNiA9IHRoaXMuXy5maWVsZCkgIT0gbnVsbCA/IHJlZjYubGVuZ3RoIDogdm9pZCAwKSA+IHRoaXMub3B0aW9ucy5tYXhfbGltaXRfb25fZGF0YV9yZWFkKSB7XG4gICAgICByZXR1cm4gRXJyb3IoYERlbGltaXRlciBub3QgZm91bmQgaW4gdGhlIGZpbGUgJHtKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMuZGVsaW1pdGVyKX1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuXy5saW5lLmxlbmd0aCA+IHRoaXMub3B0aW9ucy5tYXhfbGltaXRfb25fZGF0YV9yZWFkKSB7XG4gICAgICByZXR1cm4gRXJyb3IoYFJvdyBkZWxpbWl0ZXIgbm90IGZvdW5kIGluIHRoZSBmaWxlICR7SlNPTi5zdHJpbmdpZnkodGhpcy5vcHRpb25zLnJvd0RlbGltaXRlcil9YCk7XG4gICAgfVxuICB9XG4gIC8vIFN0b3JlIHVuLXBhcnNlZCBjaGFycyBmb3IgbmV4dCBjYWxsXG4gIHRoaXMuXy5idWYgPSBjaGFycy5zdWJzdHIoaSk7XG4gIHJldHVybiBudWxsO1xufTtcblxuUGFyc2VyLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uKG1zZykge1xuICB2YXIgZXJyO1xuICBlcnIgPSBFcnJvcihtc2cpO1xuICBpZiAoIXRoaXMub3B0aW9ucy5za2lwX2xpbmVzX3dpdGhfZXJyb3IpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9IGVsc2Uge1xuICAgIGlmICghdGhpcy5fLmxpbmVIYXNFcnJvcikge1xuICAgICAgdGhpcy5fLmxpbmVIYXNFcnJvciA9IHRydWU7XG4gICAgICB0aGlzLmVtaXQoJ3NraXAnLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8vICMjIFV0aWxzXG5pc09iakxpdGVyYWwgPSBmdW5jdGlvbihfb2JqKSB7XG4gIHZhciBfdGVzdDtcbiAgX3Rlc3QgPSBfb2JqO1xuICBpZiAodHlwZW9mIF9vYmogIT09ICdvYmplY3QnIHx8IF9vYmogPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShfb2JqKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgICAgd2hpbGUgKCFmYWxzZSkge1xuICAgICAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKF90ZXN0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKF90ZXN0KSkgPT09IG51bGwpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihfb2JqID09PSBfdGVzdCk7XG4gICAgfSkoKTtcbiAgfVxufTtcblxuLy8gW3JlYWRtZV06IGh0dHBzOi8vZ2l0aHViLmNvbS93ZGF2aWR3L25vZGUtY3N2LXBhcnNlXG4vLyBbc2l0ZV06IGh0dHA6Ly9jc3YuYWRhbHRhcy5jb20vcGFyc2UvXG4vLyBbc2FtcGxlc106IGh0dHBzOi8vZ2l0aHViLmNvbS93ZGF2aWR3L25vZGUtY3N2LXBhcnNlL3RyZWUvbWFzdGVyL3NhbXBsZXNcbi8vIFt0ZXN0c106IGh0dHBzOi8vZ2l0aHViLmNvbS93ZGF2aWR3L25vZGUtY3N2LXBhcnNlL3RyZWUvbWFzdGVyL3Rlc3Rcbi8vIFtzdHJlYW1dOiAoaHR0cDovL25vZGVqcy5vcmcvYXBpL3N0cmVhbS5odG1sXG4vLyBbdHJhbnNmb3JtXTogKGh0dHA6Ly9ub2RlanMub3JnL2FwaS9zdHJlYW0uaHRtbCNzdHJlYW1fY2xhc3Nfc3RyZWFtX3RyYW5zZm9ybV8xKVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2Nzdi1wYXJzZS9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDEzN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiBGaWxlU2F2ZXIuanNcbiAqIEEgc2F2ZUFzKCkgRmlsZVNhdmVyIGltcGxlbWVudGF0aW9uLlxuICogMS4zLjJcbiAqIDIwMTYtMDYtMTYgMTg6MjU6MTlcbiAqXG4gKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4gKiBMaWNlbnNlOiBNSVRcbiAqICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4gKi9cblxuLypnbG9iYWwgc2VsZiAqL1xuLypqc2xpbnQgYml0d2lzZTogdHJ1ZSwgaW5kZW50OiA0LCBsYXhicmVhazogdHJ1ZSwgbGF4Y29tbWE6IHRydWUsIHNtYXJ0dGFiczogdHJ1ZSwgcGx1c3BsdXM6IHRydWUgKi9cblxuLyohIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qcy9ibG9iL21hc3Rlci9GaWxlU2F2ZXIuanMgKi9cblxudmFyIHNhdmVBcyA9IHNhdmVBcyB8fCAoZnVuY3Rpb24odmlldykge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0Ly8gSUUgPDEwIGlzIGV4cGxpY2l0bHkgdW5zdXBwb3J0ZWRcblx0aWYgKHR5cGVvZiB2aWV3ID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgWzEtOV1cXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyXG5cdFx0ICBkb2MgPSB2aWV3LmRvY3VtZW50XG5cdFx0ICAvLyBvbmx5IGdldCBVUkwgd2hlbiBuZWNlc3NhcnkgaW4gY2FzZSBCbG9iLmpzIGhhc24ndCBvdmVycmlkZGVuIGl0IHlldFxuXHRcdCwgZ2V0X1VSTCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHZpZXcuVVJMIHx8IHZpZXcud2Via2l0VVJMIHx8IHZpZXc7XG5cdFx0fVxuXHRcdCwgc2F2ZV9saW5rID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIiwgXCJhXCIpXG5cdFx0LCBjYW5fdXNlX3NhdmVfbGluayA9IFwiZG93bmxvYWRcIiBpbiBzYXZlX2xpbmtcblx0XHQsIGNsaWNrID0gZnVuY3Rpb24obm9kZSkge1xuXHRcdFx0dmFyIGV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiKTtcblx0XHRcdG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdFx0fVxuXHRcdCwgaXNfc2FmYXJpID0gL2NvbnN0cnVjdG9yL2kudGVzdCh2aWV3LkhUTUxFbGVtZW50KSB8fCB2aWV3LnNhZmFyaVxuXHRcdCwgaXNfY2hyb21lX2lvcyA9L0NyaU9TXFwvW1xcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpXG5cdFx0LCB0aHJvd19vdXRzaWRlID0gZnVuY3Rpb24oZXgpIHtcblx0XHRcdCh2aWV3LnNldEltbWVkaWF0ZSB8fCB2aWV3LnNldFRpbWVvdXQpKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aHJvdyBleDtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0XHQsIGZvcmNlX3NhdmVhYmxlX3R5cGUgPSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG5cdFx0Ly8gdGhlIEJsb2IgQVBJIGlzIGZ1bmRhbWVudGFsbHkgYnJva2VuIGFzIHRoZXJlIGlzIG5vIFwiZG93bmxvYWRmaW5pc2hlZFwiIGV2ZW50IHRvIHN1YnNjcmliZSB0b1xuXHRcdCwgYXJiaXRyYXJ5X3Jldm9rZV90aW1lb3V0ID0gMTAwMCAqIDQwIC8vIGluIG1zXG5cdFx0LCByZXZva2UgPSBmdW5jdGlvbihmaWxlKSB7XG5cdFx0XHR2YXIgcmV2b2tlciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGZpbGUgPT09IFwic3RyaW5nXCIpIHsgLy8gZmlsZSBpcyBhbiBvYmplY3QgVVJMXG5cdFx0XHRcdFx0Z2V0X1VSTCgpLnJldm9rZU9iamVjdFVSTChmaWxlKTtcblx0XHRcdFx0fSBlbHNlIHsgLy8gZmlsZSBpcyBhIEZpbGVcblx0XHRcdFx0XHRmaWxlLnJlbW92ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0c2V0VGltZW91dChyZXZva2VyLCBhcmJpdHJhcnlfcmV2b2tlX3RpbWVvdXQpO1xuXHRcdH1cblx0XHQsIGRpc3BhdGNoID0gZnVuY3Rpb24oZmlsZXNhdmVyLCBldmVudF90eXBlcywgZXZlbnQpIHtcblx0XHRcdGV2ZW50X3R5cGVzID0gW10uY29uY2F0KGV2ZW50X3R5cGVzKTtcblx0XHRcdHZhciBpID0gZXZlbnRfdHlwZXMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGktLSkge1xuXHRcdFx0XHR2YXIgbGlzdGVuZXIgPSBmaWxlc2F2ZXJbXCJvblwiICsgZXZlbnRfdHlwZXNbaV1dO1xuXHRcdFx0XHRpZiAodHlwZW9mIGxpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0bGlzdGVuZXIuY2FsbChmaWxlc2F2ZXIsIGV2ZW50IHx8IGZpbGVzYXZlcik7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXgpIHtcblx0XHRcdFx0XHRcdHRocm93X291dHNpZGUoZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQsIGF1dG9fYm9tID0gZnVuY3Rpb24oYmxvYikge1xuXHRcdFx0Ly8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcblx0XHRcdC8vIG5vdGU6IHlvdXIgYnJvd3NlciB3aWxsIGF1dG9tYXRpY2FsbHkgY29udmVydCBVVEYtMTYgVStGRUZGIHRvIEVGIEJCIEJGXG5cdFx0XHRpZiAoL15cXHMqKD86dGV4dFxcL1xcUyp8YXBwbGljYXRpb25cXC94bWx8XFxTKlxcL1xcUypcXCt4bWwpXFxzKjsuKmNoYXJzZXRcXHMqPVxccyp1dGYtOC9pLnRlc3QoYmxvYi50eXBlKSkge1xuXHRcdFx0XHRyZXR1cm4gbmV3IEJsb2IoW1N0cmluZy5mcm9tQ2hhckNvZGUoMHhGRUZGKSwgYmxvYl0sIHt0eXBlOiBibG9iLnR5cGV9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBibG9iO1xuXHRcdH1cblx0XHQsIEZpbGVTYXZlciA9IGZ1bmN0aW9uKGJsb2IsIG5hbWUsIG5vX2F1dG9fYm9tKSB7XG5cdFx0XHRpZiAoIW5vX2F1dG9fYm9tKSB7XG5cdFx0XHRcdGJsb2IgPSBhdXRvX2JvbShibG9iKTtcblx0XHRcdH1cblx0XHRcdC8vIEZpcnN0IHRyeSBhLmRvd25sb2FkLCB0aGVuIHdlYiBmaWxlc3lzdGVtLCB0aGVuIG9iamVjdCBVUkxzXG5cdFx0XHR2YXJcblx0XHRcdFx0ICBmaWxlc2F2ZXIgPSB0aGlzXG5cdFx0XHRcdCwgdHlwZSA9IGJsb2IudHlwZVxuXHRcdFx0XHQsIGZvcmNlID0gdHlwZSA9PT0gZm9yY2Vfc2F2ZWFibGVfdHlwZVxuXHRcdFx0XHQsIG9iamVjdF91cmxcblx0XHRcdFx0LCBkaXNwYXRjaF9hbGwgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkaXNwYXRjaChmaWxlc2F2ZXIsIFwid3JpdGVzdGFydCBwcm9ncmVzcyB3cml0ZSB3cml0ZWVuZFwiLnNwbGl0KFwiIFwiKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gb24gYW55IGZpbGVzeXMgZXJyb3JzIHJldmVydCB0byBzYXZpbmcgd2l0aCBvYmplY3QgVVJMc1xuXHRcdFx0XHQsIGZzX2Vycm9yID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKChpc19jaHJvbWVfaW9zIHx8IChmb3JjZSAmJiBpc19zYWZhcmkpKSAmJiB2aWV3LkZpbGVSZWFkZXIpIHtcblx0XHRcdFx0XHRcdC8vIFNhZmFyaSBkb2Vzbid0IGFsbG93IGRvd25sb2FkaW5nIG9mIGJsb2IgdXJsc1xuXHRcdFx0XHRcdFx0dmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cdFx0XHRcdFx0XHRyZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB1cmwgPSBpc19jaHJvbWVfaW9zID8gcmVhZGVyLnJlc3VsdCA6IHJlYWRlci5yZXN1bHQucmVwbGFjZSgvXmRhdGE6W147XSo7LywgJ2RhdGE6YXR0YWNobWVudC9maWxlOycpO1xuXHRcdFx0XHRcdFx0XHR2YXIgcG9wdXAgPSB2aWV3Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG5cdFx0XHRcdFx0XHRcdGlmKCFwb3B1cCkgdmlldy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuXHRcdFx0XHRcdFx0XHR1cmw9dW5kZWZpbmVkOyAvLyByZWxlYXNlIHJlZmVyZW5jZSBiZWZvcmUgZGlzcGF0Y2hpbmdcblx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRcdFx0ZGlzcGF0Y2hfYWxsKCk7XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0cmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG5cdFx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5JTklUO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBkb24ndCBjcmVhdGUgbW9yZSBvYmplY3QgVVJMcyB0aGFuIG5lZWRlZFxuXHRcdFx0XHRcdGlmICghb2JqZWN0X3VybCkge1xuXHRcdFx0XHRcdFx0b2JqZWN0X3VybCA9IGdldF9VUkwoKS5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChmb3JjZSkge1xuXHRcdFx0XHRcdFx0dmlldy5sb2NhdGlvbi5ocmVmID0gb2JqZWN0X3VybDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dmFyIG9wZW5lZCA9IHZpZXcub3BlbihvYmplY3RfdXJsLCBcIl9ibGFua1wiKTtcblx0XHRcdFx0XHRcdGlmICghb3BlbmVkKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEFwcGxlIGRvZXMgbm90IGFsbG93IHdpbmRvdy5vcGVuLCBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvc2FmYXJpL2RvY3VtZW50YXRpb24vVG9vbHMvQ29uY2VwdHVhbC9TYWZhcmlFeHRlbnNpb25HdWlkZS9Xb3JraW5nd2l0aFdpbmRvd3NhbmRUYWJzL1dvcmtpbmd3aXRoV2luZG93c2FuZFRhYnMuaHRtbFxuXHRcdFx0XHRcdFx0XHR2aWV3LmxvY2F0aW9uLmhyZWYgPSBvYmplY3RfdXJsO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FO1xuXHRcdFx0XHRcdGRpc3BhdGNoX2FsbCgpO1xuXHRcdFx0XHRcdHJldm9rZShvYmplY3RfdXJsKTtcblx0XHRcdFx0fVxuXHRcdFx0O1xuXHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuSU5JVDtcblxuXHRcdFx0aWYgKGNhbl91c2Vfc2F2ZV9saW5rKSB7XG5cdFx0XHRcdG9iamVjdF91cmwgPSBnZXRfVVJMKCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHNhdmVfbGluay5ocmVmID0gb2JqZWN0X3VybDtcblx0XHRcdFx0XHRzYXZlX2xpbmsuZG93bmxvYWQgPSBuYW1lO1xuXHRcdFx0XHRcdGNsaWNrKHNhdmVfbGluayk7XG5cdFx0XHRcdFx0ZGlzcGF0Y2hfYWxsKCk7XG5cdFx0XHRcdFx0cmV2b2tlKG9iamVjdF91cmwpO1xuXHRcdFx0XHRcdGZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLkRPTkU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZzX2Vycm9yKCk7XG5cdFx0fVxuXHRcdCwgRlNfcHJvdG8gPSBGaWxlU2F2ZXIucHJvdG90eXBlXG5cdFx0LCBzYXZlQXMgPSBmdW5jdGlvbihibG9iLCBuYW1lLCBub19hdXRvX2JvbSkge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWxlU2F2ZXIoYmxvYiwgbmFtZSB8fCBibG9iLm5hbWUgfHwgXCJkb3dubG9hZFwiLCBub19hdXRvX2JvbSk7XG5cdFx0fVxuXHQ7XG5cdC8vIElFIDEwKyAobmF0aXZlIHNhdmVBcylcblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24oYmxvYiwgbmFtZSwgbm9fYXV0b19ib20pIHtcblx0XHRcdG5hbWUgPSBuYW1lIHx8IGJsb2IubmFtZSB8fCBcImRvd25sb2FkXCI7XG5cblx0XHRcdGlmICghbm9fYXV0b19ib20pIHtcblx0XHRcdFx0YmxvYiA9IGF1dG9fYm9tKGJsb2IpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIG5hbWUpO1xuXHRcdH07XG5cdH1cblxuXHRGU19wcm90by5hYm9ydCA9IGZ1bmN0aW9uKCl7fTtcblx0RlNfcHJvdG8ucmVhZHlTdGF0ZSA9IEZTX3Byb3RvLklOSVQgPSAwO1xuXHRGU19wcm90by5XUklUSU5HID0gMTtcblx0RlNfcHJvdG8uRE9ORSA9IDI7XG5cblx0RlNfcHJvdG8uZXJyb3IgPVxuXHRGU19wcm90by5vbndyaXRlc3RhcnQgPVxuXHRGU19wcm90by5vbnByb2dyZXNzID1cblx0RlNfcHJvdG8ub253cml0ZSA9XG5cdEZTX3Byb3RvLm9uYWJvcnQgPVxuXHRGU19wcm90by5vbmVycm9yID1cblx0RlNfcHJvdG8ub253cml0ZWVuZCA9XG5cdFx0bnVsbDtcblxuXHRyZXR1cm4gc2F2ZUFzO1xufShcblx0ICAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZlxuXHR8fCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvd1xuXHR8fCB0aGlzLmNvbnRlbnRcbikpO1xuLy8gYHNlbGZgIGlzIHVuZGVmaW5lZCBpbiBGaXJlZm94IGZvciBBbmRyb2lkIGNvbnRlbnQgc2NyaXB0IGNvbnRleHRcbi8vIHdoaWxlIGB0aGlzYCBpcyBuc0lDb250ZW50RnJhbWVNZXNzYWdlTWFuYWdlclxuLy8gd2l0aCBhbiBhdHRyaWJ1dGUgYGNvbnRlbnRgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHdpbmRvd1xuXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cy5zYXZlQXMgPSBzYXZlQXM7XG59IGVsc2UgaWYgKCh0eXBlb2YgZGVmaW5lICE9PSBcInVuZGVmaW5lZFwiICYmIGRlZmluZSAhPT0gbnVsbCkgJiYgKGRlZmluZS5hbWQgIT09IG51bGwpKSB7XG4gIGRlZmluZShcIkZpbGVTYXZlci5qc1wiLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gc2F2ZUFzO1xuICB9KTtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9maWxlLXNhdmVyL0ZpbGVTYXZlci5qc1xuLy8gbW9kdWxlIGlkID0gMTM4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2llZWU3NTQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDEzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHR2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLldyaXRlciA9IGV4cG9ydHMuVmV4RmxvdyA9IGV4cG9ydHMuVXRpbHMgPSBleHBvcnRzLlRyYWNrID0gZXhwb3J0cy5Qcm9ncmFtQ2hhbmdlRXZlbnQgPSBleHBvcnRzLk5vdGVPbkV2ZW50ID0gZXhwb3J0cy5Ob3RlT2ZmRXZlbnQgPSBleHBvcnRzLk5vdGVFdmVudCA9IGV4cG9ydHMuTWV0YUV2ZW50ID0gZXhwb3J0cy5Db250cm9sbGVyQ2hhbmdlRXZlbnQgPSBleHBvcnRzLkNvbnN0YW50cyA9IGV4cG9ydHMuQ2h1bmsgPSB1bmRlZmluZWQ7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF90b25hbE1pZGkgPSByZXF1aXJlKCd0b25hbC1taWRpJyk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICogT2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaHVuayBzZWN0aW9uIG9mIGEgTUlESSBmaWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkcyAtIHt0eXBlOiBudW1iZXIsIGRhdGE6IGFycmF5LCBzaXplOiBhcnJheX1cbiAqIEByZXR1cm4ge0NodW5rfVxuICovXG52YXIgQ2h1bmsgPSBmdW5jdGlvbiBDaHVuayhmaWVsZHMpIHtcblx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIENodW5rKTtcblxuXHR0aGlzLnR5cGUgPSBmaWVsZHMudHlwZTtcblx0dGhpcy5kYXRhID0gZmllbGRzLmRhdGE7XG5cdHRoaXMuc2l6ZSA9IFswLCAwLCAwLCBmaWVsZHMuZGF0YS5sZW5ndGhdO1xufTtcblxuZXhwb3J0cy5DaHVuayA9IENodW5rO1xuLyoqXG4gKiBNSURJIGZpbGUgZm9ybWF0IGNvbnN0YW50cywgaW5jbHVkaW5nIG5vdGUgLT4gTUlESSBudW1iZXIgdHJhbnNsYXRpb24uXG4gKiBAcmV0dXJuIHtDb25zdGFudHN9XG4gKi9cblxudmFyIENvbnN0YW50cyA9IHtcblx0VkVSU0lPTjogJzEuNS4yJyxcblx0SEVBREVSX0NIVU5LX1RZUEU6IFsweDRkLCAweDU0LCAweDY4LCAweDY0XSwgLy8gTXRoZFxuXHRIRUFERVJfQ0hVTktfTEVOR1RIOiBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNl0sIC8vIEhlYWRlciBzaXplIGZvciBTTUZcblx0SEVBREVSX0NIVU5LX0ZPUk1BVDA6IFsweDAwLCAweDAwXSwgLy8gTWlkaSBUeXBlIDAgaWRcblx0SEVBREVSX0NIVU5LX0ZPUk1BVDE6IFsweDAwLCAweDAxXSwgLy8gTWlkaSBUeXBlIDEgaWRcblx0SEVBREVSX0NIVU5LX0RJVklTSU9OOiBbMHgwMCwgMHg4MF0sIC8vIERlZmF1bHRzIHRvIDEyOCB0aWNrcyBwZXIgYmVhdFxuXHRUUkFDS19DSFVOS19UWVBFOiBbMHg0ZCwgMHg1NCwgMHg3MiwgMHg2Yl0sIC8vIE1UcmssXG5cdE1FVEFfRVZFTlRfSUQ6IDB4RkYsXG5cdE1FVEFfVEVYVF9JRDogMHgwMSxcblx0TUVUQV9DT1BZUklHSFRfSUQ6IDB4MDIsXG5cdE1FVEFfVFJBQ0tfTkFNRV9JRDogMHgwMyxcblx0TUVUQV9JTlNUUlVNRU5UX05BTUVfSUQ6IDB4MDQsXG5cdE1FVEFfTFlSSUNfSUQ6IDB4MDUsXG5cdE1FVEFfTUFSS0VSX0lEOiAweDA2LFxuXHRNRVRBX0NVRV9QT0lOVDogMHgwNyxcblx0TUVUQV9URU1QT19JRDogMHg1MSxcblx0TUVUQV9TTVRQRV9PRkZTRVQ6IDB4NTQsXG5cdE1FVEFfVElNRV9TSUdOQVRVUkVfSUQ6IDB4NTgsXG5cdE1FVEFfS0VZX1NJR05BVFVSRV9JRDogMHg1OSxcblx0TUVUQV9FTkRfT0ZfVFJBQ0tfSUQ6IFsweDJGLCAweDAwXSxcblx0Q09OVFJPTExFUl9DSEFOR0VfU1RBVFVTOiAweEIwLCAvLyBpbmNsdWRlcyBjaGFubmVsIG51bWJlciAoMClcblx0UFJPR1JBTV9DSEFOR0VfU1RBVFVTOiAweEMwIC8vIGluY2x1ZGVzIGNoYW5uZWwgbnVtYmVyICgwKVxufTtcblxuZXhwb3J0cy5Db25zdGFudHMgPSBDb25zdGFudHM7XG4vKipcbiAqIEhvbGRzIGFsbCBkYXRhIGZvciBhIFwiY29udHJvbGxlciBjaGFuZ2VcIiBNSURJIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gZmllbGRzIHtjb250cm9sbGVyTnVtYmVyOiBpbnRlZ2VyLCBjb250cm9sbGVyVmFsdWU6IGludGVnZXJ9XG4gKiBAcmV0dXJuIHtDb250cm9sbGVyQ2hhbmdlRXZlbnR9XG4gKi9cblxudmFyIENvbnRyb2xsZXJDaGFuZ2VFdmVudCA9IGZ1bmN0aW9uIENvbnRyb2xsZXJDaGFuZ2VFdmVudChmaWVsZHMpIHtcblx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbnRyb2xsZXJDaGFuZ2VFdmVudCk7XG5cblx0dGhpcy50eXBlID0gJ2NvbnRyb2xsZXInO1xuXHQvLyBkZWx0YSB0aW1lIGRlZmF1bHRzIHRvIDAuXG5cdHRoaXMuZGF0YSA9IFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoMHgwMCkuY29uY2F0KENvbnN0YW50cy5DT05UUk9MTEVSX0NIQU5HRV9TVEFUVVMsIGZpZWxkcy5jb250cm9sbGVyTnVtYmVyLCBmaWVsZHMuY29udHJvbGxlclZhbHVlKTtcbn07XG5cbmV4cG9ydHMuQ29udHJvbGxlckNoYW5nZUV2ZW50ID0gQ29udHJvbGxlckNoYW5nZUV2ZW50O1xuLyoqXG4gKiBPYmplY3QgcmVwcmVzZW50YXRpb24gb2YgYSBtZXRhIGV2ZW50LlxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkcyAtIHR5cGUsIGRhdGFcbiAqIEByZXR1cm4ge01ldGFFdmVudH1cbiAqL1xuXG52YXIgTWV0YUV2ZW50ID0gZnVuY3Rpb24gTWV0YUV2ZW50KGZpZWxkcykge1xuXHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWV0YUV2ZW50KTtcblxuXHR0aGlzLnR5cGUgPSAnbWV0YSc7XG5cdHRoaXMuZGF0YSA9IFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoMHgwMCk7IC8vIFN0YXJ0IHdpdGggemVybyB0aW1lIGRlbHRhXG5cdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQoQ29uc3RhbnRzLk1FVEFfRVZFTlRfSUQsIGZpZWxkcy5kYXRhKTtcbn07XG5cbmV4cG9ydHMuTWV0YUV2ZW50ID0gTWV0YUV2ZW50O1xuLyoqXG4gKiBXcmFwcGVyIGZvciBub3RlT25FdmVudC9ub3RlT2ZmRXZlbnQgb2JqZWN0cyB0aGF0IGJ1aWxkcyBib3RoIGV2ZW50cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBmaWVsZHMgLSB7cGl0Y2g6ICdbQzRdJywgZHVyYXRpb246ICc0Jywgd2FpdDogJzQnLCB2ZWxvY2l0eTogMS0xMDB9XG4gKiBAcmV0dXJuIHtOb3RlRXZlbnR9XG4gKi9cblxudmFyIE5vdGVFdmVudCA9IGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gTm90ZUV2ZW50KGZpZWxkcykge1xuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb3RlRXZlbnQpO1xuXG5cdFx0dGhpcy50eXBlID0gJ25vdGUnO1xuXHRcdHRoaXMucGl0Y2ggPSBVdGlscy50b0FycmF5KGZpZWxkcy5waXRjaCk7XG5cdFx0dGhpcy53YWl0ID0gZmllbGRzLndhaXQgfHwgMDtcblx0XHR0aGlzLmR1cmF0aW9uID0gZmllbGRzLmR1cmF0aW9uO1xuXHRcdHRoaXMuc2VxdWVudGlhbCA9IGZpZWxkcy5zZXF1ZW50aWFsIHx8IGZhbHNlO1xuXHRcdHRoaXMudmVsb2NpdHkgPSBmaWVsZHMudmVsb2NpdHkgfHwgNTA7XG5cdFx0dGhpcy5jaGFubmVsID0gZmllbGRzLmNoYW5uZWwgfHwgMTtcblx0XHR0aGlzLnJlcGVhdCA9IGZpZWxkcy5yZXBlYXQgfHwgMTtcblx0XHR0aGlzLnZlbG9jaXR5ID0gdGhpcy5jb252ZXJ0VmVsb2NpdHkodGhpcy52ZWxvY2l0eSk7XG5cdFx0dGhpcy5ncmFjZSA9IGZpZWxkcy5ncmFjZTtcblx0XHR0aGlzLmJ1aWxkRGF0YSgpO1xuXHR9XG5cblx0LyoqXG4gICogQnVpbGRzIGludCBhcnJheSBmb3IgdGhpcyBldmVudC5cbiAgKiBAcmV0dXJuIHtOb3RlRXZlbnR9XG4gICovXG5cblxuXHRfY3JlYXRlQ2xhc3MoTm90ZUV2ZW50LCBbe1xuXHRcdGtleTogJ2J1aWxkRGF0YScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGJ1aWxkRGF0YSgpIHtcblx0XHRcdHRoaXMuZGF0YSA9IFtdO1xuXG5cdFx0XHR2YXIgdGlja0R1cmF0aW9uID0gdGhpcy5nZXRUaWNrRHVyYXRpb24odGhpcy5kdXJhdGlvbiwgJ25vdGUnKTtcblx0XHRcdHZhciByZXN0RHVyYXRpb24gPSB0aGlzLmdldFRpY2tEdXJhdGlvbih0aGlzLndhaXQsICdyZXN0Jyk7XG5cblx0XHRcdC8vIEFwcGx5IGdyYWNlIG5vdGUocykgYW5kIHN1YnRyYWN0IHRpY2tzIChjdXJyZW50bHkgMSB0aWNrIHBlciBncmFjZSBub3RlKSBmcm9tIHRpY2tEdXJhdGlvbiBzbyBuZXQgdmFsdWUgaXMgdGhlIHNhbWVcblx0XHRcdGlmICh0aGlzLmdyYWNlKSB7XG5cdFx0XHRcdHZhciBncmFjZUR1cmF0aW9uID0gMTtcblx0XHRcdFx0dGhpcy5ncmFjZSA9IFV0aWxzLnRvQXJyYXkodGhpcy5ncmFjZSk7XG5cdFx0XHRcdHRoaXMuZ3JhY2UuZm9yRWFjaChmdW5jdGlvbiAocGl0Y2gpIHtcblx0XHRcdFx0XHR2YXIgbm90ZUV2ZW50ID0gbmV3IE5vdGVFdmVudCh7IHBpdGNoOiB0aGlzLmdyYWNlLCBkdXJhdGlvbjogJ1QnICsgZ3JhY2VEdXJhdGlvbiB9KTtcblx0XHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KG5vdGVFdmVudC5kYXRhKTtcblxuXHRcdFx0XHRcdHRpY2tEdXJhdGlvbiAtPSBncmFjZUR1cmF0aW9uO1xuXHRcdFx0XHR9LCB0aGlzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZmllbGRzLnBpdGNoIGNvdWxkIGJlIGFuIGFycmF5IG9mIHBpdGNoZXMuXG5cdFx0XHQvLyBJZiBzbyBjcmVhdGUgbm90ZSBldmVudHMgZm9yIGVhY2ggYW5kIGFwcGx5IHRoZSBzYW1lIGR1cmF0aW9uLlxuXHRcdFx0dmFyIG5vdGVPbiwgbm90ZU9mZjtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHRoaXMucGl0Y2gpKSB7XG5cdFx0XHRcdC8vIEJ5IGRlZmF1bHQgdGhpcyBpcyBhIGNob3JkIGlmIGl0J3MgYW4gYXJyYXkgb2Ygbm90ZXMgdGhhdCByZXF1aXJlcyBvbmUgTm90ZU9uRXZlbnQuXG5cdFx0XHRcdC8vIElmIHRoaXMuc2VxdWVudGlhbCA9PT0gdHJ1ZSB0aGVuIGl0J3MgYSBzZXF1ZW50aWFsIHN0cmluZyBvZiBub3RlcyB0aGF0IHJlcXVpcmVzIHNlcGFyYXRlIE5vdGVPbkV2ZW50cy5cblx0XHRcdFx0aWYgKCF0aGlzLnNlcXVlbnRpYWwpIHtcblx0XHRcdFx0XHQvLyBIYW5kbGUgcmVwZWF0XG5cdFx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLnJlcGVhdDsgaisrKSB7XG5cdFx0XHRcdFx0XHQvLyBOb3RlIG9uXG5cdFx0XHRcdFx0XHR0aGlzLnBpdGNoLmZvckVhY2goZnVuY3Rpb24gKHAsIGkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGkgPT0gMCkge1xuXHRcdFx0XHRcdFx0XHRcdG5vdGVPbiA9IG5ldyBOb3RlT25FdmVudCh7IGRhdGE6IFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgocmVzdER1cmF0aW9uKS5jb25jYXQodGhpcy5nZXROb3RlT25TdGF0dXMoKSwgVXRpbHMuZ2V0UGl0Y2gocCksIHRoaXMudmVsb2NpdHkpIH0pO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFJ1bm5pbmcgc3RhdHVzIChjYW4gb21taXQgdGhlIG5vdGUgb24gc3RhdHVzKVxuXHRcdFx0XHRcdFx0XHRcdG5vdGVPbiA9IG5ldyBOb3RlT25FdmVudCh7IGRhdGE6IFswLCBVdGlscy5nZXRQaXRjaChwKSwgdGhpcy52ZWxvY2l0eV0gfSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KG5vdGVPbi5kYXRhKTtcblx0XHRcdFx0XHRcdH0sIHRoaXMpO1xuXG5cdFx0XHRcdFx0XHQvLyBOb3RlIG9mZlxuXHRcdFx0XHRcdFx0dGhpcy5waXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChwLCBpKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChpID09IDApIHtcblx0XHRcdFx0XHRcdFx0XHRub3RlT2ZmID0gbmV3IE5vdGVPZmZFdmVudCh7IGRhdGE6IFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgodGlja0R1cmF0aW9uKS5jb25jYXQodGhpcy5nZXROb3RlT2ZmU3RhdHVzKCksIFV0aWxzLmdldFBpdGNoKHApLCB0aGlzLnZlbG9jaXR5KSB9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBSdW5uaW5nIHN0YXR1cyAoY2FuIG9tbWl0IHRoZSBub3RlIG9mZiBzdGF0dXMpXG5cdFx0XHRcdFx0XHRcdFx0bm90ZU9mZiA9IG5ldyBOb3RlT2ZmRXZlbnQoeyBkYXRhOiBbMCwgVXRpbHMuZ2V0UGl0Y2gocCksIHRoaXMudmVsb2NpdHldIH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5kYXRhID0gdGhpcy5kYXRhLmNvbmNhdChub3RlT2ZmLmRhdGEpO1xuXHRcdFx0XHRcdFx0fSwgdGhpcyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEhhbmRsZSByZXBlYXRcblx0XHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMucmVwZWF0OyBqKyspIHtcblx0XHRcdFx0XHRcdHRoaXMucGl0Y2guZm9yRWFjaChmdW5jdGlvbiAocCwgaSkge1xuXHRcdFx0XHRcdFx0XHQvLyByZXN0RHVyYXRpb24gb25seSBhcHBsaWVzIHRvIGZpcnN0IG5vdGVcblx0XHRcdFx0XHRcdFx0aWYgKGkgPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdER1cmF0aW9uID0gMDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIElmIGR1cmF0aW9uIGlzIDh0aCB0cmlwbGV0cyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0b3RhbCB0aWNrcyA9PSBxdWFydGVyIG5vdGUuXG5cdFx0XHRcdFx0XHRcdC8vIFNvLCB0aGUgbGFzdCBvbmUgd2lsbCBuZWVkIHRvIGJlIHRoZSByZW1haW5kZXJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuZHVyYXRpb24gPT09ICc4dCcgJiYgaSA9PSB0aGlzLnBpdGNoLmxlbmd0aCAtIDEpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcXVhcnRlclRpY2tzID0gVXRpbHMubnVtYmVyRnJvbUJ5dGVzKENvbnN0YW50cy5IRUFERVJfQ0hVTktfRElWSVNJT04pO1xuXHRcdFx0XHRcdFx0XHRcdHRpY2tEdXJhdGlvbiA9IHF1YXJ0ZXJUaWNrcyAtIHRpY2tEdXJhdGlvbiAqIDI7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRub3RlT24gPSBuZXcgTm90ZU9uRXZlbnQoeyBkYXRhOiBVdGlscy5udW1iZXJUb1ZhcmlhYmxlTGVuZ3RoKHJlc3REdXJhdGlvbikuY29uY2F0KFt0aGlzLmdldE5vdGVPblN0YXR1cygpLCBVdGlscy5nZXRQaXRjaChwKSwgdGhpcy52ZWxvY2l0eV0pIH0pO1xuXHRcdFx0XHRcdFx0XHRub3RlT2ZmID0gbmV3IE5vdGVPZmZFdmVudCh7IGRhdGE6IFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgodGlja0R1cmF0aW9uKS5jb25jYXQoW3RoaXMuZ2V0Tm90ZU9mZlN0YXR1cygpLCBVdGlscy5nZXRQaXRjaChwKSwgdGhpcy52ZWxvY2l0eV0pIH0pO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5jb25jYXQobm90ZU9uLmRhdGEsIG5vdGVPZmYuZGF0YSk7XG5cdFx0XHRcdFx0XHR9LCB0aGlzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblxuXHRcdFx0dGhyb3cgJ3BpdGNoIG11c3QgYmUgYW4gYXJyYXkuJztcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdjb252ZXJ0VmVsb2NpdHknLFxuXG5cblx0XHQvKipcbiAgICogQ29udmVydHMgdmVsb2NpdHkgdG8gdmFsdWUgMC0xMjdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZlbG9jaXR5IC0gVmVsb2NpdHkgdmFsdWUgMS0xMDBcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cblx0XHR2YWx1ZTogZnVuY3Rpb24gY29udmVydFZlbG9jaXR5KHZlbG9jaXR5KSB7XG5cdFx0XHQvLyBNYXggcGFzc2VkIHZhbHVlIGxpbWl0ZWQgdG8gMTAwXG5cdFx0XHR2ZWxvY2l0eSA9IHZlbG9jaXR5ID4gMTAwID8gMTAwIDogdmVsb2NpdHk7XG5cdFx0XHRyZXR1cm4gTWF0aC5yb3VuZCh2ZWxvY2l0eSAvIDEwMCAqIDEyNyk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnZ2V0VGlja0R1cmF0aW9uJyxcblxuXG5cdFx0LyoqXG4gICAqIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiB0aWNrcyBiYXNlZCBvbiBwYXNzZWQgZHVyYXRpb24uXG4gICAqIE5vdGU6IHR5cGU9PSdub3RlJyBkZWZhdWx0cyB0byBxdWFydGVyIG5vdGUsIHR5cGU9PT0ncmVzdCcgZGVmYXVsdHMgdG8gMFxuICAgKiBAcGFyYW0geyhzdHJpbmd8YXJyYXkpfSBkdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBbJ25vdGUnLCAncmVzdCddXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldFRpY2tEdXJhdGlvbihkdXJhdGlvbiwgdHlwZSkge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoZHVyYXRpb24pKSB7XG5cdFx0XHRcdC8vIFJlY3Vyc2l2ZWx5IGV4ZWN1dGUgdGhpcyBtZXRob2QgZm9yIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgYW5kIHJldHVybiB0aGUgc3VtIG9mIHRpY2sgZHVyYXRpb25zLlxuXHRcdFx0XHRyZXR1cm4gZHVyYXRpb24ubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmdldFRpY2tEdXJhdGlvbih2YWx1ZSwgdHlwZSk7XG5cdFx0XHRcdH0sIHRoaXMpLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0XHRcdHJldHVybiBhICsgYjtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cblx0XHRcdGR1cmF0aW9uID0gZHVyYXRpb24udG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKGR1cmF0aW9uLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApID09PSAndCcpIHtcblx0XHRcdFx0Ly8gSWYgZHVyYXRpb24gc3RhcnRzIHdpdGggJ3QnIHRoZW4gdGhlIG51bWJlciB0aGF0IGZvbGxvd3MgaXMgYW4gZXhwbGljaXQgdGljayBjb3VudFxuXHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoZHVyYXRpb24uc3Vic3RyaW5nKDEpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmVlZCB0byBhcHBseSBkdXJhdGlvbiBoZXJlLiAgUXVhcnRlciBub3RlID09IENvbnN0YW50cy5IRUFERVJfQ0hVTktfRElWSVNJT05cblx0XHRcdC8vIFJvdW5kaW5nIG9ubHkgYXBwbGllcyB0byB0cmlwbGV0cywgd2hpY2ggdGhlIHJlbWFpbmRlciBpcyBoYW5kbGVkIGJlbG93XG5cdFx0XHR2YXIgcXVhcnRlclRpY2tzID0gVXRpbHMubnVtYmVyRnJvbUJ5dGVzKENvbnN0YW50cy5IRUFERVJfQ0hVTktfRElWSVNJT04pO1xuXHRcdFx0cmV0dXJuIE1hdGgucm91bmQocXVhcnRlclRpY2tzICogdGhpcy5nZXREdXJhdGlvbk11bHRpcGxpZXIoZHVyYXRpb24sIHR5cGUpKTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogR2V0cyB3aGF0IHRvIG11bHRpcGxlIHRpY2tzL3F1YXJ0ZXIgbm90ZSBieSB0byBnZXQgdGhlIHNwZWNpZmllZCBkdXJhdGlvbi5cbiAgICogTm90ZTogdHlwZT09J25vdGUnIGRlZmF1bHRzIHRvIHF1YXJ0ZXIgbm90ZSwgdHlwZT09PSdyZXN0JyBkZWZhdWx0cyB0byAwXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkdXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBbJ25vdGUnLCdyZXN0J11cbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cblxuXHR9LCB7XG5cdFx0a2V5OiAnZ2V0RHVyYXRpb25NdWx0aXBsaWVyJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0RHVyYXRpb25NdWx0aXBsaWVyKGR1cmF0aW9uLCB0eXBlKSB7XG5cdFx0XHQvLyBOZWVkIHRvIGFwcGx5IGR1cmF0aW9uIGhlcmUuICBRdWFydGVyIG5vdGUgPT0gQ29uc3RhbnRzLkhFQURFUl9DSFVOS19ESVZJU0lPTlxuXHRcdFx0c3dpdGNoIChkdXJhdGlvbikge1xuXHRcdFx0XHRjYXNlICcwJzpcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0Y2FzZSAnMSc6XG5cdFx0XHRcdFx0cmV0dXJuIDQ7XG5cdFx0XHRcdGNhc2UgJzInOlxuXHRcdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0XHRjYXNlICdkMic6XG5cdFx0XHRcdFx0cmV0dXJuIDM7XG5cdFx0XHRcdGNhc2UgJzQnOlxuXHRcdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0XHRjYXNlICc0dCc6XG5cdFx0XHRcdFx0cmV0dXJuIDAuNjY2O1xuXHRcdFx0XHRjYXNlICdkNCc6XG5cdFx0XHRcdFx0cmV0dXJuIDEuNTtcblx0XHRcdFx0Y2FzZSAnOCc6XG5cdFx0XHRcdFx0cmV0dXJuIDAuNTtcblx0XHRcdFx0Y2FzZSAnOHQnOlxuXHRcdFx0XHRcdC8vIEZvciA4dGggdHJpcGxldHMsIGxldCdzIGRpdmlkZSBhIHF1YXJ0ZXIgYnkgMywgcm91bmQgdG8gdGhlIG5lYXJlc3QgaW50LCBhbmQgc3Vic3RyYWN0IHRoZSByZW1haW5kZXIgdG8gdGhlIGxhc3Qgb25lLlxuXHRcdFx0XHRcdHJldHVybiAwLjMzO1xuXHRcdFx0XHRjYXNlICdkOCc6XG5cdFx0XHRcdFx0cmV0dXJuIDAuNzU7XG5cdFx0XHRcdGNhc2UgJzE2Jzpcblx0XHRcdFx0XHRyZXR1cm4gMC4yNTtcblx0XHRcdFx0Y2FzZSAnMTZ0Jzpcblx0XHRcdFx0XHRyZXR1cm4gMC4xNjY7XG5cdFx0XHRcdGNhc2UgJzMyJzpcblx0XHRcdFx0XHRyZXR1cm4gMC4xMjU7XG5cdFx0XHRcdGNhc2UgJzY0Jzpcblx0XHRcdFx0XHRyZXR1cm4gMC4wNjI1O1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHQvLyBOb3RlcyBkZWZhdWx0IHRvIGEgcXVhcnRlciwgcmVzdHMgZGVmYXVsdCB0byAwXG5cdFx0XHRcdC8vcmV0dXJuIHR5cGUgPT09ICdub3RlJyA/IDEgOiAwO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHJvdyBkdXJhdGlvbiArICcgaXMgbm90IGEgdmFsaWQgZHVyYXRpb24uJztcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdnZXROb3RlT25TdGF0dXMnLFxuXG5cblx0XHQvKipcbiAgICogR2V0cyB0aGUgbm90ZSBvbiBzdGF0dXMgY29kZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgY2hhbm5lbC4gMHg5ezAtRn1cbiAgICogTm90ZSBvbiBhdCBjaGFubmVsIDAgaXMgMHg5MCAoMTQ0KVxuICAgKiAwID0gQ2ggMVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuXHRcdHZhbHVlOiBmdW5jdGlvbiBnZXROb3RlT25TdGF0dXMoKSB7XG5cdFx0XHRyZXR1cm4gMTQ0ICsgdGhpcy5jaGFubmVsIC0gMTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogR2V0cyB0aGUgbm90ZSBvZmYgc3RhdHVzIGNvZGUgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGNoYW5uZWwuIDB4OHswLUZ9XG4gICAqIE5vdGUgb2ZmIGF0IGNoYW5uZWwgMCBpcyAweDgwICgxMjgpXG4gICAqIDAgPSBDaCAxXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG5cblx0fSwge1xuXHRcdGtleTogJ2dldE5vdGVPZmZTdGF0dXMnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBnZXROb3RlT2ZmU3RhdHVzKCkge1xuXHRcdFx0cmV0dXJuIDEyOCArIHRoaXMuY2hhbm5lbCAtIDE7XG5cdFx0fVxuXHR9XSk7XG5cblx0cmV0dXJuIE5vdGVFdmVudDtcbn0oKTtcblxuZXhwb3J0cy5Ob3RlRXZlbnQgPSBOb3RlRXZlbnQ7XG4vKipcbiAqIEhvbGRzIGFsbCBkYXRhIGZvciBhIFwibm90ZSBvZmZcIiBNSURJIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gZmllbGRzIHtkYXRhOiBbXX1cbiAqIEByZXR1cm4ge05vdGVPZmZFdmVudH1cbiAqL1xuXG52YXIgTm90ZU9mZkV2ZW50ID0gZnVuY3Rpb24gTm90ZU9mZkV2ZW50KGZpZWxkcykge1xuXHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm90ZU9mZkV2ZW50KTtcblxuXHR0aGlzLmRhdGEgPSBmaWVsZHMuZGF0YTtcbn07XG5cbmV4cG9ydHMuTm90ZU9mZkV2ZW50ID0gTm90ZU9mZkV2ZW50O1xuLyoqXG4gKiBIb2xkcyBhbGwgZGF0YSBmb3IgYSBcIm5vdGUgb25cIiBNSURJIGV2ZW50XG4gKiBAcGFyYW0ge29iamVjdH0gZmllbGRzIHtkYXRhOiBbXX1cbiAqIEByZXR1cm4ge05vdGVPbkV2ZW50fVxuICovXG5cbnZhciBOb3RlT25FdmVudCA9IGZ1bmN0aW9uIE5vdGVPbkV2ZW50KGZpZWxkcykge1xuXHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgTm90ZU9uRXZlbnQpO1xuXG5cdHRoaXMuZGF0YSA9IGZpZWxkcy5kYXRhO1xufTtcblxuZXhwb3J0cy5Ob3RlT25FdmVudCA9IE5vdGVPbkV2ZW50O1xuLyoqXG4gKiBIb2xkcyBhbGwgZGF0YSBmb3IgYSBcInByb2dyYW0gY2hhbmdlXCIgTUlESSBldmVudFxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkcyB7aW5zdHJ1bWVudDogaW50ZWdlcn1cbiAqIEByZXR1cm4ge1Byb2dyYW1DaGFuZ2VFdmVudH1cbiAqL1xuXG52YXIgUHJvZ3JhbUNoYW5nZUV2ZW50ID0gZnVuY3Rpb24gUHJvZ3JhbUNoYW5nZUV2ZW50KGZpZWxkcykge1xuXHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgUHJvZ3JhbUNoYW5nZUV2ZW50KTtcblxuXHR0aGlzLnR5cGUgPSAncHJvZ3JhbSc7XG5cdC8vIGRlbHRhIHRpbWUgZGVmYXVsdHMgdG8gMC5cblx0dGhpcy5kYXRhID0gVXRpbHMubnVtYmVyVG9WYXJpYWJsZUxlbmd0aCgweDAwKS5jb25jYXQoQ29uc3RhbnRzLlBST0dSQU1fQ0hBTkdFX1NUQVRVUywgZmllbGRzLmluc3RydW1lbnQpO1xufTtcblxuZXhwb3J0cy5Qcm9ncmFtQ2hhbmdlRXZlbnQgPSBQcm9ncmFtQ2hhbmdlRXZlbnQ7XG4vKipcbiAqIEhvbGRzIGFsbCBkYXRhIGZvciBhIHRyYWNrLlxuICogQHBhcmFtIHtvYmplY3R9IGZpZWxkcyB7dHlwZTogbnVtYmVyLCBkYXRhOiBhcnJheSwgc2l6ZTogYXJyYXksIGV2ZW50czogYXJyYXl9XG4gKiBAcmV0dXJuIHtUcmFja31cbiAqL1xuXG52YXIgVHJhY2sgPSBmdW5jdGlvbiAoKSB7XG5cdGZ1bmN0aW9uIFRyYWNrKCkge1xuXHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUcmFjayk7XG5cblx0XHR0aGlzLnR5cGUgPSBDb25zdGFudHMuVFJBQ0tfQ0hVTktfVFlQRTtcblx0XHR0aGlzLmRhdGEgPSBbXTtcblx0XHR0aGlzLnNpemUgPSBbXTtcblx0XHR0aGlzLmV2ZW50cyA9IFtdO1xuXHR9XG5cblx0LyoqXG4gICogQWRkcyBhbnkgZXZlbnQgdHlwZSB0byB0aGUgdHJhY2suXG4gICogQHBhcmFtIHsoTm90ZUV2ZW50fE1ldGFFdmVudHxQcm9ncmFtQ2hhbmdlRXZlbnQpfSBldmVudCAtIEV2ZW50IG9iamVjdC5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtYXBGdW5jdGlvbiAtIENhbGxiYWNrIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFwcGx5IHNwZWNpZmljIHByb3BlcnRpZXMgdG8gYWxsIGV2ZW50cy4gXG4gICogQHJldHVybiB7VHJhY2t9XG4gICovXG5cblxuXHRfY3JlYXRlQ2xhc3MoVHJhY2ssIFt7XG5cdFx0a2V5OiAnYWRkRXZlbnQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBhZGRFdmVudChldmVudCwgbWFwRnVuY3Rpb24pIHtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuXHRcdFx0XHRldmVudC5mb3JFYWNoKGZ1bmN0aW9uIChlLCBpKSB7XG5cdFx0XHRcdFx0Ly8gSGFuZGxlIG1hcCBmdW5jdGlvbiBpZiBwcm92aWRlZFxuXHRcdFx0XHRcdGlmICh0eXBlb2YgbWFwRnVuY3Rpb24gPT09ICdmdW5jdGlvbicgJiYgZS50eXBlID09PSAnbm90ZScpIHtcblx0XHRcdFx0XHRcdHZhciBwcm9wZXJ0aWVzID0gbWFwRnVuY3Rpb24oaSwgZSk7XG5cblx0XHRcdFx0XHRcdGlmICgodHlwZW9mIHByb3BlcnRpZXMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHByb3BlcnRpZXMpKSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaiBpbiBwcm9wZXJ0aWVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoIChqKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGUuZHVyYXRpb24gPSBwcm9wZXJ0aWVzW2pdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3NlcXVlbnRpYWwnOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlLnNlcXVlbnRpYWwgPSBwcm9wZXJ0aWVzW2pdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3ZlbG9jaXR5Jzpcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZS52ZWxvY2l0eSA9IGUuY29udmVydFZlbG9jaXR5KHByb3BlcnRpZXNbal0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyBHb3R0YSBidWlsZCB0aGF0IGRhdGFcblx0XHRcdFx0XHRcdFx0ZS5idWlsZERhdGEoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KGUuZGF0YSk7XG5cdFx0XHRcdFx0dGhpcy5zaXplID0gVXRpbHMubnVtYmVyVG9CeXRlcyh0aGlzLmRhdGEubGVuZ3RoLCA0KTsgLy8gNCBieXRlcyBsb25nXG5cdFx0XHRcdFx0dGhpcy5ldmVudHMucHVzaChlKTtcblx0XHRcdFx0fSwgdGhpcyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KGV2ZW50LmRhdGEpO1xuXHRcdFx0XHR0aGlzLnNpemUgPSBVdGlscy5udW1iZXJUb0J5dGVzKHRoaXMuZGF0YS5sZW5ndGgsIDQpOyAvLyA0IGJ5dGVzIGxvbmdcblx0XHRcdFx0dGhpcy5ldmVudHMucHVzaChldmVudCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8qKlxuICAgKiBTZXRzIHRlbXBvIG9mIHRoZSBNSURJIGZpbGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBicG0gLSBUZW1wbyBpbiBiZWF0cyBwZXIgbWludXRlLlxuICAgKiBAcmV0dXJuIHtUcmFja31cbiAgICovXG5cblx0fSwge1xuXHRcdGtleTogJ3NldFRlbXBvJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2V0VGVtcG8oYnBtKSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBuZXcgTWV0YUV2ZW50KHsgZGF0YTogW0NvbnN0YW50cy5NRVRBX1RFTVBPX0lEXSB9KTtcblx0XHRcdGV2ZW50LmRhdGEucHVzaCgweDAzKTsgLy8gU2l6ZVxuXHRcdFx0dmFyIHRlbXBvID0gTWF0aC5yb3VuZCg2MDAwMDAwMCAvIGJwbSk7XG5cdFx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoVXRpbHMubnVtYmVyVG9CeXRlcyh0ZW1wbywgMykpOyAvLyBUZW1wbywgMyBieXRlc1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHRcdH1cblxuXHRcdC8qKlxuICAgKiBTZXRzIHRpbWUgc2lnbmF0dXJlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtZXJhdG9yIC0gVG9wIG51bWJlciBvZiB0aGUgdGltZSBzaWduYXR1cmUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZW5vbWluYXRvciAtIEJvdHRvbSBudW1iZXIgb2YgdGhlIHRpbWUgc2lnbmF0dXJlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWlkaWNsb2Nrc3BlcnRpY2sgLSBEZWZhdWx0cyB0byAyNC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG5vdGVzcGVybWlkaWNsb2NrIC0gRGVmYXVsdHMgdG8gOC5cbiAgICogQHJldHVybiB7VHJhY2t9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdzZXRUaW1lU2lnbmF0dXJlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2V0VGltZVNpZ25hdHVyZShudW1lcmF0b3IsIGRlbm9taW5hdG9yLCBtaWRpY2xvY2tzcGVydGljaywgbm90ZXNwZXJtaWRpY2xvY2spIHtcblx0XHRcdG1pZGljbG9ja3NwZXJ0aWNrID0gbWlkaWNsb2Nrc3BlcnRpY2sgfHwgMjQ7XG5cdFx0XHRub3Rlc3Blcm1pZGljbG9jayA9IG5vdGVzcGVybWlkaWNsb2NrIHx8IDg7XG5cblx0XHRcdHZhciBldmVudCA9IG5ldyBNZXRhRXZlbnQoeyBkYXRhOiBbQ29uc3RhbnRzLk1FVEFfVElNRV9TSUdOQVRVUkVfSURdIH0pO1xuXHRcdFx0ZXZlbnQuZGF0YS5wdXNoKDB4MDQpOyAvLyBTaXplXG5cdFx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoVXRpbHMubnVtYmVyVG9CeXRlcyhudW1lcmF0b3IsIDEpKTsgLy8gTnVtZXJhdG9yLCAxIGJ5dGVzXG5cblx0XHRcdHZhciBfZGVub21pbmF0b3IgPSBNYXRoLmxvZzIoZGVub21pbmF0b3IpOyAvLyBEZW5vbWluYXRvciBpcyBleHByZXNzZWQgYXMgcG93IG9mIDJcblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb0J5dGVzKF9kZW5vbWluYXRvciwgMSkpOyAvLyBEZW5vbWluYXRvciwgMSBieXRlc1xuXHRcdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvQnl0ZXMobWlkaWNsb2Nrc3BlcnRpY2ssIDEpKTsgLy8gTUlESSBDbG9ja3MgcGVyIHRpY2ssIDEgYnl0ZXNcblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb0J5dGVzKG5vdGVzcGVybWlkaWNsb2NrLCAxKSk7IC8vIE51bWJlciBvZiAxLzMyIG5vdGVzIHBlciBNSURJIGNsb2NrcywgMSBieXRlc1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHRcdH1cblxuXHRcdC8qKlxuICAgKiBTZXRzIGtleSBzaWduYXR1cmUuXG4gICAqIEBwYXJhbSB7Kn0gc2YgLSBcbiAgICogQHBhcmFtIHsqfSBtaSAtXG4gICAqIEByZXR1cm4ge1RyYWNrfVxuICAgKi9cblxuXHR9LCB7XG5cdFx0a2V5OiAnc2V0S2V5U2lnbmF0dXJlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc2V0S2V5U2lnbmF0dXJlKHNmLCBtaSkge1xuXHRcdFx0dmFyIGV2ZW50ID0gbmV3IE1ldGFFdmVudCh7IGRhdGE6IFtDb25zdGFudHMuTUVUQV9LRVlfU0lHTkFUVVJFX0lEXSB9KTtcblx0XHRcdGV2ZW50LmRhdGEucHVzaCgweDAyKTsgLy8gU2l6ZVxuXG5cdFx0XHR2YXIgbW9kZSA9IG1pIHx8IDA7XG5cdFx0XHRzZiA9IHNmIHx8IDA7XG5cblx0XHRcdC8vXHRGdW5jdGlvbiBjYWxsZWQgd2l0aCBzdHJpbmcgbm90YXRpb25cblx0XHRcdGlmICh0eXBlb2YgbWkgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHZhciBmaWZ0aHMgPSBbWydDYicsICdHYicsICdEYicsICdBYicsICdFYicsICdCYicsICdGJywgJ0MnLCAnRycsICdEJywgJ0EnLCAnRScsICdCJywgJ0YjJywgJ0MjJ10sIFsnYWInLCAnZWInLCAnYmInLCAnZicsICdjJywgJ2cnLCAnZCcsICdhJywgJ2UnLCAnYicsICdmIycsICdjIycsICdnIycsICdkIycsICdhIyddXTtcblx0XHRcdFx0dmFyIF9zZmxlbiA9IHNmLmxlbmd0aDtcblx0XHRcdFx0dmFyIG5vdGUgPSBzZiB8fCAnQyc7XG5cblx0XHRcdFx0aWYgKHNmWzBdID09PSBzZlswXS50b0xvd2VyQ2FzZSgpKSBtb2RlID0gMTtcblxuXHRcdFx0XHRpZiAoX3NmbGVuID4gMSkge1xuXHRcdFx0XHRcdHN3aXRjaCAoc2YuY2hhckF0KF9zZmxlbiAtIDEpKSB7XG5cdFx0XHRcdFx0XHRjYXNlICdtJzpcblx0XHRcdFx0XHRcdFx0bW9kZSA9IDE7XG5cdFx0XHRcdFx0XHRcdG5vdGUgPSBzZi5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdFx0bm90ZSA9IG5vdGUuY29uY2F0KHNmLnN1YnN0cmluZygxLCBfc2ZsZW4gLSAxKSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSAnLSc6XG5cdFx0XHRcdFx0XHRcdG1vZGUgPSAxO1xuXHRcdFx0XHRcdFx0XHRub3RlID0gc2YuY2hhckF0KDApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRcdG5vdGUgPSBub3RlLmNvbmNhdChzZi5zdWJzdHJpbmcoMSwgX3NmbGVuIC0gMSkpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgJ00nOlxuXHRcdFx0XHRcdFx0XHRtb2RlID0gMDtcblx0XHRcdFx0XHRcdFx0bm90ZSA9IHNmLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0XHRub3RlID0gbm90ZS5jb25jYXQoc2Yuc3Vic3RyaW5nKDEsIF9zZmxlbiAtIDEpKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlICcrJzpcblx0XHRcdFx0XHRcdFx0bW9kZSA9IDA7XG5cdFx0XHRcdFx0XHRcdG5vdGUgPSBzZi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKTtcblx0XHRcdFx0XHRcdFx0bm90ZSA9IG5vdGUuY29uY2F0KHNmLnN1YnN0cmluZygxLCBfc2ZsZW4gLSAxKSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBmaWZ0aGluZGV4ID0gZmlmdGhzW21vZGVdLmluZGV4T2Yobm90ZSk7XG5cdFx0XHRcdHNmID0gZmlmdGhpbmRleCA9PT0gLTEgPyAwIDogZmlmdGhpbmRleCAtIDc7XG5cdFx0XHR9XG5cblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb0J5dGVzKHNmLCAxKSk7IC8vIE51bWJlciBvZiBzaGFycCBvciBmbGF0cyAoIDwgMCBmbGF0OyA+IDAgc2hhcnApXG5cdFx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoVXRpbHMubnVtYmVyVG9CeXRlcyhtb2RlLCAxKSk7IC8vIE1vZGU6IDAgbWFqb3IsIDEgbWlub3Jcblx0XHRcdHJldHVybiB0aGlzLmFkZEV2ZW50KGV2ZW50KTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogQWRkcyB0ZXh0IHRvIE1JREkgZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUZXh0IHRvIGFkZC5cbiAgICogQHJldHVybiB7VHJhY2t9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdhZGRUZXh0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYWRkVGV4dCh0ZXh0KSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBuZXcgTWV0YUV2ZW50KHsgZGF0YTogW0NvbnN0YW50cy5NRVRBX1RFWFRfSURdIH0pO1xuXHRcdFx0dmFyIHN0cmluZ0J5dGVzID0gVXRpbHMuc3RyaW5nVG9CeXRlcyh0ZXh0KTtcblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb1ZhcmlhYmxlTGVuZ3RoKHN0cmluZ0J5dGVzLmxlbmd0aCkpOyAvLyBTaXplXG5cdFx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoc3RyaW5nQnl0ZXMpOyAvLyBUZXh0XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRFdmVudChldmVudCk7XG5cdFx0fVxuXG5cdFx0LyoqXG4gICAqIEFkZHMgY29weXJpZ2h0IHRvIE1JREkgZmlsZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUZXh0IG9mIGNvcHlyaWdodCBsaW5lLlxuICAgKiBAcmV0dXJuIHtUcmFja31cbiAgICovXG5cblx0fSwge1xuXHRcdGtleTogJ2FkZENvcHlyaWdodCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGFkZENvcHlyaWdodCh0ZXh0KSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBuZXcgTWV0YUV2ZW50KHsgZGF0YTogW0NvbnN0YW50cy5NRVRBX0NPUFlSSUdIVF9JRF0gfSk7XG5cdFx0XHR2YXIgc3RyaW5nQnl0ZXMgPSBVdGlscy5zdHJpbmdUb0J5dGVzKHRleHQpO1xuXHRcdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoc3RyaW5nQnl0ZXMubGVuZ3RoKSk7IC8vIFNpemVcblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChzdHJpbmdCeXRlcyk7IC8vIFRleHRcblx0XHRcdHJldHVybiB0aGlzLmFkZEV2ZW50KGV2ZW50KTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogQWRkcyBTZXF1ZW5jZS9UcmFjayBOYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRleHQgb2YgdHJhY2sgbmFtZS5cbiAgICogQHJldHVybiB7VHJhY2t9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdhZGRUcmFja05hbWUnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBhZGRUcmFja05hbWUodGV4dCkge1xuXHRcdFx0dmFyIGV2ZW50ID0gbmV3IE1ldGFFdmVudCh7IGRhdGE6IFtDb25zdGFudHMuTUVUQV9UUkFDS19OQU1FX0lEXSB9KTtcblx0XHRcdHZhciBzdHJpbmdCeXRlcyA9IFV0aWxzLnN0cmluZ1RvQnl0ZXModGV4dCk7XG5cdFx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoVXRpbHMubnVtYmVyVG9WYXJpYWJsZUxlbmd0aChzdHJpbmdCeXRlcy5sZW5ndGgpKTsgLy8gU2l6ZVxuXHRcdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KHN0cmluZ0J5dGVzKTsgLy8gVGV4dFxuXHRcdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHRcdH1cblxuXHRcdC8qKlxuICAgKiBTZXRzIGluc3RydW1lbnQgbmFtZSBvZiB0cmFjay5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBOYW1lIG9mIGluc3RydW1lbnQuXG4gICAqIEByZXR1cm4ge1RyYWNrfVxuICAgKi9cblxuXHR9LCB7XG5cdFx0a2V5OiAnYWRkSW5zdHJ1bWVudE5hbWUnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBhZGRJbnN0cnVtZW50TmFtZSh0ZXh0KSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBuZXcgTWV0YUV2ZW50KHsgZGF0YTogW0NvbnN0YW50cy5NRVRBX0lOU1RSVU1FTlRfTkFNRV9JRF0gfSk7XG5cdFx0XHR2YXIgc3RyaW5nQnl0ZXMgPSBVdGlscy5zdHJpbmdUb0J5dGVzKHRleHQpO1xuXHRcdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoc3RyaW5nQnl0ZXMubGVuZ3RoKSk7IC8vIFNpemVcblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChzdHJpbmdCeXRlcyk7IC8vIFRleHRcblx0XHRcdHJldHVybiB0aGlzLmFkZEV2ZW50KGV2ZW50KTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogQWRkcyBtYXJrZXIgdG8gTUlESSBmaWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIE1hcmtlciB0ZXh0LlxuICAgKiBAcmV0dXJuIHtUcmFja31cbiAgICovXG5cblx0fSwge1xuXHRcdGtleTogJ2FkZE1hcmtlcicsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGFkZE1hcmtlcih0ZXh0KSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBuZXcgTWV0YUV2ZW50KHsgZGF0YTogW0NvbnN0YW50cy5NRVRBX01BUktFUl9JRF0gfSk7XG5cdFx0XHR2YXIgc3RyaW5nQnl0ZXMgPSBVdGlscy5zdHJpbmdUb0J5dGVzKHRleHQpO1xuXHRcdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoc3RyaW5nQnl0ZXMubGVuZ3RoKSk7IC8vIFNpemVcblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChzdHJpbmdCeXRlcyk7IC8vIFRleHRcblx0XHRcdHJldHVybiB0aGlzLmFkZEV2ZW50KGV2ZW50KTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogQWRkcyBjdWUgcG9pbnQgdG8gTUlESSBmaWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRleHQgb2YgY3VlIHBvaW50LlxuICAgKiBAcmV0dXJuIHtUcmFja31cbiAgICovXG5cblx0fSwge1xuXHRcdGtleTogJ2FkZEN1ZVBvaW50Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYWRkQ3VlUG9pbnQodGV4dCkge1xuXHRcdFx0dmFyIGV2ZW50ID0gbmV3IE1ldGFFdmVudCh7IGRhdGE6IFtDb25zdGFudHMuTUVUQV9DVUVfUE9JTlRdIH0pO1xuXHRcdFx0dmFyIHN0cmluZ0J5dGVzID0gVXRpbHMuc3RyaW5nVG9CeXRlcyh0ZXh0KTtcblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChVdGlscy5udW1iZXJUb1ZhcmlhYmxlTGVuZ3RoKHN0cmluZ0J5dGVzLmxlbmd0aCkpOyAvLyBTaXplXG5cdFx0XHRldmVudC5kYXRhID0gZXZlbnQuZGF0YS5jb25jYXQoc3RyaW5nQnl0ZXMpOyAvLyBUZXh0XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRFdmVudChldmVudCk7XG5cdFx0fVxuXG5cdFx0LyoqXG4gICAqIEFkZHMgbHlyaWMgdG8gTUlESSBmaWxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbHlyaWMgLSBMeXJpYyB0ZXh0IHRvIGFkZC5cbiAgICogQHJldHVybiB7VHJhY2t9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdhZGRMeXJpYycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGFkZEx5cmljKGx5cmljKSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBuZXcgTWV0YUV2ZW50KHsgZGF0YTogW0NvbnN0YW50cy5NRVRBX0xZUklDX0lEXSB9KTtcblx0XHRcdHZhciBzdHJpbmdCeXRlcyA9IFV0aWxzLnN0cmluZ1RvQnl0ZXMobHlyaWMpO1xuXHRcdFx0ZXZlbnQuZGF0YSA9IGV2ZW50LmRhdGEuY29uY2F0KFV0aWxzLm51bWJlclRvVmFyaWFibGVMZW5ndGgoc3RyaW5nQnl0ZXMubGVuZ3RoKSk7IC8vIFNpemVcblx0XHRcdGV2ZW50LmRhdGEgPSBldmVudC5kYXRhLmNvbmNhdChzdHJpbmdCeXRlcyk7IC8vIEx5cmljXG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRFdmVudChldmVudCk7XG5cdFx0fVxuXG5cdFx0LyoqXG4gICAqIENoYW5uZWwgbW9kZSBtZXNzYWdlc1xuICAgKiBAcmV0dXJuIHtUcmFja31cbiAgICovXG5cblx0fSwge1xuXHRcdGtleTogJ3BvbHlNb2RlT24nLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBwb2x5TW9kZU9uKCkge1xuXHRcdFx0dmFyIGV2ZW50ID0gbmV3IE5vdGVPbkV2ZW50KHsgZGF0YTogWzB4MDAsIDB4QjAsIDB4N0UsIDB4MDBdIH0pO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkRXZlbnQoZXZlbnQpO1xuXHRcdH1cblx0fV0pO1xuXG5cdHJldHVybiBUcmFjaztcbn0oKTtcblxuZXhwb3J0cy5UcmFjayA9IFRyYWNrO1xuXG4vKipcbiAqIFN0YXRpYyB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkuXG4gKi9cbnZhciBVdGlscyA9IGZ1bmN0aW9uICgpIHtcblx0ZnVuY3Rpb24gVXRpbHMoKSB7XG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIFV0aWxzKTtcblx0fVxuXG5cdF9jcmVhdGVDbGFzcyhVdGlscywgbnVsbCwgW3tcblx0XHRrZXk6ICd2ZXJzaW9uJyxcblxuXG5cdFx0LyoqXG4gICAqIEdldHMgTWlkaVdyaXRlckpTIHZlcnNpb24gbnVtYmVyLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXHRcdHZhbHVlOiBmdW5jdGlvbiB2ZXJzaW9uKCkge1xuXHRcdFx0cmV0dXJuIENvbnN0YW50cy5WRVJTSU9OO1xuXHRcdH1cblxuXHRcdC8qKlxuICAgKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHJldHVybiB7YXJyYXl9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdzdHJpbmdUb0J5dGVzJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHJpbmcpIHtcblx0XHRcdHJldHVybiBzdHJpbmcuc3BsaXQoJycpLm1hcChmdW5jdGlvbiAoY2hhcikge1xuXHRcdFx0XHRyZXR1cm4gY2hhci5jaGFyQ29kZUF0KCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogQ2hlY2tzIGlmIGFyZ3VtZW50IGlzIGEgdmFsaWQgbnVtYmVyLlxuICAgKiBAcGFyYW0geyp9IG4gLSBWYWx1ZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cblxuXHR9LCB7XG5cdFx0a2V5OiAnaXNOdW1lcmljJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaXNOdW1lcmljKG4pIHtcblx0XHRcdHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChuKSkgJiYgaXNGaW5pdGUobik7XG5cdFx0fVxuXG5cdFx0LyoqXG4gICAgICAqIFJldHVybnMgdGhlIGNvcnJlY3QgTUlESSBudW1iZXIgZm9yIHRoZSBzcGVjaWZpZWQgcGl0Y2guXG4gICAgICAqIFVzZXMgVG9uYWwgTWlkaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZ2IvdG9uYWwvdHJlZS9tYXN0ZXIvcGFja2FnZXMvbWlkaVxuICAgICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gcGl0Y2ggLSAnQyM0JyBvciBtaWRpIG5vdGUgY29kZVxuICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdnZXRQaXRjaCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGdldFBpdGNoKHBpdGNoKSB7XG5cdFx0XHRyZXR1cm4gKDAsIF90b25hbE1pZGkudG9NaWRpKShwaXRjaCk7XG5cdFx0fVxuXG5cdFx0LyoqXG4gICAqIFRyYW5zbGF0ZXMgbnVtYmVyIG9mIHRpY2tzIHRvIE1JREkgdGltZXN0YW1wIGZvcm1hdCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mXG4gICAqIGhleCBzdHJpbmdzIHdpdGggdGhlIHRpbWUgdmFsdWVzLiBNaWRpIGhhcyBhIHZlcnkgcGFydGljdWxhciB0aW1lIHRvIGV4cHJlc3MgdGltZSxcbiAgICogdGFrZSBhIGdvb2QgbG9vayBhdCB0aGUgc3BlYyBiZWZvcmUgZXZlciB0b3VjaGluZyB0aGlzIGZ1bmN0aW9uLlxuICAgKiBUaGFua3MgdG8gaHR0cHM6Ly9naXRodWIuY29tL3NlcmdpL2pzbWlkaVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGlja3MgLSBOdW1iZXIgb2YgdGlja3MgdG8gYmUgdHJhbnNsYXRlZFxuICAgKiBAcmV0dXJuIHthcnJheX0gLSBCeXRlcyB0aGF0IGZvcm0gdGhlIE1JREkgdGltZSB2YWx1ZVxuICAgKi9cblxuXHR9LCB7XG5cdFx0a2V5OiAnbnVtYmVyVG9WYXJpYWJsZUxlbmd0aCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG51bWJlclRvVmFyaWFibGVMZW5ndGgodGlja3MpIHtcblx0XHRcdHZhciBidWZmZXIgPSB0aWNrcyAmIDB4N0Y7XG5cblx0XHRcdHdoaWxlICh0aWNrcyA9IHRpY2tzID4+IDcpIHtcblx0XHRcdFx0YnVmZmVyIDw8PSA4O1xuXHRcdFx0XHRidWZmZXIgfD0gdGlja3MgJiAweDdGIHwgMHg4MDtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGJMaXN0ID0gW107XG5cdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHRiTGlzdC5wdXNoKGJ1ZmZlciAmIDB4ZmYpO1xuXG5cdFx0XHRcdGlmIChidWZmZXIgJiAweDgwKSBidWZmZXIgPj49IDg7ZWxzZSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJMaXN0O1xuXHRcdH1cblxuXHRcdC8qKlxuICAgKiBDb3VudHMgbnVtYmVyIG9mIGJ5dGVzIGluIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc1xuICAgKiBAcmV0dXJuIHthcnJheX1cbiAgICovXG5cblx0fSwge1xuXHRcdGtleTogJ3N0cmluZ0J5dGVDb3VudCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHN0cmluZ0J5dGVDb3VudChzKSB7XG5cdFx0XHRyZXR1cm4gZW5jb2RlVVJJKHMpLnNwbGl0KC8lLi58Li8pLmxlbmd0aCAtIDE7XG5cdFx0fVxuXG5cdFx0LyoqXG4gICAqIEdldCBhbiBpbnQgZnJvbSBhbiBhcnJheSBvZiBieXRlcy5cbiAgICogQHBhcmFtIHthcnJheX0gYnl0ZXNcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cblxuXHR9LCB7XG5cdFx0a2V5OiAnbnVtYmVyRnJvbUJ5dGVzJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gbnVtYmVyRnJvbUJ5dGVzKGJ5dGVzKSB7XG5cdFx0XHR2YXIgaGV4ID0gJyc7XG5cdFx0XHR2YXIgc3RyaW5nUmVzdWx0O1xuXG5cdFx0XHRieXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChieXRlKSB7XG5cdFx0XHRcdHN0cmluZ1Jlc3VsdCA9IGJ5dGUudG9TdHJpbmcoMTYpO1xuXG5cdFx0XHRcdC8vIGVuc3VyZSBzdHJpbmcgaXMgMiBjaGFyc1xuXHRcdFx0XHRpZiAoc3RyaW5nUmVzdWx0Lmxlbmd0aCA9PSAxKSBzdHJpbmdSZXN1bHQgPSBcIjBcIiArIHN0cmluZ1Jlc3VsdDtcblxuXHRcdFx0XHRoZXggKz0gc3RyaW5nUmVzdWx0O1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogVGFrZXMgYSBudW1iZXIgYW5kIHNwbGl0cyBpdCB1cCBpbnRvIGFuIGFycmF5IG9mIGJ5dGVzLiAgQ2FuIGJlIHBhZGRlZCBieSBwYXNzaW5nIGEgbnVtYmVyIHRvIGJ5dGVzTmVlZGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJcbiAgICogQHBhcmFtIHtudW1iZXJ9IGJ5dGVzTmVlZGVkXG4gICAqIEByZXR1cm4ge2FycmF5fSAtIEFycmF5IG9mIGJ5dGVzXG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdudW1iZXJUb0J5dGVzJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gbnVtYmVyVG9CeXRlcyhudW1iZXIsIGJ5dGVzTmVlZGVkKSB7XG5cdFx0XHRieXRlc05lZWRlZCA9IGJ5dGVzTmVlZGVkIHx8IDE7XG5cblx0XHRcdHZhciBoZXhTdHJpbmcgPSBudW1iZXIudG9TdHJpbmcoMTYpO1xuXG5cdFx0XHRpZiAoaGV4U3RyaW5nLmxlbmd0aCAmIDEpIHtcblx0XHRcdFx0Ly8gTWFrZSBzdXJlIGhleCBzdHJpbmcgaXMgZXZlbiBudW1iZXIgb2YgY2hhcnNcblx0XHRcdFx0aGV4U3RyaW5nID0gJzAnICsgaGV4U3RyaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTcGxpdCBoZXggc3RyaW5nIGludG8gYW4gYXJyYXkgb2YgdHdvIGNoYXIgZWxlbWVudHNcblx0XHRcdHZhciBoZXhBcnJheSA9IGhleFN0cmluZy5tYXRjaCgvLnsyfS9nKTtcblxuXHRcdFx0Ly8gTm93IHBhcnNlIHRoZW0gb3V0IGFzIGludGVnZXJzXG5cdFx0XHRoZXhBcnJheSA9IGhleEFycmF5Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuXHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoaXRlbSwgMTYpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFByZXBlbmQgZW1wdHkgYnl0ZXMgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2hcblx0XHRcdGlmIChoZXhBcnJheS5sZW5ndGggPCBieXRlc05lZWRlZCkge1xuXHRcdFx0XHR3aGlsZSAoYnl0ZXNOZWVkZWQgLSBoZXhBcnJheS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0aGV4QXJyYXkudW5zaGlmdCgwKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaGV4QXJyYXk7XG5cdFx0fVxuXG5cdFx0LyoqXHRcbiAgICogQ29udmVydHMgdmFsdWUgdG8gYXJyYXkgaWYgbmVlZGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICogQHJldHVybiB7YXJyYXl9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICd0b0FycmF5Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSkge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG5cdFx0XHRyZXR1cm4gW3ZhbHVlXTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gVXRpbHM7XG59KCk7XG5cbmV4cG9ydHMuVXRpbHMgPSBVdGlscztcblxudmFyIFZleEZsb3cgPSBmdW5jdGlvbiAoKSB7XG5cdGZ1bmN0aW9uIFZleEZsb3coKSB7XG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZleEZsb3cpO1xuXHR9XG5cdC8vIGNvZGUuLi5cblxuXG5cdC8qKlxuICAqIFN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgVmV4RmxvdyB2b2ljZSBpbnRvIE1pZGlXcml0ZXJKUyB0cmFja1xuICAqIEByZXR1cm4gTWlkaVdyaXRpZXIuVHJhY2sgb2JqZWN0XG4gICovXG5cblxuXHRfY3JlYXRlQ2xhc3MoVmV4RmxvdywgW3tcblx0XHRrZXk6ICd0cmFja0Zyb21Wb2ljZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHRyYWNrRnJvbVZvaWNlKHZvaWNlKSB7XG5cdFx0XHR2YXIgdHJhY2sgPSBuZXcgVHJhY2soKTtcblx0XHRcdHZhciB3YWl0O1xuXHRcdFx0dmFyIHBpdGNoZXMgPSBbXTtcblxuXHRcdFx0dm9pY2UudGlja2FibGVzLmZvckVhY2goZnVuY3Rpb24gKHRpY2thYmxlKSB7XG5cdFx0XHRcdHBpdGNoZXMgPSBbXTtcblxuXHRcdFx0XHRpZiAodGlja2FibGUubm90ZVR5cGUgPT09ICduJykge1xuXHRcdFx0XHRcdHRpY2thYmxlLmtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0XHQvLyBidWlsZCBhcnJheSBvZiBwaXRjaGVzXG5cdFx0XHRcdFx0XHRwaXRjaGVzLnB1c2godGhpcy5jb252ZXJ0UGl0Y2goa2V5KSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGlja2FibGUubm90ZVR5cGUgPT09ICdyJykge1xuXHRcdFx0XHRcdC8vIG1vdmUgb24gdG8gdGhlIG5leHQgdGlja2FibGUgYW5kIHVzZSB0aGlzIHJlc3QgYXMgYSBgd2FpdGAgcHJvcGVydHkgZm9yIHRoZSBuZXh0IGV2ZW50XG5cdFx0XHRcdFx0d2FpdCA9IHRoaXMuY29udmVydER1cmF0aW9uKHRpY2thYmxlKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cmFjay5hZGRFdmVudChuZXcgTm90ZUV2ZW50KHsgcGl0Y2g6IHBpdGNoZXMsIGR1cmF0aW9uOiB0aGlzLmNvbnZlcnREdXJhdGlvbih0aWNrYWJsZSksIHdhaXQ6IHdhaXQgfSkpO1xuXG5cdFx0XHRcdC8vIHJlc2V0IHdhaXRcblx0XHRcdFx0d2FpdCA9IDA7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHRyYWNrO1xuXHRcdH1cblxuXHRcdC8qKlxuICAgKiBDb252ZXJ0cyBWZXhGbG93IHBpdGNoIHN5bnRheCB0byBNaWRpV3JpdGVySlMgc3ludGF4XG4gICAqIEBwYXJhbSBwaXRjaCBzdHJpbmdcbiAgICovXG5cblx0fSwge1xuXHRcdGtleTogJ2NvbnZlcnRQaXRjaCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGNvbnZlcnRQaXRjaChwaXRjaCkge1xuXHRcdFx0cmV0dXJuIHBpdGNoLnJlcGxhY2UoJy8nLCAnJyk7XG5cdFx0fVxuXG5cdFx0LyoqXG4gICAqIENvbnZlcnRzIFZleEZsb3cgZHVyYXRpb24gc3ludGF4IHRvIE1pZGlXcml0ZXJKUyBzeW50YXhcbiAgICogQHBhcmFtIG5vdGUgc3RydWN0IGZyb20gVmV4Rmxvd1xuICAgKi9cblxuXHR9LCB7XG5cdFx0a2V5OiAnY29udmVydER1cmF0aW9uJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gY29udmVydER1cmF0aW9uKG5vdGUpIHtcblx0XHRcdHN3aXRjaCAobm90ZS5kdXJhdGlvbikge1xuXHRcdFx0XHRjYXNlICd3Jzpcblx0XHRcdFx0XHRyZXR1cm4gJzEnO1xuXHRcdFx0XHRjYXNlICdoJzpcblx0XHRcdFx0XHRyZXR1cm4gbm90ZS5pc0RvdHRlZCgpID8gJ2QyJyA6ICcyJztcblx0XHRcdFx0Y2FzZSAncSc6XG5cdFx0XHRcdFx0cmV0dXJuIG5vdGUuaXNEb3R0ZWQoKSA/ICdkNCcgOiAnNCc7XG5cdFx0XHRcdGNhc2UgJzgnOlxuXHRcdFx0XHRcdHJldHVybiBub3RlLmlzRG90dGVkKCkgPyAnZDgnIDogJzgnO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbm90ZS5kdXJhdGlvbjtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gVmV4Rmxvdztcbn0oKTtcblxuZXhwb3J0cy5WZXhGbG93ID0gVmV4Rmxvdztcbi8qKlxuICogT2JqZWN0IHRoYXQgcHV0cyB0b2dldGhlciB0cmFja3MgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGZpbGUgb3V0cHV0LlxuICogQHBhcmFtIHthcnJheX0gdHJhY2tzIC0gQW4gYXJyYXkgb2Yge1RyYWNrfSBvYmplY3RzLlxuICogQHJldHVybiB7V3JpdGVyfVxuICovXG5cbnZhciBXcml0ZXIgPSBmdW5jdGlvbiAoKSB7XG5cdGZ1bmN0aW9uIFdyaXRlcih0cmFja3MpIHtcblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgV3JpdGVyKTtcblxuXHRcdHRoaXMuZGF0YSA9IFtdO1xuXG5cdFx0dmFyIHRyYWNrVHlwZSA9IHRyYWNrcy5sZW5ndGggPiAxID8gQ29uc3RhbnRzLkhFQURFUl9DSFVOS19GT1JNQVQxIDogQ29uc3RhbnRzLkhFQURFUl9DSFVOS19GT1JNQVQwO1xuXHRcdHZhciBudW1iZXJPZlRyYWNrcyA9IFV0aWxzLm51bWJlclRvQnl0ZXModHJhY2tzLmxlbmd0aCwgMik7IC8vIHR3byBieXRlcyBsb25nXG5cblx0XHQvLyBIZWFkZXIgY2h1bmtcblx0XHR0aGlzLmRhdGEucHVzaChuZXcgQ2h1bmsoe1xuXHRcdFx0dHlwZTogQ29uc3RhbnRzLkhFQURFUl9DSFVOS19UWVBFLFxuXHRcdFx0ZGF0YTogdHJhY2tUeXBlLmNvbmNhdChudW1iZXJPZlRyYWNrcywgQ29uc3RhbnRzLkhFQURFUl9DSFVOS19ESVZJU0lPTikgfSkpO1xuXG5cdFx0Ly8gVHJhY2sgY2h1bmtzXG5cdFx0dHJhY2tzLmZvckVhY2goZnVuY3Rpb24gKHRyYWNrLCBpKSB7XG5cdFx0XHR0cmFjay5hZGRFdmVudChuZXcgTWV0YUV2ZW50KHsgZGF0YTogQ29uc3RhbnRzLk1FVEFfRU5EX09GX1RSQUNLX0lEIH0pKTtcblx0XHRcdHRoaXMuZGF0YS5wdXNoKHRyYWNrKTtcblx0XHR9LCB0aGlzKTtcblx0fVxuXG5cdC8qKlxuICAqIEJ1aWxkcyB0aGUgZmlsZSBpbnRvIGEgVWludDhBcnJheVxuICAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9XG4gICovXG5cblxuXHRfY3JlYXRlQ2xhc3MoV3JpdGVyLCBbe1xuXHRcdGtleTogJ2J1aWxkRmlsZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGJ1aWxkRmlsZSgpIHtcblx0XHRcdHZhciBidWlsZCA9IFtdO1xuXG5cdFx0XHQvLyBEYXRhIGNvbnNpc3RzIG9mIGNodW5rcyB3aGljaCBjb25zaXN0cyBvZiBkYXRhXG5cdFx0XHR0aGlzLmRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuXHRcdFx0XHRyZXR1cm4gYnVpbGQgPSBidWlsZC5jb25jYXQoZC50eXBlLCBkLnNpemUsIGQuZGF0YSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1aWxkKTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogQ29udmVydCBmaWxlIGJ1ZmZlciB0byBhIGJhc2U2NCBzdHJpbmcuICBEaWZmZXJlbnQgbWV0aG9kcyBkZXBlbmRpbmcgb24gaWYgYnJvd3NlciBvciBub2RlLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdiYXNlNjQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBiYXNlNjQoKSB7XG5cdFx0XHRpZiAodHlwZW9mIGJ0b2EgPT09ICdmdW5jdGlvbicpIHJldHVybiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdGhpcy5idWlsZEZpbGUoKSkpO1xuXHRcdFx0cmV0dXJuIG5ldyBCdWZmZXIodGhpcy5idWlsZEZpbGUoKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXHRcdH1cblxuXHRcdC8qKlxuICAgKiBHZXQgdGhlIGRhdGEgVVJJLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdkYXRhVXJpJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZGF0YVVyaSgpIHtcblx0XHRcdHJldHVybiAnZGF0YTphdWRpby9taWRpO2Jhc2U2NCwnICsgdGhpcy5iYXNlNjQoKTtcblx0XHR9XG5cblx0XHQvKipcbiAgICogT3V0cHV0IHRvIHN0ZG91dFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG5cdH0sIHtcblx0XHRrZXk6ICdzdGRvdXQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBzdGRvdXQoKSB7XG5cdFx0XHRyZXR1cm4gcHJvY2Vzcy5zdGRvdXQud3JpdGUobmV3IEJ1ZmZlcih0aGlzLmJ1aWxkRmlsZSgpKSk7XG5cdFx0fVxuXG5cdFx0LyoqXG4gICAqIFNhdmUgdG8gTUlESSBmaWxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKi9cblxuXHR9LCB7XG5cdFx0a2V5OiAnc2F2ZU1JREknLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBzYXZlTUlESShmaWxlbmFtZSkge1xuXHRcdFx0dmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5idWlsZEZpbGUoKSk7XG5cdFx0XHRmcy53cml0ZUZpbGUoZmlsZW5hbWUgKyAnLm1pZCcsIGJ1ZmZlciwgZnVuY3Rpb24gKGVycikge1xuXHRcdFx0XHRpZiAoZXJyKSByZXR1cm4gY29uc29sZS5sb2coZXJyKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fV0pO1xuXG5cdHJldHVybiBXcml0ZXI7XG59KCk7XG5cbmV4cG9ydHMuV3JpdGVyID0gV3JpdGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW1sdVpHVjRMbXB6SWwwc0ltNWhiV1Z6SWpwYklrTm9kVzVySWl3aVptbGxiR1J6SWl3aWRIbHdaU0lzSW1SaGRHRWlMQ0p6YVhwbElpd2liR1Z1WjNSb0lpd2lRMjl1YzNSaGJuUnpJaXdpVmtWU1UwbFBUaUlzSWtoRlFVUkZVbDlEU0ZWT1MxOVVXVkJGSWl3aVNFVkJSRVZTWDBOSVZVNUxYMHhGVGtkVVNDSXNJa2hGUVVSRlVsOURTRlZPUzE5R1QxSk5RVlF3SWl3aVNFVkJSRVZTWDBOSVZVNUxYMFpQVWsxQlZERWlMQ0pJUlVGRVJWSmZRMGhWVGt0ZlJFbFdTVk5KVDA0aUxDSlVVa0ZEUzE5RFNGVk9TMTlVV1ZCRklpd2lUVVZVUVY5RlZrVk9WRjlKUkNJc0lrMUZWRUZmVkVWWVZGOUpSQ0lzSWsxRlZFRmZRMDlRV1ZKSlIwaFVYMGxFSWl3aVRVVlVRVjlVVWtGRFMxOU9RVTFGWDBsRUlpd2lUVVZVUVY5SlRsTlVVbFZOUlU1VVgwNUJUVVZmU1VRaUxDSk5SVlJCWDB4WlVrbERYMGxFSWl3aVRVVlVRVjlOUVZKTFJWSmZTVVFpTENKTlJWUkJYME5WUlY5UVQwbE9WQ0lzSWsxRlZFRmZWRVZOVUU5ZlNVUWlMQ0pOUlZSQlgxTk5WRkJGWDA5R1JsTkZWQ0lzSWsxRlZFRmZWRWxOUlY5VFNVZE9RVlJWVWtWZlNVUWlMQ0pOUlZSQlgwdEZXVjlUU1VkT1FWUlZVa1ZmU1VRaUxDSk5SVlJCWDBWT1JGOVBSbDlVVWtGRFMxOUpSQ0lzSWtOUFRsUlNUMHhNUlZKZlEwaEJUa2RGWDFOVVFWUlZVeUlzSWxCU1QwZFNRVTFmUTBoQlRrZEZYMU5VUVZSVlV5SXNJa052Ym5SeWIyeHNaWEpEYUdGdVoyVkZkbVZ1ZENJc0lsVjBhV3h6SWl3aWJuVnRZbVZ5Vkc5V1lYSnBZV0pzWlV4bGJtZDBhQ0lzSW1OdmJtTmhkQ0lzSW1OdmJuUnliMnhzWlhKT2RXMWlaWElpTENKamIyNTBjbTlzYkdWeVZtRnNkV1VpTENKTlpYUmhSWFpsYm5RaUxDSk9iM1JsUlhabGJuUWlMQ0p3YVhSamFDSXNJblJ2UVhKeVlYa2lMQ0ozWVdsMElpd2laSFZ5WVhScGIyNGlMQ0p6WlhGMVpXNTBhV0ZzSWl3aWRtVnNiMk5wZEhraUxDSmphR0Z1Ym1Wc0lpd2ljbVZ3WldGMElpd2lZMjl1ZG1WeWRGWmxiRzlqYVhSNUlpd2laM0poWTJVaUxDSmlkV2xzWkVSaGRHRWlMQ0owYVdOclJIVnlZWFJwYjI0aUxDSm5aWFJVYVdOclJIVnlZWFJwYjI0aUxDSnlaWE4wUkhWeVlYUnBiMjRpTENKbmNtRmpaVVIxY21GMGFXOXVJaXdpWm05eVJXRmphQ0lzSW01dmRHVkZkbVZ1ZENJc0ltNXZkR1ZQYmlJc0ltNXZkR1ZQWm1ZaUxDSkJjbkpoZVNJc0ltbHpRWEp5WVhraUxDSnFJaXdpY0NJc0lta2lMQ0pPYjNSbFQyNUZkbVZ1ZENJc0ltZGxkRTV2ZEdWUGJsTjBZWFIxY3lJc0ltZGxkRkJwZEdOb0lpd2lUbTkwWlU5bVprVjJaVzUwSWl3aVoyVjBUbTkwWlU5bVpsTjBZWFIxY3lJc0luRjFZWEowWlhKVWFXTnJjeUlzSW01MWJXSmxja1p5YjIxQ2VYUmxjeUlzSWsxaGRHZ2lMQ0p5YjNWdVpDSXNJbTFoY0NJc0luWmhiSFZsSWl3aWNtVmtkV05sSWl3aVlTSXNJbUlpTENKMGIxTjBjbWx1WnlJc0luUnZURzkzWlhKRFlYTmxJaXdpWTJoaGNrRjBJaXdpY0dGeWMyVkpiblFpTENKemRXSnpkSEpwYm1jaUxDSm5aWFJFZFhKaGRHbHZiazExYkhScGNHeHBaWElpTENKUWNtOW5jbUZ0UTJoaGJtZGxSWFpsYm5RaUxDSnBibk4wY25WdFpXNTBJaXdpVkhKaFkyc2lMQ0psZG1WdWRITWlMQ0psZG1WdWRDSXNJbTFoY0VaMWJtTjBhVzl1SWl3aVpTSXNJbkJ5YjNCbGNuUnBaWE1pTENKdWRXMWlaWEpVYjBKNWRHVnpJaXdpY0hWemFDSXNJbUp3YlNJc0luUmxiWEJ2SWl3aVlXUmtSWFpsYm5RaUxDSnVkVzFsY21GMGIzSWlMQ0prWlc1dmJXbHVZWFJ2Y2lJc0ltMXBaR2xqYkc5amEzTndaWEowYVdOcklpd2libTkwWlhOd1pYSnRhV1JwWTJ4dlkyc2lMQ0pmWkdWdWIyMXBibUYwYjNJaUxDSnNiMmN5SWl3aWMyWWlMQ0p0YVNJc0ltMXZaR1VpTENKbWFXWjBhSE1pTENKZmMyWnNaVzRpTENKdWIzUmxJaXdpZEc5VmNIQmxja05oYzJVaUxDSm1hV1owYUdsdVpHVjRJaXdpYVc1a1pYaFBaaUlzSW5SbGVIUWlMQ0p6ZEhKcGJtZENlWFJsY3lJc0luTjBjbWx1WjFSdlFubDBaWE1pTENKc2VYSnBZeUlzSW5OMGNtbHVaeUlzSW5Od2JHbDBJaXdpWTJoaGNpSXNJbU5vWVhKRGIyUmxRWFFpTENKdUlpd2lhWE5PWVU0aUxDSndZWEp6WlVac2IyRjBJaXdpYVhOR2FXNXBkR1VpTENKMGFXTnJjeUlzSW1KMVptWmxjaUlzSW1KTWFYTjBJaXdpY3lJc0ltVnVZMjlrWlZWU1NTSXNJbUo1ZEdWeklpd2lhR1Y0SWl3aWMzUnlhVzVuVW1WemRXeDBJaXdpWW5sMFpTSXNJbTUxYldKbGNpSXNJbUo1ZEdWelRtVmxaR1ZrSWl3aWFHVjRVM1J5YVc1bklpd2lhR1Y0UVhKeVlYa2lMQ0p0WVhSamFDSXNJbWwwWlcwaUxDSjFibk5vYVdaMElpd2lWbVY0Um14dmR5SXNJblp2YVdObElpd2lkSEpoWTJzaUxDSndhWFJqYUdWeklpd2lkR2xqYTJGaWJHVnpJaXdpZEdsamEyRmliR1VpTENKdWIzUmxWSGx3WlNJc0ltdGxlWE1pTENKclpYa2lMQ0pqYjI1MlpYSjBVR2wwWTJnaUxDSmpiMjUyWlhKMFJIVnlZWFJwYjI0aUxDSnlaWEJzWVdObElpd2lhWE5FYjNSMFpXUWlMQ0pYY21sMFpYSWlMQ0owY21GamEzTWlMQ0owY21GamExUjVjR1VpTENKdWRXMWlaWEpQWmxSeVlXTnJjeUlzSW1KMWFXeGtJaXdpWkNJc0lsVnBiblE0UVhKeVlYa2lMQ0ppZEc5aElpd2lVM1J5YVc1bklpd2labkp2YlVOb1lYSkRiMlJsSWl3aVlYQndiSGtpTENKaWRXbHNaRVpwYkdVaUxDSkNkV1ptWlhJaUxDSmlZWE5sTmpRaUxDSndjbTlqWlhOeklpd2ljM1JrYjNWMElpd2lkM0pwZEdVaUxDSm1hV3hsYm1GdFpTSXNJbVp6SWl3aWQzSnBkR1ZHYVd4bElpd2laWEp5SWl3aVkyOXVjMjlzWlNJc0lteHZaeUpkTENKdFlYQndhVzVuY3lJNklqczdPenM3T3pzN096czdRVUZ6YTBKQk96czdPMEZCZEd0Q1FUczdPenM3U1VGTFRVRXNTeXhIUVVOTUxHVkJRVmxETEUxQlFWb3NSVUZCYjBJN1FVRkJRVHM3UVVGRGJrSXNUVUZCUzBNc1NVRkJUQ3hIUVVGWlJDeFBRVUZQUXl4SlFVRnVRanRCUVVOQkxFMUJRVXRETEVsQlFVd3NSMEZCV1VZc1QwRkJUMFVzU1VGQmJrSTdRVUZEUVN4TlFVRkxReXhKUVVGTUxFZEJRVmtzUTBGQlF5eERRVUZFTEVWQlFVa3NRMEZCU2l4RlFVRlBMRU5CUVZBc1JVRkJWVWdzVDBGQlQwVXNTVUZCVUN4RFFVRlpSU3hOUVVGMFFpeERRVUZhTzBGQlEwRXNRenM3VVVGSFRVd3NTeXhIUVVGQlFTeExPMEZCUTFJN096czdPMEZCUzBFc1NVRkJTVTBzV1VGQldUdEJRVU5tUXl4VlFVRmpMRTlCUkVNN1FVRkZaa01zYjBKQlFYVkNMRU5CUVVNc1NVRkJSQ3hGUVVGUExFbEJRVkFzUlVGQllTeEpRVUZpTEVWQlFXMUNMRWxCUVc1Q0xFTkJSbElzUlVGRmEwTTdRVUZEYWtSRExITkNRVUYzUWl4RFFVRkRMRWxCUVVRc1JVRkJUeXhKUVVGUUxFVkJRV0VzU1VGQllpeEZRVUZ0UWl4SlFVRnVRaXhEUVVoVUxFVkJSMjFETzBGQlEyeEVReXgxUWtGQk1FSXNRMEZCUXl4SlFVRkVMRVZCUVU4c1NVRkJVQ3hEUVVwWUxFVkJTWGxDTzBGQlEzaERReXgxUWtGQk1FSXNRMEZCUXl4SlFVRkVMRVZCUVU4c1NVRkJVQ3hEUVV4WUxFVkJTM2xDTzBGQlEzaERReXgzUWtGQk1FSXNRMEZCUXl4SlFVRkVMRVZCUVU4c1NVRkJVQ3hEUVU1WUxFVkJUWGxDTzBGQlEzaERReXh0UWtGQmIwSXNRMEZCUXl4SlFVRkVMRVZCUVU4c1NVRkJVQ3hGUVVGaExFbEJRV0lzUlVGQmJVSXNTVUZCYmtJc1EwRlFUQ3hGUVU4clFqdEJRVU01UTBNc1owSkJRV3RDTEVsQlVrZzdRVUZUWmtNc1pVRkJhVUlzU1VGVVJqdEJRVlZtUXl4dlFrRkJjVUlzU1VGV1RqdEJRVmRtUXl4eFFrRkJjMElzU1VGWVVEdEJRVmxtUXl3d1FrRkJNRUlzU1VGYVdEdEJRV0ZtUXl4blFrRkJhMElzU1VGaVNEdEJRV05tUXl4cFFrRkJiVUlzU1VGa1NqdEJRV1ZtUXl4cFFrRkJiVUlzU1VGbVNqdEJRV2RDWmtNc1owSkJRV3RDTEVsQmFFSklPMEZCYVVKbVF5eHZRa0ZCY1VJc1NVRnFRazQ3UVVGclFtWkRMSGxDUVVGNVFpeEpRV3hDVmp0QlFXMUNaa01zZDBKQlFYZENMRWxCYmtKVU8wRkJiMEptUXl4MVFrRkJkVUlzUTBGQlF5eEpRVUZFTEVWQlFVOHNTVUZCVUN4RFFYQkNVanRCUVhGQ1prTXNNa0pCUVRCQ0xFbEJja0pZTEVWQmNVSnBRanRCUVVOb1EwTXNkMEpCUVhkQ0xFbEJkRUpVTEVOQmMwSmxPMEZCZEVKbUxFTkJRV2hDT3p0UlFYbENVWFJDTEZNc1IwRkJRVUVzVXp0QlFVTlNPenM3T3pzN1NVRkxUWFZDTEhGQ0xFZEJRMHdzSzBKQlFWazFRaXhOUVVGYUxFVkJRVzlDTzBGQlFVRTdPMEZCUTI1Q0xFMUJRVXRETEVsQlFVd3NSMEZCV1N4WlFVRmFPMEZCUTBFN1FVRkRRU3hOUVVGTFF5eEpRVUZNTEVkQlFWa3lRaXhOUVVGTlF5eHpRa0ZCVGl4RFFVRTJRaXhKUVVFM1FpeEZRVUZ0UTBNc1RVRkJia01zUTBGQk1FTXhRaXhWUVVGVmNVSXNkMEpCUVhCRUxFVkJRVGhGTVVJc1QwRkJUMmRETEdkQ1FVRnlSaXhGUVVGMVIyaERMRTlCUVU5cFF5eGxRVUU1Unl4RFFVRmFPMEZCUTBFc1F6czdVVUZIVFV3c2NVSXNSMEZCUVVFc2NVSTdRVUZEVWpzN096czdPMGxCUzAxTkxGTXNSMEZEVEN4dFFrRkJXV3hETEUxQlFWb3NSVUZCYjBJN1FVRkJRVHM3UVVGRGJrSXNUVUZCUzBNc1NVRkJUQ3hIUVVGWkxFMUJRVm83UVVGRFFTeE5RVUZMUXl4SlFVRk1MRWRCUVZreVFpeE5RVUZOUXl4elFrRkJUaXhEUVVFMlFpeEpRVUUzUWl4RFFVRmFMRU5CUm0xQ0xFTkJSVFJDTzBGQlF5OURMRTFCUVVzMVFpeEpRVUZNTEVkQlFWa3NTMEZCUzBFc1NVRkJUQ3hEUVVGVk5rSXNUVUZCVml4RFFVRnBRakZDTEZWQlFWVlJMR0ZCUVROQ0xFVkJRVEJEWWl4UFFVRlBSU3hKUVVGcVJDeERRVUZhTzBGQlEwRXNRenM3VVVGSFRXZERMRk1zUjBGQlFVRXNVenRCUVVOU096czdPenM3U1VGTFRVTXNVenRCUVVOTUxHOUNRVUZaYmtNc1RVRkJXaXhGUVVGdlFqdEJRVUZCT3p0QlFVTnVRaXhQUVVGTFF5eEpRVUZNTEVkQlFXTXNUVUZCWkR0QlFVTkJMRTlCUVV0dFF5eExRVUZNTEVkQlFXVlFMRTFCUVUxUkxFOUJRVTRzUTBGQlkzSkRMRTlCUVU5dlF5eExRVUZ5UWl4RFFVRm1PMEZCUTBFc1QwRkJTMFVzU1VGQlRDeEhRVUZqZEVNc1QwRkJUM05ETEVsQlFWQXNTVUZCWlN4RFFVRTNRanRCUVVOQkxFOUJRVXRETEZGQlFVd3NSMEZCYVVKMlF5eFBRVUZQZFVNc1VVRkJlRUk3UVVGRFFTeFBRVUZMUXl4VlFVRk1MRWRCUVd0Q2VFTXNUMEZCVDNkRExGVkJRVkFzU1VGQmNVSXNTMEZCZGtNN1FVRkRRU3hQUVVGTFF5eFJRVUZNTEVkQlFXbENla01zVDBGQlQzbERMRkZCUVZBc1NVRkJiVUlzUlVGQmNFTTdRVUZEUVN4UFFVRkxReXhQUVVGTUxFZEJRV2RDTVVNc1QwRkJUekJETEU5QlFWQXNTVUZCYTBJc1EwRkJiRU03UVVGRFFTeFBRVUZMUXl4TlFVRk1MRWRCUVdVelF5eFBRVUZQTWtNc1RVRkJVQ3hKUVVGcFFpeERRVUZvUXp0QlFVTkJMRTlCUVV0R0xGRkJRVXdzUjBGQmFVSXNTMEZCUzBjc1pVRkJUQ3hEUVVGeFFpeExRVUZMU0N4UlFVRXhRaXhEUVVGcVFqdEJRVU5CTEU5QlFVdEpMRXRCUVV3c1IwRkJZemRETEU5QlFVODJReXhMUVVGeVFqdEJRVU5CTEU5QlFVdERMRk5CUVV3N1FVRkRRVHM3UVVGRlJEczdPenM3T3pzN09FSkJTVms3UVVGRFdDeFJRVUZMTlVNc1NVRkJUQ3hIUVVGWkxFVkJRVm83TzBGQlJVRXNUMEZCU1RaRExHVkJRV1VzUzBGQlMwTXNaVUZCVEN4RFFVRnhRaXhMUVVGTFZDeFJRVUV4UWl4RlFVRnZReXhOUVVGd1F5eERRVUZ1UWp0QlFVTkJMRTlCUVVsVkxHVkJRV1VzUzBGQlMwUXNaVUZCVEN4RFFVRnhRaXhMUVVGTFZpeEpRVUV4UWl4RlFVRm5ReXhOUVVGb1F5eERRVUZ1UWpzN1FVRkZRVHRCUVVOQkxFOUJRVWtzUzBGQlMwOHNTMEZCVkN4RlFVRm5RanRCUVVObUxGRkJRVWxMTEdkQ1FVRm5RaXhEUVVGd1FqdEJRVU5CTEZOQlFVdE1MRXRCUVV3c1IwRkJZV2hDTEUxQlFVMVJMRTlCUVU0c1EwRkJZeXhMUVVGTFVTeExRVUZ1UWl4RFFVRmlPMEZCUTBFc1UwRkJTMEVzUzBGQlRDeERRVUZYVFN4UFFVRllMRU5CUVcxQ0xGVkJRVk5tTEV0QlFWUXNSVUZCWjBJN1FVRkRiRU1zVTBGQlNXZENMRmxCUVZrc1NVRkJTV3BDTEZOQlFVb3NRMEZCWXl4RlFVRkRReXhQUVVGTkxFdEJRVXRUTEV0QlFWb3NSVUZCYlVKT0xGVkJRVk1zVFVGQlRWY3NZVUZCYkVNc1JVRkJaQ3hEUVVGb1FqdEJRVU5CTEZWQlFVdG9SQ3hKUVVGTUxFZEJRVmtzUzBGQlMwRXNTVUZCVEN4RFFVRlZOa0lzVFVGQlZpeERRVUZwUW5GQ0xGVkJRVlZzUkN4SlFVRXpRaXhEUVVGYU96dEJRVVZCTmtNc2NVSkJRV2RDUnl4aFFVRm9RanRCUVVOQkxFdEJURVFzUlVGTFJ5eEpRVXhJTzBGQlRVRTdPMEZCUlVRN1FVRkRRVHRCUVVOQkxFOUJRVWxITEUxQlFVb3NSVUZCV1VNc1QwRkJXanRCUVVOQkxFOUJRVWxETEUxQlFVMURMRTlCUVU0c1EwRkJZeXhMUVVGTGNFSXNTMEZCYmtJc1EwRkJTaXhGUVVFclFqdEJRVU01UWp0QlFVTkJPMEZCUTBFc1VVRkJTeXhEUVVGRkxFdEJRVXRKTEZWQlFWb3NSVUZCZDBJN1FVRkRka0k3UVVGRFFTeFZRVUZMTEVsQlFVbHBRaXhKUVVGSkxFTkJRV0lzUlVGQlowSkJMRWxCUVVrc1MwRkJTMlFzVFVGQmVrSXNSVUZCYVVOakxFZEJRV3BETEVWQlFYTkRPMEZCUTNKRE8wRkJRMEVzVjBGQlMzSkNMRXRCUVV3c1EwRkJWMlVzVDBGQldDeERRVUZ0UWl4VlFVRlRUeXhEUVVGVUxFVkJRVmxETEVOQlFWb3NSVUZCWlR0QlFVTnFReXhYUVVGSlFTeExRVUZMTEVOQlFWUXNSVUZCV1R0QlFVTllUaXhwUWtGQlV5eEpRVUZKVHl4WFFVRktMRU5CUVdkQ0xFVkJRVU14UkN4TlFVRk5Na0lzVFVGQlRVTXNjMEpCUVU0c1EwRkJOa0p0UWl4WlFVRTNRaXhGUVVFeVEyeENMRTFCUVRORExFTkJRV3RFTEV0QlFVczRRaXhsUVVGTUxFVkJRV3hFTEVWQlFUQkZhRU1zVFVGQlRXbERMRkZCUVU0c1EwRkJaVW9zUTBGQlppeERRVUV4UlN4RlFVRTJSaXhMUVVGTGFrSXNVVUZCYkVjc1EwRkJVQ3hGUVVGb1FpeERRVUZVTzBGQlJVRXNVVUZJUkN4TlFVZFBPMEZCUTA0N1FVRkRRVmtzYVVKQlFWTXNTVUZCU1U4c1YwRkJTaXhEUVVGblFpeEZRVUZETVVRc1RVRkJUU3hEUVVGRExFTkJRVVFzUlVGQlNUSkNMRTFCUVUxcFF5eFJRVUZPTEVOQlFXVktMRU5CUVdZc1EwRkJTaXhGUVVGMVFpeExRVUZMYWtJc1VVRkJOVUlzUTBGQlVDeEZRVUZvUWl4RFFVRlVPMEZCUTBFN08wRkJSVVFzV1VGQlMzWkRMRWxCUVV3c1IwRkJXU3hMUVVGTFFTeEpRVUZNTEVOQlFWVTJRaXhOUVVGV0xFTkJRV2xDYzBJc1QwRkJUMjVFTEVsQlFYaENMRU5CUVZvN1FVRkRRU3hQUVZaRUxFVkJWVWNzU1VGV1NEczdRVUZaUVR0QlFVTkJMRmRCUVV0clF5eExRVUZNTEVOQlFWZGxMRTlCUVZnc1EwRkJiVUlzVlVGQlUwOHNRMEZCVkN4RlFVRlpReXhEUVVGYUxFVkJRV1U3UVVGRGFrTXNWMEZCU1VFc1MwRkJTeXhEUVVGVUxFVkJRVms3UVVGRFdFd3NhMEpCUVZVc1NVRkJTVk1zV1VGQlNpeERRVUZwUWl4RlFVRkROMFFzVFVGQlRUSkNMRTFCUVUxRExITkNRVUZPTEVOQlFUWkNhVUlzV1VGQk4wSXNSVUZCTWtOb1FpeE5RVUV6UXl4RFFVRnJSQ3hMUVVGTGFVTXNaMEpCUVV3c1JVRkJiRVFzUlVGQk1rVnVReXhOUVVGTmFVTXNVVUZCVGl4RFFVRmxTaXhEUVVGbUxFTkJRVE5GTEVWQlFUaEdMRXRCUVV0cVFpeFJRVUZ1Unl4RFFVRlFMRVZCUVdwQ0xFTkJRVlk3UVVGRlFTeFJRVWhFTEUxQlIwODdRVUZEVGp0QlFVTkJZU3hyUWtGQlZTeEpRVUZKVXl4WlFVRktMRU5CUVdsQ0xFVkJRVU0zUkN4TlFVRk5MRU5CUVVNc1EwRkJSQ3hGUVVGSk1rSXNUVUZCVFdsRExGRkJRVTRzUTBGQlpVb3NRMEZCWml4RFFVRktMRVZCUVhWQ0xFdEJRVXRxUWl4UlFVRTFRaXhEUVVGUUxFVkJRV3BDTEVOQlFWWTdRVUZEUVRzN1FVRkZSQ3haUVVGTGRrTXNTVUZCVEN4SFFVRlpMRXRCUVV0QkxFbEJRVXdzUTBGQlZUWkNMRTFCUVZZc1EwRkJhVUoxUWl4UlFVRlJjRVFzU1VGQmVrSXNRMEZCV2p0QlFVTkJMRTlCVmtRc1JVRlZSeXhKUVZaSU8wRkJWMEU3UVVGRlJDeExRVGxDUkN4TlFUaENUenRCUVVOT08wRkJRMEVzVlVGQlN5eEpRVUZKZFVRc1NVRkJTU3hEUVVGaUxFVkJRV2RDUVN4SlFVRkpMRXRCUVV0a0xFMUJRWHBDTEVWQlFXbERZeXhIUVVGcVF5eEZRVUZ6UXp0QlFVTnlReXhYUVVGTGNrSXNTMEZCVEN4RFFVRlhaU3hQUVVGWUxFTkJRVzFDTEZWQlFWTlBMRU5CUVZRc1JVRkJXVU1zUTBGQldpeEZRVUZsTzBGQlEycERPMEZCUTBFc1YwRkJTVUVzU1VGQlNTeERRVUZTTEVWQlFWYzdRVUZEVmxZc2RVSkJRV1VzUTBGQlpqdEJRVU5CT3p0QlFVVkVPMEZCUTBFN1FVRkRRU3hYUVVGSkxFdEJRVXRXTEZGQlFVd3NTMEZCYTBJc1NVRkJiRUlzU1VGQk1FSnZRaXhMUVVGTExFdEJRVXQyUWl4TFFVRk1MRU5CUVZkb1F5eE5RVUZZTEVkQlFXOUNMRU5CUVhaRUxFVkJRVEJFTzBGQlEzcEVMRmxCUVVrMlJDeGxRVUZsY0VNc1RVRkJUWEZETEdWQlFVNHNRMEZCYzBJM1JDeFZRVUZWVFN4eFFrRkJhRU1zUTBGQmJrSTdRVUZEUVc5RExIVkNRVUZsYTBJc1pVRkJaMEpzUWl4bFFVRmxMRU5CUVRsRE8wRkJRMEU3TzBGQlJVUk5MR2RDUVVGVExFbEJRVWxQTEZkQlFVb3NRMEZCWjBJc1JVRkJRekZFTEUxQlFVMHlRaXhOUVVGTlF5eHpRa0ZCVGl4RFFVRTJRbTFDTEZsQlFUZENMRVZCUVRKRGJFSXNUVUZCTTBNc1EwRkJhMFFzUTBGQlF5eExRVUZMT0VJc1pVRkJUQ3hGUVVGRUxFVkJRWGxDYUVNc1RVRkJUV2xETEZGQlFVNHNRMEZCWlVvc1EwRkJaaXhEUVVGNlFpeEZRVUUwUXl4TFFVRkxha0lzVVVGQmFrUXNRMEZCYkVRc1EwRkJVQ3hGUVVGb1FpeERRVUZVTzBGQlEwRmhMR2xDUVVGVkxFbEJRVWxUTEZsQlFVb3NRMEZCYVVJc1JVRkJRemRFTEUxQlFVMHlRaXhOUVVGTlF5eHpRa0ZCVGl4RFFVRTJRbWxDTEZsQlFUZENMRVZCUVRKRGFFSXNUVUZCTTBNc1EwRkJhMFFzUTBGQlF5eExRVUZMYVVNc1owSkJRVXdzUlVGQlJDeEZRVUV3UW01RExFMUJRVTFwUXl4UlFVRk9MRU5CUVdWS0xFTkJRV1lzUTBGQk1VSXNSVUZCTmtNc1MwRkJTMnBDTEZGQlFXeEVMRU5CUVd4RUxFTkJRVkFzUlVGQmFrSXNRMEZCVmpzN1FVRkZRU3haUVVGTGRrTXNTVUZCVEN4SFFVRlpMRXRCUVV0QkxFbEJRVXdzUTBGQlZUWkNMRTFCUVZZc1EwRkJhVUp6UWl4UFFVRlBia1FzU1VGQmVFSXNSVUZCT0VKdlJDeFJRVUZSY0VRc1NVRkJkRU1zUTBGQldqdEJRVU5CTEU5QmFrSkVMRVZCYVVKSExFbEJha0pJTzBGQmEwSkJPMEZCUTBRN08wRkJSVVFzVjBGQlR5eEpRVUZRTzBGQlEwRTdPMEZCUlVRc1UwRkJUU3g1UWtGQlRqdEJRVU5CT3pzN096dEJRVVZFT3pzN096dHJRMEZMWjBKMVF5eFJMRVZCUVZVN1FVRkRla0k3UVVGRFFVRXNZMEZCVjBFc1YwRkJWeXhIUVVGWUxFZEJRV2xDTEVkQlFXcENMRWRCUVhWQ1FTeFJRVUZzUXp0QlFVTkJMRlZCUVU4d1FpeExRVUZMUXl4TFFVRk1MRU5CUVZjelFpeFhRVUZYTEVkQlFWZ3NSMEZCYVVJc1IwRkJOVUlzUTBGQlVEdEJRVU5CT3pzN096dEJRVVZFT3pzN096czdPMnREUVU5blFrWXNVU3hGUVVGVmRFTXNTU3hGUVVGTk8wRkJReTlDTEU5QlFVbHpSQ3hOUVVGTlF5eFBRVUZPTEVOQlFXTnFRaXhSUVVGa0xFTkJRVW9zUlVGQk5rSTdRVUZETlVJN1FVRkRRU3hYUVVGUFFTeFRRVUZUT0VJc1IwRkJWQ3hEUVVGaExGVkJRVk5ETEV0QlFWUXNSVUZCWjBJN1FVRkRia01zV1VGQlR5eExRVUZMZEVJc1pVRkJUQ3hEUVVGeFFuTkNMRXRCUVhKQ0xFVkJRVFJDY2tVc1NVRkJOVUlzUTBGQlVEdEJRVU5CTEV0QlJrMHNSVUZGU2l4SlFVWkpMRVZCUlVWelJTeE5RVVpHTEVOQlJWTXNWVUZCVTBNc1EwRkJWQ3hGUVVGWlF5eERRVUZhTEVWQlFXVTdRVUZET1VJc1dVRkJUMFFzU1VGQlNVTXNRMEZCV0R0QlFVTkJMRXRCU2swc1JVRkpTaXhEUVVwSkxFTkJRVkE3UVVGTFFUczdRVUZGUkd4RExHTkJRVmRCTEZOQlFWTnRReXhSUVVGVUxFVkJRVmc3TzBGQlJVRXNUMEZCU1c1RExGTkJRVk52UXl4WFFVRlVMRWRCUVhWQ1F5eE5RVUYyUWl4RFFVRTRRaXhEUVVFNVFpeE5RVUZ4UXl4SFFVRjZReXhGUVVFNFF6dEJRVU0zUXp0QlFVTkJMRmRCUVU5RExGTkJRVk4wUXl4VFFVRlRkVU1zVTBGQlZDeERRVUZ0UWl4RFFVRnVRaXhEUVVGVUxFTkJRVkE3UVVGRFFUczdRVUZGUkR0QlFVTkJPMEZCUTBFc1QwRkJTV0lzWlVGQlpYQkRMRTFCUVUxeFF5eGxRVUZPTEVOQlFYTkNOMFFzVlVGQlZVMHNjVUpCUVdoRExFTkJRVzVDTzBGQlEwRXNWVUZCVDNkRUxFdEJRVXRETEV0QlFVd3NRMEZCVjBnc1pVRkJaU3hMUVVGTFl5eHhRa0ZCVEN4RFFVRXlRbmhETEZGQlFUTkNMRVZCUVhGRGRFTXNTVUZCY2tNc1EwRkJNVUlzUTBGQlVEdEJRVU5CT3p0QlFVVkVPenM3T3pzN096czdPM2REUVU5elFuTkRMRkVzUlVGQlZYUkRMRWtzUlVGQlRUdEJRVU55UXp0QlFVTkJMRmRCUVZGelF5eFJRVUZTTzBGQlEwTXNVMEZCU3l4SFFVRk1PMEZCUTBNc1dVRkJUeXhEUVVGUU8wRkJRMFFzVTBGQlN5eEhRVUZNTzBGQlEwTXNXVUZCVHl4RFFVRlFPMEZCUTBRc1UwRkJTeXhIUVVGTU8wRkJRME1zV1VGQlR5eERRVUZRTzBGQlEwUXNVMEZCU3l4SlFVRk1PMEZCUTBNc1dVRkJUeXhEUVVGUU8wRkJRMFFzVTBGQlN5eEhRVUZNTzBGQlEwTXNXVUZCVHl4RFFVRlFPMEZCUTBRc1UwRkJTeXhKUVVGTU8wRkJRME1zV1VGQlR5eExRVUZRTzBGQlEwUXNVMEZCU3l4SlFVRk1PMEZCUTBNc1dVRkJUeXhIUVVGUU8wRkJRMFFzVTBGQlN5eEhRVUZNTzBGQlEwTXNXVUZCVHl4SFFVRlFPMEZCUTBRc1UwRkJTeXhKUVVGTU8wRkJRME03UVVGRFFTeFpRVUZQTEVsQlFWQTdRVUZEUkN4VFFVRkxMRWxCUVV3N1FVRkRReXhaUVVGUExFbEJRVkE3UVVGRFJDeFRRVUZMTEVsQlFVdzdRVUZEUXl4WlFVRlBMRWxCUVZBN1FVRkRSQ3hUUVVGTExFdEJRVXc3UVVGRFF5eFpRVUZQTEV0QlFWQTdRVUZEUkN4VFFVRkxMRWxCUVV3N1FVRkRReXhaUVVGUExFdEJRVkE3UVVGRFJDeFRRVUZMTEVsQlFVdzdRVUZEUXl4WlFVRlBMRTFCUVZBN1FVRkRSRHRCUVVORE8wRkJRMEU3UVVGb1EwWTdPMEZCYlVOQkxGTkJRVTFCTEZkQlFWY3NNa0pCUVdwQ08wRkJRMEU3T3pzN08wRkJSVVE3T3pzN096dHZRMEZOYTBJN1FVRkJReXhWUVVGUExFMUJRVTBzUzBGQlMwY3NUMEZCV0N4SFFVRnhRaXhEUVVFMVFqdEJRVUU0UWpzN1FVRkZha1E3T3pzN096czdPenR4UTBGTmJVSTdRVUZCUXl4VlFVRlBMRTFCUVUwc1MwRkJTMEVzVDBGQldDeEhRVUZ4UWl4RFFVRTFRanRCUVVFNFFqczdPenM3TzFGQlJ6TkRVQ3hUTEVkQlFVRkJMRk03UVVGRFVqczdPenM3TzBsQlMwMDBRaXhaTEVkQlEwd3NjMEpCUVZrdlJDeE5RVUZhTEVWQlFXOUNPMEZCUVVFN08wRkJRMjVDTEUxQlFVdEZMRWxCUVV3c1IwRkJXVVlzVDBGQlQwVXNTVUZCYmtJN1FVRkRRU3hET3p0UlFVZE5Oa1FzV1N4SFFVRkJRU3haTzBGQlExSTdPenM3T3p0SlFVdE5TQ3hYTEVkQlEwd3NjVUpCUVZrMVJDeE5RVUZhTEVWQlFXOUNPMEZCUVVFN08wRkJRMjVDTEUxQlFVdEZMRWxCUVV3c1IwRkJXVVlzVDBGQlQwVXNTVUZCYmtJN1FVRkRRU3hET3p0UlFVZE5NRVFzVnl4SFFVRkJRU3hYTzBGQlExSTdPenM3T3p0SlFVdE5iMElzYTBJc1IwRkRUQ3cwUWtGQldXaEdMRTFCUVZvc1JVRkJiMEk3UVVGQlFUczdRVUZEYmtJc1RVRkJTME1zU1VGQlRDeEhRVUZaTEZOQlFWbzdRVUZEUVR0QlFVTkJMRTFCUVV0RExFbEJRVXdzUjBGQldUSkNMRTFCUVUxRExITkNRVUZPTEVOQlFUWkNMRWxCUVRkQ0xFVkJRVzFEUXl4TlFVRnVReXhEUVVFd1F6RkNMRlZCUVZWelFpeHhRa0ZCY0VRc1JVRkJNa1V6UWl4UFFVRlBhVVlzVlVGQmJFWXNRMEZCV2p0QlFVTkJMRU03TzFGQlIwMUVMR3RDTEVkQlFVRkJMR3RDTzBGQlExSTdPenM3T3p0SlFVdE5SU3hMTzBGQlEwd3NhMEpCUVdNN1FVRkJRVHM3UVVGRFlpeFBRVUZMYWtZc1NVRkJUQ3hIUVVGWlNTeFZRVUZWVHl4blFrRkJkRUk3UVVGRFFTeFBRVUZMVml4SlFVRk1MRWRCUVZrc1JVRkJXanRCUVVOQkxFOUJRVXRETEVsQlFVd3NSMEZCV1N4RlFVRmFPMEZCUTBFc1QwRkJTMmRHTEUxQlFVd3NSMEZCWXl4RlFVRmtPMEZCUTBFN08wRkJSVVE3T3pzN096czdPenM3TWtKQlRWTkRMRXNzUlVGQlQwTXNWeXhGUVVGaE8wRkJRelZDTEU5QlFVazVRaXhOUVVGTlF5eFBRVUZPTEVOQlFXTTBRaXhMUVVGa0xFTkJRVW9zUlVGQk1FSTdRVUZEZWtKQkxGVkJRVTFxUXl4UFFVRk9MRU5CUVdNc1ZVRkJVMjFETEVOQlFWUXNSVUZCV1ROQ0xFTkJRVm9zUlVGQlpUdEJRVU0xUWp0QlFVTkJMRk5CUVVrc1QwRkJUekJDTEZkQlFWQXNTMEZCZFVJc1ZVRkJka0lzU1VGQmNVTkRMRVZCUVVWeVJpeEpRVUZHTEV0QlFWY3NUVUZCY0VRc1JVRkJORVE3UVVGRE0wUXNWVUZCU1hOR0xHRkJRV0ZHTEZsQlFWa3hRaXhEUVVGYUxFVkJRV1V5UWl4RFFVRm1MRU5CUVdwQ096dEJRVVZCTEZWQlFVa3NVVUZCVDBNc1ZVRkJVQ3g1UTBGQlQwRXNWVUZCVUN4UFFVRnpRaXhSUVVFeFFpeEZRVUZ2UXp0QlFVTnVReXhaUVVGTExFbEJRVWs1UWl4RFFVRlVMRWxCUVdNNFFpeFZRVUZrTEVWQlFUQkNPMEZCUTNwQ0xHZENRVUZQT1VJc1EwRkJVRHRCUVVORExHTkJRVXNzVlVGQlREdEJRVU5ETmtJc1dVRkJSUzlETEZGQlFVWXNSMEZCWVdkRUxGZEJRVmM1UWl4RFFVRllMRU5CUVdJN1FVRkRRVHRCUVVORUxHTkJRVXNzV1VGQlREdEJRVU5ETmtJc1dVRkJSVGxETEZWQlFVWXNSMEZCWlN0RExGZEJRVmM1UWl4RFFVRllMRU5CUVdZN1FVRkRRVHRCUVVORUxHTkJRVXNzVlVGQlREdEJRVU5ETmtJc1dVRkJSVGRETEZGQlFVWXNSMEZCWVRaRExFVkJRVVV4UXl4bFFVRkdMRU5CUVd0Q01rTXNWMEZCVnpsQ0xFTkJRVmdzUTBGQmJFSXNRMEZCWWp0QlFVTkJPMEZCVkVZN1FVRlhRVHM3UVVGRlJEdEJRVU5CTmtJc1UwRkJSWGhETEZOQlFVWTdRVUZEUVR0QlFVTkVPenRCUVVWRUxGVkJRVXMxUXl4SlFVRk1MRWRCUVZrc1MwRkJTMEVzU1VGQlRDeERRVUZWTmtJc1RVRkJWaXhEUVVGcFFuVkVMRVZCUVVWd1JpeEpRVUZ1UWl4RFFVRmFPMEZCUTBFc1ZVRkJTME1zU1VGQlRDeEhRVUZaTUVJc1RVRkJUVEpFTEdGQlFVNHNRMEZCYjBJc1MwRkJTM1JHTEVsQlFVd3NRMEZCVlVVc1RVRkJPVUlzUlVGQmMwTXNRMEZCZEVNc1EwRkJXaXhEUVRGQ05FSXNRMEV3UWpCQ08wRkJRM1JFTEZWQlFVc3JSU3hOUVVGTUxFTkJRVmxOTEVsQlFWb3NRMEZCYVVKSUxFTkJRV3BDTzBGQlEwRXNTMEUxUWtRc1JVRTBRa2NzU1VFMVFrZzdRVUU0UWtFc1NVRXZRa1FzVFVFclFrODdRVUZEVGl4VFFVRkxjRVlzU1VGQlRDeEhRVUZaTEV0QlFVdEJMRWxCUVV3c1EwRkJWVFpDTEUxQlFWWXNRMEZCYVVKeFJDeE5RVUZOYkVZc1NVRkJka0lzUTBGQldqdEJRVU5CTEZOQlFVdERMRWxCUVV3c1IwRkJXVEJDTEUxQlFVMHlSQ3hoUVVGT0xFTkJRVzlDTEV0QlFVdDBSaXhKUVVGTUxFTkJRVlZGTEUxQlFUbENMRVZCUVhORExFTkJRWFJETEVOQlFWb3NRMEZHVFN4RFFVVm5SRHRCUVVOMFJDeFRRVUZMSzBVc1RVRkJUQ3hEUVVGWlRTeEpRVUZhTEVOQlFXbENUQ3hMUVVGcVFqdEJRVU5CT3p0QlFVVkVMRlZCUVU4c1NVRkJVRHRCUVVOQk96dEJRVVZFT3pzN096czdPenN5UWtGTFUwMHNSeXhGUVVGTE8wRkJRMklzVDBGQlNVNHNVVUZCVVN4SlFVRkpiRVFzVTBGQlNpeERRVUZqTEVWQlFVTm9ReXhOUVVGTkxFTkJRVU5ITEZWQlFWVm5RaXhoUVVGWUxFTkJRVkFzUlVGQlpDeERRVUZhTzBGQlEwRXJSQ3hUUVVGTmJFWXNTVUZCVGl4RFFVRlhkVVlzU1VGQldDeERRVUZuUWl4SlFVRm9RaXhGUVVaaExFTkJSVlU3UVVGRGRrSXNUMEZCU1VVc1VVRkJVWGhDTEV0QlFVdERMRXRCUVV3c1EwRkJWeXhYUVVGWGMwSXNSMEZCZEVJc1EwRkJXanRCUVVOQlRpeFRRVUZOYkVZc1NVRkJUaXhIUVVGaGEwWXNUVUZCVFd4R0xFbEJRVTRzUTBGQlZ6WkNMRTFCUVZnc1EwRkJhMEpHTEUxQlFVMHlSQ3hoUVVGT0xFTkJRVzlDUnl4TFFVRndRaXhGUVVFeVFpeERRVUV6UWl4RFFVRnNRaXhEUVVGaUxFTkJTbUVzUTBGSmEwUTdRVUZETDBRc1ZVRkJUeXhMUVVGTFF5eFJRVUZNTEVOQlFXTlNMRXRCUVdRc1EwRkJVRHRCUVVOQk96dEJRVVZFT3pzN096czdPenM3T3p0dFEwRlJhVUpUTEZNc1JVRkJWME1zVnl4RlFVRmhReXhwUWl4RlFVRnRRa01zYVVJc1JVRkJiVUk3UVVGRE9VVkVMSFZDUVVGdlFrRXNjVUpCUVhGQ0xFVkJRWHBETzBGQlEwRkRMSFZDUVVGdlFrRXNjVUpCUVhGQ0xFTkJRWHBET3p0QlFVVkJMRTlCUVVsYUxGRkJRVkVzU1VGQlNXeEVMRk5CUVVvc1EwRkJZeXhGUVVGRGFFTXNUVUZCVFN4RFFVRkRSeXhWUVVGVmEwSXNjMEpCUVZnc1EwRkJVQ3hGUVVGa0xFTkJRVm83UVVGRFFUWkVMRk5CUVUxc1JpeEpRVUZPTEVOQlFWZDFSaXhKUVVGWUxFTkJRV2RDTEVsQlFXaENMRVZCVERoRkxFTkJTM1pFTzBGQlEzWkNUQ3hUUVVGTmJFWXNTVUZCVGl4SFFVRmhhMFlzVFVGQlRXeEdMRWxCUVU0c1EwRkJWelpDTEUxQlFWZ3NRMEZCYTBKR0xFMUJRVTB5UkN4aFFVRk9MRU5CUVc5Q1N5eFRRVUZ3UWl4RlFVRXJRaXhEUVVFdlFpeERRVUZzUWl4RFFVRmlMRU5CVGpoRkxFTkJUVmc3TzBGQlJXNUZMRTlCUVVsSkxHVkJRV1U1UWl4TFFVRkxLMElzU1VGQlRDeERRVUZWU2l4WFFVRldMRU5CUVc1Q0xFTkJVamhGTEVOQlVXNURPMEZCUXpORFZpeFRRVUZOYkVZc1NVRkJUaXhIUVVGaGEwWXNUVUZCVFd4R0xFbEJRVTRzUTBGQlZ6WkNMRTFCUVZnc1EwRkJhMEpHTEUxQlFVMHlSQ3hoUVVGT0xFTkJRVzlDVXl4WlFVRndRaXhGUVVGclF5eERRVUZzUXl4RFFVRnNRaXhEUVVGaUxFTkJWRGhGTEVOQlUxSTdRVUZEZEVWaUxGTkJRVTFzUml4SlFVRk9MRWRCUVdGclJpeE5RVUZOYkVZc1NVRkJUaXhEUVVGWE5rSXNUVUZCV0N4RFFVRnJRa1lzVFVGQlRUSkVMR0ZCUVU0c1EwRkJiMEpQTEdsQ1FVRndRaXhGUVVGMVF5eERRVUYyUXl4RFFVRnNRaXhEUVVGaUxFTkJWamhGTEVOQlZVZzdRVUZETTBWWUxGTkJRVTFzUml4SlFVRk9MRWRCUVdGclJpeE5RVUZOYkVZc1NVRkJUaXhEUVVGWE5rSXNUVUZCV0N4RFFVRnJRa1lzVFVGQlRUSkVMR0ZCUVU0c1EwRkJiMEpSTEdsQ1FVRndRaXhGUVVGMVF5eERRVUYyUXl4RFFVRnNRaXhEUVVGaUxFTkJXRGhGTEVOQlYwZzdRVUZETTBVc1ZVRkJUeXhMUVVGTFNpeFJRVUZNTEVOQlFXTlNMRXRCUVdRc1EwRkJVRHRCUVVOQk96dEJRVVZFT3pzN096czdPenM3YTBOQlRXZENaU3hGTEVWQlFVbERMRVVzUlVGQlNUdEJRVU4yUWl4UFFVRkphRUlzVVVGQlVTeEpRVUZKYkVRc1UwRkJTaXhEUVVGakxFVkJRVU5vUXl4TlFVRk5MRU5CUVVOSExGVkJRVlZ0UWl4eFFrRkJXQ3hEUVVGUUxFVkJRV1FzUTBGQldqdEJRVU5CTkVRc1UwRkJUV3hHTEVsQlFVNHNRMEZCVjNWR0xFbEJRVmdzUTBGQlowSXNTVUZCYUVJc1JVRkdkVUlzUTBGRlFUczdRVUZGZGtJc1QwRkJTVmtzVDBGQlQwUXNUVUZCVFN4RFFVRnFRanRCUVVOQlJDeFJRVUZMUVN4TlFVRk5MRU5CUVZnN08wRkJSVUU3UVVGRFFTeFBRVUZKTEU5QlFVOURMRVZCUVZBc1MwRkJZeXhYUVVGc1FpeEZRVUVyUWp0QlFVTTVRaXhSUVVGSlJTeFRRVUZUTEVOQlExb3NRMEZCUXl4SlFVRkVMRVZCUVU4c1NVRkJVQ3hGUVVGaExFbEJRV0lzUlVGQmJVSXNTVUZCYmtJc1JVRkJlVUlzU1VGQmVrSXNSVUZCSzBJc1NVRkJMMElzUlVGQmNVTXNSMEZCY2tNc1JVRkJNRU1zUjBGQk1VTXNSVUZCSzBNc1IwRkJMME1zUlVGQmIwUXNSMEZCY0VRc1JVRkJlVVFzUjBGQmVrUXNSVUZCT0VRc1IwRkJPVVFzUlVGQmJVVXNSMEZCYmtVc1JVRkJkMFVzU1VGQmVFVXNSVUZCT0VVc1NVRkJPVVVzUTBGRVdTeEZRVVZhTEVOQlFVTXNTVUZCUkN4RlFVRlBMRWxCUVZBc1JVRkJZU3hKUVVGaUxFVkJRVzFDTEVkQlFXNUNMRVZCUVhkQ0xFZEJRWGhDTEVWQlFUWkNMRWRCUVRkQ0xFVkJRV3RETEVkQlFXeERMRVZCUVhWRExFZEJRWFpETEVWQlFUUkRMRWRCUVRWRExFVkJRV2xFTEVkQlFXcEVMRVZCUVhORUxFbEJRWFJFTEVWQlFUUkVMRWxCUVRWRUxFVkJRV3RGTEVsQlFXeEZMRVZCUVhkRkxFbEJRWGhGTEVWQlFUaEZMRWxCUVRsRkxFTkJSbGtzUTBGQllqdEJRVWxCTEZGQlFVbERMRk5CUVZOS0xFZEJRVWN2Uml4TlFVRm9RanRCUVVOQkxGRkJRVWx2Unl4UFFVRlBUQ3hOUVVGTkxFZEJRV3BDT3p0QlFVVkJMRkZCUVVsQkxFZEJRVWNzUTBGQlNDeE5RVUZWUVN4SFFVRkhMRU5CUVVnc1JVRkJUWGhDTEZkQlFVNHNSVUZCWkN4RlFVRnRRekJDTEU5QlFVOHNRMEZCVURzN1FVRkZia01zVVVGQlNVVXNVMEZCVXl4RFFVRmlMRVZCUVdkQ08wRkJRMllzWVVGQlVVb3NSMEZCUjNaQ0xFMUJRVWdzUTBGQlZUSkNMRk5CUVZNc1EwRkJia0lzUTBGQlVqdEJRVU5ETEZkQlFVc3NSMEZCVER0QlFVTkRSaXhqUVVGUExFTkJRVkE3UVVGRFFVY3NZMEZCVDB3c1IwRkJSM1pDTEUxQlFVZ3NRMEZCVlN4RFFVRldMRVZCUVdGRUxGZEJRV0lzUlVGQlVEdEJRVU5CTmtJc1kwRkJUMEVzUzBGQlMzcEZMRTFCUVV3c1EwRkJXVzlGTEVkQlFVZHlRaXhUUVVGSUxFTkJRV0VzUTBGQllpeEZRVUZuUW5sQ0xGTkJRVk1zUTBGQmVrSXNRMEZCV2l4RFFVRlFPMEZCUTBFN1FVRkRSQ3hYUVVGTExFZEJRVXc3UVVGRFEwWXNZMEZCVHl4RFFVRlFPMEZCUTBGSExHTkJRVTlNTEVkQlFVZDJRaXhOUVVGSUxFTkJRVlVzUTBGQlZpeEZRVUZoUkN4WFFVRmlMRVZCUVZBN1FVRkRRVFpDTEdOQlFVOUJMRXRCUVV0NlJTeE5RVUZNTEVOQlFWbHZSU3hIUVVGSGNrSXNVMEZCU0N4RFFVRmhMRU5CUVdJc1JVRkJaMEo1UWl4VFFVRlRMRU5CUVhwQ0xFTkJRVm9zUTBGQlVEdEJRVU5CTzBGQlEwUXNWMEZCU3l4SFFVRk1PMEZCUTBOR0xHTkJRVThzUTBGQlVEdEJRVU5CUnl4alFVRlBUQ3hIUVVGSGRrSXNUVUZCU0N4RFFVRlZMRU5CUVZZc1JVRkJZVFpDTEZkQlFXSXNSVUZCVUR0QlFVTkJSQ3hqUVVGUFFTeExRVUZMZWtVc1RVRkJUQ3hEUVVGWmIwVXNSMEZCUjNKQ0xGTkJRVWdzUTBGQllTeERRVUZpTEVWQlFXZENlVUlzVTBGQlV5eERRVUY2UWl4RFFVRmFMRU5CUVZBN1FVRkRRVHRCUVVORUxGZEJRVXNzUjBGQlREdEJRVU5EUml4alFVRlBMRU5CUVZBN1FVRkRRVWNzWTBGQlQwd3NSMEZCUjNaQ0xFMUJRVWdzUTBGQlZTeERRVUZXTEVWQlFXRTJRaXhYUVVGaUxFVkJRVkE3UVVGRFFVUXNZMEZCVDBFc1MwRkJTM3BGTEUxQlFVd3NRMEZCV1c5RkxFZEJRVWR5UWl4VFFVRklMRU5CUVdFc1EwRkJZaXhGUVVGblFubENMRk5CUVZNc1EwRkJla0lzUTBGQldpeERRVUZRTzBGQlEwRTdRVUZ3UWtZN1FVRnpRa0U3TzBGQlJVUXNVVUZCU1Vjc1lVRkJZVW9zVDBGQlQwUXNTVUZCVUN4RlFVRmhUU3hQUVVGaUxFTkJRWEZDU0N4SlFVRnlRaXhEUVVGcVFqdEJRVU5CVEN4VFFVRkxUeXhsUVVGbExFTkJRVU1zUTBGQmFFSXNSMEZCYjBJc1EwRkJjRUlzUjBGQmQwSkJMR0ZCUVdFc1EwRkJNVU03UVVGRFFUczdRVUZGUkhSQ0xGTkJRVTFzUml4SlFVRk9MRWRCUVdGclJpeE5RVUZOYkVZc1NVRkJUaXhEUVVGWE5rSXNUVUZCV0N4RFFVRnJRa1lzVFVGQlRUSkVMR0ZCUVU0c1EwRkJiMEpYTEVWQlFYQkNMRVZCUVhkQ0xFTkJRWGhDTEVOQlFXeENMRU5CUVdJc1EwRXZRM1ZDTEVOQkswTnhRenRCUVVNMVJHWXNVMEZCVFd4R0xFbEJRVTRzUjBGQllXdEdMRTFCUVUxc1JpeEpRVUZPTEVOQlFWYzJRaXhOUVVGWUxFTkJRV3RDUml4TlFVRk5Na1FzWVVGQlRpeERRVUZ2UW1Fc1NVRkJjRUlzUlVGQk1FSXNRMEZCTVVJc1EwRkJiRUlzUTBGQllpeERRV2hFZFVJc1EwRm5SSFZETzBGQlF6bEVMRlZCUVU4c1MwRkJTMVFzVVVGQlRDeERRVUZqVWl4TFFVRmtMRU5CUVZBN1FVRkRRVHM3UVVGRlJEczdPenM3T3pzN01FSkJTMUYzUWl4SkxFVkJRVTA3UVVGRFlpeFBRVUZKZUVJc1VVRkJVU3hKUVVGSmJFUXNVMEZCU2l4RFFVRmpMRVZCUVVOb1F5eE5RVUZOTEVOQlFVTkhMRlZCUVZWVExGbEJRVmdzUTBGQlVDeEZRVUZrTEVOQlFWbzdRVUZEUVN4UFFVRkpLMFlzWTBGQlkyaEdMRTFCUVUxcFJpeGhRVUZPTEVOQlFXOUNSaXhKUVVGd1FpeERRVUZzUWp0QlFVTkJlRUlzVTBGQlRXeEdMRWxCUVU0c1IwRkJZV3RHTEUxQlFVMXNSaXhKUVVGT0xFTkJRVmMyUWl4TlFVRllMRU5CUVd0Q1JpeE5RVUZOUXl4elFrRkJUaXhEUVVFMlFpdEZMRmxCUVZsNlJ5eE5RVUY2UXl4RFFVRnNRaXhEUVVGaUxFTkJTR0VzUTBGSGNVVTdRVUZEYkVablJpeFRRVUZOYkVZc1NVRkJUaXhIUVVGaGEwWXNUVUZCVFd4R0xFbEJRVTRzUTBGQlZ6WkNMRTFCUVZnc1EwRkJhMEk0UlN4WFFVRnNRaXhEUVVGaUxFTkJTbUVzUTBGSlowTTdRVUZETjBNc1ZVRkJUeXhMUVVGTGFrSXNVVUZCVEN4RFFVRmpVaXhMUVVGa0xFTkJRVkE3UVVGRFFUczdRVUZGUkRzN096czdPenM3SzBKQlMyRjNRaXhKTEVWQlFVMDdRVUZEYkVJc1QwRkJTWGhDTEZGQlFWRXNTVUZCU1d4RUxGTkJRVW9zUTBGQll5eEZRVUZEYUVNc1RVRkJUU3hEUVVGRFJ5eFZRVUZWVlN4cFFrRkJXQ3hEUVVGUUxFVkJRV1FzUTBGQldqdEJRVU5CTEU5QlFVazRSaXhqUVVGamFFWXNUVUZCVFdsR0xHRkJRVTRzUTBGQmIwSkdMRWxCUVhCQ0xFTkJRV3hDTzBGQlEwRjRRaXhUUVVGTmJFWXNTVUZCVGl4SFFVRmhhMFlzVFVGQlRXeEdMRWxCUVU0c1EwRkJWelpDTEUxQlFWZ3NRMEZCYTBKR0xFMUJRVTFETEhOQ1FVRk9MRU5CUVRaQ0swVXNXVUZCV1hwSExFMUJRWHBETEVOQlFXeENMRU5CUVdJc1EwRklhMElzUTBGSFowVTdRVUZEYkVablJpeFRRVUZOYkVZc1NVRkJUaXhIUVVGaGEwWXNUVUZCVFd4R0xFbEJRVTRzUTBGQlZ6WkNMRTFCUVZnc1EwRkJhMEk0UlN4WFFVRnNRaXhEUVVGaUxFTkJTbXRDTEVOQlNUSkNPMEZCUXpkRExGVkJRVThzUzBGQlMycENMRkZCUVV3c1EwRkJZMUlzUzBGQlpDeERRVUZRTzBGQlEwRTdPMEZCUlVRN096czdPenM3T3l0Q1FVdGhkMElzU1N4RlFVRk5PMEZCUTJ4Q0xFOUJRVWw0UWl4UlFVRlJMRWxCUVVsc1JDeFRRVUZLTEVOQlFXTXNSVUZCUTJoRExFMUJRVTBzUTBGQlEwY3NWVUZCVlZjc2EwSkJRVmdzUTBGQlVDeEZRVUZrTEVOQlFWbzdRVUZEUVN4UFFVRkpOa1lzWTBGQlkyaEdMRTFCUVUxcFJpeGhRVUZPTEVOQlFXOUNSaXhKUVVGd1FpeERRVUZzUWp0QlFVTkJlRUlzVTBGQlRXeEdMRWxCUVU0c1IwRkJZV3RHTEUxQlFVMXNSaXhKUVVGT0xFTkJRVmMyUWl4TlFVRllMRU5CUVd0Q1JpeE5RVUZOUXl4elFrRkJUaXhEUVVFMlFpdEZMRmxCUVZsNlJ5eE5RVUY2UXl4RFFVRnNRaXhEUVVGaUxFTkJTR3RDTEVOQlIyZEZPMEZCUTJ4R1owWXNVMEZCVFd4R0xFbEJRVTRzUjBGQllXdEdMRTFCUVUxc1JpeEpRVUZPTEVOQlFWYzJRaXhOUVVGWUxFTkJRV3RDT0VVc1YwRkJiRUlzUTBGQllpeERRVXByUWl4RFFVa3lRanRCUVVNM1F5eFZRVUZQTEV0QlFVdHFRaXhSUVVGTUxFTkJRV05TTEV0QlFXUXNRMEZCVUR0QlFVTkJPenRCUVVWRU96czdPenM3T3p0dlEwRkxhMEozUWl4SkxFVkJRVTA3UVVGRGRrSXNUMEZCU1hoQ0xGRkJRVkVzU1VGQlNXeEVMRk5CUVVvc1EwRkJZeXhGUVVGRGFFTXNUVUZCVFN4RFFVRkRSeXhWUVVGVldTeDFRa0ZCV0N4RFFVRlFMRVZCUVdRc1EwRkJXanRCUVVOQkxFOUJRVWswUml4alFVRmphRVlzVFVGQlRXbEdMR0ZCUVU0c1EwRkJiMEpHTEVsQlFYQkNMRU5CUVd4Q08wRkJRMEY0UWl4VFFVRk5iRVlzU1VGQlRpeEhRVUZoYTBZc1RVRkJUV3hHTEVsQlFVNHNRMEZCVnpaQ0xFMUJRVmdzUTBGQmEwSkdMRTFCUVUxRExITkNRVUZPTEVOQlFUWkNLMFVzV1VGQldYcEhMRTFCUVhwRExFTkJRV3hDTEVOQlFXSXNRMEZJZFVJc1EwRkhNa1E3UVVGRGJFWm5SaXhUUVVGTmJFWXNTVUZCVGl4SFFVRmhhMFlzVFVGQlRXeEdMRWxCUVU0c1EwRkJWelpDTEUxQlFWZ3NRMEZCYTBJNFJTeFhRVUZzUWl4RFFVRmlMRU5CU25WQ0xFTkJTWE5DTzBGQlF6ZERMRlZCUVU4c1MwRkJTMnBDTEZGQlFVd3NRMEZCWTFJc1MwRkJaQ3hEUVVGUU8wRkJRMEU3TzBGQlJVUTdPenM3T3pzN096UkNRVXRWZDBJc1NTeEZRVUZOTzBGQlEyWXNUMEZCU1hoQ0xGRkJRVkVzU1VGQlNXeEVMRk5CUVVvc1EwRkJZeXhGUVVGRGFFTXNUVUZCVFN4RFFVRkRSeXhWUVVGVll5eGpRVUZZTEVOQlFWQXNSVUZCWkN4RFFVRmFPMEZCUTBFc1QwRkJTVEJHTEdOQlFXTm9SaXhOUVVGTmFVWXNZVUZCVGl4RFFVRnZRa1lzU1VGQmNFSXNRMEZCYkVJN1FVRkRRWGhDTEZOQlFVMXNSaXhKUVVGT0xFZEJRV0ZyUml4TlFVRk5iRVlzU1VGQlRpeERRVUZYTmtJc1RVRkJXQ3hEUVVGclFrWXNUVUZCVFVNc2MwSkJRVTRzUTBGQk5rSXJSU3haUVVGWmVrY3NUVUZCZWtNc1EwRkJiRUlzUTBGQllpeERRVWhsTEVOQlIyMUZPMEZCUTJ4R1owWXNVMEZCVFd4R0xFbEJRVTRzUjBGQllXdEdMRTFCUVUxc1JpeEpRVUZPTEVOQlFWYzJRaXhOUVVGWUxFTkJRV3RDT0VVc1YwRkJiRUlzUTBGQllpeERRVXBsTEVOQlNUaENPMEZCUXpkRExGVkJRVThzUzBGQlMycENMRkZCUVV3c1EwRkJZMUlzUzBGQlpDeERRVUZRTzBGQlEwRTdPMEZCUlVRN096czdPenM3T3poQ1FVdFpkMElzU1N4RlFVRk5PMEZCUTJwQ0xFOUJRVWw0UWl4UlFVRlJMRWxCUVVsc1JDeFRRVUZLTEVOQlFXTXNSVUZCUTJoRExFMUJRVTBzUTBGQlEwY3NWVUZCVldVc1kwRkJXQ3hEUVVGUUxFVkJRV1FzUTBGQldqdEJRVU5CTEU5QlFVbDVSaXhqUVVGamFFWXNUVUZCVFdsR0xHRkJRVTRzUTBGQmIwSkdMRWxCUVhCQ0xFTkJRV3hDTzBGQlEwRjRRaXhUUVVGTmJFWXNTVUZCVGl4SFFVRmhhMFlzVFVGQlRXeEdMRWxCUVU0c1EwRkJWelpDTEUxQlFWZ3NRMEZCYTBKR0xFMUJRVTFETEhOQ1FVRk9MRU5CUVRaQ0swVXNXVUZCV1hwSExFMUJRWHBETEVOQlFXeENMRU5CUVdJc1EwRklhVUlzUTBGSGFVVTdRVUZEYkVablJpeFRRVUZOYkVZc1NVRkJUaXhIUVVGaGEwWXNUVUZCVFd4R0xFbEJRVTRzUTBGQlZ6WkNMRTFCUVZnc1EwRkJhMEk0UlN4WFFVRnNRaXhEUVVGaUxFTkJTbWxDTEVOQlNUUkNPMEZCUXpkRExGVkJRVThzUzBGQlMycENMRkZCUVV3c1EwRkJZMUlzUzBGQlpDeERRVUZRTzBGQlEwRTdPMEZCUlVRN096czdPenM3T3pKQ1FVdFRNa0lzU3l4RlFVRlBPMEZCUTJZc1QwRkJTVE5DTEZGQlFWRXNTVUZCU1d4RUxGTkJRVW9zUTBGQll5eEZRVUZEYUVNc1RVRkJUU3hEUVVGRFJ5eFZRVUZWWVN4aFFVRllMRU5CUVZBc1JVRkJaQ3hEUVVGYU8wRkJRMEVzVDBGQlNUSkdMR05CUVdOb1JpeE5RVUZOYVVZc1lVRkJUaXhEUVVGdlFrTXNTMEZCY0VJc1EwRkJiRUk3UVVGRFFUTkNMRk5CUVUxc1JpeEpRVUZPTEVkQlFXRnJSaXhOUVVGTmJFWXNTVUZCVGl4RFFVRlhOa0lzVFVGQldDeERRVUZyUWtZc1RVRkJUVU1zYzBKQlFVNHNRMEZCTmtJclJTeFpRVUZaZWtjc1RVRkJla01zUTBGQmJFSXNRMEZCWWl4RFFVaGxMRU5CUjIxRk8wRkJRMnhHWjBZc1UwRkJUV3hHTEVsQlFVNHNSMEZCWVd0R0xFMUJRVTFzUml4SlFVRk9MRU5CUVZjMlFpeE5RVUZZTEVOQlFXdENPRVVzVjBGQmJFSXNRMEZCWWl4RFFVcGxMRU5CU1RoQ08wRkJRemRETEZWQlFVOHNTMEZCUzJwQ0xGRkJRVXdzUTBGQlkxSXNTMEZCWkN4RFFVRlFPMEZCUTBFN08wRkJSVVE3T3pzN096czdLMEpCU1dFN1FVRkRXaXhQUVVGSlFTeFJRVUZSTEVsQlFVbDRRaXhYUVVGS0xFTkJRV2RDTEVWQlFVTXhSQ3hOUVVGTkxFTkJRVU1zU1VGQlJDeEZRVUZQTEVsQlFWQXNSVUZCWVN4SlFVRmlMRVZCUVcxQ0xFbEJRVzVDTEVOQlFWQXNSVUZCYUVJc1EwRkJXanRCUVVOQkxGVkJRVThzUzBGQlN6QkdMRkZCUVV3c1EwRkJZMUlzUzBGQlpDeERRVUZRTzBGQlEwRTdPenM3T3p0UlFVbE5SaXhMTEVkQlFVRkJMRXM3TzBGQlIxSTdPenRKUVVkTmNrUXNTenM3T3pzN096czdPMEZCUlV3N096czdORUpCU1dsQ08wRkJRMmhDTEZWQlFVOTRRaXhWUVVGVlF5eFBRVUZxUWp0QlFVTkJPenRCUVVWRU96czdPenM3T3p0blEwRkxjVUl3Unl4TkxFVkJRVkU3UVVGRE5VSXNWVUZCVDBFc1QwRkJUME1zUzBGQlVDeERRVUZoTEVWQlFXSXNSVUZCYVVJMVF5eEhRVUZxUWl4RFFVRnhRanRCUVVGQkxGZEJRVkUyUXl4TFFVRkxReXhWUVVGTUxFVkJRVkk3UVVGQlFTeEpRVUZ5UWl4RFFVRlFPMEZCUTBFN08wRkJSVVE3T3pzN096czdPelJDUVV0cFFrTXNReXhGUVVGSE8wRkJRMjVDTEZWQlFVOHNRMEZCUTBNc1RVRkJUVU1zVjBGQlYwWXNRMEZCV0N4RFFVRk9MRU5CUVVRc1NVRkJlVUpITEZOQlFWTklMRU5CUVZRc1EwRkJhRU03UVVGRFFUczdRVUZGUkRzN096czdPenM3T3pKQ1FVMXZRbWhHTEVzc1JVRkJUenRCUVVOMFFpeFZRVUZQTEhWQ1FVRlBRU3hMUVVGUUxFTkJRVkE3UVVGRFFUczdRVUZGVERzN096czdPenM3T3pzN08zbERRVk00UW05R0xFc3NSVUZCVHp0QlFVTnFReXhQUVVGSlF5eFRRVUZUUkN4UlFVRlJMRWxCUVhKQ096dEJRVVZCTEZWQlFVOUJMRkZCUVZGQkxGTkJRVk1zUTBGQmVFSXNSVUZCTWtJN1FVRkRka0pETEdWQlFWY3NRMEZCV0R0QlFVTkJRU3hqUVVGWlJDeFJRVUZSTEVsQlFWUXNSMEZCYVVJc1NVRkJOVUk3UVVGRFNEczdRVUZGUkN4UFFVRkpSU3hSUVVGUkxFVkJRVm83UVVGRFFTeFZRVUZQTEVsQlFWQXNSVUZCWVR0QlFVTlVRU3hWUVVGTmFrTXNTVUZCVGl4RFFVRlhaME1zVTBGQlV5eEpRVUZ3UWpzN1FVRkZRU3hSUVVGSlFTeFRRVUZUTEVsQlFXSXNSVUZCYlVKQkxGZEJRVmNzUTBGQldDeERRVUZ1UWl4TFFVTkxPMEZCUVVVN1FVRkJVVHRCUVVOc1FqczdRVUZGUkN4VlFVRlBReXhMUVVGUU8wRkJRMGc3TzBGQlJVUTdPenM3T3pzN08ydERRVXQxUWtNc1F5eEZRVUZITzBGQlEzcENMRlZCUVU5RExGVkJRVlZFTEVOQlFWWXNSVUZCWVZZc1MwRkJZaXhEUVVGdFFpeFBRVUZ1UWl4RlFVRTBRamRITEUxQlFUVkNMRWRCUVhGRExFTkJRVFZETzBGQlEwRTdPMEZCUlVRN096czdPenM3TzJ0RFFVdDFRbmxJTEVzc1JVRkJUenRCUVVNM1FpeFBRVUZKUXl4TlFVRk5MRVZCUVZZN1FVRkRRU3hQUVVGSlF5eFpRVUZLT3p0QlFVVkJSaXhUUVVGTk1VVXNUMEZCVGl4RFFVRmpMRlZCUVZNMlJTeEpRVUZVTEVWQlFXVTdRVUZETlVKRUxHMUNRVUZsUXl4TFFVRkxkRVFzVVVGQlRDeERRVUZqTEVWQlFXUXNRMEZCWmpzN1FVRkZRVHRCUVVOQkxGRkJRVWx4UkN4aFFVRmhNMGdzVFVGQllpeEpRVUYxUWl4RFFVRXpRaXhGUVVFNFFqSklMR1ZCUVdVc1RVRkJUVUVzV1VGQmNrSTdPMEZCUlRsQ1JDeFhRVUZQUXl4WlFVRlFPMEZCUTBFc1NVRlFSRHM3UVVGVFFTeFZRVUZQYkVRc1UwRkJVMmxFTEVkQlFWUXNSVUZCWXl4RlFVRmtMRU5CUVZBN1FVRkRRVHM3UVVGRlJEczdPenM3T3pzN08yZERRVTF4UWtjc1RTeEZRVUZSUXl4WExFVkJRV0U3UVVGRGVrTkJMR2xDUVVGalFTeGxRVUZsTEVOQlFUZENPenRCUVVWQkxFOUJRVWxETEZsQlFWbEdMRTlCUVU5MlJDeFJRVUZRTEVOQlFXZENMRVZCUVdoQ0xFTkJRV2hDT3p0QlFVVkJMRTlCUVVsNVJDeFZRVUZWTDBnc1RVRkJWaXhIUVVGdFFpeERRVUYyUWl4RlFVRXdRanRCUVVGRk8wRkJRek5DSzBnc1owSkJRVmtzVFVGQlRVRXNVMEZCYkVJN1FVRkRRVHM3UVVGRlJEdEJRVU5CTEU5QlFVbERMRmRCUVZkRUxGVkJRVlZGTEV0QlFWWXNRMEZCWjBJc1QwRkJhRUlzUTBGQlpqczdRVUZGUVR0QlFVTkJSQ3hqUVVGWFFTeFRRVUZUTDBRc1IwRkJWQ3hEUVVGaE8wRkJRVUVzVjBGQlVWRXNVMEZCVTNsRUxFbEJRVlFzUlVGQlpTeEZRVUZtTEVOQlFWSTdRVUZCUVN4SlFVRmlMRU5CUVZnN08wRkJSVUU3UVVGRFFTeFBRVUZKUml4VFFVRlRhRWtzVFVGQlZDeEhRVUZyUWpoSUxGZEJRWFJDTEVWQlFXMURPMEZCUTJ4RExGZEJRVTlCTEdOQlFXTkZMRk5CUVZOb1NTeE5RVUYyUWl4SFFVRm5ReXhEUVVGMlF5eEZRVUV3UXp0QlFVTjZRMmRKTEdOQlFWTkhMRTlCUVZRc1EwRkJhVUlzUTBGQmFrSTdRVUZEUVR0QlFVTkVPenRCUVVWRUxGVkJRVTlJTEZGQlFWQTdRVUZEUVRzN1FVRkZSRHM3T3pzN096czdNRUpCUzJVNVJDeExMRVZCUVU4N1FVRkRja0lzVDBGQlNXWXNUVUZCVFVNc1QwRkJUaXhEUVVGall5eExRVUZrTEVOQlFVb3NSVUZCTUVJc1QwRkJUMEVzUzBGQlVEdEJRVU14UWl4VlFVRlBMRU5CUVVOQkxFdEJRVVFzUTBGQlVEdEJRVU5CT3pzN096czdVVUZIVFhwRExFc3NSMEZCUVVFc1N6czdTVUZEUmpKSExFODdRVUZGVEN4dlFrRkJZenRCUVVGQk8wRkJSV0k3UVVGRVFUczdPMEZCUjBRN096czdPenM3TzJsRFFVbGxReXhMTEVWQlFVODdRVUZEY2tJc1QwRkJTVU1zVVVGQlVTeEpRVUZKZUVRc1MwRkJTaXhGUVVGYU8wRkJRMEVzVDBGQlNUVkRMRWxCUVVvN1FVRkRRU3hQUVVGSmNVY3NWVUZCVlN4RlFVRmtPenRCUVVWQlJpeFRRVUZOUnl4VFFVRk9MRU5CUVdkQ2VrWXNUMEZCYUVJc1EwRkJkMElzVlVGQlV6QkdMRkZCUVZRc1JVRkJiVUk3UVVGRE1VTkdMR05CUVZVc1JVRkJWanM3UVVGRlFTeFJRVUZKUlN4VFFVRlRReXhSUVVGVUxFdEJRWE5DTEVkQlFURkNMRVZCUVN0Q08wRkJRemxDUkN4alFVRlRSU3hKUVVGVUxFTkJRV00xUml4UFFVRmtMRU5CUVhOQ0xGVkJRVk0yUml4SFFVRlVMRVZCUVdNN1FVRkRia003UVVGRFFVd3NZMEZCVVd4RUxFbEJRVklzUTBGQllTeExRVUZMZDBRc1dVRkJUQ3hEUVVGclFrUXNSMEZCYkVJc1EwRkJZanRCUVVOQkxFMUJTRVE3UVVGTFFTeExRVTVFTEUxQlRVOHNTVUZCU1Vnc1UwRkJVME1zVVVGQlZDeExRVUZ6UWl4SFFVRXhRaXhGUVVFclFqdEJRVU55UXp0QlFVTkJlRWNzV1VGQlR5eExRVUZMTkVjc1pVRkJUQ3hEUVVGeFFrd3NVVUZCY2tJc1EwRkJVRHRCUVVOQk8wRkJRMEU3TzBGQlJVUklMRlZCUVUwNVF5eFJRVUZPTEVOQlFXVXNTVUZCU1hwRUxGTkJRVW9zUTBGQll5eEZRVUZEUXl4UFFVRlBkVWNzVDBGQlVpeEZRVUZwUW5CSExGVkJRVlVzUzBGQlN6SkhMR1ZCUVV3c1EwRkJjVUpNTEZGQlFYSkNMRU5CUVROQ0xFVkJRVEpFZGtjc1RVRkJUVUVzU1VGQmFrVXNSVUZCWkN4RFFVRm1PenRCUVVWQk8wRkJRMEZCTEZkQlFVOHNRMEZCVUR0QlFVTkJMRWxCYmtKRU96dEJRWEZDUVN4VlFVRlBiMGNzUzBGQlVEdEJRVU5CT3p0QlFVZEVPenM3T3pzN095dENRVWxoZEVjc1N5eEZRVUZQTzBGQlEyNUNMRlZCUVU5QkxFMUJRVTByUnl4UFFVRk9MRU5CUVdNc1IwRkJaQ3hGUVVGdFFpeEZRVUZ1UWl4RFFVRlFPMEZCUTBFN08wRkJSMFE3T3pzN096czdhME5CU1dkQ00wTXNTU3hGUVVGTk8wRkJRM0pDTEZkQlFWRkJMRXRCUVV0cVJTeFJRVUZpTzBGQlEwTXNVMEZCU3l4SFFVRk1PMEZCUTBNc1dVRkJUeXhIUVVGUU8wRkJRMFFzVTBGQlN5eEhRVUZNTzBGQlEwTXNXVUZCVDJsRkxFdEJRVXMwUXl4UlFVRk1MRXRCUVd0Q0xFbEJRV3hDTEVkQlFYbENMRWRCUVdoRE8wRkJRMFFzVTBGQlN5eEhRVUZNTzBGQlEwTXNXVUZCVHpWRExFdEJRVXMwUXl4UlFVRk1MRXRCUVd0Q0xFbEJRV3hDTEVkQlFYbENMRWRCUVdoRE8wRkJRMFFzVTBGQlN5eEhRVUZNTzBGQlEwTXNXVUZCVHpWRExFdEJRVXMwUXl4UlFVRk1MRXRCUVd0Q0xFbEJRV3hDTEVkQlFYbENMRWRCUVdoRE8wRkJVa1k3TzBGQlYwRXNWVUZCVHpWRExFdEJRVXRxUlN4UlFVRmFPMEZCUTBFN096czdPenRSUVVkTmFVY3NUeXhIUVVGQlFTeFBPMEZCUTFJN096czdPenRKUVV0TllTeE5PMEZCUTB3c2FVSkJRVmxETEUxQlFWb3NSVUZCYjBJN1FVRkJRVHM3UVVGRGJrSXNUMEZCUzNCS0xFbEJRVXdzUjBGQldTeEZRVUZhT3p0QlFVVkJMRTFCUVVseFNpeFpRVUZaUkN4UFFVRlBiRW9zVFVGQlVDeEhRVUZuUWl4RFFVRm9RaXhIUVVGdlFrTXNWVUZCVlVzc2IwSkJRVGxDTEVkQlFYRkVUQ3hWUVVGVlNTeHZRa0ZCTDBVN1FVRkRRU3hOUVVGSkswa3NhVUpCUVdsQ00wZ3NUVUZCVFRKRUxHRkJRVTRzUTBGQmIwSTRSQ3hQUVVGUGJFb3NUVUZCTTBJc1JVRkJiVU1zUTBGQmJrTXNRMEZCY2tJc1EwRktiVUlzUTBGSmVVTTdPMEZCUlRWRU8wRkJRMEVzVDBGQlMwWXNTVUZCVEN4RFFVRlZkVVlzU1VGQlZpeERRVUZsTEVsQlFVa3hSaXhMUVVGS0xFTkJRVlU3UVVGRGJrSkZMRk5CUVUxSkxGVkJRVlZGTEdsQ1FVUkhPMEZCUlc1Q1RDeFRRVUZOY1Vvc1ZVRkJWWGhJTEUxQlFWWXNRMEZCYVVKNVNDeGpRVUZxUWl4RlFVRnBRMjVLTEZWQlFWVk5MSEZDUVVFelF5eERRVVpoTEVWQlFWWXNRMEZCWmpzN1FVRkpRVHRCUVVOQk1ra3NVMEZCVDI1SExFOUJRVkFzUTBGQlpTeFZRVUZUZFVZc1MwRkJWQ3hGUVVGblFpOUZMRU5CUVdoQ0xFVkJRVzFDTzBGQlEycERLMFVzVTBGQlRUbERMRkZCUVU0c1EwRkJaU3hKUVVGSk1VUXNVMEZCU2l4RFFVRmpMRVZCUVVOb1F5eE5RVUZOUnl4VlFVRlZiMElzYjBKQlFXcENMRVZCUVdRc1EwRkJaanRCUVVOQkxGRkJRVXQyUWl4SlFVRk1MRU5CUVZWMVJpeEpRVUZXTEVOQlFXVnBSQ3hMUVVGbU8wRkJRMEVzUjBGSVJDeEZRVWRITEVsQlNFZzdRVUZKUVRzN1FVRkZSRHM3T3pzN096czdPRUpCU1ZrN1FVRkRXQ3hQUVVGSlpTeFJRVUZSTEVWQlFWbzdPMEZCUlVFN1FVRkRRU3hSUVVGTGRrb3NTVUZCVEN4RFFVRlZhVVFzVDBGQlZpeERRVUZyUWl4VlFVRkRkVWNzUTBGQlJEdEJRVUZCTEZkQlFVOUVMRkZCUVZGQkxFMUJRVTB4U0N4TlFVRk9MRU5CUVdFeVNDeEZRVUZGZWtvc1NVRkJaaXhGUVVGeFFubEtMRVZCUVVWMlNpeEpRVUYyUWl4RlFVRTJRblZLTEVWQlFVVjRTaXhKUVVFdlFpeERRVUZtTzBGQlFVRXNTVUZCYkVJN08wRkJSVUVzVlVGQlR5eEpRVUZKZVVvc1ZVRkJTaXhEUVVGbFJpeExRVUZtTEVOQlFWQTdRVUZEUVRzN1FVRkZSRHM3T3pzN096c3lRa0ZKVXp0QlFVTlNMRTlCUVVrc1QwRkJUMGNzU1VGQlVDeExRVUZuUWl4VlFVRndRaXhGUVVGblF5eFBRVUZQUVN4TFFVRkxReXhQUVVGUFF5eFpRVUZRTEVOQlFXOUNReXhMUVVGd1FpeERRVUV3UWl4SlFVRXhRaXhGUVVGblF5eExRVUZMUXl4VFFVRk1MRVZCUVdoRExFTkJRVXdzUTBGQlVEdEJRVU5vUXl4VlFVRlBMRWxCUVVsRExFMUJRVW9zUTBGQlZ5eExRVUZMUkN4VFFVRk1MRVZCUVZnc1JVRkJOa0owUml4UlFVRTNRaXhEUVVGelF5eFJRVUYwUXl4RFFVRlFPMEZCUTBFN08wRkJSVVU3T3pzN096czdORUpCU1ZVN1FVRkRWQ3hWUVVGUExEUkNRVUUwUWl4TFFVRkxkMFlzVFVGQlRDeEZRVUZ1UXp0QlFVTkJPenRCUVVWS096czdPenM3T3pKQ1FVbFpPMEZCUTFJc1ZVRkJUME1zVVVGQlVVTXNUVUZCVWl4RFFVRmxReXhMUVVGbUxFTkJRWEZDTEVsQlFVbEtMRTFCUVVvc1EwRkJWeXhMUVVGTFJDeFRRVUZNTEVWQlFWZ3NRMEZCY2tJc1EwRkJVRHRCUVVOQk96dEJRVVZLT3pzN096czdPekpDUVVsVFRTeFJMRVZCUVZVN1FVRkRiRUlzVDBGQlNUZERMRk5CUVZNc1NVRkJTWGRETEUxQlFVb3NRMEZCVnl4TFFVRkxSQ3hUUVVGTUxFVkJRVmdzUTBGQllqdEJRVU5CVHl4TlFVRkhReXhUUVVGSUxFTkJRV0ZHTEZkQlFWY3NUVUZCZUVJc1JVRkJaME0zUXl4TlFVRm9ReXhGUVVGM1F5eFZRVUZWWjBRc1IwRkJWaXhGUVVGbE8wRkJRM1JFTEZGQlFVZEJMRWRCUVVnc1JVRkJVU3hQUVVGUFF5eFJRVUZSUXl4SFFVRlNMRU5CUVZsR0xFZEJRVm9zUTBGQlVEdEJRVU5TTEVsQlJrUTdRVUZIUVRzN096czdPMUZCUjAxd1FpeE5MRWRCUVVGQkxFMGlMQ0ptYVd4bElqb2lhVzVrWlhndWFuTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUl2S2lwY2JpQXFJRTlpYW1WamRDQnlaWEJ5WlhObGJuUmhkR2x2YmlCdlppQjBhR1VnWTJoMWJtc2djMlZqZEdsdmJpQnZaaUJoSUUxSlJFa2dabWxzWlM1Y2JpQXFJRUJ3WVhKaGJTQjdiMkpxWldOMGZTQm1hV1ZzWkhNZ0xTQjdkSGx3WlRvZ2JuVnRZbVZ5TENCa1lYUmhPaUJoY25KaGVTd2djMmw2WlRvZ1lYSnlZWGw5WEc0Z0tpQkFjbVYwZFhKdUlIdERhSFZ1YTMxY2JpQXFMMXh1WTJ4aGMzTWdRMmgxYm1zZ2UxeHVYSFJqYjI1emRISjFZM1J2Y2lobWFXVnNaSE1wSUh0Y2JseDBYSFIwYUdsekxuUjVjR1VnUFNCbWFXVnNaSE11ZEhsd1pUdGNibHgwWEhSMGFHbHpMbVJoZEdFZ1BTQm1hV1ZzWkhNdVpHRjBZVHRjYmx4MFhIUjBhR2x6TG5OcGVtVWdQU0JiTUN3Z01Dd2dNQ3dnWm1sbGJHUnpMbVJoZEdFdWJHVnVaM1JvWFR0Y2JseDBmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ2UwTm9kVzVyZlR0Y2JpOHFLbHh1SUNvZ1RVbEVTU0JtYVd4bElHWnZjbTFoZENCamIyNXpkR0Z1ZEhNc0lHbHVZMngxWkdsdVp5QnViM1JsSUMwK0lFMUpSRWtnYm5WdFltVnlJSFJ5WVc1emJHRjBhVzl1TGx4dUlDb2dRSEpsZEhWeWJpQjdRMjl1YzNSaGJuUnpmVnh1SUNvdlhHNWNiblpoY2lCRGIyNXpkR0Z1ZEhNZ1BTQjdYRzVjZEZaRlVsTkpUMDVjZEZ4MFhIUmNkRngwT2lBbk1TNDFMakluTEZ4dVhIUklSVUZFUlZKZlEwaFZUa3RmVkZsUVJTQWdYSFJjZERvZ1d6QjROR1FzSURCNE5UUXNJREI0Tmpnc0lEQjROalJkTENBdkx5Qk5kR2hrWEc1Y2RFaEZRVVJGVWw5RFNGVk9TMTlNUlU1SFZFZ2dJRngwT2lCYk1IZ3dNQ3dnTUhnd01Dd2dNSGd3TUN3Z01IZ3dObDBzSUM4dklFaGxZV1JsY2lCemFYcGxJR1p2Y2lCVFRVWmNibHgwU0VWQlJFVlNYME5JVlU1TFgwWlBVazFCVkRBZ0lDQWdPaUJiTUhnd01Dd2dNSGd3TUYwc0lDOHZJRTFwWkdrZ1ZIbHdaU0F3SUdsa1hHNWNkRWhGUVVSRlVsOURTRlZPUzE5R1QxSk5RVlF4SUNBZ0lEb2dXekI0TURBc0lEQjRNREZkTENBdkx5Qk5hV1JwSUZSNWNHVWdNU0JwWkZ4dVhIUklSVUZFUlZKZlEwaFZUa3RmUkVsV1NWTkpUMDRnSUNBNklGc3dlREF3TENBd2VEZ3dYU3dnTHk4Z1JHVm1ZWFZzZEhNZ2RHOGdNVEk0SUhScFkydHpJSEJsY2lCaVpXRjBYRzVjZEZSU1FVTkxYME5JVlU1TFgxUlpVRVZjZEZ4ME9pQmJNSGcwWkN3Z01IZzFOQ3dnTUhnM01pd2dNSGcyWWwwc0lDOHZJRTFVY21zc1hHNWNkRTFGVkVGZlJWWkZUbFJmU1VSY2RGeDBYSFE2SURCNFJrWXNYRzVjZEUxRlZFRmZWRVZZVkY5SlJGeDBYSFJjZERvZ01IZ3dNU3hjYmx4MFRVVlVRVjlEVDFCWlVrbEhTRlJmU1VSY2RGeDBPaUF3ZURBeUxGeHVYSFJOUlZSQlgxUlNRVU5MWDA1QlRVVmZTVVJjZEZ4ME9pQXdlREF6TEZ4dVhIUk5SVlJCWDBsT1UxUlNWVTFGVGxSZlRrRk5SVjlKUkNBNklEQjRNRFFzWEc1Y2RFMUZWRUZmVEZsU1NVTmZTVVJjZEZ4MFhIUTZJREI0TURVc1hHNWNkRTFGVkVGZlRVRlNTMFZTWDBsRVhIUmNkRngwT2lBd2VEQTJMRnh1WEhSTlJWUkJYME5WUlY5UVQwbE9WRngwWEhSY2REb2dNSGd3Tnl4Y2JseDBUVVZVUVY5VVJVMVFUMTlKUkZ4MFhIUmNkRG9nTUhnMU1TeGNibHgwVFVWVVFWOVRUVlJRUlY5UFJrWlRSVlJjZEZ4ME9pQXdlRFUwTEZ4dVhIUk5SVlJCWDFSSlRVVmZVMGxIVGtGVVZWSkZYMGxFWEhRNklEQjROVGdzWEc1Y2RFMUZWRUZmUzBWWlgxTkpSMDVCVkZWU1JWOUpSRngwT2lBd2VEVTVMRnh1WEhSTlJWUkJYMFZPUkY5UFJsOVVVa0ZEUzE5SlJGeDBPaUJiTUhneVJpd2dNSGd3TUYwc1hHNWNkRU5QVGxSU1QweE1SVkpmUTBoQlRrZEZYMU5VUVZSVlV6b2dNSGhDTUN3Z0x5OGdhVzVqYkhWa1pYTWdZMmhoYm01bGJDQnVkVzFpWlhJZ0tEQXBYRzVjZEZCU1QwZFNRVTFmUTBoQlRrZEZYMU5VUVZSVlUxeDBPaUF3ZUVNd0xDQXZMeUJwYm1Oc2RXUmxjeUJqYUdGdWJtVnNJRzUxYldKbGNpQW9NQ2xjYm4wN1hHNWNibVY0Y0c5eWRDQjdRMjl1YzNSaGJuUnpmVHRjYmk4cUtseHVJQ29nU0c5c1pITWdZV3hzSUdSaGRHRWdabTl5SUdFZ1hDSmpiMjUwY205c2JHVnlJR05vWVc1blpWd2lJRTFKUkVrZ1pYWmxiblJjYmlBcUlFQndZWEpoYlNCN2IySnFaV04wZlNCbWFXVnNaSE1nZTJOdmJuUnliMnhzWlhKT2RXMWlaWEk2SUdsdWRHVm5aWElzSUdOdmJuUnliMnhzWlhKV1lXeDFaVG9nYVc1MFpXZGxjbjFjYmlBcUlFQnlaWFIxY200Z2UwTnZiblJ5YjJ4c1pYSkRhR0Z1WjJWRmRtVnVkSDFjYmlBcUwxeHVZMnhoYzNNZ1EyOXVkSEp2Ykd4bGNrTm9ZVzVuWlVWMlpXNTBJSHRjYmx4MFkyOXVjM1J5ZFdOMGIzSW9abWxsYkdSektTQjdYRzVjZEZ4MGRHaHBjeTUwZVhCbElEMGdKMk52Ym5SeWIyeHNaWEluTzF4dVhIUmNkQzh2SUdSbGJIUmhJSFJwYldVZ1pHVm1ZWFZzZEhNZ2RHOGdNQzVjYmx4MFhIUjBhR2x6TG1SaGRHRWdQU0JWZEdsc2N5NXVkVzFpWlhKVWIxWmhjbWxoWW14bFRHVnVaM1JvS0RCNE1EQXBMbU52Ym1OaGRDaERiMjV6ZEdGdWRITXVRMDlPVkZKUFRFeEZVbDlEU0VGT1IwVmZVMVJCVkZWVExDQm1hV1ZzWkhNdVkyOXVkSEp2Ykd4bGNrNTFiV0psY2l3Z1ptbGxiR1J6TG1OdmJuUnliMnhzWlhKV1lXeDFaU2s3WEc1Y2RIMWNibjFjYmx4dVpYaHdiM0owSUh0RGIyNTBjbTlzYkdWeVEyaGhibWRsUlhabGJuUjlPMXh1THlvcVhHNGdLaUJQWW1wbFkzUWdjbVZ3Y21WelpXNTBZWFJwYjI0Z2IyWWdZU0J0WlhSaElHVjJaVzUwTGx4dUlDb2dRSEJoY21GdElIdHZZbXBsWTNSOUlHWnBaV3hrY3lBdElIUjVjR1VzSUdSaGRHRmNiaUFxSUVCeVpYUjFjbTRnZTAxbGRHRkZkbVZ1ZEgxY2JpQXFMMXh1WTJ4aGMzTWdUV1YwWVVWMlpXNTBJSHRjYmx4MFkyOXVjM1J5ZFdOMGIzSW9abWxsYkdSektTQjdYRzVjZEZ4MGRHaHBjeTUwZVhCbElEMGdKMjFsZEdFbk8xeHVYSFJjZEhSb2FYTXVaR0YwWVNBOUlGVjBhV3h6TG01MWJXSmxjbFJ2Vm1GeWFXRmliR1ZNWlc1bmRHZ29NSGd3TUNrN0x5OGdVM1JoY25RZ2QybDBhQ0I2WlhKdklIUnBiV1VnWkdWc2RHRmNibHgwWEhSMGFHbHpMbVJoZEdFZ1BTQjBhR2x6TG1SaGRHRXVZMjl1WTJGMEtFTnZibk4wWVc1MGN5NU5SVlJCWDBWV1JVNVVYMGxFTENCbWFXVnNaSE11WkdGMFlTazdYRzVjZEgxY2JuMWNibHh1Wlhod2IzSjBJSHROWlhSaFJYWmxiblI5TzF4dUx5b3FYRzRnS2lCWGNtRndjR1Z5SUdadmNpQnViM1JsVDI1RmRtVnVkQzl1YjNSbFQyWm1SWFpsYm5RZ2IySnFaV04wY3lCMGFHRjBJR0oxYVd4a2N5QmliM1JvSUdWMlpXNTBjeTVjYmlBcUlFQndZWEpoYlNCN2IySnFaV04wZlNCbWFXVnNaSE1nTFNCN2NHbDBZMmc2SUNkYlF6UmRKeXdnWkhWeVlYUnBiMjQ2SUNjMEp5d2dkMkZwZERvZ0p6UW5MQ0IyWld4dlkybDBlVG9nTVMweE1EQjlYRzRnS2lCQWNtVjBkWEp1SUh0T2IzUmxSWFpsYm5SOVhHNGdLaTljYm1Oc1lYTnpJRTV2ZEdWRmRtVnVkQ0I3WEc1Y2RHTnZibk4wY25WamRHOXlLR1pwWld4a2N5a2dlMXh1WEhSY2RIUm9hWE11ZEhsd1pTQmNkRngwUFNBbmJtOTBaU2M3WEc1Y2RGeDBkR2hwY3k1d2FYUmphQ0JjZEZ4MFBTQlZkR2xzY3k1MGIwRnljbUY1S0dacFpXeGtjeTV3YVhSamFDazdYRzVjZEZ4MGRHaHBjeTUzWVdsMElGeDBYSFE5SUdacFpXeGtjeTUzWVdsMElIeDhJREE3WEc1Y2RGeDBkR2hwY3k1a2RYSmhkR2x2YmlCY2REMGdabWxsYkdSekxtUjFjbUYwYVc5dU8xeHVYSFJjZEhSb2FYTXVjMlZ4ZFdWdWRHbGhiQ0E5SUdacFpXeGtjeTV6WlhGMVpXNTBhV0ZzSUh4OElHWmhiSE5sTzF4dVhIUmNkSFJvYVhNdWRtVnNiMk5wZEhrZ1hIUTlJR1pwWld4a2N5NTJaV3h2WTJsMGVTQjhmQ0ExTUR0Y2JseDBYSFIwYUdsekxtTm9ZVzV1Wld3Z1hIUTlJR1pwWld4a2N5NWphR0Z1Ym1Wc0lIeDhJREU3WEc1Y2RGeDBkR2hwY3k1eVpYQmxZWFFnWEhROUlHWnBaV3hrY3k1eVpYQmxZWFFnZkh3Z01UdGNibHgwWEhSMGFHbHpMblpsYkc5amFYUjVJRngwUFNCMGFHbHpMbU52Ym5abGNuUldaV3h2WTJsMGVTaDBhR2x6TG5abGJHOWphWFI1S1R0Y2JseDBYSFIwYUdsekxtZHlZV05sWEhSY2REMGdabWxsYkdSekxtZHlZV05sTzF4dVhIUmNkSFJvYVhNdVluVnBiR1JFWVhSaEtDazdYRzVjZEgxY2JseHVYSFF2S2lwY2JseDBJQ29nUW5WcGJHUnpJR2x1ZENCaGNuSmhlU0JtYjNJZ2RHaHBjeUJsZG1WdWRDNWNibHgwSUNvZ1FISmxkSFZ5YmlCN1RtOTBaVVYyWlc1MGZWeHVYSFFnS2k5Y2JseDBZblZwYkdSRVlYUmhLQ2tnZTF4dVhIUmNkSFJvYVhNdVpHRjBZU0E5SUZ0ZE8xeHVYRzVjZEZ4MGRtRnlJSFJwWTJ0RWRYSmhkR2x2YmlBOUlIUm9hWE11WjJWMFZHbGphMFIxY21GMGFXOXVLSFJvYVhNdVpIVnlZWFJwYjI0c0lDZHViM1JsSnlrN1hHNWNkRngwZG1GeUlISmxjM1JFZFhKaGRHbHZiaUE5SUhSb2FYTXVaMlYwVkdsamEwUjFjbUYwYVc5dUtIUm9hWE11ZDJGcGRDd2dKM0psYzNRbktUdGNibHh1WEhSY2RDOHZJRUZ3Y0d4NUlHZHlZV05sSUc1dmRHVW9jeWtnWVc1a0lITjFZblJ5WVdOMElIUnBZMnR6SUNoamRYSnlaVzUwYkhrZ01TQjBhV05ySUhCbGNpQm5jbUZqWlNCdWIzUmxLU0JtY205dElIUnBZMnRFZFhKaGRHbHZiaUJ6YnlCdVpYUWdkbUZzZFdVZ2FYTWdkR2hsSUhOaGJXVmNibHgwWEhScFppQW9kR2hwY3k1bmNtRmpaU2tnZTF4dVhIUmNkRngwYkdWMElHZHlZV05sUkhWeVlYUnBiMjRnUFNBeE8xeHVYSFJjZEZ4MGRHaHBjeTVuY21GalpTQTlJRlYwYVd4ekxuUnZRWEp5WVhrb2RHaHBjeTVuY21GalpTazdYRzVjZEZ4MFhIUjBhR2x6TG1keVlXTmxMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9jR2wwWTJncElIdGNibHgwWEhSY2RGeDBiR1YwSUc1dmRHVkZkbVZ1ZENBOUlHNWxkeUJPYjNSbFJYWmxiblFvZTNCcGRHTm9PblJvYVhNdVozSmhZMlVzSUdSMWNtRjBhVzl1T2lkVUp5QXJJR2R5WVdObFJIVnlZWFJwYjI1OUtUdGNibHgwWEhSY2RGeDBkR2hwY3k1a1lYUmhJRDBnZEdocGN5NWtZWFJoTG1OdmJtTmhkQ2h1YjNSbFJYWmxiblF1WkdGMFlTbGNibHh1WEhSY2RGeDBYSFIwYVdOclJIVnlZWFJwYjI0Z0xUMGdaM0poWTJWRWRYSmhkR2x2Ymp0Y2JseDBYSFJjZEgwc0lIUm9hWE1wTzF4dVhIUmNkSDFjYmx4dVhIUmNkQzh2SUdacFpXeGtjeTV3YVhSamFDQmpiM1ZzWkNCaVpTQmhiaUJoY25KaGVTQnZaaUJ3YVhSamFHVnpMbHh1WEhSY2RDOHZJRWxtSUhOdklHTnlaV0YwWlNCdWIzUmxJR1YyWlc1MGN5Qm1iM0lnWldGamFDQmhibVFnWVhCd2JIa2dkR2hsSUhOaGJXVWdaSFZ5WVhScGIyNHVYRzVjZEZ4MGRtRnlJRzV2ZEdWUGJpd2dibTkwWlU5bVpqdGNibHgwWEhScFppQW9RWEp5WVhrdWFYTkJjbkpoZVNoMGFHbHpMbkJwZEdOb0tTa2dlMXh1WEhSY2RGeDBMeThnUW5rZ1pHVm1ZWFZzZENCMGFHbHpJR2x6SUdFZ1kyaHZjbVFnYVdZZ2FYUW5jeUJoYmlCaGNuSmhlU0J2WmlCdWIzUmxjeUIwYUdGMElISmxjWFZwY21WeklHOXVaU0JPYjNSbFQyNUZkbVZ1ZEM1Y2JseDBYSFJjZEM4dklFbG1JSFJvYVhNdWMyVnhkV1Z1ZEdsaGJDQTlQVDBnZEhKMVpTQjBhR1Z1SUdsMEozTWdZU0J6WlhGMVpXNTBhV0ZzSUhOMGNtbHVaeUJ2WmlCdWIzUmxjeUIwYUdGMElISmxjWFZwY21WeklITmxjR0Z5WVhSbElFNXZkR1ZQYmtWMlpXNTBjeTVjYmx4MFhIUmNkR2xtSUNnZ0lTQjBhR2x6TG5ObGNYVmxiblJwWVd3cElIdGNibHgwWEhSY2RGeDBMeThnU0dGdVpHeGxJSEpsY0dWaGRGeHVYSFJjZEZ4MFhIUm1iM0lnS0haaGNpQnFJRDBnTURzZ2FpQThJSFJvYVhNdWNtVndaV0YwT3lCcUt5c3BJSHRjYmx4MFhIUmNkRngwWEhRdkx5Qk9iM1JsSUc5dVhHNWNkRngwWEhSY2RGeDBkR2hwY3k1d2FYUmphQzVtYjNKRllXTm9LR1oxYm1OMGFXOXVLSEFzSUdrcElIdGNibHgwWEhSY2RGeDBYSFJjZEdsbUlDaHBJRDA5SURBcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGJtOTBaVTl1SUQwZ2JtVjNJRTV2ZEdWUGJrVjJaVzUwS0h0a1lYUmhPaUJWZEdsc2N5NXVkVzFpWlhKVWIxWmhjbWxoWW14bFRHVnVaM1JvS0hKbGMzUkVkWEpoZEdsdmJpa3VZMjl1WTJGMEtIUm9hWE11WjJWMFRtOTBaVTl1VTNSaGRIVnpLQ2tzSUZWMGFXeHpMbWRsZEZCcGRHTm9LSEFwTENCMGFHbHpMblpsYkc5amFYUjVLWDBwTzF4dVhHNWNkRngwWEhSY2RGeDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUXZMeUJTZFc1dWFXNW5JSE4wWVhSMWN5QW9ZMkZ1SUc5dGJXbDBJSFJvWlNCdWIzUmxJRzl1SUhOMFlYUjFjeWxjYmx4MFhIUmNkRngwWEhSY2RGeDBibTkwWlU5dUlEMGdibVYzSUU1dmRHVlBia1YyWlc1MEtIdGtZWFJoT2lCYk1Dd2dWWFJwYkhNdVoyVjBVR2wwWTJnb2NDa3NJSFJvYVhNdWRtVnNiMk5wZEhsZGZTazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFJjZEhSb2FYTXVaR0YwWVNBOUlIUm9hWE11WkdGMFlTNWpiMjVqWVhRb2JtOTBaVTl1TG1SaGRHRXBPMXh1WEhSY2RGeDBYSFJjZEgwc0lIUm9hWE1wTzF4dVhHNWNkRngwWEhSY2RGeDBMeThnVG05MFpTQnZabVpjYmx4MFhIUmNkRngwWEhSMGFHbHpMbkJwZEdOb0xtWnZja1ZoWTJnb1puVnVZM1JwYjI0b2NDd2dhU2tnZTF4dVhIUmNkRngwWEhSY2RGeDBhV1lnS0drZ1BUMGdNQ2tnZTF4dVhIUmNkRngwWEhSY2RGeDBYSFJ1YjNSbFQyWm1JRDBnYm1WM0lFNXZkR1ZQWm1aRmRtVnVkQ2g3WkdGMFlUb2dWWFJwYkhNdWJuVnRZbVZ5Vkc5V1lYSnBZV0pzWlV4bGJtZDBhQ2gwYVdOclJIVnlZWFJwYjI0cExtTnZibU5oZENoMGFHbHpMbWRsZEU1dmRHVlBabVpUZEdGMGRYTW9LU3dnVlhScGJITXVaMlYwVUdsMFkyZ29jQ2tzSUhSb2FYTXVkbVZzYjJOcGRIa3BmU2s3WEc1Y2JseDBYSFJjZEZ4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkRngwWEhSY2RDOHZJRkoxYm01cGJtY2djM1JoZEhWeklDaGpZVzRnYjIxdGFYUWdkR2hsSUc1dmRHVWdiMlptSUhOMFlYUjFjeWxjYmx4MFhIUmNkRngwWEhSY2RGeDBibTkwWlU5bVppQTlJRzVsZHlCT2IzUmxUMlptUlhabGJuUW9lMlJoZEdFNklGc3dMQ0JWZEdsc2N5NW5aWFJRYVhSamFDaHdLU3dnZEdocGN5NTJaV3h2WTJsMGVWMTlLVHRjYmx4MFhIUmNkRngwWEhSY2RIMWNibHh1WEhSY2RGeDBYSFJjZEZ4MGRHaHBjeTVrWVhSaElEMGdkR2hwY3k1a1lYUmhMbU52Ym1OaGRDaHViM1JsVDJabUxtUmhkR0VwTzF4dVhIUmNkRngwWEhSY2RIMHNJSFJvYVhNcE8xeHVYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkSDBnWld4elpTQjdYRzVjZEZ4MFhIUmNkQzh2SUVoaGJtUnNaU0J5WlhCbFlYUmNibHgwWEhSY2RGeDBabTl5SUNoMllYSWdhaUE5SURBN0lHb2dQQ0IwYUdsekxuSmxjR1ZoZERzZ2Fpc3JLU0I3WEc1Y2RGeDBYSFJjZEZ4MGRHaHBjeTV3YVhSamFDNW1iM0pGWVdOb0tHWjFibU4wYVc5dUtIQXNJR2twSUh0Y2JseDBYSFJjZEZ4MFhIUmNkQzh2SUhKbGMzUkVkWEpoZEdsdmJpQnZibXg1SUdGd2NHeHBaWE1nZEc4Z1ptbHljM1FnYm05MFpWeHVYSFJjZEZ4MFhIUmNkRngwYVdZZ0tHa2dQaUF3S1NCN1hHNWNkRngwWEhSY2RGeDBYSFJjZEhKbGMzUkVkWEpoZEdsdmJpQTlJREE3WEc1Y2RGeDBYSFJjZEZ4MFhIUjlYRzVjYmx4MFhIUmNkRngwWEhSY2RDOHZJRWxtSUdSMWNtRjBhVzl1SUdseklEaDBhQ0IwY21sd2JHVjBjeUIzWlNCdVpXVmtJSFJ2SUcxaGEyVWdjM1Z5WlNCMGFHRjBJSFJvWlNCMGIzUmhiQ0IwYVdOcmN5QTlQU0J4ZFdGeWRHVnlJRzV2ZEdVdVhHNWNkRngwWEhSY2RGeDBYSFF2THlCVGJ5d2dkR2hsSUd4aGMzUWdiMjVsSUhkcGJHd2dibVZsWkNCMGJ5QmlaU0IwYUdVZ2NtVnRZV2x1WkdWeVhHNWNkRngwWEhSY2RGeDBYSFJwWmlBb2RHaHBjeTVrZFhKaGRHbHZiaUE5UFQwZ0p6aDBKeUFtSmlCcElEMDlJSFJvYVhNdWNHbDBZMmd1YkdWdVozUm9JQzBnTVNrZ2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSc1pYUWdjWFZoY25SbGNsUnBZMnR6SUQwZ1ZYUnBiSE11Ym5WdFltVnlSbkp2YlVKNWRHVnpLRU52Ym5OMFlXNTBjeTVJUlVGRVJWSmZRMGhWVGt0ZlJFbFdTVk5KVDA0cE8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSMGFXTnJSSFZ5WVhScGIyNGdQU0J4ZFdGeWRHVnlWR2xqYTNNZ0xTQW9kR2xqYTBSMWNtRjBhVzl1SUNvZ01pazdYRzVjZEZ4MFhIUmNkRngwWEhSOVhHNWNibHgwWEhSY2RGeDBYSFJjZEc1dmRHVlBiaUE5SUc1bGR5Qk9iM1JsVDI1RmRtVnVkQ2g3WkdGMFlUb2dWWFJwYkhNdWJuVnRZbVZ5Vkc5V1lYSnBZV0pzWlV4bGJtZDBhQ2h5WlhOMFJIVnlZWFJwYjI0cExtTnZibU5oZENoYmRHaHBjeTVuWlhST2IzUmxUMjVUZEdGMGRYTW9LU3dnVlhScGJITXVaMlYwVUdsMFkyZ29jQ2tzSUhSb2FYTXVkbVZzYjJOcGRIbGRLWDBwTzF4dVhIUmNkRngwWEhSY2RGeDBibTkwWlU5bVppQTlJRzVsZHlCT2IzUmxUMlptUlhabGJuUW9lMlJoZEdFNklGVjBhV3h6TG01MWJXSmxjbFJ2Vm1GeWFXRmliR1ZNWlc1bmRHZ29kR2xqYTBSMWNtRjBhVzl1S1M1amIyNWpZWFFvVzNSb2FYTXVaMlYwVG05MFpVOW1abE4wWVhSMWN5Z3BMQ0JWZEdsc2N5NW5aWFJRYVhSamFDaHdLU3dnZEdocGN5NTJaV3h2WTJsMGVWMHBmU2s3WEc1Y2JseDBYSFJjZEZ4MFhIUmNkSFJvYVhNdVpHRjBZU0E5SUhSb2FYTXVaR0YwWVM1amIyNWpZWFFvYm05MFpVOXVMbVJoZEdFc0lHNXZkR1ZQWm1ZdVpHRjBZU2s3WEc1Y2RGeDBYSFJjZEZ4MGZTd2dkR2hwY3lrN1hHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RIMWNibHh1WEhSY2RGeDBjbVYwZFhKdUlIUm9hWE03WEc1Y2RGeDBmVnh1WEc1Y2RGeDBkR2h5YjNjZ0ozQnBkR05vSUcxMWMzUWdZbVVnWVc0Z1lYSnlZWGt1Snp0Y2JseDBmVHRjYmx4dVhIUXZLaXBjYmx4MElDb2dRMjl1ZG1WeWRITWdkbVZzYjJOcGRIa2dkRzhnZG1Gc2RXVWdNQzB4TWpkY2JseDBJQ29nUUhCaGNtRnRJSHR1ZFcxaVpYSjlJSFpsYkc5amFYUjVJQzBnVm1Wc2IyTnBkSGtnZG1Gc2RXVWdNUzB4TURCY2JseDBJQ29nUUhKbGRIVnliaUI3Ym5WdFltVnlmVnh1WEhRZ0tpOWNibHgwWTI5dWRtVnlkRlpsYkc5amFYUjVLSFpsYkc5amFYUjVLU0I3WEc1Y2RGeDBMeThnVFdGNElIQmhjM05sWkNCMllXeDFaU0JzYVcxcGRHVmtJSFJ2SURFd01GeHVYSFJjZEhabGJHOWphWFI1SUQwZ2RtVnNiMk5wZEhrZ1BpQXhNREFnUHlBeE1EQWdPaUIyWld4dlkybDBlVHRjYmx4MFhIUnlaWFIxY200Z1RXRjBhQzV5YjNWdVpDaDJaV3h2WTJsMGVTQXZJREV3TUNBcUlERXlOeWs3WEc1Y2RIMDdYRzVjYmx4MEx5b3FYRzVjZENBcUlFZGxkSE1nZEdobElIUnZkR0ZzSUc1MWJXSmxjaUJ2WmlCMGFXTnJjeUJpWVhObFpDQnZiaUJ3WVhOelpXUWdaSFZ5WVhScGIyNHVYRzVjZENBcUlFNXZkR1U2SUhSNWNHVTlQU2R1YjNSbEp5QmtaV1poZFd4MGN5QjBieUJ4ZFdGeWRHVnlJRzV2ZEdVc0lIUjVjR1U5UFQwbmNtVnpkQ2NnWkdWbVlYVnNkSE1nZEc4Z01GeHVYSFFnS2lCQWNHRnlZVzBnZXloemRISnBibWQ4WVhKeVlYa3BmU0JrZFhKaGRHbHZibHh1WEhRZ0tpQkFjR0Z5WVcwZ2UzTjBjbWx1WjMwZ2RIbHdaU0JiSjI1dmRHVW5MQ0FuY21WemRDZGRYRzVjZENBcUlFQnlaWFIxY200Z2UyNTFiV0psY24xY2JseDBJQ292WEc1Y2RHZGxkRlJwWTJ0RWRYSmhkR2x2Ymloa2RYSmhkR2x2Yml3Z2RIbHdaU2tnZTF4dVhIUmNkR2xtSUNoQmNuSmhlUzVwYzBGeWNtRjVLR1IxY21GMGFXOXVLU2tnZTF4dVhIUmNkRngwTHk4Z1VtVmpkWEp6YVhabGJIa2daWGhsWTNWMFpTQjBhR2x6SUcxbGRHaHZaQ0JtYjNJZ1pXRmphQ0JwZEdWdElHbHVJSFJvWlNCaGNuSmhlU0JoYm1RZ2NtVjBkWEp1SUhSb1pTQnpkVzBnYjJZZ2RHbGpheUJrZFhKaGRHbHZibk11WEc1Y2RGeDBYSFJ5WlhSMWNtNGdaSFZ5WVhScGIyNHViV0Z3S0daMWJtTjBhVzl1S0haaGJIVmxLU0I3WEc1Y2RGeDBYSFJjZEhKbGRIVnliaUIwYUdsekxtZGxkRlJwWTJ0RWRYSmhkR2x2YmloMllXeDFaU3dnZEhsd1pTazdYRzVjZEZ4MFhIUjlMQ0IwYUdsektTNXlaV1IxWTJVb1puVnVZM1JwYjI0b1lTd2dZaWtnZTF4dVhIUmNkRngwWEhSeVpYUjFjbTRnWVNBcklHSTdYRzVjZEZ4MFhIUjlMQ0F3S1R0Y2JseDBYSFI5WEc1Y2JseDBYSFJrZFhKaGRHbHZiaUE5SUdSMWNtRjBhVzl1TG5SdlUzUnlhVzVuS0NrN1hHNWNibHgwWEhScFppQW9aSFZ5WVhScGIyNHVkRzlNYjNkbGNrTmhjMlVvS1M1amFHRnlRWFFvTUNrZ1BUMDlJQ2QwSnlrZ2UxeHVYSFJjZEZ4MEx5OGdTV1lnWkhWeVlYUnBiMjRnYzNSaGNuUnpJSGRwZEdnZ0ozUW5JSFJvWlc0Z2RHaGxJRzUxYldKbGNpQjBhR0YwSUdadmJHeHZkM01nYVhNZ1lXNGdaWGh3YkdsamFYUWdkR2xqYXlCamIzVnVkRnh1WEhSY2RGeDBjbVYwZFhKdUlIQmhjbk5sU1c1MEtHUjFjbUYwYVc5dUxuTjFZbk4wY21sdVp5Z3hLU2s3WEc1Y2RGeDBmVnh1WEc1Y2RGeDBMeThnVG1WbFpDQjBieUJoY0hCc2VTQmtkWEpoZEdsdmJpQm9aWEpsTGlBZ1VYVmhjblJsY2lCdWIzUmxJRDA5SUVOdmJuTjBZVzUwY3k1SVJVRkVSVkpmUTBoVlRrdGZSRWxXU1ZOSlQwNWNibHgwWEhRdkx5QlNiM1Z1WkdsdVp5QnZibXg1SUdGd2NHeHBaWE1nZEc4Z2RISnBjR3hsZEhNc0lIZG9hV05vSUhSb1pTQnlaVzFoYVc1a1pYSWdhWE1nYUdGdVpHeGxaQ0JpWld4dmQxeHVYSFJjZEhaaGNpQnhkV0Z5ZEdWeVZHbGphM01nUFNCVmRHbHNjeTV1ZFcxaVpYSkdjbTl0UW5sMFpYTW9RMjl1YzNSaGJuUnpMa2hGUVVSRlVsOURTRlZPUzE5RVNWWkpVMGxQVGlrN1hHNWNkRngwY21WMGRYSnVJRTFoZEdndWNtOTFibVFvY1hWaGNuUmxjbFJwWTJ0eklDb2dkR2hwY3k1blpYUkVkWEpoZEdsdmJrMTFiSFJwY0d4cFpYSW9aSFZ5WVhScGIyNHNJSFI1Y0dVcEtUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJIWlhSeklIZG9ZWFFnZEc4Z2JYVnNkR2x3YkdVZ2RHbGphM012Y1hWaGNuUmxjaUJ1YjNSbElHSjVJSFJ2SUdkbGRDQjBhR1VnYzNCbFkybG1hV1ZrSUdSMWNtRjBhVzl1TGx4dVhIUWdLaUJPYjNSbE9pQjBlWEJsUFQwbmJtOTBaU2NnWkdWbVlYVnNkSE1nZEc4Z2NYVmhjblJsY2lCdWIzUmxMQ0IwZVhCbFBUMDlKM0psYzNRbklHUmxabUYxYkhSeklIUnZJREJjYmx4MElDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlHUjFjbUYwYVc5dVhHNWNkQ0FxSUVCd1lYSmhiU0I3YzNSeWFXNW5mU0IwZVhCbElGc25ibTkwWlNjc0ozSmxjM1FuWFZ4dVhIUWdLaUJBY21WMGRYSnVJSHR1ZFcxaVpYSjlYRzVjZENBcUwxeHVYSFJuWlhSRWRYSmhkR2x2YmsxMWJIUnBjR3hwWlhJb1pIVnlZWFJwYjI0c0lIUjVjR1VwSUh0Y2JseDBYSFF2THlCT1pXVmtJSFJ2SUdGd2NHeDVJR1IxY21GMGFXOXVJR2hsY21VdUlDQlJkV0Z5ZEdWeUlHNXZkR1VnUFQwZ1EyOXVjM1JoYm5SekxraEZRVVJGVWw5RFNGVk9TMTlFU1ZaSlUwbFBUbHh1WEhSY2RITjNhWFJqYUNBb1pIVnlZWFJwYjI0cElIdGNibHgwWEhSY2RHTmhjMlVnSnpBbk9seHVYSFJjZEZ4MFhIUnlaWFIxY200Z01EdGNibHgwWEhSY2RHTmhjMlVnSnpFbk9seHVYSFJjZEZ4MFhIUnlaWFIxY200Z05EdGNibHgwWEhSY2RHTmhjMlVnSnpJbk9seHVYSFJjZEZ4MFhIUnlaWFIxY200Z01qdGNibHgwWEhSY2RHTmhjMlVnSjJReUp6cGNibHgwWEhSY2RGeDBjbVYwZFhKdUlETTdYRzVjZEZ4MFhIUmpZWE5sSUNjMEp6cGNibHgwWEhSY2RGeDBjbVYwZFhKdUlERTdYRzVjZEZ4MFhIUmpZWE5sSUNjMGRDYzZYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQXdMalkyTmp0Y2JseDBYSFJjZEdOaGMyVWdKMlEwSnpwY2JseDBYSFJjZEZ4MGNtVjBkWEp1SURFdU5UdGNibHgwWEhSY2RHTmhjMlVnSnpnbk9seHVYSFJjZEZ4MFhIUnlaWFIxY200Z01DNDFPMXh1WEhSY2RGeDBZMkZ6WlNBbk9IUW5PbHh1WEhSY2RGeDBYSFF2THlCR2IzSWdPSFJvSUhSeWFYQnNaWFJ6TENCc1pYUW5jeUJrYVhacFpHVWdZU0J4ZFdGeWRHVnlJR0o1SURNc0lISnZkVzVrSUhSdklIUm9aU0J1WldGeVpYTjBJR2x1ZEN3Z1lXNWtJSE4xWW5OMGNtRmpkQ0IwYUdVZ2NtVnRZV2x1WkdWeUlIUnZJSFJvWlNCc1lYTjBJRzl1WlM1Y2JseDBYSFJjZEZ4MGNtVjBkWEp1SURBdU16TTdYRzVjZEZ4MFhIUmpZWE5sSUNka09DYzZYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQXdMamMxTzF4dVhIUmNkRngwWTJGelpTQW5NVFluT2x4dVhIUmNkRngwWEhSeVpYUjFjbTRnTUM0eU5UdGNibHgwWEhSY2RHTmhjMlVnSnpFMmRDYzZYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQXdMakUyTmp0Y2JseDBYSFJjZEdOaGMyVWdKek15SnpwY2JseDBYSFJjZEZ4MGNtVjBkWEp1SURBdU1USTFPMXh1WEhSY2RGeDBZMkZ6WlNBbk5qUW5PbHh1WEhSY2RGeDBYSFJ5WlhSMWNtNGdNQzR3TmpJMU8xeHVYSFJjZEZ4MFpHVm1ZWFZzZERwY2JseDBYSFJjZEZ4MEx5OGdUbTkwWlhNZ1pHVm1ZWFZzZENCMGJ5QmhJSEYxWVhKMFpYSXNJSEpsYzNSeklHUmxabUYxYkhRZ2RHOGdNRnh1WEhSY2RGeDBYSFF2TDNKbGRIVnliaUIwZVhCbElEMDlQU0FuYm05MFpTY2dQeUF4SURvZ01EdGNibHgwWEhSOVhHNWNibHgwWEhSMGFISnZkeUJrZFhKaGRHbHZiaUFySUNjZ2FYTWdibTkwSUdFZ2RtRnNhV1FnWkhWeVlYUnBiMjR1Snp0Y2JseDBmVHRjYmx4dVhIUXZLaXBjYmx4MElDb2dSMlYwY3lCMGFHVWdibTkwWlNCdmJpQnpkR0YwZFhNZ1kyOWtaU0JpWVhObFpDQnZiaUIwYUdVZ2MyVnNaV04wWldRZ1kyaGhibTVsYkM0Z01IZzVlekF0Um4xY2JseDBJQ29nVG05MFpTQnZiaUJoZENCamFHRnVibVZzSURBZ2FYTWdNSGc1TUNBb01UUTBLVnh1WEhRZ0tpQXdJRDBnUTJnZ01WeHVYSFFnS2lCQWNtVjBkWEp1SUh0dWRXMWlaWEo5WEc1Y2RDQXFMMXh1WEhSblpYUk9iM1JsVDI1VGRHRjBkWE1vS1NCN2NtVjBkWEp1SURFME5DQXJJSFJvYVhNdVkyaGhibTVsYkNBdElERjlYRzVjYmx4MEx5b3FYRzVjZENBcUlFZGxkSE1nZEdobElHNXZkR1VnYjJabUlITjBZWFIxY3lCamIyUmxJR0poYzJWa0lHOXVJSFJvWlNCelpXeGxZM1JsWkNCamFHRnVibVZzTGlBd2VEaDdNQzFHZlZ4dVhIUWdLaUJPYjNSbElHOW1aaUJoZENCamFHRnVibVZzSURBZ2FYTWdNSGc0TUNBb01USTRLVnh1WEhRZ0tpQXdJRDBnUTJnZ01WeHVYSFFnS2lCQWNtVjBkWEp1SUh0dWRXMWlaWEo5WEc1Y2RDQXFMMXh1WEhSblpYUk9iM1JsVDJabVUzUmhkSFZ6S0NrZ2UzSmxkSFZ5YmlBeE1qZ2dLeUIwYUdsekxtTm9ZVzV1Wld3Z0xTQXhmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ2UwNXZkR1ZGZG1WdWRIMDdYRzR2S2lwY2JpQXFJRWh2YkdSeklHRnNiQ0JrWVhSaElHWnZjaUJoSUZ3aWJtOTBaU0J2Wm1aY0lpQk5TVVJKSUdWMlpXNTBYRzRnS2lCQWNHRnlZVzBnZTI5aWFtVmpkSDBnWm1sbGJHUnpJSHRrWVhSaE9pQmJYWDFjYmlBcUlFQnlaWFIxY200Z2UwNXZkR1ZQWm1aRmRtVnVkSDFjYmlBcUwxeHVZMnhoYzNNZ1RtOTBaVTltWmtWMlpXNTBJSHRjYmx4MFkyOXVjM1J5ZFdOMGIzSW9abWxsYkdSektTQjdYRzVjZEZ4MGRHaHBjeTVrWVhSaElEMGdabWxsYkdSekxtUmhkR0U3WEc1Y2RIMWNibjFjYmx4dVpYaHdiM0owSUh0T2IzUmxUMlptUlhabGJuUjlPMXh1THlvcVhHNGdLaUJJYjJ4a2N5QmhiR3dnWkdGMFlTQm1iM0lnWVNCY0ltNXZkR1VnYjI1Y0lpQk5TVVJKSUdWMlpXNTBYRzRnS2lCQWNHRnlZVzBnZTI5aWFtVmpkSDBnWm1sbGJHUnpJSHRrWVhSaE9pQmJYWDFjYmlBcUlFQnlaWFIxY200Z2UwNXZkR1ZQYmtWMlpXNTBmVnh1SUNvdlhHNWpiR0Z6Y3lCT2IzUmxUMjVGZG1WdWRDQjdYRzVjZEdOdmJuTjBjblZqZEc5eUtHWnBaV3hrY3lrZ2UxeHVYSFJjZEhSb2FYTXVaR0YwWVNBOUlHWnBaV3hrY3k1a1lYUmhPMXh1WEhSOVhHNTlYRzVjYm1WNGNHOXlkQ0I3VG05MFpVOXVSWFpsYm5SOU8xeHVMeW9xWEc0Z0tpQkliMnhrY3lCaGJHd2daR0YwWVNCbWIzSWdZU0JjSW5CeWIyZHlZVzBnWTJoaGJtZGxYQ0lnVFVsRVNTQmxkbVZ1ZEZ4dUlDb2dRSEJoY21GdElIdHZZbXBsWTNSOUlHWnBaV3hrY3lCN2FXNXpkSEoxYldWdWREb2dhVzUwWldkbGNuMWNiaUFxSUVCeVpYUjFjbTRnZTFCeWIyZHlZVzFEYUdGdVoyVkZkbVZ1ZEgxY2JpQXFMMXh1WTJ4aGMzTWdVSEp2WjNKaGJVTm9ZVzVuWlVWMlpXNTBJSHRjYmx4MFkyOXVjM1J5ZFdOMGIzSW9abWxsYkdSektTQjdYRzVjZEZ4MGRHaHBjeTUwZVhCbElEMGdKM0J5YjJkeVlXMG5PMXh1WEhSY2RDOHZJR1JsYkhSaElIUnBiV1VnWkdWbVlYVnNkSE1nZEc4Z01DNWNibHgwWEhSMGFHbHpMbVJoZEdFZ1BTQlZkR2xzY3k1dWRXMWlaWEpVYjFaaGNtbGhZbXhsVEdWdVozUm9LREI0TURBcExtTnZibU5oZENoRGIyNXpkR0Z1ZEhNdVVGSlBSMUpCVFY5RFNFRk9SMFZmVTFSQlZGVlRMQ0JtYVdWc1pITXVhVzV6ZEhKMWJXVnVkQ2s3WEc1Y2RIMWNibjFjYmx4dVpYaHdiM0owSUh0UWNtOW5jbUZ0UTJoaGJtZGxSWFpsYm5SOU8xeHVMeW9xWEc0Z0tpQkliMnhrY3lCaGJHd2daR0YwWVNCbWIzSWdZU0IwY21GamF5NWNiaUFxSUVCd1lYSmhiU0I3YjJKcVpXTjBmU0JtYVdWc1pITWdlM1I1Y0dVNklHNTFiV0psY2l3Z1pHRjBZVG9nWVhKeVlYa3NJSE5wZW1VNklHRnljbUY1TENCbGRtVnVkSE02SUdGeWNtRjVmVnh1SUNvZ1FISmxkSFZ5YmlCN1ZISmhZMnQ5WEc0Z0tpOWNibU5zWVhOeklGUnlZV05ySUh0Y2JseDBZMjl1YzNSeWRXTjBiM0lvS1NCN1hHNWNkRngwZEdocGN5NTBlWEJsSUQwZ1EyOXVjM1JoYm5SekxsUlNRVU5MWDBOSVZVNUxYMVJaVUVVN1hHNWNkRngwZEdocGN5NWtZWFJoSUQwZ1cxMDdYRzVjZEZ4MGRHaHBjeTV6YVhwbElEMGdXMTA3WEc1Y2RGeDBkR2hwY3k1bGRtVnVkSE1nUFNCYlhUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJCWkdSeklHRnVlU0JsZG1WdWRDQjBlWEJsSUhSdklIUm9aU0IwY21GamF5NWNibHgwSUNvZ1FIQmhjbUZ0SUhzb1RtOTBaVVYyWlc1MGZFMWxkR0ZGZG1WdWRIeFFjbTluY21GdFEyaGhibWRsUlhabGJuUXBmU0JsZG1WdWRDQXRJRVYyWlc1MElHOWlhbVZqZEM1Y2JseDBJQ29nUUhCaGNtRnRJSHRtZFc1amRHbHZibjBnYldGd1JuVnVZM1JwYjI0Z0xTQkRZV3hzWW1GamF5QjNhR2xqYUNCallXNGdZbVVnZFhObFpDQjBieUJoY0hCc2VTQnpjR1ZqYVdacFl5QndjbTl3WlhKMGFXVnpJSFJ2SUdGc2JDQmxkbVZ1ZEhNdUlGeHVYSFFnS2lCQWNtVjBkWEp1SUh0VWNtRmphMzFjYmx4MElDb3ZYRzVjZEdGa1pFVjJaVzUwS0dWMlpXNTBMQ0J0WVhCR2RXNWpkR2x2YmlrZ2UxeHVYSFJjZEdsbUlDaEJjbkpoZVM1cGMwRnljbUY1S0dWMlpXNTBLU2tnZTF4dVhIUmNkRngwWlhabGJuUXVabTl5UldGamFDaG1kVzVqZEdsdmJpaGxMQ0JwS1NCN1hHNWNkRngwWEhSY2RDOHZJRWhoYm1Sc1pTQnRZWEFnWm5WdVkzUnBiMjRnYVdZZ2NISnZkbWxrWldSY2JseDBYSFJjZEZ4MGFXWWdLSFI1Y0dWdlppQnRZWEJHZFc1amRHbHZiaUE5UFQwZ0oyWjFibU4wYVc5dUp5QW1KaUJsTG5SNWNHVWdQVDA5SUNkdWIzUmxKeWtnZTF4dVhIUmNkRngwWEhSY2RIWmhjaUJ3Y205d1pYSjBhV1Z6SUQwZ2JXRndSblZ1WTNScGIyNG9hU3dnWlNrN1hHNWNibHgwWEhSY2RGeDBYSFJwWmlBb2RIbHdaVzltSUhCeWIzQmxjblJwWlhNZ1BUMDlJQ2R2WW1wbFkzUW5LU0I3WEc1Y2RGeDBYSFJjZEZ4MFhIUm1iM0lnS0haaGNpQnFJR2x1SUhCeWIzQmxjblJwWlhNcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MGMzZHBkR05vS0dvcElIdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmpZWE5sSUNka2RYSmhkR2x2YmljNlhHNWNkRngwWEhSY2RGeDBYSFJjZEZ4MFhIUmxMbVIxY21GMGFXOXVJRDBnY0hKdmNHVnlkR2xsYzF0cVhUdGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkR0p5WldGck8xeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RHTmhjMlVnSjNObGNYVmxiblJwWVd3bk9seHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RGeDBaUzV6WlhGMVpXNTBhV0ZzSUQwZ2NISnZjR1Z5ZEdsbGMxdHFYVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEdKeVpXRnJPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUmNkR05oYzJVZ0ozWmxiRzlqYVhSNUp6cGNibHgwWEhSY2RGeDBYSFJjZEZ4MFhIUmNkR1V1ZG1Wc2IyTnBkSGtnUFNCbExtTnZiblpsY25SV1pXeHZZMmwwZVNod2NtOXdaWEowYVdWelcycGRLVHRjYmx4MFhIUmNkRngwWEhSY2RGeDBYSFJjZEdKeVpXRnJPMXh1WEhSY2RGeDBYSFJjZEZ4MFhIUjlYRzVjZEZ4MFhIUmNkRngwWEhSOVhIUmNkRnh1WEc1Y2RGeDBYSFJjZEZ4MFhIUXZMeUJIYjNSMFlTQmlkV2xzWkNCMGFHRjBJR1JoZEdGY2JseDBYSFJjZEZ4MFhIUmNkR1V1WW5WcGJHUkVZWFJoS0NrN1hHNWNkRngwWEhSY2RGeDBmVnh1WEhSY2RGeDBYSFI5WEc1Y2JseDBYSFJjZEZ4MGRHaHBjeTVrWVhSaElEMGdkR2hwY3k1a1lYUmhMbU52Ym1OaGRDaGxMbVJoZEdFcE8xeHVYSFJjZEZ4MFhIUjBhR2x6TG5OcGVtVWdQU0JWZEdsc2N5NXVkVzFpWlhKVWIwSjVkR1Z6S0hSb2FYTXVaR0YwWVM1c1pXNW5kR2dzSURRcE95QXZMeUEwSUdKNWRHVnpJR3h2Ym1kY2JseDBYSFJjZEZ4MGRHaHBjeTVsZG1WdWRITXVjSFZ6YUNobEtUdGNibHgwWEhSY2RIMHNJSFJvYVhNcE8xeHVYRzVjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEhSb2FYTXVaR0YwWVNBOUlIUm9hWE11WkdGMFlTNWpiMjVqWVhRb1pYWmxiblF1WkdGMFlTazdYRzVjZEZ4MFhIUjBhR2x6TG5OcGVtVWdQU0JWZEdsc2N5NXVkVzFpWlhKVWIwSjVkR1Z6S0hSb2FYTXVaR0YwWVM1c1pXNW5kR2dzSURRcE95QXZMeUEwSUdKNWRHVnpJR3h2Ym1kY2JseDBYSFJjZEhSb2FYTXVaWFpsYm5SekxuQjFjMmdvWlhabGJuUXBPMXh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpPMXh1WEhSOVhHNWNibHgwTHlvcVhHNWNkQ0FxSUZObGRITWdkR1Z0Y0c4Z2IyWWdkR2hsSUUxSlJFa2dabWxzWlM1Y2JseDBJQ29nUUhCaGNtRnRJSHR1ZFcxaVpYSjlJR0p3YlNBdElGUmxiWEJ2SUdsdUlHSmxZWFJ6SUhCbGNpQnRhVzUxZEdVdVhHNWNkQ0FxSUVCeVpYUjFjbTRnZTFSeVlXTnJmVnh1WEhRZ0tpOWNibHgwYzJWMFZHVnRjRzhvWW5CdEtTQjdYRzVjZEZ4MGRtRnlJR1YyWlc1MElEMGdibVYzSUUxbGRHRkZkbVZ1ZENoN1pHRjBZVG9nVzBOdmJuTjBZVzUwY3k1TlJWUkJYMVJGVFZCUFgwbEVYWDBwTzF4dVhIUmNkR1YyWlc1MExtUmhkR0V1Y0hWemFDZ3dlREF6S1RzZ0x5OGdVMmw2WlZ4dVhIUmNkSFpoY2lCMFpXMXdieUE5SUUxaGRHZ3VjbTkxYm1Rb05qQXdNREF3TURBZ0x5QmljRzBwTzF4dVhIUmNkR1YyWlc1MExtUmhkR0VnUFNCbGRtVnVkQzVrWVhSaExtTnZibU5oZENoVmRHbHNjeTV1ZFcxaVpYSlViMEo1ZEdWektIUmxiWEJ2TENBektTazdJQzh2SUZSbGJYQnZMQ0F6SUdKNWRHVnpYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVZV1JrUlhabGJuUW9aWFpsYm5RcE8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRk5sZEhNZ2RHbHRaU0J6YVdkdVlYUjFjbVV1WEc1Y2RDQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQnVkVzFsY21GMGIzSWdMU0JVYjNBZ2JuVnRZbVZ5SUc5bUlIUm9aU0IwYVcxbElITnBaMjVoZEhWeVpTNWNibHgwSUNvZ1FIQmhjbUZ0SUh0dWRXMWlaWEo5SUdSbGJtOXRhVzVoZEc5eUlDMGdRbTkwZEc5dElHNTFiV0psY2lCdlppQjBhR1VnZEdsdFpTQnphV2R1WVhSMWNtVXVYRzVjZENBcUlFQndZWEpoYlNCN2JuVnRZbVZ5ZlNCdGFXUnBZMnh2WTJ0emNHVnlkR2xqYXlBdElFUmxabUYxYkhSeklIUnZJREkwTGx4dVhIUWdLaUJBY0dGeVlXMGdlMjUxYldKbGNuMGdibTkwWlhOd1pYSnRhV1JwWTJ4dlkyc2dMU0JFWldaaGRXeDBjeUIwYnlBNExseHVYSFFnS2lCQWNtVjBkWEp1SUh0VWNtRmphMzFjYmx4MElDb3ZYRzVjZEhObGRGUnBiV1ZUYVdkdVlYUjFjbVVvYm5WdFpYSmhkRzl5TENCa1pXNXZiV2x1WVhSdmNpd2diV2xrYVdOc2IyTnJjM0JsY25ScFkyc3NJRzV2ZEdWemNHVnliV2xrYVdOc2IyTnJLU0I3WEc1Y2RGeDBiV2xrYVdOc2IyTnJjM0JsY25ScFkyc2dQU0J0YVdScFkyeHZZMnR6Y0dWeWRHbGpheUI4ZkNBeU5EdGNibHgwWEhSdWIzUmxjM0JsY20xcFpHbGpiRzlqYXlBOUlHNXZkR1Z6Y0dWeWJXbGthV05zYjJOcklIeDhJRGc3WEc1Y2RGeDBYRzVjZEZ4MGRtRnlJR1YyWlc1MElEMGdibVYzSUUxbGRHRkZkbVZ1ZENoN1pHRjBZVG9nVzBOdmJuTjBZVzUwY3k1TlJWUkJYMVJKVFVWZlUwbEhUa0ZVVlZKRlgwbEVYWDBwTzF4dVhIUmNkR1YyWlc1MExtUmhkR0V1Y0hWemFDZ3dlREEwS1RzZ0x5OGdVMmw2WlZ4dVhIUmNkR1YyWlc1MExtUmhkR0VnUFNCbGRtVnVkQzVrWVhSaExtTnZibU5oZENoVmRHbHNjeTV1ZFcxaVpYSlViMEo1ZEdWektHNTFiV1Z5WVhSdmNpd2dNU2twT3lBdkx5Qk9kVzFsY21GMGIzSXNJREVnWW5sMFpYTmNibHgwWEhSY2JseDBYSFIyWVhJZ1gyUmxibTl0YVc1aGRHOXlJRDBnVFdGMGFDNXNiMmN5S0dSbGJtOXRhVzVoZEc5eUtUdGNkQzh2SUVSbGJtOXRhVzVoZEc5eUlHbHpJR1Y0Y0hKbGMzTmxaQ0JoY3lCd2IzY2diMllnTWx4dVhIUmNkR1YyWlc1MExtUmhkR0VnUFNCbGRtVnVkQzVrWVhSaExtTnZibU5oZENoVmRHbHNjeTV1ZFcxaVpYSlViMEo1ZEdWektGOWtaVzV2YldsdVlYUnZjaXdnTVNrcE95QXZMeUJFWlc1dmJXbHVZWFJ2Y2l3Z01TQmllWFJsYzF4dVhIUmNkR1YyWlc1MExtUmhkR0VnUFNCbGRtVnVkQzVrWVhSaExtTnZibU5oZENoVmRHbHNjeTV1ZFcxaVpYSlViMEo1ZEdWektHMXBaR2xqYkc5amEzTndaWEowYVdOckxDQXhLU2s3SUM4dklFMUpSRWtnUTJ4dlkydHpJSEJsY2lCMGFXTnJMQ0F4SUdKNWRHVnpYRzVjZEZ4MFpYWmxiblF1WkdGMFlTQTlJR1YyWlc1MExtUmhkR0V1WTI5dVkyRjBLRlYwYVd4ekxtNTFiV0psY2xSdlFubDBaWE1vYm05MFpYTndaWEp0YVdScFkyeHZZMnNzSURFcEtUc2dMeThnVG5WdFltVnlJRzltSURFdk16SWdibTkwWlhNZ2NHVnlJRTFKUkVrZ1kyeHZZMnR6TENBeElHSjVkR1Z6WEc1Y2RGeDBjbVYwZFhKdUlIUm9hWE11WVdSa1JYWmxiblFvWlhabGJuUXBPMXh1WEhSOVhHNWNibHgwTHlvcVhHNWNkQ0FxSUZObGRITWdhMlY1SUhOcFoyNWhkSFZ5WlM1Y2JseDBJQ29nUUhCaGNtRnRJSHNxZlNCelppQXRJRnh1WEhRZ0tpQkFjR0Z5WVcwZ2V5cDlJRzFwSUMxY2JseDBJQ29nUUhKbGRIVnliaUI3VkhKaFkydDlYRzVjZENBcUwxeHVYSFJ6WlhSTFpYbFRhV2R1WVhSMWNtVW9jMllzSUcxcEtTQjdYRzVjZEZ4MGRtRnlJR1YyWlc1MElEMGdibVYzSUUxbGRHRkZkbVZ1ZENoN1pHRjBZVG9nVzBOdmJuTjBZVzUwY3k1TlJWUkJYMHRGV1Y5VFNVZE9RVlJWVWtWZlNVUmRmU2s3WEc1Y2RGeDBaWFpsYm5RdVpHRjBZUzV3ZFhOb0tEQjRNRElwT3lBdkx5QlRhWHBsWEc1Y2JseDBYSFIyWVhJZ2JXOWtaU0E5SUcxcElIeDhJREE3WEc1Y2RGeDBjMllnUFNCelppQjhmQ0F3TzF4dVhHNWNkRngwTHk5Y2RFWjFibU4wYVc5dUlHTmhiR3hsWkNCM2FYUm9JSE4wY21sdVp5QnViM1JoZEdsdmJseHVYSFJjZEdsbUlDaDBlWEJsYjJZZ2JXa2dQVDA5SUNkMWJtUmxabWx1WldRbktTQjdYRzVjZEZ4MFhIUjJZWElnWm1sbWRHaHpJRDBnVzF4dVhIUmNkRngwWEhSYkowTmlKeXdnSjBkaUp5d2dKMFJpSnl3Z0owRmlKeXdnSjBWaUp5d2dKMEppSnl3Z0owWW5MQ0FuUXljc0lDZEhKeXdnSjBRbkxDQW5RU2NzSUNkRkp5d2dKMEluTENBblJpTW5MQ0FuUXlNblhTeGNibHgwWEhSY2RGeDBXeWRoWWljc0lDZGxZaWNzSUNkaVlpY3NJQ2RtSnl3Z0oyTW5MQ0FuWnljc0lDZGtKeXdnSjJFbkxDQW5aU2NzSUNkaUp5d2dKMllqSnl3Z0oyTWpKeXdnSjJjakp5d2dKMlFqSnl3Z0oyRWpKMTFjYmx4MFhIUmNkRjA3WEc1Y2RGeDBYSFIyWVhJZ1gzTm1iR1Z1SUQwZ2MyWXViR1Z1WjNSb08xeHVYSFJjZEZ4MGRtRnlJRzV2ZEdVZ1BTQnpaaUI4ZkNBblF5YzdYRzVjYmx4MFhIUmNkR2xtSUNoelpsc3dYU0E5UFQwZ2MyWmJNRjB1ZEc5TWIzZGxja05oYzJVb0tTa2diVzlrWlNBOUlERmNibHh1WEhSY2RGeDBhV1lnS0Y5elpteGxiaUErSURFcElIdGNibHgwWEhSY2RGeDBjM2RwZEdOb0lDaHpaaTVqYUdGeVFYUW9YM05tYkdWdUlDMGdNU2twSUh0Y2JseDBYSFJjZEZ4MFhIUmpZWE5sSUNkdEp6cGNibHgwWEhSY2RGeDBYSFJjZEcxdlpHVWdQU0F4TzF4dVhIUmNkRngwWEhSY2RGeDBibTkwWlNBOUlITm1MbU5vWVhKQmRDZ3dLUzUwYjB4dmQyVnlRMkZ6WlNncE8xeHVYSFJjZEZ4MFhIUmNkRngwYm05MFpTQTlJRzV2ZEdVdVkyOXVZMkYwS0hObUxuTjFZbk4wY21sdVp5Z3hMQ0JmYzJac1pXNGdMU0F4S1NrN1hHNWNkRngwWEhSY2RGeDBYSFJpY21WaGF6dGNibHgwWEhSY2RGeDBYSFJqWVhObElDY3RKenBjYmx4MFhIUmNkRngwWEhSY2RHMXZaR1VnUFNBeE8xeHVYSFJjZEZ4MFhIUmNkRngwYm05MFpTQTlJSE5tTG1Ob1lYSkJkQ2d3S1M1MGIweHZkMlZ5UTJGelpTZ3BPMXh1WEhSY2RGeDBYSFJjZEZ4MGJtOTBaU0E5SUc1dmRHVXVZMjl1WTJGMEtITm1Mbk4xWW5OMGNtbHVaeWd4TENCZmMyWnNaVzRnTFNBeEtTazdYRzVjZEZ4MFhIUmNkRngwWEhSaWNtVmhhenRjYmx4MFhIUmNkRngwWEhSallYTmxJQ2ROSnpwY2JseDBYSFJjZEZ4MFhIUmNkRzF2WkdVZ1BTQXdPMXh1WEhSY2RGeDBYSFJjZEZ4MGJtOTBaU0E5SUhObUxtTm9ZWEpCZENnd0tTNTBiMVZ3Y0dWeVEyRnpaU2dwTzF4dVhIUmNkRngwWEhSY2RGeDBibTkwWlNBOUlHNXZkR1V1WTI5dVkyRjBLSE5tTG5OMVluTjBjbWx1WnlneExDQmZjMlpzWlc0Z0xTQXhLU2s3WEc1Y2RGeDBYSFJjZEZ4MFhIUmljbVZoYXp0Y2JseDBYSFJjZEZ4MFhIUmpZWE5sSUNjckp6cGNibHgwWEhSY2RGeDBYSFJjZEcxdlpHVWdQU0F3TzF4dVhIUmNkRngwWEhSY2RGeDBibTkwWlNBOUlITm1MbU5vWVhKQmRDZ3dLUzUwYjFWd2NHVnlRMkZ6WlNncE8xeHVYSFJjZEZ4MFhIUmNkRngwYm05MFpTQTlJRzV2ZEdVdVkyOXVZMkYwS0hObUxuTjFZbk4wY21sdVp5Z3hMQ0JmYzJac1pXNGdMU0F4S1NrN1hHNWNkRngwWEhSY2RGeDBYSFJpY21WaGF6dGNibHgwWEhSY2RGeDBmVnh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFIyWVhJZ1ptbG1kR2hwYm1SbGVDQTlJR1pwWm5Sb2MxdHRiMlJsWFM1cGJtUmxlRTltS0c1dmRHVXBPMXh1WEhSY2RGeDBjMllnUFNCbWFXWjBhR2x1WkdWNElEMDlQU0F0TVNBL0lEQWdPaUJtYVdaMGFHbHVaR1Y0SUMwZ056dGNibHgwWEhSOVhHNWNibHgwWEhSbGRtVnVkQzVrWVhSaElEMGdaWFpsYm5RdVpHRjBZUzVqYjI1allYUW9WWFJwYkhNdWJuVnRZbVZ5Vkc5Q2VYUmxjeWh6Wml3Z01Ta3BPeUF2THlCT2RXMWlaWElnYjJZZ2MyaGhjbkFnYjNJZ1pteGhkSE1nS0NBOElEQWdabXhoZERzZ1BpQXdJSE5vWVhKd0tWeHVYSFJjZEdWMlpXNTBMbVJoZEdFZ1BTQmxkbVZ1ZEM1a1lYUmhMbU52Ym1OaGRDaFZkR2xzY3k1dWRXMWlaWEpVYjBKNWRHVnpLRzF2WkdVc0lERXBLVHNnTHk4Z1RXOWtaVG9nTUNCdFlXcHZjaXdnTVNCdGFXNXZjbHh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbUZrWkVWMlpXNTBLR1YyWlc1MEtUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJCWkdSeklIUmxlSFFnZEc4Z1RVbEVTU0JtYVd4bExseHVYSFFnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnZEdWNGRDQXRJRlJsZUhRZ2RHOGdZV1JrTGx4dVhIUWdLaUJBY21WMGRYSnVJSHRVY21GamEzMWNibHgwSUNvdlhHNWNkR0ZrWkZSbGVIUW9kR1Y0ZENrZ2UxeHVYSFJjZEhaaGNpQmxkbVZ1ZENBOUlHNWxkeUJOWlhSaFJYWmxiblFvZTJSaGRHRTZJRnREYjI1emRHRnVkSE11VFVWVVFWOVVSVmhVWDBsRVhYMHBPMXh1WEhSY2RIWmhjaUJ6ZEhKcGJtZENlWFJsY3lBOUlGVjBhV3h6TG5OMGNtbHVaMVJ2UW5sMFpYTW9kR1Y0ZENrN1hHNWNkRngwWlhabGJuUXVaR0YwWVNBOUlHVjJaVzUwTG1SaGRHRXVZMjl1WTJGMEtGVjBhV3h6TG01MWJXSmxjbFJ2Vm1GeWFXRmliR1ZNWlc1bmRHZ29jM1J5YVc1blFubDBaWE11YkdWdVozUm9LU2s3SUM4dklGTnBlbVZjYmx4MFhIUmxkbVZ1ZEM1a1lYUmhJRDBnWlhabGJuUXVaR0YwWVM1amIyNWpZWFFvYzNSeWFXNW5RbmwwWlhNcE95QXZMeUJVWlhoMFhHNWNkRngwY21WMGRYSnVJSFJvYVhNdVlXUmtSWFpsYm5Rb1pYWmxiblFwTzF4dVhIUjlYRzVjYmx4MEx5b3FYRzVjZENBcUlFRmtaSE1nWTI5d2VYSnBaMmgwSUhSdklFMUpSRWtnWm1sc1pTNWNibHgwSUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhSbGVIUWdMU0JVWlhoMElHOW1JR052Y0hseWFXZG9kQ0JzYVc1bExseHVYSFFnS2lCQWNtVjBkWEp1SUh0VWNtRmphMzFjYmx4MElDb3ZYRzVjZEdGa1pFTnZjSGx5YVdkb2RDaDBaWGgwS1NCN1hHNWNkRngwZG1GeUlHVjJaVzUwSUQwZ2JtVjNJRTFsZEdGRmRtVnVkQ2g3WkdGMFlUb2dXME52Ym5OMFlXNTBjeTVOUlZSQlgwTlBVRmxTU1VkSVZGOUpSRjE5S1R0Y2JseDBYSFIyWVhJZ2MzUnlhVzVuUW5sMFpYTWdQU0JWZEdsc2N5NXpkSEpwYm1kVWIwSjVkR1Z6S0hSbGVIUXBPMXh1WEhSY2RHVjJaVzUwTG1SaGRHRWdQU0JsZG1WdWRDNWtZWFJoTG1OdmJtTmhkQ2hWZEdsc2N5NXVkVzFpWlhKVWIxWmhjbWxoWW14bFRHVnVaM1JvS0hOMGNtbHVaMEo1ZEdWekxteGxibWQwYUNrcE95QXZMeUJUYVhwbFhHNWNkRngwWlhabGJuUXVaR0YwWVNBOUlHVjJaVzUwTG1SaGRHRXVZMjl1WTJGMEtITjBjbWx1WjBKNWRHVnpLVHNnTHk4Z1ZHVjRkRnh1WEhSY2RISmxkSFZ5YmlCMGFHbHpMbUZrWkVWMlpXNTBLR1YyWlc1MEtUdGNibHgwZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJCWkdSeklGTmxjWFZsYm1ObEwxUnlZV05ySUU1aGJXVXVYRzVjZENBcUlFQndZWEpoYlNCN2MzUnlhVzVuZlNCMFpYaDBJQzBnVkdWNGRDQnZaaUIwY21GamF5QnVZVzFsTGx4dVhIUWdLaUJBY21WMGRYSnVJSHRVY21GamEzMWNibHgwSUNvdlhHNWNkR0ZrWkZSeVlXTnJUbUZ0WlNoMFpYaDBLU0I3WEc1Y2RGeDBkbUZ5SUdWMlpXNTBJRDBnYm1WM0lFMWxkR0ZGZG1WdWRDaDdaR0YwWVRvZ1cwTnZibk4wWVc1MGN5NU5SVlJCWDFSU1FVTkxYMDVCVFVWZlNVUmRmU2s3WEc1Y2RGeDBkbUZ5SUhOMGNtbHVaMEo1ZEdWeklEMGdWWFJwYkhNdWMzUnlhVzVuVkc5Q2VYUmxjeWgwWlhoMEtUdGNibHgwWEhSbGRtVnVkQzVrWVhSaElEMGdaWFpsYm5RdVpHRjBZUzVqYjI1allYUW9WWFJwYkhNdWJuVnRZbVZ5Vkc5V1lYSnBZV0pzWlV4bGJtZDBhQ2h6ZEhKcGJtZENlWFJsY3k1c1pXNW5kR2dwS1RzZ0x5OGdVMmw2WlZ4dVhIUmNkR1YyWlc1MExtUmhkR0VnUFNCbGRtVnVkQzVrWVhSaExtTnZibU5oZENoemRISnBibWRDZVhSbGN5azdJQzh2SUZSbGVIUmNibHgwWEhSeVpYUjFjbTRnZEdocGN5NWhaR1JGZG1WdWRDaGxkbVZ1ZENrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dVMlYwY3lCcGJuTjBjblZ0Wlc1MElHNWhiV1VnYjJZZ2RISmhZMnN1WEc1Y2RDQXFJRUJ3WVhKaGJTQjdjM1J5YVc1bmZTQjBaWGgwSUMwZ1RtRnRaU0J2WmlCcGJuTjBjblZ0Wlc1MExseHVYSFFnS2lCQWNtVjBkWEp1SUh0VWNtRmphMzFjYmx4MElDb3ZYRzVjZEdGa1pFbHVjM1J5ZFcxbGJuUk9ZVzFsS0hSbGVIUXBJSHRjYmx4MFhIUjJZWElnWlhabGJuUWdQU0J1WlhjZ1RXVjBZVVYyWlc1MEtIdGtZWFJoT2lCYlEyOXVjM1JoYm5SekxrMUZWRUZmU1U1VFZGSlZUVVZPVkY5T1FVMUZYMGxFWFgwcE8xeHVYSFJjZEhaaGNpQnpkSEpwYm1kQ2VYUmxjeUE5SUZWMGFXeHpMbk4wY21sdVoxUnZRbmwwWlhNb2RHVjRkQ2s3WEc1Y2RGeDBaWFpsYm5RdVpHRjBZU0E5SUdWMlpXNTBMbVJoZEdFdVkyOXVZMkYwS0ZWMGFXeHpMbTUxYldKbGNsUnZWbUZ5YVdGaWJHVk1aVzVuZEdnb2MzUnlhVzVuUW5sMFpYTXViR1Z1WjNSb0tTazdJQzh2SUZOcGVtVmNibHgwWEhSbGRtVnVkQzVrWVhSaElEMGdaWFpsYm5RdVpHRjBZUzVqYjI1allYUW9jM1J5YVc1blFubDBaWE1wT3lBdkx5QlVaWGgwWEc1Y2RGeDBjbVYwZFhKdUlIUm9hWE11WVdSa1JYWmxiblFvWlhabGJuUXBPMXh1WEhSOVhHNWNibHgwTHlvcVhHNWNkQ0FxSUVGa1pITWdiV0Z5YTJWeUlIUnZJRTFKUkVrZ1ptbHNaUzVjYmx4MElDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlIUmxlSFFnTFNCTllYSnJaWElnZEdWNGRDNWNibHgwSUNvZ1FISmxkSFZ5YmlCN1ZISmhZMnQ5WEc1Y2RDQXFMMXh1WEhSaFpHUk5ZWEpyWlhJb2RHVjRkQ2tnZTF4dVhIUmNkSFpoY2lCbGRtVnVkQ0E5SUc1bGR5Qk5aWFJoUlhabGJuUW9lMlJoZEdFNklGdERiMjV6ZEdGdWRITXVUVVZVUVY5TlFWSkxSVkpmU1VSZGZTazdYRzVjZEZ4MGRtRnlJSE4wY21sdVowSjVkR1Z6SUQwZ1ZYUnBiSE11YzNSeWFXNW5WRzlDZVhSbGN5aDBaWGgwS1R0Y2JseDBYSFJsZG1WdWRDNWtZWFJoSUQwZ1pYWmxiblF1WkdGMFlTNWpiMjVqWVhRb1ZYUnBiSE11Ym5WdFltVnlWRzlXWVhKcFlXSnNaVXhsYm1kMGFDaHpkSEpwYm1kQ2VYUmxjeTVzWlc1bmRHZ3BLVHNnTHk4Z1UybDZaVnh1WEhSY2RHVjJaVzUwTG1SaGRHRWdQU0JsZG1WdWRDNWtZWFJoTG1OdmJtTmhkQ2h6ZEhKcGJtZENlWFJsY3lrN0lDOHZJRlJsZUhSY2JseDBYSFJ5WlhSMWNtNGdkR2hwY3k1aFpHUkZkbVZ1ZENobGRtVnVkQ2s3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1FXUmtjeUJqZFdVZ2NHOXBiblFnZEc4Z1RVbEVTU0JtYVd4bExseHVYSFFnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnZEdWNGRDQXRJRlJsZUhRZ2IyWWdZM1ZsSUhCdmFXNTBMbHh1WEhRZ0tpQkFjbVYwZFhKdUlIdFVjbUZqYTMxY2JseDBJQ292WEc1Y2RHRmtaRU4xWlZCdmFXNTBLSFJsZUhRcElIdGNibHgwWEhSMllYSWdaWFpsYm5RZ1BTQnVaWGNnVFdWMFlVVjJaVzUwS0h0a1lYUmhPaUJiUTI5dWMzUmhiblJ6TGsxRlZFRmZRMVZGWDFCUFNVNVVYWDBwTzF4dVhIUmNkSFpoY2lCemRISnBibWRDZVhSbGN5QTlJRlYwYVd4ekxuTjBjbWx1WjFSdlFubDBaWE1vZEdWNGRDazdYRzVjZEZ4MFpYWmxiblF1WkdGMFlTQTlJR1YyWlc1MExtUmhkR0V1WTI5dVkyRjBLRlYwYVd4ekxtNTFiV0psY2xSdlZtRnlhV0ZpYkdWTVpXNW5kR2dvYzNSeWFXNW5RbmwwWlhNdWJHVnVaM1JvS1NrN0lDOHZJRk5wZW1WY2JseDBYSFJsZG1WdWRDNWtZWFJoSUQwZ1pYWmxiblF1WkdGMFlTNWpiMjVqWVhRb2MzUnlhVzVuUW5sMFpYTXBPeUF2THlCVVpYaDBYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVZV1JrUlhabGJuUW9aWFpsYm5RcE8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRUZrWkhNZ2JIbHlhV01nZEc4Z1RVbEVTU0JtYVd4bExseHVYSFFnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnYkhseWFXTWdMU0JNZVhKcFl5QjBaWGgwSUhSdklHRmtaQzVjYmx4MElDb2dRSEpsZEhWeWJpQjdWSEpoWTJ0OVhHNWNkQ0FxTDF4dVhIUmhaR1JNZVhKcFl5aHNlWEpwWXlrZ2UxeHVYSFJjZEhaaGNpQmxkbVZ1ZENBOUlHNWxkeUJOWlhSaFJYWmxiblFvZTJSaGRHRTZJRnREYjI1emRHRnVkSE11VFVWVVFWOU1XVkpKUTE5SlJGMTlLVHRjYmx4MFhIUjJZWElnYzNSeWFXNW5RbmwwWlhNZ1BTQlZkR2xzY3k1emRISnBibWRVYjBKNWRHVnpLR3g1Y21saktUdGNibHgwWEhSbGRtVnVkQzVrWVhSaElEMGdaWFpsYm5RdVpHRjBZUzVqYjI1allYUW9WWFJwYkhNdWJuVnRZbVZ5Vkc5V1lYSnBZV0pzWlV4bGJtZDBhQ2h6ZEhKcGJtZENlWFJsY3k1c1pXNW5kR2dwS1RzZ0x5OGdVMmw2WlZ4dVhIUmNkR1YyWlc1MExtUmhkR0VnUFNCbGRtVnVkQzVrWVhSaExtTnZibU5oZENoemRISnBibWRDZVhSbGN5azdJQzh2SUV4NWNtbGpYRzVjZEZ4MGNtVjBkWEp1SUhSb2FYTXVZV1JrUlhabGJuUW9aWFpsYm5RcE8xeHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRU5vWVc1dVpXd2diVzlrWlNCdFpYTnpZV2RsYzF4dVhIUWdLaUJBY21WMGRYSnVJSHRVY21GamEzMWNibHgwSUNvdlhHNWNkSEJ2YkhsTmIyUmxUMjRvS1NCN1hHNWNkRngwZG1GeUlHVjJaVzUwSUQwZ2JtVjNJRTV2ZEdWUGJrVjJaVzUwS0h0a1lYUmhPaUJiTUhnd01Dd2dNSGhDTUN3Z01IZzNSU3dnTUhnd01GMTlLVHRjYmx4MFhIUnlaWFIxY200Z2RHaHBjeTVoWkdSRmRtVnVkQ2hsZG1WdWRDazdYRzVjZEgxY2JseHVmVnh1WEc1bGVIQnZjblFnZTFSeVlXTnJmVHRjYm1sdGNHOXlkQ0I3ZEc5TmFXUnBmU0JtY205dElDZDBiMjVoYkMxdGFXUnBKenRjYmx4dUx5b3FYRzRnS2lCVGRHRjBhV01nZFhScGJHbDBlU0JtZFc1amRHbHZibk1nZFhObFpDQjBhSEp2ZFdkb2IzVjBJSFJvWlNCc2FXSnlZWEo1TGx4dUlDb3ZYRzVqYkdGemN5QlZkR2xzY3lCN1hHNWNibHgwTHlvcVhHNWNkQ0FxSUVkbGRITWdUV2xrYVZkeWFYUmxja3BUSUhabGNuTnBiMjRnYm5WdFltVnlMbHh1WEhRZ0tpQkFjbVYwZFhKdUlIdHpkSEpwYm1kOVhHNWNkQ0FxTDF4dVhIUnpkR0YwYVdNZ2RtVnljMmx2YmlncElIdGNibHgwWEhSeVpYUjFjbTRnUTI5dWMzUmhiblJ6TGxaRlVsTkpUMDQ3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1EyOXVkbVZ5ZENCaElITjBjbWx1WnlCMGJ5QmhiaUJoY25KaGVTQnZaaUJpZVhSbGMxeHVYSFFnS2lCQWNHRnlZVzBnZTNOMGNtbHVaMzBnYzNSeWFXNW5YRzVjZENBcUlFQnlaWFIxY200Z2UyRnljbUY1ZlZ4dVhIUWdLaTljYmx4MGMzUmhkR2xqSUhOMGNtbHVaMVJ2UW5sMFpYTW9jM1J5YVc1bktTQjdYRzVjZEZ4MGNtVjBkWEp1SUhOMGNtbHVaeTV6Y0d4cGRDZ25KeWt1YldGd0tHTm9ZWElnUFQ0Z1kyaGhjaTVqYUdGeVEyOWtaVUYwS0NrcFhHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRMmhsWTJ0eklHbG1JR0Z5WjNWdFpXNTBJR2x6SUdFZ2RtRnNhV1FnYm5WdFltVnlMbHh1WEhRZ0tpQkFjR0Z5WVcwZ2V5cDlJRzRnTFNCV1lXeDFaU0IwYnlCamFHVmphMXh1WEhRZ0tpQkFjbVYwZFhKdUlIdGliMjlzWldGdWZWeHVYSFFnS2k5Y2JseDBjM1JoZEdsaklHbHpUblZ0WlhKcFl5aHVLU0I3WEc1Y2RGeDBjbVYwZFhKdUlDRnBjMDVoVGlod1lYSnpaVVpzYjJGMEtHNHBLU0FtSmlCcGMwWnBibWwwWlNodUtWeHVYSFI5WEc1Y2JseDBMeW9xWEc0Z0lDQWdJQ29nVW1WMGRYSnVjeUIwYUdVZ1kyOXljbVZqZENCTlNVUkpJRzUxYldKbGNpQm1iM0lnZEdobElITndaV05wWm1sbFpDQndhWFJqYUM1Y2JpQWdJQ0FnS2lCVmMyVnpJRlJ2Ym1Gc0lFMXBaR2tnTFNCb2RIUndjem92TDJkcGRHaDFZaTVqYjIwdlpHRnVhV2RpTDNSdmJtRnNMM1J5WldVdmJXRnpkR1Z5TDNCaFkydGhaMlZ6TDIxcFpHbGNiaUFnSUNBZ0tpQkFjR0Z5WVcwZ2V5aHpkSEpwYm1kOGJuVnRZbVZ5S1gwZ2NHbDBZMmdnTFNBblF5TTBKeUJ2Y2lCdGFXUnBJRzV2ZEdVZ1kyOWtaVnh1SUNBZ0lDQXFJRUJ5WlhSMWNtNGdlMjUxYldKbGNuMWNiaUFnSUNBZ0tpOWNiaUFnSUNBZ2MzUmhkR2xqSUdkbGRGQnBkR05vS0hCcGRHTm9LU0I3WEc0Z0lDQWdJRngwY21WMGRYSnVJSFJ2VFdsa2FTaHdhWFJqYUNrN1hHNGdJQ0FnSUgxY2JseHVYSFF2S2lwY2JseDBJQ29nVkhKaGJuTnNZWFJsY3lCdWRXMWlaWElnYjJZZ2RHbGphM01nZEc4Z1RVbEVTU0IwYVcxbGMzUmhiWEFnWm05eWJXRjBMQ0J5WlhSMWNtNXBibWNnWVc0Z1lYSnlZWGtnYjJaY2JseDBJQ29nYUdWNElITjBjbWx1WjNNZ2QybDBhQ0IwYUdVZ2RHbHRaU0IyWVd4MVpYTXVJRTFwWkdrZ2FHRnpJR0VnZG1WeWVTQndZWEowYVdOMWJHRnlJSFJwYldVZ2RHOGdaWGh3Y21WemN5QjBhVzFsTEZ4dVhIUWdLaUIwWVd0bElHRWdaMjl2WkNCc2IyOXJJR0YwSUhSb1pTQnpjR1ZqSUdKbFptOXlaU0JsZG1WeUlIUnZkV05vYVc1bklIUm9hWE1nWm5WdVkzUnBiMjR1WEc1Y2RDQXFJRlJvWVc1cmN5QjBieUJvZEhSd2N6b3ZMMmRwZEdoMVlpNWpiMjB2YzJWeVoya3Zhbk50YVdScFhHNWNkQ0FxWEc1Y2RDQXFJRUJ3WVhKaGJTQjdiblZ0WW1WeWZTQjBhV05yY3lBdElFNTFiV0psY2lCdlppQjBhV05yY3lCMGJ5QmlaU0IwY21GdWMyeGhkR1ZrWEc1Y2RDQXFJRUJ5WlhSMWNtNGdlMkZ5Y21GNWZTQXRJRUo1ZEdWeklIUm9ZWFFnWm05eWJTQjBhR1VnVFVsRVNTQjBhVzFsSUhaaGJIVmxYRzVjZENBcUwxeHVYSFJ6ZEdGMGFXTWdiblZ0WW1WeVZHOVdZWEpwWVdKc1pVeGxibWQwYUNoMGFXTnJjeWtnZTF4dVhIUWdJQ0FnZG1GeUlHSjFabVpsY2lBOUlIUnBZMnR6SUNZZ01IZzNSanRjYmx4dVhIUWdJQ0FnZDJocGJHVWdLSFJwWTJ0eklEMGdkR2xqYTNNZ1BqNGdOeWtnZTF4dVhIUWdJQ0FnSUNBZ0lHSjFabVpsY2lBOFBEMGdPRHRjYmx4MElDQWdJQ0FnSUNCaWRXWm1aWElnZkQwZ0tDaDBhV05yY3lBbUlEQjROMFlwSUh3Z01IZzRNQ2s3WEc1Y2RDQWdJQ0I5WEc1Y2JseDBJQ0FnSUhaaGNpQmlUR2x6ZENBOUlGdGRPMXh1WEhRZ0lDQWdkMmhwYkdVZ0tIUnlkV1VwSUh0Y2JseDBJQ0FnSUNBZ0lDQmlUR2x6ZEM1d2RYTm9LR0oxWm1abGNpQW1JREI0Wm1ZcE8xeHVYRzVjZENBZ0lDQWdJQ0FnYVdZZ0tHSjFabVpsY2lBbUlEQjRPREFwSUdKMVptWmxjaUErUGowZ09GeHVYSFFnSUNBZ0lDQWdJR1ZzYzJVZ2V5QmljbVZoYXpzZ2ZWeHVYSFFnSUNBZ2ZWeHVYRzVjZENBZ0lDQnlaWFIxY200Z1lreHBjM1E3WEc1Y2RIMWNibHh1WEhRdktpcGNibHgwSUNvZ1EyOTFiblJ6SUc1MWJXSmxjaUJ2WmlCaWVYUmxjeUJwYmlCemRISnBibWRjYmx4MElDb2dRSEJoY21GdElIdHpkSEpwYm1kOUlITmNibHgwSUNvZ1FISmxkSFZ5YmlCN1lYSnlZWGw5WEc1Y2RDQXFMMXh1WEhSemRHRjBhV01nYzNSeWFXNW5RbmwwWlVOdmRXNTBLSE1wSUh0Y2JseDBYSFJ5WlhSMWNtNGdaVzVqYjJSbFZWSkpLSE1wTG5Od2JHbDBLQzhsTGk1OExpOHBMbXhsYm1kMGFDQXRJREZjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCSFpYUWdZVzRnYVc1MElHWnliMjBnWVc0Z1lYSnlZWGtnYjJZZ1lubDBaWE11WEc1Y2RDQXFJRUJ3WVhKaGJTQjdZWEp5WVhsOUlHSjVkR1Z6WEc1Y2RDQXFJRUJ5WlhSMWNtNGdlMjUxYldKbGNuMWNibHgwSUNvdlhHNWNkSE4wWVhScFl5QnVkVzFpWlhKR2NtOXRRbmwwWlhNb1lubDBaWE1wSUh0Y2JseDBYSFIyWVhJZ2FHVjRJRDBnSnljN1hHNWNkRngwZG1GeUlITjBjbWx1WjFKbGMzVnNkRHRjYmx4dVhIUmNkR0o1ZEdWekxtWnZja1ZoWTJnb1puVnVZM1JwYjI0b1lubDBaU2tnZTF4dVhIUmNkRngwYzNSeWFXNW5VbVZ6ZFd4MElEMGdZbmwwWlM1MGIxTjBjbWx1WnlneE5pazdYRzVjYmx4MFhIUmNkQzh2SUdWdWMzVnlaU0J6ZEhKcGJtY2dhWE1nTWlCamFHRnljMXh1WEhSY2RGeDBhV1lnS0hOMGNtbHVaMUpsYzNWc2RDNXNaVzVuZEdnZ1BUMGdNU2tnYzNSeWFXNW5VbVZ6ZFd4MElEMGdYQ0l3WENJZ0t5QnpkSEpwYm1kU1pYTjFiSFJjYmx4dVhIUmNkRngwYUdWNElDczlJSE4wY21sdVoxSmxjM1ZzZER0Y2JseDBYSFI5S1R0Y2JseHVYSFJjZEhKbGRIVnliaUJ3WVhKelpVbHVkQ2hvWlhnc0lERTJLVHRjYmx4MGZWeHVYRzVjZEM4cUtseHVYSFFnS2lCVVlXdGxjeUJoSUc1MWJXSmxjaUJoYm1RZ2MzQnNhWFJ6SUdsMElIVndJR2x1ZEc4Z1lXNGdZWEp5WVhrZ2IyWWdZbmwwWlhNdUlDQkRZVzRnWW1VZ2NHRmtaR1ZrSUdKNUlIQmhjM05wYm1jZ1lTQnVkVzFpWlhJZ2RHOGdZbmwwWlhOT1pXVmtaV1JjYmx4MElDb2dRSEJoY21GdElIdHVkVzFpWlhKOUlHNTFiV0psY2x4dVhIUWdLaUJBY0dGeVlXMGdlMjUxYldKbGNuMGdZbmwwWlhOT1pXVmtaV1JjYmx4MElDb2dRSEpsZEhWeWJpQjdZWEp5WVhsOUlDMGdRWEp5WVhrZ2IyWWdZbmwwWlhOY2JseDBJQ292WEc1Y2RITjBZWFJwWXlCdWRXMWlaWEpVYjBKNWRHVnpLRzUxYldKbGNpd2dZbmwwWlhOT1pXVmtaV1FwSUh0Y2JseDBYSFJpZVhSbGMwNWxaV1JsWkNBOUlHSjVkR1Z6VG1WbFpHVmtJSHg4SURFN1hHNWNibHgwWEhSMllYSWdhR1Y0VTNSeWFXNW5JRDBnYm5WdFltVnlMblJ2VTNSeWFXNW5LREUyS1R0Y2JseHVYSFJjZEdsbUlDaG9aWGhUZEhKcGJtY3ViR1Z1WjNSb0lDWWdNU2tnZXlBdkx5Qk5ZV3RsSUhOMWNtVWdhR1Y0SUhOMGNtbHVaeUJwY3lCbGRtVnVJRzUxYldKbGNpQnZaaUJqYUdGeWMxeHVYSFJjZEZ4MGFHVjRVM1J5YVc1bklEMGdKekFuSUNzZ2FHVjRVM1J5YVc1bk8xeHVYSFJjZEgxY2JseHVYSFJjZEM4dklGTndiR2wwSUdobGVDQnpkSEpwYm1jZ2FXNTBieUJoYmlCaGNuSmhlU0J2WmlCMGQyOGdZMmhoY2lCbGJHVnRaVzUwYzF4dVhIUmNkSFpoY2lCb1pYaEJjbkpoZVNBOUlHaGxlRk4wY21sdVp5NXRZWFJqYUNndkxuc3lmUzluS1R0Y2JseHVYSFJjZEM4dklFNXZkeUJ3WVhKelpTQjBhR1Z0SUc5MWRDQmhjeUJwYm5SbFoyVnljMXh1WEhSY2RHaGxlRUZ5Y21GNUlEMGdhR1Y0UVhKeVlYa3ViV0Z3S0dsMFpXMGdQVDRnY0dGeWMyVkpiblFvYVhSbGJTd2dNVFlwS1Z4dVhHNWNkRngwTHk4Z1VISmxjR1Z1WkNCbGJYQjBlU0JpZVhSbGN5QnBaaUIzWlNCa2IyNG5kQ0JvWVhabElHVnViM1ZuYUZ4dVhIUmNkR2xtSUNob1pYaEJjbkpoZVM1c1pXNW5kR2dnUENCaWVYUmxjMDVsWldSbFpDa2dlMXh1WEhSY2RGeDBkMmhwYkdVZ0tHSjVkR1Z6VG1WbFpHVmtJQzBnYUdWNFFYSnlZWGt1YkdWdVozUm9JRDRnTUNrZ2UxeHVYSFJjZEZ4MFhIUm9aWGhCY25KaGVTNTFibk5vYVdaMEtEQXBPMXh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCb1pYaEJjbkpoZVR0Y2JseDBmVnh1WEc1Y2RDOHFLbHgwWEc1Y2RDQXFJRU52Ym5abGNuUnpJSFpoYkhWbElIUnZJR0Z5Y21GNUlHbG1JRzVsWldSbFpDNWNibHgwSUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUhaaGJIVmxYRzVjZENBcUlFQnlaWFIxY200Z2UyRnljbUY1ZlZ4dVhIUWdLaTljYmx4MGMzUmhkR2xqSUhSdlFYSnlZWGtvZG1Gc2RXVXBJSHRjYmx4MFhIUnBaaUFvUVhKeVlYa3VhWE5CY25KaGVTaDJZV3gxWlNrcElISmxkSFZ5YmlCMllXeDFaVHRjYmx4MFhIUnlaWFIxY200Z1czWmhiSFZsWFR0Y2JseDBmVnh1ZlZ4dVhHNWxlSEJ2Y25RZ2UxVjBhV3h6ZlR0Y2JtTnNZWE56SUZabGVFWnNiM2NnZTF4dVhIUmNibHgwWTI5dWMzUnlkV04wYjNJb0tTQjdYRzVjZEZ4MEx5OGdZMjlrWlM0dUxseHVYSFI5WEc1Y2JseDBMeW9xWEc1Y2RDQXFJRk4xY0hCdmNuUWdabTl5SUdOdmJuWmxjblJwYm1jZ1ZtVjRSbXh2ZHlCMmIybGpaU0JwYm5SdklFMXBaR2xYY21sMFpYSktVeUIwY21GamExeHVYSFFnS2lCQWNtVjBkWEp1SUUxcFpHbFhjbWwwYVdWeUxsUnlZV05ySUc5aWFtVmpkRnh1WEhRZ0tpOWNibHgwZEhKaFkydEdjbTl0Vm05cFkyVW9kbTlwWTJVcElIdGNibHgwWEhSMllYSWdkSEpoWTJzZ1BTQnVaWGNnVkhKaFkyc29LVHRjYmx4MFhIUjJZWElnZDJGcGREdGNibHgwWEhSMllYSWdjR2wwWTJobGN5QTlJRnRkTzF4dVhHNWNkRngwZG05cFkyVXVkR2xqYTJGaWJHVnpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNG9kR2xqYTJGaWJHVXBJSHRjYmx4MFhIUmNkSEJwZEdOb1pYTWdQU0JiWFR0Y2JseHVYSFJjZEZ4MGFXWWdLSFJwWTJ0aFlteGxMbTV2ZEdWVWVYQmxJRDA5UFNBbmJpY3BJSHRjYmx4MFhIUmNkRngwZEdsamEyRmliR1V1YTJWNWN5NW1iM0pGWVdOb0tHWjFibU4wYVc5dUtHdGxlU2tnZTF4dVhIUmNkRngwWEhSY2RDOHZJR0oxYVd4a0lHRnljbUY1SUc5bUlIQnBkR05vWlhOY2JseDBYSFJjZEZ4MFhIUndhWFJqYUdWekxuQjFjMmdvZEdocGN5NWpiMjUyWlhKMFVHbDBZMmdvYTJWNUtTazdYRzVjZEZ4MFhIUmNkSDBwTzF4dVhHNWNkRngwWEhSOUlHVnNjMlVnYVdZZ0tIUnBZMnRoWW14bExtNXZkR1ZVZVhCbElEMDlQU0FuY2ljcElIdGNibHgwWEhSY2RGeDBMeThnYlc5MlpTQnZiaUIwYnlCMGFHVWdibVY0ZENCMGFXTnJZV0pzWlNCaGJtUWdkWE5sSUhSb2FYTWdjbVZ6ZENCaGN5QmhJR0IzWVdsMFlDQndjbTl3WlhKMGVTQm1iM0lnZEdobElHNWxlSFFnWlhabGJuUmNibHgwWEhSY2RGeDBkMkZwZENBOUlIUm9hWE11WTI5dWRtVnlkRVIxY21GMGFXOXVLSFJwWTJ0aFlteGxLVHRjYmx4MFhIUmNkRngwY21WMGRYSnVPMXh1WEhSY2RGeDBmVnh1WEc1Y2RGeDBYSFIwY21GamF5NWhaR1JGZG1WdWRDaHVaWGNnVG05MFpVVjJaVzUwS0h0d2FYUmphRG9nY0dsMFkyaGxjeXdnWkhWeVlYUnBiMjQ2SUhSb2FYTXVZMjl1ZG1WeWRFUjFjbUYwYVc5dUtIUnBZMnRoWW14bEtTd2dkMkZwZERvZ2QyRnBkSDBwS1R0Y2JseDBYSFJjZEZ4dVhIUmNkRngwTHk4Z2NtVnpaWFFnZDJGcGRGeHVYSFJjZEZ4MGQyRnBkQ0E5SURBN1hHNWNkRngwZlNrN1hHNWNibHgwWEhSeVpYUjFjbTRnZEhKaFkyczdYRzVjZEgxY2JseHVYRzVjZEM4cUtseHVYSFFnS2lCRGIyNTJaWEowY3lCV1pYaEdiRzkzSUhCcGRHTm9JSE41Ym5SaGVDQjBieUJOYVdScFYzSnBkR1Z5U2xNZ2MzbHVkR0Y0WEc1Y2RDQXFJRUJ3WVhKaGJTQndhWFJqYUNCemRISnBibWRjYmx4MElDb3ZYRzVjZEdOdmJuWmxjblJRYVhSamFDaHdhWFJqYUNrZ2UxeHVYSFJjZEhKbGRIVnliaUJ3YVhSamFDNXlaWEJzWVdObEtDY3ZKeXdnSnljcE8xeHVYSFI5SUZ4dVhHNWNibHgwTHlvcVhHNWNkQ0FxSUVOdmJuWmxjblJ6SUZabGVFWnNiM2NnWkhWeVlYUnBiMjRnYzNsdWRHRjRJSFJ2SUUxcFpHbFhjbWwwWlhKS1V5QnplVzUwWVhoY2JseDBJQ29nUUhCaGNtRnRJRzV2ZEdVZ2MzUnlkV04wSUdaeWIyMGdWbVY0Um14dmQxeHVYSFFnS2k5Y2JseDBZMjl1ZG1WeWRFUjFjbUYwYVc5dUtHNXZkR1VwSUh0Y2JseDBYSFJ6ZDJsMFkyZ2dLRzV2ZEdVdVpIVnlZWFJwYjI0cElIdGNibHgwWEhSY2RHTmhjMlVnSjNjbk9seHVYSFJjZEZ4MFhIUnlaWFIxY200Z0p6RW5PMXh1WEhSY2RGeDBZMkZ6WlNBbmFDYzZYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnViM1JsTG1selJHOTBkR1ZrS0NrZ1B5QW5aREluSURvZ0p6SW5PMXh1WEhSY2RGeDBZMkZ6WlNBbmNTYzZYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnViM1JsTG1selJHOTBkR1ZrS0NrZ1B5QW5aRFFuSURvZ0p6UW5PMXh1WEhSY2RGeDBZMkZ6WlNBbk9DYzZYRzVjZEZ4MFhIUmNkSEpsZEhWeWJpQnViM1JsTG1selJHOTBkR1ZrS0NrZ1B5QW5aRGduSURvZ0p6Z25PMXh1WEhSY2RIMWNibHh1WEhSY2RISmxkSFZ5YmlCdWIzUmxMbVIxY21GMGFXOXVPMXh1WEhSOU8xeHVmVnh1WEc1bGVIQnZjblFnZTFabGVFWnNiM2Q5TzF4dUx5b3FYRzRnS2lCUFltcGxZM1FnZEdoaGRDQndkWFJ6SUhSdloyVjBhR1Z5SUhSeVlXTnJjeUJoYm1RZ2NISnZkbWxrWlhNZ2JXVjBhRzlrY3lCbWIzSWdabWxzWlNCdmRYUndkWFF1WEc0Z0tpQkFjR0Z5WVcwZ2UyRnljbUY1ZlNCMGNtRmphM01nTFNCQmJpQmhjbkpoZVNCdlppQjdWSEpoWTJ0OUlHOWlhbVZqZEhNdVhHNGdLaUJBY21WMGRYSnVJSHRYY21sMFpYSjlYRzRnS2k5Y2JtTnNZWE56SUZkeWFYUmxjaUI3WEc1Y2RHTnZibk4wY25WamRHOXlLSFJ5WVdOcmN5a2dlMXh1WEhSY2RIUm9hWE11WkdGMFlTQTlJRnRkTzF4dVhHNWNkRngwZG1GeUlIUnlZV05yVkhsd1pTQTlJSFJ5WVdOcmN5NXNaVzVuZEdnZ1BpQXhJRDhnUTI5dWMzUmhiblJ6TGtoRlFVUkZVbDlEU0ZWT1MxOUdUMUpOUVZReElEb2dRMjl1YzNSaGJuUnpMa2hGUVVSRlVsOURTRlZPUzE5R1QxSk5RVlF3TzF4dVhIUmNkSFpoY2lCdWRXMWlaWEpQWmxSeVlXTnJjeUE5SUZWMGFXeHpMbTUxYldKbGNsUnZRbmwwWlhNb2RISmhZMnR6TG14bGJtZDBhQ3dnTWlrN0lDOHZJSFIzYnlCaWVYUmxjeUJzYjI1blhHNWNibHgwWEhRdkx5QklaV0ZrWlhJZ1kyaDFibXRjYmx4MFhIUjBhR2x6TG1SaGRHRXVjSFZ6YUNodVpYY2dRMmgxYm1zb2UxeHVYSFJjZEZ4MFhIUmNkRngwWEhSY2RIUjVjR1U2SUVOdmJuTjBZVzUwY3k1SVJVRkVSVkpmUTBoVlRrdGZWRmxRUlN4Y2JseDBYSFJjZEZ4MFhIUmNkRngwWEhSa1lYUmhPaUIwY21GamExUjVjR1V1WTI5dVkyRjBLRzUxYldKbGNrOW1WSEpoWTJ0ekxDQkRiMjV6ZEdGdWRITXVTRVZCUkVWU1gwTklWVTVMWDBSSlZrbFRTVTlPS1gwcEtUdGNibHh1WEhSY2RDOHZJRlJ5WVdOcklHTm9kVzVyYzF4dVhIUmNkSFJ5WVdOcmN5NW1iM0pGWVdOb0tHWjFibU4wYVc5dUtIUnlZV05yTENCcEtTQjdYRzVjZEZ4MFhIUjBjbUZqYXk1aFpHUkZkbVZ1ZENodVpYY2dUV1YwWVVWMlpXNTBLSHRrWVhSaE9pQkRiMjV6ZEdGdWRITXVUVVZVUVY5RlRrUmZUMFpmVkZKQlEwdGZTVVI5S1NrN1hHNWNkRngwWEhSMGFHbHpMbVJoZEdFdWNIVnphQ2gwY21GamF5azdYRzVjZEZ4MGZTd2dkR2hwY3lrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRblZwYkdSeklIUm9aU0JtYVd4bElHbHVkRzhnWVNCVmFXNTBPRUZ5Y21GNVhHNWNkQ0FxSUVCeVpYUjFjbTRnZTFWcGJuUTRRWEp5WVhsOVhHNWNkQ0FxTDF4dVhIUmlkV2xzWkVacGJHVW9LU0I3WEc1Y2RGeDBkbUZ5SUdKMWFXeGtJRDBnVzEwN1hHNWNibHgwWEhRdkx5QkVZWFJoSUdOdmJuTnBjM1J6SUc5bUlHTm9kVzVyY3lCM2FHbGphQ0JqYjI1emFYTjBjeUJ2WmlCa1lYUmhYRzVjZEZ4MGRHaHBjeTVrWVhSaExtWnZja1ZoWTJnb0tHUXBJRDArSUdKMWFXeGtJRDBnWW5WcGJHUXVZMjl1WTJGMEtHUXVkSGx3WlN3Z1pDNXphWHBsTENCa0xtUmhkR0VwS1R0Y2JseHVYSFJjZEhKbGRIVnliaUJ1WlhjZ1ZXbHVkRGhCY25KaGVTaGlkV2xzWkNrN1hHNWNkSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dRMjl1ZG1WeWRDQm1hV3hsSUdKMVptWmxjaUIwYnlCaElHSmhjMlUyTkNCemRISnBibWN1SUNCRWFXWm1aWEpsYm5RZ2JXVjBhRzlrY3lCa1pYQmxibVJwYm1jZ2IyNGdhV1lnWW5KdmQzTmxjaUJ2Y2lCdWIyUmxMbHh1WEhRZ0tpQkFjbVYwZFhKdUlIdHpkSEpwYm1kOVhHNWNkQ0FxTDF4dVhIUmlZWE5sTmpRb0tTQjdYRzVjZEZ4MGFXWWdLSFI1Y0dWdlppQmlkRzloSUQwOVBTQW5ablZ1WTNScGIyNG5LU0J5WlhSMWNtNGdZblJ2WVNoVGRISnBibWN1Wm5KdmJVTm9ZWEpEYjJSbExtRndjR3g1S0c1MWJHd3NJSFJvYVhNdVluVnBiR1JHYVd4bEtDa3BLVHRjYmx4MFhIUnlaWFIxY200Z2JtVjNJRUoxWm1abGNpaDBhR2x6TG1KMWFXeGtSbWxzWlNncEtTNTBiMU4wY21sdVp5Z25ZbUZ6WlRZMEp5azdYRzVjZEgxY2JseHVJQ0FnSUM4cUtseHVJQ0FnSUNBcUlFZGxkQ0IwYUdVZ1pHRjBZU0JWVWtrdVhHNGdJQ0FnSUNvZ1FISmxkSFZ5YmlCN2MzUnlhVzVuZlZ4dUlDQWdJQ0FxTDF4dUlDQWdJR1JoZEdGVmNta29LU0I3WEc0Z0lDQWdYSFJ5WlhSMWNtNGdKMlJoZEdFNllYVmthVzh2Yldsa2FUdGlZWE5sTmpRc0p5QXJJSFJvYVhNdVltRnpaVFkwS0NrN1hHNGdJQ0FnZlZ4dVhHNWNkQzhxS2x4dVhIUWdLaUJQZFhSd2RYUWdkRzhnYzNSa2IzVjBYRzVjZENBcUlFQnlaWFIxY200Z2UzTjBjbWx1WjMxY2JseDBJQ292WEc0Z0lDQWdjM1JrYjNWMEtDa2dlMXh1SUNBZ0lGeDBjbVYwZFhKdUlIQnliMk5sYzNNdWMzUmtiM1YwTG5keWFYUmxLRzVsZHlCQ2RXWm1aWElvZEdocGN5NWlkV2xzWkVacGJHVW9LU2twTzF4dUlDQWdJSDFjYmx4dVhIUXZLaXBjYmx4MElDb2dVMkYyWlNCMGJ5Qk5TVVJKSUdacGJHVmNibHgwSUNvZ1FIQmhjbUZ0SUh0emRISnBibWQ5SUdacGJHVnVZVzFsWEc1Y2RDQXFMMXh1WEhSellYWmxUVWxFU1NobWFXeGxibUZ0WlNrZ2UxeHVYSFJjZEhaaGNpQmlkV1ptWlhJZ1BTQnVaWGNnUW5WbVptVnlLSFJvYVhNdVluVnBiR1JHYVd4bEtDa3BPMXh1WEhSY2RHWnpMbmR5YVhSbFJtbHNaU2htYVd4bGJtRnRaU0FySUNjdWJXbGtKeXdnWW5WbVptVnlMQ0JtZFc1amRHbHZiaUFvWlhKeUtTQjdYRzVjZEZ4MFhIUnBaaWhsY25JcElISmxkSFZ5YmlCamIyNXpiMnhsTG14dlp5aGxjbklwTzF4dVhIUmNkSDBwTzF4dVhIUjlYRzU5WEc1Y2JtVjRjRzl5ZENCN1YzSnBkR1Z5ZlR0Y2JpSmRmUT09XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbWlkaS13cml0ZXItanMvYnVpbGQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDE0MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCdcblxuLy8gdXRpbFxuZnVuY3Rpb24gZmlsbFN0ciAocywgbnVtKSB7IHJldHVybiBBcnJheShudW0gKyAxKS5qb2luKHMpIH1cbmZ1bmN0aW9uIGlzTnVtICh4KSB7IHJldHVybiB0eXBlb2YgeCA9PT0gJ251bWJlcicgfVxuZnVuY3Rpb24gaXNTdHIgKHgpIHsgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3RyaW5nJyB9XG5mdW5jdGlvbiBpc0RlZiAoeCkgeyByZXR1cm4gdHlwZW9mIHggIT09ICd1bmRlZmluZWQnIH1cbmZ1bmN0aW9uIG1pZGlUb0ZyZXEgKG1pZGksIHR1bmluZykge1xuICByZXR1cm4gTWF0aC5wb3coMiwgKG1pZGkgLSA2OSkgLyAxMikgKiAodHVuaW5nIHx8IDQ0MClcbn1cblxudmFyIFJFR0VYID0gL14oW2EtZ0EtR10pKCN7MSx9fGJ7MSx9fHh7MSx9fCkoLT9cXGQqKVxccyooLiopXFxzKiQvXG4vKipcbiAqIEEgcmVnZXggZm9yIG1hdGNoaW5nIG5vdGUgc3RyaW5ncyBpbiBzY2llbnRpZmljIG5vdGF0aW9uLlxuICpcbiAqIEBuYW1lIHJlZ2V4XG4gKiBAZnVuY3Rpb25cbiAqIEByZXR1cm4ge1JlZ0V4cH0gdGhlIHJlZ2V4cCB1c2VkIHRvIHBhcnNlIHRoZSBub3RlIG5hbWVcbiAqXG4gKiBUaGUgbm90ZSBzdHJpbmcgc2hvdWxkIGhhdmUgdGhlIGZvcm0gYGxldHRlclthY2NpZGVudGFsc11bb2N0YXZlXVtlbGVtZW50XWBcbiAqIHdoZXJlOlxuICpcbiAqIC0gbGV0dGVyOiAoUmVxdWlyZWQpIGlzIGEgbGV0dGVyIGZyb20gQSB0byBHIGVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlXG4gKiAtIGFjY2lkZW50YWxzOiAoT3B0aW9uYWwpIGNhbiBiZSBvbmUgb3IgbW9yZSBgYmAgKGZsYXRzKSwgYCNgIChzaGFycHMpIG9yIGB4YCAoZG91YmxlIHNoYXJwcykuXG4gKiBUaGV5IGNhbiBOT1QgYmUgbWl4ZWQuXG4gKiAtIG9jdGF2ZTogKE9wdGlvbmFsKSBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXJcbiAqIC0gZWxlbWVudDogKE9wdGlvbmFsKSBhZGRpdGlvbmFsbHkgYW55dGhpbmcgYWZ0ZXIgdGhlIGR1cmF0aW9uIGlzIGNvbnNpZGVyZWQgdG9cbiAqIGJlIHRoZSBlbGVtZW50IG5hbWUgKGZvciBleGFtcGxlOiAnQzIgZG9yaWFuJylcbiAqXG4gKiBUaGUgZXhlY3V0ZWQgcmVnZXggY29udGFpbnMgKGJ5IGFycmF5IGluZGV4KTpcbiAqXG4gKiAtIDA6IHRoZSBjb21wbGV0ZSBzdHJpbmdcbiAqIC0gMTogdGhlIG5vdGUgbGV0dGVyXG4gKiAtIDI6IHRoZSBvcHRpb25hbCBhY2NpZGVudGFsc1xuICogLSAzOiB0aGUgb3B0aW9uYWwgb2N0YXZlXG4gKiAtIDQ6IHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgKHRyaW1tZWQpXG4gKlxuICogQGV4YW1wbGVcbiAqIHZhciBwYXJzZXIgPSByZXF1aXJlKCdub3RlLXBhcnNlcicpXG4gKiBwYXJzZXIucmVnZXguZXhlYygnYyM0JylcbiAqIC8vID0+IFsnYyM0JywgJ2MnLCAnIycsICc0JywgJyddXG4gKiBwYXJzZXIucmVnZXguZXhlYygnYyM0IG1ham9yJylcbiAqIC8vID0+IFsnYyM0bWFqb3InLCAnYycsICcjJywgJzQnLCAnbWFqb3InXVxuICogcGFyc2VyLnJlZ2V4KCkuZXhlYygnQ01hajcnKVxuICogLy8gPT4gWydDTWFqNycsICdDJywgJycsICcnLCAnTWFqNyddXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdleCAoKSB7IHJldHVybiBSRUdFWCB9XG5cbnZhciBTRU1JVE9ORVMgPSBbMCwgMiwgNCwgNSwgNywgOSwgMTFdXG4vKipcbiAqIFBhcnNlIGEgbm90ZSBuYW1lIGluIHNjaWVudGlmaWMgbm90YXRpb24gYW4gcmV0dXJuIGl0J3MgY29tcG9uZW50cyxcbiAqIGFuZCBzb21lIG51bWVyaWMgcHJvcGVydGllcyBpbmNsdWRpbmcgbWlkaSBudW1iZXIgYW5kIGZyZXF1ZW5jeS5cbiAqXG4gKiBAbmFtZSBwYXJzZVxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gbm90ZSAtIHRoZSBub3RlIHN0cmluZyB0byBiZSBwYXJzZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNUb25pYyAtIHRydWUgdGhlIHN0cmluZ3MgaXQncyBzdXBwb3NlZCB0byBjb250YWluIGEgbm90ZSBudW1iZXJcbiAqIGFuZCBzb21lIGNhdGVnb3J5IChmb3IgZXhhbXBsZSBhbiBzY2FsZTogJ0MjIG1ham9yJykuIEl0J3MgZmFsc2UgYnkgZGVmYXVsdCxcbiAqIGJ1dCB3aGVuIHRydWUsIGVuIGV4dHJhIHRvbmljT2YgcHJvcGVydHkgaXMgcmV0dXJuZWQgd2l0aCB0aGUgY2F0ZWdvcnkgKCdtYWpvcicpXG4gKiBAcGFyYW0ge0Zsb2F0fSB0dW5uaW5nIC0gVGhlIGZyZXF1ZW5jeSBvZiBBNCBub3RlIHRvIGNhbGN1bGF0ZSBmcmVxdWVuY2llcy5cbiAqIEJ5IGRlZmF1bHQgaXQgNDQwLlxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgcGFyc2VkIG5vdGUgbmFtZSBvciBudWxsIGlmIG5vdCBhIHZhbGlkIG5vdGVcbiAqXG4gKiBUaGUgcGFyc2VkIG5vdGUgbmFtZSBvYmplY3Qgd2lsbCBBTFdBWVMgY29udGFpbnM6XG4gKiAtIGxldHRlcjogdGhlIHVwcGVyY2FzZSBsZXR0ZXIgb2YgdGhlIG5vdGVcbiAqIC0gYWNjOiB0aGUgYWNjaWRlbnRhbHMgb2YgdGhlIG5vdGUgKG9ubHkgc2hhcnBzIG9yIGZsYXRzKVxuICogLSBwYzogdGhlIHBpdGNoIGNsYXNzIChsZXR0ZXIgKyBhY2MpXG4gKiAtIHN0ZXA6IHMgYSBudW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsZXR0ZXIuIEl0J3MgYW4gaW50ZWdlciBmcm9tIDAgdG8gNlxuICogd2hlcmUgMCA9IEMsIDEgPSBEIC4uLiA2ID0gQlxuICogLSBhbHQ6IGEgbnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWNjaWRlbnRhbHMuIDAgbWVhbnMgbm8gYWx0ZXJhdGlvbixcbiAqIHBvc2l0aXZlIG51bWJlcnMgYXJlIGZvciBzaGFycHMgYW5kIG5lZ2F0aXZlIGZvciBmbGF0c1xuICogLSBjaHJvbWE6IGEgbnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGl0Y2ggY2xhc3MuIEl0J3MgbGlrZSBtaWRpIGZvclxuICogcGl0Y2ggY2xhc3Nlcy4gMCA9IEMsIDEgPSBDIywgMiA9IEQgLi4uIDExID0gQi4gQ2FuIGJlIHVzZWQgdG8gZmluZCBlbmhhcm1vbmljc1xuICogc2luY2UsIGZvciBleGFtcGxlLCBjaHJvbWEgb2YgJ0NiJyBhbmQgJ0InIGFyZSBib3RoIDExXG4gKlxuICogSWYgdGhlIG5vdGUgaGFzIG9jdGF2ZSwgdGhlIHBhcnNlciBvYmplY3Qgd2lsbCBjb250YWluOlxuICogLSBvY3Q6IHRoZSBvY3RhdmUgbnVtYmVyIChhcyBpbnRlZ2VyKVxuICogLSBtaWRpOiB0aGUgbWlkaSBudW1iZXJcbiAqIC0gZnJlcTogdGhlIGZyZXF1ZW5jeSAodXNpbmcgdHVuaW5nIHBhcmFtZXRlciBhcyBiYXNlKVxuICpcbiAqIElmIHRoZSBwYXJhbWV0ZXIgYGlzVG9uaWNgIGlzIHNldCB0byB0cnVlLCB0aGUgcGFyc2VkIG9iamVjdCB3aWxsIGNvbnRhaW46XG4gKiAtIHRvbmljT2Y6IHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgdGhhdCBmb2xsb3dzIG5vdGUgbmFtZSAobGVmdCBhbmQgcmlnaHQgdHJpbW1lZClcbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIHBhcnNlID0gcmVxdWlyZSgnbm90ZS1wYXJzZXInKS5wYXJzZVxuICogcGFyc2UoJ0NiNCcpXG4gKiAvLyA9PiB7IGxldHRlcjogJ0MnLCBhY2M6ICdiJywgcGM6ICdDYicsIHN0ZXA6IDAsIGFsdDogLTEsIGNocm9tYTogLTEsXG4gKiAgICAgICAgIG9jdDogNCwgbWlkaTogNTksIGZyZXE6IDI0Ni45NDE2NTA2MjgwNjIwNiB9XG4gKiAvLyBpZiBubyBvY3RhdmUsIG5vIG1pZGksIG5vIGZyZXFcbiAqIHBhcnNlKCdmeCcpXG4gKiAvLyA9PiB7IGxldHRlcjogJ0YnLCBhY2M6ICcjIycsIHBjOiAnRiMjJywgc3RlcDogMywgYWx0OiAyLCBjaHJvbWE6IDcgfSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlIChzdHIsIGlzVG9uaWMsIHR1bmluZykge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHJldHVybiBudWxsXG4gIHZhciBtID0gUkVHRVguZXhlYyhzdHIpXG4gIGlmICghbSB8fCAoIWlzVG9uaWMgJiYgbVs0XSkpIHJldHVybiBudWxsXG5cbiAgdmFyIHAgPSB7IGxldHRlcjogbVsxXS50b1VwcGVyQ2FzZSgpLCBhY2M6IG1bMl0ucmVwbGFjZSgveC9nLCAnIyMnKSB9XG4gIHAucGMgPSBwLmxldHRlciArIHAuYWNjXG4gIHAuc3RlcCA9IChwLmxldHRlci5jaGFyQ29kZUF0KDApICsgMykgJSA3XG4gIHAuYWx0ID0gcC5hY2NbMF0gPT09ICdiJyA/IC1wLmFjYy5sZW5ndGggOiBwLmFjYy5sZW5ndGhcbiAgdmFyIHBvcyA9IFNFTUlUT05FU1twLnN0ZXBdICsgcC5hbHRcbiAgcC5jaHJvbWEgPSBwb3MgPCAwID8gMTIgKyBwb3MgOiBwb3MgJSAxMlxuICBpZiAobVszXSkgeyAvLyBoYXMgb2N0YXZlXG4gICAgcC5vY3QgPSArbVszXVxuICAgIHAubWlkaSA9IHBvcyArIDEyICogKHAub2N0ICsgMSlcbiAgICBwLmZyZXEgPSBtaWRpVG9GcmVxKHAubWlkaSwgdHVuaW5nKVxuICB9XG4gIGlmIChpc1RvbmljKSBwLnRvbmljT2YgPSBtWzRdXG4gIHJldHVybiBwXG59XG5cbnZhciBMRVRURVJTID0gJ0NERUZHQUInXG5mdW5jdGlvbiBhY2NTdHIgKG4pIHsgcmV0dXJuICFpc051bShuKSA/ICcnIDogbiA8IDAgPyBmaWxsU3RyKCdiJywgLW4pIDogZmlsbFN0cignIycsIG4pIH1cbmZ1bmN0aW9uIG9jdFN0ciAobikgeyByZXR1cm4gIWlzTnVtKG4pID8gJycgOiAnJyArIG4gfVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGEgcGFyc2VkIG9iamVjdCBvciBgc3RlcCwgYWx0ZXJhdGlvbiwgb2N0YXZlYCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gdGhlIHBhcnNlZCBkYXRhIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSBhIG5vdGUgc3RyaW5nIG9yIG51bGwgaWYgbm90IHZhbGlkIHBhcmFtZXRlcnNcbiAqIEBzaW5jZSAxLjJcbiAqIEBleGFtcGxlXG4gKiBwYXJzZXIuYnVpbGQocGFyc2VyLnBhcnNlKCdjYjInKSkgLy8gPT4gJ0NiMidcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gaXQgYWNjZXB0cyAoc3RlcCwgYWx0ZXJhdGlvbiwgb2N0YXZlKSBwYXJhbWV0ZXJzOlxuICogcGFyc2VyLmJ1aWxkKDMpIC8vID0+ICdGJ1xuICogcGFyc2VyLmJ1aWxkKDMsIC0xKSAvLyA9PiAnRmInXG4gKiBwYXJzZXIuYnVpbGQoMywgLTEsIDQpIC8vID0+ICdGYjQnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZCAocywgYSwgbykge1xuICBpZiAocyA9PT0gbnVsbCB8fCB0eXBlb2YgcyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBudWxsXG4gIGlmIChzLnN0ZXApIHJldHVybiBidWlsZChzLnN0ZXAsIHMuYWx0LCBzLm9jdClcbiAgaWYgKHMgPCAwIHx8IHMgPiA2KSByZXR1cm4gbnVsbFxuICByZXR1cm4gTEVUVEVSUy5jaGFyQXQocykgKyBhY2NTdHIoYSkgKyBvY3RTdHIobylcbn1cblxuLyoqXG4gKiBHZXQgbWlkaSBvZiBhIG5vdGVcbiAqXG4gKiBAbmFtZSBtaWRpXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7U3RyaW5nfEludGVnZXJ9IG5vdGUgLSB0aGUgbm90ZSBuYW1lIG9yIG1pZGkgbnVtYmVyXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSB0aGUgbWlkaSBudW1iZXIgb2YgdGhlIG5vdGUgb3IgbnVsbCBpZiBub3QgYSB2YWxpZCBub3RlXG4gKiBvciB0aGUgbm90ZSBkb2VzIE5PVCBjb250YWlucyBvY3RhdmVcbiAqIEBleGFtcGxlXG4gKiB2YXIgcGFyc2VyID0gcmVxdWlyZSgnbm90ZS1wYXJzZXInKVxuICogcGFyc2VyLm1pZGkoJ0E0JykgLy8gPT4gNjlcbiAqIHBhcnNlci5taWRpKCdBJykgLy8gPT4gbnVsbFxuICogQGV4YW1wbGVcbiAqIC8vIG1pZGkgbnVtYmVycyBhcmUgYnlwYXNzZWQgKGV2ZW4gYXMgc3RyaW5ncylcbiAqIHBhcnNlci5taWRpKDYwKSAvLyA9PiA2MFxuICogcGFyc2VyLm1pZGkoJzYwJykgLy8gPT4gNjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pZGkgKG5vdGUpIHtcbiAgaWYgKChpc051bShub3RlKSB8fCBpc1N0cihub3RlKSkgJiYgbm90ZSA+PSAwICYmIG5vdGUgPCAxMjgpIHJldHVybiArbm90ZVxuICB2YXIgcCA9IHBhcnNlKG5vdGUpXG4gIHJldHVybiBwICYmIGlzRGVmKHAubWlkaSkgPyBwLm1pZGkgOiBudWxsXG59XG5cbi8qKlxuICogR2V0IGZyZXEgb2YgYSBub3RlIGluIGhlcnR6cyAoaW4gYSB3ZWxsIHRlbXBlcmVkIDQ0MEh6IEE0KVxuICpcbiAqIEBuYW1lIGZyZXFcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IG5vdGUgLSB0aGUgbm90ZSBuYW1lIG9yIG5vdGUgbWlkaSBudW1iZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0dW5pbmcgLSAoT3B0aW9uYWwpIHRoZSBBNCBmcmVxdWVuY3kgKDQ0MCBieSBkZWZhdWx0KVxuICogQHJldHVybiB7RmxvYXR9IHRoZSBmcmVxIG9mIHRoZSBudW1iZXIgaWYgaGVydHpzIG9yIG51bGwgaWYgbm90IHZhbGlkIG5vdGVcbiAqIEBleGFtcGxlXG4gKiB2YXIgcGFyc2VyID0gcmVxdWlyZSgnbm90ZS1wYXJzZXInKVxuICogcGFyc2VyLmZyZXEoJ0E0JykgLy8gPT4gNDQwXG4gKiBwYXJzZXIuZnJlcSgnQScpIC8vID0+IG51bGxcbiAqIEBleGFtcGxlXG4gKiAvLyBjYW4gY2hhbmdlIHR1bmluZyAoNDQwIGJ5IGRlZmF1bHQpXG4gKiBwYXJzZXIuZnJlcSgnQTQnLCA0NDQpIC8vID0+IDQ0NFxuICogcGFyc2VyLmZyZXEoJ0EzJywgNDQ0KSAvLyA9PiAyMjJcbiAqIEBleGFtcGxlXG4gKiAvLyBpdCBhY2NlcHRzIG1pZGkgbnVtYmVycyAoYXMgbnVtYmVycyBhbmQgYXMgc3RyaW5ncylcbiAqIHBhcnNlci5mcmVxKDY5KSAvLyA9PiA0NDBcbiAqIHBhcnNlci5mcmVxKCc2OScsIDQ0MikgLy8gPT4gNDQyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcmVxIChub3RlLCB0dW5pbmcpIHtcbiAgdmFyIG0gPSBtaWRpKG5vdGUpXG4gIHJldHVybiBtID09PSBudWxsID8gbnVsbCA6IG1pZGlUb0ZyZXEobSwgdHVuaW5nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGV0dGVyIChzcmMpIHsgcmV0dXJuIChwYXJzZShzcmMpIHx8IHt9KS5sZXR0ZXIgfVxuZXhwb3J0IGZ1bmN0aW9uIGFjYyAoc3JjKSB7IHJldHVybiAocGFyc2Uoc3JjKSB8fCB7fSkuYWNjIH1cbmV4cG9ydCBmdW5jdGlvbiBwYyAoc3JjKSB7IHJldHVybiAocGFyc2Uoc3JjKSB8fCB7fSkucGMgfVxuZXhwb3J0IGZ1bmN0aW9uIHN0ZXAgKHNyYykgeyByZXR1cm4gKHBhcnNlKHNyYykgfHwge30pLnN0ZXAgfVxuZXhwb3J0IGZ1bmN0aW9uIGFsdCAoc3JjKSB7IHJldHVybiAocGFyc2Uoc3JjKSB8fCB7fSkuYWx0IH1cbmV4cG9ydCBmdW5jdGlvbiBjaHJvbWEgKHNyYykgeyByZXR1cm4gKHBhcnNlKHNyYykgfHwge30pLmNocm9tYSB9XG5leHBvcnQgZnVuY3Rpb24gb2N0IChzcmMpIHsgcmV0dXJuIChwYXJzZShzcmMpIHx8IHt9KS5vY3QgfVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L25vdGUtcGFyc2VyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS9kdXBsZXgtYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gMTQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qc1xuLy8gbW9kdWxlIGlkID0gMTQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYnVmZmVyU2hpbSA9IHJlcXVpcmUoJ2J1ZmZlci1zaGltcycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyTGlzdDtcblxuZnVuY3Rpb24gQnVmZmVyTGlzdCgpIHtcbiAgdGhpcy5oZWFkID0gbnVsbDtcbiAgdGhpcy50YWlsID0gbnVsbDtcbiAgdGhpcy5sZW5ndGggPSAwO1xufVxuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHRoaXMudGFpbC5uZXh0ID0gZW50cnk7ZWxzZSB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgdGhpcy50YWlsID0gZW50cnk7XG4gICsrdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKHYpIHtcbiAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiB0aGlzLmhlYWQgfTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgdGhpcy5oZWFkID0gZW50cnk7XG4gICsrdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIHZhciByZXQgPSB0aGlzLmhlYWQuZGF0YTtcbiAgaWYgKHRoaXMubGVuZ3RoID09PSAxKSB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO2Vsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQ7XG4gIC0tdGhpcy5sZW5ndGg7XG4gIHJldHVybiByZXQ7XG59O1xuXG5CdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtcbiAgdGhpcy5sZW5ndGggPSAwO1xufTtcblxuQnVmZmVyTGlzdC5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uIChzKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgdmFyIHJldCA9ICcnICsgcC5kYXRhO1xuICB3aGlsZSAocCA9IHAubmV4dCkge1xuICAgIHJldCArPSBzICsgcC5kYXRhO1xuICB9cmV0dXJuIHJldDtcbn07XG5cbkJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIChuKSB7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJ1ZmZlclNoaW0uYWxsb2MoMCk7XG4gIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMuaGVhZC5kYXRhO1xuICB2YXIgcmV0ID0gYnVmZmVyU2hpbS5hbGxvY1Vuc2FmZShuID4+PiAwKTtcbiAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gIHZhciBpID0gMDtcbiAgd2hpbGUgKHApIHtcbiAgICBwLmRhdGEuY29weShyZXQsIGkpO1xuICAgIGkgKz0gcC5kYXRhLmxlbmd0aDtcbiAgICBwID0gcC5uZXh0O1xuICB9XG4gIHJldHVybiByZXQ7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvQnVmZmVyTGlzdC5qc1xuLy8gbW9kdWxlIGlkID0gMTQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpLlBhc3NUaHJvdWdoXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL3JlYWRhYmxlJykuVHJhbnNmb3JtXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vcmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qc1xuLy8gbW9kdWxlIGlkID0gMTQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3JlYWRhYmxlLXN0cmVhbS93cml0YWJsZS1icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgcmVnaXN0ZXJJbW1lZGlhdGU7XG5cbiAgICBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbiAgICAgIC8vIENhbGxiYWNrIGNhbiBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNhbGxiYWNrID0gbmV3IEZ1bmN0aW9uKFwiXCIgKyBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgICAvLyBDb3B5IGZ1bmN0aW9uIGFyZ3VtZW50c1xuICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMV07XG4gICAgICB9XG4gICAgICAvLyBTdG9yZSBhbmQgcmVnaXN0ZXIgdGhlIHRhc2tcbiAgICAgIHZhciB0YXNrID0geyBjYWxsYmFjazogY2FsbGJhY2ssIGFyZ3M6IGFyZ3MgfTtcbiAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSB0YXNrO1xuICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUobmV4dEhhbmRsZSk7XG4gICAgICByZXR1cm4gbmV4dEhhbmRsZSsrO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGhhbmRsZSkge1xuICAgICAgICBkZWxldGUgdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bih0YXNrKSB7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHRhc2suY2FsbGJhY2s7XG4gICAgICAgIHZhciBhcmdzID0gdGFzay5hcmdzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FsbGJhY2soYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJ1bklmUHJlc2VudChoYW5kbGUpIHtcbiAgICAgICAgLy8gRnJvbSB0aGUgc3BlYzogXCJXYWl0IHVudGlsIGFueSBpbnZvY2F0aW9ucyBvZiB0aGlzIGFsZ29yaXRobSBzdGFydGVkIGJlZm9yZSB0aGlzIG9uZSBoYXZlIGNvbXBsZXRlZC5cIlxuICAgICAgICAvLyBTbyBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyBhIHRhc2ssIHdlJ2xsIG5lZWQgdG8gZGVsYXkgdGhpcyBpbnZvY2F0aW9uLlxuICAgICAgICBpZiAoY3VycmVudGx5UnVubmluZ0FUYXNrKSB7XG4gICAgICAgICAgICAvLyBEZWxheSBieSBkb2luZyBhIHNldFRpbWVvdXQuIHNldEltbWVkaWF0ZSB3YXMgdHJpZWQgaW5zdGVhZCwgYnV0IGluIEZpcmVmb3ggNyBpdCBnZW5lcmF0ZWQgYVxuICAgICAgICAgICAgLy8gXCJ0b28gbXVjaCByZWN1cnNpb25cIiBlcnJvci5cbiAgICAgICAgICAgIHNldFRpbWVvdXQocnVuSWZQcmVzZW50LCAwLCBoYW5kbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgICAgICAgICBpZiAodGFzaykge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcnVuKHRhc2spO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW1tZWRpYXRlKGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseVJ1bm5pbmdBVGFzayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7IHJ1bklmUHJlc2VudChoYW5kbGUpOyB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5Vc2VQb3N0TWVzc2FnZSgpIHtcbiAgICAgICAgLy8gVGhlIHRlc3QgYWdhaW5zdCBgaW1wb3J0U2NyaXB0c2AgcHJldmVudHMgdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIGluc3RhbGxlZCBpbnNpZGUgYSB3ZWIgd29ya2VyLFxuICAgICAgICAvLyB3aGVyZSBgZ2xvYmFsLnBvc3RNZXNzYWdlYCBtZWFucyBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQgYW5kIGNhbid0IGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS5cbiAgICAgICAgaWYgKGdsb2JhbC5wb3N0TWVzc2FnZSAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMpIHtcbiAgICAgICAgICAgIHZhciBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvbGRPbk1lc3NhZ2UgPSBnbG9iYWwub25tZXNzYWdlO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoXCJcIiwgXCIqXCIpO1xuICAgICAgICAgICAgZ2xvYmFsLm9ubWVzc2FnZSA9IG9sZE9uTWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBwb3N0TWVzc2FnZUlzQXN5bmNocm9ub3VzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIC8vIEluc3RhbGxzIGFuIGV2ZW50IGhhbmRsZXIgb24gYGdsb2JhbGAgZm9yIHRoZSBgbWVzc2FnZWAgZXZlbnQ6IHNlZVxuICAgICAgICAvLyAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0RPTS93aW5kb3cucG9zdE1lc3NhZ2VcbiAgICAgICAgLy8gKiBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS9jb21tcy5odG1sI2Nyb3NzRG9jdW1lbnRNZXNzYWdlc1xuXG4gICAgICAgIHZhciBtZXNzYWdlUHJlZml4ID0gXCJzZXRJbW1lZGlhdGUkXCIgKyBNYXRoLnJhbmRvbSgpICsgXCIkXCI7XG4gICAgICAgIHZhciBvbkdsb2JhbE1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSA9PT0gZ2xvYmFsICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4T2YobWVzc2FnZVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoK2V2ZW50LmRhdGEuc2xpY2UobWVzc2FnZVByZWZpeC5sZW5ndGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UsIGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsb2JhbC5hdHRhY2hFdmVudChcIm9ubWVzc2FnZVwiLCBvbkdsb2JhbE1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShtZXNzYWdlUHJlZml4ICsgaGFuZGxlLCBcIipcIik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICB2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgICAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICB2YXIgc2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGh0bWwucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgICAgICBzY3JpcHQgPSBudWxsO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCkge1xuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSWYgc3VwcG9ydGVkLCB3ZSBzaG91bGQgYXR0YWNoIHRvIHRoZSBwcm90b3R5cGUgb2YgZ2xvYmFsLCBzaW5jZSB0aGF0IGlzIHdoZXJlIHNldFRpbWVvdXQgZXQgYWwuIGxpdmUuXG4gICAgdmFyIGF0dGFjaFRvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwpO1xuICAgIGF0dGFjaFRvID0gYXR0YWNoVG8gJiYgYXR0YWNoVG8uc2V0VGltZW91dCA/IGF0dGFjaFRvIDogZ2xvYmFsO1xuXG4gICAgLy8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBlLmcuIGJyb3dzZXJpZnkgZW52aXJvbm1lbnRzLlxuICAgIGlmICh7fS50b1N0cmluZy5jYWxsKGdsb2JhbC5wcm9jZXNzKSA9PT0gXCJbb2JqZWN0IHByb2Nlc3NdXCIpIHtcbiAgICAgICAgLy8gRm9yIE5vZGUuanMgYmVmb3JlIDAuOVxuICAgICAgICBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChjYW5Vc2VQb3N0TWVzc2FnZSgpKSB7XG4gICAgICAgIC8vIEZvciBub24tSUUxMCBtb2Rlcm4gYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFBvc3RNZXNzYWdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZ2xvYmFsLk1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICAgIC8vIEZvciB3ZWIgd29ya2Vycywgd2hlcmUgc3VwcG9ydGVkXG4gICAgICAgIGluc3RhbGxNZXNzYWdlQ2hhbm5lbEltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGRvYyAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSB7XG4gICAgICAgIC8vIEZvciBJRSA24oCTOFxuICAgICAgICBpbnN0YWxsUmVhZHlTdGF0ZUNoYW5nZUltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgaW5zdGFsbFNldFRpbWVvdXRJbXBsZW1lbnRhdGlvbigpO1xuICAgIH1cblxuICAgIGF0dGFjaFRvLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICBhdHRhY2hUby5jbGVhckltbWVkaWF0ZSA9IGNsZWFySW1tZWRpYXRlO1xufSh0eXBlb2Ygc2VsZiA9PT0gXCJ1bmRlZmluZWRcIiA/IHR5cGVvZiBnbG9iYWwgPT09IFwidW5kZWZpbmVkXCIgPyB0aGlzIDogZ2xvYmFsIDogc2VsZikpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDE0OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxubW9kdWxlLmV4cG9ydHMgPSBTdHJlYW07XG5cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmluaGVyaXRzKFN0cmVhbSwgRUUpO1xuU3RyZWFtLlJlYWRhYmxlID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzJyk7XG5TdHJlYW0uV3JpdGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUuanMnKTtcblN0cmVhbS5EdXBsZXggPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0vZHVwbGV4LmpzJyk7XG5TdHJlYW0uVHJhbnNmb3JtID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcycpO1xuU3RyZWFtLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgncmVhZGFibGUtc3RyZWFtL3Bhc3N0aHJvdWdoLmpzJyk7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuNC54XG5TdHJlYW0uU3RyZWFtID0gU3RyZWFtO1xuXG5cblxuLy8gb2xkLXN0eWxlIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhlIHBpcGUgbWV0aG9kICh0aGUgb25seSByZWxldmFudFxuLy8gcGFydCBvZiB0aGlzIGNsYXNzKSBpcyBvdmVycmlkZGVuIGluIHRoZSBSZWFkYWJsZSBjbGFzcy5cblxuZnVuY3Rpb24gU3RyZWFtKCkge1xuICBFRS5jYWxsKHRoaXMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbihkZXN0LCBvcHRpb25zKSB7XG4gIHZhciBzb3VyY2UgPSB0aGlzO1xuXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGlmIChkZXN0LndyaXRhYmxlKSB7XG4gICAgICBpZiAoZmFsc2UgPT09IGRlc3Qud3JpdGUoY2h1bmspICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgICBzb3VyY2UucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzb3VyY2Uub24oJ2RhdGEnLCBvbmRhdGEpO1xuXG4gIGZ1bmN0aW9uIG9uZHJhaW4oKSB7XG4gICAgaWYgKHNvdXJjZS5yZWFkYWJsZSAmJiBzb3VyY2UucmVzdW1lKSB7XG4gICAgICBzb3VyY2UucmVzdW1lKCk7XG4gICAgfVxuICB9XG5cbiAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKTtcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKTtcbiAgICBzb3VyY2Uub24oJ2Nsb3NlJywgb25jbG9zZSk7XG4gIH1cblxuICB2YXIgZGlkT25FbmQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm47XG4gICAgZGlkT25FbmQgPSB0cnVlO1xuXG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gb25jbG9zZSgpIHtcbiAgICBpZiAoZGlkT25FbmQpIHJldHVybjtcbiAgICBkaWRPbkVuZCA9IHRydWU7XG5cbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBkb24ndCBsZWF2ZSBkYW5nbGluZyBwaXBlcyB3aGVuIHRoZXJlIGFyZSBlcnJvcnMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKEVFLmxpc3RlbmVyQ291bnQodGhpcywgJ2Vycm9yJykgPT09IDApIHtcbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgc3RyZWFtIGVycm9yIGluIHBpcGUuXG4gICAgfVxuICB9XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuXG4gIC8vIHJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG5cbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApO1xuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKTtcblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgY2xlYW51cCk7XG4gIH1cblxuICBzb3VyY2Uub24oJ2VuZCcsIGNsZWFudXApO1xuICBzb3VyY2Uub24oJ2Nsb3NlJywgY2xlYW51cCk7XG5cbiAgZGVzdC5vbignY2xvc2UnLCBjbGVhbnVwKTtcblxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzb3VyY2UpO1xuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9zdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTQ5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQSBtaWRpIG5vdGUgbnVtYmVyIGlzIGEgbnVtYmVyIHJlcHJlc2VudGF0aW9uIG9mIGEgbm90ZSBwaXRjaC4gSXQgY2FuIGJlXG4gKiBpbnRlZ2VycyBzbyBpdCdzIGVxdWFsIHRlbXBlcmVkIHR1bmVkLCBvciBmbG9hdCB0byBpbmRpY2F0ZSBpdCdzIG5vdFxuICogdHVuZWQgaW50byBlcXVhbCB0ZW1lcGVyZWQgc2NhbGUuXG4gKlxuICogVGhpcyBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIHRvIGNvbnZlcnQgdG8gYW5kIGZyb20gbWlkaSBub3Rlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIG1pZGkgPSByZXF1aXJlKCd0b25hbC1taWRpJylcbiAqIG1pZGkudG9NaWRpKCdBNCcpIC8vID0+IDY5XG4gKiBtaWRpLm5vdGUoNjkpIC8vID0+ICdBNCdcbiAqIG1pZGkubm90ZSg2MSkgLy8gPT4gJ0RiNCdcbiAqIG1pZGkubm90ZSg2MSwgdHJ1ZSkgLy8gPT4gJ0MjNCdcbiAqXG4gKiBAbW9kdWxlIG1pZGlcbiAqL1xuXG5pbXBvcnQgeyBtaWRpIH0gZnJvbSAnbm90ZS1wYXJzZXInXG5cbi8qKlxuICogQ29udmVydCB0aGUgZ2l2ZW4gbm90ZSB0byBhIG1pZGkgbm90ZSBudW1iZXIuIElmIHlvdSBwYXNzIGEgbWlkaSBudW1iZXIgaXRcbiAqIHdpbGwgcmV0dXJuZWQgYXMgaXMuXG4gKlxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd8TnVtYmVyfSBub3RlIC0gdGhlIG5vdGUgdG8gZ2V0IHRoZSBtaWRpIG51bWJlciBmcm9tXG4gKiBAcmV0dXJuIHtJbnRlZ2VyfSB0aGUgbWlkaSBudW1iZXIgb3IgbnVsbCBpZiBub3QgdmFsaWQgcGl0Y2hcbiAqIEBleGFtcGxlXG4gKiBtaWRpLnRvTWlkaSgnQzQnKSAvLyA9PiA2MFxuICogbWlkaS50b01pZGkoNjApIC8vID0+IDYwXG4gKiBtaWRpLnRvTWlkaSgnNjAnKSAvLyA9PiA2MFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9NaWRpICh2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoID09PSAyKSByZXR1cm4gdmFsWzBdICogNyArIHZhbFsxXSAqIDEyICsgMTJcbiAgcmV0dXJuIG1pZGkodmFsKVxufVxuXG52YXIgRkxBVFMgPSAnQyBEYiBEIEViIEUgRiBHYiBHIEFiIEEgQmIgQicuc3BsaXQoJyAnKVxudmFyIFNIQVJQUyA9ICdDIEMjIEQgRCMgRSBGIEYjIEcgRyMgQSBBIyBCJy5zcGxpdCgnICcpXG5cbi8qKlxuICogR2l2ZW4gYSBtaWRpIG51bWJlciwgcmV0dXJucyBhIG5vdGUgbmFtZS4gVGhlIGFsdGVyZWQgbm90ZXMgd2lsbCBoYXZlXG4gKiBmbGF0cyB1bmxlc3MgZXhwbGljaXRseSBzZXQgd2l0aCB0aGUgb3B0aW9uYWwgYHVzZVNoYXJwc2AgcGFyYW1ldGVyLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtJbnRlZ2VyfSBtaWRpIC0gdGhlIG1pZGkgbm90ZSBudW1iZXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdXNlU2hhcnBzIC0gKE9wdGlvbmFsKSBzZXQgdG8gdHJ1ZSB0byB1c2Ugc2hhcnBzIGluc3RlYWQgb2YgZmxhdHNcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIG5vdGUgbmFtZVxuICogQGV4YW1wbGVcbiAqIHZhciBtaWRpID0gcmVxdWlyZSgndG9uYWwtbWlkaScpXG4gKiBtaWRpLm5vdGUoNjEpIC8vID0+ICdEYjQnXG4gKiBtaWRpLm5vdGUoNjEsIHRydWUpIC8vID0+ICdDIzQnXG4gKiAvLyBpdCByb3VuZHMgdG8gbmVhcmVzdCBub3RlXG4gKiBtaWRpLm5vdGUoNjEuNykgLy8gPT4gJ0Q0J1xuICovXG5leHBvcnQgZnVuY3Rpb24gbm90ZSAobnVtLCBzaGFycHMpIHtcbiAgaWYgKG51bSA9PT0gdHJ1ZSB8fCBudW0gPT09IGZhbHNlKSByZXR1cm4gZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG5vdGUobSwgbnVtKSB9XG4gIG51bSA9IE1hdGgucm91bmQobnVtKVxuICB2YXIgcGNzID0gc2hhcnBzID09PSB0cnVlID8gU0hBUlBTIDogRkxBVFNcbiAgdmFyIHBjID0gcGNzW251bSAlIDEyXVxuICB2YXIgbyA9IE1hdGguZmxvb3IobnVtIC8gMTIpIC0gMVxuICByZXR1cm4gcGMgKyBvXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdG9uYWwtbWlkaS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTUwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcHJlY2F0ZTtcblxuLyoqXG4gKiBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuICogUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLm5vRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRocm93RGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgdGhyb3cgYW4gRXJyb3Igd2hlbiBpbnZva2VkLlxuICpcbiAqIElmIGBsb2NhbFN0b3JhZ2UudHJhY2VEZXByZWNhdGlvbiA9IHRydWVgIGlzIHNldCwgdGhlbiBkZXByZWNhdGVkIGZ1bmN0aW9uc1xuICogd2lsbCBpbnZva2UgYGNvbnNvbGUudHJhY2UoKWAgaW5zdGVhZCBvZiBgY29uc29sZS5lcnJvcigpYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byBkZXByZWNhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgLSB0aGUgc3RyaW5nIHRvIHByaW50IHRvIHRoZSBjb25zb2xlIHdoZW4gYGZuYCBpcyBpbnZva2VkXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGEgbmV3IFwiZGVwcmVjYXRlZFwiIHZlcnNpb24gb2YgYGZuYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXByZWNhdGUgKGZuLCBtc2cpIHtcbiAgaWYgKGNvbmZpZygnbm9EZXByZWNhdGlvbicpKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAoY29uZmlnKCd0aHJvd0RlcHJlY2F0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZygndHJhY2VEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgYGxvY2FsU3RvcmFnZWAgZm9yIGJvb2xlYW4gdmFsdWVzIGZvciB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbmZpZyAobmFtZSkge1xuICAvLyBhY2Nlc3NpbmcgZ2xvYmFsLmxvY2FsU3RvcmFnZSBjYW4gdHJpZ2dlciBhIERPTUV4Y2VwdGlvbiBpbiBzYW5kYm94ZWQgaWZyYW1lc1xuICB0cnkge1xuICAgIGlmICghZ2xvYmFsLmxvY2FsU3RvcmFnZSkgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciB2YWwgPSBnbG9iYWwubG9jYWxTdG9yYWdlW25hbWVdO1xuICBpZiAobnVsbCA9PSB2YWwpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIFN0cmluZyh2YWwpLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi91dGlsLWRlcHJlY2F0ZS9icm93c2VyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdXRpbC9+L2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE1MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanNcbi8vIG1vZHVsZSBpZCA9IDE1M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vdXRpbC91dGlsLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLypcblxuV2ViTWlkaSB2Mi4yLjBcblxuV2ViTWlkaS5qcyBoZWxwcyB5b3UgdGFtZSB0aGUgV2ViIE1JREkgQVBJLiBTZW5kIGFuZCByZWNlaXZlIE1JREkgbWVzc2FnZXMgd2l0aCBlYXNlLiBDb250cm9sIGluc3RydW1lbnRzIHdpdGggdXNlci1mcmllbmRseSBmdW5jdGlvbnMgKHBsYXlOb3RlLCBzZW5kUGl0Y2hCZW5kLCBldGMuKS4gUmVhY3QgdG8gTUlESSBpbnB1dCB3aXRoIHNpbXBsZSBldmVudCBsaXN0ZW5lcnMgKG5vdGVvbiwgcGl0Y2hiZW5kLCBjb250cm9sY2hhbmdlLCBldGMuKS5cbmh0dHBzOi8vZ2l0aHViLmNvbS9kamlwY28vd2VibWlkaVxuXG5cblRoZSBNSVQgTGljZW5zZSAoTUlUKVxuXG5Db3B5cmlnaHQgKGMpIDIwMTUtMjAxOCwgSmVhbi1QaGlsaXBwZSBDw7R0w6lcblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZFxuYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbixcbmluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsXG5zdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWxcbnBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUXG5OT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORFxuTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFU1xuT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOXG5DT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuXG4hZnVuY3Rpb24oc2NvcGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIFdlYk1pZGkoKXtpZihXZWJNaWRpLnByb3RvdHlwZS5fc2luZ2xldG9uKXRocm93IG5ldyBFcnJvcihcIldlYk1pZGkgaXMgYSBzaW5nbGV0b24sIGl0IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuXCIpO1dlYk1pZGkucHJvdG90eXBlLl9zaW5nbGV0b249dGhpcyx0aGlzLl9pbnB1dHM9W10sdGhpcy5fb3V0cHV0cz1bXSx0aGlzLl91c2VySGFuZGxlcnM9e30sdGhpcy5fc3RhdGVDaGFuZ2VRdWV1ZT1bXSx0aGlzLl9wcm9jZXNzaW5nU3RhdGVDaGFuZ2U9ITEsdGhpcy5fbWlkaUludGVyZmFjZUV2ZW50cz1bXCJjb25uZWN0ZWRcIixcImRpc2Nvbm5lY3RlZFwiXSx0aGlzLl9ub3Rlcz1bXCJDXCIsXCJDI1wiLFwiRFwiLFwiRCNcIixcIkVcIixcIkZcIixcIkYjXCIsXCJHXCIsXCJHI1wiLFwiQVwiLFwiQSNcIixcIkJcIl0sdGhpcy5fc2VtaXRvbmVzPXtDOjAsRDoyLEU6NCxGOjUsRzo3LEE6OSxCOjExfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtNSURJX1NZU1RFTV9NRVNTQUdFUzp7dmFsdWU6e3N5c2V4OjI0MCx0aW1lY29kZToyNDEsc29uZ3Bvc2l0aW9uOjI0Mixzb25nc2VsZWN0OjI0Myx0dW5pbmdyZXF1ZXN0OjI0NixzeXNleGVuZDoyNDcsY2xvY2s6MjQ4LHN0YXJ0OjI1MCxcImNvbnRpbnVlXCI6MjUxLHN0b3A6MjUyLGFjdGl2ZXNlbnNpbmc6MjU0LHJlc2V0OjI1NSxtaWRpbWVzc2FnZTowLHVua25vd25zeXN0ZW1tZXNzYWdlOi0xfSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0sTUlESV9DSEFOTkVMX01FU1NBR0VTOnt2YWx1ZTp7bm90ZW9mZjo4LG5vdGVvbjo5LGtleWFmdGVydG91Y2g6MTAsY29udHJvbGNoYW5nZToxMSxjaGFubmVsbW9kZToxMSxwcm9ncmFtY2hhbmdlOjEyLGNoYW5uZWxhZnRlcnRvdWNoOjEzLHBpdGNoYmVuZDoxNH0sd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9LE1JRElfUkVHSVNURVJFRF9QQVJBTUVURVI6e3ZhbHVlOntwaXRjaGJlbmRyYW5nZTpbMCwwXSxjaGFubmVsZmluZXR1bmluZzpbMCwxXSxjaGFubmVsY29hcnNldHVuaW5nOlswLDJdLHR1bmluZ3Byb2dyYW06WzAsM10sdHVuaW5nYmFuazpbMCw0XSxtb2R1bGF0aW9ucmFuZ2U6WzAsNV0sYXppbXV0aGFuZ2xlOls2MSwwXSxlbGV2YXRpb25hbmdsZTpbNjEsMV0sZ2FpbjpbNjEsMl0sZGlzdGFuY2VyYXRpbzpbNjEsM10sbWF4aW11bWRpc3RhbmNlOls2MSw0XSxtYXhpbXVtZGlzdGFuY2VnYWluOls2MSw1XSxyZWZlcmVuY2VkaXN0YW5jZXJhdGlvOls2MSw2XSxwYW5zcHJlYWRhbmdsZTpbNjEsN10scm9sbGFuZ2xlOls2MSw4XX0sd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9LE1JRElfQ09OVFJPTF9DSEFOR0VfTUVTU0FHRVM6e3ZhbHVlOntiYW5rc2VsZWN0Y29hcnNlOjAsbW9kdWxhdGlvbndoZWVsY29hcnNlOjEsYnJlYXRoY29udHJvbGxlcmNvYXJzZToyLGZvb3Rjb250cm9sbGVyY29hcnNlOjQscG9ydGFtZW50b3RpbWVjb2Fyc2U6NSxkYXRhZW50cnljb2Fyc2U6Nix2b2x1bWVjb2Fyc2U6NyxiYWxhbmNlY29hcnNlOjgscGFuY29hcnNlOjEwLGV4cHJlc3Npb25jb2Fyc2U6MTEsZWZmZWN0Y29udHJvbDFjb2Fyc2U6MTIsZWZmZWN0Y29udHJvbDJjb2Fyc2U6MTMsZ2VuZXJhbHB1cnBvc2VzbGlkZXIxOjE2LGdlbmVyYWxwdXJwb3Nlc2xpZGVyMjoxNyxnZW5lcmFscHVycG9zZXNsaWRlcjM6MTgsZ2VuZXJhbHB1cnBvc2VzbGlkZXI0OjE5LGJhbmtzZWxlY3RmaW5lOjMyLG1vZHVsYXRpb253aGVlbGZpbmU6MzMsYnJlYXRoY29udHJvbGxlcmZpbmU6MzQsZm9vdGNvbnRyb2xsZXJmaW5lOjM2LHBvcnRhbWVudG90aW1lZmluZTozNyxkYXRhZW50cnlmaW5lOjM4LHZvbHVtZWZpbmU6MzksYmFsYW5jZWZpbmU6NDAscGFuZmluZTo0MixleHByZXNzaW9uZmluZTo0MyxlZmZlY3Rjb250cm9sMWZpbmU6NDQsZWZmZWN0Y29udHJvbDJmaW5lOjQ1LGhvbGRwZWRhbDo2NCxwb3J0YW1lbnRvOjY1LHN1c3RlbnV0b3BlZGFsOjY2LHNvZnRwZWRhbDo2NyxsZWdhdG9wZWRhbDo2OCxob2xkMnBlZGFsOjY5LHNvdW5kdmFyaWF0aW9uOjcwLHJlc29uYW5jZTo3MSxzb3VuZHJlbGVhc2V0aW1lOjcyLHNvdW5kYXR0YWNrdGltZTo3MyxicmlnaHRuZXNzOjc0LHNvdW5kY29udHJvbDY6NzUsc291bmRjb250cm9sNzo3Nixzb3VuZGNvbnRyb2w4Ojc3LHNvdW5kY29udHJvbDk6Nzgsc291bmRjb250cm9sMTA6NzksZ2VuZXJhbHB1cnBvc2VidXR0b24xOjgwLGdlbmVyYWxwdXJwb3NlYnV0dG9uMjo4MSxnZW5lcmFscHVycG9zZWJ1dHRvbjM6ODIsZ2VuZXJhbHB1cnBvc2VidXR0b240OjgzLHJldmVyYmxldmVsOjkxLHRyZW1vbG9sZXZlbDo5MixjaG9ydXNsZXZlbDo5MyxjZWxlc3RlbGV2ZWw6OTQscGhhc2VybGV2ZWw6OTUsZGF0YWJ1dHRvbmluY3JlbWVudDo5NixkYXRhYnV0dG9uZGVjcmVtZW50Ojk3LG5vbnJlZ2lzdGVyZWRwYXJhbWV0ZXJjb2Fyc2U6OTgsbm9ucmVnaXN0ZXJlZHBhcmFtZXRlcmZpbmU6OTkscmVnaXN0ZXJlZHBhcmFtZXRlcmNvYXJzZToxMDAscmVnaXN0ZXJlZHBhcmFtZXRlcmZpbmU6MTAxfSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0sTUlESV9DSEFOTkVMX01PREVfTUVTU0FHRVM6e3ZhbHVlOnthbGxzb3VuZG9mZjoxMjAscmVzZXRhbGxjb250cm9sbGVyczoxMjEsbG9jYWxjb250cm9sOjEyMixhbGxub3Rlc29mZjoxMjMsb21uaW1vZGVvZmY6MTI0LG9tbmltb2Rlb246MTI1LG1vbm9tb2Rlb246MTI2LHBvbHltb2Rlb246MTI3fSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0sb2N0YXZlT2Zmc2V0Ont2YWx1ZTowLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3N1cHBvcnRlZDp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5cInJlcXVlc3RNSURJQWNjZXNzXCJpbiBuYXZpZ2F0b3J9fSxlbmFibGVkOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzW1wiaW50ZXJmYWNlXCJdfS5iaW5kKHRoaXMpfSxpbnB1dHM6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lucHV0c30uYmluZCh0aGlzKX0sb3V0cHV0czp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3V0cHV0c30uYmluZCh0aGlzKX0sc3lzZXhFbmFibGVkOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiEoIXRoaXNbXCJpbnRlcmZhY2VcIl18fCF0aGlzW1wiaW50ZXJmYWNlXCJdLnN5c2V4RW5hYmxlZCl9LmJpbmQodGhpcyl9LHRpbWU6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfX19KX1mdW5jdGlvbiBJbnB1dChtaWRpSW5wdXQpe3ZhciB0aGF0PXRoaXM7dGhpcy5fdXNlckhhbmRsZXJzPXtjaGFubmVsOnt9LHN5c3RlbTp7fX0sdGhpcy5fbWlkaUlucHV0PW1pZGlJbnB1dCxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtjb25uZWN0aW9uOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGF0Ll9taWRpSW5wdXQuY29ubmVjdGlvbn19LGlkOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGF0Ll9taWRpSW5wdXQuaWR9fSxtYW51ZmFjdHVyZXI6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoYXQuX21pZGlJbnB1dC5tYW51ZmFjdHVyZXJ9fSxuYW1lOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGF0Ll9taWRpSW5wdXQubmFtZX19LHN0YXRlOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGF0Ll9taWRpSW5wdXQuc3RhdGV9fSx0eXBlOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGF0Ll9taWRpSW5wdXQudHlwZX19fSksdGhpcy5faW5pdGlhbGl6ZVVzZXJIYW5kbGVycygpLHRoaXMuX21pZGlJbnB1dC5vbm1pZGltZXNzYWdlPXRoaXMuX29uTWlkaU1lc3NhZ2UuYmluZCh0aGlzKX1mdW5jdGlvbiBPdXRwdXQobWlkaU91dHB1dCl7dmFyIHRoYXQ9dGhpczt0aGlzLl9taWRpT3V0cHV0PW1pZGlPdXRwdXQsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7Y29ubmVjdGlvbjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhhdC5fbWlkaU91dHB1dC5jb25uZWN0aW9ufX0saWQ6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoYXQuX21pZGlPdXRwdXQuaWR9fSxtYW51ZmFjdHVyZXI6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoYXQuX21pZGlPdXRwdXQubWFudWZhY3R1cmVyfX0sbmFtZTp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhhdC5fbWlkaU91dHB1dC5uYW1lfX0sc3RhdGU6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoYXQuX21pZGlPdXRwdXQuc3RhdGV9fSx0eXBlOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGF0Ll9taWRpT3V0cHV0LnR5cGV9fX0pfXZhciB3bT1uZXcgV2ViTWlkaTtXZWJNaWRpLnByb3RvdHlwZS5lbmFibGU9ZnVuY3Rpb24oY2FsbGJhY2ssc3lzZXgpe3JldHVybiB0aGlzLmVuYWJsZWQ/dm9pZCAwOnRoaXMuc3VwcG9ydGVkP3ZvaWQgbmF2aWdhdG9yLnJlcXVlc3RNSURJQWNjZXNzKHtzeXNleDpzeXNleH0pLnRoZW4oZnVuY3Rpb24obWlkaUFjY2Vzcyl7ZnVuY3Rpb24gb25Qb3J0c09wZW4oKXtjbGVhclRpbWVvdXQocHJvbWlzZVRpbWVvdXQpLHRoaXMuX3VwZGF0ZUlucHV0c0FuZE91dHB1dHMoKSx0aGlzW1wiaW50ZXJmYWNlXCJdLm9uc3RhdGVjaGFuZ2U9dGhpcy5fb25JbnRlcmZhY2VTdGF0ZUNoYW5nZS5iaW5kKHRoaXMpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGNhbGxiYWNrJiZjYWxsYmFjay5jYWxsKHRoaXMpLGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50KXt0aGlzLl9vbkludGVyZmFjZVN0YXRlQ2hhbmdlKGV2ZW50KX0uYmluZCh0aGlzKSl9dmFyIHByb21pc2VUaW1lb3V0LGV2ZW50cz1bXSxwcm9taXNlcz1bXTt0aGlzW1wiaW50ZXJmYWNlXCJdPW1pZGlBY2Nlc3MsdGhpcy5fcmVzZXRJbnRlcmZhY2VVc2VySGFuZGxlcnMoKSx0aGlzW1wiaW50ZXJmYWNlXCJdLm9uc3RhdGVjaGFuZ2U9ZnVuY3Rpb24oZSl7ZXZlbnRzLnB1c2goZSl9O2Zvcih2YXIgaW5wdXRzPW1pZGlBY2Nlc3MuaW5wdXRzLnZhbHVlcygpLGlucHV0PWlucHV0cy5uZXh0KCk7aW5wdXQmJiFpbnB1dC5kb25lO2lucHV0PWlucHV0cy5uZXh0KCkpcHJvbWlzZXMucHVzaChpbnB1dC52YWx1ZS5vcGVuKCkpO2Zvcih2YXIgb3V0cHV0cz1taWRpQWNjZXNzLm91dHB1dHMudmFsdWVzKCksb3V0cHV0PW91dHB1dHMubmV4dCgpO291dHB1dCYmIW91dHB1dC5kb25lO291dHB1dD1vdXRwdXRzLm5leHQoKSlwcm9taXNlcy5wdXNoKG91dHB1dC52YWx1ZS5vcGVuKCkpO3Byb21pc2VUaW1lb3V0PXNldFRpbWVvdXQob25Qb3J0c09wZW4uYmluZCh0aGlzKSwyMDApLFByb21pc2UmJlByb21pc2UuYWxsKHByb21pc2VzKVtcImNhdGNoXCJdKGZ1bmN0aW9uKGVycil7fSkudGhlbihvblBvcnRzT3Blbi5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSxmdW5jdGlvbihlcnIpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGNhbGxiYWNrJiZjYWxsYmFjay5jYWxsKHRoaXMsZXJyKX0uYmluZCh0aGlzKSk6dm9pZChcImZ1bmN0aW9uXCI9PXR5cGVvZiBjYWxsYmFjayYmY2FsbGJhY2sobmV3IEVycm9yKFwiVGhlIFdlYiBNSURJIEFQSSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHlvdXIgYnJvd3Nlci5cIikpKX0sV2ViTWlkaS5wcm90b3R5cGUuZGlzYWJsZT1mdW5jdGlvbigpe2lmKCF0aGlzLnN1cHBvcnRlZCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgV2ViIE1JREkgQVBJIGlzIG5vdCBzdXBwb3J0ZWQgYnkgeW91ciBicm93c2VyLlwiKTt0aGlzW1wiaW50ZXJmYWNlXCJdJiYodGhpc1tcImludGVyZmFjZVwiXS5vbnN0YXRlY2hhbmdlPXZvaWQgMCksdGhpc1tcImludGVyZmFjZVwiXT12b2lkIDAsdGhpcy5faW5wdXRzPVtdLHRoaXMuX291dHB1dHM9W10sdGhpcy5fcmVzZXRJbnRlcmZhY2VVc2VySGFuZGxlcnMoKX0sV2ViTWlkaS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odHlwZSxsaXN0ZW5lcil7aWYoIXRoaXMuZW5hYmxlZCl0aHJvdyBuZXcgRXJyb3IoXCJXZWJNaWRpIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgYWRkaW5nIGV2ZW50IGxpc3RlbmVycy5cIik7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgbGlzdGVuZXIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAnbGlzdGVuZXInIHBhcmFtZXRlciBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpO2lmKCEodGhpcy5fbWlkaUludGVyZmFjZUV2ZW50cy5pbmRleE9mKHR5cGUpPj0wKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIHNwZWNpZmllZCBldmVudCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuXCIpO3JldHVybiB0aGlzLl91c2VySGFuZGxlcnNbdHlwZV0ucHVzaChsaXN0ZW5lciksdGhpc30sV2ViTWlkaS5wcm90b3R5cGUuaGFzTGlzdGVuZXI9ZnVuY3Rpb24odHlwZSxsaXN0ZW5lcil7aWYoIXRoaXMuZW5hYmxlZCl0aHJvdyBuZXcgRXJyb3IoXCJXZWJNaWRpIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgY2hlY2tpbmcgZXZlbnQgbGlzdGVuZXJzLlwiKTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBsaXN0ZW5lcil0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlICdsaXN0ZW5lcicgcGFyYW1ldGVyIG11c3QgYmUgYSBmdW5jdGlvbi5cIik7aWYoISh0aGlzLl9taWRpSW50ZXJmYWNlRXZlbnRzLmluZGV4T2YodHlwZSk+PTApKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgc3BlY2lmaWVkIGV2ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cIik7Zm9yKHZhciBvPTA7bzx0aGlzLl91c2VySGFuZGxlcnNbdHlwZV0ubGVuZ3RoO28rKylpZih0aGlzLl91c2VySGFuZGxlcnNbdHlwZV1bb109PT1saXN0ZW5lcilyZXR1cm4hMDtyZXR1cm4hMX0sV2ViTWlkaS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24odHlwZSxsaXN0ZW5lcil7aWYoIXRoaXMuZW5hYmxlZCl0aHJvdyBuZXcgRXJyb3IoXCJXZWJNaWRpIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzLlwiKTtpZih2b2lkIDAhPT1saXN0ZW5lciYmXCJmdW5jdGlvblwiIT10eXBlb2YgbGlzdGVuZXIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAnbGlzdGVuZXInIHBhcmFtZXRlciBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpO2lmKHRoaXMuX21pZGlJbnRlcmZhY2VFdmVudHMuaW5kZXhPZih0eXBlKT49MClpZihsaXN0ZW5lcilmb3IodmFyIG89MDtvPHRoaXMuX3VzZXJIYW5kbGVyc1t0eXBlXS5sZW5ndGg7bysrKXRoaXMuX3VzZXJIYW5kbGVyc1t0eXBlXVtvXT09PWxpc3RlbmVyJiZ0aGlzLl91c2VySGFuZGxlcnNbdHlwZV0uc3BsaWNlKG8sMSk7ZWxzZSB0aGlzLl91c2VySGFuZGxlcnNbdHlwZV09W107ZWxzZXtpZih2b2lkIDAhPT10eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgc3BlY2lmaWVkIGV2ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cIik7dGhpcy5fcmVzZXRJbnRlcmZhY2VVc2VySGFuZGxlcnMoKX1yZXR1cm4gdGhpc30sV2ViTWlkaS5wcm90b3R5cGUudG9NSURJQ2hhbm5lbHM9ZnVuY3Rpb24oY2hhbm5lbCl7dmFyIGNoYW5uZWxzO3JldHVybiBjaGFubmVscz1cImFsbFwiPT09Y2hhbm5lbHx8dm9pZCAwPT09Y2hhbm5lbD9bXCJhbGxcIl06QXJyYXkuaXNBcnJheShjaGFubmVsKT9jaGFubmVsOltjaGFubmVsXSxjaGFubmVscy5pbmRleE9mKFwiYWxsXCIpPi0xJiYoY2hhbm5lbHM9WzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2XSksY2hhbm5lbHMubWFwKGZ1bmN0aW9uKGNoKXtyZXR1cm4gcGFyc2VJbnQoY2gpfSkuZmlsdGVyKGZ1bmN0aW9uKGNoKXtyZXR1cm4gY2g+PTEmJjE2Pj1jaH0pfSxXZWJNaWRpLnByb3RvdHlwZS5nZXRJbnB1dEJ5SWQ9ZnVuY3Rpb24oaWQpe2lmKCF0aGlzLmVuYWJsZWQpdGhyb3cgbmV3IEVycm9yKFwiV2ViTWlkaSBpcyBub3QgZW5hYmxlZC5cIik7Zm9yKHZhciBpPTA7aTx0aGlzLmlucHV0cy5sZW5ndGg7aSsrKWlmKHRoaXMuaW5wdXRzW2ldLmlkPT09aWQpcmV0dXJuIHRoaXMuaW5wdXRzW2ldO3JldHVybiExfSxXZWJNaWRpLnByb3RvdHlwZS5nZXRPdXRwdXRCeUlkPWZ1bmN0aW9uKGlkKXtpZighdGhpcy5lbmFibGVkKXRocm93IG5ldyBFcnJvcihcIldlYk1pZGkgaXMgbm90IGVuYWJsZWQuXCIpO2Zvcih2YXIgaT0wO2k8dGhpcy5vdXRwdXRzLmxlbmd0aDtpKyspaWYodGhpcy5vdXRwdXRzW2ldLmlkPT09aWQpcmV0dXJuIHRoaXMub3V0cHV0c1tpXTtyZXR1cm4hMX0sV2ViTWlkaS5wcm90b3R5cGUuZ2V0SW5wdXRCeU5hbWU9ZnVuY3Rpb24obmFtZSl7aWYoIXRoaXMuZW5hYmxlZCl0aHJvdyBuZXcgRXJyb3IoXCJXZWJNaWRpIGlzIG5vdCBlbmFibGVkLlwiKTtmb3IodmFyIGk9MDtpPHRoaXMuaW5wdXRzLmxlbmd0aDtpKyspaWYofnRoaXMuaW5wdXRzW2ldLm5hbWUuaW5kZXhPZihuYW1lKSlyZXR1cm4gdGhpcy5pbnB1dHNbaV07cmV0dXJuITF9LFdlYk1pZGkucHJvdG90eXBlLmdldE9jdGF2ZT1mdW5jdGlvbihudW1iZXIpe3JldHVybiBudWxsIT1udW1iZXImJm51bWJlcj49MCYmMTI3Pj1udW1iZXI/TWF0aC5mbG9vcihNYXRoLmZsb29yKG51bWJlcikvMTItMSkrTWF0aC5mbG9vcih3bS5vY3RhdmVPZmZzZXQpOnZvaWQgMH0sV2ViTWlkaS5wcm90b3R5cGUuZ2V0T3V0cHV0QnlOYW1lPWZ1bmN0aW9uKG5hbWUpe2lmKCF0aGlzLmVuYWJsZWQpdGhyb3cgbmV3IEVycm9yKFwiV2ViTWlkaSBpcyBub3QgZW5hYmxlZC5cIik7Zm9yKHZhciBpPTA7aTx0aGlzLm91dHB1dHMubGVuZ3RoO2krKylpZih+dGhpcy5vdXRwdXRzW2ldLm5hbWUuaW5kZXhPZihuYW1lKSlyZXR1cm4gdGhpcy5vdXRwdXRzW2ldO3JldHVybiExfSxXZWJNaWRpLnByb3RvdHlwZS5ndWVzc05vdGVOdW1iZXI9ZnVuY3Rpb24oaW5wdXQpe3ZhciBvdXRwdXQ9ITE7aWYoaW5wdXQmJmlucHV0LnRvRml4ZWQmJmlucHV0Pj0wJiYxMjc+PWlucHV0P291dHB1dD1NYXRoLnJvdW5kKGlucHV0KTpwYXJzZUludChpbnB1dCk+PTAmJnBhcnNlSW50KGlucHV0KTw9MTI3P291dHB1dD1wYXJzZUludChpbnB1dCk6KFwic3RyaW5nXCI9PXR5cGVvZiBpbnB1dHx8aW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcpJiYob3V0cHV0PXRoaXMubm90ZU5hbWVUb051bWJlcihpbnB1dCkpLG91dHB1dD09PSExKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgdmFsdWUgKFwiK2lucHV0K1wiKS5cIik7cmV0dXJuIG91dHB1dH0sV2ViTWlkaS5wcm90b3R5cGUubm90ZU5hbWVUb051bWJlcj1mdW5jdGlvbihuYW1lKXtcInN0cmluZ1wiIT10eXBlb2YgbmFtZSYmKG5hbWU9XCJcIik7dmFyIG1hdGNoZXM9bmFtZS5tYXRjaCgvKFtDREVGR0FCXSkoI3swLDJ9fGJ7MCwyfSkoLT9cXGQrKS9pKTtpZighbWF0Y2hlcyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgbm90ZSBuYW1lLlwiKTt2YXIgc2VtaXRvbmVzPXdtLl9zZW1pdG9uZXNbbWF0Y2hlc1sxXS50b1VwcGVyQ2FzZSgpXSxvY3RhdmU9cGFyc2VJbnQobWF0Y2hlc1szXSkscmVzdWx0PTEyKihvY3RhdmUrMS1NYXRoLmZsb29yKHdtLm9jdGF2ZU9mZnNldCkpK3NlbWl0b25lcztpZihtYXRjaGVzWzJdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImJcIik+LTE/cmVzdWx0LT1tYXRjaGVzWzJdLmxlbmd0aDptYXRjaGVzWzJdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcIiNcIik+LTEmJihyZXN1bHQrPW1hdGNoZXNbMl0ubGVuZ3RoKSwwPnJlc3VsdHx8cmVzdWx0PjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgbm90ZSBuYW1lIG9yIG5vdGUgb3V0c2lkZSB2YWxpZCByYW5nZS5cIik7cmV0dXJuIHJlc3VsdH0sV2ViTWlkaS5wcm90b3R5cGUuX3VwZGF0ZUlucHV0c0FuZE91dHB1dHM9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJbnB1dHMoKSx0aGlzLl91cGRhdGVPdXRwdXRzKCl9LFdlYk1pZGkucHJvdG90eXBlLl91cGRhdGVJbnB1dHM9ZnVuY3Rpb24oKXtmb3IodmFyIGk9MDtpPHRoaXMuX2lucHV0cy5sZW5ndGg7aSsrKXtmb3IodmFyIHJlbW92ZT0hMCx1cGRhdGVkPXRoaXNbXCJpbnRlcmZhY2VcIl0uaW5wdXRzLnZhbHVlcygpLGlucHV0PXVwZGF0ZWQubmV4dCgpO2lucHV0JiYhaW5wdXQuZG9uZTtpbnB1dD11cGRhdGVkLm5leHQoKSlpZih0aGlzLl9pbnB1dHNbaV0uX21pZGlJbnB1dD09PWlucHV0LnZhbHVlKXtyZW1vdmU9ITE7YnJlYWt9cmVtb3ZlJiZ0aGlzLl9pbnB1dHMuc3BsaWNlKGksMSl9dGhpc1tcImludGVyZmFjZVwiXSYmdGhpc1tcImludGVyZmFjZVwiXS5pbnB1dHMuZm9yRWFjaChmdW5jdGlvbihuSW5wdXQpe2Zvcih2YXIgYWRkPSEwLGo9MDtqPHRoaXMuX2lucHV0cy5sZW5ndGg7aisrKXRoaXMuX2lucHV0c1tqXS5fbWlkaUlucHV0PT09bklucHV0JiYoYWRkPSExKTthZGQmJnRoaXMuX2lucHV0cy5wdXNoKG5ldyBJbnB1dChuSW5wdXQpKX0uYmluZCh0aGlzKSl9LFdlYk1pZGkucHJvdG90eXBlLl91cGRhdGVPdXRwdXRzPWZ1bmN0aW9uKCl7Zm9yKHZhciBpPTA7aTx0aGlzLl9vdXRwdXRzLmxlbmd0aDtpKyspe2Zvcih2YXIgcmVtb3ZlPSEwLHVwZGF0ZWQ9dGhpc1tcImludGVyZmFjZVwiXS5vdXRwdXRzLnZhbHVlcygpLG91dHB1dD11cGRhdGVkLm5leHQoKTtvdXRwdXQmJiFvdXRwdXQuZG9uZTtvdXRwdXQ9dXBkYXRlZC5uZXh0KCkpaWYodGhpcy5fb3V0cHV0c1tpXS5fbWlkaU91dHB1dD09PW91dHB1dC52YWx1ZSl7cmVtb3ZlPSExO2JyZWFrfXJlbW92ZSYmdGhpcy5fb3V0cHV0cy5zcGxpY2UoaSwxKX10aGlzW1wiaW50ZXJmYWNlXCJdJiZ0aGlzW1wiaW50ZXJmYWNlXCJdLm91dHB1dHMuZm9yRWFjaChmdW5jdGlvbihuT3V0cHV0KXtmb3IodmFyIGFkZD0hMCxqPTA7ajx0aGlzLl9vdXRwdXRzLmxlbmd0aDtqKyspdGhpcy5fb3V0cHV0c1tqXS5fbWlkaU91dHB1dD09PW5PdXRwdXQmJihhZGQ9ITEpO2FkZCYmdGhpcy5fb3V0cHV0cy5wdXNoKG5ldyBPdXRwdXQobk91dHB1dCkpfS5iaW5kKHRoaXMpKX0sV2ViTWlkaS5wcm90b3R5cGUuX29uSW50ZXJmYWNlU3RhdGVDaGFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5fdXBkYXRlSW5wdXRzQW5kT3V0cHV0cygpO3ZhciBldmVudD17dGltZXN0YW1wOmUudGltZVN0YW1wLHR5cGU6ZS5wb3J0LnN0YXRlfTt0aGlzW1wiaW50ZXJmYWNlXCJdJiZcImNvbm5lY3RlZFwiPT09ZS5wb3J0LnN0YXRlP1wib3V0cHV0XCI9PT1lLnBvcnQudHlwZT9ldmVudC5wb3J0PXRoaXMuZ2V0T3V0cHV0QnlJZChlLnBvcnQuaWQpOlwiaW5wdXRcIj09PWUucG9ydC50eXBlJiYoZXZlbnQucG9ydD10aGlzLmdldElucHV0QnlJZChlLnBvcnQuaWQpKTpldmVudC5wb3J0PXtjb25uZWN0aW9uOlwiY2xvc2VkXCIsaWQ6ZS5wb3J0LmlkLG1hbnVmYWN0dXJlcjplLnBvcnQubWFudWZhY3R1cmVyLG5hbWU6ZS5wb3J0Lm5hbWUsc3RhdGU6ZS5wb3J0LnN0YXRlLHR5cGU6ZS5wb3J0LnR5cGV9LHRoaXMuX3VzZXJIYW5kbGVyc1tlLnBvcnQuc3RhdGVdLmZvckVhY2goZnVuY3Rpb24oaGFuZGxlcil7aGFuZGxlcihldmVudCl9KX0sV2ViTWlkaS5wcm90b3R5cGUuX3Jlc2V0SW50ZXJmYWNlVXNlckhhbmRsZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciBpPTA7aTx0aGlzLl9taWRpSW50ZXJmYWNlRXZlbnRzLmxlbmd0aDtpKyspdGhpcy5fdXNlckhhbmRsZXJzW3RoaXMuX21pZGlJbnRlcmZhY2VFdmVudHNbaV1dPVtdfSxJbnB1dC5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24odHlwZSxjaGFubmVsLGxpc3RlbmVyKXt2YXIgdGhhdD10aGlzO2lmKHZvaWQgMD09PWNoYW5uZWwmJihjaGFubmVsPVwiYWxsXCIpLEFycmF5LmlzQXJyYXkoY2hhbm5lbCl8fChjaGFubmVsPVtjaGFubmVsXSksY2hhbm5lbC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe2lmKFwiYWxsXCIhPT1pdGVtJiYhKGl0ZW0+PTEmJjE2Pj1pdGVtKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSAnY2hhbm5lbCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpfSksXCJmdW5jdGlvblwiIT10eXBlb2YgbGlzdGVuZXIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAnbGlzdGVuZXInIHBhcmFtZXRlciBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpO2lmKHZvaWQgMCE9PXdtLk1JRElfU1lTVEVNX01FU1NBR0VTW3R5cGVdKXRoaXMuX3VzZXJIYW5kbGVycy5zeXN0ZW1bdHlwZV18fCh0aGlzLl91c2VySGFuZGxlcnMuc3lzdGVtW3R5cGVdPVtdKSx0aGlzLl91c2VySGFuZGxlcnMuc3lzdGVtW3R5cGVdLnB1c2gobGlzdGVuZXIpO2Vsc2V7aWYodm9pZCAwPT09d20uTUlESV9DSEFOTkVMX01FU1NBR0VTW3R5cGVdKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgc3BlY2lmaWVkIGV2ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZC5cIik7aWYoY2hhbm5lbC5pbmRleE9mKFwiYWxsXCIpPi0xKXtjaGFubmVsPVtdO2Zvcih2YXIgaj0xOzE2Pj1qO2orKyljaGFubmVsLnB1c2goail9dGhpcy5fdXNlckhhbmRsZXJzLmNoYW5uZWxbdHlwZV18fCh0aGlzLl91c2VySGFuZGxlcnMuY2hhbm5lbFt0eXBlXT1bXSksY2hhbm5lbC5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGF0Ll91c2VySGFuZGxlcnMuY2hhbm5lbFt0eXBlXVtjaF18fCh0aGF0Ll91c2VySGFuZGxlcnMuY2hhbm5lbFt0eXBlXVtjaF09W10pLHRoYXQuX3VzZXJIYW5kbGVycy5jaGFubmVsW3R5cGVdW2NoXS5wdXNoKGxpc3RlbmVyKX0pfXJldHVybiB0aGlzfSxJbnB1dC5wcm90b3R5cGUub249SW5wdXQucHJvdG90eXBlLmFkZExpc3RlbmVyLElucHV0LnByb3RvdHlwZS5oYXNMaXN0ZW5lcj1mdW5jdGlvbih0eXBlLGNoYW5uZWwsbGlzdGVuZXIpe3ZhciB0aGF0PXRoaXM7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgbGlzdGVuZXIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSAnbGlzdGVuZXInIHBhcmFtZXRlciBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpO2lmKHZvaWQgMD09PWNoYW5uZWwmJihjaGFubmVsPVwiYWxsXCIpLGNoYW5uZWwuY29uc3RydWN0b3IhPT1BcnJheSYmKGNoYW5uZWw9W2NoYW5uZWxdKSx2b2lkIDAhPT13bS5NSURJX1NZU1RFTV9NRVNTQUdFU1t0eXBlXSl7Zm9yKHZhciBvPTA7bzx0aGlzLl91c2VySGFuZGxlcnMuc3lzdGVtW3R5cGVdLmxlbmd0aDtvKyspaWYodGhpcy5fdXNlckhhbmRsZXJzLnN5c3RlbVt0eXBlXVtvXT09PWxpc3RlbmVyKXJldHVybiEwfWVsc2UgaWYodm9pZCAwIT09d20uTUlESV9DSEFOTkVMX01FU1NBR0VTW3R5cGVdKXtpZihjaGFubmVsLmluZGV4T2YoXCJhbGxcIik+LTEpe2NoYW5uZWw9W107Zm9yKHZhciBqPTE7MTY+PWo7aisrKWNoYW5uZWwucHVzaChqKX1yZXR1cm4gdGhpcy5fdXNlckhhbmRsZXJzLmNoYW5uZWxbdHlwZV0/Y2hhbm5lbC5ldmVyeShmdW5jdGlvbihjaE51bSl7dmFyIGxpc3RlbmVycz10aGF0Ll91c2VySGFuZGxlcnMuY2hhbm5lbFt0eXBlXVtjaE51bV07cmV0dXJuIGxpc3RlbmVycyYmbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpPi0xfSk6ITF9cmV0dXJuITF9LElucHV0LnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbih0eXBlLGNoYW5uZWwsbGlzdGVuZXIpe3ZhciB0aGF0PXRoaXM7aWYodm9pZCAwIT09bGlzdGVuZXImJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGxpc3RlbmVyKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgJ2xpc3RlbmVyJyBwYXJhbWV0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uLlwiKTtpZih2b2lkIDA9PT1jaGFubmVsJiYoY2hhbm5lbD1cImFsbFwiKSxjaGFubmVsLmNvbnN0cnVjdG9yIT09QXJyYXkmJihjaGFubmVsPVtjaGFubmVsXSksdm9pZCAwIT09d20uTUlESV9TWVNURU1fTUVTU0FHRVNbdHlwZV0paWYodm9pZCAwPT09bGlzdGVuZXIpdGhpcy5fdXNlckhhbmRsZXJzLnN5c3RlbVt0eXBlXT1bXTtlbHNlIGZvcih2YXIgbz0wO288dGhpcy5fdXNlckhhbmRsZXJzLnN5c3RlbVt0eXBlXS5sZW5ndGg7bysrKXRoaXMuX3VzZXJIYW5kbGVycy5zeXN0ZW1bdHlwZV1bb109PT1saXN0ZW5lciYmdGhpcy5fdXNlckhhbmRsZXJzLnN5c3RlbVt0eXBlXS5zcGxpY2UobywxKTtlbHNlIGlmKHZvaWQgMCE9PXdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFU1t0eXBlXSl7aWYoY2hhbm5lbC5pbmRleE9mKFwiYWxsXCIpPi0xKXtjaGFubmVsPVtdO2Zvcih2YXIgaj0xOzE2Pj1qO2orKyljaGFubmVsLnB1c2goail9aWYoIXRoaXMuX3VzZXJIYW5kbGVycy5jaGFubmVsW3R5cGVdKXJldHVybiB0aGlzO2NoYW5uZWwuZm9yRWFjaChmdW5jdGlvbihjaE51bSl7dmFyIGxpc3RlbmVycz10aGF0Ll91c2VySGFuZGxlcnMuY2hhbm5lbFt0eXBlXVtjaE51bV07aWYobGlzdGVuZXJzKWlmKHZvaWQgMD09PWxpc3RlbmVyKXRoYXQuX3VzZXJIYW5kbGVycy5jaGFubmVsW3R5cGVdW2NoTnVtXT1bXTtlbHNlIGZvcih2YXIgbD0wO2w8bGlzdGVuZXJzLmxlbmd0aDtsKyspbGlzdGVuZXJzW2xdPT09bGlzdGVuZXImJmxpc3RlbmVycy5zcGxpY2UobCwxKX0pfWVsc2V7aWYodm9pZCAwIT09dHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIHNwZWNpZmllZCBldmVudCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuXCIpO3RoaXMuX2luaXRpYWxpemVVc2VySGFuZGxlcnMoKX1yZXR1cm4gdGhpc30sSW5wdXQucHJvdG90eXBlLl9pbml0aWFsaXplVXNlckhhbmRsZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciBwcm9wMSBpbiB3bS5NSURJX0NIQU5ORUxfTUVTU0FHRVMpd20uTUlESV9DSEFOTkVMX01FU1NBR0VTLmhhc093blByb3BlcnR5KHByb3AxKSYmKHRoaXMuX3VzZXJIYW5kbGVycy5jaGFubmVsW3Byb3AxXT17fSk7Zm9yKHZhciBwcm9wMiBpbiB3bS5NSURJX1NZU1RFTV9NRVNTQUdFUyl3bS5NSURJX1NZU1RFTV9NRVNTQUdFUy5oYXNPd25Qcm9wZXJ0eShwcm9wMikmJih0aGlzLl91c2VySGFuZGxlcnMuc3lzdGVtW3Byb3AyXT1bXSl9LElucHV0LnByb3RvdHlwZS5fb25NaWRpTWVzc2FnZT1mdW5jdGlvbihlKXtpZih0aGlzLl91c2VySGFuZGxlcnMuc3lzdGVtLm1pZGltZXNzYWdlLmxlbmd0aD4wKXt2YXIgZXZlbnQ9e3RhcmdldDp0aGlzLGRhdGE6ZS5kYXRhLHRpbWVzdGFtcDplLnRpbWVTdGFtcCx0eXBlOlwibWlkaW1lc3NhZ2VcIn07dGhpcy5fdXNlckhhbmRsZXJzLnN5c3RlbS5taWRpbWVzc2FnZS5mb3JFYWNoKGZ1bmN0aW9uKGNhbGxiYWNrKXtjYWxsYmFjayhldmVudCl9KX1lLmRhdGFbMF08MjQwP3RoaXMuX3BhcnNlQ2hhbm5lbEV2ZW50KGUpOmUuZGF0YVswXTw9MjU1JiZ0aGlzLl9wYXJzZVN5c3RlbUV2ZW50KGUpfSxJbnB1dC5wcm90b3R5cGUuX3BhcnNlQ2hhbm5lbEV2ZW50PWZ1bmN0aW9uKGUpe3ZhciBkYXRhMSxkYXRhMixjb21tYW5kPWUuZGF0YVswXT4+NCxjaGFubmVsPSgxNSZlLmRhdGFbMF0pKzE7ZS5kYXRhLmxlbmd0aD4xJiYoZGF0YTE9ZS5kYXRhWzFdLGRhdGEyPWUuZGF0YS5sZW5ndGg+Mj9lLmRhdGFbMl06dm9pZCAwKTt2YXIgZXZlbnQ9e3RhcmdldDp0aGlzLGRhdGE6ZS5kYXRhLHRpbWVzdGFtcDplLnRpbWVTdGFtcCxjaGFubmVsOmNoYW5uZWx9O2NvbW1hbmQ9PT13bS5NSURJX0NIQU5ORUxfTUVTU0FHRVMubm90ZW9mZnx8Y29tbWFuZD09PXdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5ub3Rlb24mJjA9PT1kYXRhMj8oZXZlbnQudHlwZT1cIm5vdGVvZmZcIixldmVudC5ub3RlPXtudW1iZXI6ZGF0YTEsbmFtZTp3bS5fbm90ZXNbZGF0YTElMTJdLG9jdGF2ZTp3bS5nZXRPY3RhdmUoZGF0YTEpfSxldmVudC52ZWxvY2l0eT1kYXRhMi8xMjcsZXZlbnQucmF3VmVsb2NpdHk9ZGF0YTIpOmNvbW1hbmQ9PT13bS5NSURJX0NIQU5ORUxfTUVTU0FHRVMubm90ZW9uPyhldmVudC50eXBlPVwibm90ZW9uXCIsZXZlbnQubm90ZT17bnVtYmVyOmRhdGExLG5hbWU6d20uX25vdGVzW2RhdGExJTEyXSxvY3RhdmU6d20uZ2V0T2N0YXZlKGRhdGExKX0sZXZlbnQudmVsb2NpdHk9ZGF0YTIvMTI3LGV2ZW50LnJhd1ZlbG9jaXR5PWRhdGEyKTpjb21tYW5kPT09d20uTUlESV9DSEFOTkVMX01FU1NBR0VTLmtleWFmdGVydG91Y2g/KGV2ZW50LnR5cGU9XCJrZXlhZnRlcnRvdWNoXCIsZXZlbnQubm90ZT17bnVtYmVyOmRhdGExLG5hbWU6d20uX25vdGVzW2RhdGExJTEyXSxvY3RhdmU6d20uZ2V0T2N0YXZlKGRhdGExKX0sZXZlbnQudmFsdWU9ZGF0YTIvMTI3KTpjb21tYW5kPT09d20uTUlESV9DSEFOTkVMX01FU1NBR0VTLmNvbnRyb2xjaGFuZ2UmJmRhdGExPj0wJiYxMTk+PWRhdGExPyhldmVudC50eXBlPVwiY29udHJvbGNoYW5nZVwiLGV2ZW50LmNvbnRyb2xsZXI9e251bWJlcjpkYXRhMSxuYW1lOnRoaXMuZ2V0Q2NOYW1lQnlOdW1iZXIoZGF0YTEpfSxldmVudC52YWx1ZT1kYXRhMik6Y29tbWFuZD09PXdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5jaGFubmVsbW9kZSYmZGF0YTE+PTEyMCYmMTI3Pj1kYXRhMT8oZXZlbnQudHlwZT1cImNoYW5uZWxtb2RlXCIsZXZlbnQuY29udHJvbGxlcj17bnVtYmVyOmRhdGExLG5hbWU6dGhpcy5nZXRDaGFubmVsTW9kZUJ5TnVtYmVyKGRhdGExKX0sZXZlbnQudmFsdWU9ZGF0YTIpOmNvbW1hbmQ9PT13bS5NSURJX0NIQU5ORUxfTUVTU0FHRVMucHJvZ3JhbWNoYW5nZT8oZXZlbnQudHlwZT1cInByb2dyYW1jaGFuZ2VcIixldmVudC52YWx1ZT1kYXRhMSk6Y29tbWFuZD09PXdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5jaGFubmVsYWZ0ZXJ0b3VjaD8oZXZlbnQudHlwZT1cImNoYW5uZWxhZnRlcnRvdWNoXCIsZXZlbnQudmFsdWU9ZGF0YTEvMTI3KTpjb21tYW5kPT09d20uTUlESV9DSEFOTkVMX01FU1NBR0VTLnBpdGNoYmVuZD8oZXZlbnQudHlwZT1cInBpdGNoYmVuZFwiLGV2ZW50LnZhbHVlPSgoZGF0YTI8PDcpK2RhdGExLTgxOTIpLzgxOTIpOmV2ZW50LnR5cGU9XCJ1bmtub3duY2hhbm5lbG1lc3NhZ2VcIix0aGlzLl91c2VySGFuZGxlcnMuY2hhbm5lbFtldmVudC50eXBlXSYmdGhpcy5fdXNlckhhbmRsZXJzLmNoYW5uZWxbZXZlbnQudHlwZV1bY2hhbm5lbF0mJnRoaXMuX3VzZXJIYW5kbGVycy5jaGFubmVsW2V2ZW50LnR5cGVdW2NoYW5uZWxdLmZvckVhY2goZnVuY3Rpb24oY2FsbGJhY2spe2NhbGxiYWNrKGV2ZW50KX0pfSxJbnB1dC5wcm90b3R5cGUuZ2V0Q2NOYW1lQnlOdW1iZXI9ZnVuY3Rpb24obnVtYmVyKXtpZihudW1iZXI9TWF0aC5mbG9vcihudW1iZXIpLCEobnVtYmVyPj0wJiYxMTk+PW51bWJlcikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgY29udHJvbCBjaGFuZ2UgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMTkuXCIpO2Zvcih2YXIgY2MgaW4gd20uTUlESV9DT05UUk9MX0NIQU5HRV9NRVNTQUdFUylpZih3bS5NSURJX0NPTlRST0xfQ0hBTkdFX01FU1NBR0VTLmhhc093blByb3BlcnR5KGNjKSYmbnVtYmVyPT09d20uTUlESV9DT05UUk9MX0NIQU5HRV9NRVNTQUdFU1tjY10pcmV0dXJuIGNjO3JldHVybiB2b2lkIDB9LElucHV0LnByb3RvdHlwZS5nZXRDaGFubmVsTW9kZUJ5TnVtYmVyPWZ1bmN0aW9uKG51bWJlcil7aWYobnVtYmVyPU1hdGguZmxvb3IobnVtYmVyKSwhKG51bWJlcj49MTIwJiZzdGF0dXM8PTEyNykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgY29udHJvbCBjaGFuZ2UgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAxMjAgYW5kIDEyNy5cIik7Zm9yKHZhciBjbSBpbiB3bS5NSURJX0NIQU5ORUxfTU9ERV9NRVNTQUdFUylpZih3bS5NSURJX0NIQU5ORUxfTU9ERV9NRVNTQUdFUy5oYXNPd25Qcm9wZXJ0eShjbSkmJm51bWJlcj09PXdtLk1JRElfQ0hBTk5FTF9NT0RFX01FU1NBR0VTW2NtXSlyZXR1cm4gY219LElucHV0LnByb3RvdHlwZS5fcGFyc2VTeXN0ZW1FdmVudD1mdW5jdGlvbihlKXt2YXIgY29tbWFuZD1lLmRhdGFbMF0sZXZlbnQ9e3RhcmdldDp0aGlzLGRhdGE6ZS5kYXRhLHRpbWVzdGFtcDplLnRpbWVTdGFtcH07Y29tbWFuZD09PXdtLk1JRElfU1lTVEVNX01FU1NBR0VTLnN5c2V4P2V2ZW50LnR5cGU9XCJzeXNleFwiOmNvbW1hbmQ9PT13bS5NSURJX1NZU1RFTV9NRVNTQUdFUy50aW1lY29kZT9ldmVudC50eXBlPVwidGltZWNvZGVcIjpjb21tYW5kPT09d20uTUlESV9TWVNURU1fTUVTU0FHRVMuc29uZ3Bvc2l0aW9uP2V2ZW50LnR5cGU9XCJzb25ncG9zaXRpb25cIjpjb21tYW5kPT09d20uTUlESV9TWVNURU1fTUVTU0FHRVMuc29uZ3NlbGVjdD8oZXZlbnQudHlwZT1cInNvbmdzZWxlY3RcIixldmVudC5zb25nPWUuZGF0YVsxXSk6Y29tbWFuZD09PXdtLk1JRElfU1lTVEVNX01FU1NBR0VTLnR1bmluZ3JlcXVlc3Q/ZXZlbnQudHlwZT1cInR1bmluZ3JlcXVlc3RcIjpjb21tYW5kPT09d20uTUlESV9TWVNURU1fTUVTU0FHRVMuY2xvY2s/ZXZlbnQudHlwZT1cImNsb2NrXCI6Y29tbWFuZD09PXdtLk1JRElfU1lTVEVNX01FU1NBR0VTLnN0YXJ0P2V2ZW50LnR5cGU9XCJzdGFydFwiOmNvbW1hbmQ9PT13bS5NSURJX1NZU1RFTV9NRVNTQUdFU1tcImNvbnRpbnVlXCJdP2V2ZW50LnR5cGU9XCJjb250aW51ZVwiOmNvbW1hbmQ9PT13bS5NSURJX1NZU1RFTV9NRVNTQUdFUy5zdG9wP2V2ZW50LnR5cGU9XCJzdG9wXCI6Y29tbWFuZD09PXdtLk1JRElfU1lTVEVNX01FU1NBR0VTLmFjdGl2ZXNlbnNpbmc/ZXZlbnQudHlwZT1cImFjdGl2ZXNlbnNpbmdcIjpjb21tYW5kPT09d20uTUlESV9TWVNURU1fTUVTU0FHRVMucmVzZXQ/ZXZlbnQudHlwZT1cInJlc2V0XCI6ZXZlbnQudHlwZT1cInVua25vd25zeXN0ZW1tZXNzYWdlXCIsdGhpcy5fdXNlckhhbmRsZXJzLnN5c3RlbVtldmVudC50eXBlXSYmdGhpcy5fdXNlckhhbmRsZXJzLnN5c3RlbVtldmVudC50eXBlXS5mb3JFYWNoKGZ1bmN0aW9uKGNhbGxiYWNrKXtjYWxsYmFjayhldmVudCl9KX0sT3V0cHV0LnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKHN0YXR1cyxkYXRhLHRpbWVzdGFtcCl7aWYoIShzdGF0dXM+PTEyOCYmMjU1Pj1zdGF0dXMpKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHN0YXR1cyBieXRlIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEyOCAoMHg4MCkgYW5kIDI1NSAoMHhGRikuXCIpO3ZvaWQgMD09PWRhdGEmJihkYXRhPVtdKSxBcnJheS5pc0FycmF5KGRhdGEpfHwoZGF0YT1bZGF0YV0pO3ZhciBtZXNzYWdlPVtdO3JldHVybiBkYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSxpbmRleCl7dmFyIHBhcnNlZD1NYXRoLmZsb29yKGl0ZW0pO2lmKCEocGFyc2VkPj0wJiYyNTU+PXBhcnNlZCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJEYXRhIGJ5dGVzIG11c3QgYmUgaW50ZWdlcnMgYmV0d2VlbiAwICgweDAwKSBhbmQgMjU1ICgweEZGKS5cIik7bWVzc2FnZS5wdXNoKHBhcnNlZCl9KSx0aGlzLl9taWRpT3V0cHV0LnNlbmQoW3N0YXR1c10uY29uY2F0KG1lc3NhZ2UpLHBhcnNlRmxvYXQodGltZXN0YW1wKXx8MCksdGhpc30sT3V0cHV0LnByb3RvdHlwZS5zZW5kU3lzZXg9ZnVuY3Rpb24obWFudWZhY3R1cmVyLGRhdGEsb3B0aW9ucyl7aWYoIXdtLnN5c2V4RW5hYmxlZCl0aHJvdyBuZXcgRXJyb3IoXCJTeXNleCBtZXNzYWdlIHN1cHBvcnQgbXVzdCBmaXJzdCBiZSBhY3RpdmF0ZWQuXCIpO3JldHVybiBvcHRpb25zPW9wdGlvbnN8fHt9LG1hbnVmYWN0dXJlcj1bXS5jb25jYXQobWFudWZhY3R1cmVyKSxkYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSl7aWYoMD5pdGVtfHxpdGVtPjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBkYXRhIGJ5dGVzIG9mIGEgc3lzZXggbWVzc2FnZSBtdXN0IGJlIGludGVnZXJzIGJldHdlZW4gMCAoMHgwMCkgYW5kIDEyNyAoMHg3RikuXCIpfSksZGF0YT1tYW51ZmFjdHVyZXIuY29uY2F0KGRhdGEsd20uTUlESV9TWVNURU1fTUVTU0FHRVMuc3lzZXhlbmQpLHRoaXMuc2VuZCh3bS5NSURJX1NZU1RFTV9NRVNTQUdFUy5zeXNleCxkYXRhLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnNlbmRUaW1lY29kZVF1YXJ0ZXJGcmFtZT1mdW5jdGlvbih2YWx1ZSxvcHRpb25zKXtyZXR1cm4gb3B0aW9ucz1vcHRpb25zfHx7fSx0aGlzLnNlbmQod20uTUlESV9TWVNURU1fTUVTU0FHRVMudGltZWNvZGUsdmFsdWUsdGhpcy5fcGFyc2VUaW1lUGFyYW1ldGVyKG9wdGlvbnMudGltZSkpLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2VuZFNvbmdQb3NpdGlvbj1mdW5jdGlvbih2YWx1ZSxvcHRpb25zKXt2YWx1ZT1NYXRoLmZsb29yKHZhbHVlKXx8MCxvcHRpb25zPW9wdGlvbnN8fHt9O3ZhciBtc2I9dmFsdWU+PjcmMTI3LGxzYj0xMjcmdmFsdWU7cmV0dXJuIHRoaXMuc2VuZCh3bS5NSURJX1NZU1RFTV9NRVNTQUdFUy5zb25ncG9zaXRpb24sW21zYixsc2JdLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnNlbmRTb25nU2VsZWN0PWZ1bmN0aW9uKHZhbHVlLG9wdGlvbnMpe2lmKHZhbHVlPU1hdGguZmxvb3IodmFsdWUpLG9wdGlvbnM9b3B0aW9uc3x8e30sISh2YWx1ZT49MCYmMTI3Pj12YWx1ZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgc29uZyBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyNy5cIik7cmV0dXJuIHRoaXMuc2VuZCh3bS5NSURJX1NZU1RFTV9NRVNTQUdFUy5zb25nc2VsZWN0LFt2YWx1ZV0sdGhpcy5fcGFyc2VUaW1lUGFyYW1ldGVyKG9wdGlvbnMudGltZSkpLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2VuZFR1bmluZ1JlcXVlc3Q9ZnVuY3Rpb24ob3B0aW9ucyl7cmV0dXJuIG9wdGlvbnM9b3B0aW9uc3x8e30sdGhpcy5zZW5kKHdtLk1JRElfU1lTVEVNX01FU1NBR0VTLnR1bmluZ3JlcXVlc3Qsdm9pZCAwLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnNlbmRDbG9jaz1mdW5jdGlvbihvcHRpb25zKXtyZXR1cm4gb3B0aW9ucz1vcHRpb25zfHx7fSx0aGlzLnNlbmQod20uTUlESV9TWVNURU1fTUVTU0FHRVMuY2xvY2ssdm9pZCAwLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnNlbmRTdGFydD1mdW5jdGlvbihvcHRpb25zKXtyZXR1cm4gb3B0aW9ucz1vcHRpb25zfHx7fSx0aGlzLnNlbmQod20uTUlESV9TWVNURU1fTUVTU0FHRVMuc3RhcnQsdm9pZCAwLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnNlbmRDb250aW51ZT1mdW5jdGlvbihvcHRpb25zKXtyZXR1cm4gb3B0aW9ucz1vcHRpb25zfHx7fSx0aGlzLnNlbmQod20uTUlESV9TWVNURU1fTUVTU0FHRVNbXCJjb250aW51ZVwiXSx2b2lkIDAsdGhpcy5fcGFyc2VUaW1lUGFyYW1ldGVyKG9wdGlvbnMudGltZSkpLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2VuZFN0b3A9ZnVuY3Rpb24ob3B0aW9ucyl7cmV0dXJuIG9wdGlvbnM9b3B0aW9uc3x8e30sdGhpcy5zZW5kKHdtLk1JRElfU1lTVEVNX01FU1NBR0VTLnN0b3Asdm9pZCAwLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnNlbmRBY3RpdmVTZW5zaW5nPWZ1bmN0aW9uKG9wdGlvbnMpe3JldHVybiBvcHRpb25zPW9wdGlvbnN8fHt9LHRoaXMuc2VuZCh3bS5NSURJX1NZU1RFTV9NRVNTQUdFUy5hY3RpdmVzZW5zaW5nLFtdLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnNlbmRSZXNldD1mdW5jdGlvbihvcHRpb25zKXtyZXR1cm4gb3B0aW9ucz1vcHRpb25zfHx7fSx0aGlzLnNlbmQod20uTUlESV9TWVNURU1fTUVTU0FHRVMucmVzZXQsdm9pZCAwLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnN0b3BOb3RlPWZ1bmN0aW9uKG5vdGUsY2hhbm5lbCxvcHRpb25zKXtpZihcImFsbFwiPT09bm90ZSlyZXR1cm4gdGhpcy5zZW5kQ2hhbm5lbE1vZGUoXCJhbGxub3Rlc29mZlwiLDAsY2hhbm5lbCxvcHRpb25zKTt2YXIgblZlbG9jaXR5PTY0O3JldHVybiBvcHRpb25zPW9wdGlvbnN8fHt9LG9wdGlvbnMucmF3VmVsb2NpdHk/IWlzTmFOKG9wdGlvbnMudmVsb2NpdHkpJiZvcHRpb25zLnZlbG9jaXR5Pj0wJiZvcHRpb25zLnZlbG9jaXR5PD0xMjcmJihuVmVsb2NpdHk9b3B0aW9ucy52ZWxvY2l0eSk6IWlzTmFOKG9wdGlvbnMudmVsb2NpdHkpJiZvcHRpb25zLnZlbG9jaXR5Pj0wJiZvcHRpb25zLnZlbG9jaXR5PD0xJiYoblZlbG9jaXR5PTEyNypvcHRpb25zLnZlbG9jaXR5KSx0aGlzLl9jb252ZXJ0Tm90ZVRvQXJyYXkobm90ZSkuZm9yRWFjaChmdW5jdGlvbihpdGVtKXt3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGlzLnNlbmQoKHdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5ub3Rlb2ZmPDw0KSsoY2gtMSksW2l0ZW0sTWF0aC5yb3VuZChuVmVsb2NpdHkpXSx0aGlzLl9wYXJzZVRpbWVQYXJhbWV0ZXIob3B0aW9ucy50aW1lKSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnBsYXlOb3RlPWZ1bmN0aW9uKG5vdGUsY2hhbm5lbCxvcHRpb25zKXt2YXIgblZlbG9jaXR5PTY0O2lmKG9wdGlvbnM9b3B0aW9uc3x8e30sb3B0aW9ucy5yYXdWZWxvY2l0eT8haXNOYU4ob3B0aW9ucy52ZWxvY2l0eSkmJm9wdGlvbnMudmVsb2NpdHk+PTAmJm9wdGlvbnMudmVsb2NpdHk8PTEyNyYmKG5WZWxvY2l0eT1vcHRpb25zLnZlbG9jaXR5KTohaXNOYU4ob3B0aW9ucy52ZWxvY2l0eSkmJm9wdGlvbnMudmVsb2NpdHk+PTAmJm9wdGlvbnMudmVsb2NpdHk8PTEmJihuVmVsb2NpdHk9MTI3Km9wdGlvbnMudmVsb2NpdHkpLG9wdGlvbnMudGltZT10aGlzLl9wYXJzZVRpbWVQYXJhbWV0ZXIob3B0aW9ucy50aW1lKSx0aGlzLl9jb252ZXJ0Tm90ZVRvQXJyYXkobm90ZSkuZm9yRWFjaChmdW5jdGlvbihpdGVtKXt3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGlzLnNlbmQoKHdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5ub3Rlb248PDQpKyhjaC0xKSxbaXRlbSxNYXRoLnJvdW5kKG5WZWxvY2l0eSldLG9wdGlvbnMudGltZSl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSwhaXNOYU4ob3B0aW9ucy5kdXJhdGlvbikpe29wdGlvbnMuZHVyYXRpb248PTAmJihvcHRpb25zLmR1cmF0aW9uPTApO3ZhciBuUmVsZWFzZT02NDtvcHRpb25zLnJhd1ZlbG9jaXR5PyFpc05hTihvcHRpb25zLnJlbGVhc2UpJiZvcHRpb25zLnJlbGVhc2U+PTAmJm9wdGlvbnMucmVsZWFzZTw9MTI3JiYoblJlbGVhc2U9b3B0aW9ucy5yZWxlYXNlKTohaXNOYU4ob3B0aW9ucy5yZWxlYXNlKSYmb3B0aW9ucy5yZWxlYXNlPj0wJiZvcHRpb25zLnJlbGVhc2U8PTEmJihuUmVsZWFzZT0xMjcqb3B0aW9ucy5yZWxlYXNlKSx0aGlzLl9jb252ZXJ0Tm90ZVRvQXJyYXkobm90ZSkuZm9yRWFjaChmdW5jdGlvbihpdGVtKXt3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGlzLnNlbmQoKHdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5ub3Rlb2ZmPDw0KSsoY2gtMSksW2l0ZW0sTWF0aC5yb3VuZChuUmVsZWFzZSldLChvcHRpb25zLnRpbWV8fHdtLnRpbWUpK29wdGlvbnMuZHVyYXRpb24pfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9cmV0dXJuIHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2VuZEtleUFmdGVydG91Y2g9ZnVuY3Rpb24obm90ZSxjaGFubmVsLHByZXNzdXJlLG9wdGlvbnMpe3ZhciB0aGF0PXRoaXM7aWYob3B0aW9ucz1vcHRpb25zfHx7fSwxPmNoYW5uZWx8fGNoYW5uZWw+MTYpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTYuXCIpOyhpc05hTihwcmVzc3VyZSl8fDA+cHJlc3N1cmV8fHByZXNzdXJlPjEpJiYocHJlc3N1cmU9LjUpO3ZhciBuUHJlc3N1cmU9TWF0aC5yb3VuZCgxMjcqcHJlc3N1cmUpO3JldHVybiB0aGlzLl9jb252ZXJ0Tm90ZVRvQXJyYXkobm90ZSkuZm9yRWFjaChmdW5jdGlvbihpdGVtKXt3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGF0LnNlbmQoKHdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5rZXlhZnRlcnRvdWNoPDw0KSsoY2gtMSksW2l0ZW0sblByZXNzdXJlXSx0aGF0Ll9wYXJzZVRpbWVQYXJhbWV0ZXIob3B0aW9ucy50aW1lKSl9KX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2VuZENvbnRyb2xDaGFuZ2U9ZnVuY3Rpb24oY29udHJvbGxlcix2YWx1ZSxjaGFubmVsLG9wdGlvbnMpe2lmKG9wdGlvbnM9b3B0aW9uc3x8e30sXCJzdHJpbmdcIj09dHlwZW9mIGNvbnRyb2xsZXIpe2lmKGNvbnRyb2xsZXI9d20uTUlESV9DT05UUk9MX0NIQU5HRV9NRVNTQUdFU1tjb250cm9sbGVyXSwhY29udHJvbGxlcil0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBjb250cm9sbGVyIG5hbWUuXCIpfWVsc2UgaWYoY29udHJvbGxlcj1NYXRoLmZsb29yKGNvbnRyb2xsZXIpLCEoY29udHJvbGxlcj49MCYmMTE5Pj1jb250cm9sbGVyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbnRyb2xsZXIgbnVtYmVycyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTE5LlwiKTtpZih2YWx1ZT1NYXRoLmZsb29yKHZhbHVlKXx8MCwhKHZhbHVlPj0wJiYxMjc+PXZhbHVlKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNvbnRyb2xsZXIgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyNy5cIik7cmV0dXJuIHdtLnRvTUlESUNoYW5uZWxzKGNoYW5uZWwpLmZvckVhY2goZnVuY3Rpb24oY2gpe3RoaXMuc2VuZCgod20uTUlESV9DSEFOTkVMX01FU1NBR0VTLmNvbnRyb2xjaGFuZ2U8PDQpKyhjaC0xKSxbY29udHJvbGxlcix2YWx1ZV0sdGhpcy5fcGFyc2VUaW1lUGFyYW1ldGVyKG9wdGlvbnMudGltZSkpfS5iaW5kKHRoaXMpKSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLl9zZWxlY3RSZWdpc3RlcmVkUGFyYW1ldGVyPWZ1bmN0aW9uKHBhcmFtZXRlcixjaGFubmVsLHRpbWUpe3ZhciB0aGF0PXRoaXM7aWYocGFyYW1ldGVyWzBdPU1hdGguZmxvb3IocGFyYW1ldGVyWzBdKSwhKHBhcmFtZXRlclswXT49MCYmcGFyYW1ldGVyWzBdPD0xMjcpKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIGNvbnRyb2w2NSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTI3XCIpO2lmKHBhcmFtZXRlclsxXT1NYXRoLmZsb29yKHBhcmFtZXRlclsxXSksIShwYXJhbWV0ZXJbMV0+PTAmJnBhcmFtZXRlclsxXTw9MTI3KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSBjb250cm9sNjQgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyN1wiKTtyZXR1cm4gd20udG9NSURJQ2hhbm5lbHMoY2hhbm5lbCkuZm9yRWFjaChmdW5jdGlvbihjaCl7dGhhdC5zZW5kQ29udHJvbENoYW5nZSgxMDEscGFyYW1ldGVyWzBdLGNoYW5uZWwse3RpbWU6dGltZX0pLHRoYXQuc2VuZENvbnRyb2xDaGFuZ2UoMTAwLHBhcmFtZXRlclsxXSxjaGFubmVsLHt0aW1lOnRpbWV9KX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuX3NlbGVjdE5vblJlZ2lzdGVyZWRQYXJhbWV0ZXI9ZnVuY3Rpb24ocGFyYW1ldGVyLGNoYW5uZWwsdGltZSl7dmFyIHRoYXQ9dGhpcztpZihwYXJhbWV0ZXJbMF09TWF0aC5mbG9vcihwYXJhbWV0ZXJbMF0pLCEocGFyYW1ldGVyWzBdPj0wJiZwYXJhbWV0ZXJbMF08PTEyNykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgY29udHJvbDYzIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMjdcIik7aWYocGFyYW1ldGVyWzFdPU1hdGguZmxvb3IocGFyYW1ldGVyWzFdKSwhKHBhcmFtZXRlclsxXT49MCYmcGFyYW1ldGVyWzFdPD0xMjcpKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIGNvbnRyb2w2MiB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTI3XCIpO3JldHVybiB3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGF0LnNlbmRDb250cm9sQ2hhbmdlKDk5LHBhcmFtZXRlclswXSxjaGFubmVsLHt0aW1lOnRpbWV9KSx0aGF0LnNlbmRDb250cm9sQ2hhbmdlKDk4LHBhcmFtZXRlclsxXSxjaGFubmVsLHt0aW1lOnRpbWV9KX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuX3NldEN1cnJlbnRSZWdpc3RlcmVkUGFyYW1ldGVyPWZ1bmN0aW9uKGRhdGEsY2hhbm5lbCx0aW1lKXt2YXIgdGhhdD10aGlzO2lmKGRhdGE9W10uY29uY2F0KGRhdGEpLGRhdGFbMF09TWF0aC5mbG9vcihkYXRhWzBdKSwhKGRhdGFbMF0+PTAmJmRhdGFbMF08PTEyNykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgbXNiIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMjdcIik7cmV0dXJuIHdtLnRvTUlESUNoYW5uZWxzKGNoYW5uZWwpLmZvckVhY2goZnVuY3Rpb24oY2gpe3RoYXQuc2VuZENvbnRyb2xDaGFuZ2UoNixkYXRhWzBdLGNoYW5uZWwse3RpbWU6dGltZX0pfSksZGF0YVsxXT1NYXRoLmZsb29yKGRhdGFbMV0pLGRhdGFbMV0+PTAmJmRhdGFbMV08PTEyNyYmd20udG9NSURJQ2hhbm5lbHMoY2hhbm5lbCkuZm9yRWFjaChmdW5jdGlvbihjaCl7dGhhdC5zZW5kQ29udHJvbENoYW5nZSgzOCxkYXRhWzFdLGNoYW5uZWwse3RpbWU6dGltZX0pfSksdGhpc30sT3V0cHV0LnByb3RvdHlwZS5fZGVzZWxlY3RSZWdpc3RlcmVkUGFyYW1ldGVyPWZ1bmN0aW9uKGNoYW5uZWwsdGltZSl7dmFyIHRoYXQ9dGhpcztyZXR1cm4gd20udG9NSURJQ2hhbm5lbHMoY2hhbm5lbCkuZm9yRWFjaChmdW5jdGlvbihjaCl7dGhhdC5zZW5kQ29udHJvbENoYW5nZSgxMDEsMTI3LGNoYW5uZWwse3RpbWU6dGltZX0pLHRoYXQuc2VuZENvbnRyb2xDaGFuZ2UoMTAwLDEyNyxjaGFubmVsLHt0aW1lOnRpbWV9KX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2V0UmVnaXN0ZXJlZFBhcmFtZXRlcj1mdW5jdGlvbihwYXJhbWV0ZXIsZGF0YSxjaGFubmVsLG9wdGlvbnMpe3ZhciB0aGF0PXRoaXM7aWYob3B0aW9ucz1vcHRpb25zfHx7fSwhQXJyYXkuaXNBcnJheShwYXJhbWV0ZXIpKXtpZighd20uTUlESV9SRUdJU1RFUkVEX1BBUkFNRVRFUltwYXJhbWV0ZXJdKXRocm93IG5ldyBFcnJvcihcIlRoZSBzcGVjaWZpZWQgcGFyYW1ldGVyIGlzIG5vdCBhdmFpbGFibGUuXCIpO3BhcmFtZXRlcj13bS5NSURJX1JFR0lTVEVSRURfUEFSQU1FVEVSW3BhcmFtZXRlcl19cmV0dXJuIHdtLnRvTUlESUNoYW5uZWxzKGNoYW5uZWwpLmZvckVhY2goZnVuY3Rpb24oY2gpe3RoYXQuX3NlbGVjdFJlZ2lzdGVyZWRQYXJhbWV0ZXIocGFyYW1ldGVyLGNoYW5uZWwsb3B0aW9ucy50aW1lKSx0aGF0Ll9zZXRDdXJyZW50UmVnaXN0ZXJlZFBhcmFtZXRlcihkYXRhLGNoYW5uZWwsb3B0aW9ucy50aW1lKSx0aGF0Ll9kZXNlbGVjdFJlZ2lzdGVyZWRQYXJhbWV0ZXIoY2hhbm5lbCxvcHRpb25zLnRpbWUpfSksdGhpc30sT3V0cHV0LnByb3RvdHlwZS5zZXROb25SZWdpc3RlcmVkUGFyYW1ldGVyPWZ1bmN0aW9uKHBhcmFtZXRlcixkYXRhLGNoYW5uZWwsb3B0aW9ucyl7dmFyIHRoYXQ9dGhpcztpZihvcHRpb25zPW9wdGlvbnN8fHt9LCEocGFyYW1ldGVyWzBdPj0wJiZwYXJhbWV0ZXJbMF08PTEyNyYmcGFyYW1ldGVyWzFdPj0wJiZwYXJhbWV0ZXJbMV08PTEyNykpdGhyb3cgbmV3IEVycm9yKFwiUG9zaXRpb24gMCBhbmQgMSBvZiB0aGUgMi1wb3NpdGlvbiBwYXJhbWV0ZXIgYXJyYXkgbXVzdCBib3RoIGJlIGJldHdlZW4gMCBhbmQgMTI3LlwiKTtyZXR1cm4gZGF0YT1bXS5jb25jYXQoZGF0YSksd20udG9NSURJQ2hhbm5lbHMoY2hhbm5lbCkuZm9yRWFjaChmdW5jdGlvbihjaCl7dGhhdC5fc2VsZWN0Tm9uUmVnaXN0ZXJlZFBhcmFtZXRlcihwYXJhbWV0ZXIsY2hhbm5lbCxvcHRpb25zLnRpbWUpLHRoYXQuX3NldEN1cnJlbnRSZWdpc3RlcmVkUGFyYW1ldGVyKGRhdGEsY2hhbm5lbCxvcHRpb25zLnRpbWUpLHRoYXQuX2Rlc2VsZWN0UmVnaXN0ZXJlZFBhcmFtZXRlcihjaGFubmVsLG9wdGlvbnMudGltZSl9KSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLmluY3JlbWVudFJlZ2lzdGVyZWRQYXJhbWV0ZXI9ZnVuY3Rpb24ocGFyYW1ldGVyLGNoYW5uZWwsb3B0aW9ucyl7dmFyIHRoYXQ9dGhpcztpZihvcHRpb25zPW9wdGlvbnN8fHt9LCFBcnJheS5pc0FycmF5KHBhcmFtZXRlcikpe2lmKCF3bS5NSURJX1JFR0lTVEVSRURfUEFSQU1FVEVSW3BhcmFtZXRlcl0pdGhyb3cgbmV3IEVycm9yKFwiVGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgaXMgbm90IGF2YWlsYWJsZS5cIik7cGFyYW1ldGVyPXdtLk1JRElfUkVHSVNURVJFRF9QQVJBTUVURVJbcGFyYW1ldGVyXX1yZXR1cm4gd20udG9NSURJQ2hhbm5lbHMoY2hhbm5lbCkuZm9yRWFjaChmdW5jdGlvbihjaCl7dGhhdC5fc2VsZWN0UmVnaXN0ZXJlZFBhcmFtZXRlcihwYXJhbWV0ZXIsY2hhbm5lbCxvcHRpb25zLnRpbWUpLHRoYXQuc2VuZENvbnRyb2xDaGFuZ2UoOTYsMCxjaGFubmVsLHt0aW1lOm9wdGlvbnMudGltZX0pLHRoYXQuX2Rlc2VsZWN0UmVnaXN0ZXJlZFBhcmFtZXRlcihjaGFubmVsLG9wdGlvbnMudGltZSl9KSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLmRlY3JlbWVudFJlZ2lzdGVyZWRQYXJhbWV0ZXI9ZnVuY3Rpb24ocGFyYW1ldGVyLGNoYW5uZWwsb3B0aW9ucyl7aWYob3B0aW9ucz1vcHRpb25zfHx7fSwhQXJyYXkuaXNBcnJheShwYXJhbWV0ZXIpKXtpZighd20uTUlESV9SRUdJU1RFUkVEX1BBUkFNRVRFUltwYXJhbWV0ZXJdKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgc3BlY2lmaWVkIHBhcmFtZXRlciBpcyBub3QgYXZhaWxhYmxlLlwiKTtwYXJhbWV0ZXI9d20uTUlESV9SRUdJU1RFUkVEX1BBUkFNRVRFUltwYXJhbWV0ZXJdfXJldHVybiB3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGlzLl9zZWxlY3RSZWdpc3RlcmVkUGFyYW1ldGVyKHBhcmFtZXRlcixjaGFubmVsLG9wdGlvbnMudGltZSksdGhpcy5zZW5kQ29udHJvbENoYW5nZSg5NywwLGNoYW5uZWwse3RpbWU6b3B0aW9ucy50aW1lfSksdGhpcy5fZGVzZWxlY3RSZWdpc3RlcmVkUGFyYW1ldGVyKGNoYW5uZWwsb3B0aW9ucy50aW1lKX0uYmluZCh0aGlzKSksdGhpc30sT3V0cHV0LnByb3RvdHlwZS5zZXRQaXRjaEJlbmRSYW5nZT1mdW5jdGlvbihzZW1pdG9uZXMsY2VudHMsY2hhbm5lbCxvcHRpb25zKXt2YXIgdGhhdD10aGlzO2lmKG9wdGlvbnM9b3B0aW9uc3x8e30sc2VtaXRvbmVzPU1hdGguZmxvb3Ioc2VtaXRvbmVzKXx8MCwhKHNlbWl0b25lcz49MCYmMTI3Pj1zZW1pdG9uZXMpKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHNlbWl0b25lcyB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTI3XCIpO2lmKGNlbnRzPU1hdGguZmxvb3IoY2VudHMpfHwwLCEoY2VudHM+PTAmJjEyNz49Y2VudHMpKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIGNlbnRzIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMjdcIik7cmV0dXJuIHdtLnRvTUlESUNoYW5uZWxzKGNoYW5uZWwpLmZvckVhY2goZnVuY3Rpb24oY2gpe3RoYXQuc2V0UmVnaXN0ZXJlZFBhcmFtZXRlcihcInBpdGNoYmVuZHJhbmdlXCIsW3NlbWl0b25lcyxjZW50c10sY2hhbm5lbCx7dGltZTpvcHRpb25zLnRpbWV9KX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2V0TW9kdWxhdGlvblJhbmdlPWZ1bmN0aW9uKHNlbWl0b25lcyxjZW50cyxjaGFubmVsLG9wdGlvbnMpe3ZhciB0aGF0PXRoaXM7aWYob3B0aW9ucz1vcHRpb25zfHx7fSxzZW1pdG9uZXM9TWF0aC5mbG9vcihzZW1pdG9uZXMpfHwwLCEoc2VtaXRvbmVzPj0wJiYxMjc+PXNlbWl0b25lcykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgc2VtaXRvbmVzIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMjdcIik7aWYoY2VudHM9TWF0aC5mbG9vcihjZW50cyl8fDAsIShjZW50cz49MCYmMTI3Pj1jZW50cykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgY2VudHMgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyN1wiKTtyZXR1cm4gd20udG9NSURJQ2hhbm5lbHMoY2hhbm5lbCkuZm9yRWFjaChmdW5jdGlvbihjaCl7dGhhdC5zZXRSZWdpc3RlcmVkUGFyYW1ldGVyKFwibW9kdWxhdGlvbnJhbmdlXCIsW3NlbWl0b25lcyxjZW50c10sY2hhbm5lbCx7dGltZTpvcHRpb25zLnRpbWV9KX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2V0TWFzdGVyVHVuaW5nPWZ1bmN0aW9uKHZhbHVlLGNoYW5uZWwsb3B0aW9ucyl7dmFyIHRoYXQ9dGhpcztpZihvcHRpb25zPW9wdGlvbnN8fHt9LHZhbHVlPXBhcnNlRmxvYXQodmFsdWUpfHwwLC02NT49dmFsdWV8fHZhbHVlPj02NCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlRoZSB2YWx1ZSBtdXN0IGJlIGEgZGVjaW1hbCBudW1iZXIgbGFyZ2VyIHRoYW4gLTY1IGFuZCBzbWFsbGVyIHRoYW4gNjQuXCIpO3ZhciBjb2Fyc2U9TWF0aC5mbG9vcih2YWx1ZSkrNjQsZmluZT12YWx1ZS1NYXRoLmZsb29yKHZhbHVlKTtmaW5lPU1hdGgucm91bmQoKGZpbmUrMSkvMioxNjM4Myk7dmFyIG1zYj1maW5lPj43JjEyNyxsc2I9MTI3JmZpbmU7cmV0dXJuIHdtLnRvTUlESUNoYW5uZWxzKGNoYW5uZWwpLmZvckVhY2goZnVuY3Rpb24oY2gpe3RoYXQuc2V0UmVnaXN0ZXJlZFBhcmFtZXRlcihcImNoYW5uZWxjb2Fyc2V0dW5pbmdcIixjb2Fyc2UsY2hhbm5lbCx7dGltZTpvcHRpb25zLnRpbWV9KSx0aGF0LnNldFJlZ2lzdGVyZWRQYXJhbWV0ZXIoXCJjaGFubmVsZmluZXR1bmluZ1wiLFttc2IsbHNiXSxjaGFubmVsLHt0aW1lOm9wdGlvbnMudGltZX0pfSksdGhpc30sT3V0cHV0LnByb3RvdHlwZS5zZXRUdW5pbmdQcm9ncmFtPWZ1bmN0aW9uKHZhbHVlLGNoYW5uZWwsb3B0aW9ucyl7dmFyIHRoYXQ9dGhpcztpZihvcHRpb25zPW9wdGlvbnN8fHt9LHZhbHVlPU1hdGguZmxvb3IodmFsdWUpLCEodmFsdWU+PTAmJjEyNz49dmFsdWUpKXRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIHByb2dyYW0gdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEyN1wiKTtyZXR1cm4gd20udG9NSURJQ2hhbm5lbHMoY2hhbm5lbCkuZm9yRWFjaChmdW5jdGlvbihjaCl7dGhhdC5zZXRSZWdpc3RlcmVkUGFyYW1ldGVyKFwidHVuaW5ncHJvZ3JhbVwiLHZhbHVlLGNoYW5uZWwse3RpbWU6b3B0aW9ucy50aW1lfSl9KSx0aGlzfSxPdXRwdXQucHJvdG90eXBlLnNldFR1bmluZ0Jhbms9ZnVuY3Rpb24odmFsdWUsY2hhbm5lbCxvcHRpb25zKXt2YXIgdGhhdD10aGlzO2lmKG9wdGlvbnM9b3B0aW9uc3x8e30sdmFsdWU9TWF0aC5mbG9vcih2YWx1ZSl8fDAsISh2YWx1ZT49MCYmMTI3Pj12YWx1ZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgYmFuayB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTI3XCIpO3JldHVybiB3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGF0LnNldFJlZ2lzdGVyZWRQYXJhbWV0ZXIoXCJ0dW5pbmdiYW5rXCIsdmFsdWUsY2hhbm5lbCx7dGltZTpvcHRpb25zLnRpbWV9KX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2VuZENoYW5uZWxNb2RlPWZ1bmN0aW9uKGNvbW1hbmQsdmFsdWUsY2hhbm5lbCxvcHRpb25zKXtpZihvcHRpb25zPW9wdGlvbnN8fHt9LFwic3RyaW5nXCI9PXR5cGVvZiBjb21tYW5kKXtpZihjb21tYW5kPXdtLk1JRElfQ0hBTk5FTF9NT0RFX01FU1NBR0VTW2NvbW1hbmRdLCFjb21tYW5kKXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGNoYW5uZWwgbW9kZSBtZXNzYWdlIG5hbWUuXCIpfWVsc2UgaWYoY29tbWFuZD1NYXRoLmZsb29yKGNvbW1hbmQpLCEoY29tbWFuZD49MTIwJiYxMjc+PWNvbW1hbmQpKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQ2hhbm5lbCBtb2RlIG51bWVyaWNhbCBpZGVudGlmaWVycyBtdXN0IGJlIGJldHdlZW4gMTIwIGFuZCAxMjcuXCIpO2lmKHZhbHVlPU1hdGguZmxvb3IodmFsdWUpfHwwLDA+dmFsdWV8fHZhbHVlPjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEyNy5cIik7cmV0dXJuIHdtLnRvTUlESUNoYW5uZWxzKGNoYW5uZWwpLmZvckVhY2goZnVuY3Rpb24oY2gpe3RoaXMuc2VuZCgod20uTUlESV9DSEFOTkVMX01FU1NBR0VTLmNoYW5uZWxtb2RlPDw0KSsoY2gtMSksW2NvbW1hbmQsdmFsdWVdLHRoaXMuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKX0uYmluZCh0aGlzKSksdGhpc30sT3V0cHV0LnByb3RvdHlwZS5zZW5kUHJvZ3JhbUNoYW5nZT1mdW5jdGlvbihwcm9ncmFtLGNoYW5uZWwsb3B0aW9ucyl7XG52YXIgdGhhdD10aGlzO2lmKG9wdGlvbnM9b3B0aW9uc3x8e30scHJvZ3JhbT1NYXRoLmZsb29yKHByb2dyYW0pLGlzTmFOKHByb2dyYW0pfHwwPnByb2dyYW18fHByb2dyYW0+MTI3KXRocm93IG5ldyBSYW5nZUVycm9yKFwiUHJvZ3JhbSBudW1iZXJzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMjcuXCIpO3JldHVybiB3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGF0LnNlbmQoKHdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5wcm9ncmFtY2hhbmdlPDw0KSsoY2gtMSksW3Byb2dyYW1dLHRoYXQuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2VuZENoYW5uZWxBZnRlcnRvdWNoPWZ1bmN0aW9uKHByZXNzdXJlLGNoYW5uZWwsb3B0aW9ucyl7dmFyIHRoYXQ9dGhpcztvcHRpb25zPW9wdGlvbnN8fHt9LHByZXNzdXJlPXBhcnNlRmxvYXQocHJlc3N1cmUpLChpc05hTihwcmVzc3VyZSl8fDA+cHJlc3N1cmV8fHByZXNzdXJlPjEpJiYocHJlc3N1cmU9LjUpO3ZhciBuUHJlc3N1cmU9TWF0aC5yb3VuZCgxMjcqcHJlc3N1cmUpO3JldHVybiB3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGF0LnNlbmQoKHdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5jaGFubmVsYWZ0ZXJ0b3VjaDw8NCkrKGNoLTEpLFtuUHJlc3N1cmVdLHRoYXQuX3BhcnNlVGltZVBhcmFtZXRlcihvcHRpb25zLnRpbWUpKX0pLHRoaXN9LE91dHB1dC5wcm90b3R5cGUuc2VuZFBpdGNoQmVuZD1mdW5jdGlvbihiZW5kLGNoYW5uZWwsb3B0aW9ucyl7dmFyIHRoYXQ9dGhpcztpZihvcHRpb25zPW9wdGlvbnN8fHt9LGlzTmFOKGJlbmQpfHwtMT5iZW5kfHxiZW5kPjEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJQaXRjaCBiZW5kIHZhbHVlIG11c3QgYmUgYmV0d2VlbiAtMSBhbmQgMS5cIik7dmFyIG5MZXZlbD1NYXRoLnJvdW5kKChiZW5kKzEpLzIqMTYzODMpLG1zYj1uTGV2ZWw+PjcmMTI3LGxzYj0xMjcmbkxldmVsO3JldHVybiB3bS50b01JRElDaGFubmVscyhjaGFubmVsKS5mb3JFYWNoKGZ1bmN0aW9uKGNoKXt0aGF0LnNlbmQoKHdtLk1JRElfQ0hBTk5FTF9NRVNTQUdFUy5waXRjaGJlbmQ8PDQpKyhjaC0xKSxbbHNiLG1zYl0sdGhhdC5fcGFyc2VUaW1lUGFyYW1ldGVyKG9wdGlvbnMudGltZSkpfSksdGhpc30sT3V0cHV0LnByb3RvdHlwZS5fcGFyc2VUaW1lUGFyYW1ldGVyPWZ1bmN0aW9uKHRpbWUpe3ZhciBwYXJzZWQsdmFsdWU7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHRpbWUmJlwiK1wiPT09dGltZS5zdWJzdHJpbmcoMCwxKT8ocGFyc2VkPXBhcnNlRmxvYXQodGltZSkscGFyc2VkJiZwYXJzZWQ+MCYmKHZhbHVlPXdtLnRpbWUrcGFyc2VkKSk6KHBhcnNlZD1wYXJzZUZsb2F0KHRpbWUpLHBhcnNlZD53bS50aW1lJiYodmFsdWU9cGFyc2VkKSksdmFsdWV9LE91dHB1dC5wcm90b3R5cGUuX2NvbnZlcnROb3RlVG9BcnJheT1mdW5jdGlvbihub3RlKXt2YXIgbm90ZXM9W107cmV0dXJuIEFycmF5LmlzQXJyYXkobm90ZSl8fChub3RlPVtub3RlXSksbm90ZS5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pe25vdGVzLnB1c2god20uZ3Vlc3NOb3RlTnVtYmVyKGl0ZW0pKX0pLG5vdGVzfSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJlwib2JqZWN0XCI9PXR5cGVvZiBkZWZpbmUuYW1kP2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiB3bX0pOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPXdtOnNjb3BlLldlYk1pZGl8fChzY29wZS5XZWJNaWRpPXdtKX0odGhpcyk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3dlYm1pZGkvd2VibWlkaS5taW4uanNcbi8vIG1vZHVsZSBpZCA9IDE1NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cdHRocm93IG5ldyBFcnJvcihcImRlZmluZSBjYW5ub3QgYmUgdXNlZCBpbmRpcmVjdFwiKTtcclxufTtcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vYW1kLWRlZmluZS5qc1xuLy8gbW9kdWxlIGlkID0gMTU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIGdsb2JhbHMgX193ZWJwYWNrX2FtZF9vcHRpb25zX18gKi9cclxubW9kdWxlLmV4cG9ydHMgPSBfX3dlYnBhY2tfYW1kX29wdGlvbnNfXztcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gKHdlYnBhY2spL2J1aWxkaW4vYW1kLW9wdGlvbnMuanNcbi8vIG1vZHVsZSBpZCA9IDE1N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiAoaWdub3JlZCkgKi9cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyB1dGlsIChpZ25vcmVkKVxuLy8gbW9kdWxlIGlkID0gMTU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=
\ No newline at end of file +!function(i,o){s=[],void 0===(r="function"==typeof(n=o)?n.apply(e,s):n)||(t.exports=r)}(0,function(){var t={context:null,_tapListeners:[],_onStarted:[],setContext:function(e){return t.context=e,t},on:function(n){if(Array.isArray(n)||NodeList&&n instanceof NodeList)for(var s=0;s<n.length;s++)t.on(n[s]);else if("string"==typeof n)t.on(document.querySelectorAll(n));else if(n.jquery&&"function"==typeof n.toArray)t.on(n.toArray());else if(Element&&n instanceof Element){var r=new e(n,i);t._tapListeners.push(r)}return t},onStarted:function(e){return t.isStarted()?e():t._onStarted.push(e),t},isStarted:function(){return null!==t.context&&"running"===t.context.state}},e=function(t){this._dragged=!1,this._element=t,this._bindedMove=this._moved.bind(this),this._bindedEnd=this._ended.bind(this),t.addEventListener("touchmove",this._bindedMove),t.addEventListener("touchend",this._bindedEnd),t.addEventListener("mouseup",this._bindedEnd)};function i(){if(t.context&&!t.isStarted()){var e=t.context.createOscillator(),i=t.context.createGain();i.gain.value=0,e.connect(i),i.connect(t.context.destination);var n=t.context.currentTime;e.start(n),e.stop(n+.5)}if(t._tapListeners){for(var s=0;s<t._tapListeners.length;s++)t._tapListeners[s].dispose();t._tapListeners=null}if(t._onStarted){for(var r=0;r<t._onStarted.length;r++)t._onStarted[r]();t._onStarted=null}}return e.prototype._moved=function(t){this._dragged=!0},e.prototype._ended=function(t){this._dragged||i(),this._dragged=!1},e.prototype.dispose=function(){this._element.removeEventListener("touchmove",this._bindedMove),this._element.removeEventListener("touchend",this._bindedEnd),this._element.removeEventListener("mouseup",this._bindedEnd),this._bindedMove=null,this._bindedEnd=null,this._element=null},t})},function(t,e,i){"use strict";e.__esModule=!0;var n=o(i(107)),s=o(i(109)),r="function"==typeof s.default&&"symbol"==typeof n.default?function(t){return typeof t}:function(t){return t&&"function"==typeof s.default&&t.constructor===s.default&&t!==s.default.prototype?"symbol":typeof t};function o(t){return t&&t.__esModule?t:{default:t}}e.default="function"==typeof s.default&&"symbol"===r(n.default)?function(t){return void 0===t?"undefined":r(t)}:function(t){return t&&"function"==typeof s.default&&t.constructor===s.default&&t!==s.default.prototype?"symbol":void 0===t?"undefined":r(t)}},function(t,e,i){t.exports={default:i(108),__esModule:!0}},function(t,e,i){i(22),i(24),t.exports=i(45).f("iterator")},function(t,e,i){t.exports={default:i(110),__esModule:!0}},function(t,e,i){i(111),i(68),i(118),i(119),t.exports=i(0).Symbol},function(t,e,i){"use strict";var n=i(2),s=i(10),r=i(9),o=i(7),a=i(56),h=i(112).KEY,u=i(15),l=i(39),c=i(27),p=i(26),f=i(1),d=i(45),y=i(46),m=i(113),v=i(114),_=i(115),g=i(4),b=i(6),w=i(35),S=i(21),T=i(57),x=i(116),A=i(117),E=i(3),k=i(16),O=A.f,M=E.f,P=x.f,C=n.Symbol,I=n.JSON,R=I&&I.stringify,F=f("_hidden"),D=f("toPrimitive"),N={}.propertyIsEnumerable,q=l("symbol-registry"),L=l("symbols"),j=l("op-symbols"),B=Object.prototype,z="function"==typeof C,U=n.QObject,V=!U||!U.prototype||!U.prototype.findChild,G=r&&u(function(){return 7!=T(M({},"a",{get:function(){return M(this,"a",{value:7}).a}})).a})?function(t,e,i){var n=O(B,e);n&&delete B[e],M(t,e,i),n&&t!==B&&M(B,e,n)}:M,W=function(t){var e=L[t]=T(C.prototype);return e._k=t,e},H=z&&"symbol"==typeof C.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof C},Y=function(t,e,i){return t===B&&Y(j,e,i),g(t),e=w(e,!0),g(i),s(L,e)?(i.enumerable?(s(t,F)&&t[F][e]&&(t[F][e]=!1),i=T(i,{enumerable:S(0,!1)})):(s(t,F)||M(t,F,S(1,{})),t[F][e]=!0),G(t,e,i)):M(t,e,i)},Q=function(t,e){g(t);for(var i,n=v(e=b(e)),s=0,r=n.length;r>s;)Y(t,i=n[s++],e[i]);return t},X=function(t){var e=N.call(this,t=w(t,!0));return!(this===B&&s(L,t)&&!s(j,t))&&(!(e||!s(this,t)||!s(L,t)||s(this,F)&&this[F][t])||e)},Z=function(t,e){if(t=b(t),e=w(e,!0),t!==B||!s(L,e)||s(j,e)){var i=O(t,e);return!i||!s(L,e)||s(t,F)&&t[F][e]||(i.enumerable=!0),i}},K=function(t){for(var e,i=P(b(t)),n=[],r=0;i.length>r;)s(L,e=i[r++])||e==F||e==h||n.push(e);return n},$=function(t){for(var e,i=t===B,n=P(i?j:b(t)),r=[],o=0;n.length>o;)!s(L,e=n[o++])||i&&!s(B,e)||r.push(L[e]);return r};z||(a((C=function(){if(this instanceof C)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:void 0),e=function(i){this===B&&e.call(j,i),s(this,F)&&s(this[F],t)&&(this[F][t]=!1),G(this,t,S(1,i))};return r&&V&&G(B,t,{configurable:!0,set:e}),W(t)}).prototype,"toString",function(){return this._k}),A.f=Z,E.f=Y,i(67).f=x.f=K,i(30).f=X,i(43).f=$,r&&!i(25)&&a(B,"propertyIsEnumerable",X,!0),d.f=function(t){return W(f(t))}),o(o.G+o.W+o.F*!z,{Symbol:C});for(var J="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;J.length>tt;)f(J[tt++]);for(J=k(f.store),tt=0;J.length>tt;)y(J[tt++]);o(o.S+o.F*!z,"Symbol",{for:function(t){return s(q,t+="")?q[t]:q[t]=C(t)},keyFor:function(t){if(H(t))return m(q,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){V=!0},useSimple:function(){V=!1}}),o(o.S+o.F*!z,"Object",{create:function(t,e){return void 0===e?T(t):Q(T(t),e)},defineProperty:Y,defineProperties:Q,getOwnPropertyDescriptor:Z,getOwnPropertyNames:K,getOwnPropertySymbols:$}),I&&o(o.S+o.F*(!z||u(function(){var t=C();return"[null]"!=R([t])||"{}"!=R({a:t})||"{}"!=R(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!H(t)){for(var e,i,n=[t],s=1;arguments.length>s;)n.push(arguments[s++]);return"function"==typeof(e=n[1])&&(i=e),!i&&_(e)||(e=function(t,e){if(i&&(e=i.call(this,t,e)),!H(e))return e}),n[1]=e,R.apply(I,n)}}}),C.prototype[D]||i(8)(C.prototype,D,C.prototype.valueOf),c(C,"Symbol"),c(Math,"Math",!0),c(n.JSON,"JSON",!0)},function(t,e,i){var n=i(26)("meta"),s=i(20),r=i(10),o=i(3).f,a=0,h=Object.isExtensible||function(){return!0},u=!i(15)(function(){return h(Object.preventExtensions({}))}),l=function(t){o(t,n,{value:{i:"O"+ ++a,w:{}}})},c=t.exports={KEY:n,NEED:!1,fastKey:function(t,e){if(!s(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!r(t,n)){if(!h(t))return"F";if(!e)return"E";l(t)}return t[n].i},getWeak:function(t,e){if(!r(t,n)){if(!h(t))return!0;if(!e)return!1;l(t)}return t[n].w},onFreeze:function(t){return u&&c.NEED&&h(t)&&!r(t,n)&&l(t),t}}},function(t,e,i){var n=i(16),s=i(6);t.exports=function(t,e){for(var i,r=s(t),o=n(r),a=o.length,h=0;a>h;)if(r[i=o[h++]]===e)return i}},function(t,e,i){var n=i(16),s=i(43),r=i(30);t.exports=function(t){var e=n(t),i=s.f;if(i)for(var o,a=i(t),h=r.f,u=0;a.length>u;)h.call(t,o=a[u++])&&e.push(o);return e}},function(t,e,i){var n=i(18);t.exports=Array.isArray||function(t){return"Array"==n(t)}},function(t,e,i){var n=i(6),s=i(67).f,r={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return o&&"[object Window]"==r.call(t)?function(t){try{return s(t)}catch(t){return o.slice()}}(t):s(n(t))}},function(t,e,i){var n=i(30),s=i(21),r=i(6),o=i(35),a=i(10),h=i(55),u=Object.getOwnPropertyDescriptor;e.f=i(9)?u:function(t,e){if(t=r(t),e=o(e,!0),h)try{return u(t,e)}catch(t){}if(a(t,e))return s(!n.f.call(t,e),t[e])}},function(t,e,i){i(46)("asyncIterator")},function(t,e,i){i(46)("observable")},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.note_values=e.MidiWriter=void 0;var n=c(i(52));e.midi_init=function(){r.default.enable(function(t){if(t)return void console.error("webmidi failed to initialize");if(!r.default.outputs.length)return void console.error("no MIDI output found");if(console.log(r.default.inputs),console.log(r.default.outputs),r.default.outputs.length>1){var e=r.default.outputs.filter(function(t){return t.name.match(/prodipe/i)});e.length}})},e.play_note=y,e.play_midi_note=m,e.play_sequence=function(t,e,i,n){var s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"all",r=arguments[5],o=e.rows,h=e.min,u=e.max,c=o.length*o[0].length;t>=c&&(t=0);var p=Math.floor(t/o[0].length),f=t%o[0].length,d=o[p][f];(t+=1)>=c&&(t=0);var m=y((0,a.norm)(d,h,u)*l.nx.multiply.value,n,s,r);return[t,[m]]},e.play_interval_sequence=function(t,e,i,n){var s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"all",r=arguments[5],o=e.rows,h=e.min,u=e.max,c=o.length;t>=c&&(t=0);var p=o[t%c];if(!p)return void(t=0);var f=Math.min.apply(Math,p),d=(0,a.norm)(f,h,u)*l.nx.multiply.value,m=p.map(function(t){var e=d+(0,a.norm)(t-f,i.min,i.max)*l.nx.interval.value;y(e,n,s,r)});return[t+=1,m]},e.export_pattern_as_midi=function(t,e,i,s,r,o){var h=e.rows[0].length,l=void 0,c=void 0,p=void 0,f=new d.Track;f.setTempo(s);for(var y=0,m=h;y<m;y++){var v=o(y,e,void 0,"all",!0),_=(0,n.default)(v,4);y=_[0],l=_[1],c=_[2],p=_[3],console.log(y,l,c,p);for(var g=0;g<l.length;g++)f.addEvent(new d.NoteEvent({pitch:l[g],duration:"t"+c[g],wait:0===g?p:0}))}var b=new d.Writer([f]),w=(0,a.dataURItoBlob)(b.dataUri());(0,u.saveAs)(w,"Recording - "+t+".mid")};var s=c(i(29)),r=c(i(121)),o=c(i(64)),a=i(44),h=c(i(66)),u=i(122),l=i(69);function c(t){return t&&t.__esModule?t:{default:t}}var p=void 0,f=!1,d=e.MidiWriter=i(129);e.note_values=[[8,"8 measures",4096],[4,"4 measures",2048],[2,"2 measures",1024],[1,"whole note",512],[.5,"half note",256],[1/3,"third note",[170,170,171]],[.25,"quarter note",128],[.2,"fifth note",[51,51,51,51,52]],[1/6,"sixth note",[85,85,86,85,85,86]],[1/8,"eighth note",64],[.1,"tenth note",[25,26,26,25,26,25,26,26,25,26]],[1/12,"twelfth note",[21,21,22,21,21,22,21,21,22,21,21,22]],[1/16,"sixteenth note",32],[1/32,"thirtysecond note",16]];function y(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"all",n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=(arguments.length>4&&void 0!==arguments[4]&&arguments[4],arguments.length>5&&void 0!==arguments[5]?arguments[5]:0),u=o.default.current().index(t+Math.round(l.nx.offset.value),l.nx.octave.value),c=(0,a.ftom)(u),f=c%1;if(f>.5&&(c+=1,f-=1),f*=2,c=Math.floor(c),(p||n)&&c>127)return 0;var d=s.default.Frequency(Math.floor(c),"midi").toNote(),y=3e4/s.default.Transport.bpm.value*r/128;return console.log(r,y),n?d:(p?(e=e||6e4/s.default.Transport.bpm.value,n||(r?setTimeout(function(){m(d,f,i,e)},r):m(d,f,i,e))):r?setTimeout(function(){h.default.play(u)},y):h.default.play(u),d)}function m(t,e,i,n){p.playNote(t,i,{duration:n}),f&&p.sendPitchBend(e,i)}},function(t,e,i){var n;!function(i){"use strict";function s(){if(s.prototype._singleton)throw new Error("WebMidi is a singleton, it cannot be instantiated directly.");s.prototype._singleton=this,this._inputs=[],this._outputs=[],this._userHandlers={},this._stateChangeQueue=[],this._processingStateChange=!1,this._midiInterfaceEvents=["connected","disconnected"],this._notes=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],this._semitones={C:0,D:2,E:4,F:5,G:7,A:9,B:11},Object.defineProperties(this,{MIDI_SYSTEM_MESSAGES:{value:{sysex:240,timecode:241,songposition:242,songselect:243,tuningrequest:246,sysexend:247,clock:248,start:250,continue:251,stop:252,activesensing:254,reset:255,midimessage:0,unknownsystemmessage:-1},writable:!1,enumerable:!0,configurable:!1},MIDI_CHANNEL_MESSAGES:{value:{noteoff:8,noteon:9,keyaftertouch:10,controlchange:11,channelmode:11,programchange:12,channelaftertouch:13,pitchbend:14},writable:!1,enumerable:!0,configurable:!1},MIDI_REGISTERED_PARAMETER:{value:{pitchbendrange:[0,0],channelfinetuning:[0,1],channelcoarsetuning:[0,2],tuningprogram:[0,3],tuningbank:[0,4],modulationrange:[0,5],azimuthangle:[61,0],elevationangle:[61,1],gain:[61,2],distanceratio:[61,3],maximumdistance:[61,4],maximumdistancegain:[61,5],referencedistanceratio:[61,6],panspreadangle:[61,7],rollangle:[61,8]},writable:!1,enumerable:!0,configurable:!1},MIDI_CONTROL_CHANGE_MESSAGES:{value:{bankselectcoarse:0,modulationwheelcoarse:1,breathcontrollercoarse:2,footcontrollercoarse:4,portamentotimecoarse:5,dataentrycoarse:6,volumecoarse:7,balancecoarse:8,pancoarse:10,expressioncoarse:11,effectcontrol1coarse:12,effectcontrol2coarse:13,generalpurposeslider1:16,generalpurposeslider2:17,generalpurposeslider3:18,generalpurposeslider4:19,bankselectfine:32,modulationwheelfine:33,breathcontrollerfine:34,footcontrollerfine:36,portamentotimefine:37,dataentryfine:38,volumefine:39,balancefine:40,panfine:42,expressionfine:43,effectcontrol1fine:44,effectcontrol2fine:45,holdpedal:64,portamento:65,sustenutopedal:66,softpedal:67,legatopedal:68,hold2pedal:69,soundvariation:70,resonance:71,soundreleasetime:72,soundattacktime:73,brightness:74,soundcontrol6:75,soundcontrol7:76,soundcontrol8:77,soundcontrol9:78,soundcontrol10:79,generalpurposebutton1:80,generalpurposebutton2:81,generalpurposebutton3:82,generalpurposebutton4:83,reverblevel:91,tremololevel:92,choruslevel:93,celestelevel:94,phaserlevel:95,databuttonincrement:96,databuttondecrement:97,nonregisteredparametercoarse:98,nonregisteredparameterfine:99,registeredparametercoarse:100,registeredparameterfine:101},writable:!1,enumerable:!0,configurable:!1},MIDI_CHANNEL_MODE_MESSAGES:{value:{allsoundoff:120,resetallcontrollers:121,localcontrol:122,allnotesoff:123,omnimodeoff:124,omnimodeon:125,monomodeon:126,polymodeon:127},writable:!1,enumerable:!0,configurable:!1},octaveOffset:{value:0,writable:!0,enumerable:!0,configurable:!1}}),Object.defineProperties(this,{supported:{enumerable:!0,get:function(){return"requestMIDIAccess"in navigator}},enabled:{enumerable:!0,get:function(){return void 0!==this.interface}.bind(this)},inputs:{enumerable:!0,get:function(){return this._inputs}.bind(this)},outputs:{enumerable:!0,get:function(){return this._outputs}.bind(this)},sysexEnabled:{enumerable:!0,get:function(){return!(!this.interface||!this.interface.sysexEnabled)}.bind(this)},time:{enumerable:!0,get:function(){return performance.now()}}})}function r(t){var e=this;this._userHandlers={channel:{},system:{}},this._midiInput=t,Object.defineProperties(this,{connection:{enumerable:!0,get:function(){return e._midiInput.connection}},id:{enumerable:!0,get:function(){return e._midiInput.id}},manufacturer:{enumerable:!0,get:function(){return e._midiInput.manufacturer}},name:{enumerable:!0,get:function(){return e._midiInput.name}},state:{enumerable:!0,get:function(){return e._midiInput.state}},type:{enumerable:!0,get:function(){return e._midiInput.type}}}),this._initializeUserHandlers(),this._midiInput.onmidimessage=this._onMidiMessage.bind(this)}function o(t){var e=this;this._midiOutput=t,Object.defineProperties(this,{connection:{enumerable:!0,get:function(){return e._midiOutput.connection}},id:{enumerable:!0,get:function(){return e._midiOutput.id}},manufacturer:{enumerable:!0,get:function(){return e._midiOutput.manufacturer}},name:{enumerable:!0,get:function(){return e._midiOutput.name}},state:{enumerable:!0,get:function(){return e._midiOutput.state}},type:{enumerable:!0,get:function(){return e._midiOutput.type}}})}var a=new s;s.prototype.enable=function(t,e){return this.enabled?void 0:this.supported?void navigator.requestMIDIAccess({sysex:e}).then(function(e){function i(){clearTimeout(n),this._updateInputsAndOutputs(),this.interface.onstatechange=this._onInterfaceStateChange.bind(this),"function"==typeof t&&t.call(this),s.forEach(function(t){this._onInterfaceStateChange(t)}.bind(this))}var n,s=[],r=[];this.interface=e,this._resetInterfaceUserHandlers(),this.interface.onstatechange=function(t){s.push(t)};for(var o=e.inputs.values(),a=o.next();a&&!a.done;a=o.next())r.push(a.value.open());for(var h=e.outputs.values(),u=h.next();u&&!u.done;u=h.next())r.push(u.value.open());n=setTimeout(i.bind(this),200),Promise&&Promise.all(r).catch(function(t){}).then(i.bind(this))}.bind(this),function(e){"function"==typeof t&&t.call(this,e)}.bind(this)):void("function"==typeof t&&t(new Error("The Web MIDI API is not supported by your browser.")))},s.prototype.disable=function(){if(!this.supported)throw new Error("The Web MIDI API is not supported by your browser.");this.interface&&(this.interface.onstatechange=void 0),this.interface=void 0,this._inputs=[],this._outputs=[],this._resetInterfaceUserHandlers()},s.prototype.addListener=function(t,e){if(!this.enabled)throw new Error("WebMidi must be enabled before adding event listeners.");if("function"!=typeof e)throw new TypeError("The 'listener' parameter must be a function.");if(!(this._midiInterfaceEvents.indexOf(t)>=0))throw new TypeError("The specified event type is not supported.");return this._userHandlers[t].push(e),this},s.prototype.hasListener=function(t,e){if(!this.enabled)throw new Error("WebMidi must be enabled before checking event listeners.");if("function"!=typeof e)throw new TypeError("The 'listener' parameter must be a function.");if(!(this._midiInterfaceEvents.indexOf(t)>=0))throw new TypeError("The specified event type is not supported.");for(var i=0;i<this._userHandlers[t].length;i++)if(this._userHandlers[t][i]===e)return!0;return!1},s.prototype.removeListener=function(t,e){if(!this.enabled)throw new Error("WebMidi must be enabled before removing event listeners.");if(void 0!==e&&"function"!=typeof e)throw new TypeError("The 'listener' parameter must be a function.");if(this._midiInterfaceEvents.indexOf(t)>=0)if(e)for(var i=0;i<this._userHandlers[t].length;i++)this._userHandlers[t][i]===e&&this._userHandlers[t].splice(i,1);else this._userHandlers[t]=[];else{if(void 0!==t)throw new TypeError("The specified event type is not supported.");this._resetInterfaceUserHandlers()}return this},s.prototype.toMIDIChannels=function(t){var e;return(e="all"===t||void 0===t?["all"]:Array.isArray(t)?t:[t]).indexOf("all")>-1&&(e=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]),e.map(function(t){return parseInt(t)}).filter(function(t){return t>=1&&16>=t})},s.prototype.getInputById=function(t){if(!this.enabled)throw new Error("WebMidi is not enabled.");for(var e=0;e<this.inputs.length;e++)if(this.inputs[e].id===t)return this.inputs[e];return!1},s.prototype.getOutputById=function(t){if(!this.enabled)throw new Error("WebMidi is not enabled.");for(var e=0;e<this.outputs.length;e++)if(this.outputs[e].id===t)return this.outputs[e];return!1},s.prototype.getInputByName=function(t){if(!this.enabled)throw new Error("WebMidi is not enabled.");for(var e=0;e<this.inputs.length;e++)if(~this.inputs[e].name.indexOf(t))return this.inputs[e];return!1},s.prototype.getOctave=function(t){return null!=t&&t>=0&&127>=t?Math.floor(Math.floor(t)/12-1)+Math.floor(a.octaveOffset):void 0},s.prototype.getOutputByName=function(t){if(!this.enabled)throw new Error("WebMidi is not enabled.");for(var e=0;e<this.outputs.length;e++)if(~this.outputs[e].name.indexOf(t))return this.outputs[e];return!1},s.prototype.guessNoteNumber=function(t){var e=!1;if(t&&t.toFixed&&t>=0&&127>=t?e=Math.round(t):parseInt(t)>=0&&parseInt(t)<=127?e=parseInt(t):("string"==typeof t||t instanceof String)&&(e=this.noteNameToNumber(t)),!1===e)throw new Error("Invalid input value ("+t+").");return e},s.prototype.noteNameToNumber=function(t){"string"!=typeof t&&(t="");var e=t.match(/([CDEFGAB])(#{0,2}|b{0,2})(-?\d+)/i);if(!e)throw new RangeError("Invalid note name.");var i=a._semitones[e[1].toUpperCase()],n=12*(parseInt(e[3])+1-Math.floor(a.octaveOffset))+i;if(e[2].toLowerCase().indexOf("b")>-1?n-=e[2].length:e[2].toLowerCase().indexOf("#")>-1&&(n+=e[2].length),0>n||n>127)throw new RangeError("Invalid note name or note outside valid range.");return n},s.prototype._updateInputsAndOutputs=function(){this._updateInputs(),this._updateOutputs()},s.prototype._updateInputs=function(){for(var t=0;t<this._inputs.length;t++){for(var e=!0,i=this.interface.inputs.values(),n=i.next();n&&!n.done;n=i.next())if(this._inputs[t]._midiInput===n.value){e=!1;break}e&&this._inputs.splice(t,1)}this.interface&&this.interface.inputs.forEach(function(t){for(var e=!0,i=0;i<this._inputs.length;i++)this._inputs[i]._midiInput===t&&(e=!1);e&&this._inputs.push(new r(t))}.bind(this))},s.prototype._updateOutputs=function(){for(var t=0;t<this._outputs.length;t++){for(var e=!0,i=this.interface.outputs.values(),n=i.next();n&&!n.done;n=i.next())if(this._outputs[t]._midiOutput===n.value){e=!1;break}e&&this._outputs.splice(t,1)}this.interface&&this.interface.outputs.forEach(function(t){for(var e=!0,i=0;i<this._outputs.length;i++)this._outputs[i]._midiOutput===t&&(e=!1);e&&this._outputs.push(new o(t))}.bind(this))},s.prototype._onInterfaceStateChange=function(t){this._updateInputsAndOutputs();var e={timestamp:t.timeStamp,type:t.port.state};this.interface&&"connected"===t.port.state?"output"===t.port.type?e.port=this.getOutputById(t.port.id):"input"===t.port.type&&(e.port=this.getInputById(t.port.id)):e.port={connection:"closed",id:t.port.id,manufacturer:t.port.manufacturer,name:t.port.name,state:t.port.state,type:t.port.type},this._userHandlers[t.port.state].forEach(function(t){t(e)})},s.prototype._resetInterfaceUserHandlers=function(){for(var t=0;t<this._midiInterfaceEvents.length;t++)this._userHandlers[this._midiInterfaceEvents[t]]=[]},r.prototype.addListener=function(t,e,i){var n=this;if(void 0===e&&(e="all"),Array.isArray(e)||(e=[e]),e.forEach(function(t){if("all"!==t&&!(t>=1&&16>=t))throw new RangeError("The 'channel' parameter is invalid.")}),"function"!=typeof i)throw new TypeError("The 'listener' parameter must be a function.");if(void 0!==a.MIDI_SYSTEM_MESSAGES[t])this._userHandlers.system[t]||(this._userHandlers.system[t]=[]),this._userHandlers.system[t].push(i);else{if(void 0===a.MIDI_CHANNEL_MESSAGES[t])throw new TypeError("The specified event type is not supported.");if(e.indexOf("all")>-1){e=[];for(var s=1;16>=s;s++)e.push(s)}this._userHandlers.channel[t]||(this._userHandlers.channel[t]=[]),e.forEach(function(e){n._userHandlers.channel[t][e]||(n._userHandlers.channel[t][e]=[]),n._userHandlers.channel[t][e].push(i)})}return this},r.prototype.on=r.prototype.addListener,r.prototype.hasListener=function(t,e,i){var n=this;if("function"!=typeof i)throw new TypeError("The 'listener' parameter must be a function.");if(void 0===e&&(e="all"),e.constructor!==Array&&(e=[e]),void 0!==a.MIDI_SYSTEM_MESSAGES[t]){for(var s=0;s<this._userHandlers.system[t].length;s++)if(this._userHandlers.system[t][s]===i)return!0}else if(void 0!==a.MIDI_CHANNEL_MESSAGES[t]){if(e.indexOf("all")>-1){e=[];for(var r=1;16>=r;r++)e.push(r)}return!!this._userHandlers.channel[t]&&e.every(function(e){var s=n._userHandlers.channel[t][e];return s&&s.indexOf(i)>-1})}return!1},r.prototype.removeListener=function(t,e,i){var n=this;if(void 0!==i&&"function"!=typeof i)throw new TypeError("The 'listener' parameter must be a function.");if(void 0===e&&(e="all"),e.constructor!==Array&&(e=[e]),void 0!==a.MIDI_SYSTEM_MESSAGES[t])if(void 0===i)this._userHandlers.system[t]=[];else for(var s=0;s<this._userHandlers.system[t].length;s++)this._userHandlers.system[t][s]===i&&this._userHandlers.system[t].splice(s,1);else if(void 0!==a.MIDI_CHANNEL_MESSAGES[t]){if(e.indexOf("all")>-1){e=[];for(var r=1;16>=r;r++)e.push(r)}if(!this._userHandlers.channel[t])return this;e.forEach(function(e){var s=n._userHandlers.channel[t][e];if(s)if(void 0===i)n._userHandlers.channel[t][e]=[];else for(var r=0;r<s.length;r++)s[r]===i&&s.splice(r,1)})}else{if(void 0!==t)throw new TypeError("The specified event type is not supported.");this._initializeUserHandlers()}return this},r.prototype._initializeUserHandlers=function(){for(var t in a.MIDI_CHANNEL_MESSAGES)a.MIDI_CHANNEL_MESSAGES.hasOwnProperty(t)&&(this._userHandlers.channel[t]={});for(var e in a.MIDI_SYSTEM_MESSAGES)a.MIDI_SYSTEM_MESSAGES.hasOwnProperty(e)&&(this._userHandlers.system[e]=[])},r.prototype._onMidiMessage=function(t){if(this._userHandlers.system.midimessage.length>0){var e={target:this,data:t.data,timestamp:t.timeStamp,type:"midimessage"};this._userHandlers.system.midimessage.forEach(function(t){t(e)})}t.data[0]<240?this._parseChannelEvent(t):t.data[0]<=255&&this._parseSystemEvent(t)},r.prototype._parseChannelEvent=function(t){var e,i,n=t.data[0]>>4,s=1+(15&t.data[0]);t.data.length>1&&(e=t.data[1],i=t.data.length>2?t.data[2]:void 0);var r={target:this,data:t.data,timestamp:t.timeStamp,channel:s};n===a.MIDI_CHANNEL_MESSAGES.noteoff||n===a.MIDI_CHANNEL_MESSAGES.noteon&&0===i?(r.type="noteoff",r.note={number:e,name:a._notes[e%12],octave:a.getOctave(e)},r.velocity=i/127,r.rawVelocity=i):n===a.MIDI_CHANNEL_MESSAGES.noteon?(r.type="noteon",r.note={number:e,name:a._notes[e%12],octave:a.getOctave(e)},r.velocity=i/127,r.rawVelocity=i):n===a.MIDI_CHANNEL_MESSAGES.keyaftertouch?(r.type="keyaftertouch",r.note={number:e,name:a._notes[e%12],octave:a.getOctave(e)},r.value=i/127):n===a.MIDI_CHANNEL_MESSAGES.controlchange&&e>=0&&119>=e?(r.type="controlchange",r.controller={number:e,name:this.getCcNameByNumber(e)},r.value=i):n===a.MIDI_CHANNEL_MESSAGES.channelmode&&e>=120&&127>=e?(r.type="channelmode",r.controller={number:e,name:this.getChannelModeByNumber(e)},r.value=i):n===a.MIDI_CHANNEL_MESSAGES.programchange?(r.type="programchange",r.value=e):n===a.MIDI_CHANNEL_MESSAGES.channelaftertouch?(r.type="channelaftertouch",r.value=e/127):n===a.MIDI_CHANNEL_MESSAGES.pitchbend?(r.type="pitchbend",r.value=((i<<7)+e-8192)/8192):r.type="unknownchannelmessage",this._userHandlers.channel[r.type]&&this._userHandlers.channel[r.type][s]&&this._userHandlers.channel[r.type][s].forEach(function(t){t(r)})},r.prototype.getCcNameByNumber=function(t){if(!((t=Math.floor(t))>=0&&119>=t))throw new RangeError("The control change number must be between 0 and 119.");for(var e in a.MIDI_CONTROL_CHANGE_MESSAGES)if(a.MIDI_CONTROL_CHANGE_MESSAGES.hasOwnProperty(e)&&t===a.MIDI_CONTROL_CHANGE_MESSAGES[e])return e},r.prototype.getChannelModeByNumber=function(t){if(!((t=Math.floor(t))>=120&&status<=127))throw new RangeError("The control change number must be between 120 and 127.");for(var e in a.MIDI_CHANNEL_MODE_MESSAGES)if(a.MIDI_CHANNEL_MODE_MESSAGES.hasOwnProperty(e)&&t===a.MIDI_CHANNEL_MODE_MESSAGES[e])return e},r.prototype._parseSystemEvent=function(t){var e=t.data[0],i={target:this,data:t.data,timestamp:t.timeStamp};e===a.MIDI_SYSTEM_MESSAGES.sysex?i.type="sysex":e===a.MIDI_SYSTEM_MESSAGES.timecode?i.type="timecode":e===a.MIDI_SYSTEM_MESSAGES.songposition?i.type="songposition":e===a.MIDI_SYSTEM_MESSAGES.songselect?(i.type="songselect",i.song=t.data[1]):e===a.MIDI_SYSTEM_MESSAGES.tuningrequest?i.type="tuningrequest":e===a.MIDI_SYSTEM_MESSAGES.clock?i.type="clock":e===a.MIDI_SYSTEM_MESSAGES.start?i.type="start":e===a.MIDI_SYSTEM_MESSAGES.continue?i.type="continue":e===a.MIDI_SYSTEM_MESSAGES.stop?i.type="stop":e===a.MIDI_SYSTEM_MESSAGES.activesensing?i.type="activesensing":e===a.MIDI_SYSTEM_MESSAGES.reset?i.type="reset":i.type="unknownsystemmessage",this._userHandlers.system[i.type]&&this._userHandlers.system[i.type].forEach(function(t){t(i)})},o.prototype.send=function(t,e,i){if(!(t>=128&&255>=t))throw new RangeError("The status byte must be an integer between 128 (0x80) and 255 (0xFF).");void 0===e&&(e=[]),Array.isArray(e)||(e=[e]);var n=[];return e.forEach(function(t,e){var i=Math.floor(t);if(!(i>=0&&255>=i))throw new RangeError("Data bytes must be integers between 0 (0x00) and 255 (0xFF).");n.push(i)}),this._midiOutput.send([t].concat(n),parseFloat(i)||0),this},o.prototype.sendSysex=function(t,e,i){if(!a.sysexEnabled)throw new Error("Sysex message support must first be activated.");return i=i||{},t=[].concat(t),e.forEach(function(t){if(0>t||t>127)throw new RangeError("The data bytes of a sysex message must be integers between 0 (0x00) and 127 (0x7F).")}),e=t.concat(e,a.MIDI_SYSTEM_MESSAGES.sysexend),this.send(a.MIDI_SYSTEM_MESSAGES.sysex,e,this._parseTimeParameter(i.time)),this},o.prototype.sendTimecodeQuarterFrame=function(t,e){return e=e||{},this.send(a.MIDI_SYSTEM_MESSAGES.timecode,t,this._parseTimeParameter(e.time)),this},o.prototype.sendSongPosition=function(t,e){t=Math.floor(t)||0,e=e||{};var i=t>>7&127,n=127&t;return this.send(a.MIDI_SYSTEM_MESSAGES.songposition,[i,n],this._parseTimeParameter(e.time)),this},o.prototype.sendSongSelect=function(t,e){if(t=Math.floor(t),e=e||{},!(t>=0&&127>=t))throw new RangeError("The song number must be between 0 and 127.");return this.send(a.MIDI_SYSTEM_MESSAGES.songselect,[t],this._parseTimeParameter(e.time)),this},o.prototype.sendTuningRequest=function(t){return t=t||{},this.send(a.MIDI_SYSTEM_MESSAGES.tuningrequest,void 0,this._parseTimeParameter(t.time)),this},o.prototype.sendClock=function(t){return t=t||{},this.send(a.MIDI_SYSTEM_MESSAGES.clock,void 0,this._parseTimeParameter(t.time)),this},o.prototype.sendStart=function(t){return t=t||{},this.send(a.MIDI_SYSTEM_MESSAGES.start,void 0,this._parseTimeParameter(t.time)),this},o.prototype.sendContinue=function(t){return t=t||{},this.send(a.MIDI_SYSTEM_MESSAGES.continue,void 0,this._parseTimeParameter(t.time)),this},o.prototype.sendStop=function(t){return t=t||{},this.send(a.MIDI_SYSTEM_MESSAGES.stop,void 0,this._parseTimeParameter(t.time)),this},o.prototype.sendActiveSensing=function(t){return t=t||{},this.send(a.MIDI_SYSTEM_MESSAGES.activesensing,[],this._parseTimeParameter(t.time)),this},o.prototype.sendReset=function(t){return t=t||{},this.send(a.MIDI_SYSTEM_MESSAGES.reset,void 0,this._parseTimeParameter(t.time)),this},o.prototype.stopNote=function(t,e,i){if("all"===t)return this.sendChannelMode("allnotesoff",0,e,i);var n=64;return(i=i||{}).rawVelocity?!isNaN(i.velocity)&&i.velocity>=0&&i.velocity<=127&&(n=i.velocity):!isNaN(i.velocity)&&i.velocity>=0&&i.velocity<=1&&(n=127*i.velocity),this._convertNoteToArray(t).forEach(function(t){a.toMIDIChannels(e).forEach(function(e){this.send((a.MIDI_CHANNEL_MESSAGES.noteoff<<4)+(e-1),[t,Math.round(n)],this._parseTimeParameter(i.time))}.bind(this))}.bind(this)),this},o.prototype.playNote=function(t,e,i){var n=64;if((i=i||{}).rawVelocity?!isNaN(i.velocity)&&i.velocity>=0&&i.velocity<=127&&(n=i.velocity):!isNaN(i.velocity)&&i.velocity>=0&&i.velocity<=1&&(n=127*i.velocity),i.time=this._parseTimeParameter(i.time),this._convertNoteToArray(t).forEach(function(t){a.toMIDIChannels(e).forEach(function(e){this.send((a.MIDI_CHANNEL_MESSAGES.noteon<<4)+(e-1),[t,Math.round(n)],i.time)}.bind(this))}.bind(this)),!isNaN(i.duration)){i.duration<=0&&(i.duration=0);var s=64;i.rawVelocity?!isNaN(i.release)&&i.release>=0&&i.release<=127&&(s=i.release):!isNaN(i.release)&&i.release>=0&&i.release<=1&&(s=127*i.release),this._convertNoteToArray(t).forEach(function(t){a.toMIDIChannels(e).forEach(function(e){this.send((a.MIDI_CHANNEL_MESSAGES.noteoff<<4)+(e-1),[t,Math.round(s)],(i.time||a.time)+i.duration)}.bind(this))}.bind(this))}return this},o.prototype.sendKeyAftertouch=function(t,e,i,n){var s=this;if(n=n||{},1>e||e>16)throw new RangeError("The channel must be between 1 and 16.");(isNaN(i)||0>i||i>1)&&(i=.5);var r=Math.round(127*i);return this._convertNoteToArray(t).forEach(function(t){a.toMIDIChannels(e).forEach(function(e){s.send((a.MIDI_CHANNEL_MESSAGES.keyaftertouch<<4)+(e-1),[t,r],s._parseTimeParameter(n.time))})}),this},o.prototype.sendControlChange=function(t,e,i,n){if(n=n||{},"string"==typeof t){if(!(t=a.MIDI_CONTROL_CHANGE_MESSAGES[t]))throw new TypeError("Invalid controller name.")}else if(!((t=Math.floor(t))>=0&&119>=t))throw new RangeError("Controller numbers must be between 0 and 119.");if(!((e=Math.floor(e)||0)>=0&&127>=e))throw new RangeError("Controller value must be between 0 and 127.");return a.toMIDIChannels(i).forEach(function(i){this.send((a.MIDI_CHANNEL_MESSAGES.controlchange<<4)+(i-1),[t,e],this._parseTimeParameter(n.time))}.bind(this)),this},o.prototype._selectRegisteredParameter=function(t,e,i){var n=this;if(t[0]=Math.floor(t[0]),!(t[0]>=0&&t[0]<=127))throw new RangeError("The control65 value must be between 0 and 127");if(t[1]=Math.floor(t[1]),!(t[1]>=0&&t[1]<=127))throw new RangeError("The control64 value must be between 0 and 127");return a.toMIDIChannels(e).forEach(function(s){n.sendControlChange(101,t[0],e,{time:i}),n.sendControlChange(100,t[1],e,{time:i})}),this},o.prototype._selectNonRegisteredParameter=function(t,e,i){var n=this;if(t[0]=Math.floor(t[0]),!(t[0]>=0&&t[0]<=127))throw new RangeError("The control63 value must be between 0 and 127");if(t[1]=Math.floor(t[1]),!(t[1]>=0&&t[1]<=127))throw new RangeError("The control62 value must be between 0 and 127");return a.toMIDIChannels(e).forEach(function(s){n.sendControlChange(99,t[0],e,{time:i}),n.sendControlChange(98,t[1],e,{time:i})}),this},o.prototype._setCurrentRegisteredParameter=function(t,e,i){var n=this;if((t=[].concat(t))[0]=Math.floor(t[0]),!(t[0]>=0&&t[0]<=127))throw new RangeError("The msb value must be between 0 and 127");return a.toMIDIChannels(e).forEach(function(s){n.sendControlChange(6,t[0],e,{time:i})}),t[1]=Math.floor(t[1]),t[1]>=0&&t[1]<=127&&a.toMIDIChannels(e).forEach(function(s){n.sendControlChange(38,t[1],e,{time:i})}),this},o.prototype._deselectRegisteredParameter=function(t,e){var i=this;return a.toMIDIChannels(t).forEach(function(n){i.sendControlChange(101,127,t,{time:e}),i.sendControlChange(100,127,t,{time:e})}),this},o.prototype.setRegisteredParameter=function(t,e,i,n){var s=this;if(n=n||{},!Array.isArray(t)){if(!a.MIDI_REGISTERED_PARAMETER[t])throw new Error("The specified parameter is not available.");t=a.MIDI_REGISTERED_PARAMETER[t]}return a.toMIDIChannels(i).forEach(function(r){s._selectRegisteredParameter(t,i,n.time),s._setCurrentRegisteredParameter(e,i,n.time),s._deselectRegisteredParameter(i,n.time)}),this},o.prototype.setNonRegisteredParameter=function(t,e,i,n){var s=this;if(n=n||{},!(t[0]>=0&&t[0]<=127&&t[1]>=0&&t[1]<=127))throw new Error("Position 0 and 1 of the 2-position parameter array must both be between 0 and 127.");return e=[].concat(e),a.toMIDIChannels(i).forEach(function(r){s._selectNonRegisteredParameter(t,i,n.time),s._setCurrentRegisteredParameter(e,i,n.time),s._deselectRegisteredParameter(i,n.time)}),this},o.prototype.incrementRegisteredParameter=function(t,e,i){var n=this;if(i=i||{},!Array.isArray(t)){if(!a.MIDI_REGISTERED_PARAMETER[t])throw new Error("The specified parameter is not available.");t=a.MIDI_REGISTERED_PARAMETER[t]}return a.toMIDIChannels(e).forEach(function(s){n._selectRegisteredParameter(t,e,i.time),n.sendControlChange(96,0,e,{time:i.time}),n._deselectRegisteredParameter(e,i.time)}),this},o.prototype.decrementRegisteredParameter=function(t,e,i){if(i=i||{},!Array.isArray(t)){if(!a.MIDI_REGISTERED_PARAMETER[t])throw new TypeError("The specified parameter is not available.");t=a.MIDI_REGISTERED_PARAMETER[t]}return a.toMIDIChannels(e).forEach(function(n){this._selectRegisteredParameter(t,e,i.time),this.sendControlChange(97,0,e,{time:i.time}),this._deselectRegisteredParameter(e,i.time)}.bind(this)),this},o.prototype.setPitchBendRange=function(t,e,i,n){var s=this;if(n=n||{},!((t=Math.floor(t)||0)>=0&&127>=t))throw new RangeError("The semitones value must be between 0 and 127");if(!((e=Math.floor(e)||0)>=0&&127>=e))throw new RangeError("The cents value must be between 0 and 127");return a.toMIDIChannels(i).forEach(function(r){s.setRegisteredParameter("pitchbendrange",[t,e],i,{time:n.time})}),this},o.prototype.setModulationRange=function(t,e,i,n){var s=this;if(n=n||{},!((t=Math.floor(t)||0)>=0&&127>=t))throw new RangeError("The semitones value must be between 0 and 127");if(!((e=Math.floor(e)||0)>=0&&127>=e))throw new RangeError("The cents value must be between 0 and 127");return a.toMIDIChannels(i).forEach(function(r){s.setRegisteredParameter("modulationrange",[t,e],i,{time:n.time})}),this},o.prototype.setMasterTuning=function(t,e,i){var n=this;if(i=i||{},-65>=(t=parseFloat(t)||0)||t>=64)throw new RangeError("The value must be a decimal number larger than -65 and smaller than 64.");var s=Math.floor(t)+64,r=t-Math.floor(t),o=(r=Math.round((r+1)/2*16383))>>7&127,h=127&r;return a.toMIDIChannels(e).forEach(function(t){n.setRegisteredParameter("channelcoarsetuning",s,e,{time:i.time}),n.setRegisteredParameter("channelfinetuning",[o,h],e,{time:i.time})}),this},o.prototype.setTuningProgram=function(t,e,i){var n=this;if(i=i||{},!((t=Math.floor(t))>=0&&127>=t))throw new RangeError("The program value must be between 0 and 127");return a.toMIDIChannels(e).forEach(function(s){n.setRegisteredParameter("tuningprogram",t,e,{time:i.time})}),this},o.prototype.setTuningBank=function(t,e,i){var n=this;if(i=i||{},!((t=Math.floor(t)||0)>=0&&127>=t))throw new RangeError("The bank value must be between 0 and 127");return a.toMIDIChannels(e).forEach(function(s){n.setRegisteredParameter("tuningbank",t,e,{time:i.time})}),this},o.prototype.sendChannelMode=function(t,e,i,n){if(n=n||{},"string"==typeof t){if(!(t=a.MIDI_CHANNEL_MODE_MESSAGES[t]))throw new TypeError("Invalid channel mode message name.")}else if(!((t=Math.floor(t))>=120&&127>=t))throw new RangeError("Channel mode numerical identifiers must be between 120 and 127.");if(0>(e=Math.floor(e)||0)||e>127)throw new RangeError("Value must be an integer between 0 and 127.");return a.toMIDIChannels(i).forEach(function(i){this.send((a.MIDI_CHANNEL_MESSAGES.channelmode<<4)+(i-1),[t,e],this._parseTimeParameter(n.time))}.bind(this)),this},o.prototype.sendProgramChange=function(t,e,i){var n=this;if(i=i||{},t=Math.floor(t),isNaN(t)||0>t||t>127)throw new RangeError("Program numbers must be between 0 and 127.");return a.toMIDIChannels(e).forEach(function(e){n.send((a.MIDI_CHANNEL_MESSAGES.programchange<<4)+(e-1),[t],n._parseTimeParameter(i.time))}),this},o.prototype.sendChannelAftertouch=function(t,e,i){var n=this;i=i||{},t=parseFloat(t),(isNaN(t)||0>t||t>1)&&(t=.5);var s=Math.round(127*t);return a.toMIDIChannels(e).forEach(function(t){n.send((a.MIDI_CHANNEL_MESSAGES.channelaftertouch<<4)+(t-1),[s],n._parseTimeParameter(i.time))}),this},o.prototype.sendPitchBend=function(t,e,i){var n=this;if(i=i||{},isNaN(t)||-1>t||t>1)throw new RangeError("Pitch bend value must be between -1 and 1.");var s=Math.round((t+1)/2*16383),r=s>>7&127,o=127&s;return a.toMIDIChannels(e).forEach(function(t){n.send((a.MIDI_CHANNEL_MESSAGES.pitchbend<<4)+(t-1),[o,r],n._parseTimeParameter(i.time))}),this},o.prototype._parseTimeParameter=function(t){var e,i;return"string"==typeof t&&"+"===t.substring(0,1)?(e=parseFloat(t))&&e>0&&(i=a.time+e):(e=parseFloat(t))>a.time&&(i=e),i},o.prototype._convertNoteToArray=function(t){var e=[];return Array.isArray(t)||(t=[t]),t.forEach(function(t){e.push(a.guessNoteNumber(t))}),e},void 0===(n=function(){return a}.apply(e,[]))||(t.exports=n)}()},function(t,e,i){var n,s=s||function(t){"use strict";if(!(void 0===t||"undefined"!=typeof navigator&&/MSIE [1-9]\./.test(navigator.userAgent))){var e=function(){return t.URL||t.webkitURL||t},i=t.document.createElementNS("http://www.w3.org/1999/xhtml","a"),n="download"in i,s=/constructor/i.test(t.HTMLElement)||t.safari,r=/CriOS\/[\d]+/.test(navigator.userAgent),o=function(e){(t.setImmediate||t.setTimeout)(function(){throw e},0)},a=function(t){setTimeout(function(){"string"==typeof t?e().revokeObjectURL(t):t.remove()},4e4)},h=function(t){return/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)?new Blob([String.fromCharCode(65279),t],{type:t.type}):t},u=function(u,l,c){c||(u=h(u));var p,f=this,d="application/octet-stream"===u.type,y=function(){!function(t,e,i){for(var n=(e=[].concat(e)).length;n--;){var s=t["on"+e[n]];if("function"==typeof s)try{s.call(t,i||t)}catch(t){o(t)}}}(f,"writestart progress write writeend".split(" "))};if(f.readyState=f.INIT,n)return p=e().createObjectURL(u),void setTimeout(function(){i.href=p,i.download=l,function(t){var e=new MouseEvent("click");t.dispatchEvent(e)}(i),y(),a(p),f.readyState=f.DONE});!function(){if((r||d&&s)&&t.FileReader){var i=new FileReader;return i.onloadend=function(){var e=r?i.result:i.result.replace(/^data:[^;]*;/,"data:attachment/file;");t.open(e,"_blank")||(t.location.href=e),e=void 0,f.readyState=f.DONE,y()},i.readAsDataURL(u),void(f.readyState=f.INIT)}p||(p=e().createObjectURL(u)),d?t.location.href=p:t.open(p,"_blank")||(t.location.href=p);f.readyState=f.DONE,y(),a(p)}()},l=u.prototype;return"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob?function(t,e,i){return e=e||t.name||"download",i||(t=h(t)),navigator.msSaveOrOpenBlob(t,e)}:(l.abort=function(){},l.readyState=l.INIT=0,l.WRITING=1,l.DONE=2,l.error=l.onwritestart=l.onprogress=l.onwrite=l.onabort=l.onerror=l.onwriteend=null,function(t,e,i){return new u(t,e||t.name||"download",i)})}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content); +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */void 0!==t&&t.exports?t.exports.saveAs=s:null!==i(123)&&null!==i(124)&&(void 0===(n=function(){return s}.call(e,i,e,t))||(t.exports=n))},function(t,e){t.exports=function(){throw new Error("define cannot be used indirect")}},function(t,e){(function(e){t.exports=e}).call(e,{})},function(t,e,i){t.exports={default:i(126),__esModule:!0}},function(t,e,i){i(127),t.exports=i(0).Object.keys},function(t,e,i){var n=i(28),s=i(16);i(128)("keys",function(){return function(t){return s(n(t))}})},function(t,e,i){var n=i(7),s=i(0),r=i(15);t.exports=function(t,e){var i=(s.Object||{})[t]||Object[t],o={};o[t]=e(i),n(n.S+n.F*r(function(){i(1)}),"Object",o)}},function(t,e,i){"use strict";(function(t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.Writer=e.VexFlow=e.Utils=e.Track=e.ProgramChangeEvent=e.NoteOnEvent=e.NoteOffEvent=e.NoteEvent=e.MetaEvent=e.ControllerChangeEvent=e.Constants=e.Chunk=void 0;var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),o=i(132);function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var h=function t(e){a(this,t),this.type=e.type,this.data=e.data,this.size=[0,0,0,e.data.length]};e.Chunk=h;var u={VERSION:"1.5.2",HEADER_CHUNK_TYPE:[77,84,104,100],HEADER_CHUNK_LENGTH:[0,0,0,6],HEADER_CHUNK_FORMAT0:[0,0],HEADER_CHUNK_FORMAT1:[0,1],HEADER_CHUNK_DIVISION:[0,128],TRACK_CHUNK_TYPE:[77,84,114,107],META_EVENT_ID:255,META_TEXT_ID:1,META_COPYRIGHT_ID:2,META_TRACK_NAME_ID:3,META_INSTRUMENT_NAME_ID:4,META_LYRIC_ID:5,META_MARKER_ID:6,META_CUE_POINT:7,META_TEMPO_ID:81,META_SMTPE_OFFSET:84,META_TIME_SIGNATURE_ID:88,META_KEY_SIGNATURE_ID:89,META_END_OF_TRACK_ID:[47,0],CONTROLLER_CHANGE_STATUS:176,PROGRAM_CHANGE_STATUS:192};e.Constants=u;e.ControllerChangeEvent=function t(e){a(this,t),this.type="controller",this.data=y.numberToVariableLength(0).concat(u.CONTROLLER_CHANGE_STATUS,e.controllerNumber,e.controllerValue)};var l=function t(e){a(this,t),this.type="meta",this.data=y.numberToVariableLength(0),this.data=this.data.concat(u.META_EVENT_ID,e.data)};e.MetaEvent=l;var c=function(){function t(e){a(this,t),this.type="note",this.pitch=y.toArray(e.pitch),this.wait=e.wait||0,this.duration=e.duration,this.sequential=e.sequential||!1,this.velocity=e.velocity||50,this.channel=e.channel||1,this.repeat=e.repeat||1,this.velocity=this.convertVelocity(this.velocity),this.grace=e.grace,this.buildData()}return r(t,[{key:"buildData",value:function(){this.data=[];var e,i,n=this.getTickDuration(this.duration,"note"),s=this.getTickDuration(this.wait,"rest");if(this.grace){this.grace=y.toArray(this.grace),this.grace.forEach(function(e){var i=new t({pitch:this.grace,duration:"T1"});this.data=this.data.concat(i.data),n-=1},this)}if(Array.isArray(this.pitch)){if(this.sequential)for(r=0;r<this.repeat;r++)this.pitch.forEach(function(t,r){if(r>0&&(s=0),"8t"===this.duration&&r==this.pitch.length-1){var o=y.numberFromBytes(u.HEADER_CHUNK_DIVISION);n=o-2*n}e=new f({data:y.numberToVariableLength(s).concat([this.getNoteOnStatus(),y.getPitch(t),this.velocity])}),i=new p({data:y.numberToVariableLength(n).concat([this.getNoteOffStatus(),y.getPitch(t),this.velocity])}),this.data=this.data.concat(e.data,i.data)},this);else for(var r=0;r<this.repeat;r++)this.pitch.forEach(function(t,i){e=new f(0==i?{data:y.numberToVariableLength(s).concat(this.getNoteOnStatus(),y.getPitch(t),this.velocity)}:{data:[0,y.getPitch(t),this.velocity]}),this.data=this.data.concat(e.data)},this),this.pitch.forEach(function(t,e){i=new p(0==e?{data:y.numberToVariableLength(n).concat(this.getNoteOffStatus(),y.getPitch(t),this.velocity)}:{data:[0,y.getPitch(t),this.velocity]}),this.data=this.data.concat(i.data)},this);return this}throw"pitch must be an array."}},{key:"convertVelocity",value:function(t){return t=t>100?100:t,Math.round(t/100*127)}},{key:"getTickDuration",value:function(t,e){if(Array.isArray(t))return t.map(function(t){return this.getTickDuration(t,e)},this).reduce(function(t,e){return t+e},0);if("t"===(t=t.toString()).toLowerCase().charAt(0))return parseInt(t.substring(1));var i=y.numberFromBytes(u.HEADER_CHUNK_DIVISION);return Math.round(i*this.getDurationMultiplier(t,e))}},{key:"getDurationMultiplier",value:function(t,e){switch(t){case"0":return 0;case"1":return 4;case"2":return 2;case"d2":return 3;case"4":return 1;case"4t":return.666;case"d4":return 1.5;case"8":return.5;case"8t":return.33;case"d8":return.75;case"16":return.25;case"16t":return.166;case"32":return.125;case"64":return.0625}throw t+" is not a valid duration."}},{key:"getNoteOnStatus",value:function(){return 144+this.channel-1}},{key:"getNoteOffStatus",value:function(){return 128+this.channel-1}}]),t}();e.NoteEvent=c;var p=function t(e){a(this,t),this.data=e.data};e.NoteOffEvent=p;var f=function t(e){a(this,t),this.data=e.data};e.NoteOnEvent=f;e.ProgramChangeEvent=function t(e){a(this,t),this.type="program",this.data=y.numberToVariableLength(0).concat(u.PROGRAM_CHANGE_STATUS,e.instrument)};var d=function(){function t(){a(this,t),this.type=u.TRACK_CHUNK_TYPE,this.data=[],this.size=[],this.events=[]}return r(t,[{key:"addEvent",value:function(t,e){return Array.isArray(t)?t.forEach(function(t,i){if("function"==typeof e&&"note"===t.type){var n=e(i,t);if("object"===(void 0===n?"undefined":s(n))){for(var r in n)switch(r){case"duration":t.duration=n[r];break;case"sequential":t.sequential=n[r];break;case"velocity":t.velocity=t.convertVelocity(n[r])}t.buildData()}}this.data=this.data.concat(t.data),this.size=y.numberToBytes(this.data.length,4),this.events.push(t)},this):(this.data=this.data.concat(t.data),this.size=y.numberToBytes(this.data.length,4),this.events.push(t)),this}},{key:"setTempo",value:function(t){var e=new l({data:[u.META_TEMPO_ID]});e.data.push(3);var i=Math.round(6e7/t);return e.data=e.data.concat(y.numberToBytes(i,3)),this.addEvent(e)}},{key:"setTimeSignature",value:function(t,e,i,n){i=i||24,n=n||8;var s=new l({data:[u.META_TIME_SIGNATURE_ID]});s.data.push(4),s.data=s.data.concat(y.numberToBytes(t,1));var r=Math.log2(e);return s.data=s.data.concat(y.numberToBytes(r,1)),s.data=s.data.concat(y.numberToBytes(i,1)),s.data=s.data.concat(y.numberToBytes(n,1)),this.addEvent(s)}},{key:"setKeySignature",value:function(t,e){var i=new l({data:[u.META_KEY_SIGNATURE_ID]});i.data.push(2);var n=e||0;if(t=t||0,void 0===e){var s=t.length,r=t||"C";if(t[0]===t[0].toLowerCase()&&(n=1),s>1)switch(t.charAt(s-1)){case"m":case"-":n=1,r=(r=t.charAt(0).toLowerCase()).concat(t.substring(1,s-1));break;case"M":case"+":n=0,r=(r=t.charAt(0).toUpperCase()).concat(t.substring(1,s-1))}var o=[["Cb","Gb","Db","Ab","Eb","Bb","F","C","G","D","A","E","B","F#","C#"],["ab","eb","bb","f","c","g","d","a","e","b","f#","c#","g#","d#","a#"]][n].indexOf(r);t=-1===o?0:o-7}return i.data=i.data.concat(y.numberToBytes(t,1)),i.data=i.data.concat(y.numberToBytes(n,1)),this.addEvent(i)}},{key:"addText",value:function(t){var e=new l({data:[u.META_TEXT_ID]}),i=y.stringToBytes(t);return e.data=e.data.concat(y.numberToVariableLength(i.length)),e.data=e.data.concat(i),this.addEvent(e)}},{key:"addCopyright",value:function(t){var e=new l({data:[u.META_COPYRIGHT_ID]}),i=y.stringToBytes(t);return e.data=e.data.concat(y.numberToVariableLength(i.length)),e.data=e.data.concat(i),this.addEvent(e)}},{key:"addTrackName",value:function(t){var e=new l({data:[u.META_TRACK_NAME_ID]}),i=y.stringToBytes(t);return e.data=e.data.concat(y.numberToVariableLength(i.length)),e.data=e.data.concat(i),this.addEvent(e)}},{key:"addInstrumentName",value:function(t){var e=new l({data:[u.META_INSTRUMENT_NAME_ID]}),i=y.stringToBytes(t);return e.data=e.data.concat(y.numberToVariableLength(i.length)),e.data=e.data.concat(i),this.addEvent(e)}},{key:"addMarker",value:function(t){var e=new l({data:[u.META_MARKER_ID]}),i=y.stringToBytes(t);return e.data=e.data.concat(y.numberToVariableLength(i.length)),e.data=e.data.concat(i),this.addEvent(e)}},{key:"addCuePoint",value:function(t){var e=new l({data:[u.META_CUE_POINT]}),i=y.stringToBytes(t);return e.data=e.data.concat(y.numberToVariableLength(i.length)),e.data=e.data.concat(i),this.addEvent(e)}},{key:"addLyric",value:function(t){var e=new l({data:[u.META_LYRIC_ID]}),i=y.stringToBytes(t);return e.data=e.data.concat(y.numberToVariableLength(i.length)),e.data=e.data.concat(i),this.addEvent(e)}},{key:"polyModeOn",value:function(){var t=new f({data:[0,176,126,0]});return this.addEvent(t)}}]),t}();e.Track=d;var y=function(){function t(){a(this,t)}return r(t,null,[{key:"version",value:function(){return u.VERSION}},{key:"stringToBytes",value:function(t){return t.split("").map(function(t){return t.charCodeAt()})}},{key:"isNumeric",value:function(t){return!isNaN(parseFloat(t))&&isFinite(t)}},{key:"getPitch",value:function(t){return(0,o.toMidi)(t)}},{key:"numberToVariableLength",value:function(t){for(var e=127&t;t>>=7;)e<<=8,e|=127&t|128;for(var i=[];i.push(255&e),128&e;)e>>=8;return i}},{key:"stringByteCount",value:function(t){return encodeURI(t).split(/%..|./).length-1}},{key:"numberFromBytes",value:function(t){var e,i="";return t.forEach(function(t){1==(e=t.toString(16)).length&&(e="0"+e),i+=e}),parseInt(i,16)}},{key:"numberToBytes",value:function(t,e){e=e||1;var i=t.toString(16);1&i.length&&(i="0"+i);var n=i.match(/.{2}/g);if((n=n.map(function(t){return parseInt(t,16)})).length<e)for(;e-n.length>0;)n.unshift(0);return n}},{key:"toArray",value:function(t){return Array.isArray(t)?t:[t]}}]),t}();e.Utils=y;var m=function(){function t(){a(this,t)}return r(t,[{key:"trackFromVoice",value:function(t){var e,i=new d,n=[];return t.tickables.forEach(function(t){if(n=[],"n"===t.noteType)t.keys.forEach(function(t){n.push(this.convertPitch(t))});else if("r"===t.noteType)return void(e=this.convertDuration(t));i.addEvent(new c({pitch:n,duration:this.convertDuration(t),wait:e})),e=0}),i}},{key:"convertPitch",value:function(t){return t.replace("/","")}},{key:"convertDuration",value:function(t){switch(t.duration){case"w":return"1";case"h":return t.isDotted()?"d2":"2";case"q":return t.isDotted()?"d4":"4";case"8":return t.isDotted()?"d8":"8"}return t.duration}}]),t}();e.VexFlow=m;var v=function(){function e(t){a(this,e),this.data=[];var i=t.length>1?u.HEADER_CHUNK_FORMAT1:u.HEADER_CHUNK_FORMAT0,n=y.numberToBytes(t.length,2);this.data.push(new h({type:u.HEADER_CHUNK_TYPE,data:i.concat(n,u.HEADER_CHUNK_DIVISION)})),t.forEach(function(t,e){t.addEvent(new l({data:u.META_END_OF_TRACK_ID})),this.data.push(t)},this)}return r(e,[{key:"buildFile",value:function(){var t=[];return this.data.forEach(function(e){return t=t.concat(e.type,e.size,e.data)}),new Uint8Array(t)}},{key:"base64",value:function(){return"function"==typeof btoa?btoa(String.fromCharCode.apply(null,this.buildFile())):new t(this.buildFile()).toString("base64")}},{key:"dataUri",value:function(){return"data:audio/midi;base64,"+this.base64()}},{key:"stdout",value:function(){return n.stdout.write(new t(this.buildFile()))}},{key:"saveMIDI",value:function(e){var i=new t(this.buildFile());fs.writeFile(e+".mid",i,function(t){if(t)return console.log(t)})}}]),e}();e.Writer=v}).call(e,i(5).Buffer,i(11))},function(t,e,i){"use strict";e.byteLength=function(t){var e=u(t),i=e[0],n=e[1];return 3*(i+n)/4-n},e.toByteArray=function(t){for(var e,i=u(t),n=i[0],o=i[1],a=new r(function(t,e,i){return 3*(e+i)/4-i}(0,n,o)),h=0,l=o>0?n-4:n,c=0;c<l;c+=4)e=s[t.charCodeAt(c)]<<18|s[t.charCodeAt(c+1)]<<12|s[t.charCodeAt(c+2)]<<6|s[t.charCodeAt(c+3)],a[h++]=e>>16&255,a[h++]=e>>8&255,a[h++]=255&e;2===o&&(e=s[t.charCodeAt(c)]<<2|s[t.charCodeAt(c+1)]>>4,a[h++]=255&e);1===o&&(e=s[t.charCodeAt(c)]<<10|s[t.charCodeAt(c+1)]<<4|s[t.charCodeAt(c+2)]>>2,a[h++]=e>>8&255,a[h++]=255&e);return a},e.fromByteArray=function(t){for(var e,i=t.length,s=i%3,r=[],o=0,a=i-s;o<a;o+=16383)r.push(c(t,o,o+16383>a?a:o+16383));1===s?(e=t[i-1],r.push(n[e>>2]+n[e<<4&63]+"==")):2===s&&(e=(t[i-2]<<8)+t[i-1],r.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"="));return r.join("")};for(var n=[],s=[],r="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=0,h=o.length;a<h;++a)n[a]=o[a],s[o.charCodeAt(a)]=a;function u(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var i=t.indexOf("=");return-1===i&&(i=e),[i,i===e?0:4-i%4]}function l(t){return n[t>>18&63]+n[t>>12&63]+n[t>>6&63]+n[63&t]}function c(t,e,i){for(var n,s=[],r=e;r<i;r+=3)n=(t[r]<<16&16711680)+(t[r+1]<<8&65280)+(255&t[r+2]),s.push(l(n));return s.join("")}s["-".charCodeAt(0)]=62,s["_".charCodeAt(0)]=63},function(t,e){e.read=function(t,e,i,n,s){var r,o,a=8*s-n-1,h=(1<<a)-1,u=h>>1,l=-7,c=i?s-1:0,p=i?-1:1,f=t[e+c];for(c+=p,r=f&(1<<-l)-1,f>>=-l,l+=a;l>0;r=256*r+t[e+c],c+=p,l-=8);for(o=r&(1<<-l)-1,r>>=-l,l+=n;l>0;o=256*o+t[e+c],c+=p,l-=8);if(0===r)r=1-u;else{if(r===h)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,n),r-=u}return(f?-1:1)*o*Math.pow(2,r-n)},e.write=function(t,e,i,n,s,r){var o,a,h,u=8*r-s-1,l=(1<<u)-1,c=l>>1,p=23===s?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:r-1,d=n?1:-1,y=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,o=l):(o=Math.floor(Math.log(e)/Math.LN2),e*(h=Math.pow(2,-o))<1&&(o--,h*=2),(e+=o+c>=1?p/h:p*Math.pow(2,1-c))*h>=2&&(o++,h/=2),o+c>=l?(a=0,o=l):o+c>=1?(a=(e*h-1)*Math.pow(2,s),o+=c):(a=e*Math.pow(2,c-1)*Math.pow(2,s),o=0));s>=8;t[i+f]=255&a,f+=d,a/=256,s-=8);for(o=o<<s|a,u+=s;u>0;t[i+f]=255&o,f+=d,o/=256,u-=8);t[i+f-d]|=128*y}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.toMidi=function(t){return Array.isArray(t)&&2===t.length?7*t[0]+12*t[1]+12:Object(n.a)(t)},e.note=function t(e,i){if(!0===e||!1===e)return function(i){return t(i,e)};e=Math.round(e);var n=!0===i?r:s;var o=n[e%12];var a=Math.floor(e/12)-1;return o+a};var n=i(133);var s="C Db D Eb E F Gb G Ab A Bb B".split(" "),r="C C# D D# E F F# G G# A A# B".split(" ")},function(t,e,i){"use strict";function n(t){return"number"==typeof t}function s(t,e){return Math.pow(2,(t-69)/12)*(e||440)}e.a=h;var r=/^([a-gA-G])(#{1,}|b{1,}|x{1,}|)(-?\d*)\s*(.*)\s*$/;var o=[0,2,4,5,7,9,11];function a(t,e,i){if("string"!=typeof t)return null;var n=r.exec(t);if(!n||!e&&n[4])return null;var a={letter:n[1].toUpperCase(),acc:n[2].replace(/x/g,"##")};a.pc=a.letter+a.acc,a.step=(a.letter.charCodeAt(0)+3)%7,a.alt="b"===a.acc[0]?-a.acc.length:a.acc.length;var h=o[a.step]+a.alt;return a.chroma=h<0?12+h:h%12,n[3]&&(a.oct=+n[3],a.midi=h+12*(a.oct+1),a.freq=s(a.midi,i)),e&&(a.tonicOf=n[4]),a}function h(t){if((n(t)||function(t){return"string"==typeof t}(t))&&t>=0&&t<128)return+t;var e=a(t);return e&&function(t){return void 0!==t}(e.midi)?e.midi:null}},function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.load=void 0;var n=function(t){return t&&t.__esModule?t:{default:t}}(i(135));var s=i(145),r=["mass_shootings_from_columbine","gun_violence_by_month"].map(function(t){return fetch("./data/"+t+".csv").then(function(t){return t.text()}).then(function(t){return new n.default(function(e,i){s(t,{},function(t,i){return e(i)})})}).then(function(e){var i=e.shift();return{name:t,h:i,lines:e.filter(function(t){return!!t})}})}),o=n.default.all(r).then(function(t){return t.reduce(function(t,e){return t[e.name]=e,t},{})});e.load=function(){return o}},function(t,e,i){t.exports={default:i(136),__esModule:!0}},function(t,e,i){i(68),i(22),i(24),i(137),t.exports=i(0).Promise},function(t,e,i){"use strict";var n,s,r,o=i(25),a=i(2),h=i(19),u=i(41),l=i(7),c=i(20),p=i(33),f=i(138),d=i(139),y=i(140),m=i(71).set,v=i(142)(),_=a.TypeError,g=a.process,b=a.Promise,w="process"==u(g=a.process),S=function(){},T=!!function(){try{var t=b.resolve(1),e=(t.constructor={})[i(1)("species")]=function(t){t(S,S)};return(w||"function"==typeof PromiseRejectionEvent)&&t.then(S)instanceof e}catch(t){}}(),x=function(t,e){return t===e||t===b&&e===r},A=function(t){var e;return!(!c(t)||"function"!=typeof(e=t.then))&&e},E=function(t){return x(b,t)?new k(t):new s(t)},k=s=function(t){var e,i;this.promise=new t(function(t,n){if(void 0!==e||void 0!==i)throw _("Bad Promise constructor");e=t,i=n}),this.resolve=p(e),this.reject=p(i)},O=function(t){try{t()}catch(t){return{error:t}}},M=function(t,e){if(!t._n){t._n=!0;var i=t._c;v(function(){for(var n=t._v,s=1==t._s,r=0,o=function(e){var i,r,o=s?e.ok:e.fail,a=e.resolve,h=e.reject,u=e.domain;try{o?(s||(2==t._h&&I(t),t._h=1),!0===o?i=n:(u&&u.enter(),i=o(n),u&&u.exit()),i===e.promise?h(_("Promise-chain cycle")):(r=A(i))?r.call(i,a,h):a(i)):h(n)}catch(t){h(t)}};i.length>r;)o(i[r++]);t._c=[],t._n=!1,e&&!t._h&&P(t)})}},P=function(t){m.call(a,function(){var e,i,n,s=t._v;if(C(t)&&(e=O(function(){w?g.emit("unhandledRejection",s,t):(i=a.onunhandledrejection)?i({promise:t,reason:s}):(n=a.console)&&n.error&&n.error("Unhandled promise rejection",s)}),t._h=w||C(t)?2:1),t._a=void 0,e)throw e.error})},C=function(t){if(1==t._h)return!1;for(var e,i=t._a||t._c,n=0;i.length>n;)if((e=i[n++]).fail||!C(e.promise))return!1;return!0},I=function(t){m.call(a,function(){var e;w?g.emit("rejectionHandled",t):(e=a.onrejectionhandled)&&e({promise:t,reason:t._v})})},R=function(t){var e=this;e._d||(e._d=!0,(e=e._w||e)._v=t,e._s=2,e._a||(e._a=e._c.slice()),M(e,!0))},F=function(t){var e,i=this;if(!i._d){i._d=!0,i=i._w||i;try{if(i===t)throw _("Promise can't be resolved itself");(e=A(t))?v(function(){var n={_w:i,_d:!1};try{e.call(t,h(F,n,1),h(R,n,1))}catch(t){R.call(n,t)}}):(i._v=t,i._s=1,M(i,!1))}catch(t){R.call({_w:i,_d:!1},t)}}};T||(b=function(t){f(this,b,"Promise","_h"),p(t),n.call(this);try{t(h(F,this,1),h(R,this,1))}catch(t){R.call(this,t)}},(n=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=i(143)(b.prototype,{then:function(t,e){var i=E(y(this,b));return i.ok="function"!=typeof t||t,i.fail="function"==typeof e&&e,i.domain=w?g.domain:void 0,this._c.push(i),this._a&&this._a.push(i),this._s&&M(this,!1),i.promise},catch:function(t){return this.then(void 0,t)}}),k=function(){var t=new n;this.promise=t,this.resolve=h(F,t,1),this.reject=h(R,t,1)}),l(l.G+l.W+l.F*!T,{Promise:b}),i(27)(b,"Promise"),i(144)("Promise"),r=i(0).Promise,l(l.S+l.F*!T,"Promise",{reject:function(t){var e=E(this);return(0,e.reject)(t),e.promise}}),l(l.S+l.F*(o||!T),"Promise",{resolve:function(t){if(t instanceof b&&x(t.constructor,this))return t;var e=E(this);return(0,e.resolve)(t),e.promise}}),l(l.S+l.F*!(T&&i(62)(function(t){b.all(t).catch(S)})),"Promise",{all:function(t){var e=this,i=E(e),n=i.resolve,s=i.reject,r=O(function(){var i=[],r=0,o=1;d(t,!1,function(t){var a=r++,h=!1;i.push(void 0),o++,e.resolve(t).then(function(t){h||(h=!0,i[a]=t,--o||n(i))},s)}),--o||n(i)});return r&&s(r.error),i.promise},race:function(t){var e=this,i=E(e),n=i.reject,s=O(function(){d(t,!1,function(t){e.resolve(t).then(i.resolve,n)})});return s&&n(s.error),i.promise}})},function(t,e){t.exports=function(t,e,i,n){if(!(t instanceof e)||void 0!==n&&n in t)throw TypeError(i+": incorrect invocation!");return t}},function(t,e,i){var n=i(19),s=i(60),r=i(61),o=i(4),a=i(36),h=i(42),u={},l={};(e=t.exports=function(t,e,i,c,p){var f,d,y,m,v=p?function(){return t}:h(t),_=n(i,c,e?2:1),g=0;if("function"!=typeof v)throw TypeError(t+" is not iterable!");if(r(v)){for(f=a(t.length);f>g;g++)if((m=e?_(o(d=t[g])[0],d[1]):_(t[g]))===u||m===l)return m}else for(y=v.call(t);!(d=y.next()).done;)if((m=s(y,_,d.value,e))===u||m===l)return m}).BREAK=u,e.RETURN=l},function(t,e,i){var n=i(4),s=i(33),r=i(1)("species");t.exports=function(t,e){var i,o=n(t).constructor;return void 0===o||void 0==(i=n(o)[r])?e:s(i)}},function(t,e){t.exports=function(t,e,i){var n=void 0===i;switch(e.length){case 0:return n?t():t.call(i);case 1:return n?t(e[0]):t.call(i,e[0]);case 2:return n?t(e[0],e[1]):t.call(i,e[0],e[1]);case 3:return n?t(e[0],e[1],e[2]):t.call(i,e[0],e[1],e[2]);case 4:return n?t(e[0],e[1],e[2],e[3]):t.call(i,e[0],e[1],e[2],e[3])}return t.apply(i,e)}},function(t,e,i){var n=i(2),s=i(71).set,r=n.MutationObserver||n.WebKitMutationObserver,o=n.process,a=n.Promise,h="process"==i(18)(o);t.exports=function(){var t,e,i,u=function(){var n,s;for(h&&(n=o.domain)&&n.exit();t;){s=t.fn,t=t.next;try{s()}catch(n){throw t?i():e=void 0,n}}e=void 0,n&&n.enter()};if(h)i=function(){o.nextTick(u)};else if(r){var l=!0,c=document.createTextNode("");new r(u).observe(c,{characterData:!0}),i=function(){c.data=l=!l}}else if(a&&a.resolve){var p=a.resolve();i=function(){p.then(u)}}else i=function(){s.call(n,u)};return function(n){var s={fn:n,next:void 0};e&&(e.next=s),t||(t=s,i()),e=s}}},function(t,e,i){var n=i(8);t.exports=function(t,e,i){for(var s in e)i&&t[s]?t[s]=e[s]:n(t,s,e[s]);return t}},function(t,e,i){"use strict";var n=i(2),s=i(0),r=i(3),o=i(9),a=i(1)("species");t.exports=function(t){var e="function"==typeof s[t]?s[t]:n[t];o&&e&&!e[a]&&r.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,i){(function(e,n,s){var r,o,a,h,u;h=i(147),u=i(156),o=i(51).StringDecoder,t.exports=function(){var t,i,s,o,h,u,l;if(3===arguments.length){if(o=arguments[0],u=arguments[1],"function"!=typeof(t=arguments[2]))throw Error(`Invalid callback argument: ${JSON.stringify(t)}`);if("string"!=typeof o&&!e.isBuffer(arguments[0]))return t(Error(`Invalid data argument: ${JSON.stringify(o)}`))}else if(2===arguments.length){if("string"==typeof arguments[0]||e.isBuffer(arguments[0])?o=arguments[0]:a(arguments[0])?u=arguments[0]:h=`Invalid first argument: ${JSON.stringify(arguments[0])}`,"function"==typeof arguments[1]?t=arguments[1]:a(arguments[1])?u?h="Invalid arguments: got options twice as first and second arguments":u=arguments[1]:h=`Invalid first argument: ${JSON.stringify(arguments[1])}`,h){if(t)return t(Error(h));throw Error(h)}}else 1===arguments.length&&("function"==typeof arguments[0]?t=arguments[0]:u=arguments[0]);return null==u&&(u={}),l=new r(u),null!=o&&n.nextTick(function(){return l.write(o),l.end()}),t&&(i=!1,s=u.objname?{}:[],l.on("readable",function(){var t,e;for(e=[];t=l.read();)u.objname?e.push(s[t[0]]=t[1]):e.push(s.push(t));return e}),l.on("error",function(e){return i=!0,t(e)}),l.on("end",function(){if(!i)return t(null,s)})),l},r=function(t={}){var e,i,n,s,r,a,u,l,c,p,f,d,y,m,v,_,g,b,w,S;for(w in this.options={},t)S=t[w],this.options[w]=S;return this.options.objectMode=!0,h.Transform.call(this,this.options),null==(e=this.options).rowDelimiter&&(e.rowDelimiter=null),"string"==typeof this.options.rowDelimiter&&(this.options.rowDelimiter=[this.options.rowDelimiter]),null==(i=this.options).delimiter&&(i.delimiter=","),void 0===this.options.quote||this.options.quote||(this.options.quote=""),null==(f=this.options).quote&&(f.quote='"'),null==(d=this.options).escape&&(d.escape='"'),null==(y=this.options).columns&&(y.columns=null),null==(m=this.options).comment&&(m.comment=""),null==(v=this.options).objname&&(v.objname=!1),null==(_=this.options).trim&&(_.trim=!1),null==(g=this.options).ltrim&&(g.ltrim=!1),null==(b=this.options).rtrim&&(b.rtrim=!1),null!=this.options.auto_parse&&(this.options.cast=this.options.auto_parse),null==(n=this.options).cast&&(n.cast=!1),null!=this.options.auto_parse_date&&(this.options.cast_date=this.options.auto_parse_date),null==(s=this.options).cast_date&&(s.cast_date=!1),!0===this.options.cast_date&&(this.options.cast_date=function(t){var e;return e=Date.parse(t),isNaN(e)||(t=new Date(e)),t}),null==(r=this.options).relax&&(r.relax=!1),null==(a=this.options).relax_column_count&&(a.relax_column_count=!1),null==(u=this.options).skip_empty_lines&&(u.skip_empty_lines=!1),null==(l=this.options).max_limit_on_data_read&&(l.max_limit_on_data_read=128e3),null==(c=this.options).skip_lines_with_empty_values&&(c.skip_lines_with_empty_values=!1),null==(p=this.options).skip_lines_with_error&&(p.skip_lines_with_error=!1),this.lines=0,this.count=0,this.skipped_line_count=0,this.empty_line_count=0,this.is_int=/^(\-|\+)?([1-9]+[0-9]*)$/,this.is_float=function(t){return t-parseFloat(t)+1>=0},this._={decoder:new o,quoting:!1,commenting:!1,field:null,nextChar:null,closingQuote:0,line:[],chunks:[],rawBuf:"",buf:"",rowDelimiterLength:this.options.rowDelimiter?Math.max(...this.options.rowDelimiter.map(function(t){return t.length})):void 0,lineHasError:!1,isEnded:!1},this},u.inherits(r,h.Transform),t.exports.Parser=r,r.prototype._transform=function(t,i,n){return s(()=>{var i;return t instanceof e&&(t=this._.decoder.write(t)),(i=this.__write(t,!1))?this.emit("error",i):n()})},r.prototype._flush=function(t){return t(this.__flush())},r.prototype.__flush=function(){return this.__write(this._.decoder.end(),!0)||(this._.quoting?this.error(`Quoted field not terminated at line ${this.lines+1}`):this._.line.length>0?this.__push(this._.line):void 0)},r.prototype.__push=function(t){var e,i,n,s,r,o,a,h,u;if(!(this._.isEnded||this.options.skip_lines_with_empty_values&&""===t.join("").trim()))if(u=null,!0!==this.options.columns){if("function"==typeof this.options.columns)return e=function(t,e){try{return[null,t.call(null,e)]}catch(t){return[t]}},[n,i]=e(this.options.columns,t),n||void(this.options.columns=i);if(!this._.line_length&&t.length>0&&(this._.line_length=this.options.columns?this.options.columns.length:t.length),1===t.length&&""===t[0])this.empty_line_count++;else if(t.length!==this._.line_length){if(!this.options.relax_column_count)return n=null!=this.options.columns?this.error(`Number of columns on line ${this.lines} does not match header`):this.error(`Number of columns is inconsistent on line ${this.lines}`);this.count++,this.skipped_line_count++}else this.count++;if(null!=this.options.columns){for(h={},r=o=0,a=t.length;o<a;r=++o)s=t[r],!1!==this.options.columns[r]&&(h[this.options.columns[r]]=s);u=this.options.objname?[h[this.options.objname],h]:h}else u=t;if(!(this.count<this.options.from))return this.options.raw?(this.push({raw:this._.rawBuf,row:u}),this._.rawBuf=""):this.push(u),this.listenerCount("record")&&this.emit("record",u),this.count>=this.options.to?(this._.isEnded=!0,this.push(null)):null}else this.options.columns=t},r.prototype.__write=function(t,e){var i,n,s,r,o,a,h,u,l,c,p,f,d,y,m,v,_,g,b,w,S,T,x,A,E,k,O,M,P,C;for(v=(t=>"function"==typeof this.is_int?this.is_int(t):this.is_int.test(t)),m=(t=>"function"==typeof this.is_float?this.is_float(t):this.is_float.test(t)),s=((t,e={})=>this.options.cast?(null==e.quoting&&(e.quoting=!!this._.closingQuote),null==e.lines&&(e.lines=this.lines),null==e.count&&(e.count=this.count),null==e.index&&(e.index=this._.line.length),null==e.header&&(e.header=!0===this.options.columns),null==e.column&&(e.column=Array.isArray(this.options.columns)?this.options.columns[e.index]:e.index),"function"==typeof this.options.cast?this.options.cast(t,e):(v(t)?t=parseInt(t):m(t)?t=parseFloat(t):this.options.cast_date&&(t=this.options.cast_date(t,e)),t)):t),g=this.options.trim||this.options.ltrim,P=this.options.trim||this.options.rtrim,t=this._.buf+t,_=t.length,h=0,0===this.lines&&65279===t.charCodeAt(0)&&h++;h<_&&(e||(O=t.substr(h,_-h),!(!this.options.rowDelimiter&&h+3>_||!this._.commenting&&_-h<this.options.comment.length&&this.options.comment.substr(0,_-h)===O||this.options.rowDelimiter&&_-h<this._.rowDelimiterLength&&this.options.rowDelimiter.some(function(t){return t.substr(0,_-h)===O})||this.options.rowDelimiter&&this._.quoting&&_-h<this.options.quote.length+this._.rowDelimiterLength&&this.options.rowDelimiter.some(t=>(this.options.quote+t).substr(0,_-h)===O)||_-h<=this.options.delimiter.length&&this.options.delimiter.substr(0,_-h)===O||_-h<=this.options.escape.length&&this.options.escape.substr(0,_-h)===O)));)if(r=this._.nextChar?this._.nextChar:t.charAt(h),this._.nextChar=_>h+1?t.charAt(h+1):null,this.options.raw&&(this._.rawBuf+=r),null==this.options.rowDelimiter&&(b=h,M=null,this._.quoting||"\n"!==r&&"\r"!==r?!this._.quoting||r!==this.options.quote||"\n"!==(w=this._.nextChar)&&"\r"!==w||(M=this._.nextChar,b+=2):(M=r,b+=1),M&&("\r"===M&&"\n"===t.charAt(b)&&(M+="\n"),this.options.rowDelimiter=[M],this._.rowDelimiterLength=M.length)),this._.commenting||r!==this.options.escape||(a=this.options.escape===this.options.quote,l=this._.nextChar===this.options.escape,f=this._.nextChar===this.options.quote,a&&!this._.field&&!this._.quoting||!l&&!f)){if(!this._.commenting&&r===this.options.quote){if(this._.acceptOnlyEmptyChars&&" "!==r&&"\t"!==r)return this.error("Only trimable characters are accepted after quotes");if(this._.quoting){if(p=P&&(" "===(S=this._.nextChar)||"\t"===S),n=this.options.rowDelimiter&&this.options.rowDelimiter.some(function(e){return t.substr(h+1,e.length)===e}),i=t.substr(h+1,this.options.delimiter.length)===this.options.delimiter,c=this._.nextChar===this.options.comment,null==this._.nextChar||p||n||i||c){if(null!=this._.nextChar&&p){h++,this._.quoting=!1,this._.closingQuote=this.options.quote.length,this._.acceptOnlyEmptyChars=!0;continue}h++,this._.quoting=!1,this._.closingQuote=this.options.quote.length,e&&h===_&&(this._.line.push(s(this._.field||"")),this._.field=null);continue}if(this.options.relax)this._.quoting=!1,this._.field&&(this._.field=`${this.options.quote}${this._.field}`);else if(o=this.error(`Invalid closing quote at line ${this.lines+1}; found ${JSON.stringify(this._.nextChar)} instead of delimiter ${JSON.stringify(this.options.delimiter)}`))return o}else{if(!this._.field){this._.quoting=!0,h++;continue}if(null!=this._.field&&!this.options.relax&&(o=this.error(`Invalid opening quote at line ${this.lines+1}`)))return o}}if(((d=this.options.rowDelimiter&&this.options.rowDelimiter.some(function(e){return t.substr(h,e.length)===e}))||e&&h===_-1)&&this.lines++,C=!1,this._.commenting||this._.quoting||!this.options.comment||t.substr(h,this.options.comment.length)!==this.options.comment?this._.commenting&&d&&(C=!0,this._.commenting=!1):this._.commenting=!0,u=t.substr(h,this.options.delimiter.length)===this.options.delimiter,this._.acceptOnlyEmptyChars){if(!u&&!d){if(" "===r||"\t"===r){h++;continue}return this.error("Only trimable characters are accepted after quotes")}this._.acceptOnlyEmptyChars=!1}if(this._.commenting||this._.quoting||!u&&!d)this._.commenting||this._.quoting||" "!==r&&"\t"!==r?this._.commenting?h++:(null==this._.field&&(this._.field=""),this._.field+=r,h++):(null==this._.field&&(this._.field=""),g&&!this._.field||(this._.field+=r),h++);else{if(d&&(y=this.options.rowDelimiter.filter(function(e){return t.substr(h,e.length)===e})[0].length),d&&0===this._.line.length&&null==this._.field&&(C||this.options.skip_empty_lines)){h+=y,this._.nextChar=t.charAt(h);continue}if(P&&(this._.closingQuote||(this._.field=null!=(T=this._.field)?T.trimRight():void 0)),this._.line.push(s(this._.field||"")),this._.closingQuote=0,this._.field=null,u&&(h+=this.options.delimiter.length,this._.nextChar=t.charAt(h),e&&!this._.nextChar&&(d=!0,this._.line.push(""))),d){if(!this._.lineHasError&&(o=this.__push(this._.line)))return o;this._.lineHasError&&(this._.lineHasError=!1),this._.line=[],h+=y,this._.nextChar=t.charAt(h);continue}}if(!this._.commenting&&(null!=(x=this._.field)?x.length:void 0)>this.options.max_limit_on_data_read)return Error(`Field exceeds max_limit_on_data_read setting (${this.options.max_limit_on_data_read}) ${JSON.stringify(this.options.delimiter)}`);if(!this._.commenting&&(null!=(A=this._.line)?A.length:void 0)>this.options.max_limit_on_data_read)return Error(`Row delimiter not found in the file ${JSON.stringify(this.options.rowDelimiter)}`)}else h++,r=this._.nextChar,this._.nextChar=t.charAt(h+1),null==this._.field&&(this._.field=""),this._.field+=r,this.options.raw&&(this._.rawBuf+=r),h++;if(e){if(0===_&&this.lines++,null!=this._.field&&(P&&(this._.closingQuote||(this._.field=null!=(E=this._.field)?E.trimRight():void 0)),this._.line.push(s(this._.field||"")),this._.field=null),(null!=(k=this._.field)?k.length:void 0)>this.options.max_limit_on_data_read)return Error(`Delimiter not found in the file ${JSON.stringify(this.options.delimiter)}`);if(this._.line.length>this.options.max_limit_on_data_read)return Error(`Row delimiter not found in the file ${JSON.stringify(this.options.rowDelimiter)}`)}return this._.buf=t.substr(h),null},r.prototype.error=function(t){var e;return e=Error(t),this.options.skip_lines_with_error?(this._.lineHasError||(this._.lineHasError=!0,this.emit("skip",e)),null):e},a=function(t){var e;return e=t,"object"==typeof t&&null!==t&&!Array.isArray(t)&&function(){for(;null!==Object.getPrototypeOf(e=Object.getPrototypeOf(e)););return Object.getPrototypeOf(t===e)}()}}).call(e,i(5).Buffer,i(11),i(72).setImmediate)},function(t,e,i){(function(t,e){!function(t,i){"use strict";if(!t.setImmediate){var n,s=1,r={},o=!1,a=t.document,h=Object.getPrototypeOf&&Object.getPrototypeOf(t);h=h&&h.setTimeout?h:t,"[object process]"==={}.toString.call(t.process)?n=function(t){e.nextTick(function(){l(t)})}:function(){if(t.postMessage&&!t.importScripts){var e=!0,i=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=i,e}}()?function(){var e="setImmediate$"+Math.random()+"$",i=function(i){i.source===t&&"string"==typeof i.data&&0===i.data.indexOf(e)&&l(+i.data.slice(e.length))};t.addEventListener?t.addEventListener("message",i,!1):t.attachEvent("onmessage",i),n=function(i){t.postMessage(e+i,"*")}}():t.MessageChannel?function(){var t=new MessageChannel;t.port1.onmessage=function(t){l(t.data)},n=function(e){t.port2.postMessage(e)}}():a&&"onreadystatechange"in a.createElement("script")?function(){var t=a.documentElement;n=function(e){var i=a.createElement("script");i.onreadystatechange=function(){l(e),i.onreadystatechange=null,t.removeChild(i),i=null},t.appendChild(i)}}():n=function(t){setTimeout(l,0,t)},h.setImmediate=function(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),i=0;i<e.length;i++)e[i]=arguments[i+1];var o={callback:t,args:e};return r[s]=o,n(s),s++},h.clearImmediate=u}function u(t){delete r[t]}function l(t){if(o)setTimeout(l,0,t);else{var e=r[t];if(e){o=!0;try{!function(t){var e=t.callback,n=t.args;switch(n.length){case 0:e();break;case 1:e(n[0]);break;case 2:e(n[0],n[1]);break;case 3:e(n[0],n[1],n[2]);break;default:e.apply(i,n)}}(e)}finally{u(t),o=!1}}}}}("undefined"==typeof self?void 0===t?this:t:self)}).call(e,i(17),i(11))},function(t,e,i){t.exports=s;var n=i(47).EventEmitter;function s(){n.call(this)}i(12)(s,n),s.Readable=i(48),s.Writable=i(152),s.Duplex=i(153),s.Transform=i(154),s.PassThrough=i(155),s.Stream=s,s.prototype.pipe=function(t,e){var i=this;function s(e){t.writable&&!1===t.write(e)&&i.pause&&i.pause()}function r(){i.readable&&i.resume&&i.resume()}i.on("data",s),t.on("drain",r),t._isStdio||e&&!1===e.end||(i.on("end",a),i.on("close",h));var o=!1;function a(){o||(o=!0,t.end())}function h(){o||(o=!0,"function"==typeof t.destroy&&t.destroy())}function u(t){if(l(),0===n.listenerCount(this,"error"))throw t}function l(){i.removeListener("data",s),t.removeListener("drain",r),i.removeListener("end",a),i.removeListener("close",h),i.removeListener("error",u),t.removeListener("error",u),i.removeListener("end",l),i.removeListener("close",l),t.removeListener("close",l)}return i.on("error",u),t.on("error",u),i.on("end",l),i.on("close",l),t.on("close",l),t.emit("pipe",i),t}},function(t,e){},function(t,e,i){"use strict";i(5).Buffer;var n=i(31);function s(){this.head=null,this.tail=null,this.length=0}t.exports=s,s.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},s.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},s.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},s.prototype.clear=function(){this.head=this.tail=null,this.length=0},s.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,i=""+e.data;e=e.next;)i+=t+e.data;return i},s.prototype.concat=function(t){if(0===this.length)return n.alloc(0);if(1===this.length)return this.head.data;for(var e=n.allocUnsafe(t>>>0),i=this.head,s=0;i;)i.data.copy(e,s),s+=i.data.length,i=i.next;return e}},function(t,e,i){(function(e){function i(t){try{if(!e.localStorage)return!1}catch(t){return!1}var i=e.localStorage[t];return null!=i&&"true"===String(i).toLowerCase()}t.exports=function(t,e){if(i("noDeprecation"))return t;var n=!1;return function(){if(!n){if(i("throwDeprecation"))throw new Error(e);i("traceDeprecation")?console.trace(e):console.warn(e),n=!0}return t.apply(this,arguments)}}}).call(e,i(17))},function(t,e,i){"use strict";t.exports=r;var n=i(75),s=i(23);function r(t){if(!(this instanceof r))return new r(t);n.call(this,t)}s.inherits=i(12),s.inherits(r,n),r.prototype._transform=function(t,e,i){i(null,t)}},function(t,e,i){t.exports=i(50)},function(t,e,i){t.exports=i(13)},function(t,e,i){t.exports=i(48).Transform},function(t,e,i){t.exports=i(48).PassThrough},function(t,e,i){(function(t,n){var s=/%[sdj%]/g;e.format=function(t){if(!v(t)){for(var e=[],i=0;i<arguments.length;i++)e.push(a(arguments[i]));return e.join(" ")}i=1;for(var n=arguments,r=n.length,o=String(t).replace(s,function(t){if("%%"===t)return"%";if(i>=r)return t;switch(t){case"%s":return String(n[i++]);case"%d":return Number(n[i++]);case"%j":try{return JSON.stringify(n[i++])}catch(t){return"[Circular]"}default:return t}}),h=n[i];i<r;h=n[++i])y(h)||!b(h)?o+=" "+h:o+=" "+a(h);return o},e.deprecate=function(i,s){if(_(t.process))return function(){return e.deprecate(i,s).apply(this,arguments)};if(!0===n.noDeprecation)return i;var r=!1;return function(){if(!r){if(n.throwDeprecation)throw new Error(s);n.traceDeprecation?console.trace(s):console.error(s),r=!0}return i.apply(this,arguments)}};var r,o={};function a(t,i){var n={seen:[],stylize:u};return arguments.length>=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),d(i)?n.showHidden=i:i&&e._extend(n,i),_(n.showHidden)&&(n.showHidden=!1),_(n.depth)&&(n.depth=2),_(n.colors)&&(n.colors=!1),_(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=h),l(n,t,n.depth)}function h(t,e){var i=a.styles[e];return i?"["+a.colors[i][0]+"m"+t+"["+a.colors[i][1]+"m":t}function u(t,e){return t}function l(t,i,n){if(t.customInspect&&i&&T(i.inspect)&&i.inspect!==e.inspect&&(!i.constructor||i.constructor.prototype!==i)){var s=i.inspect(n,t);return v(s)||(s=l(t,s,n)),s}var r=function(t,e){if(_(e))return t.stylize("undefined","undefined");if(v(e)){var i="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(i,"string")}if(m(e))return t.stylize(""+e,"number");if(d(e))return t.stylize(""+e,"boolean");if(y(e))return t.stylize("null","null")}(t,i);if(r)return r;var o=Object.keys(i),a=function(t){var e={};return t.forEach(function(t,i){e[t]=!0}),e}(o);if(t.showHidden&&(o=Object.getOwnPropertyNames(i)),S(i)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return c(i);if(0===o.length){if(T(i)){var h=i.name?": "+i.name:"";return t.stylize("[Function"+h+"]","special")}if(g(i))return t.stylize(RegExp.prototype.toString.call(i),"regexp");if(w(i))return t.stylize(Date.prototype.toString.call(i),"date");if(S(i))return c(i)}var u,b="",x=!1,A=["{","}"];(f(i)&&(x=!0,A=["[","]"]),T(i))&&(b=" [Function"+(i.name?": "+i.name:"")+"]");return g(i)&&(b=" "+RegExp.prototype.toString.call(i)),w(i)&&(b=" "+Date.prototype.toUTCString.call(i)),S(i)&&(b=" "+c(i)),0!==o.length||x&&0!=i.length?n<0?g(i)?t.stylize(RegExp.prototype.toString.call(i),"regexp"):t.stylize("[Object]","special"):(t.seen.push(i),u=x?function(t,e,i,n,s){for(var r=[],o=0,a=e.length;o<a;++o)k(e,String(o))?r.push(p(t,e,i,n,String(o),!0)):r.push("");return s.forEach(function(s){s.match(/^\d+$/)||r.push(p(t,e,i,n,s,!0))}),r}(t,i,n,a,o):o.map(function(e){return p(t,i,n,a,e,x)}),t.seen.pop(),function(t,e,i){if(t.reduce(function(t,e){return 0,e.indexOf("\n")>=0&&0,t+e.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60)return i[0]+(""===e?"":e+"\n ")+" "+t.join(",\n ")+" "+i[1];return i[0]+e+" "+t.join(", ")+" "+i[1]}(u,b,A)):A[0]+b+A[1]}function c(t){return"["+Error.prototype.toString.call(t)+"]"}function p(t,e,i,n,s,r){var o,a,h;if((h=Object.getOwnPropertyDescriptor(e,s)||{value:e[s]}).get?a=h.set?t.stylize("[Getter/Setter]","special"):t.stylize("[Getter]","special"):h.set&&(a=t.stylize("[Setter]","special")),k(n,s)||(o="["+s+"]"),a||(t.seen.indexOf(h.value)<0?(a=y(i)?l(t,h.value,null):l(t,h.value,i-1)).indexOf("\n")>-1&&(a=r?a.split("\n").map(function(t){return" "+t}).join("\n").substr(2):"\n"+a.split("\n").map(function(t){return" "+t}).join("\n")):a=t.stylize("[Circular]","special")),_(o)){if(r&&s.match(/^\d+$/))return a;(o=JSON.stringify(""+s)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=t.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=t.stylize(o,"string"))}return o+": "+a}function f(t){return Array.isArray(t)}function d(t){return"boolean"==typeof t}function y(t){return null===t}function m(t){return"number"==typeof t}function v(t){return"string"==typeof t}function _(t){return void 0===t}function g(t){return b(t)&&"[object RegExp]"===x(t)}function b(t){return"object"==typeof t&&null!==t}function w(t){return b(t)&&"[object Date]"===x(t)}function S(t){return b(t)&&("[object Error]"===x(t)||t instanceof Error)}function T(t){return"function"==typeof t}function x(t){return Object.prototype.toString.call(t)}function A(t){return t<10?"0"+t.toString(10):t.toString(10)}e.debuglog=function(t){if(_(r)&&(r=n.env.NODE_DEBUG||""),t=t.toUpperCase(),!o[t])if(new RegExp("\\b"+t+"\\b","i").test(r)){var i=n.pid;o[t]=function(){var n=e.format.apply(e,arguments);console.error("%s %d: %s",t,i,n)}}else o[t]=function(){};return o[t]},e.inspect=a,a.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},a.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},e.isArray=f,e.isBoolean=d,e.isNull=y,e.isNullOrUndefined=function(t){return null==t},e.isNumber=m,e.isString=v,e.isSymbol=function(t){return"symbol"==typeof t},e.isUndefined=_,e.isRegExp=g,e.isObject=b,e.isDate=w,e.isError=S,e.isFunction=T,e.isPrimitive=function(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"==typeof t||void 0===t},e.isBuffer=i(157);var E=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function k(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.log=function(){console.log("%s - %s",function(){var t=new Date,e=[A(t.getHours()),A(t.getMinutes()),A(t.getSeconds())].join(":");return[t.getDate(),E[t.getMonth()],e].join(" ")}(),e.format.apply(e,arguments))},e.inherits=i(12),e._extend=function(t,e){if(!e||!b(e))return t;for(var i=Object.keys(e),n=i.length;n--;)t[i[n]]=e[i[n]];return t}}).call(e,i(17),i(11))},function(t,e){t.exports=function(t){return t&&"object"==typeof t&&"function"==typeof t.copy&&"function"==typeof t.fill&&"function"==typeof t.readUInt8}}]);
\ No newline at end of file |
