@brandbrigade/ott-bb-player 1.0.42 → 1.0.44
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/LICENCE +29 -0
- package/README.md +266 -215
- package/dist/OTTPlayer.js +272 -0
- package/package.json +21 -7
- package/src/Ads.js +82 -0
- package/src/Augmentor.js +1288 -0
- package/src/Composer3DBase.js +754 -0
- package/src/Composer3DForMainThread.js +131 -0
- package/src/Composer3DForWorker.js +80 -0
- package/src/Composer3DWorker.js +60 -0
- package/src/MetaDataDecoder.js +143 -0
- package/src/MetaDataFetcher.js +88 -0
- package/src/OTTPlayer.js +254 -0
- package/src/Socket.js +44 -0
- package/src/composer_worker.js +30 -0
- package/src/configs/OTT_Dev_Config_Debug.json +8 -0
- package/src/configs/OTT_Dev_Config_Debug_14fps.json +8 -0
- package/src/configs/OTT_Dev_Config_Debug_29fps.json +8 -0
- package/src/configs/OTT_Dev_Config_Debug_General.json +7 -0
- package/src/enums/RenderingMode.js +5 -0
- package/src/enums/SyncMethod.js +5 -0
- package/src/index.js +239 -0
- package/src/meta_worker.js +144 -0
- package/src/shaders/v1.js +87 -0
- package/src/shaders/v1Old.js +174 -0
- package/src/shaders/v2.js +193 -0
- package/src/test-pages/mp4/index.html +63 -0
- package/src/test-pages/mp4/index.js +23 -0
- package/src/test-pages/mp4/style.css +16 -0
- package/src/utils/FPSFetter.js +94 -0
- package/src/utils/MedianCalculator.js +27 -0
- package/src/utils/index.js +5 -0
- package/src/utils/isPowerOf2.js +3 -0
- package/src/utils/platform.js +191 -0
- package/src/utils/timeCodeUtils.js +274 -0
- package/js/OTTPlayer.js +0 -1
- package/mediakind.html +0 -273
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
(function(O,D){typeof exports=="object"&&typeof module<"u"?module.exports=D():typeof define=="function"&&define.amd?define(D):(O=typeof globalThis<"u"?globalThis:O||self,O.OTTPlayer=D())})(this,function(){"use strict";var wy=Object.defineProperty;var By=(O,D,be)=>D in O?wy(O,D,{enumerable:!0,configurable:!0,writable:!0,value:be}):O[D]=be;var g=(O,D,be)=>By(O,typeof D!="symbol"?D+"":D,be);const O=`
|
|
2
|
+
precision highp float;
|
|
3
|
+
|
|
4
|
+
uniform vec2 u_resolution;
|
|
5
|
+
attribute vec2 a_position;
|
|
6
|
+
attribute vec2 a_uv;
|
|
7
|
+
|
|
8
|
+
varying vec2 v_uv;
|
|
9
|
+
|
|
10
|
+
void main() {
|
|
11
|
+
v_uv = a_uv;
|
|
12
|
+
|
|
13
|
+
// convert the rectangle from pixels to 0.0 to 1.0
|
|
14
|
+
vec2 clipSpace = 2.0 * (a_position / u_resolution) - 1.0;
|
|
15
|
+
|
|
16
|
+
gl_Position = vec4(clipSpace, 0.0, 1.0);
|
|
17
|
+
}
|
|
18
|
+
`,D=`
|
|
19
|
+
precision highp float;
|
|
20
|
+
|
|
21
|
+
uniform vec2 u_resolution;
|
|
22
|
+
uniform sampler2D ad0;
|
|
23
|
+
uniform sampler2D ad1;
|
|
24
|
+
uniform sampler2D u_alphaMask;
|
|
25
|
+
|
|
26
|
+
varying vec2 v_uv;
|
|
27
|
+
|
|
28
|
+
uniform int hasLogo0;
|
|
29
|
+
uniform mat3 u_matrix0;
|
|
30
|
+
|
|
31
|
+
uniform int hasLogo1;
|
|
32
|
+
uniform mat3 u_matrix1;//the reverse homography
|
|
33
|
+
|
|
34
|
+
const float Directions = 16.0; // BLUR DIRECTIONS (Default 16.0 - More is better but slower)
|
|
35
|
+
const float QualityAd = 3.0; // BLUR QUALITY (Default 3.0 - More is better but slower)
|
|
36
|
+
const float QualityAlpha = 5.0; // BLUR QUALITY (Default 3.0 - More is better but slower)
|
|
37
|
+
const float BlurRadiusAd = 10.0;
|
|
38
|
+
const float BlurRadiusAlpha = 10.0;
|
|
39
|
+
const float Pi = 6.28318530718; // Pi*2
|
|
40
|
+
|
|
41
|
+
vec4 BlurAd(sampler2D adTexture, vec2 adTexCoord) {
|
|
42
|
+
vec2 Radius = BlurRadiusAd/u_resolution.xy;
|
|
43
|
+
vec4 res = texture2D(adTexture, adTexCoord);
|
|
44
|
+
|
|
45
|
+
for( float d=0.0; d<Pi; d+=Pi/Directions) {
|
|
46
|
+
for(float i=1.0/QualityAd; i<=1.0; i+=1.0/QualityAd) {
|
|
47
|
+
res += texture2D(adTexture, adTexCoord+vec2(cos(d),sin(d))*Radius*i);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
res /= QualityAd * Directions - 5.0;
|
|
52
|
+
|
|
53
|
+
return res;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void BlendWithLogo(sampler2D ad, mat3 matrix) {
|
|
57
|
+
vec2 curCoord = gl_FragCoord.xy;
|
|
58
|
+
curCoord.y = u_resolution[1] - curCoord.y;
|
|
59
|
+
|
|
60
|
+
vec2 texCoord;
|
|
61
|
+
texCoord.x = (matrix[0][0]*curCoord.x + matrix[0][1]*curCoord.y + matrix[0][2]) / (matrix[2][0]*curCoord.x + matrix[2][1]*curCoord.y + 1.0);
|
|
62
|
+
texCoord.y = (matrix[1][0]*curCoord.x + matrix[1][1]*curCoord.y + matrix[1][2]) / (matrix[2][0]*curCoord.x + matrix[2][1]*curCoord.y + 1.0);
|
|
63
|
+
texCoord /= u_resolution;
|
|
64
|
+
|
|
65
|
+
vec4 maskAlpha = texture2D(u_alphaMask, v_uv);
|
|
66
|
+
vec4 adColor = BlurAd(ad, texCoord);
|
|
67
|
+
float adAlpha = texture2D(ad0, texCoord).a;
|
|
68
|
+
|
|
69
|
+
float finalAlpha = maskAlpha.r;
|
|
70
|
+
if (finalAlpha < 0.3)
|
|
71
|
+
finalAlpha = 0.0;
|
|
72
|
+
finalAlpha *= adColor.a;
|
|
73
|
+
gl_FragColor = vec4(adColor.rgb, finalAlpha);
|
|
74
|
+
gl_FragColor.rgb *= finalAlpha;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
void main() {
|
|
78
|
+
if (hasLogo0 == 1) {
|
|
79
|
+
BlendWithLogo(ad0, u_matrix0);
|
|
80
|
+
}
|
|
81
|
+
if (hasLogo1 == 1) {
|
|
82
|
+
BlendWithLogo(ad1, u_matrix1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
`,be=`
|
|
86
|
+
|
|
87
|
+
//High precision mode
|
|
88
|
+
precision highp float;
|
|
89
|
+
|
|
90
|
+
// an attribute is an input (in) to a vertex shader.
|
|
91
|
+
// It will receive vertex data from the buffer
|
|
92
|
+
attribute vec2 a_position;
|
|
93
|
+
attribute vec2 a_uv;
|
|
94
|
+
uniform vec2 u_resolution;
|
|
95
|
+
varying vec2 v_texCoord;
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
// Main vertex shader
|
|
99
|
+
void main() {
|
|
100
|
+
// convert the rectangle from pixels to 0.0 to 1.0
|
|
101
|
+
vec2 zeroToOne = a_position / u_resolution;
|
|
102
|
+
|
|
103
|
+
// convert from 0->1 to 0->2
|
|
104
|
+
vec2 zeroToTwo = zeroToOne * 2.0;
|
|
105
|
+
|
|
106
|
+
// convert from 0->2 to -1->+1 (clipspace)
|
|
107
|
+
vec2 clipSpace = zeroToTwo - 1.0;
|
|
108
|
+
|
|
109
|
+
gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
|
|
110
|
+
|
|
111
|
+
// pass the texCoord to the fragment shader
|
|
112
|
+
// The GPU will interpolate this value between points.
|
|
113
|
+
v_texCoord = a_uv;
|
|
114
|
+
}
|
|
115
|
+
`,Sl=`
|
|
116
|
+
|
|
117
|
+
//High precision mode
|
|
118
|
+
precision highp float;
|
|
119
|
+
|
|
120
|
+
//The textures
|
|
121
|
+
uniform sampler2D u_image;//video frame's texture2D
|
|
122
|
+
uniform sampler2D ad0;//the ad texture2D
|
|
123
|
+
uniform sampler2D ad1;//the ad texture2D
|
|
124
|
+
uniform sampler2D ad2;//the ad texture2D
|
|
125
|
+
uniform sampler2D ad3;//the ad texture2D
|
|
126
|
+
|
|
127
|
+
uniform vec2 u_resolution2;//resolution of the canvas
|
|
128
|
+
|
|
129
|
+
//v_texCoord from the vertex shader
|
|
130
|
+
varying vec2 v_texCoord;
|
|
131
|
+
|
|
132
|
+
//Logos' staff
|
|
133
|
+
uniform int hasLogo0;//has logo ?
|
|
134
|
+
uniform int adForLogo0;
|
|
135
|
+
uniform sampler2D alpha0;//the alpha's mate
|
|
136
|
+
uniform mat3 u_matrix0;//the reverse homography
|
|
137
|
+
uniform vec2 u_alpha0TopLeft;//the alpha mate's top-left
|
|
138
|
+
uniform vec2 u_alpha0Size;//the alpha mate's size
|
|
139
|
+
|
|
140
|
+
uniform int hasLogo1;//has logo ?
|
|
141
|
+
uniform int adForLogo1;
|
|
142
|
+
uniform sampler2D alpha1;//the alpha's mate
|
|
143
|
+
uniform mat3 u_matrix1;//the reverse homography
|
|
144
|
+
uniform vec2 u_alpha1TopLeft;//the alpha mate's top-left
|
|
145
|
+
uniform vec2 u_alpha1Size;//the alpha mate's size
|
|
146
|
+
|
|
147
|
+
uniform int hasLogo2;//has logo ?
|
|
148
|
+
uniform int adForLogo2;
|
|
149
|
+
uniform sampler2D alpha2;//the alpha's mate
|
|
150
|
+
uniform mat3 u_matrix2;//the reverse homography
|
|
151
|
+
uniform vec2 u_alpha2TopLeft;//the alpha mate's top-left
|
|
152
|
+
uniform vec2 u_alpha2Size;//the alpha mate's size
|
|
153
|
+
|
|
154
|
+
uniform int hasLogo3;//has logo ?
|
|
155
|
+
uniform int adForLogo3;
|
|
156
|
+
uniform sampler2D alpha3;//the alpha's mate
|
|
157
|
+
uniform mat3 u_matrix3;//the reverse homography
|
|
158
|
+
uniform vec2 u_alpha3TopLeft;//the alpha mate's top-left
|
|
159
|
+
uniform vec2 u_alpha3Size;//the alpha mate's size
|
|
160
|
+
|
|
161
|
+
const float Directions = 16.0; // BLUR DIRECTIONS (Default 16.0 - More is better but slower)
|
|
162
|
+
const float QualityAd = 3.0; // BLUR QUALITY (Default 3.0 - More is better but slower)
|
|
163
|
+
const float QualityAlpha = 5.0; // BLUR QUALITY (Default 3.0 - More is better but slower)
|
|
164
|
+
const float BlurRadiusAd = 10.0;
|
|
165
|
+
const float BlurRadiusAlpha = 10.0;
|
|
166
|
+
const float Pi = 6.28318530718; // Pi*2
|
|
167
|
+
|
|
168
|
+
float BlurAlpha(sampler2D alphaTexture, vec2 alphaCoord) {
|
|
169
|
+
float res = texture2D(alphaTexture, alphaCoord).a;
|
|
170
|
+
vec2 Radius = BlurRadiusAlpha/u_resolution2.xy;
|
|
171
|
+
|
|
172
|
+
for( float d=0.0; d<Pi; d+=Pi/Directions) {
|
|
173
|
+
for(float i=1.0/QualityAlpha; i<=1.0; i+=1.0/QualityAlpha) {
|
|
174
|
+
res += texture2D(alphaTexture, alphaCoord+vec2(cos(d),sin(d))*Radius*i).a;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
res /= QualityAlpha * Directions - 15.0;
|
|
179
|
+
|
|
180
|
+
return res;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
vec4 BlurAd(sampler2D adTexture, vec2 adTexCoord) {
|
|
184
|
+
vec2 Radius = BlurRadiusAd/u_resolution2.xy;
|
|
185
|
+
vec4 res = texture2D(adTexture, adTexCoord);
|
|
186
|
+
|
|
187
|
+
for( float d=0.0; d<Pi; d+=Pi/Directions) {
|
|
188
|
+
for(float i=1.0/QualityAd; i<=1.0; i+=1.0/QualityAd) {
|
|
189
|
+
res += texture2D(adTexture, adTexCoord+vec2(cos(d),sin(d))*Radius*i);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
res /= QualityAd * Directions - 5.0;
|
|
194
|
+
|
|
195
|
+
return res;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
bool BlendWithLogo(int adUnit, sampler2D alphaTexture, mat3 matrix, vec2 curCoord, vec2 alphaTopLeft, vec2 alphaSize, vec4 videoImagePix) {
|
|
199
|
+
|
|
200
|
+
vec2 texCoord;
|
|
201
|
+
texCoord.x = (matrix[0][0]*curCoord.x + matrix[0][1]*curCoord.y + matrix[0][2]) / (matrix[2][0]*curCoord.x + matrix[2][1]*curCoord.y + 1.0);
|
|
202
|
+
texCoord.y = (matrix[1][0]*curCoord.x + matrix[1][1]*curCoord.y + matrix[1][2]) / (matrix[2][0]*curCoord.x + matrix[2][1]*curCoord.y + 1.0);
|
|
203
|
+
texCoord /= u_resolution2;
|
|
204
|
+
|
|
205
|
+
//if we're in the bounding rect of the logo
|
|
206
|
+
if (texCoord.x >= 0.0 && texCoord.y >= 0.0 && texCoord.x <= 1.0 && texCoord.y <= 1.0) {
|
|
207
|
+
float maskAlpha = 1.0;
|
|
208
|
+
vec2 alphaCoord = (curCoord - alphaTopLeft)/alphaSize;//get the coordinate on the alpha mate
|
|
209
|
+
if (alphaCoord.x >= 0.0 && alphaCoord.y >= 0.0 && alphaCoord.x <= 1.0 && alphaCoord.y <= 1.0) {
|
|
210
|
+
// maskAlpha = BlurAlpha(alphaTexture, alphaCoord);
|
|
211
|
+
maskAlpha = texture2D(alphaTexture, alphaCoord).a;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
vec4 adColor =
|
|
215
|
+
adUnit == 0 ? BlurAd(ad0, texCoord) :
|
|
216
|
+
adUnit == 1 ? BlurAd(ad1, texCoord) :
|
|
217
|
+
adUnit == 2 ? BlurAd(ad2, texCoord) :
|
|
218
|
+
BlurAd(ad3, texCoord); //get the logo's texel
|
|
219
|
+
|
|
220
|
+
float adAlpha =
|
|
221
|
+
adUnit == 0 ? texture2D(ad0, texCoord).a :
|
|
222
|
+
adUnit == 1 ? texture2D(ad1, texCoord).a :
|
|
223
|
+
adUnit == 2 ? texture2D(ad2, texCoord).a :
|
|
224
|
+
texture2D(ad3, texCoord).a; //get the logo's texel
|
|
225
|
+
|
|
226
|
+
float finalAlpha = maskAlpha * adColor.a;
|
|
227
|
+
gl_FragColor = vec4(adColor.rgb, finalAlpha);
|
|
228
|
+
gl_FragColor.rgb *= finalAlpha;
|
|
229
|
+
return true;
|
|
230
|
+
} else {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
void main()
|
|
235
|
+
{
|
|
236
|
+
//calculate cur-coord (with pixels units)
|
|
237
|
+
vec2 curCoord = gl_FragCoord.xy;
|
|
238
|
+
curCoord.y = u_resolution2[1] - curCoord.y;
|
|
239
|
+
|
|
240
|
+
vec4 videoImagePix = texture2D(u_image, v_texCoord);
|
|
241
|
+
|
|
242
|
+
if (hasLogo0 == 1) {
|
|
243
|
+
BlendWithLogo(adForLogo0,alpha0, u_matrix0, curCoord,u_alpha0TopLeft, u_alpha0Size, videoImagePix);
|
|
244
|
+
return;
|
|
245
|
+
} else if (hasLogo1 == 1) {
|
|
246
|
+
BlendWithLogo(adForLogo1, alpha1, u_matrix1, curCoord,u_alpha1TopLeft, u_alpha1Size, videoImagePix);
|
|
247
|
+
return;
|
|
248
|
+
} else if (hasLogo2 == 1) {
|
|
249
|
+
BlendWithLogo(adForLogo2, alpha2, u_matrix2, curCoord,u_alpha2TopLeft, u_alpha2Size, videoImagePix);
|
|
250
|
+
return;
|
|
251
|
+
} else if (hasLogo3 == 1) {
|
|
252
|
+
BlendWithLogo(adForLogo3, alpha3, u_matrix3, curCoord,u_alpha3TopLeft, u_alpha3Size, videoImagePix);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
`;/* @license twgl.js 5.5.4 Copyright (c) 2015, Gregg Tavares All Rights Reserved.
|
|
257
|
+
Available via the MIT license.
|
|
258
|
+
see: http://github.com/greggman/twgl.js for details */const vi={};{const e=vi;e[5120]=Int8Array,e[5121]=Uint8Array,e[5122]=Int16Array,e[5123]=Uint16Array,e[5124]=Int32Array,e[5125]=Uint32Array,e[5126]=Float32Array,e[32819]=Uint16Array,e[32820]=Uint16Array,e[33635]=Uint16Array,e[5131]=Uint16Array,e[33640]=Uint32Array,e[35899]=Uint32Array,e[35902]=Uint32Array,e[36269]=Uint32Array,e[34042]=Uint32Array}function gi(...e){console.error(...e)}const Fi=function(){const e={},t={};function n(l){const a=l.constructor.name;if(!e[a]){for(const c in l)if(typeof l[c]=="number"){const i=t[l[c]];t[l[c]]=i?`${i} | ${c}`:c}e[a]=!0}}return function(a,c){return n(a),t[c]||(typeof c=="number"?`0x${c.toString(16)}`:c)}}(),Ci=6406,Il=6407,zl=6408,xi=6409,Si=6410,Ii=6402,zi=34041,Mi=33319,Ji=33320,Ni=6403,ki=36244,Ki=36248,Ti=36249,Hi={};{const e=Hi;e[Ci]={numColorComponents:1},e[xi]={numColorComponents:1},e[Si]={numColorComponents:2},e[Il]={numColorComponents:3},e[zl]={numColorComponents:4},e[Ni]={numColorComponents:1},e[ki]={numColorComponents:1},e[Mi]={numColorComponents:2},e[Ji]={numColorComponents:2},e[Il]={numColorComponents:3},e[Ki]={numColorComponents:3},e[zl]={numColorComponents:4},e[Ti]={numColorComponents:4},e[Ii]={numColorComponents:1},e[zi]={numColorComponents:2}}const yn=gi;function Ui(e){return typeof document<"u"&&document.getElementById?document.getElementById(e):null}const wi=35713,Bi=35714,Qi=35632,Pi=35633,Ei=35981,Di=/ERROR:\s*\d+:(\d+)/gi;function ji(e,t="",n=0){const l=[...t.matchAll(Di)],a=new Map(l.map((c,i)=>{const r=parseInt(c[1]),d=l[i+1],s=d?d.index:t.length,o=t.substring(c.index,s);return[r-1,o]}));return e.split(`
|
|
259
|
+
`).map((c,i)=>{const r=a.get(i);return`${i+1+n}: ${c}${r?`
|
|
260
|
+
|
|
261
|
+
^^^ ${r}`:""}`}).join(`
|
|
262
|
+
`)}const Ml=/^[ \t]*\n/;function Jl(e){let t=0;return Ml.test(e)&&(t=1,e=e.replace(Ml,"")),{lineOffset:t,shaderSource:e}}function Oi(e,t,n,l){if(l=l||yn,!e.getShaderParameter(n,wi)){const c=e.getShaderInfoLog(n),{lineOffset:i,shaderSource:r}=Jl(e.getShaderSource(n)),d=`${ji(r,c,i)}
|
|
263
|
+
Error compiling ${Fi(e,t)}: ${c}`;return l(d),d}return""}function Nl(e,t,n){let l,a,c;if(typeof t=="function"&&(n=t,t=void 0),typeof e=="function")n=e,e=void 0;else if(e&&!Array.isArray(e)){const s=e;n=s.errorCallback,e=s.attribLocations,l=s.transformFeedbackVaryings,a=s.transformFeedbackMode,c=s.callback}const i=n||yn,r=[],d={errorCallback(s,...o){r.push(s),i(s,...o)},transformFeedbackVaryings:l,transformFeedbackMode:a,callback:c,errors:r};{let s={};Array.isArray(e)?e.forEach(function(o,u){s[o]=t?t[u]:u}):s=e||{},d.attribLocations=s}return d}const Ai=["VERTEX_SHADER","FRAGMENT_SHADER"];function _i(e,t){if(t.indexOf("frag")>=0)return Qi;if(t.indexOf("vert")>=0)return Pi}function $i(e,t,n){const l=e.getAttachedShaders(t);for(const a of l)n.has(a)&&e.deleteShader(a);e.deleteProgram(t)}const qi=(e=0)=>new Promise(t=>setTimeout(t,e));function er(e,t,n){const l=e.createProgram(),{attribLocations:a,transformFeedbackVaryings:c,transformFeedbackMode:i}=Nl(n);for(let r=0;r<t.length;++r){let d=t[r];if(typeof d=="string"){const s=Ui(d),o=s?s.text:d;let u=e[Ai[r]];s&&s.type&&(u=_i(e,s.type)||u),d=e.createShader(u),e.shaderSource(d,Jl(o).shaderSource),e.compileShader(d),e.attachShader(l,d)}}Object.entries(a).forEach(([r,d])=>e.bindAttribLocation(l,d,r));{let r=c;r&&(r.attribs&&(r=r.attribs),Array.isArray(r)||(r=Object.keys(r)),e.transformFeedbackVaryings(l,r,i||Ei))}return e.linkProgram(l),l}function tr(e,t,n,l,a){const c=Nl(n,l,a),i=new Set(t),r=er(e,t,c);function d(s,o){const u=lr(s,o,c.errorCallback);return u&&$i(s,o,i),u}if(c.callback){nr(e,r).then(()=>{const s=d(e,r);c.callback(s,s?void 0:r)});return}return d(e,r)?void 0:r}async function nr(e,t){const n=e.getExtension("KHR_parallel_shader_compile"),l=n?(c,i)=>c.getProgramParameter(i,n.COMPLETION_STATUS_KHR):()=>!0;let a=0;do await qi(a),a=1e3/60;while(!l(e,t))}function lr(e,t,n){if(n=n||yn,!e.getProgramParameter(t,Bi)){const a=e.getProgramInfoLog(t);n(`Error in program linking: ${a}`);const i=e.getAttachedShaders(t).map(r=>Oi(e,e.getShaderParameter(r,e.SHADER_TYPE),r,n));return`${a}
|
|
264
|
+
${i.filter(r=>r).join(`
|
|
265
|
+
`)}`}}function kl(e,t,n,l,a){return tr(e,t,n,l,a)}const ze=(()=>{const e=()=>{const m=navigator.userAgent;return/windows/i.test(m)?"Windows":/android/i.test(m)?"Android":/iphone|ipad|ipod/i.test(m)?"iOS":/mac/i.test(m)?"Mac":/ipad/i.test(m)?"iPad":"Something else"},t=()=>e()=="Mac",n=()=>e()=="iPad",l=()=>e()=="iOS",a=()=>{let m=e();return m=="iOS"||m=="Mac"||m=="iPad"},c=()=>e()=="Windows",i=()=>e()=="Android",r=()=>{let m=e();return m=="Windows"?"a Windows PC":m=="Android"?"an Android phone":m=="iOS"?"an iPhone":m=="Mac"?"a Mac":m=="iPad"?"an iPad":"an Unknown device"},d=()=>({options:[],header:[navigator.platform,navigator.userAgent,navigator.appVersion,navigator.vendor,window.opera],dataos:[{name:"Windows Phone",value:"Windows Phone",version:"OS"},{name:"Windows",value:"Win",version:"NT"},{name:"iPhone",value:"iPhone",version:"OS"},{name:"iPad",value:"iPad",version:"OS"},{name:"Kindle",value:"Silk",version:"Silk"},{name:"Android",value:"Android",version:"Android"},{name:"PlayBook",value:"PlayBook",version:"OS"},{name:"BlackBerry",value:"BlackBerry",version:"/"},{name:"Macintosh",value:"Mac",version:"OS X"},{name:"Linux",value:"Linux",version:"rv"},{name:"Palm",value:"Palm",version:"PalmOS"}],databrowser:[{name:"Chrome",value:"Chrome",version:"Chrome"},{name:"Firefox",value:"Firefox",version:"Firefox"},{name:"Safari",value:"Safari",version:"Version"},{name:"Internet Explorer",value:"MSIE",version:"MSIE"},{name:"Opera",value:"Opera",version:"Opera"},{name:"BlackBerry",value:"CLDC",version:"CLDC"},{name:"Mozilla",value:"Mozilla",version:"Mozilla"}],init:function(){let h=this.header.join(" "),R=this.matchItem(h,this.dataos),y=this.matchItem(h,this.databrowser);return{os:R,browser:y}},matchItem:function(h,R){let y=0,V=0,L,G,W,X,b;for(y=0;y<R.length;y+=1)if(L=new RegExp(R[y].value,"i"),W=L.test(h),W){if(G=new RegExp(R[y].version+"[- /:;]([\\d._]+)","i"),X=h.match(G),b="",X&&X[1]&&(X=X[1]),X)for(X=X.split(/[._]+/),V=0;V<X.length;V+=1)V===0?b+=X[V]+".":b+=X[V];else b="0";return{name:R[y].name,version:parseFloat(b)}}return{name:"unknown",version:0}}}).init().os.name,s=()=>{const m=navigator.userAgent;return m.indexOf("Chrome")>-1&&m.indexOf("Edge")===-1?"Chrome":m.indexOf("Safari")>-1&&m.indexOf("Chrome")===-1?"Safari":m.indexOf("Firefox")>-1?"Firefox":m.indexOf("MSIE")>-1||m.indexOf("Trident")>-1?"Internet Explorer":m.indexOf("Edge")>-1?"Edge":"Unknown"};return{getDeviceName:d,getCurrentPlatform:e,isApple:a,isWindows:c,isAndroid:i,isMac:t,isiPhone:l,isiPad:n,getDeviceDescription:r,getBrowserName:s,isSafariMac:()=>t()&&s()=="Safari",isChromeMac:()=>t()&&s()=="Chrome",isChromeWin:()=>c()&&s()=="Chrome"}})(),Vt=e=>e.toString().padStart(2,"0"),Xn=":",M=(e,t,n)=>{let l="";return Array.isArray(e)?(l=[Vt(e[0]),Vt(e[1]),Vt(e[2]),Vt(e[3])].join(":"),n==!0?e[4]==1&&(t===void 0||t)?l+=".2":l+=".1":e[4]==1&&(t===void 0||t)&&(l+=".1")):(l=("0"+e.h).slice(-2)+Xn+("0"+e.m).slice(-2)+Xn+("0"+e.s).slice(-2)+Xn+("0"+e.f).slice(-2),t&&(l+="."+(e.field?"1":"2"))),l},Kl=e=>{let t=e.split(":");if(t.length!=4)return console.error("timeCodeStr2TimeCodeArray: Failed to parse "+e),[0,0,0,0,0];let n=[parseInt(t[0]),parseInt(t[1]),parseInt(t[2])];if(t[3].indexOf(".")>=0){let l=t[3].split(".");n.push(parseInt(l[0])),n.push(parseInt(l[1]))}else n.push(parseInt(t[3])),n.push(0);return n},Vn=(e,t,n)=>{let l=60,a=0;Math.floor(t)==60?(l=60,a=0):Math.floor(t)==59?(l=60,a=4):Math.floor(t)==30?(l=30,a=0):Math.floor(t)==29&&(l=30,a=2);let c=0,r=Math.floor(t*60*10)*6,d=e[0],s=e[1],o=e[2],u=e[3],Z=e[4];return c+=d*r,c+=s*(l*60),c+=o*l,n?c+=u*2+Z:c+=u,c-=a*s,c+=a*Math.floor(s/10),c},J=(e,t,n)=>{let l=60,a=0;Math.floor(t)==60?(l=60,a=0):Math.floor(t)==59?(l=60,a=4):Math.floor(t)==30?(l=30,a=0):Math.floor(t)==29&&(l=30,a=2);let c=Math.floor(t*60),i=Math.floor(t*60*10),r=i*6,d=e,s=Math.floor(d/r);d-=s*r;let o=Math.floor(d/i);d-=o*i,d>=l*60&&(d+=a*(Math.floor((d-l*60)/c)+1));let u=Math.floor(d/(l*60));d-=u*(l*60);let Z=Math.floor(d/l);d-=Z*l;let m=d;u+=o*10;let p=0;return n&&(p=m%2,m=Math.floor(m/2)),[s,u,Z,m,p]},Wt=(e,t,n)=>{let l=n>30,a=Vn(e,n,l);return a+=t,J(a,n,l)},Tl=e=>({h:e[0],m:e[1],s:e[2],f:e[3],field:e[4]}),Hl=(e,t)=>(Ul(e,t),M(tcFromMessage,!0)),Ul=(e,t)=>{let n="";ze.isApple()?n=e:n=e.toISOString();let a=n.split("T")[1].split(":"),c=parseInt(a[0]),i=parseInt(a[1]),r=a[2].split("."),d=parseInt(r[0]),s=parseInt(r[1].substring(0,3));if(t>59){let o=Math.round((s/1e3+d+i*60+c*60*60)*t);return J(o,t,!0)}else{let o=Math.round((s/1e3+d+i*60+c*60*60)*t);return J(o,t,!1)}},wl=e=>(e&e-1)==0;class ar{constructor(t){g(this,"adTexture",null);g(this,"place2AdTexture",{});g(this,"place2ad",{});g(this,"ad2place",{});g(this,"currentAds2BoundingRect",[]);g(this,"lastTimeReportedIncomingTC",0);g(this,"autoAddIndex",null);g(this,"digitImg",{});g(this,"sourceFPS",6e4/1001);g(this,"metadataArr",[]);g(this,"metadataMap",{});g(this,"videoStarted",!1);g(this,"advertisementMap",{});g(this,"ad2Url",{});g(this,"videoCopier",null);g(this,"autoAddIndex",null);if(t.renderTimecodes)for(let n=0;n<10;++n){let l=n+".1",a=n+".2";this.digitImg[l]=this.createDigitImg(l),this.digitImg[a]=this.createDigitImg(a)}this.options=Object.assign({adLoopTime:5e3,isAdLoop:!1},t||{})}onUserClickOnCanvas(t){console.log("fix me")}texUnitForGenericAd(){return 0}texUnitForAdInPlace(t){let n=Object.keys(this.place2ad);for(let l=0;l<n.length;++l)if(t==n[l])return l+1;return 0}texUnitForPlaceHolder(t){let n=Object.keys(this.place2ad);for(let l=0;l<n.length;++l){let a=n[l];if(t.name.indexOf(a)>=0)return l}return 0}adNameForPlaceHolder(t){let n=Object.keys(this.place2ad);for(let l=0;l<n.length;++l){let a=n[l];if(t.name.indexOf(a)>=0&&this.place2AdTexture&&this.place2AdTexture[a]&&this.place2AdTexture[a].name)return this.place2AdTexture[a].name}return this.lastAdName}texUnitBaseForAlpha(){return 1+Object.keys(this.place2ad).length}initGL(){const t=this.options.maskMP4?[O,D]:[be,Sl];this.program=kl(this.ctx,t),this.ctx.useProgram(this.program),this.counter=0,this.cleanGL()}cleanGL(){this.ctx.clearColor(0,0,0,0),this.ctx.clear(this.ctx.COLOR_BUFFER_BIT)}generateTexture(t,n,l,a,c,i,r,d=!1){r?this.ctx.pixelStorei(this.ctx.UNPACK_ALIGNMENT,1):this.ctx.pixelStorei(this.ctx.UNPACK_ALIGNMENT,4),this.ctx.pixelStorei(this.ctx.UNPACK_FLIP_Y_WEBGL,d);const s=this.ctx.createTexture();this.ctx.activeTexture(this.ctx.TEXTURE0+n),this.ctx.bindTexture(this.ctx.TEXTURE_2D,s);try{c&&i?this.ctx.texImage2D(this.ctx.TEXTURE_2D,0,a??this.ctx.RGBA,c,i,0,a??this.ctx.RGBA,this.ctx.UNSIGNED_BYTE,t):this.ctx.texImage2D(this.ctx.TEXTURE_2D,0,a??this.ctx.RGBA,this.ctx.RGBA,this.ctx.UNSIGNED_BYTE,t)}catch(u){return console.error(u),null}if(this.webGLVersion==1){let u=c||t.width,Z=i||t.height;u&&wl(u)&&Z&&wl(Z)?this.ctx.generateMipmap(this.ctx.TEXTURE_2D):(this.ctx.texParameteri(this.ctx.TEXTURE_2D,this.ctx.TEXTURE_WRAP_S,this.ctx.CLAMP_TO_EDGE),this.ctx.texParameteri(this.ctx.TEXTURE_2D,this.ctx.TEXTURE_WRAP_T,this.ctx.CLAMP_TO_EDGE),this.ctx.texParameteri(this.ctx.TEXTURE_2D,this.ctx.TEXTURE_MIN_FILTER,this.ctx.LINEAR))}else this.ctx.texParameteri(this.ctx.TEXTURE_2D,this.ctx.TEXTURE_WRAP_S,this.ctx.CLAMP_TO_EDGE),this.ctx.texParameteri(this.ctx.TEXTURE_2D,this.ctx.TEXTURE_WRAP_T,this.ctx.CLAMP_TO_EDGE),this.ctx.texParameteri(this.ctx.TEXTURE_2D,this.ctx.TEXTURE_MIN_FILTER,this.ctx.LINEAR),this.ctx.texParameteri(this.ctx.TEXTURE_2D,this.ctx.TEXTURE_MAG_FILTER,this.ctx.LINEAR);let o=this.ctx.getUniformLocation(this.program,l);return o&&this.ctx.uniform1i(o,n),s}_nextAdvertisement(){this.autoAddIndex=setTimeout(()=>{const t=Object.keys(this.advertisementMap);t.length&&(this.selectAd(t[Math.floor(Math.random()*t.length)]),this._nextAdvertisement())},this.options.adLoopTime)}makeSureAdPerPlace(){if(this.place2ad){let t=Object.keys(this.place2ad);for(let n=0;n<t.length;++n){let l=t[n];!this.place2AdTexture[l]&&this.place2ad[l].length>0&&(console.log("MakeSureAdPerPlace: Set default image "+this.place2ad[l][0]+" for place "+l),this.selectAd("#"+this.place2ad[l][0]))}}}selectAd(t){console.log("composer::SelectAd: selected ad is "+t);let n=this.advertisementMap[t];if(!n)console.error("SelectAd: Failed to find image '"+t+"'");else if(this.ad2place&&this.ad2place[t]){let l=this.ad2place[t];console.log("composer::SelectAd: The selected ad should be in place "+l);let a=this.texUnitForAdInPlace(l),c="ad"+(a-1);this.place2AdTexture[l]&&this.ctx.deleteTexture(this.place2AdTexture[l].tex),this.place2AdTexture[l]={tex:this.generateTexture(n,a,c),texUnitId:a,texName:c,name:t}}else this.adTexture&&this.ctx.deleteTexture(this.adTexture),this.adTexture=this.generateTexture(n,this.texUnitForGenericAd(),"ad0"),this.lastAd=n,this.lastAdName=t}onMetaData(t){this.metadataMap[t.timecode]=t,this.metadataArr.push(t.timecode)}renderFrame(){let t=this.ctx.getAttribLocation(this.program,"a_position"),n=this.ctx.getAttribLocation(this.program,"a_uv"),l=this.ctx.getUniformLocation(this.program,"u_resolution");this.ctx.uniform2f(l,this.ctx.canvas.width,this.ctx.canvas.height),l=this.ctx.getUniformLocation(this.program,"u_resolution2"),this.ctx.uniform2f(l,this.ctx.canvas.width,this.ctx.canvas.height);let a=this.ctx.createBuffer();this.ctx.enableVertexAttribArray(t),this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER,a);let c=2,i=this.ctx.FLOAT,r=!1,d=0,s=0;this.ctx.vertexAttribPointer(t,c,i,r,d,s);let o=this.ctx.createBuffer();this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER,o),this.ctx.bufferData(this.ctx.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]),this.ctx.STATIC_DRAW),this.ctx.enableVertexAttribArray(n),c=2,i=this.ctx.FLOAT,r=!1,d=0,s=0,this.ctx.vertexAttribPointer(n,c,i,r,d,s),this.ctx.viewport(0,0,this.ctx.canvas.width,this.ctx.canvas.height),this.ctx.clearColor(0,0,0,0),this.ctx.clear(this.ctx.COLOR_BUFFER_BIT|this.ctx.DEPTH_BUFFER_BIT),this.ctx.bindBuffer(this.ctx.ARRAY_BUFFER,a),this.setRectangle(0,0,this.canvas.width,this.canvas.height);let u=this.ctx.TRIANGLES;this.ctx.drawArrays(u,s,6)}setRectangle(t,n,l,a){let c=t,i=t+l,r=n,d=n+a;this.ctx.bufferData(this.ctx.ARRAY_BUFFER,new Float32Array([c,r,i,r,c,d,c,d,i,r,i,d]),this.ctx.STATIC_DRAW)}renderAugmentation(t){this.canvas.width=1280,this.canvas.height=720,this.options.maskMP4?this.renderAugmentationMP4(t):this.renderAugmentationOld(t)}renderAugmentationMP4(t){let n=Kl(t),l=Wt(n,1,this.sourceFPS),a=Wt(n,2,this.sourceFPS),c=M(l),i=M(a);this.videoStarted=!0,performance.now();let r=null,d=[];if(this.metadataMap[t]){r=this.metadataMap[t],this.metadataMap[c]&&d.push({nextVideo:this.metadataMap[c],nextTimeCode:c}),this.metadataMap[i]&&d.push({nextVideo:this.metadataMap[i],nextTimeCode:i});const Z=this.metadataArr.indexOf(t);Z>-5&&this.metadataArr.splice(0,Z-4).forEach(m=>{delete this.metadataMap[m]})}else this.counter++,this.counter>60&&(this.counter=0,console.error("Missing meta data at time code "+t));let s=[],o=0;if(this.currentAds2BoundingRect=[],r!=null&&r.alphaMask){let Z=this.texUnitBaseForAlpha();const m=this.generateTexture(r.alphaMask,Z,"u_alphaMask",this.ctx.RGBA,null,null,!1,!0);s.push(m);for(const p in r.placeholders){const h=r.placeholders[p];let R="hasLogo"+o,y=this.ctx.getUniformLocation(this.program,R);this.ctx.uniform1i(y,1);let V="adForLogo"+o,L=this.ctx.getUniformLocation(this.program,V);this.ctx.uniform1i(L,this.texUnitForPlaceHolder(h));let G="u_matrix"+o,W=this.ctx.getUniformLocation(this.program,G);this.ctx.uniformMatrix3fv(W,!1,h.tranform);let X={l:-1,t:-1,r:-1,b:-1};for(let b of h.corners)(b.x<X.l||X.l==-1)&&(X.l=b.x),(b.x>X.r||X.r==-1)&&(X.r=b.x),(b.y<X.t||X.t==-1)&&(X.t=b.y),(b.y>X.b||X.b==-1)&&(X.b=b.y);X.l/=r.canvasSize.width,X.r/=r.canvasSize.width,X.t/=r.canvasSize.height,X.b/=r.canvasSize.height,this.currentAds2BoundingRect.push({name:this.adNameForPlaceHolder(h),rect:X}),o++}}const u=4;for(;o<u;++o){let Z="hasLogo"+o,m=this.ctx.getUniformLocation(this.program,Z);this.ctx.uniform1i(m,0)}this.renderTimecodes(t),this.renderFrame();for(const Z of s)this.ctx.deleteTexture(Z)}renderAugmentationOld(t){let n=Kl(t),l=Wt(n,1,this.sourceFPS),a=Wt(n,2,this.sourceFPS),c=M(l),i=M(a);this.videoStarted=!0,performance.now();let r=null,d=[];if(this.metadataMap[t]){r=this.metadataMap[t],this.metadataMap[c]&&d.push({nextVideo:this.metadataMap[c],nextTimeCode:c}),this.metadataMap[i]&&d.push({nextVideo:this.metadataMap[i],nextTimeCode:i});const Z=this.metadataArr.indexOf(t);Z>-5&&this.metadataArr.splice(0,Z-4).forEach(m=>{delete this.metadataMap[m]})}else this.counter++,this.counter>60&&(this.counter=0,console.error("Missing meta data at time code "+t));let s=[],o=0;this.currentAds2BoundingRect=[];for(const Z in r==null?void 0:r.placeholders){const m=r.placeholders[Z];if(!m.alphaAsUint8Array)continue;let p="alpha"+o,h=this.texUnitBaseForAlpha()+o;if(m.alphaTex=this.generateTexture(m.alphaAsUint8Array,h,p,this.ctx.ALPHA,m.width,m.height,!0),m.alphaAsUint8Array=null,!m.alphaTex){console.error("Failed to create alpha texture");continue}s.push(m.alphaTex);let R="hasLogo"+o,y=this.ctx.getUniformLocation(this.program,R);this.ctx.uniform1i(y,1);let V="adForLogo"+o,L=this.ctx.getUniformLocation(this.program,V),G=!1;m.name.indexOf("blur")>=0?(this.ctx.uniform1i(L,99),G=!0):this.ctx.uniform1i(L,this.texUnitForPlaceHolder(m));let W="u_alpha"+o+"TopLeft",X=this.ctx.getUniformLocation(this.program,W);this.ctx.uniform2fv(X,[m.maskX,m.maskY]);let b="u_alpha"+o+"Size",f=this.ctx.getUniformLocation(this.program,b);this.ctx.uniform2fv(f,[m.width,m.height]);let v="u_matrix"+o,C=this.ctx.getUniformLocation(this.program,v);if(this.ctx.uniformMatrix3fv(C,!1,m.tranform),!G){let Y={l:-1,t:-1,r:-1,b:-1};for(let F of m.corners)(F.x<Y.l||Y.l==-1)&&(Y.l=F.x),(F.x>Y.r||Y.r==-1)&&(Y.r=F.x),(F.y<Y.t||Y.t==-1)&&(Y.t=F.y),(F.y>Y.b||Y.b==-1)&&(Y.b=F.y);Y.l/=r.canvasSize.width,Y.r/=r.canvasSize.width,Y.t/=r.canvasSize.height,Y.b/=r.canvasSize.height,this.currentAds2BoundingRect.push({name:this.adNameForPlaceHolder(m),rect:Y})}o++}const u=4;for(;o<u;++o){let Z="hasLogo"+o,m=this.ctx.getUniformLocation(this.program,Z);this.ctx.uniform1i(m,0)}this.renderTimecodes(t),this.renderFrame();for(const Z of s)this.ctx.deleteTexture(Z)}renderTimecodes(t){if(this.options.renderTimecodes){let n=t.split(":")[3],l=n.indexOf(".")>=0?2:1,c=parseInt(n.split(".")[0])%10+"."+l,i=this.texUnitBaseForAlpha()+5;console.log(c,this.digitImg,i,"digitTex");let r=this.generateTexture(this.digitImg[c],i,"digitTex");texturesForThisFrame.push(r);let s=this.ctx.getUniformLocation(this.program,"hasDigit");this.ctx.uniform1i(s,1);let u=this.ctx.getUniformLocation(this.program,"u_digitTopLeft");this.ctx.uniform2fv(u,[0,0]);let m=this.ctx.getUniformLocation(this.program,"u_digitSize");this.ctx.uniform2fv(m,[200,200])}else{let l=this.ctx.getUniformLocation(this.program,"hasDigit");this.ctx.uniform1i(l,0)}}toggleFullscreen(){(this.requestFullscreen||this.webkitRequestFullscreen).call(this).catch(t=>{console.error(t)})}}class cr extends ar{constructor(t,n){super(t),this.canvas=document.createElement("canvas"),this.ctx=this.canvas.getContext("webgl",{premultipliedAlpha:!1,antialias:!1});let l=n.getElementsByTagName("video")[0];this.canvas.style.top=0,this.canvas.style.left=0,this.canvas.style.width="100%",this.canvas.style.zIndex=1e5,this.canvas.width=n.clientWidth,this.canvas.height=n.clientHeight,this.canvas.style.position="absolute",this.canvas.width=1280,this.canvas.height=720;let a=l.nextSibling;a?n.insertBefore(this.canvas,a):n.appendChild(this.canvas),this.canvas.style["pointer-events"]="none",l.addEventListener("click",c=>{this.onUserClickOnCanvas(c)}),this.canvas.addEventListener("dblclick",this.ToggleFullscreen),this.initGL()}initGL(){const t=this.options.maskMP4?[O,D]:[be,Sl];this.program=kl(this.ctx,t),this.ctx.useProgram(this.program),this.counter=0,this.cleanGL()}createDigitImg(t){let n=document.createElement("canvas");n.width=50,n.height=50;let l=n.getContext("2d");l.fillStyle="black",l.fillRect(0,0,n.width,n.height),l.font="30px Arial",l.fillStyle="white",l.fillText(t,10,35);let a=n.toDataURL(),c=document.createElement("img");return c.src=a,c}cleanGL(){super.cleanGL()}getCanvas(){return this.canvas}addAdvertisement(t,n,l=null){if(t.indexOf(".json")>-1){fetch(n).then(async c=>{this.place2ad=await c.json(),this.ad2place={};let i=Object.keys(this.place2ad);for(let r=0;r<i.length;++r){let d=i[r];if(d=="urls"){this.ad2Url=this.place2ad[d],delete this.place2ad[d];continue}let s=this.place2ad[d];for(let o=0;o<s.length;++o){let u=s[o];this.ad2place["#"+u]=d}}Object.keys(this.place2ad).length>0&&(console.log("composer::AddAdvertisement: place-to-ads mapping: ",this.place2ad),console.log("composer::AddAdvertisement: ads-to-place mapping: ",this.ad2place),setTimeout(()=>{this.makeSureAdPerPlace()},3e3))}),l&&l();return}const a=new Image;return a.crossOrigin="Anonymous",a.onload=()=>{let c=Object.keys(this.advertisementMap).length===0;this.advertisementMap[t]=a,console.log("composer::AddAdvertisement",t),c&&(this.selectAd(t),this.options.isAdLoop&&(clearTimeout(this.autoAddIndex),this._nextAdvertisement())),l&&l()},a.onerror=()=>{alert(`( Security ) We cant reach ${n} .`)},a.src=n,a}}const Bl="dmFyIER0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgTnQ9KHYsXyxDKT0+XyBpbiB2P0R0KHYsXyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Q30pOnZbX109Qzt2YXIgcD0odixfLEMpPT5OdCh2LHR5cGVvZiBfIT0ic3ltYm9sIj9fKyIiOl8sQyk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IHY9YApwcmVjaXNpb24gaGlnaHAgZmxvYXQ7Cgp1bmlmb3JtIHZlYzIgdV9yZXNvbHV0aW9uOwphdHRyaWJ1dGUgdmVjMiBhX3Bvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiBhX3V2OwoKdmFyeWluZyB2ZWMyIHZfdXY7Cgp2b2lkIG1haW4oKSB7CiAgdl91diA9IGFfdXY7CgogIC8vIGNvbnZlcnQgdGhlIHJlY3RhbmdsZSBmcm9tIHBpeGVscyB0byAwLjAgdG8gMS4wCiAgdmVjMiBjbGlwU3BhY2UgPSAyLjAgKiAoYV9wb3NpdGlvbiAvIHVfcmVzb2x1dGlvbikgLSAxLjA7CgogIGdsX1Bvc2l0aW9uID0gdmVjNChjbGlwU3BhY2UsIDAuMCwgMS4wKTsKfQpgLF89YApwcmVjaXNpb24gaGlnaHAgZmxvYXQ7Cgp1bmlmb3JtIHZlYzIgdV9yZXNvbHV0aW9uOwp1bmlmb3JtIHNhbXBsZXIyRCBhZDA7CnVuaWZvcm0gc2FtcGxlcjJEIGFkMTsKdW5pZm9ybSBzYW1wbGVyMkQgdV9hbHBoYU1hc2s7Cgp2YXJ5aW5nIHZlYzIgdl91djsKCnVuaWZvcm0gaW50IGhhc0xvZ28wOwp1bmlmb3JtIG1hdDMgdV9tYXRyaXgwOwoKdW5pZm9ybSBpbnQgaGFzTG9nbzE7CnVuaWZvcm0gbWF0MyB1X21hdHJpeDE7Ly90aGUgcmV2ZXJzZSBob21vZ3JhcGh5Cgpjb25zdCBmbG9hdCBEaXJlY3Rpb25zID0gMTYuMDsgLy8gQkxVUiBESVJFQ1RJT05TIChEZWZhdWx0IDE2LjAgLSBNb3JlIGlzIGJldHRlciBidXQgc2xvd2VyKQpjb25zdCBmbG9hdCBRdWFsaXR5QWQgPSAzLjA7IC8vIEJMVVIgUVVBTElUWSAoRGVmYXVsdCAzLjAgLSBNb3JlIGlzIGJldHRlciBidXQgc2xvd2VyKQpjb25zdCBmbG9hdCBRdWFsaXR5QWxwaGEgPSA1LjA7IC8vIEJMVVIgUVVBTElUWSAoRGVmYXVsdCAzLjAgLSBNb3JlIGlzIGJldHRlciBidXQgc2xvd2VyKQpjb25zdCBmbG9hdCBCbHVyUmFkaXVzQWQgPSAxMC4wOwpjb25zdCBmbG9hdCBCbHVyUmFkaXVzQWxwaGEgPSAxMC4wOwpjb25zdCBmbG9hdCBQaSA9IDYuMjgzMTg1MzA3MTg7IC8vIFBpKjIKCnZlYzQgQmx1ckFkKHNhbXBsZXIyRCBhZFRleHR1cmUsIHZlYzIgYWRUZXhDb29yZCkgewogIHZlYzIgUmFkaXVzID0gQmx1clJhZGl1c0FkL3VfcmVzb2x1dGlvbi54eTsKICB2ZWM0IHJlcyA9IHRleHR1cmUyRChhZFRleHR1cmUsIGFkVGV4Q29vcmQpOwogICAKICBmb3IoIGZsb2F0IGQ9MC4wOyBkPFBpOyBkKz1QaS9EaXJlY3Rpb25zKSB7CgkJZm9yKGZsb2F0IGk9MS4wL1F1YWxpdHlBZDsgaTw9MS4wOyBpKz0xLjAvUXVhbGl0eUFkKSB7CgkJCXJlcyArPSB0ZXh0dXJlMkQoYWRUZXh0dXJlLCBhZFRleENvb3JkK3ZlYzIoY29zKGQpLHNpbihkKSkqUmFkaXVzKmkpOwogICAgfQogIH0KCiAgcmVzIC89IFF1YWxpdHlBZCAqIERpcmVjdGlvbnMgLSA1LjA7CgogIHJldHVybiByZXM7Cn0KCnZvaWQgQmxlbmRXaXRoTG9nbyhzYW1wbGVyMkQgYWQsIG1hdDMgbWF0cml4KSB7CiAgdmVjMiBjdXJDb29yZCA9IGdsX0ZyYWdDb29yZC54eTsKICBjdXJDb29yZC55ID0gdV9yZXNvbHV0aW9uWzFdIC0gY3VyQ29vcmQueTsKCiAgdmVjMiB0ZXhDb29yZDsKICB0ZXhDb29yZC54ID0gKG1hdHJpeFswXVswXSpjdXJDb29yZC54ICsgbWF0cml4WzBdWzFdKmN1ckNvb3JkLnkgKyBtYXRyaXhbMF1bMl0pIC8gKG1hdHJpeFsyXVswXSpjdXJDb29yZC54ICsgbWF0cml4WzJdWzFdKmN1ckNvb3JkLnkgKyAxLjApOwogIHRleENvb3JkLnkgPSAobWF0cml4WzFdWzBdKmN1ckNvb3JkLnggKyBtYXRyaXhbMV1bMV0qY3VyQ29vcmQueSArIG1hdHJpeFsxXVsyXSkgLyAobWF0cml4WzJdWzBdKmN1ckNvb3JkLnggKyBtYXRyaXhbMl1bMV0qY3VyQ29vcmQueSArIDEuMCk7CiAgdGV4Q29vcmQgLz0gdV9yZXNvbHV0aW9uOwoKICB2ZWM0IG1hc2tBbHBoYSA9IHRleHR1cmUyRCh1X2FscGhhTWFzaywgdl91dik7CiAgdmVjNCBhZENvbG9yID0gQmx1ckFkKGFkLCB0ZXhDb29yZCk7CiAgZmxvYXQgYWRBbHBoYSA9IHRleHR1cmUyRChhZDAsIHRleENvb3JkKS5hOwoKICBmbG9hdCBmaW5hbEFscGhhID0gbWFza0FscGhhLnI7CiAgaWYgKGZpbmFsQWxwaGEgPCAwLjMpIAogICAgZmluYWxBbHBoYSA9IDAuMDsKICBmaW5hbEFscGhhICo9IGFkQ29sb3IuYTsKICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGFkQ29sb3IucmdiLCBmaW5hbEFscGhhKTsKICBnbF9GcmFnQ29sb3IucmdiICo9IGZpbmFsQWxwaGE7Cn0KCnZvaWQgbWFpbigpIHsgCiAgaWYgKGhhc0xvZ28wID09IDEpIHsKICAgIEJsZW5kV2l0aExvZ28oYWQwLCB1X21hdHJpeDApOwogIH0gCiAgaWYgKGhhc0xvZ28xID09IDEpIHsKICAgIEJsZW5kV2l0aExvZ28oYWQxLCAgdV9tYXRyaXgxKTsKICB9IAp9CmAsQz1gCgovL0hpZ2ggcHJlY2lzaW9uIG1vZGUKcHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwoKLy8gYW4gYXR0cmlidXRlIGlzIGFuIGlucHV0IChpbikgdG8gYSB2ZXJ0ZXggc2hhZGVyLgovLyBJdCB3aWxsIHJlY2VpdmUgdmVydGV4IGRhdGEgZnJvbSB0aGUgYnVmZmVyCmF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIGFfdXY7CnVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247CnZhcnlpbmcgdmVjMiB2X3RleENvb3JkOwoKCi8vIE1haW4gdmVydGV4IHNoYWRlcgp2b2lkIG1haW4oKSB7CiAgLy8gY29udmVydCB0aGUgcmVjdGFuZ2xlIGZyb20gcGl4ZWxzIHRvIDAuMCB0byAxLjAKICAgdmVjMiB6ZXJvVG9PbmUgPSBhX3Bvc2l0aW9uIC8gdV9yZXNvbHV0aW9uOwoKICAgLy8gY29udmVydCBmcm9tIDAtPjEgdG8gMC0+MgogICB2ZWMyIHplcm9Ub1R3byA9IHplcm9Ub09uZSAqIDIuMDsKCiAgIC8vIGNvbnZlcnQgZnJvbSAwLT4yIHRvIC0xLT4rMSAoY2xpcHNwYWNlKQogICB2ZWMyIGNsaXBTcGFjZSA9IHplcm9Ub1R3byAtIDEuMDsKCiAgIGdsX1Bvc2l0aW9uID0gdmVjNChjbGlwU3BhY2UgKiB2ZWMyKDEsIC0xKSwgMCwgMSk7CgogICAvLyBwYXNzIHRoZSB0ZXhDb29yZCB0byB0aGUgZnJhZ21lbnQgc2hhZGVyCiAgIC8vIFRoZSBHUFUgd2lsbCBpbnRlcnBvbGF0ZSB0aGlzIHZhbHVlIGJldHdlZW4gcG9pbnRzLgogICB2X3RleENvb3JkID0gYV91djsKfQpgLHo9YAoKLy9IaWdoIHByZWNpc2lvbiBtb2RlCnByZWNpc2lvbiBoaWdocCBmbG9hdDsKCi8vVGhlIHRleHR1cmVzCnVuaWZvcm0gc2FtcGxlcjJEIHVfaW1hZ2U7Ly92aWRlbyBmcmFtZSdzIHRleHR1cmUyRAp1bmlmb3JtIHNhbXBsZXIyRCBhZDA7Ly90aGUgYWQgdGV4dHVyZTJECnVuaWZvcm0gc2FtcGxlcjJEIGFkMTsvL3RoZSBhZCB0ZXh0dXJlMkQKdW5pZm9ybSBzYW1wbGVyMkQgYWQyOy8vdGhlIGFkIHRleHR1cmUyRAp1bmlmb3JtIHNhbXBsZXIyRCBhZDM7Ly90aGUgYWQgdGV4dHVyZTJECgp1bmlmb3JtIHZlYzIgdV9yZXNvbHV0aW9uMjsvL3Jlc29sdXRpb24gb2YgdGhlIGNhbnZhcwoKLy92X3RleENvb3JkIGZyb20gdGhlIHZlcnRleCBzaGFkZXIKdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7CgovL0xvZ29zJyBzdGFmZgp1bmlmb3JtIGludCBoYXNMb2dvMDsvL2hhcyBsb2dvID8KdW5pZm9ybSBpbnQgYWRGb3JMb2dvMDsKdW5pZm9ybSBzYW1wbGVyMkQgYWxwaGEwOy8vdGhlIGFscGhhJ3MgbWF0ZQp1bmlmb3JtIG1hdDMgdV9tYXRyaXgwOy8vdGhlIHJldmVyc2UgaG9tb2dyYXBoeQp1bmlmb3JtIHZlYzIgdV9hbHBoYTBUb3BMZWZ0Oy8vdGhlIGFscGhhIG1hdGUncyB0b3AtbGVmdAp1bmlmb3JtIHZlYzIgdV9hbHBoYTBTaXplOy8vdGhlIGFscGhhIG1hdGUncyBzaXplCgp1bmlmb3JtIGludCBoYXNMb2dvMTsvL2hhcyBsb2dvID8KdW5pZm9ybSBpbnQgYWRGb3JMb2dvMTsKdW5pZm9ybSBzYW1wbGVyMkQgYWxwaGExOy8vdGhlIGFscGhhJ3MgbWF0ZQp1bmlmb3JtIG1hdDMgdV9tYXRyaXgxOy8vdGhlIHJldmVyc2UgaG9tb2dyYXBoeQp1bmlmb3JtIHZlYzIgdV9hbHBoYTFUb3BMZWZ0Oy8vdGhlIGFscGhhIG1hdGUncyB0b3AtbGVmdAp1bmlmb3JtIHZlYzIgdV9hbHBoYTFTaXplOy8vdGhlIGFscGhhIG1hdGUncyBzaXplCgp1bmlmb3JtIGludCBoYXNMb2dvMjsvL2hhcyBsb2dvID8KdW5pZm9ybSBpbnQgYWRGb3JMb2dvMjsKdW5pZm9ybSBzYW1wbGVyMkQgYWxwaGEyOy8vdGhlIGFscGhhJ3MgbWF0ZQp1bmlmb3JtIG1hdDMgdV9tYXRyaXgyOy8vdGhlIHJldmVyc2UgaG9tb2dyYXBoeQp1bmlmb3JtIHZlYzIgdV9hbHBoYTJUb3BMZWZ0Oy8vdGhlIGFscGhhIG1hdGUncyB0b3AtbGVmdAp1bmlmb3JtIHZlYzIgdV9hbHBoYTJTaXplOy8vdGhlIGFscGhhIG1hdGUncyBzaXplCgp1bmlmb3JtIGludCBoYXNMb2dvMzsvL2hhcyBsb2dvID8KdW5pZm9ybSBpbnQgYWRGb3JMb2dvMzsKdW5pZm9ybSBzYW1wbGVyMkQgYWxwaGEzOy8vdGhlIGFscGhhJ3MgbWF0ZQp1bmlmb3JtIG1hdDMgdV9tYXRyaXgzOy8vdGhlIHJldmVyc2UgaG9tb2dyYXBoeQp1bmlmb3JtIHZlYzIgdV9hbHBoYTNUb3BMZWZ0Oy8vdGhlIGFscGhhIG1hdGUncyB0b3AtbGVmdAp1bmlmb3JtIHZlYzIgdV9hbHBoYTNTaXplOy8vdGhlIGFscGhhIG1hdGUncyBzaXplCgpjb25zdCBmbG9hdCBEaXJlY3Rpb25zID0gMTYuMDsgLy8gQkxVUiBESVJFQ1RJT05TIChEZWZhdWx0IDE2LjAgLSBNb3JlIGlzIGJldHRlciBidXQgc2xvd2VyKQpjb25zdCBmbG9hdCBRdWFsaXR5QWQgPSAzLjA7IC8vIEJMVVIgUVVBTElUWSAoRGVmYXVsdCAzLjAgLSBNb3JlIGlzIGJldHRlciBidXQgc2xvd2VyKQpjb25zdCBmbG9hdCBRdWFsaXR5QWxwaGEgPSA1LjA7IC8vIEJMVVIgUVVBTElUWSAoRGVmYXVsdCAzLjAgLSBNb3JlIGlzIGJldHRlciBidXQgc2xvd2VyKQpjb25zdCBmbG9hdCBCbHVyUmFkaXVzQWQgPSAxMC4wOwpjb25zdCBmbG9hdCBCbHVyUmFkaXVzQWxwaGEgPSAxMC4wOwpjb25zdCBmbG9hdCBQaSA9IDYuMjgzMTg1MzA3MTg7IC8vIFBpKjIKCmZsb2F0IEJsdXJBbHBoYShzYW1wbGVyMkQgYWxwaGFUZXh0dXJlLCB2ZWMyIGFscGhhQ29vcmQpIHsKCWZsb2F0IHJlcyA9IHRleHR1cmUyRChhbHBoYVRleHR1cmUsIGFscGhhQ29vcmQpLmE7CiAgdmVjMiBSYWRpdXMgPSBCbHVyUmFkaXVzQWxwaGEvdV9yZXNvbHV0aW9uMi54eTsKICAgCiAgZm9yKCBmbG9hdCBkPTAuMDsgZDxQaTsgZCs9UGkvRGlyZWN0aW9ucykgewoJCWZvcihmbG9hdCBpPTEuMC9RdWFsaXR5QWxwaGE7IGk8PTEuMDsgaSs9MS4wL1F1YWxpdHlBbHBoYSkgewoJCQlyZXMgKz0gdGV4dHVyZTJEKGFscGhhVGV4dHVyZSwgYWxwaGFDb29yZCt2ZWMyKGNvcyhkKSxzaW4oZCkpKlJhZGl1cyppKS5hOwogICAgfQogIH0KCiAgcmVzIC89IFF1YWxpdHlBbHBoYSAqIERpcmVjdGlvbnMgLSAxNS4wOwoKICByZXR1cm4gcmVzOwp9Cgp2ZWM0IEJsdXJBZChzYW1wbGVyMkQgYWRUZXh0dXJlLCB2ZWMyIGFkVGV4Q29vcmQpIHsKICB2ZWMyIFJhZGl1cyA9IEJsdXJSYWRpdXNBZC91X3Jlc29sdXRpb24yLnh5OwogIHZlYzQgcmVzID0gdGV4dHVyZTJEKGFkVGV4dHVyZSwgYWRUZXhDb29yZCk7CiAgIAogIGZvciggZmxvYXQgZD0wLjA7IGQ8UGk7IGQrPVBpL0RpcmVjdGlvbnMpIHsKCQlmb3IoZmxvYXQgaT0xLjAvUXVhbGl0eUFkOyBpPD0xLjA7IGkrPTEuMC9RdWFsaXR5QWQpIHsKCQkJcmVzICs9IHRleHR1cmUyRChhZFRleHR1cmUsIGFkVGV4Q29vcmQrdmVjMihjb3MoZCksc2luKGQpKSpSYWRpdXMqaSk7CiAgICB9CiAgfQoKICByZXMgLz0gUXVhbGl0eUFkICogRGlyZWN0aW9ucyAtIDUuMDsKCiAgcmV0dXJuIHJlczsKfQoKYm9vbCBCbGVuZFdpdGhMb2dvKGludCBhZFVuaXQsIHNhbXBsZXIyRCBhbHBoYVRleHR1cmUsIG1hdDMgbWF0cml4LCB2ZWMyIGN1ckNvb3JkLCB2ZWMyIGFscGhhVG9wTGVmdCwgdmVjMiBhbHBoYVNpemUsIHZlYzQgdmlkZW9JbWFnZVBpeCkgewoKICB2ZWMyIHRleENvb3JkOwogIHRleENvb3JkLnggPSAobWF0cml4WzBdWzBdKmN1ckNvb3JkLnggKyBtYXRyaXhbMF1bMV0qY3VyQ29vcmQueSArIG1hdHJpeFswXVsyXSkgLyAobWF0cml4WzJdWzBdKmN1ckNvb3JkLnggKyBtYXRyaXhbMl1bMV0qY3VyQ29vcmQueSArIDEuMCk7CiAgdGV4Q29vcmQueSA9IChtYXRyaXhbMV1bMF0qY3VyQ29vcmQueCArIG1hdHJpeFsxXVsxXSpjdXJDb29yZC55ICsgbWF0cml4WzFdWzJdKSAvIChtYXRyaXhbMl1bMF0qY3VyQ29vcmQueCArIG1hdHJpeFsyXVsxXSpjdXJDb29yZC55ICsgMS4wKTsKICB0ZXhDb29yZCAvPSB1X3Jlc29sdXRpb24yOwoKICAvL2lmIHdlJ3JlIGluIHRoZSBib3VuZGluZyByZWN0IG9mIHRoZSBsb2dvCiAgaWYgKHRleENvb3JkLnggPj0gMC4wICYmIHRleENvb3JkLnkgPj0gMC4wICYmIHRleENvb3JkLnggPD0gMS4wICYmIHRleENvb3JkLnkgPD0gMS4wKSB7CgkJZmxvYXQgbWFza0FscGhhID0gMS4wOwogICAgdmVjMiBhbHBoYUNvb3JkID0gKGN1ckNvb3JkIC0gYWxwaGFUb3BMZWZ0KS9hbHBoYVNpemU7Ly9nZXQgdGhlIGNvb3JkaW5hdGUgb24gdGhlIGFscGhhIG1hdGUKICAgIGlmIChhbHBoYUNvb3JkLnggPj0gMC4wICYmIGFscGhhQ29vcmQueSA+PSAwLjAgJiYgYWxwaGFDb29yZC54IDw9IDEuMCAmJiBhbHBoYUNvb3JkLnkgPD0gMS4wKSB7CiAgICAgIC8vIG1hc2tBbHBoYSA9IEJsdXJBbHBoYShhbHBoYVRleHR1cmUsIGFscGhhQ29vcmQpOwogICAgICBtYXNrQWxwaGEgPSB0ZXh0dXJlMkQoYWxwaGFUZXh0dXJlLCBhbHBoYUNvb3JkKS5hOwogICAgfQoKICAgIHZlYzQgYWRDb2xvciA9IAogICAgICBhZFVuaXQgPT0gMCA/IEJsdXJBZChhZDAsIHRleENvb3JkKSA6CiAgICAgIGFkVW5pdCA9PSAxID8gQmx1ckFkKGFkMSwgdGV4Q29vcmQpIDoKICAgICAgYWRVbml0ID09IDIgPyBCbHVyQWQoYWQyLCB0ZXhDb29yZCkgOgoJCQkJCSAgICAgICAgICBCbHVyQWQoYWQzLCB0ZXhDb29yZCk7IC8vZ2V0IHRoZSBsb2dvJ3MgdGV4ZWwKCiAgICBmbG9hdCBhZEFscGhhID0gCiAgICAgIGFkVW5pdCA9PSAwID8gdGV4dHVyZTJEKGFkMCwgdGV4Q29vcmQpLmEgOgogICAgICBhZFVuaXQgPT0gMSA/IHRleHR1cmUyRChhZDEsIHRleENvb3JkKS5hIDoKICAgICAgYWRVbml0ID09IDIgPyB0ZXh0dXJlMkQoYWQyLCB0ZXhDb29yZCkuYSA6CiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZTJEKGFkMywgdGV4Q29vcmQpLmE7IC8vZ2V0IHRoZSBsb2dvJ3MgdGV4ZWwgICAgICAgICAgICAgCgogICAgZmxvYXQgZmluYWxBbHBoYSA9IG1hc2tBbHBoYSAqIGFkQ29sb3IuYTsKICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoYWRDb2xvci5yZ2IsIGZpbmFsQWxwaGEpOwogICAgZ2xfRnJhZ0NvbG9yLnJnYiAqPSBmaW5hbEFscGhhOwogICAgcmV0dXJuIHRydWU7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn0Kdm9pZCBtYWluKCkKewogIC8vY2FsY3VsYXRlIGN1ci1jb29yZCAod2l0aCBwaXhlbHMgdW5pdHMpCiAgdmVjMiBjdXJDb29yZCA9IGdsX0ZyYWdDb29yZC54eTsKICBjdXJDb29yZC55ID0gdV9yZXNvbHV0aW9uMlsxXSAtIGN1ckNvb3JkLnk7CgogIHZlYzQgdmlkZW9JbWFnZVBpeCA9IHRleHR1cmUyRCh1X2ltYWdlLCB2X3RleENvb3JkKTsKCiAgaWYgKGhhc0xvZ28wID09IDEpIHsKICAgIEJsZW5kV2l0aExvZ28oYWRGb3JMb2dvMCxhbHBoYTAsIHVfbWF0cml4MCwgY3VyQ29vcmQsdV9hbHBoYTBUb3BMZWZ0LCB1X2FscGhhMFNpemUsIHZpZGVvSW1hZ2VQaXgpOwogICAgcmV0dXJuOwogIH0gZWxzZSBpZiAoaGFzTG9nbzEgPT0gMSkgewogICAgQmxlbmRXaXRoTG9nbyhhZEZvckxvZ28xLCBhbHBoYTEsIHVfbWF0cml4MSwgY3VyQ29vcmQsdV9hbHBoYTFUb3BMZWZ0LCB1X2FscGhhMVNpemUsIHZpZGVvSW1hZ2VQaXgpOwogICAgcmV0dXJuOwogIH0gZWxzZSBpZiAoaGFzTG9nbzIgPT0gMSkgewogICAgQmxlbmRXaXRoTG9nbyhhZEZvckxvZ28yLCBhbHBoYTIsIHVfbWF0cml4MiwgY3VyQ29vcmQsdV9hbHBoYTJUb3BMZWZ0LCB1X2FscGhhMlNpemUsIHZpZGVvSW1hZ2VQaXgpOwogICAgcmV0dXJuOwogIH0gZWxzZSBpZiAoaGFzTG9nbzMgPT0gMSkgewogICAgQmxlbmRXaXRoTG9nbyhhZEZvckxvZ28zLCBhbHBoYTMsIHVfbWF0cml4MywgY3VyQ29vcmQsdV9hbHBoYTNUb3BMZWZ0LCB1X2FscGhhM1NpemUsIHZpZGVvSW1hZ2VQaXgpOwogICAgcmV0dXJuOwogIH0KfQpgOy8qIEBsaWNlbnNlIHR3Z2wuanMgNS41LjQgQ29weXJpZ2h0IChjKSAyMDE1LCBHcmVnZyBUYXZhcmVzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkF2YWlsYWJsZSB2aWEgdGhlIE1JVCBsaWNlbnNlLgpzZWU6IGh0dHA6Ly9naXRodWIuY29tL2dyZWdnbWFuL3R3Z2wuanMgZm9yIGRldGFpbHMgKi9jb25zdCBWPXt9O3tjb25zdCB0PVY7dFs1MTIwXT1JbnQ4QXJyYXksdFs1MTIxXT1VaW50OEFycmF5LHRbNTEyMl09SW50MTZBcnJheSx0WzUxMjNdPVVpbnQxNkFycmF5LHRbNTEyNF09SW50MzJBcnJheSx0WzUxMjVdPVVpbnQzMkFycmF5LHRbNTEyNl09RmxvYXQzMkFycmF5LHRbMzI4MTldPVVpbnQxNkFycmF5LHRbMzI4MjBdPVVpbnQxNkFycmF5LHRbMzM2MzVdPVVpbnQxNkFycmF5LHRbNTEzMV09VWludDE2QXJyYXksdFszMzY0MF09VWludDMyQXJyYXksdFszNTg5OV09VWludDMyQXJyYXksdFszNTkwMl09VWludDMyQXJyYXksdFszNjI2OV09VWludDMyQXJyYXksdFszNDA0Ml09VWludDMyQXJyYXl9ZnVuY3Rpb24gWCguLi50KXtjb25zb2xlLmVycm9yKC4uLnQpfWNvbnN0IGo9ZnVuY3Rpb24oKXtjb25zdCB0PXt9LGU9e307ZnVuY3Rpb24gbyhyKXtjb25zdCBpPXIuY29uc3RydWN0b3IubmFtZTtpZighdFtpXSl7Zm9yKGNvbnN0IHMgaW4gcilpZih0eXBlb2YgcltzXT09Im51bWJlciIpe2NvbnN0IGM9ZVtyW3NdXTtlW3Jbc11dPWM/YCR7Y30gfCAke3N9YDpzfXRbaV09ITB9fXJldHVybiBmdW5jdGlvbihpLHMpe3JldHVybiBvKGkpLGVbc118fCh0eXBlb2Ygcz09Im51bWJlciI/YDB4JHtzLnRvU3RyaW5nKDE2KX1gOnMpfX0oKSxXPTY0MDYsQj02NDA3LE89NjQwOCxZPTY0MDksUT02NDEwLEs9NjQwMixxPTM0MDQxLFo9MzMzMTksSj0zMzMyMCx0dD02NDAzLGV0PTM2MjQ0LHJ0PTM2MjQ4LG90PTM2MjQ5LGF0PXt9O3tjb25zdCB0PWF0O3RbV109e251bUNvbG9yQ29tcG9uZW50czoxfSx0W1ldPXtudW1Db2xvckNvbXBvbmVudHM6MX0sdFtRXT17bnVtQ29sb3JDb21wb25lbnRzOjJ9LHRbQl09e251bUNvbG9yQ29tcG9uZW50czozfSx0W09dPXtudW1Db2xvckNvbXBvbmVudHM6NH0sdFt0dF09e251bUNvbG9yQ29tcG9uZW50czoxfSx0W2V0XT17bnVtQ29sb3JDb21wb25lbnRzOjF9LHRbWl09e251bUNvbG9yQ29tcG9uZW50czoyfSx0W0pdPXtudW1Db2xvckNvbXBvbmVudHM6Mn0sdFtCXT17bnVtQ29sb3JDb21wb25lbnRzOjN9LHRbcnRdPXtudW1Db2xvckNvbXBvbmVudHM6M30sdFtPXT17bnVtQ29sb3JDb21wb25lbnRzOjR9LHRbb3RdPXtudW1Db2xvckNvbXBvbmVudHM6NH0sdFtLXT17bnVtQ29sb3JDb21wb25lbnRzOjF9LHRbcV09e251bUNvbG9yQ29tcG9uZW50czoyfX1jb25zdCBEPVg7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpOm51bGx9Y29uc3Qgc3Q9MzU3MTMsbnQ9MzU3MTQsbHQ9MzU2MzIsY3Q9MzU2MzMsaHQ9MzU5ODEsZHQ9L0VSUk9SOlxzKlxkKzooXGQrKS9naTtmdW5jdGlvbiB1dCh0LGU9IiIsbz0wKXtjb25zdCByPVsuLi5lLm1hdGNoQWxsKGR0KV0saT1uZXcgTWFwKHIubWFwKChzLGMpPT57Y29uc3QgYT1wYXJzZUludChzWzFdKSxuPXJbYysxXSxsPW4/bi5pbmRleDplLmxlbmd0aCxoPWUuc3Vic3RyaW5nKHMuaW5kZXgsbCk7cmV0dXJuW2EtMSxoXX0pKTtyZXR1cm4gdC5zcGxpdChgCmApLm1hcCgocyxjKT0+e2NvbnN0IGE9aS5nZXQoYyk7cmV0dXJuYCR7YysxK299OiAke3N9JHthP2AKCl5eXiAke2F9YDoiIn1gfSkuam9pbihgCmApfWNvbnN0IGs9L15bIFx0XSpcbi87ZnVuY3Rpb24gRyh0KXtsZXQgZT0wO3JldHVybiBrLnRlc3QodCkmJihlPTEsdD10LnJlcGxhY2UoaywiIikpLHtsaW5lT2Zmc2V0OmUsc2hhZGVyU291cmNlOnR9fWZ1bmN0aW9uIG10KHQsZSxvLHIpe2lmKHI9cnx8RCwhdC5nZXRTaGFkZXJQYXJhbWV0ZXIobyxzdCkpe2NvbnN0IHM9dC5nZXRTaGFkZXJJbmZvTG9nKG8pLHtsaW5lT2Zmc2V0OmMsc2hhZGVyU291cmNlOmF9PUcodC5nZXRTaGFkZXJTb3VyY2UobykpLG49YCR7dXQoYSxzLGMpfQpFcnJvciBjb21waWxpbmcgJHtqKHQsZSl9OiAke3N9YDtyZXR1cm4gcihuKSxufXJldHVybiIifWZ1bmN0aW9uIHcodCxlLG8pe2xldCByLGkscztpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKG89ZSxlPXZvaWQgMCksdHlwZW9mIHQ9PSJmdW5jdGlvbiIpbz10LHQ9dm9pZCAwO2Vsc2UgaWYodCYmIUFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGw9dDtvPWwuZXJyb3JDYWxsYmFjayx0PWwuYXR0cmliTG9jYXRpb25zLHI9bC50cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzLGk9bC50cmFuc2Zvcm1GZWVkYmFja01vZGUscz1sLmNhbGxiYWNrfWNvbnN0IGM9b3x8RCxhPVtdLG49e2Vycm9yQ2FsbGJhY2sobCwuLi5oKXthLnB1c2gobCksYyhsLC4uLmgpfSx0cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzOnIsdHJhbnNmb3JtRmVlZGJhY2tNb2RlOmksY2FsbGJhY2s6cyxlcnJvcnM6YX07e2xldCBsPXt9O0FycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKGZ1bmN0aW9uKGgsdSl7bFtoXT1lP2VbdV06dX0pOmw9dHx8e30sbi5hdHRyaWJMb2NhdGlvbnM9bH1yZXR1cm4gbn1jb25zdCBmdD1bIlZFUlRFWF9TSEFERVIiLCJGUkFHTUVOVF9TSEFERVIiXTtmdW5jdGlvbiB4dCh0LGUpe2lmKGUuaW5kZXhPZigiZnJhZyIpPj0wKXJldHVybiBsdDtpZihlLmluZGV4T2YoInZlcnQiKT49MClyZXR1cm4gY3R9ZnVuY3Rpb24gcHQodCxlLG8pe2NvbnN0IHI9dC5nZXRBdHRhY2hlZFNoYWRlcnMoZSk7Zm9yKGNvbnN0IGkgb2YgcilvLmhhcyhpKSYmdC5kZWxldGVTaGFkZXIoaSk7dC5kZWxldGVQcm9ncmFtKGUpfWNvbnN0IGd0PSh0PTApPT5uZXcgUHJvbWlzZShlPT5zZXRUaW1lb3V0KGUsdCkpO2Z1bmN0aW9uIEF0KHQsZSxvKXtjb25zdCByPXQuY3JlYXRlUHJvZ3JhbSgpLHthdHRyaWJMb2NhdGlvbnM6aSx0cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzOnMsdHJhbnNmb3JtRmVlZGJhY2tNb2RlOmN9PXcobyk7Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDsrK2Epe2xldCBuPWVbYV07aWYodHlwZW9mIG49PSJzdHJpbmciKXtjb25zdCBsPWl0KG4pLGg9bD9sLnRleHQ6bjtsZXQgdT10W2Z0W2FdXTtsJiZsLnR5cGUmJih1PXh0KHQsbC50eXBlKXx8dSksbj10LmNyZWF0ZVNoYWRlcih1KSx0LnNoYWRlclNvdXJjZShuLEcoaCkuc2hhZGVyU291cmNlKSx0LmNvbXBpbGVTaGFkZXIobiksdC5hdHRhY2hTaGFkZXIocixuKX19T2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaCgoW2Esbl0pPT50LmJpbmRBdHRyaWJMb2NhdGlvbihyLG4sYSkpO3tsZXQgYT1zO2EmJihhLmF0dHJpYnMmJihhPWEuYXR0cmlicyksQXJyYXkuaXNBcnJheShhKXx8KGE9T2JqZWN0LmtleXMoYSkpLHQudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyhyLGEsY3x8aHQpKX1yZXR1cm4gdC5saW5rUHJvZ3JhbShyKSxyfWZ1bmN0aW9uIFR0KHQsZSxvLHIsaSl7Y29uc3Qgcz13KG8scixpKSxjPW5ldyBTZXQoZSksYT1BdCh0LGUscyk7ZnVuY3Rpb24gbihsLGgpe2NvbnN0IHU9THQobCxoLHMuZXJyb3JDYWxsYmFjayk7cmV0dXJuIHUmJnB0KGwsaCxjKSx1fWlmKHMuY2FsbGJhY2spe190KHQsYSkudGhlbigoKT0+e2NvbnN0IGw9bih0LGEpO3MuY2FsbGJhY2sobCxsP3ZvaWQgMDphKX0pO3JldHVybn1yZXR1cm4gbih0LGEpP3ZvaWQgMDphfWFzeW5jIGZ1bmN0aW9uIF90KHQsZSl7Y29uc3Qgbz10LmdldEV4dGVuc2lvbigiS0hSX3BhcmFsbGVsX3NoYWRlcl9jb21waWxlIikscj1vPyhzLGMpPT5zLmdldFByb2dyYW1QYXJhbWV0ZXIoYyxvLkNPTVBMRVRJT05fU1RBVFVTX0tIUik6KCk9PiEwO2xldCBpPTA7ZG8gYXdhaXQgZ3QoaSksaT0xZTMvNjA7d2hpbGUoIXIodCxlKSl9ZnVuY3Rpb24gTHQodCxlLG8pe2lmKG89b3x8RCwhdC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsbnQpKXtjb25zdCBpPXQuZ2V0UHJvZ3JhbUluZm9Mb2coZSk7byhgRXJyb3IgaW4gcHJvZ3JhbSBsaW5raW5nOiAke2l9YCk7Y29uc3QgYz10LmdldEF0dGFjaGVkU2hhZGVycyhlKS5tYXAoYT0+bXQodCx0LmdldFNoYWRlclBhcmFtZXRlcihhLHQuU0hBREVSX1RZUEUpLGEsbykpO3JldHVybmAke2l9CiR7Yy5maWx0ZXIoYT0+YSkuam9pbihgCmApfWB9fWZ1bmN0aW9uIEV0KHQsZSxvLHIsaSl7cmV0dXJuIFR0KHQsZSxvLHIsaSl9Y29uc3QgUz10PT50LnRvU3RyaW5nKCkucGFkU3RhcnQoMiwiMCIpLE49IjoiLFU9KHQsZSxvKT0+e2xldCByPSIiO3JldHVybiBBcnJheS5pc0FycmF5KHQpPyhyPVtTKHRbMF0pLFModFsxXSksUyh0WzJdKSxTKHRbM10pXS5qb2luKCI6IiksdFs0XT09MSYmZT09PXZvaWQgMCYmKHIrPSIuMSIpKTpyPSgiMCIrdC5oKS5zbGljZSgtMikrTisoIjAiK3QubSkuc2xpY2UoLTIpK04rKCIwIit0LnMpLnNsaWNlKC0yKStOKygiMCIrdC5mKS5zbGljZSgtMikscn0sJD10PT57bGV0IGU9dC5zcGxpdCgiOiIpO2lmKGUubGVuZ3RoIT00KXJldHVybiBjb25zb2xlLmVycm9yKCJ0aW1lQ29kZVN0cjJUaW1lQ29kZUFycmF5OiBGYWlsZWQgdG8gcGFyc2UgIit0KSxbMCwwLDAsMCwwXTtsZXQgbz1bcGFyc2VJbnQoZVswXSkscGFyc2VJbnQoZVsxXSkscGFyc2VJbnQoZVsyXSldO2lmKGVbM10uaW5kZXhPZigiLiIpPj0wKXtsZXQgcj1lWzNdLnNwbGl0KCIuIik7by5wdXNoKHBhcnNlSW50KHJbMF0pKSxvLnB1c2gocGFyc2VJbnQoclsxXSkpfWVsc2Ugby5wdXNoKHBhcnNlSW50KGVbM10pKSxvLnB1c2goMCk7cmV0dXJuIG99LHZ0PSh0LGUsbyk9PntsZXQgcj02MCxpPTA7TWF0aC5mbG9vcihlKT09NjA/KHI9NjAsaT0wKTpNYXRoLmZsb29yKGUpPT01OT8ocj02MCxpPTQpOk1hdGguZmxvb3IoZSk9PTMwPyhyPTMwLGk9MCk6TWF0aC5mbG9vcihlKT09MjkmJihyPTMwLGk9Mik7bGV0IHM9MCxhPU1hdGguZmxvb3IoZSo2MCoxMCkqNixuPXRbMF0sbD10WzFdLGg9dFsyXSx1PXRbM10sbT10WzRdO3JldHVybiBzKz1uKmEscys9bCoocio2MCkscys9aCpyLG8/cys9dSoyK206cys9dSxzLT1pKmwscys9aSpNYXRoLmZsb29yKGwvMTApLHN9LEN0PSh0LGUsbyk9PntsZXQgcj02MCxpPTA7TWF0aC5mbG9vcihlKT09NjA/KHI9NjAsaT0wKTpNYXRoLmZsb29yKGUpPT01OT8ocj02MCxpPTQpOk1hdGguZmxvb3IoZSk9PTMwPyhyPTMwLGk9MCk6TWF0aC5mbG9vcihlKT09MjkmJihyPTMwLGk9Mik7bGV0IHM9TWF0aC5mbG9vcihlKjYwKSxjPU1hdGguZmxvb3IoZSo2MCoxMCksYT1jKjYsbj10LGw9TWF0aC5mbG9vcihuL2EpO24tPWwqYTtsZXQgaD1NYXRoLmZsb29yKG4vYyk7bi09aCpjLG4+PXIqNjAmJihuKz1pKihNYXRoLmZsb29yKChuLXIqNjApL3MpKzEpKTtsZXQgdT1NYXRoLmZsb29yKG4vKHIqNjApKTtuLT11KihyKjYwKTtsZXQgbT1NYXRoLmZsb29yKG4vcik7bi09bSpyO2xldCBkPW47dSs9aCoxMDtsZXQgQT0wO3JldHVybiBvJiYoQT1kJTIsZD1NYXRoLmZsb29yKGQvMikpLFtsLHUsbSxkLEFdfSx5PSh0LGUsbyk9PntsZXQgcj1vPjMwLGk9dnQodCxvLHIpO3JldHVybiBpKz1lLEN0KGksbyxyKX0sSD10PT4odCZ0LTEpPT0wO2NsYXNzIFN0e2NvbnN0cnVjdG9yKGUpe3AodGhpcywiYWRUZXh0dXJlIixudWxsKTtwKHRoaXMsInBsYWNlMkFkVGV4dHVyZSIse30pO3AodGhpcywicGxhY2UyYWQiLHt9KTtwKHRoaXMsImFkMnBsYWNlIix7fSk7cCh0aGlzLCJjdXJyZW50QWRzMkJvdW5kaW5nUmVjdCIsW10pO3AodGhpcywibGFzdFRpbWVSZXBvcnRlZEluY29taW5nVEMiLDApO3AodGhpcywiYXV0b0FkZEluZGV4IixudWxsKTtwKHRoaXMsImRpZ2l0SW1nIix7fSk7cCh0aGlzLCJzb3VyY2VGUFMiLDZlNC8xMDAxKTtwKHRoaXMsIm1ldGFkYXRhQXJyIixbXSk7cCh0aGlzLCJtZXRhZGF0YU1hcCIse30pO3AodGhpcywidmlkZW9TdGFydGVkIiwhMSk7cCh0aGlzLCJhZHZlcnRpc2VtZW50TWFwIix7fSk7cCh0aGlzLCJhZDJVcmwiLHt9KTtwKHRoaXMsInZpZGVvQ29waWVyIixudWxsKTtwKHRoaXMsImF1dG9BZGRJbmRleCIsbnVsbCk7aWYoZS5yZW5kZXJUaW1lY29kZXMpZm9yKGxldCBvPTA7bzwxMDsrK28pe2xldCByPW8rIi4xIixpPW8rIi4yIjt0aGlzLmRpZ2l0SW1nW3JdPXRoaXMuY3JlYXRlRGlnaXRJbWcociksdGhpcy5kaWdpdEltZ1tpXT10aGlzLmNyZWF0ZURpZ2l0SW1nKGkpfXRoaXMub3B0aW9ucz1PYmplY3QuYXNzaWduKHthZExvb3BUaW1lOjVlMyxpc0FkTG9vcDohMX0sZXx8e30pfW9uVXNlckNsaWNrT25DYW52YXMoZSl7Y29uc29sZS5sb2coImZpeCBtZSIpfXRleFVuaXRGb3JHZW5lcmljQWQoKXtyZXR1cm4gMH10ZXhVbml0Rm9yQWRJblBsYWNlKGUpe2xldCBvPU9iamVjdC5rZXlzKHRoaXMucGxhY2UyYWQpO2ZvcihsZXQgcj0wO3I8by5sZW5ndGg7KytyKWlmKGU9PW9bcl0pcmV0dXJuIHIrMTtyZXR1cm4gMH10ZXhVbml0Rm9yUGxhY2VIb2xkZXIoZSl7bGV0IG89T2JqZWN0LmtleXModGhpcy5wbGFjZTJhZCk7Zm9yKGxldCByPTA7cjxvLmxlbmd0aDsrK3Ipe2xldCBpPW9bcl07aWYoZS5uYW1lLmluZGV4T2YoaSk+PTApcmV0dXJuIHJ9cmV0dXJuIDB9YWROYW1lRm9yUGxhY2VIb2xkZXIoZSl7bGV0IG89T2JqZWN0LmtleXModGhpcy5wbGFjZTJhZCk7Zm9yKGxldCByPTA7cjxvLmxlbmd0aDsrK3Ipe2xldCBpPW9bcl07aWYoZS5uYW1lLmluZGV4T2YoaSk+PTAmJnRoaXMucGxhY2UyQWRUZXh0dXJlJiZ0aGlzLnBsYWNlMkFkVGV4dHVyZVtpXSYmdGhpcy5wbGFjZTJBZFRleHR1cmVbaV0ubmFtZSlyZXR1cm4gdGhpcy5wbGFjZTJBZFRleHR1cmVbaV0ubmFtZX1yZXR1cm4gdGhpcy5sYXN0QWROYW1lfXRleFVuaXRCYXNlRm9yQWxwaGEoKXtyZXR1cm4gMStPYmplY3Qua2V5cyh0aGlzLnBsYWNlMmFkKS5sZW5ndGh9aW5pdEdMKCl7Y29uc3QgZT10aGlzLm9wdGlvbnMubWFza01QND9bdixfXTpbQyx6XTt0aGlzLnByb2dyYW09RXQodGhpcy5jdHgsZSksdGhpcy5jdHgudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pLHRoaXMuY291bnRlcj0wLHRoaXMuY2xlYW5HTCgpfWNsZWFuR0woKXt0aGlzLmN0eC5jbGVhckNvbG9yKDAsMCwwLDApLHRoaXMuY3R4LmNsZWFyKHRoaXMuY3R4LkNPTE9SX0JVRkZFUl9CSVQpfWdlbmVyYXRlVGV4dHVyZShlLG8scixpLHMsYyxhLG49ITEpe2E/dGhpcy5jdHgucGl4ZWxTdG9yZWkodGhpcy5jdHguVU5QQUNLX0FMSUdOTUVOVCwxKTp0aGlzLmN0eC5waXhlbFN0b3JlaSh0aGlzLmN0eC5VTlBBQ0tfQUxJR05NRU5ULDQpLHRoaXMuY3R4LnBpeGVsU3RvcmVpKHRoaXMuY3R4LlVOUEFDS19GTElQX1lfV0VCR0wsbik7Y29uc3QgbD10aGlzLmN0eC5jcmVhdGVUZXh0dXJlKCk7dGhpcy5jdHguYWN0aXZlVGV4dHVyZSh0aGlzLmN0eC5URVhUVVJFMCtvKSx0aGlzLmN0eC5iaW5kVGV4dHVyZSh0aGlzLmN0eC5URVhUVVJFXzJELGwpO3RyeXtzJiZjP3RoaXMuY3R4LnRleEltYWdlMkQodGhpcy5jdHguVEVYVFVSRV8yRCwwLGk/P3RoaXMuY3R4LlJHQkEscyxjLDAsaT8/dGhpcy5jdHguUkdCQSx0aGlzLmN0eC5VTlNJR05FRF9CWVRFLGUpOnRoaXMuY3R4LnRleEltYWdlMkQodGhpcy5jdHguVEVYVFVSRV8yRCwwLGk/P3RoaXMuY3R4LlJHQkEsdGhpcy5jdHguUkdCQSx0aGlzLmN0eC5VTlNJR05FRF9CWVRFLGUpfWNhdGNoKHUpe3JldHVybiBjb25zb2xlLmVycm9yKHUpLG51bGx9aWYodGhpcy53ZWJHTFZlcnNpb249PTEpe2xldCB1PXN8fGUud2lkdGgsbT1jfHxlLmhlaWdodDt1JiZIKHUpJiZtJiZIKG0pP3RoaXMuY3R4LmdlbmVyYXRlTWlwbWFwKHRoaXMuY3R4LlRFWFRVUkVfMkQpOih0aGlzLmN0eC50ZXhQYXJhbWV0ZXJpKHRoaXMuY3R4LlRFWFRVUkVfMkQsdGhpcy5jdHguVEVYVFVSRV9XUkFQX1MsdGhpcy5jdHguQ0xBTVBfVE9fRURHRSksdGhpcy5jdHgudGV4UGFyYW1ldGVyaSh0aGlzLmN0eC5URVhUVVJFXzJELHRoaXMuY3R4LlRFWFRVUkVfV1JBUF9ULHRoaXMuY3R4LkNMQU1QX1RPX0VER0UpLHRoaXMuY3R4LnRleFBhcmFtZXRlcmkodGhpcy5jdHguVEVYVFVSRV8yRCx0aGlzLmN0eC5URVhUVVJFX01JTl9GSUxURVIsdGhpcy5jdHguTElORUFSKSl9ZWxzZSB0aGlzLmN0eC50ZXhQYXJhbWV0ZXJpKHRoaXMuY3R4LlRFWFRVUkVfMkQsdGhpcy5jdHguVEVYVFVSRV9XUkFQX1MsdGhpcy5jdHguQ0xBTVBfVE9fRURHRSksdGhpcy5jdHgudGV4UGFyYW1ldGVyaSh0aGlzLmN0eC5URVhUVVJFXzJELHRoaXMuY3R4LlRFWFRVUkVfV1JBUF9ULHRoaXMuY3R4LkNMQU1QX1RPX0VER0UpLHRoaXMuY3R4LnRleFBhcmFtZXRlcmkodGhpcy5jdHguVEVYVFVSRV8yRCx0aGlzLmN0eC5URVhUVVJFX01JTl9GSUxURVIsdGhpcy5jdHguTElORUFSKSx0aGlzLmN0eC50ZXhQYXJhbWV0ZXJpKHRoaXMuY3R4LlRFWFRVUkVfMkQsdGhpcy5jdHguVEVYVFVSRV9NQUdfRklMVEVSLHRoaXMuY3R4LkxJTkVBUik7bGV0IGg9dGhpcy5jdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSxyKTtyZXR1cm4gaCYmdGhpcy5jdHgudW5pZm9ybTFpKGgsbyksbH1fbmV4dEFkdmVydGlzZW1lbnQoKXt0aGlzLmF1dG9BZGRJbmRleD1zZXRUaW1lb3V0KCgpPT57Y29uc3QgZT1PYmplY3Qua2V5cyh0aGlzLmFkdmVydGlzZW1lbnRNYXApO2UubGVuZ3RoJiYodGhpcy5zZWxlY3RBZChlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSplLmxlbmd0aCldKSx0aGlzLl9uZXh0QWR2ZXJ0aXNlbWVudCgpKX0sdGhpcy5vcHRpb25zLmFkTG9vcFRpbWUpfW1ha2VTdXJlQWRQZXJQbGFjZSgpe2lmKHRoaXMucGxhY2UyYWQpe2xldCBlPU9iamVjdC5rZXlzKHRoaXMucGxhY2UyYWQpO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7KytvKXtsZXQgcj1lW29dOyF0aGlzLnBsYWNlMkFkVGV4dHVyZVtyXSYmdGhpcy5wbGFjZTJhZFtyXS5sZW5ndGg+MCYmKGNvbnNvbGUubG9nKCJNYWtlU3VyZUFkUGVyUGxhY2U6IFNldCBkZWZhdWx0IGltYWdlICIrdGhpcy5wbGFjZTJhZFtyXVswXSsiIGZvciBwbGFjZSAiK3IpLHRoaXMuc2VsZWN0QWQoIiMiK3RoaXMucGxhY2UyYWRbcl1bMF0pKX19fXNlbGVjdEFkKGUpe2NvbnNvbGUubG9nKCJjb21wb3Nlcjo6U2VsZWN0QWQ6IHNlbGVjdGVkIGFkIGlzICIrZSk7bGV0IG89dGhpcy5hZHZlcnRpc2VtZW50TWFwW2VdO2lmKCFvKWNvbnNvbGUuZXJyb3IoIlNlbGVjdEFkOiBGYWlsZWQgdG8gZmluZCBpbWFnZSAnIitlKyInIik7ZWxzZSBpZih0aGlzLmFkMnBsYWNlJiZ0aGlzLmFkMnBsYWNlW2VdKXtsZXQgcj10aGlzLmFkMnBsYWNlW2VdO2NvbnNvbGUubG9nKCJjb21wb3Nlcjo6U2VsZWN0QWQ6IFRoZSBzZWxlY3RlZCBhZCBzaG91bGQgYmUgaW4gcGxhY2UgIityKTtsZXQgaT10aGlzLnRleFVuaXRGb3JBZEluUGxhY2Uocikscz0iYWQiKyhpLTEpO3RoaXMucGxhY2UyQWRUZXh0dXJlW3JdJiZ0aGlzLmN0eC5kZWxldGVUZXh0dXJlKHRoaXMucGxhY2UyQWRUZXh0dXJlW3JdLnRleCksdGhpcy5wbGFjZTJBZFRleHR1cmVbcl09e3RleDp0aGlzLmdlbmVyYXRlVGV4dHVyZShvLGkscyksdGV4VW5pdElkOmksdGV4TmFtZTpzLG5hbWU6ZX19ZWxzZSB0aGlzLmFkVGV4dHVyZSYmdGhpcy5jdHguZGVsZXRlVGV4dHVyZSh0aGlzLmFkVGV4dHVyZSksdGhpcy5hZFRleHR1cmU9dGhpcy5nZW5lcmF0ZVRleHR1cmUobyx0aGlzLnRleFVuaXRGb3JHZW5lcmljQWQoKSwiYWQwIiksdGhpcy5sYXN0QWQ9byx0aGlzLmxhc3RBZE5hbWU9ZX1vbk1ldGFEYXRhKGUpe3RoaXMubWV0YWRhdGFNYXBbZS50aW1lY29kZV09ZSx0aGlzLm1ldGFkYXRhQXJyLnB1c2goZS50aW1lY29kZSl9cmVuZGVyRnJhbWUoKXtsZXQgZT10aGlzLmN0eC5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLnByb2dyYW0sImFfcG9zaXRpb24iKSxvPXRoaXMuY3R4LmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwiYV91diIpLHI9dGhpcy5jdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwidV9yZXNvbHV0aW9uIik7dGhpcy5jdHgudW5pZm9ybTJmKHIsdGhpcy5jdHguY2FudmFzLndpZHRoLHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpLHI9dGhpcy5jdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwidV9yZXNvbHV0aW9uMiIpLHRoaXMuY3R4LnVuaWZvcm0yZihyLHRoaXMuY3R4LmNhbnZhcy53aWR0aCx0aGlzLmN0eC5jYW52YXMuaGVpZ2h0KTtsZXQgaT10aGlzLmN0eC5jcmVhdGVCdWZmZXIoKTt0aGlzLmN0eC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0aGlzLmN0eC5iaW5kQnVmZmVyKHRoaXMuY3R4LkFSUkFZX0JVRkZFUixpKTtsZXQgcz0yLGM9dGhpcy5jdHguRkxPQVQsYT0hMSxuPTAsbD0wO3RoaXMuY3R4LnZlcnRleEF0dHJpYlBvaW50ZXIoZSxzLGMsYSxuLGwpO2xldCBoPXRoaXMuY3R4LmNyZWF0ZUJ1ZmZlcigpO3RoaXMuY3R4LmJpbmRCdWZmZXIodGhpcy5jdHguQVJSQVlfQlVGRkVSLGgpLHRoaXMuY3R4LmJ1ZmZlckRhdGEodGhpcy5jdHguQVJSQVlfQlVGRkVSLG5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMCwxLDAsMSwxLDAsMSwxXSksdGhpcy5jdHguU1RBVElDX0RSQVcpLHRoaXMuY3R4LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG8pLHM9MixjPXRoaXMuY3R4LkZMT0FULGE9ITEsbj0wLGw9MCx0aGlzLmN0eC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8scyxjLGEsbixsKSx0aGlzLmN0eC52aWV3cG9ydCgwLDAsdGhpcy5jdHguY2FudmFzLndpZHRoLHRoaXMuY3R4LmNhbnZhcy5oZWlnaHQpLHRoaXMuY3R4LmNsZWFyQ29sb3IoMCwwLDAsMCksdGhpcy5jdHguY2xlYXIodGhpcy5jdHguQ09MT1JfQlVGRkVSX0JJVHx0aGlzLmN0eC5ERVBUSF9CVUZGRVJfQklUKSx0aGlzLmN0eC5iaW5kQnVmZmVyKHRoaXMuY3R4LkFSUkFZX0JVRkZFUixpKSx0aGlzLnNldFJlY3RhbmdsZSgwLDAsdGhpcy5jYW52YXMud2lkdGgsdGhpcy5jYW52YXMuaGVpZ2h0KTtsZXQgdT10aGlzLmN0eC5UUklBTkdMRVM7dGhpcy5jdHguZHJhd0FycmF5cyh1LGwsNil9c2V0UmVjdGFuZ2xlKGUsbyxyLGkpe2xldCBzPWUsYz1lK3IsYT1vLG49bytpO3RoaXMuY3R4LmJ1ZmZlckRhdGEodGhpcy5jdHguQVJSQVlfQlVGRkVSLG5ldyBGbG9hdDMyQXJyYXkoW3MsYSxjLGEscyxuLHMsbixjLGEsYyxuXSksdGhpcy5jdHguU1RBVElDX0RSQVcpfXJlbmRlckF1Z21lbnRhdGlvbihlKXt0aGlzLmNhbnZhcy53aWR0aD0xMjgwLHRoaXMuY2FudmFzLmhlaWdodD03MjAsdGhpcy5vcHRpb25zLm1hc2tNUDQ/dGhpcy5yZW5kZXJBdWdtZW50YXRpb25NUDQoZSk6dGhpcy5yZW5kZXJBdWdtZW50YXRpb25PbGQoZSl9cmVuZGVyQXVnbWVudGF0aW9uTVA0KGUpe2xldCBvPSQoZSkscj15KG8sMSx0aGlzLnNvdXJjZUZQUyksaT15KG8sMix0aGlzLnNvdXJjZUZQUykscz1VKHIpLGM9VShpKTt0aGlzLnZpZGVvU3RhcnRlZD0hMCxwZXJmb3JtYW5jZS5ub3coKTtsZXQgYT1udWxsLG49W107aWYodGhpcy5tZXRhZGF0YU1hcFtlXSl7YT10aGlzLm1ldGFkYXRhTWFwW2VdLHRoaXMubWV0YWRhdGFNYXBbc10mJm4ucHVzaCh7bmV4dFZpZGVvOnRoaXMubWV0YWRhdGFNYXBbc10sbmV4dFRpbWVDb2RlOnN9KSx0aGlzLm1ldGFkYXRhTWFwW2NdJiZuLnB1c2goe25leHRWaWRlbzp0aGlzLm1ldGFkYXRhTWFwW2NdLG5leHRUaW1lQ29kZTpjfSk7Y29uc3QgbT10aGlzLm1ldGFkYXRhQXJyLmluZGV4T2YoZSk7bT4tNSYmdGhpcy5tZXRhZGF0YUFyci5zcGxpY2UoMCxtLTQpLmZvckVhY2goZD0+e2RlbGV0ZSB0aGlzLm1ldGFkYXRhTWFwW2RdfSl9ZWxzZSB0aGlzLmNvdW50ZXIrKyx0aGlzLmNvdW50ZXI+NjAmJih0aGlzLmNvdW50ZXI9MCxjb25zb2xlLmVycm9yKCJNaXNzaW5nIG1ldGEgZGF0YSBhdCB0aW1lIGNvZGUgIitlKSk7bGV0IGw9W10saD0wO2lmKHRoaXMuY3VycmVudEFkczJCb3VuZGluZ1JlY3Q9W10sYSE9bnVsbCYmYS5hbHBoYU1hc2spe2xldCBtPXRoaXMudGV4VW5pdEJhc2VGb3JBbHBoYSgpO2NvbnN0IGQ9dGhpcy5nZW5lcmF0ZVRleHR1cmUoYS5hbHBoYU1hc2ssbSwidV9hbHBoYU1hc2siLHRoaXMuY3R4LlJHQkEsbnVsbCxudWxsLCExLCEwKTtsLnB1c2goZCk7Zm9yKGNvbnN0IEEgaW4gYS5wbGFjZWhvbGRlcnMpe2NvbnN0IEw9YS5wbGFjZWhvbGRlcnNbQV07bGV0IEY9Imhhc0xvZ28iK2gsUD10aGlzLmN0eC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLEYpO3RoaXMuY3R4LnVuaWZvcm0xaShQLDEpO2xldCBiPSJhZEZvckxvZ28iK2gsUj10aGlzLmN0eC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLGIpO3RoaXMuY3R4LnVuaWZvcm0xaShSLHRoaXMudGV4VW5pdEZvclBsYWNlSG9sZGVyKEwpKTtsZXQgST0idV9tYXRyaXgiK2gsTT10aGlzLmN0eC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLEkpO3RoaXMuY3R4LnVuaWZvcm1NYXRyaXgzZnYoTSwhMSxMLnRyYW5mb3JtKTtsZXQgZj17bDotMSx0Oi0xLHI6LTEsYjotMX07Zm9yKGxldCBUIG9mIEwuY29ybmVycykoVC54PGYubHx8Zi5sPT0tMSkmJihmLmw9VC54KSwoVC54PmYucnx8Zi5yPT0tMSkmJihmLnI9VC54KSwoVC55PGYudHx8Zi50PT0tMSkmJihmLnQ9VC55KSwoVC55PmYuYnx8Zi5iPT0tMSkmJihmLmI9VC55KTtmLmwvPWEuY2FudmFzU2l6ZS53aWR0aCxmLnIvPWEuY2FudmFzU2l6ZS53aWR0aCxmLnQvPWEuY2FudmFzU2l6ZS5oZWlnaHQsZi5iLz1hLmNhbnZhc1NpemUuaGVpZ2h0LHRoaXMuY3VycmVudEFkczJCb3VuZGluZ1JlY3QucHVzaCh7bmFtZTp0aGlzLmFkTmFtZUZvclBsYWNlSG9sZGVyKEwpLHJlY3Q6Zn0pLGgrK319Y29uc3QgdT00O2Zvcig7aDx1OysraCl7bGV0IG09Imhhc0xvZ28iK2gsZD10aGlzLmN0eC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLG0pO3RoaXMuY3R4LnVuaWZvcm0xaShkLDApfXRoaXMucmVuZGVyVGltZWNvZGVzKGUpLHRoaXMucmVuZGVyRnJhbWUoKTtmb3IoY29uc3QgbSBvZiBsKXRoaXMuY3R4LmRlbGV0ZVRleHR1cmUobSl9cmVuZGVyQXVnbWVudGF0aW9uT2xkKGUpe2xldCBvPSQoZSkscj15KG8sMSx0aGlzLnNvdXJjZUZQUyksaT15KG8sMix0aGlzLnNvdXJjZUZQUykscz1VKHIpLGM9VShpKTt0aGlzLnZpZGVvU3RhcnRlZD0hMCxwZXJmb3JtYW5jZS5ub3coKTtsZXQgYT1udWxsLG49W107aWYodGhpcy5tZXRhZGF0YU1hcFtlXSl7YT10aGlzLm1ldGFkYXRhTWFwW2VdLHRoaXMubWV0YWRhdGFNYXBbc10mJm4ucHVzaCh7bmV4dFZpZGVvOnRoaXMubWV0YWRhdGFNYXBbc10sbmV4dFRpbWVDb2RlOnN9KSx0aGlzLm1ldGFkYXRhTWFwW2NdJiZuLnB1c2goe25leHRWaWRlbzp0aGlzLm1ldGFkYXRhTWFwW2NdLG5leHRUaW1lQ29kZTpjfSk7Y29uc3QgbT10aGlzLm1ldGFkYXRhQXJyLmluZGV4T2YoZSk7bT4tNSYmdGhpcy5tZXRhZGF0YUFyci5zcGxpY2UoMCxtLTQpLmZvckVhY2goZD0+e2RlbGV0ZSB0aGlzLm1ldGFkYXRhTWFwW2RdfSl9ZWxzZSB0aGlzLmNvdW50ZXIrKyx0aGlzLmNvdW50ZXI+NjAmJih0aGlzLmNvdW50ZXI9MCxjb25zb2xlLmVycm9yKCJNaXNzaW5nIG1ldGEgZGF0YSBhdCB0aW1lIGNvZGUgIitlKSk7bGV0IGw9W10saD0wO3RoaXMuY3VycmVudEFkczJCb3VuZGluZ1JlY3Q9W107Zm9yKGNvbnN0IG0gaW4gYT09bnVsbD92b2lkIDA6YS5wbGFjZWhvbGRlcnMpe2NvbnN0IGQ9YS5wbGFjZWhvbGRlcnNbbV07aWYoIWQuYWxwaGFBc1VpbnQ4QXJyYXkpY29udGludWU7bGV0IEE9ImFscGhhIitoLEw9dGhpcy50ZXhVbml0QmFzZUZvckFscGhhKCkraDtpZihkLmFscGhhVGV4PXRoaXMuZ2VuZXJhdGVUZXh0dXJlKGQuYWxwaGFBc1VpbnQ4QXJyYXksTCxBLHRoaXMuY3R4LkFMUEhBLGQud2lkdGgsZC5oZWlnaHQsITApLGQuYWxwaGFBc1VpbnQ4QXJyYXk9bnVsbCwhZC5hbHBoYVRleCl7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBhbHBoYSB0ZXh0dXJlIik7Y29udGludWV9bC5wdXNoKGQuYWxwaGFUZXgpO2xldCBGPSJoYXNMb2dvIitoLFA9dGhpcy5jdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSxGKTt0aGlzLmN0eC51bmlmb3JtMWkoUCwxKTtsZXQgYj0iYWRGb3JMb2dvIitoLFI9dGhpcy5jdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSxiKSxJPSExO2QubmFtZS5pbmRleE9mKCJibHVyIik+PTA/KHRoaXMuY3R4LnVuaWZvcm0xaShSLDk5KSxJPSEwKTp0aGlzLmN0eC51bmlmb3JtMWkoUix0aGlzLnRleFVuaXRGb3JQbGFjZUhvbGRlcihkKSk7bGV0IE09InVfYWxwaGEiK2grIlRvcExlZnQiLGY9dGhpcy5jdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSxNKTt0aGlzLmN0eC51bmlmb3JtMmZ2KGYsW2QubWFza1gsZC5tYXNrWV0pO2xldCBUPSJ1X2FscGhhIitoKyJTaXplIix5dD10aGlzLmN0eC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLFQpO3RoaXMuY3R4LnVuaWZvcm0yZnYoeXQsW2Qud2lkdGgsZC5oZWlnaHRdKTtsZXQgUnQ9InVfbWF0cml4IitoLEl0PXRoaXMuY3R4LmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sUnQpO2lmKHRoaXMuY3R4LnVuaWZvcm1NYXRyaXgzZnYoSXQsITEsZC50cmFuZm9ybSksIUkpe2xldCB4PXtsOi0xLHQ6LTEscjotMSxiOi0xfTtmb3IobGV0IEUgb2YgZC5jb3JuZXJzKShFLng8eC5sfHx4Lmw9PS0xKSYmKHgubD1FLngpLChFLng+eC5yfHx4LnI9PS0xKSYmKHgucj1FLngpLChFLnk8eC50fHx4LnQ9PS0xKSYmKHgudD1FLnkpLChFLnk+eC5ifHx4LmI9PS0xKSYmKHguYj1FLnkpO3gubC89YS5jYW52YXNTaXplLndpZHRoLHguci89YS5jYW52YXNTaXplLndpZHRoLHgudC89YS5jYW52YXNTaXplLmhlaWdodCx4LmIvPWEuY2FudmFzU2l6ZS5oZWlnaHQsdGhpcy5jdXJyZW50QWRzMkJvdW5kaW5nUmVjdC5wdXNoKHtuYW1lOnRoaXMuYWROYW1lRm9yUGxhY2VIb2xkZXIoZCkscmVjdDp4fSl9aCsrfWNvbnN0IHU9NDtmb3IoO2g8dTsrK2gpe2xldCBtPSJoYXNMb2dvIitoLGQ9dGhpcy5jdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSxtKTt0aGlzLmN0eC51bmlmb3JtMWkoZCwwKX10aGlzLnJlbmRlclRpbWVjb2RlcyhlKSx0aGlzLnJlbmRlckZyYW1lKCk7Zm9yKGNvbnN0IG0gb2YgbCl0aGlzLmN0eC5kZWxldGVUZXh0dXJlKG0pfXJlbmRlclRpbWVjb2RlcyhlKXtpZih0aGlzLm9wdGlvbnMucmVuZGVyVGltZWNvZGVzKXtsZXQgbz1lLnNwbGl0KCI6IilbM10scj1vLmluZGV4T2YoIi4iKT49MD8yOjEscz1wYXJzZUludChvLnNwbGl0KCIuIilbMF0pJTEwKyIuIityLGM9dGhpcy50ZXhVbml0QmFzZUZvckFscGhhKCkrNTtjb25zb2xlLmxvZyhzLHRoaXMuZGlnaXRJbWcsYywiZGlnaXRUZXgiKTtsZXQgYT10aGlzLmdlbmVyYXRlVGV4dHVyZSh0aGlzLmRpZ2l0SW1nW3NdLGMsImRpZ2l0VGV4Iik7dGV4dHVyZXNGb3JUaGlzRnJhbWUucHVzaChhKTtsZXQgbD10aGlzLmN0eC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCJoYXNEaWdpdCIpO3RoaXMuY3R4LnVuaWZvcm0xaShsLDEpO2xldCB1PXRoaXMuY3R4LmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sInVfZGlnaXRUb3BMZWZ0Iik7dGhpcy5jdHgudW5pZm9ybTJmdih1LFswLDBdKTtsZXQgZD10aGlzLmN0eC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCJ1X2RpZ2l0U2l6ZSIpO3RoaXMuY3R4LnVuaWZvcm0yZnYoZCxbMjAwLDIwMF0pfWVsc2V7bGV0IHI9dGhpcy5jdHguZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwiaGFzRGlnaXQiKTt0aGlzLmN0eC51bmlmb3JtMWkociwwKX19dG9nZ2xlRnVsbHNjcmVlbigpeyh0aGlzLnJlcXVlc3RGdWxsc2NyZWVufHx0aGlzLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKS5jYWxsKHRoaXMpLmNhdGNoKGU9Pntjb25zb2xlLmVycm9yKGUpfSl9fWNsYXNzIFV0IGV4dGVuZHMgU3R7Y29uc3RydWN0b3IoZSxvKXtzdXBlcihlKSx0aGlzLmNhbnZhcz1vLHRoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoIndlYmdsIix7cHJlbXVsdGlwbGllZEFscGhhOiExLGFudGlhbGlhczohMX0pLHRoaXMuaW5pdEdMKCl9YXN5bmMgY3JlYXRlRGlnaXRJbWcoZSl7bGV0IG89bmV3IE9mZnNjcmVlbkNhbnZhcyg1MCw1MCkscj1vLmdldENvbnRleHQoIjJkIik7cmV0dXJuIHIuZmlsbFN0eWxlPSJibGFjayIsci5maWxsUmVjdCgwLDAsby53aWR0aCxvLmhlaWdodCksci5mb250PSIzMHB4IEFyaWFsIixyLmZpbGxTdHlsZT0id2hpdGUiLHIuZmlsbFRleHQoZSwxMCwzNSksYXdhaXQgby50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKX1hc3luYyBhZGRBZHZlcnRpc2VtZW50KGUpe2xldHtuYW1lOm8scGF0aDpyLGlzU2VsZWN0ZWQ6aX09ZTtpZihvLmluZGV4T2YoIi5qc29uIik+LTEpe2ZldGNoKHIpLnRoZW4oYXN5bmMgbD0+e3RoaXMucGxhY2UyYWQ9YXdhaXQgbC5qc29uKCksdGhpcy5hZDJwbGFjZT17fTtsZXQgaD1PYmplY3Qua2V5cyh0aGlzLnBsYWNlMmFkKTtmb3IobGV0IHU9MDt1PGgubGVuZ3RoOysrdSl7bGV0IG09aFt1XTtpZihtPT0idXJscyIpe3RoaXMuYWQyVXJsPXRoaXMucGxhY2UyYWRbbV0sZGVsZXRlIHRoaXMucGxhY2UyYWRbbV07Y29udGludWV9bGV0IGQ9dGhpcy5wbGFjZTJhZFttXTtmb3IobGV0IEE9MDtBPGQubGVuZ3RoOysrQSl7bGV0IEw9ZFtBXTt0aGlzLmFkMnBsYWNlWyIjIitMXT1tfX1PYmplY3Qua2V5cyh0aGlzLnBsYWNlMmFkKS5sZW5ndGg+MCYmKGNvbnNvbGUubG9nKCJjb21wb3Nlcjo6QWRkQWR2ZXJ0aXNlbWVudDogcGxhY2UtdG8tYWRzIG1hcHBpbmc6ICIsdGhpcy5wbGFjZTJhZCksY29uc29sZS5sb2coImNvbXBvc2VyOjpBZGRBZHZlcnRpc2VtZW50OiBhZHMtdG8tcGxhY2UgbWFwcGluZzogIix0aGlzLmFkMnBsYWNlKSxzZXRUaW1lb3V0KCgpPT57dGhpcy5tYWtlU3VyZUFkUGVyUGxhY2UoKX0sM2UzKSksaSYmdGhpcy5zZWxlY3RBZChvKX0pO3JldHVybn1jb25zdCBjPWF3YWl0KGF3YWl0IGZldGNoKHIpKS5ibG9iKCksYT1hd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChjKTtsZXQgbj1PYmplY3Qua2V5cyh0aGlzLmFkdmVydGlzZW1lbnRNYXApLmxlbmd0aD09PTA7dGhpcy5hZHZlcnRpc2VtZW50TWFwW29dPWEsbiYmKHRoaXMuc2VsZWN0QWQobyksdGhpcy5vcHRpb25zLmlzQWRMb29wJiYoY2xlYXJUaW1lb3V0KHRoaXMuYXV0b0FkZEluZGV4KSx0aGlzLl9uZXh0QWR2ZXJ0aXNlbWVudCgpKSl9fWxldCBnPW51bGw7b25tZXNzYWdlPXQ9Pntzd2l0Y2godC5kYXRhLm1ldGhvZCl7Y2FzZSJvblVzZXJDbGlja09uQ2FudmFzIjpnJiZnLm9uVXNlckNsaWNrT25DYW52YXModC5kYXRhLmRhdGEpO2JyZWFrO2Nhc2UiY2xlYW5HTCI6ZyYmZy5jbGVhbkdMKCk7YnJlYWs7Y2FzZSJhZGRBZHZlcnRpc2VtZW50IjpnJiZnLmFkZEFkdmVydGlzZW1lbnQodC5kYXRhLmRhdGEpO2JyZWFrO2Nhc2Uic2VsZWN0QWQiOmcmJmcuc2VsZWN0QWQodC5kYXRhLmRhdGEpO2JyZWFrO2Nhc2Uib25NZXRhRGF0YSI6ZyYmZy5vbk1ldGFEYXRhKHQuZGF0YS5kYXRhKTticmVhaztjYXNlInJlbmRlckF1Z21lbnRhdGlvbiI6ZyYmZy5yZW5kZXJBdWdtZW50YXRpb24odC5kYXRhLmRhdGEpO2JyZWFrO2Nhc2UiY29uc3RydWN0b3IiOmc9bmV3IFV0KHQuZGF0YS5vcHRpb25zLHQuZGF0YS5jYW52YXMpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiV3JvbmcgVGhyZWFkIE1lc3NhZ2UiKX19fSkoKTsK",ir=e=>Uint8Array.from(atob(e),t=>t.charCodeAt(0)),Ql=typeof self<"u"&&self.Blob&&new Blob([ir(Bl)],{type:"text/javascript;charset=utf-8"});function rr(e){let t;try{if(t=Ql&&(self.URL||self.webkitURL).createObjectURL(Ql),!t)throw"";const n=new Worker(t,{name:e==null?void 0:e.name});return n.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker("data:text/javascript;base64,"+Bl,{name:e==null?void 0:e.name})}finally{t&&(self.URL||self.webkitURL).revokeObjectURL(t)}}class sr{constructor(t,n){this.canvas=t,this.worker=new rr,this.worker.onmessage=i=>{const{action:r,url:d}=i.data;r==="open-uri"&&d&&window.open(d,"_blank")};const l=t.transferControlToOffscreen();let a=6e4/1001,c=n.renderTimecode;this.worker.postMessage({method:"constructor",canvas:l,options:{sourceFPS:a,renderTimecodes:c,maskMP4:n.maskMP4}},[l])}onUserClickOnCanvas(t,n,l){this.worker.postMessage({method:"onUserClickOnCanvas",data:{clientX:t,clientY:n,rect:l}})}cleanGL(){this.worker.postMessage({method:"cleanGL",data:""})}renderAugmentation(t){this.worker.postMessage({method:"renderAugmentation",data:t})}addAdvertisement(t){this.worker.postMessage({method:"addAdvertisement",data:t})}getCanvas(){return this.canvas}selectAd(t){this.worker.postMessage({method:"selectAd",data:t})}onMetaData(t){this.worker.postMessage({method:"onMetaData",data:t})}}const Me={RenderDigits:Symbol("RenderDigits"),RenderTimecode:Symbol("RenderTimecode"),Augment:Symbol("Augment")};var Rt=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Pl(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function or(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function l(){return this instanceof l?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(l){var a=Object.getOwnPropertyDescriptor(e,l);Object.defineProperty(n,l,a.get?a:{enumerable:!0,get:function(){return e[l]}})}),n}var Wn={exports:{}},dr=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,ur=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],mr=function(t){var n=t,l=t.indexOf("["),a=t.indexOf("]");l!=-1&&a!=-1&&(t=t.substring(0,l)+t.substring(l,a).replace(/:/g,";")+t.substring(a,t.length));for(var c=dr.exec(t||""),i={},r=14;r--;)i[ur[r]]=c[r]||"";return l!=-1&&a!=-1&&(i.source=n,i.host=i.host.substring(1,i.host.length-1).replace(/;/g,":"),i.authority=i.authority.replace("[","").replace("]","").replace(/;/g,":"),i.ipv6uri=!0),i},Rn={exports:{}},fn,El;function Zr(){if(El)return fn;El=1;var e=1e3,t=e*60,n=t*60,l=n*24,a=l*7,c=l*365.25;fn=function(o,u){u=u||{};var Z=typeof o;if(Z==="string"&&o.length>0)return i(o);if(Z==="number"&&isFinite(o))return u.long?d(o):r(o);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(o))};function i(o){if(o=String(o),!(o.length>100)){var u=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(o);if(u){var Z=parseFloat(u[1]),m=(u[2]||"ms").toLowerCase();switch(m){case"years":case"year":case"yrs":case"yr":case"y":return Z*c;case"weeks":case"week":case"w":return Z*a;case"days":case"day":case"d":return Z*l;case"hours":case"hour":case"hrs":case"hr":case"h":return Z*n;case"minutes":case"minute":case"mins":case"min":case"m":return Z*t;case"seconds":case"second":case"secs":case"sec":case"s":return Z*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return Z;default:return}}}}function r(o){var u=Math.abs(o);return u>=l?Math.round(o/l)+"d":u>=n?Math.round(o/n)+"h":u>=t?Math.round(o/t)+"m":u>=e?Math.round(o/e)+"s":o+"ms"}function d(o){var u=Math.abs(o);return u>=l?s(o,u,l,"day"):u>=n?s(o,u,n,"hour"):u>=t?s(o,u,t,"minute"):u>=e?s(o,u,e,"second"):o+" ms"}function s(o,u,Z,m){var p=u>=Z*1.5;return Math.round(o/Z)+" "+m+(p?"s":"")}return fn}function hr(e){n.debug=n,n.default=n,n.coerce=s,n.disable=i,n.enable=c,n.enabled=r,n.humanize=Zr(),Object.keys(e).forEach(o=>{n[o]=e[o]}),n.instances=[],n.names=[],n.skips=[],n.formatters={};function t(o){let u=0;for(let Z=0;Z<o.length;Z++)u=(u<<5)-u+o.charCodeAt(Z),u|=0;return n.colors[Math.abs(u)%n.colors.length]}n.selectColor=t;function n(o){let u;function Z(...m){if(!Z.enabled)return;const p=Z,h=Number(new Date),R=h-(u||h);p.diff=R,p.prev=u,p.curr=h,u=h,m[0]=n.coerce(m[0]),typeof m[0]!="string"&&m.unshift("%O");let y=0;m[0]=m[0].replace(/%([a-zA-Z%])/g,(L,G)=>{if(L==="%%")return L;y++;const W=n.formatters[G];if(typeof W=="function"){const X=m[y];L=W.call(p,X),m.splice(y,1),y--}return L}),n.formatArgs.call(p,m),(p.log||n.log).apply(p,m)}return Z.namespace=o,Z.enabled=n.enabled(o),Z.useColors=n.useColors(),Z.color=t(o),Z.destroy=l,Z.extend=a,typeof n.init=="function"&&n.init(Z),n.instances.push(Z),Z}function l(){const o=n.instances.indexOf(this);return o!==-1?(n.instances.splice(o,1),!0):!1}function a(o,u){const Z=n(this.namespace+(typeof u>"u"?":":u)+o);return Z.log=this.log,Z}function c(o){n.save(o),n.names=[],n.skips=[];let u;const Z=(typeof o=="string"?o:"").split(/[\s,]+/),m=Z.length;for(u=0;u<m;u++)Z[u]&&(o=Z[u].replace(/\*/g,".*?"),o[0]==="-"?n.skips.push(new RegExp("^"+o.substr(1)+"$")):n.names.push(new RegExp("^"+o+"$")));for(u=0;u<n.instances.length;u++){const p=n.instances[u];p.enabled=n.enabled(p.namespace)}}function i(){const o=[...n.names.map(d),...n.skips.map(d).map(u=>"-"+u)].join(",");return n.enable(""),o}function r(o){if(o[o.length-1]==="*")return!0;let u,Z;for(u=0,Z=n.skips.length;u<Z;u++)if(n.skips[u].test(o))return!1;for(u=0,Z=n.names.length;u<Z;u++)if(n.names[u].test(o))return!0;return!1}function d(o){return o.toString().substring(2,o.toString().length-2).replace(/\.\*\?$/,"*")}function s(o){return o instanceof Error?o.stack||o.message:o}return n.enable(n.load()),n}var br=hr;(function(e,t){t.log=a,t.formatArgs=l,t.save=c,t.load=i,t.useColors=n,t.storage=r(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function n(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function l(s){if(s[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+s[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const o="color: "+this.color;s.splice(1,0,o,"color: inherit");let u=0,Z=0;s[0].replace(/%[a-zA-Z%]/g,m=>{m!=="%%"&&(u++,m==="%c"&&(Z=u))}),s.splice(Z,0,o)}function a(...s){return typeof console=="object"&&console.log&&console.log(...s)}function c(s){try{s?t.storage.setItem("debug",s):t.storage.removeItem("debug")}catch{}}function i(){let s;try{s=t.storage.getItem("debug")}catch{}return!s&&typeof process<"u"&&"env"in process&&(s=process.env.DEBUG),s}function r(){try{return localStorage}catch{}}e.exports=br(t);const{formatters:d}=e.exports;d.j=function(s){try{return JSON.stringify(s)}catch(o){return"[UnexpectedJSONParseError]: "+o.message}}})(Rn,Rn.exports);var ft=Rn.exports,pr=mr,Dl=ft("socket.io-client:url"),Gr=yr;function yr(e,t){var n=e;t=t||typeof location<"u"&&location,e==null&&(e=t.protocol+"//"+t.host),typeof e=="string"&&(e.charAt(0)==="/"&&(e.charAt(1)==="/"?e=t.protocol+e:e=t.host+e),/^(https?|wss?):\/\//.test(e)||(Dl("protocol-less url %s",e),typeof t<"u"?e=t.protocol+"//"+e:e="https://"+e),Dl("parse %s",e),n=pr(e)),n.port||(/^(http|ws)$/.test(n.protocol)?n.port="80":/^(http|ws)s$/.test(n.protocol)&&(n.port="443")),n.path=n.path||"/";var l=n.host.indexOf(":")!==-1,a=l?"["+n.host+"]":n.host;return n.id=n.protocol+"://"+a+":"+n.port,n.href=n.protocol+"://"+a+(t&&t.port===n.port?"":":"+n.port),n}var Lt={},Ln={exports:{}},Yn={exports:{}},et=1e3,tt=et*60,nt=tt*60,lt=nt*24,Xr=lt*365.25,Vr=function(e,t){t=t||{};var n=typeof e;if(n==="string"&&e.length>0)return Wr(e);if(n==="number"&&isNaN(e)===!1)return t.long?fr(e):Rr(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function Wr(e){if(e=String(e),!(e.length>100)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var n=parseFloat(t[1]),l=(t[2]||"ms").toLowerCase();switch(l){case"years":case"year":case"yrs":case"yr":case"y":return n*Xr;case"days":case"day":case"d":return n*lt;case"hours":case"hour":case"hrs":case"hr":case"h":return n*nt;case"minutes":case"minute":case"mins":case"min":case"m":return n*tt;case"seconds":case"second":case"secs":case"sec":case"s":return n*et;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function Rr(e){return e>=lt?Math.round(e/lt)+"d":e>=nt?Math.round(e/nt)+"h":e>=tt?Math.round(e/tt)+"m":e>=et?Math.round(e/et)+"s":e+"ms"}function fr(e){return Yt(e,lt,"day")||Yt(e,nt,"hour")||Yt(e,tt,"minute")||Yt(e,et,"second")||e+" ms"}function Yt(e,t,n){if(!(e<t))return e<t*1.5?Math.floor(e/t)+" "+n:Math.ceil(e/t)+" "+n+"s"}(function(e,t){t=e.exports=l.debug=l.default=l,t.coerce=d,t.disable=i,t.enable=c,t.enabled=r,t.humanize=Vr,t.instances=[],t.names=[],t.skips=[],t.formatters={};function n(s){var o=0,u;for(u in s)o=(o<<5)-o+s.charCodeAt(u),o|=0;return t.colors[Math.abs(o)%t.colors.length]}function l(s){var o;function u(){if(u.enabled){var Z=u,m=+new Date,p=m-(o||m);Z.diff=p,Z.prev=o,Z.curr=m,o=m;for(var h=new Array(arguments.length),R=0;R<h.length;R++)h[R]=arguments[R];h[0]=t.coerce(h[0]),typeof h[0]!="string"&&h.unshift("%O");var y=0;h[0]=h[0].replace(/%([a-zA-Z%])/g,function(L,G){if(L==="%%")return L;y++;var W=t.formatters[G];if(typeof W=="function"){var X=h[y];L=W.call(Z,X),h.splice(y,1),y--}return L}),t.formatArgs.call(Z,h);var V=u.log||t.log||console.log.bind(console);V.apply(Z,h)}}return u.namespace=s,u.enabled=t.enabled(s),u.useColors=t.useColors(),u.color=n(s),u.destroy=a,typeof t.init=="function"&&t.init(u),t.instances.push(u),u}function a(){var s=t.instances.indexOf(this);return s!==-1?(t.instances.splice(s,1),!0):!1}function c(s){t.save(s),t.names=[],t.skips=[];var o,u=(typeof s=="string"?s:"").split(/[\s,]+/),Z=u.length;for(o=0;o<Z;o++)u[o]&&(s=u[o].replace(/\*/g,".*?"),s[0]==="-"?t.skips.push(new RegExp("^"+s.substr(1)+"$")):t.names.push(new RegExp("^"+s+"$")));for(o=0;o<t.instances.length;o++){var m=t.instances[o];m.enabled=t.enabled(m.namespace)}}function i(){t.enable("")}function r(s){if(s[s.length-1]==="*")return!0;var o,u;for(o=0,u=t.skips.length;o<u;o++)if(t.skips[o].test(s))return!1;for(o=0,u=t.names.length;o<u;o++)if(t.names[o].test(s))return!0;return!1}function d(s){return s instanceof Error?s.stack||s.message:s}})(Yn,Yn.exports);var Lr=Yn.exports;(function(e,t){t=e.exports=Lr,t.log=a,t.formatArgs=l,t.save=c,t.load=i,t.useColors=n,t.storage=typeof chrome<"u"&&typeof chrome.storage<"u"?chrome.storage.local:r(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function n(){return typeof window<"u"&&window.process&&window.process.type==="renderer"?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}t.formatters.j=function(d){try{return JSON.stringify(d)}catch(s){return"[UnexpectedJSONParseError]: "+s.message}};function l(d){var s=this.useColors;if(d[0]=(s?"%c":"")+this.namespace+(s?" %c":" ")+d[0]+(s?"%c ":" ")+"+"+t.humanize(this.diff),!!s){var o="color: "+this.color;d.splice(1,0,o,"color: inherit");var u=0,Z=0;d[0].replace(/%[a-zA-Z%]/g,function(m){m!=="%%"&&(u++,m==="%c"&&(Z=u))}),d.splice(Z,0,o)}}function a(){return typeof console=="object"&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function c(d){try{d==null?t.storage.removeItem("debug"):t.storage.debug=d}catch{}}function i(){var d;try{d=t.storage.debug}catch{}return!d&&typeof process<"u"&&"env"in process&&(d=process.env.DEBUG),d}t.enable(i());function r(){try{return window.localStorage}catch{}}})(Ln,Ln.exports);var Yr=Ln.exports,jl={exports:{}};(function(e){e.exports=t;function t(l){if(l)return n(l)}function n(l){for(var a in t.prototype)l[a]=t.prototype[a];return l}t.prototype.on=t.prototype.addEventListener=function(l,a){return this._callbacks=this._callbacks||{},(this._callbacks["$"+l]=this._callbacks["$"+l]||[]).push(a),this},t.prototype.once=function(l,a){function c(){this.off(l,c),a.apply(this,arguments)}return c.fn=a,this.on(l,c),this},t.prototype.off=t.prototype.removeListener=t.prototype.removeAllListeners=t.prototype.removeEventListener=function(l,a){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var c=this._callbacks["$"+l];if(!c)return this;if(arguments.length==1)return delete this._callbacks["$"+l],this;for(var i,r=0;r<c.length;r++)if(i=c[r],i===a||i.fn===a){c.splice(r,1);break}return c.length===0&&delete this._callbacks["$"+l],this},t.prototype.emit=function(l){this._callbacks=this._callbacks||{};for(var a=new Array(arguments.length-1),c=this._callbacks["$"+l],i=1;i<arguments.length;i++)a[i-1]=arguments[i];if(c){c=c.slice(0);for(var i=0,r=c.length;i<r;++i)c[i].apply(this,a)}return this},t.prototype.listeners=function(l){return this._callbacks=this._callbacks||{},this._callbacks["$"+l]||[]},t.prototype.hasListeners=function(l){return!!this.listeners(l).length}})(jl);var vr=jl.exports,vt={},gr={}.toString,vn=Array.isArray||function(e){return gr.call(e)=="[object Array]"},Ol=Sr,Fr=typeof Buffer=="function"&&typeof Buffer.isBuffer=="function",Cr=typeof ArrayBuffer=="function",xr=function(e){return typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(e):e.buffer instanceof ArrayBuffer};function Sr(e){return Fr&&Buffer.isBuffer(e)||Cr&&(e instanceof ArrayBuffer||xr(e))}var gn=vn,Al=Ol,_l=Object.prototype.toString,Ir=typeof Blob=="function"||typeof Blob<"u"&&_l.call(Blob)==="[object BlobConstructor]",zr=typeof File=="function"||typeof File<"u"&&_l.call(File)==="[object FileConstructor]";vt.deconstructPacket=function(e){var t=[],n=e.data,l=e;return l.data=Fn(n,t),l.attachments=t.length,{packet:l,buffers:t}};function Fn(e,t){if(!e)return e;if(Al(e)){var n={_placeholder:!0,num:t.length};return t.push(e),n}else if(gn(e)){for(var l=new Array(e.length),a=0;a<e.length;a++)l[a]=Fn(e[a],t);return l}else if(typeof e=="object"&&!(e instanceof Date)){var l={};for(var c in e)l[c]=Fn(e[c],t);return l}return e}vt.reconstructPacket=function(e,t){return e.data=Cn(e.data,t),e.attachments=void 0,e};function Cn(e,t){if(!e)return e;if(e&&e._placeholder===!0){var n=typeof e.num=="number"&&e.num>=0&&e.num<t.length;if(n)return t[e.num];throw new Error("illegal attachments")}else if(gn(e))for(var l=0;l<e.length;l++)e[l]=Cn(e[l],t);else if(typeof e=="object")for(var a in e)e[a]=Cn(e[a],t);return e}vt.removeBlobs=function(e,t){function n(c,i,r){if(!c)return c;if(Ir&&c instanceof Blob||zr&&c instanceof File){l++;var d=new FileReader;d.onload=function(){r?r[i]=this.result:a=this.result,--l||t(a)},d.readAsArrayBuffer(c)}else if(gn(c))for(var s=0;s<c.length;s++)n(c[s],s,c);else if(typeof c=="object"&&!Al(c))for(var o in c)n(c[o],o,c)}var l=0,a=e;n(a),l||t(a)},function(e){var t=Yr("socket.io-parser"),n=vr,l=vt,a=vn,c=Ol;e.protocol=4,e.types=["CONNECT","DISCONNECT","EVENT","ACK","ERROR","BINARY_EVENT","BINARY_ACK"],e.CONNECT=0,e.DISCONNECT=1,e.EVENT=2,e.ACK=3,e.ERROR=4,e.BINARY_EVENT=5,e.BINARY_ACK=6,e.Encoder=i,e.Decoder=u;function i(){}var r=e.ERROR+'"encode error"';i.prototype.encode=function(y,V){if(t("encoding packet %j",y),e.BINARY_EVENT===y.type||e.BINARY_ACK===y.type)o(y,V);else{var L=d(y);V([L])}};function d(y){var V=""+y.type;if((e.BINARY_EVENT===y.type||e.BINARY_ACK===y.type)&&(V+=y.attachments+"-"),y.nsp&&y.nsp!=="/"&&(V+=y.nsp+","),y.id!=null&&(V+=y.id),y.data!=null){var L=s(y.data);if(L!==!1)V+=L;else return r}return t("encoded %j as %s",y,V),V}function s(y){try{return JSON.stringify(y)}catch{return!1}}function o(y,V){function L(G){var W=l.deconstructPacket(G),X=d(W.packet),b=W.buffers;b.unshift(X),V(b)}l.removeBlobs(y,L)}function u(){this.reconstructor=null}n(u.prototype),u.prototype.add=function(y){var V;if(typeof y=="string"){if(this.reconstructor)throw new Error("got plaintext data when reconstructing a packet");V=m(y),e.BINARY_EVENT===V.type||e.BINARY_ACK===V.type?(this.reconstructor=new h(V),this.reconstructor.reconPack.attachments===0&&this.emit("decoded",V)):this.emit("decoded",V)}else if(c(y)||y.base64)if(this.reconstructor)V=this.reconstructor.takeBinaryData(y),V&&(this.reconstructor=null,this.emit("decoded",V));else throw new Error("got binary data when not reconstructing a packet");else throw new Error("Unknown type: "+y)};function Z(y,V){switch(y){case 0:return typeof V=="object";case 1:return V===void 0;case 4:return typeof V=="string"||typeof V=="object";case 2:case 5:return a(V)&&(typeof V[0]=="string"||typeof V[0]=="number");case 3:case 6:return a(V)}}function m(y){var V=0,L={type:Number(y.charAt(0))};if(e.types[L.type]==null)return R("unknown packet type "+L.type);if(e.BINARY_EVENT===L.type||e.BINARY_ACK===L.type){for(var G=V+1;y.charAt(++V)!=="-"&&V!=y.length;);var W=y.substring(G,V);if(W!=Number(W)||y.charAt(V)!=="-")throw new Error("Illegal attachments");L.attachments=Number(W)}if(y.charAt(V+1)==="/"){for(var G=V+1;++V;){var X=y.charAt(V);if(X===","||V===y.length)break}L.nsp=y.substring(G,V)}else L.nsp="/";var b=y.charAt(V+1);if(b!==""&&Number(b)==b){for(var G=V+1;++V;){var X=y.charAt(V);if(X==null||Number(X)!=X){--V;break}if(V===y.length)break}L.id=Number(y.substring(G,V+1))}if(y.charAt(++V)){var f=p(y.substr(V));if(Z(L.type,f))L.data=f;else throw new Error("invalid payload")}return t("decoded %s as %j",y,L),L}function p(y){try{return JSON.parse(y)}catch{return!1}}u.prototype.destroy=function(){this.reconstructor&&this.reconstructor.finishedReconstruction()};function h(y){this.reconPack=y,this.buffers=[]}h.prototype.takeBinaryData=function(y){if(this.buffers.push(y),this.buffers.length===this.reconPack.attachments){var V=l.reconstructPacket(this.reconPack,this.buffers);return this.finishedReconstruction(),V}return null},h.prototype.finishedReconstruction=function(){this.reconPack=null,this.buffers=[]};function R(y){return{type:e.ERROR,data:"parser error: "+y}}}(Lt);var xn={exports:{}},gt={},Sn={exports:{}};try{Sn.exports=typeof XMLHttpRequest<"u"&&"withCredentials"in new XMLHttpRequest}catch{Sn.exports=!1}var Mr=Sn.exports,In=function(){return typeof self<"u"?self:typeof window<"u"?window:Function("return this")()}(),Jr=Mr,Nr=In,zn=function(e){var t=e.xdomain,n=e.xscheme,l=e.enablesXDR;try{if(typeof XMLHttpRequest<"u"&&(!t||Jr))return new XMLHttpRequest}catch{}try{if(typeof XDomainRequest<"u"&&!n&&l)return new XDomainRequest}catch{}if(!t)try{return new Nr[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP")}catch{}},Mn={exports:{}},pe={},kr=Object.keys||function(t){var n=[],l=Object.prototype.hasOwnProperty;for(var a in t)l.call(t,a)&&n.push(a);return n},Kr=vn,$l=Object.prototype.toString,Tr=typeof Blob=="function"||typeof Blob<"u"&&$l.call(Blob)==="[object BlobConstructor]",Hr=typeof File=="function"||typeof File<"u"&&$l.call(File)==="[object FileConstructor]",ql=Ft;function Ft(e){if(!e||typeof e!="object")return!1;if(Kr(e)){for(var t=0,n=e.length;t<n;t++)if(Ft(e[t]))return!0;return!1}if(typeof Buffer=="function"&&Buffer.isBuffer&&Buffer.isBuffer(e)||typeof ArrayBuffer=="function"&&e instanceof ArrayBuffer||Tr&&e instanceof Blob||Hr&&e instanceof File)return!0;if(e.toJSON&&typeof e.toJSON=="function"&&arguments.length===1)return Ft(e.toJSON(),!0);for(var l in e)if(Object.prototype.hasOwnProperty.call(e,l)&&Ft(e[l]))return!0;return!1}var Ur=function(e,t,n){var l=e.byteLength;if(t=t||0,n=n||l,e.slice)return e.slice(t,n);if(t<0&&(t+=l),n<0&&(n+=l),n>l&&(n=l),t>=l||t>=n||l===0)return new ArrayBuffer(0);for(var a=new Uint8Array(e),c=new Uint8Array(n-t),i=t,r=0;i<n;i++,r++)c[r]=a[i];return c.buffer},wr=Br;function Br(e,t,n){var l=!1;return n=n||Qr,a.count=e,e===0?t():a;function a(c,i){if(a.count<=0)throw new Error("after called too many times");--a.count,c?(l=!0,t(c),t=n):a.count===0&&!l&&t(null,i)}}function Qr(){}/*! https://mths.be/utf8js v2.1.2 by @mathias */var re=String.fromCharCode;function ea(e){for(var t=[],n=0,l=e.length,a,c;n<l;)a=e.charCodeAt(n++),a>=55296&&a<=56319&&n<l?(c=e.charCodeAt(n++),(c&64512)==56320?t.push(((a&1023)<<10)+(c&1023)+65536):(t.push(a),n--)):t.push(a);return t}function Pr(e){for(var t=e.length,n=-1,l,a="";++n<t;)l=e[n],l>65535&&(l-=65536,a+=re(l>>>10&1023|55296),l=56320|l&1023),a+=re(l);return a}function ta(e,t){if(e>=55296&&e<=57343){if(t)throw Error("Lone surrogate U+"+e.toString(16).toUpperCase()+" is not a scalar value");return!1}return!0}function Jn(e,t){return re(e>>t&63|128)}function Er(e,t){if(!(e&4294967168))return re(e);var n="";return e&4294965248?e&4294901760?e&4292870144||(n=re(e>>18&7|240),n+=Jn(e,12),n+=Jn(e,6)):(ta(e,t)||(e=65533),n=re(e>>12&15|224),n+=Jn(e,6)):n=re(e>>6&31|192),n+=re(e&63|128),n}function Dr(e,t){t=t||{};for(var n=t.strict!==!1,l=ea(e),a=l.length,c=-1,i,r="";++c<a;)i=l[c],r+=Er(i,n);return r}function Je(){if(se>=xt)throw Error("Invalid byte index");var e=Ct[se]&255;if(se++,(e&192)==128)return e&63;throw Error("Invalid continuation byte")}function jr(e){var t,n,l,a,c;if(se>xt)throw Error("Invalid byte index");if(se==xt)return!1;if(t=Ct[se]&255,se++,!(t&128))return t;if((t&224)==192){if(n=Je(),c=(t&31)<<6|n,c>=128)return c;throw Error("Invalid continuation byte")}if((t&240)==224){if(n=Je(),l=Je(),c=(t&15)<<12|n<<6|l,c>=2048)return ta(c,e)?c:65533;throw Error("Invalid continuation byte")}if((t&248)==240&&(n=Je(),l=Je(),a=Je(),c=(t&7)<<18|n<<12|l<<6|a,c>=65536&&c<=1114111))return c;throw Error("Invalid UTF-8 detected")}var Ct,xt,se;function Or(e,t){t=t||{};var n=t.strict!==!1;Ct=ea(e),xt=Ct.length,se=0;for(var l=[],a;(a=jr(n))!==!1;)l.push(a);return Pr(l)}var Ar={version:"2.1.2",encode:Dr,decode:Or},St={},na;function _r(){return na||(na=1,function(e){St.encode=function(t){var n=new Uint8Array(t),l,a=n.length,c="";for(l=0;l<a;l+=3)c+=e[n[l]>>2],c+=e[(n[l]&3)<<4|n[l+1]>>4],c+=e[(n[l+1]&15)<<2|n[l+2]>>6],c+=e[n[l+2]&63];return a%3===2?c=c.substring(0,c.length-1)+"=":a%3===1&&(c=c.substring(0,c.length-2)+"=="),c},St.decode=function(t){var n=t.length*.75,l=t.length,a,c=0,i,r,d,s;t[t.length-1]==="="&&(n--,t[t.length-2]==="="&&n--);var o=new ArrayBuffer(n),u=new Uint8Array(o);for(a=0;a<l;a+=4)i=e.indexOf(t[a]),r=e.indexOf(t[a+1]),d=e.indexOf(t[a+2]),s=e.indexOf(t[a+3]),u[c++]=i<<2|r>>4,u[c++]=(r&15)<<4|d>>2,u[c++]=(d&3)<<6|s&63;return o}}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")),St}var Nn,la;function $r(){if(la)return Nn;la=1;var e=typeof e<"u"?e:typeof WebKitBlobBuilder<"u"?WebKitBlobBuilder:typeof MSBlobBuilder<"u"?MSBlobBuilder:typeof MozBlobBuilder<"u"?MozBlobBuilder:!1,t=function(){try{var r=new Blob(["hi"]);return r.size===2}catch{return!1}}(),n=t&&function(){try{var r=new Blob([new Uint8Array([1,2])]);return r.size===2}catch{return!1}}(),l=e&&e.prototype.append&&e.prototype.getBlob;function a(r){return r.map(function(d){if(d.buffer instanceof ArrayBuffer){var s=d.buffer;if(d.byteLength!==s.byteLength){var o=new Uint8Array(d.byteLength);o.set(new Uint8Array(s,d.byteOffset,d.byteLength)),s=o.buffer}return s}return d})}function c(r,d){d=d||{};var s=new e;return a(r).forEach(function(o){s.append(o)}),d.type?s.getBlob(d.type):s.getBlob()}function i(r,d){return new Blob(a(r),d||{})}return typeof Blob<"u"&&(c.prototype=Blob.prototype,i.prototype=Blob.prototype),Nn=function(){return t?n?Blob:i:l?c:void 0}(),Nn}(function(e){var t=kr,n=ql,l=Ur,a=wr,c=Ar,i;typeof ArrayBuffer<"u"&&(i=_r());var r=typeof navigator<"u"&&/Android/i.test(navigator.userAgent),d=typeof navigator<"u"&&/PhantomJS/i.test(navigator.userAgent),s=r||d;e.protocol=3;var o=e.packets={open:0,close:1,ping:2,pong:3,message:4,upgrade:5,noop:6},u=t(o),Z={type:"error",data:"parser error"},m=$r();e.encodePacket=function(G,W,X,b){typeof W=="function"&&(b=W,W=!1),typeof X=="function"&&(b=X,X=null);var f=G.data===void 0?void 0:G.data.buffer||G.data;if(typeof ArrayBuffer<"u"&&f instanceof ArrayBuffer)return h(G,W,b);if(typeof m<"u"&&f instanceof m)return y(G,W,b);if(f&&f.base64)return p(G,b);var v=o[G.type];return G.data!==void 0&&(v+=X?c.encode(String(G.data),{strict:!1}):String(G.data)),b(""+v)};function p(G,W){var X="b"+e.packets[G.type]+G.data.data;return W(X)}function h(G,W,X){if(!W)return e.encodeBase64Packet(G,X);var b=G.data,f=new Uint8Array(b),v=new Uint8Array(1+b.byteLength);v[0]=o[G.type];for(var C=0;C<f.length;C++)v[C+1]=f[C];return X(v.buffer)}function R(G,W,X){if(!W)return e.encodeBase64Packet(G,X);var b=new FileReader;return b.onload=function(){e.encodePacket({type:G.type,data:b.result},W,!0,X)},b.readAsArrayBuffer(G.data)}function y(G,W,X){if(!W)return e.encodeBase64Packet(G,X);if(s)return R(G,W,X);var b=new Uint8Array(1);b[0]=o[G.type];var f=new m([b.buffer,G.data]);return X(f)}e.encodeBase64Packet=function(G,W){var X="b"+e.packets[G.type];if(typeof m<"u"&&G.data instanceof m){var b=new FileReader;return b.onload=function(){var F=b.result.split(",")[1];W(X+F)},b.readAsDataURL(G.data)}var f;try{f=String.fromCharCode.apply(null,new Uint8Array(G.data))}catch{for(var v=new Uint8Array(G.data),C=new Array(v.length),Y=0;Y<v.length;Y++)C[Y]=v[Y];f=String.fromCharCode.apply(null,C)}return X+=btoa(f),W(X)},e.decodePacket=function(G,W,X){if(G===void 0)return Z;if(typeof G=="string"){if(G.charAt(0)==="b")return e.decodeBase64Packet(G.substr(1),W);if(X&&(G=V(G),G===!1))return Z;var f=G.charAt(0);return Number(f)!=f||!u[f]?Z:G.length>1?{type:u[f],data:G.substring(1)}:{type:u[f]}}var b=new Uint8Array(G),f=b[0],v=l(G,1);return m&&W==="blob"&&(v=new m([v])),{type:u[f],data:v}};function V(G){try{G=c.decode(G,{strict:!1})}catch{return!1}return G}e.decodeBase64Packet=function(G,W){var X=u[G.charAt(0)];if(!i)return{type:X,data:{base64:!0,data:G.substr(1)}};var b=i.decode(G.substr(1));return W==="blob"&&m&&(b=new m([b])),{type:X,data:b}},e.encodePayload=function(G,W,X){typeof W=="function"&&(X=W,W=null);var b=n(G);if(W&&b)return m&&!s?e.encodePayloadAsBlob(G,X):e.encodePayloadAsArrayBuffer(G,X);if(!G.length)return X("0:");function f(C){return C.length+":"+C}function v(C,Y){e.encodePacket(C,b?W:!1,!1,function(F){Y(null,f(F))})}L(G,v,function(C,Y){return X(Y.join(""))})};function L(G,W,X){for(var b=new Array(G.length),f=a(G.length,X),v=function(Y,F,T){W(F,function(H,U){b[Y]=U,T(H,b)})},C=0;C<G.length;C++)v(C,G[C],f)}e.decodePayload=function(G,W,X){if(typeof G!="string")return e.decodePayloadAsBinary(G,W,X);typeof W=="function"&&(X=W,W=null);var b;if(G==="")return X(Z,0,1);for(var f="",v,C,Y=0,F=G.length;Y<F;Y++){var T=G.charAt(Y);if(T!==":"){f+=T;continue}if(f===""||f!=(v=Number(f))||(C=G.substr(Y+1,v),f!=C.length))return X(Z,0,1);if(C.length){if(b=e.decodePacket(C,W,!1),Z.type===b.type&&Z.data===b.data)return X(Z,0,1);var H=X(b,Y+v,F);if(H===!1)return}Y+=v,f=""}if(f!=="")return X(Z,0,1)},e.encodePayloadAsArrayBuffer=function(G,W){if(!G.length)return W(new ArrayBuffer(0));function X(b,f){e.encodePacket(b,!0,!0,function(v){return f(null,v)})}L(G,X,function(b,f){var v=f.reduce(function(F,T){var H;return typeof T=="string"?H=T.length:H=T.byteLength,F+H.toString().length+H+2},0),C=new Uint8Array(v),Y=0;return f.forEach(function(F){var T=typeof F=="string",H=F;if(T){for(var Ie=new Uint8Array(F.length),U=0;U<F.length;U++)Ie[U]=F.charCodeAt(U);H=Ie.buffer}T?C[Y++]=0:C[Y++]=1;for(var Se=H.byteLength.toString(),U=0;U<Se.length;U++)C[Y++]=parseInt(Se[U]);C[Y++]=255;for(var Ie=new Uint8Array(H),U=0;U<Ie.length;U++)C[Y++]=Ie[U]}),W(C.buffer)})},e.encodePayloadAsBlob=function(G,W){function X(b,f){e.encodePacket(b,!0,!0,function(v){var C=new Uint8Array(1);if(C[0]=1,typeof v=="string"){for(var Y=new Uint8Array(v.length),F=0;F<v.length;F++)Y[F]=v.charCodeAt(F);v=Y.buffer,C[0]=0}for(var T=v instanceof ArrayBuffer?v.byteLength:v.size,H=T.toString(),U=new Uint8Array(H.length+1),F=0;F<H.length;F++)U[F]=parseInt(H[F]);if(U[H.length]=255,m){var Se=new m([C.buffer,U.buffer,v]);f(null,Se)}})}L(G,X,function(b,f){return W(new m(f))})},e.decodePayloadAsBinary=function(G,W,X){typeof W=="function"&&(X=W,W=null);for(var b=G,f=[];b.byteLength>0;){for(var v=new Uint8Array(b),C=v[0]===0,Y="",F=1;v[F]!==255;F++){if(Y.length>310)return X(Z,0,1);Y+=v[F]}b=l(b,2+Y.length),Y=parseInt(Y);var T=l(b,0,Y);if(C)try{T=String.fromCharCode.apply(null,new Uint8Array(T))}catch{var H=new Uint8Array(T);T="";for(var F=0;F<H.length;F++)T+=String.fromCharCode(H[F])}f.push(T),b=l(b,Y)}var U=f.length;f.forEach(function(Se,Ie){X(e.decodePacket(Se,W,!0),Ie,U)})}})(pe);var aa={exports:{}};(function(e){e.exports=t;function t(l){if(l)return n(l)}function n(l){for(var a in t.prototype)l[a]=t.prototype[a];return l}t.prototype.on=t.prototype.addEventListener=function(l,a){return this._callbacks=this._callbacks||{},(this._callbacks["$"+l]=this._callbacks["$"+l]||[]).push(a),this},t.prototype.once=function(l,a){function c(){this.off(l,c),a.apply(this,arguments)}return c.fn=a,this.on(l,c),this},t.prototype.off=t.prototype.removeListener=t.prototype.removeAllListeners=t.prototype.removeEventListener=function(l,a){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var c=this._callbacks["$"+l];if(!c)return this;if(arguments.length==1)return delete this._callbacks["$"+l],this;for(var i,r=0;r<c.length;r++)if(i=c[r],i===a||i.fn===a){c.splice(r,1);break}return c.length===0&&delete this._callbacks["$"+l],this},t.prototype.emit=function(l){this._callbacks=this._callbacks||{};for(var a=new Array(arguments.length-1),c=this._callbacks["$"+l],i=1;i<arguments.length;i++)a[i-1]=arguments[i];if(c){c=c.slice(0);for(var i=0,r=c.length;i<r;++i)c[i].apply(this,a)}return this},t.prototype.listeners=function(l){return this._callbacks=this._callbacks||{},this._callbacks["$"+l]||[]},t.prototype.hasListeners=function(l){return!!this.listeners(l).length}})(aa);var kn=aa.exports,Kn,ca;function Tn(){if(ca)return Kn;ca=1;var e=pe,t=kn;Kn=n;function n(l){this.path=l.path,this.hostname=l.hostname,this.port=l.port,this.secure=l.secure,this.query=l.query,this.timestampParam=l.timestampParam,this.timestampRequests=l.timestampRequests,this.readyState="",this.agent=l.agent||!1,this.socket=l.socket,this.enablesXDR=l.enablesXDR,this.withCredentials=l.withCredentials,this.pfx=l.pfx,this.key=l.key,this.passphrase=l.passphrase,this.cert=l.cert,this.ca=l.ca,this.ciphers=l.ciphers,this.rejectUnauthorized=l.rejectUnauthorized,this.forceNode=l.forceNode,this.isReactNative=l.isReactNative,this.extraHeaders=l.extraHeaders,this.localAddress=l.localAddress}return t(n.prototype),n.prototype.onError=function(l,a){var c=new Error(l);return c.type="TransportError",c.description=a,this.emit("error",c),this},n.prototype.open=function(){return(this.readyState==="closed"||this.readyState==="")&&(this.readyState="opening",this.doOpen()),this},n.prototype.close=function(){return(this.readyState==="opening"||this.readyState==="open")&&(this.doClose(),this.onClose()),this},n.prototype.send=function(l){if(this.readyState==="open")this.write(l);else throw new Error("Transport not open")},n.prototype.onOpen=function(){this.readyState="open",this.writable=!0,this.emit("open")},n.prototype.onData=function(l){var a=e.decodePacket(l,this.socket.binaryType);this.onPacket(a)},n.prototype.onPacket=function(l){this.emit("packet",l)},n.prototype.onClose=function(){this.readyState="closed",this.emit("close")},Kn}var at={};at.encode=function(e){var t="";for(var n in e)e.hasOwnProperty(n)&&(t.length&&(t+="&"),t+=encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t},at.decode=function(e){for(var t={},n=e.split("&"),l=0,a=n.length;l<a;l++){var c=n[l].split("=");t[decodeURIComponent(c[0])]=decodeURIComponent(c[1])}return t};var It=function(e,t){var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e},ia="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),zt=64,ra={},sa=0,oe=0,oa;function Hn(e){var t="";do t=ia[e%zt]+t,e=Math.floor(e/zt);while(e>0);return t}function qr(e){var t=0;for(oe=0;oe<e.length;oe++)t=t*zt+ra[e.charAt(oe)];return t}function Un(){var e=Hn(+new Date);return e!==oa?(sa=0,oa=e):e+"."+Hn(sa++)}for(;oe<zt;oe++)ra[ia[oe]]=oe;Un.encode=Hn,Un.decode=qr;var da=Un,wn={exports:{}},Bn={exports:{}},ct=1e3,it=ct*60,rt=it*60,st=rt*24,es=st*365.25,ts=function(e,t){t=t||{};var n=typeof e;if(n==="string"&&e.length>0)return ns(e);if(n==="number"&&isNaN(e)===!1)return t.long?as(e):ls(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function ns(e){if(e=String(e),!(e.length>100)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var n=parseFloat(t[1]),l=(t[2]||"ms").toLowerCase();switch(l){case"years":case"year":case"yrs":case"yr":case"y":return n*es;case"days":case"day":case"d":return n*st;case"hours":case"hour":case"hrs":case"hr":case"h":return n*rt;case"minutes":case"minute":case"mins":case"min":case"m":return n*it;case"seconds":case"second":case"secs":case"sec":case"s":return n*ct;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function ls(e){return e>=st?Math.round(e/st)+"d":e>=rt?Math.round(e/rt)+"h":e>=it?Math.round(e/it)+"m":e>=ct?Math.round(e/ct)+"s":e+"ms"}function as(e){return Mt(e,st,"day")||Mt(e,rt,"hour")||Mt(e,it,"minute")||Mt(e,ct,"second")||e+" ms"}function Mt(e,t,n){if(!(e<t))return e<t*1.5?Math.floor(e/t)+" "+n:Math.ceil(e/t)+" "+n+"s"}(function(e,t){t=e.exports=l.debug=l.default=l,t.coerce=d,t.disable=i,t.enable=c,t.enabled=r,t.humanize=ts,t.instances=[],t.names=[],t.skips=[],t.formatters={};function n(s){var o=0,u;for(u in s)o=(o<<5)-o+s.charCodeAt(u),o|=0;return t.colors[Math.abs(o)%t.colors.length]}function l(s){var o;function u(){if(u.enabled){var Z=u,m=+new Date,p=m-(o||m);Z.diff=p,Z.prev=o,Z.curr=m,o=m;for(var h=new Array(arguments.length),R=0;R<h.length;R++)h[R]=arguments[R];h[0]=t.coerce(h[0]),typeof h[0]!="string"&&h.unshift("%O");var y=0;h[0]=h[0].replace(/%([a-zA-Z%])/g,function(L,G){if(L==="%%")return L;y++;var W=t.formatters[G];if(typeof W=="function"){var X=h[y];L=W.call(Z,X),h.splice(y,1),y--}return L}),t.formatArgs.call(Z,h);var V=u.log||t.log||console.log.bind(console);V.apply(Z,h)}}return u.namespace=s,u.enabled=t.enabled(s),u.useColors=t.useColors(),u.color=n(s),u.destroy=a,typeof t.init=="function"&&t.init(u),t.instances.push(u),u}function a(){var s=t.instances.indexOf(this);return s!==-1?(t.instances.splice(s,1),!0):!1}function c(s){t.save(s),t.names=[],t.skips=[];var o,u=(typeof s=="string"?s:"").split(/[\s,]+/),Z=u.length;for(o=0;o<Z;o++)u[o]&&(s=u[o].replace(/\*/g,".*?"),s[0]==="-"?t.skips.push(new RegExp("^"+s.substr(1)+"$")):t.names.push(new RegExp("^"+s+"$")));for(o=0;o<t.instances.length;o++){var m=t.instances[o];m.enabled=t.enabled(m.namespace)}}function i(){t.enable("")}function r(s){if(s[s.length-1]==="*")return!0;var o,u;for(o=0,u=t.skips.length;o<u;o++)if(t.skips[o].test(s))return!1;for(o=0,u=t.names.length;o<u;o++)if(t.names[o].test(s))return!0;return!1}function d(s){return s instanceof Error?s.stack||s.message:s}})(Bn,Bn.exports);var cs=Bn.exports;(function(e,t){t=e.exports=cs,t.log=a,t.formatArgs=l,t.save=c,t.load=i,t.useColors=n,t.storage=typeof chrome<"u"&&typeof chrome.storage<"u"?chrome.storage.local:r(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function n(){return typeof window<"u"&&window.process&&window.process.type==="renderer"?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}t.formatters.j=function(d){try{return JSON.stringify(d)}catch(s){return"[UnexpectedJSONParseError]: "+s.message}};function l(d){var s=this.useColors;if(d[0]=(s?"%c":"")+this.namespace+(s?" %c":" ")+d[0]+(s?"%c ":" ")+"+"+t.humanize(this.diff),!!s){var o="color: "+this.color;d.splice(1,0,o,"color: inherit");var u=0,Z=0;d[0].replace(/%[a-zA-Z%]/g,function(m){m!=="%%"&&(u++,m==="%c"&&(Z=u))}),d.splice(Z,0,o)}}function a(){return typeof console=="object"&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function c(d){try{d==null?t.storage.removeItem("debug"):t.storage.debug=d}catch{}}function i(){var d;try{d=t.storage.debug}catch{}return!d&&typeof process<"u"&&"env"in process&&(d=process.env.DEBUG),d}t.enable(i());function r(){try{return window.localStorage}catch{}}})(wn,wn.exports);var Jt=wn.exports,ua=Tn(),is=at,ma=pe,rs=It,ss=da,_=Jt("engine.io-client:polling"),Za=te,os=function(){var e=zn,t=new e({xdomain:!1});return t.responseType!=null}();function te(e){var t=e&&e.forceBase64;(!os||t)&&(this.supportsBinary=!1),ua.call(this,e)}rs(te,ua),te.prototype.name="polling",te.prototype.doOpen=function(){this.poll()},te.prototype.pause=function(e){var t=this;this.readyState="pausing";function n(){_("paused"),t.readyState="paused",e()}if(this.polling||!this.writable){var l=0;this.polling&&(_("we are currently polling - waiting to pause"),l++,this.once("pollComplete",function(){_("pre-pause polling complete"),--l||n()})),this.writable||(_("we are currently writing - waiting to pause"),l++,this.once("drain",function(){_("pre-pause writing complete"),--l||n()}))}else n()},te.prototype.poll=function(){_("polling"),this.polling=!0,this.doPoll(),this.emit("poll")},te.prototype.onData=function(e){var t=this;_("polling got data %s",e);var n=function(l,a,c){if(t.readyState==="opening"&&t.onOpen(),l.type==="close")return t.onClose(),!1;t.onPacket(l)};ma.decodePayload(e,this.socket.binaryType,n),this.readyState!=="closed"&&(this.polling=!1,this.emit("pollComplete"),this.readyState==="open"?this.poll():_('ignoring poll - transport state "%s"',this.readyState))},te.prototype.doClose=function(){var e=this;function t(){_("writing close packet"),e.write([{type:"close"}])}this.readyState==="open"?(_("transport open - closing"),t()):(_("transport not open - deferring close"),this.once("open",t))},te.prototype.write=function(e){var t=this;this.writable=!1;var n=function(){t.writable=!0,t.emit("drain")};ma.encodePayload(e,this.supportsBinary,function(l){t.doWrite(l,n)})},te.prototype.uri=function(){var e=this.query||{},t=this.secure?"https":"http",n="";this.timestampRequests!==!1&&(e[this.timestampParam]=ss()),!this.supportsBinary&&!e.sid&&(e.b64=1),e=is.encode(e),this.port&&(t==="https"&&Number(this.port)!==443||t==="http"&&Number(this.port)!==80)&&(n=":"+this.port),e.length&&(e="?"+e);var l=this.hostname.indexOf(":")!==-1;return t+"://"+(l?"["+this.hostname+"]":this.hostname)+n+this.path+e};var ds=zn,ha=Za,us=kn,ms=It,Qn=Jt("engine.io-client:polling-xhr"),Zs=In;Mn.exports=Ne,Mn.exports.Request=w;function ba(){}function Ne(e){if(ha.call(this,e),this.requestTimeout=e.requestTimeout,this.extraHeaders=e.extraHeaders,typeof location<"u"){var t=location.protocol==="https:",n=location.port;n||(n=t?443:80),this.xd=typeof location<"u"&&e.hostname!==location.hostname||n!==e.port,this.xs=e.secure!==t}}ms(Ne,ha),Ne.prototype.supportsBinary=!0,Ne.prototype.request=function(e){return e=e||{},e.uri=this.uri(),e.xd=this.xd,e.xs=this.xs,e.agent=this.agent||!1,e.supportsBinary=this.supportsBinary,e.enablesXDR=this.enablesXDR,e.withCredentials=this.withCredentials,e.pfx=this.pfx,e.key=this.key,e.passphrase=this.passphrase,e.cert=this.cert,e.ca=this.ca,e.ciphers=this.ciphers,e.rejectUnauthorized=this.rejectUnauthorized,e.requestTimeout=this.requestTimeout,e.extraHeaders=this.extraHeaders,new w(e)},Ne.prototype.doWrite=function(e,t){var n=typeof e!="string"&&e!==void 0,l=this.request({method:"POST",data:e,isBinary:n}),a=this;l.on("success",t),l.on("error",function(c){a.onError("xhr post error",c)}),this.sendXhr=l},Ne.prototype.doPoll=function(){Qn("xhr poll");var e=this.request(),t=this;e.on("data",function(n){t.onData(n)}),e.on("error",function(n){t.onError("xhr poll error",n)}),this.pollXhr=e};function w(e){this.method=e.method||"GET",this.uri=e.uri,this.xd=!!e.xd,this.xs=!!e.xs,this.async=e.async!==!1,this.data=e.data!==void 0?e.data:null,this.agent=e.agent,this.isBinary=e.isBinary,this.supportsBinary=e.supportsBinary,this.enablesXDR=e.enablesXDR,this.withCredentials=e.withCredentials,this.requestTimeout=e.requestTimeout,this.pfx=e.pfx,this.key=e.key,this.passphrase=e.passphrase,this.cert=e.cert,this.ca=e.ca,this.ciphers=e.ciphers,this.rejectUnauthorized=e.rejectUnauthorized,this.extraHeaders=e.extraHeaders,this.create()}if(us(w.prototype),w.prototype.create=function(){var e={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};e.pfx=this.pfx,e.key=this.key,e.passphrase=this.passphrase,e.cert=this.cert,e.ca=this.ca,e.ciphers=this.ciphers,e.rejectUnauthorized=this.rejectUnauthorized;var t=this.xhr=new ds(e),n=this;try{Qn("xhr open %s: %s",this.method,this.uri),t.open(this.method,this.uri,this.async);try{if(this.extraHeaders){t.setDisableHeaderCheck&&t.setDisableHeaderCheck(!0);for(var l in this.extraHeaders)this.extraHeaders.hasOwnProperty(l)&&t.setRequestHeader(l,this.extraHeaders[l])}}catch{}if(this.method==="POST")try{this.isBinary?t.setRequestHeader("Content-type","application/octet-stream"):t.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch{}try{t.setRequestHeader("Accept","*/*")}catch{}"withCredentials"in t&&(t.withCredentials=this.withCredentials),this.requestTimeout&&(t.timeout=this.requestTimeout),this.hasXDR()?(t.onload=function(){n.onLoad()},t.onerror=function(){n.onError(t.responseText)}):t.onreadystatechange=function(){if(t.readyState===2)try{var a=t.getResponseHeader("Content-Type");(n.supportsBinary&&a==="application/octet-stream"||a==="application/octet-stream; charset=UTF-8")&&(t.responseType="arraybuffer")}catch{}t.readyState===4&&(t.status===200||t.status===1223?n.onLoad():setTimeout(function(){n.onError(typeof t.status=="number"?t.status:0)},0))},Qn("xhr data %s",this.data),t.send(this.data)}catch(a){setTimeout(function(){n.onError(a)},0);return}typeof document<"u"&&(this.index=w.requestsCount++,w.requests[this.index]=this)},w.prototype.onSuccess=function(){this.emit("success"),this.cleanup()},w.prototype.onData=function(e){this.emit("data",e),this.onSuccess()},w.prototype.onError=function(e){this.emit("error",e),this.cleanup(!0)},w.prototype.cleanup=function(e){if(!(typeof this.xhr>"u"||this.xhr===null)){if(this.hasXDR()?this.xhr.onload=this.xhr.onerror=ba:this.xhr.onreadystatechange=ba,e)try{this.xhr.abort()}catch{}typeof document<"u"&&delete w.requests[this.index],this.xhr=null}},w.prototype.onLoad=function(){var e;try{var t;try{t=this.xhr.getResponseHeader("Content-Type")}catch{}t==="application/octet-stream"||t==="application/octet-stream; charset=UTF-8"?e=this.xhr.response||this.xhr.responseText:e=this.xhr.responseText}catch(n){this.onError(n)}e!=null&&this.onData(e)},w.prototype.hasXDR=function(){return typeof XDomainRequest<"u"&&!this.xs&&this.enablesXDR},w.prototype.abort=function(){this.cleanup()},w.requestsCount=0,w.requests={},typeof document<"u"){if(typeof attachEvent=="function")attachEvent("onunload",pa);else if(typeof addEventListener=="function"){var hs="onpagehide"in Zs?"pagehide":"unload";addEventListener(hs,pa,!1)}}function pa(){for(var e in w.requests)w.requests.hasOwnProperty(e)&&w.requests[e].abort()}var bs=Mn.exports,Pn=Za,ps=It,Ga=In,Gs=ke,ys=/\n/g,Xs=/\\n/g,Nt;function Vs(){}function ke(e){Pn.call(this,e),this.query=this.query||{},Nt||(Nt=Ga.___eio=Ga.___eio||[]),this.index=Nt.length;var t=this;Nt.push(function(n){t.onData(n)}),this.query.j=this.index,typeof addEventListener=="function"&&addEventListener("beforeunload",function(){t.script&&(t.script.onerror=Vs)},!1)}ps(ke,Pn),ke.prototype.supportsBinary=!1,ke.prototype.doClose=function(){this.script&&(this.script.parentNode.removeChild(this.script),this.script=null),this.form&&(this.form.parentNode.removeChild(this.form),this.form=null,this.iframe=null),Pn.prototype.doClose.call(this)},ke.prototype.doPoll=function(){var e=this,t=document.createElement("script");this.script&&(this.script.parentNode.removeChild(this.script),this.script=null),t.async=!0,t.src=this.uri(),t.onerror=function(a){e.onError("jsonp poll error",a)};var n=document.getElementsByTagName("script")[0];n?n.parentNode.insertBefore(t,n):(document.head||document.body).appendChild(t),this.script=t;var l=typeof navigator<"u"&&/gecko/i.test(navigator.userAgent);l&&setTimeout(function(){var a=document.createElement("iframe");document.body.appendChild(a),document.body.removeChild(a)},100)},ke.prototype.doWrite=function(e,t){var n=this;if(!this.form){var l=document.createElement("form"),a=document.createElement("textarea"),c=this.iframeId="eio_iframe_"+this.index,i;l.className="socketio",l.style.position="absolute",l.style.top="-1000px",l.style.left="-1000px",l.target=c,l.method="POST",l.setAttribute("accept-charset","utf-8"),a.name="d",l.appendChild(a),document.body.appendChild(l),this.form=l,this.area=a}this.form.action=this.uri();function r(){d(),t()}function d(){if(n.iframe)try{n.form.removeChild(n.iframe)}catch(o){n.onError("jsonp polling iframe removal error",o)}try{var s='<iframe src="javascript:0" name="'+n.iframeId+'">';i=document.createElement(s)}catch{i=document.createElement("iframe"),i.name=n.iframeId,i.src="javascript:0"}i.id=n.iframeId,n.form.appendChild(i),n.iframe=i}d(),e=e.replace(Xs,`\\
|
|
266
|
+
`),this.area.value=e.replace(ys,"\\n");try{this.form.submit()}catch{}this.iframe.attachEvent?this.iframe.onreadystatechange=function(){n.iframe.readyState==="complete"&&r()}:this.iframe.onload=r};const Ws=or(Object.freeze(Object.defineProperty({__proto__:null,default:{}},Symbol.toStringTag,{value:"Module"})));var En=Tn(),Rs=pe,fs=at,Ls=It,Ys=da,vs=Jt("engine.io-client:websocket"),kt,Dn;if(typeof WebSocket<"u"?kt=WebSocket:typeof self<"u"&&(kt=self.WebSocket||self.MozWebSocket),typeof window>"u")try{Dn=Ws}catch{}var Ke=kt||Dn,gs=A;function A(e){var t=e&&e.forceBase64;t&&(this.supportsBinary=!1),this.perMessageDeflate=e.perMessageDeflate,this.usingBrowserWebSocket=kt&&!e.forceNode,this.protocols=e.protocols,this.usingBrowserWebSocket||(Ke=Dn),En.call(this,e)}Ls(A,En),A.prototype.name="websocket",A.prototype.supportsBinary=!0,A.prototype.doOpen=function(){if(this.check()){var e=this.uri(),t=this.protocols,n={};this.isReactNative||(n.agent=this.agent,n.perMessageDeflate=this.perMessageDeflate,n.pfx=this.pfx,n.key=this.key,n.passphrase=this.passphrase,n.cert=this.cert,n.ca=this.ca,n.ciphers=this.ciphers,n.rejectUnauthorized=this.rejectUnauthorized),this.extraHeaders&&(n.headers=this.extraHeaders),this.localAddress&&(n.localAddress=this.localAddress);try{this.ws=this.usingBrowserWebSocket&&!this.isReactNative?t?new Ke(e,t):new Ke(e):new Ke(e,t,n)}catch(l){return this.emit("error",l)}this.ws.binaryType===void 0&&(this.supportsBinary=!1),this.ws.supports&&this.ws.supports.binary?(this.supportsBinary=!0,this.ws.binaryType="nodebuffer"):this.ws.binaryType="arraybuffer",this.addEventListeners()}},A.prototype.addEventListeners=function(){var e=this;this.ws.onopen=function(){e.onOpen()},this.ws.onclose=function(){e.onClose()},this.ws.onmessage=function(t){e.onData(t.data)},this.ws.onerror=function(t){e.onError("websocket error",t)}},A.prototype.write=function(e){var t=this;this.writable=!1;for(var n=e.length,l=0,a=n;l<a;l++)(function(i){Rs.encodePacket(i,t.supportsBinary,function(r){if(!t.usingBrowserWebSocket){var d={};if(i.options&&(d.compress=i.options.compress),t.perMessageDeflate){var s=typeof r=="string"?Buffer.byteLength(r):r.length;s<t.perMessageDeflate.threshold&&(d.compress=!1)}}try{t.usingBrowserWebSocket?t.ws.send(r):t.ws.send(r,d)}catch{vs("websocket closed before onclose event")}--n||c()})})(e[l]);function c(){t.emit("flush"),setTimeout(function(){t.writable=!0,t.emit("drain")},0)}},A.prototype.onClose=function(){En.prototype.onClose.call(this)},A.prototype.doClose=function(){typeof this.ws<"u"&&this.ws.close()},A.prototype.uri=function(){var e=this.query||{},t=this.secure?"wss":"ws",n="";this.port&&(t==="wss"&&Number(this.port)!==443||t==="ws"&&Number(this.port)!==80)&&(n=":"+this.port),this.timestampRequests&&(e[this.timestampParam]=Ys()),this.supportsBinary||(e.b64=1),e=fs.encode(e),e.length&&(e="?"+e);var l=this.hostname.indexOf(":")!==-1;return t+"://"+(l?"["+this.hostname+"]":this.hostname)+n+this.path+e},A.prototype.check=function(){return!!Ke&&!("__initialize"in Ke&&this.name===A.prototype.name)};var Fs=zn,Cs=bs,xs=Gs,Ss=gs;gt.polling=Is,gt.websocket=Ss;function Is(e){var t,n=!1,l=!1,a=e.jsonp!==!1;if(typeof location<"u"){var c=location.protocol==="https:",i=location.port;i||(i=c?443:80),n=e.hostname!==location.hostname||i!==e.port,l=e.secure!==c}if(e.xdomain=n,e.xscheme=l,t=new Fs(e),"open"in t&&!e.forceJSONP)return new Cs(e);if(!a)throw new Error("JSONP disabled");return new xs(e)}var zs=[].indexOf,ya=function(e,t){if(zs)return e.indexOf(t);for(var n=0;n<e.length;++n)if(e[n]===t)return n;return-1},Ms=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,Js=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],Ns=function(t){var n=t,l=t.indexOf("["),a=t.indexOf("]");l!=-1&&a!=-1&&(t=t.substring(0,l)+t.substring(l,a).replace(/:/g,";")+t.substring(a,t.length));for(var c=Ms.exec(t||""),i={},r=14;r--;)i[Js[r]]=c[r]||"";return l!=-1&&a!=-1&&(i.source=n,i.host=i.host.substring(1,i.host.length-1).replace(/;/g,":"),i.authority=i.authority.replace("[","").replace("]","").replace(/;/g,":"),i.ipv6uri=!0),i.pathNames=ks(i,i.path),i.queryKey=Ks(i,i.query),i};function ks(e,t){var n=/\/{2,9}/g,l=t.replace(n,"/").split("/");return(t.substr(0,1)=="/"||t.length===0)&&l.splice(0,1),t.substr(t.length-1,1)=="/"&&l.splice(l.length-1,1),l}function Ks(e,t){var n={};return t.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(l,a,c){a&&(n[a]=c)}),n}var Ts=gt,Hs=kn,k=Jt("engine.io-client:socket"),Us=ya,Xa=pe,Va=Ns,ws=at,Bs=S;function S(e,t){if(!(this instanceof S))return new S(e,t);t=t||{},e&&typeof e=="object"&&(t=e,e=null),e?(e=Va(e),t.hostname=e.host,t.secure=e.protocol==="https"||e.protocol==="wss",t.port=e.port,e.query&&(t.query=e.query)):t.host&&(t.hostname=Va(t.host).host),this.secure=t.secure!=null?t.secure:typeof location<"u"&&location.protocol==="https:",t.hostname&&!t.port&&(t.port=this.secure?"443":"80"),this.agent=t.agent||!1,this.hostname=t.hostname||(typeof location<"u"?location.hostname:"localhost"),this.port=t.port||(typeof location<"u"&&location.port?location.port:this.secure?443:80),this.query=t.query||{},typeof this.query=="string"&&(this.query=ws.decode(this.query)),this.upgrade=t.upgrade!==!1,this.path=(t.path||"/engine.io").replace(/\/$/,"")+"/",this.forceJSONP=!!t.forceJSONP,this.jsonp=t.jsonp!==!1,this.forceBase64=!!t.forceBase64,this.enablesXDR=!!t.enablesXDR,this.withCredentials=t.withCredentials!==!1,this.timestampParam=t.timestampParam||"t",this.timestampRequests=t.timestampRequests,this.transports=t.transports||["polling","websocket"],this.transportOptions=t.transportOptions||{},this.readyState="",this.writeBuffer=[],this.prevBufferLen=0,this.policyPort=t.policyPort||843,this.rememberUpgrade=t.rememberUpgrade||!1,this.binaryType=null,this.onlyBinaryUpgrades=t.onlyBinaryUpgrades,this.perMessageDeflate=t.perMessageDeflate!==!1?t.perMessageDeflate||{}:!1,this.perMessageDeflate===!0&&(this.perMessageDeflate={}),this.perMessageDeflate&&this.perMessageDeflate.threshold==null&&(this.perMessageDeflate.threshold=1024),this.pfx=t.pfx||null,this.key=t.key||null,this.passphrase=t.passphrase||null,this.cert=t.cert||null,this.ca=t.ca||null,this.ciphers=t.ciphers||null,this.rejectUnauthorized=t.rejectUnauthorized===void 0?!0:t.rejectUnauthorized,this.forceNode=!!t.forceNode,this.isReactNative=typeof navigator<"u"&&typeof navigator.product=="string"&&navigator.product.toLowerCase()==="reactnative",(typeof self>"u"||this.isReactNative)&&(t.extraHeaders&&Object.keys(t.extraHeaders).length>0&&(this.extraHeaders=t.extraHeaders),t.localAddress&&(this.localAddress=t.localAddress)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingIntervalTimer=null,this.pingTimeoutTimer=null,this.open()}S.priorWebsocketSuccess=!1,Hs(S.prototype),S.protocol=Xa.protocol,S.Socket=S,S.Transport=Tn(),S.transports=gt,S.parser=pe,S.prototype.createTransport=function(e){k('creating transport "%s"',e);var t=Qs(this.query);t.EIO=Xa.protocol,t.transport=e;var n=this.transportOptions[e]||{};this.id&&(t.sid=this.id);var l=new Ts[e]({query:t,socket:this,agent:n.agent||this.agent,hostname:n.hostname||this.hostname,port:n.port||this.port,secure:n.secure||this.secure,path:n.path||this.path,forceJSONP:n.forceJSONP||this.forceJSONP,jsonp:n.jsonp||this.jsonp,forceBase64:n.forceBase64||this.forceBase64,enablesXDR:n.enablesXDR||this.enablesXDR,withCredentials:n.withCredentials||this.withCredentials,timestampRequests:n.timestampRequests||this.timestampRequests,timestampParam:n.timestampParam||this.timestampParam,policyPort:n.policyPort||this.policyPort,pfx:n.pfx||this.pfx,key:n.key||this.key,passphrase:n.passphrase||this.passphrase,cert:n.cert||this.cert,ca:n.ca||this.ca,ciphers:n.ciphers||this.ciphers,rejectUnauthorized:n.rejectUnauthorized||this.rejectUnauthorized,perMessageDeflate:n.perMessageDeflate||this.perMessageDeflate,extraHeaders:n.extraHeaders||this.extraHeaders,forceNode:n.forceNode||this.forceNode,localAddress:n.localAddress||this.localAddress,requestTimeout:n.requestTimeout||this.requestTimeout,protocols:n.protocols||void 0,isReactNative:this.isReactNative});return l};function Qs(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}S.prototype.open=function(){var e;if(this.rememberUpgrade&&S.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1)e="websocket";else if(this.transports.length===0){var t=this;setTimeout(function(){t.emit("error","No transports available")},0);return}else e=this.transports[0];this.readyState="opening";try{e=this.createTransport(e)}catch{this.transports.shift(),this.open();return}e.open(),this.setTransport(e)},S.prototype.setTransport=function(e){k("setting transport %s",e.name);var t=this;this.transport&&(k("clearing existing transport %s",this.transport.name),this.transport.removeAllListeners()),this.transport=e,e.on("drain",function(){t.onDrain()}).on("packet",function(n){t.onPacket(n)}).on("error",function(n){t.onError(n)}).on("close",function(){t.onClose("transport close")})},S.prototype.probe=function(e){k('probing transport "%s"',e);var t=this.createTransport(e,{probe:1}),n=!1,l=this;S.priorWebsocketSuccess=!1;function a(){if(l.onlyBinaryUpgrades){var u=!this.supportsBinary&&l.transport.supportsBinary;n=n||u}n||(k('probe transport "%s" opened',e),t.send([{type:"ping",data:"probe"}]),t.once("packet",function(Z){if(!n)if(Z.type==="pong"&&Z.data==="probe"){if(k('probe transport "%s" pong',e),l.upgrading=!0,l.emit("upgrading",t),!t)return;S.priorWebsocketSuccess=t.name==="websocket",k('pausing current transport "%s"',l.transport.name),l.transport.pause(function(){n||l.readyState!=="closed"&&(k("changing transport and sending upgrade packet"),o(),l.setTransport(t),t.send([{type:"upgrade"}]),l.emit("upgrade",t),t=null,l.upgrading=!1,l.flush())})}else{k('probe transport "%s" failed',e);var m=new Error("probe error");m.transport=t.name,l.emit("upgradeError",m)}}))}function c(){n||(n=!0,o(),t.close(),t=null)}function i(u){var Z=new Error("probe error: "+u);Z.transport=t.name,c(),k('probe transport "%s" failed because of error: %s',e,u),l.emit("upgradeError",Z)}function r(){i("transport closed")}function d(){i("socket closed")}function s(u){t&&u.name!==t.name&&(k('"%s" works - aborting "%s"',u.name,t.name),c())}function o(){t.removeListener("open",a),t.removeListener("error",i),t.removeListener("close",r),l.removeListener("close",d),l.removeListener("upgrading",s)}t.once("open",a),t.once("error",i),t.once("close",r),this.once("close",d),this.once("upgrading",s),t.open()},S.prototype.onOpen=function(){if(k("socket open"),this.readyState="open",S.priorWebsocketSuccess=this.transport.name==="websocket",this.emit("open"),this.flush(),this.readyState==="open"&&this.upgrade&&this.transport.pause){k("starting upgrade probes");for(var e=0,t=this.upgrades.length;e<t;e++)this.probe(this.upgrades[e])}},S.prototype.onPacket=function(e){if(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing")switch(k('socket receive: type "%s", data "%s"',e.type,e.data),this.emit("packet",e),this.emit("heartbeat"),e.type){case"open":this.onHandshake(JSON.parse(e.data));break;case"pong":this.setPing(),this.emit("pong");break;case"error":var t=new Error("server error");t.code=e.data,this.onError(t);break;case"message":this.emit("data",e.data),this.emit("message",e.data);break}else k('packet received with socket readyState "%s"',this.readyState)},S.prototype.onHandshake=function(e){this.emit("handshake",e),this.id=e.sid,this.transport.query.sid=e.sid,this.upgrades=this.filterUpgrades(e.upgrades),this.pingInterval=e.pingInterval,this.pingTimeout=e.pingTimeout,this.onOpen(),this.readyState!=="closed"&&(this.setPing(),this.removeListener("heartbeat",this.onHeartbeat),this.on("heartbeat",this.onHeartbeat))},S.prototype.onHeartbeat=function(e){clearTimeout(this.pingTimeoutTimer);var t=this;t.pingTimeoutTimer=setTimeout(function(){t.readyState!=="closed"&&t.onClose("ping timeout")},e||t.pingInterval+t.pingTimeout)},S.prototype.setPing=function(){var e=this;clearTimeout(e.pingIntervalTimer),e.pingIntervalTimer=setTimeout(function(){k("writing ping packet - expecting pong within %sms",e.pingTimeout),e.ping(),e.onHeartbeat(e.pingTimeout)},e.pingInterval)},S.prototype.ping=function(){var e=this;this.sendPacket("ping",function(){e.emit("ping")})},S.prototype.onDrain=function(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,this.writeBuffer.length===0?this.emit("drain"):this.flush()},S.prototype.flush=function(){this.readyState!=="closed"&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length&&(k("flushing %d packets in socket",this.writeBuffer.length),this.transport.send(this.writeBuffer),this.prevBufferLen=this.writeBuffer.length,this.emit("flush"))},S.prototype.write=S.prototype.send=function(e,t,n){return this.sendPacket("message",e,t,n),this},S.prototype.sendPacket=function(e,t,n,l){if(typeof t=="function"&&(l=t,t=void 0),typeof n=="function"&&(l=n,n=null),!(this.readyState==="closing"||this.readyState==="closed")){n=n||{},n.compress=n.compress!==!1;var a={type:e,data:t,options:n};this.emit("packetCreate",a),this.writeBuffer.push(a),l&&this.once("flush",l),this.flush()}},S.prototype.close=function(){if(this.readyState==="opening"||this.readyState==="open"){this.readyState="closing";var e=this;this.writeBuffer.length?this.once("drain",function(){this.upgrading?l():t()}):this.upgrading?l():t()}function t(){e.onClose("forced close"),k("socket closing - telling transport to close"),e.transport.close()}function n(){e.removeListener("upgrade",n),e.removeListener("upgradeError",n),t()}function l(){e.once("upgrade",n),e.once("upgradeError",n)}return this},S.prototype.onError=function(e){k("socket error %j",e),S.priorWebsocketSuccess=!1,this.emit("error",e),this.onClose("transport error",e)},S.prototype.onClose=function(e,t){if(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing"){k('socket close with reason: "%s"',e);var n=this;clearTimeout(this.pingIntervalTimer),clearTimeout(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),this.readyState="closed",this.id=null,this.emit("close",e,t),n.writeBuffer=[],n.prevBufferLen=0}},S.prototype.filterUpgrades=function(e){for(var t=[],n=0,l=e.length;n<l;n++)~Us(this.transports,e[n])&&t.push(e[n]);return t},xn.exports=Bs,xn.exports.parser=pe;var Ps=xn.exports,Wa={exports:{}},Ra={exports:{}};(function(e){e.exports=t;function t(l){if(l)return n(l)}function n(l){for(var a in t.prototype)l[a]=t.prototype[a];return l}t.prototype.on=t.prototype.addEventListener=function(l,a){return this._callbacks=this._callbacks||{},(this._callbacks["$"+l]=this._callbacks["$"+l]||[]).push(a),this},t.prototype.once=function(l,a){function c(){this.off(l,c),a.apply(this,arguments)}return c.fn=a,this.on(l,c),this},t.prototype.off=t.prototype.removeListener=t.prototype.removeAllListeners=t.prototype.removeEventListener=function(l,a){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var c=this._callbacks["$"+l];if(!c)return this;if(arguments.length==1)return delete this._callbacks["$"+l],this;for(var i,r=0;r<c.length;r++)if(i=c[r],i===a||i.fn===a){c.splice(r,1);break}return this},t.prototype.emit=function(l){this._callbacks=this._callbacks||{};var a=[].slice.call(arguments,1),c=this._callbacks["$"+l];if(c){c=c.slice(0);for(var i=0,r=c.length;i<r;++i)c[i].apply(this,a)}return this},t.prototype.listeners=function(l){return this._callbacks=this._callbacks||{},this._callbacks["$"+l]||[]},t.prototype.hasListeners=function(l){return!!this.listeners(l).length}})(Ra);var fa=Ra.exports,Es=Ds;function Ds(e,t){var n=[];t=t||0;for(var l=t||0;l<e.length;l++)n[l-t]=e[l];return n}var La=js;function js(e,t,n){return e.on(t,n),{destroy:function(){e.removeListener(t,n)}}}var Ya=[].slice,va=function(e,t){if(typeof t=="string"&&(t=e[t]),typeof t!="function")throw new Error("bind() requires a function");var n=Ya.call(arguments,2);return function(){return t.apply(e,n.concat(Ya.call(arguments)))}},jn={};jn.encode=function(e){var t="";for(var n in e)e.hasOwnProperty(n)&&(t.length&&(t+="&"),t+=encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t},jn.decode=function(e){for(var t={},n=e.split("&"),l=0,a=n.length;l<a;l++){var c=n[l].split("=");t[decodeURIComponent(c[0])]=decodeURIComponent(c[1])}return t},function(e,t){var n=Lt,l=fa,a=Es,c=La,i=va,r=ft("socket.io-client:socket"),d=jn,s=ql;e.exports=Z;var o={connect:1,connect_error:1,connect_timeout:1,connecting:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1,ping:1,pong:1},u=l.prototype.emit;function Z(m,p,h){this.io=m,this.nsp=p,this.json=this,this.ids=0,this.acks={},this.receiveBuffer=[],this.sendBuffer=[],this.connected=!1,this.disconnected=!0,this.flags={},h&&h.query&&(this.query=h.query),this.io.autoConnect&&this.open()}l(Z.prototype),Z.prototype.subEvents=function(){if(!this.subs){var m=this.io;this.subs=[c(m,"open",i(this,"onopen")),c(m,"packet",i(this,"onpacket")),c(m,"close",i(this,"onclose"))]}},Z.prototype.open=Z.prototype.connect=function(){return this.connected?this:(this.subEvents(),this.io.open(),this.io.readyState==="open"&&this.onopen(),this.emit("connecting"),this)},Z.prototype.send=function(){var m=a(arguments);return m.unshift("message"),this.emit.apply(this,m),this},Z.prototype.emit=function(m){if(o.hasOwnProperty(m))return u.apply(this,arguments),this;var p=a(arguments),h={type:(this.flags.binary!==void 0?this.flags.binary:s(p))?n.BINARY_EVENT:n.EVENT,data:p};return h.options={},h.options.compress=!this.flags||this.flags.compress!==!1,typeof p[p.length-1]=="function"&&(r("emitting packet with ack id %d",this.ids),this.acks[this.ids]=p.pop(),h.id=this.ids++),this.connected?this.packet(h):this.sendBuffer.push(h),this.flags={},this},Z.prototype.packet=function(m){m.nsp=this.nsp,this.io.packet(m)},Z.prototype.onopen=function(){if(r("transport is open - connecting"),this.nsp!=="/")if(this.query){var m=typeof this.query=="object"?d.encode(this.query):this.query;r("sending connect packet with query %s",m),this.packet({type:n.CONNECT,query:m})}else this.packet({type:n.CONNECT})},Z.prototype.onclose=function(m){r("close (%s)",m),this.connected=!1,this.disconnected=!0,delete this.id,this.emit("disconnect",m)},Z.prototype.onpacket=function(m){var p=m.nsp===this.nsp,h=m.type===n.ERROR&&m.nsp==="/";if(!(!p&&!h))switch(m.type){case n.CONNECT:this.onconnect();break;case n.EVENT:this.onevent(m);break;case n.BINARY_EVENT:this.onevent(m);break;case n.ACK:this.onack(m);break;case n.BINARY_ACK:this.onack(m);break;case n.DISCONNECT:this.ondisconnect();break;case n.ERROR:this.emit("error",m.data);break}},Z.prototype.onevent=function(m){var p=m.data||[];r("emitting event %j",p),m.id!=null&&(r("attaching ack callback to event"),p.push(this.ack(m.id))),this.connected?u.apply(this,p):this.receiveBuffer.push(p)},Z.prototype.ack=function(m){var p=this,h=!1;return function(){if(!h){h=!0;var R=a(arguments);r("sending ack %j",R),p.packet({type:s(R)?n.BINARY_ACK:n.ACK,id:m,data:R})}}},Z.prototype.onack=function(m){var p=this.acks[m.id];typeof p=="function"?(r("calling ack %s with %j",m.id,m.data),p.apply(this,m.data),delete this.acks[m.id]):r("bad ack %s",m.id)},Z.prototype.onconnect=function(){this.connected=!0,this.disconnected=!1,this.emit("connect"),this.emitBuffered()},Z.prototype.emitBuffered=function(){var m;for(m=0;m<this.receiveBuffer.length;m++)u.apply(this,this.receiveBuffer[m]);for(this.receiveBuffer=[],m=0;m<this.sendBuffer.length;m++)this.packet(this.sendBuffer[m]);this.sendBuffer=[]},Z.prototype.ondisconnect=function(){r("server disconnect (%s)",this.nsp),this.destroy(),this.onclose("io server disconnect")},Z.prototype.destroy=function(){if(this.subs){for(var m=0;m<this.subs.length;m++)this.subs[m].destroy();this.subs=null}this.io.destroy(this)},Z.prototype.close=Z.prototype.disconnect=function(){return this.connected&&(r("performing disconnect (%s)",this.nsp),this.packet({type:n.DISCONNECT})),this.destroy(),this.connected&&this.onclose("io client disconnect"),this},Z.prototype.compress=function(m){return this.flags.compress=m,this},Z.prototype.binary=function(m){return this.flags.binary=m,this}}(Wa);var ga=Wa.exports,Os=Te;function Te(e){e=e||{},this.ms=e.min||100,this.max=e.max||1e4,this.factor=e.factor||2,this.jitter=e.jitter>0&&e.jitter<=1?e.jitter:0,this.attempts=0}Te.prototype.duration=function(){var e=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var t=Math.random(),n=Math.floor(t*this.jitter*e);e=Math.floor(t*10)&1?e+n:e-n}return Math.min(e,this.max)|0},Te.prototype.reset=function(){this.attempts=0},Te.prototype.setMin=function(e){this.ms=e},Te.prototype.setMax=function(e){this.max=e},Te.prototype.setJitter=function(e){this.jitter=e};var As=Ps,_s=ga,$s=fa,qs=Lt,de=La,He=va,E=ft("socket.io-client:manager"),Fa=ya,eo=Os,Ca=Object.prototype.hasOwnProperty,xa=I;function I(e,t){if(!(this instanceof I))return new I(e,t);e&&typeof e=="object"&&(t=e,e=void 0),t=t||{},t.path=t.path||"/socket.io",this.nsps={},this.subs=[],this.opts=t,this.reconnection(t.reconnection!==!1),this.reconnectionAttempts(t.reconnectionAttempts||1/0),this.reconnectionDelay(t.reconnectionDelay||1e3),this.reconnectionDelayMax(t.reconnectionDelayMax||5e3),this.randomizationFactor(t.randomizationFactor||.5),this.backoff=new eo({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(t.timeout==null?2e4:t.timeout),this.readyState="closed",this.uri=e,this.connecting=[],this.lastPing=null,this.encoding=!1,this.packetBuffer=[];var n=t.parser||qs;this.encoder=new n.Encoder,this.decoder=new n.Decoder,this.autoConnect=t.autoConnect!==!1,this.autoConnect&&this.open()}I.prototype.emitAll=function(){this.emit.apply(this,arguments);for(var e in this.nsps)Ca.call(this.nsps,e)&&this.nsps[e].emit.apply(this.nsps[e],arguments)},I.prototype.updateSocketIds=function(){for(var e in this.nsps)Ca.call(this.nsps,e)&&(this.nsps[e].id=this.generateId(e))},I.prototype.generateId=function(e){return(e==="/"?"":e+"#")+this.engine.id},$s(I.prototype),I.prototype.reconnection=function(e){return arguments.length?(this._reconnection=!!e,this):this._reconnection},I.prototype.reconnectionAttempts=function(e){return arguments.length?(this._reconnectionAttempts=e,this):this._reconnectionAttempts},I.prototype.reconnectionDelay=function(e){return arguments.length?(this._reconnectionDelay=e,this.backoff&&this.backoff.setMin(e),this):this._reconnectionDelay},I.prototype.randomizationFactor=function(e){return arguments.length?(this._randomizationFactor=e,this.backoff&&this.backoff.setJitter(e),this):this._randomizationFactor},I.prototype.reconnectionDelayMax=function(e){return arguments.length?(this._reconnectionDelayMax=e,this.backoff&&this.backoff.setMax(e),this):this._reconnectionDelayMax},I.prototype.timeout=function(e){return arguments.length?(this._timeout=e,this):this._timeout},I.prototype.maybeReconnectOnOpen=function(){!this.reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()},I.prototype.open=I.prototype.connect=function(e,t){if(E("readyState %s",this.readyState),~this.readyState.indexOf("open"))return this;E("opening %s",this.uri),this.engine=As(this.uri,this.opts);var n=this.engine,l=this;this.readyState="opening",this.skipReconnect=!1;var a=de(n,"open",function(){l.onopen(),e&&e()}),c=de(n,"error",function(d){if(E("connect_error"),l.cleanup(),l.readyState="closed",l.emitAll("connect_error",d),e){var s=new Error("Connection error");s.data=d,e(s)}else l.maybeReconnectOnOpen()});if(this._timeout!==!1){var i=this._timeout;E("connect attempt will timeout after %d",i);var r=setTimeout(function(){E("connect attempt timed out after %d",i),a.destroy(),n.close(),n.emit("error","timeout"),l.emitAll("connect_timeout",i)},i);this.subs.push({destroy:function(){clearTimeout(r)}})}return this.subs.push(a),this.subs.push(c),this},I.prototype.onopen=function(){E("open"),this.cleanup(),this.readyState="open",this.emit("open");var e=this.engine;this.subs.push(de(e,"data",He(this,"ondata"))),this.subs.push(de(e,"ping",He(this,"onping"))),this.subs.push(de(e,"pong",He(this,"onpong"))),this.subs.push(de(e,"error",He(this,"onerror"))),this.subs.push(de(e,"close",He(this,"onclose"))),this.subs.push(de(this.decoder,"decoded",He(this,"ondecoded")))},I.prototype.onping=function(){this.lastPing=new Date,this.emitAll("ping")},I.prototype.onpong=function(){this.emitAll("pong",new Date-this.lastPing)},I.prototype.ondata=function(e){this.decoder.add(e)},I.prototype.ondecoded=function(e){this.emit("packet",e)},I.prototype.onerror=function(e){E("error",e),this.emitAll("error",e)},I.prototype.socket=function(e,t){var n=this.nsps[e];if(!n){n=new _s(this,e,t),this.nsps[e]=n;var l=this;n.on("connecting",a),n.on("connect",function(){n.id=l.generateId(e)}),this.autoConnect&&a()}function a(){~Fa(l.connecting,n)||l.connecting.push(n)}return n},I.prototype.destroy=function(e){var t=Fa(this.connecting,e);~t&&this.connecting.splice(t,1),!this.connecting.length&&this.close()},I.prototype.packet=function(e){E("writing packet %j",e);var t=this;e.query&&e.type===0&&(e.nsp+="?"+e.query),t.encoding?t.packetBuffer.push(e):(t.encoding=!0,this.encoder.encode(e,function(n){for(var l=0;l<n.length;l++)t.engine.write(n[l],e.options);t.encoding=!1,t.processPacketQueue()}))},I.prototype.processPacketQueue=function(){if(this.packetBuffer.length>0&&!this.encoding){var e=this.packetBuffer.shift();this.packet(e)}},I.prototype.cleanup=function(){E("cleanup");for(var e=this.subs.length,t=0;t<e;t++){var n=this.subs.shift();n.destroy()}this.packetBuffer=[],this.encoding=!1,this.lastPing=null,this.decoder.destroy()},I.prototype.close=I.prototype.disconnect=function(){E("disconnect"),this.skipReconnect=!0,this.reconnecting=!1,this.readyState==="opening"&&this.cleanup(),this.backoff.reset(),this.readyState="closed",this.engine&&this.engine.close()},I.prototype.onclose=function(e){E("onclose"),this.cleanup(),this.backoff.reset(),this.readyState="closed",this.emit("close",e),this._reconnection&&!this.skipReconnect&&this.reconnect()},I.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var e=this;if(this.backoff.attempts>=this._reconnectionAttempts)E("reconnect failed"),this.backoff.reset(),this.emitAll("reconnect_failed"),this.reconnecting=!1;else{var t=this.backoff.duration();E("will wait %dms before reconnect attempt",t),this.reconnecting=!0;var n=setTimeout(function(){e.skipReconnect||(E("attempting reconnect"),e.emitAll("reconnect_attempt",e.backoff.attempts),e.emitAll("reconnecting",e.backoff.attempts),!e.skipReconnect&&e.open(function(l){l?(E("reconnect attempt error"),e.reconnecting=!1,e.reconnect(),e.emitAll("reconnect_error",l.data)):(E("reconnect success"),e.onreconnect())}))},t);this.subs.push({destroy:function(){clearTimeout(n)}})}},I.prototype.onreconnect=function(){var e=this.backoff.attempts;this.reconnecting=!1,this.backoff.reset(),this.updateSocketIds(),this.emitAll("reconnect",e)},function(e,t){var n=Gr,l=Lt,a=xa,c=ft("socket.io-client");e.exports=t=r;var i=t.managers={};function r(d,s){typeof d=="object"&&(s=d,d=void 0),s=s||{};var o=n(d),u=o.source,Z=o.id,m=o.path,p=i[Z]&&m in i[Z].nsps,h=s.forceNew||s["force new connection"]||s.multiplex===!1||p,R;return h?(c("ignoring socket cache for %s",u),R=a(u,s)):(i[Z]||(c("new io instance for %s",u),i[Z]=a(u,s)),R=i[Z]),o.query&&!s.query&&(s.query=o.query),R.socket(o.path,s)}t.protocol=l.protocol,t.connect=r,t.Manager=xa,t.Socket=ga}(Wn,Wn.exports);var to=Wn.exports;const no=Pl(to);class lo{constructor(t){this.isConnected=!1,this.folderName="",this.callback=t,this.name=""}connect(t){if(this.isConnected)return;this.isConnected=!0;const n=no("https://www.virtualott.com",{reconnect:!0});n.on("connect",()=>{console.log("socket connected"),n.emit("setinfo",{device:ze.getDeviceName()},l=>{this.name=l.name,n.emit("join",t,a=>{console.log(`join ${t} room`),this.callback("join",a)})})}),n.on("error",l=>{console.error(`error::${l}`)}),n.on("disconnect",l=>{console.error(`disconnect from signaling::${l}`)}),n.on("messageroom",l=>{this.callback("messageroom",l),console.log("messageroom: ",l)}),n.on("ads",l=>{this.callback("ads",l),console.log("ads:",l)})}}class Sa{constructor(t,n){let l=[];const a=new lo((c,i)=>{switch(c){case"roommembers":console.log("roommembers message: ",i);break;case"join":const r=document.getElementById("name");r&&(r.textContent=a.name);break;case"messageroom":if(i.player===a.name)if(i.url){const d="#external";window.BB.RENDER_IN_WORKER?t.addAdvertisement({name:d,path:i.url,isSelected:!0}):t.addAdvertisement(d,i.url,()=>{t.selectAd(d)})}else l=i.ads,l.length&&t.selectAd(l[0]);break;case"ads":l=i,l.length&&t.selectAd(l[0]);break}});a.connect(n.augmentation.channelName),n.augmentation.logoURL?window.BB.RENDER_IN_WORKER?t.addAdvertisement({name:"#ad",path:n.augmentation.logoURL,isSelected:!1}):t.addAdvertisement("#ad",n.augmentation.logoURL):fetch("https://www.virtualott.com/ads/"+n.augmentation.channelName).then(async c=>{(await c.json()).forEach(r=>{window.BB.RENDER_IN_WORKER?t.addAdvertisement({name:`#${r.name}`,path:r.url,isSelected:!0}):t.addAdvertisement(`#${r.name}`,r.url)})})}}const Ia="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEsoRSl7cmV0dXJuIEUmJkUuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEUsImRlZmF1bHQiKT9FLmRlZmF1bHQ6RX12YXIgTz17fTsoZnVuY3Rpb24oRSl7dmFyIGg9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRGF0ZSxlPTQsaT0zLHM9MixuPTEsZj1lLGQ9e3NldExvZ0xldmVsOmZ1bmN0aW9uKGMpe2M9PXRoaXMuZGVidWc/Zj1uOmM9PXRoaXMuaW5mbz9mPXM6Yz09dGhpcy53YXJuP2Y9aTooYz09dGhpcy5lcnJvcixmPWUpfSxkZWJ1ZzpmdW5jdGlvbihjLG0pe2NvbnNvbGUuZGVidWc9PT12b2lkIDAmJihjb25zb2xlLmRlYnVnPWNvbnNvbGUubG9nKSxuPj1mJiZjb25zb2xlLmRlYnVnKCJbIitoLmdldER1cmF0aW9uU3RyaW5nKG5ldyBEYXRlLXQsMWUzKSsiXSIsIlsiK2MrIl0iLG0pfSxsb2c6ZnVuY3Rpb24oYyxtKXt0aGlzLmRlYnVnKGMubXNnKX0saW5mbzpmdW5jdGlvbihjLG0pe3M+PWYmJmNvbnNvbGUuaW5mbygiWyIraC5nZXREdXJhdGlvblN0cmluZyhuZXcgRGF0ZS10LDFlMykrIl0iLCJbIitjKyJdIixtKX0sd2FybjpmdW5jdGlvbihjLG0pe2k+PWYmJmNvbnNvbGUud2FybigiWyIraC5nZXREdXJhdGlvblN0cmluZyhuZXcgRGF0ZS10LDFlMykrIl0iLCJbIitjKyJdIixtKX0sZXJyb3I6ZnVuY3Rpb24oYyxtKXtlPj1mJiZjb25zb2xlLmVycm9yKCJbIitoLmdldER1cmF0aW9uU3RyaW5nKG5ldyBEYXRlLXQsMWUzKSsiXSIsIlsiK2MrIl0iLG0pfX07cmV0dXJuIGR9KCk7aC5nZXREdXJhdGlvblN0cmluZz1mdW5jdGlvbih0LGUpe3ZhciBpO2Z1bmN0aW9uIHMoeCxVKXtmb3IodmFyIGI9IiIreCx3PWIuc3BsaXQoIi4iKTt3WzBdLmxlbmd0aDxVOyl3WzBdPSIwIit3WzBdO3JldHVybiB3LmpvaW4oIi4iKX10PDA/KGk9ITAsdD0tdCk6aT0hMTt2YXIgbj1lfHwxLGY9dC9uLGQ9TWF0aC5mbG9vcihmLzM2MDApO2YtPWQqMzYwMDt2YXIgYz1NYXRoLmZsb29yKGYvNjApO2YtPWMqNjA7dmFyIG09ZioxZTM7cmV0dXJuIGY9TWF0aC5mbG9vcihmKSxtLT1mKjFlMyxtPU1hdGguZmxvb3IobSksKGk/Ii0iOiIiKStkKyI6IitzKGMsMikrIjoiK3MoZiwyKSsiLiIrcyhtLDMpfSxoLnByaW50UmFuZ2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU+MCl7Zm9yKHZhciBpPSIiLHM9MDtzPGU7cysrKXM+MCYmKGkrPSIsIiksaSs9IlsiK2guZ2V0RHVyYXRpb25TdHJpbmcodC5zdGFydChzKSkrIiwiK2guZ2V0RHVyYXRpb25TdHJpbmcodC5lbmQocykpKyJdIjtyZXR1cm4gaX1lbHNlIHJldHVybiIoZW1wdHkpIn0sRS5Mb2c9aDt2YXIgbz1mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpdGhpcy5idWZmZXI9dCx0aGlzLmRhdGF2aWV3PW5ldyBEYXRhVmlldyh0KTtlbHNlIHRocm93Ik5lZWRzIGFuIGFycmF5IGJ1ZmZlciI7dGhpcy5wb3NpdGlvbj0wfTtvLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9ufSxvLnByb3RvdHlwZS5nZXRFbmRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RofSxvLnByb3RvdHlwZS5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5idWZmZXIuYnl0ZUxlbmd0aH0sby5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgsdCkpO3JldHVybiB0aGlzLnBvc2l0aW9uPWlzTmFOKGUpfHwhaXNGaW5pdGUoZSk/MDplLCEwfSxvLnByb3RvdHlwZS5pc0Vvcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBvc2l0aW9uKCk+PXRoaXMuZ2V0RW5kUG9zaXRpb24oKX0sby5wcm90b3R5cGUucmVhZEFueUludD1mdW5jdGlvbih0LGUpe3ZhciBpPTA7aWYodGhpcy5wb3NpdGlvbit0PD10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKXtzd2l0Y2godCl7Y2FzZSAxOmU/aT10aGlzLmRhdGF2aWV3LmdldEludDgodGhpcy5wb3NpdGlvbik6aT10aGlzLmRhdGF2aWV3LmdldFVpbnQ4KHRoaXMucG9zaXRpb24pO2JyZWFrO2Nhc2UgMjplP2k9dGhpcy5kYXRhdmlldy5nZXRJbnQxNih0aGlzLnBvc2l0aW9uKTppPXRoaXMuZGF0YXZpZXcuZ2V0VWludDE2KHRoaXMucG9zaXRpb24pO2JyZWFrO2Nhc2UgMzppZihlKXRocm93Ik5vIG1ldGhvZCBmb3IgcmVhZGluZyBzaWduZWQgMjQgYml0cyB2YWx1ZXMiO2k9dGhpcy5kYXRhdmlldy5nZXRVaW50OCh0aGlzLnBvc2l0aW9uKTw8MTYsaXw9dGhpcy5kYXRhdmlldy5nZXRVaW50OCh0aGlzLnBvc2l0aW9uKzEpPDw4LGl8PXRoaXMuZGF0YXZpZXcuZ2V0VWludDgodGhpcy5wb3NpdGlvbisyKTticmVhaztjYXNlIDQ6ZT9pPXRoaXMuZGF0YXZpZXcuZ2V0SW50MzIodGhpcy5wb3NpdGlvbik6aT10aGlzLmRhdGF2aWV3LmdldFVpbnQzMih0aGlzLnBvc2l0aW9uKTticmVhaztjYXNlIDg6aWYoZSl0aHJvdyJObyBtZXRob2QgZm9yIHJlYWRpbmcgc2lnbmVkIDY0IGJpdHMgdmFsdWVzIjtpPXRoaXMuZGF0YXZpZXcuZ2V0VWludDMyKHRoaXMucG9zaXRpb24pPDwzMixpfD10aGlzLmRhdGF2aWV3LmdldFVpbnQzMih0aGlzLnBvc2l0aW9uKzQpO2JyZWFrO2RlZmF1bHQ6dGhyb3cicmVhZEludCBtZXRob2Qgbm90IGltcGxlbWVudGVkIGZvciBzaXplOiAiK3R9cmV0dXJuIHRoaXMucG9zaXRpb24rPXQsaX1lbHNlIHRocm93Ik5vdCBlbm91Z2ggYnl0ZXMgaW4gYnVmZmVyIn0sby5wcm90b3R5cGUucmVhZFVpbnQ4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZEFueUludCgxLCExKX0sby5wcm90b3R5cGUucmVhZFVpbnQxNj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRBbnlJbnQoMiwhMSl9LG8ucHJvdG90eXBlLnJlYWRVaW50MjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkQW55SW50KDMsITEpfSxvLnByb3RvdHlwZS5yZWFkVWludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZEFueUludCg0LCExKX0sby5wcm90b3R5cGUucmVhZFVpbnQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRBbnlJbnQoOCwhMSl9LG8ucHJvdG90eXBlLnJlYWRTdHJpbmc9ZnVuY3Rpb24odCl7aWYodGhpcy5wb3NpdGlvbit0PD10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKXtmb3IodmFyIGU9IiIsaT0wO2k8dDtpKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLnJlYWRVaW50OCgpKTtyZXR1cm4gZX1lbHNlIHRocm93Ik5vdCBlbm91Z2ggYnl0ZXMgaW4gYnVmZmVyIn0sby5wcm90b3R5cGUucmVhZENTdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W107Oyl7dmFyIGU9dGhpcy5yZWFkVWludDgoKTtpZihlIT09MCl0LnB1c2goZSk7ZWxzZSBicmVha31yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHQpfSxvLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRBbnlJbnQoMSwhMCl9LG8ucHJvdG90eXBlLnJlYWRJbnQxNj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRBbnlJbnQoMiwhMCl9LG8ucHJvdG90eXBlLnJlYWRJbnQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRBbnlJbnQoNCwhMCl9LG8ucHJvdG90eXBlLnJlYWRJbnQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRBbnlJbnQoOCwhMSl9LG8ucHJvdG90eXBlLnJlYWRVaW50OEFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVWludDhBcnJheSh0KSxpPTA7aTx0O2krKyllW2ldPXRoaXMucmVhZFVpbnQ4KCk7cmV0dXJuIGV9LG8ucHJvdG90eXBlLnJlYWRJbnQxNkFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgSW50MTZBcnJheSh0KSxpPTA7aTx0O2krKyllW2ldPXRoaXMucmVhZEludDE2KCk7cmV0dXJuIGV9LG8ucHJvdG90eXBlLnJlYWRVaW50MTZBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9bmV3IEludDE2QXJyYXkodCksaT0wO2k8dDtpKyspZVtpXT10aGlzLnJlYWRVaW50MTYoKTtyZXR1cm4gZX0sby5wcm90b3R5cGUucmVhZFVpbnQzMkFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVWludDMyQXJyYXkodCksaT0wO2k8dDtpKyspZVtpXT10aGlzLnJlYWRVaW50MzIoKTtyZXR1cm4gZX0sby5wcm90b3R5cGUucmVhZEludDMyQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBJbnQzMkFycmF5KHQpLGk9MDtpPHQ7aSsrKWVbaV09dGhpcy5yZWFkSW50MzIoKTtyZXR1cm4gZX0sRS5NUDRCb3hTdHJlYW09bzt2YXIgYT1mdW5jdGlvbih0LGUsaSl7dGhpcy5fYnl0ZU9mZnNldD1lfHwwLHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj90aGlzLmJ1ZmZlcj10OnR5cGVvZiB0PT0ib2JqZWN0Ij8odGhpcy5kYXRhVmlldz10LGUmJih0aGlzLl9ieXRlT2Zmc2V0Kz1lKSk6dGhpcy5idWZmZXI9bmV3IEFycmF5QnVmZmVyKHR8fDApLHRoaXMucG9zaXRpb249MCx0aGlzLmVuZGlhbm5lc3M9aT8/YS5MSVRUTEVfRU5ESUFOfTthLnByb3RvdHlwZT17fSxhLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9ufSxhLnByb3RvdHlwZS5fcmVhbGxvYz1mdW5jdGlvbih0KXtpZih0aGlzLl9keW5hbWljU2l6ZSl7dmFyIGU9dGhpcy5fYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uK3QsaT10aGlzLl9idWZmZXIuYnl0ZUxlbmd0aDtpZihlPD1pKXtlPnRoaXMuX2J5dGVMZW5ndGgmJih0aGlzLl9ieXRlTGVuZ3RoPWUpO3JldHVybn1mb3IoaTwxJiYoaT0xKTtlPmk7KWkqPTI7dmFyIHM9bmV3IEFycmF5QnVmZmVyKGkpLG49bmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyKSxmPW5ldyBVaW50OEFycmF5KHMsMCxuLmxlbmd0aCk7Zi5zZXQobiksdGhpcy5idWZmZXI9cyx0aGlzLl9ieXRlTGVuZ3RoPWV9fSxhLnByb3RvdHlwZS5fdHJpbUFsbG9jPWZ1bmN0aW9uKCl7aWYodGhpcy5fYnl0ZUxlbmd0aCE9dGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGgpe3ZhciB0PW5ldyBBcnJheUJ1ZmZlcih0aGlzLl9ieXRlTGVuZ3RoKSxlPW5ldyBVaW50OEFycmF5KHQpLGk9bmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyLDAsZS5sZW5ndGgpO2Uuc2V0KGkpLHRoaXMuYnVmZmVyPXR9fSxhLkJJR19FTkRJQU49ITEsYS5MSVRUTEVfRU5ESUFOPSEwLGEucHJvdG90eXBlLl9ieXRlTGVuZ3RoPTAsT2JqZWN0LmRlZmluZVByb3BlcnR5KGEucHJvdG90eXBlLCJieXRlTGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J5dGVMZW5ndGgtdGhpcy5fYnl0ZU9mZnNldH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYS5wcm90b3R5cGUsImJ1ZmZlciIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90cmltQWxsb2MoKSx0aGlzLl9idWZmZXJ9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9idWZmZXI9dCx0aGlzLl9kYXRhVmlldz1uZXcgRGF0YVZpZXcodGhpcy5fYnVmZmVyLHRoaXMuX2J5dGVPZmZzZXQpLHRoaXMuX2J5dGVMZW5ndGg9dGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGh9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEucHJvdG90eXBlLCJieXRlT2Zmc2V0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2J5dGVPZmZzZXR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9ieXRlT2Zmc2V0PXQsdGhpcy5fZGF0YVZpZXc9bmV3IERhdGFWaWV3KHRoaXMuX2J1ZmZlcix0aGlzLl9ieXRlT2Zmc2V0KSx0aGlzLl9ieXRlTGVuZ3RoPXRoaXMuX2J1ZmZlci5ieXRlTGVuZ3RofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSwiZGF0YVZpZXciLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YVZpZXd9LHNldDpmdW5jdGlvbih0KXt0aGlzLl9ieXRlT2Zmc2V0PXQuYnl0ZU9mZnNldCx0aGlzLl9idWZmZXI9dC5idWZmZXIsdGhpcy5fZGF0YVZpZXc9bmV3IERhdGFWaWV3KHRoaXMuX2J1ZmZlcix0aGlzLl9ieXRlT2Zmc2V0KSx0aGlzLl9ieXRlTGVuZ3RoPXRoaXMuX2J5dGVPZmZzZXQrdC5ieXRlTGVuZ3RofX0pLGEucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5tYXgoMCxNYXRoLm1pbih0aGlzLmJ5dGVMZW5ndGgsdCkpO3RoaXMucG9zaXRpb249aXNOYU4oZSl8fCFpc0Zpbml0ZShlKT8wOmV9LGEucHJvdG90eXBlLmlzRW9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb24+PXRoaXMuX2J5dGVMZW5ndGh9LGEucHJvdG90eXBlLm1hcFVpbnQ4QXJyYXk9ZnVuY3Rpb24odCl7dGhpcy5fcmVhbGxvYyh0KjEpO3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuX2J1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0KTtyZXR1cm4gdGhpcy5wb3NpdGlvbis9dCoxLGV9LGEucHJvdG90eXBlLnJlYWRJbnQzMkFycmF5PWZ1bmN0aW9uKHQsZSl7dD10Pz90aGlzLmJ5dGVMZW5ndGgtdGhpcy5wb3NpdGlvbi80O3ZhciBpPW5ldyBJbnQzMkFycmF5KHQpO3JldHVybiBhLm1lbWNweShpLmJ1ZmZlciwwLHRoaXMuYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQqaS5CWVRFU19QRVJfRUxFTUVOVCksYS5hcnJheVRvTmF0aXZlKGksZT8/dGhpcy5lbmRpYW5uZXNzKSx0aGlzLnBvc2l0aW9uKz1pLmJ5dGVMZW5ndGgsaX0sYS5wcm90b3R5cGUucmVhZEludDE2QXJyYXk9ZnVuY3Rpb24odCxlKXt0PXQ/P3RoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uLzI7dmFyIGk9bmV3IEludDE2QXJyYXkodCk7cmV0dXJuIGEubWVtY3B5KGkuYnVmZmVyLDAsdGhpcy5idWZmZXIsdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sdCppLkJZVEVTX1BFUl9FTEVNRU5UKSxhLmFycmF5VG9OYXRpdmUoaSxlPz90aGlzLmVuZGlhbm5lc3MpLHRoaXMucG9zaXRpb24rPWkuYnl0ZUxlbmd0aCxpfSxhLnByb3RvdHlwZS5yZWFkSW50OEFycmF5PWZ1bmN0aW9uKHQpe3Q9dD8/dGhpcy5ieXRlTGVuZ3RoLXRoaXMucG9zaXRpb247dmFyIGU9bmV3IEludDhBcnJheSh0KTtyZXR1cm4gYS5tZW1jcHkoZS5idWZmZXIsMCx0aGlzLmJ1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0KmUuQllURVNfUEVSX0VMRU1FTlQpLHRoaXMucG9zaXRpb24rPWUuYnl0ZUxlbmd0aCxlfSxhLnByb3RvdHlwZS5yZWFkVWludDMyQXJyYXk9ZnVuY3Rpb24odCxlKXt0PXQ/P3RoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uLzQ7dmFyIGk9bmV3IFVpbnQzMkFycmF5KHQpO3JldHVybiBhLm1lbWNweShpLmJ1ZmZlciwwLHRoaXMuYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQqaS5CWVRFU19QRVJfRUxFTUVOVCksYS5hcnJheVRvTmF0aXZlKGksZT8/dGhpcy5lbmRpYW5uZXNzKSx0aGlzLnBvc2l0aW9uKz1pLmJ5dGVMZW5ndGgsaX0sYS5wcm90b3R5cGUucmVhZFVpbnQxNkFycmF5PWZ1bmN0aW9uKHQsZSl7dD10Pz90aGlzLmJ5dGVMZW5ndGgtdGhpcy5wb3NpdGlvbi8yO3ZhciBpPW5ldyBVaW50MTZBcnJheSh0KTtyZXR1cm4gYS5tZW1jcHkoaS5idWZmZXIsMCx0aGlzLmJ1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0KmkuQllURVNfUEVSX0VMRU1FTlQpLGEuYXJyYXlUb05hdGl2ZShpLGU/P3RoaXMuZW5kaWFubmVzcyksdGhpcy5wb3NpdGlvbis9aS5ieXRlTGVuZ3RoLGl9LGEucHJvdG90eXBlLnJlYWRVaW50OEFycmF5PWZ1bmN0aW9uKHQpe3Q9dD8/dGhpcy5ieXRlTGVuZ3RoLXRoaXMucG9zaXRpb247dmFyIGU9bmV3IFVpbnQ4QXJyYXkodCk7cmV0dXJuIGEubWVtY3B5KGUuYnVmZmVyLDAsdGhpcy5idWZmZXIsdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sdCplLkJZVEVTX1BFUl9FTEVNRU5UKSx0aGlzLnBvc2l0aW9uKz1lLmJ5dGVMZW5ndGgsZX0sYS5wcm90b3R5cGUucmVhZEZsb2F0NjRBcnJheT1mdW5jdGlvbih0LGUpe3Q9dD8/dGhpcy5ieXRlTGVuZ3RoLXRoaXMucG9zaXRpb24vODt2YXIgaT1uZXcgRmxvYXQ2NEFycmF5KHQpO3JldHVybiBhLm1lbWNweShpLmJ1ZmZlciwwLHRoaXMuYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQqaS5CWVRFU19QRVJfRUxFTUVOVCksYS5hcnJheVRvTmF0aXZlKGksZT8/dGhpcy5lbmRpYW5uZXNzKSx0aGlzLnBvc2l0aW9uKz1pLmJ5dGVMZW5ndGgsaX0sYS5wcm90b3R5cGUucmVhZEZsb2F0MzJBcnJheT1mdW5jdGlvbih0LGUpe3Q9dD8/dGhpcy5ieXRlTGVuZ3RoLXRoaXMucG9zaXRpb24vNDt2YXIgaT1uZXcgRmxvYXQzMkFycmF5KHQpO3JldHVybiBhLm1lbWNweShpLmJ1ZmZlciwwLHRoaXMuYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQqaS5CWVRFU19QRVJfRUxFTUVOVCksYS5hcnJheVRvTmF0aXZlKGksZT8/dGhpcy5lbmRpYW5uZXNzKSx0aGlzLnBvc2l0aW9uKz1pLmJ5dGVMZW5ndGgsaX0sYS5wcm90b3R5cGUucmVhZEludDMyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RhdGFWaWV3LmdldEludDMyKHRoaXMucG9zaXRpb24sdD8/dGhpcy5lbmRpYW5uZXNzKTtyZXR1cm4gdGhpcy5wb3NpdGlvbis9NCxlfSxhLnByb3RvdHlwZS5yZWFkSW50MTY9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZGF0YVZpZXcuZ2V0SW50MTYodGhpcy5wb3NpdGlvbix0Pz90aGlzLmVuZGlhbm5lc3MpO3JldHVybiB0aGlzLnBvc2l0aW9uKz0yLGV9LGEucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZGF0YVZpZXcuZ2V0SW50OCh0aGlzLnBvc2l0aW9uKTtyZXR1cm4gdGhpcy5wb3NpdGlvbis9MSx0fSxhLnByb3RvdHlwZS5yZWFkVWludDMyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RhdGFWaWV3LmdldFVpbnQzMih0aGlzLnBvc2l0aW9uLHQ/P3RoaXMuZW5kaWFubmVzcyk7cmV0dXJuIHRoaXMucG9zaXRpb24rPTQsZX0sYS5wcm90b3R5cGUucmVhZFVpbnQxNj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9kYXRhVmlldy5nZXRVaW50MTYodGhpcy5wb3NpdGlvbix0Pz90aGlzLmVuZGlhbm5lc3MpO3JldHVybiB0aGlzLnBvc2l0aW9uKz0yLGV9LGEucHJvdG90eXBlLnJlYWRVaW50OD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2RhdGFWaWV3LmdldFVpbnQ4KHRoaXMucG9zaXRpb24pO3JldHVybiB0aGlzLnBvc2l0aW9uKz0xLHR9LGEucHJvdG90eXBlLnJlYWRGbG9hdDMyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RhdGFWaWV3LmdldEZsb2F0MzIodGhpcy5wb3NpdGlvbix0Pz90aGlzLmVuZGlhbm5lc3MpO3JldHVybiB0aGlzLnBvc2l0aW9uKz00LGV9LGEucHJvdG90eXBlLnJlYWRGbG9hdDY0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RhdGFWaWV3LmdldEZsb2F0NjQodGhpcy5wb3NpdGlvbix0Pz90aGlzLmVuZGlhbm5lc3MpO3JldHVybiB0aGlzLnBvc2l0aW9uKz04LGV9LGEuZW5kaWFubmVzcz1uZXcgSW50OEFycmF5KG5ldyBJbnQxNkFycmF5KFsxXSkuYnVmZmVyKVswXT4wLGEubWVtY3B5PWZ1bmN0aW9uKHQsZSxpLHMsbil7dmFyIGY9bmV3IFVpbnQ4QXJyYXkodCxlLG4pLGQ9bmV3IFVpbnQ4QXJyYXkoaSxzLG4pO2Yuc2V0KGQpfSxhLmFycmF5VG9OYXRpdmU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT09dGhpcy5lbmRpYW5uZXNzP3Q6dGhpcy5mbGlwQXJyYXlFbmRpYW5uZXNzKHQpfSxhLm5hdGl2ZVRvRW5kaWFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZW5kaWFubmVzcz09ZT90OnRoaXMuZmxpcEFycmF5RW5kaWFubmVzcyh0KX0sYS5mbGlwQXJyYXlFbmRpYW5uZXNzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKSxpPTA7aTx0LmJ5dGVMZW5ndGg7aSs9dC5CWVRFU19QRVJfRUxFTUVOVClmb3IodmFyIHM9aSt0LkJZVEVTX1BFUl9FTEVNRU5ULTEsbj1pO3M+bjtzLS0sbisrKXt2YXIgZj1lW25dO2Vbbl09ZVtzXSxlW3NdPWZ9cmV0dXJuIHR9LGEucHJvdG90eXBlLmZhaWx1cmVQb3NpdGlvbj0wLFN0cmluZy5mcm9tQ2hhckNvZGVVaW50OD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKWVbaV09dFtpXTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGUpfSxhLnByb3RvdHlwZS5yZWFkU3RyaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU9PW51bGx8fGU9PSJBU0NJSSI/U3RyaW5nLmZyb21DaGFyQ29kZVVpbnQ4LmFwcGx5KG51bGwsW3RoaXMubWFwVWludDhBcnJheSh0Pz90aGlzLmJ5dGVMZW5ndGgtdGhpcy5wb3NpdGlvbildKTpuZXcgVGV4dERlY29kZXIoZSkuZGVjb2RlKHRoaXMubWFwVWludDhBcnJheSh0KSl9LGEucHJvdG90eXBlLnJlYWRDU3RyaW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYnl0ZUxlbmd0aC10aGlzLnBvc2l0aW9uLGk9bmV3IFVpbnQ4QXJyYXkodGhpcy5fYnVmZmVyLHRoaXMuX2J5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikscz1lO3QhPW51bGwmJihzPU1hdGgubWluKHQsZSkpO2Zvcih2YXIgbj0wO248cyYmaVtuXSE9PTA7bisrKTt2YXIgZj1TdHJpbmcuZnJvbUNoYXJDb2RlVWludDguYXBwbHkobnVsbCxbdGhpcy5tYXBVaW50OEFycmF5KG4pXSk7cmV0dXJuIHQhPW51bGw/dGhpcy5wb3NpdGlvbis9cy1uOm4hPWUmJih0aGlzLnBvc2l0aW9uKz0xKSxmfTt2YXIgcD1NYXRoLnBvdygyLDMyKTthLnByb3RvdHlwZS5yZWFkSW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkSW50MzIoKSpwK3RoaXMucmVhZFVpbnQzMigpfSxhLnByb3RvdHlwZS5yZWFkVWludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFVpbnQzMigpKnArdGhpcy5yZWFkVWludDMyKCl9LGEucHJvdG90eXBlLnJlYWRJbnQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRVaW50MzIoKSpwK3RoaXMucmVhZFVpbnQzMigpfSxhLnByb3RvdHlwZS5yZWFkVWludDI0PWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMucmVhZFVpbnQ4KCk8PDE2KSsodGhpcy5yZWFkVWludDgoKTw8OCkrdGhpcy5yZWFkVWludDgoKX0sRS5EYXRhU3RyZWFtPWEsYS5wcm90b3R5cGUuc2F2ZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgQmxvYihbdGhpcy5idWZmZXJdKTtpZih3aW5kb3cuVVJMJiZVUkwuY3JlYXRlT2JqZWN0VVJMKXt2YXIgaT13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChlKSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHMpLHMuc2V0QXR0cmlidXRlKCJocmVmIixpKSxzLnNldEF0dHJpYnV0ZSgiZG93bmxvYWQiLHQpLHMuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCJfc2VsZiIpLHMuY2xpY2soKSx3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChpKX1lbHNlIHRocm93IkRhdGFTdHJlYW0uc2F2ZTogQ2FuJ3QgY3JlYXRlIG9iamVjdCBVUkwuIn0sYS5wcm90b3R5cGUuX2R5bmFtaWNTaXplPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSwiZHluYW1pY1NpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHluYW1pY1NpemV9LHNldDpmdW5jdGlvbih0KXt0fHx0aGlzLl90cmltQWxsb2MoKSx0aGlzLl9keW5hbWljU2l6ZT10fX0pLGEucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheUJ1ZmZlcih0aGlzLl9ieXRlTGVuZ3RoLXQpLGk9bmV3IFVpbnQ4QXJyYXkoZSkscz1uZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIsdCxpLmxlbmd0aCk7aS5zZXQocyksdGhpcy5idWZmZXI9ZSx0aGlzLnBvc2l0aW9uLT10fSxhLnByb3RvdHlwZS53cml0ZUludDMyQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9yZWFsbG9jKHQubGVuZ3RoKjQpLHQgaW5zdGFuY2VvZiBJbnQzMkFycmF5JiZ0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiV0LkJZVEVTX1BFUl9FTEVNRU5UPT09MClhLm1lbWNweSh0aGlzLl9idWZmZXIsdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sdC5idWZmZXIsMCx0LmJ5dGVMZW5ndGgpLHRoaXMubWFwSW50MzJBcnJheSh0Lmxlbmd0aCxlKTtlbHNlIGZvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRoaXMud3JpdGVJbnQzMih0W2ldLGUpfSxhLnByb3RvdHlwZS53cml0ZUludDE2QXJyYXk9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9yZWFsbG9jKHQubGVuZ3RoKjIpLHQgaW5zdGFuY2VvZiBJbnQxNkFycmF5JiZ0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbiV0LkJZVEVTX1BFUl9FTEVNRU5UPT09MClhLm1lbWNweSh0aGlzLl9idWZmZXIsdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sdC5idWZmZXIsMCx0LmJ5dGVMZW5ndGgpLHRoaXMubWFwSW50MTZBcnJheSh0Lmxlbmd0aCxlKTtlbHNlIGZvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRoaXMud3JpdGVJbnQxNih0W2ldLGUpfSxhLnByb3RvdHlwZS53cml0ZUludDhBcnJheT1mdW5jdGlvbih0KXtpZih0aGlzLl9yZWFsbG9jKHQubGVuZ3RoKjEpLHQgaW5zdGFuY2VvZiBJbnQ4QXJyYXkmJnRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uJXQuQllURVNfUEVSX0VMRU1FTlQ9PT0wKWEubWVtY3B5KHRoaXMuX2J1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0LmJ1ZmZlciwwLHQuYnl0ZUxlbmd0aCksdGhpcy5tYXBJbnQ4QXJyYXkodC5sZW5ndGgpO2Vsc2UgZm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy53cml0ZUludDgodFtlXSl9LGEucHJvdG90eXBlLndyaXRlVWludDMyQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9yZWFsbG9jKHQubGVuZ3RoKjQpLHQgaW5zdGFuY2VvZiBVaW50MzJBcnJheSYmdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24ldC5CWVRFU19QRVJfRUxFTUVOVD09PTApYS5tZW1jcHkodGhpcy5fYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQuYnVmZmVyLDAsdC5ieXRlTGVuZ3RoKSx0aGlzLm1hcFVpbnQzMkFycmF5KHQubGVuZ3RoLGUpO2Vsc2UgZm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspdGhpcy53cml0ZVVpbnQzMih0W2ldLGUpfSxhLnByb3RvdHlwZS53cml0ZVVpbnQxNkFycmF5PWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fcmVhbGxvYyh0Lmxlbmd0aCoyKSx0IGluc3RhbmNlb2YgVWludDE2QXJyYXkmJnRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uJXQuQllURVNfUEVSX0VMRU1FTlQ9PT0wKWEubWVtY3B5KHRoaXMuX2J1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0LmJ1ZmZlciwwLHQuYnl0ZUxlbmd0aCksdGhpcy5tYXBVaW50MTZBcnJheSh0Lmxlbmd0aCxlKTtlbHNlIGZvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRoaXMud3JpdGVVaW50MTYodFtpXSxlKX0sYS5wcm90b3R5cGUud3JpdGVVaW50OEFycmF5PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX3JlYWxsb2ModC5sZW5ndGgqMSksdCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJnRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uJXQuQllURVNfUEVSX0VMRU1FTlQ9PT0wKWEubWVtY3B5KHRoaXMuX2J1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0LmJ1ZmZlciwwLHQuYnl0ZUxlbmd0aCksdGhpcy5tYXBVaW50OEFycmF5KHQubGVuZ3RoKTtlbHNlIGZvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRoaXMud3JpdGVVaW50OCh0W2VdKX0sYS5wcm90b3R5cGUud3JpdGVGbG9hdDY0QXJyYXk9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9yZWFsbG9jKHQubGVuZ3RoKjgpLHQgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkmJnRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uJXQuQllURVNfUEVSX0VMRU1FTlQ9PT0wKWEubWVtY3B5KHRoaXMuX2J1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0LmJ1ZmZlciwwLHQuYnl0ZUxlbmd0aCksdGhpcy5tYXBGbG9hdDY0QXJyYXkodC5sZW5ndGgsZSk7ZWxzZSBmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl0aGlzLndyaXRlRmxvYXQ2NCh0W2ldLGUpfSxhLnByb3RvdHlwZS53cml0ZUZsb2F0MzJBcnJheT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX3JlYWxsb2ModC5sZW5ndGgqNCksdCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSYmdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24ldC5CWVRFU19QRVJfRUxFTUVOVD09PTApYS5tZW1jcHkodGhpcy5fYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQuYnVmZmVyLDAsdC5ieXRlTGVuZ3RoKSx0aGlzLm1hcEZsb2F0MzJBcnJheSh0Lmxlbmd0aCxlKTtlbHNlIGZvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRoaXMud3JpdGVGbG9hdDMyKHRbaV0sZSl9LGEucHJvdG90eXBlLndyaXRlSW50MzI9ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWFsbG9jKDQpLHRoaXMuX2RhdGFWaWV3LnNldEludDMyKHRoaXMucG9zaXRpb24sdCxlPz90aGlzLmVuZGlhbm5lc3MpLHRoaXMucG9zaXRpb24rPTR9LGEucHJvdG90eXBlLndyaXRlSW50MTY9ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWFsbG9jKDIpLHRoaXMuX2RhdGFWaWV3LnNldEludDE2KHRoaXMucG9zaXRpb24sdCxlPz90aGlzLmVuZGlhbm5lc3MpLHRoaXMucG9zaXRpb24rPTJ9LGEucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0KXt0aGlzLl9yZWFsbG9jKDEpLHRoaXMuX2RhdGFWaWV3LnNldEludDgodGhpcy5wb3NpdGlvbix0KSx0aGlzLnBvc2l0aW9uKz0xfSxhLnByb3RvdHlwZS53cml0ZVVpbnQzMj1mdW5jdGlvbih0LGUpe3RoaXMuX3JlYWxsb2MoNCksdGhpcy5fZGF0YVZpZXcuc2V0VWludDMyKHRoaXMucG9zaXRpb24sdCxlPz90aGlzLmVuZGlhbm5lc3MpLHRoaXMucG9zaXRpb24rPTR9LGEucHJvdG90eXBlLndyaXRlVWludDE2PWZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVhbGxvYygyKSx0aGlzLl9kYXRhVmlldy5zZXRVaW50MTYodGhpcy5wb3NpdGlvbix0LGU/P3RoaXMuZW5kaWFubmVzcyksdGhpcy5wb3NpdGlvbis9Mn0sYS5wcm90b3R5cGUud3JpdGVVaW50OD1mdW5jdGlvbih0KXt0aGlzLl9yZWFsbG9jKDEpLHRoaXMuX2RhdGFWaWV3LnNldFVpbnQ4KHRoaXMucG9zaXRpb24sdCksdGhpcy5wb3NpdGlvbis9MX0sYS5wcm90b3R5cGUud3JpdGVGbG9hdDMyPWZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVhbGxvYyg0KSx0aGlzLl9kYXRhVmlldy5zZXRGbG9hdDMyKHRoaXMucG9zaXRpb24sdCxlPz90aGlzLmVuZGlhbm5lc3MpLHRoaXMucG9zaXRpb24rPTR9LGEucHJvdG90eXBlLndyaXRlRmxvYXQ2ND1mdW5jdGlvbih0LGUpe3RoaXMuX3JlYWxsb2MoOCksdGhpcy5fZGF0YVZpZXcuc2V0RmxvYXQ2NCh0aGlzLnBvc2l0aW9uLHQsZT8/dGhpcy5lbmRpYW5uZXNzKSx0aGlzLnBvc2l0aW9uKz04fSxhLnByb3RvdHlwZS53cml0ZVVDUzJTdHJpbmc9ZnVuY3Rpb24odCxlLGkpe2k9PW51bGwmJihpPXQubGVuZ3RoKTtmb3IodmFyIHM9MDtzPHQubGVuZ3RoJiZzPGk7cysrKXRoaXMud3JpdGVVaW50MTYodC5jaGFyQ29kZUF0KHMpLGUpO2Zvcig7czxpO3MrKyl0aGlzLndyaXRlVWludDE2KDApfSxhLnByb3RvdHlwZS53cml0ZVN0cmluZz1mdW5jdGlvbih0LGUsaSl7dmFyIHM9MDtpZihlPT1udWxsfHxlPT0iQVNDSUkiKWlmKGkhPW51bGwpe3ZhciBuPU1hdGgubWluKHQubGVuZ3RoLGkpO2ZvcihzPTA7czxuO3MrKyl0aGlzLndyaXRlVWludDgodC5jaGFyQ29kZUF0KHMpKTtmb3IoO3M8aTtzKyspdGhpcy53cml0ZVVpbnQ4KDApfWVsc2UgZm9yKHM9MDtzPHQubGVuZ3RoO3MrKyl0aGlzLndyaXRlVWludDgodC5jaGFyQ29kZUF0KHMpKTtlbHNlIHRoaXMud3JpdGVVaW50OEFycmF5KG5ldyBUZXh0RW5jb2RlcihlKS5lbmNvZGUodC5zdWJzdHJpbmcoMCxpKSkpfSxhLnByb3RvdHlwZS53cml0ZUNTdHJpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaT0wO2lmKGUhPW51bGwpe3ZhciBzPU1hdGgubWluKHQubGVuZ3RoLGUpO2ZvcihpPTA7aTxzO2krKyl0aGlzLndyaXRlVWludDgodC5jaGFyQ29kZUF0KGkpKTtmb3IoO2k8ZTtpKyspdGhpcy53cml0ZVVpbnQ4KDApfWVsc2V7Zm9yKGk9MDtpPHQubGVuZ3RoO2krKyl0aGlzLndyaXRlVWludDgodC5jaGFyQ29kZUF0KGkpKTt0aGlzLndyaXRlVWludDgoMCl9fSxhLnByb3RvdHlwZS53cml0ZVN0cnVjdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSs9Mil7dmFyIHM9dFtpKzFdO3RoaXMud3JpdGVUeXBlKHMsZVt0W2ldXSxlKX19LGEucHJvdG90eXBlLndyaXRlVHlwZT1mdW5jdGlvbih0LGUsaSl7dmFyIHM7aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHQodGhpcyxlKTtpZih0eXBlb2YgdD09Im9iamVjdCImJiEodCBpbnN0YW5jZW9mIEFycmF5KSlyZXR1cm4gdC5zZXQodGhpcyxlLGkpO3ZhciBuPW51bGwsZj0iQVNDSUkiLGQ9dGhpcy5wb3NpdGlvbjtzd2l0Y2godHlwZW9mIHQ9PSJzdHJpbmciJiYvOi8udGVzdCh0KSYmKHM9dC5zcGxpdCgiOiIpLHQ9c1swXSxuPXBhcnNlSW50KHNbMV0pKSx0eXBlb2YgdD09InN0cmluZyImJi8sLy50ZXN0KHQpJiYocz10LnNwbGl0KCIsIiksdD1zWzBdLGY9cGFyc2VJbnQoc1sxXSkpLHQpe2Nhc2UidWludDgiOnRoaXMud3JpdGVVaW50OChlKTticmVhaztjYXNlImludDgiOnRoaXMud3JpdGVJbnQ4KGUpO2JyZWFrO2Nhc2UidWludDE2Ijp0aGlzLndyaXRlVWludDE2KGUsdGhpcy5lbmRpYW5uZXNzKTticmVhaztjYXNlImludDE2Ijp0aGlzLndyaXRlSW50MTYoZSx0aGlzLmVuZGlhbm5lc3MpO2JyZWFrO2Nhc2UidWludDMyIjp0aGlzLndyaXRlVWludDMyKGUsdGhpcy5lbmRpYW5uZXNzKTticmVhaztjYXNlImludDMyIjp0aGlzLndyaXRlSW50MzIoZSx0aGlzLmVuZGlhbm5lc3MpO2JyZWFrO2Nhc2UiZmxvYXQzMiI6dGhpcy53cml0ZUZsb2F0MzIoZSx0aGlzLmVuZGlhbm5lc3MpO2JyZWFrO2Nhc2UiZmxvYXQ2NCI6dGhpcy53cml0ZUZsb2F0NjQoZSx0aGlzLmVuZGlhbm5lc3MpO2JyZWFrO2Nhc2UidWludDE2YmUiOnRoaXMud3JpdGVVaW50MTYoZSxhLkJJR19FTkRJQU4pO2JyZWFrO2Nhc2UiaW50MTZiZSI6dGhpcy53cml0ZUludDE2KGUsYS5CSUdfRU5ESUFOKTticmVhaztjYXNlInVpbnQzMmJlIjp0aGlzLndyaXRlVWludDMyKGUsYS5CSUdfRU5ESUFOKTticmVhaztjYXNlImludDMyYmUiOnRoaXMud3JpdGVJbnQzMihlLGEuQklHX0VORElBTik7YnJlYWs7Y2FzZSJmbG9hdDMyYmUiOnRoaXMud3JpdGVGbG9hdDMyKGUsYS5CSUdfRU5ESUFOKTticmVhaztjYXNlImZsb2F0NjRiZSI6dGhpcy53cml0ZUZsb2F0NjQoZSxhLkJJR19FTkRJQU4pO2JyZWFrO2Nhc2UidWludDE2bGUiOnRoaXMud3JpdGVVaW50MTYoZSxhLkxJVFRMRV9FTkRJQU4pO2JyZWFrO2Nhc2UiaW50MTZsZSI6dGhpcy53cml0ZUludDE2KGUsYS5MSVRUTEVfRU5ESUFOKTticmVhaztjYXNlInVpbnQzMmxlIjp0aGlzLndyaXRlVWludDMyKGUsYS5MSVRUTEVfRU5ESUFOKTticmVhaztjYXNlImludDMybGUiOnRoaXMud3JpdGVJbnQzMihlLGEuTElUVExFX0VORElBTik7YnJlYWs7Y2FzZSJmbG9hdDMybGUiOnRoaXMud3JpdGVGbG9hdDMyKGUsYS5MSVRUTEVfRU5ESUFOKTticmVhaztjYXNlImZsb2F0NjRsZSI6dGhpcy53cml0ZUZsb2F0NjQoZSxhLkxJVFRMRV9FTkRJQU4pO2JyZWFrO2Nhc2UiY3N0cmluZyI6dGhpcy53cml0ZUNTdHJpbmcoZSxuKTticmVhaztjYXNlInN0cmluZyI6dGhpcy53cml0ZVN0cmluZyhlLGYsbik7YnJlYWs7Y2FzZSJ1MTZzdHJpbmciOnRoaXMud3JpdGVVQ1MyU3RyaW5nKGUsdGhpcy5lbmRpYW5uZXNzLG4pO2JyZWFrO2Nhc2UidTE2c3RyaW5nbGUiOnRoaXMud3JpdGVVQ1MyU3RyaW5nKGUsYS5MSVRUTEVfRU5ESUFOLG4pO2JyZWFrO2Nhc2UidTE2c3RyaW5nYmUiOnRoaXMud3JpdGVVQ1MyU3RyaW5nKGUsYS5CSUdfRU5ESUFOLG4pO2JyZWFrO2RlZmF1bHQ6aWYodC5sZW5ndGg9PTMpe2Zvcih2YXIgYz10WzFdLG09MDttPGUubGVuZ3RoO20rKyl0aGlzLndyaXRlVHlwZShjLGVbbV0pO2JyZWFrfWVsc2V7dGhpcy53cml0ZVN0cnVjdCh0LGUpO2JyZWFrfX1uIT1udWxsJiYodGhpcy5wb3NpdGlvbj1kLHRoaXMuX3JlYWxsb2MobiksdGhpcy5wb3NpdGlvbj1kK24pfSxhLnByb3RvdHlwZS53cml0ZVVpbnQ2ND1mdW5jdGlvbih0KXt2YXIgZT1NYXRoLmZsb29yKHQvcCk7dGhpcy53cml0ZVVpbnQzMihlKSx0aGlzLndyaXRlVWludDMyKHQmNDI5NDk2NzI5NSl9LGEucHJvdG90eXBlLndyaXRlVWludDI0PWZ1bmN0aW9uKHQpe3RoaXMud3JpdGVVaW50OCgodCYxNjcxMTY4MCk+PjE2KSx0aGlzLndyaXRlVWludDgoKHQmNjUyODApPj44KSx0aGlzLndyaXRlVWludDgodCYyNTUpfSxhLnByb3RvdHlwZS5hZGp1c3RVaW50MzI9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnBvc2l0aW9uO3RoaXMuc2Vlayh0KSx0aGlzLndyaXRlVWludDMyKGUpLHRoaXMuc2VlayhpKX0sYS5wcm90b3R5cGUubWFwSW50MzJBcnJheT1mdW5jdGlvbih0LGUpe3RoaXMuX3JlYWxsb2ModCo0KTt2YXIgaT1uZXcgSW50MzJBcnJheSh0aGlzLl9idWZmZXIsdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sdCk7cmV0dXJuIGEuYXJyYXlUb05hdGl2ZShpLGU/P3RoaXMuZW5kaWFubmVzcyksdGhpcy5wb3NpdGlvbis9dCo0LGl9LGEucHJvdG90eXBlLm1hcEludDE2QXJyYXk9ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWFsbG9jKHQqMik7dmFyIGk9bmV3IEludDE2QXJyYXkodGhpcy5fYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQpO3JldHVybiBhLmFycmF5VG9OYXRpdmUoaSxlPz90aGlzLmVuZGlhbm5lc3MpLHRoaXMucG9zaXRpb24rPXQqMixpfSxhLnByb3RvdHlwZS5tYXBJbnQ4QXJyYXk9ZnVuY3Rpb24odCl7dGhpcy5fcmVhbGxvYyh0KjEpO3ZhciBlPW5ldyBJbnQ4QXJyYXkodGhpcy5fYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQpO3JldHVybiB0aGlzLnBvc2l0aW9uKz10KjEsZX0sYS5wcm90b3R5cGUubWFwVWludDMyQXJyYXk9ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWFsbG9jKHQqNCk7dmFyIGk9bmV3IFVpbnQzMkFycmF5KHRoaXMuX2J1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0KTtyZXR1cm4gYS5hcnJheVRvTmF0aXZlKGksZT8/dGhpcy5lbmRpYW5uZXNzKSx0aGlzLnBvc2l0aW9uKz10KjQsaX0sYS5wcm90b3R5cGUubWFwVWludDE2QXJyYXk9ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWFsbG9jKHQqMik7dmFyIGk9bmV3IFVpbnQxNkFycmF5KHRoaXMuX2J1ZmZlcix0aGlzLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbix0KTtyZXR1cm4gYS5hcnJheVRvTmF0aXZlKGksZT8/dGhpcy5lbmRpYW5uZXNzKSx0aGlzLnBvc2l0aW9uKz10KjIsaX0sYS5wcm90b3R5cGUubWFwRmxvYXQ2NEFycmF5PWZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVhbGxvYyh0KjgpO3ZhciBpPW5ldyBGbG9hdDY0QXJyYXkodGhpcy5fYnVmZmVyLHRoaXMuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uLHQpO3JldHVybiBhLmFycmF5VG9OYXRpdmUoaSxlPz90aGlzLmVuZGlhbm5lc3MpLHRoaXMucG9zaXRpb24rPXQqOCxpfSxhLnByb3RvdHlwZS5tYXBGbG9hdDMyQXJyYXk9ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWFsbG9jKHQqNCk7dmFyIGk9bmV3IEZsb2F0MzJBcnJheSh0aGlzLl9idWZmZXIsdGhpcy5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24sdCk7cmV0dXJuIGEuYXJyYXlUb05hdGl2ZShpLGU/P3RoaXMuZW5kaWFubmVzcyksdGhpcy5wb3NpdGlvbis9dCo0LGl9O3ZhciBsPWZ1bmN0aW9uKHQpe3RoaXMuYnVmZmVycz1bXSx0aGlzLmJ1ZmZlckluZGV4PS0xLHQmJih0aGlzLmluc2VydEJ1ZmZlcih0KSx0aGlzLmJ1ZmZlckluZGV4PTApfTtsLnByb3RvdHlwZT1uZXcgYShuZXcgQXJyYXlCdWZmZXIsMCxhLkJJR19FTkRJQU4pLGwucHJvdG90eXBlLmluaXRpYWxpemVkPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMuYnVmZmVySW5kZXg+LTE/ITA6dGhpcy5idWZmZXJzLmxlbmd0aD4wPyh0PXRoaXMuYnVmZmVyc1swXSx0LmZpbGVTdGFydD09PTA/KHRoaXMuYnVmZmVyPXQsdGhpcy5idWZmZXJJbmRleD0wLGguZGVidWcoIk11bHRpQnVmZmVyU3RyZWFtIiwiU3RyZWFtIHJlYWR5IGZvciBwYXJzaW5nIiksITApOihoLndhcm4oIk11bHRpQnVmZmVyU3RyZWFtIiwiVGhlIGZpcnN0IGJ1ZmZlciBzaG91bGQgaGF2ZSBhIGZpbGVTdGFydCBvZiAwIiksdGhpcy5sb2dCdWZmZXJMZXZlbCgpLCExKSk6KGgud2FybigiTXVsdGlCdWZmZXJTdHJlYW0iLCJObyBidWZmZXIgdG8gc3RhcnQgcGFyc2luZyBmcm9tIiksdGhpcy5sb2dCdWZmZXJMZXZlbCgpLCExKX0sQXJyYXlCdWZmZXIuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aC5kZWJ1ZygiQXJyYXlCdWZmZXIiLCJUcnlpbmcgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlciBvZiBzaXplOiAiKyh0LmJ5dGVMZW5ndGgrZS5ieXRlTGVuZ3RoKSk7dmFyIGk9bmV3IFVpbnQ4QXJyYXkodC5ieXRlTGVuZ3RoK2UuYnl0ZUxlbmd0aCk7cmV0dXJuIGkuc2V0KG5ldyBVaW50OEFycmF5KHQpLDApLGkuc2V0KG5ldyBVaW50OEFycmF5KGUpLHQuYnl0ZUxlbmd0aCksaS5idWZmZXJ9LGwucHJvdG90eXBlLnJlZHVjZUJ1ZmZlcj1mdW5jdGlvbih0LGUsaSl7dmFyIHM7cmV0dXJuIHM9bmV3IFVpbnQ4QXJyYXkoaSkscy5zZXQobmV3IFVpbnQ4QXJyYXkodCxlLGkpKSxzLmJ1ZmZlci5maWxlU3RhcnQ9dC5maWxlU3RhcnQrZSxzLmJ1ZmZlci51c2VkQnl0ZXM9MCxzLmJ1ZmZlcn0sbC5wcm90b3R5cGUuaW5zZXJ0QnVmZmVyPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0hMCxpPTA7aTx0aGlzLmJ1ZmZlcnMubGVuZ3RoO2krKyl7dmFyIHM9dGhpcy5idWZmZXJzW2ldO2lmKHQuZmlsZVN0YXJ0PD1zLmZpbGVTdGFydCl7aWYodC5maWxlU3RhcnQ9PT1zLmZpbGVTdGFydClpZih0LmJ5dGVMZW5ndGg+cy5ieXRlTGVuZ3RoKXt0aGlzLmJ1ZmZlcnMuc3BsaWNlKGksMSksaS0tO2NvbnRpbnVlfWVsc2UgaC53YXJuKCJNdWx0aUJ1ZmZlclN0cmVhbSIsIkJ1ZmZlciAoZmlsZVN0YXJ0OiAiK3QuZmlsZVN0YXJ0KyIgLSBMZW5ndGg6ICIrdC5ieXRlTGVuZ3RoKyIpIGFscmVhZHkgYXBwZW5kZWQsIGlnbm9yaW5nIik7ZWxzZSB0LmZpbGVTdGFydCt0LmJ5dGVMZW5ndGg8PXMuZmlsZVN0YXJ0fHwodD10aGlzLnJlZHVjZUJ1ZmZlcih0LDAscy5maWxlU3RhcnQtdC5maWxlU3RhcnQpKSxoLmRlYnVnKCJNdWx0aUJ1ZmZlclN0cmVhbSIsIkFwcGVuZGluZyBuZXcgYnVmZmVyIChmaWxlU3RhcnQ6ICIrdC5maWxlU3RhcnQrIiAtIExlbmd0aDogIit0LmJ5dGVMZW5ndGgrIikiKSx0aGlzLmJ1ZmZlcnMuc3BsaWNlKGksMCx0KSxpPT09MCYmKHRoaXMuYnVmZmVyPXQpO2U9ITE7YnJlYWt9ZWxzZSBpZih0LmZpbGVTdGFydDxzLmZpbGVTdGFydCtzLmJ5dGVMZW5ndGgpe3ZhciBuPXMuZmlsZVN0YXJ0K3MuYnl0ZUxlbmd0aC10LmZpbGVTdGFydCxmPXQuYnl0ZUxlbmd0aC1uO2lmKGY+MCl0PXRoaXMucmVkdWNlQnVmZmVyKHQsbixmKTtlbHNle2U9ITE7YnJlYWt9fX1lJiYoaC5kZWJ1ZygiTXVsdGlCdWZmZXJTdHJlYW0iLCJBcHBlbmRpbmcgbmV3IGJ1ZmZlciAoZmlsZVN0YXJ0OiAiK3QuZmlsZVN0YXJ0KyIgLSBMZW5ndGg6ICIrdC5ieXRlTGVuZ3RoKyIpIiksdGhpcy5idWZmZXJzLnB1c2godCksaT09PTAmJih0aGlzLmJ1ZmZlcj10KSl9LGwucHJvdG90eXBlLmxvZ0J1ZmZlckxldmVsPWZ1bmN0aW9uKHQpe3ZhciBlLGkscyxuLGY9W10sZCxjPSIiO2ZvcihzPTAsbj0wLGU9MDtlPHRoaXMuYnVmZmVycy5sZW5ndGg7ZSsrKWk9dGhpcy5idWZmZXJzW2VdLGU9PT0wPyhkPXt9LGYucHVzaChkKSxkLnN0YXJ0PWkuZmlsZVN0YXJ0LGQuZW5kPWkuZmlsZVN0YXJ0K2kuYnl0ZUxlbmd0aCxjKz0iWyIrZC5zdGFydCsiLSIpOmQuZW5kPT09aS5maWxlU3RhcnQ/ZC5lbmQ9aS5maWxlU3RhcnQraS5ieXRlTGVuZ3RoOihkPXt9LGQuc3RhcnQ9aS5maWxlU3RhcnQsYys9ZltmLmxlbmd0aC0xXS5lbmQtMSsiXSwgWyIrZC5zdGFydCsiLSIsZC5lbmQ9aS5maWxlU3RhcnQraS5ieXRlTGVuZ3RoLGYucHVzaChkKSkscys9aS51c2VkQnl0ZXMsbis9aS5ieXRlTGVuZ3RoO2YubGVuZ3RoPjAmJihjKz1kLmVuZC0xKyJdIik7dmFyIG09dD9oLmluZm86aC5kZWJ1Zzt0aGlzLmJ1ZmZlcnMubGVuZ3RoPT09MD9tKCJNdWx0aUJ1ZmZlclN0cmVhbSIsIk5vIG1vcmUgYnVmZmVyIGluIG1lbW9yeSIpOm0oIk11bHRpQnVmZmVyU3RyZWFtIiwiIit0aGlzLmJ1ZmZlcnMubGVuZ3RoKyIgc3RvcmVkIGJ1ZmZlcihzKSAoIitzKyIvIituKyIgYnl0ZXMpLCBjb250aW51b3VzIHJhbmdlczogIitjKX0sbC5wcm90b3R5cGUuY2xlYW5CdWZmZXJzPWZ1bmN0aW9uKCl7dmFyIHQsZTtmb3IodD0wO3Q8dGhpcy5idWZmZXJzLmxlbmd0aDt0KyspZT10aGlzLmJ1ZmZlcnNbdF0sZS51c2VkQnl0ZXM9PT1lLmJ5dGVMZW5ndGgmJihoLmRlYnVnKCJNdWx0aUJ1ZmZlclN0cmVhbSIsIlJlbW92aW5nIGJ1ZmZlciAjIit0KSx0aGlzLmJ1ZmZlcnMuc3BsaWNlKHQsMSksdC0tKX0sbC5wcm90b3R5cGUubWVyZ2VOZXh0QnVmZmVyPWZ1bmN0aW9uKCl7dmFyIHQ7aWYodGhpcy5idWZmZXJJbmRleCsxPHRoaXMuYnVmZmVycy5sZW5ndGgpaWYodD10aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleCsxXSx0LmZpbGVTdGFydD09PXRoaXMuYnVmZmVyLmZpbGVTdGFydCt0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKXt2YXIgZT10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoLGk9dGhpcy5idWZmZXIudXNlZEJ5dGVzLHM9dGhpcy5idWZmZXIuZmlsZVN0YXJ0O3JldHVybiB0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF09QXJyYXlCdWZmZXIuY29uY2F0KHRoaXMuYnVmZmVyLHQpLHRoaXMuYnVmZmVyPXRoaXMuYnVmZmVyc1t0aGlzLmJ1ZmZlckluZGV4XSx0aGlzLmJ1ZmZlcnMuc3BsaWNlKHRoaXMuYnVmZmVySW5kZXgrMSwxKSx0aGlzLmJ1ZmZlci51c2VkQnl0ZXM9aSx0aGlzLmJ1ZmZlci5maWxlU3RhcnQ9cyxoLmRlYnVnKCJJU09GaWxlIiwiQ29uY2F0ZW5hdGluZyBidWZmZXIgZm9yIGJveCBwYXJzaW5nIChsZW5ndGg6ICIrZSsiLT4iK3RoaXMuYnVmZmVyLmJ5dGVMZW5ndGgrIikiKSwhMH1lbHNlIHJldHVybiExO2Vsc2UgcmV0dXJuITF9LGwucHJvdG90eXBlLmZpbmRQb3NpdGlvbj1mdW5jdGlvbih0LGUsaSl7dmFyIHMsbj1udWxsLGY9LTE7Zm9yKHQ9PT0hMD9zPTA6cz10aGlzLmJ1ZmZlckluZGV4O3M8dGhpcy5idWZmZXJzLmxlbmd0aCYmKG49dGhpcy5idWZmZXJzW3NdLG4uZmlsZVN0YXJ0PD1lKTspe2Y9cyxpJiYobi5maWxlU3RhcnQrbi5ieXRlTGVuZ3RoPD1lP24udXNlZEJ5dGVzPW4uYnl0ZUxlbmd0aDpuLnVzZWRCeXRlcz1lLW4uZmlsZVN0YXJ0LHRoaXMubG9nQnVmZmVyTGV2ZWwoKSk7cysrfXJldHVybiBmIT09LTE/KG49dGhpcy5idWZmZXJzW2ZdLG4uZmlsZVN0YXJ0K24uYnl0ZUxlbmd0aD49ZT8oaC5kZWJ1ZygiTXVsdGlCdWZmZXJTdHJlYW0iLCJGb3VuZCBwb3NpdGlvbiBpbiBleGlzdGluZyBidWZmZXIgIyIrZiksZik6LTEpOi0xfSxsLnByb3RvdHlwZS5maW5kRW5kQ29udGlndW91c0J1Zj1mdW5jdGlvbih0KXt2YXIgZSxpLHMsbj10IT09dm9pZCAwP3Q6dGhpcy5idWZmZXJJbmRleDtpZihpPXRoaXMuYnVmZmVyc1tuXSx0aGlzLmJ1ZmZlcnMubGVuZ3RoPm4rMSlmb3IoZT1uKzE7ZTx0aGlzLmJ1ZmZlcnMubGVuZ3RoJiYocz10aGlzLmJ1ZmZlcnNbZV0scy5maWxlU3RhcnQ9PT1pLmZpbGVTdGFydCtpLmJ5dGVMZW5ndGgpO2UrKylpPXM7cmV0dXJuIGkuZmlsZVN0YXJ0K2kuYnl0ZUxlbmd0aH0sbC5wcm90b3R5cGUuZ2V0RW5kRmlsZVBvc2l0aW9uQWZ0ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5maW5kUG9zaXRpb24oITAsdCwhMSk7cmV0dXJuIGUhPT0tMT90aGlzLmZpbmRFbmRDb250aWd1b3VzQnVmKGUpOnR9LGwucHJvdG90eXBlLmFkZFVzZWRCeXRlcz1mdW5jdGlvbih0KXt0aGlzLmJ1ZmZlci51c2VkQnl0ZXMrPXQsdGhpcy5sb2dCdWZmZXJMZXZlbCgpfSxsLnByb3RvdHlwZS5zZXRBbGxVc2VkQnl0ZXM9ZnVuY3Rpb24oKXt0aGlzLmJ1ZmZlci51c2VkQnl0ZXM9dGhpcy5idWZmZXIuYnl0ZUxlbmd0aCx0aGlzLmxvZ0J1ZmZlckxldmVsKCl9LGwucHJvdG90eXBlLnNlZWs9ZnVuY3Rpb24odCxlLGkpe3ZhciBzO3JldHVybiBzPXRoaXMuZmluZFBvc2l0aW9uKGUsdCxpKSxzIT09LTE/KHRoaXMuYnVmZmVyPXRoaXMuYnVmZmVyc1tzXSx0aGlzLmJ1ZmZlckluZGV4PXMsdGhpcy5wb3NpdGlvbj10LXRoaXMuYnVmZmVyLmZpbGVTdGFydCxoLmRlYnVnKCJNdWx0aUJ1ZmZlclN0cmVhbSIsIlJlcG9zaXRpb25pbmcgcGFyc2VyIGF0IGJ1ZmZlciBwb3NpdGlvbjogIit0aGlzLnBvc2l0aW9uKSwhMCk6KGguZGVidWcoIk11bHRpQnVmZmVyU3RyZWFtIiwiUG9zaXRpb24gIit0KyIgbm90IGZvdW5kIGluIGJ1ZmZlcmVkIGRhdGEiKSwhMSl9LGwucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5idWZmZXJJbmRleD09PS0xfHx0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF09PT1udWxsKXRocm93IkVycm9yIGFjY2Vzc2luZyBwb3NpdGlvbiBpbiB0aGUgTXVsdGlCdWZmZXJTdHJlYW0iO3JldHVybiB0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF0uZmlsZVN0YXJ0K3RoaXMucG9zaXRpb259LGwucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVMZW5ndGh9LGwucHJvdG90eXBlLmdldEVuZFBvc2l0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5idWZmZXJJbmRleD09PS0xfHx0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF09PT1udWxsKXRocm93IkVycm9yIGFjY2Vzc2luZyBwb3NpdGlvbiBpbiB0aGUgTXVsdGlCdWZmZXJTdHJlYW0iO3JldHVybiB0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF0uZmlsZVN0YXJ0K3RoaXMuYnl0ZUxlbmd0aH0sRS5NdWx0aUJ1ZmZlclN0cmVhbT1sO3ZhciBfPWZ1bmN0aW9uKCl7dmFyIHQ9MyxlPTQsaT01LHM9NixuPVtdO25bdF09IkVTX0Rlc2NyaXB0b3IiLG5bZV09IkRlY29kZXJDb25maWdEZXNjcmlwdG9yIixuW2ldPSJEZWNvZGVyU3BlY2lmaWNJbmZvIixuW3NdPSJTTENvbmZpZ0Rlc2NyaXB0b3IiLHRoaXMuZ2V0RGVzY3JpcHRvck5hbWU9ZnVuY3Rpb24oYyl7cmV0dXJuIG5bY119O3ZhciBmPXRoaXMsZD17fTtyZXR1cm4gdGhpcy5wYXJzZU9uZURlc2NyaXB0b3I9ZnVuY3Rpb24oYyl7dmFyIG09MCx4LFUsYjtmb3IoeD1jLnJlYWRVaW50OCgpLGI9Yy5yZWFkVWludDgoKTtiJjEyODspbT0oYiYxMjcpPDw3LGI9Yy5yZWFkVWludDgoKTtyZXR1cm4gbSs9YiYxMjcsaC5kZWJ1ZygiTVBFRzREZXNjcmlwdG9yUGFyc2VyIiwiRm91bmQgIisoblt4XXx8IkRlc2NyaXB0b3IgIit4KSsiLCBzaXplICIrbSsiIGF0IHBvc2l0aW9uICIrYy5nZXRQb3NpdGlvbigpKSxuW3hdP1U9bmV3IGRbblt4XV0obSk6VT1uZXcgZC5EZXNjcmlwdG9yKG0pLFUucGFyc2UoYyksVX0sZC5EZXNjcmlwdG9yPWZ1bmN0aW9uKGMsbSl7dGhpcy50YWc9Yyx0aGlzLnNpemU9bSx0aGlzLmRlc2NzPVtdfSxkLkRlc2NyaXB0b3IucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGMpe3RoaXMuZGF0YT1jLnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZSl9LGQuRGVzY3JpcHRvci5wcm90b3R5cGUuZmluZERlc2NyaXB0b3I9ZnVuY3Rpb24oYyl7Zm9yKHZhciBtPTA7bTx0aGlzLmRlc2NzLmxlbmd0aDttKyspaWYodGhpcy5kZXNjc1ttXS50YWc9PWMpcmV0dXJuIHRoaXMuZGVzY3NbbV07cmV0dXJuIG51bGx9LGQuRGVzY3JpcHRvci5wcm90b3R5cGUucGFyc2VSZW1haW5pbmdEZXNjcmlwdG9ycz1mdW5jdGlvbihjKXtmb3IodmFyIG09Yy5wb3NpdGlvbjtjLnBvc2l0aW9uPG0rdGhpcy5zaXplOyl7dmFyIHg9Zi5wYXJzZU9uZURlc2NyaXB0b3IoYyk7dGhpcy5kZXNjcy5wdXNoKHgpfX0sZC5FU19EZXNjcmlwdG9yPWZ1bmN0aW9uKGMpe2QuRGVzY3JpcHRvci5jYWxsKHRoaXMsdCxjKX0sZC5FU19EZXNjcmlwdG9yLnByb3RvdHlwZT1uZXcgZC5EZXNjcmlwdG9yLGQuRVNfRGVzY3JpcHRvci5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYyl7aWYodGhpcy5FU19JRD1jLnJlYWRVaW50MTYoKSx0aGlzLmZsYWdzPWMucmVhZFVpbnQ4KCksdGhpcy5zaXplLT0zLHRoaXMuZmxhZ3MmMTI4Pyh0aGlzLmRlcGVuZHNPbl9FU19JRD1jLnJlYWRVaW50MTYoKSx0aGlzLnNpemUtPTIpOnRoaXMuZGVwZW5kc09uX0VTX0lEPTAsdGhpcy5mbGFncyY2NCl7dmFyIG09Yy5yZWFkVWludDgoKTt0aGlzLlVSTD1jLnJlYWRTdHJpbmcobSksdGhpcy5zaXplLT1tKzF9ZWxzZSB0aGlzLlVSTD0iIjt0aGlzLmZsYWdzJjMyPyh0aGlzLk9DUl9FU19JRD1jLnJlYWRVaW50MTYoKSx0aGlzLnNpemUtPTIpOnRoaXMuT0NSX0VTX0lEPTAsdGhpcy5wYXJzZVJlbWFpbmluZ0Rlc2NyaXB0b3JzKGMpfSxkLkVTX0Rlc2NyaXB0b3IucHJvdG90eXBlLmdldE9UST1mdW5jdGlvbihjKXt2YXIgbT10aGlzLmZpbmREZXNjcmlwdG9yKGUpO3JldHVybiBtP20ub3RpOjB9LGQuRVNfRGVzY3JpcHRvci5wcm90b3R5cGUuZ2V0QXVkaW9Db25maWc9ZnVuY3Rpb24oYyl7dmFyIG09dGhpcy5maW5kRGVzY3JpcHRvcihlKTtpZighbSlyZXR1cm4gbnVsbDt2YXIgeD1tLmZpbmREZXNjcmlwdG9yKGkpO2lmKHgmJnguZGF0YSl7dmFyIFU9KHguZGF0YVswXSYyNDgpPj4zO3JldHVybiBVPT09MzEmJnguZGF0YS5sZW5ndGg+PTImJihVPTMyKygoeC5kYXRhWzBdJjcpPDwzKSsoKHguZGF0YVsxXSYyMjQpPj41KSksVX1lbHNlIHJldHVybiBudWxsfSxkLkRlY29kZXJDb25maWdEZXNjcmlwdG9yPWZ1bmN0aW9uKGMpe2QuRGVzY3JpcHRvci5jYWxsKHRoaXMsZSxjKX0sZC5EZWNvZGVyQ29uZmlnRGVzY3JpcHRvci5wcm90b3R5cGU9bmV3IGQuRGVzY3JpcHRvcixkLkRlY29kZXJDb25maWdEZXNjcmlwdG9yLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihjKXt0aGlzLm90aT1jLnJlYWRVaW50OCgpLHRoaXMuc3RyZWFtVHlwZT1jLnJlYWRVaW50OCgpLHRoaXMuYnVmZmVyU2l6ZT1jLnJlYWRVaW50MjQoKSx0aGlzLm1heEJpdHJhdGU9Yy5yZWFkVWludDMyKCksdGhpcy5hdmdCaXRyYXRlPWMucmVhZFVpbnQzMigpLHRoaXMuc2l6ZS09MTMsdGhpcy5wYXJzZVJlbWFpbmluZ0Rlc2NyaXB0b3JzKGMpfSxkLkRlY29kZXJTcGVjaWZpY0luZm89ZnVuY3Rpb24oYyl7ZC5EZXNjcmlwdG9yLmNhbGwodGhpcyxpLGMpfSxkLkRlY29kZXJTcGVjaWZpY0luZm8ucHJvdG90eXBlPW5ldyBkLkRlc2NyaXB0b3IsZC5TTENvbmZpZ0Rlc2NyaXB0b3I9ZnVuY3Rpb24oYyl7ZC5EZXNjcmlwdG9yLmNhbGwodGhpcyxzLGMpfSxkLlNMQ29uZmlnRGVzY3JpcHRvci5wcm90b3R5cGU9bmV3IGQuRGVzY3JpcHRvcix0aGlzfTtFLk1QRUc0RGVzY3JpcHRvclBhcnNlcj1fO3ZhciByPXtFUlJfSU5WQUxJRF9EQVRBOi0xLEVSUl9OT1RfRU5PVUdIX0RBVEE6MCxPSzoxLEJBU0lDX0JPWEVTOlsibWRhdCIsImlkYXQiLCJmcmVlIiwic2tpcCIsIm1lY28iLCJzdHJrIl0sRlVMTF9CT1hFUzpbImhtaGQiLCJubWhkIiwiaW9kcyIsInhtbCAiLCJieG1sIiwiaXBybyIsIm1lcmUiXSxDT05UQUlORVJfQk9YRVM6W1sibW9vdiIsWyJ0cmFrIiwicHNzaCJdXSxbInRyYWsiXSxbImVkdHMiXSxbIm1kaWEiXSxbIm1pbmYiXSxbImRpbmYiXSxbInN0YmwiLFsic2dwZCIsInNiZ3AiXV0sWyJtdmV4IixbInRyZXgiXV0sWyJtb29mIixbInRyYWYiXV0sWyJ0cmFmIixbInRydW4iLCJzZ3BkIiwic2JncCJdXSxbInZ0dGMiXSxbInRyZWYiXSxbImlyZWYiXSxbIm1mcmEiLFsidGZyYSJdXSxbIm1lY28iXSxbImhudGkiXSxbImhpbmYiXSxbInN0cmsiXSxbInN0cmQiXSxbInNpbmYiXSxbInJpbmYiXSxbInNjaGkiXSxbInRyZ3IiXSxbInVkdGEiLFsia2luZCJdXSxbImlwcnAiLFsiaXBtYSJdXSxbImlwY28iXV0sYm94Q29kZXM6W10sZnVsbEJveENvZGVzOltdLGNvbnRhaW5lckJveENvZGVzOltdLHNhbXBsZUVudHJ5Q29kZXM6e30sc2FtcGxlR3JvdXBFbnRyeUNvZGVzOltdLHRyYWNrR3JvdXBUeXBlczpbXSxVVUlEQm94ZXM6e30sVVVJRHM6W10saW5pdGlhbGl6ZTpmdW5jdGlvbigpe3IuRnVsbEJveC5wcm90b3R5cGU9bmV3IHIuQm94LHIuQ29udGFpbmVyQm94LnByb3RvdHlwZT1uZXcgci5Cb3gsci5TYW1wbGVFbnRyeS5wcm90b3R5cGU9bmV3IHIuQm94LHIuVHJhY2tHcm91cFR5cGVCb3gucHJvdG90eXBlPW5ldyByLkZ1bGxCb3gsci5CQVNJQ19CT1hFUy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3IuY3JlYXRlQm94Q3Rvcih0KX0pLHIuRlVMTF9CT1hFUy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3IuY3JlYXRlRnVsbEJveEN0b3IodCl9KSxyLkNPTlRBSU5FUl9CT1hFUy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3IuY3JlYXRlQ29udGFpbmVyQm94Q3Rvcih0WzBdLG51bGwsdFsxXSl9KX0sQm94OmZ1bmN0aW9uKHQsZSxpKXt0aGlzLnR5cGU9dCx0aGlzLnNpemU9ZSx0aGlzLnV1aWQ9aX0sRnVsbEJveDpmdW5jdGlvbih0LGUsaSl7ci5Cb3guY2FsbCh0aGlzLHQsZSxpKSx0aGlzLmZsYWdzPTAsdGhpcy52ZXJzaW9uPTB9LENvbnRhaW5lckJveDpmdW5jdGlvbih0LGUsaSl7ci5Cb3guY2FsbCh0aGlzLHQsZSxpKSx0aGlzLmJveGVzPVtdfSxTYW1wbGVFbnRyeTpmdW5jdGlvbih0LGUsaSxzKXtyLkNvbnRhaW5lckJveC5jYWxsKHRoaXMsdCxlKSx0aGlzLmhkcl9zaXplPWksdGhpcy5zdGFydD1zfSxTYW1wbGVHcm91cEVudHJ5OmZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBpbmdfdHlwZT10fSxUcmFja0dyb3VwVHlwZUJveDpmdW5jdGlvbih0LGUpe3IuRnVsbEJveC5jYWxsKHRoaXMsdCxlKX0sY3JlYXRlQm94Q3RvcjpmdW5jdGlvbih0LGUpe3IuYm94Q29kZXMucHVzaCh0KSxyW3QrIkJveCJdPWZ1bmN0aW9uKGkpe3IuQm94LmNhbGwodGhpcyx0LGkpfSxyW3QrIkJveCJdLnByb3RvdHlwZT1uZXcgci5Cb3gsZSYmKHJbdCsiQm94Il0ucHJvdG90eXBlLnBhcnNlPWUpfSxjcmVhdGVGdWxsQm94Q3RvcjpmdW5jdGlvbih0LGUpe3JbdCsiQm94Il09ZnVuY3Rpb24oaSl7ci5GdWxsQm94LmNhbGwodGhpcyx0LGkpfSxyW3QrIkJveCJdLnByb3RvdHlwZT1uZXcgci5GdWxsQm94LHJbdCsiQm94Il0ucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGkpe3RoaXMucGFyc2VGdWxsSGVhZGVyKGkpLGUmJmUuY2FsbCh0aGlzLGkpfX0sYWRkU3ViQm94QXJyYXlzOmZ1bmN0aW9uKHQpe2lmKHQpe3RoaXMuc3ViQm94TmFtZXM9dDtmb3IodmFyIGU9dC5sZW5ndGgsaT0wO2k8ZTtpKyspdGhpc1t0W2ldKyJzIl09W119fSxjcmVhdGVDb250YWluZXJCb3hDdG9yOmZ1bmN0aW9uKHQsZSxpKXtyW3QrIkJveCJdPWZ1bmN0aW9uKHMpe3IuQ29udGFpbmVyQm94LmNhbGwodGhpcyx0LHMpLHIuYWRkU3ViQm94QXJyYXlzLmNhbGwodGhpcyxpKX0sclt0KyJCb3giXS5wcm90b3R5cGU9bmV3IHIuQ29udGFpbmVyQm94LGUmJihyW3QrIkJveCJdLnByb3RvdHlwZS5wYXJzZT1lKX0sY3JlYXRlTWVkaWFTYW1wbGVFbnRyeUN0b3I6ZnVuY3Rpb24odCxlLGkpe3Iuc2FtcGxlRW50cnlDb2Rlc1t0XT1bXSxyW3QrIlNhbXBsZUVudHJ5Il09ZnVuY3Rpb24ocyxuKXtyLlNhbXBsZUVudHJ5LmNhbGwodGhpcyxzLG4pLHIuYWRkU3ViQm94QXJyYXlzLmNhbGwodGhpcyxpKX0sclt0KyJTYW1wbGVFbnRyeSJdLnByb3RvdHlwZT1uZXcgci5TYW1wbGVFbnRyeSxlJiYoclt0KyJTYW1wbGVFbnRyeSJdLnByb3RvdHlwZS5wYXJzZT1lKX0sY3JlYXRlU2FtcGxlRW50cnlDdG9yOmZ1bmN0aW9uKHQsZSxpLHMpe3Iuc2FtcGxlRW50cnlDb2Rlc1t0XS5wdXNoKGUpLHJbZSsiU2FtcGxlRW50cnkiXT1mdW5jdGlvbihuKXtyW3QrIlNhbXBsZUVudHJ5Il0uY2FsbCh0aGlzLGUsbiksci5hZGRTdWJCb3hBcnJheXMuY2FsbCh0aGlzLHMpfSxyW2UrIlNhbXBsZUVudHJ5Il0ucHJvdG90eXBlPW5ldyByW3QrIlNhbXBsZUVudHJ5Il0saSYmKHJbZSsiU2FtcGxlRW50cnkiXS5wcm90b3R5cGUucGFyc2U9aSl9LGNyZWF0ZUVuY3J5cHRlZFNhbXBsZUVudHJ5Q3RvcjpmdW5jdGlvbih0LGUsaSl7ci5jcmVhdGVTYW1wbGVFbnRyeUN0b3IuY2FsbCh0aGlzLHQsZSxpLFsic2luZiJdKX0sY3JlYXRlU2FtcGxlR3JvdXBDdG9yOmZ1bmN0aW9uKHQsZSl7clt0KyJTYW1wbGVHcm91cEVudHJ5Il09ZnVuY3Rpb24oaSl7ci5TYW1wbGVHcm91cEVudHJ5LmNhbGwodGhpcyx0LGkpfSxyW3QrIlNhbXBsZUdyb3VwRW50cnkiXS5wcm90b3R5cGU9bmV3IHIuU2FtcGxlR3JvdXBFbnRyeSxlJiYoclt0KyJTYW1wbGVHcm91cEVudHJ5Il0ucHJvdG90eXBlLnBhcnNlPWUpfSxjcmVhdGVUcmFja0dyb3VwQ3RvcjpmdW5jdGlvbih0LGUpe3JbdCsiVHJhY2tHcm91cFR5cGVCb3giXT1mdW5jdGlvbihpKXtyLlRyYWNrR3JvdXBUeXBlQm94LmNhbGwodGhpcyx0LGkpfSxyW3QrIlRyYWNrR3JvdXBUeXBlQm94Il0ucHJvdG90eXBlPW5ldyByLlRyYWNrR3JvdXBUeXBlQm94LGUmJihyW3QrIlRyYWNrR3JvdXBUeXBlQm94Il0ucHJvdG90eXBlLnBhcnNlPWUpfSxjcmVhdGVVVUlEQm94OmZ1bmN0aW9uKHQsZSxpLHMpe3IuVVVJRHMucHVzaCh0KSxyLlVVSURCb3hlc1t0XT1mdW5jdGlvbihuKXtlP3IuRnVsbEJveC5jYWxsKHRoaXMsInV1aWQiLG4sdCk6aT9yLkNvbnRhaW5lckJveC5jYWxsKHRoaXMsInV1aWQiLG4sdCk6ci5Cb3guY2FsbCh0aGlzLCJ1dWlkIixuLHQpfSxyLlVVSURCb3hlc1t0XS5wcm90b3R5cGU9ZT9uZXcgci5GdWxsQm94Omk/bmV3IHIuQ29udGFpbmVyQm94Om5ldyByLkJveCxzJiYoZT9yLlVVSURCb3hlc1t0XS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24obil7dGhpcy5wYXJzZUZ1bGxIZWFkZXIobikscyYmcy5jYWxsKHRoaXMsbil9OnIuVVVJREJveGVzW3RdLnByb3RvdHlwZS5wYXJzZT1zKX19O3IuaW5pdGlhbGl6ZSgpLHIuVEtIRF9GTEFHX0VOQUJMRUQ9MSxyLlRLSERfRkxBR19JTl9NT1ZJRT0yLHIuVEtIRF9GTEFHX0lOX1BSRVZJRVc9NCxyLlRGSERfRkxBR19CQVNFX0RBVEFfT0ZGU0VUPTEsci5URkhEX0ZMQUdfU0FNUExFX0RFU0M9MixyLlRGSERfRkxBR19TQU1QTEVfRFVSPTgsci5URkhEX0ZMQUdfU0FNUExFX1NJWkU9MTYsci5URkhEX0ZMQUdfU0FNUExFX0ZMQUdTPTMyLHIuVEZIRF9GTEFHX0RVUl9FTVBUWT02NTUzNixyLlRGSERfRkxBR19ERUZBVUxUX0JBU0VfSVNfTU9PRj0xMzEwNzIsci5UUlVOX0ZMQUdTX0RBVEFfT0ZGU0VUPTEsci5UUlVOX0ZMQUdTX0ZJUlNUX0ZMQUc9NCxyLlRSVU5fRkxBR1NfRFVSQVRJT049MjU2LHIuVFJVTl9GTEFHU19TSVpFPTUxMixyLlRSVU5fRkxBR1NfRkxBR1M9MTAyNCxyLlRSVU5fRkxBR1NfQ1RTX09GRlNFVD0yMDQ4LHIuQm94LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkQm94KG5ldyByW3QrIkJveCJdKX0sci5Cb3gucHJvdG90eXBlLmFkZEJveD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ib3hlcy5wdXNoKHQpLHRoaXNbdC50eXBlKyJzIl0/dGhpc1t0LnR5cGUrInMiXS5wdXNoKHQpOnRoaXNbdC50eXBlXT10LHR9LHIuQm94LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpc1t0XT1lLHRoaXN9LHIuQm94LnByb3RvdHlwZS5hZGRFbnRyeT1mdW5jdGlvbih0LGUpe3ZhciBpPWV8fCJlbnRyaWVzIjtyZXR1cm4gdGhpc1tpXXx8KHRoaXNbaV09W10pLHRoaXNbaV0ucHVzaCh0KSx0aGlzfSxFLkJveFBhcnNlcj1yLHIucGFyc2VVVUlEPWZ1bmN0aW9uKHQpe3JldHVybiByLnBhcnNlSGV4MTYodCl9LHIucGFyc2VIZXgxNj1mdW5jdGlvbih0KXtmb3IodmFyIGU9IiIsaT0wO2k8MTY7aSsrKXt2YXIgcz10LnJlYWRVaW50OCgpLnRvU3RyaW5nKDE2KTtlKz1zLmxlbmd0aD09PTE/IjAiK3M6c31yZXR1cm4gZX0sci5wYXJzZU9uZUJveD1mdW5jdGlvbih0LGUsaSl7dmFyIHMsbj10LmdldFBvc2l0aW9uKCksZj0wLGQsYztpZih0LmdldEVuZFBvc2l0aW9uKCktbjw4KXJldHVybiBoLmRlYnVnKCJCb3hQYXJzZXIiLCJOb3QgZW5vdWdoIGRhdGEgaW4gc3RyZWFtIHRvIHBhcnNlIHRoZSB0eXBlIGFuZCBzaXplIG9mIHRoZSBib3giKSx7Y29kZTpyLkVSUl9OT1RfRU5PVUdIX0RBVEF9O2lmKGkmJmk8OClyZXR1cm4gaC5kZWJ1ZygiQm94UGFyc2VyIiwiTm90IGVub3VnaCBieXRlcyBsZWZ0IGluIHRoZSBwYXJlbnQgYm94IHRvIHBhcnNlIGEgbmV3IGJveCIpLHtjb2RlOnIuRVJSX05PVF9FTk9VR0hfREFUQX07dmFyIG09dC5yZWFkVWludDMyKCkseD10LnJlYWRTdHJpbmcoNCksVT14O2lmKGguZGVidWcoIkJveFBhcnNlciIsIkZvdW5kIGJveCBvZiB0eXBlICciK3grIicgYW5kIHNpemUgIittKyIgYXQgcG9zaXRpb24gIituKSxmPTgseD09InV1aWQiKXtpZih0LmdldEVuZFBvc2l0aW9uKCktdC5nZXRQb3NpdGlvbigpPDE2fHxpLWY8MTYpcmV0dXJuIHQuc2VlayhuKSxoLmRlYnVnKCJCb3hQYXJzZXIiLCJOb3QgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIHBhcmVudCBib3ggdG8gcGFyc2UgYSBVVUlEIGJveCIpLHtjb2RlOnIuRVJSX05PVF9FTk9VR0hfREFUQX07Yz1yLnBhcnNlVVVJRCh0KSxmKz0xNixVPWN9aWYobT09MSl7aWYodC5nZXRFbmRQb3NpdGlvbigpLXQuZ2V0UG9zaXRpb24oKTw4fHxpJiZpLWY8OClyZXR1cm4gdC5zZWVrKG4pLGgud2FybigiQm94UGFyc2VyIiwnTm90IGVub3VnaCBkYXRhIGluIHN0cmVhbSB0byBwYXJzZSB0aGUgZXh0ZW5kZWQgc2l6ZSBvZiB0aGUgIicreCsnIiBib3gnKSx7Y29kZTpyLkVSUl9OT1RfRU5PVUdIX0RBVEF9O209dC5yZWFkVWludDY0KCksZis9OH1lbHNlIGlmKG09PT0wKXtpZihpKW09aTtlbHNlIGlmKHghPT0ibWRhdCIpcmV0dXJuIGguZXJyb3IoIkJveFBhcnNlciIsIlVubGltaXRlZCBib3ggc2l6ZSBub3Qgc3VwcG9ydGVkIGZvciB0eXBlOiAnIit4KyInIikscz1uZXcgci5Cb3goeCxtKSx7Y29kZTpyLk9LLGJveDpzLHNpemU6cy5zaXplfX1yZXR1cm4gbSE9PTAmJm08Zj8oaC5lcnJvcigiQm94UGFyc2VyIiwiQm94IG9mIHR5cGUgIit4KyIgaGFzIGFuIGludmFsaWQgc2l6ZSAiK20rIiAodG9vIHNtYWxsIHRvIGJlIGEgYm94KSIpLHtjb2RlOnIuRVJSX05PVF9FTk9VR0hfREFUQSx0eXBlOngsc2l6ZTptLGhkcl9zaXplOmYsc3RhcnQ6bn0pOm0hPT0wJiZpJiZtPmk/KGguZXJyb3IoIkJveFBhcnNlciIsIkJveCBvZiB0eXBlICciK3grIicgaGFzIGEgc2l6ZSAiK20rIiBncmVhdGVyIHRoYW4gaXRzIGNvbnRhaW5lciBzaXplICIraSkse2NvZGU6ci5FUlJfTk9UX0VOT1VHSF9EQVRBLHR5cGU6eCxzaXplOm0saGRyX3NpemU6ZixzdGFydDpufSk6bSE9PTAmJm4rbT50LmdldEVuZFBvc2l0aW9uKCk/KHQuc2VlayhuKSxoLmluZm8oIkJveFBhcnNlciIsIk5vdCBlbm91Z2ggZGF0YSBpbiBzdHJlYW0gdG8gcGFyc2UgdGhlIGVudGlyZSAnIit4KyInIGJveCIpLHtjb2RlOnIuRVJSX05PVF9FTk9VR0hfREFUQSx0eXBlOngsc2l6ZTptLGhkcl9zaXplOmYsc3RhcnQ6bn0pOmU/e2NvZGU6ci5PSyx0eXBlOngsc2l6ZTptLGhkcl9zaXplOmYsc3RhcnQ6bn06KHJbeCsiQm94Il0/cz1uZXcgclt4KyJCb3giXShtKTp4IT09InV1aWQiPyhoLndhcm4oIkJveFBhcnNlciIsIlVua25vd24gYm94IHR5cGU6ICciK3grIiciKSxzPW5ldyByLkJveCh4LG0pLHMuaGFzX3VucGFyc2VkX2RhdGE9ITApOnIuVVVJREJveGVzW2NdP3M9bmV3IHIuVVVJREJveGVzW2NdKG0pOihoLndhcm4oIkJveFBhcnNlciIsIlVua25vd24gdXVpZCB0eXBlOiAnIitjKyInIikscz1uZXcgci5Cb3goeCxtKSxzLnV1aWQ9YyxzLmhhc191bnBhcnNlZF9kYXRhPSEwKSxzLmhkcl9zaXplPWYscy5zdGFydD1uLHMud3JpdGU9PT1yLkJveC5wcm90b3R5cGUud3JpdGUmJnMudHlwZSE9PSJtZGF0IiYmKGguaW5mbygiQm94UGFyc2VyIiwiJyIrVSsiJyBib3ggd3JpdGluZyBub3QgeWV0IGltcGxlbWVudGVkLCBrZWVwaW5nIHVucGFyc2VkIGRhdGEgaW4gbWVtb3J5IGZvciBsYXRlciB3cml0ZSIpLHMucGFyc2VEYXRhQW5kUmV3aW5kKHQpKSxzLnBhcnNlKHQpLGQ9dC5nZXRQb3NpdGlvbigpLShzLnN0YXJ0K3Muc2l6ZSksZDwwPyhoLndhcm4oIkJveFBhcnNlciIsIlBhcnNpbmcgb2YgYm94ICciK1UrIicgZGlkIG5vdCByZWFkIHRoZSBlbnRpcmUgaW5kaWNhdGVkIGJveCBkYXRhIHNpemUgKG1pc3NpbmcgIistZCsiIGJ5dGVzKSwgc2Vla2luZyBmb3J3YXJkIiksdC5zZWVrKHMuc3RhcnQrcy5zaXplKSk6ZD4wJiYoaC5lcnJvcigiQm94UGFyc2VyIiwiUGFyc2luZyBvZiBib3ggJyIrVSsiJyByZWFkICIrZCsiIG1vcmUgYnl0ZXMgdGhhbiB0aGUgaW5kaWNhdGVkIGJveCBkYXRhIHNpemUsIHNlZWtpbmcgYmFja3dhcmRzIikscy5zaXplIT09MCYmdC5zZWVrKHMuc3RhcnQrcy5zaXplKSkse2NvZGU6ci5PSyxib3g6cyxzaXplOnMuc2l6ZX0pfSxyLkJveC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7dGhpcy50eXBlIT0ibWRhdCI/dGhpcy5kYXRhPXQucmVhZFVpbnQ4QXJyYXkodGhpcy5zaXplLXRoaXMuaGRyX3NpemUpOnRoaXMuc2l6ZT09PTA/dC5zZWVrKHQuZ2V0RW5kUG9zaXRpb24oKSk6dC5zZWVrKHRoaXMuc3RhcnQrdGhpcy5zaXplKX0sci5Cb3gucHJvdG90eXBlLnBhcnNlRGF0YUFuZFJld2luZD1mdW5jdGlvbih0KXt0aGlzLmRhdGE9dC5yZWFkVWludDhBcnJheSh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSksdC5wb3NpdGlvbi09dGhpcy5zaXplLXRoaXMuaGRyX3NpemV9LHIuRnVsbEJveC5wcm90b3R5cGUucGFyc2VEYXRhQW5kUmV3aW5kPWZ1bmN0aW9uKHQpe3RoaXMucGFyc2VGdWxsSGVhZGVyKHQpLHRoaXMuZGF0YT10LnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplKSx0aGlzLmhkcl9zaXplLT00LHQucG9zaXRpb24tPXRoaXMuc2l6ZS10aGlzLmhkcl9zaXplfSxyLkZ1bGxCb3gucHJvdG90eXBlLnBhcnNlRnVsbEhlYWRlcj1mdW5jdGlvbih0KXt0aGlzLnZlcnNpb249dC5yZWFkVWludDgoKSx0aGlzLmZsYWdzPXQucmVhZFVpbnQyNCgpLHRoaXMuaGRyX3NpemUrPTR9LHIuRnVsbEJveC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7dGhpcy5wYXJzZUZ1bGxIZWFkZXIodCksdGhpcy5kYXRhPXQucmVhZFVpbnQ4QXJyYXkodGhpcy5zaXplLXRoaXMuaGRyX3NpemUpfSxyLkNvbnRhaW5lckJveC5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk7dC5nZXRQb3NpdGlvbigpPHRoaXMuc3RhcnQrdGhpcy5zaXplOylpZihlPXIucGFyc2VPbmVCb3godCwhMSx0aGlzLnNpemUtKHQuZ2V0UG9zaXRpb24oKS10aGlzLnN0YXJ0KSksZS5jb2RlPT09ci5PSylpZihpPWUuYm94LHRoaXMuYm94ZXMucHVzaChpKSx0aGlzLnN1YkJveE5hbWVzJiZ0aGlzLnN1YkJveE5hbWVzLmluZGV4T2YoaS50eXBlKSE9LTEpdGhpc1t0aGlzLnN1YkJveE5hbWVzW3RoaXMuc3ViQm94TmFtZXMuaW5kZXhPZihpLnR5cGUpXSsicyJdLnB1c2goaSk7ZWxzZXt2YXIgcz1pLnR5cGUhPT0idXVpZCI/aS50eXBlOmkudXVpZDt0aGlzW3NdP2gud2FybigiQm94IG9mIHR5cGUgIitzKyIgYWxyZWFkeSBzdG9yZWQgaW4gZmllbGQgb2YgdGhpcyB0eXBlIik6dGhpc1tzXT1pfWVsc2UgcmV0dXJufSxyLkJveC5wcm90b3R5cGUucGFyc2VMYW5ndWFnZT1mdW5jdGlvbih0KXt0aGlzLmxhbmd1YWdlPXQucmVhZFVpbnQxNigpO3ZhciBlPVtdO2VbMF09dGhpcy5sYW5ndWFnZT4+MTAmMzEsZVsxXT10aGlzLmxhbmd1YWdlPj41JjMxLGVbMl09dGhpcy5sYW5ndWFnZSYzMSx0aGlzLmxhbmd1YWdlU3RyaW5nPVN0cmluZy5mcm9tQ2hhckNvZGUoZVswXSs5NixlWzFdKzk2LGVbMl0rOTYpfSxyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTD0iVmlzdWFsIixyLlNBTVBMRV9FTlRSWV9UWVBFX0FVRElPPSJBdWRpbyIsci5TQU1QTEVfRU5UUllfVFlQRV9ISU5UPSJIaW50IixyLlNBTVBMRV9FTlRSWV9UWVBFX01FVEFEQVRBPSJNZXRhZGF0YSIsci5TQU1QTEVfRU5UUllfVFlQRV9TVUJUSVRMRT0iU3VidGl0bGUiLHIuU0FNUExFX0VOVFJZX1RZUEVfU1lTVEVNPSJTeXN0ZW0iLHIuU0FNUExFX0VOVFJZX1RZUEVfVEVYVD0iVGV4dCIsci5TYW1wbGVFbnRyeS5wcm90b3R5cGUucGFyc2VIZWFkZXI9ZnVuY3Rpb24odCl7dC5yZWFkVWludDhBcnJheSg2KSx0aGlzLmRhdGFfcmVmZXJlbmNlX2luZGV4PXQucmVhZFVpbnQxNigpLHRoaXMuaGRyX3NpemUrPTh9LHIuU2FtcGxlRW50cnkucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3RoaXMucGFyc2VIZWFkZXIodCksdGhpcy5kYXRhPXQucmVhZFVpbnQ4QXJyYXkodGhpcy5zaXplLXRoaXMuaGRyX3NpemUpfSxyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5wYXJzZURhdGFBbmRSZXdpbmQ9ZnVuY3Rpb24odCl7dGhpcy5wYXJzZUhlYWRlcih0KSx0aGlzLmRhdGE9dC5yZWFkVWludDhBcnJheSh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSksdGhpcy5oZHJfc2l6ZS09OCx0LnBvc2l0aW9uLT10aGlzLnNpemUtdGhpcy5oZHJfc2l6ZX0sci5TYW1wbGVFbnRyeS5wcm90b3R5cGUucGFyc2VGb290ZXI9ZnVuY3Rpb24odCl7ci5Db250YWluZXJCb3gucHJvdG90eXBlLnBhcnNlLmNhbGwodGhpcyx0KX0sci5jcmVhdGVNZWRpYVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX0hJTlQpLHIuY3JlYXRlTWVkaWFTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9NRVRBREFUQSksci5jcmVhdGVNZWRpYVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1NVQlRJVExFKSxyLmNyZWF0ZU1lZGlhU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfU1lTVEVNKSxyLmNyZWF0ZU1lZGlhU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfVEVYVCksci5jcmVhdGVNZWRpYVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTCxmdW5jdGlvbih0KXt2YXIgZTt0aGlzLnBhcnNlSGVhZGVyKHQpLHQucmVhZFVpbnQxNigpLHQucmVhZFVpbnQxNigpLHQucmVhZFVpbnQzMkFycmF5KDMpLHRoaXMud2lkdGg9dC5yZWFkVWludDE2KCksdGhpcy5oZWlnaHQ9dC5yZWFkVWludDE2KCksdGhpcy5ob3JpenJlc29sdXRpb249dC5yZWFkVWludDMyKCksdGhpcy52ZXJ0cmVzb2x1dGlvbj10LnJlYWRVaW50MzIoKSx0LnJlYWRVaW50MzIoKSx0aGlzLmZyYW1lX2NvdW50PXQucmVhZFVpbnQxNigpLGU9TWF0aC5taW4oMzEsdC5yZWFkVWludDgoKSksdGhpcy5jb21wcmVzc29ybmFtZT10LnJlYWRTdHJpbmcoZSksZTwzMSYmdC5yZWFkU3RyaW5nKDMxLWUpLHRoaXMuZGVwdGg9dC5yZWFkVWludDE2KCksdC5yZWFkVWludDE2KCksdGhpcy5wYXJzZUZvb3Rlcih0KX0pLHIuY3JlYXRlTWVkaWFTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9BVURJTyxmdW5jdGlvbih0KXt0aGlzLnBhcnNlSGVhZGVyKHQpLHQucmVhZFVpbnQzMkFycmF5KDIpLHRoaXMuY2hhbm5lbF9jb3VudD10LnJlYWRVaW50MTYoKSx0aGlzLnNhbXBsZXNpemU9dC5yZWFkVWludDE2KCksdC5yZWFkVWludDE2KCksdC5yZWFkVWludDE2KCksdGhpcy5zYW1wbGVyYXRlPXQucmVhZFVpbnQzMigpLzY1NTM2LHRoaXMucGFyc2VGb290ZXIodCl9KSxyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTCwiYXZjMSIpLHIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCJhdmMyIiksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9WSVNVQUwsImF2YzMiKSxyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTCwiYXZjNCIpLHIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCJhdjAxIiksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9WSVNVQUwsImh2YzEiKSxyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTCwiaGV2MSIpLHIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCJ2dmMxIiksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9WSVNVQUwsInZ2aTEiKSxyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTCwidnZzMSIpLHIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfVklTVUFMLCJ2dmNOIiksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9WSVNVQUwsInZwMDgiKSxyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTCwidnAwOSIpLHIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8sIm1wNGEiKSxyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX0FVRElPLCJhYy0zIiksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9BVURJTywiZWMtMyIpLHIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8sIk9wdXMiKSxyLmNyZWF0ZUVuY3J5cHRlZFNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1ZJU1VBTCwiZW5jdiIpLHIuY3JlYXRlRW5jcnlwdGVkU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfQVVESU8sImVuY2EiKSxyLmNyZWF0ZUVuY3J5cHRlZFNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1NVQlRJVExFLCJlbmN1Iiksci5jcmVhdGVFbmNyeXB0ZWRTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9TWVNURU0sImVuY3MiKSxyLmNyZWF0ZUVuY3J5cHRlZFNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1RFWFQsImVuY3QiKSxyLmNyZWF0ZUVuY3J5cHRlZFNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX01FVEFEQVRBLCJlbmNtIiksci5jcmVhdGVCb3hDdG9yKCJhMWx4IixmdW5jdGlvbih0KXt2YXIgZT10LnJlYWRVaW50OCgpJjEsaT0oKGUmMSkrMSkqMTY7dGhpcy5sYXllcl9zaXplPVtdO2Zvcih2YXIgcz0wO3M8MztzKyspaT09MTY/dGhpcy5sYXllcl9zaXplW3NdPXQucmVhZFVpbnQxNigpOnRoaXMubGF5ZXJfc2l6ZVtzXT10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlQm94Q3RvcigiYTFvcCIsZnVuY3Rpb24odCl7dGhpcy5vcF9pbmRleD10LnJlYWRVaW50OCgpfSksci5jcmVhdGVGdWxsQm94Q3RvcigiYXV4QyIsZnVuY3Rpb24odCl7dGhpcy5hdXhfdHlwZT10LnJlYWRDU3RyaW5nKCk7dmFyIGU9dGhpcy5zaXplLXRoaXMuaGRyX3NpemUtKHRoaXMuYXV4X3R5cGUubGVuZ3RoKzEpO3RoaXMuYXV4X3N1YnR5cGU9dC5yZWFkVWludDhBcnJheShlKX0pLHIuY3JlYXRlQm94Q3RvcigiYXYxQyIsZnVuY3Rpb24odCl7dmFyIGU9dC5yZWFkVWludDgoKTtpZihlPj43JiExKXtoLmVycm9yKCJhdjFDIG1hcmtlciBwcm9ibGVtIik7cmV0dXJufWlmKHRoaXMudmVyc2lvbj1lJjEyNyx0aGlzLnZlcnNpb24hPT0xKXtoLmVycm9yKCJhdjFDIHZlcnNpb24gIit0aGlzLnZlcnNpb24rIiBub3Qgc3VwcG9ydGVkIik7cmV0dXJufWlmKGU9dC5yZWFkVWludDgoKSx0aGlzLnNlcV9wcm9maWxlPWU+PjUmNyx0aGlzLnNlcV9sZXZlbF9pZHhfMD1lJjMxLGU9dC5yZWFkVWludDgoKSx0aGlzLnNlcV90aWVyXzA9ZT4+NyYxLHRoaXMuaGlnaF9iaXRkZXB0aD1lPj42JjEsdGhpcy50d2VsdmVfYml0PWU+PjUmMSx0aGlzLm1vbm9jaHJvbWU9ZT4+NCYxLHRoaXMuY2hyb21hX3N1YnNhbXBsaW5nX3g9ZT4+MyYxLHRoaXMuY2hyb21hX3N1YnNhbXBsaW5nX3k9ZT4+MiYxLHRoaXMuY2hyb21hX3NhbXBsZV9wb3NpdGlvbj1lJjMsZT10LnJlYWRVaW50OCgpLHRoaXMucmVzZXJ2ZWRfMT1lPj41JjcsdGhpcy5yZXNlcnZlZF8xIT09MCl7aC5lcnJvcigiYXYxQyByZXNlcnZlZF8xIHBhcnNpbmcgcHJvYmxlbSIpO3JldHVybn1pZih0aGlzLmluaXRpYWxfcHJlc2VudGF0aW9uX2RlbGF5X3ByZXNlbnQ9ZT4+NCYxLHRoaXMuaW5pdGlhbF9wcmVzZW50YXRpb25fZGVsYXlfcHJlc2VudD09PTEpdGhpcy5pbml0aWFsX3ByZXNlbnRhdGlvbl9kZWxheV9taW51c19vbmU9ZSYxNTtlbHNlIGlmKHRoaXMucmVzZXJ2ZWRfMj1lJjE1LHRoaXMucmVzZXJ2ZWRfMiE9PTApe2guZXJyb3IoImF2MUMgcmVzZXJ2ZWRfMiBwYXJzaW5nIHByb2JsZW0iKTtyZXR1cm59dmFyIGk9dGhpcy5zaXplLXRoaXMuaGRyX3NpemUtNDt0aGlzLmNvbmZpZ09CVXM9dC5yZWFkVWludDhBcnJheShpKX0pLHIuY3JlYXRlQm94Q3RvcigiYXZjQyIsZnVuY3Rpb24odCl7dmFyIGUsaTtmb3IodGhpcy5jb25maWd1cmF0aW9uVmVyc2lvbj10LnJlYWRVaW50OCgpLHRoaXMuQVZDUHJvZmlsZUluZGljYXRpb249dC5yZWFkVWludDgoKSx0aGlzLnByb2ZpbGVfY29tcGF0aWJpbGl0eT10LnJlYWRVaW50OCgpLHRoaXMuQVZDTGV2ZWxJbmRpY2F0aW9uPXQucmVhZFVpbnQ4KCksdGhpcy5sZW5ndGhTaXplTWludXNPbmU9dC5yZWFkVWludDgoKSYzLHRoaXMubmJfU1BTX25hbHVzPXQucmVhZFVpbnQ4KCkmMzEsaT10aGlzLnNpemUtdGhpcy5oZHJfc2l6ZS02LHRoaXMuU1BTPVtdLGU9MDtlPHRoaXMubmJfU1BTX25hbHVzO2UrKyl0aGlzLlNQU1tlXT17fSx0aGlzLlNQU1tlXS5sZW5ndGg9dC5yZWFkVWludDE2KCksdGhpcy5TUFNbZV0ubmFsdT10LnJlYWRVaW50OEFycmF5KHRoaXMuU1BTW2VdLmxlbmd0aCksaS09Mit0aGlzLlNQU1tlXS5sZW5ndGg7Zm9yKHRoaXMubmJfUFBTX25hbHVzPXQucmVhZFVpbnQ4KCksaS0tLHRoaXMuUFBTPVtdLGU9MDtlPHRoaXMubmJfUFBTX25hbHVzO2UrKyl0aGlzLlBQU1tlXT17fSx0aGlzLlBQU1tlXS5sZW5ndGg9dC5yZWFkVWludDE2KCksdGhpcy5QUFNbZV0ubmFsdT10LnJlYWRVaW50OEFycmF5KHRoaXMuUFBTW2VdLmxlbmd0aCksaS09Mit0aGlzLlBQU1tlXS5sZW5ndGg7aT4wJiYodGhpcy5leHQ9dC5yZWFkVWludDhBcnJheShpKSl9KSxyLmNyZWF0ZUJveEN0b3IoImJ0cnQiLGZ1bmN0aW9uKHQpe3RoaXMuYnVmZmVyU2l6ZURCPXQucmVhZFVpbnQzMigpLHRoaXMubWF4Qml0cmF0ZT10LnJlYWRVaW50MzIoKSx0aGlzLmF2Z0JpdHJhdGU9dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUJveEN0b3IoImNsYXAiLGZ1bmN0aW9uKHQpe3RoaXMuY2xlYW5BcGVydHVyZVdpZHRoTj10LnJlYWRVaW50MzIoKSx0aGlzLmNsZWFuQXBlcnR1cmVXaWR0aEQ9dC5yZWFkVWludDMyKCksdGhpcy5jbGVhbkFwZXJ0dXJlSGVpZ2h0Tj10LnJlYWRVaW50MzIoKSx0aGlzLmNsZWFuQXBlcnR1cmVIZWlnaHREPXQucmVhZFVpbnQzMigpLHRoaXMuaG9yaXpPZmZOPXQucmVhZFVpbnQzMigpLHRoaXMuaG9yaXpPZmZEPXQucmVhZFVpbnQzMigpLHRoaXMudmVydE9mZk49dC5yZWFkVWludDMyKCksdGhpcy52ZXJ0T2ZmRD10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlQm94Q3RvcigiY2xsaSIsZnVuY3Rpb24odCl7dGhpcy5tYXhfY29udGVudF9saWdodF9sZXZlbD10LnJlYWRVaW50MTYoKSx0aGlzLm1heF9waWNfYXZlcmFnZV9saWdodF9sZXZlbD10LnJlYWRVaW50MTYoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoImNvNjQiLGZ1bmN0aW9uKHQpe3ZhciBlLGk7aWYoZT10LnJlYWRVaW50MzIoKSx0aGlzLmNodW5rX29mZnNldHM9W10sdGhpcy52ZXJzaW9uPT09MClmb3IoaT0wO2k8ZTtpKyspdGhpcy5jaHVua19vZmZzZXRzLnB1c2godC5yZWFkVWludDY0KCkpfSksci5jcmVhdGVGdWxsQm94Q3RvcigiQ29MTCIsZnVuY3Rpb24odCl7dGhpcy5tYXhDTEw9dC5yZWFkVWludDE2KCksdGhpcy5tYXhGQUxMPXQucmVhZFVpbnQxNigpfSksci5jcmVhdGVCb3hDdG9yKCJjb2xyIixmdW5jdGlvbih0KXtpZih0aGlzLmNvbG91cl90eXBlPXQucmVhZFN0cmluZyg0KSx0aGlzLmNvbG91cl90eXBlPT09Im5jbHgiKXt0aGlzLmNvbG91cl9wcmltYXJpZXM9dC5yZWFkVWludDE2KCksdGhpcy50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M9dC5yZWFkVWludDE2KCksdGhpcy5tYXRyaXhfY29lZmZpY2llbnRzPXQucmVhZFVpbnQxNigpO3ZhciBlPXQucmVhZFVpbnQ4KCk7dGhpcy5mdWxsX3JhbmdlX2ZsYWc9ZT4+N31lbHNlIHRoaXMuY29sb3VyX3R5cGU9PT0icklDQyI/dGhpcy5JQ0NfcHJvZmlsZT10LnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZS00KTp0aGlzLmNvbG91cl90eXBlPT09InByb2YiJiYodGhpcy5JQ0NfcHJvZmlsZT10LnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZS00KSl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJjcHJ0IixmdW5jdGlvbih0KXt0aGlzLnBhcnNlTGFuZ3VhZ2UodCksdGhpcy5ub3RpY2U9dC5yZWFkQ1N0cmluZygpfSksci5jcmVhdGVGdWxsQm94Q3RvcigiY3NsZyIsZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPT09MCYmKHRoaXMuY29tcG9zaXRpb25Ub0RUU1NoaWZ0PXQucmVhZEludDMyKCksdGhpcy5sZWFzdERlY29kZVRvRGlzcGxheURlbHRhPXQucmVhZEludDMyKCksdGhpcy5ncmVhdGVzdERlY29kZVRvRGlzcGxheURlbHRhPXQucmVhZEludDMyKCksdGhpcy5jb21wb3NpdGlvblN0YXJ0VGltZT10LnJlYWRJbnQzMigpLHRoaXMuY29tcG9zaXRpb25FbmRUaW1lPXQucmVhZEludDMyKCkpfSksci5jcmVhdGVGdWxsQm94Q3RvcigiY3R0cyIsZnVuY3Rpb24odCl7dmFyIGUsaTtpZihlPXQucmVhZFVpbnQzMigpLHRoaXMuc2FtcGxlX2NvdW50cz1bXSx0aGlzLnNhbXBsZV9vZmZzZXRzPVtdLHRoaXMudmVyc2lvbj09PTApZm9yKGk9MDtpPGU7aSsrKXt0aGlzLnNhbXBsZV9jb3VudHMucHVzaCh0LnJlYWRVaW50MzIoKSk7dmFyIHM9dC5yZWFkSW50MzIoKTtzPDAmJmgud2FybigiQm94UGFyc2VyIiwiY3R0cyBib3ggdXNlcyBuZWdhdGl2ZSB2YWx1ZXMgd2l0aG91dCB1c2luZyB2ZXJzaW9uIDEiKSx0aGlzLnNhbXBsZV9vZmZzZXRzLnB1c2gocyl9ZWxzZSBpZih0aGlzLnZlcnNpb249PTEpZm9yKGk9MDtpPGU7aSsrKXRoaXMuc2FtcGxlX2NvdW50cy5wdXNoKHQucmVhZFVpbnQzMigpKSx0aGlzLnNhbXBsZV9vZmZzZXRzLnB1c2godC5yZWFkSW50MzIoKSl9KSxyLmNyZWF0ZUJveEN0b3IoImRhYzMiLGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVhZFVpbnQ4KCksaT10LnJlYWRVaW50OCgpLHM9dC5yZWFkVWludDgoKTt0aGlzLmZzY29kPWU+PjYsdGhpcy5ic2lkPWU+PjEmMzEsdGhpcy5ic21vZD0oZSYxKTw8MnxpPj42JjMsdGhpcy5hY21vZD1pPj4zJjcsdGhpcy5sZmVvbj1pPj4yJjEsdGhpcy5iaXRfcmF0ZV9jb2RlPWkmM3xzPj41Jjd9KSxyLmNyZWF0ZUJveEN0b3IoImRlYzMiLGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVhZFVpbnQxNigpO3RoaXMuZGF0YV9yYXRlPWU+PjMsdGhpcy5udW1faW5kX3N1Yj1lJjcsdGhpcy5pbmRfc3Vicz1bXTtmb3IodmFyIGk9MDtpPHRoaXMubnVtX2luZF9zdWIrMTtpKyspe3ZhciBzPXt9O3RoaXMuaW5kX3N1YnMucHVzaChzKTt2YXIgbj10LnJlYWRVaW50OCgpLGY9dC5yZWFkVWludDgoKSxkPXQucmVhZFVpbnQ4KCk7cy5mc2NvZD1uPj42LHMuYnNpZD1uPj4xJjMxLHMuYnNtb2Q9KG4mMSk8PDR8Zj4+NCYxNSxzLmFjbW9kPWY+PjEmNyxzLmxmZW9uPWYmMSxzLm51bV9kZXBfc3ViPWQ+PjEmMTUscy5udW1fZGVwX3N1Yj4wJiYocy5jaGFuX2xvYz0oZCYxKTw8OHx0LnJlYWRVaW50OCgpKX19KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJkZkxhIixmdW5jdGlvbih0KXt2YXIgZT0xMjcsaT0xMjgscz1bXSxuPVsiU1RSRUFNSU5GTyIsIlBBRERJTkciLCJBUFBMSUNBVElPTiIsIlNFRUtUQUJMRSIsIlZPUkJJU19DT01NRU5UIiwiQ1VFU0hFRVQiLCJQSUNUVVJFIiwiUkVTRVJWRUQiXTt0aGlzLnBhcnNlRnVsbEhlYWRlcih0KTtkb3t2YXIgZj10LnJlYWRVaW50OCgpLGQ9TWF0aC5taW4oZiZlLG4ubGVuZ3RoLTEpO2lmKGQ/dC5yZWFkVWludDhBcnJheSh0LnJlYWRVaW50MjQoKSk6KHQucmVhZFVpbnQ4QXJyYXkoMTMpLHRoaXMuc2FtcGxlcmF0ZT10LnJlYWRVaW50MzIoKT4+MTIsdC5yZWFkVWludDhBcnJheSgyMCkpLHMucHVzaChuW2RdKSxmJmkpYnJlYWt9d2hpbGUoITApO3RoaXMubnVtTWV0YWRhdGFCbG9ja3M9cy5sZW5ndGgrIiAoIitzLmpvaW4oIiwgIikrIikifSksci5jcmVhdGVCb3hDdG9yKCJkaW1tIixmdW5jdGlvbih0KXt0aGlzLmJ5dGVzc2VudD10LnJlYWRVaW50NjQoKX0pLHIuY3JlYXRlQm94Q3RvcigiZG1heCIsZnVuY3Rpb24odCl7dGhpcy50aW1lPXQucmVhZFVpbnQzMigpfSksci5jcmVhdGVCb3hDdG9yKCJkbWVkIixmdW5jdGlvbih0KXt0aGlzLmJ5dGVzc2VudD10LnJlYWRVaW50NjQoKX0pLHIuY3JlYXRlQm94Q3RvcigiZE9wcyIsZnVuY3Rpb24odCl7aWYodGhpcy5WZXJzaW9uPXQucmVhZFVpbnQ4KCksdGhpcy5PdXRwdXRDaGFubmVsQ291bnQ9dC5yZWFkVWludDgoKSx0aGlzLlByZVNraXA9dC5yZWFkVWludDE2KCksdGhpcy5JbnB1dFNhbXBsZVJhdGU9dC5yZWFkVWludDMyKCksdGhpcy5PdXRwdXRHYWluPXQucmVhZEludDE2KCksdGhpcy5DaGFubmVsTWFwcGluZ0ZhbWlseT10LnJlYWRVaW50OCgpLHRoaXMuQ2hhbm5lbE1hcHBpbmdGYW1pbHkhPT0wKXt0aGlzLlN0cmVhbUNvdW50PXQucmVhZFVpbnQ4KCksdGhpcy5Db3VwbGVkQ291bnQ9dC5yZWFkVWludDgoKSx0aGlzLkNoYW5uZWxNYXBwaW5nPVtdO2Zvcih2YXIgZT0wO2U8dGhpcy5PdXRwdXRDaGFubmVsQ291bnQ7ZSsrKXRoaXMuQ2hhbm5lbE1hcHBpbmdbZV09dC5yZWFkVWludDgoKX19KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJkcmVmIixmdW5jdGlvbih0KXt2YXIgZSxpO3RoaXMuZW50cmllcz1bXTtmb3IodmFyIHM9dC5yZWFkVWludDMyKCksbj0wO248cztuKyspaWYoZT1yLnBhcnNlT25lQm94KHQsITEsdGhpcy5zaXplLSh0LmdldFBvc2l0aW9uKCktdGhpcy5zdGFydCkpLGUuY29kZT09PXIuT0spaT1lLmJveCx0aGlzLmVudHJpZXMucHVzaChpKTtlbHNlIHJldHVybn0pLHIuY3JlYXRlQm94Q3RvcigiZHJlcCIsZnVuY3Rpb24odCl7dGhpcy5ieXRlc3NlbnQ9dC5yZWFkVWludDY0KCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJlbG5nIixmdW5jdGlvbih0KXt0aGlzLmV4dGVuZGVkX2xhbmd1YWdlPXQucmVhZFN0cmluZyh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJlbHN0IixmdW5jdGlvbih0KXt0aGlzLmVudHJpZXM9W107Zm9yKHZhciBlPXQucmVhZFVpbnQzMigpLGk9MDtpPGU7aSsrKXt2YXIgcz17fTt0aGlzLmVudHJpZXMucHVzaChzKSx0aGlzLnZlcnNpb249PT0xPyhzLnNlZ21lbnRfZHVyYXRpb249dC5yZWFkVWludDY0KCkscy5tZWRpYV90aW1lPXQucmVhZEludDY0KCkpOihzLnNlZ21lbnRfZHVyYXRpb249dC5yZWFkVWludDMyKCkscy5tZWRpYV90aW1lPXQucmVhZEludDMyKCkpLHMubWVkaWFfcmF0ZV9pbnRlZ2VyPXQucmVhZEludDE2KCkscy5tZWRpYV9yYXRlX2ZyYWN0aW9uPXQucmVhZEludDE2KCl9fSksci5jcmVhdGVGdWxsQm94Q3RvcigiZW1zZyIsZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPT0xPyh0aGlzLnRpbWVzY2FsZT10LnJlYWRVaW50MzIoKSx0aGlzLnByZXNlbnRhdGlvbl90aW1lPXQucmVhZFVpbnQ2NCgpLHRoaXMuZXZlbnRfZHVyYXRpb249dC5yZWFkVWludDMyKCksdGhpcy5pZD10LnJlYWRVaW50MzIoKSx0aGlzLnNjaGVtZV9pZF91cmk9dC5yZWFkQ1N0cmluZygpLHRoaXMudmFsdWU9dC5yZWFkQ1N0cmluZygpKToodGhpcy5zY2hlbWVfaWRfdXJpPXQucmVhZENTdHJpbmcoKSx0aGlzLnZhbHVlPXQucmVhZENTdHJpbmcoKSx0aGlzLnRpbWVzY2FsZT10LnJlYWRVaW50MzIoKSx0aGlzLnByZXNlbnRhdGlvbl90aW1lX2RlbHRhPXQucmVhZFVpbnQzMigpLHRoaXMuZXZlbnRfZHVyYXRpb249dC5yZWFkVWludDMyKCksdGhpcy5pZD10LnJlYWRVaW50MzIoKSk7dmFyIGU9dGhpcy5zaXplLXRoaXMuaGRyX3NpemUtKDQqNCsodGhpcy5zY2hlbWVfaWRfdXJpLmxlbmd0aCsxKSsodGhpcy52YWx1ZS5sZW5ndGgrMSkpO3RoaXMudmVyc2lvbj09MSYmKGUtPTQpLHRoaXMubWVzc2FnZV9kYXRhPXQucmVhZFVpbnQ4QXJyYXkoZSl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJlc2RzIixmdW5jdGlvbih0KXt2YXIgZT10LnJlYWRVaW50OEFycmF5KHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplKTtpZih0eXBlb2YgXzwidSIpe3ZhciBpPW5ldyBfO3RoaXMuZXNkPWkucGFyc2VPbmVEZXNjcmlwdG9yKG5ldyBhKGUuYnVmZmVyLDAsYS5CSUdfRU5ESUFOKSl9fSksci5jcmVhdGVCb3hDdG9yKCJmaWVsIixmdW5jdGlvbih0KXt0aGlzLmZpZWxkQ291bnQ9dC5yZWFkVWludDgoKSx0aGlzLmZpZWxkT3JkZXJpbmc9dC5yZWFkVWludDgoKX0pLHIuY3JlYXRlQm94Q3RvcigiZnJtYSIsZnVuY3Rpb24odCl7dGhpcy5kYXRhX2Zvcm1hdD10LnJlYWRTdHJpbmcoNCl9KSxyLmNyZWF0ZUJveEN0b3IoImZ0eXAiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2l6ZS10aGlzLmhkcl9zaXplO3RoaXMubWFqb3JfYnJhbmQ9dC5yZWFkU3RyaW5nKDQpLHRoaXMubWlub3JfdmVyc2lvbj10LnJlYWRVaW50MzIoKSxlLT04LHRoaXMuY29tcGF0aWJsZV9icmFuZHM9W107Zm9yKHZhciBpPTA7ZT49NDspdGhpcy5jb21wYXRpYmxlX2JyYW5kc1tpXT10LnJlYWRTdHJpbmcoNCksZS09NCxpKyt9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJoZGxyIixmdW5jdGlvbih0KXt0aGlzLnZlcnNpb249PT0wJiYodC5yZWFkVWludDMyKCksdGhpcy5oYW5kbGVyPXQucmVhZFN0cmluZyg0KSx0LnJlYWRVaW50MzJBcnJheSgzKSx0aGlzLm5hbWU9dC5yZWFkU3RyaW5nKHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplLTIwKSx0aGlzLm5hbWVbdGhpcy5uYW1lLmxlbmd0aC0xXT09PSJcMCImJih0aGlzLm5hbWU9dGhpcy5uYW1lLnNsaWNlKDAsLTEpKSl9KSxyLmNyZWF0ZUJveEN0b3IoImh2Y0MiLGZ1bmN0aW9uKHQpe3ZhciBlLGkscyxuO3RoaXMuY29uZmlndXJhdGlvblZlcnNpb249dC5yZWFkVWludDgoKSxuPXQucmVhZFVpbnQ4KCksdGhpcy5nZW5lcmFsX3Byb2ZpbGVfc3BhY2U9bj4+Nix0aGlzLmdlbmVyYWxfdGllcl9mbGFnPShuJjMyKT4+NSx0aGlzLmdlbmVyYWxfcHJvZmlsZV9pZGM9biYzMSx0aGlzLmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5PXQucmVhZFVpbnQzMigpLHRoaXMuZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcj10LnJlYWRVaW50OEFycmF5KDYpLHRoaXMuZ2VuZXJhbF9sZXZlbF9pZGM9dC5yZWFkVWludDgoKSx0aGlzLm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGM9dC5yZWFkVWludDE2KCkmNDA5NSx0aGlzLnBhcmFsbGVsaXNtVHlwZT10LnJlYWRVaW50OCgpJjMsdGhpcy5jaHJvbWFfZm9ybWF0X2lkYz10LnJlYWRVaW50OCgpJjMsdGhpcy5iaXRfZGVwdGhfbHVtYV9taW51czg9dC5yZWFkVWludDgoKSY3LHRoaXMuYml0X2RlcHRoX2Nocm9tYV9taW51czg9dC5yZWFkVWludDgoKSY3LHRoaXMuYXZnRnJhbWVSYXRlPXQucmVhZFVpbnQxNigpLG49dC5yZWFkVWludDgoKSx0aGlzLmNvbnN0YW50RnJhbWVSYXRlPW4+PjYsdGhpcy5udW1UZW1wb3JhbExheWVycz0obiYxMyk+PjMsdGhpcy50ZW1wb3JhbElkTmVzdGVkPShuJjQpPj4yLHRoaXMubGVuZ3RoU2l6ZU1pbnVzT25lPW4mMyx0aGlzLm5hbHVfYXJyYXlzPVtdO3ZhciBmPXQucmVhZFVpbnQ4KCk7Zm9yKGU9MDtlPGY7ZSsrKXt2YXIgZD1bXTt0aGlzLm5hbHVfYXJyYXlzLnB1c2goZCksbj10LnJlYWRVaW50OCgpLGQuY29tcGxldGVuZXNzPShuJjEyOCk+PjcsZC5uYWx1X3R5cGU9biY2Mzt2YXIgYz10LnJlYWRVaW50MTYoKTtmb3IoaT0wO2k8YztpKyspe3ZhciBtPXt9O2QucHVzaChtKSxzPXQucmVhZFVpbnQxNigpLG0uZGF0YT10LnJlYWRVaW50OEFycmF5KHMpfX19KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJpaW5mIixmdW5jdGlvbih0KXt2YXIgZTt0aGlzLnZlcnNpb249PT0wP3RoaXMuZW50cnlfY291bnQ9dC5yZWFkVWludDE2KCk6dGhpcy5lbnRyeV9jb3VudD10LnJlYWRVaW50MzIoKSx0aGlzLml0ZW1faW5mb3M9W107Zm9yKHZhciBpPTA7aTx0aGlzLmVudHJ5X2NvdW50O2krKylpZihlPXIucGFyc2VPbmVCb3godCwhMSx0aGlzLnNpemUtKHQuZ2V0UG9zaXRpb24oKS10aGlzLnN0YXJ0KSksZS5jb2RlPT09ci5PSyllLmJveC50eXBlIT09ImluZmUiJiZoLmVycm9yKCJCb3hQYXJzZXIiLCJFeHBlY3RlZCAnaW5mZScgYm94LCBnb3QgIitlLmJveC50eXBlKSx0aGlzLml0ZW1faW5mb3NbaV09ZS5ib3g7ZWxzZSByZXR1cm59KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJpbG9jIixmdW5jdGlvbih0KXt2YXIgZTtlPXQucmVhZFVpbnQ4KCksdGhpcy5vZmZzZXRfc2l6ZT1lPj40JjE1LHRoaXMubGVuZ3RoX3NpemU9ZSYxNSxlPXQucmVhZFVpbnQ4KCksdGhpcy5iYXNlX29mZnNldF9zaXplPWU+PjQmMTUsdGhpcy52ZXJzaW9uPT09MXx8dGhpcy52ZXJzaW9uPT09Mj90aGlzLmluZGV4X3NpemU9ZSYxNTp0aGlzLmluZGV4X3NpemU9MCx0aGlzLml0ZW1zPVtdO3ZhciBpPTA7aWYodGhpcy52ZXJzaW9uPDIpaT10LnJlYWRVaW50MTYoKTtlbHNlIGlmKHRoaXMudmVyc2lvbj09PTIpaT10LnJlYWRVaW50MzIoKTtlbHNlIHRocm93InZlcnNpb24gb2YgaWxvYyBib3ggbm90IHN1cHBvcnRlZCI7Zm9yKHZhciBzPTA7czxpO3MrKyl7dmFyIG49e307aWYodGhpcy5pdGVtcy5wdXNoKG4pLHRoaXMudmVyc2lvbjwyKW4uaXRlbV9JRD10LnJlYWRVaW50MTYoKTtlbHNlIGlmKHRoaXMudmVyc2lvbj09PTIpbi5pdGVtX0lEPXQucmVhZFVpbnQxNigpO2Vsc2UgdGhyb3cidmVyc2lvbiBvZiBpbG9jIGJveCBub3Qgc3VwcG9ydGVkIjtzd2l0Y2godGhpcy52ZXJzaW9uPT09MXx8dGhpcy52ZXJzaW9uPT09Mj9uLmNvbnN0cnVjdGlvbl9tZXRob2Q9dC5yZWFkVWludDE2KCkmMTU6bi5jb25zdHJ1Y3Rpb25fbWV0aG9kPTAsbi5kYXRhX3JlZmVyZW5jZV9pbmRleD10LnJlYWRVaW50MTYoKSx0aGlzLmJhc2Vfb2Zmc2V0X3NpemUpe2Nhc2UgMDpuLmJhc2Vfb2Zmc2V0PTA7YnJlYWs7Y2FzZSA0Om4uYmFzZV9vZmZzZXQ9dC5yZWFkVWludDMyKCk7YnJlYWs7Y2FzZSA4Om4uYmFzZV9vZmZzZXQ9dC5yZWFkVWludDY0KCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJFcnJvciByZWFkaW5nIGJhc2Ugb2Zmc2V0IHNpemUifXZhciBmPXQucmVhZFVpbnQxNigpO24uZXh0ZW50cz1bXTtmb3IodmFyIGQ9MDtkPGY7ZCsrKXt2YXIgYz17fTtpZihuLmV4dGVudHMucHVzaChjKSx0aGlzLnZlcnNpb249PT0xfHx0aGlzLnZlcnNpb249PT0yKXN3aXRjaCh0aGlzLmluZGV4X3NpemUpe2Nhc2UgMDpjLmV4dGVudF9pbmRleD0wO2JyZWFrO2Nhc2UgNDpjLmV4dGVudF9pbmRleD10LnJlYWRVaW50MzIoKTticmVhaztjYXNlIDg6Yy5leHRlbnRfaW5kZXg9dC5yZWFkVWludDY0KCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJFcnJvciByZWFkaW5nIGV4dGVudCBpbmRleCJ9c3dpdGNoKHRoaXMub2Zmc2V0X3NpemUpe2Nhc2UgMDpjLmV4dGVudF9vZmZzZXQ9MDticmVhaztjYXNlIDQ6Yy5leHRlbnRfb2Zmc2V0PXQucmVhZFVpbnQzMigpO2JyZWFrO2Nhc2UgODpjLmV4dGVudF9vZmZzZXQ9dC5yZWFkVWludDY0KCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJFcnJvciByZWFkaW5nIGV4dGVudCBpbmRleCJ9c3dpdGNoKHRoaXMubGVuZ3RoX3NpemUpe2Nhc2UgMDpjLmV4dGVudF9sZW5ndGg9MDticmVhaztjYXNlIDQ6Yy5leHRlbnRfbGVuZ3RoPXQucmVhZFVpbnQzMigpO2JyZWFrO2Nhc2UgODpjLmV4dGVudF9sZW5ndGg9dC5yZWFkVWludDY0KCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyJFcnJvciByZWFkaW5nIGV4dGVudCBpbmRleCJ9fX19KSxyLmNyZWF0ZUJveEN0b3IoImltaXIiLGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVhZFVpbnQ4KCk7dGhpcy5yZXNlcnZlZD1lPj43LHRoaXMuYXhpcz1lJjF9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJpbmZlIixmdW5jdGlvbih0KXtpZigodGhpcy52ZXJzaW9uPT09MHx8dGhpcy52ZXJzaW9uPT09MSkmJih0aGlzLml0ZW1fSUQ9dC5yZWFkVWludDE2KCksdGhpcy5pdGVtX3Byb3RlY3Rpb25faW5kZXg9dC5yZWFkVWludDE2KCksdGhpcy5pdGVtX25hbWU9dC5yZWFkQ1N0cmluZygpLHRoaXMuY29udGVudF90eXBlPXQucmVhZENTdHJpbmcoKSx0aGlzLmNvbnRlbnRfZW5jb2Rpbmc9dC5yZWFkQ1N0cmluZygpKSx0aGlzLnZlcnNpb249PT0xKXt0aGlzLmV4dGVuc2lvbl90eXBlPXQucmVhZFN0cmluZyg0KSxoLndhcm4oIkJveFBhcnNlciIsIkNhbm5vdCBwYXJzZSBleHRlbnNpb24gdHlwZSIpLHQuc2Vlayh0aGlzLnN0YXJ0K3RoaXMuc2l6ZSk7cmV0dXJufXRoaXMudmVyc2lvbj49MiYmKHRoaXMudmVyc2lvbj09PTI/dGhpcy5pdGVtX0lEPXQucmVhZFVpbnQxNigpOnRoaXMudmVyc2lvbj09PTMmJih0aGlzLml0ZW1fSUQ9dC5yZWFkVWludDMyKCkpLHRoaXMuaXRlbV9wcm90ZWN0aW9uX2luZGV4PXQucmVhZFVpbnQxNigpLHRoaXMuaXRlbV90eXBlPXQucmVhZFN0cmluZyg0KSx0aGlzLml0ZW1fbmFtZT10LnJlYWRDU3RyaW5nKCksdGhpcy5pdGVtX3R5cGU9PT0ibWltZSI/KHRoaXMuY29udGVudF90eXBlPXQucmVhZENTdHJpbmcoKSx0aGlzLmNvbnRlbnRfZW5jb2Rpbmc9dC5yZWFkQ1N0cmluZygpKTp0aGlzLml0ZW1fdHlwZT09PSJ1cmkgIiYmKHRoaXMuaXRlbV91cmlfdHlwZT10LnJlYWRDU3RyaW5nKCkpKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoImlwbWEiLGZ1bmN0aW9uKHQpe3ZhciBlLGk7Zm9yKGVudHJ5X2NvdW50PXQucmVhZFVpbnQzMigpLHRoaXMuYXNzb2NpYXRpb25zPVtdLGU9MDtlPGVudHJ5X2NvdW50O2UrKyl7dmFyIHM9e307dGhpcy5hc3NvY2lhdGlvbnMucHVzaChzKSx0aGlzLnZlcnNpb248MT9zLmlkPXQucmVhZFVpbnQxNigpOnMuaWQ9dC5yZWFkVWludDMyKCk7dmFyIG49dC5yZWFkVWludDgoKTtmb3Iocy5wcm9wcz1bXSxpPTA7aTxuO2krKyl7dmFyIGY9dC5yZWFkVWludDgoKSxkPXt9O3MucHJvcHMucHVzaChkKSxkLmVzc2VudGlhbD0oZiYxMjgpPj43PT09MSx0aGlzLmZsYWdzJjE/ZC5wcm9wZXJ0eV9pbmRleD0oZiYxMjcpPDw4fHQucmVhZFVpbnQ4KCk6ZC5wcm9wZXJ0eV9pbmRleD1mJjEyN319fSksci5jcmVhdGVGdWxsQm94Q3RvcigiaXJlZiIsZnVuY3Rpb24odCl7dmFyIGUsaTtmb3IodGhpcy5yZWZlcmVuY2VzPVtdO3QuZ2V0UG9zaXRpb24oKTx0aGlzLnN0YXJ0K3RoaXMuc2l6ZTspaWYoZT1yLnBhcnNlT25lQm94KHQsITAsdGhpcy5zaXplLSh0LmdldFBvc2l0aW9uKCktdGhpcy5zdGFydCkpLGUuY29kZT09PXIuT0spdGhpcy52ZXJzaW9uPT09MD9pPW5ldyByLlNpbmdsZUl0ZW1UeXBlUmVmZXJlbmNlQm94KGUudHlwZSxlLnNpemUsZS5oZHJfc2l6ZSxlLnN0YXJ0KTppPW5ldyByLlNpbmdsZUl0ZW1UeXBlUmVmZXJlbmNlQm94TGFyZ2UoZS50eXBlLGUuc2l6ZSxlLmhkcl9zaXplLGUuc3RhcnQpLGkud3JpdGU9PT1yLkJveC5wcm90b3R5cGUud3JpdGUmJmkudHlwZSE9PSJtZGF0IiYmKGgud2FybigiQm94UGFyc2VyIixpLnR5cGUrIiBib3ggd3JpdGluZyBub3QgeWV0IGltcGxlbWVudGVkLCBrZWVwaW5nIHVucGFyc2VkIGRhdGEgaW4gbWVtb3J5IGZvciBsYXRlciB3cml0ZSIpLGkucGFyc2VEYXRhQW5kUmV3aW5kKHQpKSxpLnBhcnNlKHQpLHRoaXMucmVmZXJlbmNlcy5wdXNoKGkpO2Vsc2UgcmV0dXJufSksci5jcmVhdGVCb3hDdG9yKCJpcm90IixmdW5jdGlvbih0KXt0aGlzLmFuZ2xlPXQucmVhZFVpbnQ4KCkmM30pLHIuY3JlYXRlRnVsbEJveEN0b3IoImlzcGUiLGZ1bmN0aW9uKHQpe3RoaXMuaW1hZ2Vfd2lkdGg9dC5yZWFkVWludDMyKCksdGhpcy5pbWFnZV9oZWlnaHQ9dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJraW5kIixmdW5jdGlvbih0KXt0aGlzLnNjaGVtZVVSST10LnJlYWRDU3RyaW5nKCksdGhpcy52YWx1ZT10LnJlYWRDU3RyaW5nKCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJsZXZhIixmdW5jdGlvbih0KXt2YXIgZT10LnJlYWRVaW50OCgpO3RoaXMubGV2ZWxzPVtdO2Zvcih2YXIgaT0wO2k8ZTtpKyspe3ZhciBzPXt9O3RoaXMubGV2ZWxzW2ldPXMscy50cmFja19JRD10LnJlYWRVaW50MzIoKTt2YXIgbj10LnJlYWRVaW50OCgpO3N3aXRjaChzLnBhZGRpbmdfZmxhZz1uPj43LHMuYXNzaWdubWVudF90eXBlPW4mMTI3LHMuYXNzaWdubWVudF90eXBlKXtjYXNlIDA6cy5ncm91cGluZ190eXBlPXQucmVhZFN0cmluZyg0KTticmVhaztjYXNlIDE6cy5ncm91cGluZ190eXBlPXQucmVhZFN0cmluZyg0KSxzLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyPXQucmVhZFVpbnQzMigpO2JyZWFrO2Nhc2UgMjpicmVhaztjYXNlIDM6YnJlYWs7Y2FzZSA0OnMuc3ViX3RyYWNrX2lkPXQucmVhZFVpbnQzMigpO2JyZWFrO2RlZmF1bHQ6aC53YXJuKCJCb3hQYXJzZXIiLCJVbmtub3duIGxldmEgYXNzaWduZW1lbnQgdHlwZSIpfX19KSxyLmNyZWF0ZUJveEN0b3IoImxzZWwiLGZ1bmN0aW9uKHQpe3RoaXMubGF5ZXJfaWQ9dC5yZWFkVWludDE2KCl9KSxyLmNyZWF0ZUJveEN0b3IoIm1heHIiLGZ1bmN0aW9uKHQpe3RoaXMucGVyaW9kPXQucmVhZFVpbnQzMigpLHRoaXMuYnl0ZXM9dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUJveEN0b3IoIm1kY3YiLGZ1bmN0aW9uKHQpe3RoaXMuZGlzcGxheV9wcmltYXJpZXM9W10sdGhpcy5kaXNwbGF5X3ByaW1hcmllc1swXT17fSx0aGlzLmRpc3BsYXlfcHJpbWFyaWVzWzBdLng9dC5yZWFkVWludDE2KCksdGhpcy5kaXNwbGF5X3ByaW1hcmllc1swXS55PXQucmVhZFVpbnQxNigpLHRoaXMuZGlzcGxheV9wcmltYXJpZXNbMV09e30sdGhpcy5kaXNwbGF5X3ByaW1hcmllc1sxXS54PXQucmVhZFVpbnQxNigpLHRoaXMuZGlzcGxheV9wcmltYXJpZXNbMV0ueT10LnJlYWRVaW50MTYoKSx0aGlzLmRpc3BsYXlfcHJpbWFyaWVzWzJdPXt9LHRoaXMuZGlzcGxheV9wcmltYXJpZXNbMl0ueD10LnJlYWRVaW50MTYoKSx0aGlzLmRpc3BsYXlfcHJpbWFyaWVzWzJdLnk9dC5yZWFkVWludDE2KCksdGhpcy53aGl0ZV9wb2ludD17fSx0aGlzLndoaXRlX3BvaW50Lng9dC5yZWFkVWludDE2KCksdGhpcy53aGl0ZV9wb2ludC55PXQucmVhZFVpbnQxNigpLHRoaXMubWF4X2Rpc3BsYXlfbWFzdGVyaW5nX2x1bWluYW5jZT10LnJlYWRVaW50MzIoKSx0aGlzLm1pbl9kaXNwbGF5X21hc3RlcmluZ19sdW1pbmFuY2U9dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJtZGhkIixmdW5jdGlvbih0KXt0aGlzLnZlcnNpb249PTE/KHRoaXMuY3JlYXRpb25fdGltZT10LnJlYWRVaW50NjQoKSx0aGlzLm1vZGlmaWNhdGlvbl90aW1lPXQucmVhZFVpbnQ2NCgpLHRoaXMudGltZXNjYWxlPXQucmVhZFVpbnQzMigpLHRoaXMuZHVyYXRpb249dC5yZWFkVWludDY0KCkpOih0aGlzLmNyZWF0aW9uX3RpbWU9dC5yZWFkVWludDMyKCksdGhpcy5tb2RpZmljYXRpb25fdGltZT10LnJlYWRVaW50MzIoKSx0aGlzLnRpbWVzY2FsZT10LnJlYWRVaW50MzIoKSx0aGlzLmR1cmF0aW9uPXQucmVhZFVpbnQzMigpKSx0aGlzLnBhcnNlTGFuZ3VhZ2UodCksdC5yZWFkVWludDE2KCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJtZWhkIixmdW5jdGlvbih0KXt0aGlzLmZsYWdzJjEmJihoLndhcm4oIkJveFBhcnNlciIsIm1laGQgYm94IGluY29ycmVjdGx5IHVzZXMgZmxhZ3Mgc2V0IHRvIDEsIGNvbnZlcnRpbmcgdmVyc2lvbiB0byAxIiksdGhpcy52ZXJzaW9uPTEpLHRoaXMudmVyc2lvbj09MT90aGlzLmZyYWdtZW50X2R1cmF0aW9uPXQucmVhZFVpbnQ2NCgpOnRoaXMuZnJhZ21lbnRfZHVyYXRpb249dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJtZXRhIixmdW5jdGlvbih0KXt0aGlzLmJveGVzPVtdLHIuQ29udGFpbmVyQm94LnByb3RvdHlwZS5wYXJzZS5jYWxsKHRoaXMsdCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJtZmhkIixmdW5jdGlvbih0KXt0aGlzLnNlcXVlbmNlX251bWJlcj10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoIm1mcm8iLGZ1bmN0aW9uKHQpe3RoaXMuX3NpemU9dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJtdmhkIixmdW5jdGlvbih0KXt0aGlzLnZlcnNpb249PTE/KHRoaXMuY3JlYXRpb25fdGltZT10LnJlYWRVaW50NjQoKSx0aGlzLm1vZGlmaWNhdGlvbl90aW1lPXQucmVhZFVpbnQ2NCgpLHRoaXMudGltZXNjYWxlPXQucmVhZFVpbnQzMigpLHRoaXMuZHVyYXRpb249dC5yZWFkVWludDY0KCkpOih0aGlzLmNyZWF0aW9uX3RpbWU9dC5yZWFkVWludDMyKCksdGhpcy5tb2RpZmljYXRpb25fdGltZT10LnJlYWRVaW50MzIoKSx0aGlzLnRpbWVzY2FsZT10LnJlYWRVaW50MzIoKSx0aGlzLmR1cmF0aW9uPXQucmVhZFVpbnQzMigpKSx0aGlzLnJhdGU9dC5yZWFkVWludDMyKCksdGhpcy52b2x1bWU9dC5yZWFkVWludDE2KCk+PjgsdC5yZWFkVWludDE2KCksdC5yZWFkVWludDMyQXJyYXkoMiksdGhpcy5tYXRyaXg9dC5yZWFkVWludDMyQXJyYXkoOSksdC5yZWFkVWludDMyQXJyYXkoNiksdGhpcy5uZXh0X3RyYWNrX2lkPXQucmVhZFVpbnQzMigpfSksci5jcmVhdGVCb3hDdG9yKCJucGNrIixmdW5jdGlvbih0KXt0aGlzLnBhY2tldHNzZW50PXQucmVhZFVpbnQzMigpfSksci5jcmVhdGVCb3hDdG9yKCJudW1wIixmdW5jdGlvbih0KXt0aGlzLnBhY2tldHNzZW50PXQucmVhZFVpbnQ2NCgpfSksci5jcmVhdGVGdWxsQm94Q3RvcigicGFkYiIsZnVuY3Rpb24odCl7dmFyIGU9dC5yZWFkVWludDMyKCk7dGhpcy5wYWRiaXRzPVtdO2Zvcih2YXIgaT0wO2k8TWF0aC5mbG9vcigoZSsxKS8yKTtpKyspdGhpcy5wYWRiaXRzPXQucmVhZFVpbnQ4KCl9KSxyLmNyZWF0ZUJveEN0b3IoInBhc3AiLGZ1bmN0aW9uKHQpe3RoaXMuaFNwYWNpbmc9dC5yZWFkVWludDMyKCksdGhpcy52U3BhY2luZz10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlQm94Q3RvcigicGF5bCIsZnVuY3Rpb24odCl7dGhpcy50ZXh0PXQucmVhZFN0cmluZyh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSl9KSxyLmNyZWF0ZUJveEN0b3IoInBheXQiLGZ1bmN0aW9uKHQpe3RoaXMucGF5bG9hZElEPXQucmVhZFVpbnQzMigpO3ZhciBlPXQucmVhZFVpbnQ4KCk7dGhpcy5ydHBtYXBfc3RyaW5nPXQucmVhZFN0cmluZyhlKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInBkaW4iLGZ1bmN0aW9uKHQpe3ZhciBlPSh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSkvODt0aGlzLnJhdGU9W10sdGhpcy5pbml0aWFsX2RlbGF5PVtdO2Zvcih2YXIgaT0wO2k8ZTtpKyspdGhpcy5yYXRlW2ldPXQucmVhZFVpbnQzMigpLHRoaXMuaW5pdGlhbF9kZWxheVtpXT10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInBpdG0iLGZ1bmN0aW9uKHQpe3RoaXMudmVyc2lvbj09PTA/dGhpcy5pdGVtX2lkPXQucmVhZFVpbnQxNigpOnRoaXMuaXRlbV9pZD10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInBpeGkiLGZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0aGlzLm51bV9jaGFubmVscz10LnJlYWRVaW50OCgpLHRoaXMuYml0c19wZXJfY2hhbm5lbHM9W10sZT0wO2U8dGhpcy5udW1fY2hhbm5lbHM7ZSsrKXRoaXMuYml0c19wZXJfY2hhbm5lbHNbZV09dC5yZWFkVWludDgoKX0pLHIuY3JlYXRlQm94Q3RvcigicG1heCIsZnVuY3Rpb24odCl7dGhpcy5ieXRlcz10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInByZnQiLGZ1bmN0aW9uKHQpe3RoaXMucmVmX3RyYWNrX2lkPXQucmVhZFVpbnQzMigpLHRoaXMubnRwX3RpbWVzdGFtcD10LnJlYWRVaW50NjQoKSx0aGlzLnZlcnNpb249PT0wP3RoaXMubWVkaWFfdGltZT10LnJlYWRVaW50MzIoKTp0aGlzLm1lZGlhX3RpbWU9dC5yZWFkVWludDY0KCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJwc3NoIixmdW5jdGlvbih0KXtpZih0aGlzLnN5c3RlbV9pZD1yLnBhcnNlSGV4MTYodCksdGhpcy52ZXJzaW9uPjApe3ZhciBlPXQucmVhZFVpbnQzMigpO3RoaXMua2lkPVtdO2Zvcih2YXIgaT0wO2k8ZTtpKyspdGhpcy5raWRbaV09ci5wYXJzZUhleDE2KHQpfXZhciBzPXQucmVhZFVpbnQzMigpO3M+MCYmKHRoaXMuZGF0YT10LnJlYWRVaW50OEFycmF5KHMpKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoImNsZWYiLGZ1bmN0aW9uKHQpe3RoaXMud2lkdGg9dC5yZWFkVWludDMyKCksdGhpcy5oZWlnaHQ9dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJlbm9mIixmdW5jdGlvbih0KXt0aGlzLndpZHRoPXQucmVhZFVpbnQzMigpLHRoaXMuaGVpZ2h0PXQucmVhZFVpbnQzMigpfSksci5jcmVhdGVGdWxsQm94Q3RvcigicHJvZiIsZnVuY3Rpb24odCl7dGhpcy53aWR0aD10LnJlYWRVaW50MzIoKSx0aGlzLmhlaWdodD10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlQ29udGFpbmVyQm94Q3RvcigidGFwdCIsbnVsbCxbImNsZWYiLCJwcm9mIiwiZW5vZiJdKSxyLmNyZWF0ZUJveEN0b3IoInJ0cCAiLGZ1bmN0aW9uKHQpe3RoaXMuZGVzY3JpcHRpb25mb3JtYXQ9dC5yZWFkU3RyaW5nKDQpLHRoaXMuc2RwdGV4dD10LnJlYWRTdHJpbmcodGhpcy5zaXplLXRoaXMuaGRyX3NpemUtNCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzYWlvIixmdW5jdGlvbih0KXt0aGlzLmZsYWdzJjEmJih0aGlzLmF1eF9pbmZvX3R5cGU9dC5yZWFkVWludDMyKCksdGhpcy5hdXhfaW5mb190eXBlX3BhcmFtZXRlcj10LnJlYWRVaW50MzIoKSk7dmFyIGU9dC5yZWFkVWludDMyKCk7dGhpcy5vZmZzZXQ9W107Zm9yKHZhciBpPTA7aTxlO2krKyl0aGlzLnZlcnNpb249PT0wP3RoaXMub2Zmc2V0W2ldPXQucmVhZFVpbnQzMigpOnRoaXMub2Zmc2V0W2ldPXQucmVhZFVpbnQ2NCgpfSksci5jcmVhdGVGdWxsQm94Q3Rvcigic2FpeiIsZnVuY3Rpb24odCl7dGhpcy5mbGFncyYxJiYodGhpcy5hdXhfaW5mb190eXBlPXQucmVhZFVpbnQzMigpLHRoaXMuYXV4X2luZm9fdHlwZV9wYXJhbWV0ZXI9dC5yZWFkVWludDMyKCkpLHRoaXMuZGVmYXVsdF9zYW1wbGVfaW5mb19zaXplPXQucmVhZFVpbnQ4KCk7dmFyIGU9dC5yZWFkVWludDMyKCk7aWYodGhpcy5zYW1wbGVfaW5mb19zaXplPVtdLHRoaXMuZGVmYXVsdF9zYW1wbGVfaW5mb19zaXplPT09MClmb3IodmFyIGk9MDtpPGU7aSsrKXRoaXMuc2FtcGxlX2luZm9fc2l6ZVtpXT10LnJlYWRVaW50OCgpfSksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9NRVRBREFUQSwibWV0dCIsZnVuY3Rpb24odCl7dGhpcy5wYXJzZUhlYWRlcih0KSx0aGlzLmNvbnRlbnRfZW5jb2Rpbmc9dC5yZWFkQ1N0cmluZygpLHRoaXMubWltZV9mb3JtYXQ9dC5yZWFkQ1N0cmluZygpLHRoaXMucGFyc2VGb290ZXIodCl9KSxyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX01FVEFEQVRBLCJtZXR4IixmdW5jdGlvbih0KXt0aGlzLnBhcnNlSGVhZGVyKHQpLHRoaXMuY29udGVudF9lbmNvZGluZz10LnJlYWRDU3RyaW5nKCksdGhpcy5uYW1lc3BhY2U9dC5yZWFkQ1N0cmluZygpLHRoaXMuc2NoZW1hX2xvY2F0aW9uPXQucmVhZENTdHJpbmcoKSx0aGlzLnBhcnNlRm9vdGVyKHQpfSksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9TVUJUSVRMRSwic2J0dCIsZnVuY3Rpb24odCl7dGhpcy5wYXJzZUhlYWRlcih0KSx0aGlzLmNvbnRlbnRfZW5jb2Rpbmc9dC5yZWFkQ1N0cmluZygpLHRoaXMubWltZV9mb3JtYXQ9dC5yZWFkQ1N0cmluZygpLHRoaXMucGFyc2VGb290ZXIodCl9KSxyLmNyZWF0ZVNhbXBsZUVudHJ5Q3RvcihyLlNBTVBMRV9FTlRSWV9UWVBFX1NVQlRJVExFLCJzdHBwIixmdW5jdGlvbih0KXt0aGlzLnBhcnNlSGVhZGVyKHQpLHRoaXMubmFtZXNwYWNlPXQucmVhZENTdHJpbmcoKSx0aGlzLnNjaGVtYV9sb2NhdGlvbj10LnJlYWRDU3RyaW5nKCksdGhpcy5hdXhpbGlhcnlfbWltZV90eXBlcz10LnJlYWRDU3RyaW5nKCksdGhpcy5wYXJzZUZvb3Rlcih0KX0pLHIuY3JlYXRlU2FtcGxlRW50cnlDdG9yKHIuU0FNUExFX0VOVFJZX1RZUEVfU1VCVElUTEUsInN0eHQiLGZ1bmN0aW9uKHQpe3RoaXMucGFyc2VIZWFkZXIodCksdGhpcy5jb250ZW50X2VuY29kaW5nPXQucmVhZENTdHJpbmcoKSx0aGlzLm1pbWVfZm9ybWF0PXQucmVhZENTdHJpbmcoKSx0aGlzLnBhcnNlRm9vdGVyKHQpfSksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9TVUJUSVRMRSwidHgzZyIsZnVuY3Rpb24odCl7dGhpcy5wYXJzZUhlYWRlcih0KSx0aGlzLmRpc3BsYXlGbGFncz10LnJlYWRVaW50MzIoKSx0aGlzLmhvcml6b250YWxfanVzdGlmaWNhdGlvbj10LnJlYWRJbnQ4KCksdGhpcy52ZXJ0aWNhbF9qdXN0aWZpY2F0aW9uPXQucmVhZEludDgoKSx0aGlzLmJnX2NvbG9yX3JnYmE9dC5yZWFkVWludDhBcnJheSg0KSx0aGlzLmJveF9yZWNvcmQ9dC5yZWFkSW50MTZBcnJheSg0KSx0aGlzLnN0eWxlX3JlY29yZD10LnJlYWRVaW50OEFycmF5KDEyKSx0aGlzLnBhcnNlRm9vdGVyKHQpfSksci5jcmVhdGVTYW1wbGVFbnRyeUN0b3Ioci5TQU1QTEVfRU5UUllfVFlQRV9NRVRBREFUQSwid3Z0dCIsZnVuY3Rpb24odCl7dGhpcy5wYXJzZUhlYWRlcih0KSx0aGlzLnBhcnNlRm9vdGVyKHQpfSksci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoImFsc3QiLGZ1bmN0aW9uKHQpe3ZhciBlLGk9dC5yZWFkVWludDE2KCk7Zm9yKHRoaXMuZmlyc3Rfb3V0cHV0X3NhbXBsZT10LnJlYWRVaW50MTYoKSx0aGlzLnNhbXBsZV9vZmZzZXQ9W10sZT0wO2U8aTtlKyspdGhpcy5zYW1wbGVfb2Zmc2V0W2VdPXQucmVhZFVpbnQzMigpO3ZhciBzPXRoaXMuZGVzY3JpcHRpb25fbGVuZ3RoLTQtNCppO2Zvcih0aGlzLm51bV9vdXRwdXRfc2FtcGxlcz1bXSx0aGlzLm51bV90b3RhbF9zYW1wbGVzPVtdLGU9MDtlPHMvNDtlKyspdGhpcy5udW1fb3V0cHV0X3NhbXBsZXNbZV09dC5yZWFkVWludDE2KCksdGhpcy5udW1fdG90YWxfc2FtcGxlc1tlXT10LnJlYWRVaW50MTYoKX0pLHIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJhdmxsIixmdW5jdGlvbih0KXt0aGlzLmxheWVyTnVtYmVyPXQucmVhZFVpbnQ4KCksdGhpcy5hY2N1cmF0ZVN0YXRpc3RpY3NGbGFnPXQucmVhZFVpbnQ4KCksdGhpcy5hdmdCaXRSYXRlPXQucmVhZFVpbnQxNigpLHRoaXMuYXZnRnJhbWVSYXRlPXQucmVhZFVpbnQxNigpfSksci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoImF2c3MiLGZ1bmN0aW9uKHQpe3RoaXMuc3ViU2VxdWVuY2VJZGVudGlmaWVyPXQucmVhZFVpbnQxNigpLHRoaXMubGF5ZXJOdW1iZXI9dC5yZWFkVWludDgoKTt2YXIgZT10LnJlYWRVaW50OCgpO3RoaXMuZHVyYXRpb25GbGFnPWU+PjcsdGhpcy5hdmdSYXRlRmxhZz1lPj42JjEsdGhpcy5kdXJhdGlvbkZsYWcmJih0aGlzLmR1cmF0aW9uPXQucmVhZFVpbnQzMigpKSx0aGlzLmF2Z1JhdGVGbGFnJiYodGhpcy5hY2N1cmF0ZVN0YXRpc3RpY3NGbGFnPXQucmVhZFVpbnQ4KCksdGhpcy5hdmdCaXRSYXRlPXQucmVhZFVpbnQxNigpLHRoaXMuYXZnRnJhbWVSYXRlPXQucmVhZFVpbnQxNigpKSx0aGlzLmRlcGVuZGVuY3k9W107Zm9yKHZhciBpPXQucmVhZFVpbnQ4KCkscz0wO3M8aTtzKyspe3ZhciBuPXt9O3RoaXMuZGVwZW5kZW5jeS5wdXNoKG4pLG4uc3ViU2VxRGlyZWN0aW9uRmxhZz10LnJlYWRVaW50OCgpLG4ubGF5ZXJOdW1iZXI9dC5yZWFkVWludDgoKSxuLnN1YlNlcXVlbmNlSWRlbnRpZmllcj10LnJlYWRVaW50MTYoKX19KSxyLmNyZWF0ZVNhbXBsZUdyb3VwQ3RvcigiZHRydCIsZnVuY3Rpb24odCl7aC53YXJuKCJCb3hQYXJzZXIiLCJTYW1wbGUgR3JvdXAgdHlwZTogIit0aGlzLmdyb3VwaW5nX3R5cGUrIiBub3QgZnVsbHkgcGFyc2VkIil9KSxyLmNyZWF0ZVNhbXBsZUdyb3VwQ3RvcigibXZpZiIsZnVuY3Rpb24odCl7aC53YXJuKCJCb3hQYXJzZXIiLCJTYW1wbGUgR3JvdXAgdHlwZTogIit0aGlzLmdyb3VwaW5nX3R5cGUrIiBub3QgZnVsbHkgcGFyc2VkIil9KSxyLmNyZWF0ZVNhbXBsZUdyb3VwQ3RvcigicHJvbCIsZnVuY3Rpb24odCl7dGhpcy5yb2xsX2Rpc3RhbmNlPXQucmVhZEludDE2KCl9KSxyLmNyZWF0ZVNhbXBsZUdyb3VwQ3RvcigicmFwICIsZnVuY3Rpb24odCl7dmFyIGU9dC5yZWFkVWludDgoKTt0aGlzLm51bV9sZWFkaW5nX3NhbXBsZXNfa25vd249ZT4+Nyx0aGlzLm51bV9sZWFkaW5nX3NhbXBsZXM9ZSYxMjd9KSxyLmNyZWF0ZVNhbXBsZUdyb3VwQ3RvcigicmFzaCIsZnVuY3Rpb24odCl7aWYodGhpcy5vcGVyYXRpb25fcG9pbnRfY291bnQ9dC5yZWFkVWludDE2KCksdGhpcy5kZXNjcmlwdGlvbl9sZW5ndGghPT0yKyh0aGlzLm9wZXJhdGlvbl9wb2ludF9jb3VudD09PTE/Mjp0aGlzLm9wZXJhdGlvbl9wb2ludF9jb3VudCo2KSs5KWgud2FybigiQm94UGFyc2VyIiwiTWlzbWF0Y2ggaW4gIit0aGlzLmdyb3VwaW5nX3R5cGUrIiBzYW1wbGUgZ3JvdXAgbGVuZ3RoIiksdGhpcy5kYXRhPXQucmVhZFVpbnQ4QXJyYXkodGhpcy5kZXNjcmlwdGlvbl9sZW5ndGgtMik7ZWxzZXtpZih0aGlzLm9wZXJhdGlvbl9wb2ludF9jb3VudD09PTEpdGhpcy50YXJnZXRfcmF0ZV9zaGFyZT10LnJlYWRVaW50MTYoKTtlbHNle3RoaXMudGFyZ2V0X3JhdGVfc2hhcmU9W10sdGhpcy5hdmFpbGFibGVfYml0cmF0ZT1bXTtmb3IodmFyIGU9MDtlPHRoaXMub3BlcmF0aW9uX3BvaW50X2NvdW50O2UrKyl0aGlzLmF2YWlsYWJsZV9iaXRyYXRlW2VdPXQucmVhZFVpbnQzMigpLHRoaXMudGFyZ2V0X3JhdGVfc2hhcmVbZV09dC5yZWFkVWludDE2KCl9dGhpcy5tYXhpbXVtX2JpdHJhdGU9dC5yZWFkVWludDMyKCksdGhpcy5taW5pbXVtX2JpdHJhdGU9dC5yZWFkVWludDMyKCksdGhpcy5kaXNjYXJkX3ByaW9yaXR5PXQucmVhZFVpbnQ4KCl9fSksci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInJvbGwiLGZ1bmN0aW9uKHQpe3RoaXMucm9sbF9kaXN0YW5jZT10LnJlYWRJbnQxNigpfSksci5TYW1wbGVHcm91cEVudHJ5LnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXtoLndhcm4oIkJveFBhcnNlciIsIlVua25vd24gU2FtcGxlIEdyb3VwIHR5cGU6ICIrdGhpcy5ncm91cGluZ190eXBlKSx0aGlzLmRhdGE9dC5yZWFkVWludDhBcnJheSh0aGlzLmRlc2NyaXB0aW9uX2xlbmd0aCl9LHIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJzY2lmIixmdW5jdGlvbih0KXtoLndhcm4oIkJveFBhcnNlciIsIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKX0pLHIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJzY25tIixmdW5jdGlvbih0KXtoLndhcm4oIkJveFBhcnNlciIsIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKX0pLHIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJzZWlnIixmdW5jdGlvbih0KXt0aGlzLnJlc2VydmVkPXQucmVhZFVpbnQ4KCk7dmFyIGU9dC5yZWFkVWludDgoKTt0aGlzLmNyeXB0X2J5dGVfYmxvY2s9ZT4+NCx0aGlzLnNraXBfYnl0ZV9ibG9jaz1lJjE1LHRoaXMuaXNQcm90ZWN0ZWQ9dC5yZWFkVWludDgoKSx0aGlzLlBlcl9TYW1wbGVfSVZfU2l6ZT10LnJlYWRVaW50OCgpLHRoaXMuS0lEPXIucGFyc2VIZXgxNih0KSx0aGlzLmNvbnN0YW50X0lWX3NpemU9MCx0aGlzLmNvbnN0YW50X0lWPTAsdGhpcy5pc1Byb3RlY3RlZD09PTEmJnRoaXMuUGVyX1NhbXBsZV9JVl9TaXplPT09MCYmKHRoaXMuY29uc3RhbnRfSVZfc2l6ZT10LnJlYWRVaW50OCgpLHRoaXMuY29uc3RhbnRfSVY9dC5yZWFkVWludDhBcnJheSh0aGlzLmNvbnN0YW50X0lWX3NpemUpKX0pLHIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJzdHNhIixmdW5jdGlvbih0KXtoLndhcm4oIkJveFBhcnNlciIsIlNhbXBsZSBHcm91cCB0eXBlOiAiK3RoaXMuZ3JvdXBpbmdfdHlwZSsiIG5vdCBmdWxseSBwYXJzZWQiKX0pLHIuY3JlYXRlU2FtcGxlR3JvdXBDdG9yKCJzeW5jIixmdW5jdGlvbih0KXt2YXIgZT10LnJlYWRVaW50OCgpO3RoaXMuTkFMX3VuaXRfdHlwZT1lJjYzfSksci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInRlbGUiLGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVhZFVpbnQ4KCk7dGhpcy5sZXZlbF9pbmRlcGVuZGVudGx5X2RlY29kYWJsZT1lPj43fSksci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInRzYXMiLGZ1bmN0aW9uKHQpe2gud2FybigiQm94UGFyc2VyIiwiU2FtcGxlIEdyb3VwIHR5cGU6ICIrdGhpcy5ncm91cGluZ190eXBlKyIgbm90IGZ1bGx5IHBhcnNlZCIpfSksci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInRzY2wiLGZ1bmN0aW9uKHQpe2gud2FybigiQm94UGFyc2VyIiwiU2FtcGxlIEdyb3VwIHR5cGU6ICIrdGhpcy5ncm91cGluZ190eXBlKyIgbm90IGZ1bGx5IHBhcnNlZCIpfSksci5jcmVhdGVTYW1wbGVHcm91cEN0b3IoInZpcHIiLGZ1bmN0aW9uKHQpe2gud2FybigiQm94UGFyc2VyIiwiU2FtcGxlIEdyb3VwIHR5cGU6ICIrdGhpcy5ncm91cGluZ190eXBlKyIgbm90IGZ1bGx5IHBhcnNlZCIpfSksci5jcmVhdGVGdWxsQm94Q3Rvcigic2JncCIsZnVuY3Rpb24odCl7dGhpcy5ncm91cGluZ190eXBlPXQucmVhZFN0cmluZyg0KSx0aGlzLnZlcnNpb249PT0xP3RoaXMuZ3JvdXBpbmdfdHlwZV9wYXJhbWV0ZXI9dC5yZWFkVWludDMyKCk6dGhpcy5ncm91cGluZ190eXBlX3BhcmFtZXRlcj0wLHRoaXMuZW50cmllcz1bXTtmb3IodmFyIGU9dC5yZWFkVWludDMyKCksaT0wO2k8ZTtpKyspe3ZhciBzPXt9O3RoaXMuZW50cmllcy5wdXNoKHMpLHMuc2FtcGxlX2NvdW50PXQucmVhZEludDMyKCkscy5ncm91cF9kZXNjcmlwdGlvbl9pbmRleD10LnJlYWRJbnQzMigpfX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInNjaG0iLGZ1bmN0aW9uKHQpe3RoaXMuc2NoZW1lX3R5cGU9dC5yZWFkU3RyaW5nKDQpLHRoaXMuc2NoZW1lX3ZlcnNpb249dC5yZWFkVWludDMyKCksdGhpcy5mbGFncyYxJiYodGhpcy5zY2hlbWVfdXJpPXQucmVhZFN0cmluZyh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZS04KSl9KSxyLmNyZWF0ZUJveEN0b3IoInNkcCAiLGZ1bmN0aW9uKHQpe3RoaXMuc2RwdGV4dD10LnJlYWRTdHJpbmcodGhpcy5zaXplLXRoaXMuaGRyX3NpemUpfSksci5jcmVhdGVGdWxsQm94Q3Rvcigic2R0cCIsZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLnNpemUtdGhpcy5oZHJfc2l6ZTt0aGlzLmlzX2xlYWRpbmc9W10sdGhpcy5zYW1wbGVfZGVwZW5kc19vbj1bXSx0aGlzLnNhbXBsZV9pc19kZXBlbmRlZF9vbj1bXSx0aGlzLnNhbXBsZV9oYXNfcmVkdW5kYW5jeT1bXTtmb3IodmFyIHM9MDtzPGk7cysrKWU9dC5yZWFkVWludDgoKSx0aGlzLmlzX2xlYWRpbmdbc109ZT4+Nix0aGlzLnNhbXBsZV9kZXBlbmRzX29uW3NdPWU+PjQmMyx0aGlzLnNhbXBsZV9pc19kZXBlbmRlZF9vbltzXT1lPj4yJjMsdGhpcy5zYW1wbGVfaGFzX3JlZHVuZGFuY3lbc109ZSYzfSksci5jcmVhdGVGdWxsQm94Q3Rvcigic2VuYyIpLHIuY3JlYXRlRnVsbEJveEN0b3IoInNncGQiLGZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBpbmdfdHlwZT10LnJlYWRTdHJpbmcoNCksaC5kZWJ1ZygiQm94UGFyc2VyIiwiRm91bmQgU2FtcGxlIEdyb3VwcyBvZiB0eXBlICIrdGhpcy5ncm91cGluZ190eXBlKSx0aGlzLnZlcnNpb249PT0xP3RoaXMuZGVmYXVsdF9sZW5ndGg9dC5yZWFkVWludDMyKCk6dGhpcy5kZWZhdWx0X2xlbmd0aD0wLHRoaXMudmVyc2lvbj49MiYmKHRoaXMuZGVmYXVsdF9ncm91cF9kZXNjcmlwdGlvbl9pbmRleD10LnJlYWRVaW50MzIoKSksdGhpcy5lbnRyaWVzPVtdO2Zvcih2YXIgZT10LnJlYWRVaW50MzIoKSxpPTA7aTxlO2krKyl7dmFyIHM7clt0aGlzLmdyb3VwaW5nX3R5cGUrIlNhbXBsZUdyb3VwRW50cnkiXT9zPW5ldyByW3RoaXMuZ3JvdXBpbmdfdHlwZSsiU2FtcGxlR3JvdXBFbnRyeSJdKHRoaXMuZ3JvdXBpbmdfdHlwZSk6cz1uZXcgci5TYW1wbGVHcm91cEVudHJ5KHRoaXMuZ3JvdXBpbmdfdHlwZSksdGhpcy5lbnRyaWVzLnB1c2gocyksdGhpcy52ZXJzaW9uPT09MT90aGlzLmRlZmF1bHRfbGVuZ3RoPT09MD9zLmRlc2NyaXB0aW9uX2xlbmd0aD10LnJlYWRVaW50MzIoKTpzLmRlc2NyaXB0aW9uX2xlbmd0aD10aGlzLmRlZmF1bHRfbGVuZ3RoOnMuZGVzY3JpcHRpb25fbGVuZ3RoPXRoaXMuZGVmYXVsdF9sZW5ndGgscy53cml0ZT09PXIuU2FtcGxlR3JvdXBFbnRyeS5wcm90b3R5cGUud3JpdGUmJihoLmluZm8oIkJveFBhcnNlciIsIlNhbXBsZUdyb3VwIGZvciB0eXBlICIrdGhpcy5ncm91cGluZ190eXBlKyIgd3JpdGluZyBub3QgeWV0IGltcGxlbWVudGVkLCBrZWVwaW5nIHVucGFyc2VkIGRhdGEgaW4gbWVtb3J5IGZvciBsYXRlciB3cml0ZSIpLHMuZGF0YT10LnJlYWRVaW50OEFycmF5KHMuZGVzY3JpcHRpb25fbGVuZ3RoKSx0LnBvc2l0aW9uLT1zLmRlc2NyaXB0aW9uX2xlbmd0aCkscy5wYXJzZSh0KX19KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzaWR4IixmdW5jdGlvbih0KXt0aGlzLnJlZmVyZW5jZV9JRD10LnJlYWRVaW50MzIoKSx0aGlzLnRpbWVzY2FsZT10LnJlYWRVaW50MzIoKSx0aGlzLnZlcnNpb249PT0wPyh0aGlzLmVhcmxpZXN0X3ByZXNlbnRhdGlvbl90aW1lPXQucmVhZFVpbnQzMigpLHRoaXMuZmlyc3Rfb2Zmc2V0PXQucmVhZFVpbnQzMigpKToodGhpcy5lYXJsaWVzdF9wcmVzZW50YXRpb25fdGltZT10LnJlYWRVaW50NjQoKSx0aGlzLmZpcnN0X29mZnNldD10LnJlYWRVaW50NjQoKSksdC5yZWFkVWludDE2KCksdGhpcy5yZWZlcmVuY2VzPVtdO2Zvcih2YXIgZT10LnJlYWRVaW50MTYoKSxpPTA7aTxlO2krKyl7dmFyIHM9e307dGhpcy5yZWZlcmVuY2VzLnB1c2gocyk7dmFyIG49dC5yZWFkVWludDMyKCk7cy5yZWZlcmVuY2VfdHlwZT1uPj4zMSYxLHMucmVmZXJlbmNlZF9zaXplPW4mMjE0NzQ4MzY0NyxzLnN1YnNlZ21lbnRfZHVyYXRpb249dC5yZWFkVWludDMyKCksbj10LnJlYWRVaW50MzIoKSxzLnN0YXJ0c193aXRoX1NBUD1uPj4zMSYxLHMuU0FQX3R5cGU9bj4+MjgmNyxzLlNBUF9kZWx0YV90aW1lPW4mMjY4NDM1NDU1fX0pLHIuU2luZ2xlSXRlbVR5cGVSZWZlcmVuY2VCb3g9ZnVuY3Rpb24odCxlLGkscyl7ci5Cb3guY2FsbCh0aGlzLHQsZSksdGhpcy5oZHJfc2l6ZT1pLHRoaXMuc3RhcnQ9c30sci5TaW5nbGVJdGVtVHlwZVJlZmVyZW5jZUJveC5wcm90b3R5cGU9bmV3IHIuQm94LHIuU2luZ2xlSXRlbVR5cGVSZWZlcmVuY2VCb3gucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3RoaXMuZnJvbV9pdGVtX0lEPXQucmVhZFVpbnQxNigpO3ZhciBlPXQucmVhZFVpbnQxNigpO3RoaXMucmVmZXJlbmNlcz1bXTtmb3IodmFyIGk9MDtpPGU7aSsrKXRoaXMucmVmZXJlbmNlc1tpXT10LnJlYWRVaW50MTYoKX0sci5TaW5nbGVJdGVtVHlwZVJlZmVyZW5jZUJveExhcmdlPWZ1bmN0aW9uKHQsZSxpLHMpe3IuQm94LmNhbGwodGhpcyx0LGUpLHRoaXMuaGRyX3NpemU9aSx0aGlzLnN0YXJ0PXN9LHIuU2luZ2xlSXRlbVR5cGVSZWZlcmVuY2VCb3hMYXJnZS5wcm90b3R5cGU9bmV3IHIuQm94LHIuU2luZ2xlSXRlbVR5cGVSZWZlcmVuY2VCb3hMYXJnZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24odCl7dGhpcy5mcm9tX2l0ZW1fSUQ9dC5yZWFkVWludDMyKCk7dmFyIGU9dC5yZWFkVWludDE2KCk7dGhpcy5yZWZlcmVuY2VzPVtdO2Zvcih2YXIgaT0wO2k8ZTtpKyspdGhpcy5yZWZlcmVuY2VzW2ldPXQucmVhZFVpbnQzMigpfSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJTbURtIixmdW5jdGlvbih0KXt0aGlzLnByaW1hcnlSQ2hyb21hdGljaXR5X3g9dC5yZWFkVWludDE2KCksdGhpcy5wcmltYXJ5UkNocm9tYXRpY2l0eV95PXQucmVhZFVpbnQxNigpLHRoaXMucHJpbWFyeUdDaHJvbWF0aWNpdHlfeD10LnJlYWRVaW50MTYoKSx0aGlzLnByaW1hcnlHQ2hyb21hdGljaXR5X3k9dC5yZWFkVWludDE2KCksdGhpcy5wcmltYXJ5QkNocm9tYXRpY2l0eV94PXQucmVhZFVpbnQxNigpLHRoaXMucHJpbWFyeUJDaHJvbWF0aWNpdHlfeT10LnJlYWRVaW50MTYoKSx0aGlzLndoaXRlUG9pbnRDaHJvbWF0aWNpdHlfeD10LnJlYWRVaW50MTYoKSx0aGlzLndoaXRlUG9pbnRDaHJvbWF0aWNpdHlfeT10LnJlYWRVaW50MTYoKSx0aGlzLmx1bWluYW5jZU1heD10LnJlYWRVaW50MzIoKSx0aGlzLmx1bWluYW5jZU1pbj10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInNtaGQiLGZ1bmN0aW9uKHQpe3RoaXMuYmFsYW5jZT10LnJlYWRVaW50MTYoKSx0LnJlYWRVaW50MTYoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInNzaXgiLGZ1bmN0aW9uKHQpe3RoaXMuc3Vic2VnbWVudHM9W107Zm9yKHZhciBlPXQucmVhZFVpbnQzMigpLGk9MDtpPGU7aSsrKXt2YXIgcz17fTt0aGlzLnN1YnNlZ21lbnRzLnB1c2gocykscy5yYW5nZXM9W107Zm9yKHZhciBuPXQucmVhZFVpbnQzMigpLGY9MDtmPG47ZisrKXt2YXIgZD17fTtzLnJhbmdlcy5wdXNoKGQpLGQubGV2ZWw9dC5yZWFkVWludDgoKSxkLnJhbmdlX3NpemU9dC5yZWFkVWludDI0KCl9fX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInN0Y28iLGZ1bmN0aW9uKHQpe3ZhciBlO2lmKGU9dC5yZWFkVWludDMyKCksdGhpcy5jaHVua19vZmZzZXRzPVtdLHRoaXMudmVyc2lvbj09PTApZm9yKHZhciBpPTA7aTxlO2krKyl0aGlzLmNodW5rX29mZnNldHMucHVzaCh0LnJlYWRVaW50MzIoKSl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzdGRwIixmdW5jdGlvbih0KXt2YXIgZT0odGhpcy5zaXplLXRoaXMuaGRyX3NpemUpLzI7dGhpcy5wcmlvcml0eT1bXTtmb3IodmFyIGk9MDtpPGU7aSsrKXRoaXMucHJpb3JpdHlbaV09dC5yZWFkVWludDE2KCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzdGhkIiksci5jcmVhdGVGdWxsQm94Q3Rvcigic3RyaSIsZnVuY3Rpb24odCl7dGhpcy5zd2l0Y2hfZ3JvdXA9dC5yZWFkVWludDE2KCksdGhpcy5hbHRlcm5hdGVfZ3JvdXA9dC5yZWFkVWludDE2KCksdGhpcy5zdWJfdHJhY2tfaWQ9dC5yZWFkVWludDMyKCk7dmFyIGU9KHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplLTgpLzQ7dGhpcy5hdHRyaWJ1dGVfbGlzdD1bXTtmb3IodmFyIGk9MDtpPGU7aSsrKXRoaXMuYXR0cmlidXRlX2xpc3RbaV09dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzdHNjIixmdW5jdGlvbih0KXt2YXIgZSxpO2lmKGU9dC5yZWFkVWludDMyKCksdGhpcy5maXJzdF9jaHVuaz1bXSx0aGlzLnNhbXBsZXNfcGVyX2NodW5rPVtdLHRoaXMuc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4PVtdLHRoaXMudmVyc2lvbj09PTApZm9yKGk9MDtpPGU7aSsrKXRoaXMuZmlyc3RfY2h1bmsucHVzaCh0LnJlYWRVaW50MzIoKSksdGhpcy5zYW1wbGVzX3Blcl9jaHVuay5wdXNoKHQucmVhZFVpbnQzMigpKSx0aGlzLnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleC5wdXNoKHQucmVhZFVpbnQzMigpKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInN0c2QiLGZ1bmN0aW9uKHQpe3ZhciBlLGkscyxuO2Zvcih0aGlzLmVudHJpZXM9W10scz10LnJlYWRVaW50MzIoKSxlPTE7ZTw9cztlKyspaWYoaT1yLnBhcnNlT25lQm94KHQsITAsdGhpcy5zaXplLSh0LmdldFBvc2l0aW9uKCktdGhpcy5zdGFydCkpLGkuY29kZT09PXIuT0spcltpLnR5cGUrIlNhbXBsZUVudHJ5Il0/KG49bmV3IHJbaS50eXBlKyJTYW1wbGVFbnRyeSJdKGkuc2l6ZSksbi5oZHJfc2l6ZT1pLmhkcl9zaXplLG4uc3RhcnQ9aS5zdGFydCk6KGgud2FybigiQm94UGFyc2VyIiwiVW5rbm93biBzYW1wbGUgZW50cnkgdHlwZTogIitpLnR5cGUpLG49bmV3IHIuU2FtcGxlRW50cnkoaS50eXBlLGkuc2l6ZSxpLmhkcl9zaXplLGkuc3RhcnQpKSxuLndyaXRlPT09ci5TYW1wbGVFbnRyeS5wcm90b3R5cGUud3JpdGUmJihoLmluZm8oIkJveFBhcnNlciIsIlNhbXBsZUVudHJ5ICIrbi50eXBlKyIgYm94IHdyaXRpbmcgbm90IHlldCBpbXBsZW1lbnRlZCwga2VlcGluZyB1bnBhcnNlZCBkYXRhIGluIG1lbW9yeSBmb3IgbGF0ZXIgd3JpdGUiKSxuLnBhcnNlRGF0YUFuZFJld2luZCh0KSksbi5wYXJzZSh0KSx0aGlzLmVudHJpZXMucHVzaChuKTtlbHNlIHJldHVybn0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInN0c2ciLGZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBpbmdfdHlwZT10LnJlYWRVaW50MzIoKTt2YXIgZT10LnJlYWRVaW50MTYoKTt0aGlzLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4PVtdO2Zvcih2YXIgaT0wO2k8ZTtpKyspdGhpcy5ncm91cF9kZXNjcmlwdGlvbl9pbmRleFtpXT10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInN0c2giLGZ1bmN0aW9uKHQpe3ZhciBlLGk7aWYoZT10LnJlYWRVaW50MzIoKSx0aGlzLnNoYWRvd2VkX3NhbXBsZV9udW1iZXJzPVtdLHRoaXMuc3luY19zYW1wbGVfbnVtYmVycz1bXSx0aGlzLnZlcnNpb249PT0wKWZvcihpPTA7aTxlO2krKyl0aGlzLnNoYWRvd2VkX3NhbXBsZV9udW1iZXJzLnB1c2godC5yZWFkVWludDMyKCkpLHRoaXMuc3luY19zYW1wbGVfbnVtYmVycy5wdXNoKHQucmVhZFVpbnQzMigpKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInN0c3MiLGZ1bmN0aW9uKHQpe3ZhciBlLGk7aWYoaT10LnJlYWRVaW50MzIoKSx0aGlzLnZlcnNpb249PT0wKWZvcih0aGlzLnNhbXBsZV9udW1iZXJzPVtdLGU9MDtlPGk7ZSsrKXRoaXMuc2FtcGxlX251bWJlcnMucHVzaCh0LnJlYWRVaW50MzIoKSl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJzdHN6IixmdW5jdGlvbih0KXt2YXIgZTtpZih0aGlzLnNhbXBsZV9zaXplcz1bXSx0aGlzLnZlcnNpb249PT0wKWZvcih0aGlzLnNhbXBsZV9zaXplPXQucmVhZFVpbnQzMigpLHRoaXMuc2FtcGxlX2NvdW50PXQucmVhZFVpbnQzMigpLGU9MDtlPHRoaXMuc2FtcGxlX2NvdW50O2UrKyl0aGlzLnNhbXBsZV9zaXplPT09MD90aGlzLnNhbXBsZV9zaXplcy5wdXNoKHQucmVhZFVpbnQzMigpKTp0aGlzLnNhbXBsZV9zaXplc1tlXT10aGlzLnNhbXBsZV9zaXplfSksci5jcmVhdGVGdWxsQm94Q3Rvcigic3R0cyIsZnVuY3Rpb24odCl7dmFyIGUsaSxzO2lmKGU9dC5yZWFkVWludDMyKCksdGhpcy5zYW1wbGVfY291bnRzPVtdLHRoaXMuc2FtcGxlX2RlbHRhcz1bXSx0aGlzLnZlcnNpb249PT0wKWZvcihpPTA7aTxlO2krKyl0aGlzLnNhbXBsZV9jb3VudHMucHVzaCh0LnJlYWRVaW50MzIoKSkscz10LnJlYWRJbnQzMigpLHM8MCYmKGgud2FybigiQm94UGFyc2VyIiwiRmlsZSB1c2VzIG5lZ2F0aXZlIHN0dHMgc2FtcGxlIGRlbHRhLCB1c2luZyB2YWx1ZSAxIGluc3RlYWQsIHN5bmMgbWF5IGJlIGxvc3QhIikscz0xKSx0aGlzLnNhbXBsZV9kZWx0YXMucHVzaChzKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInN0dmkiLGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVhZFVpbnQzMigpO3RoaXMuc2luZ2xlX3ZpZXdfYWxsb3dlZD1lJjMsdGhpcy5zdGVyZW9fc2NoZW1lPXQucmVhZFVpbnQzMigpO3ZhciBpPXQucmVhZFVpbnQzMigpO3RoaXMuc3RlcmVvX2luZGljYXRpb25fdHlwZT10LnJlYWRTdHJpbmcoaSk7dmFyIHMsbjtmb3IodGhpcy5ib3hlcz1bXTt0LmdldFBvc2l0aW9uKCk8dGhpcy5zdGFydCt0aGlzLnNpemU7KWlmKHM9ci5wYXJzZU9uZUJveCh0LCExLHRoaXMuc2l6ZS0odC5nZXRQb3NpdGlvbigpLXRoaXMuc3RhcnQpKSxzLmNvZGU9PT1yLk9LKW49cy5ib3gsdGhpcy5ib3hlcy5wdXNoKG4pLHRoaXNbbi50eXBlXT1uO2Vsc2UgcmV0dXJufSksci5jcmVhdGVCb3hDdG9yKCJzdHlwIixmdW5jdGlvbih0KXtyLmZ0eXBCb3gucHJvdG90eXBlLnBhcnNlLmNhbGwodGhpcyx0KX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInN0ejIiLGZ1bmN0aW9uKHQpe3ZhciBlLGk7aWYodGhpcy5zYW1wbGVfc2l6ZXM9W10sdGhpcy52ZXJzaW9uPT09MClpZih0aGlzLnJlc2VydmVkPXQucmVhZFVpbnQyNCgpLHRoaXMuZmllbGRfc2l6ZT10LnJlYWRVaW50OCgpLGk9dC5yZWFkVWludDMyKCksdGhpcy5maWVsZF9zaXplPT09NClmb3IoZT0wO2U8aTtlKz0yKXt2YXIgcz10LnJlYWRVaW50OCgpO3RoaXMuc2FtcGxlX3NpemVzW2VdPXM+PjQmMTUsdGhpcy5zYW1wbGVfc2l6ZXNbZSsxXT1zJjE1fWVsc2UgaWYodGhpcy5maWVsZF9zaXplPT09OClmb3IoZT0wO2U8aTtlKyspdGhpcy5zYW1wbGVfc2l6ZXNbZV09dC5yZWFkVWludDgoKTtlbHNlIGlmKHRoaXMuZmllbGRfc2l6ZT09PTE2KWZvcihlPTA7ZTxpO2UrKyl0aGlzLnNhbXBsZV9zaXplc1tlXT10LnJlYWRVaW50MTYoKTtlbHNlIGguZXJyb3IoIkJveFBhcnNlciIsIkVycm9yIGluIGxlbmd0aCBmaWVsZCBpbiBzdHoyIGJveCIpfSksci5jcmVhdGVGdWxsQm94Q3Rvcigic3VicyIsZnVuY3Rpb24odCl7dmFyIGUsaSxzLG47Zm9yKHM9dC5yZWFkVWludDMyKCksdGhpcy5lbnRyaWVzPVtdLGU9MDtlPHM7ZSsrKXt2YXIgZj17fTtpZih0aGlzLmVudHJpZXNbZV09ZixmLnNhbXBsZV9kZWx0YT10LnJlYWRVaW50MzIoKSxmLnN1YnNhbXBsZXM9W10sbj10LnJlYWRVaW50MTYoKSxuPjApZm9yKGk9MDtpPG47aSsrKXt2YXIgZD17fTtmLnN1YnNhbXBsZXMucHVzaChkKSx0aGlzLnZlcnNpb249PTE/ZC5zaXplPXQucmVhZFVpbnQzMigpOmQuc2l6ZT10LnJlYWRVaW50MTYoKSxkLnByaW9yaXR5PXQucmVhZFVpbnQ4KCksZC5kaXNjYXJkYWJsZT10LnJlYWRVaW50OCgpLGQuY29kZWNfc3BlY2lmaWNfcGFyYW1ldGVycz10LnJlYWRVaW50MzIoKX19fSksci5jcmVhdGVGdWxsQm94Q3RvcigidGVuYyIsZnVuY3Rpb24odCl7aWYodC5yZWFkVWludDgoKSx0aGlzLnZlcnNpb249PT0wKXQucmVhZFVpbnQ4KCk7ZWxzZXt2YXIgZT10LnJlYWRVaW50OCgpO3RoaXMuZGVmYXVsdF9jcnlwdF9ieXRlX2Jsb2NrPWU+PjQmMTUsdGhpcy5kZWZhdWx0X3NraXBfYnl0ZV9ibG9jaz1lJjE1fXRoaXMuZGVmYXVsdF9pc1Byb3RlY3RlZD10LnJlYWRVaW50OCgpLHRoaXMuZGVmYXVsdF9QZXJfU2FtcGxlX0lWX1NpemU9dC5yZWFkVWludDgoKSx0aGlzLmRlZmF1bHRfS0lEPXIucGFyc2VIZXgxNih0KSx0aGlzLmRlZmF1bHRfaXNQcm90ZWN0ZWQ9PT0xJiZ0aGlzLmRlZmF1bHRfUGVyX1NhbXBsZV9JVl9TaXplPT09MCYmKHRoaXMuZGVmYXVsdF9jb25zdGFudF9JVl9zaXplPXQucmVhZFVpbnQ4KCksdGhpcy5kZWZhdWx0X2NvbnN0YW50X0lWPXQucmVhZFVpbnQ4QXJyYXkodGhpcy5kZWZhdWx0X2NvbnN0YW50X0lWX3NpemUpKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInRmZHQiLGZ1bmN0aW9uKHQpe3RoaXMudmVyc2lvbj09MT90aGlzLmJhc2VNZWRpYURlY29kZVRpbWU9dC5yZWFkVWludDY0KCk6dGhpcy5iYXNlTWVkaWFEZWNvZGVUaW1lPXQucmVhZFVpbnQzMigpfSksci5jcmVhdGVGdWxsQm94Q3RvcigidGZoZCIsZnVuY3Rpb24odCl7dmFyIGU9MDt0aGlzLnRyYWNrX2lkPXQucmVhZFVpbnQzMigpLHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplPmUmJnRoaXMuZmxhZ3Mmci5URkhEX0ZMQUdfQkFTRV9EQVRBX09GRlNFVD8odGhpcy5iYXNlX2RhdGFfb2Zmc2V0PXQucmVhZFVpbnQ2NCgpLGUrPTgpOnRoaXMuYmFzZV9kYXRhX29mZnNldD0wLHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplPmUmJnRoaXMuZmxhZ3Mmci5URkhEX0ZMQUdfU0FNUExFX0RFU0M/KHRoaXMuZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg9dC5yZWFkVWludDMyKCksZSs9NCk6dGhpcy5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleD0wLHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplPmUmJnRoaXMuZmxhZ3Mmci5URkhEX0ZMQUdfU0FNUExFX0RVUj8odGhpcy5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbj10LnJlYWRVaW50MzIoKSxlKz00KTp0aGlzLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uPTAsdGhpcy5zaXplLXRoaXMuaGRyX3NpemU+ZSYmdGhpcy5mbGFncyZyLlRGSERfRkxBR19TQU1QTEVfU0laRT8odGhpcy5kZWZhdWx0X3NhbXBsZV9zaXplPXQucmVhZFVpbnQzMigpLGUrPTQpOnRoaXMuZGVmYXVsdF9zYW1wbGVfc2l6ZT0wLHRoaXMuc2l6ZS10aGlzLmhkcl9zaXplPmUmJnRoaXMuZmxhZ3Mmci5URkhEX0ZMQUdfU0FNUExFX0ZMQUdTPyh0aGlzLmRlZmF1bHRfc2FtcGxlX2ZsYWdzPXQucmVhZFVpbnQzMigpLGUrPTQpOnRoaXMuZGVmYXVsdF9zYW1wbGVfZmxhZ3M9MH0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInRmcmEiLGZ1bmN0aW9uKHQpe3RoaXMudHJhY2tfSUQ9dC5yZWFkVWludDMyKCksdC5yZWFkVWludDI0KCk7dmFyIGU9dC5yZWFkVWludDgoKTt0aGlzLmxlbmd0aF9zaXplX29mX3RyYWZfbnVtPWU+PjQmMyx0aGlzLmxlbmd0aF9zaXplX29mX3RydW5fbnVtPWU+PjImMyx0aGlzLmxlbmd0aF9zaXplX29mX3NhbXBsZV9udW09ZSYzLHRoaXMuZW50cmllcz1bXTtmb3IodmFyIGk9dC5yZWFkVWludDMyKCkscz0wO3M8aTtzKyspdGhpcy52ZXJzaW9uPT09MT8odGhpcy50aW1lPXQucmVhZFVpbnQ2NCgpLHRoaXMubW9vZl9vZmZzZXQ9dC5yZWFkVWludDY0KCkpOih0aGlzLnRpbWU9dC5yZWFkVWludDMyKCksdGhpcy5tb29mX29mZnNldD10LnJlYWRVaW50MzIoKSksdGhpcy50cmFmX251bWJlcj10WyJyZWFkVWludCIrOCoodGhpcy5sZW5ndGhfc2l6ZV9vZl90cmFmX251bSsxKV0oKSx0aGlzLnRydW5fbnVtYmVyPXRbInJlYWRVaW50Iis4Kih0aGlzLmxlbmd0aF9zaXplX29mX3RydW5fbnVtKzEpXSgpLHRoaXMuc2FtcGxlX251bWJlcj10WyJyZWFkVWludCIrOCoodGhpcy5sZW5ndGhfc2l6ZV9vZl9zYW1wbGVfbnVtKzEpXSgpfSksci5jcmVhdGVGdWxsQm94Q3RvcigidGtoZCIsZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPT0xPyh0aGlzLmNyZWF0aW9uX3RpbWU9dC5yZWFkVWludDY0KCksdGhpcy5tb2RpZmljYXRpb25fdGltZT10LnJlYWRVaW50NjQoKSx0aGlzLnRyYWNrX2lkPXQucmVhZFVpbnQzMigpLHQucmVhZFVpbnQzMigpLHRoaXMuZHVyYXRpb249dC5yZWFkVWludDY0KCkpOih0aGlzLmNyZWF0aW9uX3RpbWU9dC5yZWFkVWludDMyKCksdGhpcy5tb2RpZmljYXRpb25fdGltZT10LnJlYWRVaW50MzIoKSx0aGlzLnRyYWNrX2lkPXQucmVhZFVpbnQzMigpLHQucmVhZFVpbnQzMigpLHRoaXMuZHVyYXRpb249dC5yZWFkVWludDMyKCkpLHQucmVhZFVpbnQzMkFycmF5KDIpLHRoaXMubGF5ZXI9dC5yZWFkSW50MTYoKSx0aGlzLmFsdGVybmF0ZV9ncm91cD10LnJlYWRJbnQxNigpLHRoaXMudm9sdW1lPXQucmVhZEludDE2KCk+PjgsdC5yZWFkVWludDE2KCksdGhpcy5tYXRyaXg9dC5yZWFkSW50MzJBcnJheSg5KSx0aGlzLndpZHRoPXQucmVhZFVpbnQzMigpLHRoaXMuaGVpZ2h0PXQucmVhZFVpbnQzMigpfSksci5jcmVhdGVCb3hDdG9yKCJ0bWF4IixmdW5jdGlvbih0KXt0aGlzLnRpbWU9dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUJveEN0b3IoInRtaW4iLGZ1bmN0aW9uKHQpe3RoaXMudGltZT10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlQm94Q3RvcigidG90bCIsZnVuY3Rpb24odCl7dGhpcy5ieXRlc3NlbnQ9dC5yZWFkVWludDMyKCl9KSxyLmNyZWF0ZUJveEN0b3IoInRwYXkiLGZ1bmN0aW9uKHQpe3RoaXMuYnl0ZXNzZW50PXQucmVhZFVpbnQzMigpfSksci5jcmVhdGVCb3hDdG9yKCJ0cHlsIixmdW5jdGlvbih0KXt0aGlzLmJ5dGVzc2VudD10LnJlYWRVaW50NjQoKX0pLHIuVHJhY2tHcm91cFR5cGVCb3gucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe3RoaXMucGFyc2VGdWxsSGVhZGVyKHQpLHRoaXMudHJhY2tfZ3JvdXBfaWQ9dC5yZWFkVWludDMyKCl9LHIuY3JlYXRlVHJhY2tHcm91cEN0b3IoIm1zcmMiKSxyLlRyYWNrUmVmZXJlbmNlVHlwZUJveD1mdW5jdGlvbih0LGUsaSxzKXtyLkJveC5jYWxsKHRoaXMsdCxlKSx0aGlzLmhkcl9zaXplPWksdGhpcy5zdGFydD1zfSxyLlRyYWNrUmVmZXJlbmNlVHlwZUJveC5wcm90b3R5cGU9bmV3IHIuQm94LHIuVHJhY2tSZWZlcmVuY2VUeXBlQm94LnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXt0aGlzLnRyYWNrX2lkcz10LnJlYWRVaW50MzJBcnJheSgodGhpcy5zaXplLXRoaXMuaGRyX3NpemUpLzQpfSxyLnRyZWZCb3gucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpO3QuZ2V0UG9zaXRpb24oKTx0aGlzLnN0YXJ0K3RoaXMuc2l6ZTspaWYoZT1yLnBhcnNlT25lQm94KHQsITAsdGhpcy5zaXplLSh0LmdldFBvc2l0aW9uKCktdGhpcy5zdGFydCkpLGUuY29kZT09PXIuT0spaT1uZXcgci5UcmFja1JlZmVyZW5jZVR5cGVCb3goZS50eXBlLGUuc2l6ZSxlLmhkcl9zaXplLGUuc3RhcnQpLGkud3JpdGU9PT1yLkJveC5wcm90b3R5cGUud3JpdGUmJmkudHlwZSE9PSJtZGF0IiYmKGguaW5mbygiQm94UGFyc2VyIiwiVHJhY2tSZWZlcmVuY2UgIitpLnR5cGUrIiBib3ggd3JpdGluZyBub3QgeWV0IGltcGxlbWVudGVkLCBrZWVwaW5nIHVucGFyc2VkIGRhdGEgaW4gbWVtb3J5IGZvciBsYXRlciB3cml0ZSIpLGkucGFyc2VEYXRhQW5kUmV3aW5kKHQpKSxpLnBhcnNlKHQpLHRoaXMuYm94ZXMucHVzaChpKTtlbHNlIHJldHVybn0sci5jcmVhdGVGdWxsQm94Q3RvcigidHJlcCIsZnVuY3Rpb24odCl7Zm9yKHRoaXMudHJhY2tfSUQ9dC5yZWFkVWludDMyKCksdGhpcy5ib3hlcz1bXTt0LmdldFBvc2l0aW9uKCk8dGhpcy5zdGFydCt0aGlzLnNpemU7KWlmKHJldD1yLnBhcnNlT25lQm94KHQsITEsdGhpcy5zaXplLSh0LmdldFBvc2l0aW9uKCktdGhpcy5zdGFydCkpLHJldC5jb2RlPT09ci5PSylib3g9cmV0LmJveCx0aGlzLmJveGVzLnB1c2goYm94KTtlbHNlIHJldHVybn0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInRyZXgiLGZ1bmN0aW9uKHQpe3RoaXMudHJhY2tfaWQ9dC5yZWFkVWludDMyKCksdGhpcy5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleD10LnJlYWRVaW50MzIoKSx0aGlzLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uPXQucmVhZFVpbnQzMigpLHRoaXMuZGVmYXVsdF9zYW1wbGVfc2l6ZT10LnJlYWRVaW50MzIoKSx0aGlzLmRlZmF1bHRfc2FtcGxlX2ZsYWdzPXQucmVhZFVpbnQzMigpfSksci5jcmVhdGVCb3hDdG9yKCJ0cnB5IixmdW5jdGlvbih0KXt0aGlzLmJ5dGVzc2VudD10LnJlYWRVaW50NjQoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInRydW4iLGZ1bmN0aW9uKHQpe3ZhciBlPTA7aWYodGhpcy5zYW1wbGVfY291bnQ9dC5yZWFkVWludDMyKCksZSs9NCx0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZT5lJiZ0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19EQVRBX09GRlNFVD8odGhpcy5kYXRhX29mZnNldD10LnJlYWRJbnQzMigpLGUrPTQpOnRoaXMuZGF0YV9vZmZzZXQ9MCx0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZT5lJiZ0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19GSVJTVF9GTEFHPyh0aGlzLmZpcnN0X3NhbXBsZV9mbGFncz10LnJlYWRVaW50MzIoKSxlKz00KTp0aGlzLmZpcnN0X3NhbXBsZV9mbGFncz0wLHRoaXMuc2FtcGxlX2R1cmF0aW9uPVtdLHRoaXMuc2FtcGxlX3NpemU9W10sdGhpcy5zYW1wbGVfZmxhZ3M9W10sdGhpcy5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQ9W10sdGhpcy5zaXplLXRoaXMuaGRyX3NpemU+ZSlmb3IodmFyIGk9MDtpPHRoaXMuc2FtcGxlX2NvdW50O2krKyl0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19EVVJBVElPTiYmKHRoaXMuc2FtcGxlX2R1cmF0aW9uW2ldPXQucmVhZFVpbnQzMigpKSx0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19TSVpFJiYodGhpcy5zYW1wbGVfc2l6ZVtpXT10LnJlYWRVaW50MzIoKSksdGhpcy5mbGFncyZyLlRSVU5fRkxBR1NfRkxBR1MmJih0aGlzLnNhbXBsZV9mbGFnc1tpXT10LnJlYWRVaW50MzIoKSksdGhpcy5mbGFncyZyLlRSVU5fRkxBR1NfQ1RTX09GRlNFVCYmKHRoaXMudmVyc2lvbj09PTA/dGhpcy5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRbaV09dC5yZWFkVWludDMyKCk6dGhpcy5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRbaV09dC5yZWFkSW50MzIoKSl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ0c2VsIixmdW5jdGlvbih0KXt0aGlzLnN3aXRjaF9ncm91cD10LnJlYWRVaW50MzIoKTt2YXIgZT0odGhpcy5zaXplLXRoaXMuaGRyX3NpemUtNCkvNDt0aGlzLmF0dHJpYnV0ZV9saXN0PVtdO2Zvcih2YXIgaT0wO2k8ZTtpKyspdGhpcy5hdHRyaWJ1dGVfbGlzdFtpXT10LnJlYWRVaW50MzIoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInR4dEMiLGZ1bmN0aW9uKHQpe3RoaXMuY29uZmlnPXQucmVhZENTdHJpbmcoKX0pLHIuY3JlYXRlRnVsbEJveEN0b3IoInVybCAiLGZ1bmN0aW9uKHQpe3RoaXMuZmxhZ3MhPT0xJiYodGhpcy5sb2NhdGlvbj10LnJlYWRDU3RyaW5nKCkpfSksci5jcmVhdGVGdWxsQm94Q3RvcigidXJuICIsZnVuY3Rpb24odCl7dGhpcy5uYW1lPXQucmVhZENTdHJpbmcoKSx0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZS10aGlzLm5hbWUubGVuZ3RoLTE+MCYmKHRoaXMubG9jYXRpb249dC5yZWFkQ1N0cmluZygpKX0pLHIuY3JlYXRlVVVJREJveCgiYTVkNDBiMzBlODE0MTFkZGJhMmYwODAwMjAwYzlhNjYiLCEwLCExLGZ1bmN0aW9uKHQpe3RoaXMuTGl2ZVNlcnZlck1hbmlmZXN0PXQucmVhZFN0cmluZyh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSkucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCImIzAzOTsiKX0pLHIuY3JlYXRlVVVJREJveCgiZDA4YTRmMTgxMGYzNGE4MmI2YzgzMmQ4YWJhMTgzZDMiLCEwLCExLGZ1bmN0aW9uKHQpe3RoaXMuc3lzdGVtX2lkPXIucGFyc2VIZXgxNih0KTt2YXIgZT10LnJlYWRVaW50MzIoKTtlPjAmJih0aGlzLmRhdGE9dC5yZWFkVWludDhBcnJheShlKSl9KSxyLmNyZWF0ZVVVSURCb3goImEyMzk0ZjUyNWE5YjRmMTRhMjQ0NmM0MjdjNjQ4ZGY0IiwhMCwhMSksci5jcmVhdGVVVUlEQm94KCI4OTc0ZGJjZTdiZTc0YzUxODRmOTcxNDhmOTg4MjU1NCIsITAsITEsZnVuY3Rpb24odCl7dGhpcy5kZWZhdWx0X0FsZ29yaXRobUlEPXQucmVhZFVpbnQyNCgpLHRoaXMuZGVmYXVsdF9JVl9zaXplPXQucmVhZFVpbnQ4KCksdGhpcy5kZWZhdWx0X0tJRD1yLnBhcnNlSGV4MTYodCl9KSxyLmNyZWF0ZVVVSURCb3goImQ0ODA3ZWYyY2EzOTQ2OTU4ZTU0MjZjYjllNDZhNzlmIiwhMCwhMSxmdW5jdGlvbih0KXt0aGlzLmZyYWdtZW50X2NvdW50PXQucmVhZFVpbnQ4KCksdGhpcy5lbnRyaWVzPVtdO2Zvcih2YXIgZT0wO2U8dGhpcy5mcmFnbWVudF9jb3VudDtlKyspe3ZhciBpPXt9LHM9MCxuPTA7dGhpcy52ZXJzaW9uPT09MT8ocz10LnJlYWRVaW50NjQoKSxuPXQucmVhZFVpbnQ2NCgpKToocz10LnJlYWRVaW50MzIoKSxuPXQucmVhZFVpbnQzMigpKSxpLmFic29sdXRlX3RpbWU9cyxpLmFic29sdXRlX2R1cmF0aW9uPW4sdGhpcy5lbnRyaWVzLnB1c2goaSl9fSksci5jcmVhdGVVVUlEQm94KCI2ZDFkOWIwNTQyZDU0NGU2ODBlMjE0MWRhZmY3NTdiMiIsITAsITEsZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPT09MT8odGhpcy5hYnNvbHV0ZV90aW1lPXQucmVhZFVpbnQ2NCgpLHRoaXMuZHVyYXRpb249dC5yZWFkVWludDY0KCkpOih0aGlzLmFic29sdXRlX3RpbWU9dC5yZWFkVWludDMyKCksdGhpcy5kdXJhdGlvbj10LnJlYWRVaW50MzIoKSl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ2bWhkIixmdW5jdGlvbih0KXt0aGlzLmdyYXBoaWNzbW9kZT10LnJlYWRVaW50MTYoKSx0aGlzLm9wY29sb3I9dC5yZWFkVWludDE2QXJyYXkoMyl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ2cGNDIixmdW5jdGlvbih0KXt2YXIgZTt0aGlzLnZlcnNpb249PT0xPyh0aGlzLnByb2ZpbGU9dC5yZWFkVWludDgoKSx0aGlzLmxldmVsPXQucmVhZFVpbnQ4KCksZT10LnJlYWRVaW50OCgpLHRoaXMuYml0RGVwdGg9ZT4+NCx0aGlzLmNocm9tYVN1YnNhbXBsaW5nPWU+PjEmNyx0aGlzLnZpZGVvRnVsbFJhbmdlRmxhZz1lJjEsdGhpcy5jb2xvdXJQcmltYXJpZXM9dC5yZWFkVWludDgoKSx0aGlzLnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzPXQucmVhZFVpbnQ4KCksdGhpcy5tYXRyaXhDb2VmZmljaWVudHM9dC5yZWFkVWludDgoKSx0aGlzLmNvZGVjSW50aWFsaXphdGlvbkRhdGFTaXplPXQucmVhZFVpbnQxNigpLHRoaXMuY29kZWNJbnRpYWxpemF0aW9uRGF0YT10LnJlYWRVaW50OEFycmF5KHRoaXMuY29kZWNJbnRpYWxpemF0aW9uRGF0YVNpemUpKToodGhpcy5wcm9maWxlPXQucmVhZFVpbnQ4KCksdGhpcy5sZXZlbD10LnJlYWRVaW50OCgpLGU9dC5yZWFkVWludDgoKSx0aGlzLmJpdERlcHRoPWU+PjQmMTUsdGhpcy5jb2xvclNwYWNlPWUmMTUsZT10LnJlYWRVaW50OCgpLHRoaXMuY2hyb21hU3Vic2FtcGxpbmc9ZT4+NCYxNSx0aGlzLnRyYW5zZmVyRnVuY3Rpb249ZT4+MSY3LHRoaXMudmlkZW9GdWxsUmFuZ2VGbGFnPWUmMSx0aGlzLmNvZGVjSW50aWFsaXphdGlvbkRhdGFTaXplPXQucmVhZFVpbnQxNigpLHRoaXMuY29kZWNJbnRpYWxpemF0aW9uRGF0YT10LnJlYWRVaW50OEFycmF5KHRoaXMuY29kZWNJbnRpYWxpemF0aW9uRGF0YVNpemUpKX0pLHIuY3JlYXRlQm94Q3RvcigidnR0QyIsZnVuY3Rpb24odCl7dGhpcy50ZXh0PXQucmVhZFN0cmluZyh0aGlzLnNpemUtdGhpcy5oZHJfc2l6ZSl9KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ2dmNDIixmdW5jdGlvbih0KXt2YXIgZSxpLHM9e2hlbGRfYml0czp2b2lkIDAsbnVtX2hlbGRfYml0czowLHN0cmVhbV9yZWFkXzFfYnl0ZXM6ZnVuY3Rpb24oUyl7dGhpcy5oZWxkX2JpdHM9Uy5yZWFkVWludDgoKSx0aGlzLm51bV9oZWxkX2JpdHM9OH0sc3RyZWFtX3JlYWRfMl9ieXRlczpmdW5jdGlvbihTKXt0aGlzLmhlbGRfYml0cz1TLnJlYWRVaW50MTYoKSx0aGlzLm51bV9oZWxkX2JpdHM9MTZ9LGV4dHJhY3RfYml0czpmdW5jdGlvbihTKXt2YXIgRj10aGlzLmhlbGRfYml0cz4+dGhpcy5udW1faGVsZF9iaXRzLVMmKDE8PFMpLTE7cmV0dXJuIHRoaXMubnVtX2hlbGRfYml0cy09UyxGfX07aWYocy5zdHJlYW1fcmVhZF8xX2J5dGVzKHQpLHMuZXh0cmFjdF9iaXRzKDUpLHRoaXMubGVuZ3RoU2l6ZU1pbnVzT25lPXMuZXh0cmFjdF9iaXRzKDIpLHRoaXMucHRsX3ByZXNlbnRfZmxhZz1zLmV4dHJhY3RfYml0cygxKSx0aGlzLnB0bF9wcmVzZW50X2ZsYWcpe3Muc3RyZWFtX3JlYWRfMl9ieXRlcyh0KSx0aGlzLm9sc19pZHg9cy5leHRyYWN0X2JpdHMoOSksdGhpcy5udW1fc3VibGF5ZXJzPXMuZXh0cmFjdF9iaXRzKDMpLHRoaXMuY29uc3RhbnRfZnJhbWVfcmF0ZT1zLmV4dHJhY3RfYml0cygyKSx0aGlzLmNocm9tYV9mb3JtYXRfaWRjPXMuZXh0cmFjdF9iaXRzKDIpLHMuc3RyZWFtX3JlYWRfMV9ieXRlcyh0KSx0aGlzLmJpdF9kZXB0aF9taW51czg9cy5leHRyYWN0X2JpdHMoMykscy5leHRyYWN0X2JpdHMoNSk7e2lmKHMuc3RyZWFtX3JlYWRfMl9ieXRlcyh0KSxzLmV4dHJhY3RfYml0cygyKSx0aGlzLm51bV9ieXRlc19jb25zdHJhaW50X2luZm89cy5leHRyYWN0X2JpdHMoNiksdGhpcy5nZW5lcmFsX3Byb2ZpbGVfaWRjPXMuZXh0cmFjdF9iaXRzKDcpLHRoaXMuZ2VuZXJhbF90aWVyX2ZsYWc9cy5leHRyYWN0X2JpdHMoMSksdGhpcy5nZW5lcmFsX2xldmVsX2lkYz10LnJlYWRVaW50OCgpLHMuc3RyZWFtX3JlYWRfMV9ieXRlcyh0KSx0aGlzLnB0bF9mcmFtZV9vbmx5X2NvbnN0cmFpbnRfZmxhZz1zLmV4dHJhY3RfYml0cygxKSx0aGlzLnB0bF9tdWx0aWxheWVyX2VuYWJsZWRfZmxhZz1zLmV4dHJhY3RfYml0cygxKSx0aGlzLmdlbmVyYWxfY29uc3RyYWludF9pbmZvPW5ldyBVaW50OEFycmF5KHRoaXMubnVtX2J5dGVzX2NvbnN0cmFpbnRfaW5mbyksdGhpcy5udW1fYnl0ZXNfY29uc3RyYWludF9pbmZvKXtmb3IoZT0wO2U8dGhpcy5udW1fYnl0ZXNfY29uc3RyYWludF9pbmZvLTE7ZSsrKXt2YXIgbj1zLmV4dHJhY3RfYml0cyg2KTtzLnN0cmVhbV9yZWFkXzFfYnl0ZXModCk7dmFyIGY9cy5leHRyYWN0X2JpdHMoMik7dGhpcy5nZW5lcmFsX2NvbnN0cmFpbnRfaW5mb1tlXT1uPDwyfGZ9dGhpcy5nZW5lcmFsX2NvbnN0cmFpbnRfaW5mb1t0aGlzLm51bV9ieXRlc19jb25zdHJhaW50X2luZm8tMV09cy5leHRyYWN0X2JpdHMoNil9ZWxzZSBzLmV4dHJhY3RfYml0cyg2KTtmb3Iocy5zdHJlYW1fcmVhZF8xX2J5dGVzKHQpLHRoaXMucHRsX3N1YmxheWVyX3ByZXNlbnRfbWFzaz0wLGk9dGhpcy5udW1fc3VibGF5ZXJzLTI7aT49MDstLWkpe3ZhciBkPXMuZXh0cmFjdF9iaXRzKDEpO3RoaXMucHRsX3N1YmxheWVyX3ByZXNlbnRfbWFza3w9ZDw8aX1mb3IoaT10aGlzLm51bV9zdWJsYXllcnM7aTw9OCYmdGhpcy5udW1fc3VibGF5ZXJzPjE7KytpKXMuZXh0cmFjdF9iaXRzKDEpO2ZvcihpPXRoaXMubnVtX3N1YmxheWVycy0yO2k+PTA7LS1pKXRoaXMucHRsX3N1YmxheWVyX3ByZXNlbnRfbWFzayYxPDxpJiYodGhpcy5zdWJsYXllcl9sZXZlbF9pZGNbaV09dC5yZWFkVWludDgoKSk7aWYodGhpcy5wdGxfbnVtX3N1Yl9wcm9maWxlcz10LnJlYWRVaW50OCgpLHRoaXMuZ2VuZXJhbF9zdWJfcHJvZmlsZV9pZGM9W10sdGhpcy5wdGxfbnVtX3N1Yl9wcm9maWxlcylmb3IoZT0wO2U8dGhpcy5wdGxfbnVtX3N1Yl9wcm9maWxlcztlKyspdGhpcy5nZW5lcmFsX3N1Yl9wcm9maWxlX2lkYy5wdXNoKHQucmVhZFVpbnQzMigpKX10aGlzLm1heF9waWN0dXJlX3dpZHRoPXQucmVhZFVpbnQxNigpLHRoaXMubWF4X3BpY3R1cmVfaGVpZ2h0PXQucmVhZFVpbnQxNigpLHRoaXMuYXZnX2ZyYW1lX3JhdGU9dC5yZWFkVWludDE2KCl9dmFyIGM9MTIsbT0xMzt0aGlzLm5hbHVfYXJyYXlzPVtdO3ZhciB4PXQucmVhZFVpbnQ4KCk7Zm9yKGU9MDtlPHg7ZSsrKXt2YXIgVT1bXTt0aGlzLm5hbHVfYXJyYXlzLnB1c2goVSkscy5zdHJlYW1fcmVhZF8xX2J5dGVzKHQpLFUuY29tcGxldGVuZXNzPXMuZXh0cmFjdF9iaXRzKDEpLHMuZXh0cmFjdF9iaXRzKDIpLFUubmFsdV90eXBlPXMuZXh0cmFjdF9iaXRzKDUpO3ZhciBiPTE7Zm9yKFUubmFsdV90eXBlIT1tJiZVLm5hbHVfdHlwZSE9YyYmKGI9dC5yZWFkVWludDE2KCkpLGk9MDtpPGI7aSsrKXt2YXIgdz10LnJlYWRVaW50MTYoKTtVLnB1c2goe2RhdGE6dC5yZWFkVWludDhBcnJheSh3KSxsZW5ndGg6d30pfX19KSxyLmNyZWF0ZUZ1bGxCb3hDdG9yKCJ2dm5DIixmdW5jdGlvbih0KXt2YXIgZT1zdHJtLnJlYWRVaW50OCgpO3RoaXMubGVuZ3RoU2l6ZU1pbnVzT25lPWUmM30pLHIuU2FtcGxlRW50cnkucHJvdG90eXBlLmlzVmlkZW89ZnVuY3Rpb24oKXtyZXR1cm4hMX0sci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuaXNBdWRpbz1mdW5jdGlvbigpe3JldHVybiExfSxyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5pc1N1YnRpdGxlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LHIuU2FtcGxlRW50cnkucHJvdG90eXBlLmlzTWV0YWRhdGE9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuaXNIaW50PWZ1bmN0aW9uKCl7cmV0dXJuITF9LHIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZS5yZXBsYWNlKCIuIiwiIil9LHIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9LHIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiIifSxyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4iIn0sci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0U2FtcGxlUmF0ZT1mdW5jdGlvbigpe3JldHVybiIifSxyLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRTYW1wbGVTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9LHIuVmlzdWFsU2FtcGxlRW50cnkucHJvdG90eXBlLmlzVmlkZW89ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5WaXN1YWxTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWR0aH0sci5WaXN1YWxTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVpZ2h0fSxyLkF1ZGlvU2FtcGxlRW50cnkucHJvdG90eXBlLmlzQXVkaW89ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5BdWRpb1NhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGFubmVsX2NvdW50fSxyLkF1ZGlvU2FtcGxlRW50cnkucHJvdG90eXBlLmdldFNhbXBsZVJhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYW1wbGVyYXRlfSxyLkF1ZGlvU2FtcGxlRW50cnkucHJvdG90eXBlLmdldFNhbXBsZVNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYW1wbGVzaXplfSxyLlN1YnRpdGxlU2FtcGxlRW50cnkucHJvdG90eXBlLmlzU3VidGl0bGU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5NZXRhZGF0YVNhbXBsZUVudHJ5LnByb3RvdHlwZS5pc01ldGFkYXRhPWZ1bmN0aW9uKCl7cmV0dXJuITB9LHIuZGVjaW1hbFRvSGV4PWZ1bmN0aW9uKHQsZSl7dmFyIGk9TnVtYmVyKHQpLnRvU3RyaW5nKDE2KTtmb3IoZT10eXBlb2YgZT4idSJ8fGU9PT1udWxsP2U9MjplO2kubGVuZ3RoPGU7KWk9IjAiK2k7cmV0dXJuIGl9LHIuYXZjMVNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYz1yLmF2YzJTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWM9ci5hdmMzU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjPXIuYXZjNFNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYz1mdW5jdGlvbigpe3ZhciB0PXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjLmNhbGwodGhpcyk7cmV0dXJuIHRoaXMuYXZjQz90KyIuIityLmRlY2ltYWxUb0hleCh0aGlzLmF2Y0MuQVZDUHJvZmlsZUluZGljYXRpb24pK3IuZGVjaW1hbFRvSGV4KHRoaXMuYXZjQy5wcm9maWxlX2NvbXBhdGliaWxpdHkpK3IuZGVjaW1hbFRvSGV4KHRoaXMuYXZjQy5BVkNMZXZlbEluZGljYXRpb24pOnR9LHIuaGV2MVNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYz1yLmh2YzFTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWM9ZnVuY3Rpb24oKXt2YXIgdCxlPXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjLmNhbGwodGhpcyk7aWYodGhpcy5odmNDKXtzd2l0Y2goZSs9Ii4iLHRoaXMuaHZjQy5nZW5lcmFsX3Byb2ZpbGVfc3BhY2Upe2Nhc2UgMDplKz0iIjticmVhaztjYXNlIDE6ZSs9IkEiO2JyZWFrO2Nhc2UgMjplKz0iQiI7YnJlYWs7Y2FzZSAzOmUrPSJDIjticmVha31lKz10aGlzLmh2Y0MuZ2VuZXJhbF9wcm9maWxlX2lkYyxlKz0iLiI7dmFyIGk9dGhpcy5odmNDLmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5LHM9MDtmb3IodD0wO3Q8MzImJihzfD1pJjEsdCE9MzEpO3QrKylzPDw9MSxpPj49MTtlKz1yLmRlY2ltYWxUb0hleChzLDApLGUrPSIuIix0aGlzLmh2Y0MuZ2VuZXJhbF90aWVyX2ZsYWc9PT0wP2UrPSJMIjplKz0iSCIsZSs9dGhpcy5odmNDLmdlbmVyYWxfbGV2ZWxfaWRjO3ZhciBuPSExLGY9IiI7Zm9yKHQ9NTt0Pj0wO3QtLSkodGhpcy5odmNDLmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JbdF18fG4pJiYoZj0iLiIrci5kZWNpbWFsVG9IZXgodGhpcy5odmNDLmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JbdF0sMCkrZixuPSEwKTtlKz1mfXJldHVybiBlfSxyLnZ2YzFTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWM9ci52dmkxU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjPWZ1bmN0aW9uKCl7dmFyIHQsZT1yLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYy5jYWxsKHRoaXMpO2lmKHRoaXMudnZjQyl7ZSs9Ii4iK3RoaXMudnZjQy5nZW5lcmFsX3Byb2ZpbGVfaWRjLHRoaXMudnZjQy5nZW5lcmFsX3RpZXJfZmxhZz9lKz0iLkgiOmUrPSIuTCIsZSs9dGhpcy52dmNDLmdlbmVyYWxfbGV2ZWxfaWRjO3ZhciBpPSIiO2lmKHRoaXMudnZjQy5nZW5lcmFsX2NvbnN0cmFpbnRfaW5mbyl7dmFyIHM9W10sbj0wO258PXRoaXMudnZjQy5wdGxfZnJhbWVfb25seV9jb25zdHJhaW50PDw3LG58PXRoaXMudnZjQy5wdGxfbXVsdGlsYXllcl9lbmFibGVkPDw2O3ZhciBmO2Zvcih0PTA7dDx0aGlzLnZ2Y0MuZ2VuZXJhbF9jb25zdHJhaW50X2luZm8ubGVuZ3RoOysrdClufD10aGlzLnZ2Y0MuZ2VuZXJhbF9jb25zdHJhaW50X2luZm9bdF0+PjImNjMscy5wdXNoKG4pLG4mJihmPXQpLG49dGhpcy52dmNDLmdlbmVyYWxfY29uc3RyYWludF9pbmZvW3RdPj4yJjM7aWYoZj09PXZvaWQgMClpPSIuQ0EiO2Vsc2V7aT0iLkMiO3ZhciBkPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjIzNDU2NyIsYz0wLG09MDtmb3IodD0wO3Q8PWY7Kyt0KWZvcihjPWM8PDh8c1t0XSxtKz04O20+PTU7KXt2YXIgeD1jPj5tLTUmMzE7aSs9ZFt4XSxtLT01LGMmPSgxPDxtKS0xfW0mJihjPDw9NS1tLGkrPWRbYyYzMV0pfX1lKz1pfXJldHVybiBlfSxyLm1wNGFTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWM9ZnVuY3Rpb24oKXt2YXIgdD1yLlNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYy5jYWxsKHRoaXMpO2lmKHRoaXMuZXNkcyYmdGhpcy5lc2RzLmVzZCl7dmFyIGU9dGhpcy5lc2RzLmVzZC5nZXRPVEkoKSxpPXRoaXMuZXNkcy5lc2QuZ2V0QXVkaW9Db25maWcoKTtyZXR1cm4gdCsiLiIrci5kZWNpbWFsVG9IZXgoZSkrKGk/Ii4iK2k6IiIpfWVsc2UgcmV0dXJuIHR9LHIuc3R4dFNhbXBsZUVudHJ5LnByb3RvdHlwZS5nZXRDb2RlYz1mdW5jdGlvbigpe3ZhciB0PXIuU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjLmNhbGwodGhpcyk7cmV0dXJuIHRoaXMubWltZV9mb3JtYXQ/dCsiLiIrdGhpcy5taW1lX2Zvcm1hdDp0fSxyLnZwMDhTYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWM9ci52cDA5U2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjPWZ1bmN0aW9uKCl7dmFyIHQ9ci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMuY2FsbCh0aGlzKSxlPXRoaXMudnBjQy5sZXZlbDtlPT0wJiYoZT0iMDAiKTt2YXIgaT10aGlzLnZwY0MuYml0RGVwdGg7cmV0dXJuIGk9PTgmJihpPSIwOCIpLHQrIi4wIit0aGlzLnZwY0MucHJvZmlsZSsiLiIrZSsiLiIraX0sci5hdjAxU2FtcGxlRW50cnkucHJvdG90eXBlLmdldENvZGVjPWZ1bmN0aW9uKCl7dmFyIHQ9ci5TYW1wbGVFbnRyeS5wcm90b3R5cGUuZ2V0Q29kZWMuY2FsbCh0aGlzKSxlPXRoaXMuYXYxQy5zZXFfbGV2ZWxfaWR4XzA7ZTwxMCYmKGU9IjAiK2UpO3ZhciBpO3JldHVybiB0aGlzLmF2MUMuc2VxX3Byb2ZpbGU9PT0yJiZ0aGlzLmF2MUMuaGlnaF9iaXRkZXB0aD09PTE/aT10aGlzLmF2MUMudHdlbHZlX2JpdD09PTE/IjEyIjoiMTAiOnRoaXMuYXYxQy5zZXFfcHJvZmlsZTw9MiYmKGk9dGhpcy5hdjFDLmhpZ2hfYml0ZGVwdGg9PT0xPyIxMCI6IjA4IiksdCsiLiIrdGhpcy5hdjFDLnNlcV9wcm9maWxlKyIuIitlKyh0aGlzLmF2MUMuc2VxX3RpZXJfMD8iSCI6Ik0iKSsiLiIraX0sci5Cb3gucHJvdG90eXBlLndyaXRlSGVhZGVyPWZ1bmN0aW9uKHQsZSl7dGhpcy5zaXplKz04LHRoaXMuc2l6ZT5wJiYodGhpcy5zaXplKz04KSx0aGlzLnR5cGU9PT0idXVpZCImJih0aGlzLnNpemUrPTE2KSxoLmRlYnVnKCJCb3hXcml0ZXIiLCJXcml0aW5nIGJveCAiK3RoaXMudHlwZSsiIG9mIHNpemU6ICIrdGhpcy5zaXplKyIgYXQgcG9zaXRpb24gIit0LmdldFBvc2l0aW9uKCkrKGV8fCIiKSksdGhpcy5zaXplPnA/dC53cml0ZVVpbnQzMigxKToodGhpcy5zaXplUG9zaXRpb249dC5nZXRQb3NpdGlvbigpLHQud3JpdGVVaW50MzIodGhpcy5zaXplKSksdC53cml0ZVN0cmluZyh0aGlzLnR5cGUsbnVsbCw0KSx0aGlzLnR5cGU9PT0idXVpZCImJnQud3JpdGVVaW50OEFycmF5KHRoaXMudXVpZCksdGhpcy5zaXplPnAmJnQud3JpdGVVaW50NjQodGhpcy5zaXplKX0sci5GdWxsQm94LnByb3RvdHlwZS53cml0ZUhlYWRlcj1mdW5jdGlvbih0KXt0aGlzLnNpemUrPTQsci5Cb3gucHJvdG90eXBlLndyaXRlSGVhZGVyLmNhbGwodGhpcyx0LCIgdj0iK3RoaXMudmVyc2lvbisiIGY9Iit0aGlzLmZsYWdzKSx0LndyaXRlVWludDgodGhpcy52ZXJzaW9uKSx0LndyaXRlVWludDI0KHRoaXMuZmxhZ3MpfSxyLkJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy50eXBlPT09Im1kYXQiP3RoaXMuZGF0YSYmKHRoaXMuc2l6ZT10aGlzLmRhdGEubGVuZ3RoLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQ4QXJyYXkodGhpcy5kYXRhKSk6KHRoaXMuc2l6ZT10aGlzLmRhdGE/dGhpcy5kYXRhLmxlbmd0aDowLHRoaXMud3JpdGVIZWFkZXIodCksdGhpcy5kYXRhJiZ0LndyaXRlVWludDhBcnJheSh0aGlzLmRhdGEpKX0sci5Db250YWluZXJCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3RoaXMuc2l6ZT0wLHRoaXMud3JpdGVIZWFkZXIodCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmJveGVzLmxlbmd0aDtlKyspdGhpcy5ib3hlc1tlXSYmKHRoaXMuYm94ZXNbZV0ud3JpdGUodCksdGhpcy5zaXplKz10aGlzLmJveGVzW2VdLnNpemUpO2guZGVidWcoIkJveFdyaXRlciIsIkFkanVzdGluZyBib3ggIit0aGlzLnR5cGUrIiB3aXRoIG5ldyBzaXplICIrdGhpcy5zaXplKSx0LmFkanVzdFVpbnQzMih0aGlzLnNpemVQb3NpdGlvbix0aGlzLnNpemUpfSxyLlRyYWNrUmVmZXJlbmNlVHlwZUJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy5zaXplPXRoaXMudHJhY2tfaWRzLmxlbmd0aCo0LHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMkFycmF5KHRoaXMudHJhY2tfaWRzKX0sci5hdmNDQm94LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt2YXIgZTtmb3IodGhpcy5zaXplPTcsZT0wO2U8dGhpcy5TUFMubGVuZ3RoO2UrKyl0aGlzLnNpemUrPTIrdGhpcy5TUFNbZV0ubGVuZ3RoO2ZvcihlPTA7ZTx0aGlzLlBQUy5sZW5ndGg7ZSsrKXRoaXMuc2l6ZSs9Mit0aGlzLlBQU1tlXS5sZW5ndGg7Zm9yKHRoaXMuZXh0JiYodGhpcy5zaXplKz10aGlzLmV4dC5sZW5ndGgpLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQ4KHRoaXMuY29uZmlndXJhdGlvblZlcnNpb24pLHQud3JpdGVVaW50OCh0aGlzLkFWQ1Byb2ZpbGVJbmRpY2F0aW9uKSx0LndyaXRlVWludDgodGhpcy5wcm9maWxlX2NvbXBhdGliaWxpdHkpLHQud3JpdGVVaW50OCh0aGlzLkFWQ0xldmVsSW5kaWNhdGlvbiksdC53cml0ZVVpbnQ4KHRoaXMubGVuZ3RoU2l6ZU1pbnVzT25lKzI1MiksdC53cml0ZVVpbnQ4KHRoaXMuU1BTLmxlbmd0aCsyMjQpLGU9MDtlPHRoaXMuU1BTLmxlbmd0aDtlKyspdC53cml0ZVVpbnQxNih0aGlzLlNQU1tlXS5sZW5ndGgpLHQud3JpdGVVaW50OEFycmF5KHRoaXMuU1BTW2VdLm5hbHUpO2Zvcih0LndyaXRlVWludDgodGhpcy5QUFMubGVuZ3RoKSxlPTA7ZTx0aGlzLlBQUy5sZW5ndGg7ZSsrKXQud3JpdGVVaW50MTYodGhpcy5QUFNbZV0ubGVuZ3RoKSx0LndyaXRlVWludDhBcnJheSh0aGlzLlBQU1tlXS5uYWx1KTt0aGlzLmV4dCYmdC53cml0ZVVpbnQ4QXJyYXkodGhpcy5leHQpfSxyLmNvNjRCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0aGlzLnZlcnNpb249MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTQrOCp0aGlzLmNodW5rX29mZnNldHMubGVuZ3RoLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMih0aGlzLmNodW5rX29mZnNldHMubGVuZ3RoKSxlPTA7ZTx0aGlzLmNodW5rX29mZnNldHMubGVuZ3RoO2UrKyl0LndyaXRlVWludDY0KHRoaXMuY2h1bmtfb2Zmc2V0c1tlXSl9LHIuY3NsZ0JveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMuc2l6ZT00KjUsdGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlSW50MzIodGhpcy5jb21wb3NpdGlvblRvRFRTU2hpZnQpLHQud3JpdGVJbnQzMih0aGlzLmxlYXN0RGVjb2RlVG9EaXNwbGF5RGVsdGEpLHQud3JpdGVJbnQzMih0aGlzLmdyZWF0ZXN0RGVjb2RlVG9EaXNwbGF5RGVsdGEpLHQud3JpdGVJbnQzMih0aGlzLmNvbXBvc2l0aW9uU3RhcnRUaW1lKSx0LndyaXRlSW50MzIodGhpcy5jb21wb3NpdGlvbkVuZFRpbWUpfSxyLmN0dHNCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0aGlzLnZlcnNpb249MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTQrOCp0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoKSxlPTA7ZTx0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoO2UrKyl0LndyaXRlVWludDMyKHRoaXMuc2FtcGxlX2NvdW50c1tlXSksdGhpcy52ZXJzaW9uPT09MT90LndyaXRlSW50MzIodGhpcy5zYW1wbGVfb2Zmc2V0c1tlXSk6dC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9vZmZzZXRzW2VdKX0sci5kcmVmQm94LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt0aGlzLnZlcnNpb249MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTQsdGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlVWludDMyKHRoaXMuZW50cmllcy5sZW5ndGgpO2Zvcih2YXIgZT0wO2U8dGhpcy5lbnRyaWVzLmxlbmd0aDtlKyspdGhpcy5lbnRyaWVzW2VdLndyaXRlKHQpLHRoaXMuc2l6ZSs9dGhpcy5lbnRyaWVzW2VdLnNpemU7aC5kZWJ1ZygiQm94V3JpdGVyIiwiQWRqdXN0aW5nIGJveCAiK3RoaXMudHlwZSsiIHdpdGggbmV3IHNpemUgIit0aGlzLnNpemUpLHQuYWRqdXN0VWludDMyKHRoaXMuc2l6ZVBvc2l0aW9uLHRoaXMuc2l6ZSl9LHIuZWxuZ0JveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMuc2l6ZT10aGlzLmV4dGVuZGVkX2xhbmd1YWdlLmxlbmd0aCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVTdHJpbmcodGhpcy5leHRlbmRlZF9sYW5ndWFnZSl9LHIuZWxzdEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMuc2l6ZT00KzEyKnRoaXMuZW50cmllcy5sZW5ndGgsdGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlVWludDMyKHRoaXMuZW50cmllcy5sZW5ndGgpO2Zvcih2YXIgZT0wO2U8dGhpcy5lbnRyaWVzLmxlbmd0aDtlKyspe3ZhciBpPXRoaXMuZW50cmllc1tlXTt0LndyaXRlVWludDMyKGkuc2VnbWVudF9kdXJhdGlvbiksdC53cml0ZUludDMyKGkubWVkaWFfdGltZSksdC53cml0ZUludDE2KGkubWVkaWFfcmF0ZV9pbnRlZ2VyKSx0LndyaXRlSW50MTYoaS5tZWRpYV9yYXRlX2ZyYWN0aW9uKX19LHIuZW1zZ0JveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMuc2l6ZT00KjQrdGhpcy5tZXNzYWdlX2RhdGEubGVuZ3RoKyh0aGlzLnNjaGVtZV9pZF91cmkubGVuZ3RoKzEpKyh0aGlzLnZhbHVlLmxlbmd0aCsxKSx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVDU3RyaW5nKHRoaXMuc2NoZW1lX2lkX3VyaSksdC53cml0ZUNTdHJpbmcodGhpcy52YWx1ZSksdC53cml0ZVVpbnQzMih0aGlzLnRpbWVzY2FsZSksdC53cml0ZVVpbnQzMih0aGlzLnByZXNlbnRhdGlvbl90aW1lX2RlbHRhKSx0LndyaXRlVWludDMyKHRoaXMuZXZlbnRfZHVyYXRpb24pLHQud3JpdGVVaW50MzIodGhpcy5pZCksdC53cml0ZVVpbnQ4QXJyYXkodGhpcy5tZXNzYWdlX2RhdGEpfSxyLmZ0eXBCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3RoaXMuc2l6ZT04KzQqdGhpcy5jb21wYXRpYmxlX2JyYW5kcy5sZW5ndGgsdGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlU3RyaW5nKHRoaXMubWFqb3JfYnJhbmQsbnVsbCw0KSx0LndyaXRlVWludDMyKHRoaXMubWlub3JfdmVyc2lvbik7Zm9yKHZhciBlPTA7ZTx0aGlzLmNvbXBhdGlibGVfYnJhbmRzLmxlbmd0aDtlKyspdC53cml0ZVN0cmluZyh0aGlzLmNvbXBhdGlibGVfYnJhbmRzW2VdLG51bGwsNCl9LHIuaGRsckJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy5zaXplPTUqNCt0aGlzLm5hbWUubGVuZ3RoKzEsdGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMigwKSx0LndyaXRlU3RyaW5nKHRoaXMuaGFuZGxlcixudWxsLDQpLHQud3JpdGVVaW50MzIoMCksdC53cml0ZVVpbnQzMigwKSx0LndyaXRlVWludDMyKDApLHQud3JpdGVDU3RyaW5nKHRoaXMubmFtZSl9LHIua2luZEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMuc2l6ZT10aGlzLnNjaGVtZVVSSS5sZW5ndGgrMSsodGhpcy52YWx1ZS5sZW5ndGgrMSksdGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlQ1N0cmluZyh0aGlzLnNjaGVtZVVSSSksdC53cml0ZUNTdHJpbmcodGhpcy52YWx1ZSl9LHIubWRoZEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy5zaXplPTQqNCsyKjIsdGhpcy5mbGFncz0wLHRoaXMudmVyc2lvbj0wLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMih0aGlzLmNyZWF0aW9uX3RpbWUpLHQud3JpdGVVaW50MzIodGhpcy5tb2RpZmljYXRpb25fdGltZSksdC53cml0ZVVpbnQzMih0aGlzLnRpbWVzY2FsZSksdC53cml0ZVVpbnQzMih0aGlzLmR1cmF0aW9uKSx0LndyaXRlVWludDE2KHRoaXMubGFuZ3VhZ2UpLHQud3JpdGVVaW50MTYoMCl9LHIubWVoZEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMuc2l6ZT00LHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMih0aGlzLmZyYWdtZW50X2R1cmF0aW9uKX0sci5tZmhkQm94LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt0aGlzLnZlcnNpb249MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTQsdGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlVWludDMyKHRoaXMuc2VxdWVuY2VfbnVtYmVyKX0sci5tdmhkQm94LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt0aGlzLnZlcnNpb249MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTIzKjQrMioyLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMih0aGlzLmNyZWF0aW9uX3RpbWUpLHQud3JpdGVVaW50MzIodGhpcy5tb2RpZmljYXRpb25fdGltZSksdC53cml0ZVVpbnQzMih0aGlzLnRpbWVzY2FsZSksdC53cml0ZVVpbnQzMih0aGlzLmR1cmF0aW9uKSx0LndyaXRlVWludDMyKHRoaXMucmF0ZSksdC53cml0ZVVpbnQxNih0aGlzLnZvbHVtZTw8OCksdC53cml0ZVVpbnQxNigwKSx0LndyaXRlVWludDMyKDApLHQud3JpdGVVaW50MzIoMCksdC53cml0ZVVpbnQzMkFycmF5KHRoaXMubWF0cml4KSx0LndyaXRlVWludDMyKDApLHQud3JpdGVVaW50MzIoMCksdC53cml0ZVVpbnQzMigwKSx0LndyaXRlVWludDMyKDApLHQud3JpdGVVaW50MzIoMCksdC53cml0ZVVpbnQzMigwKSx0LndyaXRlVWludDMyKHRoaXMubmV4dF90cmFja19pZCl9LHIuU2FtcGxlRW50cnkucHJvdG90eXBlLndyaXRlSGVhZGVyPWZ1bmN0aW9uKHQpe3RoaXMuc2l6ZT04LHIuQm94LnByb3RvdHlwZS53cml0ZUhlYWRlci5jYWxsKHRoaXMsdCksdC53cml0ZVVpbnQ4KDApLHQud3JpdGVVaW50OCgwKSx0LndyaXRlVWludDgoMCksdC53cml0ZVVpbnQ4KDApLHQud3JpdGVVaW50OCgwKSx0LndyaXRlVWludDgoMCksdC53cml0ZVVpbnQxNih0aGlzLmRhdGFfcmVmZXJlbmNlX2luZGV4KX0sci5TYW1wbGVFbnRyeS5wcm90b3R5cGUud3JpdGVGb290ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmJveGVzLmxlbmd0aDtlKyspdGhpcy5ib3hlc1tlXS53cml0ZSh0KSx0aGlzLnNpemUrPXRoaXMuYm94ZXNbZV0uc2l6ZTtoLmRlYnVnKCJCb3hXcml0ZXIiLCJBZGp1c3RpbmcgYm94ICIrdGhpcy50eXBlKyIgd2l0aCBuZXcgc2l6ZSAiK3RoaXMuc2l6ZSksdC5hZGp1c3RVaW50MzIodGhpcy5zaXplUG9zaXRpb24sdGhpcy5zaXplKX0sci5TYW1wbGVFbnRyeS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlVWludDhBcnJheSh0aGlzLmRhdGEpLHRoaXMuc2l6ZSs9dGhpcy5kYXRhLmxlbmd0aCxoLmRlYnVnKCJCb3hXcml0ZXIiLCJBZGp1c3RpbmcgYm94ICIrdGhpcy50eXBlKyIgd2l0aCBuZXcgc2l6ZSAiK3RoaXMuc2l6ZSksdC5hZGp1c3RVaW50MzIodGhpcy5zaXplUG9zaXRpb24sdGhpcy5zaXplKX0sci5WaXN1YWxTYW1wbGVFbnRyeS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy53cml0ZUhlYWRlcih0KSx0aGlzLnNpemUrPTIqNys2KjQrMzIsdC53cml0ZVVpbnQxNigwKSx0LndyaXRlVWludDE2KDApLHQud3JpdGVVaW50MzIoMCksdC53cml0ZVVpbnQzMigwKSx0LndyaXRlVWludDMyKDApLHQud3JpdGVVaW50MTYodGhpcy53aWR0aCksdC53cml0ZVVpbnQxNih0aGlzLmhlaWdodCksdC53cml0ZVVpbnQzMih0aGlzLmhvcml6cmVzb2x1dGlvbiksdC53cml0ZVVpbnQzMih0aGlzLnZlcnRyZXNvbHV0aW9uKSx0LndyaXRlVWludDMyKDApLHQud3JpdGVVaW50MTYodGhpcy5mcmFtZV9jb3VudCksdC53cml0ZVVpbnQ4KE1hdGgubWluKDMxLHRoaXMuY29tcHJlc3Nvcm5hbWUubGVuZ3RoKSksdC53cml0ZVN0cmluZyh0aGlzLmNvbXByZXNzb3JuYW1lLG51bGwsMzEpLHQud3JpdGVVaW50MTYodGhpcy5kZXB0aCksdC53cml0ZUludDE2KC0xKSx0aGlzLndyaXRlRm9vdGVyKHQpfSxyLkF1ZGlvU2FtcGxlRW50cnkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3RoaXMud3JpdGVIZWFkZXIodCksdGhpcy5zaXplKz0yKjQrMyo0LHQud3JpdGVVaW50MzIoMCksdC53cml0ZVVpbnQzMigwKSx0LndyaXRlVWludDE2KHRoaXMuY2hhbm5lbF9jb3VudCksdC53cml0ZVVpbnQxNih0aGlzLnNhbXBsZXNpemUpLHQud3JpdGVVaW50MTYoMCksdC53cml0ZVVpbnQxNigwKSx0LndyaXRlVWludDMyKHRoaXMuc2FtcGxlcmF0ZTw8MTYpLHRoaXMud3JpdGVGb290ZXIodCl9LHIuc3RwcFNhbXBsZUVudHJ5LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt0aGlzLndyaXRlSGVhZGVyKHQpLHRoaXMuc2l6ZSs9dGhpcy5uYW1lc3BhY2UubGVuZ3RoKzErdGhpcy5zY2hlbWFfbG9jYXRpb24ubGVuZ3RoKzErdGhpcy5hdXhpbGlhcnlfbWltZV90eXBlcy5sZW5ndGgrMSx0LndyaXRlQ1N0cmluZyh0aGlzLm5hbWVzcGFjZSksdC53cml0ZUNTdHJpbmcodGhpcy5zY2hlbWFfbG9jYXRpb24pLHQud3JpdGVDU3RyaW5nKHRoaXMuYXV4aWxpYXJ5X21pbWVfdHlwZXMpLHRoaXMud3JpdGVGb290ZXIodCl9LHIuU2FtcGxlR3JvdXBFbnRyeS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dC53cml0ZVVpbnQ4QXJyYXkodGhpcy5kYXRhKX0sci5zYmdwQm94LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt0aGlzLnZlcnNpb249MSx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTEyKzgqdGhpcy5lbnRyaWVzLmxlbmd0aCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVTdHJpbmcodGhpcy5ncm91cGluZ190eXBlLG51bGwsNCksdC53cml0ZVVpbnQzMih0aGlzLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyKSx0LndyaXRlVWludDMyKHRoaXMuZW50cmllcy5sZW5ndGgpO2Zvcih2YXIgZT0wO2U8dGhpcy5lbnRyaWVzLmxlbmd0aDtlKyspe3ZhciBpPXRoaXMuZW50cmllc1tlXTt0LndyaXRlSW50MzIoaS5zYW1wbGVfY291bnQpLHQud3JpdGVJbnQzMihpLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4KX19LHIuc2dwZEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGUsaTtmb3IodGhpcy5mbGFncz0wLHRoaXMuc2l6ZT0xMixlPTA7ZTx0aGlzLmVudHJpZXMubGVuZ3RoO2UrKylpPXRoaXMuZW50cmllc1tlXSx0aGlzLnZlcnNpb249PT0xJiYodGhpcy5kZWZhdWx0X2xlbmd0aD09PTAmJih0aGlzLnNpemUrPTQpLHRoaXMuc2l6ZSs9aS5kYXRhLmxlbmd0aCk7Zm9yKHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVN0cmluZyh0aGlzLmdyb3VwaW5nX3R5cGUsbnVsbCw0KSx0aGlzLnZlcnNpb249PT0xJiZ0LndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9sZW5ndGgpLHRoaXMudmVyc2lvbj49MiYmdC53cml0ZVVpbnQzMih0aGlzLmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4KSx0LndyaXRlVWludDMyKHRoaXMuZW50cmllcy5sZW5ndGgpLGU9MDtlPHRoaXMuZW50cmllcy5sZW5ndGg7ZSsrKWk9dGhpcy5lbnRyaWVzW2VdLHRoaXMudmVyc2lvbj09PTEmJnRoaXMuZGVmYXVsdF9sZW5ndGg9PT0wJiZ0LndyaXRlVWludDMyKGkuZGVzY3JpcHRpb25fbGVuZ3RoKSxpLndyaXRlKHQpfSxyLnNpZHhCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3RoaXMudmVyc2lvbj0wLHRoaXMuZmxhZ3M9MCx0aGlzLnNpemU9NCo0KzIrMisxMip0aGlzLnJlZmVyZW5jZXMubGVuZ3RoLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMih0aGlzLnJlZmVyZW5jZV9JRCksdC53cml0ZVVpbnQzMih0aGlzLnRpbWVzY2FsZSksdC53cml0ZVVpbnQzMih0aGlzLmVhcmxpZXN0X3ByZXNlbnRhdGlvbl90aW1lKSx0LndyaXRlVWludDMyKHRoaXMuZmlyc3Rfb2Zmc2V0KSx0LndyaXRlVWludDE2KDApLHQud3JpdGVVaW50MTYodGhpcy5yZWZlcmVuY2VzLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0aGlzLnJlZmVyZW5jZXMubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5yZWZlcmVuY2VzW2VdO3Qud3JpdGVVaW50MzIoaS5yZWZlcmVuY2VfdHlwZTw8MzF8aS5yZWZlcmVuY2VkX3NpemUpLHQud3JpdGVVaW50MzIoaS5zdWJzZWdtZW50X2R1cmF0aW9uKSx0LndyaXRlVWludDMyKGkuc3RhcnRzX3dpdGhfU0FQPDwzMXxpLlNBUF90eXBlPDwyOHxpLlNBUF9kZWx0YV90aW1lKX19LHIuc21oZEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0xLHRoaXMuc2l6ZT00LHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQxNih0aGlzLmJhbGFuY2UpLHQud3JpdGVVaW50MTYoMCl9LHIuc3Rjb0JveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMuc2l6ZT00KzQqdGhpcy5jaHVua19vZmZzZXRzLmxlbmd0aCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MzIodGhpcy5jaHVua19vZmZzZXRzLmxlbmd0aCksdC53cml0ZVVpbnQzMkFycmF5KHRoaXMuY2h1bmtfb2Zmc2V0cyl9LHIuc3RzY0JveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKHRoaXMudmVyc2lvbj0wLHRoaXMuZmxhZ3M9MCx0aGlzLnNpemU9NCsxMip0aGlzLmZpcnN0X2NodW5rLmxlbmd0aCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MzIodGhpcy5maXJzdF9jaHVuay5sZW5ndGgpLGU9MDtlPHRoaXMuZmlyc3RfY2h1bmsubGVuZ3RoO2UrKyl0LndyaXRlVWludDMyKHRoaXMuZmlyc3RfY2h1bmtbZV0pLHQud3JpdGVVaW50MzIodGhpcy5zYW1wbGVzX3Blcl9jaHVua1tlXSksdC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleFtlXSl9LHIuc3RzZEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKHRoaXMudmVyc2lvbj0wLHRoaXMuZmxhZ3M9MCx0aGlzLnNpemU9MCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MzIodGhpcy5lbnRyaWVzLmxlbmd0aCksdGhpcy5zaXplKz00LGU9MDtlPHRoaXMuZW50cmllcy5sZW5ndGg7ZSsrKXRoaXMuZW50cmllc1tlXS53cml0ZSh0KSx0aGlzLnNpemUrPXRoaXMuZW50cmllc1tlXS5zaXplO2guZGVidWcoIkJveFdyaXRlciIsIkFkanVzdGluZyBib3ggIit0aGlzLnR5cGUrIiB3aXRoIG5ldyBzaXplICIrdGhpcy5zaXplKSx0LmFkanVzdFVpbnQzMih0aGlzLnNpemVQb3NpdGlvbix0aGlzLnNpemUpfSxyLnN0c2hCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0aGlzLnZlcnNpb249MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTQrOCp0aGlzLnNoYWRvd2VkX3NhbXBsZV9udW1iZXJzLmxlbmd0aCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MzIodGhpcy5zaGFkb3dlZF9zYW1wbGVfbnVtYmVycy5sZW5ndGgpLGU9MDtlPHRoaXMuc2hhZG93ZWRfc2FtcGxlX251bWJlcnMubGVuZ3RoO2UrKyl0LndyaXRlVWludDMyKHRoaXMuc2hhZG93ZWRfc2FtcGxlX251bWJlcnNbZV0pLHQud3JpdGVVaW50MzIodGhpcy5zeW5jX3NhbXBsZV9udW1iZXJzW2VdKX0sci5zdHNzQm94LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt0aGlzLnZlcnNpb249MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTQrNCp0aGlzLnNhbXBsZV9udW1iZXJzLmxlbmd0aCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MzIodGhpcy5zYW1wbGVfbnVtYmVycy5sZW5ndGgpLHQud3JpdGVVaW50MzJBcnJheSh0aGlzLnNhbXBsZV9udW1iZXJzKX0sci5zdHN6Qm94LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt2YXIgZSxpPSEwO2lmKHRoaXMudmVyc2lvbj0wLHRoaXMuZmxhZ3M9MCx0aGlzLnNhbXBsZV9zaXplcy5sZW5ndGg+MClmb3IoZT0wO2UrMTx0aGlzLnNhbXBsZV9zaXplcy5sZW5ndGg7KWlmKHRoaXMuc2FtcGxlX3NpemVzW2UrMV0hPT10aGlzLnNhbXBsZV9zaXplc1swXSl7aT0hMTticmVha31lbHNlIGUrKztlbHNlIGk9ITE7dGhpcy5zaXplPTgsaXx8KHRoaXMuc2l6ZSs9NCp0aGlzLnNhbXBsZV9zaXplcy5sZW5ndGgpLHRoaXMud3JpdGVIZWFkZXIodCksaT90LndyaXRlVWludDMyKHRoaXMuc2FtcGxlX3NpemVzWzBdKTp0LndyaXRlVWludDMyKDApLHQud3JpdGVVaW50MzIodGhpcy5zYW1wbGVfc2l6ZXMubGVuZ3RoKSxpfHx0LndyaXRlVWludDMyQXJyYXkodGhpcy5zYW1wbGVfc2l6ZXMpfSxyLnN0dHNCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0aGlzLnZlcnNpb249MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTQrOCp0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoLHRoaXMud3JpdGVIZWFkZXIodCksdC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoKSxlPTA7ZTx0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoO2UrKyl0LndyaXRlVWludDMyKHRoaXMuc2FtcGxlX2NvdW50c1tlXSksdC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9kZWx0YXNbZV0pfSxyLnRmZHRCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3ZhciBlPU1hdGgucG93KDIsMzIpLTE7dGhpcy52ZXJzaW9uPXRoaXMuYmFzZU1lZGlhRGVjb2RlVGltZT5lPzE6MCx0aGlzLmZsYWdzPTAsdGhpcy5zaXplPTQsdGhpcy52ZXJzaW9uPT09MSYmKHRoaXMuc2l6ZSs9NCksdGhpcy53cml0ZUhlYWRlcih0KSx0aGlzLnZlcnNpb249PT0xP3Qud3JpdGVVaW50NjQodGhpcy5iYXNlTWVkaWFEZWNvZGVUaW1lKTp0LndyaXRlVWludDMyKHRoaXMuYmFzZU1lZGlhRGVjb2RlVGltZSl9LHIudGZoZEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5zaXplPTQsdGhpcy5mbGFncyZyLlRGSERfRkxBR19CQVNFX0RBVEFfT0ZGU0VUJiYodGhpcy5zaXplKz04KSx0aGlzLmZsYWdzJnIuVEZIRF9GTEFHX1NBTVBMRV9ERVNDJiYodGhpcy5zaXplKz00KSx0aGlzLmZsYWdzJnIuVEZIRF9GTEFHX1NBTVBMRV9EVVImJih0aGlzLnNpemUrPTQpLHRoaXMuZmxhZ3Mmci5URkhEX0ZMQUdfU0FNUExFX1NJWkUmJih0aGlzLnNpemUrPTQpLHRoaXMuZmxhZ3Mmci5URkhEX0ZMQUdfU0FNUExFX0ZMQUdTJiYodGhpcy5zaXplKz00KSx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MzIodGhpcy50cmFja19pZCksdGhpcy5mbGFncyZyLlRGSERfRkxBR19CQVNFX0RBVEFfT0ZGU0VUJiZ0LndyaXRlVWludDY0KHRoaXMuYmFzZV9kYXRhX29mZnNldCksdGhpcy5mbGFncyZyLlRGSERfRkxBR19TQU1QTEVfREVTQyYmdC53cml0ZVVpbnQzMih0aGlzLmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4KSx0aGlzLmZsYWdzJnIuVEZIRF9GTEFHX1NBTVBMRV9EVVImJnQud3JpdGVVaW50MzIodGhpcy5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiksdGhpcy5mbGFncyZyLlRGSERfRkxBR19TQU1QTEVfU0laRSYmdC53cml0ZVVpbnQzMih0aGlzLmRlZmF1bHRfc2FtcGxlX3NpemUpLHRoaXMuZmxhZ3Mmci5URkhEX0ZMQUdfU0FNUExFX0ZMQUdTJiZ0LndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9zYW1wbGVfZmxhZ3MpfSxyLnRraGRCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3RoaXMudmVyc2lvbj0wLHRoaXMuc2l6ZT00KjE4KzIqNCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MzIodGhpcy5jcmVhdGlvbl90aW1lKSx0LndyaXRlVWludDMyKHRoaXMubW9kaWZpY2F0aW9uX3RpbWUpLHQud3JpdGVVaW50MzIodGhpcy50cmFja19pZCksdC53cml0ZVVpbnQzMigwKSx0LndyaXRlVWludDMyKHRoaXMuZHVyYXRpb24pLHQud3JpdGVVaW50MzIoMCksdC53cml0ZVVpbnQzMigwKSx0LndyaXRlSW50MTYodGhpcy5sYXllciksdC53cml0ZUludDE2KHRoaXMuYWx0ZXJuYXRlX2dyb3VwKSx0LndyaXRlSW50MTYodGhpcy52b2x1bWU8PDgpLHQud3JpdGVVaW50MTYoMCksdC53cml0ZUludDMyQXJyYXkodGhpcy5tYXRyaXgpLHQud3JpdGVVaW50MzIodGhpcy53aWR0aCksdC53cml0ZVVpbnQzMih0aGlzLmhlaWdodCl9LHIudHJleEJveC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5mbGFncz0wLHRoaXMuc2l6ZT00KjUsdGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlVWludDMyKHRoaXMudHJhY2tfaWQpLHQud3JpdGVVaW50MzIodGhpcy5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleCksdC53cml0ZVVpbnQzMih0aGlzLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uKSx0LndyaXRlVWludDMyKHRoaXMuZGVmYXVsdF9zYW1wbGVfc2l6ZSksdC53cml0ZVVpbnQzMih0aGlzLmRlZmF1bHRfc2FtcGxlX2ZsYWdzKX0sci50cnVuQm94LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXt0aGlzLnZlcnNpb249MCx0aGlzLnNpemU9NCx0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19EQVRBX09GRlNFVCYmKHRoaXMuc2l6ZSs9NCksdGhpcy5mbGFncyZyLlRSVU5fRkxBR1NfRklSU1RfRkxBRyYmKHRoaXMuc2l6ZSs9NCksdGhpcy5mbGFncyZyLlRSVU5fRkxBR1NfRFVSQVRJT04mJih0aGlzLnNpemUrPTQqdGhpcy5zYW1wbGVfZHVyYXRpb24ubGVuZ3RoKSx0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19TSVpFJiYodGhpcy5zaXplKz00KnRoaXMuc2FtcGxlX3NpemUubGVuZ3RoKSx0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19GTEFHUyYmKHRoaXMuc2l6ZSs9NCp0aGlzLnNhbXBsZV9mbGFncy5sZW5ndGgpLHRoaXMuZmxhZ3Mmci5UUlVOX0ZMQUdTX0NUU19PRkZTRVQmJih0aGlzLnNpemUrPTQqdGhpcy5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQubGVuZ3RoKSx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MzIodGhpcy5zYW1wbGVfY291bnQpLHRoaXMuZmxhZ3Mmci5UUlVOX0ZMQUdTX0RBVEFfT0ZGU0VUJiYodGhpcy5kYXRhX29mZnNldF9wb3NpdGlvbj10LmdldFBvc2l0aW9uKCksdC53cml0ZUludDMyKHRoaXMuZGF0YV9vZmZzZXQpKSx0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19GSVJTVF9GTEFHJiZ0LndyaXRlVWludDMyKHRoaXMuZmlyc3Rfc2FtcGxlX2ZsYWdzKTtmb3IodmFyIGU9MDtlPHRoaXMuc2FtcGxlX2NvdW50O2UrKyl0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19EVVJBVElPTiYmdC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9kdXJhdGlvbltlXSksdGhpcy5mbGFncyZyLlRSVU5fRkxBR1NfU0laRSYmdC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9zaXplW2VdKSx0aGlzLmZsYWdzJnIuVFJVTl9GTEFHU19GTEFHUyYmdC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9mbGFnc1tlXSksdGhpcy5mbGFncyZyLlRSVU5fRkxBR1NfQ1RTX09GRlNFVCYmKHRoaXMudmVyc2lvbj09PTA/dC53cml0ZVVpbnQzMih0aGlzLnNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldFtlXSk6dC53cml0ZUludDMyKHRoaXMuc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0W2VdKSl9LHJbInVybCBCb3giXS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCl7dGhpcy52ZXJzaW9uPTAsdGhpcy5sb2NhdGlvbj8odGhpcy5mbGFncz0wLHRoaXMuc2l6ZT10aGlzLmxvY2F0aW9uLmxlbmd0aCsxKToodGhpcy5mbGFncz0xLHRoaXMuc2l6ZT0wKSx0aGlzLndyaXRlSGVhZGVyKHQpLHRoaXMubG9jYXRpb24mJnQud3JpdGVDU3RyaW5nKHRoaXMubG9jYXRpb24pfSxyWyJ1cm4gQm94Il0ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3RoaXMudmVyc2lvbj0wLHRoaXMuZmxhZ3M9MCx0aGlzLnNpemU9dGhpcy5uYW1lLmxlbmd0aCsxKyh0aGlzLmxvY2F0aW9uP3RoaXMubG9jYXRpb24ubGVuZ3RoKzE6MCksdGhpcy53cml0ZUhlYWRlcih0KSx0LndyaXRlQ1N0cmluZyh0aGlzLm5hbWUpLHRoaXMubG9jYXRpb24mJnQud3JpdGVDU3RyaW5nKHRoaXMubG9jYXRpb24pfSxyLnZtaGRCb3gucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe3RoaXMudmVyc2lvbj0wLHRoaXMuZmxhZ3M9MSx0aGlzLnNpemU9OCx0aGlzLndyaXRlSGVhZGVyKHQpLHQud3JpdGVVaW50MTYodGhpcy5ncmFwaGljc21vZGUpLHQud3JpdGVVaW50MTZBcnJheSh0aGlzLm9wY29sb3IpfSxyLmN0dHNCb3gucHJvdG90eXBlLnVucGFjaz1mdW5jdGlvbih0KXt2YXIgZSxpLHM7Zm9yKHM9MCxlPTA7ZTx0aGlzLnNhbXBsZV9jb3VudHMubGVuZ3RoO2UrKylmb3IoaT0wO2k8dGhpcy5zYW1wbGVfY291bnRzW2VdO2krKyl0W3NdLnB0cz10W3NdLmR0cyt0aGlzLnNhbXBsZV9vZmZzZXRzW2VdLHMrK30sci5zdHRzQm94LnByb3RvdHlwZS51bnBhY2s9ZnVuY3Rpb24odCl7dmFyIGUsaSxzO2ZvcihzPTAsZT0wO2U8dGhpcy5zYW1wbGVfY291bnRzLmxlbmd0aDtlKyspZm9yKGk9MDtpPHRoaXMuc2FtcGxlX2NvdW50c1tlXTtpKyspcz09PTA/dFtzXS5kdHM9MDp0W3NdLmR0cz10W3MtMV0uZHRzK3RoaXMuc2FtcGxlX2RlbHRhc1tlXSxzKyt9LHIuc3Rjb0JveC5wcm90b3R5cGUudW5wYWNrPWZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlPTA7ZTx0aGlzLmNodW5rX29mZnNldHMubGVuZ3RoO2UrKyl0W2VdLm9mZnNldD10aGlzLmNodW5rX29mZnNldHNbZV19LHIuc3RzY0JveC5wcm90b3R5cGUudW5wYWNrPWZ1bmN0aW9uKHQpe3ZhciBlLGkscyxuLGY7Zm9yKG49MCxmPTAsZT0wO2U8dGhpcy5maXJzdF9jaHVuay5sZW5ndGg7ZSsrKWZvcihpPTA7aTwoZSsxPHRoaXMuZmlyc3RfY2h1bmsubGVuZ3RoP3RoaXMuZmlyc3RfY2h1bmtbZSsxXToxLzApO2krKylmb3IoZisrLHM9MDtzPHRoaXMuc2FtcGxlc19wZXJfY2h1bmtbZV07cysrKXtpZih0W25dKXRbbl0uZGVzY3JpcHRpb25faW5kZXg9dGhpcy5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXhbZV0sdFtuXS5jaHVua19pbmRleD1mO2Vsc2UgcmV0dXJuO24rK319LHIuc3RzekJveC5wcm90b3R5cGUudW5wYWNrPWZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlPTA7ZTx0aGlzLnNhbXBsZV9zaXplcy5sZW5ndGg7ZSsrKXRbZV0uc2l6ZT10aGlzLnNhbXBsZV9zaXplc1tlXX0sci5ESUZGX0JPWEVTX1BST1BfTkFNRVM9WyJib3hlcyIsImVudHJpZXMiLCJyZWZlcmVuY2VzIiwic3Vic2FtcGxlcyIsIml0ZW1zIiwiaXRlbV9pbmZvcyIsImV4dGVudHMiLCJhc3NvY2lhdGlvbnMiLCJzdWJzZWdtZW50cyIsInJhbmdlcyIsInNlZWtMaXN0cyIsInNlZWtQb2ludHMiLCJlc2QiLCJsZXZlbHMiXSxyLkRJRkZfUFJJTUlUSVZFX0FSUkFZX1BST1BfTkFNRVM9WyJjb21wYXRpYmxlX2JyYW5kcyIsIm1hdHJpeCIsIm9wY29sb3IiLCJzYW1wbGVfY291bnRzIiwic2FtcGxlX2NvdW50cyIsInNhbXBsZV9kZWx0YXMiLCJmaXJzdF9jaHVuayIsInNhbXBsZXNfcGVyX2NodW5rIiwic2FtcGxlX3NpemVzIiwiY2h1bmtfb2Zmc2V0cyIsInNhbXBsZV9vZmZzZXRzIiwic2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4Iiwic2FtcGxlX2R1cmF0aW9uIl0sci5ib3hFcXVhbEZpZWxkcz1mdW5jdGlvbih0LGUpe2lmKHQmJiFlKXJldHVybiExO3ZhciBpO2ZvcihpIGluIHQpaWYoIShyLkRJRkZfQk9YRVNfUFJPUF9OQU1FUy5pbmRleE9mKGkpPi0xKSl7aWYodFtpXWluc3RhbmNlb2Ygci5Cb3h8fGVbaV1pbnN0YW5jZW9mIHIuQm94KWNvbnRpbnVlO2lmKHR5cGVvZiB0W2ldPiJ1Inx8dHlwZW9mIGVbaV0+InUiKWNvbnRpbnVlO2lmKHR5cGVvZiB0W2ldPT0iZnVuY3Rpb24ifHx0eXBlb2YgZVtpXT09ImZ1bmN0aW9uIiljb250aW51ZTtpZih0LnN1YkJveE5hbWVzJiZ0LnN1YkJveE5hbWVzLmluZGV4T2YoaS5zbGljZSgwLDQpKT4tMXx8ZS5zdWJCb3hOYW1lcyYmZS5zdWJCb3hOYW1lcy5pbmRleE9mKGkuc2xpY2UoMCw0KSk+LTEpY29udGludWU7aWYoaT09PSJkYXRhInx8aT09PSJzdGFydCJ8fGk9PT0ic2l6ZSJ8fGk9PT0iY3JlYXRpb25fdGltZSJ8fGk9PT0ibW9kaWZpY2F0aW9uX3RpbWUiKWNvbnRpbnVlO2lmKHIuRElGRl9QUklNSVRJVkVfQVJSQVlfUFJPUF9OQU1FUy5pbmRleE9mKGkpPi0xKWNvbnRpbnVlO2lmKHRbaV0hPT1lW2ldKXJldHVybiExfXJldHVybiEwfSxyLmJveEVxdWFsPWZ1bmN0aW9uKHQsZSl7aWYoIXIuYm94RXF1YWxGaWVsZHModCxlKSlyZXR1cm4hMTtmb3IodmFyIGk9MDtpPHIuRElGRl9CT1hFU19QUk9QX05BTUVTLmxlbmd0aDtpKyspe3ZhciBzPXIuRElGRl9CT1hFU19QUk9QX05BTUVTW2ldO2lmKHRbc10mJmVbc10mJiFyLmJveEVxdWFsKHRbc10sZVtzXSkpcmV0dXJuITF9cmV0dXJuITB9O3ZhciB5PWZ1bmN0aW9uKCl7fTt5LnByb3RvdHlwZS5wYXJzZVNhbXBsZT1mdW5jdGlvbih0KXt2YXIgZT17fSxpO2UucmVzb3VyY2VzPVtdO3ZhciBzPW5ldyBvKHQuZGF0YS5idWZmZXIpO2lmKCF0LnN1YnNhbXBsZXN8fHQuc3Vic2FtcGxlcy5sZW5ndGg9PT0wKWUuZG9jdW1lbnRTdHJpbmc9cy5yZWFkU3RyaW5nKHQuZGF0YS5sZW5ndGgpO2Vsc2UgaWYoZS5kb2N1bWVudFN0cmluZz1zLnJlYWRTdHJpbmcodC5zdWJzYW1wbGVzWzBdLnNpemUpLHQuc3Vic2FtcGxlcy5sZW5ndGg+MSlmb3IoaT0xO2k8dC5zdWJzYW1wbGVzLmxlbmd0aDtpKyspZS5yZXNvdXJjZXNbaV09cy5yZWFkVWludDhBcnJheSh0LnN1YnNhbXBsZXNbaV0uc2l6ZSk7cmV0dXJuIHR5cGVvZiBET01QYXJzZXI8InUiJiYoZS5kb2N1bWVudD1uZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGUuZG9jdW1lbnRTdHJpbmcsImFwcGxpY2F0aW9uL3htbCIpKSxlfTt2YXIgdj1mdW5jdGlvbigpe307di5wcm90b3R5cGUucGFyc2VTYW1wbGU9ZnVuY3Rpb24odCl7dmFyIGUsaT1uZXcgbyh0LmRhdGEuYnVmZmVyKTtyZXR1cm4gZT1pLnJlYWRTdHJpbmcodC5kYXRhLmxlbmd0aCksZX0sdi5wcm90b3R5cGUucGFyc2VDb25maWc9ZnVuY3Rpb24odCl7dmFyIGUsaT1uZXcgbyh0LmJ1ZmZlcik7cmV0dXJuIGkucmVhZFVpbnQzMigpLGU9aS5yZWFkQ1N0cmluZygpLGV9LEUuWE1MU3VidGl0bGVpbjRQYXJzZXI9eSxFLlRleHRpbjRQYXJzZXI9djt2YXIgdT1mdW5jdGlvbih0KXt0aGlzLnN0cmVhbT10fHxuZXcgbCx0aGlzLmJveGVzPVtdLHRoaXMubWRhdHM9W10sdGhpcy5tb29mcz1bXSx0aGlzLmlzUHJvZ3Jlc3NpdmU9ITEsdGhpcy5tb292U3RhcnRGb3VuZD0hMSx0aGlzLm9uTW9vdlN0YXJ0PW51bGwsdGhpcy5tb292U3RhcnRTZW50PSExLHRoaXMub25SZWFkeT1udWxsLHRoaXMucmVhZHlTZW50PSExLHRoaXMub25TZWdtZW50PW51bGwsdGhpcy5vblNhbXBsZXM9bnVsbCx0aGlzLm9uRXJyb3I9bnVsbCx0aGlzLnNhbXBsZUxpc3RCdWlsdD0hMSx0aGlzLmZyYWdtZW50ZWRUcmFja3M9W10sdGhpcy5leHRyYWN0ZWRUcmFja3M9W10sdGhpcy5pc0ZyYWdtZW50YXRpb25Jbml0aWFsaXplZD0hMSx0aGlzLnNhbXBsZVByb2Nlc3NpbmdTdGFydGVkPSExLHRoaXMubmV4dE1vb2ZOdW1iZXI9MCx0aGlzLml0ZW1MaXN0QnVpbHQ9ITEsdGhpcy5vblNpZHg9bnVsbCx0aGlzLnNpZHhTZW50PSExfTt1LnByb3RvdHlwZS5zZXRTZWdtZW50T3B0aW9ucz1mdW5jdGlvbih0LGUsaSl7dmFyIHM9dGhpcy5nZXRUcmFja0J5SWQodCk7aWYocyl7dmFyIG49e307dGhpcy5mcmFnbWVudGVkVHJhY2tzLnB1c2gobiksbi5pZD10LG4udXNlcj1lLG4udHJhaz1zLHMubmV4dFNhbXBsZT0wLG4uc2VnbWVudFN0cmVhbT1udWxsLG4ubmJfc2FtcGxlcz0xZTMsbi5yYXBBbGlnbmVtZW50PSEwLGkmJihpLm5iU2FtcGxlcyYmKG4ubmJfc2FtcGxlcz1pLm5iU2FtcGxlcyksaS5yYXBBbGlnbmVtZW50JiYobi5yYXBBbGlnbmVtZW50PWkucmFwQWxpZ25lbWVudCkpfX0sdS5wcm90b3R5cGUudW5zZXRTZWdtZW50T3B0aW9ucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9LTEsaT0wO2k8dGhpcy5mcmFnbWVudGVkVHJhY2tzLmxlbmd0aDtpKyspe3ZhciBzPXRoaXMuZnJhZ21lbnRlZFRyYWNrc1tpXTtzLmlkPT10JiYoZT1pKX1lPi0xJiZ0aGlzLmZyYWdtZW50ZWRUcmFja3Muc3BsaWNlKGUsMSl9LHUucHJvdG90eXBlLnNldEV4dHJhY3Rpb25PcHRpb25zPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLmdldFRyYWNrQnlJZCh0KTtpZihzKXt2YXIgbj17fTt0aGlzLmV4dHJhY3RlZFRyYWNrcy5wdXNoKG4pLG4uaWQ9dCxuLnVzZXI9ZSxuLnRyYWs9cyxzLm5leHRTYW1wbGU9MCxuLm5iX3NhbXBsZXM9MWUzLG4uc2FtcGxlcz1bXSxpJiZpLm5iU2FtcGxlcyYmKG4ubmJfc2FtcGxlcz1pLm5iU2FtcGxlcyl9fSx1LnByb3RvdHlwZS51bnNldEV4dHJhY3Rpb25PcHRpb25zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0tMSxpPTA7aTx0aGlzLmV4dHJhY3RlZFRyYWNrcy5sZW5ndGg7aSsrKXt2YXIgcz10aGlzLmV4dHJhY3RlZFRyYWNrc1tpXTtzLmlkPT10JiYoZT1pKX1lPi0xJiZ0aGlzLmV4dHJhY3RlZFRyYWNrcy5zcGxpY2UoZSwxKX0sdS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oKXt2YXIgdCxlLGk9ITE7aWYoISh0aGlzLnJlc3RvcmVQYXJzZVBvc2l0aW9uJiYhdGhpcy5yZXN0b3JlUGFyc2VQb3NpdGlvbigpKSlmb3IoOzspaWYodGhpcy5oYXNJbmNvbXBsZXRlTWRhdCYmdGhpcy5oYXNJbmNvbXBsZXRlTWRhdCgpKXtpZih0aGlzLnByb2Nlc3NJbmNvbXBsZXRlTWRhdCgpKWNvbnRpbnVlO3JldHVybn1lbHNlIGlmKHRoaXMuc2F2ZVBhcnNlUG9zaXRpb24mJnRoaXMuc2F2ZVBhcnNlUG9zaXRpb24oKSx0PXIucGFyc2VPbmVCb3godGhpcy5zdHJlYW0saSksdC5jb2RlPT09ci5FUlJfTk9UX0VOT1VHSF9EQVRBKWlmKHRoaXMucHJvY2Vzc0luY29tcGxldGVCb3gpe2lmKHRoaXMucHJvY2Vzc0luY29tcGxldGVCb3godCkpY29udGludWU7cmV0dXJufWVsc2UgcmV0dXJuO2Vsc2V7dmFyIHM7c3dpdGNoKGU9dC5ib3gscz1lLnR5cGUhPT0idXVpZCI/ZS50eXBlOmUudXVpZCx0aGlzLmJveGVzLnB1c2goZSkscyl7Y2FzZSJtZGF0Ijp0aGlzLm1kYXRzLnB1c2goZSk7YnJlYWs7Y2FzZSJtb29mIjp0aGlzLm1vb2ZzLnB1c2goZSk7YnJlYWs7Y2FzZSJtb292Ijp0aGlzLm1vb3ZTdGFydEZvdW5kPSEwLHRoaXMubWRhdHMubGVuZ3RoPT09MCYmKHRoaXMuaXNQcm9ncmVzc2l2ZT0hMCk7ZGVmYXVsdDp0aGlzW3NdIT09dm9pZCAwJiZoLndhcm4oIklTT0ZpbGUiLCJEdXBsaWNhdGUgQm94IG9mIHR5cGU6ICIrcysiLCBvdmVycmlkaW5nIHByZXZpb3VzIG9jY3VycmVuY2UiKSx0aGlzW3NdPWU7YnJlYWt9dGhpcy51cGRhdGVVc2VkQnl0ZXMmJnRoaXMudXBkYXRlVXNlZEJ5dGVzKGUsdCl9fSx1LnByb3RvdHlwZS5jaGVja0J1ZmZlcj1mdW5jdGlvbih0KXtpZih0PT1udWxsKXRocm93IkJ1ZmZlciBtdXN0IGJlIGRlZmluZWQgYW5kIG5vbiBlbXB0eSI7aWYodC5maWxlU3RhcnQ9PT12b2lkIDApdGhyb3ciQnVmZmVyIG11c3QgaGF2ZSBhIGZpbGVTdGFydCBwcm9wZXJ0eSI7cmV0dXJuIHQuYnl0ZUxlbmd0aD09PTA/KGgud2FybigiSVNPRmlsZSIsIklnbm9yaW5nIGVtcHR5IGJ1ZmZlciAoZmlsZVN0YXJ0OiAiK3QuZmlsZVN0YXJ0KyIpIiksdGhpcy5zdHJlYW0ubG9nQnVmZmVyTGV2ZWwoKSwhMSk6KGguaW5mbygiSVNPRmlsZSIsIlByb2Nlc3NpbmcgYnVmZmVyIChmaWxlU3RhcnQ6ICIrdC5maWxlU3RhcnQrIikiKSx0LnVzZWRCeXRlcz0wLHRoaXMuc3RyZWFtLmluc2VydEJ1ZmZlcih0KSx0aGlzLnN0cmVhbS5sb2dCdWZmZXJMZXZlbCgpLHRoaXMuc3RyZWFtLmluaXRpYWxpemVkKCk/ITA6KGgud2FybigiSVNPRmlsZSIsIk5vdCByZWFkeSB0byBzdGFydCBwYXJzaW5nIiksITEpKX0sdS5wcm90b3R5cGUuYXBwZW5kQnVmZmVyPWZ1bmN0aW9uKHQsZSl7dmFyIGk7aWYodGhpcy5jaGVja0J1ZmZlcih0KSlyZXR1cm4gdGhpcy5wYXJzZSgpLHRoaXMubW9vdlN0YXJ0Rm91bmQmJiF0aGlzLm1vb3ZTdGFydFNlbnQmJih0aGlzLm1vb3ZTdGFydFNlbnQ9ITAsdGhpcy5vbk1vb3ZTdGFydCYmdGhpcy5vbk1vb3ZTdGFydCgpKSx0aGlzLm1vb3Y/KHRoaXMuc2FtcGxlTGlzdEJ1aWx0fHwodGhpcy5idWlsZFNhbXBsZUxpc3RzKCksdGhpcy5zYW1wbGVMaXN0QnVpbHQ9ITApLHRoaXMudXBkYXRlU2FtcGxlTGlzdHMoKSx0aGlzLm9uUmVhZHkmJiF0aGlzLnJlYWR5U2VudCYmKHRoaXMucmVhZHlTZW50PSEwLHRoaXMub25SZWFkeSh0aGlzLmdldEluZm8oKSkpLHRoaXMucHJvY2Vzc1NhbXBsZXMoZSksdGhpcy5uZXh0U2Vla1Bvc2l0aW9uPyhpPXRoaXMubmV4dFNlZWtQb3NpdGlvbix0aGlzLm5leHRTZWVrUG9zaXRpb249dm9pZCAwKTppPXRoaXMubmV4dFBhcnNlUG9zaXRpb24sdGhpcy5zdHJlYW0uZ2V0RW5kRmlsZVBvc2l0aW9uQWZ0ZXImJihpPXRoaXMuc3RyZWFtLmdldEVuZEZpbGVQb3NpdGlvbkFmdGVyKGkpKSk6dGhpcy5uZXh0UGFyc2VQb3NpdGlvbj9pPXRoaXMubmV4dFBhcnNlUG9zaXRpb246aT0wLHRoaXMuc2lkeCYmdGhpcy5vblNpZHgmJiF0aGlzLnNpZHhTZW50JiYodGhpcy5vblNpZHgodGhpcy5zaWR4KSx0aGlzLnNpZHhTZW50PSEwKSx0aGlzLm1ldGEmJih0aGlzLmZsYXR0ZW5JdGVtSW5mbyYmIXRoaXMuaXRlbUxpc3RCdWlsdCYmKHRoaXMuZmxhdHRlbkl0ZW1JbmZvKCksdGhpcy5pdGVtTGlzdEJ1aWx0PSEwKSx0aGlzLnByb2Nlc3NJdGVtcyYmdGhpcy5wcm9jZXNzSXRlbXModGhpcy5vbkl0ZW0pKSx0aGlzLnN0cmVhbS5jbGVhbkJ1ZmZlcnMmJihoLmluZm8oIklTT0ZpbGUiLCJEb25lIHByb2Nlc3NpbmcgYnVmZmVyIChmaWxlU3RhcnQ6ICIrdC5maWxlU3RhcnQrIikgLSBuZXh0IGJ1ZmZlciB0byBmZXRjaCBzaG91bGQgaGF2ZSBhIGZpbGVTdGFydCBwb3NpdGlvbiBvZiAiK2kpLHRoaXMuc3RyZWFtLmxvZ0J1ZmZlckxldmVsKCksdGhpcy5zdHJlYW0uY2xlYW5CdWZmZXJzKCksdGhpcy5zdHJlYW0ubG9nQnVmZmVyTGV2ZWwoITApLGguaW5mbygiSVNPRmlsZSIsIlNhbXBsZSBkYXRhIHNpemUgaW4gbWVtb3J5OiAiK3RoaXMuZ2V0QWxsb2NhdGVkU2FtcGxlRGF0YVNpemUoKSkpLGl9LHUucHJvdG90eXBlLmdldEluZm89ZnVuY3Rpb24oKXt2YXIgdCxlLGk9e30scyxuLGYsZCxjPW5ldyBEYXRlKCIxOTA0LTAxLTAxVDAwOjAwOjAwWiIpLmdldFRpbWUoKTtpZih0aGlzLm1vb3YpZm9yKGkuaGFzTW9vdj0hMCxpLmR1cmF0aW9uPXRoaXMubW9vdi5tdmhkLmR1cmF0aW9uLGkudGltZXNjYWxlPXRoaXMubW9vdi5tdmhkLnRpbWVzY2FsZSxpLmlzRnJhZ21lbnRlZD10aGlzLm1vb3YubXZleCE9bnVsbCxpLmlzRnJhZ21lbnRlZCYmdGhpcy5tb292Lm12ZXgubWVoZCYmKGkuZnJhZ21lbnRfZHVyYXRpb249dGhpcy5tb292Lm12ZXgubWVoZC5mcmFnbWVudF9kdXJhdGlvbiksaS5pc1Byb2dyZXNzaXZlPXRoaXMuaXNQcm9ncmVzc2l2ZSxpLmhhc0lPRD10aGlzLm1vb3YuaW9kcyE9bnVsbCxpLmJyYW5kcz1bXSxpLmJyYW5kcy5wdXNoKHRoaXMuZnR5cC5tYWpvcl9icmFuZCksaS5icmFuZHM9aS5icmFuZHMuY29uY2F0KHRoaXMuZnR5cC5jb21wYXRpYmxlX2JyYW5kcyksaS5jcmVhdGVkPW5ldyBEYXRlKGMrdGhpcy5tb292Lm12aGQuY3JlYXRpb25fdGltZSoxZTMpLGkubW9kaWZpZWQ9bmV3IERhdGUoYyt0aGlzLm1vb3YubXZoZC5tb2RpZmljYXRpb25fdGltZSoxZTMpLGkudHJhY2tzPVtdLGkuYXVkaW9UcmFja3M9W10saS52aWRlb1RyYWNrcz1bXSxpLnN1YnRpdGxlVHJhY2tzPVtdLGkubWV0YWRhdGFUcmFja3M9W10saS5oaW50VHJhY2tzPVtdLGkub3RoZXJUcmFja3M9W10sdD0wO3Q8dGhpcy5tb292LnRyYWtzLmxlbmd0aDt0Kyspe2lmKHM9dGhpcy5tb292LnRyYWtzW3RdLGQ9cy5tZGlhLm1pbmYuc3RibC5zdHNkLmVudHJpZXNbMF0sbj17fSxpLnRyYWNrcy5wdXNoKG4pLG4uaWQ9cy50a2hkLnRyYWNrX2lkLG4ubmFtZT1zLm1kaWEuaGRsci5uYW1lLG4ucmVmZXJlbmNlcz1bXSxzLnRyZWYpZm9yKGU9MDtlPHMudHJlZi5ib3hlcy5sZW5ndGg7ZSsrKWY9e30sbi5yZWZlcmVuY2VzLnB1c2goZiksZi50eXBlPXMudHJlZi5ib3hlc1tlXS50eXBlLGYudHJhY2tfaWRzPXMudHJlZi5ib3hlc1tlXS50cmFja19pZHM7cy5lZHRzJiYobi5lZGl0cz1zLmVkdHMuZWxzdC5lbnRyaWVzKSxuLmNyZWF0ZWQ9bmV3IERhdGUoYytzLnRraGQuY3JlYXRpb25fdGltZSoxZTMpLG4ubW9kaWZpZWQ9bmV3IERhdGUoYytzLnRraGQubW9kaWZpY2F0aW9uX3RpbWUqMWUzKSxuLm1vdmllX2R1cmF0aW9uPXMudGtoZC5kdXJhdGlvbixuLm1vdmllX3RpbWVzY2FsZT1pLnRpbWVzY2FsZSxuLmxheWVyPXMudGtoZC5sYXllcixuLmFsdGVybmF0ZV9ncm91cD1zLnRraGQuYWx0ZXJuYXRlX2dyb3VwLG4udm9sdW1lPXMudGtoZC52b2x1bWUsbi5tYXRyaXg9cy50a2hkLm1hdHJpeCxuLnRyYWNrX3dpZHRoPXMudGtoZC53aWR0aC82NTUzNixuLnRyYWNrX2hlaWdodD1zLnRraGQuaGVpZ2h0LzY1NTM2LG4udGltZXNjYWxlPXMubWRpYS5tZGhkLnRpbWVzY2FsZSxuLmN0c19zaGlmdD1zLm1kaWEubWluZi5zdGJsLmNzbGcsbi5kdXJhdGlvbj1zLm1kaWEubWRoZC5kdXJhdGlvbixuLnNhbXBsZXNfZHVyYXRpb249cy5zYW1wbGVzX2R1cmF0aW9uLG4uY29kZWM9ZC5nZXRDb2RlYygpLG4ua2luZD1zLnVkdGEmJnMudWR0YS5raW5kcy5sZW5ndGg/cy51ZHRhLmtpbmRzWzBdOntzY2hlbWVVUkk6IiIsdmFsdWU6IiJ9LG4ubGFuZ3VhZ2U9cy5tZGlhLmVsbmc/cy5tZGlhLmVsbmcuZXh0ZW5kZWRfbGFuZ3VhZ2U6cy5tZGlhLm1kaGQubGFuZ3VhZ2VTdHJpbmcsbi5uYl9zYW1wbGVzPXMuc2FtcGxlcy5sZW5ndGgsbi5zaXplPXMuc2FtcGxlc19zaXplLG4uYml0cmF0ZT1uLnNpemUqOCpuLnRpbWVzY2FsZS9uLnNhbXBsZXNfZHVyYXRpb24sZC5pc0F1ZGlvKCk/KG4udHlwZT0iYXVkaW8iLGkuYXVkaW9UcmFja3MucHVzaChuKSxuLmF1ZGlvPXt9LG4uYXVkaW8uc2FtcGxlX3JhdGU9ZC5nZXRTYW1wbGVSYXRlKCksbi5hdWRpby5jaGFubmVsX2NvdW50PWQuZ2V0Q2hhbm5lbENvdW50KCksbi5hdWRpby5zYW1wbGVfc2l6ZT1kLmdldFNhbXBsZVNpemUoKSk6ZC5pc1ZpZGVvKCk/KG4udHlwZT0idmlkZW8iLGkudmlkZW9UcmFja3MucHVzaChuKSxuLnZpZGVvPXt9LG4udmlkZW8ud2lkdGg9ZC5nZXRXaWR0aCgpLG4udmlkZW8uaGVpZ2h0PWQuZ2V0SGVpZ2h0KCkpOmQuaXNTdWJ0aXRsZSgpPyhuLnR5cGU9InN1YnRpdGxlcyIsaS5zdWJ0aXRsZVRyYWNrcy5wdXNoKG4pKTpkLmlzSGludCgpPyhuLnR5cGU9Im1ldGFkYXRhIixpLmhpbnRUcmFja3MucHVzaChuKSk6ZC5pc01ldGFkYXRhKCk/KG4udHlwZT0ibWV0YWRhdGEiLGkubWV0YWRhdGFUcmFja3MucHVzaChuKSk6KG4udHlwZT0ibWV0YWRhdGEiLGkub3RoZXJUcmFja3MucHVzaChuKSl9ZWxzZSBpLmhhc01vb3Y9ITE7aWYoaS5taW1lPSIiLGkuaGFzTW9vdiYmaS50cmFja3Mpe2ZvcihpLnZpZGVvVHJhY2tzJiZpLnZpZGVvVHJhY2tzLmxlbmd0aD4wP2kubWltZSs9J3ZpZGVvL21wNDsgY29kZWNzPSInOmkuYXVkaW9UcmFja3MmJmkuYXVkaW9UcmFja3MubGVuZ3RoPjA/aS5taW1lKz0nYXVkaW8vbXA0OyBjb2RlY3M9Iic6aS5taW1lKz0nYXBwbGljYXRpb24vbXA0OyBjb2RlY3M9IicsdD0wO3Q8aS50cmFja3MubGVuZ3RoO3QrKyl0IT09MCYmKGkubWltZSs9IiwiKSxpLm1pbWUrPWkudHJhY2tzW3RdLmNvZGVjO2kubWltZSs9JyI7IHByb2ZpbGVzPSInLGkubWltZSs9dGhpcy5mdHlwLmNvbXBhdGlibGVfYnJhbmRzLmpvaW4oKSxpLm1pbWUrPSciJ31yZXR1cm4gaX0sdS5wcm90b3R5cGUucHJvY2Vzc1NhbXBsZXM9ZnVuY3Rpb24odCl7dmFyIGUsaTtpZih0aGlzLnNhbXBsZVByb2Nlc3NpbmdTdGFydGVkKXtpZih0aGlzLmlzRnJhZ21lbnRhdGlvbkluaXRpYWxpemVkJiZ0aGlzLm9uU2VnbWVudCE9PW51bGwpZm9yKGU9MDtlPHRoaXMuZnJhZ21lbnRlZFRyYWNrcy5sZW5ndGg7ZSsrKXt2YXIgcz10aGlzLmZyYWdtZW50ZWRUcmFja3NbZV07Zm9yKGk9cy50cmFrO2kubmV4dFNhbXBsZTxpLnNhbXBsZXMubGVuZ3RoJiZ0aGlzLnNhbXBsZVByb2Nlc3NpbmdTdGFydGVkOyl7aC5kZWJ1ZygiSVNPRmlsZSIsIkNyZWF0aW5nIG1lZGlhIGZyYWdtZW50IG9uIHRyYWNrICMiK3MuaWQrIiBmb3Igc2FtcGxlICIraS5uZXh0U2FtcGxlKTt2YXIgbj10aGlzLmNyZWF0ZUZyYWdtZW50KHMuaWQsaS5uZXh0U2FtcGxlLHMuc2VnbWVudFN0cmVhbSk7aWYobilzLnNlZ21lbnRTdHJlYW09bixpLm5leHRTYW1wbGUrKztlbHNlIGJyZWFrO2lmKChpLm5leHRTYW1wbGUlcy5uYl9zYW1wbGVzPT09MHx8dHx8aS5uZXh0U2FtcGxlPj1pLnNhbXBsZXMubGVuZ3RoKSYmKGguaW5mbygiSVNPRmlsZSIsIlNlbmRpbmcgZnJhZ21lbnRlZCBkYXRhIG9uIHRyYWNrICMiK3MuaWQrIiBmb3Igc2FtcGxlcyBbIitNYXRoLm1heCgwLGkubmV4dFNhbXBsZS1zLm5iX3NhbXBsZXMpKyIsIisoaS5uZXh0U2FtcGxlLTEpKyJdIiksaC5pbmZvKCJJU09GaWxlIiwiU2FtcGxlIGRhdGEgc2l6ZSBpbiBtZW1vcnk6ICIrdGhpcy5nZXRBbGxvY2F0ZWRTYW1wbGVEYXRhU2l6ZSgpKSx0aGlzLm9uU2VnbWVudCYmdGhpcy5vblNlZ21lbnQocy5pZCxzLnVzZXIscy5zZWdtZW50U3RyZWFtLmJ1ZmZlcixpLm5leHRTYW1wbGUsdHx8aS5uZXh0U2FtcGxlPj1pLnNhbXBsZXMubGVuZ3RoKSxzLnNlZ21lbnRTdHJlYW09bnVsbCxzIT09dGhpcy5mcmFnbWVudGVkVHJhY2tzW2VdKSlicmVha319aWYodGhpcy5vblNhbXBsZXMhPT1udWxsKWZvcihlPTA7ZTx0aGlzLmV4dHJhY3RlZFRyYWNrcy5sZW5ndGg7ZSsrKXt2YXIgZj10aGlzLmV4dHJhY3RlZFRyYWNrc1tlXTtmb3IoaT1mLnRyYWs7aS5uZXh0U2FtcGxlPGkuc2FtcGxlcy5sZW5ndGgmJnRoaXMuc2FtcGxlUHJvY2Vzc2luZ1N0YXJ0ZWQ7KXtoLmRlYnVnKCJJU09GaWxlIiwiRXhwb3J0aW5nIG9uIHRyYWNrICMiK2YuaWQrIiBzYW1wbGUgIyIraS5uZXh0U2FtcGxlKTt2YXIgZD10aGlzLmdldFNhbXBsZShpLGkubmV4dFNhbXBsZSk7aWYoZClpLm5leHRTYW1wbGUrKyxmLnNhbXBsZXMucHVzaChkKTtlbHNlIGJyZWFrO2lmKChpLm5leHRTYW1wbGUlZi5uYl9zYW1wbGVzPT09MHx8aS5uZXh0U2FtcGxlPj1pLnNhbXBsZXMubGVuZ3RoKSYmKGguZGVidWcoIklTT0ZpbGUiLCJTZW5kaW5nIHNhbXBsZXMgb24gdHJhY2sgIyIrZi5pZCsiIGZvciBzYW1wbGUgIitpLm5leHRTYW1wbGUpLHRoaXMub25TYW1wbGVzJiZ0aGlzLm9uU2FtcGxlcyhmLmlkLGYudXNlcixmLnNhbXBsZXMpLGYuc2FtcGxlcz1bXSxmIT09dGhpcy5leHRyYWN0ZWRUcmFja3NbZV0pKWJyZWFrfX19fSx1LnByb3RvdHlwZS5nZXRCb3g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRCb3hlcyh0LCEwKTtyZXR1cm4gZS5sZW5ndGg/ZVswXTpudWxsfSx1LnByb3RvdHlwZS5nZXRCb3hlcz1mdW5jdGlvbih0LGUpe3ZhciBpPVtdO3JldHVybiB1Ll9zd2VlcC5jYWxsKHRoaXMsdCxpLGUpLGl9LHUuX3N3ZWVwPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLnR5cGUmJnRoaXMudHlwZT09dCYmZS5wdXNoKHRoaXMpO2Zvcih2YXIgcyBpbiB0aGlzLmJveGVzKXtpZihlLmxlbmd0aCYmaSlyZXR1cm47dS5fc3dlZXAuY2FsbCh0aGlzLmJveGVzW3NdLHQsZSxpKX19LHUucHJvdG90eXBlLmdldFRyYWNrU2FtcGxlc0luZm89ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRUcmFja0J5SWQodCk7aWYoZSlyZXR1cm4gZS5zYW1wbGVzfSx1LnByb3RvdHlwZS5nZXRUcmFja1NhbXBsZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0VHJhY2tCeUlkKHQpLHM9dGhpcy5nZXRTYW1wbGUoaSxlKTtyZXR1cm4gc30sdS5wcm90b3R5cGUucmVsZWFzZVVzZWRTYW1wbGVzPWZ1bmN0aW9uKHQsZSl7dmFyIGk9MCxzPXRoaXMuZ2V0VHJhY2tCeUlkKHQpO3MubGFzdFZhbGlkU2FtcGxlfHwocy5sYXN0VmFsaWRTYW1wbGU9MCk7Zm9yKHZhciBuPXMubGFzdFZhbGlkU2FtcGxlO248ZTtuKyspaSs9dGhpcy5yZWxlYXNlU2FtcGxlKHMsbik7aC5pbmZvKCJJU09GaWxlIiwiVHJhY2sgIyIrdCsiIHJlbGVhc2VkIHNhbXBsZXMgdXAgdG8gIitlKyIgKHJlbGVhc2VkIHNpemU6ICIraSsiLCByZW1haW5pbmc6ICIrdGhpcy5zYW1wbGVzRGF0YVNpemUrIikiKSxzLmxhc3RWYWxpZFNhbXBsZT1lfSx1LnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3RoaXMuc2FtcGxlUHJvY2Vzc2luZ1N0YXJ0ZWQ9ITAsdGhpcy5wcm9jZXNzU2FtcGxlcyghMSl9LHUucHJvdG90eXBlLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLnNhbXBsZVByb2Nlc3NpbmdTdGFydGVkPSExfSx1LnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbigpe2guaW5mbygiSVNPRmlsZSIsIkZsdXNoaW5nIHJlbWFpbmluZyBzYW1wbGVzIiksdGhpcy51cGRhdGVTYW1wbGVMaXN0cygpLHRoaXMucHJvY2Vzc1NhbXBsZXMoITApLHRoaXMuc3RyZWFtLmNsZWFuQnVmZmVycygpLHRoaXMuc3RyZWFtLmxvZ0J1ZmZlckxldmVsKCEwKX0sdS5wcm90b3R5cGUuc2Vla1RyYWNrPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcyxuLGY9MS8wLGQ9MCxjPTAsbTtpZihpLnNhbXBsZXMubGVuZ3RoPT09MClyZXR1cm4gaC5pbmZvKCJJU09GaWxlIiwiTm8gc2FtcGxlIGluIHRyYWNrLCBjYW5ub3Qgc2VlayEgVXNpbmcgdGltZSAiK2guZ2V0RHVyYXRpb25TdHJpbmcoMCwxKSsiIGFuZCBvZmZzZXQ6IDAiKSx7b2Zmc2V0OjAsdGltZTowfTtmb3Iocz0wO3M8aS5zYW1wbGVzLmxlbmd0aDtzKyspe2lmKG49aS5zYW1wbGVzW3NdLHM9PT0wKWM9MCxtPW4udGltZXNjYWxlO2Vsc2UgaWYobi5jdHM+dCpuLnRpbWVzY2FsZSl7Yz1zLTE7YnJlYWt9ZSYmbi5pc19zeW5jJiYoZD1zKX1mb3IoZSYmKGM9ZCksdD1pLnNhbXBsZXNbY10uY3RzLGkubmV4dFNhbXBsZT1jO2kuc2FtcGxlc1tjXS5hbHJlYWR5UmVhZD09PWkuc2FtcGxlc1tjXS5zaXplJiZpLnNhbXBsZXNbYysxXTspYysrO3JldHVybiBmPWkuc2FtcGxlc1tjXS5vZmZzZXQraS5zYW1wbGVzW2NdLmFscmVhZHlSZWFkLGguaW5mbygiSVNPRmlsZSIsIlNlZWtpbmcgdG8gIisoZT8iUkFQIjoiIikrIiBzYW1wbGUgIyIraS5uZXh0U2FtcGxlKyIgb24gdHJhY2sgIitpLnRraGQudHJhY2tfaWQrIiwgdGltZSAiK2guZ2V0RHVyYXRpb25TdHJpbmcodCxtKSsiIGFuZCBvZmZzZXQ6ICIrZikse29mZnNldDpmLHRpbWU6dC9tfX0sdS5wcm90b3R5cGUuc2Vlaz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMubW9vdixzLG4sZixkPXtvZmZzZXQ6MS8wLHRpbWU6MS8wfTtpZih0aGlzLm1vb3Ype2ZvcihmPTA7ZjxpLnRyYWtzLmxlbmd0aDtmKyspcz1pLnRyYWtzW2ZdLG49dGhpcy5zZWVrVHJhY2sodCxlLHMpLG4ub2Zmc2V0PGQub2Zmc2V0JiYoZC5vZmZzZXQ9bi5vZmZzZXQpLG4udGltZTxkLnRpbWUmJihkLnRpbWU9bi50aW1lKTtyZXR1cm4gaC5pbmZvKCJJU09GaWxlIiwiU2Vla2luZyBhdCB0aW1lICIraC5nZXREdXJhdGlvblN0cmluZyhkLnRpbWUsMSkrIiBuZWVkcyBhIGJ1ZmZlciB3aXRoIGEgZmlsZVN0YXJ0IHBvc2l0aW9uIG9mICIrZC5vZmZzZXQpLGQub2Zmc2V0PT09MS8wP2Q9e29mZnNldDp0aGlzLm5leHRQYXJzZVBvc2l0aW9uLHRpbWU6MH06ZC5vZmZzZXQ9dGhpcy5zdHJlYW0uZ2V0RW5kRmlsZVBvc2l0aW9uQWZ0ZXIoZC5vZmZzZXQpLGguaW5mbygiSVNPRmlsZSIsIkFkanVzdGVkIHNlZWsgcG9zaXRpb24gKGFmdGVyIGNoZWNraW5nIGRhdGEgYWxyZWFkeSBpbiBidWZmZXIpOiAiK2Qub2Zmc2V0KSxkfWVsc2UgdGhyb3ciQ2Fubm90IHNlZWs6IG1vb3Ygbm90IHJlY2VpdmVkISJ9LHUucHJvdG90eXBlLmVxdWFsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5ib3hlcy5sZW5ndGgmJmU8dC5ib3hlcy5sZW5ndGg7KXt2YXIgaT10aGlzLmJveGVzW2VdLHM9dC5ib3hlc1tlXTtpZighci5ib3hFcXVhbChpLHMpKXJldHVybiExO2UrK31yZXR1cm4hMH0sRS5JU09GaWxlPXUsdS5wcm90b3R5cGUubGFzdEJveFN0YXJ0UG9zaXRpb249MCx1LnByb3RvdHlwZS5wYXJzaW5nTWRhdD1udWxsLHUucHJvdG90eXBlLm5leHRQYXJzZVBvc2l0aW9uPTAsdS5wcm90b3R5cGUuZGlzY2FyZE1kYXREYXRhPSExLHUucHJvdG90eXBlLnByb2Nlc3NJbmNvbXBsZXRlQm94PWZ1bmN0aW9uKHQpe3ZhciBlLGkscztyZXR1cm4gdC50eXBlPT09Im1kYXQiPyhlPW5ldyByW3QudHlwZSsiQm94Il0odC5zaXplKSx0aGlzLnBhcnNpbmdNZGF0PWUsdGhpcy5ib3hlcy5wdXNoKGUpLHRoaXMubWRhdHMucHVzaChlKSxlLnN0YXJ0PXQuc3RhcnQsZS5oZHJfc2l6ZT10Lmhkcl9zaXplLHRoaXMuc3RyZWFtLmFkZFVzZWRCeXRlcyhlLmhkcl9zaXplKSx0aGlzLmxhc3RCb3hTdGFydFBvc2l0aW9uPWUuc3RhcnQrZS5zaXplLHM9dGhpcy5zdHJlYW0uc2VlayhlLnN0YXJ0K2Uuc2l6ZSwhMSx0aGlzLmRpc2NhcmRNZGF0RGF0YSkscz8odGhpcy5wYXJzaW5nTWRhdD1udWxsLCEwKToodGhpcy5tb292U3RhcnRGb3VuZD90aGlzLm5leHRQYXJzZVBvc2l0aW9uPXRoaXMuc3RyZWFtLmZpbmRFbmRDb250aWd1b3VzQnVmKCk6dGhpcy5uZXh0UGFyc2VQb3NpdGlvbj1lLnN0YXJ0K2Uuc2l6ZSwhMSkpOih0LnR5cGU9PT0ibW9vdiImJih0aGlzLm1vb3ZTdGFydEZvdW5kPSEwLHRoaXMubWRhdHMubGVuZ3RoPT09MCYmKHRoaXMuaXNQcm9ncmVzc2l2ZT0hMCkpLGk9dGhpcy5zdHJlYW0ubWVyZ2VOZXh0QnVmZmVyP3RoaXMuc3RyZWFtLm1lcmdlTmV4dEJ1ZmZlcigpOiExLGk/KHRoaXMubmV4dFBhcnNlUG9zaXRpb249dGhpcy5zdHJlYW0uZ2V0RW5kUG9zaXRpb24oKSwhMCk6KHQudHlwZT90aGlzLm1vb3ZTdGFydEZvdW5kP3RoaXMubmV4dFBhcnNlUG9zaXRpb249dGhpcy5zdHJlYW0uZ2V0RW5kUG9zaXRpb24oKTp0aGlzLm5leHRQYXJzZVBvc2l0aW9uPXRoaXMuc3RyZWFtLmdldFBvc2l0aW9uKCkrdC5zaXplOnRoaXMubmV4dFBhcnNlUG9zaXRpb249dGhpcy5zdHJlYW0uZ2V0RW5kUG9zaXRpb24oKSwhMSkpfSx1LnByb3RvdHlwZS5oYXNJbmNvbXBsZXRlTWRhdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcnNpbmdNZGF0IT09bnVsbH0sdS5wcm90b3R5cGUucHJvY2Vzc0luY29tcGxldGVNZGF0PWZ1bmN0aW9uKCl7dmFyIHQsZTtyZXR1cm4gdD10aGlzLnBhcnNpbmdNZGF0LGU9dGhpcy5zdHJlYW0uc2Vlayh0LnN0YXJ0K3Quc2l6ZSwhMSx0aGlzLmRpc2NhcmRNZGF0RGF0YSksZT8oaC5kZWJ1ZygiSVNPRmlsZSIsIkZvdW5kICdtZGF0JyBlbmQgaW4gYnVmZmVyZWQgZGF0YSIpLHRoaXMucGFyc2luZ01kYXQ9bnVsbCwhMCk6KHRoaXMubmV4dFBhcnNlUG9zaXRpb249dGhpcy5zdHJlYW0uZmluZEVuZENvbnRpZ3VvdXNCdWYoKSwhMSl9LHUucHJvdG90eXBlLnJlc3RvcmVQYXJzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyZWFtLnNlZWsodGhpcy5sYXN0Qm94U3RhcnRQb3NpdGlvbiwhMCx0aGlzLmRpc2NhcmRNZGF0RGF0YSl9LHUucHJvdG90eXBlLnNhdmVQYXJzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7dGhpcy5sYXN0Qm94U3RhcnRQb3NpdGlvbj10aGlzLnN0cmVhbS5nZXRQb3NpdGlvbigpfSx1LnByb3RvdHlwZS51cGRhdGVVc2VkQnl0ZXM9ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5hZGRVc2VkQnl0ZXMmJih0LnR5cGU9PT0ibWRhdCI/KHRoaXMuc3RyZWFtLmFkZFVzZWRCeXRlcyh0Lmhkcl9zaXplKSx0aGlzLmRpc2NhcmRNZGF0RGF0YSYmdGhpcy5zdHJlYW0uYWRkVXNlZEJ5dGVzKHQuc2l6ZS10Lmhkcl9zaXplKSk6dGhpcy5zdHJlYW0uYWRkVXNlZEJ5dGVzKHQuc2l6ZSkpfSx1LnByb3RvdHlwZS5hZGQ9ci5Cb3gucHJvdG90eXBlLmFkZCx1LnByb3RvdHlwZS5hZGRCb3g9ci5Cb3gucHJvdG90eXBlLmFkZEJveCx1LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQpe3ZhciBlPXR8fHt9O3RoaXMuYWRkKCJmdHlwIikuc2V0KCJtYWpvcl9icmFuZCIsZS5icmFuZHMmJmUuYnJhbmRzWzBdfHwiaXNvNCIpLnNldCgibWlub3JfdmVyc2lvbiIsMCkuc2V0KCJjb21wYXRpYmxlX2JyYW5kcyIsZS5icmFuZHN8fFsiaXNvNCJdKTt2YXIgaT10aGlzLmFkZCgibW9vdiIpO3JldHVybiBpLmFkZCgibXZoZCIpLnNldCgidGltZXNjYWxlIixlLnRpbWVzY2FsZXx8NjAwKS5zZXQoInJhdGUiLGUucmF0ZXx8NjU1MzYpLnNldCgiY3JlYXRpb25fdGltZSIsMCkuc2V0KCJtb2RpZmljYXRpb25fdGltZSIsMCkuc2V0KCJkdXJhdGlvbiIsZS5kdXJhdGlvbnx8MCkuc2V0KCJ2b2x1bWUiLGUud2lkdGg/MDoyNTYpLnNldCgibWF0cml4IixbNjU1MzYsMCwwLDAsNjU1MzYsMCwwLDAsMTA3Mzc0MTgyNF0pLnNldCgibmV4dF90cmFja19pZCIsMSksaS5hZGQoIm12ZXgiKSx0aGlzfSx1LnByb3RvdHlwZS5hZGRUcmFjaz1mdW5jdGlvbih0KXt0aGlzLm1vb3Z8fHRoaXMuaW5pdCh0KTt2YXIgZT10fHx7fTtlLndpZHRoPWUud2lkdGh8fDMyMCxlLmhlaWdodD1lLmhlaWdodHx8MzIwLGUuaWQ9ZS5pZHx8dGhpcy5tb292Lm12aGQubmV4dF90cmFja19pZCxlLnR5cGU9ZS50eXBlfHwiYXZjMSI7dmFyIGk9dGhpcy5tb292LmFkZCgidHJhayIpO3RoaXMubW9vdi5tdmhkLm5leHRfdHJhY2tfaWQ9ZS5pZCsxLGkuYWRkKCJ0a2hkIikuc2V0KCJmbGFncyIsci5US0hEX0ZMQUdfRU5BQkxFRHxyLlRLSERfRkxBR19JTl9NT1ZJRXxyLlRLSERfRkxBR19JTl9QUkVWSUVXKS5zZXQoImNyZWF0aW9uX3RpbWUiLDApLnNldCgibW9kaWZpY2F0aW9uX3RpbWUiLDApLnNldCgidHJhY2tfaWQiLGUuaWQpLnNldCgiZHVyYXRpb24iLGUuZHVyYXRpb258fDApLnNldCgibGF5ZXIiLGUubGF5ZXJ8fDApLnNldCgiYWx0ZXJuYXRlX2dyb3VwIiwwKS5zZXQoInZvbHVtZSIsMSkuc2V0KCJtYXRyaXgiLFswLDAsMCwwLDAsMCwwLDAsMF0pLnNldCgid2lkdGgiLGUud2lkdGg8PDE2KS5zZXQoImhlaWdodCIsZS5oZWlnaHQ8PDE2KTt2YXIgcz1pLmFkZCgibWRpYSIpO3MuYWRkKCJtZGhkIikuc2V0KCJjcmVhdGlvbl90aW1lIiwwKS5zZXQoIm1vZGlmaWNhdGlvbl90aW1lIiwwKS5zZXQoInRpbWVzY2FsZSIsZS50aW1lc2NhbGV8fDEpLnNldCgiZHVyYXRpb24iLGUubWVkaWFfZHVyYXRpb258fDApLnNldCgibGFuZ3VhZ2UiLGUubGFuZ3VhZ2V8fCJ1bmQiKSxzLmFkZCgiaGRsciIpLnNldCgiaGFuZGxlciIsZS5oZGxyfHwidmlkZSIpLnNldCgibmFtZSIsZS5uYW1lfHwiVHJhY2sgY3JlYXRlZCB3aXRoIE1QNEJveC5qcyIpLHMuYWRkKCJlbG5nIikuc2V0KCJleHRlbmRlZF9sYW5ndWFnZSIsZS5sYW5ndWFnZXx8ImZyLUZSIik7dmFyIG49cy5hZGQoIm1pbmYiKTtpZihyW2UudHlwZSsiU2FtcGxlRW50cnkiXSE9PXZvaWQgMCl7dmFyIGY9bmV3IHJbZS50eXBlKyJTYW1wbGVFbnRyeSJdO2YuZGF0YV9yZWZlcmVuY2VfaW5kZXg9MTt2YXIgZD0iIjtmb3IodmFyIGMgaW4gci5zYW1wbGVFbnRyeUNvZGVzKWZvcih2YXIgbT1yLnNhbXBsZUVudHJ5Q29kZXNbY10seD0wO3g8bS5sZW5ndGg7eCsrKWlmKG0uaW5kZXhPZihlLnR5cGUpPi0xKXtkPWM7YnJlYWt9c3dpdGNoKGQpe2Nhc2UiVmlzdWFsIjppZihuLmFkZCgidm1oZCIpLnNldCgiZ3JhcGhpY3Ntb2RlIiwwKS5zZXQoIm9wY29sb3IiLFswLDAsMF0pLGYuc2V0KCJ3aWR0aCIsZS53aWR0aCkuc2V0KCJoZWlnaHQiLGUuaGVpZ2h0KS5zZXQoImhvcml6cmVzb2x1dGlvbiIsNzI8PDE2KS5zZXQoInZlcnRyZXNvbHV0aW9uIiw3Mjw8MTYpLnNldCgiZnJhbWVfY291bnQiLDEpLnNldCgiY29tcHJlc3Nvcm5hbWUiLGUudHlwZSsiIENvbXByZXNzb3IiKS5zZXQoImRlcHRoIiwyNCksZS5hdmNEZWNvZGVyQ29uZmlnUmVjb3JkKXt2YXIgVT1uZXcgci5hdmNDQm94LGI9bmV3IG8oZS5hdmNEZWNvZGVyQ29uZmlnUmVjb3JkKTtVLnBhcnNlKGIpLGYuYWRkQm94KFUpfWJyZWFrO2Nhc2UiQXVkaW8iOm4uYWRkKCJzbWhkIikuc2V0KCJiYWxhbmNlIixlLmJhbGFuY2V8fDApLGYuc2V0KCJjaGFubmVsX2NvdW50IixlLmNoYW5uZWxfY291bnR8fDIpLnNldCgic2FtcGxlc2l6ZSIsZS5zYW1wbGVzaXplfHwxNikuc2V0KCJzYW1wbGVyYXRlIixlLnNhbXBsZXJhdGV8fDY1NTM2KTticmVhaztjYXNlIkhpbnQiOm4uYWRkKCJobWhkIik7YnJlYWs7Y2FzZSJTdWJ0aXRsZSI6c3dpdGNoKG4uYWRkKCJzdGhkIiksZS50eXBlKXtjYXNlInN0cHAiOmYuc2V0KCJuYW1lc3BhY2UiLGUubmFtZXNwYWNlfHwibm9uYW1lc3BhY2UiKS5zZXQoInNjaGVtYV9sb2NhdGlvbiIsZS5zY2hlbWFfbG9jYXRpb258fCIiKS5zZXQoImF1eGlsaWFyeV9taW1lX3R5cGVzIixlLmF1eGlsaWFyeV9taW1lX3R5cGVzfHwiIik7YnJlYWt9YnJlYWs7Y2FzZSJNZXRhZGF0YSI6bi5hZGQoIm5taGQiKTticmVhaztjYXNlIlN5c3RlbSI6bi5hZGQoIm5taGQiKTticmVhaztkZWZhdWx0Om4uYWRkKCJubWhkIik7YnJlYWt9ZS5kZXNjcmlwdGlvbiYmZi5hZGRCb3goZS5kZXNjcmlwdGlvbiksZS5kZXNjcmlwdGlvbl9ib3hlcyYmZS5kZXNjcmlwdGlvbl9ib3hlcy5mb3JFYWNoKGZ1bmN0aW9uKFMpe2YuYWRkQm94KFMpfSksbi5hZGQoImRpbmYiKS5hZGQoImRyZWYiKS5hZGRFbnRyeShuZXcgclsidXJsIEJveCJdKCkuc2V0KCJmbGFncyIsMSkpO3ZhciB3PW4uYWRkKCJzdGJsIik7cmV0dXJuIHcuYWRkKCJzdHNkIikuYWRkRW50cnkoZiksdy5hZGQoInN0dHMiKS5zZXQoInNhbXBsZV9jb3VudHMiLFtdKS5zZXQoInNhbXBsZV9kZWx0YXMiLFtdKSx3LmFkZCgic3RzYyIpLnNldCgiZmlyc3RfY2h1bmsiLFtdKS5zZXQoInNhbXBsZXNfcGVyX2NodW5rIixbXSkuc2V0KCJzYW1wbGVfZGVzY3JpcHRpb25faW5kZXgiLFtdKSx3LmFkZCgic3RjbyIpLnNldCgiY2h1bmtfb2Zmc2V0cyIsW10pLHcuYWRkKCJzdHN6Iikuc2V0KCJzYW1wbGVfc2l6ZXMiLFtdKSx0aGlzLm1vb3YubXZleC5hZGQoInRyZXgiKS5zZXQoInRyYWNrX2lkIixlLmlkKS5zZXQoImRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4IixlLmRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4fHwxKS5zZXQoImRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uIixlLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9ufHwwKS5zZXQoImRlZmF1bHRfc2FtcGxlX3NpemUiLGUuZGVmYXVsdF9zYW1wbGVfc2l6ZXx8MCkuc2V0KCJkZWZhdWx0X3NhbXBsZV9mbGFncyIsZS5kZWZhdWx0X3NhbXBsZV9mbGFnc3x8MCksdGhpcy5idWlsZFRyYWtTYW1wbGVMaXN0cyhpKSxlLmlkfX0sci5Cb3gucHJvdG90eXBlLmNvbXB1dGVTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPXR8fG5ldyBhO2UuZW5kaWFubmVzcz1hLkJJR19FTkRJQU4sdGhpcy53cml0ZShlKX0sdS5wcm90b3R5cGUuYWRkU2FtcGxlPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcz1pfHx7fSxuPXt9LGY9dGhpcy5nZXRUcmFja0J5SWQodCk7aWYoZiE9PW51bGwpe24ubnVtYmVyPWYuc2FtcGxlcy5sZW5ndGgsbi50cmFja19pZD1mLnRraGQudHJhY2tfaWQsbi50aW1lc2NhbGU9Zi5tZGlhLm1kaGQudGltZXNjYWxlLG4uZGVzY3JpcHRpb25faW5kZXg9cy5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg/cy5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgtMTowLG4uZGVzY3JpcHRpb249Zi5tZGlhLm1pbmYuc3RibC5zdHNkLmVudHJpZXNbbi5kZXNjcmlwdGlvbl9pbmRleF0sbi5kYXRhPWUsbi5zaXplPWUuYnl0ZUxlbmd0aCxuLmFscmVhZHlSZWFkPW4uc2l6ZSxuLmR1cmF0aW9uPXMuZHVyYXRpb258fDEsbi5jdHM9cy5jdHN8fDAsbi5kdHM9cy5kdHN8fDAsbi5pc19zeW5jPXMuaXNfc3luY3x8ITEsbi5pc19sZWFkaW5nPXMuaXNfbGVhZGluZ3x8MCxuLmRlcGVuZHNfb249cy5kZXBlbmRzX29ufHwwLG4uaXNfZGVwZW5kZWRfb249cy5pc19kZXBlbmRlZF9vbnx8MCxuLmhhc19yZWR1bmRhbmN5PXMuaGFzX3JlZHVuZGFuY3l8fDAsbi5kZWdyYWRhdGlvbl9wcmlvcml0eT1zLmRlZ3JhZGF0aW9uX3ByaW9yaXR5fHwwLG4ub2Zmc2V0PTAsbi5zdWJzYW1wbGVzPXMuc3Vic2FtcGxlcyxmLnNhbXBsZXMucHVzaChuKSxmLnNhbXBsZXNfc2l6ZSs9bi5zaXplLGYuc2FtcGxlc19kdXJhdGlvbis9bi5kdXJhdGlvbixmLmZpcnN0X2R0c3x8KGYuZmlyc3RfZHRzPXMuZHRzKSx0aGlzLnByb2Nlc3NTYW1wbGVzKCk7dmFyIGQ9dGhpcy5jcmVhdGVTaW5nbGVTYW1wbGVNb29mKG4pO3JldHVybiB0aGlzLmFkZEJveChkKSxkLmNvbXB1dGVTaXplKCksZC50cmFmc1swXS50cnVuc1swXS5kYXRhX29mZnNldD1kLnNpemUrOCx0aGlzLmFkZCgibWRhdCIpLmRhdGE9bmV3IFVpbnQ4QXJyYXkoZSksbn19LHUucHJvdG90eXBlLmNyZWF0ZVNpbmdsZVNhbXBsZU1vb2Y9ZnVuY3Rpb24odCl7dmFyIGU9MDt0LmlzX3N5bmM/ZT0xPDwyNTplPTY1NTM2O3ZhciBpPW5ldyByLm1vb2ZCb3g7aS5hZGQoIm1maGQiKS5zZXQoInNlcXVlbmNlX251bWJlciIsdGhpcy5uZXh0TW9vZk51bWJlciksdGhpcy5uZXh0TW9vZk51bWJlcisrO3ZhciBzPWkuYWRkKCJ0cmFmIiksbj10aGlzLmdldFRyYWNrQnlJZCh0LnRyYWNrX2lkKTtyZXR1cm4gcy5hZGQoInRmaGQiKS5zZXQoInRyYWNrX2lkIix0LnRyYWNrX2lkKS5zZXQoImZsYWdzIixyLlRGSERfRkxBR19ERUZBVUxUX0JBU0VfSVNfTU9PRikscy5hZGQoInRmZHQiKS5zZXQoImJhc2VNZWRpYURlY29kZVRpbWUiLHQuZHRzLShuLmZpcnN0X2R0c3x8MCkpLHMuYWRkKCJ0cnVuIikuc2V0KCJmbGFncyIsci5UUlVOX0ZMQUdTX0RBVEFfT0ZGU0VUfHIuVFJVTl9GTEFHU19EVVJBVElPTnxyLlRSVU5fRkxBR1NfU0laRXxyLlRSVU5fRkxBR1NfRkxBR1N8ci5UUlVOX0ZMQUdTX0NUU19PRkZTRVQpLnNldCgiZGF0YV9vZmZzZXQiLDApLnNldCgiZmlyc3Rfc2FtcGxlX2ZsYWdzIiwwKS5zZXQoInNhbXBsZV9jb3VudCIsMSkuc2V0KCJzYW1wbGVfZHVyYXRpb24iLFt0LmR1cmF0aW9uXSkuc2V0KCJzYW1wbGVfc2l6ZSIsW3Quc2l6ZV0pLnNldCgic2FtcGxlX2ZsYWdzIixbZV0pLnNldCgic2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0IixbdC5jdHMtdC5kdHNdKSxpfSx1LnByb3RvdHlwZS5sYXN0TW9vZkluZGV4PTAsdS5wcm90b3R5cGUuc2FtcGxlc0RhdGFTaXplPTAsdS5wcm90b3R5cGUucmVzZXRUYWJsZXM9ZnVuY3Rpb24oKXt2YXIgdCxlLGkscyxuLGYsZCxjO2Zvcih0aGlzLmluaXRpYWxfZHVyYXRpb249dGhpcy5tb292Lm12aGQuZHVyYXRpb24sdGhpcy5tb292Lm12aGQuZHVyYXRpb249MCx0PTA7dDx0aGlzLm1vb3YudHJha3MubGVuZ3RoO3QrKyl7ZT10aGlzLm1vb3YudHJha3NbdF0sZS50a2hkLmR1cmF0aW9uPTAsZS5tZGlhLm1kaGQuZHVyYXRpb249MCxpPWUubWRpYS5taW5mLnN0Ymwuc3Rjb3x8ZS5tZGlhLm1pbmYuc3RibC5jbzY0LGkuY2h1bmtfb2Zmc2V0cz1bXSxzPWUubWRpYS5taW5mLnN0Ymwuc3RzYyxzLmZpcnN0X2NodW5rPVtdLHMuc2FtcGxlc19wZXJfY2h1bms9W10scy5zYW1wbGVfZGVzY3JpcHRpb25faW5kZXg9W10sbj1lLm1kaWEubWluZi5zdGJsLnN0c3p8fGUubWRpYS5taW5mLnN0Ymwuc3R6MixuLnNhbXBsZV9zaXplcz1bXSxmPWUubWRpYS5taW5mLnN0Ymwuc3R0cyxmLnNhbXBsZV9jb3VudHM9W10sZi5zYW1wbGVfZGVsdGFzPVtdLGQ9ZS5tZGlhLm1pbmYuc3RibC5jdHRzLGQmJihkLnNhbXBsZV9jb3VudHM9W10sZC5zYW1wbGVfb2Zmc2V0cz1bXSksYz1lLm1kaWEubWluZi5zdGJsLnN0c3M7dmFyIG09ZS5tZGlhLm1pbmYuc3RibC5ib3hlcy5pbmRleE9mKGMpO20hPS0xJiYoZS5tZGlhLm1pbmYuc3RibC5ib3hlc1ttXT1udWxsKX19LHUuaW5pdFNhbXBsZUdyb3Vwcz1mdW5jdGlvbih0LGUsaSxzLG4pe3ZhciBmLGQsYyxtO2Z1bmN0aW9uIHgoVSxiLHcpe3RoaXMuZ3JvdXBpbmdfdHlwZT1VLHRoaXMuZ3JvdXBpbmdfdHlwZV9wYXJhbWV0ZXI9Yix0aGlzLnNiZ3A9dyx0aGlzLmxhc3Rfc2FtcGxlX2luX3J1bj0tMSx0aGlzLmVudHJ5X2luZGV4PS0xfWZvcihlJiYoZS5zYW1wbGVfZ3JvdXBzX2luZm89W10pLHQuc2FtcGxlX2dyb3Vwc19pbmZvfHwodC5zYW1wbGVfZ3JvdXBzX2luZm89W10pLGQ9MDtkPGkubGVuZ3RoO2QrKyl7Zm9yKG09aVtkXS5ncm91cGluZ190eXBlKyIvIitpW2RdLmdyb3VwaW5nX3R5cGVfcGFyYW1ldGVyLGM9bmV3IHgoaVtkXS5ncm91cGluZ190eXBlLGlbZF0uZ3JvdXBpbmdfdHlwZV9wYXJhbWV0ZXIsaVtkXSksZSYmKGUuc2FtcGxlX2dyb3Vwc19pbmZvW21dPWMpLHQuc2FtcGxlX2dyb3Vwc19pbmZvW21dfHwodC5zYW1wbGVfZ3JvdXBzX2luZm9bbV09YyksZj0wO2Y8cy5sZW5ndGg7ZisrKXNbZl0uZ3JvdXBpbmdfdHlwZT09PWlbZF0uZ3JvdXBpbmdfdHlwZSYmKGMuZGVzY3JpcHRpb249c1tmXSxjLmRlc2NyaXB0aW9uLnVzZWQ9ITApO2lmKG4pZm9yKGY9MDtmPG4ubGVuZ3RoO2YrKyluW2ZdLmdyb3VwaW5nX3R5cGU9PT1pW2RdLmdyb3VwaW5nX3R5cGUmJihjLmZyYWdtZW50X2Rlc2NyaXB0aW9uPW5bZl0sYy5mcmFnbWVudF9kZXNjcmlwdGlvbi51c2VkPSEwLGMuaXNfZnJhZ21lbnQ9ITApfWlmKGUpe2lmKG4pZm9yKGQ9MDtkPG4ubGVuZ3RoO2QrKykhbltkXS51c2VkJiZuW2RdLnZlcnNpb24+PTImJihtPW5bZF0uZ3JvdXBpbmdfdHlwZSsiLzAiLGM9bmV3IHgobltkXS5ncm91cGluZ190eXBlLDApLGMuaXNfZnJhZ21lbnQ9ITAsZS5zYW1wbGVfZ3JvdXBzX2luZm9bbV18fChlLnNhbXBsZV9ncm91cHNfaW5mb1ttXT1jKSl9ZWxzZSBmb3IoZD0wO2Q8cy5sZW5ndGg7ZCsrKSFzW2RdLnVzZWQmJnNbZF0udmVyc2lvbj49MiYmKG09c1tkXS5ncm91cGluZ190eXBlKyIvMCIsYz1uZXcgeChzW2RdLmdyb3VwaW5nX3R5cGUsMCksdC5zYW1wbGVfZ3JvdXBzX2luZm9bbV18fCh0LnNhbXBsZV9ncm91cHNfaW5mb1ttXT1jKSl9LHUuc2V0U2FtcGxlR3JvdXBQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQsZSxpLHMpe3ZhciBuLGY7ZS5zYW1wbGVfZ3JvdXBzPVtdO2ZvcihuIGluIHMpaWYoZS5zYW1wbGVfZ3JvdXBzW25dPXt9LGUuc2FtcGxlX2dyb3Vwc1tuXS5ncm91cGluZ190eXBlPXNbbl0uZ3JvdXBpbmdfdHlwZSxlLnNhbXBsZV9ncm91cHNbbl0uZ3JvdXBpbmdfdHlwZV9wYXJhbWV0ZXI9c1tuXS5ncm91cGluZ190eXBlX3BhcmFtZXRlcixpPj1zW25dLmxhc3Rfc2FtcGxlX2luX3J1biYmKHNbbl0ubGFzdF9zYW1wbGVfaW5fcnVuPDAmJihzW25dLmxhc3Rfc2FtcGxlX2luX3J1bj0wKSxzW25dLmVudHJ5X2luZGV4Kyssc1tuXS5lbnRyeV9pbmRleDw9c1tuXS5zYmdwLmVudHJpZXMubGVuZ3RoLTEmJihzW25dLmxhc3Rfc2FtcGxlX2luX3J1bis9c1tuXS5zYmdwLmVudHJpZXNbc1tuXS5lbnRyeV9pbmRleF0uc2FtcGxlX2NvdW50KSksc1tuXS5lbnRyeV9pbmRleDw9c1tuXS5zYmdwLmVudHJpZXMubGVuZ3RoLTE/ZS5zYW1wbGVfZ3JvdXBzW25dLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4PXNbbl0uc2JncC5lbnRyaWVzW3Nbbl0uZW50cnlfaW5kZXhdLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4OmUuc2FtcGxlX2dyb3Vwc1tuXS5ncm91cF9kZXNjcmlwdGlvbl9pbmRleD0tMSxlLnNhbXBsZV9ncm91cHNbbl0uZ3JvdXBfZGVzY3JpcHRpb25faW5kZXghPT0wKXt2YXIgZDtzW25dLmZyYWdtZW50X2Rlc2NyaXB0aW9uP2Q9c1tuXS5mcmFnbWVudF9kZXNjcmlwdGlvbjpkPXNbbl0uZGVzY3JpcHRpb24sZS5zYW1wbGVfZ3JvdXBzW25dLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4PjA/KGUuc2FtcGxlX2dyb3Vwc1tuXS5ncm91cF9kZXNjcmlwdGlvbl9pbmRleD42NTUzNT9mPShlLnNhbXBsZV9ncm91cHNbbl0uZ3JvdXBfZGVzY3JpcHRpb25faW5kZXg+PjE2KS0xOmY9ZS5zYW1wbGVfZ3JvdXBzW25dLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4LTEsZCYmZj49MCYmKGUuc2FtcGxlX2dyb3Vwc1tuXS5kZXNjcmlwdGlvbj1kLmVudHJpZXNbZl0pKTpkJiZkLnZlcnNpb24+PTImJmQuZGVmYXVsdF9ncm91cF9kZXNjcmlwdGlvbl9pbmRleD4wJiYoZS5zYW1wbGVfZ3JvdXBzW25dLmRlc2NyaXB0aW9uPWQuZW50cmllc1tkLmRlZmF1bHRfZ3JvdXBfZGVzY3JpcHRpb25faW5kZXgtMV0pfX0sdS5wcm9jZXNzX3NkdHA9ZnVuY3Rpb24odCxlLGkpe2UmJih0PyhlLmlzX2xlYWRpbmc9dC5pc19sZWFkaW5nW2ldLGUuZGVwZW5kc19vbj10LnNhbXBsZV9kZXBlbmRzX29uW2ldLGUuaXNfZGVwZW5kZWRfb249dC5zYW1wbGVfaXNfZGVwZW5kZWRfb25baV0sZS5oYXNfcmVkdW5kYW5jeT10LnNhbXBsZV9oYXNfcmVkdW5kYW5jeVtpXSk6KGUuaXNfbGVhZGluZz0wLGUuZGVwZW5kc19vbj0wLGUuaXNfZGVwZW5kZWRfb249MCxlLmhhc19yZWR1bmRhbmN5PTApKX0sdS5wcm90b3R5cGUuYnVpbGRTYW1wbGVMaXN0cz1mdW5jdGlvbigpe3ZhciB0LGU7Zm9yKHQ9MDt0PHRoaXMubW9vdi50cmFrcy5sZW5ndGg7dCsrKWU9dGhpcy5tb292LnRyYWtzW3RdLHRoaXMuYnVpbGRUcmFrU2FtcGxlTGlzdHMoZSl9LHUucHJvdG90eXBlLmJ1aWxkVHJha1NhbXBsZUxpc3RzPWZ1bmN0aW9uKHQpe3ZhciBlLGkscyxuLGYsZCxjLG0seCxVLGIsdyxTLEYsQix6LEksVCxDLEwsUCxSLGssRDtpZih0LnNhbXBsZXM9W10sdC5zYW1wbGVzX2R1cmF0aW9uPTAsdC5zYW1wbGVzX3NpemU9MCxpPXQubWRpYS5taW5mLnN0Ymwuc3Rjb3x8dC5tZGlhLm1pbmYuc3RibC5jbzY0LHM9dC5tZGlhLm1pbmYuc3RibC5zdHNjLG49dC5tZGlhLm1pbmYuc3RibC5zdHN6fHx0Lm1kaWEubWluZi5zdGJsLnN0ejIsZj10Lm1kaWEubWluZi5zdGJsLnN0dHMsZD10Lm1kaWEubWluZi5zdGJsLmN0dHMsYz10Lm1kaWEubWluZi5zdGJsLnN0c3MsbT10Lm1kaWEubWluZi5zdGJsLnN0c2QseD10Lm1kaWEubWluZi5zdGJsLnN1YnMsdz10Lm1kaWEubWluZi5zdGJsLnN0ZHAsVT10Lm1kaWEubWluZi5zdGJsLnNiZ3BzLGI9dC5tZGlhLm1pbmYuc3RibC5zZ3BkcyxUPS0xLEM9LTEsTD0tMSxQPS0xLFI9MCxrPTAsRD0wLHUuaW5pdFNhbXBsZUdyb3Vwcyh0LG51bGwsVSxiKSwhKHR5cGVvZiBuPiJ1Iikpe2ZvcihlPTA7ZTxuLnNhbXBsZV9zaXplcy5sZW5ndGg7ZSsrKXt2YXIgQT17fTtBLm51bWJlcj1lLEEudHJhY2tfaWQ9dC50a2hkLnRyYWNrX2lkLEEudGltZXNjYWxlPXQubWRpYS5tZGhkLnRpbWVzY2FsZSxBLmFscmVhZHlSZWFkPTAsdC5zYW1wbGVzW2VdPUEsQS5zaXplPW4uc2FtcGxlX3NpemVzW2VdLHQuc2FtcGxlc19zaXplKz1BLnNpemUsZT09PTA/KEY9MSxTPTAsQS5jaHVua19pbmRleD1GLEEuY2h1bmtfcnVuX2luZGV4PVMsST1zLnNhbXBsZXNfcGVyX2NodW5rW1NdLHo9MCxTKzE8cy5maXJzdF9jaHVuay5sZW5ndGg/Qj1zLmZpcnN0X2NodW5rW1MrMV0tMTpCPTEvMCk6ZTxJPyhBLmNodW5rX2luZGV4PUYsQS5jaHVua19ydW5faW5kZXg9Uyk6KEYrKyxBLmNodW5rX2luZGV4PUYsej0wLEY8PUJ8fChTKyssUysxPHMuZmlyc3RfY2h1bmsubGVuZ3RoP0I9cy5maXJzdF9jaHVua1tTKzFdLTE6Qj0xLzApLEEuY2h1bmtfcnVuX2luZGV4PVMsSSs9cy5zYW1wbGVzX3Blcl9jaHVua1tTXSksQS5kZXNjcmlwdGlvbl9pbmRleD1zLnNhbXBsZV9kZXNjcmlwdGlvbl9pbmRleFtBLmNodW5rX3J1bl9pbmRleF0tMSxBLmRlc2NyaXB0aW9uPW0uZW50cmllc1tBLmRlc2NyaXB0aW9uX2luZGV4XSxBLm9mZnNldD1pLmNodW5rX29mZnNldHNbQS5jaHVua19pbmRleC0xXSt6LHorPUEuc2l6ZSxlPlQmJihDKyssVDwwJiYoVD0wKSxUKz1mLnNhbXBsZV9jb3VudHNbQ10pLGU+MD8odC5zYW1wbGVzW2UtMV0uZHVyYXRpb249Zi5zYW1wbGVfZGVsdGFzW0NdLHQuc2FtcGxlc19kdXJhdGlvbis9dC5zYW1wbGVzW2UtMV0uZHVyYXRpb24sQS5kdHM9dC5zYW1wbGVzW2UtMV0uZHRzK3Quc2FtcGxlc1tlLTFdLmR1cmF0aW9uKTpBLmR0cz0wLGQ/KGU+PUwmJihQKyssTDwwJiYoTD0wKSxMKz1kLnNhbXBsZV9jb3VudHNbUF0pLEEuY3RzPXQuc2FtcGxlc1tlXS5kdHMrZC5zYW1wbGVfb2Zmc2V0c1tQXSk6QS5jdHM9QS5kdHMsYz8oZT09Yy5zYW1wbGVfbnVtYmVyc1tSXS0xPyhBLmlzX3N5bmM9ITAsUisrKTooQS5pc19zeW5jPSExLEEuZGVncmFkYXRpb25fcHJpb3JpdHk9MCkseCYmeC5lbnRyaWVzW2tdLnNhbXBsZV9kZWx0YStEPT1lKzEmJihBLnN1YnNhbXBsZXM9eC5lbnRyaWVzW2tdLnN1YnNhbXBsZXMsRCs9eC5lbnRyaWVzW2tdLnNhbXBsZV9kZWx0YSxrKyspKTpBLmlzX3N5bmM9ITAsdS5wcm9jZXNzX3NkdHAodC5tZGlhLm1pbmYuc3RibC5zZHRwLEEsQS5udW1iZXIpLHc/QS5kZWdyYWRhdGlvbl9wcmlvcml0eT13LnByaW9yaXR5W2VdOkEuZGVncmFkYXRpb25fcHJpb3JpdHk9MCx4JiZ4LmVudHJpZXNba10uc2FtcGxlX2RlbHRhK0Q9PWUmJihBLnN1YnNhbXBsZXM9eC5lbnRyaWVzW2tdLnN1YnNhbXBsZXMsRCs9eC5lbnRyaWVzW2tdLnNhbXBsZV9kZWx0YSksKFUubGVuZ3RoPjB8fGIubGVuZ3RoPjApJiZ1LnNldFNhbXBsZUdyb3VwUHJvcGVydGllcyh0LEEsZSx0LnNhbXBsZV9ncm91cHNfaW5mbyl9ZT4wJiYodC5zYW1wbGVzW2UtMV0uZHVyYXRpb249TWF0aC5tYXgodC5tZGlhLm1kaGQuZHVyYXRpb24tdC5zYW1wbGVzW2UtMV0uZHRzLDApLHQuc2FtcGxlc19kdXJhdGlvbis9dC5zYW1wbGVzW2UtMV0uZHVyYXRpb24pfX0sdS5wcm90b3R5cGUudXBkYXRlU2FtcGxlTGlzdHM9ZnVuY3Rpb24oKXt2YXIgdCxlLGkscyxuLGYsZCxjLG0seCxVLGIsdyxTLEY7aWYodGhpcy5tb292IT09dm9pZCAwKXtmb3IoO3RoaXMubGFzdE1vb2ZJbmRleDx0aGlzLm1vb2ZzLmxlbmd0aDspaWYobT10aGlzLm1vb2ZzW3RoaXMubGFzdE1vb2ZJbmRleF0sdGhpcy5sYXN0TW9vZkluZGV4KyssbS50eXBlPT0ibW9vZiIpZm9yKHg9bSx0PTA7dDx4LnRyYWZzLmxlbmd0aDt0Kyspe2ZvcihVPXgudHJhZnNbdF0sYj10aGlzLmdldFRyYWNrQnlJZChVLnRmaGQudHJhY2tfaWQpLHc9dGhpcy5nZXRUcmV4QnlJZChVLnRmaGQudHJhY2tfaWQpLFUudGZoZC5mbGFncyZyLlRGSERfRkxBR19TQU1QTEVfREVTQz9zPVUudGZoZC5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleDpzPXc/dy5kZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleDoxLFUudGZoZC5mbGFncyZyLlRGSERfRkxBR19TQU1QTEVfRFVSP249VS50ZmhkLmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOm49dz93LmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOjAsVS50ZmhkLmZsYWdzJnIuVEZIRF9GTEFHX1NBTVBMRV9TSVpFP2Y9VS50ZmhkLmRlZmF1bHRfc2FtcGxlX3NpemU6Zj13P3cuZGVmYXVsdF9zYW1wbGVfc2l6ZTowLFUudGZoZC5mbGFncyZyLlRGSERfRkxBR19TQU1QTEVfRkxBR1M/ZD1VLnRmaGQuZGVmYXVsdF9zYW1wbGVfZmxhZ3M6ZD13P3cuZGVmYXVsdF9zYW1wbGVfZmxhZ3M6MCxVLnNhbXBsZV9udW1iZXI9MCxVLnNiZ3BzLmxlbmd0aD4wJiZ1LmluaXRTYW1wbGVHcm91cHMoYixVLFUuc2JncHMsYi5tZGlhLm1pbmYuc3RibC5zZ3BkcyxVLnNncGRzKSxlPTA7ZTxVLnRydW5zLmxlbmd0aDtlKyspe3ZhciBCPVUudHJ1bnNbZV07Zm9yKGk9MDtpPEIuc2FtcGxlX2NvdW50O2krKyl7Uz17fSxTLm1vb2ZfbnVtYmVyPXRoaXMubGFzdE1vb2ZJbmRleCxTLm51bWJlcl9pbl90cmFmPVUuc2FtcGxlX251bWJlcixVLnNhbXBsZV9udW1iZXIrKyxTLm51bWJlcj1iLnNhbXBsZXMubGVuZ3RoLFUuZmlyc3Rfc2FtcGxlX2luZGV4PWIuc2FtcGxlcy5sZW5ndGgsYi5zYW1wbGVzLnB1c2goUyksUy50cmFja19pZD1iLnRraGQudHJhY2tfaWQsUy50aW1lc2NhbGU9Yi5tZGlhLm1kaGQudGltZXNjYWxlLFMuZGVzY3JpcHRpb25faW5kZXg9cy0xLFMuZGVzY3JpcHRpb249Yi5tZGlhLm1pbmYuc3RibC5zdHNkLmVudHJpZXNbUy5kZXNjcmlwdGlvbl9pbmRleF0sUy5zaXplPWYsQi5mbGFncyZyLlRSVU5fRkxBR1NfU0laRSYmKFMuc2l6ZT1CLnNhbXBsZV9zaXplW2ldKSxiLnNhbXBsZXNfc2l6ZSs9Uy5zaXplLFMuZHVyYXRpb249bixCLmZsYWdzJnIuVFJVTl9GTEFHU19EVVJBVElPTiYmKFMuZHVyYXRpb249Qi5zYW1wbGVfZHVyYXRpb25baV0pLGIuc2FtcGxlc19kdXJhdGlvbis9Uy5kdXJhdGlvbixiLmZpcnN0X3RyYWZfbWVyZ2VkfHxpPjA/Uy5kdHM9Yi5zYW1wbGVzW2Iuc2FtcGxlcy5sZW5ndGgtMl0uZHRzK2Iuc2FtcGxlc1tiLnNhbXBsZXMubGVuZ3RoLTJdLmR1cmF0aW9uOihVLnRmZHQ/Uy5kdHM9VS50ZmR0LmJhc2VNZWRpYURlY29kZVRpbWU6Uy5kdHM9MCxiLmZpcnN0X3RyYWZfbWVyZ2VkPSEwKSxTLmN0cz1TLmR0cyxCLmZsYWdzJnIuVFJVTl9GTEFHU19DVFNfT0ZGU0VUJiYoUy5jdHM9Uy5kdHMrQi5zYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRbaV0pLEY9ZCxCLmZsYWdzJnIuVFJVTl9GTEFHU19GTEFHUz9GPUIuc2FtcGxlX2ZsYWdzW2ldOmk9PT0wJiZCLmZsYWdzJnIuVFJVTl9GTEFHU19GSVJTVF9GTEFHJiYoRj1CLmZpcnN0X3NhbXBsZV9mbGFncyksUy5pc19zeW5jPSEoRj4+MTYmMSksUy5pc19sZWFkaW5nPUY+PjI2JjMsUy5kZXBlbmRzX29uPUY+PjI0JjMsUy5pc19kZXBlbmRlZF9vbj1GPj4yMiYzLFMuaGFzX3JlZHVuZGFuY3k9Rj4+MjAmMyxTLmRlZ3JhZGF0aW9uX3ByaW9yaXR5PUYmNjU1MzU7dmFyIHo9ISEoVS50ZmhkLmZsYWdzJnIuVEZIRF9GTEFHX0JBU0VfREFUQV9PRkZTRVQpLEk9ISEoVS50ZmhkLmZsYWdzJnIuVEZIRF9GTEFHX0RFRkFVTFRfQkFTRV9JU19NT09GKSxUPSEhKEIuZmxhZ3Mmci5UUlVOX0ZMQUdTX0RBVEFfT0ZGU0VUKSxDPTA7ej9DPVUudGZoZC5iYXNlX2RhdGFfb2Zmc2V0Okl8fGU9PT0wP0M9eC5zdGFydDpDPWMsZT09PTAmJmk9PT0wP1Q/Uy5vZmZzZXQ9QytCLmRhdGFfb2Zmc2V0OlMub2Zmc2V0PUM6Uy5vZmZzZXQ9YyxjPVMub2Zmc2V0K1Muc2l6ZSwoVS5zYmdwcy5sZW5ndGg+MHx8VS5zZ3Bkcy5sZW5ndGg+MHx8Yi5tZGlhLm1pbmYuc3RibC5zYmdwcy5sZW5ndGg+MHx8Yi5tZGlhLm1pbmYuc3RibC5zZ3Bkcy5sZW5ndGg+MCkmJnUuc2V0U2FtcGxlR3JvdXBQcm9wZXJ0aWVzKGIsUyxTLm51bWJlcl9pbl90cmFmLFUuc2FtcGxlX2dyb3Vwc19pbmZvKX19aWYoVS5zdWJzKXtiLmhhc19mcmFnbWVudF9zdWJzYW1wbGVzPSEwO3ZhciBMPVUuZmlyc3Rfc2FtcGxlX2luZGV4O2ZvcihlPTA7ZTxVLnN1YnMuZW50cmllcy5sZW5ndGg7ZSsrKUwrPVUuc3Vicy5lbnRyaWVzW2VdLnNhbXBsZV9kZWx0YSxTPWIuc2FtcGxlc1tMLTFdLFMuc3Vic2FtcGxlcz1VLnN1YnMuZW50cmllc1tlXS5zdWJzYW1wbGVzfX19fSx1LnByb3RvdHlwZS5nZXRTYW1wbGU9ZnVuY3Rpb24odCxlKXt2YXIgaSxzPXQuc2FtcGxlc1tlXTtpZighdGhpcy5tb292KXJldHVybiBudWxsO2lmKCFzLmRhdGEpcy5kYXRhPW5ldyBVaW50OEFycmF5KHMuc2l6ZSkscy5hbHJlYWR5UmVhZD0wLHRoaXMuc2FtcGxlc0RhdGFTaXplKz1zLnNpemUsaC5kZWJ1ZygiSVNPRmlsZSIsIkFsbG9jYXRpbmcgc2FtcGxlICMiK2UrIiBvbiB0cmFjayAjIit0LnRraGQudHJhY2tfaWQrIiBvZiBzaXplICIrcy5zaXplKyIgKHRvdGFsOiAiK3RoaXMuc2FtcGxlc0RhdGFTaXplKyIpIik7ZWxzZSBpZihzLmFscmVhZHlSZWFkPT1zLnNpemUpcmV0dXJuIHM7Zm9yKDs7KXt2YXIgbj10aGlzLnN0cmVhbS5maW5kUG9zaXRpb24oITAscy5vZmZzZXQrcy5hbHJlYWR5UmVhZCwhMSk7aWYobj4tMSl7aT10aGlzLnN0cmVhbS5idWZmZXJzW25dO3ZhciBmPWkuYnl0ZUxlbmd0aC0ocy5vZmZzZXQrcy5hbHJlYWR5UmVhZC1pLmZpbGVTdGFydCk7aWYocy5zaXplLXMuYWxyZWFkeVJlYWQ8PWYpcmV0dXJuIGguZGVidWcoIklTT0ZpbGUiLCJHZXR0aW5nIHNhbXBsZSAjIitlKyIgZGF0YSAoYWxyZWFkeVJlYWQ6ICIrcy5hbHJlYWR5UmVhZCsiIG9mZnNldDogIisocy5vZmZzZXQrcy5hbHJlYWR5UmVhZC1pLmZpbGVTdGFydCkrIiByZWFkIHNpemU6ICIrKHMuc2l6ZS1zLmFscmVhZHlSZWFkKSsiIGZ1bGwgc2l6ZTogIitzLnNpemUrIikiKSxhLm1lbWNweShzLmRhdGEuYnVmZmVyLHMuYWxyZWFkeVJlYWQsaSxzLm9mZnNldCtzLmFscmVhZHlSZWFkLWkuZmlsZVN0YXJ0LHMuc2l6ZS1zLmFscmVhZHlSZWFkKSxpLnVzZWRCeXRlcys9cy5zaXplLXMuYWxyZWFkeVJlYWQsdGhpcy5zdHJlYW0ubG9nQnVmZmVyTGV2ZWwoKSxzLmFscmVhZHlSZWFkPXMuc2l6ZSxzO2lmKGY9PT0wKXJldHVybiBudWxsO2guZGVidWcoIklTT0ZpbGUiLCJHZXR0aW5nIHNhbXBsZSAjIitlKyIgcGFydGlhbCBkYXRhIChhbHJlYWR5UmVhZDogIitzLmFscmVhZHlSZWFkKyIgb2Zmc2V0OiAiKyhzLm9mZnNldCtzLmFscmVhZHlSZWFkLWkuZmlsZVN0YXJ0KSsiIHJlYWQgc2l6ZTogIitmKyIgZnVsbCBzaXplOiAiK3Muc2l6ZSsiKSIpLGEubWVtY3B5KHMuZGF0YS5idWZmZXIscy5hbHJlYWR5UmVhZCxpLHMub2Zmc2V0K3MuYWxyZWFkeVJlYWQtaS5maWxlU3RhcnQsZikscy5hbHJlYWR5UmVhZCs9ZixpLnVzZWRCeXRlcys9Zix0aGlzLnN0cmVhbS5sb2dCdWZmZXJMZXZlbCgpfWVsc2UgcmV0dXJuIG51bGx9fSx1LnByb3RvdHlwZS5yZWxlYXNlU2FtcGxlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5zYW1wbGVzW2VdO3JldHVybiBpLmRhdGE/KHRoaXMuc2FtcGxlc0RhdGFTaXplLT1pLnNpemUsaS5kYXRhPW51bGwsaS5hbHJlYWR5UmVhZD0wLGkuc2l6ZSk6MH0sdS5wcm90b3R5cGUuZ2V0QWxsb2NhdGVkU2FtcGxlRGF0YVNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYW1wbGVzRGF0YVNpemV9LHUucHJvdG90eXBlLmdldENvZGVjcz1mdW5jdGlvbigpe3ZhciB0LGU9IiI7Zm9yKHQ9MDt0PHRoaXMubW9vdi50cmFrcy5sZW5ndGg7dCsrKXt2YXIgaT10aGlzLm1vb3YudHJha3NbdF07dD4wJiYoZSs9IiwiKSxlKz1pLm1kaWEubWluZi5zdGJsLnN0c2QuZW50cmllc1swXS5nZXRDb2RlYygpfXJldHVybiBlfSx1LnByb3RvdHlwZS5nZXRUcmV4QnlJZD1mdW5jdGlvbih0KXt2YXIgZTtpZighdGhpcy5tb292fHwhdGhpcy5tb292Lm12ZXgpcmV0dXJuIG51bGw7Zm9yKGU9MDtlPHRoaXMubW9vdi5tdmV4LnRyZXhzLmxlbmd0aDtlKyspe3ZhciBpPXRoaXMubW9vdi5tdmV4LnRyZXhzW2VdO2lmKGkudHJhY2tfaWQ9PXQpcmV0dXJuIGl9cmV0dXJuIG51bGx9LHUucHJvdG90eXBlLmdldFRyYWNrQnlJZD1mdW5jdGlvbih0KXtpZih0aGlzLm1vb3Y9PT12b2lkIDApcmV0dXJuIG51bGw7Zm9yKHZhciBlPTA7ZTx0aGlzLm1vb3YudHJha3MubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5tb292LnRyYWtzW2VdO2lmKGkudGtoZC50cmFja19pZD09dClyZXR1cm4gaX1yZXR1cm4gbnVsbH0sdS5wcm90b3R5cGUuaXRlbXM9W10sdS5wcm90b3R5cGUuaXRlbXNEYXRhU2l6ZT0wLHUucHJvdG90eXBlLmZsYXR0ZW5JdGVtSW5mbz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaXRlbXMsZSxpLHMsbj10aGlzLm1ldGE7aWYobiE9bnVsbCYmbi5oZGxyIT09dm9pZCAwJiZuLmlpbmYhPT12b2lkIDApe2ZvcihlPTA7ZTxuLmlpbmYuaXRlbV9pbmZvcy5sZW5ndGg7ZSsrKXM9e30scy5pZD1uLmlpbmYuaXRlbV9pbmZvc1tlXS5pdGVtX0lELHRbcy5pZF09cyxzLnJlZl90bz1bXSxzLm5hbWU9bi5paW5mLml0ZW1faW5mb3NbZV0uaXRlbV9uYW1lLG4uaWluZi5pdGVtX2luZm9zW2VdLnByb3RlY3Rpb25faW5kZXg+MCYmKHMucHJvdGVjdGlvbj1uLmlwcm8ucHJvdGVjdGlvbnNbbi5paW5mLml0ZW1faW5mb3NbZV0ucHJvdGVjdGlvbl9pbmRleC0xXSksbi5paW5mLml0ZW1faW5mb3NbZV0uaXRlbV90eXBlP3MudHlwZT1uLmlpbmYuaXRlbV9pbmZvc1tlXS5pdGVtX3R5cGU6cy50eXBlPSJtaW1lIixzLmNvbnRlbnRfdHlwZT1uLmlpbmYuaXRlbV9pbmZvc1tlXS5jb250ZW50X3R5cGUscy5jb250ZW50X2VuY29kaW5nPW4uaWluZi5pdGVtX2luZm9zW2VdLmNvbnRlbnRfZW5jb2Rpbmc7aWYobi5pbG9jKWZvcihlPTA7ZTxuLmlsb2MuaXRlbXMubGVuZ3RoO2UrKyl7dmFyIGY9bi5pbG9jLml0ZW1zW2VdO3N3aXRjaChzPXRbZi5pdGVtX0lEXSxmLmRhdGFfcmVmZXJlbmNlX2luZGV4IT09MCYmKGgud2FybigiSXRlbSBzdG9yYWdlIHdpdGggcmVmZXJlbmNlIHRvIG90aGVyIGZpbGVzOiBub3Qgc3VwcG9ydGVkIikscy5zb3VyY2U9bi5kaW5mLmJveGVzW2YuZGF0YV9yZWZlcmVuY2VfaW5kZXgtMV0pLGYuY29uc3RydWN0aW9uX21ldGhvZCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTpoLndhcm4oIkl0ZW0gc3RvcmFnZSB3aXRoIGNvbnN0cnVjdGlvbl9tZXRob2QgOiBub3Qgc3VwcG9ydGVkIik7YnJlYWs7Y2FzZSAyOmgud2FybigiSXRlbSBzdG9yYWdlIHdpdGggY29uc3RydWN0aW9uX21ldGhvZCA6IG5vdCBzdXBwb3J0ZWQiKTticmVha31mb3Iocy5leHRlbnRzPVtdLHMuc2l6ZT0wLGk9MDtpPGYuZXh0ZW50cy5sZW5ndGg7aSsrKXMuZXh0ZW50c1tpXT17fSxzLmV4dGVudHNbaV0ub2Zmc2V0PWYuZXh0ZW50c1tpXS5leHRlbnRfb2Zmc2V0K2YuYmFzZV9vZmZzZXQscy5leHRlbnRzW2ldLmxlbmd0aD1mLmV4dGVudHNbaV0uZXh0ZW50X2xlbmd0aCxzLmV4dGVudHNbaV0uYWxyZWFkeVJlYWQ9MCxzLnNpemUrPXMuZXh0ZW50c1tpXS5sZW5ndGh9aWYobi5waXRtJiYodFtuLnBpdG0uaXRlbV9pZF0ucHJpbWFyeT0hMCksbi5pcmVmKWZvcihlPTA7ZTxuLmlyZWYucmVmZXJlbmNlcy5sZW5ndGg7ZSsrKXt2YXIgZD1uLmlyZWYucmVmZXJlbmNlc1tlXTtmb3IoaT0wO2k8ZC5yZWZlcmVuY2VzLmxlbmd0aDtpKyspdFtkLmZyb21faXRlbV9JRF0ucmVmX3RvLnB1c2goe3R5cGU6ZC50eXBlLGlkOmQucmVmZXJlbmNlc1tpXX0pfWlmKG4uaXBycClmb3IodmFyIGM9MDtjPG4uaXBycC5pcG1hcy5sZW5ndGg7YysrKXt2YXIgbT1uLmlwcnAuaXBtYXNbY107Zm9yKGU9MDtlPG0uYXNzb2NpYXRpb25zLmxlbmd0aDtlKyspe3ZhciB4PW0uYXNzb2NpYXRpb25zW2VdO2ZvcihzPXRbeC5pZF0scy5wcm9wZXJ0aWVzPT09dm9pZCAwJiYocy5wcm9wZXJ0aWVzPXt9LHMucHJvcGVydGllcy5ib3hlcz1bXSksaT0wO2k8eC5wcm9wcy5sZW5ndGg7aSsrKXt2YXIgVT14LnByb3BzW2ldO2lmKFUucHJvcGVydHlfaW5kZXg+MCYmVS5wcm9wZXJ0eV9pbmRleC0xPG4uaXBycC5pcGNvLmJveGVzLmxlbmd0aCl7dmFyIGI9bi5pcHJwLmlwY28uYm94ZXNbVS5wcm9wZXJ0eV9pbmRleC0xXTtzLnByb3BlcnRpZXNbYi50eXBlXT1iLHMucHJvcGVydGllcy5ib3hlcy5wdXNoKGIpfX19fX19LHUucHJvdG90eXBlLmdldEl0ZW09ZnVuY3Rpb24odCl7dmFyIGUsaTtpZighdGhpcy5tZXRhKXJldHVybiBudWxsO2lmKGk9dGhpcy5pdGVtc1t0XSwhaS5kYXRhJiZpLnNpemUpaS5kYXRhPW5ldyBVaW50OEFycmF5KGkuc2l6ZSksaS5hbHJlYWR5UmVhZD0wLHRoaXMuaXRlbXNEYXRhU2l6ZSs9aS5zaXplLGguZGVidWcoIklTT0ZpbGUiLCJBbGxvY2F0aW5nIGl0ZW0gIyIrdCsiIG9mIHNpemUgIitpLnNpemUrIiAodG90YWw6ICIrdGhpcy5pdGVtc0RhdGFTaXplKyIpIik7ZWxzZSBpZihpLmFscmVhZHlSZWFkPT09aS5zaXplKXJldHVybiBpO2Zvcih2YXIgcz0wO3M8aS5leHRlbnRzLmxlbmd0aDtzKyspe3ZhciBuPWkuZXh0ZW50c1tzXTtpZihuLmFscmVhZHlSZWFkIT09bi5sZW5ndGgpe3ZhciBmPXRoaXMuc3RyZWFtLmZpbmRQb3NpdGlvbighMCxuLm9mZnNldCtuLmFscmVhZHlSZWFkLCExKTtpZihmPi0xKXtlPXRoaXMuc3RyZWFtLmJ1ZmZlcnNbZl07dmFyIGQ9ZS5ieXRlTGVuZ3RoLShuLm9mZnNldCtuLmFscmVhZHlSZWFkLWUuZmlsZVN0YXJ0KTtpZihuLmxlbmd0aC1uLmFscmVhZHlSZWFkPD1kKWguZGVidWcoIklTT0ZpbGUiLCJHZXR0aW5nIGl0ZW0gIyIrdCsiIGV4dGVudCAjIitzKyIgZGF0YSAoYWxyZWFkeVJlYWQ6ICIrbi5hbHJlYWR5UmVhZCsiIG9mZnNldDogIisobi5vZmZzZXQrbi5hbHJlYWR5UmVhZC1lLmZpbGVTdGFydCkrIiByZWFkIHNpemU6ICIrKG4ubGVuZ3RoLW4uYWxyZWFkeVJlYWQpKyIgZnVsbCBleHRlbnQgc2l6ZTogIituLmxlbmd0aCsiIGZ1bGwgaXRlbSBzaXplOiAiK2kuc2l6ZSsiKSIpLGEubWVtY3B5KGkuZGF0YS5idWZmZXIsaS5hbHJlYWR5UmVhZCxlLG4ub2Zmc2V0K24uYWxyZWFkeVJlYWQtZS5maWxlU3RhcnQsbi5sZW5ndGgtbi5hbHJlYWR5UmVhZCksZS51c2VkQnl0ZXMrPW4ubGVuZ3RoLW4uYWxyZWFkeVJlYWQsdGhpcy5zdHJlYW0ubG9nQnVmZmVyTGV2ZWwoKSxpLmFscmVhZHlSZWFkKz1uLmxlbmd0aC1uLmFscmVhZHlSZWFkLG4uYWxyZWFkeVJlYWQ9bi5sZW5ndGg7ZWxzZSByZXR1cm4gaC5kZWJ1ZygiSVNPRmlsZSIsIkdldHRpbmcgaXRlbSAjIit0KyIgZXh0ZW50ICMiK3MrIiBwYXJ0aWFsIGRhdGEgKGFscmVhZHlSZWFkOiAiK24uYWxyZWFkeVJlYWQrIiBvZmZzZXQ6ICIrKG4ub2Zmc2V0K24uYWxyZWFkeVJlYWQtZS5maWxlU3RhcnQpKyIgcmVhZCBzaXplOiAiK2QrIiBmdWxsIGV4dGVudCBzaXplOiAiK24ubGVuZ3RoKyIgZnVsbCBpdGVtIHNpemU6ICIraS5zaXplKyIpIiksYS5tZW1jcHkoaS5kYXRhLmJ1ZmZlcixpLmFscmVhZHlSZWFkLGUsbi5vZmZzZXQrbi5hbHJlYWR5UmVhZC1lLmZpbGVTdGFydCxkKSxuLmFscmVhZHlSZWFkKz1kLGkuYWxyZWFkeVJlYWQrPWQsZS51c2VkQnl0ZXMrPWQsdGhpcy5zdHJlYW0ubG9nQnVmZmVyTGV2ZWwoKSxudWxsfWVsc2UgcmV0dXJuIG51bGx9fXJldHVybiBpLmFscmVhZHlSZWFkPT09aS5zaXplP2k6bnVsbH0sdS5wcm90b3R5cGUucmVsZWFzZUl0ZW09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pdGVtc1t0XTtpZihlLmRhdGEpe3RoaXMuaXRlbXNEYXRhU2l6ZS09ZS5zaXplLGUuZGF0YT1udWxsLGUuYWxyZWFkeVJlYWQ9MDtmb3IodmFyIGk9MDtpPGUuZXh0ZW50cy5sZW5ndGg7aSsrKXt2YXIgcz1lLmV4dGVudHNbaV07cy5hbHJlYWR5UmVhZD0wfXJldHVybiBlLnNpemV9ZWxzZSByZXR1cm4gMH0sdS5wcm90b3R5cGUucHJvY2Vzc0l0ZW1zPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLml0ZW1zKXt2YXIgaT10aGlzLml0ZW1zW2VdO3RoaXMuZ2V0SXRlbShpLmlkKSx0JiYhaS5zZW50JiYodChpKSxpLnNlbnQ9ITAsaS5kYXRhPW51bGwpfX0sdS5wcm90b3R5cGUuaGFzSXRlbT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5pdGVtcyl7dmFyIGk9dGhpcy5pdGVtc1tlXTtpZihpLm5hbWU9PT10KXJldHVybiBpLmlkfXJldHVybi0xfSx1LnByb3RvdHlwZS5nZXRNZXRhSGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1ldGE/dGhpcy5tZXRhLmhkbHIuaGFuZGxlcjpudWxsfSx1LnByb3RvdHlwZS5nZXRQcmltYXJ5SXRlbT1mdW5jdGlvbigpe3JldHVybiF0aGlzLm1ldGF8fCF0aGlzLm1ldGEucGl0bT9udWxsOnRoaXMuZ2V0SXRlbSh0aGlzLm1ldGEucGl0bS5pdGVtX2lkKX0sdS5wcm90b3R5cGUuaXRlbVRvRnJhZ21lbnRlZFRyYWNrRmlsZT1mdW5jdGlvbih0KXt2YXIgZT10fHx7fSxpPW51bGw7aWYoZS5pdGVtSWQ/aT10aGlzLmdldEl0ZW0oZS5pdGVtSWQpOmk9dGhpcy5nZXRQcmltYXJ5SXRlbSgpLGk9PW51bGwpcmV0dXJuIG51bGw7dmFyIHM9bmV3IHU7cy5kaXNjYXJkTWRhdERhdGE9ITE7dmFyIG49e3R5cGU6aS50eXBlLGRlc2NyaXB0aW9uX2JveGVzOmkucHJvcGVydGllcy5ib3hlc307aS5wcm9wZXJ0aWVzLmlzcGUmJihuLndpZHRoPWkucHJvcGVydGllcy5pc3BlLmltYWdlX3dpZHRoLG4uaGVpZ2h0PWkucHJvcGVydGllcy5pc3BlLmltYWdlX2hlaWdodCk7dmFyIGY9cy5hZGRUcmFjayhuKTtyZXR1cm4gZj8ocy5hZGRTYW1wbGUoZixpLmRhdGEpLHMpOm51bGx9LHUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5ib3hlcy5sZW5ndGg7ZSsrKXRoaXMuYm94ZXNbZV0ud3JpdGUodCl9LHUucHJvdG90eXBlLmNyZWF0ZUZyYWdtZW50PWZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLmdldFRyYWNrQnlJZCh0KSxuPXRoaXMuZ2V0U2FtcGxlKHMsZSk7aWYobj09bnVsbClyZXR1cm4gbj1zLnNhbXBsZXNbZV0sdGhpcy5uZXh0U2Vla1Bvc2l0aW9uP3RoaXMubmV4dFNlZWtQb3NpdGlvbj1NYXRoLm1pbihuLm9mZnNldCtuLmFscmVhZHlSZWFkLHRoaXMubmV4dFNlZWtQb3NpdGlvbik6dGhpcy5uZXh0U2Vla1Bvc2l0aW9uPXMuc2FtcGxlc1tlXS5vZmZzZXQrbi5hbHJlYWR5UmVhZCxudWxsO3ZhciBmPWl8fG5ldyBhO2YuZW5kaWFubmVzcz1hLkJJR19FTkRJQU47dmFyIGQ9dGhpcy5jcmVhdGVTaW5nbGVTYW1wbGVNb29mKG4pO2Qud3JpdGUoZiksZC50cmFmc1swXS50cnVuc1swXS5kYXRhX29mZnNldD1kLnNpemUrOCxoLmRlYnVnKCJNUDRCb3giLCJBZGp1c3RpbmcgZGF0YV9vZmZzZXQgd2l0aCBuZXcgdmFsdWUgIitkLnRyYWZzWzBdLnRydW5zWzBdLmRhdGFfb2Zmc2V0KSxmLmFkanVzdFVpbnQzMihkLnRyYWZzWzBdLnRydW5zWzBdLmRhdGFfb2Zmc2V0X3Bvc2l0aW9uLGQudHJhZnNbMF0udHJ1bnNbMF0uZGF0YV9vZmZzZXQpO3ZhciBjPW5ldyByLm1kYXRCb3g7cmV0dXJuIGMuZGF0YT1uLmRhdGEsYy53cml0ZShmKSxmfSx1LndyaXRlSW5pdGlhbGl6YXRpb25TZWdtZW50PWZ1bmN0aW9uKHQsZSxpLHMpe3ZhciBuO2guZGVidWcoIklTT0ZpbGUiLCJHZW5lcmF0aW5nIGluaXRpYWxpemF0aW9uIHNlZ21lbnQiKTt2YXIgZj1uZXcgYTtmLmVuZGlhbm5lc3M9YS5CSUdfRU5ESUFOLHQud3JpdGUoZik7dmFyIGQ9ZS5hZGQoIm12ZXgiKTtmb3IoaSYmZC5hZGQoIm1laGQiKS5zZXQoImZyYWdtZW50X2R1cmF0aW9uIixpKSxuPTA7bjxlLnRyYWtzLmxlbmd0aDtuKyspZC5hZGQoInRyZXgiKS5zZXQoInRyYWNrX2lkIixlLnRyYWtzW25dLnRraGQudHJhY2tfaWQpLnNldCgiZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXgiLDEpLnNldCgiZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24iLHMpLnNldCgiZGVmYXVsdF9zYW1wbGVfc2l6ZSIsMCkuc2V0KCJkZWZhdWx0X3NhbXBsZV9mbGFncyIsNjU1MzYpO3JldHVybiBlLndyaXRlKGYpLGYuYnVmZmVyfSx1LnByb3RvdHlwZS5zYXZlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBhO2UuZW5kaWFubmVzcz1hLkJJR19FTkRJQU4sdGhpcy53cml0ZShlKSxlLnNhdmUodCl9LHUucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbigpe3ZhciB0PW5ldyBhO3JldHVybiB0LmVuZGlhbm5lc3M9YS5CSUdfRU5ESUFOLHRoaXMud3JpdGUodCksdC5idWZmZXJ9LHUucHJvdG90eXBlLmluaXRpYWxpemVTZWdtZW50YXRpb249ZnVuY3Rpb24oKXt2YXIgdCxlLGkscztmb3IodGhpcy5vblNlZ21lbnQ9PT1udWxsJiZoLndhcm4oIk1QNEJveCIsIk5vIHNlZ21lbnRhdGlvbiBjYWxsYmFjayBzZXQhIiksdGhpcy5pc0ZyYWdtZW50YXRpb25Jbml0aWFsaXplZHx8KHRoaXMuaXNGcmFnbWVudGF0aW9uSW5pdGlhbGl6ZWQ9ITAsdGhpcy5uZXh0TW9vZk51bWJlcj0wLHRoaXMucmVzZXRUYWJsZXMoKSksZT1bXSx0PTA7dDx0aGlzLmZyYWdtZW50ZWRUcmFja3MubGVuZ3RoO3QrKyl7dmFyIG49bmV3IHIubW9vdkJveDtuLm12aGQ9dGhpcy5tb292Lm12aGQsbi5ib3hlcy5wdXNoKG4ubXZoZCksaT10aGlzLmdldFRyYWNrQnlJZCh0aGlzLmZyYWdtZW50ZWRUcmFja3NbdF0uaWQpLG4uYm94ZXMucHVzaChpKSxuLnRyYWtzLnB1c2goaSkscz17fSxzLmlkPWkudGtoZC50cmFja19pZCxzLnVzZXI9dGhpcy5mcmFnbWVudGVkVHJhY2tzW3RdLnVzZXIscy5idWZmZXI9dS53cml0ZUluaXRpYWxpemF0aW9uU2VnbWVudCh0aGlzLmZ0eXAsbix0aGlzLm1vb3YubXZleCYmdGhpcy5tb292Lm12ZXgubWVoZD90aGlzLm1vb3YubXZleC5tZWhkLmZyYWdtZW50X2R1cmF0aW9uOnZvaWQgMCx0aGlzLm1vb3YudHJha3NbdF0uc2FtcGxlcy5sZW5ndGg+MD90aGlzLm1vb3YudHJha3NbdF0uc2FtcGxlc1swXS5kdXJhdGlvbjowKSxlLnB1c2gocyl9cmV0dXJuIGV9LHIuQm94LnByb3RvdHlwZS5wcmludEhlYWRlcj1mdW5jdGlvbih0KXt0aGlzLnNpemUrPTgsdGhpcy5zaXplPnAmJih0aGlzLnNpemUrPTgpLHRoaXMudHlwZT09PSJ1dWlkIiYmKHRoaXMuc2l6ZSs9MTYpLHQubG9nKHQuaW5kZW50KyJzaXplOiIrdGhpcy5zaXplKSx0LmxvZyh0LmluZGVudCsidHlwZToiK3RoaXMudHlwZSl9LHIuRnVsbEJveC5wcm90b3R5cGUucHJpbnRIZWFkZXI9ZnVuY3Rpb24odCl7dGhpcy5zaXplKz00LHIuQm94LnByb3RvdHlwZS5wcmludEhlYWRlci5jYWxsKHRoaXMsdCksdC5sb2codC5pbmRlbnQrInZlcnNpb246Iit0aGlzLnZlcnNpb24pLHQubG9nKHQuaW5kZW50KyJmbGFnczoiK3RoaXMuZmxhZ3MpfSxyLkJveC5wcm90b3R5cGUucHJpbnQ9ZnVuY3Rpb24odCl7dGhpcy5wcmludEhlYWRlcih0KX0sci5Db250YWluZXJCb3gucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3RoaXMucHJpbnRIZWFkZXIodCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmJveGVzLmxlbmd0aDtlKyspaWYodGhpcy5ib3hlc1tlXSl7dmFyIGk9dC5pbmRlbnQ7dC5pbmRlbnQrPSIgIix0aGlzLmJveGVzW2VdLnByaW50KHQpLHQuaW5kZW50PWl9fSx1LnByb3RvdHlwZS5wcmludD1mdW5jdGlvbih0KXt0LmluZGVudD0iIjtmb3IodmFyIGU9MDtlPHRoaXMuYm94ZXMubGVuZ3RoO2UrKyl0aGlzLmJveGVzW2VdJiZ0aGlzLmJveGVzW2VdLnByaW50KHQpfSxyLm12aGRCb3gucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3IuRnVsbEJveC5wcm90b3R5cGUucHJpbnRIZWFkZXIuY2FsbCh0aGlzLHQpLHQubG9nKHQuaW5kZW50KyJjcmVhdGlvbl90aW1lOiAiK3RoaXMuY3JlYXRpb25fdGltZSksdC5sb2codC5pbmRlbnQrIm1vZGlmaWNhdGlvbl90aW1lOiAiK3RoaXMubW9kaWZpY2F0aW9uX3RpbWUpLHQubG9nKHQuaW5kZW50KyJ0aW1lc2NhbGU6ICIrdGhpcy50aW1lc2NhbGUpLHQubG9nKHQuaW5kZW50KyJkdXJhdGlvbjogIit0aGlzLmR1cmF0aW9uKSx0LmxvZyh0LmluZGVudCsicmF0ZTogIit0aGlzLnJhdGUpLHQubG9nKHQuaW5kZW50KyJ2b2x1bWU6ICIrKHRoaXMudm9sdW1lPj44KSksdC5sb2codC5pbmRlbnQrIm1hdHJpeDogIit0aGlzLm1hdHJpeC5qb2luKCIsICIpKSx0LmxvZyh0LmluZGVudCsibmV4dF90cmFja19pZDogIit0aGlzLm5leHRfdHJhY2tfaWQpfSxyLnRraGRCb3gucHJvdG90eXBlLnByaW50PWZ1bmN0aW9uKHQpe3IuRnVsbEJveC5wcm90b3R5cGUucHJpbnRIZWFkZXIuY2FsbCh0aGlzLHQpLHQubG9nKHQuaW5kZW50KyJjcmVhdGlvbl90aW1lOiAiK3RoaXMuY3JlYXRpb25fdGltZSksdC5sb2codC5pbmRlbnQrIm1vZGlmaWNhdGlvbl90aW1lOiAiK3RoaXMubW9kaWZpY2F0aW9uX3RpbWUpLHQubG9nKHQuaW5kZW50KyJ0cmFja19pZDogIit0aGlzLnRyYWNrX2lkKSx0LmxvZyh0LmluZGVudCsiZHVyYXRpb246ICIrdGhpcy5kdXJhdGlvbiksdC5sb2codC5pbmRlbnQrInZvbHVtZTogIisodGhpcy52b2x1bWU+PjgpKSx0LmxvZyh0LmluZGVudCsibWF0cml4OiAiK3RoaXMubWF0cml4LmpvaW4oIiwgIikpLHQubG9nKHQuaW5kZW50KyJsYXllcjogIit0aGlzLmxheWVyKSx0LmxvZyh0LmluZGVudCsiYWx0ZXJuYXRlX2dyb3VwOiAiK3RoaXMuYWx0ZXJuYXRlX2dyb3VwKSx0LmxvZyh0LmluZGVudCsid2lkdGg6ICIrdGhpcy53aWR0aCksdC5sb2codC5pbmRlbnQrImhlaWdodDogIit0aGlzLmhlaWdodCl9O3ZhciBnPXt9O2cuY3JlYXRlRmlsZT1mdW5jdGlvbih0LGUpe3ZhciBpPXQhPT12b2lkIDA/dDohMCxzPW5ldyB1KGUpO3JldHVybiBzLmRpc2NhcmRNZGF0RGF0YT0haSxzfSxFLmNyZWF0ZUZpbGU9Zy5jcmVhdGVGaWxlfSkoTyk7dmFyIFg9SyhPKSxXPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24oRSl7dmFyIGg9e307RS5leHBvcnRzPWgsaC5wYXJzZT1mdW5jdGlvbihvLGEpe2Zvcih2YXIgcD1oLmJpbi5yZWFkVXNob3J0LGw9aC5iaW4ucmVhZFVpbnQsdj0wLF89e30scj1uZXcgVWludDhBcnJheShvKSx5PXIubGVuZ3RoLTQ7bChyLHkpIT0xMDEwMTAyNTY7KXktLTt2YXIgdj15O3YrPTQsdis9NDt2YXIgdT1wKHIsdik7dis9MixwKHIsdiksdis9Mjt2YXIgZz1sKHIsdik7dis9NDt2YXIgdD1sKHIsdik7dis9NCx2PXQ7Zm9yKHZhciBlPTA7ZTx1O2UrKyl7bChyLHYpLHYrPTQsdis9NCx2Kz00LHYrPTQsbChyLHYpLHYrPTQ7dmFyIGc9bChyLHYpO3YrPTQ7dmFyIGk9bChyLHYpO3YrPTQ7dmFyIHM9cChyLHYpLG49cChyLHYrMiksZj1wKHIsdis0KTt2Kz02LHYrPTg7dmFyIGQ9bChyLHYpO3YrPTQsdis9cytuK2YsaC5fcmVhZExvY2FsKHIsZCxfLGcsaSxhKX1yZXR1cm4gX30saC5fcmVhZExvY2FsPWZ1bmN0aW9uKG8sYSxwLGwsXyxyKXt2YXIgeT1oLmJpbi5yZWFkVXNob3J0LHY9aC5iaW4ucmVhZFVpbnQ7dihvLGEpLGErPTQseShvLGEpLGErPTIseShvLGEpLGErPTI7dmFyIHU9eShvLGEpO2ErPTIsdihvLGEpLGErPTQsdihvLGEpLGErPTQsYSs9ODt2YXIgZz15KG8sYSk7YSs9Mjt2YXIgdD15KG8sYSk7YSs9Mjt2YXIgZT1oLmJpbi5yZWFkVVRGOChvLGEsZyk7aWYoYSs9ZyxhKz10LHIpe3BbZV09e3NpemU6Xyxjc2l6ZTpsfTtyZXR1cm59dmFyIGk9bmV3IFVpbnQ4QXJyYXkoby5idWZmZXIsYSk7aWYodT09MClwW2VdPW5ldyBVaW50OEFycmF5KGkuYnVmZmVyLnNsaWNlKGEsYStsKSk7ZWxzZSBpZih1PT04KXt2YXIgcz1uZXcgVWludDhBcnJheShfKTtoLmluZmxhdGVSYXcoaSxzKSxwW2VdPXN9ZWxzZSB0aHJvdyJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZDogIit1fSxoLmluZmxhdGVSYXc9ZnVuY3Rpb24obyxhKXtyZXR1cm4gaC5GLmluZmxhdGUobyxhKX0saC5pbmZsYXRlPWZ1bmN0aW9uKG8sYSl7cmV0dXJuIG9bMF0sb1sxXSxoLmluZmxhdGVSYXcobmV3IFVpbnQ4QXJyYXkoby5idWZmZXIsby5ieXRlT2Zmc2V0KzIsby5sZW5ndGgtNiksYSl9LGguZGVmbGF0ZT1mdW5jdGlvbihvLGEpe2E9PW51bGwmJihhPXtsZXZlbDo2fSk7dmFyIHA9MCxsPW5ldyBVaW50OEFycmF5KDUwK01hdGguZmxvb3Ioby5sZW5ndGgqMS4xKSk7bFtwXT0xMjAsbFtwKzFdPTE1NixwKz0yLHA9aC5GLmRlZmxhdGVSYXcobyxsLHAsYS5sZXZlbCk7dmFyIF89aC5hZGxlcihvLDAsby5sZW5ndGgpO3JldHVybiBsW3ArMF09Xz4+PjI0JjI1NSxsW3ArMV09Xz4+PjE2JjI1NSxsW3ArMl09Xz4+PjgmMjU1LGxbcCszXT1fPj4+MCYyNTUsbmV3IFVpbnQ4QXJyYXkobC5idWZmZXIsMCxwKzQpfSxoLmRlZmxhdGVSYXc9ZnVuY3Rpb24obyxhKXthPT1udWxsJiYoYT17bGV2ZWw6Nn0pO3ZhciBwPW5ldyBVaW50OEFycmF5KDUwK01hdGguZmxvb3Ioby5sZW5ndGgqMS4xKSksbD1oLkYuZGVmbGF0ZVJhdyhvLHAsbCxhLmxldmVsKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocC5idWZmZXIsMCxsKX0saC5lbmNvZGU9ZnVuY3Rpb24obyxhKXthPT1udWxsJiYoYT0hMSk7dmFyIHA9MCxsPWguYmluLndyaXRlVWludCxfPWguYmluLndyaXRlVXNob3J0LHI9e307Zm9yKHZhciB5IGluIG8pe3ZhciB2PSFoLl9ub05lZWQoeSkmJiFhLHU9b1t5XSxnPWguY3JjLmNyYyh1LDAsdS5sZW5ndGgpO3JbeV09e2Nwcjp2LHVzaXplOnUubGVuZ3RoLGNyYzpnLGZpbGU6dj9oLmRlZmxhdGVSYXcodSk6dX19Zm9yKHZhciB5IGluIHIpcCs9clt5XS5maWxlLmxlbmd0aCszMCs0NisyKmguYmluLnNpemVVVEY4KHkpO3ArPTIyO3ZhciB0PW5ldyBVaW50OEFycmF5KHApLGU9MCxpPVtdO2Zvcih2YXIgeSBpbiByKXt2YXIgcz1yW3ldO2kucHVzaChlKSxlPWguX3dyaXRlSGVhZGVyKHQsZSx5LHMsMCl9dmFyIG49MCxmPWU7Zm9yKHZhciB5IGluIHIpe3ZhciBzPXJbeV07aS5wdXNoKGUpLGU9aC5fd3JpdGVIZWFkZXIodCxlLHkscywxLGlbbisrXSl9dmFyIGQ9ZS1mO3JldHVybiBsKHQsZSwxMDEwMTAyNTYpLGUrPTQsZSs9NCxfKHQsZSxuKSxlKz0yLF8odCxlLG4pLGUrPTIsbCh0LGUsZCksZSs9NCxsKHQsZSxmKSxlKz00LGUrPTIsdC5idWZmZXJ9LGguX25vTmVlZD1mdW5jdGlvbihvKXt2YXIgYT1vLnNwbGl0KCIuIikucG9wKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4icG5nLGpwZyxqcGVnLHppcCIuaW5kZXhPZihhKSE9LTF9LGguX3dyaXRlSGVhZGVyPWZ1bmN0aW9uKG8sYSxwLGwsXyxyKXt2YXIgeT1oLmJpbi53cml0ZVVpbnQsdj1oLmJpbi53cml0ZVVzaG9ydCx1PWwuZmlsZTt5KG8sYSxfPT0wPzY3MzI0NzUyOjMzNjM5MjQ4KSxhKz00LF89PTEmJihhKz0yKSx2KG8sYSwyMCksYSs9Mix2KG8sYSwwKSxhKz0yLHYobyxhLGwuY3ByPzg6MCksYSs9Mix5KG8sYSwwKSxhKz00LHkobyxhLGwuY3JjKSxhKz00LHkobyxhLHUubGVuZ3RoKSxhKz00LHkobyxhLGwudXNpemUpLGErPTQsdihvLGEsaC5iaW4uc2l6ZVVURjgocCkpLGErPTIsdihvLGEsMCksYSs9MixfPT0xJiYoYSs9MixhKz0yLGErPTYseShvLGEsciksYSs9NCk7dmFyIGc9aC5iaW4ud3JpdGVVVEY4KG8sYSxwKTtyZXR1cm4gYSs9ZyxfPT0wJiYoby5zZXQodSxhKSxhKz11Lmxlbmd0aCksYX0saC5jcmM9e3RhYmxlOmZ1bmN0aW9uKCl7Zm9yKHZhciBvPW5ldyBVaW50MzJBcnJheSgyNTYpLGE9MDthPDI1NjthKyspe2Zvcih2YXIgcD1hLGw9MDtsPDg7bCsrKXAmMT9wPTM5ODgyOTIzODRecD4+PjE6cD1wPj4+MTtvW2FdPXB9cmV0dXJuIG99KCksdXBkYXRlOmZ1bmN0aW9uKG8sYSxwLGwpe2Zvcih2YXIgXz0wO188bDtfKyspbz1oLmNyYy50YWJsZVsob15hW3ArX10pJjI1NV1ebz4+Pjg7cmV0dXJuIG99LGNyYzpmdW5jdGlvbihvLGEscCl7cmV0dXJuIGguY3JjLnVwZGF0ZSg0Mjk0OTY3Mjk1LG8sYSxwKV40Mjk0OTY3Mjk1fX0saC5hZGxlcj1mdW5jdGlvbihvLGEscCl7Zm9yKHZhciBsPTEsXz0wLHI9YSx5PWErcDtyPHk7KXtmb3IodmFyIHY9TWF0aC5taW4ocis1NTUyLHkpO3I8djspbCs9b1tyKytdLF8rPWw7bD1sJTY1NTIxLF89XyU2NTUyMX1yZXR1cm4gXzw8MTZ8bH0saC5iaW49e3JlYWRVc2hvcnQ6ZnVuY3Rpb24obyxhKXtyZXR1cm4gb1thXXxvW2ErMV08PDh9LHdyaXRlVXNob3J0OmZ1bmN0aW9uKG8sYSxwKXtvW2FdPXAmMjU1LG9bYSsxXT1wPj44JjI1NX0scmVhZFVpbnQ6ZnVuY3Rpb24obyxhKXtyZXR1cm4gb1thKzNdKigyNTYqMjU2KjI1NikrKG9bYSsyXTw8MTZ8b1thKzFdPDw4fG9bYV0pfSx3cml0ZVVpbnQ6ZnVuY3Rpb24obyxhLHApe29bYV09cCYyNTUsb1thKzFdPXA+PjgmMjU1LG9bYSsyXT1wPj4xNiYyNTUsb1thKzNdPXA+PjI0JjI1NX0scmVhZEFTQ0lJOmZ1bmN0aW9uKG8sYSxwKXtmb3IodmFyIGw9IiIsXz0wO188cDtfKyspbCs9U3RyaW5nLmZyb21DaGFyQ29kZShvW2ErX10pO3JldHVybiBsfSx3cml0ZUFTQ0lJOmZ1bmN0aW9uKG8sYSxwKXtmb3IodmFyIGw9MDtsPHAubGVuZ3RoO2wrKylvW2ErbF09cC5jaGFyQ29kZUF0KGwpfSxwYWQ6ZnVuY3Rpb24obyl7cmV0dXJuIG8ubGVuZ3RoPDI/IjAiK286b30scmVhZFVURjg6ZnVuY3Rpb24obyxhLHApe2Zvcih2YXIgbD0iIixfLHI9MDtyPHA7cisrKWwrPSIlIitoLmJpbi5wYWQob1thK3JdLnRvU3RyaW5nKDE2KSk7dHJ5e189ZGVjb2RlVVJJQ29tcG9uZW50KGwpfWNhdGNoe3JldHVybiBoLmJpbi5yZWFkQVNDSUkobyxhLHApfXJldHVybiBffSx3cml0ZVVURjg6ZnVuY3Rpb24obyxhLHApe2Zvcih2YXIgbD1wLmxlbmd0aCxfPTAscj0wO3I8bDtyKyspe3ZhciB5PXAuY2hhckNvZGVBdChyKTtpZighKHkmNDI5NDk2NzE2OCkpb1thK19dPXksXysrO2Vsc2UgaWYoISh5JjQyOTQ5NjUyNDgpKW9bYStfXT0xOTJ8eT4+NixvW2ErXysxXT0xMjh8eT4+MCY2MyxfKz0yO2Vsc2UgaWYoISh5JjQyOTQ5MDE3NjApKW9bYStfXT0yMjR8eT4+MTIsb1thK18rMV09MTI4fHk+PjYmNjMsb1thK18rMl09MTI4fHk+PjAmNjMsXys9MztlbHNlIGlmKCEoeSY0Mjk0OTY3Mjk1LSgxPDwyMSkrMSkpb1thK19dPTI0MHx5Pj4xOCxvW2ErXysxXT0xMjh8eT4+MTImNjMsb1thK18rMl09MTI4fHk+PjYmNjMsb1thK18rM109MTI4fHk+PjAmNjMsXys9NDtlbHNlIHRocm93ImUifXJldHVybiBffSxzaXplVVRGODpmdW5jdGlvbihvKXtmb3IodmFyIGE9by5sZW5ndGgscD0wLGw9MDtsPGE7bCsrKXt2YXIgXz1vLmNoYXJDb2RlQXQobCk7aWYoIShfJjQyOTQ5NjcxNjgpKXArKztlbHNlIGlmKCEoXyY0Mjk0OTY1MjQ4KSlwKz0yO2Vsc2UgaWYoIShfJjQyOTQ5MDE3NjApKXArPTM7ZWxzZSBpZighKF8mNDI5NDk2NzI5NS0oMTw8MjEpKzEpKXArPTQ7ZWxzZSB0aHJvdyJlIn1yZXR1cm4gcH19LGguRj17fSxoLkYuZGVmbGF0ZVJhdz1mdW5jdGlvbihvLGEscCxsKXt2YXIgXz1bWzAsMCwwLDAsMF0sWzQsNCw4LDQsMF0sWzQsNSwxNiw4LDBdLFs0LDYsMTYsMTYsMF0sWzQsMTAsMTYsMzIsMF0sWzgsMTYsMzIsMzIsMF0sWzgsMTYsMTI4LDEyOCwwXSxbOCwzMiwxMjgsMjU2LDBdLFszMiwxMjgsMjU4LDEwMjQsMV0sWzMyLDI1OCwyNTgsNDA5NiwxXV0scj1fW2xdLHk9aC5GLlUsdj1oLkYuX2dvb2RJbmRleDtoLkYuX2hhc2g7dmFyIHU9aC5GLl9wdXRzRSxnPTAsdD1wPDwzLGU9MCxpPW8ubGVuZ3RoO2lmKGw9PTApe2Zvcig7ZzxpOyl7dmFyIHM9TWF0aC5taW4oNjU1MzUsaS1nKTt1KGEsdCxnK3M9PWk/MTowKSx0PWguRi5fY29weUV4YWN0KG8sZyxzLGEsdCs4KSxnKz1zfXJldHVybiB0Pj4+M312YXIgbj15LmxpdHMsZj15LnN0cnQsZD15LnByZXYsYz0wLG09MCx4PTAsVT0wLGI9MCx3PTA7Zm9yKGk+MiYmKHc9aC5GLl9oYXNoKG8sMCksZlt3XT0wKSxnPTA7ZzxpO2crKyl7aWYoYj13LGcrMTxpLTIpe3c9aC5GLl9oYXNoKG8sZysxKTt2YXIgUz1nKzEmMzI3Njc7ZFtTXT1mW3ddLGZbd109U31pZihlPD1nKXsoYz4xNGUzfHxtPjI2Njk3KSYmaS1nPjEwMCYmKGU8ZyYmKG5bY109Zy1lLGMrPTIsZT1nKSx0PWguRi5fd3JpdGVCbG9jayhnPT1pLTF8fGU9PWk/MTowLG4sYyxVLG8seCxnLXgsYSx0KSxjPW09VT0wLHg9Zyk7dmFyIEY9MDtnPGktMiYmKEY9aC5GLl9iZXN0TWF0Y2gobyxnLGQsYixNYXRoLm1pbihyWzJdLGktZyksclszXSkpO3ZhciBzPUY+Pj4xNixCPUYmNjU1MzU7aWYoRiE9MCl7dmFyIHM9Rj4+PjE2LEI9RiY2NTUzNSx6PXYocyx5Lm9mMCk7eS5saHN0WzI1Nyt6XSsrO3ZhciBJPXYoQix5LmRmMCk7eS5kaHN0W0ldKyssVSs9eS5leGJbel0reS5keGJbSV0sbltjXT1zPDwyM3xnLWUsbltjKzFdPUI8PDE2fHo8PDh8SSxjKz0yLGU9ZytzfWVsc2UgeS5saHN0W29bZ11dKys7bSsrfX1mb3IoKHghPWd8fG8ubGVuZ3RoPT0wKSYmKGU8ZyYmKG5bY109Zy1lLGMrPTIsZT1nKSx0PWguRi5fd3JpdGVCbG9jaygxLG4sYyxVLG8seCxnLXgsYSx0KSxjPTAsbT0wLGM9bT1VPTAseD1nKTt0Jjc7KXQrKztyZXR1cm4gdD4+PjN9LGguRi5fYmVzdE1hdGNoPWZ1bmN0aW9uKG8sYSxwLGwsXyxyKXt2YXIgeT1hJjMyNzY3LHY9cFt5XSx1PXktdiszMjc2OCYzMjc2NztpZih2PT15fHxsIT1oLkYuX2hhc2gobyxhLXUpKXJldHVybiAwO2Zvcih2YXIgZz0wLHQ9MCxlPU1hdGgubWluKDMyNzY3LGEpO3U8PWUmJi0tciE9MCYmdiE9eTspe2lmKGc9PTB8fG9bYStnXT09b1thK2ctdV0pe3ZhciBpPWguRi5faG93TG9uZyhvLGEsdSk7aWYoaT5nKXtpZihnPWksdD11LGc+PV8pYnJlYWs7dSsyPGkmJihpPXUrMik7Zm9yKHZhciBzPTAsbj0wO248aS0yO24rKyl7dmFyIGY9YS11K24rMzI3NjgmMzI3NjcsZD1wW2ZdLGM9Zi1kKzMyNzY4JjMyNzY3O2M+cyYmKHM9Yyx2PWYpfX19eT12LHY9cFt5XSx1Kz15LXYrMzI3NjgmMzI3Njd9cmV0dXJuIGc8PDE2fHR9LGguRi5faG93TG9uZz1mdW5jdGlvbihvLGEscCl7aWYob1thXSE9b1thLXBdfHxvW2ErMV0hPW9bYSsxLXBdfHxvW2ErMl0hPW9bYSsyLXBdKXJldHVybiAwO3ZhciBsPWEsXz1NYXRoLm1pbihvLmxlbmd0aCxhKzI1OCk7Zm9yKGErPTM7YTxfJiZvW2FdPT1vW2EtcF07KWErKztyZXR1cm4gYS1sfSxoLkYuX2hhc2g9ZnVuY3Rpb24obyxhKXtyZXR1cm4ob1thXTw8OHxvW2ErMV0pKyhvW2ErMl08PDQpJjY1NTM1fSxoLnNhdmVkPTAsaC5GLl93cml0ZUJsb2NrPWZ1bmN0aW9uKG8sYSxwLGwsXyxyLHksdix1KXt2YXIgZz1oLkYuVSx0PWguRi5fcHV0c0YsZT1oLkYuX3B1dHNFLGkscyxuLGYsZCxjLG0seCxVO2cubGhzdFsyNTZdKyssaT1oLkYuZ2V0VHJlZXMoKSxzPWlbMF0sbj1pWzFdLGY9aVsyXSxkPWlbM10sYz1pWzRdLG09aVs1XSx4PWlbNl0sVT1pWzddO3ZhciBiPSh1KzMmNz84LSh1KzMmNyk6MCkrMzIrKHk8PDMpLHc9bCtoLkYuY29udFNpemUoZy5mbHRyZWUsZy5saHN0KStoLkYuY29udFNpemUoZy5mZHRyZWUsZy5kaHN0KSxTPWwraC5GLmNvbnRTaXplKGcubHRyZWUsZy5saHN0KStoLkYuY29udFNpemUoZy5kdHJlZSxnLmRoc3QpO1MrPTE0KzMqbStoLkYuY29udFNpemUoZy5pdHJlZSxnLmloc3QpKyhnLmloc3RbMTZdKjIrZy5paHN0WzE3XSozK2cuaWhzdFsxOF0qNyk7Zm9yKHZhciBGPTA7RjwyODY7RisrKWcubGhzdFtGXT0wO2Zvcih2YXIgRj0wO0Y8MzA7RisrKWcuZGhzdFtGXT0wO2Zvcih2YXIgRj0wO0Y8MTk7RisrKWcuaWhzdFtGXT0wO3ZhciBCPWI8dyYmYjxTPzA6dzxTPzE6MjtpZih0KHYsdSxvKSx0KHYsdSsxLEIpLHUrPTMsQj09MCl7Zm9yKDt1Jjc7KXUrKzt1PWguRi5fY29weUV4YWN0KF8scix5LHYsdSl9ZWxzZXt2YXIgeixJO2lmKEI9PTEmJih6PWcuZmx0cmVlLEk9Zy5mZHRyZWUpLEI9PTIpe2guRi5tYWtlQ29kZXMoZy5sdHJlZSxzKSxoLkYucmV2Q29kZXMoZy5sdHJlZSxzKSxoLkYubWFrZUNvZGVzKGcuZHRyZWUsbiksaC5GLnJldkNvZGVzKGcuZHRyZWUsbiksaC5GLm1ha2VDb2RlcyhnLml0cmVlLGYpLGguRi5yZXZDb2RlcyhnLml0cmVlLGYpLHo9Zy5sdHJlZSxJPWcuZHRyZWUsZSh2LHUsZC0yNTcpLHUrPTUsZSh2LHUsYy0xKSx1Kz01LGUodix1LG0tNCksdSs9NDtmb3IodmFyIFQ9MDtUPG07VCsrKWUodix1K1QqMyxnLml0cmVlWyhnLm9yZHJbVF08PDEpKzFdKTt1Kz0zKm0sdT1oLkYuX2NvZGVUaW55KHgsZy5pdHJlZSx2LHUpLHU9aC5GLl9jb2RlVGlueShVLGcuaXRyZWUsdix1KX1mb3IodmFyIEM9cixMPTA7TDxwO0wrPTIpe2Zvcih2YXIgUD1hW0xdLFI9UD4+PjIzLGs9QysoUCYoMTw8MjMpLTEpO0M8azspdT1oLkYuX3dyaXRlTGl0KF9bQysrXSx6LHYsdSk7aWYoUiE9MCl7dmFyIEQ9YVtMKzFdLEE9RD4+MTYsTT1EPj44JjI1NSxOPUQmMjU1O3U9aC5GLl93cml0ZUxpdCgyNTcrTSx6LHYsdSksZSh2LHUsUi1nLm9mMFtNXSksdSs9Zy5leGJbTV0sdT1oLkYuX3dyaXRlTGl0KE4sSSx2LHUpLHQodix1LEEtZy5kZjBbTl0pLHUrPWcuZHhiW05dLEMrPVJ9fXU9aC5GLl93cml0ZUxpdCgyNTYseix2LHUpfXJldHVybiB1fSxoLkYuX2NvcHlFeGFjdD1mdW5jdGlvbihvLGEscCxsLF8pe3ZhciByPV8+Pj4zO3JldHVybiBsW3JdPXAsbFtyKzFdPXA+Pj44LGxbcisyXT0yNTUtbFtyXSxsW3IrM109MjU1LWxbcisxXSxyKz00LGwuc2V0KG5ldyBVaW50OEFycmF5KG8uYnVmZmVyLGEscCksciksXysocCs0PDwzKX0saC5GLmdldFRyZWVzPWZ1bmN0aW9uKCl7Zm9yKHZhciBvPWguRi5VLGE9aC5GLl9odWZUcmVlKG8ubGhzdCxvLmx0cmVlLDE1KSxwPWguRi5faHVmVHJlZShvLmRoc3Qsby5kdHJlZSwxNSksbD1bXSxfPWguRi5fbGVuQ29kZXMoby5sdHJlZSxsKSxyPVtdLHk9aC5GLl9sZW5Db2RlcyhvLmR0cmVlLHIpLHY9MDt2PGwubGVuZ3RoO3YrPTIpby5paHN0W2xbdl1dKys7Zm9yKHZhciB2PTA7djxyLmxlbmd0aDt2Kz0yKW8uaWhzdFtyW3ZdXSsrO2Zvcih2YXIgdT1oLkYuX2h1ZlRyZWUoby5paHN0LG8uaXRyZWUsNyksZz0xOTtnPjQmJm8uaXRyZWVbKG8ub3JkcltnLTFdPDwxKSsxXT09MDspZy0tO3JldHVyblthLHAsdSxfLHksZyxsLHJdfSxoLkYuZ2V0U2Vjb25kPWZ1bmN0aW9uKG8pe2Zvcih2YXIgYT1bXSxwPTA7cDxvLmxlbmd0aDtwKz0yKWEucHVzaChvW3ArMV0pO3JldHVybiBhfSxoLkYubm9uWmVybz1mdW5jdGlvbihvKXtmb3IodmFyIGE9IiIscD0wO3A8by5sZW5ndGg7cCs9MilvW3ArMV0hPTAmJihhKz0ocD4+MSkrIiwiKTtyZXR1cm4gYX0saC5GLmNvbnRTaXplPWZ1bmN0aW9uKG8sYSl7Zm9yKHZhciBwPTAsbD0wO2w8YS5sZW5ndGg7bCsrKXArPWFbbF0qb1sobDw8MSkrMV07cmV0dXJuIHB9LGguRi5fY29kZVRpbnk9ZnVuY3Rpb24obyxhLHAsbCl7Zm9yKHZhciBfPTA7XzxvLmxlbmd0aDtfKz0yKXt2YXIgcj1vW19dLHk9b1tfKzFdO2w9aC5GLl93cml0ZUxpdChyLGEscCxsKTt2YXIgdj1yPT0xNj8yOnI9PTE3PzM6NztyPjE1JiYoaC5GLl9wdXRzRShwLGwseSx2KSxsKz12KX1yZXR1cm4gbH0saC5GLl9sZW5Db2Rlcz1mdW5jdGlvbihvLGEpe2Zvcih2YXIgcD1vLmxlbmd0aDtwIT0yJiZvW3AtMV09PTA7KXAtPTI7Zm9yKHZhciBsPTA7bDxwO2wrPTIpe3ZhciBfPW9bbCsxXSxyPWwrMzxwP29bbCszXTotMSx5PWwrNTxwP29bbCs1XTotMSx2PWw9PTA/LTE6b1tsLTFdO2lmKF89PTAmJnI9PV8mJnk9PV8pe2Zvcih2YXIgdT1sKzU7dSsyPHAmJm9bdSsyXT09XzspdSs9Mjt2YXIgZz1NYXRoLm1pbih1KzEtbD4+PjEsMTM4KTtnPDExP2EucHVzaCgxNyxnLTMpOmEucHVzaCgxOCxnLTExKSxsKz1nKjItMn1lbHNlIGlmKF89PXYmJnI9PV8mJnk9PV8pe2Zvcih2YXIgdT1sKzU7dSsyPHAmJm9bdSsyXT09XzspdSs9Mjt2YXIgZz1NYXRoLm1pbih1KzEtbD4+PjEsNik7YS5wdXNoKDE2LGctMyksbCs9ZyoyLTJ9ZWxzZSBhLnB1c2goXywwKX1yZXR1cm4gcD4+PjF9LGguRi5faHVmVHJlZT1mdW5jdGlvbihvLGEscCl7dmFyIGw9W10sXz1vLmxlbmd0aCxyPWEubGVuZ3RoLHk9MDtmb3IoeT0wO3k8cjt5Kz0yKWFbeV09MCxhW3krMV09MDtmb3IoeT0wO3k8Xzt5Kyspb1t5XSE9MCYmbC5wdXNoKHtsaXQ6eSxmOm9beV19KTt2YXIgdj1sLmxlbmd0aCx1PWwuc2xpY2UoMCk7aWYodj09MClyZXR1cm4gMDtpZih2PT0xKXt2YXIgZz1sWzBdLmxpdCx1PWc9PTA/MTowO3JldHVybiBhWyhnPDwxKSsxXT0xLGFbKHU8PDEpKzFdPTEsMX1sLnNvcnQoZnVuY3Rpb24oZCxjKXtyZXR1cm4gZC5mLWMuZn0pO3ZhciB0PWxbMF0sZT1sWzFdLGk9MCxzPTEsbj0yO2ZvcihsWzBdPXtsaXQ6LTEsZjp0LmYrZS5mLGw6dCxyOmUsZDowfTtzIT12LTE7KWkhPXMmJihuPT12fHxsW2ldLmY8bFtuXS5mKT90PWxbaSsrXTp0PWxbbisrXSxpIT1zJiYobj09dnx8bFtpXS5mPGxbbl0uZik/ZT1sW2krK106ZT1sW24rK10sbFtzKytdPXtsaXQ6LTEsZjp0LmYrZS5mLGw6dCxyOmV9O3ZhciBmPWguRi5zZXREZXB0aChsW3MtMV0sMCk7Zm9yKGY+cCYmKGguRi5yZXN0cmljdERlcHRoKHUscCxmKSxmPXApLHk9MDt5PHY7eSsrKWFbKHVbeV0ubGl0PDwxKSsxXT11W3ldLmQ7cmV0dXJuIGZ9LGguRi5zZXREZXB0aD1mdW5jdGlvbihvLGEpe3JldHVybiBvLmxpdCE9LTE/KG8uZD1hLGEpOk1hdGgubWF4KGguRi5zZXREZXB0aChvLmwsYSsxKSxoLkYuc2V0RGVwdGgoby5yLGErMSkpfSxoLkYucmVzdHJpY3REZXB0aD1mdW5jdGlvbihvLGEscCl7dmFyIGw9MCxfPTE8PHAtYSxyPTA7Zm9yKG8uc29ydChmdW5jdGlvbih2LHUpe3JldHVybiB1LmQ9PXYuZD92LmYtdS5mOnUuZC12LmR9KSxsPTA7bDxvLmxlbmd0aCYmb1tsXS5kPmE7bCsrKXt2YXIgeT1vW2xdLmQ7b1tsXS5kPWEscis9Xy0oMTw8cC15KX1mb3Iocj1yPj4+cC1hO3I+MDspe3ZhciB5PW9bbF0uZDt5PGE/KG9bbF0uZCsrLHItPTE8PGEteS0xKTpsKyt9Zm9yKDtsPj0wO2wtLSlvW2xdLmQ9PWEmJnI8MCYmKG9bbF0uZC0tLHIrKyk7ciE9MCYmY29uc29sZS5sb2coImRlYnQgbGVmdCIpfSxoLkYuX2dvb2RJbmRleD1mdW5jdGlvbihvLGEpe3ZhciBwPTA7cmV0dXJuIGFbcHwxNl08PW8mJihwfD0xNiksYVtwfDhdPD1vJiYocHw9OCksYVtwfDRdPD1vJiYocHw9NCksYVtwfDJdPD1vJiYocHw9MiksYVtwfDFdPD1vJiYocHw9MSkscH0saC5GLl93cml0ZUxpdD1mdW5jdGlvbihvLGEscCxsKXtyZXR1cm4gaC5GLl9wdXRzRihwLGwsYVtvPDwxXSksbCthWyhvPDwxKSsxXX0saC5GLmluZmxhdGU9ZnVuY3Rpb24obyxhKXt2YXIgcD1VaW50OEFycmF5O2lmKG9bMF09PTMmJm9bMV09PTApcmV0dXJuIGF8fG5ldyBwKDApO3ZhciBsPWguRixfPWwuX2JpdHNGLHI9bC5fYml0c0UseT1sLl9kZWNvZGVUaW55LHY9bC5tYWtlQ29kZXMsdT1sLmNvZGVzMm1hcCxnPWwuX2dldDE3LHQ9bC5VLGU9YT09bnVsbDtlJiYoYT1uZXcgcChvLmxlbmd0aD4+PjI8PDMpKTtmb3IodmFyIGk9MCxzPTAsbj0wLGY9MCxkPTAsYz0wLG09MCx4PTAsVT0wLGIsdztpPT0wOyl7aWYoaT1fKG8sVSwxKSxzPV8obyxVKzEsMiksVSs9MyxzPT0wKXtVJjcmJihVKz04LShVJjcpKTt2YXIgUz0oVT4+PjMpKzQsRj1vW1MtNF18b1tTLTNdPDw4O2UmJihhPWguRi5fY2hlY2soYSx4K0YpKSxhLnNldChuZXcgcChvLmJ1ZmZlcixvLmJ5dGVPZmZzZXQrUyxGKSx4KSxVPVMrRjw8Myx4Kz1GO2NvbnRpbnVlfWlmKGUmJihhPWguRi5fY2hlY2soYSx4KygxPDwxNykpKSxzPT0xJiYoYj10LmZsbWFwLHc9dC5mZG1hcCxjPTUxMSxtPTMxKSxzPT0yKXtuPXIobyxVLDUpKzI1NyxmPXIobyxVKzUsNSkrMSxkPXIobyxVKzEwLDQpKzQsVSs9MTQ7Zm9yKHZhciBCPTA7QjwzODtCKz0yKXQuaXRyZWVbQl09MCx0Lml0cmVlW0IrMV09MDtmb3IodmFyIHo9MSxCPTA7QjxkO0IrKyl7dmFyIEk9cihvLFUrQiozLDMpO3QuaXRyZWVbKHQub3JkcltCXTw8MSkrMV09SSxJPnomJih6PUkpfVUrPTMqZCx2KHQuaXRyZWUseiksdSh0Lml0cmVlLHosdC5pbWFwKSxiPXQubG1hcCx3PXQuZG1hcCxVPXkodC5pbWFwLCgxPDx6KS0xLG4rZixvLFUsdC50dHJlZSk7dmFyIFQ9bC5fY29weU91dCh0LnR0cmVlLDAsbix0Lmx0cmVlKTtjPSgxPDxUKS0xO3ZhciBDPWwuX2NvcHlPdXQodC50dHJlZSxuLGYsdC5kdHJlZSk7bT0oMTw8QyktMSx2KHQubHRyZWUsVCksdSh0Lmx0cmVlLFQsYiksdih0LmR0cmVlLEMpLHUodC5kdHJlZSxDLHcpfWZvcig7Oyl7dmFyIEw9YltnKG8sVSkmY107VSs9TCYxNTt2YXIgUD1MPj4+NDtpZighKFA+Pj44KSlhW3grK109UDtlbHNle2lmKFA9PTI1NilicmVhazt2YXIgUj14K1AtMjU0O2lmKFA+MjY0KXt2YXIgaz10LmxkZWZbUC0yNTddO1I9eCsoaz4+PjMpK3IobyxVLGsmNyksVSs9ayY3fXZhciBEPXdbZyhvLFUpJm1dO1UrPUQmMTU7dmFyIEE9RD4+PjQsTT10LmRkZWZbQV0sTj0oTT4+PjQpK18obyxVLE0mMTUpO2ZvcihVKz1NJjE1LGUmJihhPWguRi5fY2hlY2soYSx4KygxPDwxNykpKTt4PFI7KWFbeF09YVt4KystTl0sYVt4XT1hW3grKy1OXSxhW3hdPWFbeCsrLU5dLGFbeF09YVt4KystTl07eD1SfX19cmV0dXJuIGEubGVuZ3RoPT14P2E6YS5zbGljZSgwLHgpfSxoLkYuX2NoZWNrPWZ1bmN0aW9uKG8sYSl7dmFyIHA9by5sZW5ndGg7aWYoYTw9cClyZXR1cm4gbzt2YXIgbD1uZXcgVWludDhBcnJheShNYXRoLm1heChwPDwxLGEpKTtyZXR1cm4gbC5zZXQobywwKSxsfSxoLkYuX2RlY29kZVRpbnk9ZnVuY3Rpb24obyxhLHAsbCxfLHIpe2Zvcih2YXIgeT1oLkYuX2JpdHNFLHY9aC5GLl9nZXQxNyx1PTA7dTxwOyl7dmFyIGc9b1t2KGwsXykmYV07Xys9ZyYxNTt2YXIgdD1nPj4+NDtpZih0PD0xNSlyW3VdPXQsdSsrO2Vsc2V7dmFyIGU9MCxpPTA7dD09MTY/KGk9Myt5KGwsXywyKSxfKz0yLGU9clt1LTFdKTp0PT0xNz8oaT0zK3kobCxfLDMpLF8rPTMpOnQ9PTE4JiYoaT0xMSt5KGwsXyw3KSxfKz03KTtmb3IodmFyIHM9dStpO3U8czspclt1XT1lLHUrK319cmV0dXJuIF99LGguRi5fY29weU91dD1mdW5jdGlvbihvLGEscCxsKXtmb3IodmFyIF89MCxyPTAseT1sLmxlbmd0aD4+PjE7cjxwOyl7dmFyIHY9b1tyK2FdO2xbcjw8MV09MCxsWyhyPDwxKSsxXT12LHY+XyYmKF89dikscisrfWZvcig7cjx5OylsW3I8PDFdPTAsbFsocjw8MSkrMV09MCxyKys7cmV0dXJuIF99LGguRi5tYWtlQ29kZXM9ZnVuY3Rpb24obyxhKXtmb3IodmFyIHA9aC5GLlUsbD1vLmxlbmd0aCxfLHIseSx2LHUsZz1wLmJsX2NvdW50LHY9MDt2PD1hO3YrKylnW3ZdPTA7Zm9yKHY9MTt2PGw7dis9MilnW29bdl1dKys7dmFyIHQ9cC5uZXh0X2NvZGU7Zm9yKF89MCxnWzBdPTAscj0xO3I8PWE7cisrKV89XytnW3ItMV08PDEsdFtyXT1fO2Zvcih5PTA7eTxsO3krPTIpdT1vW3krMV0sdSE9MCYmKG9beV09dFt1XSx0W3VdKyspfSxoLkYuY29kZXMybWFwPWZ1bmN0aW9uKG8sYSxwKXtmb3IodmFyIGw9by5sZW5ndGgsXz1oLkYuVSxyPV8ucmV2MTUseT0wO3k8bDt5Kz0yKWlmKG9beSsxXSE9MClmb3IodmFyIHY9eT4+MSx1PW9beSsxXSxnPXY8PDR8dSx0PWEtdSxlPW9beV08PHQsaT1lKygxPDx0KTtlIT1pOyl7dmFyIHM9cltlXT4+PjE1LWE7cFtzXT1nLGUrK319LGguRi5yZXZDb2Rlcz1mdW5jdGlvbihvLGEpe2Zvcih2YXIgcD1oLkYuVS5yZXYxNSxsPTE1LWEsXz0wO188by5sZW5ndGg7Xys9Mil7dmFyIHI9b1tfXTw8YS1vW18rMV07b1tfXT1wW3JdPj4+bH19LGguRi5fcHV0c0U9ZnVuY3Rpb24obyxhLHApe3A9cDw8KGEmNyk7dmFyIGw9YT4+PjM7b1tsXXw9cCxvW2wrMV18PXA+Pj44fSxoLkYuX3B1dHNGPWZ1bmN0aW9uKG8sYSxwKXtwPXA8PChhJjcpO3ZhciBsPWE+Pj4zO29bbF18PXAsb1tsKzFdfD1wPj4+OCxvW2wrMl18PXA+Pj4xNn0saC5GLl9iaXRzRT1mdW5jdGlvbihvLGEscCl7cmV0dXJuKG9bYT4+PjNdfG9bKGE+Pj4zKSsxXTw8OCk+Pj4oYSY3KSYoMTw8cCktMX0saC5GLl9iaXRzRj1mdW5jdGlvbihvLGEscCl7cmV0dXJuKG9bYT4+PjNdfG9bKGE+Pj4zKSsxXTw8OHxvWyhhPj4+MykrMl08PDE2KT4+PihhJjcpJigxPDxwKS0xfSxoLkYuX2dldDE3PWZ1bmN0aW9uKG8sYSl7cmV0dXJuKG9bYT4+PjNdfG9bKGE+Pj4zKSsxXTw8OHxvWyhhPj4+MykrMl08PDE2KT4+PihhJjcpfSxoLkYuX2dldDI1PWZ1bmN0aW9uKG8sYSl7cmV0dXJuKG9bYT4+PjNdfG9bKGE+Pj4zKSsxXTw8OHxvWyhhPj4+MykrMl08PDE2fG9bKGE+Pj4zKSszXTw8MjQpPj4+KGEmNyl9LGguRi5VPWZ1bmN0aW9uKCl7dmFyIG89VWludDE2QXJyYXksYT1VaW50MzJBcnJheTtyZXR1cm57bmV4dF9jb2RlOm5ldyBvKDE2KSxibF9jb3VudDpuZXcgbygxNiksb3JkcjpbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sb2YwOlszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDk5OSw5OTksOTk5XSxleGI6WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMCwwLDAsMF0sbGRlZjpuZXcgbygzMiksZGYwOlsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsNjU1MzUsNjU1MzVdLGR4YjpbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdLGRkZWY6bmV3IGEoMzIpLGZsbWFwOm5ldyBvKDUxMiksZmx0cmVlOltdLGZkbWFwOm5ldyBvKDMyKSxmZHRyZWU6W10sbG1hcDpuZXcgbygzMjc2OCksbHRyZWU6W10sdHRyZWU6W10sZG1hcDpuZXcgbygzMjc2OCksZHRyZWU6W10saW1hcDpuZXcgbyg1MTIpLGl0cmVlOltdLHJldjE1Om5ldyBvKDMyNzY4KSxsaHN0Om5ldyBhKDI4NiksZGhzdDpuZXcgYSgzMCksaWhzdDpuZXcgYSgxOSksbGl0czpuZXcgYSgxNWUzKSxzdHJ0Om5ldyBvKDY1NTM2KSxwcmV2Om5ldyBvKDMyNzY4KX19KCksZnVuY3Rpb24oKXtmb3IodmFyIG89aC5GLlUsYT0zMjc2OCxwPTA7cDxhO3ArKyl7dmFyIGw9cDtsPShsJjI4NjMzMTE1MzApPj4+MXwobCYxNDMxNjU1NzY1KTw8MSxsPShsJjM0MzU5NzM4MzYpPj4+MnwobCY4NTg5OTM0NTkpPDwyLGw9KGwmNDA0MjMyMjE2MCk+Pj40fChsJjI1MjY0NTEzNSk8PDQsbD0obCY0Mjc4MjU1MzYwKT4+Pjh8KGwmMTY3MTE5MzUpPDw4LG8ucmV2MTVbcF09KGw+Pj4xNnxsPDwxNik+Pj4xN31mdW5jdGlvbiBfKHIseSx2KXtmb3IoO3ktLSE9MDspci5wdXNoKDAsdil9Zm9yKHZhciBwPTA7cDwzMjtwKyspby5sZGVmW3BdPW8ub2YwW3BdPDwzfG8uZXhiW3BdLG8uZGRlZltwXT1vLmRmMFtwXTw8NHxvLmR4YltwXTtfKG8uZmx0cmVlLDE0NCw4KSxfKG8uZmx0cmVlLDExMiw5KSxfKG8uZmx0cmVlLDI0LDcpLF8oby5mbHRyZWUsOCw4KSxoLkYubWFrZUNvZGVzKG8uZmx0cmVlLDkpLGguRi5jb2RlczJtYXAoby5mbHRyZWUsOSxvLmZsbWFwKSxoLkYucmV2Q29kZXMoby5mbHRyZWUsOSksXyhvLmZkdHJlZSwzMiw1KSxoLkYubWFrZUNvZGVzKG8uZmR0cmVlLDUpLGguRi5jb2RlczJtYXAoby5mZHRyZWUsNSxvLmZkbWFwKSxoLkYucmV2Q29kZXMoby5mZHRyZWUsNSksXyhvLml0cmVlLDE5LDApLF8oby5sdHJlZSwyODYsMCksXyhvLmR0cmVlLDMwLDApLF8oby50dHJlZSwzMjAsMCl9KCl9KShXKTt2YXIgJD1XLmV4cG9ydHMscT1LKCQpO2NsYXNzIEp7YXN5bmMgaGFuZGxlRGF0YShoLG8pe2NvbnN0IGE9cS5wYXJzZShoKTtpZihhWyJhbHBoYS5tcDQiXXx8YVsiYWxwaGEud2VibSJdKXthd2FpdCB0aGlzLmRlY29kZUFscGhhTWFza1ZpZGVvKGEsbyk7cmV0dXJufWxldCBwPU9iamVjdC5rZXlzKGEpLnNvcnQoKTtmb3IoY29uc3QgbCBvZiBwKWlmKGwuZW5kc1dpdGgoIi5qc29uIikpe2xldCBfPVtdO2NvbnN0IHI9SlNPTi5wYXJzZShuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYVtsXSkpLHk9ci50aW1lY29kZS5yZXBsYWNlKC86L2csIl8iKTtpZihyLnBsYWNlaG9sZGVycylmb3IoY29uc3QgdiBpbiByLnBsYWNlaG9sZGVycyl7bGV0IHU9YCR7eX1fJHt2fS5hbHBoYWA7YVt1XSYmKHIucGxhY2Vob2xkZXJzW3ZdLmFscGhhQXNVaW50OEFycmF5PWFbdV0sXy5wdXNoKGFbdV0uYnVmZmVyKSl9cG9zdE1lc3NhZ2UocixfKX19Z2V0RGVzY3JpcHRpb24oaCl7Zm9yKGNvbnN0IG8gb2YgaC5tZGlhLm1pbmYuc3RibC5zdHNkLmVudHJpZXMpe2NvbnN0IGE9by5hdmNDfHxvLmh2Y0N8fG8udnBjQ3x8by5hdjFDO2lmKGEpe2NvbnN0IHA9bmV3IE8uRGF0YVN0cmVhbSh2b2lkIDAsMCxPLkRhdGFTdHJlYW0uQklHX0VORElBTik7cmV0dXJuIGEud3JpdGUocCksbmV3IFVpbnQ4QXJyYXkocC5idWZmZXIsOCl9fXJldHVybiBjb25zb2xlLmVycm9yKCJhdmNDLCBodmNDLCB2cGNDLCBvciBhdjFDIGJveCBub3QgZm91bmQgb24gIixoKSxudWxsfW51bWVyaWNGaWxlQ29tcGFyYXRvcihoLG8pe2NvbnN0IGE9L14oXGR7Mn0pXyhcZHsyfSlfKFxkezJ9KV8oXGR7Mn0pKD86XC4oXGQrKSk/XC4oLispJC8scD1oLm1hdGNoKGEpLGw9by5tYXRjaChhKTtpZighcHx8IWwpcmV0dXJuIDA7Y29uc3RbLF8scix5LHYsdT0iMCIsZ109cCxbLHQsZSxpLHMsbj0iMCIsZl09bDtyZXR1cm4gcGFyc2VJbnQoXywxMCktcGFyc2VJbnQodCwxMCl8fHBhcnNlSW50KHIsMTApLXBhcnNlSW50KGUsMTApfHxwYXJzZUludCh5LDEwKS1wYXJzZUludChpLDEwKXx8cGFyc2VJbnQodiwxMCktcGFyc2VJbnQocywxMCl8fHBhcnNlSW50KHUsMTApLXBhcnNlSW50KG4sMTApfHxnLmxvY2FsZUNvbXBhcmUoZil9YXN5bmMgZGVjb2RlQWxwaGFNYXNrVmlkZW8oaCxvKXtsZXQgYT1PYmplY3Qua2V5cyhoKS5maWx0ZXIoZz0+Zy5lbmRzV2l0aCgiLmpzb24iKSkuc29ydCh0aGlzLm51bWVyaWNGaWxlQ29tcGFyYXRvcikubWFwKGc9PkpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGhbZ10pKSkuZmlsdGVyKGc9PmcucGxhY2Vob2xkZXJzKTtjb25zdCBwPXBlcmZvcm1hbmNlLm5vdygpLGw9YS5sZW5ndGg7Y29uc29sZS5pbmZvKCJXZSBuZWVkIHRvIGRlY29kZSAiLGwsImZyYW1lcyIpO2NvbnN0IHI9YXdhaXQgbmV3IEJsb2IoW2hbImFscGhhLm1wNCJdfHxoWyJhbHBoYS53ZWJtIl1dLHt0eXBlOmhbImFscGhhLm1wNCJdPyJ2aWRlby9tcDQiOiJ2aWRlby93ZWJtIn0pLmFycmF5QnVmZmVyKCk7ci5maWxlU3RhcnQ9MDtsZXQgeT0wO2NvbnN0IHY9bmV3IFZpZGVvRGVjb2Rlcih7b3V0cHV0Omc9PnthW3ldLmFscGhhTWFzaz1nLHBvc3RNZXNzYWdlKGFbeV0sW2ddKSxnLmNsb3NlKCkseSsrLHk+PWwmJmNvbnNvbGUubG9nKG8sIkRlY29kZWQiLHksIkZyYW1lcyBpbiIscGVyZm9ybWFuY2Uubm93KCktcCwibWlsbGlzZWNvbmRzLiIpfSxlcnJvcjpnPT5jb25zb2xlLmVycm9yKCItLURlY29kZXIgZXJyb3I6IixnKX0pLHU9WC5jcmVhdGVGaWxlKCk7dS5vbkVycm9yPWc9PmNvbnNvbGUuZXJyb3IoIk1QNCBwYXJzaW5nIGVycm9yOiIsZyksdS5vblJlYWR5PWc9Pntjb25zdCB0PWcudHJhY2tzLmZpbmQoZT0+ZS50eXBlPT09InZpZGVvIik7dCYmKHYuY29uZmlndXJlKHtjb2RlYzp0LmNvZGVjLHdpZHRoOnQudmlkZW8ud2lkdGgsaGVpZ2h0OnQudmlkZW8uaGVpZ2h0LGRlc2NyaXB0aW9uOnRoaXMuZ2V0RGVzY3JpcHRpb24odS5nZXRUcmFja0J5SWQodC5pZCkpfSksdS5zZXRFeHRyYWN0aW9uT3B0aW9ucyh0LmlkKSx1LnN0YXJ0KCkpfSx1Lm9uU2FtcGxlcz0oZyx0LGUpPT57ZS5mb3JFYWNoKGk9Pntjb25zdCBzPW5ldyBFbmNvZGVkVmlkZW9DaHVuayh7dHlwZTppLmlzX3N5bmM/ImtleSI6ImRlbHRhIix0aW1lc3RhbXA6aS5jdHMsZGF0YTpuZXcgVWludDhBcnJheShpLmRhdGEpfSk7di5kZWNvZGUocyl9KX0sdS5hcHBlbmRCdWZmZXIocil9fWNvbnN0IFY9IjoiLEc9KEUsaCk9Pntjb25zdCBvPUUuc3BsaXQoaCk7cmV0dXJue2g6cGFyc2VJbnQob1swXSksbTpwYXJzZUludChvWzFdKSxzOnBhcnNlSW50KG9bMl0pLGY6cGFyc2VJbnQob1szXSl9fSxIPUU9PigiMCIrRS5oKS5zbGljZSgtMikrVisoIjAiK0UubSkuc2xpY2UoLTIpK1YrKCIwIitFLnMpLnNsaWNlKC0yKStWKygiMCIrRS5mKS5zbGljZSgtMiksWT0oRSxoKT0+e2xldCBvPXsuLi5FfTtyZXR1cm4gby5zKz1oLG8ucz49NjAmJihvLnM9MCxvLm0rKyxvLm0+PTYwJiYoby5tPTAsby5oKyspKSxvfSxaPShFLGg9MCk9PntsZXQgbz1HKEUsIjoiKTtyZXR1cm4gaCYmKG89WShvLGgpKSxvfSxRPShFLGg9MCk9PntsZXQgbz1aKEUsaCk7cmV0dXJuIEgobyl9LGo9KEUsaCk9PkUuaD5oLmg/ITA6RS5oPGguaD8hMTpFLm0+aC5tPyEwOkUubTxoLm0/ITE6RS5zPmgucz8hMDpFLnM8aC5zPyExOkUuZj5oLmY7dHJ5e2xldCBFPSExLGg9IiIsbz0iIixhPXt9LHA9bnVsbCxsPVtdLF89e30scj0hMCx5PSExO2NvbnN0IHY9bmV3IEo7bGV0IHU7Y29uc3QgZz1pPT57ciYmKGk+MCYmaihaKGEudGMsaSksXyk/c2V0VGltZW91dCgoKT0+e2coaSl9LDEwMCk6c2V0VGltZW91dCgoKT0+e2EudGM9UShhLnRjLGkpLGUoKX0sMCkpfSx0PWk9Pntjb25zdCBzPWkudGMucmVwbGFjZUFsbCgiOiIsIl8iKTtyZXR1cm4gdT9gJHtpLnBhdGh9L21hbmlmZXN0cy81OS45NC8ke3N9LnppcGA6YCR7aS5wYXRofS8ke3N9LnppcGB9LGU9YXN5bmMoKT0+e3k9ITA7Y29uc3QgaT1hLHM9dChpKTt0cnl7Y29uc3Qgbj1wZXJmb3JtYW5jZS5ub3coKSxmPWF3YWl0IGZldGNoKHMpO2lmKGYuc3RhdHVzPj00MDApe2xldCB3PShwZXJmb3JtYW5jZS5ub3coKS1wKS8xZTM7dz40Pyhjb25zb2xlLmVycm9yKCJEaWRuJ3QgZmluZCB0aW1lY29kZSAiLGkudGMsIiwgbm93IGZvciAiK3cudG9GaXhlZCgyKSsiIHNlY29uZHMgLSBnaXZlIHVwICEiKSxnKDIpKTooY29uc29sZS5lcnJvcigiRGlkbid0IGZpbmQgdGltZWNvZGUgIixpLnRjLCIsIG5vdyBmb3IgIit3LnRvRml4ZWQoMikrIiBzZWNvbmRzIiksZygwKSkseT0hMTtyZXR1cm59bGV0IGQ9cGVyZm9ybWFuY2Uubm93KCksYz0wO2lmKHApZm9yKGM9ZC1wLGwucHVzaChjKTtsLmxlbmd0aD4xZTM7KWwuc2hpZnQoKTtwPWQ7Y29uc3QgbT1hd2FpdCBmLmFycmF5QnVmZmVyKCk7YXdhaXQgdi5oYW5kbGVEYXRhKG0saS50Yyk7Y29uc3QgeD1wZXJmb3JtYW5jZS5ub3coKX1jYXRjaChuKXtjb25zb2xlLmVycm9yKGBFcnJvciBvbiB1cmwgJHtzfWAsbil9eT0hMSxnKDIpfTthZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixpPT57aWYoIUUmJmkuZGF0YS5jbG91ZEZyb250VVJMKXtFPSEwLHU9aS5kYXRhLm1hc2tNUDQ/PyExLGg9aS5kYXRhLmNsb3VkRnJvbnRVUkwsbz1pLmRhdGEuZm9sZGVyTmFtZTtsZXQgcz1HKGkuZGF0YS50YywiOiIpO189WShPYmplY3QuYXNzaWduKHt9LHMpLDQpLHMuZj0wLHMucz1zLnMlMj09PTA/cy5zOnMucy0xLGE9e3RjOkgocykscGF0aDpgJHtofS8ke299YH0sY29uc29sZS5sb2coIk1ldGEtZGF0YSB3b3JrZXIgc3RhcnRpbmcgZnJvbSB0aGlzIHRpbWUtY29kZToiLGEudGMpLGUoKX1lbHNle2xldCBzPUcoaS5kYXRhLnRjLCI6Iik7cy5mPTAscy5zPXMucyUyPT09MD9zLnM6cy5zLTEsaihzLF8pJiYoYS50Yz1IKHMpLGNvbnNvbGUubG9nKCJNZXRhLWRhdGEgd29ya2VyIGp1bXBzIGZvcndhcmQgdG8gdGhpcyB0aW1lLWNvZGU6ICIsYS50YykpLGooRyhhLnRjLCI6IiksWShzLDQpKSYmKGEudGM9SChzKSxjb25zb2xlLmxvZygiTWV0YS1kYXRhIHdvcmtlciBqdW1wcyBiYWNrIHRvIHRoaXMgdGltZS1jb2RlOiAiLGEudGMpKSxfPVkocyw0KSwhciYmaS5kYXRhLmVuYWJsZWQ/KHI9aS5kYXRhLmVuYWJsZWQseXx8ZSgpKTpyPWkuZGF0YS5lbmFibGVkfX0pfWNhdGNoKEUpe2NvbnNvbGUuZXJyb3IoRSl9fSkoKTsK",ao=e=>Uint8Array.from(atob(e),t=>t.charCodeAt(0)),za=typeof self<"u"&&self.Blob&&new Blob([ao(Ia)],{type:"text/javascript;charset=utf-8"});function co(e){let t;try{if(t=za&&(self.URL||self.webkitURL).createObjectURL(za),!t)throw"";const n=new Worker(t,{name:e==null?void 0:e.name});return n.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker("data:text/javascript;base64,"+Ia,{name:e==null?void 0:e.name})}finally{t&&(self.URL||self.webkitURL).revokeObjectURL(t)}}class Ma{constructor(t,n){this.options=t,this.composer=n,this.sourceFPS=6e4/1001,this.folderName,this.lastFrames,this.metadataWorker=null,this.getMetaDataFolderName()}setMetaDataFolderName(t){this.folderName=t,console.log("Folder name for "+this.options.gameId+": "+this.folderName),this.lastFrames&&this.loadMetaData(this.lastFrames)}async getMetaDataFolderName(){await(await fetch(this.options.allGamesURL)).json(),this.setMetaDataFolderName(this.options.gameId)}setLastFrame(t){this.lastFrames=t,this.folderName&&this.loadMetaData(this.lastFrames)}loadMetaData(t){if(this.metadataWorker==null){const n=new co;n.onerror=function(a){console.error("Error from worker:",a)},n.addEventListener("message",a=>{a.data.time||this.composer.onMetaData(a.data)});let l=Tl(J(t,this.sourceFPS,!0));n.postMessage({cloudFrontURL:this.options.cloudFrontURL,folderName:this.folderName,tc:M(l,!1),maskMP4:this.options.maskMP4}),this.metadataWorker=n}else{let n=Tl(J(this.lastFrames,this.sourceFPS,!0));this.metadataWorker.postMessage({tc:M(n,!1),enabled:this.options.enabled})}}}class io{constructor(t,n){g(this,"metaDataFetcher",null);g(this,"composer",null);g(this,"ctxGl",null);g(this,"firstFrameTimecode",[0,0,0,0,0]);g(this,"countVid",0);g(this,"lastVidDateTime",0);g(this,"lastCalled","");g(this,"frameNumberToRender",0);g(this,"lastOffset",0);g(this,"lastOffsetShown");g(this,"countOfCorrectionsInRow",0);g(this,"deltaVidDeltaArray",[]);g(this,"deltaVidDeltaArrayCapacity",20);g(this,"countANI",0);g(this,"aniDelltaTimeArray",[]);g(this,"aniDelltaTimeArrayCapacity",60);g(this,"lastAniNow",0);g(this,"vidFiredTime",0);g(this,"correction",!1);g(this,"prevFraction",.99);g(this,"lastDblFrame",0);g(this,"lastRealFrame",0);g(this,"lastNow",0);g(this,"renderOnNextFrame",-1);g(this,"countAppleANI",0);g(this,"initializeComponents",()=>{window.BB.RENDER_IN_WORKER?this.initializeComponents_Worker():this.initializeComponents_MainThread()});g(this,"initializeComponents_MainThread",()=>{let t=this.video.parentElement;this.composer=new cr(this.options,t),this.ads=new Sa(this.composer,this.options),this.metaDataFetcher=new Ma(this.options,this.composer)});g(this,"initializeComponents_Worker",()=>{let t=this.video.parentElement;t.offsetTop,t.offsetLeft,this.canvas.style.top=0,this.canvas.style.left=0;var n=this.doCalculateBlackBars(this.video);if(this.video.readyState>=1){var n=this.doCalculateBlackBars(this.video);this.canvas.style.top=Math.round(n.top)+"px",this.canvas.style.left=Math.round(n.left)+"px"}else console.log("video element is not yet loaded. Setting up loadedmetadata event to wait until it's loaded. video.readyState="+this.video.readyState),this.video.addEventListener("loadedmetadata",()=>{var c=this.doCalculateBlackBars(this.video);this.canvas.style.top=Math.round(c.top)+"px",this.canvas.style.left=Math.round(c.left)+"px"});this.canvas.style.width="100%",this.canvas.style.zIndex=1e5,this.canvas.width=t.clientWidth,this.canvas.height=t.clientHeight,this.canvas.style.position="absolute";let l=t.getElementsByTagName("video")[0],a=l.nextSibling;a?t.insertBefore(this.canvas,a):t.appendChild(this.canvas),this.canvas.style["pointer-events"]="none",this.composer=new sr(this.canvas,this.options),l.addEventListener("click",c=>{var i=this.canvas.getBoundingClientRect();this.composer.onUserClickOnCanvas(c.clientX,c.clientY,i)}),this.ads=new Sa(this.composer,this.options),this.metaDataFetcher=new Ma(this.options,this.composer)});g(this,"getCanvas",()=>{var t;return(t=this.composer)==null?void 0:t.getCanvas()});if(this.options=n,this.video=t,this.onFrameVideoChromeMac=this.onFrameVideoChromeMac.bind(this),this.onFrameVideoChromeWin=this.onFrameVideoChromeWin.bind(this),this.onAnimatedFrameSafari=this.onAnimatedFrameSafari.bind(this),this.onAnimatedFrameChromeWin=this.onAnimatedFrameChromeWin.bind(this),this.onAnimatedFrameChromeMac=this.onAnimatedFrameChromeMac.bind(this),this.calculateBlackBars=this.calculateBlackBars.bind(this),n.renderingMode==Me.Augment)if(window.BB.RENDER_IN_WORKER)this.canvas=document.createElement("canvas");else{let l=document.createElement("canvas");l.width=500,l.height=500,document.body.appendChild(l),this.ctxGl=l.getContext("webgl")}this.lastVideoFrameRenderedInGL=-1,this.lastCorrection=!1,this.sourceFPS=6e4/1001,ze.isSafariMac()?(n.debug&&(document.getElementById("numberInput").value=2),window.BB.RENDER_IN_WORKER=!1,window.requestAnimationFrame(this.onAnimatedFrameSafari)):ze.isChromeMac()?(n.debug&&(document.getElementById("numberInput").value=1),window.BB.RENDER_IN_WORKER=!0,window.requestAnimationFrame(this.onAnimatedFrameChromeMac),t.readyState>=1?t.requestVideoFrameCallback(this.onFrameVideoChromeMac):t.addEventListener("loadedmetadata",()=>{t.requestVideoFrameCallback(this.onFrameVideoChromeMac)})):console.BBerror("Platform not supported yet"),window.addEventListener("resize",()=>{this.calculateBlackBars(t)})}processTimedMetadata(t,n){let l="";if(t&&t.includes("www.mediakind.com/NTC")){const a=t.replace(/.*NTC./,"");let c=0;for(;c+8<=a.length;){const i=a.substring(c,c+4),r=((a.charCodeAt(c+4)*256+a.charCodeAt(c+5))*256+a.charCodeAt(c+6))*256+a.charCodeAt(c+7);if(c+8+r>a.length)break;const d=a.substring(c+8,c+8+r);i=="utc_"&&new Date(parseInt(d)).getTime()/1e3,i=="tc__"&&(this.tcTimeStamp=new Date(parseInt(d)).getTime()),i==="offs"&&(this.timecode_offset=parseInt(d)/90,this.options.debug&&console.log("We are HERE:TimeCode",this.timecode_offset)),c+=8+r}}return l}onNewMetadata(t){if(t&&t.metadata&&t.metadata.id==0||ze.isSafariMac()){if(t.metadata.messageData)t.metadata.messageData=this.processTimedMetadata(t.metadata.messageData,t.metadata.presentationTime);else if(t.metadata.frames&&t.metadata.frames.length&&t.metadata.frames[0].key&&t.metadata.frames[0].key.toLowerCase()==="priv"){const n=t.metadata.frames.filter(l=>l.info&&l.info.toLowerCase().includes("ntc"));if(n.length){const l=`${n[n.length-1].info}\0${String.fromCharCode(...n[n.length-1].data)}`;t.metadata.messageData=this.processTimedMetadata(l,t.metadata.presentationTime)}}if(t.metadata.id==0||ze.isSafariMac()&&this.timecode_offset==0){t.metadata.presentationTime*1e3;const n=new Date(this.tcTimeStamp-this.timecode_offset);let l=Math.round(n.getUTCMilliseconds()*30*2/1001)/2;const a=l%1;let c=1;a==.5&&(l=Math.floor(l),c=2),this.firstFrameTimecode=[n.getUTCHours(),n.getUTCMinutes(),n.getUTCSeconds(),Math.floor(l),c==1?0:1]}}}onNewSegmentForMetadata(t){if(typeof globalConfig<"u"&&typeof globalConfig.MKsync<"u"&&globalConfig.MKsync=="no")return;let n={frame:0,playerTime:0};n.frame=Vn(this.firstFrameTimecode,6e4/1001,!0),n.stringTime=M(this.firstFrameTimecode,!0,!0),console.log("New segment ("+t.url+"): "+n.stringTime+" ("+n.frame+") playing at "+t.playbackTime),n.playerTime=t.playbackTime,this.options.syncPoint=n,t.mimeType.includes("video")&&console.log("url: "+t.url)}onNewSegment(t){switch(t.eventType){case wmcEvents.AMC_EVENT_PLAYER_SEGMENT_PLAYBACK:let n={frame:0,playerTime:0};console.log("New segment ("+t.url+"): "+Hl(t.dateTime,6e4/1001)+" playing at "+t.playbackTime),n.frame=Vn(Ul(t.dateTime),fps,!0),n.stringTime=Hl(t.dateTime,6e4/1001),n.playerTime=t.playbackTime,this.options.syncPoint=n;break}}render(t,n){var d;let l=!1;const a=this.options;if(a.debug){var c=document.getElementById("doNotRenderAugmentationCheckbox");l=c.checked}if(l)return 0;const i=performance.now();return this.lastVideoFrameRenderedInGL==t&&n==this.lastCorrection?(a.debug&&console.log("render(): lastVideoFrameRenderedInGL==currentFrame: "+t),0):!a.enabled||a.stopAugment?(this.composer.cleanGL(),0):a.stopAugmentFor>0?((d=this.composer)==null||d.cleanGL(),a.stopAugmentFor-=1/a.hls_fps,0):(a.renderingMode==Me.RenderDigits?renderDigit(this.ctxGl,t):a.renderingMode==Me.RenderTimecode?this.sourceFPS==6e4/1001||this.sourceFPS==60?renderTimecode(this.ctxGl,J(t,sourceFPS,!0),!0):(this.sourceFPS==3e4/1001||this.sourceFPS==30)&&renderTimecode(this.ctxGl,J(t,this.sourceFPS,!1),!1):a.renderingMode==Me.Augment&&this.composer&&(this.sourceFPS==6e4/1001||sourceFPS==60?this.composer.renderAugmentation(M(J(t,this.sourceFPS,!0))):(this.sourceFPS==3e4/1001||this.sourceFPS==30)&&(n?this.composer.renderAugmentation(M(J(t*2+1,this.sourceFPS*2,!0),!0)):this.composer.renderAugmentation(M(J(t,this.sourceFPS,!1),!1)))),this.lastVideoFrameRenderedInGL=t,this.lastCorrection=n,performance.now()-i)}addNumberToVidDeltaArray(t){this.deltaVidDeltaArray.push(t),this.deltaVidDeltaArray.length>this.deltaVidDeltaArrayCapacity&&this.deltaVidDeltaArray.shift();const l=this.deltaVidDeltaArray.reduce((r,d)=>r+d,0)/this.deltaVidDeltaArray.length,a=this.deltaVidDeltaArray.filter(r=>Math.abs(r-l)<=l*.2);return a.reduce((r,d)=>r+d,0)/a.length}onFrameVideoChromeMac(t,n){var b;const l=this.options;if(this.lastCalled="VID",l.hls_fps!=6e4/1001&&l.hls_fps!=3e4/1001){console.log("Unsupported FPS: options.hls_fps = "+l.hls_fps),this.video.requestVideoFrameCallback(this.onFrameVideoChromeMac);return}var a=(n.mediaTime-l.syncPoint.playerTime)%(60*60*24)*(6e4/1001),c=n.mediaTime-l.syncPoint.playerTime;let i=Math.floor(a+.1)+l.syncPoint.frame,r=Date.now()-this.lastVidDateTime;var d=1e3/this.addNumberToVidDeltaArray(r);if(l.debug){d>25&&d<35&&(i+=1);var s=document.getElementById("numberInput").value,o=parseInt(s);i+=o}else d>25&&d<35?i+=2:i+=1;let u=document.getElementById("debugText2");var Z="";Z=M(J(i,this.sourceFPS,!0),!0,!0);var m="";l.augmentation.offset<0?(m+="-",m+=M(J(-1*l.augmentation.offset,this.sourceFPS,!0),!0,!0)):m+=M(J(l.augmentation.offset,this.sourceFPS,!0),!0,!0);let p=i-l.augmentation.offset;p<0&&(p+=5178816),p>=5178816&&(p-=5178816),this.metaDataFetcher&&this.metaDataFetcher.setLastFrame(p);var h="";h=M(J(p,this.sourceFPS,!0),!0,!0);let R=new Date,y=String(R.getHours()).padStart(2,"0"),V=String(R.getMinutes()).padStart(2,"0"),L=String(R.getSeconds()).padStart(2,"0"),G=String(R.getMilliseconds()).padStart(3,"0"),W=`${y}:${V}:${L}.${G}`;if(l.debug){var X="black";if(l.augmentation.offset!=this.lastOffset||this.lastOffsetShown<10*60)var X="red";u.innerHTML="VID. "+this.countVid+" Game: "+l.gameId+", Time Fired: "+W+", PlayerTime:"+n.mediaTime.toFixed(4)+", dblFrame: "+a.toFixed(4)+", Stream Time-Code: "+Z+", offset: <span style='color:"+X+"'>"+l.augmentation.offset+"("+m+")</span> </br> </br><span style='font-size: 30px;'>, Brain Time-Code: "+h+"( "+p+" )</span> </br> </br>, expectedDisplayTime: "+n.expectedDisplayTime.toFixed(4)+", presentationTime: "+n.presentationTime.toFixed(4)+", presentationTime-expectedDisplayTime: "+(n.presentationTime-n.expectedDisplayTime).toFixed(4)+", expectedDisplayTime-now: "+(n.expectedDisplayTime-t).toFixed(4)+", TimeFromLastSync:"+c.toFixed(4)+", LastSyncPointTime:"+l.syncPoint.playerTime.toFixed(4)+", LastSyncPointFrame:"+l.syncPoint.frame+", LastSyncPoint:"+l.syncPoint.stringTime+" </br>",l.augmentation.offset!=this.lastOffset&&(this.lastOffsetShown=0),this.lastOffset=l.augmentation.offset,this.lastOffsetShown++}if(this.countVid++,this.lastVidDateTime=Date.now(),d>50&&d<70)this.render(p,!1);else if(d>25&&d<35){const f=v=>{let C=document.getElementById("debugText");C!=null&&(C.innerHTML="Rendering now "+v);let Y=document.getElementById("backend-modules");Y!=null&&(Y.innerHTML="Rendering now "+v),this.render(v,!1)};n.expectedDisplayTime-t>5?setTimeout(f,20,p):setTimeout(f,5,p)}else this.countVid%60==0&&console.BBerror("video FPS is "+d.toFixed(4)+". is not supported yet."),(b=this.composer)==null||b.cleanGL();this.video.requestVideoFrameCallback(this.onFrameVideoChromeMac)}onFrameVideoChromeWin(t,n){if(l.hls_fps!=6e4/1001&&l.hls_fps!=3e4/1001){l.stopAugmentFor=3,console.log("Unsupported FPS: options.hls_fps = "+l.hls_fps),video.requestVideoFrameCallback(onFrameVideoChromeWin);return}Date.now()-lastVidDateTime,lastVidDateTime=Date.now();const l=this.options;if(this.lastCalled=="ANI2"&&l.hls_fps==6e4/1001){l.debug&&console.log("This videoCallback can be incorrect. This time doing stuff in requestAnimation frame"),this.video.requestVideoFrameCallback(this.onFrameVideoChromeWin);return}l.hls_fps==3e4/1001?this.lastCalled=="ANI3"&&this.countOfCorrectionsInRow<=0?(this.lastCalled="ANI",this.countOfCorrectionsInRow++):(this.lastCalled="VID",this.countOfCorrectionsInRow=0):this.lastCalled="VID";var a=(n.mediaTime-l.syncPoint.playerTime)%(60*60*24)*(6e4/1001),c=n.mediaTime-l.syncPoint.playerTime;let i=Math.floor(a+.1)+l.syncPoint.frame;if(l.debug){var r=document.getElementById("numberInput").value,d=parseInt(r);i+=d}else i+=1;lastMediaTime=n.mediaTime;let s=document.getElementById("debugText2");var o="";o=M(J(i,this.sourceFPS,!0),!0,!0);var u="";l.augmentation.offset<0?(u+="-",u+=M(J(-1*l.augmentation.offset,this.sourceFPS,!0),!0,!0)):u+=M(J(l.augmentation.offset,this.sourceFPS,!0),!0,!0);let Z=i-l.augmentation.offset;Z<0&&(Z+=5178816),Z>=5178816&&(Z-=5178816),this.metaDataFetcher&&this.metaDataFetcher.setLastFrame(Z);var m="";m=M(J(Z,this.sourceFPS,!0),!0,!0);let p=new Date,h=String(p.getHours()).padStart(2,"0"),R=String(p.getMinutes()).padStart(2,"0"),y=String(p.getSeconds()).padStart(2,"0"),V=String(p.getMilliseconds()).padStart(3,"0"),L=`${h}:${R}:${y}.${V}`;if(l.debug){var G="black";if(l.augmentation.offset!=this.lastOffset||this.lastOffsetShown<10*60)var G="red";s.innerHTML="VID. "+this.countVid+" Game: "+l.gameId+", Time Fired: "+L+", PlayerTime:"+n.mediaTime.toFixed(4)+", dblFrame: "+a.toFixed(4)+", Stream Time-Code: "+o+", offset: <span style='color:"+G+"'>"+l.augmentation.offset+"("+u+")</span> </br> </br><span style='font-size: 30px;'>, Brain Time-Code: "+m+"( "+Z+" )</span> </br> </br>, expectedDisplayTime: "+n.expectedDisplayTime.toFixed(4)+", presentationTime: "+n.presentationTime.toFixed(4)+", presentationTime-expectedDisplayTime: "+(n.presentationTime-n.expectedDisplayTime).toFixed(4)+", expectedDisplayTime-now: "+(n.expectedDisplayTime-t).toFixed(4)+", TimeFromLastSync:"+c.toFixed(4)+", LastSyncPointTime:"+l.syncPoint.playerTime.toFixed(4)+", LastSyncPointFrame:"+l.syncPoint.frame+", LastSyncPoint:"+l.syncPoint.stringTime+" </br>",l.augmentation.offset!=this.lastOffset&&(this.lastOffsetShown=0),this.lastOffset=l.augmentation.offset,this.lastOffsetShown++}if(this.countVid++,l.debug){var W=document.getElementById("plus05CorrectionCheckbox");W.checked}l.hls_fps==3e4/1001?this.renderOnNextFrame=Z:renderingDuration=this.render(Z,!1),this.video.requestVideoFrameCallback(this.onFrameVideoChromeWin)}addNumberToAniDeltaArray(t){this.aniDelltaTimeArray.push(t),this.aniDelltaTimeArray.length>this.aniDelltaTimeArrayCapacity&&this.aniDelltaTimeArray.shift();const l=this.aniDelltaTimeArray.reduce((r,d)=>r+d,0)/this.aniDelltaTimeArray.length,a=this.aniDelltaTimeArray.filter(r=>Math.abs(r-l)<=l*.2);return a.length<this.aniDelltaTimeArrayCapacity*85/100?-1:a.reduce((r,d)=>r+d,0)/a.length}onAnimatedFrameChromeWin(t){this.countANI++;let n=performance.now();var l=n-this.lastAniNow;this.lastAniNow=n;const a=this.options;var c=1e3/this.addNumberToAniDeltaArray(l);if(c==-1e3?(a.stopAugmentFor=3,console.BBerror("Experience difficulties with overloading: (not consistant Calls of requestAnimatedFrame). Stopping augmentation."),console.log(aniDelltaTimeArray)):Math.abs(c-60)>5&&(a.stopAugmentFor=3,console.BBerror("Unsupported FPS: "+c)),!a.debug){let p=document.getElementById("forceUpdate");p!=null&&(p.innerHTML=this.countANI),window.requestAnimationFrame(this.onAnimatedFrameChromeWin);return}let i=String(n.getHours()).padStart(2,"0"),r=String(n.getMinutes()).padStart(2,"0"),d=String(n.getSeconds()).padStart(2,"0"),s=String(n.getMilliseconds()).padStart(3,"0"),o=`${i}:${r}:${d}.${s}`;if(this.video.paused){window.requestAnimationFrame(this.onAnimatedFrameChromeWin);return}let u=document.getElementById("debugText");if(a.debug&&(u.innerHTML="ANI. "+this.countANI+" Time Fired: "+o),a.hls_fps==3e4/1001){u.innerHTML+="VideoTime: "+this.video.currentTime.toFixed(4),this.lastCalled=="VID"?(u.innerHTML+=" rendering on the current frame ",this.render(this.renderOnNextFrame,!1),this.lastCalled="ANI"):this.lastCalled=="ANI"?this.lastCalled="ANI2":this.lastCalled=="ANI2"&&(u.innerHTML+=" extra call. Correcting ",this.render(this.renderOnNextFrame+2,!1),lastCalled="ANI3"),u.innerHTML+="stage:"+this.lastCalled,window.requestAnimationFrame(this.onAnimatedFrameChromeWin);return}else if(a.hls_fps==6e4/1001)if(this.lastCalled=="ANI"||this.lastCalled=="ANI2"){var Z="";Z=M(J(this.lastVideoFrameRenderedInGL+1,this.sourceFPS,!0),!0,!0);var m="";a.augmentation.offset<0?(m+="-",m+=M(J(-1*a.augmentation.offset,this.sourceFPS,!0),!0,!0)):m+=M(J(a.augmentation.offset,this.sourceFPS,!0),!0,!0);let p=this.lastVideoFrameRenderedInGL-a.augmentation.offset;p<0&&(p+=5178816),p>=5178816&&(p-=5178816),M(J(p,this.sourceFPS,!0),!0,!0),a.debug&&(console.log("Probable videoFrameCallback was not fired. Apllying correction mechanism ("+Z+"), stage: "+lastCalled),u.innerHTML+=" correction"),this.render(this.lastVideoFrameRenderedInGL+1,!1),this.lastCalled=="ANI"?this.lastCalled="ANI2":this.lastCalled=="ANI2"&&(this.lastCalled="ANI")}else this.lastCalled="ANI";else console.log("Unsupported FPS: options.hls_fps = "+a.hls_fps);window.requestAnimationFrame(this.onAnimatedFrameChromeWin)}onAnimatedFrameChromeMac(t){this.countAppleANI++;let n,l=M(J(this.frameNumberToRender,this.sourceFPS,!0),!0,!0);this.options.debug&&(n=document.getElementById("debugText"),n.innerHTML=this.countAppleANI);let a=document.getElementById("backend-modules");a!=null&&(a.innerHTML="Rendering now "+this.countAppleANI),this.lastCalled=="VID"?(this.lastCalled="ANI",n.innerHTML="ANI: "+this.countAppleANI+" Stage: "+this.lastCalled+" rendering now"):this.lastCalled=="ANI"?(this.lastCalled="ANI2",n.innerHTML="ANI: "+this.countAppleANI+" Stage: "+l+" correction",this.render(this.lastVideoFrameRenderedInGL+1,!0)):this.lastCalled=="ANI2"&&(this.lastCalled="ANI3",n.innerHTML="ANI: "+this.countAppleANI+" Stage: "+this.lastCalled+" TimeCode: "+l+" extra call"),window.requestAnimationFrame(this.onAnimatedFrameChromeMac)}onAnimatedFrameSafari(t){this.countANI++;let n=new Date;const l=this.options;var a=performance.now(),c=a-this.lastNow;this.lastNow=a;var i=1e3/this.addNumberToAniDeltaArray(c);i==-1e3?(l.stopAugmentFor=3,this.countANI%60==0&&(console.BBerror("Experience difficulties with overloading: (not consistant Calls of requestAnimatedFrame). Stopping augmentation."),console.log(this.aniDelltaTimeArray))):Math.abs(i-60)>5&&(l.stopAugmentFor=3,console.BBerror("Unsupported screen FPS: "+i));let r=String(n.getHours()).padStart(2,"0"),d=String(n.getMinutes()).padStart(2,"0"),s=String(n.getSeconds()).padStart(2,"0"),o=String(n.getMilliseconds()).padStart(3,"0"),u=`${r}:${d}:${s}.${o}`;var Z=2;let m;if(l.debug){m=document.getElementById("debugText");var p=document.getElementById("numberInput").value;Z=parseInt(p)}var h=0,R=(this.video.currentTime-l.syncPoint.playerTime)%(60*60*24)*6e4/1001;h=Math.floor(R)+l.syncPoint.frame;var y=!1;h-this.lastRealFrame==2&&R-this.lastDblFrame<1.5&&(this.lastRealFrame=h,h--,y=!0),y?this.lastRealFrame=h+1:this.lastRealFrame=h,this.lastDblFrame=R,h+=Z;var V=R-Math.floor(R);(this.correction||V<.226&&this.prevFraction<.226)&&(this.correction=!0),V>.8&&(this.correction=!1),this.prevFraction=V,this.correction&&h--;var L="";L=M(J(h,this.sourceFPS,!0),!0,!0);var G="";l.augmentation.offset<0?(G+="-",G+=M(J(-1*l.augmentation.offset,this.sourceFPS,!0),!0,!0)):G+=M(J(l.augmentation.offset,this.sourceFPS,!0),!0,!0);let W=h-l.augmentation.offset;W<0&&(W+=5178816),W>=5178816&&(W-=5178816);var X="";if(X=M(J(W,this.sourceFPS,!0),!0,!0),l.debug){var b="black";if(l.augmentation.offset!=this.lastOffset||this.lastOffsetShown<10*60)var b="red";m.innerHTML=" countAppleANI: "+this.countAppleANI+", Time Fired: "+u+", delta: "+c.toFixed(0)+", screenFPS: "+i.toFixed(4)+", dblFrame: "+R.toFixed(4)+", ANI-VID: "+(n-this.vidFiredTime)+", Game: "+l.gameId+", stremTime: "+L+"( "+h+" ), offset: <span style='color:"+b+"'>"+l.augmentation.offset+"("+G+")</span> </br> </br><span style='font-size: 30px;'>, resultTime: "+X+"("+W+")</span> </br> </br>, LastSyncPointTime:"+l.syncPoint.playerTime.toFixed(4)+", LastSyncPointFrame:"+l.syncPoint.frame+", LastSyncPoint:"+l.syncPoint.stringTime+", correction: "+this.correction+", correction2FrameJump: "+y}this.metaDataFetcher&&this.metaDataFetcher.setLastFrame(W),this.render(W),this.countAppleANI++,window.requestAnimationFrame(this.onAnimatedFrameSafari)}doCalculateBlackBars(t){var n=parseInt(window.getComputedStyle(t).getPropertyValue("width"),10),l=parseInt(window.getComputedStyle(t).getPropertyValue("height"),10),a=t.videoWidth,c=t.videoHeight,i=n/l,r=a/c,d={top:0,bottom:0,left:0,right:0};if(i>r){var s=l*r;d.left=(n-s)/2,d.right=d.left}else if(i<r){var o=n/r;d.top=(l-o)/2,d.bottom=d.top}return d}calculateBlackBars(t){const n=this.getCanvas();if(n){var l=this.doCalculateBlackBars(t);return n.style.top=Math.round(l.top)+"px",n.style.left=Math.round(l.left)+"px",l}}}const ro={OnNewSegment:Symbol("OnNewSegment"),OnMetadata:Symbol("OnMetadata"),None:Symbol("None")};function so(){this.__data__=[],this.size=0}var oo=so;function uo(e,t){return e===t||e!==e&&t!==t}var Kt=uo,mo=Kt;function Zo(e,t){for(var n=e.length;n--;)if(mo(e[n][0],t))return n;return-1}var Tt=Zo,ho=Tt,bo=Array.prototype,po=bo.splice;function Go(e){var t=this.__data__,n=ho(t,e);if(n<0)return!1;var l=t.length-1;return n==l?t.pop():po.call(t,n,1),--this.size,!0}var yo=Go,Xo=Tt;function Vo(e){var t=this.__data__,n=Xo(t,e);return n<0?void 0:t[n][1]}var Wo=Vo,Ro=Tt;function fo(e){return Ro(this.__data__,e)>-1}var Lo=fo,Yo=Tt;function vo(e,t){var n=this.__data__,l=Yo(n,e);return l<0?(++this.size,n.push([e,t])):n[l][1]=t,this}var go=vo,Fo=oo,Co=yo,xo=Wo,So=Lo,Io=go;function Ue(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t<n;){var l=e[t];this.set(l[0],l[1])}}Ue.prototype.clear=Fo,Ue.prototype.delete=Co,Ue.prototype.get=xo,Ue.prototype.has=So,Ue.prototype.set=Io;var Ht=Ue,zo=Ht;function Mo(){this.__data__=new zo,this.size=0}var Jo=Mo;function No(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}var ko=No;function Ko(e){return this.__data__.get(e)}var To=Ko;function Ho(e){return this.__data__.has(e)}var Uo=Ho,wo=typeof Rt=="object"&&Rt&&Rt.Object===Object&&Rt,Ja=wo,Bo=Ja,Qo=typeof self=="object"&&self&&self.Object===Object&&self,Po=Bo||Qo||Function("return this")(),we=Po,Eo=we,Do=Eo.Symbol,Na=Do,ka=Na,Ka=Object.prototype,jo=Ka.hasOwnProperty,Oo=Ka.toString,ot=ka?ka.toStringTag:void 0;function Ao(e){var t=jo.call(e,ot),n=e[ot];try{e[ot]=void 0;var l=!0}catch{}var a=Oo.call(e);return l&&(t?e[ot]=n:delete e[ot]),a}var _o=Ao,$o=Object.prototype,qo=$o.toString;function ed(e){return qo.call(e)}var td=ed,Ta=Na,nd=_o,ld=td,ad="[object Null]",cd="[object Undefined]",Ha=Ta?Ta.toStringTag:void 0;function id(e){return e==null?e===void 0?cd:ad:Ha&&Ha in Object(e)?nd(e):ld(e)}var Ut=id;function rd(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var Ge=rd,sd=Ut,od=Ge,dd="[object AsyncFunction]",ud="[object Function]",md="[object GeneratorFunction]",Zd="[object Proxy]";function hd(e){if(!od(e))return!1;var t=sd(e);return t==ud||t==md||t==dd||t==Zd}var On=hd,bd=we,pd=bd["__core-js_shared__"],Gd=pd,An=Gd,Ua=function(){var e=/[^.]+$/.exec(An&&An.keys&&An.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function yd(e){return!!Ua&&Ua in e}var Xd=yd,Vd=Function.prototype,Wd=Vd.toString;function Rd(e){if(e!=null){try{return Wd.call(e)}catch{}try{return e+""}catch{}}return""}var fd=Rd,Ld=On,Yd=Xd,vd=Ge,gd=fd,Fd=/[\\^$.*+?()[\]{}|]/g,Cd=/^\[object .+?Constructor\]$/,xd=Function.prototype,Sd=Object.prototype,Id=xd.toString,zd=Sd.hasOwnProperty,Md=RegExp("^"+Id.call(zd).replace(Fd,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function Jd(e){if(!vd(e)||Yd(e))return!1;var t=Ld(e)?Md:Cd;return t.test(gd(e))}var Nd=Jd;function kd(e,t){return e==null?void 0:e[t]}var Kd=kd,Td=Nd,Hd=Kd;function Ud(e,t){var n=Hd(e,t);return Td(n)?n:void 0}var _n=Ud,wd=_n,Bd=we,Qd=wd(Bd,"Map"),wa=Qd,Pd=_n,Ed=Pd(Object,"create"),wt=Ed,Ba=wt;function Dd(){this.__data__=Ba?Ba(null):{},this.size=0}var jd=Dd;function Od(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var Ad=Od,_d=wt,$d="__lodash_hash_undefined__",qd=Object.prototype,eu=qd.hasOwnProperty;function tu(e){var t=this.__data__;if(_d){var n=t[e];return n===$d?void 0:n}return eu.call(t,e)?t[e]:void 0}var nu=tu,lu=wt,au=Object.prototype,cu=au.hasOwnProperty;function iu(e){var t=this.__data__;return lu?t[e]!==void 0:cu.call(t,e)}var ru=iu,su=wt,ou="__lodash_hash_undefined__";function du(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=su&&t===void 0?ou:t,this}var uu=du,mu=jd,Zu=Ad,hu=nu,bu=ru,pu=uu;function Be(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t<n;){var l=e[t];this.set(l[0],l[1])}}Be.prototype.clear=mu,Be.prototype.delete=Zu,Be.prototype.get=hu,Be.prototype.has=bu,Be.prototype.set=pu;var Gu=Be,Qa=Gu,yu=Ht,Xu=wa;function Vu(){this.size=0,this.__data__={hash:new Qa,map:new(Xu||yu),string:new Qa}}var Wu=Vu;function Ru(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var fu=Ru,Lu=fu;function Yu(e,t){var n=e.__data__;return Lu(t)?n[typeof t=="string"?"string":"hash"]:n.map}var Bt=Yu,vu=Bt;function gu(e){var t=vu(this,e).delete(e);return this.size-=t?1:0,t}var Fu=gu,Cu=Bt;function xu(e){return Cu(this,e).get(e)}var Su=xu,Iu=Bt;function zu(e){return Iu(this,e).has(e)}var Mu=zu,Ju=Bt;function Nu(e,t){var n=Ju(this,e),l=n.size;return n.set(e,t),this.size+=n.size==l?0:1,this}var ku=Nu,Ku=Wu,Tu=Fu,Hu=Su,Uu=Mu,wu=ku;function Qe(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t<n;){var l=e[t];this.set(l[0],l[1])}}Qe.prototype.clear=Ku,Qe.prototype.delete=Tu,Qe.prototype.get=Hu,Qe.prototype.has=Uu,Qe.prototype.set=wu;var Bu=Qe,Qu=Ht,Pu=wa,Eu=Bu,Du=200;function ju(e,t){var n=this.__data__;if(n instanceof Qu){var l=n.__data__;if(!Pu||l.length<Du-1)return l.push([e,t]),this.size=++n.size,this;n=this.__data__=new Eu(l)}return n.set(e,t),this.size=n.size,this}var Ou=ju,Au=Ht,_u=Jo,$u=ko,qu=To,em=Uo,tm=Ou;function Pe(e){var t=this.__data__=new Au(e);this.size=t.size}Pe.prototype.clear=_u,Pe.prototype.delete=$u,Pe.prototype.get=qu,Pe.prototype.has=em,Pe.prototype.set=tm;var nm=Pe,lm=_n,am=function(){try{var e=lm(Object,"defineProperty");return e({},"",{}),e}catch{}}(),Pa=am,Ea=Pa;function cm(e,t,n){t=="__proto__"&&Ea?Ea(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}var $n=cm,im=$n,rm=Kt;function sm(e,t,n){(n!==void 0&&!rm(e[t],n)||n===void 0&&!(t in e))&&im(e,t,n)}var Da=sm;function om(e){return function(t,n,l){for(var a=-1,c=Object(t),i=l(t),r=i.length;r--;){var d=i[e?r:++a];if(n(c[d],d,c)===!1)break}return t}}var dm=om,um=dm,mm=um(),Zm=mm,Qt={exports:{}};Qt.exports,function(e,t){var n=we,l=t&&!t.nodeType&&t,a=l&&!0&&e&&!e.nodeType&&e,c=a&&a.exports===l,i=c?n.Buffer:void 0,r=i?i.allocUnsafe:void 0;function d(s,o){if(o)return s.slice();var u=s.length,Z=r?r(u):new s.constructor(u);return s.copy(Z),Z}e.exports=d}(Qt,Qt.exports);var hm=Qt.exports,bm=we,pm=bm.Uint8Array,Gm=pm,ja=Gm;function ym(e){var t=new e.constructor(e.byteLength);return new ja(t).set(new ja(e)),t}var Xm=ym,Vm=Xm;function Wm(e,t){var n=t?Vm(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}var Rm=Wm;function fm(e,t){var n=-1,l=e.length;for(t||(t=Array(l));++n<l;)t[n]=e[n];return t}var Lm=fm,Ym=Ge,Oa=Object.create,vm=function(){function e(){}return function(t){if(!Ym(t))return{};if(Oa)return Oa(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}(),gm=vm;function Fm(e,t){return function(n){return e(t(n))}}var Cm=Fm,xm=Cm,Sm=xm(Object.getPrototypeOf,Object),Aa=Sm,Im=Object.prototype;function zm(e){var t=e&&e.constructor,n=typeof t=="function"&&t.prototype||Im;return e===n}var _a=zm,Mm=gm,Jm=Aa,Nm=_a;function km(e){return typeof e.constructor=="function"&&!Nm(e)?Mm(Jm(e)):{}}var Km=km;function Tm(e){return e!=null&&typeof e=="object"}var dt=Tm,Hm=Ut,Um=dt,wm="[object Arguments]";function Bm(e){return Um(e)&&Hm(e)==wm}var Qm=Bm,$a=Qm,Pm=dt,qa=Object.prototype,Em=qa.hasOwnProperty,Dm=qa.propertyIsEnumerable,jm=$a(function(){return arguments}())?$a:function(e){return Pm(e)&&Em.call(e,"callee")&&!Dm.call(e,"callee")},ec=jm,Om=Array.isArray,tc=Om,Am=9007199254740991;function _m(e){return typeof e=="number"&&e>-1&&e%1==0&&e<=Am}var nc=_m,$m=On,qm=nc;function eZ(e){return e!=null&&qm(e.length)&&!$m(e)}var qn=eZ,tZ=qn,nZ=dt;function lZ(e){return nZ(e)&&tZ(e)}var aZ=lZ,Pt={exports:{}};function cZ(){return!1}var iZ=cZ;Pt.exports,function(e,t){var n=we,l=iZ,a=t&&!t.nodeType&&t,c=a&&!0&&e&&!e.nodeType&&e,i=c&&c.exports===a,r=i?n.Buffer:void 0,d=r?r.isBuffer:void 0,s=d||l;e.exports=s}(Pt,Pt.exports);var lc=Pt.exports,rZ=Ut,sZ=Aa,oZ=dt,dZ="[object Object]",uZ=Function.prototype,mZ=Object.prototype,ac=uZ.toString,ZZ=mZ.hasOwnProperty,hZ=ac.call(Object);function bZ(e){if(!oZ(e)||rZ(e)!=dZ)return!1;var t=sZ(e);if(t===null)return!0;var n=ZZ.call(t,"constructor")&&t.constructor;return typeof n=="function"&&n instanceof n&&ac.call(n)==hZ}var pZ=bZ,GZ=Ut,yZ=nc,XZ=dt,VZ="[object Arguments]",WZ="[object Array]",RZ="[object Boolean]",fZ="[object Date]",LZ="[object Error]",YZ="[object Function]",vZ="[object Map]",gZ="[object Number]",FZ="[object Object]",CZ="[object RegExp]",xZ="[object Set]",SZ="[object String]",IZ="[object WeakMap]",zZ="[object ArrayBuffer]",MZ="[object DataView]",JZ="[object Float32Array]",NZ="[object Float64Array]",kZ="[object Int8Array]",KZ="[object Int16Array]",TZ="[object Int32Array]",HZ="[object Uint8Array]",UZ="[object Uint8ClampedArray]",wZ="[object Uint16Array]",BZ="[object Uint32Array]",N={};N[JZ]=N[NZ]=N[kZ]=N[KZ]=N[TZ]=N[HZ]=N[UZ]=N[wZ]=N[BZ]=!0,N[VZ]=N[WZ]=N[zZ]=N[RZ]=N[MZ]=N[fZ]=N[LZ]=N[YZ]=N[vZ]=N[gZ]=N[FZ]=N[CZ]=N[xZ]=N[SZ]=N[IZ]=!1;function QZ(e){return XZ(e)&&yZ(e.length)&&!!N[GZ(e)]}var PZ=QZ;function EZ(e){return function(t){return e(t)}}var DZ=EZ,Et={exports:{}};Et.exports,function(e,t){var n=Ja,l=t&&!t.nodeType&&t,a=l&&!0&&e&&!e.nodeType&&e,c=a&&a.exports===l,i=c&&n.process,r=function(){try{var d=a&&a.require&&a.require("util").types;return d||i&&i.binding&&i.binding("util")}catch{}}();e.exports=r}(Et,Et.exports);var jZ=Et.exports,OZ=PZ,AZ=DZ,cc=jZ,ic=cc&&cc.isTypedArray,_Z=ic?AZ(ic):OZ,rc=_Z;function $Z(e,t){if(!(t==="constructor"&&typeof e[t]=="function")&&t!="__proto__")return e[t]}var sc=$Z,qZ=$n,eh=Kt,th=Object.prototype,nh=th.hasOwnProperty;function lh(e,t,n){var l=e[t];(!(nh.call(e,t)&&eh(l,n))||n===void 0&&!(t in e))&&qZ(e,t,n)}var ah=lh,ch=ah,ih=$n;function rh(e,t,n,l){var a=!n;n||(n={});for(var c=-1,i=t.length;++c<i;){var r=t[c],d=l?l(n[r],e[r],r,n,e):void 0;d===void 0&&(d=e[r]),a?ih(n,r,d):ch(n,r,d)}return n}var sh=rh;function oh(e,t){for(var n=-1,l=Array(e);++n<e;)l[n]=t(n);return l}var dh=oh,uh=9007199254740991,mh=/^(?:0|[1-9]\d*)$/;function Zh(e,t){var n=typeof e;return t=t??uh,!!t&&(n=="number"||n!="symbol"&&mh.test(e))&&e>-1&&e%1==0&&e<t}var oc=Zh,hh=dh,bh=ec,ph=tc,Gh=lc,yh=oc,Xh=rc,Vh=Object.prototype,Wh=Vh.hasOwnProperty;function Rh(e,t){var n=ph(e),l=!n&&bh(e),a=!n&&!l&&Gh(e),c=!n&&!l&&!a&&Xh(e),i=n||l||a||c,r=i?hh(e.length,String):[],d=r.length;for(var s in e)(t||Wh.call(e,s))&&!(i&&(s=="length"||a&&(s=="offset"||s=="parent")||c&&(s=="buffer"||s=="byteLength"||s=="byteOffset")||yh(s,d)))&&r.push(s);return r}var fh=Rh;function Lh(e){var t=[];if(e!=null)for(var n in Object(e))t.push(n);return t}var Yh=Lh,vh=Ge,gh=_a,Fh=Yh,Ch=Object.prototype,xh=Ch.hasOwnProperty;function Sh(e){if(!vh(e))return Fh(e);var t=gh(e),n=[];for(var l in e)l=="constructor"&&(t||!xh.call(e,l))||n.push(l);return n}var Ih=Sh,zh=fh,Mh=Ih,Jh=qn;function Nh(e){return Jh(e)?zh(e,!0):Mh(e)}var dc=Nh,kh=sh,Kh=dc;function Th(e){return kh(e,Kh(e))}var Hh=Th,uc=Da,Uh=hm,wh=Rm,Bh=Lm,Qh=Km,mc=ec,Zc=tc,Ph=aZ,Eh=lc,Dh=On,jh=Ge,Oh=pZ,Ah=rc,hc=sc,_h=Hh;function $h(e,t,n,l,a,c,i){var r=hc(e,n),d=hc(t,n),s=i.get(d);if(s){uc(e,n,s);return}var o=c?c(r,d,n+"",e,t,i):void 0,u=o===void 0;if(u){var Z=Zc(d),m=!Z&&Eh(d),p=!Z&&!m&&Ah(d);o=d,Z||m||p?Zc(r)?o=r:Ph(r)?o=Bh(r):m?(u=!1,o=Uh(d,!0)):p?(u=!1,o=wh(d,!0)):o=[]:Oh(d)||mc(d)?(o=r,mc(r)?o=_h(r):(!jh(r)||Dh(r))&&(o=Qh(d))):u=!1}u&&(i.set(d,o),a(o,d,l,c,i),i.delete(d)),uc(e,n,o)}var qh=$h,eb=nm,tb=Da,nb=Zm,lb=qh,ab=Ge,cb=dc,ib=sc;function bc(e,t,n,l,a){e!==t&&nb(t,function(c,i){if(a||(a=new eb),ab(c))lb(e,t,i,n,bc,l,a);else{var r=l?l(ib(e,i),c,i+"",e,t,a):void 0;r===void 0&&(r=c),tb(e,i,r)}},cb)}var rb=bc;function sb(e){return e}var pc=sb;function ob(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}var db=ob,ub=db,Gc=Math.max;function mb(e,t,n){return t=Gc(t===void 0?e.length-1:t,0),function(){for(var l=arguments,a=-1,c=Gc(l.length-t,0),i=Array(c);++a<c;)i[a]=l[t+a];a=-1;for(var r=Array(t+1);++a<t;)r[a]=l[a];return r[t]=n(i),ub(e,this,r)}}var Zb=mb;function hb(e){return function(){return e}}var bb=hb,pb=bb,yc=Pa,Gb=pc,yb=yc?function(e,t){return yc(e,"toString",{configurable:!0,enumerable:!1,value:pb(t),writable:!0})}:Gb,Xb=yb,Vb=800,Wb=16,Rb=Date.now;function fb(e){var t=0,n=0;return function(){var l=Rb(),a=Wb-(l-n);if(n=l,a>0){if(++t>=Vb)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var Lb=fb,Yb=Xb,vb=Lb,gb=vb(Yb),Fb=gb,Cb=pc,xb=Zb,Sb=Fb;function Ib(e,t){return Sb(xb(e,t,Cb),e+"")}var zb=Ib,Mb=Kt,Jb=qn,Nb=oc,kb=Ge;function Kb(e,t,n){if(!kb(n))return!1;var l=typeof t;return(l=="number"?Jb(n)&&Nb(t,n.length):l=="string"&&t in n)?Mb(n[t],e):!1}var Tb=Kb,Hb=zb,Ub=Tb;function wb(e){return Hb(function(t,n){var l=-1,a=n.length,c=a>1?n[a-1]:void 0,i=a>2?n[2]:void 0;for(c=e.length>3&&typeof c=="function"?(a--,c):void 0,i&&Ub(n[0],n[1],i)&&(c=a<3?void 0:c,a=1),t=Object(t);++l<a;){var r=n[l];r&&e(t,r,l,c)}return t})}var Bb=wb,Qb=rb,Pb=Bb,Eb=Pb(function(e,t,n){Qb(e,t,n)}),Db=Eb;const jb=Pl(Db);var K={log:"log",debug:"debug",info:"info",warn:"warn",error:"error"},ne=console,ye={};Object.keys(K).forEach(function(e){ye[e]=ne[e]});var ut="Datadog Browser SDK:",B={debug:ye.debug.bind(ne,ut),log:ye.log.bind(ne,ut),info:ye.info.bind(ne,ut),warn:ye.warn.bind(ne,ut),error:ye.error.bind(ne,ut)},el="https://docs.datadoghq.com",Xc="".concat(el,"/real_user_monitoring/browser/troubleshooting"),Dt="More details:";function Vc(e,t){return function(){for(var n=[],l=0;l<arguments.length;l++)n[l]=arguments[l];try{return e.apply(void 0,n)}catch(a){B.error(t,a)}}}function jt(e){return e!==0&&Math.random()*100<=e}function Ob(e){return Ab(e)&&e>=0&&e<=100}function Ab(e){return typeof e=="number"}var mt=1e3,Xe=60*mt,_b=60*Xe;function Zt(){return new Date().getTime()}function ue(){return Zt()}function Ot(){return performance.now()}function me(){return{relative:Ot(),timeStamp:ue()}}function $b(){return{relative:0,timeStamp:Wc()}}function qb(e,t){return t-e}function e0(e,t){return e+t}function t0(e){return e-Wc()}var tl;function Wc(){return tl===void 0&&(tl=performance.timing.navigationStart),tl}var le=1024,Rc=1024*le,n0=/[^\u0000-\u007F]/;function nl(e){return n0.test(e)?window.TextEncoder!==void 0?new TextEncoder().encode(e).length:new Blob([e]).size:e.length}function Ee(e,t){return e.indexOf(t)!==-1}function ll(e){if(Array.from)return Array.from(e);var t=[];if(e instanceof Set)e.forEach(function(l){return t.push(l)});else for(var n=0;n<e.length;n++)t.push(e[n]);return t}function l0(e,t){for(var n=0;n<e.length;n+=1){var l=e[n];if(t(l,n))return l}}function De(e){return Object.keys(e).map(function(t){return e[t]})}function a0(e){return Object.keys(e).map(function(t){return[t,e[t]]})}function al(e,t){return e.slice(0,t.length)===t}function c0(e,t){return e.slice(-t.length)===t}function P(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return t.forEach(function(l){for(var a in l)Object.prototype.hasOwnProperty.call(l,a)&&(e[a]=l[a])}),e}function i0(e){return P({},e)}function fc(e,t){return Object.keys(e).some(function(n){return e[n]===t})}function cl(e){return Object.keys(e).length===0}function Ze(){if(typeof globalThis=="object")return globalThis;Object.defineProperty(Object.prototype,"_dd_temp_",{get:function(){return this},configurable:!0});var e=_dd_temp_;return delete Object.prototype._dd_temp_,typeof e!="object"&&(typeof self=="object"?e=self:typeof window=="object"?e=window:e={}),e}function je(e,t){var n=Ze(),l;return n.Zone&&typeof n.Zone.__symbol__=="function"&&(l=e[n.Zone.__symbol__(t)]),l||(l=e[t]),l}var r0=function(e,t,n){if(n||arguments.length===2)for(var l=0,a=t.length,c;l<a;l++)(c||!(l in t))&&(c||(c=Array.prototype.slice.call(t,0,l)),c[l]=t[l]);return e.concat(c||Array.prototype.slice.call(t))},At,Lc=!1;function s0(e){At=e}function o0(e){Lc=e}function d0(e,t,n){var l=n.value;n.value=function(){for(var a=[],c=0;c<arguments.length;c++)a[c]=arguments[c];var i=At?z(l):l;return i.apply(this,a)}}function z(e){return function(){return ht(e,this,arguments)}}function ht(e,t,n){try{return e.apply(t,n)}catch(l){if(il(l),At)try{At(l)}catch(a){il(a)}}}function il(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];Lc&&B.error.apply(B,r0(["[MONITOR]"],e,!1))}function bt(e,t){return je(Ze(),"setTimeout")(z(e),t)}function Yc(e){je(Ze(),"clearTimeout")(e)}function rl(e,t){return je(Ze(),"setInterval")(z(e),t)}function vc(e){je(Ze(),"clearInterval")(e)}var Q=function(){function e(t){this.onFirstSubscribe=t,this.observers=[]}return e.prototype.subscribe=function(t){var n=this;return this.observers.push(t),this.observers.length===1&&this.onFirstSubscribe&&(this.onLastUnsubscribe=this.onFirstSubscribe(this)||void 0),{unsubscribe:function(){n.observers=n.observers.filter(function(l){return t!==l}),!n.observers.length&&n.onLastUnsubscribe&&n.onLastUnsubscribe()}}},e.prototype.notify=function(t){this.observers.forEach(function(n){return n(t)})},e}();function gc(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return new Q(function(n){var l=e.map(function(a){return a.subscribe(function(c){return n.notify(c)})});return function(){return l.forEach(function(a){return a.unsubscribe()})}})}function Fc(e,t,n){var l=!1,a,c;return{throttled:function(){for(var i=[],r=0;r<arguments.length;r++)i[r]=arguments[r];if(l){a=i;return}e.apply(void 0,i),l=!0,c=bt(function(){a&&e.apply(void 0,a),l=!1,a=void 0},t)},cancel:function(){Yc(c),l=!1,a=void 0}}}function he(){}function Ve(e){return e?(parseInt(e,10)^Math.random()*16>>parseInt(e,10)/4).toString(16):"".concat(1e7,"-").concat(1e3,"-").concat(4e3,"-").concat(8e3,"-").concat(1e11).replace(/[018]/g,Ve)}var _t=/([\w-]+)\s*=\s*([^;]+)/g;function u0(e,t){for(_t.lastIndex=0;;){var n=_t.exec(e);if(n){if(n[1]===t)return n[2]}else break}}function m0(e){var t=new Map;for(_t.lastIndex=0;;){var n=_t.exec(e);if(n)t.set(n[1],n[2]);else break}return t}function Z0(e,t,n){var l=e.charCodeAt(t-1),a=l>=55296&&l<=56319,c=a?t+1:t;return e.length<=c?e:"".concat(e.slice(0,c)).concat(n)}function h0(){return b0()===1}var $t;function b0(){return $t??($t=p0())}function p0(e){var t;e===void 0&&(e=window);var n=e.navigator.userAgent;return e.chrome||/HeadlessChrome/.test(n)?1:((t=e.navigator.vendor)===null||t===void 0?void 0:t.indexOf("Apple"))===0||/safari/i.test(n)&&!/chrome|android/i.test(n)?2:e.document.documentMode?0:3}function pt(e,t,n,l){var a=new Date;a.setTime(a.getTime()+n);var c="expires=".concat(a.toUTCString()),i=l&&l.crossSite?"none":"strict",r=l&&l.domain?";domain=".concat(l.domain):"",d=l&&l.secure?";secure":"",s=l&&l.partitioned?";partitioned":"";document.cookie="".concat(e,"=").concat(t,";").concat(c,";path=/;samesite=").concat(i).concat(r).concat(d).concat(s)}function sl(e){return u0(document.cookie,e)}var ol;function We(e){return ol||(ol=m0(document.cookie)),ol.get(e)}function Cc(e,t){pt(e,"",0,t)}function G0(e){if(document.cookie===void 0||document.cookie===null)return!1;try{var t="dd_cookie_test_".concat(Ve()),n="test";pt(t,n,Xe,e);var l=sl(t)===n;return Cc(t,e),l}catch(a){return B.error(a),!1}}var dl;function y0(){if(dl===void 0){for(var e="dd_site_test_".concat(Ve()),t="test",n=window.location.hostname.split("."),l=n.pop();n.length&&!sl(e);)l="".concat(n.pop(),".").concat(l),pt(e,t,mt,{domain:l});Cc(e,{domain:l}),dl=l}return dl}var Oe="_dd_s",ul=4*_b,xc=15*Xe,Sc=/^([a-zA-Z]+)=([a-z0-9-]+)$/,ml="&",X0="1";function Re(){return{isExpired:X0}}function qt(e){return cl(e)}function Ic(e){return!qt(e)}function en(e){return e.isExpired!==void 0||!V0(e)}function V0(e){return(e.created===void 0||Zt()-Number(e.created)<ul)&&(e.expire===void 0||Zt()<Number(e.expire))}function zc(e){e.expire=String(Zt()+xc)}function Zl(e){return a0(e).map(function(t){var n=t[0],l=t[1];return"".concat(n,"=").concat(l)}).join(ml)}function Mc(e){var t={};return W0(e)&&e.split(ml).forEach(function(n){var l=Sc.exec(n);if(l!==null){var a=l[1],c=l[2];t[a]=c}}),t}function W0(e){return!!e&&(e.indexOf(ml)!==-1||Sc.test(e))}var R0="_dd",f0="_dd_r",L0="_dd_l",Y0="rum",v0="logs";function g0(e){var t=We(Oe);if(!t){var n=We(R0),l=We(f0),a=We(L0),c={};n&&(c.id=n),a&&/^[01]$/.test(a)&&(c[v0]=a),l&&/^[012]$/.test(l)&&(c[Y0]=l),Ic(c)&&(zc(c),e.persistSession(c))}}function F0(e){var t=z0(e);return G0(t)?{type:"Cookie",cookieOptions:t}:void 0}function C0(e){var t={isLockEnabled:h0(),persistSession:x0(e),retrieveSession:I0,expireSession:function(){return S0(e)}};return g0(t),t}function x0(e){return function(t){pt(Oe,Zl(t),xc,e)}}function S0(e){pt(Oe,Zl(Re()),ul,e)}function I0(){var e=sl(Oe);return Mc(e)}function z0(e){var t={};return t.secure=!!e.useSecureSessionCookie||!!e.usePartitionedCrossSiteSessionCookie||!!e.useCrossSiteSessionCookie,t.crossSite=!!e.usePartitionedCrossSiteSessionCookie||!!e.useCrossSiteSessionCookie,t.partitioned=!!e.usePartitionedCrossSiteSessionCookie,e.trackSessionAcrossSubdomains&&(t.domain=y0()),t}var M0="_dd_test_";function J0(){try{var e=Ve(),t="".concat(M0).concat(e);localStorage.setItem(t,e);var n=localStorage.getItem(t);return localStorage.removeItem(t),e===n?{type:"LocalStorage"}:void 0}catch{return}}function N0(){return{isLockEnabled:!1,persistSession:Jc,retrieveSession:k0,expireSession:K0}}function Jc(e){localStorage.setItem(Oe,Zl(e))}function k0(){var e=localStorage.getItem(Oe);return Mc(e)}function K0(){Jc(Re())}var T0=10,H0=100,Nc=[],tn;function fe(e,t,n){var l;n===void 0&&(n=0);var a=t.isLockEnabled,c=t.persistSession,i=t.expireSession,r=function(Z){return c(P({},Z,{lock:s}))},d=function(){var Z=t.retrieveSession(),m=Z.lock;return Z.lock&&delete Z.lock,{session:Z,lock:m}};if(tn||(tn=e),e!==tn){Nc.push(e);return}if(a&&n>=H0){kc(t);return}var s,o=d();if(a){if(o.lock){nn(e,t,n);return}if(s=Ve(),r(o.session),o=d(),o.lock!==s){nn(e,t,n);return}}var u=e.process(o.session);if(a&&(o=d(),o.lock!==s)){nn(e,t,n);return}if(u&&(en(u)?i():(zc(u),a?r(u):c(u))),a&&!(u&&en(u))){if(o=d(),o.lock!==s){nn(e,t,n);return}c(o.session),u=o.session}(l=e.after)===null||l===void 0||l.call(e,u||o.session),kc(t)}function nn(e,t,n){bt(function(){fe(e,t,n+1)},T0)}function kc(e){tn=void 0;var t=Nc.shift();t&&fe(t,e)}var Kc=mt;function U0(e){var t=F0(e);return!t&&e.allowFallbackToLocalStorage&&(t=J0()),t}function w0(e,t,n){var l=new Q,a=new Q,c=new Q,i=e.type==="Cookie"?C0(e.cookieOptions):N0(),r=i.expireSession,d=rl(p,Kc),s;R();var o=Fc(function(){fe({process:function(b){if(!qt(b)){var f=h(b);return y(f),f}},after:function(b){Ic(b)&&!V()&&W(b),s=b}},i)},Kc),u=o.throttled,Z=o.cancel;function m(){fe({process:function(b){return V()?h(b):void 0}},i)}function p(){fe({process:function(b){return en(b)?Re():void 0},after:h},i)}function h(b){return en(b)&&(b=Re()),V()&&(L(b)?G():(c.notify({previousState:s,newState:b}),s=b)),b}function R(){fe({process:function(b){if(qt(b))return Re()},after:function(b){s=b}},i)}function y(b){if(qt(b))return!1;var f=n(b[t]),v=f.trackingType,C=f.isTracked;b[t]=v,delete b.isExpired,C&&!b.id&&(b.id=Ve(),b.created=String(Zt()))}function V(){return s[t]!==void 0}function L(b){return s.id!==b.id||s[t]!==b[t]}function G(){s=Re(),a.notify()}function W(b){s=b,l.notify()}function X(b){fe({process:function(f){return P({},f,b)},after:h},i)}return{expandOrRenewSession:u,expandSession:m,getSession:function(){return s},renewObservable:l,expireObservable:a,sessionStateUpdateObservable:c,restartSession:R,expire:function(){Z(),r(),h(Re())},stop:function(){vc(d)},updateSessionState:X}}var hl={GRANTED:"granted",NOT_GRANTED:"not-granted"};function B0(e){var t=new Q;return{tryToInit:function(n){e||(e=n)},update:function(n){e=n,t.notify()},isGranted:function(){return e===hl.GRANTED},observable:t}}function Le(e,t,n){if(typeof e!="object"||e===null)return JSON.stringify(e);var l=Ae(Object.prototype),a=Ae(Array.prototype),c=Ae(Object.getPrototypeOf(e)),i=Ae(e);try{return JSON.stringify(e,t,n)}catch{return"<error: unable to serialize object>"}finally{l(),a(),c(),i()}}function Ae(e){var t=e,n=t.toJSON;return n?(delete t.toJSON,function(){t.toJSON=n}):he}function bl(e){return Q0(e,location.href).href}function Q0(e,t){var n=P0();if(n)try{return t!==void 0?new n(e,t):new n(e)}catch(i){throw new Error("Failed to construct URL: ".concat(String(i)," ").concat(Le({url:e,base:t})))}if(t===void 0&&!/:/.test(e))throw new Error("Invalid URL: '".concat(e,"'"));var l=document,a=l.createElement("a");if(t!==void 0){l=document.implementation.createHTMLDocument("");var c=l.createElement("base");c.href=t,l.head.appendChild(c),l.body.appendChild(a)}return a.href=e,a}var Tc=URL,ln;function P0(){if(ln===void 0)try{var e=new Tc("http://test/path");ln=e.href==="http://test/path"}catch{ln=!1}return ln?Tc:void 0}var E0="datad0g.com",D0="dd0g-gov.com",Ye="datadoghq.com",j0="ddog-gov.com",Hc="pci.browser-intake-datadoghq.com";function Gt(e,t,n){var l=O0(e,t);return{build:function(a,c){var i=_0(e,t,n,a,c);return l(i)},urlPrefix:l(""),trackType:t}}function O0(e,t){var n="/api/v2/".concat(t),l=e.proxy;if(typeof l=="string"){var a=bl(l);return function(i){return"".concat(a,"?ddforward=").concat(encodeURIComponent("".concat(n,"?").concat(i)))}}if(typeof l=="function")return function(i){return l({path:n,parameters:i})};var c=A0(t,e);return function(i){return"https://".concat(c).concat(n,"?").concat(i)}}function A0(e,t){var n=t.site,l=n===void 0?Ye:n,a=t.internalAnalyticsSubdomain;if(e==="logs"&&t.usePciIntake&&l===Ye)return Hc;if(a&&l===Ye)return"".concat(a,".").concat(Ye);if(l===D0)return"http-intake.logs.".concat(l);var c=l.split("."),i=c.pop();return"browser-intake-".concat(c.join("-"),".").concat(i)}function _0(e,t,n,l,a){var c=e.clientToken,i=e.internalAnalyticsSubdomain,r=a.retry,d=a.encoding,s=["sdk_version:".concat("5.29.1"),"api:".concat(l)].concat(n);r&&s.push("retry_count:".concat(r.count),"retry_after:".concat(r.lastFailureStatus));var o=["ddsource=browser","ddtags=".concat(encodeURIComponent(s.join(","))),"dd-api-key=".concat(c),"dd-evp-origin-version=".concat(encodeURIComponent("5.29.1")),"dd-evp-origin=browser","dd-request-id=".concat(Ve())];return d&&o.push("dd-evp-encoding=".concat(d)),t==="rum"&&o.push("batch_time=".concat(ue())),i&&o.reverse(),o.join("&")}var $0=200;function q0(e){var t=e.env,n=e.service,l=e.version,a=e.datacenter,c=[];return t&&c.push(an("env",t)),n&&c.push(an("service",n)),l&&c.push(an("version",l)),a&&c.push(an("datacenter",a)),c}function an(e,t){var n=$0-e.length-1;(t.length>n||ep(t))&&B.warn("".concat(e," value doesn't meet tag requirements and will be sanitized. ").concat(Dt," ").concat(el,"/getting_started/tagging/#defining-tags"));var l=t.replace(/,/g,"_");return"".concat(e,":").concat(l)}function ep(e){return tp()?new RegExp("[^\\p{Ll}\\p{Lo}0-9_:./-]","u").test(e):!1}function tp(){try{return new RegExp("[\\p{Ll}]","u"),!0}catch{return!1}}function np(e){var t=e.site||Ye,n=q0(e),l=lp(e,n),a=cp(l,t),c=ap(e,a,n);return P({isIntakeUrl:function(i){return a.some(function(r){return i.indexOf(r)===0})},replica:c,site:t},l)}function lp(e,t){return{logsEndpointBuilder:Gt(e,"logs",t),rumEndpointBuilder:Gt(e,"rum",t),sessionReplayEndpointBuilder:Gt(e,"replay",t)}}function ap(e,t,n){if(e.replica){var l=P({},e,{site:Ye,clientToken:e.replica.clientToken}),a={logsEndpointBuilder:Gt(l,"logs",n),rumEndpointBuilder:Gt(l,"rum",n)};return t.push.apply(t,De(a).map(function(c){return c.urlPrefix})),P({applicationId:e.replica.applicationId},a)}}function cp(e,t){var n=De(e).map(function(l){return l.urlPrefix});return t===Ye&&n.push("https://".concat(Hc,"/")),n}function pl(e,t){return e!=null&&typeof e!="string"?(B.error("".concat(t," must be defined as a string")),!1):!0}function ip(e){return e&&typeof e=="string"&&!/(datadog|ddog|datad0g|dd0g)/.test(e)?(B.error("Site should be a valid Datadog site. ".concat(Dt," ").concat(el,"/getting_started/site/.")),!1):!0}function cn(e,t){return e!==void 0&&!Ob(e)?(B.error("".concat(t," Sample Rate should be a number between 0 and 100")),!1):!0}function rp(e){var t,n,l,a,c;if(!e||!e.clientToken){B.error("Client Token is not configured, we will not send any data.");return}if(!(!ip(e.site)||!cn(e.sessionSampleRate,"Session")||!cn(e.telemetrySampleRate,"Telemetry")||!cn(e.telemetryConfigurationSampleRate,"Telemetry Configuration")||!cn(e.telemetryUsageSampleRate,"Telemetry Usage")||!pl(e.version,"Version")||!pl(e.env,"Env")||!pl(e.service,"Service"))){if(e.trackingConsent!==void 0&&!fc(hl,e.trackingConsent)){B.error('Tracking Consent should be either "granted" or "not-granted"');return}return P({beforeSend:e.beforeSend&&Vc(e.beforeSend,"beforeSend threw an error:"),sessionStoreStrategyType:U0(e),sessionSampleRate:(t=e.sessionSampleRate)!==null&&t!==void 0?t:100,telemetrySampleRate:(n=e.telemetrySampleRate)!==null&&n!==void 0?n:20,telemetryConfigurationSampleRate:(l=e.telemetryConfigurationSampleRate)!==null&&l!==void 0?l:5,telemetryUsageSampleRate:(a=e.telemetryUsageSampleRate)!==null&&a!==void 0?a:5,service:e.service||void 0,silentMultipleInit:!!e.silentMultipleInit,allowUntrustedEvents:!!e.allowUntrustedEvents,trackingConsent:(c=e.trackingConsent)!==null&&c!==void 0?c:hl.GRANTED,storeContextsAcrossPages:!!e.storeContextsAcrossPages,batchBytesLimit:16*le,eventRateLimiterThreshold:3e3,maxTelemetryEventsPerPage:15,flushTimeout:30*mt,batchMessagesLimit:50,messageBytesLimit:256*le},np(e))}}function sp(e){return{session_sample_rate:e.sessionSampleRate,telemetry_sample_rate:e.telemetrySampleRate,telemetry_configuration_sample_rate:e.telemetryConfigurationSampleRate,telemetry_usage_sample_rate:e.telemetryUsageSampleRate,use_before_send:!!e.beforeSend,use_cross_site_session_cookie:e.useCrossSiteSessionCookie,use_partitioned_cross_site_session_cookie:e.usePartitionedCrossSiteSessionCookie,use_secure_session_cookie:e.useSecureSessionCookie,use_proxy:!!e.proxy,silent_multiple_init:e.silentMultipleInit,track_session_across_subdomains:e.trackSessionAcrossSubdomains,allow_fallback_to_local_storage:!!e.allowFallbackToLocalStorage,store_contexts_across_pages:!!e.storeContextsAcrossPages,allow_untrusted_events:!!e.allowUntrustedEvents,tracking_consent:e.trackingConsent}}var Gl;(function(e){e.WRITABLE_RESOURCE_GRAPHQL="writable_resource_graphql",e.REMOTE_CONFIGURATION="remote_configuration",e.UPDATE_VIEW_NAME="update_view_name",e.LONG_ANIMATION_FRAME="long_animation_frame"})(Gl||(Gl={}));var Uc=new Set;function op(e){Array.isArray(e)&&dp(e.filter(function(t){return fc(Gl,t)}))}function dp(e){e.forEach(function(t){Uc.add(t)})}function up(){return Uc}var yt="?";function ae(e){var t=[],n=yl(e,"stack"),l=String(e);return n&&al(n,l)&&(n=n.slice(l.length)),n&&n.split(`
|
|
267
|
+
`).forEach(function(a){var c=hp(a)||pp(a)||yp(a)||Wp(a);c&&(!c.func&&c.line&&(c.func=yt),t.push(c))}),{message:yl(e,"message"),name:yl(e,"name"),stack:t}}var wc="((?:file|https?|blob|chrome-extension|native|eval|webpack|snippet|<anonymous>|\\w+\\.|\\/).*?)",_e="(?::(\\d+))",mp=new RegExp("^\\s*at (.*?) ?\\(".concat(wc).concat(_e,"?").concat(_e,"?\\)?\\s*$"),"i"),Zp=new RegExp("\\((\\S*)".concat(_e).concat(_e,"\\)"));function hp(e){var t=mp.exec(e);if(t){var n=t[2]&&t[2].indexOf("native")===0,l=t[2]&&t[2].indexOf("eval")===0,a=Zp.exec(t[2]);return l&&a&&(t[2]=a[1],t[3]=a[2],t[4]=a[3]),{args:n?[t[2]]:[],column:t[4]?+t[4]:void 0,func:t[1]||yt,line:t[3]?+t[3]:void 0,url:n?void 0:t[2]}}}var bp=new RegExp("^\\s*at ?".concat(wc).concat(_e,"?").concat(_e,"??\\s*$"),"i");function pp(e){var t=bp.exec(e);if(t)return{args:[],column:t[3]?+t[3]:void 0,func:yt,line:t[2]?+t[2]:void 0,url:t[1]}}var Gp=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;function yp(e){var t=Gp.exec(e);if(t)return{args:[],column:t[4]?+t[4]:void 0,func:t[1]||yt,line:+t[3],url:t[2]}}var Xp=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|capacitor|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i,Vp=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i;function Wp(e){var t=Xp.exec(e);if(t){var n=t[3]&&t[3].indexOf(" > eval")>-1,l=Vp.exec(t[3]);return n&&l&&(t[3]=l[1],t[4]=l[2],t[5]=void 0),{args:t[2]?t[2].split(","):[],column:t[5]?+t[5]:void 0,func:t[1]||yt,line:t[4]?+t[4]:void 0,url:t[3]}}}function yl(e,t){if(!(typeof e!="object"||!e||!(t in e))){var n=e[t];return typeof n=="string"?n:void 0}}function Rp(e,t,n,l){var a=[{url:t,column:l,line:n}],c=Lp(e),i=c.name,r=c.message;return{name:i,message:r,stack:a}}var fp=/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?([\s\S]*)$/;function Lp(e){var t,n,l;return{}.toString.call(e)==="[object String]"&&(t=fp.exec(e),n=t[1],l=t[2]),{name:n,message:l}}function rn(){var e=2,t=new Error,n;if(!t.stack)try{throw t}catch{}return ht(function(){var l=ae(t);l.stack=l.stack.slice(e),n=ve(l)}),n}function ve(e){var t=Bc(e);return e.stack.forEach(function(n){var l=n.func==="?"?"<anonymous>":n.func,a=n.args&&n.args.length>0?"(".concat(n.args.join(", "),")"):"",c=n.line?":".concat(n.line):"",i=n.line&&n.column?":".concat(n.column):"";t+=`
|
|
268
|
+
at `.concat(l).concat(a," @ ").concat(n.url).concat(c).concat(i)}),t}function Bc(e){return"".concat(e.name||"Error",": ").concat(e.message)}function ge(e,t,n,l){var a=l===void 0?{}:l,c=a.computeHandlingStack,i=e[t];if(typeof i!="function")if(t in e&&al(t,"on"))i=he;else return{stop:he};var r=!1,d=function(){if(r)return i.apply(this,arguments);var s=ll(arguments),o;ht(n,null,[{target:this,parameters:s,onPostCall:function(Z){o=Z},handlingStack:c?rn():void 0}]);var u=i.apply(this,s);return o&&ht(o,null,[u]),u};return e[t]=d,{stop:function(){r=!0,e[t]===d&&(e[t]=i)}}}var Yp=220*le,vp="$",gp=3;function ce(e,t){t===void 0&&(t=Yp);var n=Ae(Object.prototype),l=Ae(Array.prototype),a=[],c=new WeakMap,i=Xl(e,vp,void 0,a,c),r=JSON.stringify(i),d=r?r.length:0;if(d>t){Vl(t,"discarded",e);return}for(;a.length>0&&d<t;){var s=a.shift(),o=0;if(Array.isArray(s.source))for(var u=0;u<s.source.length;u++){var Z=Xl(s.source[u],s.path,u,a,c);if(Z!==void 0?d+=JSON.stringify(Z).length:d+=4,d+=o,o=1,d>t){Vl(t,"truncated",e);break}s.target[u]=Z}else for(var u in s.source)if(Object.prototype.hasOwnProperty.call(s.source,u)){var Z=Xl(s.source[u],s.path,u,a,c);if(Z!==void 0&&(d+=JSON.stringify(Z).length+o+u.length+gp,o=1),d>t){Vl(t,"truncated",e);break}s.target[u]=Z}}return n(),l(),i}function Xl(e,t,n,l,a){var c=xp(e);if(!c||typeof c!="object")return Fp(c);var i=Cp(c);if(i!=="[Object]"&&i!=="[Array]"&&i!=="[Error]")return i;var r=e;if(a.has(r))return"[Reference seen at ".concat(a.get(r),"]");var d=n!==void 0?"".concat(t,".").concat(n):t,s=Array.isArray(c)?[]:{};return a.set(r,d),l.push({source:c,target:s,path:d}),s}function Fp(e){return typeof e=="bigint"?"[BigInt] ".concat(e.toString()):typeof e=="function"?"[Function] ".concat(e.name||"unknown"):typeof e=="symbol"?"[Symbol] ".concat(e.description||e.toString()):e}function Cp(e){try{if(e instanceof Event)return{isTrusted:e.isTrusted};var t=Object.prototype.toString.call(e),n=t.match(/\[object (.*)\]/);if(n&&n[1])return"[".concat(n[1],"]")}catch{}return"[Unserializable]"}function xp(e){var t=e;if(t&&typeof t.toJSON=="function")try{return t.toJSON()}catch{}return e}function Vl(e,t,n){B.warn("The data provided has been ".concat(t," as it is over the limit of ").concat(e," characters:"),n)}var Qc="No stack, consider using an instance of Error";function Pc(e){var t=e.stackTrace,n=e.originalError,l=e.handlingStack,a=e.startClocks,c=e.nonErrorPrefix,i=e.source,r=e.handling,d=n instanceof Error,s=Sp(t,d,c,n),o=Ip(d,t)?ve(t):Qc,u=d?Dc(n,i):void 0,Z=t?t.name:void 0,m=Ec(n);return{startClocks:a,source:i,handling:r,handlingStack:l,originalError:n,type:Z,message:s,stack:o,causes:u,fingerprint:m}}function Sp(e,t,n,l){return e!=null&&e.message&&(e!=null&&e.name)?e.message:t?"Empty message":"".concat(n," ").concat(Le(ce(l)))}function Ip(e,t){return t===void 0?!1:e?!0:t.stack.length>0&&(t.stack.length>1||t.stack[0].url!==void 0)}function Ec(e){return e instanceof Error&&"dd_fingerprint"in e?String(e.dd_fingerprint):void 0}function zp(e){var t;return(t=/@ (.+)/.exec(e))===null||t===void 0?void 0:t[1]}function Dc(e,t){for(var n=e,l=[];(n==null?void 0:n.cause)instanceof Error&&l.length<10;){var a=ae(n.cause);l.push({message:n.cause.message,source:t,type:a==null?void 0:a.name,stack:a&&ve(a)}),n=n.cause}return l.length?l:void 0}var j={AGENT:"agent",CONSOLE:"console",CUSTOM:"custom",LOGGER:"logger",NETWORK:"network",SOURCE:"source",REPORT:"report"};function Mp(e){var t=function(a,c){var i=Pc({stackTrace:a,originalError:c,startClocks:me(),nonErrorPrefix:"Uncaught",source:j.SOURCE,handling:"unhandled"});e.notify(i)},n=Jp(t).stop,l=Np(t).stop;return{stop:function(){n(),l()}}}function Jp(e){return ge(window,"onerror",function(t){var n=t.parameters,l=n[0],a=n[1],c=n[2],i=n[3],r=n[4],d;r instanceof Error?d=ae(r):d=Rp(l,a,c,i),e(d,r??l)})}function Np(e){return ge(window,"onunhandledrejection",function(t){var n=t.parameters[0],l=n.reason||"Empty reason",a=ae(l);e(a,l)})}function kp(e){var t=P({version:"5.29.1",onReady:function(n){n()}},e);return Object.defineProperty(t,"_setDebug",{get:function(){return o0},enumerable:!1}),t}function Kp(e,t,n){var l=e[t];l&&!l.q&&l.version&&B.warn("SDK is loaded more than once. This is unsupported and might have unexpected behavior."),e[t]=n,l&&l.q&&l.q.forEach(function(a){return Vc(a,"onReady callback threw an error:")()})}function jc(e,t){t.silentMultipleInit||B.error("".concat(e," is already initialized."))}function Fe(e,t,n,l,a){return Wl(e,t,[n],l,a)}function Wl(e,t,n,l,a){var c=a===void 0?{}:a,i=c.once,r=c.capture,d=c.passive,s=z(function(m){!m.isTrusted&&!m.__ddIsTrusted&&!e.allowUntrustedEvents||(i&&Z(),l(m))}),o=d?{capture:r,passive:d}:r,u=je(t,"addEventListener");n.forEach(function(m){return u.call(t,m,s,o)});function Z(){var m=je(t,"removeEventListener");n.forEach(function(p){return m.call(t,p,s,o)})}return{stop:Z}}var sn={intervention:"intervention",deprecation:"deprecation",cspViolation:"csp_violation"};function Tp(e,t){var n=[];Ee(t,sn.cspViolation)&&n.push(Up(e));var l=t.filter(function(a){return a!==sn.cspViolation});return l.length&&n.push(Hp(l)),gc.apply(void 0,n)}function Hp(e){return new Q(function(t){if(window.ReportingObserver){var n=z(function(a,c){return a.forEach(function(i){return t.notify(wp(i))})}),l=new window.ReportingObserver(n,{types:e,buffered:!0});return l.observe(),function(){l.disconnect()}}})}function Up(e){return new Q(function(t){var n=Fe(e,document,"securitypolicyviolation",function(l){t.notify(Bp(l))}).stop;return n})}function wp(e){var t=e.type,n=e.body;return Oc({type:n.id,message:"".concat(t,": ").concat(n.message),originalError:e,stack:Ac(n.id,n.message,n.sourceFile,n.lineNumber,n.columnNumber)})}function Bp(e){var t="'".concat(e.blockedURI,"' blocked by '").concat(e.effectiveDirective,"' directive");return Oc({type:e.effectiveDirective,message:"".concat(sn.cspViolation,": ").concat(t),originalError:e,csp:{disposition:e.disposition},stack:Ac(e.effectiveDirective,e.originalPolicy?"".concat(t,' of the policy "').concat(Z0(e.originalPolicy,100,"..."),'"'):"no policy",e.sourceFile,e.lineNumber,e.columnNumber)})}function Oc(e){return P({startClocks:me(),source:j.REPORT,handling:"unhandled"},e)}function Ac(e,t,n,l,a){return n?ve({name:e,message:t,stack:[{func:"?",url:n,line:l??void 0,column:a??void 0}]}):void 0}function _c(e,t){var n=window.__ddBrowserSdkExtensionCallback;n&&n({type:e,payload:t})}function Rl(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function on(e,t,n){if(n===void 0&&(n=Qp()),t===void 0)return e;if(typeof t!="object"||t===null)return t;if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp){var l=t.flags||[t.global?"g":"",t.ignoreCase?"i":"",t.multiline?"m":"",t.sticky?"y":"",t.unicode?"u":""].join("");return new RegExp(t.source,l)}if(!n.hasAlreadyBeenSeen(t)){if(Array.isArray(t)){for(var a=Array.isArray(e)?e:[],c=0;c<t.length;++c)a[c]=on(a[c],t[c],n);return a}var i=Rl(e)==="object"?e:{};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(i[r]=on(i[r],t[r],n));return i}}function $c(e){return on(void 0,e)}function $e(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n,l=0,a=e;l<a.length;l++){var c=a[l];c!=null&&(n=on(n,c))}return n}function Qp(){if(typeof WeakSet<"u"){var e=new WeakSet;return{hasAlreadyBeenSeen:function(n){var l=e.has(n);return l||e.add(n),l}}}var t=[];return{hasAlreadyBeenSeen:function(n){var l=t.indexOf(n)>=0;return l||t.push(n),l}}}function Pp(){var e,t=window.navigator;return{status:t.onLine?"connected":"not_connected",interfaces:t.connection&&t.connection.type?[t.connection.type]:void 0,effective_type:(e=t.connection)===null||e===void 0?void 0:e.effectiveType}}function Ep(e){var t=new Set;return e.forEach(function(n){return t.add(n)}),ll(t)}function qc(e,t){var n=e.indexOf(t);n>=0&&e.splice(n,1)}var Dp=500;function ei(){var e=[],t=function(a){var c=e.push(a);c>Dp&&e.splice(0,1)},n=function(a){qc(e,a)},l=function(a){e.forEach(function(c){return c(a)}),e.length=0};return{add:t,remove:n,drain:l}}var Ce={log:"log",configuration:"configuration",usage:"usage"},jp=["https://www.datadoghq-browser-agent.com","https://www.datad0g-browser-agent.com","https://d3uc069fcn7uxw.cloudfront.net","https://d20xtzwzcl0ceb.cloudfront.net","http://localhost","<anonymous>"],Op=[j0],ti=ei(),qe=function(e){ti.add(function(){return qe(e)})};function Ap(e,t){var n,l,a=new Q,c=new Set,i=!Ee(Op,t.site)&&jt(t.telemetrySampleRate),r=(n={},n[Ce.log]=i,n[Ce.configuration]=i&&jt(t.telemetryConfigurationSampleRate),n[Ce.usage]=i&&jt(t.telemetryUsageSampleRate),n),d=_p();qe=function(o){var u=Le(o);if(r[o.type]&&c.size<t.maxTelemetryEventsPerPage&&!c.has(u)){var Z=s(e,o,d);a.notify(Z),_c("telemetry",Z),c.add(u)}},s0(li);function s(o,u,Z){return $e({type:"telemetry",date:ue(),service:o,version:"5.29.1",source:"browser",_dd:{format_version:2},telemetry:$e(u,{runtime_env:Z,connectivity:Pp(),sdk_setup:"npm"}),experimental_features:ll(up())},l!==void 0?l():{})}return{setContextProvider:function(o){l=o},observable:a,enabled:i}}function _p(){return{is_local_file:window.location.protocol==="file:",is_worker:"WorkerGlobalScope"in self}}function $p(){ti.drain()}function qp(e){return e.site===E0}function ni(e,t){il(K.debug,e,t),qe(P({type:Ce.log,message:e,status:"debug"},t))}function li(e,t){qe(P({type:Ce.log,status:"error"},nG(e),t))}function eG(e){qe({type:Ce.configuration,configuration:e})}function tG(e){qe({type:Ce.usage,usage:e})}function nG(e){if(e instanceof Error){var t=ae(e);return{error:{kind:t.name,stack:ve(lG(t))},message:t.message}}return{error:{stack:Qc},message:"".concat("Uncaught"," ").concat(Le(e))}}function lG(e){return e.stack=e.stack.filter(function(t){return!t.url||jp.some(function(n){return al(t.url,n)})}),e}var dn=1/0,aG=Xe;function cG(e){var t=e.expireDelay,n=e.maxEntries,l=[],a=rl(function(){return c()},aG);function c(){for(var Z=Ot()-t;l.length>0&&l[l.length-1].endTime<Z;)l.pop()}function i(Z,m){var p={value:Z,startTime:m,endTime:dn,remove:function(){qc(l,p)},close:function(h){p.endTime=h}};return n&&l.length>=n&&l.pop(),l.unshift(p),p}function r(Z,m){Z===void 0&&(Z=dn),m===void 0&&(m={returnInactive:!1});for(var p=0,h=l;p<h.length;p++){var R=h[p];if(R.startTime<=Z){if(m.returnInactive||Z<=R.endTime)return R.value;break}}}function d(Z){var m=l[0];m&&m.endTime===dn&&m.close(Z)}function s(Z,m){Z===void 0&&(Z=dn),m===void 0&&(m=0);var p=e0(Z,m);return l.filter(function(h){return h.startTime<=p&&Z<=h.endTime}).map(function(h){return h.value})}function o(){l=[]}function u(){vc(a)}return{add:i,find:r,closeActive:d,findAll:s,reset:o,stop:u}}var iG=Xe,rG=ul;function sG(e,t,n,l){var a=new Q,c=new Q,i=w0(e.sessionStoreStrategyType,t,n),r=cG({expireDelay:rG});i.renewObservable.subscribe(function(){r.add(d(),Ot()),a.notify()}),i.expireObservable.subscribe(function(){c.notify(),r.closeActive(Ot())}),i.expandOrRenewSession(),r.add(d(),$b().relative),l.observable.subscribe(function(){l.isGranted()?i.expandOrRenewSession():i.expire()}),oG(e,function(){l.isGranted()&&i.expandOrRenewSession()}),dG(e,function(){return i.expandSession()}),uG(e,function(){return i.restartSession()});function d(){return{id:i.getSession().id,trackingType:i.getSession()[t],isReplayForced:!!i.getSession().forcedReplay}}return{findSession:function(s,o){return r.find(s,o)},renewObservable:a,expireObservable:c,sessionStateUpdateObservable:i.sessionStateUpdateObservable,expire:i.expire,updateSessionState:i.updateSessionState}}function oG(e,t){Wl(e,window,["click","touchstart","keydown","scroll"],t,{capture:!0,passive:!0}).stop}function dG(e,t){var n=function(){document.visibilityState==="visible"&&t()};Fe(e,document,"visibilitychange",n).stop,rl(n,iG)}function uG(e,t){Fe(e,window,"resume",t,{capture:!0}).stop}function ai(e){return e>=500}function mG(e){try{return e.clone()}catch{return}}var ZG=80*le,hG=32,ci=3*Rc,bG=Xe,ii=mt;function ri(e,t,n,l,a){t.transportStatus===0&&t.queuedPayloads.size()===0&&t.bandwidthMonitor.canHandle(e)?oi(e,t,n,{onSuccess:function(){return di(0,t,n,l,a)},onFailure:function(){t.queuedPayloads.enqueue(e),si(t,n,l,a)}}):t.queuedPayloads.enqueue(e)}function si(e,t,n,l){e.transportStatus===2&&bt(function(){var a=e.queuedPayloads.first();oi(a,e,t,{onSuccess:function(){e.queuedPayloads.dequeue(),e.currentBackoffTime=ii,di(1,e,t,n,l)},onFailure:function(){e.currentBackoffTime=Math.min(bG,e.currentBackoffTime*2),si(e,t,n,l)}})},e.currentBackoffTime)}function oi(e,t,n,l){var a=l.onSuccess,c=l.onFailure;t.bandwidthMonitor.add(e),n(e,function(i){t.bandwidthMonitor.remove(e),pG(i)?(t.transportStatus=t.bandwidthMonitor.ongoingRequestCount>0?1:2,e.retry={count:e.retry?e.retry.count+1:1,lastFailureStatus:i.status},c()):(t.transportStatus=0,a())})}function di(e,t,n,l,a){e===0&&t.queuedPayloads.isFull()&&!t.queueFullReported&&(a({message:"Reached max ".concat(l," events size queued for upload: ").concat(ci/Rc,"MiB"),source:j.AGENT,startClocks:me()}),t.queueFullReported=!0);var c=t.queuedPayloads;for(t.queuedPayloads=ui();c.size()>0;)ri(c.dequeue(),t,n,l,a)}function pG(e){return e.type!=="opaque"&&(e.status===0&&!navigator.onLine||e.status===408||e.status===429||ai(e.status))}function GG(){return{transportStatus:0,currentBackoffTime:ii,bandwidthMonitor:yG(),queuedPayloads:ui(),queueFullReported:!1}}function ui(){var e=[];return{bytesCount:0,enqueue:function(t){this.isFull()||(e.push(t),this.bytesCount+=t.bytesCount)},first:function(){return e[0]},dequeue:function(){var t=e.shift();return t&&(this.bytesCount-=t.bytesCount),t},size:function(){return e.length},isFull:function(){return this.bytesCount>=ci}}}function yG(){return{ongoingRequestCount:0,ongoingByteCount:0,canHandle:function(e){return this.ongoingRequestCount===0||this.ongoingByteCount+e.bytesCount<=ZG&&this.ongoingRequestCount<hG},add:function(e){this.ongoingRequestCount+=1,this.ongoingByteCount+=e.bytesCount},remove:function(e){this.ongoingRequestCount-=1,this.ongoingByteCount-=e.bytesCount}}}function XG(e,t,n,l){var a=GG(),c=function(i,r){return RG(e,t,n,i,r)};return{send:function(i){ri(i,a,c,t.trackType,l)},sendOnExit:function(i){VG(e,t,n,i)}}}function VG(e,t,n,l){var a=!!navigator.sendBeacon&&l.bytesCount<n;if(a)try{var c=t.build("beacon",l),i=navigator.sendBeacon(c,l.data);if(i)return}catch(d){WG(d)}var r=t.build("xhr",l);fl(e,r,l.data)}var mi=!1;function WG(e){mi||(mi=!0,li(e))}function RG(e,t,n,l,a){var c=fG()&&l.bytesCount<n;if(c){var i=t.build("fetch",l);fetch(i,{method:"POST",body:l.data,keepalive:!0,mode:"cors"}).then(z(function(d){return a==null?void 0:a({status:d.status,type:d.type})}),z(function(){var d=t.build("xhr",l);fl(e,d,l.data,a)}))}else{var r=t.build("xhr",l);fl(e,r,l.data,a)}}function fG(){try{return window.Request&&"keepalive"in new Request("http://a")}catch{return!1}}function fl(e,t,n,l){var a=new XMLHttpRequest;a.open("POST",t,!0),n instanceof Blob&&a.setRequestHeader("Content-Type",n.type),Fe(e,a,"loadend",function(){l==null||l({status:a.status})},{once:!0}),a.send(n)}function Ll(){var e=LG();if(e)return{getCapabilities:function(){var t;return JSON.parse(((t=e.getCapabilities)===null||t===void 0?void 0:t.call(e))||"[]")},getPrivacyLevel:function(){var t;return(t=e.getPrivacyLevel)===null||t===void 0?void 0:t.call(e)},getAllowedWebViewHosts:function(){return JSON.parse(e.getAllowedWebViewHosts())},send:function(t,n,l){var a=l?{id:l}:void 0;e.send(JSON.stringify({eventType:t,event:n,view:a}))}}}function un(e){var t;e===void 0&&(e=(t=Ze().location)===null||t===void 0?void 0:t.hostname);var n=Ll();return!!n&&n.getAllowedWebViewHosts().some(function(l){return e===l||c0(e,".".concat(l))})}function LG(){return Ze().DatadogEventBridge}var mn={HIDDEN:"visibility_hidden",UNLOADING:"before_unload",PAGEHIDE:"page_hide",FROZEN:"page_frozen"};function YG(e){return new Q(function(t){var n=Wl(e,window,["visibilitychange","freeze"],function(a){a.type==="visibilitychange"&&document.visibilityState==="hidden"?t.notify({reason:mn.HIDDEN}):a.type==="freeze"&&t.notify({reason:mn.FROZEN})},{capture:!0}).stop,l=Fe(e,window,"beforeunload",function(){t.notify({reason:mn.UNLOADING})}).stop;return function(){n(),l()}})}function vG(e){return Ee(De(mn),e)}function gG(e){var t=e.encoder,n=e.request,l=e.flushController,a=e.messageBytesLimit,c={},i=l.flushObservable.subscribe(function(Z){return u(Z)});function r(Z,m,p){l.notifyBeforeAddMessage(m),p!==void 0?(c[p]=Z,l.notifyAfterAddMessage()):t.write(t.isEmpty?Z:`
|
|
269
|
+
`.concat(Z),function(h){l.notifyAfterAddMessage(h-m)})}function d(Z){return Z!==void 0&&c[Z]!==void 0}function s(Z){var m=c[Z];delete c[Z];var p=t.estimateEncodedBytesCount(m);l.notifyAfterRemoveMessage(p)}function o(Z,m){var p=Le(Z),h=t.estimateEncodedBytesCount(p);if(h>=a){B.warn("Discarded a message whose size was bigger than the maximum allowed size ".concat(a,"KB. ").concat(Dt," ").concat(Xc,"/#technical-limitations"));return}d(m)&&s(m),r(p,h,m)}function u(Z){var m=De(c).join(`
|
|
270
|
+
`);c={};var p=vG(Z.reason),h=p?n.sendOnExit:n.send;if(p&&t.isAsync){var R=t.finishSync();R.outputBytesCount&&h(Zi(R));var y=[R.pendingData,m].filter(Boolean).join(`
|
|
271
|
+
`);y&&h({data:y,bytesCount:nl(y)})}else m&&t.write(t.isEmpty?m:`
|
|
272
|
+
`.concat(m)),t.finish(function(V){h(Zi(V))})}return{flushController:l,add:o,upsert:o,stop:i.unsubscribe}}function Zi(e){var t;return typeof e.output=="string"?t=e.output:t=new Blob([e.output],{type:"text/plain"}),{data:t,bytesCount:e.outputBytesCount,encoding:e.encoding}}function FG(e){var t=e.messagesLimit,n=e.bytesLimit,l=e.durationLimit,a=e.pageExitObservable,c=e.sessionExpireObservable,i=a.subscribe(function(h){return u(h.reason)}),r=c.subscribe(function(){return u("session_expire")}),d=new Q(function(){return function(){i.unsubscribe(),r.unsubscribe()}}),s=0,o=0;function u(h){if(o!==0){var R=o,y=s;o=0,s=0,p(),d.notify({reason:h,messagesCount:R,bytesCount:y})}}var Z;function m(){Z===void 0&&(Z=bt(function(){u("duration_limit")},l))}function p(){Yc(Z),Z=void 0}return{flushObservable:d,get messagesCount(){return o},notifyBeforeAddMessage:function(h){s+h>=n&&u("bytes_limit"),o+=1,s+=h,m()},notifyAfterAddMessage:function(h){h===void 0&&(h=0),s+=h,o>=t?u("messages_limit"):s>=n&&u("bytes_limit")},notifyAfterRemoveMessage:function(h){s-=h,o-=1,o===0&&p()}}}function hi(e,t,n,l,a,c,i){i===void 0&&(i=gG);var r=s(e,t),d=n&&s(e,n);function s(o,u){var Z=u.endpoint,m=u.encoder;return i({encoder:m,request:XG(o,Z,o.batchBytesLimit,l),flushController:FG({messagesLimit:o.batchMessagesLimit,bytesLimit:o.batchBytesLimit,durationLimit:o.flushTimeout,pageExitObservable:a,sessionExpireObservable:c}),messageBytesLimit:o.messageBytesLimit})}return{flushObservable:r.flushController.flushObservable,add:function(o,u){u===void 0&&(u=!0),r.add(o),d&&u&&d.add(n.transformMessage?n.transformMessage(o):o)},upsert:function(o,u){r.upsert(o,u),d&&d.upsert(n.transformMessage?n.transformMessage(o):o,u)},stop:function(){r.stop(),d&&d.stop()}}}function Zn(){var e="",t=0;return{isAsync:!1,get isEmpty(){return!e},write:function(n,l){var a=nl(n);t+=a,e+=n,l&&l(a)},finish:function(n){n(this.finishSync())},finishSync:function(){var n={output:e,outputBytesCount:t,rawBytesCount:t,pendingData:""};return e="",t=0,n},estimateEncodedBytesCount:function(n){return n.length}}}var CG=function(){function e(){this.callbacks={}}return e.prototype.notify=function(t,n){var l=this.callbacks[t];l&&l.forEach(function(a){return a(n)})},e.prototype.subscribe=function(t,n){var l=this;return this.callbacks[t]||(this.callbacks[t]=[]),this.callbacks[t].push(n),{unsubscribe:function(){l.callbacks[t]=l.callbacks[t].filter(function(a){return n!==a})}}},e}();function xG(e,t,n){var l=0,a=!1;return{isLimitReached:function(){if(l===0&&bt(function(){l=0},Xe),l+=1,l<=t||a)return a=!1,!1;if(l===t+1){a=!0;try{n({message:"Reached max number of ".concat(e,"s by minute: ").concat(t),source:j.AGENT,startClocks:me()})}finally{a=!1}}return!0}}}var Yl,vl=new WeakMap;function SG(e){return Yl||(Yl=IG(e)),Yl}function IG(e){return new Q(function(t){var n=ge(XMLHttpRequest.prototype,"open",zG).stop,l=ge(XMLHttpRequest.prototype,"send",function(c){MG(c,e,t)},{computeHandlingStack:!0}).stop,a=ge(XMLHttpRequest.prototype,"abort",JG).stop;return function(){n(),l(),a()}})}function zG(e){var t=e.target,n=e.parameters,l=n[0],a=n[1];vl.set(t,{state:"open",method:String(l).toUpperCase(),url:bl(String(a))})}function MG(e,t,n){var l=e.target,a=e.handlingStack,c=vl.get(l);if(c){var i=c;i.state="start",i.startClocks=me(),i.isAborted=!1,i.xhr=l,i.handlingStack=a;var r=!1,d=ge(l,"onreadystatechange",function(){l.readyState===XMLHttpRequest.DONE&&s()}).stop,s=function(){if(o(),d(),!r){r=!0;var u=c;u.state="complete",u.duration=qb(i.startClocks.timeStamp,ue()),u.status=l.status,n.notify(i0(u))}},o=Fe(t,l,"loadend",s).stop;n.notify(i)}}function JG(e){var t=e.target,n=vl.get(t);n&&(n.isAborted=!0)}var gl;function bi(){return gl||(gl=NG()),gl}function NG(){return new Q(function(e){if(window.fetch){var t=ge(window,"fetch",function(n){return kG(n,e)},{computeHandlingStack:!0}).stop;return t}})}function kG(e,t){var n=e.parameters,l=e.onPostCall,a=e.handlingStack,c=n[0],i=n[1],r=i&&i.method;r===void 0&&c instanceof Request&&(r=c.method);var d=r!==void 0?String(r).toUpperCase():"GET",s=c instanceof Request?c.url:bl(String(c)),o=me(),u={state:"start",init:i,input:c,method:d,startClocks:o,url:s,handlingStack:a};t.notify(u),n[0]=u.input,n[1]=u.init,l(function(Z){return KG(t,Z,u)})}function KG(e,t,n){var l=n;function a(c){l.state="resolve",P(l,c),e.notify(l)}t.then(z(function(c){a({response:c,responseType:c.type,status:c.status,isAborted:!1})}),z(function(c){var i,r;a({status:0,isAborted:((r=(i=l.init)===null||i===void 0?void 0:i.signal)===null||r===void 0?void 0:r.aborted)||c instanceof DOMException&&c.code===DOMException.ABORT_ERR,error:c})}))}var Fl={};function TG(e){var t=e.map(function(n){return Fl[n]||(Fl[n]=HG(n)),Fl[n]});return gc.apply(void 0,t)}function HG(e){return new Q(function(t){var n=ne[e];return ne[e]=function(){for(var l=[],a=0;a<arguments.length;a++)l[a]=arguments[a];n.apply(console,l);var c=rn();ht(function(){t.notify(UG(l,e,c))})},function(){ne[e]=n}})}function UG(e,t,n){var l=e.map(function(i){return wG(i)}).join(" "),a;if(t===K.error){var c=l0(e,function(i){return i instanceof Error});a={stack:c?ve(ae(c)):void 0,fingerprint:Ec(c),causes:c?Dc(c,"console"):void 0,startClocks:me(),message:l,source:j.CONSOLE,handling:"handled",handlingStack:n}}return{api:t,message:l,error:a,handlingStack:n}}function wG(e){return typeof e=="string"?ce(e):e instanceof Error?Bc(ae(e)):Le(ce(e),void 0,2)}function Cl(e){var t={},n=new Q,l={getContext:function(){return $c(t)},setContext:function(a){Rl(a)==="object"?(t=ce(a),e&&e.updateCustomerData(t)):l.clearContext(),n.notify()},setContextProperty:function(a,c){t[a]=ce(c),e&&e.updateCustomerData(t),n.notify()},removeContextProperty:function(a){delete t[a],e&&e.updateCustomerData(t),n.notify()},clearContext:function(){t={},e&&e.resetCustomerData(),n.notify()},changeObservable:n};return l}var BG="_dd_c",QG=[];function pi(e,t,n,l){var a=PG(n,l);QG.push(Fe(e,window,"storage",function(d){var s=d.key;a===s&&c()})),t.changeObservable.subscribe(i),t.setContext($e(r(),t.getContext()));function c(){t.setContext(r())}function i(){localStorage.setItem(a,JSON.stringify(t.getContext()))}function r(){var d=localStorage.getItem(a);return d!==null?JSON.parse(d):{}}}function PG(e,t){return"".concat(BG,"_").concat(e,"_").concat(t)}var EG=3*le,DG=16*le,jG=200;function OG(e){e===void 0&&(e=2);var t=new Map,n=!1;function l(a){if(a===void 0&&(a=0),!(n||e===0)){var c=e===2?EG:DG,i=a;t.forEach(function(r){i+=r.getBytesCount()}),i>c&&(AG(c),n=!0)}}return{createDetachedTracker:function(){var a=Gi(function(){return l(a.getBytesCount())});return a},getOrCreateTracker:function(a){return t.has(a)||t.set(a,Gi(l)),t.get(a)},setCompressionStatus:function(a){e===0&&(e=a,l())},getCompressionStatus:function(){return e},stop:function(){t.forEach(function(a){return a.stop()}),t.clear()}}}function Gi(e){var t=0,n=Fc(function(i){t=nl(Le(i)),e()},jG),l=n.throttled,a=n.cancel,c=function(){a(),t=0};return{updateCustomerData:function(i){cl(i)?c():l(i)},resetCustomerData:c,getBytesCount:function(){return t},stop:function(){a()}}}function AG(e){B.warn("Customer data exceeds the recommended ".concat(e/le,"KiB threshold. ").concat(Dt," ").concat(Xc,"/#customer-data-exceeds-the-recommended-threshold-warning"))}function _G(e,t,n){var l=e.getReader(),a=[],c=0;i();function i(){l.read().then(z(function(d){if(d.done){r();return}a.push(d.value),c+=d.value.length,c>n.bytesLimit?r():i()}),z(function(d){return t(d)}))}function r(){l.cancel().catch(he);var d,s;{var o;if(a.length===1)o=a[0];else{o=new Uint8Array(c);var u=0;a.forEach(function(Z){o.set(Z,u),u+=Z.length})}d=o.slice(0,n.bytesLimit),s=o.length>n.bytesLimit}t(void 0,d,s)}}var $G="datadog-synthetics-public-id",qG="datadog-synthetics-result-id",ey="datadog-synthetics-injects-rum";function yi(){return!!(window._DATADOG_SYNTHETICS_INJECTS_RUM||We(ey))}function ty(){var e=window._DATADOG_SYNTHETICS_PUBLIC_ID||We($G);return typeof e=="string"?e:void 0}function ny(){var e=window._DATADOG_SYNTHETICS_RESULT_ID||We(qG);return typeof e=="string"?e:void 0}function Xi(e){var t=P({},e),n=["id","name","email"];return n.forEach(function(l){l in t&&(t[l]=String(t[l]))}),t}function ly(e){var t=Rl(e)==="object";return t||B.error("Unsupported user:",e),t}var $;function hn(e,t,n){var l=n.getHandler(),a=Array.isArray(l)?l:[l];return Vi[e]>=Vi[n.getLevel()]&&Ee(a,t)}var x={ok:"ok",debug:"debug",info:"info",notice:"notice",warn:"warn",error:"error",critical:"critical",alert:"alert",emerg:"emerg"},Vi=($={},$[x.ok]=0,$[x.debug]=1,$[x.info]=2,$[x.notice]=4,$[x.warn]=5,$[x.error]=6,$[x.critical]=7,$[x.alert]=8,$[x.emerg]=9,$);function bn(e,t){var n=t===void 0?{}:t,l=n.includeMessage,a=l===void 0?!1:l;return{stack:e.stack,kind:e.type,message:a?e.message:void 0,causes:e.causes,fingerprint:e.fingerprint,handling:e.handling}}var ay=function(e,t,n,l){var a=arguments.length,c=a<3?t:l===null?l=Object.getOwnPropertyDescriptor(t,n):l,i;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")c=Reflect.decorate(e,t,n,l);else for(var r=e.length-1;r>=0;r--)(i=e[r])&&(c=(a<3?i(c):a>3?i(t,n,c):i(t,n))||c);return a>3&&c&&Object.defineProperty(t,n,c),c},Xt={console:"console",http:"http",silent:"silent"},cy=Object.keys(x),q=function(){function e(t,n,l,a,c,i){a===void 0&&(a=Xt.http),c===void 0&&(c=x.debug),i===void 0&&(i={}),this.handleLogStrategy=t,this.handlerType=a,this.level=c,this.contextManager=Cl(n),this.contextManager.setContext(i),l&&this.contextManager.setContextProperty("logger",{name:l})}return e.prototype.logImplementation=function(t,n,l,a,c){l===void 0&&(l=x.info);var i=ce(n),r;if(a!=null){var d=Pc({stackTrace:a instanceof Error?ae(a):void 0,originalError:a,nonErrorPrefix:"Provided",source:j.LOGGER,handling:"handled",startClocks:me()});r=$e({error:bn(d,{includeMessage:!0})},i)}else r=i;this.handleLogStrategy({message:ce(t),context:r,status:l},this,c)},e.prototype.log=function(t,n,l,a){l===void 0&&(l=x.info);var c;hn(l,Xt.http,this)&&(c=rn()),this.logImplementation(t,n,l,a,c)},e.prototype.setContext=function(t){this.contextManager.setContext(t)},e.prototype.getContext=function(){return this.contextManager.getContext()},e.prototype.setContextProperty=function(t,n){this.contextManager.setContextProperty(t,n)},e.prototype.removeContextProperty=function(t){this.contextManager.removeContextProperty(t)},e.prototype.clearContext=function(){this.contextManager.clearContext()},e.prototype.setHandler=function(t){this.handlerType=t},e.prototype.getHandler=function(){return this.handlerType},e.prototype.setLevel=function(t){this.level=t},e.prototype.getLevel=function(){return this.level},ay([d0],e.prototype,"logImplementation",null),e}();q.prototype.ok=ie(x.ok),q.prototype.debug=ie(x.debug),q.prototype.info=ie(x.info),q.prototype.notice=ie(x.notice),q.prototype.warn=ie(x.warn),q.prototype.error=ie(x.error),q.prototype.critical=ie(x.critical),q.prototype.alert=ie(x.alert),q.prototype.emerg=ie(x.emerg);function ie(e){return function(t,n,l){var a;hn(e,Xt.http,this)&&(a=rn()),this.logImplementation(t,n,e,l,a)}}function iy(e,t){return{view:{referrer:document.referrer,url:window.location.href},context:e.getContext(),user:t.getContext()}}var ry=32*le;function sy(e){e.usePciIntake===!0&&e.site&&e.site!=="datadoghq.com"&&B.warn("PCI compliance for Logs is only available for Datadog organizations in the US1 site. Default intake will be used.");var t=rp(e),n=Wi(e.forwardConsoleLogs,De(K),"Forward Console Logs"),l=Wi(e.forwardReports,De(sn),"Forward Reports");if(!(!t||!n||!l))return e.forwardErrorsToLogs&&!Ee(n,K.error)&&n.push(K.error),P({forwardErrorsToLogs:e.forwardErrorsToLogs!==!1,forwardConsoleLogs:n,forwardReports:l,requestErrorResponseLengthLimit:ry,sendLogsAfterSessionExpiration:!!e.sendLogsAfterSessionExpiration},t)}function Wi(e,t,n){if(e===void 0)return[];if(!(e==="all"||Array.isArray(e)&&e.every(function(l){return Ee(t,l)}))){B.error("".concat(n,' should be "all" or an array with allowed values "').concat(t.join('", "'),'"'));return}return e==="all"?t:Ep(e)}function oy(e){var t=sp(e);return P({forward_errors_to_logs:e.forwardErrorsToLogs,forward_console_logs:e.forwardConsoleLogs,forward_reports:e.forwardReports,use_pci_intake:e.usePciIntake,send_logs_after_session_expiration:e.sendLogsAfterSessionExpiration},t)}function dy(e,t,n){var l=ei(),a,c,i=t.observable.subscribe(r);function r(){if(!(!c||!a||!t.isGranted())){i.unsubscribe();var d=n(a,c);l.drain(d)}}return{init:function(d){if(!d){B.error("Missing configuration");return}if(op(d.enableExperimentalFeatures),un()&&(d=uy(d)),a=d,c){jc("DD_LOGS",d);return}var s=sy(d);s&&(c=s,bi().subscribe(he),t.tryToInit(s.trackingConsent),r())},get initConfiguration(){return a},getInternalContext:he,handleLog:function(d,s,o,u,Z){u===void 0&&(u=e()),Z===void 0&&(Z=ue()),l.add(function(m){return m.handleLog(d,s,o,u,Z)})}}}function uy(e){return P({},e,{clientToken:"empty"})}var Ri="logs";function my(e){var t=OG(),n=Cl(t.getOrCreateTracker(2)),l=Cl(t.getOrCreateTracker(1)),a=B0();function c(){return iy(n,l)}var i=dy(c,a,function(s,o){s.storeContextsAcrossPages&&(pi(o,n,Ri,2),pi(o,l,Ri,1));var u=e(s,o,c,a);return i=Zy(s,u),u}),r={},d=new q(function(){for(var s=[],o=0;o<arguments.length;o++)s[o]=arguments[o];return i.handleLog.apply(i,s)},t.createDetachedTracker());return kp({logger:d,init:z(function(s){return i.init(s)}),setTrackingConsent:z(function(s){a.update(s),tG({feature:"set-tracking-consent",tracking_consent:s})}),getGlobalContext:z(function(){return n.getContext()}),setGlobalContext:z(function(s){return n.setContext(s)}),setGlobalContextProperty:z(function(s,o){return n.setContextProperty(s,o)}),removeGlobalContextProperty:z(function(s){return n.removeContextProperty(s)}),clearGlobalContext:z(function(){return n.clearContext()}),createLogger:z(function(s,o){return o===void 0&&(o={}),r[s]=new q(function(){for(var u=[],Z=0;Z<arguments.length;Z++)u[Z]=arguments[Z];return i.handleLog.apply(i,u)},t.createDetachedTracker(),ce(s),o.handler,o.level,ce(o.context)),r[s]}),getLogger:z(function(s){return r[s]}),getInitConfiguration:z(function(){return $c(i.initConfiguration)}),getInternalContext:z(function(s){return i.getInternalContext(s)}),setUser:z(function(s){ly(s)&&l.setContext(Xi(s))}),getUser:z(function(){return l.getContext()}),setUserProperty:z(function(s,o){var u,Z=Xi((u={},u[s]=o,u))[s];l.setContextProperty(s,Z)}),removeUserProperty:z(function(s){return l.removeContextProperty(s)}),clearUser:z(function(){return l.clearContext()})})}function Zy(e,t){return P({init:function(n){jc("DD_LOGS",n)},initConfiguration:e},t)}var hy="logs";function by(e,t){var n=sG(e,hy,function(l){return Gy(e,l)},t);return{findTrackedSession:function(l,a){a===void 0&&(a={returnInactive:!1});var c=n.findSession(l,a);return c&&c.trackingType==="1"?{id:c.id}:void 0},expireObservable:n.expireObservable}}function py(e){var t=fi(e)==="1",n=t?{}:void 0;return{findTrackedSession:function(){return n},expireObservable:new Q}}function fi(e){return jt(e.sessionSampleRate)?"1":"0"}function Gy(e,t){var n=yy(t)?t:fi(e);return{trackingType:n,isTracked:n==="1"}}function yy(e){return e==="0"||e==="1"}var Li=!1;function pn(e){var t=window;if(yi()){var n=l(t.DD_RUM_SYNTHETICS);return!n&&!Li&&(Li=!0,ni("Logs sent before RUM is injected by the synthetics worker",{testId:ty(),resultId:ny()})),n}return l(t.DD_RUM);function l(a){if(a&&a.getInternalContext)return a.getInternalContext(e)}}function Xy(e,t,n,l,a){var c=cy.concat(["custom"]),i={};c.forEach(function(r){i[r]=xG(r,t.eventRateLimiterThreshold,a)}),n.subscribe(0,function(r){var d,s,o=r.rawLogsEvent,u=r.messageContext,Z=u===void 0?void 0:u,m=r.savedCommonContext,p=m===void 0?void 0:m,h=r.domainContext,R=t0(o.date),y=e.findTrackedSession(R);if(!(!y&&(!t.sendLogsAfterSessionExpiration||!e.findTrackedSession(R,{returnInactive:!0})))){var V=p||l(),L=$e({service:t.service,session_id:y?y.id:void 0,usr:cl(V.user)?void 0:V.user,view:V.view},V.context,pn(R),o,Z);((d=t.beforeSend)===null||d===void 0?void 0:d.call(t,L,h))===!1||L.origin!==j.AGENT&&((s=i[L.status])!==null&&s!==void 0?s:i.custom).isLimitReached()||n.notify(1,L)}})}var xe,Vy=(xe={},xe[K.log]=x.info,xe[K.debug]=x.debug,xe[K.info]=x.info,xe[K.warn]=x.warn,xe[K.error]=x.error,xe);function Wy(e,t){var n=TG(e.forwardConsoleLogs).subscribe(function(l){var a={rawLogsEvent:{date:ue(),message:l.message,origin:j.CONSOLE,error:l.error&&bn(l.error),status:Vy[l.api]},domainContext:{handlingStack:l.handlingStack}};t.notify(0,a)});return{stop:function(){n.unsubscribe()}}}function Ry(e,t){var n=Tp(e,e.forwardReports).subscribe(function(l){var a=l.message,c,i=l.originalError.type==="deprecation"?x.warn:x.error;i===x.error?c=bn(l):l.stack&&(a+=" Found in ".concat(zp(l.stack))),t.notify(0,{rawLogsEvent:{date:ue(),message:a,origin:j.REPORT,error:c,status:i}})});return{stop:function(){n.unsubscribe()}}}function fy(e,t){if(!e.forwardErrorsToLogs)return{stop:he};var n=SG(e).subscribe(function(c){c.state==="complete"&&a("xhr",c)}),l=bi().subscribe(function(c){c.state==="resolve"&&a("fetch",c)});function a(c,i){!e.isIntakeUrl(i.url)&&(gy(i)||ai(i.status))&&("xhr"in i?Ly(i.xhr,e,r):i.response?vy(i.response,e,r):i.error&&Yy(i.error,e,r));function r(d){var s={isAborted:i.isAborted,handlingStack:i.handlingStack};t.notify(0,{rawLogsEvent:{message:"".concat(Fy(c)," error ").concat(i.method," ").concat(i.url),date:i.startClocks.timeStamp,error:{stack:d||"Failed to load",handling:void 0},http:{method:i.method,status_code:i.status,url:i.url},status:x.error,origin:j.NETWORK},domainContext:s})}}return{stop:function(){n.unsubscribe(),l.unsubscribe()}}}function Ly(e,t,n){typeof e.response=="string"?n(xl(e.response,t)):n(e.response)}function Yy(e,t,n){n(xl(ve(ae(e)),t))}function vy(e,t,n){var l=mG(e);!l||!l.body?n():window.TextDecoder?Cy(l.body,t.requestErrorResponseLengthLimit,function(a,c){n(a?"Unable to retrieve response: ".concat(a):c)}):l.text().then(z(function(a){return n(xl(a,t))}),z(function(a){return n("Unable to retrieve response: ".concat(a))}))}function gy(e){return e.status===0&&e.responseType!=="opaque"}function xl(e,t){return e.length>t.requestErrorResponseLengthLimit?"".concat(e.substring(0,t.requestErrorResponseLengthLimit),"..."):e}function Fy(e){return e==="xhr"?"XHR":"Fetch"}function Cy(e,t,n){_G(e,function(l,a,c){if(l)n(l);else{var i=new TextDecoder().decode(a);c&&(i+="..."),n(void 0,i)}},{bytesLimit:t,collectStreamBody:!0})}function xy(e,t){if(!e.forwardErrorsToLogs)return{stop:he};var n=new Q,l=Mp(n).stop,a=n.subscribe(function(c){t.notify(0,{rawLogsEvent:{message:c.message,date:c.startClocks.timeStamp,error:bn(c),origin:j.SOURCE,status:x.error}})});return{stop:function(){l(),a.unsubscribe()}}}var Sy=CG,ee;function Iy(e){function t(n,l,a,c,i){var r=$e(l.getContext(),n.context);if(hn(n.status,Xt.console,l)&&My(n,r),hn(n.status,Xt.http,l)){var d={rawLogsEvent:{date:i||ue(),message:n.message,status:n.status,origin:j.LOGGER},messageContext:r,savedCommonContext:c};a&&(d.domainContext={handlingStack:a}),e.notify(0,d)}}return{handleLog:t}}var zy=(ee={},ee[x.ok]=K.debug,ee[x.debug]=K.debug,ee[x.info]=K.info,ee[x.notice]=K.info,ee[x.warn]=K.warn,ee[x.error]=K.error,ee[x.critical]=K.error,ee[x.alert]=K.error,ee[x.emerg]=K.error,ee);function My(e,t){var n=e.status,l=e.message;ye[zy[n]].call(ne,l,t)}function Jy(e,t,n,l,a){var c=hi(e,{endpoint:e.logsEndpointBuilder,encoder:Zn()},e.replica&&{endpoint:e.replica.logsEndpointBuilder,encoder:Zn()},n,l,a.expireObservable);return t.subscribe(1,function(i){c.add(i)}),c}function Ny(e){var t=Ll();e.subscribe(1,function(n){t.send("log",n)})}function ky(e){return{get:function(t){var n=e.findTrackedSession(t);if(n)return{session_id:n.id}}}}function Ky(e){return function(t){e.notify(0,{rawLogsEvent:{message:t.message,date:t.startClocks.timeStamp,origin:j.AGENT,status:x.error}}),ni("Error reported to customer",{"error.message":t.message})}}function Ty(e,t,n,l,a){var c=Ap("browser-logs-sdk",t);c.setContextProvider(function(){var u,Z,m,p,h,R;return{application:{id:(u=pn())===null||u===void 0?void 0:u.application_id},session:{id:(Z=a.findTrackedSession())===null||Z===void 0?void 0:Z.id},view:{id:(p=(m=pn())===null||m===void 0?void 0:m.view)===null||p===void 0?void 0:p.id},action:{id:(R=(h=pn())===null||h===void 0?void 0:h.user_action)===null||R===void 0?void 0:R.id}}});var i=[];if(un()){var r=Ll(),d=c.observable.subscribe(function(u){return r.send("internal_telemetry",u)});i.push(function(){return d.unsubscribe()})}else{var s=hi(t,{endpoint:t.rumEndpointBuilder,encoder:Zn()},t.replica&&{endpoint:t.replica.rumEndpointBuilder,encoder:Zn()},n,l,a.expireObservable);i.push(function(){return s.stop()});var o=c.observable.subscribe(function(u){return s.add(u,qp(t))});i.push(function(){return o.unsubscribe()})}return $p(),eG(oy(e)),{telemetry:c,stop:function(){i.forEach(function(u){return u()})}}}function Hy(e,t,n,l){var a=new Sy,c=[];a.subscribe(1,function(m){return _c("logs",m)});var i=Ky(a),r=YG(t),d=t.sessionStoreStrategyType&&!un()&&!yi()?by(t,l):py(t),s=Ty(e,t,i,r,d).stop;c.push(function(){return s()}),fy(t,a),xy(t,a),Wy(t,a),Ry(t,a);var o=Iy(a).handleLog;if(Xy(d,t,a,n,i),un())Ny(a);else{var u=Jy(t,a,i,r,d).stop;c.push(function(){return u()})}var Z=ky(d);return{handleLog:o,getInternalContext:Z.get,stop:function(){c.forEach(function(m){return m()})}}}var Gn=my(Hy);Kp(Ze(),"DD_LOGS",Gn);const Uy="1.0.44";Gn.init({clientToken:"pub4844895ac30067ac2c4aaa025dbc39d7",site:"us3.datadoghq.com",forwardErrorsToLogs:!0,sessionSampleRate:100});class Yi{constructor(t,n,l){g(this,"mediaID",null);console.log(`OTTPlayer: version: ${Uy}`),this.video=t,this.srcFrameRate=n,console.log("optionsFromMK: ",l),this.options=jb({enabled:!0,stopAugment:!1,stopAugmentFor:-1,gameId:"Unknown",medialook:!1,allGamesURL:"https://www.virtualott.com/games/",cloudFrontURL:"https://db8igqxlbvayn.cloudfront.net/prod",mediaIdJsonURL:"https://games-prod.virtualott.com/map",offsetJsonURL:"https://games-prod.virtualott.com/offset",renderingMode:Me.Augment,SynchMethod:ro.None,debug:!1,hls_fps:6e4/1001,augmentation:{renderTimecode:!0,offset:0},syncPoint:{frame:0,playerTime:0,mediaTimeMS:0}},l||{}),console.log("options after merge with MK's options: ",JSON.parse(JSON.stringify(this.options))),console.BBlog=function(a){console.log("OTTPlayer: "+a),Gn.logger.info("Web Unsorted msg: "+a,{name:"test"})},console.BBerror=function(...a){console.log("OTTPlayer: ",...a),Gn.logger.error("Web Unsorted error: "+a.join(", "),{name:"test"})},this.getGlobalConfig()}init(){typeof window.globalConfig>"u"?this.options=Object.assign(this.options,{}):this.options=Object.assign(this.options,JSON.parse(JSON.stringify(window.globalConfig)));var t={};if(t.value1=this.options.hls_fps,this.setFps(t),console.log("options after merge with the global options: ",JSON.parse(JSON.stringify(this.options))),!this.options.debug){let n=["debugText","forplus","forDoNotRender","debugText2","toggleBtn","numberInput","plus05CorrectionCheckbox","doNotRenderAugmentationCheckbox","plus05CorrectionLabel","doNotRenderAugmentationLabel","br1","br2","qualityButton","qualitySelect"];for(let l=0;l<n.length;l++){const a=document.getElementById(n[l]);a&&(a.style.display="none")}}this.fetchAndFindGameIdAndOffsetFromMediaId(this.options.gameId)}weHaveTheGameID(){this.frameDrawer=new io(this.video,this.options),this.options.renderingMode==Me.Augment&&this.frameDrawer.initializeComponents()}async getGlobalConfig(){const n=new URL(document.location).searchParams.get("config")||"";if(n!=="")try{const l=await fetch(n);if(!l.ok)throw new Error("Network response was not ok");const a=await l.json();typeof window.globalConfig>"u"&&(window.globalConfig={}),globalConfig=Object.assign({},a,window.globalConfig),console.log("final global config:",window.globalConfig)}catch(l){console.BBerror("Error fetching JSON:",l)}this.init()}async fetchAndFindGameIdAndOffsetFromMediaId(t){if(t="bbtest45",this.options.mediaIdJsonURL=="test"){this.weHaveTheGameID();return}try{const n=await fetch(this.options.mediaIdJsonURL+"/"+t);if(!n.ok)throw new Error(`HTTP error! Status: ${n.status}`);const l=await n.json();if(l.hasOwnProperty("GAME_ID")){console.log({jsonData:l});const a=l.GAME_ID;console.log(`GameId for mediaid= ${t}: ${a}`),this.options.gameId=a,this.weHaveTheGameID(),this.fetchOffsetForGameIdMediaID(this.options.gameId,t)}else console.BBerror(`MediaID ${t} not found in JSON.`),this.options.stopAugment=!0}catch(n){console.BBerror("Error fetching and processing GameId JSON:"+n)}}async fetchOffsetForGameIdMediaID(t,n){if(this.options.offsetJsonURL=="test")return 0;try{const l=await fetch(this.options.offsetJsonURL+"/"+t);l.ok||(console.log(`HTTP error! Status: ${l.status}`),setTimeout(()=>{this.fetchOffsetForGameIdMediaID(t,n)},5e3));const a=await l.json();if(a.hasOwnProperty("offset")&&a.hasOwnProperty("found")){const c=a.offset;a.found==!0&&(console.log(`Offset for gameid= ${t}: ${c}`),this.options.augmentation.offset=c,setTimeout(()=>{this.fetchOffsetForGameIdMediaID(t,n)},6e4))}else console.log(`offset for ${t} not found in JSON.`),setTimeout(()=>{this.fetchOffsetForGameIdMediaID(t,n)},5e3)}catch(l){console.BBerror("Error fetching and processing offset:",l),setTimeout(()=>{this.fetchOffsetForGameIdMediaID(t,n)},5e3)}}toggle(t){this.options.enabled=t}getCanvas(){return this.frameDrawer.getCanvas()}setFps(t){var n=t.value1;switch(n){case 59.94:case 6e4/1001:this.options.hls_fps=6e4/1001;break;case 29.97:case 3e4/1001:this.options.hls_fps=3e4/1001;break;default:console.error("Unsupported hls-src frame-rate: "+n+"fps"),this.options.hls_fps=n;break}}setSyncPoint(t){this.options.syncPoint=t}onNewSegment(t){this.frameDrawer.onNewSegmentForMetadata(t)}onNewMetadata(t){this.frameDrawer.onNewMetadata(t)}}return window.BB={MAX_LOGOS:4,RENDER_IN_WORKER:!0,OTTPlayer:Yi},Yi});
|