@asgardeo/auth-react 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +2 -0
- package/.eslintrc.js +74 -0
- package/README.md +958 -0
- package/babel.config.js +43 -0
- package/dist/main.js +822 -0
- package/dist/src/actions.d.ts +48 -0
- package/dist/src/actions.d.ts.map +1 -0
- package/dist/src/api.d.ts +193 -0
- package/dist/src/api.d.ts.map +1 -0
- package/dist/src/authenticate.d.ts +29 -0
- package/dist/src/authenticate.d.ts.map +1 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/models.d.ts +66 -0
- package/dist/src/models.d.ts.map +1 -0
- package/dist/src/public-api.d.ts +21 -0
- package/dist/src/public-api.d.ts.map +1 -0
- package/dist/src/reducer.d.ts +32 -0
- package/dist/src/reducer.d.ts.map +1 -0
- package/dist/src/secure-route.d.ts +30 -0
- package/dist/src/secure-route.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +2041 -0
- package/package.json +75 -0
- package/src/actions.ts +51 -0
- package/src/api.ts +394 -0
- package/src/authenticate.tsx +180 -0
- package/src/index.ts +23 -0
- package/src/models.ts +96 -0
- package/src/public-api.ts +21 -0
- package/src/reducer.ts +66 -0
- package/src/secure-route.tsx +58 -0
- package/tsconfig.json +26 -0
- package/webpack.config.js +105 -0
package/babel.config.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2020, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
|
|
3
|
+
*
|
|
4
|
+
* WSO2 Inc. licenses this file to you under the Apache License,
|
|
5
|
+
* Version 2.0 (the "License"); you may not use this file except
|
|
6
|
+
* in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing,
|
|
12
|
+
* software distributed under the License is distributed on an
|
|
13
|
+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
* KIND, either express or implied. See the License for the
|
|
15
|
+
* specific language governing permissions and limitations
|
|
16
|
+
* under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
module.exports = {
|
|
20
|
+
env: {
|
|
21
|
+
test: {
|
|
22
|
+
plugins: [ "@babel/plugin-transform-modules-commonjs" ]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
plugins: [
|
|
26
|
+
[ "@babel/plugin-proposal-decorators", { "legacy": true } ],
|
|
27
|
+
"@babel/plugin-proposal-class-properties"
|
|
28
|
+
],
|
|
29
|
+
presets: [
|
|
30
|
+
[
|
|
31
|
+
"@babel/preset-env",
|
|
32
|
+
{
|
|
33
|
+
corejs: {
|
|
34
|
+
proposals: true,
|
|
35
|
+
version: "3.6"
|
|
36
|
+
},
|
|
37
|
+
useBuiltIns: "entry"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"@babel/preset-react",
|
|
41
|
+
"@babel/preset-typescript"
|
|
42
|
+
]
|
|
43
|
+
};
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,822 @@
|
|
|
1
|
+
!function(t,l){"object"==typeof exports&&"object"==typeof module?module.exports=l(require("react"),require("react-router-dom")):"function"==typeof define&&define.amd?define([,],l):"object"==typeof exports?exports.AsgardeoAuth=l(require("react"),require("react-router-dom")):t.AsgardeoAuth=l(t.React,t.ReactRouter)}(this,(function(t,l){return function(t){var l={};function i(n){if(l[n])return l[n].exports;var e=l[n]={i:n,l:!1,exports:{}};return t[n].call(e.exports,e,e.exports,i),e.l=!0,e.exports}return i.m=t,i.c=l,i.d=function(t,l,n){i.o(t,l)||Object.defineProperty(t,l,{enumerable:!0,get:n})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,l){if(1&l&&(t=i(t)),8&l)return t;if(4&l&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&l&&"string"!=typeof t)for(var e in t)i.d(n,e,function(l){return t[l]}.bind(null,e));return n},i.n=function(t){var l=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(l,"a",l),l},i.o=function(t,l){return Object.prototype.hasOwnProperty.call(t,l)},i.p="",i(i.s=187)}([function(t,l,i){var n=i(5),e=i(23).f,c=i(16),o=i(24),d=i(105),a=i(137),r=i(67);t.exports=function(t,l){var i,u,Z,s,b,m=t.target,h=t.global,I=t.stat;if(i=h?n:I?n[m]||d(m,{}):(n[m]||{}).prototype)for(u in l){if(s=l[u],Z=t.noTargetGet?(b=e(i,u))&&b.value:i[u],!r(h?u:m+(I?".":"#")+u,t.forced)&&void 0!==Z){if(typeof s==typeof Z)continue;a(s,Z)}(t.sham||Z&&Z.sham)&&c(s,"sham",!0),o(i,u,s,t)}}},function(t,l,i){var n=i(8);t.exports=function(t){if(!n(t))throw TypeError(String(t)+" is not an object");return t}},function(t,l){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,l){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,l){t.exports=!1},function(t,l,i){(function(l){var i=function(t){return t&&t.Math==Math&&t};t.exports=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof l&&l)||function(){return this}()||Function("return this")()}).call(this,i(134))},function(t,l,i){var n=i(1),e=i(114),c=i(10),o=i(18),d=i(47),a=i(84),r=function(t,l){this.stopped=t,this.result=l};t.exports=function(t,l,i){var u,Z,s,b,m,h,I,p=i&&i.that,G=!(!i||!i.AS_ENTRIES),y=!(!i||!i.IS_ITERATOR),X=!(!i||!i.INTERRUPTED),g=o(l,p,1+G+X),V=function(t){return u&&a(u),new r(!0,t)},W=function(t){return G?(n(t),X?g(t[0],t[1],V):g(t[0],t[1])):X?g(t,V):g(t)};if(y)u=t;else{if("function"!=typeof(Z=d(t)))throw TypeError("Target is not iterable");if(e(Z)){for(s=0,b=c(t.length);b>s;s++)if((m=W(t[s]))&&m instanceof r)return m;return new r(!1)}u=Z.call(t)}for(h=u.next;!(I=h.call(u)).done;){try{m=W(I.value)}catch(t){throw a(u),t}if("object"==typeof m&&m&&m instanceof r)return m}return new r(!1)}},function(t,l,i){var n=i(5),e=i(83),c=i(15),o=i(64),d=i(110),a=i(139),r=e("wks"),u=n.Symbol,Z=a?u:u&&u.withoutSetter||o;t.exports=function(t){return c(r,t)||(d&&c(u,t)?r[t]=u[t]:r[t]=Z("Symbol."+t)),r[t]}},function(t,l){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,l,i){var n=i(2);t.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(t,l,i){var n=i(29),e=Math.min;t.exports=function(t){return t>0?e(n(t),9007199254740991):0}},function(t,l,i){var n=i(9),e=i(135),c=i(1),o=i(33),d=Object.defineProperty;l.f=n?d:function(t,l,i){if(c(t),l=o(l,!0),c(i),e)try{return d(t,l,i)}catch(t){}if("get"in i||"set"in i)throw TypeError("Accessors not supported");return"value"in i&&(t[l]=i.value),t}},function(t,l,i){"use strict";var n,e=i(119),c=i(9),o=i(5),d=i(8),a=i(15),r=i(73),u=i(16),Z=i(24),s=i(11).f,b=i(25),m=i(48),h=i(7),I=i(64),p=o.Int8Array,G=p&&p.prototype,y=o.Uint8ClampedArray,X=y&&y.prototype,g=p&&b(p),V=G&&b(G),W=Object.prototype,C=W.isPrototypeOf,R=h("toStringTag"),S=I("TYPED_ARRAY_TAG"),K=e&&!!m&&"Opera"!==r(o.opera),f=!1,Y={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},v={BigInt64Array:8,BigUint64Array:8},N=function(t){if(!d(t))return!1;var l=r(t);return a(Y,l)||a(v,l)};for(n in Y)o[n]||(K=!1);if((!K||"function"!=typeof g||g===Function.prototype)&&(g=function(){throw TypeError("Incorrect invocation")},K))for(n in Y)o[n]&&m(o[n],g);if((!K||!V||V===W)&&(V=g.prototype,K))for(n in Y)o[n]&&m(o[n].prototype,V);if(K&&b(X)!==V&&m(X,V),c&&!a(V,R))for(n in f=!0,s(V,R,{get:function(){return d(this)?this[S]:void 0}}),Y)o[n]&&u(o[n],S,n);t.exports={NATIVE_ARRAY_BUFFER_VIEWS:K,TYPED_ARRAY_TAG:f&&S,aTypedArray:function(t){if(N(t))return t;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(t){if(m){if(C.call(g,t))return t}else for(var l in Y)if(a(Y,n)){var i=o[l];if(i&&(t===i||C.call(i,t)))return t}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(t,l,i){if(c){if(i)for(var n in Y){var e=o[n];e&&a(e.prototype,t)&&delete e.prototype[t]}V[t]&&!i||Z(V,t,i?l:K&&G[t]||l)}},exportTypedArrayStaticMethod:function(t,l,i){var n,e;if(c){if(m){if(i)for(n in Y)(e=o[n])&&a(e,t)&&delete e[t];if(g[t]&&!i)return;try{return Z(g,t,i?l:K&&p[t]||l)}catch(t){}}for(n in Y)!(e=o[n])||e[t]&&!i||Z(e,t,l)}},isView:function(t){if(!d(t))return!1;var l=r(t);return"DataView"===l||a(Y,l)||a(v,l)},isTypedArray:N,TypedArray:g,TypedArrayPrototype:V}},function(t,l,i){var n=i(56),e=i(5),c=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,l){return arguments.length<2?c(n[t])||c(e[t]):n[t]&&n[t][l]||e[t]&&e[t][l]}},function(t,l,i){var n=i(21);t.exports=function(t){return Object(n(t))}},function(t,l){var i={}.hasOwnProperty;t.exports=function(t,l){return i.call(t,l)}},function(t,l,i){var n=i(9),e=i(11),c=i(39);t.exports=n?function(t,l,i){return e.f(t,l,c(1,i))}:function(t,l,i){return t[l]=i,t}},function(t,l,i){var n,e,c,o=i(136),d=i(5),a=i(8),r=i(16),u=i(15),Z=i(81),s=i(82),b=i(65),m=d.WeakMap;if(o){var h=Z.state||(Z.state=new m),I=h.get,p=h.has,G=h.set;n=function(t,l){return l.facade=t,G.call(h,t,l),l},e=function(t){return I.call(h,t)||{}},c=function(t){return p.call(h,t)}}else{var y=s("state");b[y]=!0,n=function(t,l){return l.facade=t,r(t,y,l),l},e=function(t){return u(t,y)?t[y]:{}},c=function(t){return u(t,y)}}t.exports={set:n,get:e,has:c,enforce:function(t){return c(t)?e(t):n(t,{})},getterFor:function(t){return function(l){var i;if(!a(l)||(i=e(l)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return i}}}},function(t,l,i){var n=i(3);t.exports=function(t,l,i){if(n(t),void 0===l)return t;switch(i){case 0:return function(){return t.call(l)};case 1:return function(i){return t.call(l,i)};case 2:return function(i,n){return t.call(l,i,n)};case 3:return function(i,n,e){return t.call(l,i,n,e)}}return function(){return t.apply(l,arguments)}}},function(t,l,i){var n=i(56),e=i(15),c=i(142),o=i(11).f;t.exports=function(t){var l=n.Symbol||(n.Symbol={});e(l,t)||o(l,t,{value:c.f(t)})}},function(t,l,i){var n=i(1),e=i(3),c=i(7)("species");t.exports=function(t,l){var i,o=n(t).constructor;return void 0===o||null==(i=n(o)[c])?l:e(i)}},function(t,l){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,l,i){var n=i(18),e=i(63),c=i(14),o=i(10),d=i(68),a=[].push,r=function(t){var l=1==t,i=2==t,r=3==t,u=4==t,Z=6==t,s=7==t,b=5==t||Z;return function(m,h,I,p){for(var G,y,X=c(m),g=e(X),V=n(h,I,3),W=o(g.length),C=0,R=p||d,S=l?R(m,W):i||s?R(m,0):void 0;W>C;C++)if((b||C in g)&&(y=V(G=g[C],C,X),t))if(l)S[C]=y;else if(y)switch(t){case 3:return!0;case 5:return G;case 6:return C;case 2:a.call(S,G)}else switch(t){case 4:return!1;case 7:a.call(S,G)}return Z?-1:r||u?u:S}};t.exports={forEach:r(0),map:r(1),filter:r(2),some:r(3),every:r(4),find:r(5),findIndex:r(6),filterOut:r(7)}},function(t,l,i){var n=i(9),e=i(80),c=i(39),o=i(28),d=i(33),a=i(15),r=i(135),u=Object.getOwnPropertyDescriptor;l.f=n?u:function(t,l){if(t=o(t),l=d(l,!0),r)try{return u(t,l)}catch(t){}if(a(t,l))return c(!e.f.call(t,l),t[l])}},function(t,l,i){var n=i(5),e=i(16),c=i(15),o=i(105),d=i(106),a=i(17),r=a.get,u=a.enforce,Z=String(String).split("String");(t.exports=function(t,l,i,d){var a,r=!!d&&!!d.unsafe,s=!!d&&!!d.enumerable,b=!!d&&!!d.noTargetGet;"function"==typeof i&&("string"!=typeof l||c(i,"name")||e(i,"name",l),(a=u(i)).source||(a.source=Z.join("string"==typeof l?l:""))),t!==n?(r?!b&&t[l]&&(s=!0):delete t[l],s?t[l]=i:e(t,l,i)):s?t[l]=i:o(l,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&r(this).source||d(this)}))},function(t,l,i){var n=i(15),e=i(14),c=i(82),o=i(118),d=c("IE_PROTO"),a=Object.prototype;t.exports=o?Object.getPrototypeOf:function(t){return t=e(t),n(t,d)?t[d]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},function(t,l,i){var n,e=i(1),c=i(111),o=i(108),d=i(65),a=i(140),r=i(104),u=i(82),Z=u("IE_PROTO"),s=function(){},b=function(t){return"<script>"+t+"<\/script>"},m=function(){try{n=document.domain&&new ActiveXObject("htmlfile")}catch(t){}var t,l;m=n?function(t){t.write(b("")),t.close();var l=t.parentWindow.Object;return t=null,l}(n):((l=r("iframe")).style.display="none",a.appendChild(l),l.src=String("javascript:"),(t=l.contentWindow.document).open(),t.write(b("document.F=Object")),t.close(),t.F);for(var i=o.length;i--;)delete m.prototype[o[i]];return m()};d[Z]=!0,t.exports=Object.create||function(t,l){var i;return null!==t?(s.prototype=e(t),i=new s,s.prototype=null,i[Z]=t):i=m(),void 0===l?i:c(i,l)}},function(t,l,i){var n=i(9),e=i(2),c=i(15),o=Object.defineProperty,d={},a=function(t){throw t};t.exports=function(t,l){if(c(d,t))return d[t];l||(l={});var i=[][t],r=!!c(l,"ACCESSORS")&&l.ACCESSORS,u=c(l,0)?l[0]:a,Z=c(l,1)?l[1]:void 0;return d[t]=!!i&&!e((function(){if(r&&!n)return!0;var t={length:-1};r?o(t,1,{enumerable:!0,get:a}):t[1]=1,i.call(t,u,Z)}))}},function(t,l,i){var n=i(63),e=i(21);t.exports=function(t){return n(e(t))}},function(t,l){var i=Math.ceil,n=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?n:i)(t)}},function(t,l,i){var n=i(21),e=/"/g;t.exports=function(t,l,i,c){var o=String(n(t)),d="<"+l;return""!==i&&(d+=" "+i+'="'+String(c).replace(e,""")+'"'),d+">"+o+"</"+l+">"}},function(t,l,i){var n=i(2);t.exports=function(t){return n((function(){var l=""[t]('"');return l!==l.toLowerCase()||l.split('"').length>3}))}},function(l,i){l.exports=t},function(t,l,i){var n=i(8);t.exports=function(t,l){if(!n(t))return t;var i,e;if(l&&"function"==typeof(i=t.toString)&&!n(e=i.call(t)))return e;if("function"==typeof(i=t.valueOf)&&!n(e=i.call(t)))return e;if(!l&&"function"==typeof(i=t.toString)&&!n(e=i.call(t)))return e;throw TypeError("Can't convert object to primitive value")}},function(t,l){t.exports=function(t,l,i){if(!(t instanceof l))throw TypeError("Incorrect "+(i?i+" ":"")+"invocation");return t}},function(t,l,i){"use strict";(function(t){
|
|
2
|
+
/*! *****************************************************************************
|
|
3
|
+
Copyright (c) Microsoft Corporation.
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted.
|
|
7
|
+
|
|
8
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
9
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
10
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
11
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
12
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
13
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
14
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
15
|
+
***************************************************************************** */
|
|
16
|
+
function n(t,l,i,n){return new(i||(i=Promise))((function(e,c){function o(t){try{a(n.next(t))}catch(t){c(t)}}function d(t){try{a(n.throw(t))}catch(t){c(t)}}function a(t){var l;t.done?e(t.value):(l=t.value,l instanceof i?l:new i((function(t){t(l)}))).then(o,d)}a((n=n.apply(t,l||[])).next())}))}i.d(l,"a",(function(){return gl})),i.d(l,"b",(function(){return Kn})),i.d(l,"c",(function(){return Pn})),i.d(l,"d",(function(){return Il})),i.d(l,"e",(function(){return pl})),i.d(l,"f",(function(){return Yn})),i.d(l,"g",(function(){return Rl})),i.d(l,"h",(function(){return Xl})),i.d(l,"i",(function(){return yl})),i.d(l,"j",(function(){return rl})),i.d(l,"k",(function(){return hl})),i.d(l,"l",(function(){return Vl})),i.d(l,"m",(function(){return Cl})),i.d(l,"n",(function(){return Wl})),i.d(l,"o",(function(){return Bn})),i.d(l,"p",(function(){return fn})),i.d(l,"q",(function(){return Gl})),i.d(l,"r",(function(){return bl})),i.d(l,"s",(function(){return ml})),i.d(l,"t",(function(){return Mn}));var e=void 0!==t?t:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},c=[],o=[],d="undefined"!=typeof Uint8Array?Uint8Array:Array,a=!1;function r(){a=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=0,i=t.length;l<i;++l)c[l]=t[l],o[t.charCodeAt(l)]=l;o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63}function u(t,l,i){for(var n,e,o=[],d=l;d<i;d+=3)n=(t[d]<<16)+(t[d+1]<<8)+t[d+2],o.push(c[(e=n)>>18&63]+c[e>>12&63]+c[e>>6&63]+c[63&e]);return o.join("")}function Z(t){var l;a||r();for(var i=t.length,n=i%3,e="",o=[],d=16383,Z=0,s=i-n;Z<s;Z+=d)o.push(u(t,Z,Z+d>s?s:Z+d));return 1===n?(l=t[i-1],e+=c[l>>2],e+=c[l<<4&63],e+="=="):2===n&&(l=(t[i-2]<<8)+t[i-1],e+=c[l>>10],e+=c[l>>4&63],e+=c[l<<2&63],e+="="),o.push(e),o.join("")}function s(t,l,i,n,e){var c,o,d=8*e-n-1,a=(1<<d)-1,r=a>>1,u=-7,Z=i?e-1:0,s=i?-1:1,b=t[l+Z];for(Z+=s,c=b&(1<<-u)-1,b>>=-u,u+=d;u>0;c=256*c+t[l+Z],Z+=s,u-=8);for(o=c&(1<<-u)-1,c>>=-u,u+=n;u>0;o=256*o+t[l+Z],Z+=s,u-=8);if(0===c)c=1-r;else{if(c===a)return o?NaN:1/0*(b?-1:1);o+=Math.pow(2,n),c-=r}return(b?-1:1)*o*Math.pow(2,c-n)}function b(t,l,i,n,e,c){var o,d,a,r=8*c-e-1,u=(1<<r)-1,Z=u>>1,s=23===e?Math.pow(2,-24)-Math.pow(2,-77):0,b=n?0:c-1,m=n?1:-1,h=l<0||0===l&&1/l<0?1:0;for(l=Math.abs(l),isNaN(l)||l===1/0?(d=isNaN(l)?1:0,o=u):(o=Math.floor(Math.log(l)/Math.LN2),l*(a=Math.pow(2,-o))<1&&(o--,a*=2),(l+=o+Z>=1?s/a:s*Math.pow(2,1-Z))*a>=2&&(o++,a/=2),o+Z>=u?(d=0,o=u):o+Z>=1?(d=(l*a-1)*Math.pow(2,e),o+=Z):(d=l*Math.pow(2,Z-1)*Math.pow(2,e),o=0));e>=8;t[i+b]=255&d,b+=m,d/=256,e-=8);for(o=o<<e|d,r+=e;r>0;t[i+b]=255&o,b+=m,o/=256,r-=8);t[i+b-m]|=128*h}var m={}.toString,h=Array.isArray||function(t){return"[object Array]"==m.call(t)};function I(){return G.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function p(t,l){if(I()<l)throw new RangeError("Invalid typed array length");return G.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(l)).__proto__=G.prototype:(null===t&&(t=new G(l)),t.length=l),t}function G(t,l,i){if(!(G.TYPED_ARRAY_SUPPORT||this instanceof G))return new G(t,l,i);if("number"==typeof t){if("string"==typeof l)throw new Error("If encoding is specified then the first argument must be a string");return g(this,t)}return y(this,t,l,i)}function y(t,l,i,n){if("number"==typeof l)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&l instanceof ArrayBuffer?function(t,l,i,n){if(l.byteLength,i<0||l.byteLength<i)throw new RangeError("'offset' is out of bounds");if(l.byteLength<i+(n||0))throw new RangeError("'length' is out of bounds");return l=void 0===i&&void 0===n?new Uint8Array(l):void 0===n?new Uint8Array(l,i):new Uint8Array(l,i,n),G.TYPED_ARRAY_SUPPORT?(t=l).__proto__=G.prototype:t=V(t,l),t}(t,l,i,n):"string"==typeof l?function(t,l,i){if("string"==typeof i&&""!==i||(i="utf8"),!G.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var n=0|R(l,i),e=(t=p(t,n)).write(l,i);return e!==n&&(t=t.slice(0,e)),t}(t,l,i):function(t,l){if(C(l)){var i=0|W(l.length);return 0===(t=p(t,i)).length||l.copy(t,0,0,i),t}if(l){if("undefined"!=typeof ArrayBuffer&&l.buffer instanceof ArrayBuffer||"length"in l)return"number"!=typeof l.length||(n=l.length)!=n?p(t,0):V(t,l);if("Buffer"===l.type&&h(l.data))return V(t,l.data)}var n;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,l)}function X(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 g(t,l){if(X(l),t=p(t,l<0?0:0|W(l)),!G.TYPED_ARRAY_SUPPORT)for(var i=0;i<l;++i)t[i]=0;return t}function V(t,l){var i=l.length<0?0:0|W(l.length);t=p(t,i);for(var n=0;n<i;n+=1)t[n]=255&l[n];return t}function W(t){if(t>=I())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+I().toString(16)+" bytes");return 0|t}function C(t){return!(null==t||!t._isBuffer)}function R(t,l){if(C(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var i=t.length;if(0===i)return 0;for(var n=!1;;)switch(l){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":case void 0:return q(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(n)return q(t).length;l=(""+l).toLowerCase(),n=!0}}function S(t,l,i){var n=!1;if((void 0===l||l<0)&&(l=0),l>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(l>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return F(this,l,i);case"utf8":case"utf-8":return T(this,l,i);case"ascii":return k(this,l,i);case"latin1":case"binary":return B(this,l,i);case"base64":return x(this,l,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return z(this,l,i);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function K(t,l,i){var n=t[l];t[l]=t[i],t[i]=n}function f(t,l,i,n,e){if(0===t.length)return-1;if("string"==typeof i?(n=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=e?0:t.length-1),i<0&&(i=t.length+i),i>=t.length){if(e)return-1;i=t.length-1}else if(i<0){if(!e)return-1;i=0}if("string"==typeof l&&(l=G.from(l,n)),C(l))return 0===l.length?-1:Y(t,l,i,n,e);if("number"==typeof l)return l&=255,G.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?e?Uint8Array.prototype.indexOf.call(t,l,i):Uint8Array.prototype.lastIndexOf.call(t,l,i):Y(t,[l],i,n,e);throw new TypeError("val must be string, number or Buffer")}function Y(t,l,i,n,e){var c,o=1,d=t.length,a=l.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||l.length<2)return-1;o=2,d/=2,a/=2,i/=2}function r(t,l){return 1===o?t[l]:t.readUInt16BE(l*o)}if(e){var u=-1;for(c=i;c<d;c++)if(r(t,c)===r(l,-1===u?0:c-u)){if(-1===u&&(u=c),c-u+1===a)return u*o}else-1!==u&&(c-=c-u),u=-1}else for(i+a>d&&(i=d-a),c=i;c>=0;c--){for(var Z=!0,s=0;s<a;s++)if(r(t,c+s)!==r(l,s)){Z=!1;break}if(Z)return c}return-1}function v(t,l,i,n){i=Number(i)||0;var e=t.length-i;n?(n=Number(n))>e&&(n=e):n=e;var c=l.length;if(c%2!=0)throw new TypeError("Invalid hex string");n>c/2&&(n=c/2);for(var o=0;o<n;++o){var d=parseInt(l.substr(2*o,2),16);if(isNaN(d))return o;t[i+o]=d}return o}function N(t,l,i,n){return $(q(l,t.length-i),t,i,n)}function J(t,l,i,n){return $(function(t){for(var l=[],i=0;i<t.length;++i)l.push(255&t.charCodeAt(i));return l}(l),t,i,n)}function H(t,l,i,n){return J(t,l,i,n)}function L(t,l,i,n){return $(_(l),t,i,n)}function U(t,l,i,n){return $(function(t,l){for(var i,n,e,c=[],o=0;o<t.length&&!((l-=2)<0);++o)n=(i=t.charCodeAt(o))>>8,e=i%256,c.push(e),c.push(n);return c}(l,t.length-i),t,i,n)}function x(t,l,i){return 0===l&&i===t.length?Z(t):Z(t.slice(l,i))}function T(t,l,i){i=Math.min(t.length,i);for(var n=[],e=l;e<i;){var c,o,d,a,r=t[e],u=null,Z=r>239?4:r>223?3:r>191?2:1;if(e+Z<=i)switch(Z){case 1:r<128&&(u=r);break;case 2:128==(192&(c=t[e+1]))&&(a=(31&r)<<6|63&c)>127&&(u=a);break;case 3:c=t[e+1],o=t[e+2],128==(192&c)&&128==(192&o)&&(a=(15&r)<<12|(63&c)<<6|63&o)>2047&&(a<55296||a>57343)&&(u=a);break;case 4:c=t[e+1],o=t[e+2],d=t[e+3],128==(192&c)&&128==(192&o)&&128==(192&d)&&(a=(15&r)<<18|(63&c)<<12|(63&o)<<6|63&d)>65535&&a<1114112&&(u=a)}null===u?(u=65533,Z=1):u>65535&&(u-=65536,n.push(u>>>10&1023|55296),u=56320|1023&u),n.push(u),e+=Z}return function(t){var l=t.length;if(l<=4096)return String.fromCharCode.apply(String,t);for(var i="",n=0;n<l;)i+=String.fromCharCode.apply(String,t.slice(n,n+=4096));return i}(n)}function k(t,l,i){var n="";i=Math.min(t.length,i);for(var e=l;e<i;++e)n+=String.fromCharCode(127&t[e]);return n}function B(t,l,i){var n="";i=Math.min(t.length,i);for(var e=l;e<i;++e)n+=String.fromCharCode(t[e]);return n}function F(t,l,i){var n=t.length;(!l||l<0)&&(l=0),(!i||i<0||i>n)&&(i=n);for(var e="",c=l;c<i;++c)e+=O(t[c]);return e}function z(t,l,i){for(var n=t.slice(l,i),e="",c=0;c<n.length;c+=2)e+=String.fromCharCode(n[c]+256*n[c+1]);return e}function A(t,l,i){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+l>i)throw new RangeError("Trying to access beyond buffer length")}function w(t,l,i,n,e,c){if(!C(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(l>e||l<c)throw new RangeError('"value" argument is out of bounds');if(i+n>t.length)throw new RangeError("Index out of range")}function Q(t,l,i,n){l<0&&(l=65535+l+1);for(var e=0,c=Math.min(t.length-i,2);e<c;++e)t[i+e]=(l&255<<8*(n?e:1-e))>>>8*(n?e:1-e)}function P(t,l,i,n){l<0&&(l=4294967295+l+1);for(var e=0,c=Math.min(t.length-i,4);e<c;++e)t[i+e]=l>>>8*(n?e:3-e)&255}function M(t,l,i,n,e,c){if(i+n>t.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function j(t,l,i,n,e){return e||M(t,0,i,4),b(t,l,i,n,23,4),i+4}function E(t,l,i,n,e){return e||M(t,0,i,8),b(t,l,i,n,52,8),i+8}G.TYPED_ARRAY_SUPPORT=void 0===e.TYPED_ARRAY_SUPPORT||e.TYPED_ARRAY_SUPPORT,G.poolSize=8192,G._augment=function(t){return t.__proto__=G.prototype,t},G.from=function(t,l,i){return y(null,t,l,i)},G.TYPED_ARRAY_SUPPORT&&(G.prototype.__proto__=Uint8Array.prototype,G.__proto__=Uint8Array),G.alloc=function(t,l,i){return function(t,l,i,n){return X(l),l<=0?p(t,l):void 0!==i?"string"==typeof n?p(t,l).fill(i,n):p(t,l).fill(i):p(t,l)}(null,t,l,i)},G.allocUnsafe=function(t){return g(null,t)},G.allocUnsafeSlow=function(t){return g(null,t)},G.isBuffer=function(t){return null!=t&&(!!t._isBuffer||tt(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&tt(t.slice(0,0))}(t))},G.compare=function(t,l){if(!C(t)||!C(l))throw new TypeError("Arguments must be Buffers");if(t===l)return 0;for(var i=t.length,n=l.length,e=0,c=Math.min(i,n);e<c;++e)if(t[e]!==l[e]){i=t[e],n=l[e];break}return i<n?-1:n<i?1:0},G.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}},G.concat=function(t,l){if(!h(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return G.alloc(0);var i;if(void 0===l)for(l=0,i=0;i<t.length;++i)l+=t[i].length;var n=G.allocUnsafe(l),e=0;for(i=0;i<t.length;++i){var c=t[i];if(!C(c))throw new TypeError('"list" argument must be an Array of Buffers');c.copy(n,e),e+=c.length}return n},G.byteLength=R,G.prototype._isBuffer=!0,G.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 l=0;l<t;l+=2)K(this,l,l+1);return this},G.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 l=0;l<t;l+=4)K(this,l,l+3),K(this,l+1,l+2);return this},G.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 l=0;l<t;l+=8)K(this,l,l+7),K(this,l+1,l+6),K(this,l+2,l+5),K(this,l+3,l+4);return this},G.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?T(this,0,t):S.apply(this,arguments)},G.prototype.equals=function(t){if(!C(t))throw new TypeError("Argument must be a Buffer");return this===t||0===G.compare(this,t)},G.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+">"},G.prototype.compare=function(t,l,i,n,e){if(!C(t))throw new TypeError("Argument must be a Buffer");if(void 0===l&&(l=0),void 0===i&&(i=t?t.length:0),void 0===n&&(n=0),void 0===e&&(e=this.length),l<0||i>t.length||n<0||e>this.length)throw new RangeError("out of range index");if(n>=e&&l>=i)return 0;if(n>=e)return-1;if(l>=i)return 1;if(this===t)return 0;for(var c=(e>>>=0)-(n>>>=0),o=(i>>>=0)-(l>>>=0),d=Math.min(c,o),a=this.slice(n,e),r=t.slice(l,i),u=0;u<d;++u)if(a[u]!==r[u]){c=a[u],o=r[u];break}return c<o?-1:o<c?1:0},G.prototype.includes=function(t,l,i){return-1!==this.indexOf(t,l,i)},G.prototype.indexOf=function(t,l,i){return f(this,t,l,i,!0)},G.prototype.lastIndexOf=function(t,l,i){return f(this,t,l,i,!1)},G.prototype.write=function(t,l,i,n){if(void 0===l)n="utf8",i=this.length,l=0;else if(void 0===i&&"string"==typeof l)n=l,i=this.length,l=0;else{if(!isFinite(l))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");l|=0,isFinite(i)?(i|=0,void 0===n&&(n="utf8")):(n=i,i=void 0)}var e=this.length-l;if((void 0===i||i>e)&&(i=e),t.length>0&&(i<0||l<0)||l>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var c=!1;;)switch(n){case"hex":return v(this,t,l,i);case"utf8":case"utf-8":return N(this,t,l,i);case"ascii":return J(this,t,l,i);case"latin1":case"binary":return H(this,t,l,i);case"base64":return L(this,t,l,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return U(this,t,l,i);default:if(c)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),c=!0}},G.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}},G.prototype.slice=function(t,l){var i,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(l=void 0===l?n:~~l)<0?(l+=n)<0&&(l=0):l>n&&(l=n),l<t&&(l=t),G.TYPED_ARRAY_SUPPORT)(i=this.subarray(t,l)).__proto__=G.prototype;else{var e=l-t;i=new G(e,void 0);for(var c=0;c<e;++c)i[c]=this[c+t]}return i},G.prototype.readUIntLE=function(t,l,i){t|=0,l|=0,i||A(t,l,this.length);for(var n=this[t],e=1,c=0;++c<l&&(e*=256);)n+=this[t+c]*e;return n},G.prototype.readUIntBE=function(t,l,i){t|=0,l|=0,i||A(t,l,this.length);for(var n=this[t+--l],e=1;l>0&&(e*=256);)n+=this[t+--l]*e;return n},G.prototype.readUInt8=function(t,l){return l||A(t,1,this.length),this[t]},G.prototype.readUInt16LE=function(t,l){return l||A(t,2,this.length),this[t]|this[t+1]<<8},G.prototype.readUInt16BE=function(t,l){return l||A(t,2,this.length),this[t]<<8|this[t+1]},G.prototype.readUInt32LE=function(t,l){return l||A(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},G.prototype.readUInt32BE=function(t,l){return l||A(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},G.prototype.readIntLE=function(t,l,i){t|=0,l|=0,i||A(t,l,this.length);for(var n=this[t],e=1,c=0;++c<l&&(e*=256);)n+=this[t+c]*e;return n>=(e*=128)&&(n-=Math.pow(2,8*l)),n},G.prototype.readIntBE=function(t,l,i){t|=0,l|=0,i||A(t,l,this.length);for(var n=l,e=1,c=this[t+--n];n>0&&(e*=256);)c+=this[t+--n]*e;return c>=(e*=128)&&(c-=Math.pow(2,8*l)),c},G.prototype.readInt8=function(t,l){return l||A(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},G.prototype.readInt16LE=function(t,l){l||A(t,2,this.length);var i=this[t]|this[t+1]<<8;return 32768&i?4294901760|i:i},G.prototype.readInt16BE=function(t,l){l||A(t,2,this.length);var i=this[t+1]|this[t]<<8;return 32768&i?4294901760|i:i},G.prototype.readInt32LE=function(t,l){return l||A(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},G.prototype.readInt32BE=function(t,l){return l||A(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},G.prototype.readFloatLE=function(t,l){return l||A(t,4,this.length),s(this,t,!0,23,4)},G.prototype.readFloatBE=function(t,l){return l||A(t,4,this.length),s(this,t,!1,23,4)},G.prototype.readDoubleLE=function(t,l){return l||A(t,8,this.length),s(this,t,!0,52,8)},G.prototype.readDoubleBE=function(t,l){return l||A(t,8,this.length),s(this,t,!1,52,8)},G.prototype.writeUIntLE=function(t,l,i,n){t=+t,l|=0,i|=0,n||w(this,t,l,i,Math.pow(2,8*i)-1,0);var e=1,c=0;for(this[l]=255&t;++c<i&&(e*=256);)this[l+c]=t/e&255;return l+i},G.prototype.writeUIntBE=function(t,l,i,n){t=+t,l|=0,i|=0,n||w(this,t,l,i,Math.pow(2,8*i)-1,0);var e=i-1,c=1;for(this[l+e]=255&t;--e>=0&&(c*=256);)this[l+e]=t/c&255;return l+i},G.prototype.writeUInt8=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,1,255,0),G.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[l]=255&t,l+1},G.prototype.writeUInt16LE=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,2,65535,0),G.TYPED_ARRAY_SUPPORT?(this[l]=255&t,this[l+1]=t>>>8):Q(this,t,l,!0),l+2},G.prototype.writeUInt16BE=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,2,65535,0),G.TYPED_ARRAY_SUPPORT?(this[l]=t>>>8,this[l+1]=255&t):Q(this,t,l,!1),l+2},G.prototype.writeUInt32LE=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,4,4294967295,0),G.TYPED_ARRAY_SUPPORT?(this[l+3]=t>>>24,this[l+2]=t>>>16,this[l+1]=t>>>8,this[l]=255&t):P(this,t,l,!0),l+4},G.prototype.writeUInt32BE=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,4,4294967295,0),G.TYPED_ARRAY_SUPPORT?(this[l]=t>>>24,this[l+1]=t>>>16,this[l+2]=t>>>8,this[l+3]=255&t):P(this,t,l,!1),l+4},G.prototype.writeIntLE=function(t,l,i,n){if(t=+t,l|=0,!n){var e=Math.pow(2,8*i-1);w(this,t,l,i,e-1,-e)}var c=0,o=1,d=0;for(this[l]=255&t;++c<i&&(o*=256);)t<0&&0===d&&0!==this[l+c-1]&&(d=1),this[l+c]=(t/o>>0)-d&255;return l+i},G.prototype.writeIntBE=function(t,l,i,n){if(t=+t,l|=0,!n){var e=Math.pow(2,8*i-1);w(this,t,l,i,e-1,-e)}var c=i-1,o=1,d=0;for(this[l+c]=255&t;--c>=0&&(o*=256);)t<0&&0===d&&0!==this[l+c+1]&&(d=1),this[l+c]=(t/o>>0)-d&255;return l+i},G.prototype.writeInt8=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,1,127,-128),G.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[l]=255&t,l+1},G.prototype.writeInt16LE=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,2,32767,-32768),G.TYPED_ARRAY_SUPPORT?(this[l]=255&t,this[l+1]=t>>>8):Q(this,t,l,!0),l+2},G.prototype.writeInt16BE=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,2,32767,-32768),G.TYPED_ARRAY_SUPPORT?(this[l]=t>>>8,this[l+1]=255&t):Q(this,t,l,!1),l+2},G.prototype.writeInt32LE=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,4,2147483647,-2147483648),G.TYPED_ARRAY_SUPPORT?(this[l]=255&t,this[l+1]=t>>>8,this[l+2]=t>>>16,this[l+3]=t>>>24):P(this,t,l,!0),l+4},G.prototype.writeInt32BE=function(t,l,i){return t=+t,l|=0,i||w(this,t,l,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),G.TYPED_ARRAY_SUPPORT?(this[l]=t>>>24,this[l+1]=t>>>16,this[l+2]=t>>>8,this[l+3]=255&t):P(this,t,l,!1),l+4},G.prototype.writeFloatLE=function(t,l,i){return j(this,t,l,!0,i)},G.prototype.writeFloatBE=function(t,l,i){return j(this,t,l,!1,i)},G.prototype.writeDoubleLE=function(t,l,i){return E(this,t,l,!0,i)},G.prototype.writeDoubleBE=function(t,l,i){return E(this,t,l,!1,i)},G.prototype.copy=function(t,l,i,n){if(i||(i=0),n||0===n||(n=this.length),l>=t.length&&(l=t.length),l||(l=0),n>0&&n<i&&(n=i),n===i)return 0;if(0===t.length||0===this.length)return 0;if(l<0)throw new RangeError("targetStart out of bounds");if(i<0||i>=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-l<n-i&&(n=t.length-l+i);var e,c=n-i;if(this===t&&i<l&&l<n)for(e=c-1;e>=0;--e)t[e+l]=this[e+i];else if(c<1e3||!G.TYPED_ARRAY_SUPPORT)for(e=0;e<c;++e)t[e+l]=this[e+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+c),l);return c},G.prototype.fill=function(t,l,i,n){if("string"==typeof t){if("string"==typeof l?(n=l,l=0,i=this.length):"string"==typeof i&&(n=i,i=this.length),1===t.length){var e=t.charCodeAt(0);e<256&&(t=e)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!G.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof t&&(t&=255);if(l<0||this.length<l||this.length<i)throw new RangeError("Out of range index");if(i<=l)return this;var c;if(l>>>=0,i=void 0===i?this.length:i>>>0,t||(t=0),"number"==typeof t)for(c=l;c<i;++c)this[c]=t;else{var o=C(t)?t:q(new G(t,n).toString()),d=o.length;for(c=0;c<i-l;++c)this[c+l]=o[c%d]}return this};var D=/[^+\/0-9A-Za-z-_]/g;function O(t){return t<16?"0"+t.toString(16):t.toString(16)}function q(t,l){var i;l=l||1/0;for(var n=t.length,e=null,c=[],o=0;o<n;++o){if((i=t.charCodeAt(o))>55295&&i<57344){if(!e){if(i>56319){(l-=3)>-1&&c.push(239,191,189);continue}if(o+1===n){(l-=3)>-1&&c.push(239,191,189);continue}e=i;continue}if(i<56320){(l-=3)>-1&&c.push(239,191,189),e=i;continue}i=65536+(e-55296<<10|i-56320)}else e&&(l-=3)>-1&&c.push(239,191,189);if(e=null,i<128){if((l-=1)<0)break;c.push(i)}else if(i<2048){if((l-=2)<0)break;c.push(i>>6|192,63&i|128)}else if(i<65536){if((l-=3)<0)break;c.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((l-=4)<0)break;c.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return c}function _(t){return function(t){var l,i,n,e,c,u;a||r();var Z=t.length;if(Z%4>0)throw new Error("Invalid string. Length must be a multiple of 4");c="="===t[Z-2]?2:"="===t[Z-1]?1:0,u=new d(3*Z/4-c),n=c>0?Z-4:Z;var s=0;for(l=0,i=0;l<n;l+=4,i+=3)e=o[t.charCodeAt(l)]<<18|o[t.charCodeAt(l+1)]<<12|o[t.charCodeAt(l+2)]<<6|o[t.charCodeAt(l+3)],u[s++]=e>>16&255,u[s++]=e>>8&255,u[s++]=255&e;return 2===c?(e=o[t.charCodeAt(l)]<<2|o[t.charCodeAt(l+1)]>>4,u[s++]=255&e):1===c&&(e=o[t.charCodeAt(l)]<<10|o[t.charCodeAt(l+1)]<<4|o[t.charCodeAt(l+2)]>>2,u[s++]=e>>8&255,u[s++]=255&e),u}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(D,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function $(t,l,i,n){for(var e=0;e<n&&!(e+i>=l.length||e>=t.length);++e)l[e+i]=t[e];return e}function tt(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var lt=function(t,l){return function(){for(var i=new Array(arguments.length),n=0;n<i.length;n++)i[n]=arguments[n];return t.apply(l,i)}},it=Object.prototype.toString;function nt(t){return"[object Array]"===it.call(t)}function et(t){return void 0===t}function ct(t){return null!==t&&"object"==typeof t}function ot(t){if("[object Object]"!==it.call(t))return!1;var l=Object.getPrototypeOf(t);return null===l||l===Object.prototype}function dt(t){return"[object Function]"===it.call(t)}function at(t,l){if(null!=t)if("object"!=typeof t&&(t=[t]),nt(t))for(var i=0,n=t.length;i<n;i++)l.call(null,t[i],i,t);else for(var e in t)Object.prototype.hasOwnProperty.call(t,e)&&l.call(null,t[e],e,t)}var rt={isArray:nt,isArrayBuffer:function(t){return"[object ArrayBuffer]"===it.call(t)},isBuffer:function(t){return null!==t&&!et(t)&&null!==t.constructor&&!et(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:ct,isPlainObject:ot,isUndefined:et,isDate:function(t){return"[object Date]"===it.call(t)},isFile:function(t){return"[object File]"===it.call(t)},isBlob:function(t){return"[object Blob]"===it.call(t)},isFunction:dt,isStream:function(t){return ct(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:at,merge:function t(){var l={};function i(i,n){ot(l[n])&&ot(i)?l[n]=t(l[n],i):ot(i)?l[n]=t({},i):nt(i)?l[n]=i.slice():l[n]=i}for(var n=0,e=arguments.length;n<e;n++)at(arguments[n],i);return l},extend:function(t,l,i){return at(l,(function(l,n){t[n]=i&&"function"==typeof l?lt(l,i):l})),t},trim:function(t){return t.replace(/^\s*/,"").replace(/\s*$/,"")},stripBOM:function(t){return 65279===t.charCodeAt(0)&&(t=t.slice(1)),t}};function ut(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,l,i){if(!l)return t;var n;if(i)n=i(l);else if(rt.isURLSearchParams(l))n=l.toString();else{var e=[];rt.forEach(l,(function(t,l){null!=t&&(rt.isArray(t)?l+="[]":t=[t],rt.forEach(t,(function(t){rt.isDate(t)?t=t.toISOString():rt.isObject(t)&&(t=JSON.stringify(t)),e.push(ut(l)+"="+ut(t))})))})),n=e.join("&")}if(n){var c=t.indexOf("#");-1!==c&&(t=t.slice(0,c)),t+=(-1===t.indexOf("?")?"?":"&")+n}return t};function st(){this.handlers=[]}st.prototype.use=function(t,l){return this.handlers.push({fulfilled:t,rejected:l}),this.handlers.length-1},st.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)},st.prototype.forEach=function(t){rt.forEach(this.handlers,(function(l){null!==l&&t(l)}))};var bt=st,mt=function(t,l,i){return rt.forEach(i,(function(i){t=i(t,l)})),t},ht=function(t){return!(!t||!t.__CANCEL__)};function It(){throw new Error("setTimeout has not been defined")}function pt(){throw new Error("clearTimeout has not been defined")}var Gt=It,yt=pt;function Xt(t){if(Gt===setTimeout)return setTimeout(t,0);if((Gt===It||!Gt)&&setTimeout)return Gt=setTimeout,setTimeout(t,0);try{return Gt(t,0)}catch(l){try{return Gt.call(null,t,0)}catch(l){return Gt.call(this,t,0)}}}"function"==typeof e.setTimeout&&(Gt=setTimeout),"function"==typeof e.clearTimeout&&(yt=clearTimeout);var gt,Vt=[],Wt=!1,Ct=-1;function Rt(){Wt&>&&(Wt=!1,gt.length?Vt=gt.concat(Vt):Ct=-1,Vt.length&&St())}function St(){if(!Wt){var t=Xt(Rt);Wt=!0;for(var l=Vt.length;l;){for(gt=Vt,Vt=[];++Ct<l;)gt&>[Ct].run();Ct=-1,l=Vt.length}gt=null,Wt=!1,function(t){if(yt===clearTimeout)return clearTimeout(t);if((yt===pt||!yt)&&clearTimeout)return yt=clearTimeout,clearTimeout(t);try{yt(t)}catch(l){try{return yt.call(null,t)}catch(l){return yt.call(this,t)}}}(t)}}function Kt(t,l){this.fun=t,this.array=l}function ft(){}Kt.prototype.run=function(){this.fun.apply(null,this.array)};var Yt=ft,vt=ft,Nt=ft,Jt=ft,Ht=ft,Lt=ft,Ut=ft,xt=e.performance||{},Tt=xt.now||xt.mozNow||xt.msNow||xt.oNow||xt.webkitNow||function(){return(new Date).getTime()},kt=new Date,Bt={nextTick:function(t){var l=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)l[i-1]=arguments[i];Vt.push(new Kt(t,l)),1!==Vt.length||Wt||Xt(St)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:Yt,addListener:vt,once:Nt,off:Jt,removeListener:Ht,removeAllListeners:Lt,emit:Ut,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 l=.001*Tt.call(xt),i=Math.floor(l),n=Math.floor(l%1*1e9);return t&&(i-=t[0],(n-=t[1])<0&&(i--,n+=1e9)),[i,n]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-kt)/1e3}},Ft=function(t,l){rt.forEach(t,(function(i,n){n!==l&&n.toUpperCase()===l.toUpperCase()&&(t[l]=i,delete t[n])}))},zt=function(t,l,i,n,e){return function(t,l,i,n,e){return t.config=l,i&&(t.code=i),t.request=n,t.response=e,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}(new Error(t),l,i,n,e)},At=rt.isStandardBrowserEnv()?{write:function(t,l,i,n,e,c){var o=[];o.push(t+"="+encodeURIComponent(l)),rt.isNumber(i)&&o.push("expires="+new Date(i).toGMTString()),rt.isString(n)&&o.push("path="+n),rt.isString(e)&&o.push("domain="+e),!0===c&&o.push("secure"),document.cookie=o.join("; ")},read:function(t){var l=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return l?decodeURIComponent(l[3]):null},remove:function(t){this.write(t,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},wt=["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"],Qt=rt.isStandardBrowserEnv()?function(){var t,l=/(msie|trident)/i.test(navigator.userAgent),i=document.createElement("a");function n(t){var n=t;return l&&(i.setAttribute("href",n),n=i.href),i.setAttribute("href",n),{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=n(window.location.href),function(l){var i=rt.isString(l)?n(l):l;return i.protocol===t.protocol&&i.host===t.host}}():function(){return!0},Pt={"Content-Type":"application/x-www-form-urlencoded"};function Mt(t,l){!rt.isUndefined(t)&&rt.isUndefined(t["Content-Type"])&&(t["Content-Type"]=l)}var jt,Et={adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==Bt&&"[object process]"===Object.prototype.toString.call(Bt))&&(jt=function(t){return new Promise((function(l,i){var n=t.data,e=t.headers;rt.isFormData(n)&&delete e["Content-Type"];var c=new XMLHttpRequest;if(t.auth){var o=t.auth.username||"",d=t.auth.password?unescape(encodeURIComponent(t.auth.password)):"";e.Authorization="Basic "+btoa(o+":"+d)}var a,r,u=(a=t.baseURL,r=t.url,a&&!/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(r)?function(t,l){return l?t.replace(/\/+$/,"")+"/"+l.replace(/^\/+/,""):t}(a,r):r);if(c.open(t.method.toUpperCase(),Zt(u,t.params,t.paramsSerializer),!0),c.timeout=t.timeout,c.onreadystatechange=function(){if(c&&4===c.readyState&&(0!==c.status||c.responseURL&&0===c.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in c?function(t){var l,i,n,e={};return t?(rt.forEach(t.split("\n"),(function(t){if(n=t.indexOf(":"),l=rt.trim(t.substr(0,n)).toLowerCase(),i=rt.trim(t.substr(n+1)),l){if(e[l]&&wt.indexOf(l)>=0)return;e[l]="set-cookie"===l?(e[l]?e[l]:[]).concat([i]):e[l]?e[l]+", "+i:i}})),e):e}(c.getAllResponseHeaders()):null,e={data:t.responseType&&"text"!==t.responseType?c.response:c.responseText,status:c.status,statusText:c.statusText,headers:n,config:t,request:c};!function(t,l,i){var n=i.config.validateStatus;i.status&&n&&!n(i.status)?l(zt("Request failed with status code "+i.status,i.config,null,i.request,i)):t(i)}(l,i,e),c=null}},c.onabort=function(){c&&(i(zt("Request aborted",t,"ECONNABORTED",c)),c=null)},c.onerror=function(){i(zt("Network Error",t,null,c)),c=null},c.ontimeout=function(){var l="timeout of "+t.timeout+"ms exceeded";t.timeoutErrorMessage&&(l=t.timeoutErrorMessage),i(zt(l,t,"ECONNABORTED",c)),c=null},rt.isStandardBrowserEnv()){var Z=(t.withCredentials||Qt(u))&&t.xsrfCookieName?At.read(t.xsrfCookieName):void 0;Z&&(e[t.xsrfHeaderName]=Z)}if("setRequestHeader"in c&&rt.forEach(e,(function(t,l){void 0===n&&"content-type"===l.toLowerCase()?delete e[l]:c.setRequestHeader(l,t)})),rt.isUndefined(t.withCredentials)||(c.withCredentials=!!t.withCredentials),t.responseType)try{c.responseType=t.responseType}catch(l){if("json"!==t.responseType)throw l}"function"==typeof t.onDownloadProgress&&c.addEventListener("progress",t.onDownloadProgress),"function"==typeof t.onUploadProgress&&c.upload&&c.upload.addEventListener("progress",t.onUploadProgress),t.cancelToken&&t.cancelToken.promise.then((function(t){c&&(c.abort(),i(t),c=null)})),n||(n=null),c.send(n)}))}),jt),transformRequest:[function(t,l){return Ft(l,"Accept"),Ft(l,"Content-Type"),rt.isFormData(t)||rt.isArrayBuffer(t)||rt.isBuffer(t)||rt.isStream(t)||rt.isFile(t)||rt.isBlob(t)?t:rt.isArrayBufferView(t)?t.buffer:rt.isURLSearchParams(t)?(Mt(l,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):rt.isObject(t)?(Mt(l,"application/json;charset=utf-8"),JSON.stringify(t)):t}],transformResponse:[function(t){if("string"==typeof t)try{t=JSON.parse(t)}catch(t){}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};rt.forEach(["delete","get","head"],(function(t){Et.headers[t]={}})),rt.forEach(["post","put","patch"],(function(t){Et.headers[t]=rt.merge(Pt)}));var Dt=Et;function Ot(t){t.cancelToken&&t.cancelToken.throwIfRequested()}var qt=function(t){return Ot(t),t.headers=t.headers||{},t.data=mt(t.data,t.headers,t.transformRequest),t.headers=rt.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),rt.forEach(["delete","get","head","post","put","patch","common"],(function(l){delete t.headers[l]})),(t.adapter||Dt.adapter)(t).then((function(l){return Ot(t),l.data=mt(l.data,l.headers,t.transformResponse),l}),(function(l){return ht(l)||(Ot(t),l&&l.response&&(l.response.data=mt(l.response.data,l.response.headers,t.transformResponse))),Promise.reject(l)}))},_t=function(t,l){l=l||{};var i={},n=["url","method","data"],e=["headers","auth","proxy","params"],c=["baseURL","transformRequest","transformResponse","paramsSerializer","timeout","timeoutMessage","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","decompress","maxContentLength","maxBodyLength","maxRedirects","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding"],o=["validateStatus"];function d(t,l){return rt.isPlainObject(t)&&rt.isPlainObject(l)?rt.merge(t,l):rt.isPlainObject(l)?rt.merge({},l):rt.isArray(l)?l.slice():l}function a(n){rt.isUndefined(l[n])?rt.isUndefined(t[n])||(i[n]=d(void 0,t[n])):i[n]=d(t[n],l[n])}rt.forEach(n,(function(t){rt.isUndefined(l[t])||(i[t]=d(void 0,l[t]))})),rt.forEach(e,a),rt.forEach(c,(function(n){rt.isUndefined(l[n])?rt.isUndefined(t[n])||(i[n]=d(void 0,t[n])):i[n]=d(void 0,l[n])})),rt.forEach(o,(function(n){n in l?i[n]=d(t[n],l[n]):n in t&&(i[n]=d(void 0,t[n]))}));var r=n.concat(e).concat(c).concat(o),u=Object.keys(t).concat(Object.keys(l)).filter((function(t){return-1===r.indexOf(t)}));return rt.forEach(u,a),i};function $t(t){this.defaults=t,this.interceptors={request:new bt,response:new bt}}$t.prototype.request=function(t){"string"==typeof t?(t=arguments[1]||{}).url=arguments[0]:t=t||{},(t=_t(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var l=[qt,void 0],i=Promise.resolve(t);for(this.interceptors.request.forEach((function(t){l.unshift(t.fulfilled,t.rejected)})),this.interceptors.response.forEach((function(t){l.push(t.fulfilled,t.rejected)}));l.length;)i=i.then(l.shift(),l.shift());return i},$t.prototype.getUri=function(t){return t=_t(this.defaults,t),Zt(t.url,t.params,t.paramsSerializer).replace(/^\?/,"")},rt.forEach(["delete","get","head","options"],(function(t){$t.prototype[t]=function(l,i){return this.request(_t(i||{},{method:t,url:l,data:(i||{}).data}))}})),rt.forEach(["post","put","patch"],(function(t){$t.prototype[t]=function(l,i,n){return this.request(_t(n||{},{method:t,url:l,data:i}))}}));var tl=$t;function ll(t){this.message=t}ll.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},ll.prototype.__CANCEL__=!0;var il=ll;function nl(t){if("function"!=typeof t)throw new TypeError("executor must be a function.");var l;this.promise=new Promise((function(t){l=t}));var i=this;t((function(t){i.reason||(i.reason=new il(t),l(i.reason))}))}nl.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},nl.source=function(){var t;return{token:new nl((function(l){t=l})),cancel:t}};var el=nl;function cl(t){var l=new tl(t),i=lt(tl.prototype.request,l);return rt.extend(i,tl.prototype,l),rt.extend(i,l),i}var ol=cl(Dt);ol.Axios=tl,ol.create=function(t){return cl(_t(ol.defaults,t))},ol.Cancel=il,ol.CancelToken=el,ol.isCancel=ht,ol.all=function(t){return Promise.all(t)},ol.spread=function(t){return function(l){return t.apply(null,l)}},ol.isAxiosError=function(t){return"object"==typeof t&&!0===t.isAxiosError};var dl=ol,al=ol;dl.default=al;var rl,ul,Zl=dl;
|
|
17
|
+
/*! *****************************************************************************
|
|
18
|
+
Copyright (c) Microsoft Corporation.
|
|
19
|
+
|
|
20
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
21
|
+
purpose with or without fee is hereby granted.
|
|
22
|
+
|
|
23
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
24
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
25
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
26
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
27
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
28
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
29
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
30
|
+
***************************************************************************** */function sl(t,l,i,n){return new(i||(i=Promise))((function(e,c){function o(t){try{a(n.next(t))}catch(t){c(t)}}function d(t){try{a(n.throw(t))}catch(t){c(t)}}function a(t){var l;t.done?e(t.value):(l=t.value,l instanceof i?l:new i((function(t){t(l)}))).then(o,d)}a((n=n.apply(t,l||[])).next())}))}(ul=rl||(rl={})).formPost="form_post",ul.query="query";const bl="{{token}}",ml="{{username}}",hl="{{scope}}",Il="{{clientID}}",pl="{{clientSecret}}";var Gl;!function(t){t.ConfigData="config_data",t.OIDCProviderMetaData="oidc_provider_meta_data",t.SessionData="session_data",t.TemporaryData="temporary_data"}(Gl||(Gl={}));const yl="refresh_token_timer",Xl="pkce_code_verifier",gl="code",Vl="session_state",Wl="sign_out_url",Cl="sign_out_success",Rl="openid";class Sl extends Error{constructor(t,l,i,n,e,c){super(null!=n?n:null==c?void 0:c.message),this.name=this.constructor.name,this.code=t,this.file=l,this.method=i,this.description=e,this.error=c,Object.setPrototypeOf(this,new.target.prototype)}}class Kl extends Sl{constructor(t,l,i,n,e,c,o,d,a){super(t,l,i,n,e),this.name=this.constructor.name,this.code=t,this.file=l,this.method=i,this.description=e,this.networkErrorCode=c,this.networkErrorMessage=o,this.status=d,this.networkErrorData=a}}var fl="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==e?e:"undefined"!=typeof self?self:{};function Yl(t,l,i){return t(i={path:l,exports:{},require:function(t,l){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==l&&i.path)}},i.exports),i.exports}var vl=void 0!==e?e:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},Nl=[],Jl=[],Hl="undefined"!=typeof Uint8Array?Uint8Array:Array,Ll=!1;function Ul(){Ll=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=0,i=t.length;l<i;++l)Nl[l]=t[l],Jl[t.charCodeAt(l)]=l;Jl["-".charCodeAt(0)]=62,Jl["_".charCodeAt(0)]=63}function xl(t,l,i){for(var n,e,c=[],o=l;o<i;o+=3)n=(t[o]<<16)+(t[o+1]<<8)+t[o+2],c.push(Nl[(e=n)>>18&63]+Nl[e>>12&63]+Nl[e>>6&63]+Nl[63&e]);return c.join("")}function Tl(t){var l;Ll||Ul();for(var i=t.length,n=i%3,e="",c=[],o=16383,d=0,a=i-n;d<a;d+=o)c.push(xl(t,d,d+o>a?a:d+o));return 1===n?(l=t[i-1],e+=Nl[l>>2],e+=Nl[l<<4&63],e+="=="):2===n&&(l=(t[i-2]<<8)+t[i-1],e+=Nl[l>>10],e+=Nl[l>>4&63],e+=Nl[l<<2&63],e+="="),c.push(e),c.join("")}function kl(t,l,i,n,e){var c,o,d=8*e-n-1,a=(1<<d)-1,r=a>>1,u=-7,Z=i?e-1:0,s=i?-1:1,b=t[l+Z];for(Z+=s,c=b&(1<<-u)-1,b>>=-u,u+=d;u>0;c=256*c+t[l+Z],Z+=s,u-=8);for(o=c&(1<<-u)-1,c>>=-u,u+=n;u>0;o=256*o+t[l+Z],Z+=s,u-=8);if(0===c)c=1-r;else{if(c===a)return o?NaN:1/0*(b?-1:1);o+=Math.pow(2,n),c-=r}return(b?-1:1)*o*Math.pow(2,c-n)}function Bl(t,l,i,n,e,c){var o,d,a,r=8*c-e-1,u=(1<<r)-1,Z=u>>1,s=23===e?Math.pow(2,-24)-Math.pow(2,-77):0,b=n?0:c-1,m=n?1:-1,h=l<0||0===l&&1/l<0?1:0;for(l=Math.abs(l),isNaN(l)||l===1/0?(d=isNaN(l)?1:0,o=u):(o=Math.floor(Math.log(l)/Math.LN2),l*(a=Math.pow(2,-o))<1&&(o--,a*=2),(l+=o+Z>=1?s/a:s*Math.pow(2,1-Z))*a>=2&&(o++,a/=2),o+Z>=u?(d=0,o=u):o+Z>=1?(d=(l*a-1)*Math.pow(2,e),o+=Z):(d=l*Math.pow(2,Z-1)*Math.pow(2,e),o=0));e>=8;t[i+b]=255&d,b+=m,d/=256,e-=8);for(o=o<<e|d,r+=e;r>0;t[i+b]=255&o,b+=m,o/=256,r-=8);t[i+b-m]|=128*h}var Fl={}.toString,zl=Array.isArray||function(t){return"[object Array]"==Fl.call(t)};Pl.TYPED_ARRAY_SUPPORT=void 0===vl.TYPED_ARRAY_SUPPORT||vl.TYPED_ARRAY_SUPPORT;var Al=wl();function wl(){return Pl.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Ql(t,l){if(wl()<l)throw new RangeError("Invalid typed array length");return Pl.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(l)).__proto__=Pl.prototype:(null===t&&(t=new Pl(l)),t.length=l),t}function Pl(t,l,i){if(!(Pl.TYPED_ARRAY_SUPPORT||this instanceof Pl))return new Pl(t,l,i);if("number"==typeof t){if("string"==typeof l)throw new Error("If encoding is specified then the first argument must be a string");return El(this,t)}return Ml(this,t,l,i)}function Ml(t,l,i,n){if("number"==typeof l)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&l instanceof ArrayBuffer?function(t,l,i,n){if(l.byteLength,i<0||l.byteLength<i)throw new RangeError("'offset' is out of bounds");if(l.byteLength<i+(n||0))throw new RangeError("'length' is out of bounds");return l=void 0===i&&void 0===n?new Uint8Array(l):void 0===n?new Uint8Array(l,i):new Uint8Array(l,i,n),Pl.TYPED_ARRAY_SUPPORT?(t=l).__proto__=Pl.prototype:t=Dl(t,l),t}(t,l,i,n):"string"==typeof l?function(t,l,i){if("string"==typeof i&&""!==i||(i="utf8"),!Pl.isEncoding(i))throw new TypeError('"encoding" must be a valid string encoding');var n=0|_l(l,i),e=(t=Ql(t,n)).write(l,i);return e!==n&&(t=t.slice(0,e)),t}(t,l,i):function(t,l){if(ql(l)){var i=0|Ol(l.length);return 0===(t=Ql(t,i)).length||l.copy(t,0,0,i),t}if(l){if("undefined"!=typeof ArrayBuffer&&l.buffer instanceof ArrayBuffer||"length"in l)return"number"!=typeof l.length||(n=l.length)!=n?Ql(t,0):Dl(t,l);if("Buffer"===l.type&&zl(l.data))return Dl(t,l.data)}var n;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,l)}function jl(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 El(t,l){if(jl(l),t=Ql(t,l<0?0:0|Ol(l)),!Pl.TYPED_ARRAY_SUPPORT)for(var i=0;i<l;++i)t[i]=0;return t}function Dl(t,l){var i=l.length<0?0:0|Ol(l.length);t=Ql(t,i);for(var n=0;n<i;n+=1)t[n]=255&l[n];return t}function Ol(t){if(t>=wl())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+wl().toString(16)+" bytes");return 0|t}function ql(t){return!(null==t||!t._isBuffer)}function _l(t,l){if(ql(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var i=t.length;if(0===i)return 0;for(var n=!1;;)switch(l){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(n)return Ci(t).length;l=(""+l).toLowerCase(),n=!0}}function $l(t,l,i){var n=!1;if((void 0===l||l<0)&&(l=0),l>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(l>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return bi(this,l,i);case"utf8":case"utf-8":return ui(this,l,i);case"ascii":return Zi(this,l,i);case"latin1":case"binary":return si(this,l,i);case"base64":return ri(this,l,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return mi(this,l,i);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function ti(t,l,i){var n=t[l];t[l]=t[i],t[i]=n}function li(t,l,i,n,e){if(0===t.length)return-1;if("string"==typeof i?(n=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),i=+i,isNaN(i)&&(i=e?0:t.length-1),i<0&&(i=t.length+i),i>=t.length){if(e)return-1;i=t.length-1}else if(i<0){if(!e)return-1;i=0}if("string"==typeof l&&(l=Pl.from(l,n)),ql(l))return 0===l.length?-1:ii(t,l,i,n,e);if("number"==typeof l)return l&=255,Pl.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?e?Uint8Array.prototype.indexOf.call(t,l,i):Uint8Array.prototype.lastIndexOf.call(t,l,i):ii(t,[l],i,n,e);throw new TypeError("val must be string, number or Buffer")}function ii(t,l,i,n,e){var c,o=1,d=t.length,a=l.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||l.length<2)return-1;o=2,d/=2,a/=2,i/=2}function r(t,l){return 1===o?t[l]:t.readUInt16BE(l*o)}if(e){var u=-1;for(c=i;c<d;c++)if(r(t,c)===r(l,-1===u?0:c-u)){if(-1===u&&(u=c),c-u+1===a)return u*o}else-1!==u&&(c-=c-u),u=-1}else for(i+a>d&&(i=d-a),c=i;c>=0;c--){for(var Z=!0,s=0;s<a;s++)if(r(t,c+s)!==r(l,s)){Z=!1;break}if(Z)return c}return-1}function ni(t,l,i,n){i=Number(i)||0;var e=t.length-i;n?(n=Number(n))>e&&(n=e):n=e;var c=l.length;if(c%2!=0)throw new TypeError("Invalid hex string");n>c/2&&(n=c/2);for(var o=0;o<n;++o){var d=parseInt(l.substr(2*o,2),16);if(isNaN(d))return o;t[i+o]=d}return o}function ei(t,l,i,n){return Si(Ci(l,t.length-i),t,i,n)}function ci(t,l,i,n){return Si(function(t){for(var l=[],i=0;i<t.length;++i)l.push(255&t.charCodeAt(i));return l}(l),t,i,n)}function oi(t,l,i,n){return ci(t,l,i,n)}function di(t,l,i,n){return Si(Ri(l),t,i,n)}function ai(t,l,i,n){return Si(function(t,l){for(var i,n,e,c=[],o=0;o<t.length&&!((l-=2)<0);++o)n=(i=t.charCodeAt(o))>>8,e=i%256,c.push(e),c.push(n);return c}(l,t.length-i),t,i,n)}function ri(t,l,i){return 0===l&&i===t.length?Tl(t):Tl(t.slice(l,i))}function ui(t,l,i){i=Math.min(t.length,i);for(var n=[],e=l;e<i;){var c,o,d,a,r=t[e],u=null,Z=r>239?4:r>223?3:r>191?2:1;if(e+Z<=i)switch(Z){case 1:r<128&&(u=r);break;case 2:128==(192&(c=t[e+1]))&&(a=(31&r)<<6|63&c)>127&&(u=a);break;case 3:c=t[e+1],o=t[e+2],128==(192&c)&&128==(192&o)&&(a=(15&r)<<12|(63&c)<<6|63&o)>2047&&(a<55296||a>57343)&&(u=a);break;case 4:c=t[e+1],o=t[e+2],d=t[e+3],128==(192&c)&&128==(192&o)&&128==(192&d)&&(a=(15&r)<<18|(63&c)<<12|(63&o)<<6|63&d)>65535&&a<1114112&&(u=a)}null===u?(u=65533,Z=1):u>65535&&(u-=65536,n.push(u>>>10&1023|55296),u=56320|1023&u),n.push(u),e+=Z}return function(t){var l=t.length;if(l<=4096)return String.fromCharCode.apply(String,t);for(var i="",n=0;n<l;)i+=String.fromCharCode.apply(String,t.slice(n,n+=4096));return i}(n)}function Zi(t,l,i){var n="";i=Math.min(t.length,i);for(var e=l;e<i;++e)n+=String.fromCharCode(127&t[e]);return n}function si(t,l,i){var n="";i=Math.min(t.length,i);for(var e=l;e<i;++e)n+=String.fromCharCode(t[e]);return n}function bi(t,l,i){var n=t.length;(!l||l<0)&&(l=0),(!i||i<0||i>n)&&(i=n);for(var e="",c=l;c<i;++c)e+=Wi(t[c]);return e}function mi(t,l,i){for(var n=t.slice(l,i),e="",c=0;c<n.length;c+=2)e+=String.fromCharCode(n[c]+256*n[c+1]);return e}function hi(t,l,i){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+l>i)throw new RangeError("Trying to access beyond buffer length")}function Ii(t,l,i,n,e,c){if(!ql(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(l>e||l<c)throw new RangeError('"value" argument is out of bounds');if(i+n>t.length)throw new RangeError("Index out of range")}function pi(t,l,i,n){l<0&&(l=65535+l+1);for(var e=0,c=Math.min(t.length-i,2);e<c;++e)t[i+e]=(l&255<<8*(n?e:1-e))>>>8*(n?e:1-e)}function Gi(t,l,i,n){l<0&&(l=4294967295+l+1);for(var e=0,c=Math.min(t.length-i,4);e<c;++e)t[i+e]=l>>>8*(n?e:3-e)&255}function yi(t,l,i,n,e,c){if(i+n>t.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function Xi(t,l,i,n,e){return e||yi(t,0,i,4),Bl(t,l,i,n,23,4),i+4}function gi(t,l,i,n,e){return e||yi(t,0,i,8),Bl(t,l,i,n,52,8),i+8}Pl.poolSize=8192,Pl._augment=function(t){return t.__proto__=Pl.prototype,t},Pl.from=function(t,l,i){return Ml(null,t,l,i)},Pl.TYPED_ARRAY_SUPPORT&&(Pl.prototype.__proto__=Uint8Array.prototype,Pl.__proto__=Uint8Array),Pl.alloc=function(t,l,i){return function(t,l,i,n){return jl(l),l<=0?Ql(t,l):void 0!==i?"string"==typeof n?Ql(t,l).fill(i,n):Ql(t,l).fill(i):Ql(t,l)}(null,t,l,i)},Pl.allocUnsafe=function(t){return El(null,t)},Pl.allocUnsafeSlow=function(t){return El(null,t)},Pl.isBuffer=Ki,Pl.compare=function(t,l){if(!ql(t)||!ql(l))throw new TypeError("Arguments must be Buffers");if(t===l)return 0;for(var i=t.length,n=l.length,e=0,c=Math.min(i,n);e<c;++e)if(t[e]!==l[e]){i=t[e],n=l[e];break}return i<n?-1:n<i?1:0},Pl.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}},Pl.concat=function(t,l){if(!zl(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return Pl.alloc(0);var i;if(void 0===l)for(l=0,i=0;i<t.length;++i)l+=t[i].length;var n=Pl.allocUnsafe(l),e=0;for(i=0;i<t.length;++i){var c=t[i];if(!ql(c))throw new TypeError('"list" argument must be an Array of Buffers');c.copy(n,e),e+=c.length}return n},Pl.byteLength=_l,Pl.prototype._isBuffer=!0,Pl.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 l=0;l<t;l+=2)ti(this,l,l+1);return this},Pl.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 l=0;l<t;l+=4)ti(this,l,l+3),ti(this,l+1,l+2);return this},Pl.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 l=0;l<t;l+=8)ti(this,l,l+7),ti(this,l+1,l+6),ti(this,l+2,l+5),ti(this,l+3,l+4);return this},Pl.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?ui(this,0,t):$l.apply(this,arguments)},Pl.prototype.equals=function(t){if(!ql(t))throw new TypeError("Argument must be a Buffer");return this===t||0===Pl.compare(this,t)},Pl.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+">"},Pl.prototype.compare=function(t,l,i,n,e){if(!ql(t))throw new TypeError("Argument must be a Buffer");if(void 0===l&&(l=0),void 0===i&&(i=t?t.length:0),void 0===n&&(n=0),void 0===e&&(e=this.length),l<0||i>t.length||n<0||e>this.length)throw new RangeError("out of range index");if(n>=e&&l>=i)return 0;if(n>=e)return-1;if(l>=i)return 1;if(this===t)return 0;for(var c=(e>>>=0)-(n>>>=0),o=(i>>>=0)-(l>>>=0),d=Math.min(c,o),a=this.slice(n,e),r=t.slice(l,i),u=0;u<d;++u)if(a[u]!==r[u]){c=a[u],o=r[u];break}return c<o?-1:o<c?1:0},Pl.prototype.includes=function(t,l,i){return-1!==this.indexOf(t,l,i)},Pl.prototype.indexOf=function(t,l,i){return li(this,t,l,i,!0)},Pl.prototype.lastIndexOf=function(t,l,i){return li(this,t,l,i,!1)},Pl.prototype.write=function(t,l,i,n){if(void 0===l)n="utf8",i=this.length,l=0;else if(void 0===i&&"string"==typeof l)n=l,i=this.length,l=0;else{if(!isFinite(l))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");l|=0,isFinite(i)?(i|=0,void 0===n&&(n="utf8")):(n=i,i=void 0)}var e=this.length-l;if((void 0===i||i>e)&&(i=e),t.length>0&&(i<0||l<0)||l>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var c=!1;;)switch(n){case"hex":return ni(this,t,l,i);case"utf8":case"utf-8":return ei(this,t,l,i);case"ascii":return ci(this,t,l,i);case"latin1":case"binary":return oi(this,t,l,i);case"base64":return di(this,t,l,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ai(this,t,l,i);default:if(c)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),c=!0}},Pl.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}},Pl.prototype.slice=function(t,l){var i,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(l=void 0===l?n:~~l)<0?(l+=n)<0&&(l=0):l>n&&(l=n),l<t&&(l=t),Pl.TYPED_ARRAY_SUPPORT)(i=this.subarray(t,l)).__proto__=Pl.prototype;else{var e=l-t;i=new Pl(e,void 0);for(var c=0;c<e;++c)i[c]=this[c+t]}return i},Pl.prototype.readUIntLE=function(t,l,i){t|=0,l|=0,i||hi(t,l,this.length);for(var n=this[t],e=1,c=0;++c<l&&(e*=256);)n+=this[t+c]*e;return n},Pl.prototype.readUIntBE=function(t,l,i){t|=0,l|=0,i||hi(t,l,this.length);for(var n=this[t+--l],e=1;l>0&&(e*=256);)n+=this[t+--l]*e;return n},Pl.prototype.readUInt8=function(t,l){return l||hi(t,1,this.length),this[t]},Pl.prototype.readUInt16LE=function(t,l){return l||hi(t,2,this.length),this[t]|this[t+1]<<8},Pl.prototype.readUInt16BE=function(t,l){return l||hi(t,2,this.length),this[t]<<8|this[t+1]},Pl.prototype.readUInt32LE=function(t,l){return l||hi(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},Pl.prototype.readUInt32BE=function(t,l){return l||hi(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},Pl.prototype.readIntLE=function(t,l,i){t|=0,l|=0,i||hi(t,l,this.length);for(var n=this[t],e=1,c=0;++c<l&&(e*=256);)n+=this[t+c]*e;return n>=(e*=128)&&(n-=Math.pow(2,8*l)),n},Pl.prototype.readIntBE=function(t,l,i){t|=0,l|=0,i||hi(t,l,this.length);for(var n=l,e=1,c=this[t+--n];n>0&&(e*=256);)c+=this[t+--n]*e;return c>=(e*=128)&&(c-=Math.pow(2,8*l)),c},Pl.prototype.readInt8=function(t,l){return l||hi(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},Pl.prototype.readInt16LE=function(t,l){l||hi(t,2,this.length);var i=this[t]|this[t+1]<<8;return 32768&i?4294901760|i:i},Pl.prototype.readInt16BE=function(t,l){l||hi(t,2,this.length);var i=this[t+1]|this[t]<<8;return 32768&i?4294901760|i:i},Pl.prototype.readInt32LE=function(t,l){return l||hi(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},Pl.prototype.readInt32BE=function(t,l){return l||hi(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},Pl.prototype.readFloatLE=function(t,l){return l||hi(t,4,this.length),kl(this,t,!0,23,4)},Pl.prototype.readFloatBE=function(t,l){return l||hi(t,4,this.length),kl(this,t,!1,23,4)},Pl.prototype.readDoubleLE=function(t,l){return l||hi(t,8,this.length),kl(this,t,!0,52,8)},Pl.prototype.readDoubleBE=function(t,l){return l||hi(t,8,this.length),kl(this,t,!1,52,8)},Pl.prototype.writeUIntLE=function(t,l,i,n){t=+t,l|=0,i|=0,n||Ii(this,t,l,i,Math.pow(2,8*i)-1,0);var e=1,c=0;for(this[l]=255&t;++c<i&&(e*=256);)this[l+c]=t/e&255;return l+i},Pl.prototype.writeUIntBE=function(t,l,i,n){t=+t,l|=0,i|=0,n||Ii(this,t,l,i,Math.pow(2,8*i)-1,0);var e=i-1,c=1;for(this[l+e]=255&t;--e>=0&&(c*=256);)this[l+e]=t/c&255;return l+i},Pl.prototype.writeUInt8=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,1,255,0),Pl.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[l]=255&t,l+1},Pl.prototype.writeUInt16LE=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,2,65535,0),Pl.TYPED_ARRAY_SUPPORT?(this[l]=255&t,this[l+1]=t>>>8):pi(this,t,l,!0),l+2},Pl.prototype.writeUInt16BE=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,2,65535,0),Pl.TYPED_ARRAY_SUPPORT?(this[l]=t>>>8,this[l+1]=255&t):pi(this,t,l,!1),l+2},Pl.prototype.writeUInt32LE=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,4,4294967295,0),Pl.TYPED_ARRAY_SUPPORT?(this[l+3]=t>>>24,this[l+2]=t>>>16,this[l+1]=t>>>8,this[l]=255&t):Gi(this,t,l,!0),l+4},Pl.prototype.writeUInt32BE=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,4,4294967295,0),Pl.TYPED_ARRAY_SUPPORT?(this[l]=t>>>24,this[l+1]=t>>>16,this[l+2]=t>>>8,this[l+3]=255&t):Gi(this,t,l,!1),l+4},Pl.prototype.writeIntLE=function(t,l,i,n){if(t=+t,l|=0,!n){var e=Math.pow(2,8*i-1);Ii(this,t,l,i,e-1,-e)}var c=0,o=1,d=0;for(this[l]=255&t;++c<i&&(o*=256);)t<0&&0===d&&0!==this[l+c-1]&&(d=1),this[l+c]=(t/o>>0)-d&255;return l+i},Pl.prototype.writeIntBE=function(t,l,i,n){if(t=+t,l|=0,!n){var e=Math.pow(2,8*i-1);Ii(this,t,l,i,e-1,-e)}var c=i-1,o=1,d=0;for(this[l+c]=255&t;--c>=0&&(o*=256);)t<0&&0===d&&0!==this[l+c+1]&&(d=1),this[l+c]=(t/o>>0)-d&255;return l+i},Pl.prototype.writeInt8=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,1,127,-128),Pl.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[l]=255&t,l+1},Pl.prototype.writeInt16LE=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,2,32767,-32768),Pl.TYPED_ARRAY_SUPPORT?(this[l]=255&t,this[l+1]=t>>>8):pi(this,t,l,!0),l+2},Pl.prototype.writeInt16BE=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,2,32767,-32768),Pl.TYPED_ARRAY_SUPPORT?(this[l]=t>>>8,this[l+1]=255&t):pi(this,t,l,!1),l+2},Pl.prototype.writeInt32LE=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,4,2147483647,-2147483648),Pl.TYPED_ARRAY_SUPPORT?(this[l]=255&t,this[l+1]=t>>>8,this[l+2]=t>>>16,this[l+3]=t>>>24):Gi(this,t,l,!0),l+4},Pl.prototype.writeInt32BE=function(t,l,i){return t=+t,l|=0,i||Ii(this,t,l,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),Pl.TYPED_ARRAY_SUPPORT?(this[l]=t>>>24,this[l+1]=t>>>16,this[l+2]=t>>>8,this[l+3]=255&t):Gi(this,t,l,!1),l+4},Pl.prototype.writeFloatLE=function(t,l,i){return Xi(this,t,l,!0,i)},Pl.prototype.writeFloatBE=function(t,l,i){return Xi(this,t,l,!1,i)},Pl.prototype.writeDoubleLE=function(t,l,i){return gi(this,t,l,!0,i)},Pl.prototype.writeDoubleBE=function(t,l,i){return gi(this,t,l,!1,i)},Pl.prototype.copy=function(t,l,i,n){if(i||(i=0),n||0===n||(n=this.length),l>=t.length&&(l=t.length),l||(l=0),n>0&&n<i&&(n=i),n===i)return 0;if(0===t.length||0===this.length)return 0;if(l<0)throw new RangeError("targetStart out of bounds");if(i<0||i>=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-l<n-i&&(n=t.length-l+i);var e,c=n-i;if(this===t&&i<l&&l<n)for(e=c-1;e>=0;--e)t[e+l]=this[e+i];else if(c<1e3||!Pl.TYPED_ARRAY_SUPPORT)for(e=0;e<c;++e)t[e+l]=this[e+i];else Uint8Array.prototype.set.call(t,this.subarray(i,i+c),l);return c},Pl.prototype.fill=function(t,l,i,n){if("string"==typeof t){if("string"==typeof l?(n=l,l=0,i=this.length):"string"==typeof i&&(n=i,i=this.length),1===t.length){var e=t.charCodeAt(0);e<256&&(t=e)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!Pl.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof t&&(t&=255);if(l<0||this.length<l||this.length<i)throw new RangeError("Out of range index");if(i<=l)return this;var c;if(l>>>=0,i=void 0===i?this.length:i>>>0,t||(t=0),"number"==typeof t)for(c=l;c<i;++c)this[c]=t;else{var o=ql(t)?t:Ci(new Pl(t,n).toString()),d=o.length;for(c=0;c<i-l;++c)this[c+l]=o[c%d]}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,l){var i;l=l||1/0;for(var n=t.length,e=null,c=[],o=0;o<n;++o){if((i=t.charCodeAt(o))>55295&&i<57344){if(!e){if(i>56319){(l-=3)>-1&&c.push(239,191,189);continue}if(o+1===n){(l-=3)>-1&&c.push(239,191,189);continue}e=i;continue}if(i<56320){(l-=3)>-1&&c.push(239,191,189),e=i;continue}i=65536+(e-55296<<10|i-56320)}else e&&(l-=3)>-1&&c.push(239,191,189);if(e=null,i<128){if((l-=1)<0)break;c.push(i)}else if(i<2048){if((l-=2)<0)break;c.push(i>>6|192,63&i|128)}else if(i<65536){if((l-=3)<0)break;c.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((l-=4)<0)break;c.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return c}function Ri(t){return function(t){var l,i,n,e,c,o;Ll||Ul();var d=t.length;if(d%4>0)throw new Error("Invalid string. Length must be a multiple of 4");c="="===t[d-2]?2:"="===t[d-1]?1:0,o=new Hl(3*d/4-c),n=c>0?d-4:d;var a=0;for(l=0,i=0;l<n;l+=4,i+=3)e=Jl[t.charCodeAt(l)]<<18|Jl[t.charCodeAt(l+1)]<<12|Jl[t.charCodeAt(l+2)]<<6|Jl[t.charCodeAt(l+3)],o[a++]=e>>16&255,o[a++]=e>>8&255,o[a++]=255&e;return 2===c?(e=Jl[t.charCodeAt(l)]<<2|Jl[t.charCodeAt(l+1)]>>4,o[a++]=255&e):1===c&&(e=Jl[t.charCodeAt(l)]<<10|Jl[t.charCodeAt(l+1)]<<4|Jl[t.charCodeAt(l+2)]>>2,o[a++]=e>>8&255,o[a++]=255&e),o}(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,l,i,n){for(var e=0;e<n&&!(e+i>=l.length||e>=t.length);++e)l[e+i]=t[e];return e}function Ki(t){return null!=t&&(!!t._isBuffer||fi(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&fi(t.slice(0,0))}(t))}function fi(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var Yi=Object.freeze({__proto__:null,Buffer:Pl,INSPECT_MAX_BYTES:50,SlowBuffer:function(t){return+t!=t&&(t=0),Pl.alloc(+t)},isBuffer:Ki,kMaxLength:Al}),vi=Yl((function(t,l){Object.defineProperty(l,"__esModule",{value:!0}),l.default=function(t){var l=t.length,i=l%4;if(!i)return t;var n=l,e=4-i,c=l+e,o=Pl.alloc(c);for(o.write(t);e--;)o.write("=",n++);return o.toString()}})),Ni=Yl((function(t,l){function i(t,l){return void 0===l&&(l="utf8"),Pl.isBuffer(t)?e(t.toString("base64")):e(Pl.from(t,l).toString("base64"))}function n(t){return t=t.toString(),vi.default(t).replace(/\-/g,"+").replace(/_/g,"/")}function e(t){return t.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}Object.defineProperty(l,"__esModule",{value:!0});var c=i;c.encode=i,c.decode=function(t,l){return void 0===l&&(l="utf8"),Pl.from(n(t),"base64").toString(l)},c.toBase64=n,c.fromBase64=e,c.toBuffer=function(t){return Pl.from(n(t),"base64")},l.default=c})),Ji=Yl((function(t){t.exports=Ni.default,t.exports.default=t.exports})),Hi=function(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}(Yl((function(t){!function(l,i){var n={};!function(t){t.__esModule=!0,t.digestLength=32,t.blockSize=64;var l=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,n,e,c){for(var o,d,a,r,u,Z,s,b,m,h,I,p,G;c>=64;){for(o=i[0],d=i[1],a=i[2],r=i[3],u=i[4],Z=i[5],s=i[6],b=i[7],h=0;h<16;h++)I=e+4*h,t[h]=(255&n[I])<<24|(255&n[I+1])<<16|(255&n[I+2])<<8|255&n[I+3];for(h=16;h<64;h++)p=((m=t[h-2])>>>17|m<<15)^(m>>>19|m<<13)^m>>>10,G=((m=t[h-15])>>>7|m<<25)^(m>>>18|m<<14)^m>>>3,t[h]=(p+t[h-7]|0)+(G+t[h-16]|0);for(h=0;h<64;h++)p=(((u>>>6|u<<26)^(u>>>11|u<<21)^(u>>>25|u<<7))+(u&Z^~u&s)|0)+(b+(l[h]+t[h]|0)|0)|0,G=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+(o&d^o&a^d&a)|0,b=s,s=Z,Z=u,u=r+p|0,r=a,a=d,d=o,o=p+G|0;i[0]+=o,i[1]+=d,i[2]+=a,i[3]+=r,i[4]+=u,i[5]+=Z,i[6]+=s,i[7]+=b,e+=64,c-=64}return e}var n=function(){function l(){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 l.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},l.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()},l.prototype.update=function(t,l){if(void 0===l&&(l=t.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var n=0;if(this.bytesHashed+=l,this.bufferLength>0){for(;this.bufferLength<64&&l>0;)this.buffer[this.bufferLength++]=t[n++],l--;64===this.bufferLength&&(i(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(l>=64&&(n=i(this.temp,this.state,t,n,l),l%=64);l>0;)this.buffer[this.bufferLength++]=t[n++],l--;return this},l.prototype.finish=function(t){if(!this.finished){var l=this.bytesHashed,n=this.bufferLength,e=l/536870912|0,c=l<<3,o=l%64<56?64:128;this.buffer[n]=128;for(var d=n+1;d<o-8;d++)this.buffer[d]=0;this.buffer[o-8]=e>>>24&255,this.buffer[o-7]=e>>>16&255,this.buffer[o-6]=e>>>8&255,this.buffer[o-5]=e>>>0&255,this.buffer[o-4]=c>>>24&255,this.buffer[o-3]=c>>>16&255,this.buffer[o-2]=c>>>8&255,this.buffer[o-1]=c>>>0&255,i(this.temp,this.state,this.buffer,0,o),this.finished=!0}for(d=0;d<8;d++)t[4*d+0]=this.state[d]>>>24&255,t[4*d+1]=this.state[d]>>>16&255,t[4*d+2]=this.state[d]>>>8&255,t[4*d+3]=this.state[d]>>>0&255;return this},l.prototype.digest=function(){var t=new Uint8Array(this.digestLength);return this.finish(t),t},l.prototype._saveState=function(t){for(var l=0;l<this.state.length;l++)t[l]=this.state[l]},l.prototype._restoreState=function(t,l){for(var i=0;i<this.state.length;i++)this.state[i]=t[i];this.bytesHashed=l,this.finished=!1,this.bufferLength=0},l}();t.Hash=n;var e=function(){function t(t){this.inner=new n,this.outer=new n,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var l=new Uint8Array(this.blockSize);if(t.length>this.blockSize)(new n).update(t).finish(l).clean();else for(var i=0;i<t.length;i++)l[i]=t[i];for(i=0;i<l.length;i++)l[i]^=54;for(this.inner.update(l),i=0;i<l.length;i++)l[i]^=106;for(this.outer.update(l),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate),i=0;i<l.length;i++)l[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 c(t){var l=(new n).update(t),i=l.digest();return l.clean(),i}function o(t,l){var i=new e(t).update(l),n=i.digest();return i.clean(),n}function d(t,l,i,n){var e=n[0];if(0===e)throw new Error("hkdf: cannot expand more");l.reset(),e>1&&l.update(t),i&&l.update(i),l.update(n),l.finish(t),n[0]++}t.HMAC=e,t.hash=c,t.default=c,t.hmac=o;var a=new Uint8Array(t.digestLength);t.hkdf=function(t,l,i,n){void 0===l&&(l=a),void 0===n&&(n=32);for(var c=new Uint8Array([1]),r=o(l,t),u=new e(r),Z=new Uint8Array(u.digestLength),s=Z.length,b=new Uint8Array(n),m=0;m<n;m++)s===Z.length&&(d(Z,u,i,c),s=0),b[m]=Z[s++];return u.clean(),Z.fill(0),c.fill(0),b},t.pbkdf2=function(t,l,i,n){for(var c=new e(t),o=c.digestLength,d=new Uint8Array(4),a=new Uint8Array(o),r=new Uint8Array(o),u=new Uint8Array(n),Z=0;Z*o<n;Z++){var s=Z+1;d[0]=s>>>24&255,d[1]=s>>>16&255,d[2]=s>>>8&255,d[3]=s>>>0&255,c.reset(),c.update(l),c.update(d),c.finish(r);for(var b=0;b<o;b++)a[b]=r[b];for(b=2;b<=i;b++){c.reset(),c.update(r).finish(r);for(var m=0;m<o;m++)a[m]^=r[m]}for(b=0;b<o&&Z*o+b<n;b++)u[Z*o+b]=a[b]}for(Z=0;Z<o;Z++)a[Z]=r[Z]=0;for(Z=0;Z<4;Z++)d[Z]=0;return c.clean(),u}}(n);var e=n.default;for(var c in n)e[c]=n[c];t.exports=e}()})));function Li(){throw new Error("setTimeout has not been defined")}function Ui(){throw new Error("clearTimeout has not been defined")}var xi=Li,Ti=Ui;function ki(t){if(xi===setTimeout)return setTimeout(t,0);if((xi===Li||!xi)&&setTimeout)return xi=setTimeout,setTimeout(t,0);try{return xi(t,0)}catch(l){try{return xi.call(null,t,0)}catch(l){return xi.call(this,t,0)}}}"function"==typeof vl.setTimeout&&(xi=setTimeout),"function"==typeof vl.clearTimeout&&(Ti=clearTimeout);var Bi,Fi=[],zi=!1,Ai=-1;function wi(){zi&&Bi&&(zi=!1,Bi.length?Fi=Bi.concat(Fi):Ai=-1,Fi.length&&Qi())}function Qi(){if(!zi){var t=ki(wi);zi=!0;for(var l=Fi.length;l;){for(Bi=Fi,Fi=[];++Ai<l;)Bi&&Bi[Ai].run();Ai=-1,l=Fi.length}Bi=null,zi=!1,function(t){if(Ti===clearTimeout)return clearTimeout(t);if((Ti===Ui||!Ti)&&clearTimeout)return Ti=clearTimeout,clearTimeout(t);try{Ti(t)}catch(l){try{return Ti.call(null,t)}catch(l){return Ti.call(this,t)}}}(t)}}function Pi(t,l){this.fun=t,this.array=l}Pi.prototype.run=function(){this.fun.apply(null,this.array)};var Mi=vl.performance||{},ji=(Mi.now||Mi.mozNow||Mi.msNow||Mi.oNow||Mi.webkitNow,new Date,function(t){var l=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)l[i-1]=arguments[i];Fi.push(new Pi(t,l)),1!==Fi.length||zi||ki(Qi)}),Ei=function(t){if(t.__esModule)return t;var l=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(t).forEach((function(i){var n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(l,i,n.get?n:{enumerable:!0,get:function(){return t[i]}})})),l}(Yi),Di=Yl((function(t,l){var i=Ei.Buffer;function n(t,l){for(var i in t)l[i]=t[i]}function e(t,l,n){return i(t,l,n)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?t.exports=Ei:(n(Ei,l),l.Buffer=e),n(i,e),e.from=function(t,l,n){if("number"==typeof t)throw new TypeError("Argument must not be a number");return i(t,l,n)},e.alloc=function(t,l,n){if("number"!=typeof t)throw new TypeError("Argument must be a number");var e=i(t);return void 0!==l?"string"==typeof n?e.fill(l,n):e.fill(l):e.fill(0),e},e.allocUnsafe=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return i(t)},e.allocUnsafeSlow=function(t){if("number"!=typeof t)throw new TypeError("Argument must be a number");return Ei.SlowBuffer(t)}})),Oi=Yl((function(t){var l=65536,i=Di.Buffer,n=fl.crypto||fl.msCrypto;n&&n.getRandomValues?t.exports=function(t,e){if(t>4294967295)throw new RangeError("requested too many random bytes");var c=i.allocUnsafe(t);if(t>0)if(t>l)for(var o=0;o<t;o+=l)n.getRandomValues(c.slice(o,o+l));else n.getRandomValues(c);return"function"==typeof e?ji((function(){e(null,c)})):c}:t.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")}}));const qi=new TextEncoder,_i=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 tn=t=>{let l=t;return l instanceof Uint8Array&&(l=_i.decode(l)),l=l.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,""),new Uint8Array($i.atob(l).split("").map(t=>t.charCodeAt(0)))};class ln extends Error{constructor(t){super(t),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}class nn extends ln{constructor(t,l="unspecified",i="unspecified"){super(t),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=l,this.reason=i}}class en extends ln{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}}class cn extends ln{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}}class on extends ln{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}}class dn extends ln{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}}class an extends ln{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}}class rn extends nn{constructor(){super(...arguments),this.code="ERR_JWT_EXPIRED"}}var un=$i.crypto;function Zn(){if(!$i.isSecureContext&&!$i.crypto.subtle)throw new ln("Web Cryptography API is available only in Secure Contexts. See: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts")}const sn=async t=>{var l,i;const{algorithm:n,keyUsages:e}=function(t){let l,i;switch(t.kty){case"oct":switch(t.alg){case"HS256":case"HS384":case"HS512":l={name:"HMAC",hash:"SHA-"+t.alg.substr(-3)},i=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new cn(t.alg+" keys cannot be imported as CryptoKey instances");case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":l={name:"AES-GCM"},i=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":l={name:"AES-KW"},i=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":l={name:"PBKDF2"},i=["deriveBits"];break;default:throw new cn('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(t.alg){case"PS256":case"PS384":case"PS512":l={name:"RSA-PSS",hash:"SHA-"+t.alg.substr(-3)},i=t.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":l={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":l={name:"RSA-OAEP",hash:"SHA-"+(parseInt(t.alg.substr(-3),10)||1)},i=t.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new cn('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(t.alg){case"ES256":case"ES384":case"ES512":l={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":l={name:"ECDH",namedCurve:t.crv},i=t.d?["deriveBits"]:[];break;default:throw new cn('unsupported or invalid JWK "alg" (Algorithm) Parameter value')}break;default:throw new cn('unsupported or invalid JWK "kty" (Key Type) Parameter value')}return{algorithm:l,keyUsages:i}}(t);let c="jwk",o={...t};return delete o.alg,"PBKDF2"===n.name&&(c="raw",o=tn(t.k)),Zn(),un.subtle.importKey(c,o,n,null!==(l=t.ext)&&void 0!==l&&l,null!==(i=t.key_ops)&&void 0!==i?i:e)};function bn(t){return!!t&&t.constructor===Object}async function mn(t,l,i){if(!bn(t))throw new TypeError("JWK must be an object");if(l||(l=t.alg),"string"!=typeof l||!l)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?sn({...t,alg:l,ext:!1}):tn(t.k);case"RSA":if(void 0!==t.oth)throw new cn('RSA JWK "oth" (Other Primes Info) Parameter value is unsupported');case"EC":case"OKP":return sn({...t,alg:l});default:throw new cn('unsupported "kty" (Key Type) Parameter value')}}const hn=function(t,l,i,n){if(void 0!==n.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 e of i.crit){if(!l.has(e))throw new cn(`Extension Header Parameter "${e}" is not supported by this implementation`);if(void 0===n[e])throw new t(`Extension Header Parameter "${e}" is missing`);if(l.get(e)&&void 0===i[e])throw new t(`Extension Header Parameter "${e}" MUST be integrity protected`)}return new Set(i.crit)}.bind(void 0,on,new Map([["b64",!0]])),In=((t,l)=>{if(void 0!==l&&(!Array.isArray(l)||l.some(t=>"string"!=typeof t)))throw new TypeError(`"${t}" option must be an array of strings`);if(l)return new Set(l)}).bind(void 0,"algorithms");const pn=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var Gn=t=>{const l=pn.exec(t);if(!l)throw new TypeError("invalid time period format");const i=parseFloat(l[1]);switch(l[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 yn=t=>t.toLowerCase().replace(/^application\//,"");var Xn=(t,l,i={})=>{const{typ:n}=i;if(n&&("string"!=typeof t.typ||yn(t.typ)!==yn(n)))throw new nn('unexpected "typ" JWT header value',"typ","check_failed");let e;try{e=JSON.parse(_i.decode(l))}catch(t){}if("object"!=typeof e||!e||Array.isArray(e))throw new dn("JWT Claims Set must be a top-level JSON object");const{issuer:c}=i;if(c&&!("string"==typeof c?[c]:c).includes(e.iss))throw new nn('unexpected "iss" claim value',"iss","check_failed");const{subject:o}=i;if(o&&e.sub!==o)throw new nn('unexpected "sub" claim value',"sub","check_failed");const{audience:d}=i;if(d&&(r="string"==typeof d?[d]:d,!("string"==typeof(a=e.aud)?r.includes(a):r.some(Set.prototype.has.bind(new Set(a))))))throw new nn('unexpected "aud" claim value',"aud","check_failed");var a,r;let u;switch(typeof i.clockTolerance){case"string":u=Gn(i.clockTolerance);break;case"number":u=i.clockTolerance;break;case"undefined":u=0;break;default:throw new TypeError("invalid clockTolerance option type")}const{currentDate:Z}=i,s=(b=Z||new Date,Math.floor(b.getTime()/1e3));var b;if(void 0!==e.iat||i.maxTokenAge){if("number"!=typeof e.iat)throw new nn('"iat" claim must be a number',"iat","invalid");if(void 0===e.exp&&e.iat>s+u)throw new nn('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}if(void 0!==e.nbf){if("number"!=typeof e.nbf)throw new nn('"nbf" claim must be a number',"nbf","invalid");if(e.nbf>s+u)throw new nn('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==e.exp){if("number"!=typeof e.exp)throw new nn('"exp" claim must be a number',"exp","invalid");if(e.exp<=s-u)throw new rn('"exp" claim timestamp check failed',"exp","check_failed")}if(i.maxTokenAge){const t=s-e.iat;if(t-u>("number"==typeof i.maxTokenAge?i.maxTokenAge:Gn(i.maxTokenAge)))throw new rn('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(t<0-u)throw new nn('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return e};class gn{constructor(){}static base64URLEncode(t){return Ji.encode(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}static getCodeVerifier(){return this.base64URLEncode(Oi(32))}static getCodeChallenge(t){return this.base64URLEncode(new G(Hi((new TextEncoder).encode(t))))}static getSupportedSignatureAlgorithms(){return["RS256","RS512","RS384","PS256"]}static getJWKForTheIdToken(t,l){const i=JSON.parse(Ji.decode(t,"utf8"));for(const t of l)if(i.kid===t.kid)return mn({alg:t.alg,e:t.e,kty:t.kty,n:t.n});return Promise.reject(new Sl("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: "+l.map(t=>t.kid).join(", ")))}static isValidIdToken(t,l,i,n,e,c){return async function(t,l,i){const n=await async function(t,l,i){if(t instanceof Uint8Array&&(t=_i.decode(t)),"string"!=typeof t)throw new on("Compact JWS must be a string or Uint8Array");const{0:n,1:e,2:c,length:o}=t.split(".");if(3!==o)throw new on("Invalid Compact JWS");const d=await async function(t,l,i){if(!bn(t))throw new on("Flattened JWS must be an object");if(void 0===t.protected&&void 0===t.header)throw new on('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==t.protected&&"string"!=typeof t.protected)throw new on("JWS Protected Header incorrect type");if(void 0===t.payload)throw new on("JWS Payload missing");if("string"!=typeof t.signature)throw new on("JWS Signature missing or incorrect type");if(void 0!==t.header&&!bn(t.header))throw new on("JWS Unprotected Header incorrect type");let n={};if(t.protected){const l=tn(t.protected);n=JSON.parse(_i.decode(l))}if(!((...t)=>{const l=t.filter(Boolean);if(0===l.length||1===l.length)return!0;let i;for(const t of l){const l=Object.keys(t);if(i&&0!==i.size)for(const t of l){if(i.has(t))return!1;i.add(t)}else i=new Set(l)}return!0})(n,t.header))throw new on("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const e={...n,...t.header};let c=!0;if(hn(n,e).has("b64")&&(c=n.b64,"boolean"!=typeof c))throw new on('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:o}=e;if("string"!=typeof o||!o)throw new on('JWS "alg" (Algorithm) Header Parameter missing or invalid');const d=i&&In(i.algorithms);if(d&&!d.has(o))throw new en('"alg" (Algorithm) Header Parameter not allowed');if(c){if("string"!=typeof t.payload)throw new on("JWS Payload must be a string")}else if("string"!=typeof t.payload&&!(t.payload instanceof Uint8Array))throw new on("JWS Payload must be a string or an Uint8Array instance");"function"==typeof l&&(l=await l(n,t)),((t,l)=>{if(t.startsWith("HS")||"dir"===t||t.startsWith("PBES2")||t.match(/^A\d{3}(?:GCM)KW$/)){if(l instanceof Uint8Array||"secret"===l.type)return;throw new TypeError('CryptoKey or KeyObject instances for symmetric algorithms must be of type "secret"')}if(l instanceof Uint8Array)throw new TypeError("CryptoKey or KeyObject instances must be used for asymmetric algorithms");if("secret"===l.type)throw new TypeError('CryptoKey or KeyObject instances for asymmetric algorithms must not be of type "secret"')})(o,l);const a=function(...t){const l=t.reduce((t,{length:l})=>t+l,0),i=new Uint8Array(l);let n=0;return t.forEach(t=>{i.set(t,n),n+=t.length}),i}(qi.encode(t.protected||""),qi.encode("."),"string"==typeof t.payload?qi.encode(t.payload):t.payload),r=tn(t.signature);if(!await(async(t,l,i,n)=>{let e;if(Zn(),l instanceof Uint8Array){if(!t.startsWith("HS"))throw new TypeError("symmetric keys are only applicable for HMAC-based algorithms");e=await un.subtle.importKey("raw",l,{hash:"SHA-"+t.substr(-3),name:"HMAC"},!1,["verify"])}else e=l;return((t,l)=>{if(t.startsWith("HS")){const i=parseInt(t.substr(-3),10),{length:n}=l.algorithm;if("number"!=typeof n||n<i)throw new TypeError(`${t} requires symmetric keys to be ${i} bits or larger`)}if(t.startsWith("RS")||t.startsWith("PS")){const{modulusLength:i}=l.algorithm;if("number"!=typeof i||i<2048)throw new TypeError(t+" requires key modulusLength to be 2048 bits or larger")}})(t,e),un.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 cn(`alg ${t} is unsupported either by JOSE or your javascript runtime`)}}(t),e,i,n)})(o,l,r,a))throw new an;let u;u=c?tn(t.payload):"string"==typeof t.payload?qi.encode(t.payload):t.payload;const Z={payload:u};return void 0!==t.protected&&(Z.protectedHeader=n),void 0!==t.header&&(Z.unprotectedHeader=t.header),Z}({payload:e||void 0,protected:n||void 0,signature:c||void 0},l,i);return{payload:d.payload,protectedHeader:d.protectedHeader}}(t,l,i);return{payload:Xn(n.protectedHeader,n.payload,i),protectedHeader:n.protectedHeader}}(t,l,{algorithms:this.getSupportedSignatureAlgorithms(),audience:i,clockTolerance:c,issuer:n,subject:e}).then(()=>Promise.resolve(!0)).catch(t=>Promise.reject(new Sl("CRYPTO_UTIL-IVIT-IV02","crypto-utils","isValidIdToken","Validating ID token failed",t)))}static decodeIDToken(t){try{const l=Ji.decode(t.split(".")[1],"utf8");return JSON.parse(l)}catch(t){throw new Sl("CRYPTO_UTIL-DIT-IV01","crypto-utils","decodeIDToken","Decoding ID token failed.",t)}}}class Vn{constructor(){}static getAuthenticatedUserInfo(t){var l,i,n;const e=gn.decodeIDToken(t),c=this.getTenantDomainFromIdTokenPayload(e),o=this.extractUserName(e),d=null!==(l=e.given_name)&&void 0!==l?l:"",a=null!==(i=e.family_name)&&void 0!==i?i:"",r=d&&a?`${d} ${a}`:d||a||"",u=null!==(n=e.preferred_username)&&void 0!==n?n:r;return Object.assign({displayName:u,tenantDomain:c,username:o},this.filterClaimsFromIDTokenPayload(e))}static filterClaimsFromIDTokenPayload(t){const l=Object.assign({},t);null==l||delete l.iss,null==l||delete l.sub,null==l||delete l.aud,null==l||delete l.exp,null==l||delete l.iat,null==l||delete l.acr,null==l||delete l.amr,null==l||delete l.azp,null==l||delete l.auth_time,null==l||delete l.nonce,null==l||delete l.c_hash,null==l||delete l.at_hash,null==l||delete l.nbf,null==l||delete l.isk,null==l||delete l.sid;const i={};return Object.entries(l).forEach(([t,l])=>{const n=t.split("_").map((t,l)=>0===l?t:[t[0].toUpperCase(),...t.slice(1)].join("")).join("");i[n]=l}),i}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}}Vn.extractUserName=(t,l="@")=>{const i=t.sub.split(l);return i.length>2&&i.pop(),i.join(l)},Vn.getTenantDomainFromIdTokenPayload=(t,l="@")=>{const i=t.sub.split(l);return i.length>2?i[i.length-1]:""};class Wn{constructor(t){this._dataLayer=t,this._config=()=>sl(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>sl(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}resolveWellKnownEndpoint(){return sl(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 sl(this,void 0,void 0,(function*(){const l={},i=yield this._config();return i.overrideWellEndpointConfig&&i.endpoints&&Object.keys(i.endpoints).forEach(t=>{const n=t.replace(/[A-Z]/g,t=>"_"+t.toLowerCase());l[n]=(null==i?void 0:i.endpoints)?i.endpoints[t]:""}),Object.assign(Object.assign({},t),l)}))}resolveFallbackEndpoints(){return sl(this,void 0,void 0,(function*(){const t={},l=yield this._config();l.endpoints&&Object.keys(l.endpoints).forEach(i=>{const n=i.replace(/[A-Z]/g,t=>"_"+t.toLowerCase());t[n]=(null==l?void 0:l.endpoints)?l.endpoints[i]:""});const i={authorization_endpoint:l.serverOrigin+"/oauth2/authorize",end_session_endpoint:l.serverOrigin+"/oidc/logout",jwks_uri:l.serverOrigin+"/oauth2/jwks",check_session_iframe:l.serverOrigin+"/oidc/checksession",revocation_endpoint:l.serverOrigin+"/oauth2/revoke",token_endpoint:l.serverOrigin+"/oauth2/token"};return Object.assign(Object.assign({},t),i)}))}validateIdToken(t){return sl(this,void 0,void 0,(function*(){const l=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();return l&&0!==l.trim().length?Zl.get(l,{withCredentials:null==i?void 0:i.sendCookiesInRequests}).then(l=>sl(this,void 0,void 0,(function*(){if(200!==l.status)return Promise.reject(new Sl("AUTH_HELPER-VIT-NR02","authentication-helper","validateIdToken","Invalid response status received for jwks request.","The request sent to get the jwks returned "+l.status+" , which is invalid."));const i=(yield this._oidcProviderMetaData()).issuer,n=(yield this.resolveWellKnownEndpoint()).split("/.well-known")[0];return i&&i===n?gn.getJWKForTheIdToken(t.split(".")[0],l.data.keys).then(l=>sl(this,void 0,void 0,(function*(){return gn.isValidIdToken(t,l,(yield this._config()).clientID,i,Vn.getAuthenticatedUserInfo(t).username,(yield this._config()).clockTolerance).then(t=>t).catch(t=>Promise.reject(new Sl("AUTH_HELPER-VIT-ES03","authentication-helper","validateIdToken",void 0,void 0,t)))}))).catch(t=>Promise.reject(new Sl("AUTH_HELPER-VIT-ES04","authentication-helper","validateIdToken",void 0,void 0,t))):Promise.resolve(!1)}))).catch(t=>{var l,i,n;return Promise.reject(new Kl("AUTH_HELPER-VIT-NR05","authentication-helper","validateIdToken","Request to jwks endpoint failed.","The request sent to get the jwks from the server failed.",null!==(l=null==t?void 0:t.code)&&void 0!==l?l:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(n=null==t?void 0:t.response)||void 0===n?void 0:n.data))}):Promise.reject(new Sl("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 l;return sl(this,void 0,void 0,(function*(){let i="openid";const n=yield this._config(),e=yield this._dataLayer.getSessionData();return n.scope&&n.scope.length>0&&(n.scope.includes("openid")||n.scope.push("openid"),i=n.scope.join(" ")),t.replace("{{token}}",e.access_token).replace("{{username}}",Vn.getAuthenticatedUserInfo(e.id_token).username).replace("{{scope}}",i).replace("{{clientID}}",n.clientID).replace("{{clientSecret}}",null!==(l=n.clientSecret)&&void 0!==l?l:"")}))}clearUserSessionData(){return sl(this,void 0,void 0,(function*(){yield this._dataLayer.removeOIDCProviderMetaData(),yield this._dataLayer.removeTemporaryData(),yield this._dataLayer.removeSessionData()}))}handleTokenResponse(t){return sl(this,void 0,void 0,(function*(){if(200!==t.status)return Promise.reject(new Sl("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(l=>sl(this,void 0,void 0,(function*(){if(l){yield this._dataLayer.setSessionData(t.data);const l={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(l)}return Promise.reject(new Sl("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 Sl("AUTH_HELPER-HAT-ES03","authentication-helper","handleTokenResponse",void 0,void 0,t)));{const l={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(l)}}))}}class Cn{constructor(t){this._authenticationHelper=new Wn(t),this._dataLayer=t,this._config=()=>sl(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>sl(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURL(t){return sl(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint"),i=yield this._config();if(!l||0===l.trim().length)throw new Sl("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 n=new URL(l);n.searchParams.append("response_type","code"),n.searchParams.append("client_id",i.clientID);let e="openid";if(i.scope&&i.scope.length>0&&(i.scope.includes("openid")||i.scope.push("openid"),e=i.scope.join(" ")),n.searchParams.append("scope",e),n.searchParams.append("redirect_uri",i.signInRedirectURL),i.responseMode&&n.searchParams.append("response_mode",i.responseMode),i.enablePKCE){const t=gn.getCodeVerifier(),l=gn.getCodeChallenge(t);yield this._dataLayer.setTemporaryDataParameter("pkce_code_verifier",t),n.searchParams.append("code_challenge_method","S256"),n.searchParams.append("code_challenge",l)}i.prompt&&n.searchParams.append("prompt",i.prompt);const c=t;if(c)for(const[t,l]of Object.entries(c))""!=t&&""!=l&&n.searchParams.append(t,l.toString());return n.toString()}))}requestAccessToken(t,l){return sl(this,void 0,void 0,(function*(){const i=(yield this._oidcProviderMetaData()).token_endpoint,n=yield this._config();if(!i||0===i.trim().length)return Promise.reject(new Sl("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."));l&&(yield this._dataLayer.setSessionDataParameter("session_state",l));const e=[];e.push("client_id="+n.clientID),n.clientSecret&&n.clientSecret.trim().length>0&&e.push("client_secret="+n.clientSecret);const c=t;return e.push("code="+c),e.push("grant_type=authorization_code"),e.push("redirect_uri="+n.signInRedirectURL),n.enablePKCE&&(e.push("code_verifier="+(yield this._dataLayer.getTemporaryDataParameter("pkce_code_verifier"))),yield this._dataLayer.removeTemporaryDataParameter("pkce_code_verifier")),Zl.post(i,e.join("&"),{headers:Vn.getTokenRequestHeaders(),withCredentials:n.sendCookiesInRequests}).then(t=>this._authenticationHelper.handleTokenResponse(t).then(t=>t).catch(t=>Promise.reject(new Sl("AUTH_CORE-RAT1-ES02","authentication-core","requestAccessToken",void 0,void 0,t)))).catch(t=>{var l,i,n;return Promise.reject(new Kl("AUTH_CORE-RAT1-NR03","authentication-core","requestAccessToken","Requesting access token failed","The request to get the access token from the server failed.",null!==(l=null==t?void 0:t.code)&&void 0!==l?l:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(n=null==t?void 0:t.response)||void 0===n?void 0:n.data))})}))}refreshAccessToken(){return sl(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,l=yield this._config(),i=yield this._dataLayer.getSessionData();if(!i.refresh_token)return Promise.reject(new Sl("AUTH_CORE-RAT2-NF01","authentication-core","refreshAccessToken","No refresh token found.","There was no refresh token found. The identity server doesn't return a refresh token if the refresh token grant is not enabled."));if(!t||0===t.trim().length)return Promise.reject(new Sl("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 n=[];return n.push("client_id="+l.clientID),n.push("refresh_token="+i.refresh_token),n.push("grant_type=refresh_token"),l.clientSecret&&l.clientSecret.trim().length>0&&n.push("client_secret="+l.clientSecret),Zl.post(t,n.join("&"),{headers:Vn.getTokenRequestHeaders(),withCredentials:l.sendCookiesInRequests}).then(t=>this._authenticationHelper.handleTokenResponse(t).then(t=>t).catch(t=>Promise.reject(new Sl("AUTH_CORE-RAT2-ES03","authentication-core","refreshAccessToken",void 0,void 0,t)))).catch(t=>{var l,i,n;return Promise.reject(new Kl("AUTH_CORE-RAT2-NR03","authentication-core","refreshAccessToken","Refresh access token request failed.","The request to refresh the access token failed.",null!==(l=null==t?void 0:t.code)&&void 0!==l?l:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(n=null==t?void 0:t.response)||void 0===n?void 0:n.data))})}))}revokeAccessToken(){return sl(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,l=yield this._config();if(!t||0===t.trim().length)return Promise.reject(new Sl("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="+l.clientID),i.push("token="+(yield this._dataLayer.getSessionData()).access_token),i.push("token_type_hint=access_token"),Zl.post(t,i.join("&"),{headers:Vn.getTokenRequestHeaders(),withCredentials:l.sendCookiesInRequests}).then(t=>200!==t.status?Promise.reject(new Sl("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 l,i,n;return Promise.reject(new Kl("AUTH_CORE-RAT3-NR03","authentication-core","revokeAccessToken","The request to revoke access token failed.","The request sent to revoke the access token failed.",null!==(l=null==t?void 0:t.code)&&void 0!==l?l:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(n=null==t?void 0:t.response)||void 0===n?void 0:n.data))})}))}requestCustomGrant(t){return sl(this,void 0,void 0,(function*(){const l=yield this._oidcProviderMetaData(),i=yield this._config();let n;if(n=t.tokenEndpoint&&0!==t.tokenEndpoint.trim().length?t.tokenEndpoint:l.token_endpoint,!n||0===n.trim().length)return Promise.reject(new Sl("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 e={data:(yield Promise.all(Object.entries(t.data).map(([t,l])=>sl(this,void 0,void 0,(function*(){const i=yield this._authenticationHelper.replaceCustomGrantTemplateTags(l);return`${t}=${i}`}))))).join("&"),headers:Object.assign({},Vn.getTokenRequestHeaders()),method:"POST",url:n,withCredentials:i.sendCookiesInRequests};return t.attachToken&&(e.headers=Object.assign(Object.assign({},e.headers),{Authorization:"Bearer "+(yield this._dataLayer.getSessionData()).access_token})),Zl(e).then(l=>200!==l.status?Promise.reject(new Sl("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 "+l.status+" , which is invalid.")):t.returnsSession?this._authenticationHelper.handleTokenResponse(l).then(t=>t).catch(t=>Promise.reject(new Sl("AUTH_CORE-RCG-ES03","authentication-core","requestCustomGrant",void 0,void 0,t))):Promise.resolve(l)).catch(t=>{var l,i,n;return Promise.reject(new Kl("AUTH_CORE-RCG-NR04","authentication-core","requestCustomGrant","The custom grant request failed.","The request sent to get the custom grant failed.",null!==(l=null==t?void 0:t.code)&&void 0!==l?l:"",null==t?void 0:t.message,null===(i=null==t?void 0:t.response)||void 0===i?void 0:i.status,null===(n=null==t?void 0:t.response)||void 0===n?void 0:n.data))})}))}getBasicUserInfo(){return sl(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(),l=Vn.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let i={allowedScopes:t.scope,sessionState:t.session_state,username:l.username};return l.displayName&&""!==l.displayName||delete l.displayName,l.tenantDomain&&""!==l.tenantDomain||delete l.tenantDomain,i=Object.assign(Object.assign({},i),l),i}))}getDecodedIDToken(){return sl(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData()).id_token;return gn.decodeIDToken(t)}))}getIDToken(){return sl(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData()).id_token}))}getOIDCProviderMetaData(t){return sl(this,void 0,void 0,(function*(){if(!t&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve(!0);const l=yield this._authenticationHelper.resolveWellKnownEndpoint();return Zl.get(l).then(t=>sl(this,void 0,void 0,(function*(){return 200!==t.status?Promise.reject(new Sl("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(()=>sl(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 sl(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,l,i;return sl(this,void 0,void 0,(function*(){const n=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,e=yield this._config();if(!n||0===n.trim().length)throw new Sl("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 c=null===(l=yield this._dataLayer.getSessionData())||void 0===l?void 0:l.id_token;if(!c||0===c.trim().length)throw new Sl("AUTH_CORE-GSOU-NF02","authentication-core","getSignOutURL","ID token n0t found.","No ID token could be found. Either the session information is lost or you have not signed in.");const o=null!==(i=null==e?void 0:e.signOutRedirectURL)&&void 0!==i?i:null==e?void 0:e.signInRedirectURL;if(!o||0===o.trim().length)throw new Sl("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`${n}?id_token_hint=${c}&post_logout_redirect_uri=${o}&state=sign_out_success`}))}signOut(){return sl(this,void 0,void 0,(function*(){const t=yield this.getSignOutURL();return this._authenticationHelper.clearUserSessionData(),t}))}getAccessToken(){var t;return sl(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData())||void 0===t?void 0:t.access_token}))}isAuthenticated(){return sl(this,void 0,void 0,(function*(){return Boolean(yield this.getAccessToken())}))}getPKCECode(){return sl(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter("pkce_code_verifier")}))}setPKCECode(t){return sl(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter("pkce_code_verifier",t)}))}updateConfig(t){return sl(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(t)}))}}class Rn{constructor(t,l){this._id=t,this._store=l}setDataInBulk(t,l){var i;return sl(this,void 0,void 0,(function*(){const n=null!==(i=yield this._store.getData(t))&&void 0!==i?i:null,e=n&&JSON.parse(n),c=Object.assign(Object.assign({},e),l),o=JSON.stringify(c);yield this._store.setData(t,o)}))}setValue(t,l,i){var n;return sl(this,void 0,void 0,(function*(){const e=null!==(n=yield this._store.getData(t))&&void 0!==n?n:null,c=e&&JSON.parse(e),o=Object.assign(Object.assign({},c),{[l]:i}),d=JSON.stringify(o);yield this._store.setData(t,d)}))}removeValue(t,l){var i;return sl(this,void 0,void 0,(function*(){const n=null!==(i=yield this._store.getData(t))&&void 0!==i?i:null,e=n&&JSON.parse(n),c=Object.assign({},e);delete c[l];const o=JSON.stringify(c);yield this._store.setData(t,o)}))}_resolveKey(t){return`${t}-${this._id}`}setConfigData(t){return sl(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(Gl.ConfigData),t)}))}setOIDCProviderMetaData(t){return sl(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(Gl.OIDCProviderMetaData),t)}))}setTemporaryData(t){return sl(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(Gl.TemporaryData),t)}))}setSessionData(t){return sl(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(Gl.SessionData),t)}))}getConfigData(){var t;return sl(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(Gl.ConfigData)))&&void 0!==t?t:null)}))}getOIDCProviderMetaData(){var t;return sl(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(Gl.OIDCProviderMetaData)))&&void 0!==t?t:null)}))}getTemporaryData(){var t;return sl(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(Gl.TemporaryData)))&&void 0!==t?t:null)}))}getSessionData(){var t;return sl(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(Gl.SessionData)))&&void 0!==t?t:null)}))}removeConfigData(){return sl(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(Gl.ConfigData))}))}removeOIDCProviderMetaData(){return sl(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(Gl.OIDCProviderMetaData))}))}removeTemporaryData(){return sl(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(Gl.TemporaryData))}))}removeSessionData(){return sl(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(Gl.SessionData))}))}getConfigDataParameter(t){return sl(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(Gl.ConfigData));return l&&JSON.parse(l)[t]}))}getOIDCProviderMetaDataParameter(t){return sl(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(Gl.OIDCProviderMetaData));return l&&JSON.parse(l)[t]}))}getTemporaryDataParameter(t){return sl(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(Gl.TemporaryData));return l&&JSON.parse(l)[t]}))}getSessionDataParameter(t){return sl(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(Gl.SessionData));return l&&JSON.parse(l)[t]}))}setConfigDataParameter(t,l){return sl(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(Gl.ConfigData),t,l)}))}setOIDCProviderMetaDataParameter(t,l){return sl(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(Gl.OIDCProviderMetaData),t,l)}))}setTemporaryDataParameter(t,l){return sl(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(Gl.TemporaryData),t,l)}))}setSessionDataParameter(t,l){return sl(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(Gl.SessionData),t,l)}))}removeConfigDataParameter(t){return sl(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(Gl.ConfigData),t)}))}removeOIDCProviderMetaDataParameter(t){return sl(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(Gl.OIDCProviderMetaData),t)}))}removeTemporaryDataParameter(t){return sl(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(Gl.TemporaryData),t)}))}removeSessionDataParameter(t){return sl(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(Gl.SessionData),t)}))}}const Sn={clientHost:origin,clockTolerance:300,enablePKCE:!0,responseMode:rl.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0};class Kn{
|
|
31
|
+
/**
|
|
32
|
+
* This is the constructor method that returns an instance of the .
|
|
33
|
+
*
|
|
34
|
+
* @param {Store} store - The store object.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```
|
|
38
|
+
* const _store: Store = new DataStore();
|
|
39
|
+
* const auth = new AsgardeoAuthClient<CustomClientConfig>(_store);
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#constructor
|
|
43
|
+
* @preserve
|
|
44
|
+
*/
|
|
45
|
+
constructor(t){Kn._instanceID?Kn._instanceID+=1:Kn._instanceID=0,this._dataLayer=new Rn("instance_"+Kn._instanceID,t),this._authenticationCore=new Cn(this._dataLayer)
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
* This method initializes the SDK with the config data.
|
|
49
|
+
*
|
|
50
|
+
* @param {AuthClientConfig<T>} config - The config object to initialize with.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* const config = {
|
|
54
|
+
* signInRedirectURL: "http://localhost:3000/sign-in",
|
|
55
|
+
* clientID: "client ID",
|
|
56
|
+
* serverOrigin: "https://localhost:9443"
|
|
57
|
+
* }
|
|
58
|
+
*
|
|
59
|
+
* await auth.initialize(config);
|
|
60
|
+
*
|
|
61
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#initialize
|
|
62
|
+
*
|
|
63
|
+
* @preserve
|
|
64
|
+
*/}initialize(t){return sl(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(Object.assign(Object.assign({},Sn),t))}))}
|
|
65
|
+
/**
|
|
66
|
+
* This method returns the `DataLayer` object that allows you to access authentication data.
|
|
67
|
+
*
|
|
68
|
+
* @return {DataLayer} - The `DataLayer` object.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```
|
|
72
|
+
* const data = auth.getDataLayer();
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getDataLayer
|
|
76
|
+
*
|
|
77
|
+
* @memberof AsgardeoAuthClient
|
|
78
|
+
*
|
|
79
|
+
* @preserve
|
|
80
|
+
*/getDataLayer(){return this._dataLayer}
|
|
81
|
+
/**
|
|
82
|
+
* This is an async method that returns a Promise that resolves with the authorization URL.
|
|
83
|
+
*
|
|
84
|
+
* @param {GetAuthURLConfig} config - (Optional) A config object to force initialization and pass
|
|
85
|
+
* custom path parameters such as the fidp parameter.
|
|
86
|
+
*
|
|
87
|
+
* @return {Promise<string>} - A promise that resolves with the authorization URL.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```
|
|
91
|
+
* auth.getAuthorizationURL().then((url)=>{
|
|
92
|
+
* // console.log(url);
|
|
93
|
+
* }).catch((error)=>{
|
|
94
|
+
* // console.error(error);
|
|
95
|
+
* });
|
|
96
|
+
* ```
|
|
97
|
+
*
|
|
98
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getAuthorizationURL
|
|
99
|
+
*
|
|
100
|
+
* @memberof AsgardeoAuthClient
|
|
101
|
+
*
|
|
102
|
+
* @preserve
|
|
103
|
+
*/getAuthorizationURL(t){return sl(this,void 0,void 0,(function*(){const l=Object.assign({},t);return null==l||delete l.forceInit,(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.getAuthorizationURL(l):this._authenticationCore.getOIDCProviderMetaData(null==t?void 0:t.forceInit).then(()=>this._authenticationCore.getAuthorizationURL(l))}))}
|
|
104
|
+
/**
|
|
105
|
+
* This is an async method that sends a request to obtain the access token and returns a Promise
|
|
106
|
+
* that resolves with the token and other relevant data.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} authorizationCode - The authorization code.
|
|
109
|
+
* @param {string} sessionState - The session state.
|
|
110
|
+
*
|
|
111
|
+
* @return {Promise<TokenResponse>} - A Promise that resolves with the token response.
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```
|
|
115
|
+
* auth.requestAccessToken(authCode, sessionState).then((token)=>{
|
|
116
|
+
* // console.log(token);
|
|
117
|
+
* }).catch((error)=>{
|
|
118
|
+
* // console.error(error);
|
|
119
|
+
* });
|
|
120
|
+
* ```
|
|
121
|
+
*
|
|
122
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#requestAccessToken
|
|
123
|
+
*
|
|
124
|
+
* @memberof AsgardeoAuthClient
|
|
125
|
+
*
|
|
126
|
+
* @preserve
|
|
127
|
+
*/requestAccessToken(t,l){return sl(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.requestAccessToken(t,l):this._authenticationCore.getOIDCProviderMetaData(!1).then(()=>this._authenticationCore.requestAccessToken(t,l))}))}
|
|
128
|
+
/**
|
|
129
|
+
* This method clears all authentication data and returns the sign-out URL.
|
|
130
|
+
*
|
|
131
|
+
* @return {Promise<string>} - A Promise that resolves with the sign-out URL.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```
|
|
135
|
+
* const signOutUrl = await auth.signOut();
|
|
136
|
+
* ```
|
|
137
|
+
*
|
|
138
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#signOut
|
|
139
|
+
*
|
|
140
|
+
* @memberof AsgardeoAuthClient
|
|
141
|
+
*
|
|
142
|
+
* @preserve
|
|
143
|
+
*/signOut(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.signOut()}))}
|
|
144
|
+
/**
|
|
145
|
+
* This method returns the sign-out URL.
|
|
146
|
+
*
|
|
147
|
+
* **This doesn't clear the authentication data.**
|
|
148
|
+
*
|
|
149
|
+
* @return {Promise<string>} - A Promise that resolves with the sign-out URL.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```
|
|
153
|
+
* const signOutUrl = await auth.getSignOutURL();
|
|
154
|
+
* ```
|
|
155
|
+
*
|
|
156
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getSignOutURL
|
|
157
|
+
*
|
|
158
|
+
* @memberof AsgardeoAuthClient
|
|
159
|
+
*
|
|
160
|
+
* @preserve
|
|
161
|
+
*/getSignOutURL(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.getSignOutURL()}))}
|
|
162
|
+
/**
|
|
163
|
+
* This method returns OIDC service endpoints that are fetched from the `.well-known` endpoint.
|
|
164
|
+
*
|
|
165
|
+
* @return {Promise<OIDCEndpoints>} - A Promise that resolves with an object containing the OIDC service endpoints.
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```
|
|
169
|
+
* const endpoints = await auth.getOIDCServiceEndpoints();
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
172
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getOIDCServiceEndpoints
|
|
173
|
+
*
|
|
174
|
+
* @memberof AsgardeoAuthClient
|
|
175
|
+
*
|
|
176
|
+
* @preserve
|
|
177
|
+
*/getOIDCServiceEndpoints(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.getOIDCServiceEndpoints()}))}
|
|
178
|
+
/**
|
|
179
|
+
* This method decodes the payload of the ID token and returns it.
|
|
180
|
+
*
|
|
181
|
+
* @return {Promise<DecodedIDTokenPayload>} - A Promise that resolves with the decoded ID token payload.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```
|
|
185
|
+
* const decodedIdToken = await auth.getDecodedIDToken();
|
|
186
|
+
* ```
|
|
187
|
+
*
|
|
188
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getDecodedIDToken
|
|
189
|
+
*
|
|
190
|
+
* @memberof AsgardeoAuthClient
|
|
191
|
+
*
|
|
192
|
+
* @preserve
|
|
193
|
+
*/getDecodedIDToken(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.getDecodedIDToken()}))}
|
|
194
|
+
/**
|
|
195
|
+
* This method returns the ID token.
|
|
196
|
+
*
|
|
197
|
+
* @return {Promise<string>} - A Promise that resolves with the ID token.
|
|
198
|
+
*
|
|
199
|
+
* @example
|
|
200
|
+
* ```
|
|
201
|
+
* const idToken = await auth.getIDToken();
|
|
202
|
+
* ```
|
|
203
|
+
*
|
|
204
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getIDToken
|
|
205
|
+
*
|
|
206
|
+
* @memberof AsgardeoAuthClient
|
|
207
|
+
*
|
|
208
|
+
* @preserve
|
|
209
|
+
*/getIDToken(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.getIDToken()}))}
|
|
210
|
+
/**
|
|
211
|
+
* This method returns the basic user information obtained from the ID token.
|
|
212
|
+
*
|
|
213
|
+
* @return {Promise<BasicUserInfo>} - A Promise that resolves with an object containing the basic user information.
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* ```
|
|
217
|
+
* const userInfo = await auth.getBasicUserInfo();
|
|
218
|
+
* ```
|
|
219
|
+
*
|
|
220
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getBasicUserInfo
|
|
221
|
+
*
|
|
222
|
+
* @memberof AsgardeoAuthClient
|
|
223
|
+
*
|
|
224
|
+
* @preserve
|
|
225
|
+
*/getBasicUserInfo(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.getBasicUserInfo()}))}
|
|
226
|
+
/**
|
|
227
|
+
* This method revokes the access token.
|
|
228
|
+
*
|
|
229
|
+
* **This method also clears the authentication data.**
|
|
230
|
+
*
|
|
231
|
+
* @return {Promise<AxiosResponse>} - A Promise that returns the response of the revoke-access-token request.
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```
|
|
235
|
+
* auth.revokeAccessToken().then((response)=>{
|
|
236
|
+
* // console.log(response);
|
|
237
|
+
* }).catch((error)=>{
|
|
238
|
+
* // console.error(error);
|
|
239
|
+
* });
|
|
240
|
+
* ```
|
|
241
|
+
*
|
|
242
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#revokeAccessToken
|
|
243
|
+
*
|
|
244
|
+
* @memberof AsgardeoAuthClient
|
|
245
|
+
*
|
|
246
|
+
* @preserve
|
|
247
|
+
*/revokeAccessToken(){return this._authenticationCore.revokeAccessToken()}
|
|
248
|
+
/**
|
|
249
|
+
* This method refreshes the access token and returns a Promise that resolves with the new access
|
|
250
|
+
* token and other relevant data.
|
|
251
|
+
*
|
|
252
|
+
* @return {Promise<TokenResponse>} - A Promise that resolves with the token response.
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```
|
|
256
|
+
* auth.refreshAccessToken().then((response)=>{
|
|
257
|
+
* // console.log(response);
|
|
258
|
+
* }).catch((error)=>{
|
|
259
|
+
* // console.error(error);
|
|
260
|
+
* });
|
|
261
|
+
* ```
|
|
262
|
+
*
|
|
263
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#refreshAccessToken
|
|
264
|
+
*
|
|
265
|
+
* @memberof AsgardeoAuthClient
|
|
266
|
+
*
|
|
267
|
+
* @preserve
|
|
268
|
+
*/refreshAccessToken(){return this._authenticationCore.refreshAccessToken()}
|
|
269
|
+
/**
|
|
270
|
+
* This method returns the access token.
|
|
271
|
+
*
|
|
272
|
+
* @return {Promise<string>} - A Promise that resolves with the access token.
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```
|
|
276
|
+
* const accessToken = await auth.getAccessToken();
|
|
277
|
+
* ```
|
|
278
|
+
*
|
|
279
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getAccessToken
|
|
280
|
+
*
|
|
281
|
+
* @memberof AsgardeoAuthClient
|
|
282
|
+
*
|
|
283
|
+
* @preserve
|
|
284
|
+
*/getAccessToken(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.getAccessToken()}))}
|
|
285
|
+
/**
|
|
286
|
+
* This method sends a custom-grant request and returns a Promise that resolves with the response
|
|
287
|
+
* depending on the config passed.
|
|
288
|
+
*
|
|
289
|
+
* @param {CustomGrantConfig} config - A config object containing the custom grant configurations.
|
|
290
|
+
*
|
|
291
|
+
* @return {Promise<TokenResponse | AxiosResponse>} - A Promise that resolves with the response depending
|
|
292
|
+
* on your configurations.
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* ```
|
|
296
|
+
* const config = {
|
|
297
|
+
* attachToken: false,
|
|
298
|
+
* data: {
|
|
299
|
+
* client_id: "{{clientID}}",
|
|
300
|
+
* grant_type: "account_switch",
|
|
301
|
+
* scope: "{{scope}}",
|
|
302
|
+
* token: "{{token}}",
|
|
303
|
+
* },
|
|
304
|
+
* id: "account-switch",
|
|
305
|
+
* returnResponse: true,
|
|
306
|
+
* returnsSession: true,
|
|
307
|
+
* signInRequired: true
|
|
308
|
+
* }
|
|
309
|
+
*
|
|
310
|
+
* auth.requestCustomGrant(config).then((response)=>{
|
|
311
|
+
* // console.log(response);
|
|
312
|
+
* }).catch((error)=>{
|
|
313
|
+
* // console.error(error);
|
|
314
|
+
* });
|
|
315
|
+
* ```
|
|
316
|
+
*
|
|
317
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#requestCustomGrant
|
|
318
|
+
*
|
|
319
|
+
* @memberof AsgardeoAuthClient
|
|
320
|
+
*
|
|
321
|
+
* @preserve
|
|
322
|
+
*/requestCustomGrant(t){return this._authenticationCore.requestCustomGrant(t)}
|
|
323
|
+
/**
|
|
324
|
+
* This method returns if the user is authenticated or not.
|
|
325
|
+
*
|
|
326
|
+
* @return {Promise<boolean>} - A Promise that resolves with `true` if the user is authenticated, `false` otherwise.
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* ```
|
|
330
|
+
* await auth.isAuthenticated();
|
|
331
|
+
* ```
|
|
332
|
+
*
|
|
333
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#isAuthenticated
|
|
334
|
+
*
|
|
335
|
+
* @memberof AsgardeoAuthClient
|
|
336
|
+
*
|
|
337
|
+
* @preserve
|
|
338
|
+
*/isAuthenticated(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.isAuthenticated()}))}
|
|
339
|
+
/**
|
|
340
|
+
* This method returns the PKCE code generated during the generation of the authentication URL.
|
|
341
|
+
*
|
|
342
|
+
* @return {Promise<string>} - A Promise that resolves with the PKCE code.
|
|
343
|
+
*
|
|
344
|
+
* @example
|
|
345
|
+
* ```
|
|
346
|
+
* const pkce = await getPKCECode();
|
|
347
|
+
* ```
|
|
348
|
+
*
|
|
349
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getPKCECode
|
|
350
|
+
*
|
|
351
|
+
* @memberof AsgardeoAuthClient
|
|
352
|
+
*
|
|
353
|
+
* @preserve
|
|
354
|
+
*/getPKCECode(){return sl(this,void 0,void 0,(function*(){return this._authenticationCore.getPKCECode()}))}
|
|
355
|
+
/**
|
|
356
|
+
* This method sets the PKCE code to the data store.
|
|
357
|
+
*
|
|
358
|
+
* @param {string} pkce - The PKCE code.
|
|
359
|
+
*
|
|
360
|
+
* @example
|
|
361
|
+
* ```
|
|
362
|
+
* await auth.setPKCECode("pkce_code")
|
|
363
|
+
* ```
|
|
364
|
+
*
|
|
365
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#setPKCECode
|
|
366
|
+
*
|
|
367
|
+
* @memberof AsgardeoAuthClient
|
|
368
|
+
*
|
|
369
|
+
* @preserve
|
|
370
|
+
*/setPKCECode(t){return sl(this,void 0,void 0,(function*(){yield this._authenticationCore.setPKCECode(t)}))}
|
|
371
|
+
/**
|
|
372
|
+
* This method returns if the sign-out is successful or not.
|
|
373
|
+
*
|
|
374
|
+
* @param {string} signOutRedirectUrl - The URL to which the user has been redirected to after signing-out.
|
|
375
|
+
*
|
|
376
|
+
* **The server appends path parameters to the `signOutRedirectURL` and these path parameters
|
|
377
|
+
* are required for this method to function.**
|
|
378
|
+
*
|
|
379
|
+
* @return {boolean} - `true` if successful, `false` otherwise.
|
|
380
|
+
*
|
|
381
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#isSignOutSuccessful
|
|
382
|
+
*
|
|
383
|
+
* @memberof AsgardeoAuthClient
|
|
384
|
+
*
|
|
385
|
+
* @preserve
|
|
386
|
+
*/static isSignOutSuccessful(t){const l=new URL(t),i=l.searchParams.get("state"),n=Boolean(l.searchParams.get("error"));return!!i&&"sign_out_success"===i&&!n}
|
|
387
|
+
/**
|
|
388
|
+
* This method updates the configuration that was passed into the constructor when instantiating this class.
|
|
389
|
+
*
|
|
390
|
+
* @param {Partial<AuthClientConfig<T>>} config - A config object to update the SDK configurations with.
|
|
391
|
+
*
|
|
392
|
+
* @example
|
|
393
|
+
* ```
|
|
394
|
+
* const config = {
|
|
395
|
+
* signInRedirectURL: "http://localhost:3000/sign-in",
|
|
396
|
+
* clientID: "client ID",
|
|
397
|
+
* serverOrigin: "https://localhost:9443"
|
|
398
|
+
* }
|
|
399
|
+
*
|
|
400
|
+
* await auth.updateConfig(config);
|
|
401
|
+
* ```
|
|
402
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#updateConfig
|
|
403
|
+
*
|
|
404
|
+
* @memberof AsgardeoAuthClient
|
|
405
|
+
*
|
|
406
|
+
* @preserve
|
|
407
|
+
*/updateConfig(t){this._authenticationCore.updateConfig(t)}}var fn,Yn;!function(t){t.LocalStorage="localStorage",t.SessionStorage="sessionStorage",t.WebWorker="webWorker",t.BrowserMemory="browserMemory"}(fn||(fn={})),function(t){t.SignIn="sign-in",t.SignOut="sign-out",t.Initialize="initialize",t.HttpRequestStart="http-request-start",t.HttpRequestFinish="http-request-finish",t.HttpRequestError="http-request-error",t.HttpRequestSuccess="http-request-success",t.RevokeAccessToken="revoke-access-token",t.CustomGrant="custom-grant"}(Yn||(Yn={}));const vn="Y2hlY2tTZXNzaW9u";class Nn extends Error{constructor(t,l,i,n,e,c){super(null!=n?n:null==c?void 0:c.message),this.name=this.constructor.name,this.code=t,this.file=l,this.method=i,this.error=c,this.description=e,Object.setPrototypeOf(this,new.target.prototype)}}class Jn{constructor(t){this._authenticationClient=t,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(){return n(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData();if(t.refresh_token){const l=parseInt(t.expires_in),i=setTimeout(()=>n(this,void 0,void 0,(function*(){yield this._authenticationClient.refreshAccessToken()})),1e3*(l<=10?l:l-10));yield this._dataLayer.setTemporaryDataParameter(yl,JSON.stringify(i))}}))}clearRefreshTokenTimeout(){return n(this,void 0,void 0,(function*(){if(yield this._dataLayer.getTemporaryDataParameter(yl)){const t=JSON.parse(yield this._dataLayer.getTemporaryDataParameter(yl));clearTimeout(t)}}))}}const Hn=(()=>{let t,l,i,e,c,o,d,a;const r=(n,a,r,Z,b,m,h)=>{t=n,l=a,i=r,e=Z,c=m,o=h,d=b,e>-1&&u(),d>-1&&setTimeout(()=>{s()},1e3*d)},u=()=>{if(!l||!t||!c)return;function n(t,l,i,n,e){const c="opIFrame";function o(){if(Boolean(l)&&Boolean(n)){const i=`${l} ${n}`,e=document.getElementById(c).contentWindow;null==e||e.postMessage(i,t)}}document.getElementById(c).src=t+"?client_id="+l+"&redirect_uri="+i,o(),setInterval(o,1e3*e)}const o=document.getElementById("rpIFrame");o.contentWindow.eval(n.toString()),(null==o?void 0:o.contentWindow)&&(null==o||o.contentWindow[n.name](l,t,c,i,e)),Z()},Z=()=>{var t;const i=document.getElementById("rpIFrame");null===(t=null==i?void 0:i.contentWindow)||void 0===t||t.addEventListener("message",(function(t){return n(this,void 0,void 0,(function*(){!l||(null==l?void 0:l.indexOf(t.origin))<0||"unchanged"===t.data||("error"===t.data?window.top.location.href=yield a():s())}))}),!1)},s=()=>{var l;const i=document.getElementById("rpIFrame");(null===(l=null==i?void 0:i.contentDocument)||void 0===l?void 0:l.getElementById("promptNoneIFrame")).src=o+"?response_type=code&client_id="+t+"&scope=openid&redirect_uri="+c+"&state="+vn+"&prompt=none&code_challenge_method=S256&code_challenge="+(()=>{const t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz-_";let l="";for(let i=0;i<43;i++){const i=Math.floor(Math.random()*t.length);l+=t.substring(i,i+1)}return l})()},b=t=>n(void 0,void 0,void 0,(function*(){const l=new URL(window.location.href).searchParams.get("state"),i=new URL(window.location.href).searchParams.get(Vl);if(null!==l&&(l===vn||"sign-in-silently"===l)){const n=new URL(window.location.href).searchParams.get("code");if(null===n||0===n.length){if("sign-in-silently"===l){const t={type:"check_session_signed_out"};return sessionStorage.setItem("initialized-silent-sign-in","false"),window.top.postMessage(t,window.top.origin),window.location.href="about:blank",!0}return window.top.location.href=yield a(),window.location.href="about:blank",!0}{if("sign-in-silently"===l){const t={data:{code:n,sessionState:null!=i?i:""},type:"check_session_signed_in"};return sessionStorage.setItem("initialized-silent-sign-in","false"),window.top.postMessage(t,window.top.origin),window.location.href="about:blank",!0}const e=new URL(window.location.href).searchParams.get("session_state");t&&(yield t(e)),window.stop()}}return!1}));return t=>{var l,i,n,e,c;const o=document.createElement("iframe");o.setAttribute("id","opIFrame"),o.style.display="none";let d=document.createElement("iframe");d.setAttribute("id","rpIFrame"),d.style.display="none";const u=document.createElement("iframe");return u.setAttribute("id","promptNoneIFrame"),u.style.display="none",null===(l=null===document||void 0===document?void 0:document.body)||void 0===l||l.appendChild(d),d=document.getElementById("rpIFrame"),null===(n=null===(i=null==d?void 0:d.contentDocument)||void 0===i?void 0:i.body)||void 0===n||n.appendChild(o),null===(c=null===(e=null==d?void 0:d.contentDocument)||void 0===e?void 0:e.body)||void 0===c||c.appendChild(u),a=t,{initialize:r,receivePromptNoneResponse:b}}})();var Ln;let Un=Ln=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=Zl.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new Ln),this.axiosInstance.interceptors.request.use(t=>n(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=Zl.all,this.axiosInstance.spread=Zl.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 n(this,void 0,void 0,(function*(){return yield this.attachToken(t),Ln.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(t),t}))}errorHandler(t){throw Ln.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}successHandler(t){return Ln.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(t),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),t}init(t=!0,l){return n(this,void 0,void 0,(function*(){Ln.isHandlerEnabled=t,this.attachToken=l}))}enableHandler(){Ln.isHandlerEnabled=!0}disableHandler(){Ln.isHandlerEnabled=!1}disableHandlerWithTimeout(t=Ln.DEFAULT_HANDLER_DISABLE_TIMEOUT){Ln.isHandlerEnabled=!1,setTimeout(()=>{Ln.isHandlerEnabled=!0},t)}setHttpRequestStartCallback(t){this.requestStartCallback=t}setHttpRequestSuccessCallback(t){this.requestSuccessCallback=t}setHttpRequestErrorCallback(t){this.requestErrorCallback=t}setHttpRequestFinishCallback(t){this.requestFinishCallback=t}};Un.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,Un=Ln=function(t,l,i,n){var e,c=arguments.length,o=c<3?l:null===n?n=Object.getOwnPropertyDescriptor(l,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(t,l,i,n);else for(var d=t.length-1;d>=0;d--)(e=t[d])&&(o=(c<3?e(o):c>3?e(l,i,o):e(l,i))||o);return c>3&&o&&Object.defineProperty(l,i,o),o}([t=>{}],Un);class xn{setData(t,l){return n(this,void 0,void 0,(function*(){localStorage.setItem(t,l)}))}getData(t){var l;return n(this,void 0,void 0,(function*(){return null!==(l=localStorage.getItem(t))&&void 0!==l?l:"{}"}))}removeData(t){return n(this,void 0,void 0,(function*(){localStorage.removeItem(t)}))}}class Tn{constructor(){this._data=new Map}setData(t,l){return n(this,void 0,void 0,(function*(){this._data.set(t,l)}))}getData(t){var l,i;return n(this,void 0,void 0,(function*(){return null!==(i=null===(l=this._data)||void 0===l?void 0:l.get(t))&&void 0!==i?i:"{}"}))}removeData(t){return n(this,void 0,void 0,(function*(){this._data.delete(t)}))}}class kn{setData(t,l){return n(this,void 0,void 0,(function*(){sessionStorage.setItem(t,l)}))}getData(t){var l;return n(this,void 0,void 0,(function*(){return null!==(l=sessionStorage.getItem(t))&&void 0!==l?l:"{}"}))}removeData(t){return n(this,void 0,void 0,(function*(){sessionStorage.removeItem(t)}))}}class Bn{constructor(){}static removeAuthorizationCode(){const t=location.href;history.pushState({},document.title,t.replace(/\?code=.*$/,""))}static getPKCE(){var t;return null!==(t=sessionStorage.getItem(Xl))&&void 0!==t?t:""}static setPKCE(t){sessionStorage.setItem(Xl,t)}static setSignOutURL(t){sessionStorage.setItem(Wl,t)}static getSignOutURL(){var t;return null!==(t=sessionStorage.getItem(Wl))&&void 0!==t?t:""}static removePKCE(){sessionStorage.removeItem(Xl)}static setInitializedSignIn(t){const l=sessionStorage.getItem("initialized-sign-in"),i=l?JSON.parse(l):null;return t&&i?(sessionStorage.setItem("initialized-sign-in","false"),!0):!t&&(i?(sessionStorage.setItem("initialized-sign-in","false"),!0):(sessionStorage.setItem("initialized-sign-in","true"),!0))}static setIsInitializedSilentSignIn(){const t=sessionStorage.getItem("initialized-silent-sign-in");return t&&JSON.parse(t)?(sessionStorage.setItem("initialized-silent-sign-in","false"),!0):(sessionStorage.setItem("initialized-silent-sign-in","true"),!1)}static wasSignInCalled(){const t=sessionStorage.getItem("initialized-sign-in"),l=t?JSON.parse(t):null,i=sessionStorage.getItem("initialized-silent-sign-in"),n=i?JSON.parse(i):null;return l&&!n}static wasSilentSignInCalled(){const t=sessionStorage.getItem("initialized-silent-sign-in"),l=t?JSON.parse(t):null;return Boolean(l)}static isSignOutSuccessful(){if(Kn.isSignOutSuccessful(window.location.href)){const t=window.location.href.split("?")[0];return history.pushState({},document.title,t),!0}return!1}static isStatePresentInURL(){const t=new URL(window.location.href).searchParams.get("state");return"sign-in-silently"===t||t===vn}static hasAuthSearchParamsInURL(t=window.location.search){return/[?&]code=[^&]+/.test(t)&&/[?&]session_state=[^&]+/.test(t)}}const Fn=t=>n(void 0,void 0,void 0,(function*(){const l=(t=>{switch(t){case fn.LocalStorage:return new xn;case fn.SessionStorage:return new kn;case fn.BrowserMemory:return new Tn;default:return new kn}})(t.storage),i=new Kn(l);yield i.initialize(t);const e=new Jn(i),c=i.getDataLayer(),o=Hn(()=>n(void 0,void 0,void 0,(function*(){return i.signOut()}))),d=Un.getInstance();(null==d?void 0:d.init)&&(yield d.init(!0,t=>n(void 0,void 0,void 0,(function*(){Object.assign({attachToken:!0},t).attachToken&&(t.headers=Object.assign(Object.assign({},t.headers),{Authorization:"Bearer "+(yield i.getAccessToken())}))}))));const a=()=>n(void 0,void 0,void 0,(function*(){var t,l,n,e;const d=yield i.getOIDCServiceEndpoints(),a=yield c.getConfigData();o.initialize(a.clientID,null!==(t=d.checkSessionIframe)&&void 0!==t?t:"",(yield i.getBasicUserInfo()).sessionState,null!==(l=a.checkSessionInterval)&&void 0!==l?l:3,null!==(n=a.sessionRefreshInterval)&&void 0!==n?n:300,a.signInRedirectURL,null!==(e=d.authorizationEndpoint)&&void 0!==e?e:"")})),r=(t,l)=>n(void 0,void 0,void 0,(function*(){const o=yield c.getConfigData();if(o.storage===fn.BrowserMemory&&o.enablePKCE){const t=Bn.getPKCE();yield i.setPKCECode(t)}return i.requestAccessToken(t,l).then(()=>n(void 0,void 0,void 0,(function*(){return o.storage===fn.BrowserMemory&&Bn.setSignOutURL(yield i.getSignOutURL()),e.clearRefreshTokenTimeout(),e.refreshAccessTokenAutomatically(),o.enableOIDCSessionManagement&&a(),i.getBasicUserInfo()}))).catch(t=>Promise.reject(t))}));return{disableHttpHandler:()=>((null==d?void 0:d.disableHandler)&&d.disableHandler(),!0),enableHttpHandler:()=>((null==d?void 0:d.enableHandler)&&d.enableHandler(),!0),getAccessToken:()=>n(void 0,void 0,void 0,(function*(){return i.getAccessToken()})),getBasicUserInfo:()=>n(void 0,void 0,void 0,(function*(){return i.getBasicUserInfo()})),getDecodedIDToken:()=>n(void 0,void 0,void 0,(function*(){return i.getDecodedIDToken()})),getHttpClient:()=>d,getIDToken:()=>n(void 0,void 0,void 0,(function*(){return i.getIDToken()})),getOIDCServiceEndpoints:()=>n(void 0,void 0,void 0,(function*(){return i.getOIDCServiceEndpoints()})),httpRequest:t=>n(void 0,void 0,void 0,(function*(){var l,n;let e=!1;const o=yield c.getConfigData();for(const i of[...null!==(l=yield null==o?void 0:o.resourceServerURLs)&&void 0!==l?l:[],null==o?void 0:o.serverOrigin])if(null===(n=null==t?void 0:t.url)||void 0===n?void 0:n.startsWith(i)){e=!0;break}return e?d.request(t).then(t=>Promise.resolve(t)).catch(l=>{var n;return 401===(null===(n=null==l?void 0:l.response)||void 0===n?void 0:n.status)?i.refreshAccessToken().then(()=>d.request(t).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t))).catch(t=>Promise.reject(new Nn("MAIN_THREAD_CLIENT-HR-ES01","main-thread-client","httpRequest","","",t))):Promise.reject(l)}):Promise.reject(new Nn("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=>n(void 0,void 0,void 0,(function*(){var l,n,e;let o=!0;const a=yield c.getConfigData();for(const i of t){let t=!1;for(const c of[...null!==(n=null===(l=yield a)||void 0===l?void 0:l.resourceServerURLs)&&void 0!==n?n:[],null==a?void 0:a.serverOrigin])if(null===(e=i.url)||void 0===e?void 0:e.startsWith(c)){t=!0;break}if(!t){o=!1;break}}const r=[];return o?(t.forEach(t=>{r.push(d.request(t))}),(null==d?void 0:d.all)&&d.all(r).then(t=>Promise.resolve(t)).catch(t=>{var l;return 401===(null===(l=null==t?void 0:t.response)||void 0===l?void 0:l.status)?i.refreshAccessToken().then(()=>d.all&&d.all(r).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t))).catch(t=>Promise.reject(new Nn("MAIN_THREAD_CLIENT-HRA-ES01","main-thread-client","httpRequestAll","","",t))):Promise.reject(t)})):Promise.reject(new Nn("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:()=>n(void 0,void 0,void 0,(function*(){return i.isAuthenticated()})),refreshAccessToken:()=>i.refreshAccessToken().then(()=>(e.refreshAccessTokenAutomatically(),i.getBasicUserInfo())).catch(t=>Promise.reject(t)),requestCustomGrant:t=>n(void 0,void 0,void 0,(function*(){var l,o,d;let a=!0,r=!1;const u=yield c.getConfigData();if(null==t?void 0:t.tokenEndpoint){a=!1;for(const i of[...null!==(o=null===(l=yield c.getConfigData())||void 0===l?void 0:l.resourceServerURLs)&&void 0!==o?o:[],null==u?void 0:u.serverOrigin])if(null===(d=t.tokenEndpoint)||void 0===d?void 0:d.startsWith(i)){r=!0;break}}return a||r?i.requestCustomGrant(t).then(l=>n(void 0,void 0,void 0,(function*(){return t.returnsSession?(e.refreshAccessTokenAutomatically(),i.getBasicUserInfo()):l}))).catch(t=>Promise.reject(t)):Promise.reject(new Nn("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`"))})),revokeAccessToken:()=>i.revokeAccessToken().then(()=>(e.clearRefreshTokenTimeout(),Promise.resolve(!0))).catch(t=>Promise.reject(t)),setHttpRequestErrorCallback:t=>{(null==d?void 0:d.setHttpRequestErrorCallback)&&d.setHttpRequestErrorCallback(t)},setHttpRequestFinishCallback:t=>{(null==d?void 0:d.setHttpRequestFinishCallback)&&d.setHttpRequestFinishCallback(t)},setHttpRequestStartCallback:t=>{(null==d?void 0:d.setHttpRequestStartCallback)&&d.setHttpRequestStartCallback(t)},setHttpRequestSuccessCallback:t=>{(null==d?void 0:d.setHttpRequestSuccessCallback)&&d.setHttpRequestSuccessCallback(t)},signIn:(t,l,d)=>n(void 0,void 0,void 0,(function*(){var u,Z;const s=yield c.getConfigData();if(yield o.receivePromptNoneResponse(t=>n(void 0,void 0,void 0,(function*(){yield c.setSessionDataParameter(Vl,null!=t?t:"")}))))return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",tenantDomain:"",username:""});if(Bn.wasSilentSignInCalled()&&Bn.setIsInitializedSilentSignIn(),yield i.isAuthenticated())return e.clearRefreshTokenTimeout(),e.refreshAccessTokenAutomatically(),s.enableOIDCSessionManagement&&a(),Promise.resolve(yield i.getBasicUserInfo());let b,m;if((null==s?void 0:s.responseMode)===rl.formPost&&l?(b=l,m=null!=d?d:""):(b=null!==(u=new URL(window.location.href).searchParams.get(gl))&&void 0!==u?u:"",m=null!==(Z=new URL(window.location.href).searchParams.get(Vl))&&void 0!==Z?Z:"",Bn.removeAuthorizationCode()),b)return r(b,m);const h=new URL(window.location.href).searchParams.get("error"),I=new URL(window.location.href).searchParams.get("error_description");if(h){const t=new URL(window.location.href);return t.searchParams.delete("error"),t.searchParams.delete("error_description"),history.pushState(null,document.title,t.toString()),Promise.reject(new Nn("MAIN_THREAD_CLIENT-SI-BE","main-thread-client","signIn",h,null!=I?I:""))}return i.getAuthorizationURL(t).then(t=>n(void 0,void 0,void 0,(function*(){return s.storage===fn.BrowserMemory&&s.enablePKCE&&Bn.setPKCE(yield i.getPKCECode()),location.href=t,Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",tenantDomain:"",username:""})})))})),signOut:()=>n(void 0,void 0,void 0,(function*(){return(yield i.isAuthenticated())?location.href=yield i.signOut():location.href=Bn.getSignOutURL(),e.clearRefreshTokenTimeout(),!0})),trySignInSilently:()=>n(void 0,void 0,void 0,(function*(){var t;const l=yield c.getConfigData();if(Bn.setIsInitializedSilentSignIn())return yield o.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",tenantDomain:"",username:""});if(Bn.isStatePresentInURL())return Bn.setIsInitializedSilentSignIn(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",tenantDomain:"",username:""});const e=document.getElementById("rpIFrame"),d=null===(t=null==e?void 0:e.contentDocument)||void 0===t?void 0:t.getElementById("promptNoneIFrame");try{const t=yield i.getAuthorizationURL({prompt:"none",state:"sign-in-silently"});l.storage===fn.BrowserMemory&&l.enablePKCE&&Bn.setPKCE(yield i.getPKCECode()),d.src=t}catch(t){return Promise.reject(t)}return new Promise((t,l)=>{const i=e=>n(void 0,void 0,void 0,(function*(){var n,c;const o=e.data;"check_session_signed_out"==(null==o?void 0:o.type)&&(window.removeEventListener("message",i),t(!1)),"check_session_signed_in"==(null==o?void 0:o.type)&&(null===(n=null==o?void 0:o.data)||void 0===n?void 0:n.code)&&r(o.data.code,null===(c=null==o?void 0:o.data)||void 0===c?void 0:c.sessionState).then(l=>{window.removeEventListener("message",i),t(l)}).catch(t=>{window.removeEventListener("message",i),l(t)})}));window.addEventListener("message",i)})})),updateConfig:t=>n(void 0,void 0,void 0,(function*(){const l=Object.assign(Object.assign({},yield c.getConfigData()),t);yield i.updateConfig(l)}))}}));var zn,An=("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gZShlLHQscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXt1KG4ubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7dShuLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiB1KGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIHI/dDpuZXcgcigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfXUoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX12YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LHI9W10sbj1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LG89ITE7ZnVuY3Rpb24gcygpe289ITA7Zm9yKHZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix0PTAsaT1lLmxlbmd0aDt0PGk7Kyt0KXJbdF09ZVt0XSxuW2UuY2hhckNvZGVBdCh0KV09dDtuWyItIi5jaGFyQ29kZUF0KDApXT02MixuWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBhKGUsdCxuKXtmb3IodmFyIGksbyxzPVtdLGE9dDthPG47YSs9MylpPShlW2FdPDwxNikrKGVbYSsxXTw8OCkrZVthKzJdLHMucHVzaChyWyhvPWkpPj4xOCY2M10rcltvPj4xMiY2M10rcltvPj42JjYzXStyWzYzJm9dKTtyZXR1cm4gcy5qb2luKCIiKX1mdW5jdGlvbiB1KGUpe3ZhciB0O298fHMoKTtmb3IodmFyIG49ZS5sZW5ndGgsaT1uJTMsdT0iIixjPVtdLGg9MTYzODMsbD0wLGY9bi1pO2w8ZjtsKz1oKWMucHVzaChhKGUsbCxsK2g+Zj9mOmwraCkpO3JldHVybiAxPT09aT8odD1lW24tMV0sdSs9clt0Pj4yXSx1Kz1yW3Q8PDQmNjNdLHUrPSI9PSIpOjI9PT1pJiYodD0oZVtuLTJdPDw4KStlW24tMV0sdSs9clt0Pj4xMF0sdSs9clt0Pj40JjYzXSx1Kz1yW3Q8PDImNjNdLHUrPSI9IiksYy5wdXNoKHUpLGMuam9pbigiIil9ZnVuY3Rpb24gYyhlLHQscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1yP2ktMTowLGY9cj8tMToxLGQ9ZVt0K2xdO2ZvcihsKz1mLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPWE7aD4wO289MjU2Km8rZVt0K2xdLGwrPWYsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO3M9MjU2KnMrZVt0K2xdLGwrPWYsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihkPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09Y31yZXR1cm4oZD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiBoKGUsdCxyLG4saSxvKXt2YXIgcyxhLHUsYz04Km8taS0xLGg9KDE8PGMpLTEsbD1oPj4xLGY9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxkPW4/MDpvLTEscD1uPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9aCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSwodCs9cytsPj0xP2YvdTpmKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKHMrKyx1Lz0yKSxzK2w+PWg/KGE9MCxzPWgpOnMrbD49MT8oYT0odCp1LTEpKk1hdGgucG93KDIsaSkscys9bCk6KGE9dCpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O2VbcitkXT0yNTUmYSxkKz1wLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsYys9aTtjPjA7ZVtyK2RdPTI1NSZzLGQrPXAscy89MjU2LGMtPTgpO2VbcitkLXBdfD0xMjgqZ312YXIgbD17fS50b1N0cmluZyxmPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWwuY2FsbChlKX07ZnVuY3Rpb24gZCgpe3JldHVybiBnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHAoZSx0KXtpZihkKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gZy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Zy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgZyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBnKGUsdCxyKXtpZighKGcuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGcpKXJldHVybiBuZXcgZyhlLHQscik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBtKHRoaXMsZSl9cmV0dXJuIHYodGhpcyxlLHQscil9ZnVuY3Rpb24gdihlLHQscixuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQscixuKXtpZih0LmJ5dGVMZW5ndGgscjwwfHx0LmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQscik6bmV3IFVpbnQ4QXJyYXkodCxyLG4pO2cuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189Zy5wcm90b3R5cGU6ZT13KGUsdCk7cmV0dXJuIGV9KGUsdCxyLG4pOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIWcuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfGsodCxyKSxpPShlPXAoZSxuKSkud3JpdGUodCxyKTtpIT09biYmKGU9ZS5zbGljZSgwLGkpKTtyZXR1cm4gZX0oZSx0LHIpOmZ1bmN0aW9uKGUsdCl7aWYoXyh0KSl7dmFyIHI9MHxiKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPXAoZSxyKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsciksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KG49dC5sZW5ndGgpIT1uP3AoZSwwKTp3KGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmYodC5kYXRhKSlyZXR1cm4gdyhlLHQuZGF0YSl9dmFyIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIHkoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBtKGUsdCl7aWYoeSh0KSxlPXAoZSx0PDA/MDowfGIodCkpLCFnLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjx0OysrcillW3JdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gdyhlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfGIodC5sZW5ndGgpO2U9cChlLHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKWVbbl09MjU1JnRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gYihlKXtpZihlPj1kKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2QoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gXyhlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24gayhlLHQpe2lmKF8oZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciByPWUubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuICQoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBHKGUpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuICQoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gUyhlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBCKHRoaXMsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBNKHRoaXMsdCxyKTtjYXNlImFzY2lpIjpyZXR1cm4gSCh0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcSh0aGlzLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBVKHRoaXMsdCxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIGoodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gQShlLHQscil7dmFyIG49ZVt0XTtlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIFQoZSx0LHIsbixpKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6ZS5sZW5ndGgtMSkscjwwJiYocj1lLmxlbmd0aCtyKSxyPj1lLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPWUubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWcuZnJvbSh0LG4pKSxfKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6RShlLHQscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGcuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOkUoZSxbdF0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIEUoZSx0LHIsbixpKXt2YXIgbyxzPTEsYT1lLmxlbmd0aCx1PXQubGVuZ3RoO2lmKHZvaWQgMCE9PW4mJigidWNzMiI9PT0obj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1ufHwidXRmMTZsZSI9PT1ufHwidXRmLTE2bGUiPT09bikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsdS89MixyLz0yfWZ1bmN0aW9uIGMoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKGkpe3ZhciBoPS0xO2ZvcihvPXI7bzxhO28rKylpZihjKGUsbyk9PT1jKHQsLTE9PT1oPzA6by1oKSl7aWYoLTE9PT1oJiYoaD1vKSxvLWgrMT09PXUpcmV0dXJuIGgqc31lbHNlLTEhPT1oJiYoby09by1oKSxoPS0xfWVsc2UgZm9yKHIrdT5hJiYocj1hLXUpLG89cjtvPj0wO28tLSl7Zm9yKHZhciBsPSEwLGY9MDtmPHU7ZisrKWlmKGMoZSxvK2YpIT09Yyh0LGYpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gUihlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gQyhlLHQscixuKXtyZXR1cm4gWCgkKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFAoZSx0LHIsbil7cmV0dXJuIFgoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLHI9MDtyPGUubGVuZ3RoOysrcil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChyKSk7cmV0dXJuIHR9KHQpLGUscixuKX1mdW5jdGlvbiBEKGUsdCxyLG4pe3JldHVybiBQKGUsdCxyLG4pfWZ1bmN0aW9uIE8oZSx0LHIsbil7cmV0dXJuIFgoRyh0KSxlLHIsbil9ZnVuY3Rpb24gSShlLHQscixuKXtyZXR1cm4gWChmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFUoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP3UoZSk6dShlLnNsaWNlKHQscikpfWZ1bmN0aW9uIE0oZSx0LHIpe3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9dDtpPHI7KXt2YXIgbyxzLGEsdSxjPWVbaV0saD1udWxsLGw9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihpK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpjPDEyOCYmKGg9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz1lW2krMV0pKSYmKHU9KDMxJmMpPDw2fDYzJm8pPjEyNyYmKGg9dSk7YnJlYWs7Y2FzZSAzOm89ZVtpKzFdLHM9ZVtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDEyfCg2MyZvKTw8Nnw2MyZzKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihoPXUpO2JyZWFrO2Nhc2UgNDpvPWVbaSsxXSxzPWVbaSsyXSxhPWVbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZ1PDExMTQxMTImJihoPXUpfW51bGw9PT1oPyhoPTY1NTMzLGw9MSk6aD42NTUzNSYmKGgtPTY1NTM2LG4ucHVzaChoPj4+MTAmMTAyM3w1NTI5NiksaD01NjMyMHwxMDIzJmgpLG4ucHVzaChoKSxpKz1sfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1MKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgcj0iIixuPTA7Zm9yKDtuPHQ7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UobixuKz1MKSk7cmV0dXJuIHJ9KG4pfWcuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT10LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHQuVFlQRURfQVJSQVlfU1VQUE9SVCxnLnBvb2xTaXplPTgxOTIsZy5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189Zy5wcm90b3R5cGUsZX0sZy5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdihudWxsLGUsdCxyKX0sZy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoZy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLGcuX19wcm90b19fPVVpbnQ4QXJyYXkpLGcuYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBmdW5jdGlvbihlLHQscixuKXtyZXR1cm4geSh0KSx0PD0wP3AoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9wKGUsdCkuZmlsbChyLG4pOnAoZSx0KS5maWxsKHIpOnAoZSx0KX0obnVsbCxlLHQscil9LGcuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG0obnVsbCxlKX0sZy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIG0obnVsbCxlKX0sZy5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fFooZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmWihlLnNsaWNlKDAsMCkpfShlKSl9LGcuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFfKGUpfHwhXyh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtyPWVbaV0sbj10W2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sZy5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxnLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGcuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09dClmb3IodD0wLHI9MDtyPGUubGVuZ3RoOysrcil0Kz1lW3JdLmxlbmd0aDt2YXIgbj1nLmFsbG9jVW5zYWZlKHQpLGk9MDtmb3Iocj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbz1lW3JdO2lmKCFfKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sZy5ieXRlTGVuZ3RoPWssZy5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGcucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9MilBKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpQSh0aGlzLHQsdCszKSxBKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9LGcucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClBKHRoaXMsdCx0KzcpLEEodGhpcyx0KzEsdCs2KSxBKHRoaXMsdCsyLHQrNSksQSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1lPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP00odGhpcywwLGUpOlMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxnLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIV8oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PWcuY29tcGFyZSh0aGlzLGUpfSxnLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LGcucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZighXyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09ciYmKHI9ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxyPmUubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJnQ+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZih0Pj1yKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixpKSxjPWUuc2xpY2UodCxyKSxoPTA7aDxhOysraClpZih1W2hdIT09Y1toXSl7bz11W2hdLHM9Y1toXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LGcucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihlLHQscil9LGcucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBUKHRoaXMsZSx0LHIsITApfSxnLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQscil7cmV0dXJuIFQodGhpcyxlLHQsciwhMSl9LGcucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHZvaWQgMD09PXQpbj0idXRmOCIscj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIHQpbj10LHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLGUubGVuZ3RoPjAmJihyPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBSKHRoaXMsZSx0LHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIEModGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIFAodGhpcyxlLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gRCh0aGlzLGUsdCxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE8odGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBJKHRoaXMsZSx0LHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LGcucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIEw9NDA5NjtmdW5jdGlvbiBIKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gcShlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGk9dDtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gQihlLHQscil7dmFyIG49ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPSIiLG89dDtvPHI7KytvKWkrPVYoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gaihlLHQscil7Zm9yKHZhciBuPWUuc2xpY2UodCxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIHgoZSx0LHIpe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE4oZSx0LHIsbixpLG8pe2lmKCFfKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZih0Pml8fHQ8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBLKGUsdCxyLG4pe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLXIsMik7aTxvOysraSllW3IraV09KHQmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBGKGUsdCxyLG4pe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciw0KTtpPG87KytpKWVbcitpXT10Pj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIFkoZSx0LHIsbixpLG8pe2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBXKGUsdCxyLG4saSl7cmV0dXJuIGl8fFkoZSwwLHIsNCksaChlLHQscixuLDIzLDQpLHIrNH1mdW5jdGlvbiB6KGUsdCxyLG4saSl7cmV0dXJuIGl8fFkoZSwwLHIsOCksaChlLHQscixuLDUyLDgpLHIrOH1nLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLCh0PXZvaWQgMD09PXQ/bjp+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksdDxlJiYodD1lKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189Zy5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgZyhpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbytlXX1yZXR1cm4gcn0sZy5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQscil7ZXw9MCx0fD0wLHJ8fHgoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LGcucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHx4KGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZSstLXRdLGk9MTt0PjAmJihpKj0yNTYpOyluKz10aGlzW2UrLS10XSppO3JldHVybiBufSxnLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eChlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LGcucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LGcucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LGcucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sZy5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fHgoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxnLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHx4KGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KW4rPXRoaXNbZStvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCp0KSksbn0sZy5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8eChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10LGk9MSxvPXRoaXNbZSstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSxnLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LGcucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8eChlLDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxnLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fHgoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sZy5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sZy5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sZy5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eChlLDQsdGhpcy5sZW5ndGgpLGModGhpcyxlLCEwLDIzLDQpfSxnLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsNCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITEsMjMsNCl9LGcucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsOCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITAsNTIsOCl9LGcucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsOCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITEsNTIsOCl9LGcucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8Tih0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxyJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrcn0sZy5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7KGU9K2UsdHw9MCxyfD0wLG4pfHxOKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28mMjU1O3JldHVybiB0K3J9LGcucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8Tih0aGlzLGUsdCwxLDI1NSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxnLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fE4odGhpcyxlLHQsMiw2NTUzNSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/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/dFtuXT1yLnNsaWNlKCk6dFtuXT1yfWZvcih2YXIgbj0wLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKXNlKGFyZ3VtZW50c1tuXSxyKTtyZXR1cm4gdH0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gc2UodCwoZnVuY3Rpb24odCxuKXtlW25dPXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0P1EodCxyKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXlxzKi8sIiIpLnJlcGxhY2UoL1xzKiQvLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfX07ZnVuY3Rpb24gdWUoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIGNlPWZ1bmN0aW9uKGUsdCxyKXtpZighdClyZXR1cm4gZTt2YXIgbjtpZihyKW49cih0KTtlbHNlIGlmKGFlLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIGk9W107YWUuZm9yRWFjaCh0LChmdW5jdGlvbihlLHQpe251bGwhPWUmJihhZS5pc0FycmF5KGUpP3QrPSJbXSI6ZT1bZV0sYWUuZm9yRWFjaChlLChmdW5jdGlvbihlKXthZS5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6YWUuaXNPYmplY3QoZSkmJihlPUpTT04uc3RyaW5naWZ5KGUpKSxpLnB1c2godWUodCkrIj0iK3VlKGUpKX0pKSl9KSksbj1pLmpvaW4oIiYiKX1pZihuKXt2YXIgbz1lLmluZGV4T2YoIiMiKTstMSE9PW8mJihlPWUuc2xpY2UoMCxvKSksZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrbn1yZXR1cm4gZX07ZnVuY3Rpb24gaGUoKXt0aGlzLmhhbmRsZXJzPVtdfWhlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0fSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0saGUucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxoZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXthZS5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsKGZ1bmN0aW9uKHQpe251bGwhPT10JiZlKHQpfSkpfTt2YXIgbGU9aGUsZmU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBhZS5mb3JFYWNoKHIsKGZ1bmN0aW9uKHIpe2U9cihlLHQpfSkpLGV9LGRlPWZ1bmN0aW9uKGUpe3JldHVybiEoIWV8fCFlLl9fQ0FOQ0VMX18pfTtmdW5jdGlvbiBwZSgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGdlKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgdmU9cGUseWU9Z2U7ZnVuY3Rpb24gbWUoZSl7aWYodmU9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKHZlPT09cGV8fCF2ZSkmJnNldFRpbWVvdXQpcmV0dXJuIHZlPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gdmUoZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIHZlLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiB2ZS5jYWxsKHRoaXMsZSwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiB0LnNldFRpbWVvdXQmJih2ZT1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5jbGVhclRpbWVvdXQmJih5ZT1jbGVhclRpbWVvdXQpO3ZhciB3ZSxiZT1bXSxfZT0hMSxrZT0tMTtmdW5jdGlvbiBTZSgpe19lJiZ3ZSYmKF9lPSExLHdlLmxlbmd0aD9iZT13ZS5jb25jYXQoYmUpOmtlPS0xLGJlLmxlbmd0aCYmQWUoKSl9ZnVuY3Rpb24gQWUoKXtpZighX2Upe3ZhciBlPW1lKFNlKTtfZT0hMDtmb3IodmFyIHQ9YmUubGVuZ3RoO3Q7KXtmb3Iod2U9YmUsYmU9W107KytrZTx0Oyl3ZSYmd2Vba2VdLnJ1bigpO2tlPS0xLHQ9YmUubGVuZ3RofXdlPW51bGwsX2U9ITEsZnVuY3Rpb24oZSl7aWYoeWU9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoeWU9PT1nZXx8IXllKSYmY2xlYXJUaW1lb3V0KXJldHVybiB5ZT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXt5ZShlKX1jYXRjaCh0KXt0cnl7cmV0dXJuIHllLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4geWUuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBUZShlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fVRlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBFZSgpe312YXIgUmU9RWUsQ2U9RWUsUGU9RWUsRGU9RWUsT2U9RWUsSWU9RWUsVWU9RWU7dmFyIE1lPXQucGVyZm9ybWFuY2V8fHt9LExlPU1lLm5vd3x8TWUubW96Tm93fHxNZS5tc05vd3x8TWUub05vd3x8TWUud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgSGU9bmV3IERhdGU7dmFyIHFlPXtuZXh0VGljazpmdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl0W3ItMV09YXJndW1lbnRzW3JdO2JlLnB1c2gobmV3IFRlKGUsdCkpLDEhPT1iZS5sZW5ndGh8fF9lfHxtZShBZSl9LHRpdGxlOiJicm93c2VyIixicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLHZlcnNpb246IiIsdmVyc2lvbnM6e30sb246UmUsYWRkTGlzdGVuZXI6Q2Usb25jZTpQZSxvZmY6RGUscmVtb3ZlTGlzdGVuZXI6T2UscmVtb3ZlQWxsTGlzdGVuZXJzOkllLGVtaXQ6VWUsYmluZGluZzpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKGUpe3ZhciB0PS4wMDEqTGUuY2FsbChNZSkscj1NYXRoLmZsb29yKHQpLG49TWF0aC5mbG9vcih0JTEqMWU5KTtyZXR1cm4gZSYmKHItPWVbMF0sKG4tPWVbMV0pPDAmJihyLS0sbis9MWU5KSksW3Isbl19LHBsYXRmb3JtOiJicm93c2VyIixyZWxlYXNlOnt9LGNvbmZpZzp7fSx1cHRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUtSGUpLzFlM319LEJlPWZ1bmN0aW9uKGUsdCl7YWUuZm9yRWFjaChlLChmdW5jdGlvbihyLG4pe24hPT10JiZuLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPXIsZGVsZXRlIGVbbl0pfSkpfSxqZT1mdW5jdGlvbihlLHQscixuLGkpe3JldHVybiBmdW5jdGlvbihlLHQscixuLGkpe3JldHVybiBlLmNvbmZpZz10LHImJihlLmNvZGU9ciksZS5yZXF1ZXN0PW4sZS5yZXNwb25zZT1pLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlfX0sZX0obmV3IEVycm9yKGUpLHQscixuLGkpfSx4ZT1hZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP3t3cml0ZTpmdW5jdGlvbihlLHQscixuLGksbyl7dmFyIHM9W107cy5wdXNoKGUrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KSksYWUuaXNOdW1iZXIocikmJnMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHIpLnRvR01UU3RyaW5nKCkpLGFlLmlzU3RyaW5nKG4pJiZzLnB1c2goInBhdGg9IituKSxhZS5pc1N0cmluZyhpKSYmcy5wdXNoKCJkb21haW49IitpKSwhMD09PW8mJnMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPXMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrZSsiKT0oW147XSopIikpO3JldHVybiB0P2RlY29kZVVSSUNvbXBvbmVudCh0WzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dGhpcy53cml0ZShlLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319LE5lPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sS2U9YWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlLHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBuKGUpe3ZhciBuPWU7cmV0dXJuIHQmJihyLnNldEF0dHJpYnV0ZSgiaHJlZiIsbiksbj1yLmhyZWYpLHIuc2V0QXR0cmlidXRlKCJocmVmIixuKSx7aHJlZjpyLmhyZWYscHJvdG9jb2w6ci5wcm90b2NvbD9yLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpyLmhvc3Qsc2VhcmNoOnIuc2VhcmNoP3Iuc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6ci5oYXNoP3IuaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOnIuaG9zdG5hbWUscG9ydDpyLnBvcnQscGF0aG5hbWU6Ii8iPT09ci5wYXRobmFtZS5jaGFyQXQoMCk/ci5wYXRobmFtZToiLyIrci5wYXRobmFtZX19cmV0dXJuIGU9bih3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24odCl7dmFyIHI9YWUuaXNTdHJpbmcodCk/bih0KTp0O3JldHVybiByLnByb3RvY29sPT09ZS5wcm90b2NvbCYmci5ob3N0PT09ZS5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiEwfSxGZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQscil7dmFyIG49ZS5kYXRhLGk9ZS5oZWFkZXJzO2FlLmlzRm9ybURhdGEobikmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgbz1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgcz1lLmF1dGgudXNlcm5hbWV8fCIiLGE9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShzKyI6IithKX12YXIgdSxjLGg9KHU9ZS5iYXNlVVJMLGM9ZS51cmwsdSYmIS9eKFthLXpdW2EtelxkXCtcLVwuXSo6KT9cL1wvL2kudGVzdChjKT9mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfSh1LGMpOmMpO2lmKG8ub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLGNlKGgsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksby50aW1lb3V0PWUudGltZW91dCxvLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKG8mJjQ9PT1vLnJlYWR5U3RhdGUmJigwIT09by5zdGF0dXN8fG8ucmVzcG9uc2VVUkwmJjA9PT1vLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6IikpKXt2YXIgbj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIG8/ZnVuY3Rpb24oZSl7dmFyIHQscixuLGk9e307cmV0dXJuIGU/KGFlLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PWFlLnRyaW0oZS5zdWJzdHIoMCxuKSkudG9Mb3dlckNhc2UoKSxyPWFlLnRyaW0oZS5zdWJzdHIobisxKSksdCl7aWYoaVt0XSYmTmUuaW5kZXhPZih0KT49MClyZXR1cm47aVt0XT0ic2V0LWNvb2tpZSI9PT10PyhpW3RdP2lbdF06W10pLmNvbmNhdChbcl0pOmlbdF0/aVt0XSsiLCAiK3I6cn19KSksaSk6aX0oby5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk6bnVsbCxpPXtkYXRhOmUucmVzcG9uc2VUeXBlJiYidGV4dCIhPT1lLnJlc3BvbnNlVHlwZT9vLnJlc3BvbnNlOm8ucmVzcG9uc2VUZXh0LHN0YXR1czpvLnN0YXR1cyxzdGF0dXNUZXh0Om8uc3RhdHVzVGV4dCxoZWFkZXJzOm4sY29uZmlnOmUscmVxdWVzdDpvfTshZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIuY29uZmlnLnZhbGlkYXRlU3RhdHVzO3Iuc3RhdHVzJiZuJiYhbihyLnN0YXR1cyk/dChqZSgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Iuc3RhdHVzLHIuY29uZmlnLG51bGwsci5yZXF1ZXN0LHIpKTplKHIpfSh0LHIsaSksbz1udWxsfX0sby5vbmFib3J0PWZ1bmN0aW9uKCl7byYmKHIoamUoIlJlcXVlc3QgYWJvcnRlZCIsZSwiRUNPTk5BQk9SVEVEIixvKSksbz1udWxsKX0sby5vbmVycm9yPWZ1bmN0aW9uKCl7cihqZSgiTmV0d29yayBFcnJvciIsZSxudWxsLG8pKSxvPW51bGx9LG8ub250aW1lb3V0PWZ1bmN0aW9uKCl7dmFyIHQ9InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjtlLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih0PWUudGltZW91dEVycm9yTWVzc2FnZSkscihqZSh0LGUsIkVDT05OQUJPUlRFRCIsbykpLG89bnVsbH0sYWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIGw9KGUud2l0aENyZWRlbnRpYWxzfHxLZShoKSkmJmUueHNyZkNvb2tpZU5hbWU/eGUucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7bCYmKGlbZS54c3JmSGVhZGVyTmFtZV09bCl9aWYoInNldFJlcXVlc3RIZWFkZXIiaW4gbyYmYWUuZm9yRWFjaChpLChmdW5jdGlvbihlLHQpe3ZvaWQgMD09PW4mJiJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpP2RlbGV0ZSBpW3RdOm8uc2V0UmVxdWVzdEhlYWRlcih0LGUpfSkpLGFlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KG8ud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLGUucmVzcG9uc2VUeXBlKXRyeXtvLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZX1jYXRjaCh0KXtpZigianNvbiIhPT1lLnJlc3BvbnNlVHlwZSl0aHJvdyB0fSJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmby5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MmJm8udXBsb2FkJiZvLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnByb21pc2UudGhlbigoZnVuY3Rpb24oZSl7byYmKG8uYWJvcnQoKSxyKGUpLG89bnVsbCl9KSksbnx8KG49bnVsbCksby5zZW5kKG4pfSkpfSxZZT17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIFdlKGUsdCl7IWFlLmlzVW5kZWZpbmVkKGUpJiZhZS5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgemUsSmU9e2FkYXB0ZXI6KCgidW5kZWZpbmVkIiE9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0fHx2b2lkIDAhPT1xZSYmIltvYmplY3QgcHJvY2Vzc10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHFlKSkmJih6ZT1GZSksemUpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEJlKHQsIkFjY2VwdCIpLEJlKHQsIkNvbnRlbnQtVHlwZSIpLGFlLmlzRm9ybURhdGEoZSl8fGFlLmlzQXJyYXlCdWZmZXIoZSl8fGFlLmlzQnVmZmVyKGUpfHxhZS5pc1N0cmVhbShlKXx8YWUuaXNGaWxlKGUpfHxhZS5pc0Jsb2IoZSk/ZTphZS5pc0FycmF5QnVmZmVyVmlldyhlKT9lLmJ1ZmZlcjphZS5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oV2UodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOmFlLmlzT2JqZWN0KGUpPyhXZSh0LCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiKSxKU09OLnN0cmluZ2lmeShlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpdHJ5e2U9SlNPTi5wYXJzZShlKX1jYXRjaChlKXt9cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH19O0plLmhlYWRlcnM9e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX0sYWUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSwoZnVuY3Rpb24oZSl7SmUuaGVhZGVyc1tlXT17fX0pKSxhZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe0plLmhlYWRlcnNbZV09YWUubWVyZ2UoWWUpfSkpO3ZhciBWZT1KZTtmdW5jdGlvbiAkZShlKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKX12YXIgR2U9ZnVuY3Rpb24oZSl7cmV0dXJuICRlKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT1mZShlLmRhdGEsZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVxdWVzdCksZS5oZWFkZXJzPWFlLm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksYWUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSwoZnVuY3Rpb24odCl7ZGVsZXRlIGUuaGVhZGVyc1t0XX0pKSwoZS5hZGFwdGVyfHxWZS5hZGFwdGVyKShlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gJGUoZSksdC5kYXRhPWZlKHQuZGF0YSx0LmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksdH0pLChmdW5jdGlvbih0KXtyZXR1cm4gZGUodCl8fCgkZShlKSx0JiZ0LnJlc3BvbnNlJiYodC5yZXNwb25zZS5kYXRhPWZlKHQucmVzcG9uc2UuZGF0YSx0LnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdCh0KX0pKX0sWGU9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciByPXt9LG49WyJ1cmwiLCJtZXRob2QiLCJkYXRhIl0saT1bImhlYWRlcnMiLCJhdXRoIiwicHJveHkiLCJwYXJhbXMiXSxvPVsiYmFzZVVSTCIsInRyYW5zZm9ybVJlcXVlc3QiLCJ0cmFuc2Zvcm1SZXNwb25zZSIsInBhcmFtc1NlcmlhbGl6ZXIiLCJ0aW1lb3V0IiwidGltZW91dE1lc3NhZ2UiLCJ3aXRoQ3JlZGVudGlhbHMiLCJhZGFwdGVyIiwicmVzcG9uc2VUeXBlIiwieHNyZkNvb2tpZU5hbWUiLCJ4c3JmSGVhZGVyTmFtZSIsIm9uVXBsb2FkUHJvZ3Jlc3MiLCJvbkRvd25sb2FkUHJvZ3Jlc3MiLCJkZWNvbXByZXNzIiwibWF4Q29udGVudExlbmd0aCIsIm1heEJvZHlMZW5ndGgiLCJtYXhSZWRpcmVjdHMiLCJ0cmFuc3BvcnQiLCJodHRwQWdlbnQiLCJodHRwc0FnZW50IiwiY2FuY2VsVG9rZW4iLCJzb2NrZXRQYXRoIiwicmVzcG9uc2VFbmNvZGluZyJdLHM9WyJ2YWxpZGF0ZVN0YXR1cyJdO2Z1bmN0aW9uIGEoZSx0KXtyZXR1cm4gYWUuaXNQbGFpbk9iamVjdChlKSYmYWUuaXNQbGFpbk9iamVjdCh0KT9hZS5tZXJnZShlLHQpOmFlLmlzUGxhaW5PYmplY3QodCk/YWUubWVyZ2Uoe30sdCk6YWUuaXNBcnJheSh0KT90LnNsaWNlKCk6dH1mdW5jdGlvbiB1KG4pe2FlLmlzVW5kZWZpbmVkKHRbbl0pP2FlLmlzVW5kZWZpbmVkKGVbbl0pfHwocltuXT1hKHZvaWQgMCxlW25dKSk6cltuXT1hKGVbbl0sdFtuXSl9YWUuZm9yRWFjaChuLChmdW5jdGlvbihlKXthZS5pc1VuZGVmaW5lZCh0W2VdKXx8KHJbZV09YSh2b2lkIDAsdFtlXSkpfSkpLGFlLmZvckVhY2goaSx1KSxhZS5mb3JFYWNoKG8sKGZ1bmN0aW9uKG4pe2FlLmlzVW5kZWZpbmVkKHRbbl0pP2FlLmlzVW5kZWZpbmVkKGVbbl0pfHwocltuXT1hKHZvaWQgMCxlW25dKSk6cltuXT1hKHZvaWQgMCx0W25dKX0pKSxhZS5mb3JFYWNoKHMsKGZ1bmN0aW9uKG4pe24gaW4gdD9yW25dPWEoZVtuXSx0W25dKTpuIGluIGUmJihyW25dPWEodm9pZCAwLGVbbl0pKX0pKTt2YXIgYz1uLmNvbmNhdChpKS5jb25jYXQobykuY29uY2F0KHMpLGg9T2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09Yy5pbmRleE9mKGUpfSkpO3JldHVybiBhZS5mb3JFYWNoKGgsdSkscn07ZnVuY3Rpb24gWmUoZSl7dGhpcy5kZWZhdWx0cz1lLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBsZSxyZXNwb25zZTpuZXcgbGV9fVplLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZT8oZT1hcmd1bWVudHNbMV18fHt9KS51cmw9YXJndW1lbnRzWzBdOmU9ZXx8e30sKGU9WGUodGhpcy5kZWZhdWx0cyxlKSkubWV0aG9kP2UubWV0aG9kPWUubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/ZS5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTplLm1ldGhvZD0iZ2V0Ijt2YXIgdD1bR2Usdm9pZCAwXSxyPVByb21pc2UucmVzb2x2ZShlKTtmb3IodGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKChmdW5jdGlvbihlKXt0LnVuc2hpZnQoZS5mdWxmaWxsZWQsZS5yZWplY3RlZCl9KSksdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpfSkpO3QubGVuZ3RoOylyPXIudGhlbih0LnNoaWZ0KCksdC5zaGlmdCgpKTtyZXR1cm4gcn0sWmUucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbihlKXtyZXR1cm4gZT1YZSh0aGlzLmRlZmF1bHRzLGUpLGNlKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LGFlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLChmdW5jdGlvbihlKXtaZS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFhlKHJ8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihyfHx7fSkuZGF0YX0pKX19KSksYWUuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLChmdW5jdGlvbihlKXtaZS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxyLG4pe3JldHVybiB0aGlzLnJlcXVlc3QoWGUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6cn0pKX19KSk7dmFyIFFlPVplO2Z1bmN0aW9uIGV0KGUpe3RoaXMubWVzc2FnZT1lfWV0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxldC5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgdHQ9ZXQ7ZnVuY3Rpb24gcnQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dD1lfSkpO3ZhciByPXRoaXM7ZSgoZnVuY3Rpb24oZSl7ci5yZWFzb258fChyLnJlYXNvbj1uZXcgdHQoZSksdChyLnJlYXNvbikpfSkpfXJ0LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LHJ0LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlO3JldHVybnt0b2tlbjpuZXcgcnQoKGZ1bmN0aW9uKHQpe2U9dH0pKSxjYW5jZWw6ZX19O3ZhciBudD1ydDtmdW5jdGlvbiBpdChlKXt2YXIgdD1uZXcgUWUoZSkscj1RKFFlLnByb3RvdHlwZS5yZXF1ZXN0LHQpO3JldHVybiBhZS5leHRlbmQocixRZS5wcm90b3R5cGUsdCksYWUuZXh0ZW5kKHIsdCkscn12YXIgb3Q9aXQoVmUpO290LkF4aW9zPVFlLG90LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaXQoWGUob3QuZGVmYXVsdHMsZSkpfSxvdC5DYW5jZWw9dHQsb3QuQ2FuY2VsVG9rZW49bnQsb3QuaXNDYW5jZWw9ZGUsb3QuYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX0sb3Quc3ByZWFkPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseShudWxsLHQpfX0sb3QuaXNBeGlvc0Vycm9yPWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmITA9PT1lLmlzQXhpb3NFcnJvcn07dmFyIHN0PW90LGF0PW90O3N0LmRlZmF1bHQ9YXQ7dmFyIHV0LGN0LGh0PXN0OwovKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgoKICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLgoKICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRICiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwKICAgIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICAgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL2Z1bmN0aW9uIGx0KGUsdCxyLG4pe3JldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e3Uobi5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXt1KG4udGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIHUoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygcj90Om5ldyByKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9dSgobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfShjdD11dHx8KHV0PXt9KSkuZm9ybVBvc3Q9ImZvcm1fcG9zdCIsY3QucXVlcnk9InF1ZXJ5Ijt2YXIgZnQ7IWZ1bmN0aW9uKGUpe2UuQ29uZmlnRGF0YT0iY29uZmlnX2RhdGEiLGUuT0lEQ1Byb3ZpZGVyTWV0YURhdGE9Im9pZGNfcHJvdmlkZXJfbWV0YV9kYXRhIixlLlNlc3Npb25EYXRhPSJzZXNzaW9uX2RhdGEiLGUuVGVtcG9yYXJ5RGF0YT0idGVtcG9yYXJ5X2RhdGEifShmdHx8KGZ0PXt9KSk7Y29uc3QgZHQ9InJlZnJlc2hfdG9rZW5fdGltZXIiO2NsYXNzIHB0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LHIsbixpLG8pe3N1cGVyKG51bGwhPW4/bjpudWxsPT1vP3ZvaWQgMDpvLm1lc3NhZ2UpLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPWUsdGhpcy5maWxlPXQsdGhpcy5tZXRob2Q9cix0aGlzLmRlc2NyaXB0aW9uPWksdGhpcy5lcnJvcj1vLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgZ3QgZXh0ZW5kcyBwdHtjb25zdHJ1Y3RvcihlLHQscixuLGksbyxzLGEsdSl7c3VwZXIoZSx0LHIsbixpKSx0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLHRoaXMuY29kZT1lLHRoaXMuZmlsZT10LHRoaXMubWV0aG9kPXIsdGhpcy5kZXNjcmlwdGlvbj1pLHRoaXMubmV0d29ya0Vycm9yQ29kZT1vLHRoaXMubmV0d29ya0Vycm9yTWVzc2FnZT1zLHRoaXMuc3RhdHVzPWEsdGhpcy5uZXR3b3JrRXJyb3JEYXRhPXV9fXZhciB2dD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dm9pZCAwIT09dD90OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIHl0KGUsdCxyKXtyZXR1cm4gZShyPXtwYXRoOnQsZXhwb3J0czp7fSxyZXF1aXJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJEeW5hbWljIHJlcXVpcmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBAcm9sbHVwL3BsdWdpbi1jb21tb25qcyIpfShudWxsPT10JiZyLnBhdGgpfX0sci5leHBvcnRzKSxyLmV4cG9ydHN9dmFyIG10PXZvaWQgMCE9PXQ/dDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30sd3Q9W10sYnQ9W10sX3Q9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksa3Q9ITE7ZnVuY3Rpb24gU3QoKXtrdD0hMDtmb3IodmFyIGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHQ9MCxyPWUubGVuZ3RoO3Q8cjsrK3Qpd3RbdF09ZVt0XSxidFtlLmNoYXJDb2RlQXQodCldPXQ7YnRbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGJ0WyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBBdChlLHQscil7Zm9yKHZhciBuLGksbz1bXSxzPXQ7czxyO3MrPTMpbj0oZVtzXTw8MTYpKyhlW3MrMV08PDgpK2VbcysyXSxvLnB1c2god3RbKGk9bik+PjE4JjYzXSt3dFtpPj4xMiY2M10rd3RbaT4+NiY2M10rd3RbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIFR0KGUpe3ZhciB0O2t0fHxTdCgpO2Zvcih2YXIgcj1lLmxlbmd0aCxuPXIlMyxpPSIiLG89W10scz0xNjM4MyxhPTAsdT1yLW47YTx1O2ErPXMpby5wdXNoKEF0KGUsYSxhK3M+dT91OmErcykpO3JldHVybiAxPT09bj8odD1lW3ItMV0saSs9d3RbdD4+Ml0saSs9d3RbdDw8NCY2M10saSs9Ij09Iik6Mj09PW4mJih0PShlW3ItMl08PDgpK2Vbci0xXSxpKz13dFt0Pj4xMF0saSs9d3RbdD4+NCY2M10saSs9d3RbdDw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiBFdChlLHQscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1yP2ktMTowLGY9cj8tMToxLGQ9ZVt0K2xdO2ZvcihsKz1mLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPWE7aD4wO289MjU2Km8rZVt0K2xdLGwrPWYsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO3M9MjU2KnMrZVt0K2xdLGwrPWYsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihkPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09Y31yZXR1cm4oZD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiBSdChlLHQscixuLGksbyl7dmFyIHMsYSx1LGM9OCpvLWktMSxoPSgxPDxjKS0xLGw9aD4+MSxmPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZD1uPzA6by0xLHA9bj8xOi0xLGc9dDwwfHwwPT09dCYmMS90PDA/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHx0PT09MS8wPyhhPWlzTmFOKHQpPzE6MCxzPWgpOihzPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKHQrPXMrbD49MT9mL3U6ZipNYXRoLnBvdygyLDEtbCkpKnU+PTImJihzKyssdS89MikscytsPj1oPyhhPTAscz1oKTpzK2w+PTE/KGE9KHQqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWwpOihhPXQqTWF0aC5wb3coMixsLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtlW3IrZF09MjU1JmEsZCs9cCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGMrPWk7Yz4wO2VbcitkXT0yNTUmcyxkKz1wLHMvPTI1NixjLT04KTtlW3IrZC1wXXw9MTI4Kmd9dmFyIEN0PXt9LnRvU3RyaW5nLFB0PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PUN0LmNhbGwoZSl9O1V0LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09bXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8bXQuVFlQRURfQVJSQVlfU1VQUE9SVDt2YXIgRHQ9T3QoKTtmdW5jdGlvbiBPdCgpe3JldHVybiBVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBJdChlLHQpe2lmKE90KCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT1uZXcgVWludDhBcnJheSh0KSkuX19wcm90b19fPVV0LnByb3RvdHlwZToobnVsbD09PWUmJihlPW5ldyBVdCh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBVdChlLHQscil7aWYoIShVdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgVXQpKXJldHVybiBuZXcgVXQoZSx0LHIpO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gSHQodGhpcyxlKX1yZXR1cm4gTXQodGhpcyxlLHQscil9ZnVuY3Rpb24gTXQoZSx0LHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24oZSx0LHIsbil7aWYodC5ieXRlTGVuZ3RoLHI8MHx8dC5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZih0LmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtyZXR1cm4gdD12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkodCxyKTpuZXcgVWludDhBcnJheSh0LHIsbiksVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189VXQucHJvdG90eXBlOmU9cXQoZSx0KSxlfShlLHQscixuKToic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0LHIpe2lmKCJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpLCFVdC5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8eHQodCxyKSxpPShlPUl0KGUsbikpLndyaXRlKHQscik7cmV0dXJuIGkhPT1uJiYoZT1lLnNsaWNlKDAsaSkpLGV9KGUsdCxyKTpmdW5jdGlvbihlLHQpe2lmKGp0KHQpKXt2YXIgcj0wfEJ0KHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPUl0KGUscikpLmxlbmd0aHx8dC5jb3B5KGUsMCwwLHIpLGV9aWYodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiB0KXJldHVybiJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fChuPXQubGVuZ3RoKSE9bj9JdChlLDApOnF0KGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJlB0KHQuZGF0YSkpcmV0dXJuIHF0KGUsdC5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KGUsdCl9ZnVuY3Rpb24gTHQoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBIdChlLHQpe2lmKEx0KHQpLGU9SXQoZSx0PDA/MDowfEJ0KHQpKSwhVXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPHQ7KytyKWVbcl09MDtyZXR1cm4gZX1mdW5jdGlvbiBxdChlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfEJ0KHQubGVuZ3RoKTtlPUl0KGUscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpZVtuXT0yNTUmdFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBCdChlKXtpZihlPj1PdCgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitPdCgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8ZX1mdW5jdGlvbiBqdChlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24geHQoZSx0KXtpZihqdChlKSlyZXR1cm4gZS5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gZS5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgZSYmKGU9IiIrZSk7dmFyIHI9ZS5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKHQpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gZnIoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBkcihlKS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBmcihlKS5sZW5ndGg7dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBOdChlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiB0cih0aGlzLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gWnQodGhpcyx0LHIpO2Nhc2UiYXNjaWkiOnJldHVybiBRdCh0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gZXIodGhpcyx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gWHQodGhpcyx0LHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gcnIodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gS3QoZSx0LHIpe3ZhciBuPWVbdF07ZVt0XT1lW3JdLGVbcl09bn1mdW5jdGlvbiBGdChlLHQscixuLGkpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDplLmxlbmd0aC0xKSxyPDAmJihyPWUubGVuZ3RoK3IpLHI+PWUubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9ZS5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9VXQuZnJvbSh0LG4pKSxqdCh0KSlyZXR1cm4gMD09PXQubGVuZ3RoPy0xOll0KGUsdCxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Jj0yNTUsVXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOll0KGUsW3RdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBZdChlLHQscixuLGkpe3ZhciBvLHM9MSxhPWUubGVuZ3RoLHU9dC5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYoZS5sZW5ndGg8Mnx8dC5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gYyhlLHQpe3JldHVybiAxPT09cz9lW3RdOmUucmVhZFVJbnQxNkJFKHQqcyl9aWYoaSl7dmFyIGg9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGMoZSxvKT09PWModCwtMT09PWg/MDpvLWgpKXtpZigtMT09PWgmJihoPW8pLG8taCsxPT09dSlyZXR1cm4gaCpzfWVsc2UtMSE9PWgmJihvLT1vLWgpLGg9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGw9ITAsZj0wO2Y8dTtmKyspaWYoYyhlLG8rZikhPT1jKHQsZikpe2w9ITE7YnJlYWt9aWYobClyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBXdChlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24genQoZSx0LHIsbil7cmV0dXJuIHByKGZyKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIEp0KGUsdCxyLG4pe3JldHVybiBwcihmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7KytyKXQucHVzaCgyNTUmZS5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gdH0odCksZSxyLG4pfWZ1bmN0aW9uIFZ0KGUsdCxyLG4pe3JldHVybiBKdChlLHQscixuKX1mdW5jdGlvbiAkdChlLHQscixuKXtyZXR1cm4gcHIoZHIodCksZSxyLG4pfWZ1bmN0aW9uIEd0KGUsdCxyLG4pe3JldHVybiBwcihmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFh0KGUsdCxyKXtyZXR1cm4gMD09PXQmJnI9PT1lLmxlbmd0aD9UdChlKTpUdChlLnNsaWNlKHQscikpfWZ1bmN0aW9uIFp0KGUsdCxyKXtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPXQ7aTxyOyl7dmFyIG8scyxhLHUsYz1lW2ldLGg9bnVsbCxsPWM+MjM5PzQ6Yz4yMjM/MzpjPjE5MT8yOjE7aWYoaStsPD1yKXN3aXRjaChsKXtjYXNlIDE6YzwxMjgmJihoPWMpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89ZVtpKzFdKSkmJih1PSgzMSZjKTw8Nnw2MyZvKT4xMjcmJihoPXUpO2JyZWFrO2Nhc2UgMzpvPWVbaSsxXSxzPWVbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmMpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoaD11KTticmVhaztjYXNlIDQ6bz1lW2krMV0scz1lW2krMl0sYT1lW2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmMpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmdTwxMTE0MTEyJiYoaD11KX1udWxsPT09aD8oaD02NTUzMyxsPTEpOmg+NjU1MzUmJihoLT02NTUzNixuLnB1c2goaD4+PjEwJjEwMjN8NTUyOTYpLGg9NTYzMjB8MTAyMyZoKSxuLnB1c2goaCksaSs9bH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9NDA5NilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7Zm9yKHZhciByPSIiLG49MDtuPHQ7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UobixuKz00MDk2KSk7cmV0dXJuIHJ9KG4pfWZ1bmN0aW9uIFF0KGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gZXIoZSx0LHIpe3ZhciBuPSIiO3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBpPXQ7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbaV0pO3JldHVybiBufWZ1bmN0aW9uIHRyKGUsdCxyKXt2YXIgbj1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz10O288cjsrK28paSs9bHIoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gcnIoZSx0LHIpe2Zvcih2YXIgbj1lLnNsaWNlKHQsciksaT0iIixvPTA7bzxuLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUobltvXSsyNTYqbltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBucihlLHQscil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gaXIoZSx0LHIsbixpLG8pe2lmKCFqdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5pfHx0PG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gb3IoZSx0LHIsbil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciwyKTtpPG87KytpKWVbcitpXT0odCYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIHNyKGUsdCxyLG4pe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciw0KTtpPG87KytpKWVbcitpXT10Pj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIGFyKGUsdCxyLG4saSxvKXtpZihyK24+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gdXIoZSx0LHIsbixpKXtyZXR1cm4gaXx8YXIoZSwwLHIsNCksUnQoZSx0LHIsbiwyMyw0KSxyKzR9ZnVuY3Rpb24gY3IoZSx0LHIsbixpKXtyZXR1cm4gaXx8YXIoZSwwLHIsOCksUnQoZSx0LHIsbiw1Miw4KSxyKzh9VXQucG9vbFNpemU9ODE5MixVdC5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189VXQucHJvdG90eXBlLGV9LFV0LmZyb209ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBNdChudWxsLGUsdCxyKX0sVXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmKFV0LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsVXQuX19wcm90b19fPVVpbnQ4QXJyYXkpLFV0LmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIEx0KHQpLHQ8PTA/SXQoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9JdChlLHQpLmZpbGwocixuKTpJdChlLHQpLmZpbGwocik6SXQoZSx0KX0obnVsbCxlLHQscil9LFV0LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBIdChudWxsLGUpfSxVdC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIEh0KG51bGwsZSl9LFV0LmlzQnVmZmVyPWdyLFV0LmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighanQoZSl8fCFqdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtyPWVbaV0sbj10W2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sVXQuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sVXQuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIVB0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIFV0LmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxyPTA7cjxlLmxlbmd0aDsrK3IpdCs9ZVtyXS5sZW5ndGg7dmFyIG49VXQuYWxsb2NVbnNhZmUodCksaT0wO2ZvcihyPTA7cjxlLmxlbmd0aDsrK3Ipe3ZhciBvPWVbcl07aWYoIWp0KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sVXQuYnl0ZUxlbmd0aD14dCxVdC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLFV0LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpS3QodGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LFV0LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpS3QodGhpcyx0LHQrMyksS3QodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sVXQucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClLdCh0aGlzLHQsdCs3KSxLdCh0aGlzLHQrMSx0KzYpLEt0KHRoaXMsdCsyLHQrNSksS3QodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sVXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/WnQodGhpcywwLGUpOk50LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sVXQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighanQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PVV0LmNvbXBhcmUodGhpcyxlKX0sVXQucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sVXQucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZighanQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PXImJihyPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLHQ8MHx8cj5lLmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZ0Pj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYodD49cilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKG8scyksdT10aGlzLnNsaWNlKG4saSksYz1lLnNsaWNlKHQsciksaD0wO2g8YTsrK2gpaWYodVtoXSE9PWNbaF0pe289dVtoXSxzPWNbaF07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxVdC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxyKX0sVXQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBGdCh0aGlzLGUsdCxyLCEwKX0sVXQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gRnQodGhpcyxlLHQsciwhMSl9LFV0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQscixuKXtpZih2b2lkIDA9PT10KW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiB0KW49dCxyPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSxlLmxlbmd0aD4wJiYocjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gV3QodGhpcyxlLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4genQodGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIEp0KHRoaXMsZSx0LHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFZ0KHRoaXMsZSx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gJHQodGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBHdCh0aGlzLGUsdCxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxVdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fSxVdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKChlPX5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSwodD12b2lkIDA9PT10P246fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLHQ8ZSYmKHQ9ZSksVXQuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1VdC5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgVXQoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rZV19cmV0dXJuIHJ9LFV0LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8bnIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LFV0LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8bnIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlKy0tdF0saT0xO3Q+MCYmKGkqPTI1Nik7KW4rPXRoaXNbZSstLXRdKmk7cmV0dXJuIG59LFV0LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bnIoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxVdC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG5yKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LFV0LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bnIoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sVXQucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LFV0LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bnIoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxVdC5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8bnIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KnQpKSxufSxVdC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8bnIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dCxpPTEsbz10aGlzW2UrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW2UrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCp0KSksb30sVXQucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG5yKGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LFV0LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe3R8fG5yKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LFV0LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fG5yKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LFV0LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sVXQucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG5yKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxVdC5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bnIoZSw0LHRoaXMubGVuZ3RoKSxFdCh0aGlzLGUsITAsMjMsNCl9LFV0LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDQsdGhpcy5sZW5ndGgpLEV0KHRoaXMsZSwhMSwyMyw0KX0sVXQucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDgsdGhpcy5sZW5ndGgpLEV0KHRoaXMsZSwhMCw1Miw4KX0sVXQucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDgsdGhpcy5sZW5ndGgpLEV0KHRoaXMsZSwhMSw1Miw4KX0sVXQucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2U9K2UsdHw9MCxyfD0wLG58fGlyKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPHImJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pJjI1NTtyZXR1cm4gdCtyfSxVdC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7ZT0rZSx0fD0wLHJ8PTAsbnx8aXIodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspdGhpc1t0K2ldPWUvbyYyNTU7cmV0dXJuIHQrcn0sVXQucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8aXIodGhpcyxlLHQsMSwyNTUsMCksVXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LFV0LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDIsNjU1MzUsMCksVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOm9yKHRoaXMsZSx0LCEwKSx0KzJ9LFV0LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDIsNjU1MzUsMCksVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOm9yKHRoaXMsZSx0LCExKSx0KzJ9LFV0LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOnNyKHRoaXMsZSx0LCEwKSx0KzR9LFV0LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOnNyKHRoaXMsZSx0LCExKSx0KzR9LFV0LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7aXIodGhpcyxlLHQscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK288ciYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3Qrby0xXSYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K3J9LFV0LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7aXIodGhpcyxlLHQscixpLTEsLWkpfXZhciBvPXItMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109MjU1JmU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvKzFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrcn0sVXQucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxpcih0aGlzLGUsdCwxLDEyNywtMTI4KSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxVdC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6b3IodGhpcyxlLHQsITApLHQrMn0sVXQucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxpcih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOm9yKHRoaXMsZSx0LCExKSx0KzJ9LFV0LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8aXIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOnNyKHRoaXMsZSx0LCEwKSx0KzR9LFV0LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8aXIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOnNyKHRoaXMsZSx0LCExKSx0KzR9LFV0LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB1cih0aGlzLGUsdCwhMCxyKX0sVXQucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHVyKHRoaXMsZSx0LCExLHIpfSxVdC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGNyKHRoaXMsZSx0LCEwLHIpfSxVdC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGNyKHRoaXMsZSx0LCExLHIpfSxVdC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8bi1yJiYobj1lLmxlbmd0aC10K3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT1lJiZyPHQmJnQ8bilmb3IoaT1vLTE7aT49MDstLWkpZVtpK3RdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhVXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpZVtpK3RdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShyLHIrbyksdCk7cmV0dXJuIG99LFV0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhuPXQsdD0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBpPWUuY2hhckNvZGVBdCgwKTtpPDI1NiYmKGU9aSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFVdC5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD10KXJldHVybiB0aGlzO3ZhciBvO2lmKHQ+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihvPXQ7bzxyOysrbyl0aGlzW29dPWU7ZWxzZXt2YXIgcz1qdChlKT9lOmZyKG5ldyBVdChlLG4pLnRvU3RyaW5nKCkpLGE9cy5sZW5ndGg7Zm9yKG89MDtvPHItdDsrK28pdGhpc1tvK3RdPXNbbyVhXX1yZXR1cm4gdGhpc307dmFyIGhyPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIGxyKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBmcihlLHQpe3ZhciByO3Q9dHx8MS8wO2Zvcih2YXIgbj1lLmxlbmd0aCxpPW51bGwsbz1bXSxzPTA7czxuOysrcyl7aWYoKHI9ZS5jaGFyQ29kZUF0KHMpKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1uKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigodC09MSk8MClicmVhaztvLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO28ucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigodC09Myk8MClicmVhaztvLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO28ucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gZHIoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LHIsbixpLG8scztrdHx8U3QoKTt2YXIgYT1lLmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PWVbYS0yXT8yOiI9Ij09PWVbYS0xXT8xOjAscz1uZXcgX3QoMyphLzQtbyksbj1vPjA/YS00OmE7dmFyIHU9MDtmb3IodD0wLHI9MDt0PG47dCs9NCxyKz0zKWk9YnRbZS5jaGFyQ29kZUF0KHQpXTw8MTh8YnRbZS5jaGFyQ29kZUF0KHQrMSldPDwxMnxidFtlLmNoYXJDb2RlQXQodCsyKV08PDZ8YnRbZS5jaGFyQ29kZUF0KHQrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9YnRbZS5jaGFyQ29kZUF0KHQpXTw8MnxidFtlLmNoYXJDb2RlQXQodCsxKV0+PjQsc1t1KytdPTI1NSZpKToxPT09byYmKGk9YnRbZS5jaGFyQ29kZUF0KHQpXTw8MTB8YnRbZS5jaGFyQ29kZUF0KHQrMSldPDw0fGJ0W2UuY2hhckNvZGVBdCh0KzIpXT4+MixzW3UrK109aT4+OCYyNTUsc1t1KytdPTI1NSZpKSxzfShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKGhyLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBwcihlLHQscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj10Lmxlbmd0aHx8aT49ZS5sZW5ndGgpOysraSl0W2krcl09ZVtpXTtyZXR1cm4gaX1mdW5jdGlvbiBncihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fHZyKGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJnZyKGUuc2xpY2UoMCwwKSl9KGUpKX1mdW5jdGlvbiB2cihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciB5cj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6VXQsSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksVXQuYWxsb2MoK2UpfSxpc0J1ZmZlcjpncixrTWF4TGVuZ3RoOkR0fSksbXI9eXQoKGZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxyPXQlNDtpZighcilyZXR1cm4gZTt2YXIgbj10LGk9NC1yLG89dCtpLHM9VXQuYWxsb2Mobyk7Zm9yKHMud3JpdGUoZSk7aS0tOylzLndyaXRlKCI9IixuKyspO3JldHVybiBzLnRvU3RyaW5nKCl9fSkpLHdyPXl0KChmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxVdC5pc0J1ZmZlcihlKT9pKGUudG9TdHJpbmcoImJhc2U2NCIpKTppKFV0LmZyb20oZSx0KS50b1N0cmluZygiYmFzZTY0IikpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIGU9ZS50b1N0cmluZygpLG1yLmRlZmF1bHQoZSkucmVwbGFjZSgvXC0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUucmVwbGFjZSgvPS9nLCIiKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1yO28uZW5jb2RlPXIsby5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxVdC5mcm9tKG4oZSksImJhc2U2NCIpLnRvU3RyaW5nKHQpfSxvLnRvQmFzZTY0PW4sby5mcm9tQmFzZTY0PWksby50b0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gVXQuZnJvbShuKGUpLCJiYXNlNjQiKX0sdC5kZWZhdWx0PW99KSksYnI9eXQoKGZ1bmN0aW9uKGUpe2UuZXhwb3J0cz13ci5kZWZhdWx0LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0c30pKSxfcj1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVmYXVsdCIpP2UuZGVmYXVsdDplfSh5dCgoZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQscil7dmFyIG49e307IWZ1bmN0aW9uKGUpe2UuX19lc01vZHVsZT0hMCxlLmRpZ2VzdExlbmd0aD0zMixlLmJsb2NrU2l6ZT02NDt2YXIgdD1uZXcgVWludDMyQXJyYXkoWzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0pO2Z1bmN0aW9uIHIoZSxyLG4saSxvKXtmb3IodmFyIHMsYSx1LGMsaCxsLGYsZCxwLGcsdix5LG07bz49NjQ7KXtmb3Iocz1yWzBdLGE9clsxXSx1PXJbMl0sYz1yWzNdLGg9cls0XSxsPXJbNV0sZj1yWzZdLGQ9cls3XSxnPTA7ZzwxNjtnKyspdj1pKzQqZyxlW2ddPSgyNTUmblt2XSk8PDI0fCgyNTUmblt2KzFdKTw8MTZ8KDI1NSZuW3YrMl0pPDw4fDI1NSZuW3YrM107Zm9yKGc9MTY7Zzw2NDtnKyspeT0oKHA9ZVtnLTJdKT4+PjE3fHA8PDE1KV4ocD4+PjE5fHA8PDEzKV5wPj4+MTAsbT0oKHA9ZVtnLTE1XSk+Pj43fHA8PDI1KV4ocD4+PjE4fHA8PDE0KV5wPj4+MyxlW2ddPSh5K2VbZy03XXwwKSsobStlW2ctMTZdfDApO2ZvcihnPTA7Zzw2NDtnKyspeT0oKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKGgmbF5+aCZmKXwwKSsoZCsodFtnXStlW2ddfDApfDApfDAsbT0oKHM+Pj4yfHM8PDMwKV4ocz4+PjEzfHM8PDE5KV4ocz4+PjIyfHM8PDEwKSkrKHMmYV5zJnVeYSZ1KXwwLGQ9ZixmPWwsbD1oLGg9Yyt5fDAsYz11LHU9YSxhPXMscz15K218MDtyWzBdKz1zLHJbMV0rPWEsclsyXSs9dSxyWzNdKz1jLHJbNF0rPWgscls1XSs9bCxyWzZdKz1mLHJbN10rPWQsaSs9NjQsby09NjR9cmV0dXJuIGl9dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5kaWdlc3RMZW5ndGg9ZS5kaWdlc3RMZW5ndGgsdGhpcy5ibG9ja1NpemU9ZS5ibG9ja1NpemUsdGhpcy5zdGF0ZT1uZXcgSW50MzJBcnJheSg4KSx0aGlzLnRlbXA9bmV3IEludDMyQXJyYXkoNjQpLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDEyOCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzLnJlc2V0KCl9cmV0dXJuIHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVbMF09MTc3OTAzMzcwMyx0aGlzLnN0YXRlWzFdPTMxNDQxMzQyNzcsdGhpcy5zdGF0ZVsyXT0xMDEzOTA0MjQyLHRoaXMuc3RhdGVbM109Mjc3MzQ4MDc2Mix0aGlzLnN0YXRlWzRdPTEzNTk4OTMxMTksdGhpcy5zdGF0ZVs1XT0yNjAwODIyOTI0LHRoaXMuc3RhdGVbNl09NTI4NzM0NjM1LHRoaXMuc3RhdGVbN109MTU0MTQ1OTIyNSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXN9LHQucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmJ1ZmZlci5sZW5ndGg7ZSsrKXRoaXMuYnVmZmVyW2VdPTA7Zm9yKGU9MDtlPHRoaXMudGVtcC5sZW5ndGg7ZSsrKXRoaXMudGVtcFtlXT0wO3RoaXMucmVzZXQoKX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZS5sZW5ndGgpLHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJTSEEyNTY6IGNhbid0IHVwZGF0ZSBiZWNhdXNlIGhhc2ggd2FzIGZpbmlzaGVkLiIpO3ZhciBuPTA7aWYodGhpcy5ieXRlc0hhc2hlZCs9dCx0aGlzLmJ1ZmZlckxlbmd0aD4wKXtmb3IoO3RoaXMuYnVmZmVyTGVuZ3RoPDY0JiZ0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbbisrXSx0LS07NjQ9PT10aGlzLmJ1ZmZlckxlbmd0aCYmKHIodGhpcy50ZW1wLHRoaXMuc3RhdGUsdGhpcy5idWZmZXIsMCw2NCksdGhpcy5idWZmZXJMZW5ndGg9MCl9Zm9yKHQ+PTY0JiYobj1yKHRoaXMudGVtcCx0aGlzLnN0YXRlLGUsbix0KSx0JT02NCk7dD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW24rK10sdC0tO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuZmluaXNoZWQpe3ZhciB0PXRoaXMuYnl0ZXNIYXNoZWQsbj10aGlzLmJ1ZmZlckxlbmd0aCxpPXQvNTM2ODcwOTEyfDAsbz10PDwzLHM9dCU2NDw1Nj82NDoxMjg7dGhpcy5idWZmZXJbbl09MTI4O2Zvcih2YXIgYT1uKzE7YTxzLTg7YSsrKXRoaXMuYnVmZmVyW2FdPTA7dGhpcy5idWZmZXJbcy04XT1pPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtN109aT4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTZdPWk+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTVdPWk+Pj4wJjI1NSx0aGlzLmJ1ZmZlcltzLTRdPW8+Pj4yNCYyNTUsdGhpcy5idWZmZXJbcy0zXT1vPj4+MTYmMjU1LHRoaXMuYnVmZmVyW3MtMl09bz4+PjgmMjU1LHRoaXMuYnVmZmVyW3MtMV09bz4+PjAmMjU1LHIodGhpcy50ZW1wLHRoaXMuc3RhdGUsdGhpcy5idWZmZXIsMCxzKSx0aGlzLmZpbmlzaGVkPSEwfWZvcihhPTA7YTw4O2ErKyllWzQqYSswXT10aGlzLnN0YXRlW2FdPj4+MjQmMjU1LGVbNCphKzFdPXRoaXMuc3RhdGVbYV0+Pj4xNiYyNTUsZVs0KmErMl09dGhpcy5zdGF0ZVthXT4+PjgmMjU1LGVbNCphKzNdPXRoaXMuc3RhdGVbYV0+Pj4wJjI1NTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSx0LnByb3RvdHlwZS5fc2F2ZVN0YXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dGhpcy5zdGF0ZS5sZW5ndGg7dCsrKWVbdF09dGhpcy5zdGF0ZVt0XX0sdC5wcm90b3R5cGUuX3Jlc3RvcmVTdGF0ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj0wO3I8dGhpcy5zdGF0ZS5sZW5ndGg7cisrKXRoaXMuc3RhdGVbcl09ZVtyXTt0aGlzLmJ5dGVzSGFzaGVkPXQsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmJ1ZmZlckxlbmd0aD0wfSx0fSgpO2UuSGFzaD1uO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmlubmVyPW5ldyBuLHRoaXMub3V0ZXI9bmV3IG4sdGhpcy5ibG9ja1NpemU9dGhpcy5pbm5lci5ibG9ja1NpemUsdGhpcy5kaWdlc3RMZW5ndGg9dGhpcy5pbm5lci5kaWdlc3RMZW5ndGg7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja1NpemUpO2lmKGUubGVuZ3RoPnRoaXMuYmxvY2tTaXplKShuZXcgbikudXBkYXRlKGUpLmZpbmlzaCh0KS5jbGVhbigpO2Vsc2UgZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspdFtyXT1lW3JdO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXV49NTQ7Zm9yKHRoaXMuaW5uZXIudXBkYXRlKHQpLHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdXj0xMDY7Zm9yKHRoaXMub3V0ZXIudXBkYXRlKHQpLHRoaXMuaXN0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLm9zdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5pbm5lci5fc2F2ZVN0YXRlKHRoaXMuaXN0YXRlKSx0aGlzLm91dGVyLl9zYXZlU3RhdGUodGhpcy5vc3RhdGUpLHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdPTB9cmV0dXJuIGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLmlzdGF0ZSx0aGlzLmlubmVyLmJsb2NrU2l6ZSksdGhpcy5vdXRlci5fcmVzdG9yZVN0YXRlKHRoaXMub3N0YXRlLHRoaXMub3V0ZXIuYmxvY2tTaXplKSx0aGlzfSxlLnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5pc3RhdGUubGVuZ3RoO2UrKyl0aGlzLm9zdGF0ZVtlXT10aGlzLmlzdGF0ZVtlXT0wO3RoaXMuaW5uZXIuY2xlYW4oKSx0aGlzLm91dGVyLmNsZWFuKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbm5lci51cGRhdGUoZSksdGhpc30sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm91dGVyLmZpbmlzaGVkP3RoaXMub3V0ZXIuZmluaXNoKGUpOih0aGlzLmlubmVyLmZpbmlzaChlKSx0aGlzLm91dGVyLnVwZGF0ZShlLHRoaXMuZGlnZXN0TGVuZ3RoKS5maW5pc2goZSkpLHRoaXN9LGUucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sZX0oKTtmdW5jdGlvbiBvKGUpe3ZhciB0PShuZXcgbikudXBkYXRlKGUpLHI9dC5kaWdlc3QoKTtyZXR1cm4gdC5jbGVhbigpLHJ9ZnVuY3Rpb24gcyhlLHQpe3ZhciByPW5ldyBpKGUpLnVwZGF0ZSh0KSxuPXIuZGlnZXN0KCk7cmV0dXJuIHIuY2xlYW4oKSxufWZ1bmN0aW9uIGEoZSx0LHIsbil7dmFyIGk9blswXTtpZigwPT09aSl0aHJvdyBuZXcgRXJyb3IoImhrZGY6IGNhbm5vdCBleHBhbmQgbW9yZSIpO3QucmVzZXQoKSxpPjEmJnQudXBkYXRlKGUpLHImJnQudXBkYXRlKHIpLHQudXBkYXRlKG4pLHQuZmluaXNoKGUpLG5bMF0rK31lLkhNQUM9aSxlLmhhc2g9byxlLmRlZmF1bHQ9byxlLmhtYWM9czt2YXIgdT1uZXcgVWludDhBcnJheShlLmRpZ2VzdExlbmd0aCk7ZS5oa2RmPWZ1bmN0aW9uKGUsdCxyLG4pe3ZvaWQgMD09PXQmJih0PXUpLHZvaWQgMD09PW4mJihuPTMyKTtmb3IodmFyIG89bmV3IFVpbnQ4QXJyYXkoWzFdKSxjPXModCxlKSxoPW5ldyBpKGMpLGw9bmV3IFVpbnQ4QXJyYXkoaC5kaWdlc3RMZW5ndGgpLGY9bC5sZW5ndGgsZD1uZXcgVWludDhBcnJheShuKSxwPTA7cDxuO3ArKylmPT09bC5sZW5ndGgmJihhKGwsaCxyLG8pLGY9MCksZFtwXT1sW2YrK107cmV0dXJuIGguY2xlYW4oKSxsLmZpbGwoMCksby5maWxsKDApLGR9LGUucGJrZGYyPWZ1bmN0aW9uKGUsdCxyLG4pe2Zvcih2YXIgbz1uZXcgaShlKSxzPW8uZGlnZXN0TGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkoNCksdT1uZXcgVWludDhBcnJheShzKSxjPW5ldyBVaW50OEFycmF5KHMpLGg9bmV3IFVpbnQ4QXJyYXkobiksbD0wO2wqczxuO2wrKyl7dmFyIGY9bCsxO2FbMF09Zj4+PjI0JjI1NSxhWzFdPWY+Pj4xNiYyNTUsYVsyXT1mPj4+OCYyNTUsYVszXT1mPj4+MCYyNTUsby5yZXNldCgpLG8udXBkYXRlKHQpLG8udXBkYXRlKGEpLG8uZmluaXNoKGMpO2Zvcih2YXIgZD0wO2Q8cztkKyspdVtkXT1jW2RdO2ZvcihkPTI7ZDw9cjtkKyspe28ucmVzZXQoKSxvLnVwZGF0ZShjKS5maW5pc2goYyk7Zm9yKHZhciBwPTA7cDxzO3ArKyl1W3BdXj1jW3BdfWZvcihkPTA7ZDxzJiZsKnMrZDxuO2QrKyloW2wqcytkXT11W2RdfWZvcihsPTA7bDxzO2wrKyl1W2xdPWNbbF09MDtmb3IobD0wO2w8NDtsKyspYVtsXT0wO3JldHVybiBvLmNsZWFuKCksaH19KG4pO3ZhciBpPW4uZGVmYXVsdDtmb3IodmFyIG8gaW4gbilpW29dPW5bb107ZS5leHBvcnRzPWl9KCl9KSkpO2Z1bmN0aW9uIGtyKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gU3IoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBBcj1rcixUcj1TcjtmdW5jdGlvbiBFcihlKXtpZihBcj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigoQXI9PT1rcnx8IUFyKSYmc2V0VGltZW91dClyZXR1cm4gQXI9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiBBcihlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gQXIuY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIEFyLmNhbGwodGhpcyxlLDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIG10LnNldFRpbWVvdXQmJihBcj1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgbXQuY2xlYXJUaW1lb3V0JiYoVHI9Y2xlYXJUaW1lb3V0KTt2YXIgUnIsQ3I9W10sUHI9ITEsRHI9LTE7ZnVuY3Rpb24gT3IoKXtQciYmUnImJihQcj0hMSxSci5sZW5ndGg/Q3I9UnIuY29uY2F0KENyKTpEcj0tMSxDci5sZW5ndGgmJklyKCkpfWZ1bmN0aW9uIElyKCl7aWYoIVByKXt2YXIgZT1FcihPcik7UHI9ITA7Zm9yKHZhciB0PUNyLmxlbmd0aDt0Oyl7Zm9yKFJyPUNyLENyPVtdOysrRHI8dDspUnImJlJyW0RyXS5ydW4oKTtEcj0tMSx0PUNyLmxlbmd0aH1Scj1udWxsLFByPSExLGZ1bmN0aW9uKGUpe2lmKFRyPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKFRyPT09U3J8fCFUcikmJmNsZWFyVGltZW91dClyZXR1cm4gVHI9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7VHIoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBUci5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIFRyLmNhbGwodGhpcyxlKX19fShlKX19ZnVuY3Rpb24gVXIoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1Vci5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07dmFyIE1yPW10LnBlcmZvcm1hbmNlfHx7fSxMcj0oTXIubm93fHxNci5tb3pOb3d8fE1yLm1zTm93fHxNci5vTm93fHxNci53ZWJraXROb3csbmV3IERhdGUsZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdFtyLTFdPWFyZ3VtZW50c1tyXTtDci5wdXNoKG5ldyBVcihlLHQpKSwxIT09Q3IubGVuZ3RofHxQcnx8RXIoSXIpfSksSHI9ZnVuY3Rpb24oZSl7aWYoZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHIpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLG4uZ2V0P246e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbcl19fSl9KSksdH0oeXIpLHFyPXl0KChmdW5jdGlvbihlLHQpe3ZhciByPUhyLkJ1ZmZlcjtmdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdfWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiByKGUsdCxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1IcjoobihIcix0KSx0LkJ1ZmZlcj1pKSxuKHIsaSksaS5mcm9tPWZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gcihlLHQsbil9LGkuYWxsb2M9ZnVuY3Rpb24oZSx0LG4pe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGk9cihlKTtyZXR1cm4gdm9pZCAwIT09dD8ic3RyaW5nIj09dHlwZW9mIG4/aS5maWxsKHQsbik6aS5maWxsKHQpOmkuZmlsbCgwKSxpfSxpLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIoZSl9LGkuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIEhyLlNsb3dCdWZmZXIoZSl9fSkpLEJyPXl0KChmdW5jdGlvbihlKXt2YXIgdD02NTUzNixyPXFyLkJ1ZmZlcixuPXZ0LmNyeXB0b3x8dnQubXNDcnlwdG87biYmbi5nZXRSYW5kb21WYWx1ZXM/ZS5leHBvcnRzPWZ1bmN0aW9uKGUsaSl7aWYoZT40Mjk0OTY3Mjk1KXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIG89ci5hbGxvY1Vuc2FmZShlKTtpZihlPjApaWYoZT50KWZvcih2YXIgcz0wO3M8ZTtzKz10KW4uZ2V0UmFuZG9tVmFsdWVzKG8uc2xpY2UocyxzK3QpKTtlbHNlIG4uZ2V0UmFuZG9tVmFsdWVzKG8pO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpP0xyKChmdW5jdGlvbigpe2kobnVsbCxvKX0pKTpvfTplLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9fSkpO2NvbnN0IGpyPW5ldyBUZXh0RW5jb2Rlcix4cj1uZXcgVGV4dERlY29kZXI7dmFyIE5yPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzKXJldHVybiBnbG9iYWxUaGlzO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZilyZXR1cm4gc2VsZjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdylyZXR1cm4gd2luZG93O3Rocm93IG5ldyBFcnJvcigidW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0Iil9KCk7Y29uc3QgS3I9ZT0+e2xldCB0PWU7cmV0dXJuIHQgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYodD14ci5kZWNvZGUodCkpLHQ9dC5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKS5yZXBsYWNlKC9ccy9nLCIiKSxuZXcgVWludDhBcnJheShOci5hdG9iKHQpLnNwbGl0KCIiKS5tYXAoKGU9PmUuY2hhckNvZGVBdCgwKSkpKX07Y2xhc3MgRnIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0dFTkVSSUMiLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9fWNsYXNzIFlyIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoZSx0PSJ1bnNwZWNpZmllZCIscj0idW5zcGVjaWZpZWQiKXtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQiLHRoaXMuY2xhaW09dCx0aGlzLnJlYXNvbj1yfX1jbGFzcyBXciBleHRlbmRzIEZye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9fWNsYXNzIHpyIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9fWNsYXNzIEpyIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXU19JTlZBTElEIn19Y2xhc3MgVnIgZXh0ZW5kcyBGcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldUX0lOVkFMSUQifX1jbGFzcyAkciBleHRlbmRzIEZye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQiLHRoaXMubWVzc2FnZT0ic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQifX1jbGFzcyBHciBleHRlbmRzIFlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1RfRVhQSVJFRCJ9fXZhciBYcj1Oci5jcnlwdG87ZnVuY3Rpb24gWnIoKXtpZighTnIuaXNTZWN1cmVDb250ZXh0JiYhTnIuY3J5cHRvLnN1YnRsZSl0aHJvdyBuZXcgRnIoIldlYiBDcnlwdG9ncmFwaHkgQVBJIGlzIGF2YWlsYWJsZSBvbmx5IGluIFNlY3VyZSBDb250ZXh0cy4gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TZWN1cml0eS9TZWN1cmVfQ29udGV4dHMiKX1jb25zdCBRcj1hc3luYyBlPT57dmFyIHQscjtjb25zdHthbGdvcml0aG06bixrZXlVc2FnZXM6aX09ZnVuY3Rpb24oZSl7bGV0IHQscjtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0Ijpzd2l0Y2goZS5hbGcpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnQ9e25hbWU6IkhNQUMiLGhhc2g6YFNIQS0ke2UuYWxnLnN1YnN0cigtMyl9YH0scj1bInNpZ24iLCJ2ZXJpZnkiXTticmVhaztjYXNlIkExMjhDQkMtSFMyNTYiOmNhc2UiQTE5MkNCQy1IUzM4NCI6Y2FzZSJBMjU2Q0JDLUhTNTEyIjp0aHJvdyBuZXcgenIoYCR7ZS5hbGd9IGtleXMgY2Fubm90IGJlIGltcG9ydGVkIGFzIENyeXB0b0tleSBpbnN0YW5jZXNgKTtjYXNlIkExMjhHQ00iOmNhc2UiQTE5MkdDTSI6Y2FzZSJBMjU2R0NNIjpjYXNlIkExMjhHQ01LVyI6Y2FzZSJBMTkyR0NNS1ciOmNhc2UiQTI1NkdDTUtXIjp0PXtuYW1lOiJBRVMtR0NNIn0scj1bImVuY3J5cHQiLCJkZWNyeXB0Il07YnJlYWs7Y2FzZSJBMTI4S1ciOmNhc2UiQTE5MktXIjpjYXNlIkEyNTZLVyI6dD17bmFtZToiQUVTLUtXIn0scj1bIndyYXBLZXkiLCJ1bndyYXBLZXkiXTticmVhaztjYXNlIlBCRVMyLUhTMjU2K0ExMjhLVyI6Y2FzZSJQQkVTMi1IUzM4NCtBMTkyS1ciOmNhc2UiUEJFUzItSFM1MTIrQTI1NktXIjp0PXtuYW1lOiJQQktERjIifSxyPVsiZGVyaXZlQml0cyJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHpyKCd1bnN1cHBvcnRlZCBvciBpbnZhbGlkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIlJTQSI6c3dpdGNoKGUuYWxnKXtjYXNlIlBTMjU2IjpjYXNlIlBTMzg0IjpjYXNlIlBTNTEyIjp0PXtuYW1lOiJSU0EtUFNTIixoYXNoOmBTSEEtJHtlLmFsZy5zdWJzdHIoLTMpfWB9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6dD17bmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUiLGhhc2g6YFNIQS0ke2UuYWxnLnN1YnN0cigtMyl9YH0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTQS1PQUVQIjpjYXNlIlJTQS1PQUVQLTI1NiI6Y2FzZSJSU0EtT0FFUC0zODQiOmNhc2UiUlNBLU9BRVAtNTEyIjp0PXtuYW1lOiJSU0EtT0FFUCIsaGFzaDpgU0hBLSR7cGFyc2VJbnQoZS5hbGcuc3Vic3RyKC0zKSwxMCl8fDF9YH0scj1lLmQ/WyJkZWNyeXB0IiwidW53cmFwS2V5Il06WyJlbmNyeXB0Iiwid3JhcEtleSJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHpyKCd1bnN1cHBvcnRlZCBvciBpbnZhbGlkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIkVDIjpzd2l0Y2goZS5hbGcpe2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOmUuY3J2fSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRUNESC1FUyI6Y2FzZSJFQ0RILUVTK0ExMjhLVyI6Y2FzZSJFQ0RILUVTK0ExOTJLVyI6Y2FzZSJFQ0RILUVTK0EyNTZLVyI6dD17bmFtZToiRUNESCIsbmFtZWRDdXJ2ZTplLmNydn0scj1lLmQ/WyJkZXJpdmVCaXRzIl06W107YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgenIoJ3Vuc3VwcG9ydGVkIG9yIGludmFsaWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHpyKCd1bnN1cHBvcnRlZCBvciBpbnZhbGlkIEpXSyAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfXJldHVybnthbGdvcml0aG06dCxrZXlVc2FnZXM6cn19KGUpO2xldCBvPSJqd2siLHM9ey4uLmV9O3JldHVybiBkZWxldGUgcy5hbGcsIlBCS0RGMiI9PT1uLm5hbWUmJihvPSJyYXciLHM9S3IoZS5rKSksWnIoKSxYci5zdWJ0bGUuaW1wb3J0S2V5KG8scyxuLG51bGwhPT0odD1lLmV4dCkmJnZvaWQgMCE9PXQmJnQsbnVsbCE9PShyPWUua2V5X29wcykmJnZvaWQgMCE9PXI/cjppKX07ZnVuY3Rpb24gZW4oZSl7cmV0dXJuISFlJiZlLmNvbnN0cnVjdG9yPT09T2JqZWN0fWFzeW5jIGZ1bmN0aW9uIHRuKGUsdCxyKXtpZighZW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSldLIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodHx8KHQ9ZS5hbGcpLCJzdHJpbmciIT10eXBlb2YgdHx8IXQpdGhyb3cgbmV3IFR5cGVFcnJvcignImFsZyIgYXJndW1lbnQgaXMgcmVxdWlyZWQgd2hlbiAiandrLmFsZyIgaXMgbm90IHByZXNlbnQnKTtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0IjppZigic3RyaW5nIiE9dHlwZW9mIGUua3x8IWUuayl0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nICJrIiAoS2V5IFZhbHVlKSBQYXJhbWV0ZXIgdmFsdWUnKTtyZXR1cm4gbnVsbCE9cnx8KHI9ITAhPT1lLmV4dCkscj9Rcih7Li4uZSxhbGc6dCxleHQ6ITF9KTpLcihlLmspO2Nhc2UiUlNBIjppZih2b2lkIDAhPT1lLm90aCl0aHJvdyBuZXcgenIoJ1JTQSBKV0sgIm90aCIgKE90aGVyIFByaW1lcyBJbmZvKSBQYXJhbWV0ZXIgdmFsdWUgaXMgdW5zdXBwb3J0ZWQnKTtjYXNlIkVDIjpjYXNlIk9LUCI6cmV0dXJuIFFyKHsuLi5lLGFsZzp0fSk7ZGVmYXVsdDp0aHJvdyBuZXcgenIoJ3Vuc3VwcG9ydGVkICJrdHkiIChLZXkgVHlwZSkgUGFyYW1ldGVyIHZhbHVlJyl9fWNvbnN0IHJuPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHZvaWQgMCE9PW4uY3JpdCYmdm9pZCAwPT09ci5jcml0KXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZCcpO2lmKCFyfHx2b2lkIDA9PT1yLmNyaXQpcmV0dXJuIG5ldyBTZXQ7aWYoIUFycmF5LmlzQXJyYXkoci5jcml0KXx8MD09PXIuY3JpdC5sZW5ndGh8fHIuY3JpdC5zb21lKChlPT4ic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aCkpKXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgYW4gYXJyYXkgb2Ygbm9uLWVtcHR5IHN0cmluZ3Mgd2hlbiBwcmVzZW50Jyk7Zm9yKGNvbnN0IGkgb2Ygci5jcml0KXtpZighdC5oYXMoaSkpdGhyb3cgbmV3IHpyKGBFeHRlbnNpb24gSGVhZGVyIFBhcmFtZXRlciAiJHtpfSIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uYCk7aWYodm9pZCAwPT09bltpXSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7aX0iIGlzIG1pc3NpbmdgKTtpZih0LmdldChpKSYmdm9pZCAwPT09cltpXSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7aX0iIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZGApfXJldHVybiBuZXcgU2V0KHIuY3JpdCl9LmJpbmQodm9pZCAwLEpyLG5ldyBNYXAoW1siYjY0IiwhMF1dKSksbm49KChlLHQpPT57aWYodm9pZCAwIT09dCYmKCFBcnJheS5pc0FycmF5KHQpfHx0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZSkpKSl0aHJvdyBuZXcgVHlwZUVycm9yKGAiJHtlfSIgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nc2ApO2lmKHQpcmV0dXJuIG5ldyBTZXQodCl9KS5iaW5kKHZvaWQgMCwiYWxnb3JpdGhtcyIpO2FzeW5jIGZ1bmN0aW9uIG9uKGUsdCxyKXtpZighZW4oZSkpdGhyb3cgbmV3IEpyKCJGbGF0dGVuZWQgSldTIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodm9pZCAwPT09ZS5wcm90ZWN0ZWQmJnZvaWQgMD09PWUuaGVhZGVyKXRocm93IG5ldyBKcignRmxhdHRlbmVkIEpXUyBtdXN0IGhhdmUgZWl0aGVyIG9mIHRoZSAicHJvdGVjdGVkIiBvciAiaGVhZGVyIiBtZW1iZXJzJyk7aWYodm9pZCAwIT09ZS5wcm90ZWN0ZWQmJiJzdHJpbmciIT10eXBlb2YgZS5wcm90ZWN0ZWQpdGhyb3cgbmV3IEpyKCJKV1MgUHJvdGVjdGVkIEhlYWRlciBpbmNvcnJlY3QgdHlwZSIpO2lmKHZvaWQgMD09PWUucGF5bG9hZCl0aHJvdyBuZXcgSnIoIkpXUyBQYXlsb2FkIG1pc3NpbmciKTtpZigic3RyaW5nIiE9dHlwZW9mIGUuc2lnbmF0dXJlKXRocm93IG5ldyBKcigiSldTIFNpZ25hdHVyZSBtaXNzaW5nIG9yIGluY29ycmVjdCB0eXBlIik7aWYodm9pZCAwIT09ZS5oZWFkZXImJiFlbihlLmhlYWRlcikpdGhyb3cgbmV3IEpyKCJKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7bGV0IG49e307aWYoZS5wcm90ZWN0ZWQpe2NvbnN0IHQ9S3IoZS5wcm90ZWN0ZWQpO249SlNPTi5wYXJzZSh4ci5kZWNvZGUodCkpfWlmKCEoKC4uLmUpPT57Y29uc3QgdD1lLmZpbHRlcihCb29sZWFuKTtpZigwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aClyZXR1cm4hMDtsZXQgcjtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PU9iamVjdC5rZXlzKGUpO2lmKHImJjAhPT1yLnNpemUpZm9yKGNvbnN0IGUgb2YgdCl7aWYoci5oYXMoZSkpcmV0dXJuITE7ci5hZGQoZSl9ZWxzZSByPW5ldyBTZXQodCl9cmV0dXJuITB9KShuLGUuaGVhZGVyKSl0aHJvdyBuZXcgSnIoIkpXUyBQcm90ZWN0ZWQgYW5kIEpXUyBVbnByb3RlY3RlZCBIZWFkZXIgUGFyYW1ldGVyIG5hbWVzIG11c3QgYmUgZGlzam9pbnQiKTtjb25zdCBpPXsuLi5uLC4uLmUuaGVhZGVyfTtsZXQgbz0hMDtpZihybihuLGkpLmhhcygiYjY0IikmJihvPW4uYjY0LCJib29sZWFuIiE9dHlwZW9mIG8pKXRocm93IG5ldyBKcignVGhlICJiNjQiIChiYXNlNjR1cmwtZW5jb2RlIHBheWxvYWQpIEhlYWRlciBQYXJhbWV0ZXIgbXVzdCBiZSBhIGJvb2xlYW4nKTtjb25zdHthbGc6c309aTtpZigic3RyaW5nIiE9dHlwZW9mIHN8fCFzKXRocm93IG5ldyBKcignSldTICJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbWlzc2luZyBvciBpbnZhbGlkJyk7Y29uc3QgYT1yJiZubihyLmFsZ29yaXRobXMpO2lmKGEmJiFhLmhhcyhzKSl0aHJvdyBuZXcgV3IoJyJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbm90IGFsbG93ZWQnKTtpZihvKXtpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCl0aHJvdyBuZXcgSnIoIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmciKX1lbHNlIGlmKCJzdHJpbmciIT10eXBlb2YgZS5wYXlsb2FkJiYhKGUucGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXRocm93IG5ldyBKcigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBVaW50OEFycmF5IGluc3RhbmNlIik7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWF3YWl0IHQobixlKSksKChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8ZS5tYXRjaCgvXkFcZHszfSg/OkdDTSlLVyQvKSl7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCJzZWNyZXQiPT09dC50eXBlKXJldHVybjt0aHJvdyBuZXcgVHlwZUVycm9yKCdDcnlwdG9LZXkgb3IgS2V5T2JqZWN0IGluc3RhbmNlcyBmb3Igc3ltbWV0cmljIGFsZ29yaXRobXMgbXVzdCBiZSBvZiB0eXBlICJzZWNyZXQiJyl9aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IG9yIEtleU9iamVjdCBpbnN0YW5jZXMgbXVzdCBiZSB1c2VkIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobXMiKTtpZigic2VjcmV0Ij09PXQudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDcnlwdG9LZXkgb3IgS2V5T2JqZWN0IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3Qgbm90IGJlIG9mIHR5cGUgInNlY3JldCInKX0pKHMsdCk7Y29uc3QgdT1mdW5jdGlvbiguLi5lKXtjb25zdCB0PWUucmVkdWNlKCgoZSx7bGVuZ3RoOnR9KT0+ZSt0KSwwKSxyPW5ldyBVaW50OEFycmF5KHQpO2xldCBuPTA7cmV0dXJuIGUuZm9yRWFjaCgoZT0+e3Iuc2V0KGUsbiksbis9ZS5sZW5ndGh9KSkscn0oanIuZW5jb2RlKGUucHJvdGVjdGVkfHwiIiksanIuZW5jb2RlKCIuIiksInN0cmluZyI9PXR5cGVvZiBlLnBheWxvYWQ/anIuZW5jb2RlKGUucGF5bG9hZCk6ZS5wYXlsb2FkKSxjPUtyKGUuc2lnbmF0dXJlKTtpZighYXdhaXQoYXN5bmMoZSx0LHIsbik9PntsZXQgaTtpZihacigpLHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtpZighZS5zdGFydHNXaXRoKCJIUyIpKXRocm93IG5ldyBUeXBlRXJyb3IoInN5bW1ldHJpYyBrZXlzIGFyZSBvbmx5IGFwcGxpY2FibGUgZm9yIEhNQUMtYmFzZWQgYWxnb3JpdGhtcyIpO2k9YXdhaXQgWHIuc3VidGxlLmltcG9ydEtleSgicmF3Iix0LHtoYXNoOmBTSEEtJHtlLnN1YnN0cigtMyl9YCxuYW1lOiJITUFDIn0sITEsWyJ2ZXJpZnkiXSl9ZWxzZSBpPXQ7cmV0dXJuKChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJIUyIpKXtjb25zdCByPXBhcnNlSW50KGUuc3Vic3RyKC0zKSwxMCkse2xlbmd0aDpufT10LmFsZ29yaXRobTtpZigibnVtYmVyIiE9dHlwZW9mIG58fG48cil0aHJvdyBuZXcgVHlwZUVycm9yKGAke2V9IHJlcXVpcmVzIHN5bW1ldHJpYyBrZXlzIHRvIGJlICR7cn0gYml0cyBvciBsYXJnZXJgKX1pZihlLnN0YXJ0c1dpdGgoIlJTIil8fGUuc3RhcnRzV2l0aCgiUFMiKSl7Y29uc3R7bW9kdWx1c0xlbmd0aDpyfT10LmFsZ29yaXRobTtpZigibnVtYmVyIiE9dHlwZW9mIHJ8fHI8MjA0OCl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2V9IHJlcXVpcmVzIGtleSBtb2R1bHVzTGVuZ3RoIHRvIGJlIDIwNDggYml0cyBvciBsYXJnZXJgKX19KShlLGkpLFhyLnN1YnRsZS52ZXJpZnkoZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiSFMyNTYiOnJldHVybntoYXNoOiJTSEEtMjU2IixuYW1lOiJITUFDIn07Y2FzZSJIUzM4NCI6cmV0dXJue2hhc2g6IlNIQS0zODQiLG5hbWU6IkhNQUMifTtjYXNlIkhTNTEyIjpyZXR1cm57aGFzaDoiU0hBLTUxMiIsbmFtZToiSE1BQyJ9O2Nhc2UiUFMyNTYiOnJldHVybntoYXNoOiJTSEEtMjU2IixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOjMyfTtjYXNlIlBTMzg0IjpyZXR1cm57aGFzaDoiU0hBLTM4NCIsbmFtZToiUlNBLVBTUyIsc2FsdExlbmd0aDo0OH07Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6IlNIQS01MTIiLG5hbWU6IlJTQS1QU1MiLHNhbHRMZW5ndGg6NjR9O2Nhc2UiUlMyNTYiOnJldHVybntoYXNoOiJTSEEtMjU2IixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiUlMzODQiOnJldHVybntoYXNoOiJTSEEtMzg0IixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiUlM1MTIiOnJldHVybntoYXNoOiJTSEEtNTEyIixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiRVMyNTYiOnJldHVybntoYXNoOiJTSEEtMjU2IixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0yNTYifTtjYXNlIkVTMzg0IjpyZXR1cm57aGFzaDoiU0hBLTM4NCIsbmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMzg0In07Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6IlNIQS01MTIiLG5hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTUyMSJ9O2RlZmF1bHQ6dGhyb3cgbmV3IHpyKGBhbGcgJHtlfSBpcyB1bnN1cHBvcnRlZCBlaXRoZXIgYnkgSk9TRSBvciB5b3VyIGphdmFzY3JpcHQgcnVudGltZWApfX0oZSksaSxyLG4pfSkocyx0LGMsdSkpdGhyb3cgbmV3ICRyO2xldCBoO2g9bz9LcihlLnBheWxvYWQpOiJzdHJpbmciPT10eXBlb2YgZS5wYXlsb2FkP2pyLmVuY29kZShlLnBheWxvYWQpOmUucGF5bG9hZDtjb25zdCBsPXtwYXlsb2FkOmh9O3JldHVybiB2b2lkIDAhPT1lLnByb3RlY3RlZCYmKGwucHJvdGVjdGVkSGVhZGVyPW4pLHZvaWQgMCE9PWUuaGVhZGVyJiYobC51bnByb3RlY3RlZEhlYWRlcj1lLmhlYWRlciksbH1jb25zdCBzbj0vXihcZCt8XGQrXC5cZCspID8oc2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KSQvaTt2YXIgYW49ZT0+e2NvbnN0IHQ9c24uZXhlYyhlKTtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHRpbWUgcGVyaW9kIGZvcm1hdCIpO2NvbnN0IHI9cGFyc2VGbG9hdCh0WzFdKTtzd2l0Y2godFsyXS50b0xvd2VyQ2FzZSgpKXtjYXNlInNlYyI6Y2FzZSJzZWNzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNvbmRzIjpjYXNlInMiOnJldHVybiBNYXRoLnJvdW5kKHIpO2Nhc2UibWludXRlIjpjYXNlIm1pbnV0ZXMiOmNhc2UibWluIjpjYXNlIm1pbnMiOmNhc2UibSI6cmV0dXJuIE1hdGgucm91bmQoNjAqcik7Y2FzZSJob3VyIjpjYXNlImhvdXJzIjpjYXNlImhyIjpjYXNlImhycyI6Y2FzZSJoIjpyZXR1cm4gTWF0aC5yb3VuZCgzNjAwKnIpO2Nhc2UiZGF5IjpjYXNlImRheXMiOmNhc2UiZCI6cmV0dXJuIE1hdGgucm91bmQoODY0MDAqcik7Y2FzZSJ3ZWVrIjpjYXNlIndlZWtzIjpjYXNlInciOnJldHVybiBNYXRoLnJvdW5kKDYwNDgwMCpyKTtkZWZhdWx0OnJldHVybiBNYXRoLnJvdW5kKDMxNTU3NjAwKnIpfX07Y29uc3QgdW49ZT0+ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15hcHBsaWNhdGlvblwvLywiIik7dmFyIGNuPShlLHQscj17fSk9Pntjb25zdHt0eXA6bn09cjtpZihuJiYoInN0cmluZyIhPXR5cGVvZiBlLnR5cHx8dW4oZS50eXApIT09dW4obikpKXRocm93IG5ldyBZcigndW5leHBlY3RlZCAidHlwIiBKV1QgaGVhZGVyIHZhbHVlJywidHlwIiwiY2hlY2tfZmFpbGVkIik7bGV0IGk7dHJ5e2k9SlNPTi5wYXJzZSh4ci5kZWNvZGUodCkpfWNhdGNoKGUpe31pZigib2JqZWN0IiE9dHlwZW9mIGl8fCFpfHxBcnJheS5pc0FycmF5KGkpKXRocm93IG5ldyBWcigiSldUIENsYWltcyBTZXQgbXVzdCBiZSBhIHRvcC1sZXZlbCBKU09OIG9iamVjdCIpO2NvbnN0e2lzc3VlcjpvfT1yO2lmKG8mJiEoInN0cmluZyI9PXR5cGVvZiBvP1tvXTpvKS5pbmNsdWRlcyhpLmlzcykpdGhyb3cgbmV3IFlyKCd1bmV4cGVjdGVkICJpc3MiIGNsYWltIHZhbHVlJywiaXNzIiwiY2hlY2tfZmFpbGVkIik7Y29uc3R7c3ViamVjdDpzfT1yO2lmKHMmJmkuc3ViIT09cyl0aHJvdyBuZXcgWXIoJ3VuZXhwZWN0ZWQgInN1YiIgY2xhaW0gdmFsdWUnLCJzdWIiLCJjaGVja19mYWlsZWQiKTtjb25zdHthdWRpZW5jZTphfT1yO2lmKGEmJihjPSJzdHJpbmciPT10eXBlb2YgYT9bYV06YSwhKCJzdHJpbmciPT10eXBlb2YodT1pLmF1ZCk/Yy5pbmNsdWRlcyh1KTpjLnNvbWUoU2V0LnByb3RvdHlwZS5oYXMuYmluZChuZXcgU2V0KHUpKSkpKSl0aHJvdyBuZXcgWXIoJ3VuZXhwZWN0ZWQgImF1ZCIgY2xhaW0gdmFsdWUnLCJhdWQiLCJjaGVja19mYWlsZWQiKTt2YXIgdSxjO2xldCBoO3N3aXRjaCh0eXBlb2Ygci5jbG9ja1RvbGVyYW5jZSl7Y2FzZSJzdHJpbmciOmg9YW4oci5jbG9ja1RvbGVyYW5jZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmg9ci5jbG9ja1RvbGVyYW5jZTticmVhaztjYXNlInVuZGVmaW5lZCI6aD0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBjbG9ja1RvbGVyYW5jZSBvcHRpb24gdHlwZSIpfWNvbnN0e2N1cnJlbnREYXRlOmx9PXIsZj0oZD1sfHxuZXcgRGF0ZSxNYXRoLmZsb29yKGQuZ2V0VGltZSgpLzFlMykpO3ZhciBkO2lmKHZvaWQgMCE9PWkuaWF0fHxyLm1heFRva2VuQWdlKXtpZigibnVtYmVyIiE9dHlwZW9mIGkuaWF0KXRocm93IG5ldyBZcignImlhdCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImlhdCIsImludmFsaWQiKTtpZih2b2lkIDA9PT1pLmV4cCYmaS5pYXQ+ZitoKXRocm93IG5ldyBZcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAoaXQgc2hvdWxkIGJlIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpfWlmKHZvaWQgMCE9PWkubmJmKXtpZigibnVtYmVyIiE9dHlwZW9mIGkubmJmKXRocm93IG5ldyBZcignIm5iZiIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsIm5iZiIsImludmFsaWQiKTtpZihpLm5iZj5mK2gpdGhyb3cgbmV3IFlyKCcibmJmIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywibmJmIiwiY2hlY2tfZmFpbGVkIil9aWYodm9pZCAwIT09aS5leHApe2lmKCJudW1iZXIiIT10eXBlb2YgaS5leHApdGhyb3cgbmV3IFlyKCciZXhwIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiZXhwIiwiaW52YWxpZCIpO2lmKGkuZXhwPD1mLWgpdGhyb3cgbmV3IEdyKCciZXhwIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywiZXhwIiwiY2hlY2tfZmFpbGVkIil9aWYoci5tYXhUb2tlbkFnZSl7Y29uc3QgZT1mLWkuaWF0O2lmKGUtaD4oIm51bWJlciI9PXR5cGVvZiByLm1heFRva2VuQWdlP3IubWF4VG9rZW5BZ2U6YW4oci5tYXhUb2tlbkFnZSkpKXRocm93IG5ldyBHcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAodG9vIGZhciBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKTtpZihlPDAtaCl0aHJvdyBuZXcgWXIoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKGl0IHNob3VsZCBiZSBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKX1yZXR1cm4gaX07Y2xhc3MgaG57Y29uc3RydWN0b3IoKXt9c3RhdGljIGJhc2U2NFVSTEVuY29kZShlKXtyZXR1cm4gYnIuZW5jb2RlKGUpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPS9nLCIiKX1zdGF0aWMgZ2V0Q29kZVZlcmlmaWVyKCl7cmV0dXJuIHRoaXMuYmFzZTY0VVJMRW5jb2RlKEJyKDMyKSl9c3RhdGljIGdldENvZGVDaGFsbGVuZ2UoZSl7cmV0dXJuIHRoaXMuYmFzZTY0VVJMRW5jb2RlKG5ldyBnKF9yKChuZXcgVGV4dEVuY29kZXIpLmVuY29kZShlKSkpKX1zdGF0aWMgZ2V0U3VwcG9ydGVkU2lnbmF0dXJlQWxnb3JpdGhtcygpe3JldHVyblsiUlMyNTYiLCJSUzUxMiIsIlJTMzg0IiwiUFMyNTYiXX1zdGF0aWMgZ2V0SldLRm9yVGhlSWRUb2tlbihlLHQpe2NvbnN0IHI9SlNPTi5wYXJzZShici5kZWNvZGUoZSwidXRmOCIpKTtmb3IoY29uc3QgZSBvZiB0KWlmKHIua2lkPT09ZS5raWQpcmV0dXJuIHRuKHthbGc6ZS5hbGcsZTplLmUsa3R5OmUua3R5LG46ZS5ufSk7cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQ1JZUFRPX1VUSUwtR1RGVElULUlWMDEiLCJjcnlwdG8tdXRpbHMiLCJnZXRKV0tGb3JUaGVJZFRva2VuIiwia2lkIG5vdCBmb3VuZC4iLCJGYWlsZWQgdG8gZmluZCB0aGUgJ2tpZCcgc3BlY2lmaWVkIGluIHRoZSBpZF90b2tlbi4gJ2tpZCcgZm91bmQgaW4gdGhlIGhlYWRlciA6ICIrci5raWQrIiwgRXhwZWN0ZWQgdmFsdWVzOiAiK3QubWFwKChlPT5lLmtpZCkpLmpvaW4oIiwgIikpKX1zdGF0aWMgaXNWYWxpZElkVG9rZW4oZSx0LHIsbixpLG8pe3JldHVybiBhc3luYyBmdW5jdGlvbihlLHQscil7Y29uc3Qgbj1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQscil7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJihlPXhyLmRlY29kZShlKSksInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBKcigiQ29tcGFjdCBKV1MgbXVzdCBiZSBhIHN0cmluZyBvciBVaW50OEFycmF5Iik7Y29uc3R7MDpuLDE6aSwyOm8sbGVuZ3RoOnN9PWUuc3BsaXQoIi4iKTtpZigzIT09cyl0aHJvdyBuZXcgSnIoIkludmFsaWQgQ29tcGFjdCBKV1MiKTtjb25zdCBhPWF3YWl0IG9uKHtwYXlsb2FkOml8fHZvaWQgMCxwcm90ZWN0ZWQ6bnx8dm9pZCAwLHNpZ25hdHVyZTpvfHx2b2lkIDB9LHQscik7cmV0dXJue3BheWxvYWQ6YS5wYXlsb2FkLHByb3RlY3RlZEhlYWRlcjphLnByb3RlY3RlZEhlYWRlcn19KGUsdCxyKTtyZXR1cm57cGF5bG9hZDpjbihuLnByb3RlY3RlZEhlYWRlcixuLnBheWxvYWQscikscHJvdGVjdGVkSGVhZGVyOm4ucHJvdGVjdGVkSGVhZGVyfX0oZSx0LHthbGdvcml0aG1zOnRoaXMuZ2V0U3VwcG9ydGVkU2lnbmF0dXJlQWxnb3JpdGhtcygpLGF1ZGllbmNlOnIsY2xvY2tUb2xlcmFuY2U6byxpc3N1ZXI6bixzdWJqZWN0Oml9KS50aGVuKCgoKT0+UHJvbWlzZS5yZXNvbHZlKCEwKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgcHQoIkNSWVBUT19VVElMLUlWSVQtSVYwMiIsImNyeXB0by11dGlscyIsImlzVmFsaWRJZFRva2VuIiwiVmFsaWRhdGluZyBJRCB0b2tlbiBmYWlsZWQiLGUpKSkpfXN0YXRpYyBkZWNvZGVJRFRva2VuKGUpe3RyeXtjb25zdCB0PWJyLmRlY29kZShlLnNwbGl0KCIuIilbMV0sInV0ZjgiKTtyZXR1cm4gSlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgcHQoIkNSWVBUT19VVElMLURJVC1JVjAxIiwiY3J5cHRvLXV0aWxzIiwiZGVjb2RlSURUb2tlbiIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19Y2xhc3MgbG57Y29uc3RydWN0b3IoKXt9c3RhdGljIGdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhlKXt2YXIgdCxyLG47Y29uc3QgaT1obi5kZWNvZGVJRFRva2VuKGUpLG89dGhpcy5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQoaSkscz10aGlzLmV4dHJhY3RVc2VyTmFtZShpKSxhPW51bGwhPT0odD1pLmdpdmVuX25hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsdT1udWxsIT09KHI9aS5mYW1pbHlfbmFtZSkmJnZvaWQgMCE9PXI/cjoiIixjPWEmJnU/YCR7YX0gJHt1fWA6YXx8dXx8IiIsaD1udWxsIT09KG49aS5wcmVmZXJyZWRfdXNlcm5hbWUpJiZ2b2lkIDAhPT1uP246YztyZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGlzcGxheU5hbWU6aCx0ZW5hbnREb21haW46byx1c2VybmFtZTpzfSx0aGlzLmZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZChpKSl9c3RhdGljIGZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZChlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7bnVsbD09dHx8ZGVsZXRlIHQuaXNzLG51bGw9PXR8fGRlbGV0ZSB0LnN1YixudWxsPT10fHxkZWxldGUgdC5hdWQsbnVsbD09dHx8ZGVsZXRlIHQuZXhwLG51bGw9PXR8fGRlbGV0ZSB0LmlhdCxudWxsPT10fHxkZWxldGUgdC5hY3IsbnVsbD09dHx8ZGVsZXRlIHQuYW1yLG51bGw9PXR8fGRlbGV0ZSB0LmF6cCxudWxsPT10fHxkZWxldGUgdC5hdXRoX3RpbWUsbnVsbD09dHx8ZGVsZXRlIHQubm9uY2UsbnVsbD09dHx8ZGVsZXRlIHQuY19oYXNoLG51bGw9PXR8fGRlbGV0ZSB0LmF0X2hhc2gsbnVsbD09dHx8ZGVsZXRlIHQubmJmLG51bGw9PXR8fGRlbGV0ZSB0LmlzayxudWxsPT10fHxkZWxldGUgdC5zaWQ7Y29uc3Qgcj17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFtlLHRdKT0+e2NvbnN0IG49ZS5zcGxpdCgiXyIpLm1hcCgoKGUsdCk9PjA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKSwuLi5lLnNsaWNlKDEpXS5qb2luKCIiKSkpLmpvaW4oIiIpO3Jbbl09dH0pKSxyfXN0YXRpYyBnZXRUb2tlblJlcXVlc3RIZWFkZXJzKCl7cmV0dXJue0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9fX1sbi5leHRyYWN0VXNlck5hbWU9KGUsdD0iQCIpPT57Y29uc3Qgcj1lLnN1Yi5zcGxpdCh0KTtyZXR1cm4gci5sZW5ndGg+MiYmci5wb3AoKSxyLmpvaW4odCl9LGxuLmdldFRlbmFudERvbWFpbkZyb21JZFRva2VuUGF5bG9hZD0oZSx0PSJAIik9Pntjb25zdCByPWUuc3ViLnNwbGl0KHQpO3JldHVybiByLmxlbmd0aD4yP3Jbci5sZW5ndGgtMV06IiJ9O2NsYXNzIGZue2NvbnN0cnVjdG9yKGUpe3RoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCl9KSl9cmVzb2x2ZVdlbGxLbm93bkVuZHBvaW50KCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9jb25maWcoKTtyZXR1cm4gZS53ZWxsS25vd25FbmRwb2ludD9lLnNlcnZlck9yaWdpbitlLndlbGxLbm93bkVuZHBvaW50OmUuc2VydmVyT3JpZ2luKyIvb2F1dGgyL3Rva2VuLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0pKX1yZXNvbHZlRW5kcG9pbnRzKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9e30scj15aWVsZCB0aGlzLl9jb25maWcoKTtyZXR1cm4gci5vdmVycmlkZVdlbGxFbmRwb2ludENvbmZpZyYmci5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHIuZW5kcG9pbnRzKS5mb3JFYWNoKChlPT57Y29uc3Qgbj1lLnJlcGxhY2UoL1tBLVpdL2csKGU9PmBfJHtlLnRvTG93ZXJDYXNlKCl9YCkpO3Rbbl09KG51bGw9PXI/dm9pZCAwOnIuZW5kcG9pbnRzKT9yLmVuZHBvaW50c1tlXToiIn0pKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSksdCl9KSl9cmVzb2x2ZUZhbGxiYWNrRW5kcG9pbnRzKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpO3QuZW5kcG9pbnRzJiZPYmplY3Qua2V5cyh0LmVuZHBvaW50cykuZm9yRWFjaCgocj0+e2NvbnN0IG49ci5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTtlW25dPShudWxsPT10P3ZvaWQgMDp0LmVuZHBvaW50cyk/dC5lbmRwb2ludHNbcl06IiJ9KSk7Y29uc3Qgcj17YXV0aG9yaXphdGlvbl9lbmRwb2ludDp0LnNlcnZlck9yaWdpbisiL29hdXRoMi9hdXRob3JpemUiLGVuZF9zZXNzaW9uX2VuZHBvaW50OnQuc2VydmVyT3JpZ2luKyIvb2lkYy9sb2dvdXQiLGp3a3NfdXJpOnQuc2VydmVyT3JpZ2luKyIvb2F1dGgyL2p3a3MiLGNoZWNrX3Nlc3Npb25faWZyYW1lOnQuc2VydmVyT3JpZ2luKyIvb2lkYy9jaGVja3Nlc3Npb24iLHJldm9jYXRpb25fZW5kcG9pbnQ6dC5zZXJ2ZXJPcmlnaW4rIi9vYXV0aDIvcmV2b2tlIix0b2tlbl9lbmRwb2ludDp0LnNlcnZlck9yaWdpbisiL29hdXRoMi90b2tlbiJ9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkscil9KSl9dmFsaWRhdGVJZFRva2VuKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpKS5qd2tzX3VyaSxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO3JldHVybiB0JiYwIT09dC50cmltKCkubGVuZ3RoP2h0LmdldCh0LHt3aXRoQ3JlZGVudGlhbHM6bnVsbD09cj92b2lkIDA6ci5zZW5kQ29va2llc0luUmVxdWVzdHN9KS50aGVuKCh0PT5sdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKDIwMCE9PXQuc3RhdHVzKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgcHQoIkFVVEhfSEVMUEVSLVZJVC1OUjAyIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIGp3a3MgcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyByZXR1cm5lZCAiK3Quc3RhdHVzKyIgLCB3aGljaCBpcyBpbnZhbGlkLiIpKTtjb25zdCByPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5pc3N1ZXIsbj0oeWllbGQgdGhpcy5yZXNvbHZlV2VsbEtub3duRW5kcG9pbnQoKSkuc3BsaXQoIi8ud2VsbC1rbm93biIpWzBdO3JldHVybiByJiZyPT09bj9obi5nZXRKV0tGb3JUaGVJZFRva2VuKGUuc3BsaXQoIi4iKVswXSx0LmRhdGEua2V5cykudGhlbigodD0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gaG4uaXNWYWxpZElkVG9rZW4oZSx0LCh5aWVsZCB0aGlzLl9jb25maWcoKSkuY2xpZW50SUQscixsbi5nZXRBdXRoZW50aWNhdGVkVXNlckluZm8oZSkudXNlcm5hbWUsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSkudGhlbigoZT0+ZSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgcHQoIkFVVEhfSEVMUEVSLVZJVC1FUzAzIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIix2b2lkIDAsdm9pZCAwLGUpKSkpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9IRUxQRVItVklULUVTMDQiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSk6UHJvbWlzZS5yZXNvbHZlKCExKX0pKSkpLmNhdGNoKChlPT57dmFyIHQscixuO3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgZ3QoIkFVVEhfSEVMUEVSLVZJVC1OUjA1IiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIiwiUmVxdWVzdCB0byBqd2tzIGVuZHBvaW50IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZGF0YSkpfSkpOlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9IRUxQRVItVklULU5GMDEiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLCJKV0tTIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBKV0tTIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIEpXS1MgZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIikpfSkpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlKXt2YXIgdDtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgcj0ib3BlbmlkIjtjb25zdCBuPXlpZWxkIHRoaXMuX2NvbmZpZygpLGk9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7cmV0dXJuIG4uc2NvcGUmJm4uc2NvcGUubGVuZ3RoPjAmJihuLnNjb3BlLmluY2x1ZGVzKCJvcGVuaWQiKXx8bi5zY29wZS5wdXNoKCJvcGVuaWQiKSxyPW4uc2NvcGUuam9pbigiICIpKSxlLnJlcGxhY2UoInt7dG9rZW59fSIsaS5hY2Nlc3NfdG9rZW4pLnJlcGxhY2UoInt7dXNlcm5hbWV9fSIsbG4uZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKGkuaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLHIpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsbi5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PSh0PW4uY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09dD90OiIiKX0pKX1jbGVhclVzZXJTZXNzaW9uRGF0YSgpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVNlc3Npb25EYXRhKCl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT1lLnN0YXR1cylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0hFTFBFUi1IVFItTlIwMSIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLCJJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgdG9rZW4gcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgdG9rZW4gcmV0dXJuZWQgIitlLnN0YXR1cysiICwgd2hpY2ggaXMgaW52YWxpZC4iKSk7aWYoKHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW4pcmV0dXJuIHRoaXMudmFsaWRhdGVJZFRva2VuKGUuZGF0YS5pZF90b2tlbikudGhlbigodD0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih0KXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoZS5kYXRhKTtjb25zdCB0PXthY2Nlc3NUb2tlbjplLmRhdGEuYWNjZXNzX3Rva2VuLGV4cGlyZXNJbjplLmRhdGEuZXhwaXJlc19pbixpZFRva2VuOmUuZGF0YS5pZF90b2tlbixyZWZyZXNoVG9rZW46ZS5kYXRhLnJlZnJlc2hfdG9rZW4sc2NvcGU6ZS5kYXRhLnNjb3BlLHRva2VuVHlwZTplLmRhdGEudG9rZW5fdHlwZX07cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KX1yZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0hFTFBFUi1IVFItSVYwMiIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLCJUaGUgaWQgdG9rZW4gcmV0dXJuZWQgaXMgbm90IHZhbGlkLiIsIlRoZSBpZCB0b2tlbiByZXR1cm5lZCBoYXMgZmFpbGVkIHRoZSB2YWxpZGF0aW9uIGNoZWNrLiIpKX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgcHQoIkFVVEhfSEVMUEVSLUhBVC1FUzAzIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwiaGFuZGxlVG9rZW5SZXNwb25zZSIsdm9pZCAwLHZvaWQgMCxlKSkpKTt7Y29uc3QgdD17YWNjZXNzVG9rZW46ZS5kYXRhLmFjY2Vzc190b2tlbixleHBpcmVzSW46ZS5kYXRhLmV4cGlyZXNfaW4saWRUb2tlbjplLmRhdGEuaWRfdG9rZW4scmVmcmVzaFRva2VuOmUuZGF0YS5yZWZyZXNoX3Rva2VuLHNjb3BlOmUuZGF0YS5zY29wZSx0b2tlblR5cGU6ZS5kYXRhLnRva2VuX3R5cGV9O3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoZS5kYXRhKSxQcm9taXNlLnJlc29sdmUodCl9fSkpfX1jbGFzcyBkbntjb25zdHJ1Y3RvcihlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlcj1uZXcgZm4oZSksdGhpcy5fZGF0YUxheWVyPWUsdGhpcy5fY29uZmlnPSgpPT5sdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT5sdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iikscj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgcHQoIkFVVEhfQ09SRS1HQVUtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRBdXRob3JpemF0aW9uVVJMIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCBmb3VuZC4iLCJObyBhdXRob3JpemF0aW9uIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgZnJvbSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgYXV0aG9yaXphdGlvbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBuPW5ldyBVUkwodCk7bi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZXNwb25zZV90eXBlIiwiY29kZSIpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY2xpZW50X2lkIixyLmNsaWVudElEKTtsZXQgaT0ib3BlbmlkIjtpZihyLnNjb3BlJiZyLnNjb3BlLmxlbmd0aD4wJiYoci5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHIuc2NvcGUucHVzaCgib3BlbmlkIiksaT1yLnNjb3BlLmpvaW4oIiAiKSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJzY29wZSIsaSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZWRpcmVjdF91cmkiLHIuc2lnbkluUmVkaXJlY3RVUkwpLHIucmVzcG9uc2VNb2RlJiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoInJlc3BvbnNlX21vZGUiLHIucmVzcG9uc2VNb2RlKSxyLmVuYWJsZVBLQ0Upe2NvbnN0IGU9aG4uZ2V0Q29kZVZlcmlmaWVyKCksdD1obi5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiLGUpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwiUzI1NiIpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY29kZV9jaGFsbGVuZ2UiLHQpfXIucHJvbXB0JiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoInByb21wdCIsci5wcm9tcHQpO2NvbnN0IG89ZTtpZihvKWZvcihjb25zdFtlLHRdb2YgT2JqZWN0LmVudHJpZXMobykpIiIhPWUmJiIiIT10JiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0LnRvU3RyaW5nKCkpO3JldHVybiBuLnRvU3RyaW5nKCl9KSl9cmVxdWVzdEFjY2Vzc1Rva2VuKGUsdCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighcnx8MD09PXIudHJpbSgpLmxlbmd0aClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0NPUkUtUkFUMS1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RBY2Nlc3NUb2tlbiIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7dCYmKHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCkpO2NvbnN0IGk9W107aS5wdXNoKGBjbGllbnRfaWQ9JHtuLmNsaWVudElEfWApLG4uY2xpZW50U2VjcmV0JiZuLmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJmkucHVzaChgY2xpZW50X3NlY3JldD0ke24uY2xpZW50U2VjcmV0fWApO2NvbnN0IG89ZTtyZXR1cm4gaS5wdXNoKGBjb2RlPSR7b31gKSxpLnB1c2goImdyYW50X3R5cGU9YXV0aG9yaXphdGlvbl9jb2RlIiksaS5wdXNoKGByZWRpcmVjdF91cmk9JHtuLnNpZ25JblJlZGlyZWN0VVJMfWApLG4uZW5hYmxlUEtDRSYmKGkucHVzaChgY29kZV92ZXJpZmllcj0ke3lpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiKX1gKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlVGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigicGtjZV9jb2RlX3ZlcmlmaWVyIikpLGh0LnBvc3QocixpLmpvaW4oIiYiKSx7aGVhZGVyczpsbi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOm4uc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShlKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDEtRVMwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXF1ZXN0QWNjZXNzVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGd0KCJBVVRIX0NPUkUtUkFUMS1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RBY2Nlc3NUb2tlbiIsIlJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCIsIlRoZSByZXF1ZXN0IHRvIGdldCB0aGUgYWNjZXNzIHRva2VuIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsdD15aWVsZCB0aGlzLl9jb25maWcoKSxyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpO2lmKCFyLnJlZnJlc2hfdG9rZW4pcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDItTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLCJObyByZWZyZXNoIHRva2VuIGZvdW5kLiIsIlRoZXJlIHdhcyBubyByZWZyZXNoIHRva2VuIGZvdW5kLiBUaGUgaWRlbnRpdHkgc2VydmVyIGRvZXNuJ3QgcmV0dXJuIGEgcmVmcmVzaCB0b2tlbiBpZiB0aGUgcmVmcmVzaCB0b2tlbiBncmFudCBpcyBub3QgZW5hYmxlZC4iKSk7aWYoIWV8fDA9PT1lLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDItTkYwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IGZvdW5kLiIsIk5vIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgd2FzIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7Y29uc3Qgbj1bXTtyZXR1cm4gbi5wdXNoKGBjbGllbnRfaWQ9JHt0LmNsaWVudElEfWApLG4ucHVzaChgcmVmcmVzaF90b2tlbj0ke3IucmVmcmVzaF90b2tlbn1gKSxuLnB1c2goImdyYW50X3R5cGU9cmVmcmVzaF90b2tlbiIpLHQuY2xpZW50U2VjcmV0JiZ0LmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJm4ucHVzaChgY2xpZW50X3NlY3JldD0ke3QuY2xpZW50U2VjcmV0fWApLGh0LnBvc3QoZSxuLmpvaW4oIiYiKSx7aGVhZGVyczpsbi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOnQuc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShlKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDItRVMwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGd0KCJBVVRIX0NPUkUtUkFUMi1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlZnJlc2hBY2Nlc3NUb2tlbiIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsIlRoZSByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmV2b2tlQWNjZXNzVG9rZW4oKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5yZXZvY2F0aW9uX2VuZHBvaW50LHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWV8fDA9PT1lLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDMtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXZva2VBY2Nlc3NUb2tlbiIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpKTtjb25zdCByPVtdO3JldHVybiByLnB1c2goYGNsaWVudF9pZD0ke3QuY2xpZW50SUR9YCksci5wdXNoKGB0b2tlbj0keyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSkuYWNjZXNzX3Rva2VufWApLHIucHVzaCgidG9rZW5fdHlwZV9oaW50PWFjY2Vzc190b2tlbiIpLGh0LnBvc3QoZSxyLmpvaW4oIiYiKSx7aGVhZGVyczpsbi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOnQuc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+MjAwIT09ZS5zdGF0dXM/UHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0NPUkUtUkFUMy1OUjAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHJldm9rZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIHJldHVybmVkICIrZS5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOih0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YSgpLFByb21pc2UucmVzb2x2ZShlKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGd0KCJBVVRIX0NPUkUtUkFUMy1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwiVGhlIHJlcXVlc3QgdG8gcmV2b2tlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO2xldCBuO2lmKG49ZS50b2tlbkVuZHBvaW50JiYwIT09ZS50b2tlbkVuZHBvaW50LnRyaW0oKS5sZW5ndGg/ZS50b2tlbkVuZHBvaW50OnQudG9rZW5fZW5kcG9pbnQsIW58fDA9PT1uLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJDRy1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7Y29uc3QgaT17ZGF0YTooeWllbGQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXMoZS5kYXRhKS5tYXAoKChbZSx0XSk9Pmx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXBsYWNlQ3VzdG9tR3JhbnRUZW1wbGF0ZVRhZ3ModCk7cmV0dXJuYCR7ZX09JHtyfWB9KSkpKSkpLmpvaW4oIiYiKSxoZWFkZXJzOk9iamVjdC5hc3NpZ24oe30sbG4uZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QiLHVybDpuLHdpdGhDcmVkZW50aWFsczpyLnNlbmRDb29raWVzSW5SZXF1ZXN0c307cmV0dXJuIGUuYXR0YWNoVG9rZW4mJihpLmhlYWRlcnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkuaGVhZGVycykse0F1dGhvcml6YXRpb246YEJlYXJlciAkeyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSkuYWNjZXNzX3Rva2VufWB9KSksaHQoaSkudGhlbigodD0+MjAwIT09dC5zdGF0dXM/UHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0NPUkUtUkNHLU5SMDIiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXN0b20gZ3JhbnQgcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IHJldHVybmVkICIrdC5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOmUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZSh0KS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJDRy1FUzAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsdm9pZCAwLHZvaWQgMCxlKSkpKTpQcm9taXNlLnJlc29sdmUodCkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGd0KCJBVVRIX0NPUkUtUkNHLU5SMDQiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiVGhlIGN1c3RvbSBncmFudCByZXF1ZXN0IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iLG51bGwhPT0odD1udWxsPT1lP3ZvaWQgMDplLmNvZGUpJiZ2b2lkIDAhPT10P3Q6IiIsbnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlLG51bGw9PT0ocj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09cj92b2lkIDA6ci5zdGF0dXMsbnVsbD09PShuPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmRhdGEpKX0pKX0pKX1nZXRCYXNpY1VzZXJJbmZvKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSx0PWxuLmdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhudWxsPT1lP3ZvaWQgMDplLmlkX3Rva2VuKTtsZXQgcj17YWxsb3dlZFNjb3BlczplLnNjb3BlLHNlc3Npb25TdGF0ZTplLnNlc3Npb25fc3RhdGUsdXNlcm5hbWU6dC51c2VybmFtZX07cmV0dXJuIHQuZGlzcGxheU5hbWUmJiIiIT09dC5kaXNwbGF5TmFtZXx8ZGVsZXRlIHQuZGlzcGxheU5hbWUsdC50ZW5hbnREb21haW4mJiIiIT09dC50ZW5hbnREb21haW58fGRlbGV0ZSB0LnRlbmFudERvbWFpbixyPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx0KSxyfSkpfWdldERlY29kZWRJRFRva2VuKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpLmlkX3Rva2VuO3JldHVybiBobi5kZWNvZGVJRFRva2VuKGUpfSkpfWdldElEVG9rZW4oKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpLmlkX3Rva2VufSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKCFlJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMCk7Y29uc3QgdD15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlV2VsbEtub3duRW5kcG9pbnQoKTtyZXR1cm4gaHQuZ2V0KHQpLnRoZW4oKGU9Pmx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIDIwMCE9PWUuc3RhdHVzP1Byb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLUdPUE0tTlIwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRPSURDUHJvdmlkZXJNZXRhRGF0YSIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXF1ZXN0LiIsIlRoZSByZXF1ZXN0IHNlbnQgdG8gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgdG8gZ2V0IHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCAiK2Uuc3RhdHVzKyIgLCB3aGljaCBpcyBpbnZhbGlkLiIpKTooeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldE9JRENQcm92aWRlck1ldGFEYXRhKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVFbmRwb2ludHMoZS5kYXRhKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoITApKX0pKSkpLmNhdGNoKCgoKT0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldE9JRENQcm92aWRlck1ldGFEYXRhKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVGYWxsYmFja0VuZHBvaW50cygpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSghMCl9KSkpKX0pKX1nZXRPSURDU2VydmljZUVuZHBvaW50cygpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtyZXR1cm57YXV0aG9yaXphdGlvbkVuZHBvaW50OmUuYXV0aG9yaXphdGlvbl9lbmRwb2ludCxjaGVja1Nlc3Npb25JZnJhbWU6ZS5jaGVja19zZXNzaW9uX2lmcmFtZSxlbmRTZXNzaW9uRW5kcG9pbnQ6ZS5lbmRfc2Vzc2lvbl9lbmRwb2ludCxpbnRyb3NwZWN0aW9uRW5kcG9pbnQ6ZS5pbnRyb3NwZWN0aW9uX2VuZHBvaW50LGlzc3VlcjplLmlzc3Vlcixqd2tzVXJpOmUuandrc191cmkscmVnaXN0cmF0aW9uRW5kcG9pbnQ6ZS5yZWdpc3RyYXRpb25fZW5kcG9pbnQscmV2b2NhdGlvbkVuZHBvaW50OmUucmV2b2NhdGlvbl9lbmRwb2ludCx0b2tlbkVuZHBvaW50OmUudG9rZW5fZW5kcG9pbnQsdXNlcmluZm9FbmRwb2ludDplLnVzZXJpbmZvX2VuZHBvaW50LHdlbGxLbm93bkVuZHBvaW50OnlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVXZWxsS25vd25FbmRwb2ludCgpfX0pKX1nZXRTaWduT3V0VVJMKCl7dmFyIGUsdCxyO3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49bnVsbD09PShlPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmVuZF9zZXNzaW9uX2VuZHBvaW50LGk9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIW58fDA9PT1uLnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IHB0KCJBVVRIX0NPUkUtR1NPVS1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsImdldFNpZ25PdXRVUkwiLCJTaWduLW91dCBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gc2lnbi1vdXQgZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgc2lnbi1vdXQgZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgbz1udWxsPT09KHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmlkX3Rva2VuO2lmKCFvfHwwPT09by50cmltKCkubGVuZ3RoKXRocm93IG5ldyBwdCgiQVVUSF9DT1JFLUdTT1UtTkYwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRTaWduT3V0VVJMIiwiSUQgdG9rZW4gbjB0IGZvdW5kLiIsIk5vIElEIHRva2VuIGNvdWxkIGJlIGZvdW5kLiBFaXRoZXIgdGhlIHNlc3Npb24gaW5mb3JtYXRpb24gaXMgbG9zdCBvciB5b3UgaGF2ZSBub3Qgc2lnbmVkIGluLiIpO2NvbnN0IHM9bnVsbCE9PShyPW51bGw9PWk/dm9pZCAwOmkuc2lnbk91dFJlZGlyZWN0VVJMKSYmdm9pZCAwIT09cj9yOm51bGw9PWk/dm9pZCAwOmkuc2lnbkluUmVkaXJlY3RVUkw7aWYoIXN8fDA9PT1zLnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IHB0KCJBVVRIX0NPUkUtR1NPVS1ORjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsImdldFNpZ25PdXRVUkwiLCJObyBzaWduLW91dCByZWRpcmVjdCBVUkwgZm91bmQuIiwiVGhlIHNpZ24tb3V0IHJlZGlyZWN0IFVSTCBjYW5ub3QgYmUgZm91bmQgb3IgdGhlIFVSTCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4gTm8gc2lnbi1pbiByZWRpcmVjdCBVUkwgaGFzIGJlZW4gZm91bmQgZWl0aGVyLiAiKTtyZXR1cm5gJHtufT9pZF90b2tlbl9oaW50PSR7b30mcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpPSR7c30mc3RhdGU9c2lnbl9vdXRfc3VjY2Vzc2B9KSl9c2lnbk91dCgpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5nZXRTaWduT3V0VVJMKCk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmNsZWFyVXNlclNlc3Npb25EYXRhKCksZX0pKX1nZXRBY2Nlc3NUb2tlbigpe3ZhciBlO3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KGU9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmFjY2Vzc190b2tlbn0pKX1pc0F1dGhlbnRpY2F0ZWQoKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gQm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKCkpfSkpfWdldFBLQ0VDb2RlKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiKX0pKX1zZXRQS0NFQ29kZShlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoInBrY2VfY29kZV92ZXJpZmllciIsZSl9KSl9dXBkYXRlQ29uZmlnKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpfSkpfX1jbGFzcyBwbntjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2lkPWUsdGhpcy5fc3RvcmU9dH1zZXREYXRhSW5CdWxrKGUsdCl7dmFyIHI7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgbj1udWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PXI/cjpudWxsLGk9biYmSlNPTi5wYXJzZShuKSxvPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx0KSxzPUpTT04uc3RyaW5naWZ5KG8pO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxzKX0pKX1zZXRWYWx1ZShlLHQscil7dmFyIG47cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgaT1udWxsIT09KG49eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PW4/bjpudWxsLG89aSYmSlNPTi5wYXJzZShpKSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W3RdOnJ9KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLHQpe3ZhciByO3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPW4mJkpTT04ucGFyc2Uobiksbz1PYmplY3QuYXNzaWduKHt9LGkpO2RlbGV0ZSBvW3RdO2NvbnN0IHM9SlNPTi5zdHJpbmdpZnkobyk7eWllbGQgdGhpcy5fc3RvcmUuc2V0RGF0YShlLHMpfSkpfV9yZXNvbHZlS2V5KGUpe3JldHVybmAke2V9LSR7dGhpcy5faWR9YH1zZXRDb25maWdEYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGZ0LkNvbmZpZ0RhdGEpLGUpfSkpfXNldE9JRENQcm92aWRlck1ldGFEYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGZ0Lk9JRENQcm92aWRlck1ldGFEYXRhKSxlKX0pKX1zZXRUZW1wb3JhcnlEYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGZ0LlRlbXBvcmFyeURhdGEpLGUpfSkpfXNldFNlc3Npb25EYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGZ0LlNlc3Npb25EYXRhKSxlKX0pKX1nZXRDb25maWdEYXRhKCl7dmFyIGU7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShmdC5Db25maWdEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKXt2YXIgZTtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gSlNPTi5wYXJzZShudWxsIT09KGU9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KGZ0Lk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YSgpe3ZhciBlO3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0oZT15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoZnQuVGVtcG9yYXJ5RGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfWdldFNlc3Npb25EYXRhKCl7dmFyIGU7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShmdC5TZXNzaW9uRGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoZnQuQ29uZmlnRGF0YSkpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KGZ0Lk9JRENQcm92aWRlck1ldGFEYXRhKSl9KSl9cmVtb3ZlVGVtcG9yYXJ5RGF0YSgpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShmdC5UZW1wb3JhcnlEYXRhKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoZnQuU2Vzc2lvbkRhdGEpKX0pKX1nZXRDb25maWdEYXRhUGFyYW1ldGVyKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KGZ0LkNvbmZpZ0RhdGEpKTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KVtlXX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShmdC5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoZnQuVGVtcG9yYXJ5RGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KGZ0LlNlc3Npb25EYXRhKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9c2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlLHQpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShmdC5Db25maWdEYXRhKSxlLHQpfSkpfXNldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUsdCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KGZ0Lk9JRENQcm92aWRlck1ldGFEYXRhKSxlLHQpfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSx0KXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnNldFZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoZnQuVGVtcG9yYXJ5RGF0YSksZSx0KX0pKX1zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcihlLHQpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShmdC5TZXNzaW9uRGF0YSksZSx0KX0pKX1yZW1vdmVDb25maWdEYXRhUGFyYW1ldGVyKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShmdC5Db25maWdEYXRhKSxlKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnJlbW92ZVZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoZnQuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KGZ0LlRlbXBvcmFyeURhdGEpLGUpfSkpfXJlbW92ZVNlc3Npb25EYXRhUGFyYW1ldGVyKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShmdC5TZXNzaW9uRGF0YSksZSl9KSl9fWNvbnN0IGduPXtjbGllbnRIb3N0Om9yaWdpbixjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6dXQucXVlcnksc2NvcGU6WyJvcGVuaWQiXSxzZW5kQ29va2llc0luUmVxdWVzdHM6ITAsdmFsaWRhdGVJRFRva2VuOiEwfTtjbGFzcyB2bnsKLyoqCiAgICAgICAgICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdG9yZX0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBfc3RvcmU6IFN0b3JlID0gbmV3IERhdGFTdG9yZSgpOwogICAgICAgICAqIGNvbnN0IGF1dGggPSBuZXcgQXNnYXJkZW9BdXRoQ2xpZW50PEN1c3RvbUNsaWVudENvbmZpZz4oX3N0b3JlKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqLwpjb25zdHJ1Y3RvcihlKXt2bi5faW5zdGFuY2VJRD92bi5faW5zdGFuY2VJRCs9MTp2bi5faW5zdGFuY2VJRD0wLHRoaXMuX2RhdGFMYXllcj1uZXcgcG4oYGluc3RhbmNlXyR7dm4uX2luc3RhbmNlSUR9YCxlKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmU9bmV3IGRuKHRoaXMuX2RhdGFMYXllcikKLyoqCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgU0RLIHdpdGggdGhlIGNvbmZpZyBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBdXRoQ2xpZW50Q29uZmlnPFQ+fSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICogICAgIGNsaWVudElEOiAiY2xpZW50IElEIiwKICAgICAgICAgKiAgICAgc2VydmVyT3JpZ2luOiAiaHR0cHM6Ly9sb2NhbGhvc3Q6OTQ0MyIKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLmluaXRpYWxpemUoY29uZmlnKTsKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpbml0aWFsaXplCiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi99aW5pdGlhbGl6ZShlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZ24pLGUpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge0RhdGFMYXllcn0gLSBUaGUgYERhdGFMYXllcmAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBkYXRhID0gYXV0aC5nZXREYXRhTGF5ZXIoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREYXRhTGF5ZXIKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9Ci8qKgogICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7R2V0QXV0aFVSTENvbmZpZ30gY29uZmlnIC0gKE9wdGlvbmFsKSBBIGNvbmZpZyBvYmplY3QgdG8gZm9yY2UgaW5pdGlhbGl6YXRpb24gYW5kIHBhc3MKICAgICAgICAgKiBjdXN0b20gcGF0aCBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIGZpZHAgcGFyYW1ldGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkwoKS50aGVuKCh1cmwpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBdXRob3JpemF0aW9uVVJMCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBdXRob3JpemF0aW9uVVJMKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gbnVsbD09dHx8ZGVsZXRlIHQuZm9yY2VJbml0LCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKT90aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0KTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0KSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHNlbmRzIGEgcmVxdWVzdCB0byBvYnRhaW4gdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UKICAgICAgICAgKiB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIGFuZCBvdGhlciByZWxldmFudCBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dGhvcml6YXRpb25Db2RlIC0gVGhlIGF1dGhvcml6YXRpb24gY29kZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblN0YXRlIC0gVGhlIHNlc3Npb24gc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLnJlcXVlc3RBY2Nlc3NUb2tlbihhdXRoQ29kZSwgc2Vzc2lvblN0YXRlKS50aGVuKCh0b2tlbik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codG9rZW4pOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXF1ZXN0QWNjZXNzVG9rZW4oZSx0KXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLHQpOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMSkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSx0KSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBjbGVhcnMgYWxsIGF1dGhlbnRpY2F0aW9uIGRhdGEgYW5kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHNpZ25PdXRVcmwgPSBhd2FpdCBhdXRoLnNpZ25PdXQoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNzaWduT3V0CiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9zaWduT3V0KCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zaWduT3V0KCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhpcyBkb2Vzbid0IGNsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBzaWduT3V0VXJsID0gYXdhaXQgYXV0aC5nZXRTaWduT3V0VVJMKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0U2lnbk91dFVSTAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0U2lnbk91dFVSTCgpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0U2lnbk91dFVSTCgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIE9JREMgc2VydmljZSBlbmRwb2ludHMgdGhhdCBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBgLndlbGwta25vd25gIGVuZHBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxPSURDRW5kcG9pbnRzPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBPSURDIHNlcnZpY2UgZW5kcG9pbnRzLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhdXRoLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBwYXlsb2FkIG9mIHRoZSBJRCB0b2tlbiBhbmQgcmV0dXJucyBpdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8RGVjb2RlZElEVG9rZW5QYXlsb2FkPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWNvZGVkIElEIHRva2VuIHBheWxvYWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERlY29kZWRJRFRva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXREZWNvZGVkSURUb2tlbigpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBhdXRoLmdldElEVG9rZW4oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRJRFRva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRJRFRva2VuKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRJRFRva2VuKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEJhc2ljVXNlckluZm8+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgYXV0aC5nZXRCYXNpY1VzZXJJbmZvKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mbwogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0QmFzaWNVc2VySW5mbygpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QmFzaWNVc2VySW5mbygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXZva2VzIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoaXMgbWV0aG9kIGFsc28gY2xlYXJzIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEF4aW9zUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJldHVybnMgdGhlIHJlc3BvbnNlIG9mIHRoZSByZXZva2UtYWNjZXNzLXRva2VuIHJlcXVlc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3Jldm9rZUFjY2Vzc1Rva2VuKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXZva2VBY2Nlc3NUb2tlbigpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgYWNjZXNzCiAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZWZyZXNoQWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlZnJlc2hBY2Nlc3NUb2tlbigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBY2Nlc3NUb2tlbigpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QWNjZXNzVG9rZW4oKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgY29uZmlnIHBhc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q3VzdG9tR3JhbnRDb25maWd9IGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXN0b20gZ3JhbnQgY29uZmlndXJhdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2UgfCBBeGlvc1Jlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICBhdHRhY2hUb2tlbjogZmFsc2UsCiAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgKiAgICAgICBncmFudF90eXBlOiAiYWNjb3VudF9zd2l0Y2giLAogICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICogICB9LAogICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgKiAgIHJldHVybnNTZXNzaW9uOiB0cnVlLAogICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0Q3VzdG9tR3JhbnQKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlcXVlc3RDdXN0b21HcmFudChlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RDdXN0b21HcmFudChlKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF3YWl0IGF1dGguaXNBdXRoZW50aWNhdGVkKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNBdXRoZW50aWNhdGVkCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9pc0F1dGhlbnRpY2F0ZWQoKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmlzQXV0aGVudGljYXRlZCgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBQS0NFIGNvZGUgZ2VuZXJhdGVkIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIFBLQ0UgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgcGtjZSA9IGF3YWl0IGdldFBLQ0VDb2RlKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0UEtDRUNvZGUKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFBLQ0VDb2RlKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRQS0NFQ29kZSgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBQS0NFIGNvZGUgdG8gdGhlIGRhdGEgc3RvcmUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGtjZSAtIFRoZSBQS0NFIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF3YWl0IGF1dGguc2V0UEtDRUNvZGUoInBrY2VfY29kZSIpCiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2V0UEtDRUNvZGUKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NldFBLQ0VDb2RlKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zZXRQS0NFQ29kZShlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgc2lnbi1vdXQgaXMgc3VjY2Vzc2Z1bCBvciBub3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAqCiAgICAgICAgICogKipUaGUgc2VydmVyIGFwcGVuZHMgcGF0aCBwYXJhbWV0ZXJzIHRvIHRoZSBgc2lnbk91dFJlZGlyZWN0VVJMYCBhbmQgdGhlc2UgcGF0aCBwYXJhbWV0ZXJzCiAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gYHRydWVgIGlmIHN1Y2Nlc3NmdWwsIGBmYWxzZWAgb3RoZXJ3aXNlLgogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2lzU2lnbk91dFN1Y2Nlc3NmdWwKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3N0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJiFufQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UGFydGlhbDxBdXRoQ2xpZW50Q29uZmlnPFQ+Pn0gY29uZmlnIC0gQSBjb25maWcgb2JqZWN0IHRvIHVwZGF0ZSB0aGUgU0RLIGNvbmZpZ3VyYXRpb25zIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICogICAgIGNsaWVudElEOiAiY2xpZW50IElEIiwKICAgICAgICAgKiAgICAgc2VydmVyT3JpZ2luOiAiaHR0cHM6Ly9sb2NhbGhvc3Q6OTQ0MyIKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLnVwZGF0ZUNvbmZpZyhjb25maWcpOwogICAgICAgICAqIGBgYAogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciN1cGRhdGVDb25maWcKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3VwZGF0ZUNvbmZpZyhlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfX1jbGFzcyB5biBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsdCxyLG4saSxvKXtzdXBlcihudWxsIT1uP246bnVsbD09bz92b2lkIDA6by5tZXNzYWdlKSx0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLHRoaXMuY29kZT1lLHRoaXMuZmlsZT10LHRoaXMubWV0aG9kPXIsdGhpcy5lcnJvcj1vLHRoaXMuZGVzY3JpcHRpb249aSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuZXcudGFyZ2V0LnByb3RvdHlwZSl9fWNsYXNzIG1ue2NvbnN0cnVjdG9yKGUpe3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50PWUsdGhpcy5fZGF0YUxheWVyPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERhdGFMYXllcigpfXJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7aWYodC5yZWZyZXNoX3Rva2VuKXtjb25zdCByPXBhcnNlSW50KHQuZXhwaXJlc19pbiksbj1zZXRUaW1lb3V0KCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlZnJlc2hBY2Nlc3NUb2tlbigpfSkpKSwxZTMqKHI8PTEwP3I6ci0xMCkpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGR0LEpTT04uc3RyaW5naWZ5KG4pKX19KSl9Y2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihkdCkpe2NvbnN0IGU9SlNPTi5wYXJzZSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihkdCkpO2NsZWFyVGltZW91dChlKX19KSl9fWNvbnN0IHduPSJpbml0Ijt2YXIgYm4sX24sa247IWZ1bmN0aW9uKGUpe2UuTG9jYWxTdG9yYWdlPSJsb2NhbFN0b3JhZ2UiLGUuU2Vzc2lvblN0b3JhZ2U9InNlc3Npb25TdG9yYWdlIixlLldlYldvcmtlcj0id2ViV29ya2VyIixlLkJyb3dzZXJNZW1vcnk9ImJyb3dzZXJNZW1vcnkifShibnx8KGJuPXt9KSksZnVuY3Rpb24oZSl7ZS5TaWduSW49InNpZ24taW4iLGUuU2lnbk91dD0ic2lnbi1vdXQiLGUuSW5pdGlhbGl6ZT0iaW5pdGlhbGl6ZSIsZS5IdHRwUmVxdWVzdFN0YXJ0PSJodHRwLXJlcXVlc3Qtc3RhcnQiLGUuSHR0cFJlcXVlc3RGaW5pc2g9Imh0dHAtcmVxdWVzdC1maW5pc2giLGUuSHR0cFJlcXVlc3RFcnJvcj0iaHR0cC1yZXF1ZXN0LWVycm9yIixlLkh0dHBSZXF1ZXN0U3VjY2Vzcz0iaHR0cC1yZXF1ZXN0LXN1Y2Nlc3MiLGUuUmV2b2tlQWNjZXNzVG9rZW49InJldm9rZS1hY2Nlc3MtdG9rZW4iLGUuQ3VzdG9tR3JhbnQ9ImN1c3RvbS1ncmFudCJ9KF9ufHwoX249e30pKTtsZXQgU249a249Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmF0dGFjaFRva2VuPSgpPT5Qcm9taXNlLnJlc29sdmUoKSx0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPSgpPT5udWxsLHRoaXMuaW5pdD10aGlzLmluaXQuYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjay5iaW5kKHRoaXMpfXN0YXRpYyBnZXRJbnN0YW5jZSgpe3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9aHQuY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcga24pLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5jbGllbnRJbnN0YW5jZS5yZXF1ZXN0SGFuZGxlcih0KX0pKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChlPT50aGlzLmNsaWVudEluc3RhbmNlLnN1Y2Nlc3NIYW5kbGVyKGUpKSwoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIoZSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuYWxsPWh0LmFsbCx0aGlzLmF4aW9zSW5zdGFuY2Uuc3ByZWFkPWh0LnNwcmVhZCx0aGlzLmF4aW9zSW5zdGFuY2UuaW5pdD10aGlzLmNsaWVudEluc3RhbmNlLmluaXQsdGhpcy5heGlvc0luc3RhbmNlLmVuYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5lbmFibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0PXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dCx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSx0aGlzLmF4aW9zSW5zdGFuY2V9cmVxdWVzdEhhbmRsZXIodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5hdHRhY2hUb2tlbih0KSxrbi5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayh0KSx0fSkpfWVycm9ySGFuZGxlcihlKXt0aHJvdyBrbi5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJnRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1zdWNjZXNzSGFuZGxlcihlKXtyZXR1cm4ga24uaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9aW5pdCh0PSEwLHIpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7a24uaXNIYW5kbGVyRW5hYmxlZD10LHRoaXMuYXR0YWNoVG9rZW49cn0pKX1lbmFibGVIYW5kbGVyKCl7a24uaXNIYW5kbGVyRW5hYmxlZD0hMH1kaXNhYmxlSGFuZGxlcigpe2tuLmlzSGFuZGxlckVuYWJsZWQ9ITF9ZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dChlPWtuLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQpe2tuLmlzSGFuZGxlckVuYWJsZWQ9ITEsc2V0VGltZW91dCgoKCk9Pntrbi5pc0hhbmRsZXJFbmFibGVkPSEwfSksZSl9c2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9ZX19O1NuLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLFNuPWtuPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1uP249T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpOm47aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LHIsbik7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkoaT1lW2FdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQscixzKTppKHQscikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHMpLHN9KFtlPT57fV0sU24pO2NsYXNzIEFue2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT1uZXcgTWFwfXNldERhdGEodCxyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuc2V0KHQscil9KSl9Z2V0RGF0YSh0KXt2YXIgcixuO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGwhPT0obj1udWxsPT09KHI9dGhpcy5fZGF0YSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0KHQpKSYmdm9pZCAwIT09bj9uOiJ7fSJ9KSl9cmVtb3ZlRGF0YSh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuZGVsZXRlKHQpfSkpfX1jbGFzcyBUbntjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKXtyZXR1cm57YmxvYjoobnVsbD09ZT92b2lkIDA6ZS5kYXRhKWluc3RhbmNlb2YgQmxvYj9udWxsPT1lP3ZvaWQgMDplLmRhdGE6bnVsbCxkYXRhOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMH19c3RhdGljIGdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSl7cmV0dXJuKG51bGw9PWU/dm9pZCAwOmUudG9KU09OKSYmZGVsZXRlIGUudG9KU09OLHtlcnJvcjpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHN1Y2Nlc3M6ITF9fX1jb25zdCBFbj1zZWxmO2xldCBSbjtFbi5vbm1lc3NhZ2U9KHtkYXRhOnQscG9ydHM6cn0pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgbixpLG87Y29uc3Qgcz1yWzBdO2lmKHQudHlwZT09PXdufHxSbilzd2l0Y2godC50eXBlKXtjYXNlIHduOnRyeXtjb25zdCByPU9iamVjdC5hc3NpZ24oe30sdC5kYXRhKTtSbj15aWVsZCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPW5ldyBBbixuPW5ldyB2bihyKTt5aWVsZCBuLmluaXRpYWxpemUodCk7Y29uc3QgaT1uZXcgbW4obiksbz1uLmdldERhdGFMYXllcigpLHM9U24uZ2V0SW5zdGFuY2UoKTtyZXR1cm4obnVsbD09cz92b2lkIDA6cy5pbml0KSYmKHlpZWxkIHMuaW5pdCghMCwodD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7T2JqZWN0LmFzc2lnbih7YXR0YWNoVG9rZW46ITB9LHQpLmF0dGFjaFRva2VuJiYodC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt5aWVsZCBuLmdldEFjY2Vzc1Rva2VuKCl9YH0pKX0pKSkpKSx7ZGlzYWJsZUh0dHBIYW5kbGVyOigpPT57cy5kaXNhYmxlSGFuZGxlciYmcy5kaXNhYmxlSGFuZGxlcigpfSxlbmFibGVIdHRwSGFuZGxlcjooKT0+e3MuZW5hYmxlSGFuZGxlciYmcy5lbmFibGVIYW5kbGVyKCl9LGdldEFjY2Vzc1Rva2VuOigpPT5uLmdldEFjY2Vzc1Rva2VuKCksZ2V0QXV0aG9yaXphdGlvblVSTDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbi5nZXRBdXRob3JpemF0aW9uVVJMKHQpLnRoZW4oKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybnthdXRob3JpemF0aW9uVVJMOnQscGtjZTp5aWVsZCBuLmdldFBLQ0VDb2RlKCl9fSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksZ2V0QmFzaWNVc2VySW5mbzooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG4uZ2V0QmFzaWNVc2VySW5mbygpfSkpLGdldENvbmZpZ0RhdGE6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBvLmdldENvbmZpZ0RhdGEoKX0pKSxnZXREZWNvZGVkSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG4uZ2V0RGVjb2RlZElEVG9rZW4oKX0pKSxnZXRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbi5nZXRJRFRva2VuKCl9KSksZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHM6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSksZ2V0U2lnbk91dFVSTDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIG4uZ2V0U2lnbk91dFVSTCgpfSkpLGh0dHBSZXF1ZXN0OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlLHIsaTtsZXQgYT0hMTtjb25zdCB1PXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpO2Zvcihjb25zdCBuIG9mWy4uLm51bGwhPT0ocj1udWxsPT09KGU9eWllbGQgby5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PXI/cjpbXSxudWxsPT11P3ZvaWQgMDp1LnNlcnZlck9yaWdpbl0paWYobnVsbD09PShpPW51bGw9PXQ/dm9pZCAwOnQudXJsKXx8dm9pZCAwPT09aT92b2lkIDA6aS5zdGFydHNXaXRoKG4pKXthPSEwO2JyZWFrfXJldHVybiBhP3MucmVxdWVzdCh0KS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+e3ZhciByO3JldHVybiA0MDE9PT0obnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyk/bi5yZWZyZXNoQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+cy5yZXF1ZXN0KHQpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyB5bigiV09SS0VSX0NPUkUtSFItRVMwMSIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCIiLCIiLGUpKSkpOlByb21pc2UucmVqZWN0KGUpfSkpOlByb21pc2UucmVqZWN0KG5ldyB5bigiV09SS0VSX0NPUkUtSFItSVYwMiIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKSxodHRwUmVxdWVzdEFsbDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSxyLGk7bGV0IGE9ITA7Y29uc3QgdT15aWVsZCBvLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgbiBvZiB0KXtsZXQgdD0hMTtmb3IoY29uc3QgcyBvZlsuLi5udWxsIT09KHI9bnVsbD09PShlPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1yP3I6W10sbnVsbD09dT92b2lkIDA6dS5zZXJ2ZXJPcmlnaW5dKWlmKG51bGw9PT0oaT1uLnVybCl8fHZvaWQgMD09PWk/dm9pZCAwOmkuc3RhcnRzV2l0aChzKSl7dD0hMDticmVha31pZighdCl7YT0hMTticmVha319Y29uc3QgYz1bXTtyZXR1cm4gYT8odC5mb3JFYWNoKChlPT57Yy5wdXNoKHMucmVxdWVzdChlKSl9KSksKG51bGw9PXM/dm9pZCAwOnMuYWxsKSYmcy5hbGwoYykudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKGU9Pnt2YXIgdDtyZXR1cm4gNDAxPT09KG51bGw9PT0odD1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5zdGF0dXMpP24ucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigoKCk9PnMuYWxsJiZzLmFsbChjKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgeW4oIldPUktFUl9DT1JFLUhSQS1FUzAxIiwid29ya2VyLWNvcmUiLCJodHRwUmVxdWVzdEFsbCIsIiIsIiIsZSkpKSk6UHJvbWlzZS5yZWplY3QoZSl9KSkpOlByb21pc2UucmVqZWN0KG5ldyB5bigiV09SS0VSX0NPUkUtSFJBLUlWMDIiLCJ3b3JrZXItY29yZSIsImh0dHBSZXF1ZXN0IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSksaXNBdXRoZW50aWNhdGVkOigpPT5uLmlzQXV0aGVudGljYXRlZCgpLHJlZnJlc2hBY2Nlc3NUb2tlbjooKT0+bi5yZWZyZXNoQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpLHJlcXVlc3RBY2Nlc3NUb2tlbjoodCxyLHMpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpO3JldHVybiBzJiZlLmVuYWJsZVBLQ0UmJih5aWVsZCBuLnNldFBLQ0VDb2RlKHMpKSx0P24ucmVxdWVzdEFjY2Vzc1Rva2VuKHQsbnVsbCE9cj9yOiIiKS50aGVuKCgoKT0+KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyB5bigiV09SS0VSX0NPUkUtUkFUMS1ORjAxIiwid29ya2VyLWNvcmUiLCJyZXF1ZXN0QWNjZXNzVG9rZW4iLCJObyBhdXRob3JpemF0aW9uIGNvZGUuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlIHdhcyBmb3VuZC4iKSl9KSkscmVxdWVzdEN1c3RvbUdyYW50OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciByLHMsYTtsZXQgdT0hMCxjPSExO2NvbnN0IGg9eWllbGQgby5nZXRDb25maWdEYXRhKCk7aWYobnVsbD09dD92b2lkIDA6dC50b2tlbkVuZHBvaW50KXt1PSExO2Zvcihjb25zdCBlIG9mWy4uLm51bGwhPT0ocz1udWxsPT09KHI9eWllbGQgby5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PXM/czpbXSxudWxsPT1oP3ZvaWQgMDpoLnNlcnZlck9yaWdpbl0paWYobnVsbD09PShhPXQudG9rZW5FbmRwb2ludCl8fHZvaWQgMD09PWE/dm9pZCAwOmEuc3RhcnRzV2l0aChlKSl7Yz0hMDticmVha319cmV0dXJuIHV8fGM/bi5yZXF1ZXN0Q3VzdG9tR3JhbnQodCkudGhlbigocj0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHQucmV0dXJuc1Nlc3Npb24/KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKTpyfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IHluKCJXT1JLRVJfQ09SRS1SQ0ctSVYwMSIsIndvcmtlci1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgdG9rZW4gZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSkscmV2b2tlQWNjZXNzVG9rZW46KCk9Pm4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KGkuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksUHJvbWlzZS5yZXNvbHZlKCEwKSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSxzZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s6ZT0+eyhudWxsPT1zP3ZvaWQgMDpzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaykmJnMuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrOmU9PnsobnVsbD09cz92b2lkIDA6cy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSYmcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s6ZT0+eyhudWxsPT1zP3ZvaWQgMDpzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaykmJnMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjazplPT57KG51bGw9PXM/dm9pZCAwOnMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2spJiZzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpfSxzZXRTZXNzaW9uU3RhdGU6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgby5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCl9KSksc2lnbk91dDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGkuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCkseWllbGQgbi5zaWduT3V0KCl9KSksc3RhcnRBdXRvUmVmcmVzaFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpfSkpLHVwZGF0ZUNvbmZpZzp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBuLnVwZGF0ZUNvbmZpZyh0KX0pKX19KSkpKHIpLFJuLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjayhPbiksUm4uc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhEbiksUm4uc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKENuKSxSbi5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhQbikscy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOlJuLmdldEF1dGhvcml6YXRpb25VUkwobnVsbD09dD92b2lkIDA6dC5kYXRhKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJyZXF1ZXN0X2dldF90b2tlbiI6Um4ucmVxdWVzdEFjY2Vzc1Rva2VuKG51bGw9PT0obj1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmNvZGUsbnVsbD09PShpPW51bGw9PXQ/dm9pZCAwOnQuZGF0YSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuc2Vzc2lvblN0YXRlLG51bGw9PT0obz1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnBrY2UpLnRoZW4oKGU9PntzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlImh0dHAtcmVxdWVzdCI6Um4uaHR0cFJlcXVlc3QodC5kYXRhKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJodHRwLXJlcXVlc3QtYWxsIjpSbi5odHRwUmVxdWVzdEFsbCh0LmRhdGEpLnRoZW4oKGU9PntzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInNpZ24tb3V0Ijp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLnNpZ25PdXQoKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJyZXF1ZXN0LWN1c3RvbS1ncmFudCI6Um4ucmVxdWVzdEN1c3RvbUdyYW50KHQuZGF0YSkudGhlbigoZT0+e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmV2b2tlLWFjY2Vzcy10b2tlbiI6Um4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJnZXQtb2lkYy1zZXJ2aWNlLWVuZHBvaW50cyI6dHJ5e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBSbi5nZXRPSURDU2VydmljZUVuZHBvaW50cygpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1iYXNpYy11c2VyLWluZm8iOnRyeXtzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgUm4uZ2V0QmFzaWNVc2VySW5mbygpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1kZWNvZGVkLWlkLXRva2VuIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLmdldERlY29kZWRJRFRva2VuKCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0X2lkX3Rva2VuIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLmdldElEVG9rZW4oKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJlbmFibGVfaHR0cF9oYW5kbGVyIjpSbi5lbmFibGVIdHRwSGFuZGxlcigpLHMucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKTticmVhaztjYXNlImRpc2FibGVfaHR0cF9oYW5kbGVyIjpSbi5kaXNhYmxlSHR0cEhhbmRsZXIoKSxzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLmlzQXV0aGVudGljYXRlZCgpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9zaWduX291dF91cmwiOnRyeXtzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgUm4uZ2V0U2lnbk91dFVSTCgpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlZnJlc2hfYWNjZXNzLXRva2VuIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLnJlZnJlc2hBY2Nlc3NUb2tlbigpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShSbi5zdGFydEF1dG9SZWZyZXNoVG9rZW4oKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzZXRfc2Vzc2lvbl9zdGF0ZSI6dHJ5e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBSbi5zZXRTZXNzaW9uU3RhdGUobnVsbD09dD92b2lkIDA6dC5kYXRhKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJ1cGRhdGVfY29uZmlnIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLnVwZGF0ZUNvbmZpZyhudWxsPT10P3ZvaWQgMDp0LmRhdGEpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBSbi5nZXRDb25maWdEYXRhKCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2RlZmF1bHQ6bnVsbD09c3x8cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKG5ldyB5bigiQ0xJRU5UX1dPUktFUi1PTk1TRy1JVjAyIiwiY2xpZW50LndvcmtlciIsIm9ubWVzc2FnZSIsIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZC4iLGBUaGUgbWVzc2FnZSB0eXBlIHByb3ZpZGVkLCAke3QudHlwZX0sIGlzIGludmFsaWQuYCkpKX1lbHNlIHMucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgeW4oIkNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsImNsaWVudC53b3JrZXIiLHQudHlwZSwiVGhlIHdlYiB3b3JrZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldC4iLCJUaGUgaW5pdGlhbGl6ZSBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBjYW4gYmUgY2FycmllZCBvdXQuIikpKX0pKTtjb25zdCBDbj0oKT0+e0VuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LXN0YXJ0In0pfSxQbj1lPT57RW4ucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LERuPSgpPT57RW4ucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3QtZmluaXNoIn0pfSxPbj1lPT57Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO2RlbGV0ZSB0LnRvSlNPTixFbi5wb3N0TWVzc2FnZSh7ZGF0YTpKU09OLnN0cmluZ2lmeShudWxsIT10P3Q6IiIpLHR5cGU6InJlcXVlc3QtZXJyb3IifSl9O3JldHVybnt9fSgpOwoK",null,!1,function(t){return zn=zn||function(t,l,i){var n=void 0===l?null:l,e=function(t,l){var i=atob(t);if(l){for(var n=new Uint8Array(i.length),e=0,c=i.length;e<c;++e)n[e]=i.charCodeAt(e);return String.fromCharCode.apply(null,new Uint16Array(n.buffer))}return i}(t,void 0!==i&&i),c=e.indexOf("\n",10)+1,o=e.substring(c)+(n?"//# sourceMappingURL="+n:""),d=new Blob([o],{type:"application/javascript"});return URL.createObjectURL(d)}("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gZShlLHQscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXt1KG4ubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7dShuLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiB1KGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIHI/dDpuZXcgcigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfXUoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX12YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LHI9W10sbj1bXSxpPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LG89ITE7ZnVuY3Rpb24gcygpe289ITA7Zm9yKHZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix0PTAsaT1lLmxlbmd0aDt0PGk7Kyt0KXJbdF09ZVt0XSxuW2UuY2hhckNvZGVBdCh0KV09dDtuWyItIi5jaGFyQ29kZUF0KDApXT02MixuWyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBhKGUsdCxuKXtmb3IodmFyIGksbyxzPVtdLGE9dDthPG47YSs9MylpPShlW2FdPDwxNikrKGVbYSsxXTw8OCkrZVthKzJdLHMucHVzaChyWyhvPWkpPj4xOCY2M10rcltvPj4xMiY2M10rcltvPj42JjYzXStyWzYzJm9dKTtyZXR1cm4gcy5qb2luKCIiKX1mdW5jdGlvbiB1KGUpe3ZhciB0O298fHMoKTtmb3IodmFyIG49ZS5sZW5ndGgsaT1uJTMsdT0iIixjPVtdLGg9MTYzODMsbD0wLGY9bi1pO2w8ZjtsKz1oKWMucHVzaChhKGUsbCxsK2g+Zj9mOmwraCkpO3JldHVybiAxPT09aT8odD1lW24tMV0sdSs9clt0Pj4yXSx1Kz1yW3Q8PDQmNjNdLHUrPSI9PSIpOjI9PT1pJiYodD0oZVtuLTJdPDw4KStlW24tMV0sdSs9clt0Pj4xMF0sdSs9clt0Pj40JjYzXSx1Kz1yW3Q8PDImNjNdLHUrPSI9IiksYy5wdXNoKHUpLGMuam9pbigiIil9ZnVuY3Rpb24gYyhlLHQscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1yP2ktMTowLGY9cj8tMToxLGQ9ZVt0K2xdO2ZvcihsKz1mLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPWE7aD4wO289MjU2Km8rZVt0K2xdLGwrPWYsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO3M9MjU2KnMrZVt0K2xdLGwrPWYsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihkPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09Y31yZXR1cm4oZD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiBoKGUsdCxyLG4saSxvKXt2YXIgcyxhLHUsYz04Km8taS0xLGg9KDE8PGMpLTEsbD1oPj4xLGY9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxkPW4/MDpvLTEscD1uPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9aCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSwodCs9cytsPj0xP2YvdTpmKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKHMrKyx1Lz0yKSxzK2w+PWg/KGE9MCxzPWgpOnMrbD49MT8oYT0odCp1LTEpKk1hdGgucG93KDIsaSkscys9bCk6KGE9dCpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O2VbcitkXT0yNTUmYSxkKz1wLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsYys9aTtjPjA7ZVtyK2RdPTI1NSZzLGQrPXAscy89MjU2LGMtPTgpO2VbcitkLXBdfD0xMjgqZ312YXIgbD17fS50b1N0cmluZyxmPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWwuY2FsbChlKX07ZnVuY3Rpb24gZCgpe3JldHVybiBnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHAoZSx0KXtpZihkKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gZy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Zy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgZyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBnKGUsdCxyKXtpZighKGcuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGcpKXJldHVybiBuZXcgZyhlLHQscik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBtKHRoaXMsZSl9cmV0dXJuIHYodGhpcyxlLHQscil9ZnVuY3Rpb24gdihlLHQscixuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQscixuKXtpZih0LmJ5dGVMZW5ndGgscjwwfHx0LmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQscik6bmV3IFVpbnQ4QXJyYXkodCxyLG4pO2cuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189Zy5wcm90b3R5cGU6ZT13KGUsdCk7cmV0dXJuIGV9KGUsdCxyLG4pOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIWcuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfGsodCxyKSxpPShlPXAoZSxuKSkud3JpdGUodCxyKTtpIT09biYmKGU9ZS5zbGljZSgwLGkpKTtyZXR1cm4gZX0oZSx0LHIpOmZ1bmN0aW9uKGUsdCl7aWYoXyh0KSl7dmFyIHI9MHxiKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPXAoZSxyKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsciksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KG49dC5sZW5ndGgpIT1uP3AoZSwwKTp3KGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmYodC5kYXRhKSlyZXR1cm4gdyhlLHQuZGF0YSl9dmFyIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIHkoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBtKGUsdCl7aWYoeSh0KSxlPXAoZSx0PDA/MDowfGIodCkpLCFnLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjx0OysrcillW3JdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gdyhlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfGIodC5sZW5ndGgpO2U9cChlLHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKWVbbl09MjU1JnRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gYihlKXtpZihlPj1kKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2QoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gXyhlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24gayhlLHQpe2lmKF8oZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciByPWUubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuICQoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBHKGUpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuICQoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gUyhlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBCKHRoaXMsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBNKHRoaXMsdCxyKTtjYXNlImFzY2lpIjpyZXR1cm4gSCh0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcSh0aGlzLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBVKHRoaXMsdCxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIGoodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gQShlLHQscil7dmFyIG49ZVt0XTtlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIFQoZSx0LHIsbixpKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6ZS5sZW5ndGgtMSkscjwwJiYocj1lLmxlbmd0aCtyKSxyPj1lLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPWUubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWcuZnJvbSh0LG4pKSxfKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6RShlLHQscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGcuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOkUoZSxbdF0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIEUoZSx0LHIsbixpKXt2YXIgbyxzPTEsYT1lLmxlbmd0aCx1PXQubGVuZ3RoO2lmKHZvaWQgMCE9PW4mJigidWNzMiI9PT0obj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1ufHwidXRmMTZsZSI9PT1ufHwidXRmLTE2bGUiPT09bikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsdS89MixyLz0yfWZ1bmN0aW9uIGMoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKGkpe3ZhciBoPS0xO2ZvcihvPXI7bzxhO28rKylpZihjKGUsbyk9PT1jKHQsLTE9PT1oPzA6by1oKSl7aWYoLTE9PT1oJiYoaD1vKSxvLWgrMT09PXUpcmV0dXJuIGgqc31lbHNlLTEhPT1oJiYoby09by1oKSxoPS0xfWVsc2UgZm9yKHIrdT5hJiYocj1hLXUpLG89cjtvPj0wO28tLSl7Zm9yKHZhciBsPSEwLGY9MDtmPHU7ZisrKWlmKGMoZSxvK2YpIT09Yyh0LGYpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gUihlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gQyhlLHQscixuKXtyZXR1cm4gWCgkKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFAoZSx0LHIsbil7cmV0dXJuIFgoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLHI9MDtyPGUubGVuZ3RoOysrcil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChyKSk7cmV0dXJuIHR9KHQpLGUscixuKX1mdW5jdGlvbiBEKGUsdCxyLG4pe3JldHVybiBQKGUsdCxyLG4pfWZ1bmN0aW9uIE8oZSx0LHIsbil7cmV0dXJuIFgoRyh0KSxlLHIsbil9ZnVuY3Rpb24gSShlLHQscixuKXtyZXR1cm4gWChmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFUoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP3UoZSk6dShlLnNsaWNlKHQscikpfWZ1bmN0aW9uIE0oZSx0LHIpe3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9dDtpPHI7KXt2YXIgbyxzLGEsdSxjPWVbaV0saD1udWxsLGw9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihpK2w8PXIpc3dpdGNoKGwpe2Nhc2UgMTpjPDEyOCYmKGg9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz1lW2krMV0pKSYmKHU9KDMxJmMpPDw2fDYzJm8pPjEyNyYmKGg9dSk7YnJlYWs7Y2FzZSAzOm89ZVtpKzFdLHM9ZVtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDEyfCg2MyZvKTw8Nnw2MyZzKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihoPXUpO2JyZWFrO2Nhc2UgNDpvPWVbaSsxXSxzPWVbaSsyXSxhPWVbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYodT0oMTUmYyk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZ1PDExMTQxMTImJihoPXUpfW51bGw9PT1oPyhoPTY1NTMzLGw9MSk6aD42NTUzNSYmKGgtPTY1NTM2LG4ucHVzaChoPj4+MTAmMTAyM3w1NTI5NiksaD01NjMyMHwxMDIzJmgpLG4ucHVzaChoKSxpKz1sfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1MKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgcj0iIixuPTA7Zm9yKDtuPHQ7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UobixuKz1MKSk7cmV0dXJuIHJ9KG4pfWcuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT10LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHQuVFlQRURfQVJSQVlfU1VQUE9SVCxnLnBvb2xTaXplPTgxOTIsZy5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189Zy5wcm90b3R5cGUsZX0sZy5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdihudWxsLGUsdCxyKX0sZy5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoZy5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLGcuX19wcm90b19fPVVpbnQ4QXJyYXkpLGcuYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBmdW5jdGlvbihlLHQscixuKXtyZXR1cm4geSh0KSx0PD0wP3AoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9wKGUsdCkuZmlsbChyLG4pOnAoZSx0KS5maWxsKHIpOnAoZSx0KX0obnVsbCxlLHQscil9LGcuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIG0obnVsbCxlKX0sZy5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIG0obnVsbCxlKX0sZy5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fFooZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmWihlLnNsaWNlKDAsMCkpfShlKSl9LGcuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFfKGUpfHwhXyh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtyPWVbaV0sbj10W2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sZy5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxnLmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFmKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGcuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09dClmb3IodD0wLHI9MDtyPGUubGVuZ3RoOysrcil0Kz1lW3JdLmxlbmd0aDt2YXIgbj1nLmFsbG9jVW5zYWZlKHQpLGk9MDtmb3Iocj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbz1lW3JdO2lmKCFfKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sZy5ieXRlTGVuZ3RoPWssZy5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGcucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9MilBKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpQSh0aGlzLHQsdCszKSxBKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9LGcucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClBKHRoaXMsdCx0KzcpLEEodGhpcyx0KzEsdCs2KSxBKHRoaXMsdCsyLHQrNSksQSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxnLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1lPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP00odGhpcywwLGUpOlMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxnLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIV8oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PWcuY29tcGFyZSh0aGlzLGUpfSxnLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LGcucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZighXyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09ciYmKHI9ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxyPmUubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJnQ+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZih0Pj1yKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixpKSxjPWUuc2xpY2UodCxyKSxoPTA7aDxhOysraClpZih1W2hdIT09Y1toXSl7bz11W2hdLHM9Y1toXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LGcucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihlLHQscil9LGcucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBUKHRoaXMsZSx0LHIsITApfSxnLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQscil7cmV0dXJuIFQodGhpcyxlLHQsciwhMSl9LGcucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHZvaWQgMD09PXQpbj0idXRmOCIscj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIHQpbj10LHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLGUubGVuZ3RoPjAmJihyPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBSKHRoaXMsZSx0LHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIEModGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIFAodGhpcyxlLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gRCh0aGlzLGUsdCxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE8odGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBJKHRoaXMsZSx0LHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LGcucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIEw9NDA5NjtmdW5jdGlvbiBIKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gcShlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGk9dDtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gQihlLHQscil7dmFyIG49ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPSIiLG89dDtvPHI7KytvKWkrPVYoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gaihlLHQscil7Zm9yKHZhciBuPWUuc2xpY2UodCxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIHgoZSx0LHIpe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIE4oZSx0LHIsbixpLG8pe2lmKCFfKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZih0Pml8fHQ8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBLKGUsdCxyLG4pe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLXIsMik7aTxvOysraSllW3IraV09KHQmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBGKGUsdCxyLG4pe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciw0KTtpPG87KytpKWVbcitpXT10Pj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIFkoZSx0LHIsbixpLG8pe2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBXKGUsdCxyLG4saSl7cmV0dXJuIGl8fFkoZSwwLHIsNCksaChlLHQscixuLDIzLDQpLHIrNH1mdW5jdGlvbiB6KGUsdCxyLG4saSl7cmV0dXJuIGl8fFkoZSwwLHIsOCksaChlLHQscixuLDUyLDgpLHIrOH1nLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLCh0PXZvaWQgMD09PXQ/bjp+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksdDxlJiYodD1lKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189Zy5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgZyhpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbytlXX1yZXR1cm4gcn0sZy5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQscil7ZXw9MCx0fD0wLHJ8fHgoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LGcucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHx4KGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZSstLXRdLGk9MTt0PjAmJihpKj0yNTYpOyluKz10aGlzW2UrLS10XSppO3JldHVybiBufSxnLnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eChlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LGcucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LGcucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LGcucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sZy5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fHgoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxnLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHx4KGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KW4rPXRoaXNbZStvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCp0KSksbn0sZy5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8eChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10LGk9MSxvPXRoaXNbZSstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSxnLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LGcucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8eChlLDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxnLnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fHgoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sZy5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sZy5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sZy5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8eChlLDQsdGhpcy5sZW5ndGgpLGModGhpcyxlLCEwLDIzLDQpfSxnLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsNCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITEsMjMsNCl9LGcucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsOCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITAsNTIsOCl9LGcucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx4KGUsOCx0aGlzLmxlbmd0aCksYyh0aGlzLGUsITEsNTIsOCl9LGcucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8Tih0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxyJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrcn0sZy5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7KGU9K2UsdHw9MCxyfD0wLG4pfHxOKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28mMjU1O3JldHVybiB0K3J9LGcucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8Tih0aGlzLGUsdCwxLDI1NSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxnLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fE4odGhpcyxlLHQsMiw2NTUzNSwwKSxnLlRZUEVEX0FSUkFZX1NVUFBPUlQ/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/dFtuXT1yLnNsaWNlKCk6dFtuXT1yfWZvcih2YXIgbj0wLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKXNlKGFyZ3VtZW50c1tuXSxyKTtyZXR1cm4gdH0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gc2UodCwoZnVuY3Rpb24odCxuKXtlW25dPXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0P1EodCxyKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXlxzKi8sIiIpLnJlcGxhY2UoL1xzKiQvLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfX07ZnVuY3Rpb24gdWUoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIGNlPWZ1bmN0aW9uKGUsdCxyKXtpZighdClyZXR1cm4gZTt2YXIgbjtpZihyKW49cih0KTtlbHNlIGlmKGFlLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIGk9W107YWUuZm9yRWFjaCh0LChmdW5jdGlvbihlLHQpe251bGwhPWUmJihhZS5pc0FycmF5KGUpP3QrPSJbXSI6ZT1bZV0sYWUuZm9yRWFjaChlLChmdW5jdGlvbihlKXthZS5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6YWUuaXNPYmplY3QoZSkmJihlPUpTT04uc3RyaW5naWZ5KGUpKSxpLnB1c2godWUodCkrIj0iK3VlKGUpKX0pKSl9KSksbj1pLmpvaW4oIiYiKX1pZihuKXt2YXIgbz1lLmluZGV4T2YoIiMiKTstMSE9PW8mJihlPWUuc2xpY2UoMCxvKSksZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrbn1yZXR1cm4gZX07ZnVuY3Rpb24gaGUoKXt0aGlzLmhhbmRsZXJzPVtdfWhlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0fSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0saGUucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxoZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXthZS5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsKGZ1bmN0aW9uKHQpe251bGwhPT10JiZlKHQpfSkpfTt2YXIgbGU9aGUsZmU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBhZS5mb3JFYWNoKHIsKGZ1bmN0aW9uKHIpe2U9cihlLHQpfSkpLGV9LGRlPWZ1bmN0aW9uKGUpe3JldHVybiEoIWV8fCFlLl9fQ0FOQ0VMX18pfTtmdW5jdGlvbiBwZSgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGdlKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgdmU9cGUseWU9Z2U7ZnVuY3Rpb24gbWUoZSl7aWYodmU9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKHZlPT09cGV8fCF2ZSkmJnNldFRpbWVvdXQpcmV0dXJuIHZlPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gdmUoZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIHZlLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiB2ZS5jYWxsKHRoaXMsZSwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiB0LnNldFRpbWVvdXQmJih2ZT1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5jbGVhclRpbWVvdXQmJih5ZT1jbGVhclRpbWVvdXQpO3ZhciB3ZSxiZT1bXSxfZT0hMSxrZT0tMTtmdW5jdGlvbiBTZSgpe19lJiZ3ZSYmKF9lPSExLHdlLmxlbmd0aD9iZT13ZS5jb25jYXQoYmUpOmtlPS0xLGJlLmxlbmd0aCYmQWUoKSl9ZnVuY3Rpb24gQWUoKXtpZighX2Upe3ZhciBlPW1lKFNlKTtfZT0hMDtmb3IodmFyIHQ9YmUubGVuZ3RoO3Q7KXtmb3Iod2U9YmUsYmU9W107KytrZTx0Oyl3ZSYmd2Vba2VdLnJ1bigpO2tlPS0xLHQ9YmUubGVuZ3RofXdlPW51bGwsX2U9ITEsZnVuY3Rpb24oZSl7aWYoeWU9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoeWU9PT1nZXx8IXllKSYmY2xlYXJUaW1lb3V0KXJldHVybiB5ZT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXt5ZShlKX1jYXRjaCh0KXt0cnl7cmV0dXJuIHllLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4geWUuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBUZShlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fVRlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBFZSgpe312YXIgUmU9RWUsQ2U9RWUsUGU9RWUsRGU9RWUsT2U9RWUsSWU9RWUsVWU9RWU7dmFyIE1lPXQucGVyZm9ybWFuY2V8fHt9LExlPU1lLm5vd3x8TWUubW96Tm93fHxNZS5tc05vd3x8TWUub05vd3x8TWUud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgSGU9bmV3IERhdGU7dmFyIHFlPXtuZXh0VGljazpmdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl0W3ItMV09YXJndW1lbnRzW3JdO2JlLnB1c2gobmV3IFRlKGUsdCkpLDEhPT1iZS5sZW5ndGh8fF9lfHxtZShBZSl9LHRpdGxlOiJicm93c2VyIixicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLHZlcnNpb246IiIsdmVyc2lvbnM6e30sb246UmUsYWRkTGlzdGVuZXI6Q2Usb25jZTpQZSxvZmY6RGUscmVtb3ZlTGlzdGVuZXI6T2UscmVtb3ZlQWxsTGlzdGVuZXJzOkllLGVtaXQ6VWUsYmluZGluZzpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKGUpe3ZhciB0PS4wMDEqTGUuY2FsbChNZSkscj1NYXRoLmZsb29yKHQpLG49TWF0aC5mbG9vcih0JTEqMWU5KTtyZXR1cm4gZSYmKHItPWVbMF0sKG4tPWVbMV0pPDAmJihyLS0sbis9MWU5KSksW3Isbl19LHBsYXRmb3JtOiJicm93c2VyIixyZWxlYXNlOnt9LGNvbmZpZzp7fSx1cHRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUtSGUpLzFlM319LEJlPWZ1bmN0aW9uKGUsdCl7YWUuZm9yRWFjaChlLChmdW5jdGlvbihyLG4pe24hPT10JiZuLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPXIsZGVsZXRlIGVbbl0pfSkpfSxqZT1mdW5jdGlvbihlLHQscixuLGkpe3JldHVybiBmdW5jdGlvbihlLHQscixuLGkpe3JldHVybiBlLmNvbmZpZz10LHImJihlLmNvZGU9ciksZS5yZXF1ZXN0PW4sZS5yZXNwb25zZT1pLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlfX0sZX0obmV3IEVycm9yKGUpLHQscixuLGkpfSx4ZT1hZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP3t3cml0ZTpmdW5jdGlvbihlLHQscixuLGksbyl7dmFyIHM9W107cy5wdXNoKGUrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KSksYWUuaXNOdW1iZXIocikmJnMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHIpLnRvR01UU3RyaW5nKCkpLGFlLmlzU3RyaW5nKG4pJiZzLnB1c2goInBhdGg9IituKSxhZS5pc1N0cmluZyhpKSYmcy5wdXNoKCJkb21haW49IitpKSwhMD09PW8mJnMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPXMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrZSsiKT0oW147XSopIikpO3JldHVybiB0P2RlY29kZVVSSUNvbXBvbmVudCh0WzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dGhpcy53cml0ZShlLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319LE5lPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sS2U9YWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlLHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBuKGUpe3ZhciBuPWU7cmV0dXJuIHQmJihyLnNldEF0dHJpYnV0ZSgiaHJlZiIsbiksbj1yLmhyZWYpLHIuc2V0QXR0cmlidXRlKCJocmVmIixuKSx7aHJlZjpyLmhyZWYscHJvdG9jb2w6ci5wcm90b2NvbD9yLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpyLmhvc3Qsc2VhcmNoOnIuc2VhcmNoP3Iuc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6ci5oYXNoP3IuaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOnIuaG9zdG5hbWUscG9ydDpyLnBvcnQscGF0aG5hbWU6Ii8iPT09ci5wYXRobmFtZS5jaGFyQXQoMCk/ci5wYXRobmFtZToiLyIrci5wYXRobmFtZX19cmV0dXJuIGU9bih3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24odCl7dmFyIHI9YWUuaXNTdHJpbmcodCk/bih0KTp0O3JldHVybiByLnByb3RvY29sPT09ZS5wcm90b2NvbCYmci5ob3N0PT09ZS5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiEwfSxGZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQscil7dmFyIG49ZS5kYXRhLGk9ZS5oZWFkZXJzO2FlLmlzRm9ybURhdGEobikmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgbz1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgcz1lLmF1dGgudXNlcm5hbWV8fCIiLGE9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShzKyI6IithKX12YXIgdSxjLGg9KHU9ZS5iYXNlVVJMLGM9ZS51cmwsdSYmIS9eKFthLXpdW2EtelxkXCtcLVwuXSo6KT9cL1wvL2kudGVzdChjKT9mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfSh1LGMpOmMpO2lmKG8ub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLGNlKGgsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksby50aW1lb3V0PWUudGltZW91dCxvLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKG8mJjQ9PT1vLnJlYWR5U3RhdGUmJigwIT09by5zdGF0dXN8fG8ucmVzcG9uc2VVUkwmJjA9PT1vLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6IikpKXt2YXIgbj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIG8/ZnVuY3Rpb24oZSl7dmFyIHQscixuLGk9e307cmV0dXJuIGU/KGFlLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PWFlLnRyaW0oZS5zdWJzdHIoMCxuKSkudG9Mb3dlckNhc2UoKSxyPWFlLnRyaW0oZS5zdWJzdHIobisxKSksdCl7aWYoaVt0XSYmTmUuaW5kZXhPZih0KT49MClyZXR1cm47aVt0XT0ic2V0LWNvb2tpZSI9PT10PyhpW3RdP2lbdF06W10pLmNvbmNhdChbcl0pOmlbdF0/aVt0XSsiLCAiK3I6cn19KSksaSk6aX0oby5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk6bnVsbCxpPXtkYXRhOmUucmVzcG9uc2VUeXBlJiYidGV4dCIhPT1lLnJlc3BvbnNlVHlwZT9vLnJlc3BvbnNlOm8ucmVzcG9uc2VUZXh0LHN0YXR1czpvLnN0YXR1cyxzdGF0dXNUZXh0Om8uc3RhdHVzVGV4dCxoZWFkZXJzOm4sY29uZmlnOmUscmVxdWVzdDpvfTshZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXIuY29uZmlnLnZhbGlkYXRlU3RhdHVzO3Iuc3RhdHVzJiZuJiYhbihyLnN0YXR1cyk/dChqZSgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Iuc3RhdHVzLHIuY29uZmlnLG51bGwsci5yZXF1ZXN0LHIpKTplKHIpfSh0LHIsaSksbz1udWxsfX0sby5vbmFib3J0PWZ1bmN0aW9uKCl7byYmKHIoamUoIlJlcXVlc3QgYWJvcnRlZCIsZSwiRUNPTk5BQk9SVEVEIixvKSksbz1udWxsKX0sby5vbmVycm9yPWZ1bmN0aW9uKCl7cihqZSgiTmV0d29yayBFcnJvciIsZSxudWxsLG8pKSxvPW51bGx9LG8ub250aW1lb3V0PWZ1bmN0aW9uKCl7dmFyIHQ9InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjtlLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih0PWUudGltZW91dEVycm9yTWVzc2FnZSkscihqZSh0LGUsIkVDT05OQUJPUlRFRCIsbykpLG89bnVsbH0sYWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIGw9KGUud2l0aENyZWRlbnRpYWxzfHxLZShoKSkmJmUueHNyZkNvb2tpZU5hbWU/eGUucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7bCYmKGlbZS54c3JmSGVhZGVyTmFtZV09bCl9aWYoInNldFJlcXVlc3RIZWFkZXIiaW4gbyYmYWUuZm9yRWFjaChpLChmdW5jdGlvbihlLHQpe3ZvaWQgMD09PW4mJiJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpP2RlbGV0ZSBpW3RdOm8uc2V0UmVxdWVzdEhlYWRlcih0LGUpfSkpLGFlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KG8ud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLGUucmVzcG9uc2VUeXBlKXRyeXtvLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZX1jYXRjaCh0KXtpZigianNvbiIhPT1lLnJlc3BvbnNlVHlwZSl0aHJvdyB0fSJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmby5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MmJm8udXBsb2FkJiZvLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnByb21pc2UudGhlbigoZnVuY3Rpb24oZSl7byYmKG8uYWJvcnQoKSxyKGUpLG89bnVsbCl9KSksbnx8KG49bnVsbCksby5zZW5kKG4pfSkpfSxZZT17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIFdlKGUsdCl7IWFlLmlzVW5kZWZpbmVkKGUpJiZhZS5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgemUsSmU9e2FkYXB0ZXI6KCgidW5kZWZpbmVkIiE9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0fHx2b2lkIDAhPT1xZSYmIltvYmplY3QgcHJvY2Vzc10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHFlKSkmJih6ZT1GZSksemUpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEJlKHQsIkFjY2VwdCIpLEJlKHQsIkNvbnRlbnQtVHlwZSIpLGFlLmlzRm9ybURhdGEoZSl8fGFlLmlzQXJyYXlCdWZmZXIoZSl8fGFlLmlzQnVmZmVyKGUpfHxhZS5pc1N0cmVhbShlKXx8YWUuaXNGaWxlKGUpfHxhZS5pc0Jsb2IoZSk/ZTphZS5pc0FycmF5QnVmZmVyVmlldyhlKT9lLmJ1ZmZlcjphZS5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oV2UodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOmFlLmlzT2JqZWN0KGUpPyhXZSh0LCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgiKSxKU09OLnN0cmluZ2lmeShlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpdHJ5e2U9SlNPTi5wYXJzZShlKX1jYXRjaChlKXt9cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH19O0plLmhlYWRlcnM9e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX0sYWUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSwoZnVuY3Rpb24oZSl7SmUuaGVhZGVyc1tlXT17fX0pKSxhZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe0plLmhlYWRlcnNbZV09YWUubWVyZ2UoWWUpfSkpO3ZhciBWZT1KZTtmdW5jdGlvbiAkZShlKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKX12YXIgR2U9ZnVuY3Rpb24oZSl7cmV0dXJuICRlKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT1mZShlLmRhdGEsZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVxdWVzdCksZS5oZWFkZXJzPWFlLm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksYWUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSwoZnVuY3Rpb24odCl7ZGVsZXRlIGUuaGVhZGVyc1t0XX0pKSwoZS5hZGFwdGVyfHxWZS5hZGFwdGVyKShlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gJGUoZSksdC5kYXRhPWZlKHQuZGF0YSx0LmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksdH0pLChmdW5jdGlvbih0KXtyZXR1cm4gZGUodCl8fCgkZShlKSx0JiZ0LnJlc3BvbnNlJiYodC5yZXNwb25zZS5kYXRhPWZlKHQucmVzcG9uc2UuZGF0YSx0LnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdCh0KX0pKX0sWGU9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciByPXt9LG49WyJ1cmwiLCJtZXRob2QiLCJkYXRhIl0saT1bImhlYWRlcnMiLCJhdXRoIiwicHJveHkiLCJwYXJhbXMiXSxvPVsiYmFzZVVSTCIsInRyYW5zZm9ybVJlcXVlc3QiLCJ0cmFuc2Zvcm1SZXNwb25zZSIsInBhcmFtc1NlcmlhbGl6ZXIiLCJ0aW1lb3V0IiwidGltZW91dE1lc3NhZ2UiLCJ3aXRoQ3JlZGVudGlhbHMiLCJhZGFwdGVyIiwicmVzcG9uc2VUeXBlIiwieHNyZkNvb2tpZU5hbWUiLCJ4c3JmSGVhZGVyTmFtZSIsIm9uVXBsb2FkUHJvZ3Jlc3MiLCJvbkRvd25sb2FkUHJvZ3Jlc3MiLCJkZWNvbXByZXNzIiwibWF4Q29udGVudExlbmd0aCIsIm1heEJvZHlMZW5ndGgiLCJtYXhSZWRpcmVjdHMiLCJ0cmFuc3BvcnQiLCJodHRwQWdlbnQiLCJodHRwc0FnZW50IiwiY2FuY2VsVG9rZW4iLCJzb2NrZXRQYXRoIiwicmVzcG9uc2VFbmNvZGluZyJdLHM9WyJ2YWxpZGF0ZVN0YXR1cyJdO2Z1bmN0aW9uIGEoZSx0KXtyZXR1cm4gYWUuaXNQbGFpbk9iamVjdChlKSYmYWUuaXNQbGFpbk9iamVjdCh0KT9hZS5tZXJnZShlLHQpOmFlLmlzUGxhaW5PYmplY3QodCk/YWUubWVyZ2Uoe30sdCk6YWUuaXNBcnJheSh0KT90LnNsaWNlKCk6dH1mdW5jdGlvbiB1KG4pe2FlLmlzVW5kZWZpbmVkKHRbbl0pP2FlLmlzVW5kZWZpbmVkKGVbbl0pfHwocltuXT1hKHZvaWQgMCxlW25dKSk6cltuXT1hKGVbbl0sdFtuXSl9YWUuZm9yRWFjaChuLChmdW5jdGlvbihlKXthZS5pc1VuZGVmaW5lZCh0W2VdKXx8KHJbZV09YSh2b2lkIDAsdFtlXSkpfSkpLGFlLmZvckVhY2goaSx1KSxhZS5mb3JFYWNoKG8sKGZ1bmN0aW9uKG4pe2FlLmlzVW5kZWZpbmVkKHRbbl0pP2FlLmlzVW5kZWZpbmVkKGVbbl0pfHwocltuXT1hKHZvaWQgMCxlW25dKSk6cltuXT1hKHZvaWQgMCx0W25dKX0pKSxhZS5mb3JFYWNoKHMsKGZ1bmN0aW9uKG4pe24gaW4gdD9yW25dPWEoZVtuXSx0W25dKTpuIGluIGUmJihyW25dPWEodm9pZCAwLGVbbl0pKX0pKTt2YXIgYz1uLmNvbmNhdChpKS5jb25jYXQobykuY29uY2F0KHMpLGg9T2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09Yy5pbmRleE9mKGUpfSkpO3JldHVybiBhZS5mb3JFYWNoKGgsdSkscn07ZnVuY3Rpb24gWmUoZSl7dGhpcy5kZWZhdWx0cz1lLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBsZSxyZXNwb25zZTpuZXcgbGV9fVplLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZT8oZT1hcmd1bWVudHNbMV18fHt9KS51cmw9YXJndW1lbnRzWzBdOmU9ZXx8e30sKGU9WGUodGhpcy5kZWZhdWx0cyxlKSkubWV0aG9kP2UubWV0aG9kPWUubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/ZS5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTplLm1ldGhvZD0iZ2V0Ijt2YXIgdD1bR2Usdm9pZCAwXSxyPVByb21pc2UucmVzb2x2ZShlKTtmb3IodGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKChmdW5jdGlvbihlKXt0LnVuc2hpZnQoZS5mdWxmaWxsZWQsZS5yZWplY3RlZCl9KSksdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpfSkpO3QubGVuZ3RoOylyPXIudGhlbih0LnNoaWZ0KCksdC5zaGlmdCgpKTtyZXR1cm4gcn0sWmUucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbihlKXtyZXR1cm4gZT1YZSh0aGlzLmRlZmF1bHRzLGUpLGNlKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LGFlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLChmdW5jdGlvbihlKXtaZS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxyKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFhlKHJ8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihyfHx7fSkuZGF0YX0pKX19KSksYWUuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLChmdW5jdGlvbihlKXtaZS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxyLG4pe3JldHVybiB0aGlzLnJlcXVlc3QoWGUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6cn0pKX19KSk7dmFyIFFlPVplO2Z1bmN0aW9uIGV0KGUpe3RoaXMubWVzc2FnZT1lfWV0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxldC5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgdHQ9ZXQ7ZnVuY3Rpb24gcnQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dD1lfSkpO3ZhciByPXRoaXM7ZSgoZnVuY3Rpb24oZSl7ci5yZWFzb258fChyLnJlYXNvbj1uZXcgdHQoZSksdChyLnJlYXNvbikpfSkpfXJ0LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LHJ0LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlO3JldHVybnt0b2tlbjpuZXcgcnQoKGZ1bmN0aW9uKHQpe2U9dH0pKSxjYW5jZWw6ZX19O3ZhciBudD1ydDtmdW5jdGlvbiBpdChlKXt2YXIgdD1uZXcgUWUoZSkscj1RKFFlLnByb3RvdHlwZS5yZXF1ZXN0LHQpO3JldHVybiBhZS5leHRlbmQocixRZS5wcm90b3R5cGUsdCksYWUuZXh0ZW5kKHIsdCkscn12YXIgb3Q9aXQoVmUpO290LkF4aW9zPVFlLG90LmNyZWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaXQoWGUob3QuZGVmYXVsdHMsZSkpfSxvdC5DYW5jZWw9dHQsb3QuQ2FuY2VsVG9rZW49bnQsb3QuaXNDYW5jZWw9ZGUsb3QuYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX0sb3Quc3ByZWFkPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseShudWxsLHQpfX0sb3QuaXNBeGlvc0Vycm9yPWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmITA9PT1lLmlzQXhpb3NFcnJvcn07dmFyIHN0PW90LGF0PW90O3N0LmRlZmF1bHQ9YXQ7dmFyIHV0LGN0LGh0PXN0OwovKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgoKICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICAgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLgoKICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRICiAgICBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKICAgIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwKICAgIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQogICAgTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IKICAgIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICAgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL2Z1bmN0aW9uIGx0KGUsdCxyLG4pe3JldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e3Uobi5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXt1KG4udGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIHUoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygcj90Om5ldyByKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9dSgobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfShjdD11dHx8KHV0PXt9KSkuZm9ybVBvc3Q9ImZvcm1fcG9zdCIsY3QucXVlcnk9InF1ZXJ5Ijt2YXIgZnQ7IWZ1bmN0aW9uKGUpe2UuQ29uZmlnRGF0YT0iY29uZmlnX2RhdGEiLGUuT0lEQ1Byb3ZpZGVyTWV0YURhdGE9Im9pZGNfcHJvdmlkZXJfbWV0YV9kYXRhIixlLlNlc3Npb25EYXRhPSJzZXNzaW9uX2RhdGEiLGUuVGVtcG9yYXJ5RGF0YT0idGVtcG9yYXJ5X2RhdGEifShmdHx8KGZ0PXt9KSk7Y29uc3QgZHQ9InJlZnJlc2hfdG9rZW5fdGltZXIiO2NsYXNzIHB0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LHIsbixpLG8pe3N1cGVyKG51bGwhPW4/bjpudWxsPT1vP3ZvaWQgMDpvLm1lc3NhZ2UpLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPWUsdGhpcy5maWxlPXQsdGhpcy5tZXRob2Q9cix0aGlzLmRlc2NyaXB0aW9uPWksdGhpcy5lcnJvcj1vLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgZ3QgZXh0ZW5kcyBwdHtjb25zdHJ1Y3RvcihlLHQscixuLGksbyxzLGEsdSl7c3VwZXIoZSx0LHIsbixpKSx0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLHRoaXMuY29kZT1lLHRoaXMuZmlsZT10LHRoaXMubWV0aG9kPXIsdGhpcy5kZXNjcmlwdGlvbj1pLHRoaXMubmV0d29ya0Vycm9yQ29kZT1vLHRoaXMubmV0d29ya0Vycm9yTWVzc2FnZT1zLHRoaXMuc3RhdHVzPWEsdGhpcy5uZXR3b3JrRXJyb3JEYXRhPXV9fXZhciB2dD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dm9pZCAwIT09dD90OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uIHl0KGUsdCxyKXtyZXR1cm4gZShyPXtwYXRoOnQsZXhwb3J0czp7fSxyZXF1aXJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJEeW5hbWljIHJlcXVpcmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBAcm9sbHVwL3BsdWdpbi1jb21tb25qcyIpfShudWxsPT10JiZyLnBhdGgpfX0sci5leHBvcnRzKSxyLmV4cG9ydHN9dmFyIG10PXZvaWQgMCE9PXQ/dDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30sd3Q9W10sYnQ9W10sX3Q9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksa3Q9ITE7ZnVuY3Rpb24gU3QoKXtrdD0hMDtmb3IodmFyIGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHQ9MCxyPWUubGVuZ3RoO3Q8cjsrK3Qpd3RbdF09ZVt0XSxidFtlLmNoYXJDb2RlQXQodCldPXQ7YnRbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGJ0WyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiBBdChlLHQscil7Zm9yKHZhciBuLGksbz1bXSxzPXQ7czxyO3MrPTMpbj0oZVtzXTw8MTYpKyhlW3MrMV08PDgpK2VbcysyXSxvLnB1c2god3RbKGk9bik+PjE4JjYzXSt3dFtpPj4xMiY2M10rd3RbaT4+NiY2M10rd3RbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIFR0KGUpe3ZhciB0O2t0fHxTdCgpO2Zvcih2YXIgcj1lLmxlbmd0aCxuPXIlMyxpPSIiLG89W10scz0xNjM4MyxhPTAsdT1yLW47YTx1O2ErPXMpby5wdXNoKEF0KGUsYSxhK3M+dT91OmErcykpO3JldHVybiAxPT09bj8odD1lW3ItMV0saSs9d3RbdD4+Ml0saSs9d3RbdDw8NCY2M10saSs9Ij09Iik6Mj09PW4mJih0PShlW3ItMl08PDgpK2Vbci0xXSxpKz13dFt0Pj4xMF0saSs9d3RbdD4+NCY2M10saSs9d3RbdDw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiBFdChlLHQscixuLGkpe3ZhciBvLHMsYT04Kmktbi0xLHU9KDE8PGEpLTEsYz11Pj4xLGg9LTcsbD1yP2ktMTowLGY9cj8tMToxLGQ9ZVt0K2xdO2ZvcihsKz1mLG89ZCYoMTw8LWgpLTEsZD4+PS1oLGgrPWE7aD4wO289MjU2Km8rZVt0K2xdLGwrPWYsaC09OCk7Zm9yKHM9byYoMTw8LWgpLTEsbz4+PS1oLGgrPW47aD4wO3M9MjU2KnMrZVt0K2xdLGwrPWYsaC09OCk7aWYoMD09PW8pbz0xLWM7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46MS8wKihkPy0xOjEpO3MrPU1hdGgucG93KDIsbiksby09Y31yZXR1cm4oZD8tMToxKSpzKk1hdGgucG93KDIsby1uKX1mdW5jdGlvbiBSdChlLHQscixuLGksbyl7dmFyIHMsYSx1LGM9OCpvLWktMSxoPSgxPDxjKS0xLGw9aD4+MSxmPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZD1uPzA6by0xLHA9bj8xOi0xLGc9dDwwfHwwPT09dCYmMS90PDA/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHx0PT09MS8wPyhhPWlzTmFOKHQpPzE6MCxzPWgpOihzPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKHU9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sdSo9MiksKHQrPXMrbD49MT9mL3U6ZipNYXRoLnBvdygyLDEtbCkpKnU+PTImJihzKyssdS89MikscytsPj1oPyhhPTAscz1oKTpzK2w+PTE/KGE9KHQqdS0xKSpNYXRoLnBvdygyLGkpLHMrPWwpOihhPXQqTWF0aC5wb3coMixsLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtlW3IrZF09MjU1JmEsZCs9cCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGMrPWk7Yz4wO2VbcitkXT0yNTUmcyxkKz1wLHMvPTI1NixjLT04KTtlW3IrZC1wXXw9MTI4Kmd9dmFyIEN0PXt9LnRvU3RyaW5nLFB0PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PUN0LmNhbGwoZSl9O1V0LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09bXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8bXQuVFlQRURfQVJSQVlfU1VQUE9SVDt2YXIgRHQ9T3QoKTtmdW5jdGlvbiBPdCgpe3JldHVybiBVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBJdChlLHQpe2lmKE90KCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT1uZXcgVWludDhBcnJheSh0KSkuX19wcm90b19fPVV0LnByb3RvdHlwZToobnVsbD09PWUmJihlPW5ldyBVdCh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBVdChlLHQscil7aWYoIShVdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgVXQpKXJldHVybiBuZXcgVXQoZSx0LHIpO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gSHQodGhpcyxlKX1yZXR1cm4gTXQodGhpcyxlLHQscil9ZnVuY3Rpb24gTXQoZSx0LHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24oZSx0LHIsbil7aWYodC5ieXRlTGVuZ3RoLHI8MHx8dC5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZih0LmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtyZXR1cm4gdD12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkodCxyKTpuZXcgVWludDhBcnJheSh0LHIsbiksVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189VXQucHJvdG90eXBlOmU9cXQoZSx0KSxlfShlLHQscixuKToic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0LHIpe2lmKCJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpLCFVdC5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8eHQodCxyKSxpPShlPUl0KGUsbikpLndyaXRlKHQscik7cmV0dXJuIGkhPT1uJiYoZT1lLnNsaWNlKDAsaSkpLGV9KGUsdCxyKTpmdW5jdGlvbihlLHQpe2lmKGp0KHQpKXt2YXIgcj0wfEJ0KHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPUl0KGUscikpLmxlbmd0aHx8dC5jb3B5KGUsMCwwLHIpLGV9aWYodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiB0KXJldHVybiJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fChuPXQubGVuZ3RoKSE9bj9JdChlLDApOnF0KGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJlB0KHQuZGF0YSkpcmV0dXJuIHF0KGUsdC5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KGUsdCl9ZnVuY3Rpb24gTHQoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBIdChlLHQpe2lmKEx0KHQpLGU9SXQoZSx0PDA/MDowfEJ0KHQpKSwhVXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPHQ7KytyKWVbcl09MDtyZXR1cm4gZX1mdW5jdGlvbiBxdChlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfEJ0KHQubGVuZ3RoKTtlPUl0KGUscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpZVtuXT0yNTUmdFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBCdChlKXtpZihlPj1PdCgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IitPdCgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8ZX1mdW5jdGlvbiBqdChlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24geHQoZSx0KXtpZihqdChlKSlyZXR1cm4gZS5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gZS5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgZSYmKGU9IiIrZSk7dmFyIHI9ZS5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKHQpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gZnIoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBkcihlKS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBmcihlKS5sZW5ndGg7dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBOdChlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiB0cih0aGlzLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gWnQodGhpcyx0LHIpO2Nhc2UiYXNjaWkiOnJldHVybiBRdCh0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gZXIodGhpcyx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gWHQodGhpcyx0LHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gcnIodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gS3QoZSx0LHIpe3ZhciBuPWVbdF07ZVt0XT1lW3JdLGVbcl09bn1mdW5jdGlvbiBGdChlLHQscixuLGkpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDplLmxlbmd0aC0xKSxyPDAmJihyPWUubGVuZ3RoK3IpLHI+PWUubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9ZS5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9VXQuZnJvbSh0LG4pKSxqdCh0KSlyZXR1cm4gMD09PXQubGVuZ3RoPy0xOll0KGUsdCxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Jj0yNTUsVXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOll0KGUsW3RdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBZdChlLHQscixuLGkpe3ZhciBvLHM9MSxhPWUubGVuZ3RoLHU9dC5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYoZS5sZW5ndGg8Mnx8dC5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89Mix1Lz0yLHIvPTJ9ZnVuY3Rpb24gYyhlLHQpe3JldHVybiAxPT09cz9lW3RdOmUucmVhZFVJbnQxNkJFKHQqcyl9aWYoaSl7dmFyIGg9LTE7Zm9yKG89cjtvPGE7bysrKWlmKGMoZSxvKT09PWModCwtMT09PWg/MDpvLWgpKXtpZigtMT09PWgmJihoPW8pLG8taCsxPT09dSlyZXR1cm4gaCpzfWVsc2UtMSE9PWgmJihvLT1vLWgpLGg9LTF9ZWxzZSBmb3Iocit1PmEmJihyPWEtdSksbz1yO28+PTA7by0tKXtmb3IodmFyIGw9ITAsZj0wO2Y8dTtmKyspaWYoYyhlLG8rZikhPT1jKHQsZikpe2w9ITE7YnJlYWt9aWYobClyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBXdChlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24genQoZSx0LHIsbil7cmV0dXJuIHByKGZyKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIEp0KGUsdCxyLG4pe3JldHVybiBwcihmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7KytyKXQucHVzaCgyNTUmZS5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gdH0odCksZSxyLG4pfWZ1bmN0aW9uIFZ0KGUsdCxyLG4pe3JldHVybiBKdChlLHQscixuKX1mdW5jdGlvbiAkdChlLHQscixuKXtyZXR1cm4gcHIoZHIodCksZSxyLG4pfWZ1bmN0aW9uIEd0KGUsdCxyLG4pe3JldHVybiBwcihmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIFh0KGUsdCxyKXtyZXR1cm4gMD09PXQmJnI9PT1lLmxlbmd0aD9UdChlKTpUdChlLnNsaWNlKHQscikpfWZ1bmN0aW9uIFp0KGUsdCxyKXtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPXQ7aTxyOyl7dmFyIG8scyxhLHUsYz1lW2ldLGg9bnVsbCxsPWM+MjM5PzQ6Yz4yMjM/MzpjPjE5MT8yOjE7aWYoaStsPD1yKXN3aXRjaChsKXtjYXNlIDE6YzwxMjgmJihoPWMpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89ZVtpKzFdKSkmJih1PSgzMSZjKTw8Nnw2MyZvKT4xMjcmJihoPXUpO2JyZWFrO2Nhc2UgMzpvPWVbaSsxXSxzPWVbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKHU9KDE1JmMpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKHU8NTUyOTZ8fHU+NTczNDMpJiYoaD11KTticmVhaztjYXNlIDQ6bz1lW2krMV0scz1lW2krMl0sYT1lW2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKHU9KDE1JmMpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmdTwxMTE0MTEyJiYoaD11KX1udWxsPT09aD8oaD02NTUzMyxsPTEpOmg+NjU1MzUmJihoLT02NTUzNixuLnB1c2goaD4+PjEwJjEwMjN8NTUyOTYpLGg9NTYzMjB8MTAyMyZoKSxuLnB1c2goaCksaSs9bH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9NDA5NilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7Zm9yKHZhciByPSIiLG49MDtuPHQ7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UobixuKz00MDk2KSk7cmV0dXJuIHJ9KG4pfWZ1bmN0aW9uIFF0KGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gZXIoZSx0LHIpe3ZhciBuPSIiO3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBpPXQ7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbaV0pO3JldHVybiBufWZ1bmN0aW9uIHRyKGUsdCxyKXt2YXIgbj1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz10O288cjsrK28paSs9bHIoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gcnIoZSx0LHIpe2Zvcih2YXIgbj1lLnNsaWNlKHQsciksaT0iIixvPTA7bzxuLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUobltvXSsyNTYqbltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBucihlLHQscil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gaXIoZSx0LHIsbixpLG8pe2lmKCFqdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5pfHx0PG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gb3IoZSx0LHIsbil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciwyKTtpPG87KytpKWVbcitpXT0odCYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIHNyKGUsdCxyLG4pe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciw0KTtpPG87KytpKWVbcitpXT10Pj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIGFyKGUsdCxyLG4saSxvKXtpZihyK24+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gdXIoZSx0LHIsbixpKXtyZXR1cm4gaXx8YXIoZSwwLHIsNCksUnQoZSx0LHIsbiwyMyw0KSxyKzR9ZnVuY3Rpb24gY3IoZSx0LHIsbixpKXtyZXR1cm4gaXx8YXIoZSwwLHIsOCksUnQoZSx0LHIsbiw1Miw4KSxyKzh9VXQucG9vbFNpemU9ODE5MixVdC5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189VXQucHJvdG90eXBlLGV9LFV0LmZyb209ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBNdChudWxsLGUsdCxyKX0sVXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmKFV0LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsVXQuX19wcm90b19fPVVpbnQ4QXJyYXkpLFV0LmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIEx0KHQpLHQ8PTA/SXQoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9JdChlLHQpLmZpbGwocixuKTpJdChlLHQpLmZpbGwocik6SXQoZSx0KX0obnVsbCxlLHQscil9LFV0LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBIdChudWxsLGUpfSxVdC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIEh0KG51bGwsZSl9LFV0LmlzQnVmZmVyPWdyLFV0LmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighanQoZSl8fCFqdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtyPWVbaV0sbj10W2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sVXQuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sVXQuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIVB0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIFV0LmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxyPTA7cjxlLmxlbmd0aDsrK3IpdCs9ZVtyXS5sZW5ndGg7dmFyIG49VXQuYWxsb2NVbnNhZmUodCksaT0wO2ZvcihyPTA7cjxlLmxlbmd0aDsrK3Ipe3ZhciBvPWVbcl07aWYoIWp0KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0sVXQuYnl0ZUxlbmd0aD14dCxVdC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLFV0LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpS3QodGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LFV0LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpS3QodGhpcyx0LHQrMyksS3QodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sVXQucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClLdCh0aGlzLHQsdCs3KSxLdCh0aGlzLHQrMSx0KzYpLEt0KHRoaXMsdCsyLHQrNSksS3QodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sVXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/WnQodGhpcywwLGUpOk50LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sVXQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighanQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PVV0LmNvbXBhcmUodGhpcyxlKX0sVXQucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sVXQucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZighanQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PXImJihyPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLHQ8MHx8cj5lLmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZ0Pj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYodD49cilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKG8scyksdT10aGlzLnNsaWNlKG4saSksYz1lLnNsaWNlKHQsciksaD0wO2g8YTsrK2gpaWYodVtoXSE9PWNbaF0pe289dVtoXSxzPWNbaF07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxVdC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxyKX0sVXQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBGdCh0aGlzLGUsdCxyLCEwKX0sVXQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gRnQodGhpcyxlLHQsciwhMSl9LFV0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQscixuKXtpZih2b2lkIDA9PT10KW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiB0KW49dCxyPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSxlLmxlbmd0aD4wJiYocjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gV3QodGhpcyxlLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4genQodGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIEp0KHRoaXMsZSx0LHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIFZ0KHRoaXMsZSx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gJHQodGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBHdCh0aGlzLGUsdCxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxVdC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fSxVdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKChlPX5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSwodD12b2lkIDA9PT10P246fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLHQ8ZSYmKHQ9ZSksVXQuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1VdC5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgVXQoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rZV19cmV0dXJuIHJ9LFV0LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8bnIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LFV0LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8bnIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlKy0tdF0saT0xO3Q+MCYmKGkqPTI1Nik7KW4rPXRoaXNbZSstLXRdKmk7cmV0dXJuIG59LFV0LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bnIoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxVdC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG5yKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LFV0LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bnIoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sVXQucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LFV0LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bnIoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxVdC5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8bnIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KnQpKSxufSxVdC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8bnIoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dCxpPTEsbz10aGlzW2UrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW2UrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCp0KSksb30sVXQucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG5yKGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LFV0LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe3R8fG5yKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LFV0LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fG5yKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LFV0LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sVXQucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG5yKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxVdC5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bnIoZSw0LHRoaXMubGVuZ3RoKSxFdCh0aGlzLGUsITAsMjMsNCl9LFV0LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDQsdGhpcy5sZW5ndGgpLEV0KHRoaXMsZSwhMSwyMyw0KX0sVXQucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDgsdGhpcy5sZW5ndGgpLEV0KHRoaXMsZSwhMCw1Miw4KX0sVXQucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxucihlLDgsdGhpcy5sZW5ndGgpLEV0KHRoaXMsZSwhMSw1Miw4KX0sVXQucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2U9K2UsdHw9MCxyfD0wLG58fGlyKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPHImJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pJjI1NTtyZXR1cm4gdCtyfSxVdC5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7ZT0rZSx0fD0wLHJ8PTAsbnx8aXIodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspdGhpc1t0K2ldPWUvbyYyNTU7cmV0dXJuIHQrcn0sVXQucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8aXIodGhpcyxlLHQsMSwyNTUsMCksVXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LFV0LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDIsNjU1MzUsMCksVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOm9yKHRoaXMsZSx0LCEwKSx0KzJ9LFV0LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDIsNjU1MzUsMCksVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOm9yKHRoaXMsZSx0LCExKSx0KzJ9LFV0LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOnNyKHRoaXMsZSx0LCEwKSx0KzR9LFV0LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOnNyKHRoaXMsZSx0LCExKSx0KzR9LFV0LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7aXIodGhpcyxlLHQscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK288ciYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3Qrby0xXSYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K3J9LFV0LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7aXIodGhpcyxlLHQscixpLTEsLWkpfXZhciBvPXItMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109MjU1JmU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvKzFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrcn0sVXQucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxpcih0aGlzLGUsdCwxLDEyNywtMTI4KSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxVdC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGlyKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6b3IodGhpcyxlLHQsITApLHQrMn0sVXQucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxpcih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksVXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOm9yKHRoaXMsZSx0LCExKSx0KzJ9LFV0LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8aXIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOnNyKHRoaXMsZSx0LCEwKSx0KzR9LFV0LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8aXIodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxVdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOnNyKHRoaXMsZSx0LCExKSx0KzR9LFV0LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiB1cih0aGlzLGUsdCwhMCxyKX0sVXQucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHVyKHRoaXMsZSx0LCExLHIpfSxVdC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGNyKHRoaXMsZSx0LCEwLHIpfSxVdC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGNyKHRoaXMsZSx0LCExLHIpfSxVdC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8bi1yJiYobj1lLmxlbmd0aC10K3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT1lJiZyPHQmJnQ8bilmb3IoaT1vLTE7aT49MDstLWkpZVtpK3RdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhVXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpZVtpK3RdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShyLHIrbyksdCk7cmV0dXJuIG99LFV0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhuPXQsdD0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBpPWUuY2hhckNvZGVBdCgwKTtpPDI1NiYmKGU9aSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFVdC5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD10KXJldHVybiB0aGlzO3ZhciBvO2lmKHQ+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihvPXQ7bzxyOysrbyl0aGlzW29dPWU7ZWxzZXt2YXIgcz1qdChlKT9lOmZyKG5ldyBVdChlLG4pLnRvU3RyaW5nKCkpLGE9cy5sZW5ndGg7Zm9yKG89MDtvPHItdDsrK28pdGhpc1tvK3RdPXNbbyVhXX1yZXR1cm4gdGhpc307dmFyIGhyPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIGxyKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBmcihlLHQpe3ZhciByO3Q9dHx8MS8wO2Zvcih2YXIgbj1lLmxlbmd0aCxpPW51bGwsbz1bXSxzPTA7czxuOysrcyl7aWYoKHI9ZS5jaGFyQ29kZUF0KHMpKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1uKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigodC09MSk8MClicmVhaztvLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO28ucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigodC09Myk8MClicmVhaztvLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO28ucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gZHIoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LHIsbixpLG8scztrdHx8U3QoKTt2YXIgYT1lLmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PWVbYS0yXT8yOiI9Ij09PWVbYS0xXT8xOjAscz1uZXcgX3QoMyphLzQtbyksbj1vPjA/YS00OmE7dmFyIHU9MDtmb3IodD0wLHI9MDt0PG47dCs9NCxyKz0zKWk9YnRbZS5jaGFyQ29kZUF0KHQpXTw8MTh8YnRbZS5jaGFyQ29kZUF0KHQrMSldPDwxMnxidFtlLmNoYXJDb2RlQXQodCsyKV08PDZ8YnRbZS5jaGFyQ29kZUF0KHQrMyldLHNbdSsrXT1pPj4xNiYyNTUsc1t1KytdPWk+PjgmMjU1LHNbdSsrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9YnRbZS5jaGFyQ29kZUF0KHQpXTw8MnxidFtlLmNoYXJDb2RlQXQodCsxKV0+PjQsc1t1KytdPTI1NSZpKToxPT09byYmKGk9YnRbZS5jaGFyQ29kZUF0KHQpXTw8MTB8YnRbZS5jaGFyQ29kZUF0KHQrMSldPDw0fGJ0W2UuY2hhckNvZGVBdCh0KzIpXT4+MixzW3UrK109aT4+OCYyNTUsc1t1KytdPTI1NSZpKSxzfShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKGhyLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBwcihlLHQscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj10Lmxlbmd0aHx8aT49ZS5sZW5ndGgpOysraSl0W2krcl09ZVtpXTtyZXR1cm4gaX1mdW5jdGlvbiBncihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fHZyKGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJnZyKGUuc2xpY2UoMCwwKSl9KGUpKX1mdW5jdGlvbiB2cihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciB5cj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6VXQsSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksVXQuYWxsb2MoK2UpfSxpc0J1ZmZlcjpncixrTWF4TGVuZ3RoOkR0fSksbXI9eXQoKGZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxyPXQlNDtpZighcilyZXR1cm4gZTt2YXIgbj10LGk9NC1yLG89dCtpLHM9VXQuYWxsb2Mobyk7Zm9yKHMud3JpdGUoZSk7aS0tOylzLndyaXRlKCI9IixuKyspO3JldHVybiBzLnRvU3RyaW5nKCl9fSkpLHdyPXl0KChmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxVdC5pc0J1ZmZlcihlKT9pKGUudG9TdHJpbmcoImJhc2U2NCIpKTppKFV0LmZyb20oZSx0KS50b1N0cmluZygiYmFzZTY0IikpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIGU9ZS50b1N0cmluZygpLG1yLmRlZmF1bHQoZSkucmVwbGFjZSgvXC0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUucmVwbGFjZSgvPS9nLCIiKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1yO28uZW5jb2RlPXIsby5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxVdC5mcm9tKG4oZSksImJhc2U2NCIpLnRvU3RyaW5nKHQpfSxvLnRvQmFzZTY0PW4sby5mcm9tQmFzZTY0PWksby50b0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gVXQuZnJvbShuKGUpLCJiYXNlNjQiKX0sdC5kZWZhdWx0PW99KSksYnI9eXQoKGZ1bmN0aW9uKGUpe2UuZXhwb3J0cz13ci5kZWZhdWx0LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0c30pKSxfcj1mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVmYXVsdCIpP2UuZGVmYXVsdDplfSh5dCgoZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQscil7dmFyIG49e307IWZ1bmN0aW9uKGUpe2UuX19lc01vZHVsZT0hMCxlLmRpZ2VzdExlbmd0aD0zMixlLmJsb2NrU2l6ZT02NDt2YXIgdD1uZXcgVWludDMyQXJyYXkoWzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0pO2Z1bmN0aW9uIHIoZSxyLG4saSxvKXtmb3IodmFyIHMsYSx1LGMsaCxsLGYsZCxwLGcsdix5LG07bz49NjQ7KXtmb3Iocz1yWzBdLGE9clsxXSx1PXJbMl0sYz1yWzNdLGg9cls0XSxsPXJbNV0sZj1yWzZdLGQ9cls3XSxnPTA7ZzwxNjtnKyspdj1pKzQqZyxlW2ddPSgyNTUmblt2XSk8PDI0fCgyNTUmblt2KzFdKTw8MTZ8KDI1NSZuW3YrMl0pPDw4fDI1NSZuW3YrM107Zm9yKGc9MTY7Zzw2NDtnKyspeT0oKHA9ZVtnLTJdKT4+PjE3fHA8PDE1KV4ocD4+PjE5fHA8PDEzKV5wPj4+MTAsbT0oKHA9ZVtnLTE1XSk+Pj43fHA8PDI1KV4ocD4+PjE4fHA8PDE0KV5wPj4+MyxlW2ddPSh5K2VbZy03XXwwKSsobStlW2ctMTZdfDApO2ZvcihnPTA7Zzw2NDtnKyspeT0oKChoPj4+NnxoPDwyNileKGg+Pj4xMXxoPDwyMSleKGg+Pj4yNXxoPDw3KSkrKGgmbF5+aCZmKXwwKSsoZCsodFtnXStlW2ddfDApfDApfDAsbT0oKHM+Pj4yfHM8PDMwKV4ocz4+PjEzfHM8PDE5KV4ocz4+PjIyfHM8PDEwKSkrKHMmYV5zJnVeYSZ1KXwwLGQ9ZixmPWwsbD1oLGg9Yyt5fDAsYz11LHU9YSxhPXMscz15K218MDtyWzBdKz1zLHJbMV0rPWEsclsyXSs9dSxyWzNdKz1jLHJbNF0rPWgscls1XSs9bCxyWzZdKz1mLHJbN10rPWQsaSs9NjQsby09NjR9cmV0dXJuIGl9dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5kaWdlc3RMZW5ndGg9ZS5kaWdlc3RMZW5ndGgsdGhpcy5ibG9ja1NpemU9ZS5ibG9ja1NpemUsdGhpcy5zdGF0ZT1uZXcgSW50MzJBcnJheSg4KSx0aGlzLnRlbXA9bmV3IEludDMyQXJyYXkoNjQpLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDEyOCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzLnJlc2V0KCl9cmV0dXJuIHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVbMF09MTc3OTAzMzcwMyx0aGlzLnN0YXRlWzFdPTMxNDQxMzQyNzcsdGhpcy5zdGF0ZVsyXT0xMDEzOTA0MjQyLHRoaXMuc3RhdGVbM109Mjc3MzQ4MDc2Mix0aGlzLnN0YXRlWzRdPTEzNTk4OTMxMTksdGhpcy5zdGF0ZVs1XT0yNjAwODIyOTI0LHRoaXMuc3RhdGVbNl09NTI4NzM0NjM1LHRoaXMuc3RhdGVbN109MTU0MTQ1OTIyNSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXN9LHQucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmJ1ZmZlci5sZW5ndGg7ZSsrKXRoaXMuYnVmZmVyW2VdPTA7Zm9yKGU9MDtlPHRoaXMudGVtcC5sZW5ndGg7ZSsrKXRoaXMudGVtcFtlXT0wO3RoaXMucmVzZXQoKX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZS5sZW5ndGgpLHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJTSEEyNTY6IGNhbid0IHVwZGF0ZSBiZWNhdXNlIGhhc2ggd2FzIGZpbmlzaGVkLiIpO3ZhciBuPTA7aWYodGhpcy5ieXRlc0hhc2hlZCs9dCx0aGlzLmJ1ZmZlckxlbmd0aD4wKXtmb3IoO3RoaXMuYnVmZmVyTGVuZ3RoPDY0JiZ0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbbisrXSx0LS07NjQ9PT10aGlzLmJ1ZmZlckxlbmd0aCYmKHIodGhpcy50ZW1wLHRoaXMuc3RhdGUsdGhpcy5idWZmZXIsMCw2NCksdGhpcy5idWZmZXJMZW5ndGg9MCl9Zm9yKHQ+PTY0JiYobj1yKHRoaXMudGVtcCx0aGlzLnN0YXRlLGUsbix0KSx0JT02NCk7dD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW24rK10sdC0tO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuZmluaXNoZWQpe3ZhciB0PXRoaXMuYnl0ZXNIYXNoZWQsbj10aGlzLmJ1ZmZlckxlbmd0aCxpPXQvNTM2ODcwOTEyfDAsbz10PDwzLHM9dCU2NDw1Nj82NDoxMjg7dGhpcy5idWZmZXJbbl09MTI4O2Zvcih2YXIgYT1uKzE7YTxzLTg7YSsrKXRoaXMuYnVmZmVyW2FdPTA7dGhpcy5idWZmZXJbcy04XT1pPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtN109aT4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTZdPWk+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTVdPWk+Pj4wJjI1NSx0aGlzLmJ1ZmZlcltzLTRdPW8+Pj4yNCYyNTUsdGhpcy5idWZmZXJbcy0zXT1vPj4+MTYmMjU1LHRoaXMuYnVmZmVyW3MtMl09bz4+PjgmMjU1LHRoaXMuYnVmZmVyW3MtMV09bz4+PjAmMjU1LHIodGhpcy50ZW1wLHRoaXMuc3RhdGUsdGhpcy5idWZmZXIsMCxzKSx0aGlzLmZpbmlzaGVkPSEwfWZvcihhPTA7YTw4O2ErKyllWzQqYSswXT10aGlzLnN0YXRlW2FdPj4+MjQmMjU1LGVbNCphKzFdPXRoaXMuc3RhdGVbYV0+Pj4xNiYyNTUsZVs0KmErMl09dGhpcy5zdGF0ZVthXT4+PjgmMjU1LGVbNCphKzNdPXRoaXMuc3RhdGVbYV0+Pj4wJjI1NTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSx0LnByb3RvdHlwZS5fc2F2ZVN0YXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dGhpcy5zdGF0ZS5sZW5ndGg7dCsrKWVbdF09dGhpcy5zdGF0ZVt0XX0sdC5wcm90b3R5cGUuX3Jlc3RvcmVTdGF0ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj0wO3I8dGhpcy5zdGF0ZS5sZW5ndGg7cisrKXRoaXMuc3RhdGVbcl09ZVtyXTt0aGlzLmJ5dGVzSGFzaGVkPXQsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmJ1ZmZlckxlbmd0aD0wfSx0fSgpO2UuSGFzaD1uO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmlubmVyPW5ldyBuLHRoaXMub3V0ZXI9bmV3IG4sdGhpcy5ibG9ja1NpemU9dGhpcy5pbm5lci5ibG9ja1NpemUsdGhpcy5kaWdlc3RMZW5ndGg9dGhpcy5pbm5lci5kaWdlc3RMZW5ndGg7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja1NpemUpO2lmKGUubGVuZ3RoPnRoaXMuYmxvY2tTaXplKShuZXcgbikudXBkYXRlKGUpLmZpbmlzaCh0KS5jbGVhbigpO2Vsc2UgZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspdFtyXT1lW3JdO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXV49NTQ7Zm9yKHRoaXMuaW5uZXIudXBkYXRlKHQpLHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdXj0xMDY7Zm9yKHRoaXMub3V0ZXIudXBkYXRlKHQpLHRoaXMuaXN0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLm9zdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5pbm5lci5fc2F2ZVN0YXRlKHRoaXMuaXN0YXRlKSx0aGlzLm91dGVyLl9zYXZlU3RhdGUodGhpcy5vc3RhdGUpLHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdPTB9cmV0dXJuIGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLmlzdGF0ZSx0aGlzLmlubmVyLmJsb2NrU2l6ZSksdGhpcy5vdXRlci5fcmVzdG9yZVN0YXRlKHRoaXMub3N0YXRlLHRoaXMub3V0ZXIuYmxvY2tTaXplKSx0aGlzfSxlLnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5pc3RhdGUubGVuZ3RoO2UrKyl0aGlzLm9zdGF0ZVtlXT10aGlzLmlzdGF0ZVtlXT0wO3RoaXMuaW5uZXIuY2xlYW4oKSx0aGlzLm91dGVyLmNsZWFuKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbm5lci51cGRhdGUoZSksdGhpc30sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm91dGVyLmZpbmlzaGVkP3RoaXMub3V0ZXIuZmluaXNoKGUpOih0aGlzLmlubmVyLmZpbmlzaChlKSx0aGlzLm91dGVyLnVwZGF0ZShlLHRoaXMuZGlnZXN0TGVuZ3RoKS5maW5pc2goZSkpLHRoaXN9LGUucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sZX0oKTtmdW5jdGlvbiBvKGUpe3ZhciB0PShuZXcgbikudXBkYXRlKGUpLHI9dC5kaWdlc3QoKTtyZXR1cm4gdC5jbGVhbigpLHJ9ZnVuY3Rpb24gcyhlLHQpe3ZhciByPW5ldyBpKGUpLnVwZGF0ZSh0KSxuPXIuZGlnZXN0KCk7cmV0dXJuIHIuY2xlYW4oKSxufWZ1bmN0aW9uIGEoZSx0LHIsbil7dmFyIGk9blswXTtpZigwPT09aSl0aHJvdyBuZXcgRXJyb3IoImhrZGY6IGNhbm5vdCBleHBhbmQgbW9yZSIpO3QucmVzZXQoKSxpPjEmJnQudXBkYXRlKGUpLHImJnQudXBkYXRlKHIpLHQudXBkYXRlKG4pLHQuZmluaXNoKGUpLG5bMF0rK31lLkhNQUM9aSxlLmhhc2g9byxlLmRlZmF1bHQ9byxlLmhtYWM9czt2YXIgdT1uZXcgVWludDhBcnJheShlLmRpZ2VzdExlbmd0aCk7ZS5oa2RmPWZ1bmN0aW9uKGUsdCxyLG4pe3ZvaWQgMD09PXQmJih0PXUpLHZvaWQgMD09PW4mJihuPTMyKTtmb3IodmFyIG89bmV3IFVpbnQ4QXJyYXkoWzFdKSxjPXModCxlKSxoPW5ldyBpKGMpLGw9bmV3IFVpbnQ4QXJyYXkoaC5kaWdlc3RMZW5ndGgpLGY9bC5sZW5ndGgsZD1uZXcgVWludDhBcnJheShuKSxwPTA7cDxuO3ArKylmPT09bC5sZW5ndGgmJihhKGwsaCxyLG8pLGY9MCksZFtwXT1sW2YrK107cmV0dXJuIGguY2xlYW4oKSxsLmZpbGwoMCksby5maWxsKDApLGR9LGUucGJrZGYyPWZ1bmN0aW9uKGUsdCxyLG4pe2Zvcih2YXIgbz1uZXcgaShlKSxzPW8uZGlnZXN0TGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkoNCksdT1uZXcgVWludDhBcnJheShzKSxjPW5ldyBVaW50OEFycmF5KHMpLGg9bmV3IFVpbnQ4QXJyYXkobiksbD0wO2wqczxuO2wrKyl7dmFyIGY9bCsxO2FbMF09Zj4+PjI0JjI1NSxhWzFdPWY+Pj4xNiYyNTUsYVsyXT1mPj4+OCYyNTUsYVszXT1mPj4+MCYyNTUsby5yZXNldCgpLG8udXBkYXRlKHQpLG8udXBkYXRlKGEpLG8uZmluaXNoKGMpO2Zvcih2YXIgZD0wO2Q8cztkKyspdVtkXT1jW2RdO2ZvcihkPTI7ZDw9cjtkKyspe28ucmVzZXQoKSxvLnVwZGF0ZShjKS5maW5pc2goYyk7Zm9yKHZhciBwPTA7cDxzO3ArKyl1W3BdXj1jW3BdfWZvcihkPTA7ZDxzJiZsKnMrZDxuO2QrKyloW2wqcytkXT11W2RdfWZvcihsPTA7bDxzO2wrKyl1W2xdPWNbbF09MDtmb3IobD0wO2w8NDtsKyspYVtsXT0wO3JldHVybiBvLmNsZWFuKCksaH19KG4pO3ZhciBpPW4uZGVmYXVsdDtmb3IodmFyIG8gaW4gbilpW29dPW5bb107ZS5leHBvcnRzPWl9KCl9KSkpO2Z1bmN0aW9uIGtyKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gU3IoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBBcj1rcixUcj1TcjtmdW5jdGlvbiBFcihlKXtpZihBcj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigoQXI9PT1rcnx8IUFyKSYmc2V0VGltZW91dClyZXR1cm4gQXI9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiBBcihlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gQXIuY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIEFyLmNhbGwodGhpcyxlLDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIG10LnNldFRpbWVvdXQmJihBcj1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgbXQuY2xlYXJUaW1lb3V0JiYoVHI9Y2xlYXJUaW1lb3V0KTt2YXIgUnIsQ3I9W10sUHI9ITEsRHI9LTE7ZnVuY3Rpb24gT3IoKXtQciYmUnImJihQcj0hMSxSci5sZW5ndGg/Q3I9UnIuY29uY2F0KENyKTpEcj0tMSxDci5sZW5ndGgmJklyKCkpfWZ1bmN0aW9uIElyKCl7aWYoIVByKXt2YXIgZT1FcihPcik7UHI9ITA7Zm9yKHZhciB0PUNyLmxlbmd0aDt0Oyl7Zm9yKFJyPUNyLENyPVtdOysrRHI8dDspUnImJlJyW0RyXS5ydW4oKTtEcj0tMSx0PUNyLmxlbmd0aH1Scj1udWxsLFByPSExLGZ1bmN0aW9uKGUpe2lmKFRyPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKFRyPT09U3J8fCFUcikmJmNsZWFyVGltZW91dClyZXR1cm4gVHI9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7VHIoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBUci5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIFRyLmNhbGwodGhpcyxlKX19fShlKX19ZnVuY3Rpb24gVXIoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1Vci5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07dmFyIE1yPW10LnBlcmZvcm1hbmNlfHx7fSxMcj0oTXIubm93fHxNci5tb3pOb3d8fE1yLm1zTm93fHxNci5vTm93fHxNci53ZWJraXROb3csbmV3IERhdGUsZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgcj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdFtyLTFdPWFyZ3VtZW50c1tyXTtDci5wdXNoKG5ldyBVcihlLHQpKSwxIT09Q3IubGVuZ3RofHxQcnx8RXIoSXIpfSksSHI9ZnVuY3Rpb24oZSl7aWYoZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHIpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLG4uZ2V0P246e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbcl19fSl9KSksdH0oeXIpLHFyPXl0KChmdW5jdGlvbihlLHQpe3ZhciByPUhyLkJ1ZmZlcjtmdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdfWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiByKGUsdCxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1IcjoobihIcix0KSx0LkJ1ZmZlcj1pKSxuKHIsaSksaS5mcm9tPWZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gcihlLHQsbil9LGkuYWxsb2M9ZnVuY3Rpb24oZSx0LG4pe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGk9cihlKTtyZXR1cm4gdm9pZCAwIT09dD8ic3RyaW5nIj09dHlwZW9mIG4/aS5maWxsKHQsbik6aS5maWxsKHQpOmkuZmlsbCgwKSxpfSxpLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIoZSl9LGkuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIEhyLlNsb3dCdWZmZXIoZSl9fSkpLEJyPXl0KChmdW5jdGlvbihlKXt2YXIgdD02NTUzNixyPXFyLkJ1ZmZlcixuPXZ0LmNyeXB0b3x8dnQubXNDcnlwdG87biYmbi5nZXRSYW5kb21WYWx1ZXM/ZS5leHBvcnRzPWZ1bmN0aW9uKGUsaSl7aWYoZT40Mjk0OTY3Mjk1KXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIG89ci5hbGxvY1Vuc2FmZShlKTtpZihlPjApaWYoZT50KWZvcih2YXIgcz0wO3M8ZTtzKz10KW4uZ2V0UmFuZG9tVmFsdWVzKG8uc2xpY2UocyxzK3QpKTtlbHNlIG4uZ2V0UmFuZG9tVmFsdWVzKG8pO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpP0xyKChmdW5jdGlvbigpe2kobnVsbCxvKX0pKTpvfTplLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9fSkpO2NvbnN0IGpyPW5ldyBUZXh0RW5jb2Rlcix4cj1uZXcgVGV4dERlY29kZXI7dmFyIE5yPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzKXJldHVybiBnbG9iYWxUaGlzO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZilyZXR1cm4gc2VsZjtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdylyZXR1cm4gd2luZG93O3Rocm93IG5ldyBFcnJvcigidW5hYmxlIHRvIGxvY2F0ZSBnbG9iYWwgb2JqZWN0Iil9KCk7Y29uc3QgS3I9ZT0+e2xldCB0PWU7cmV0dXJuIHQgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYodD14ci5kZWNvZGUodCkpLHQ9dC5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKS5yZXBsYWNlKC9ccy9nLCIiKSxuZXcgVWludDhBcnJheShOci5hdG9iKHQpLnNwbGl0KCIiKS5tYXAoKGU9PmUuY2hhckNvZGVBdCgwKSkpKX07Y2xhc3MgRnIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0dFTkVSSUMiLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9fWNsYXNzIFlyIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoZSx0PSJ1bnNwZWNpZmllZCIscj0idW5zcGVjaWZpZWQiKXtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQiLHRoaXMuY2xhaW09dCx0aGlzLnJlYXNvbj1yfX1jbGFzcyBXciBleHRlbmRzIEZye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9fWNsYXNzIHpyIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9fWNsYXNzIEpyIGV4dGVuZHMgRnJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXU19JTlZBTElEIn19Y2xhc3MgVnIgZXh0ZW5kcyBGcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldUX0lOVkFMSUQifX1jbGFzcyAkciBleHRlbmRzIEZye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQiLHRoaXMubWVzc2FnZT0ic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQifX1jbGFzcyBHciBleHRlbmRzIFlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1RfRVhQSVJFRCJ9fXZhciBYcj1Oci5jcnlwdG87ZnVuY3Rpb24gWnIoKXtpZighTnIuaXNTZWN1cmVDb250ZXh0JiYhTnIuY3J5cHRvLnN1YnRsZSl0aHJvdyBuZXcgRnIoIldlYiBDcnlwdG9ncmFwaHkgQVBJIGlzIGF2YWlsYWJsZSBvbmx5IGluIFNlY3VyZSBDb250ZXh0cy4gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TZWN1cml0eS9TZWN1cmVfQ29udGV4dHMiKX1jb25zdCBRcj1hc3luYyBlPT57dmFyIHQscjtjb25zdHthbGdvcml0aG06bixrZXlVc2FnZXM6aX09ZnVuY3Rpb24oZSl7bGV0IHQscjtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0Ijpzd2l0Y2goZS5hbGcpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnQ9e25hbWU6IkhNQUMiLGhhc2g6YFNIQS0ke2UuYWxnLnN1YnN0cigtMyl9YH0scj1bInNpZ24iLCJ2ZXJpZnkiXTticmVhaztjYXNlIkExMjhDQkMtSFMyNTYiOmNhc2UiQTE5MkNCQy1IUzM4NCI6Y2FzZSJBMjU2Q0JDLUhTNTEyIjp0aHJvdyBuZXcgenIoYCR7ZS5hbGd9IGtleXMgY2Fubm90IGJlIGltcG9ydGVkIGFzIENyeXB0b0tleSBpbnN0YW5jZXNgKTtjYXNlIkExMjhHQ00iOmNhc2UiQTE5MkdDTSI6Y2FzZSJBMjU2R0NNIjpjYXNlIkExMjhHQ01LVyI6Y2FzZSJBMTkyR0NNS1ciOmNhc2UiQTI1NkdDTUtXIjp0PXtuYW1lOiJBRVMtR0NNIn0scj1bImVuY3J5cHQiLCJkZWNyeXB0Il07YnJlYWs7Y2FzZSJBMTI4S1ciOmNhc2UiQTE5MktXIjpjYXNlIkEyNTZLVyI6dD17bmFtZToiQUVTLUtXIn0scj1bIndyYXBLZXkiLCJ1bndyYXBLZXkiXTticmVhaztjYXNlIlBCRVMyLUhTMjU2K0ExMjhLVyI6Y2FzZSJQQkVTMi1IUzM4NCtBMTkyS1ciOmNhc2UiUEJFUzItSFM1MTIrQTI1NktXIjp0PXtuYW1lOiJQQktERjIifSxyPVsiZGVyaXZlQml0cyJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHpyKCd1bnN1cHBvcnRlZCBvciBpbnZhbGlkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIlJTQSI6c3dpdGNoKGUuYWxnKXtjYXNlIlBTMjU2IjpjYXNlIlBTMzg0IjpjYXNlIlBTNTEyIjp0PXtuYW1lOiJSU0EtUFNTIixoYXNoOmBTSEEtJHtlLmFsZy5zdWJzdHIoLTMpfWB9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6dD17bmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUiLGhhc2g6YFNIQS0ke2UuYWxnLnN1YnN0cigtMyl9YH0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTQS1PQUVQIjpjYXNlIlJTQS1PQUVQLTI1NiI6Y2FzZSJSU0EtT0FFUC0zODQiOmNhc2UiUlNBLU9BRVAtNTEyIjp0PXtuYW1lOiJSU0EtT0FFUCIsaGFzaDpgU0hBLSR7cGFyc2VJbnQoZS5hbGcuc3Vic3RyKC0zKSwxMCl8fDF9YH0scj1lLmQ/WyJkZWNyeXB0IiwidW53cmFwS2V5Il06WyJlbmNyeXB0Iiwid3JhcEtleSJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHpyKCd1bnN1cHBvcnRlZCBvciBpbnZhbGlkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIkVDIjpzd2l0Y2goZS5hbGcpe2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOmUuY3J2fSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRUNESC1FUyI6Y2FzZSJFQ0RILUVTK0ExMjhLVyI6Y2FzZSJFQ0RILUVTK0ExOTJLVyI6Y2FzZSJFQ0RILUVTK0EyNTZLVyI6dD17bmFtZToiRUNESCIsbmFtZWRDdXJ2ZTplLmNydn0scj1lLmQ/WyJkZXJpdmVCaXRzIl06W107YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgenIoJ3Vuc3VwcG9ydGVkIG9yIGludmFsaWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHpyKCd1bnN1cHBvcnRlZCBvciBpbnZhbGlkIEpXSyAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfXJldHVybnthbGdvcml0aG06dCxrZXlVc2FnZXM6cn19KGUpO2xldCBvPSJqd2siLHM9ey4uLmV9O3JldHVybiBkZWxldGUgcy5hbGcsIlBCS0RGMiI9PT1uLm5hbWUmJihvPSJyYXciLHM9S3IoZS5rKSksWnIoKSxYci5zdWJ0bGUuaW1wb3J0S2V5KG8scyxuLG51bGwhPT0odD1lLmV4dCkmJnZvaWQgMCE9PXQmJnQsbnVsbCE9PShyPWUua2V5X29wcykmJnZvaWQgMCE9PXI/cjppKX07ZnVuY3Rpb24gZW4oZSl7cmV0dXJuISFlJiZlLmNvbnN0cnVjdG9yPT09T2JqZWN0fWFzeW5jIGZ1bmN0aW9uIHRuKGUsdCxyKXtpZighZW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSldLIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodHx8KHQ9ZS5hbGcpLCJzdHJpbmciIT10eXBlb2YgdHx8IXQpdGhyb3cgbmV3IFR5cGVFcnJvcignImFsZyIgYXJndW1lbnQgaXMgcmVxdWlyZWQgd2hlbiAiandrLmFsZyIgaXMgbm90IHByZXNlbnQnKTtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0IjppZigic3RyaW5nIiE9dHlwZW9mIGUua3x8IWUuayl0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nICJrIiAoS2V5IFZhbHVlKSBQYXJhbWV0ZXIgdmFsdWUnKTtyZXR1cm4gbnVsbCE9cnx8KHI9ITAhPT1lLmV4dCkscj9Rcih7Li4uZSxhbGc6dCxleHQ6ITF9KTpLcihlLmspO2Nhc2UiUlNBIjppZih2b2lkIDAhPT1lLm90aCl0aHJvdyBuZXcgenIoJ1JTQSBKV0sgIm90aCIgKE90aGVyIFByaW1lcyBJbmZvKSBQYXJhbWV0ZXIgdmFsdWUgaXMgdW5zdXBwb3J0ZWQnKTtjYXNlIkVDIjpjYXNlIk9LUCI6cmV0dXJuIFFyKHsuLi5lLGFsZzp0fSk7ZGVmYXVsdDp0aHJvdyBuZXcgenIoJ3Vuc3VwcG9ydGVkICJrdHkiIChLZXkgVHlwZSkgUGFyYW1ldGVyIHZhbHVlJyl9fWNvbnN0IHJuPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHZvaWQgMCE9PW4uY3JpdCYmdm9pZCAwPT09ci5jcml0KXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZCcpO2lmKCFyfHx2b2lkIDA9PT1yLmNyaXQpcmV0dXJuIG5ldyBTZXQ7aWYoIUFycmF5LmlzQXJyYXkoci5jcml0KXx8MD09PXIuY3JpdC5sZW5ndGh8fHIuY3JpdC5zb21lKChlPT4ic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aCkpKXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgYW4gYXJyYXkgb2Ygbm9uLWVtcHR5IHN0cmluZ3Mgd2hlbiBwcmVzZW50Jyk7Zm9yKGNvbnN0IGkgb2Ygci5jcml0KXtpZighdC5oYXMoaSkpdGhyb3cgbmV3IHpyKGBFeHRlbnNpb24gSGVhZGVyIFBhcmFtZXRlciAiJHtpfSIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uYCk7aWYodm9pZCAwPT09bltpXSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7aX0iIGlzIG1pc3NpbmdgKTtpZih0LmdldChpKSYmdm9pZCAwPT09cltpXSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7aX0iIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZGApfXJldHVybiBuZXcgU2V0KHIuY3JpdCl9LmJpbmQodm9pZCAwLEpyLG5ldyBNYXAoW1siYjY0IiwhMF1dKSksbm49KChlLHQpPT57aWYodm9pZCAwIT09dCYmKCFBcnJheS5pc0FycmF5KHQpfHx0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZSkpKSl0aHJvdyBuZXcgVHlwZUVycm9yKGAiJHtlfSIgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nc2ApO2lmKHQpcmV0dXJuIG5ldyBTZXQodCl9KS5iaW5kKHZvaWQgMCwiYWxnb3JpdGhtcyIpO2FzeW5jIGZ1bmN0aW9uIG9uKGUsdCxyKXtpZighZW4oZSkpdGhyb3cgbmV3IEpyKCJGbGF0dGVuZWQgSldTIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodm9pZCAwPT09ZS5wcm90ZWN0ZWQmJnZvaWQgMD09PWUuaGVhZGVyKXRocm93IG5ldyBKcignRmxhdHRlbmVkIEpXUyBtdXN0IGhhdmUgZWl0aGVyIG9mIHRoZSAicHJvdGVjdGVkIiBvciAiaGVhZGVyIiBtZW1iZXJzJyk7aWYodm9pZCAwIT09ZS5wcm90ZWN0ZWQmJiJzdHJpbmciIT10eXBlb2YgZS5wcm90ZWN0ZWQpdGhyb3cgbmV3IEpyKCJKV1MgUHJvdGVjdGVkIEhlYWRlciBpbmNvcnJlY3QgdHlwZSIpO2lmKHZvaWQgMD09PWUucGF5bG9hZCl0aHJvdyBuZXcgSnIoIkpXUyBQYXlsb2FkIG1pc3NpbmciKTtpZigic3RyaW5nIiE9dHlwZW9mIGUuc2lnbmF0dXJlKXRocm93IG5ldyBKcigiSldTIFNpZ25hdHVyZSBtaXNzaW5nIG9yIGluY29ycmVjdCB0eXBlIik7aWYodm9pZCAwIT09ZS5oZWFkZXImJiFlbihlLmhlYWRlcikpdGhyb3cgbmV3IEpyKCJKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7bGV0IG49e307aWYoZS5wcm90ZWN0ZWQpe2NvbnN0IHQ9S3IoZS5wcm90ZWN0ZWQpO249SlNPTi5wYXJzZSh4ci5kZWNvZGUodCkpfWlmKCEoKC4uLmUpPT57Y29uc3QgdD1lLmZpbHRlcihCb29sZWFuKTtpZigwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aClyZXR1cm4hMDtsZXQgcjtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PU9iamVjdC5rZXlzKGUpO2lmKHImJjAhPT1yLnNpemUpZm9yKGNvbnN0IGUgb2YgdCl7aWYoci5oYXMoZSkpcmV0dXJuITE7ci5hZGQoZSl9ZWxzZSByPW5ldyBTZXQodCl9cmV0dXJuITB9KShuLGUuaGVhZGVyKSl0aHJvdyBuZXcgSnIoIkpXUyBQcm90ZWN0ZWQgYW5kIEpXUyBVbnByb3RlY3RlZCBIZWFkZXIgUGFyYW1ldGVyIG5hbWVzIG11c3QgYmUgZGlzam9pbnQiKTtjb25zdCBpPXsuLi5uLC4uLmUuaGVhZGVyfTtsZXQgbz0hMDtpZihybihuLGkpLmhhcygiYjY0IikmJihvPW4uYjY0LCJib29sZWFuIiE9dHlwZW9mIG8pKXRocm93IG5ldyBKcignVGhlICJiNjQiIChiYXNlNjR1cmwtZW5jb2RlIHBheWxvYWQpIEhlYWRlciBQYXJhbWV0ZXIgbXVzdCBiZSBhIGJvb2xlYW4nKTtjb25zdHthbGc6c309aTtpZigic3RyaW5nIiE9dHlwZW9mIHN8fCFzKXRocm93IG5ldyBKcignSldTICJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbWlzc2luZyBvciBpbnZhbGlkJyk7Y29uc3QgYT1yJiZubihyLmFsZ29yaXRobXMpO2lmKGEmJiFhLmhhcyhzKSl0aHJvdyBuZXcgV3IoJyJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbm90IGFsbG93ZWQnKTtpZihvKXtpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCl0aHJvdyBuZXcgSnIoIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmciKX1lbHNlIGlmKCJzdHJpbmciIT10eXBlb2YgZS5wYXlsb2FkJiYhKGUucGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXRocm93IG5ldyBKcigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBVaW50OEFycmF5IGluc3RhbmNlIik7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWF3YWl0IHQobixlKSksKChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8ZS5tYXRjaCgvXkFcZHszfSg/OkdDTSlLVyQvKSl7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCJzZWNyZXQiPT09dC50eXBlKXJldHVybjt0aHJvdyBuZXcgVHlwZUVycm9yKCdDcnlwdG9LZXkgb3IgS2V5T2JqZWN0IGluc3RhbmNlcyBmb3Igc3ltbWV0cmljIGFsZ29yaXRobXMgbXVzdCBiZSBvZiB0eXBlICJzZWNyZXQiJyl9aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IG9yIEtleU9iamVjdCBpbnN0YW5jZXMgbXVzdCBiZSB1c2VkIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobXMiKTtpZigic2VjcmV0Ij09PXQudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDcnlwdG9LZXkgb3IgS2V5T2JqZWN0IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3Qgbm90IGJlIG9mIHR5cGUgInNlY3JldCInKX0pKHMsdCk7Y29uc3QgdT1mdW5jdGlvbiguLi5lKXtjb25zdCB0PWUucmVkdWNlKCgoZSx7bGVuZ3RoOnR9KT0+ZSt0KSwwKSxyPW5ldyBVaW50OEFycmF5KHQpO2xldCBuPTA7cmV0dXJuIGUuZm9yRWFjaCgoZT0+e3Iuc2V0KGUsbiksbis9ZS5sZW5ndGh9KSkscn0oanIuZW5jb2RlKGUucHJvdGVjdGVkfHwiIiksanIuZW5jb2RlKCIuIiksInN0cmluZyI9PXR5cGVvZiBlLnBheWxvYWQ/anIuZW5jb2RlKGUucGF5bG9hZCk6ZS5wYXlsb2FkKSxjPUtyKGUuc2lnbmF0dXJlKTtpZighYXdhaXQoYXN5bmMoZSx0LHIsbik9PntsZXQgaTtpZihacigpLHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtpZighZS5zdGFydHNXaXRoKCJIUyIpKXRocm93IG5ldyBUeXBlRXJyb3IoInN5bW1ldHJpYyBrZXlzIGFyZSBvbmx5IGFwcGxpY2FibGUgZm9yIEhNQUMtYmFzZWQgYWxnb3JpdGhtcyIpO2k9YXdhaXQgWHIuc3VidGxlLmltcG9ydEtleSgicmF3Iix0LHtoYXNoOmBTSEEtJHtlLnN1YnN0cigtMyl9YCxuYW1lOiJITUFDIn0sITEsWyJ2ZXJpZnkiXSl9ZWxzZSBpPXQ7cmV0dXJuKChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJIUyIpKXtjb25zdCByPXBhcnNlSW50KGUuc3Vic3RyKC0zKSwxMCkse2xlbmd0aDpufT10LmFsZ29yaXRobTtpZigibnVtYmVyIiE9dHlwZW9mIG58fG48cil0aHJvdyBuZXcgVHlwZUVycm9yKGAke2V9IHJlcXVpcmVzIHN5bW1ldHJpYyBrZXlzIHRvIGJlICR7cn0gYml0cyBvciBsYXJnZXJgKX1pZihlLnN0YXJ0c1dpdGgoIlJTIil8fGUuc3RhcnRzV2l0aCgiUFMiKSl7Y29uc3R7bW9kdWx1c0xlbmd0aDpyfT10LmFsZ29yaXRobTtpZigibnVtYmVyIiE9dHlwZW9mIHJ8fHI8MjA0OCl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2V9IHJlcXVpcmVzIGtleSBtb2R1bHVzTGVuZ3RoIHRvIGJlIDIwNDggYml0cyBvciBsYXJnZXJgKX19KShlLGkpLFhyLnN1YnRsZS52ZXJpZnkoZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiSFMyNTYiOnJldHVybntoYXNoOiJTSEEtMjU2IixuYW1lOiJITUFDIn07Y2FzZSJIUzM4NCI6cmV0dXJue2hhc2g6IlNIQS0zODQiLG5hbWU6IkhNQUMifTtjYXNlIkhTNTEyIjpyZXR1cm57aGFzaDoiU0hBLTUxMiIsbmFtZToiSE1BQyJ9O2Nhc2UiUFMyNTYiOnJldHVybntoYXNoOiJTSEEtMjU2IixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOjMyfTtjYXNlIlBTMzg0IjpyZXR1cm57aGFzaDoiU0hBLTM4NCIsbmFtZToiUlNBLVBTUyIsc2FsdExlbmd0aDo0OH07Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6IlNIQS01MTIiLG5hbWU6IlJTQS1QU1MiLHNhbHRMZW5ndGg6NjR9O2Nhc2UiUlMyNTYiOnJldHVybntoYXNoOiJTSEEtMjU2IixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiUlMzODQiOnJldHVybntoYXNoOiJTSEEtMzg0IixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiUlM1MTIiOnJldHVybntoYXNoOiJTSEEtNTEyIixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiRVMyNTYiOnJldHVybntoYXNoOiJTSEEtMjU2IixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0yNTYifTtjYXNlIkVTMzg0IjpyZXR1cm57aGFzaDoiU0hBLTM4NCIsbmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMzg0In07Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6IlNIQS01MTIiLG5hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTUyMSJ9O2RlZmF1bHQ6dGhyb3cgbmV3IHpyKGBhbGcgJHtlfSBpcyB1bnN1cHBvcnRlZCBlaXRoZXIgYnkgSk9TRSBvciB5b3VyIGphdmFzY3JpcHQgcnVudGltZWApfX0oZSksaSxyLG4pfSkocyx0LGMsdSkpdGhyb3cgbmV3ICRyO2xldCBoO2g9bz9LcihlLnBheWxvYWQpOiJzdHJpbmciPT10eXBlb2YgZS5wYXlsb2FkP2pyLmVuY29kZShlLnBheWxvYWQpOmUucGF5bG9hZDtjb25zdCBsPXtwYXlsb2FkOmh9O3JldHVybiB2b2lkIDAhPT1lLnByb3RlY3RlZCYmKGwucHJvdGVjdGVkSGVhZGVyPW4pLHZvaWQgMCE9PWUuaGVhZGVyJiYobC51bnByb3RlY3RlZEhlYWRlcj1lLmhlYWRlciksbH1jb25zdCBzbj0vXihcZCt8XGQrXC5cZCspID8oc2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KSQvaTt2YXIgYW49ZT0+e2NvbnN0IHQ9c24uZXhlYyhlKTtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnZhbGlkIHRpbWUgcGVyaW9kIGZvcm1hdCIpO2NvbnN0IHI9cGFyc2VGbG9hdCh0WzFdKTtzd2l0Y2godFsyXS50b0xvd2VyQ2FzZSgpKXtjYXNlInNlYyI6Y2FzZSJzZWNzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNvbmRzIjpjYXNlInMiOnJldHVybiBNYXRoLnJvdW5kKHIpO2Nhc2UibWludXRlIjpjYXNlIm1pbnV0ZXMiOmNhc2UibWluIjpjYXNlIm1pbnMiOmNhc2UibSI6cmV0dXJuIE1hdGgucm91bmQoNjAqcik7Y2FzZSJob3VyIjpjYXNlImhvdXJzIjpjYXNlImhyIjpjYXNlImhycyI6Y2FzZSJoIjpyZXR1cm4gTWF0aC5yb3VuZCgzNjAwKnIpO2Nhc2UiZGF5IjpjYXNlImRheXMiOmNhc2UiZCI6cmV0dXJuIE1hdGgucm91bmQoODY0MDAqcik7Y2FzZSJ3ZWVrIjpjYXNlIndlZWtzIjpjYXNlInciOnJldHVybiBNYXRoLnJvdW5kKDYwNDgwMCpyKTtkZWZhdWx0OnJldHVybiBNYXRoLnJvdW5kKDMxNTU3NjAwKnIpfX07Y29uc3QgdW49ZT0+ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15hcHBsaWNhdGlvblwvLywiIik7dmFyIGNuPShlLHQscj17fSk9Pntjb25zdHt0eXA6bn09cjtpZihuJiYoInN0cmluZyIhPXR5cGVvZiBlLnR5cHx8dW4oZS50eXApIT09dW4obikpKXRocm93IG5ldyBZcigndW5leHBlY3RlZCAidHlwIiBKV1QgaGVhZGVyIHZhbHVlJywidHlwIiwiY2hlY2tfZmFpbGVkIik7bGV0IGk7dHJ5e2k9SlNPTi5wYXJzZSh4ci5kZWNvZGUodCkpfWNhdGNoKGUpe31pZigib2JqZWN0IiE9dHlwZW9mIGl8fCFpfHxBcnJheS5pc0FycmF5KGkpKXRocm93IG5ldyBWcigiSldUIENsYWltcyBTZXQgbXVzdCBiZSBhIHRvcC1sZXZlbCBKU09OIG9iamVjdCIpO2NvbnN0e2lzc3VlcjpvfT1yO2lmKG8mJiEoInN0cmluZyI9PXR5cGVvZiBvP1tvXTpvKS5pbmNsdWRlcyhpLmlzcykpdGhyb3cgbmV3IFlyKCd1bmV4cGVjdGVkICJpc3MiIGNsYWltIHZhbHVlJywiaXNzIiwiY2hlY2tfZmFpbGVkIik7Y29uc3R7c3ViamVjdDpzfT1yO2lmKHMmJmkuc3ViIT09cyl0aHJvdyBuZXcgWXIoJ3VuZXhwZWN0ZWQgInN1YiIgY2xhaW0gdmFsdWUnLCJzdWIiLCJjaGVja19mYWlsZWQiKTtjb25zdHthdWRpZW5jZTphfT1yO2lmKGEmJihjPSJzdHJpbmciPT10eXBlb2YgYT9bYV06YSwhKCJzdHJpbmciPT10eXBlb2YodT1pLmF1ZCk/Yy5pbmNsdWRlcyh1KTpjLnNvbWUoU2V0LnByb3RvdHlwZS5oYXMuYmluZChuZXcgU2V0KHUpKSkpKSl0aHJvdyBuZXcgWXIoJ3VuZXhwZWN0ZWQgImF1ZCIgY2xhaW0gdmFsdWUnLCJhdWQiLCJjaGVja19mYWlsZWQiKTt2YXIgdSxjO2xldCBoO3N3aXRjaCh0eXBlb2Ygci5jbG9ja1RvbGVyYW5jZSl7Y2FzZSJzdHJpbmciOmg9YW4oci5jbG9ja1RvbGVyYW5jZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmg9ci5jbG9ja1RvbGVyYW5jZTticmVhaztjYXNlInVuZGVmaW5lZCI6aD0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiaW52YWxpZCBjbG9ja1RvbGVyYW5jZSBvcHRpb24gdHlwZSIpfWNvbnN0e2N1cnJlbnREYXRlOmx9PXIsZj0oZD1sfHxuZXcgRGF0ZSxNYXRoLmZsb29yKGQuZ2V0VGltZSgpLzFlMykpO3ZhciBkO2lmKHZvaWQgMCE9PWkuaWF0fHxyLm1heFRva2VuQWdlKXtpZigibnVtYmVyIiE9dHlwZW9mIGkuaWF0KXRocm93IG5ldyBZcignImlhdCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImlhdCIsImludmFsaWQiKTtpZih2b2lkIDA9PT1pLmV4cCYmaS5pYXQ+ZitoKXRocm93IG5ldyBZcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAoaXQgc2hvdWxkIGJlIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpfWlmKHZvaWQgMCE9PWkubmJmKXtpZigibnVtYmVyIiE9dHlwZW9mIGkubmJmKXRocm93IG5ldyBZcignIm5iZiIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsIm5iZiIsImludmFsaWQiKTtpZihpLm5iZj5mK2gpdGhyb3cgbmV3IFlyKCcibmJmIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywibmJmIiwiY2hlY2tfZmFpbGVkIil9aWYodm9pZCAwIT09aS5leHApe2lmKCJudW1iZXIiIT10eXBlb2YgaS5leHApdGhyb3cgbmV3IFlyKCciZXhwIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiZXhwIiwiaW52YWxpZCIpO2lmKGkuZXhwPD1mLWgpdGhyb3cgbmV3IEdyKCciZXhwIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywiZXhwIiwiY2hlY2tfZmFpbGVkIil9aWYoci5tYXhUb2tlbkFnZSl7Y29uc3QgZT1mLWkuaWF0O2lmKGUtaD4oIm51bWJlciI9PXR5cGVvZiByLm1heFRva2VuQWdlP3IubWF4VG9rZW5BZ2U6YW4oci5tYXhUb2tlbkFnZSkpKXRocm93IG5ldyBHcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAodG9vIGZhciBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKTtpZihlPDAtaCl0aHJvdyBuZXcgWXIoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKGl0IHNob3VsZCBiZSBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKX1yZXR1cm4gaX07Y2xhc3MgaG57Y29uc3RydWN0b3IoKXt9c3RhdGljIGJhc2U2NFVSTEVuY29kZShlKXtyZXR1cm4gYnIuZW5jb2RlKGUpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPS9nLCIiKX1zdGF0aWMgZ2V0Q29kZVZlcmlmaWVyKCl7cmV0dXJuIHRoaXMuYmFzZTY0VVJMRW5jb2RlKEJyKDMyKSl9c3RhdGljIGdldENvZGVDaGFsbGVuZ2UoZSl7cmV0dXJuIHRoaXMuYmFzZTY0VVJMRW5jb2RlKG5ldyBnKF9yKChuZXcgVGV4dEVuY29kZXIpLmVuY29kZShlKSkpKX1zdGF0aWMgZ2V0U3VwcG9ydGVkU2lnbmF0dXJlQWxnb3JpdGhtcygpe3JldHVyblsiUlMyNTYiLCJSUzUxMiIsIlJTMzg0IiwiUFMyNTYiXX1zdGF0aWMgZ2V0SldLRm9yVGhlSWRUb2tlbihlLHQpe2NvbnN0IHI9SlNPTi5wYXJzZShici5kZWNvZGUoZSwidXRmOCIpKTtmb3IoY29uc3QgZSBvZiB0KWlmKHIua2lkPT09ZS5raWQpcmV0dXJuIHRuKHthbGc6ZS5hbGcsZTplLmUsa3R5OmUua3R5LG46ZS5ufSk7cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQ1JZUFRPX1VUSUwtR1RGVElULUlWMDEiLCJjcnlwdG8tdXRpbHMiLCJnZXRKV0tGb3JUaGVJZFRva2VuIiwia2lkIG5vdCBmb3VuZC4iLCJGYWlsZWQgdG8gZmluZCB0aGUgJ2tpZCcgc3BlY2lmaWVkIGluIHRoZSBpZF90b2tlbi4gJ2tpZCcgZm91bmQgaW4gdGhlIGhlYWRlciA6ICIrci5raWQrIiwgRXhwZWN0ZWQgdmFsdWVzOiAiK3QubWFwKChlPT5lLmtpZCkpLmpvaW4oIiwgIikpKX1zdGF0aWMgaXNWYWxpZElkVG9rZW4oZSx0LHIsbixpLG8pe3JldHVybiBhc3luYyBmdW5jdGlvbihlLHQscil7Y29uc3Qgbj1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQscil7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJihlPXhyLmRlY29kZShlKSksInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBKcigiQ29tcGFjdCBKV1MgbXVzdCBiZSBhIHN0cmluZyBvciBVaW50OEFycmF5Iik7Y29uc3R7MDpuLDE6aSwyOm8sbGVuZ3RoOnN9PWUuc3BsaXQoIi4iKTtpZigzIT09cyl0aHJvdyBuZXcgSnIoIkludmFsaWQgQ29tcGFjdCBKV1MiKTtjb25zdCBhPWF3YWl0IG9uKHtwYXlsb2FkOml8fHZvaWQgMCxwcm90ZWN0ZWQ6bnx8dm9pZCAwLHNpZ25hdHVyZTpvfHx2b2lkIDB9LHQscik7cmV0dXJue3BheWxvYWQ6YS5wYXlsb2FkLHByb3RlY3RlZEhlYWRlcjphLnByb3RlY3RlZEhlYWRlcn19KGUsdCxyKTtyZXR1cm57cGF5bG9hZDpjbihuLnByb3RlY3RlZEhlYWRlcixuLnBheWxvYWQscikscHJvdGVjdGVkSGVhZGVyOm4ucHJvdGVjdGVkSGVhZGVyfX0oZSx0LHthbGdvcml0aG1zOnRoaXMuZ2V0U3VwcG9ydGVkU2lnbmF0dXJlQWxnb3JpdGhtcygpLGF1ZGllbmNlOnIsY2xvY2tUb2xlcmFuY2U6byxpc3N1ZXI6bixzdWJqZWN0Oml9KS50aGVuKCgoKT0+UHJvbWlzZS5yZXNvbHZlKCEwKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgcHQoIkNSWVBUT19VVElMLUlWSVQtSVYwMiIsImNyeXB0by11dGlscyIsImlzVmFsaWRJZFRva2VuIiwiVmFsaWRhdGluZyBJRCB0b2tlbiBmYWlsZWQiLGUpKSkpfXN0YXRpYyBkZWNvZGVJRFRva2VuKGUpe3RyeXtjb25zdCB0PWJyLmRlY29kZShlLnNwbGl0KCIuIilbMV0sInV0ZjgiKTtyZXR1cm4gSlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgcHQoIkNSWVBUT19VVElMLURJVC1JVjAxIiwiY3J5cHRvLXV0aWxzIiwiZGVjb2RlSURUb2tlbiIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19Y2xhc3MgbG57Y29uc3RydWN0b3IoKXt9c3RhdGljIGdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhlKXt2YXIgdCxyLG47Y29uc3QgaT1obi5kZWNvZGVJRFRva2VuKGUpLG89dGhpcy5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQoaSkscz10aGlzLmV4dHJhY3RVc2VyTmFtZShpKSxhPW51bGwhPT0odD1pLmdpdmVuX25hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsdT1udWxsIT09KHI9aS5mYW1pbHlfbmFtZSkmJnZvaWQgMCE9PXI/cjoiIixjPWEmJnU/YCR7YX0gJHt1fWA6YXx8dXx8IiIsaD1udWxsIT09KG49aS5wcmVmZXJyZWRfdXNlcm5hbWUpJiZ2b2lkIDAhPT1uP246YztyZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGlzcGxheU5hbWU6aCx0ZW5hbnREb21haW46byx1c2VybmFtZTpzfSx0aGlzLmZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZChpKSl9c3RhdGljIGZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZChlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7bnVsbD09dHx8ZGVsZXRlIHQuaXNzLG51bGw9PXR8fGRlbGV0ZSB0LnN1YixudWxsPT10fHxkZWxldGUgdC5hdWQsbnVsbD09dHx8ZGVsZXRlIHQuZXhwLG51bGw9PXR8fGRlbGV0ZSB0LmlhdCxudWxsPT10fHxkZWxldGUgdC5hY3IsbnVsbD09dHx8ZGVsZXRlIHQuYW1yLG51bGw9PXR8fGRlbGV0ZSB0LmF6cCxudWxsPT10fHxkZWxldGUgdC5hdXRoX3RpbWUsbnVsbD09dHx8ZGVsZXRlIHQubm9uY2UsbnVsbD09dHx8ZGVsZXRlIHQuY19oYXNoLG51bGw9PXR8fGRlbGV0ZSB0LmF0X2hhc2gsbnVsbD09dHx8ZGVsZXRlIHQubmJmLG51bGw9PXR8fGRlbGV0ZSB0LmlzayxudWxsPT10fHxkZWxldGUgdC5zaWQ7Y29uc3Qgcj17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFtlLHRdKT0+e2NvbnN0IG49ZS5zcGxpdCgiXyIpLm1hcCgoKGUsdCk9PjA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKSwuLi5lLnNsaWNlKDEpXS5qb2luKCIiKSkpLmpvaW4oIiIpO3Jbbl09dH0pKSxyfXN0YXRpYyBnZXRUb2tlblJlcXVlc3RIZWFkZXJzKCl7cmV0dXJue0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9fX1sbi5leHRyYWN0VXNlck5hbWU9KGUsdD0iQCIpPT57Y29uc3Qgcj1lLnN1Yi5zcGxpdCh0KTtyZXR1cm4gci5sZW5ndGg+MiYmci5wb3AoKSxyLmpvaW4odCl9LGxuLmdldFRlbmFudERvbWFpbkZyb21JZFRva2VuUGF5bG9hZD0oZSx0PSJAIik9Pntjb25zdCByPWUuc3ViLnNwbGl0KHQpO3JldHVybiByLmxlbmd0aD4yP3Jbci5sZW5ndGgtMV06IiJ9O2NsYXNzIGZue2NvbnN0cnVjdG9yKGUpe3RoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCl9KSl9cmVzb2x2ZVdlbGxLbm93bkVuZHBvaW50KCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9jb25maWcoKTtyZXR1cm4gZS53ZWxsS25vd25FbmRwb2ludD9lLnNlcnZlck9yaWdpbitlLndlbGxLbm93bkVuZHBvaW50OmUuc2VydmVyT3JpZ2luKyIvb2F1dGgyL3Rva2VuLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0pKX1yZXNvbHZlRW5kcG9pbnRzKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9e30scj15aWVsZCB0aGlzLl9jb25maWcoKTtyZXR1cm4gci5vdmVycmlkZVdlbGxFbmRwb2ludENvbmZpZyYmci5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHIuZW5kcG9pbnRzKS5mb3JFYWNoKChlPT57Y29uc3Qgbj1lLnJlcGxhY2UoL1tBLVpdL2csKGU9PmBfJHtlLnRvTG93ZXJDYXNlKCl9YCkpO3Rbbl09KG51bGw9PXI/dm9pZCAwOnIuZW5kcG9pbnRzKT9yLmVuZHBvaW50c1tlXToiIn0pKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSksdCl9KSl9cmVzb2x2ZUZhbGxiYWNrRW5kcG9pbnRzKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpO3QuZW5kcG9pbnRzJiZPYmplY3Qua2V5cyh0LmVuZHBvaW50cykuZm9yRWFjaCgocj0+e2NvbnN0IG49ci5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTtlW25dPShudWxsPT10P3ZvaWQgMDp0LmVuZHBvaW50cyk/dC5lbmRwb2ludHNbcl06IiJ9KSk7Y29uc3Qgcj17YXV0aG9yaXphdGlvbl9lbmRwb2ludDp0LnNlcnZlck9yaWdpbisiL29hdXRoMi9hdXRob3JpemUiLGVuZF9zZXNzaW9uX2VuZHBvaW50OnQuc2VydmVyT3JpZ2luKyIvb2lkYy9sb2dvdXQiLGp3a3NfdXJpOnQuc2VydmVyT3JpZ2luKyIvb2F1dGgyL2p3a3MiLGNoZWNrX3Nlc3Npb25faWZyYW1lOnQuc2VydmVyT3JpZ2luKyIvb2lkYy9jaGVja3Nlc3Npb24iLHJldm9jYXRpb25fZW5kcG9pbnQ6dC5zZXJ2ZXJPcmlnaW4rIi9vYXV0aDIvcmV2b2tlIix0b2tlbl9lbmRwb2ludDp0LnNlcnZlck9yaWdpbisiL29hdXRoMi90b2tlbiJ9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkscil9KSl9dmFsaWRhdGVJZFRva2VuKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpKS5qd2tzX3VyaSxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO3JldHVybiB0JiYwIT09dC50cmltKCkubGVuZ3RoP2h0LmdldCh0LHt3aXRoQ3JlZGVudGlhbHM6bnVsbD09cj92b2lkIDA6ci5zZW5kQ29va2llc0luUmVxdWVzdHN9KS50aGVuKCh0PT5sdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKDIwMCE9PXQuc3RhdHVzKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgcHQoIkFVVEhfSEVMUEVSLVZJVC1OUjAyIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIGp3a3MgcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyByZXR1cm5lZCAiK3Quc3RhdHVzKyIgLCB3aGljaCBpcyBpbnZhbGlkLiIpKTtjb25zdCByPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5pc3N1ZXIsbj0oeWllbGQgdGhpcy5yZXNvbHZlV2VsbEtub3duRW5kcG9pbnQoKSkuc3BsaXQoIi8ud2VsbC1rbm93biIpWzBdO3JldHVybiByJiZyPT09bj9obi5nZXRKV0tGb3JUaGVJZFRva2VuKGUuc3BsaXQoIi4iKVswXSx0LmRhdGEua2V5cykudGhlbigodD0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gaG4uaXNWYWxpZElkVG9rZW4oZSx0LCh5aWVsZCB0aGlzLl9jb25maWcoKSkuY2xpZW50SUQscixsbi5nZXRBdXRoZW50aWNhdGVkVXNlckluZm8oZSkudXNlcm5hbWUsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSkudGhlbigoZT0+ZSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgcHQoIkFVVEhfSEVMUEVSLVZJVC1FUzAzIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIix2b2lkIDAsdm9pZCAwLGUpKSkpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9IRUxQRVItVklULUVTMDQiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSk6UHJvbWlzZS5yZXNvbHZlKCExKX0pKSkpLmNhdGNoKChlPT57dmFyIHQscixuO3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgZ3QoIkFVVEhfSEVMUEVSLVZJVC1OUjA1IiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIiwiUmVxdWVzdCB0byBqd2tzIGVuZHBvaW50IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZGF0YSkpfSkpOlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9IRUxQRVItVklULU5GMDEiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLCJKV0tTIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBKV0tTIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIEpXS1MgZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIikpfSkpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlKXt2YXIgdDtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgcj0ib3BlbmlkIjtjb25zdCBuPXlpZWxkIHRoaXMuX2NvbmZpZygpLGk9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7cmV0dXJuIG4uc2NvcGUmJm4uc2NvcGUubGVuZ3RoPjAmJihuLnNjb3BlLmluY2x1ZGVzKCJvcGVuaWQiKXx8bi5zY29wZS5wdXNoKCJvcGVuaWQiKSxyPW4uc2NvcGUuam9pbigiICIpKSxlLnJlcGxhY2UoInt7dG9rZW59fSIsaS5hY2Nlc3NfdG9rZW4pLnJlcGxhY2UoInt7dXNlcm5hbWV9fSIsbG4uZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKGkuaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLHIpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsbi5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PSh0PW4uY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09dD90OiIiKX0pKX1jbGVhclVzZXJTZXNzaW9uRGF0YSgpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVNlc3Npb25EYXRhKCl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT1lLnN0YXR1cylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0hFTFBFUi1IVFItTlIwMSIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLCJJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgdG9rZW4gcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgdG9rZW4gcmV0dXJuZWQgIitlLnN0YXR1cysiICwgd2hpY2ggaXMgaW52YWxpZC4iKSk7aWYoKHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW4pcmV0dXJuIHRoaXMudmFsaWRhdGVJZFRva2VuKGUuZGF0YS5pZF90b2tlbikudGhlbigodD0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih0KXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoZS5kYXRhKTtjb25zdCB0PXthY2Nlc3NUb2tlbjplLmRhdGEuYWNjZXNzX3Rva2VuLGV4cGlyZXNJbjplLmRhdGEuZXhwaXJlc19pbixpZFRva2VuOmUuZGF0YS5pZF90b2tlbixyZWZyZXNoVG9rZW46ZS5kYXRhLnJlZnJlc2hfdG9rZW4sc2NvcGU6ZS5kYXRhLnNjb3BlLHRva2VuVHlwZTplLmRhdGEudG9rZW5fdHlwZX07cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KX1yZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0hFTFBFUi1IVFItSVYwMiIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLCJUaGUgaWQgdG9rZW4gcmV0dXJuZWQgaXMgbm90IHZhbGlkLiIsIlRoZSBpZCB0b2tlbiByZXR1cm5lZCBoYXMgZmFpbGVkIHRoZSB2YWxpZGF0aW9uIGNoZWNrLiIpKX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgcHQoIkFVVEhfSEVMUEVSLUhBVC1FUzAzIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwiaGFuZGxlVG9rZW5SZXNwb25zZSIsdm9pZCAwLHZvaWQgMCxlKSkpKTt7Y29uc3QgdD17YWNjZXNzVG9rZW46ZS5kYXRhLmFjY2Vzc190b2tlbixleHBpcmVzSW46ZS5kYXRhLmV4cGlyZXNfaW4saWRUb2tlbjplLmRhdGEuaWRfdG9rZW4scmVmcmVzaFRva2VuOmUuZGF0YS5yZWZyZXNoX3Rva2VuLHNjb3BlOmUuZGF0YS5zY29wZSx0b2tlblR5cGU6ZS5kYXRhLnRva2VuX3R5cGV9O3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEoZS5kYXRhKSxQcm9taXNlLnJlc29sdmUodCl9fSkpfX1jbGFzcyBkbntjb25zdHJ1Y3RvcihlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlcj1uZXcgZm4oZSksdGhpcy5fZGF0YUxheWVyPWUsdGhpcy5fY29uZmlnPSgpPT5sdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT5sdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iikscj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgcHQoIkFVVEhfQ09SRS1HQVUtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRBdXRob3JpemF0aW9uVVJMIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCBmb3VuZC4iLCJObyBhdXRob3JpemF0aW9uIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgZnJvbSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgYXV0aG9yaXphdGlvbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBuPW5ldyBVUkwodCk7bi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZXNwb25zZV90eXBlIiwiY29kZSIpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY2xpZW50X2lkIixyLmNsaWVudElEKTtsZXQgaT0ib3BlbmlkIjtpZihyLnNjb3BlJiZyLnNjb3BlLmxlbmd0aD4wJiYoci5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHIuc2NvcGUucHVzaCgib3BlbmlkIiksaT1yLnNjb3BlLmpvaW4oIiAiKSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJzY29wZSIsaSksbi5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZWRpcmVjdF91cmkiLHIuc2lnbkluUmVkaXJlY3RVUkwpLHIucmVzcG9uc2VNb2RlJiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoInJlc3BvbnNlX21vZGUiLHIucmVzcG9uc2VNb2RlKSxyLmVuYWJsZVBLQ0Upe2NvbnN0IGU9aG4uZ2V0Q29kZVZlcmlmaWVyKCksdD1obi5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiLGUpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwiUzI1NiIpLG4uc2VhcmNoUGFyYW1zLmFwcGVuZCgiY29kZV9jaGFsbGVuZ2UiLHQpfXIucHJvbXB0JiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoInByb21wdCIsci5wcm9tcHQpO2NvbnN0IG89ZTtpZihvKWZvcihjb25zdFtlLHRdb2YgT2JqZWN0LmVudHJpZXMobykpIiIhPWUmJiIiIT10JiZuLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0LnRvU3RyaW5nKCkpO3JldHVybiBuLnRvU3RyaW5nKCl9KSl9cmVxdWVzdEFjY2Vzc1Rva2VuKGUsdCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighcnx8MD09PXIudHJpbSgpLmxlbmd0aClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0NPUkUtUkFUMS1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RBY2Nlc3NUb2tlbiIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7dCYmKHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCkpO2NvbnN0IGk9W107aS5wdXNoKGBjbGllbnRfaWQ9JHtuLmNsaWVudElEfWApLG4uY2xpZW50U2VjcmV0JiZuLmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJmkucHVzaChgY2xpZW50X3NlY3JldD0ke24uY2xpZW50U2VjcmV0fWApO2NvbnN0IG89ZTtyZXR1cm4gaS5wdXNoKGBjb2RlPSR7b31gKSxpLnB1c2goImdyYW50X3R5cGU9YXV0aG9yaXphdGlvbl9jb2RlIiksaS5wdXNoKGByZWRpcmVjdF91cmk9JHtuLnNpZ25JblJlZGlyZWN0VVJMfWApLG4uZW5hYmxlUEtDRSYmKGkucHVzaChgY29kZV92ZXJpZmllcj0ke3lpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiKX1gKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlVGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigicGtjZV9jb2RlX3ZlcmlmaWVyIikpLGh0LnBvc3QocixpLmpvaW4oIiYiKSx7aGVhZGVyczpsbi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOm4uc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShlKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDEtRVMwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXF1ZXN0QWNjZXNzVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGd0KCJBVVRIX0NPUkUtUkFUMS1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RBY2Nlc3NUb2tlbiIsIlJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCIsIlRoZSByZXF1ZXN0IHRvIGdldCB0aGUgYWNjZXNzIHRva2VuIGZyb20gdGhlIHNlcnZlciBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsdD15aWVsZCB0aGlzLl9jb25maWcoKSxyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpO2lmKCFyLnJlZnJlc2hfdG9rZW4pcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDItTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLCJObyByZWZyZXNoIHRva2VuIGZvdW5kLiIsIlRoZXJlIHdhcyBubyByZWZyZXNoIHRva2VuIGZvdW5kLiBUaGUgaWRlbnRpdHkgc2VydmVyIGRvZXNuJ3QgcmV0dXJuIGEgcmVmcmVzaCB0b2tlbiBpZiB0aGUgcmVmcmVzaCB0b2tlbiBncmFudCBpcyBub3QgZW5hYmxlZC4iKSk7aWYoIWV8fDA9PT1lLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDItTkYwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IGZvdW5kLiIsIk5vIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgd2FzIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7Y29uc3Qgbj1bXTtyZXR1cm4gbi5wdXNoKGBjbGllbnRfaWQ9JHt0LmNsaWVudElEfWApLG4ucHVzaChgcmVmcmVzaF90b2tlbj0ke3IucmVmcmVzaF90b2tlbn1gKSxuLnB1c2goImdyYW50X3R5cGU9cmVmcmVzaF90b2tlbiIpLHQuY2xpZW50U2VjcmV0JiZ0LmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJm4ucHVzaChgY2xpZW50X3NlY3JldD0ke3QuY2xpZW50U2VjcmV0fWApLGh0LnBvc3QoZSxuLmpvaW4oIiYiKSx7aGVhZGVyczpsbi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOnQuc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShlKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDItRVMwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGd0KCJBVVRIX0NPUkUtUkFUMi1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlZnJlc2hBY2Nlc3NUb2tlbiIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsIlRoZSByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmV2b2tlQWNjZXNzVG9rZW4oKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5yZXZvY2F0aW9uX2VuZHBvaW50LHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWV8fDA9PT1lLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJBVDMtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXZva2VBY2Nlc3NUb2tlbiIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpKTtjb25zdCByPVtdO3JldHVybiByLnB1c2goYGNsaWVudF9pZD0ke3QuY2xpZW50SUR9YCksci5wdXNoKGB0b2tlbj0keyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSkuYWNjZXNzX3Rva2VufWApLHIucHVzaCgidG9rZW5fdHlwZV9oaW50PWFjY2Vzc190b2tlbiIpLGh0LnBvc3QoZSxyLmpvaW4oIiYiKSx7aGVhZGVyczpsbi5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCksd2l0aENyZWRlbnRpYWxzOnQuc2VuZENvb2tpZXNJblJlcXVlc3RzfSkudGhlbigoZT0+MjAwIT09ZS5zdGF0dXM/UHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0NPUkUtUkFUMy1OUjAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHJldm9rZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIHJldHVybmVkICIrZS5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOih0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YSgpLFByb21pc2UucmVzb2x2ZShlKSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGd0KCJBVVRIX0NPUkUtUkFUMy1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwiVGhlIHJlcXVlc3QgdG8gcmV2b2tlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5kYXRhKSl9KSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO2xldCBuO2lmKG49ZS50b2tlbkVuZHBvaW50JiYwIT09ZS50b2tlbkVuZHBvaW50LnRyaW0oKS5sZW5ndGg/ZS50b2tlbkVuZHBvaW50OnQudG9rZW5fZW5kcG9pbnQsIW58fDA9PT1uLnRyaW0oKS5sZW5ndGgpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJDRy1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7Y29uc3QgaT17ZGF0YTooeWllbGQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXMoZS5kYXRhKS5tYXAoKChbZSx0XSk9Pmx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXBsYWNlQ3VzdG9tR3JhbnRUZW1wbGF0ZVRhZ3ModCk7cmV0dXJuYCR7ZX09JHtyfWB9KSkpKSkpLmpvaW4oIiYiKSxoZWFkZXJzOk9iamVjdC5hc3NpZ24oe30sbG4uZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QiLHVybDpuLHdpdGhDcmVkZW50aWFsczpyLnNlbmRDb29raWVzSW5SZXF1ZXN0c307cmV0dXJuIGUuYXR0YWNoVG9rZW4mJihpLmhlYWRlcnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkuaGVhZGVycykse0F1dGhvcml6YXRpb246YEJlYXJlciAkeyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSkuYWNjZXNzX3Rva2VufWB9KSksaHQoaSkudGhlbigodD0+MjAwIT09dC5zdGF0dXM/UHJvbWlzZS5yZWplY3QobmV3IHB0KCJBVVRIX0NPUkUtUkNHLU5SMDIiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXN0b20gZ3JhbnQgcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IHJldHVybmVkICIrdC5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOmUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZSh0KS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLVJDRy1FUzAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsdm9pZCAwLHZvaWQgMCxlKSkpKTpQcm9taXNlLnJlc29sdmUodCkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGd0KCJBVVRIX0NPUkUtUkNHLU5SMDQiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiVGhlIGN1c3RvbSBncmFudCByZXF1ZXN0IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iLG51bGwhPT0odD1udWxsPT1lP3ZvaWQgMDplLmNvZGUpJiZ2b2lkIDAhPT10P3Q6IiIsbnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlLG51bGw9PT0ocj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09cj92b2lkIDA6ci5zdGF0dXMsbnVsbD09PShuPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmRhdGEpKX0pKX0pKX1nZXRCYXNpY1VzZXJJbmZvKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSx0PWxuLmdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhudWxsPT1lP3ZvaWQgMDplLmlkX3Rva2VuKTtsZXQgcj17YWxsb3dlZFNjb3BlczplLnNjb3BlLHNlc3Npb25TdGF0ZTplLnNlc3Npb25fc3RhdGUsdXNlcm5hbWU6dC51c2VybmFtZX07cmV0dXJuIHQuZGlzcGxheU5hbWUmJiIiIT09dC5kaXNwbGF5TmFtZXx8ZGVsZXRlIHQuZGlzcGxheU5hbWUsdC50ZW5hbnREb21haW4mJiIiIT09dC50ZW5hbnREb21haW58fGRlbGV0ZSB0LnRlbmFudERvbWFpbixyPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSx0KSxyfSkpfWdldERlY29kZWRJRFRva2VuKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpLmlkX3Rva2VuO3JldHVybiBobi5kZWNvZGVJRFRva2VuKGUpfSkpfWdldElEVG9rZW4oKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpLmlkX3Rva2VufSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKCFlJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMCk7Y29uc3QgdD15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlV2VsbEtub3duRW5kcG9pbnQoKTtyZXR1cm4gaHQuZ2V0KHQpLnRoZW4oKGU9Pmx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIDIwMCE9PWUuc3RhdHVzP1Byb21pc2UucmVqZWN0KG5ldyBwdCgiQVVUSF9DT1JFLUdPUE0tTlIwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRPSURDUHJvdmlkZXJNZXRhRGF0YSIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXF1ZXN0LiIsIlRoZSByZXF1ZXN0IHNlbnQgdG8gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgdG8gZ2V0IHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCAiK2Uuc3RhdHVzKyIgLCB3aGljaCBpcyBpbnZhbGlkLiIpKTooeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldE9JRENQcm92aWRlck1ldGFEYXRhKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVFbmRwb2ludHMoZS5kYXRhKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoITApKX0pKSkpLmNhdGNoKCgoKT0+bHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldE9JRENQcm92aWRlck1ldGFEYXRhKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVGYWxsYmFja0VuZHBvaW50cygpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSghMCl9KSkpKX0pKX1nZXRPSURDU2VydmljZUVuZHBvaW50cygpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtyZXR1cm57YXV0aG9yaXphdGlvbkVuZHBvaW50OmUuYXV0aG9yaXphdGlvbl9lbmRwb2ludCxjaGVja1Nlc3Npb25JZnJhbWU6ZS5jaGVja19zZXNzaW9uX2lmcmFtZSxlbmRTZXNzaW9uRW5kcG9pbnQ6ZS5lbmRfc2Vzc2lvbl9lbmRwb2ludCxpbnRyb3NwZWN0aW9uRW5kcG9pbnQ6ZS5pbnRyb3NwZWN0aW9uX2VuZHBvaW50LGlzc3VlcjplLmlzc3Vlcixqd2tzVXJpOmUuandrc191cmkscmVnaXN0cmF0aW9uRW5kcG9pbnQ6ZS5yZWdpc3RyYXRpb25fZW5kcG9pbnQscmV2b2NhdGlvbkVuZHBvaW50OmUucmV2b2NhdGlvbl9lbmRwb2ludCx0b2tlbkVuZHBvaW50OmUudG9rZW5fZW5kcG9pbnQsdXNlcmluZm9FbmRwb2ludDplLnVzZXJpbmZvX2VuZHBvaW50LHdlbGxLbm93bkVuZHBvaW50OnlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVXZWxsS25vd25FbmRwb2ludCgpfX0pKX1nZXRTaWduT3V0VVJMKCl7dmFyIGUsdCxyO3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49bnVsbD09PShlPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmVuZF9zZXNzaW9uX2VuZHBvaW50LGk9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIW58fDA9PT1uLnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IHB0KCJBVVRIX0NPUkUtR1NPVS1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsImdldFNpZ25PdXRVUkwiLCJTaWduLW91dCBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gc2lnbi1vdXQgZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgc2lnbi1vdXQgZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgbz1udWxsPT09KHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmlkX3Rva2VuO2lmKCFvfHwwPT09by50cmltKCkubGVuZ3RoKXRocm93IG5ldyBwdCgiQVVUSF9DT1JFLUdTT1UtTkYwMiIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRTaWduT3V0VVJMIiwiSUQgdG9rZW4gbjB0IGZvdW5kLiIsIk5vIElEIHRva2VuIGNvdWxkIGJlIGZvdW5kLiBFaXRoZXIgdGhlIHNlc3Npb24gaW5mb3JtYXRpb24gaXMgbG9zdCBvciB5b3UgaGF2ZSBub3Qgc2lnbmVkIGluLiIpO2NvbnN0IHM9bnVsbCE9PShyPW51bGw9PWk/dm9pZCAwOmkuc2lnbk91dFJlZGlyZWN0VVJMKSYmdm9pZCAwIT09cj9yOm51bGw9PWk/dm9pZCAwOmkuc2lnbkluUmVkaXJlY3RVUkw7aWYoIXN8fDA9PT1zLnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IHB0KCJBVVRIX0NPUkUtR1NPVS1ORjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsImdldFNpZ25PdXRVUkwiLCJObyBzaWduLW91dCByZWRpcmVjdCBVUkwgZm91bmQuIiwiVGhlIHNpZ24tb3V0IHJlZGlyZWN0IFVSTCBjYW5ub3QgYmUgZm91bmQgb3IgdGhlIFVSTCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4gTm8gc2lnbi1pbiByZWRpcmVjdCBVUkwgaGFzIGJlZW4gZm91bmQgZWl0aGVyLiAiKTtyZXR1cm5gJHtufT9pZF90b2tlbl9oaW50PSR7b30mcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpPSR7c30mc3RhdGU9c2lnbl9vdXRfc3VjY2Vzc2B9KSl9c2lnbk91dCgpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5nZXRTaWduT3V0VVJMKCk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmNsZWFyVXNlclNlc3Npb25EYXRhKCksZX0pKX1nZXRBY2Nlc3NUb2tlbigpe3ZhciBlO3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KGU9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmFjY2Vzc190b2tlbn0pKX1pc0F1dGhlbnRpY2F0ZWQoKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gQm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKCkpfSkpfWdldFBLQ0VDb2RlKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJwa2NlX2NvZGVfdmVyaWZpZXIiKX0pKX1zZXRQS0NFQ29kZShlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoInBrY2VfY29kZV92ZXJpZmllciIsZSl9KSl9dXBkYXRlQ29uZmlnKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpfSkpfX1jbGFzcyBwbntjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2lkPWUsdGhpcy5fc3RvcmU9dH1zZXREYXRhSW5CdWxrKGUsdCl7dmFyIHI7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgbj1udWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PXI/cjpudWxsLGk9biYmSlNPTi5wYXJzZShuKSxvPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpKSx0KSxzPUpTT04uc3RyaW5naWZ5KG8pO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxzKX0pKX1zZXRWYWx1ZShlLHQscil7dmFyIG47cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgaT1udWxsIT09KG49eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PW4/bjpudWxsLG89aSYmSlNPTi5wYXJzZShpKSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W3RdOnJ9KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLHQpe3ZhciByO3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPW4mJkpTT04ucGFyc2Uobiksbz1PYmplY3QuYXNzaWduKHt9LGkpO2RlbGV0ZSBvW3RdO2NvbnN0IHM9SlNPTi5zdHJpbmdpZnkobyk7eWllbGQgdGhpcy5fc3RvcmUuc2V0RGF0YShlLHMpfSkpfV9yZXNvbHZlS2V5KGUpe3JldHVybmAke2V9LSR7dGhpcy5faWR9YH1zZXRDb25maWdEYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGZ0LkNvbmZpZ0RhdGEpLGUpfSkpfXNldE9JRENQcm92aWRlck1ldGFEYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGZ0Lk9JRENQcm92aWRlck1ldGFEYXRhKSxlKX0pKX1zZXRUZW1wb3JhcnlEYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGZ0LlRlbXBvcmFyeURhdGEpLGUpfSkpfXNldFNlc3Npb25EYXRhKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGZ0LlNlc3Npb25EYXRhKSxlKX0pKX1nZXRDb25maWdEYXRhKCl7dmFyIGU7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShmdC5Db25maWdEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKXt2YXIgZTtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gSlNPTi5wYXJzZShudWxsIT09KGU9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KGZ0Lk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YSgpe3ZhciBlO3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0oZT15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoZnQuVGVtcG9yYXJ5RGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfWdldFNlc3Npb25EYXRhKCl7dmFyIGU7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShmdC5TZXNzaW9uRGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoZnQuQ29uZmlnRGF0YSkpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KGZ0Lk9JRENQcm92aWRlck1ldGFEYXRhKSl9KSl9cmVtb3ZlVGVtcG9yYXJ5RGF0YSgpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShmdC5UZW1wb3JhcnlEYXRhKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoZnQuU2Vzc2lvbkRhdGEpKX0pKX1nZXRDb25maWdEYXRhUGFyYW1ldGVyKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KGZ0LkNvbmZpZ0RhdGEpKTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KVtlXX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShmdC5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoZnQuVGVtcG9yYXJ5RGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KGZ0LlNlc3Npb25EYXRhKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9c2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlLHQpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShmdC5Db25maWdEYXRhKSxlLHQpfSkpfXNldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUsdCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KGZ0Lk9JRENQcm92aWRlck1ldGFEYXRhKSxlLHQpfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSx0KXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnNldFZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoZnQuVGVtcG9yYXJ5RGF0YSksZSx0KX0pKX1zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcihlLHQpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShmdC5TZXNzaW9uRGF0YSksZSx0KX0pKX1yZW1vdmVDb25maWdEYXRhUGFyYW1ldGVyKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShmdC5Db25maWdEYXRhKSxlKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnJlbW92ZVZhbHVlKHRoaXMuX3Jlc29sdmVLZXkoZnQuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KGZ0LlRlbXBvcmFyeURhdGEpLGUpfSkpfXJlbW92ZVNlc3Npb25EYXRhUGFyYW1ldGVyKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShmdC5TZXNzaW9uRGF0YSksZSl9KSl9fWNvbnN0IGduPXtjbGllbnRIb3N0Om9yaWdpbixjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6dXQucXVlcnksc2NvcGU6WyJvcGVuaWQiXSxzZW5kQ29va2llc0luUmVxdWVzdHM6ITAsdmFsaWRhdGVJRFRva2VuOiEwfTtjbGFzcyB2bnsKLyoqCiAgICAgICAgICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdG9yZX0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBfc3RvcmU6IFN0b3JlID0gbmV3IERhdGFTdG9yZSgpOwogICAgICAgICAqIGNvbnN0IGF1dGggPSBuZXcgQXNnYXJkZW9BdXRoQ2xpZW50PEN1c3RvbUNsaWVudENvbmZpZz4oX3N0b3JlKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqLwpjb25zdHJ1Y3RvcihlKXt2bi5faW5zdGFuY2VJRD92bi5faW5zdGFuY2VJRCs9MTp2bi5faW5zdGFuY2VJRD0wLHRoaXMuX2RhdGFMYXllcj1uZXcgcG4oYGluc3RhbmNlXyR7dm4uX2luc3RhbmNlSUR9YCxlKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmU9bmV3IGRuKHRoaXMuX2RhdGFMYXllcikKLyoqCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0aGUgU0RLIHdpdGggdGhlIGNvbmZpZyBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtBdXRoQ2xpZW50Q29uZmlnPFQ+fSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICogICAgIGNsaWVudElEOiAiY2xpZW50IElEIiwKICAgICAgICAgKiAgICAgc2VydmVyT3JpZ2luOiAiaHR0cHM6Ly9sb2NhbGhvc3Q6OTQ0MyIKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLmluaXRpYWxpemUoY29uZmlnKTsKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpbml0aWFsaXplCiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi99aW5pdGlhbGl6ZShlKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZ24pLGUpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge0RhdGFMYXllcn0gLSBUaGUgYERhdGFMYXllcmAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBkYXRhID0gYXV0aC5nZXREYXRhTGF5ZXIoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREYXRhTGF5ZXIKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9Ci8qKgogICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7R2V0QXV0aFVSTENvbmZpZ30gY29uZmlnIC0gKE9wdGlvbmFsKSBBIGNvbmZpZyBvYmplY3QgdG8gZm9yY2UgaW5pdGlhbGl6YXRpb24gYW5kIHBhc3MKICAgICAgICAgKiBjdXN0b20gcGF0aCBwYXJhbWV0ZXJzIHN1Y2ggYXMgdGhlIGZpZHAgcGFyYW1ldGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkwoKS50aGVuKCh1cmwpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBdXRob3JpemF0aW9uVVJMCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBdXRob3JpemF0aW9uVVJMKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gbnVsbD09dHx8ZGVsZXRlIHQuZm9yY2VJbml0LCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKT90aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0KTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0KSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHNlbmRzIGEgcmVxdWVzdCB0byBvYnRhaW4gdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UKICAgICAgICAgKiB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIGFuZCBvdGhlciByZWxldmFudCBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dGhvcml6YXRpb25Db2RlIC0gVGhlIGF1dGhvcml6YXRpb24gY29kZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblN0YXRlIC0gVGhlIHNlc3Npb24gc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLnJlcXVlc3RBY2Nlc3NUb2tlbihhdXRoQ29kZSwgc2Vzc2lvblN0YXRlKS50aGVuKCh0b2tlbik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codG9rZW4pOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXF1ZXN0QWNjZXNzVG9rZW4oZSx0KXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLHQpOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMSkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSx0KSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBjbGVhcnMgYWxsIGF1dGhlbnRpY2F0aW9uIGRhdGEgYW5kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHNpZ25PdXRVcmwgPSBhd2FpdCBhdXRoLnNpZ25PdXQoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNzaWduT3V0CiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9zaWduT3V0KCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zaWduT3V0KCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhpcyBkb2Vzbid0IGNsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBzaWduT3V0VXJsID0gYXdhaXQgYXV0aC5nZXRTaWduT3V0VVJMKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0U2lnbk91dFVSTAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0U2lnbk91dFVSTCgpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0U2lnbk91dFVSTCgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIE9JREMgc2VydmljZSBlbmRwb2ludHMgdGhhdCBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBgLndlbGwta25vd25gIGVuZHBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxPSURDRW5kcG9pbnRzPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBPSURDIHNlcnZpY2UgZW5kcG9pbnRzLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhdXRoLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBwYXlsb2FkIG9mIHRoZSBJRCB0b2tlbiBhbmQgcmV0dXJucyBpdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8RGVjb2RlZElEVG9rZW5QYXlsb2FkPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWNvZGVkIElEIHRva2VuIHBheWxvYWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERlY29kZWRJRFRva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXREZWNvZGVkSURUb2tlbigpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBhdXRoLmdldElEVG9rZW4oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRJRFRva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRJRFRva2VuKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRJRFRva2VuKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEJhc2ljVXNlckluZm8+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgYXV0aC5nZXRCYXNpY1VzZXJJbmZvKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mbwogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0QmFzaWNVc2VySW5mbygpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QmFzaWNVc2VySW5mbygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXZva2VzIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoaXMgbWV0aG9kIGFsc28gY2xlYXJzIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEF4aW9zUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJldHVybnMgdGhlIHJlc3BvbnNlIG9mIHRoZSByZXZva2UtYWNjZXNzLXRva2VuIHJlcXVlc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3Jldm9rZUFjY2Vzc1Rva2VuKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXZva2VBY2Nlc3NUb2tlbigpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgYWNjZXNzCiAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLnJlZnJlc2hBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZWZyZXNoQWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlZnJlc2hBY2Nlc3NUb2tlbigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBY2Nlc3NUb2tlbigpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QWNjZXNzVG9rZW4oKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgY29uZmlnIHBhc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q3VzdG9tR3JhbnRDb25maWd9IGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXN0b20gZ3JhbnQgY29uZmlndXJhdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2UgfCBBeGlvc1Jlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICBhdHRhY2hUb2tlbjogZmFsc2UsCiAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgKiAgICAgICBncmFudF90eXBlOiAiYWNjb3VudF9zd2l0Y2giLAogICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICogICB9LAogICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgKiAgIHJldHVybnNTZXNzaW9uOiB0cnVlLAogICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0Q3VzdG9tR3JhbnQKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlcXVlc3RDdXN0b21HcmFudChlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RDdXN0b21HcmFudChlKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF3YWl0IGF1dGguaXNBdXRoZW50aWNhdGVkKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNBdXRoZW50aWNhdGVkCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9pc0F1dGhlbnRpY2F0ZWQoKXtyZXR1cm4gbHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmlzQXV0aGVudGljYXRlZCgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBQS0NFIGNvZGUgZ2VuZXJhdGVkIGR1cmluZyB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIFBLQ0UgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgcGtjZSA9IGF3YWl0IGdldFBLQ0VDb2RlKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0UEtDRUNvZGUKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFBLQ0VDb2RlKCl7cmV0dXJuIGx0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRQS0NFQ29kZSgpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBQS0NFIGNvZGUgdG8gdGhlIGRhdGEgc3RvcmUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGtjZSAtIFRoZSBQS0NFIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF3YWl0IGF1dGguc2V0UEtDRUNvZGUoInBrY2VfY29kZSIpCiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2V0UEtDRUNvZGUKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NldFBLQ0VDb2RlKGUpe3JldHVybiBsdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zZXRQS0NFQ29kZShlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgc2lnbi1vdXQgaXMgc3VjY2Vzc2Z1bCBvciBub3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAqCiAgICAgICAgICogKipUaGUgc2VydmVyIGFwcGVuZHMgcGF0aCBwYXJhbWV0ZXJzIHRvIHRoZSBgc2lnbk91dFJlZGlyZWN0VVJMYCBhbmQgdGhlc2UgcGF0aCBwYXJhbWV0ZXJzCiAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gYHRydWVgIGlmIHN1Y2Nlc3NmdWwsIGBmYWxzZWAgb3RoZXJ3aXNlLgogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2lzU2lnbk91dFN1Y2Nlc3NmdWwKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3N0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJiFufQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBjbGFzcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UGFydGlhbDxBdXRoQ2xpZW50Q29uZmlnPFQ+Pn0gY29uZmlnIC0gQSBjb25maWcgb2JqZWN0IHRvIHVwZGF0ZSB0aGUgU0RLIGNvbmZpZ3VyYXRpb25zIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IHsKICAgICAgICAgKiAgICAgc2lnbkluUmVkaXJlY3RVUkw6ICJodHRwOi8vbG9jYWxob3N0OjMwMDAvc2lnbi1pbiIsCiAgICAgICAgICogICAgIGNsaWVudElEOiAiY2xpZW50IElEIiwKICAgICAgICAgKiAgICAgc2VydmVyT3JpZ2luOiAiaHR0cHM6Ly9sb2NhbGhvc3Q6OTQ0MyIKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLnVwZGF0ZUNvbmZpZyhjb25maWcpOwogICAgICAgICAqIGBgYAogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciN1cGRhdGVDb25maWcKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3VwZGF0ZUNvbmZpZyhlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfX1jbGFzcyB5biBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsdCxyLG4saSxvKXtzdXBlcihudWxsIT1uP246bnVsbD09bz92b2lkIDA6by5tZXNzYWdlKSx0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLHRoaXMuY29kZT1lLHRoaXMuZmlsZT10LHRoaXMubWV0aG9kPXIsdGhpcy5lcnJvcj1vLHRoaXMuZGVzY3JpcHRpb249aSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuZXcudGFyZ2V0LnByb3RvdHlwZSl9fWNsYXNzIG1ue2NvbnN0cnVjdG9yKGUpe3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50PWUsdGhpcy5fZGF0YUxheWVyPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERhdGFMYXllcigpfXJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7aWYodC5yZWZyZXNoX3Rva2VuKXtjb25zdCByPXBhcnNlSW50KHQuZXhwaXJlc19pbiksbj1zZXRUaW1lb3V0KCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlZnJlc2hBY2Nlc3NUb2tlbigpfSkpKSwxZTMqKHI8PTEwP3I6ci0xMCkpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGR0LEpTT04uc3RyaW5naWZ5KG4pKX19KSl9Y2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihkdCkpe2NvbnN0IGU9SlNPTi5wYXJzZSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihkdCkpO2NsZWFyVGltZW91dChlKX19KSl9fWNvbnN0IHduPSJpbml0Ijt2YXIgYm4sX24sa247IWZ1bmN0aW9uKGUpe2UuTG9jYWxTdG9yYWdlPSJsb2NhbFN0b3JhZ2UiLGUuU2Vzc2lvblN0b3JhZ2U9InNlc3Npb25TdG9yYWdlIixlLldlYldvcmtlcj0id2ViV29ya2VyIixlLkJyb3dzZXJNZW1vcnk9ImJyb3dzZXJNZW1vcnkifShibnx8KGJuPXt9KSksZnVuY3Rpb24oZSl7ZS5TaWduSW49InNpZ24taW4iLGUuU2lnbk91dD0ic2lnbi1vdXQiLGUuSW5pdGlhbGl6ZT0iaW5pdGlhbGl6ZSIsZS5IdHRwUmVxdWVzdFN0YXJ0PSJodHRwLXJlcXVlc3Qtc3RhcnQiLGUuSHR0cFJlcXVlc3RGaW5pc2g9Imh0dHAtcmVxdWVzdC1maW5pc2giLGUuSHR0cFJlcXVlc3RFcnJvcj0iaHR0cC1yZXF1ZXN0LWVycm9yIixlLkh0dHBSZXF1ZXN0U3VjY2Vzcz0iaHR0cC1yZXF1ZXN0LXN1Y2Nlc3MiLGUuUmV2b2tlQWNjZXNzVG9rZW49InJldm9rZS1hY2Nlc3MtdG9rZW4iLGUuQ3VzdG9tR3JhbnQ9ImN1c3RvbS1ncmFudCJ9KF9ufHwoX249e30pKTtsZXQgU249a249Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmF0dGFjaFRva2VuPSgpPT5Qcm9taXNlLnJlc29sdmUoKSx0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPSgpPT5udWxsLHRoaXMuaW5pdD10aGlzLmluaXQuYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjay5iaW5kKHRoaXMpfXN0YXRpYyBnZXRJbnN0YW5jZSgpe3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9aHQuY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcga24pLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5jbGllbnRJbnN0YW5jZS5yZXF1ZXN0SGFuZGxlcih0KX0pKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChlPT50aGlzLmNsaWVudEluc3RhbmNlLnN1Y2Nlc3NIYW5kbGVyKGUpKSwoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIoZSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuYWxsPWh0LmFsbCx0aGlzLmF4aW9zSW5zdGFuY2Uuc3ByZWFkPWh0LnNwcmVhZCx0aGlzLmF4aW9zSW5zdGFuY2UuaW5pdD10aGlzLmNsaWVudEluc3RhbmNlLmluaXQsdGhpcy5heGlvc0luc3RhbmNlLmVuYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5lbmFibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0PXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dCx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSx0aGlzLmF4aW9zSW5zdGFuY2V9cmVxdWVzdEhhbmRsZXIodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5hdHRhY2hUb2tlbih0KSxrbi5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayh0KSx0fSkpfWVycm9ySGFuZGxlcihlKXt0aHJvdyBrbi5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJnRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1zdWNjZXNzSGFuZGxlcihlKXtyZXR1cm4ga24uaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9aW5pdCh0PSEwLHIpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7a24uaXNIYW5kbGVyRW5hYmxlZD10LHRoaXMuYXR0YWNoVG9rZW49cn0pKX1lbmFibGVIYW5kbGVyKCl7a24uaXNIYW5kbGVyRW5hYmxlZD0hMH1kaXNhYmxlSGFuZGxlcigpe2tuLmlzSGFuZGxlckVuYWJsZWQ9ITF9ZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dChlPWtuLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQpe2tuLmlzSGFuZGxlckVuYWJsZWQ9ITEsc2V0VGltZW91dCgoKCk9Pntrbi5pc0hhbmRsZXJFbmFibGVkPSEwfSksZSl9c2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9ZX19O1NuLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLFNuPWtuPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1uP249T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpOm47aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LHIsbik7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkoaT1lW2FdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQscixzKTppKHQscikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHMpLHN9KFtlPT57fV0sU24pO2NsYXNzIEFue2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT1uZXcgTWFwfXNldERhdGEodCxyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuc2V0KHQscil9KSl9Z2V0RGF0YSh0KXt2YXIgcixuO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGwhPT0obj1udWxsPT09KHI9dGhpcy5fZGF0YSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0KHQpKSYmdm9pZCAwIT09bj9uOiJ7fSJ9KSl9cmVtb3ZlRGF0YSh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuZGVsZXRlKHQpfSkpfX1jbGFzcyBUbntjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKXtyZXR1cm57YmxvYjoobnVsbD09ZT92b2lkIDA6ZS5kYXRhKWluc3RhbmNlb2YgQmxvYj9udWxsPT1lP3ZvaWQgMDplLmRhdGE6bnVsbCxkYXRhOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMH19c3RhdGljIGdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSl7cmV0dXJuKG51bGw9PWU/dm9pZCAwOmUudG9KU09OKSYmZGVsZXRlIGUudG9KU09OLHtlcnJvcjpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHN1Y2Nlc3M6ITF9fX1jb25zdCBFbj1zZWxmO2xldCBSbjtFbi5vbm1lc3NhZ2U9KHtkYXRhOnQscG9ydHM6cn0pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgbixpLG87Y29uc3Qgcz1yWzBdO2lmKHQudHlwZT09PXdufHxSbilzd2l0Y2godC50eXBlKXtjYXNlIHduOnRyeXtjb25zdCByPU9iamVjdC5hc3NpZ24oe30sdC5kYXRhKTtSbj15aWVsZCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPW5ldyBBbixuPW5ldyB2bihyKTt5aWVsZCBuLmluaXRpYWxpemUodCk7Y29uc3QgaT1uZXcgbW4obiksbz1uLmdldERhdGFMYXllcigpLHM9U24uZ2V0SW5zdGFuY2UoKTtyZXR1cm4obnVsbD09cz92b2lkIDA6cy5pbml0KSYmKHlpZWxkIHMuaW5pdCghMCwodD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7T2JqZWN0LmFzc2lnbih7YXR0YWNoVG9rZW46ITB9LHQpLmF0dGFjaFRva2VuJiYodC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt5aWVsZCBuLmdldEFjY2Vzc1Rva2VuKCl9YH0pKX0pKSkpKSx7ZGlzYWJsZUh0dHBIYW5kbGVyOigpPT57cy5kaXNhYmxlSGFuZGxlciYmcy5kaXNhYmxlSGFuZGxlcigpfSxlbmFibGVIdHRwSGFuZGxlcjooKT0+e3MuZW5hYmxlSGFuZGxlciYmcy5lbmFibGVIYW5kbGVyKCl9LGdldEFjY2Vzc1Rva2VuOigpPT5uLmdldEFjY2Vzc1Rva2VuKCksZ2V0QXV0aG9yaXphdGlvblVSTDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbi5nZXRBdXRob3JpemF0aW9uVVJMKHQpLnRoZW4oKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybnthdXRob3JpemF0aW9uVVJMOnQscGtjZTp5aWVsZCBuLmdldFBLQ0VDb2RlKCl9fSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksZ2V0QmFzaWNVc2VySW5mbzooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG4uZ2V0QmFzaWNVc2VySW5mbygpfSkpLGdldENvbmZpZ0RhdGE6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBvLmdldENvbmZpZ0RhdGEoKX0pKSxnZXREZWNvZGVkSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG4uZ2V0RGVjb2RlZElEVG9rZW4oKX0pKSxnZXRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbi5nZXRJRFRva2VuKCl9KSksZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHM6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSksZ2V0U2lnbk91dFVSTDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIG4uZ2V0U2lnbk91dFVSTCgpfSkpLGh0dHBSZXF1ZXN0OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlLHIsaTtsZXQgYT0hMTtjb25zdCB1PXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpO2Zvcihjb25zdCBuIG9mWy4uLm51bGwhPT0ocj1udWxsPT09KGU9eWllbGQgby5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PXI/cjpbXSxudWxsPT11P3ZvaWQgMDp1LnNlcnZlck9yaWdpbl0paWYobnVsbD09PShpPW51bGw9PXQ/dm9pZCAwOnQudXJsKXx8dm9pZCAwPT09aT92b2lkIDA6aS5zdGFydHNXaXRoKG4pKXthPSEwO2JyZWFrfXJldHVybiBhP3MucmVxdWVzdCh0KS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+e3ZhciByO3JldHVybiA0MDE9PT0obnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyk/bi5yZWZyZXNoQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+cy5yZXF1ZXN0KHQpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyB5bigiV09SS0VSX0NPUkUtSFItRVMwMSIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCIiLCIiLGUpKSkpOlByb21pc2UucmVqZWN0KGUpfSkpOlByb21pc2UucmVqZWN0KG5ldyB5bigiV09SS0VSX0NPUkUtSFItSVYwMiIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKSxodHRwUmVxdWVzdEFsbDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSxyLGk7bGV0IGE9ITA7Y29uc3QgdT15aWVsZCBvLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgbiBvZiB0KXtsZXQgdD0hMTtmb3IoY29uc3QgcyBvZlsuLi5udWxsIT09KHI9bnVsbD09PShlPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1yP3I6W10sbnVsbD09dT92b2lkIDA6dS5zZXJ2ZXJPcmlnaW5dKWlmKG51bGw9PT0oaT1uLnVybCl8fHZvaWQgMD09PWk/dm9pZCAwOmkuc3RhcnRzV2l0aChzKSl7dD0hMDticmVha31pZighdCl7YT0hMTticmVha319Y29uc3QgYz1bXTtyZXR1cm4gYT8odC5mb3JFYWNoKChlPT57Yy5wdXNoKHMucmVxdWVzdChlKSl9KSksKG51bGw9PXM/dm9pZCAwOnMuYWxsKSYmcy5hbGwoYykudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKGU9Pnt2YXIgdDtyZXR1cm4gNDAxPT09KG51bGw9PT0odD1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5zdGF0dXMpP24ucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigoKCk9PnMuYWxsJiZzLmFsbChjKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgeW4oIldPUktFUl9DT1JFLUhSQS1FUzAxIiwid29ya2VyLWNvcmUiLCJodHRwUmVxdWVzdEFsbCIsIiIsIiIsZSkpKSk6UHJvbWlzZS5yZWplY3QoZSl9KSkpOlByb21pc2UucmVqZWN0KG5ldyB5bigiV09SS0VSX0NPUkUtSFJBLUlWMDIiLCJ3b3JrZXItY29yZSIsImh0dHBSZXF1ZXN0IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSksaXNBdXRoZW50aWNhdGVkOigpPT5uLmlzQXV0aGVudGljYXRlZCgpLHJlZnJlc2hBY2Nlc3NUb2tlbjooKT0+bi5yZWZyZXNoQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpLHJlcXVlc3RBY2Nlc3NUb2tlbjoodCxyLHMpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIG8uZ2V0Q29uZmlnRGF0YSgpO3JldHVybiBzJiZlLmVuYWJsZVBLQ0UmJih5aWVsZCBuLnNldFBLQ0VDb2RlKHMpKSx0P24ucmVxdWVzdEFjY2Vzc1Rva2VuKHQsbnVsbCE9cj9yOiIiKS50aGVuKCgoKT0+KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyB5bigiV09SS0VSX0NPUkUtUkFUMS1ORjAxIiwid29ya2VyLWNvcmUiLCJyZXF1ZXN0QWNjZXNzVG9rZW4iLCJObyBhdXRob3JpemF0aW9uIGNvZGUuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlIHdhcyBmb3VuZC4iKSl9KSkscmVxdWVzdEN1c3RvbUdyYW50OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciByLHMsYTtsZXQgdT0hMCxjPSExO2NvbnN0IGg9eWllbGQgby5nZXRDb25maWdEYXRhKCk7aWYobnVsbD09dD92b2lkIDA6dC50b2tlbkVuZHBvaW50KXt1PSExO2Zvcihjb25zdCBlIG9mWy4uLm51bGwhPT0ocz1udWxsPT09KHI9eWllbGQgby5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PXM/czpbXSxudWxsPT1oP3ZvaWQgMDpoLnNlcnZlck9yaWdpbl0paWYobnVsbD09PShhPXQudG9rZW5FbmRwb2ludCl8fHZvaWQgMD09PWE/dm9pZCAwOmEuc3RhcnRzV2l0aChlKSl7Yz0hMDticmVha319cmV0dXJuIHV8fGM/bi5yZXF1ZXN0Q3VzdG9tR3JhbnQodCkudGhlbigocj0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHQucmV0dXJuc1Nlc3Npb24/KGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLG4uZ2V0QmFzaWNVc2VySW5mbygpKTpyfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IHluKCJXT1JLRVJfQ09SRS1SQ0ctSVYwMSIsIndvcmtlci1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgdG9rZW4gZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSkscmV2b2tlQWNjZXNzVG9rZW46KCk9Pm4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KGkuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksUHJvbWlzZS5yZXNvbHZlKCEwKSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSxzZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s6ZT0+eyhudWxsPT1zP3ZvaWQgMDpzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaykmJnMuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrOmU9PnsobnVsbD09cz92b2lkIDA6cy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSYmcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s6ZT0+eyhudWxsPT1zP3ZvaWQgMDpzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaykmJnMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjazplPT57KG51bGw9PXM/dm9pZCAwOnMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2spJiZzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpfSxzZXRTZXNzaW9uU3RhdGU6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgby5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCl9KSksc2lnbk91dDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGkuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCkseWllbGQgbi5zaWduT3V0KCl9KSksc3RhcnRBdXRvUmVmcmVzaFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLGkucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpfSkpLHVwZGF0ZUNvbmZpZzp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBuLnVwZGF0ZUNvbmZpZyh0KX0pKX19KSkpKHIpLFJuLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjayhPbiksUm4uc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhEbiksUm4uc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKENuKSxSbi5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhQbikscy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOlJuLmdldEF1dGhvcml6YXRpb25VUkwobnVsbD09dD92b2lkIDA6dC5kYXRhKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJyZXF1ZXN0X2dldF90b2tlbiI6Um4ucmVxdWVzdEFjY2Vzc1Rva2VuKG51bGw9PT0obj1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmNvZGUsbnVsbD09PShpPW51bGw9PXQ/dm9pZCAwOnQuZGF0YSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuc2Vzc2lvblN0YXRlLG51bGw9PT0obz1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnBrY2UpLnRoZW4oKGU9PntzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlImh0dHAtcmVxdWVzdCI6Um4uaHR0cFJlcXVlc3QodC5kYXRhKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJodHRwLXJlcXVlc3QtYWxsIjpSbi5odHRwUmVxdWVzdEFsbCh0LmRhdGEpLnRoZW4oKGU9PntzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInNpZ24tb3V0Ijp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLnNpZ25PdXQoKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJyZXF1ZXN0LWN1c3RvbS1ncmFudCI6Um4ucmVxdWVzdEN1c3RvbUdyYW50KHQuZGF0YSkudGhlbigoZT0+e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmV2b2tlLWFjY2Vzcy10b2tlbiI6Um4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJnZXQtb2lkYy1zZXJ2aWNlLWVuZHBvaW50cyI6dHJ5e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBSbi5nZXRPSURDU2VydmljZUVuZHBvaW50cygpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1iYXNpYy11c2VyLWluZm8iOnRyeXtzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgUm4uZ2V0QmFzaWNVc2VySW5mbygpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1kZWNvZGVkLWlkLXRva2VuIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLmdldERlY29kZWRJRFRva2VuKCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0X2lkX3Rva2VuIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLmdldElEVG9rZW4oKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJlbmFibGVfaHR0cF9oYW5kbGVyIjpSbi5lbmFibGVIdHRwSGFuZGxlcigpLHMucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKTticmVhaztjYXNlImRpc2FibGVfaHR0cF9oYW5kbGVyIjpSbi5kaXNhYmxlSHR0cEhhbmRsZXIoKSxzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLmlzQXV0aGVudGljYXRlZCgpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9zaWduX291dF91cmwiOnRyeXtzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgUm4uZ2V0U2lnbk91dFVSTCgpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlZnJlc2hfYWNjZXNzLXRva2VuIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLnJlZnJlc2hBY2Nlc3NUb2tlbigpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShSbi5zdGFydEF1dG9SZWZyZXNoVG9rZW4oKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzZXRfc2Vzc2lvbl9zdGF0ZSI6dHJ5e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBSbi5zZXRTZXNzaW9uU3RhdGUobnVsbD09dD92b2lkIDA6dC5kYXRhKSkpfWNhdGNoKGUpe3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJ1cGRhdGVfY29uZmlnIjp0cnl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIFJuLnVwZGF0ZUNvbmZpZyhudWxsPT10P3ZvaWQgMDp0LmRhdGEpKSl9Y2F0Y2goZSl7cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e3MucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBSbi5nZXRDb25maWdEYXRhKCkpKX1jYXRjaChlKXtzLnBvc3RNZXNzYWdlKFRuLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2RlZmF1bHQ6bnVsbD09c3x8cy5wb3N0TWVzc2FnZShUbi5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKG5ldyB5bigiQ0xJRU5UX1dPUktFUi1PTk1TRy1JVjAyIiwiY2xpZW50LndvcmtlciIsIm9ubWVzc2FnZSIsIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZC4iLGBUaGUgbWVzc2FnZSB0eXBlIHByb3ZpZGVkLCAke3QudHlwZX0sIGlzIGludmFsaWQuYCkpKX1lbHNlIHMucG9zdE1lc3NhZ2UoVG4uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgeW4oIkNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsImNsaWVudC53b3JrZXIiLHQudHlwZSwiVGhlIHdlYiB3b3JrZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldC4iLCJUaGUgaW5pdGlhbGl6ZSBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBjYW4gYmUgY2FycmllZCBvdXQuIikpKX0pKTtjb25zdCBDbj0oKT0+e0VuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LXN0YXJ0In0pfSxQbj1lPT57RW4ucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LERuPSgpPT57RW4ucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3QtZmluaXNoIn0pfSxPbj1lPT57Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO2RlbGV0ZSB0LnRvSlNPTixFbi5wb3N0TWVzc2FnZSh7ZGF0YTpKU09OLnN0cmluZ2lmeShudWxsIT10P3Q6IiIpLHR5cGU6InJlcXVlc3QtZXJyb3IifSl9O3JldHVybnt9fSgpOwoK",null,!1),new Worker(zn,t)});const wn=t=>{var l;let i;const e=null!==(l=null==t?void 0:t.requestTimeout)&&void 0!==l?l:6e4,c=Hn(()=>n(void 0,void 0,void 0,(function*(){const t={type:"sign-out"};try{return yield d(t)}catch(t){return Bn.getSignOutURL()}}))),o=new An,d=t=>{const l=new MessageChannel;return o.postMessage(t,[l.port2]),new Promise((t,i)=>{const n=setTimeout(()=>{i(new Nn("WEB_WORKER_CLIENT-COM-TO-01","web-worker-client","communicate","Operation timed out.","No response was received from the web worker for "+e/1e3+" since dispatching the request"))},e);return l.port1.onmessage=({data:l})=>{if(clearTimeout(n),null==l?void 0:l.success){const i=(null==l?void 0:l.data)?JSON.parse(null==l?void 0:l.data):null;(null==l?void 0:l.blob)&&(i.data=null==l?void 0:l.blob),t(i)}else i(l.error?JSON.parse(l.error):null)}})},a=()=>n(void 0,void 0,void 0,(function*(){var t,l,i,n;const e=yield u(),o=(yield s()).sessionState,d=yield Z();c.initialize(d.clientID,null!==(t=e.checkSessionIframe)&&void 0!==t?t:"",o,null!==(l=d.checkSessionInterval)&&void 0!==l?l:3,null!==(i=d.sessionRefreshInterval)&&void 0!==i?i:300,d.signInRedirectURL,null!==(n=e.authorizationEndpoint)&&void 0!==n?n:"")})),r=(t,l)=>n(void 0,void 0,void 0,(function*(){const i=yield Z(),n={data:{code:t,pkce:i.enablePKCE?Bn.getPKCE():void 0,sessionState:l},type:"request_get_token"};return i.enablePKCE&&Bn.removePKCE(),d(n).then(t=>d({type:"get_sign_out_url"}).then(l=>(Bn.setSignOutURL(l),i.enableOIDCSessionManagement&&a(),Promise.resolve(t))).catch(t=>Promise.reject(t))).catch(t=>Promise.reject(t))})),u=()=>d({type:"get-oidc-service-endpoints"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),Z=()=>d({type:"get_config_data"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),s=()=>d({type:"get-basic-user-info"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),b=()=>d({type:"is_authenticated"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t));return{disableHttpHandler:()=>d({type:"disable_http_handler"}).then(()=>Promise.resolve(!0)).catch(t=>Promise.reject(t)),enableHttpHandler:()=>d({type:"enable_http_handler"}).then(()=>Promise.resolve(!0)).catch(t=>Promise.reject(t)),getBasicUserInfo:s,getDecodedIDToken:()=>d({type:"get-decoded-id-token"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),getIDToken:()=>d({type:"get_id_token"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),getOIDCServiceEndpoints:u,httpRequest:t=>d({data:t,type:"http-request"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),httpRequestAll:t=>d({data:t,type:"http-request-all"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),initialize:()=>(i={requestErrorCallback:()=>null,requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null},o.onmessage=({data:t})=>{switch(t.type){case"request-error":(null==i?void 0:i.requestErrorCallback)&&(null==i||i.requestErrorCallback(t.data?JSON.parse(t.data):null));break;case"request-finish":(null==i?void 0:i.requestFinishCallback)&&(null==i||i.requestFinishCallback());break;case"request-start":(null==i?void 0:i.requestStartCallback)&&(null==i||i.requestStartCallback());break;case"request-success":(null==i?void 0:i.requestSuccessCallback)&&(null==i||i.requestSuccessCallback(t.data?JSON.parse(t.data):null))}},d({data:t,type:"init"}).then(()=>Promise.resolve(!0)).catch(t=>Promise.reject(t))),isAuthenticated:b,refreshAccessToken:()=>d({type:"refresh_access-token"}),requestCustomGrant:t=>d({data:t,type:"request-custom-grant"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),revokeAccessToken:()=>d({type:"revoke-access-token"}).then(t=>Promise.resolve(t)).catch(t=>Promise.reject(t)),setHttpRequestErrorCallback:t=>{t&&"function"==typeof t&&(i.requestErrorCallback=t)},setHttpRequestFinishCallback:t=>{t&&"function"==typeof t&&(i.requestFinishCallback=t)},setHttpRequestStartCallback:t=>{t&&"function"==typeof t&&(i.requestStartCallback=t)},setHttpRequestSuccessCallback:t=>{t&&"function"==typeof t&&(i.requestSuccessCallback=t)},signIn:(t,l,i)=>n(void 0,void 0,void 0,(function*(){var e,o;const u=yield Z();if(yield c.receivePromptNoneResponse(t=>n(void 0,void 0,void 0,(function*(){return(t=>d({data:t,type:"set_session_state"}))(t)}))))return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",tenantDomain:"",username:""});Bn.wasSilentSignInCalled()&&Bn.setIsInitializedSilentSignIn();const m=new URL(window.location.href).searchParams.get("error"),h=new URL(window.location.href).searchParams.get("error_description");if(m){const t=new URL(window.location.href);return t.searchParams.delete("error"),t.searchParams.delete("error_description"),history.pushState(null,document.title,t.toString()),Promise.reject(new Nn("WEB_WORKER_CLIENT-SI-BE","web-worker-client","signIn",m,null!=h?h:""))}if(yield b())return yield d({type:"start_auto_refresh_token"}),u.enableOIDCSessionManagement&&a(),s();let I,p;return(null==u?void 0:u.responseMode)===rl.formPost&&l?(I=l,p=null!=i?i:""):(I=null!==(e=new URL(window.location.href).searchParams.get(gl))&&void 0!==e?e:"",p=null!==(o=new URL(window.location.href).searchParams.get(Vl))&&void 0!==o?o:"",Bn.removeAuthorizationCode()),I?r(I,p):d({data:t,type:"get_auth_url"}).then(t=>(t.pkce&&u.enablePKCE&&Bn.setPKCE(t.pkce),location.href=t.authorizationURL,Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",tenantDomain:"",username:""}))).catch(t=>Promise.reject(t))})),signOut:()=>b().then(t=>t?d({type:"sign-out"}).then(t=>(window.location.href=t,Promise.resolve(!0))).catch(t=>Promise.reject(t)):(window.location.href=Bn.getSignOutURL(),Promise.resolve(!0))).catch(t=>Promise.reject(t)),trySignInSilently:()=>n(void 0,void 0,void 0,(function*(){var t;const l=yield Z();if(Bn.setIsInitializedSilentSignIn())return yield c.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",tenantDomain:"",username:""});if(Bn.isStatePresentInURL())return Bn.setIsInitializedSilentSignIn(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",tenantDomain:"",username:""});const i=document.getElementById("rpIFrame"),e=null===(t=null==i?void 0:i.contentDocument)||void 0===t?void 0:t.getElementById("promptNoneIFrame"),o={data:{prompt:"none",state:"sign-in-silently"},type:"get_auth_url"};try{const t=yield d(o);t.pkce&&l.enablePKCE&&Bn.setPKCE(t.pkce),e.src=t.authorizationURL}catch(t){return Promise.reject(t)}return new Promise((t,l)=>{const i=e=>n(void 0,void 0,void 0,(function*(){var n,c,o;const d=e.data;"check_session_signed_out"==(null==d?void 0:d.type)&&(window.removeEventListener("message",i),t(!1)),"check_session_signed_in"==(null==d?void 0:d.type)&&(null===(n=null==d?void 0:d.data)||void 0===n?void 0:n.code)&&r(null===(c=null==d?void 0:d.data)||void 0===c?void 0:c.code,null===(o=null==d?void 0:d.data)||void 0===o?void 0:o.sessionState).then(l=>{window.removeEventListener("message",i),t(l)}).catch(t=>{window.removeEventListener("message",i),l(t)})}));window.addEventListener("message",i)})})),updateConfig:t=>n(void 0,void 0,void 0,(function*(){const l=Object.assign(Object.assign({},yield Z()),t);return d({data:l,type:"update_config"})}))}},Qn={checkSessionInterval:3,enableOIDCSessionManagement:!1,sessionRefreshInterval:300};class Pn{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 n(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 n(this,void 0,void 0,(function*(){return(yield this._isInitialized())&&!!(yield this.isAuthenticated())||Promise.reject()}))}
|
|
408
|
+
/**
|
|
409
|
+
* This method returns the instance of the singleton class.
|
|
410
|
+
*
|
|
411
|
+
* @return {AsgardeoSPAClient} - Returns the instance of the singleton class.
|
|
412
|
+
*
|
|
413
|
+
* @example
|
|
414
|
+
* ```
|
|
415
|
+
* const auth = AsgardeoSPAClient.getInstance();
|
|
416
|
+
* ```
|
|
417
|
+
*
|
|
418
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getinstance
|
|
419
|
+
*
|
|
420
|
+
* @memberof AsgardeoSPAClient
|
|
421
|
+
*
|
|
422
|
+
* @preserve
|
|
423
|
+
*/static getInstance(t){var l,i;return t&&(null===(l=this._instances)||void 0===l?void 0:l.get(t))?this._instances.get(t):!t&&(null===(i=this._instances)||void 0===i?void 0:i.get("primaryInstance"))?this._instances.get("primaryInstance"):t?(this._instances.set(t,new Pn(t)),this._instances.get(t)):(this._instances.set("primaryInstance",new Pn("primaryInstance")),this._instances.get("primaryInstance"))}
|
|
424
|
+
/**
|
|
425
|
+
* This method initializes the `AsgardeoSPAClient` instance.
|
|
426
|
+
*
|
|
427
|
+
* @param {ConfigInterface} config The config object to initialize with.
|
|
428
|
+
*
|
|
429
|
+
* @return {Promise<boolean>} - Resolves to `true` if initialization is successful.
|
|
430
|
+
*
|
|
431
|
+
* @example
|
|
432
|
+
* ```
|
|
433
|
+
* auth.initialize({
|
|
434
|
+
* signInRedirectURL: "http://localhost:3000/sign-in",
|
|
435
|
+
* clientID: "client ID",
|
|
436
|
+
* serverOrigin: "https://localhost:9443"
|
|
437
|
+
* });
|
|
438
|
+
* ```
|
|
439
|
+
*
|
|
440
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#initialize
|
|
441
|
+
*
|
|
442
|
+
* @memberof AsgardeoSPAClient
|
|
443
|
+
*
|
|
444
|
+
* @preserve
|
|
445
|
+
*/initialize(t){var l;return n(this,void 0,void 0,(function*(){if(this._storage=null!==(l=t.storage)&&void 0!==l?l:fn.SessionStorage,this._initialized=!1,this._startedInitialize=!0,this._storage!==fn.WebWorker){if(!this._client){const l=t,i=Object.assign({},Qn);this._client=yield Fn(Object.assign(Object.assign({},i),l))}return this._initialized=!0,this._onInitialize&&this._onInitialize(!0),Promise.resolve(!0)}if(!this._client){const l=t;return this._client=wn(Object.assign(Object.assign({},Qn),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)}))}
|
|
446
|
+
/**
|
|
447
|
+
* This method returns a Promise that resolves with the basic user information obtained from the ID token.
|
|
448
|
+
*
|
|
449
|
+
* @return {Promise<BasicUserInfo>} - A promise that resolves with the user information.
|
|
450
|
+
*
|
|
451
|
+
* @example
|
|
452
|
+
* ```
|
|
453
|
+
* auth.getBasicUserInfo().then((response) => {
|
|
454
|
+
* // console.log(response);
|
|
455
|
+
* }).catch((error) => {
|
|
456
|
+
* // console.error(error);
|
|
457
|
+
* });
|
|
458
|
+
* ```
|
|
459
|
+
*
|
|
460
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getuserinfo
|
|
461
|
+
*
|
|
462
|
+
* @memberof AsgardeoSPAClient
|
|
463
|
+
*
|
|
464
|
+
* @preserve
|
|
465
|
+
*/getBasicUserInfo(){var t;return n(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(t=this._client)||void 0===t?void 0:t.getBasicUserInfo()}))}
|
|
466
|
+
/**
|
|
467
|
+
* This method initiates the authentication flow. This should be called twice.
|
|
468
|
+
* 1. To initiate the authentication flow.
|
|
469
|
+
* 2. To obtain the access token after getting the authorization code.
|
|
470
|
+
*
|
|
471
|
+
* To satisfy the second condition, one of the two strategies mentioned below can be used:
|
|
472
|
+
* 1. Redirect the user back to the same login page that initiated the authentication flow.
|
|
473
|
+
* 2. Call the `signIn()` method in the page the user is redirected to after authentication.
|
|
474
|
+
*
|
|
475
|
+
* **To fire a callback function after signing in, use the `on()` method.**
|
|
476
|
+
* **To learn more about the `on()` method:**
|
|
477
|
+
* @see {@link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#on}
|
|
478
|
+
*
|
|
479
|
+
* @param {SignInConfig} config - The sign-in config.
|
|
480
|
+
* The `SignInConfig` object has these two attributes in addition to any custom key-value pairs.
|
|
481
|
+
* 1. fidp - Specifies the FIDP parameter that is used to take the user directly to an IdP login page.
|
|
482
|
+
* 2. forceInit: Specifies if the OIDC Provider Meta Data should be loaded again from the `well-known`
|
|
483
|
+
* endpoint.
|
|
484
|
+
* 3. Any other parameters that should be appended to the authorization request.
|
|
485
|
+
*
|
|
486
|
+
* @return {Promise<BasicUserInfo>} - A promise that resolves with the user information.
|
|
487
|
+
*
|
|
488
|
+
* @example
|
|
489
|
+
* ```
|
|
490
|
+
* auth.signIn();
|
|
491
|
+
* ```
|
|
492
|
+
*
|
|
493
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#signin
|
|
494
|
+
*
|
|
495
|
+
* @memberof AsgardeoSPAClient
|
|
496
|
+
*
|
|
497
|
+
* @preserve
|
|
498
|
+
*/signIn(t,l,i){var e;return n(this,void 0,void 0,(function*(){if(yield this._isInitialized(),Bn.setInitializedSignIn(Boolean(null==t?void 0:t.callOnlyOnRedirect)))return null==t||delete t.callOnlyOnRedirect,null===(e=this._client)||void 0===e?void 0:e.signIn(t,l,i).then(t=>(this._onSignInCallback&&(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t),t))}))}trySignInSilently(){var t;return n(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!Bn.wasSignInCalled())return Bn.setInitializedSignIn(!1),null===(t=this._client)||void 0===t?void 0:t.trySignInSilently().then(t=>{if(this._onSignInCallback&&t){const l=t;(l.allowedScopes||l.displayName||l.email||l.username)&&this._onSignInCallback(l)}return t})}))}
|
|
499
|
+
/**
|
|
500
|
+
* This method initiates the sign-out flow.
|
|
501
|
+
*
|
|
502
|
+
* **To fire a callback function after signing out, use the `on()` method.**
|
|
503
|
+
* **To learn more about the `on()` method:**
|
|
504
|
+
* @see {@link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#on}
|
|
505
|
+
*
|
|
506
|
+
* @return {Promise<boolean>} - Returns a promise that resolves with `true` if sign out is successful.
|
|
507
|
+
*
|
|
508
|
+
* @example
|
|
509
|
+
* ```
|
|
510
|
+
* auth.signOut();
|
|
511
|
+
* ```
|
|
512
|
+
*
|
|
513
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#signout
|
|
514
|
+
*
|
|
515
|
+
* @memberof AsgardeoSPAClient
|
|
516
|
+
*
|
|
517
|
+
* @preserve
|
|
518
|
+
*/signOut(){var t,l;return n(this,void 0,void 0,(function*(){return yield this._validateMethod(),null!==(l=yield null===(t=this._client)||void 0===t?void 0:t.signOut())&&void 0!==l&&l}))}
|
|
519
|
+
/**
|
|
520
|
+
* This method sends an API request to a protected endpoint.
|
|
521
|
+
* The access token is automatically attached to the header of the request.
|
|
522
|
+
* This is the only way by which protected endpoints can be accessed
|
|
523
|
+
* when the web worker is used to store session information.
|
|
524
|
+
*
|
|
525
|
+
* @param {HttpRequestConfig} config - The config object containing attributes necessary to send a request.
|
|
526
|
+
*
|
|
527
|
+
* @return {Promise<HttpResponse>} - Returns a Promise that resolves with the response to the request.
|
|
528
|
+
*
|
|
529
|
+
* @example
|
|
530
|
+
* ```
|
|
531
|
+
* const requestConfig = {
|
|
532
|
+
* headers: {
|
|
533
|
+
* "Accept": "application/json",
|
|
534
|
+
* "Access-Control-Allow-Origin": "https://localhost:9443/myaccount",
|
|
535
|
+
* "Content-Type": "application/scim+json"
|
|
536
|
+
* },
|
|
537
|
+
* method: "GET",
|
|
538
|
+
* url: "https://localhost:9443/scim2/me"
|
|
539
|
+
* };
|
|
540
|
+
*
|
|
541
|
+
* return auth.httpRequest(requestConfig)
|
|
542
|
+
* .then((response) => {
|
|
543
|
+
* // console.log(response);
|
|
544
|
+
* })
|
|
545
|
+
* .catch((error) => {
|
|
546
|
+
* // console.error(error);
|
|
547
|
+
* });
|
|
548
|
+
* ```
|
|
549
|
+
*
|
|
550
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#httprequest
|
|
551
|
+
*
|
|
552
|
+
* @memberof AsgardeoSPAClient
|
|
553
|
+
*
|
|
554
|
+
* @preserve
|
|
555
|
+
*/httpRequest(t){var l;return n(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(l=this._client)||void 0===l?void 0:l.httpRequest(t)}))}
|
|
556
|
+
/**
|
|
557
|
+
* This method sends multiple API requests to a protected endpoint.
|
|
558
|
+
* The access token is automatically attached to the header of the request.
|
|
559
|
+
* This is the only way by which multiple requests can be sent to protected endpoints
|
|
560
|
+
* when the web worker is used to store session information.
|
|
561
|
+
*
|
|
562
|
+
* @param {HttpRequestConfig[]} config - The config object containing attributes necessary to send a request.
|
|
563
|
+
*
|
|
564
|
+
* @return {Promise<HttpResponse[]>} - Returns a Promise that resolves with the responses to the requests.
|
|
565
|
+
*
|
|
566
|
+
* @example
|
|
567
|
+
* ```
|
|
568
|
+
* const requestConfig = {
|
|
569
|
+
* headers: {
|
|
570
|
+
* "Accept": "application/json",
|
|
571
|
+
* "Content-Type": "application/scim+json"
|
|
572
|
+
* },
|
|
573
|
+
* method: "GET",
|
|
574
|
+
* url: "https://localhost:9443/scim2/me"
|
|
575
|
+
* };
|
|
576
|
+
*
|
|
577
|
+
* const requestConfig2 = {
|
|
578
|
+
* headers: {
|
|
579
|
+
* "Accept": "application/json",
|
|
580
|
+
* "Content-Type": "application/scim+json"
|
|
581
|
+
* },
|
|
582
|
+
* method: "GET",
|
|
583
|
+
* url: "https://localhost:9443/scim2/me"
|
|
584
|
+
* };
|
|
585
|
+
*
|
|
586
|
+
* return auth.httpRequest([requestConfig, requestConfig2])
|
|
587
|
+
* .then((responses) => {
|
|
588
|
+
* response.forEach((response)=>{
|
|
589
|
+
* // console.log(response);
|
|
590
|
+
* });
|
|
591
|
+
* })
|
|
592
|
+
* .catch((error) => {
|
|
593
|
+
* // console.error(error);
|
|
594
|
+
* });
|
|
595
|
+
* ```
|
|
596
|
+
*
|
|
597
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#httprequestall
|
|
598
|
+
*
|
|
599
|
+
* @memberof AsgardeoSPAClient
|
|
600
|
+
*
|
|
601
|
+
* @preserve
|
|
602
|
+
*/httpRequestAll(t){var l;return n(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(l=this._client)||void 0===l?void 0:l.httpRequestAll(t)}))}
|
|
603
|
+
/**
|
|
604
|
+
* This method allows you to send a request with a custom grant.
|
|
605
|
+
*
|
|
606
|
+
* @param {CustomGrantRequestParams} config - The request parameters.
|
|
607
|
+
*
|
|
608
|
+
* @return {Promise<HttpResponse<any> | SignInResponse>} - A Promise that resolves with
|
|
609
|
+
* the value returned by the custom grant request.
|
|
610
|
+
*
|
|
611
|
+
* @example
|
|
612
|
+
* ```
|
|
613
|
+
* auth.customGrant({
|
|
614
|
+
* attachToken: false,
|
|
615
|
+
* data: {
|
|
616
|
+
* client_id: "{{clientId}}",
|
|
617
|
+
* grant_type: "account_switch",
|
|
618
|
+
* scope: "{{scope}}",
|
|
619
|
+
* token: "{{token}}",
|
|
620
|
+
* },
|
|
621
|
+
* id: "account-switch",
|
|
622
|
+
* returnResponse: true,
|
|
623
|
+
* returnsSession: true,
|
|
624
|
+
* signInRequired: true
|
|
625
|
+
* });
|
|
626
|
+
* ```
|
|
627
|
+
*
|
|
628
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#customgrant
|
|
629
|
+
*
|
|
630
|
+
* @memberof AsgardeoSPAClient
|
|
631
|
+
*
|
|
632
|
+
* @preserve
|
|
633
|
+
*/requestCustomGrant(t){var l,i;return n(this,void 0,void 0,(function*(){if(t.signInRequired,yield this._validateMethod(),!t.id)return Promise.reject(new Nn("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 n=yield null===(l=this._client)||void 0===l?void 0:l.requestCustomGrant(t),e=this._onCustomGrant.get(t.id);return e&&e(null===(i=this._onCustomGrant)||void 0===i?void 0:i.get(t.id)),n}))}
|
|
634
|
+
/**
|
|
635
|
+
* This method ends a user session. The access token is revoked and the session information is destroyed.
|
|
636
|
+
*
|
|
637
|
+
* **To fire a callback function after ending user session, use the `on()` method.**
|
|
638
|
+
* **To learn more about the `on()` method:**
|
|
639
|
+
* @see {@link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#on}
|
|
640
|
+
*
|
|
641
|
+
* @return {Promise<boolean>} - A promise that resolves with `true` if the process is successful.
|
|
642
|
+
*
|
|
643
|
+
* @example
|
|
644
|
+
* ```
|
|
645
|
+
* auth.endUserSession();
|
|
646
|
+
* ```
|
|
647
|
+
*
|
|
648
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#endusersession
|
|
649
|
+
*
|
|
650
|
+
* @memberof AsgardeoSPAClient
|
|
651
|
+
*
|
|
652
|
+
* @preserve
|
|
653
|
+
*/revokeAccessToken(){var t;return n(this,void 0,void 0,(function*(){yield this._validateMethod();const l=yield null===(t=this._client)||void 0===t?void 0:t.revokeAccessToken();return this._onEndUserSession&&this._onEndUserSession(l),l}))}
|
|
654
|
+
/**
|
|
655
|
+
* This method returns a Promise that resolves with an object containing the service endpoints.
|
|
656
|
+
*
|
|
657
|
+
* @return {Promise<ServiceResourcesType} - A Promise that resolves with an object containing the service endpoints.
|
|
658
|
+
*
|
|
659
|
+
* @example
|
|
660
|
+
* ```
|
|
661
|
+
* auth.getServiceEndpoints().then((endpoints) => {
|
|
662
|
+
* // console.log(endpoints);
|
|
663
|
+
* }).error((error) => {
|
|
664
|
+
* // console.error(error);
|
|
665
|
+
* });
|
|
666
|
+
* ```
|
|
667
|
+
*
|
|
668
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getserviceendpoints
|
|
669
|
+
*
|
|
670
|
+
* @memberof AsgardeoSPAClient
|
|
671
|
+
*
|
|
672
|
+
* @preserve
|
|
673
|
+
*/getOIDCServiceEndpoints(){var t;return n(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.getOIDCServiceEndpoints()}))}
|
|
674
|
+
/**
|
|
675
|
+
* This methods returns the Axios http client.
|
|
676
|
+
*
|
|
677
|
+
* @return {HttpClientInstance} - The Axios HTTP client.
|
|
678
|
+
*
|
|
679
|
+
* @memberof AsgardeoSPAClient
|
|
680
|
+
*
|
|
681
|
+
* @preserve
|
|
682
|
+
*/getHttpClient(){if(this._client){if(this._storage!==fn.WebWorker)return this._client.getHttpClient();throw new Nn("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 Nn("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.")}
|
|
683
|
+
/**
|
|
684
|
+
* This method decodes the payload of the id token and returns it.
|
|
685
|
+
*
|
|
686
|
+
* @return {Promise<DecodedIdTokenPayloadInterface>} - A Promise that resolves with
|
|
687
|
+
* the decoded payload of the id token.
|
|
688
|
+
*
|
|
689
|
+
* @example
|
|
690
|
+
* ```
|
|
691
|
+
* auth.getDecodedIDToken().then((response)=>{
|
|
692
|
+
* // console.log(response);
|
|
693
|
+
* }).catch((error)=>{
|
|
694
|
+
* // console.error(error);
|
|
695
|
+
* });
|
|
696
|
+
* ```
|
|
697
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getdecodedidtoken
|
|
698
|
+
*
|
|
699
|
+
* @memberof AsgardeoSPAClient
|
|
700
|
+
*
|
|
701
|
+
* @preserve
|
|
702
|
+
*/getDecodedIDToken(){var t;return n(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(t=this._client)||void 0===t?void 0:t.getDecodedIDToken()}))}
|
|
703
|
+
/**
|
|
704
|
+
* This method return the ID token.
|
|
705
|
+
*
|
|
706
|
+
* @return {Promise<string>} - A Promise that resolves with the ID token.
|
|
707
|
+
*
|
|
708
|
+
* @example
|
|
709
|
+
* ```
|
|
710
|
+
* const idToken = await auth.getIDToken();
|
|
711
|
+
* ```
|
|
712
|
+
*
|
|
713
|
+
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getIDToken
|
|
714
|
+
*
|
|
715
|
+
* @memberof AsgardeoAuthClient
|
|
716
|
+
*
|
|
717
|
+
* @preserve
|
|
718
|
+
*/getIDToken(){var t;return n(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(t=this._client)||void 0===t?void 0:t.getIDToken()}))}
|
|
719
|
+
/**
|
|
720
|
+
* This method return a Promise that resolves with the access token.
|
|
721
|
+
*
|
|
722
|
+
* **This method will not return the access token if the storage type is set to `webWorker`.**
|
|
723
|
+
*
|
|
724
|
+
* @return {Promise<string>} - A Promise that resolves with the access token.
|
|
725
|
+
*
|
|
726
|
+
* @example
|
|
727
|
+
* ```
|
|
728
|
+
* auth.getAccessToken().then((token) => {
|
|
729
|
+
* // console.log(token);
|
|
730
|
+
* }).catch((error) => {
|
|
731
|
+
* // console.error(error);
|
|
732
|
+
* });
|
|
733
|
+
* ```
|
|
734
|
+
*
|
|
735
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getaccesstoken
|
|
736
|
+
*
|
|
737
|
+
* @memberof AsgardeoSPAClient
|
|
738
|
+
*
|
|
739
|
+
* @preserve
|
|
740
|
+
*/getAccessToken(){return n(this,void 0,void 0,(function*(){return yield this._validateMethod(),this._storage&&[(fn.WebWorker,fn.BrowserMemory)].includes(this._storage)?Promise.reject(new Nn("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.")):this._client.getAccessToken()}))}
|
|
741
|
+
/**
|
|
742
|
+
* This method refreshes the access token.
|
|
743
|
+
*
|
|
744
|
+
* @return {TokenResponseInterface} - A Promise that resolves with an object containing
|
|
745
|
+
* information about the refreshed access token.
|
|
746
|
+
*
|
|
747
|
+
* @example
|
|
748
|
+
* ```
|
|
749
|
+
* auth.refreshToken().then((response)=>{
|
|
750
|
+
* // console.log(response);
|
|
751
|
+
* }).catch((error)=>{
|
|
752
|
+
* // console.error(error);
|
|
753
|
+
* });
|
|
754
|
+
* ```
|
|
755
|
+
*
|
|
756
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#refreshtoken
|
|
757
|
+
*
|
|
758
|
+
* @memberof AsgardeoSPAClient
|
|
759
|
+
*
|
|
760
|
+
* @preserve
|
|
761
|
+
*/refreshAccessToken(){var t;return n(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(t=this._client)||void 0===t?void 0:t.refreshAccessToken()}))}
|
|
762
|
+
/**
|
|
763
|
+
* This method specifies if the user is authenticated or not.
|
|
764
|
+
*
|
|
765
|
+
* @return {Promise<boolean>} - A Promise that resolves with `true` if the user is authenticated.
|
|
766
|
+
*
|
|
767
|
+
* @memberof AsgardeoSPAClient
|
|
768
|
+
*
|
|
769
|
+
* @preserve
|
|
770
|
+
*/isAuthenticated(){var t;return n(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.isAuthenticated()}))}on(t,l,i){var e,c,o,d;return n(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!l||"function"!=typeof l)throw new Nn("AUTH_CLIENT-ON-IV02","client","on","Invalid callback function.","The provided callback function is invalid.");switch(t){case Yn.SignIn:this._onSignInCallback=l;break;case Yn.SignOut:this._onSignOutCallback=l,Bn.isSignOutSuccessful()&&this._onSignOutCallback();break;case Yn.RevokeAccessToken:this._onEndUserSession=l;break;case Yn.Initialize:this._onInitialize=l;break;case Yn.HttpRequestError:null===(e=this._client)||void 0===e||e.setHttpRequestErrorCallback(l);break;case Yn.HttpRequestFinish:null===(c=this._client)||void 0===c||c.setHttpRequestFinishCallback(l);break;case Yn.HttpRequestStart:null===(o=this._client)||void 0===o||o.setHttpRequestStartCallback(l);break;case Yn.HttpRequestSuccess:null===(d=this._client)||void 0===d||d.setHttpRequestSuccessCallback(l);break;case Yn.CustomGrant:i&&this._onCustomGrant.set(i,l);break;default:throw new Nn("AUTH_CLIENT-ON-IV01","client","on","Invalid hook.","The provided hook is invalid.")}}))}
|
|
771
|
+
/**
|
|
772
|
+
* This method enables callback functions attached to the http client.
|
|
773
|
+
*
|
|
774
|
+
* @return {Promise<boolean>} - A promise that resolves with True.
|
|
775
|
+
*
|
|
776
|
+
* @example
|
|
777
|
+
* ```
|
|
778
|
+
* auth.enableHttpHandler();
|
|
779
|
+
* ```
|
|
780
|
+
*
|
|
781
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#enableHttpHandler
|
|
782
|
+
*
|
|
783
|
+
* @memberof AsgardeoSPAClient
|
|
784
|
+
*
|
|
785
|
+
* @preserve
|
|
786
|
+
*/enableHttpHandler(){var t;return n(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.enableHttpHandler()}))}
|
|
787
|
+
/**
|
|
788
|
+
* This method disables callback functions attached to the http client.
|
|
789
|
+
*
|
|
790
|
+
* @return {Promise<boolean>} - A promise that resolves with True.
|
|
791
|
+
*
|
|
792
|
+
* @example
|
|
793
|
+
* ```
|
|
794
|
+
* auth.disableHttpHandler();
|
|
795
|
+
* ```
|
|
796
|
+
*
|
|
797
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#disableHttpHandler
|
|
798
|
+
*
|
|
799
|
+
* @memberof AsgardeoSPAClient
|
|
800
|
+
*
|
|
801
|
+
* @preserve
|
|
802
|
+
*/disableHttpHandler(){var t;return n(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.disableHttpHandler()}))}
|
|
803
|
+
/**
|
|
804
|
+
* This method updates the configuration that was passed into the constructor when instantiating this class.
|
|
805
|
+
*
|
|
806
|
+
* @param {Partial<AuthClientConfig<T>>} config - A config object to update the SDK configurations with.
|
|
807
|
+
*
|
|
808
|
+
* @example
|
|
809
|
+
* ```
|
|
810
|
+
* const config = {
|
|
811
|
+
* signInRedirectURL: "http://localhost:3000/sign-in",
|
|
812
|
+
* clientID: "client ID",
|
|
813
|
+
* serverOrigin: "https://localhost:9443"
|
|
814
|
+
* }
|
|
815
|
+
* const auth.updateConfig(config);
|
|
816
|
+
* ```
|
|
817
|
+
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master/lib#updateConfig
|
|
818
|
+
*
|
|
819
|
+
* @memberof AsgardeoAuthClient
|
|
820
|
+
*
|
|
821
|
+
* @preserve
|
|
822
|
+
*/updateConfig(t){return n(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===fn.WebWorker){const l=this._client;yield l.updateConfig(t)}else{const l=this._client;yield l.updateConfig(t)}}))}}Pn._instances=new Map;class Mn extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}}).call(this,i(134))},function(t,l,i){var n=i(11).f,e=i(15),c=i(7)("toStringTag");t.exports=function(t,l,i){t&&!e(t=i?t:t.prototype,c)&&n(t,c,{configurable:!0,value:l})}},function(t,l,i){var n=i(7),e=i(26),c=i(11),o=n("unscopables"),d=Array.prototype;null==d[o]&&c.f(d,o,{configurable:!0,value:e(null)}),t.exports=function(t){d[o][t]=!0}},function(t,l,i){var n=i(4),e=i(79);t.exports=n?e:function(t){return Map.prototype.entries.call(t)}},function(t,l){t.exports=function(t,l){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:l}}},function(t,l){var i={}.toString;t.exports=function(t){return i.call(t).slice(8,-1)}},function(t,l,i){"use strict";var n=i(2);t.exports=function(t,l){var i=[][t];return!!i&&n((function(){i.call(null,l||function(){throw 1},1)}))}},function(t,l,i){var n=i(24);t.exports=function(t,l,i){for(var e in l)n(t,e,l[e],i);return t}},function(t,l,i){"use strict";var n=i(0),e=i(5),c=i(9),o=i(130),d=i(12),a=i(88),r=i(34),u=i(39),Z=i(16),s=i(10),b=i(149),m=i(173),h=i(33),I=i(15),p=i(73),G=i(8),y=i(26),X=i(48),g=i(49).f,V=i(174),W=i(22).forEach,C=i(51),R=i(11),S=i(23),K=i(17),f=i(90),Y=K.get,v=K.set,N=R.f,J=S.f,H=Math.round,L=e.RangeError,U=a.ArrayBuffer,x=a.DataView,T=d.NATIVE_ARRAY_BUFFER_VIEWS,k=d.TYPED_ARRAY_TAG,B=d.TypedArray,F=d.TypedArrayPrototype,z=d.aTypedArrayConstructor,A=d.isTypedArray,w=function(t,l){for(var i=0,n=l.length,e=new(z(t))(n);n>i;)e[i]=l[i++];return e},Q=function(t,l){N(t,l,{get:function(){return Y(this)[l]}})},P=function(t){var l;return t instanceof U||"ArrayBuffer"==(l=p(t))||"SharedArrayBuffer"==l},M=function(t,l){return A(t)&&"symbol"!=typeof l&&l in t&&String(+l)==String(l)},j=function(t,l){return M(t,l=h(l,!0))?u(2,t[l]):J(t,l)},E=function(t,l,i){return!(M(t,l=h(l,!0))&&G(i)&&I(i,"value"))||I(i,"get")||I(i,"set")||i.configurable||I(i,"writable")&&!i.writable||I(i,"enumerable")&&!i.enumerable?N(t,l,i):(t[l]=i.value,t)};c?(T||(S.f=j,R.f=E,Q(F,"buffer"),Q(F,"byteOffset"),Q(F,"byteLength"),Q(F,"length")),n({target:"Object",stat:!0,forced:!T},{getOwnPropertyDescriptor:j,defineProperty:E}),t.exports=function(t,l,i){var c=t.match(/\d+$/)[0]/8,d=t+(i?"Clamped":"")+"Array",a="get"+t,u="set"+t,h=e[d],I=h,p=I&&I.prototype,R={},S=function(t,l){N(t,l,{get:function(){return function(t,l){var i=Y(t);return i.view[a](l*c+i.byteOffset,!0)}(this,l)},set:function(t){return function(t,l,n){var e=Y(t);i&&(n=(n=H(n))<0?0:n>255?255:255&n),e.view[u](l*c+e.byteOffset,n,!0)}(this,l,t)},enumerable:!0})};T?o&&(I=l((function(t,l,i,n){return r(t,I,d),f(G(l)?P(l)?void 0!==n?new h(l,m(i,c),n):void 0!==i?new h(l,m(i,c)):new h(l):A(l)?w(I,l):V.call(I,l):new h(b(l)),t,I)})),X&&X(I,B),W(g(h),(function(t){t in I||Z(I,t,h[t])})),I.prototype=p):(I=l((function(t,l,i,n){r(t,I,d);var e,o,a,u=0,Z=0;if(G(l)){if(!P(l))return A(l)?w(I,l):V.call(I,l);e=l,Z=m(i,c);var h=l.byteLength;if(void 0===n){if(h%c)throw L("Wrong length");if((o=h-Z)<0)throw L("Wrong length")}else if((o=s(n)*c)+Z>h)throw L("Wrong length");a=o/c}else a=b(l),e=new U(o=a*c);for(v(t,{buffer:e,byteOffset:Z,byteLength:o,length:a,view:new x(e)});u<a;)S(t,u++)})),X&&X(I,B),p=I.prototype=y(F)),p.constructor!==I&&Z(p,"constructor",I),k&&Z(p,k,d),R[d]=I,n({global:!0,forced:I!=h,sham:!T},R),"BYTES_PER_ELEMENT"in I||Z(I,"BYTES_PER_ELEMENT",c),"BYTES_PER_ELEMENT"in p||Z(p,"BYTES_PER_ELEMENT",c),C(d)}):t.exports=function(){}},function(t,l,i){var n=i(122),e=i(131),c=i(83)("metadata"),o=c.store||(c.store=new e),d=function(t,l,i){var e=o.get(t);if(!e){if(!i)return;o.set(t,e=new n)}var c=e.get(l);if(!c){if(!i)return;e.set(l,c=new n)}return c};t.exports={store:o,getMap:d,has:function(t,l,i){var n=d(l,i,!1);return void 0!==n&&n.has(t)},get:function(t,l,i){var n=d(l,i,!1);return void 0===n?void 0:n.get(t)},set:function(t,l,i,n){d(i,n,!0).set(t,l)},keys:function(t,l){var i=d(t,l,!1),n=[];return i&&i.forEach((function(t,l){n.push(l)})),n},toKey:function(t){return void 0===t||"symbol"==typeof t?t:String(t)}}},function(t,l,i){var n=i(29),e=Math.max,c=Math.min;t.exports=function(t,l){var i=n(t);return i<0?e(i+l,0):c(i,l)}},function(t,l,i){var n=i(40);t.exports=Array.isArray||function(t){return"Array"==n(t)}},function(t,l,i){var n=i(73),e=i(72),c=i(7)("iterator");t.exports=function(t){if(null!=t)return t[c]||t["@@iterator"]||e[n(t)]}},function(t,l,i){var n=i(1),e=i(147);t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,l=!1,i={};try{(t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(i,[]),l=i instanceof Array}catch(t){}return function(i,c){return n(i),e(c),l?t.call(i,c):i.__proto__=c,i}}():void 0)},function(t,l,i){var n=i(138),e=i(108).concat("length","prototype");l.f=Object.getOwnPropertyNames||function(t){return n(t,e)}},function(t,l,i){"use strict";var n=i(33),e=i(11),c=i(39);t.exports=function(t,l,i){var o=n(l);o in t?e.f(t,o,c(0,i)):t[o]=i}},function(t,l,i){"use strict";var n=i(13),e=i(11),c=i(7),o=i(9),d=c("species");t.exports=function(t){var l=n(t),i=e.f;o&&l&&!l[d]&&i(l,d,{configurable:!0,get:function(){return this}})}},function(t,l,i){var n=i(65),e=i(8),c=i(15),o=i(11).f,d=i(64),a=i(74),r=d("meta"),u=0,Z=Object.isExtensible||function(){return!0},s=function(t){o(t,r,{value:{objectID:"O"+ ++u,weakData:{}}})},b=t.exports={REQUIRED:!1,fastKey:function(t,l){if(!e(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!c(t,r)){if(!Z(t))return"F";if(!l)return"E";s(t)}return t[r].objectID},getWeakData:function(t,l){if(!c(t,r)){if(!Z(t))return!0;if(!l)return!1;s(t)}return t[r].weakData},onFreeze:function(t){return a&&b.REQUIRED&&Z(t)&&!c(t,r)&&s(t),t}};n[r]=!0},function(t,l,i){"use strict";var n=i(56),e=i(3),c=i(1),o=i(26),d=i(16),a=i(42),r=i(7),u=i(17),Z=i(13)("Promise"),s=u.set,b=u.get,m=r("toStringTag"),h=function(t){var l=b(this).iterator,i=l.return;return void 0===i?Z.resolve({done:!0,value:t}):c(i.call(l,t))},I=function(t){var l=b(this).iterator,i=l.throw;return void 0===i?Z.reject(t):i.call(l,t)};t.exports=function(t,l){var i=function(t){t.next=e(t.iterator.next),t.done=!1,s(this,t)};return i.prototype=a(o(n.AsyncIterator.prototype),{next:function(l){var i=b(this);if(i.done)return Z.resolve({done:!0,value:void 0});try{return Z.resolve(c(t.call(i,l,Z)))}catch(t){return Z.reject(t)}},return:h,throw:I}),l||d(i.prototype,m,"Generator"),i}},function(t,l,i){"use strict";var n=i(56),e=i(3),c=i(1),o=i(26),d=i(16),a=i(42),r=i(7),u=i(17),Z=u.set,s=u.get,b=r("toStringTag"),m=function(t){var l=s(this).iterator,i=l.return;return void 0===i?{done:!0,value:t}:c(i.call(l,t))},h=function(t){var l=s(this).iterator,i=l.throw;if(void 0===i)throw t;return i.call(l,t)};t.exports=function(t,l){var i=function(t){t.next=e(t.iterator.next),t.done=!1,Z(this,t)};return i.prototype=a(o(n.Iterator.prototype),{next:function(){var l=s(this),i=l.done?void 0:t.apply(l,arguments);return{done:l.done,value:i}},return:m,throw:h}),l||d(i.prototype,b,"Generator"),i}},function(t,l,i){var n=i(4),e=i(79);t.exports=n?e:function(t){return Set.prototype.values.call(t)}},function(t,l,i){var n=i(5);t.exports=n},function(t,l,i){var n=i(138),e=i(108);t.exports=Object.keys||function(t){return n(t,e)}},function(t,l,i){"use strict";var n=i(117).IteratorPrototype,e=i(26),c=i(39),o=i(36),d=i(72),a=function(){return this};t.exports=function(t,l,i){var r=l+" Iterator";return t.prototype=e(n,{next:c(1,i)}),o(t,r,!1,!0),d[r]=a,t}},function(t,l,i){var n=i(40),e=i(5);t.exports="process"==n(e.process)},function(t,l,i){var n=i(21),e="["+i(92)+"]",c=RegExp("^"+e+e+"*"),o=RegExp(e+e+"*$"),d=function(t){return function(l){var i=String(n(l));return 1&t&&(i=i.replace(c,"")),2&t&&(i=i.replace(o,"")),i}};t.exports={start:d(1),end:d(2),trim:d(3)}},function(t,l,i){"use strict";var n=i(1);t.exports=function(){var t=n(this),l="";return t.global&&(l+="g"),t.ignoreCase&&(l+="i"),t.multiline&&(l+="m"),t.dotAll&&(l+="s"),t.unicode&&(l+="u"),t.sticky&&(l+="y"),l}},function(t,l,i){var n=i(29),e=i(21),c=function(t){return function(l,i){var c,o,d=String(e(l)),a=n(i),r=d.length;return a<0||a>=r?t?"":void 0:(c=d.charCodeAt(a))<55296||c>56319||a+1===r||(o=d.charCodeAt(a+1))<56320||o>57343?t?d.charAt(a):c:t?d.slice(a,a+2):o-56320+(c-55296<<10)+65536}};t.exports={codeAt:c(!1),charAt:c(!0)}},function(t,l,i){var n=i(2),e=i(40),c="".split;t.exports=n((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==e(t)?c.call(t,""):Object(t)}:Object},function(t,l){var i=0,n=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++i+n).toString(36)}},function(t,l){t.exports={}},function(t,l,i){var n=i(28),e=i(10),c=i(45),o=function(t){return function(l,i,o){var d,a=n(l),r=e(a.length),u=c(o,r);if(t&&i!=i){for(;r>u;)if((d=a[u++])!=d)return!0}else for(;r>u;u++)if((t||u in a)&&a[u]===i)return t||u||0;return!t&&-1}};t.exports={includes:o(!0),indexOf:o(!1)}},function(t,l,i){var n=i(2),e=/#|\.prototype\./,c=function(t,l){var i=d[o(t)];return i==r||i!=a&&("function"==typeof l?n(l):!!l)},o=c.normalize=function(t){return String(t).replace(e,".").toLowerCase()},d=c.data={},a=c.NATIVE="N",r=c.POLYFILL="P";t.exports=c},function(t,l,i){var n=i(8),e=i(46),c=i(7)("species");t.exports=function(t,l){var i;return e(t)&&("function"!=typeof(i=t.constructor)||i!==Array&&!e(i.prototype)?n(i)&&null===(i=i[c])&&(i=void 0):i=void 0),new(void 0===i?Array:i)(0===l?0:l)}},function(t,l,i){var n=i(2),e=i(7),c=i(70),o=e("species");t.exports=function(t){return c>=51||!n((function(){var l=[];return(l.constructor={})[o]=function(){return{foo:1}},1!==l[t](Boolean).foo}))}},function(t,l,i){var n,e,c=i(5),o=i(71),d=c.process,a=d&&d.versions,r=a&&a.v8;r?e=(n=r.split("."))[0]+n[1]:o&&(!(n=o.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=o.match(/Chrome\/(\d+)/))&&(e=n[1]),t.exports=e&&+e},function(t,l,i){var n=i(13);t.exports=n("navigator","userAgent")||""},function(t,l){t.exports={}},function(t,l,i){var n=i(115),e=i(40),c=i(7)("toStringTag"),o="Arguments"==e(function(){return arguments}());t.exports=n?e:function(t){var l,i,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=function(t,l){try{return t[l]}catch(t){}}(l=Object(t),c))?i:o?e(l):"Object"==(n=e(l))&&"function"==typeof l.callee?"Arguments":n}},function(t,l,i){var n=i(2);t.exports=!n((function(){return Object.isExtensible(Object.preventExtensions({}))}))},function(t,l,i){"use strict";var n=i(3),e=function(t){var l,i;this.promise=new t((function(t,n){if(void 0!==l||void 0!==i)throw TypeError("Bad Promise constructor");l=t,i=n})),this.resolve=n(l),this.reject=n(i)};t.exports.f=function(t){return new e(t)}},function(t,l,i){var n=i(8),e=i(40),c=i(7)("match");t.exports=function(t){var l;return n(t)&&(void 0!==(l=t[c])?!!l:"RegExp"==e(t))}},function(t,l,i){var n=i(29);t.exports=function(t){var l=n(t);if(l<0)throw RangeError("The argument can't be less than 0");return l}},function(t,l,i){"use strict";var n=i(3),e=i(1),c=i(13)("Promise"),o=[].push,d=function(t){var l=0==t,i=1==t,d=2==t,a=3==t;return function(t,r){e(t);var u=n(t.next),Z=l?[]:void 0;return l||n(r),new c((function(n,s){var b=function(l,i){try{var n=t.return;if(void 0!==n)return c.resolve(n.call(t)).then((function(){l(i)}),(function(t){s(t)}))}catch(t){return s(t)}l(i)},m=function(t){b(s,t)},h=function(){try{c.resolve(e(u.call(t))).then((function(t){try{if(e(t).done)n(l?Z:!a&&(d||void 0));else{var u=t.value;l?(o.call(Z,u),h()):c.resolve(r(u)).then((function(t){i?h():d?t?h():b(n,!1):t?b(n,a||u):h()}),m)}}catch(t){m(t)}}),m)}catch(t){m(t)}};h()}))}};t.exports={toArray:d(0),forEach:d(1),every:d(2),some:d(3),find:d(4)}},function(t,l,i){var n=i(1),e=i(47);t.exports=function(t){var l=e(t);if("function"!=typeof l)throw TypeError(String(t)+" is not iterable");return n(l.call(t))}},function(t,l,i){"use strict";var n={}.propertyIsEnumerable,e=Object.getOwnPropertyDescriptor,c=e&&!n.call({1:2},1);l.f=c?function(t){var l=e(this,t);return!!l&&l.enumerable}:n},function(t,l,i){var n=i(5),e=i(105),c=n["__core-js_shared__"]||e("__core-js_shared__",{});t.exports=c},function(t,l,i){var n=i(83),e=i(64),c=n("keys");t.exports=function(t){return c[t]||(c[t]=e(t))}},function(t,l,i){var n=i(4),e=i(81);(t.exports=function(t,l){return e[t]||(e[t]=void 0!==l?l:{})})("versions",[]).push({version:"3.8.3",mode:n?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},function(t,l,i){var n=i(1);t.exports=function(t){var l=t.return;if(void 0!==l)return n(l.call(t)).value}},function(t,l,i){var n=i(7)("iterator"),e=!1;try{var c=0,o={next:function(){return{done:!!c++}},return:function(){e=!0}};o[n]=function(){return this},Array.from(o,(function(){throw 2}))}catch(t){}t.exports=function(t,l){if(!l&&!e)return!1;var i=!1;try{var c={};c[n]=function(){return{next:function(){return{done:i=!0}}}},t(c)}catch(t){}return i}},function(t,l,i){"use strict";var n=i(28),e=i(37),c=i(72),o=i(17),d=i(116),a=o.set,r=o.getterFor("Array Iterator");t.exports=d(Array,"Array",(function(t,l){a(this,{type:"Array Iterator",target:n(t),index:0,kind:l})}),(function(){var t=r(this),l=t.target,i=t.kind,n=t.index++;return!l||n>=l.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==i?{value:n,done:!1}:"values"==i?{value:l[n],done:!1}:{value:[n,l[n]],done:!1}}),"values"),c.Arguments=c.Array,e("keys"),e("values"),e("entries")},function(t,l,i){var n=i(3),e=i(14),c=i(63),o=i(10),d=function(t){return function(l,i,d,a){n(i);var r=e(l),u=c(r),Z=o(r.length),s=t?Z-1:0,b=t?-1:1;if(d<2)for(;;){if(s in u){a=u[s],s+=b;break}if(s+=b,t?s<0:Z<=s)throw TypeError("Reduce of empty array with no initial value")}for(;t?s>=0:Z>s;s+=b)s in u&&(a=i(a,u[s],s,r));return a}};t.exports={left:d(!1),right:d(!0)}},function(t,l,i){"use strict";var n=i(5),e=i(9),c=i(119),o=i(16),d=i(42),a=i(2),r=i(34),u=i(29),Z=i(10),s=i(149),b=i(232),m=i(25),h=i(48),I=i(49).f,p=i(11).f,G=i(112),y=i(36),X=i(17),g=X.get,V=X.set,W=n.ArrayBuffer,C=W,R=n.DataView,S=R&&R.prototype,K=Object.prototype,f=n.RangeError,Y=b.pack,v=b.unpack,N=function(t){return[255&t]},J=function(t){return[255&t,t>>8&255]},H=function(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]},L=function(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]},U=function(t){return Y(t,23,4)},x=function(t){return Y(t,52,8)},T=function(t,l){p(t.prototype,l,{get:function(){return g(this)[l]}})},k=function(t,l,i,n){var e=s(i),c=g(t);if(e+l>c.byteLength)throw f("Wrong index");var o=g(c.buffer).bytes,d=e+c.byteOffset,a=o.slice(d,d+l);return n?a:a.reverse()},B=function(t,l,i,n,e,c){var o=s(i),d=g(t);if(o+l>d.byteLength)throw f("Wrong index");for(var a=g(d.buffer).bytes,r=o+d.byteOffset,u=n(+e),Z=0;Z<l;Z++)a[r+Z]=u[c?Z:l-Z-1]};if(c){if(!a((function(){W(1)}))||!a((function(){new W(-1)}))||a((function(){return new W,new W(1.5),new W(NaN),"ArrayBuffer"!=W.name}))){for(var F,z=(C=function(t){return r(this,C),new W(s(t))}).prototype=W.prototype,A=I(W),w=0;A.length>w;)(F=A[w++])in C||o(C,F,W[F]);z.constructor=C}h&&m(S)!==K&&h(S,K);var Q=new R(new C(2)),P=S.setInt8;Q.setInt8(0,2147483648),Q.setInt8(1,2147483649),!Q.getInt8(0)&&Q.getInt8(1)||d(S,{setInt8:function(t,l){P.call(this,t,l<<24>>24)},setUint8:function(t,l){P.call(this,t,l<<24>>24)}},{unsafe:!0})}else C=function(t){r(this,C,"ArrayBuffer");var l=s(t);V(this,{bytes:G.call(new Array(l),0),byteLength:l}),e||(this.byteLength=l)},R=function(t,l,i){r(this,R,"DataView"),r(t,C,"DataView");var n=g(t).byteLength,c=u(l);if(c<0||c>n)throw f("Wrong offset");if(c+(i=void 0===i?n-c:Z(i))>n)throw f("Wrong length");V(this,{buffer:t,byteLength:i,byteOffset:c}),e||(this.buffer=t,this.byteLength=i,this.byteOffset=c)},e&&(T(C,"byteLength"),T(R,"buffer"),T(R,"byteLength"),T(R,"byteOffset")),d(R.prototype,{getInt8:function(t){return k(this,1,t)[0]<<24>>24},getUint8:function(t){return k(this,1,t)[0]},getInt16:function(t){var l=k(this,2,t,arguments.length>1?arguments[1]:void 0);return(l[1]<<8|l[0])<<16>>16},getUint16:function(t){var l=k(this,2,t,arguments.length>1?arguments[1]:void 0);return l[1]<<8|l[0]},getInt32:function(t){return L(k(this,4,t,arguments.length>1?arguments[1]:void 0))},getUint32:function(t){return L(k(this,4,t,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(t){return v(k(this,4,t,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(t){return v(k(this,8,t,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(t,l){B(this,1,t,N,l)},setUint8:function(t,l){B(this,1,t,N,l)},setInt16:function(t,l){B(this,2,t,J,l,arguments.length>2?arguments[2]:void 0)},setUint16:function(t,l){B(this,2,t,J,l,arguments.length>2?arguments[2]:void 0)},setInt32:function(t,l){B(this,4,t,H,l,arguments.length>2?arguments[2]:void 0)},setUint32:function(t,l){B(this,4,t,H,l,arguments.length>2?arguments[2]:void 0)},setFloat32:function(t,l){B(this,4,t,U,l,arguments.length>2?arguments[2]:void 0)},setFloat64:function(t,l){B(this,8,t,x,l,arguments.length>2?arguments[2]:void 0)}});y(C,"ArrayBuffer"),y(R,"DataView"),t.exports={ArrayBuffer:C,DataView:R}},function(t,l,i){"use strict";var n=i(0),e=i(5),c=i(67),o=i(24),d=i(52),a=i(6),r=i(34),u=i(8),Z=i(2),s=i(85),b=i(36),m=i(90);t.exports=function(t,l,i){var h=-1!==t.indexOf("Map"),I=-1!==t.indexOf("Weak"),p=h?"set":"add",G=e[t],y=G&&G.prototype,X=G,g={},V=function(t){var l=y[t];o(y,t,"add"==t?function(t){return l.call(this,0===t?0:t),this}:"delete"==t?function(t){return!(I&&!u(t))&&l.call(this,0===t?0:t)}:"get"==t?function(t){return I&&!u(t)?void 0:l.call(this,0===t?0:t)}:"has"==t?function(t){return!(I&&!u(t))&&l.call(this,0===t?0:t)}:function(t,i){return l.call(this,0===t?0:t,i),this})};if(c(t,"function"!=typeof G||!(I||y.forEach&&!Z((function(){(new G).entries().next()})))))X=i.getConstructor(l,t,h,p),d.REQUIRED=!0;else if(c(t,!0)){var W=new X,C=W[p](I?{}:-0,1)!=W,R=Z((function(){W.has(1)})),S=s((function(t){new G(t)})),K=!I&&Z((function(){for(var t=new G,l=5;l--;)t[p](l,l);return!t.has(-0)}));S||((X=l((function(l,i){r(l,X,t);var n=m(new G,l,X);return null!=i&&a(i,n[p],{that:n,AS_ENTRIES:h}),n}))).prototype=y,y.constructor=X),(R||K)&&(V("delete"),V("has"),h&&V("get")),(K||C)&&V(p),I&&y.clear&&delete y.clear}return g[t]=X,n({global:!0,forced:X!=G},g),b(X,t),I||i.setStrong(X,t,h),X}},function(t,l,i){var n=i(8),e=i(48);t.exports=function(t,l,i){var c,o;return e&&"function"==typeof(c=l.constructor)&&c!==i&&n(o=c.prototype)&&o!==i.prototype&&e(t,o),t}},function(t,l){var i=Math.expm1,n=Math.exp;t.exports=!i||i(10)>22025.465794806718||i(10)<22025.465794806718||-2e-17!=i(-2e-17)?function(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:n(t)-1}:i},function(t,l){t.exports="\t\n\v\f\r \u2028\u2029\ufeff"},function(t,l,i){"use strict";var n=i(4),e=i(5),c=i(2);t.exports=n||!c((function(){var t=Math.random();__defineSetter__.call(null,t,(function(){})),delete e[t]}))},function(t,l){t.exports=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}}},function(t,l,i){"use strict";var n=i(2);function e(t,l){return RegExp(t,l)}l.UNSUPPORTED_Y=n((function(){var t=e("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),l.BROKEN_CARET=n((function(){var t=e("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},function(t,l,i){"use strict";var n,e,c=i(61),o=i(95),d=RegExp.prototype.exec,a=String.prototype.replace,r=d,u=(n=/a/,e=/b*/g,d.call(n,"a"),d.call(e,"a"),0!==n.lastIndex||0!==e.lastIndex),Z=o.UNSUPPORTED_Y||o.BROKEN_CARET,s=void 0!==/()??/.exec("")[1];(u||s||Z)&&(r=function(t){var l,i,n,e,o=this,r=Z&&o.sticky,b=c.call(o),m=o.source,h=0,I=t;return r&&(-1===(b=b.replace("y","")).indexOf("g")&&(b+="g"),I=String(t).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==t[o.lastIndex-1])&&(m="(?: "+m+")",I=" "+I,h++),i=new RegExp("^(?:"+m+")",b)),s&&(i=new RegExp("^"+m+"$(?!\\s)",b)),u&&(l=o.lastIndex),n=d.call(r?i:o,I),r?n?(n.input=n.input.slice(h),n[0]=n[0].slice(h),n.index=o.lastIndex,o.lastIndex+=n[0].length):o.lastIndex=0:u&&n&&(o.lastIndex=o.global?n.index+n[0].length:l),s&&n&&n.length>1&&a.call(n[0],i,(function(){for(e=1;e<arguments.length-2;e++)void 0===arguments[e]&&(n[e]=void 0)})),n}),t.exports=r},function(t,l,i){"use strict";i(126);var n=i(24),e=i(2),c=i(7),o=i(96),d=i(16),a=c("species"),r=!e((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")})),u="$0"==="a".replace(/./,"$0"),Z=c("replace"),s=!!/./[Z]&&""===/./[Z]("a","$0"),b=!e((function(){var t=/(?:)/,l=t.exec;t.exec=function(){return l.apply(this,arguments)};var i="ab".split(t);return 2!==i.length||"a"!==i[0]||"b"!==i[1]}));t.exports=function(t,l,i,Z){var m=c(t),h=!e((function(){var l={};return l[m]=function(){return 7},7!=""[t](l)})),I=h&&!e((function(){var l=!1,i=/a/;return"split"===t&&((i={}).constructor={},i.constructor[a]=function(){return i},i.flags="",i[m]=/./[m]),i.exec=function(){return l=!0,null},i[m](""),!l}));if(!h||!I||"replace"===t&&(!r||!u||s)||"split"===t&&!b){var p=/./[m],G=i(m,""[t],(function(t,l,i,n,e){return l.exec===o?h&&!e?{done:!0,value:p.call(l,i,n)}:{done:!0,value:t.call(i,l,n)}:{done:!1}}),{REPLACE_KEEPS_$0:u,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:s}),y=G[0],X=G[1];n(String.prototype,t,y),n(RegExp.prototype,m,2==l?function(t,l){return X.call(t,this,l)}:function(t){return X.call(t,this)})}Z&&d(RegExp.prototype[m],"sham",!0)}},function(t,l,i){"use strict";var n=i(62).charAt;t.exports=function(t,l,i){return l+(i?n(t,l).length:1)}},function(t,l,i){var n=i(40),e=i(96);t.exports=function(t,l){var i=t.exec;if("function"==typeof i){var c=i.call(t,l);if("object"!=typeof c)throw TypeError("RegExp exec method returned something other than an Object or null");return c}if("RegExp"!==n(t))throw TypeError("RegExp#exec called on incompatible receiver");return e.call(t,l)}},function(t,l,i){"use strict";var n=i(1),e=i(3);t.exports=function(){for(var t,l=n(this),i=e(l.delete),c=!0,o=0,d=arguments.length;o<d;o++)t=i.call(l,arguments[o]),c=c&&t;return!!c}},function(t,l,i){"use strict";var n=i(3),e=i(18),c=i(6);t.exports=function(t){var l,i,o,d,a=arguments.length,r=a>1?arguments[1]:void 0;return n(this),(l=void 0!==r)&&n(r),null==t?new this:(i=[],l?(o=0,d=e(r,a>2?arguments[2]:void 0,2),c(t,(function(t){i.push(d(t,o++))}))):c(t,i.push,{that:i}),new this(i))}},function(t,l,i){"use strict";t.exports=function(){for(var t=arguments.length,l=new Array(t);t--;)l[t]=arguments[t];return new this(l)}},function(t,l,i){"use strict";i.d(l,"a",(function(){return I})),i.d(l,"b",(function(){return G})),i.d(l,"c",(function(){return y}));var n=i(35),e=i(32),c=i.n(e);function o(t,l){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);l&&(n=n.filter((function(l){return Object.getOwnPropertyDescriptor(t,l).enumerable}))),i.push.apply(i,n)}return i}function d(t){for(var l=1;l<arguments.length;l++){var i=null!=arguments[l]?arguments[l]:{};l%2?o(Object(i),!0).forEach((function(l){Z(t,l,i[l])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):o(Object(i)).forEach((function(l){Object.defineProperty(t,l,Object.getOwnPropertyDescriptor(i,l))}))}return t}function a(t,l,i,n,e,c,o){try{var d=t[c](o),a=d.value}catch(t){return void i(t)}d.done?l(a):Promise.resolve(a).then(n,e)}function r(t){return function(){var l=this,i=arguments;return new Promise((function(n,e){var c=t.apply(l,i);function o(t){a(c,n,e,o,d,"next",t)}function d(t){a(c,n,e,o,d,"throw",t)}o(void 0)}))}}function u(t,l){for(var i=0;i<l.length;i++){var n=l[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function Z(t,l,i){return l in t?Object.defineProperty(t,l,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[l]=i,t}var s=function(){function t(){!function(t,l){if(!(t instanceof l))throw new TypeError("Cannot call a class as a function")}(this,t),Z(this,"_authState",t.DEFAULT_STATE),Z(this,"_client",void 0),this._client=n.c.getInstance(),this.getState=this.getState.bind(this),this.init=this.init.bind(this),this.signIn=this.signIn.bind(this),this.signOut=this.signOut.bind(this),this.updateState=this.updateState.bind(this)}var l,i,e,c,o,a,s,b,m,h,I,p,G,y,X,g,V,W,C;return l=t,(i=[{key:"getState",value:function(){return this._authState}},{key:"init",value:function(t){return this._client.initialize(t)}},{key:"signIn",value:(C=r(regeneratorRuntime.mark((function t(l,i,e,c,o,a){var r=this;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return this._client.on(n.f.SignIn,(function(t){var n={allowedScopes:t.allowedScopes,displayName:t.displayName,email:t.email,isAuthenticated:!0,isLoading:!1,username:t.username};r.updateState(n),l(d(d({},i),n)),a&&a(t)})),t.next=3,this._client.signIn(e,c,o);case 3:case"end":return t.stop()}}),t,this)}))),function(t,l,i,n,e,c){return C.apply(this,arguments)})},{key:"signOut",value:function(l,i,e){var c=this;this._client.on(n.f.SignOut,(function(){var n=t.DEFAULT_STATE;c.updateState(n),l(d(d({},i),n)),e&&e()})),this._client.signOut()}},{key:"updateState",value:function(t){this._authState=d(d({},this._authState),t)}},{key:"getBasicUserInfo",value:(W=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.getBasicUserInfo());case 1:case"end":return t.stop()}}),t,this)}))),function(){return W.apply(this,arguments)})},{key:"httpRequest",value:(V=r(regeneratorRuntime.mark((function t(l){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.httpRequest(l));case 1:case"end":return t.stop()}}),t,this)}))),function(t){return V.apply(this,arguments)})},{key:"httpRequestAll",value:(g=r(regeneratorRuntime.mark((function t(l){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.httpRequestAll(l));case 1:case"end":return t.stop()}}),t,this)}))),function(t){return g.apply(this,arguments)})},{key:"requestCustomGrant",value:function(t,l,i){this._client.on(n.f.CustomGrant,(function(n){t.returnsSession&&i(d(d({},n),{},{isAuthenticated:!0,isLoading:!1})),l&&l(n)}),t.id),this._client.requestCustomGrant(t)}},{key:"revokeAccessToken",value:(X=r(regeneratorRuntime.mark((function l(i){return regeneratorRuntime.wrap((function(l){for(;;)switch(l.prev=l.next){case 0:return l.abrupt("return",this._client.revokeAccessToken().then((function(){return i(t.DEFAULT_STATE),!0})));case 1:case"end":return l.stop()}}),l,this)}))),function(t){return X.apply(this,arguments)})},{key:"getOIDCServiceEndpoints",value:(y=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.getOIDCServiceEndpoints());case 1:case"end":return t.stop()}}),t,this)}))),function(){return y.apply(this,arguments)})},{key:"getHttpClient",value:(G=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.getHttpClient());case 1:case"end":return t.stop()}}),t,this)}))),function(){return G.apply(this,arguments)})},{key:"getDecodedIDToken",value:(p=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.getDecodedIDToken());case 1:case"end":return t.stop()}}),t,this)}))),function(){return p.apply(this,arguments)})},{key:"getIDToken",value:(I=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.getIDToken());case 1:case"end":return t.stop()}}),t,this)}))),function(){return I.apply(this,arguments)})},{key:"getAccessToken",value:(h=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.getAccessToken());case 1:case"end":return t.stop()}}),t,this)}))),function(){return h.apply(this,arguments)})},{key:"refreshAccessToken",value:(m=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.refreshAccessToken());case 1:case"end":return t.stop()}}),t,this)}))),function(){return m.apply(this,arguments)})},{key:"isAuthenticated",value:(b=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.isAuthenticated());case 1:case"end":return t.stop()}}),t,this)}))),function(){return b.apply(this,arguments)})},{key:"enableHttpHandler",value:(s=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.enableHttpHandler());case 1:case"end":return t.stop()}}),t,this)}))),function(){return s.apply(this,arguments)})},{key:"disableHttpHandler",value:(a=r(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.disableHttpHandler());case 1:case"end":return t.stop()}}),t,this)}))),function(){return a.apply(this,arguments)})},{key:"updateConfig",value:(o=r(regeneratorRuntime.mark((function t(l){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.updateConfig(l));case 1:case"end":return t.stop()}}),t,this)}))),function(t){return o.apply(this,arguments)})},{key:"on",value:function(t,l,i){return t===n.f.CustomGrant?this._client.on(t,l,i):this._client.on(t,l)}},{key:"trySignInSilently",value:(c=r(regeneratorRuntime.mark((function t(l,i){var n=this;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",this._client.trySignInSilently().then((function(t){if(t){var e=t,c={allowedScopes:e.allowedScopes,displayName:e.displayName,email:e.email,isAuthenticated:!0,isLoading:!1,username:e.username};return n.updateState(c),i(d(d({},l),c)),t}return n.updateState(d(d({},l),{},{isLoading:!1})),i(d(d({},l),{},{isLoading:!1})),!1})));case 1:case"end":return t.stop()}}),t,this)}))),function(t,l){return c.apply(this,arguments)})}])&&u(l.prototype,i),e&&u(l,e),t}();function b(t,l,i,n,e,c,o){try{var d=t[c](o),a=d.value}catch(t){return void i(t)}d.done?l(a):Promise.resolve(a).then(n,e)}function m(t,l){return function(t){if(Array.isArray(t))return t}(t)||function(t,l){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(t)))return;var i=[],n=!0,e=!1,c=void 0;try{for(var o,d=t[Symbol.iterator]();!(n=(o=d.next()).done)&&(i.push(o.value),!l||i.length!==l);n=!0);}catch(t){e=!0,c=t}finally{try{n||null==d.return||d.return()}finally{if(e)throw c}}return i}(t,l)||function(t,l){if(!t)return;if("string"==typeof t)return h(t,l);var i=Object.prototype.toString.call(t).slice(8,-1);"Object"===i&&t.constructor&&(i=t.constructor.name);if("Map"===i||"Set"===i)return Array.from(t);if("Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i))return h(t,l)}(t,l)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function h(t,l){(null==l||l>t.length)&&(l=t.length);for(var i=0,n=new Array(l);i<l;i++)n[i]=t[i];return n}Z(s,"DEFAULT_STATE",void 0),s.DEFAULT_STATE={allowedScopes:"",displayName:"",email:"",isAuthenticated:!1,isLoading:!0,username:""};var I=new s,p=Object(e.createContext)(null),G=function(t){var l=m(Object(e.useState)(I.getState()),2),i=l[0],o=l[1],d=m(Object(e.useState)(null),2),a=d[0],r=d[1],u=t.children,Z=t.config,s=function(){var t,l=(t=regeneratorRuntime.mark((function t(l,n,e,c){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,I.signIn(o,i,l,n,e,c);case 2:case"end":return t.stop()}}),t)})),function(){var l=this,i=arguments;return new Promise((function(n,e){var c=t.apply(l,i);function o(t){b(c,n,e,o,d,"next",t)}function d(t){b(c,n,e,o,d,"throw",t)}o(void 0)}))});return function(t,i,n,e){return l.apply(this,arguments)}}(),h=function(){return I.trySignInSilently(i,o)};return Object(e.useEffect)((function(){i.isAuthenticated||(I.init(Z),r(Z))}),[Z]),Object(e.useEffect)((function(){i.isAuthenticated||(!Z.skipRedirectCallback&&n.o.hasAuthSearchParamsInURL()?s({callOnlyOnRedirect:!0}).then((function(){})).catch((function(){})):h().then((function(t){})).catch((function(){})))}),[]),c.a.createElement(p.Provider,{value:{disableHttpHandler:function(){return I.disableHttpHandler()},enableHttpHandler:function(){return I.enableHttpHandler()},getAccessToken:function(){return I.getAccessToken()},getBasicUserInfo:function(){return I.getBasicUserInfo()},getDecodedIDToken:function(){return I.getDecodedIDToken()},getHttpClient:function(){return I.getHttpClient()},getIDToken:function(){return I.getIDToken()},getOIDCServiceEndpoints:function(){return I.getOIDCServiceEndpoints()},httpRequest:function(t){return I.httpRequest(t)},httpRequestAll:function(t){return I.httpRequestAll(t)},isAuthenticated:function(){return I.isAuthenticated()},on:function(t,l,i){return t===n.f.CustomGrant?I.on(t,l,i):I.on(t,l)},refreshAccessToken:function(){return I.refreshAccessToken()},requestCustomGrant:function(t,l){return I.requestCustomGrant(t,l,o)},revokeAccessToken:function(){return I.revokeAccessToken(o)},signIn:s,signOut:function(t){I.signOut(o,i,t)},state:i,trySignInSilently:h,updateConfig:function(t){return I.updateConfig(t)}}},a&&u)},y=function(){return Object(e.useContext)(p)}},function(t,l,i){var n=i(5),e=i(8),c=n.document,o=e(c)&&e(c.createElement);t.exports=function(t){return o?c.createElement(t):{}}},function(t,l,i){var n=i(5),e=i(16);t.exports=function(t,l){try{e(n,t,l)}catch(i){n[t]=l}return l}},function(t,l,i){var n=i(81),e=Function.toString;"function"!=typeof n.inspectSource&&(n.inspectSource=function(t){return e.call(t)}),t.exports=n.inspectSource},function(t,l,i){var n=i(13),e=i(49),c=i(109),o=i(1);t.exports=n("Reflect","ownKeys")||function(t){var l=e.f(o(t)),i=c.f;return i?l.concat(i(t)):l}},function(t,l){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(t,l){l.f=Object.getOwnPropertySymbols},function(t,l,i){var n=i(2);t.exports=!!Object.getOwnPropertySymbols&&!n((function(){return!String(Symbol())}))},function(t,l,i){var n=i(9),e=i(11),c=i(1),o=i(57);t.exports=n?Object.defineProperties:function(t,l){c(t);for(var i,n=o(l),d=n.length,a=0;d>a;)e.f(t,i=n[a++],l[i]);return t}},function(t,l,i){"use strict";var n=i(14),e=i(45),c=i(10);t.exports=function(t){for(var l=n(this),i=c(l.length),o=arguments.length,d=e(o>1?arguments[1]:void 0,i),a=o>2?arguments[2]:void 0,r=void 0===a?i:e(a,i);r>d;)l[d++]=t;return l}},function(t,l,i){var n=i(1),e=i(84);t.exports=function(t,l,i,c){try{return c?l(n(i)[0],i[1]):l(i)}catch(l){throw e(t),l}}},function(t,l,i){var n=i(7),e=i(72),c=n("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(e.Array===t||o[c]===t)}},function(t,l,i){var n={};n[i(7)("toStringTag")]="z",t.exports="[object z]"===String(n)},function(t,l,i){"use strict";var n=i(0),e=i(58),c=i(25),o=i(48),d=i(36),a=i(16),r=i(24),u=i(7),Z=i(4),s=i(72),b=i(117),m=b.IteratorPrototype,h=b.BUGGY_SAFARI_ITERATORS,I=u("iterator"),p=function(){return this};t.exports=function(t,l,i,u,b,G,y){e(i,l,u);var X,g,V,W=function(t){if(t===b&&f)return f;if(!h&&t in S)return S[t];switch(t){case"keys":case"values":case"entries":return function(){return new i(this,t)}}return function(){return new i(this)}},C=l+" Iterator",R=!1,S=t.prototype,K=S[I]||S["@@iterator"]||b&&S[b],f=!h&&K||W(b),Y="Array"==l&&S.entries||K;if(Y&&(X=c(Y.call(new t)),m!==Object.prototype&&X.next&&(Z||c(X)===m||(o?o(X,m):"function"!=typeof X[I]&&a(X,I,p)),d(X,C,!0,!0),Z&&(s[C]=p))),"values"==b&&K&&"values"!==K.name&&(R=!0,f=function(){return K.call(this)}),Z&&!y||S[I]===f||a(S,I,f),s[l]=f,b)if(g={values:W("values"),keys:G?f:W("keys"),entries:W("entries")},y)for(V in g)(h||R||!(V in S))&&r(S,V,g[V]);else n({target:l,proto:!0,forced:h||R},g);return g}},function(t,l,i){"use strict";var n,e,c,o=i(2),d=i(25),a=i(16),r=i(15),u=i(7),Z=i(4),s=u("iterator"),b=!1;[].keys&&("next"in(c=[].keys())?(e=d(d(c)))!==Object.prototype&&(n=e):b=!0);var m=null==n||o((function(){var t={};return n[s].call(t)!==t}));m&&(n={}),Z&&!m||r(n,s)||a(n,s,(function(){return this})),t.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:b}},function(t,l,i){var n=i(2);t.exports=!n((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},function(t,l){t.exports="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView},function(t,l,i){var n=i(10),e=i(121),c=i(21),o=Math.ceil,d=function(t){return function(l,i,d){var a,r,u=String(c(l)),Z=u.length,s=void 0===d?" ":String(d),b=n(i);return b<=Z||""==s?u:(a=b-Z,(r=e.call(s,o(a/s.length))).length>a&&(r=r.slice(0,a)),t?u+r:r+u)}};t.exports={start:d(!1),end:d(!0)}},function(t,l,i){"use strict";var n=i(29),e=i(21);t.exports="".repeat||function(t){var l=String(e(this)),i="",c=n(t);if(c<0||c==1/0)throw RangeError("Wrong number of repetitions");for(;c>0;(c>>>=1)&&(l+=l))1&c&&(i+=l);return i}},function(t,l,i){"use strict";var n=i(89),e=i(152);t.exports=n("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),e)},function(t,l){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,l,i){var n=i(5),e=i(60).trim,c=i(92),o=n.parseInt,d=/^[+-]?0[Xx]/,a=8!==o(c+"08")||22!==o(c+"0x16");t.exports=a?function(t,l){var i=e(String(t));return o(i,l>>>0||(d.test(i)?16:10))}:o},function(t,l,i){var n,e,c,o=i(5),d=i(2),a=i(18),r=i(140),u=i(104),Z=i(163),s=i(59),b=o.location,m=o.setImmediate,h=o.clearImmediate,I=o.process,p=o.MessageChannel,G=o.Dispatch,y=0,X={},g=function(t){if(X.hasOwnProperty(t)){var l=X[t];delete X[t],l()}},V=function(t){return function(){g(t)}},W=function(t){g(t.data)},C=function(t){o.postMessage(t+"",b.protocol+"//"+b.host)};m&&h||(m=function(t){for(var l=[],i=1;arguments.length>i;)l.push(arguments[i++]);return X[++y]=function(){("function"==typeof t?t:Function(t)).apply(void 0,l)},n(y),y},h=function(t){delete X[t]},s?n=function(t){I.nextTick(V(t))}:G&&G.now?n=function(t){G.now(V(t))}:p&&!Z?(c=(e=new p).port2,e.port1.onmessage=W,n=a(c.postMessage,c,1)):o.addEventListener&&"function"==typeof postMessage&&!o.importScripts&&b&&"file:"!==b.protocol&&!d(C)?(n=C,o.addEventListener("message",W,!1)):n="onreadystatechange"in u("script")?function(t){r.appendChild(u("script")).onreadystatechange=function(){r.removeChild(this),g(t)}}:function(t){setTimeout(V(t),0)}),t.exports={set:m,clear:h}},function(t,l,i){"use strict";var n=i(0),e=i(96);n({target:"RegExp",proto:!0,forced:/./.exec!==e},{exec:e})},function(t,l,i){var n=i(76);t.exports=function(t){if(n(t))throw TypeError("The method doesn't accept regular expressions");return t}},function(t,l,i){var n=i(7)("match");t.exports=function(t){var l=/./;try{"/./"[t](l)}catch(i){try{return l[n]=!1,"/./"[t](l)}catch(t){}}return!1}},function(t,l,i){var n=i(2),e=i(92);t.exports=function(t){return n((function(){return!!e[t]()||"
"!="
"[t]()||e[t].name!==t}))}},function(t,l,i){var n=i(5),e=i(2),c=i(85),o=i(12).NATIVE_ARRAY_BUFFER_VIEWS,d=n.ArrayBuffer,a=n.Int8Array;t.exports=!o||!e((function(){a(1)}))||!e((function(){new a(-1)}))||!c((function(t){new a,new a(null),new a(1.5),new a(t)}),!0)||e((function(){return 1!==new a(new d(2),1,void 0).length}))},function(t,l,i){"use strict";var n,e=i(5),c=i(42),o=i(52),d=i(89),a=i(175),r=i(8),u=i(17).enforce,Z=i(136),s=!e.ActiveXObject&&"ActiveXObject"in e,b=Object.isExtensible,m=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},h=t.exports=d("WeakMap",m,a);if(Z&&s){n=a.getConstructor(m,"WeakMap",!0),o.REQUIRED=!0;var I=h.prototype,p=I.delete,G=I.has,y=I.get,X=I.set;c(I,{delete:function(t){if(r(t)&&!b(t)){var l=u(this);return l.frozen||(l.frozen=new n),p.call(this,t)||l.frozen.delete(t)}return p.call(this,t)},has:function(t){if(r(t)&&!b(t)){var l=u(this);return l.frozen||(l.frozen=new n),G.call(this,t)||l.frozen.has(t)}return G.call(this,t)},get:function(t){if(r(t)&&!b(t)){var l=u(this);return l.frozen||(l.frozen=new n),G.call(this,t)?y.call(this,t):l.frozen.get(t)}return y.call(this,t)},set:function(t,l){if(r(t)&&!b(t)){var i=u(this);i.frozen||(i.frozen=new n),G.call(this,t)?X.call(this,t,l):i.frozen.set(t,l)}else X.call(this,t,l);return this}})}},function(t,l,i){"use strict";var n=i(1);t.exports=function(t,l){var i,e=n(this),c=arguments.length>2?arguments[2]:void 0;if("function"!=typeof l&&"function"!=typeof c)throw TypeError("At least one callback required");return e.has(t)?(i=e.get(t),"function"==typeof l&&(i=l(i),e.set(t,i))):"function"==typeof c&&(i=c(),e.set(t,i)),i}},function(t,l,i){"use strict";var n=i(17),e=i(58),c=i(15),o=i(57),d=i(14),a=n.set,r=n.getterFor("Object Iterator");t.exports=e((function(t,l){var i=d(t);a(this,{type:"Object Iterator",mode:l,object:i,keys:o(i),index:0})}),"Object",(function(){for(var t=r(this),l=t.keys;;){if(null===l||t.index>=l.length)return t.object=t.keys=null,{value:void 0,done:!0};var i=l[t.index++],n=t.object;if(c(n,i)){switch(t.mode){case"keys":return{value:i,done:!1};case"values":return{value:n[i],done:!1}}return{value:[i,n[i]],done:!1}}}}))},function(t,l){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,l,i){var n=i(9),e=i(2),c=i(104);t.exports=!n&&!e((function(){return 7!=Object.defineProperty(c("div"),"a",{get:function(){return 7}}).a}))},function(t,l,i){var n=i(5),e=i(106),c=n.WeakMap;t.exports="function"==typeof c&&/native code/.test(e(c))},function(t,l,i){var n=i(15),e=i(107),c=i(23),o=i(11);t.exports=function(t,l){for(var i=e(l),d=o.f,a=c.f,r=0;r<i.length;r++){var u=i[r];n(t,u)||d(t,u,a(l,u))}}},function(t,l,i){var n=i(15),e=i(28),c=i(66).indexOf,o=i(65);t.exports=function(t,l){var i,d=e(t),a=0,r=[];for(i in d)!n(o,i)&&n(d,i)&&r.push(i);for(;l.length>a;)n(d,i=l[a++])&&(~c(r,i)||r.push(i));return r}},function(t,l,i){var n=i(110);t.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(t,l,i){var n=i(13);t.exports=n("document","documentElement")},function(t,l,i){var n=i(28),e=i(49).f,c={}.toString,o="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return o&&"[object Window]"==c.call(t)?function(t){try{return e(t)}catch(t){return o.slice()}}(t):e(n(t))}},function(t,l,i){var n=i(7);l.f=n},function(t,l,i){"use strict";var n=i(14),e=i(45),c=i(10),o=Math.min;t.exports=[].copyWithin||function(t,l){var i=n(this),d=c(i.length),a=e(t,d),r=e(l,d),u=arguments.length>2?arguments[2]:void 0,Z=o((void 0===u?d:e(u,d))-r,d-a),s=1;for(r<a&&a<r+Z&&(s=-1,r+=Z-1,a+=Z-1);Z-- >0;)r in i?i[a]=i[r]:delete i[a],a+=s,r+=s;return i}},function(t,l,i){"use strict";var n=i(46),e=i(10),c=i(18),o=function(t,l,i,d,a,r,u,Z){for(var s,b=a,m=0,h=!!u&&c(u,Z,3);m<d;){if(m in i){if(s=h?h(i[m],m,l):i[m],r>0&&n(s))b=o(t,l,s,e(s.length),b,r-1)-1;else{if(b>=9007199254740991)throw TypeError("Exceed the acceptable array length");t[b]=s}b++}m++}return b};t.exports=o},function(t,l,i){"use strict";var n=i(22).forEach,e=i(41),c=i(27),o=e("forEach"),d=c("forEach");t.exports=o&&d?[].forEach:function(t){return n(this,t,arguments.length>1?arguments[1]:void 0)}},function(t,l,i){"use strict";var n=i(18),e=i(14),c=i(113),o=i(114),d=i(10),a=i(50),r=i(47);t.exports=function(t){var l,i,u,Z,s,b,m=e(t),h="function"==typeof this?this:Array,I=arguments.length,p=I>1?arguments[1]:void 0,G=void 0!==p,y=r(m),X=0;if(G&&(p=n(p,I>2?arguments[2]:void 0,2)),null==y||h==Array&&o(y))for(i=new h(l=d(m.length));l>X;X++)b=G?p(m[X],X):m[X],a(i,X,b);else for(s=(Z=y.call(m)).next,i=new h;!(u=s.call(Z)).done;X++)b=G?c(Z,p,[u.value,X],!0):u.value,a(i,X,b);return i.length=X,i}},function(t,l,i){var n=i(8);t.exports=function(t){if(!n(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},function(t,l,i){"use strict";var n=i(28),e=i(29),c=i(10),o=i(41),d=i(27),a=Math.min,r=[].lastIndexOf,u=!!r&&1/[1].lastIndexOf(1,-0)<0,Z=o("lastIndexOf"),s=d("indexOf",{ACCESSORS:!0,1:0}),b=u||!Z||!s;t.exports=b?function(t){if(u)return r.apply(this,arguments)||0;var l=n(this),i=c(l.length),o=i-1;for(arguments.length>1&&(o=a(o,e(arguments[1]))),o<0&&(o=i+o);o>=0;o--)if(o in l&&l[o]===t)return o||0;return-1}:r},function(t,l,i){var n=i(29),e=i(10);t.exports=function(t){if(void 0===t)return 0;var l=n(t),i=e(l);if(l!==i)throw RangeError("Wrong length or index");return i}},function(t,l,i){"use strict";var n=i(3),e=i(8),c=[].slice,o={},d=function(t,l,i){if(!(l in o)){for(var n=[],e=0;e<l;e++)n[e]="a["+e+"]";o[l]=Function("C,a","return new C("+n.join(",")+")")}return o[l](t,i)};t.exports=Function.bind||function(t){var l=n(this),i=c.call(arguments,1),o=function(){var n=i.concat(c.call(arguments));return this instanceof o?d(l,n.length,n):l.apply(t,n)};return e(l.prototype)&&(o.prototype=l.prototype),o}},function(t,l,i){i(0)({global:!0},{globalThis:i(5)})},function(t,l,i){"use strict";var n=i(11).f,e=i(26),c=i(42),o=i(18),d=i(34),a=i(6),r=i(116),u=i(51),Z=i(9),s=i(52).fastKey,b=i(17),m=b.set,h=b.getterFor;t.exports={getConstructor:function(t,l,i,r){var u=t((function(t,n){d(t,u,l),m(t,{type:l,index:e(null),first:void 0,last:void 0,size:0}),Z||(t.size=0),null!=n&&a(n,t[r],{that:t,AS_ENTRIES:i})})),b=h(l),I=function(t,l,i){var n,e,c=b(t),o=p(t,l);return o?o.value=i:(c.last=o={index:e=s(l,!0),key:l,value:i,previous:n=c.last,next:void 0,removed:!1},c.first||(c.first=o),n&&(n.next=o),Z?c.size++:t.size++,"F"!==e&&(c.index[e]=o)),t},p=function(t,l){var i,n=b(t),e=s(l);if("F"!==e)return n.index[e];for(i=n.first;i;i=i.next)if(i.key==l)return i};return c(u.prototype,{clear:function(){for(var t=b(this),l=t.index,i=t.first;i;)i.removed=!0,i.previous&&(i.previous=i.previous.next=void 0),delete l[i.index],i=i.next;t.first=t.last=void 0,Z?t.size=0:this.size=0},delete:function(t){var l=b(this),i=p(this,t);if(i){var n=i.next,e=i.previous;delete l.index[i.index],i.removed=!0,e&&(e.next=n),n&&(n.previous=e),l.first==i&&(l.first=n),l.last==i&&(l.last=e),Z?l.size--:this.size--}return!!i},forEach:function(t){for(var l,i=b(this),n=o(t,arguments.length>1?arguments[1]:void 0,3);l=l?l.next:i.first;)for(n(l.value,l.key,this);l&&l.removed;)l=l.previous},has:function(t){return!!p(this,t)}}),c(u.prototype,i?{get:function(t){var l=p(this,t);return l&&l.value},set:function(t,l){return I(this,0===t?0:t,l)}}:{add:function(t){return I(this,t=0===t?0:t,t)}}),Z&&n(u.prototype,"size",{get:function(){return b(this).size}}),u},setStrong:function(t,l,i){var n=l+" Iterator",e=h(l),c=h(n);r(t,l,(function(t,l){m(this,{type:n,target:t,state:e(t),kind:l,last:void 0})}),(function(){for(var t=c(this),l=t.kind,i=t.last;i&&i.removed;)i=i.previous;return t.target&&(t.last=i=i?i.next:t.state.first)?"keys"==l?{value:i.key,done:!1}:"values"==l?{value:i.value,done:!1}:{value:[i.key,i.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),i?"entries":"values",!i,!0),u(l)}}},function(t,l){var i=Math.log;t.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:i(1+t)}},function(t,l,i){var n=i(123),e=Math.abs,c=Math.pow,o=c(2,-52),d=c(2,-23),a=c(2,127)*(2-d),r=c(2,-126);t.exports=Math.fround||function(t){var l,i,c=e(t),u=n(t);return c<r?u*(c/r/d+1/o-1/o)*r*d:(i=(l=(1+d/o)*c)-(l-c))>a||i!=i?u*(1/0):u*i}},function(t,l,i){var n=i(5).isFinite;t.exports=Number.isFinite||function(t){return"number"==typeof t&&n(t)}},function(t,l,i){var n=i(8),e=Math.floor;t.exports=function(t){return!n(t)&&isFinite(t)&&e(t)===t}},function(t,l,i){var n=i(5),e=i(60).trim,c=i(92),o=n.parseFloat,d=1/o(c+"-0")!=-1/0;t.exports=d?function(t){var l=e(String(t)),i=o(l);return 0===i&&"-"==l.charAt(0)?-0:i}:o},function(t,l,i){var n=i(40);t.exports=function(t){if("number"!=typeof t&&"Number"!=n(t))throw TypeError("Incorrect invocation");return+t}},function(t,l,i){"use strict";var n=i(9),e=i(2),c=i(57),o=i(109),d=i(80),a=i(14),r=i(63),u=Object.assign,Z=Object.defineProperty;t.exports=!u||e((function(){if(n&&1!==u({b:1},u(Z({},"a",{enumerable:!0,get:function(){Z(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},l={},i=Symbol();return t[i]=7,"abcdefghijklmnopqrst".split("").forEach((function(t){l[t]=t})),7!=u({},t)[i]||"abcdefghijklmnopqrst"!=c(u({},l)).join("")}))?function(t,l){for(var i=a(t),e=arguments.length,u=1,Z=o.f,s=d.f;e>u;)for(var b,m=r(arguments[u++]),h=Z?c(m).concat(Z(m)):c(m),I=h.length,p=0;I>p;)b=h[p++],n&&!s.call(m,b)||(i[b]=m[b]);return i}:u},function(t,l,i){var n=i(9),e=i(57),c=i(28),o=i(80).f,d=function(t){return function(l){for(var i,d=c(l),a=e(d),r=a.length,u=0,Z=[];r>u;)i=a[u++],n&&!o.call(d,i)||Z.push(t?[i,d[i]]:d[i]);return Z}};t.exports={entries:d(!0),values:d(!1)}},function(t,l){t.exports=Object.is||function(t,l){return t===l?0!==t||1/t==1/l:t!=t&&l!=l}},function(t,l,i){var n=i(5);t.exports=n.Promise},function(t,l,i){var n=i(71);t.exports=/(iphone|ipod|ipad).*applewebkit/i.test(n)},function(t,l,i){var n,e,c,o,d,a,r,u,Z=i(5),s=i(23).f,b=i(125).set,m=i(163),h=i(307),I=i(59),p=Z.MutationObserver||Z.WebKitMutationObserver,G=Z.document,y=Z.process,X=Z.Promise,g=s(Z,"queueMicrotask"),V=g&&g.value;V||(n=function(){var t,l;for(I&&(t=y.domain)&&t.exit();e;){l=e.fn,e=e.next;try{l()}catch(t){throw e?o():c=void 0,t}}c=void 0,t&&t.enter()},m||I||h||!p||!G?X&&X.resolve?(r=X.resolve(void 0),u=r.then,o=function(){u.call(r,n)}):o=I?function(){y.nextTick(n)}:function(){b.call(Z,n)}:(d=!0,a=G.createTextNode(""),new p(n).observe(a,{characterData:!0}),o=function(){a.data=d=!d})),t.exports=V||function(t){var l={fn:t,next:void 0};c&&(c.next=l),e||(e=l,o()),c=l}},function(t,l,i){var n=i(1),e=i(8),c=i(75);t.exports=function(t,l){if(n(t),e(l)&&l.constructor===t)return l;var i=c.f(t);return(0,i.resolve)(l),i.promise}},function(t,l,i){var n=i(5);t.exports=function(t,l){var i=n.console;i&&i.error&&(1===arguments.length?i.error(t):i.error(t,l))}},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(75),o=i(94),d=i(6);n({target:"Promise",stat:!0},{allSettled:function(t){var l=this,i=c.f(l),n=i.resolve,a=i.reject,r=o((function(){var i=e(l.resolve),c=[],o=0,a=1;d(t,(function(t){var e=o++,d=!1;c.push(void 0),a++,i.call(l,t).then((function(t){d||(d=!0,c[e]={status:"fulfilled",value:t},--a||n(c))}),(function(t){d||(d=!0,c[e]={status:"rejected",reason:t},--a||n(c))}))})),--a||n(c)}));return r.error&&a(r.value),i.promise}})},function(t,l,i){"use strict";var n=i(89),e=i(152);t.exports=n("Set",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),e)},function(t,l,i){"use strict";var n=i(62).charAt,e=i(17),c=i(116),o=e.set,d=e.getterFor("String Iterator");c(String,"String",(function(t){o(this,{type:"String Iterator",string:String(t),index:0})}),(function(){var t,l=d(this),i=l.string,e=l.index;return e>=i.length?{value:void 0,done:!0}:(t=n(i,e),l.index+=t.length,{value:t,done:!1})}))},function(t,l,i){"use strict";var n=i(0),e=i(58),c=i(21),o=i(10),d=i(3),a=i(1),r=i(40),u=i(76),Z=i(61),s=i(16),b=i(2),m=i(7),h=i(20),I=i(98),p=i(17),G=i(4),y=m("matchAll"),X=p.set,g=p.getterFor("RegExp String Iterator"),V=RegExp.prototype,W=V.exec,C="".matchAll,R=!!C&&!b((function(){"a".matchAll(/./)})),S=e((function(t,l,i,n){X(this,{type:"RegExp String Iterator",regexp:t,string:l,global:i,unicode:n,done:!1})}),"RegExp String",(function(){var t=g(this);if(t.done)return{value:void 0,done:!0};var l=t.regexp,i=t.string,n=function(t,l){var i,n=t.exec;if("function"==typeof n){if("object"!=typeof(i=n.call(t,l)))throw TypeError("Incorrect exec result");return i}return W.call(t,l)}(l,i);return null===n?{value:void 0,done:t.done=!0}:t.global?(""==String(n[0])&&(l.lastIndex=I(i,o(l.lastIndex),t.unicode)),{value:n,done:!1}):(t.done=!0,{value:n,done:!1})})),K=function(t){var l,i,n,e,c,d,r=a(this),u=String(t);return l=h(r,RegExp),void 0===(i=r.flags)&&r instanceof RegExp&&!("flags"in V)&&(i=Z.call(r)),n=void 0===i?"":String(i),e=new l(l===RegExp?r.source:r,n),c=!!~n.indexOf("g"),d=!!~n.indexOf("u"),e.lastIndex=o(r.lastIndex),new S(e,u,c,d)};n({target:"String",proto:!0,forced:R},{matchAll:function(t){var l,i,n,e=c(this);if(null!=t){if(u(t)&&!~String(c("flags"in V?t.flags:Z.call(t))).indexOf("g"))throw TypeError("`.matchAll` does not allow non-global regexes");if(R)return C.apply(e,arguments);if(void 0===(i=t[y])&&G&&"RegExp"==r(t)&&(i=K),null!=i)return d(i).call(t,e)}else if(R)return C.apply(e,arguments);return l=String(e),n=new RegExp(t,"g"),G?K.call(n,l):n[y](l)}}),G||y in V||s(V,y,K)},function(t,l,i){var n=i(71);t.exports=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(n)},function(t,l,i){var n=i(14),e=Math.floor,c="".replace,o=/\$([$&'`]|\d\d?|<[^>]*>)/g,d=/\$([$&'`]|\d\d?)/g;t.exports=function(t,l,i,a,r,u){var Z=i+t.length,s=a.length,b=d;return void 0!==r&&(r=n(r),b=o),c.call(u,b,(function(n,c){var o;switch(c.charAt(0)){case"$":return"$";case"&":return t;case"`":return l.slice(0,i);case"'":return l.slice(Z);case"<":o=r[c.slice(1,-1)];break;default:var d=+c;if(0===d)return n;if(d>s){var u=e(d/10);return 0===u?n:u<=s?void 0===a[u-1]?c.charAt(1):a[u-1]+c.charAt(1):n}o=a[d-1]}return void 0===o?"":o}))}},function(t,l,i){var n=i(77);t.exports=function(t,l){var i=n(t);if(i%l)throw RangeError("Wrong offset");return i}},function(t,l,i){var n=i(14),e=i(10),c=i(47),o=i(114),d=i(18),a=i(12).aTypedArrayConstructor;t.exports=function(t){var l,i,r,u,Z,s,b=n(t),m=arguments.length,h=m>1?arguments[1]:void 0,I=void 0!==h,p=c(b);if(null!=p&&!o(p))for(s=(Z=p.call(b)).next,b=[];!(u=s.call(Z)).done;)b.push(u.value);for(I&&m>2&&(h=d(h,arguments[2],2)),i=e(b.length),r=new(a(this))(i),l=0;i>l;l++)r[l]=I?h(b[l],l):b[l];return r}},function(t,l,i){"use strict";var n=i(42),e=i(52).getWeakData,c=i(1),o=i(8),d=i(34),a=i(6),r=i(22),u=i(15),Z=i(17),s=Z.set,b=Z.getterFor,m=r.find,h=r.findIndex,I=0,p=function(t){return t.frozen||(t.frozen=new G)},G=function(){this.entries=[]},y=function(t,l){return m(t.entries,(function(t){return t[0]===l}))};G.prototype={get:function(t){var l=y(this,t);if(l)return l[1]},has:function(t){return!!y(this,t)},set:function(t,l){var i=y(this,t);i?i[1]=l:this.entries.push([t,l])},delete:function(t){var l=h(this.entries,(function(l){return l[0]===t}));return~l&&this.entries.splice(l,1),!!~l}},t.exports={getConstructor:function(t,l,i,r){var Z=t((function(t,n){d(t,Z,l),s(t,{type:l,id:I++,frozen:void 0}),null!=n&&a(n,t[r],{that:t,AS_ENTRIES:i})})),m=b(l),h=function(t,l,i){var n=m(t),o=e(c(l),!0);return!0===o?p(n).set(l,i):o[n.id]=i,t};return n(Z.prototype,{delete:function(t){var l=m(this);if(!o(t))return!1;var i=e(t);return!0===i?p(l).delete(t):i&&u(i,l.id)&&delete i[l.id]},has:function(t){var l=m(this);if(!o(t))return!1;var i=e(t);return!0===i?p(l).has(t):i&&u(i,l.id)}}),n(Z.prototype,i?{get:function(t){var l=m(this);if(o(t)){var i=e(t);return!0===i?p(l).get(t):i?i[l.id]:void 0}},set:function(t,l){return h(this,t,l)}}:{add:function(t){return h(this,t,!0)}}),Z}}},function(t,l,i){var n=i(47),e=i(7)("asyncIterator");t.exports=function(t){var l=t[e];return void 0===l?n(t):l}},function(t,l,i){var n=i(122),e=i(131),c=i(26),o=i(8),d=function(){this.object=null,this.symbol=null,this.primitives=null,this.objectsByIndex=c(null)};d.prototype.get=function(t,l){return this[t]||(this[t]=l())},d.prototype.next=function(t,l,i){var c=i?this.objectsByIndex[t]||(this.objectsByIndex[t]=new e):this.primitives||(this.primitives=new n),o=c.get(l);return o||c.set(l,o=new d),o};var a=new d;t.exports=function(){var t,l,i=a,n=arguments.length;for(t=0;t<n;t++)o(l=arguments[t])&&(i=i.next(t,l,!0));if(this===Object&&i===a)throw TypeError("Composite keys must contain a non-primitive component");for(t=0;t<n;t++)o(l=arguments[t])||(i=i.next(t,l,!1));return i}},function(t,l){t.exports=Math.scale||function(t,l,i,n,e){return 0===arguments.length||t!=t||l!=l||i!=i||n!=n||e!=e?NaN:t===1/0||t===-1/0?t:(t-l)*(e-n)/(i-l)+n}},function(t,l,i){"use strict";var n=i(1),e=i(3);t.exports=function(){for(var t=n(this),l=e(t.add),i=0,c=arguments.length;i<c;i++)l.call(t,arguments[i]);return t}},function(t,l){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},function(t,l,i){var n=i(2),e=i(7),c=i(4),o=e("iterator");t.exports=!n((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),l=t.searchParams,i="";return t.pathname="c%20d",l.forEach((function(t,n){l.delete("b"),i+=n+t})),c&&!t.toJSON||!l.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==l.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!l[o]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==i||"x"!==new URL("http://x",void 0).host}))},function(t,l,i){"use strict";i(86);var n=i(0),e=i(13),c=i(181),o=i(24),d=i(42),a=i(36),r=i(58),u=i(17),Z=i(34),s=i(15),b=i(18),m=i(73),h=i(1),I=i(8),p=i(26),G=i(39),y=i(79),X=i(47),g=i(7),V=e("fetch"),W=e("Headers"),C=g("iterator"),R=u.set,S=u.getterFor("URLSearchParams"),K=u.getterFor("URLSearchParamsIterator"),f=/\+/g,Y=Array(4),v=function(t){return Y[t-1]||(Y[t-1]=RegExp("((?:%[\\da-f]{2}){"+t+"})","gi"))},N=function(t){try{return decodeURIComponent(t)}catch(l){return t}},J=function(t){var l=t.replace(f," "),i=4;try{return decodeURIComponent(l)}catch(t){for(;i;)l=l.replace(v(i--),N);return l}},H=/[!'()~]|%20/g,L={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},U=function(t){return L[t]},x=function(t){return encodeURIComponent(t).replace(H,U)},T=function(t,l){if(l)for(var i,n,e=l.split("&"),c=0;c<e.length;)(i=e[c++]).length&&(n=i.split("="),t.push({key:J(n.shift()),value:J(n.join("="))}))},k=function(t){this.entries.length=0,T(this.entries,t)},B=function(t,l){if(t<l)throw TypeError("Not enough arguments")},F=r((function(t,l){R(this,{type:"URLSearchParamsIterator",iterator:y(S(t).entries),kind:l})}),"Iterator",(function(){var t=K(this),l=t.kind,i=t.iterator.next(),n=i.value;return i.done||(i.value="keys"===l?n.key:"values"===l?n.value:[n.key,n.value]),i})),z=function(){Z(this,z,"URLSearchParams");var t,l,i,n,e,c,o,d,a,r=arguments.length>0?arguments[0]:void 0,u=this,b=[];if(R(u,{type:"URLSearchParams",entries:b,updateURL:function(){},updateSearchParams:k}),void 0!==r)if(I(r))if("function"==typeof(t=X(r)))for(i=(l=t.call(r)).next;!(n=i.call(l)).done;){if((o=(c=(e=y(h(n.value))).next).call(e)).done||(d=c.call(e)).done||!c.call(e).done)throw TypeError("Expected sequence with length 2");b.push({key:o.value+"",value:d.value+""})}else for(a in r)s(r,a)&&b.push({key:a,value:r[a]+""});else T(b,"string"==typeof r?"?"===r.charAt(0)?r.slice(1):r:r+"")},A=z.prototype;d(A,{append:function(t,l){B(arguments.length,2);var i=S(this);i.entries.push({key:t+"",value:l+""}),i.updateURL()},delete:function(t){B(arguments.length,1);for(var l=S(this),i=l.entries,n=t+"",e=0;e<i.length;)i[e].key===n?i.splice(e,1):e++;l.updateURL()},get:function(t){B(arguments.length,1);for(var l=S(this).entries,i=t+"",n=0;n<l.length;n++)if(l[n].key===i)return l[n].value;return null},getAll:function(t){B(arguments.length,1);for(var l=S(this).entries,i=t+"",n=[],e=0;e<l.length;e++)l[e].key===i&&n.push(l[e].value);return n},has:function(t){B(arguments.length,1);for(var l=S(this).entries,i=t+"",n=0;n<l.length;)if(l[n++].key===i)return!0;return!1},set:function(t,l){B(arguments.length,1);for(var i,n=S(this),e=n.entries,c=!1,o=t+"",d=l+"",a=0;a<e.length;a++)(i=e[a]).key===o&&(c?e.splice(a--,1):(c=!0,i.value=d));c||e.push({key:o,value:d}),n.updateURL()},sort:function(){var t,l,i,n=S(this),e=n.entries,c=e.slice();for(e.length=0,i=0;i<c.length;i++){for(t=c[i],l=0;l<i;l++)if(e[l].key>t.key){e.splice(l,0,t);break}l===i&&e.push(t)}n.updateURL()},forEach:function(t){for(var l,i=S(this).entries,n=b(t,arguments.length>1?arguments[1]:void 0,3),e=0;e<i.length;)n((l=i[e++]).value,l.key,this)},keys:function(){return new F(this,"keys")},values:function(){return new F(this,"values")},entries:function(){return new F(this,"entries")}},{enumerable:!0}),o(A,C,A.entries),o(A,"toString",(function(){for(var t,l=S(this).entries,i=[],n=0;n<l.length;)t=l[n++],i.push(x(t.key)+"="+x(t.value));return i.join("&")}),{enumerable:!0}),a(z,"URLSearchParams"),n({global:!0,forced:!c},{URLSearchParams:z}),c||"function"!=typeof V||"function"!=typeof W||n({global:!0,enumerable:!0,forced:!0},{fetch:function(t){var l,i,n,e=[t];return arguments.length>1&&(I(l=arguments[1])&&(i=l.body,"URLSearchParams"===m(i)&&((n=l.headers?new W(l.headers):new W).has("content-type")||n.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),l=p(l,{body:G(0,String(i)),headers:G(0,n)}))),e.push(l)),V.apply(this,e)}}),t.exports={URLSearchParams:z,getState:S}},function(t,l,i){"use strict";i.r(l);var n=i(103);i.d(l,"AuthClient",(function(){return n.a})),i.d(l,"AuthProvider",(function(){return n.b})),i.d(l,"useAuthContext",(function(){return n.c}));var e=i(184);for(var c in e)["default","AuthClient","AuthProvider","useAuthContext"].indexOf(c)<0&&function(t){i.d(l,t,(function(){return e[t]}))}(c);var o=i(185);i.d(l,"SecureRoute",(function(){return o.a}))},function(t,l){},function(t,l,i){"use strict";i.d(l,"a",(function(){return r}));var n=i(32),e=i.n(n),c=i(186),o=i(103);function d(){return(d=Object.assign||function(t){for(var l=1;l<arguments.length;l++){var i=arguments[l];for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t[n]=i[n])}return t}).apply(this,arguments)}function a(t,l){if(null==t)return{};var i,n,e=function(t,l){if(null==t)return{};var i,n,e={},c=Object.keys(t);for(n=0;n<c.length;n++)i=c[n],l.indexOf(i)>=0||(e[i]=t[i]);return e}(t,l);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(t);for(n=0;n<c.length;n++)i=c[n],l.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(t,i)&&(e[i]=t[i])}return e}var r=function(t){var l=Object(o.c)().state,i=t.component,r=t.callback,u=a(t,["component","callback"]);return Object(n.useEffect)((function(){l.isAuthenticated||r&&r()}),[l.isAuthenticated]),l.isAuthenticated?e.a.createElement(c.Route,d({},u,{render:function(t){return e.a.createElement(i,t)}})):null}},function(t,i){t.exports=l},function(t,l,i){"use strict";i.r(l);i(188),i(189),i(190),i(191),i(192),i(193),i(194),i(195),i(196),i(197),i(198),i(199),i(200),i(201),i(202),i(203),i(204),i(205),i(206),i(207),i(208),i(209),i(210),i(211),i(212),i(213),i(214),i(215),i(216),i(86),i(217),i(218),i(219),i(220),i(221),i(222),i(223),i(224),i(225),i(226),i(227),i(228),i(229),i(230),i(231),i(233),i(234),i(235),i(236),i(237),i(239),i(240),i(242),i(243),i(244),i(245),i(151),i(246),i(247),i(122),i(248),i(249),i(250),i(251),i(252),i(253),i(254),i(255),i(256),i(257),i(258),i(259),i(260),i(261),i(262),i(263),i(264),i(265),i(266),i(267),i(268),i(269),i(270),i(271),i(272),i(273),i(274),i(275),i(276),i(277),i(278),i(279),i(280),i(281),i(282),i(283),i(284),i(285),i(286),i(287),i(288),i(289),i(290),i(291),i(292),i(293),i(294),i(295),i(296),i(297),i(298),i(299),i(300),i(301),i(303),i(304),i(305),i(306),i(167),i(308),i(309),i(310),i(311),i(312),i(313),i(314),i(315),i(316),i(317),i(318),i(319),i(320),i(321),i(322),i(126),i(323),i(324),i(325),i(326),i(168),i(327),i(328),i(329),i(330),i(169),i(331),i(170),i(332),i(333),i(334),i(335),i(336),i(337),i(338),i(339),i(340),i(341),i(342),i(343),i(344),i(345),i(346),i(347),i(348),i(349),i(350),i(351),i(352),i(353),i(354),i(355),i(356),i(357),i(358),i(359),i(360),i(361),i(362),i(363),i(364),i(365),i(366),i(367),i(368),i(369),i(370),i(371),i(372),i(373),i(374),i(375),i(376),i(377),i(378),i(379),i(380),i(381),i(382),i(383),i(384),i(385),i(386),i(387),i(388),i(389),i(131),i(390),i(391),i(393),i(394),i(395),i(396),i(398),i(399),i(400),i(401),i(402),i(403),i(404),i(405),i(406),i(407),i(408),i(409),i(410),i(411),i(412),i(413),i(414),i(415),i(416),i(417),i(418),i(419),i(420),i(421),i(422),i(423),i(424),i(425),i(426),i(427),i(428),i(429),i(430),i(431),i(432),i(433),i(434),i(435),i(437),i(438),i(439),i(440),i(441),i(442),i(443),i(444),i(445),i(446),i(447),i(448),i(449),i(450),i(451),i(452),i(453),i(454),i(455),i(456),i(457),i(458),i(459),i(460),i(461),i(462),i(463),i(464),i(465),i(466),i(467),i(469),i(470),i(471),i(472),i(473),i(474),i(475),i(476),i(477),i(478),i(479),i(480),i(481),i(482),i(483),i(484),i(485),i(486),i(487),i(488),i(489),i(490),i(491),i(492),i(493),i(494),i(495),i(496),i(497),i(498),i(499),i(500),i(502),i(503),i(504),i(505),i(506),i(507),i(508),i(509),i(510),i(511),i(512),i(513),i(514),i(515),i(516),i(517),i(518),i(519),i(520),i(522),i(182),i(523);var n=i(35);i.d(l,"AUTHORIZATION_CODE",(function(){return n.a})),i.d(l,"AsgardeoAuthClient",(function(){return n.b})),i.d(l,"AsgardeoSPAClient",(function(){return n.c})),i.d(l,"CLIENT_ID_TAG",(function(){return n.d})),i.d(l,"CLIENT_SECRET_TAG",(function(){return n.e})),i.d(l,"Hooks",(function(){return n.f})),i.d(l,"OIDC_SCOPE",(function(){return n.g})),i.d(l,"PKCE_CODE_VERIFIER",(function(){return n.h})),i.d(l,"REFRESH_TOKEN_TIMER",(function(){return n.i})),i.d(l,"ResponseMode",(function(){return n.j})),i.d(l,"SCOPE_TAG",(function(){return n.k})),i.d(l,"SESSION_STATE",(function(){return n.l})),i.d(l,"SIGN_OUT_SUCCESS_PARAM",(function(){return n.m})),i.d(l,"SIGN_OUT_URL",(function(){return n.n})),i.d(l,"SPAUtils",(function(){return n.o})),i.d(l,"Storage",(function(){return n.p})),i.d(l,"Stores",(function(){return n.q})),i.d(l,"TOKEN_TAG",(function(){return n.r})),i.d(l,"USERNAME_TAG",(function(){return n.s})),i.d(l,"WebWorkerClass",(function(){return n.t}));var e=i(183);for(var c in e)["default","AUTHORIZATION_CODE","AsgardeoAuthClient","AsgardeoSPAClient","CLIENT_ID_TAG","CLIENT_SECRET_TAG","Hooks","OIDC_SCOPE","PKCE_CODE_VERIFIER","REFRESH_TOKEN_TIMER","ResponseMode","SCOPE_TAG","SESSION_STATE","SIGN_OUT_SUCCESS_PARAM","SIGN_OUT_URL","SPAUtils","Storage","Stores","TOKEN_TAG","USERNAME_TAG","WebWorkerClass"].indexOf(c)<0&&function(t){i.d(l,t,(function(){return e[t]}))}(c)},function(t,l,i){"use strict";var n=i(0),e=i(5),c=i(13),o=i(4),d=i(9),a=i(110),r=i(139),u=i(2),Z=i(15),s=i(46),b=i(8),m=i(1),h=i(14),I=i(28),p=i(33),G=i(39),y=i(26),X=i(57),g=i(49),V=i(141),W=i(109),C=i(23),R=i(11),S=i(80),K=i(16),f=i(24),Y=i(83),v=i(82),N=i(65),J=i(64),H=i(7),L=i(142),U=i(19),x=i(36),T=i(17),k=i(22).forEach,B=v("hidden"),F=H("toPrimitive"),z=T.set,A=T.getterFor("Symbol"),w=Object.prototype,Q=e.Symbol,P=c("JSON","stringify"),M=C.f,j=R.f,E=V.f,D=S.f,O=Y("symbols"),q=Y("op-symbols"),_=Y("string-to-symbol-registry"),$=Y("symbol-to-string-registry"),tt=Y("wks"),lt=e.QObject,it=!lt||!lt.prototype||!lt.prototype.findChild,nt=d&&u((function(){return 7!=y(j({},"a",{get:function(){return j(this,"a",{value:7}).a}})).a}))?function(t,l,i){var n=M(w,l);n&&delete w[l],j(t,l,i),n&&t!==w&&j(w,l,n)}:j,et=function(t,l){var i=O[t]=y(Q.prototype);return z(i,{type:"Symbol",tag:t,description:l}),d||(i.description=l),i},ct=r?function(t){return"symbol"==typeof t}:function(t){return Object(t)instanceof Q},ot=function(t,l,i){t===w&&ot(q,l,i),m(t);var n=p(l,!0);return m(i),Z(O,n)?(i.enumerable?(Z(t,B)&&t[B][n]&&(t[B][n]=!1),i=y(i,{enumerable:G(0,!1)})):(Z(t,B)||j(t,B,G(1,{})),t[B][n]=!0),nt(t,n,i)):j(t,n,i)},dt=function(t,l){m(t);var i=I(l),n=X(i).concat(Zt(i));return k(n,(function(l){d&&!at.call(i,l)||ot(t,l,i[l])})),t},at=function(t){var l=p(t,!0),i=D.call(this,l);return!(this===w&&Z(O,l)&&!Z(q,l))&&(!(i||!Z(this,l)||!Z(O,l)||Z(this,B)&&this[B][l])||i)},rt=function(t,l){var i=I(t),n=p(l,!0);if(i!==w||!Z(O,n)||Z(q,n)){var e=M(i,n);return!e||!Z(O,n)||Z(i,B)&&i[B][n]||(e.enumerable=!0),e}},ut=function(t){var l=E(I(t)),i=[];return k(l,(function(t){Z(O,t)||Z(N,t)||i.push(t)})),i},Zt=function(t){var l=t===w,i=E(l?q:I(t)),n=[];return k(i,(function(t){!Z(O,t)||l&&!Z(w,t)||n.push(O[t])})),n};(a||(f((Q=function(){if(this instanceof Q)throw TypeError("Symbol is not a constructor");var t=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,l=J(t),i=function(t){this===w&&i.call(q,t),Z(this,B)&&Z(this[B],l)&&(this[B][l]=!1),nt(this,l,G(1,t))};return d&&it&&nt(w,l,{configurable:!0,set:i}),et(l,t)}).prototype,"toString",(function(){return A(this).tag})),f(Q,"withoutSetter",(function(t){return et(J(t),t)})),S.f=at,R.f=ot,C.f=rt,g.f=V.f=ut,W.f=Zt,L.f=function(t){return et(H(t),t)},d&&(j(Q.prototype,"description",{configurable:!0,get:function(){return A(this).description}}),o||f(w,"propertyIsEnumerable",at,{unsafe:!0}))),n({global:!0,wrap:!0,forced:!a,sham:!a},{Symbol:Q}),k(X(tt),(function(t){U(t)})),n({target:"Symbol",stat:!0,forced:!a},{for:function(t){var l=String(t);if(Z(_,l))return _[l];var i=Q(l);return _[l]=i,$[i]=l,i},keyFor:function(t){if(!ct(t))throw TypeError(t+" is not a symbol");if(Z($,t))return $[t]},useSetter:function(){it=!0},useSimple:function(){it=!1}}),n({target:"Object",stat:!0,forced:!a,sham:!d},{create:function(t,l){return void 0===l?y(t):dt(y(t),l)},defineProperty:ot,defineProperties:dt,getOwnPropertyDescriptor:rt}),n({target:"Object",stat:!0,forced:!a},{getOwnPropertyNames:ut,getOwnPropertySymbols:Zt}),n({target:"Object",stat:!0,forced:u((function(){W.f(1)}))},{getOwnPropertySymbols:function(t){return W.f(h(t))}}),P)&&n({target:"JSON",stat:!0,forced:!a||u((function(){var t=Q();return"[null]"!=P([t])||"{}"!=P({a:t})||"{}"!=P(Object(t))}))},{stringify:function(t,l,i){for(var n,e=[t],c=1;arguments.length>c;)e.push(arguments[c++]);if(n=l,(b(l)||void 0!==t)&&!ct(t))return s(l)||(l=function(t,l){if("function"==typeof n&&(l=n.call(this,t,l)),!ct(l))return l}),e[1]=l,P.apply(null,e)}});Q.prototype[F]||K(Q.prototype,F,Q.prototype.valueOf),x(Q,"Symbol"),N[B]=!0},function(t,l,i){"use strict";var n=i(0),e=i(9),c=i(5),o=i(15),d=i(8),a=i(11).f,r=i(137),u=c.Symbol;if(e&&"function"==typeof u&&(!("description"in u.prototype)||void 0!==u().description)){var Z={},s=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),l=this instanceof s?new u(t):void 0===t?u():u(t);return""===t&&(Z[l]=!0),l};r(s,u);var b=s.prototype=u.prototype;b.constructor=s;var m=b.toString,h="Symbol(test)"==String(u("test")),I=/^Symbol\((.*)\)[^)]+$/;a(b,"description",{configurable:!0,get:function(){var t=d(this)?this.valueOf():this,l=m.call(t);if(o(Z,t))return"";var i=h?l.slice(7,-1):l.replace(I,"$1");return""===i?void 0:i}}),n({global:!0,forced:!0},{Symbol:s})}},function(t,l,i){i(19)("asyncIterator")},function(t,l,i){i(19)("hasInstance")},function(t,l,i){i(19)("isConcatSpreadable")},function(t,l,i){i(19)("iterator")},function(t,l,i){i(19)("match")},function(t,l,i){i(19)("matchAll")},function(t,l,i){i(19)("replace")},function(t,l,i){i(19)("search")},function(t,l,i){i(19)("species")},function(t,l,i){i(19)("split")},function(t,l,i){i(19)("toPrimitive")},function(t,l,i){i(19)("toStringTag")},function(t,l,i){i(19)("unscopables")},function(t,l,i){"use strict";var n=i(0),e=i(2),c=i(46),o=i(8),d=i(14),a=i(10),r=i(50),u=i(68),Z=i(69),s=i(7),b=i(70),m=s("isConcatSpreadable"),h=b>=51||!e((function(){var t=[];return t[m]=!1,t.concat()[0]!==t})),I=Z("concat"),p=function(t){if(!o(t))return!1;var l=t[m];return void 0!==l?!!l:c(t)};n({target:"Array",proto:!0,forced:!h||!I},{concat:function(t){var l,i,n,e,c,o=d(this),Z=u(o,0),s=0;for(l=-1,n=arguments.length;l<n;l++)if(p(c=-1===l?o:arguments[l])){if(s+(e=a(c.length))>9007199254740991)throw TypeError("Maximum allowed index exceeded");for(i=0;i<e;i++,s++)i in c&&r(Z,s,c[i])}else{if(s>=9007199254740991)throw TypeError("Maximum allowed index exceeded");r(Z,s++,c)}return Z.length=s,Z}})},function(t,l,i){var n=i(0),e=i(143),c=i(37);n({target:"Array",proto:!0},{copyWithin:e}),c("copyWithin")},function(t,l,i){"use strict";var n=i(0),e=i(22).every,c=i(41),o=i(27),d=c("every"),a=o("every");n({target:"Array",proto:!0,forced:!d||!a},{every:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){var n=i(0),e=i(112),c=i(37);n({target:"Array",proto:!0},{fill:e}),c("fill")},function(t,l,i){"use strict";var n=i(0),e=i(22).filter,c=i(69),o=i(27),d=c("filter"),a=o("filter");n({target:"Array",proto:!0,forced:!d||!a},{filter:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){"use strict";var n=i(0),e=i(22).find,c=i(37),o=i(27),d=!0,a=o("find");"find"in[]&&Array(1).find((function(){d=!1})),n({target:"Array",proto:!0,forced:d||!a},{find:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}}),c("find")},function(t,l,i){"use strict";var n=i(0),e=i(22).findIndex,c=i(37),o=i(27),d=!0,a=o("findIndex");"findIndex"in[]&&Array(1).findIndex((function(){d=!1})),n({target:"Array",proto:!0,forced:d||!a},{findIndex:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}}),c("findIndex")},function(t,l,i){"use strict";var n=i(0),e=i(144),c=i(14),o=i(10),d=i(29),a=i(68);n({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,l=c(this),i=o(l.length),n=a(l,0);return n.length=e(n,l,l,i,0,void 0===t?1:d(t)),n}})},function(t,l,i){"use strict";var n=i(0),e=i(144),c=i(14),o=i(10),d=i(3),a=i(68);n({target:"Array",proto:!0},{flatMap:function(t){var l,i=c(this),n=o(i.length);return d(t),(l=a(i,0)).length=e(l,i,i,n,0,1,t,arguments.length>1?arguments[1]:void 0),l}})},function(t,l,i){"use strict";var n=i(0),e=i(145);n({target:"Array",proto:!0,forced:[].forEach!=e},{forEach:e})},function(t,l,i){var n=i(0),e=i(146);n({target:"Array",stat:!0,forced:!i(85)((function(t){Array.from(t)}))},{from:e})},function(t,l,i){"use strict";var n=i(0),e=i(66).includes,c=i(37);n({target:"Array",proto:!0,forced:!i(27)("indexOf",{ACCESSORS:!0,1:0})},{includes:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}}),c("includes")},function(t,l,i){"use strict";var n=i(0),e=i(66).indexOf,c=i(41),o=i(27),d=[].indexOf,a=!!d&&1/[1].indexOf(1,-0)<0,r=c("indexOf"),u=o("indexOf",{ACCESSORS:!0,1:0});n({target:"Array",proto:!0,forced:a||!r||!u},{indexOf:function(t){return a?d.apply(this,arguments)||0:e(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){i(0)({target:"Array",stat:!0},{isArray:i(46)})},function(t,l,i){"use strict";var n=i(0),e=i(63),c=i(28),o=i(41),d=[].join,a=e!=Object,r=o("join",",");n({target:"Array",proto:!0,forced:a||!r},{join:function(t){return d.call(c(this),void 0===t?",":t)}})},function(t,l,i){var n=i(0),e=i(148);n({target:"Array",proto:!0,forced:e!==[].lastIndexOf},{lastIndexOf:e})},function(t,l,i){"use strict";var n=i(0),e=i(22).map,c=i(69),o=i(27),d=c("map"),a=o("map");n({target:"Array",proto:!0,forced:!d||!a},{map:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){"use strict";var n=i(0),e=i(2),c=i(50);n({target:"Array",stat:!0,forced:e((function(){function t(){}return!(Array.of.call(t)instanceof t)}))},{of:function(){for(var t=0,l=arguments.length,i=new("function"==typeof this?this:Array)(l);l>t;)c(i,t,arguments[t++]);return i.length=l,i}})},function(t,l,i){"use strict";var n=i(0),e=i(87).left,c=i(41),o=i(27),d=i(70),a=i(59),r=c("reduce"),u=o("reduce",{1:0});n({target:"Array",proto:!0,forced:!r||!u||!a&&d>79&&d<83},{reduce:function(t){return e(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){"use strict";var n=i(0),e=i(87).right,c=i(41),o=i(27),d=i(70),a=i(59),r=c("reduceRight"),u=o("reduce",{1:0});n({target:"Array",proto:!0,forced:!r||!u||!a&&d>79&&d<83},{reduceRight:function(t){return e(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){"use strict";var n=i(0),e=i(46),c=[].reverse,o=[1,2];n({target:"Array",proto:!0,forced:String(o)===String(o.reverse())},{reverse:function(){return e(this)&&(this.length=this.length),c.call(this)}})},function(t,l,i){"use strict";var n=i(0),e=i(8),c=i(46),o=i(45),d=i(10),a=i(28),r=i(50),u=i(7),Z=i(69),s=i(27),b=Z("slice"),m=s("slice",{ACCESSORS:!0,0:0,1:2}),h=u("species"),I=[].slice,p=Math.max;n({target:"Array",proto:!0,forced:!b||!m},{slice:function(t,l){var i,n,u,Z=a(this),s=d(Z.length),b=o(t,s),m=o(void 0===l?s:l,s);if(c(Z)&&("function"!=typeof(i=Z.constructor)||i!==Array&&!c(i.prototype)?e(i)&&null===(i=i[h])&&(i=void 0):i=void 0,i===Array||void 0===i))return I.call(Z,b,m);for(n=new(void 0===i?Array:i)(p(m-b,0)),u=0;b<m;b++,u++)b in Z&&r(n,u,Z[b]);return n.length=u,n}})},function(t,l,i){"use strict";var n=i(0),e=i(22).some,c=i(41),o=i(27),d=c("some"),a=o("some");n({target:"Array",proto:!0,forced:!d||!a},{some:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(14),o=i(2),d=i(41),a=[],r=a.sort,u=o((function(){a.sort(void 0)})),Z=o((function(){a.sort(null)})),s=d("sort");n({target:"Array",proto:!0,forced:u||!Z||!s},{sort:function(t){return void 0===t?r.call(c(this)):r.call(c(this),e(t))}})},function(t,l,i){i(51)("Array")},function(t,l,i){"use strict";var n=i(0),e=i(45),c=i(29),o=i(10),d=i(14),a=i(68),r=i(50),u=i(69),Z=i(27),s=u("splice"),b=Z("splice",{ACCESSORS:!0,0:0,1:2}),m=Math.max,h=Math.min;n({target:"Array",proto:!0,forced:!s||!b},{splice:function(t,l){var i,n,u,Z,s,b,I=d(this),p=o(I.length),G=e(t,p),y=arguments.length;if(0===y?i=n=0:1===y?(i=0,n=p-G):(i=y-2,n=h(m(c(l),0),p-G)),p+i-n>9007199254740991)throw TypeError("Maximum allowed length exceeded");for(u=a(I,n),Z=0;Z<n;Z++)(s=G+Z)in I&&r(u,Z,I[s]);if(u.length=n,i<n){for(Z=G;Z<p-n;Z++)b=Z+i,(s=Z+n)in I?I[b]=I[s]:delete I[b];for(Z=p;Z>p-n+i;Z--)delete I[Z-1]}else if(i>n)for(Z=p-n;Z>G;Z--)b=Z+i-1,(s=Z+n-1)in I?I[b]=I[s]:delete I[b];for(Z=0;Z<i;Z++)I[Z+G]=arguments[Z+2];return I.length=p-n+i,u}})},function(t,l,i){i(37)("flat")},function(t,l,i){i(37)("flatMap")},function(t,l,i){"use strict";var n=i(0),e=i(5),c=i(88),o=i(51),d=c.ArrayBuffer;n({global:!0,forced:e.ArrayBuffer!==d},{ArrayBuffer:d}),o("ArrayBuffer")},function(t,l){var i=Math.abs,n=Math.pow,e=Math.floor,c=Math.log,o=Math.LN2;t.exports={pack:function(t,l,d){var a,r,u,Z=new Array(d),s=8*d-l-1,b=(1<<s)-1,m=b>>1,h=23===l?n(2,-24)-n(2,-77):0,I=t<0||0===t&&1/t<0?1:0,p=0;for((t=i(t))!=t||t===1/0?(r=t!=t?1:0,a=b):(a=e(c(t)/o),t*(u=n(2,-a))<1&&(a--,u*=2),(t+=a+m>=1?h/u:h*n(2,1-m))*u>=2&&(a++,u/=2),a+m>=b?(r=0,a=b):a+m>=1?(r=(t*u-1)*n(2,l),a+=m):(r=t*n(2,m-1)*n(2,l),a=0));l>=8;Z[p++]=255&r,r/=256,l-=8);for(a=a<<l|r,s+=l;s>0;Z[p++]=255&a,a/=256,s-=8);return Z[--p]|=128*I,Z},unpack:function(t,l){var i,e=t.length,c=8*e-l-1,o=(1<<c)-1,d=o>>1,a=c-7,r=e-1,u=t[r--],Z=127&u;for(u>>=7;a>0;Z=256*Z+t[r],r--,a-=8);for(i=Z&(1<<-a)-1,Z>>=-a,a+=l;a>0;i=256*i+t[r],r--,a-=8);if(0===Z)Z=1-d;else{if(Z===o)return i?NaN:u?-1/0:1/0;i+=n(2,l),Z-=d}return(u?-1:1)*i*n(2,Z-l)}}},function(t,l,i){var n=i(0),e=i(12);n({target:"ArrayBuffer",stat:!0,forced:!e.NATIVE_ARRAY_BUFFER_VIEWS},{isView:e.isView})},function(t,l,i){"use strict";var n=i(0),e=i(2),c=i(88),o=i(1),d=i(45),a=i(10),r=i(20),u=c.ArrayBuffer,Z=c.DataView,s=u.prototype.slice;n({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:e((function(){return!new u(2).slice(1,void 0).byteLength}))},{slice:function(t,l){if(void 0!==s&&void 0===l)return s.call(o(this),t);for(var i=o(this).byteLength,n=d(t,i),e=d(void 0===l?i:l,i),c=new(r(this,u))(a(e-n)),b=new Z(this),m=new Z(c),h=0;n<e;)m.setUint8(h++,b.getUint8(n++));return c}})},function(t,l,i){var n=i(0),e=i(88);n({global:!0,forced:!i(119)},{DataView:e.DataView})},function(t,l,i){i(0)({target:"Date",stat:!0},{now:function(){return(new Date).getTime()}})},function(t,l,i){var n=i(0),e=i(238);n({target:"Date",proto:!0,forced:Date.prototype.toISOString!==e},{toISOString:e})},function(t,l,i){"use strict";var n=i(2),e=i(120).start,c=Math.abs,o=Date.prototype,d=o.getTime,a=o.toISOString;t.exports=n((function(){return"0385-07-25T07:06:39.999Z"!=a.call(new Date(-50000000000001))}))||!n((function(){a.call(new Date(NaN))}))?function(){if(!isFinite(d.call(this)))throw RangeError("Invalid time value");var t=this.getUTCFullYear(),l=this.getUTCMilliseconds(),i=t<0?"-":t>9999?"+":"";return i+e(c(t),i?6:4,0)+"-"+e(this.getUTCMonth()+1,2,0)+"-"+e(this.getUTCDate(),2,0)+"T"+e(this.getUTCHours(),2,0)+":"+e(this.getUTCMinutes(),2,0)+":"+e(this.getUTCSeconds(),2,0)+"."+e(l,3,0)+"Z"}:a},function(t,l,i){"use strict";var n=i(0),e=i(2),c=i(14),o=i(33);n({target:"Date",proto:!0,forced:e((function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}))},{toJSON:function(t){var l=c(this),i=o(l);return"number"!=typeof i||isFinite(i)?l.toISOString():null}})},function(t,l,i){var n=i(16),e=i(241),c=i(7)("toPrimitive"),o=Date.prototype;c in o||n(o,c,e)},function(t,l,i){"use strict";var n=i(1),e=i(33);t.exports=function(t){if("string"!==t&&"number"!==t&&"default"!==t)throw TypeError("Incorrect hint");return e(n(this),"number"!==t)}},function(t,l,i){var n=i(24),e=Date.prototype,c=e.toString,o=e.getTime;new Date(NaN)+""!="Invalid Date"&&n(e,"toString",(function(){var t=o.call(this);return t==t?c.call(this):"Invalid Date"}))},function(t,l,i){i(0)({target:"Function",proto:!0},{bind:i(150)})},function(t,l,i){"use strict";var n=i(8),e=i(11),c=i(25),o=i(7)("hasInstance"),d=Function.prototype;o in d||e.f(d,o,{value:function(t){if("function"!=typeof this||!n(t))return!1;if(!n(this.prototype))return t instanceof this;for(;t=c(t);)if(this.prototype===t)return!0;return!1}})},function(t,l,i){var n=i(9),e=i(11).f,c=Function.prototype,o=c.toString,d=/^\s*function ([^ (]*)/;n&&!("name"in c)&&e(c,"name",{configurable:!0,get:function(){try{return o.call(this).match(d)[1]}catch(t){return""}}})},function(t,l,i){var n=i(0),e=i(13),c=i(2),o=e("JSON","stringify"),d=/[\uD800-\uDFFF]/g,a=/^[\uD800-\uDBFF]$/,r=/^[\uDC00-\uDFFF]$/,u=function(t,l,i){var n=i.charAt(l-1),e=i.charAt(l+1);return a.test(t)&&!r.test(e)||r.test(t)&&!a.test(n)?"\\u"+t.charCodeAt(0).toString(16):t},Z=c((function(){return'"\\udf06\\ud834"'!==o("\udf06\ud834")||'"\\udead"'!==o("\udead")}));o&&n({target:"JSON",stat:!0,forced:Z},{stringify:function(t,l,i){var n=o.apply(null,arguments);return"string"==typeof n?n.replace(d,u):n}})},function(t,l,i){var n=i(5);i(36)(n.JSON,"JSON",!0)},function(t,l,i){var n=i(0),e=i(153),c=Math.acosh,o=Math.log,d=Math.sqrt,a=Math.LN2;n({target:"Math",stat:!0,forced:!c||710!=Math.floor(c(Number.MAX_VALUE))||c(1/0)!=1/0},{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?o(t)+a:e(t-1+d(t-1)*d(t+1))}})},function(t,l,i){var n=i(0),e=Math.asinh,c=Math.log,o=Math.sqrt;n({target:"Math",stat:!0,forced:!(e&&1/e(0)>0)},{asinh:function t(l){return isFinite(l=+l)&&0!=l?l<0?-t(-l):c(l+o(l*l+1)):l}})},function(t,l,i){var n=i(0),e=Math.atanh,c=Math.log;n({target:"Math",stat:!0,forced:!(e&&1/e(-0)<0)},{atanh:function(t){return 0==(t=+t)?t:c((1+t)/(1-t))/2}})},function(t,l,i){var n=i(0),e=i(123),c=Math.abs,o=Math.pow;n({target:"Math",stat:!0},{cbrt:function(t){return e(t=+t)*o(c(t),1/3)}})},function(t,l,i){var n=i(0),e=Math.floor,c=Math.log,o=Math.LOG2E;n({target:"Math",stat:!0},{clz32:function(t){return(t>>>=0)?31-e(c(t+.5)*o):32}})},function(t,l,i){var n=i(0),e=i(91),c=Math.cosh,o=Math.abs,d=Math.E;n({target:"Math",stat:!0,forced:!c||c(710)===1/0},{cosh:function(t){var l=e(o(t)-1)+1;return(l+1/(l*d*d))*(d/2)}})},function(t,l,i){var n=i(0),e=i(91);n({target:"Math",stat:!0,forced:e!=Math.expm1},{expm1:e})},function(t,l,i){i(0)({target:"Math",stat:!0},{fround:i(154)})},function(t,l,i){var n=i(0),e=Math.hypot,c=Math.abs,o=Math.sqrt;n({target:"Math",stat:!0,forced:!!e&&e(1/0,NaN)!==1/0},{hypot:function(t,l){for(var i,n,e=0,d=0,a=arguments.length,r=0;d<a;)r<(i=c(arguments[d++]))?(e=e*(n=r/i)*n+1,r=i):e+=i>0?(n=i/r)*n:i;return r===1/0?1/0:r*o(e)}})},function(t,l,i){var n=i(0),e=i(2),c=Math.imul;n({target:"Math",stat:!0,forced:e((function(){return-5!=c(4294967295,5)||2!=c.length}))},{imul:function(t,l){var i=+t,n=+l,e=65535&i,c=65535&n;return 0|e*c+((65535&i>>>16)*c+e*(65535&n>>>16)<<16>>>0)}})},function(t,l,i){var n=i(0),e=Math.log,c=Math.LOG10E;n({target:"Math",stat:!0},{log10:function(t){return e(t)*c}})},function(t,l,i){i(0)({target:"Math",stat:!0},{log1p:i(153)})},function(t,l,i){var n=i(0),e=Math.log,c=Math.LN2;n({target:"Math",stat:!0},{log2:function(t){return e(t)/c}})},function(t,l,i){i(0)({target:"Math",stat:!0},{sign:i(123)})},function(t,l,i){var n=i(0),e=i(2),c=i(91),o=Math.abs,d=Math.exp,a=Math.E;n({target:"Math",stat:!0,forced:e((function(){return-2e-17!=Math.sinh(-2e-17)}))},{sinh:function(t){return o(t=+t)<1?(c(t)-c(-t))/2:(d(t-1)-d(-t-1))*(a/2)}})},function(t,l,i){var n=i(0),e=i(91),c=Math.exp;n({target:"Math",stat:!0},{tanh:function(t){var l=e(t=+t),i=e(-t);return l==1/0?1:i==1/0?-1:(l-i)/(c(t)+c(-t))}})},function(t,l,i){i(36)(Math,"Math",!0)},function(t,l,i){var n=i(0),e=Math.ceil,c=Math.floor;n({target:"Math",stat:!0},{trunc:function(t){return(t>0?c:e)(t)}})},function(t,l,i){"use strict";var n=i(9),e=i(5),c=i(67),o=i(24),d=i(15),a=i(40),r=i(90),u=i(33),Z=i(2),s=i(26),b=i(49).f,m=i(23).f,h=i(11).f,I=i(60).trim,p=e.Number,G=p.prototype,y="Number"==a(s(G)),X=function(t){var l,i,n,e,c,o,d,a,r=u(t,!1);if("string"==typeof r&&r.length>2)if(43===(l=(r=I(r)).charCodeAt(0))||45===l){if(88===(i=r.charCodeAt(2))||120===i)return NaN}else if(48===l){switch(r.charCodeAt(1)){case 66:case 98:n=2,e=49;break;case 79:case 111:n=8,e=55;break;default:return+r}for(o=(c=r.slice(2)).length,d=0;d<o;d++)if((a=c.charCodeAt(d))<48||a>e)return NaN;return parseInt(c,n)}return+r};if(c("Number",!p(" 0o1")||!p("0b1")||p("+0x1"))){for(var g,V=function(t){var l=arguments.length<1?0:t,i=this;return i instanceof V&&(y?Z((function(){G.valueOf.call(i)})):"Number"!=a(i))?r(new p(X(l)),i,V):X(l)},W=n?b(p):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,fromString,range".split(","),C=0;W.length>C;C++)d(p,g=W[C])&&!d(V,g)&&h(V,g,m(p,g));V.prototype=G,G.constructor=V,o(e,"Number",V)}},function(t,l,i){i(0)({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)})},function(t,l,i){i(0)({target:"Number",stat:!0},{isFinite:i(155)})},function(t,l,i){i(0)({target:"Number",stat:!0},{isInteger:i(156)})},function(t,l,i){i(0)({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},function(t,l,i){var n=i(0),e=i(156),c=Math.abs;n({target:"Number",stat:!0},{isSafeInteger:function(t){return e(t)&&c(t)<=9007199254740991}})},function(t,l,i){i(0)({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991})},function(t,l,i){i(0)({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991})},function(t,l,i){var n=i(0),e=i(157);n({target:"Number",stat:!0,forced:Number.parseFloat!=e},{parseFloat:e})},function(t,l,i){var n=i(0),e=i(124);n({target:"Number",stat:!0,forced:Number.parseInt!=e},{parseInt:e})},function(t,l,i){"use strict";var n=i(0),e=i(29),c=i(158),o=i(121),d=i(2),a=1..toFixed,r=Math.floor,u=function(t,l,i){return 0===l?i:l%2==1?u(t,l-1,i*t):u(t*t,l/2,i)};n({target:"Number",proto:!0,forced:a&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!d((function(){a.call({})}))},{toFixed:function(t){var l,i,n,d,a=c(this),Z=e(t),s=[0,0,0,0,0,0],b="",m="0",h=function(t,l){for(var i=-1,n=l;++i<6;)n+=t*s[i],s[i]=n%1e7,n=r(n/1e7)},I=function(t){for(var l=6,i=0;--l>=0;)i+=s[l],s[l]=r(i/t),i=i%t*1e7},p=function(){for(var t=6,l="";--t>=0;)if(""!==l||0===t||0!==s[t]){var i=String(s[t]);l=""===l?i:l+o.call("0",7-i.length)+i}return l};if(Z<0||Z>20)throw RangeError("Incorrect fraction digits");if(a!=a)return"NaN";if(a<=-1e21||a>=1e21)return String(a);if(a<0&&(b="-",a=-a),a>1e-21)if(i=(l=function(t){for(var l=0,i=t;i>=4096;)l+=12,i/=4096;for(;i>=2;)l+=1,i/=2;return l}(a*u(2,69,1))-69)<0?a*u(2,-l,1):a/u(2,l,1),i*=4503599627370496,(l=52-l)>0){for(h(0,i),n=Z;n>=7;)h(1e7,0),n-=7;for(h(u(10,n,1),0),n=l-1;n>=23;)I(1<<23),n-=23;I(1<<n),h(1,1),I(2),m=p()}else h(0,i),h(1<<-l,0),m=p()+o.call("0",Z);return m=Z>0?b+((d=m.length)<=Z?"0."+o.call("0",Z-d)+m:m.slice(0,d-Z)+"."+m.slice(d-Z)):b+m}})},function(t,l,i){"use strict";var n=i(0),e=i(2),c=i(158),o=1..toPrecision;n({target:"Number",proto:!0,forced:e((function(){return"1"!==o.call(1,void 0)}))||!e((function(){o.call({})}))},{toPrecision:function(t){return void 0===t?o.call(c(this)):o.call(c(this),t)}})},function(t,l,i){var n=i(0),e=i(159);n({target:"Object",stat:!0,forced:Object.assign!==e},{assign:e})},function(t,l,i){i(0)({target:"Object",stat:!0,sham:!i(9)},{create:i(26)})},function(t,l,i){"use strict";var n=i(0),e=i(9),c=i(93),o=i(14),d=i(3),a=i(11);e&&n({target:"Object",proto:!0,forced:c},{__defineGetter__:function(t,l){a.f(o(this),t,{get:d(l),enumerable:!0,configurable:!0})}})},function(t,l,i){var n=i(0),e=i(9);n({target:"Object",stat:!0,forced:!e,sham:!e},{defineProperties:i(111)})},function(t,l,i){var n=i(0),e=i(9);n({target:"Object",stat:!0,forced:!e,sham:!e},{defineProperty:i(11).f})},function(t,l,i){"use strict";var n=i(0),e=i(9),c=i(93),o=i(14),d=i(3),a=i(11);e&&n({target:"Object",proto:!0,forced:c},{__defineSetter__:function(t,l){a.f(o(this),t,{set:d(l),enumerable:!0,configurable:!0})}})},function(t,l,i){var n=i(0),e=i(160).entries;n({target:"Object",stat:!0},{entries:function(t){return e(t)}})},function(t,l,i){var n=i(0),e=i(74),c=i(2),o=i(8),d=i(52).onFreeze,a=Object.freeze;n({target:"Object",stat:!0,forced:c((function(){a(1)})),sham:!e},{freeze:function(t){return a&&o(t)?a(d(t)):t}})},function(t,l,i){var n=i(0),e=i(6),c=i(50);n({target:"Object",stat:!0},{fromEntries:function(t){var l={};return e(t,(function(t,i){c(l,t,i)}),{AS_ENTRIES:!0}),l}})},function(t,l,i){var n=i(0),e=i(2),c=i(28),o=i(23).f,d=i(9),a=e((function(){o(1)}));n({target:"Object",stat:!0,forced:!d||a,sham:!d},{getOwnPropertyDescriptor:function(t,l){return o(c(t),l)}})},function(t,l,i){var n=i(0),e=i(9),c=i(107),o=i(28),d=i(23),a=i(50);n({target:"Object",stat:!0,sham:!e},{getOwnPropertyDescriptors:function(t){for(var l,i,n=o(t),e=d.f,r=c(n),u={},Z=0;r.length>Z;)void 0!==(i=e(n,l=r[Z++]))&&a(u,l,i);return u}})},function(t,l,i){var n=i(0),e=i(2),c=i(141).f;n({target:"Object",stat:!0,forced:e((function(){return!Object.getOwnPropertyNames(1)}))},{getOwnPropertyNames:c})},function(t,l,i){var n=i(0),e=i(2),c=i(14),o=i(25),d=i(118);n({target:"Object",stat:!0,forced:e((function(){o(1)})),sham:!d},{getPrototypeOf:function(t){return o(c(t))}})},function(t,l,i){i(0)({target:"Object",stat:!0},{is:i(161)})},function(t,l,i){var n=i(0),e=i(2),c=i(8),o=Object.isExtensible;n({target:"Object",stat:!0,forced:e((function(){o(1)}))},{isExtensible:function(t){return!!c(t)&&(!o||o(t))}})},function(t,l,i){var n=i(0),e=i(2),c=i(8),o=Object.isFrozen;n({target:"Object",stat:!0,forced:e((function(){o(1)}))},{isFrozen:function(t){return!c(t)||!!o&&o(t)}})},function(t,l,i){var n=i(0),e=i(2),c=i(8),o=Object.isSealed;n({target:"Object",stat:!0,forced:e((function(){o(1)}))},{isSealed:function(t){return!c(t)||!!o&&o(t)}})},function(t,l,i){var n=i(0),e=i(14),c=i(57);n({target:"Object",stat:!0,forced:i(2)((function(){c(1)}))},{keys:function(t){return c(e(t))}})},function(t,l,i){"use strict";var n=i(0),e=i(9),c=i(93),o=i(14),d=i(33),a=i(25),r=i(23).f;e&&n({target:"Object",proto:!0,forced:c},{__lookupGetter__:function(t){var l,i=o(this),n=d(t,!0);do{if(l=r(i,n))return l.get}while(i=a(i))}})},function(t,l,i){"use strict";var n=i(0),e=i(9),c=i(93),o=i(14),d=i(33),a=i(25),r=i(23).f;e&&n({target:"Object",proto:!0,forced:c},{__lookupSetter__:function(t){var l,i=o(this),n=d(t,!0);do{if(l=r(i,n))return l.set}while(i=a(i))}})},function(t,l,i){var n=i(0),e=i(8),c=i(52).onFreeze,o=i(74),d=i(2),a=Object.preventExtensions;n({target:"Object",stat:!0,forced:d((function(){a(1)})),sham:!o},{preventExtensions:function(t){return a&&e(t)?a(c(t)):t}})},function(t,l,i){var n=i(0),e=i(8),c=i(52).onFreeze,o=i(74),d=i(2),a=Object.seal;n({target:"Object",stat:!0,forced:d((function(){a(1)})),sham:!o},{seal:function(t){return a&&e(t)?a(c(t)):t}})},function(t,l,i){i(0)({target:"Object",stat:!0},{setPrototypeOf:i(48)})},function(t,l,i){var n=i(115),e=i(24),c=i(302);n||e(Object.prototype,"toString",c,{unsafe:!0})},function(t,l,i){"use strict";var n=i(115),e=i(73);t.exports=n?{}.toString:function(){return"[object "+e(this)+"]"}},function(t,l,i){var n=i(0),e=i(160).values;n({target:"Object",stat:!0},{values:function(t){return e(t)}})},function(t,l,i){var n=i(0),e=i(157);n({global:!0,forced:parseFloat!=e},{parseFloat:e})},function(t,l,i){var n=i(0),e=i(124);n({global:!0,forced:parseInt!=e},{parseInt:e})},function(t,l,i){"use strict";var n,e,c,o,d=i(0),a=i(4),r=i(5),u=i(13),Z=i(162),s=i(24),b=i(42),m=i(36),h=i(51),I=i(8),p=i(3),G=i(34),y=i(106),X=i(6),g=i(85),V=i(20),W=i(125).set,C=i(164),R=i(165),S=i(166),K=i(75),f=i(94),Y=i(17),v=i(67),N=i(7),J=i(59),H=i(70),L=N("species"),U="Promise",x=Y.get,T=Y.set,k=Y.getterFor(U),B=Z,F=r.TypeError,z=r.document,A=r.process,w=u("fetch"),Q=K.f,P=Q,M=!!(z&&z.createEvent&&r.dispatchEvent),j="function"==typeof PromiseRejectionEvent,E=v(U,(function(){if(!(y(B)!==String(B))){if(66===H)return!0;if(!J&&!j)return!0}if(a&&!B.prototype.finally)return!0;if(H>=51&&/native code/.test(B))return!1;var t=B.resolve(1),l=function(t){t((function(){}),(function(){}))};return(t.constructor={})[L]=l,!(t.then((function(){}))instanceof l)})),D=E||!g((function(t){B.all(t).catch((function(){}))})),O=function(t){var l;return!(!I(t)||"function"!=typeof(l=t.then))&&l},q=function(t,l){if(!t.notified){t.notified=!0;var i=t.reactions;C((function(){for(var n=t.value,e=1==t.state,c=0;i.length>c;){var o,d,a,r=i[c++],u=e?r.ok:r.fail,Z=r.resolve,s=r.reject,b=r.domain;try{u?(e||(2===t.rejection&<(t),t.rejection=1),!0===u?o=n:(b&&b.enter(),o=u(n),b&&(b.exit(),a=!0)),o===r.promise?s(F("Promise-chain cycle")):(d=O(o))?d.call(o,Z,s):Z(o)):s(n)}catch(t){b&&!a&&b.exit(),s(t)}}t.reactions=[],t.notified=!1,l&&!t.rejection&&$(t)}))}},_=function(t,l,i){var n,e;M?((n=z.createEvent("Event")).promise=l,n.reason=i,n.initEvent(t,!1,!0),r.dispatchEvent(n)):n={promise:l,reason:i},!j&&(e=r["on"+t])?e(n):"unhandledrejection"===t&&S("Unhandled promise rejection",i)},$=function(t){W.call(r,(function(){var l,i=t.facade,n=t.value;if(tt(t)&&(l=f((function(){J?A.emit("unhandledRejection",n,i):_("unhandledrejection",i,n)})),t.rejection=J||tt(t)?2:1,l.error))throw l.value}))},tt=function(t){return 1!==t.rejection&&!t.parent},lt=function(t){W.call(r,(function(){var l=t.facade;J?A.emit("rejectionHandled",l):_("rejectionhandled",l,t.value)}))},it=function(t,l,i){return function(n){t(l,n,i)}},nt=function(t,l,i){t.done||(t.done=!0,i&&(t=i),t.value=l,t.state=2,q(t,!0))},et=function(t,l,i){if(!t.done){t.done=!0,i&&(t=i);try{if(t.facade===l)throw F("Promise can't be resolved itself");var n=O(l);n?C((function(){var i={done:!1};try{n.call(l,it(et,i,t),it(nt,i,t))}catch(l){nt(i,l,t)}})):(t.value=l,t.state=1,q(t,!1))}catch(l){nt({done:!1},l,t)}}};E&&(B=function(t){G(this,B,U),p(t),n.call(this);var l=x(this);try{t(it(et,l),it(nt,l))}catch(t){nt(l,t)}},(n=function(t){T(this,{type:U,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=b(B.prototype,{then:function(t,l){var i=k(this),n=Q(V(this,B));return n.ok="function"!=typeof t||t,n.fail="function"==typeof l&&l,n.domain=J?A.domain:void 0,i.parent=!0,i.reactions.push(n),0!=i.state&&q(i,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),e=function(){var t=new n,l=x(t);this.promise=t,this.resolve=it(et,l),this.reject=it(nt,l)},K.f=Q=function(t){return t===B||t===c?new e(t):P(t)},a||"function"!=typeof Z||(o=Z.prototype.then,s(Z.prototype,"then",(function(t,l){var i=this;return new B((function(t,l){o.call(i,t,l)})).then(t,l)}),{unsafe:!0}),"function"==typeof w&&d({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return R(B,w.apply(r,arguments))}}))),d({global:!0,wrap:!0,forced:E},{Promise:B}),m(B,U,!1,!0),h(U),c=u(U),d({target:U,stat:!0,forced:E},{reject:function(t){var l=Q(this);return l.reject.call(void 0,t),l.promise}}),d({target:U,stat:!0,forced:a||E},{resolve:function(t){return R(a&&this===c?B:this,t)}}),d({target:U,stat:!0,forced:D},{all:function(t){var l=this,i=Q(l),n=i.resolve,e=i.reject,c=f((function(){var i=p(l.resolve),c=[],o=0,d=1;X(t,(function(t){var a=o++,r=!1;c.push(void 0),d++,i.call(l,t).then((function(t){r||(r=!0,c[a]=t,--d||n(c))}),e)})),--d||n(c)}));return c.error&&e(c.value),i.promise},race:function(t){var l=this,i=Q(l),n=i.reject,e=f((function(){var e=p(l.resolve);X(t,(function(t){e.call(l,t).then(i.resolve,n)}))}));return e.error&&n(e.value),i.promise}})},function(t,l,i){var n=i(71);t.exports=/web0s(?!.*chrome)/i.test(n)},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(162),o=i(2),d=i(13),a=i(20),r=i(165),u=i(24);n({target:"Promise",proto:!0,real:!0,forced:!!c&&o((function(){c.prototype.finally.call({then:function(){}},(function(){}))}))},{finally:function(t){var l=a(this,d("Promise")),i="function"==typeof t;return this.then(i?function(i){return r(l,t()).then((function(){return i}))}:t,i?function(i){return r(l,t()).then((function(){throw i}))}:t)}}),e||"function"!=typeof c||c.prototype.finally||u(c.prototype,"finally",d("Promise").prototype.finally)},function(t,l,i){var n=i(0),e=i(13),c=i(3),o=i(1),d=i(2),a=e("Reflect","apply"),r=Function.apply;n({target:"Reflect",stat:!0,forced:!d((function(){a((function(){}))}))},{apply:function(t,l,i){return c(t),o(i),a?a(t,l,i):r.call(t,l,i)}})},function(t,l,i){var n=i(0),e=i(13),c=i(3),o=i(1),d=i(8),a=i(26),r=i(150),u=i(2),Z=e("Reflect","construct"),s=u((function(){function t(){}return!(Z((function(){}),[],t)instanceof t)})),b=!u((function(){Z((function(){}))})),m=s||b;n({target:"Reflect",stat:!0,forced:m,sham:m},{construct:function(t,l){c(t),o(l);var i=arguments.length<3?t:c(arguments[2]);if(b&&!s)return Z(t,l,i);if(t==i){switch(l.length){case 0:return new t;case 1:return new t(l[0]);case 2:return new t(l[0],l[1]);case 3:return new t(l[0],l[1],l[2]);case 4:return new t(l[0],l[1],l[2],l[3])}var n=[null];return n.push.apply(n,l),new(r.apply(t,n))}var e=i.prototype,u=a(d(e)?e:Object.prototype),m=Function.apply.call(t,u,l);return d(m)?m:u}})},function(t,l,i){var n=i(0),e=i(9),c=i(1),o=i(33),d=i(11);n({target:"Reflect",stat:!0,forced:i(2)((function(){Reflect.defineProperty(d.f({},1,{value:1}),1,{value:2})})),sham:!e},{defineProperty:function(t,l,i){c(t);var n=o(l,!0);c(i);try{return d.f(t,n,i),!0}catch(t){return!1}}})},function(t,l,i){var n=i(0),e=i(1),c=i(23).f;n({target:"Reflect",stat:!0},{deleteProperty:function(t,l){var i=c(e(t),l);return!(i&&!i.configurable)&&delete t[l]}})},function(t,l,i){var n=i(0),e=i(8),c=i(1),o=i(15),d=i(23),a=i(25);n({target:"Reflect",stat:!0},{get:function t(l,i){var n,r,u=arguments.length<3?l:arguments[2];return c(l)===u?l[i]:(n=d.f(l,i))?o(n,"value")?n.value:void 0===n.get?void 0:n.get.call(u):e(r=a(l))?t(r,i,u):void 0}})},function(t,l,i){var n=i(0),e=i(9),c=i(1),o=i(23);n({target:"Reflect",stat:!0,sham:!e},{getOwnPropertyDescriptor:function(t,l){return o.f(c(t),l)}})},function(t,l,i){var n=i(0),e=i(1),c=i(25);n({target:"Reflect",stat:!0,sham:!i(118)},{getPrototypeOf:function(t){return c(e(t))}})},function(t,l,i){i(0)({target:"Reflect",stat:!0},{has:function(t,l){return l in t}})},function(t,l,i){var n=i(0),e=i(1),c=Object.isExtensible;n({target:"Reflect",stat:!0},{isExtensible:function(t){return e(t),!c||c(t)}})},function(t,l,i){i(0)({target:"Reflect",stat:!0},{ownKeys:i(107)})},function(t,l,i){var n=i(0),e=i(13),c=i(1);n({target:"Reflect",stat:!0,sham:!i(74)},{preventExtensions:function(t){c(t);try{var l=e("Object","preventExtensions");return l&&l(t),!0}catch(t){return!1}}})},function(t,l,i){var n=i(0),e=i(1),c=i(8),o=i(15),d=i(2),a=i(11),r=i(23),u=i(25),Z=i(39);n({target:"Reflect",stat:!0,forced:d((function(){var t=function(){},l=a.f(new t,"a",{configurable:!0});return!1!==Reflect.set(t.prototype,"a",1,l)}))},{set:function t(l,i,n){var d,s,b=arguments.length<4?l:arguments[3],m=r.f(e(l),i);if(!m){if(c(s=u(l)))return t(s,i,n,b);m=Z(0)}if(o(m,"value")){if(!1===m.writable||!c(b))return!1;if(d=r.f(b,i)){if(d.get||d.set||!1===d.writable)return!1;d.value=n,a.f(b,i,d)}else a.f(b,i,Z(0,n));return!0}return void 0!==m.set&&(m.set.call(b,n),!0)}})},function(t,l,i){var n=i(0),e=i(1),c=i(147),o=i(48);o&&n({target:"Reflect",stat:!0},{setPrototypeOf:function(t,l){e(t),c(l);try{return o(t,l),!0}catch(t){return!1}}})},function(t,l,i){var n=i(9),e=i(5),c=i(67),o=i(90),d=i(11).f,a=i(49).f,r=i(76),u=i(61),Z=i(95),s=i(24),b=i(2),m=i(17).set,h=i(51),I=i(7)("match"),p=e.RegExp,G=p.prototype,y=/a/g,X=/a/g,g=new p(y)!==y,V=Z.UNSUPPORTED_Y;if(n&&c("RegExp",!g||V||b((function(){return X[I]=!1,p(y)!=y||p(X)==X||"/a/i"!=p(y,"i")})))){for(var W=function(t,l){var i,n=this instanceof W,e=r(t),c=void 0===l;if(!n&&e&&t.constructor===W&&c)return t;g?e&&!c&&(t=t.source):t instanceof W&&(c&&(l=u.call(t)),t=t.source),V&&(i=!!l&&l.indexOf("y")>-1)&&(l=l.replace(/y/g,""));var d=o(g?new p(t,l):p(t,l),n?this:G,W);return V&&i&&m(d,{sticky:i}),d},C=function(t){t in W||d(W,t,{configurable:!0,get:function(){return p[t]},set:function(l){p[t]=l}})},R=a(p),S=0;R.length>S;)C(R[S++]);G.constructor=W,W.prototype=G,s(e,"RegExp",W)}h("RegExp")},function(t,l,i){var n=i(9),e=i(11),c=i(61),o=i(95).UNSUPPORTED_Y;n&&("g"!=/./g.flags||o)&&e.f(RegExp.prototype,"flags",{configurable:!0,get:c})},function(t,l,i){var n=i(9),e=i(95).UNSUPPORTED_Y,c=i(11).f,o=i(17).get,d=RegExp.prototype;n&&e&&c(RegExp.prototype,"sticky",{configurable:!0,get:function(){if(this!==d){if(this instanceof RegExp)return!!o(this).sticky;throw TypeError("Incompatible receiver, RegExp required")}}})},function(t,l,i){"use strict";i(126);var n,e,c=i(0),o=i(8),d=(n=!1,(e=/[ac]/).exec=function(){return n=!0,/./.exec.apply(this,arguments)},!0===e.test("abc")&&n),a=/./.test;c({target:"RegExp",proto:!0,forced:!d},{test:function(t){if("function"!=typeof this.exec)return a.call(this,t);var l=this.exec(t);if(null!==l&&!o(l))throw new Error("RegExp exec method returned something other than an Object or null");return!!l}})},function(t,l,i){"use strict";var n=i(24),e=i(1),c=i(2),o=i(61),d=RegExp.prototype,a=d.toString,r=c((function(){return"/a/b"!=a.call({source:"a",flags:"b"})})),u="toString"!=a.name;(r||u)&&n(RegExp.prototype,"toString",(function(){var t=e(this),l=String(t.source),i=t.flags;return"/"+l+"/"+String(void 0===i&&t instanceof RegExp&&!("flags"in d)?o.call(t):i)}),{unsafe:!0})},function(t,l,i){"use strict";var n=i(0),e=i(62).codeAt;n({target:"String",proto:!0},{codePointAt:function(t){return e(this,t)}})},function(t,l,i){"use strict";var n,e=i(0),c=i(23).f,o=i(10),d=i(127),a=i(21),r=i(128),u=i(4),Z="".endsWith,s=Math.min,b=r("endsWith");e({target:"String",proto:!0,forced:!!(u||b||(n=c(String.prototype,"endsWith"),!n||n.writable))&&!b},{endsWith:function(t){var l=String(a(this));d(t);var i=arguments.length>1?arguments[1]:void 0,n=o(l.length),e=void 0===i?n:s(o(i),n),c=String(t);return Z?Z.call(l,c,e):l.slice(e-c.length,e)===c}})},function(t,l,i){var n=i(0),e=i(45),c=String.fromCharCode,o=String.fromCodePoint;n({target:"String",stat:!0,forced:!!o&&1!=o.length},{fromCodePoint:function(t){for(var l,i=[],n=arguments.length,o=0;n>o;){if(l=+arguments[o++],e(l,1114111)!==l)throw RangeError(l+" is not a valid code point");i.push(l<65536?c(l):c(55296+((l-=65536)>>10),l%1024+56320))}return i.join("")}})},function(t,l,i){"use strict";var n=i(0),e=i(127),c=i(21);n({target:"String",proto:!0,forced:!i(128)("includes")},{includes:function(t){return!!~String(c(this)).indexOf(e(t),arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){"use strict";var n=i(97),e=i(1),c=i(10),o=i(21),d=i(98),a=i(99);n("match",1,(function(t,l,i){return[function(l){var i=o(this),n=null==l?void 0:l[t];return void 0!==n?n.call(l,i):new RegExp(l)[t](String(i))},function(t){var n=i(l,t,this);if(n.done)return n.value;var o=e(t),r=String(this);if(!o.global)return a(o,r);var u=o.unicode;o.lastIndex=0;for(var Z,s=[],b=0;null!==(Z=a(o,r));){var m=String(Z[0]);s[b]=m,""===m&&(o.lastIndex=d(r,c(o.lastIndex),u)),b++}return 0===b?null:s}]}))},function(t,l,i){"use strict";var n=i(0),e=i(120).end;n({target:"String",proto:!0,forced:i(171)},{padEnd:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){"use strict";var n=i(0),e=i(120).start;n({target:"String",proto:!0,forced:i(171)},{padStart:function(t){return e(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,l,i){var n=i(0),e=i(28),c=i(10);n({target:"String",stat:!0},{raw:function(t){for(var l=e(t.raw),i=c(l.length),n=arguments.length,o=[],d=0;i>d;)o.push(String(l[d++])),d<n&&o.push(String(arguments[d]));return o.join("")}})},function(t,l,i){i(0)({target:"String",proto:!0},{repeat:i(121)})},function(t,l,i){"use strict";var n=i(97),e=i(1),c=i(10),o=i(29),d=i(21),a=i(98),r=i(172),u=i(99),Z=Math.max,s=Math.min;n("replace",2,(function(t,l,i,n){var b=n.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,m=n.REPLACE_KEEPS_$0,h=b?"$":"$0";return[function(i,n){var e=d(this),c=null==i?void 0:i[t];return void 0!==c?c.call(i,e,n):l.call(String(e),i,n)},function(t,n){if(!b&&m||"string"==typeof n&&-1===n.indexOf(h)){var d=i(l,t,this,n);if(d.done)return d.value}var I=e(t),p=String(this),G="function"==typeof n;G||(n=String(n));var y=I.global;if(y){var X=I.unicode;I.lastIndex=0}for(var g=[];;){var V=u(I,p);if(null===V)break;if(g.push(V),!y)break;""===String(V[0])&&(I.lastIndex=a(p,c(I.lastIndex),X))}for(var W,C="",R=0,S=0;S<g.length;S++){V=g[S];for(var K=String(V[0]),f=Z(s(o(V.index),p.length),0),Y=[],v=1;v<V.length;v++)Y.push(void 0===(W=V[v])?W:String(W));var N=V.groups;if(G){var J=[K].concat(Y,f,p);void 0!==N&&J.push(N);var H=String(n.apply(void 0,J))}else H=r(K,p,f,Y,N,n);f>=R&&(C+=p.slice(R,f)+H,R=f+K.length)}return C+p.slice(R)}]}))},function(t,l,i){"use strict";var n=i(97),e=i(1),c=i(21),o=i(161),d=i(99);n("search",1,(function(t,l,i){return[function(l){var i=c(this),n=null==l?void 0:l[t];return void 0!==n?n.call(l,i):new RegExp(l)[t](String(i))},function(t){var n=i(l,t,this);if(n.done)return n.value;var c=e(t),a=String(this),r=c.lastIndex;o(r,0)||(c.lastIndex=0);var u=d(c,a);return o(c.lastIndex,r)||(c.lastIndex=r),null===u?-1:u.index}]}))},function(t,l,i){"use strict";var n=i(97),e=i(76),c=i(1),o=i(21),d=i(20),a=i(98),r=i(10),u=i(99),Z=i(96),s=i(2),b=[].push,m=Math.min,h=!s((function(){return!RegExp(4294967295,"y")}));n("split",2,(function(t,l,i){var n;return n="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,i){var n=String(o(this)),c=void 0===i?4294967295:i>>>0;if(0===c)return[];if(void 0===t)return[n];if(!e(t))return l.call(n,t,c);for(var d,a,r,u=[],s=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),m=0,h=new RegExp(t.source,s+"g");(d=Z.call(h,n))&&!((a=h.lastIndex)>m&&(u.push(n.slice(m,d.index)),d.length>1&&d.index<n.length&&b.apply(u,d.slice(1)),r=d[0].length,m=a,u.length>=c));)h.lastIndex===d.index&&h.lastIndex++;return m===n.length?!r&&h.test("")||u.push(""):u.push(n.slice(m)),u.length>c?u.slice(0,c):u}:"0".split(void 0,0).length?function(t,i){return void 0===t&&0===i?[]:l.call(this,t,i)}:l,[function(l,i){var e=o(this),c=null==l?void 0:l[t];return void 0!==c?c.call(l,e,i):n.call(String(e),l,i)},function(t,e){var o=i(n,t,this,e,n!==l);if(o.done)return o.value;var Z=c(t),s=String(this),b=d(Z,RegExp),I=Z.unicode,p=(Z.ignoreCase?"i":"")+(Z.multiline?"m":"")+(Z.unicode?"u":"")+(h?"y":"g"),G=new b(h?Z:"^(?:"+Z.source+")",p),y=void 0===e?4294967295:e>>>0;if(0===y)return[];if(0===s.length)return null===u(G,s)?[s]:[];for(var X=0,g=0,V=[];g<s.length;){G.lastIndex=h?g:0;var W,C=u(G,h?s:s.slice(g));if(null===C||(W=m(r(G.lastIndex+(h?0:g)),s.length))===X)g=a(s,g,I);else{if(V.push(s.slice(X,g)),V.length===y)return V;for(var R=1;R<=C.length-1;R++)if(V.push(C[R]),V.length===y)return V;g=X=W}}return V.push(s.slice(X)),V}]}),!h)},function(t,l,i){"use strict";var n,e=i(0),c=i(23).f,o=i(10),d=i(127),a=i(21),r=i(128),u=i(4),Z="".startsWith,s=Math.min,b=r("startsWith");e({target:"String",proto:!0,forced:!!(u||b||(n=c(String.prototype,"startsWith"),!n||n.writable))&&!b},{startsWith:function(t){var l=String(a(this));d(t);var i=o(s(arguments.length>1?arguments[1]:void 0,l.length)),n=String(t);return Z?Z.call(l,n,i):l.slice(i,i+n.length)===n}})},function(t,l,i){"use strict";var n=i(0),e=i(60).trim;n({target:"String",proto:!0,forced:i(129)("trim")},{trim:function(){return e(this)}})},function(t,l,i){"use strict";var n=i(0),e=i(60).end,c=i(129)("trimEnd"),o=c?function(){return e(this)}:"".trimEnd;n({target:"String",proto:!0,forced:c},{trimEnd:o,trimRight:o})},function(t,l,i){"use strict";var n=i(0),e=i(60).start,c=i(129)("trimStart"),o=c?function(){return e(this)}:"".trimStart;n({target:"String",proto:!0,forced:c},{trimStart:o,trimLeft:o})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("anchor")},{anchor:function(t){return e(this,"a","name",t)}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("big")},{big:function(){return e(this,"big","","")}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("blink")},{blink:function(){return e(this,"blink","","")}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("bold")},{bold:function(){return e(this,"b","","")}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("fixed")},{fixed:function(){return e(this,"tt","","")}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("fontcolor")},{fontcolor:function(t){return e(this,"font","color",t)}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("fontsize")},{fontsize:function(t){return e(this,"font","size",t)}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("italics")},{italics:function(){return e(this,"i","","")}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("link")},{link:function(t){return e(this,"a","href",t)}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("small")},{small:function(){return e(this,"small","","")}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("strike")},{strike:function(){return e(this,"strike","","")}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("sub")},{sub:function(){return e(this,"sub","","")}})},function(t,l,i){"use strict";var n=i(0),e=i(30);n({target:"String",proto:!0,forced:i(31)("sup")},{sup:function(){return e(this,"sup","","")}})},function(t,l,i){i(43)("Float32",(function(t){return function(l,i,n){return t(this,l,i,n)}}))},function(t,l,i){i(43)("Float64",(function(t){return function(l,i,n){return t(this,l,i,n)}}))},function(t,l,i){i(43)("Int8",(function(t){return function(l,i,n){return t(this,l,i,n)}}))},function(t,l,i){i(43)("Int16",(function(t){return function(l,i,n){return t(this,l,i,n)}}))},function(t,l,i){i(43)("Int32",(function(t){return function(l,i,n){return t(this,l,i,n)}}))},function(t,l,i){i(43)("Uint8",(function(t){return function(l,i,n){return t(this,l,i,n)}}))},function(t,l,i){i(43)("Uint8",(function(t){return function(l,i,n){return t(this,l,i,n)}}),!0)},function(t,l,i){i(43)("Uint16",(function(t){return function(l,i,n){return t(this,l,i,n)}}))},function(t,l,i){i(43)("Uint32",(function(t){return function(l,i,n){return t(this,l,i,n)}}))},function(t,l,i){"use strict";var n=i(12),e=i(143),c=n.aTypedArray;(0,n.exportTypedArrayMethod)("copyWithin",(function(t,l){return e.call(c(this),t,l,arguments.length>2?arguments[2]:void 0)}))},function(t,l,i){"use strict";var n=i(12),e=i(22).every,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("every",(function(t){return e(c(this),t,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(12),e=i(112),c=n.aTypedArray;(0,n.exportTypedArrayMethod)("fill",(function(t){return e.apply(c(this),arguments)}))},function(t,l,i){"use strict";var n=i(12),e=i(22).filter,c=i(20),o=n.aTypedArray,d=n.aTypedArrayConstructor;(0,n.exportTypedArrayMethod)("filter",(function(t){for(var l=e(o(this),t,arguments.length>1?arguments[1]:void 0),i=c(this,this.constructor),n=0,a=l.length,r=new(d(i))(a);a>n;)r[n]=l[n++];return r}))},function(t,l,i){"use strict";var n=i(12),e=i(22).find,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("find",(function(t){return e(c(this),t,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(12),e=i(22).findIndex,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("findIndex",(function(t){return e(c(this),t,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(12),e=i(22).forEach,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("forEach",(function(t){e(c(this),t,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(130);(0,i(12).exportTypedArrayStaticMethod)("from",i(174),n)},function(t,l,i){"use strict";var n=i(12),e=i(66).includes,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("includes",(function(t){return e(c(this),t,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(12),e=i(66).indexOf,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("indexOf",(function(t){return e(c(this),t,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(5),e=i(12),c=i(86),o=i(7)("iterator"),d=n.Uint8Array,a=c.values,r=c.keys,u=c.entries,Z=e.aTypedArray,s=e.exportTypedArrayMethod,b=d&&d.prototype[o],m=!!b&&("values"==b.name||null==b.name),h=function(){return a.call(Z(this))};s("entries",(function(){return u.call(Z(this))})),s("keys",(function(){return r.call(Z(this))})),s("values",h,!m),s(o,h,!m)},function(t,l,i){"use strict";var n=i(12),e=n.aTypedArray,c=n.exportTypedArrayMethod,o=[].join;c("join",(function(t){return o.apply(e(this),arguments)}))},function(t,l,i){"use strict";var n=i(12),e=i(148),c=n.aTypedArray;(0,n.exportTypedArrayMethod)("lastIndexOf",(function(t){return e.apply(c(this),arguments)}))},function(t,l,i){"use strict";var n=i(12),e=i(22).map,c=i(20),o=n.aTypedArray,d=n.aTypedArrayConstructor;(0,n.exportTypedArrayMethod)("map",(function(t){return e(o(this),t,arguments.length>1?arguments[1]:void 0,(function(t,l){return new(d(c(t,t.constructor)))(l)}))}))},function(t,l,i){"use strict";var n=i(12),e=i(130),c=n.aTypedArrayConstructor;(0,n.exportTypedArrayStaticMethod)("of",(function(){for(var t=0,l=arguments.length,i=new(c(this))(l);l>t;)i[t]=arguments[t++];return i}),e)},function(t,l,i){"use strict";var n=i(12),e=i(87).left,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("reduce",(function(t){return e(c(this),t,arguments.length,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(12),e=i(87).right,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("reduceRight",(function(t){return e(c(this),t,arguments.length,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(12),e=n.aTypedArray,c=n.exportTypedArrayMethod,o=Math.floor;c("reverse",(function(){for(var t,l=e(this).length,i=o(l/2),n=0;n<i;)t=this[n],this[n++]=this[--l],this[l]=t;return this}))},function(t,l,i){"use strict";var n=i(12),e=i(10),c=i(173),o=i(14),d=i(2),a=n.aTypedArray;(0,n.exportTypedArrayMethod)("set",(function(t){a(this);var l=c(arguments.length>1?arguments[1]:void 0,1),i=this.length,n=o(t),d=e(n.length),r=0;if(d+l>i)throw RangeError("Wrong length");for(;r<d;)this[l+r]=n[r++]}),d((function(){new Int8Array(1).set({})})))},function(t,l,i){"use strict";var n=i(12),e=i(20),c=i(2),o=n.aTypedArray,d=n.aTypedArrayConstructor,a=n.exportTypedArrayMethod,r=[].slice;a("slice",(function(t,l){for(var i=r.call(o(this),t,l),n=e(this,this.constructor),c=0,a=i.length,u=new(d(n))(a);a>c;)u[c]=i[c++];return u}),c((function(){new Int8Array(1).slice()})))},function(t,l,i){"use strict";var n=i(12),e=i(22).some,c=n.aTypedArray;(0,n.exportTypedArrayMethod)("some",(function(t){return e(c(this),t,arguments.length>1?arguments[1]:void 0)}))},function(t,l,i){"use strict";var n=i(12),e=n.aTypedArray,c=n.exportTypedArrayMethod,o=[].sort;c("sort",(function(t){return o.call(e(this),t)}))},function(t,l,i){"use strict";var n=i(12),e=i(10),c=i(45),o=i(20),d=n.aTypedArray;(0,n.exportTypedArrayMethod)("subarray",(function(t,l){var i=d(this),n=i.length,a=c(t,n);return new(o(i,i.constructor))(i.buffer,i.byteOffset+a*i.BYTES_PER_ELEMENT,e((void 0===l?n:c(l,n))-a))}))},function(t,l,i){"use strict";var n=i(5),e=i(12),c=i(2),o=n.Int8Array,d=e.aTypedArray,a=e.exportTypedArrayMethod,r=[].toLocaleString,u=[].slice,Z=!!o&&c((function(){r.call(new o(1))}));a("toLocaleString",(function(){return r.apply(Z?u.call(d(this)):d(this),arguments)}),c((function(){return[1,2].toLocaleString()!=new o([1,2]).toLocaleString()}))||!c((function(){o.prototype.toLocaleString.call([1,2])})))},function(t,l,i){"use strict";var n=i(12).exportTypedArrayMethod,e=i(2),c=i(5).Uint8Array,o=c&&c.prototype||{},d=[].toString,a=[].join;e((function(){d.call({})}))&&(d=function(){return a.call(this)});var r=o.toString!=d;n("toString",d,r)},function(t,l,i){"use strict";i(89)("WeakSet",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),i(175))},function(t,l,i){i(392)},function(t,l,i){"use strict";var n=i(0),e=i(25),c=i(48),o=i(26),d=i(16),a=i(39),r=i(6),u=function(t,l){var i=this;if(!(i instanceof u))return new u(t,l);c&&(i=c(new Error(void 0),e(i))),void 0!==l&&d(i,"message",String(l));var n=[];return r(t,n.push,{that:n}),d(i,"errors",n),i};u.prototype=o(Error.prototype,{constructor:a(5,u),message:a(5,""),name:a(5,"AggregateError")}),n({global:!0},{AggregateError:u})},function(t,l,i){var n=i(0),e=i(46),c=Object.isFrozen,o=function(t,l){if(!c||!e(t)||!c(t))return!1;for(var i,n=0,o=t.length;n<o;)if(!("string"==typeof(i=t[n++])||l&&void 0===i))return!1;return 0!==o};n({target:"Array",stat:!0},{isTemplateObject:function(t){if(!o(t,!0))return!1;var l=t.raw;return!(l.length!==t.length||!o(l,!1))}})},function(t,l,i){"use strict";var n=i(9),e=i(37),c=i(14),o=i(10),d=i(11).f;n&&!("lastIndex"in[])&&(d(Array.prototype,"lastIndex",{configurable:!0,get:function(){var t=c(this),l=o(t.length);return 0==l?0:l-1}}),e("lastIndex"))},function(t,l,i){"use strict";var n=i(9),e=i(37),c=i(14),o=i(10),d=i(11).f;n&&!("lastItem"in[])&&(d(Array.prototype,"lastItem",{configurable:!0,get:function(){var t=c(this),l=o(t.length);return 0==l?void 0:t[l-1]},set:function(t){var l=c(this),i=o(l.length);return l[0==i?0:i-1]=t}}),e("lastItem"))},function(t,l,i){"use strict";var n=i(0),e=i(34),c=i(16),o=i(15),d=i(7),a=i(397),r=i(4),u=d("toStringTag"),Z=function(){e(this,Z)};Z.prototype=a,o(a,u)||c(a,u,"AsyncIterator"),o(a,"constructor")&&a.constructor!==Object||c(a,"constructor",Z),n({global:!0,forced:r},{AsyncIterator:Z})},function(t,l,i){var n,e,c=i(5),o=i(81),d=i(25),a=i(15),r=i(16),u=i(7),Z=i(4),s=u("asyncIterator"),b=c.AsyncIterator,m=o.AsyncIteratorPrototype;if(!Z)if(m)n=m;else if("function"==typeof b)n=b.prototype;else if(o.USE_FUNCTION_CONSTRUCTOR||c.USE_FUNCTION_CONSTRUCTOR)try{e=d(d(d(Function("return async function*(){}()")()))),d(e)===Object.prototype&&(n=e)}catch(t){}n||(n={}),a(n,s)||r(n,s,(function(){return this})),t.exports=n},function(t,l,i){"use strict";var n=i(0),e=i(1),c=i(53)((function(t,l){var i=this,n=i.iterator;return l.resolve(e(i.next.call(n,t))).then((function(t){return e(t).done?(i.done=!0,{done:!0,value:void 0}):{done:!1,value:[i.index++,t.value]}}))}));n({target:"AsyncIterator",proto:!0,real:!0},{asIndexedPairs:function(){return new c({iterator:e(this),index:0})}})},function(t,l,i){"use strict";var n=i(0),e=i(1),c=i(77),o=i(53)((function(t,l){var i=this;return new l((function(n,c){var o=function(){try{l.resolve(e(i.next.call(i.iterator,i.remaining?void 0:t))).then((function(t){try{e(t).done?(i.done=!0,n({done:!0,value:void 0})):i.remaining?(i.remaining--,o()):n({done:!1,value:t.value})}catch(t){c(t)}}),c)}catch(t){c(t)}};o()}))}));n({target:"AsyncIterator",proto:!0,real:!0},{drop:function(t){return new o({iterator:e(this),remaining:c(t)})}})},function(t,l,i){"use strict";var n=i(0),e=i(78).every;n({target:"AsyncIterator",proto:!0,real:!0},{every:function(t){return e(this,t)}})},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(1),o=i(53)((function(t,l){var i=this,n=i.filterer;return new l((function(e,o){var d=function(){try{l.resolve(c(i.next.call(i.iterator,t))).then((function(t){try{if(c(t).done)i.done=!0,e({done:!0,value:void 0});else{var a=t.value;l.resolve(n(a)).then((function(t){t?e({done:!1,value:a}):d()}),o)}}catch(t){o(t)}}),o)}catch(t){o(t)}};d()}))}));n({target:"AsyncIterator",proto:!0,real:!0},{filter:function(t){return new o({iterator:c(this),filterer:e(t)})}})},function(t,l,i){"use strict";var n=i(0),e=i(78).find;n({target:"AsyncIterator",proto:!0,real:!0},{find:function(t){return e(this,t)}})},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(1),o=i(53),d=i(176),a=o((function(t,l){var i,n,o=this,a=o.mapper;return new l((function(r,u){var Z=function(){try{l.resolve(c(o.next.call(o.iterator,t))).then((function(t){try{c(t).done?(o.done=!0,r({done:!0,value:void 0})):l.resolve(a(t.value)).then((function(t){try{if(void 0!==(n=d(t)))return o.innerIterator=i=c(n.call(t)),o.innerNext=e(i.next),s();u(TypeError(".flatMap callback should return an iterable object"))}catch(t){u(t)}}),u)}catch(t){u(t)}}),u)}catch(t){u(t)}},s=function(){if(i=o.innerIterator)try{l.resolve(c(o.innerNext.call(i))).then((function(t){try{c(t).done?(o.innerIterator=o.innerNext=null,Z()):r({done:!1,value:t.value})}catch(t){u(t)}}),u)}catch(t){u(t)}else Z()};s()}))}));n({target:"AsyncIterator",proto:!0,real:!0},{flatMap:function(t){return new a({iterator:c(this),mapper:e(t),innerIterator:null,innerNext:null})}})},function(t,l,i){"use strict";var n=i(0),e=i(78).forEach;n({target:"AsyncIterator",proto:!0,real:!0},{forEach:function(t){return e(this,t)}})},function(t,l,i){var n=i(0),e=i(56),c=i(3),o=i(1),d=i(14),a=i(53),r=i(176),u=e.AsyncIterator,Z=a((function(t){return o(this.next.call(this.iterator,t))}),!0);n({target:"AsyncIterator",stat:!0},{from:function(t){var l,i=d(t),n=r(i);if(null!=n){if((l=c(n).call(i))instanceof u)return l}else l=i;return new Z({iterator:l})}})},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(1),o=i(53)((function(t,l){var i=this,n=i.mapper;return l.resolve(c(i.next.call(i.iterator,t))).then((function(t){return c(t).done?(i.done=!0,{done:!0,value:void 0}):l.resolve(n(t.value)).then((function(t){return{done:!1,value:t}}))}))}));n({target:"AsyncIterator",proto:!0,real:!0},{map:function(t){return new o({iterator:c(this),mapper:e(t)})}})},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(1),o=i(13)("Promise");n({target:"AsyncIterator",proto:!0,real:!0},{reduce:function(t){var l=c(this),i=e(l.next),n=arguments.length<2,d=n?void 0:arguments[1];return e(t),new o((function(e,a){var r=function(){try{o.resolve(c(i.call(l))).then((function(l){try{if(c(l).done)n?a(TypeError("Reduce of empty iterator with no initial value")):e(d);else{var i=l.value;n?(n=!1,d=i,r()):o.resolve(t(d,i)).then((function(t){d=t,r()}),a)}}catch(t){a(t)}}),a)}catch(t){a(t)}};r()}))}})},function(t,l,i){"use strict";var n=i(0),e=i(78).some;n({target:"AsyncIterator",proto:!0,real:!0},{some:function(t){return e(this,t)}})},function(t,l,i){"use strict";var n=i(0),e=i(1),c=i(77),o=i(53)((function(t,l){var i,n,e=this.iterator;return this.remaining--?this.next.call(e,t):(n={done:!0,value:void 0},this.done=!0,void 0!==(i=e.return)?l.resolve(i.call(e)).then((function(){return n})):n)}));n({target:"AsyncIterator",proto:!0,real:!0},{take:function(t){return new o({iterator:e(this),remaining:c(t)})}})},function(t,l,i){"use strict";var n=i(0),e=i(78).toArray;n({target:"AsyncIterator",proto:!0,real:!0},{toArray:function(){return e(this)}})},function(t,l,i){var n=i(0),e=i(177),c=i(13),o=i(26),d=function(){var t=c("Object","freeze");return t?t(o(null)):o(null)};n({global:!0},{compositeKey:function(){return e.apply(Object,arguments).get("object",d)}})},function(t,l,i){var n=i(0),e=i(177),c=i(13);n({global:!0},{compositeSymbol:function(){return 1===arguments.length&&"string"==typeof arguments[0]?c("Symbol").for(arguments[0]):e.apply(null,arguments).get("symbol",c("Symbol"))}})},function(t,l,i){i(151)},function(t,l,i){"use strict";var n=i(0),e=i(5),c=i(34),o=i(16),d=i(2),a=i(15),r=i(7),u=i(117).IteratorPrototype,Z=i(4),s=r("iterator"),b=r("toStringTag"),m=e.Iterator,h=Z||"function"!=typeof m||m.prototype!==u||!d((function(){m({})})),I=function(){c(this,I)};Z&&o(u={},s,(function(){return this})),a(u,b)||o(u,b,"Iterator"),!h&&a(u,"constructor")&&u.constructor!==Object||o(u,"constructor",I),I.prototype=u,n({global:!0,forced:h},{Iterator:I})},function(t,l,i){"use strict";var n=i(0),e=i(1),c=i(54)((function(t){var l=e(this.next.call(this.iterator,t));if(!(this.done=!!l.done))return[this.index++,l.value]}));n({target:"Iterator",proto:!0,real:!0},{asIndexedPairs:function(){return new c({iterator:e(this),index:0})}})},function(t,l,i){"use strict";var n=i(0),e=i(1),c=i(77),o=i(54)((function(t){for(var l,i=this.iterator,n=this.next;this.remaining;)if(this.remaining--,l=e(n.call(i)),this.done=!!l.done)return;if(l=e(n.call(i,t)),!(this.done=!!l.done))return l.value}));n({target:"Iterator",proto:!0,real:!0},{drop:function(t){return new o({iterator:e(this),remaining:c(t)})}})},function(t,l,i){"use strict";var n=i(0),e=i(6),c=i(3),o=i(1);n({target:"Iterator",proto:!0,real:!0},{every:function(t){return o(this),c(t),!e(this,(function(l,i){if(!t(l))return i()}),{IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(1),o=i(54),d=i(113),a=o((function(t){for(var l,i,n=this.iterator,e=this.filterer,o=this.next;;){if(l=c(o.call(n,t)),this.done=!!l.done)return;if(i=l.value,d(n,e,i))return i}}));n({target:"Iterator",proto:!0,real:!0},{filter:function(t){return new a({iterator:c(this),filterer:e(t)})}})},function(t,l,i){"use strict";var n=i(0),e=i(6),c=i(3),o=i(1);n({target:"Iterator",proto:!0,real:!0},{find:function(t){return o(this),c(t),e(this,(function(l,i){if(t(l))return i(l)}),{IS_ITERATOR:!0,INTERRUPTED:!0}).result}})},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(1),o=i(47),d=i(54),a=i(84),r=d((function(t){for(var l,i,n,d,r=this.iterator,u=this.mapper;;)try{if(d=this.innerIterator){if(!(l=c(this.innerNext.call(d))).done)return l.value;this.innerIterator=this.innerNext=null}if(l=c(this.next.call(r,t)),this.done=!!l.done)return;if(i=u(l.value),void 0===(n=o(i)))throw TypeError(".flatMap callback should return an iterable object");this.innerIterator=d=c(n.call(i)),this.innerNext=e(d.next)}catch(t){throw a(r),t}}));n({target:"Iterator",proto:!0,real:!0},{flatMap:function(t){return new r({iterator:c(this),mapper:e(t),innerIterator:null,innerNext:null})}})},function(t,l,i){"use strict";var n=i(0),e=i(6),c=i(1);n({target:"Iterator",proto:!0,real:!0},{forEach:function(t){e(c(this),t,{IS_ITERATOR:!0})}})},function(t,l,i){var n=i(0),e=i(56),c=i(3),o=i(1),d=i(14),a=i(54),r=i(47),u=e.Iterator,Z=a((function(t){var l=o(this.next.call(this.iterator,t));if(!(this.done=!!l.done))return l.value}),!0);n({target:"Iterator",stat:!0},{from:function(t){var l,i=d(t),n=r(i);if(null!=n){if((l=c(n).call(i))instanceof u)return l}else l=i;return new Z({iterator:l})}})},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(1),o=i(54),d=i(113),a=o((function(t){var l=this.iterator,i=c(this.next.call(l,t));if(!(this.done=!!i.done))return d(l,this.mapper,i.value)}));n({target:"Iterator",proto:!0,real:!0},{map:function(t){return new a({iterator:c(this),mapper:e(t)})}})},function(t,l,i){"use strict";var n=i(0),e=i(6),c=i(3),o=i(1);n({target:"Iterator",proto:!0,real:!0},{reduce:function(t){o(this),c(t);var l=arguments.length<2,i=l?void 0:arguments[1];if(e(this,(function(n){l?(l=!1,i=n):i=t(i,n)}),{IS_ITERATOR:!0}),l)throw TypeError("Reduce of empty iterator with no initial value");return i}})},function(t,l,i){"use strict";var n=i(0),e=i(6),c=i(3),o=i(1);n({target:"Iterator",proto:!0,real:!0},{some:function(t){return o(this),c(t),e(this,(function(l,i){if(t(l))return i()}),{IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(1),c=i(77),o=i(54),d=i(84),a=o((function(t){var l=this.iterator;if(!this.remaining--)return this.done=!0,d(l);var i=e(this.next.call(l,t));return(this.done=!!i.done)?void 0:i.value}));n({target:"Iterator",proto:!0,real:!0},{take:function(t){return new a({iterator:e(this),remaining:c(t)})}})},function(t,l,i){"use strict";var n=i(0),e=i(6),c=i(1),o=[].push;n({target:"Iterator",proto:!0,real:!0},{toArray:function(){var t=[];return e(c(this),o,{that:t,IS_ITERATOR:!0}),t}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(100);n({target:"Map",proto:!0,real:!0,forced:e},{deleteAll:function(){return c.apply(this,arguments)}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(18),d=i(38),a=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{every:function(t){var l=c(this),i=d(l),n=o(t,arguments.length>1?arguments[1]:void 0,3);return!a(i,(function(t,i,e){if(!n(i,t,l))return e()}),{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(18),r=i(20),u=i(38),Z=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{filter:function(t){var l=o(this),i=u(l),n=a(t,arguments.length>1?arguments[1]:void 0,3),e=new(r(l,c("Map"))),s=d(e.set);return Z(i,(function(t,i){n(i,t,l)&&s.call(e,t,i)}),{AS_ENTRIES:!0,IS_ITERATOR:!0}),e}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(18),d=i(38),a=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{find:function(t){var l=c(this),i=d(l),n=o(t,arguments.length>1?arguments[1]:void 0,3);return a(i,(function(t,i,e){if(n(i,t,l))return e(i)}),{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).result}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(18),d=i(38),a=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{findKey:function(t){var l=c(this),i=d(l),n=o(t,arguments.length>1?arguments[1]:void 0,3);return a(i,(function(t,i,e){if(n(i,t,l))return e(t)}),{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).result}})},function(t,l,i){i(0)({target:"Map",stat:!0},{from:i(101)})},function(t,l,i){"use strict";var n=i(0),e=i(6),c=i(3);n({target:"Map",stat:!0},{groupBy:function(t,l){var i=new this;c(l);var n=c(i.has),o=c(i.get),d=c(i.set);return e(t,(function(t){var e=l(t);n.call(i,e)?o.call(i,e).push(t):d.call(i,e,[t])})),i}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(38),d=i(436),a=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{includes:function(t){return a(o(c(this)),(function(l,i,n){if(d(i,t))return n()}),{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},function(t,l){t.exports=function(t,l){return t===l||t!=t&&l!=l}},function(t,l,i){"use strict";var n=i(0),e=i(6),c=i(3);n({target:"Map",stat:!0},{keyBy:function(t,l){var i=new this;c(l);var n=c(i.set);return e(t,(function(t){n.call(i,l(t),t)})),i}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(38),d=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{keyOf:function(t){return d(o(c(this)),(function(l,i,n){if(i===t)return n(l)}),{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).result}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(18),r=i(20),u=i(38),Z=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{mapKeys:function(t){var l=o(this),i=u(l),n=a(t,arguments.length>1?arguments[1]:void 0,3),e=new(r(l,c("Map"))),s=d(e.set);return Z(i,(function(t,i){s.call(e,n(i,t,l),i)}),{AS_ENTRIES:!0,IS_ITERATOR:!0}),e}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(18),r=i(20),u=i(38),Z=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{mapValues:function(t){var l=o(this),i=u(l),n=a(t,arguments.length>1?arguments[1]:void 0,3),e=new(r(l,c("Map"))),s=d(e.set);return Z(i,(function(t,i){s.call(e,t,n(i,t,l))}),{AS_ENTRIES:!0,IS_ITERATOR:!0}),e}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(3),d=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{merge:function(t){for(var l=c(this),i=o(l.set),n=0;n<arguments.length;)d(arguments[n++],i,{that:l,AS_ENTRIES:!0});return l}})},function(t,l,i){i(0)({target:"Map",stat:!0},{of:i(102)})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(3),d=i(38),a=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{reduce:function(t){var l=c(this),i=d(l),n=arguments.length<2,e=n?void 0:arguments[1];if(o(t),a(i,(function(i,c){n?(n=!1,e=c):e=t(e,c,i,l)}),{AS_ENTRIES:!0,IS_ITERATOR:!0}),n)throw TypeError("Reduce of empty map with no initial value");return e}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(18),d=i(38),a=i(6);n({target:"Map",proto:!0,real:!0,forced:e},{some:function(t){var l=c(this),i=d(l),n=o(t,arguments.length>1?arguments[1]:void 0,3);return a(i,(function(t,i,e){if(n(i,t,l))return e()}),{AS_ENTRIES:!0,IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(3);n({target:"Map",proto:!0,real:!0,forced:e},{update:function(t,l){var i=c(this),n=arguments.length;o(l);var e=i.has(t);if(!e&&n<3)throw TypeError("Updating absent value");var d=e?i.get(t):o(n>2?arguments[2]:void 0)(t,i);return i.set(t,l(d,t,i)),i}})},function(t,l,i){"use strict";i(0)({target:"Map",proto:!0,real:!0,forced:i(4)},{updateOrInsert:i(132)})},function(t,l,i){"use strict";i(0)({target:"Map",proto:!0,real:!0,forced:i(4)},{upsert:i(132)})},function(t,l,i){var n=i(0),e=Math.min,c=Math.max;n({target:"Math",stat:!0},{clamp:function(t,l,i){return e(i,c(l,t))}})},function(t,l,i){i(0)({target:"Math",stat:!0},{DEG_PER_RAD:Math.PI/180})},function(t,l,i){var n=i(0),e=180/Math.PI;n({target:"Math",stat:!0},{degrees:function(t){return t*e}})},function(t,l,i){var n=i(0),e=i(178),c=i(154);n({target:"Math",stat:!0},{fscale:function(t,l,i,n,o){return c(e(t,l,i,n,o))}})},function(t,l,i){i(0)({target:"Math",stat:!0},{iaddh:function(t,l,i,n){var e=t>>>0,c=i>>>0;return(l>>>0)+(n>>>0)+((e&c|(e|c)&~(e+c>>>0))>>>31)|0}})},function(t,l,i){i(0)({target:"Math",stat:!0},{imulh:function(t,l){var i=+t,n=+l,e=65535&i,c=65535&n,o=i>>16,d=n>>16,a=(o*c>>>0)+(e*c>>>16);return o*d+(a>>16)+((e*d>>>0)+(65535&a)>>16)}})},function(t,l,i){i(0)({target:"Math",stat:!0},{isubh:function(t,l,i,n){var e=t>>>0,c=i>>>0;return(l>>>0)-(n>>>0)-((~e&c|~(e^c)&e-c>>>0)>>>31)|0}})},function(t,l,i){i(0)({target:"Math",stat:!0},{RAD_PER_DEG:180/Math.PI})},function(t,l,i){var n=i(0),e=Math.PI/180;n({target:"Math",stat:!0},{radians:function(t){return t*e}})},function(t,l,i){i(0)({target:"Math",stat:!0},{scale:i(178)})},function(t,l,i){var n=i(0),e=i(1),c=i(155),o=i(58),d=i(17),a=d.set,r=d.getterFor("Seeded Random Generator"),u=o((function(t){a(this,{type:"Seeded Random Generator",seed:t%2147483647})}),"Seeded Random",(function(){var t=r(this);return{value:(1073741823&(t.seed=(1103515245*t.seed+12345)%2147483647))/1073741823,done:!1}}));n({target:"Math",stat:!0,forced:!0},{seededPRNG:function(t){var l=e(t).seed;if(!c(l))throw TypeError('Math.seededPRNG() argument should have a "seed" field with a finite value.');return new u(l)}})},function(t,l,i){i(0)({target:"Math",stat:!0},{signbit:function(t){return(t=+t)==t&&0==t?1/t==-1/0:t<0}})},function(t,l,i){i(0)({target:"Math",stat:!0},{umulh:function(t,l){var i=+t,n=+l,e=65535&i,c=65535&n,o=i>>>16,d=n>>>16,a=(o*c>>>0)+(e*c>>>16);return o*d+(a>>>16)+((e*d>>>0)+(65535&a)>>>16)}})},function(t,l,i){"use strict";var n=i(0),e=i(29),c=i(124),o=/^[\da-z]+$/;n({target:"Number",stat:!0},{fromString:function(t,l){var i,n,d=1;if("string"!=typeof t)throw TypeError("Invalid number representation");if(!t.length)throw SyntaxError("Invalid number representation");if("-"==t.charAt(0)&&(d=-1,!(t=t.slice(1)).length))throw SyntaxError("Invalid number representation");if((i=void 0===l?10:e(l))<2||i>36)throw RangeError("Invalid radix");if(!o.test(t)||(n=c(t,i)).toString(i)!==t)throw SyntaxError("Invalid number representation");return d*n}})},function(t,l,i){"use strict";var n=i(0),e=i(133);n({target:"Object",stat:!0},{iterateEntries:function(t){return new e(t,"entries")}})},function(t,l,i){"use strict";var n=i(0),e=i(133);n({target:"Object",stat:!0},{iterateKeys:function(t){return new e(t,"keys")}})},function(t,l,i){"use strict";var n=i(0),e=i(133);n({target:"Object",stat:!0},{iterateValues:function(t){return new e(t,"values")}})},function(t,l,i){"use strict";var n=i(0),e=i(9),c=i(51),o=i(3),d=i(1),a=i(8),r=i(34),u=i(11).f,Z=i(16),s=i(42),b=i(79),m=i(6),h=i(166),I=i(7),p=i(17),G=I("observable"),y=p.get,X=p.set,g=function(t){return null==t?void 0:o(t)},V=function(t){var l=t.cleanup;if(l){t.cleanup=void 0;try{l()}catch(t){h(t)}}},W=function(t){return void 0===t.observer},C=function(t,l){if(!e){t.closed=!0;var i=l.subscriptionObserver;i&&(i.closed=!0)}l.observer=void 0},R=function(t,l){var i,n=X(this,{cleanup:void 0,observer:d(t),subscriptionObserver:void 0});e||(this.closed=!1);try{(i=g(t.start))&&i.call(t,this)}catch(t){h(t)}if(!W(n)){var c=n.subscriptionObserver=new S(this);try{var a=l(c),r=a;null!=a&&(n.cleanup="function"==typeof a.unsubscribe?function(){r.unsubscribe()}:o(a))}catch(t){return void c.error(t)}W(n)&&V(n)}};R.prototype=s({},{unsubscribe:function(){var t=y(this);W(t)||(C(this,t),V(t))}}),e&&u(R.prototype,"closed",{configurable:!0,get:function(){return W(y(this))}});var S=function(t){X(this,{subscription:t}),e||(this.closed=!1)};S.prototype=s({},{next:function(t){var l=y(y(this).subscription);if(!W(l)){var i=l.observer;try{var n=g(i.next);n&&n.call(i,t)}catch(t){h(t)}}},error:function(t){var l=y(this).subscription,i=y(l);if(!W(i)){var n=i.observer;C(l,i);try{var e=g(n.error);e?e.call(n,t):h(t)}catch(t){h(t)}V(i)}},complete:function(){var t=y(this).subscription,l=y(t);if(!W(l)){var i=l.observer;C(t,l);try{var n=g(i.complete);n&&n.call(i)}catch(t){h(t)}V(l)}}}),e&&u(S.prototype,"closed",{configurable:!0,get:function(){return W(y(y(this).subscription))}});var K=function(t){r(this,K,"Observable"),X(this,{subscriber:o(t)})};s(K.prototype,{subscribe:function(t){var l=arguments.length;return new R("function"==typeof t?{next:t,error:l>1?arguments[1]:void 0,complete:l>2?arguments[2]:void 0}:a(t)?t:{},y(this).subscriber)}}),s(K,{from:function(t){var l="function"==typeof this?this:K,i=g(d(t)[G]);if(i){var n=d(i.call(t));return n.constructor===l?n:new l((function(t){return n.subscribe(t)}))}var e=b(t);return new l((function(t){m(e,(function(l,i){if(t.next(l),t.closed)return i()}),{IS_ITERATOR:!0,INTERRUPTED:!0}),t.complete()}))},of:function(){for(var t="function"==typeof this?this:K,l=arguments.length,i=new Array(l),n=0;n<l;)i[n]=arguments[n++];return new t((function(t){for(var n=0;n<l;n++)if(t.next(i[n]),t.closed)return;t.complete()}))}}),Z(K.prototype,G,(function(){return this})),n({global:!0},{Observable:K}),c("Observable")},function(t,l,i){i(167)},function(t,l,i){i(468)},function(t,l,i){"use strict";var n=i(0),e=i(3),c=i(13),o=i(75),d=i(94),a=i(6);n({target:"Promise",stat:!0},{any:function(t){var l=this,i=o.f(l),n=i.resolve,r=i.reject,u=d((function(){var i=e(l.resolve),o=[],d=0,u=1,Z=!1;a(t,(function(t){var e=d++,a=!1;o.push(void 0),u++,i.call(l,t).then((function(t){a||Z||(Z=!0,n(t))}),(function(t){a||Z||(a=!0,o[e]=t,--u||r(new(c("AggregateError"))(o,"No one promise resolved")))}))})),--u||r(new(c("AggregateError"))(o,"No one promise resolved"))}));return u.error&&r(u.value),i.promise}})},function(t,l,i){"use strict";var n=i(0),e=i(75),c=i(94);n({target:"Promise",stat:!0},{try:function(t){var l=e.f(this),i=c(t);return(i.error?l.reject:l.resolve)(i.value),l.promise}})},function(t,l,i){var n=i(0),e=i(44),c=i(1),o=e.toKey,d=e.set;n({target:"Reflect",stat:!0},{defineMetadata:function(t,l,i){var n=arguments.length<4?void 0:o(arguments[3]);d(t,l,c(i),n)}})},function(t,l,i){var n=i(0),e=i(44),c=i(1),o=e.toKey,d=e.getMap,a=e.store;n({target:"Reflect",stat:!0},{deleteMetadata:function(t,l){var i=arguments.length<3?void 0:o(arguments[2]),n=d(c(l),i,!1);if(void 0===n||!n.delete(t))return!1;if(n.size)return!0;var e=a.get(l);return e.delete(i),!!e.size||a.delete(l)}})},function(t,l,i){var n=i(0),e=i(44),c=i(1),o=i(25),d=e.has,a=e.get,r=e.toKey,u=function(t,l,i){if(d(t,l,i))return a(t,l,i);var n=o(l);return null!==n?u(t,n,i):void 0};n({target:"Reflect",stat:!0},{getMetadata:function(t,l){var i=arguments.length<3?void 0:r(arguments[2]);return u(t,c(l),i)}})},function(t,l,i){var n=i(0),e=i(168),c=i(44),o=i(1),d=i(25),a=i(6),r=c.keys,u=c.toKey,Z=function(t,l){var i=r(t,l),n=d(t);if(null===n)return i;var c,o,u=Z(n,l);return u.length?i.length?(c=new e(i.concat(u)),a(c,(o=[]).push,{that:o}),o):u:i};n({target:"Reflect",stat:!0},{getMetadataKeys:function(t){var l=arguments.length<2?void 0:u(arguments[1]);return Z(o(t),l)}})},function(t,l,i){var n=i(0),e=i(44),c=i(1),o=e.get,d=e.toKey;n({target:"Reflect",stat:!0},{getOwnMetadata:function(t,l){var i=arguments.length<3?void 0:d(arguments[2]);return o(t,c(l),i)}})},function(t,l,i){var n=i(0),e=i(44),c=i(1),o=e.keys,d=e.toKey;n({target:"Reflect",stat:!0},{getOwnMetadataKeys:function(t){var l=arguments.length<2?void 0:d(arguments[1]);return o(c(t),l)}})},function(t,l,i){var n=i(0),e=i(44),c=i(1),o=i(25),d=e.has,a=e.toKey,r=function(t,l,i){if(d(t,l,i))return!0;var n=o(l);return null!==n&&r(t,n,i)};n({target:"Reflect",stat:!0},{hasMetadata:function(t,l){var i=arguments.length<3?void 0:a(arguments[2]);return r(t,c(l),i)}})},function(t,l,i){var n=i(0),e=i(44),c=i(1),o=e.has,d=e.toKey;n({target:"Reflect",stat:!0},{hasOwnMetadata:function(t,l){var i=arguments.length<3?void 0:d(arguments[2]);return o(t,c(l),i)}})},function(t,l,i){var n=i(0),e=i(44),c=i(1),o=e.toKey,d=e.set;n({target:"Reflect",stat:!0},{metadata:function(t,l){return function(i,n){d(t,l,c(i),o(n))}}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(179);n({target:"Set",proto:!0,real:!0,forced:e},{addAll:function(){return c.apply(this,arguments)}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(100);n({target:"Set",proto:!0,real:!0,forced:e},{deleteAll:function(){return c.apply(this,arguments)}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(20),r=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{difference:function(t){var l=o(this),i=new(a(l,c("Set")))(l),n=d(i.delete);return r(t,(function(t){n.call(i,t)})),i}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(18),d=i(55),a=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{every:function(t){var l=c(this),i=d(l),n=o(t,arguments.length>1?arguments[1]:void 0,3);return!a(i,(function(t,i){if(!n(t,t,l))return i()}),{IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(18),r=i(20),u=i(55),Z=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{filter:function(t){var l=o(this),i=u(l),n=a(t,arguments.length>1?arguments[1]:void 0,3),e=new(r(l,c("Set"))),s=d(e.add);return Z(i,(function(t){n(t,t,l)&&s.call(e,t)}),{IS_ITERATOR:!0}),e}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(18),d=i(55),a=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{find:function(t){var l=c(this),i=d(l),n=o(t,arguments.length>1?arguments[1]:void 0,3);return a(i,(function(t,i){if(n(t,t,l))return i(t)}),{IS_ITERATOR:!0,INTERRUPTED:!0}).result}})},function(t,l,i){i(0)({target:"Set",stat:!0},{from:i(101)})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(20),r=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{intersection:function(t){var l=o(this),i=new(a(l,c("Set"))),n=d(l.has),e=d(i.add);return r(t,(function(t){n.call(l,t)&&e.call(i,t)})),i}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(3),d=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{isDisjointFrom:function(t){var l=c(this),i=o(l.has);return!d(t,(function(t,n){if(!0===i.call(l,t))return n()}),{INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(79),r=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{isSubsetOf:function(t){var l=a(this),i=o(t),n=i.has;return"function"!=typeof n&&(i=new(c("Set"))(t),n=d(i.has)),!r(l,(function(t,l){if(!1===n.call(i,t))return l()}),{IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(3),d=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{isSupersetOf:function(t){var l=c(this),i=o(l.has);return!d(t,(function(t,n){if(!1===i.call(l,t))return n()}),{INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(55),d=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{join:function(t){var l=c(this),i=o(l),n=void 0===t?",":String(t),e=[];return d(i,e.push,{that:e,IS_ITERATOR:!0}),e.join(n)}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(18),r=i(20),u=i(55),Z=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{map:function(t){var l=o(this),i=u(l),n=a(t,arguments.length>1?arguments[1]:void 0,3),e=new(r(l,c("Set"))),s=d(e.add);return Z(i,(function(t){s.call(e,n(t,t,l))}),{IS_ITERATOR:!0}),e}})},function(t,l,i){i(0)({target:"Set",stat:!0},{of:i(102)})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(3),d=i(55),a=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{reduce:function(t){var l=c(this),i=d(l),n=arguments.length<2,e=n?void 0:arguments[1];if(o(t),a(i,(function(i){n?(n=!1,e=i):e=t(e,i,i,l)}),{IS_ITERATOR:!0}),n)throw TypeError("Reduce of empty set with no initial value");return e}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(1),o=i(18),d=i(55),a=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{some:function(t){var l=c(this),i=d(l),n=o(t,arguments.length>1?arguments[1]:void 0,3);return a(i,(function(t,i){if(n(t,t,l))return i()}),{IS_ITERATOR:!0,INTERRUPTED:!0}).stopped}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(20),r=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{symmetricDifference:function(t){var l=o(this),i=new(a(l,c("Set")))(l),n=d(i.delete),e=d(i.add);return r(t,(function(t){n.call(i,t)||e.call(i,t)})),i}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(13),o=i(1),d=i(3),a=i(20),r=i(6);n({target:"Set",proto:!0,real:!0,forced:e},{union:function(t){var l=o(this),i=new(a(l,c("Set")))(l);return r(t,d(i.add),{that:i}),i}})},function(t,l,i){"use strict";var n=i(0),e=i(62).charAt;n({target:"String",proto:!0,forced:i(2)((function(){return"𠮷"!=="𠮷".at(0)}))},{at:function(t){return e(this,t)}})},function(t,l,i){"use strict";var n=i(0),e=i(58),c=i(21),o=i(17),d=i(62),a=d.codeAt,r=d.charAt,u=o.set,Z=o.getterFor("String Iterator"),s=e((function(t){u(this,{type:"String Iterator",string:t,index:0})}),"String",(function(){var t,l=Z(this),i=l.string,n=l.index;return n>=i.length?{value:void 0,done:!0}:(t=r(i,n),l.index+=t.length,{value:{codePoint:a(t,0),position:n},done:!1})}));n({target:"String",proto:!0},{codePoints:function(){return new s(String(c(this)))}})},function(t,l,i){i(170)},function(t,l,i){i(501)},function(t,l,i){"use strict";var n=i(0),e=i(21),c=i(76),o=i(61),d=i(172),a=i(7),r=i(4),u=a("replace"),Z=RegExp.prototype,s=Math.max,b=function(t,l,i){return i>t.length?-1:""===l?i:t.indexOf(l,i)};n({target:"String",proto:!0},{replaceAll:function(t,l){var i,n,a,m,h,I,p,G,y=e(this),X=0,g=0,V="";if(null!=t){if((i=c(t))&&!~String(e("flags"in Z?t.flags:o.call(t))).indexOf("g"))throw TypeError("`.replaceAll` does not allow non-global regexes");if(void 0!==(n=t[u]))return n.call(t,y,l);if(r&&i)return String(y).replace(t,l)}for(a=String(y),m=String(t),(h="function"==typeof l)||(l=String(l)),I=m.length,p=s(1,I),X=b(a,m,0);-1!==X;)G=h?String(l(m,X,a)):d(m,a,X,[],void 0,l),V+=a.slice(g,X)+G,g=X+I,X=b(a,m,X+p);return g<a.length&&(V+=a.slice(g)),V}})},function(t,l,i){i(19)("asyncDispose")},function(t,l,i){i(19)("dispose")},function(t,l,i){i(19)("observable")},function(t,l,i){i(19)("patternMatch")},function(t,l,i){i(19)("replaceAll")},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(100);n({target:"WeakMap",proto:!0,real:!0,forced:e},{deleteAll:function(){return c.apply(this,arguments)}})},function(t,l,i){i(0)({target:"WeakMap",stat:!0},{from:i(101)})},function(t,l,i){i(0)({target:"WeakMap",stat:!0},{of:i(102)})},function(t,l,i){"use strict";i(0)({target:"WeakMap",proto:!0,real:!0,forced:i(4)},{upsert:i(132)})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(179);n({target:"WeakSet",proto:!0,real:!0,forced:e},{addAll:function(){return c.apply(this,arguments)}})},function(t,l,i){"use strict";var n=i(0),e=i(4),c=i(100);n({target:"WeakSet",proto:!0,real:!0,forced:e},{deleteAll:function(){return c.apply(this,arguments)}})},function(t,l,i){i(0)({target:"WeakSet",stat:!0},{from:i(101)})},function(t,l,i){i(0)({target:"WeakSet",stat:!0},{of:i(102)})},function(t,l,i){var n=i(5),e=i(180),c=i(145),o=i(16);for(var d in e){var a=n[d],r=a&&a.prototype;if(r&&r.forEach!==c)try{o(r,"forEach",c)}catch(t){r.forEach=c}}},function(t,l,i){var n=i(5),e=i(180),c=i(86),o=i(16),d=i(7),a=d("iterator"),r=d("toStringTag"),u=c.values;for(var Z in e){var s=n[Z],b=s&&s.prototype;if(b){if(b[a]!==u)try{o(b,a,u)}catch(t){b[a]=u}if(b[r]||o(b,r,Z),e[Z])for(var m in c)if(b[m]!==c[m])try{o(b,m,c[m])}catch(t){b[m]=c[m]}}}},function(t,l,i){var n=i(0),e=i(5),c=i(125);n({global:!0,bind:!0,enumerable:!0,forced:!e.setImmediate||!e.clearImmediate},{setImmediate:c.set,clearImmediate:c.clear})},function(t,l,i){var n=i(0),e=i(5),c=i(164),o=i(59),d=e.process;n({global:!0,enumerable:!0,noTargetGet:!0},{queueMicrotask:function(t){var l=o&&d.domain;c(l?l.bind(t):t)}})},function(t,l,i){var n=i(0),e=i(5),c=i(71),o=[].slice,d=function(t){return function(l,i){var n=arguments.length>2,e=n?o.call(arguments,2):void 0;return t(n?function(){("function"==typeof l?l:Function(l)).apply(this,e)}:l,i)}};n({global:!0,bind:!0,forced:/MSIE .\./.test(c)},{setTimeout:d(e.setTimeout),setInterval:d(e.setInterval)})},function(t,l,i){"use strict";i(169);var n,e=i(0),c=i(9),o=i(181),d=i(5),a=i(111),r=i(24),u=i(34),Z=i(15),s=i(159),b=i(146),m=i(62).codeAt,h=i(521),I=i(36),p=i(182),G=i(17),y=d.URL,X=p.URLSearchParams,g=p.getState,V=G.set,W=G.getterFor("URL"),C=Math.floor,R=Math.pow,S=/[A-Za-z]/,K=/[\d+-.A-Za-z]/,f=/\d/,Y=/^(0x|0X)/,v=/^[0-7]+$/,N=/^\d+$/,J=/^[\dA-Fa-f]+$/,H=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,L=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,U=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,x=/[\u0009\u000A\u000D]/g,T=function(t,l){var i,n,e;if("["==l.charAt(0)){if("]"!=l.charAt(l.length-1))return"Invalid host";if(!(i=B(l.slice(1,-1))))return"Invalid host";t.host=i}else if(j(t)){if(l=h(l),H.test(l))return"Invalid host";if(null===(i=k(l)))return"Invalid host";t.host=i}else{if(L.test(l))return"Invalid host";for(i="",n=b(l),e=0;e<n.length;e++)i+=P(n[e],z);t.host=i}},k=function(t){var l,i,n,e,c,o,d,a=t.split(".");if(a.length&&""==a[a.length-1]&&a.pop(),(l=a.length)>4)return t;for(i=[],n=0;n<l;n++){if(""==(e=a[n]))return t;if(c=10,e.length>1&&"0"==e.charAt(0)&&(c=Y.test(e)?16:8,e=e.slice(8==c?1:2)),""===e)o=0;else{if(!(10==c?N:8==c?v:J).test(e))return t;o=parseInt(e,c)}i.push(o)}for(n=0;n<l;n++)if(o=i[n],n==l-1){if(o>=R(256,5-l))return null}else if(o>255)return null;for(d=i.pop(),n=0;n<i.length;n++)d+=i[n]*R(256,3-n);return d},B=function(t){var l,i,n,e,c,o,d,a=[0,0,0,0,0,0,0,0],r=0,u=null,Z=0,s=function(){return t.charAt(Z)};if(":"==s()){if(":"!=t.charAt(1))return;Z+=2,u=++r}for(;s();){if(8==r)return;if(":"!=s()){for(l=i=0;i<4&&J.test(s());)l=16*l+parseInt(s(),16),Z++,i++;if("."==s()){if(0==i)return;if(Z-=i,r>6)return;for(n=0;s();){if(e=null,n>0){if(!("."==s()&&n<4))return;Z++}if(!f.test(s()))return;for(;f.test(s());){if(c=parseInt(s(),10),null===e)e=c;else{if(0==e)return;e=10*e+c}if(e>255)return;Z++}a[r]=256*a[r]+e,2!=++n&&4!=n||r++}if(4!=n)return;break}if(":"==s()){if(Z++,!s())return}else if(s())return;a[r++]=l}else{if(null!==u)return;Z++,u=++r}}if(null!==u)for(o=r-u,r=7;0!=r&&o>0;)d=a[r],a[r--]=a[u+o-1],a[u+--o]=d;else if(8!=r)return;return a},F=function(t){var l,i,n,e;if("number"==typeof t){for(l=[],i=0;i<4;i++)l.unshift(t%256),t=C(t/256);return l.join(".")}if("object"==typeof t){for(l="",n=function(t){for(var l=null,i=1,n=null,e=0,c=0;c<8;c++)0!==t[c]?(e>i&&(l=n,i=e),n=null,e=0):(null===n&&(n=c),++e);return e>i&&(l=n,i=e),l}(t),i=0;i<8;i++)e&&0===t[i]||(e&&(e=!1),n===i?(l+=i?":":"::",e=!0):(l+=t[i].toString(16),i<7&&(l+=":")));return"["+l+"]"}return t},z={},A=s({},z,{" ":1,'"':1,"<":1,">":1,"`":1}),w=s({},A,{"#":1,"?":1,"{":1,"}":1}),Q=s({},w,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),P=function(t,l){var i=m(t,0);return i>32&&i<127&&!Z(l,t)?t:encodeURIComponent(t)},M={ftp:21,file:null,http:80,https:443,ws:80,wss:443},j=function(t){return Z(M,t.scheme)},E=function(t){return""!=t.username||""!=t.password},D=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},O=function(t,l){var i;return 2==t.length&&S.test(t.charAt(0))&&(":"==(i=t.charAt(1))||!l&&"|"==i)},q=function(t){var l;return t.length>1&&O(t.slice(0,2))&&(2==t.length||"/"===(l=t.charAt(2))||"\\"===l||"?"===l||"#"===l)},_=function(t){var l=t.path,i=l.length;!i||"file"==t.scheme&&1==i&&O(l[0],!0)||l.pop()},$=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},lt={},it={},nt={},et={},ct={},ot={},dt={},at={},rt={},ut={},Zt={},st={},bt={},mt={},ht={},It={},pt={},Gt={},yt={},Xt={},gt=function(t,l,i,e){var c,o,d,a,r,u=i||tt,s=0,m="",h=!1,I=!1,p=!1;for(i||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,l=l.replace(U,"")),l=l.replace(x,""),c=b(l);s<=c.length;){switch(o=c[s],u){case tt:if(!o||!S.test(o)){if(i)return"Invalid scheme";u=it;continue}m+=o.toLowerCase(),u=lt;break;case lt:if(o&&(K.test(o)||"+"==o||"-"==o||"."==o))m+=o.toLowerCase();else{if(":"!=o){if(i)return"Invalid scheme";m="",u=it,s=0;continue}if(i&&(j(t)!=Z(M,m)||"file"==m&&(E(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=m,i)return void(j(t)&&M[t.scheme]==t.port&&(t.port=null));m="","file"==t.scheme?u=bt:j(t)&&e&&e.scheme==t.scheme?u=nt:j(t)?u=dt:"/"==c[s+1]?(u=et,s++):(t.cannotBeABaseURL=!0,t.path.push(""),u=Gt)}break;case it:if(!e||e.cannotBeABaseURL&&"#"!=o)return"Invalid scheme";if(e.cannotBeABaseURL&&"#"==o){t.scheme=e.scheme,t.path=e.path.slice(),t.query=e.query,t.fragment="",t.cannotBeABaseURL=!0,u=Xt;break}u="file"==e.scheme?bt:ct;continue;case nt:if("/"!=o||"/"!=c[s+1]){u=ct;continue}u=at,s++;break;case et:if("/"==o){u=rt;break}u=pt;continue;case ct:if(t.scheme=e.scheme,o==n)t.username=e.username,t.password=e.password,t.host=e.host,t.port=e.port,t.path=e.path.slice(),t.query=e.query;else if("/"==o||"\\"==o&&j(t))u=ot;else if("?"==o)t.username=e.username,t.password=e.password,t.host=e.host,t.port=e.port,t.path=e.path.slice(),t.query="",u=yt;else{if("#"!=o){t.username=e.username,t.password=e.password,t.host=e.host,t.port=e.port,t.path=e.path.slice(),t.path.pop(),u=pt;continue}t.username=e.username,t.password=e.password,t.host=e.host,t.port=e.port,t.path=e.path.slice(),t.query=e.query,t.fragment="",u=Xt}break;case ot:if(!j(t)||"/"!=o&&"\\"!=o){if("/"!=o){t.username=e.username,t.password=e.password,t.host=e.host,t.port=e.port,u=pt;continue}u=rt}else u=at;break;case dt:if(u=at,"/"!=o||"/"!=m.charAt(s+1))continue;s++;break;case at:if("/"!=o&&"\\"!=o){u=rt;continue}break;case rt:if("@"==o){h&&(m="%40"+m),h=!0,d=b(m);for(var G=0;G<d.length;G++){var y=d[G];if(":"!=y||p){var X=P(y,Q);p?t.password+=X:t.username+=X}else p=!0}m=""}else if(o==n||"/"==o||"?"==o||"#"==o||"\\"==o&&j(t)){if(h&&""==m)return"Invalid authority";s-=b(m).length+1,m="",u=ut}else m+=o;break;case ut:case Zt:if(i&&"file"==t.scheme){u=ht;continue}if(":"!=o||I){if(o==n||"/"==o||"?"==o||"#"==o||"\\"==o&&j(t)){if(j(t)&&""==m)return"Invalid host";if(i&&""==m&&(E(t)||null!==t.port))return;if(a=T(t,m))return a;if(m="",u=It,i)return;continue}"["==o?I=!0:"]"==o&&(I=!1),m+=o}else{if(""==m)return"Invalid host";if(a=T(t,m))return a;if(m="",u=st,i==Zt)return}break;case st:if(!f.test(o)){if(o==n||"/"==o||"?"==o||"#"==o||"\\"==o&&j(t)||i){if(""!=m){var g=parseInt(m,10);if(g>65535)return"Invalid port";t.port=j(t)&&g===M[t.scheme]?null:g,m=""}if(i)return;u=It;continue}return"Invalid port"}m+=o;break;case bt:if(t.scheme="file","/"==o||"\\"==o)u=mt;else{if(!e||"file"!=e.scheme){u=pt;continue}if(o==n)t.host=e.host,t.path=e.path.slice(),t.query=e.query;else if("?"==o)t.host=e.host,t.path=e.path.slice(),t.query="",u=yt;else{if("#"!=o){q(c.slice(s).join(""))||(t.host=e.host,t.path=e.path.slice(),_(t)),u=pt;continue}t.host=e.host,t.path=e.path.slice(),t.query=e.query,t.fragment="",u=Xt}}break;case mt:if("/"==o||"\\"==o){u=ht;break}e&&"file"==e.scheme&&!q(c.slice(s).join(""))&&(O(e.path[0],!0)?t.path.push(e.path[0]):t.host=e.host),u=pt;continue;case ht:if(o==n||"/"==o||"\\"==o||"?"==o||"#"==o){if(!i&&O(m))u=pt;else if(""==m){if(t.host="",i)return;u=It}else{if(a=T(t,m))return a;if("localhost"==t.host&&(t.host=""),i)return;m="",u=It}continue}m+=o;break;case It:if(j(t)){if(u=pt,"/"!=o&&"\\"!=o)continue}else if(i||"?"!=o)if(i||"#"!=o){if(o!=n&&(u=pt,"/"!=o))continue}else t.fragment="",u=Xt;else t.query="",u=yt;break;case pt:if(o==n||"/"==o||"\\"==o&&j(t)||!i&&("?"==o||"#"==o)){if(".."===(r=(r=m).toLowerCase())||"%2e."===r||".%2e"===r||"%2e%2e"===r?(_(t),"/"==o||"\\"==o&&j(t)||t.path.push("")):$(m)?"/"==o||"\\"==o&&j(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&O(m)&&(t.host&&(t.host=""),m=m.charAt(0)+":"),t.path.push(m)),m="","file"==t.scheme&&(o==n||"?"==o||"#"==o))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==o?(t.query="",u=yt):"#"==o&&(t.fragment="",u=Xt)}else m+=P(o,w);break;case Gt:"?"==o?(t.query="",u=yt):"#"==o?(t.fragment="",u=Xt):o!=n&&(t.path[0]+=P(o,z));break;case yt:i||"#"!=o?o!=n&&("'"==o&&j(t)?t.query+="%27":t.query+="#"==o?"%23":P(o,z)):(t.fragment="",u=Xt);break;case Xt:o!=n&&(t.fragment+=P(o,A))}s++}},Vt=function(t){var l,i,n=u(this,Vt,"URL"),e=arguments.length>1?arguments[1]:void 0,o=String(t),d=V(n,{type:"URL"});if(void 0!==e)if(e instanceof Vt)l=W(e);else if(i=gt(l={},String(e)))throw TypeError(i);if(i=gt(d,o,null,l))throw TypeError(i);var a=d.searchParams=new X,r=g(a);r.updateSearchParams(d.query),r.updateURL=function(){d.query=String(a)||null},c||(n.href=Ct.call(n),n.origin=Rt.call(n),n.protocol=St.call(n),n.username=Kt.call(n),n.password=ft.call(n),n.host=Yt.call(n),n.hostname=vt.call(n),n.port=Nt.call(n),n.pathname=Jt.call(n),n.search=Ht.call(n),n.searchParams=Lt.call(n),n.hash=Ut.call(n))},Wt=Vt.prototype,Ct=function(){var t=W(this),l=t.scheme,i=t.username,n=t.password,e=t.host,c=t.port,o=t.path,d=t.query,a=t.fragment,r=l+":";return null!==e?(r+="//",E(t)&&(r+=i+(n?":"+n:"")+"@"),r+=F(e),null!==c&&(r+=":"+c)):"file"==l&&(r+="//"),r+=t.cannotBeABaseURL?o[0]:o.length?"/"+o.join("/"):"",null!==d&&(r+="?"+d),null!==a&&(r+="#"+a),r},Rt=function(){var t=W(this),l=t.scheme,i=t.port;if("blob"==l)try{return new URL(l.path[0]).origin}catch(t){return"null"}return"file"!=l&&j(t)?l+"://"+F(t.host)+(null!==i?":"+i:""):"null"},St=function(){return W(this).scheme+":"},Kt=function(){return W(this).username},ft=function(){return W(this).password},Yt=function(){var t=W(this),l=t.host,i=t.port;return null===l?"":null===i?F(l):F(l)+":"+i},vt=function(){var t=W(this).host;return null===t?"":F(t)},Nt=function(){var t=W(this).port;return null===t?"":String(t)},Jt=function(){var t=W(this),l=t.path;return t.cannotBeABaseURL?l[0]:l.length?"/"+l.join("/"):""},Ht=function(){var t=W(this).query;return t?"?"+t:""},Lt=function(){return W(this).searchParams},Ut=function(){var t=W(this).fragment;return t?"#"+t:""},xt=function(t,l){return{get:t,set:l,configurable:!0,enumerable:!0}};if(c&&a(Wt,{href:xt(Ct,(function(t){var l=W(this),i=String(t),n=gt(l,i);if(n)throw TypeError(n);g(l.searchParams).updateSearchParams(l.query)})),origin:xt(Rt),protocol:xt(St,(function(t){var l=W(this);gt(l,String(t)+":",tt)})),username:xt(Kt,(function(t){var l=W(this),i=b(String(t));if(!D(l)){l.username="";for(var n=0;n<i.length;n++)l.username+=P(i[n],Q)}})),password:xt(ft,(function(t){var l=W(this),i=b(String(t));if(!D(l)){l.password="";for(var n=0;n<i.length;n++)l.password+=P(i[n],Q)}})),host:xt(Yt,(function(t){var l=W(this);l.cannotBeABaseURL||gt(l,String(t),ut)})),hostname:xt(vt,(function(t){var l=W(this);l.cannotBeABaseURL||gt(l,String(t),Zt)})),port:xt(Nt,(function(t){var l=W(this);D(l)||(""==(t=String(t))?l.port=null:gt(l,t,st))})),pathname:xt(Jt,(function(t){var l=W(this);l.cannotBeABaseURL||(l.path=[],gt(l,t+"",It))})),search:xt(Ht,(function(t){var l=W(this);""==(t=String(t))?l.query=null:("?"==t.charAt(0)&&(t=t.slice(1)),l.query="",gt(l,t,yt)),g(l.searchParams).updateSearchParams(l.query)})),searchParams:xt(Lt),hash:xt(Ut,(function(t){var l=W(this);""!=(t=String(t))?("#"==t.charAt(0)&&(t=t.slice(1)),l.fragment="",gt(l,t,Xt)):l.fragment=null}))}),r(Wt,"toJSON",(function(){return Ct.call(this)}),{enumerable:!0}),r(Wt,"toString",(function(){return Ct.call(this)}),{enumerable:!0}),y){var Tt=y.createObjectURL,kt=y.revokeObjectURL;Tt&&r(Vt,"createObjectURL",(function(t){return Tt.apply(y,arguments)})),kt&&r(Vt,"revokeObjectURL",(function(t){return kt.apply(y,arguments)}))}I(Vt,"URL"),e({global:!0,forced:!o,sham:!c},{URL:Vt})},function(t,l,i){"use strict";var n=/[^\0-\u007E]/,e=/[.\u3002\uFF0E\uFF61]/g,c="Overflow: input needs wider integers to process",o=Math.floor,d=String.fromCharCode,a=function(t){return t+22+75*(t<26)},r=function(t,l,i){var n=0;for(t=i?o(t/700):t>>1,t+=o(t/l);t>455;n+=36)t=o(t/35);return o(n+36*t/(t+38))},u=function(t){var l,i,n=[],e=(t=function(t){for(var l=[],i=0,n=t.length;i<n;){var e=t.charCodeAt(i++);if(e>=55296&&e<=56319&&i<n){var c=t.charCodeAt(i++);56320==(64512&c)?l.push(((1023&e)<<10)+(1023&c)+65536):(l.push(e),i--)}else l.push(e)}return l}(t)).length,u=128,Z=0,s=72;for(l=0;l<t.length;l++)(i=t[l])<128&&n.push(d(i));var b=n.length,m=b;for(b&&n.push("-");m<e;){var h=2147483647;for(l=0;l<t.length;l++)(i=t[l])>=u&&i<h&&(h=i);var I=m+1;if(h-u>o((2147483647-Z)/I))throw RangeError(c);for(Z+=(h-u)*I,u=h,l=0;l<t.length;l++){if((i=t[l])<u&&++Z>2147483647)throw RangeError(c);if(i==u){for(var p=Z,G=36;;G+=36){var y=G<=s?1:G>=s+26?26:G-s;if(p<y)break;var X=p-y,g=36-y;n.push(d(a(y+X%g))),p=o(X/g)}n.push(d(a(p))),s=r(Z,I,m==b),Z=0,++m}}++Z,++u}return n.join("")};t.exports=function(t){var l,i,c=[],o=t.toLowerCase().replace(e,".").split(".");for(l=0;l<o.length;l++)i=o[l],c.push(n.test(i)?"xn--"+u(i):i);return c.join(".")}},function(t,l,i){"use strict";i(0)({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}})},function(t,l,i){var n=function(t){"use strict";var l=Object.prototype,i=l.hasOwnProperty,n="function"==typeof Symbol?Symbol:{},e=n.iterator||"@@iterator",c=n.asyncIterator||"@@asyncIterator",o=n.toStringTag||"@@toStringTag";function d(t,l,i){return Object.defineProperty(t,l,{value:i,enumerable:!0,configurable:!0,writable:!0}),t[l]}try{d({},"")}catch(t){d=function(t,l,i){return t[l]=i}}function a(t,l,i,n){var e=l&&l.prototype instanceof Z?l:Z,c=Object.create(e.prototype),o=new W(n||[]);return c._invoke=function(t,l,i){var n="suspendedStart";return function(e,c){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===e)throw c;return R()}for(i.method=e,i.arg=c;;){var o=i.delegate;if(o){var d=X(o,i);if(d){if(d===u)continue;return d}}if("next"===i.method)i.sent=i._sent=i.arg;else if("throw"===i.method){if("suspendedStart"===n)throw n="completed",i.arg;i.dispatchException(i.arg)}else"return"===i.method&&i.abrupt("return",i.arg);n="executing";var a=r(t,l,i);if("normal"===a.type){if(n=i.done?"completed":"suspendedYield",a.arg===u)continue;return{value:a.arg,done:i.done}}"throw"===a.type&&(n="completed",i.method="throw",i.arg=a.arg)}}}(t,i,o),c}function r(t,l,i){try{return{type:"normal",arg:t.call(l,i)}}catch(t){return{type:"throw",arg:t}}}t.wrap=a;var u={};function Z(){}function s(){}function b(){}var m={};m[e]=function(){return this};var h=Object.getPrototypeOf,I=h&&h(h(C([])));I&&I!==l&&i.call(I,e)&&(m=I);var p=b.prototype=Z.prototype=Object.create(m);function G(t){["next","throw","return"].forEach((function(l){d(t,l,(function(t){return this._invoke(l,t)}))}))}function y(t,l){var n;this._invoke=function(e,c){function o(){return new l((function(n,o){!function n(e,c,o,d){var a=r(t[e],t,c);if("throw"!==a.type){var u=a.arg,Z=u.value;return Z&&"object"==typeof Z&&i.call(Z,"__await")?l.resolve(Z.__await).then((function(t){n("next",t,o,d)}),(function(t){n("throw",t,o,d)})):l.resolve(Z).then((function(t){u.value=t,o(u)}),(function(t){return n("throw",t,o,d)}))}d(a.arg)}(e,c,n,o)}))}return n=n?n.then(o,o):o()}}function X(t,l){var i=t.iterator[l.method];if(void 0===i){if(l.delegate=null,"throw"===l.method){if(t.iterator.return&&(l.method="return",l.arg=void 0,X(t,l),"throw"===l.method))return u;l.method="throw",l.arg=new TypeError("The iterator does not provide a 'throw' method")}return u}var n=r(i,t.iterator,l.arg);if("throw"===n.type)return l.method="throw",l.arg=n.arg,l.delegate=null,u;var e=n.arg;return e?e.done?(l[t.resultName]=e.value,l.next=t.nextLoc,"return"!==l.method&&(l.method="next",l.arg=void 0),l.delegate=null,u):e:(l.method="throw",l.arg=new TypeError("iterator result is not an object"),l.delegate=null,u)}function g(t){var l={tryLoc:t[0]};1 in t&&(l.catchLoc=t[1]),2 in t&&(l.finallyLoc=t[2],l.afterLoc=t[3]),this.tryEntries.push(l)}function V(t){var l=t.completion||{};l.type="normal",delete l.arg,t.completion=l}function W(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(g,this),this.reset(!0)}function C(t){if(t){var l=t[e];if(l)return l.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,c=function l(){for(;++n<t.length;)if(i.call(t,n))return l.value=t[n],l.done=!1,l;return l.value=void 0,l.done=!0,l};return c.next=c}}return{next:R}}function R(){return{value:void 0,done:!0}}return s.prototype=p.constructor=b,b.constructor=s,s.displayName=d(b,o,"GeneratorFunction"),t.isGeneratorFunction=function(t){var l="function"==typeof t&&t.constructor;return!!l&&(l===s||"GeneratorFunction"===(l.displayName||l.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,b):(t.__proto__=b,d(t,o,"GeneratorFunction")),t.prototype=Object.create(p),t},t.awrap=function(t){return{__await:t}},G(y.prototype),y.prototype[c]=function(){return this},t.AsyncIterator=y,t.async=function(l,i,n,e,c){void 0===c&&(c=Promise);var o=new y(a(l,i,n,e),c);return t.isGeneratorFunction(i)?o:o.next().then((function(t){return t.done?t.value:o.next()}))},G(p),d(p,o,"Generator"),p[e]=function(){return this},p.toString=function(){return"[object Generator]"},t.keys=function(t){var l=[];for(var i in t)l.push(i);return l.reverse(),function i(){for(;l.length;){var n=l.pop();if(n in t)return i.value=n,i.done=!1,i}return i.done=!0,i}},t.values=C,W.prototype={constructor:W,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(V),!t)for(var l in this)"t"===l.charAt(0)&&i.call(this,l)&&!isNaN(+l.slice(1))&&(this[l]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var l=this;function n(i,n){return o.type="throw",o.arg=t,l.next=i,n&&(l.method="next",l.arg=void 0),!!n}for(var e=this.tryEntries.length-1;e>=0;--e){var c=this.tryEntries[e],o=c.completion;if("root"===c.tryLoc)return n("end");if(c.tryLoc<=this.prev){var d=i.call(c,"catchLoc"),a=i.call(c,"finallyLoc");if(d&&a){if(this.prev<c.catchLoc)return n(c.catchLoc,!0);if(this.prev<c.finallyLoc)return n(c.finallyLoc)}else if(d){if(this.prev<c.catchLoc)return n(c.catchLoc,!0)}else{if(!a)throw new Error("try statement without catch or finally");if(this.prev<c.finallyLoc)return n(c.finallyLoc)}}}},abrupt:function(t,l){for(var n=this.tryEntries.length-1;n>=0;--n){var e=this.tryEntries[n];if(e.tryLoc<=this.prev&&i.call(e,"finallyLoc")&&this.prev<e.finallyLoc){var c=e;break}}c&&("break"===t||"continue"===t)&&c.tryLoc<=l&&l<=c.finallyLoc&&(c=null);var o=c?c.completion:{};return o.type=t,o.arg=l,c?(this.method="next",this.next=c.finallyLoc,u):this.complete(o)},complete:function(t,l){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&l&&(this.next=l),u},finish:function(t){for(var l=this.tryEntries.length-1;l>=0;--l){var i=this.tryEntries[l];if(i.finallyLoc===t)return this.complete(i.completion,i.afterLoc),V(i),u}},catch:function(t){for(var l=this.tryEntries.length-1;l>=0;--l){var i=this.tryEntries[l];if(i.tryLoc===t){var n=i.completion;if("throw"===n.type){var e=n.arg;V(i)}return e}}throw new Error("illegal catch attempt")},delegateYield:function(t,l,i){return this.delegate={iterator:C(t),resultName:l,nextLoc:i},"next"===this.method&&(this.arg=void 0),u}},t}(t.exports);try{regeneratorRuntime=n}catch(t){Function("r","regeneratorRuntime = r")(n)}}])}));
|