@asgardeo/auth-spa 0.2.15 → 0.2.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/asgardeo-spa.production.esm.js +13 -13
  2. package/dist/asgardeo-spa.production.esm.js.map +1 -1
  3. package/dist/asgardeo-spa.production.js +13 -13
  4. package/dist/asgardeo-spa.production.js.map +1 -1
  5. package/dist/asgardeo-spa.production.min.js +1 -1
  6. package/dist/asgardeo-spa.production.min.js.map +1 -1
  7. package/dist/polyfilled/asgardeo-spa.production.esm.js +35 -35
  8. package/dist/polyfilled/asgardeo-spa.production.esm.js.map +1 -1
  9. package/dist/polyfilled/asgardeo-spa.production.js +35 -35
  10. package/dist/polyfilled/asgardeo-spa.production.js.map +1 -1
  11. package/dist/polyfilled/asgardeo-spa.production.min.js +1 -1
  12. package/dist/polyfilled/asgardeo-spa.production.min.js.map +1 -1
  13. package/dist/src/clients/main-thread-client.d.ts.map +1 -1
  14. package/dist/src/clients/main-thread-client.js +24 -17
  15. package/dist/src/clients/main-thread-client.js.map +1 -1
  16. package/dist/src/clients/web-worker-client.d.ts.map +1 -1
  17. package/dist/src/clients/web-worker-client.js +5 -1
  18. package/dist/src/clients/web-worker-client.js.map +1 -1
  19. package/dist/src/models/request-custom-grant.d.ts +25 -0
  20. package/dist/src/models/request-custom-grant.d.ts.map +1 -0
  21. package/dist/src/models/request-custom-grant.js +19 -0
  22. package/dist/src/models/request-custom-grant.js.map +1 -0
  23. package/dist/src/worker/worker-core.d.ts.map +1 -1
  24. package/dist/src/worker/worker-core.js +11 -13
  25. package/dist/src/worker/worker-core.js.map +1 -1
  26. package/dist/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +2 -2
  28. package/src/clients/main-thread-client.ts +28 -19
  29. package/src/clients/web-worker-client.ts +8 -2
  30. package/src/models/request-custom-grant.ts +26 -0
  31. package/src/worker/worker-core.ts +12 -15
@@ -12,7 +12,7 @@
12
12
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
13
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
14
  PERFORMANCE OF THIS SOFTWARE.
15
- ***************************************************************************** */function e(t,e,i,l){return new(i||(i=Promise))((function(n,o){function d(t){try{a(l.next(t))}catch(t){o(t)}}function c(t){try{a(l.throw(t))}catch(t){o(t)}}function a(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(d,c)}a((l=l.apply(t,e||[])).next())}))}var i="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},l=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,d=!1;function c(){d=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0,i=t.length;e<i;++e)l[e]=t[e],n[t.charCodeAt(e)]=e;n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63}function a(t,e,i){for(var n,o,d=[],c=e;c<i;c+=3)n=(t[c]<<16)+(t[c+1]<<8)+t[c+2],d.push(l[(o=n)>>18&63]+l[o>>12&63]+l[o>>6&63]+l[63&o]);return d.join("")}function s(t){var e;d||c();for(var i=t.length,n=i%3,o="",s=[],Z=16383,r=0,u=i-n;r<u;r+=Z)s.push(a(t,r,r+Z>u?u:r+Z));return 1===n?(e=t[i-1],o+=l[e>>2],o+=l[e<<4&63],o+="=="):2===n&&(e=(t[i-2]<<8)+t[i-1],o+=l[e>>10],o+=l[e>>4&63],o+=l[e<<2&63],o+="="),s.push(o),s.join("")}function Z(t,e,i,l,n){var o,d,c=8*n-l-1,a=(1<<c)-1,s=a>>1,Z=-7,r=i?n-1:0,u=i?-1:1,m=t[e+r];for(r+=u,o=m&(1<<-Z)-1,m>>=-Z,Z+=c;Z>0;o=256*o+t[e+r],r+=u,Z-=8);for(d=o&(1<<-Z)-1,o>>=-Z,Z+=l;Z>0;d=256*d+t[e+r],r+=u,Z-=8);if(0===o)o=1-s;else{if(o===a)return d?NaN:1/0*(m?-1:1);d+=Math.pow(2,l),o-=s}return(m?-1:1)*d*Math.pow(2,o-l)}function r(t,e,i,l,n,o){var d,c,a,s=8*o-n-1,Z=(1<<s)-1,r=Z>>1,u=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,m=l?0:o-1,h=l?1:-1,b=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(c=isNaN(e)?1:0,d=Z):(d=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-d))<1&&(d--,a*=2),(e+=d+r>=1?u/a:u*Math.pow(2,1-r))*a>=2&&(d++,a/=2),d+r>=Z?(c=0,d=Z):d+r>=1?(c=(e*a-1)*Math.pow(2,n),d+=r):(c=e*Math.pow(2,r-1)*Math.pow(2,n),d=0));n>=8;t[i+m]=255&c,m+=h,c/=256,n-=8);for(d=d<<n|c,s+=n;s>0;t[i+m]=255&d,m+=h,d/=256,s-=8);t[i+m-h]|=128*b}var u={}.toString,m=Array.isArray||function(t){return"[object Array]"==u.call(t)};function h(){return I.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function b(t,e){if(h()<e)throw new RangeError("Invalid typed array length");return I.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=I.prototype:(null===t&&(t=new I(e)),t.length=e),t}function I(t,e,i){if(!(I.TYPED_ARRAY_SUPPORT||this instanceof I))return new I(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 y(this,t)}return G(this,t,e,i)}function G(t,e,i,l){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,l){if(e.byteLength,i<0||e.byteLength<i)throw new RangeError("'offset' is out of bounds");if(e.byteLength<i+(l||0))throw new RangeError("'length' is out of bounds");e=void 0===i&&void 0===l?new Uint8Array(e):void 0===l?new Uint8Array(e,i):new Uint8Array(e,i,l);I.TYPED_ARRAY_SUPPORT?(t=e).__proto__=I.prototype:t=X(t,e);return t}(t,e,i,l):"string"==typeof e?function(t,e,i){"string"==typeof i&&""!==i||(i="utf8");if(!I.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var l=0|V(e,i),n=(t=b(t,l)).write(e,i);n!==l&&(t=t.slice(0,n));return t}(t,e,i):function(t,e){if(W(e)){var i=0|g(e.length);return 0===(t=b(t,i)).length||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||(l=e.length)!=l?b(t,0):X(t,e);if("Buffer"===e.type&&m(e.data))return X(t,e.data)}var l;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function p(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 y(t,e){if(p(e),t=b(t,e<0?0:0|g(e)),!I.TYPED_ARRAY_SUPPORT)for(var i=0;i<e;++i)t[i]=0;return t}function X(t,e){var i=e.length<0?0:0|g(e.length);t=b(t,i);for(var l=0;l<i;l+=1)t[l]=255&e[l];return t}function g(t){if(t>=h())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+h().toString(16)+" bytes");return 0|t}function W(t){return!(null==t||!t._isBuffer)}function V(t,e){if(W(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 l=!1;;)switch(e){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return O(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return _(t).length;default:if(l)return O(t).length;e=(""+e).toLowerCase(),l=!0}}function C(t,e,i){var l=!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 x(this,e,i);case"utf8":case"utf-8":return U(this,e,i);case"ascii":return k(this,e,i);case"latin1":case"binary":return B(this,e,i);case"base64":return L(this,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return w(this,e,i);default:if(l)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),l=!0}}function R(t,e,i){var l=t[e];t[e]=t[i],t[i]=l}function S(t,e,i,l,n){if(0===t.length)return-1;if("string"==typeof i?(l=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=n?0:t.length-1),i<0&&(i=t.length+i),i>=t.length){if(n)return-1;i=t.length-1}else if(i<0){if(!n)return-1;i=0}if("string"==typeof e&&(e=I.from(e,l)),W(e))return 0===e.length?-1:K(t,e,i,l,n);if("number"==typeof e)return e&=255,I.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(t,e,i):Uint8Array.prototype.lastIndexOf.call(t,e,i):K(t,[e],i,l,n);throw new TypeError("val must be string, number or Buffer")}function K(t,e,i,l,n){var o,d=1,c=t.length,a=e.length;if(void 0!==l&&("ucs2"===(l=String(l).toLowerCase())||"ucs-2"===l||"utf16le"===l||"utf-16le"===l)){if(t.length<2||e.length<2)return-1;d=2,c/=2,a/=2,i/=2}function s(t,e){return 1===d?t[e]:t.readUInt16BE(e*d)}if(n){var Z=-1;for(o=i;o<c;o++)if(s(t,o)===s(e,-1===Z?0:o-Z)){if(-1===Z&&(Z=o),o-Z+1===a)return Z*d}else-1!==Z&&(o-=o-Z),Z=-1}else for(i+a>c&&(i=c-a),o=i;o>=0;o--){for(var r=!0,u=0;u<a;u++)if(s(t,o+u)!==s(e,u)){r=!1;break}if(r)return o}return-1}function Y(t,e,i,l){i=Number(i)||0;var n=t.length-i;l?(l=Number(l))>n&&(l=n):l=n;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");l>o/2&&(l=o/2);for(var d=0;d<l;++d){var c=parseInt(e.substr(2*d,2),16);if(isNaN(c))return d;t[i+d]=c}return d}function v(t,e,i,l){return q(O(e,t.length-i),t,i,l)}function J(t,e,i,l){return q(function(t){for(var e=[],i=0;i<t.length;++i)e.push(255&t.charCodeAt(i));return e}(e),t,i,l)}function f(t,e,i,l){return J(t,e,i,l)}function N(t,e,i,l){return q(_(e),t,i,l)}function H(t,e,i,l){return q(function(t,e){for(var i,l,n,o=[],d=0;d<t.length&&!((e-=2)<0);++d)l=(i=t.charCodeAt(d))>>8,n=i%256,o.push(n),o.push(l);return o}(e,t.length-i),t,i,l)}function L(t,e,i){return 0===e&&i===t.length?s(t):s(t.slice(e,i))}function U(t,e,i){i=Math.min(t.length,i);for(var l=[],n=e;n<i;){var o,d,c,a,s=t[n],Z=null,r=s>239?4:s>223?3:s>191?2:1;if(n+r<=i)switch(r){case 1:s<128&&(Z=s);break;case 2:128==(192&(o=t[n+1]))&&(a=(31&s)<<6|63&o)>127&&(Z=a);break;case 3:o=t[n+1],d=t[n+2],128==(192&o)&&128==(192&d)&&(a=(15&s)<<12|(63&o)<<6|63&d)>2047&&(a<55296||a>57343)&&(Z=a);break;case 4:o=t[n+1],d=t[n+2],c=t[n+3],128==(192&o)&&128==(192&d)&&128==(192&c)&&(a=(15&s)<<18|(63&o)<<12|(63&d)<<6|63&c)>65535&&a<1114112&&(Z=a)}null===Z?(Z=65533,r=1):Z>65535&&(Z-=65536,l.push(Z>>>10&1023|55296),Z=56320|1023&Z),l.push(Z),n+=r}return function(t){var e=t.length;if(e<=T)return String.fromCharCode.apply(String,t);var i="",l=0;for(;l<e;)i+=String.fromCharCode.apply(String,t.slice(l,l+=T));return i}(l)}I.TYPED_ARRAY_SUPPORT=void 0===i.TYPED_ARRAY_SUPPORT||i.TYPED_ARRAY_SUPPORT,I.poolSize=8192,I._augment=function(t){return t.__proto__=I.prototype,t},I.from=function(t,e,i){return G(null,t,e,i)},I.TYPED_ARRAY_SUPPORT&&(I.prototype.__proto__=Uint8Array.prototype,I.__proto__=Uint8Array),I.alloc=function(t,e,i){return function(t,e,i,l){return p(e),e<=0?b(t,e):void 0!==i?"string"==typeof l?b(t,e).fill(i,l):b(t,e).fill(i):b(t,e)}(null,t,e,i)},I.allocUnsafe=function(t){return y(null,t)},I.allocUnsafeSlow=function(t){return y(null,t)},I.isBuffer=function(t){return null!=t&&(!!t._isBuffer||$(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&$(t.slice(0,0))}(t))},I.compare=function(t,e){if(!W(t)||!W(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var i=t.length,l=e.length,n=0,o=Math.min(i,l);n<o;++n)if(t[n]!==e[n]){i=t[n],l=e[n];break}return i<l?-1:l<i?1:0},I.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}},I.concat=function(t,e){if(!m(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return I.alloc(0);var i;if(void 0===e)for(e=0,i=0;i<t.length;++i)e+=t[i].length;var l=I.allocUnsafe(e),n=0;for(i=0;i<t.length;++i){var o=t[i];if(!W(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(l,n),n+=o.length}return l},I.byteLength=V,I.prototype._isBuffer=!0,I.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)R(this,e,e+1);return this},I.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)R(this,e,e+3),R(this,e+1,e+2);return this},I.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)R(this,e,e+7),R(this,e+1,e+6),R(this,e+2,e+5),R(this,e+3,e+4);return this},I.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?U(this,0,t):C.apply(this,arguments)},I.prototype.equals=function(t){if(!W(t))throw new TypeError("Argument must be a Buffer");return this===t||0===I.compare(this,t)},I.prototype.inspect=function(){var t="";return this.length>0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),"<Buffer "+t+">"},I.prototype.compare=function(t,e,i,l,n){if(!W(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===l&&(l=0),void 0===n&&(n=this.length),e<0||i>t.length||l<0||n>this.length)throw new RangeError("out of range index");if(l>=n&&e>=i)return 0;if(l>=n)return-1;if(e>=i)return 1;if(this===t)return 0;for(var o=(n>>>=0)-(l>>>=0),d=(i>>>=0)-(e>>>=0),c=Math.min(o,d),a=this.slice(l,n),s=t.slice(e,i),Z=0;Z<c;++Z)if(a[Z]!==s[Z]){o=a[Z],d=s[Z];break}return o<d?-1:d<o?1:0},I.prototype.includes=function(t,e,i){return-1!==this.indexOf(t,e,i)},I.prototype.indexOf=function(t,e,i){return S(this,t,e,i,!0)},I.prototype.lastIndexOf=function(t,e,i){return S(this,t,e,i,!1)},I.prototype.write=function(t,e,i,l){if(void 0===e)l="utf8",i=this.length,e=0;else if(void 0===i&&"string"==typeof e)l=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===l&&(l="utf8")):(l=i,i=void 0)}var n=this.length-e;if((void 0===i||i>n)&&(i=n),t.length>0&&(i<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");l||(l="utf8");for(var o=!1;;)switch(l){case"hex":return Y(this,t,e,i);case"utf8":case"utf-8":return v(this,t,e,i);case"ascii":return J(this,t,e,i);case"latin1":case"binary":return f(this,t,e,i);case"base64":return N(this,t,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return H(this,t,e,i);default:if(o)throw new TypeError("Unknown encoding: "+l);l=(""+l).toLowerCase(),o=!0}},I.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var T=4096;function k(t,e,i){var l="";i=Math.min(t.length,i);for(var n=e;n<i;++n)l+=String.fromCharCode(127&t[n]);return l}function B(t,e,i){var l="";i=Math.min(t.length,i);for(var n=e;n<i;++n)l+=String.fromCharCode(t[n]);return l}function x(t,e,i){var l=t.length;(!e||e<0)&&(e=0),(!i||i<0||i>l)&&(i=l);for(var n="",o=e;o<i;++o)n+=D(t[o]);return n}function w(t,e,i){for(var l=t.slice(e,i),n="",o=0;o<l.length;o+=2)n+=String.fromCharCode(l[o]+256*l[o+1]);return n}function F(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 z(t,e,i,l,n,o){if(!W(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>n||e<o)throw new RangeError('"value" argument is out of bounds');if(i+l>t.length)throw new RangeError("Index out of range")}function P(t,e,i,l){e<0&&(e=65535+e+1);for(var n=0,o=Math.min(t.length-i,2);n<o;++n)t[i+n]=(e&255<<8*(l?n:1-n))>>>8*(l?n:1-n)}function A(t,e,i,l){e<0&&(e=4294967295+e+1);for(var n=0,o=Math.min(t.length-i,4);n<o;++n)t[i+n]=e>>>8*(l?n:3-n)&255}function M(t,e,i,l,n,o){if(i+l>t.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function Q(t,e,i,l,n){return n||M(t,0,i,4),r(t,e,i,l,23,4),i+4}function j(t,e,i,l,n){return n||M(t,0,i,8),r(t,e,i,l,52,8),i+8}I.prototype.slice=function(t,e){var i,l=this.length;if((t=~~t)<0?(t+=l)<0&&(t=0):t>l&&(t=l),(e=void 0===e?l:~~e)<0?(e+=l)<0&&(e=0):e>l&&(e=l),e<t&&(e=t),I.TYPED_ARRAY_SUPPORT)(i=this.subarray(t,e)).__proto__=I.prototype;else{var n=e-t;i=new I(n,void 0);for(var o=0;o<n;++o)i[o]=this[o+t]}return i},I.prototype.readUIntLE=function(t,e,i){t|=0,e|=0,i||F(t,e,this.length);for(var l=this[t],n=1,o=0;++o<e&&(n*=256);)l+=this[t+o]*n;return l},I.prototype.readUIntBE=function(t,e,i){t|=0,e|=0,i||F(t,e,this.length);for(var l=this[t+--e],n=1;e>0&&(n*=256);)l+=this[t+--e]*n;return l},I.prototype.readUInt8=function(t,e){return e||F(t,1,this.length),this[t]},I.prototype.readUInt16LE=function(t,e){return e||F(t,2,this.length),this[t]|this[t+1]<<8},I.prototype.readUInt16BE=function(t,e){return e||F(t,2,this.length),this[t]<<8|this[t+1]},I.prototype.readUInt32LE=function(t,e){return e||F(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},I.prototype.readUInt32BE=function(t,e){return e||F(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},I.prototype.readIntLE=function(t,e,i){t|=0,e|=0,i||F(t,e,this.length);for(var l=this[t],n=1,o=0;++o<e&&(n*=256);)l+=this[t+o]*n;return l>=(n*=128)&&(l-=Math.pow(2,8*e)),l},I.prototype.readIntBE=function(t,e,i){t|=0,e|=0,i||F(t,e,this.length);for(var l=e,n=1,o=this[t+--l];l>0&&(n*=256);)o+=this[t+--l]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*e)),o},I.prototype.readInt8=function(t,e){return e||F(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},I.prototype.readInt16LE=function(t,e){e||F(t,2,this.length);var i=this[t]|this[t+1]<<8;return 32768&i?4294901760|i:i},I.prototype.readInt16BE=function(t,e){e||F(t,2,this.length);var i=this[t+1]|this[t]<<8;return 32768&i?4294901760|i:i},I.prototype.readInt32LE=function(t,e){return e||F(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},I.prototype.readInt32BE=function(t,e){return e||F(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},I.prototype.readFloatLE=function(t,e){return e||F(t,4,this.length),Z(this,t,!0,23,4)},I.prototype.readFloatBE=function(t,e){return e||F(t,4,this.length),Z(this,t,!1,23,4)},I.prototype.readDoubleLE=function(t,e){return e||F(t,8,this.length),Z(this,t,!0,52,8)},I.prototype.readDoubleBE=function(t,e){return e||F(t,8,this.length),Z(this,t,!1,52,8)},I.prototype.writeUIntLE=function(t,e,i,l){(t=+t,e|=0,i|=0,l)||z(this,t,e,i,Math.pow(2,8*i)-1,0);var n=1,o=0;for(this[e]=255&t;++o<i&&(n*=256);)this[e+o]=t/n&255;return e+i},I.prototype.writeUIntBE=function(t,e,i,l){(t=+t,e|=0,i|=0,l)||z(this,t,e,i,Math.pow(2,8*i)-1,0);var n=i-1,o=1;for(this[e+n]=255&t;--n>=0&&(o*=256);)this[e+n]=t/o&255;return e+i},I.prototype.writeUInt8=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,1,255,0),I.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},I.prototype.writeUInt16LE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,2,65535,0),I.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):P(this,t,e,!0),e+2},I.prototype.writeUInt16BE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,2,65535,0),I.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):P(this,t,e,!1),e+2},I.prototype.writeUInt32LE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,4,4294967295,0),I.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):A(this,t,e,!0),e+4},I.prototype.writeUInt32BE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,4,4294967295,0),I.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):A(this,t,e,!1),e+4},I.prototype.writeIntLE=function(t,e,i,l){if(t=+t,e|=0,!l){var n=Math.pow(2,8*i-1);z(this,t,e,i,n-1,-n)}var o=0,d=1,c=0;for(this[e]=255&t;++o<i&&(d*=256);)t<0&&0===c&&0!==this[e+o-1]&&(c=1),this[e+o]=(t/d>>0)-c&255;return e+i},I.prototype.writeIntBE=function(t,e,i,l){if(t=+t,e|=0,!l){var n=Math.pow(2,8*i-1);z(this,t,e,i,n-1,-n)}var o=i-1,d=1,c=0;for(this[e+o]=255&t;--o>=0&&(d*=256);)t<0&&0===c&&0!==this[e+o+1]&&(c=1),this[e+o]=(t/d>>0)-c&255;return e+i},I.prototype.writeInt8=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,1,127,-128),I.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},I.prototype.writeInt16LE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,2,32767,-32768),I.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):P(this,t,e,!0),e+2},I.prototype.writeInt16BE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,2,32767,-32768),I.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):P(this,t,e,!1),e+2},I.prototype.writeInt32LE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,4,2147483647,-2147483648),I.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):A(this,t,e,!0),e+4},I.prototype.writeInt32BE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),I.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):A(this,t,e,!1),e+4},I.prototype.writeFloatLE=function(t,e,i){return Q(this,t,e,!0,i)},I.prototype.writeFloatBE=function(t,e,i){return Q(this,t,e,!1,i)},I.prototype.writeDoubleLE=function(t,e,i){return j(this,t,e,!0,i)},I.prototype.writeDoubleBE=function(t,e,i){return j(this,t,e,!1,i)},I.prototype.copy=function(t,e,i,l){if(i||(i=0),l||0===l||(l=this.length),e>=t.length&&(e=t.length),e||(e=0),l>0&&l<i&&(l=i),l===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(l<0)throw new RangeError("sourceEnd out of bounds");l>this.length&&(l=this.length),t.length-e<l-i&&(l=t.length-e+i);var n,o=l-i;if(this===t&&i<e&&e<l)for(n=o-1;n>=0;--n)t[n+e]=this[n+i];else if(o<1e3||!I.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)t[n+e]=this[n+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+o),e);return o},I.prototype.fill=function(t,e,i,l){if("string"==typeof t){if("string"==typeof e?(l=e,e=0,i=this.length):"string"==typeof i&&(l=i,i=this.length),1===t.length){var n=t.charCodeAt(0);n<256&&(t=n)}if(void 0!==l&&"string"!=typeof l)throw new TypeError("encoding must be a string");if("string"==typeof l&&!I.isEncoding(l))throw new TypeError("Unknown encoding: "+l)}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 o;if(e>>>=0,i=void 0===i?this.length:i>>>0,t||(t=0),"number"==typeof t)for(o=e;o<i;++o)this[o]=t;else{var d=W(t)?t:O(new I(t,l).toString()),c=d.length;for(o=0;o<i-e;++o)this[o+e]=d[o%c]}return this};var E=/[^+\/0-9A-Za-z-_]/g;function D(t){return t<16?"0"+t.toString(16):t.toString(16)}function O(t,e){var i;e=e||1/0;for(var l=t.length,n=null,o=[],d=0;d<l;++d){if((i=t.charCodeAt(d))>55295&&i<57344){if(!n){if(i>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(d+1===l){(e-=3)>-1&&o.push(239,191,189);continue}n=i;continue}if(i<56320){(e-=3)>-1&&o.push(239,191,189),n=i;continue}i=65536+(n-55296<<10|i-56320)}else n&&(e-=3)>-1&&o.push(239,191,189);if(n=null,i<128){if((e-=1)<0)break;o.push(i)}else if(i<2048){if((e-=2)<0)break;o.push(i>>6|192,63&i|128)}else if(i<65536){if((e-=3)<0)break;o.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;o.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return o}function _(t){return function(t){var e,i,l,a,s,Z;d||c();var r=t.length;if(r%4>0)throw new Error("Invalid string. Length must be a multiple of 4");s="="===t[r-2]?2:"="===t[r-1]?1:0,Z=new o(3*r/4-s),l=s>0?r-4:r;var u=0;for(e=0,i=0;e<l;e+=4,i+=3)a=n[t.charCodeAt(e)]<<18|n[t.charCodeAt(e+1)]<<12|n[t.charCodeAt(e+2)]<<6|n[t.charCodeAt(e+3)],Z[u++]=a>>16&255,Z[u++]=a>>8&255,Z[u++]=255&a;return 2===s?(a=n[t.charCodeAt(e)]<<2|n[t.charCodeAt(e+1)]>>4,Z[u++]=255&a):1===s&&(a=n[t.charCodeAt(e)]<<10|n[t.charCodeAt(e+1)]<<4|n[t.charCodeAt(e+2)]>>2,Z[u++]=a>>8&255,Z[u++]=255&a),Z}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(E,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function q(t,e,i,l){for(var n=0;n<l&&!(n+i>=e.length||n>=t.length);++n)e[n+i]=t[n];return n}function $(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var tt=function(t,e){return function(){for(var i=new Array(arguments.length),l=0;l<i.length;l++)i[l]=arguments[l];return t.apply(e,i)}},et=Object.prototype.toString;function it(t){return"[object Array]"===et.call(t)}function lt(t){return void 0===t}function nt(t){return null!==t&&"object"==typeof t}function ot(t){if("[object Object]"!==et.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype}function dt(t){return"[object Function]"===et.call(t)}function ct(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),it(t))for(var i=0,l=t.length;i<l;i++)e.call(null,t[i],i,t);else for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&e.call(null,t[n],n,t)}var at={isArray:it,isArrayBuffer:function(t){return"[object ArrayBuffer]"===et.call(t)},isBuffer:function(t){return null!==t&&!lt(t)&&null!==t.constructor&&!lt(t.constructor)&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)},isFormData:function(t){return"undefined"!=typeof FormData&&t instanceof FormData},isArrayBufferView:function(t){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer&&t.buffer instanceof ArrayBuffer},isString:function(t){return"string"==typeof t},isNumber:function(t){return"number"==typeof t},isObject:nt,isPlainObject:ot,isUndefined:lt,isDate:function(t){return"[object Date]"===et.call(t)},isFile:function(t){return"[object File]"===et.call(t)},isBlob:function(t){return"[object Blob]"===et.call(t)},isFunction:dt,isStream:function(t){return nt(t)&&dt(t.pipe)},isURLSearchParams:function(t){return"undefined"!=typeof URLSearchParams&&t instanceof URLSearchParams},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:ct,merge:function t(){var e={};function i(i,l){ot(e[l])&&ot(i)?e[l]=t(e[l],i):ot(i)?e[l]=t({},i):it(i)?e[l]=i.slice():e[l]=i}for(var l=0,n=arguments.length;l<n;l++)ct(arguments[l],i);return e},extend:function(t,e,i){return ct(e,(function(e,l){t[l]=i&&"function"==typeof e?tt(e,i):e})),t},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},stripBOM:function(t){return 65279===t.charCodeAt(0)&&(t=t.slice(1)),t}};function st(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var Zt=function(t,e,i){if(!e)return t;var l;if(i)l=i(e);else if(at.isURLSearchParams(e))l=e.toString();else{var n=[];at.forEach(e,(function(t,e){null!=t&&(at.isArray(t)?e+="[]":t=[t],at.forEach(t,(function(t){at.isDate(t)?t=t.toISOString():at.isObject(t)&&(t=JSON.stringify(t)),n.push(st(e)+"="+st(t))})))})),l=n.join("&")}if(l){var o=t.indexOf("#");-1!==o&&(t=t.slice(0,o)),t+=(-1===t.indexOf("?")?"?":"&")+l}return t};function rt(){this.handlers=[]}rt.prototype.use=function(t,e,i){return this.handlers.push({fulfilled:t,rejected:e,synchronous:!!i&&i.synchronous,runWhen:i?i.runWhen:null}),this.handlers.length-1},rt.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},rt.prototype.forEach=function(t){at.forEach(this.handlers,(function(e){null!==e&&t(e)}))};var ut=rt;function mt(){throw new Error("setTimeout has not been defined")}function ht(){throw new Error("clearTimeout has not been defined")}var bt=mt,It=ht;function Gt(t){if(bt===setTimeout)return setTimeout(t,0);if((bt===mt||!bt)&&setTimeout)return bt=setTimeout,setTimeout(t,0);try{return bt(t,0)}catch(e){try{return bt.call(null,t,0)}catch(e){return bt.call(this,t,0)}}}"function"==typeof i.setTimeout&&(bt=setTimeout),"function"==typeof i.clearTimeout&&(It=clearTimeout);var pt,yt=[],Xt=!1,gt=-1;function Wt(){Xt&&pt&&(Xt=!1,pt.length?yt=pt.concat(yt):gt=-1,yt.length&&Vt())}function Vt(){if(!Xt){var t=Gt(Wt);Xt=!0;for(var e=yt.length;e;){for(pt=yt,yt=[];++gt<e;)pt&&pt[gt].run();gt=-1,e=yt.length}pt=null,Xt=!1,function(t){if(It===clearTimeout)return clearTimeout(t);if((It===ht||!It)&&clearTimeout)return It=clearTimeout,clearTimeout(t);try{It(t)}catch(e){try{return It.call(null,t)}catch(e){return It.call(this,t)}}}(t)}}function Ct(t,e){this.fun=t,this.array=e}Ct.prototype.run=function(){this.fun.apply(null,this.array)};function Rt(){}var St=Rt,Kt=Rt,Yt=Rt,vt=Rt,Jt=Rt,ft=Rt,Nt=Rt;var Ht=i.performance||{},Lt=Ht.now||Ht.mozNow||Ht.msNow||Ht.oNow||Ht.webkitNow||function(){return(new Date).getTime()};var Ut=new Date;var Tt={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];yt.push(new Ct(t,e)),1!==yt.length||Xt||Gt(Vt)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:St,addListener:Kt,once:Yt,off:vt,removeListener:Jt,removeAllListeners:ft,emit:Nt,binding:function(t){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(t){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(t){var e=.001*Lt.call(Ht),i=Math.floor(e),l=Math.floor(e%1*1e9);return t&&(i-=t[0],(l-=t[1])<0&&(i--,l+=1e9)),[i,l]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-Ut)/1e3}},kt=Tt,Bt=function(t,e){at.forEach(t,(function(i,l){l!==e&&l.toUpperCase()===e.toUpperCase()&&(t[e]=i,delete t[l])}))},xt=function(t,e,i,l,n){return t.config=e,i&&(t.code=i),t.request=l,t.response=n,t.isAxiosError=!0,t.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},t},wt=function(t,e,i,l,n){var o=new Error(t);return xt(o,e,i,l,n)},Ft=at.isStandardBrowserEnv()?{write:function(t,e,i,l,n,o){var d=[];d.push(t+"="+encodeURIComponent(e)),at.isNumber(i)&&d.push("expires="+new Date(i).toGMTString()),at.isString(l)&&d.push("path="+l),at.isString(n)&&d.push("domain="+n),!0===o&&d.push("secure"),document.cookie=d.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},zt=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],Pt=at.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),i=document.createElement("a");function l(t){var l=t;return e&&(i.setAttribute("href",l),l=i.href),i.setAttribute("href",l),{href:i.href,protocol:i.protocol?i.protocol.replace(/:$/,""):"",host:i.host,search:i.search?i.search.replace(/^\?/,""):"",hash:i.hash?i.hash.replace(/^#/,""):"",hostname:i.hostname,port:i.port,pathname:"/"===i.pathname.charAt(0)?i.pathname:"/"+i.pathname}}return t=l(window.location.href),function(e){var i=at.isString(e)?l(e):e;return i.protocol===t.protocol&&i.host===t.host}}():function(){return!0},At=function(t){return new Promise((function(e,i){var l=t.data,n=t.headers,o=t.responseType;at.isFormData(l)&&delete n["Content-Type"];var d=new XMLHttpRequest;if(t.auth){var c=t.auth.username||"",a=t.auth.password?unescape(encodeURIComponent(t.auth.password)):"";n.Authorization="Basic "+btoa(c+":"+a)}var s,Z,r=(s=t.baseURL,Z=t.url,s&&!/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(Z)?function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}(s,Z):Z);function u(){if(d){var l="getAllResponseHeaders"in d?function(t){var e,i,l,n={};return t?(at.forEach(t.split("\n"),(function(t){if(l=t.indexOf(":"),e=at.trim(t.substr(0,l)).toLowerCase(),i=at.trim(t.substr(l+1)),e){if(n[e]&&zt.indexOf(e)>=0)return;n[e]="set-cookie"===e?(n[e]?n[e]:[]).concat([i]):n[e]?n[e]+", "+i:i}})),n):n}(d.getAllResponseHeaders()):null,n={data:o&&"text"!==o&&"json"!==o?d.response:d.responseText,status:d.status,statusText:d.statusText,headers:l,config:t,request:d};!function(t,e,i){var l=i.config.validateStatus;i.status&&l&&!l(i.status)?e(wt("Request failed with status code "+i.status,i.config,null,i.request,i)):t(i)}(e,i,n),d=null}}if(d.open(t.method.toUpperCase(),Zt(r,t.params,t.paramsSerializer),!0),d.timeout=t.timeout,"onloadend"in d?d.onloadend=u:d.onreadystatechange=function(){d&&4===d.readyState&&(0!==d.status||d.responseURL&&0===d.responseURL.indexOf("file:"))&&setTimeout(u)},d.onabort=function(){d&&(i(wt("Request aborted",t,"ECONNABORTED",d)),d=null)},d.onerror=function(){i(wt("Network Error",t,null,d)),d=null},d.ontimeout=function(){var e="timeout of "+t.timeout+"ms exceeded";t.timeoutErrorMessage&&(e=t.timeoutErrorMessage),i(wt(e,t,t.transitional&&t.transitional.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",d)),d=null},at.isStandardBrowserEnv()){var m=(t.withCredentials||Pt(r))&&t.xsrfCookieName?Ft.read(t.xsrfCookieName):void 0;m&&(n[t.xsrfHeaderName]=m)}"setRequestHeader"in d&&at.forEach(n,(function(t,e){void 0===l&&"content-type"===e.toLowerCase()?delete n[e]:d.setRequestHeader(e,t)})),at.isUndefined(t.withCredentials)||(d.withCredentials=!!t.withCredentials),o&&"json"!==o&&(d.responseType=t.responseType),"function"==typeof t.onDownloadProgress&&d.addEventListener("progress",t.onDownloadProgress),"function"==typeof t.onUploadProgress&&d.upload&&d.upload.addEventListener("progress",t.onUploadProgress),t.cancelToken&&t.cancelToken.promise.then((function(t){d&&(d.abort(),i(t),d=null)})),l||(l=null),d.send(l)}))},Mt={"Content-Type":"application/x-www-form-urlencoded"};function Qt(t,e){!at.isUndefined(t)&&at.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var jt,Et={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==kt&&"[object process]"===Object.prototype.toString.call(kt))&&(jt=At),jt),transformRequest:[function(t,e){return Bt(e,"Accept"),Bt(e,"Content-Type"),at.isFormData(t)||at.isArrayBuffer(t)||at.isBuffer(t)||at.isStream(t)||at.isFile(t)||at.isBlob(t)?t:at.isArrayBufferView(t)?t.buffer:at.isURLSearchParams(t)?(Qt(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):at.isObject(t)||e&&"application/json"===e["Content-Type"]?(Qt(e,"application/json"),function(t,e,i){if(at.isString(t))try{return(e||JSON.parse)(t),at.trim(t)}catch(t){if("SyntaxError"!==t.name)throw t}return(i||JSON.stringify)(t)}(t)):t}],transformResponse:[function(t){var e=this.transitional,i=e&&e.silentJSONParsing,l=e&&e.forcedJSONParsing,n=!i&&"json"===this.responseType;if(n||l&&at.isString(t)&&t.length)try{return JSON.parse(t)}catch(t){if(n){if("SyntaxError"===t.name)throw xt(t,this,"E_JSON_PARSE");throw t}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(t){return t>=200&&t<300}};Et.headers={common:{Accept:"application/json, text/plain, */*"}},at.forEach(["delete","get","head"],(function(t){Et.headers[t]={}})),at.forEach(["post","put","patch"],(function(t){Et.headers[t]=at.merge(Mt)}));var Dt=Et,Ot=function(t,e,i){var l=this||Dt;return at.forEach(i,(function(i){t=i.call(l,t,e)})),t},_t=function(t){return!(!t||!t.__CANCEL__)};function qt(t){t.cancelToken&&t.cancelToken.throwIfRequested()}var $t=function(t){return qt(t),t.headers=t.headers||{},t.data=Ot.call(t,t.data,t.headers,t.transformRequest),t.headers=at.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),at.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||Dt.adapter)(t).then((function(e){return qt(t),e.data=Ot.call(t,e.data,e.headers,t.transformResponse),e}),(function(e){return _t(e)||(qt(t),e&&e.response&&(e.response.data=Ot.call(t,e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))},te=function(t,e){e=e||{};var i={},l=["url","method","data"],n=["headers","auth","proxy","params"],o=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],d=["validateStatus"];function c(t,e){return at.isPlainObject(t)&&at.isPlainObject(e)?at.merge(t,e):at.isPlainObject(e)?at.merge({},e):at.isArray(e)?e.slice():e}function a(l){at.isUndefined(e[l])?at.isUndefined(t[l])||(i[l]=c(void 0,t[l])):i[l]=c(t[l],e[l])}at.forEach(l,(function(t){at.isUndefined(e[t])||(i[t]=c(void 0,e[t]))})),at.forEach(n,a),at.forEach(o,(function(l){at.isUndefined(e[l])?at.isUndefined(t[l])||(i[l]=c(void 0,t[l])):i[l]=c(void 0,e[l])})),at.forEach(d,(function(l){l in e?i[l]=c(t[l],e[l]):l in t&&(i[l]=c(void 0,t[l]))}));var s=l.concat(n).concat(o).concat(d),Z=Object.keys(t).concat(Object.keys(e)).filter((function(t){return-1===s.indexOf(t)}));return at.forEach(Z,a),i},ee={name:"axios",version:"0.21.4",description:"Promise based HTTP client for the browser and node.js",main:"index.js",scripts:{test:"grunt test",start:"node ./sandbox/server.js",build:"NODE_ENV=production grunt build",preversion:"npm test",version:"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json",postversion:"git push && git push --tags",examples:"node ./examples/server.js",coveralls:"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",fix:"eslint --fix lib/**/*.js"},repository:{type:"git",url:"https://github.com/axios/axios.git"},keywords:["xhr","http","ajax","promise","node"],author:"Matt Zabriskie",license:"MIT",bugs:{url:"https://github.com/axios/axios/issues"},homepage:"https://axios-http.com",devDependencies:{coveralls:"^3.0.0","es6-promise":"^4.2.4",grunt:"^1.3.0","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^23.0.0","grunt-karma":"^4.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^4.0.2","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1",karma:"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-firefox-launcher":"^2.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^4.3.6","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.8","karma-webpack":"^4.0.2","load-grunt-tasks":"^3.5.2",minimist:"^1.2.0",mocha:"^8.2.1",sinon:"^4.5.0","terser-webpack-plugin":"^4.2.3",typescript:"^4.0.5","url-search-params":"^0.10.0",webpack:"^4.44.2","webpack-dev-server":"^3.11.0"},browser:{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},jsdelivr:"dist/axios.min.js",unpkg:"dist/axios.min.js",typings:"./index.d.ts",dependencies:{"follow-redirects":"^1.14.0"},bundlesize:[{path:"./dist/axios.min.js",threshold:"5kB"}]},ie={};["object","boolean","number","function","string","symbol"].forEach((function(t,e){ie[t]=function(i){return typeof i===t||"a"+(e<1?"n ":" ")+t}}));var le={},ne=ee.version.split(".");function oe(t,e){for(var i=e?e.split("."):ne,l=t.split("."),n=0;n<3;n++){if(i[n]>l[n])return!0;if(i[n]<l[n])return!1}return!1}ie.transitional=function(t,e,i){var l=e&&oe(e);function n(t,e){return"[Axios v"+ee.version+"] Transitional option '"+t+"'"+e+(i?". "+i:"")}return function(i,o,d){if(!1===t)throw new Error(n(o," has been removed in "+e));return l&&!le[o]&&(le[o]=!0,console.warn(n(o," has been deprecated since v"+e+" and will be removed in the near future"))),!t||t(i,o,d)}};var de={isOlderVersion:oe,assertOptions:function(t,e,i){if("object"!=typeof t)throw new TypeError("options must be an object");for(var l=Object.keys(t),n=l.length;n-- >0;){var o=l[n],d=e[o];if(d){var c=t[o],a=void 0===c||d(c,o,t);if(!0!==a)throw new TypeError("option "+o+" must be "+a)}else if(!0!==i)throw Error("Unknown option "+o)}},validators:ie},ce=de.validators;function ae(t){this.defaults=t,this.interceptors={request:new ut,response:new ut}}ae.prototype.request=function(t){"string"==typeof t?(t=arguments[1]||{}).url=arguments[0]:t=t||{},(t=te(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var e=t.transitional;void 0!==e&&de.assertOptions(e,{silentJSONParsing:ce.transitional(ce.boolean,"1.0.0"),forcedJSONParsing:ce.transitional(ce.boolean,"1.0.0"),clarifyTimeoutError:ce.transitional(ce.boolean,"1.0.0")},!1);var i=[],l=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(l=l&&e.synchronous,i.unshift(e.fulfilled,e.rejected))}));var n,o=[];if(this.interceptors.response.forEach((function(t){o.push(t.fulfilled,t.rejected)})),!l){var d=[$t,void 0];for(Array.prototype.unshift.apply(d,i),d=d.concat(o),n=Promise.resolve(t);d.length;)n=n.then(d.shift(),d.shift());return n}for(var c=t;i.length;){var a=i.shift(),s=i.shift();try{c=a(c)}catch(t){s(t);break}}try{n=$t(c)}catch(t){return Promise.reject(t)}for(;o.length;)n=n.then(o.shift(),o.shift());return n},ae.prototype.getUri=function(t){return t=te(this.defaults,t),Zt(t.url,t.params,t.paramsSerializer).replace(/^\?/,"")},at.forEach(["delete","get","head","options"],(function(t){ae.prototype[t]=function(e,i){return this.request(te(i||{},{method:t,url:e,data:(i||{}).data}))}})),at.forEach(["post","put","patch"],(function(t){ae.prototype[t]=function(e,i,l){return this.request(te(l||{},{method:t,url:e,data:i}))}}));var se=ae;function Ze(t){this.message=t}Ze.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},Ze.prototype.__CANCEL__=!0;var re=Ze;function ue(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var i=this;t((function(t){i.reason||(i.reason=new re(t),e(i.reason))}))}ue.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},ue.source=function(){var t,e=new ue((function(e){t=e}));return{token:e,cancel:t}};var me=ue;function he(t){var e=new se(t),i=tt(se.prototype.request,e);return at.extend(i,se.prototype,e),at.extend(i,e),i}var be=he(Dt);be.Axios=se,be.create=function(t){return he(te(be.defaults,t))},be.Cancel=re,be.CancelToken=me,be.isCancel=_t,be.all=function(t){return Promise.all(t)},be.spread=function(t){return function(e){return t.apply(null,e)}},be.isAxiosError=function(t){return"object"==typeof t&&!0===t.isAxiosError};var Ie=be,Ge=be;Ie.default=Ge;var pe,ye=Ie;
15
+ ***************************************************************************** */function e(t,e,i,l){return new(i||(i=Promise))((function(n,o){function d(t){try{a(l.next(t))}catch(t){o(t)}}function c(t){try{a(l.throw(t))}catch(t){o(t)}}function a(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(d,c)}a((l=l.apply(t,e||[])).next())}))}var i="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},l=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,d=!1;function c(){d=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0,i=t.length;e<i;++e)l[e]=t[e],n[t.charCodeAt(e)]=e;n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63}function a(t,e,i){for(var n,o,d=[],c=e;c<i;c+=3)n=(t[c]<<16)+(t[c+1]<<8)+t[c+2],d.push(l[(o=n)>>18&63]+l[o>>12&63]+l[o>>6&63]+l[63&o]);return d.join("")}function s(t){var e;d||c();for(var i=t.length,n=i%3,o="",s=[],r=16383,Z=0,u=i-n;Z<u;Z+=r)s.push(a(t,Z,Z+r>u?u:Z+r));return 1===n?(e=t[i-1],o+=l[e>>2],o+=l[e<<4&63],o+="=="):2===n&&(e=(t[i-2]<<8)+t[i-1],o+=l[e>>10],o+=l[e>>4&63],o+=l[e<<2&63],o+="="),s.push(o),s.join("")}function r(t,e,i,l,n){var o,d,c=8*n-l-1,a=(1<<c)-1,s=a>>1,r=-7,Z=i?n-1:0,u=i?-1:1,b=t[e+Z];for(Z+=u,o=b&(1<<-r)-1,b>>=-r,r+=c;r>0;o=256*o+t[e+Z],Z+=u,r-=8);for(d=o&(1<<-r)-1,o>>=-r,r+=l;r>0;d=256*d+t[e+Z],Z+=u,r-=8);if(0===o)o=1-s;else{if(o===a)return d?NaN:1/0*(b?-1:1);d+=Math.pow(2,l),o-=s}return(b?-1:1)*d*Math.pow(2,o-l)}function Z(t,e,i,l,n,o){var d,c,a,s=8*o-n-1,r=(1<<s)-1,Z=r>>1,u=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,b=l?0:o-1,h=l?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(c=isNaN(e)?1:0,d=r):(d=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-d))<1&&(d--,a*=2),(e+=d+Z>=1?u/a:u*Math.pow(2,1-Z))*a>=2&&(d++,a/=2),d+Z>=r?(c=0,d=r):d+Z>=1?(c=(e*a-1)*Math.pow(2,n),d+=Z):(c=e*Math.pow(2,Z-1)*Math.pow(2,n),d=0));n>=8;t[i+b]=255&c,b+=h,c/=256,n-=8);for(d=d<<n|c,s+=n;s>0;t[i+b]=255&d,b+=h,d/=256,s-=8);t[i+b-h]|=128*m}var u={}.toString,b=Array.isArray||function(t){return"[object Array]"==u.call(t)};function h(){return I.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function m(t,e){if(h()<e)throw new RangeError("Invalid typed array length");return I.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=I.prototype:(null===t&&(t=new I(e)),t.length=e),t}function I(t,e,i){if(!(I.TYPED_ARRAY_SUPPORT||this instanceof I))return new I(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 y(this,t)}return p(this,t,e,i)}function p(t,e,i,l){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,l){if(e.byteLength,i<0||e.byteLength<i)throw new RangeError("'offset' is out of bounds");if(e.byteLength<i+(l||0))throw new RangeError("'length' is out of bounds");e=void 0===i&&void 0===l?new Uint8Array(e):void 0===l?new Uint8Array(e,i):new Uint8Array(e,i,l);I.TYPED_ARRAY_SUPPORT?(t=e).__proto__=I.prototype:t=X(t,e);return t}(t,e,i,l):"string"==typeof e?function(t,e,i){"string"==typeof i&&""!==i||(i="utf8");if(!I.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var l=0|W(e,i),n=(t=m(t,l)).write(e,i);n!==l&&(t=t.slice(0,n));return t}(t,e,i):function(t,e){if(V(e)){var i=0|g(e.length);return 0===(t=m(t,i)).length||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||(l=e.length)!=l?m(t,0):X(t,e);if("Buffer"===e.type&&b(e.data))return X(t,e.data)}var l;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function G(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 y(t,e){if(G(e),t=m(t,e<0?0:0|g(e)),!I.TYPED_ARRAY_SUPPORT)for(var i=0;i<e;++i)t[i]=0;return t}function X(t,e){var i=e.length<0?0:0|g(e.length);t=m(t,i);for(var l=0;l<i;l+=1)t[l]=255&e[l];return t}function g(t){if(t>=h())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+h().toString(16)+" bytes");return 0|t}function V(t){return!(null==t||!t._isBuffer)}function W(t,e){if(V(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 l=!1;;)switch(e){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return O(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return _(t).length;default:if(l)return O(t).length;e=(""+e).toLowerCase(),l=!0}}function C(t,e,i){var l=!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 x(this,e,i);case"utf8":case"utf-8":return U(this,e,i);case"ascii":return k(this,e,i);case"latin1":case"binary":return B(this,e,i);case"base64":return H(this,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return w(this,e,i);default:if(l)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),l=!0}}function R(t,e,i){var l=t[e];t[e]=t[i],t[i]=l}function S(t,e,i,l,n){if(0===t.length)return-1;if("string"==typeof i?(l=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=n?0:t.length-1),i<0&&(i=t.length+i),i>=t.length){if(n)return-1;i=t.length-1}else if(i<0){if(!n)return-1;i=0}if("string"==typeof e&&(e=I.from(e,l)),V(e))return 0===e.length?-1:Y(t,e,i,l,n);if("number"==typeof e)return e&=255,I.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(t,e,i):Uint8Array.prototype.lastIndexOf.call(t,e,i):Y(t,[e],i,l,n);throw new TypeError("val must be string, number or Buffer")}function Y(t,e,i,l,n){var o,d=1,c=t.length,a=e.length;if(void 0!==l&&("ucs2"===(l=String(l).toLowerCase())||"ucs-2"===l||"utf16le"===l||"utf-16le"===l)){if(t.length<2||e.length<2)return-1;d=2,c/=2,a/=2,i/=2}function s(t,e){return 1===d?t[e]:t.readUInt16BE(e*d)}if(n){var r=-1;for(o=i;o<c;o++)if(s(t,o)===s(e,-1===r?0:o-r)){if(-1===r&&(r=o),o-r+1===a)return r*d}else-1!==r&&(o-=o-r),r=-1}else for(i+a>c&&(i=c-a),o=i;o>=0;o--){for(var Z=!0,u=0;u<a;u++)if(s(t,o+u)!==s(e,u)){Z=!1;break}if(Z)return o}return-1}function K(t,e,i,l){i=Number(i)||0;var n=t.length-i;l?(l=Number(l))>n&&(l=n):l=n;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");l>o/2&&(l=o/2);for(var d=0;d<l;++d){var c=parseInt(e.substr(2*d,2),16);if(isNaN(c))return d;t[i+d]=c}return d}function v(t,e,i,l){return q(O(e,t.length-i),t,i,l)}function J(t,e,i,l){return q(function(t){for(var e=[],i=0;i<t.length;++i)e.push(255&t.charCodeAt(i));return e}(e),t,i,l)}function N(t,e,i,l){return J(t,e,i,l)}function f(t,e,i,l){return q(_(e),t,i,l)}function L(t,e,i,l){return q(function(t,e){for(var i,l,n,o=[],d=0;d<t.length&&!((e-=2)<0);++d)l=(i=t.charCodeAt(d))>>8,n=i%256,o.push(n),o.push(l);return o}(e,t.length-i),t,i,l)}function H(t,e,i){return 0===e&&i===t.length?s(t):s(t.slice(e,i))}function U(t,e,i){i=Math.min(t.length,i);for(var l=[],n=e;n<i;){var o,d,c,a,s=t[n],r=null,Z=s>239?4:s>223?3:s>191?2:1;if(n+Z<=i)switch(Z){case 1:s<128&&(r=s);break;case 2:128==(192&(o=t[n+1]))&&(a=(31&s)<<6|63&o)>127&&(r=a);break;case 3:o=t[n+1],d=t[n+2],128==(192&o)&&128==(192&d)&&(a=(15&s)<<12|(63&o)<<6|63&d)>2047&&(a<55296||a>57343)&&(r=a);break;case 4:o=t[n+1],d=t[n+2],c=t[n+3],128==(192&o)&&128==(192&d)&&128==(192&c)&&(a=(15&s)<<18|(63&o)<<12|(63&d)<<6|63&c)>65535&&a<1114112&&(r=a)}null===r?(r=65533,Z=1):r>65535&&(r-=65536,l.push(r>>>10&1023|55296),r=56320|1023&r),l.push(r),n+=Z}return function(t){var e=t.length;if(e<=T)return String.fromCharCode.apply(String,t);var i="",l=0;for(;l<e;)i+=String.fromCharCode.apply(String,t.slice(l,l+=T));return i}(l)}I.TYPED_ARRAY_SUPPORT=void 0===i.TYPED_ARRAY_SUPPORT||i.TYPED_ARRAY_SUPPORT,I.poolSize=8192,I._augment=function(t){return t.__proto__=I.prototype,t},I.from=function(t,e,i){return p(null,t,e,i)},I.TYPED_ARRAY_SUPPORT&&(I.prototype.__proto__=Uint8Array.prototype,I.__proto__=Uint8Array),I.alloc=function(t,e,i){return function(t,e,i,l){return G(e),e<=0?m(t,e):void 0!==i?"string"==typeof l?m(t,e).fill(i,l):m(t,e).fill(i):m(t,e)}(null,t,e,i)},I.allocUnsafe=function(t){return y(null,t)},I.allocUnsafeSlow=function(t){return y(null,t)},I.isBuffer=function(t){return null!=t&&(!!t._isBuffer||$(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&$(t.slice(0,0))}(t))},I.compare=function(t,e){if(!V(t)||!V(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var i=t.length,l=e.length,n=0,o=Math.min(i,l);n<o;++n)if(t[n]!==e[n]){i=t[n],l=e[n];break}return i<l?-1:l<i?1:0},I.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}},I.concat=function(t,e){if(!b(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return I.alloc(0);var i;if(void 0===e)for(e=0,i=0;i<t.length;++i)e+=t[i].length;var l=I.allocUnsafe(e),n=0;for(i=0;i<t.length;++i){var o=t[i];if(!V(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(l,n),n+=o.length}return l},I.byteLength=W,I.prototype._isBuffer=!0,I.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)R(this,e,e+1);return this},I.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)R(this,e,e+3),R(this,e+1,e+2);return this},I.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)R(this,e,e+7),R(this,e+1,e+6),R(this,e+2,e+5),R(this,e+3,e+4);return this},I.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?U(this,0,t):C.apply(this,arguments)},I.prototype.equals=function(t){if(!V(t))throw new TypeError("Argument must be a Buffer");return this===t||0===I.compare(this,t)},I.prototype.inspect=function(){var t="";return this.length>0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),"<Buffer "+t+">"},I.prototype.compare=function(t,e,i,l,n){if(!V(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===l&&(l=0),void 0===n&&(n=this.length),e<0||i>t.length||l<0||n>this.length)throw new RangeError("out of range index");if(l>=n&&e>=i)return 0;if(l>=n)return-1;if(e>=i)return 1;if(this===t)return 0;for(var o=(n>>>=0)-(l>>>=0),d=(i>>>=0)-(e>>>=0),c=Math.min(o,d),a=this.slice(l,n),s=t.slice(e,i),r=0;r<c;++r)if(a[r]!==s[r]){o=a[r],d=s[r];break}return o<d?-1:d<o?1:0},I.prototype.includes=function(t,e,i){return-1!==this.indexOf(t,e,i)},I.prototype.indexOf=function(t,e,i){return S(this,t,e,i,!0)},I.prototype.lastIndexOf=function(t,e,i){return S(this,t,e,i,!1)},I.prototype.write=function(t,e,i,l){if(void 0===e)l="utf8",i=this.length,e=0;else if(void 0===i&&"string"==typeof e)l=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===l&&(l="utf8")):(l=i,i=void 0)}var n=this.length-e;if((void 0===i||i>n)&&(i=n),t.length>0&&(i<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");l||(l="utf8");for(var o=!1;;)switch(l){case"hex":return K(this,t,e,i);case"utf8":case"utf-8":return v(this,t,e,i);case"ascii":return J(this,t,e,i);case"latin1":case"binary":return N(this,t,e,i);case"base64":return f(this,t,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return L(this,t,e,i);default:if(o)throw new TypeError("Unknown encoding: "+l);l=(""+l).toLowerCase(),o=!0}},I.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var T=4096;function k(t,e,i){var l="";i=Math.min(t.length,i);for(var n=e;n<i;++n)l+=String.fromCharCode(127&t[n]);return l}function B(t,e,i){var l="";i=Math.min(t.length,i);for(var n=e;n<i;++n)l+=String.fromCharCode(t[n]);return l}function x(t,e,i){var l=t.length;(!e||e<0)&&(e=0),(!i||i<0||i>l)&&(i=l);for(var n="",o=e;o<i;++o)n+=D(t[o]);return n}function w(t,e,i){for(var l=t.slice(e,i),n="",o=0;o<l.length;o+=2)n+=String.fromCharCode(l[o]+256*l[o+1]);return n}function F(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 z(t,e,i,l,n,o){if(!V(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>n||e<o)throw new RangeError('"value" argument is out of bounds');if(i+l>t.length)throw new RangeError("Index out of range")}function A(t,e,i,l){e<0&&(e=65535+e+1);for(var n=0,o=Math.min(t.length-i,2);n<o;++n)t[i+n]=(e&255<<8*(l?n:1-n))>>>8*(l?n:1-n)}function P(t,e,i,l){e<0&&(e=4294967295+e+1);for(var n=0,o=Math.min(t.length-i,4);n<o;++n)t[i+n]=e>>>8*(l?n:3-n)&255}function Q(t,e,i,l,n,o){if(i+l>t.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function M(t,e,i,l,n){return n||Q(t,0,i,4),Z(t,e,i,l,23,4),i+4}function j(t,e,i,l,n){return n||Q(t,0,i,8),Z(t,e,i,l,52,8),i+8}I.prototype.slice=function(t,e){var i,l=this.length;if((t=~~t)<0?(t+=l)<0&&(t=0):t>l&&(t=l),(e=void 0===e?l:~~e)<0?(e+=l)<0&&(e=0):e>l&&(e=l),e<t&&(e=t),I.TYPED_ARRAY_SUPPORT)(i=this.subarray(t,e)).__proto__=I.prototype;else{var n=e-t;i=new I(n,void 0);for(var o=0;o<n;++o)i[o]=this[o+t]}return i},I.prototype.readUIntLE=function(t,e,i){t|=0,e|=0,i||F(t,e,this.length);for(var l=this[t],n=1,o=0;++o<e&&(n*=256);)l+=this[t+o]*n;return l},I.prototype.readUIntBE=function(t,e,i){t|=0,e|=0,i||F(t,e,this.length);for(var l=this[t+--e],n=1;e>0&&(n*=256);)l+=this[t+--e]*n;return l},I.prototype.readUInt8=function(t,e){return e||F(t,1,this.length),this[t]},I.prototype.readUInt16LE=function(t,e){return e||F(t,2,this.length),this[t]|this[t+1]<<8},I.prototype.readUInt16BE=function(t,e){return e||F(t,2,this.length),this[t]<<8|this[t+1]},I.prototype.readUInt32LE=function(t,e){return e||F(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},I.prototype.readUInt32BE=function(t,e){return e||F(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},I.prototype.readIntLE=function(t,e,i){t|=0,e|=0,i||F(t,e,this.length);for(var l=this[t],n=1,o=0;++o<e&&(n*=256);)l+=this[t+o]*n;return l>=(n*=128)&&(l-=Math.pow(2,8*e)),l},I.prototype.readIntBE=function(t,e,i){t|=0,e|=0,i||F(t,e,this.length);for(var l=e,n=1,o=this[t+--l];l>0&&(n*=256);)o+=this[t+--l]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*e)),o},I.prototype.readInt8=function(t,e){return e||F(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},I.prototype.readInt16LE=function(t,e){e||F(t,2,this.length);var i=this[t]|this[t+1]<<8;return 32768&i?4294901760|i:i},I.prototype.readInt16BE=function(t,e){e||F(t,2,this.length);var i=this[t+1]|this[t]<<8;return 32768&i?4294901760|i:i},I.prototype.readInt32LE=function(t,e){return e||F(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},I.prototype.readInt32BE=function(t,e){return e||F(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},I.prototype.readFloatLE=function(t,e){return e||F(t,4,this.length),r(this,t,!0,23,4)},I.prototype.readFloatBE=function(t,e){return e||F(t,4,this.length),r(this,t,!1,23,4)},I.prototype.readDoubleLE=function(t,e){return e||F(t,8,this.length),r(this,t,!0,52,8)},I.prototype.readDoubleBE=function(t,e){return e||F(t,8,this.length),r(this,t,!1,52,8)},I.prototype.writeUIntLE=function(t,e,i,l){(t=+t,e|=0,i|=0,l)||z(this,t,e,i,Math.pow(2,8*i)-1,0);var n=1,o=0;for(this[e]=255&t;++o<i&&(n*=256);)this[e+o]=t/n&255;return e+i},I.prototype.writeUIntBE=function(t,e,i,l){(t=+t,e|=0,i|=0,l)||z(this,t,e,i,Math.pow(2,8*i)-1,0);var n=i-1,o=1;for(this[e+n]=255&t;--n>=0&&(o*=256);)this[e+n]=t/o&255;return e+i},I.prototype.writeUInt8=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,1,255,0),I.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},I.prototype.writeUInt16LE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,2,65535,0),I.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):A(this,t,e,!0),e+2},I.prototype.writeUInt16BE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,2,65535,0),I.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):A(this,t,e,!1),e+2},I.prototype.writeUInt32LE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,4,4294967295,0),I.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):P(this,t,e,!0),e+4},I.prototype.writeUInt32BE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,4,4294967295,0),I.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},I.prototype.writeIntLE=function(t,e,i,l){if(t=+t,e|=0,!l){var n=Math.pow(2,8*i-1);z(this,t,e,i,n-1,-n)}var o=0,d=1,c=0;for(this[e]=255&t;++o<i&&(d*=256);)t<0&&0===c&&0!==this[e+o-1]&&(c=1),this[e+o]=(t/d>>0)-c&255;return e+i},I.prototype.writeIntBE=function(t,e,i,l){if(t=+t,e|=0,!l){var n=Math.pow(2,8*i-1);z(this,t,e,i,n-1,-n)}var o=i-1,d=1,c=0;for(this[e+o]=255&t;--o>=0&&(d*=256);)t<0&&0===c&&0!==this[e+o+1]&&(c=1),this[e+o]=(t/d>>0)-c&255;return e+i},I.prototype.writeInt8=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,1,127,-128),I.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},I.prototype.writeInt16LE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,2,32767,-32768),I.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):A(this,t,e,!0),e+2},I.prototype.writeInt16BE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,2,32767,-32768),I.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):A(this,t,e,!1),e+2},I.prototype.writeInt32LE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,4,2147483647,-2147483648),I.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):P(this,t,e,!0),e+4},I.prototype.writeInt32BE=function(t,e,i){return t=+t,e|=0,i||z(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),I.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):P(this,t,e,!1),e+4},I.prototype.writeFloatLE=function(t,e,i){return M(this,t,e,!0,i)},I.prototype.writeFloatBE=function(t,e,i){return M(this,t,e,!1,i)},I.prototype.writeDoubleLE=function(t,e,i){return j(this,t,e,!0,i)},I.prototype.writeDoubleBE=function(t,e,i){return j(this,t,e,!1,i)},I.prototype.copy=function(t,e,i,l){if(i||(i=0),l||0===l||(l=this.length),e>=t.length&&(e=t.length),e||(e=0),l>0&&l<i&&(l=i),l===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(l<0)throw new RangeError("sourceEnd out of bounds");l>this.length&&(l=this.length),t.length-e<l-i&&(l=t.length-e+i);var n,o=l-i;if(this===t&&i<e&&e<l)for(n=o-1;n>=0;--n)t[n+e]=this[n+i];else if(o<1e3||!I.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)t[n+e]=this[n+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+o),e);return o},I.prototype.fill=function(t,e,i,l){if("string"==typeof t){if("string"==typeof e?(l=e,e=0,i=this.length):"string"==typeof i&&(l=i,i=this.length),1===t.length){var n=t.charCodeAt(0);n<256&&(t=n)}if(void 0!==l&&"string"!=typeof l)throw new TypeError("encoding must be a string");if("string"==typeof l&&!I.isEncoding(l))throw new TypeError("Unknown encoding: "+l)}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 o;if(e>>>=0,i=void 0===i?this.length:i>>>0,t||(t=0),"number"==typeof t)for(o=e;o<i;++o)this[o]=t;else{var d=V(t)?t:O(new I(t,l).toString()),c=d.length;for(o=0;o<i-e;++o)this[o+e]=d[o%c]}return this};var E=/[^+\/0-9A-Za-z-_]/g;function D(t){return t<16?"0"+t.toString(16):t.toString(16)}function O(t,e){var i;e=e||1/0;for(var l=t.length,n=null,o=[],d=0;d<l;++d){if((i=t.charCodeAt(d))>55295&&i<57344){if(!n){if(i>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(d+1===l){(e-=3)>-1&&o.push(239,191,189);continue}n=i;continue}if(i<56320){(e-=3)>-1&&o.push(239,191,189),n=i;continue}i=65536+(n-55296<<10|i-56320)}else n&&(e-=3)>-1&&o.push(239,191,189);if(n=null,i<128){if((e-=1)<0)break;o.push(i)}else if(i<2048){if((e-=2)<0)break;o.push(i>>6|192,63&i|128)}else if(i<65536){if((e-=3)<0)break;o.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;o.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return o}function _(t){return function(t){var e,i,l,a,s,r;d||c();var Z=t.length;if(Z%4>0)throw new Error("Invalid string. Length must be a multiple of 4");s="="===t[Z-2]?2:"="===t[Z-1]?1:0,r=new o(3*Z/4-s),l=s>0?Z-4:Z;var u=0;for(e=0,i=0;e<l;e+=4,i+=3)a=n[t.charCodeAt(e)]<<18|n[t.charCodeAt(e+1)]<<12|n[t.charCodeAt(e+2)]<<6|n[t.charCodeAt(e+3)],r[u++]=a>>16&255,r[u++]=a>>8&255,r[u++]=255&a;return 2===s?(a=n[t.charCodeAt(e)]<<2|n[t.charCodeAt(e+1)]>>4,r[u++]=255&a):1===s&&(a=n[t.charCodeAt(e)]<<10|n[t.charCodeAt(e+1)]<<4|n[t.charCodeAt(e+2)]>>2,r[u++]=a>>8&255,r[u++]=255&a),r}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(E,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function q(t,e,i,l){for(var n=0;n<l&&!(n+i>=e.length||n>=t.length);++n)e[n+i]=t[n];return n}function $(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var tt=function(t,e){return function(){for(var i=new Array(arguments.length),l=0;l<i.length;l++)i[l]=arguments[l];return t.apply(e,i)}},et=Object.prototype.toString;function it(t){return"[object Array]"===et.call(t)}function lt(t){return void 0===t}function nt(t){return null!==t&&"object"==typeof t}function ot(t){if("[object Object]"!==et.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype}function dt(t){return"[object Function]"===et.call(t)}function ct(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),it(t))for(var i=0,l=t.length;i<l;i++)e.call(null,t[i],i,t);else for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&e.call(null,t[n],n,t)}var at={isArray:it,isArrayBuffer:function(t){return"[object ArrayBuffer]"===et.call(t)},isBuffer:function(t){return null!==t&&!lt(t)&&null!==t.constructor&&!lt(t.constructor)&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)},isFormData:function(t){return"undefined"!=typeof FormData&&t instanceof FormData},isArrayBufferView:function(t){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(t):t&&t.buffer&&t.buffer instanceof ArrayBuffer},isString:function(t){return"string"==typeof t},isNumber:function(t){return"number"==typeof t},isObject:nt,isPlainObject:ot,isUndefined:lt,isDate:function(t){return"[object Date]"===et.call(t)},isFile:function(t){return"[object File]"===et.call(t)},isBlob:function(t){return"[object Blob]"===et.call(t)},isFunction:dt,isStream:function(t){return nt(t)&&dt(t.pipe)},isURLSearchParams:function(t){return"undefined"!=typeof URLSearchParams&&t instanceof URLSearchParams},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:ct,merge:function t(){var e={};function i(i,l){ot(e[l])&&ot(i)?e[l]=t(e[l],i):ot(i)?e[l]=t({},i):it(i)?e[l]=i.slice():e[l]=i}for(var l=0,n=arguments.length;l<n;l++)ct(arguments[l],i);return e},extend:function(t,e,i){return ct(e,(function(e,l){t[l]=i&&"function"==typeof e?tt(e,i):e})),t},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},stripBOM:function(t){return 65279===t.charCodeAt(0)&&(t=t.slice(1)),t}};function st(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var rt=function(t,e,i){if(!e)return t;var l;if(i)l=i(e);else if(at.isURLSearchParams(e))l=e.toString();else{var n=[];at.forEach(e,(function(t,e){null!=t&&(at.isArray(t)?e+="[]":t=[t],at.forEach(t,(function(t){at.isDate(t)?t=t.toISOString():at.isObject(t)&&(t=JSON.stringify(t)),n.push(st(e)+"="+st(t))})))})),l=n.join("&")}if(l){var o=t.indexOf("#");-1!==o&&(t=t.slice(0,o)),t+=(-1===t.indexOf("?")?"?":"&")+l}return t};function Zt(){this.handlers=[]}Zt.prototype.use=function(t,e,i){return this.handlers.push({fulfilled:t,rejected:e,synchronous:!!i&&i.synchronous,runWhen:i?i.runWhen:null}),this.handlers.length-1},Zt.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},Zt.prototype.forEach=function(t){at.forEach(this.handlers,(function(e){null!==e&&t(e)}))};var ut=Zt;function bt(){throw new Error("setTimeout has not been defined")}function ht(){throw new Error("clearTimeout has not been defined")}var mt=bt,It=ht;function pt(t){if(mt===setTimeout)return setTimeout(t,0);if((mt===bt||!mt)&&setTimeout)return mt=setTimeout,setTimeout(t,0);try{return mt(t,0)}catch(e){try{return mt.call(null,t,0)}catch(e){return mt.call(this,t,0)}}}"function"==typeof i.setTimeout&&(mt=setTimeout),"function"==typeof i.clearTimeout&&(It=clearTimeout);var Gt,yt=[],Xt=!1,gt=-1;function Vt(){Xt&&Gt&&(Xt=!1,Gt.length?yt=Gt.concat(yt):gt=-1,yt.length&&Wt())}function Wt(){if(!Xt){var t=pt(Vt);Xt=!0;for(var e=yt.length;e;){for(Gt=yt,yt=[];++gt<e;)Gt&&Gt[gt].run();gt=-1,e=yt.length}Gt=null,Xt=!1,function(t){if(It===clearTimeout)return clearTimeout(t);if((It===ht||!It)&&clearTimeout)return It=clearTimeout,clearTimeout(t);try{It(t)}catch(e){try{return It.call(null,t)}catch(e){return It.call(this,t)}}}(t)}}function Ct(t,e){this.fun=t,this.array=e}Ct.prototype.run=function(){this.fun.apply(null,this.array)};function Rt(){}var St=Rt,Yt=Rt,Kt=Rt,vt=Rt,Jt=Rt,Nt=Rt,ft=Rt;var Lt=i.performance||{},Ht=Lt.now||Lt.mozNow||Lt.msNow||Lt.oNow||Lt.webkitNow||function(){return(new Date).getTime()};var Ut=new Date;var Tt={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];yt.push(new Ct(t,e)),1!==yt.length||Xt||pt(Wt)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:St,addListener:Yt,once:Kt,off:vt,removeListener:Jt,removeAllListeners:Nt,emit:ft,binding:function(t){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(t){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(t){var e=.001*Ht.call(Lt),i=Math.floor(e),l=Math.floor(e%1*1e9);return t&&(i-=t[0],(l-=t[1])<0&&(i--,l+=1e9)),[i,l]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-Ut)/1e3}},kt=Tt,Bt=function(t,e){at.forEach(t,(function(i,l){l!==e&&l.toUpperCase()===e.toUpperCase()&&(t[e]=i,delete t[l])}))},xt=function(t,e,i,l,n){return t.config=e,i&&(t.code=i),t.request=l,t.response=n,t.isAxiosError=!0,t.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},t},wt=function(t,e,i,l,n){var o=new Error(t);return xt(o,e,i,l,n)},Ft=at.isStandardBrowserEnv()?{write:function(t,e,i,l,n,o){var d=[];d.push(t+"="+encodeURIComponent(e)),at.isNumber(i)&&d.push("expires="+new Date(i).toGMTString()),at.isString(l)&&d.push("path="+l),at.isString(n)&&d.push("domain="+n),!0===o&&d.push("secure"),document.cookie=d.join("; ")},read:function(t){var e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},zt=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],At=at.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),i=document.createElement("a");function l(t){var l=t;return e&&(i.setAttribute("href",l),l=i.href),i.setAttribute("href",l),{href:i.href,protocol:i.protocol?i.protocol.replace(/:$/,""):"",host:i.host,search:i.search?i.search.replace(/^\?/,""):"",hash:i.hash?i.hash.replace(/^#/,""):"",hostname:i.hostname,port:i.port,pathname:"/"===i.pathname.charAt(0)?i.pathname:"/"+i.pathname}}return t=l(window.location.href),function(e){var i=at.isString(e)?l(e):e;return i.protocol===t.protocol&&i.host===t.host}}():function(){return!0},Pt=function(t){return new Promise((function(e,i){var l=t.data,n=t.headers,o=t.responseType;at.isFormData(l)&&delete n["Content-Type"];var d=new XMLHttpRequest;if(t.auth){var c=t.auth.username||"",a=t.auth.password?unescape(encodeURIComponent(t.auth.password)):"";n.Authorization="Basic "+btoa(c+":"+a)}var s,r,Z=(s=t.baseURL,r=t.url,s&&!/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(r)?function(t,e){return e?t.replace(/\/+$/,"")+"/"+e.replace(/^\/+/,""):t}(s,r):r);function u(){if(d){var l="getAllResponseHeaders"in d?function(t){var e,i,l,n={};return t?(at.forEach(t.split("\n"),(function(t){if(l=t.indexOf(":"),e=at.trim(t.substr(0,l)).toLowerCase(),i=at.trim(t.substr(l+1)),e){if(n[e]&&zt.indexOf(e)>=0)return;n[e]="set-cookie"===e?(n[e]?n[e]:[]).concat([i]):n[e]?n[e]+", "+i:i}})),n):n}(d.getAllResponseHeaders()):null,n={data:o&&"text"!==o&&"json"!==o?d.response:d.responseText,status:d.status,statusText:d.statusText,headers:l,config:t,request:d};!function(t,e,i){var l=i.config.validateStatus;i.status&&l&&!l(i.status)?e(wt("Request failed with status code "+i.status,i.config,null,i.request,i)):t(i)}(e,i,n),d=null}}if(d.open(t.method.toUpperCase(),rt(Z,t.params,t.paramsSerializer),!0),d.timeout=t.timeout,"onloadend"in d?d.onloadend=u:d.onreadystatechange=function(){d&&4===d.readyState&&(0!==d.status||d.responseURL&&0===d.responseURL.indexOf("file:"))&&setTimeout(u)},d.onabort=function(){d&&(i(wt("Request aborted",t,"ECONNABORTED",d)),d=null)},d.onerror=function(){i(wt("Network Error",t,null,d)),d=null},d.ontimeout=function(){var e="timeout of "+t.timeout+"ms exceeded";t.timeoutErrorMessage&&(e=t.timeoutErrorMessage),i(wt(e,t,t.transitional&&t.transitional.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",d)),d=null},at.isStandardBrowserEnv()){var b=(t.withCredentials||At(Z))&&t.xsrfCookieName?Ft.read(t.xsrfCookieName):void 0;b&&(n[t.xsrfHeaderName]=b)}"setRequestHeader"in d&&at.forEach(n,(function(t,e){void 0===l&&"content-type"===e.toLowerCase()?delete n[e]:d.setRequestHeader(e,t)})),at.isUndefined(t.withCredentials)||(d.withCredentials=!!t.withCredentials),o&&"json"!==o&&(d.responseType=t.responseType),"function"==typeof t.onDownloadProgress&&d.addEventListener("progress",t.onDownloadProgress),"function"==typeof t.onUploadProgress&&d.upload&&d.upload.addEventListener("progress",t.onUploadProgress),t.cancelToken&&t.cancelToken.promise.then((function(t){d&&(d.abort(),i(t),d=null)})),l||(l=null),d.send(l)}))},Qt={"Content-Type":"application/x-www-form-urlencoded"};function Mt(t,e){!at.isUndefined(t)&&at.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}var jt,Et={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==kt&&"[object process]"===Object.prototype.toString.call(kt))&&(jt=Pt),jt),transformRequest:[function(t,e){return Bt(e,"Accept"),Bt(e,"Content-Type"),at.isFormData(t)||at.isArrayBuffer(t)||at.isBuffer(t)||at.isStream(t)||at.isFile(t)||at.isBlob(t)?t:at.isArrayBufferView(t)?t.buffer:at.isURLSearchParams(t)?(Mt(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):at.isObject(t)||e&&"application/json"===e["Content-Type"]?(Mt(e,"application/json"),function(t,e,i){if(at.isString(t))try{return(e||JSON.parse)(t),at.trim(t)}catch(t){if("SyntaxError"!==t.name)throw t}return(i||JSON.stringify)(t)}(t)):t}],transformResponse:[function(t){var e=this.transitional,i=e&&e.silentJSONParsing,l=e&&e.forcedJSONParsing,n=!i&&"json"===this.responseType;if(n||l&&at.isString(t)&&t.length)try{return JSON.parse(t)}catch(t){if(n){if("SyntaxError"===t.name)throw xt(t,this,"E_JSON_PARSE");throw t}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(t){return t>=200&&t<300}};Et.headers={common:{Accept:"application/json, text/plain, */*"}},at.forEach(["delete","get","head"],(function(t){Et.headers[t]={}})),at.forEach(["post","put","patch"],(function(t){Et.headers[t]=at.merge(Qt)}));var Dt=Et,Ot=function(t,e,i){var l=this||Dt;return at.forEach(i,(function(i){t=i.call(l,t,e)})),t},_t=function(t){return!(!t||!t.__CANCEL__)};function qt(t){t.cancelToken&&t.cancelToken.throwIfRequested()}var $t=function(t){return qt(t),t.headers=t.headers||{},t.data=Ot.call(t,t.data,t.headers,t.transformRequest),t.headers=at.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),at.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete t.headers[e]})),(t.adapter||Dt.adapter)(t).then((function(e){return qt(t),e.data=Ot.call(t,e.data,e.headers,t.transformResponse),e}),(function(e){return _t(e)||(qt(t),e&&e.response&&(e.response.data=Ot.call(t,e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)}))},te=function(t,e){e=e||{};var i={},l=["url","method","data"],n=["headers","auth","proxy","params"],o=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],d=["validateStatus"];function c(t,e){return at.isPlainObject(t)&&at.isPlainObject(e)?at.merge(t,e):at.isPlainObject(e)?at.merge({},e):at.isArray(e)?e.slice():e}function a(l){at.isUndefined(e[l])?at.isUndefined(t[l])||(i[l]=c(void 0,t[l])):i[l]=c(t[l],e[l])}at.forEach(l,(function(t){at.isUndefined(e[t])||(i[t]=c(void 0,e[t]))})),at.forEach(n,a),at.forEach(o,(function(l){at.isUndefined(e[l])?at.isUndefined(t[l])||(i[l]=c(void 0,t[l])):i[l]=c(void 0,e[l])})),at.forEach(d,(function(l){l in e?i[l]=c(t[l],e[l]):l in t&&(i[l]=c(void 0,t[l]))}));var s=l.concat(n).concat(o).concat(d),r=Object.keys(t).concat(Object.keys(e)).filter((function(t){return-1===s.indexOf(t)}));return at.forEach(r,a),i},ee={name:"axios",version:"0.21.4",description:"Promise based HTTP client for the browser and node.js",main:"index.js",scripts:{test:"grunt test",start:"node ./sandbox/server.js",build:"NODE_ENV=production grunt build",preversion:"npm test",version:"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json",postversion:"git push && git push --tags",examples:"node ./examples/server.js",coveralls:"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",fix:"eslint --fix lib/**/*.js"},repository:{type:"git",url:"https://github.com/axios/axios.git"},keywords:["xhr","http","ajax","promise","node"],author:"Matt Zabriskie",license:"MIT",bugs:{url:"https://github.com/axios/axios/issues"},homepage:"https://axios-http.com",devDependencies:{coveralls:"^3.0.0","es6-promise":"^4.2.4",grunt:"^1.3.0","grunt-banner":"^0.6.0","grunt-cli":"^1.2.0","grunt-contrib-clean":"^1.1.0","grunt-contrib-watch":"^1.0.0","grunt-eslint":"^23.0.0","grunt-karma":"^4.0.0","grunt-mocha-test":"^0.13.3","grunt-ts":"^6.0.0-beta.19","grunt-webpack":"^4.0.2","istanbul-instrumenter-loader":"^1.0.0","jasmine-core":"^2.4.1",karma:"^6.3.2","karma-chrome-launcher":"^3.1.0","karma-firefox-launcher":"^2.1.0","karma-jasmine":"^1.1.1","karma-jasmine-ajax":"^0.1.13","karma-safari-launcher":"^1.0.0","karma-sauce-launcher":"^4.3.6","karma-sinon":"^1.0.5","karma-sourcemap-loader":"^0.3.8","karma-webpack":"^4.0.2","load-grunt-tasks":"^3.5.2",minimist:"^1.2.0",mocha:"^8.2.1",sinon:"^4.5.0","terser-webpack-plugin":"^4.2.3",typescript:"^4.0.5","url-search-params":"^0.10.0",webpack:"^4.44.2","webpack-dev-server":"^3.11.0"},browser:{"./lib/adapters/http.js":"./lib/adapters/xhr.js"},jsdelivr:"dist/axios.min.js",unpkg:"dist/axios.min.js",typings:"./index.d.ts",dependencies:{"follow-redirects":"^1.14.0"},bundlesize:[{path:"./dist/axios.min.js",threshold:"5kB"}]},ie={};["object","boolean","number","function","string","symbol"].forEach((function(t,e){ie[t]=function(i){return typeof i===t||"a"+(e<1?"n ":" ")+t}}));var le={},ne=ee.version.split(".");function oe(t,e){for(var i=e?e.split("."):ne,l=t.split("."),n=0;n<3;n++){if(i[n]>l[n])return!0;if(i[n]<l[n])return!1}return!1}ie.transitional=function(t,e,i){var l=e&&oe(e);function n(t,e){return"[Axios v"+ee.version+"] Transitional option '"+t+"'"+e+(i?". "+i:"")}return function(i,o,d){if(!1===t)throw new Error(n(o," has been removed in "+e));return l&&!le[o]&&(le[o]=!0,console.warn(n(o," has been deprecated since v"+e+" and will be removed in the near future"))),!t||t(i,o,d)}};var de={isOlderVersion:oe,assertOptions:function(t,e,i){if("object"!=typeof t)throw new TypeError("options must be an object");for(var l=Object.keys(t),n=l.length;n-- >0;){var o=l[n],d=e[o];if(d){var c=t[o],a=void 0===c||d(c,o,t);if(!0!==a)throw new TypeError("option "+o+" must be "+a)}else if(!0!==i)throw Error("Unknown option "+o)}},validators:ie},ce=de.validators;function ae(t){this.defaults=t,this.interceptors={request:new ut,response:new ut}}ae.prototype.request=function(t){"string"==typeof t?(t=arguments[1]||{}).url=arguments[0]:t=t||{},(t=te(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var e=t.transitional;void 0!==e&&de.assertOptions(e,{silentJSONParsing:ce.transitional(ce.boolean,"1.0.0"),forcedJSONParsing:ce.transitional(ce.boolean,"1.0.0"),clarifyTimeoutError:ce.transitional(ce.boolean,"1.0.0")},!1);var i=[],l=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(l=l&&e.synchronous,i.unshift(e.fulfilled,e.rejected))}));var n,o=[];if(this.interceptors.response.forEach((function(t){o.push(t.fulfilled,t.rejected)})),!l){var d=[$t,void 0];for(Array.prototype.unshift.apply(d,i),d=d.concat(o),n=Promise.resolve(t);d.length;)n=n.then(d.shift(),d.shift());return n}for(var c=t;i.length;){var a=i.shift(),s=i.shift();try{c=a(c)}catch(t){s(t);break}}try{n=$t(c)}catch(t){return Promise.reject(t)}for(;o.length;)n=n.then(o.shift(),o.shift());return n},ae.prototype.getUri=function(t){return t=te(this.defaults,t),rt(t.url,t.params,t.paramsSerializer).replace(/^\?/,"")},at.forEach(["delete","get","head","options"],(function(t){ae.prototype[t]=function(e,i){return this.request(te(i||{},{method:t,url:e,data:(i||{}).data}))}})),at.forEach(["post","put","patch"],(function(t){ae.prototype[t]=function(e,i,l){return this.request(te(l||{},{method:t,url:e,data:i}))}}));var se=ae;function re(t){this.message=t}re.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},re.prototype.__CANCEL__=!0;var Ze=re;function ue(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var e;this.promise=new Promise((function(t){e=t}));var i=this;t((function(t){i.reason||(i.reason=new Ze(t),e(i.reason))}))}ue.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},ue.source=function(){var t,e=new ue((function(e){t=e}));return{token:e,cancel:t}};var be=ue;function he(t){var e=new se(t),i=tt(se.prototype.request,e);return at.extend(i,se.prototype,e),at.extend(i,e),i}var me=he(Dt);me.Axios=se,me.create=function(t){return he(te(me.defaults,t))},me.Cancel=Ze,me.CancelToken=be,me.isCancel=_t,me.all=function(t){return Promise.all(t)},me.spread=function(t){return function(e){return t.apply(null,e)}},me.isAxiosError=function(t){return"object"==typeof t&&!0===t.isAxiosError};var Ie=me,pe=me;Ie.default=pe;var Ge,ye=Ie;
16
16
  /*! *****************************************************************************
17
17
  Copyright (c) Microsoft Corporation.
18
18
 
@@ -26,7 +26,7 @@
26
26
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
27
27
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28
28
  PERFORMANCE OF THIS SOFTWARE.
29
- ***************************************************************************** */function Xe(t,e,i,l){return new(i||(i=Promise))((function(n,o){function d(t){try{a(l.next(t))}catch(t){o(t)}}function c(t){try{a(l.throw(t))}catch(t){o(t)}}function a(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(d,c)}a((l=l.apply(t,e||[])).next())}))}t.ResponseMode=void 0,(pe=t.ResponseMode||(t.ResponseMode={})).formPost="form_post",pe.query="query";t.Stores=void 0,function(t){t.ConfigData="config_data",t.OIDCProviderMetaData="oidc_provider_meta_data",t.SessionData="session_data",t.TemporaryData="temporary_data"}(t.Stores||(t.Stores={}));const ge="refresh_token_timer",We="pkce_code_verifier",Ve="code",Ce="session_state",Re="sign_out_url";var Se;!function(t){t.ReactNative="REACT_NATIVE",t.Browser="BROWSER",t.Node="NODE"}(Se||(Se={}));class Ke extends Error{constructor(t,e,i,l,n,o){super(null!=l?l:null==o?void 0:o.message),this.name=this.constructor.name,this.code=t,this.file=e,this.method=i,this.description=n,this.error=o,Object.setPrototypeOf(this,new.target.prototype)}}class Ye extends Ke{constructor(t,e,i,l,n,o,d,c,a){super(t,e,i,l,n),this.name=this.constructor.name,this.code=t,this.file=e,this.method=i,this.description=n,this.networkErrorCode=o,this.networkErrorMessage=d,this.status=c,this.networkErrorData=a}}var ve="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==i?i:"undefined"!=typeof self?self:{};function Je(t,e,i){return t(i={path:e,exports:{},require:function(t,e){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==e&&i.path)}},i.exports),i.exports}var fe=void 0!==i?i:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},Ne=[],He=[],Le="undefined"!=typeof Uint8Array?Uint8Array:Array,Ue=!1;function Te(){Ue=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0,i=t.length;e<i;++e)Ne[e]=t[e],He[t.charCodeAt(e)]=e;He["-".charCodeAt(0)]=62,He["_".charCodeAt(0)]=63}function ke(t,e,i){for(var l,n,o=[],d=e;d<i;d+=3)l=(t[d]<<16)+(t[d+1]<<8)+t[d+2],o.push(Ne[(n=l)>>18&63]+Ne[n>>12&63]+Ne[n>>6&63]+Ne[63&n]);return o.join("")}function Be(t){var e;Ue||Te();for(var i=t.length,l=i%3,n="",o=[],d=16383,c=0,a=i-l;c<a;c+=d)o.push(ke(t,c,c+d>a?a:c+d));return 1===l?(e=t[i-1],n+=Ne[e>>2],n+=Ne[e<<4&63],n+="=="):2===l&&(e=(t[i-2]<<8)+t[i-1],n+=Ne[e>>10],n+=Ne[e>>4&63],n+=Ne[e<<2&63],n+="="),o.push(n),o.join("")}function xe(t,e,i,l,n){var o,d,c=8*n-l-1,a=(1<<c)-1,s=a>>1,Z=-7,r=i?n-1:0,u=i?-1:1,m=t[e+r];for(r+=u,o=m&(1<<-Z)-1,m>>=-Z,Z+=c;Z>0;o=256*o+t[e+r],r+=u,Z-=8);for(d=o&(1<<-Z)-1,o>>=-Z,Z+=l;Z>0;d=256*d+t[e+r],r+=u,Z-=8);if(0===o)o=1-s;else{if(o===a)return d?NaN:1/0*(m?-1:1);d+=Math.pow(2,l),o-=s}return(m?-1:1)*d*Math.pow(2,o-l)}function we(t,e,i,l,n,o){var d,c,a,s=8*o-n-1,Z=(1<<s)-1,r=Z>>1,u=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,m=l?0:o-1,h=l?1:-1,b=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(c=isNaN(e)?1:0,d=Z):(d=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-d))<1&&(d--,a*=2),(e+=d+r>=1?u/a:u*Math.pow(2,1-r))*a>=2&&(d++,a/=2),d+r>=Z?(c=0,d=Z):d+r>=1?(c=(e*a-1)*Math.pow(2,n),d+=r):(c=e*Math.pow(2,r-1)*Math.pow(2,n),d=0));n>=8;t[i+m]=255&c,m+=h,c/=256,n-=8);for(d=d<<n|c,s+=n;s>0;t[i+m]=255&d,m+=h,d/=256,s-=8);t[i+m-h]|=128*b}var Fe={}.toString,ze=Array.isArray||function(t){return"[object Array]"==Fe.call(t)};Qe.TYPED_ARRAY_SUPPORT=void 0===fe.TYPED_ARRAY_SUPPORT||fe.TYPED_ARRAY_SUPPORT;var Pe=Ae();function Ae(){return Qe.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Me(t,e){if(Ae()<e)throw new RangeError("Invalid typed array length");return Qe.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=Qe.prototype:(null===t&&(t=new Qe(e)),t.length=e),t}function Qe(t,e,i){if(!(Qe.TYPED_ARRAY_SUPPORT||this instanceof Qe))return new Qe(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 De(this,t)}return je(this,t,e,i)}function je(t,e,i,l){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,l){if(e.byteLength,i<0||e.byteLength<i)throw new RangeError("'offset' is out of bounds");if(e.byteLength<i+(l||0))throw new RangeError("'length' is out of bounds");return e=void 0===i&&void 0===l?new Uint8Array(e):void 0===l?new Uint8Array(e,i):new Uint8Array(e,i,l),Qe.TYPED_ARRAY_SUPPORT?(t=e).__proto__=Qe.prototype:t=Oe(t,e),t}(t,e,i,l):"string"==typeof e?function(t,e,i){if("string"==typeof i&&""!==i||(i="utf8"),!Qe.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var l=0|$e(e,i),n=(t=Me(t,l)).write(e,i);return n!==l&&(t=t.slice(0,n)),t}(t,e,i):function(t,e){if(qe(e)){var i=0|_e(e.length);return 0===(t=Me(t,i)).length||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||(l=e.length)!=l?Me(t,0):Oe(t,e);if("Buffer"===e.type&&ze(e.data))return Oe(t,e.data)}var l;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function Ee(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 De(t,e){if(Ee(e),t=Me(t,e<0?0:0|_e(e)),!Qe.TYPED_ARRAY_SUPPORT)for(var i=0;i<e;++i)t[i]=0;return t}function Oe(t,e){var i=e.length<0?0:0|_e(e.length);t=Me(t,i);for(var l=0;l<i;l+=1)t[l]=255&e[l];return t}function _e(t){if(t>=Ae())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Ae().toString(16)+" bytes");return 0|t}function qe(t){return!(null==t||!t._isBuffer)}function $e(t,e){if(qe(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 l=!1;;)switch(e){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return Ri(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return Si(t).length;default:if(l)return Ri(t).length;e=(""+e).toLowerCase(),l=!0}}function ti(t,e,i){var l=!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 hi(this,e,i);case"utf8":case"utf-8":return ri(this,e,i);case"ascii":return ui(this,e,i);case"latin1":case"binary":return mi(this,e,i);case"base64":return Zi(this,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return bi(this,e,i);default:if(l)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),l=!0}}function ei(t,e,i){var l=t[e];t[e]=t[i],t[i]=l}function ii(t,e,i,l,n){if(0===t.length)return-1;if("string"==typeof i?(l=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=n?0:t.length-1),i<0&&(i=t.length+i),i>=t.length){if(n)return-1;i=t.length-1}else if(i<0){if(!n)return-1;i=0}if("string"==typeof e&&(e=Qe.from(e,l)),qe(e))return 0===e.length?-1:li(t,e,i,l,n);if("number"==typeof e)return e&=255,Qe.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(t,e,i):Uint8Array.prototype.lastIndexOf.call(t,e,i):li(t,[e],i,l,n);throw new TypeError("val must be string, number or Buffer")}function li(t,e,i,l,n){var o,d=1,c=t.length,a=e.length;if(void 0!==l&&("ucs2"===(l=String(l).toLowerCase())||"ucs-2"===l||"utf16le"===l||"utf-16le"===l)){if(t.length<2||e.length<2)return-1;d=2,c/=2,a/=2,i/=2}function s(t,e){return 1===d?t[e]:t.readUInt16BE(e*d)}if(n){var Z=-1;for(o=i;o<c;o++)if(s(t,o)===s(e,-1===Z?0:o-Z)){if(-1===Z&&(Z=o),o-Z+1===a)return Z*d}else-1!==Z&&(o-=o-Z),Z=-1}else for(i+a>c&&(i=c-a),o=i;o>=0;o--){for(var r=!0,u=0;u<a;u++)if(s(t,o+u)!==s(e,u)){r=!1;break}if(r)return o}return-1}function ni(t,e,i,l){i=Number(i)||0;var n=t.length-i;l?(l=Number(l))>n&&(l=n):l=n;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");l>o/2&&(l=o/2);for(var d=0;d<l;++d){var c=parseInt(e.substr(2*d,2),16);if(isNaN(c))return d;t[i+d]=c}return d}function oi(t,e,i,l){return Ki(Ri(e,t.length-i),t,i,l)}function di(t,e,i,l){return Ki(function(t){for(var e=[],i=0;i<t.length;++i)e.push(255&t.charCodeAt(i));return e}(e),t,i,l)}function ci(t,e,i,l){return di(t,e,i,l)}function ai(t,e,i,l){return Ki(Si(e),t,i,l)}function si(t,e,i,l){return Ki(function(t,e){for(var i,l,n,o=[],d=0;d<t.length&&!((e-=2)<0);++d)l=(i=t.charCodeAt(d))>>8,n=i%256,o.push(n),o.push(l);return o}(e,t.length-i),t,i,l)}function Zi(t,e,i){return 0===e&&i===t.length?Be(t):Be(t.slice(e,i))}function ri(t,e,i){i=Math.min(t.length,i);for(var l=[],n=e;n<i;){var o,d,c,a,s=t[n],Z=null,r=s>239?4:s>223?3:s>191?2:1;if(n+r<=i)switch(r){case 1:s<128&&(Z=s);break;case 2:128==(192&(o=t[n+1]))&&(a=(31&s)<<6|63&o)>127&&(Z=a);break;case 3:o=t[n+1],d=t[n+2],128==(192&o)&&128==(192&d)&&(a=(15&s)<<12|(63&o)<<6|63&d)>2047&&(a<55296||a>57343)&&(Z=a);break;case 4:o=t[n+1],d=t[n+2],c=t[n+3],128==(192&o)&&128==(192&d)&&128==(192&c)&&(a=(15&s)<<18|(63&o)<<12|(63&d)<<6|63&c)>65535&&a<1114112&&(Z=a)}null===Z?(Z=65533,r=1):Z>65535&&(Z-=65536,l.push(Z>>>10&1023|55296),Z=56320|1023&Z),l.push(Z),n+=r}return function(t){var e=t.length;if(e<=4096)return String.fromCharCode.apply(String,t);for(var i="",l=0;l<e;)i+=String.fromCharCode.apply(String,t.slice(l,l+=4096));return i}(l)}function ui(t,e,i){var l="";i=Math.min(t.length,i);for(var n=e;n<i;++n)l+=String.fromCharCode(127&t[n]);return l}function mi(t,e,i){var l="";i=Math.min(t.length,i);for(var n=e;n<i;++n)l+=String.fromCharCode(t[n]);return l}function hi(t,e,i){var l=t.length;(!e||e<0)&&(e=0),(!i||i<0||i>l)&&(i=l);for(var n="",o=e;o<i;++o)n+=Ci(t[o]);return n}function bi(t,e,i){for(var l=t.slice(e,i),n="",o=0;o<l.length;o+=2)n+=String.fromCharCode(l[o]+256*l[o+1]);return n}function Ii(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 Gi(t,e,i,l,n,o){if(!qe(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>n||e<o)throw new RangeError('"value" argument is out of bounds');if(i+l>t.length)throw new RangeError("Index out of range")}function pi(t,e,i,l){e<0&&(e=65535+e+1);for(var n=0,o=Math.min(t.length-i,2);n<o;++n)t[i+n]=(e&255<<8*(l?n:1-n))>>>8*(l?n:1-n)}function yi(t,e,i,l){e<0&&(e=4294967295+e+1);for(var n=0,o=Math.min(t.length-i,4);n<o;++n)t[i+n]=e>>>8*(l?n:3-n)&255}function Xi(t,e,i,l,n,o){if(i+l>t.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function gi(t,e,i,l,n){return n||Xi(t,0,i,4),we(t,e,i,l,23,4),i+4}function Wi(t,e,i,l,n){return n||Xi(t,0,i,8),we(t,e,i,l,52,8),i+8}Qe.poolSize=8192,Qe._augment=function(t){return t.__proto__=Qe.prototype,t},Qe.from=function(t,e,i){return je(null,t,e,i)},Qe.TYPED_ARRAY_SUPPORT&&(Qe.prototype.__proto__=Uint8Array.prototype,Qe.__proto__=Uint8Array),Qe.alloc=function(t,e,i){return function(t,e,i,l){return Ee(e),e<=0?Me(t,e):void 0!==i?"string"==typeof l?Me(t,e).fill(i,l):Me(t,e).fill(i):Me(t,e)}(null,t,e,i)},Qe.allocUnsafe=function(t){return De(null,t)},Qe.allocUnsafeSlow=function(t){return De(null,t)},Qe.isBuffer=Yi,Qe.compare=function(t,e){if(!qe(t)||!qe(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var i=t.length,l=e.length,n=0,o=Math.min(i,l);n<o;++n)if(t[n]!==e[n]){i=t[n],l=e[n];break}return i<l?-1:l<i?1:0},Qe.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}},Qe.concat=function(t,e){if(!ze(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return Qe.alloc(0);var i;if(void 0===e)for(e=0,i=0;i<t.length;++i)e+=t[i].length;var l=Qe.allocUnsafe(e),n=0;for(i=0;i<t.length;++i){var o=t[i];if(!qe(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(l,n),n+=o.length}return l},Qe.byteLength=$e,Qe.prototype._isBuffer=!0,Qe.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)ei(this,e,e+1);return this},Qe.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)ei(this,e,e+3),ei(this,e+1,e+2);return this},Qe.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)ei(this,e,e+7),ei(this,e+1,e+6),ei(this,e+2,e+5),ei(this,e+3,e+4);return this},Qe.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?ri(this,0,t):ti.apply(this,arguments)},Qe.prototype.equals=function(t){if(!qe(t))throw new TypeError("Argument must be a Buffer");return this===t||0===Qe.compare(this,t)},Qe.prototype.inspect=function(){var t="";return this.length>0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),"<Buffer "+t+">"},Qe.prototype.compare=function(t,e,i,l,n){if(!qe(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===l&&(l=0),void 0===n&&(n=this.length),e<0||i>t.length||l<0||n>this.length)throw new RangeError("out of range index");if(l>=n&&e>=i)return 0;if(l>=n)return-1;if(e>=i)return 1;if(this===t)return 0;for(var o=(n>>>=0)-(l>>>=0),d=(i>>>=0)-(e>>>=0),c=Math.min(o,d),a=this.slice(l,n),s=t.slice(e,i),Z=0;Z<c;++Z)if(a[Z]!==s[Z]){o=a[Z],d=s[Z];break}return o<d?-1:d<o?1:0},Qe.prototype.includes=function(t,e,i){return-1!==this.indexOf(t,e,i)},Qe.prototype.indexOf=function(t,e,i){return ii(this,t,e,i,!0)},Qe.prototype.lastIndexOf=function(t,e,i){return ii(this,t,e,i,!1)},Qe.prototype.write=function(t,e,i,l){if(void 0===e)l="utf8",i=this.length,e=0;else if(void 0===i&&"string"==typeof e)l=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===l&&(l="utf8")):(l=i,i=void 0)}var n=this.length-e;if((void 0===i||i>n)&&(i=n),t.length>0&&(i<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");l||(l="utf8");for(var o=!1;;)switch(l){case"hex":return ni(this,t,e,i);case"utf8":case"utf-8":return oi(this,t,e,i);case"ascii":return di(this,t,e,i);case"latin1":case"binary":return ci(this,t,e,i);case"base64":return ai(this,t,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return si(this,t,e,i);default:if(o)throw new TypeError("Unknown encoding: "+l);l=(""+l).toLowerCase(),o=!0}},Qe.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}},Qe.prototype.slice=function(t,e){var i,l=this.length;if((t=~~t)<0?(t+=l)<0&&(t=0):t>l&&(t=l),(e=void 0===e?l:~~e)<0?(e+=l)<0&&(e=0):e>l&&(e=l),e<t&&(e=t),Qe.TYPED_ARRAY_SUPPORT)(i=this.subarray(t,e)).__proto__=Qe.prototype;else{var n=e-t;i=new Qe(n,void 0);for(var o=0;o<n;++o)i[o]=this[o+t]}return i},Qe.prototype.readUIntLE=function(t,e,i){t|=0,e|=0,i||Ii(t,e,this.length);for(var l=this[t],n=1,o=0;++o<e&&(n*=256);)l+=this[t+o]*n;return l},Qe.prototype.readUIntBE=function(t,e,i){t|=0,e|=0,i||Ii(t,e,this.length);for(var l=this[t+--e],n=1;e>0&&(n*=256);)l+=this[t+--e]*n;return l},Qe.prototype.readUInt8=function(t,e){return e||Ii(t,1,this.length),this[t]},Qe.prototype.readUInt16LE=function(t,e){return e||Ii(t,2,this.length),this[t]|this[t+1]<<8},Qe.prototype.readUInt16BE=function(t,e){return e||Ii(t,2,this.length),this[t]<<8|this[t+1]},Qe.prototype.readUInt32LE=function(t,e){return e||Ii(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},Qe.prototype.readUInt32BE=function(t,e){return e||Ii(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},Qe.prototype.readIntLE=function(t,e,i){t|=0,e|=0,i||Ii(t,e,this.length);for(var l=this[t],n=1,o=0;++o<e&&(n*=256);)l+=this[t+o]*n;return l>=(n*=128)&&(l-=Math.pow(2,8*e)),l},Qe.prototype.readIntBE=function(t,e,i){t|=0,e|=0,i||Ii(t,e,this.length);for(var l=e,n=1,o=this[t+--l];l>0&&(n*=256);)o+=this[t+--l]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*e)),o},Qe.prototype.readInt8=function(t,e){return e||Ii(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},Qe.prototype.readInt16LE=function(t,e){e||Ii(t,2,this.length);var i=this[t]|this[t+1]<<8;return 32768&i?4294901760|i:i},Qe.prototype.readInt16BE=function(t,e){e||Ii(t,2,this.length);var i=this[t+1]|this[t]<<8;return 32768&i?4294901760|i:i},Qe.prototype.readInt32LE=function(t,e){return e||Ii(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},Qe.prototype.readInt32BE=function(t,e){return e||Ii(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},Qe.prototype.readFloatLE=function(t,e){return e||Ii(t,4,this.length),xe(this,t,!0,23,4)},Qe.prototype.readFloatBE=function(t,e){return e||Ii(t,4,this.length),xe(this,t,!1,23,4)},Qe.prototype.readDoubleLE=function(t,e){return e||Ii(t,8,this.length),xe(this,t,!0,52,8)},Qe.prototype.readDoubleBE=function(t,e){return e||Ii(t,8,this.length),xe(this,t,!1,52,8)},Qe.prototype.writeUIntLE=function(t,e,i,l){t=+t,e|=0,i|=0,l||Gi(this,t,e,i,Math.pow(2,8*i)-1,0);var n=1,o=0;for(this[e]=255&t;++o<i&&(n*=256);)this[e+o]=t/n&255;return e+i},Qe.prototype.writeUIntBE=function(t,e,i,l){t=+t,e|=0,i|=0,l||Gi(this,t,e,i,Math.pow(2,8*i)-1,0);var n=i-1,o=1;for(this[e+n]=255&t;--n>=0&&(o*=256);)this[e+n]=t/o&255;return e+i},Qe.prototype.writeUInt8=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,1,255,0),Qe.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},Qe.prototype.writeUInt16LE=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,2,65535,0),Qe.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):pi(this,t,e,!0),e+2},Qe.prototype.writeUInt16BE=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,2,65535,0),Qe.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):pi(this,t,e,!1),e+2},Qe.prototype.writeUInt32LE=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,4,4294967295,0),Qe.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):yi(this,t,e,!0),e+4},Qe.prototype.writeUInt32BE=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,4,4294967295,0),Qe.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):yi(this,t,e,!1),e+4},Qe.prototype.writeIntLE=function(t,e,i,l){if(t=+t,e|=0,!l){var n=Math.pow(2,8*i-1);Gi(this,t,e,i,n-1,-n)}var o=0,d=1,c=0;for(this[e]=255&t;++o<i&&(d*=256);)t<0&&0===c&&0!==this[e+o-1]&&(c=1),this[e+o]=(t/d>>0)-c&255;return e+i},Qe.prototype.writeIntBE=function(t,e,i,l){if(t=+t,e|=0,!l){var n=Math.pow(2,8*i-1);Gi(this,t,e,i,n-1,-n)}var o=i-1,d=1,c=0;for(this[e+o]=255&t;--o>=0&&(d*=256);)t<0&&0===c&&0!==this[e+o+1]&&(c=1),this[e+o]=(t/d>>0)-c&255;return e+i},Qe.prototype.writeInt8=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,1,127,-128),Qe.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},Qe.prototype.writeInt16LE=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,2,32767,-32768),Qe.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):pi(this,t,e,!0),e+2},Qe.prototype.writeInt16BE=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,2,32767,-32768),Qe.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):pi(this,t,e,!1),e+2},Qe.prototype.writeInt32LE=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,4,2147483647,-2147483648),Qe.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):yi(this,t,e,!0),e+4},Qe.prototype.writeInt32BE=function(t,e,i){return t=+t,e|=0,i||Gi(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),Qe.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):yi(this,t,e,!1),e+4},Qe.prototype.writeFloatLE=function(t,e,i){return gi(this,t,e,!0,i)},Qe.prototype.writeFloatBE=function(t,e,i){return gi(this,t,e,!1,i)},Qe.prototype.writeDoubleLE=function(t,e,i){return Wi(this,t,e,!0,i)},Qe.prototype.writeDoubleBE=function(t,e,i){return Wi(this,t,e,!1,i)},Qe.prototype.copy=function(t,e,i,l){if(i||(i=0),l||0===l||(l=this.length),e>=t.length&&(e=t.length),e||(e=0),l>0&&l<i&&(l=i),l===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(l<0)throw new RangeError("sourceEnd out of bounds");l>this.length&&(l=this.length),t.length-e<l-i&&(l=t.length-e+i);var n,o=l-i;if(this===t&&i<e&&e<l)for(n=o-1;n>=0;--n)t[n+e]=this[n+i];else if(o<1e3||!Qe.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)t[n+e]=this[n+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+o),e);return o},Qe.prototype.fill=function(t,e,i,l){if("string"==typeof t){if("string"==typeof e?(l=e,e=0,i=this.length):"string"==typeof i&&(l=i,i=this.length),1===t.length){var n=t.charCodeAt(0);n<256&&(t=n)}if(void 0!==l&&"string"!=typeof l)throw new TypeError("encoding must be a string");if("string"==typeof l&&!Qe.isEncoding(l))throw new TypeError("Unknown encoding: "+l)}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 o;if(e>>>=0,i=void 0===i?this.length:i>>>0,t||(t=0),"number"==typeof t)for(o=e;o<i;++o)this[o]=t;else{var d=qe(t)?t:Ri(new Qe(t,l).toString()),c=d.length;for(o=0;o<i-e;++o)this[o+e]=d[o%c]}return this};var Vi=/[^+\/0-9A-Za-z-_]/g;function Ci(t){return t<16?"0"+t.toString(16):t.toString(16)}function Ri(t,e){var i;e=e||1/0;for(var l=t.length,n=null,o=[],d=0;d<l;++d){if((i=t.charCodeAt(d))>55295&&i<57344){if(!n){if(i>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(d+1===l){(e-=3)>-1&&o.push(239,191,189);continue}n=i;continue}if(i<56320){(e-=3)>-1&&o.push(239,191,189),n=i;continue}i=65536+(n-55296<<10|i-56320)}else n&&(e-=3)>-1&&o.push(239,191,189);if(n=null,i<128){if((e-=1)<0)break;o.push(i)}else if(i<2048){if((e-=2)<0)break;o.push(i>>6|192,63&i|128)}else if(i<65536){if((e-=3)<0)break;o.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;o.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return o}function Si(t){return function(t){var e,i,l,n,o,d;Ue||Te();var c=t.length;if(c%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===t[c-2]?2:"="===t[c-1]?1:0,d=new Le(3*c/4-o),l=o>0?c-4:c;var a=0;for(e=0,i=0;e<l;e+=4,i+=3)n=He[t.charCodeAt(e)]<<18|He[t.charCodeAt(e+1)]<<12|He[t.charCodeAt(e+2)]<<6|He[t.charCodeAt(e+3)],d[a++]=n>>16&255,d[a++]=n>>8&255,d[a++]=255&n;return 2===o?(n=He[t.charCodeAt(e)]<<2|He[t.charCodeAt(e+1)]>>4,d[a++]=255&n):1===o&&(n=He[t.charCodeAt(e)]<<10|He[t.charCodeAt(e+1)]<<4|He[t.charCodeAt(e+2)]>>2,d[a++]=n>>8&255,d[a++]=255&n),d}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(Vi,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Ki(t,e,i,l){for(var n=0;n<l&&!(n+i>=e.length||n>=t.length);++n)e[n+i]=t[n];return n}function Yi(t){return null!=t&&(!!t._isBuffer||vi(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&vi(t.slice(0,0))}(t))}function vi(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var Ji=Object.freeze({__proto__:null,Buffer:Qe,INSPECT_MAX_BYTES:50,SlowBuffer:function(t){return+t!=t&&(t=0),Qe.alloc(+t)},isBuffer:Yi,kMaxLength:Pe}),fi=Je((function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){var e=t.length,i=e%4;if(!i)return t;var l=e,n=4-i,o=e+n,d=Qe.alloc(o);for(d.write(t);n--;)d.write("=",l++);return d.toString()}})),Ni=Je((function(t,e){function i(t,e){return void 0===e&&(e="utf8"),Qe.isBuffer(t)?n(t.toString("base64")):n(Qe.from(t,e).toString("base64"))}function l(t){return t=t.toString(),fi.default(t).replace(/\-/g,"+").replace(/_/g,"/")}function n(t){return t.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}Object.defineProperty(e,"__esModule",{value:!0});var o=i;o.encode=i,o.decode=function(t,e){return void 0===e&&(e="utf8"),Qe.from(l(t),"base64").toString(e)},o.toBase64=l,o.fromBase64=n,o.toBuffer=function(t){return Qe.from(l(t),"base64")},e.default=o})),Hi=Je((function(t){t.exports=Ni.default,t.exports.default=t.exports})),Li=Je((function(t,e){var i;t.exports=(i=i||function(t,e){var i=Object.create||function(){function t(){}return function(e){var i;return t.prototype=e,i=new t,t.prototype=null,i}}(),l={},n=l.lib={},o=n.Base={extend:function(t){var e=i(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),e.init.prototype=e,e.$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},d=n.WordArray=o.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||a).stringify(this)},concat:function(t){var e=this.words,i=t.words,l=this.sigBytes,n=t.sigBytes;if(this.clamp(),l%4)for(var o=0;o<n;o++){var d=i[o>>>2]>>>24-o%4*8&255;e[l+o>>>2]|=d<<24-(l+o)%4*8}else for(o=0;o<n;o+=4)e[l+o>>>2]=i[o>>>2];return this.sigBytes+=n,this},clamp:function(){var e=this.words,i=this.sigBytes;e[i>>>2]&=4294967295<<32-i%4*8,e.length=t.ceil(i/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(e){for(var i,l=[],n=function(e){e=e;var i=987654321,l=4294967295;return function(){var n=((i=36969*(65535&i)+(i>>16)&l)<<16)+(e=18e3*(65535&e)+(e>>16)&l)&l;return n/=4294967296,(n+=.5)*(t.random()>.5?1:-1)}},o=0;o<e;o+=4){var c=n(4294967296*(i||t.random()));i=987654071*c(),l.push(4294967296*c()|0)}return new d.init(l,e)}}),c=l.enc={},a=c.Hex={stringify:function(t){for(var e=t.words,i=t.sigBytes,l=[],n=0;n<i;n++){var o=e[n>>>2]>>>24-n%4*8&255;l.push((o>>>4).toString(16)),l.push((15&o).toString(16))}return l.join("")},parse:function(t){for(var e=t.length,i=[],l=0;l<e;l+=2)i[l>>>3]|=parseInt(t.substr(l,2),16)<<24-l%8*4;return new d.init(i,e/2)}},s=c.Latin1={stringify:function(t){for(var e=t.words,i=t.sigBytes,l=[],n=0;n<i;n++){var o=e[n>>>2]>>>24-n%4*8&255;l.push(String.fromCharCode(o))}return l.join("")},parse:function(t){for(var e=t.length,i=[],l=0;l<e;l++)i[l>>>2]|=(255&t.charCodeAt(l))<<24-l%4*8;return new d.init(i,e)}},Z=c.Utf8={stringify:function(t){try{return decodeURIComponent(escape(s.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return s.parse(unescape(encodeURIComponent(t)))}},r=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new d.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=Z.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var i=this._data,l=i.words,n=i.sigBytes,o=this.blockSize,c=n/(4*o),a=(c=e?t.ceil(c):t.max((0|c)-this._minBufferSize,0))*o,s=t.min(4*a,n);if(a){for(var Z=0;Z<a;Z+=o)this._doProcessBlock(l,Z);var r=l.splice(0,a);i.sigBytes-=s}return new d.init(r,s)},clone:function(){var t=o.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0}),u=(n.Hasher=r.extend({cfg:o.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){r.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){return t&&this._append(t),this._doFinalize()},blockSize:16,_createHelper:function(t){return function(e,i){return new t.init(i).finalize(e)}},_createHmacHelper:function(t){return function(e,i){return new u.HMAC.init(t,i).finalize(e)}}}),l.algo={});return l}(Math),i)})),Ui=Je((function(t,e){var i;t.exports=(i=Li,function(){if("function"==typeof ArrayBuffer){var t=i.lib.WordArray,e=t.init;(t.init=function(t){if(t instanceof ArrayBuffer&&(t=new Uint8Array(t)),(t instanceof Int8Array||"undefined"!=typeof Uint8ClampedArray&&t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)&&(t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),t instanceof Uint8Array){for(var i=t.byteLength,l=[],n=0;n<i;n++)l[n>>>2]|=t[n]<<24-n%4*8;e.call(this,l,i)}else e.apply(this,arguments)}).prototype=t}}(),i.lib.WordArray)})),Ti=function(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}(Je((function(t){!function(e,i){var l={};!function(t){t.__esModule=!0,t.digestLength=32,t.blockSize=64;var e=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function i(t,i,l,n,o){for(var d,c,a,s,Z,r,u,m,h,b,I,G,p;o>=64;){for(d=i[0],c=i[1],a=i[2],s=i[3],Z=i[4],r=i[5],u=i[6],m=i[7],b=0;b<16;b++)I=n+4*b,t[b]=(255&l[I])<<24|(255&l[I+1])<<16|(255&l[I+2])<<8|255&l[I+3];for(b=16;b<64;b++)G=((h=t[b-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,p=((h=t[b-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,t[b]=(G+t[b-7]|0)+(p+t[b-16]|0);for(b=0;b<64;b++)G=(((Z>>>6|Z<<26)^(Z>>>11|Z<<21)^(Z>>>25|Z<<7))+(Z&r^~Z&u)|0)+(m+(e[b]+t[b]|0)|0)|0,p=((d>>>2|d<<30)^(d>>>13|d<<19)^(d>>>22|d<<10))+(d&c^d&a^c&a)|0,m=u,u=r,r=Z,Z=s+G|0,s=a,a=c,c=d,d=G+p|0;i[0]+=d,i[1]+=c,i[2]+=a,i[3]+=s,i[4]+=Z,i[5]+=r,i[6]+=u,i[7]+=m,n+=64,o-=64}return n}var l=function(){function e(){this.digestLength=t.digestLength,this.blockSize=t.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return e.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},e.prototype.clean=function(){for(var t=0;t<this.buffer.length;t++)this.buffer[t]=0;for(t=0;t<this.temp.length;t++)this.temp[t]=0;this.reset()},e.prototype.update=function(t,e){if(void 0===e&&(e=t.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var l=0;if(this.bytesHashed+=e,this.bufferLength>0){for(;this.bufferLength<64&&e>0;)this.buffer[this.bufferLength++]=t[l++],e--;64===this.bufferLength&&(i(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(e>=64&&(l=i(this.temp,this.state,t,l,e),e%=64);e>0;)this.buffer[this.bufferLength++]=t[l++],e--;return this},e.prototype.finish=function(t){if(!this.finished){var e=this.bytesHashed,l=this.bufferLength,n=e/536870912|0,o=e<<3,d=e%64<56?64:128;this.buffer[l]=128;for(var c=l+1;c<d-8;c++)this.buffer[c]=0;this.buffer[d-8]=n>>>24&255,this.buffer[d-7]=n>>>16&255,this.buffer[d-6]=n>>>8&255,this.buffer[d-5]=n>>>0&255,this.buffer[d-4]=o>>>24&255,this.buffer[d-3]=o>>>16&255,this.buffer[d-2]=o>>>8&255,this.buffer[d-1]=o>>>0&255,i(this.temp,this.state,this.buffer,0,d),this.finished=!0}for(c=0;c<8;c++)t[4*c+0]=this.state[c]>>>24&255,t[4*c+1]=this.state[c]>>>16&255,t[4*c+2]=this.state[c]>>>8&255,t[4*c+3]=this.state[c]>>>0&255;return this},e.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},e.prototype._saveState=function(t){for(var e=0;e<this.state.length;e++)t[e]=this.state[e]},e.prototype._restoreState=function(t,e){for(var i=0;i<this.state.length;i++)this.state[i]=t[i];this.bytesHashed=e,this.finished=!1,this.bufferLength=0},e}();t.Hash=l;var n=function(){function t(t){this.inner=new l,this.outer=new l,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var e=new Uint8Array(this.blockSize);if(t.length>this.blockSize)(new l).update(t).finish(e).clean();else for(var i=0;i<t.length;i++)e[i]=t[i];for(i=0;i<e.length;i++)e[i]^=54;for(this.inner.update(e),i=0;i<e.length;i++)e[i]^=106;for(this.outer.update(e),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate),i=0;i<e.length;i++)e[i]=0}return t.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},t.prototype.clean=function(){for(var t=0;t<this.istate.length;t++)this.ostate[t]=this.istate[t]=0;this.inner.clean(),this.outer.clean()},t.prototype.update=function(t){return this.inner.update(t),this},t.prototype.finish=function(t){return this.outer.finished?this.outer.finish(t):(this.inner.finish(t),this.outer.update(t,this.digestLength).finish(t)),this},t.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},t}();function o(t){var e=(new l).update(t),i=e.digest();return e.clean(),i}function d(t,e){var i=new n(t).update(e),l=i.digest();return i.clean(),l}function c(t,e,i,l){var n=l[0];if(0===n)throw new Error("hkdf: cannot expand more");e.reset(),n>1&&e.update(t),i&&e.update(i),e.update(l),e.finish(t),l[0]++}t.HMAC=n,t.hash=o,t.default=o,t.hmac=d;var a=new Uint8Array(t.digestLength);t.hkdf=function(t,e,i,l){void 0===e&&(e=a),void 0===l&&(l=32);for(var o=new Uint8Array([1]),s=d(e,t),Z=new n(s),r=new Uint8Array(Z.digestLength),u=r.length,m=new Uint8Array(l),h=0;h<l;h++)u===r.length&&(c(r,Z,i,o),u=0),m[h]=r[u++];return Z.clean(),r.fill(0),o.fill(0),m},t.pbkdf2=function(t,e,i,l){for(var o=new n(t),d=o.digestLength,c=new Uint8Array(4),a=new Uint8Array(d),s=new Uint8Array(d),Z=new Uint8Array(l),r=0;r*d<l;r++){var u=r+1;c[0]=u>>>24&255,c[1]=u>>>16&255,c[2]=u>>>8&255,c[3]=u>>>0&255,o.reset(),o.update(e),o.update(c),o.finish(s);for(var m=0;m<d;m++)a[m]=s[m];for(m=2;m<=i;m++){o.reset(),o.update(s).finish(s);for(var h=0;h<d;h++)a[h]^=s[h]}for(m=0;m<d&&r*d+m<l;m++)Z[r*d+m]=a[m]}for(r=0;r<d;r++)a[r]=s[r]=0;for(r=0;r<4;r++)c[r]=0;return o.clean(),Z}}(l);var n=l.default;for(var o in l)n[o]=l[o];t.exports=n}()})));function ki(){throw new Error("setTimeout has not been defined")}function Bi(){throw new Error("clearTimeout has not been defined")}var xi=ki,wi=Bi;function Fi(t){if(xi===setTimeout)return setTimeout(t,0);if((xi===ki||!xi)&&setTimeout)return xi=setTimeout,setTimeout(t,0);try{return xi(t,0)}catch(e){try{return xi.call(null,t,0)}catch(e){return xi.call(this,t,0)}}}"function"==typeof fe.setTimeout&&(xi=setTimeout),"function"==typeof fe.clearTimeout&&(wi=clearTimeout);var zi,Pi=[],Ai=!1,Mi=-1;function Qi(){Ai&&zi&&(Ai=!1,zi.length?Pi=zi.concat(Pi):Mi=-1,Pi.length&&ji())}function ji(){if(!Ai){var t=Fi(Qi);Ai=!0;for(var e=Pi.length;e;){for(zi=Pi,Pi=[];++Mi<e;)zi&&zi[Mi].run();Mi=-1,e=Pi.length}zi=null,Ai=!1,function(t){if(wi===clearTimeout)return clearTimeout(t);if((wi===Bi||!wi)&&clearTimeout)return wi=clearTimeout,clearTimeout(t);try{wi(t)}catch(e){try{return wi.call(null,t)}catch(e){return wi.call(this,t)}}}(t)}}function Ei(t,e){this.fun=t,this.array=e}Ei.prototype.run=function(){this.fun.apply(null,this.array)};var Di=fe.performance||{},Oi=(Di.now||Di.mozNow||Di.msNow||Di.oNow||Di.webkitNow,new Date,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];Pi.push(new Ei(t,e)),1!==Pi.length||Ai||Fi(ji)}),_i=function(t){if(t.__esModule)return t;var e=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(t).forEach((function(i){var l=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,l.get?l:{enumerable:!0,get:function(){return t[i]}})})),e}(Ji),qi=Je((function(t,e){var i=_i.Buffer;function l(t,e){for(var i in t)e[i]=t[i]}function n(t,e,l){return i(t,e,l)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=_i:(l(_i,e),e.Buffer=n),l(i,n),n.from=function(t,e,l){if("number"==typeof t)throw new TypeError("Argument must not be a number");return i(t,e,l)},n.alloc=function(t,e,l){if("number"!=typeof t)throw new TypeError("Argument must be a number");var n=i(t);return void 0!==e?"string"==typeof l?n.fill(e,l):n.fill(e):n.fill(0),n},n.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return i(t)},n.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return _i.SlowBuffer(t)}})),$i=Je((function(t){var e=65536,i=qi.Buffer,l=ve.crypto||ve.msCrypto;l&&l.getRandomValues?t.exports=function(t,n){if(t>4294967295)throw new RangeError("requested too many random bytes");var o=i.allocUnsafe(t);if(t>0)if(t>e)for(var d=0;d<t;d+=e)l.getRandomValues(o.slice(d,d+e));else l.getRandomValues(o);return"function"==typeof n?Oi((function(){n(null,o)})):o}:t.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}}));const tl=new TextEncoder,el=new TextDecoder;var il=function(){if("undefined"!=typeof globalThis)return globalThis;if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;throw new Error("unable to locate global object")}();const ll=t=>{let e=t;return e instanceof Uint8Array&&(e=el.decode(e)),e=e.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,""),new Uint8Array(il.atob(e).split("").map((t=>t.charCodeAt(0))))};class nl extends Error{constructor(t){super(t),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}class ol extends nl{constructor(t,e="unspecified",i="unspecified"){super(t),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=e,this.reason=i}}class dl extends nl{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}}class cl extends nl{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}}class al extends nl{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}}class sl extends nl{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}}class Zl extends nl{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}}class rl extends ol{constructor(){super(...arguments),this.code="ERR_JWT_EXPIRED"}}var ul=il.crypto;function ml(){if(!il.isSecureContext&&!il.crypto.subtle)throw new nl("Web Cryptography API is available only in Secure Contexts. See: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts")}const hl=async t=>{var e,i;const{algorithm:l,keyUsages:n}=function(t){let e,i;switch(t.kty){case"oct":switch(t.alg){case"HS256":case"HS384":case"HS512":e={name:"HMAC",hash:`SHA-${t.alg.substr(-3)}`},i=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new cl(`${t.alg} keys cannot be imported as CryptoKey instances`);case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":e={name:"AES-GCM"},i=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":e={name:"AES-KW"},i=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":e={name:"PBKDF2"},i=["deriveBits"];break;default:throw new cl('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(t.alg){case"PS256":case"PS384":case"PS512":e={name:"RSA-PSS",hash:`SHA-${t.alg.substr(-3)}`},i=t.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":e={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${t.alg.substr(-3)}`},i=t.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":e={name:"RSA-OAEP",hash:`SHA-${parseInt(t.alg.substr(-3),10)||1}`},i=t.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new cl('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(t.alg){case"ES256":case"ES384":case"ES512":e={name:"ECDSA",namedCurve:t.crv},i=t.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":e={name:"ECDH",namedCurve:t.crv},i=t.d?["deriveBits"]:[];break;default:throw new cl('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;default:throw new cl('unsupported or invalid JWK "kty" (Key Type) Parameter value')}return{algorithm:e,keyUsages:i}}(t);let o="jwk",d={...t};return delete d.alg,"PBKDF2"===l.name&&(o="raw",d=ll(t.k)),ml(),ul.subtle.importKey(o,d,l,null!==(e=t.ext)&&void 0!==e&&e,null!==(i=t.key_ops)&&void 0!==i?i:n)};function bl(t){return!!t&&t.constructor===Object}async function Il(t,e,i){if(!bl(t))throw new TypeError("JWK must be an object");if(e||(e=t.alg),"string"!=typeof e||!e)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(t.kty){case"oct":if("string"!=typeof t.k||!t.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=i||(i=!0!==t.ext),i?hl({...t,alg:e,ext:!1}):ll(t.k);case"RSA":if(void 0!==t.oth)throw new cl('RSA JWK "oth" (Other Primes Info) Parameter value is unsupported');case"EC":case"OKP":return hl({...t,alg:e});default:throw new cl('unsupported "kty" (Key Type) Parameter value')}}const Gl=function(t,e,i,l){if(void 0!==l.crit&&void 0===i.crit)throw new t('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some((t=>"string"!=typeof t||0===t.length)))throw new t('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');for(const n of i.crit){if(!e.has(n))throw new cl(`Extension Header Parameter "${n}" is not supported by this implementation`);if(void 0===l[n])throw new t(`Extension Header Parameter "${n}" is missing`);if(e.get(n)&&void 0===i[n])throw new t(`Extension Header Parameter "${n}" MUST be integrity protected`)}return new Set(i.crit)}.bind(void 0,al,new Map([["b64",!0]])),pl=((t,e)=>{if(void 0!==e&&(!Array.isArray(e)||e.some((t=>"string"!=typeof t))))throw new TypeError(`"${t}" option must be an array of strings`);if(e)return new Set(e)}).bind(void 0,"algorithms");async function yl(t,e,i){if(!bl(t))throw new al("Flattened JWS must be an object");if(void 0===t.protected&&void 0===t.header)throw new al('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==t.protected&&"string"!=typeof t.protected)throw new al("JWS Protected Header incorrect type");if(void 0===t.payload)throw new al("JWS Payload missing");if("string"!=typeof t.signature)throw new al("JWS Signature missing or incorrect type");if(void 0!==t.header&&!bl(t.header))throw new al("JWS Unprotected Header incorrect type");let l={};if(t.protected){const e=ll(t.protected);l=JSON.parse(el.decode(e))}if(!((...t)=>{const e=t.filter(Boolean);if(0===e.length||1===e.length)return!0;let i;for(const t of e){const e=Object.keys(t);if(i&&0!==i.size)for(const t of e){if(i.has(t))return!1;i.add(t)}else i=new Set(e)}return!0})(l,t.header))throw new al("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const n={...l,...t.header};let o=!0;if(Gl(l,n).has("b64")&&(o=l.b64,"boolean"!=typeof o))throw new al('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:d}=n;if("string"!=typeof d||!d)throw new al('JWS "alg" (Algorithm) Header Parameter missing or invalid');const c=i&&pl(i.algorithms);if(c&&!c.has(d))throw new dl('"alg" (Algorithm) Header Parameter not allowed');if(o){if("string"!=typeof t.payload)throw new al("JWS Payload must be a string")}else if("string"!=typeof t.payload&&!(t.payload instanceof Uint8Array))throw new al("JWS Payload must be a string or an Uint8Array instance");"function"==typeof e&&(e=await e(l,t)),((t,e)=>{if(t.startsWith("HS")||"dir"===t||t.startsWith("PBES2")||t.match(/^A\d{3}(?:GCM)KW$/)){if(e instanceof Uint8Array||"secret"===e.type)return;throw new TypeError('CryptoKey or KeyObject instances for symmetric algorithms must be of type "secret"')}if(e instanceof Uint8Array)throw new TypeError("CryptoKey or KeyObject instances must be used for asymmetric algorithms");if("secret"===e.type)throw new TypeError('CryptoKey or KeyObject instances for asymmetric algorithms must not be of type "secret"')})(d,e);const a=function(...t){const e=t.reduce(((t,{length:e})=>t+e),0),i=new Uint8Array(e);let l=0;return t.forEach((t=>{i.set(t,l),l+=t.length})),i}(tl.encode(t.protected||""),tl.encode("."),"string"==typeof t.payload?tl.encode(t.payload):t.payload),s=ll(t.signature);if(!await(async(t,e,i,l)=>{let n;if(ml(),e instanceof Uint8Array){if(!t.startsWith("HS"))throw new TypeError("symmetric keys are only applicable for HMAC-based algorithms");n=await ul.subtle.importKey("raw",e,{hash:`SHA-${t.substr(-3)}`,name:"HMAC"},!1,["verify"])}else n=e;return((t,e)=>{if(t.startsWith("HS")){const i=parseInt(t.substr(-3),10),{length:l}=e.algorithm;if("number"!=typeof l||l<i)throw new TypeError(`${t} requires symmetric keys to be ${i} bits or larger`)}if(t.startsWith("RS")||t.startsWith("PS")){const{modulusLength:i}=e.algorithm;if("number"!=typeof i||i<2048)throw new TypeError(`${t} requires key modulusLength to be 2048 bits or larger`)}})(t,n),ul.subtle.verify(function(t){switch(t){case"HS256":return{hash:"SHA-256",name:"HMAC"};case"HS384":return{hash:"SHA-384",name:"HMAC"};case"HS512":return{hash:"SHA-512",name:"HMAC"};case"PS256":return{hash:"SHA-256",name:"RSA-PSS",saltLength:32};case"PS384":return{hash:"SHA-384",name:"RSA-PSS",saltLength:48};case"PS512":return{hash:"SHA-512",name:"RSA-PSS",saltLength:64};case"RS256":return{hash:"SHA-256",name:"RSASSA-PKCS1-v1_5"};case"RS384":return{hash:"SHA-384",name:"RSASSA-PKCS1-v1_5"};case"RS512":return{hash:"SHA-512",name:"RSASSA-PKCS1-v1_5"};case"ES256":return{hash:"SHA-256",name:"ECDSA",namedCurve:"P-256"};case"ES384":return{hash:"SHA-384",name:"ECDSA",namedCurve:"P-384"};case"ES512":return{hash:"SHA-512",name:"ECDSA",namedCurve:"P-521"};default:throw new cl(`alg ${t} is unsupported either by JOSE or your javascript runtime`)}}(t),n,i,l)})(d,e,s,a))throw new Zl;let Z;Z=o?ll(t.payload):"string"==typeof t.payload?tl.encode(t.payload):t.payload;const r={payload:Z};return void 0!==t.protected&&(r.protectedHeader=l),void 0!==t.header&&(r.unprotectedHeader=t.header),r}const Xl=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var gl=t=>{const e=Xl.exec(t);if(!e)throw new TypeError("invalid time period format");const i=parseFloat(e[1]);switch(e[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(i);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*i);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*i);case"day":case"days":case"d":return Math.round(86400*i);case"week":case"weeks":case"w":return Math.round(604800*i);default:return Math.round(31557600*i)}};const Wl=t=>t.toLowerCase().replace(/^application\//,"");var Vl=(t,e,i={})=>{const{typ:l}=i;if(l&&("string"!=typeof t.typ||Wl(t.typ)!==Wl(l)))throw new ol('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(el.decode(e))}catch(t){}if("object"!=typeof n||!n||Array.isArray(n))throw new sl("JWT Claims Set must be a top-level JSON object");const{issuer:o}=i;if(o&&!("string"==typeof o?[o]:o).includes(n.iss))throw new ol('unexpected "iss" claim value',"iss","check_failed");const{subject:d}=i;if(d&&n.sub!==d)throw new ol('unexpected "sub" claim value',"sub","check_failed");const{audience:c}=i;if(c&&(s="string"==typeof c?[c]:c,!("string"==typeof(a=n.aud)?s.includes(a):s.some(Set.prototype.has.bind(new Set(a))))))throw new ol('unexpected "aud" claim value',"aud","check_failed");var a,s;let Z;switch(typeof i.clockTolerance){case"string":Z=gl(i.clockTolerance);break;case"number":Z=i.clockTolerance;break;case"undefined":Z=0;break;default:throw new TypeError("invalid clockTolerance option type")}const{currentDate:r}=i,u=(m=r||new Date,Math.floor(m.getTime()/1e3));var m;if(void 0!==n.iat||i.maxTokenAge){if("number"!=typeof n.iat)throw new ol('"iat" claim must be a number',"iat","invalid");if(void 0===n.exp&&n.iat>u+Z)throw new ol('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new ol('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>u+Z)throw new ol('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new ol('"exp" claim must be a number',"exp","invalid");if(n.exp<=u-Z)throw new rl('"exp" claim timestamp check failed',"exp","check_failed")}if(i.maxTokenAge){const t=u-n.iat;if(t-Z>("number"==typeof i.maxTokenAge?i.maxTokenAge:gl(i.maxTokenAge)))throw new rl('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(t<0-Z)throw new ol('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};const Cl=require("secure-random-bytes");class Rl{constructor(){}static base64URLEncode(t){return Hi.encode(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}static getCodeVerifier(t){switch(t){case Se.Node:return this.base64URLEncode(Cl(32));case Se.Browser:return this.base64URLEncode($i(32));case Se.ReactNative:return this.base64URLEncode(Ui.random(32).toString());default:return this.base64URLEncode($i(32))}}static getCodeChallenge(t){return this.base64URLEncode(new I(Ti((new TextEncoder).encode(t))))}static getSupportedSignatureAlgorithms(){return["RS256","RS512","RS384","PS256"]}static getJWKForTheIdToken(t,e){const i=JSON.parse(Hi.decode(t,"utf8"));for(const t of e)if(i.kid===t.kid)return Il({alg:t.alg,e:t.e,kty:t.kty,n:t.n});return Promise.reject(new Ke("CRYPTO_UTIL-GTFTIT-IV01","crypto-utils","getJWKForTheIdToken","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+i.kid+", Expected values: "+e.map((t=>t.kid)).join(", ")))}static isValidIdToken(t,e,i,l,n,o){return async function(t,e,i){const l=await async function(t,e,i){if(t instanceof Uint8Array&&(t=el.decode(t)),"string"!=typeof t)throw new al("Compact JWS must be a string or Uint8Array");const{0:l,1:n,2:o,length:d}=t.split(".");if(3!==d)throw new al("Invalid Compact JWS");const c=await yl({payload:n||void 0,protected:l||void 0,signature:o||void 0},e,i);return{payload:c.payload,protectedHeader:c.protectedHeader}}(t,e,i);return{payload:Vl(l.protectedHeader,l.payload,i),protectedHeader:l.protectedHeader}}(t,e,{algorithms:this.getSupportedSignatureAlgorithms(),audience:i,clockTolerance:o,issuer:l,subject:n}).then((()=>Promise.resolve(!0))).catch((t=>Promise.reject(new Ke("CRYPTO_UTIL-IVIT-IV02","crypto-utils","isValidIdToken","Validating ID token failed",t))))}static decodeIDToken(t){try{const e=Hi.decode(t.split(".")[1],"utf8");return JSON.parse(e)}catch(t){throw new Ke("CRYPTO_UTIL-DIT-IV01","crypto-utils","decodeIDToken","Decoding ID token failed.",t)}}}class Sl{constructor(){}static getAuthenticatedUserInfo(t){var e,i,l,n;const o=Rl.decodeIDToken(t),d=this.getTenantDomainFromIdTokenPayload(o),c=null!==(e=null==o?void 0:o.username)&&void 0!==e?e:"",a=null!==(i=o.given_name)&&void 0!==i?i:"",s=null!==(l=o.family_name)&&void 0!==l?l:"",Z=a&&s?`${a} ${s}`:a||s||"",r=null!==(n=o.preferred_username)&&void 0!==n?n:Z;return Object.assign({displayName:r,tenantDomain:d,username:c},this.filterClaimsFromIDTokenPayload(o))}static filterClaimsFromIDTokenPayload(t){const e=Object.assign({},t);null==e||delete e.iss,null==e||delete e.aud,null==e||delete e.exp,null==e||delete e.iat,null==e||delete e.acr,null==e||delete e.amr,null==e||delete e.azp,null==e||delete e.auth_time,null==e||delete e.nonce,null==e||delete e.c_hash,null==e||delete e.at_hash,null==e||delete e.nbf,null==e||delete e.isk,null==e||delete e.sid;const i={};return Object.entries(e).forEach((([t,e])=>{const l=t.split("_").map(((t,e)=>0===e?t:[t[0].toUpperCase(),...t.slice(1)].join(""))).join("");i[l]=e})),i}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}}Sl.getTenantDomainFromIdTokenPayload=(t,e="@")=>{const i=t.sub.split(e);return i.length>2?i[i.length-1]:""};class Kl{constructor(t){this._dataLayer=t,this._config=()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}resolveWellKnownEndpoint(){return Xe(this,void 0,void 0,(function*(){const t=yield this._config();return t.wellKnownEndpoint?t.serverOrigin+t.wellKnownEndpoint:t.serverOrigin+"/oauth2/token/.well-known/openid-configuration"}))}resolveEndpoints(t){return Xe(this,void 0,void 0,(function*(){const e={},i=yield this._config();return i.overrideWellEndpointConfig&&i.endpoints&&Object.keys(i.endpoints).forEach((t=>{const l=t.replace(/[A-Z]/g,(t=>`_${t.toLowerCase()}`));e[l]=(null==i?void 0:i.endpoints)?i.endpoints[t]:""})),Object.assign(Object.assign({},t),e)}))}resolveFallbackEndpoints(){return Xe(this,void 0,void 0,(function*(){const t={},e=yield this._config();e.endpoints&&Object.keys(e.endpoints).forEach((i=>{const l=i.replace(/[A-Z]/g,(t=>`_${t.toLowerCase()}`));t[l]=(null==e?void 0:e.endpoints)?e.endpoints[i]:""}));const i={authorization_endpoint:e.serverOrigin+"/oauth2/authorize",end_session_endpoint:e.serverOrigin+"/oidc/logout",jwks_uri:e.serverOrigin+"/oauth2/jwks",check_session_iframe:e.serverOrigin+"/oidc/checksession",revocation_endpoint:e.serverOrigin+"/oauth2/revoke",token_endpoint:e.serverOrigin+"/oauth2/token"};return Object.assign(Object.assign({},t),i)}))}validateIdToken(t){return Xe(this,void 0,void 0,(function*(){const e=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();return e&&0!==e.trim().length?ye.get(e,{withCredentials:null==i?void 0:i.sendCookiesInRequests}).then((e=>Xe(this,void 0,void 0,(function*(){if(200!==e.status)return Promise.reject(new Ke("AUTH_HELPER-VIT-NR02","authentication-helper","validateIdToken","Invalid response status received for jwks request.","The request sent to get the jwks returned "+e.status+" , which is invalid."));const i=(yield this._oidcProviderMetaData()).issuer,l=(yield this.resolveWellKnownEndpoint()).split("/.well-known")[0];return i&&i===l?Rl.getJWKForTheIdToken(t.split(".")[0],e.data.keys).then((e=>Xe(this,void 0,void 0,(function*(){return Rl.isValidIdToken(t,e,(yield this._config()).clientID,i,Rl.decodeIDToken(t).sub,(yield this._config()).clockTolerance).then((t=>t)).catch((t=>Promise.reject(new Ke("AUTH_HELPER-VIT-ES03","authentication-helper","validateIdToken",void 0,void 0,t))))})))).catch((t=>Promise.reject(new Ke("AUTH_HELPER-VIT-ES04","authentication-helper","validateIdToken",void 0,void 0,t)))):Promise.resolve(!1)})))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_HELPER-VIT-NR05","authentication-helper","validateIdToken","Request to jwks endpoint failed.","The request sent to get the jwks from the server failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))})):Promise.reject(new Ke("AUTH_HELPER-VIT-NF01","authentication-helper","validateIdToken","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty."))}))}replaceCustomGrantTemplateTags(t){var e;return Xe(this,void 0,void 0,(function*(){let i="openid";const l=yield this._config(),n=yield this._dataLayer.getSessionData();return l.scope&&l.scope.length>0&&(l.scope.includes("openid")||l.scope.push("openid"),i=l.scope.join(" ")),t.replace("{{token}}",n.access_token).replace("{{username}}",Sl.getAuthenticatedUserInfo(n.id_token).username).replace("{{scope}}",i).replace("{{clientID}}",l.clientID).replace("{{clientSecret}}",null!==(e=l.clientSecret)&&void 0!==e?e:"")}))}clearUserSessionData(){return Xe(this,void 0,void 0,(function*(){yield this._dataLayer.removeOIDCProviderMetaData(),yield this._dataLayer.removeTemporaryData(),yield this._dataLayer.removeSessionData()}))}handleTokenResponse(t){return Xe(this,void 0,void 0,(function*(){if(200!==t.status)return Promise.reject(new Ke("AUTH_HELPER-HTR-NR01","authentication-helper","handleTokenResponse","Invalid response status received for token request.","The request sent to get the token returned "+t.status+" , which is invalid."));if((yield this._config()).validateIDToken)return this.validateIdToken(t.data.id_token).then((e=>Xe(this,void 0,void 0,(function*(){if(e){yield this._dataLayer.setSessionData(t.data);const e={accessToken:t.data.access_token,expiresIn:t.data.expires_in,idToken:t.data.id_token,refreshToken:t.data.refresh_token,scope:t.data.scope,tokenType:t.data.token_type};return Promise.resolve(e)}return Promise.reject(new Ke("AUTH_HELPER-HTR-IV02","authentication-helper","handleTokenResponse","The id token returned is not valid.","The id token returned has failed the validation check."))})))).catch((t=>Promise.reject(new Ke("AUTH_HELPER-HAT-ES03","authentication-helper","handleTokenResponse",void 0,void 0,t))));{const e={accessToken:t.data.access_token,expiresIn:t.data.expires_in,idToken:t.data.id_token,refreshToken:t.data.refresh_token,scope:t.data.scope,tokenType:t.data.token_type};return yield this._dataLayer.setSessionData(t.data),Promise.resolve(e)}}))}}class Yl{constructor(t){this._authenticationHelper=new Kl(t),this._dataLayer=t,this._config=()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURL(t){return Xe(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint"),i=yield this._config();if(!e||0===e.trim().length)throw new Ke("AUTH_CORE-GAU-NF01","authentication-core","getAuthorizationURL","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const l=new URL(e);l.searchParams.append("response_type","code"),l.searchParams.append("client_id",i.clientID);let n="openid";if(i.scope&&i.scope.length>0&&(i.scope.includes("openid")||i.scope.push("openid"),n=i.scope.join(" ")),l.searchParams.append("scope",n),l.searchParams.append("redirect_uri",i.signInRedirectURL),i.responseMode&&l.searchParams.append("response_mode",i.responseMode),i.enablePKCE){const t=Rl.getCodeVerifier(i.runtimeEnvironment),e=Rl.getCodeChallenge(t);yield this._dataLayer.setTemporaryDataParameter("pkce_code_verifier",t),l.searchParams.append("code_challenge_method","S256"),l.searchParams.append("code_challenge",e)}i.prompt&&l.searchParams.append("prompt",i.prompt);const o=t;if(o)for(const[t,e]of Object.entries(o))""!=t&&""!=e&&l.searchParams.append(t,e.toString());return l.toString()}))}requestAccessToken(t,e){return Xe(this,void 0,void 0,(function*(){const i=(yield this._oidcProviderMetaData()).token_endpoint,l=yield this._config();if(!i||0===i.trim().length)return Promise.reject(new Ke("AUTH_CORE-RAT1-NF01","authentication-core","requestAccessToken","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty."));e&&(yield this._dataLayer.setSessionDataParameter("session_state",e));const n=[];n.push(`client_id=${l.clientID}`),l.clientSecret&&l.clientSecret.trim().length>0&&n.push(`client_secret=${l.clientSecret}`);const o=t;return n.push(`code=${o}`),n.push("grant_type=authorization_code"),n.push(`redirect_uri=${l.signInRedirectURL}`),l.enablePKCE&&(n.push(`code_verifier=${yield this._dataLayer.getTemporaryDataParameter("pkce_code_verifier")}`),yield this._dataLayer.removeTemporaryDataParameter("pkce_code_verifier")),ye.post(i,n.join("&"),{headers:Sl.getTokenRequestHeaders(),withCredentials:l.sendCookiesInRequests}).then((t=>this._authenticationHelper.handleTokenResponse(t).then((t=>t)).catch((t=>Promise.reject(new Ke("AUTH_CORE-RAT1-ES02","authentication-core","requestAccessToken",void 0,void 0,t)))))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_CORE-RAT1-NR03","authentication-core","requestAccessToken","Requesting access token failed","The request to get the access token from the server failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))}))}))}refreshAccessToken(){return Xe(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,e=yield this._config(),i=yield this._dataLayer.getSessionData();if(!i.refresh_token)return Promise.reject(new Ke("AUTH_CORE-RAT2-NF01","authentication-core","refreshAccessToken","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled."));if(!t||0===t.trim().length)return Promise.reject(new Ke("AUTH_CORE-RAT2-NF02","authentication-core","refreshAccessToken","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty."));const l=[];return l.push(`client_id=${e.clientID}`),l.push(`refresh_token=${i.refresh_token}`),l.push("grant_type=refresh_token"),e.clientSecret&&e.clientSecret.trim().length>0&&l.push(`client_secret=${e.clientSecret}`),ye.post(t,l.join("&"),{headers:Sl.getTokenRequestHeaders(),withCredentials:e.sendCookiesInRequests}).then((t=>this._authenticationHelper.handleTokenResponse(t).then((t=>t)).catch((t=>Promise.reject(new Ke("AUTH_CORE-RAT2-ES03","authentication-core","refreshAccessToken",void 0,void 0,t)))))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_CORE-RAT2-NR03","authentication-core","refreshAccessToken","Refresh access token request failed.","The request to refresh the access token failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))}))}))}revokeAccessToken(){return Xe(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,e=yield this._config();if(!t||0===t.trim().length)return Promise.reject(new Ke("AUTH_CORE-RAT3-NF01","authentication-core","revokeAccessToken","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty."));const i=[];return i.push(`client_id=${e.clientID}`),i.push(`token=${(yield this._dataLayer.getSessionData()).access_token}`),i.push("token_type_hint=access_token"),ye.post(t,i.join("&"),{headers:Sl.getTokenRequestHeaders(),withCredentials:e.sendCookiesInRequests}).then((t=>200!==t.status?Promise.reject(new Ke("AUTH_CORE-RAT3-NR02","authentication-core","revokeAccessToken","Invalid response status received for revoke access token request.","The request sent to revoke the access token returned "+t.status+" , which is invalid.")):(this._authenticationHelper.clearUserSessionData(),Promise.resolve(t)))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_CORE-RAT3-NR03","authentication-core","revokeAccessToken","The request to revoke access token failed.","The request sent to revoke the access token failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))}))}))}requestCustomGrant(t){return Xe(this,void 0,void 0,(function*(){const e=yield this._oidcProviderMetaData(),i=yield this._config();let l;if(l=t.tokenEndpoint&&0!==t.tokenEndpoint.trim().length?t.tokenEndpoint:e.token_endpoint,!l||0===l.trim().length)return Promise.reject(new Ke("AUTH_CORE-RCG-NF01","authentication-core","requestCustomGrant","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty."));const n={data:(yield Promise.all(Object.entries(t.data).map((([t,e])=>Xe(this,void 0,void 0,(function*(){const i=yield this._authenticationHelper.replaceCustomGrantTemplateTags(e);return`${t}=${i}`})))))).join("&"),headers:Object.assign({},Sl.getTokenRequestHeaders()),method:"POST",url:l,withCredentials:i.sendCookiesInRequests};return t.attachToken&&(n.headers=Object.assign(Object.assign({},n.headers),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData()).access_token}`})),ye(n).then((e=>200!==e.status?Promise.reject(new Ke("AUTH_CORE-RCG-NR02","authentication-core","requestCustomGrant","Invalid response status received for the custom grant request.","The request sent to get the custom grant returned "+e.status+" , which is invalid.")):t.returnsSession?this._authenticationHelper.handleTokenResponse(e).then((t=>t)).catch((t=>Promise.reject(new Ke("AUTH_CORE-RCG-ES03","authentication-core","requestCustomGrant",void 0,void 0,t)))):Promise.resolve(e))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_CORE-RCG-NR04","authentication-core","requestCustomGrant","The custom grant request failed.","The request sent to get the custom grant failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))}))}))}getBasicUserInfo(){return Xe(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(),e=Sl.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let i={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(e).forEach((t=>{void 0!==e[t]&&""!==e[t]&&null!==e[t]||delete e[t]})),i=Object.assign(Object.assign({},i),e),i}))}getDecodedIDToken(){return Xe(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData()).id_token;return Rl.decodeIDToken(t)}))}getIDToken(){return Xe(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData()).id_token}))}getOIDCProviderMetaData(t){return Xe(this,void 0,void 0,(function*(){if(!t&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve(!0);const e=yield this._authenticationHelper.resolveWellKnownEndpoint();return ye.get(e).then((t=>Xe(this,void 0,void 0,(function*(){return 200!==t.status?Promise.reject(new Ke("AUTH_CORE-GOPM-NR01","authentication-core","getOIDCProviderMetaData","Invalid response status received for OIDC provider meta data request.","The request sent to the well-known endpoint to get the OIDC provider meta data returned "+t.status+" , which is invalid.")):(yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(t.data)),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve(!0))})))).catch((()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveFallbackEndpoints()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve(!0)}))))}))}getOIDCServiceEndpoints(){return Xe(this,void 0,void 0,(function*(){const t=yield this._oidcProviderMetaData();return{authorizationEndpoint:t.authorization_endpoint,checkSessionIframe:t.check_session_iframe,endSessionEndpoint:t.end_session_endpoint,introspectionEndpoint:t.introspection_endpoint,issuer:t.issuer,jwksUri:t.jwks_uri,registrationEndpoint:t.registration_endpoint,revocationEndpoint:t.revocation_endpoint,tokenEndpoint:t.token_endpoint,userinfoEndpoint:t.userinfo_endpoint,wellKnownEndpoint:yield this._authenticationHelper.resolveWellKnownEndpoint()}}))}getSignOutURL(){var t,e,i;return Xe(this,void 0,void 0,(function*(){const l=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,n=yield this._config();if(!l||0===l.trim().length)throw new Ke("AUTH_CORE-GSOU-NF01","authentication-core","getSignOutURL","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const o=null===(e=yield this._dataLayer.getSessionData())||void 0===e?void 0:e.id_token;if(!o||0===o.trim().length)throw new Ke("AUTH_CORE-GSOU-NF02","authentication-core","getSignOutURL","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");const d=null!==(i=null==n?void 0:n.signOutRedirectURL)&&void 0!==i?i:null==n?void 0:n.signInRedirectURL;if(!d||0===d.trim().length)throw new Ke("AUTH_CORE-GSOU-NF03","authentication-core","getSignOutURL","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");return`${l}?id_token_hint=${o}&post_logout_redirect_uri=${d}&state=sign_out_success`}))}signOut(){return Xe(this,void 0,void 0,(function*(){const t=yield this.getSignOutURL();return this._authenticationHelper.clearUserSessionData(),t}))}getAccessToken(){var t;return Xe(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData())||void 0===t?void 0:t.access_token}))}isAuthenticated(){return Xe(this,void 0,void 0,(function*(){return Boolean(yield this.getAccessToken())}))}getPKCECode(){return Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter("pkce_code_verifier")}))}setPKCECode(t){return Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter("pkce_code_verifier",t)}))}updateConfig(t){return Xe(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(t),t.overrideWellEndpointConfig?(null==t?void 0:t.endpoints)&&(yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints({}))):(null==t?void 0:t.endpoints)&&(yield this.getOIDCProviderMetaData(!0))}))}}class vl{constructor(t,e){this._id=t,this._store=e}setDataInBulk(t,e){var i;return Xe(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(t))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign(Object.assign({},n),e),d=JSON.stringify(o);yield this._store.setData(t,d)}))}setValue(t,e,i){var l;return Xe(this,void 0,void 0,(function*(){const n=null!==(l=yield this._store.getData(t))&&void 0!==l?l:null,o=n&&JSON.parse(n),d=Object.assign(Object.assign({},o),{[e]:i}),c=JSON.stringify(d);yield this._store.setData(t,c)}))}removeValue(t,e){var i;return Xe(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(t))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign({},n);delete o[e];const d=JSON.stringify(o);yield this._store.setData(t,d)}))}_resolveKey(t){return`${t}-${this._id}`}setConfigData(e){return Xe(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(t.Stores.ConfigData),e)}))}setOIDCProviderMetaData(e){return Xe(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(t.Stores.OIDCProviderMetaData),e)}))}setTemporaryData(e){return Xe(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(t.Stores.TemporaryData),e)}))}setSessionData(e){return Xe(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(t.Stores.SessionData),e)}))}getConfigData(){var e;return Xe(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(t.Stores.ConfigData)))&&void 0!==e?e:null)}))}getOIDCProviderMetaData(){var e;return Xe(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(t.Stores.OIDCProviderMetaData)))&&void 0!==e?e:null)}))}getTemporaryData(){var e;return Xe(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(t.Stores.TemporaryData)))&&void 0!==e?e:null)}))}getSessionData(){var e;return Xe(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(t.Stores.SessionData)))&&void 0!==e?e:null)}))}removeConfigData(){return Xe(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(t.Stores.ConfigData))}))}removeOIDCProviderMetaData(){return Xe(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(t.Stores.OIDCProviderMetaData))}))}removeTemporaryData(){return Xe(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(t.Stores.TemporaryData))}))}removeSessionData(){return Xe(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(t.Stores.SessionData))}))}getConfigDataParameter(e){return Xe(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(t.Stores.ConfigData));return i&&JSON.parse(i)[e]}))}getOIDCProviderMetaDataParameter(e){return Xe(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(t.Stores.OIDCProviderMetaData));return i&&JSON.parse(i)[e]}))}getTemporaryDataParameter(e){return Xe(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(t.Stores.TemporaryData));return i&&JSON.parse(i)[e]}))}getSessionDataParameter(e){return Xe(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(t.Stores.SessionData));return i&&JSON.parse(i)[e]}))}setConfigDataParameter(e,i){return Xe(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(t.Stores.ConfigData),e,i)}))}setOIDCProviderMetaDataParameter(e,i){return Xe(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(t.Stores.OIDCProviderMetaData),e,i)}))}setTemporaryDataParameter(e,i){return Xe(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(t.Stores.TemporaryData),e,i)}))}setSessionDataParameter(e,i){return Xe(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(t.Stores.SessionData),e,i)}))}removeConfigDataParameter(e){return Xe(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(t.Stores.ConfigData),e)}))}removeOIDCProviderMetaDataParameter(e){return Xe(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(t.Stores.OIDCProviderMetaData),e)}))}removeTemporaryDataParameter(e){return Xe(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(t.Stores.TemporaryData),e)}))}removeSessionDataParameter(e){return Xe(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(t.Stores.SessionData),e)}))}}const Jl={clockTolerance:300,enablePKCE:!0,responseMode:t.ResponseMode.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0};class fl{
29
+ ***************************************************************************** */function Xe(t,e,i,l){return new(i||(i=Promise))((function(n,o){function d(t){try{a(l.next(t))}catch(t){o(t)}}function c(t){try{a(l.throw(t))}catch(t){o(t)}}function a(t){var e;t.done?n(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(d,c)}a((l=l.apply(t,e||[])).next())}))}t.ResponseMode=void 0,(Ge=t.ResponseMode||(t.ResponseMode={})).formPost="form_post",Ge.query="query";t.Stores=void 0,function(t){t.ConfigData="config_data",t.OIDCProviderMetaData="oidc_provider_meta_data",t.SessionData="session_data",t.TemporaryData="temporary_data"}(t.Stores||(t.Stores={}));const ge="refresh_token_timer",Ve="pkce_code_verifier",We="code",Ce="session_state",Re="sign_out_url";class Se extends Error{constructor(t,e,i,l,n,o){super(null!=l?l:null==o?void 0:o.message),this.name=this.constructor.name,this.code=t,this.file=e,this.method=i,this.description=n,this.error=o,Object.setPrototypeOf(this,new.target.prototype)}}class Ye extends Se{constructor(t,e,i,l,n,o,d,c,a){super(t,e,i,l,n),this.name=this.constructor.name,this.code=t,this.file=e,this.method=i,this.description=n,this.networkErrorCode=o,this.networkErrorMessage=d,this.status=c,this.networkErrorData=a}}var Ke="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==i?i:"undefined"!=typeof self?self:{};function ve(t,e,i){return t(i={path:e,exports:{},require:function(t,e){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==e&&i.path)}},i.exports),i.exports}var Je=void 0!==i?i:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},Ne=[],fe=[],Le="undefined"!=typeof Uint8Array?Uint8Array:Array,He=!1;function Ue(){He=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0,i=t.length;e<i;++e)Ne[e]=t[e],fe[t.charCodeAt(e)]=e;fe["-".charCodeAt(0)]=62,fe["_".charCodeAt(0)]=63}function Te(t,e,i){for(var l,n,o=[],d=e;d<i;d+=3)l=(t[d]<<16)+(t[d+1]<<8)+t[d+2],o.push(Ne[(n=l)>>18&63]+Ne[n>>12&63]+Ne[n>>6&63]+Ne[63&n]);return o.join("")}function ke(t){var e;He||Ue();for(var i=t.length,l=i%3,n="",o=[],d=16383,c=0,a=i-l;c<a;c+=d)o.push(Te(t,c,c+d>a?a:c+d));return 1===l?(e=t[i-1],n+=Ne[e>>2],n+=Ne[e<<4&63],n+="=="):2===l&&(e=(t[i-2]<<8)+t[i-1],n+=Ne[e>>10],n+=Ne[e>>4&63],n+=Ne[e<<2&63],n+="="),o.push(n),o.join("")}function Be(t,e,i,l,n){var o,d,c=8*n-l-1,a=(1<<c)-1,s=a>>1,r=-7,Z=i?n-1:0,u=i?-1:1,b=t[e+Z];for(Z+=u,o=b&(1<<-r)-1,b>>=-r,r+=c;r>0;o=256*o+t[e+Z],Z+=u,r-=8);for(d=o&(1<<-r)-1,o>>=-r,r+=l;r>0;d=256*d+t[e+Z],Z+=u,r-=8);if(0===o)o=1-s;else{if(o===a)return d?NaN:1/0*(b?-1:1);d+=Math.pow(2,l),o-=s}return(b?-1:1)*d*Math.pow(2,o-l)}function xe(t,e,i,l,n,o){var d,c,a,s=8*o-n-1,r=(1<<s)-1,Z=r>>1,u=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,b=l?0:o-1,h=l?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(c=isNaN(e)?1:0,d=r):(d=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-d))<1&&(d--,a*=2),(e+=d+Z>=1?u/a:u*Math.pow(2,1-Z))*a>=2&&(d++,a/=2),d+Z>=r?(c=0,d=r):d+Z>=1?(c=(e*a-1)*Math.pow(2,n),d+=Z):(c=e*Math.pow(2,Z-1)*Math.pow(2,n),d=0));n>=8;t[i+b]=255&c,b+=h,c/=256,n-=8);for(d=d<<n|c,s+=n;s>0;t[i+b]=255&d,b+=h,d/=256,s-=8);t[i+b-h]|=128*m}var we={}.toString,Fe=Array.isArray||function(t){return"[object Array]"==we.call(t)};Qe.TYPED_ARRAY_SUPPORT=void 0===Je.TYPED_ARRAY_SUPPORT||Je.TYPED_ARRAY_SUPPORT;var ze=Ae();function Ae(){return Qe.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Pe(t,e){if(Ae()<e)throw new RangeError("Invalid typed array length");return Qe.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=Qe.prototype:(null===t&&(t=new Qe(e)),t.length=e),t}function Qe(t,e,i){if(!(Qe.TYPED_ARRAY_SUPPORT||this instanceof Qe))return new Qe(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 Ee(this,t)}return Me(this,t,e,i)}function Me(t,e,i,l){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,l){if(e.byteLength,i<0||e.byteLength<i)throw new RangeError("'offset' is out of bounds");if(e.byteLength<i+(l||0))throw new RangeError("'length' is out of bounds");return e=void 0===i&&void 0===l?new Uint8Array(e):void 0===l?new Uint8Array(e,i):new Uint8Array(e,i,l),Qe.TYPED_ARRAY_SUPPORT?(t=e).__proto__=Qe.prototype:t=De(t,e),t}(t,e,i,l):"string"==typeof e?function(t,e,i){if("string"==typeof i&&""!==i||(i="utf8"),!Qe.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var l=0|qe(e,i),n=(t=Pe(t,l)).write(e,i);return n!==l&&(t=t.slice(0,n)),t}(t,e,i):function(t,e){if(_e(e)){var i=0|Oe(e.length);return 0===(t=Pe(t,i)).length||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||(l=e.length)!=l?Pe(t,0):De(t,e);if("Buffer"===e.type&&Fe(e.data))return De(t,e.data)}var l;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function je(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 Ee(t,e){if(je(e),t=Pe(t,e<0?0:0|Oe(e)),!Qe.TYPED_ARRAY_SUPPORT)for(var i=0;i<e;++i)t[i]=0;return t}function De(t,e){var i=e.length<0?0:0|Oe(e.length);t=Pe(t,i);for(var l=0;l<i;l+=1)t[l]=255&e[l];return t}function Oe(t){if(t>=Ae())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Ae().toString(16)+" bytes");return 0|t}function _e(t){return!(null==t||!t._isBuffer)}function qe(t,e){if(_e(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 l=!1;;)switch(e){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return Ci(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return Ri(t).length;default:if(l)return Ci(t).length;e=(""+e).toLowerCase(),l=!0}}function $e(t,e,i){var l=!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 bi(this,e,i);case"utf8":case"utf-8":return ri(this,e,i);case"ascii":return Zi(this,e,i);case"latin1":case"binary":return ui(this,e,i);case"base64":return si(this,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return hi(this,e,i);default:if(l)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),l=!0}}function ti(t,e,i){var l=t[e];t[e]=t[i],t[i]=l}function ei(t,e,i,l,n){if(0===t.length)return-1;if("string"==typeof i?(l=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=n?0:t.length-1),i<0&&(i=t.length+i),i>=t.length){if(n)return-1;i=t.length-1}else if(i<0){if(!n)return-1;i=0}if("string"==typeof e&&(e=Qe.from(e,l)),_e(e))return 0===e.length?-1:ii(t,e,i,l,n);if("number"==typeof e)return e&=255,Qe.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(t,e,i):Uint8Array.prototype.lastIndexOf.call(t,e,i):ii(t,[e],i,l,n);throw new TypeError("val must be string, number or Buffer")}function ii(t,e,i,l,n){var o,d=1,c=t.length,a=e.length;if(void 0!==l&&("ucs2"===(l=String(l).toLowerCase())||"ucs-2"===l||"utf16le"===l||"utf-16le"===l)){if(t.length<2||e.length<2)return-1;d=2,c/=2,a/=2,i/=2}function s(t,e){return 1===d?t[e]:t.readUInt16BE(e*d)}if(n){var r=-1;for(o=i;o<c;o++)if(s(t,o)===s(e,-1===r?0:o-r)){if(-1===r&&(r=o),o-r+1===a)return r*d}else-1!==r&&(o-=o-r),r=-1}else for(i+a>c&&(i=c-a),o=i;o>=0;o--){for(var Z=!0,u=0;u<a;u++)if(s(t,o+u)!==s(e,u)){Z=!1;break}if(Z)return o}return-1}function li(t,e,i,l){i=Number(i)||0;var n=t.length-i;l?(l=Number(l))>n&&(l=n):l=n;var o=e.length;if(o%2!=0)throw new TypeError("Invalid hex string");l>o/2&&(l=o/2);for(var d=0;d<l;++d){var c=parseInt(e.substr(2*d,2),16);if(isNaN(c))return d;t[i+d]=c}return d}function ni(t,e,i,l){return Si(Ci(e,t.length-i),t,i,l)}function oi(t,e,i,l){return Si(function(t){for(var e=[],i=0;i<t.length;++i)e.push(255&t.charCodeAt(i));return e}(e),t,i,l)}function di(t,e,i,l){return oi(t,e,i,l)}function ci(t,e,i,l){return Si(Ri(e),t,i,l)}function ai(t,e,i,l){return Si(function(t,e){for(var i,l,n,o=[],d=0;d<t.length&&!((e-=2)<0);++d)l=(i=t.charCodeAt(d))>>8,n=i%256,o.push(n),o.push(l);return o}(e,t.length-i),t,i,l)}function si(t,e,i){return 0===e&&i===t.length?ke(t):ke(t.slice(e,i))}function ri(t,e,i){i=Math.min(t.length,i);for(var l=[],n=e;n<i;){var o,d,c,a,s=t[n],r=null,Z=s>239?4:s>223?3:s>191?2:1;if(n+Z<=i)switch(Z){case 1:s<128&&(r=s);break;case 2:128==(192&(o=t[n+1]))&&(a=(31&s)<<6|63&o)>127&&(r=a);break;case 3:o=t[n+1],d=t[n+2],128==(192&o)&&128==(192&d)&&(a=(15&s)<<12|(63&o)<<6|63&d)>2047&&(a<55296||a>57343)&&(r=a);break;case 4:o=t[n+1],d=t[n+2],c=t[n+3],128==(192&o)&&128==(192&d)&&128==(192&c)&&(a=(15&s)<<18|(63&o)<<12|(63&d)<<6|63&c)>65535&&a<1114112&&(r=a)}null===r?(r=65533,Z=1):r>65535&&(r-=65536,l.push(r>>>10&1023|55296),r=56320|1023&r),l.push(r),n+=Z}return function(t){var e=t.length;if(e<=4096)return String.fromCharCode.apply(String,t);for(var i="",l=0;l<e;)i+=String.fromCharCode.apply(String,t.slice(l,l+=4096));return i}(l)}function Zi(t,e,i){var l="";i=Math.min(t.length,i);for(var n=e;n<i;++n)l+=String.fromCharCode(127&t[n]);return l}function ui(t,e,i){var l="";i=Math.min(t.length,i);for(var n=e;n<i;++n)l+=String.fromCharCode(t[n]);return l}function bi(t,e,i){var l=t.length;(!e||e<0)&&(e=0),(!i||i<0||i>l)&&(i=l);for(var n="",o=e;o<i;++o)n+=Wi(t[o]);return n}function hi(t,e,i){for(var l=t.slice(e,i),n="",o=0;o<l.length;o+=2)n+=String.fromCharCode(l[o]+256*l[o+1]);return n}function mi(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 Ii(t,e,i,l,n,o){if(!_e(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>n||e<o)throw new RangeError('"value" argument is out of bounds');if(i+l>t.length)throw new RangeError("Index out of range")}function pi(t,e,i,l){e<0&&(e=65535+e+1);for(var n=0,o=Math.min(t.length-i,2);n<o;++n)t[i+n]=(e&255<<8*(l?n:1-n))>>>8*(l?n:1-n)}function Gi(t,e,i,l){e<0&&(e=4294967295+e+1);for(var n=0,o=Math.min(t.length-i,4);n<o;++n)t[i+n]=e>>>8*(l?n:3-n)&255}function yi(t,e,i,l,n,o){if(i+l>t.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function Xi(t,e,i,l,n){return n||yi(t,0,i,4),xe(t,e,i,l,23,4),i+4}function gi(t,e,i,l,n){return n||yi(t,0,i,8),xe(t,e,i,l,52,8),i+8}Qe.poolSize=8192,Qe._augment=function(t){return t.__proto__=Qe.prototype,t},Qe.from=function(t,e,i){return Me(null,t,e,i)},Qe.TYPED_ARRAY_SUPPORT&&(Qe.prototype.__proto__=Uint8Array.prototype,Qe.__proto__=Uint8Array),Qe.alloc=function(t,e,i){return function(t,e,i,l){return je(e),e<=0?Pe(t,e):void 0!==i?"string"==typeof l?Pe(t,e).fill(i,l):Pe(t,e).fill(i):Pe(t,e)}(null,t,e,i)},Qe.allocUnsafe=function(t){return Ee(null,t)},Qe.allocUnsafeSlow=function(t){return Ee(null,t)},Qe.isBuffer=Yi,Qe.compare=function(t,e){if(!_e(t)||!_e(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var i=t.length,l=e.length,n=0,o=Math.min(i,l);n<o;++n)if(t[n]!==e[n]){i=t[n],l=e[n];break}return i<l?-1:l<i?1:0},Qe.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}},Qe.concat=function(t,e){if(!Fe(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return Qe.alloc(0);var i;if(void 0===e)for(e=0,i=0;i<t.length;++i)e+=t[i].length;var l=Qe.allocUnsafe(e),n=0;for(i=0;i<t.length;++i){var o=t[i];if(!_e(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(l,n),n+=o.length}return l},Qe.byteLength=qe,Qe.prototype._isBuffer=!0,Qe.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)ti(this,e,e+1);return this},Qe.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)ti(this,e,e+3),ti(this,e+1,e+2);return this},Qe.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)ti(this,e,e+7),ti(this,e+1,e+6),ti(this,e+2,e+5),ti(this,e+3,e+4);return this},Qe.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?ri(this,0,t):$e.apply(this,arguments)},Qe.prototype.equals=function(t){if(!_e(t))throw new TypeError("Argument must be a Buffer");return this===t||0===Qe.compare(this,t)},Qe.prototype.inspect=function(){var t="";return this.length>0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),"<Buffer "+t+">"},Qe.prototype.compare=function(t,e,i,l,n){if(!_e(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===l&&(l=0),void 0===n&&(n=this.length),e<0||i>t.length||l<0||n>this.length)throw new RangeError("out of range index");if(l>=n&&e>=i)return 0;if(l>=n)return-1;if(e>=i)return 1;if(this===t)return 0;for(var o=(n>>>=0)-(l>>>=0),d=(i>>>=0)-(e>>>=0),c=Math.min(o,d),a=this.slice(l,n),s=t.slice(e,i),r=0;r<c;++r)if(a[r]!==s[r]){o=a[r],d=s[r];break}return o<d?-1:d<o?1:0},Qe.prototype.includes=function(t,e,i){return-1!==this.indexOf(t,e,i)},Qe.prototype.indexOf=function(t,e,i){return ei(this,t,e,i,!0)},Qe.prototype.lastIndexOf=function(t,e,i){return ei(this,t,e,i,!1)},Qe.prototype.write=function(t,e,i,l){if(void 0===e)l="utf8",i=this.length,e=0;else if(void 0===i&&"string"==typeof e)l=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===l&&(l="utf8")):(l=i,i=void 0)}var n=this.length-e;if((void 0===i||i>n)&&(i=n),t.length>0&&(i<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");l||(l="utf8");for(var o=!1;;)switch(l){case"hex":return li(this,t,e,i);case"utf8":case"utf-8":return ni(this,t,e,i);case"ascii":return oi(this,t,e,i);case"latin1":case"binary":return di(this,t,e,i);case"base64":return ci(this,t,e,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ai(this,t,e,i);default:if(o)throw new TypeError("Unknown encoding: "+l);l=(""+l).toLowerCase(),o=!0}},Qe.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}},Qe.prototype.slice=function(t,e){var i,l=this.length;if((t=~~t)<0?(t+=l)<0&&(t=0):t>l&&(t=l),(e=void 0===e?l:~~e)<0?(e+=l)<0&&(e=0):e>l&&(e=l),e<t&&(e=t),Qe.TYPED_ARRAY_SUPPORT)(i=this.subarray(t,e)).__proto__=Qe.prototype;else{var n=e-t;i=new Qe(n,void 0);for(var o=0;o<n;++o)i[o]=this[o+t]}return i},Qe.prototype.readUIntLE=function(t,e,i){t|=0,e|=0,i||mi(t,e,this.length);for(var l=this[t],n=1,o=0;++o<e&&(n*=256);)l+=this[t+o]*n;return l},Qe.prototype.readUIntBE=function(t,e,i){t|=0,e|=0,i||mi(t,e,this.length);for(var l=this[t+--e],n=1;e>0&&(n*=256);)l+=this[t+--e]*n;return l},Qe.prototype.readUInt8=function(t,e){return e||mi(t,1,this.length),this[t]},Qe.prototype.readUInt16LE=function(t,e){return e||mi(t,2,this.length),this[t]|this[t+1]<<8},Qe.prototype.readUInt16BE=function(t,e){return e||mi(t,2,this.length),this[t]<<8|this[t+1]},Qe.prototype.readUInt32LE=function(t,e){return e||mi(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},Qe.prototype.readUInt32BE=function(t,e){return e||mi(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},Qe.prototype.readIntLE=function(t,e,i){t|=0,e|=0,i||mi(t,e,this.length);for(var l=this[t],n=1,o=0;++o<e&&(n*=256);)l+=this[t+o]*n;return l>=(n*=128)&&(l-=Math.pow(2,8*e)),l},Qe.prototype.readIntBE=function(t,e,i){t|=0,e|=0,i||mi(t,e,this.length);for(var l=e,n=1,o=this[t+--l];l>0&&(n*=256);)o+=this[t+--l]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*e)),o},Qe.prototype.readInt8=function(t,e){return e||mi(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},Qe.prototype.readInt16LE=function(t,e){e||mi(t,2,this.length);var i=this[t]|this[t+1]<<8;return 32768&i?4294901760|i:i},Qe.prototype.readInt16BE=function(t,e){e||mi(t,2,this.length);var i=this[t+1]|this[t]<<8;return 32768&i?4294901760|i:i},Qe.prototype.readInt32LE=function(t,e){return e||mi(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},Qe.prototype.readInt32BE=function(t,e){return e||mi(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},Qe.prototype.readFloatLE=function(t,e){return e||mi(t,4,this.length),Be(this,t,!0,23,4)},Qe.prototype.readFloatBE=function(t,e){return e||mi(t,4,this.length),Be(this,t,!1,23,4)},Qe.prototype.readDoubleLE=function(t,e){return e||mi(t,8,this.length),Be(this,t,!0,52,8)},Qe.prototype.readDoubleBE=function(t,e){return e||mi(t,8,this.length),Be(this,t,!1,52,8)},Qe.prototype.writeUIntLE=function(t,e,i,l){t=+t,e|=0,i|=0,l||Ii(this,t,e,i,Math.pow(2,8*i)-1,0);var n=1,o=0;for(this[e]=255&t;++o<i&&(n*=256);)this[e+o]=t/n&255;return e+i},Qe.prototype.writeUIntBE=function(t,e,i,l){t=+t,e|=0,i|=0,l||Ii(this,t,e,i,Math.pow(2,8*i)-1,0);var n=i-1,o=1;for(this[e+n]=255&t;--n>=0&&(o*=256);)this[e+n]=t/o&255;return e+i},Qe.prototype.writeUInt8=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,1,255,0),Qe.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},Qe.prototype.writeUInt16LE=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,2,65535,0),Qe.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):pi(this,t,e,!0),e+2},Qe.prototype.writeUInt16BE=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,2,65535,0),Qe.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):pi(this,t,e,!1),e+2},Qe.prototype.writeUInt32LE=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,4,4294967295,0),Qe.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):Gi(this,t,e,!0),e+4},Qe.prototype.writeUInt32BE=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,4,4294967295,0),Qe.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):Gi(this,t,e,!1),e+4},Qe.prototype.writeIntLE=function(t,e,i,l){if(t=+t,e|=0,!l){var n=Math.pow(2,8*i-1);Ii(this,t,e,i,n-1,-n)}var o=0,d=1,c=0;for(this[e]=255&t;++o<i&&(d*=256);)t<0&&0===c&&0!==this[e+o-1]&&(c=1),this[e+o]=(t/d>>0)-c&255;return e+i},Qe.prototype.writeIntBE=function(t,e,i,l){if(t=+t,e|=0,!l){var n=Math.pow(2,8*i-1);Ii(this,t,e,i,n-1,-n)}var o=i-1,d=1,c=0;for(this[e+o]=255&t;--o>=0&&(d*=256);)t<0&&0===c&&0!==this[e+o+1]&&(c=1),this[e+o]=(t/d>>0)-c&255;return e+i},Qe.prototype.writeInt8=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,1,127,-128),Qe.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},Qe.prototype.writeInt16LE=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,2,32767,-32768),Qe.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):pi(this,t,e,!0),e+2},Qe.prototype.writeInt16BE=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,2,32767,-32768),Qe.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):pi(this,t,e,!1),e+2},Qe.prototype.writeInt32LE=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,4,2147483647,-2147483648),Qe.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):Gi(this,t,e,!0),e+4},Qe.prototype.writeInt32BE=function(t,e,i){return t=+t,e|=0,i||Ii(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),Qe.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):Gi(this,t,e,!1),e+4},Qe.prototype.writeFloatLE=function(t,e,i){return Xi(this,t,e,!0,i)},Qe.prototype.writeFloatBE=function(t,e,i){return Xi(this,t,e,!1,i)},Qe.prototype.writeDoubleLE=function(t,e,i){return gi(this,t,e,!0,i)},Qe.prototype.writeDoubleBE=function(t,e,i){return gi(this,t,e,!1,i)},Qe.prototype.copy=function(t,e,i,l){if(i||(i=0),l||0===l||(l=this.length),e>=t.length&&(e=t.length),e||(e=0),l>0&&l<i&&(l=i),l===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(l<0)throw new RangeError("sourceEnd out of bounds");l>this.length&&(l=this.length),t.length-e<l-i&&(l=t.length-e+i);var n,o=l-i;if(this===t&&i<e&&e<l)for(n=o-1;n>=0;--n)t[n+e]=this[n+i];else if(o<1e3||!Qe.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)t[n+e]=this[n+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+o),e);return o},Qe.prototype.fill=function(t,e,i,l){if("string"==typeof t){if("string"==typeof e?(l=e,e=0,i=this.length):"string"==typeof i&&(l=i,i=this.length),1===t.length){var n=t.charCodeAt(0);n<256&&(t=n)}if(void 0!==l&&"string"!=typeof l)throw new TypeError("encoding must be a string");if("string"==typeof l&&!Qe.isEncoding(l))throw new TypeError("Unknown encoding: "+l)}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 o;if(e>>>=0,i=void 0===i?this.length:i>>>0,t||(t=0),"number"==typeof t)for(o=e;o<i;++o)this[o]=t;else{var d=_e(t)?t:Ci(new Qe(t,l).toString()),c=d.length;for(o=0;o<i-e;++o)this[o+e]=d[o%c]}return this};var Vi=/[^+\/0-9A-Za-z-_]/g;function Wi(t){return t<16?"0"+t.toString(16):t.toString(16)}function Ci(t,e){var i;e=e||1/0;for(var l=t.length,n=null,o=[],d=0;d<l;++d){if((i=t.charCodeAt(d))>55295&&i<57344){if(!n){if(i>56319){(e-=3)>-1&&o.push(239,191,189);continue}if(d+1===l){(e-=3)>-1&&o.push(239,191,189);continue}n=i;continue}if(i<56320){(e-=3)>-1&&o.push(239,191,189),n=i;continue}i=65536+(n-55296<<10|i-56320)}else n&&(e-=3)>-1&&o.push(239,191,189);if(n=null,i<128){if((e-=1)<0)break;o.push(i)}else if(i<2048){if((e-=2)<0)break;o.push(i>>6|192,63&i|128)}else if(i<65536){if((e-=3)<0)break;o.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;o.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return o}function Ri(t){return function(t){var e,i,l,n,o,d;He||Ue();var c=t.length;if(c%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===t[c-2]?2:"="===t[c-1]?1:0,d=new Le(3*c/4-o),l=o>0?c-4:c;var a=0;for(e=0,i=0;e<l;e+=4,i+=3)n=fe[t.charCodeAt(e)]<<18|fe[t.charCodeAt(e+1)]<<12|fe[t.charCodeAt(e+2)]<<6|fe[t.charCodeAt(e+3)],d[a++]=n>>16&255,d[a++]=n>>8&255,d[a++]=255&n;return 2===o?(n=fe[t.charCodeAt(e)]<<2|fe[t.charCodeAt(e+1)]>>4,d[a++]=255&n):1===o&&(n=fe[t.charCodeAt(e)]<<10|fe[t.charCodeAt(e+1)]<<4|fe[t.charCodeAt(e+2)]>>2,d[a++]=n>>8&255,d[a++]=255&n),d}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(Vi,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Si(t,e,i,l){for(var n=0;n<l&&!(n+i>=e.length||n>=t.length);++n)e[n+i]=t[n];return n}function Yi(t){return null!=t&&(!!t._isBuffer||Ki(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&Ki(t.slice(0,0))}(t))}function Ki(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var vi=Object.freeze({__proto__:null,Buffer:Qe,INSPECT_MAX_BYTES:50,SlowBuffer:function(t){return+t!=t&&(t=0),Qe.alloc(+t)},isBuffer:Yi,kMaxLength:ze}),Ji=ve((function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){var e=t.length,i=e%4;if(!i)return t;var l=e,n=4-i,o=e+n,d=Qe.alloc(o);for(d.write(t);n--;)d.write("=",l++);return d.toString()}})),Ni=ve((function(t,e){function i(t,e){return void 0===e&&(e="utf8"),Qe.isBuffer(t)?n(t.toString("base64")):n(Qe.from(t,e).toString("base64"))}function l(t){return t=t.toString(),Ji.default(t).replace(/\-/g,"+").replace(/_/g,"/")}function n(t){return t.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}Object.defineProperty(e,"__esModule",{value:!0});var o=i;o.encode=i,o.decode=function(t,e){return void 0===e&&(e="utf8"),Qe.from(l(t),"base64").toString(e)},o.toBase64=l,o.fromBase64=n,o.toBuffer=function(t){return Qe.from(l(t),"base64")},e.default=o})),fi=ve((function(t){t.exports=Ni.default,t.exports.default=t.exports})),Li=function(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}(ve((function(t){!function(e,i){var l={};!function(t){t.__esModule=!0,t.digestLength=32,t.blockSize=64;var e=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function i(t,i,l,n,o){for(var d,c,a,s,r,Z,u,b,h,m,I,p,G;o>=64;){for(d=i[0],c=i[1],a=i[2],s=i[3],r=i[4],Z=i[5],u=i[6],b=i[7],m=0;m<16;m++)I=n+4*m,t[m]=(255&l[I])<<24|(255&l[I+1])<<16|(255&l[I+2])<<8|255&l[I+3];for(m=16;m<64;m++)p=((h=t[m-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,G=((h=t[m-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,t[m]=(p+t[m-7]|0)+(G+t[m-16]|0);for(m=0;m<64;m++)p=(((r>>>6|r<<26)^(r>>>11|r<<21)^(r>>>25|r<<7))+(r&Z^~r&u)|0)+(b+(e[m]+t[m]|0)|0)|0,G=((d>>>2|d<<30)^(d>>>13|d<<19)^(d>>>22|d<<10))+(d&c^d&a^c&a)|0,b=u,u=Z,Z=r,r=s+p|0,s=a,a=c,c=d,d=p+G|0;i[0]+=d,i[1]+=c,i[2]+=a,i[3]+=s,i[4]+=r,i[5]+=Z,i[6]+=u,i[7]+=b,n+=64,o-=64}return n}var l=function(){function e(){this.digestLength=t.digestLength,this.blockSize=t.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return e.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},e.prototype.clean=function(){for(var t=0;t<this.buffer.length;t++)this.buffer[t]=0;for(t=0;t<this.temp.length;t++)this.temp[t]=0;this.reset()},e.prototype.update=function(t,e){if(void 0===e&&(e=t.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var l=0;if(this.bytesHashed+=e,this.bufferLength>0){for(;this.bufferLength<64&&e>0;)this.buffer[this.bufferLength++]=t[l++],e--;64===this.bufferLength&&(i(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(e>=64&&(l=i(this.temp,this.state,t,l,e),e%=64);e>0;)this.buffer[this.bufferLength++]=t[l++],e--;return this},e.prototype.finish=function(t){if(!this.finished){var e=this.bytesHashed,l=this.bufferLength,n=e/536870912|0,o=e<<3,d=e%64<56?64:128;this.buffer[l]=128;for(var c=l+1;c<d-8;c++)this.buffer[c]=0;this.buffer[d-8]=n>>>24&255,this.buffer[d-7]=n>>>16&255,this.buffer[d-6]=n>>>8&255,this.buffer[d-5]=n>>>0&255,this.buffer[d-4]=o>>>24&255,this.buffer[d-3]=o>>>16&255,this.buffer[d-2]=o>>>8&255,this.buffer[d-1]=o>>>0&255,i(this.temp,this.state,this.buffer,0,d),this.finished=!0}for(c=0;c<8;c++)t[4*c+0]=this.state[c]>>>24&255,t[4*c+1]=this.state[c]>>>16&255,t[4*c+2]=this.state[c]>>>8&255,t[4*c+3]=this.state[c]>>>0&255;return this},e.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},e.prototype._saveState=function(t){for(var e=0;e<this.state.length;e++)t[e]=this.state[e]},e.prototype._restoreState=function(t,e){for(var i=0;i<this.state.length;i++)this.state[i]=t[i];this.bytesHashed=e,this.finished=!1,this.bufferLength=0},e}();t.Hash=l;var n=function(){function t(t){this.inner=new l,this.outer=new l,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var e=new Uint8Array(this.blockSize);if(t.length>this.blockSize)(new l).update(t).finish(e).clean();else for(var i=0;i<t.length;i++)e[i]=t[i];for(i=0;i<e.length;i++)e[i]^=54;for(this.inner.update(e),i=0;i<e.length;i++)e[i]^=106;for(this.outer.update(e),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate),i=0;i<e.length;i++)e[i]=0}return t.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},t.prototype.clean=function(){for(var t=0;t<this.istate.length;t++)this.ostate[t]=this.istate[t]=0;this.inner.clean(),this.outer.clean()},t.prototype.update=function(t){return this.inner.update(t),this},t.prototype.finish=function(t){return this.outer.finished?this.outer.finish(t):(this.inner.finish(t),this.outer.update(t,this.digestLength).finish(t)),this},t.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},t}();function o(t){var e=(new l).update(t),i=e.digest();return e.clean(),i}function d(t,e){var i=new n(t).update(e),l=i.digest();return i.clean(),l}function c(t,e,i,l){var n=l[0];if(0===n)throw new Error("hkdf: cannot expand more");e.reset(),n>1&&e.update(t),i&&e.update(i),e.update(l),e.finish(t),l[0]++}t.HMAC=n,t.hash=o,t.default=o,t.hmac=d;var a=new Uint8Array(t.digestLength);t.hkdf=function(t,e,i,l){void 0===e&&(e=a),void 0===l&&(l=32);for(var o=new Uint8Array([1]),s=d(e,t),r=new n(s),Z=new Uint8Array(r.digestLength),u=Z.length,b=new Uint8Array(l),h=0;h<l;h++)u===Z.length&&(c(Z,r,i,o),u=0),b[h]=Z[u++];return r.clean(),Z.fill(0),o.fill(0),b},t.pbkdf2=function(t,e,i,l){for(var o=new n(t),d=o.digestLength,c=new Uint8Array(4),a=new Uint8Array(d),s=new Uint8Array(d),r=new Uint8Array(l),Z=0;Z*d<l;Z++){var u=Z+1;c[0]=u>>>24&255,c[1]=u>>>16&255,c[2]=u>>>8&255,c[3]=u>>>0&255,o.reset(),o.update(e),o.update(c),o.finish(s);for(var b=0;b<d;b++)a[b]=s[b];for(b=2;b<=i;b++){o.reset(),o.update(s).finish(s);for(var h=0;h<d;h++)a[h]^=s[h]}for(b=0;b<d&&Z*d+b<l;b++)r[Z*d+b]=a[b]}for(Z=0;Z<d;Z++)a[Z]=s[Z]=0;for(Z=0;Z<4;Z++)c[Z]=0;return o.clean(),r}}(l);var n=l.default;for(var o in l)n[o]=l[o];t.exports=n}()})));function Hi(){throw new Error("setTimeout has not been defined")}function Ui(){throw new Error("clearTimeout has not been defined")}var Ti=Hi,ki=Ui;function Bi(t){if(Ti===setTimeout)return setTimeout(t,0);if((Ti===Hi||!Ti)&&setTimeout)return Ti=setTimeout,setTimeout(t,0);try{return Ti(t,0)}catch(e){try{return Ti.call(null,t,0)}catch(e){return Ti.call(this,t,0)}}}"function"==typeof Je.setTimeout&&(Ti=setTimeout),"function"==typeof Je.clearTimeout&&(ki=clearTimeout);var xi,wi=[],Fi=!1,zi=-1;function Ai(){Fi&&xi&&(Fi=!1,xi.length?wi=xi.concat(wi):zi=-1,wi.length&&Pi())}function Pi(){if(!Fi){var t=Bi(Ai);Fi=!0;for(var e=wi.length;e;){for(xi=wi,wi=[];++zi<e;)xi&&xi[zi].run();zi=-1,e=wi.length}xi=null,Fi=!1,function(t){if(ki===clearTimeout)return clearTimeout(t);if((ki===Ui||!ki)&&clearTimeout)return ki=clearTimeout,clearTimeout(t);try{ki(t)}catch(e){try{return ki.call(null,t)}catch(e){return ki.call(this,t)}}}(t)}}function Qi(t,e){this.fun=t,this.array=e}Qi.prototype.run=function(){this.fun.apply(null,this.array)};var Mi=Je.performance||{},ji=(Mi.now||Mi.mozNow||Mi.msNow||Mi.oNow||Mi.webkitNow,new Date,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];wi.push(new Qi(t,e)),1!==wi.length||Fi||Bi(Pi)}),Ei=function(t){if(t.__esModule)return t;var e=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(t).forEach((function(i){var l=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,l.get?l:{enumerable:!0,get:function(){return t[i]}})})),e}(vi),Di=ve((function(t,e){var i=Ei.Buffer;function l(t,e){for(var i in t)e[i]=t[i]}function n(t,e,l){return i(t,e,l)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=Ei:(l(Ei,e),e.Buffer=n),l(i,n),n.from=function(t,e,l){if("number"==typeof t)throw new TypeError("Argument must not be a number");return i(t,e,l)},n.alloc=function(t,e,l){if("number"!=typeof t)throw new TypeError("Argument must be a number");var n=i(t);return void 0!==e?"string"==typeof l?n.fill(e,l):n.fill(e):n.fill(0),n},n.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return i(t)},n.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return Ei.SlowBuffer(t)}})),Oi=ve((function(t){var e=65536,i=Di.Buffer,l=Ke.crypto||Ke.msCrypto;l&&l.getRandomValues?t.exports=function(t,n){if(t>4294967295)throw new RangeError("requested too many random bytes");var o=i.allocUnsafe(t);if(t>0)if(t>e)for(var d=0;d<t;d+=e)l.getRandomValues(o.slice(d,d+e));else l.getRandomValues(o);return"function"==typeof n?ji((function(){n(null,o)})):o}:t.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}}));const _i=new TextEncoder,qi=new TextDecoder;var $i=function(){if("undefined"!=typeof globalThis)return globalThis;if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;throw new Error("unable to locate global object")}();const tl=t=>{let e=t;return e instanceof Uint8Array&&(e=qi.decode(e)),e=e.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,""),new Uint8Array($i.atob(e).split("").map((t=>t.charCodeAt(0))))};class el extends Error{constructor(t){super(t),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}class il extends el{constructor(t,e="unspecified",i="unspecified"){super(t),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=e,this.reason=i}}class ll extends el{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}}class nl extends el{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}}class ol extends el{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}}class dl extends el{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}}class cl extends el{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}}class al extends il{constructor(){super(...arguments),this.code="ERR_JWT_EXPIRED"}}var sl=$i.crypto;function rl(){if(!$i.isSecureContext&&!$i.crypto.subtle)throw new el("Web Cryptography API is available only in Secure Contexts. See: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts")}const Zl=async t=>{var e,i;const{algorithm:l,keyUsages:n}=function(t){let e,i;switch(t.kty){case"oct":switch(t.alg){case"HS256":case"HS384":case"HS512":e={name:"HMAC",hash:`SHA-${t.alg.substr(-3)}`},i=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new nl(`${t.alg} keys cannot be imported as CryptoKey instances`);case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":e={name:"AES-GCM"},i=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":e={name:"AES-KW"},i=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":e={name:"PBKDF2"},i=["deriveBits"];break;default:throw new nl('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(t.alg){case"PS256":case"PS384":case"PS512":e={name:"RSA-PSS",hash:`SHA-${t.alg.substr(-3)}`},i=t.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":e={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${t.alg.substr(-3)}`},i=t.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":e={name:"RSA-OAEP",hash:`SHA-${parseInt(t.alg.substr(-3),10)||1}`},i=t.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new nl('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(t.alg){case"ES256":case"ES384":case"ES512":e={name:"ECDSA",namedCurve:t.crv},i=t.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":e={name:"ECDH",namedCurve:t.crv},i=t.d?["deriveBits"]:[];break;default:throw new nl('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;default:throw new nl('unsupported or invalid JWK "kty" (Key Type) Parameter value')}return{algorithm:e,keyUsages:i}}(t);let o="jwk",d={...t};return delete d.alg,"PBKDF2"===l.name&&(o="raw",d=tl(t.k)),rl(),sl.subtle.importKey(o,d,l,null!==(e=t.ext)&&void 0!==e&&e,null!==(i=t.key_ops)&&void 0!==i?i:n)};function ul(t){return!!t&&t.constructor===Object}async function bl(t,e,i){if(!ul(t))throw new TypeError("JWK must be an object");if(e||(e=t.alg),"string"!=typeof e||!e)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(t.kty){case"oct":if("string"!=typeof t.k||!t.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=i||(i=!0!==t.ext),i?Zl({...t,alg:e,ext:!1}):tl(t.k);case"RSA":if(void 0!==t.oth)throw new nl('RSA JWK "oth" (Other Primes Info) Parameter value is unsupported');case"EC":case"OKP":return Zl({...t,alg:e});default:throw new nl('unsupported "kty" (Key Type) Parameter value')}}const hl=function(t,e,i,l){if(void 0!==l.crit&&void 0===i.crit)throw new t('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some((t=>"string"!=typeof t||0===t.length)))throw new t('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');for(const n of i.crit){if(!e.has(n))throw new nl(`Extension Header Parameter "${n}" is not supported by this implementation`);if(void 0===l[n])throw new t(`Extension Header Parameter "${n}" is missing`);if(e.get(n)&&void 0===i[n])throw new t(`Extension Header Parameter "${n}" MUST be integrity protected`)}return new Set(i.crit)}.bind(void 0,ol,new Map([["b64",!0]])),ml=((t,e)=>{if(void 0!==e&&(!Array.isArray(e)||e.some((t=>"string"!=typeof t))))throw new TypeError(`"${t}" option must be an array of strings`);if(e)return new Set(e)}).bind(void 0,"algorithms");async function Il(t,e,i){if(!ul(t))throw new ol("Flattened JWS must be an object");if(void 0===t.protected&&void 0===t.header)throw new ol('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==t.protected&&"string"!=typeof t.protected)throw new ol("JWS Protected Header incorrect type");if(void 0===t.payload)throw new ol("JWS Payload missing");if("string"!=typeof t.signature)throw new ol("JWS Signature missing or incorrect type");if(void 0!==t.header&&!ul(t.header))throw new ol("JWS Unprotected Header incorrect type");let l={};if(t.protected){const e=tl(t.protected);l=JSON.parse(qi.decode(e))}if(!((...t)=>{const e=t.filter(Boolean);if(0===e.length||1===e.length)return!0;let i;for(const t of e){const e=Object.keys(t);if(i&&0!==i.size)for(const t of e){if(i.has(t))return!1;i.add(t)}else i=new Set(e)}return!0})(l,t.header))throw new ol("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const n={...l,...t.header};let o=!0;if(hl(l,n).has("b64")&&(o=l.b64,"boolean"!=typeof o))throw new ol('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:d}=n;if("string"!=typeof d||!d)throw new ol('JWS "alg" (Algorithm) Header Parameter missing or invalid');const c=i&&ml(i.algorithms);if(c&&!c.has(d))throw new ll('"alg" (Algorithm) Header Parameter not allowed');if(o){if("string"!=typeof t.payload)throw new ol("JWS Payload must be a string")}else if("string"!=typeof t.payload&&!(t.payload instanceof Uint8Array))throw new ol("JWS Payload must be a string or an Uint8Array instance");"function"==typeof e&&(e=await e(l,t)),((t,e)=>{if(t.startsWith("HS")||"dir"===t||t.startsWith("PBES2")||t.match(/^A\d{3}(?:GCM)KW$/)){if(e instanceof Uint8Array||"secret"===e.type)return;throw new TypeError('CryptoKey or KeyObject instances for symmetric algorithms must be of type "secret"')}if(e instanceof Uint8Array)throw new TypeError("CryptoKey or KeyObject instances must be used for asymmetric algorithms");if("secret"===e.type)throw new TypeError('CryptoKey or KeyObject instances for asymmetric algorithms must not be of type "secret"')})(d,e);const a=function(...t){const e=t.reduce(((t,{length:e})=>t+e),0),i=new Uint8Array(e);let l=0;return t.forEach((t=>{i.set(t,l),l+=t.length})),i}(_i.encode(t.protected||""),_i.encode("."),"string"==typeof t.payload?_i.encode(t.payload):t.payload),s=tl(t.signature);if(!await(async(t,e,i,l)=>{let n;if(rl(),e instanceof Uint8Array){if(!t.startsWith("HS"))throw new TypeError("symmetric keys are only applicable for HMAC-based algorithms");n=await sl.subtle.importKey("raw",e,{hash:`SHA-${t.substr(-3)}`,name:"HMAC"},!1,["verify"])}else n=e;return((t,e)=>{if(t.startsWith("HS")){const i=parseInt(t.substr(-3),10),{length:l}=e.algorithm;if("number"!=typeof l||l<i)throw new TypeError(`${t} requires symmetric keys to be ${i} bits or larger`)}if(t.startsWith("RS")||t.startsWith("PS")){const{modulusLength:i}=e.algorithm;if("number"!=typeof i||i<2048)throw new TypeError(`${t} requires key modulusLength to be 2048 bits or larger`)}})(t,n),sl.subtle.verify(function(t){switch(t){case"HS256":return{hash:"SHA-256",name:"HMAC"};case"HS384":return{hash:"SHA-384",name:"HMAC"};case"HS512":return{hash:"SHA-512",name:"HMAC"};case"PS256":return{hash:"SHA-256",name:"RSA-PSS",saltLength:32};case"PS384":return{hash:"SHA-384",name:"RSA-PSS",saltLength:48};case"PS512":return{hash:"SHA-512",name:"RSA-PSS",saltLength:64};case"RS256":return{hash:"SHA-256",name:"RSASSA-PKCS1-v1_5"};case"RS384":return{hash:"SHA-384",name:"RSASSA-PKCS1-v1_5"};case"RS512":return{hash:"SHA-512",name:"RSASSA-PKCS1-v1_5"};case"ES256":return{hash:"SHA-256",name:"ECDSA",namedCurve:"P-256"};case"ES384":return{hash:"SHA-384",name:"ECDSA",namedCurve:"P-384"};case"ES512":return{hash:"SHA-512",name:"ECDSA",namedCurve:"P-521"};default:throw new nl(`alg ${t} is unsupported either by JOSE or your javascript runtime`)}}(t),n,i,l)})(d,e,s,a))throw new cl;let r;r=o?tl(t.payload):"string"==typeof t.payload?_i.encode(t.payload):t.payload;const Z={payload:r};return void 0!==t.protected&&(Z.protectedHeader=l),void 0!==t.header&&(Z.unprotectedHeader=t.header),Z}const pl=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var Gl=t=>{const e=pl.exec(t);if(!e)throw new TypeError("invalid time period format");const i=parseFloat(e[1]);switch(e[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(i);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*i);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*i);case"day":case"days":case"d":return Math.round(86400*i);case"week":case"weeks":case"w":return Math.round(604800*i);default:return Math.round(31557600*i)}};const yl=t=>t.toLowerCase().replace(/^application\//,"");var Xl=(t,e,i={})=>{const{typ:l}=i;if(l&&("string"!=typeof t.typ||yl(t.typ)!==yl(l)))throw new il('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(qi.decode(e))}catch(t){}if("object"!=typeof n||!n||Array.isArray(n))throw new dl("JWT Claims Set must be a top-level JSON object");const{issuer:o}=i;if(o&&!("string"==typeof o?[o]:o).includes(n.iss))throw new il('unexpected "iss" claim value',"iss","check_failed");const{subject:d}=i;if(d&&n.sub!==d)throw new il('unexpected "sub" claim value',"sub","check_failed");const{audience:c}=i;if(c&&(s="string"==typeof c?[c]:c,!("string"==typeof(a=n.aud)?s.includes(a):s.some(Set.prototype.has.bind(new Set(a))))))throw new il('unexpected "aud" claim value',"aud","check_failed");var a,s;let r;switch(typeof i.clockTolerance){case"string":r=Gl(i.clockTolerance);break;case"number":r=i.clockTolerance;break;case"undefined":r=0;break;default:throw new TypeError("invalid clockTolerance option type")}const{currentDate:Z}=i,u=(b=Z||new Date,Math.floor(b.getTime()/1e3));var b;if(void 0!==n.iat||i.maxTokenAge){if("number"!=typeof n.iat)throw new il('"iat" claim must be a number',"iat","invalid");if(void 0===n.exp&&n.iat>u+r)throw new il('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new il('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>u+r)throw new il('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new il('"exp" claim must be a number',"exp","invalid");if(n.exp<=u-r)throw new al('"exp" claim timestamp check failed',"exp","check_failed")}if(i.maxTokenAge){const t=u-n.iat;if(t-r>("number"==typeof i.maxTokenAge?i.maxTokenAge:Gl(i.maxTokenAge)))throw new al('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(t<0-r)throw new il('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};class gl{constructor(){}static base64URLEncode(t){return fi.encode(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}static getCodeVerifier(){return this.base64URLEncode(Oi(32))}static getCodeChallenge(t){return this.base64URLEncode(new I(Li((new TextEncoder).encode(t))))}static getSupportedSignatureAlgorithms(){return["RS256","RS512","RS384","PS256"]}static getJWKForTheIdToken(t,e){const i=JSON.parse(fi.decode(t,"utf8"));for(const t of e)if(i.kid===t.kid)return bl({alg:t.alg,e:t.e,kty:t.kty,n:t.n});return Promise.reject(new Se("CRYPTO_UTIL-GTFTIT-IV01","crypto-utils","getJWKForTheIdToken","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+i.kid+", Expected values: "+e.map((t=>t.kid)).join(", ")))}static isValidIdToken(t,e,i,l,n,o){return async function(t,e,i){const l=await async function(t,e,i){if(t instanceof Uint8Array&&(t=qi.decode(t)),"string"!=typeof t)throw new ol("Compact JWS must be a string or Uint8Array");const{0:l,1:n,2:o,length:d}=t.split(".");if(3!==d)throw new ol("Invalid Compact JWS");const c=await Il({payload:n||void 0,protected:l||void 0,signature:o||void 0},e,i);return{payload:c.payload,protectedHeader:c.protectedHeader}}(t,e,i);return{payload:Xl(l.protectedHeader,l.payload,i),protectedHeader:l.protectedHeader}}(t,e,{algorithms:this.getSupportedSignatureAlgorithms(),audience:i,clockTolerance:o,issuer:l,subject:n}).then((()=>Promise.resolve(!0))).catch((t=>Promise.reject(new Se("CRYPTO_UTIL-IVIT-IV02","crypto-utils","isValidIdToken","Validating ID token failed",t))))}static decodeIDToken(t){try{const e=fi.decode(t.split(".")[1],"utf8");return JSON.parse(e)}catch(t){throw new Se("CRYPTO_UTIL-DIT-IV01","crypto-utils","decodeIDToken","Decoding ID token failed.",t)}}}class Vl{constructor(){}static getAuthenticatedUserInfo(t){var e,i,l,n;const o=gl.decodeIDToken(t),d=this.getTenantDomainFromIdTokenPayload(o),c=null!==(e=null==o?void 0:o.username)&&void 0!==e?e:"",a=null!==(i=o.given_name)&&void 0!==i?i:"",s=null!==(l=o.family_name)&&void 0!==l?l:"",r=a&&s?`${a} ${s}`:a||s||"",Z=null!==(n=o.preferred_username)&&void 0!==n?n:r;return Object.assign({displayName:Z,tenantDomain:d,username:c},this.filterClaimsFromIDTokenPayload(o))}static filterClaimsFromIDTokenPayload(t){const e=Object.assign({},t);null==e||delete e.iss,null==e||delete e.aud,null==e||delete e.exp,null==e||delete e.iat,null==e||delete e.acr,null==e||delete e.amr,null==e||delete e.azp,null==e||delete e.auth_time,null==e||delete e.nonce,null==e||delete e.c_hash,null==e||delete e.at_hash,null==e||delete e.nbf,null==e||delete e.isk,null==e||delete e.sid;const i={};return Object.entries(e).forEach((([t,e])=>{const l=t.split("_").map(((t,e)=>0===e?t:[t[0].toUpperCase(),...t.slice(1)].join(""))).join("");i[l]=e})),i}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}}Vl.getTenantDomainFromIdTokenPayload=(t,e="@")=>{const i=t.sub.split(e);return i.length>2?i[i.length-1]:""};class Wl{constructor(t){this._dataLayer=t,this._config=()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}resolveWellKnownEndpoint(){return Xe(this,void 0,void 0,(function*(){const t=yield this._config();return t.wellKnownEndpoint?t.serverOrigin+t.wellKnownEndpoint:t.serverOrigin+"/oauth2/token/.well-known/openid-configuration"}))}resolveEndpoints(t){return Xe(this,void 0,void 0,(function*(){const e={},i=yield this._config();return i.overrideWellEndpointConfig&&i.endpoints&&Object.keys(i.endpoints).forEach((t=>{const l=t.replace(/[A-Z]/g,(t=>`_${t.toLowerCase()}`));e[l]=(null==i?void 0:i.endpoints)?i.endpoints[t]:""})),Object.assign(Object.assign({},t),e)}))}resolveFallbackEndpoints(){return Xe(this,void 0,void 0,(function*(){const t={},e=yield this._config();e.endpoints&&Object.keys(e.endpoints).forEach((i=>{const l=i.replace(/[A-Z]/g,(t=>`_${t.toLowerCase()}`));t[l]=(null==e?void 0:e.endpoints)?e.endpoints[i]:""}));const i={authorization_endpoint:e.serverOrigin+"/oauth2/authorize",end_session_endpoint:e.serverOrigin+"/oidc/logout",jwks_uri:e.serverOrigin+"/oauth2/jwks",check_session_iframe:e.serverOrigin+"/oidc/checksession",revocation_endpoint:e.serverOrigin+"/oauth2/revoke",token_endpoint:e.serverOrigin+"/oauth2/token"};return Object.assign(Object.assign({},t),i)}))}validateIdToken(t){return Xe(this,void 0,void 0,(function*(){const e=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();return e&&0!==e.trim().length?ye.get(e,{withCredentials:null==i?void 0:i.sendCookiesInRequests}).then((e=>Xe(this,void 0,void 0,(function*(){if(200!==e.status)return Promise.reject(new Se("AUTH_HELPER-VIT-NR02","authentication-helper","validateIdToken","Invalid response status received for jwks request.","The request sent to get the jwks returned "+e.status+" , which is invalid."));const i=(yield this._oidcProviderMetaData()).issuer,l=(yield this.resolveWellKnownEndpoint()).split("/.well-known")[0];return i&&i===l?gl.getJWKForTheIdToken(t.split(".")[0],e.data.keys).then((e=>Xe(this,void 0,void 0,(function*(){return gl.isValidIdToken(t,e,(yield this._config()).clientID,i,gl.decodeIDToken(t).sub,(yield this._config()).clockTolerance).then((t=>t)).catch((t=>Promise.reject(new Se("AUTH_HELPER-VIT-ES03","authentication-helper","validateIdToken",void 0,void 0,t))))})))).catch((t=>Promise.reject(new Se("AUTH_HELPER-VIT-ES04","authentication-helper","validateIdToken",void 0,void 0,t)))):Promise.resolve(!1)})))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_HELPER-VIT-NR05","authentication-helper","validateIdToken","Request to jwks endpoint failed.","The request sent to get the jwks from the server failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))})):Promise.reject(new Se("AUTH_HELPER-VIT-NF01","authentication-helper","validateIdToken","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty."))}))}replaceCustomGrantTemplateTags(t){var e;return Xe(this,void 0,void 0,(function*(){let i="openid";const l=yield this._config(),n=yield this._dataLayer.getSessionData();return l.scope&&l.scope.length>0&&(l.scope.includes("openid")||l.scope.push("openid"),i=l.scope.join(" ")),t.replace("{{token}}",n.access_token).replace("{{username}}",Vl.getAuthenticatedUserInfo(n.id_token).username).replace("{{scope}}",i).replace("{{clientID}}",l.clientID).replace("{{clientSecret}}",null!==(e=l.clientSecret)&&void 0!==e?e:"")}))}clearUserSessionData(){return Xe(this,void 0,void 0,(function*(){yield this._dataLayer.removeOIDCProviderMetaData(),yield this._dataLayer.removeTemporaryData(),yield this._dataLayer.removeSessionData()}))}handleTokenResponse(t){return Xe(this,void 0,void 0,(function*(){if(200!==t.status)return Promise.reject(new Se("AUTH_HELPER-HTR-NR01","authentication-helper","handleTokenResponse","Invalid response status received for token request.","The request sent to get the token returned "+t.status+" , which is invalid."));if((yield this._config()).validateIDToken)return this.validateIdToken(t.data.id_token).then((e=>Xe(this,void 0,void 0,(function*(){if(e){yield this._dataLayer.setSessionData(t.data);const e={accessToken:t.data.access_token,expiresIn:t.data.expires_in,idToken:t.data.id_token,refreshToken:t.data.refresh_token,scope:t.data.scope,tokenType:t.data.token_type};return Promise.resolve(e)}return Promise.reject(new Se("AUTH_HELPER-HTR-IV02","authentication-helper","handleTokenResponse","The id token returned is not valid.","The id token returned has failed the validation check."))})))).catch((t=>Promise.reject(new Se("AUTH_HELPER-HAT-ES03","authentication-helper","handleTokenResponse",void 0,void 0,t))));{const e={accessToken:t.data.access_token,expiresIn:t.data.expires_in,idToken:t.data.id_token,refreshToken:t.data.refresh_token,scope:t.data.scope,tokenType:t.data.token_type};return yield this._dataLayer.setSessionData(t.data),Promise.resolve(e)}}))}}class Cl{constructor(t){this._authenticationHelper=new Wl(t),this._dataLayer=t,this._config=()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURL(t){return Xe(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint"),i=yield this._config();if(!e||0===e.trim().length)throw new Se("AUTH_CORE-GAU-NF01","authentication-core","getAuthorizationURL","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const l=new URL(e);l.searchParams.append("response_type","code"),l.searchParams.append("client_id",i.clientID);let n="openid";if(i.scope&&i.scope.length>0&&(i.scope.includes("openid")||i.scope.push("openid"),n=i.scope.join(" ")),l.searchParams.append("scope",n),l.searchParams.append("redirect_uri",i.signInRedirectURL),i.responseMode&&l.searchParams.append("response_mode",i.responseMode),i.enablePKCE){const t=gl.getCodeVerifier(),e=gl.getCodeChallenge(t);yield this._dataLayer.setTemporaryDataParameter("pkce_code_verifier",t),l.searchParams.append("code_challenge_method","S256"),l.searchParams.append("code_challenge",e)}i.prompt&&l.searchParams.append("prompt",i.prompt);const o=t;if(o)for(const[t,e]of Object.entries(o))""!=t&&""!=e&&l.searchParams.append(t,e.toString());return l.toString()}))}requestAccessToken(t,e){return Xe(this,void 0,void 0,(function*(){const i=(yield this._oidcProviderMetaData()).token_endpoint,l=yield this._config();if(!i||0===i.trim().length)return Promise.reject(new Se("AUTH_CORE-RAT1-NF01","authentication-core","requestAccessToken","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty."));e&&(yield this._dataLayer.setSessionDataParameter("session_state",e));const n=[];n.push(`client_id=${l.clientID}`),l.clientSecret&&l.clientSecret.trim().length>0&&n.push(`client_secret=${l.clientSecret}`);const o=t;return n.push(`code=${o}`),n.push("grant_type=authorization_code"),n.push(`redirect_uri=${l.signInRedirectURL}`),l.enablePKCE&&(n.push(`code_verifier=${yield this._dataLayer.getTemporaryDataParameter("pkce_code_verifier")}`),yield this._dataLayer.removeTemporaryDataParameter("pkce_code_verifier")),ye.post(i,n.join("&"),{headers:Vl.getTokenRequestHeaders(),withCredentials:l.sendCookiesInRequests}).then((t=>this._authenticationHelper.handleTokenResponse(t).then((t=>t)).catch((t=>Promise.reject(new Se("AUTH_CORE-RAT1-ES02","authentication-core","requestAccessToken",void 0,void 0,t)))))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_CORE-RAT1-NR03","authentication-core","requestAccessToken","Requesting access token failed","The request to get the access token from the server failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))}))}))}refreshAccessToken(){return Xe(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,e=yield this._config(),i=yield this._dataLayer.getSessionData();if(!i.refresh_token)return Promise.reject(new Se("AUTH_CORE-RAT2-NF01","authentication-core","refreshAccessToken","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled."));if(!t||0===t.trim().length)return Promise.reject(new Se("AUTH_CORE-RAT2-NF02","authentication-core","refreshAccessToken","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty."));const l=[];return l.push(`client_id=${e.clientID}`),l.push(`refresh_token=${i.refresh_token}`),l.push("grant_type=refresh_token"),e.clientSecret&&e.clientSecret.trim().length>0&&l.push(`client_secret=${e.clientSecret}`),ye.post(t,l.join("&"),{headers:Vl.getTokenRequestHeaders(),withCredentials:e.sendCookiesInRequests}).then((t=>this._authenticationHelper.handleTokenResponse(t).then((t=>t)).catch((t=>Promise.reject(new Se("AUTH_CORE-RAT2-ES03","authentication-core","refreshAccessToken",void 0,void 0,t)))))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_CORE-RAT2-NR03","authentication-core","refreshAccessToken","Refresh access token request failed.","The request to refresh the access token failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))}))}))}revokeAccessToken(){return Xe(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,e=yield this._config();if(!t||0===t.trim().length)return Promise.reject(new Se("AUTH_CORE-RAT3-NF01","authentication-core","revokeAccessToken","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty."));const i=[];return i.push(`client_id=${e.clientID}`),i.push(`token=${(yield this._dataLayer.getSessionData()).access_token}`),i.push("token_type_hint=access_token"),ye.post(t,i.join("&"),{headers:Vl.getTokenRequestHeaders(),withCredentials:e.sendCookiesInRequests}).then((t=>200!==t.status?Promise.reject(new Se("AUTH_CORE-RAT3-NR02","authentication-core","revokeAccessToken","Invalid response status received for revoke access token request.","The request sent to revoke the access token returned "+t.status+" , which is invalid.")):(this._authenticationHelper.clearUserSessionData(),Promise.resolve(t)))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_CORE-RAT3-NR03","authentication-core","revokeAccessToken","The request to revoke access token failed.","The request sent to revoke the access token failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))}))}))}requestCustomGrant(t){return Xe(this,void 0,void 0,(function*(){const e=yield this._oidcProviderMetaData(),i=yield this._config();let l;if(l=t.tokenEndpoint&&0!==t.tokenEndpoint.trim().length?t.tokenEndpoint:e.token_endpoint,!l||0===l.trim().length)return Promise.reject(new Se("AUTH_CORE-RCG-NF01","authentication-core","requestCustomGrant","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty."));const n={data:(yield Promise.all(Object.entries(t.data).map((([t,e])=>Xe(this,void 0,void 0,(function*(){const i=yield this._authenticationHelper.replaceCustomGrantTemplateTags(e);return`${t}=${i}`})))))).join("&"),headers:Object.assign({},Vl.getTokenRequestHeaders()),method:"POST",url:l,withCredentials:i.sendCookiesInRequests};return t.attachToken&&(n.headers=Object.assign(Object.assign({},n.headers),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData()).access_token}`})),ye(n).then((e=>200!==e.status?Promise.reject(new Se("AUTH_CORE-RCG-NR02","authentication-core","requestCustomGrant","Invalid response status received for the custom grant request.","The request sent to get the custom grant returned "+e.status+" , which is invalid.")):t.returnsSession?this._authenticationHelper.handleTokenResponse(e).then((t=>t)).catch((t=>Promise.reject(new Se("AUTH_CORE-RCG-ES03","authentication-core","requestCustomGrant",void 0,void 0,t)))):Promise.resolve(e))).catch((t=>{var e,i,l;return Promise.reject(new Ye("AUTH_CORE-RCG-NR04","authentication-core","requestCustomGrant","The custom grant request failed.","The request sent to get the custom grant failed.",null!==(e=null==t?void 0:t.code)&&void 0!==e?e:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.data))}))}))}getBasicUserInfo(){return Xe(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(),e=Vl.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let i={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(e).forEach((t=>{void 0!==e[t]&&""!==e[t]&&null!==e[t]||delete e[t]})),i=Object.assign(Object.assign({},i),e),i}))}getDecodedIDToken(){return Xe(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData()).id_token;return gl.decodeIDToken(t)}))}getIDToken(){return Xe(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData()).id_token}))}getOIDCProviderMetaData(t){return Xe(this,void 0,void 0,(function*(){if(!t&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve(!0);const e=yield this._authenticationHelper.resolveWellKnownEndpoint();return ye.get(e).then((t=>Xe(this,void 0,void 0,(function*(){return 200!==t.status?Promise.reject(new Se("AUTH_CORE-GOPM-NR01","authentication-core","getOIDCProviderMetaData","Invalid response status received for OIDC provider meta data request.","The request sent to the well-known endpoint to get the OIDC provider meta data returned "+t.status+" , which is invalid.")):(yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(t.data)),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve(!0))})))).catch((()=>Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveFallbackEndpoints()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve(!0)}))))}))}getOIDCServiceEndpoints(){return Xe(this,void 0,void 0,(function*(){const t=yield this._oidcProviderMetaData();return{authorizationEndpoint:t.authorization_endpoint,checkSessionIframe:t.check_session_iframe,endSessionEndpoint:t.end_session_endpoint,introspectionEndpoint:t.introspection_endpoint,issuer:t.issuer,jwksUri:t.jwks_uri,registrationEndpoint:t.registration_endpoint,revocationEndpoint:t.revocation_endpoint,tokenEndpoint:t.token_endpoint,userinfoEndpoint:t.userinfo_endpoint,wellKnownEndpoint:yield this._authenticationHelper.resolveWellKnownEndpoint()}}))}getSignOutURL(){var t,e,i;return Xe(this,void 0,void 0,(function*(){const l=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,n=yield this._config();if(!l||0===l.trim().length)throw new Se("AUTH_CORE-GSOU-NF01","authentication-core","getSignOutURL","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const o=null===(e=yield this._dataLayer.getSessionData())||void 0===e?void 0:e.id_token;if(!o||0===o.trim().length)throw new Se("AUTH_CORE-GSOU-NF02","authentication-core","getSignOutURL","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");const d=null!==(i=null==n?void 0:n.signOutRedirectURL)&&void 0!==i?i:null==n?void 0:n.signInRedirectURL;if(!d||0===d.trim().length)throw new Se("AUTH_CORE-GSOU-NF03","authentication-core","getSignOutURL","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");return`${l}?id_token_hint=${o}&post_logout_redirect_uri=${d}&state=sign_out_success`}))}signOut(){return Xe(this,void 0,void 0,(function*(){const t=yield this.getSignOutURL();return this._authenticationHelper.clearUserSessionData(),t}))}getAccessToken(){var t;return Xe(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData())||void 0===t?void 0:t.access_token}))}isAuthenticated(){return Xe(this,void 0,void 0,(function*(){return Boolean(yield this.getAccessToken())}))}getPKCECode(){return Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter("pkce_code_verifier")}))}setPKCECode(t){return Xe(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter("pkce_code_verifier",t)}))}updateConfig(t){return Xe(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(t),t.overrideWellEndpointConfig?(null==t?void 0:t.endpoints)&&(yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints({}))):(null==t?void 0:t.endpoints)&&(yield this.getOIDCProviderMetaData(!0))}))}}class Rl{constructor(t,e){this._id=t,this._store=e}setDataInBulk(t,e){var i;return Xe(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(t))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign(Object.assign({},n),e),d=JSON.stringify(o);yield this._store.setData(t,d)}))}setValue(t,e,i){var l;return Xe(this,void 0,void 0,(function*(){const n=null!==(l=yield this._store.getData(t))&&void 0!==l?l:null,o=n&&JSON.parse(n),d=Object.assign(Object.assign({},o),{[e]:i}),c=JSON.stringify(d);yield this._store.setData(t,c)}))}removeValue(t,e){var i;return Xe(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(t))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign({},n);delete o[e];const d=JSON.stringify(o);yield this._store.setData(t,d)}))}_resolveKey(t){return`${t}-${this._id}`}setConfigData(e){return Xe(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(t.Stores.ConfigData),e)}))}setOIDCProviderMetaData(e){return Xe(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(t.Stores.OIDCProviderMetaData),e)}))}setTemporaryData(e){return Xe(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(t.Stores.TemporaryData),e)}))}setSessionData(e){return Xe(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(t.Stores.SessionData),e)}))}getConfigData(){var e;return Xe(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(t.Stores.ConfigData)))&&void 0!==e?e:null)}))}getOIDCProviderMetaData(){var e;return Xe(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(t.Stores.OIDCProviderMetaData)))&&void 0!==e?e:null)}))}getTemporaryData(){var e;return Xe(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(t.Stores.TemporaryData)))&&void 0!==e?e:null)}))}getSessionData(){var e;return Xe(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(t.Stores.SessionData)))&&void 0!==e?e:null)}))}removeConfigData(){return Xe(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(t.Stores.ConfigData))}))}removeOIDCProviderMetaData(){return Xe(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(t.Stores.OIDCProviderMetaData))}))}removeTemporaryData(){return Xe(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(t.Stores.TemporaryData))}))}removeSessionData(){return Xe(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(t.Stores.SessionData))}))}getConfigDataParameter(e){return Xe(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(t.Stores.ConfigData));return i&&JSON.parse(i)[e]}))}getOIDCProviderMetaDataParameter(e){return Xe(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(t.Stores.OIDCProviderMetaData));return i&&JSON.parse(i)[e]}))}getTemporaryDataParameter(e){return Xe(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(t.Stores.TemporaryData));return i&&JSON.parse(i)[e]}))}getSessionDataParameter(e){return Xe(this,void 0,void 0,(function*(){const i=yield this._store.getData(this._resolveKey(t.Stores.SessionData));return i&&JSON.parse(i)[e]}))}setConfigDataParameter(e,i){return Xe(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(t.Stores.ConfigData),e,i)}))}setOIDCProviderMetaDataParameter(e,i){return Xe(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(t.Stores.OIDCProviderMetaData),e,i)}))}setTemporaryDataParameter(e,i){return Xe(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(t.Stores.TemporaryData),e,i)}))}setSessionDataParameter(e,i){return Xe(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(t.Stores.SessionData),e,i)}))}removeConfigDataParameter(e){return Xe(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(t.Stores.ConfigData),e)}))}removeOIDCProviderMetaDataParameter(e){return Xe(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(t.Stores.OIDCProviderMetaData),e)}))}removeTemporaryDataParameter(e){return Xe(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(t.Stores.TemporaryData),e)}))}removeSessionDataParameter(e){return Xe(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(t.Stores.SessionData),e)}))}}const Sl={clockTolerance:300,enablePKCE:!0,responseMode:t.ResponseMode.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0};class Yl{
30
30
  /**
31
31
  * This is the constructor method that returns an instance of the .
32
32
  *
@@ -41,7 +41,7 @@
41
41
  * @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#constructor
42
42
  * @preserve
43
43
  */
44
- constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer=new vl(`instance_${fl._instanceID}`,t),this._authenticationCore=new Yl(this._dataLayer)
44
+ constructor(t){Yl._instanceID?Yl._instanceID+=1:Yl._instanceID=0,this._dataLayer=new Rl(`instance_${Yl._instanceID}`,t),this._authenticationCore=new Cl(this._dataLayer)
45
45
  /**
46
46
  *
47
47
  * This method initializes the SDK with the config data.
@@ -60,7 +60,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
60
60
  * @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#initialize
61
61
  *
62
62
  * @preserve
63
- */}initialize(t){var e,i,l;return Xe(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},Jl),t),{scope:[...null!==(e=Jl.scope)&&void 0!==e?e:[],...null!==(l=null===(i=t.scope)||void 0===i?void 0:i.filter((t=>{var e;return!(null===(e=null==Jl?void 0:Jl.scope)||void 0===e?void 0:e.includes(t))})))&&void 0!==l?l:[]]}))}))}
63
+ */}initialize(t){var e,i,l;return Xe(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},Sl),t),{scope:[...null!==(e=Sl.scope)&&void 0!==e?e:[],...null!==(l=null===(i=t.scope)||void 0===i?void 0:i.filter((t=>{var e;return!(null===(e=null==Sl?void 0:Sl.scope)||void 0===e?void 0:e.includes(t))})))&&void 0!==l?l:[]]}))}))}
64
64
  /**
65
65
  * This method returns the `DataLayer` object that allows you to access authentication data.
66
66
  *
@@ -403,7 +403,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
403
403
  * @memberof AsgardeoAuthClient
404
404
  *
405
405
  * @preserve
406
- */updateConfig(t){return Xe(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(t)}))}}const Nl="sign-out",Hl="get_auth_url",Ll="check_session_signed_in",Ul="check_session_signed_out",Tl="set_session_state_from_iframe";var kl,Bl;t.Storage=void 0,(kl=t.Storage||(t.Storage={})).LocalStorage="localStorage",kl.SessionStorage="sessionStorage",kl.WebWorker="webWorker",kl.BrowserMemory="browserMemory",t.Hooks=void 0,(Bl=t.Hooks||(t.Hooks={})).SignIn="sign-in",Bl.SignOut="sign-out",Bl.Initialize="initialize",Bl.HttpRequestStart="http-request-start",Bl.HttpRequestFinish="http-request-finish",Bl.HttpRequestError="http-request-error",Bl.HttpRequestSuccess="http-request-success",Bl.RevokeAccessToken="revoke-access-token",Bl.CustomGrant="custom-grant";const xl="rpIFrame",wl="promptNoneIFrame",Fl="Y2hlY2tTZXNzaW9u",zl="sign-in-silently",Pl="initialized-silent-sign-in",Al="promptNoneRequestSent",Ml="error",Ql="error_description",jl="custom_grant_config";class El extends Error{constructor(t,e,i,l,n,o){super(null!=l?l:null==o?void 0:o.message),this.name=this.constructor.name,this.code=t,this.file=e,this.method=i,this.error=o,this.description=n,Object.setPrototypeOf(this,new.target.prototype)}}class Dl{constructor(t){this._authenticationClient=t,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(){return e(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData();if(t.refresh_token){const i=parseInt(t.expires_in),l=setTimeout((()=>e(this,void 0,void 0,(function*(){yield this._authenticationClient.refreshAccessToken()}))),1e3*(i<=10?i:i-10));yield this._dataLayer.setTemporaryDataParameter(ge,JSON.stringify(l))}}))}clearRefreshTokenTimeout(){return e(this,void 0,void 0,(function*(){if(yield this._dataLayer.getTemporaryDataParameter(ge)){const t=JSON.parse(yield this._dataLayer.getTemporaryDataParameter(ge));clearTimeout(t)}}))}}class Ol{constructor(){}static removeAuthorizationCode(){const t=location.href;history.pushState({},document.title,t.replace(/\?code=.*$/,""))}static getPKCE(){var t;return null!==(t=sessionStorage.getItem(We))&&void 0!==t?t:""}static setPKCE(t){sessionStorage.setItem(We,t)}static setSignOutURL(t){sessionStorage.setItem(Re,t)}static getSignOutURL(){var t;return null!==(t=sessionStorage.getItem(Re))&&void 0!==t?t:""}static removePKCE(){sessionStorage.removeItem(We)}static canContinueSignIn(t,e){return!(t&&!Ol.hasErrorInURL()&&!Ol.hasAuthSearchParamsInURL()&&!e)}static isInitializedSilentSignIn(){return Ol.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!Ol.hasErrorInURL()&&!Ol.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const t=sessionStorage.getItem(Pl),e=t?JSON.parse(t):null;return Boolean(e)}static isSignOutSuccessful(){if(fl.isSignOutSuccessful(window.location.href)){const t=window.location.href.split("?")[0];return history.pushState({},document.title,t),!0}return!1}static isSilentStatePresentInURL(){return new URL(window.location.href).searchParams.get("state")===zl}static hasAuthSearchParamsInURL(t=window.location.search){return/[?&]code=[^&]+/.test(t)}static hasErrorInURL(t=window.location.href){return!!new URL(t).searchParams.get(Ml)}static canSendPromptNoneRequest(){const t=sessionStorage.getItem(Al);return!(t?JSON.parse(t):null)}static setPromptNoneRequestSent(t){sessionStorage.setItem(Al,JSON.stringify(t))}static waitTillPageRedirect(t){return e(this,void 0,void 0,(function*(){const e=null!=t?t:3e3;yield new Promise((t=>setTimeout(t,1e3*e)))}))}}const _l=(()=>{let i,l,n,o,d,c,a,s,Z,r,u,m;const h=(t,e,s,Z,r,u,h,I)=>{i=t,l=e,n=s,o=Z,d=u,c=h,a=r,m=I,o>-1&&b(),a>-1&&(r=setInterval((()=>{p()}),1e3*a))},b=()=>e(void 0,void 0,void 0,(function*(){var t;if(!l||!i||!d)return;const c="opIFrame";function a(){var t;return e(this,void 0,void 0,(function*(){const e=yield n();if(Boolean(i)&&Boolean(e)){const n=`${i} ${e}`,o=document.getElementById(xl),d=(null===(t=null==o?void 0:o.contentDocument)||void 0===t?void 0:t.getElementById(c)).contentWindow;null==d||d.postMessage(n,l)}}))}const s=document.getElementById(xl);(null===(t=null==s?void 0:s.contentDocument)||void 0===t?void 0:t.getElementById(c)).src=l+"?client_id="+i+"&redirect_uri="+d,yield a(),Z=setInterval(a,1e3*o),G()})),I=()=>{clearInterval(Z),clearInterval(undefined)},G=()=>{null===window||void 0===window||window.addEventListener("message",(function(t){var i;return e(this,void 0,void 0,(function*(){const e=l;!e||(null==e?void 0:e.indexOf(t.origin))<0||(null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.type)===Tl||"unchanged"===t.data||("error"===t.data?window.location.href=yield s():"changed"===t.data&&p())}))}),!1)},p=()=>{var e;const l=document.getElementById(xl),n=null===(e=null==l?void 0:l.contentDocument)||void 0===e?void 0:e.getElementById(wl);if(Ol.canSendPromptNoneRequest()){Ol.setPromptNoneRequestSent(!0);const e=t=>{var i,l,n;(null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.type)===Tl&&(u(null!==(n=null===(l=null==t?void 0:t.data)||void 0===l?void 0:l.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",e))};r!==t.Storage.BrowserMemory&&r!==t.Storage.WebWorker||null===window||void 0===window||window.addEventListener("message",e);const l=new URL(c);l.searchParams.set("response_type","code"),l.searchParams.set("client_id",i),l.searchParams.set("scope","openid"),l.searchParams.set("redirect_uri",d),l.searchParams.set("state",Fl),l.searchParams.set("prompt","none"),m&&(l.searchParams.set("code_challenge_method","S256"),l.searchParams.set("code_challenge",(()=>{const t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz-_";let e="";for(let i=0;i<43;i++){const i=Math.floor(Math.random()*t.length);e+=t.substring(i,i+1)}return e})())),n.src=l.toString()}},y=i=>e(void 0,void 0,void 0,(function*(){var e,l;const n=new URL(window.location.href).searchParams.get("state"),o=new URL(window.location.href).searchParams.get(Ce),d=window.parent.parent;if(null!==n&&(n===Fl||n===zl)){const c=new URL(window.location.href).searchParams.get("code");if(null!==c&&0!==c.length){if(n===zl){const t={data:{code:c,sessionState:null!=o?o:""},type:Ll};return sessionStorage.setItem(Pl,"false"),d.postMessage(t,d.origin),Ol.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield Ol.waitTillPageRedirect(),!0}const a=new URL(window.location.href).searchParams.get("session_state");if(r===t.Storage.LocalStorage||r===t.Storage.SessionStorage)i&&(yield i(a));else{const t={data:null!=a?a:"",type:Tl};null===(l=null===(e=null===window||void 0===window?void 0:window.parent)||void 0===e?void 0:e.parent)||void 0===l||l.postMessage(t)}return Ol.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield Ol.waitTillPageRedirect(),!0}if(n===zl){const t={type:Ul};return window.parent.parent.postMessage(t,d.origin),Ol.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield Ol.waitTillPageRedirect(),!0}return Ol.setPromptNoneRequestSent(!1),d.location.href=yield s(),window.location.href="about:blank",yield Ol.waitTillPageRedirect(),!0}return!1}));return(t,e,i)=>{var l;let n=document.createElement("iframe");return n.setAttribute("id",xl),n.style.display="none",n.onload=()=>{var t,e,i,l;n=document.getElementById(xl);const o=null==n?void 0:n.contentDocument,d=null==o?void 0:o.createElement("iframe");d&&(d.setAttribute("id","opIFrame"),d.style.display="none");const c=null==o?void 0:o.createElement("iframe");c&&(c.setAttribute("id",wl),c.style.display="none"),d&&(null===(e=null===(t=null==n?void 0:n.contentDocument)||void 0===t?void 0:t.body)||void 0===e||e.appendChild(d)),c&&(null===(l=null===(i=null==n?void 0:n.contentDocument)||void 0===i?void 0:i.body)||void 0===l||l.appendChild(c))},null===(l=null===document||void 0===document?void 0:document.body)||void 0===l||l.appendChild(n),s=t,r=e,u=i,{initialize:h,receivePromptNoneResponse:y,reset:I}}})();var ql;let $l=ql=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>null,this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this)}static getInstance(){return this.axiosInstance||(this.axiosInstance=ye.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new ql),this.axiosInstance.interceptors.request.use((t=>e(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(t)})))),this.axiosInstance.interceptors.response.use((t=>this.clientInstance.successHandler(t)),(t=>this.clientInstance.errorHandler(t))),this.axiosInstance.all=ye.all,this.axiosInstance.spread=ye.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}requestHandler(t){return e(this,void 0,void 0,(function*(){if(yield this.attachToken(t),null==t?void 0:t.shouldEncodeToFormData){const e=null==t?void 0:t.data,i=new FormData;Object.keys(e).forEach((t=>{i.append(t,e[t])})),t.data=i}return ql.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(t),t}))}errorHandler(t){throw ql.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}successHandler(t){return ql.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}init(t=!0,i){return e(this,void 0,void 0,(function*(){ql.isHandlerEnabled=t,this.attachToken=i}))}enableHandler(){ql.isHandlerEnabled=!0}disableHandler(){ql.isHandlerEnabled=!1}disableHandlerWithTimeout(t=ql.DEFAULT_HANDLER_DISABLE_TIMEOUT){ql.isHandlerEnabled=!1,setTimeout((()=>{ql.isHandlerEnabled=!0}),t)}setHttpRequestStartCallback(t){this.requestStartCallback=t}setHttpRequestSuccessCallback(t){this.requestSuccessCallback=t}setHttpRequestErrorCallback(t){this.requestErrorCallback=t}setHttpRequestFinishCallback(t){this.requestFinishCallback=t}};$l.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,$l=ql=function(t,e,i,l){var n,o=arguments.length,d=o<3?e:null===l?l=Object.getOwnPropertyDescriptor(e,i):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(t,e,i,l);else for(var c=t.length-1;c>=0;c--)(n=t[c])&&(d=(o<3?n(d):o>3?n(e,i,d):n(e,i))||d);return o>3&&d&&Object.defineProperty(e,i,d),d}([t=>{}],$l);class tn{setData(t,i){return e(this,void 0,void 0,(function*(){localStorage.setItem(t,i)}))}getData(t){var i;return e(this,void 0,void 0,(function*(){return null!==(i=localStorage.getItem(t))&&void 0!==i?i:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){localStorage.removeItem(t)}))}}class en{constructor(){this._data=new Map}setData(t,i){return e(this,void 0,void 0,(function*(){this._data.set(t,i)}))}getData(t){var i,l;return e(this,void 0,void 0,(function*(){return null!==(l=null===(i=this._data)||void 0===i?void 0:i.get(t))&&void 0!==l?l:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){this._data.delete(t)}))}}class ln{setData(t,i){return e(this,void 0,void 0,(function*(){sessionStorage.setItem(t,i)}))}getData(t){var i;return e(this,void 0,void 0,(function*(){return null!==(i=sessionStorage.getItem(t))&&void 0!==i?i:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){sessionStorage.removeItem(t)}))}}const nn=i=>e(void 0,void 0,void 0,(function*(){var l;const n=(e=>{switch(e){case t.Storage.LocalStorage:return new tn;case t.Storage.SessionStorage:return new ln;case t.Storage.BrowserMemory:return new en;default:return new ln}})(i.storage),o=new fl(n);yield o.initialize(i);const d=new Dl(o),c=o.getDataLayer(),a=_l((()=>e(void 0,void 0,void 0,(function*(){return o.signOut()}))),null!==(l=i.storage)&&void 0!==l?l:t.Storage.SessionStorage,(t=>c.setSessionDataParameter(Ce,null!=t?t:""))),s=$l.getInstance();let Z,r,u=!0;(null==s?void 0:s.init)&&(yield s.init(!0,(t=>e(void 0,void 0,void 0,(function*(){Object.assign({attachToken:!0},t).attachToken&&(t.headers=Object.assign(Object.assign({},t.headers),{Authorization:`Bearer ${yield o.getAccessToken()}`}))})))));const m=()=>e(void 0,void 0,void 0,(function*(){var t,i,l,n;const d=yield o.getOIDCServiceEndpoints(),s=yield c.getConfigData();a.initialize(s.clientID,null!==(t=d.checkSessionIframe)&&void 0!==t?t:"",(()=>e(void 0,void 0,void 0,(function*(){return(yield o.getBasicUserInfo()).sessionState}))),null!==(i=s.checkSessionInterval)&&void 0!==i?i:3,null!==(l=s.sessionRefreshInterval)&&void 0!==l?l:300,s.signInRedirectURL,null!==(n=d.authorizationEndpoint)&&void 0!==n?n:"",s.enablePKCE)})),h=t=>e(void 0,void 0,void 0,(function*(){var i,l,n;let a=!0,s=!1;const Z=yield c.getConfigData();if(null==t?void 0:t.tokenEndpoint){a=!1;for(const e of[...null!==(l=null===(i=yield c.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==l?l:[],null==Z?void 0:Z.serverOrigin])if(null===(n=t.tokenEndpoint)||void 0===n?void 0:n.startsWith(e)){s=!0;break}}return t.shouldReplayAfterRefresh&&c.setTemporaryDataParameter(jl,JSON.stringify(t)),a||s?o.requestCustomGrant(t).then((i=>e(void 0,void 0,void 0,(function*(){return t.returnsSession?(d.refreshAccessTokenAutomatically(),o.getBasicUserInfo()):i})))).catch((t=>Promise.reject(t))):Promise.reject(new El("MAIN_THREAD_CLIENT-RCG-IV01","main-thread-client","requestCustomGrant","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`"))})),b=()=>o.refreshAccessToken().then((()=>(G().then((t=>{t&&h(t)})),d.refreshAccessTokenAutomatically(),o.getBasicUserInfo()))).catch((t=>Promise.reject(t))),I=(i,l)=>e(void 0,void 0,void 0,(function*(){const n=yield c.getConfigData();if(n.storage===t.Storage.BrowserMemory&&n.enablePKCE){const t=Ol.getPKCE();yield o.setPKCECode(t)}return o.requestAccessToken(i,l).then((()=>e(void 0,void 0,void 0,(function*(){return n.storage===t.Storage.BrowserMemory&&Ol.setSignOutURL(yield o.getSignOutURL()),d.clearRefreshTokenTimeout(),d.refreshAccessTokenAutomatically(),n.enableOIDCSessionManagement&&m(),o.getBasicUserInfo()})))).catch((t=>Promise.reject(t)))})),G=()=>e(void 0,void 0,void 0,(function*(){const t=yield c.getTemporaryDataParameter(jl);return t?JSON.parse(t):null}));return{disableHttpHandler:()=>((null==s?void 0:s.disableHandler)&&s.disableHandler(),u=!1,!0),enableHttpHandler:()=>((null==s?void 0:s.enableHandler)&&s.enableHandler(),u=!0,!0),getAccessToken:()=>e(void 0,void 0,void 0,(function*(){return o.getAccessToken()})),getBasicUserInfo:()=>e(void 0,void 0,void 0,(function*(){return o.getBasicUserInfo()})),getDecodedIDToken:()=>e(void 0,void 0,void 0,(function*(){return o.getDecodedIDToken()})),getHttpClient:()=>s,getIDToken:()=>e(void 0,void 0,void 0,(function*(){return o.getIDToken()})),getOIDCServiceEndpoints:()=>e(void 0,void 0,void 0,(function*(){return o.getOIDCServiceEndpoints()})),httpRequest:t=>e(void 0,void 0,void 0,(function*(){var i,l;let n=!1;const o=yield c.getConfigData();for(const e of[...null!==(i=yield null==o?void 0:o.resourceServerURLs)&&void 0!==i?i:[],null==o?void 0:o.serverOrigin])if(null===(l=null==t?void 0:t.url)||void 0===l?void 0:l.startsWith(e)){n=!0;break}return n?s.request(t).then((t=>Promise.resolve(t))).catch((i=>e(void 0,void 0,void 0,(function*(){var e;if(401===(null===(e=null==i?void 0:i.response)||void 0===e?void 0:e.status)||!(null==i?void 0:i.response)){let e;try{e=yield b()}catch(t){return u&&("function"==typeof Z&&(yield Z(i)),"function"==typeof r&&r()),Promise.reject(new El("MAIN_THREAD_CLIENT-HR-ES01","main-thread-client","httpRequest","","",t))}if(e)try{const e=yield s.request(t);return Promise.resolve(e)}catch(t){return u&&("function"==typeof Z&&(yield Z(t)),"function"==typeof r&&r()),Promise.reject(t)}}return u&&("function"==typeof Z&&(yield Z(i)),"function"==typeof r&&r()),Promise.reject(i)})))):Promise.reject(new El("MAIN_THREAD_CLIENT-HR-IV02","main-thread-client","httpRequest","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))})),httpRequestAll:t=>e(void 0,void 0,void 0,(function*(){var i,l,n;let d=!0;const a=yield c.getConfigData();for(const e of t){let t=!1;for(const o of[...null!==(l=null===(i=yield a)||void 0===i?void 0:i.resourceServerURLs)&&void 0!==l?l:[],null==a?void 0:a.serverOrigin])if(null===(n=e.url)||void 0===n?void 0:n.startsWith(o)){t=!0;break}if(!t){d=!1;break}}const m=[];return d?(t.forEach((t=>{m.push(s.request(t))})),(null==s?void 0:s.all)&&s.all(m).then((t=>Promise.resolve(t))).catch((t=>e(void 0,void 0,void 0,(function*(){var i;if(401===(null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status)||!(null==t?void 0:t.response)){let i;try{i=yield o.refreshAccessToken()}catch(e){return u&&("function"==typeof Z&&(yield Z(t)),"function"==typeof r&&r()),Promise.reject(new El("MAIN_THREAD_CLIENT-HRA-ES01","main-thread-client","httpRequestAll","","",e))}if(i)return s.all&&s.all(m).then((t=>Promise.resolve(t))).catch((t=>e(void 0,void 0,void 0,(function*(){return u&&("function"==typeof Z&&(yield Z(t)),"function"==typeof r&&r()),Promise.reject(t)}))))}return u&&("function"==typeof Z&&(yield Z(t)),"function"==typeof r&&r()),Promise.reject(t)}))))):Promise.reject(new El("MAIN_THREAD_CLIENT-HRA-IV02","main-thread-client","httpRequest","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))})),isAuthenticated:()=>e(void 0,void 0,void 0,(function*(){return o.isAuthenticated()})),refreshAccessToken:b,requestCustomGrant:h,revokeAccessToken:()=>o.revokeAccessToken().then((()=>(a.reset(),d.clearRefreshTokenTimeout(),Promise.resolve(!0)))).catch((t=>Promise.reject(t))),setHttpRequestErrorCallback:t=>{Z=t},setHttpRequestFinishCallback:t=>{(null==s?void 0:s.setHttpRequestFinishCallback)&&s.setHttpRequestFinishCallback(t),r=t},setHttpRequestStartCallback:t=>{(null==s?void 0:s.setHttpRequestStartCallback)&&s.setHttpRequestStartCallback(t)},setHttpRequestSuccessCallback:t=>{(null==s?void 0:s.setHttpRequestSuccessCallback)&&s.setHttpRequestSuccessCallback(t)},signIn:(i,l,n)=>e(void 0,void 0,void 0,(function*(){var s,Z;const r=yield c.getConfigData(),u=yield a.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){yield c.setSessionDataParameter(Ce,null!=t?t:"")}))));if(u)return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(yield o.isAuthenticated())return d.clearRefreshTokenTimeout(),d.refreshAccessTokenAutomatically(),r.enableOIDCSessionManagement&&m(),Promise.resolve(yield o.getBasicUserInfo());let h,b;if((null==r?void 0:r.responseMode)===t.ResponseMode.formPost&&l?(h=l,b=null!=n?n:""):(h=null!==(s=new URL(window.location.href).searchParams.get(Ve))&&void 0!==s?s:"",b=null!==(Z=new URL(window.location.href).searchParams.get(Ce))&&void 0!==Z?Z:"",Ol.removeAuthorizationCode()),h)return I(h,b);const G=new URL(window.location.href).searchParams.get(Ml),p=new URL(window.location.href).searchParams.get(Ql);if(G){const t=new URL(window.location.href);return t.searchParams.delete(Ml),t.searchParams.delete(Ql),history.pushState(null,document.title,t.toString()),Promise.reject(new El("MAIN_THREAD_CLIENT-SI-BE","main-thread-client","signIn",G,null!=p?p:""))}return o.getAuthorizationURL(i).then((i=>e(void 0,void 0,void 0,(function*(){return r.storage===t.Storage.BrowserMemory&&r.enablePKCE&&Ol.setPKCE(yield o.getPKCECode()),location.href=i,yield Ol.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))})),signOut:()=>e(void 0,void 0,void 0,(function*(){return(yield o.isAuthenticated())?location.href=yield o.signOut():location.href=Ol.getSignOutURL(),d.clearRefreshTokenTimeout(),yield Ol.waitTillPageRedirect(),!0})),trySignInSilently:()=>e(void 0,void 0,void 0,(function*(){var i;const l=yield c.getConfigData();if(Ol.isInitializedSilentSignIn())return yield a.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const n=document.getElementById(xl),d=null===(i=null==n?void 0:n.contentDocument)||void 0===i?void 0:i.getElementById(wl);try{const e=yield o.getAuthorizationURL({prompt:"none",state:zl}),i=new URL(e);i.searchParams.set("response_mode","query");const n=i.toString();l.storage===t.Storage.BrowserMemory&&l.enablePKCE&&Ol.setPKCE(yield o.getPKCECode()),d.src=n}catch(t){return Promise.reject(t)}return new Promise(((t,i)=>{const l=setTimeout((()=>{t(!1)}),1e4),n=o=>e(void 0,void 0,void 0,(function*(){var e,d;const c=o.data;(null==c?void 0:c.type)==Ul&&(window.removeEventListener("message",n),clearTimeout(l),t(!1)),(null==c?void 0:c.type)==Ll&&(null===(e=null==c?void 0:c.data)||void 0===e?void 0:e.code)&&I(c.data.code,null===(d=null==c?void 0:c.data)||void 0===d?void 0:d.sessionState).then((e=>{window.removeEventListener("message",n),t(e)})).catch((t=>{window.removeEventListener("message",n),i(t)})).finally((()=>{clearTimeout(l)}))}));window.addEventListener("message",n)}))})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield c.getConfigData(),i=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),l=Object.assign(Object.assign({},e),t);yield o.updateConfig(l),l.enableOIDCSessionManagement&&i&&(a.reset(),m())}))}}));function on(t,e,i){var l=void 0===e?null:e,n=function(t,e){var i=atob(t);if(e){for(var l=new Uint8Array(i.length),n=0,o=i.length;n<o;++n)l[n]=i.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(l.buffer))}return i}(t,void 0!==i&&i),o=n.indexOf("\n",10)+1,d=n.substring(o)+(l?"//# sourceMappingURL="+l:""),c=new Blob([d],{type:"application/javascript"});return URL.createObjectURL(c)}var dn,cn,an,sn,Zn=(dn="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gZShlLHQscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXt1KG4ubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7dShuLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiB1KGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIHI/dDpuZXcgcigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfXUoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX12YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LHI9W10sbj1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LG89ITE7ZnVuY3Rpb24gcygpe289ITA7Zm9yKHZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix0PTAsaT1lLmxlbmd0aDt0PGk7Kyt0KXJbdF09ZVt0XSxuW2UuY2hhckNvZGVBdCh0KV09dDtuWyItIi5jaGFyQ29kZUF0KDApXT02MixuWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBhKGUsdCxuKXtmb3IodmFyIGksbyxzPVtdLGE9dDthPG47YSs9MylpPShlW2FdPDwxNikrKGVbYSsxXTw8OCkrZVthKzJdLHMucHVzaChyWyhvPWkpPj4xOCY2M10rcltvPj4xMiY2M10rcltvPj42JjYzXStyWzYzJm9dKTtyZXR1cm4gcy5qb2luKCIiKX1mdW5jdGlvbiB1KGUpe3ZhciB0O298fHMoKTtmb3IodmFyIG49ZS5sZW5ndGgsaT1uJTMsdT0iIixjPVtdLGg9MTYzODMsbD0wLGY9bi1pO2w8ZjtsKz1oKWMucHVzaChhKGUsbCxsK2g+Zj9mOmwraCkpO3JldHVybiAxPT09aT8odD1lW24tMV0sdSs9clt0Pj4yXSx1Kz1yW3Q8PDQmNjNdLHUrPSI9PSIpOjI9PT1pJiYodD0oZVtuLTJdPDw4KStlW24tMV0sdSs9clt0Pj4xMF0sdSs9clt0Pj40JjYzXSx1Kz1yW3Q8PDImNjNdLHUrPSI9IiksYy5wdXNoKHUpLGMuam9pbigiIil9ZnVuY3Rpb24gYyhlLHQscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1yP2ktMTowLGY9cj8tMToxLGQ9ZVt0K2xdO2ZvcihsKz1mLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPWE7aD4wO289MjU2Km8rZVt0K2xdLGwrPWYsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO3M9MjU2KnMrZVt0K2xdLGwrPWYsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihkPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09Y31yZXR1cm4oZD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiBoKGUsdCxyLG4saSxvKXt2YXIgcyxhLHUsYz04Km8taS0xLGg9KDE8PGMpLTEsbD1oPj4xLGY9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxkPW4/MDpvLTEscD1uPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9aCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSwodCs9cytsPj0xP2YvdTpmKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKHMrKyx1Lz0yKSxzK2w+PWg/KGE9MCxzPWgpOnMrbD49MT8oYT0odCp1LTEpKk1hdGgucG93KDIsaSkscys9bCk6KGE9dCpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O2VbcitkXT0yNTUmYSxkKz1wLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsYys9aTtjPjA7ZVtyK2RdPTI1NSZzLGQrPXAscy89MjU2LGMtPTgpO2VbcitkLXBdfD0xMjgqZ312YXIgbD17fS50b1N0cmluZyxmPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWwuY2FsbChlKX07ZnVuY3Rpb24gZCgpe3JldHVybiBnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHAoZSx0KXtpZihkKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gZy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Zy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgZyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBnKGUsdCxyKXtpZighKGcuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGcpKXJldHVybiBuZXcgZyhlLHQscik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBtKHRoaXMsZSl9cmV0dXJuIHYodGhpcyxlLHQscil9ZnVuY3Rpb24gdihlLHQscixuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQscixuKXtpZih0LmJ5dGVMZW5ndGgscjwwfHx0LmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQscik6bmV3IFVpbnQ4QXJyYXkodCxyLG4pO2cuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189Zy5wcm90b3R5cGU6ZT13KGUsdCk7cmV0dXJuIGV9KGUsdCxyLG4pOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIWcuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfGsodCxyKSxpPShlPXAoZSxuKSkud3JpdGUodCxyKTtpIT09biYmKGU9ZS5zbGljZSgwLGkpKTtyZXR1cm4gZX0oZSx0LHIpOmZ1bmN0aW9uKGUsdCl7aWYoXyh0KSl7dmFyIHI9MHxiKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPXAoZSxyKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsciksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KG49dC5sZW5ndGgpIT1uP3AoZSwwKTp3KGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmYodC5kYXRhKSlyZXR1cm4gdyhlLHQuZGF0YSl9dmFyIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIHkoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBtKGUsdCl7aWYoeSh0KSxlPXAoZSx0PDA/MDowfGIodCkpLCFnLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjx0OysrcillW3JdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gdyhlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfGIodC5sZW5ndGgpO2U9cChlLHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKWVbbl09MjU1JnRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gYihlKXtpZihlPj1kKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2QoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gXyhlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24gayhlLHQpe2lmKF8oZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciByPWUubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuICQoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBHKGUpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuICQoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gUyhlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBqKHRoaXMsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBNKHRoaXMsdCxyKTtjYXNlImFzY2lpIjpyZXR1cm4gSCh0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4geCh0aGlzLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBVKHRoaXMsdCxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEIodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gQShlLHQscil7dmFyIG49ZVt0XTtlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIEUoZSx0LHIsbixpKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6ZS5sZW5ndGgtMSkscjwwJiYocj1lLmxlbmd0aCtyKSxyPj1lLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPWUubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWcuZnJvbSh0LG4pKSxfKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6VChlLHQscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGcuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOlQoZSxbdF0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIFQoZSx0LHIsbixpKXt2YXIgbyxzPTEsYT1lLmxlbmd0aCx1PXQubGVuZ3RoO2lmKHZvaWQgMCE9PW4mJigidWNzMiI9PT0obj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1ufHwidXRmMTZsZSI9PT1ufHwidXRmLTE2bGUiPT09bikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsdS89MixyLz0yfWZ1bmN0aW9uIGMoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKGkpe3ZhciBoPS0xO2ZvcihvPXI7bzxhO28rKylpZihjKGUsbyk9PT1jKHQsLTE9PT1oPzA6by1oKSl7aWYoLTE9PT1oJiYoaD1vKSxvLWgrMT09PXUpcmV0dXJuIGgqc31lbHNlLTEhPT1oJiYoby09by1oKSxoPS0xfWVsc2UgZm9yKHIrdT5hJiYocj1hLXUpLG89cjtvPj0wO28tLSl7Zm9yKHZhciBsPSEwLGY9MDtmPHU7ZisrKWlmKGMoZSxvK2YpIT09Yyh0LGYpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gUihlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gQyhlLHQscixuKXtyZXR1cm4gWCgkKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFAoZSx0LHIsbil7cmV0dXJuIFgoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLHI9MDtyPGUubGVuZ3RoOysrcil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChyKSk7cmV0dXJuIHR9KHQpLGUscixuKX1mdW5jdGlvbiBEKGUsdCxyLG4pe3JldHVybiBQKGUsdCxyLG4pfWZ1bmN0aW9uIE8oZSx0LHIsbil7cmV0dXJuIFgoRyh0KSxlLHIsbil9ZnVuY3Rpb24gSShlLHQscixuKXtyZXR1cm4gWChmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFUoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP3UoZSk6dShlLnNsaWNlKHQscikpfWZ1bmN0aW9uIE0oZSx0LHIpe3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9dDtpPHI7KXt2YXIgbyxzLGEsdSxjPWVbaV0saD1udWxsLGw9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihpK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpjPDEyOCYmKGg9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz1lW2krMV0pKSYmKHU9KDMxJmMpPDw2fDYzJm8pPjEyNyYmKGg9dSk7YnJlYWs7Y2FzZSAzOm89ZVtpKzFdLHM9ZVtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDEyfCg2MyZvKTw8Nnw2MyZzKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihoPXUpO2JyZWFrO2Nhc2UgNDpvPWVbaSsxXSxzPWVbaSsyXSxhPWVbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZ1PDExMTQxMTImJihoPXUpfW51bGw9PT1oPyhoPTY1NTMzLGw9MSk6aD42NTUzNSYmKGgtPTY1NTM2LG4ucHVzaChoPj4+MTAmMTAyM3w1NTI5NiksaD01NjMyMHwxMDIzJmgpLG4ucHVzaChoKSxpKz1sfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1MKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgcj0iIixuPTA7Zm9yKDtuPHQ7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UobixuKz1MKSk7cmV0dXJuIHJ9KG4pfWcuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT10LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHQuVFlQRURfQVJSQVlfU1VQUE9SVCxnLnBvb2xTaXplPTgxOTIsZy5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189Zy5wcm90b3R5cGUsZX0sZy5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdihudWxsLGUsdCxyKX0sZy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoZy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLGcuX19wcm90b19fPVVpbnQ4QXJyYXkpLGcuYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBmdW5jdGlvbihlLHQscixuKXtyZXR1cm4geSh0KSx0PD0wP3AoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9wKGUsdCkuZmlsbChyLG4pOnAoZSx0KS5maWxsKHIpOnAoZSx0KX0obnVsbCxlLHQscil9LGcuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG0obnVsbCxlKX0sZy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIG0obnVsbCxlKX0sZy5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fFooZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmWihlLnNsaWNlKDAsMCkpfShlKSl9LGcuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFfKGUpfHwhXyh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtyPWVbaV0sbj10W2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sZy5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxnLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGcuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09dClmb3IodD0wLHI9MDtyPGUubGVuZ3RoOysrcil0Kz1lW3JdLmxlbmd0aDt2YXIgbj1nLmFsbG9jVW5zYWZlKHQpLGk9MDtmb3Iocj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbz1lW3JdO2lmKCFfKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sZy5ieXRlTGVuZ3RoPWssZy5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGcucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9MilBKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpQSh0aGlzLHQsdCszKSxBKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9LGcucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClBKHRoaXMsdCx0KzcpLEEodGhpcyx0KzEsdCs2KSxBKHRoaXMsdCsyLHQrNSksQSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1lPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP00odGhpcywwLGUpOlMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxnLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIV8oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PWcuY29tcGFyZSh0aGlzLGUpfSxnLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LGcucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZighXyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09ciYmKHI9ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxyPmUubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJnQ+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZih0Pj1yKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixpKSxjPWUuc2xpY2UodCxyKSxoPTA7aDxhOysraClpZih1W2hdIT09Y1toXSl7bz11W2hdLHM9Y1toXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LGcucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihlLHQscil9LGcucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBFKHRoaXMsZSx0LHIsITApfSxnLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQscil7cmV0dXJuIEUodGhpcyxlLHQsciwhMSl9LGcucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHZvaWQgMD09PXQpbj0idXRmOCIscj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIHQpbj10LHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLGUubGVuZ3RoPjAmJihyPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBSKHRoaXMsZSx0LHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIEModGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIFAodGhpcyxlLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gRCh0aGlzLGUsdCxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE8odGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBJKHRoaXMsZSx0LHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LGcucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIEw9NDA5NjtmdW5jdGlvbiBIKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24geChlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGk9dDtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gaihlLHQscil7dmFyIG49ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPSIiLG89dDtvPHI7KytvKWkrPVYoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gQihlLHQscil7Zm9yKHZhciBuPWUuc2xpY2UodCxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIHEoZSx0LHIpe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE4oZSx0LHIsbixpLG8pe2lmKCFfKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZih0Pml8fHQ8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBLKGUsdCxyLG4pe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLXIsMik7aTxvOysraSllW3IraV09KHQmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBGKGUsdCxyLG4pe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciw0KTtpPG87KytpKWVbcitpXT10Pj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIFkoZSx0LHIsbixpLG8pe2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBXKGUsdCxyLG4saSl7cmV0dXJuIGl8fFkoZSwwLHIsNCksaChlLHQscixuLDIzLDQpLHIrNH1mdW5jdGlvbiB6KGUsdCxyLG4saSl7cmV0dXJuIGl8fFkoZSwwLHIsOCksaChlLHQscixuLDUyLDgpLHIrOH1nLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLCh0PXZvaWQgMD09PXQ/bjp+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksdDxlJiYodD1lKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189Zy5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgZyhpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbytlXX1yZXR1cm4gcn0sZy5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQscil7ZXw9MCx0fD0wLHJ8fHEoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LGcucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxxKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZSstLXRdLGk9MTt0PjAmJihpKj0yNTYpOyluKz10aGlzW2UrLS10XSppO3JldHVybiBufSxnLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8cShlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LGcucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxxKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LGcucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxxKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LGcucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxxKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sZy5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fHEoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxnLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxxKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KW4rPXRoaXNbZStvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCp0KSksbn0sZy5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8cShlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10LGk9MSxvPXRoaXNbZSstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSxnLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxxKGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LGcucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8cShlLDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxnLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fHEoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sZy5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8cShlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sZy5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8cShlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sZy5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8cShlLDQsdGhpcy5sZW5ndGgpLGModGhpcyxlLCEwLDIzLDQpfSxnLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxxKGUsNCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITEsMjMsNCl9LGcucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxxKGUsOCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITAsNTIsOCl9LGcucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxxKGUsOCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITEsNTIsOCl9LGcucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8Tih0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxyJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrcn0sZy5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7KGU9K2UsdHw9MCxyfD0wLG4pfHxOKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28mMjU1O3JldHVybiB0K3J9LGcucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8Tih0aGlzLGUsdCwxLDI1NSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxnLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fE4odGhpcyxlLHQsMiw2NTUzNSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpLKHRoaXMsZSx0LCEwKSx0KzJ9LGcucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8Tih0aGlzLGUsdCwyLDY1NTM1LDApLGcuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOksodGhpcyxlLHQsITEpLHQrMn0sZy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxOKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6Rih0aGlzLGUsdCwhMCksdCs0fSxnLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fE4odGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGcuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTpGKHRoaXMsZSx0LCExKSx0KzR9LGcucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LHIsbil7aWYoZT0rZSx0fD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtOKHRoaXMsZSx0LHIsaS0xLC1pKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPHImJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28tMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtyfSxnLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Tih0aGlzLGUsdCxyLGktMSwtaSl9dmFyIG89ci0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28rMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtyfSxnLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8Tih0aGlzLGUsdCwxLDEyNywtMTI4KSxnLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGcucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxOKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpLKHRoaXMsZSx0LCEwKSx0KzJ9LGcucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxOKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpLKHRoaXMsZSx0LCExKSx0KzJ9LGcucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxOKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOkYodGhpcyxlLHQsITApLHQrNH0sZy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fE4odGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6Rih0aGlzLGUsdCwhMSksdCs0fSxnLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBXKHRoaXMsZSx0LCEwLHIpfSxnLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBXKHRoaXMsZSx0LCExLHIpfSxnLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4geih0aGlzLGUsdCwhMCxyKX0sZy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHoodGhpcyxlLHQsITEscil9LGcucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PG4tciYmKG49ZS5sZW5ndGgtdCtyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09ZSYmcjx0JiZ0PG4pZm9yKGk9by0xO2k+PTA7LS1pKWVbaSt0XT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IWcuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpZVtpK3RdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShyLHIrbyksdCk7cmV0dXJuIG99LGcucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KG49dCx0PTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIGk9ZS5jaGFyQ29kZUF0KDApO2k8MjU2JiYoZT1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIWcuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9dClyZXR1cm4gdGhpczt2YXIgbztpZih0Pj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobz10O288cjsrK28pdGhpc1tvXT1lO2Vsc2V7dmFyIHM9XyhlKT9lOiQobmV3IGcoZSxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLXQ7KytvKXRoaXNbbyt0XT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBKPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIFYoZSl7cmV0dXJuIGU8MTY/IjAiK2UudG9TdHJpbmcoMTYpOmUudG9TdHJpbmcoMTYpfWZ1bmN0aW9uICQoZSx0KXt2YXIgcjt0PXR8fDEvMDtmb3IodmFyIG49ZS5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigodC09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LHIsYSx1LGMsaDtvfHxzKCk7dmFyIGw9ZS5sZW5ndGg7aWYobCU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7Yz0iPSI9PT1lW2wtMl0/MjoiPSI9PT1lW2wtMV0/MTowLGg9bmV3IGkoMypsLzQtYyksYT1jPjA/bC00Omw7dmFyIGY9MDtmb3IodD0wLHI9MDt0PGE7dCs9NCxyKz0zKXU9bltlLmNoYXJDb2RlQXQodCldPDwxOHxuW2UuY2hhckNvZGVBdCh0KzEpXTw8MTJ8bltlLmNoYXJDb2RlQXQodCsyKV08PDZ8bltlLmNoYXJDb2RlQXQodCszKV0saFtmKytdPXU+PjE2JjI1NSxoW2YrK109dT4+OCYyNTUsaFtmKytdPTI1NSZ1O3JldHVybiAyPT09Yz8odT1uW2UuY2hhckNvZGVBdCh0KV08PDJ8bltlLmNoYXJDb2RlQXQodCsxKV0+PjQsaFtmKytdPTI1NSZ1KToxPT09YyYmKHU9bltlLmNoYXJDb2RlQXQodCldPDwxMHxuW2UuY2hhckNvZGVBdCh0KzEpXTw8NHxuW2UuY2hhckNvZGVBdCh0KzIpXT4+MixoW2YrK109dT4+OCYyNTUsaFtmKytdPTI1NSZ1KSxofShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKEosIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIFgoZSx0LHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49dC5sZW5ndGh8fGk+PWUubGVuZ3RoKTsrK2kpdFtpK3JdPWVbaV07cmV0dXJuIGl9ZnVuY3Rpb24gWihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciBRPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciByPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxuPTA7bjxyLmxlbmd0aDtuKyspcltuXT1hcmd1bWVudHNbbl07cmV0dXJuIGUuYXBwbHkodCxyKX19LGVlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gdGUoZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PWVlLmNhbGwoZSl9ZnVuY3Rpb24gcmUoZSl7cmV0dXJuIHZvaWQgMD09PWV9ZnVuY3Rpb24gbmUoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9ZnVuY3Rpb24gaWUoZSl7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1lZS5jYWxsKGUpKXJldHVybiExO3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PXR8fHQ9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIG9lKGUpe3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1lZS5jYWxsKGUpfWZ1bmN0aW9uIHNlKGUsdCl7aWYobnVsbCE9ZSlpZigib2JqZWN0IiE9dHlwZW9mIGUmJihlPVtlXSksdGUoZSkpZm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXQuY2FsbChudWxsLGVbcl0scixlKTtlbHNlIGZvcih2YXIgaSBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiZ0LmNhbGwobnVsbCxlW2ldLGksZSl9dmFyIGFlPXtpc0FycmF5OnRlLGlzQXJyYXlCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PWVlLmNhbGwoZSl9LGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIXJlKGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIXJlKGUuY29uc3RydWN0b3IpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX0saXNGb3JtRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEZvcm1EYXRhJiZlIGluc3RhbmNlb2YgRm9ybURhdGF9LGlzQXJyYXlCdWZmZXJWaWV3OmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldz9BcnJheUJ1ZmZlci5pc1ZpZXcoZSk6ZSYmZS5idWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ9LGlzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSxpc09iamVjdDpuZSxpc1BsYWluT2JqZWN0OmllLGlzVW5kZWZpbmVkOnJlLGlzRGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1lZS5jYWxsKGUpfSxpc0ZpbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRmlsZV0iPT09ZWUuY2FsbChlKX0saXNCbG9iOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEJsb2JdIj09PWVlLmNhbGwoZSl9LGlzRnVuY3Rpb246b2UsaXNTdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIG5lKGUpJiZvZShlLnBpcGUpfSxpc1VSTFNlYXJjaFBhcmFtczpmdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFVSTFNlYXJjaFBhcmFtcyYmZSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtc30saXNTdGFuZGFyZEJyb3dzZXJFbnY6ZnVuY3Rpb24oKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuYXZpZ2F0b3J8fCJSZWFjdE5hdGl2ZSIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5hdGl2ZVNjcmlwdCIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5TIiE9PW5hdmlnYXRvci5wcm9kdWN0KSYmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KX0sZm9yRWFjaDpzZSxtZXJnZTpmdW5jdGlvbiBlKCl7dmFyIHQ9e307ZnVuY3Rpb24gcihyLG4pe2llKHRbbl0pJiZpZShyKT90W25dPWUodFtuXSxyKTppZShyKT90W25dPWUoe30scik6dGUocik/dFtuXT1yLnNsaWNlKCk6dFtuXT1yfWZvcih2YXIgbj0wLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKXNlKGFyZ3VtZW50c1tuXSxyKTtyZXR1cm4gdH0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gc2UodCwoZnVuY3Rpb24odCxuKXtlW25dPXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0P1EodCxyKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfX07ZnVuY3Rpb24gdWUoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIGNlPWZ1bmN0aW9uKGUsdCxyKXtpZighdClyZXR1cm4gZTt2YXIgbjtpZihyKW49cih0KTtlbHNlIGlmKGFlLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIGk9W107YWUuZm9yRWFjaCh0LChmdW5jdGlvbihlLHQpe251bGwhPWUmJihhZS5pc0FycmF5KGUpP3QrPSJbXSI6ZT1bZV0sYWUuZm9yRWFjaChlLChmdW5jdGlvbihlKXthZS5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6YWUuaXNPYmplY3QoZSkmJihlPUpTT04uc3RyaW5naWZ5KGUpKSxpLnB1c2godWUodCkrIj0iK3VlKGUpKX0pKSl9KSksbj1pLmpvaW4oIiYiKX1pZihuKXt2YXIgbz1lLmluZGV4T2YoIiMiKTstMSE9PW8mJihlPWUuc2xpY2UoMCxvKSksZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrbn1yZXR1cm4gZX07ZnVuY3Rpb24gaGUoKXt0aGlzLmhhbmRsZXJzPVtdfWhlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDplLHJlamVjdGVkOnQsc3luY2hyb25vdXM6ISFyJiZyLnN5bmNocm9ub3VzLHJ1bldoZW46cj9yLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9LGhlLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0saGUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7YWUuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLChmdW5jdGlvbih0KXtudWxsIT09dCYmZSh0KX0pKX07dmFyIGxlPWhlO2Z1bmN0aW9uIGZlKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gZGUoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBwZT1mZSxnZT1kZTtmdW5jdGlvbiB2ZShlKXtpZihwZT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigocGU9PT1mZXx8IXBlKSYmc2V0VGltZW91dClyZXR1cm4gcGU9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiBwZShlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gcGUuY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIHBlLmNhbGwodGhpcyxlLDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIHQuc2V0VGltZW91dCYmKHBlPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNsZWFyVGltZW91dCYmKGdlPWNsZWFyVGltZW91dCk7dmFyIHllLG1lPVtdLHdlPSExLGJlPS0xO2Z1bmN0aW9uIF9lKCl7d2UmJnllJiYod2U9ITEseWUubGVuZ3RoP21lPXllLmNvbmNhdChtZSk6YmU9LTEsbWUubGVuZ3RoJiZrZSgpKX1mdW5jdGlvbiBrZSgpe2lmKCF3ZSl7dmFyIGU9dmUoX2UpO3dlPSEwO2Zvcih2YXIgdD1tZS5sZW5ndGg7dDspe2Zvcih5ZT1tZSxtZT1bXTsrK2JlPHQ7KXllJiZ5ZVtiZV0ucnVuKCk7YmU9LTEsdD1tZS5sZW5ndGh9eWU9bnVsbCx3ZT0hMSxmdW5jdGlvbihlKXtpZihnZT09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChnZT09PWRlfHwhZ2UpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGdlPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e2dlKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gZ2UuY2FsbChudWxsLGUpfWNhdGNoKHQpe3JldHVybiBnZS5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIFNlKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9U2UucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIEFlKCl7fXZhciBFZT1BZSxUZT1BZSxSZT1BZSxDZT1BZSxQZT1BZSxEZT1BZSxPZT1BZTt2YXIgSWU9dC5wZXJmb3JtYW5jZXx8e30sVWU9SWUubm93fHxJZS5tb3pOb3d8fEllLm1zTm93fHxJZS5vTm93fHxJZS53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBNZT1uZXcgRGF0ZTt2YXIgTGU9e25leHRUaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXRbci0xXT1hcmd1bWVudHNbcl07bWUucHVzaChuZXcgU2UoZSx0KSksMSE9PW1lLmxlbmd0aHx8d2V8fHZlKGtlKX0sdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjpFZSxhZGRMaXN0ZW5lcjpUZSxvbmNlOlJlLG9mZjpDZSxyZW1vdmVMaXN0ZW5lcjpQZSxyZW1vdmVBbGxMaXN0ZW5lcnM6RGUsZW1pdDpPZSxiaW5kaW5nOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9LjAwMSpVZS5jYWxsKEllKSxyPU1hdGguZmxvb3IodCksbj1NYXRoLmZsb29yKHQlMSoxZTkpO3JldHVybiBlJiYoci09ZVswXSwobi09ZVsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1NZSkvMWUzfX0sSGU9TGUseGU9ZnVuY3Rpb24oZSx0KXthZS5mb3JFYWNoKGUsKGZ1bmN0aW9uKHIsbil7biE9PXQmJm4udG9VcHBlckNhc2UoKT09PXQudG9VcHBlckNhc2UoKSYmKGVbdF09cixkZWxldGUgZVtuXSl9KSl9LGplPWZ1bmN0aW9uKGUsdCxyLG4saSl7cmV0dXJuIGUuY29uZmlnPXQsciYmKGUuY29kZT1yKSxlLnJlcXVlc3Q9bixlLnJlc3BvbnNlPWksZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGV9fSxlfSxCZT1mdW5jdGlvbihlLHQscixuLGkpe3ZhciBvPW5ldyBFcnJvcihlKTtyZXR1cm4gamUobyx0LHIsbixpKX0scWU9YWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT97d3JpdGU6ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3ZhciBzPVtdO3MucHVzaChlKyI9IitlbmNvZGVVUklDb21wb25lbnQodCkpLGFlLmlzTnVtYmVyKHIpJiZzLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShyKS50b0dNVFN0cmluZygpKSxhZS5pc1N0cmluZyhuKSYmcy5wdXNoKCJwYXRoPSIrbiksYWUuaXNTdHJpbmcoaSkmJnMucHVzaCgiZG9tYWluPSIraSksITA9PT1vJiZzLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1zLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK2UrIik9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoZSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZTpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxyZW1vdmU6ZnVuY3Rpb24oKXt9fSxOZT1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLEtlPWFlLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXt2YXIgZSx0PS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gbihlKXt2YXIgbj1lO3JldHVybiB0JiYoci5zZXRBdHRyaWJ1dGUoImhyZWYiLG4pLG49ci5ocmVmKSxyLnNldEF0dHJpYnV0ZSgiaHJlZiIsbikse2hyZWY6ci5ocmVmLHByb3RvY29sOnIucHJvdG9jb2w/ci5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6ci5ob3N0LHNlYXJjaDpyLnNlYXJjaD9yLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCIiKToiIixoYXNoOnIuaGFzaD9yLmhhc2gucmVwbGFjZSgvXiMvLCIiKToiIixob3N0bmFtZTpyLmhvc3RuYW1lLHBvcnQ6ci5wb3J0LHBhdGhuYW1lOiIvIj09PXIucGF0aG5hbWUuY2hhckF0KDApP3IucGF0aG5hbWU6Ii8iK3IucGF0aG5hbWV9fXJldHVybiBlPW4od2luZG93LmxvY2F0aW9uLmhyZWYpLGZ1bmN0aW9uKHQpe3ZhciByPWFlLmlzU3RyaW5nKHQpP24odCk6dDtyZXR1cm4gci5wcm90b2NvbD09PWUucHJvdG9jb2wmJnIuaG9zdD09PWUuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe3ZhciBuPWUuZGF0YSxpPWUuaGVhZGVycyxvPWUucmVzcG9uc2VUeXBlO2FlLmlzRm9ybURhdGEobikmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgcz1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgYT1lLmF1dGgudXNlcm5hbWV8fCIiLHU9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShhKyI6Iit1KX12YXIgYyxoLGw9KGM9ZS5iYXNlVVJMLGg9ZS51cmwsYyYmIS9eKFthLXpdW2EtelxkXCtcLVwuXSo6KT9cL1wvL2kudGVzdChoKT9mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfShjLGgpOmgpO2Z1bmN0aW9uIGYoKXtpZihzKXt2YXIgbj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIHM/ZnVuY3Rpb24oZSl7dmFyIHQscixuLGk9e307cmV0dXJuIGU/KGFlLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PWFlLnRyaW0oZS5zdWJzdHIoMCxuKSkudG9Mb3dlckNhc2UoKSxyPWFlLnRyaW0oZS5zdWJzdHIobisxKSksdCl7aWYoaVt0XSYmTmUuaW5kZXhPZih0KT49MClyZXR1cm47aVt0XT0ic2V0LWNvb2tpZSI9PT10PyhpW3RdP2lbdF06W10pLmNvbmNhdChbcl0pOmlbdF0/aVt0XSsiLCAiK3I6cn19KSksaSk6aX0ocy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk6bnVsbCxpPXtkYXRhOm8mJiJ0ZXh0IiE9PW8mJiJqc29uIiE9PW8/cy5yZXNwb25zZTpzLnJlc3BvbnNlVGV4dCxzdGF0dXM6cy5zdGF0dXMsc3RhdHVzVGV4dDpzLnN0YXR1c1RleHQsaGVhZGVyczpuLGNvbmZpZzplLHJlcXVlc3Q6c307IWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztyLnN0YXR1cyYmbiYmIW4oci5zdGF0dXMpP3QoQmUoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIityLnN0YXR1cyxyLmNvbmZpZyxudWxsLHIucmVxdWVzdCxyKSk6ZShyKX0odCxyLGkpLHM9bnVsbH19aWYocy5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksY2UobCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxzLnRpbWVvdXQ9ZS50aW1lb3V0LCJvbmxvYWRlbmQiaW4gcz9zLm9ubG9hZGVuZD1mOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7cyYmND09PXMucmVhZHlTdGF0ZSYmKDAhPT1zLnN0YXR1c3x8cy5yZXNwb25zZVVSTCYmMD09PXMucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKSkmJnNldFRpbWVvdXQoZil9LHMub25hYm9ydD1mdW5jdGlvbigpe3MmJihyKEJlKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIscykpLHM9bnVsbCl9LHMub25lcnJvcj1mdW5jdGlvbigpe3IoQmUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCxzKSkscz1udWxsfSxzLm9udGltZW91dD1mdW5jdGlvbigpe3ZhciB0PSJ0aW1lb3V0IG9mICIrZS50aW1lb3V0KyJtcyBleGNlZWRlZCI7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYodD1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLHIoQmUodCxlLGUudHJhbnNpdGlvbmFsJiZlLnRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yPyJFVElNRURPVVQiOiJFQ09OTkFCT1JURUQiLHMpKSxzPW51bGx9LGFlLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciBkPShlLndpdGhDcmVkZW50aWFsc3x8S2UobCkpJiZlLnhzcmZDb29raWVOYW1lP3FlLnJlYWQoZS54c3JmQ29va2llTmFtZSk6dm9pZCAwO2QmJihpW2UueHNyZkhlYWRlck5hbWVdPWQpfSJzZXRSZXF1ZXN0SGVhZGVyImluIHMmJmFlLmZvckVhY2goaSwoZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1uJiYiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKT9kZWxldGUgaVt0XTpzLnNldFJlcXVlc3RIZWFkZXIodCxlKX0pKSxhZS5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscyl8fChzLndpdGhDcmVkZW50aWFscz0hIWUud2l0aENyZWRlbnRpYWxzKSxvJiYianNvbiIhPT1vJiYocy5yZXNwb25zZVR5cGU9ZS5yZXNwb25zZVR5cGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmcy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MmJnMudXBsb2FkJiZzLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnByb21pc2UudGhlbigoZnVuY3Rpb24oZSl7cyYmKHMuYWJvcnQoKSxyKGUpLHM9bnVsbCl9KSksbnx8KG49bnVsbCkscy5zZW5kKG4pfSkpfSxZZT17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIFdlKGUsdCl7IWFlLmlzVW5kZWZpbmVkKGUpJiZhZS5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgemUsSmU9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjooKCJ1bmRlZmluZWQiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3R8fHZvaWQgMCE9PUhlJiYiW29iamVjdCBwcm9jZXNzXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoSGUpKSYmKHplPUZlKSx6ZSksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4geGUodCwiQWNjZXB0IikseGUodCwiQ29udGVudC1UeXBlIiksYWUuaXNGb3JtRGF0YShlKXx8YWUuaXNBcnJheUJ1ZmZlcihlKXx8YWUuaXNCdWZmZXIoZSl8fGFlLmlzU3RyZWFtKGUpfHxhZS5pc0ZpbGUoZSl8fGFlLmlzQmxvYihlKT9lOmFlLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOmFlLmlzVVJMU2VhcmNoUGFyYW1zKGUpPyhXZSh0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6YWUuaXNPYmplY3QoZSl8fHQmJiJhcHBsaWNhdGlvbi9qc29uIj09PXRbIkNvbnRlbnQtVHlwZSJdPyhXZSh0LCJhcHBsaWNhdGlvbi9qc29uIiksZnVuY3Rpb24oZSx0LHIpe2lmKGFlLmlzU3RyaW5nKGUpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoZSksYWUudHJpbShlKX1jYXRjaChlKXtpZigiU3ludGF4RXJyb3IiIT09ZS5uYW1lKXRocm93IGV9cmV0dXJuKHJ8fEpTT04uc3RyaW5naWZ5KShlKX0oZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWwscj10JiZ0LnNpbGVudEpTT05QYXJzaW5nLG49dCYmdC5mb3JjZWRKU09OUGFyc2luZyxpPSFyJiYianNvbiI9PT10aGlzLnJlc3BvbnNlVHlwZTtpZihpfHxuJiZhZS5pc1N0cmluZyhlKSYmZS5sZW5ndGgpdHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGUpe2lmKGkpe2lmKCJTeW50YXhFcnJvciI9PT1lLm5hbWUpdGhyb3cgamUoZSx0aGlzLCJFX0pTT05fUEFSU0UiKTt0aHJvdyBlfX1yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfX07SmUuaGVhZGVycz17Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fSxhZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCJdLChmdW5jdGlvbihlKXtKZS5oZWFkZXJzW2VdPXt9fSkpLGFlLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7SmUuaGVhZGVyc1tlXT1hZS5tZXJnZShZZSl9KSk7dmFyIFZlPUplLCRlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzfHxWZTtyZXR1cm4gYWUuZm9yRWFjaChyLChmdW5jdGlvbihyKXtlPXIuY2FsbChuLGUsdCl9KSksZX0sR2U9ZnVuY3Rpb24oZSl7cmV0dXJuISghZXx8IWUuX19DQU5DRUxfXyl9O2Z1bmN0aW9uIFhlKGUpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpfXZhciBaZT1mdW5jdGlvbihlKXtyZXR1cm4gWGUoZSksZS5oZWFkZXJzPWUuaGVhZGVyc3x8e30sZS5kYXRhPSRlLmNhbGwoZSxlLmRhdGEsZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVxdWVzdCksZS5oZWFkZXJzPWFlLm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksYWUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSwoZnVuY3Rpb24odCl7ZGVsZXRlIGUuaGVhZGVyc1t0XX0pKSwoZS5hZGFwdGVyfHxWZS5hZGFwdGVyKShlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gWGUoZSksdC5kYXRhPSRlLmNhbGwoZSx0LmRhdGEsdC5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIEdlKHQpfHwoWGUoZSksdCYmdC5yZXNwb25zZSYmKHQucmVzcG9uc2UuZGF0YT0kZS5jYWxsKGUsdC5yZXNwb25zZS5kYXRhLHQucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KHQpfSkpfSxRZT1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHI9e30sbj1bInVybCIsIm1ldGhvZCIsImRhdGEiXSxpPVsiaGVhZGVycyIsImF1dGgiLCJwcm94eSIsInBhcmFtcyJdLG89WyJiYXNlVVJMIiwidHJhbnNmb3JtUmVxdWVzdCIsInRyYW5zZm9ybVJlc3BvbnNlIiwicGFyYW1zU2VyaWFsaXplciIsInRpbWVvdXQiLCJ0aW1lb3V0TWVzc2FnZSIsIndpdGhDcmVkZW50aWFscyIsImFkYXB0ZXIiLCJyZXNwb25zZVR5cGUiLCJ4c3JmQ29va2llTmFtZSIsInhzcmZIZWFkZXJOYW1lIiwib25VcGxvYWRQcm9ncmVzcyIsIm9uRG93bmxvYWRQcm9ncmVzcyIsImRlY29tcHJlc3MiLCJtYXhDb250ZW50TGVuZ3RoIiwibWF4Qm9keUxlbmd0aCIsIm1heFJlZGlyZWN0cyIsInRyYW5zcG9ydCIsImh0dHBBZ2VudCIsImh0dHBzQWdlbnQiLCJjYW5jZWxUb2tlbiIsInNvY2tldFBhdGgiLCJyZXNwb25zZUVuY29kaW5nIl0scz1bInZhbGlkYXRlU3RhdHVzIl07ZnVuY3Rpb24gYShlLHQpe3JldHVybiBhZS5pc1BsYWluT2JqZWN0KGUpJiZhZS5pc1BsYWluT2JqZWN0KHQpP2FlLm1lcmdlKGUsdCk6YWUuaXNQbGFpbk9iamVjdCh0KT9hZS5tZXJnZSh7fSx0KTphZS5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fWZ1bmN0aW9uIHUobil7YWUuaXNVbmRlZmluZWQodFtuXSk/YWUuaXNVbmRlZmluZWQoZVtuXSl8fChyW25dPWEodm9pZCAwLGVbbl0pKTpyW25dPWEoZVtuXSx0W25dKX1hZS5mb3JFYWNoKG4sKGZ1bmN0aW9uKGUpe2FlLmlzVW5kZWZpbmVkKHRbZV0pfHwocltlXT1hKHZvaWQgMCx0W2VdKSl9KSksYWUuZm9yRWFjaChpLHUpLGFlLmZvckVhY2gobywoZnVuY3Rpb24obil7YWUuaXNVbmRlZmluZWQodFtuXSk/YWUuaXNVbmRlZmluZWQoZVtuXSl8fChyW25dPWEodm9pZCAwLGVbbl0pKTpyW25dPWEodm9pZCAwLHRbbl0pfSkpLGFlLmZvckVhY2gocywoZnVuY3Rpb24obil7biBpbiB0P3Jbbl09YShlW25dLHRbbl0pOm4gaW4gZSYmKHJbbl09YSh2b2lkIDAsZVtuXSkpfSkpO3ZhciBjPW4uY29uY2F0KGkpLmNvbmNhdChvKS5jb25jYXQocyksaD1PYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuLTE9PT1jLmluZGV4T2YoZSl9KSk7cmV0dXJuIGFlLmZvckVhY2goaCx1KSxyfSxldD17bmFtZToiYXhpb3MiLHZlcnNpb246IjAuMjEuNCIsZGVzY3JpcHRpb246IlByb21pc2UgYmFzZWQgSFRUUCBjbGllbnQgZm9yIHRoZSBicm93c2VyIGFuZCBub2RlLmpzIixtYWluOiJpbmRleC5qcyIsc2NyaXB0czp7dGVzdDoiZ3J1bnQgdGVzdCIsc3RhcnQ6Im5vZGUgLi9zYW5kYm94L3NlcnZlci5qcyIsYnVpbGQ6Ik5PREVfRU5WPXByb2R1Y3Rpb24gZ3J1bnQgYnVpbGQiLHByZXZlcnNpb246Im5wbSB0ZXN0Iix2ZXJzaW9uOiJucG0gcnVuIGJ1aWxkICYmIGdydW50IHZlcnNpb24gJiYgZ2l0IGFkZCAtQSBkaXN0ICYmIGdpdCBhZGQgQ0hBTkdFTE9HLm1kIGJvd2VyLmpzb24gcGFja2FnZS5qc29uIixwb3N0dmVyc2lvbjoiZ2l0IHB1c2ggJiYgZ2l0IHB1c2ggLS10YWdzIixleGFtcGxlczoibm9kZSAuL2V4YW1wbGVzL3NlcnZlci5qcyIsY292ZXJhbGxzOiJjYXQgY292ZXJhZ2UvbGNvdi5pbmZvIHwgLi9ub2RlX21vZHVsZXMvY292ZXJhbGxzL2Jpbi9jb3ZlcmFsbHMuanMiLGZpeDoiZXNsaW50IC0tZml4IGxpYi8qKi8qLmpzIn0scmVwb3NpdG9yeTp7dHlwZToiZ2l0Iix1cmw6Imh0dHBzOi8vZ2l0aHViLmNvbS9heGlvcy9heGlvcy5naXQifSxrZXl3b3JkczpbInhociIsImh0dHAiLCJhamF4IiwicHJvbWlzZSIsIm5vZGUiXSxhdXRob3I6Ik1hdHQgWmFicmlza2llIixsaWNlbnNlOiJNSVQiLGJ1Z3M6e3VybDoiaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zL2lzc3VlcyJ9LGhvbWVwYWdlOiJodHRwczovL2F4aW9zLWh0dHAuY29tIixkZXZEZXBlbmRlbmNpZXM6e2NvdmVyYWxsczoiXjMuMC4wIiwiZXM2LXByb21pc2UiOiJeNC4yLjQiLGdydW50OiJeMS4zLjAiLCJncnVudC1iYW5uZXIiOiJeMC42LjAiLCJncnVudC1jbGkiOiJeMS4yLjAiLCJncnVudC1jb250cmliLWNsZWFuIjoiXjEuMS4wIiwiZ3J1bnQtY29udHJpYi13YXRjaCI6Il4xLjAuMCIsImdydW50LWVzbGludCI6Il4yMy4wLjAiLCJncnVudC1rYXJtYSI6Il40LjAuMCIsImdydW50LW1vY2hhLXRlc3QiOiJeMC4xMy4zIiwiZ3J1bnQtdHMiOiJeNi4wLjAtYmV0YS4xOSIsImdydW50LXdlYnBhY2siOiJeNC4wLjIiLCJpc3RhbmJ1bC1pbnN0cnVtZW50ZXItbG9hZGVyIjoiXjEuMC4wIiwiamFzbWluZS1jb3JlIjoiXjIuNC4xIixrYXJtYToiXjYuMy4yIiwia2FybWEtY2hyb21lLWxhdW5jaGVyIjoiXjMuMS4wIiwia2FybWEtZmlyZWZveC1sYXVuY2hlciI6Il4yLjEuMCIsImthcm1hLWphc21pbmUiOiJeMS4xLjEiLCJrYXJtYS1qYXNtaW5lLWFqYXgiOiJeMC4xLjEzIiwia2FybWEtc2FmYXJpLWxhdW5jaGVyIjoiXjEuMC4wIiwia2FybWEtc2F1Y2UtbGF1bmNoZXIiOiJeNC4zLjYiLCJrYXJtYS1zaW5vbiI6Il4xLjAuNSIsImthcm1hLXNvdXJjZW1hcC1sb2FkZXIiOiJeMC4zLjgiLCJrYXJtYS13ZWJwYWNrIjoiXjQuMC4yIiwibG9hZC1ncnVudC10YXNrcyI6Il4zLjUuMiIsbWluaW1pc3Q6Il4xLjIuMCIsbW9jaGE6Il44LjIuMSIsc2lub246Il40LjUuMCIsInRlcnNlci13ZWJwYWNrLXBsdWdpbiI6Il40LjIuMyIsdHlwZXNjcmlwdDoiXjQuMC41IiwidXJsLXNlYXJjaC1wYXJhbXMiOiJeMC4xMC4wIix3ZWJwYWNrOiJeNC40NC4yIiwid2VicGFjay1kZXYtc2VydmVyIjoiXjMuMTEuMCJ9LGJyb3dzZXI6eyIuL2xpYi9hZGFwdGVycy9odHRwLmpzIjoiLi9saWIvYWRhcHRlcnMveGhyLmpzIn0sanNkZWxpdnI6ImRpc3QvYXhpb3MubWluLmpzIix1bnBrZzoiZGlzdC9heGlvcy5taW4uanMiLHR5cGluZ3M6Ii4vaW5kZXguZC50cyIsZGVwZW5kZW5jaWVzOnsiZm9sbG93LXJlZGlyZWN0cyI6Il4xLjE0LjAifSxidW5kbGVzaXplOlt7cGF0aDoiLi9kaXN0L2F4aW9zLm1pbi5qcyIsdGhyZXNob2xkOiI1a0IifV19LHR0PXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXt0dFtlXT1mdW5jdGlvbihyKXtyZXR1cm4gdHlwZW9mIHI9PT1lfHwiYSIrKHQ8MT8ibiAiOiIgIikrZX19KSk7dmFyIHJ0PXt9LG50PWV0LnZlcnNpb24uc3BsaXQoIi4iKTtmdW5jdGlvbiBpdChlLHQpe2Zvcih2YXIgcj10P3Quc3BsaXQoIi4iKTpudCxuPWUuc3BsaXQoIi4iKSxpPTA7aTwzO2krKyl7aWYocltpXT5uW2ldKXJldHVybiEwO2lmKHJbaV08bltpXSlyZXR1cm4hMX1yZXR1cm4hMX10dC50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXQmJml0KHQpO2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4iW0F4aW9zIHYiK2V0LnZlcnNpb24rIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitlKyInIit0KyhyPyIuICIrcjoiIil9cmV0dXJuIGZ1bmN0aW9uKHIsbyxzKXtpZighMT09PWUpdGhyb3cgbmV3IEVycm9yKGkobywiIGhhcyBiZWVuIHJlbW92ZWQgaW4gIit0KSk7cmV0dXJuIG4mJiFydFtvXSYmKHJ0W29dPSEwLGNvbnNvbGUud2FybihpKG8sIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksIWV8fGUocixvLHMpfX07dmFyIG90PXtpc09sZGVyVmVyc2lvbjppdCxhc3NlcnRPcHRpb25zOmZ1bmN0aW9uKGUsdCxyKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhlKSxpPW4ubGVuZ3RoO2ktLSA+MDspe3ZhciBvPW5baV0scz10W29dO2lmKHMpe3ZhciBhPWVbb10sdT12b2lkIDA9PT1hfHxzKGEsbyxlKTtpZighMCE9PXUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIit1KX1lbHNlIGlmKCEwIT09cil0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19LHZhbGlkYXRvcnM6dHR9LHN0PW90LnZhbGlkYXRvcnM7ZnVuY3Rpb24gYXQoZSl7dGhpcy5kZWZhdWx0cz1lLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBsZSxyZXNwb25zZTpuZXcgbGV9fWF0LnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZT8oZT1hcmd1bWVudHNbMV18fHt9KS51cmw9YXJndW1lbnRzWzBdOmU9ZXx8e30sKGU9UWUodGhpcy5kZWZhdWx0cyxlKSkubWV0aG9kP2UubWV0aG9kPWUubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/ZS5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTplLm1ldGhvZD0iZ2V0Ijt2YXIgdD1lLnRyYW5zaXRpb25hbDt2b2lkIDAhPT10JiZvdC5hc3NlcnRPcHRpb25zKHQse3NpbGVudEpTT05QYXJzaW5nOnN0LnRyYW5zaXRpb25hbChzdC5ib29sZWFuLCIxLjAuMCIpLGZvcmNlZEpTT05QYXJzaW5nOnN0LnRyYW5zaXRpb25hbChzdC5ib29sZWFuLCIxLjAuMCIpLGNsYXJpZnlUaW1lb3V0RXJyb3I6c3QudHJhbnNpdGlvbmFsKHN0LmJvb2xlYW4sIjEuMC4wIil9LCExKTt2YXIgcj1bXSxuPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQucnVuV2hlbiYmITE9PT10LnJ1bldoZW4oZSl8fChuPW4mJnQuc3luY2hyb25vdXMsci51bnNoaWZ0KHQuZnVsZmlsbGVkLHQucmVqZWN0ZWQpKX0pKTt2YXIgaSxvPVtdO2lmKHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goKGZ1bmN0aW9uKGUpe28ucHVzaChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pKSwhbil7dmFyIHM9W1plLHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KHMscikscz1zLmNvbmNhdChvKSxpPVByb21pc2UucmVzb2x2ZShlKTtzLmxlbmd0aDspaT1pLnRoZW4ocy5zaGlmdCgpLHMuc2hpZnQoKSk7cmV0dXJuIGl9Zm9yKHZhciBhPWU7ci5sZW5ndGg7KXt2YXIgdT1yLnNoaWZ0KCksYz1yLnNoaWZ0KCk7dHJ5e2E9dShhKX1jYXRjaChlKXtjKGUpO2JyZWFrfX10cnl7aT1aZShhKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9Zm9yKDtvLmxlbmd0aDspaT1pLnRoZW4oby5zaGlmdCgpLG8uc2hpZnQoKSk7cmV0dXJuIGl9LGF0LnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9UWUodGhpcy5kZWZhdWx0cyxlKSxjZShlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxhZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSwoZnVuY3Rpb24oZSl7YXQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVxdWVzdChRZShyfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YToocnx8e30pLmRhdGF9KSl9fSkpLGFlLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7YXQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscixuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFFlKG58fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOnJ9KSl9fSkpO3ZhciB1dD1hdDtmdW5jdGlvbiBjdChlKXt0aGlzLm1lc3NhZ2U9ZX1jdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sY3QucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIGh0PWN0O2Z1bmN0aW9uIGx0KGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTt2YXIgdDt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKTt2YXIgcj10aGlzO2UoKGZ1bmN0aW9uKGUpe3IucmVhc29ufHwoci5yZWFzb249bmV3IGh0KGUpLHQoci5yZWFzb24pKX0pKX1sdC5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMucmVhc29uKXRocm93IHRoaXMucmVhc29ufSxsdC5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW5ldyBsdCgoZnVuY3Rpb24odCl7ZT10fSkpO3JldHVybnt0b2tlbjp0LGNhbmNlbDplfX07dmFyIGZ0PWx0O2Z1bmN0aW9uIGR0KGUpe3ZhciB0PW5ldyB1dChlKSxyPVEodXQucHJvdG90eXBlLnJlcXVlc3QsdCk7cmV0dXJuIGFlLmV4dGVuZChyLHV0LnByb3RvdHlwZSx0KSxhZS5leHRlbmQocix0KSxyfXZhciBwdD1kdChWZSk7cHQuQXhpb3M9dXQscHQuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBkdChRZShwdC5kZWZhdWx0cyxlKSl9LHB0LkNhbmNlbD1odCxwdC5DYW5jZWxUb2tlbj1mdCxwdC5pc0NhbmNlbD1HZSxwdC5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxwdC5zcHJlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KG51bGwsdCl9fSxwdC5pc0F4aW9zRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYhMD09PWUuaXNBeGlvc0Vycm9yfTt2YXIgZ3Q9cHQsdnQ9cHQ7Z3QuZGVmYXVsdD12dDt2YXIgeXQsbXQsd3Q9Z3Q7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gYnQoZSx0LHIsbil7cmV0dXJuIG5ldyhyfHwocj1Qcm9taXNlKSkoKGZ1bmN0aW9uKGksbyl7ZnVuY3Rpb24gcyhlKXt0cnl7dShuLm5leHQoZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGEoZSl7dHJ5e3Uobi50aHJvdyhlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gdShlKXt2YXIgdDtlLmRvbmU/aShlLnZhbHVlKToodD1lLnZhbHVlLHQgaW5zdGFuY2VvZiByP3Q6bmV3IHIoKGZ1bmN0aW9uKGUpe2UodCl9KSkpLnRoZW4ocyxhKX11KChuPW4uYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KSl9KG10PXl0fHwoeXQ9e30pKS5mb3JtUG9zdD0iZm9ybV9wb3N0IixtdC5xdWVyeT0icXVlcnkiO3ZhciBfdDshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KF90fHwoX3Q9e30pKTtjb25zdCBrdD0icmVmcmVzaF90b2tlbl90aW1lciI7dmFyIFN0OyFmdW5jdGlvbihlKXtlLlJlYWN0TmF0aXZlPSJSRUFDVF9OQVRJVkUiLGUuQnJvd3Nlcj0iQlJPV1NFUiIsZS5Ob2RlPSJOT0RFIn0oU3R8fChTdD17fSkpO2NsYXNzIEF0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LHIsbixpLG8pe3N1cGVyKG51bGwhPW4/bjpudWxsPT1vP3ZvaWQgMDpvLm1lc3NhZ2UpLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPWUsdGhpcy5maWxlPXQsdGhpcy5tZXRob2Q9cix0aGlzLmRlc2NyaXB0aW9uPWksdGhpcy5lcnJvcj1vLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgRXQgZXh0ZW5kcyBBdHtjb25zdHJ1Y3RvcihlLHQscixuLGksbyxzLGEsdSl7c3VwZXIoZSx0LHIsbixpKSx0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLHRoaXMuY29kZT1lLHRoaXMuZmlsZT10LHRoaXMubWV0aG9kPXIsdGhpcy5kZXNjcmlwdGlvbj1pLHRoaXMubmV0d29ya0Vycm9yQ29kZT1vLHRoaXMubmV0d29ya0Vycm9yTWVzc2FnZT1zLHRoaXMuc3RhdHVzPWEsdGhpcy5uZXR3b3JrRXJyb3JEYXRhPXV9fXZhciBUdD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dm9pZCAwIT09dD90OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIFJ0KGUsdCxyKXtyZXR1cm4gZShyPXtwYXRoOnQsZXhwb3J0czp7fSxyZXF1aXJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJEeW5hbWljIHJlcXVpcmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBAcm9sbHVwL3BsdWdpbi1jb21tb25qcyIpfShudWxsPT10JiZyLnBhdGgpfX0sci5leHBvcnRzKSxyLmV4cG9ydHN9dmFyIEN0PXZvaWQgMCE9PXQ/dDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30sUHQ9W10sRHQ9W10sT3Q9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksSXQ9ITE7ZnVuY3Rpb24gVXQoKXtJdD0hMDtmb3IodmFyIGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHQ9MCxyPWUubGVuZ3RoO3Q8cjsrK3QpUHRbdF09ZVt0XSxEdFtlLmNoYXJDb2RlQXQodCldPXQ7RHRbIi0iLmNoYXJDb2RlQXQoMCldPTYyLER0WyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBNdChlLHQscil7Zm9yKHZhciBuLGksbz1bXSxzPXQ7czxyO3MrPTMpbj0oZVtzXTw8MTYpKyhlW3MrMV08PDgpK2VbcysyXSxvLnB1c2goUHRbKGk9bik+PjE4JjYzXStQdFtpPj4xMiY2M10rUHRbaT4+NiY2M10rUHRbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIEx0KGUpe3ZhciB0O0l0fHxVdCgpO2Zvcih2YXIgcj1lLmxlbmd0aCxuPXIlMyxpPSIiLG89W10scz0xNjM4MyxhPTAsdT1yLW47YTx1O2ErPXMpby5wdXNoKE10KGUsYSxhK3M+dT91OmErcykpO3JldHVybiAxPT09bj8odD1lW3ItMV0saSs9UHRbdD4+Ml0saSs9UHRbdDw8NCY2M10saSs9Ij09Iik6Mj09PW4mJih0PShlW3ItMl08PDgpK2Vbci0xXSxpKz1QdFt0Pj4xMF0saSs9UHRbdD4+NCY2M10saSs9UHRbdDw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiBIdChlLHQscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1yP2ktMTowLGY9cj8tMToxLGQ9ZVt0K2xdO2ZvcihsKz1mLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPWE7aD4wO289MjU2Km8rZVt0K2xdLGwrPWYsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO3M9MjU2KnMrZVt0K2xdLGwrPWYsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihkPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09Y31yZXR1cm4oZD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiB4dChlLHQscixuLGksbyl7dmFyIHMsYSx1LGM9OCpvLWktMSxoPSgxPDxjKS0xLGw9aD4+MSxmPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZD1uPzA6by0xLHA9bj8xOi0xLGc9dDwwfHwwPT09dCYmMS90PDA/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHx0PT09MS8wPyhhPWlzTmFOKHQpPzE6MCxzPWgpOihzPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKHQrPXMrbD49MT9mL3U6ZipNYXRoLnBvdygyLDEtbCkpKnU+PTImJihzKyssdS89MikscytsPj1oPyhhPTAscz1oKTpzK2w+PTE/KGE9KHQqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWwpOihhPXQqTWF0aC5wb3coMixsLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtlW3IrZF09MjU1JmEsZCs9cCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGMrPWk7Yz4wO2VbcitkXT0yNTUmcyxkKz1wLHMvPTI1NixjLT04KTtlW3IrZC1wXXw9MTI4Kmd9dmFyIGp0PXt9LnRvU3RyaW5nLEJ0PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWp0LmNhbGwoZSl9O0Z0LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09Q3QuVFlQRURfQVJSQVlfU1VQUE9SVHx8Q3QuVFlQRURfQVJSQVlfU1VQUE9SVDt2YXIgcXQ9TnQoKTtmdW5jdGlvbiBOdCgpe3JldHVybiBGdC5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBLdChlLHQpe2lmKE50KCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gRnQuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT1uZXcgVWludDhBcnJheSh0KSkuX19wcm90b19fPUZ0LnByb3RvdHlwZToobnVsbD09PWUmJihlPW5ldyBGdCh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBGdChlLHQscil7aWYoIShGdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgRnQpKXJldHVybiBuZXcgRnQoZSx0LHIpO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4genQodGhpcyxlKX1yZXR1cm4gWXQodGhpcyxlLHQscil9ZnVuY3Rpb24gWXQoZSx0LHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24oZSx0LHIsbil7aWYodC5ieXRlTGVuZ3RoLHI8MHx8dC5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZih0LmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtyZXR1cm4gdD12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkodCxyKTpuZXcgVWludDhBcnJheSh0LHIsbiksRnQuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189RnQucHJvdG90eXBlOmU9SnQoZSx0KSxlfShlLHQscixuKToic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0LHIpe2lmKCJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpLCFGdC5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8R3QodCxyKSxpPShlPUt0KGUsbikpLndyaXRlKHQscik7cmV0dXJuIGkhPT1uJiYoZT1lLnNsaWNlKDAsaSkpLGV9KGUsdCxyKTpmdW5jdGlvbihlLHQpe2lmKCR0KHQpKXt2YXIgcj0wfFZ0KHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPUt0KGUscikpLmxlbmd0aHx8dC5jb3B5KGUsMCwwLHIpLGV9aWYodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiB0KXJldHVybiJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fChuPXQubGVuZ3RoKSE9bj9LdChlLDApOkp0KGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJkJ0KHQuZGF0YSkpcmV0dXJuIEp0KGUsdC5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KGUsdCl9ZnVuY3Rpb24gV3QoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiB6dChlLHQpe2lmKFd0KHQpLGU9S3QoZSx0PDA/MDowfFZ0KHQpKSwhRnQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPHQ7KytyKWVbcl09MDtyZXR1cm4gZX1mdW5jdGlvbiBKdChlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfFZ0KHQubGVuZ3RoKTtlPUt0KGUscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpZVtuXT0yNTUmdFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBWdChlKXtpZihlPj1OdCgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitOdCgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8ZX1mdW5jdGlvbiAkdChlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24gR3QoZSx0KXtpZigkdChlKSlyZXR1cm4gZS5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gZS5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgZSYmKGU9IiIrZSk7dmFyIHI9ZS5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKHQpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4ga3IoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBTcihlKS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBrcihlKS5sZW5ndGg7dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBYdChlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBscih0aGlzLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gdXIodGhpcyx0LHIpO2Nhc2UiYXNjaWkiOnJldHVybiBjcih0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gaHIodGhpcyx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gYXIodGhpcyx0LHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gZnIodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gWnQoZSx0LHIpe3ZhciBuPWVbdF07ZVt0XT1lW3JdLGVbcl09bn1mdW5jdGlvbiBRdChlLHQscixuLGkpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDplLmxlbmd0aC0xKSxyPDAmJihyPWUubGVuZ3RoK3IpLHI+PWUubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9ZS5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9RnQuZnJvbSh0LG4pKSwkdCh0KSlyZXR1cm4gMD09PXQubGVuZ3RoPy0xOmVyKGUsdCxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Jj0yNTUsRnQuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOmVyKGUsW3RdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBlcihlLHQscixuLGkpe3ZhciBvLHM9MSxhPWUubGVuZ3RoLHU9dC5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYoZS5sZW5ndGg8Mnx8dC5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gYyhlLHQpe3JldHVybiAxPT09cz9lW3RdOmUucmVhZFVJbnQxNkJFKHQqcyl9aWYoaSl7dmFyIGg9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGMoZSxvKT09PWModCwtMT09PWg/MDpvLWgpKXtpZigtMT09PWgmJihoPW8pLG8taCsxPT09dSlyZXR1cm4gaCpzfWVsc2UtMSE9PWgmJihvLT1vLWgpLGg9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGw9ITAsZj0wO2Y8dTtmKyspaWYoYyhlLG8rZikhPT1jKHQsZikpe2w9ITE7YnJlYWt9aWYobClyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiB0cihlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gcnIoZSx0LHIsbil7cmV0dXJuIEFyKGtyKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIG5yKGUsdCxyLG4pe3JldHVybiBBcihmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7KytyKXQucHVzaCgyNTUmZS5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gdH0odCksZSxyLG4pfWZ1bmN0aW9uIGlyKGUsdCxyLG4pe3JldHVybiBucihlLHQscixuKX1mdW5jdGlvbiBvcihlLHQscixuKXtyZXR1cm4gQXIoU3IodCksZSxyLG4pfWZ1bmN0aW9uIHNyKGUsdCxyLG4pe3JldHVybiBBcihmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIGFyKGUsdCxyKXtyZXR1cm4gMD09PXQmJnI9PT1lLmxlbmd0aD9MdChlKTpMdChlLnNsaWNlKHQscikpfWZ1bmN0aW9uIHVyKGUsdCxyKXtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPXQ7aTxyOyl7dmFyIG8scyxhLHUsYz1lW2ldLGg9bnVsbCxsPWM+MjM5PzQ6Yz4yMjM/MzpjPjE5MT8yOjE7aWYoaStsPD1yKXN3aXRjaChsKXtjYXNlIDE6YzwxMjgmJihoPWMpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89ZVtpKzFdKSkmJih1PSgzMSZjKTw8Nnw2MyZvKT4xMjcmJihoPXUpO2JyZWFrO2Nhc2UgMzpvPWVbaSsxXSxzPWVbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmMpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoaD11KTticmVhaztjYXNlIDQ6bz1lW2krMV0scz1lW2krMl0sYT1lW2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmMpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmdTwxMTE0MTEyJiYoaD11KX1udWxsPT09aD8oaD02NTUzMyxsPTEpOmg+NjU1MzUmJihoLT02NTUzNixuLnB1c2goaD4+PjEwJjEwMjN8NTUyOTYpLGg9NTYzMjB8MTAyMyZoKSxuLnB1c2goaCksaSs9bH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9NDA5NilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7Zm9yKHZhciByPSIiLG49MDtuPHQ7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UobixuKz00MDk2KSk7cmV0dXJuIHJ9KG4pfWZ1bmN0aW9uIGNyKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gaHIoZSx0LHIpe3ZhciBuPSIiO3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBpPXQ7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbaV0pO3JldHVybiBufWZ1bmN0aW9uIGxyKGUsdCxyKXt2YXIgbj1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz10O288cjsrK28paSs9X3IoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gZnIoZSx0LHIpe2Zvcih2YXIgbj1lLnNsaWNlKHQsciksaT0iIixvPTA7bzxuLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUobltvXSsyNTYqbltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBkcihlLHQscil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gcHIoZSx0LHIsbixpLG8pe2lmKCEkdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5pfHx0PG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gZ3IoZSx0LHIsbil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciwyKTtpPG87KytpKWVbcitpXT0odCYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIHZyKGUsdCxyLG4pe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciw0KTtpPG87KytpKWVbcitpXT10Pj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIHlyKGUsdCxyLG4saSxvKXtpZihyK24+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gbXIoZSx0LHIsbixpKXtyZXR1cm4gaXx8eXIoZSwwLHIsNCkseHQoZSx0LHIsbiwyMyw0KSxyKzR9ZnVuY3Rpb24gd3IoZSx0LHIsbixpKXtyZXR1cm4gaXx8eXIoZSwwLHIsOCkseHQoZSx0LHIsbiw1Miw4KSxyKzh9RnQucG9vbFNpemU9ODE5MixGdC5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189RnQucHJvdG90eXBlLGV9LEZ0LmZyb209ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBZdChudWxsLGUsdCxyKX0sRnQuVFlQRURfQVJSQVlfU1VQUE9SVCYmKEZ0LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsRnQuX19wcm90b19fPVVpbnQ4QXJyYXkpLEZ0LmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIFd0KHQpLHQ8PTA/S3QoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9LdChlLHQpLmZpbGwocixuKTpLdChlLHQpLmZpbGwocik6S3QoZSx0KX0obnVsbCxlLHQscil9LEZ0LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiB6dChudWxsLGUpfSxGdC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIHp0KG51bGwsZSl9LEZ0LmlzQnVmZmVyPUVyLEZ0LmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighJHQoZSl8fCEkdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtyPWVbaV0sbj10W2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sRnQuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sRnQuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIUJ0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIEZ0LmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxyPTA7cjxlLmxlbmd0aDsrK3IpdCs9ZVtyXS5sZW5ndGg7dmFyIG49RnQuYWxsb2NVbnNhZmUodCksaT0wO2ZvcihyPTA7cjxlLmxlbmd0aDsrK3Ipe3ZhciBvPWVbcl07aWYoISR0KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sRnQuYnl0ZUxlbmd0aD1HdCxGdC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLEZ0LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpWnQodGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LEZ0LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpWnQodGhpcyx0LHQrMyksWnQodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sRnQucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OCladCh0aGlzLHQsdCs3KSxadCh0aGlzLHQrMSx0KzYpLFp0KHRoaXMsdCsyLHQrNSksWnQodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sRnQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/dXIodGhpcywwLGUpOlh0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sRnQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighJHQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PUZ0LmNvbXBhcmUodGhpcyxlKX0sRnQucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sRnQucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZighJHQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PXImJihyPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLHQ8MHx8cj5lLmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZ0Pj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYodD49cilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKG8scyksdT10aGlzLnNsaWNlKG4saSksYz1lLnNsaWNlKHQsciksaD0wO2g8YTsrK2gpaWYodVtoXSE9PWNbaF0pe289dVtoXSxzPWNbaF07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxGdC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxyKX0sRnQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBRdCh0aGlzLGUsdCxyLCEwKX0sRnQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gUXQodGhpcyxlLHQsciwhMSl9LEZ0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQscixuKXtpZih2b2lkIDA9PT10KW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiB0KW49dCxyPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSxlLmxlbmd0aD4wJiYocjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gdHIodGhpcyxlLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gcnIodGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIG5yKHRoaXMsZSx0LHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGlyKHRoaXMsZSx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gb3IodGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBzcih0aGlzLGUsdCxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxGdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fSxGdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKChlPX5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSwodD12b2lkIDA9PT10P246fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLHQ8ZSYmKHQ9ZSksRnQuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1GdC5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgRnQoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rZV19cmV0dXJuIHJ9LEZ0LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8ZHIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LEZ0LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8ZHIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlKy0tdF0saT0xO3Q+MCYmKGkqPTI1Nik7KW4rPXRoaXNbZSstLXRdKmk7cmV0dXJuIG59LEZ0LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ZHIoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxGdC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fGRyKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LEZ0LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ZHIoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sRnQucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxkcihlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LEZ0LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ZHIoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxGdC5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8ZHIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KnQpKSxufSxGdC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8ZHIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dCxpPTEsbz10aGlzW2UrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW2UrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCp0KSksb30sRnQucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fGRyKGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LEZ0LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe3R8fGRyKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEZ0LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fGRyKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEZ0LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxkcihlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sRnQucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fGRyKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxGdC5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ZHIoZSw0LHRoaXMubGVuZ3RoKSxIdCh0aGlzLGUsITAsMjMsNCl9LEZ0LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxkcihlLDQsdGhpcy5sZW5ndGgpLEh0KHRoaXMsZSwhMSwyMyw0KX0sRnQucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxkcihlLDgsdGhpcy5sZW5ndGgpLEh0KHRoaXMsZSwhMCw1Miw4KX0sRnQucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxkcihlLDgsdGhpcy5sZW5ndGgpLEh0KHRoaXMsZSwhMSw1Miw4KX0sRnQucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2U9K2UsdHw9MCxyfD0wLG58fHByKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPHImJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pJjI1NTtyZXR1cm4gdCtyfSxGdC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7ZT0rZSx0fD0wLHJ8PTAsbnx8cHIodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspdGhpc1t0K2ldPWUvbyYyNTU7cmV0dXJuIHQrcn0sRnQucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8cHIodGhpcyxlLHQsMSwyNTUsMCksRnQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LEZ0LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHByKHRoaXMsZSx0LDIsNjU1MzUsMCksRnQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOmdyKHRoaXMsZSx0LCEwKSx0KzJ9LEZ0LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHByKHRoaXMsZSx0LDIsNjU1MzUsMCksRnQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOmdyKHRoaXMsZSx0LCExKSx0KzJ9LEZ0LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHByKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxGdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOnZyKHRoaXMsZSx0LCEwKSx0KzR9LEZ0LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHByKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxGdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOnZyKHRoaXMsZSx0LCExKSx0KzR9LEZ0LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7cHIodGhpcyxlLHQscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK288ciYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3Qrby0xXSYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K3J9LEZ0LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7cHIodGhpcyxlLHQscixpLTEsLWkpfXZhciBvPXItMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109MjU1JmU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvKzFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrcn0sRnQucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxwcih0aGlzLGUsdCwxLDEyNywtMTI4KSxGdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxGdC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHByKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxGdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6Z3IodGhpcyxlLHQsITApLHQrMn0sRnQucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxwcih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksRnQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOmdyKHRoaXMsZSx0LCExKSx0KzJ9LEZ0LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8cHIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxGdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOnZyKHRoaXMsZSx0LCEwKSx0KzR9LEZ0LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8cHIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxGdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOnZyKHRoaXMsZSx0LCExKSx0KzR9LEZ0LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBtcih0aGlzLGUsdCwhMCxyKX0sRnQucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIG1yKHRoaXMsZSx0LCExLHIpfSxGdC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHdyKHRoaXMsZSx0LCEwLHIpfSxGdC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHdyKHRoaXMsZSx0LCExLHIpfSxGdC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8bi1yJiYobj1lLmxlbmd0aC10K3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT1lJiZyPHQmJnQ8bilmb3IoaT1vLTE7aT49MDstLWkpZVtpK3RdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhRnQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpZVtpK3RdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShyLHIrbyksdCk7cmV0dXJuIG99LEZ0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhuPXQsdD0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBpPWUuY2hhckNvZGVBdCgwKTtpPDI1NiYmKGU9aSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFGdC5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD10KXJldHVybiB0aGlzO3ZhciBvO2lmKHQ+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihvPXQ7bzxyOysrbyl0aGlzW29dPWU7ZWxzZXt2YXIgcz0kdChlKT9lOmtyKG5ldyBGdChlLG4pLnRvU3RyaW5nKCkpLGE9cy5sZW5ndGg7Zm9yKG89MDtvPHItdDsrK28pdGhpc1tvK3RdPXNbbyVhXX1yZXR1cm4gdGhpc307dmFyIGJyPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIF9yKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBrcihlLHQpe3ZhciByO3Q9dHx8MS8wO2Zvcih2YXIgbj1lLmxlbmd0aCxpPW51bGwsbz1bXSxzPTA7czxuOysrcyl7aWYoKHI9ZS5jaGFyQ29kZUF0KHMpKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1uKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigodC09MSk8MClicmVhaztvLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO28ucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigodC09Myk8MClicmVhaztvLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO28ucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gU3IoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LHIsbixpLG8scztJdHx8VXQoKTt2YXIgYT1lLmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PWVbYS0yXT8yOiI9Ij09PWVbYS0xXT8xOjAscz1uZXcgT3QoMyphLzQtbyksbj1vPjA/YS00OmE7dmFyIHU9MDtmb3IodD0wLHI9MDt0PG47dCs9NCxyKz0zKWk9RHRbZS5jaGFyQ29kZUF0KHQpXTw8MTh8RHRbZS5jaGFyQ29kZUF0KHQrMSldPDwxMnxEdFtlLmNoYXJDb2RlQXQodCsyKV08PDZ8RHRbZS5jaGFyQ29kZUF0KHQrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9RHRbZS5jaGFyQ29kZUF0KHQpXTw8MnxEdFtlLmNoYXJDb2RlQXQodCsxKV0+PjQsc1t1KytdPTI1NSZpKToxPT09byYmKGk9RHRbZS5jaGFyQ29kZUF0KHQpXTw8MTB8RHRbZS5jaGFyQ29kZUF0KHQrMSldPDw0fER0W2UuY2hhckNvZGVBdCh0KzIpXT4+MixzW3UrK109aT4+OCYyNTUsc1t1KytdPTI1NSZpKSxzfShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKGJyLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBBcihlLHQscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj10Lmxlbmd0aHx8aT49ZS5sZW5ndGgpOysraSl0W2krcl09ZVtpXTtyZXR1cm4gaX1mdW5jdGlvbiBFcihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fFRyKGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJlRyKGUuc2xpY2UoMCwwKSl9KGUpKX1mdW5jdGlvbiBUcihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciBScj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6RnQsSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksRnQuYWxsb2MoK2UpfSxpc0J1ZmZlcjpFcixrTWF4TGVuZ3RoOnF0fSksQ3I9UnQoKGZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxyPXQlNDtpZighcilyZXR1cm4gZTt2YXIgbj10LGk9NC1yLG89dCtpLHM9RnQuYWxsb2Mobyk7Zm9yKHMud3JpdGUoZSk7aS0tOylzLndyaXRlKCI9IixuKyspO3JldHVybiBzLnRvU3RyaW5nKCl9fSkpLFByPVJ0KChmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxGdC5pc0J1ZmZlcihlKT9pKGUudG9TdHJpbmcoImJhc2U2NCIpKTppKEZ0LmZyb20oZSx0KS50b1N0cmluZygiYmFzZTY0IikpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIGU9ZS50b1N0cmluZygpLENyLmRlZmF1bHQoZSkucmVwbGFjZSgvXC0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUucmVwbGFjZSgvPS9nLCIiKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1yO28uZW5jb2RlPXIsby5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxGdC5mcm9tKG4oZSksImJhc2U2NCIpLnRvU3RyaW5nKHQpfSxvLnRvQmFzZTY0PW4sby5mcm9tQmFzZTY0PWksby50b0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gRnQuZnJvbShuKGUpLCJiYXNlNjQiKX0sdC5kZWZhdWx0PW99KSksRHI9UnQoKGZ1bmN0aW9uKGUpe2UuZXhwb3J0cz1Qci5kZWZhdWx0LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0c30pKSxPcj1SdCgoZnVuY3Rpb24oZSx0KXt2YXIgcjtlLmV4cG9ydHM9KHI9cnx8ZnVuY3Rpb24oZSx0KXt2YXIgcj1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByO3JldHVybiBlLnByb3RvdHlwZT10LHI9bmV3IGUsZS5wcm90b3R5cGU9bnVsbCxyfX0oKSxuPXt9LGk9bi5saWI9e30sbz1pLkJhc2U9e2V4dGVuZDpmdW5jdGlvbihlKXt2YXIgdD1yKHRoaXMpO3JldHVybiBlJiZ0Lm1peEluKGUpLHQuaGFzT3duUHJvcGVydHkoImluaXQiKSYmdGhpcy5pbml0IT09dC5pbml0fHwodC5pbml0PWZ1bmN0aW9uKCl7dC4kc3VwZXIuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSx0LmluaXQucHJvdG90eXBlPXQsdC4kc3VwZXI9dGhpcyx0fSxjcmVhdGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmV4dGVuZCgpO3JldHVybiBlLmluaXQuYXBwbHkoZSxhcmd1bWVudHMpLGV9LGluaXQ6ZnVuY3Rpb24oKXt9LG1peEluOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJih0aGlzW3RdPWVbdF0pO2UuaGFzT3duUHJvcGVydHkoInRvU3RyaW5nIikmJih0aGlzLnRvU3RyaW5nPWUudG9TdHJpbmcpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluaXQucHJvdG90eXBlLmV4dGVuZCh0aGlzKX19LHM9aS5Xb3JkQXJyYXk9by5leHRlbmQoe2luaXQ6ZnVuY3Rpb24oZSx0KXtlPXRoaXMud29yZHM9ZXx8W10sdGhpcy5zaWdCeXRlcz1udWxsIT10P3Q6NCplLmxlbmd0aH0sdG9TdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuKGV8fHUpLnN0cmluZ2lmeSh0aGlzKX0sY29uY2F0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMud29yZHMscj1lLndvcmRzLG49dGhpcy5zaWdCeXRlcyxpPWUuc2lnQnl0ZXM7aWYodGhpcy5jbGFtcCgpLG4lNClmb3IodmFyIG89MDtvPGk7bysrKXt2YXIgcz1yW28+Pj4yXT4+PjI0LW8lNCo4JjI1NTt0W24rbz4+PjJdfD1zPDwyNC0obitvKSU0Kjh9ZWxzZSBmb3Iobz0wO288aTtvKz00KXRbbitvPj4+Ml09cltvPj4+Ml07cmV0dXJuIHRoaXMuc2lnQnl0ZXMrPWksdGhpc30sY2xhbXA6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLndvcmRzLHI9dGhpcy5zaWdCeXRlczt0W3I+Pj4yXSY9NDI5NDk2NzI5NTw8MzItciU0KjgsdC5sZW5ndGg9ZS5jZWlsKHIvNCl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGU9by5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLndvcmRzPXRoaXMud29yZHMuc2xpY2UoMCksZX0scmFuZG9tOmZ1bmN0aW9uKHQpe2Zvcih2YXIgcixuPVtdLGk9ZnVuY3Rpb24odCl7dD10O3ZhciByPTk4NzY1NDMyMSxuPTQyOTQ5NjcyOTU7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9KChyPTM2OTY5Kig2NTUzNSZyKSsocj4+MTYpJm4pPDwxNikrKHQ9MThlMyooNjU1MzUmdCkrKHQ+PjE2KSZuKSZuO3JldHVybiBpLz00Mjk0OTY3Mjk2LChpKz0uNSkqKGUucmFuZG9tKCk+LjU/MTotMSl9fSxvPTA7bzx0O28rPTQpe3ZhciBhPWkoNDI5NDk2NzI5Nioocnx8ZS5yYW5kb20oKSkpO3I9OTg3NjU0MDcxKmEoKSxuLnB1c2goNDI5NDk2NzI5NiphKCl8MCl9cmV0dXJuIG5ldyBzLmluaXQobix0KX19KSxhPW4uZW5jPXt9LHU9YS5IZXg9e3N0cmluZ2lmeTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS53b3JkcyxyPWUuc2lnQnl0ZXMsbj1bXSxpPTA7aTxyO2krKyl7dmFyIG89dFtpPj4+Ml0+Pj4yNC1pJTQqOCYyNTU7bi5wdXNoKChvPj4+NCkudG9TdHJpbmcoMTYpKSxuLnB1c2goKDE1Jm8pLnRvU3RyaW5nKDE2KSl9cmV0dXJuIG4uam9pbigiIil9LHBhcnNlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aCxyPVtdLG49MDtuPHQ7bis9MilyW24+Pj4zXXw9cGFyc2VJbnQoZS5zdWJzdHIobiwyKSwxNik8PDI0LW4lOCo0O3JldHVybiBuZXcgcy5pbml0KHIsdC8yKX19LGM9YS5MYXRpbjE9e3N0cmluZ2lmeTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS53b3JkcyxyPWUuc2lnQnl0ZXMsbj1bXSxpPTA7aTxyO2krKyl7dmFyIG89dFtpPj4+Ml0+Pj4yNC1pJTQqOCYyNTU7bi5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUobykpfXJldHVybiBuLmpvaW4oIiIpfSxwYXJzZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5sZW5ndGgscj1bXSxuPTA7bjx0O24rKylyW24+Pj4yXXw9KDI1NSZlLmNoYXJDb2RlQXQobikpPDwyNC1uJTQqODtyZXR1cm4gbmV3IHMuaW5pdChyLHQpfX0saD1hLlV0Zjg9e3N0cmluZ2lmeTpmdW5jdGlvbihlKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoYy5zdHJpbmdpZnkoZSkpKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBVVEYtOCBkYXRhIil9fSxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm4gYy5wYXJzZSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpKX19LGw9aS5CdWZmZXJlZEJsb2NrQWxnb3JpdGhtPW8uZXh0ZW5kKHtyZXNldDpmdW5jdGlvbigpe3RoaXMuX2RhdGE9bmV3IHMuaW5pdCx0aGlzLl9uRGF0YUJ5dGVzPTB9LF9hcHBlbmQ6ZnVuY3Rpb24oZSl7InN0cmluZyI9PXR5cGVvZiBlJiYoZT1oLnBhcnNlKGUpKSx0aGlzLl9kYXRhLmNvbmNhdChlKSx0aGlzLl9uRGF0YUJ5dGVzKz1lLnNpZ0J5dGVzfSxfcHJvY2VzczpmdW5jdGlvbih0KXt2YXIgcj10aGlzLl9kYXRhLG49ci53b3JkcyxpPXIuc2lnQnl0ZXMsbz10aGlzLmJsb2NrU2l6ZSxhPWkvKDQqbyksdT0oYT10P2UuY2VpbChhKTplLm1heCgoMHxhKS10aGlzLl9taW5CdWZmZXJTaXplLDApKSpvLGM9ZS5taW4oNCp1LGkpO2lmKHUpe2Zvcih2YXIgaD0wO2g8dTtoKz1vKXRoaXMuX2RvUHJvY2Vzc0Jsb2NrKG4saCk7dmFyIGw9bi5zcGxpY2UoMCx1KTtyLnNpZ0J5dGVzLT1jfXJldHVybiBuZXcgcy5pbml0KGwsYyl9LGNsb25lOmZ1bmN0aW9uKCl7dmFyIGU9by5jbG9uZS5jYWxsKHRoaXMpO3JldHVybiBlLl9kYXRhPXRoaXMuX2RhdGEuY2xvbmUoKSxlfSxfbWluQnVmZmVyU2l6ZTowfSksZj0oaS5IYXNoZXI9bC5leHRlbmQoe2NmZzpvLmV4dGVuZCgpLGluaXQ6ZnVuY3Rpb24oZSl7dGhpcy5jZmc9dGhpcy5jZmcuZXh0ZW5kKGUpLHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXtsLnJlc2V0LmNhbGwodGhpcyksdGhpcy5fZG9SZXNldCgpfSx1cGRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2FwcGVuZChlKSx0aGlzLl9wcm9jZXNzKCksdGhpc30sZmluYWxpemU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJnRoaXMuX2FwcGVuZChlKSx0aGlzLl9kb0ZpbmFsaXplKCl9LGJsb2NrU2l6ZToxNixfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LHIpe3JldHVybiBuZXcgZS5pbml0KHIpLmZpbmFsaXplKHQpfX0sX2NyZWF0ZUhtYWNIZWxwZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQscil7cmV0dXJuIG5ldyBmLkhNQUMuaW5pdChlLHIpLmZpbmFsaXplKHQpfX19KSxuLmFsZ289e30pO3JldHVybiBufShNYXRoKSxyKX0pKSxJcj1SdCgoZnVuY3Rpb24oZSx0KXt2YXIgcjtlLmV4cG9ydHM9KHI9T3IsZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIpe3ZhciBlPXIubGliLldvcmRBcnJheSx0PWUuaW5pdDsoZS5pbml0PWZ1bmN0aW9uKGUpe2lmKGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmKGU9bmV3IFVpbnQ4QXJyYXkoZSkpLChlIGluc3RhbmNlb2YgSW50OEFycmF5fHwidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiZlIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXl8fGUgaW5zdGFuY2VvZiBJbnQxNkFycmF5fHxlIGluc3RhbmNlb2YgVWludDE2QXJyYXl8fGUgaW5zdGFuY2VvZiBJbnQzMkFycmF5fHxlIGluc3RhbmNlb2YgVWludDMyQXJyYXl8fGUgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXl8fGUgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpJiYoZT1uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKSksZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2Zvcih2YXIgcj1lLmJ5dGVMZW5ndGgsbj1bXSxpPTA7aTxyO2krKyluW2k+Pj4yXXw9ZVtpXTw8MjQtaSU0Kjg7dC5jYWxsKHRoaXMsbixyKX1lbHNlIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkucHJvdG90eXBlPWV9fSgpLHIubGliLldvcmRBcnJheSl9KSksVXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZX0oUnQoKGZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0LHIpe3ZhciBuPXt9OyFmdW5jdGlvbihlKXtlLl9fZXNNb2R1bGU9ITAsZS5kaWdlc3RMZW5ndGg9MzIsZS5ibG9ja1NpemU9NjQ7dmFyIHQ9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKTtmdW5jdGlvbiByKGUscixuLGksbyl7Zm9yKHZhciBzLGEsdSxjLGgsbCxmLGQscCxnLHYseSxtO28+PTY0Oyl7Zm9yKHM9clswXSxhPXJbMV0sdT1yWzJdLGM9clszXSxoPXJbNF0sbD1yWzVdLGY9cls2XSxkPXJbN10sZz0wO2c8MTY7ZysrKXY9aSs0KmcsZVtnXT0oMjU1Jm5bdl0pPDwyNHwoMjU1Jm5bdisxXSk8PDE2fCgyNTUmblt2KzJdKTw8OHwyNTUmblt2KzNdO2ZvcihnPTE2O2c8NjQ7ZysrKXk9KChwPWVbZy0yXSk+Pj4xN3xwPDwxNSleKHA+Pj4xOXxwPDwxMylecD4+PjEwLG09KChwPWVbZy0xNV0pPj4+N3xwPDwyNSleKHA+Pj4xOHxwPDwxNClecD4+PjMsZVtnXT0oeStlW2ctN118MCkrKG0rZVtnLTE2XXwwKTtmb3IoZz0wO2c8NjQ7ZysrKXk9KCgoaD4+PjZ8aDw8MjYpXihoPj4+MTF8aDw8MjEpXihoPj4+MjV8aDw8NykpKyhoJmxefmgmZil8MCkrKGQrKHRbZ10rZVtnXXwwKXwwKXwwLG09KChzPj4+MnxzPDwzMCleKHM+Pj4xM3xzPDwxOSleKHM+Pj4yMnxzPDwxMCkpKyhzJmFecyZ1XmEmdSl8MCxkPWYsZj1sLGw9aCxoPWMreXwwLGM9dSx1PWEsYT1zLHM9eSttfDA7clswXSs9cyxyWzFdKz1hLHJbMl0rPXUsclszXSs9YyxyWzRdKz1oLHJbNV0rPWwscls2XSs9ZixyWzddKz1kLGkrPTY0LG8tPTY0fXJldHVybiBpfXZhciBuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZGlnZXN0TGVuZ3RoPWUuZGlnZXN0TGVuZ3RoLHRoaXMuYmxvY2tTaXplPWUuYmxvY2tTaXplLHRoaXMuc3RhdGU9bmV3IEludDMyQXJyYXkoOCksdGhpcy50ZW1wPW5ldyBJbnQzMkFycmF5KDY0KSx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxMjgpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5yZXNldCgpfXJldHVybiB0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlWzBdPTE3NzkwMzM3MDMsdGhpcy5zdGF0ZVsxXT0zMTQ0MTM0Mjc3LHRoaXMuc3RhdGVbMl09MTAxMzkwNDI0Mix0aGlzLnN0YXRlWzNdPTI3NzM0ODA3NjIsdGhpcy5zdGF0ZVs0XT0xMzU5ODkzMTE5LHRoaXMuc3RhdGVbNV09MjYwMDgyMjkyNCx0aGlzLnN0YXRlWzZdPTUyODczNDYzNSx0aGlzLnN0YXRlWzddPTE1NDE0NTkyMjUsdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzfSx0LnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5idWZmZXIubGVuZ3RoO2UrKyl0aGlzLmJ1ZmZlcltlXT0wO2ZvcihlPTA7ZTx0aGlzLnRlbXAubGVuZ3RoO2UrKyl0aGlzLnRlbXBbZV09MDt0aGlzLnJlc2V0KCl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PWUubGVuZ3RoKSx0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiU0hBMjU2OiBjYW4ndCB1cGRhdGUgYmVjYXVzZSBoYXNoIHdhcyBmaW5pc2hlZC4iKTt2YXIgbj0wO2lmKHRoaXMuYnl0ZXNIYXNoZWQrPXQsdGhpcy5idWZmZXJMZW5ndGg+MCl7Zm9yKDt0aGlzLmJ1ZmZlckxlbmd0aDw2NCYmdD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW24rK10sdC0tOzY0PT09dGhpcy5idWZmZXJMZW5ndGgmJihyKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAsNjQpLHRoaXMuYnVmZmVyTGVuZ3RoPTApfWZvcih0Pj02NCYmKG49cih0aGlzLnRlbXAsdGhpcy5zdGF0ZSxlLG4sdCksdCU9NjQpO3Q+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtuKytdLHQtLTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLmJ5dGVzSGFzaGVkLG49dGhpcy5idWZmZXJMZW5ndGgsaT10LzUzNjg3MDkxMnwwLG89dDw8MyxzPXQlNjQ8NTY/NjQ6MTI4O3RoaXMuYnVmZmVyW25dPTEyODtmb3IodmFyIGE9bisxO2E8cy04O2ErKyl0aGlzLmJ1ZmZlclthXT0wO3RoaXMuYnVmZmVyW3MtOF09aT4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTddPWk+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy02XT1pPj4+OCYyNTUsdGhpcy5idWZmZXJbcy01XT1pPj4+MCYyNTUsdGhpcy5idWZmZXJbcy00XT1vPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtM109bz4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTJdPW8+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTFdPW8+Pj4wJjI1NSxyKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAscyksdGhpcy5maW5pc2hlZD0hMH1mb3IoYT0wO2E8ODthKyspZVs0KmErMF09dGhpcy5zdGF0ZVthXT4+PjI0JjI1NSxlWzQqYSsxXT10aGlzLnN0YXRlW2FdPj4+MTYmMjU1LGVbNCphKzJdPXRoaXMuc3RhdGVbYV0+Pj44JjI1NSxlWzQqYSszXT10aGlzLnN0YXRlW2FdPj4+MCYyNTU7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sdC5wcm90b3R5cGUuX3NhdmVTdGF0ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PHRoaXMuc3RhdGUubGVuZ3RoO3QrKyllW3RdPXRoaXMuc3RhdGVbdF19LHQucHJvdG90eXBlLl9yZXN0b3JlU3RhdGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9MDtyPHRoaXMuc3RhdGUubGVuZ3RoO3IrKyl0aGlzLnN0YXRlW3JdPWVbcl07dGhpcy5ieXRlc0hhc2hlZD10LHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5idWZmZXJMZW5ndGg9MH0sdH0oKTtlLkhhc2g9bjt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5pbm5lcj1uZXcgbix0aGlzLm91dGVyPW5ldyBuLHRoaXMuYmxvY2tTaXplPXRoaXMuaW5uZXIuYmxvY2tTaXplLHRoaXMuZGlnZXN0TGVuZ3RoPXRoaXMuaW5uZXIuZGlnZXN0TGVuZ3RoO3ZhciB0PW5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tTaXplKTtpZihlLmxlbmd0aD50aGlzLmJsb2NrU2l6ZSkobmV3IG4pLnVwZGF0ZShlKS5maW5pc2godCkuY2xlYW4oKTtlbHNlIGZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXRbcl09ZVtyXTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl1ePTU0O2Zvcih0aGlzLmlubmVyLnVwZGF0ZSh0KSxyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXV49MTA2O2Zvcih0aGlzLm91dGVyLnVwZGF0ZSh0KSx0aGlzLmlzdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5vc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMuaW5uZXIuX3NhdmVTdGF0ZSh0aGlzLmlzdGF0ZSksdGhpcy5vdXRlci5fc2F2ZVN0YXRlKHRoaXMub3N0YXRlKSxyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXT0wfXJldHVybiBlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlubmVyLl9yZXN0b3JlU3RhdGUodGhpcy5pc3RhdGUsdGhpcy5pbm5lci5ibG9ja1NpemUpLHRoaXMub3V0ZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLm9zdGF0ZSx0aGlzLm91dGVyLmJsb2NrU2l6ZSksdGhpc30sZS5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuaXN0YXRlLmxlbmd0aDtlKyspdGhpcy5vc3RhdGVbZV09dGhpcy5pc3RhdGVbZV09MDt0aGlzLmlubmVyLmNsZWFuKCksdGhpcy5vdXRlci5jbGVhbigpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5uZXIudXBkYXRlKGUpLHRoaXN9LGUucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vdXRlci5maW5pc2hlZD90aGlzLm91dGVyLmZpbmlzaChlKToodGhpcy5pbm5lci5maW5pc2goZSksdGhpcy5vdXRlci51cGRhdGUoZSx0aGlzLmRpZ2VzdExlbmd0aCkuZmluaXNoKGUpKSx0aGlzfSxlLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LGV9KCk7ZnVuY3Rpb24gbyhlKXt2YXIgdD0obmV3IG4pLnVwZGF0ZShlKSxyPXQuZGlnZXN0KCk7cmV0dXJuIHQuY2xlYW4oKSxyfWZ1bmN0aW9uIHMoZSx0KXt2YXIgcj1uZXcgaShlKS51cGRhdGUodCksbj1yLmRpZ2VzdCgpO3JldHVybiByLmNsZWFuKCksbn1mdW5jdGlvbiBhKGUsdCxyLG4pe3ZhciBpPW5bMF07aWYoMD09PWkpdGhyb3cgbmV3IEVycm9yKCJoa2RmOiBjYW5ub3QgZXhwYW5kIG1vcmUiKTt0LnJlc2V0KCksaT4xJiZ0LnVwZGF0ZShlKSxyJiZ0LnVwZGF0ZShyKSx0LnVwZGF0ZShuKSx0LmZpbmlzaChlKSxuWzBdKyt9ZS5ITUFDPWksZS5oYXNoPW8sZS5kZWZhdWx0PW8sZS5obWFjPXM7dmFyIHU9bmV3IFVpbnQ4QXJyYXkoZS5kaWdlc3RMZW5ndGgpO2UuaGtkZj1mdW5jdGlvbihlLHQscixuKXt2b2lkIDA9PT10JiYodD11KSx2b2lkIDA9PT1uJiYobj0zMik7Zm9yKHZhciBvPW5ldyBVaW50OEFycmF5KFsxXSksYz1zKHQsZSksaD1uZXcgaShjKSxsPW5ldyBVaW50OEFycmF5KGguZGlnZXN0TGVuZ3RoKSxmPWwubGVuZ3RoLGQ9bmV3IFVpbnQ4QXJyYXkobikscD0wO3A8bjtwKyspZj09PWwubGVuZ3RoJiYoYShsLGgscixvKSxmPTApLGRbcF09bFtmKytdO3JldHVybiBoLmNsZWFuKCksbC5maWxsKDApLG8uZmlsbCgwKSxkfSxlLnBia2RmMj1mdW5jdGlvbihlLHQscixuKXtmb3IodmFyIG89bmV3IGkoZSkscz1vLmRpZ2VzdExlbmd0aCxhPW5ldyBVaW50OEFycmF5KDQpLHU9bmV3IFVpbnQ4QXJyYXkocyksYz1uZXcgVWludDhBcnJheShzKSxoPW5ldyBVaW50OEFycmF5KG4pLGw9MDtsKnM8bjtsKyspe3ZhciBmPWwrMTthWzBdPWY+Pj4yNCYyNTUsYVsxXT1mPj4+MTYmMjU1LGFbMl09Zj4+PjgmMjU1LGFbM109Zj4+PjAmMjU1LG8ucmVzZXQoKSxvLnVwZGF0ZSh0KSxvLnVwZGF0ZShhKSxvLmZpbmlzaChjKTtmb3IodmFyIGQ9MDtkPHM7ZCsrKXVbZF09Y1tkXTtmb3IoZD0yO2Q8PXI7ZCsrKXtvLnJlc2V0KCksby51cGRhdGUoYykuZmluaXNoKGMpO2Zvcih2YXIgcD0wO3A8cztwKyspdVtwXV49Y1twXX1mb3IoZD0wO2Q8cyYmbCpzK2Q8bjtkKyspaFtsKnMrZF09dVtkXX1mb3IobD0wO2w8cztsKyspdVtsXT1jW2xdPTA7Zm9yKGw9MDtsPDQ7bCsrKWFbbF09MDtyZXR1cm4gby5jbGVhbigpLGh9fShuKTt2YXIgaT1uLmRlZmF1bHQ7Zm9yKHZhciBvIGluIG4paVtvXT1uW29dO2UuZXhwb3J0cz1pfSgpfSkpKTtmdW5jdGlvbiBNcigpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIExyKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgSHI9TXIseHI9THI7ZnVuY3Rpb24ganIoZSl7aWYoSHI9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKEhyPT09TXJ8fCFIcikmJnNldFRpbWVvdXQpcmV0dXJuIEhyPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gSHIoZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIEhyLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiBIci5jYWxsKHRoaXMsZSwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBDdC5zZXRUaW1lb3V0JiYoSHI9c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIEN0LmNsZWFyVGltZW91dCYmKHhyPWNsZWFyVGltZW91dCk7dmFyIEJyLHFyPVtdLE5yPSExLEtyPS0xO2Z1bmN0aW9uIEZyKCl7TnImJkJyJiYoTnI9ITEsQnIubGVuZ3RoP3FyPUJyLmNvbmNhdChxcik6S3I9LTEscXIubGVuZ3RoJiZZcigpKX1mdW5jdGlvbiBZcigpe2lmKCFOcil7dmFyIGU9anIoRnIpO05yPSEwO2Zvcih2YXIgdD1xci5sZW5ndGg7dDspe2ZvcihCcj1xcixxcj1bXTsrK0tyPHQ7KUJyJiZCcltLcl0ucnVuKCk7S3I9LTEsdD1xci5sZW5ndGh9QnI9bnVsbCxOcj0hMSxmdW5jdGlvbihlKXtpZih4cj09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKCh4cj09PUxyfHwheHIpJiZjbGVhclRpbWVvdXQpcmV0dXJuIHhyPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e3hyKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4geHIuY2FsbChudWxsLGUpfWNhdGNoKHQpe3JldHVybiB4ci5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIFdyKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9V3IucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O3ZhciB6cj1DdC5wZXJmb3JtYW5jZXx8e30sSnI9KHpyLm5vd3x8enIubW96Tm93fHx6ci5tc05vd3x8enIub05vd3x8enIud2Via2l0Tm93LG5ldyBEYXRlLGZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXRbci0xXT1hcmd1bWVudHNbcl07cXIucHVzaChuZXcgV3IoZSx0KSksMSE9PXFyLmxlbmd0aHx8TnJ8fGpyKFlyKX0pLFZyPWZ1bmN0aW9uKGUpe2lmKGUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgdD1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbihyKXt2YXIgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUscik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixuLmdldD9uOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlW3JdfX0pfSkpLHR9KFJyKSwkcj1SdCgoZnVuY3Rpb24oZSx0KXt2YXIgcj1Wci5CdWZmZXI7ZnVuY3Rpb24gbihlLHQpe2Zvcih2YXIgciBpbiBlKXRbcl09ZVtyXX1mdW5jdGlvbiBpKGUsdCxuKXtyZXR1cm4gcihlLHQsbil9ci5mcm9tJiZyLmFsbG9jJiZyLmFsbG9jVW5zYWZlJiZyLmFsbG9jVW5zYWZlU2xvdz9lLmV4cG9ydHM9VnI6KG4oVnIsdCksdC5CdWZmZXI9aSksbihyLGkpLGkuZnJvbT1mdW5jdGlvbihlLHQsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIoZSx0LG4pfSxpLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPXIoZSk7cmV0dXJuIHZvaWQgMCE9PXQ/InN0cmluZyI9PXR5cGVvZiBuP2kuZmlsbCh0LG4pOmkuZmlsbCh0KTppLmZpbGwoMCksaX0saS5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByKGUpfSxpLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBWci5TbG93QnVmZmVyKGUpfX0pKSxHcj1SdCgoZnVuY3Rpb24oZSl7dmFyIHQ9NjU1MzYscj0kci5CdWZmZXIsbj1UdC5jcnlwdG98fFR0Lm1zQ3J5cHRvO24mJm4uZ2V0UmFuZG9tVmFsdWVzP2UuZXhwb3J0cz1mdW5jdGlvbihlLGkpe2lmKGU+NDI5NDk2NzI5NSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlcyIpO3ZhciBvPXIuYWxsb2NVbnNhZmUoZSk7aWYoZT4wKWlmKGU+dClmb3IodmFyIHM9MDtzPGU7cys9dCluLmdldFJhbmRvbVZhbHVlcyhvLnNsaWNlKHMscyt0KSk7ZWxzZSBuLmdldFJhbmRvbVZhbHVlcyhvKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaT9KcigoZnVuY3Rpb24oKXtpKG51bGwsbyl9KSk6b306ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfX0pKTtjb25zdCBYcj1uZXcgVGV4dEVuY29kZXIsWnI9bmV3IFRleHREZWNvZGVyO3ZhciBRcj1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpcztpZigidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYpcmV0dXJuIHNlbGY7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpcmV0dXJuIHdpbmRvdzt0aHJvdyBuZXcgRXJyb3IoInVuYWJsZSB0byBsb2NhdGUgZ2xvYmFsIG9iamVjdCIpfSgpO2NvbnN0IGVuPWU9PntsZXQgdD1lO3JldHVybiB0IGluc3RhbmNlb2YgVWludDhBcnJheSYmKHQ9WnIuZGVjb2RlKHQpKSx0PXQucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikucmVwbGFjZSgvXHMvZywiIiksbmV3IFVpbnQ4QXJyYXkoUXIuYXRvYih0KS5zcGxpdCgiIikubWFwKChlPT5lLmNoYXJDb2RlQXQoMCkpKSl9O2NsYXNzIHRuIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSk9TRV9HRU5FUklDIix0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlJiZFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1jbGFzcyBybiBleHRlbmRzIHRue2NvbnN0cnVjdG9yKGUsdD0idW5zcGVjaWZpZWQiLHI9InVuc3BlY2lmaWVkIil7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEIix0aGlzLmNsYWltPXQsdGhpcy5yZWFzb249cn19Y2xhc3Mgbm4gZXh0ZW5kcyB0bntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSk9TRV9BTEdfTk9UX0FMTE9XRUQifX1jbGFzcyBvbiBleHRlbmRzIHRue2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KT1NFX05PVF9TVVBQT1JURUQifX1jbGFzcyBzbiBleHRlbmRzIHRue2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfSU5WQUxJRCJ9fWNsYXNzIGFuIGV4dGVuZHMgdG57Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXVF9JTlZBTElEIn19Y2xhc3MgdW4gZXh0ZW5kcyB0bntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIix0aGlzLm1lc3NhZ2U9InNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkIn19Y2xhc3MgY24gZXh0ZW5kcyBybntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldUX0VYUElSRUQifX12YXIgaG49UXIuY3J5cHRvO2Z1bmN0aW9uIGxuKCl7aWYoIVFyLmlzU2VjdXJlQ29udGV4dCYmIVFyLmNyeXB0by5zdWJ0bGUpdGhyb3cgbmV3IHRuKCJXZWIgQ3J5cHRvZ3JhcGh5IEFQSSBpcyBhdmFpbGFibGUgb25seSBpbiBTZWN1cmUgQ29udGV4dHMuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU2VjdXJpdHkvU2VjdXJlX0NvbnRleHRzIil9Y29uc3QgZm49YXN5bmMgZT0+e3ZhciB0LHI7Y29uc3R7YWxnb3JpdGhtOm4sa2V5VXNhZ2VzOml9PWZ1bmN0aW9uKGUpe2xldCB0LHI7c3dpdGNoKGUua3R5KXtjYXNlIm9jdCI6c3dpdGNoKGUuYWxnKXtjYXNlIkhTMjU2IjpjYXNlIkhTMzg0IjpjYXNlIkhTNTEyIjp0PXtuYW1lOiJITUFDIixoYXNoOmBTSEEtJHtlLmFsZy5zdWJzdHIoLTMpfWB9LHI9WyJzaWduIiwidmVyaWZ5Il07YnJlYWs7Y2FzZSJBMTI4Q0JDLUhTMjU2IjpjYXNlIkExOTJDQkMtSFMzODQiOmNhc2UiQTI1NkNCQy1IUzUxMiI6dGhyb3cgbmV3IG9uKGAke2UuYWxnfSBrZXlzIGNhbm5vdCBiZSBpbXBvcnRlZCBhcyBDcnlwdG9LZXkgaW5zdGFuY2VzYCk7Y2FzZSJBMTI4R0NNIjpjYXNlIkExOTJHQ00iOmNhc2UiQTI1NkdDTSI6Y2FzZSJBMTI4R0NNS1ciOmNhc2UiQTE5MkdDTUtXIjpjYXNlIkEyNTZHQ01LVyI6dD17bmFtZToiQUVTLUdDTSJ9LHI9WyJlbmNyeXB0IiwiZGVjcnlwdCJdO2JyZWFrO2Nhc2UiQTEyOEtXIjpjYXNlIkExOTJLVyI6Y2FzZSJBMjU2S1ciOnQ9e25hbWU6IkFFUy1LVyJ9LHI9WyJ3cmFwS2V5IiwidW53cmFwS2V5Il07YnJlYWs7Y2FzZSJQQkVTMi1IUzI1NitBMTI4S1ciOmNhc2UiUEJFUzItSFMzODQrQTE5MktXIjpjYXNlIlBCRVMyLUhTNTEyK0EyNTZLVyI6dD17bmFtZToiUEJLREYyIn0scj1bImRlcml2ZUJpdHMiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBvbigndW5zdXBwb3J0ZWQgb3IgaW52YWxpZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJSU0EiOnN3aXRjaChlLmFsZyl7Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6dD17bmFtZToiUlNBLVBTUyIsaGFzaDpgU0hBLSR7ZS5hbGcuc3Vic3RyKC0zKX1gfSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlMyNTYiOmNhc2UiUlMzODQiOmNhc2UiUlM1MTIiOnQ9e25hbWU6IlJTQVNTQS1QS0NTMS12MV81IixoYXNoOmBTSEEtJHtlLmFsZy5zdWJzdHIoLTMpfWB9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSU0EtT0FFUCI6Y2FzZSJSU0EtT0FFUC0yNTYiOmNhc2UiUlNBLU9BRVAtMzg0IjpjYXNlIlJTQS1PQUVQLTUxMiI6dD17bmFtZToiUlNBLU9BRVAiLGhhc2g6YFNIQS0ke3BhcnNlSW50KGUuYWxnLnN1YnN0cigtMyksMTApfHwxfWB9LHI9ZS5kP1siZGVjcnlwdCIsInVud3JhcEtleSJdOlsiZW5jcnlwdCIsIndyYXBLZXkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBvbigndW5zdXBwb3J0ZWQgb3IgaW52YWxpZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJFQyI6c3dpdGNoKGUuYWxnKXtjYXNlIkVTMjU2IjpjYXNlIkVTMzg0IjpjYXNlIkVTNTEyIjp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZTplLmNydn0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVDREgtRVMiOmNhc2UiRUNESC1FUytBMTI4S1ciOmNhc2UiRUNESC1FUytBMTkyS1ciOmNhc2UiRUNESC1FUytBMjU2S1ciOnQ9e25hbWU6IkVDREgiLG5hbWVkQ3VydmU6ZS5jcnZ9LHI9ZS5kP1siZGVyaXZlQml0cyJdOltdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IG9uKCd1bnN1cHBvcnRlZCBvciBpbnZhbGlkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBvbigndW5zdXBwb3J0ZWQgb3IgaW52YWxpZCBKV0sgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX1yZXR1cm57YWxnb3JpdGhtOnQsa2V5VXNhZ2VzOnJ9fShlKTtsZXQgbz0iandrIixzPXsuLi5lfTtyZXR1cm4gZGVsZXRlIHMuYWxnLCJQQktERjIiPT09bi5uYW1lJiYobz0icmF3IixzPWVuKGUuaykpLGxuKCksaG4uc3VidGxlLmltcG9ydEtleShvLHMsbixudWxsIT09KHQ9ZS5leHQpJiZ2b2lkIDAhPT10JiZ0LG51bGwhPT0ocj1lLmtleV9vcHMpJiZ2b2lkIDAhPT1yP3I6aSl9O2Z1bmN0aW9uIGRuKGUpe3JldHVybiEhZSYmZS5jb25zdHJ1Y3Rvcj09PU9iamVjdH1hc3luYyBmdW5jdGlvbiBwbihlLHQscil7aWYoIWRuKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkpXSyBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKHR8fCh0PWUuYWxnKSwic3RyaW5nIiE9dHlwZW9mIHR8fCF0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJhbGciIGFyZ3VtZW50IGlzIHJlcXVpcmVkIHdoZW4gImp3ay5hbGciIGlzIG5vdCBwcmVzZW50Jyk7c3dpdGNoKGUua3R5KXtjYXNlIm9jdCI6aWYoInN0cmluZyIhPXR5cGVvZiBlLmt8fCFlLmspdGhyb3cgbmV3IFR5cGVFcnJvcignbWlzc2luZyAiayIgKEtleSBWYWx1ZSkgUGFyYW1ldGVyIHZhbHVlJyk7cmV0dXJuIG51bGwhPXJ8fChyPSEwIT09ZS5leHQpLHI/Zm4oey4uLmUsYWxnOnQsZXh0OiExfSk6ZW4oZS5rKTtjYXNlIlJTQSI6aWYodm9pZCAwIT09ZS5vdGgpdGhyb3cgbmV3IG9uKCdSU0EgSldLICJvdGgiIChPdGhlciBQcmltZXMgSW5mbykgUGFyYW1ldGVyIHZhbHVlIGlzIHVuc3VwcG9ydGVkJyk7Y2FzZSJFQyI6Y2FzZSJPS1AiOnJldHVybiBmbih7Li4uZSxhbGc6dH0pO2RlZmF1bHQ6dGhyb3cgbmV3IG9uKCd1bnN1cHBvcnRlZCAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfX1jb25zdCBnbj1mdW5jdGlvbihlLHQscixuKXtpZih2b2lkIDAhPT1uLmNyaXQmJnZvaWQgMD09PXIuY3JpdCl0aHJvdyBuZXcgZSgnImNyaXQiIChDcml0aWNhbCkgSGVhZGVyIFBhcmFtZXRlciBNVVNUIGJlIGludGVncml0eSBwcm90ZWN0ZWQnKTtpZighcnx8dm9pZCAwPT09ci5jcml0KXJldHVybiBuZXcgU2V0O2lmKCFBcnJheS5pc0FycmF5KHIuY3JpdCl8fDA9PT1yLmNyaXQubGVuZ3RofHxyLmNyaXQuc29tZSgoZT0+InN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpKSl0aHJvdyBuZXcgZSgnImNyaXQiIChDcml0aWNhbCkgSGVhZGVyIFBhcmFtZXRlciBNVVNUIGJlIGFuIGFycmF5IG9mIG5vbi1lbXB0eSBzdHJpbmdzIHdoZW4gcHJlc2VudCcpO2Zvcihjb25zdCBpIG9mIHIuY3JpdCl7aWYoIXQuaGFzKGkpKXRocm93IG5ldyBvbihgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7aX0iIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbmApO2lmKHZvaWQgMD09PW5baV0pdGhyb3cgbmV3IGUoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke2l9IiBpcyBtaXNzaW5nYCk7aWYodC5nZXQoaSkmJnZvaWQgMD09PXJbaV0pdGhyb3cgbmV3IGUoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke2l9IiBNVVNUIGJlIGludGVncml0eSBwcm90ZWN0ZWRgKX1yZXR1cm4gbmV3IFNldChyLmNyaXQpfS5iaW5kKHZvaWQgMCxzbixuZXcgTWFwKFtbImI2NCIsITBdXSkpLHZuPSgoZSx0KT0+e2lmKHZvaWQgMCE9PXQmJighQXJyYXkuaXNBcnJheSh0KXx8dC5zb21lKChlPT4ic3RyaW5nIiE9dHlwZW9mIGUpKSkpdGhyb3cgbmV3IFR5cGVFcnJvcihgIiR7ZX0iIG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NgKTtpZih0KXJldHVybiBuZXcgU2V0KHQpfSkuYmluZCh2b2lkIDAsImFsZ29yaXRobXMiKTthc3luYyBmdW5jdGlvbiB5bihlLHQscil7aWYoIWRuKGUpKXRocm93IG5ldyBzbigiRmxhdHRlbmVkIEpXUyBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKHZvaWQgMD09PWUucHJvdGVjdGVkJiZ2b2lkIDA9PT1lLmhlYWRlcil0aHJvdyBuZXcgc24oJ0ZsYXR0ZW5lZCBKV1MgbXVzdCBoYXZlIGVpdGhlciBvZiB0aGUgInByb3RlY3RlZCIgb3IgImhlYWRlciIgbWVtYmVycycpO2lmKHZvaWQgMCE9PWUucHJvdGVjdGVkJiYic3RyaW5nIiE9dHlwZW9mIGUucHJvdGVjdGVkKXRocm93IG5ldyBzbigiSldTIFByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDA9PT1lLnBheWxvYWQpdGhyb3cgbmV3IHNuKCJKV1MgUGF5bG9hZCBtaXNzaW5nIik7aWYoInN0cmluZyIhPXR5cGVvZiBlLnNpZ25hdHVyZSl0aHJvdyBuZXcgc24oIkpXUyBTaWduYXR1cmUgbWlzc2luZyBvciBpbmNvcnJlY3QgdHlwZSIpO2lmKHZvaWQgMCE9PWUuaGVhZGVyJiYhZG4oZS5oZWFkZXIpKXRocm93IG5ldyBzbigiSldTIFVucHJvdGVjdGVkIEhlYWRlciBpbmNvcnJlY3QgdHlwZSIpO2xldCBuPXt9O2lmKGUucHJvdGVjdGVkKXtjb25zdCB0PWVuKGUucHJvdGVjdGVkKTtuPUpTT04ucGFyc2UoWnIuZGVjb2RlKHQpKX1pZighKCguLi5lKT0+e2NvbnN0IHQ9ZS5maWx0ZXIoQm9vbGVhbik7aWYoMD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgpcmV0dXJuITA7bGV0IHI7Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1PYmplY3Qua2V5cyhlKTtpZihyJiYwIT09ci5zaXplKWZvcihjb25zdCBlIG9mIHQpe2lmKHIuaGFzKGUpKXJldHVybiExO3IuYWRkKGUpfWVsc2Ugcj1uZXcgU2V0KHQpfXJldHVybiEwfSkobixlLmhlYWRlcikpdGhyb3cgbmV3IHNuKCJKV1MgUHJvdGVjdGVkIGFuZCBKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIFBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIGRpc2pvaW50Iik7Y29uc3QgaT17Li4ubiwuLi5lLmhlYWRlcn07bGV0IG89ITA7aWYoZ24obixpKS5oYXMoImI2NCIpJiYobz1uLmI2NCwiYm9vbGVhbiIhPXR5cGVvZiBvKSl0aHJvdyBuZXcgc24oJ1RoZSAiYjY0IiAoYmFzZTY0dXJsLWVuY29kZSBwYXlsb2FkKSBIZWFkZXIgUGFyYW1ldGVyIG11c3QgYmUgYSBib29sZWFuJyk7Y29uc3R7YWxnOnN9PWk7aWYoInN0cmluZyIhPXR5cGVvZiBzfHwhcyl0aHJvdyBuZXcgc24oJ0pXUyAiYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG1pc3Npbmcgb3IgaW52YWxpZCcpO2NvbnN0IGE9ciYmdm4oci5hbGdvcml0aG1zKTtpZihhJiYhYS5oYXMocykpdGhyb3cgbmV3IG5uKCciYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG5vdCBhbGxvd2VkJyk7aWYobyl7aWYoInN0cmluZyIhPXR5cGVvZiBlLnBheWxvYWQpdGhyb3cgbmV3IHNuKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIil9ZWxzZSBpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCYmIShlLnBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl0aHJvdyBuZXcgc24oIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gVWludDhBcnJheSBpbnN0YW5jZSIpOyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1hd2FpdCB0KG4sZSkpLCgoZSx0KT0+e2lmKGUuc3RhcnRzV2l0aCgiSFMiKXx8ImRpciI9PT1lfHxlLnN0YXJ0c1dpdGgoIlBCRVMyIil8fGUubWF0Y2goL15BXGR7M30oPzpHQ00pS1ckLykpe2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHwic2VjcmV0Ij09PXQudHlwZSlyZXR1cm47dGhyb3cgbmV3IFR5cGVFcnJvcignQ3J5cHRvS2V5IG9yIEtleU9iamVjdCBpbnN0YW5jZXMgZm9yIHN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3QgYmUgb2YgdHlwZSAic2VjcmV0IicpfWlmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXRocm93IG5ldyBUeXBlRXJyb3IoIkNyeXB0b0tleSBvciBLZXlPYmplY3QgaW5zdGFuY2VzIG11c3QgYmUgdXNlZCBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIik7aWYoInNlY3JldCI9PT10LnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcignQ3J5cHRvS2V5IG9yIEtleU9iamVjdCBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IG5vdCBiZSBvZiB0eXBlICJzZWNyZXQiJyl9KShzLHQpO2NvbnN0IHU9ZnVuY3Rpb24oLi4uZSl7Y29uc3QgdD1lLnJlZHVjZSgoKGUse2xlbmd0aDp0fSk9PmUrdCksMCkscj1uZXcgVWludDhBcnJheSh0KTtsZXQgbj0wO3JldHVybiBlLmZvckVhY2goKGU9PntyLnNldChlLG4pLG4rPWUubGVuZ3RofSkpLHJ9KFhyLmVuY29kZShlLnByb3RlY3RlZHx8IiIpLFhyLmVuY29kZSgiLiIpLCJzdHJpbmciPT10eXBlb2YgZS5wYXlsb2FkP1hyLmVuY29kZShlLnBheWxvYWQpOmUucGF5bG9hZCksYz1lbihlLnNpZ25hdHVyZSk7aWYoIWF3YWl0KGFzeW5jKGUsdCxyLG4pPT57bGV0IGk7aWYobG4oKSx0IGluc3RhbmNlb2YgVWludDhBcnJheSl7aWYoIWUuc3RhcnRzV2l0aCgiSFMiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzeW1tZXRyaWMga2V5cyBhcmUgb25seSBhcHBsaWNhYmxlIGZvciBITUFDLWJhc2VkIGFsZ29yaXRobXMiKTtpPWF3YWl0IGhuLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCx7aGFzaDpgU0hBLSR7ZS5zdWJzdHIoLTMpfWAsbmFtZToiSE1BQyJ9LCExLFsidmVyaWZ5Il0pfWVsc2UgaT10O3JldHVybigoZSx0KT0+e2lmKGUuc3RhcnRzV2l0aCgiSFMiKSl7Y29uc3Qgcj1wYXJzZUludChlLnN1YnN0cigtMyksMTApLHtsZW5ndGg6bn09dC5hbGdvcml0aG07aWYoIm51bWJlciIhPXR5cGVvZiBufHxuPHIpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlfSByZXF1aXJlcyBzeW1tZXRyaWMga2V5cyB0byBiZSAke3J9IGJpdHMgb3IgbGFyZ2VyYCl9aWYoZS5zdGFydHNXaXRoKCJSUyIpfHxlLnN0YXJ0c1dpdGgoIlBTIikpe2NvbnN0e21vZHVsdXNMZW5ndGg6cn09dC5hbGdvcml0aG07aWYoIm51bWJlciIhPXR5cGVvZiByfHxyPDIwNDgpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlfSByZXF1aXJlcyBrZXkgbW9kdWx1c0xlbmd0aCB0byBiZSAyMDQ4IGJpdHMgb3IgbGFyZ2VyYCl9fSkoZSxpKSxobi5zdWJ0bGUudmVyaWZ5KGZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIkhTMjU2IjpyZXR1cm57aGFzaDoiU0hBLTI1NiIsbmFtZToiSE1BQyJ9O2Nhc2UiSFMzODQiOnJldHVybntoYXNoOiJTSEEtMzg0IixuYW1lOiJITUFDIn07Y2FzZSJIUzUxMiI6cmV0dXJue2hhc2g6IlNIQS01MTIiLG5hbWU6IkhNQUMifTtjYXNlIlBTMjU2IjpyZXR1cm57aGFzaDoiU0hBLTI1NiIsbmFtZToiUlNBLVBTUyIsc2FsdExlbmd0aDozMn07Y2FzZSJQUzM4NCI6cmV0dXJue2hhc2g6IlNIQS0zODQiLG5hbWU6IlJTQS1QU1MiLHNhbHRMZW5ndGg6NDh9O2Nhc2UiUFM1MTIiOnJldHVybntoYXNoOiJTSEEtNTEyIixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOjY0fTtjYXNlIlJTMjU2IjpyZXR1cm57aGFzaDoiU0hBLTI1NiIsbmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUifTtjYXNlIlJTMzg0IjpyZXR1cm57aGFzaDoiU0hBLTM4NCIsbmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUifTtjYXNlIlJTNTEyIjpyZXR1cm57aGFzaDoiU0hBLTUxMiIsbmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUifTtjYXNlIkVTMjU2IjpyZXR1cm57aGFzaDoiU0hBLTI1NiIsbmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMjU2In07Y2FzZSJFUzM4NCI6cmV0dXJue2hhc2g6IlNIQS0zODQiLG5hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTM4NCJ9O2Nhc2UiRVM1MTIiOnJldHVybntoYXNoOiJTSEEtNTEyIixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC01MjEifTtkZWZhdWx0OnRocm93IG5ldyBvbihgYWxnICR7ZX0gaXMgdW5zdXBwb3J0ZWQgZWl0aGVyIGJ5IEpPU0Ugb3IgeW91ciBqYXZhc2NyaXB0IHJ1bnRpbWVgKX19KGUpLGkscixuKX0pKHMsdCxjLHUpKXRocm93IG5ldyB1bjtsZXQgaDtoPW8/ZW4oZS5wYXlsb2FkKToic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD9Yci5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQ7Y29uc3QgbD17cGF5bG9hZDpofTtyZXR1cm4gdm9pZCAwIT09ZS5wcm90ZWN0ZWQmJihsLnByb3RlY3RlZEhlYWRlcj1uKSx2b2lkIDAhPT1lLmhlYWRlciYmKGwudW5wcm90ZWN0ZWRIZWFkZXI9ZS5oZWFkZXIpLGx9Y29uc3QgbW49L14oXGQrfFxkK1wuXGQrKSA/KHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSkkL2k7dmFyIHduPWU9Pntjb25zdCB0PW1uLmV4ZWMoZSk7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCB0aW1lIHBlcmlvZCBmb3JtYXQiKTtjb25zdCByPXBhcnNlRmxvYXQodFsxXSk7c3dpdGNoKHRbMl0udG9Mb3dlckNhc2UoKSl7Y2FzZSJzZWMiOmNhc2Uic2VjcyI6Y2FzZSJzZWNvbmQiOmNhc2Uic2Vjb25kcyI6Y2FzZSJzIjpyZXR1cm4gTWF0aC5yb3VuZChyKTtjYXNlIm1pbnV0ZSI6Y2FzZSJtaW51dGVzIjpjYXNlIm1pbiI6Y2FzZSJtaW5zIjpjYXNlIm0iOnJldHVybiBNYXRoLnJvdW5kKDYwKnIpO2Nhc2UiaG91ciI6Y2FzZSJob3VycyI6Y2FzZSJociI6Y2FzZSJocnMiOmNhc2UiaCI6cmV0dXJuIE1hdGgucm91bmQoMzYwMCpyKTtjYXNlImRheSI6Y2FzZSJkYXlzIjpjYXNlImQiOnJldHVybiBNYXRoLnJvdW5kKDg2NDAwKnIpO2Nhc2Uid2VlayI6Y2FzZSJ3ZWVrcyI6Y2FzZSJ3IjpyZXR1cm4gTWF0aC5yb3VuZCg2MDQ4MDAqcik7ZGVmYXVsdDpyZXR1cm4gTWF0aC5yb3VuZCgzMTU1NzYwMCpyKX19O2NvbnN0IGJuPWU9PmUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eYXBwbGljYXRpb25cLy8sIiIpO3ZhciBfbj0oZSx0LHI9e30pPT57Y29uc3R7dHlwOm59PXI7aWYobiYmKCJzdHJpbmciIT10eXBlb2YgZS50eXB8fGJuKGUudHlwKSE9PWJuKG4pKSl0aHJvdyBuZXcgcm4oJ3VuZXhwZWN0ZWQgInR5cCIgSldUIGhlYWRlciB2YWx1ZScsInR5cCIsImNoZWNrX2ZhaWxlZCIpO2xldCBpO3RyeXtpPUpTT04ucGFyc2UoWnIuZGVjb2RlKHQpKX1jYXRjaChlKXt9aWYoIm9iamVjdCIhPXR5cGVvZiBpfHwhaXx8QXJyYXkuaXNBcnJheShpKSl0aHJvdyBuZXcgYW4oIkpXVCBDbGFpbXMgU2V0IG11c3QgYmUgYSB0b3AtbGV2ZWwgSlNPTiBvYmplY3QiKTtjb25zdHtpc3N1ZXI6b309cjtpZihvJiYhKCJzdHJpbmciPT10eXBlb2Ygbz9bb106bykuaW5jbHVkZXMoaS5pc3MpKXRocm93IG5ldyBybigndW5leHBlY3RlZCAiaXNzIiBjbGFpbSB2YWx1ZScsImlzcyIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e3N1YmplY3Q6c309cjtpZihzJiZpLnN1YiE9PXMpdGhyb3cgbmV3IHJuKCd1bmV4cGVjdGVkICJzdWIiIGNsYWltIHZhbHVlJywic3ViIiwiY2hlY2tfZmFpbGVkIik7Y29uc3R7YXVkaWVuY2U6YX09cjtpZihhJiYoYz0ic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEsISgic3RyaW5nIj09dHlwZW9mKHU9aS5hdWQpP2MuaW5jbHVkZXModSk6Yy5zb21lKFNldC5wcm90b3R5cGUuaGFzLmJpbmQobmV3IFNldCh1KSkpKSkpdGhyb3cgbmV3IHJuKCd1bmV4cGVjdGVkICJhdWQiIGNsYWltIHZhbHVlJywiYXVkIiwiY2hlY2tfZmFpbGVkIik7dmFyIHUsYztsZXQgaDtzd2l0Y2godHlwZW9mIHIuY2xvY2tUb2xlcmFuY2Upe2Nhc2Uic3RyaW5nIjpoPXduKHIuY2xvY2tUb2xlcmFuY2UpO2JyZWFrO2Nhc2UibnVtYmVyIjpoPXIuY2xvY2tUb2xlcmFuY2U7YnJlYWs7Y2FzZSJ1bmRlZmluZWQiOmg9MDticmVhaztkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgY2xvY2tUb2xlcmFuY2Ugb3B0aW9uIHR5cGUiKX1jb25zdHtjdXJyZW50RGF0ZTpsfT1yLGY9KGQ9bHx8bmV3IERhdGUsTWF0aC5mbG9vcihkLmdldFRpbWUoKS8xZTMpKTt2YXIgZDtpZih2b2lkIDAhPT1pLmlhdHx8ci5tYXhUb2tlbkFnZSl7aWYoIm51bWJlciIhPXR5cGVvZiBpLmlhdCl0aHJvdyBuZXcgcm4oJyJpYXQiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJpYXQiLCJpbnZhbGlkIik7aWYodm9pZCAwPT09aS5leHAmJmkuaWF0PmYraCl0aHJvdyBuZXcgcm4oJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKGl0IHNob3VsZCBiZSBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKX1pZih2b2lkIDAhPT1pLm5iZil7aWYoIm51bWJlciIhPXR5cGVvZiBpLm5iZil0aHJvdyBuZXcgcm4oJyJuYmYiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJuYmYiLCJpbnZhbGlkIik7aWYoaS5uYmY+ZitoKXRocm93IG5ldyBybignIm5iZiIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsIm5iZiIsImNoZWNrX2ZhaWxlZCIpfWlmKHZvaWQgMCE9PWkuZXhwKXtpZigibnVtYmVyIiE9dHlwZW9mIGkuZXhwKXRocm93IG5ldyBybignImV4cCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImV4cCIsImludmFsaWQiKTtpZihpLmV4cDw9Zi1oKXRocm93IG5ldyBjbignImV4cCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsImV4cCIsImNoZWNrX2ZhaWxlZCIpfWlmKHIubWF4VG9rZW5BZ2Upe2NvbnN0IGU9Zi1pLmlhdDtpZihlLWg+KCJudW1iZXIiPT10eXBlb2Ygci5tYXhUb2tlbkFnZT9yLm1heFRva2VuQWdlOnduKHIubWF4VG9rZW5BZ2UpKSl0aHJvdyBuZXcgY24oJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKHRvbyBmYXIgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIik7aWYoZTwwLWgpdGhyb3cgbmV3IHJuKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkIChpdCBzaG91bGQgYmUgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIil9cmV0dXJuIGl9O2NvbnN0IGtuPXJlcXVpcmUoInNlY3VyZS1yYW5kb20tYnl0ZXMiKTtjbGFzcyBTbntjb25zdHJ1Y3Rvcigpe31zdGF0aWMgYmFzZTY0VVJMRW5jb2RlKGUpe3JldHVybiBEci5lbmNvZGUoZSkucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKS5yZXBsYWNlKC89L2csIiIpfXN0YXRpYyBnZXRDb2RlVmVyaWZpZXIoZSl7c3dpdGNoKGUpe2Nhc2UgU3QuTm9kZTpyZXR1cm4gdGhpcy5iYXNlNjRVUkxFbmNvZGUoa24oMzIpKTtjYXNlIFN0LkJyb3dzZXI6cmV0dXJuIHRoaXMuYmFzZTY0VVJMRW5jb2RlKEdyKDMyKSk7Y2FzZSBTdC5SZWFjdE5hdGl2ZTpyZXR1cm4gdGhpcy5iYXNlNjRVUkxFbmNvZGUoSXIucmFuZG9tKDMyKS50b1N0cmluZygpKTtkZWZhdWx0OnJldHVybiB0aGlzLmJhc2U2NFVSTEVuY29kZShHcigzMikpfX1zdGF0aWMgZ2V0Q29kZUNoYWxsZW5nZShlKXtyZXR1cm4gdGhpcy5iYXNlNjRVUkxFbmNvZGUobmV3IGcoVXIoKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpKSkpfXN0YXRpYyBnZXRTdXBwb3J0ZWRTaWduYXR1cmVBbGdvcml0aG1zKCl7cmV0dXJuWyJSUzI1NiIsIlJTNTEyIiwiUlMzODQiLCJQUzI1NiJdfXN0YXRpYyBnZXRKV0tGb3JUaGVJZFRva2VuKGUsdCl7Y29uc3Qgcj1KU09OLnBhcnNlKERyLmRlY29kZShlLCJ1dGY4IikpO2Zvcihjb25zdCBlIG9mIHQpaWYoci5raWQ9PT1lLmtpZClyZXR1cm4gcG4oe2FsZzplLmFsZyxlOmUuZSxrdHk6ZS5rdHksbjplLm59KTtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEF0KCJDUllQVE9fVVRJTC1HVEZUSVQtSVYwMSIsImNyeXB0by11dGlscyIsImdldEpXS0ZvclRoZUlkVG9rZW4iLCJraWQgbm90IGZvdW5kLiIsIkZhaWxlZCB0byBmaW5kIHRoZSAna2lkJyBzcGVjaWZpZWQgaW4gdGhlIGlkX3Rva2VuLiAna2lkJyBmb3VuZCBpbiB0aGUgaGVhZGVyIDogIityLmtpZCsiLCBFeHBlY3RlZCB2YWx1ZXM6ICIrdC5tYXAoKGU9PmUua2lkKSkuam9pbigiLCAiKSkpfXN0YXRpYyBpc1ZhbGlkSWRUb2tlbihlLHQscixuLGksbyl7cmV0dXJuIGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtjb25zdCBuPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSYmKGU9WnIuZGVjb2RlKGUpKSwic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IHNuKCJDb21wYWN0IEpXUyBtdXN0IGJlIGEgc3RyaW5nIG9yIFVpbnQ4QXJyYXkiKTtjb25zdHswOm4sMTppLDI6byxsZW5ndGg6c309ZS5zcGxpdCgiLiIpO2lmKDMhPT1zKXRocm93IG5ldyBzbigiSW52YWxpZCBDb21wYWN0IEpXUyIpO2NvbnN0IGE9YXdhaXQgeW4oe3BheWxvYWQ6aXx8dm9pZCAwLHByb3RlY3RlZDpufHx2b2lkIDAsc2lnbmF0dXJlOm98fHZvaWQgMH0sdCxyKTtyZXR1cm57cGF5bG9hZDphLnBheWxvYWQscHJvdGVjdGVkSGVhZGVyOmEucHJvdGVjdGVkSGVhZGVyfX0oZSx0LHIpO3JldHVybntwYXlsb2FkOl9uKG4ucHJvdGVjdGVkSGVhZGVyLG4ucGF5bG9hZCxyKSxwcm90ZWN0ZWRIZWFkZXI6bi5wcm90ZWN0ZWRIZWFkZXJ9fShlLHQse2FsZ29yaXRobXM6dGhpcy5nZXRTdXBwb3J0ZWRTaWduYXR1cmVBbGdvcml0aG1zKCksYXVkaWVuY2U6cixjbG9ja1RvbGVyYW5jZTpvLGlzc3VlcjpuLHN1YmplY3Q6aX0pLnRoZW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoITApKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBBdCgiQ1JZUFRPX1VUSUwtSVZJVC1JVjAyIiwiY3J5cHRvLXV0aWxzIiwiaXNWYWxpZElkVG9rZW4iLCJWYWxpZGF0aW5nIElEIHRva2VuIGZhaWxlZCIsZSkpKSl9c3RhdGljIGRlY29kZUlEVG9rZW4oZSl7dHJ5e2NvbnN0IHQ9RHIuZGVjb2RlKGUuc3BsaXQoIi4iKVsxXSwidXRmOCIpO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBBdCgiQ1JZUFRPX1VUSUwtRElULUlWMDEiLCJjcnlwdG8tdXRpbHMiLCJkZWNvZGVJRFRva2VuIiwiRGVjb2RpbmcgSUQgdG9rZW4gZmFpbGVkLiIsZSl9fX1jbGFzcyBBbntjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKGUpe3ZhciB0LHIsbixpO2NvbnN0IG89U24uZGVjb2RlSURUb2tlbihlKSxzPXRoaXMuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkKG8pLGE9bnVsbCE9PSh0PW51bGw9PW8/dm9pZCAwOm8udXNlcm5hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsdT1udWxsIT09KHI9by5naXZlbl9uYW1lKSYmdm9pZCAwIT09cj9yOiIiLGM9bnVsbCE9PShuPW8uZmFtaWx5X25hbWUpJiZ2b2lkIDAhPT1uP246IiIsaD11JiZjP2Ake3V9ICR7Y31gOnV8fGN8fCIiLGw9bnVsbCE9PShpPW8ucHJlZmVycmVkX3VzZXJuYW1lKSYmdm9pZCAwIT09aT9pOmg7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2Rpc3BsYXlOYW1lOmwsdGVuYW50RG9tYWluOnMsdXNlcm5hbWU6YX0sdGhpcy5maWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQobykpfXN0YXRpYyBmaWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQoZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO251bGw9PXR8fGRlbGV0ZSB0LmlzcyxudWxsPT10fHxkZWxldGUgdC5hdWQsbnVsbD09dHx8ZGVsZXRlIHQuZXhwLG51bGw9PXR8fGRlbGV0ZSB0LmlhdCxudWxsPT10fHxkZWxldGUgdC5hY3IsbnVsbD09dHx8ZGVsZXRlIHQuYW1yLG51bGw9PXR8fGRlbGV0ZSB0LmF6cCxudWxsPT10fHxkZWxldGUgdC5hdXRoX3RpbWUsbnVsbD09dHx8ZGVsZXRlIHQubm9uY2UsbnVsbD09dHx8ZGVsZXRlIHQuY19oYXNoLG51bGw9PXR8fGRlbGV0ZSB0LmF0X2hhc2gsbnVsbD09dHx8ZGVsZXRlIHQubmJmLG51bGw9PXR8fGRlbGV0ZSB0LmlzayxudWxsPT10fHxkZWxldGUgdC5zaWQ7Y29uc3Qgcj17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFtlLHRdKT0+e2NvbnN0IG49ZS5zcGxpdCgiXyIpLm1hcCgoKGUsdCk9PjA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKSwuLi5lLnNsaWNlKDEpXS5qb2luKCIiKSkpLmpvaW4oIiIpO3Jbbl09dH0pKSxyfXN0YXRpYyBnZXRUb2tlblJlcXVlc3RIZWFkZXJzKCl7cmV0dXJue0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9fX1Bbi5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQ9KGUsdD0iQCIpPT57Y29uc3Qgcj1lLnN1Yi5zcGxpdCh0KTtyZXR1cm4gci5sZW5ndGg+Mj9yW3IubGVuZ3RoLTFdOiIifTtjbGFzcyBFbntjb25zdHJ1Y3RvcihlKXt0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PmJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCl9KSksdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGE9KCk9PmJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpfXJlc29sdmVXZWxsS25vd25FbmRwb2ludCgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIGUud2VsbEtub3duRW5kcG9pbnQ/ZS5zZXJ2ZXJPcmlnaW4rZS53ZWxsS25vd25FbmRwb2ludDplLnNlcnZlck9yaWdpbisiL29hdXRoMi90b2tlbi8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbiJ9KSl9cmVzb2x2ZUVuZHBvaW50cyhlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXt9LHI9eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIHIub3ZlcnJpZGVXZWxsRW5kcG9pbnRDb25maWcmJnIuZW5kcG9pbnRzJiZPYmplY3Qua2V5cyhyLmVuZHBvaW50cykuZm9yRWFjaCgoZT0+e2NvbnN0IG49ZS5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTt0W25dPShudWxsPT1yP3ZvaWQgMDpyLmVuZHBvaW50cyk/ci5lbmRwb2ludHNbZV06IiJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfSkpfXJlc29sdmVGYWxsYmFja0VuZHBvaW50cygpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9e30sdD15aWVsZCB0aGlzLl9jb25maWcoKTt0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKHI9Pntjb25zdCBuPXIucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtuXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW3JdOiIifSkpO2NvbnN0IHI9e2F1dGhvcml6YXRpb25fZW5kcG9pbnQ6dC5zZXJ2ZXJPcmlnaW4rIi9vYXV0aDIvYXV0aG9yaXplIixlbmRfc2Vzc2lvbl9lbmRwb2ludDp0LnNlcnZlck9yaWdpbisiL29pZGMvbG9nb3V0Iixqd2tzX3VyaTp0LnNlcnZlck9yaWdpbisiL29hdXRoMi9qd2tzIixjaGVja19zZXNzaW9uX2lmcmFtZTp0LnNlcnZlck9yaWdpbisiL29pZGMvY2hlY2tzZXNzaW9uIixyZXZvY2F0aW9uX2VuZHBvaW50OnQuc2VydmVyT3JpZ2luKyIvb2F1dGgyL3Jldm9rZSIsdG9rZW5fZW5kcG9pbnQ6dC5zZXJ2ZXJPcmlnaW4rIi9vYXV0aDIvdG9rZW4ifTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHIpfSkpfXZhbGlkYXRlSWRUb2tlbihlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKSkuandrc191cmkscj15aWVsZCB0aGlzLl9jb25maWcoKTtyZXR1cm4gdCYmMCE9PXQudHJpbSgpLmxlbmd0aD93dC5nZXQodCx7d2l0aENyZWRlbnRpYWxzOm51bGw9PXI/dm9pZCAwOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigodD0+YnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT10LnN0YXR1cylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEF0KCJBVVRIX0hFTFBFUi1WSVQtTlIwMiIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsInZhbGlkYXRlSWRUb2tlbiIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciBqd2tzIHJlcXVlc3QuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byBnZXQgdGhlIGp3a3MgcmV0dXJuZWQgIit0LnN0YXR1cysiICwgd2hpY2ggaXMgaW52YWxpZC4iKSk7Y29uc3Qgcj0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkuaXNzdWVyLG49KHlpZWxkIHRoaXMucmVzb2x2ZVdlbGxLbm93bkVuZHBvaW50KCkpLnNwbGl0KCIvLndlbGwta25vd24iKVswXTtyZXR1cm4gciYmcj09PW4/U24uZ2V0SldLRm9yVGhlSWRUb2tlbihlLnNwbGl0KCIuIilbMF0sdC5kYXRhLmtleXMpLnRoZW4oKHQ9PmJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIFNuLmlzVmFsaWRJZFRva2VuKGUsdCwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsaWVudElELHIsU24uZGVjb2RlSURUb2tlbihlKS5zdWIsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSkudGhlbigoZT0+ZSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgQXQoIkFVVEhfSEVMUEVSLVZJVC1FUzAzIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIix2b2lkIDAsdm9pZCAwLGUpKSkpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBBdCgiQVVUSF9IRUxQRVItVklULUVTMDQiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSk6UHJvbWlzZS5yZXNvbHZlKCExKX0pKSkpLmNhdGNoKChlPT57dmFyIHQscixuO3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXQoIkFVVEhfSEVMUEVSLVZJVC1OUjA1IiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIiwiUmVxdWVzdCB0byBqd2tzIGVuZHBvaW50IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZGF0YSkpfSkpOlByb21pc2UucmVqZWN0KG5ldyBBdCgiQVVUSF9IRUxQRVItVklULU5GMDEiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLCJKV0tTIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBKV0tTIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIEpXS1MgZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIikpfSkpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlKXt2YXIgdDtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgcj0ib3BlbmlkIjtjb25zdCBuPXlpZWxkIHRoaXMuX2NvbmZpZygpLGk9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7cmV0dXJuIG4uc2NvcGUmJm4uc2NvcGUubGVuZ3RoPjAmJihuLnNjb3BlLmluY2x1ZGVzKCJvcGVuaWQiKXx8bi5zY29wZS5wdXNoKCJvcGVuaWQiKSxyPW4uc2NvcGUuam9pbigiICIpKSxlLnJlcGxhY2UoInt7dG9rZW59fSIsaS5hY2Nlc3NfdG9rZW4pLnJlcGxhY2UoInt7dXNlcm5hbWV9fSIsQW4uZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKGkuaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLHIpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsbi5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PSh0PW4uY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09dD90OiIiKX0pKX1jbGVhclVzZXJTZXNzaW9uRGF0YSgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVNlc3Npb25EYXRhKCl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT1lLnN0YXR1cylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEF0KCJBVVRIX0hFTFBFUi1IVFItTlIwMSIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLCJJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgdG9rZW4gcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgdG9rZW4gcmV0dXJuZWQgIitlLnN0YXR1cysiICwgd2hpY2ggaXMgaW52YWxpZC4iKSk7aWYoKHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW4pcmV0dXJuIHRoaXMudmFsaWRhdGVJZFRva2VuKGUuZGF0YS5pZF90b2tlbikudGhlbigodD0+YnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih0KXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoZS5kYXRhKTtjb25zdCB0PXthY2Nlc3NUb2tlbjplLmRhdGEuYWNjZXNzX3Rva2VuLGV4cGlyZXNJbjplLmRhdGEuZXhwaXJlc19pbixpZFRva2VuOmUuZGF0YS5pZF90b2tlbixyZWZyZXNoVG9rZW46ZS5kYXRhLnJlZnJlc2hfdG9rZW4sc2NvcGU6ZS5kYXRhLnNjb3BlLHRva2VuVHlwZTplLmRhdGEudG9rZW5fdHlwZX07cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KX1yZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEF0KCJBVVRIX0hFTFBFUi1IVFItSVYwMiIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLCJUaGUgaWQgdG9rZW4gcmV0dXJuZWQgaXMgbm90IHZhbGlkLiIsIlRoZSBpZCB0b2tlbiByZXR1cm5lZCBoYXMgZmFpbGVkIHRoZSB2YWxpZGF0aW9uIGNoZWNrLiIpKX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgQXQoIkFVVEhfSEVMUEVSLUhBVC1FUzAzIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwiaGFuZGxlVG9rZW5SZXNwb25zZSIsdm9pZCAwLHZvaWQgMCxlKSkpKTt7Y29uc3QgdD17YWNjZXNzVG9rZW46ZS5kYXRhLmFjY2Vzc190b2tlbixleHBpcmVzSW46ZS5kYXRhLmV4cGlyZXNfaW4saWRUb2tlbjplLmRhdGEuaWRfdG9rZW4scmVmcmVzaFRva2VuOmUuZGF0YS5yZWZyZXNoX3Rva2VuLHNjb3BlOmUuZGF0YS5zY29wZSx0b2tlblR5cGU6ZS5kYXRhLnRva2VuX3R5cGV9O3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoZS5kYXRhKSxQcm9taXNlLnJlc29sdmUodCl9fSkpfX1jbGFzcyBUbntjb25zdHJ1Y3RvcihlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlcj1uZXcgRW4oZSksdGhpcy5fZGF0YUxheWVyPWUsdGhpcy5fY29uZmlnPSgpPT5idCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT5idCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iikscj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgQXQoIkFVVEhfQ09SRS1HQVUtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRBdXRob3JpemF0aW9uVVJMIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCBmb3VuZC4iLCJObyBhdXRob3JpemF0aW9uIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgZnJvbSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgYXV0aG9yaXphdGlvbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBuPW5ldyBVUkwodCk7bi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZXNwb25zZV90eXBlIiwiY29kZSIpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY2xpZW50X2lkIixyLmNsaWVudElEKTtsZXQgaT0ib3BlbmlkIjtpZihyLnNjb3BlJiZyLnNjb3BlLmxlbmd0aD4wJiYoci5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHIuc2NvcGUucHVzaCgib3BlbmlkIiksaT1yLnNjb3BlLmpvaW4oIiAiKSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJzY29wZSIsaSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZWRpcmVjdF91cmkiLHIuc2lnbkluUmVkaXJlY3RVUkwpLHIucmVzcG9uc2VNb2RlJiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoInJlc3BvbnNlX21vZGUiLHIucmVzcG9uc2VNb2RlKSxyLmVuYWJsZVBLQ0Upe2NvbnN0IGU9U24uZ2V0Q29kZVZlcmlmaWVyKHIucnVudGltZUVudmlyb25tZW50KSx0PVNuLmdldENvZGVDaGFsbGVuZ2UoZSk7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoInBrY2VfY29kZV92ZXJpZmllciIsZSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJTMjU2Iiksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJjb2RlX2NoYWxsZW5nZSIsdCl9ci5wcm9tcHQmJm4uc2VhcmNoUGFyYW1zLmFwcGVuZCgicHJvbXB0IixyLnByb21wdCk7Y29uc3Qgbz1lO2lmKG8pZm9yKGNvbnN0W2UsdF1vZiBPYmplY3QuZW50cmllcyhvKSkiIiE9ZSYmIiIhPXQmJm4uc2VhcmNoUGFyYW1zLmFwcGVuZChlLHQudG9TdHJpbmcoKSk7cmV0dXJuIG4udG9TdHJpbmcoKX0pKX1yZXF1ZXN0QWNjZXNzVG9rZW4oZSx0KXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS50b2tlbl9lbmRwb2ludCxuPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCFyfHwwPT09ci50cmltKCkubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQXQoIkFVVEhfQ09SRS1SQVQxLU5GMDEiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEFjY2Vzc1Rva2VuIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpKTt0JiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIix0KSk7Y29uc3QgaT1bXTtpLnB1c2goYGNsaWVudF9pZD0ke24uY2xpZW50SUR9YCksbi5jbGllbnRTZWNyZXQmJm4uY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmaS5wdXNoKGBjbGllbnRfc2VjcmV0PSR7bi5jbGllbnRTZWNyZXR9YCk7Y29uc3Qgbz1lO3JldHVybiBpLnB1c2goYGNvZGU9JHtvfWApLGkucHVzaCgiZ3JhbnRfdHlwZT1hdXRob3JpemF0aW9uX2NvZGUiKSxpLnB1c2goYHJlZGlyZWN0X3VyaT0ke24uc2lnbkluUmVkaXJlY3RVUkx9YCksbi5lbmFibGVQS0NFJiYoaS5wdXNoKGBjb2RlX3ZlcmlmaWVyPSR7eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoInBrY2VfY29kZV92ZXJpZmllciIpfWApLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiKSksd3QucG9zdChyLGkuam9pbigiJiIpLHtoZWFkZXJzOkFuLmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSx3aXRoQ3JlZGVudGlhbHM6bi5zZW5kQ29va2llc0luUmVxdWVzdHN9KS50aGVuKChlPT50aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGUpLnRoZW4oKGU9PmUpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QobmV3IEF0KCJBVVRIX0NPUkUtUkFUMS1FUzAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RBY2Nlc3NUb2tlbiIsdm9pZCAwLHZvaWQgMCxlKSkpKSkpLmNhdGNoKChlPT57dmFyIHQscixuO3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXQoIkFVVEhfQ09SRS1SQVQxLU5SMDMiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEFjY2Vzc1Rva2VuIiwiUmVxdWVzdGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIiwiVGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgc2VydmVyIGZhaWxlZC4iLG51bGwhPT0odD1udWxsPT1lP3ZvaWQgMDplLmNvZGUpJiZ2b2lkIDAhPT10P3Q6IiIsbnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlLG51bGw9PT0ocj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09cj92b2lkIDA6ci5zdGF0dXMsbnVsbD09PShuPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmRhdGEpKX0pKX0pKX1yZWZyZXNoQWNjZXNzVG9rZW4oKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS50b2tlbl9lbmRwb2ludCx0PXlpZWxkIHRoaXMuX2NvbmZpZygpLHI9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7aWYoIXIucmVmcmVzaF90b2tlbilyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEF0KCJBVVRIX0NPUkUtUkFUMi1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlZnJlc2hBY2Nlc3NUb2tlbiIsIk5vIHJlZnJlc2ggdG9rZW4gZm91bmQuIiwiVGhlcmUgd2FzIG5vIHJlZnJlc2ggdG9rZW4gZm91bmQuIEFzZ2FyZGVvIGRvZXNuJ3QgcmV0dXJuIGEgcmVmcmVzaCB0b2tlbiBpZiB0aGUgcmVmcmVzaCB0b2tlbiBncmFudCBpcyBub3QgZW5hYmxlZC4iKSk7aWYoIWV8fDA9PT1lLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBdCgiQVVUSF9DT1JFLVJBVDItTkYwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IGZvdW5kLiIsIk5vIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgd2FzIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7Y29uc3Qgbj1bXTtyZXR1cm4gbi5wdXNoKGBjbGllbnRfaWQ9JHt0LmNsaWVudElEfWApLG4ucHVzaChgcmVmcmVzaF90b2tlbj0ke3IucmVmcmVzaF90b2tlbn1gKSxuLnB1c2goImdyYW50X3R5cGU9cmVmcmVzaF90b2tlbiIpLHQuY2xpZW50U2VjcmV0JiZ0LmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJm4ucHVzaChgY2xpZW50X3NlY3JldD0ke3QuY2xpZW50U2VjcmV0fWApLHd0LnBvc3QoZSxuLmpvaW4oIiYiKSx7aGVhZGVyczpBbi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOnQuc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShlKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBBdCgiQVVUSF9DT1JFLVJBVDItRVMwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEV0KCJBVVRIX0NPUkUtUkFUMi1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlZnJlc2hBY2Nlc3NUb2tlbiIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsIlRoZSByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmV2b2tlQWNjZXNzVG9rZW4oKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5yZXZvY2F0aW9uX2VuZHBvaW50LHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWV8fDA9PT1lLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBdCgiQVVUSF9DT1JFLVJBVDMtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXZva2VBY2Nlc3NUb2tlbiIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpKTtjb25zdCByPVtdO3JldHVybiByLnB1c2goYGNsaWVudF9pZD0ke3QuY2xpZW50SUR9YCksci5wdXNoKGB0b2tlbj0keyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSkuYWNjZXNzX3Rva2VufWApLHIucHVzaCgidG9rZW5fdHlwZV9oaW50PWFjY2Vzc190b2tlbiIpLHd0LnBvc3QoZSxyLmpvaW4oIiYiKSx7aGVhZGVyczpBbi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOnQuc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+MjAwIT09ZS5zdGF0dXM/UHJvbWlzZS5yZWplY3QobmV3IEF0KCJBVVRIX0NPUkUtUkFUMy1OUjAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHJldm9rZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIHJldHVybmVkICIrZS5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOih0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YSgpLFByb21pc2UucmVzb2x2ZShlKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEV0KCJBVVRIX0NPUkUtUkFUMy1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwiVGhlIHJlcXVlc3QgdG8gcmV2b2tlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO2xldCBuO2lmKG49ZS50b2tlbkVuZHBvaW50JiYwIT09ZS50b2tlbkVuZHBvaW50LnRyaW0oKS5sZW5ndGg/ZS50b2tlbkVuZHBvaW50OnQudG9rZW5fZW5kcG9pbnQsIW58fDA9PT1uLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBdCgiQVVUSF9DT1JFLVJDRy1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7Y29uc3QgaT17ZGF0YTooeWllbGQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXMoZS5kYXRhKS5tYXAoKChbZSx0XSk9PmJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXBsYWNlQ3VzdG9tR3JhbnRUZW1wbGF0ZVRhZ3ModCk7cmV0dXJuYCR7ZX09JHtyfWB9KSkpKSkpLmpvaW4oIiYiKSxoZWFkZXJzOk9iamVjdC5hc3NpZ24oe30sQW4uZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QiLHVybDpuLHdpdGhDcmVkZW50aWFsczpyLnNlbmRDb29raWVzSW5SZXF1ZXN0c307cmV0dXJuIGUuYXR0YWNoVG9rZW4mJihpLmhlYWRlcnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkuaGVhZGVycykse0F1dGhvcml6YXRpb246YEJlYXJlciAkeyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSkuYWNjZXNzX3Rva2VufWB9KSksd3QoaSkudGhlbigodD0+MjAwIT09dC5zdGF0dXM/UHJvbWlzZS5yZWplY3QobmV3IEF0KCJBVVRIX0NPUkUtUkNHLU5SMDIiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXN0b20gZ3JhbnQgcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IHJldHVybmVkICIrdC5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOmUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZSh0KS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBBdCgiQVVUSF9DT1JFLVJDRy1FUzAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsdm9pZCAwLHZvaWQgMCxlKSkpKTpQcm9taXNlLnJlc29sdmUodCkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEV0KCJBVVRIX0NPUkUtUkNHLU5SMDQiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiVGhlIGN1c3RvbSBncmFudCByZXF1ZXN0IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iLG51bGwhPT0odD1udWxsPT1lP3ZvaWQgMDplLmNvZGUpJiZ2b2lkIDAhPT10P3Q6IiIsbnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlLG51bGw9PT0ocj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09cj92b2lkIDA6ci5zdGF0dXMsbnVsbD09PShuPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmRhdGEpKX0pKX0pKX1nZXRCYXNpY1VzZXJJbmZvKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSx0PUFuLmdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhudWxsPT1lP3ZvaWQgMDplLmlkX3Rva2VuKTtsZXQgcj17YWxsb3dlZFNjb3BlczplLnNjb3BlLHNlc3Npb25TdGF0ZTplLnNlc3Npb25fc3RhdGV9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57dm9pZCAwIT09dFtlXSYmIiIhPT10W2VdJiZudWxsIT09dFtlXXx8ZGVsZXRlIHRbZV19KSkscj1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sciksdCkscn0pKX1nZXREZWNvZGVkSURUb2tlbigpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9KHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpKS5pZF90b2tlbjtyZXR1cm4gU24uZGVjb2RlSURUb2tlbihlKX0pKX1nZXRJRFRva2VuKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpKS5pZF90b2tlbn0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZighZSYmKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpKXJldHVybiBQcm9taXNlLnJlc29sdmUoITApO2NvbnN0IHQ9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZVdlbGxLbm93bkVuZHBvaW50KCk7cmV0dXJuIHd0LmdldCh0KS50aGVuKChlPT5idCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiAyMDAhPT1lLnN0YXR1cz9Qcm9taXNlLnJlamVjdChuZXcgQXQoIkFVVEhfQ09SRS1HT1BNLU5SMDEiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwiZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEiLCJJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IHRvIGdldCB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgIitlLnN0YXR1cysiICwgd2hpY2ggaXMgaW52YWxpZC4iKSk6KHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKGUuZGF0YSkpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCEwKSl9KSkpKS5jYXRjaCgoKCk9PmJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRmFsbGJhY2tFbmRwb2ludHMoKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoITApfSkpKSl9KSl9Z2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCk7cmV0dXJue2F1dGhvcml6YXRpb25FbmRwb2ludDplLmF1dGhvcml6YXRpb25fZW5kcG9pbnQsY2hlY2tTZXNzaW9uSWZyYW1lOmUuY2hlY2tfc2Vzc2lvbl9pZnJhbWUsZW5kU2Vzc2lvbkVuZHBvaW50OmUuZW5kX3Nlc3Npb25fZW5kcG9pbnQsaW50cm9zcGVjdGlvbkVuZHBvaW50OmUuaW50cm9zcGVjdGlvbl9lbmRwb2ludCxpc3N1ZXI6ZS5pc3N1ZXIsandrc1VyaTplLmp3a3NfdXJpLHJlZ2lzdHJhdGlvbkVuZHBvaW50OmUucmVnaXN0cmF0aW9uX2VuZHBvaW50LHJldm9jYXRpb25FbmRwb2ludDplLnJldm9jYXRpb25fZW5kcG9pbnQsdG9rZW5FbmRwb2ludDplLnRva2VuX2VuZHBvaW50LHVzZXJpbmZvRW5kcG9pbnQ6ZS51c2VyaW5mb19lbmRwb2ludCx3ZWxsS25vd25FbmRwb2ludDp5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlV2VsbEtub3duRW5kcG9pbnQoKX19KSl9Z2V0U2lnbk91dFVSTCgpe3ZhciBlLHQscjtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBuPW51bGw9PT0oZT15aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5lbmRfc2Vzc2lvbl9lbmRwb2ludCxpPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCFufHwwPT09bi50cmltKCkubGVuZ3RoKXRocm93IG5ldyBBdCgiQVVUSF9DT1JFLUdTT1UtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRTaWduT3V0VVJMIiwiU2lnbi1vdXQgZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHNpZ24tb3V0IGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHNpZ24tb3V0IGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IG89bnVsbD09PSh0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpKXx8dm9pZCAwPT09dD92b2lkIDA6dC5pZF90b2tlbjtpZighb3x8MD09PW8udHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgQXQoIkFVVEhfQ09SRS1HU09VLU5GMDIiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwiZ2V0U2lnbk91dFVSTCIsIklEIHRva2VuIG5vdCBmb3VuZC4iLCJObyBJRCB0b2tlbiBjb3VsZCBiZSBmb3VuZC4gRWl0aGVyIHRoZSBzZXNzaW9uIGluZm9ybWF0aW9uIGlzIGxvc3Qgb3IgeW91IGhhdmUgbm90IHNpZ25lZCBpbi4iKTtjb25zdCBzPW51bGwhPT0ocj1udWxsPT1pP3ZvaWQgMDppLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PXI/cjpudWxsPT1pP3ZvaWQgMDppLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFzfHwwPT09cy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBBdCgiQVVUSF9DT1JFLUdTT1UtTkYwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRTaWduT3V0VVJMIiwiTm8gc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGZvdW5kLiIsIlRoZSBzaWduLW91dCByZWRpcmVjdCBVUkwgY2Fubm90IGJlIGZvdW5kIG9yIHRoZSBVUkwgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIE5vIHNpZ24taW4gcmVkaXJlY3QgVVJMIGhhcyBiZWVuIGZvdW5kIGVpdGhlci4gIik7cmV0dXJuYCR7bn0/aWRfdG9rZW5faGludD0ke299JnBvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaT0ke3N9JnN0YXRlPXNpZ25fb3V0X3N1Y2Nlc3NgfSkpfXNpZ25PdXQoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIHRoaXMuZ2V0U2lnbk91dFVSTCgpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YSgpLGV9KSl9Z2V0QWNjZXNzVG9rZW4oKXt2YXIgZTtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShlPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5hY2Nlc3NfdG9rZW59KSl9aXNBdXRoZW50aWNhdGVkKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEJvb2xlYW4oeWllbGQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpKX0pKX1nZXRQS0NFQ29kZSgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigicGtjZV9jb2RlX3ZlcmlmaWVyIil9KSl9c2V0UEtDRUNvZGUoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiLGUpfSkpfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShlKSxlLm92ZXJyaWRlV2VsbEVuZHBvaW50Q29uZmlnPyhudWxsPT1lP3ZvaWQgMDplLmVuZHBvaW50cykmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50cyh7fSkpKToobnVsbD09ZT92b2lkIDA6ZS5lbmRwb2ludHMpJiYoeWllbGQgdGhpcy5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMCkpfSkpfX1jbGFzcyBSbntjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2lkPWUsdGhpcy5fc3RvcmU9dH1zZXREYXRhSW5CdWxrKGUsdCl7dmFyIHI7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgbj1udWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PXI/cjpudWxsLGk9biYmSlNPTi5wYXJzZShuKSxvPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx0KSxzPUpTT04uc3RyaW5naWZ5KG8pO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxzKX0pKX1zZXRWYWx1ZShlLHQscil7dmFyIG47cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgaT1udWxsIT09KG49eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PW4/bjpudWxsLG89aSYmSlNPTi5wYXJzZShpKSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W3RdOnJ9KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLHQpe3ZhciByO3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPW4mJkpTT04ucGFyc2Uobiksbz1PYmplY3QuYXNzaWduKHt9LGkpO2RlbGV0ZSBvW3RdO2NvbnN0IHM9SlNPTi5zdHJpbmdpZnkobyk7eWllbGQgdGhpcy5fc3RvcmUuc2V0RGF0YShlLHMpfSkpfV9yZXNvbHZlS2V5KGUpe3JldHVybmAke2V9LSR7dGhpcy5faWR9YH1zZXRDb25maWdEYXRhKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KF90LkNvbmZpZ0RhdGEpLGUpfSkpfXNldE9JRENQcm92aWRlck1ldGFEYXRhKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KF90Lk9JRENQcm92aWRlck1ldGFEYXRhKSxlKX0pKX1zZXRUZW1wb3JhcnlEYXRhKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KF90LlRlbXBvcmFyeURhdGEpLGUpfSkpfXNldFNlc3Npb25EYXRhKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KF90LlNlc3Npb25EYXRhKSxlKX0pKX1nZXRDb25maWdEYXRhKCl7dmFyIGU7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShfdC5Db25maWdEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKXt2YXIgZTtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gSlNPTi5wYXJzZShudWxsIT09KGU9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KF90Lk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YSgpe3ZhciBlO3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0oZT15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoX3QuVGVtcG9yYXJ5RGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfWdldFNlc3Npb25EYXRhKCl7dmFyIGU7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShfdC5TZXNzaW9uRGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoX3QuQ29uZmlnRGF0YSkpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KF90Lk9JRENQcm92aWRlck1ldGFEYXRhKSl9KSl9cmVtb3ZlVGVtcG9yYXJ5RGF0YSgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShfdC5UZW1wb3JhcnlEYXRhKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoX3QuU2Vzc2lvbkRhdGEpKX0pKX1nZXRDb25maWdEYXRhUGFyYW1ldGVyKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KF90LkNvbmZpZ0RhdGEpKTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KVtlXX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShfdC5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoX3QuVGVtcG9yYXJ5RGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KF90LlNlc3Npb25EYXRhKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9c2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlLHQpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShfdC5Db25maWdEYXRhKSxlLHQpfSkpfXNldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUsdCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KF90Lk9JRENQcm92aWRlck1ldGFEYXRhKSxlLHQpfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSx0KXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnNldFZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoX3QuVGVtcG9yYXJ5RGF0YSksZSx0KX0pKX1zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcihlLHQpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShfdC5TZXNzaW9uRGF0YSksZSx0KX0pKX1yZW1vdmVDb25maWdEYXRhUGFyYW1ldGVyKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShfdC5Db25maWdEYXRhKSxlKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnJlbW92ZVZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoX3QuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KF90LlRlbXBvcmFyeURhdGEpLGUpfSkpfXJlbW92ZVNlc3Npb25EYXRhUGFyYW1ldGVyKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShfdC5TZXNzaW9uRGF0YSksZSl9KSl9fWNvbnN0IENuPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6eXQucXVlcnksc2NvcGU6WyJvcGVuaWQiXSxzZW5kQ29va2llc0luUmVxdWVzdHM6ITAsdmFsaWRhdGVJRFRva2VuOiEwfTtjbGFzcyBQbnsKLyoqCiAgICAgICAgICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdG9yZX0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBfc3RvcmU6IFN0b3JlID0gbmV3IERhdGFTdG9yZSgpOwogICAgICAgICAqIGNvbnN0IGF1dGggPSBuZXcgQXNnYXJkZW9BdXRoQ2xpZW50PEN1c3RvbUNsaWVudENvbmZpZz4oX3N0b3JlKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqLwpjb25zdHJ1Y3RvcihlKXtQbi5faW5zdGFuY2VJRD9Qbi5faW5zdGFuY2VJRCs9MTpQbi5faW5zdGFuY2VJRD0wLHRoaXMuX2RhdGFMYXllcj1uZXcgUm4oYGluc3RhbmNlXyR7UG4uX2luc3RhbmNlSUR9YCxlKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmU9bmV3IFRuKHRoaXMuX2RhdGFMYXllcikKLyoqCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgU0RLIHdpdGggdGhlIGNvbmZpZyBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBdXRoQ2xpZW50Q29uZmlnPFQ+fSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICogICAgIGNsaWVudElEOiAiY2xpZW50IElEIiwKICAgICAgICAgKiAgICAgc2VydmVyT3JpZ2luOiAiaHR0cHM6Ly9sb2NhbGhvc3Q6OTQ0MyIKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLmluaXRpYWxpemUoY29uZmlnKTsKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpbml0aWFsaXplCiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi99aW5pdGlhbGl6ZShlKXt2YXIgdCxyLG47cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldENvbmZpZ0RhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sQ24pLGUpLHtzY29wZTpbLi4ubnVsbCE9PSh0PUNuLnNjb3BlKSYmdm9pZCAwIT09dD90OltdLC4uLm51bGwhPT0obj1udWxsPT09KHI9ZS5zY29wZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZmlsdGVyKChlPT57dmFyIHQ7cmV0dXJuIShudWxsPT09KHQ9bnVsbD09Q24/dm9pZCAwOkNuLnNjb3BlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5pbmNsdWRlcyhlKSl9KSkpJiZ2b2lkIDAhPT1uP246W11dfSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBgRGF0YUxheWVyYCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGFjY2VzcyBhdXRoZW50aWNhdGlvbiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7RGF0YUxheWVyfSAtIFRoZSBgRGF0YUxheWVyYCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRhdGEgPSBhdXRoLmdldERhdGFMYXllcigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERhdGFMYXllcgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0RGF0YUxheWVyKCl7cmV0dXJuIHRoaXMuX2RhdGFMYXllcn0KLyoqCiAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtHZXRBdXRoVVJMQ29uZmlnfSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgZmlkcCBwYXJhbWV0ZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGguZ2V0QXV0aG9yaXphdGlvblVSTCgpLnRoZW4oKHVybCk9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codXJsKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEF1dGhvcml6YXRpb25VUkwKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEF1dGhvcml6YXRpb25VUkwoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBudWxsPT10fHxkZWxldGUgdC5mb3JjZUluaXQsKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQpOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShudWxsPT1lP3ZvaWQgMDplLmZvcmNlSW5pdCkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQpKSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgc2VuZHMgYSByZXF1ZXN0IHRvIG9idGFpbiB0aGUgYWNjZXNzIHRva2VuIGFuZCByZXR1cm5zIGEgUHJvbWlzZQogICAgICAgICAqIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0aG9yaXphdGlvbkNvZGUgLSBUaGUgYXV0aG9yaXphdGlvbiBjb2RlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uU3RhdGUgLSBUaGUgc2Vzc2lvbiBzdGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8VG9rZW5SZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gcmVzcG9uc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmVxdWVzdEFjY2Vzc1Rva2VuKGF1dGhDb2RlLCBzZXNzaW9uU3RhdGUpLnRoZW4oKHRva2VuKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyh0b2tlbik7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0QWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlcXVlc3RBY2Nlc3NUb2tlbihlLHQpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKT90aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUsdCk6dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCExKS50aGVuKCgoKT0+dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLHQpKSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgYXV0aGVudGljYXRpb24gZGF0YSBhbmQgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3Qgc2lnbk91dFVybCA9IGF3YWl0IGF1dGguc2lnbk91dCgpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3NpZ25PdXQKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NpZ25PdXQoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNpZ25PdXQoKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogKipUaGlzIGRvZXNuJ3QgY2xlYXIgdGhlIGF1dGhlbnRpY2F0aW9uIGRhdGEuKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHNpZ25PdXRVcmwgPSBhd2FpdCBhdXRoLmdldFNpZ25PdXRVUkwoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRTaWduT3V0VVJMCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRTaWduT3V0VVJMKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRTaWduT3V0VVJMKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cyB0aGF0IGFyZSBmZXRjaGVkIGZyb20gdGhlIGAud2VsbC1rbm93bmAgZW5kcG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPE9JRENFbmRwb2ludHM+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE9JREMgc2VydmljZSBlbmRwb2ludHMuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGF1dGguZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRPSURDU2VydmljZUVuZHBvaW50cwogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIHBheWxvYWQgb2YgdGhlIElEIHRva2VuIGFuZCByZXR1cm5zIGl0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxEZWNvZGVkSURUb2tlblBheWxvYWQ+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGRlY29kZWQgSUQgdG9rZW4gcGF5bG9hZC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgZGVjb2RlZElkVG9rZW4gPSBhd2FpdCBhdXRoLmdldERlY29kZWRJRFRva2VuKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0RGVjb2RlZElEVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERlY29kZWRJRFRva2VuKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXREZWNvZGVkSURUb2tlbigpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJRCB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBJRCB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgaWRUb2tlbiA9IGF3YWl0IGF1dGguZ2V0SURUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldElEVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldElEVG9rZW4oKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldElEVG9rZW4oKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYmFzaWMgdXNlciBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBJRCB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8QmFzaWNVc2VySW5mbz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYmFzaWMgdXNlciBpbmZvcm1hdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgdXNlckluZm8gPSBhd2FpdCBhdXRoLmdldEJhc2ljVXNlckluZm8oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRCYXNpY1VzZXJJbmZvCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRCYXNpY1VzZXJJbmZvKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRCYXNpY1VzZXJJbmZvKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldm9rZXMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqICoqVGhpcyBtZXRob2QgYWxzbyBjbGVhcnMgdGhlIGF1dGhlbnRpY2F0aW9uIGRhdGEuKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8QXhpb3NSZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2Ugb2YgdGhlIHJldm9rZS1hY2Nlc3MtdG9rZW4gcmVxdWVzdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXZva2VBY2Nlc3NUb2tlbgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmV2b2tlQWNjZXNzVG9rZW4oKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJldm9rZUFjY2Vzc1Rva2VuKCl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIGFuZCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG5ldyBhY2Nlc3MKICAgICAgICAgKiB0b2tlbiBhbmQgb3RoZXIgcmVsZXZhbnQgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8VG9rZW5SZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gcmVzcG9uc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlZnJlc2hBY2Nlc3NUb2tlbgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmVmcmVzaEFjY2Vzc1Rva2VuKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZWZyZXNoQWNjZXNzVG9rZW4oKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYWNjZXNzIHRva2VuLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBhdXRoLmdldEFjY2Vzc1Rva2VuKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEFjY2Vzc1Rva2VuKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBY2Nlc3NUb2tlbigpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBhIGN1c3RvbS1ncmFudCByZXF1ZXN0IGFuZCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlCiAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBjb25maWcgcGFzc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDdXN0b21HcmFudENvbmZpZ30gY29uZmlnIC0gQSBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1c3RvbSBncmFudCBjb25maWd1cmF0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8VG9rZW5SZXNwb25zZSB8IEF4aW9zUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlIGRlcGVuZGluZwogICAgICAgICAqIG9uIHlvdXIgY29uZmlndXJhdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgIGF0dGFjaFRva2VuOiBmYWxzZSwKICAgICAgICAgKiAgIGRhdGE6IHsKICAgICAgICAgKiAgICAgICBjbGllbnRfaWQ6ICJ7e2NsaWVudElEfX0iLAogICAgICAgICAqICAgICAgIGdyYW50X3R5cGU6ICJhY2NvdW50X3N3aXRjaCIsCiAgICAgICAgICogICAgICAgc2NvcGU6ICJ7e3Njb3BlfX0iLAogICAgICAgICAqICAgICAgIHRva2VuOiAie3t0b2tlbn19IiwKICAgICAgICAgKiAgIH0sCiAgICAgICAgICogICBpZDogImFjY291bnQtc3dpdGNoIiwKICAgICAgICAgKiAgIHJldHVyblJlc3BvbnNlOiB0cnVlLAogICAgICAgICAqICAgcmV0dXJuc1Nlc3Npb246IHRydWUsCiAgICAgICAgICogICBzaWduSW5SZXF1aXJlZDogdHJ1ZQogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGF1dGgucmVxdWVzdEN1c3RvbUdyYW50KGNvbmZpZykudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlcXVlc3RDdXN0b21HcmFudAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmVxdWVzdEN1c3RvbUdyYW50KGUpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEN1c3RvbUdyYW50KGUpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXdhaXQgYXV0aC5pc0F1dGhlbnRpY2F0ZWQoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpc0F1dGhlbnRpY2F0ZWQKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2lzQXV0aGVudGljYXRlZCgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuaXNBdXRoZW50aWNhdGVkKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFBLQ0UgY29kZSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgUEtDRSBjb2RlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBwa2NlID0gYXdhaXQgZ2V0UEtDRUNvZGUoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRQS0NFQ29kZQogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0UEtDRUNvZGUoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFBLQ0VDb2RlKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIFBLQ0UgY29kZSB0byB0aGUgZGF0YSBzdG9yZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXdhaXQgYXV0aC5zZXRQS0NFQ29kZSgicGtjZV9jb2RlIikKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNzZXRQS0NFQ29kZQogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovc2V0UEtDRUNvZGUoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNldFBLQ0VDb2RlKGUpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBpcyBzdWNjZXNzZnVsIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduT3V0UmVkaXJlY3RVcmwgLSBUaGUgVVJMIHRvIHdoaWNoIHRoZSB1c2VyIGhhcyBiZWVuIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgc2lnbmluZy1vdXQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoZSBzZXJ2ZXIgYXBwZW5kcyBwYXRoIHBhcmFtZXRlcnMgdG8gdGhlIGBzaWduT3V0UmVkaXJlY3RVUkxgIGFuZCB0aGVzZSBwYXRoIHBhcmFtZXRlcnMKICAgICAgICAgKiAgYXJlIHJlcXVpcmVkIGZvciB0aGlzIG1ldGhvZCB0byBmdW5jdGlvbi4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSBgdHJ1ZWAgaWYgc3VjY2Vzc2Z1bCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNTaWduT3V0U3VjY2Vzc2Z1bAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovc3RhdGljIGlzU2lnbk91dFN1Y2Nlc3NmdWwoZSl7Y29uc3QgdD1uZXcgVVJMKGUpLHI9dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpLG49Qm9vbGVhbih0LnNlYXJjaFBhcmFtcy5nZXQoImVycm9yIikpO3JldHVybiEhciYmInNpZ25fb3V0X3N1Y2Nlc3MiPT09ciYmIW59Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQYXJ0aWFsPEF1dGhDbGllbnRDb25maWc8VD4+fSBjb25maWcgLSBBIGNvbmZpZyBvYmplY3QgdG8gdXBkYXRlIHRoZSBTREsgY29uZmlndXJhdGlvbnMgd2l0aC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgY29uZmlnID0gewogICAgICAgICAqICAgICBzaWduSW5SZWRpcmVjdFVSTDogImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9zaWduLWluIiwKICAgICAgICAgKiAgICAgY2xpZW50SUQ6ICJjbGllbnQgSUQiLAogICAgICAgICAqICAgICBzZXJ2ZXJPcmlnaW46ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGF3YWl0IGF1dGgudXBkYXRlQ29uZmlnKGNvbmZpZyk7CiAgICAgICAgICogYGBgCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3VwZGF0ZUNvbmZpZwogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovdXBkYXRlQ29uZmlnKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS51cGRhdGVDb25maWcoZSl9KSl9fWNvbnN0IERuPSJpbml0Ijt2YXIgT24sSW47IWZ1bmN0aW9uKGUpe2UuTG9jYWxTdG9yYWdlPSJsb2NhbFN0b3JhZ2UiLGUuU2Vzc2lvblN0b3JhZ2U9InNlc3Npb25TdG9yYWdlIixlLldlYldvcmtlcj0id2ViV29ya2VyIixlLkJyb3dzZXJNZW1vcnk9ImJyb3dzZXJNZW1vcnkifShPbnx8KE9uPXt9KSksZnVuY3Rpb24oZSl7ZS5TaWduSW49InNpZ24taW4iLGUuU2lnbk91dD0ic2lnbi1vdXQiLGUuSW5pdGlhbGl6ZT0iaW5pdGlhbGl6ZSIsZS5IdHRwUmVxdWVzdFN0YXJ0PSJodHRwLXJlcXVlc3Qtc3RhcnQiLGUuSHR0cFJlcXVlc3RGaW5pc2g9Imh0dHAtcmVxdWVzdC1maW5pc2giLGUuSHR0cFJlcXVlc3RFcnJvcj0iaHR0cC1yZXF1ZXN0LWVycm9yIixlLkh0dHBSZXF1ZXN0U3VjY2Vzcz0iaHR0cC1yZXF1ZXN0LXN1Y2Nlc3MiLGUuUmV2b2tlQWNjZXNzVG9rZW49InJldm9rZS1hY2Nlc3MtdG9rZW4iLGUuQ3VzdG9tR3JhbnQ9ImN1c3RvbS1ncmFudCJ9KElufHwoSW49e30pKTtjb25zdCBVbj0iY3VzdG9tX2dyYW50X2NvbmZpZyI7Y2xhc3MgTW4gZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHQscixuLGksbyl7c3VwZXIobnVsbCE9bj9uOm51bGw9PW8/dm9pZCAwOm8ubWVzc2FnZSksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvZGU9ZSx0aGlzLmZpbGU9dCx0aGlzLm1ldGhvZD1yLHRoaXMuZXJyb3I9byx0aGlzLmRlc2NyaXB0aW9uPWksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsbmV3LnRhcmdldC5wcm90b3R5cGUpfX1jbGFzcyBMbntjb25zdHJ1Y3RvcihlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudD1lLHRoaXMuX2RhdGFMYXllcj10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREYXRhTGF5ZXIoKX1yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpO2lmKHQucmVmcmVzaF90b2tlbil7Y29uc3Qgcj1wYXJzZUludCh0LmV4cGlyZXNfaW4pLG49c2V0VGltZW91dCgoKCk9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKX0pKSksMWUzKihyPD0xMD9yOnItMTApKTt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihrdCxKU09OLnN0cmluZ2lmeShuKSl9fSkpfWNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoa3QpKXtjb25zdCBlPUpTT04ucGFyc2UoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoa3QpKTtjbGVhclRpbWVvdXQoZSl9fSkpfX1jbGFzcyBIbntjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKXtyZXR1cm57YmxvYjoobnVsbD09ZT92b2lkIDA6ZS5kYXRhKWluc3RhbmNlb2YgQmxvYj9udWxsPT1lP3ZvaWQgMDplLmRhdGE6bnVsbCxkYXRhOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMH19c3RhdGljIGdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSl7cmV0dXJuKG51bGw9PWU/dm9pZCAwOmUudG9KU09OKSYmZGVsZXRlIGUudG9KU09OLHtlcnJvcjpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHN1Y2Nlc3M6ITF9fX12YXIgeG47bGV0IGpuPXhuPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5hdHRhY2hUb2tlbj0oKT0+UHJvbWlzZS5yZXNvbHZlKCksdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLmluaXQ9dGhpcy5pbml0LmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2suYmluZCh0aGlzKX1zdGF0aWMgZ2V0SW5zdGFuY2UoKXtyZXR1cm4gdGhpcy5heGlvc0luc3RhbmNlfHwodGhpcy5heGlvc0luc3RhbmNlPXd0LmNyZWF0ZSh7d2l0aENyZWRlbnRpYWxzOiEwfSksdGhpcy5jbGllbnRJbnN0YW5jZXx8KHRoaXMuY2xpZW50SW5zdGFuY2U9bmV3IHhuKSx0aGlzLmF4aW9zSW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKCh0PT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuY2xpZW50SW5zdGFuY2UucmVxdWVzdEhhbmRsZXIodCl9KSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZSgoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5zdWNjZXNzSGFuZGxlcihlKSksKGU9PnRoaXMuY2xpZW50SW5zdGFuY2UuZXJyb3JIYW5kbGVyKGUpKSksdGhpcy5heGlvc0luc3RhbmNlLmFsbD13dC5hbGwsdGhpcy5heGlvc0luc3RhbmNlLnNwcmVhZD13dC5zcHJlYWQsdGhpcy5heGlvc0luc3RhbmNlLmluaXQ9dGhpcy5jbGllbnRJbnN0YW5jZS5pbml0LHRoaXMuYXhpb3NJbnN0YW5jZS5lbmFibGVIYW5kbGVyPXRoaXMuY2xpZW50SW5zdGFuY2UuZW5hYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dD10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQsdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayksdGhpcy5heGlvc0luc3RhbmNlfXJlcXVlc3RIYW5kbGVyKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoeWllbGQgdGhpcy5hdHRhY2hUb2tlbih0KSxudWxsPT10P3ZvaWQgMDp0LnNob3VsZEVuY29kZVRvRm9ybURhdGEpe2NvbnN0IGU9bnVsbD09dD92b2lkIDA6dC5kYXRhLHI9bmV3IEZvcm1EYXRhO09iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PntyLmFwcGVuZCh0LGVbdF0pfSkpLHQuZGF0YT1yfXJldHVybiB4bi5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayh0KSx0fSkpfWVycm9ySGFuZGxlcihlKXt0aHJvdyB4bi5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJnRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1zdWNjZXNzSGFuZGxlcihlKXtyZXR1cm4geG4uaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9aW5pdCh0PSEwLHIpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eG4uaXNIYW5kbGVyRW5hYmxlZD10LHRoaXMuYXR0YWNoVG9rZW49cn0pKX1lbmFibGVIYW5kbGVyKCl7eG4uaXNIYW5kbGVyRW5hYmxlZD0hMH1kaXNhYmxlSGFuZGxlcigpe3huLmlzSGFuZGxlckVuYWJsZWQ9ITF9ZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dChlPXhuLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQpe3huLmlzSGFuZGxlckVuYWJsZWQ9ITEsc2V0VGltZW91dCgoKCk9Pnt4bi5pc0hhbmRsZXJFbmFibGVkPSEwfSksZSl9c2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9ZX19O2puLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLGpuPXhuPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1uP249T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpOm47aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LHIsbik7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkoaT1lW2FdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQscixzKTppKHQscikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHMpLHN9KFtlPT57fV0sam4pO2NsYXNzIEJue2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT1uZXcgTWFwfXNldERhdGEodCxyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuc2V0KHQscil9KSl9Z2V0RGF0YSh0KXt2YXIgcixuO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGwhPT0obj1udWxsPT09KHI9dGhpcy5fZGF0YSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0KHQpKSYmdm9pZCAwIT09bj9uOiJ7fSJ9KSl9cmVtb3ZlRGF0YSh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuZGVsZXRlKHQpfSkpfX1jb25zdCBxbj1zZWxmO2xldCBObjtxbi5vbm1lc3NhZ2U9KHtkYXRhOnQscG9ydHM6cn0pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgbixpLG87Y29uc3Qgcz1yWzBdO2lmKHQudHlwZT09PURufHxObilzd2l0Y2godC50eXBlKXtjYXNlIERuOnRyeXtjb25zdCByPU9iamVjdC5hc3NpZ24oe30sdC5kYXRhKTtObj15aWVsZCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPW5ldyBCbixuPW5ldyBQbihyKTt5aWVsZCBuLmluaXRpYWxpemUodCk7Y29uc3QgaT1uZXcgTG4obiksbz1uLmdldERhdGFMYXllcigpLHM9am4uZ2V0SW5zdGFuY2UoKTsobnVsbD09cz92b2lkIDA6cy5pbml0KSYmKHlpZWxkIHMuaW5pdCghMCwodD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7T2JqZWN0LmFzc2lnbih7YXR0YWNoVG9rZW46ITB9LHQpLmF0dGFjaFRva2VuJiYodC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt5aWVsZCBuLmdldEFjY2Vzc1Rva2VuKCl9YH0pKX0pKSkpKTtjb25zdCBhPXQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciByLHMsYTtsZXQgdT0hMCxjPSExO2NvbnN0IGg9eWllbGQgby5nZXRDb25maWdEYXRhKCk7aWYobnVsbD09dD92b2lkIDA6dC50b2tlbkVuZHBvaW50KXt1PSExO2Zvcihjb25zdCBlIG9mWy4uLm51bGwhPT0ocz1udWxsPT09KHI9eWllbGQgby5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PXM/czpbXSxudWxsPT1oP3ZvaWQgMDpoLnNlcnZlck9yaWdpbl0paWYobnVsbD09PShhPXQudG9rZW5FbmRwb2ludCl8fHZvaWQgMD09PWE/dm9pZCAwOmEuc3RhcnRzV2l0aChlKSl7Yz0hMDticmVha319cmV0dXJuIHQuc2hvdWxkUmVwbGF5QWZ0ZXJSZWZyZXNoJiZvLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoVW4sSlNPTi5zdHJpbmdpZnkodCkpLHV8fGM/bi5yZXF1ZXN0Q3VzdG9tR3JhbnQodCkudGhlbigocj0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHQucmV0dXJuc1Nlc3Npb24/KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKTpyfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IE1uKCJXT1JLRVJfQ09SRS1SQ0ctSVYwMSIsIndvcmtlci1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgdG9rZW4gZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSksdT0oKT0+bi5yZWZyZXNoQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KGMoKS50aGVuKChlPT57ZSYmYShlKX0pKSxpLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKSxuLmdldEJhc2ljVXNlckluZm8oKSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSxjPSgpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIG8uZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihVbik7cmV0dXJuIGU/SlNPTi5wYXJzZShlKTpudWxsfSkpO3JldHVybntkaXNhYmxlSHR0cEhhbmRsZXI6KCk9PntzLmRpc2FibGVIYW5kbGVyJiZzLmRpc2FibGVIYW5kbGVyKCl9LGVuYWJsZUh0dHBIYW5kbGVyOigpPT57cy5lbmFibGVIYW5kbGVyJiZzLmVuYWJsZUhhbmRsZXIoKX0sZ2V0QWNjZXNzVG9rZW46KCk9Pm4uZ2V0QWNjZXNzVG9rZW4oKSxnZXRBdXRob3JpemF0aW9uVVJMOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuLmdldEF1dGhvcml6YXRpb25VUkwodCkudGhlbigodD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJue2F1dGhvcml6YXRpb25VUkw6dCxwa2NlOnlpZWxkIG4uZ2V0UEtDRUNvZGUoKX19KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKX0pKSxnZXRCYXNpY1VzZXJJbmZvOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbi5nZXRCYXNpY1VzZXJJbmZvKCl9KSksZ2V0Q29uZmlnRGF0YTooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG8uZ2V0Q29uZmlnRGF0YSgpfSkpLGdldERlY29kZWRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbi5nZXREZWNvZGVkSURUb2tlbigpfSkpLGdldElEVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuLmdldElEVG9rZW4oKX0pKSxnZXRPSURDU2VydmljZUVuZHBvaW50czooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG4uZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKSxnZXRTaWduT3V0VVJMOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgbi5nZXRTaWduT3V0VVJMKCl9KSksaHR0cFJlcXVlc3Q6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUscixuO2xldCBpPSExO2NvbnN0IGE9eWllbGQgby5nZXRDb25maWdEYXRhKCk7Zm9yKGNvbnN0IHMgb2ZbLi4ubnVsbCE9PShyPW51bGw9PT0oZT15aWVsZCBvLmdldENvbmZpZ0RhdGEoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09cj9yOltdLG51bGw9PWE/dm9pZCAwOmEuc2VydmVyT3JpZ2luXSlpZihudWxsPT09KG49bnVsbD09dD92b2lkIDA6dC51cmwpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnN0YXJ0c1dpdGgocykpe2k9ITA7YnJlYWt9cmV0dXJuIGk/cy5yZXF1ZXN0KHQpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChlPT57dmFyIHI7cmV0dXJuIDQwMSE9PShudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzKSYmKG51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpP1Byb21pc2UucmVqZWN0KGUpOnUoKS50aGVuKCgoKT0+cy5yZXF1ZXN0KHQpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBNbigiV09SS0VSX0NPUkUtSFItRVMwMSIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCIiLCIiLGUpKSkpfSkpOlByb21pc2UucmVqZWN0KG5ldyBNbigiV09SS0VSX0NPUkUtSFItSVYwMiIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKSxodHRwUmVxdWVzdEFsbDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSxyLGk7bGV0IGE9ITA7Y29uc3QgdT15aWVsZCBvLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgbiBvZiB0KXtsZXQgdD0hMTtmb3IoY29uc3QgcyBvZlsuLi5udWxsIT09KHI9bnVsbD09PShlPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1yP3I6W10sbnVsbD09dT92b2lkIDA6dS5zZXJ2ZXJPcmlnaW5dKWlmKG51bGw9PT0oaT1uLnVybCl8fHZvaWQgMD09PWk/dm9pZCAwOmkuc3RhcnRzV2l0aChzKSl7dD0hMDticmVha31pZighdCl7YT0hMTticmVha319Y29uc3QgYz1bXTtyZXR1cm4gYT8odC5mb3JFYWNoKChlPT57Yy5wdXNoKHMucmVxdWVzdChlKSl9KSksKG51bGw9PXM/dm9pZCAwOnMuYWxsKSYmcy5hbGwoYykudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKGU9Pnt2YXIgdDtyZXR1cm4gNDAxPT09KG51bGw9PT0odD1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5zdGF0dXMpP24ucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigoKCk9PnMuYWxsJiZzLmFsbChjKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgTW4oIldPUktFUl9DT1JFLUhSQS1FUzAxIiwid29ya2VyLWNvcmUiLCJodHRwUmVxdWVzdEFsbCIsIiIsIiIsZSkpKSk6UHJvbWlzZS5yZWplY3QoZSl9KSkpOlByb21pc2UucmVqZWN0KG5ldyBNbigiV09SS0VSX0NPUkUtSFJBLUlWMDIiLCJ3b3JrZXItY29yZSIsImh0dHBSZXF1ZXN0IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSksaXNBdXRoZW50aWNhdGVkOigpPT5uLmlzQXV0aGVudGljYXRlZCgpLHJlZnJlc2hBY2Nlc3NUb2tlbjp1LHJlcXVlc3RBY2Nlc3NUb2tlbjoodCxyLHMpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpO3JldHVybiBzJiZlLmVuYWJsZVBLQ0UmJih5aWVsZCBuLnNldFBLQ0VDb2RlKHMpKSx0P24ucmVxdWVzdEFjY2Vzc1Rva2VuKHQsbnVsbCE9cj9yOiIiKS50aGVuKCgoKT0+KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBNbigiV09SS0VSX0NPUkUtUkFUMS1ORjAxIiwid29ya2VyLWNvcmUiLCJyZXF1ZXN0QWNjZXNzVG9rZW4iLCJObyBhdXRob3JpemF0aW9uIGNvZGUuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlIHdhcyBmb3VuZC4iKSl9KSkscmVxdWVzdEN1c3RvbUdyYW50OmEscmV2b2tlQWNjZXNzVG9rZW46KCk9Pm4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KGkuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksUHJvbWlzZS5yZXNvbHZlKCEwKSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSxzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrOmU9PnsobnVsbD09cz92b2lkIDA6cy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSYmcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s6ZT0+eyhudWxsPT1zP3ZvaWQgMDpzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaykmJnMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjazplPT57KG51bGw9PXM/dm9pZCAwOnMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2spJiZzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpfSxzZXRTZXNzaW9uU3RhdGU6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgby5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCl9KSksc2lnbk91dDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGkuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCkseWllbGQgbi5zaWduT3V0KCl9KSksc3RhcnRBdXRvUmVmcmVzaFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpfSkpLHVwZGF0ZUNvbmZpZzp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBuLnVwZGF0ZUNvbmZpZyh0KX0pKX19KSkpKHIpLE5uLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soWW4pLE5uLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhLbiksTm4uc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soRm4pLHMucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0X2F1dGhfdXJsIjpObi5nZXRBdXRob3JpemF0aW9uVVJMKG51bGw9PXQ/dm9pZCAwOnQuZGF0YSkudGhlbigoZT0+e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmVxdWVzdF9nZXRfdG9rZW4iOk5uLnJlcXVlc3RBY2Nlc3NUb2tlbihudWxsPT09KG49bnVsbD09dD92b2lkIDA6dC5kYXRhKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jb2RlLG51bGw9PT0oaT1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLnNlc3Npb25TdGF0ZSxudWxsPT09KG89bnVsbD09dD92b2lkIDA6dC5kYXRhKXx8dm9pZCAwPT09bz92b2lkIDA6by5wa2NlKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShIbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJodHRwLXJlcXVlc3QiOk5uLmh0dHBSZXF1ZXN0KHQuZGF0YSkudGhlbigoZT0+e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiaHR0cC1yZXF1ZXN0LWFsbCI6Tm4uaHR0cFJlcXVlc3RBbGwodC5kYXRhKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShIbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBObi5zaWduT3V0KCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVxdWVzdC1jdXN0b20tZ3JhbnQiOk5uLnJlcXVlc3RDdXN0b21HcmFudCh0LmRhdGEpLnRoZW4oKGU9PntzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57cy5wb3N0TWVzc2FnZShIbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJldm9rZS1hY2Nlc3MtdG9rZW4iOk5uLnJldm9rZUFjY2Vzc1Rva2VuKCkudGhlbigoZT0+e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgTm4uZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtYmFzaWMtdXNlci1pbmZvIjp0cnl7cy5wb3N0TWVzc2FnZShIbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIE5uLmdldEJhc2ljVXNlckluZm8oKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtZGVjb2RlZC1pZC10b2tlbiI6dHJ5e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBObi5nZXREZWNvZGVkSURUb2tlbigpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShIbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBObi5nZXRJRFRva2VuKCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZW5hYmxlX2h0dHBfaGFuZGxlciI6Tm4uZW5hYmxlSHR0cEhhbmRsZXIoKSxzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJkaXNhYmxlX2h0dHBfaGFuZGxlciI6Tm4uZGlzYWJsZUh0dHBIYW5kbGVyKCkscy5wb3N0TWVzc2FnZShIbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpO2JyZWFrO2Nhc2UiaXNfYXV0aGVudGljYXRlZCI6dHJ5e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBObi5pc0F1dGhlbnRpY2F0ZWQoKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfc2lnbl9vdXRfdXJsIjp0cnl7cy5wb3N0TWVzc2FnZShIbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIE5uLmdldFNpZ25PdXRVUkwoKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJyZWZyZXNoX2FjY2Vzcy10b2tlbiI6dHJ5e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBObi5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzdGFydF9hdXRvX3JlZnJlc2hfdG9rZW4iOnRyeXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoTm4uc3RhcnRBdXRvUmVmcmVzaFRva2VuKCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2Uic2V0X3Nlc3Npb25fc3RhdGUiOnRyeXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgTm4uc2V0U2Vzc2lvblN0YXRlKG51bGw9PXQ/dm9pZCAwOnQuZGF0YSkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UidXBkYXRlX2NvbmZpZyI6dHJ5e3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBObi51cGRhdGVDb25maWcobnVsbD09dD92b2lkIDA6dC5kYXRhKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfY29uZmlnX2RhdGEiOnRyeXtzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgTm4uZ2V0Q29uZmlnRGF0YSgpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShIbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztkZWZhdWx0Om51bGw9PXN8fHMucG9zdE1lc3NhZ2UoSG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgTW4oIkNMSUVOVF9XT1JLRVItT05NU0ctSVYwMiIsImNsaWVudC53b3JrZXIiLCJvbm1lc3NhZ2UiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIixgVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgJHt0LnR5cGV9LCBpcyBpbnZhbGlkLmApKSl9ZWxzZSBzLnBvc3RNZXNzYWdlKEhuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IE1uKCJDTElFTlRfV09SS0VSLU9OTVNHLU5GMDEiLCJjbGllbnQud29ya2VyIix0LnR5cGUsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSl9KSk7Y29uc3QgS249KCk9Pntxbi5wb3N0TWVzc2FnZSh7dHlwZToicmVxdWVzdC1zdGFydCJ9KX0sRm49ZT0+e3FuLnBvc3RNZXNzYWdlKHtkYXRhOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksdHlwZToicmVxdWVzdC1zdWNjZXNzIn0pfSxZbj0oKT0+e3FuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX07cmV0dXJue319KCk7Cgo=",cn=null,an=!1,function(t){return sn=sn||on(dn,cn,an),new Worker(sn,t)});const rn={checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,sessionRefreshInterval:300,storage:t.Storage.SessionStorage},un="primaryInstance";class mn{constructor(t){this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=t}_isInitialized(){return e(this,void 0,void 0,(function*(){if(!this._startedInitialize)return!1;let t=0;for(;!this._initialized;)10===t&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((t=>setTimeout(t,1e3))),t++;return!0}))}_validateMethod(){return e(this,void 0,void 0,(function*(){return(yield this._isInitialized())&&!!(yield this.isAuthenticated())||Promise.reject()}))}
406
+ */updateConfig(t){return Xe(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(t)}))}}const Kl="sign-out",vl="get_auth_url",Jl="check_session_signed_in",Nl="check_session_signed_out",fl="set_session_state_from_iframe";var Ll,Hl;t.Storage=void 0,(Ll=t.Storage||(t.Storage={})).LocalStorage="localStorage",Ll.SessionStorage="sessionStorage",Ll.WebWorker="webWorker",Ll.BrowserMemory="browserMemory",t.Hooks=void 0,(Hl=t.Hooks||(t.Hooks={})).SignIn="sign-in",Hl.SignOut="sign-out",Hl.Initialize="initialize",Hl.HttpRequestStart="http-request-start",Hl.HttpRequestFinish="http-request-finish",Hl.HttpRequestError="http-request-error",Hl.HttpRequestSuccess="http-request-success",Hl.RevokeAccessToken="revoke-access-token",Hl.CustomGrant="custom-grant";const Ul="rpIFrame",Tl="promptNoneIFrame",kl="Y2hlY2tTZXNzaW9u",Bl="sign-in-silently",xl="initialized-silent-sign-in",wl="promptNoneRequestSent",Fl="error",zl="error_description",Al="custom_grant_config";class Pl extends Error{constructor(t,e,i,l,n,o){super(null!=l?l:null==o?void 0:o.message),this.name=this.constructor.name,this.code=t,this.file=e,this.method=i,this.error=o,this.description=n,Object.setPrototypeOf(this,new.target.prototype)}}class Ql{constructor(t){this._authenticationClient=t,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(){return e(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData();if(t.refresh_token){const i=parseInt(t.expires_in),l=setTimeout((()=>e(this,void 0,void 0,(function*(){yield this._authenticationClient.refreshAccessToken()}))),1e3*(i<=10?i:i-10));yield this._dataLayer.setTemporaryDataParameter(ge,JSON.stringify(l))}}))}clearRefreshTokenTimeout(){return e(this,void 0,void 0,(function*(){if(yield this._dataLayer.getTemporaryDataParameter(ge)){const t=JSON.parse(yield this._dataLayer.getTemporaryDataParameter(ge));clearTimeout(t)}}))}}class Ml{constructor(){}static removeAuthorizationCode(){const t=location.href;history.pushState({},document.title,t.replace(/\?code=.*$/,""))}static getPKCE(){var t;return null!==(t=sessionStorage.getItem(Ve))&&void 0!==t?t:""}static setPKCE(t){sessionStorage.setItem(Ve,t)}static setSignOutURL(t){sessionStorage.setItem(Re,t)}static getSignOutURL(){var t;return null!==(t=sessionStorage.getItem(Re))&&void 0!==t?t:""}static removePKCE(){sessionStorage.removeItem(Ve)}static canContinueSignIn(t,e){return!(t&&!Ml.hasErrorInURL()&&!Ml.hasAuthSearchParamsInURL()&&!e)}static isInitializedSilentSignIn(){return Ml.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!Ml.hasErrorInURL()&&!Ml.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const t=sessionStorage.getItem(xl),e=t?JSON.parse(t):null;return Boolean(e)}static isSignOutSuccessful(){if(Yl.isSignOutSuccessful(window.location.href)){const t=window.location.href.split("?")[0];return history.pushState({},document.title,t),!0}return!1}static isSilentStatePresentInURL(){return new URL(window.location.href).searchParams.get("state")===Bl}static hasAuthSearchParamsInURL(t=window.location.search){return/[?&]code=[^&]+/.test(t)}static hasErrorInURL(t=window.location.href){return!!new URL(t).searchParams.get(Fl)}static canSendPromptNoneRequest(){const t=sessionStorage.getItem(wl);return!(t?JSON.parse(t):null)}static setPromptNoneRequestSent(t){sessionStorage.setItem(wl,JSON.stringify(t))}static waitTillPageRedirect(t){return e(this,void 0,void 0,(function*(){const e=null!=t?t:3e3;yield new Promise((t=>setTimeout(t,1e3*e)))}))}}const jl=(()=>{let i,l,n,o,d,c,a,s,r,Z,u,b;const h=(t,e,s,r,Z,u,h,I)=>{i=t,l=e,n=s,o=r,d=u,c=h,a=Z,b=I,o>-1&&m(),a>-1&&(Z=setInterval((()=>{G()}),1e3*a))},m=()=>e(void 0,void 0,void 0,(function*(){var t;if(!l||!i||!d)return;const c="opIFrame";function a(){var t;return e(this,void 0,void 0,(function*(){const e=yield n();if(Boolean(i)&&Boolean(e)){const n=`${i} ${e}`,o=document.getElementById(Ul),d=(null===(t=null==o?void 0:o.contentDocument)||void 0===t?void 0:t.getElementById(c)).contentWindow;null==d||d.postMessage(n,l)}}))}const s=document.getElementById(Ul);(null===(t=null==s?void 0:s.contentDocument)||void 0===t?void 0:t.getElementById(c)).src=l+"?client_id="+i+"&redirect_uri="+d,yield a(),r=setInterval(a,1e3*o),p()})),I=()=>{clearInterval(r),clearInterval(undefined)},p=()=>{null===window||void 0===window||window.addEventListener("message",(function(t){var i;return e(this,void 0,void 0,(function*(){const e=l;!e||(null==e?void 0:e.indexOf(t.origin))<0||(null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.type)===fl||"unchanged"===t.data||("error"===t.data?window.location.href=yield s():"changed"===t.data&&G())}))}),!1)},G=()=>{var e;const l=document.getElementById(Ul),n=null===(e=null==l?void 0:l.contentDocument)||void 0===e?void 0:e.getElementById(Tl);if(Ml.canSendPromptNoneRequest()){Ml.setPromptNoneRequestSent(!0);const e=t=>{var i,l,n;(null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.type)===fl&&(u(null!==(n=null===(l=null==t?void 0:t.data)||void 0===l?void 0:l.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",e))};Z!==t.Storage.BrowserMemory&&Z!==t.Storage.WebWorker||null===window||void 0===window||window.addEventListener("message",e);const l=new URL(c);l.searchParams.set("response_type","code"),l.searchParams.set("client_id",i),l.searchParams.set("scope","openid"),l.searchParams.set("redirect_uri",d),l.searchParams.set("state",kl),l.searchParams.set("prompt","none"),b&&(l.searchParams.set("code_challenge_method","S256"),l.searchParams.set("code_challenge",(()=>{const t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz-_";let e="";for(let i=0;i<43;i++){const i=Math.floor(Math.random()*t.length);e+=t.substring(i,i+1)}return e})())),n.src=l.toString()}},y=i=>e(void 0,void 0,void 0,(function*(){var e,l;const n=new URL(window.location.href).searchParams.get("state"),o=new URL(window.location.href).searchParams.get(Ce),d=window.parent.parent;if(null!==n&&(n===kl||n===Bl)){const c=new URL(window.location.href).searchParams.get("code");if(null!==c&&0!==c.length){if(n===Bl){const t={data:{code:c,sessionState:null!=o?o:""},type:Jl};return sessionStorage.setItem(xl,"false"),d.postMessage(t,d.origin),Ml.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield Ml.waitTillPageRedirect(),!0}const a=new URL(window.location.href).searchParams.get("session_state");if(Z===t.Storage.LocalStorage||Z===t.Storage.SessionStorage)i&&(yield i(a));else{const t={data:null!=a?a:"",type:fl};null===(l=null===(e=null===window||void 0===window?void 0:window.parent)||void 0===e?void 0:e.parent)||void 0===l||l.postMessage(t)}return Ml.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield Ml.waitTillPageRedirect(),!0}if(n===Bl){const t={type:Nl};return window.parent.parent.postMessage(t,d.origin),Ml.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield Ml.waitTillPageRedirect(),!0}return Ml.setPromptNoneRequestSent(!1),d.location.href=yield s(),window.location.href="about:blank",yield Ml.waitTillPageRedirect(),!0}return!1}));return(t,e,i)=>{var l;let n=document.createElement("iframe");return n.setAttribute("id",Ul),n.style.display="none",n.onload=()=>{var t,e,i,l;n=document.getElementById(Ul);const o=null==n?void 0:n.contentDocument,d=null==o?void 0:o.createElement("iframe");d&&(d.setAttribute("id","opIFrame"),d.style.display="none");const c=null==o?void 0:o.createElement("iframe");c&&(c.setAttribute("id",Tl),c.style.display="none"),d&&(null===(e=null===(t=null==n?void 0:n.contentDocument)||void 0===t?void 0:t.body)||void 0===e||e.appendChild(d)),c&&(null===(l=null===(i=null==n?void 0:n.contentDocument)||void 0===i?void 0:i.body)||void 0===l||l.appendChild(c))},null===(l=null===document||void 0===document?void 0:document.body)||void 0===l||l.appendChild(n),s=t,Z=e,u=i,{initialize:h,receivePromptNoneResponse:y,reset:I}}})();var El;let Dl=El=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>null,this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this)}static getInstance(){return this.axiosInstance||(this.axiosInstance=ye.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new El),this.axiosInstance.interceptors.request.use((t=>e(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(t)})))),this.axiosInstance.interceptors.response.use((t=>this.clientInstance.successHandler(t)),(t=>this.clientInstance.errorHandler(t))),this.axiosInstance.all=ye.all,this.axiosInstance.spread=ye.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}requestHandler(t){return e(this,void 0,void 0,(function*(){if(yield this.attachToken(t),null==t?void 0:t.shouldEncodeToFormData){const e=null==t?void 0:t.data,i=new FormData;Object.keys(e).forEach((t=>{i.append(t,e[t])})),t.data=i}return El.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(t),t}))}errorHandler(t){throw El.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}successHandler(t){return El.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}init(t=!0,i){return e(this,void 0,void 0,(function*(){El.isHandlerEnabled=t,this.attachToken=i}))}enableHandler(){El.isHandlerEnabled=!0}disableHandler(){El.isHandlerEnabled=!1}disableHandlerWithTimeout(t=El.DEFAULT_HANDLER_DISABLE_TIMEOUT){El.isHandlerEnabled=!1,setTimeout((()=>{El.isHandlerEnabled=!0}),t)}setHttpRequestStartCallback(t){this.requestStartCallback=t}setHttpRequestSuccessCallback(t){this.requestSuccessCallback=t}setHttpRequestErrorCallback(t){this.requestErrorCallback=t}setHttpRequestFinishCallback(t){this.requestFinishCallback=t}};Dl.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,Dl=El=function(t,e,i,l){var n,o=arguments.length,d=o<3?e:null===l?l=Object.getOwnPropertyDescriptor(e,i):l;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(t,e,i,l);else for(var c=t.length-1;c>=0;c--)(n=t[c])&&(d=(o<3?n(d):o>3?n(e,i,d):n(e,i))||d);return o>3&&d&&Object.defineProperty(e,i,d),d}([t=>{}],Dl);class Ol{setData(t,i){return e(this,void 0,void 0,(function*(){localStorage.setItem(t,i)}))}getData(t){var i;return e(this,void 0,void 0,(function*(){return null!==(i=localStorage.getItem(t))&&void 0!==i?i:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){localStorage.removeItem(t)}))}}class _l{constructor(){this._data=new Map}setData(t,i){return e(this,void 0,void 0,(function*(){this._data.set(t,i)}))}getData(t){var i,l;return e(this,void 0,void 0,(function*(){return null!==(l=null===(i=this._data)||void 0===i?void 0:i.get(t))&&void 0!==l?l:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){this._data.delete(t)}))}}class ql{setData(t,i){return e(this,void 0,void 0,(function*(){sessionStorage.setItem(t,i)}))}getData(t){var i;return e(this,void 0,void 0,(function*(){return null!==(i=sessionStorage.getItem(t))&&void 0!==i?i:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){sessionStorage.removeItem(t)}))}}const $l=i=>e(void 0,void 0,void 0,(function*(){var l;const n=(e=>{switch(e){case t.Storage.LocalStorage:return new Ol;case t.Storage.SessionStorage:return new ql;case t.Storage.BrowserMemory:return new _l;default:return new ql}})(i.storage),o=new Yl(n);yield o.initialize(i);const d=new Ql(o),c=o.getDataLayer(),a=jl((()=>e(void 0,void 0,void 0,(function*(){return o.signOut()}))),null!==(l=i.storage)&&void 0!==l?l:t.Storage.SessionStorage,(t=>c.setSessionDataParameter(Ce,null!=t?t:"")));let s=!1;const r=Dl.getInstance();let Z,u,b=!0;(null==r?void 0:r.init)&&(yield r.init(!0,(t=>e(void 0,void 0,void 0,(function*(){Object.assign({attachToken:!0},t).attachToken&&(t.headers=Object.assign(Object.assign({},t.headers),{Authorization:`Bearer ${yield o.getAccessToken()}`}))})))));const h=()=>e(void 0,void 0,void 0,(function*(){var t,i,l,n;const d=yield o.getOIDCServiceEndpoints(),s=yield c.getConfigData();a.initialize(s.clientID,null!==(t=d.checkSessionIframe)&&void 0!==t?t:"",(()=>e(void 0,void 0,void 0,(function*(){return(yield o.getBasicUserInfo()).sessionState}))),null!==(i=s.checkSessionInterval)&&void 0!==i?i:3,null!==(l=s.sessionRefreshInterval)&&void 0!==l?l:300,s.signInRedirectURL,null!==(n=d.authorizationEndpoint)&&void 0!==n?n:"",s.enablePKCE)})),m=t=>e(void 0,void 0,void 0,(function*(){var i,l,n;let a=!0,r=!1;const Z=yield c.getConfigData();if(null==t?void 0:t.tokenEndpoint){a=!1;for(const e of[...null!==(l=null===(i=yield c.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==l?l:[],null==Z?void 0:Z.serverOrigin])if(null===(n=t.tokenEndpoint)||void 0===n?void 0:n.startsWith(e)){r=!0;break}}return t.shouldReplayAfterRefresh&&c.setTemporaryDataParameter(Al,JSON.stringify(t)),a||r?o.requestCustomGrant(t).then((i=>e(void 0,void 0,void 0,(function*(){return t.preventSignOutURLUpdate&&(s=!0),t.returnsSession?(d.refreshAccessTokenAutomatically(),o.getBasicUserInfo()):i})))).catch((t=>Promise.reject(t))):Promise.reject(new Pl("MAIN_THREAD_CLIENT-RCG-IV01","main-thread-client","requestCustomGrant","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`"))})),I=()=>e(void 0,void 0,void 0,(function*(){try{yield o.refreshAccessToken();const t=yield G();return t&&(yield m(t)),d.refreshAccessTokenAutomatically(),o.getBasicUserInfo()}catch(t){return Promise.reject(t)}})),p=(i,l)=>e(void 0,void 0,void 0,(function*(){const n=yield c.getConfigData();if(n.storage===t.Storage.BrowserMemory&&n.enablePKCE){const t=Ml.getPKCE();yield o.setPKCECode(t)}return o.requestAccessToken(i,l).then((()=>e(void 0,void 0,void 0,(function*(){return Ml.setSignOutURL(yield o.getSignOutURL()),d.clearRefreshTokenTimeout(),d.refreshAccessTokenAutomatically(),n.enableOIDCSessionManagement&&h(),o.getBasicUserInfo()})))).catch((t=>Promise.reject(t)))})),G=()=>e(void 0,void 0,void 0,(function*(){const t=yield c.getTemporaryDataParameter(Al);return t?JSON.parse(t):null}));return{disableHttpHandler:()=>((null==r?void 0:r.disableHandler)&&r.disableHandler(),b=!1,!0),enableHttpHandler:()=>((null==r?void 0:r.enableHandler)&&r.enableHandler(),b=!0,!0),getAccessToken:()=>e(void 0,void 0,void 0,(function*(){return o.getAccessToken()})),getBasicUserInfo:()=>e(void 0,void 0,void 0,(function*(){return o.getBasicUserInfo()})),getDecodedIDToken:()=>e(void 0,void 0,void 0,(function*(){return o.getDecodedIDToken()})),getHttpClient:()=>r,getIDToken:()=>e(void 0,void 0,void 0,(function*(){return o.getIDToken()})),getOIDCServiceEndpoints:()=>e(void 0,void 0,void 0,(function*(){return o.getOIDCServiceEndpoints()})),httpRequest:t=>e(void 0,void 0,void 0,(function*(){var i,l;let n=!1;const o=yield c.getConfigData();for(const e of[...null!==(i=yield null==o?void 0:o.resourceServerURLs)&&void 0!==i?i:[],null==o?void 0:o.serverOrigin])if(null===(l=null==t?void 0:t.url)||void 0===l?void 0:l.startsWith(e)){n=!0;break}return n?r.request(t).then((t=>Promise.resolve(t))).catch((i=>e(void 0,void 0,void 0,(function*(){var e;if(401===(null===(e=null==i?void 0:i.response)||void 0===e?void 0:e.status)||!(null==i?void 0:i.response)){let e;try{e=yield I()}catch(t){return b&&("function"==typeof Z&&(yield Z(i)),"function"==typeof u&&u()),Promise.reject(new Pl("MAIN_THREAD_CLIENT-HR-ES01","main-thread-client","httpRequest","","",t))}if(e)try{const e=yield r.request(t);return Promise.resolve(e)}catch(t){return b&&("function"==typeof Z&&(yield Z(t)),"function"==typeof u&&u()),Promise.reject(t)}}return b&&("function"==typeof Z&&(yield Z(i)),"function"==typeof u&&u()),Promise.reject(i)})))):Promise.reject(new Pl("MAIN_THREAD_CLIENT-HR-IV02","main-thread-client","httpRequest","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))})),httpRequestAll:t=>e(void 0,void 0,void 0,(function*(){var i,l,n;let d=!0;const a=yield c.getConfigData();for(const e of t){let t=!1;for(const o of[...null!==(l=null===(i=yield a)||void 0===i?void 0:i.resourceServerURLs)&&void 0!==l?l:[],null==a?void 0:a.serverOrigin])if(null===(n=e.url)||void 0===n?void 0:n.startsWith(o)){t=!0;break}if(!t){d=!1;break}}const s=[];return d?(t.forEach((t=>{s.push(r.request(t))})),(null==r?void 0:r.all)&&r.all(s).then((t=>Promise.resolve(t))).catch((t=>e(void 0,void 0,void 0,(function*(){var i;if(401===(null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status)||!(null==t?void 0:t.response)){let i;try{i=yield o.refreshAccessToken()}catch(e){return b&&("function"==typeof Z&&(yield Z(t)),"function"==typeof u&&u()),Promise.reject(new Pl("MAIN_THREAD_CLIENT-HRA-ES01","main-thread-client","httpRequestAll","","",e))}if(i)return r.all&&r.all(s).then((t=>Promise.resolve(t))).catch((t=>e(void 0,void 0,void 0,(function*(){return b&&("function"==typeof Z&&(yield Z(t)),"function"==typeof u&&u()),Promise.reject(t)}))))}return b&&("function"==typeof Z&&(yield Z(t)),"function"==typeof u&&u()),Promise.reject(t)}))))):Promise.reject(new Pl("MAIN_THREAD_CLIENT-HRA-IV02","main-thread-client","httpRequest","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))})),isAuthenticated:()=>e(void 0,void 0,void 0,(function*(){return o.isAuthenticated()})),refreshAccessToken:I,requestCustomGrant:m,revokeAccessToken:()=>o.revokeAccessToken().then((()=>(a.reset(),d.clearRefreshTokenTimeout(),Promise.resolve(!0)))).catch((t=>Promise.reject(t))),setHttpRequestErrorCallback:t=>{Z=t},setHttpRequestFinishCallback:t=>{(null==r?void 0:r.setHttpRequestFinishCallback)&&r.setHttpRequestFinishCallback(t),u=t},setHttpRequestStartCallback:t=>{(null==r?void 0:r.setHttpRequestStartCallback)&&r.setHttpRequestStartCallback(t)},setHttpRequestSuccessCallback:t=>{(null==r?void 0:r.setHttpRequestSuccessCallback)&&r.setHttpRequestSuccessCallback(t)},signIn:(i,l,n)=>e(void 0,void 0,void 0,(function*(){var s,r;const Z=yield c.getConfigData(),u=yield a.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){yield c.setSessionDataParameter(Ce,null!=t?t:"")}))));if(u)return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(yield o.isAuthenticated())return d.clearRefreshTokenTimeout(),d.refreshAccessTokenAutomatically(),Z.enableOIDCSessionManagement&&h(),Promise.resolve(yield o.getBasicUserInfo());let b,m;if((null==Z?void 0:Z.responseMode)===t.ResponseMode.formPost&&l?(b=l,m=null!=n?n:""):(b=null!==(s=new URL(window.location.href).searchParams.get(We))&&void 0!==s?s:"",m=null!==(r=new URL(window.location.href).searchParams.get(Ce))&&void 0!==r?r:"",Ml.removeAuthorizationCode()),b)return p(b,m);const I=new URL(window.location.href).searchParams.get(Fl),G=new URL(window.location.href).searchParams.get(zl);if(I){const t=new URL(window.location.href);return t.searchParams.delete(Fl),t.searchParams.delete(zl),history.pushState(null,document.title,t.toString()),Promise.reject(new Pl("MAIN_THREAD_CLIENT-SI-BE","main-thread-client","signIn",I,null!=G?G:""))}return o.getAuthorizationURL(i).then((i=>e(void 0,void 0,void 0,(function*(){return Z.storage===t.Storage.BrowserMemory&&Z.enablePKCE&&Ml.setPKCE(yield o.getPKCECode()),location.href=i,yield Ml.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))})),signOut:()=>e(void 0,void 0,void 0,(function*(){return(yield o.isAuthenticated())&&!s?location.href=yield o.signOut():(location.href=Ml.getSignOutURL(),yield c.removeOIDCProviderMetaData(),yield c.removeTemporaryData(),yield c.removeSessionData()),d.clearRefreshTokenTimeout(),yield Ml.waitTillPageRedirect(),!0})),trySignInSilently:()=>e(void 0,void 0,void 0,(function*(){var i;const l=yield c.getConfigData();if(Ml.isInitializedSilentSignIn())return yield a.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const n=document.getElementById(Ul),d=null===(i=null==n?void 0:n.contentDocument)||void 0===i?void 0:i.getElementById(Tl);try{const e=yield o.getAuthorizationURL({prompt:"none",state:Bl}),i=new URL(e);i.searchParams.set("response_mode","query");const n=i.toString();l.storage===t.Storage.BrowserMemory&&l.enablePKCE&&Ml.setPKCE(yield o.getPKCECode()),d.src=n}catch(t){return Promise.reject(t)}return new Promise(((t,i)=>{const l=setTimeout((()=>{t(!1)}),1e4),n=o=>e(void 0,void 0,void 0,(function*(){var e,d;const c=o.data;(null==c?void 0:c.type)==Nl&&(window.removeEventListener("message",n),clearTimeout(l),t(!1)),(null==c?void 0:c.type)==Jl&&(null===(e=null==c?void 0:c.data)||void 0===e?void 0:e.code)&&p(c.data.code,null===(d=null==c?void 0:c.data)||void 0===d?void 0:d.sessionState).then((e=>{window.removeEventListener("message",n),t(e)})).catch((t=>{window.removeEventListener("message",n),i(t)})).finally((()=>{clearTimeout(l)}))}));window.addEventListener("message",n)}))})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield c.getConfigData(),i=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),l=Object.assign(Object.assign({},e),t);yield o.updateConfig(l),l.enableOIDCSessionManagement&&i&&(a.reset(),h())}))}}));function tn(t,e,i){var l=void 0===e?null:e,n=function(t,e){var i=atob(t);if(e){for(var l=new Uint8Array(i.length),n=0,o=i.length;n<o;++n)l[n]=i.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(l.buffer))}return i}(t,void 0!==i&&i),o=n.indexOf("\n",10)+1,d=n.substring(o)+(l?"//# sourceMappingURL="+l:""),c=new Blob([d],{type:"application/javascript"});return URL.createObjectURL(c)}var en,ln,nn,on,dn=(en="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gZShlLHQscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXt1KG4ubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7dShuLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiB1KGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIHI/dDpuZXcgcigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfXUoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX12YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LHI9W10sbj1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LG89ITE7ZnVuY3Rpb24gcygpe289ITA7Zm9yKHZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix0PTAsaT1lLmxlbmd0aDt0PGk7Kyt0KXJbdF09ZVt0XSxuW2UuY2hhckNvZGVBdCh0KV09dDtuWyItIi5jaGFyQ29kZUF0KDApXT02MixuWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBhKGUsdCxuKXtmb3IodmFyIGksbyxzPVtdLGE9dDthPG47YSs9MylpPShlW2FdPDwxNikrKGVbYSsxXTw8OCkrZVthKzJdLHMucHVzaChyWyhvPWkpPj4xOCY2M10rcltvPj4xMiY2M10rcltvPj42JjYzXStyWzYzJm9dKTtyZXR1cm4gcy5qb2luKCIiKX1mdW5jdGlvbiB1KGUpe3ZhciB0O298fHMoKTtmb3IodmFyIG49ZS5sZW5ndGgsaT1uJTMsdT0iIixjPVtdLGg9MTYzODMsbD0wLGY9bi1pO2w8ZjtsKz1oKWMucHVzaChhKGUsbCxsK2g+Zj9mOmwraCkpO3JldHVybiAxPT09aT8odD1lW24tMV0sdSs9clt0Pj4yXSx1Kz1yW3Q8PDQmNjNdLHUrPSI9PSIpOjI9PT1pJiYodD0oZVtuLTJdPDw4KStlW24tMV0sdSs9clt0Pj4xMF0sdSs9clt0Pj40JjYzXSx1Kz1yW3Q8PDImNjNdLHUrPSI9IiksYy5wdXNoKHUpLGMuam9pbigiIil9ZnVuY3Rpb24gYyhlLHQscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1yP2ktMTowLGY9cj8tMToxLGQ9ZVt0K2xdO2ZvcihsKz1mLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPWE7aD4wO289MjU2Km8rZVt0K2xdLGwrPWYsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO3M9MjU2KnMrZVt0K2xdLGwrPWYsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihkPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09Y31yZXR1cm4oZD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiBoKGUsdCxyLG4saSxvKXt2YXIgcyxhLHUsYz04Km8taS0xLGg9KDE8PGMpLTEsbD1oPj4xLGY9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxkPW4/MDpvLTEscD1uPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9aCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSwodCs9cytsPj0xP2YvdTpmKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKHMrKyx1Lz0yKSxzK2w+PWg/KGE9MCxzPWgpOnMrbD49MT8oYT0odCp1LTEpKk1hdGgucG93KDIsaSkscys9bCk6KGE9dCpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O2VbcitkXT0yNTUmYSxkKz1wLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsYys9aTtjPjA7ZVtyK2RdPTI1NSZzLGQrPXAscy89MjU2LGMtPTgpO2VbcitkLXBdfD0xMjgqZ312YXIgbD17fS50b1N0cmluZyxmPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWwuY2FsbChlKX07ZnVuY3Rpb24gZCgpe3JldHVybiBnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHAoZSx0KXtpZihkKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gZy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Zy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgZyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBnKGUsdCxyKXtpZighKGcuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGcpKXJldHVybiBuZXcgZyhlLHQscik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBtKHRoaXMsZSl9cmV0dXJuIHYodGhpcyxlLHQscil9ZnVuY3Rpb24gdihlLHQscixuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQscixuKXtpZih0LmJ5dGVMZW5ndGgscjwwfHx0LmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQscik6bmV3IFVpbnQ4QXJyYXkodCxyLG4pO2cuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189Zy5wcm90b3R5cGU6ZT13KGUsdCk7cmV0dXJuIGV9KGUsdCxyLG4pOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIWcuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfGsodCxyKSxpPShlPXAoZSxuKSkud3JpdGUodCxyKTtpIT09biYmKGU9ZS5zbGljZSgwLGkpKTtyZXR1cm4gZX0oZSx0LHIpOmZ1bmN0aW9uKGUsdCl7aWYoXyh0KSl7dmFyIHI9MHxiKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPXAoZSxyKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsciksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KG49dC5sZW5ndGgpIT1uP3AoZSwwKTp3KGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmYodC5kYXRhKSlyZXR1cm4gdyhlLHQuZGF0YSl9dmFyIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIHkoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBtKGUsdCl7aWYoeSh0KSxlPXAoZSx0PDA/MDowfGIodCkpLCFnLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjx0OysrcillW3JdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gdyhlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfGIodC5sZW5ndGgpO2U9cChlLHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKWVbbl09MjU1JnRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gYihlKXtpZihlPj1kKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2QoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gXyhlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24gayhlLHQpe2lmKF8oZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciByPWUubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuICQoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBHKGUpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuICQoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gUyhlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiB4KHRoaXMsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBNKHRoaXMsdCxyKTtjYXNlImFzY2lpIjpyZXR1cm4gSCh0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gaih0aGlzLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBVKHRoaXMsdCxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIHEodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gRShlLHQscil7dmFyIG49ZVt0XTtlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIFQoZSx0LHIsbixpKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6ZS5sZW5ndGgtMSkscjwwJiYocj1lLmxlbmd0aCtyKSxyPj1lLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPWUubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWcuZnJvbSh0LG4pKSxfKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6QShlLHQscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGcuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOkEoZSxbdF0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIEEoZSx0LHIsbixpKXt2YXIgbyxzPTEsYT1lLmxlbmd0aCx1PXQubGVuZ3RoO2lmKHZvaWQgMCE9PW4mJigidWNzMiI9PT0obj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1ufHwidXRmMTZsZSI9PT1ufHwidXRmLTE2bGUiPT09bikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsdS89MixyLz0yfWZ1bmN0aW9uIGMoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKGkpe3ZhciBoPS0xO2ZvcihvPXI7bzxhO28rKylpZihjKGUsbyk9PT1jKHQsLTE9PT1oPzA6by1oKSl7aWYoLTE9PT1oJiYoaD1vKSxvLWgrMT09PXUpcmV0dXJuIGgqc31lbHNlLTEhPT1oJiYoby09by1oKSxoPS0xfWVsc2UgZm9yKHIrdT5hJiYocj1hLXUpLG89cjtvPj0wO28tLSl7Zm9yKHZhciBsPSEwLGY9MDtmPHU7ZisrKWlmKGMoZSxvK2YpIT09Yyh0LGYpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gUihlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gQyhlLHQscixuKXtyZXR1cm4gWCgkKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFAoZSx0LHIsbil7cmV0dXJuIFgoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLHI9MDtyPGUubGVuZ3RoOysrcil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChyKSk7cmV0dXJuIHR9KHQpLGUscixuKX1mdW5jdGlvbiBEKGUsdCxyLG4pe3JldHVybiBQKGUsdCxyLG4pfWZ1bmN0aW9uIE8oZSx0LHIsbil7cmV0dXJuIFgoRyh0KSxlLHIsbil9ZnVuY3Rpb24gSShlLHQscixuKXtyZXR1cm4gWChmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFUoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP3UoZSk6dShlLnNsaWNlKHQscikpfWZ1bmN0aW9uIE0oZSx0LHIpe3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9dDtpPHI7KXt2YXIgbyxzLGEsdSxjPWVbaV0saD1udWxsLGw9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihpK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpjPDEyOCYmKGg9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz1lW2krMV0pKSYmKHU9KDMxJmMpPDw2fDYzJm8pPjEyNyYmKGg9dSk7YnJlYWs7Y2FzZSAzOm89ZVtpKzFdLHM9ZVtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDEyfCg2MyZvKTw8Nnw2MyZzKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihoPXUpO2JyZWFrO2Nhc2UgNDpvPWVbaSsxXSxzPWVbaSsyXSxhPWVbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZ1PDExMTQxMTImJihoPXUpfW51bGw9PT1oPyhoPTY1NTMzLGw9MSk6aD42NTUzNSYmKGgtPTY1NTM2LG4ucHVzaChoPj4+MTAmMTAyM3w1NTI5NiksaD01NjMyMHwxMDIzJmgpLG4ucHVzaChoKSxpKz1sfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1MKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgcj0iIixuPTA7Zm9yKDtuPHQ7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UobixuKz1MKSk7cmV0dXJuIHJ9KG4pfWcuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT10LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHQuVFlQRURfQVJSQVlfU1VQUE9SVCxnLnBvb2xTaXplPTgxOTIsZy5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189Zy5wcm90b3R5cGUsZX0sZy5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdihudWxsLGUsdCxyKX0sZy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoZy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLGcuX19wcm90b19fPVVpbnQ4QXJyYXkpLGcuYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBmdW5jdGlvbihlLHQscixuKXtyZXR1cm4geSh0KSx0PD0wP3AoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9wKGUsdCkuZmlsbChyLG4pOnAoZSx0KS5maWxsKHIpOnAoZSx0KX0obnVsbCxlLHQscil9LGcuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG0obnVsbCxlKX0sZy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIG0obnVsbCxlKX0sZy5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fFooZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmWihlLnNsaWNlKDAsMCkpfShlKSl9LGcuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFfKGUpfHwhXyh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtyPWVbaV0sbj10W2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sZy5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxnLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGcuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09dClmb3IodD0wLHI9MDtyPGUubGVuZ3RoOysrcil0Kz1lW3JdLmxlbmd0aDt2YXIgbj1nLmFsbG9jVW5zYWZlKHQpLGk9MDtmb3Iocj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbz1lW3JdO2lmKCFfKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sZy5ieXRlTGVuZ3RoPWssZy5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGcucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9MilFKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpRSh0aGlzLHQsdCszKSxFKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9LGcucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClFKHRoaXMsdCx0KzcpLEUodGhpcyx0KzEsdCs2KSxFKHRoaXMsdCsyLHQrNSksRSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1lPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP00odGhpcywwLGUpOlMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxnLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIV8oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PWcuY29tcGFyZSh0aGlzLGUpfSxnLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LGcucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZighXyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09ciYmKHI9ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxyPmUubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJnQ+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZih0Pj1yKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixpKSxjPWUuc2xpY2UodCxyKSxoPTA7aDxhOysraClpZih1W2hdIT09Y1toXSl7bz11W2hdLHM9Y1toXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LGcucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihlLHQscil9LGcucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBUKHRoaXMsZSx0LHIsITApfSxnLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQscil7cmV0dXJuIFQodGhpcyxlLHQsciwhMSl9LGcucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHZvaWQgMD09PXQpbj0idXRmOCIscj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIHQpbj10LHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLGUubGVuZ3RoPjAmJihyPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBSKHRoaXMsZSx0LHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIEModGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIFAodGhpcyxlLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gRCh0aGlzLGUsdCxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE8odGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBJKHRoaXMsZSx0LHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LGcucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIEw9NDA5NjtmdW5jdGlvbiBIKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gaihlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGk9dDtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24geChlLHQscil7dmFyIG49ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPSIiLG89dDtvPHI7KytvKWkrPVYoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gcShlLHQscil7Zm9yKHZhciBuPWUuc2xpY2UodCxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIEIoZSx0LHIpe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE4oZSx0LHIsbixpLG8pe2lmKCFfKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZih0Pml8fHQ8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBLKGUsdCxyLG4pe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLXIsMik7aTxvOysraSllW3IraV09KHQmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBGKGUsdCxyLG4pe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciw0KTtpPG87KytpKWVbcitpXT10Pj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIFkoZSx0LHIsbixpLG8pe2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBXKGUsdCxyLG4saSl7cmV0dXJuIGl8fFkoZSwwLHIsNCksaChlLHQscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBKKGUsdCxyLG4saSl7cmV0dXJuIGl8fFkoZSwwLHIsOCksaChlLHQscixuLDUyLDgpLHIrOH1nLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLCh0PXZvaWQgMD09PXQ/bjp+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksdDxlJiYodD1lKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189Zy5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgZyhpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbytlXX1yZXR1cm4gcn0sZy5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQscil7ZXw9MCx0fD0wLHJ8fEIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LGcucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxCKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZSstLXRdLGk9MTt0PjAmJihpKj0yNTYpOyluKz10aGlzW2UrLS10XSppO3JldHVybiBufSxnLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8QihlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LGcucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxCKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LGcucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxCKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LGcucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxCKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sZy5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEIoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxnLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxCKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KW4rPXRoaXNbZStvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCp0KSksbn0sZy5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8QihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10LGk9MSxvPXRoaXNbZSstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSxnLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxCKGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LGcucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8QihlLDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxnLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fEIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sZy5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8QihlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sZy5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8QihlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sZy5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8QihlLDQsdGhpcy5sZW5ndGgpLGModGhpcyxlLCEwLDIzLDQpfSxnLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxCKGUsNCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITEsMjMsNCl9LGcucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxCKGUsOCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITAsNTIsOCl9LGcucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxCKGUsOCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITEsNTIsOCl9LGcucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8Tih0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxyJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrcn0sZy5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7KGU9K2UsdHw9MCxyfD0wLG4pfHxOKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28mMjU1O3JldHVybiB0K3J9LGcucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8Tih0aGlzLGUsdCwxLDI1NSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxnLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fE4odGhpcyxlLHQsMiw2NTUzNSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpLKHRoaXMsZSx0LCEwKSx0KzJ9LGcucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8Tih0aGlzLGUsdCwyLDY1NTM1LDApLGcuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOksodGhpcyxlLHQsITEpLHQrMn0sZy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxOKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6Rih0aGlzLGUsdCwhMCksdCs0fSxnLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fE4odGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGcuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTpGKHRoaXMsZSx0LCExKSx0KzR9LGcucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LHIsbil7aWYoZT0rZSx0fD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtOKHRoaXMsZSx0LHIsaS0xLC1pKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPHImJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28tMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtyfSxnLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7Tih0aGlzLGUsdCxyLGktMSwtaSl9dmFyIG89ci0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28rMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtyfSxnLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8Tih0aGlzLGUsdCwxLDEyNywtMTI4KSxnLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGcucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxOKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpLKHRoaXMsZSx0LCEwKSx0KzJ9LGcucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxOKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpLKHRoaXMsZSx0LCExKSx0KzJ9LGcucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxOKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOkYodGhpcyxlLHQsITApLHQrNH0sZy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fE4odGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6Rih0aGlzLGUsdCwhMSksdCs0fSxnLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBXKHRoaXMsZSx0LCEwLHIpfSxnLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBXKHRoaXMsZSx0LCExLHIpfSxnLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gSih0aGlzLGUsdCwhMCxyKX0sZy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIEoodGhpcyxlLHQsITEscil9LGcucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PG4tciYmKG49ZS5sZW5ndGgtdCtyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09ZSYmcjx0JiZ0PG4pZm9yKGk9by0xO2k+PTA7LS1pKWVbaSt0XT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IWcuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpZVtpK3RdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShyLHIrbyksdCk7cmV0dXJuIG99LGcucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KG49dCx0PTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIGk9ZS5jaGFyQ29kZUF0KDApO2k8MjU2JiYoZT1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIWcuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9dClyZXR1cm4gdGhpczt2YXIgbztpZih0Pj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobz10O288cjsrK28pdGhpc1tvXT1lO2Vsc2V7dmFyIHM9XyhlKT9lOiQobmV3IGcoZSxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLXQ7KytvKXRoaXNbbyt0XT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciB6PS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIFYoZSl7cmV0dXJuIGU8MTY/IjAiK2UudG9TdHJpbmcoMTYpOmUudG9TdHJpbmcoMTYpfWZ1bmN0aW9uICQoZSx0KXt2YXIgcjt0PXR8fDEvMDtmb3IodmFyIG49ZS5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigodC09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIEcoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LHIsYSx1LGMsaDtvfHxzKCk7dmFyIGw9ZS5sZW5ndGg7aWYobCU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7Yz0iPSI9PT1lW2wtMl0/MjoiPSI9PT1lW2wtMV0/MTowLGg9bmV3IGkoMypsLzQtYyksYT1jPjA/bC00Omw7dmFyIGY9MDtmb3IodD0wLHI9MDt0PGE7dCs9NCxyKz0zKXU9bltlLmNoYXJDb2RlQXQodCldPDwxOHxuW2UuY2hhckNvZGVBdCh0KzEpXTw8MTJ8bltlLmNoYXJDb2RlQXQodCsyKV08PDZ8bltlLmNoYXJDb2RlQXQodCszKV0saFtmKytdPXU+PjE2JjI1NSxoW2YrK109dT4+OCYyNTUsaFtmKytdPTI1NSZ1O3JldHVybiAyPT09Yz8odT1uW2UuY2hhckNvZGVBdCh0KV08PDJ8bltlLmNoYXJDb2RlQXQodCsxKV0+PjQsaFtmKytdPTI1NSZ1KToxPT09YyYmKHU9bltlLmNoYXJDb2RlQXQodCldPDwxMHxuW2UuY2hhckNvZGVBdCh0KzEpXTw8NHxuW2UuY2hhckNvZGVBdCh0KzIpXT4+MixoW2YrK109dT4+OCYyNTUsaFtmKytdPTI1NSZ1KSxofShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKHosIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIFgoZSx0LHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49dC5sZW5ndGh8fGk+PWUubGVuZ3RoKTsrK2kpdFtpK3JdPWVbaV07cmV0dXJuIGl9ZnVuY3Rpb24gWihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciBRPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciByPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxuPTA7bjxyLmxlbmd0aDtuKyspcltuXT1hcmd1bWVudHNbbl07cmV0dXJuIGUuYXBwbHkodCxyKX19LGVlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gdGUoZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PWVlLmNhbGwoZSl9ZnVuY3Rpb24gcmUoZSl7cmV0dXJuIHZvaWQgMD09PWV9ZnVuY3Rpb24gbmUoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9ZnVuY3Rpb24gaWUoZSl7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1lZS5jYWxsKGUpKXJldHVybiExO3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PXR8fHQ9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIG9lKGUpe3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1lZS5jYWxsKGUpfWZ1bmN0aW9uIHNlKGUsdCl7aWYobnVsbCE9ZSlpZigib2JqZWN0IiE9dHlwZW9mIGUmJihlPVtlXSksdGUoZSkpZm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXQuY2FsbChudWxsLGVbcl0scixlKTtlbHNlIGZvcih2YXIgaSBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiZ0LmNhbGwobnVsbCxlW2ldLGksZSl9dmFyIGFlPXtpc0FycmF5OnRlLGlzQXJyYXlCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PWVlLmNhbGwoZSl9LGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIXJlKGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIXJlKGUuY29uc3RydWN0b3IpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX0saXNGb3JtRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEZvcm1EYXRhJiZlIGluc3RhbmNlb2YgRm9ybURhdGF9LGlzQXJyYXlCdWZmZXJWaWV3OmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldz9BcnJheUJ1ZmZlci5pc1ZpZXcoZSk6ZSYmZS5idWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ9LGlzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSxpc09iamVjdDpuZSxpc1BsYWluT2JqZWN0OmllLGlzVW5kZWZpbmVkOnJlLGlzRGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1lZS5jYWxsKGUpfSxpc0ZpbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRmlsZV0iPT09ZWUuY2FsbChlKX0saXNCbG9iOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEJsb2JdIj09PWVlLmNhbGwoZSl9LGlzRnVuY3Rpb246b2UsaXNTdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIG5lKGUpJiZvZShlLnBpcGUpfSxpc1VSTFNlYXJjaFBhcmFtczpmdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIFVSTFNlYXJjaFBhcmFtcyYmZSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtc30saXNTdGFuZGFyZEJyb3dzZXJFbnY6ZnVuY3Rpb24oKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuYXZpZ2F0b3J8fCJSZWFjdE5hdGl2ZSIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5hdGl2ZVNjcmlwdCIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5TIiE9PW5hdmlnYXRvci5wcm9kdWN0KSYmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KX0sZm9yRWFjaDpzZSxtZXJnZTpmdW5jdGlvbiBlKCl7dmFyIHQ9e307ZnVuY3Rpb24gcihyLG4pe2llKHRbbl0pJiZpZShyKT90W25dPWUodFtuXSxyKTppZShyKT90W25dPWUoe30scik6dGUocik/dFtuXT1yLnNsaWNlKCk6dFtuXT1yfWZvcih2YXIgbj0wLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKXNlKGFyZ3VtZW50c1tuXSxyKTtyZXR1cm4gdH0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gc2UodCwoZnVuY3Rpb24odCxuKXtlW25dPXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0P1EodCxyKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfX07ZnVuY3Rpb24gdWUoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIGNlPWZ1bmN0aW9uKGUsdCxyKXtpZighdClyZXR1cm4gZTt2YXIgbjtpZihyKW49cih0KTtlbHNlIGlmKGFlLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIGk9W107YWUuZm9yRWFjaCh0LChmdW5jdGlvbihlLHQpe251bGwhPWUmJihhZS5pc0FycmF5KGUpP3QrPSJbXSI6ZT1bZV0sYWUuZm9yRWFjaChlLChmdW5jdGlvbihlKXthZS5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6YWUuaXNPYmplY3QoZSkmJihlPUpTT04uc3RyaW5naWZ5KGUpKSxpLnB1c2godWUodCkrIj0iK3VlKGUpKX0pKSl9KSksbj1pLmpvaW4oIiYiKX1pZihuKXt2YXIgbz1lLmluZGV4T2YoIiMiKTstMSE9PW8mJihlPWUuc2xpY2UoMCxvKSksZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrbn1yZXR1cm4gZX07ZnVuY3Rpb24gaGUoKXt0aGlzLmhhbmRsZXJzPVtdfWhlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goe2Z1bGZpbGxlZDplLHJlamVjdGVkOnQsc3luY2hyb25vdXM6ISFyJiZyLnN5bmNocm9ub3VzLHJ1bldoZW46cj9yLnJ1bldoZW46bnVsbH0pLHRoaXMuaGFuZGxlcnMubGVuZ3RoLTF9LGhlLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0saGUucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7YWUuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLChmdW5jdGlvbih0KXtudWxsIT09dCYmZSh0KX0pKX07dmFyIGxlPWhlO2Z1bmN0aW9uIGZlKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gZGUoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBwZT1mZSxnZT1kZTtmdW5jdGlvbiB2ZShlKXtpZihwZT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigocGU9PT1mZXx8IXBlKSYmc2V0VGltZW91dClyZXR1cm4gcGU9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiBwZShlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gcGUuY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIHBlLmNhbGwodGhpcyxlLDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIHQuc2V0VGltZW91dCYmKHBlPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmNsZWFyVGltZW91dCYmKGdlPWNsZWFyVGltZW91dCk7dmFyIHllLG1lPVtdLHdlPSExLGJlPS0xO2Z1bmN0aW9uIF9lKCl7d2UmJnllJiYod2U9ITEseWUubGVuZ3RoP21lPXllLmNvbmNhdChtZSk6YmU9LTEsbWUubGVuZ3RoJiZrZSgpKX1mdW5jdGlvbiBrZSgpe2lmKCF3ZSl7dmFyIGU9dmUoX2UpO3dlPSEwO2Zvcih2YXIgdD1tZS5sZW5ndGg7dDspe2Zvcih5ZT1tZSxtZT1bXTsrK2JlPHQ7KXllJiZ5ZVtiZV0ucnVuKCk7YmU9LTEsdD1tZS5sZW5ndGh9eWU9bnVsbCx3ZT0hMSxmdW5jdGlvbihlKXtpZihnZT09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChnZT09PWRlfHwhZ2UpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGdlPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e2dlKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gZ2UuY2FsbChudWxsLGUpfWNhdGNoKHQpe3JldHVybiBnZS5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIFNlKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9U2UucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIEVlKCl7fXZhciBUZT1FZSxBZT1FZSxSZT1FZSxDZT1FZSxQZT1FZSxEZT1FZSxPZT1FZTt2YXIgSWU9dC5wZXJmb3JtYW5jZXx8e30sVWU9SWUubm93fHxJZS5tb3pOb3d8fEllLm1zTm93fHxJZS5vTm93fHxJZS53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBNZT1uZXcgRGF0ZTt2YXIgTGU9e25leHRUaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXRbci0xXT1hcmd1bWVudHNbcl07bWUucHVzaChuZXcgU2UoZSx0KSksMSE9PW1lLmxlbmd0aHx8d2V8fHZlKGtlKX0sdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjpUZSxhZGRMaXN0ZW5lcjpBZSxvbmNlOlJlLG9mZjpDZSxyZW1vdmVMaXN0ZW5lcjpQZSxyZW1vdmVBbGxMaXN0ZW5lcnM6RGUsZW1pdDpPZSxiaW5kaW5nOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9LjAwMSpVZS5jYWxsKEllKSxyPU1hdGguZmxvb3IodCksbj1NYXRoLmZsb29yKHQlMSoxZTkpO3JldHVybiBlJiYoci09ZVswXSwobi09ZVsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1NZSkvMWUzfX0sSGU9TGUsamU9ZnVuY3Rpb24oZSx0KXthZS5mb3JFYWNoKGUsKGZ1bmN0aW9uKHIsbil7biE9PXQmJm4udG9VcHBlckNhc2UoKT09PXQudG9VcHBlckNhc2UoKSYmKGVbdF09cixkZWxldGUgZVtuXSl9KSl9LHhlPWZ1bmN0aW9uKGUsdCxyLG4saSl7cmV0dXJuIGUuY29uZmlnPXQsciYmKGUuY29kZT1yKSxlLnJlcXVlc3Q9bixlLnJlc3BvbnNlPWksZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGV9fSxlfSxxZT1mdW5jdGlvbihlLHQscixuLGkpe3ZhciBvPW5ldyBFcnJvcihlKTtyZXR1cm4geGUobyx0LHIsbixpKX0sQmU9YWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT97d3JpdGU6ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3ZhciBzPVtdO3MucHVzaChlKyI9IitlbmNvZGVVUklDb21wb25lbnQodCkpLGFlLmlzTnVtYmVyKHIpJiZzLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShyKS50b0dNVFN0cmluZygpKSxhZS5pc1N0cmluZyhuKSYmcy5wdXNoKCJwYXRoPSIrbiksYWUuaXNTdHJpbmcoaSkmJnMucHVzaCgiZG9tYWluPSIraSksITA9PT1vJiZzLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1zLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK2UrIik9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoZSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZTpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxyZW1vdmU6ZnVuY3Rpb24oKXt9fSxOZT1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLEtlPWFlLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXt2YXIgZSx0PS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gbihlKXt2YXIgbj1lO3JldHVybiB0JiYoci5zZXRBdHRyaWJ1dGUoImhyZWYiLG4pLG49ci5ocmVmKSxyLnNldEF0dHJpYnV0ZSgiaHJlZiIsbikse2hyZWY6ci5ocmVmLHByb3RvY29sOnIucHJvdG9jb2w/ci5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6ci5ob3N0LHNlYXJjaDpyLnNlYXJjaD9yLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCIiKToiIixoYXNoOnIuaGFzaD9yLmhhc2gucmVwbGFjZSgvXiMvLCIiKToiIixob3N0bmFtZTpyLmhvc3RuYW1lLHBvcnQ6ci5wb3J0LHBhdGhuYW1lOiIvIj09PXIucGF0aG5hbWUuY2hhckF0KDApP3IucGF0aG5hbWU6Ii8iK3IucGF0aG5hbWV9fXJldHVybiBlPW4od2luZG93LmxvY2F0aW9uLmhyZWYpLGZ1bmN0aW9uKHQpe3ZhciByPWFlLmlzU3RyaW5nKHQpP24odCk6dDtyZXR1cm4gci5wcm90b2NvbD09PWUucHJvdG9jb2wmJnIuaG9zdD09PWUuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe3ZhciBuPWUuZGF0YSxpPWUuaGVhZGVycyxvPWUucmVzcG9uc2VUeXBlO2FlLmlzRm9ybURhdGEobikmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgcz1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgYT1lLmF1dGgudXNlcm5hbWV8fCIiLHU9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShhKyI6Iit1KX12YXIgYyxoLGw9KGM9ZS5iYXNlVVJMLGg9ZS51cmwsYyYmIS9eKFthLXpdW2EtelxkXCtcLVwuXSo6KT9cL1wvL2kudGVzdChoKT9mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfShjLGgpOmgpO2Z1bmN0aW9uIGYoKXtpZihzKXt2YXIgbj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIHM/ZnVuY3Rpb24oZSl7dmFyIHQscixuLGk9e307cmV0dXJuIGU/KGFlLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PWFlLnRyaW0oZS5zdWJzdHIoMCxuKSkudG9Mb3dlckNhc2UoKSxyPWFlLnRyaW0oZS5zdWJzdHIobisxKSksdCl7aWYoaVt0XSYmTmUuaW5kZXhPZih0KT49MClyZXR1cm47aVt0XT0ic2V0LWNvb2tpZSI9PT10PyhpW3RdP2lbdF06W10pLmNvbmNhdChbcl0pOmlbdF0/aVt0XSsiLCAiK3I6cn19KSksaSk6aX0ocy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk6bnVsbCxpPXtkYXRhOm8mJiJ0ZXh0IiE9PW8mJiJqc29uIiE9PW8/cy5yZXNwb25zZTpzLnJlc3BvbnNlVGV4dCxzdGF0dXM6cy5zdGF0dXMsc3RhdHVzVGV4dDpzLnN0YXR1c1RleHQsaGVhZGVyczpuLGNvbmZpZzplLHJlcXVlc3Q6c307IWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1yLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztyLnN0YXR1cyYmbiYmIW4oci5zdGF0dXMpP3QocWUoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIityLnN0YXR1cyxyLmNvbmZpZyxudWxsLHIucmVxdWVzdCxyKSk6ZShyKX0odCxyLGkpLHM9bnVsbH19aWYocy5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksY2UobCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxzLnRpbWVvdXQ9ZS50aW1lb3V0LCJvbmxvYWRlbmQiaW4gcz9zLm9ubG9hZGVuZD1mOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7cyYmND09PXMucmVhZHlTdGF0ZSYmKDAhPT1zLnN0YXR1c3x8cy5yZXNwb25zZVVSTCYmMD09PXMucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKSkmJnNldFRpbWVvdXQoZil9LHMub25hYm9ydD1mdW5jdGlvbigpe3MmJihyKHFlKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIscykpLHM9bnVsbCl9LHMub25lcnJvcj1mdW5jdGlvbigpe3IocWUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCxzKSkscz1udWxsfSxzLm9udGltZW91dD1mdW5jdGlvbigpe3ZhciB0PSJ0aW1lb3V0IG9mICIrZS50aW1lb3V0KyJtcyBleGNlZWRlZCI7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYodD1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLHIocWUodCxlLGUudHJhbnNpdGlvbmFsJiZlLnRyYW5zaXRpb25hbC5jbGFyaWZ5VGltZW91dEVycm9yPyJFVElNRURPVVQiOiJFQ09OTkFCT1JURUQiLHMpKSxzPW51bGx9LGFlLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciBkPShlLndpdGhDcmVkZW50aWFsc3x8S2UobCkpJiZlLnhzcmZDb29raWVOYW1lP0JlLnJlYWQoZS54c3JmQ29va2llTmFtZSk6dm9pZCAwO2QmJihpW2UueHNyZkhlYWRlck5hbWVdPWQpfSJzZXRSZXF1ZXN0SGVhZGVyImluIHMmJmFlLmZvckVhY2goaSwoZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1uJiYiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKT9kZWxldGUgaVt0XTpzLnNldFJlcXVlc3RIZWFkZXIodCxlKX0pKSxhZS5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscyl8fChzLndpdGhDcmVkZW50aWFscz0hIWUud2l0aENyZWRlbnRpYWxzKSxvJiYianNvbiIhPT1vJiYocy5yZXNwb25zZVR5cGU9ZS5yZXNwb25zZVR5cGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmcy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MmJnMudXBsb2FkJiZzLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnByb21pc2UudGhlbigoZnVuY3Rpb24oZSl7cyYmKHMuYWJvcnQoKSxyKGUpLHM9bnVsbCl9KSksbnx8KG49bnVsbCkscy5zZW5kKG4pfSkpfSxZZT17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIFdlKGUsdCl7IWFlLmlzVW5kZWZpbmVkKGUpJiZhZS5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgSmUsemU9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjooKCJ1bmRlZmluZWQiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3R8fHZvaWQgMCE9PUhlJiYiW29iamVjdCBwcm9jZXNzXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoSGUpKSYmKEplPUZlKSxKZSksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gamUodCwiQWNjZXB0IiksamUodCwiQ29udGVudC1UeXBlIiksYWUuaXNGb3JtRGF0YShlKXx8YWUuaXNBcnJheUJ1ZmZlcihlKXx8YWUuaXNCdWZmZXIoZSl8fGFlLmlzU3RyZWFtKGUpfHxhZS5pc0ZpbGUoZSl8fGFlLmlzQmxvYihlKT9lOmFlLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOmFlLmlzVVJMU2VhcmNoUGFyYW1zKGUpPyhXZSh0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6YWUuaXNPYmplY3QoZSl8fHQmJiJhcHBsaWNhdGlvbi9qc29uIj09PXRbIkNvbnRlbnQtVHlwZSJdPyhXZSh0LCJhcHBsaWNhdGlvbi9qc29uIiksZnVuY3Rpb24oZSx0LHIpe2lmKGFlLmlzU3RyaW5nKGUpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoZSksYWUudHJpbShlKX1jYXRjaChlKXtpZigiU3ludGF4RXJyb3IiIT09ZS5uYW1lKXRocm93IGV9cmV0dXJuKHJ8fEpTT04uc3RyaW5naWZ5KShlKX0oZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWwscj10JiZ0LnNpbGVudEpTT05QYXJzaW5nLG49dCYmdC5mb3JjZWRKU09OUGFyc2luZyxpPSFyJiYianNvbiI9PT10aGlzLnJlc3BvbnNlVHlwZTtpZihpfHxuJiZhZS5pc1N0cmluZyhlKSYmZS5sZW5ndGgpdHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGUpe2lmKGkpe2lmKCJTeW50YXhFcnJvciI9PT1lLm5hbWUpdGhyb3cgeGUoZSx0aGlzLCJFX0pTT05fUEFSU0UiKTt0aHJvdyBlfX1yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfX07emUuaGVhZGVycz17Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fSxhZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCJdLChmdW5jdGlvbihlKXt6ZS5oZWFkZXJzW2VdPXt9fSkpLGFlLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7emUuaGVhZGVyc1tlXT1hZS5tZXJnZShZZSl9KSk7dmFyIFZlPXplLCRlPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj10aGlzfHxWZTtyZXR1cm4gYWUuZm9yRWFjaChyLChmdW5jdGlvbihyKXtlPXIuY2FsbChuLGUsdCl9KSksZX0sR2U9ZnVuY3Rpb24oZSl7cmV0dXJuISghZXx8IWUuX19DQU5DRUxfXyl9O2Z1bmN0aW9uIFhlKGUpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpfXZhciBaZT1mdW5jdGlvbihlKXtyZXR1cm4gWGUoZSksZS5oZWFkZXJzPWUuaGVhZGVyc3x8e30sZS5kYXRhPSRlLmNhbGwoZSxlLmRhdGEsZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVxdWVzdCksZS5oZWFkZXJzPWFlLm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksYWUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSwoZnVuY3Rpb24odCl7ZGVsZXRlIGUuaGVhZGVyc1t0XX0pKSwoZS5hZGFwdGVyfHxWZS5hZGFwdGVyKShlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gWGUoZSksdC5kYXRhPSRlLmNhbGwoZSx0LmRhdGEsdC5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIEdlKHQpfHwoWGUoZSksdCYmdC5yZXNwb25zZSYmKHQucmVzcG9uc2UuZGF0YT0kZS5jYWxsKGUsdC5yZXNwb25zZS5kYXRhLHQucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KHQpfSkpfSxRZT1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHI9e30sbj1bInVybCIsIm1ldGhvZCIsImRhdGEiXSxpPVsiaGVhZGVycyIsImF1dGgiLCJwcm94eSIsInBhcmFtcyJdLG89WyJiYXNlVVJMIiwidHJhbnNmb3JtUmVxdWVzdCIsInRyYW5zZm9ybVJlc3BvbnNlIiwicGFyYW1zU2VyaWFsaXplciIsInRpbWVvdXQiLCJ0aW1lb3V0TWVzc2FnZSIsIndpdGhDcmVkZW50aWFscyIsImFkYXB0ZXIiLCJyZXNwb25zZVR5cGUiLCJ4c3JmQ29va2llTmFtZSIsInhzcmZIZWFkZXJOYW1lIiwib25VcGxvYWRQcm9ncmVzcyIsIm9uRG93bmxvYWRQcm9ncmVzcyIsImRlY29tcHJlc3MiLCJtYXhDb250ZW50TGVuZ3RoIiwibWF4Qm9keUxlbmd0aCIsIm1heFJlZGlyZWN0cyIsInRyYW5zcG9ydCIsImh0dHBBZ2VudCIsImh0dHBzQWdlbnQiLCJjYW5jZWxUb2tlbiIsInNvY2tldFBhdGgiLCJyZXNwb25zZUVuY29kaW5nIl0scz1bInZhbGlkYXRlU3RhdHVzIl07ZnVuY3Rpb24gYShlLHQpe3JldHVybiBhZS5pc1BsYWluT2JqZWN0KGUpJiZhZS5pc1BsYWluT2JqZWN0KHQpP2FlLm1lcmdlKGUsdCk6YWUuaXNQbGFpbk9iamVjdCh0KT9hZS5tZXJnZSh7fSx0KTphZS5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fWZ1bmN0aW9uIHUobil7YWUuaXNVbmRlZmluZWQodFtuXSk/YWUuaXNVbmRlZmluZWQoZVtuXSl8fChyW25dPWEodm9pZCAwLGVbbl0pKTpyW25dPWEoZVtuXSx0W25dKX1hZS5mb3JFYWNoKG4sKGZ1bmN0aW9uKGUpe2FlLmlzVW5kZWZpbmVkKHRbZV0pfHwocltlXT1hKHZvaWQgMCx0W2VdKSl9KSksYWUuZm9yRWFjaChpLHUpLGFlLmZvckVhY2gobywoZnVuY3Rpb24obil7YWUuaXNVbmRlZmluZWQodFtuXSk/YWUuaXNVbmRlZmluZWQoZVtuXSl8fChyW25dPWEodm9pZCAwLGVbbl0pKTpyW25dPWEodm9pZCAwLHRbbl0pfSkpLGFlLmZvckVhY2gocywoZnVuY3Rpb24obil7biBpbiB0P3Jbbl09YShlW25dLHRbbl0pOm4gaW4gZSYmKHJbbl09YSh2b2lkIDAsZVtuXSkpfSkpO3ZhciBjPW4uY29uY2F0KGkpLmNvbmNhdChvKS5jb25jYXQocyksaD1PYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuLTE9PT1jLmluZGV4T2YoZSl9KSk7cmV0dXJuIGFlLmZvckVhY2goaCx1KSxyfSxldD17bmFtZToiYXhpb3MiLHZlcnNpb246IjAuMjEuNCIsZGVzY3JpcHRpb246IlByb21pc2UgYmFzZWQgSFRUUCBjbGllbnQgZm9yIHRoZSBicm93c2VyIGFuZCBub2RlLmpzIixtYWluOiJpbmRleC5qcyIsc2NyaXB0czp7dGVzdDoiZ3J1bnQgdGVzdCIsc3RhcnQ6Im5vZGUgLi9zYW5kYm94L3NlcnZlci5qcyIsYnVpbGQ6Ik5PREVfRU5WPXByb2R1Y3Rpb24gZ3J1bnQgYnVpbGQiLHByZXZlcnNpb246Im5wbSB0ZXN0Iix2ZXJzaW9uOiJucG0gcnVuIGJ1aWxkICYmIGdydW50IHZlcnNpb24gJiYgZ2l0IGFkZCAtQSBkaXN0ICYmIGdpdCBhZGQgQ0hBTkdFTE9HLm1kIGJvd2VyLmpzb24gcGFja2FnZS5qc29uIixwb3N0dmVyc2lvbjoiZ2l0IHB1c2ggJiYgZ2l0IHB1c2ggLS10YWdzIixleGFtcGxlczoibm9kZSAuL2V4YW1wbGVzL3NlcnZlci5qcyIsY292ZXJhbGxzOiJjYXQgY292ZXJhZ2UvbGNvdi5pbmZvIHwgLi9ub2RlX21vZHVsZXMvY292ZXJhbGxzL2Jpbi9jb3ZlcmFsbHMuanMiLGZpeDoiZXNsaW50IC0tZml4IGxpYi8qKi8qLmpzIn0scmVwb3NpdG9yeTp7dHlwZToiZ2l0Iix1cmw6Imh0dHBzOi8vZ2l0aHViLmNvbS9heGlvcy9heGlvcy5naXQifSxrZXl3b3JkczpbInhociIsImh0dHAiLCJhamF4IiwicHJvbWlzZSIsIm5vZGUiXSxhdXRob3I6Ik1hdHQgWmFicmlza2llIixsaWNlbnNlOiJNSVQiLGJ1Z3M6e3VybDoiaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zL2lzc3VlcyJ9LGhvbWVwYWdlOiJodHRwczovL2F4aW9zLWh0dHAuY29tIixkZXZEZXBlbmRlbmNpZXM6e2NvdmVyYWxsczoiXjMuMC4wIiwiZXM2LXByb21pc2UiOiJeNC4yLjQiLGdydW50OiJeMS4zLjAiLCJncnVudC1iYW5uZXIiOiJeMC42LjAiLCJncnVudC1jbGkiOiJeMS4yLjAiLCJncnVudC1jb250cmliLWNsZWFuIjoiXjEuMS4wIiwiZ3J1bnQtY29udHJpYi13YXRjaCI6Il4xLjAuMCIsImdydW50LWVzbGludCI6Il4yMy4wLjAiLCJncnVudC1rYXJtYSI6Il40LjAuMCIsImdydW50LW1vY2hhLXRlc3QiOiJeMC4xMy4zIiwiZ3J1bnQtdHMiOiJeNi4wLjAtYmV0YS4xOSIsImdydW50LXdlYnBhY2siOiJeNC4wLjIiLCJpc3RhbmJ1bC1pbnN0cnVtZW50ZXItbG9hZGVyIjoiXjEuMC4wIiwiamFzbWluZS1jb3JlIjoiXjIuNC4xIixrYXJtYToiXjYuMy4yIiwia2FybWEtY2hyb21lLWxhdW5jaGVyIjoiXjMuMS4wIiwia2FybWEtZmlyZWZveC1sYXVuY2hlciI6Il4yLjEuMCIsImthcm1hLWphc21pbmUiOiJeMS4xLjEiLCJrYXJtYS1qYXNtaW5lLWFqYXgiOiJeMC4xLjEzIiwia2FybWEtc2FmYXJpLWxhdW5jaGVyIjoiXjEuMC4wIiwia2FybWEtc2F1Y2UtbGF1bmNoZXIiOiJeNC4zLjYiLCJrYXJtYS1zaW5vbiI6Il4xLjAuNSIsImthcm1hLXNvdXJjZW1hcC1sb2FkZXIiOiJeMC4zLjgiLCJrYXJtYS13ZWJwYWNrIjoiXjQuMC4yIiwibG9hZC1ncnVudC10YXNrcyI6Il4zLjUuMiIsbWluaW1pc3Q6Il4xLjIuMCIsbW9jaGE6Il44LjIuMSIsc2lub246Il40LjUuMCIsInRlcnNlci13ZWJwYWNrLXBsdWdpbiI6Il40LjIuMyIsdHlwZXNjcmlwdDoiXjQuMC41IiwidXJsLXNlYXJjaC1wYXJhbXMiOiJeMC4xMC4wIix3ZWJwYWNrOiJeNC40NC4yIiwid2VicGFjay1kZXYtc2VydmVyIjoiXjMuMTEuMCJ9LGJyb3dzZXI6eyIuL2xpYi9hZGFwdGVycy9odHRwLmpzIjoiLi9saWIvYWRhcHRlcnMveGhyLmpzIn0sanNkZWxpdnI6ImRpc3QvYXhpb3MubWluLmpzIix1bnBrZzoiZGlzdC9heGlvcy5taW4uanMiLHR5cGluZ3M6Ii4vaW5kZXguZC50cyIsZGVwZW5kZW5jaWVzOnsiZm9sbG93LXJlZGlyZWN0cyI6Il4xLjE0LjAifSxidW5kbGVzaXplOlt7cGF0aDoiLi9kaXN0L2F4aW9zLm1pbi5qcyIsdGhyZXNob2xkOiI1a0IifV19LHR0PXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXt0dFtlXT1mdW5jdGlvbihyKXtyZXR1cm4gdHlwZW9mIHI9PT1lfHwiYSIrKHQ8MT8ibiAiOiIgIikrZX19KSk7dmFyIHJ0PXt9LG50PWV0LnZlcnNpb24uc3BsaXQoIi4iKTtmdW5jdGlvbiBpdChlLHQpe2Zvcih2YXIgcj10P3Quc3BsaXQoIi4iKTpudCxuPWUuc3BsaXQoIi4iKSxpPTA7aTwzO2krKyl7aWYocltpXT5uW2ldKXJldHVybiEwO2lmKHJbaV08bltpXSlyZXR1cm4hMX1yZXR1cm4hMX10dC50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXQmJml0KHQpO2Z1bmN0aW9uIGkoZSx0KXtyZXR1cm4iW0F4aW9zIHYiK2V0LnZlcnNpb24rIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitlKyInIit0KyhyPyIuICIrcjoiIil9cmV0dXJuIGZ1bmN0aW9uKHIsbyxzKXtpZighMT09PWUpdGhyb3cgbmV3IEVycm9yKGkobywiIGhhcyBiZWVuIHJlbW92ZWQgaW4gIit0KSk7cmV0dXJuIG4mJiFydFtvXSYmKHJ0W29dPSEwLGNvbnNvbGUud2FybihpKG8sIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksIWV8fGUocixvLHMpfX07dmFyIG90PXtpc09sZGVyVmVyc2lvbjppdCxhc3NlcnRPcHRpb25zOmZ1bmN0aW9uKGUsdCxyKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhlKSxpPW4ubGVuZ3RoO2ktLSA+MDspe3ZhciBvPW5baV0scz10W29dO2lmKHMpe3ZhciBhPWVbb10sdT12b2lkIDA9PT1hfHxzKGEsbyxlKTtpZighMCE9PXUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIit1KX1lbHNlIGlmKCEwIT09cil0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19LHZhbGlkYXRvcnM6dHR9LHN0PW90LnZhbGlkYXRvcnM7ZnVuY3Rpb24gYXQoZSl7dGhpcy5kZWZhdWx0cz1lLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBsZSxyZXNwb25zZTpuZXcgbGV9fWF0LnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZT8oZT1hcmd1bWVudHNbMV18fHt9KS51cmw9YXJndW1lbnRzWzBdOmU9ZXx8e30sKGU9UWUodGhpcy5kZWZhdWx0cyxlKSkubWV0aG9kP2UubWV0aG9kPWUubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/ZS5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTplLm1ldGhvZD0iZ2V0Ijt2YXIgdD1lLnRyYW5zaXRpb25hbDt2b2lkIDAhPT10JiZvdC5hc3NlcnRPcHRpb25zKHQse3NpbGVudEpTT05QYXJzaW5nOnN0LnRyYW5zaXRpb25hbChzdC5ib29sZWFuLCIxLjAuMCIpLGZvcmNlZEpTT05QYXJzaW5nOnN0LnRyYW5zaXRpb25hbChzdC5ib29sZWFuLCIxLjAuMCIpLGNsYXJpZnlUaW1lb3V0RXJyb3I6c3QudHJhbnNpdGlvbmFsKHN0LmJvb2xlYW4sIjEuMC4wIil9LCExKTt2YXIgcj1bXSxuPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQucnVuV2hlbiYmITE9PT10LnJ1bldoZW4oZSl8fChuPW4mJnQuc3luY2hyb25vdXMsci51bnNoaWZ0KHQuZnVsZmlsbGVkLHQucmVqZWN0ZWQpKX0pKTt2YXIgaSxvPVtdO2lmKHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goKGZ1bmN0aW9uKGUpe28ucHVzaChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pKSwhbil7dmFyIHM9W1plLHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KHMscikscz1zLmNvbmNhdChvKSxpPVByb21pc2UucmVzb2x2ZShlKTtzLmxlbmd0aDspaT1pLnRoZW4ocy5zaGlmdCgpLHMuc2hpZnQoKSk7cmV0dXJuIGl9Zm9yKHZhciBhPWU7ci5sZW5ndGg7KXt2YXIgdT1yLnNoaWZ0KCksYz1yLnNoaWZ0KCk7dHJ5e2E9dShhKX1jYXRjaChlKXtjKGUpO2JyZWFrfX10cnl7aT1aZShhKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9Zm9yKDtvLmxlbmd0aDspaT1pLnRoZW4oby5zaGlmdCgpLG8uc2hpZnQoKSk7cmV0dXJuIGl9LGF0LnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9UWUodGhpcy5kZWZhdWx0cyxlKSxjZShlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxhZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSwoZnVuY3Rpb24oZSl7YXQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVxdWVzdChRZShyfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YToocnx8e30pLmRhdGF9KSl9fSkpLGFlLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7YXQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscixuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFFlKG58fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOnJ9KSl9fSkpO3ZhciB1dD1hdDtmdW5jdGlvbiBjdChlKXt0aGlzLm1lc3NhZ2U9ZX1jdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sY3QucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIGh0PWN0O2Z1bmN0aW9uIGx0KGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTt2YXIgdDt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKTt2YXIgcj10aGlzO2UoKGZ1bmN0aW9uKGUpe3IucmVhc29ufHwoci5yZWFzb249bmV3IGh0KGUpLHQoci5yZWFzb24pKX0pKX1sdC5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMucmVhc29uKXRocm93IHRoaXMucmVhc29ufSxsdC5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW5ldyBsdCgoZnVuY3Rpb24odCl7ZT10fSkpO3JldHVybnt0b2tlbjp0LGNhbmNlbDplfX07dmFyIGZ0PWx0O2Z1bmN0aW9uIGR0KGUpe3ZhciB0PW5ldyB1dChlKSxyPVEodXQucHJvdG90eXBlLnJlcXVlc3QsdCk7cmV0dXJuIGFlLmV4dGVuZChyLHV0LnByb3RvdHlwZSx0KSxhZS5leHRlbmQocix0KSxyfXZhciBwdD1kdChWZSk7cHQuQXhpb3M9dXQscHQuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBkdChRZShwdC5kZWZhdWx0cyxlKSl9LHB0LkNhbmNlbD1odCxwdC5DYW5jZWxUb2tlbj1mdCxwdC5pc0NhbmNlbD1HZSxwdC5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxwdC5zcHJlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KG51bGwsdCl9fSxwdC5pc0F4aW9zRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYhMD09PWUuaXNBeGlvc0Vycm9yfTt2YXIgZ3Q9cHQsdnQ9cHQ7Z3QuZGVmYXVsdD12dDt2YXIgeXQsbXQsd3Q9Z3Q7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gYnQoZSx0LHIsbil7cmV0dXJuIG5ldyhyfHwocj1Qcm9taXNlKSkoKGZ1bmN0aW9uKGksbyl7ZnVuY3Rpb24gcyhlKXt0cnl7dShuLm5leHQoZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGEoZSl7dHJ5e3Uobi50aHJvdyhlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gdShlKXt2YXIgdDtlLmRvbmU/aShlLnZhbHVlKToodD1lLnZhbHVlLHQgaW5zdGFuY2VvZiByP3Q6bmV3IHIoKGZ1bmN0aW9uKGUpe2UodCl9KSkpLnRoZW4ocyxhKX11KChuPW4uYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KSl9KG10PXl0fHwoeXQ9e30pKS5mb3JtUG9zdD0iZm9ybV9wb3N0IixtdC5xdWVyeT0icXVlcnkiO3ZhciBfdDshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KF90fHwoX3Q9e30pKTtjb25zdCBrdD0icmVmcmVzaF90b2tlbl90aW1lciI7Y2xhc3MgU3QgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHQscixuLGksbyl7c3VwZXIobnVsbCE9bj9uOm51bGw9PW8/dm9pZCAwOm8ubWVzc2FnZSksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvZGU9ZSx0aGlzLmZpbGU9dCx0aGlzLm1ldGhvZD1yLHRoaXMuZGVzY3JpcHRpb249aSx0aGlzLmVycm9yPW8sT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsbmV3LnRhcmdldC5wcm90b3R5cGUpfX1jbGFzcyBFdCBleHRlbmRzIFN0e2NvbnN0cnVjdG9yKGUsdCxyLG4saSxvLHMsYSx1KXtzdXBlcihlLHQscixuLGkpLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPWUsdGhpcy5maWxlPXQsdGhpcy5tZXRob2Q9cix0aGlzLmRlc2NyaXB0aW9uPWksdGhpcy5uZXR3b3JrRXJyb3JDb2RlPW8sdGhpcy5uZXR3b3JrRXJyb3JNZXNzYWdlPXMsdGhpcy5zdGF0dXM9YSx0aGlzLm5ldHdvcmtFcnJvckRhdGE9dX19dmFyIFR0PSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp2b2lkIDAhPT10P3Q6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gQXQoZSx0LHIpe3JldHVybiBlKHI9e3BhdGg6dCxleHBvcnRzOnt9LHJlcXVpcmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkR5bmFtaWMgcmVxdWlyZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IEByb2xsdXAvcGx1Z2luLWNvbW1vbmpzIil9KG51bGw9PXQmJnIucGF0aCl9fSxyLmV4cG9ydHMpLHIuZXhwb3J0c312YXIgUnQ9dm9pZCAwIT09dD90OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxDdD1bXSxQdD1bXSxEdD0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxPdD0hMTtmdW5jdGlvbiBJdCgpe090PSEwO2Zvcih2YXIgZT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsdD0wLHI9ZS5sZW5ndGg7dDxyOysrdClDdFt0XT1lW3RdLFB0W2UuY2hhckNvZGVBdCh0KV09dDtQdFsiLSIuY2hhckNvZGVBdCgwKV09NjIsUHRbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIFV0KGUsdCxyKXtmb3IodmFyIG4saSxvPVtdLHM9dDtzPHI7cys9MyluPShlW3NdPDwxNikrKGVbcysxXTw8OCkrZVtzKzJdLG8ucHVzaChDdFsoaT1uKT4+MTgmNjNdK0N0W2k+PjEyJjYzXStDdFtpPj42JjYzXStDdFs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24gTXQoZSl7dmFyIHQ7T3R8fEl0KCk7Zm9yKHZhciByPWUubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxzPTE2MzgzLGE9MCx1PXItbjthPHU7YSs9cylvLnB1c2goVXQoZSxhLGErcz51P3U6YStzKSk7cmV0dXJuIDE9PT1uPyh0PWVbci0xXSxpKz1DdFt0Pj4yXSxpKz1DdFt0PDw0JjYzXSxpKz0iPT0iKToyPT09biYmKHQ9KGVbci0yXTw8OCkrZVtyLTFdLGkrPUN0W3Q+PjEwXSxpKz1DdFt0Pj40JjYzXSxpKz1DdFt0PDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIEx0KGUsdCxyLG4saSl7dmFyIG8scyxhPTgqaS1uLTEsdT0oMTw8YSktMSxjPXU+PjEsaD0tNyxsPXI/aS0xOjAsZj1yPy0xOjEsZD1lW3QrbF07Zm9yKGwrPWYsbz1kJigxPDwtaCktMSxkPj49LWgsaCs9YTtoPjA7bz0yNTYqbytlW3QrbF0sbCs9ZixoLT04KTtmb3Iocz1vJigxPDwtaCktMSxvPj49LWgsaCs9bjtoPjA7cz0yNTYqcytlW3QrbF0sbCs9ZixoLT04KTtpZigwPT09bylvPTEtYztlbHNle2lmKG89PT11KXJldHVybiBzP05hTjoxLzAqKGQ/LTE6MSk7cys9TWF0aC5wb3coMixuKSxvLT1jfXJldHVybihkPy0xOjEpKnMqTWF0aC5wb3coMixvLW4pfWZ1bmN0aW9uIEh0KGUsdCxyLG4saSxvKXt2YXIgcyxhLHUsYz04Km8taS0xLGg9KDE8PGMpLTEsbD1oPj4xLGY9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxkPW4/MDpvLTEscD1uPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9aCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSwodCs9cytsPj0xP2YvdTpmKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKHMrKyx1Lz0yKSxzK2w+PWg/KGE9MCxzPWgpOnMrbD49MT8oYT0odCp1LTEpKk1hdGgucG93KDIsaSkscys9bCk6KGE9dCpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O2VbcitkXT0yNTUmYSxkKz1wLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsYys9aTtjPjA7ZVtyK2RdPTI1NSZzLGQrPXAscy89MjU2LGMtPTgpO2VbcitkLXBdfD0xMjgqZ312YXIganQ9e30udG9TdHJpbmcseHQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09anQuY2FsbChlKX07S3QuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT1SdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHxSdC5UWVBFRF9BUlJBWV9TVVBQT1JUO3ZhciBxdD1CdCgpO2Z1bmN0aW9uIEJ0KCl7cmV0dXJuIEt0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIE50KGUsdCl7aWYoQnQoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBLdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189S3QucHJvdG90eXBlOihudWxsPT09ZSYmKGU9bmV3IEt0KHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIEt0KGUsdCxyKXtpZighKEt0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBLdCkpcmV0dXJuIG5ldyBLdChlLHQscik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBXdCh0aGlzLGUpfXJldHVybiBGdCh0aGlzLGUsdCxyKX1mdW5jdGlvbiBGdChlLHQscixuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQscixuKXtpZih0LmJ5dGVMZW5ndGgscjwwfHx0LmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiB0PXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0LHIpOm5ldyBVaW50OEFycmF5KHQscixuKSxLdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPXQpLl9fcHJvdG9fXz1LdC5wcm90b3R5cGU6ZT1KdChlLHQpLGV9KGUsdCxyLG4pOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQscil7aWYoInN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4IiksIUt0LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHwkdCh0LHIpLGk9KGU9TnQoZSxuKSkud3JpdGUodCxyKTtyZXR1cm4gaSE9PW4mJihlPWUuc2xpY2UoMCxpKSksZX0oZSx0LHIpOmZ1bmN0aW9uKGUsdCl7aWYoVnQodCkpe3ZhciByPTB8enQodC5sZW5ndGgpO3JldHVybiAwPT09KGU9TnQoZSxyKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsciksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KG49dC5sZW5ndGgpIT1uP050KGUsMCk6SnQoZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmeHQodC5kYXRhKSlyZXR1cm4gSnQoZSx0LmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0oZSx0KX1mdW5jdGlvbiBZdChlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIFd0KGUsdCl7aWYoWXQodCksZT1OdChlLHQ8MD8wOjB8enQodCkpLCFLdC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8dDsrK3IpZVtyXT0wO3JldHVybiBlfWZ1bmN0aW9uIEp0KGUsdCl7dmFyIHI9dC5sZW5ndGg8MD8wOjB8enQodC5sZW5ndGgpO2U9TnQoZSxyKTtmb3IodmFyIG49MDtuPHI7bis9MSllW25dPTI1NSZ0W25dO3JldHVybiBlfWZ1bmN0aW9uIHp0KGUpe2lmKGU+PUJ0KCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK0J0KCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHxlfWZ1bmN0aW9uIFZ0KGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX1mdW5jdGlvbiAkdChlLHQpe2lmKFZ0KGUpKXJldHVybiBlLmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIitlKTt2YXIgcj1lLmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2godCl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBfcihlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIGtyKGUpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIF9yKGUpLmxlbmd0aDt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIEd0KGUsdCxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIGhyKHRoaXMsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBhcih0aGlzLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIHVyKHRoaXMsdCxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBjcih0aGlzLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBzcih0aGlzLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBscih0aGlzLHQscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBYdChlLHQscil7dmFyIG49ZVt0XTtlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIFp0KGUsdCxyLG4saSl7aWYoMD09PWUubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9aT8wOmUubGVuZ3RoLTEpLHI8MCYmKHI9ZS5sZW5ndGgrcikscj49ZS5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7cj1lLmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighaSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1LdC5mcm9tKHQsbikpLFZ0KHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6UXQoZSx0LHIsbixpKTtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQmPTI1NSxLdC5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQscik6UXQoZSxbdF0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIFF0KGUsdCxyLG4saSl7dmFyIG8scz0xLGE9ZS5sZW5ndGgsdT10Lmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZihlLmxlbmd0aDwyfHx0Lmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLHUvPTIsci89Mn1mdW5jdGlvbiBjKGUsdCl7cmV0dXJuIDE9PT1zP2VbdF06ZS5yZWFkVUludDE2QkUodCpzKX1pZihpKXt2YXIgaD0tMTtmb3Iobz1yO288YTtvKyspaWYoYyhlLG8pPT09Yyh0LC0xPT09aD8wOm8taCkpe2lmKC0xPT09aCYmKGg9byksby1oKzE9PT11KXJldHVybiBoKnN9ZWxzZS0xIT09aCYmKG8tPW8taCksaD0tMX1lbHNlIGZvcihyK3U+YSYmKHI9YS11KSxvPXI7bz49MDtvLS0pe2Zvcih2YXIgbD0hMCxmPTA7Zjx1O2YrKylpZihjKGUsbytmKSE9PWModCxmKSl7bD0hMTticmVha31pZihsKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIGVyKGUsdCxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPWUubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz10Lmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGE9cGFyc2VJbnQodC5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gcztlW3Irc109YX1yZXR1cm4gc31mdW5jdGlvbiB0cihlLHQscixuKXtyZXR1cm4gU3IoX3IodCxlLmxlbmd0aC1yKSxlLHIsbil9ZnVuY3Rpb24gcnIoZSx0LHIsbil7cmV0dXJuIFNyKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTA7cjxlLmxlbmd0aDsrK3IpdC5wdXNoKDI1NSZlLmNoYXJDb2RlQXQocikpO3JldHVybiB0fSh0KSxlLHIsbil9ZnVuY3Rpb24gbnIoZSx0LHIsbil7cmV0dXJuIHJyKGUsdCxyLG4pfWZ1bmN0aW9uIGlyKGUsdCxyLG4pe3JldHVybiBTcihrcih0KSxlLHIsbil9ZnVuY3Rpb24gb3IoZSx0LHIsbil7cmV0dXJuIFNyKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG4saSxvPVtdLHM9MDtzPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK3Mpbj0ocj1lLmNoYXJDb2RlQXQocykpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30odCxlLmxlbmd0aC1yKSxlLHIsbil9ZnVuY3Rpb24gc3IoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP010KGUpOk10KGUuc2xpY2UodCxyKSl9ZnVuY3Rpb24gYXIoZSx0LHIpe3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9dDtpPHI7KXt2YXIgbyxzLGEsdSxjPWVbaV0saD1udWxsLGw9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihpK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpjPDEyOCYmKGg9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz1lW2krMV0pKSYmKHU9KDMxJmMpPDw2fDYzJm8pPjEyNyYmKGg9dSk7YnJlYWs7Y2FzZSAzOm89ZVtpKzFdLHM9ZVtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDEyfCg2MyZvKTw8Nnw2MyZzKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihoPXUpO2JyZWFrO2Nhc2UgNDpvPWVbaSsxXSxzPWVbaSsyXSxhPWVbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZ1PDExMTQxMTImJihoPXUpfW51bGw9PT1oPyhoPTY1NTMzLGw9MSk6aD42NTUzNSYmKGgtPTY1NTM2LG4ucHVzaChoPj4+MTAmMTAyM3w1NTI5NiksaD01NjMyMHwxMDIzJmgpLG4ucHVzaChoKSxpKz1sfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD00MDk2KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTtmb3IodmFyIHI9IiIsbj0wO248dDspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZS5zbGljZShuLG4rPTQwOTYpKTtyZXR1cm4gcn0obil9ZnVuY3Rpb24gdXIoZSx0LHIpe3ZhciBuPSIiO3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBpPXQ7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZlW2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBjcihlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGk9dDtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gaHIoZSx0LHIpe3ZhciBuPWUubGVuZ3RoOyghdHx8dDwwKSYmKHQ9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPXQ7bzxyOysrbylpKz1icihlW29dKTtyZXR1cm4gaX1mdW5jdGlvbiBscihlLHQscil7Zm9yKHZhciBuPWUuc2xpY2UodCxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIGZyKGUsdCxyKXtpZihlJTEhPTB8fGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYoZSt0PnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBkcihlLHQscixuLGksbyl7aWYoIVZ0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZih0Pml8fHQ8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBwcihlLHQscixuKXt0PDAmJih0PTY1NTM1K3QrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbihlLmxlbmd0aC1yLDIpO2k8bzsrK2kpZVtyK2ldPSh0JjI1NTw8OCoobj9pOjEtaSkpPj4+OCoobj9pOjEtaSl9ZnVuY3Rpb24gZ3IoZSx0LHIsbil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbihlLmxlbmd0aC1yLDQpO2k8bzsrK2kpZVtyK2ldPXQ+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gdnIoZSx0LHIsbixpLG8pe2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiB5cihlLHQscixuLGkpe3JldHVybiBpfHx2cihlLDAsciw0KSxIdChlLHQscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBtcihlLHQscixuLGkpe3JldHVybiBpfHx2cihlLDAsciw4KSxIdChlLHQscixuLDUyLDgpLHIrOH1LdC5wb29sU2l6ZT04MTkyLEt0Ll9hdWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fXz1LdC5wcm90b3R5cGUsZX0sS3QuZnJvbT1mdW5jdGlvbihlLHQscil7cmV0dXJuIEZ0KG51bGwsZSx0LHIpfSxLdC5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoS3QucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxLdC5fX3Byb3RvX189VWludDhBcnJheSksS3QuYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gWXQodCksdDw9MD9OdChlLHQpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBuP050KGUsdCkuZmlsbChyLG4pOk50KGUsdCkuZmlsbChyKTpOdChlLHQpfShudWxsLGUsdCxyKX0sS3QuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIFd0KG51bGwsZSl9LEt0LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gV3QobnVsbCxlKX0sS3QuaXNCdWZmZXI9RXIsS3QuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFWdChlKXx8IVZ0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIHI9ZS5sZW5ndGgsbj10Lmxlbmd0aCxpPTAsbz1NYXRoLm1pbihyLG4pO2k8bzsrK2kpaWYoZVtpXSE9PXRbaV0pe3I9ZVtpXSxuPXRbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfSxLdC5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxLdC5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZigheHQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gS3QuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09dClmb3IodD0wLHI9MDtyPGUubGVuZ3RoOysrcil0Kz1lW3JdLmxlbmd0aDt2YXIgbj1LdC5hbGxvY1Vuc2FmZSh0KSxpPTA7Zm9yKHI9MDtyPGUubGVuZ3RoOysrcil7dmFyIG89ZVtyXTtpZighVnQobykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShuLGkpLGkrPW8ubGVuZ3RofXJldHVybiBufSxLdC5ieXRlTGVuZ3RoPSR0LEt0LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsS3QucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9MilYdCh0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc30sS3QucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NClYdCh0aGlzLHQsdCszKSxYdCh0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfSxLdC5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KVh0KHRoaXMsdCx0KzcpLFh0KHRoaXMsdCsxLHQrNiksWHQodGhpcyx0KzIsdCs1KSxYdCh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxLdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09ZT8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9hcih0aGlzLDAsZSk6R3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxLdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCFWdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09S3QuY29tcGFyZSh0aGlzLGUpfSxLdC5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYoZT10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxLdC5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQscixuLGkpe2lmKCFWdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09ciYmKHI9ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxyPmUubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJnQ+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZih0Pj1yKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixpKSxjPWUuc2xpY2UodCxyKSxoPTA7aDxhOysraClpZih1W2hdIT09Y1toXSl7bz11W2hdLHM9Y1toXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LEt0LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LHIpfSxLdC5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQscil7cmV0dXJuIFp0KHRoaXMsZSx0LHIsITApfSxLdC5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBadCh0aGlzLGUsdCxyLCExKX0sS3QucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHZvaWQgMD09PXQpbj0idXRmOCIscj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIHQpbj10LHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLGUubGVuZ3RoPjAmJihyPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBlcih0aGlzLGUsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB0cih0aGlzLGUsdCxyKTtjYXNlImFzY2lpIjpyZXR1cm4gcnIodGhpcyxlLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbnIodGhpcyxlLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBpcih0aGlzLGUsdCxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIG9yKHRoaXMsZSx0LHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LEt0LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19LEt0LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLCh0PXZvaWQgMD09PXQ/bjp+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksdDxlJiYodD1lKSxLdC5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPUt0LnByb3RvdHlwZTtlbHNle3ZhciBpPXQtZTtyPW5ldyBLdChpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbytlXX1yZXR1cm4gcn0sS3QucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxmcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2VdLGk9MSxvPTA7KytvPHQmJihpKj0yNTYpOyluKz10aGlzW2Urb10qaTtyZXR1cm4gbn0sS3QucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxmcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2UrLS10XSxpPTE7dD4wJiYoaSo9MjU2KTspbis9dGhpc1tlKy0tdF0qaTtyZXR1cm4gbn0sS3QucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxmcihlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LEt0LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ZnIoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sS3QucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxmcihlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxLdC5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fGZyKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sS3QucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxmcihlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LEt0LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxmcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2VdLGk9MSxvPTA7KytvPHQmJihpKj0yNTYpOyluKz10aGlzW2Urb10qaTtyZXR1cm4gbj49KGkqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqdCkpLG59LEt0LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxmcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10LGk9MSxvPXRoaXNbZSstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSxLdC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ZnIoZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sS3QucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8ZnIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sS3QucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8ZnIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sS3QucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fGZyKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxLdC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ZnIoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LEt0LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxmcihlLDQsdGhpcy5sZW5ndGgpLEx0KHRoaXMsZSwhMCwyMyw0KX0sS3QucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fGZyKGUsNCx0aGlzLmxlbmd0aCksTHQodGhpcyxlLCExLDIzLDQpfSxLdC5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fGZyKGUsOCx0aGlzLmxlbmd0aCksTHQodGhpcyxlLCEwLDUyLDgpfSxLdC5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fGZyKGUsOCx0aGlzLmxlbmd0aCksTHQodGhpcyxlLCExLDUyLDgpfSxLdC5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LHIsbil7ZT0rZSx0fD0wLHJ8PTAsbnx8ZHIodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT0xLG89MDtmb3IodGhpc1t0XT0yNTUmZTsrK288ciYmKGkqPTI1Nik7KXRoaXNbdCtvXT1lL2kmMjU1O3JldHVybiB0K3J9LEt0LnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQscixuKXtlPStlLHR8PTAscnw9MCxufHxkcih0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPXItMSxvPTE7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtyfSxLdC5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxkcih0aGlzLGUsdCwxLDI1NSwwKSxLdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3RdPTI1NSZlLHQrMX0sS3QucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8ZHIodGhpcyxlLHQsMiw2NTUzNSwwKSxLdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6cHIodGhpcyxlLHQsITApLHQrMn0sS3QucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8ZHIodGhpcyxlLHQsMiw2NTUzNSwwKSxLdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6cHIodGhpcyxlLHQsITEpLHQrMn0sS3QucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8ZHIodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLEt0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6Z3IodGhpcyxlLHQsITApLHQrNH0sS3QucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8ZHIodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLEt0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6Z3IodGhpcyxlLHQsITEpLHQrNH0sS3QucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LHIsbil7aWYoZT0rZSx0fD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtkcih0aGlzLGUsdCxyLGktMSwtaSl9dmFyIG89MCxzPTEsYT0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxyJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvLTFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrcn0sS3QucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7aWYoZT0rZSx0fD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtkcih0aGlzLGUsdCxyLGktMSwtaSl9dmFyIG89ci0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28rMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtyfSxLdC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGRyKHRoaXMsZSx0LDEsMTI3LC0xMjgpLEt0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LEt0LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8ZHIodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLEt0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpwcih0aGlzLGUsdCwhMCksdCsyfSxLdC5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGRyKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxLdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6cHIodGhpcyxlLHQsITEpLHQrMn0sS3QucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxkcih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLEt0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzNdPWU+Pj4yNCk6Z3IodGhpcyxlLHQsITApLHQrNH0sS3QucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxkcih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLEt0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6Z3IodGhpcyxlLHQsITEpLHQrNH0sS3QucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHlyKHRoaXMsZSx0LCEwLHIpfSxLdC5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4geXIodGhpcyxlLHQsITEscil9LEt0LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gbXIodGhpcyxlLHQsITAscil9LEt0LnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gbXIodGhpcyxlLHQsITEscil9LEt0LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHJ8fChyPTApLG58fDA9PT1ufHwobj10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxuPjAmJm48ciYmKG49ciksbj09PXIpcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwfHxyPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtuPnRoaXMubGVuZ3RoJiYobj10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxuLXImJihuPWUubGVuZ3RoLXQrcik7dmFyIGksbz1uLXI7aWYodGhpcz09PWUmJnI8dCYmdDxuKWZvcihpPW8tMTtpPj0wOy0taSllW2krdF09dGhpc1tpK3JdO2Vsc2UgaWYobzwxZTN8fCFLdC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSllW2krdF09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KHIscitvKSx0KTtyZXR1cm4gb30sS3QucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KG49dCx0PTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIGk9ZS5jaGFyQ29kZUF0KDApO2k8MjU2JiYoZT1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIUt0LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlJiYoZSY9MjU1KTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI8PXQpcmV0dXJuIHRoaXM7dmFyIG87aWYodD4+Pj0wLHI9dm9pZCAwPT09cj90aGlzLmxlbmd0aDpyPj4+MCxlfHwoZT0wKSwibnVtYmVyIj09dHlwZW9mIGUpZm9yKG89dDtvPHI7KytvKXRoaXNbb109ZTtlbHNle3ZhciBzPVZ0KGUpP2U6X3IobmV3IEt0KGUsbikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288ci10Oysrbyl0aGlzW28rdF09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgd3I9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gYnIoZSl7cmV0dXJuIGU8MTY/IjAiK2UudG9TdHJpbmcoMTYpOmUudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIF9yKGUsdCl7dmFyIHI7dD10fHwxLzA7Zm9yKHZhciBuPWUubGVuZ3RoLGk9bnVsbCxvPVtdLHM9MDtzPG47KytzKXtpZigocj1lLmNoYXJDb2RlQXQocykpPjU1Mjk1JiZyPDU3MzQ0KXtpZighaSl7aWYocj41NjMxOSl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PW4peyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPTY1NTM2KyhpLTU1Mjk2PDwxMHxyLTU2MzIwKX1lbHNlIGkmJih0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKCh0LT0xKTwwKWJyZWFrO28ucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKHQtPTIpPDApYnJlYWs7by5wdXNoKHI+PjZ8MTkyLDYzJnJ8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKCh0LT0zKTwwKWJyZWFrO28ucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsNjMmcnwxMjgpfWVsc2V7aWYoIShyPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHQtPTQpPDApYnJlYWs7by5wdXNoKHI+PjE4fDI0MCxyPj4xMiY2M3wxMjgscj4+NiY2M3wxMjgsNjMmcnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBrcihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQscixuLGksbyxzO090fHxJdCgpO3ZhciBhPWUubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09ZVthLTJdPzI6Ij0iPT09ZVthLTFdPzE6MCxzPW5ldyBEdCgzKmEvNC1vKSxuPW8+MD9hLTQ6YTt2YXIgdT0wO2Zvcih0PTAscj0wO3Q8bjt0Kz00LHIrPTMpaT1QdFtlLmNoYXJDb2RlQXQodCldPDwxOHxQdFtlLmNoYXJDb2RlQXQodCsxKV08PDEyfFB0W2UuY2hhckNvZGVBdCh0KzIpXTw8NnxQdFtlLmNoYXJDb2RlQXQodCszKV0sc1t1KytdPWk+PjE2JjI1NSxzW3UrK109aT4+OCYyNTUsc1t1KytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1QdFtlLmNoYXJDb2RlQXQodCldPDwyfFB0W2UuY2hhckNvZGVBdCh0KzEpXT4+NCxzW3UrK109MjU1JmkpOjE9PT1vJiYoaT1QdFtlLmNoYXJDb2RlQXQodCldPDwxMHxQdFtlLmNoYXJDb2RlQXQodCsxKV08PDR8UHRbZS5jaGFyQ29kZUF0KHQrMildPj4yLHNbdSsrXT1pPj44JjI1NSxzW3UrK109MjU1JmkpLHN9KGZ1bmN0aW9uKGUpe2lmKChlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KGUpLnJlcGxhY2Uod3IsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIFNyKGUsdCxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PXQubGVuZ3RofHxpPj1lLmxlbmd0aCk7KytpKXRbaStyXT1lW2ldO3JldHVybiBpfWZ1bmN0aW9uIEVyKGUpe3JldHVybiBudWxsIT1lJiYoISFlLl9pc0J1ZmZlcnx8VHIoZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmVHIoZS5zbGljZSgwLDApKX0oZSkpfWZ1bmN0aW9uIFRyKGUpe3JldHVybiEhZS5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9dmFyIEFyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJ1ZmZlcjpLdCxJTlNQRUNUX01BWF9CWVRFUzo1MCxTbG93QnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxLdC5hbGxvYygrZSl9LGlzQnVmZmVyOkVyLGtNYXhMZW5ndGg6cXR9KSxScj1BdCgoZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoLHI9dCU0O2lmKCFyKXJldHVybiBlO3ZhciBuPXQsaT00LXIsbz10K2kscz1LdC5hbGxvYyhvKTtmb3Iocy53cml0ZShlKTtpLS07KXMud3JpdGUoIj0iLG4rKyk7cmV0dXJuIHMudG9TdHJpbmcoKX19KSksQ3I9QXQoKGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0idXRmOCIpLEt0LmlzQnVmZmVyKGUpP2koZS50b1N0cmluZygiYmFzZTY0IikpOmkoS3QuZnJvbShlLHQpLnRvU3RyaW5nKCJiYXNlNjQiKSl9ZnVuY3Rpb24gbihlKXtyZXR1cm4gZT1lLnRvU3RyaW5nKCksUnIuZGVmYXVsdChlKS5yZXBsYWNlKC9cLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIil9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPXI7by5lbmNvZGU9cixvLmRlY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0idXRmOCIpLEt0LmZyb20obihlKSwiYmFzZTY0IikudG9TdHJpbmcodCl9LG8udG9CYXNlNjQ9bixvLmZyb21CYXNlNjQ9aSxvLnRvQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBLdC5mcm9tKG4oZSksImJhc2U2NCIpfSx0LmRlZmF1bHQ9b30pKSxQcj1BdCgoZnVuY3Rpb24oZSl7ZS5leHBvcnRzPUNyLmRlZmF1bHQsZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzfSkpLERyPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9KEF0KChmdW5jdGlvbihlKXshZnVuY3Rpb24odCxyKXt2YXIgbj17fTshZnVuY3Rpb24oZSl7ZS5fX2VzTW9kdWxlPSEwLGUuZGlnZXN0TGVuZ3RoPTMyLGUuYmxvY2tTaXplPTY0O3ZhciB0PW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSk7ZnVuY3Rpb24gcihlLHIsbixpLG8pe2Zvcih2YXIgcyxhLHUsYyxoLGwsZixkLHAsZyx2LHksbTtvPj02NDspe2ZvcihzPXJbMF0sYT1yWzFdLHU9clsyXSxjPXJbM10saD1yWzRdLGw9cls1XSxmPXJbNl0sZD1yWzddLGc9MDtnPDE2O2crKyl2PWkrNCpnLGVbZ109KDI1NSZuW3ZdKTw8MjR8KDI1NSZuW3YrMV0pPDwxNnwoMjU1Jm5bdisyXSk8PDh8MjU1Jm5bdiszXTtmb3IoZz0xNjtnPDY0O2crKyl5PSgocD1lW2ctMl0pPj4+MTd8cDw8MTUpXihwPj4+MTl8cDw8MTMpXnA+Pj4xMCxtPSgocD1lW2ctMTVdKT4+Pjd8cDw8MjUpXihwPj4+MTh8cDw8MTQpXnA+Pj4zLGVbZ109KHkrZVtnLTddfDApKyhtK2VbZy0xNl18MCk7Zm9yKGc9MDtnPDY0O2crKyl5PSgoKGg+Pj42fGg8PDI2KV4oaD4+PjExfGg8PDIxKV4oaD4+PjI1fGg8PDcpKSsoaCZsXn5oJmYpfDApKyhkKyh0W2ddK2VbZ118MCl8MCl8MCxtPSgocz4+PjJ8czw8MzApXihzPj4+MTN8czw8MTkpXihzPj4+MjJ8czw8MTApKSsocyZhXnMmdV5hJnUpfDAsZD1mLGY9bCxsPWgsaD1jK3l8MCxjPXUsdT1hLGE9cyxzPXkrbXwwO3JbMF0rPXMsclsxXSs9YSxyWzJdKz11LHJbM10rPWMscls0XSs9aCxyWzVdKz1sLHJbNl0rPWYscls3XSs9ZCxpKz02NCxvLT02NH1yZXR1cm4gaX12YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmRpZ2VzdExlbmd0aD1lLmRpZ2VzdExlbmd0aCx0aGlzLmJsb2NrU2l6ZT1lLmJsb2NrU2l6ZSx0aGlzLnN0YXRlPW5ldyBJbnQzMkFycmF5KDgpLHRoaXMudGVtcD1uZXcgSW50MzJBcnJheSg2NCksdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTI4KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXMucmVzZXQoKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZVswXT0xNzc5MDMzNzAzLHRoaXMuc3RhdGVbMV09MzE0NDEzNDI3Nyx0aGlzLnN0YXRlWzJdPTEwMTM5MDQyNDIsdGhpcy5zdGF0ZVszXT0yNzczNDgwNzYyLHRoaXMuc3RhdGVbNF09MTM1OTg5MzExOSx0aGlzLnN0YXRlWzVdPTI2MDA4MjI5MjQsdGhpcy5zdGF0ZVs2XT01Mjg3MzQ2MzUsdGhpcy5zdGF0ZVs3XT0xNTQxNDU5MjI1LHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpc30sdC5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuYnVmZmVyLmxlbmd0aDtlKyspdGhpcy5idWZmZXJbZV09MDtmb3IoZT0wO2U8dGhpcy50ZW1wLmxlbmd0aDtlKyspdGhpcy50ZW1wW2VdPTA7dGhpcy5yZXNldCgpfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10JiYodD1lLmxlbmd0aCksdGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIlNIQTI1NjogY2FuJ3QgdXBkYXRlIGJlY2F1c2UgaGFzaCB3YXMgZmluaXNoZWQuIik7dmFyIG49MDtpZih0aGlzLmJ5dGVzSGFzaGVkKz10LHRoaXMuYnVmZmVyTGVuZ3RoPjApe2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8NjQmJnQ+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtuKytdLHQtLTs2ND09PXRoaXMuYnVmZmVyTGVuZ3RoJiYocih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wKX1mb3IodD49NjQmJihuPXIodGhpcy50ZW1wLHRoaXMuc3RhdGUsZSxuLHQpLHQlPTY0KTt0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbbisrXSx0LS07cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcy5ieXRlc0hhc2hlZCxuPXRoaXMuYnVmZmVyTGVuZ3RoLGk9dC81MzY4NzA5MTJ8MCxvPXQ8PDMscz10JTY0PDU2PzY0OjEyODt0aGlzLmJ1ZmZlcltuXT0xMjg7Zm9yKHZhciBhPW4rMTthPHMtODthKyspdGhpcy5idWZmZXJbYV09MDt0aGlzLmJ1ZmZlcltzLThdPWk+Pj4yNCYyNTUsdGhpcy5idWZmZXJbcy03XT1pPj4+MTYmMjU1LHRoaXMuYnVmZmVyW3MtNl09aT4+PjgmMjU1LHRoaXMuYnVmZmVyW3MtNV09aT4+PjAmMjU1LHRoaXMuYnVmZmVyW3MtNF09bz4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTNdPW8+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy0yXT1vPj4+OCYyNTUsdGhpcy5idWZmZXJbcy0xXT1vPj4+MCYyNTUscih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLHMpLHRoaXMuZmluaXNoZWQ9ITB9Zm9yKGE9MDthPDg7YSsrKWVbNCphKzBdPXRoaXMuc3RhdGVbYV0+Pj4yNCYyNTUsZVs0KmErMV09dGhpcy5zdGF0ZVthXT4+PjE2JjI1NSxlWzQqYSsyXT10aGlzLnN0YXRlW2FdPj4+OCYyNTUsZVs0KmErM109dGhpcy5zdGF0ZVthXT4+PjAmMjU1O3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LHQucHJvdG90eXBlLl9zYXZlU3RhdGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx0aGlzLnN0YXRlLmxlbmd0aDt0KyspZVt0XT10aGlzLnN0YXRlW3RdfSx0LnByb3RvdHlwZS5fcmVzdG9yZVN0YXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTA7cjx0aGlzLnN0YXRlLmxlbmd0aDtyKyspdGhpcy5zdGF0ZVtyXT1lW3JdO3RoaXMuYnl0ZXNIYXNoZWQ9dCx0aGlzLmZpbmlzaGVkPSExLHRoaXMuYnVmZmVyTGVuZ3RoPTB9LHR9KCk7ZS5IYXNoPW47dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuaW5uZXI9bmV3IG4sdGhpcy5vdXRlcj1uZXcgbix0aGlzLmJsb2NrU2l6ZT10aGlzLmlubmVyLmJsb2NrU2l6ZSx0aGlzLmRpZ2VzdExlbmd0aD10aGlzLmlubmVyLmRpZ2VzdExlbmd0aDt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmJsb2NrU2l6ZSk7aWYoZS5sZW5ndGg+dGhpcy5ibG9ja1NpemUpKG5ldyBuKS51cGRhdGUoZSkuZmluaXNoKHQpLmNsZWFuKCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0W3JdPWVbcl07Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdXj01NDtmb3IodGhpcy5pbm5lci51cGRhdGUodCkscj0wO3I8dC5sZW5ndGg7cisrKXRbcl1ePTEwNjtmb3IodGhpcy5vdXRlci51cGRhdGUodCksdGhpcy5pc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMub3N0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLmlubmVyLl9zYXZlU3RhdGUodGhpcy5pc3RhdGUpLHRoaXMub3V0ZXIuX3NhdmVTdGF0ZSh0aGlzLm9zdGF0ZSkscj0wO3I8dC5sZW5ndGg7cisrKXRbcl09MH1yZXR1cm4gZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lci5fcmVzdG9yZVN0YXRlKHRoaXMuaXN0YXRlLHRoaXMuaW5uZXIuYmxvY2tTaXplKSx0aGlzLm91dGVyLl9yZXN0b3JlU3RhdGUodGhpcy5vc3RhdGUsdGhpcy5vdXRlci5ibG9ja1NpemUpLHRoaXN9LGUucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmlzdGF0ZS5sZW5ndGg7ZSsrKXRoaXMub3N0YXRlW2VdPXRoaXMuaXN0YXRlW2VdPTA7dGhpcy5pbm5lci5jbGVhbigpLHRoaXMub3V0ZXIuY2xlYW4oKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlubmVyLnVwZGF0ZShlKSx0aGlzfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWQ/dGhpcy5vdXRlci5maW5pc2goZSk6KHRoaXMuaW5uZXIuZmluaXNoKGUpLHRoaXMub3V0ZXIudXBkYXRlKGUsdGhpcy5kaWdlc3RMZW5ndGgpLmZpbmlzaChlKSksdGhpc30sZS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSxlfSgpO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9KG5ldyBuKS51cGRhdGUoZSkscj10LmRpZ2VzdCgpO3JldHVybiB0LmNsZWFuKCkscn1mdW5jdGlvbiBzKGUsdCl7dmFyIHI9bmV3IGkoZSkudXBkYXRlKHQpLG49ci5kaWdlc3QoKTtyZXR1cm4gci5jbGVhbigpLG59ZnVuY3Rpb24gYShlLHQscixuKXt2YXIgaT1uWzBdO2lmKDA9PT1pKXRocm93IG5ldyBFcnJvcigiaGtkZjogY2Fubm90IGV4cGFuZCBtb3JlIik7dC5yZXNldCgpLGk+MSYmdC51cGRhdGUoZSksciYmdC51cGRhdGUociksdC51cGRhdGUobiksdC5maW5pc2goZSksblswXSsrfWUuSE1BQz1pLGUuaGFzaD1vLGUuZGVmYXVsdD1vLGUuaG1hYz1zO3ZhciB1PW5ldyBVaW50OEFycmF5KGUuZGlnZXN0TGVuZ3RoKTtlLmhrZGY9ZnVuY3Rpb24oZSx0LHIsbil7dm9pZCAwPT09dCYmKHQ9dSksdm9pZCAwPT09biYmKG49MzIpO2Zvcih2YXIgbz1uZXcgVWludDhBcnJheShbMV0pLGM9cyh0LGUpLGg9bmV3IGkoYyksbD1uZXcgVWludDhBcnJheShoLmRpZ2VzdExlbmd0aCksZj1sLmxlbmd0aCxkPW5ldyBVaW50OEFycmF5KG4pLHA9MDtwPG47cCsrKWY9PT1sLmxlbmd0aCYmKGEobCxoLHIsbyksZj0wKSxkW3BdPWxbZisrXTtyZXR1cm4gaC5jbGVhbigpLGwuZmlsbCgwKSxvLmZpbGwoMCksZH0sZS5wYmtkZjI9ZnVuY3Rpb24oZSx0LHIsbil7Zm9yKHZhciBvPW5ldyBpKGUpLHM9by5kaWdlc3RMZW5ndGgsYT1uZXcgVWludDhBcnJheSg0KSx1PW5ldyBVaW50OEFycmF5KHMpLGM9bmV3IFVpbnQ4QXJyYXkocyksaD1uZXcgVWludDhBcnJheShuKSxsPTA7bCpzPG47bCsrKXt2YXIgZj1sKzE7YVswXT1mPj4+MjQmMjU1LGFbMV09Zj4+PjE2JjI1NSxhWzJdPWY+Pj44JjI1NSxhWzNdPWY+Pj4wJjI1NSxvLnJlc2V0KCksby51cGRhdGUodCksby51cGRhdGUoYSksby5maW5pc2goYyk7Zm9yKHZhciBkPTA7ZDxzO2QrKyl1W2RdPWNbZF07Zm9yKGQ9MjtkPD1yO2QrKyl7by5yZXNldCgpLG8udXBkYXRlKGMpLmZpbmlzaChjKTtmb3IodmFyIHA9MDtwPHM7cCsrKXVbcF1ePWNbcF19Zm9yKGQ9MDtkPHMmJmwqcytkPG47ZCsrKWhbbCpzK2RdPXVbZF19Zm9yKGw9MDtsPHM7bCsrKXVbbF09Y1tsXT0wO2ZvcihsPTA7bDw0O2wrKylhW2xdPTA7cmV0dXJuIG8uY2xlYW4oKSxofX0obik7dmFyIGk9bi5kZWZhdWx0O2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtlLmV4cG9ydHM9aX0oKX0pKSk7ZnVuY3Rpb24gT3IoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBJcigpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIFVyPU9yLE1yPUlyO2Z1bmN0aW9uIExyKGUpe2lmKFVyPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChVcj09PU9yfHwhVXIpJiZzZXRUaW1lb3V0KXJldHVybiBVcj1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIFVyKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiBVci5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gVXIuY2FsbCh0aGlzLGUsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgUnQuc2V0VGltZW91dCYmKFVyPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBSdC5jbGVhclRpbWVvdXQmJihNcj1jbGVhclRpbWVvdXQpO3ZhciBIcixqcj1bXSx4cj0hMSxxcj0tMTtmdW5jdGlvbiBCcigpe3hyJiZIciYmKHhyPSExLEhyLmxlbmd0aD9qcj1Ici5jb25jYXQoanIpOnFyPS0xLGpyLmxlbmd0aCYmTnIoKSl9ZnVuY3Rpb24gTnIoKXtpZigheHIpe3ZhciBlPUxyKEJyKTt4cj0hMDtmb3IodmFyIHQ9anIubGVuZ3RoO3Q7KXtmb3IoSHI9anIsanI9W107Kytxcjx0OylIciYmSHJbcXJdLnJ1bigpO3FyPS0xLHQ9anIubGVuZ3RofUhyPW51bGwseHI9ITEsZnVuY3Rpb24oZSl7aWYoTXI9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoTXI9PT1Jcnx8IU1yKSYmY2xlYXJUaW1lb3V0KXJldHVybiBNcj1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtNcihlKX1jYXRjaCh0KXt0cnl7cmV0dXJuIE1yLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gTXIuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBLcihlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fUtyLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTt2YXIgRnI9UnQucGVyZm9ybWFuY2V8fHt9LFlyPShGci5ub3d8fEZyLm1vek5vd3x8RnIubXNOb3d8fEZyLm9Ob3d8fEZyLndlYmtpdE5vdyxuZXcgRGF0ZSxmdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl0W3ItMV09YXJndW1lbnRzW3JdO2pyLnB1c2gobmV3IEtyKGUsdCkpLDEhPT1qci5sZW5ndGh8fHhyfHxMcihOcil9KSxXcj1mdW5jdGlvbihlKXtpZihlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsbi5nZXQ/bjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtyXX19KX0pKSx0fShBciksSnI9QXQoKGZ1bmN0aW9uKGUsdCl7dmFyIHI9V3IuQnVmZmVyO2Z1bmN0aW9uIG4oZSx0KXtmb3IodmFyIHIgaW4gZSl0W3JdPWVbcl19ZnVuY3Rpb24gaShlLHQsbil7cmV0dXJuIHIoZSx0LG4pfXIuZnJvbSYmci5hbGxvYyYmci5hbGxvY1Vuc2FmZSYmci5hbGxvY1Vuc2FmZVNsb3c/ZS5leHBvcnRzPVdyOihuKFdyLHQpLHQuQnVmZmVyPWkpLG4ocixpKSxpLmZyb209ZnVuY3Rpb24oZSx0LG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlciIpO3JldHVybiByKGUsdCxuKX0saS5hbGxvYz1mdW5jdGlvbihlLHQsbil7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTt2YXIgaT1yKGUpO3JldHVybiB2b2lkIDAhPT10PyJzdHJpbmciPT10eXBlb2Ygbj9pLmZpbGwodCxuKTppLmZpbGwodCk6aS5maWxsKDApLGl9LGkuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gcihlKX0saS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gV3IuU2xvd0J1ZmZlcihlKX19KSksenI9QXQoKGZ1bmN0aW9uKGUpe3ZhciB0PTY1NTM2LHI9SnIuQnVmZmVyLG49VHQuY3J5cHRvfHxUdC5tc0NyeXB0bztuJiZuLmdldFJhbmRvbVZhbHVlcz9lLmV4cG9ydHM9ZnVuY3Rpb24oZSxpKXtpZihlPjQyOTQ5NjcyOTUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJlcXVlc3RlZCB0b28gbWFueSByYW5kb20gYnl0ZXMiKTt2YXIgbz1yLmFsbG9jVW5zYWZlKGUpO2lmKGU+MClpZihlPnQpZm9yKHZhciBzPTA7czxlO3MrPXQpbi5nZXRSYW5kb21WYWx1ZXMoby5zbGljZShzLHMrdCkpO2Vsc2Ugbi5nZXRSYW5kb21WYWx1ZXMobyk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGk/WXIoKGZ1bmN0aW9uKCl7aShudWxsLG8pfSkpOm99OmUuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci5cblVzZSBDaHJvbWUsIEZpcmVmb3ggb3IgSW50ZXJuZXQgRXhwbG9yZXIgMTEiKX19KSk7Y29uc3QgVnI9bmV3IFRleHRFbmNvZGVyLCRyPW5ldyBUZXh0RGVjb2Rlcjt2YXIgR3I9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXMpcmV0dXJuIGdsb2JhbFRoaXM7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmKXJldHVybiBzZWxmO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3c7dGhyb3cgbmV3IEVycm9yKCJ1bmFibGUgdG8gbG9jYXRlIGdsb2JhbCBvYmplY3QiKX0oKTtjb25zdCBYcj1lPT57bGV0IHQ9ZTtyZXR1cm4gdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih0PSRyLmRlY29kZSh0KSksdD10LnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLnJlcGxhY2UoL1xzL2csIiIpLG5ldyBVaW50OEFycmF5KEdyLmF0b2IodCkuc3BsaXQoIiIpLm1hcCgoZT0+ZS5jaGFyQ29kZUF0KDApKSkpfTtjbGFzcyBaciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuY29kZT0iRVJSX0pPU0VfR0VORVJJQyIsdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKX19Y2xhc3MgUXIgZXh0ZW5kcyBacntjb25zdHJ1Y3RvcihlLHQ9InVuc3BlY2lmaWVkIixyPSJ1bnNwZWNpZmllZCIpe3N1cGVyKGUpLHRoaXMuY29kZT0iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPXJ9fWNsYXNzIGVuIGV4dGVuZHMgWnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn19Y2xhc3MgdG4gZXh0ZW5kcyBacntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSk9TRV9OT1RfU1VQUE9SVEVEIn19Y2xhc3Mgcm4gZXh0ZW5kcyBacntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldTX0lOVkFMSUQifX1jbGFzcyBubiBleHRlbmRzIFpye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1RfSU5WQUxJRCJ9fWNsYXNzIG9uIGV4dGVuZHMgWnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRCIsdGhpcy5tZXNzYWdlPSJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZCJ9fWNsYXNzIHNuIGV4dGVuZHMgUXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXVF9FWFBJUkVEIn19dmFyIGFuPUdyLmNyeXB0bztmdW5jdGlvbiB1bigpe2lmKCFHci5pc1NlY3VyZUNvbnRleHQmJiFHci5jcnlwdG8uc3VidGxlKXRocm93IG5ldyBacigiV2ViIENyeXB0b2dyYXBoeSBBUEkgaXMgYXZhaWxhYmxlIG9ubHkgaW4gU2VjdXJlIENvbnRleHRzLiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1NlY3VyaXR5L1NlY3VyZV9Db250ZXh0cyIpfWNvbnN0IGNuPWFzeW5jIGU9Pnt2YXIgdCxyO2NvbnN0e2FsZ29yaXRobTpuLGtleVVzYWdlczppfT1mdW5jdGlvbihlKXtsZXQgdCxyO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOnN3aXRjaChlLmFsZyl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6dD17bmFtZToiSE1BQyIsaGFzaDpgU0hBLSR7ZS5hbGcuc3Vic3RyKC0zKX1gfSxyPVsic2lnbiIsInZlcmlmeSJdO2JyZWFrO2Nhc2UiQTEyOENCQy1IUzI1NiI6Y2FzZSJBMTkyQ0JDLUhTMzg0IjpjYXNlIkEyNTZDQkMtSFM1MTIiOnRocm93IG5ldyB0bihgJHtlLmFsZ30ga2V5cyBjYW5ub3QgYmUgaW1wb3J0ZWQgYXMgQ3J5cHRvS2V5IGluc3RhbmNlc2ApO2Nhc2UiQTEyOEdDTSI6Y2FzZSJBMTkyR0NNIjpjYXNlIkEyNTZHQ00iOmNhc2UiQTEyOEdDTUtXIjpjYXNlIkExOTJHQ01LVyI6Y2FzZSJBMjU2R0NNS1ciOnQ9e25hbWU6IkFFUy1HQ00ifSxyPVsiZW5jcnlwdCIsImRlY3J5cHQiXTticmVhaztjYXNlIkExMjhLVyI6Y2FzZSJBMTkyS1ciOmNhc2UiQTI1NktXIjp0PXtuYW1lOiJBRVMtS1cifSxyPVsid3JhcEtleSIsInVud3JhcEtleSJdO2JyZWFrO2Nhc2UiUEJFUzItSFMyNTYrQTEyOEtXIjpjYXNlIlBCRVMyLUhTMzg0K0ExOTJLVyI6Y2FzZSJQQkVTMi1IUzUxMitBMjU2S1ciOnQ9e25hbWU6IlBCS0RGMiJ9LHI9WyJkZXJpdmVCaXRzIl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgdG4oJ3Vuc3VwcG9ydGVkIG9yIGludmFsaWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiUlNBIjpzd2l0Y2goZS5hbGcpe2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnQ9e25hbWU6IlJTQS1QU1MiLGhhc2g6YFNIQS0ke2UuYWxnLnN1YnN0cigtMyl9YH0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjp0PXtuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSIsaGFzaDpgU0hBLSR7ZS5hbGcuc3Vic3RyKC0zKX1gfSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlNBLU9BRVAiOmNhc2UiUlNBLU9BRVAtMjU2IjpjYXNlIlJTQS1PQUVQLTM4NCI6Y2FzZSJSU0EtT0FFUC01MTIiOnQ9e25hbWU6IlJTQS1PQUVQIixoYXNoOmBTSEEtJHtwYXJzZUludChlLmFsZy5zdWJzdHIoLTMpLDEwKXx8MX1gfSxyPWUuZD9bImRlY3J5cHQiLCJ1bndyYXBLZXkiXTpbImVuY3J5cHQiLCJ3cmFwS2V5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgdG4oJ3Vuc3VwcG9ydGVkIG9yIGludmFsaWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiRUMiOnN3aXRjaChlLmFsZyl7Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6ZS5jcnZ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFQ0RILUVTIjpjYXNlIkVDREgtRVMrQTEyOEtXIjpjYXNlIkVDREgtRVMrQTE5MktXIjpjYXNlIkVDREgtRVMrQTI1NktXIjp0PXtuYW1lOiJFQ0RIIixuYW1lZEN1cnZlOmUuY3J2fSxyPWUuZD9bImRlcml2ZUJpdHMiXTpbXTticmVhaztkZWZhdWx0OnRocm93IG5ldyB0bigndW5zdXBwb3J0ZWQgb3IgaW52YWxpZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgdG4oJ3Vuc3VwcG9ydGVkIG9yIGludmFsaWQgSldLICJrdHkiIChLZXkgVHlwZSkgUGFyYW1ldGVyIHZhbHVlJyl9cmV0dXJue2FsZ29yaXRobTp0LGtleVVzYWdlczpyfX0oZSk7bGV0IG89Imp3ayIscz17Li4uZX07cmV0dXJuIGRlbGV0ZSBzLmFsZywiUEJLREYyIj09PW4ubmFtZSYmKG89InJhdyIscz1YcihlLmspKSx1bigpLGFuLnN1YnRsZS5pbXBvcnRLZXkobyxzLG4sbnVsbCE9PSh0PWUuZXh0KSYmdm9pZCAwIT09dCYmdCxudWxsIT09KHI9ZS5rZXlfb3BzKSYmdm9pZCAwIT09cj9yOmkpfTtmdW5jdGlvbiBobihlKXtyZXR1cm4hIWUmJmUuY29uc3RydWN0b3I9PT1PYmplY3R9YXN5bmMgZnVuY3Rpb24gbG4oZSx0LHIpe2lmKCFobihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJKV0sgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih0fHwodD1lLmFsZyksInN0cmluZyIhPXR5cGVvZiB0fHwhdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciYWxnIiBhcmd1bWVudCBpcyByZXF1aXJlZCB3aGVuICJqd2suYWxnIiBpcyBub3QgcHJlc2VudCcpO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOmlmKCJzdHJpbmciIT10eXBlb2YgZS5rfHwhZS5rKXRocm93IG5ldyBUeXBlRXJyb3IoJ21pc3NpbmcgImsiIChLZXkgVmFsdWUpIFBhcmFtZXRlciB2YWx1ZScpO3JldHVybiBudWxsIT1yfHwocj0hMCE9PWUuZXh0KSxyP2NuKHsuLi5lLGFsZzp0LGV4dDohMX0pOlhyKGUuayk7Y2FzZSJSU0EiOmlmKHZvaWQgMCE9PWUub3RoKXRocm93IG5ldyB0bignUlNBIEpXSyAib3RoIiAoT3RoZXIgUHJpbWVzIEluZm8pIFBhcmFtZXRlciB2YWx1ZSBpcyB1bnN1cHBvcnRlZCcpO2Nhc2UiRUMiOmNhc2UiT0tQIjpyZXR1cm4gY24oey4uLmUsYWxnOnR9KTtkZWZhdWx0OnRocm93IG5ldyB0bigndW5zdXBwb3J0ZWQgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX19Y29uc3QgZm49ZnVuY3Rpb24oZSx0LHIsbil7aWYodm9pZCAwIT09bi5jcml0JiZ2b2lkIDA9PT1yLmNyaXQpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJyk7aWYoIXJ8fHZvaWQgMD09PXIuY3JpdClyZXR1cm4gbmV3IFNldDtpZighQXJyYXkuaXNBcnJheShyLmNyaXQpfHwwPT09ci5jcml0Lmxlbmd0aHx8ci5jcml0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKSkpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5ncyB3aGVuIHByZXNlbnQnKTtmb3IoY29uc3QgaSBvZiByLmNyaXQpe2lmKCF0LmhhcyhpKSl0aHJvdyBuZXcgdG4oYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke2l9IiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25gKTtpZih2b2lkIDA9PT1uW2ldKXRocm93IG5ldyBlKGBFeHRlbnNpb24gSGVhZGVyIFBhcmFtZXRlciAiJHtpfSIgaXMgbWlzc2luZ2ApO2lmKHQuZ2V0KGkpJiZ2b2lkIDA9PT1yW2ldKXRocm93IG5ldyBlKGBFeHRlbnNpb24gSGVhZGVyIFBhcmFtZXRlciAiJHtpfSIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkYCl9cmV0dXJuIG5ldyBTZXQoci5jcml0KX0uYmluZCh2b2lkIDAscm4sbmV3IE1hcChbWyJiNjQiLCEwXV0pKSxkbj0oKGUsdCk9PntpZih2b2lkIDAhPT10JiYoIUFycmF5LmlzQXJyYXkodCl8fHQuc29tZSgoZT0+InN0cmluZyIhPXR5cGVvZiBlKSkpKXRocm93IG5ldyBUeXBlRXJyb3IoYCIke2V9IiBvcHRpb24gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7aWYodClyZXR1cm4gbmV3IFNldCh0KX0pLmJpbmQodm9pZCAwLCJhbGdvcml0aG1zIik7YXN5bmMgZnVuY3Rpb24gcG4oZSx0LHIpe2lmKCFobihlKSl0aHJvdyBuZXcgcm4oIkZsYXR0ZW5lZCBKV1MgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih2b2lkIDA9PT1lLnByb3RlY3RlZCYmdm9pZCAwPT09ZS5oZWFkZXIpdGhyb3cgbmV3IHJuKCdGbGF0dGVuZWQgSldTIG11c3QgaGF2ZSBlaXRoZXIgb2YgdGhlICJwcm90ZWN0ZWQiIG9yICJoZWFkZXIiIG1lbWJlcnMnKTtpZih2b2lkIDAhPT1lLnByb3RlY3RlZCYmInN0cmluZyIhPXR5cGVvZiBlLnByb3RlY3RlZCl0aHJvdyBuZXcgcm4oIkpXUyBQcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7aWYodm9pZCAwPT09ZS5wYXlsb2FkKXRocm93IG5ldyBybigiSldTIFBheWxvYWQgbWlzc2luZyIpO2lmKCJzdHJpbmciIT10eXBlb2YgZS5zaWduYXR1cmUpdGhyb3cgbmV3IHJuKCJKV1MgU2lnbmF0dXJlIG1pc3Npbmcgb3IgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDAhPT1lLmhlYWRlciYmIWhuKGUuaGVhZGVyKSl0aHJvdyBuZXcgcm4oIkpXUyBVbnByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtsZXQgbj17fTtpZihlLnByb3RlY3RlZCl7Y29uc3QgdD1YcihlLnByb3RlY3RlZCk7bj1KU09OLnBhcnNlKCRyLmRlY29kZSh0KSl9aWYoISgoLi4uZSk9Pntjb25zdCB0PWUuZmlsdGVyKEJvb2xlYW4pO2lmKDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoKXJldHVybiEwO2xldCByO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9T2JqZWN0LmtleXMoZSk7aWYociYmMCE9PXIuc2l6ZSlmb3IoY29uc3QgZSBvZiB0KXtpZihyLmhhcyhlKSlyZXR1cm4hMTtyLmFkZChlKX1lbHNlIHI9bmV3IFNldCh0KX1yZXR1cm4hMH0pKG4sZS5oZWFkZXIpKXRocm93IG5ldyBybigiSldTIFByb3RlY3RlZCBhbmQgSldTIFVucHJvdGVjdGVkIEhlYWRlciBQYXJhbWV0ZXIgbmFtZXMgbXVzdCBiZSBkaXNqb2ludCIpO2NvbnN0IGk9ey4uLm4sLi4uZS5oZWFkZXJ9O2xldCBvPSEwO2lmKGZuKG4saSkuaGFzKCJiNjQiKSYmKG89bi5iNjQsImJvb2xlYW4iIT10eXBlb2YgbykpdGhyb3cgbmV3IHJuKCdUaGUgImI2NCIgKGJhc2U2NHVybC1lbmNvZGUgcGF5bG9hZCkgSGVhZGVyIFBhcmFtZXRlciBtdXN0IGJlIGEgYm9vbGVhbicpO2NvbnN0e2FsZzpzfT1pO2lmKCJzdHJpbmciIT10eXBlb2Ygc3x8IXMpdGhyb3cgbmV3IHJuKCdKV1MgImFsZyIgKEFsZ29yaXRobSkgSGVhZGVyIFBhcmFtZXRlciBtaXNzaW5nIG9yIGludmFsaWQnKTtjb25zdCBhPXImJmRuKHIuYWxnb3JpdGhtcyk7aWYoYSYmIWEuaGFzKHMpKXRocm93IG5ldyBlbignImFsZyIgKEFsZ29yaXRobSkgSGVhZGVyIFBhcmFtZXRlciBub3QgYWxsb3dlZCcpO2lmKG8pe2lmKCJzdHJpbmciIT10eXBlb2YgZS5wYXlsb2FkKXRocm93IG5ldyBybigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyIpfWVsc2UgaWYoInN0cmluZyIhPXR5cGVvZiBlLnBheWxvYWQmJiEoZS5wYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkpdGhyb3cgbmV3IHJuKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIFVpbnQ4QXJyYXkgaW5zdGFuY2UiKTsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9YXdhaXQgdChuLGUpKSwoKGUsdCk9PntpZihlLnN0YXJ0c1dpdGgoIkhTIil8fCJkaXIiPT09ZXx8ZS5zdGFydHNXaXRoKCJQQkVTMiIpfHxlLm1hdGNoKC9eQVxkezN9KD86R0NNKUtXJC8pKXtpZih0IGluc3RhbmNlb2YgVWludDhBcnJheXx8InNlY3JldCI9PT10LnR5cGUpcmV0dXJuO3Rocm93IG5ldyBUeXBlRXJyb3IoJ0NyeXB0b0tleSBvciBLZXlPYmplY3QgaW5zdGFuY2VzIGZvciBzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IGJlIG9mIHR5cGUgInNlY3JldCInKX1pZih0IGluc3RhbmNlb2YgVWludDhBcnJheSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDcnlwdG9LZXkgb3IgS2V5T2JqZWN0IGluc3RhbmNlcyBtdXN0IGJlIHVzZWQgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtcyIpO2lmKCJzZWNyZXQiPT09dC50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoJ0NyeXB0b0tleSBvciBLZXlPYmplY3QgaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobXMgbXVzdCBub3QgYmUgb2YgdHlwZSAic2VjcmV0IicpfSkocyx0KTtjb25zdCB1PWZ1bmN0aW9uKC4uLmUpe2NvbnN0IHQ9ZS5yZWR1Y2UoKChlLHtsZW5ndGg6dH0pPT5lK3QpLDApLHI9bmV3IFVpbnQ4QXJyYXkodCk7bGV0IG49MDtyZXR1cm4gZS5mb3JFYWNoKChlPT57ci5zZXQoZSxuKSxuKz1lLmxlbmd0aH0pKSxyfShWci5lbmNvZGUoZS5wcm90ZWN0ZWR8fCIiKSxWci5lbmNvZGUoIi4iKSwic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD9Wci5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQpLGM9WHIoZS5zaWduYXR1cmUpO2lmKCFhd2FpdChhc3luYyhlLHQscixuKT0+e2xldCBpO2lmKHVuKCksdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKCFlLnN0YXJ0c1dpdGgoIkhTIikpdGhyb3cgbmV3IFR5cGVFcnJvcigic3ltbWV0cmljIGtleXMgYXJlIG9ubHkgYXBwbGljYWJsZSBmb3IgSE1BQy1iYXNlZCBhbGdvcml0aG1zIik7aT1hd2FpdCBhbi5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQse2hhc2g6YFNIQS0ke2Uuc3Vic3RyKC0zKX1gLG5hbWU6IkhNQUMifSwhMSxbInZlcmlmeSJdKX1lbHNlIGk9dDtyZXR1cm4oKGUsdCk9PntpZihlLnN0YXJ0c1dpdGgoIkhTIikpe2NvbnN0IHI9cGFyc2VJbnQoZS5zdWJzdHIoLTMpLDEwKSx7bGVuZ3RoOm59PXQuYWxnb3JpdGhtO2lmKCJudW1iZXIiIT10eXBlb2Ygbnx8bjxyKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZX0gcmVxdWlyZXMgc3ltbWV0cmljIGtleXMgdG8gYmUgJHtyfSBiaXRzIG9yIGxhcmdlcmApfWlmKGUuc3RhcnRzV2l0aCgiUlMiKXx8ZS5zdGFydHNXaXRoKCJQUyIpKXtjb25zdHttb2R1bHVzTGVuZ3RoOnJ9PXQuYWxnb3JpdGhtO2lmKCJudW1iZXIiIT10eXBlb2Ygcnx8cjwyMDQ4KXRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZX0gcmVxdWlyZXMga2V5IG1vZHVsdXNMZW5ndGggdG8gYmUgMjA0OCBiaXRzIG9yIGxhcmdlcmApfX0pKGUsaSksYW4uc3VidGxlLnZlcmlmeShmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJIUzI1NiI6cmV0dXJue2hhc2g6IlNIQS0yNTYiLG5hbWU6IkhNQUMifTtjYXNlIkhTMzg0IjpyZXR1cm57aGFzaDoiU0hBLTM4NCIsbmFtZToiSE1BQyJ9O2Nhc2UiSFM1MTIiOnJldHVybntoYXNoOiJTSEEtNTEyIixuYW1lOiJITUFDIn07Y2FzZSJQUzI1NiI6cmV0dXJue2hhc2g6IlNIQS0yNTYiLG5hbWU6IlJTQS1QU1MiLHNhbHRMZW5ndGg6MzJ9O2Nhc2UiUFMzODQiOnJldHVybntoYXNoOiJTSEEtMzg0IixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOjQ4fTtjYXNlIlBTNTEyIjpyZXR1cm57aGFzaDoiU0hBLTUxMiIsbmFtZToiUlNBLVBTUyIsc2FsdExlbmd0aDo2NH07Y2FzZSJSUzI1NiI6cmV0dXJue2hhc2g6IlNIQS0yNTYiLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJSUzM4NCI6cmV0dXJue2hhc2g6IlNIQS0zODQiLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJSUzUxMiI6cmV0dXJue2hhc2g6IlNIQS01MTIiLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJFUzI1NiI6cmV0dXJue2hhc2g6IlNIQS0yNTYiLG5hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTI1NiJ9O2Nhc2UiRVMzODQiOnJldHVybntoYXNoOiJTSEEtMzg0IixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0zODQifTtjYXNlIkVTNTEyIjpyZXR1cm57aGFzaDoiU0hBLTUxMiIsbmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtNTIxIn07ZGVmYXVsdDp0aHJvdyBuZXcgdG4oYGFsZyAke2V9IGlzIHVuc3VwcG9ydGVkIGVpdGhlciBieSBKT1NFIG9yIHlvdXIgamF2YXNjcmlwdCBydW50aW1lYCl9fShlKSxpLHIsbil9KShzLHQsYyx1KSl0aHJvdyBuZXcgb247bGV0IGg7aD1vP1hyKGUucGF5bG9hZCk6InN0cmluZyI9PXR5cGVvZiBlLnBheWxvYWQ/VnIuZW5jb2RlKGUucGF5bG9hZCk6ZS5wYXlsb2FkO2NvbnN0IGw9e3BheWxvYWQ6aH07cmV0dXJuIHZvaWQgMCE9PWUucHJvdGVjdGVkJiYobC5wcm90ZWN0ZWRIZWFkZXI9biksdm9pZCAwIT09ZS5oZWFkZXImJihsLnVucHJvdGVjdGVkSGVhZGVyPWUuaGVhZGVyKSxsfWNvbnN0IGduPS9eKFxkK3xcZCtcLlxkKykgPyhzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpJC9pO3ZhciB2bj1lPT57Y29uc3QgdD1nbi5leGVjKGUpO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgdGltZSBwZXJpb2QgZm9ybWF0Iik7Y29uc3Qgcj1wYXJzZUZsb2F0KHRbMV0pO3N3aXRjaCh0WzJdLnRvTG93ZXJDYXNlKCkpe2Nhc2Uic2VjIjpjYXNlInNlY3MiOmNhc2Uic2Vjb25kIjpjYXNlInNlY29uZHMiOmNhc2UicyI6cmV0dXJuIE1hdGgucm91bmQocik7Y2FzZSJtaW51dGUiOmNhc2UibWludXRlcyI6Y2FzZSJtaW4iOmNhc2UibWlucyI6Y2FzZSJtIjpyZXR1cm4gTWF0aC5yb3VuZCg2MCpyKTtjYXNlImhvdXIiOmNhc2UiaG91cnMiOmNhc2UiaHIiOmNhc2UiaHJzIjpjYXNlImgiOnJldHVybiBNYXRoLnJvdW5kKDM2MDAqcik7Y2FzZSJkYXkiOmNhc2UiZGF5cyI6Y2FzZSJkIjpyZXR1cm4gTWF0aC5yb3VuZCg4NjQwMCpyKTtjYXNlIndlZWsiOmNhc2Uid2Vla3MiOmNhc2UidyI6cmV0dXJuIE1hdGgucm91bmQoNjA0ODAwKnIpO2RlZmF1bHQ6cmV0dXJuIE1hdGgucm91bmQoMzE1NTc2MDAqcil9fTtjb25zdCB5bj1lPT5lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXmFwcGxpY2F0aW9uXC8vLCIiKTt2YXIgbW49KGUsdCxyPXt9KT0+e2NvbnN0e3R5cDpufT1yO2lmKG4mJigic3RyaW5nIiE9dHlwZW9mIGUudHlwfHx5bihlLnR5cCkhPT15bihuKSkpdGhyb3cgbmV3IFFyKCd1bmV4cGVjdGVkICJ0eXAiIEpXVCBoZWFkZXIgdmFsdWUnLCJ0eXAiLCJjaGVja19mYWlsZWQiKTtsZXQgaTt0cnl7aT1KU09OLnBhcnNlKCRyLmRlY29kZSh0KSl9Y2F0Y2goZSl7fWlmKCJvYmplY3QiIT10eXBlb2YgaXx8IWl8fEFycmF5LmlzQXJyYXkoaSkpdGhyb3cgbmV3IG5uKCJKV1QgQ2xhaW1zIFNldCBtdXN0IGJlIGEgdG9wLWxldmVsIEpTT04gb2JqZWN0Iik7Y29uc3R7aXNzdWVyOm99PXI7aWYobyYmISgic3RyaW5nIj09dHlwZW9mIG8/W29dOm8pLmluY2x1ZGVzKGkuaXNzKSl0aHJvdyBuZXcgUXIoJ3VuZXhwZWN0ZWQgImlzcyIgY2xhaW0gdmFsdWUnLCJpc3MiLCJjaGVja19mYWlsZWQiKTtjb25zdHtzdWJqZWN0OnN9PXI7aWYocyYmaS5zdWIhPT1zKXRocm93IG5ldyBRcigndW5leHBlY3RlZCAic3ViIiBjbGFpbSB2YWx1ZScsInN1YiIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e2F1ZGllbmNlOmF9PXI7aWYoYSYmKGM9InN0cmluZyI9PXR5cGVvZiBhP1thXTphLCEoInN0cmluZyI9PXR5cGVvZih1PWkuYXVkKT9jLmluY2x1ZGVzKHUpOmMuc29tZShTZXQucHJvdG90eXBlLmhhcy5iaW5kKG5ldyBTZXQodSkpKSkpKXRocm93IG5ldyBRcigndW5leHBlY3RlZCAiYXVkIiBjbGFpbSB2YWx1ZScsImF1ZCIsImNoZWNrX2ZhaWxlZCIpO3ZhciB1LGM7bGV0IGg7c3dpdGNoKHR5cGVvZiByLmNsb2NrVG9sZXJhbmNlKXtjYXNlInN0cmluZyI6aD12bihyLmNsb2NrVG9sZXJhbmNlKTticmVhaztjYXNlIm51bWJlciI6aD1yLmNsb2NrVG9sZXJhbmNlO2JyZWFrO2Nhc2UidW5kZWZpbmVkIjpoPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIGNsb2NrVG9sZXJhbmNlIG9wdGlvbiB0eXBlIil9Y29uc3R7Y3VycmVudERhdGU6bH09cixmPShkPWx8fG5ldyBEYXRlLE1hdGguZmxvb3IoZC5nZXRUaW1lKCkvMWUzKSk7dmFyIGQ7aWYodm9pZCAwIT09aS5pYXR8fHIubWF4VG9rZW5BZ2Upe2lmKCJudW1iZXIiIT10eXBlb2YgaS5pYXQpdGhyb3cgbmV3IFFyKCciaWF0IiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiaWF0IiwiaW52YWxpZCIpO2lmKHZvaWQgMD09PWkuZXhwJiZpLmlhdD5mK2gpdGhyb3cgbmV3IFFyKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkIChpdCBzaG91bGQgYmUgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIil9aWYodm9pZCAwIT09aS5uYmYpe2lmKCJudW1iZXIiIT10eXBlb2YgaS5uYmYpdGhyb3cgbmV3IFFyKCcibmJmIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywibmJmIiwiaW52YWxpZCIpO2lmKGkubmJmPmYraCl0aHJvdyBuZXcgUXIoJyJuYmYiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQnLCJuYmYiLCJjaGVja19mYWlsZWQiKX1pZih2b2lkIDAhPT1pLmV4cCl7aWYoIm51bWJlciIhPXR5cGVvZiBpLmV4cCl0aHJvdyBuZXcgUXIoJyJleHAiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJleHAiLCJpbnZhbGlkIik7aWYoaS5leHA8PWYtaCl0aHJvdyBuZXcgc24oJyJleHAiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQnLCJleHAiLCJjaGVja19mYWlsZWQiKX1pZihyLm1heFRva2VuQWdlKXtjb25zdCBlPWYtaS5pYXQ7aWYoZS1oPigibnVtYmVyIj09dHlwZW9mIHIubWF4VG9rZW5BZ2U/ci5tYXhUb2tlbkFnZTp2bihyLm1heFRva2VuQWdlKSkpdGhyb3cgbmV3IHNuKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkICh0b28gZmFyIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpO2lmKGU8MC1oKXRocm93IG5ldyBRcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAoaXQgc2hvdWxkIGJlIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpfXJldHVybiBpfTtjbGFzcyB3bntjb25zdHJ1Y3Rvcigpe31zdGF0aWMgYmFzZTY0VVJMRW5jb2RlKGUpe3JldHVybiBQci5lbmNvZGUoZSkucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKS5yZXBsYWNlKC89L2csIiIpfXN0YXRpYyBnZXRDb2RlVmVyaWZpZXIoKXtyZXR1cm4gdGhpcy5iYXNlNjRVUkxFbmNvZGUoenIoMzIpKX1zdGF0aWMgZ2V0Q29kZUNoYWxsZW5nZShlKXtyZXR1cm4gdGhpcy5iYXNlNjRVUkxFbmNvZGUobmV3IGcoRHIoKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpKSkpfXN0YXRpYyBnZXRTdXBwb3J0ZWRTaWduYXR1cmVBbGdvcml0aG1zKCl7cmV0dXJuWyJSUzI1NiIsIlJTNTEyIiwiUlMzODQiLCJQUzI1NiJdfXN0YXRpYyBnZXRKV0tGb3JUaGVJZFRva2VuKGUsdCl7Y29uc3Qgcj1KU09OLnBhcnNlKFByLmRlY29kZShlLCJ1dGY4IikpO2Zvcihjb25zdCBlIG9mIHQpaWYoci5raWQ9PT1lLmtpZClyZXR1cm4gbG4oe2FsZzplLmFsZyxlOmUuZSxrdHk6ZS5rdHksbjplLm59KTtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN0KCJDUllQVE9fVVRJTC1HVEZUSVQtSVYwMSIsImNyeXB0by11dGlscyIsImdldEpXS0ZvclRoZUlkVG9rZW4iLCJraWQgbm90IGZvdW5kLiIsIkZhaWxlZCB0byBmaW5kIHRoZSAna2lkJyBzcGVjaWZpZWQgaW4gdGhlIGlkX3Rva2VuLiAna2lkJyBmb3VuZCBpbiB0aGUgaGVhZGVyIDogIityLmtpZCsiLCBFeHBlY3RlZCB2YWx1ZXM6ICIrdC5tYXAoKGU9PmUua2lkKSkuam9pbigiLCAiKSkpfXN0YXRpYyBpc1ZhbGlkSWRUb2tlbihlLHQscixuLGksbyl7cmV0dXJuIGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtjb25zdCBuPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSYmKGU9JHIuZGVjb2RlKGUpKSwic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IHJuKCJDb21wYWN0IEpXUyBtdXN0IGJlIGEgc3RyaW5nIG9yIFVpbnQ4QXJyYXkiKTtjb25zdHswOm4sMTppLDI6byxsZW5ndGg6c309ZS5zcGxpdCgiLiIpO2lmKDMhPT1zKXRocm93IG5ldyBybigiSW52YWxpZCBDb21wYWN0IEpXUyIpO2NvbnN0IGE9YXdhaXQgcG4oe3BheWxvYWQ6aXx8dm9pZCAwLHByb3RlY3RlZDpufHx2b2lkIDAsc2lnbmF0dXJlOm98fHZvaWQgMH0sdCxyKTtyZXR1cm57cGF5bG9hZDphLnBheWxvYWQscHJvdGVjdGVkSGVhZGVyOmEucHJvdGVjdGVkSGVhZGVyfX0oZSx0LHIpO3JldHVybntwYXlsb2FkOm1uKG4ucHJvdGVjdGVkSGVhZGVyLG4ucGF5bG9hZCxyKSxwcm90ZWN0ZWRIZWFkZXI6bi5wcm90ZWN0ZWRIZWFkZXJ9fShlLHQse2FsZ29yaXRobXM6dGhpcy5nZXRTdXBwb3J0ZWRTaWduYXR1cmVBbGdvcml0aG1zKCksYXVkaWVuY2U6cixjbG9ja1RvbGVyYW5jZTpvLGlzc3VlcjpuLHN1YmplY3Q6aX0pLnRoZW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoITApKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBTdCgiQ1JZUFRPX1VUSUwtSVZJVC1JVjAyIiwiY3J5cHRvLXV0aWxzIiwiaXNWYWxpZElkVG9rZW4iLCJWYWxpZGF0aW5nIElEIHRva2VuIGZhaWxlZCIsZSkpKSl9c3RhdGljIGRlY29kZUlEVG9rZW4oZSl7dHJ5e2NvbnN0IHQ9UHIuZGVjb2RlKGUuc3BsaXQoIi4iKVsxXSwidXRmOCIpO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBTdCgiQ1JZUFRPX1VUSUwtRElULUlWMDEiLCJjcnlwdG8tdXRpbHMiLCJkZWNvZGVJRFRva2VuIiwiRGVjb2RpbmcgSUQgdG9rZW4gZmFpbGVkLiIsZSl9fX1jbGFzcyBibntjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKGUpe3ZhciB0LHIsbixpO2NvbnN0IG89d24uZGVjb2RlSURUb2tlbihlKSxzPXRoaXMuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkKG8pLGE9bnVsbCE9PSh0PW51bGw9PW8/dm9pZCAwOm8udXNlcm5hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsdT1udWxsIT09KHI9by5naXZlbl9uYW1lKSYmdm9pZCAwIT09cj9yOiIiLGM9bnVsbCE9PShuPW8uZmFtaWx5X25hbWUpJiZ2b2lkIDAhPT1uP246IiIsaD11JiZjP2Ake3V9ICR7Y31gOnV8fGN8fCIiLGw9bnVsbCE9PShpPW8ucHJlZmVycmVkX3VzZXJuYW1lKSYmdm9pZCAwIT09aT9pOmg7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2Rpc3BsYXlOYW1lOmwsdGVuYW50RG9tYWluOnMsdXNlcm5hbWU6YX0sdGhpcy5maWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQobykpfXN0YXRpYyBmaWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQoZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO251bGw9PXR8fGRlbGV0ZSB0LmlzcyxudWxsPT10fHxkZWxldGUgdC5hdWQsbnVsbD09dHx8ZGVsZXRlIHQuZXhwLG51bGw9PXR8fGRlbGV0ZSB0LmlhdCxudWxsPT10fHxkZWxldGUgdC5hY3IsbnVsbD09dHx8ZGVsZXRlIHQuYW1yLG51bGw9PXR8fGRlbGV0ZSB0LmF6cCxudWxsPT10fHxkZWxldGUgdC5hdXRoX3RpbWUsbnVsbD09dHx8ZGVsZXRlIHQubm9uY2UsbnVsbD09dHx8ZGVsZXRlIHQuY19oYXNoLG51bGw9PXR8fGRlbGV0ZSB0LmF0X2hhc2gsbnVsbD09dHx8ZGVsZXRlIHQubmJmLG51bGw9PXR8fGRlbGV0ZSB0LmlzayxudWxsPT10fHxkZWxldGUgdC5zaWQ7Y29uc3Qgcj17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFtlLHRdKT0+e2NvbnN0IG49ZS5zcGxpdCgiXyIpLm1hcCgoKGUsdCk9PjA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKSwuLi5lLnNsaWNlKDEpXS5qb2luKCIiKSkpLmpvaW4oIiIpO3Jbbl09dH0pKSxyfXN0YXRpYyBnZXRUb2tlblJlcXVlc3RIZWFkZXJzKCl7cmV0dXJue0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9fX1ibi5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQ9KGUsdD0iQCIpPT57Y29uc3Qgcj1lLnN1Yi5zcGxpdCh0KTtyZXR1cm4gci5sZW5ndGg+Mj9yW3IubGVuZ3RoLTFdOiIifTtjbGFzcyBfbntjb25zdHJ1Y3RvcihlKXt0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PmJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCl9KSksdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGE9KCk9PmJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpfXJlc29sdmVXZWxsS25vd25FbmRwb2ludCgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIGUud2VsbEtub3duRW5kcG9pbnQ/ZS5zZXJ2ZXJPcmlnaW4rZS53ZWxsS25vd25FbmRwb2ludDplLnNlcnZlck9yaWdpbisiL29hdXRoMi90b2tlbi8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbiJ9KSl9cmVzb2x2ZUVuZHBvaW50cyhlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXt9LHI9eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIHIub3ZlcnJpZGVXZWxsRW5kcG9pbnRDb25maWcmJnIuZW5kcG9pbnRzJiZPYmplY3Qua2V5cyhyLmVuZHBvaW50cykuZm9yRWFjaCgoZT0+e2NvbnN0IG49ZS5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTt0W25dPShudWxsPT1yP3ZvaWQgMDpyLmVuZHBvaW50cyk/ci5lbmRwb2ludHNbZV06IiJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfSkpfXJlc29sdmVGYWxsYmFja0VuZHBvaW50cygpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9e30sdD15aWVsZCB0aGlzLl9jb25maWcoKTt0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKHI9Pntjb25zdCBuPXIucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtuXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW3JdOiIifSkpO2NvbnN0IHI9e2F1dGhvcml6YXRpb25fZW5kcG9pbnQ6dC5zZXJ2ZXJPcmlnaW4rIi9vYXV0aDIvYXV0aG9yaXplIixlbmRfc2Vzc2lvbl9lbmRwb2ludDp0LnNlcnZlck9yaWdpbisiL29pZGMvbG9nb3V0Iixqd2tzX3VyaTp0LnNlcnZlck9yaWdpbisiL29hdXRoMi9qd2tzIixjaGVja19zZXNzaW9uX2lmcmFtZTp0LnNlcnZlck9yaWdpbisiL29pZGMvY2hlY2tzZXNzaW9uIixyZXZvY2F0aW9uX2VuZHBvaW50OnQuc2VydmVyT3JpZ2luKyIvb2F1dGgyL3Jldm9rZSIsdG9rZW5fZW5kcG9pbnQ6dC5zZXJ2ZXJPcmlnaW4rIi9vYXV0aDIvdG9rZW4ifTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHIpfSkpfXZhbGlkYXRlSWRUb2tlbihlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKSkuandrc191cmkscj15aWVsZCB0aGlzLl9jb25maWcoKTtyZXR1cm4gdCYmMCE9PXQudHJpbSgpLmxlbmd0aD93dC5nZXQodCx7d2l0aENyZWRlbnRpYWxzOm51bGw9PXI/dm9pZCAwOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigodD0+YnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT10LnN0YXR1cylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN0KCJBVVRIX0hFTFBFUi1WSVQtTlIwMiIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsInZhbGlkYXRlSWRUb2tlbiIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciBqd2tzIHJlcXVlc3QuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byBnZXQgdGhlIGp3a3MgcmV0dXJuZWQgIit0LnN0YXR1cysiICwgd2hpY2ggaXMgaW52YWxpZC4iKSk7Y29uc3Qgcj0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkuaXNzdWVyLG49KHlpZWxkIHRoaXMucmVzb2x2ZVdlbGxLbm93bkVuZHBvaW50KCkpLnNwbGl0KCIvLndlbGwta25vd24iKVswXTtyZXR1cm4gciYmcj09PW4/d24uZ2V0SldLRm9yVGhlSWRUb2tlbihlLnNwbGl0KCIuIilbMF0sdC5kYXRhLmtleXMpLnRoZW4oKHQ9PmJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHduLmlzVmFsaWRJZFRva2VuKGUsdCwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsaWVudElELHIsd24uZGVjb2RlSURUb2tlbihlKS5zdWIsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSkudGhlbigoZT0+ZSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgU3QoIkFVVEhfSEVMUEVSLVZJVC1FUzAzIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIix2b2lkIDAsdm9pZCAwLGUpKSkpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBTdCgiQVVUSF9IRUxQRVItVklULUVTMDQiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSk6UHJvbWlzZS5yZXNvbHZlKCExKX0pKSkpLmNhdGNoKChlPT57dmFyIHQscixuO3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXQoIkFVVEhfSEVMUEVSLVZJVC1OUjA1IiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIiwiUmVxdWVzdCB0byBqd2tzIGVuZHBvaW50IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZGF0YSkpfSkpOlByb21pc2UucmVqZWN0KG5ldyBTdCgiQVVUSF9IRUxQRVItVklULU5GMDEiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLCJKV0tTIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBKV0tTIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIEpXS1MgZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIikpfSkpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlKXt2YXIgdDtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgcj0ib3BlbmlkIjtjb25zdCBuPXlpZWxkIHRoaXMuX2NvbmZpZygpLGk9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7cmV0dXJuIG4uc2NvcGUmJm4uc2NvcGUubGVuZ3RoPjAmJihuLnNjb3BlLmluY2x1ZGVzKCJvcGVuaWQiKXx8bi5zY29wZS5wdXNoKCJvcGVuaWQiKSxyPW4uc2NvcGUuam9pbigiICIpKSxlLnJlcGxhY2UoInt7dG9rZW59fSIsaS5hY2Nlc3NfdG9rZW4pLnJlcGxhY2UoInt7dXNlcm5hbWV9fSIsYm4uZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKGkuaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLHIpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsbi5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PSh0PW4uY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09dD90OiIiKX0pKX1jbGVhclVzZXJTZXNzaW9uRGF0YSgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVNlc3Npb25EYXRhKCl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT1lLnN0YXR1cylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN0KCJBVVRIX0hFTFBFUi1IVFItTlIwMSIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLCJJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgdG9rZW4gcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgdG9rZW4gcmV0dXJuZWQgIitlLnN0YXR1cysiICwgd2hpY2ggaXMgaW52YWxpZC4iKSk7aWYoKHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW4pcmV0dXJuIHRoaXMudmFsaWRhdGVJZFRva2VuKGUuZGF0YS5pZF90b2tlbikudGhlbigodD0+YnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih0KXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoZS5kYXRhKTtjb25zdCB0PXthY2Nlc3NUb2tlbjplLmRhdGEuYWNjZXNzX3Rva2VuLGV4cGlyZXNJbjplLmRhdGEuZXhwaXJlc19pbixpZFRva2VuOmUuZGF0YS5pZF90b2tlbixyZWZyZXNoVG9rZW46ZS5kYXRhLnJlZnJlc2hfdG9rZW4sc2NvcGU6ZS5kYXRhLnNjb3BlLHRva2VuVHlwZTplLmRhdGEudG9rZW5fdHlwZX07cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KX1yZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN0KCJBVVRIX0hFTFBFUi1IVFItSVYwMiIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLCJUaGUgaWQgdG9rZW4gcmV0dXJuZWQgaXMgbm90IHZhbGlkLiIsIlRoZSBpZCB0b2tlbiByZXR1cm5lZCBoYXMgZmFpbGVkIHRoZSB2YWxpZGF0aW9uIGNoZWNrLiIpKX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgU3QoIkFVVEhfSEVMUEVSLUhBVC1FUzAzIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwiaGFuZGxlVG9rZW5SZXNwb25zZSIsdm9pZCAwLHZvaWQgMCxlKSkpKTt7Y29uc3QgdD17YWNjZXNzVG9rZW46ZS5kYXRhLmFjY2Vzc190b2tlbixleHBpcmVzSW46ZS5kYXRhLmV4cGlyZXNfaW4saWRUb2tlbjplLmRhdGEuaWRfdG9rZW4scmVmcmVzaFRva2VuOmUuZGF0YS5yZWZyZXNoX3Rva2VuLHNjb3BlOmUuZGF0YS5zY29wZSx0b2tlblR5cGU6ZS5kYXRhLnRva2VuX3R5cGV9O3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoZS5kYXRhKSxQcm9taXNlLnJlc29sdmUodCl9fSkpfX1jbGFzcyBrbntjb25zdHJ1Y3RvcihlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlcj1uZXcgX24oZSksdGhpcy5fZGF0YUxheWVyPWUsdGhpcy5fY29uZmlnPSgpPT5idCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT5idCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iikscj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgU3QoIkFVVEhfQ09SRS1HQVUtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRBdXRob3JpemF0aW9uVVJMIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCBmb3VuZC4iLCJObyBhdXRob3JpemF0aW9uIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgZnJvbSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgYXV0aG9yaXphdGlvbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBuPW5ldyBVUkwodCk7bi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZXNwb25zZV90eXBlIiwiY29kZSIpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY2xpZW50X2lkIixyLmNsaWVudElEKTtsZXQgaT0ib3BlbmlkIjtpZihyLnNjb3BlJiZyLnNjb3BlLmxlbmd0aD4wJiYoci5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHIuc2NvcGUucHVzaCgib3BlbmlkIiksaT1yLnNjb3BlLmpvaW4oIiAiKSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJzY29wZSIsaSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZWRpcmVjdF91cmkiLHIuc2lnbkluUmVkaXJlY3RVUkwpLHIucmVzcG9uc2VNb2RlJiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoInJlc3BvbnNlX21vZGUiLHIucmVzcG9uc2VNb2RlKSxyLmVuYWJsZVBLQ0Upe2NvbnN0IGU9d24uZ2V0Q29kZVZlcmlmaWVyKCksdD13bi5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiLGUpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwiUzI1NiIpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY29kZV9jaGFsbGVuZ2UiLHQpfXIucHJvbXB0JiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoInByb21wdCIsci5wcm9tcHQpO2NvbnN0IG89ZTtpZihvKWZvcihjb25zdFtlLHRdb2YgT2JqZWN0LmVudHJpZXMobykpIiIhPWUmJiIiIT10JiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0LnRvU3RyaW5nKCkpO3JldHVybiBuLnRvU3RyaW5nKCl9KSl9cmVxdWVzdEFjY2Vzc1Rva2VuKGUsdCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighcnx8MD09PXIudHJpbSgpLmxlbmd0aClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN0KCJBVVRIX0NPUkUtUkFUMS1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RBY2Nlc3NUb2tlbiIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7dCYmKHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCkpO2NvbnN0IGk9W107aS5wdXNoKGBjbGllbnRfaWQ9JHtuLmNsaWVudElEfWApLG4uY2xpZW50U2VjcmV0JiZuLmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJmkucHVzaChgY2xpZW50X3NlY3JldD0ke24uY2xpZW50U2VjcmV0fWApO2NvbnN0IG89ZTtyZXR1cm4gaS5wdXNoKGBjb2RlPSR7b31gKSxpLnB1c2goImdyYW50X3R5cGU9YXV0aG9yaXphdGlvbl9jb2RlIiksaS5wdXNoKGByZWRpcmVjdF91cmk9JHtuLnNpZ25JblJlZGlyZWN0VVJMfWApLG4uZW5hYmxlUEtDRSYmKGkucHVzaChgY29kZV92ZXJpZmllcj0ke3lpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiKX1gKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlVGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigicGtjZV9jb2RlX3ZlcmlmaWVyIikpLHd0LnBvc3QocixpLmpvaW4oIiYiKSx7aGVhZGVyczpibi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOm4uc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShlKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBTdCgiQVVUSF9DT1JFLVJBVDEtRVMwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXF1ZXN0QWNjZXNzVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEV0KCJBVVRIX0NPUkUtUkFUMS1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RBY2Nlc3NUb2tlbiIsIlJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCIsIlRoZSByZXF1ZXN0IHRvIGdldCB0aGUgYWNjZXNzIHRva2VuIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsdD15aWVsZCB0aGlzLl9jb25maWcoKSxyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpO2lmKCFyLnJlZnJlc2hfdG9rZW4pcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBTdCgiQVVUSF9DT1JFLVJBVDItTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLCJObyByZWZyZXNoIHRva2VuIGZvdW5kLiIsIlRoZXJlIHdhcyBubyByZWZyZXNoIHRva2VuIGZvdW5kLiBBc2dhcmRlbyBkb2Vzbid0IHJldHVybiBhIHJlZnJlc2ggdG9rZW4gaWYgdGhlIHJlZnJlc2ggdG9rZW4gZ3JhbnQgaXMgbm90IGVuYWJsZWQuIikpO2lmKCFlfHwwPT09ZS50cmltKCkubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgU3QoIkFVVEhfQ09SRS1SQVQyLU5GMDIiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVmcmVzaEFjY2Vzc1Rva2VuIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIikpO2NvbnN0IG49W107cmV0dXJuIG4ucHVzaChgY2xpZW50X2lkPSR7dC5jbGllbnRJRH1gKSxuLnB1c2goYHJlZnJlc2hfdG9rZW49JHtyLnJlZnJlc2hfdG9rZW59YCksbi5wdXNoKCJncmFudF90eXBlPXJlZnJlc2hfdG9rZW4iKSx0LmNsaWVudFNlY3JldCYmdC5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZuLnB1c2goYGNsaWVudF9zZWNyZXQ9JHt0LmNsaWVudFNlY3JldH1gKSx3dC5wb3N0KGUsbi5qb2luKCImIikse2hlYWRlcnM6Ym4uZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpLHdpdGhDcmVkZW50aWFsczp0LnNlbmRDb29raWVzSW5SZXF1ZXN0c30pLnRoZW4oKGU9PnRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UoZSkudGhlbigoZT0+ZSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgU3QoIkFVVEhfQ09SRS1SQVQyLUVTMDMiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVmcmVzaEFjY2Vzc1Rva2VuIix2b2lkIDAsdm9pZCAwLGUpKSkpKSkuY2F0Y2goKGU9Pnt2YXIgdCxyLG47cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFdCgiQVVUSF9DT1JFLVJBVDItTlIwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLCJSZWZyZXNoIGFjY2VzcyB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZGF0YSkpfSkpfSkpfXJldm9rZUFjY2Vzc1Rva2VuKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkucmV2b2NhdGlvbl9lbmRwb2ludCx0PXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCFlfHwwPT09ZS50cmltKCkubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgU3QoIkFVVEhfQ09SRS1SQVQzLU5GMDEiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmV2b2tlQWNjZXNzVG9rZW4iLCJObyByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IGZvdW5kLiIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7Y29uc3Qgcj1bXTtyZXR1cm4gci5wdXNoKGBjbGllbnRfaWQ9JHt0LmNsaWVudElEfWApLHIucHVzaChgdG9rZW49JHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpLmFjY2Vzc190b2tlbn1gKSxyLnB1c2goInRva2VuX3R5cGVfaGludD1hY2Nlc3NfdG9rZW4iKSx3dC5wb3N0KGUsci5qb2luKCImIikse2hlYWRlcnM6Ym4uZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpLHdpdGhDcmVkZW50aWFsczp0LnNlbmRDb29raWVzSW5SZXF1ZXN0c30pLnRoZW4oKGU9PjIwMCE9PWUuc3RhdHVzP1Byb21pc2UucmVqZWN0KG5ldyBTdCgiQVVUSF9DT1JFLVJBVDMtTlIwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXZva2VBY2Nlc3NUb2tlbiIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciByZXZva2UgYWNjZXNzIHRva2VuIHJlcXVlc3QuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiByZXR1cm5lZCAiK2Uuc3RhdHVzKyIgLCB3aGljaCBpcyBpbnZhbGlkLiIpKToodGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoKSxQcm9taXNlLnJlc29sdmUoZSkpKSkuY2F0Y2goKGU9Pnt2YXIgdCxyLG47cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFdCgiQVVUSF9DT1JFLVJBVDMtTlIwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXZva2VBY2Nlc3NUb2tlbiIsIlRoZSByZXF1ZXN0IHRvIHJldm9rZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsIlRoZSByZXF1ZXN0IHNlbnQgdG8gcmV2b2tlIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZGF0YSkpfSkpfSkpfXJlcXVlc3RDdXN0b21HcmFudChlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkscj15aWVsZCB0aGlzLl9jb25maWcoKTtsZXQgbjtpZihuPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDp0LnRva2VuX2VuZHBvaW50LCFufHwwPT09bi50cmltKCkubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgU3QoIkFVVEhfQ09SRS1SQ0ctTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXF1ZXN0Q3VzdG9tR3JhbnQiLCJUb2tlbiBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIikpO2NvbnN0IGk9e2RhdGE6KHlpZWxkIFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKGUuZGF0YSkubWFwKCgoW2UsdF0pPT5idCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHI9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKHQpO3JldHVybmAke2V9PSR7cn1gfSkpKSkpKS5qb2luKCImIiksaGVhZGVyczpPYmplY3QuYXNzaWduKHt9LGJuLmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIix1cmw6bix3aXRoQ3JlZGVudGlhbHM6ci5zZW5kQ29va2llc0luUmVxdWVzdHN9O3JldHVybiBlLmF0dGFjaFRva2VuJiYoaS5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpLmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpLmFjY2Vzc190b2tlbn1gfSkpLHd0KGkpLnRoZW4oKHQ9PjIwMCE9PXQuc3RhdHVzP1Byb21pc2UucmVqZWN0KG5ldyBTdCgiQVVUSF9DT1JFLVJDRy1OUjAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byBnZXQgdGhlIGN1c3RvbSBncmFudCByZXR1cm5lZCAiK3Quc3RhdHVzKyIgLCB3aGljaCBpcyBpbnZhbGlkLiIpKTplLnJldHVybnNTZXNzaW9uP3RoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UodCkudGhlbigoZT0+ZSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgU3QoIkFVVEhfQ09SRS1SQ0ctRVMwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXF1ZXN0Q3VzdG9tR3JhbnQiLHZvaWQgMCx2b2lkIDAsZSkpKSk6UHJvbWlzZS5yZXNvbHZlKHQpKSkuY2F0Y2goKGU9Pnt2YXIgdCxyLG47cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFdCgiQVVUSF9DT1JFLVJDRy1OUjA0IiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIlRoZSBjdXN0b20gZ3JhbnQgcmVxdWVzdCBmYWlsZWQuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byBnZXQgdGhlIGN1c3RvbSBncmFudCBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9Z2V0QmFzaWNVc2VySW5mbygpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCksdD1ibi5nZXRBdXRoZW50aWNhdGVkVXNlckluZm8obnVsbD09ZT92b2lkIDA6ZS5pZF90b2tlbik7bGV0IHI9e2FsbG93ZWRTY29wZXM6ZS5zY29wZSxzZXNzaW9uU3RhdGU6ZS5zZXNzaW9uX3N0YXRlfTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+e3ZvaWQgMCE9PXRbZV0mJiIiIT09dFtlXSYmbnVsbCE9PXRbZV18fGRlbGV0ZSB0W2VdfSkpLHI9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHQpLHJ9KSl9Z2V0RGVjb2RlZElEVG9rZW4oKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSkuaWRfdG9rZW47cmV0dXJuIHduLmRlY29kZUlEVG9rZW4oZSl9KSl9Z2V0SURUb2tlbigpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSkuaWRfdG9rZW59KSl9Z2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCEwKTtjb25zdCB0PXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVXZWxsS25vd25FbmRwb2ludCgpO3JldHVybiB3dC5nZXQodCkudGhlbigoZT0+YnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gMjAwIT09ZS5zdGF0dXM/UHJvbWlzZS5yZWplY3QobmV3IFN0KCJBVVRIX0NPUkUtR09QTS1OUjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsImdldE9JRENQcm92aWRlck1ldGFEYXRhIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJlcXVlc3QuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byB0aGUgd2VsbC1rbm93biBlbmRwb2ludCB0byBnZXQgdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkICIrZS5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50cyhlLmRhdGEpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSghMCkpfSkpKSkuY2F0Y2goKCgpPT5idCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUZhbGxiYWNrRW5kcG9pbnRzKCkpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCEwKX0pKSkpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpO3JldHVybnthdXRob3JpemF0aW9uRW5kcG9pbnQ6ZS5hdXRob3JpemF0aW9uX2VuZHBvaW50LGNoZWNrU2Vzc2lvbklmcmFtZTplLmNoZWNrX3Nlc3Npb25faWZyYW1lLGVuZFNlc3Npb25FbmRwb2ludDplLmVuZF9zZXNzaW9uX2VuZHBvaW50LGludHJvc3BlY3Rpb25FbmRwb2ludDplLmludHJvc3BlY3Rpb25fZW5kcG9pbnQsaXNzdWVyOmUuaXNzdWVyLGp3a3NVcmk6ZS5qd2tzX3VyaSxyZWdpc3RyYXRpb25FbmRwb2ludDplLnJlZ2lzdHJhdGlvbl9lbmRwb2ludCxyZXZvY2F0aW9uRW5kcG9pbnQ6ZS5yZXZvY2F0aW9uX2VuZHBvaW50LHRva2VuRW5kcG9pbnQ6ZS50b2tlbl9lbmRwb2ludCx1c2VyaW5mb0VuZHBvaW50OmUudXNlcmluZm9fZW5kcG9pbnQsd2VsbEtub3duRW5kcG9pbnQ6eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZVdlbGxLbm93bkVuZHBvaW50KCl9fSkpfWdldFNpZ25PdXRVUkwoKXt2YXIgZSx0LHI7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgbj1udWxsPT09KGU9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuZW5kX3Nlc3Npb25fZW5kcG9pbnQsaT15aWVsZCB0aGlzLl9jb25maWcoKTtpZighbnx8MD09PW4udHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgU3QoIkFVVEhfQ09SRS1HU09VLU5GMDEiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwiZ2V0U2lnbk91dFVSTCIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBvPW51bGw9PT0odD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaWRfdG9rZW47aWYoIW98fDA9PT1vLnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IFN0KCJBVVRIX0NPUkUtR1NPVS1ORjAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsImdldFNpZ25PdXRVUkwiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7Y29uc3Qgcz1udWxsIT09KHI9bnVsbD09aT92b2lkIDA6aS5zaWduT3V0UmVkaXJlY3RVUkwpJiZ2b2lkIDAhPT1yP3I6bnVsbD09aT92b2lkIDA6aS5zaWduSW5SZWRpcmVjdFVSTDtpZighc3x8MD09PXMudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgU3QoIkFVVEhfQ09SRS1HU09VLU5GMDMiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwiZ2V0U2lnbk91dFVSTCIsIk5vIHNpZ24tb3V0IHJlZGlyZWN0IFVSTCBmb3VuZC4iLCJUaGUgc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGNhbm5vdCBiZSBmb3VuZCBvciB0aGUgVVJMIHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiBObyBzaWduLWluIHJlZGlyZWN0IFVSTCBoYXMgYmVlbiBmb3VuZCBlaXRoZXIuICIpO3JldHVybmAke259P2lkX3Rva2VuX2hpbnQ9JHtvfSZwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk9JHtzfSZzdGF0ZT1zaWduX291dF9zdWNjZXNzYH0pKX1zaWduT3V0KCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLmdldFNpZ25PdXRVUkwoKTtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoKSxlfSkpfWdldEFjY2Vzc1Rva2VuKCl7dmFyIGU7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGw9PT0oZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuYWNjZXNzX3Rva2VufSkpfWlzQXV0aGVudGljYXRlZCgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBCb29sZWFuKHlpZWxkIHRoaXMuZ2V0QWNjZXNzVG9rZW4oKSl9KSl9Z2V0UEtDRUNvZGUoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoInBrY2VfY29kZV92ZXJpZmllciIpfSkpfXNldFBLQ0VDb2RlKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigicGtjZV9jb2RlX3ZlcmlmaWVyIixlKX0pKX11cGRhdGVDb25maWcoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldENvbmZpZ0RhdGEoZSksZS5vdmVycmlkZVdlbGxFbmRwb2ludENvbmZpZz8obnVsbD09ZT92b2lkIDA6ZS5lbmRwb2ludHMpJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldE9JRENQcm92aWRlck1ldGFEYXRhKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVFbmRwb2ludHMoe30pKSk6KG51bGw9PWU/dm9pZCAwOmUuZW5kcG9pbnRzKSYmKHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApKX0pKX19Y2xhc3MgU257Y29uc3RydWN0b3IoZSx0KXt0aGlzLl9pZD1lLHRoaXMuX3N0b3JlPXR9c2V0RGF0YUluQnVsayhlLHQpe3ZhciByO3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPW4mJkpTT04ucGFyc2Uobiksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSksdCkscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSx0LHIpe3ZhciBuO3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGk9bnVsbCE9PShuPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1uP246bnVsbCxvPWkmJkpTT04ucGFyc2UoaSkscz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbykse1t0XTpyfSksYT1KU09OLnN0cmluZ2lmeShzKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUsYSl9KSl9cmVtb3ZlVmFsdWUoZSx0KXt2YXIgcjtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBuPW51bGwhPT0ocj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKGUpKSYmdm9pZCAwIT09cj9yOm51bGwsaT1uJiZKU09OLnBhcnNlKG4pLG89T2JqZWN0LmFzc2lnbih7fSxpKTtkZWxldGUgb1t0XTtjb25zdCBzPUpTT04uc3RyaW5naWZ5KG8pO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxzKX0pKX1fcmVzb2x2ZUtleShlKXtyZXR1cm5gJHtlfS0ke3RoaXMuX2lkfWB9c2V0Q29uZmlnRGF0YShlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShfdC5Db25maWdEYXRhKSxlKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShfdC5PSURDUHJvdmlkZXJNZXRhRGF0YSksZSl9KSl9c2V0VGVtcG9yYXJ5RGF0YShlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShfdC5UZW1wb3JhcnlEYXRhKSxlKX0pKX1zZXRTZXNzaW9uRGF0YShlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShfdC5TZXNzaW9uRGF0YSksZSl9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0oZT15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoX3QuQ29uZmlnRGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhKCl7dmFyIGU7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShfdC5PSURDUHJvdmlkZXJNZXRhRGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfWdldFRlbXBvcmFyeURhdGEoKXt2YXIgZTtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gSlNPTi5wYXJzZShudWxsIT09KGU9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KF90LlRlbXBvcmFyeURhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YSgpe3ZhciBlO3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0oZT15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoX3QuU2Vzc2lvbkRhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1yZW1vdmVDb25maWdEYXRhKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KF90LkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShfdC5PSURDUHJvdmlkZXJNZXRhRGF0YSkpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGEoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoX3QuVGVtcG9yYXJ5RGF0YSkpfSkpfXJlbW92ZVNlc3Npb25EYXRhKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KF90LlNlc3Npb25EYXRhKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShfdC5Db25maWdEYXRhKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoX3QuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KVtlXX0pKX1nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KF90LlRlbXBvcmFyeURhdGEpKTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KVtlXX0pKX1nZXRTZXNzaW9uRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShfdC5TZXNzaW9uRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSx0KXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnNldFZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoX3QuQ29uZmlnRGF0YSksZSx0KX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YVBhcmFtZXRlcihlLHQpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShfdC5PSURDUHJvdmlkZXJNZXRhRGF0YSksZSx0KX0pKX1zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGUsdCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KF90LlRlbXBvcmFyeURhdGEpLGUsdCl9KSl9c2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSx0KXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnNldFZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoX3QuU2Vzc2lvbkRhdGEpLGUsdCl9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnJlbW92ZVZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoX3QuQ29uZmlnRGF0YSksZSl9KSl9cmVtb3ZlT0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KF90Lk9JRENQcm92aWRlck1ldGFEYXRhKSxlKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShfdC5UZW1wb3JhcnlEYXRhKSxlKX0pKX1yZW1vdmVTZXNzaW9uRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnJlbW92ZVZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoX3QuU2Vzc2lvbkRhdGEpLGUpfSkpfX1jb25zdCBFbj17Y2xvY2tUb2xlcmFuY2U6MzAwLGVuYWJsZVBLQ0U6ITAscmVzcG9uc2VNb2RlOnl0LnF1ZXJ5LHNjb3BlOlsib3BlbmlkIl0sc2VuZENvb2tpZXNJblJlcXVlc3RzOiEwLHZhbGlkYXRlSURUb2tlbjohMH07Y2xhc3MgVG57Ci8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RvcmV9IHN0b3JlIC0gVGhlIHN0b3JlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgX3N0b3JlOiBTdG9yZSA9IG5ldyBEYXRhU3RvcmUoKTsKICAgICAgICAgKiBjb25zdCBhdXRoID0gbmV3IEFzZ2FyZGVvQXV0aENsaWVudDxDdXN0b21DbGllbnRDb25maWc+KF9zdG9yZSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjY29uc3RydWN0b3IKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi8KY29uc3RydWN0b3IoZSl7VG4uX2luc3RhbmNlSUQ/VG4uX2luc3RhbmNlSUQrPTE6VG4uX2luc3RhbmNlSUQ9MCx0aGlzLl9kYXRhTGF5ZXI9bmV3IFNuKGBpbnN0YW5jZV8ke1RuLl9pbnN0YW5jZUlEfWAsZSksdGhpcy5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBrbih0aGlzLl9kYXRhTGF5ZXIpCi8qKgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIFNESyB3aXRoIHRoZSBjb25maWcgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXV0aENsaWVudENvbmZpZzxUPn0gY29uZmlnIC0gVGhlIGNvbmZpZyBvYmplY3QgdG8gaW5pdGlhbGl6ZSB3aXRoLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIHNlcnZlck9yaWdpbjogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogYXdhaXQgYXV0aC5pbml0aWFsaXplKGNvbmZpZyk7CiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaW5pdGlhbGl6ZQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovfWluaXRpYWxpemUoZSl7dmFyIHQscixuO3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LEVuKSxlKSx7c2NvcGU6Wy4uLm51bGwhPT0odD1Fbi5zY29wZSkmJnZvaWQgMCE9PXQ/dDpbXSwuLi5udWxsIT09KG49bnVsbD09PShyPWUuc2NvcGUpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmZpbHRlcigoZT0+e3ZhciB0O3JldHVybiEobnVsbD09PSh0PW51bGw9PUVuP3ZvaWQgMDpFbi5zY29wZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaW5jbHVkZXMoZSkpfSkpKSYmdm9pZCAwIT09bj9uOltdXX0pKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge0RhdGFMYXllcn0gLSBUaGUgYERhdGFMYXllcmAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBkYXRhID0gYXV0aC5nZXREYXRhTGF5ZXIoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREYXRhTGF5ZXIKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9Ci8qKgogICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7R2V0QXV0aFVSTENvbmZpZ30gY29uZmlnIC0gKE9wdGlvbmFsKSBBIGNvbmZpZyBvYmplY3QgdG8gZm9yY2UgaW5pdGlhbGl6YXRpb24gYW5kIHBhc3MKICAgICAgICAgKiBjdXN0b20gcGF0aCBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIGZpZHAgcGFyYW1ldGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkwoKS50aGVuKCh1cmwpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBdXRob3JpemF0aW9uVVJMCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBdXRob3JpemF0aW9uVVJMKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gbnVsbD09dHx8ZGVsZXRlIHQuZm9yY2VJbml0LCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKT90aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0KTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0KSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHNlbmRzIGEgcmVxdWVzdCB0byBvYnRhaW4gdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UKICAgICAgICAgKiB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIGFuZCBvdGhlciByZWxldmFudCBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dGhvcml6YXRpb25Db2RlIC0gVGhlIGF1dGhvcml6YXRpb24gY29kZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblN0YXRlIC0gVGhlIHNlc3Npb24gc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLnJlcXVlc3RBY2Nlc3NUb2tlbihhdXRoQ29kZSwgc2Vzc2lvblN0YXRlKS50aGVuKCh0b2tlbik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codG9rZW4pOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXF1ZXN0QWNjZXNzVG9rZW4oZSx0KXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLHQpOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMSkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSx0KSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBjbGVhcnMgYWxsIGF1dGhlbnRpY2F0aW9uIGRhdGEgYW5kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHNpZ25PdXRVcmwgPSBhd2FpdCBhdXRoLnNpZ25PdXQoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNzaWduT3V0CiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9zaWduT3V0KCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zaWduT3V0KCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhpcyBkb2Vzbid0IGNsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBzaWduT3V0VXJsID0gYXdhaXQgYXV0aC5nZXRTaWduT3V0VVJMKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0U2lnbk91dFVSTAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0U2lnbk91dFVSTCgpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0U2lnbk91dFVSTCgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIE9JREMgc2VydmljZSBlbmRwb2ludHMgdGhhdCBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBgLndlbGwta25vd25gIGVuZHBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxPSURDRW5kcG9pbnRzPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBPSURDIHNlcnZpY2UgZW5kcG9pbnRzLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhdXRoLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBwYXlsb2FkIG9mIHRoZSBJRCB0b2tlbiBhbmQgcmV0dXJucyBpdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8RGVjb2RlZElEVG9rZW5QYXlsb2FkPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWNvZGVkIElEIHRva2VuIHBheWxvYWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERlY29kZWRJRFRva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXREZWNvZGVkSURUb2tlbigpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBhdXRoLmdldElEVG9rZW4oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRJRFRva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRJRFRva2VuKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRJRFRva2VuKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEJhc2ljVXNlckluZm8+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgYXV0aC5nZXRCYXNpY1VzZXJJbmZvKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mbwogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0QmFzaWNVc2VySW5mbygpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QmFzaWNVc2VySW5mbygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXZva2VzIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoaXMgbWV0aG9kIGFsc28gY2xlYXJzIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEF4aW9zUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJldHVybnMgdGhlIHJlc3BvbnNlIG9mIHRoZSByZXZva2UtYWNjZXNzLXRva2VuIHJlcXVlc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3Jldm9rZUFjY2Vzc1Rva2VuKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXZva2VBY2Nlc3NUb2tlbigpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgYWNjZXNzCiAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZWZyZXNoQWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlZnJlc2hBY2Nlc3NUb2tlbigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBY2Nlc3NUb2tlbigpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QWNjZXNzVG9rZW4oKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgY29uZmlnIHBhc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q3VzdG9tR3JhbnRDb25maWd9IGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXN0b20gZ3JhbnQgY29uZmlndXJhdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2UgfCBBeGlvc1Jlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICBhdHRhY2hUb2tlbjogZmFsc2UsCiAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgKiAgICAgICBncmFudF90eXBlOiAiYWNjb3VudF9zd2l0Y2giLAogICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICogICB9LAogICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgKiAgIHJldHVybnNTZXNzaW9uOiB0cnVlLAogICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0Q3VzdG9tR3JhbnQKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlcXVlc3RDdXN0b21HcmFudChlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RDdXN0b21HcmFudChlKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF3YWl0IGF1dGguaXNBdXRoZW50aWNhdGVkKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNBdXRoZW50aWNhdGVkCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9pc0F1dGhlbnRpY2F0ZWQoKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmlzQXV0aGVudGljYXRlZCgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBQS0NFIGNvZGUgZ2VuZXJhdGVkIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIFBLQ0UgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgcGtjZSA9IGF3YWl0IGdldFBLQ0VDb2RlKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0UEtDRUNvZGUKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFBLQ0VDb2RlKCl7cmV0dXJuIGJ0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRQS0NFQ29kZSgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBQS0NFIGNvZGUgdG8gdGhlIGRhdGEgc3RvcmUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGtjZSAtIFRoZSBQS0NFIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF3YWl0IGF1dGguc2V0UEtDRUNvZGUoInBrY2VfY29kZSIpCiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2V0UEtDRUNvZGUKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NldFBLQ0VDb2RlKGUpe3JldHVybiBidCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zZXRQS0NFQ29kZShlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgc2lnbi1vdXQgaXMgc3VjY2Vzc2Z1bCBvciBub3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAqCiAgICAgICAgICogKipUaGUgc2VydmVyIGFwcGVuZHMgcGF0aCBwYXJhbWV0ZXJzIHRvIHRoZSBgc2lnbk91dFJlZGlyZWN0VVJMYCBhbmQgdGhlc2UgcGF0aCBwYXJhbWV0ZXJzCiAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gYHRydWVgIGlmIHN1Y2Nlc3NmdWwsIGBmYWxzZWAgb3RoZXJ3aXNlLgogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2lzU2lnbk91dFN1Y2Nlc3NmdWwKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3N0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJiFufQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UGFydGlhbDxBdXRoQ2xpZW50Q29uZmlnPFQ+Pn0gY29uZmlnIC0gQSBjb25maWcgb2JqZWN0IHRvIHVwZGF0ZSB0aGUgU0RLIGNvbmZpZ3VyYXRpb25zIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICogICAgIGNsaWVudElEOiAiY2xpZW50IElEIiwKICAgICAgICAgKiAgICAgc2VydmVyT3JpZ2luOiAiaHR0cHM6Ly9sb2NhbGhvc3Q6OTQ0MyIKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLnVwZGF0ZUNvbmZpZyhjb25maWcpOwogICAgICAgICAqIGBgYAogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciN1cGRhdGVDb25maWcKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3VwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gYnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfSkpfX1jb25zdCBBbj0iaW5pdCI7dmFyIFJuLENuOyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oUm58fChSbj17fSkpLGZ1bmN0aW9uKGUpe2UuU2lnbkluPSJzaWduLWluIixlLlNpZ25PdXQ9InNpZ24tb3V0IixlLkluaXRpYWxpemU9ImluaXRpYWxpemUiLGUuSHR0cFJlcXVlc3RTdGFydD0iaHR0cC1yZXF1ZXN0LXN0YXJ0IixlLkh0dHBSZXF1ZXN0RmluaXNoPSJodHRwLXJlcXVlc3QtZmluaXNoIixlLkh0dHBSZXF1ZXN0RXJyb3I9Imh0dHAtcmVxdWVzdC1lcnJvciIsZS5IdHRwUmVxdWVzdFN1Y2Nlc3M9Imh0dHAtcmVxdWVzdC1zdWNjZXNzIixlLlJldm9rZUFjY2Vzc1Rva2VuPSJyZXZva2UtYWNjZXNzLXRva2VuIixlLkN1c3RvbUdyYW50PSJjdXN0b20tZ3JhbnQifShDbnx8KENuPXt9KSk7Y29uc3QgUG49ImN1c3RvbV9ncmFudF9jb25maWciO2NsYXNzIERuIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LHIsbixpLG8pe3N1cGVyKG51bGwhPW4/bjpudWxsPT1vP3ZvaWQgMDpvLm1lc3NhZ2UpLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPWUsdGhpcy5maWxlPXQsdGhpcy5tZXRob2Q9cix0aGlzLmVycm9yPW8sdGhpcy5kZXNjcmlwdGlvbj1pLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgT257Y29uc3RydWN0b3IoZSl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCl9cmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKTtpZih0LnJlZnJlc2hfdG9rZW4pe2NvbnN0IHI9cGFyc2VJbnQodC5leHBpcmVzX2luKSxuPXNldFRpbWVvdXQoKCgpPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9KSkpLDFlMyoocjw9MTA/cjpyLTEwKSk7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoa3QsSlNPTi5zdHJpbmdpZnkobikpfX0pKX1jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGt0KSl7Y29uc3QgZT1KU09OLnBhcnNlKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGt0KSk7Y2xlYXJUaW1lb3V0KGUpfX0pKX19Y2xhc3MgSW57Y29uc3RydWN0b3IoKXt9c3RhdGljIGdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSl7cmV0dXJue2Jsb2I6KG51bGw9PWU/dm9pZCAwOmUuZGF0YSlpbnN0YW5jZW9mIEJsb2I/bnVsbD09ZT92b2lkIDA6ZS5kYXRhOm51bGwsZGF0YTpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHN1Y2Nlc3M6ITB9fXN0YXRpYyBnZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpe3JldHVybihudWxsPT1lP3ZvaWQgMDplLnRvSlNPTikmJmRlbGV0ZSBlLnRvSlNPTix7ZXJyb3I6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiExfX19dmFyIFVuO2xldCBNbj1Vbj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuYXR0YWNoVG9rZW49KCk9PlByb21pc2UucmVzb2x2ZSgpLHRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5pbml0PXRoaXMuaW5pdC5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLmJpbmQodGhpcyl9c3RhdGljIGdldEluc3RhbmNlKCl7cmV0dXJuIHRoaXMuYXhpb3NJbnN0YW5jZXx8KHRoaXMuYXhpb3NJbnN0YW5jZT13dC5jcmVhdGUoe3dpdGhDcmVkZW50aWFsczohMH0pLHRoaXMuY2xpZW50SW5zdGFuY2V8fCh0aGlzLmNsaWVudEluc3RhbmNlPW5ldyBVbiksdGhpcy5heGlvc0luc3RhbmNlLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZSgodD0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLmNsaWVudEluc3RhbmNlLnJlcXVlc3RIYW5kbGVyKHQpfSkpKSksdGhpcy5heGlvc0luc3RhbmNlLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoKGU9PnRoaXMuY2xpZW50SW5zdGFuY2Uuc3VjY2Vzc0hhbmRsZXIoZSkpLChlPT50aGlzLmNsaWVudEluc3RhbmNlLmVycm9ySGFuZGxlcihlKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5hbGw9d3QuYWxsLHRoaXMuYXhpb3NJbnN0YW5jZS5zcHJlYWQ9d3Quc3ByZWFkLHRoaXMuYXhpb3NJbnN0YW5jZS5pbml0PXRoaXMuY2xpZW50SW5zdGFuY2UuaW5pdCx0aGlzLmF4aW9zSW5zdGFuY2UuZW5hYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmVuYWJsZUhhbmRsZXIsdGhpcy5heGlvc0luc3RhbmNlLmRpc2FibGVIYW5kbGVyPXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXIsdGhpcy5heGlvc0luc3RhbmNlLmRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQ9dGhpcy5jbGllbnRJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0LHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2spLHRoaXMuYXhpb3NJbnN0YW5jZX1yZXF1ZXN0SGFuZGxlcih0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKHlpZWxkIHRoaXMuYXR0YWNoVG9rZW4odCksbnVsbD09dD92b2lkIDA6dC5zaG91bGRFbmNvZGVUb0Zvcm1EYXRhKXtjb25zdCBlPW51bGw9PXQ/dm9pZCAwOnQuZGF0YSxyPW5ldyBGb3JtRGF0YTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ci5hcHBlbmQodCxlW3RdKX0pKSx0LmRhdGE9cn1yZXR1cm4gVW4uaXNIYW5kbGVyRW5hYmxlZCYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2smJnRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2sodCksdH0pKX1lcnJvckhhbmRsZXIoZSl7dGhyb3cgVW4uaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrJiZ0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9c3VjY2Vzc0hhbmRsZXIoZSl7cmV0dXJuIFVuLmlzSGFuZGxlckVuYWJsZWQmJih0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJnRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaygpKSxlfWluaXQodD0hMCxyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe1VuLmlzSGFuZGxlckVuYWJsZWQ9dCx0aGlzLmF0dGFjaFRva2VuPXJ9KSl9ZW5hYmxlSGFuZGxlcigpe1VuLmlzSGFuZGxlckVuYWJsZWQ9ITB9ZGlzYWJsZUhhbmRsZXIoKXtVbi5pc0hhbmRsZXJFbmFibGVkPSExfWRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQoZT1Vbi5ERUZBVUxUX0hBTkRMRVJfRElTQUJMRV9USU1FT1VUKXtVbi5pc0hhbmRsZXJFbmFibGVkPSExLHNldFRpbWVvdXQoKCgpPT57VW4uaXNIYW5kbGVyRW5hYmxlZD0hMH0pLGUpfXNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrKGUpe3RoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPWV9fTtNbi5ERUZBVUxUX0hBTkRMRVJfRElTQUJMRV9USU1FT1VUPTFlMyxNbj1Vbj1mdW5jdGlvbihlLHQscixuKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGgscz1vPDM/dDpudWxsPT09bj9uPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxyKTpuO2lmKCJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpcz1SZWZsZWN0LmRlY29yYXRlKGUsdCxyLG4pO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKGk9ZVthXSkmJihzPShvPDM/aShzKTpvPjM/aSh0LHIscyk6aSh0LHIpKXx8cyk7cmV0dXJuIG8+MyYmcyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixzKSxzfShbZT0+e31dLE1uKTtjbGFzcyBMbntjb25zdHJ1Y3Rvcigpe3RoaXMuX2RhdGE9bmV3IE1hcH1zZXREYXRhKHQscil7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9kYXRhLnNldCh0LHIpfSkpfWdldERhdGEodCl7dmFyIHIsbjtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsIT09KG49bnVsbD09PShyPXRoaXMuX2RhdGEpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmdldCh0KSkmJnZvaWQgMCE9PW4/bjoie30ifSkpfXJlbW92ZURhdGEodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9kYXRhLmRlbGV0ZSh0KX0pKX19Y29uc3QgSG49c2VsZjtsZXQgam47SG4ub25tZXNzYWdlPSh7ZGF0YTp0LHBvcnRzOnJ9KT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIG4saSxvO2NvbnN0IHM9clswXTtpZih0LnR5cGU9PT1Bbnx8am4pc3dpdGNoKHQudHlwZSl7Y2FzZSBBbjp0cnl7Y29uc3Qgcj1PYmplY3QuYXNzaWduKHt9LHQuZGF0YSk7am49eWllbGQodD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj1uZXcgTG4sbj1uZXcgVG4ocik7eWllbGQgbi5pbml0aWFsaXplKHQpO2NvbnN0IGk9bmV3IE9uKG4pLG89bi5nZXREYXRhTGF5ZXIoKSxzPU1uLmdldEluc3RhbmNlKCk7KG51bGw9PXM/dm9pZCAwOnMuaW5pdCkmJih5aWVsZCBzLmluaXQoITAsKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe09iamVjdC5hc3NpZ24oe2F0dGFjaFRva2VuOiEwfSx0KS5hdHRhY2hUb2tlbiYmKHQuaGVhZGVycz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5oZWFkZXJzKSx7QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7eWllbGQgbi5nZXRBY2Nlc3NUb2tlbigpfWB9KSl9KSkpKSk7Y29uc3QgYT10PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgcixzLGE7bGV0IHU9ITAsYz0hMTtjb25zdCBoPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpO2lmKG51bGw9PXQ/dm9pZCAwOnQudG9rZW5FbmRwb2ludCl7dT0hMTtmb3IoY29uc3QgZSBvZlsuLi5udWxsIT09KHM9bnVsbD09PShyPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1zP3M6W10sbnVsbD09aD92b2lkIDA6aC5zZXJ2ZXJPcmlnaW5dKWlmKG51bGw9PT0oYT10LnRva2VuRW5kcG9pbnQpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLnN0YXJ0c1dpdGgoZSkpe2M9ITA7YnJlYWt9fXJldHVybiB0LnNob3VsZFJlcGxheUFmdGVyUmVmcmVzaCYmby5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKFBuLEpTT04uc3RyaW5naWZ5KHQpKSx1fHxjP24ucmVxdWVzdEN1c3RvbUdyYW50KHQpLnRoZW4oKHI9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0LnJldHVybnNTZXNzaW9uPyhpLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKSxuLmdldEJhc2ljVXNlckluZm8oKSk6cn0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBEbigiV09SS0VSX0NPUkUtUkNHLUlWMDEiLCJ3b3JrZXItY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIHRva2VuIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpLHU9KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RyeXt5aWVsZCBuLnJlZnJlc2hBY2Nlc3NUb2tlbigpO2NvbnN0IGU9eWllbGQgYygpO3JldHVybiBlJiYoeWllbGQgYShlKSksaS5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KCksbi5nZXRCYXNpY1VzZXJJbmZvKCl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX0pKSxjPSgpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIG8uZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihQbik7cmV0dXJuIGU/SlNPTi5wYXJzZShlKTpudWxsfSkpO3JldHVybntkaXNhYmxlSHR0cEhhbmRsZXI6KCk9PntzLmRpc2FibGVIYW5kbGVyJiZzLmRpc2FibGVIYW5kbGVyKCl9LGVuYWJsZUh0dHBIYW5kbGVyOigpPT57cy5lbmFibGVIYW5kbGVyJiZzLmVuYWJsZUhhbmRsZXIoKX0sZ2V0QWNjZXNzVG9rZW46KCk9Pm4uZ2V0QWNjZXNzVG9rZW4oKSxnZXRBdXRob3JpemF0aW9uVVJMOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuLmdldEF1dGhvcml6YXRpb25VUkwodCkudGhlbigodD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJue2F1dGhvcml6YXRpb25VUkw6dCxwa2NlOnlpZWxkIG4uZ2V0UEtDRUNvZGUoKX19KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKX0pKSxnZXRCYXNpY1VzZXJJbmZvOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbi5nZXRCYXNpY1VzZXJJbmZvKCl9KSksZ2V0Q29uZmlnRGF0YTooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG8uZ2V0Q29uZmlnRGF0YSgpfSkpLGdldERlY29kZWRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbi5nZXREZWNvZGVkSURUb2tlbigpfSkpLGdldElEVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuLmdldElEVG9rZW4oKX0pKSxnZXRPSURDU2VydmljZUVuZHBvaW50czooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG4uZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKSxnZXRTaWduT3V0VVJMOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgbi5nZXRTaWduT3V0VVJMKCl9KSksaHR0cFJlcXVlc3Q6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUscixuO2xldCBpPSExO2NvbnN0IGE9eWllbGQgby5nZXRDb25maWdEYXRhKCk7Zm9yKGNvbnN0IHMgb2ZbLi4ubnVsbCE9PShyPW51bGw9PT0oZT15aWVsZCBvLmdldENvbmZpZ0RhdGEoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09cj9yOltdLG51bGw9PWE/dm9pZCAwOmEuc2VydmVyT3JpZ2luXSlpZihudWxsPT09KG49bnVsbD09dD92b2lkIDA6dC51cmwpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnN0YXJ0c1dpdGgocykpe2k9ITA7YnJlYWt9cmV0dXJuIGk/cy5yZXF1ZXN0KHQpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChlPT57dmFyIHI7cmV0dXJuIDQwMSE9PShudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzKSYmKG51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpP1Byb21pc2UucmVqZWN0KGUpOnUoKS50aGVuKCgoKT0+cy5yZXF1ZXN0KHQpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBEbigiV09SS0VSX0NPUkUtSFItRVMwMSIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCIiLCIiLGUpKSkpfSkpOlByb21pc2UucmVqZWN0KG5ldyBEbigiV09SS0VSX0NPUkUtSFItSVYwMiIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKSxodHRwUmVxdWVzdEFsbDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSxyLGk7bGV0IGE9ITA7Y29uc3QgdT15aWVsZCBvLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgbiBvZiB0KXtsZXQgdD0hMTtmb3IoY29uc3QgcyBvZlsuLi5udWxsIT09KHI9bnVsbD09PShlPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1yP3I6W10sbnVsbD09dT92b2lkIDA6dS5zZXJ2ZXJPcmlnaW5dKWlmKG51bGw9PT0oaT1uLnVybCl8fHZvaWQgMD09PWk/dm9pZCAwOmkuc3RhcnRzV2l0aChzKSl7dD0hMDticmVha31pZighdCl7YT0hMTticmVha319Y29uc3QgYz1bXTtyZXR1cm4gYT8odC5mb3JFYWNoKChlPT57Yy5wdXNoKHMucmVxdWVzdChlKSl9KSksKG51bGw9PXM/dm9pZCAwOnMuYWxsKSYmcy5hbGwoYykudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKGU9Pnt2YXIgdDtyZXR1cm4gNDAxPT09KG51bGw9PT0odD1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5zdGF0dXMpP24ucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigoKCk9PnMuYWxsJiZzLmFsbChjKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgRG4oIldPUktFUl9DT1JFLUhSQS1FUzAxIiwid29ya2VyLWNvcmUiLCJodHRwUmVxdWVzdEFsbCIsIiIsIiIsZSkpKSk6UHJvbWlzZS5yZWplY3QoZSl9KSkpOlByb21pc2UucmVqZWN0KG5ldyBEbigiV09SS0VSX0NPUkUtSFJBLUlWMDIiLCJ3b3JrZXItY29yZSIsImh0dHBSZXF1ZXN0IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSksaXNBdXRoZW50aWNhdGVkOigpPT5uLmlzQXV0aGVudGljYXRlZCgpLHJlZnJlc2hBY2Nlc3NUb2tlbjp1LHJlcXVlc3RBY2Nlc3NUb2tlbjoodCxyLHMpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpO3JldHVybiBzJiZlLmVuYWJsZVBLQ0UmJih5aWVsZCBuLnNldFBLQ0VDb2RlKHMpKSx0P24ucmVxdWVzdEFjY2Vzc1Rva2VuKHQsbnVsbCE9cj9yOiIiKS50aGVuKCgoKT0+KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBEbigiV09SS0VSX0NPUkUtUkFUMS1ORjAxIiwid29ya2VyLWNvcmUiLCJyZXF1ZXN0QWNjZXNzVG9rZW4iLCJObyBhdXRob3JpemF0aW9uIGNvZGUuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlIHdhcyBmb3VuZC4iKSl9KSkscmVxdWVzdEN1c3RvbUdyYW50OmEscmV2b2tlQWNjZXNzVG9rZW46KCk9Pm4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KGkuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksUHJvbWlzZS5yZXNvbHZlKCEwKSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSxzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrOmU9PnsobnVsbD09cz92b2lkIDA6cy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSYmcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s6ZT0+eyhudWxsPT1zP3ZvaWQgMDpzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaykmJnMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjazplPT57KG51bGw9PXM/dm9pZCAwOnMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2spJiZzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpfSxzZXRTZXNzaW9uU3RhdGU6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgby5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCl9KSksc2lnbk91dDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGkuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCkseWllbGQgbi5zaWduT3V0KCl9KSksc3RhcnRBdXRvUmVmcmVzaFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpfSkpLHVwZGF0ZUNvbmZpZzp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBuLnVwZGF0ZUNvbmZpZyh0KX0pKX19KSkpKHIpLGpuLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soQm4pLGpuLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayh4biksam4uc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2socW4pLHMucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0X2F1dGhfdXJsIjpqbi5nZXRBdXRob3JpemF0aW9uVVJMKG51bGw9PXQ/dm9pZCAwOnQuZGF0YSkudGhlbigoZT0+e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmVxdWVzdF9nZXRfdG9rZW4iOmpuLnJlcXVlc3RBY2Nlc3NUb2tlbihudWxsPT09KG49bnVsbD09dD92b2lkIDA6dC5kYXRhKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jb2RlLG51bGw9PT0oaT1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLnNlc3Npb25TdGF0ZSxudWxsPT09KG89bnVsbD09dD92b2lkIDA6dC5kYXRhKXx8dm9pZCAwPT09bz92b2lkIDA6by5wa2NlKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShJbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJodHRwLXJlcXVlc3QiOmpuLmh0dHBSZXF1ZXN0KHQuZGF0YSkudGhlbigoZT0+e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiaHR0cC1yZXF1ZXN0LWFsbCI6am4uaHR0cFJlcXVlc3RBbGwodC5kYXRhKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShJbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBqbi5zaWduT3V0KCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVxdWVzdC1jdXN0b20tZ3JhbnQiOmpuLnJlcXVlc3RDdXN0b21HcmFudCh0LmRhdGEpLnRoZW4oKGU9PntzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57cy5wb3N0TWVzc2FnZShJbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJldm9rZS1hY2Nlc3MtdG9rZW4iOmpuLnJldm9rZUFjY2Vzc1Rva2VuKCkudGhlbigoZT0+e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgam4uZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtYmFzaWMtdXNlci1pbmZvIjp0cnl7cy5wb3N0TWVzc2FnZShJbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIGpuLmdldEJhc2ljVXNlckluZm8oKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtZGVjb2RlZC1pZC10b2tlbiI6dHJ5e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBqbi5nZXREZWNvZGVkSURUb2tlbigpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShJbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBqbi5nZXRJRFRva2VuKCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZW5hYmxlX2h0dHBfaGFuZGxlciI6am4uZW5hYmxlSHR0cEhhbmRsZXIoKSxzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJkaXNhYmxlX2h0dHBfaGFuZGxlciI6am4uZGlzYWJsZUh0dHBIYW5kbGVyKCkscy5wb3N0TWVzc2FnZShJbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpO2JyZWFrO2Nhc2UiaXNfYXV0aGVudGljYXRlZCI6dHJ5e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBqbi5pc0F1dGhlbnRpY2F0ZWQoKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfc2lnbl9vdXRfdXJsIjp0cnl7cy5wb3N0TWVzc2FnZShJbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIGpuLmdldFNpZ25PdXRVUkwoKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJyZWZyZXNoX2FjY2Vzcy10b2tlbiI6dHJ5e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBqbi5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzdGFydF9hdXRvX3JlZnJlc2hfdG9rZW4iOnRyeXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2Uoam4uc3RhcnRBdXRvUmVmcmVzaFRva2VuKCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2Uic2V0X3Nlc3Npb25fc3RhdGUiOnRyeXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgam4uc2V0U2Vzc2lvblN0YXRlKG51bGw9PXQ/dm9pZCAwOnQuZGF0YSkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UidXBkYXRlX2NvbmZpZyI6dHJ5e3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBqbi51cGRhdGVDb25maWcobnVsbD09dD92b2lkIDA6dC5kYXRhKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfY29uZmlnX2RhdGEiOnRyeXtzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgam4uZ2V0Q29uZmlnRGF0YSgpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShJbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztkZWZhdWx0Om51bGw9PXN8fHMucG9zdE1lc3NhZ2UoSW4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgRG4oIkNMSUVOVF9XT1JLRVItT05NU0ctSVYwMiIsImNsaWVudC53b3JrZXIiLCJvbm1lc3NhZ2UiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIixgVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgJHt0LnR5cGV9LCBpcyBpbnZhbGlkLmApKSl9ZWxzZSBzLnBvc3RNZXNzYWdlKEluLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IERuKCJDTElFTlRfV09SS0VSLU9OTVNHLU5GMDEiLCJjbGllbnQud29ya2VyIix0LnR5cGUsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSl9KSk7Y29uc3QgeG49KCk9PntIbi5wb3N0TWVzc2FnZSh7dHlwZToicmVxdWVzdC1zdGFydCJ9KX0scW49ZT0+e0huLnBvc3RNZXNzYWdlKHtkYXRhOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksdHlwZToicmVxdWVzdC1zdWNjZXNzIn0pfSxCbj0oKT0+e0huLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX07cmV0dXJue319KCk7Cgo=",ln=null,nn=!1,function(t){return on=on||tn(en,ln,nn),new Worker(on,t)});const cn={checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,sessionRefreshInterval:300,storage:t.Storage.SessionStorage},an="primaryInstance";class sn{constructor(t){this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=t}_isInitialized(){return e(this,void 0,void 0,(function*(){if(!this._startedInitialize)return!1;let t=0;for(;!this._initialized;)10===t&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((t=>setTimeout(t,1e3))),t++;return!0}))}_validateMethod(){return e(this,void 0,void 0,(function*(){return(yield this._isInitialized())&&!!(yield this.isAuthenticated())||Promise.reject()}))}
407
407
  /**
408
408
  * This method returns the instance of the singleton class.
409
409
  *
@@ -419,7 +419,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
419
419
  * @memberof AsgardeoSPAClient
420
420
  *
421
421
  * @preserve
422
- */static getInstance(t){var e,i;return t&&(null===(e=this._instances)||void 0===e?void 0:e.get(t))?this._instances.get(t):!t&&(null===(i=this._instances)||void 0===i?void 0:i.get(un))?this._instances.get(un):t?(this._instances.set(t,new mn(t)),this._instances.get(t)):(this._instances.set(un,new mn(un)),this._instances.get(un))}
422
+ */static getInstance(t){var e,i;return t&&(null===(e=this._instances)||void 0===e?void 0:e.get(t))?this._instances.get(t):!t&&(null===(i=this._instances)||void 0===i?void 0:i.get(an))?this._instances.get(an):t?(this._instances.set(t,new sn(t)),this._instances.get(t)):(this._instances.set(an,new sn(an)),this._instances.get(an))}
423
423
  /**
424
424
  * This method initializes the `AsgardeoSPAClient` instance.
425
425
  *
@@ -441,7 +441,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
441
441
  * @memberof AsgardeoSPAClient
442
442
  *
443
443
  * @preserve
444
- */initialize(i){var l;return e(this,void 0,void 0,(function*(){if(this._storage=null!==(l=i.storage)&&void 0!==l?l:t.Storage.SessionStorage,this._initialized=!1,this._startedInitialize=!0,this._storage!==t.Storage.WebWorker){if(!this._client){const t=i,e=Object.assign({},rn);this._client=yield nn(Object.assign(Object.assign({},e),t))}return this._initialized=!0,this._onInitialize&&this._onInitialize(!0),Promise.resolve(!0)}if(!this._client){const l=i;return this._client=(i=>{var l;let n;const o=null!==(l=null==i?void 0:i.requestTimeout)&&void 0!==l?l:6e4;let d=!0;const c=_l((()=>e(void 0,void 0,void 0,(function*(){const t={type:Nl};try{return yield s(t)}catch(t){return Ol.getSignOutURL()}}))),i.storage,(t=>Z(t))),a=new Zn,s=t=>{const e=new MessageChannel;return a.postMessage(t,[e.port2]),new Promise(((t,i)=>{const l=setTimeout((()=>{i(new El("WEB_WORKER_CLIENT-COM-TO-01","web-worker-client","communicate","Operation timed out.","No response was received from the web worker for "+o/1e3+" since dispatching the request"))}),o);return e.port1.onmessage=({data:e})=>{if(clearTimeout(l),null==e?void 0:e.success){const i=(null==e?void 0:e.data)?JSON.parse(null==e?void 0:e.data):null;(null==e?void 0:e.blob)&&(i.data=null==e?void 0:e.blob),t(i)}else i(e.error?JSON.parse(e.error):null)}}))},Z=t=>s({data:t,type:"set_session_state"}),r=()=>s({type:"start_auto_refresh_token"}),u=()=>e(void 0,void 0,void 0,(function*(){var t,i,l,n;const o=yield h(),d=yield b();c.initialize(d.clientID,null!==(t=o.checkSessionIframe)&&void 0!==t?t:"",(()=>e(void 0,void 0,void 0,(function*(){return(yield I()).sessionState}))),null!==(i=d.checkSessionInterval)&&void 0!==i?i:3,null!==(l=d.sessionRefreshInterval)&&void 0!==l?l:300,d.signInRedirectURL,null!==(n=o.authorizationEndpoint)&&void 0!==n?n:"",d.enablePKCE)})),m=(t,i)=>e(void 0,void 0,void 0,(function*(){const e=yield b(),l={data:{code:t,pkce:e.enablePKCE?Ol.getPKCE():void 0,sessionState:i},type:"request_get_token"};return e.enablePKCE&&Ol.removePKCE(),s(l).then((t=>s({type:"get_sign_out_url"}).then((i=>(Ol.setSignOutURL(i),e.enableOIDCSessionManagement&&u(),r(),Promise.resolve(t)))).catch((t=>Promise.reject(t))))).catch((t=>Promise.reject(t)))})),h=()=>s({type:"get-oidc-service-endpoints"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),b=()=>s({type:"get_config_data"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),I=()=>s({type:"get-basic-user-info"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),G=()=>s({type:"is_authenticated"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t)));return{disableHttpHandler:()=>s({type:"disable_http_handler"}).then((()=>(d=!1,Promise.resolve(!0)))).catch((t=>Promise.reject(t))),enableHttpHandler:()=>s({type:"enable_http_handler"}).then((()=>(d=!0,Promise.resolve(!0)))).catch((t=>Promise.reject(t))),getBasicUserInfo:I,getDecodedIDToken:()=>s({type:"get-decoded-id-token"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),getIDToken:()=>s({type:"get_id_token"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),getOIDCServiceEndpoints:h,httpRequest:t=>s({data:t,type:"http-request"}).then((t=>Promise.resolve(t))).catch((t=>e(void 0,void 0,void 0,(function*(){return d&&("function"==typeof n.requestErrorCallback&&(yield n.requestErrorCallback(t)),"function"==typeof n.requestFinishCallback&&n.requestFinishCallback()),Promise.reject(t)})))),httpRequestAll:t=>s({data:t,type:"http-request-all"}).then((t=>Promise.resolve(t))).catch((t=>e(void 0,void 0,void 0,(function*(){return d&&("function"==typeof n.requestErrorCallback&&(yield n.requestErrorCallback(t)),"function"==typeof n.requestFinishCallback&&n.requestFinishCallback()),Promise.reject(t)})))),initialize:()=>(n||(n={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),a.onmessage=({data:t})=>{switch(t.type){case"request-finish":(null==n?void 0:n.requestFinishCallback)&&(null==n||n.requestFinishCallback());break;case"request-start":(null==n?void 0:n.requestStartCallback)&&(null==n||n.requestStartCallback());break;case"request-success":(null==n?void 0:n.requestSuccessCallback)&&(null==n||n.requestSuccessCallback(t.data?JSON.parse(t.data):null))}},s({data:i,type:"init"}).then((()=>Promise.resolve(!0))).catch((t=>Promise.reject(t)))),isAuthenticated:G,refreshAccessToken:()=>s({type:"refresh_access-token"}),requestCustomGrant:t=>s({data:t,type:"request-custom-grant"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),revokeAccessToken:()=>s({type:"revoke-access-token"}).then((t=>(c.reset(),Promise.resolve(t)))).catch((t=>Promise.reject(t))),setHttpRequestErrorCallback:t=>{t&&"function"==typeof t&&(n.requestErrorCallback=t)},setHttpRequestFinishCallback:t=>{t&&"function"==typeof t&&(n.requestFinishCallback=t)},setHttpRequestStartCallback:t=>{t&&"function"==typeof t&&(n.requestStartCallback=t)},setHttpRequestSuccessCallback:t=>{t&&"function"==typeof t&&(n.requestSuccessCallback=t)},signIn:(i,l,n)=>e(void 0,void 0,void 0,(function*(){var o,d;const a=yield b(),h=yield c.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){return Z(t)}))));if(h)return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const p=new URL(window.location.href).searchParams.get(Ml),y=new URL(window.location.href).searchParams.get(Ql);if(p){const t=new URL(window.location.href);return t.searchParams.delete(Ml),t.searchParams.delete(Ql),history.pushState(null,document.title,t.toString()),Promise.reject(new El("WEB_WORKER_CLIENT-SI-BE","web-worker-client","signIn",p,null!=y?y:""))}if(yield G())return yield r(),a.enableOIDCSessionManagement&&u(),I();let X,g;return(null==a?void 0:a.responseMode)===t.ResponseMode.formPost&&l?(X=l,g=null!=n?n:""):(X=null!==(o=new URL(window.location.href).searchParams.get(Ve))&&void 0!==o?o:"",g=null!==(d=new URL(window.location.href).searchParams.get(Ce))&&void 0!==d?d:"",Ol.removeAuthorizationCode()),X?m(X,g):s({data:i,type:Hl}).then((t=>e(void 0,void 0,void 0,(function*(){return t.pkce&&a.enablePKCE&&Ol.setPKCE(t.pkce),location.href=t.authorizationURL,yield Ol.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((t=>Promise.reject(t)))})),signOut:()=>G().then((t=>e(void 0,void 0,void 0,(function*(){return t?s({type:Nl}).then((t=>e(void 0,void 0,void 0,(function*(){return window.location.href=t,yield Ol.waitTillPageRedirect(),Promise.resolve(!0)})))).catch((t=>Promise.reject(t))):(window.location.href=Ol.getSignOutURL(),yield Ol.waitTillPageRedirect(),Promise.resolve(!0))})))).catch((t=>Promise.reject(t))),trySignInSilently:()=>e(void 0,void 0,void 0,(function*(){var t;const i=yield b();if(Ol.isInitializedSilentSignIn())return yield c.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const l=document.getElementById(xl),n=null===(t=null==l?void 0:l.contentDocument)||void 0===t?void 0:t.getElementById(wl),o={data:{prompt:"none",state:zl},type:Hl};try{const t=yield s(o);t.pkce&&i.enablePKCE&&Ol.setPKCE(t.pkce);const e=t.authorizationURL,l=new URL(e);l.searchParams.set("response_mode","query");const d=l.toString();n.src=d}catch(t){return Promise.reject(t)}return new Promise(((t,i)=>{const l=setTimeout((()=>{t(!1)}),1e4),n=o=>e(void 0,void 0,void 0,(function*(){var e,d,c;const a=o.data;(null==a?void 0:a.type)==Ul&&(window.removeEventListener("message",n),clearTimeout(l),t(!1)),(null==a?void 0:a.type)==Ll&&(null===(e=null==a?void 0:a.data)||void 0===e?void 0:e.code)&&m(null===(d=null==a?void 0:a.data)||void 0===d?void 0:d.code,null===(c=null==a?void 0:a.data)||void 0===c?void 0:c.sessionState).then((e=>{window.removeEventListener("message",n),t(e)})).catch((t=>{window.removeEventListener("message",n),i(t)})).finally((()=>{clearTimeout(l)}))}));window.addEventListener("message",n)}))})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield b(),i=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),l=Object.assign(Object.assign({},e),t),n={data:l,type:"update_config"};yield s(n),l.enableOIDCSessionManagement&&i&&(c.reset(),u())}))}})(Object.assign(Object.assign({},rn),l)),this._client.initialize().then((()=>(this._onInitialize&&this._onInitialize(!0),this._initialized=!0,Promise.resolve(!0)))).catch((t=>Promise.reject(t)))}return Promise.resolve(!0)}))}
444
+ */initialize(i){var l;return e(this,void 0,void 0,(function*(){if(this._storage=null!==(l=i.storage)&&void 0!==l?l:t.Storage.SessionStorage,this._initialized=!1,this._startedInitialize=!0,this._storage!==t.Storage.WebWorker){if(!this._client){const t=i,e=Object.assign({},cn);this._client=yield $l(Object.assign(Object.assign({},e),t))}return this._initialized=!0,this._onInitialize&&this._onInitialize(!0),Promise.resolve(!0)}if(!this._client){const l=i;return this._client=(i=>{var l;let n;const o=null!==(l=null==i?void 0:i.requestTimeout)&&void 0!==l?l:6e4;let d=!0,c=!1;const a=jl((()=>e(void 0,void 0,void 0,(function*(){const t={type:Kl};try{return yield r(t)}catch(t){return Ml.getSignOutURL()}}))),i.storage,(t=>Z(t))),s=new dn,r=t=>{const e=new MessageChannel;return s.postMessage(t,[e.port2]),new Promise(((t,i)=>{const l=setTimeout((()=>{i(new Pl("WEB_WORKER_CLIENT-COM-TO-01","web-worker-client","communicate","Operation timed out.","No response was received from the web worker for "+o/1e3+" since dispatching the request"))}),o);return e.port1.onmessage=({data:e})=>{if(clearTimeout(l),null==e?void 0:e.success){const i=(null==e?void 0:e.data)?JSON.parse(null==e?void 0:e.data):null;(null==e?void 0:e.blob)&&(i.data=null==e?void 0:e.blob),t(i)}else i(e.error?JSON.parse(e.error):null)}}))},Z=t=>r({data:t,type:"set_session_state"}),u=()=>r({type:"start_auto_refresh_token"}),b=()=>e(void 0,void 0,void 0,(function*(){var t,i,l,n;const o=yield m(),d=yield I();a.initialize(d.clientID,null!==(t=o.checkSessionIframe)&&void 0!==t?t:"",(()=>e(void 0,void 0,void 0,(function*(){return(yield p()).sessionState}))),null!==(i=d.checkSessionInterval)&&void 0!==i?i:3,null!==(l=d.sessionRefreshInterval)&&void 0!==l?l:300,d.signInRedirectURL,null!==(n=o.authorizationEndpoint)&&void 0!==n?n:"",d.enablePKCE)})),h=(t,i)=>e(void 0,void 0,void 0,(function*(){const e=yield I(),l={data:{code:t,pkce:e.enablePKCE?Ml.getPKCE():void 0,sessionState:i},type:"request_get_token"};return e.enablePKCE&&Ml.removePKCE(),r(l).then((t=>r({type:"get_sign_out_url"}).then((i=>(Ml.setSignOutURL(i),e.enableOIDCSessionManagement&&b(),u(),Promise.resolve(t)))).catch((t=>Promise.reject(t))))).catch((t=>Promise.reject(t)))})),m=()=>r({type:"get-oidc-service-endpoints"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),I=()=>r({type:"get_config_data"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),p=()=>r({type:"get-basic-user-info"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),G=()=>r({type:"is_authenticated"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t)));return{disableHttpHandler:()=>r({type:"disable_http_handler"}).then((()=>(d=!1,Promise.resolve(!0)))).catch((t=>Promise.reject(t))),enableHttpHandler:()=>r({type:"enable_http_handler"}).then((()=>(d=!0,Promise.resolve(!0)))).catch((t=>Promise.reject(t))),getBasicUserInfo:p,getDecodedIDToken:()=>r({type:"get-decoded-id-token"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),getIDToken:()=>r({type:"get_id_token"}).then((t=>Promise.resolve(t))).catch((t=>Promise.reject(t))),getOIDCServiceEndpoints:m,httpRequest:t=>r({data:t,type:"http-request"}).then((t=>Promise.resolve(t))).catch((t=>e(void 0,void 0,void 0,(function*(){return d&&("function"==typeof n.requestErrorCallback&&(yield n.requestErrorCallback(t)),"function"==typeof n.requestFinishCallback&&n.requestFinishCallback()),Promise.reject(t)})))),httpRequestAll:t=>r({data:t,type:"http-request-all"}).then((t=>Promise.resolve(t))).catch((t=>e(void 0,void 0,void 0,(function*(){return d&&("function"==typeof n.requestErrorCallback&&(yield n.requestErrorCallback(t)),"function"==typeof n.requestFinishCallback&&n.requestFinishCallback()),Promise.reject(t)})))),initialize:()=>(n||(n={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),s.onmessage=({data:t})=>{switch(t.type){case"request-finish":(null==n?void 0:n.requestFinishCallback)&&(null==n||n.requestFinishCallback());break;case"request-start":(null==n?void 0:n.requestStartCallback)&&(null==n||n.requestStartCallback());break;case"request-success":(null==n?void 0:n.requestSuccessCallback)&&(null==n||n.requestSuccessCallback(t.data?JSON.parse(t.data):null))}},r({data:i,type:"init"}).then((()=>Promise.resolve(!0))).catch((t=>Promise.reject(t)))),isAuthenticated:G,refreshAccessToken:()=>r({type:"refresh_access-token"}),requestCustomGrant:t=>r({data:t,type:"request-custom-grant"}).then((e=>(t.preventSignOutURLUpdate&&(c=!0),Promise.resolve(e)))).catch((t=>Promise.reject(t))),revokeAccessToken:()=>r({type:"revoke-access-token"}).then((t=>(a.reset(),Promise.resolve(t)))).catch((t=>Promise.reject(t))),setHttpRequestErrorCallback:t=>{t&&"function"==typeof t&&(n.requestErrorCallback=t)},setHttpRequestFinishCallback:t=>{t&&"function"==typeof t&&(n.requestFinishCallback=t)},setHttpRequestStartCallback:t=>{t&&"function"==typeof t&&(n.requestStartCallback=t)},setHttpRequestSuccessCallback:t=>{t&&"function"==typeof t&&(n.requestSuccessCallback=t)},signIn:(i,l,n)=>e(void 0,void 0,void 0,(function*(){var o,d;const c=yield I(),s=yield a.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){return Z(t)}))));if(s)return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const m=new URL(window.location.href).searchParams.get(Fl),y=new URL(window.location.href).searchParams.get(zl);if(m){const t=new URL(window.location.href);return t.searchParams.delete(Fl),t.searchParams.delete(zl),history.pushState(null,document.title,t.toString()),Promise.reject(new Pl("WEB_WORKER_CLIENT-SI-BE","web-worker-client","signIn",m,null!=y?y:""))}if(yield G())return yield u(),c.enableOIDCSessionManagement&&b(),p();let X,g;return(null==c?void 0:c.responseMode)===t.ResponseMode.formPost&&l?(X=l,g=null!=n?n:""):(X=null!==(o=new URL(window.location.href).searchParams.get(We))&&void 0!==o?o:"",g=null!==(d=new URL(window.location.href).searchParams.get(Ce))&&void 0!==d?d:"",Ml.removeAuthorizationCode()),X?h(X,g):r({data:i,type:vl}).then((t=>e(void 0,void 0,void 0,(function*(){return t.pkce&&c.enablePKCE&&Ml.setPKCE(t.pkce),location.href=t.authorizationURL,yield Ml.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((t=>Promise.reject(t)))})),signOut:()=>G().then((t=>e(void 0,void 0,void 0,(function*(){return t&&!c?r({type:Kl}).then((t=>e(void 0,void 0,void 0,(function*(){return window.location.href=t,yield Ml.waitTillPageRedirect(),Promise.resolve(!0)})))).catch((t=>Promise.reject(t))):(window.location.href=Ml.getSignOutURL(),yield Ml.waitTillPageRedirect(),Promise.resolve(!0))})))).catch((t=>Promise.reject(t))),trySignInSilently:()=>e(void 0,void 0,void 0,(function*(){var t;const i=yield I();if(Ml.isInitializedSilentSignIn())return yield a.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const l=document.getElementById(Ul),n=null===(t=null==l?void 0:l.contentDocument)||void 0===t?void 0:t.getElementById(Tl),o={data:{prompt:"none",state:Bl},type:vl};try{const t=yield r(o);t.pkce&&i.enablePKCE&&Ml.setPKCE(t.pkce);const e=t.authorizationURL,l=new URL(e);l.searchParams.set("response_mode","query");const d=l.toString();n.src=d}catch(t){return Promise.reject(t)}return new Promise(((t,i)=>{const l=setTimeout((()=>{t(!1)}),1e4),n=o=>e(void 0,void 0,void 0,(function*(){var e,d,c;const a=o.data;(null==a?void 0:a.type)==Nl&&(window.removeEventListener("message",n),clearTimeout(l),t(!1)),(null==a?void 0:a.type)==Jl&&(null===(e=null==a?void 0:a.data)||void 0===e?void 0:e.code)&&h(null===(d=null==a?void 0:a.data)||void 0===d?void 0:d.code,null===(c=null==a?void 0:a.data)||void 0===c?void 0:c.sessionState).then((e=>{window.removeEventListener("message",n),t(e)})).catch((t=>{window.removeEventListener("message",n),i(t)})).finally((()=>{clearTimeout(l)}))}));window.addEventListener("message",n)}))})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield I(),i=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),l=Object.assign(Object.assign({},e),t),n={data:l,type:"update_config"};yield r(n),l.enableOIDCSessionManagement&&i&&(a.reset(),b())}))}})(Object.assign(Object.assign({},cn),l)),this._client.initialize().then((()=>(this._onInitialize&&this._onInitialize(!0),this._initialized=!0,Promise.resolve(!0)))).catch((t=>Promise.reject(t)))}return Promise.resolve(!0)}))}
445
445
  /**
446
446
  * This method returns a Promise that resolves with the basic user information obtained from the ID token.
447
447
  *
@@ -494,7 +494,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
494
494
  * @memberof AsgardeoSPAClient
495
495
  *
496
496
  * @preserve
497
- */signIn(t,i,l){var n;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),Ol.canContinueSignIn(Boolean(null==t?void 0:t.callOnlyOnRedirect),i))return null==t||delete t.callOnlyOnRedirect,null===(n=this._client)||void 0===n?void 0:n.signIn(t,i,l).then((t=>(this._onSignInCallback&&(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t),t)))}))}trySignInSilently(){var t;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!Ol.wasSignInCalled())return null===(t=this._client)||void 0===t?void 0:t.trySignInSilently().then((t=>{if(this._onSignInCallback&&t){const e=t;(e.allowedScopes||e.displayName||e.email||e.username)&&this._onSignInCallback(e)}return t}))}))}
497
+ */signIn(t,i,l){var n;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),Ml.canContinueSignIn(Boolean(null==t?void 0:t.callOnlyOnRedirect),i))return null==t||delete t.callOnlyOnRedirect,null===(n=this._client)||void 0===n?void 0:n.signIn(t,i,l).then((t=>(this._onSignInCallback&&(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t),t)))}))}trySignInSilently(){var t;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!Ml.wasSignInCalled())return null===(t=this._client)||void 0===t?void 0:t.trySignInSilently().then((t=>{if(this._onSignInCallback&&t){const e=t;(e.allowedScopes||e.displayName||e.email||e.username)&&this._onSignInCallback(e)}return t}))}))}
498
498
  /**
499
499
  * This method initiates the sign-out flow.
500
500
  *
@@ -629,7 +629,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
629
629
  * @memberof AsgardeoSPAClient
630
630
  *
631
631
  * @preserve
632
- */requestCustomGrant(t){var i,l;return e(this,void 0,void 0,(function*(){if(t.signInRequired,yield this._validateMethod(),!t.id)return Promise.reject(new El("AUTH_CLIENT-RCG-NF01","client","requestCustomGrant","The custom grant request id not found.","The id attribute of the custom grant config object passed as an argument should have a value."));const e=yield null===(i=this._client)||void 0===i?void 0:i.requestCustomGrant(t),n=this._onCustomGrant.get(t.id);return n&&n(null===(l=this._onCustomGrant)||void 0===l?void 0:l.get(t.id)),e}))}
632
+ */requestCustomGrant(t){var i,l;return e(this,void 0,void 0,(function*(){if(t.signInRequired,yield this._validateMethod(),!t.id)return Promise.reject(new Pl("AUTH_CLIENT-RCG-NF01","client","requestCustomGrant","The custom grant request id not found.","The id attribute of the custom grant config object passed as an argument should have a value."));const e=yield null===(i=this._client)||void 0===i?void 0:i.requestCustomGrant(t),n=this._onCustomGrant.get(t.id);return n&&n(null===(l=this._onCustomGrant)||void 0===l?void 0:l.get(t.id)),e}))}
633
633
  /**
634
634
  * This method ends a user session. The access token is revoked and the session information is destroyed.
635
635
  *
@@ -678,7 +678,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
678
678
  * @memberof AsgardeoSPAClient
679
679
  *
680
680
  * @preserve
681
- */getHttpClient(){if(this._client){if(this._storage!==t.Storage.WebWorker){return this._client.getHttpClient()}throw new El("AUTH_CLIENT-GHC-IV01","client","getHttpClient","Http client cannot be returned.","The http client cannot be returned when the storage type is set to webWorker.")}throw new El("AUTH_CLIENT-GHC-NF02","client","getHttpClient","The SDK is not initialized.","The SDK has not been initialized yet. Initialize the SDK suing the initialize method before calling this method.")}
681
+ */getHttpClient(){if(this._client){if(this._storage!==t.Storage.WebWorker){return this._client.getHttpClient()}throw new Pl("AUTH_CLIENT-GHC-IV01","client","getHttpClient","Http client cannot be returned.","The http client cannot be returned when the storage type is set to webWorker.")}throw new Pl("AUTH_CLIENT-GHC-NF02","client","getHttpClient","The SDK is not initialized.","The SDK has not been initialized yet. Initialize the SDK suing the initialize method before calling this method.")}
682
682
  /**
683
683
  * This method decodes the payload of the id token and returns it.
684
684
  *
@@ -736,7 +736,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
736
736
  * @memberof AsgardeoSPAClient
737
737
  *
738
738
  * @preserve
739
- */getAccessToken(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(t.Storage.WebWorker,t.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new El("AUTH_CLIENT-GAT-IV01","client","getAccessToken","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}
739
+ */getAccessToken(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(t.Storage.WebWorker,t.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new Pl("AUTH_CLIENT-GAT-IV01","client","getAccessToken","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}
740
740
  /**
741
741
  * This method refreshes the access token.
742
742
  *
@@ -766,7 +766,7 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
766
766
  * @memberof AsgardeoSPAClient
767
767
  *
768
768
  * @preserve
769
- */isAuthenticated(){var t;return e(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.isAuthenticated()}))}on(i,l,n){var o,d,c,a;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!l||"function"!=typeof l)throw new El("AUTH_CLIENT-ON-IV02","client","on","Invalid callback function.","The provided callback function is invalid.");switch(i){case t.Hooks.SignIn:this._onSignInCallback=l;break;case t.Hooks.SignOut:this._onSignOutCallback=l,Ol.isSignOutSuccessful()&&this._onSignOutCallback();break;case t.Hooks.RevokeAccessToken:this._onEndUserSession=l;break;case t.Hooks.Initialize:this._onInitialize=l;break;case t.Hooks.HttpRequestError:null===(o=this._client)||void 0===o||o.setHttpRequestErrorCallback(l);break;case t.Hooks.HttpRequestFinish:null===(d=this._client)||void 0===d||d.setHttpRequestFinishCallback(l);break;case t.Hooks.HttpRequestStart:null===(c=this._client)||void 0===c||c.setHttpRequestStartCallback(l);break;case t.Hooks.HttpRequestSuccess:null===(a=this._client)||void 0===a||a.setHttpRequestSuccessCallback(l);break;case t.Hooks.CustomGrant:n&&this._onCustomGrant.set(n,l);break;default:throw new El("AUTH_CLIENT-ON-IV01","client","on","Invalid hook.","The provided hook is invalid.")}}))}
769
+ */isAuthenticated(){var t;return e(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.isAuthenticated()}))}on(i,l,n){var o,d,c,a;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!l||"function"!=typeof l)throw new Pl("AUTH_CLIENT-ON-IV02","client","on","Invalid callback function.","The provided callback function is invalid.");switch(i){case t.Hooks.SignIn:this._onSignInCallback=l;break;case t.Hooks.SignOut:this._onSignOutCallback=l,Ml.isSignOutSuccessful()&&this._onSignOutCallback();break;case t.Hooks.RevokeAccessToken:this._onEndUserSession=l;break;case t.Hooks.Initialize:this._onInitialize=l;break;case t.Hooks.HttpRequestError:null===(o=this._client)||void 0===o||o.setHttpRequestErrorCallback(l);break;case t.Hooks.HttpRequestFinish:null===(d=this._client)||void 0===d||d.setHttpRequestFinishCallback(l);break;case t.Hooks.HttpRequestStart:null===(c=this._client)||void 0===c||c.setHttpRequestStartCallback(l);break;case t.Hooks.HttpRequestSuccess:null===(a=this._client)||void 0===a||a.setHttpRequestSuccessCallback(l);break;case t.Hooks.CustomGrant:n&&this._onCustomGrant.set(n,l);break;default:throw new Pl("AUTH_CLIENT-ON-IV01","client","on","Invalid hook.","The provided hook is invalid.")}}))}
770
770
  /**
771
771
  * This method enables callback functions attached to the http client.
772
772
  *
@@ -818,5 +818,5 @@ constructor(t){fl._instanceID?fl._instanceID+=1:fl._instanceID=0,this._dataLayer
818
818
  * @memberof AsgardeoAuthClient
819
819
  *
820
820
  * @preserve
821
- */updateConfig(i){return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===t.Storage.WebWorker){const t=this._client;yield t.updateConfig(i)}else{const t=this._client;yield t.updateConfig(i)}}))}}mn._instances=new Map;class hn extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}t.AUTHORIZATION_CODE=Ve,t.AsgardeoAuthClient=fl,t.AsgardeoSPAClient=mn,t.CLIENT_ID_TAG="{{clientID}}",t.CLIENT_SECRET_TAG="{{clientSecret}}",t.OIDC_SCOPE="openid",t.PKCE_CODE_VERIFIER=We,t.REFRESH_TOKEN_TIMER=ge,t.SCOPE_TAG="{{scope}}",t.SESSION_STATE=Ce,t.SIGN_OUT_SUCCESS_PARAM="sign_out_success",t.SIGN_OUT_URL=Re,t.SPAUtils=Ol,t.TOKEN_TAG="{{token}}",t.USERNAME_TAG="{{username}}",t.WebWorkerClass=hn,Object.defineProperty(t,"__esModule",{value:!0})}));
821
+ */updateConfig(i){return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===t.Storage.WebWorker){const t=this._client;yield t.updateConfig(i)}else{const t=this._client;yield t.updateConfig(i)}}))}}sn._instances=new Map;class rn extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}t.AUTHORIZATION_CODE=We,t.AsgardeoAuthClient=Yl,t.AsgardeoSPAClient=sn,t.CLIENT_ID_TAG="{{clientID}}",t.CLIENT_SECRET_TAG="{{clientSecret}}",t.OIDC_SCOPE="openid",t.PKCE_CODE_VERIFIER=Ve,t.REFRESH_TOKEN_TIMER=ge,t.SCOPE_TAG="{{scope}}",t.SESSION_STATE=Ce,t.SIGN_OUT_SUCCESS_PARAM="sign_out_success",t.SIGN_OUT_URL=Re,t.SPAUtils=Ml,t.TOKEN_TAG="{{token}}",t.USERNAME_TAG="{{username}}",t.WebWorkerClass=rn,Object.defineProperty(t,"__esModule",{value:!0})}));
822
822
  //# sourceMappingURL=asgardeo-spa.production.js.map