geekin-devtoys 0.2.3 → 0.2.4

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.
@@ -1,274 +1,274 @@
1
- import { ElMessageBox as Ul, ElMessage as fl } from "element-plus";
2
- import { withDirectives as vl, createElementBlock as Il, openBlock as Tl, vShow as Hl } from "vue";
3
- import { _ as Fl } from "../_plugin-vue_export-helper-CHgC5LLL.mjs";
4
- var kl = "0123456789abcdefghijklmnopqrstuvwxyz";
5
- function U(t) {
6
- return kl.charAt(t);
1
+ import { ElMessageBox as Pt, ElMessage as Vt } from "element-plus";
2
+ import { withDirectives as Ct, createElementBlock as Ot, openBlock as Mt, vShow as Nt } from "vue";
3
+ import { _ as _t } from "../_plugin-vue_export-helper-CHgC5LLL.mjs";
4
+ var qt = "0123456789abcdefghijklmnopqrstuvwxyz";
5
+ function P(r) {
6
+ return qt.charAt(r);
7
7
  }
8
- function Cl(t, l) {
9
- return t & l;
8
+ function Ht(r, t) {
9
+ return r & t;
10
10
  }
11
- function O(t, l) {
12
- return t | l;
11
+ function G(r, t) {
12
+ return r | t;
13
13
  }
14
- function Xl(t, l) {
15
- return t ^ l;
14
+ function pt(r, t) {
15
+ return r ^ t;
16
16
  }
17
- function ol(t, l) {
18
- return t & ~l;
17
+ function dt(r, t) {
18
+ return r & ~t;
19
19
  }
20
- function gl(t) {
21
- if (t == 0)
20
+ function kt(r) {
21
+ if (r == 0)
22
22
  return -1;
23
- var l = 0;
24
- return (t & 65535) == 0 && (t >>= 16, l += 16), (t & 255) == 0 && (t >>= 8, l += 8), (t & 15) == 0 && (t >>= 4, l += 4), (t & 3) == 0 && (t >>= 2, l += 2), (t & 1) == 0 && ++l, l;
23
+ var t = 0;
24
+ return (r & 65535) == 0 && (r >>= 16, t += 16), (r & 255) == 0 && (r >>= 8, t += 8), (r & 15) == 0 && (r >>= 4, t += 4), (r & 3) == 0 && (r >>= 2, t += 2), (r & 1) == 0 && ++t, t;
25
25
  }
26
- function zl(t) {
27
- for (var l = 0; t != 0; )
28
- t &= t - 1, ++l;
29
- return l;
26
+ function Ft(r) {
27
+ for (var t = 0; r != 0; )
28
+ r &= r - 1, ++t;
29
+ return t;
30
30
  }
31
- var z = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", xl = "=";
32
- function D(t) {
33
- var l, i, Z = "";
34
- for (l = 0; l + 3 <= t.length; l += 3)
35
- i = parseInt(t.substring(l, l + 3), 16), Z += z.charAt(i >> 6) + z.charAt(i & 63);
36
- for (l + 1 == t.length ? (i = parseInt(t.substring(l, l + 1), 16), Z += z.charAt(i << 2)) : l + 2 == t.length && (i = parseInt(t.substring(l, l + 2), 16), Z += z.charAt(i >> 2) + z.charAt((i & 3) << 4)); (Z.length & 3) > 0; )
37
- Z += xl;
38
- return Z;
31
+ var F = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", xt = "=";
32
+ function J(r) {
33
+ var t, e, i = "";
34
+ for (t = 0; t + 3 <= r.length; t += 3)
35
+ e = parseInt(r.substring(t, t + 3), 16), i += F.charAt(e >> 6) + F.charAt(e & 63);
36
+ for (t + 1 == r.length ? (e = parseInt(r.substring(t, t + 1), 16), i += F.charAt(e << 2)) : t + 2 == r.length && (e = parseInt(r.substring(t, t + 2), 16), i += F.charAt(e >> 2) + F.charAt((e & 3) << 4)); (i.length & 3) > 0; )
37
+ i += xt;
38
+ return i;
39
39
  }
40
- function Wl(t) {
41
- var l = "", i, Z = 0, d = 0;
42
- for (i = 0; i < t.length && t.charAt(i) != xl; ++i) {
43
- var b = z.indexOf(t.charAt(i));
44
- b < 0 || (Z == 0 ? (l += U(b >> 2), d = b & 3, Z = 1) : Z == 1 ? (l += U(d << 2 | b >> 4), d = b & 15, Z = 2) : Z == 2 ? (l += U(d), l += U(b >> 2), d = b & 3, Z = 3) : (l += U(d << 2 | b >> 4), l += U(b & 15), Z = 0));
40
+ function gt(r) {
41
+ var t = "", e, i = 0, n = 0;
42
+ for (e = 0; e < r.length && r.charAt(e) != xt; ++e) {
43
+ var s = F.indexOf(r.charAt(e));
44
+ s < 0 || (i == 0 ? (t += P(s >> 2), n = s & 3, i = 1) : i == 1 ? (t += P(n << 2 | s >> 4), n = s & 15, i = 2) : i == 2 ? (t += P(n), t += P(s >> 2), n = s & 3, i = 3) : (t += P(n << 2 | s >> 4), t += P(s & 15), i = 0));
45
45
  }
46
- return Z == 1 && (l += U(d << 2)), l;
46
+ return i == 1 && (t += P(n << 2)), t;
47
47
  }
48
- var C, Pl = {
49
- decode: function(t) {
50
- var l;
51
- if (C === void 0) {
52
- var i = "0123456789ABCDEF", Z = ` \f
48
+ var H, Lt = {
49
+ decode: function(r) {
50
+ var t;
51
+ if (H === void 0) {
52
+ var e = "0123456789ABCDEF", i = ` \f
53
53
  \r  \u2028\u2029`;
54
- for (C = {}, l = 0; l < 16; ++l)
55
- C[i.charAt(l)] = l;
56
- for (i = i.toLowerCase(), l = 10; l < 16; ++l)
57
- C[i.charAt(l)] = l;
58
- for (l = 0; l < Z.length; ++l)
59
- C[Z.charAt(l)] = -1;
54
+ for (H = {}, t = 0; t < 16; ++t)
55
+ H[e.charAt(t)] = t;
56
+ for (e = e.toLowerCase(), t = 10; t < 16; ++t)
57
+ H[e.charAt(t)] = t;
58
+ for (t = 0; t < i.length; ++t)
59
+ H[i.charAt(t)] = -1;
60
60
  }
61
- var d = [], b = 0, m = 0;
62
- for (l = 0; l < t.length; ++l) {
63
- var s = t.charAt(l);
64
- if (s == "=")
61
+ var n = [], s = 0, o = 0;
62
+ for (t = 0; t < r.length; ++t) {
63
+ var h = r.charAt(t);
64
+ if (h == "=")
65
65
  break;
66
- if (s = C[s], s != -1) {
67
- if (s === void 0)
68
- throw new Error("Illegal character at offset " + l);
69
- b |= s, ++m >= 2 ? (d[d.length] = b, b = 0, m = 0) : b <<= 4;
66
+ if (h = H[h], h != -1) {
67
+ if (h === void 0)
68
+ throw new Error("Illegal character at offset " + t);
69
+ s |= h, ++o >= 2 ? (n[n.length] = s, s = 0, o = 0) : s <<= 4;
70
70
  }
71
71
  }
72
- if (m)
72
+ if (o)
73
73
  throw new Error("Hex encoding incomplete: 4 bits missing");
74
- return d;
74
+ return n;
75
75
  }
76
- }, H, ul = {
77
- decode: function(t) {
78
- var l;
79
- if (H === void 0) {
80
- var i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Z = `= \f
76
+ }, N, ut = {
77
+ decode: function(r) {
78
+ var t;
79
+ if (N === void 0) {
80
+ var e = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", i = `= \f
81
81
  \r  \u2028\u2029`;
82
- for (H = /* @__PURE__ */ Object.create(null), l = 0; l < 64; ++l)
83
- H[i.charAt(l)] = l;
84
- for (H["-"] = 62, H._ = 63, l = 0; l < Z.length; ++l)
85
- H[Z.charAt(l)] = -1;
82
+ for (N = /* @__PURE__ */ Object.create(null), t = 0; t < 64; ++t)
83
+ N[e.charAt(t)] = t;
84
+ for (N["-"] = 62, N._ = 63, t = 0; t < i.length; ++t)
85
+ N[i.charAt(t)] = -1;
86
86
  }
87
- var d = [], b = 0, m = 0;
88
- for (l = 0; l < t.length; ++l) {
89
- var s = t.charAt(l);
90
- if (s == "=")
87
+ var n = [], s = 0, o = 0;
88
+ for (t = 0; t < r.length; ++t) {
89
+ var h = r.charAt(t);
90
+ if (h == "=")
91
91
  break;
92
- if (s = H[s], s != -1) {
93
- if (s === void 0)
94
- throw new Error("Illegal character at offset " + l);
95
- b |= s, ++m >= 4 ? (d[d.length] = b >> 16, d[d.length] = b >> 8 & 255, d[d.length] = b & 255, b = 0, m = 0) : b <<= 6;
92
+ if (h = N[h], h != -1) {
93
+ if (h === void 0)
94
+ throw new Error("Illegal character at offset " + t);
95
+ s |= h, ++o >= 4 ? (n[n.length] = s >> 16, n[n.length] = s >> 8 & 255, n[n.length] = s & 255, s = 0, o = 0) : s <<= 6;
96
96
  }
97
97
  }
98
- switch (m) {
98
+ switch (o) {
99
99
  case 1:
100
100
  throw new Error("Base64 encoding incomplete: at least 2 bits missing");
101
101
  case 2:
102
- d[d.length] = b >> 10;
102
+ n[n.length] = s >> 10;
103
103
  break;
104
104
  case 3:
105
- d[d.length] = b >> 16, d[d.length] = b >> 8 & 255;
105
+ n[n.length] = s >> 16, n[n.length] = s >> 8 & 255;
106
106
  break;
107
107
  }
108
- return d;
108
+ return n;
109
109
  },
110
110
  re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,
111
- unarmor: function(t) {
112
- var l = ul.re.exec(t);
113
- if (l)
114
- if (l[1])
115
- t = l[1];
116
- else if (l[2])
117
- t = l[2];
111
+ unarmor: function(r) {
112
+ var t = ut.re.exec(r);
113
+ if (t)
114
+ if (t[1])
115
+ r = t[1];
116
+ else if (t[2])
117
+ r = t[2];
118
118
  else
119
119
  throw new Error("RegExp out of sync");
120
- return ul.decode(t);
120
+ return ut.decode(r);
121
121
  }
122
- }, g = 1e13, M = (
122
+ }, k = 1e13, W = (
123
123
  /** @class */
124
124
  (function() {
125
- function t(l) {
126
- this.buf = [+l || 0];
125
+ function r(t) {
126
+ this.buf = [+t || 0];
127
127
  }
128
- return t.prototype.mulAdd = function(l, i) {
129
- var Z = this.buf, d = Z.length, b, m;
130
- for (b = 0; b < d; ++b)
131
- m = Z[b] * l + i, m < g ? i = 0 : (i = 0 | m / g, m -= i * g), Z[b] = m;
132
- i > 0 && (Z[b] = i);
133
- }, t.prototype.sub = function(l) {
134
- var i = this.buf, Z = i.length, d, b;
135
- for (d = 0; d < Z; ++d)
136
- b = i[d] - l, b < 0 ? (b += g, l = 1) : l = 0, i[d] = b;
137
- for (; i[i.length - 1] === 0; )
138
- i.pop();
139
- }, t.prototype.toString = function(l) {
140
- if ((l || 10) != 10)
128
+ return r.prototype.mulAdd = function(t, e) {
129
+ var i = this.buf, n = i.length, s, o;
130
+ for (s = 0; s < n; ++s)
131
+ o = i[s] * t + e, o < k ? e = 0 : (e = 0 | o / k, o -= e * k), i[s] = o;
132
+ e > 0 && (i[s] = e);
133
+ }, r.prototype.sub = function(t) {
134
+ var e = this.buf, i = e.length, n, s;
135
+ for (n = 0; n < i; ++n)
136
+ s = e[n] - t, s < 0 ? (s += k, t = 1) : t = 0, e[n] = s;
137
+ for (; e[e.length - 1] === 0; )
138
+ e.pop();
139
+ }, r.prototype.toString = function(t) {
140
+ if ((t || 10) != 10)
141
141
  throw new Error("only base 10 is supported");
142
- for (var i = this.buf, Z = i[i.length - 1].toString(), d = i.length - 2; d >= 0; --d)
143
- Z += (g + i[d]).toString().substring(1);
144
- return Z;
145
- }, t.prototype.valueOf = function() {
146
- for (var l = this.buf, i = 0, Z = l.length - 1; Z >= 0; --Z)
147
- i = i * g + l[Z];
142
+ for (var e = this.buf, i = e[e.length - 1].toString(), n = e.length - 2; n >= 0; --n)
143
+ i += (k + e[n]).toString().substring(1);
148
144
  return i;
149
- }, t.prototype.simplify = function() {
150
- var l = this.buf;
151
- return l.length == 1 ? l[0] : this;
152
- }, t;
145
+ }, r.prototype.valueOf = function() {
146
+ for (var t = this.buf, e = 0, i = t.length - 1; i >= 0; --i)
147
+ e = e * k + t[i];
148
+ return e;
149
+ }, r.prototype.simplify = function() {
150
+ var t = this.buf;
151
+ return t.length == 1 ? t[0] : this;
152
+ }, r;
153
153
  })()
154
- ), Ll = "…", jl = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/, Ql = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
155
- function P(t, l) {
156
- return t.length > l && (t = t.substring(0, l) + Ll), t;
154
+ ), Rt = "…", Kt = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/, jt = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
155
+ function L(r, t) {
156
+ return r.length > t && (r = r.substring(0, t) + Rt), r;
157
157
  }
158
- var bl = (
158
+ var st = (
159
159
  /** @class */
160
160
  (function() {
161
- function t(l, i) {
162
- this.hexDigits = "0123456789ABCDEF", l instanceof t ? (this.enc = l.enc, this.pos = l.pos) : (this.enc = l, this.pos = i);
161
+ function r(t, e) {
162
+ this.hexDigits = "0123456789ABCDEF", t instanceof r ? (this.enc = t.enc, this.pos = t.pos) : (this.enc = t, this.pos = e);
163
163
  }
164
- return t.prototype.get = function(l) {
165
- if (l === void 0 && (l = this.pos++), l >= this.enc.length)
166
- throw new Error("Requesting byte offset ".concat(l, " on a stream of length ").concat(this.enc.length));
167
- return typeof this.enc == "string" ? this.enc.charCodeAt(l) : this.enc[l];
168
- }, t.prototype.hexByte = function(l) {
169
- return this.hexDigits.charAt(l >> 4 & 15) + this.hexDigits.charAt(l & 15);
170
- }, t.prototype.hexDump = function(l, i, Z) {
171
- for (var d = "", b = l; b < i; ++b)
172
- if (d += this.hexByte(this.get(b)), Z !== !0)
173
- switch (b & 15) {
164
+ return r.prototype.get = function(t) {
165
+ if (t === void 0 && (t = this.pos++), t >= this.enc.length)
166
+ throw new Error("Requesting byte offset ".concat(t, " on a stream of length ").concat(this.enc.length));
167
+ return typeof this.enc == "string" ? this.enc.charCodeAt(t) : this.enc[t];
168
+ }, r.prototype.hexByte = function(t) {
169
+ return this.hexDigits.charAt(t >> 4 & 15) + this.hexDigits.charAt(t & 15);
170
+ }, r.prototype.hexDump = function(t, e, i) {
171
+ for (var n = "", s = t; s < e; ++s)
172
+ if (n += this.hexByte(this.get(s)), i !== !0)
173
+ switch (s & 15) {
174
174
  case 7:
175
- d += " ";
175
+ n += " ";
176
176
  break;
177
177
  case 15:
178
- d += `
178
+ n += `
179
179
  `;
180
180
  break;
181
181
  default:
182
- d += " ";
182
+ n += " ";
183
183
  }
184
- return d;
185
- }, t.prototype.isASCII = function(l, i) {
186
- for (var Z = l; Z < i; ++Z) {
187
- var d = this.get(Z);
188
- if (d < 32 || d > 176)
184
+ return n;
185
+ }, r.prototype.isASCII = function(t, e) {
186
+ for (var i = t; i < e; ++i) {
187
+ var n = this.get(i);
188
+ if (n < 32 || n > 176)
189
189
  return !1;
190
190
  }
191
191
  return !0;
192
- }, t.prototype.parseStringISO = function(l, i) {
193
- for (var Z = "", d = l; d < i; ++d)
194
- Z += String.fromCharCode(this.get(d));
195
- return Z;
196
- }, t.prototype.parseStringUTF = function(l, i) {
197
- for (var Z = "", d = l; d < i; ) {
198
- var b = this.get(d++);
199
- b < 128 ? Z += String.fromCharCode(b) : b > 191 && b < 224 ? Z += String.fromCharCode((b & 31) << 6 | this.get(d++) & 63) : Z += String.fromCharCode((b & 15) << 12 | (this.get(d++) & 63) << 6 | this.get(d++) & 63);
192
+ }, r.prototype.parseStringISO = function(t, e) {
193
+ for (var i = "", n = t; n < e; ++n)
194
+ i += String.fromCharCode(this.get(n));
195
+ return i;
196
+ }, r.prototype.parseStringUTF = function(t, e) {
197
+ for (var i = "", n = t; n < e; ) {
198
+ var s = this.get(n++);
199
+ s < 128 ? i += String.fromCharCode(s) : s > 191 && s < 224 ? i += String.fromCharCode((s & 31) << 6 | this.get(n++) & 63) : i += String.fromCharCode((s & 15) << 12 | (this.get(n++) & 63) << 6 | this.get(n++) & 63);
200
200
  }
201
- return Z;
202
- }, t.prototype.parseStringBMP = function(l, i) {
203
- for (var Z = "", d, b, m = l; m < i; )
204
- d = this.get(m++), b = this.get(m++), Z += String.fromCharCode(d << 8 | b);
205
- return Z;
206
- }, t.prototype.parseTime = function(l, i, Z) {
207
- var d = this.parseStringISO(l, i), b = (Z ? jl : Ql).exec(d);
208
- return b ? (Z && (b[1] = +b[1], b[1] += +b[1] < 70 ? 2e3 : 1900), d = b[1] + "-" + b[2] + "-" + b[3] + " " + b[4], b[5] && (d += ":" + b[5], b[6] && (d += ":" + b[6], b[7] && (d += "." + b[7]))), b[8] && (d += " UTC", b[8] != "Z" && (d += b[8], b[9] && (d += ":" + b[9]))), d) : "Unrecognized time: " + d;
209
- }, t.prototype.parseInteger = function(l, i) {
210
- for (var Z = this.get(l), d = Z > 127, b = d ? 255 : 0, m, s = ""; Z == b && ++l < i; )
211
- Z = this.get(l);
212
- if (m = i - l, m === 0)
213
- return d ? -1 : 0;
214
- if (m > 4) {
215
- for (s = Z, m <<= 3; ((+s ^ b) & 128) == 0; )
216
- s = +s << 1, --m;
217
- s = "(" + m + ` bit)
201
+ return i;
202
+ }, r.prototype.parseStringBMP = function(t, e) {
203
+ for (var i = "", n, s, o = t; o < e; )
204
+ n = this.get(o++), s = this.get(o++), i += String.fromCharCode(n << 8 | s);
205
+ return i;
206
+ }, r.prototype.parseTime = function(t, e, i) {
207
+ var n = this.parseStringISO(t, e), s = (i ? Kt : jt).exec(n);
208
+ return s ? (i && (s[1] = +s[1], s[1] += +s[1] < 70 ? 2e3 : 1900), n = s[1] + "-" + s[2] + "-" + s[3] + " " + s[4], s[5] && (n += ":" + s[5], s[6] && (n += ":" + s[6], s[7] && (n += "." + s[7]))), s[8] && (n += " UTC", s[8] != "Z" && (n += s[8], s[9] && (n += ":" + s[9]))), n) : "Unrecognized time: " + n;
209
+ }, r.prototype.parseInteger = function(t, e) {
210
+ for (var i = this.get(t), n = i > 127, s = n ? 255 : 0, o, h = ""; i == s && ++t < e; )
211
+ i = this.get(t);
212
+ if (o = e - t, o === 0)
213
+ return n ? -1 : 0;
214
+ if (o > 4) {
215
+ for (h = i, o <<= 3; ((+h ^ s) & 128) == 0; )
216
+ h = +h << 1, --o;
217
+ h = "(" + o + ` bit)
218
218
  `;
219
219
  }
220
- d && (Z = Z - 256);
221
- for (var c = new M(Z), e = l + 1; e < i; ++e)
222
- c.mulAdd(256, this.get(e));
223
- return s + c.toString();
224
- }, t.prototype.parseBitString = function(l, i, Z) {
225
- for (var d = this.get(l), b = (i - l - 1 << 3) - d, m = "(" + b + ` bit)
226
- `, s = "", c = l + 1; c < i; ++c) {
227
- for (var e = this.get(c), h = c == i - 1 ? d : 0, n = 7; n >= h; --n)
228
- s += e >> n & 1 ? "1" : "0";
229
- if (s.length > Z)
230
- return m + P(s, Z);
220
+ n && (i = i - 256);
221
+ for (var a = new W(i), f = t + 1; f < e; ++f)
222
+ a.mulAdd(256, this.get(f));
223
+ return h + a.toString();
224
+ }, r.prototype.parseBitString = function(t, e, i) {
225
+ for (var n = this.get(t), s = (e - t - 1 << 3) - n, o = "(" + s + ` bit)
226
+ `, h = "", a = t + 1; a < e; ++a) {
227
+ for (var f = this.get(a), l = a == e - 1 ? n : 0, c = 7; c >= l; --c)
228
+ h += f >> c & 1 ? "1" : "0";
229
+ if (h.length > i)
230
+ return o + L(h, i);
231
231
  }
232
- return m + s;
233
- }, t.prototype.parseOctetString = function(l, i, Z) {
234
- if (this.isASCII(l, i))
235
- return P(this.parseStringISO(l, i), Z);
236
- var d = i - l, b = "(" + d + ` byte)
232
+ return o + h;
233
+ }, r.prototype.parseOctetString = function(t, e, i) {
234
+ if (this.isASCII(t, e))
235
+ return L(this.parseStringISO(t, e), i);
236
+ var n = e - t, s = "(" + n + ` byte)
237
237
  `;
238
- Z /= 2, d > Z && (i = l + Z);
239
- for (var m = l; m < i; ++m)
240
- b += this.hexByte(this.get(m));
241
- return d > Z && (b += Ll), b;
242
- }, t.prototype.parseOID = function(l, i, Z) {
243
- for (var d = "", b = new M(), m = 0, s = l; s < i; ++s) {
244
- var c = this.get(s);
245
- if (b.mulAdd(128, c & 127), m += 7, !(c & 128)) {
246
- if (d === "")
247
- if (b = b.simplify(), b instanceof M)
248
- b.sub(80), d = "2." + b.toString();
238
+ i /= 2, n > i && (e = t + i);
239
+ for (var o = t; o < e; ++o)
240
+ s += this.hexByte(this.get(o));
241
+ return n > i && (s += Rt), s;
242
+ }, r.prototype.parseOID = function(t, e, i) {
243
+ for (var n = "", s = new W(), o = 0, h = t; h < e; ++h) {
244
+ var a = this.get(h);
245
+ if (s.mulAdd(128, a & 127), o += 7, !(a & 128)) {
246
+ if (n === "")
247
+ if (s = s.simplify(), s instanceof W)
248
+ s.sub(80), n = "2." + s.toString();
249
249
  else {
250
- var e = b < 80 ? b < 40 ? 0 : 1 : 2;
251
- d = e + "." + (b - e * 40);
250
+ var f = s < 80 ? s < 40 ? 0 : 1 : 2;
251
+ n = f + "." + (s - f * 40);
252
252
  }
253
253
  else
254
- d += "." + b.toString();
255
- if (d.length > Z)
256
- return P(d, Z);
257
- b = new M(), m = 0;
254
+ n += "." + s.toString();
255
+ if (n.length > i)
256
+ return L(n, i);
257
+ s = new W(), o = 0;
258
258
  }
259
259
  }
260
- return m > 0 && (d += ".incomplete"), d;
261
- }, t;
260
+ return o > 0 && (n += ".incomplete"), n;
261
+ }, r;
262
262
  })()
263
- ), wl = (
263
+ ), Ut = (
264
264
  /** @class */
265
265
  (function() {
266
- function t(l, i, Z, d, b) {
267
- if (!(d instanceof al))
266
+ function r(t, e, i, n, s) {
267
+ if (!(n instanceof vt))
268
268
  throw new Error("Invalid tag value.");
269
- this.stream = l, this.header = i, this.length = Z, this.tag = d, this.sub = b;
269
+ this.stream = t, this.header = e, this.length = i, this.tag = n, this.sub = s;
270
270
  }
271
- return t.prototype.typeName = function() {
271
+ return r.prototype.typeName = function() {
272
272
  switch (this.tag.tagClass) {
273
273
  case 0:
274
274
  switch (this.tag.tagNumber) {
@@ -340,25 +340,25 @@ var bl = (
340
340
  case 3:
341
341
  return "Private_" + this.tag.tagNumber.toString();
342
342
  }
343
- }, t.prototype.content = function(l) {
343
+ }, r.prototype.content = function(t) {
344
344
  if (this.tag === void 0)
345
345
  return null;
346
- l === void 0 && (l = 1 / 0);
347
- var i = this.posContent(), Z = Math.abs(this.length);
346
+ t === void 0 && (t = 1 / 0);
347
+ var e = this.posContent(), i = Math.abs(this.length);
348
348
  if (!this.tag.isUniversal())
349
- return this.sub !== null ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(i, i + Z, l);
349
+ return this.sub !== null ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(e, e + i, t);
350
350
  switch (this.tag.tagNumber) {
351
351
  case 1:
352
- return this.stream.get(i) === 0 ? "false" : "true";
352
+ return this.stream.get(e) === 0 ? "false" : "true";
353
353
  case 2:
354
- return this.stream.parseInteger(i, i + Z);
354
+ return this.stream.parseInteger(e, e + i);
355
355
  case 3:
356
- return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(i, i + Z, l);
356
+ return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(e, e + i, t);
357
357
  case 4:
358
- return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(i, i + Z, l);
358
+ return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(e, e + i, t);
359
359
  // case 0x05: // NULL
360
360
  case 6:
361
- return this.stream.parseOID(i, i + Z, l);
361
+ return this.stream.parseOID(e, e + i, t);
362
362
  // case 0x07: // ObjectDescriptor
363
363
  // case 0x08: // EXTERNAL
364
364
  // case 0x09: // REAL
@@ -369,7 +369,7 @@ var bl = (
369
369
  case 17:
370
370
  return this.sub !== null ? "(" + this.sub.length + " elem)" : "(no elem)";
371
371
  case 12:
372
- return P(this.stream.parseStringUTF(i, i + Z), l);
372
+ return L(this.stream.parseStringUTF(e, e + i), t);
373
373
  case 18:
374
374
  // NumericString
375
375
  case 19:
@@ -382,169 +382,169 @@ var bl = (
382
382
  // IA5String
383
383
  // case 0x19: // GraphicString
384
384
  case 26:
385
- return P(this.stream.parseStringISO(i, i + Z), l);
385
+ return L(this.stream.parseStringISO(e, e + i), t);
386
386
  case 30:
387
- return P(this.stream.parseStringBMP(i, i + Z), l);
387
+ return L(this.stream.parseStringBMP(e, e + i), t);
388
388
  case 23:
389
389
  // UTCTime
390
390
  case 24:
391
- return this.stream.parseTime(i, i + Z, this.tag.tagNumber == 23);
391
+ return this.stream.parseTime(e, e + i, this.tag.tagNumber == 23);
392
392
  }
393
393
  return null;
394
- }, t.prototype.toString = function() {
394
+ }, r.prototype.toString = function() {
395
395
  return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (this.sub === null ? "null" : this.sub.length) + "]";
396
- }, t.prototype.toPrettyString = function(l) {
397
- l === void 0 && (l = "");
398
- var i = l + this.typeName() + " @" + this.stream.pos;
399
- if (this.length >= 0 && (i += "+"), i += this.length, this.tag.tagConstructed ? i += " (constructed)" : this.tag.isUniversal() && (this.tag.tagNumber == 3 || this.tag.tagNumber == 4) && this.sub !== null && (i += " (encapsulates)"), i += `
396
+ }, r.prototype.toPrettyString = function(t) {
397
+ t === void 0 && (t = "");
398
+ var e = t + this.typeName() + " @" + this.stream.pos;
399
+ if (this.length >= 0 && (e += "+"), e += this.length, this.tag.tagConstructed ? e += " (constructed)" : this.tag.isUniversal() && (this.tag.tagNumber == 3 || this.tag.tagNumber == 4) && this.sub !== null && (e += " (encapsulates)"), e += `
400
400
  `, this.sub !== null) {
401
- l += " ";
402
- for (var Z = 0, d = this.sub.length; Z < d; ++Z)
403
- i += this.sub[Z].toPrettyString(l);
401
+ t += " ";
402
+ for (var i = 0, n = this.sub.length; i < n; ++i)
403
+ e += this.sub[i].toPrettyString(t);
404
404
  }
405
- return i;
406
- }, t.prototype.posStart = function() {
405
+ return e;
406
+ }, r.prototype.posStart = function() {
407
407
  return this.stream.pos;
408
- }, t.prototype.posContent = function() {
408
+ }, r.prototype.posContent = function() {
409
409
  return this.stream.pos + this.header;
410
- }, t.prototype.posEnd = function() {
410
+ }, r.prototype.posEnd = function() {
411
411
  return this.stream.pos + this.header + Math.abs(this.length);
412
- }, t.prototype.toHexString = function() {
412
+ }, r.prototype.toHexString = function() {
413
413
  return this.stream.hexDump(this.posStart(), this.posEnd(), !0);
414
- }, t.decodeLength = function(l) {
415
- var i = l.get(), Z = i & 127;
416
- if (Z == i)
417
- return Z;
418
- if (Z > 6)
419
- throw new Error("Length over 48 bits not supported at position " + (l.pos - 1));
420
- if (Z === 0)
414
+ }, r.decodeLength = function(t) {
415
+ var e = t.get(), i = e & 127;
416
+ if (i == e)
417
+ return i;
418
+ if (i > 6)
419
+ throw new Error("Length over 48 bits not supported at position " + (t.pos - 1));
420
+ if (i === 0)
421
421
  return null;
422
- i = 0;
423
- for (var d = 0; d < Z; ++d)
424
- i = i * 256 + l.get();
425
- return i;
426
- }, t.prototype.getHexStringValue = function() {
427
- var l = this.toHexString(), i = this.header * 2, Z = this.length * 2;
428
- return l.substring(i, i + Z);
429
- }, t.decode = function(l) {
430
- var i;
431
- l instanceof bl ? i = l : i = new bl(l, 0);
432
- var Z = new bl(i), d = new al(i), b = t.decodeLength(i), m = i.pos, s = m - Z.pos, c = null, e = function() {
433
- var n = [];
434
- if (b !== null) {
435
- for (var W = m + b; i.pos < W; )
436
- n[n.length] = t.decode(i);
437
- if (i.pos != W)
438
- throw new Error("Content size is not correct for container starting at offset " + m);
422
+ e = 0;
423
+ for (var n = 0; n < i; ++n)
424
+ e = e * 256 + t.get();
425
+ return e;
426
+ }, r.prototype.getHexStringValue = function() {
427
+ var t = this.toHexString(), e = this.header * 2, i = this.length * 2;
428
+ return t.substring(e, e + i);
429
+ }, r.decode = function(t) {
430
+ var e;
431
+ t instanceof st ? e = t : e = new st(t, 0);
432
+ var i = new st(e), n = new vt(e), s = r.decodeLength(e), o = e.pos, h = o - i.pos, a = null, f = function() {
433
+ var c = [];
434
+ if (s !== null) {
435
+ for (var g = o + s; e.pos < g; )
436
+ c[c.length] = r.decode(e);
437
+ if (e.pos != g)
438
+ throw new Error("Content size is not correct for container starting at offset " + o);
439
439
  } else
440
440
  try {
441
441
  for (; ; ) {
442
- var X = t.decode(i);
443
- if (X.tag.isEOC())
442
+ var p = r.decode(e);
443
+ if (p.tag.isEOC())
444
444
  break;
445
- n[n.length] = X;
445
+ c[c.length] = p;
446
446
  }
447
- b = m - i.pos;
448
- } catch (p) {
449
- throw new Error("Exception while decoding undefined length content: " + p);
447
+ s = o - e.pos;
448
+ } catch (m) {
449
+ throw new Error("Exception while decoding undefined length content: " + m);
450
450
  }
451
- return n;
451
+ return c;
452
452
  };
453
- if (d.tagConstructed)
454
- c = e();
455
- else if (d.isUniversal() && (d.tagNumber == 3 || d.tagNumber == 4))
453
+ if (n.tagConstructed)
454
+ a = f();
455
+ else if (n.isUniversal() && (n.tagNumber == 3 || n.tagNumber == 4))
456
456
  try {
457
- if (d.tagNumber == 3 && i.get() != 0)
457
+ if (n.tagNumber == 3 && e.get() != 0)
458
458
  throw new Error("BIT STRINGs with unused bits cannot encapsulate.");
459
- c = e();
460
- for (var h = 0; h < c.length; ++h)
461
- if (c[h].tag.isEOC())
459
+ a = f();
460
+ for (var l = 0; l < a.length; ++l)
461
+ if (a[l].tag.isEOC())
462
462
  throw new Error("EOC is not supposed to be actual content.");
463
463
  } catch {
464
- c = null;
464
+ a = null;
465
465
  }
466
- if (c === null) {
467
- if (b === null)
468
- throw new Error("We can't skip over an invalid tag with undefined length at offset " + m);
469
- i.pos = m + Math.abs(b);
466
+ if (a === null) {
467
+ if (s === null)
468
+ throw new Error("We can't skip over an invalid tag with undefined length at offset " + o);
469
+ e.pos = o + Math.abs(s);
470
470
  }
471
- return new t(Z, s, b, d, c);
472
- }, t;
471
+ return new r(i, h, s, n, a);
472
+ }, r;
473
473
  })()
474
- ), al = (
474
+ ), vt = (
475
475
  /** @class */
476
476
  (function() {
477
- function t(l) {
478
- var i = l.get();
479
- if (this.tagClass = i >> 6, this.tagConstructed = (i & 32) !== 0, this.tagNumber = i & 31, this.tagNumber == 31) {
480
- var Z = new M();
477
+ function r(t) {
478
+ var e = t.get();
479
+ if (this.tagClass = e >> 6, this.tagConstructed = (e & 32) !== 0, this.tagNumber = e & 31, this.tagNumber == 31) {
480
+ var i = new W();
481
481
  do
482
- i = l.get(), Z.mulAdd(128, i & 127);
483
- while (i & 128);
484
- this.tagNumber = Z.simplify();
482
+ e = t.get(), i.mulAdd(128, e & 127);
483
+ while (e & 128);
484
+ this.tagNumber = i.simplify();
485
485
  }
486
486
  }
487
- return t.prototype.isUniversal = function() {
487
+ return r.prototype.isUniversal = function() {
488
488
  return this.tagClass === 0;
489
- }, t.prototype.isEOC = function() {
489
+ }, r.prototype.isEOC = function() {
490
490
  return this.tagClass === 0 && this.tagNumber === 0;
491
- }, t;
491
+ }, r;
492
492
  })()
493
- ), I, Ml = 244837814094590, Vl = (Ml & 16777215) == 15715070, S = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997], Dl = (1 << 26) / S[S.length - 1], o = (
493
+ ), O, Wt = 244837814094590, yt = (Wt & 16777215) == 15715070, E = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997], Jt = (1 << 26) / E[E.length - 1], d = (
494
494
  /** @class */
495
495
  (function() {
496
- function t(l, i, Z) {
497
- l != null && (typeof l == "number" ? this.fromNumber(l, i, Z) : i == null && typeof l != "string" ? this.fromString(l, 256) : this.fromString(l, i));
496
+ function r(t, e, i) {
497
+ t != null && (typeof t == "number" ? this.fromNumber(t, e, i) : e == null && typeof t != "string" ? this.fromString(t, 256) : this.fromString(t, e));
498
498
  }
499
- return t.prototype.toString = function(l) {
499
+ return r.prototype.toString = function(t) {
500
500
  if (this.s < 0)
501
- return "-" + this.negate().toString(l);
502
- var i;
503
- if (l == 16)
504
- i = 4;
505
- else if (l == 8)
506
- i = 3;
507
- else if (l == 2)
508
- i = 1;
509
- else if (l == 32)
510
- i = 5;
511
- else if (l == 4)
512
- i = 2;
501
+ return "-" + this.negate().toString(t);
502
+ var e;
503
+ if (t == 16)
504
+ e = 4;
505
+ else if (t == 8)
506
+ e = 3;
507
+ else if (t == 2)
508
+ e = 1;
509
+ else if (t == 32)
510
+ e = 5;
511
+ else if (t == 4)
512
+ e = 2;
513
513
  else
514
- return this.toRadix(l);
515
- var Z = (1 << i) - 1, d, b = !1, m = "", s = this.t, c = this.DB - s * this.DB % i;
516
- if (s-- > 0)
517
- for (c < this.DB && (d = this[s] >> c) > 0 && (b = !0, m = U(d)); s >= 0; )
518
- c < i ? (d = (this[s] & (1 << c) - 1) << i - c, d |= this[--s] >> (c += this.DB - i)) : (d = this[s] >> (c -= i) & Z, c <= 0 && (c += this.DB, --s)), d > 0 && (b = !0), b && (m += U(d));
519
- return b ? m : "0";
520
- }, t.prototype.negate = function() {
521
- var l = a();
522
- return t.ZERO.subTo(this, l), l;
523
- }, t.prototype.abs = function() {
514
+ return this.toRadix(t);
515
+ var i = (1 << e) - 1, n, s = !1, o = "", h = this.t, a = this.DB - h * this.DB % e;
516
+ if (h-- > 0)
517
+ for (a < this.DB && (n = this[h] >> a) > 0 && (s = !0, o = P(n)); h >= 0; )
518
+ a < e ? (n = (this[h] & (1 << a) - 1) << e - a, n |= this[--h] >> (a += this.DB - e)) : (n = this[h] >> (a -= e) & i, a <= 0 && (a += this.DB, --h)), n > 0 && (s = !0), s && (o += P(n));
519
+ return s ? o : "0";
520
+ }, r.prototype.negate = function() {
521
+ var t = v();
522
+ return r.ZERO.subTo(this, t), t;
523
+ }, r.prototype.abs = function() {
524
524
  return this.s < 0 ? this.negate() : this;
525
- }, t.prototype.compareTo = function(l) {
526
- var i = this.s - l.s;
527
- if (i != 0)
528
- return i;
529
- var Z = this.t;
530
- if (i = Z - l.t, i != 0)
531
- return this.s < 0 ? -i : i;
532
- for (; --Z >= 0; )
533
- if ((i = this[Z] - l[Z]) != 0)
534
- return i;
525
+ }, r.prototype.compareTo = function(t) {
526
+ var e = this.s - t.s;
527
+ if (e != 0)
528
+ return e;
529
+ var i = this.t;
530
+ if (e = i - t.t, e != 0)
531
+ return this.s < 0 ? -e : e;
532
+ for (; --i >= 0; )
533
+ if ((e = this[i] - t[i]) != 0)
534
+ return e;
535
535
  return 0;
536
- }, t.prototype.bitLength = function() {
537
- return this.t <= 0 ? 0 : this.DB * (this.t - 1) + A(this[this.t - 1] ^ this.s & this.DM);
538
- }, t.prototype.mod = function(l) {
539
- var i = a();
540
- return this.abs().divRemTo(l, null, i), this.s < 0 && i.compareTo(t.ZERO) > 0 && l.subTo(i, i), i;
541
- }, t.prototype.modPowInt = function(l, i) {
542
- var Z;
543
- return l < 256 || i.isEven() ? Z = new pl(i) : Z = new Gl(i), this.exp(l, Z);
544
- }, t.prototype.clone = function() {
545
- var l = a();
546
- return this.copyTo(l), l;
547
- }, t.prototype.intValue = function() {
536
+ }, r.prototype.bitLength = function() {
537
+ return this.t <= 0 ? 0 : this.DB * (this.t - 1) + Z(this[this.t - 1] ^ this.s & this.DM);
538
+ }, r.prototype.mod = function(t) {
539
+ var e = v();
540
+ return this.abs().divRemTo(t, null, e), this.s < 0 && e.compareTo(r.ZERO) > 0 && t.subTo(e, e), e;
541
+ }, r.prototype.modPowInt = function(t, e) {
542
+ var i;
543
+ return t < 256 || e.isEven() ? i = new mt(e) : i = new St(e), this.exp(t, i);
544
+ }, r.prototype.clone = function() {
545
+ var t = v();
546
+ return this.copyTo(t), t;
547
+ }, r.prototype.intValue = function() {
548
548
  if (this.s < 0) {
549
549
  if (this.t == 1)
550
550
  return this[0] - this.DV;
@@ -557,896 +557,896 @@ var bl = (
557
557
  return 0;
558
558
  }
559
559
  return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0];
560
- }, t.prototype.byteValue = function() {
560
+ }, r.prototype.byteValue = function() {
561
561
  return this.t == 0 ? this.s : this[0] << 24 >> 24;
562
- }, t.prototype.shortValue = function() {
562
+ }, r.prototype.shortValue = function() {
563
563
  return this.t == 0 ? this.s : this[0] << 16 >> 16;
564
- }, t.prototype.signum = function() {
564
+ }, r.prototype.signum = function() {
565
565
  return this.s < 0 ? -1 : this.t <= 0 || this.t == 1 && this[0] <= 0 ? 0 : 1;
566
- }, t.prototype.toByteArray = function() {
567
- var l = this.t, i = [];
568
- i[0] = this.s;
569
- var Z = this.DB - l * this.DB % 8, d, b = 0;
570
- if (l-- > 0)
571
- for (Z < this.DB && (d = this[l] >> Z) != (this.s & this.DM) >> Z && (i[b++] = d | this.s << this.DB - Z); l >= 0; )
572
- Z < 8 ? (d = (this[l] & (1 << Z) - 1) << 8 - Z, d |= this[--l] >> (Z += this.DB - 8)) : (d = this[l] >> (Z -= 8) & 255, Z <= 0 && (Z += this.DB, --l)), (d & 128) != 0 && (d |= -256), b == 0 && (this.s & 128) != (d & 128) && ++b, (b > 0 || d != this.s) && (i[b++] = d);
573
- return i;
574
- }, t.prototype.equals = function(l) {
575
- return this.compareTo(l) == 0;
576
- }, t.prototype.min = function(l) {
577
- return this.compareTo(l) < 0 ? this : l;
578
- }, t.prototype.max = function(l) {
579
- return this.compareTo(l) > 0 ? this : l;
580
- }, t.prototype.and = function(l) {
581
- var i = a();
582
- return this.bitwiseTo(l, Cl, i), i;
583
- }, t.prototype.or = function(l) {
584
- var i = a();
585
- return this.bitwiseTo(l, O, i), i;
586
- }, t.prototype.xor = function(l) {
587
- var i = a();
588
- return this.bitwiseTo(l, Xl, i), i;
589
- }, t.prototype.andNot = function(l) {
590
- var i = a();
591
- return this.bitwiseTo(l, ol, i), i;
592
- }, t.prototype.not = function() {
593
- for (var l = a(), i = 0; i < this.t; ++i)
594
- l[i] = this.DM & ~this[i];
595
- return l.t = this.t, l.s = ~this.s, l;
596
- }, t.prototype.shiftLeft = function(l) {
597
- var i = a();
598
- return l < 0 ? this.rShiftTo(-l, i) : this.lShiftTo(l, i), i;
599
- }, t.prototype.shiftRight = function(l) {
600
- var i = a();
601
- return l < 0 ? this.lShiftTo(-l, i) : this.rShiftTo(l, i), i;
602
- }, t.prototype.getLowestSetBit = function() {
603
- for (var l = 0; l < this.t; ++l)
604
- if (this[l] != 0)
605
- return l * this.DB + gl(this[l]);
566
+ }, r.prototype.toByteArray = function() {
567
+ var t = this.t, e = [];
568
+ e[0] = this.s;
569
+ var i = this.DB - t * this.DB % 8, n, s = 0;
570
+ if (t-- > 0)
571
+ for (i < this.DB && (n = this[t] >> i) != (this.s & this.DM) >> i && (e[s++] = n | this.s << this.DB - i); t >= 0; )
572
+ i < 8 ? (n = (this[t] & (1 << i) - 1) << 8 - i, n |= this[--t] >> (i += this.DB - 8)) : (n = this[t] >> (i -= 8) & 255, i <= 0 && (i += this.DB, --t)), (n & 128) != 0 && (n |= -256), s == 0 && (this.s & 128) != (n & 128) && ++s, (s > 0 || n != this.s) && (e[s++] = n);
573
+ return e;
574
+ }, r.prototype.equals = function(t) {
575
+ return this.compareTo(t) == 0;
576
+ }, r.prototype.min = function(t) {
577
+ return this.compareTo(t) < 0 ? this : t;
578
+ }, r.prototype.max = function(t) {
579
+ return this.compareTo(t) > 0 ? this : t;
580
+ }, r.prototype.and = function(t) {
581
+ var e = v();
582
+ return this.bitwiseTo(t, Ht, e), e;
583
+ }, r.prototype.or = function(t) {
584
+ var e = v();
585
+ return this.bitwiseTo(t, G, e), e;
586
+ }, r.prototype.xor = function(t) {
587
+ var e = v();
588
+ return this.bitwiseTo(t, pt, e), e;
589
+ }, r.prototype.andNot = function(t) {
590
+ var e = v();
591
+ return this.bitwiseTo(t, dt, e), e;
592
+ }, r.prototype.not = function() {
593
+ for (var t = v(), e = 0; e < this.t; ++e)
594
+ t[e] = this.DM & ~this[e];
595
+ return t.t = this.t, t.s = ~this.s, t;
596
+ }, r.prototype.shiftLeft = function(t) {
597
+ var e = v();
598
+ return t < 0 ? this.rShiftTo(-t, e) : this.lShiftTo(t, e), e;
599
+ }, r.prototype.shiftRight = function(t) {
600
+ var e = v();
601
+ return t < 0 ? this.lShiftTo(-t, e) : this.rShiftTo(t, e), e;
602
+ }, r.prototype.getLowestSetBit = function() {
603
+ for (var t = 0; t < this.t; ++t)
604
+ if (this[t] != 0)
605
+ return t * this.DB + kt(this[t]);
606
606
  return this.s < 0 ? this.t * this.DB : -1;
607
- }, t.prototype.bitCount = function() {
608
- for (var l = 0, i = this.s & this.DM, Z = 0; Z < this.t; ++Z)
609
- l += zl(this[Z] ^ i);
610
- return l;
611
- }, t.prototype.testBit = function(l) {
612
- var i = Math.floor(l / this.DB);
613
- return i >= this.t ? this.s != 0 : (this[i] & 1 << l % this.DB) != 0;
614
- }, t.prototype.setBit = function(l) {
615
- return this.changeBit(l, O);
616
- }, t.prototype.clearBit = function(l) {
617
- return this.changeBit(l, ol);
618
- }, t.prototype.flipBit = function(l) {
619
- return this.changeBit(l, Xl);
620
- }, t.prototype.add = function(l) {
621
- var i = a();
622
- return this.addTo(l, i), i;
623
- }, t.prototype.subtract = function(l) {
624
- var i = a();
625
- return this.subTo(l, i), i;
626
- }, t.prototype.multiply = function(l) {
627
- var i = a();
628
- return this.multiplyTo(l, i), i;
629
- }, t.prototype.divide = function(l) {
630
- var i = a();
631
- return this.divRemTo(l, i, null), i;
632
- }, t.prototype.remainder = function(l) {
633
- var i = a();
634
- return this.divRemTo(l, null, i), i;
635
- }, t.prototype.divideAndRemainder = function(l) {
636
- var i = a(), Z = a();
637
- return this.divRemTo(l, i, Z), [i, Z];
638
- }, t.prototype.modPow = function(l, i) {
639
- var Z = l.bitLength(), d, b = f(1), m;
640
- if (Z <= 0)
641
- return b;
642
- Z < 18 ? d = 1 : Z < 48 ? d = 3 : Z < 144 ? d = 4 : Z < 768 ? d = 5 : d = 6, Z < 8 ? m = new pl(i) : i.isEven() ? m = new Bl(i) : m = new Gl(i);
643
- var s = [], c = 3, e = d - 1, h = (1 << d) - 1;
644
- if (s[1] = m.convert(this), d > 1) {
645
- var n = a();
646
- for (m.sqrTo(s[1], n); c <= h; )
647
- s[c] = a(), m.mulTo(n, s[c - 2], s[c]), c += 2;
607
+ }, r.prototype.bitCount = function() {
608
+ for (var t = 0, e = this.s & this.DM, i = 0; i < this.t; ++i)
609
+ t += Ft(this[i] ^ e);
610
+ return t;
611
+ }, r.prototype.testBit = function(t) {
612
+ var e = Math.floor(t / this.DB);
613
+ return e >= this.t ? this.s != 0 : (this[e] & 1 << t % this.DB) != 0;
614
+ }, r.prototype.setBit = function(t) {
615
+ return this.changeBit(t, G);
616
+ }, r.prototype.clearBit = function(t) {
617
+ return this.changeBit(t, dt);
618
+ }, r.prototype.flipBit = function(t) {
619
+ return this.changeBit(t, pt);
620
+ }, r.prototype.add = function(t) {
621
+ var e = v();
622
+ return this.addTo(t, e), e;
623
+ }, r.prototype.subtract = function(t) {
624
+ var e = v();
625
+ return this.subTo(t, e), e;
626
+ }, r.prototype.multiply = function(t) {
627
+ var e = v();
628
+ return this.multiplyTo(t, e), e;
629
+ }, r.prototype.divide = function(t) {
630
+ var e = v();
631
+ return this.divRemTo(t, e, null), e;
632
+ }, r.prototype.remainder = function(t) {
633
+ var e = v();
634
+ return this.divRemTo(t, null, e), e;
635
+ }, r.prototype.divideAndRemainder = function(t) {
636
+ var e = v(), i = v();
637
+ return this.divRemTo(t, e, i), [e, i];
638
+ }, r.prototype.modPow = function(t, e) {
639
+ var i = t.bitLength(), n, s = V(1), o;
640
+ if (i <= 0)
641
+ return s;
642
+ i < 18 ? n = 1 : i < 48 ? n = 3 : i < 144 ? n = 4 : i < 768 ? n = 5 : n = 6, i < 8 ? o = new mt(e) : e.isEven() ? o = new $t(e) : o = new St(e);
643
+ var h = [], a = 3, f = n - 1, l = (1 << n) - 1;
644
+ if (h[1] = o.convert(this), n > 1) {
645
+ var c = v();
646
+ for (o.sqrTo(h[1], c); a <= l; )
647
+ h[a] = v(), o.mulTo(c, h[a - 2], h[a]), a += 2;
648
648
  }
649
- var W = l.t - 1, X, p = !0, G = a(), R;
650
- for (Z = A(l[W]) - 1; W >= 0; ) {
651
- for (Z >= e ? X = l[W] >> Z - e & h : (X = (l[W] & (1 << Z + 1) - 1) << e - Z, W > 0 && (X |= l[W - 1] >> this.DB + Z - e)), c = d; (X & 1) == 0; )
652
- X >>= 1, --c;
653
- if ((Z -= c) < 0 && (Z += this.DB, --W), p)
654
- s[X].copyTo(b), p = !1;
649
+ var g = t.t - 1, p, m = !0, S = v(), D;
650
+ for (i = Z(t[g]) - 1; g >= 0; ) {
651
+ for (i >= f ? p = t[g] >> i - f & l : (p = (t[g] & (1 << i + 1) - 1) << f - i, g > 0 && (p |= t[g - 1] >> this.DB + i - f)), a = n; (p & 1) == 0; )
652
+ p >>= 1, --a;
653
+ if ((i -= a) < 0 && (i += this.DB, --g), m)
654
+ h[p].copyTo(s), m = !1;
655
655
  else {
656
- for (; c > 1; )
657
- m.sqrTo(b, G), m.sqrTo(G, b), c -= 2;
658
- c > 0 ? m.sqrTo(b, G) : (R = b, b = G, G = R), m.mulTo(G, s[X], b);
656
+ for (; a > 1; )
657
+ o.sqrTo(s, S), o.sqrTo(S, s), a -= 2;
658
+ a > 0 ? o.sqrTo(s, S) : (D = s, s = S, S = D), o.mulTo(S, h[p], s);
659
659
  }
660
- for (; W >= 0 && (l[W] & 1 << Z) == 0; )
661
- m.sqrTo(b, G), R = b, b = G, G = R, --Z < 0 && (Z = this.DB - 1, --W);
660
+ for (; g >= 0 && (t[g] & 1 << i) == 0; )
661
+ o.sqrTo(s, S), D = s, s = S, S = D, --i < 0 && (i = this.DB - 1, --g);
662
662
  }
663
- return m.revert(b);
664
- }, t.prototype.modInverse = function(l) {
665
- var i = l.isEven();
666
- if (this.isEven() && i || l.signum() == 0)
667
- return t.ZERO;
668
- for (var Z = l.clone(), d = this.clone(), b = f(1), m = f(0), s = f(0), c = f(1); Z.signum() != 0; ) {
669
- for (; Z.isEven(); )
670
- Z.rShiftTo(1, Z), i ? ((!b.isEven() || !m.isEven()) && (b.addTo(this, b), m.subTo(l, m)), b.rShiftTo(1, b)) : m.isEven() || m.subTo(l, m), m.rShiftTo(1, m);
671
- for (; d.isEven(); )
672
- d.rShiftTo(1, d), i ? ((!s.isEven() || !c.isEven()) && (s.addTo(this, s), c.subTo(l, c)), s.rShiftTo(1, s)) : c.isEven() || c.subTo(l, c), c.rShiftTo(1, c);
673
- Z.compareTo(d) >= 0 ? (Z.subTo(d, Z), i && b.subTo(s, b), m.subTo(c, m)) : (d.subTo(Z, d), i && s.subTo(b, s), c.subTo(m, c));
663
+ return o.revert(s);
664
+ }, r.prototype.modInverse = function(t) {
665
+ var e = t.isEven();
666
+ if (this.isEven() && e || t.signum() == 0)
667
+ return r.ZERO;
668
+ for (var i = t.clone(), n = this.clone(), s = V(1), o = V(0), h = V(0), a = V(1); i.signum() != 0; ) {
669
+ for (; i.isEven(); )
670
+ i.rShiftTo(1, i), e ? ((!s.isEven() || !o.isEven()) && (s.addTo(this, s), o.subTo(t, o)), s.rShiftTo(1, s)) : o.isEven() || o.subTo(t, o), o.rShiftTo(1, o);
671
+ for (; n.isEven(); )
672
+ n.rShiftTo(1, n), e ? ((!h.isEven() || !a.isEven()) && (h.addTo(this, h), a.subTo(t, a)), h.rShiftTo(1, h)) : a.isEven() || a.subTo(t, a), a.rShiftTo(1, a);
673
+ i.compareTo(n) >= 0 ? (i.subTo(n, i), e && s.subTo(h, s), o.subTo(a, o)) : (n.subTo(i, n), e && h.subTo(s, h), a.subTo(o, a));
674
674
  }
675
- if (d.compareTo(t.ONE) != 0)
676
- return t.ZERO;
677
- if (c.compareTo(l) >= 0)
678
- return c.subtract(l);
679
- if (c.signum() < 0)
680
- c.addTo(l, c);
675
+ if (n.compareTo(r.ONE) != 0)
676
+ return r.ZERO;
677
+ if (a.compareTo(t) >= 0)
678
+ return a.subtract(t);
679
+ if (a.signum() < 0)
680
+ a.addTo(t, a);
681
681
  else
682
- return c;
683
- return c.signum() < 0 ? c.add(l) : c;
684
- }, t.prototype.pow = function(l) {
685
- return this.exp(l, new El());
686
- }, t.prototype.gcd = function(l) {
687
- var i = this.s < 0 ? this.negate() : this.clone(), Z = l.s < 0 ? l.negate() : l.clone();
688
- if (i.compareTo(Z) < 0) {
689
- var d = i;
690
- i = Z, Z = d;
682
+ return a;
683
+ return a.signum() < 0 ? a.add(t) : a;
684
+ }, r.prototype.pow = function(t) {
685
+ return this.exp(t, new zt());
686
+ }, r.prototype.gcd = function(t) {
687
+ var e = this.s < 0 ? this.negate() : this.clone(), i = t.s < 0 ? t.negate() : t.clone();
688
+ if (e.compareTo(i) < 0) {
689
+ var n = e;
690
+ e = i, i = n;
691
691
  }
692
- var b = i.getLowestSetBit(), m = Z.getLowestSetBit();
693
- if (m < 0)
694
- return i;
695
- for (b < m && (m = b), m > 0 && (i.rShiftTo(m, i), Z.rShiftTo(m, Z)); i.signum() > 0; )
696
- (b = i.getLowestSetBit()) > 0 && i.rShiftTo(b, i), (b = Z.getLowestSetBit()) > 0 && Z.rShiftTo(b, Z), i.compareTo(Z) >= 0 ? (i.subTo(Z, i), i.rShiftTo(1, i)) : (Z.subTo(i, Z), Z.rShiftTo(1, Z));
697
- return m > 0 && Z.lShiftTo(m, Z), Z;
698
- }, t.prototype.isProbablePrime = function(l) {
699
- var i, Z = this.abs();
700
- if (Z.t == 1 && Z[0] <= S[S.length - 1]) {
701
- for (i = 0; i < S.length; ++i)
702
- if (Z[0] == S[i])
692
+ var s = e.getLowestSetBit(), o = i.getLowestSetBit();
693
+ if (o < 0)
694
+ return e;
695
+ for (s < o && (o = s), o > 0 && (e.rShiftTo(o, e), i.rShiftTo(o, i)); e.signum() > 0; )
696
+ (s = e.getLowestSetBit()) > 0 && e.rShiftTo(s, e), (s = i.getLowestSetBit()) > 0 && i.rShiftTo(s, i), e.compareTo(i) >= 0 ? (e.subTo(i, e), e.rShiftTo(1, e)) : (i.subTo(e, i), i.rShiftTo(1, i));
697
+ return o > 0 && i.lShiftTo(o, i), i;
698
+ }, r.prototype.isProbablePrime = function(t) {
699
+ var e, i = this.abs();
700
+ if (i.t == 1 && i[0] <= E[E.length - 1]) {
701
+ for (e = 0; e < E.length; ++e)
702
+ if (i[0] == E[e])
703
703
  return !0;
704
704
  return !1;
705
705
  }
706
- if (Z.isEven())
706
+ if (i.isEven())
707
707
  return !1;
708
- for (i = 1; i < S.length; ) {
709
- for (var d = S[i], b = i + 1; b < S.length && d < Dl; )
710
- d *= S[b++];
711
- for (d = Z.modInt(d); i < b; )
712
- if (d % S[i++] == 0)
708
+ for (e = 1; e < E.length; ) {
709
+ for (var n = E[e], s = e + 1; s < E.length && n < Jt; )
710
+ n *= E[s++];
711
+ for (n = i.modInt(n); e < s; )
712
+ if (n % E[e++] == 0)
713
713
  return !1;
714
714
  }
715
- return Z.millerRabin(l);
716
- }, t.prototype.copyTo = function(l) {
717
- for (var i = this.t - 1; i >= 0; --i)
718
- l[i] = this[i];
719
- l.t = this.t, l.s = this.s;
720
- }, t.prototype.fromInt = function(l) {
721
- this.t = 1, this.s = l < 0 ? -1 : 0, l > 0 ? this[0] = l : l < -1 ? this[0] = l + this.DV : this.t = 0;
722
- }, t.prototype.fromString = function(l, i) {
723
- var Z;
724
- if (i == 16)
725
- Z = 4;
726
- else if (i == 8)
727
- Z = 3;
728
- else if (i == 256)
729
- Z = 8;
730
- else if (i == 2)
731
- Z = 1;
732
- else if (i == 32)
733
- Z = 5;
734
- else if (i == 4)
735
- Z = 2;
715
+ return i.millerRabin(t);
716
+ }, r.prototype.copyTo = function(t) {
717
+ for (var e = this.t - 1; e >= 0; --e)
718
+ t[e] = this[e];
719
+ t.t = this.t, t.s = this.s;
720
+ }, r.prototype.fromInt = function(t) {
721
+ this.t = 1, this.s = t < 0 ? -1 : 0, t > 0 ? this[0] = t : t < -1 ? this[0] = t + this.DV : this.t = 0;
722
+ }, r.prototype.fromString = function(t, e) {
723
+ var i;
724
+ if (e == 16)
725
+ i = 4;
726
+ else if (e == 8)
727
+ i = 3;
728
+ else if (e == 256)
729
+ i = 8;
730
+ else if (e == 2)
731
+ i = 1;
732
+ else if (e == 32)
733
+ i = 5;
734
+ else if (e == 4)
735
+ i = 2;
736
736
  else {
737
- this.fromRadix(l, i);
737
+ this.fromRadix(t, e);
738
738
  return;
739
739
  }
740
740
  this.t = 0, this.s = 0;
741
- for (var d = l.length, b = !1, m = 0; --d >= 0; ) {
742
- var s = Z == 8 ? +l[d] & 255 : Yl(l, d);
743
- if (s < 0) {
744
- l.charAt(d) == "-" && (b = !0);
741
+ for (var n = t.length, s = !1, o = 0; --n >= 0; ) {
742
+ var h = i == 8 ? +t[n] & 255 : Tt(t, n);
743
+ if (h < 0) {
744
+ t.charAt(n) == "-" && (s = !0);
745
745
  continue;
746
746
  }
747
- b = !1, m == 0 ? this[this.t++] = s : m + Z > this.DB ? (this[this.t - 1] |= (s & (1 << this.DB - m) - 1) << m, this[this.t++] = s >> this.DB - m) : this[this.t - 1] |= s << m, m += Z, m >= this.DB && (m -= this.DB);
747
+ s = !1, o == 0 ? this[this.t++] = h : o + i > this.DB ? (this[this.t - 1] |= (h & (1 << this.DB - o) - 1) << o, this[this.t++] = h >> this.DB - o) : this[this.t - 1] |= h << o, o += i, o >= this.DB && (o -= this.DB);
748
748
  }
749
- Z == 8 && (+l[0] & 128) != 0 && (this.s = -1, m > 0 && (this[this.t - 1] |= (1 << this.DB - m) - 1 << m)), this.clamp(), b && t.ZERO.subTo(this, this);
750
- }, t.prototype.clamp = function() {
751
- for (var l = this.s & this.DM; this.t > 0 && this[this.t - 1] == l; )
749
+ i == 8 && (+t[0] & 128) != 0 && (this.s = -1, o > 0 && (this[this.t - 1] |= (1 << this.DB - o) - 1 << o)), this.clamp(), s && r.ZERO.subTo(this, this);
750
+ }, r.prototype.clamp = function() {
751
+ for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t; )
752
752
  --this.t;
753
- }, t.prototype.dlShiftTo = function(l, i) {
754
- var Z;
755
- for (Z = this.t - 1; Z >= 0; --Z)
756
- i[Z + l] = this[Z];
757
- for (Z = l - 1; Z >= 0; --Z)
758
- i[Z] = 0;
759
- i.t = this.t + l, i.s = this.s;
760
- }, t.prototype.drShiftTo = function(l, i) {
761
- for (var Z = l; Z < this.t; ++Z)
762
- i[Z - l] = this[Z];
763
- i.t = Math.max(this.t - l, 0), i.s = this.s;
764
- }, t.prototype.lShiftTo = function(l, i) {
765
- for (var Z = l % this.DB, d = this.DB - Z, b = (1 << d) - 1, m = Math.floor(l / this.DB), s = this.s << Z & this.DM, c = this.t - 1; c >= 0; --c)
766
- i[c + m + 1] = this[c] >> d | s, s = (this[c] & b) << Z;
767
- for (var c = m - 1; c >= 0; --c)
768
- i[c] = 0;
769
- i[m] = s, i.t = this.t + m + 1, i.s = this.s, i.clamp();
770
- }, t.prototype.rShiftTo = function(l, i) {
771
- i.s = this.s;
772
- var Z = Math.floor(l / this.DB);
773
- if (Z >= this.t) {
774
- i.t = 0;
753
+ }, r.prototype.dlShiftTo = function(t, e) {
754
+ var i;
755
+ for (i = this.t - 1; i >= 0; --i)
756
+ e[i + t] = this[i];
757
+ for (i = t - 1; i >= 0; --i)
758
+ e[i] = 0;
759
+ e.t = this.t + t, e.s = this.s;
760
+ }, r.prototype.drShiftTo = function(t, e) {
761
+ for (var i = t; i < this.t; ++i)
762
+ e[i - t] = this[i];
763
+ e.t = Math.max(this.t - t, 0), e.s = this.s;
764
+ }, r.prototype.lShiftTo = function(t, e) {
765
+ for (var i = t % this.DB, n = this.DB - i, s = (1 << n) - 1, o = Math.floor(t / this.DB), h = this.s << i & this.DM, a = this.t - 1; a >= 0; --a)
766
+ e[a + o + 1] = this[a] >> n | h, h = (this[a] & s) << i;
767
+ for (var a = o - 1; a >= 0; --a)
768
+ e[a] = 0;
769
+ e[o] = h, e.t = this.t + o + 1, e.s = this.s, e.clamp();
770
+ }, r.prototype.rShiftTo = function(t, e) {
771
+ e.s = this.s;
772
+ var i = Math.floor(t / this.DB);
773
+ if (i >= this.t) {
774
+ e.t = 0;
775
775
  return;
776
776
  }
777
- var d = l % this.DB, b = this.DB - d, m = (1 << d) - 1;
778
- i[0] = this[Z] >> d;
779
- for (var s = Z + 1; s < this.t; ++s)
780
- i[s - Z - 1] |= (this[s] & m) << b, i[s - Z] = this[s] >> d;
781
- d > 0 && (i[this.t - Z - 1] |= (this.s & m) << b), i.t = this.t - Z, i.clamp();
782
- }, t.prototype.subTo = function(l, i) {
783
- for (var Z = 0, d = 0, b = Math.min(l.t, this.t); Z < b; )
784
- d += this[Z] - l[Z], i[Z++] = d & this.DM, d >>= this.DB;
785
- if (l.t < this.t) {
786
- for (d -= l.s; Z < this.t; )
787
- d += this[Z], i[Z++] = d & this.DM, d >>= this.DB;
788
- d += this.s;
777
+ var n = t % this.DB, s = this.DB - n, o = (1 << n) - 1;
778
+ e[0] = this[i] >> n;
779
+ for (var h = i + 1; h < this.t; ++h)
780
+ e[h - i - 1] |= (this[h] & o) << s, e[h - i] = this[h] >> n;
781
+ n > 0 && (e[this.t - i - 1] |= (this.s & o) << s), e.t = this.t - i, e.clamp();
782
+ }, r.prototype.subTo = function(t, e) {
783
+ for (var i = 0, n = 0, s = Math.min(t.t, this.t); i < s; )
784
+ n += this[i] - t[i], e[i++] = n & this.DM, n >>= this.DB;
785
+ if (t.t < this.t) {
786
+ for (n -= t.s; i < this.t; )
787
+ n += this[i], e[i++] = n & this.DM, n >>= this.DB;
788
+ n += this.s;
789
789
  } else {
790
- for (d += this.s; Z < l.t; )
791
- d -= l[Z], i[Z++] = d & this.DM, d >>= this.DB;
792
- d -= l.s;
790
+ for (n += this.s; i < t.t; )
791
+ n -= t[i], e[i++] = n & this.DM, n >>= this.DB;
792
+ n -= t.s;
793
793
  }
794
- i.s = d < 0 ? -1 : 0, d < -1 ? i[Z++] = this.DV + d : d > 0 && (i[Z++] = d), i.t = Z, i.clamp();
795
- }, t.prototype.multiplyTo = function(l, i) {
796
- var Z = this.abs(), d = l.abs(), b = Z.t;
797
- for (i.t = b + d.t; --b >= 0; )
798
- i[b] = 0;
799
- for (b = 0; b < d.t; ++b)
800
- i[b + Z.t] = Z.am(0, d[b], i, b, 0, Z.t);
801
- i.s = 0, i.clamp(), this.s != l.s && t.ZERO.subTo(i, i);
802
- }, t.prototype.squareTo = function(l) {
803
- for (var i = this.abs(), Z = l.t = 2 * i.t; --Z >= 0; )
804
- l[Z] = 0;
805
- for (Z = 0; Z < i.t - 1; ++Z) {
806
- var d = i.am(Z, i[Z], l, 2 * Z, 0, 1);
807
- (l[Z + i.t] += i.am(Z + 1, 2 * i[Z], l, 2 * Z + 1, d, i.t - Z - 1)) >= i.DV && (l[Z + i.t] -= i.DV, l[Z + i.t + 1] = 1);
794
+ e.s = n < 0 ? -1 : 0, n < -1 ? e[i++] = this.DV + n : n > 0 && (e[i++] = n), e.t = i, e.clamp();
795
+ }, r.prototype.multiplyTo = function(t, e) {
796
+ var i = this.abs(), n = t.abs(), s = i.t;
797
+ for (e.t = s + n.t; --s >= 0; )
798
+ e[s] = 0;
799
+ for (s = 0; s < n.t; ++s)
800
+ e[s + i.t] = i.am(0, n[s], e, s, 0, i.t);
801
+ e.s = 0, e.clamp(), this.s != t.s && r.ZERO.subTo(e, e);
802
+ }, r.prototype.squareTo = function(t) {
803
+ for (var e = this.abs(), i = t.t = 2 * e.t; --i >= 0; )
804
+ t[i] = 0;
805
+ for (i = 0; i < e.t - 1; ++i) {
806
+ var n = e.am(i, e[i], t, 2 * i, 0, 1);
807
+ (t[i + e.t] += e.am(i + 1, 2 * e[i], t, 2 * i + 1, n, e.t - i - 1)) >= e.DV && (t[i + e.t] -= e.DV, t[i + e.t + 1] = 1);
808
808
  }
809
- l.t > 0 && (l[l.t - 1] += i.am(Z, i[Z], l, 2 * Z, 0, 1)), l.s = 0, l.clamp();
810
- }, t.prototype.divRemTo = function(l, i, Z) {
811
- var d = l.abs();
812
- if (!(d.t <= 0)) {
813
- var b = this.abs();
814
- if (b.t < d.t) {
815
- i?.fromInt(0), Z != null && this.copyTo(Z);
809
+ t.t > 0 && (t[t.t - 1] += e.am(i, e[i], t, 2 * i, 0, 1)), t.s = 0, t.clamp();
810
+ }, r.prototype.divRemTo = function(t, e, i) {
811
+ var n = t.abs();
812
+ if (!(n.t <= 0)) {
813
+ var s = this.abs();
814
+ if (s.t < n.t) {
815
+ e?.fromInt(0), i != null && this.copyTo(i);
816
816
  return;
817
817
  }
818
- Z == null && (Z = a());
819
- var m = a(), s = this.s, c = l.s, e = this.DB - A(d[d.t - 1]);
820
- e > 0 ? (d.lShiftTo(e, m), b.lShiftTo(e, Z)) : (d.copyTo(m), b.copyTo(Z));
821
- var h = m.t, n = m[h - 1];
822
- if (n != 0) {
823
- var W = n * (1 << this.F1) + (h > 1 ? m[h - 2] >> this.F2 : 0), X = this.FV / W, p = (1 << this.F1) / W, G = 1 << this.F2, R = Z.t, F = R - h, N = i ?? a();
824
- for (m.dlShiftTo(F, N), Z.compareTo(N) >= 0 && (Z[Z.t++] = 1, Z.subTo(N, Z)), t.ONE.dlShiftTo(h, N), N.subTo(m, m); m.t < h; )
825
- m[m.t++] = 0;
826
- for (; --F >= 0; ) {
827
- var k = Z[--R] == n ? this.DM : Math.floor(Z[R] * X + (Z[R - 1] + G) * p);
828
- if ((Z[R] += m.am(0, k, Z, F, 0, h)) < k)
829
- for (m.dlShiftTo(F, N), Z.subTo(N, Z); Z[R] < --k; )
830
- Z.subTo(N, Z);
818
+ i == null && (i = v());
819
+ var o = v(), h = this.s, a = t.s, f = this.DB - Z(n[n.t - 1]);
820
+ f > 0 ? (n.lShiftTo(f, o), s.lShiftTo(f, i)) : (n.copyTo(o), s.copyTo(i));
821
+ var l = o.t, c = o[l - 1];
822
+ if (c != 0) {
823
+ var g = c * (1 << this.F1) + (l > 1 ? o[l - 2] >> this.F2 : 0), p = this.FV / g, m = (1 << this.F1) / g, S = 1 << this.F2, D = i.t, _ = D - l, B = e ?? v();
824
+ for (o.dlShiftTo(_, B), i.compareTo(B) >= 0 && (i[i.t++] = 1, i.subTo(B, i)), r.ONE.dlShiftTo(l, B), B.subTo(o, o); o.t < l; )
825
+ o[o.t++] = 0;
826
+ for (; --_ >= 0; ) {
827
+ var q = i[--D] == c ? this.DM : Math.floor(i[D] * p + (i[D - 1] + S) * m);
828
+ if ((i[D] += o.am(0, q, i, _, 0, l)) < q)
829
+ for (o.dlShiftTo(_, B), i.subTo(B, i); i[D] < --q; )
830
+ i.subTo(B, i);
831
831
  }
832
- i != null && (Z.drShiftTo(h, i), s != c && t.ZERO.subTo(i, i)), Z.t = h, Z.clamp(), e > 0 && Z.rShiftTo(e, Z), s < 0 && t.ZERO.subTo(Z, Z);
832
+ e != null && (i.drShiftTo(l, e), h != a && r.ZERO.subTo(e, e)), i.t = l, i.clamp(), f > 0 && i.rShiftTo(f, i), h < 0 && r.ZERO.subTo(i, i);
833
833
  }
834
834
  }
835
- }, t.prototype.invDigit = function() {
835
+ }, r.prototype.invDigit = function() {
836
836
  if (this.t < 1)
837
837
  return 0;
838
- var l = this[0];
839
- if ((l & 1) == 0)
838
+ var t = this[0];
839
+ if ((t & 1) == 0)
840
840
  return 0;
841
- var i = l & 3;
842
- return i = i * (2 - (l & 15) * i) & 15, i = i * (2 - (l & 255) * i) & 255, i = i * (2 - ((l & 65535) * i & 65535)) & 65535, i = i * (2 - l * i % this.DV) % this.DV, i > 0 ? this.DV - i : -i;
843
- }, t.prototype.isEven = function() {
841
+ var e = t & 3;
842
+ return e = e * (2 - (t & 15) * e) & 15, e = e * (2 - (t & 255) * e) & 255, e = e * (2 - ((t & 65535) * e & 65535)) & 65535, e = e * (2 - t * e % this.DV) % this.DV, e > 0 ? this.DV - e : -e;
843
+ }, r.prototype.isEven = function() {
844
844
  return (this.t > 0 ? this[0] & 1 : this.s) == 0;
845
- }, t.prototype.exp = function(l, i) {
846
- if (l > 4294967295 || l < 1)
847
- return t.ONE;
848
- var Z = a(), d = a(), b = i.convert(this), m = A(l) - 1;
849
- for (b.copyTo(Z); --m >= 0; )
850
- if (i.sqrTo(Z, d), (l & 1 << m) > 0)
851
- i.mulTo(d, b, Z);
845
+ }, r.prototype.exp = function(t, e) {
846
+ if (t > 4294967295 || t < 1)
847
+ return r.ONE;
848
+ var i = v(), n = v(), s = e.convert(this), o = Z(t) - 1;
849
+ for (s.copyTo(i); --o >= 0; )
850
+ if (e.sqrTo(i, n), (t & 1 << o) > 0)
851
+ e.mulTo(n, s, i);
852
852
  else {
853
- var s = Z;
854
- Z = d, d = s;
853
+ var h = i;
854
+ i = n, n = h;
855
855
  }
856
- return i.revert(Z);
857
- }, t.prototype.chunkSize = function(l) {
858
- return Math.floor(Math.LN2 * this.DB / Math.log(l));
859
- }, t.prototype.toRadix = function(l) {
860
- if (l == null && (l = 10), this.signum() == 0 || l < 2 || l > 36)
856
+ return e.revert(i);
857
+ }, r.prototype.chunkSize = function(t) {
858
+ return Math.floor(Math.LN2 * this.DB / Math.log(t));
859
+ }, r.prototype.toRadix = function(t) {
860
+ if (t == null && (t = 10), this.signum() == 0 || t < 2 || t > 36)
861
861
  return "0";
862
- var i = this.chunkSize(l), Z = Math.pow(l, i), d = f(Z), b = a(), m = a(), s = "";
863
- for (this.divRemTo(d, b, m); b.signum() > 0; )
864
- s = (Z + m.intValue()).toString(l).substring(1) + s, b.divRemTo(d, b, m);
865
- return m.intValue().toString(l) + s;
866
- }, t.prototype.fromRadix = function(l, i) {
867
- this.fromInt(0), i == null && (i = 10);
868
- for (var Z = this.chunkSize(i), d = Math.pow(i, Z), b = !1, m = 0, s = 0, c = 0; c < l.length; ++c) {
869
- var e = Yl(l, c);
870
- if (e < 0) {
871
- l.charAt(c) == "-" && this.signum() == 0 && (b = !0);
862
+ var e = this.chunkSize(t), i = Math.pow(t, e), n = V(i), s = v(), o = v(), h = "";
863
+ for (this.divRemTo(n, s, o); s.signum() > 0; )
864
+ h = (i + o.intValue()).toString(t).substring(1) + h, s.divRemTo(n, s, o);
865
+ return o.intValue().toString(t) + h;
866
+ }, r.prototype.fromRadix = function(t, e) {
867
+ this.fromInt(0), e == null && (e = 10);
868
+ for (var i = this.chunkSize(e), n = Math.pow(e, i), s = !1, o = 0, h = 0, a = 0; a < t.length; ++a) {
869
+ var f = Tt(t, a);
870
+ if (f < 0) {
871
+ t.charAt(a) == "-" && this.signum() == 0 && (s = !0);
872
872
  continue;
873
873
  }
874
- s = i * s + e, ++m >= Z && (this.dMultiply(d), this.dAddOffset(s, 0), m = 0, s = 0);
874
+ h = e * h + f, ++o >= i && (this.dMultiply(n), this.dAddOffset(h, 0), o = 0, h = 0);
875
875
  }
876
- m > 0 && (this.dMultiply(Math.pow(i, m)), this.dAddOffset(s, 0)), b && t.ZERO.subTo(this, this);
877
- }, t.prototype.fromNumber = function(l, i, Z) {
878
- if (typeof i == "number")
879
- if (l < 2)
876
+ o > 0 && (this.dMultiply(Math.pow(e, o)), this.dAddOffset(h, 0)), s && r.ZERO.subTo(this, this);
877
+ }, r.prototype.fromNumber = function(t, e, i) {
878
+ if (typeof e == "number")
879
+ if (t < 2)
880
880
  this.fromInt(1);
881
881
  else
882
- for (this.fromNumber(l, Z), this.testBit(l - 1) || this.bitwiseTo(t.ONE.shiftLeft(l - 1), O, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(i); )
883
- this.dAddOffset(2, 0), this.bitLength() > l && this.subTo(t.ONE.shiftLeft(l - 1), this);
882
+ for (this.fromNumber(t, i), this.testBit(t - 1) || this.bitwiseTo(r.ONE.shiftLeft(t - 1), G, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(e); )
883
+ this.dAddOffset(2, 0), this.bitLength() > t && this.subTo(r.ONE.shiftLeft(t - 1), this);
884
884
  else {
885
- var d = [], b = l & 7;
886
- d.length = (l >> 3) + 1, i.nextBytes(d), b > 0 ? d[0] &= (1 << b) - 1 : d[0] = 0, this.fromString(d, 256);
885
+ var n = [], s = t & 7;
886
+ n.length = (t >> 3) + 1, e.nextBytes(n), s > 0 ? n[0] &= (1 << s) - 1 : n[0] = 0, this.fromString(n, 256);
887
887
  }
888
- }, t.prototype.bitwiseTo = function(l, i, Z) {
889
- var d, b, m = Math.min(l.t, this.t);
890
- for (d = 0; d < m; ++d)
891
- Z[d] = i(this[d], l[d]);
892
- if (l.t < this.t) {
893
- for (b = l.s & this.DM, d = m; d < this.t; ++d)
894
- Z[d] = i(this[d], b);
895
- Z.t = this.t;
888
+ }, r.prototype.bitwiseTo = function(t, e, i) {
889
+ var n, s, o = Math.min(t.t, this.t);
890
+ for (n = 0; n < o; ++n)
891
+ i[n] = e(this[n], t[n]);
892
+ if (t.t < this.t) {
893
+ for (s = t.s & this.DM, n = o; n < this.t; ++n)
894
+ i[n] = e(this[n], s);
895
+ i.t = this.t;
896
896
  } else {
897
- for (b = this.s & this.DM, d = m; d < l.t; ++d)
898
- Z[d] = i(b, l[d]);
899
- Z.t = l.t;
897
+ for (s = this.s & this.DM, n = o; n < t.t; ++n)
898
+ i[n] = e(s, t[n]);
899
+ i.t = t.t;
900
900
  }
901
- Z.s = i(this.s, l.s), Z.clamp();
902
- }, t.prototype.changeBit = function(l, i) {
903
- var Z = t.ONE.shiftLeft(l);
904
- return this.bitwiseTo(Z, i, Z), Z;
905
- }, t.prototype.addTo = function(l, i) {
906
- for (var Z = 0, d = 0, b = Math.min(l.t, this.t); Z < b; )
907
- d += this[Z] + l[Z], i[Z++] = d & this.DM, d >>= this.DB;
908
- if (l.t < this.t) {
909
- for (d += l.s; Z < this.t; )
910
- d += this[Z], i[Z++] = d & this.DM, d >>= this.DB;
911
- d += this.s;
901
+ i.s = e(this.s, t.s), i.clamp();
902
+ }, r.prototype.changeBit = function(t, e) {
903
+ var i = r.ONE.shiftLeft(t);
904
+ return this.bitwiseTo(i, e, i), i;
905
+ }, r.prototype.addTo = function(t, e) {
906
+ for (var i = 0, n = 0, s = Math.min(t.t, this.t); i < s; )
907
+ n += this[i] + t[i], e[i++] = n & this.DM, n >>= this.DB;
908
+ if (t.t < this.t) {
909
+ for (n += t.s; i < this.t; )
910
+ n += this[i], e[i++] = n & this.DM, n >>= this.DB;
911
+ n += this.s;
912
912
  } else {
913
- for (d += this.s; Z < l.t; )
914
- d += l[Z], i[Z++] = d & this.DM, d >>= this.DB;
915
- d += l.s;
913
+ for (n += this.s; i < t.t; )
914
+ n += t[i], e[i++] = n & this.DM, n >>= this.DB;
915
+ n += t.s;
916
916
  }
917
- i.s = d < 0 ? -1 : 0, d > 0 ? i[Z++] = d : d < -1 && (i[Z++] = this.DV + d), i.t = Z, i.clamp();
918
- }, t.prototype.dMultiply = function(l) {
919
- this[this.t] = this.am(0, l - 1, this, 0, 0, this.t), ++this.t, this.clamp();
920
- }, t.prototype.dAddOffset = function(l, i) {
921
- if (l != 0) {
922
- for (; this.t <= i; )
917
+ e.s = n < 0 ? -1 : 0, n > 0 ? e[i++] = n : n < -1 && (e[i++] = this.DV + n), e.t = i, e.clamp();
918
+ }, r.prototype.dMultiply = function(t) {
919
+ this[this.t] = this.am(0, t - 1, this, 0, 0, this.t), ++this.t, this.clamp();
920
+ }, r.prototype.dAddOffset = function(t, e) {
921
+ if (t != 0) {
922
+ for (; this.t <= e; )
923
923
  this[this.t++] = 0;
924
- for (this[i] += l; this[i] >= this.DV; )
925
- this[i] -= this.DV, ++i >= this.t && (this[this.t++] = 0), ++this[i];
924
+ for (this[e] += t; this[e] >= this.DV; )
925
+ this[e] -= this.DV, ++e >= this.t && (this[this.t++] = 0), ++this[e];
926
926
  }
927
- }, t.prototype.multiplyLowerTo = function(l, i, Z) {
928
- var d = Math.min(this.t + l.t, i);
929
- for (Z.s = 0, Z.t = d; d > 0; )
930
- Z[--d] = 0;
931
- for (var b = Z.t - this.t; d < b; ++d)
932
- Z[d + this.t] = this.am(0, l[d], Z, d, 0, this.t);
933
- for (var b = Math.min(l.t, i); d < b; ++d)
934
- this.am(0, l[d], Z, d, 0, i - d);
935
- Z.clamp();
936
- }, t.prototype.multiplyUpperTo = function(l, i, Z) {
937
- --i;
938
- var d = Z.t = this.t + l.t - i;
939
- for (Z.s = 0; --d >= 0; )
940
- Z[d] = 0;
941
- for (d = Math.max(i - this.t, 0); d < l.t; ++d)
942
- Z[this.t + d - i] = this.am(i - d, l[d], Z, 0, 0, this.t + d - i);
943
- Z.clamp(), Z.drShiftTo(1, Z);
944
- }, t.prototype.modInt = function(l) {
945
- if (l <= 0)
927
+ }, r.prototype.multiplyLowerTo = function(t, e, i) {
928
+ var n = Math.min(this.t + t.t, e);
929
+ for (i.s = 0, i.t = n; n > 0; )
930
+ i[--n] = 0;
931
+ for (var s = i.t - this.t; n < s; ++n)
932
+ i[n + this.t] = this.am(0, t[n], i, n, 0, this.t);
933
+ for (var s = Math.min(t.t, e); n < s; ++n)
934
+ this.am(0, t[n], i, n, 0, e - n);
935
+ i.clamp();
936
+ }, r.prototype.multiplyUpperTo = function(t, e, i) {
937
+ --e;
938
+ var n = i.t = this.t + t.t - e;
939
+ for (i.s = 0; --n >= 0; )
940
+ i[n] = 0;
941
+ for (n = Math.max(e - this.t, 0); n < t.t; ++n)
942
+ i[this.t + n - e] = this.am(e - n, t[n], i, 0, 0, this.t + n - e);
943
+ i.clamp(), i.drShiftTo(1, i);
944
+ }, r.prototype.modInt = function(t) {
945
+ if (t <= 0)
946
946
  return 0;
947
- var i = this.DV % l, Z = this.s < 0 ? l - 1 : 0;
947
+ var e = this.DV % t, i = this.s < 0 ? t - 1 : 0;
948
948
  if (this.t > 0)
949
- if (i == 0)
950
- Z = this[0] % l;
949
+ if (e == 0)
950
+ i = this[0] % t;
951
951
  else
952
- for (var d = this.t - 1; d >= 0; --d)
953
- Z = (i * Z + this[d]) % l;
954
- return Z;
955
- }, t.prototype.millerRabin = function(l) {
956
- var i = this.subtract(t.ONE), Z = i.getLowestSetBit();
957
- if (Z <= 0)
952
+ for (var n = this.t - 1; n >= 0; --n)
953
+ i = (e * i + this[n]) % t;
954
+ return i;
955
+ }, r.prototype.millerRabin = function(t) {
956
+ var e = this.subtract(r.ONE), i = e.getLowestSetBit();
957
+ if (i <= 0)
958
958
  return !1;
959
- var d = i.shiftRight(Z);
960
- l = l + 1 >> 1, l > S.length && (l = S.length);
961
- for (var b = a(), m = 0; m < l; ++m) {
962
- b.fromInt(S[Math.floor(Math.random() * S.length)]);
963
- var s = b.modPow(d, this);
964
- if (s.compareTo(t.ONE) != 0 && s.compareTo(i) != 0) {
965
- for (var c = 1; c++ < Z && s.compareTo(i) != 0; )
966
- if (s = s.modPowInt(2, this), s.compareTo(t.ONE) == 0)
959
+ var n = e.shiftRight(i);
960
+ t = t + 1 >> 1, t > E.length && (t = E.length);
961
+ for (var s = v(), o = 0; o < t; ++o) {
962
+ s.fromInt(E[Math.floor(Math.random() * E.length)]);
963
+ var h = s.modPow(n, this);
964
+ if (h.compareTo(r.ONE) != 0 && h.compareTo(e) != 0) {
965
+ for (var a = 1; a++ < i && h.compareTo(e) != 0; )
966
+ if (h = h.modPowInt(2, this), h.compareTo(r.ONE) == 0)
967
967
  return !1;
968
- if (s.compareTo(i) != 0)
968
+ if (h.compareTo(e) != 0)
969
969
  return !1;
970
970
  }
971
971
  }
972
972
  return !0;
973
- }, t.prototype.square = function() {
974
- var l = a();
975
- return this.squareTo(l), l;
976
- }, t.prototype.gcda = function(l, i) {
977
- var Z = this.s < 0 ? this.negate() : this.clone(), d = l.s < 0 ? l.negate() : l.clone();
978
- if (Z.compareTo(d) < 0) {
979
- var b = Z;
980
- Z = d, d = b;
973
+ }, r.prototype.square = function() {
974
+ var t = v();
975
+ return this.squareTo(t), t;
976
+ }, r.prototype.gcda = function(t, e) {
977
+ var i = this.s < 0 ? this.negate() : this.clone(), n = t.s < 0 ? t.negate() : t.clone();
978
+ if (i.compareTo(n) < 0) {
979
+ var s = i;
980
+ i = n, n = s;
981
981
  }
982
- var m = Z.getLowestSetBit(), s = d.getLowestSetBit();
983
- if (s < 0) {
984
- i(Z);
982
+ var o = i.getLowestSetBit(), h = n.getLowestSetBit();
983
+ if (h < 0) {
984
+ e(i);
985
985
  return;
986
986
  }
987
- m < s && (s = m), s > 0 && (Z.rShiftTo(s, Z), d.rShiftTo(s, d));
988
- var c = function() {
989
- (m = Z.getLowestSetBit()) > 0 && Z.rShiftTo(m, Z), (m = d.getLowestSetBit()) > 0 && d.rShiftTo(m, d), Z.compareTo(d) >= 0 ? (Z.subTo(d, Z), Z.rShiftTo(1, Z)) : (d.subTo(Z, d), d.rShiftTo(1, d)), Z.signum() > 0 ? setTimeout(c, 0) : (s > 0 && d.lShiftTo(s, d), setTimeout(function() {
990
- i(d);
987
+ o < h && (h = o), h > 0 && (i.rShiftTo(h, i), n.rShiftTo(h, n));
988
+ var a = function() {
989
+ (o = i.getLowestSetBit()) > 0 && i.rShiftTo(o, i), (o = n.getLowestSetBit()) > 0 && n.rShiftTo(o, n), i.compareTo(n) >= 0 ? (i.subTo(n, i), i.rShiftTo(1, i)) : (n.subTo(i, n), n.rShiftTo(1, n)), i.signum() > 0 ? setTimeout(a, 0) : (h > 0 && n.lShiftTo(h, n), setTimeout(function() {
990
+ e(n);
991
991
  }, 0));
992
992
  };
993
- setTimeout(c, 10);
994
- }, t.prototype.fromNumberAsync = function(l, i, Z, d) {
995
- if (typeof i == "number")
996
- if (l < 2)
993
+ setTimeout(a, 10);
994
+ }, r.prototype.fromNumberAsync = function(t, e, i, n) {
995
+ if (typeof e == "number")
996
+ if (t < 2)
997
997
  this.fromInt(1);
998
998
  else {
999
- this.fromNumber(l, Z), this.testBit(l - 1) || this.bitwiseTo(t.ONE.shiftLeft(l - 1), O, this), this.isEven() && this.dAddOffset(1, 0);
1000
- var b = this, m = function() {
1001
- b.dAddOffset(2, 0), b.bitLength() > l && b.subTo(t.ONE.shiftLeft(l - 1), b), b.isProbablePrime(i) ? setTimeout(function() {
1002
- d();
1003
- }, 0) : setTimeout(m, 0);
999
+ this.fromNumber(t, i), this.testBit(t - 1) || this.bitwiseTo(r.ONE.shiftLeft(t - 1), G, this), this.isEven() && this.dAddOffset(1, 0);
1000
+ var s = this, o = function() {
1001
+ s.dAddOffset(2, 0), s.bitLength() > t && s.subTo(r.ONE.shiftLeft(t - 1), s), s.isProbablePrime(e) ? setTimeout(function() {
1002
+ n();
1003
+ }, 0) : setTimeout(o, 0);
1004
1004
  };
1005
- setTimeout(m, 0);
1005
+ setTimeout(o, 0);
1006
1006
  }
1007
1007
  else {
1008
- var s = [], c = l & 7;
1009
- s.length = (l >> 3) + 1, i.nextBytes(s), c > 0 ? s[0] &= (1 << c) - 1 : s[0] = 0, this.fromString(s, 256);
1008
+ var h = [], a = t & 7;
1009
+ h.length = (t >> 3) + 1, e.nextBytes(h), a > 0 ? h[0] &= (1 << a) - 1 : h[0] = 0, this.fromString(h, 256);
1010
1010
  }
1011
- }, t;
1011
+ }, r;
1012
1012
  })()
1013
- ), El = (
1013
+ ), zt = (
1014
1014
  /** @class */
1015
1015
  (function() {
1016
- function t() {
1016
+ function r() {
1017
1017
  }
1018
- return t.prototype.convert = function(l) {
1019
- return l;
1020
- }, t.prototype.revert = function(l) {
1021
- return l;
1022
- }, t.prototype.mulTo = function(l, i, Z) {
1023
- l.multiplyTo(i, Z);
1024
- }, t.prototype.sqrTo = function(l, i) {
1025
- l.squareTo(i);
1026
- }, t;
1018
+ return r.prototype.convert = function(t) {
1019
+ return t;
1020
+ }, r.prototype.revert = function(t) {
1021
+ return t;
1022
+ }, r.prototype.mulTo = function(t, e, i) {
1023
+ t.multiplyTo(e, i);
1024
+ }, r.prototype.sqrTo = function(t, e) {
1025
+ t.squareTo(e);
1026
+ }, r;
1027
1027
  })()
1028
- ), pl = (
1028
+ ), mt = (
1029
1029
  /** @class */
1030
1030
  (function() {
1031
- function t(l) {
1032
- this.m = l;
1031
+ function r(t) {
1032
+ this.m = t;
1033
1033
  }
1034
- return t.prototype.convert = function(l) {
1035
- return l.s < 0 || l.compareTo(this.m) >= 0 ? l.mod(this.m) : l;
1036
- }, t.prototype.revert = function(l) {
1037
- return l;
1038
- }, t.prototype.reduce = function(l) {
1039
- l.divRemTo(this.m, null, l);
1040
- }, t.prototype.mulTo = function(l, i, Z) {
1041
- l.multiplyTo(i, Z), this.reduce(Z);
1042
- }, t.prototype.sqrTo = function(l, i) {
1043
- l.squareTo(i), this.reduce(i);
1044
- }, t;
1034
+ return r.prototype.convert = function(t) {
1035
+ return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t;
1036
+ }, r.prototype.revert = function(t) {
1037
+ return t;
1038
+ }, r.prototype.reduce = function(t) {
1039
+ t.divRemTo(this.m, null, t);
1040
+ }, r.prototype.mulTo = function(t, e, i) {
1041
+ t.multiplyTo(e, i), this.reduce(i);
1042
+ }, r.prototype.sqrTo = function(t, e) {
1043
+ t.squareTo(e), this.reduce(e);
1044
+ }, r;
1045
1045
  })()
1046
- ), Gl = (
1046
+ ), St = (
1047
1047
  /** @class */
1048
1048
  (function() {
1049
- function t(l) {
1050
- this.m = l, this.mp = l.invDigit(), this.mpl = this.mp & 32767, this.mph = this.mp >> 15, this.um = (1 << l.DB - 15) - 1, this.mt2 = 2 * l.t;
1049
+ function r(t) {
1050
+ this.m = t, this.mp = t.invDigit(), this.mpl = this.mp & 32767, this.mph = this.mp >> 15, this.um = (1 << t.DB - 15) - 1, this.mt2 = 2 * t.t;
1051
1051
  }
1052
- return t.prototype.convert = function(l) {
1053
- var i = a();
1054
- return l.abs().dlShiftTo(this.m.t, i), i.divRemTo(this.m, null, i), l.s < 0 && i.compareTo(o.ZERO) > 0 && this.m.subTo(i, i), i;
1055
- }, t.prototype.revert = function(l) {
1056
- var i = a();
1057
- return l.copyTo(i), this.reduce(i), i;
1058
- }, t.prototype.reduce = function(l) {
1059
- for (; l.t <= this.mt2; )
1060
- l[l.t++] = 0;
1061
- for (var i = 0; i < this.m.t; ++i) {
1062
- var Z = l[i] & 32767, d = Z * this.mpl + ((Z * this.mph + (l[i] >> 15) * this.mpl & this.um) << 15) & l.DM;
1063
- for (Z = i + this.m.t, l[Z] += this.m.am(0, d, l, i, 0, this.m.t); l[Z] >= l.DV; )
1064
- l[Z] -= l.DV, l[++Z]++;
1052
+ return r.prototype.convert = function(t) {
1053
+ var e = v();
1054
+ return t.abs().dlShiftTo(this.m.t, e), e.divRemTo(this.m, null, e), t.s < 0 && e.compareTo(d.ZERO) > 0 && this.m.subTo(e, e), e;
1055
+ }, r.prototype.revert = function(t) {
1056
+ var e = v();
1057
+ return t.copyTo(e), this.reduce(e), e;
1058
+ }, r.prototype.reduce = function(t) {
1059
+ for (; t.t <= this.mt2; )
1060
+ t[t.t++] = 0;
1061
+ for (var e = 0; e < this.m.t; ++e) {
1062
+ var i = t[e] & 32767, n = i * this.mpl + ((i * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM;
1063
+ for (i = e + this.m.t, t[i] += this.m.am(0, n, t, e, 0, this.m.t); t[i] >= t.DV; )
1064
+ t[i] -= t.DV, t[++i]++;
1065
1065
  }
1066
- l.clamp(), l.drShiftTo(this.m.t, l), l.compareTo(this.m) >= 0 && l.subTo(this.m, l);
1067
- }, t.prototype.mulTo = function(l, i, Z) {
1068
- l.multiplyTo(i, Z), this.reduce(Z);
1069
- }, t.prototype.sqrTo = function(l, i) {
1070
- l.squareTo(i), this.reduce(i);
1071
- }, t;
1066
+ t.clamp(), t.drShiftTo(this.m.t, t), t.compareTo(this.m) >= 0 && t.subTo(this.m, t);
1067
+ }, r.prototype.mulTo = function(t, e, i) {
1068
+ t.multiplyTo(e, i), this.reduce(i);
1069
+ }, r.prototype.sqrTo = function(t, e) {
1070
+ t.squareTo(e), this.reduce(e);
1071
+ }, r;
1072
1072
  })()
1073
- ), Bl = (
1073
+ ), $t = (
1074
1074
  /** @class */
1075
1075
  (function() {
1076
- function t(l) {
1077
- this.m = l, this.r2 = a(), this.q3 = a(), o.ONE.dlShiftTo(2 * l.t, this.r2), this.mu = this.r2.divide(l);
1076
+ function r(t) {
1077
+ this.m = t, this.r2 = v(), this.q3 = v(), d.ONE.dlShiftTo(2 * t.t, this.r2), this.mu = this.r2.divide(t);
1078
1078
  }
1079
- return t.prototype.convert = function(l) {
1080
- if (l.s < 0 || l.t > 2 * this.m.t)
1081
- return l.mod(this.m);
1082
- if (l.compareTo(this.m) < 0)
1083
- return l;
1084
- var i = a();
1085
- return l.copyTo(i), this.reduce(i), i;
1086
- }, t.prototype.revert = function(l) {
1087
- return l;
1088
- }, t.prototype.reduce = function(l) {
1089
- for (l.drShiftTo(this.m.t - 1, this.r2), l.t > this.m.t + 1 && (l.t = this.m.t + 1, l.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); l.compareTo(this.r2) < 0; )
1090
- l.dAddOffset(1, this.m.t + 1);
1091
- for (l.subTo(this.r2, l); l.compareTo(this.m) >= 0; )
1092
- l.subTo(this.m, l);
1093
- }, t.prototype.mulTo = function(l, i, Z) {
1094
- l.multiplyTo(i, Z), this.reduce(Z);
1095
- }, t.prototype.sqrTo = function(l, i) {
1096
- l.squareTo(i), this.reduce(i);
1097
- }, t;
1079
+ return r.prototype.convert = function(t) {
1080
+ if (t.s < 0 || t.t > 2 * this.m.t)
1081
+ return t.mod(this.m);
1082
+ if (t.compareTo(this.m) < 0)
1083
+ return t;
1084
+ var e = v();
1085
+ return t.copyTo(e), this.reduce(e), e;
1086
+ }, r.prototype.revert = function(t) {
1087
+ return t;
1088
+ }, r.prototype.reduce = function(t) {
1089
+ for (t.drShiftTo(this.m.t - 1, this.r2), t.t > this.m.t + 1 && (t.t = this.m.t + 1, t.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); t.compareTo(this.r2) < 0; )
1090
+ t.dAddOffset(1, this.m.t + 1);
1091
+ for (t.subTo(this.r2, t); t.compareTo(this.m) >= 0; )
1092
+ t.subTo(this.m, t);
1093
+ }, r.prototype.mulTo = function(t, e, i) {
1094
+ t.multiplyTo(e, i), this.reduce(i);
1095
+ }, r.prototype.sqrTo = function(t, e) {
1096
+ t.squareTo(e), this.reduce(e);
1097
+ }, r;
1098
1098
  })()
1099
1099
  );
1100
- function a() {
1101
- return new o(null);
1100
+ function v() {
1101
+ return new d(null);
1102
1102
  }
1103
- function y(t, l) {
1104
- return new o(t, l);
1103
+ function b(r, t) {
1104
+ return new d(r, t);
1105
1105
  }
1106
- var yl = typeof navigator < "u";
1107
- yl && Vl && navigator.appName == "Microsoft Internet Explorer" ? (o.prototype.am = function(l, i, Z, d, b, m) {
1108
- for (var s = i & 32767, c = i >> 15; --m >= 0; ) {
1109
- var e = this[l] & 32767, h = this[l++] >> 15, n = c * e + h * s;
1110
- e = s * e + ((n & 32767) << 15) + Z[d] + (b & 1073741823), b = (e >>> 30) + (n >>> 15) + c * h + (b >>> 30), Z[d++] = e & 1073741823;
1106
+ var bt = typeof navigator < "u";
1107
+ bt && yt && navigator.appName == "Microsoft Internet Explorer" ? (d.prototype.am = function(t, e, i, n, s, o) {
1108
+ for (var h = e & 32767, a = e >> 15; --o >= 0; ) {
1109
+ var f = this[t] & 32767, l = this[t++] >> 15, c = a * f + l * h;
1110
+ f = h * f + ((c & 32767) << 15) + i[n] + (s & 1073741823), s = (f >>> 30) + (c >>> 15) + a * l + (s >>> 30), i[n++] = f & 1073741823;
1111
1111
  }
1112
- return b;
1113
- }, I = 30) : yl && Vl && navigator.appName != "Netscape" ? (o.prototype.am = function(l, i, Z, d, b, m) {
1114
- for (; --m >= 0; ) {
1115
- var s = i * this[l++] + Z[d] + b;
1116
- b = Math.floor(s / 67108864), Z[d++] = s & 67108863;
1112
+ return s;
1113
+ }, O = 30) : bt && yt && navigator.appName != "Netscape" ? (d.prototype.am = function(t, e, i, n, s, o) {
1114
+ for (; --o >= 0; ) {
1115
+ var h = e * this[t++] + i[n] + s;
1116
+ s = Math.floor(h / 67108864), i[n++] = h & 67108863;
1117
1117
  }
1118
- return b;
1119
- }, I = 26) : (o.prototype.am = function(l, i, Z, d, b, m) {
1120
- for (var s = i & 16383, c = i >> 14; --m >= 0; ) {
1121
- var e = this[l] & 16383, h = this[l++] >> 14, n = c * e + h * s;
1122
- e = s * e + ((n & 16383) << 14) + Z[d] + b, b = (e >> 28) + (n >> 14) + c * h, Z[d++] = e & 268435455;
1118
+ return s;
1119
+ }, O = 26) : (d.prototype.am = function(t, e, i, n, s, o) {
1120
+ for (var h = e & 16383, a = e >> 14; --o >= 0; ) {
1121
+ var f = this[t] & 16383, l = this[t++] >> 14, c = a * f + l * h;
1122
+ f = h * f + ((c & 16383) << 14) + i[n] + s, s = (f >> 28) + (c >> 14) + a * l, i[n++] = f & 268435455;
1123
1123
  }
1124
- return b;
1125
- }, I = 28);
1126
- o.prototype.DB = I;
1127
- o.prototype.DM = (1 << I) - 1;
1128
- o.prototype.DV = 1 << I;
1129
- var hl = 52;
1130
- o.prototype.FV = Math.pow(2, hl);
1131
- o.prototype.F1 = hl - I;
1132
- o.prototype.F2 = 2 * I - hl;
1133
- var tl = [], j, x;
1134
- j = 48;
1124
+ return s;
1125
+ }, O = 28);
1126
+ d.prototype.DB = O;
1127
+ d.prototype.DM = (1 << O) - 1;
1128
+ d.prototype.DV = 1 << O;
1129
+ var lt = 52;
1130
+ d.prototype.FV = Math.pow(2, lt);
1131
+ d.prototype.F1 = lt - O;
1132
+ d.prototype.F2 = 2 * O - lt;
1133
+ var rt = [], K, x;
1134
+ K = 48;
1135
1135
  for (x = 0; x <= 9; ++x)
1136
- tl[j++] = x;
1137
- j = 97;
1136
+ rt[K++] = x;
1137
+ K = 97;
1138
1138
  for (x = 10; x < 36; ++x)
1139
- tl[j++] = x;
1140
- j = 65;
1139
+ rt[K++] = x;
1140
+ K = 65;
1141
1141
  for (x = 10; x < 36; ++x)
1142
- tl[j++] = x;
1143
- function Yl(t, l) {
1144
- var i = tl[t.charCodeAt(l)];
1145
- return i ?? -1;
1142
+ rt[K++] = x;
1143
+ function Tt(r, t) {
1144
+ var e = rt[r.charCodeAt(t)];
1145
+ return e ?? -1;
1146
1146
  }
1147
- function f(t) {
1148
- var l = a();
1149
- return l.fromInt(t), l;
1147
+ function V(r) {
1148
+ var t = v();
1149
+ return t.fromInt(r), t;
1150
1150
  }
1151
- function A(t) {
1152
- var l = 1, i;
1153
- return (i = t >>> 16) != 0 && (t = i, l += 16), (i = t >> 8) != 0 && (t = i, l += 8), (i = t >> 4) != 0 && (t = i, l += 4), (i = t >> 2) != 0 && (t = i, l += 2), (i = t >> 1) != 0 && (t = i, l += 1), l;
1151
+ function Z(r) {
1152
+ var t = 1, e;
1153
+ return (e = r >>> 16) != 0 && (r = e, t += 16), (e = r >> 8) != 0 && (r = e, t += 8), (e = r >> 4) != 0 && (r = e, t += 4), (e = r >> 2) != 0 && (r = e, t += 2), (e = r >> 1) != 0 && (r = e, t += 1), t;
1154
1154
  }
1155
- o.ZERO = f(0);
1156
- o.ONE = f(1);
1157
- var Ol = (
1155
+ d.ZERO = V(0);
1156
+ d.ONE = V(1);
1157
+ var Gt = (
1158
1158
  /** @class */
1159
1159
  (function() {
1160
- function t() {
1160
+ function r() {
1161
1161
  this.i = 0, this.j = 0, this.S = [];
1162
1162
  }
1163
- return t.prototype.init = function(l) {
1164
- var i, Z, d;
1165
- for (i = 0; i < 256; ++i)
1166
- this.S[i] = i;
1167
- for (Z = 0, i = 0; i < 256; ++i)
1168
- Z = Z + this.S[i] + l[i % l.length] & 255, d = this.S[i], this.S[i] = this.S[Z], this.S[Z] = d;
1163
+ return r.prototype.init = function(t) {
1164
+ var e, i, n;
1165
+ for (e = 0; e < 256; ++e)
1166
+ this.S[e] = e;
1167
+ for (i = 0, e = 0; e < 256; ++e)
1168
+ i = i + this.S[e] + t[e % t.length] & 255, n = this.S[e], this.S[e] = this.S[i], this.S[i] = n;
1169
1169
  this.i = 0, this.j = 0;
1170
- }, t.prototype.next = function() {
1171
- var l;
1172
- return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, l = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = l, this.S[l + this.S[this.i] & 255];
1173
- }, t;
1170
+ }, r.prototype.next = function() {
1171
+ var t;
1172
+ return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, t = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = t, this.S[t + this.S[this.i] & 255];
1173
+ }, r;
1174
1174
  })()
1175
1175
  );
1176
- function Al() {
1177
- return new Ol();
1176
+ function Zt() {
1177
+ return new Gt();
1178
1178
  }
1179
- var Kl = 256, q, v = null, K;
1180
- if (v == null) {
1181
- v = [], K = 0;
1182
- var _ = void 0;
1179
+ var At = 256, Y, C = null, A;
1180
+ if (C == null) {
1181
+ C = [], A = 0;
1182
+ var Q = void 0;
1183
1183
  if (typeof window < "u" && self.crypto && self.crypto.getRandomValues) {
1184
- var ml = new Uint32Array(256);
1185
- for (self.crypto.getRandomValues(ml), _ = 0; _ < ml.length; ++_)
1186
- v[K++] = ml[_] & 255;
1184
+ var ot = new Uint32Array(256);
1185
+ for (self.crypto.getRandomValues(ot), Q = 0; Q < ot.length; ++Q)
1186
+ C[A++] = ot[Q] & 255;
1187
1187
  }
1188
- var $ = 0, ll = function(t) {
1189
- if ($ = $ || 0, $ >= 256 || K >= Kl) {
1190
- self.removeEventListener ? self.removeEventListener("mousemove", ll, !1) : self.detachEvent && self.detachEvent("onmousemove", ll);
1188
+ var X = 0, tt = function(r) {
1189
+ if (X = X || 0, X >= 256 || A >= At) {
1190
+ self.removeEventListener ? self.removeEventListener("mousemove", tt, !1) : self.detachEvent && self.detachEvent("onmousemove", tt);
1191
1191
  return;
1192
1192
  }
1193
1193
  try {
1194
- var l = t.x + t.y;
1195
- v[K++] = l & 255, $ += 1;
1194
+ var t = r.x + r.y;
1195
+ C[A++] = t & 255, X += 1;
1196
1196
  } catch {
1197
1197
  }
1198
1198
  };
1199
- typeof window < "u" && (self.addEventListener ? self.addEventListener("mousemove", ll, !1) : self.attachEvent && self.attachEvent("onmousemove", ll));
1199
+ typeof window < "u" && (self.addEventListener ? self.addEventListener("mousemove", tt, !1) : self.attachEvent && self.attachEvent("onmousemove", tt));
1200
1200
  }
1201
- function ql() {
1202
- if (q == null) {
1203
- for (q = Al(); K < Kl; ) {
1204
- var t = Math.floor(65536 * Math.random());
1205
- v[K++] = t & 255;
1201
+ function Yt() {
1202
+ if (Y == null) {
1203
+ for (Y = Zt(); A < At; ) {
1204
+ var r = Math.floor(65536 * Math.random());
1205
+ C[A++] = r & 255;
1206
1206
  }
1207
- for (q.init(v), K = 0; K < v.length; ++K)
1208
- v[K] = 0;
1209
- K = 0;
1207
+ for (Y.init(C), A = 0; A < C.length; ++A)
1208
+ C[A] = 0;
1209
+ A = 0;
1210
1210
  }
1211
- return q.next();
1211
+ return Y.next();
1212
1212
  }
1213
- var Zl = (
1213
+ var it = (
1214
1214
  /** @class */
1215
1215
  (function() {
1216
- function t() {
1216
+ function r() {
1217
1217
  }
1218
- return t.prototype.nextBytes = function(l) {
1219
- for (var i = 0; i < l.length; ++i)
1220
- l[i] = ql();
1221
- }, t;
1218
+ return r.prototype.nextBytes = function(t) {
1219
+ for (var e = 0; e < t.length; ++e)
1220
+ t[e] = Yt();
1221
+ }, r;
1222
1222
  })()
1223
1223
  );
1224
- function el(t) {
1225
- return $l(si(_l(t), t.length * 8));
1224
+ function ft(r) {
1225
+ return Xt(he(Qt(r), r.length * 8));
1226
1226
  }
1227
- function rl(t) {
1228
- for (var l = "0123456789abcdef", i = "", Z = 0; Z < t.length; Z++) {
1229
- var d = t.charCodeAt(Z);
1230
- i += l.charAt(d >>> 4 & 15) + l.charAt(d & 15);
1227
+ function wt(r) {
1228
+ for (var t = "0123456789abcdef", e = "", i = 0; i < r.length; i++) {
1229
+ var n = r.charCodeAt(i);
1230
+ e += t.charAt(n >>> 4 & 15) + t.charAt(n & 15);
1231
1231
  }
1232
- return i;
1232
+ return e;
1233
1233
  }
1234
- function _l(t) {
1235
- for (var l = Array(t.length >> 2), i = 0; i < l.length; i++)
1236
- l[i] = 0;
1237
- for (var i = 0; i < t.length * 8; i += 8)
1238
- l[i >> 5] |= (t.charCodeAt(i / 8) & 255) << 24 - i % 32;
1239
- return l;
1234
+ function Qt(r) {
1235
+ for (var t = Array(r.length >> 2), e = 0; e < t.length; e++)
1236
+ t[e] = 0;
1237
+ for (var e = 0; e < r.length * 8; e += 8)
1238
+ t[e >> 5] |= (r.charCodeAt(e / 8) & 255) << 24 - e % 32;
1239
+ return t;
1240
1240
  }
1241
- function $l(t) {
1242
- for (var l = "", i = 0; i < t.length * 32; i += 8)
1243
- l += String.fromCharCode(t[i >> 5] >>> 24 - i % 32 & 255);
1244
- return l;
1241
+ function Xt(r) {
1242
+ for (var t = "", e = 0; e < r.length * 32; e += 8)
1243
+ t += String.fromCharCode(r[e >> 5] >>> 24 - e % 32 & 255);
1244
+ return t;
1245
1245
  }
1246
- function J(t, l) {
1247
- return t >>> l | t << 32 - l;
1246
+ function I(r, t) {
1247
+ return r >>> t | r << 32 - t;
1248
1248
  }
1249
- function Nl(t, l) {
1250
- return t >>> l;
1249
+ function Bt(r, t) {
1250
+ return r >>> t;
1251
1251
  }
1252
- function li(t, l, i) {
1253
- return t & l ^ ~t & i;
1252
+ function te(r, t, e) {
1253
+ return r & t ^ ~r & e;
1254
1254
  }
1255
- function ii(t, l, i) {
1256
- return t & l ^ t & i ^ l & i;
1255
+ function ee(r, t, e) {
1256
+ return r & t ^ r & e ^ t & e;
1257
1257
  }
1258
- function Zi(t) {
1259
- return J(t, 2) ^ J(t, 13) ^ J(t, 22);
1258
+ function ie(r) {
1259
+ return I(r, 2) ^ I(r, 13) ^ I(r, 22);
1260
1260
  }
1261
- function ti(t) {
1262
- return J(t, 6) ^ J(t, 11) ^ J(t, 25);
1261
+ function re(r) {
1262
+ return I(r, 6) ^ I(r, 11) ^ I(r, 25);
1263
1263
  }
1264
- function di(t) {
1265
- return J(t, 7) ^ J(t, 18) ^ Nl(t, 3);
1264
+ function ne(r) {
1265
+ return I(r, 7) ^ I(r, 18) ^ Bt(r, 3);
1266
1266
  }
1267
- function bi(t) {
1268
- return J(t, 17) ^ J(t, 19) ^ Nl(t, 10);
1267
+ function se(r) {
1268
+ return I(r, 17) ^ I(r, 19) ^ Bt(r, 10);
1269
1269
  }
1270
- var mi = new Array(1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998);
1271
- function si(t, l) {
1272
- var i = new Array(1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225), Z = new Array(64), d, b, m, s, c, e, h, n, W, X, p, G;
1273
- for (t[l >> 5] |= 128 << 24 - l % 32, t[(l + 64 >> 9 << 4) + 15] = l, W = 0; W < t.length; W += 16) {
1274
- for (d = i[0], b = i[1], m = i[2], s = i[3], c = i[4], e = i[5], h = i[6], n = i[7], X = 0; X < 64; X++)
1275
- X < 16 ? Z[X] = t[X + W] : Z[X] = r(r(r(bi(Z[X - 2]), Z[X - 7]), di(Z[X - 15])), Z[X - 16]), p = r(r(r(r(n, ti(c)), li(c, e, h)), mi[X]), Z[X]), G = r(Zi(d), ii(d, b, m)), n = h, h = e, e = c, c = r(s, p), s = m, m = b, b = d, d = r(p, G);
1276
- i[0] = r(d, i[0]), i[1] = r(b, i[1]), i[2] = r(m, i[2]), i[3] = r(s, i[3]), i[4] = r(c, i[4]), i[5] = r(e, i[5]), i[6] = r(h, i[6]), i[7] = r(n, i[7]);
1270
+ var oe = new Array(1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998);
1271
+ function he(r, t) {
1272
+ var e = new Array(1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225), i = new Array(64), n, s, o, h, a, f, l, c, g, p, m, S;
1273
+ for (r[t >> 5] |= 128 << 24 - t % 32, r[(t + 64 >> 9 << 4) + 15] = t, g = 0; g < r.length; g += 16) {
1274
+ for (n = e[0], s = e[1], o = e[2], h = e[3], a = e[4], f = e[5], l = e[6], c = e[7], p = 0; p < 64; p++)
1275
+ p < 16 ? i[p] = r[p + g] : i[p] = w(w(w(se(i[p - 2]), i[p - 7]), ne(i[p - 15])), i[p - 16]), m = w(w(w(w(c, re(a)), te(a, f, l)), oe[p]), i[p]), S = w(ie(n), ee(n, s, o)), c = l, l = f, f = a, a = w(h, m), h = o, o = s, s = n, n = w(m, S);
1276
+ e[0] = w(n, e[0]), e[1] = w(s, e[1]), e[2] = w(o, e[2]), e[3] = w(h, e[3]), e[4] = w(a, e[4]), e[5] = w(f, e[5]), e[6] = w(l, e[6]), e[7] = w(c, e[7]);
1277
1277
  }
1278
- return i;
1278
+ return e;
1279
1279
  }
1280
- function r(t, l) {
1281
- var i = (t & 65535) + (l & 65535), Z = (t >> 16) + (l >> 16) + (i >> 16);
1282
- return Z << 16 | i & 65535;
1280
+ function w(r, t) {
1281
+ var e = (r & 65535) + (t & 65535), i = (r >> 16) + (t >> 16) + (e >> 16);
1282
+ return i << 16 | e & 65535;
1283
1283
  }
1284
- function ci(t, l) {
1285
- if (l < t.length + 22)
1284
+ function ae(r, t) {
1285
+ if (t < r.length + 22)
1286
1286
  return console.error("Message too long for RSA"), null;
1287
- for (var i = l - t.length - 6, Z = "", d = 0; d < i; d += 2)
1288
- Z += "ff";
1289
- var b = "0001" + Z + "00" + t;
1290
- return y(b, 16);
1287
+ for (var e = t - r.length - 6, i = "", n = 0; n < e; n += 2)
1288
+ i += "ff";
1289
+ var s = "0001" + i + "00" + r;
1290
+ return b(s, 16);
1291
1291
  }
1292
- function ui(t, l) {
1293
- if (l < t.length + 11)
1292
+ function ue(r, t) {
1293
+ if (t < r.length + 11)
1294
1294
  return console.error("Message too long for RSA"), null;
1295
- for (var i = [], Z = t.length - 1; Z >= 0 && l > 0; ) {
1296
- var d = t.charCodeAt(Z--);
1297
- d < 128 ? i[--l] = d : d > 127 && d < 2048 ? (i[--l] = d & 63 | 128, i[--l] = d >> 6 | 192) : (i[--l] = d & 63 | 128, i[--l] = d >> 6 & 63 | 128, i[--l] = d >> 12 | 224);
1295
+ for (var e = [], i = r.length - 1; i >= 0 && t > 0; ) {
1296
+ var n = r.charCodeAt(i--);
1297
+ n < 128 ? e[--t] = n : n > 127 && n < 2048 ? (e[--t] = n & 63 | 128, e[--t] = n >> 6 | 192) : (e[--t] = n & 63 | 128, e[--t] = n >> 6 & 63 | 128, e[--t] = n >> 12 | 224);
1298
1298
  }
1299
- i[--l] = 0;
1300
- for (var b = new Zl(), m = []; l > 2; ) {
1301
- for (m[0] = 0; m[0] == 0; )
1302
- b.nextBytes(m);
1303
- i[--l] = m[0];
1299
+ e[--t] = 0;
1300
+ for (var s = new it(), o = []; t > 2; ) {
1301
+ for (o[0] = 0; o[0] == 0; )
1302
+ s.nextBytes(o);
1303
+ e[--t] = o[0];
1304
1304
  }
1305
- return i[--l] = 2, i[--l] = 0, new o(i);
1305
+ return e[--t] = 2, e[--t] = 0, new d(e);
1306
1306
  }
1307
- function Sl(t, l, i) {
1308
- for (var Z = "", d = 0; Z.length < l; )
1309
- Z += i(String.fromCharCode.apply(String, t.concat([
1310
- (d & 4278190080) >> 24,
1311
- (d & 16711680) >> 16,
1312
- (d & 65280) >> 8,
1313
- d & 255
1314
- ]))), d += 1;
1315
- return Z;
1307
+ function Et(r, t, e) {
1308
+ for (var i = "", n = 0; i.length < t; )
1309
+ i += e(String.fromCharCode.apply(String, r.concat([
1310
+ (n & 4278190080) >> 24,
1311
+ (n & 16711680) >> 16,
1312
+ (n & 65280) >> 8,
1313
+ n & 255
1314
+ ]))), n += 1;
1315
+ return i;
1316
1316
  }
1317
- var ei = 32;
1318
- function hi(t, l) {
1319
- var i = ei, Z = el;
1320
- if (t.length + 2 * i + 2 > l)
1317
+ var fe = 32;
1318
+ function le(r, t) {
1319
+ var e = fe, i = ft;
1320
+ if (r.length + 2 * e + 2 > t)
1321
1321
  throw "Message too long for RSA";
1322
- var d = "", b;
1323
- for (b = 0; b < l - t.length - 2 * i - 2; b += 1)
1324
- d += "\0";
1325
- var m = Z("") + d + "" + t, s = new Array(i);
1326
- new Zl().nextBytes(s);
1327
- var c = Sl(s, m.length, Z), e = [];
1328
- for (b = 0; b < m.length; b += 1)
1329
- e[b] = m.charCodeAt(b) ^ c.charCodeAt(b);
1330
- var h = Sl(e, s.length, Z), n = [0];
1331
- for (b = 0; b < s.length; b += 1)
1332
- n[b + 1] = s[b] ^ h.charCodeAt(b);
1333
- return new o(n.concat(e));
1322
+ var n = "", s;
1323
+ for (s = 0; s < t - r.length - 2 * e - 2; s += 1)
1324
+ n += "\0";
1325
+ var o = i("") + n + "" + r, h = new Array(e);
1326
+ new it().nextBytes(h);
1327
+ var a = Et(h, o.length, i), f = [];
1328
+ for (s = 0; s < o.length; s += 1)
1329
+ f[s] = o.charCodeAt(s) ^ a.charCodeAt(s);
1330
+ var l = Et(f, h.length, i), c = [0];
1331
+ for (s = 0; s < h.length; s += 1)
1332
+ c[s + 1] = h[s] ^ l.charCodeAt(s);
1333
+ return new d(c.concat(f));
1334
1334
  }
1335
- var ni = (
1335
+ var ce = (
1336
1336
  /** @class */
1337
1337
  (function() {
1338
- function t() {
1338
+ function r() {
1339
1339
  this.n = null, this.e = 0, this.d = null, this.p = null, this.q = null, this.dmp1 = null, this.dmq1 = null, this.coeff = null;
1340
1340
  }
1341
- return t.prototype.doPublic = function(l) {
1342
- return l.modPowInt(this.e, this.n);
1343
- }, t.prototype.doPrivate = function(l) {
1341
+ return r.prototype.doPublic = function(t) {
1342
+ return t.modPowInt(this.e, this.n);
1343
+ }, r.prototype.doPrivate = function(t) {
1344
1344
  if (this.p == null || this.q == null)
1345
- return l.modPow(this.d, this.n);
1346
- for (var i = l.mod(this.p).modPow(this.dmp1, this.p), Z = l.mod(this.q).modPow(this.dmq1, this.q); i.compareTo(Z) < 0; )
1347
- i = i.add(this.p);
1348
- return i.subtract(Z).multiply(this.coeff).mod(this.p).multiply(this.q).add(Z);
1349
- }, t.prototype.setPublic = function(l, i) {
1350
- l != null && i != null && l.length > 0 && i.length > 0 ? (this.n = y(l, 16), this.e = parseInt(i, 16)) : console.error("Invalid RSA public key");
1351
- }, t.prototype.encrypt = function(l, i) {
1352
- typeof i > "u" && (i = ui);
1353
- var Z = this.n.bitLength() + 7 >> 3, d = i(l, Z);
1354
- if (d == null)
1345
+ return t.modPow(this.d, this.n);
1346
+ for (var e = t.mod(this.p).modPow(this.dmp1, this.p), i = t.mod(this.q).modPow(this.dmq1, this.q); e.compareTo(i) < 0; )
1347
+ e = e.add(this.p);
1348
+ return e.subtract(i).multiply(this.coeff).mod(this.p).multiply(this.q).add(i);
1349
+ }, r.prototype.setPublic = function(t, e) {
1350
+ t != null && e != null && t.length > 0 && e.length > 0 ? (this.n = b(t, 16), this.e = parseInt(e, 16)) : console.error("Invalid RSA public key");
1351
+ }, r.prototype.encrypt = function(t, e) {
1352
+ typeof e > "u" && (e = ue);
1353
+ var i = this.n.bitLength() + 7 >> 3, n = e(t, i);
1354
+ if (n == null)
1355
1355
  return null;
1356
- var b = this.doPublic(d);
1357
- if (b == null)
1356
+ var s = this.doPublic(n);
1357
+ if (s == null)
1358
1358
  return null;
1359
- for (var m = b.toString(16), s = m.length, c = 0; c < Z * 2 - s; c++)
1360
- m = "0" + m;
1361
- return m;
1362
- }, t.prototype.setPrivate = function(l, i, Z) {
1363
- l != null && i != null && l.length > 0 && i.length > 0 ? (this.n = y(l, 16), this.e = parseInt(i, 16), this.d = y(Z, 16)) : console.error("Invalid RSA private key");
1364
- }, t.prototype.setPrivateEx = function(l, i, Z, d, b, m, s, c) {
1365
- l != null && i != null && l.length > 0 && i.length > 0 ? (this.n = y(l, 16), this.e = parseInt(i, 16), this.d = y(Z, 16), this.p = y(d, 16), this.q = y(b, 16), this.dmp1 = y(m, 16), this.dmq1 = y(s, 16), this.coeff = y(c, 16)) : console.error("Invalid RSA private key");
1366
- }, t.prototype.generate = function(l, i) {
1367
- var Z = new Zl(), d = l >> 1;
1368
- this.e = parseInt(i, 16);
1369
- for (var b = new o(i, 16); ; ) {
1370
- for (; this.p = new o(l - d, 1, Z), !(this.p.subtract(o.ONE).gcd(b).compareTo(o.ONE) == 0 && this.p.isProbablePrime(10)); )
1359
+ for (var o = s.toString(16), h = o.length, a = 0; a < i * 2 - h; a++)
1360
+ o = "0" + o;
1361
+ return o;
1362
+ }, r.prototype.setPrivate = function(t, e, i) {
1363
+ t != null && e != null && t.length > 0 && e.length > 0 ? (this.n = b(t, 16), this.e = parseInt(e, 16), this.d = b(i, 16)) : console.error("Invalid RSA private key");
1364
+ }, r.prototype.setPrivateEx = function(t, e, i, n, s, o, h, a) {
1365
+ t != null && e != null && t.length > 0 && e.length > 0 ? (this.n = b(t, 16), this.e = parseInt(e, 16), this.d = b(i, 16), this.p = b(n, 16), this.q = b(s, 16), this.dmp1 = b(o, 16), this.dmq1 = b(h, 16), this.coeff = b(a, 16)) : console.error("Invalid RSA private key");
1366
+ }, r.prototype.generate = function(t, e) {
1367
+ var i = new it(), n = t >> 1;
1368
+ this.e = parseInt(e, 16);
1369
+ for (var s = new d(e, 16); ; ) {
1370
+ for (; this.p = new d(t - n, 1, i), !(this.p.subtract(d.ONE).gcd(s).compareTo(d.ONE) == 0 && this.p.isProbablePrime(10)); )
1371
1371
  ;
1372
- for (; this.q = new o(d, 1, Z), !(this.q.subtract(o.ONE).gcd(b).compareTo(o.ONE) == 0 && this.q.isProbablePrime(10)); )
1372
+ for (; this.q = new d(n, 1, i), !(this.q.subtract(d.ONE).gcd(s).compareTo(d.ONE) == 0 && this.q.isProbablePrime(10)); )
1373
1373
  ;
1374
1374
  if (this.p.compareTo(this.q) <= 0) {
1375
- var m = this.p;
1376
- this.p = this.q, this.q = m;
1375
+ var o = this.p;
1376
+ this.p = this.q, this.q = o;
1377
1377
  }
1378
- var s = this.p.subtract(o.ONE), c = this.q.subtract(o.ONE), e = s.multiply(c);
1379
- if (e.gcd(b).compareTo(o.ONE) == 0) {
1380
- this.n = this.p.multiply(this.q), this.d = b.modInverse(e), this.dmp1 = this.d.mod(s), this.dmq1 = this.d.mod(c), this.coeff = this.q.modInverse(this.p);
1378
+ var h = this.p.subtract(d.ONE), a = this.q.subtract(d.ONE), f = h.multiply(a);
1379
+ if (f.gcd(s).compareTo(d.ONE) == 0) {
1380
+ this.n = this.p.multiply(this.q), this.d = s.modInverse(f), this.dmp1 = this.d.mod(h), this.dmq1 = this.d.mod(a), this.coeff = this.q.modInverse(this.p);
1381
1381
  break;
1382
1382
  }
1383
1383
  }
1384
- }, t.prototype.decrypt = function(l) {
1385
- var i = y(l, 16), Z = this.doPrivate(i);
1386
- return Z == null ? null : Xi(Z, this.n.bitLength() + 7 >> 3);
1387
- }, t.prototype.generateAsync = function(l, i, Z) {
1388
- var d = new Zl(), b = l >> 1;
1389
- this.e = parseInt(i, 16);
1390
- var m = new o(i, 16), s = this, c = function() {
1391
- var e = function() {
1392
- if (s.p.compareTo(s.q) <= 0) {
1393
- var W = s.p;
1394
- s.p = s.q, s.q = W;
1384
+ }, r.prototype.decrypt = function(t) {
1385
+ var e = b(t, 16), i = this.doPrivate(e);
1386
+ return i == null ? null : pe(i, this.n.bitLength() + 7 >> 3);
1387
+ }, r.prototype.generateAsync = function(t, e, i) {
1388
+ var n = new it(), s = t >> 1;
1389
+ this.e = parseInt(e, 16);
1390
+ var o = new d(e, 16), h = this, a = function() {
1391
+ var f = function() {
1392
+ if (h.p.compareTo(h.q) <= 0) {
1393
+ var g = h.p;
1394
+ h.p = h.q, h.q = g;
1395
1395
  }
1396
- var X = s.p.subtract(o.ONE), p = s.q.subtract(o.ONE), G = X.multiply(p);
1397
- G.gcd(m).compareTo(o.ONE) == 0 ? (s.n = s.p.multiply(s.q), s.d = m.modInverse(G), s.dmp1 = s.d.mod(X), s.dmq1 = s.d.mod(p), s.coeff = s.q.modInverse(s.p), setTimeout(function() {
1398
- Z();
1399
- }, 0)) : setTimeout(c, 0);
1400
- }, h = function() {
1401
- s.q = a(), s.q.fromNumberAsync(b, 1, d, function() {
1402
- s.q.subtract(o.ONE).gcda(m, function(W) {
1403
- W.compareTo(o.ONE) == 0 && s.q.isProbablePrime(10) ? setTimeout(e, 0) : setTimeout(h, 0);
1396
+ var p = h.p.subtract(d.ONE), m = h.q.subtract(d.ONE), S = p.multiply(m);
1397
+ S.gcd(o).compareTo(d.ONE) == 0 ? (h.n = h.p.multiply(h.q), h.d = o.modInverse(S), h.dmp1 = h.d.mod(p), h.dmq1 = h.d.mod(m), h.coeff = h.q.modInverse(h.p), setTimeout(function() {
1398
+ i();
1399
+ }, 0)) : setTimeout(a, 0);
1400
+ }, l = function() {
1401
+ h.q = v(), h.q.fromNumberAsync(s, 1, n, function() {
1402
+ h.q.subtract(d.ONE).gcda(o, function(g) {
1403
+ g.compareTo(d.ONE) == 0 && h.q.isProbablePrime(10) ? setTimeout(f, 0) : setTimeout(l, 0);
1404
1404
  });
1405
1405
  });
1406
- }, n = function() {
1407
- s.p = a(), s.p.fromNumberAsync(l - b, 1, d, function() {
1408
- s.p.subtract(o.ONE).gcda(m, function(W) {
1409
- W.compareTo(o.ONE) == 0 && s.p.isProbablePrime(10) ? setTimeout(h, 0) : setTimeout(n, 0);
1406
+ }, c = function() {
1407
+ h.p = v(), h.p.fromNumberAsync(t - s, 1, n, function() {
1408
+ h.p.subtract(d.ONE).gcda(o, function(g) {
1409
+ g.compareTo(d.ONE) == 0 && h.p.isProbablePrime(10) ? setTimeout(l, 0) : setTimeout(c, 0);
1410
1410
  });
1411
1411
  });
1412
1412
  };
1413
- setTimeout(n, 0);
1413
+ setTimeout(c, 0);
1414
1414
  };
1415
- setTimeout(c, 0);
1416
- }, t.prototype.sign = function(l, i, Z) {
1417
- var d = oi(Z), b = d + i(l).toString(), m = this.n.bitLength() / 4, s = ci(b, m);
1418
- if (s == null)
1415
+ setTimeout(a, 0);
1416
+ }, r.prototype.sign = function(t, e, i) {
1417
+ var n = de(i), s = n + e(t).toString(), o = this.n.bitLength() / 4, h = ae(s, o);
1418
+ if (h == null)
1419
1419
  return null;
1420
- var c = this.doPrivate(s);
1421
- if (c == null)
1420
+ var a = this.doPrivate(h);
1421
+ if (a == null)
1422
1422
  return null;
1423
- for (var e = c.toString(16), h = e.length, n = 0; n < m - h; n++)
1424
- e = "0" + e;
1425
- return e;
1426
- }, t.prototype.verify = function(l, i, Z) {
1427
- var d = y(i, 16), b = this.doPublic(d);
1428
- if (b == null)
1423
+ for (var f = a.toString(16), l = f.length, c = 0; c < o - l; c++)
1424
+ f = "0" + f;
1425
+ return f;
1426
+ }, r.prototype.verify = function(t, e, i) {
1427
+ var n = b(e, 16), s = this.doPublic(n);
1428
+ if (s == null)
1429
1429
  return null;
1430
- var m = b.toString(16).replace(/^1f+00/, ""), s = Wi(m);
1431
- return s == Z(l).toString();
1432
- }, t;
1430
+ var o = s.toString(16).replace(/^1f+00/, ""), h = ge(o);
1431
+ return h == i(t).toString();
1432
+ }, r;
1433
1433
  })()
1434
1434
  );
1435
- function Xi(t, l) {
1436
- for (var i = t.toByteArray(), Z = 0; Z < i.length && i[Z] == 0; )
1437
- ++Z;
1438
- if (i.length - Z != l - 1 || i[Z] != 2)
1435
+ function pe(r, t) {
1436
+ for (var e = r.toByteArray(), i = 0; i < e.length && e[i] == 0; )
1437
+ ++i;
1438
+ if (e.length - i != t - 1 || e[i] != 2)
1439
1439
  return null;
1440
- for (++Z; i[Z] != 0; )
1441
- if (++Z >= i.length)
1440
+ for (++i; e[i] != 0; )
1441
+ if (++i >= e.length)
1442
1442
  return null;
1443
- for (var d = ""; ++Z < i.length; ) {
1444
- var b = i[Z] & 255;
1445
- b < 128 ? d += String.fromCharCode(b) : b > 191 && b < 224 ? (d += String.fromCharCode((b & 31) << 6 | i[Z + 1] & 63), ++Z) : (d += String.fromCharCode((b & 15) << 12 | (i[Z + 1] & 63) << 6 | i[Z + 2] & 63), Z += 2);
1443
+ for (var n = ""; ++i < e.length; ) {
1444
+ var s = e[i] & 255;
1445
+ s < 128 ? n += String.fromCharCode(s) : s > 191 && s < 224 ? (n += String.fromCharCode((s & 31) << 6 | e[i + 1] & 63), ++i) : (n += String.fromCharCode((s & 15) << 12 | (e[i + 1] & 63) << 6 | e[i + 2] & 63), i += 2);
1446
1446
  }
1447
- return d;
1447
+ return n;
1448
1448
  }
1449
- var il = {
1449
+ var et = {
1450
1450
  md2: "3020300c06082a864886f70d020205000410",
1451
1451
  md5: "3020300c06082a864886f70d020505000410",
1452
1452
  sha1: "3021300906052b0e03021a05000414",
@@ -1456,165 +1456,165 @@ var il = {
1456
1456
  sha512: "3051300d060960864801650304020305000440",
1457
1457
  ripemd160: "3021300906052b2403020105000414"
1458
1458
  };
1459
- function oi(t) {
1460
- return il[t] || "";
1459
+ function de(r) {
1460
+ return et[r] || "";
1461
1461
  }
1462
- function Wi(t) {
1463
- for (var l in il)
1464
- if (il.hasOwnProperty(l)) {
1465
- var i = il[l], Z = i.length;
1466
- if (t.substring(0, Z) == i)
1467
- return t.substring(Z);
1462
+ function ge(r) {
1463
+ for (var t in et)
1464
+ if (et.hasOwnProperty(t)) {
1465
+ var e = et[t], i = e.length;
1466
+ if (r.substring(0, i) == e)
1467
+ return r.substring(i);
1468
1468
  }
1469
- return t;
1469
+ return r;
1470
1470
  }
1471
- function Y(t, l, i) {
1472
- if (!l || !t)
1471
+ function T(r, t, e) {
1472
+ if (!t || !r)
1473
1473
  throw new Error("extend failed, please check that all dependencies are included.");
1474
- var Z = function() {
1474
+ var i = function() {
1475
1475
  };
1476
- Z.prototype = l.prototype, t.prototype = new Z(), t.prototype.constructor = t, t.superclass = l.prototype, l.prototype.constructor == Object.prototype.constructor && (l.prototype.constructor = l);
1476
+ i.prototype = t.prototype, r.prototype = new i(), r.prototype.constructor = r, r.superclass = t.prototype, t.prototype.constructor == Object.prototype.constructor && (t.prototype.constructor = t);
1477
1477
  }
1478
1478
  var u = {};
1479
1479
  (typeof u.asn1 > "u" || !u.asn1) && (u.asn1 = {});
1480
1480
  u.asn1.ASN1Util = new function() {
1481
- this.integerToByteHex = function(t) {
1482
- var l = t.toString(16);
1483
- return l.length % 2 == 1 && (l = "0" + l), l;
1484
- }, this.bigIntToMinTwosComplementsHex = function(t) {
1485
- var l = t.toString(16);
1486
- if (l.substring(0, 1) != "-")
1487
- l.length % 2 == 1 ? l = "0" + l : l.match(/^[0-7]/) || (l = "00" + l);
1481
+ this.integerToByteHex = function(r) {
1482
+ var t = r.toString(16);
1483
+ return t.length % 2 == 1 && (t = "0" + t), t;
1484
+ }, this.bigIntToMinTwosComplementsHex = function(r) {
1485
+ var t = r.toString(16);
1486
+ if (t.substring(0, 1) != "-")
1487
+ t.length % 2 == 1 ? t = "0" + t : t.match(/^[0-7]/) || (t = "00" + t);
1488
1488
  else {
1489
- var i = l.substring(1), Z = i.length;
1490
- Z % 2 == 1 ? Z += 1 : l.match(/^[0-7]/) || (Z += 2);
1491
- for (var d = "", b = 0; b < Z; b++)
1492
- d += "f";
1493
- var m = new o(d, 16), s = m.xor(t).add(o.ONE);
1494
- l = s.toString(16).replace(/^-/, "");
1489
+ var e = t.substring(1), i = e.length;
1490
+ i % 2 == 1 ? i += 1 : t.match(/^[0-7]/) || (i += 2);
1491
+ for (var n = "", s = 0; s < i; s++)
1492
+ n += "f";
1493
+ var o = new d(n, 16), h = o.xor(r).add(d.ONE);
1494
+ t = h.toString(16).replace(/^-/, "");
1495
1495
  }
1496
- return l;
1497
- }, this.getPEMStringFromHex = function(t, l) {
1498
- return hextopem(t, l);
1499
- }, this.newObject = function(t) {
1500
- var l = u, i = l.asn1, Z = i.DERBoolean, d = i.DERInteger, b = i.DERBitString, m = i.DEROctetString, s = i.DERNull, c = i.DERObjectIdentifier, e = i.DEREnumerated, h = i.DERUTF8String, n = i.DERNumericString, W = i.DERPrintableString, X = i.DERTeletexString, p = i.DERIA5String, G = i.DERUTCTime, R = i.DERGeneralizedTime, F = i.DERSequence, N = i.DERSet, k = i.DERTaggedObject, E = i.ASN1Util.newObject, nl = Object.keys(t);
1501
- if (nl.length != 1)
1496
+ return t;
1497
+ }, this.getPEMStringFromHex = function(r, t) {
1498
+ return hextopem(r, t);
1499
+ }, this.newObject = function(r) {
1500
+ var t = u, e = t.asn1, i = e.DERBoolean, n = e.DERInteger, s = e.DERBitString, o = e.DEROctetString, h = e.DERNull, a = e.DERObjectIdentifier, f = e.DEREnumerated, l = e.DERUTF8String, c = e.DERNumericString, g = e.DERPrintableString, p = e.DERTeletexString, m = e.DERIA5String, S = e.DERUTCTime, D = e.DERGeneralizedTime, _ = e.DERSequence, B = e.DERSet, q = e.DERTaggedObject, z = e.ASN1Util.newObject, ct = Object.keys(r);
1501
+ if (ct.length != 1)
1502
1502
  throw "key of param shall be only one.";
1503
- var V = nl[0];
1504
- if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + V + ":") == -1)
1505
- throw "undefined key: " + V;
1506
- if (V == "bool")
1507
- return new Z(t[V]);
1508
- if (V == "int")
1509
- return new d(t[V]);
1510
- if (V == "bitstr")
1511
- return new b(t[V]);
1512
- if (V == "octstr")
1513
- return new m(t[V]);
1514
- if (V == "null")
1515
- return new s(t[V]);
1516
- if (V == "oid")
1517
- return new c(t[V]);
1518
- if (V == "enum")
1519
- return new e(t[V]);
1520
- if (V == "utf8str")
1521
- return new h(t[V]);
1522
- if (V == "numstr")
1523
- return new n(t[V]);
1524
- if (V == "prnstr")
1525
- return new W(t[V]);
1526
- if (V == "telstr")
1527
- return new X(t[V]);
1528
- if (V == "ia5str")
1529
- return new p(t[V]);
1530
- if (V == "utctime")
1531
- return new G(t[V]);
1532
- if (V == "gentime")
1533
- return new R(t[V]);
1534
- if (V == "seq") {
1535
- for (var Q = t[V], w = [], T = 0; T < Q.length; T++) {
1536
- var dl = E(Q[T]);
1537
- w.push(dl);
1503
+ var y = ct[0];
1504
+ if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + y + ":") == -1)
1505
+ throw "undefined key: " + y;
1506
+ if (y == "bool")
1507
+ return new i(r[y]);
1508
+ if (y == "int")
1509
+ return new n(r[y]);
1510
+ if (y == "bitstr")
1511
+ return new s(r[y]);
1512
+ if (y == "octstr")
1513
+ return new o(r[y]);
1514
+ if (y == "null")
1515
+ return new h(r[y]);
1516
+ if (y == "oid")
1517
+ return new a(r[y]);
1518
+ if (y == "enum")
1519
+ return new f(r[y]);
1520
+ if (y == "utf8str")
1521
+ return new l(r[y]);
1522
+ if (y == "numstr")
1523
+ return new c(r[y]);
1524
+ if (y == "prnstr")
1525
+ return new g(r[y]);
1526
+ if (y == "telstr")
1527
+ return new p(r[y]);
1528
+ if (y == "ia5str")
1529
+ return new m(r[y]);
1530
+ if (y == "utctime")
1531
+ return new S(r[y]);
1532
+ if (y == "gentime")
1533
+ return new D(r[y]);
1534
+ if (y == "seq") {
1535
+ for (var j = r[y], U = [], M = 0; M < j.length; M++) {
1536
+ var nt = z(j[M]);
1537
+ U.push(nt);
1538
1538
  }
1539
- return new F({ array: w });
1539
+ return new _({ array: U });
1540
1540
  }
1541
- if (V == "set") {
1542
- for (var Q = t[V], w = [], T = 0; T < Q.length; T++) {
1543
- var dl = E(Q[T]);
1544
- w.push(dl);
1541
+ if (y == "set") {
1542
+ for (var j = r[y], U = [], M = 0; M < j.length; M++) {
1543
+ var nt = z(j[M]);
1544
+ U.push(nt);
1545
1545
  }
1546
- return new N({ array: w });
1546
+ return new B({ array: U });
1547
1547
  }
1548
- if (V == "tag") {
1549
- var L = t[V];
1550
- if (Object.prototype.toString.call(L) === "[object Array]" && L.length == 3) {
1551
- var Jl = E(L[2]);
1552
- return new k({
1553
- tag: L[0],
1554
- explicit: L[1],
1555
- obj: Jl
1548
+ if (y == "tag") {
1549
+ var R = r[y];
1550
+ if (Object.prototype.toString.call(R) === "[object Array]" && R.length == 3) {
1551
+ var It = z(R[2]);
1552
+ return new q({
1553
+ tag: R[0],
1554
+ explicit: R[1],
1555
+ obj: It
1556
1556
  });
1557
1557
  } else {
1558
- var B = {};
1559
- if (L.explicit !== void 0 && (B.explicit = L.explicit), L.tag !== void 0 && (B.tag = L.tag), L.obj === void 0)
1558
+ var $ = {};
1559
+ if (R.explicit !== void 0 && ($.explicit = R.explicit), R.tag !== void 0 && ($.tag = R.tag), R.obj === void 0)
1560
1560
  throw "obj shall be specified for 'tag'.";
1561
- return B.obj = E(L.obj), new k(B);
1561
+ return $.obj = z(R.obj), new q($);
1562
1562
  }
1563
1563
  }
1564
- }, this.jsonToASN1HEX = function(t) {
1565
- var l = this.newObject(t);
1566
- return l.getEncodedHex();
1564
+ }, this.jsonToASN1HEX = function(r) {
1565
+ var t = this.newObject(r);
1566
+ return t.getEncodedHex();
1567
1567
  };
1568
1568
  }();
1569
- u.asn1.ASN1Util.oidHexToInt = function(t) {
1570
- for (var d = "", l = parseInt(t.substring(0, 2), 16), i = Math.floor(l / 40), Z = l % 40, d = i + "." + Z, b = "", m = 2; m < t.length; m += 2) {
1571
- var s = parseInt(t.substring(m, m + 2), 16), c = ("00000000" + s.toString(2)).slice(-8);
1572
- if (b = b + c.substring(1, 8), c.substring(0, 1) == "0") {
1573
- var e = new o(b, 2);
1574
- d = d + "." + e.toString(10), b = "";
1569
+ u.asn1.ASN1Util.oidHexToInt = function(r) {
1570
+ for (var n = "", t = parseInt(r.substring(0, 2), 16), e = Math.floor(t / 40), i = t % 40, n = e + "." + i, s = "", o = 2; o < r.length; o += 2) {
1571
+ var h = parseInt(r.substring(o, o + 2), 16), a = ("00000000" + h.toString(2)).slice(-8);
1572
+ if (s = s + a.substring(1, 8), a.substring(0, 1) == "0") {
1573
+ var f = new d(s, 2);
1574
+ n = n + "." + f.toString(10), s = "";
1575
1575
  }
1576
1576
  }
1577
- return d;
1577
+ return n;
1578
1578
  };
1579
- u.asn1.ASN1Util.oidIntToHex = function(t) {
1580
- var l = function(s) {
1581
- var c = s.toString(16);
1582
- return c.length == 1 && (c = "0" + c), c;
1583
- }, i = function(s) {
1584
- var c = "", e = new o(s, 10), h = e.toString(2), n = 7 - h.length % 7;
1585
- n == 7 && (n = 0);
1586
- for (var W = "", X = 0; X < n; X++)
1587
- W += "0";
1588
- h = W + h;
1589
- for (var X = 0; X < h.length - 1; X += 7) {
1590
- var p = h.substring(X, X + 7);
1591
- X != h.length - 7 && (p = "1" + p), c += l(parseInt(p, 2));
1579
+ u.asn1.ASN1Util.oidIntToHex = function(r) {
1580
+ var t = function(h) {
1581
+ var a = h.toString(16);
1582
+ return a.length == 1 && (a = "0" + a), a;
1583
+ }, e = function(h) {
1584
+ var a = "", f = new d(h, 10), l = f.toString(2), c = 7 - l.length % 7;
1585
+ c == 7 && (c = 0);
1586
+ for (var g = "", p = 0; p < c; p++)
1587
+ g += "0";
1588
+ l = g + l;
1589
+ for (var p = 0; p < l.length - 1; p += 7) {
1590
+ var m = l.substring(p, p + 7);
1591
+ p != l.length - 7 && (m = "1" + m), a += t(parseInt(m, 2));
1592
1592
  }
1593
- return c;
1593
+ return a;
1594
1594
  };
1595
- if (!t.match(/^[0-9.]+$/))
1596
- throw "malformed oid string: " + t;
1597
- var Z = "", d = t.split("."), b = parseInt(d[0]) * 40 + parseInt(d[1]);
1598
- Z += l(b), d.splice(0, 2);
1599
- for (var m = 0; m < d.length; m++)
1600
- Z += i(d[m]);
1601
- return Z;
1595
+ if (!r.match(/^[0-9.]+$/))
1596
+ throw "malformed oid string: " + r;
1597
+ var i = "", n = r.split("."), s = parseInt(n[0]) * 40 + parseInt(n[1]);
1598
+ i += t(s), n.splice(0, 2);
1599
+ for (var o = 0; o < n.length; o++)
1600
+ i += e(n[o]);
1601
+ return i;
1602
1602
  };
1603
1603
  u.asn1.ASN1Object = function() {
1604
- var t = "";
1604
+ var r = "";
1605
1605
  this.getLengthHexFromValue = function() {
1606
1606
  if (typeof this.hV > "u" || this.hV == null)
1607
1607
  throw "this.hV is null or undefined.";
1608
1608
  if (this.hV.length % 2 == 1)
1609
- throw "value hex must be even length: n=" + t.length + ",v=" + this.hV;
1610
- var l = this.hV.length / 2, i = l.toString(16);
1611
- if (i.length % 2 == 1 && (i = "0" + i), l < 128)
1612
- return i;
1613
- var Z = i.length / 2;
1614
- if (Z > 15)
1615
- throw "ASN.1 length too long to represent by 8x: n = " + l.toString(16);
1616
- var d = 128 + Z;
1617
- return d.toString(16) + i;
1609
+ throw "value hex must be even length: n=" + r.length + ",v=" + this.hV;
1610
+ var t = this.hV.length / 2, e = t.toString(16);
1611
+ if (e.length % 2 == 1 && (e = "0" + e), t < 128)
1612
+ return e;
1613
+ var i = e.length / 2;
1614
+ if (i > 15)
1615
+ throw "ASN.1 length too long to represent by 8x: n = " + t.toString(16);
1616
+ var n = 128 + i;
1617
+ return n.toString(16) + e;
1618
1618
  }, this.getEncodedHex = function() {
1619
1619
  return (this.hTLV == null || this.isModified) && (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = !1), this.hTLV;
1620
1620
  }, this.getValueHex = function() {
@@ -1623,292 +1623,292 @@ u.asn1.ASN1Object = function() {
1623
1623
  return "";
1624
1624
  };
1625
1625
  };
1626
- u.asn1.DERAbstractString = function(t) {
1626
+ u.asn1.DERAbstractString = function(r) {
1627
1627
  u.asn1.DERAbstractString.superclass.constructor.call(this), this.getString = function() {
1628
1628
  return this.s;
1629
- }, this.setString = function(l) {
1630
- this.hTLV = null, this.isModified = !0, this.s = l, this.hV = stohex(this.s);
1631
- }, this.setStringHex = function(l) {
1632
- this.hTLV = null, this.isModified = !0, this.s = null, this.hV = l;
1629
+ }, this.setString = function(t) {
1630
+ this.hTLV = null, this.isModified = !0, this.s = t, this.hV = stohex(this.s);
1631
+ }, this.setStringHex = function(t) {
1632
+ this.hTLV = null, this.isModified = !0, this.s = null, this.hV = t;
1633
1633
  }, this.getFreshValueHex = function() {
1634
1634
  return this.hV;
1635
- }, typeof t < "u" && (typeof t == "string" ? this.setString(t) : typeof t.str < "u" ? this.setString(t.str) : typeof t.hex < "u" && this.setStringHex(t.hex));
1635
+ }, typeof r < "u" && (typeof r == "string" ? this.setString(r) : typeof r.str < "u" ? this.setString(r.str) : typeof r.hex < "u" && this.setStringHex(r.hex));
1636
1636
  };
1637
- Y(u.asn1.DERAbstractString, u.asn1.ASN1Object);
1638
- u.asn1.DERAbstractTime = function(t) {
1639
- u.asn1.DERAbstractTime.superclass.constructor.call(this), this.localDateToUTC = function(l) {
1640
- utc = l.getTime() + l.getTimezoneOffset() * 6e4;
1641
- var i = new Date(utc);
1642
- return i;
1643
- }, this.formatDate = function(l, i, Z) {
1644
- var d = this.zeroPadding, b = this.localDateToUTC(l), m = String(b.getFullYear());
1645
- i == "utc" && (m = m.substring(2, 4));
1646
- var s = d(String(b.getMonth() + 1), 2), c = d(String(b.getDate()), 2), e = d(String(b.getHours()), 2), h = d(String(b.getMinutes()), 2), n = d(String(b.getSeconds()), 2), W = m + s + c + e + h + n;
1647
- if (Z === !0) {
1648
- var X = b.getMilliseconds();
1649
- if (X != 0) {
1650
- var p = d(String(X), 3);
1651
- p = p.replace(/[0]+$/, ""), W = W + "." + p;
1637
+ T(u.asn1.DERAbstractString, u.asn1.ASN1Object);
1638
+ u.asn1.DERAbstractTime = function(r) {
1639
+ u.asn1.DERAbstractTime.superclass.constructor.call(this), this.localDateToUTC = function(t) {
1640
+ utc = t.getTime() + t.getTimezoneOffset() * 6e4;
1641
+ var e = new Date(utc);
1642
+ return e;
1643
+ }, this.formatDate = function(t, e, i) {
1644
+ var n = this.zeroPadding, s = this.localDateToUTC(t), o = String(s.getFullYear());
1645
+ e == "utc" && (o = o.substring(2, 4));
1646
+ var h = n(String(s.getMonth() + 1), 2), a = n(String(s.getDate()), 2), f = n(String(s.getHours()), 2), l = n(String(s.getMinutes()), 2), c = n(String(s.getSeconds()), 2), g = o + h + a + f + l + c;
1647
+ if (i === !0) {
1648
+ var p = s.getMilliseconds();
1649
+ if (p != 0) {
1650
+ var m = n(String(p), 3);
1651
+ m = m.replace(/[0]+$/, ""), g = g + "." + m;
1652
1652
  }
1653
1653
  }
1654
- return W + "Z";
1655
- }, this.zeroPadding = function(l, i) {
1656
- return l.length >= i ? l : new Array(i - l.length + 1).join("0") + l;
1654
+ return g + "Z";
1655
+ }, this.zeroPadding = function(t, e) {
1656
+ return t.length >= e ? t : new Array(e - t.length + 1).join("0") + t;
1657
1657
  }, this.getString = function() {
1658
1658
  return this.s;
1659
- }, this.setString = function(l) {
1660
- this.hTLV = null, this.isModified = !0, this.s = l, this.hV = stohex(l);
1661
- }, this.setByDateValue = function(l, i, Z, d, b, m) {
1662
- var s = new Date(Date.UTC(l, i - 1, Z, d, b, m, 0));
1663
- this.setByDate(s);
1659
+ }, this.setString = function(t) {
1660
+ this.hTLV = null, this.isModified = !0, this.s = t, this.hV = stohex(t);
1661
+ }, this.setByDateValue = function(t, e, i, n, s, o) {
1662
+ var h = new Date(Date.UTC(t, e - 1, i, n, s, o, 0));
1663
+ this.setByDate(h);
1664
1664
  }, this.getFreshValueHex = function() {
1665
1665
  return this.hV;
1666
1666
  };
1667
1667
  };
1668
- Y(u.asn1.DERAbstractTime, u.asn1.ASN1Object);
1669
- u.asn1.DERAbstractStructured = function(t) {
1670
- u.asn1.DERAbstractString.superclass.constructor.call(this), this.setByASN1ObjectArray = function(l) {
1671
- this.hTLV = null, this.isModified = !0, this.asn1Array = l;
1672
- }, this.appendASN1Object = function(l) {
1673
- this.hTLV = null, this.isModified = !0, this.asn1Array.push(l);
1674
- }, this.asn1Array = new Array(), typeof t < "u" && typeof t.array < "u" && (this.asn1Array = t.array);
1668
+ T(u.asn1.DERAbstractTime, u.asn1.ASN1Object);
1669
+ u.asn1.DERAbstractStructured = function(r) {
1670
+ u.asn1.DERAbstractString.superclass.constructor.call(this), this.setByASN1ObjectArray = function(t) {
1671
+ this.hTLV = null, this.isModified = !0, this.asn1Array = t;
1672
+ }, this.appendASN1Object = function(t) {
1673
+ this.hTLV = null, this.isModified = !0, this.asn1Array.push(t);
1674
+ }, this.asn1Array = new Array(), typeof r < "u" && typeof r.array < "u" && (this.asn1Array = r.array);
1675
1675
  };
1676
- Y(u.asn1.DERAbstractStructured, u.asn1.ASN1Object);
1676
+ T(u.asn1.DERAbstractStructured, u.asn1.ASN1Object);
1677
1677
  u.asn1.DERBoolean = function() {
1678
1678
  u.asn1.DERBoolean.superclass.constructor.call(this), this.hT = "01", this.hTLV = "0101ff";
1679
1679
  };
1680
- Y(u.asn1.DERBoolean, u.asn1.ASN1Object);
1681
- u.asn1.DERInteger = function(t) {
1682
- u.asn1.DERInteger.superclass.constructor.call(this), this.hT = "02", this.setByBigInteger = function(l) {
1683
- this.hTLV = null, this.isModified = !0, this.hV = u.asn1.ASN1Util.bigIntToMinTwosComplementsHex(l);
1684
- }, this.setByInteger = function(l) {
1685
- var i = new o(String(l), 10);
1686
- this.setByBigInteger(i);
1687
- }, this.setValueHex = function(l) {
1688
- this.hV = l;
1680
+ T(u.asn1.DERBoolean, u.asn1.ASN1Object);
1681
+ u.asn1.DERInteger = function(r) {
1682
+ u.asn1.DERInteger.superclass.constructor.call(this), this.hT = "02", this.setByBigInteger = function(t) {
1683
+ this.hTLV = null, this.isModified = !0, this.hV = u.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t);
1684
+ }, this.setByInteger = function(t) {
1685
+ var e = new d(String(t), 10);
1686
+ this.setByBigInteger(e);
1687
+ }, this.setValueHex = function(t) {
1688
+ this.hV = t;
1689
1689
  }, this.getFreshValueHex = function() {
1690
1690
  return this.hV;
1691
- }, typeof t < "u" && (typeof t.bigint < "u" ? this.setByBigInteger(t.bigint) : typeof t.int < "u" ? this.setByInteger(t.int) : typeof t == "number" ? this.setByInteger(t) : typeof t.hex < "u" && this.setValueHex(t.hex));
1691
+ }, typeof r < "u" && (typeof r.bigint < "u" ? this.setByBigInteger(r.bigint) : typeof r.int < "u" ? this.setByInteger(r.int) : typeof r == "number" ? this.setByInteger(r) : typeof r.hex < "u" && this.setValueHex(r.hex));
1692
1692
  };
1693
- Y(u.asn1.DERInteger, u.asn1.ASN1Object);
1694
- u.asn1.DERBitString = function(t) {
1695
- if (t !== void 0 && typeof t.obj < "u") {
1696
- var l = u.asn1.ASN1Util.newObject(t.obj);
1697
- t.hex = "00" + l.getEncodedHex();
1693
+ T(u.asn1.DERInteger, u.asn1.ASN1Object);
1694
+ u.asn1.DERBitString = function(r) {
1695
+ if (r !== void 0 && typeof r.obj < "u") {
1696
+ var t = u.asn1.ASN1Util.newObject(r.obj);
1697
+ r.hex = "00" + t.getEncodedHex();
1698
1698
  }
1699
- u.asn1.DERBitString.superclass.constructor.call(this), this.hT = "03", this.setHexValueIncludingUnusedBits = function(i) {
1700
- this.hTLV = null, this.isModified = !0, this.hV = i;
1701
- }, this.setUnusedBitsAndHexValue = function(i, Z) {
1702
- if (i < 0 || 7 < i)
1703
- throw "unused bits shall be from 0 to 7: u = " + i;
1704
- var d = "0" + i;
1705
- this.hTLV = null, this.isModified = !0, this.hV = d + Z;
1706
- }, this.setByBinaryString = function(i) {
1707
- i = i.replace(/0+$/, "");
1708
- var Z = 8 - i.length % 8;
1709
- Z == 8 && (Z = 0);
1710
- for (var d = 0; d <= Z; d++)
1711
- i += "0";
1712
- for (var b = "", d = 0; d < i.length - 1; d += 8) {
1713
- var m = i.substring(d, d + 8), s = parseInt(m, 2).toString(16);
1714
- s.length == 1 && (s = "0" + s), b += s;
1699
+ u.asn1.DERBitString.superclass.constructor.call(this), this.hT = "03", this.setHexValueIncludingUnusedBits = function(e) {
1700
+ this.hTLV = null, this.isModified = !0, this.hV = e;
1701
+ }, this.setUnusedBitsAndHexValue = function(e, i) {
1702
+ if (e < 0 || 7 < e)
1703
+ throw "unused bits shall be from 0 to 7: u = " + e;
1704
+ var n = "0" + e;
1705
+ this.hTLV = null, this.isModified = !0, this.hV = n + i;
1706
+ }, this.setByBinaryString = function(e) {
1707
+ e = e.replace(/0+$/, "");
1708
+ var i = 8 - e.length % 8;
1709
+ i == 8 && (i = 0);
1710
+ for (var n = 0; n <= i; n++)
1711
+ e += "0";
1712
+ for (var s = "", n = 0; n < e.length - 1; n += 8) {
1713
+ var o = e.substring(n, n + 8), h = parseInt(o, 2).toString(16);
1714
+ h.length == 1 && (h = "0" + h), s += h;
1715
1715
  }
1716
- this.hTLV = null, this.isModified = !0, this.hV = "0" + Z + b;
1717
- }, this.setByBooleanArray = function(i) {
1718
- for (var Z = "", d = 0; d < i.length; d++)
1719
- i[d] == !0 ? Z += "1" : Z += "0";
1720
- this.setByBinaryString(Z);
1721
- }, this.newFalseArray = function(i) {
1722
- for (var Z = new Array(i), d = 0; d < i; d++)
1723
- Z[d] = !1;
1724
- return Z;
1716
+ this.hTLV = null, this.isModified = !0, this.hV = "0" + i + s;
1717
+ }, this.setByBooleanArray = function(e) {
1718
+ for (var i = "", n = 0; n < e.length; n++)
1719
+ e[n] == !0 ? i += "1" : i += "0";
1720
+ this.setByBinaryString(i);
1721
+ }, this.newFalseArray = function(e) {
1722
+ for (var i = new Array(e), n = 0; n < e; n++)
1723
+ i[n] = !1;
1724
+ return i;
1725
1725
  }, this.getFreshValueHex = function() {
1726
1726
  return this.hV;
1727
- }, typeof t < "u" && (typeof t == "string" && t.toLowerCase().match(/^[0-9a-f]+$/) ? this.setHexValueIncludingUnusedBits(t) : typeof t.hex < "u" ? this.setHexValueIncludingUnusedBits(t.hex) : typeof t.bin < "u" ? this.setByBinaryString(t.bin) : typeof t.array < "u" && this.setByBooleanArray(t.array));
1727
+ }, typeof r < "u" && (typeof r == "string" && r.toLowerCase().match(/^[0-9a-f]+$/) ? this.setHexValueIncludingUnusedBits(r) : typeof r.hex < "u" ? this.setHexValueIncludingUnusedBits(r.hex) : typeof r.bin < "u" ? this.setByBinaryString(r.bin) : typeof r.array < "u" && this.setByBooleanArray(r.array));
1728
1728
  };
1729
- Y(u.asn1.DERBitString, u.asn1.ASN1Object);
1730
- u.asn1.DEROctetString = function(t) {
1731
- if (t !== void 0 && typeof t.obj < "u") {
1732
- var l = u.asn1.ASN1Util.newObject(t.obj);
1733
- t.hex = l.getEncodedHex();
1729
+ T(u.asn1.DERBitString, u.asn1.ASN1Object);
1730
+ u.asn1.DEROctetString = function(r) {
1731
+ if (r !== void 0 && typeof r.obj < "u") {
1732
+ var t = u.asn1.ASN1Util.newObject(r.obj);
1733
+ r.hex = t.getEncodedHex();
1734
1734
  }
1735
- u.asn1.DEROctetString.superclass.constructor.call(this, t), this.hT = "04";
1735
+ u.asn1.DEROctetString.superclass.constructor.call(this, r), this.hT = "04";
1736
1736
  };
1737
- Y(u.asn1.DEROctetString, u.asn1.DERAbstractString);
1737
+ T(u.asn1.DEROctetString, u.asn1.DERAbstractString);
1738
1738
  u.asn1.DERNull = function() {
1739
1739
  u.asn1.DERNull.superclass.constructor.call(this), this.hT = "05", this.hTLV = "0500";
1740
1740
  };
1741
- Y(u.asn1.DERNull, u.asn1.ASN1Object);
1742
- u.asn1.DERObjectIdentifier = function(t) {
1743
- var l = function(Z) {
1744
- var d = Z.toString(16);
1745
- return d.length == 1 && (d = "0" + d), d;
1746
- }, i = function(Z) {
1747
- var d = "", b = new o(Z, 10), m = b.toString(2), s = 7 - m.length % 7;
1748
- s == 7 && (s = 0);
1749
- for (var c = "", e = 0; e < s; e++)
1750
- c += "0";
1751
- m = c + m;
1752
- for (var e = 0; e < m.length - 1; e += 7) {
1753
- var h = m.substring(e, e + 7);
1754
- e != m.length - 7 && (h = "1" + h), d += l(parseInt(h, 2));
1741
+ T(u.asn1.DERNull, u.asn1.ASN1Object);
1742
+ u.asn1.DERObjectIdentifier = function(r) {
1743
+ var t = function(i) {
1744
+ var n = i.toString(16);
1745
+ return n.length == 1 && (n = "0" + n), n;
1746
+ }, e = function(i) {
1747
+ var n = "", s = new d(i, 10), o = s.toString(2), h = 7 - o.length % 7;
1748
+ h == 7 && (h = 0);
1749
+ for (var a = "", f = 0; f < h; f++)
1750
+ a += "0";
1751
+ o = a + o;
1752
+ for (var f = 0; f < o.length - 1; f += 7) {
1753
+ var l = o.substring(f, f + 7);
1754
+ f != o.length - 7 && (l = "1" + l), n += t(parseInt(l, 2));
1755
1755
  }
1756
- return d;
1756
+ return n;
1757
1757
  };
1758
- u.asn1.DERObjectIdentifier.superclass.constructor.call(this), this.hT = "06", this.setValueHex = function(Z) {
1759
- this.hTLV = null, this.isModified = !0, this.s = null, this.hV = Z;
1760
- }, this.setValueOidString = function(Z) {
1761
- if (!Z.match(/^[0-9.]+$/))
1762
- throw "malformed oid string: " + Z;
1763
- var d = "", b = Z.split("."), m = parseInt(b[0]) * 40 + parseInt(b[1]);
1764
- d += l(m), b.splice(0, 2);
1765
- for (var s = 0; s < b.length; s++)
1766
- d += i(b[s]);
1767
- this.hTLV = null, this.isModified = !0, this.s = null, this.hV = d;
1768
- }, this.setValueName = function(Z) {
1769
- var d = u.asn1.x509.OID.name2oid(Z);
1770
- if (d !== "")
1771
- this.setValueOidString(d);
1758
+ u.asn1.DERObjectIdentifier.superclass.constructor.call(this), this.hT = "06", this.setValueHex = function(i) {
1759
+ this.hTLV = null, this.isModified = !0, this.s = null, this.hV = i;
1760
+ }, this.setValueOidString = function(i) {
1761
+ if (!i.match(/^[0-9.]+$/))
1762
+ throw "malformed oid string: " + i;
1763
+ var n = "", s = i.split("."), o = parseInt(s[0]) * 40 + parseInt(s[1]);
1764
+ n += t(o), s.splice(0, 2);
1765
+ for (var h = 0; h < s.length; h++)
1766
+ n += e(s[h]);
1767
+ this.hTLV = null, this.isModified = !0, this.s = null, this.hV = n;
1768
+ }, this.setValueName = function(i) {
1769
+ var n = u.asn1.x509.OID.name2oid(i);
1770
+ if (n !== "")
1771
+ this.setValueOidString(n);
1772
1772
  else
1773
- throw "DERObjectIdentifier oidName undefined: " + Z;
1773
+ throw "DERObjectIdentifier oidName undefined: " + i;
1774
1774
  }, this.getFreshValueHex = function() {
1775
1775
  return this.hV;
1776
- }, t !== void 0 && (typeof t == "string" ? t.match(/^[0-2].[0-9.]+$/) ? this.setValueOidString(t) : this.setValueName(t) : t.oid !== void 0 ? this.setValueOidString(t.oid) : t.hex !== void 0 ? this.setValueHex(t.hex) : t.name !== void 0 && this.setValueName(t.name));
1776
+ }, r !== void 0 && (typeof r == "string" ? r.match(/^[0-2].[0-9.]+$/) ? this.setValueOidString(r) : this.setValueName(r) : r.oid !== void 0 ? this.setValueOidString(r.oid) : r.hex !== void 0 ? this.setValueHex(r.hex) : r.name !== void 0 && this.setValueName(r.name));
1777
1777
  };
1778
- Y(u.asn1.DERObjectIdentifier, u.asn1.ASN1Object);
1779
- u.asn1.DEREnumerated = function(t) {
1780
- u.asn1.DEREnumerated.superclass.constructor.call(this), this.hT = "0a", this.setByBigInteger = function(l) {
1781
- this.hTLV = null, this.isModified = !0, this.hV = u.asn1.ASN1Util.bigIntToMinTwosComplementsHex(l);
1782
- }, this.setByInteger = function(l) {
1783
- var i = new o(String(l), 10);
1784
- this.setByBigInteger(i);
1785
- }, this.setValueHex = function(l) {
1786
- this.hV = l;
1778
+ T(u.asn1.DERObjectIdentifier, u.asn1.ASN1Object);
1779
+ u.asn1.DEREnumerated = function(r) {
1780
+ u.asn1.DEREnumerated.superclass.constructor.call(this), this.hT = "0a", this.setByBigInteger = function(t) {
1781
+ this.hTLV = null, this.isModified = !0, this.hV = u.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t);
1782
+ }, this.setByInteger = function(t) {
1783
+ var e = new d(String(t), 10);
1784
+ this.setByBigInteger(e);
1785
+ }, this.setValueHex = function(t) {
1786
+ this.hV = t;
1787
1787
  }, this.getFreshValueHex = function() {
1788
1788
  return this.hV;
1789
- }, typeof t < "u" && (typeof t.int < "u" ? this.setByInteger(t.int) : typeof t == "number" ? this.setByInteger(t) : typeof t.hex < "u" && this.setValueHex(t.hex));
1789
+ }, typeof r < "u" && (typeof r.int < "u" ? this.setByInteger(r.int) : typeof r == "number" ? this.setByInteger(r) : typeof r.hex < "u" && this.setValueHex(r.hex));
1790
1790
  };
1791
- Y(u.asn1.DEREnumerated, u.asn1.ASN1Object);
1792
- u.asn1.DERUTF8String = function(t) {
1793
- u.asn1.DERUTF8String.superclass.constructor.call(this, t), this.hT = "0c";
1791
+ T(u.asn1.DEREnumerated, u.asn1.ASN1Object);
1792
+ u.asn1.DERUTF8String = function(r) {
1793
+ u.asn1.DERUTF8String.superclass.constructor.call(this, r), this.hT = "0c";
1794
1794
  };
1795
- Y(u.asn1.DERUTF8String, u.asn1.DERAbstractString);
1796
- u.asn1.DERNumericString = function(t) {
1797
- u.asn1.DERNumericString.superclass.constructor.call(this, t), this.hT = "12";
1795
+ T(u.asn1.DERUTF8String, u.asn1.DERAbstractString);
1796
+ u.asn1.DERNumericString = function(r) {
1797
+ u.asn1.DERNumericString.superclass.constructor.call(this, r), this.hT = "12";
1798
1798
  };
1799
- Y(u.asn1.DERNumericString, u.asn1.DERAbstractString);
1800
- u.asn1.DERPrintableString = function(t) {
1801
- u.asn1.DERPrintableString.superclass.constructor.call(this, t), this.hT = "13";
1799
+ T(u.asn1.DERNumericString, u.asn1.DERAbstractString);
1800
+ u.asn1.DERPrintableString = function(r) {
1801
+ u.asn1.DERPrintableString.superclass.constructor.call(this, r), this.hT = "13";
1802
1802
  };
1803
- Y(u.asn1.DERPrintableString, u.asn1.DERAbstractString);
1804
- u.asn1.DERTeletexString = function(t) {
1805
- u.asn1.DERTeletexString.superclass.constructor.call(this, t), this.hT = "14";
1803
+ T(u.asn1.DERPrintableString, u.asn1.DERAbstractString);
1804
+ u.asn1.DERTeletexString = function(r) {
1805
+ u.asn1.DERTeletexString.superclass.constructor.call(this, r), this.hT = "14";
1806
1806
  };
1807
- Y(u.asn1.DERTeletexString, u.asn1.DERAbstractString);
1808
- u.asn1.DERIA5String = function(t) {
1809
- u.asn1.DERIA5String.superclass.constructor.call(this, t), this.hT = "16";
1807
+ T(u.asn1.DERTeletexString, u.asn1.DERAbstractString);
1808
+ u.asn1.DERIA5String = function(r) {
1809
+ u.asn1.DERIA5String.superclass.constructor.call(this, r), this.hT = "16";
1810
1810
  };
1811
- Y(u.asn1.DERIA5String, u.asn1.DERAbstractString);
1812
- u.asn1.DERUTCTime = function(t) {
1813
- u.asn1.DERUTCTime.superclass.constructor.call(this, t), this.hT = "17", this.setByDate = function(l) {
1814
- this.hTLV = null, this.isModified = !0, this.date = l, this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s);
1811
+ T(u.asn1.DERIA5String, u.asn1.DERAbstractString);
1812
+ u.asn1.DERUTCTime = function(r) {
1813
+ u.asn1.DERUTCTime.superclass.constructor.call(this, r), this.hT = "17", this.setByDate = function(t) {
1814
+ this.hTLV = null, this.isModified = !0, this.date = t, this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s);
1815
1815
  }, this.getFreshValueHex = function() {
1816
1816
  return typeof this.date > "u" && typeof this.s > "u" && (this.date = /* @__PURE__ */ new Date(), this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s)), this.hV;
1817
- }, t !== void 0 && (t.str !== void 0 ? this.setString(t.str) : typeof t == "string" && t.match(/^[0-9]{12}Z$/) ? this.setString(t) : t.hex !== void 0 ? this.setStringHex(t.hex) : t.date !== void 0 && this.setByDate(t.date));
1817
+ }, r !== void 0 && (r.str !== void 0 ? this.setString(r.str) : typeof r == "string" && r.match(/^[0-9]{12}Z$/) ? this.setString(r) : r.hex !== void 0 ? this.setStringHex(r.hex) : r.date !== void 0 && this.setByDate(r.date));
1818
1818
  };
1819
- Y(u.asn1.DERUTCTime, u.asn1.DERAbstractTime);
1820
- u.asn1.DERGeneralizedTime = function(t) {
1821
- u.asn1.DERGeneralizedTime.superclass.constructor.call(this, t), this.hT = "18", this.withMillis = !1, this.setByDate = function(l) {
1822
- this.hTLV = null, this.isModified = !0, this.date = l, this.s = this.formatDate(this.date, "gen", this.withMillis), this.hV = stohex(this.s);
1819
+ T(u.asn1.DERUTCTime, u.asn1.DERAbstractTime);
1820
+ u.asn1.DERGeneralizedTime = function(r) {
1821
+ u.asn1.DERGeneralizedTime.superclass.constructor.call(this, r), this.hT = "18", this.withMillis = !1, this.setByDate = function(t) {
1822
+ this.hTLV = null, this.isModified = !0, this.date = t, this.s = this.formatDate(this.date, "gen", this.withMillis), this.hV = stohex(this.s);
1823
1823
  }, this.getFreshValueHex = function() {
1824
1824
  return this.date === void 0 && this.s === void 0 && (this.date = /* @__PURE__ */ new Date(), this.s = this.formatDate(this.date, "gen", this.withMillis), this.hV = stohex(this.s)), this.hV;
1825
- }, t !== void 0 && (t.str !== void 0 ? this.setString(t.str) : typeof t == "string" && t.match(/^[0-9]{14}Z$/) ? this.setString(t) : t.hex !== void 0 ? this.setStringHex(t.hex) : t.date !== void 0 && this.setByDate(t.date), t.millis === !0 && (this.withMillis = !0));
1825
+ }, r !== void 0 && (r.str !== void 0 ? this.setString(r.str) : typeof r == "string" && r.match(/^[0-9]{14}Z$/) ? this.setString(r) : r.hex !== void 0 ? this.setStringHex(r.hex) : r.date !== void 0 && this.setByDate(r.date), r.millis === !0 && (this.withMillis = !0));
1826
1826
  };
1827
- Y(u.asn1.DERGeneralizedTime, u.asn1.DERAbstractTime);
1828
- u.asn1.DERSequence = function(t) {
1829
- u.asn1.DERSequence.superclass.constructor.call(this, t), this.hT = "30", this.getFreshValueHex = function() {
1830
- for (var l = "", i = 0; i < this.asn1Array.length; i++) {
1831
- var Z = this.asn1Array[i];
1832
- l += Z.getEncodedHex();
1827
+ T(u.asn1.DERGeneralizedTime, u.asn1.DERAbstractTime);
1828
+ u.asn1.DERSequence = function(r) {
1829
+ u.asn1.DERSequence.superclass.constructor.call(this, r), this.hT = "30", this.getFreshValueHex = function() {
1830
+ for (var t = "", e = 0; e < this.asn1Array.length; e++) {
1831
+ var i = this.asn1Array[e];
1832
+ t += i.getEncodedHex();
1833
1833
  }
1834
- return this.hV = l, this.hV;
1834
+ return this.hV = t, this.hV;
1835
1835
  };
1836
1836
  };
1837
- Y(u.asn1.DERSequence, u.asn1.DERAbstractStructured);
1838
- u.asn1.DERSet = function(t) {
1839
- u.asn1.DERSet.superclass.constructor.call(this, t), this.hT = "31", this.sortFlag = !0, this.getFreshValueHex = function() {
1840
- for (var l = new Array(), i = 0; i < this.asn1Array.length; i++) {
1841
- var Z = this.asn1Array[i];
1842
- l.push(Z.getEncodedHex());
1837
+ T(u.asn1.DERSequence, u.asn1.DERAbstractStructured);
1838
+ u.asn1.DERSet = function(r) {
1839
+ u.asn1.DERSet.superclass.constructor.call(this, r), this.hT = "31", this.sortFlag = !0, this.getFreshValueHex = function() {
1840
+ for (var t = new Array(), e = 0; e < this.asn1Array.length; e++) {
1841
+ var i = this.asn1Array[e];
1842
+ t.push(i.getEncodedHex());
1843
1843
  }
1844
- return this.sortFlag == !0 && l.sort(), this.hV = l.join(""), this.hV;
1845
- }, typeof t < "u" && typeof t.sortflag < "u" && t.sortflag == !1 && (this.sortFlag = !1);
1844
+ return this.sortFlag == !0 && t.sort(), this.hV = t.join(""), this.hV;
1845
+ }, typeof r < "u" && typeof r.sortflag < "u" && r.sortflag == !1 && (this.sortFlag = !1);
1846
1846
  };
1847
- Y(u.asn1.DERSet, u.asn1.DERAbstractStructured);
1848
- u.asn1.DERTaggedObject = function(t) {
1849
- u.asn1.DERTaggedObject.superclass.constructor.call(this), this.hT = "a0", this.hV = "", this.isExplicit = !0, this.asn1Object = null, this.setASN1Object = function(l, i, Z) {
1850
- this.hT = i, this.isExplicit = l, this.asn1Object = Z, this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = Z.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, i), this.isModified = !1);
1847
+ T(u.asn1.DERSet, u.asn1.DERAbstractStructured);
1848
+ u.asn1.DERTaggedObject = function(r) {
1849
+ u.asn1.DERTaggedObject.superclass.constructor.call(this), this.hT = "a0", this.hV = "", this.isExplicit = !0, this.asn1Object = null, this.setASN1Object = function(t, e, i) {
1850
+ this.hT = e, this.isExplicit = t, this.asn1Object = i, this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = i.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, e), this.isModified = !1);
1851
1851
  }, this.getFreshValueHex = function() {
1852
1852
  return this.hV;
1853
- }, typeof t < "u" && (typeof t.tag < "u" && (this.hT = t.tag), typeof t.explicit < "u" && (this.isExplicit = t.explicit), typeof t.obj < "u" && (this.asn1Object = t.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)));
1853
+ }, typeof r < "u" && (typeof r.tag < "u" && (this.hT = r.tag), typeof r.explicit < "u" && (this.isExplicit = r.explicit), typeof r.obj < "u" && (this.asn1Object = r.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)));
1854
1854
  };
1855
- Y(u.asn1.DERTaggedObject, u.asn1.ASN1Object);
1856
- var ai = /* @__PURE__ */ (function() {
1857
- var t = function(l, i) {
1858
- return t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(Z, d) {
1859
- Z.__proto__ = d;
1860
- } || function(Z, d) {
1861
- for (var b in d) Object.prototype.hasOwnProperty.call(d, b) && (Z[b] = d[b]);
1862
- }, t(l, i);
1855
+ T(u.asn1.DERTaggedObject, u.asn1.ASN1Object);
1856
+ var ve = /* @__PURE__ */ (function() {
1857
+ var r = function(t, e) {
1858
+ return r = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(i, n) {
1859
+ i.__proto__ = n;
1860
+ } || function(i, n) {
1861
+ for (var s in n) Object.prototype.hasOwnProperty.call(n, s) && (i[s] = n[s]);
1862
+ }, r(t, e);
1863
1863
  };
1864
- return function(l, i) {
1865
- if (typeof i != "function" && i !== null)
1866
- throw new TypeError("Class extends value " + String(i) + " is not a constructor or null");
1867
- t(l, i);
1868
- function Z() {
1869
- this.constructor = l;
1864
+ return function(t, e) {
1865
+ if (typeof e != "function" && e !== null)
1866
+ throw new TypeError("Class extends value " + String(e) + " is not a constructor or null");
1867
+ r(t, e);
1868
+ function i() {
1869
+ this.constructor = t;
1870
1870
  }
1871
- l.prototype = i === null ? Object.create(i) : (Z.prototype = i.prototype, new Z());
1871
+ t.prototype = e === null ? Object.create(e) : (i.prototype = e.prototype, new i());
1872
1872
  };
1873
- })(), Rl = (
1873
+ })(), Dt = (
1874
1874
  /** @class */
1875
- (function(t) {
1876
- ai(l, t);
1877
- function l(i) {
1878
- var Z = t.call(this) || this;
1879
- return i && (typeof i == "string" ? Z.parseKey(i) : (l.hasPrivateKeyProperty(i) || l.hasPublicKeyProperty(i)) && Z.parsePropertiesFrom(i)), Z;
1875
+ (function(r) {
1876
+ ve(t, r);
1877
+ function t(e) {
1878
+ var i = r.call(this) || this;
1879
+ return e && (typeof e == "string" ? i.parseKey(e) : (t.hasPrivateKeyProperty(e) || t.hasPublicKeyProperty(e)) && i.parsePropertiesFrom(e)), i;
1880
1880
  }
1881
- return l.prototype.parseKey = function(i) {
1881
+ return t.prototype.parseKey = function(e) {
1882
1882
  try {
1883
- var Z = 0, d = 0, b = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/, m = b.test(i) ? Pl.decode(i) : ul.unarmor(i), s = wl.decode(m);
1884
- if (s.sub.length === 3 && (s = s.sub[2].sub[0]), s.sub.length === 9) {
1885
- Z = s.sub[1].getHexStringValue(), this.n = y(Z, 16), d = s.sub[2].getHexStringValue(), this.e = parseInt(d, 16);
1886
- var c = s.sub[3].getHexStringValue();
1887
- this.d = y(c, 16);
1888
- var e = s.sub[4].getHexStringValue();
1889
- this.p = y(e, 16);
1890
- var h = s.sub[5].getHexStringValue();
1891
- this.q = y(h, 16);
1892
- var n = s.sub[6].getHexStringValue();
1893
- this.dmp1 = y(n, 16);
1894
- var W = s.sub[7].getHexStringValue();
1895
- this.dmq1 = y(W, 16);
1896
- var X = s.sub[8].getHexStringValue();
1897
- this.coeff = y(X, 16);
1898
- } else if (s.sub.length === 2)
1899
- if (s.sub[0].sub) {
1900
- var p = s.sub[1], G = p.sub[0];
1901
- Z = G.sub[0].getHexStringValue(), this.n = y(Z, 16), d = G.sub[1].getHexStringValue(), this.e = parseInt(d, 16);
1883
+ var i = 0, n = 0, s = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/, o = s.test(e) ? Lt.decode(e) : ut.unarmor(e), h = Ut.decode(o);
1884
+ if (h.sub.length === 3 && (h = h.sub[2].sub[0]), h.sub.length === 9) {
1885
+ i = h.sub[1].getHexStringValue(), this.n = b(i, 16), n = h.sub[2].getHexStringValue(), this.e = parseInt(n, 16);
1886
+ var a = h.sub[3].getHexStringValue();
1887
+ this.d = b(a, 16);
1888
+ var f = h.sub[4].getHexStringValue();
1889
+ this.p = b(f, 16);
1890
+ var l = h.sub[5].getHexStringValue();
1891
+ this.q = b(l, 16);
1892
+ var c = h.sub[6].getHexStringValue();
1893
+ this.dmp1 = b(c, 16);
1894
+ var g = h.sub[7].getHexStringValue();
1895
+ this.dmq1 = b(g, 16);
1896
+ var p = h.sub[8].getHexStringValue();
1897
+ this.coeff = b(p, 16);
1898
+ } else if (h.sub.length === 2)
1899
+ if (h.sub[0].sub) {
1900
+ var m = h.sub[1], S = m.sub[0];
1901
+ i = S.sub[0].getHexStringValue(), this.n = b(i, 16), n = S.sub[1].getHexStringValue(), this.e = parseInt(n, 16);
1902
1902
  } else
1903
- Z = s.sub[0].getHexStringValue(), this.n = y(Z, 16), d = s.sub[1].getHexStringValue(), this.e = parseInt(d, 16);
1903
+ i = h.sub[0].getHexStringValue(), this.n = b(i, 16), n = h.sub[1].getHexStringValue(), this.e = parseInt(n, 16);
1904
1904
  else
1905
1905
  return !1;
1906
1906
  return !0;
1907
1907
  } catch {
1908
1908
  return !1;
1909
1909
  }
1910
- }, l.prototype.getPrivateBaseKey = function() {
1911
- var i = {
1910
+ }, t.prototype.getPrivateBaseKey = function() {
1911
+ var e = {
1912
1912
  array: [
1913
1913
  new u.asn1.DERInteger({ int: 0 }),
1914
1914
  new u.asn1.DERInteger({ bigint: this.n }),
@@ -1920,132 +1920,132 @@ var ai = /* @__PURE__ */ (function() {
1920
1920
  new u.asn1.DERInteger({ bigint: this.dmq1 }),
1921
1921
  new u.asn1.DERInteger({ bigint: this.coeff })
1922
1922
  ]
1923
- }, Z = new u.asn1.DERSequence(i);
1924
- return Z.getEncodedHex();
1925
- }, l.prototype.getPrivateBaseKeyB64 = function() {
1926
- return D(this.getPrivateBaseKey());
1927
- }, l.prototype.getPublicBaseKey = function() {
1928
- var i = new u.asn1.DERSequence({
1923
+ }, i = new u.asn1.DERSequence(e);
1924
+ return i.getEncodedHex();
1925
+ }, t.prototype.getPrivateBaseKeyB64 = function() {
1926
+ return J(this.getPrivateBaseKey());
1927
+ }, t.prototype.getPublicBaseKey = function() {
1928
+ var e = new u.asn1.DERSequence({
1929
1929
  array: [
1930
1930
  new u.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }),
1931
1931
  // RSA Encryption pkcs #1 oid
1932
1932
  new u.asn1.DERNull()
1933
1933
  ]
1934
- }), Z = new u.asn1.DERSequence({
1934
+ }), i = new u.asn1.DERSequence({
1935
1935
  array: [
1936
1936
  new u.asn1.DERInteger({ bigint: this.n }),
1937
1937
  new u.asn1.DERInteger({ int: this.e })
1938
1938
  ]
1939
- }), d = new u.asn1.DERBitString({
1940
- hex: "00" + Z.getEncodedHex()
1941
- }), b = new u.asn1.DERSequence({
1942
- array: [i, d]
1939
+ }), n = new u.asn1.DERBitString({
1940
+ hex: "00" + i.getEncodedHex()
1941
+ }), s = new u.asn1.DERSequence({
1942
+ array: [e, n]
1943
1943
  });
1944
- return b.getEncodedHex();
1945
- }, l.prototype.getPublicBaseKeyB64 = function() {
1946
- return D(this.getPublicBaseKey());
1947
- }, l.wordwrap = function(i, Z) {
1948
- if (Z = Z || 64, !i)
1949
- return i;
1950
- var d = "(.{1," + Z + `})( +|$
1951
- ?)|(.{1,` + Z + "})";
1952
- return i.match(RegExp(d, "g")).join(`
1944
+ return s.getEncodedHex();
1945
+ }, t.prototype.getPublicBaseKeyB64 = function() {
1946
+ return J(this.getPublicBaseKey());
1947
+ }, t.wordwrap = function(e, i) {
1948
+ if (i = i || 64, !e)
1949
+ return e;
1950
+ var n = "(.{1," + i + `})( +|$
1951
+ ?)|(.{1,` + i + "})";
1952
+ return e.match(RegExp(n, "g")).join(`
1953
1953
  `);
1954
- }, l.prototype.getPrivateKey = function() {
1955
- var i = `-----BEGIN RSA PRIVATE KEY-----
1954
+ }, t.prototype.getPrivateKey = function() {
1955
+ var e = `-----BEGIN RSA PRIVATE KEY-----
1956
1956
  `;
1957
- return i += l.wordwrap(this.getPrivateBaseKeyB64()) + `
1958
- `, i += "-----END RSA PRIVATE KEY-----", i;
1959
- }, l.prototype.getPublicKey = function() {
1960
- var i = `-----BEGIN PUBLIC KEY-----
1957
+ return e += t.wordwrap(this.getPrivateBaseKeyB64()) + `
1958
+ `, e += "-----END RSA PRIVATE KEY-----", e;
1959
+ }, t.prototype.getPublicKey = function() {
1960
+ var e = `-----BEGIN PUBLIC KEY-----
1961
1961
  `;
1962
- return i += l.wordwrap(this.getPublicBaseKeyB64()) + `
1963
- `, i += "-----END PUBLIC KEY-----", i;
1964
- }, l.hasPublicKeyProperty = function(i) {
1965
- return i = i || {}, i.hasOwnProperty("n") && i.hasOwnProperty("e");
1966
- }, l.hasPrivateKeyProperty = function(i) {
1967
- return i = i || {}, i.hasOwnProperty("n") && i.hasOwnProperty("e") && i.hasOwnProperty("d") && i.hasOwnProperty("p") && i.hasOwnProperty("q") && i.hasOwnProperty("dmp1") && i.hasOwnProperty("dmq1") && i.hasOwnProperty("coeff");
1968
- }, l.prototype.parsePropertiesFrom = function(i) {
1969
- this.n = i.n, this.e = i.e, i.hasOwnProperty("d") && (this.d = i.d, this.p = i.p, this.q = i.q, this.dmp1 = i.dmp1, this.dmq1 = i.dmq1, this.coeff = i.coeff);
1970
- }, l;
1971
- })(ni)
1972
- ), sl, Vi = typeof process < "u" ? (sl = process.env) === null || sl === void 0 ? void 0 : sl.npm_package_version : void 0, pi = (
1962
+ return e += t.wordwrap(this.getPublicBaseKeyB64()) + `
1963
+ `, e += "-----END PUBLIC KEY-----", e;
1964
+ }, t.hasPublicKeyProperty = function(e) {
1965
+ return e = e || {}, e.hasOwnProperty("n") && e.hasOwnProperty("e");
1966
+ }, t.hasPrivateKeyProperty = function(e) {
1967
+ return e = e || {}, e.hasOwnProperty("n") && e.hasOwnProperty("e") && e.hasOwnProperty("d") && e.hasOwnProperty("p") && e.hasOwnProperty("q") && e.hasOwnProperty("dmp1") && e.hasOwnProperty("dmq1") && e.hasOwnProperty("coeff");
1968
+ }, t.prototype.parsePropertiesFrom = function(e) {
1969
+ this.n = e.n, this.e = e.e, e.hasOwnProperty("d") && (this.d = e.d, this.p = e.p, this.q = e.q, this.dmp1 = e.dmp1, this.dmq1 = e.dmq1, this.coeff = e.coeff);
1970
+ }, t;
1971
+ })(ce)
1972
+ ), ht, ye = typeof process < "u" ? (ht = process.env) === null || ht === void 0 ? void 0 : ht.npm_package_version : void 0, me = (
1973
1973
  /** @class */
1974
1974
  (function() {
1975
- function t(l) {
1976
- l === void 0 && (l = {}), this.default_key_size = l.default_key_size ? parseInt(l.default_key_size, 10) : 1024, this.default_public_exponent = l.default_public_exponent || "010001", this.log = l.log || !1, this.key = l.key || null;
1975
+ function r(t) {
1976
+ t === void 0 && (t = {}), this.default_key_size = t.default_key_size ? parseInt(t.default_key_size, 10) : 1024, this.default_public_exponent = t.default_public_exponent || "010001", this.log = t.log || !1, this.key = t.key || null;
1977
1977
  }
1978
- return t.prototype.setKey = function(l) {
1979
- l ? (this.log && this.key && console.warn("A key was already set, overriding existing."), this.key = new Rl(l)) : !this.key && this.log && console.error("A key was not set.");
1980
- }, t.prototype.setPrivateKey = function(l) {
1981
- this.setKey(l);
1982
- }, t.prototype.setPublicKey = function(l) {
1983
- this.setKey(l);
1984
- }, t.prototype.decrypt = function(l) {
1978
+ return r.prototype.setKey = function(t) {
1979
+ t ? (this.log && this.key && console.warn("A key was already set, overriding existing."), this.key = new Dt(t)) : !this.key && this.log && console.error("A key was not set.");
1980
+ }, r.prototype.setPrivateKey = function(t) {
1981
+ this.setKey(t);
1982
+ }, r.prototype.setPublicKey = function(t) {
1983
+ this.setKey(t);
1984
+ }, r.prototype.decrypt = function(t) {
1985
1985
  try {
1986
- return this.getKey().decrypt(Wl(l));
1986
+ return this.getKey().decrypt(gt(t));
1987
1987
  } catch {
1988
1988
  return !1;
1989
1989
  }
1990
- }, t.prototype.encrypt = function(l) {
1990
+ }, r.prototype.encrypt = function(t) {
1991
1991
  try {
1992
- return D(this.getKey().encrypt(l));
1992
+ return J(this.getKey().encrypt(t));
1993
1993
  } catch {
1994
1994
  return !1;
1995
1995
  }
1996
- }, t.prototype.encryptOAEP = function(l) {
1996
+ }, r.prototype.encryptOAEP = function(t) {
1997
1997
  try {
1998
- return D(this.getKey().encrypt(l, hi));
1998
+ return J(this.getKey().encrypt(t, le));
1999
1999
  } catch {
2000
2000
  return !1;
2001
2001
  }
2002
- }, t.prototype.sign = function(l, i, Z) {
2003
- i === void 0 && (i = function(d) {
2004
- return d;
2005
- }), Z === void 0 && (Z = "");
2002
+ }, r.prototype.sign = function(t, e, i) {
2003
+ e === void 0 && (e = function(n) {
2004
+ return n;
2005
+ }), i === void 0 && (i = "");
2006
2006
  try {
2007
- return D(this.getKey().sign(l, i, Z));
2007
+ return J(this.getKey().sign(t, e, i));
2008
2008
  } catch {
2009
2009
  return !1;
2010
2010
  }
2011
- }, t.prototype.signSha256 = function(l) {
2012
- return this.sign(l, function(i) {
2013
- return rl(el(i));
2011
+ }, r.prototype.signSha256 = function(t) {
2012
+ return this.sign(t, function(e) {
2013
+ return wt(ft(e));
2014
2014
  }, "sha256");
2015
- }, t.prototype.verify = function(l, i, Z) {
2016
- Z === void 0 && (Z = function(d) {
2017
- return d;
2015
+ }, r.prototype.verify = function(t, e, i) {
2016
+ i === void 0 && (i = function(n) {
2017
+ return n;
2018
2018
  });
2019
2019
  try {
2020
- return this.getKey().verify(l, Wl(i), Z);
2020
+ return this.getKey().verify(t, gt(e), i);
2021
2021
  } catch {
2022
2022
  return !1;
2023
2023
  }
2024
- }, t.prototype.verifySha256 = function(l, i) {
2025
- return this.verify(l, i, function(Z) {
2026
- return rl(el(Z));
2024
+ }, r.prototype.verifySha256 = function(t, e) {
2025
+ return this.verify(t, e, function(i) {
2026
+ return wt(ft(i));
2027
2027
  });
2028
- }, t.prototype.getKey = function(l) {
2028
+ }, r.prototype.getKey = function(t) {
2029
2029
  if (!this.key) {
2030
- if (this.key = new Rl(), l && {}.toString.call(l) === "[object Function]") {
2031
- this.key.generateAsync(this.default_key_size, this.default_public_exponent, l);
2030
+ if (this.key = new Dt(), t && {}.toString.call(t) === "[object Function]") {
2031
+ this.key.generateAsync(this.default_key_size, this.default_public_exponent, t);
2032
2032
  return;
2033
2033
  }
2034
2034
  this.key.generate(this.default_key_size, this.default_public_exponent);
2035
2035
  }
2036
2036
  return this.key;
2037
- }, t.prototype.getPrivateKey = function() {
2037
+ }, r.prototype.getPrivateKey = function() {
2038
2038
  return this.getKey().getPrivateKey();
2039
- }, t.prototype.getPrivateKeyB64 = function() {
2039
+ }, r.prototype.getPrivateKeyB64 = function() {
2040
2040
  return this.getKey().getPrivateBaseKeyB64();
2041
- }, t.prototype.getPublicKey = function() {
2041
+ }, r.prototype.getPublicKey = function() {
2042
2042
  return this.getKey().getPublicKey();
2043
- }, t.prototype.getPublicKeyB64 = function() {
2043
+ }, r.prototype.getPublicKeyB64 = function() {
2044
2044
  return this.getKey().getPublicBaseKeyB64();
2045
- }, t.version = Vi, t;
2045
+ }, r.version = ye, r;
2046
2046
  })()
2047
2047
  );
2048
- const Gi = {
2048
+ const Se = {
2049
2049
  name: "GPluginVideo",
2050
2050
  props: {
2051
2051
  // 是否播放
@@ -2138,8 +2138,8 @@ const Gi = {
2138
2138
  happenedTime() {
2139
2139
  this.startMultiPlayback();
2140
2140
  },
2141
- cameraIndexCode(t, l) {
2142
- t !== l && (this.oWebControl.JS_RequestInterface({
2141
+ cameraIndexCode(r, t) {
2142
+ r !== t && (this.oWebControl.JS_RequestInterface({
2143
2143
  funcName: "stopAllPreview"
2144
2144
  }), this.oWebControl.JS_HideWnd(), this.oWebControl.JS_RequestInterface({
2145
2145
  funcName: "destroyWnd"
@@ -2151,47 +2151,47 @@ const Gi = {
2151
2151
  }
2152
2152
  ));
2153
2153
  },
2154
- playText(t) {
2155
- t != "" && this.showPluginDownloadDialog();
2154
+ playText(r) {
2155
+ r != "" && this.showPluginDownloadDialog();
2156
2156
  }
2157
2157
  },
2158
2158
  methods: {
2159
2159
  // 动态加载h5player.min.js脚本
2160
2160
  loadH5PlayerScript() {
2161
- return new Promise((t, l) => {
2161
+ return new Promise((r, t) => {
2162
2162
  if (window.WebControl) {
2163
- t();
2163
+ r();
2164
2164
  return;
2165
2165
  }
2166
- const i = document.createElement("script");
2167
- let Z;
2166
+ const e = document.createElement("script");
2167
+ let i;
2168
2168
  try {
2169
- Z = new URL("data:text/javascript;base64,dmFyIFdlYkNvbnRyb2w9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiB0KGUpe3JldHVybiB0PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSx0KGUpfWZ1bmN0aW9uIG4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvPXRbbl07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxvLmtleSxvKX19ZnVuY3Rpb24gcihlLHQsbil7cmV0dXJuIHQmJm8oZS5wcm90b3R5cGUsdCksbiYmbyhlLG4pLGV9dmFyIGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuTWF0aD09TWF0aCYmZX0scz1pKCJvYmplY3QiPT0oInVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzPyJ1bmRlZmluZWQiOnQoZ2xvYmFsVGhpcykpJiZnbG9iYWxUaGlzKXx8aSgib2JqZWN0Ij09KCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93PyJ1bmRlZmluZWQiOnQod2luZG93KSkmJndpbmRvdyl8fGkoIm9iamVjdCI9PSgidW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/InVuZGVmaW5lZCI6dChzZWxmKSkmJnNlbGYpfHxpKCJvYmplY3QiPT10KGUpJiZlKXx8ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxhPXt9LHU9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiEhZSgpfWNhdGNoKGUpe3JldHVybiEwfX0sYz0hdSgoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LDEse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pWzFdfSkpLGw9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsZD1sLmJpbmQ/bC5iaW5kKGwpOmZ1bmN0aW9uKCl7cmV0dXJuIGwuYXBwbHkobCxhcmd1bWVudHMpfSxmPXt9LGg9e30ucHJvcGVydHlJc0VudW1lcmFibGUscD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHY9cCYmIWguY2FsbCh7MToyfSwxKTtmLmY9dj9mdW5jdGlvbihlKXt2YXIgdD1wKHRoaXMsZSk7cmV0dXJuISF0JiZ0LmVudW1lcmFibGV9Omg7dmFyIGIsZyxtPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2VudW1lcmFibGU6ISgxJmUpLGNvbmZpZ3VyYWJsZTohKDImZSksd3JpdGFibGU6ISg0JmUpLHZhbHVlOnR9fSx5PUZ1bmN0aW9uLnByb3RvdHlwZSxfPXkuYmluZCx3PXkuY2FsbCxDPV8mJl8uYmluZCh3KSxrPV8/ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJkModyxlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmZ1bmN0aW9uKCl7cmV0dXJuIHcuYXBwbHkoZSxhcmd1bWVudHMpfX0sUz1rLFI9Uyh7fS50b1N0cmluZykscT1TKCIiLnNsaWNlKSxJPWZ1bmN0aW9uKGUpe3JldHVybiBxKFIoZSksOCwtMSl9LFA9ayxFPXUsTz1JLFQ9cy5PYmplY3Qsej1QKCIiLnNwbGl0KSxBPUUoKGZ1bmN0aW9uKCl7cmV0dXJuIVQoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKX0pKT9mdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09TyhlKT96KGUsIiIpOlQoZSl9OlQsVT1zLlR5cGVFcnJvcixEPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpdGhyb3cgVSgiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIitlKTtyZXR1cm4gZX0seD1BLFc9RCxGPWZ1bmN0aW9uKGUpe3JldHVybiB4KFcoZSkpfSxNPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfSxMPU0sSj1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dChlKT9udWxsIT09ZTpMKGUpfSxqPXMsTj1NLEI9ZnVuY3Rpb24oZSl7cmV0dXJuIE4oZSk/ZTp2b2lkIDB9LFo9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP0IoaltlXSk6altlXSYmaltlXVt0XX0sSD1rKHt9LmlzUHJvdG90eXBlT2YpLEc9WigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIiLFY9cyxYPUcsWT1WLnByb2Nlc3MsSz1WLkRlbm8sJD1ZJiZZLnZlcnNpb25zfHxLJiZLLnZlcnNpb24sUT0kJiYkLnY4O1EmJihnPShiPVEuc3BsaXQoIi4iKSlbMF0+MCYmYlswXTw0PzE6KyhiWzBdK2JbMV0pKSwhZyYmWCYmKCEoYj1YLm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8YlsxXT49NzQpJiYoYj1YLm1hdGNoKC9DaHJvbWVcLyhcZCspLykpJiYoZz0rYlsxXSk7dmFyIGVlPWcsdGU9ZWUsbmU9dSxvZT0hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJiFuZSgoZnVuY3Rpb24oKXt2YXIgZT1TeW1ib2woKTtyZXR1cm4hU3RyaW5nKGUpfHwhKE9iamVjdChlKWluc3RhbmNlb2YgU3ltYm9sKXx8IVN5bWJvbC5zaGFtJiZ0ZSYmdGU8NDF9KSkscmU9b2UmJiFTeW1ib2wuc2hhbSYmInN5bWJvbCI9PXQoU3ltYm9sLml0ZXJhdG9yKSxpZT1aLHNlPU0sYWU9SCx1ZT1yZSxjZT1zLk9iamVjdCxsZT11ZT9mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dChlKX06ZnVuY3Rpb24oZSl7dmFyIHQ9aWUoIlN5bWJvbCIpO3JldHVybiBzZSh0KSYmYWUodC5wcm90b3R5cGUsY2UoZSkpfSxkZT1zLlN0cmluZyxmZT1mdW5jdGlvbihlKXt0cnl7cmV0dXJuIGRlKGUpfWNhdGNoKGUpe3JldHVybiJPYmplY3QifX0saGU9TSxwZT1mZSx2ZT1zLlR5cGVFcnJvcixiZT1mdW5jdGlvbihlKXtpZihoZShlKSlyZXR1cm4gZTt0aHJvdyB2ZShwZShlKSsiIGlzIG5vdCBhIGZ1bmN0aW9uIil9LGdlPWJlLG1lPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZVt0XTtyZXR1cm4gbnVsbD09bj92b2lkIDA6Z2Uobil9LHllPWQsX2U9TSx3ZT1KLENlPXMuVHlwZUVycm9yLGtlPXtleHBvcnRzOnt9fSxTZT1zLFJlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxxZT1mdW5jdGlvbihlLHQpe3RyeXtSZShTZSxlLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pfWNhdGNoKG4pe1NlW2VdPXR9cmV0dXJuIHR9LEllPXFlLFBlPSJfX2NvcmUtanNfc2hhcmVkX18iLEVlPXNbUGVdfHxJZShQZSx7fSksT2U9RWU7KGtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2VbZV18fChPZVtlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4xOS4xIixtb2RlOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAyMSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSJ9KTt2YXIgVGU9RCx6ZT1zLk9iamVjdCxBZT1mdW5jdGlvbihlKXtyZXR1cm4gemUoVGUoZSkpfSxVZT1BZSxEZT1rKHt9Lmhhc093blByb3BlcnR5KSx4ZT1PYmplY3QuaGFzT3dufHxmdW5jdGlvbihlLHQpe3JldHVybiBEZShVZShlKSx0KX0sV2U9ayxGZT0wLE1lPU1hdGgucmFuZG9tKCksTGU9V2UoMS4udG9TdHJpbmcpLEplPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIisodm9pZCAwPT09ZT8iIjplKSsiKV8iK0xlKCsrRmUrTWUsMzYpfSxqZT1zLE5lPWtlLmV4cG9ydHMsQmU9eGUsWmU9SmUsSGU9b2UsR2U9cmUsVmU9TmUoIndrcyIpLFhlPWplLlN5bWJvbCxZZT1YZSYmWGUuZm9yLEtlPUdlP1hlOlhlJiZYZS53aXRob3V0U2V0dGVyfHxaZSwkZT1mdW5jdGlvbihlKXtpZighQmUoVmUsZSl8fCFIZSYmInN0cmluZyIhPXR5cGVvZiBWZVtlXSl7dmFyIHQ9IlN5bWJvbC4iK2U7SGUmJkJlKFhlLGUpP1ZlW2VdPVhlW2VdOlZlW2VdPUdlJiZZZT9ZZSh0KTpLZSh0KX1yZXR1cm4gVmVbZV19LFFlPWQsZXQ9Six0dD1sZSxudD1tZSxvdD1mdW5jdGlvbihlLHQpe3ZhciBuLG87aWYoInN0cmluZyI9PT10JiZfZShuPWUudG9TdHJpbmcpJiYhd2Uobz15ZShuLGUpKSlyZXR1cm4gbztpZihfZShuPWUudmFsdWVPZikmJiF3ZShvPXllKG4sZSkpKXJldHVybiBvO2lmKCJzdHJpbmciIT09dCYmX2Uobj1lLnRvU3RyaW5nKSYmIXdlKG89eWUobixlKSkpcmV0dXJuIG87dGhyb3cgQ2UoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfSxydD0kZSxpdD1zLlR5cGVFcnJvcixzdD1ydCgidG9QcmltaXRpdmUiKSxhdD1mdW5jdGlvbihlLHQpe2lmKCFldChlKXx8dHQoZSkpcmV0dXJuIGU7dmFyIG4sbz1udChlLHN0KTtpZihvKXtpZih2b2lkIDA9PT10JiYodD0iZGVmYXVsdCIpLG49UWUobyxlLHQpLCFldChuKXx8dHQobikpcmV0dXJuIG47dGhyb3cgaXQoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT10JiYodD0ibnVtYmVyIiksb3QoZSx0KX0sdXQ9bGUsY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9YXQoZSwic3RyaW5nIik7cmV0dXJuIHV0KHQpP3Q6dCsiIn0sbHQ9SixkdD1zLmRvY3VtZW50LGZ0PWx0KGR0KSYmbHQoZHQuY3JlYXRlRWxlbWVudCksaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ0P2R0LmNyZWF0ZUVsZW1lbnQoZSk6e319LHB0PWh0LHZ0PSFjJiYhdSgoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHB0KCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSksYnQ9YyxndD1kLG10PWYseXQ9bSxfdD1GLHd0PWN0LEN0PXhlLGt0PXZ0LFN0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7YS5mPWJ0P1N0OmZ1bmN0aW9uKGUsdCl7aWYoZT1fdChlKSx0PXd0KHQpLGt0KXRyeXtyZXR1cm4gU3QoZSx0KX1jYXRjaChlKXt9aWYoQ3QoZSx0KSlyZXR1cm4geXQoIWd0KG10LmYsZSx0KSxlW3RdKX07dmFyIFJ0PXt9LHF0PXMsSXQ9SixQdD1xdC5TdHJpbmcsRXQ9cXQuVHlwZUVycm9yLE90PWZ1bmN0aW9uKGUpe2lmKEl0KGUpKXJldHVybiBlO3Rocm93IEV0KFB0KGUpKyIgaXMgbm90IGFuIG9iamVjdCIpfSxUdD1jLHp0PXZ0LEF0PU90LFV0PWN0LER0PXMuVHlwZUVycm9yLHh0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtSdC5mPVR0P3h0OmZ1bmN0aW9uKGUsdCxuKXtpZihBdChlKSx0PVV0KHQpLEF0KG4pLHp0KXRyeXtyZXR1cm4geHQoZSx0LG4pfWNhdGNoKGUpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBEdCgiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4idmFsdWUiaW4gbiYmKGVbdF09bi52YWx1ZSksZX07dmFyIFd0PVJ0LEZ0PW0sTXQ9Yz9mdW5jdGlvbihlLHQsbil7cmV0dXJuIFd0LmYoZSx0LEZ0KDEsbikpfTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbdF09bixlfSxMdD17ZXhwb3J0czp7fX0sSnQ9TSxqdD1FZSxOdD1rKEZ1bmN0aW9uLnRvU3RyaW5nKTtKdChqdC5pbnNwZWN0U291cmNlKXx8KGp0Lmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIE50KGUpfSk7dmFyIEJ0LFp0LEh0LEd0PWp0Lmluc3BlY3RTb3VyY2UsVnQ9TSxYdD1HdCxZdD1zLldlYWtNYXAsS3Q9VnQoWXQpJiYvbmF0aXZlIGNvZGUvLnRlc3QoWHQoWXQpKSwkdD1rZS5leHBvcnRzLFF0PUplLGVuPSR0KCJrZXlzIiksdG49ZnVuY3Rpb24oZSl7cmV0dXJuIGVuW2VdfHwoZW5bZV09UXQoZSkpfSxubj17fSxvbj1LdCxybj1zLHNuPWssYW49Six1bj1NdCxjbj14ZSxsbj1FZSxkbj10bixmbj1ubixobj0iT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQiLHBuPXJuLlR5cGVFcnJvcix2bj1ybi5XZWFrTWFwO2lmKG9ufHxsbi5zdGF0ZSl7dmFyIGJuPWxuLnN0YXRlfHwobG4uc3RhdGU9bmV3IHZuKSxnbj1zbihibi5nZXQpLG1uPXNuKGJuLmhhcykseW49c24oYm4uc2V0KTtCdD1mdW5jdGlvbihlLHQpe2lmKG1uKGJuLGUpKXRocm93IG5ldyBwbihobik7cmV0dXJuIHQuZmFjYWRlPWUseW4oYm4sZSx0KSx0fSxadD1mdW5jdGlvbihlKXtyZXR1cm4gZ24oYm4sZSl8fHt9fSxIdD1mdW5jdGlvbihlKXtyZXR1cm4gbW4oYm4sZSl9fWVsc2V7dmFyIF9uPWRuKCJzdGF0ZSIpO2ZuW19uXT0hMCxCdD1mdW5jdGlvbihlLHQpe2lmKGNuKGUsX24pKXRocm93IG5ldyBwbihobik7cmV0dXJuIHQuZmFjYWRlPWUsdW4oZSxfbix0KSx0fSxadD1mdW5jdGlvbihlKXtyZXR1cm4gY24oZSxfbik/ZVtfbl06e319LEh0PWZ1bmN0aW9uKGUpe3JldHVybiBjbihlLF9uKX19dmFyIHduPXtzZXQ6QnQsZ2V0Olp0LGhhczpIdCxlbmZvcmNlOmZ1bmN0aW9uKGUpe3JldHVybiBIdChlKT9adChlKTpCdChlLHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbjtpZighYW4odCl8fChuPVp0KHQpKS50eXBlIT09ZSl0aHJvdyBwbigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK2UrIiByZXF1aXJlZCIpO3JldHVybiBufX19LENuPWMsa249eGUsU249RnVuY3Rpb24ucHJvdG90eXBlLFJuPUNuJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHFuPWtuKFNuLCJuYW1lIiksSW49e0VYSVNUUzpxbixQUk9QRVI6cW4mJiJzb21ldGhpbmciPT09ZnVuY3Rpb24oKXt9Lm5hbWUsQ09ORklHVVJBQkxFOnFuJiYoIUNufHxDbiYmUm4oU24sIm5hbWUiKS5jb25maWd1cmFibGUpfSxQbj1zLEVuPU0sT249eGUsVG49TXQsem49cWUsQW49R3QsVW49SW4uQ09ORklHVVJBQkxFLERuPXduLmdldCx4bj13bi5lbmZvcmNlLFduPVN0cmluZyhTdHJpbmcpLnNwbGl0KCJTdHJpbmciKTsoTHQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXt2YXIgcixpPSEhbyYmISFvLnVuc2FmZSxzPSEhbyYmISFvLmVudW1lcmFibGUsYT0hIW8mJiEhby5ub1RhcmdldEdldCx1PW8mJnZvaWQgMCE9PW8ubmFtZT9vLm5hbWU6dDtFbihuKSYmKCJTeW1ib2woIj09PVN0cmluZyh1KS5zbGljZSgwLDcpJiYodT0iWyIrU3RyaW5nKHUpLnJlcGxhY2UoL15TeW1ib2xcKChbXildKilcKS8sIiQxIikrIl0iKSwoIU9uKG4sIm5hbWUiKXx8VW4mJm4ubmFtZSE9PXUpJiZUbihuLCJuYW1lIix1KSwocj14bihuKSkuc291cmNlfHwoci5zb3VyY2U9V24uam9pbigic3RyaW5nIj09dHlwZW9mIHU/dToiIikpKSxlIT09UG4/KGk/IWEmJmVbdF0mJihzPSEwKTpkZWxldGUgZVt0XSxzP2VbdF09bjpUbihlLHQsbikpOnM/ZVt0XT1uOnpuKHQsbil9KShGdW5jdGlvbi5wcm90b3R5cGUsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4gRW4odGhpcykmJkRuKHRoaXMpLnNvdXJjZXx8QW4odGhpcyl9KSk7dmFyIEZuPXt9LE1uPU1hdGguY2VpbCxMbj1NYXRoLmZsb29yLEpuPWZ1bmN0aW9uKGUpe3ZhciB0PStlO3JldHVybiB0IT10fHwwPT09dD8wOih0PjA/TG46TW4pKHQpfSxqbj1KbixObj1NYXRoLm1heCxCbj1NYXRoLm1pbixabj1KbixIbj1NYXRoLm1pbixHbj1mdW5jdGlvbihlKXtyZXR1cm4gZT4wP0huKFpuKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9LFZuPWZ1bmN0aW9uKGUpe3JldHVybiBHbihlLmxlbmd0aCl9LFhuPUYsWW49ZnVuY3Rpb24oZSx0KXt2YXIgbj1qbihlKTtyZXR1cm4gbjwwP05uKG4rdCwwKTpCbihuLHQpfSxLbj1Wbiwkbj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLG8pe3ZhciByLGk9WG4odCkscz1LbihpKSxhPVluKG8scyk7aWYoZSYmbiE9bil7Zm9yKDtzPmE7KWlmKChyPWlbYSsrXSkhPXIpcmV0dXJuITB9ZWxzZSBmb3IoO3M+YTthKyspaWYoKGV8fGEgaW4gaSkmJmlbYV09PT1uKXJldHVybiBlfHxhfHwwO3JldHVybiFlJiYtMX19LFFuPXtpbmNsdWRlczokbighMCksaW5kZXhPZjokbighMSl9LGVvPXhlLHRvPUYsbm89UW4uaW5kZXhPZixvbz1ubixybz1rKFtdLnB1c2gpLGlvPWZ1bmN0aW9uKGUsdCl7dmFyIG4sbz10byhlKSxyPTAsaT1bXTtmb3IobiBpbiBvKSFlbyhvbyxuKSYmZW8obyxuKSYmcm8oaSxuKTtmb3IoO3QubGVuZ3RoPnI7KWVvKG8sbj10W3IrK10pJiYofm5vKGksbil8fHJvKGksbikpO3JldHVybiBpfSxzbz1bImNvbnN0cnVjdG9yIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b0xvY2FsZVN0cmluZyIsInRvU3RyaW5nIiwidmFsdWVPZiJdLGFvPWlvLHVvPXNvLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7Rm4uZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24oZSl7cmV0dXJuIGFvKGUsdW8pfTt2YXIgY289e307Y28uZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO3ZhciBsbz1aLGZvPUZuLGhvPWNvLHBvPU90LHZvPWsoW10uY29uY2F0KSxibz1sbygiUmVmbGVjdCIsIm93bktleXMiKXx8ZnVuY3Rpb24oZSl7dmFyIHQ9Zm8uZihwbyhlKSksbj1oby5mO3JldHVybiBuP3ZvKHQsbihlKSk6dH0sZ289eGUsbW89Ym8seW89YSxfbz1SdCx3bz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1tbyh0KSxvPV9vLmYscj15by5mLGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHM9bltpXTtnbyhlLHMpfHxvKGUscyxyKHQscykpfX0sQ289dSxrbz1NLFNvPS8jfFwucHJvdG90eXBlXC4vLFJvPWZ1bmN0aW9uKGUsdCl7dmFyIG49SW9bcW8oZSldO3JldHVybiBuPT1Fb3x8biE9UG8mJihrbyh0KT9Dbyh0KTohIXQpfSxxbz1Sby5ub3JtYWxpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZyhlKS5yZXBsYWNlKFNvLCIuIikudG9Mb3dlckNhc2UoKX0sSW89Um8uZGF0YT17fSxQbz1Sby5OQVRJVkU9Ik4iLEVvPVJvLlBPTFlGSUxMPSJQIixPbz1SbyxUbz1zLHpvPWEuZixBbz1NdCxVbz1MdC5leHBvcnRzLERvPXFlLHhvPXdvLFdvPU9vLEZvPWZ1bmN0aW9uKGUsbil7dmFyIG8scixpLHMsYSx1PWUudGFyZ2V0LGM9ZS5nbG9iYWwsbD1lLnN0YXQ7aWYobz1jP1RvOmw/VG9bdV18fERvKHUse30pOihUb1t1XXx8e30pLnByb3RvdHlwZSlmb3IociBpbiBuKXtpZihzPW5bcl0saT1lLm5vVGFyZ2V0R2V0PyhhPXpvKG8scikpJiZhLnZhbHVlOm9bcl0sIVdvKGM/cjp1KyhsPyIuIjoiIyIpK3IsZS5mb3JjZWQpJiZ2b2lkIDAhPT1pKXtpZih0KHMpPT10KGkpKWNvbnRpbnVlO3hvKHMsaSl9KGUuc2hhbXx8aSYmaS5zaGFtKSYmQW8ocywic2hhbSIsITApLFVvKG8scixzLGUpfX0sTW89aW8sTG89c28sSm89T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3JldHVybiBNbyhlLExvKX0sam89YyxObz1rLEJvPWQsWm89dSxIbz1KbyxHbz1jbyxWbz1mLFhvPUFlLFlvPUEsS289T2JqZWN0LmFzc2lnbiwkbz1PYmplY3QuZGVmaW5lUHJvcGVydHksUW89Tm8oW10uY29uY2F0KSxlcj0hS298fFpvKChmdW5jdGlvbigpe2lmKGpvJiYxIT09S28oe2I6MX0sS28oJG8oe30sImEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpeyRvKHRoaXMsImIiLHt2YWx1ZTozLGVudW1lcmFibGU6ITF9KX19KSx7YjoyfSkpLmIpcmV0dXJuITA7dmFyIGU9e30sdD17fSxuPVN5bWJvbCgpLG89ImFiY2RlZmdoaWprbG1ub3BxcnN0IjtyZXR1cm4gZVtuXT03LG8uc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZV09ZX0pKSw3IT1Lbyh7fSxlKVtuXXx8SG8oS28oe30sdCkpLmpvaW4oIiIpIT1vfSkpP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVhvKGUpLG89YXJndW1lbnRzLmxlbmd0aCxyPTEsaT1Hby5mLHM9Vm8uZjtvPnI7KWZvcih2YXIgYSx1PVlvKGFyZ3VtZW50c1tyKytdKSxjPWk/UW8oSG8odSksaSh1KSk6SG8odSksbD1jLmxlbmd0aCxkPTA7bD5kOylhPWNbZCsrXSxqbyYmIUJvKHMsdSxhKXx8KG5bYV09dVthXSk7cmV0dXJuIG59OktvLHRyPWVyO0ZvKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PXRyfSx7YXNzaWduOnRyfSk7dmFyIG5yPXM7bnIuT2JqZWN0LmFzc2lnbjt2YXIgb3IscnI9IXUoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5wcm90b3R5cGUuY29uc3RydWN0b3I9bnVsbCxPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IGUpIT09ZS5wcm90b3R5cGV9KSksaXI9cyxzcj14ZSxhcj1NLHVyPUFlLGNyPXJyLGxyPXRuKCJJRV9QUk9UTyIpLGRyPWlyLk9iamVjdCxmcj1kci5wcm90b3R5cGUsaHI9Y3I/ZHIuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9dXIoZSk7aWYoc3IodCxscikpcmV0dXJuIHRbbHJdO3ZhciBuPXQuY29uc3RydWN0b3I7cmV0dXJuIGFyKG4pJiZ0IGluc3RhbmNlb2Ygbj9uLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgZHI/ZnI6bnVsbH0scHI9cyx2cj1NLGJyPXByLlN0cmluZyxncj1wci5UeXBlRXJyb3IsbXI9ayx5cj1PdCxfcj1mdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dChlKXx8dnIoZSkpcmV0dXJuIGU7dGhyb3cgZ3IoIkNhbid0IHNldCAiK2JyKGUpKyIgYXMgYSBwcm90b3R5cGUiKX0sd3I9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIGUsdD0hMSxuPXt9O3RyeXsoZT1tcihPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLnNldCkpKG4sW10pLHQ9biBpbnN0YW5jZW9mIEFycmF5fWNhdGNoKGUpe31yZXR1cm4gZnVuY3Rpb24obixvKXtyZXR1cm4geXIobiksX3IobyksdD9lKG4sbyk6bi5fX3Byb3RvX189byxufX0oKTp2b2lkIDApLENyPVJ0LGtyPU90LFNyPUYsUnI9Sm8scXI9Yz9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbihlLHQpe2tyKGUpO2Zvcih2YXIgbixvPVNyKHQpLHI9UnIodCksaT1yLmxlbmd0aCxzPTA7aT5zOylDci5mKGUsbj1yW3MrK10sb1tuXSk7cmV0dXJuIGV9LElyPVooImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiksUHI9T3QsRXI9cXIsT3I9c28sVHI9bm4senI9SXIsQXI9aHQsVXI9dG4oIklFX1BST1RPIiksRHI9ZnVuY3Rpb24oKXt9LHhyPWZ1bmN0aW9uKGUpe3JldHVybiI8c2NyaXB0PiIrZSsiPC8iKyJzY3JpcHQ+In0sV3I9ZnVuY3Rpb24oZSl7ZS53cml0ZSh4cigiIikpLGUuY2xvc2UoKTt2YXIgdD1lLnBhcmVudFdpbmRvdy5PYmplY3Q7cmV0dXJuIGU9bnVsbCx0fSxGcj1mdW5jdGlvbigpe3RyeXtvcj1uZXcgQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKX1jYXRjaChlKXt9dmFyIGUsdDtGcj0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmRvbWFpbiYmb3I/V3Iob3IpOigodD1BcigiaWZyYW1lIikpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHpyLmFwcGVuZENoaWxkKHQpLHQuc3JjPVN0cmluZygiamF2YXNjcmlwdDoiKSwoZT10LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSxlLndyaXRlKHhyKCJkb2N1bWVudC5GPU9iamVjdCIpKSxlLmNsb3NlKCksZS5GKTpXcihvcik7Zm9yKHZhciBuPU9yLmxlbmd0aDtuLS07KWRlbGV0ZSBGci5wcm90b3R5cGVbT3Jbbl1dO3JldHVybiBGcigpfTtUcltVcl09ITA7dmFyIE1yPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG51bGwhPT1lPyhEci5wcm90b3R5cGU9UHIoZSksbj1uZXcgRHIsRHIucHJvdG90eXBlPW51bGwsbltVcl09ZSk6bj1GcigpLHZvaWQgMD09PXQ/bjpFcihuLHQpfSxMcj1rKFtdLnNsaWNlKSxKcj1rLGpyPUxyLE5yPUpyKCIiLnJlcGxhY2UpLEJyPUpyKCIiLnNwbGl0KSxacj1KcihbXS5qb2luKSxIcj1TdHJpbmcoRXJyb3IoInp4Y2FzZCIpLnN0YWNrKSxHcj0vXG5ccyphdCBbXjpdKjpbXlxuXSovLFZyPUdyLnRlc3QoSHIpLFhyPS9AW15cbl0qXG4vLnRlc3QoSHIpJiYhL3p4Y2FzZC8udGVzdChIciksWXI9SixLcj1NdCwkcj1iZSxRcj1rKGsuYmluZCksZWk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJHIoZSksdm9pZCAwPT09dD9lOlFyP1FyKGUsdCk6ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx0aT17fSxuaT10aSxvaT0kZSgiaXRlcmF0b3IiKSxyaT1BcnJheS5wcm90b3R5cGUsaWk9e307aWlbJGUoInRvU3RyaW5nVGFnIildPSJ6Ijt2YXIgc2k9IltvYmplY3Qgel0iPT09U3RyaW5nKGlpKSxhaT1zLHVpPXNpLGNpPU0sbGk9SSxkaT0kZSgidG9TdHJpbmdUYWciKSxmaT1haS5PYmplY3QsaGk9IkFyZ3VtZW50cyI9PWxpKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSkscGk9dWk/bGk6ZnVuY3Rpb24oZSl7dmFyIHQsbixvO3JldHVybiB2b2lkIDA9PT1lPyJVbmRlZmluZWQiOm51bGw9PT1lPyJOdWxsIjoic3RyaW5nIj09dHlwZW9mKG49ZnVuY3Rpb24oZSx0KXt0cnl7cmV0dXJuIGVbdF19Y2F0Y2goZSl7fX0odD1maShlKSxkaSkpP246aGk/bGkodCk6Ik9iamVjdCI9PShvPWxpKHQpKSYmY2kodC5jYWxsZWUpPyJBcmd1bWVudHMiOm99LHZpPXBpLGJpPW1lLGdpPXRpLG1pPSRlKCJpdGVyYXRvciIpLHlpPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUpcmV0dXJuIGJpKGUsbWkpfHxiaShlLCJAQGl0ZXJhdG9yIil8fGdpW3ZpKGUpXX0sX2k9ZCx3aT1iZSxDaT1PdCxraT1mZSxTaT15aSxSaT1zLlR5cGVFcnJvcixxaT1kLElpPU90LFBpPW1lLEVpPWVpLE9pPWQsVGk9T3Qsemk9ZmUsQWk9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJihuaS5BcnJheT09PWV8fHJpW29pXT09PWUpfSxVaT1WbixEaT1ILHhpPWZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwyP1NpKGUpOnQ7aWYod2kobikpcmV0dXJuIENpKF9pKG4sZSkpO3Rocm93IFJpKGtpKGUpKyIgaXMgbm90IGl0ZXJhYmxlIil9LFdpPXlpLEZpPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbyxyO0lpKGUpO3RyeXtpZighKG89UGkoZSwicmV0dXJuIikpKXtpZigidGhyb3ciPT09dCl0aHJvdyBuO3JldHVybiBufW89cWkobyxlKX1jYXRjaChlKXtyPSEwLG89ZX1pZigidGhyb3ciPT09dCl0aHJvdyBuO2lmKHIpdGhyb3cgbztyZXR1cm4gSWkobyksbn0sTWk9cy5UeXBlRXJyb3IsTGk9ZnVuY3Rpb24oZSx0KXt0aGlzLnN0b3BwZWQ9ZSx0aGlzLnJlc3VsdD10fSxKaT1MaS5wcm90b3R5cGUsamk9ZnVuY3Rpb24oZSxuLG8pe3ZhciByLGkscyxhLHUsYyxsLGQ9byYmby50aGF0LGY9ISghb3x8IW8uQVNfRU5UUklFUyksaD0hKCFvfHwhby5JU19JVEVSQVRPUikscD0hKCFvfHwhby5JTlRFUlJVUFRFRCksdj1FaShuLGQpLGI9ZnVuY3Rpb24oZSl7cmV0dXJuIHImJkZpKHIsIm5vcm1hbCIsZSksbmV3IExpKCEwLGUpfSxnPWZ1bmN0aW9uKGUpe3JldHVybiBmPyhUaShlKSxwP3YoZVswXSxlWzFdLGIpOnYoZVswXSxlWzFdKSk6cD92KGUsYik6dihlKX07aWYoaClyPWU7ZWxzZXtpZighKGk9V2koZSkpKXRocm93IE1pKHppKGUpKyIgaXMgbm90IGl0ZXJhYmxlIik7aWYoQWkoaSkpe2ZvcihzPTAsYT1VaShlKTthPnM7cysrKWlmKCh1PWcoZVtzXSkpJiZEaShKaSx1KSlyZXR1cm4gdTtyZXR1cm4gbmV3IExpKCExKX1yPXhpKGUsaSl9Zm9yKGM9ci5uZXh0OyEobD1PaShjLHIpKS5kb25lOyl7dHJ5e3U9ZyhsLnZhbHVlKX1jYXRjaChlKXtGaShyLCJ0aHJvdyIsZSl9aWYoIm9iamVjdCI9PXQodSkmJnUmJkRpKEppLHUpKXJldHVybiB1fXJldHVybiBuZXcgTGkoITEpfSxOaT1waSxCaT1zLlN0cmluZyxaaT1mdW5jdGlvbihlKXtpZigiU3ltYm9sIj09PU5pKGUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmciKTtyZXR1cm4gQmkoZSl9LEhpPVppLEdpPW0sVmk9IXUoKGZ1bmN0aW9uKCl7dmFyIGU9RXJyb3IoImEiKTtyZXR1cm4hKCJzdGFjayJpbiBlKXx8KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdGFjayIsR2koMSw3KSksNyE9PWUuc3RhY2spfSkpLFhpPUZvLFlpPXMsS2k9SCwkaT1ocixRaT13cixlcz13byx0cz1Ncixucz1NdCxvcz1tLHJzPWZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO2lmKFZyKWZvcig7dC0tOyllPU5yKGUsR3IsIiIpO2Vsc2UgaWYoWHIpcmV0dXJuIFpyKGpyKEJyKGUsIlxuIiksdCksIlxuIik7cmV0dXJuIGV9LGlzPWZ1bmN0aW9uKGUsdCl7WXIodCkmJiJjYXVzZSJpbiB0JiZLcihlLCJjYXVzZSIsdC5jYXVzZSl9LHNzPWppLGFzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWU/YXJndW1lbnRzLmxlbmd0aDwyPyIiOnQ6SGkoZSl9LHVzPVZpLGNzPSRlKCJ0b1N0cmluZ1RhZyIpLGxzPVlpLkVycm9yLGRzPVtdLnB1c2gsZnM9ZnVuY3Rpb24oZSx0KXt2YXIgbixvPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLHI9S2koaHMsdGhpcyk7UWk/bj1RaShuZXcgbHModm9pZCAwKSxyPyRpKHRoaXMpOmhzKToobj1yP3RoaXM6dHMoaHMpLG5zKG4sY3MsIkVycm9yIikpLG5zKG4sIm1lc3NhZ2UiLGFzKHQsIiIpKSx1cyYmbnMobiwic3RhY2siLHJzKG4uc3RhY2ssMSkpLGlzKG4sbyk7dmFyIGk9W107cmV0dXJuIHNzKGUsZHMse3RoYXQ6aX0pLG5zKG4sImVycm9ycyIsaSksbn07UWk/UWkoZnMsbHMpOmVzKGZzLGxzKTt2YXIgaHM9ZnMucHJvdG90eXBlPXRzKGxzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6b3MoMSxmcyksbWVzc2FnZTpvcygxLCIiKSxuYW1lOm9zKDEsIkFnZ3JlZ2F0ZUVycm9yIil9KTtYaSh7Z2xvYmFsOiEwfSx7QWdncmVnYXRlRXJyb3I6ZnN9KTt2YXIgcHM9TXIsdnM9UnQsYnM9JGUoInVuc2NvcGFibGVzIiksZ3M9QXJyYXkucHJvdG90eXBlO251bGw9PWdzW2JzXSYmdnMuZihncyxicyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnBzKG51bGwpfSk7dmFyIG1zLHlzLF9zLHdzPXUsQ3M9TSxrcz1ocixTcz1MdC5leHBvcnRzLFJzPSRlKCJpdGVyYXRvciIpLHFzPSExO1tdLmtleXMmJigibmV4dCJpbihfcz1bXS5rZXlzKCkpPyh5cz1rcyhrcyhfcykpKSE9PU9iamVjdC5wcm90b3R5cGUmJihtcz15cyk6cXM9ITApO3ZhciBJcz1udWxsPT1tc3x8d3MoKGZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIG1zW1JzXS5jYWxsKGUpIT09ZX0pKTtJcyYmKG1zPXt9KSxDcyhtc1tSc10pfHxTcyhtcyxScywoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKTt2YXIgUHM9e0l0ZXJhdG9yUHJvdG90eXBlOm1zLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6cXN9LEVzPVJ0LmYsT3M9eGUsVHM9JGUoInRvU3RyaW5nVGFnIiksenM9ZnVuY3Rpb24oZSx0LG4pe2UmJiFPcyhlPW4/ZTplLnByb3RvdHlwZSxUcykmJkVzKGUsVHMse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTp0fSl9LEFzPVBzLkl0ZXJhdG9yUHJvdG90eXBlLFVzPU1yLERzPW0seHM9enMsV3M9dGksRnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sTXM9Rm8sTHM9ZCxKcz1Jbixqcz1NLE5zPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz10KyIgSXRlcmF0b3IiO3JldHVybiBlLnByb3RvdHlwZT1VcyhBcyx7bmV4dDpEcygxLG4pfSkseHMoZSxvLCExKSxXc1tvXT1GcyxlfSxCcz1ocixacz13cixIcz16cyxHcz1NdCxWcz1MdC5leHBvcnRzLFhzPXRpLFlzPUpzLlBST1BFUixLcz1Kcy5DT05GSUdVUkFCTEUsJHM9UHMuSXRlcmF0b3JQcm90b3R5cGUsUXM9UHMuQlVHR1lfU0FGQVJJX0lURVJBVE9SUyxlYT0kZSgiaXRlcmF0b3IiKSx0YT0ia2V5cyIsbmE9InZhbHVlcyIsb2E9ImVudHJpZXMiLHJhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGlhPWZ1bmN0aW9uKGUsdCxuLG8scixpLHMpe05zKG4sdCxvKTt2YXIgYSx1LGMsbD1mdW5jdGlvbihlKXtpZihlPT09ciYmdilyZXR1cm4gdjtpZighUXMmJmUgaW4gaClyZXR1cm4gaFtlXTtzd2l0Y2goZSl7Y2FzZSB0YTpjYXNlIG5hOmNhc2Ugb2E6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzKX19LGQ9dCsiIEl0ZXJhdG9yIixmPSExLGg9ZS5wcm90b3R5cGUscD1oW2VhXXx8aFsiQEBpdGVyYXRvciJdfHxyJiZoW3JdLHY9IVFzJiZwfHxsKHIpLGI9IkFycmF5Ij09dCYmaC5lbnRyaWVzfHxwO2lmKGImJihhPUJzKGIuY2FsbChuZXcgZSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJmEubmV4dCYmKEJzKGEpIT09JHMmJihacz9acyhhLCRzKTpqcyhhW2VhXSl8fFZzKGEsZWEscmEpKSxIcyhhLGQsITApKSxZcyYmcj09bmEmJnAmJnAubmFtZSE9PW5hJiYoS3M/R3MoaCwibmFtZSIsbmEpOihmPSEwLHY9ZnVuY3Rpb24oKXtyZXR1cm4gTHMocCx0aGlzKX0pKSxyKWlmKHU9e3ZhbHVlczpsKG5hKSxrZXlzOmk/djpsKHRhKSxlbnRyaWVzOmwob2EpfSxzKWZvcihjIGluIHUpKFFzfHxmfHwhKGMgaW4gaCkpJiZWcyhoLGMsdVtjXSk7ZWxzZSBNcyh7dGFyZ2V0OnQscHJvdG86ITAsZm9yY2VkOlFzfHxmfSx1KTtyZXR1cm4gaFtlYV0hPT12JiZWcyhoLGVhLHYse25hbWU6cn0pLFhzW3RdPXYsdX0sc2E9RixhYT1mdW5jdGlvbihlKXtnc1tic11bZV09ITB9LHVhPXRpLGNhPXduLGxhPWlhLGRhPSJBcnJheSBJdGVyYXRvciIsZmE9Y2Euc2V0LGhhPWNhLmdldHRlckZvcihkYSkscGE9bGEoQXJyYXksIkFycmF5IiwoZnVuY3Rpb24oZSx0KXtmYSh0aGlzLHt0eXBlOmRhLHRhcmdldDpzYShlKSxpbmRleDowLGtpbmQ6dH0pfSksKGZ1bmN0aW9uKCl7dmFyIGU9aGEodGhpcyksdD1lLnRhcmdldCxuPWUua2luZCxvPWUuaW5kZXgrKztyZXR1cm4hdHx8bz49dC5sZW5ndGg/KGUudGFyZ2V0PXZvaWQgMCx7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KToia2V5cyI9PW4/e3ZhbHVlOm8sZG9uZTohMX06InZhbHVlcyI9PW4/e3ZhbHVlOnRbb10sZG9uZTohMX06e3ZhbHVlOltvLHRbb11dLGRvbmU6ITF9fSksInZhbHVlcyIpO3VhLkFyZ3VtZW50cz11YS5BcnJheSxhYSgia2V5cyIpLGFhKCJ2YWx1ZXMiKSxhYSgiZW50cmllcyIpO3ZhciB2YT1waSxiYT1zaT97fS50b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0ICIrdmEodGhpcykrIl0ifSxnYT1zaSxtYT1MdC5leHBvcnRzLHlhPWJhO2dhfHxtYShPYmplY3QucHJvdG90eXBlLCJ0b1N0cmluZyIseWEse3Vuc2FmZTohMH0pO3ZhciBfYT1zLlByb21pc2Usd2E9THQuZXhwb3J0cyxDYT1aLGthPVJ0LFNhPWMsUmE9JGUoInNwZWNpZXMiKSxxYT1ILElhPXMuVHlwZUVycm9yLFBhPSRlKCJpdGVyYXRvciIpLEVhPSExO3RyeXt2YXIgT2E9MCxUYT17bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOiEhT2ErK319LHJldHVybjpmdW5jdGlvbigpe0VhPSEwfX07VGFbUGFdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oVGEsKGZ1bmN0aW9uKCl7dGhyb3cgMn0pKX1jYXRjaChlKXt9dmFyIHphLEFhLFVhLERhLHhhPWssV2E9dSxGYT1NLE1hPXBpLExhPUd0LEphPWZ1bmN0aW9uKCl7fSxqYT1bXSxOYT1aKCJSZWZsZWN0IiwiY29uc3RydWN0IiksQmE9L15ccyooPzpjbGFzc3xmdW5jdGlvbilcYi8sWmE9eGEoQmEuZXhlYyksSGE9IUJhLmV4ZWMoSmEpLEdhPWZ1bmN0aW9uKGUpe2lmKCFGYShlKSlyZXR1cm4hMTt0cnl7cmV0dXJuIE5hKEphLGphLGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX0sVmE9IU5hfHxXYSgoZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gR2EoR2EuY2FsbCl8fCFHYShPYmplY3QpfHwhR2EoKGZ1bmN0aW9uKCl7ZT0hMH0pKXx8ZX0pKT9mdW5jdGlvbihlKXtpZighRmEoZSkpcmV0dXJuITE7c3dpdGNoKE1hKGUpKXtjYXNlIkFzeW5jRnVuY3Rpb24iOmNhc2UiR2VuZXJhdG9yRnVuY3Rpb24iOmNhc2UiQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiI6cmV0dXJuITF9cmV0dXJuIEhhfHwhIVphKEJhLExhKGUpKX06R2EsWGE9VmEsWWE9ZmUsS2E9cy5UeXBlRXJyb3IsJGE9T3QsUWE9ZnVuY3Rpb24oZSl7aWYoWGEoZSkpcmV0dXJuIGU7dGhyb3cgS2EoWWEoZSkrIiBpcyBub3QgYSBjb25zdHJ1Y3RvciIpfSxldT0kZSgic3BlY2llcyIpLHR1PWZ1bmN0aW9uKGUsdCl7dmFyIG4sbz0kYShlKS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09b3x8bnVsbD09KG49JGEobylbZXVdKT90OlFhKG4pfSxudT1GdW5jdGlvbi5wcm90b3R5cGUsb3U9bnUuYXBwbHkscnU9bnUuYmluZCxpdT1udS5jYWxsLHN1PSJvYmplY3QiPT0oInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0PyJ1bmRlZmluZWQiOnQoUmVmbGVjdCkpJiZSZWZsZWN0LmFwcGx5fHwocnU/aXUuYmluZChvdSk6ZnVuY3Rpb24oKXtyZXR1cm4gaXUuYXBwbHkob3UsYXJndW1lbnRzKX0pLGF1PS8oPzppcGFkfGlwaG9uZXxpcG9kKS4qYXBwbGV3ZWJraXQvaS50ZXN0KEcpLHV1PSJwcm9jZXNzIj09SShzLnByb2Nlc3MpLGN1PXMsbHU9c3UsZHU9ZWksZnU9TSxodT14ZSxwdT11LHZ1PUlyLGJ1PUxyLGd1PWh0LG11PWF1LHl1PXV1LF91PWN1LnNldEltbWVkaWF0ZSx3dT1jdS5jbGVhckltbWVkaWF0ZSxDdT1jdS5wcm9jZXNzLGt1PWN1LkRpc3BhdGNoLFN1PWN1LkZ1bmN0aW9uLFJ1PWN1Lk1lc3NhZ2VDaGFubmVsLHF1PWN1LlN0cmluZyxJdT0wLFB1PXt9LEV1PSJvbnJlYWR5c3RhdGVjaGFuZ2UiO3RyeXt6YT1jdS5sb2NhdGlvbn1jYXRjaChlKXt9dmFyIE91PWZ1bmN0aW9uKGUpe2lmKGh1KFB1LGUpKXt2YXIgdD1QdVtlXTtkZWxldGUgUHVbZV0sdCgpfX0sVHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7T3UoZSl9fSx6dT1mdW5jdGlvbihlKXtPdShlLmRhdGEpfSxBdT1mdW5jdGlvbihlKXtjdS5wb3N0TWVzc2FnZShxdShlKSx6YS5wcm90b2NvbCsiLy8iK3phLmhvc3QpfTtfdSYmd3V8fChfdT1mdW5jdGlvbihlKXt2YXIgdD1idShhcmd1bWVudHMsMSk7cmV0dXJuIFB1WysrSXVdPWZ1bmN0aW9uKCl7bHUoZnUoZSk/ZTpTdShlKSx2b2lkIDAsdCl9LEFhKEl1KSxJdX0sd3U9ZnVuY3Rpb24oZSl7ZGVsZXRlIFB1W2VdfSx5dT9BYT1mdW5jdGlvbihlKXtDdS5uZXh0VGljayhUdShlKSl9Omt1JiZrdS5ub3c/QWE9ZnVuY3Rpb24oZSl7a3Uubm93KFR1KGUpKX06UnUmJiFtdT8oRGE9KFVhPW5ldyBSdSkucG9ydDIsVWEucG9ydDEub25tZXNzYWdlPXp1LEFhPWR1KERhLnBvc3RNZXNzYWdlLERhKSk6Y3UuYWRkRXZlbnRMaXN0ZW5lciYmZnUoY3UucG9zdE1lc3NhZ2UpJiYhY3UuaW1wb3J0U2NyaXB0cyYmemEmJiJmaWxlOiIhPT16YS5wcm90b2NvbCYmIXB1KEF1KT8oQWE9QXUsY3UuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsenUsITEpKTpBYT1FdSBpbiBndSgic2NyaXB0Iik/ZnVuY3Rpb24oZSl7dnUuYXBwZW5kQ2hpbGQoZ3UoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt2dS5yZW1vdmVDaGlsZCh0aGlzKSxPdShlKX19OmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoVHUoZSksMCl9KTt2YXIgVXUsRHUseHUsV3UsRnUsTXUsTHUsSnUsanU9e3NldDpfdSxjbGVhcjp3dX0sTnU9cyxCdT0vaXBhZHxpcGhvbmV8aXBvZC9pLnRlc3QoRykmJnZvaWQgMCE9PU51LlBlYmJsZSxadT0vd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KEcpLEh1PXMsR3U9ZWksVnU9YS5mLFh1PWp1LnNldCxZdT1hdSxLdT1CdSwkdT1adSxRdT11dSxlYz1IdS5NdXRhdGlvbk9ic2VydmVyfHxIdS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHRjPUh1LmRvY3VtZW50LG5jPUh1LnByb2Nlc3Msb2M9SHUuUHJvbWlzZSxyYz1WdShIdSwicXVldWVNaWNyb3Rhc2siKSxpYz1yYyYmcmMudmFsdWU7aWN8fChVdT1mdW5jdGlvbigpe3ZhciBlLHQ7Zm9yKFF1JiYoZT1uYy5kb21haW4pJiZlLmV4aXQoKTtEdTspe3Q9RHUuZm4sRHU9RHUubmV4dDt0cnl7dCgpfWNhdGNoKGUpe3Rocm93IER1P1d1KCk6eHU9dm9pZCAwLGV9fXh1PXZvaWQgMCxlJiZlLmVudGVyKCl9LFl1fHxRdXx8JHV8fCFlY3x8IXRjPyFLdSYmb2MmJm9jLnJlc29sdmU/KChMdT1vYy5yZXNvbHZlKHZvaWQgMCkpLmNvbnN0cnVjdG9yPW9jLEp1PUd1KEx1LnRoZW4sTHUpLFd1PWZ1bmN0aW9uKCl7SnUoVXUpfSk6UXU/V3U9ZnVuY3Rpb24oKXtuYy5uZXh0VGljayhVdSl9OihYdT1HdShYdSxIdSksV3U9ZnVuY3Rpb24oKXtYdShVdSl9KTooRnU9ITAsTXU9dGMuY3JlYXRlVGV4dE5vZGUoIiIpLG5ldyBlYyhVdSkub2JzZXJ2ZShNdSx7Y2hhcmFjdGVyRGF0YTohMH0pLFd1PWZ1bmN0aW9uKCl7TXUuZGF0YT1GdT0hRnV9KSk7dmFyIHNjPWljfHxmdW5jdGlvbihlKXt2YXIgdD17Zm46ZSxuZXh0OnZvaWQgMH07eHUmJih4dS5uZXh0PXQpLER1fHwoRHU9dCxXdSgpKSx4dT10fSxhYz17fSx1Yz1iZSxjYz1mdW5jdGlvbihlKXt2YXIgdCxuO3RoaXMucHJvbWlzZT1uZXcgZSgoZnVuY3Rpb24oZSxvKXtpZih2b2lkIDAhPT10fHx2b2lkIDAhPT1uKXRocm93IFR5cGVFcnJvcigiQmFkIFByb21pc2UgY29uc3RydWN0b3IiKTt0PWUsbj1vfSkpLHRoaXMucmVzb2x2ZT11Yyh0KSx0aGlzLnJlamVjdD11YyhuKX07YWMuZj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IGNjKGUpfTt2YXIgbGMsZGMsZmMsaGMscGM9T3QsdmM9SixiYz1hYyxnYz1mdW5jdGlvbihlLHQpe2lmKHBjKGUpLHZjKHQpJiZ0LmNvbnN0cnVjdG9yPT09ZSlyZXR1cm4gdDt2YXIgbj1iYy5mKGUpO3JldHVybigwLG4ucmVzb2x2ZSkodCksbi5wcm9taXNlfSxtYz1zLHljPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm57ZXJyb3I6ITEsdmFsdWU6ZSgpfX1jYXRjaChlKXtyZXR1cm57ZXJyb3I6ITAsdmFsdWU6ZX19fSxfYz0ib2JqZWN0Ij09KCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93PyJ1bmRlZmluZWQiOnQod2luZG93KSksd2M9Rm8sQ2M9cyxrYz1aLFNjPWQsUmM9X2EscWM9THQuZXhwb3J0cyxJYz1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvIGluIHQpd2EoZSxvLHRbb10sbik7cmV0dXJuIGV9LFBjPXdyLEVjPXpzLE9jPWZ1bmN0aW9uKGUpe3ZhciB0PUNhKGUpLG49a2EuZjtTYSYmdCYmIXRbUmFdJiZuKHQsUmEse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX0sVGM9YmUsemM9TSxBYz1KLFVjPWZ1bmN0aW9uKGUsdCl7aWYocWEodCxlKSlyZXR1cm4gZTt0aHJvdyBJYSgiSW5jb3JyZWN0IGludm9jYXRpb24iKX0sRGM9R3QseGM9amksV2M9ZnVuY3Rpb24oZSx0KXtpZighdCYmIUVhKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgbz17fTtvW1BhXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19fX0sZShvKX1jYXRjaChlKXt9cmV0dXJuIG59LEZjPXR1LE1jPWp1LnNldCxMYz1zYyxKYz1nYyxqYz1mdW5jdGlvbihlLHQpe3ZhciBuPW1jLmNvbnNvbGU7biYmbi5lcnJvciYmKDE9PWFyZ3VtZW50cy5sZW5ndGg/bi5lcnJvcihlKTpuLmVycm9yKGUsdCkpfSxOYz1hYyxCYz15YyxaYz13bixIYz1PbyxHYz1fYyxWYz11dSxYYz1lZSxZYz0kZSgic3BlY2llcyIpLEtjPSJQcm9taXNlIiwkYz1aYy5nZXQsUWM9WmMuc2V0LGVsPVpjLmdldHRlckZvcihLYyksdGw9UmMmJlJjLnByb3RvdHlwZSxubD1SYyxvbD10bCxybD1DYy5UeXBlRXJyb3IsaWw9Q2MuZG9jdW1lbnQsc2w9Q2MucHJvY2VzcyxhbD1OYy5mLHVsPWFsLGNsPSEhKGlsJiZpbC5jcmVhdGVFdmVudCYmQ2MuZGlzcGF0Y2hFdmVudCksbGw9emMoQ2MuUHJvbWlzZVJlamVjdGlvbkV2ZW50KSxkbD0idW5oYW5kbGVkcmVqZWN0aW9uIixmbD0hMSxobD1IYyhLYywoZnVuY3Rpb24oKXt2YXIgZT1EYyhubCksdD1lIT09U3RyaW5nKG5sKTtpZighdCYmNjY9PT1YYylyZXR1cm4hMDtpZihYYz49NTEmJi9uYXRpdmUgY29kZS8udGVzdChlKSlyZXR1cm4hMTt2YXIgbj1uZXcgbmwoKGZ1bmN0aW9uKGUpe2UoMSl9KSksbz1mdW5jdGlvbihlKXtlKChmdW5jdGlvbigpe30pLChmdW5jdGlvbigpe30pKX07cmV0dXJuKG4uY29uc3RydWN0b3I9e30pW1ljXT1vLCEoZmw9bi50aGVuKChmdW5jdGlvbigpe30pKWluc3RhbmNlb2Ygbyl8fCF0JiZHYyYmIWxsfSkpLHBsPWhsfHwhV2MoKGZ1bmN0aW9uKGUpe25sLmFsbChlKS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9KSksdmw9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuISghQWMoZSl8fCF6Yyh0PWUudGhlbikpJiZ0fSxibD1mdW5jdGlvbihlLHQpe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciBuPWUucmVhY3Rpb25zO0xjKChmdW5jdGlvbigpe2Zvcih2YXIgbz1lLnZhbHVlLHI9MT09ZS5zdGF0ZSxpPTA7bi5sZW5ndGg+aTspe3ZhciBzLGEsdSxjPW5baSsrXSxsPXI/Yy5vazpjLmZhaWwsZD1jLnJlc29sdmUsZj1jLnJlamVjdCxoPWMuZG9tYWluO3RyeXtsPyhyfHwoMj09PWUucmVqZWN0aW9uJiZfbChlKSxlLnJlamVjdGlvbj0xKSwhMD09PWw/cz1vOihoJiZoLmVudGVyKCkscz1sKG8pLGgmJihoLmV4aXQoKSx1PSEwKSkscz09PWMucHJvbWlzZT9mKHJsKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOihhPXZsKHMpKT9TYyhhLHMsZCxmKTpkKHMpKTpmKG8pfWNhdGNoKGUpe2gmJiF1JiZoLmV4aXQoKSxmKGUpfX1lLnJlYWN0aW9ucz1bXSxlLm5vdGlmaWVkPSExLHQmJiFlLnJlamVjdGlvbiYmbWwoZSl9KSl9fSxnbD1mdW5jdGlvbihlLHQsbil7dmFyIG8scjtjbD8oKG89aWwuY3JlYXRlRXZlbnQoIkV2ZW50IikpLnByb21pc2U9dCxvLnJlYXNvbj1uLG8uaW5pdEV2ZW50KGUsITEsITApLENjLmRpc3BhdGNoRXZlbnQobykpOm89e3Byb21pc2U6dCxyZWFzb246bn0sIWxsJiYocj1DY1sib24iK2VdKT9yKG8pOmU9PT1kbCYmamMoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIsbil9LG1sPWZ1bmN0aW9uKGUpe1NjKE1jLENjLChmdW5jdGlvbigpe3ZhciB0LG49ZS5mYWNhZGUsbz1lLnZhbHVlO2lmKHlsKGUpJiYodD1CYygoZnVuY3Rpb24oKXtWYz9zbC5lbWl0KCJ1bmhhbmRsZWRSZWplY3Rpb24iLG8sbik6Z2woZGwsbixvKX0pKSxlLnJlamVjdGlvbj1WY3x8eWwoZSk/MjoxLHQuZXJyb3IpKXRocm93IHQudmFsdWV9KSl9LHlsPWZ1bmN0aW9uKGUpe3JldHVybiAxIT09ZS5yZWplY3Rpb24mJiFlLnBhcmVudH0sX2w9ZnVuY3Rpb24oZSl7U2MoTWMsQ2MsKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5mYWNhZGU7VmM/c2wuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCk6Z2woInJlamVjdGlvbmhhbmRsZWQiLHQsZS52YWx1ZSl9KSl9LHdsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24obyl7ZSh0LG8sbil9fSxDbD1mdW5jdGlvbihlLHQsbil7ZS5kb25lfHwoZS5kb25lPSEwLG4mJihlPW4pLGUudmFsdWU9dCxlLnN0YXRlPTIsYmwoZSwhMCkpfSxrbD1mdW5jdGlvbiBlKHQsbixvKXtpZighdC5kb25lKXt0LmRvbmU9ITAsbyYmKHQ9byk7dHJ5e2lmKHQuZmFjYWRlPT09bil0aHJvdyBybCgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTt2YXIgcj12bChuKTtyP0xjKChmdW5jdGlvbigpe3ZhciBvPXtkb25lOiExfTt0cnl7U2MocixuLHdsKGUsbyx0KSx3bChDbCxvLHQpKX1jYXRjaChlKXtDbChvLGUsdCl9fSkpOih0LnZhbHVlPW4sdC5zdGF0ZT0xLGJsKHQsITEpKX1jYXRjaChlKXtDbCh7ZG9uZTohMX0sZSx0KX19fTtpZihobCYmKG9sPShubD1mdW5jdGlvbihlKXtVYyh0aGlzLG9sKSxUYyhlKSxTYyhsYyx0aGlzKTt2YXIgdD0kYyh0aGlzKTt0cnl7ZSh3bChrbCx0KSx3bChDbCx0KSl9Y2F0Y2goZSl7Q2wodCxlKX19KS5wcm90b3R5cGUsKGxjPWZ1bmN0aW9uKGUpe1FjKHRoaXMse3R5cGU6S2MsZG9uZTohMSxub3RpZmllZDohMSxwYXJlbnQ6ITEscmVhY3Rpb25zOltdLHJlamVjdGlvbjohMSxzdGF0ZTowLHZhbHVlOnZvaWQgMH0pfSkucHJvdG90eXBlPUljKG9sLHt0aGVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZWwodGhpcyksbz1uLnJlYWN0aW9ucyxyPWFsKEZjKHRoaXMsbmwpKTtyZXR1cm4gci5vaz0hemMoZSl8fGUsci5mYWlsPXpjKHQpJiZ0LHIuZG9tYWluPVZjP3NsLmRvbWFpbjp2b2lkIDAsbi5wYXJlbnQ9ITAsb1tvLmxlbmd0aF09ciwwIT1uLnN0YXRlJiZibChuLCExKSxyLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLGRjPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IGxjLHQ9JGMoZSk7dGhpcy5wcm9taXNlPWUsdGhpcy5yZXNvbHZlPXdsKGtsLHQpLHRoaXMucmVqZWN0PXdsKENsLHQpfSxOYy5mPWFsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09bmx8fGU9PT1mYz9uZXcgZGMoZSk6dWwoZSl9LHpjKFJjKSYmdGwhPT1PYmplY3QucHJvdG90eXBlKSl7aGM9dGwudGhlbixmbHx8KHFjKHRsLCJ0aGVuIiwoZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiBuZXcgbmwoKGZ1bmN0aW9uKGUsdCl7U2MoaGMsbixlLHQpfSkpLnRoZW4oZSx0KX0pLHt1bnNhZmU6ITB9KSxxYyh0bCwiY2F0Y2giLG9sLmNhdGNoLHt1bnNhZmU6ITB9KSk7dHJ5e2RlbGV0ZSB0bC5jb25zdHJ1Y3Rvcn1jYXRjaChlKXt9UGMmJlBjKHRsLG9sKX13Yyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOmhsfSx7UHJvbWlzZTpubH0pLEVjKG5sLEtjLCExKSxPYyhLYyksZmM9a2MoS2MpLHdjKHt0YXJnZXQ6S2Msc3RhdDohMCxmb3JjZWQ6aGx9LHtyZWplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9YWwodGhpcyk7cmV0dXJuIFNjKHQucmVqZWN0LHZvaWQgMCxlKSx0LnByb21pc2V9fSksd2Moe3RhcmdldDpLYyxzdGF0OiEwLGZvcmNlZDpobH0se3Jlc29sdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEpjKHRoaXMsZSl9fSksd2Moe3RhcmdldDpLYyxzdGF0OiEwLGZvcmNlZDpwbH0se2FsbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49YWwodCksbz1uLnJlc29sdmUscj1uLnJlamVjdCxpPUJjKChmdW5jdGlvbigpe3ZhciBuPVRjKHQucmVzb2x2ZSksaT1bXSxzPTAsYT0xO3hjKGUsKGZ1bmN0aW9uKGUpe3ZhciB1PXMrKyxjPSExO2ErKyxTYyhuLHQsZSkudGhlbigoZnVuY3Rpb24oZSl7Y3x8KGM9ITAsaVt1XT1lLC0tYXx8byhpKSl9KSxyKX0pKSwtLWF8fG8oaSl9KSk7cmV0dXJuIGkuZXJyb3ImJnIoaS52YWx1ZSksbi5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1hbCh0KSxvPW4ucmVqZWN0LHI9QmMoKGZ1bmN0aW9uKCl7dmFyIHI9VGModC5yZXNvbHZlKTt4YyhlLChmdW5jdGlvbihlKXtTYyhyLHQsZSkudGhlbihuLnJlc29sdmUsbyl9KSl9KSk7cmV0dXJuIHIuZXJyb3ImJm8oci52YWx1ZSksbi5wcm9taXNlfX0pO3ZhciBTbD1kLFJsPWJlLHFsPWFjLElsPXljLFBsPWppO0ZvKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1xbC5mKHQpLG89bi5yZXNvbHZlLHI9bi5yZWplY3QsaT1JbCgoZnVuY3Rpb24oKXt2YXIgbj1SbCh0LnJlc29sdmUpLHI9W10saT0wLHM9MTtQbChlLChmdW5jdGlvbihlKXt2YXIgYT1pKyssdT0hMTtzKyssU2wobix0LGUpLnRoZW4oKGZ1bmN0aW9uKGUpe3V8fCh1PSEwLHJbYV09e3N0YXR1czoiZnVsZmlsbGVkIix2YWx1ZTplfSwtLXN8fG8ocikpfSksKGZ1bmN0aW9uKGUpe3V8fCh1PSEwLHJbYV09e3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjplfSwtLXN8fG8ocikpfSkpfSkpLC0tc3x8byhyKX0pKTtyZXR1cm4gaS5lcnJvciYmcihpLnZhbHVlKSxuLnByb21pc2V9fSk7dmFyIEVsPWJlLE9sPVosVGw9ZCx6bD1hYyxBbD15YyxVbD1qaSxEbD0iTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiO0ZvKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbnk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPU9sKCJBZ2dyZWdhdGVFcnJvciIpLG89emwuZih0KSxyPW8ucmVzb2x2ZSxpPW8ucmVqZWN0LHM9QWwoKGZ1bmN0aW9uKCl7dmFyIG89RWwodC5yZXNvbHZlKSxzPVtdLGE9MCx1PTEsYz0hMTtVbChlLChmdW5jdGlvbihlKXt2YXIgbD1hKyssZD0hMTt1KyssVGwobyx0LGUpLnRoZW4oKGZ1bmN0aW9uKGUpe2R8fGN8fChjPSEwLHIoZSkpfSksKGZ1bmN0aW9uKGUpe2R8fGN8fChkPSEwLHNbbF09ZSwtLXV8fGkobmV3IG4ocyxEbCkpKX0pKX0pKSwtLXV8fGkobmV3IG4ocyxEbCkpfSkpO3JldHVybiBzLmVycm9yJiZpKHMudmFsdWUpLG8ucHJvbWlzZX19KTt2YXIgeGw9Rm8sV2w9X2EsRmw9dSxNbD1aLExsPU0sSmw9dHUsamw9Z2MsTmw9THQuZXhwb3J0cztpZih4bCh7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohIVdsJiZGbCgoZnVuY3Rpb24oKXtXbC5wcm90b3R5cGUuZmluYWxseS5jYWxsKHt0aGVuOmZ1bmN0aW9uKCl7fX0sKGZ1bmN0aW9uKCl7fSkpfSkpfSx7ZmluYWxseTpmdW5jdGlvbihlKXt2YXIgdD1KbCh0aGlzLE1sKCJQcm9taXNlIikpLG49TGwoZSk7cmV0dXJuIHRoaXMudGhlbihuP2Z1bmN0aW9uKG4pe3JldHVybiBqbCh0LGUoKSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKX06ZSxuP2Z1bmN0aW9uKG4pe3JldHVybiBqbCh0LGUoKSkudGhlbigoZnVuY3Rpb24oKXt0aHJvdyBufSkpfTplKX19KSxMbChXbCkpe3ZhciBCbD1NbCgiUHJvbWlzZSIpLnByb3RvdHlwZS5maW5hbGx5O1dsLnByb3RvdHlwZS5maW5hbGx5IT09QmwmJk5sKFdsLnByb3RvdHlwZSwiZmluYWxseSIsQmwse3Vuc2FmZTohMH0pfXZhciBabD1rLEhsPUpuLEdsPVppLFZsPUQsWGw9WmwoIiIuY2hhckF0KSxZbD1abCgiIi5jaGFyQ29kZUF0KSxLbD1abCgiIi5zbGljZSksJGw9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIG8scixpPUdsKFZsKHQpKSxzPUhsKG4pLGE9aS5sZW5ndGg7cmV0dXJuIHM8MHx8cz49YT9lPyIiOnZvaWQgMDoobz1ZbChpLHMpKTw1NTI5Nnx8bz41NjMxOXx8cysxPT09YXx8KHI9WWwoaSxzKzEpKTw1NjMyMHx8cj41NzM0Mz9lP1hsKGkscyk6bzplP0tsKGkscyxzKzIpOnItNTYzMjArKG8tNTUyOTY8PDEwKSs2NTUzNn19LFFsPXtjb2RlQXQ6JGwoITEpLGNoYXJBdDokbCghMCl9LmNoYXJBdCxlZD1aaSx0ZD13bixuZD1pYSxvZD0iU3RyaW5nIEl0ZXJhdG9yIixyZD10ZC5zZXQsaWQ9dGQuZ2V0dGVyRm9yKG9kKTtuZChTdHJpbmcsIlN0cmluZyIsKGZ1bmN0aW9uKGUpe3JkKHRoaXMse3R5cGU6b2Qsc3RyaW5nOmVkKGUpLGluZGV4OjB9KX0pLChmdW5jdGlvbigpe3ZhciBlLHQ9aWQodGhpcyksbj10LnN0cmluZyxvPXQuaW5kZXg7cmV0dXJuIG8+PW4ubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KGU9UWwobixvKSx0LmluZGV4Kz1lLmxlbmd0aCx7dmFsdWU6ZSxkb25lOiExfSl9KSksbnIuUHJvbWlzZTt2YXIgc2QsYWQ9aHQoInNwYW4iKS5jbGFzc0xpc3QsdWQ9YWQmJmFkLmNvbnN0cnVjdG9yJiZhZC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsY2Q9dWQ9PT1PYmplY3QucHJvdG90eXBlP3ZvaWQgMDp1ZCxsZD1zLGRkPXtDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfSxmZD1jZCxoZD1wYSxwZD1NdCx2ZD0kZSxiZD12ZCgiaXRlcmF0b3IiKSxnZD12ZCgidG9TdHJpbmdUYWciKSxtZD1oZC52YWx1ZXMseWQ9ZnVuY3Rpb24oZSx0KXtpZihlKXtpZihlW2JkXSE9PW1kKXRyeXtwZChlLGJkLG1kKX1jYXRjaCh0KXtlW2JkXT1tZH1pZihlW2dkXXx8cGQoZSxnZCx0KSxkZFt0XSlmb3IodmFyIG4gaW4gaGQpaWYoZVtuXSE9PWhkW25dKXRyeXtwZChlLG4saGRbbl0pfWNhdGNoKHQpe2Vbbl09aGRbbl19fX07Zm9yKHZhciBfZCBpbiBkZCl5ZChsZFtfZF0mJmxkW19kXS5wcm90b3R5cGUsX2QpO3lkKGZkLCJET01Ub2tlbkxpc3QiKTt2YXIgd2Q9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIENkKCl7aWYoIXNkJiYhKHNkPSJ1bmRlZmluZWQiIT10eXBlb2YgY3J5cHRvJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8InVuZGVmaW5lZCIhPXR5cGVvZiBtc0NyeXB0byYmImZ1bmN0aW9uIj09dHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIHNkKHdkKX12YXIga2Q9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIFNkKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYma2QudGVzdChlKX1mb3IodmFyIFJkPVtdLHFkPTA7cWQ8MjU2OysrcWQpUmQucHVzaCgocWQrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBJZChlLHQsbil7dmFyIG89KGU9ZXx8e30pLnJhbmRvbXx8KGUucm5nfHxDZCkoKTtpZihvWzZdPTE1Jm9bNl18NjQsb1s4XT02MyZvWzhdfDEyOCx0KXtuPW58fDA7Zm9yKHZhciByPTA7cjwxNjsrK3IpdFtuK3JdPW9bcl07cmV0dXJuIHR9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLG49KFJkW2VbdCswXV0rUmRbZVt0KzFdXStSZFtlW3QrMl1dK1JkW2VbdCszXV0rIi0iK1JkW2VbdCs0XV0rUmRbZVt0KzVdXSsiLSIrUmRbZVt0KzZdXStSZFtlW3QrN11dKyItIitSZFtlW3QrOF1dK1JkW2VbdCs5XV0rIi0iK1JkW2VbdCsxMF1dK1JkW2VbdCsxMV1dK1JkW2VbdCsxMl1dK1JkW2VbdCsxM11dK1JkW2VbdCsxNF1dK1JkW2VbdCsxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCFTZChuKSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiBufShvKX12YXIgUGQsRWQ9IjMuNy4yIixPZD0iZnVuY3Rpb24iPT10eXBlb2YgYXRvYixUZD0iZnVuY3Rpb24iPT10eXBlb2YgYnRvYSx6ZD0iZnVuY3Rpb24iPT10eXBlb2YgQnVmZmVyLEFkPSJmdW5jdGlvbiI9PXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXI6dm9pZCAwLFVkPSJmdW5jdGlvbiI9PXR5cGVvZiBUZXh0RW5jb2Rlcj9uZXcgVGV4dEVuY29kZXI6dm9pZCAwLERkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIpLHhkPShQZD17fSxEZC5mb3JFYWNoKChmdW5jdGlvbihlLHQpe3JldHVybiBQZFtlXT10fSkpLFBkKSxXZD0vXig/OltBLVphLXpcZCtcL117NH0pKj8oPzpbQS1aYS16XGQrXC9dezJ9KD86PT0pP3xbQS1aYS16XGQrXC9dezN9PT8pPyQvLEZkPVN0cmluZy5mcm9tQ2hhckNvZGUuYmluZChTdHJpbmcpLE1kPSJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LmZyb20/VWludDhBcnJheS5mcm9tLmJpbmQoVWludDhBcnJheSk6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmZ1bmN0aW9uKGUpe3JldHVybiBlfTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSwwKS5tYXAodCkpfSxMZD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1srXC9dL2csKGZ1bmN0aW9uKGUpe3JldHVybiIrIj09ZT8iLSI6Il8ifSkpfSxKZD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9dL2csIiIpfSxqZD1mdW5jdGlvbihlKXtmb3IodmFyIHQsbixvLHIsaT0iIixzPWUubGVuZ3RoJTMsYT0wO2E8ZS5sZW5ndGg7KXtpZigobj1lLmNoYXJDb2RlQXQoYSsrKSk+MjU1fHwobz1lLmNoYXJDb2RlQXQoYSsrKSk+MjU1fHwocj1lLmNoYXJDb2RlQXQoYSsrKSk+MjU1KXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgY2hhcmFjdGVyIGZvdW5kIik7aSs9RGRbKHQ9bjw8MTZ8bzw8OHxyKT4+MTgmNjNdK0RkW3Q+PjEyJjYzXStEZFt0Pj42JjYzXStEZFs2MyZ0XX1yZXR1cm4gcz9pLnNsaWNlKDAscy0zKSsiPT09Ii5zdWJzdHJpbmcocyk6aX0sTmQ9VGQ/ZnVuY3Rpb24oZSl7cmV0dXJuIGJ0b2EoZSl9OnpkP2Z1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuZnJvbShlLCJiaW5hcnkiKS50b1N0cmluZygiYmFzZTY0Iil9OmpkLEJkPXpkP2Z1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuZnJvbShlKS50b1N0cmluZygiYmFzZTY0Iil9OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTAsbz1lLmxlbmd0aDtuPG87bis9NDA5Nil0LnB1c2goRmQuYXBwbHkobnVsbCxlLnN1YmFycmF5KG4sbis0MDk2KSkpO3JldHVybiBOZCh0LmpvaW4oIiIpKX0sWmQ9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtyZXR1cm4gdD9MZChCZChlKSk6QmQoZSl9LEhkPWZ1bmN0aW9uKGUpe2lmKGUubGVuZ3RoPDIpcmV0dXJuKHQ9ZS5jaGFyQ29kZUF0KDApKTwxMjg/ZTp0PDIwNDg/RmQoMTkyfHQ+Pj42KStGZCgxMjh8NjMmdCk6RmQoMjI0fHQ+Pj4xMiYxNSkrRmQoMTI4fHQ+Pj42JjYzKStGZCgxMjh8NjMmdCk7dmFyIHQ9NjU1MzYrMTAyNCooZS5jaGFyQ29kZUF0KDApLTU1Mjk2KSsoZS5jaGFyQ29kZUF0KDEpLTU2MzIwKTtyZXR1cm4gRmQoMjQwfHQ+Pj4xOCY3KStGZCgxMjh8dD4+PjEyJjYzKStGZCgxMjh8dD4+PjYmNjMpK0ZkKDEyOHw2MyZ0KX0sR2Q9L1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGRl18W15ceDAwLVx4N0ZdL2csVmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShHZCxIZCl9LFhkPXpkP2Z1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuZnJvbShlLCJ1dGY4IikudG9TdHJpbmcoImJhc2U2NCIpfTpVZD9mdW5jdGlvbihlKXtyZXR1cm4gQmQoVWQuZW5jb2RlKGUpKX06ZnVuY3Rpb24oZSl7cmV0dXJuIE5kKFZkKGUpKX0sWWQ9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtyZXR1cm4gdD9MZChYZChlKSk6WGQoZSl9LEtkPWZ1bmN0aW9uKGUpe3JldHVybiBZZChlLCEwKX0sJGQ9L1tceEMwLVx4REZdW1x4ODAtXHhCRl18W1x4RTAtXHhFRl1bXHg4MC1ceEJGXXsyfXxbXHhGMC1ceEY3XVtceDgwLVx4QkZdezN9L2csUWQ9ZnVuY3Rpb24oZSl7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDQ6dmFyIHQ9KCg3JmUuY2hhckNvZGVBdCgwKSk8PDE4fCg2MyZlLmNoYXJDb2RlQXQoMSkpPDwxMnwoNjMmZS5jaGFyQ29kZUF0KDIpKTw8Nnw2MyZlLmNoYXJDb2RlQXQoMykpLTY1NTM2O3JldHVybiBGZCg1NTI5NisodD4+PjEwKSkrRmQoNTYzMjArKDEwMjMmdCkpO2Nhc2UgMzpyZXR1cm4gRmQoKDE1JmUuY2hhckNvZGVBdCgwKSk8PDEyfCg2MyZlLmNoYXJDb2RlQXQoMSkpPDw2fDYzJmUuY2hhckNvZGVBdCgyKSk7ZGVmYXVsdDpyZXR1cm4gRmQoKDMxJmUuY2hhckNvZGVBdCgwKSk8PDZ8NjMmZS5jaGFyQ29kZUF0KDEpKX19LGVmPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoJGQsUWQpfSx0Zj1mdW5jdGlvbihlKXtpZihlPWUucmVwbGFjZSgvXHMrL2csIiIpLCFXZC50ZXN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1hbGZvcm1lZCBiYXNlNjQuIik7ZSs9Ij09Ii5zbGljZSgyLSgzJmUubGVuZ3RoKSk7Zm9yKHZhciB0LG4sbyxyPSIiLGk9MDtpPGUubGVuZ3RoOyl0PXhkW2UuY2hhckF0KGkrKyldPDwxOHx4ZFtlLmNoYXJBdChpKyspXTw8MTJ8KG49eGRbZS5jaGFyQXQoaSsrKV0pPDw2fChvPXhkW2UuY2hhckF0KGkrKyldKSxyKz02ND09PW4/RmQodD4+MTYmMjU1KTo2ND09PW8/RmQodD4+MTYmMjU1LHQ+PjgmMjU1KTpGZCh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpO3JldHVybiByfSxuZj1PZD9mdW5jdGlvbihlKXtyZXR1cm4gYXRvYihKZChlKSl9OnpkP2Z1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuZnJvbShlLCJiYXNlNjQiKS50b1N0cmluZygiYmluYXJ5Iil9OnRmLG9mPXpkP2Z1bmN0aW9uKGUpe3JldHVybiBNZChCdWZmZXIuZnJvbShlLCJiYXNlNjQiKSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNZChuZihlKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckNvZGVBdCgwKX0pKX0scmY9ZnVuY3Rpb24oZSl7cmV0dXJuIG9mKGFmKGUpKX0sc2Y9emQ/ZnVuY3Rpb24oZSl7cmV0dXJuIEJ1ZmZlci5mcm9tKGUsImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGY4Iil9OkFkP2Z1bmN0aW9uKGUpe3JldHVybiBBZC5kZWNvZGUob2YoZSkpfTpmdW5jdGlvbihlKXtyZXR1cm4gZWYobmYoZSkpfSxhZj1mdW5jdGlvbihlKXtyZXR1cm4gSmQoZS5yZXBsYWNlKC9bLV9dL2csKGZ1bmN0aW9uKGUpe3JldHVybiItIj09ZT8iKyI6Ii8ifSkpKX0sdWY9ZnVuY3Rpb24oZSl7cmV0dXJuIHNmKGFmKGUpKX0sY2Y9ZnVuY3Rpb24oZSl7cmV0dXJue3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSxsZj1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLGUsY2YodCkpfTtlKCJmcm9tQmFzZTY0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdWYodGhpcyl9KSksZSgidG9CYXNlNjQiLChmdW5jdGlvbihlKXtyZXR1cm4gWWQodGhpcyxlKX0pKSxlKCJ0b0Jhc2U2NFVSSSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFlkKHRoaXMsITApfSkpLGUoInRvQmFzZTY0VVJMIiwoZnVuY3Rpb24oKXtyZXR1cm4gWWQodGhpcywhMCl9KSksZSgidG9VaW50OEFycmF5IiwoZnVuY3Rpb24oKXtyZXR1cm4gcmYodGhpcyl9KSl9LGRmPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQ4QXJyYXkucHJvdG90eXBlLGUsY2YodCkpfTtlKCJ0b0Jhc2U2NCIsKGZ1bmN0aW9uKGUpe3JldHVybiBaZCh0aGlzLGUpfSkpLGUoInRvQmFzZTY0VVJJIiwoZnVuY3Rpb24oKXtyZXR1cm4gWmQodGhpcywhMCl9KSksZSgidG9CYXNlNjRVUkwiLChmdW5jdGlvbigpe3JldHVybiBaZCh0aGlzLCEwKX0pKX0sZmY9e3ZlcnNpb246RWQsVkVSU0lPTjoiMy43LjIiLGF0b2I6bmYsYXRvYlBvbHlmaWxsOnRmLGJ0b2E6TmQsYnRvYVBvbHlmaWxsOmpkLGZyb21CYXNlNjQ6dWYsdG9CYXNlNjQ6WWQsZW5jb2RlOllkLGVuY29kZVVSSTpLZCxlbmNvZGVVUkw6S2QsdXRvYjpWZCxidG91OmVmLGRlY29kZTp1Zixpc1ZhbGlkOmZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4hMTt2YXIgdD1lLnJlcGxhY2UoL1xzKy9nLCIiKS5yZXBsYWNlKC89ezAsMn0kLywiIik7cmV0dXJuIS9bXlxzMC05YS16QS1aXCsvXS8udGVzdCh0KXx8IS9bXlxzMC05YS16QS1aXC1fXS8udGVzdCh0KX0sZnJvbVVpbnQ4QXJyYXk6WmQsdG9VaW50OEFycmF5OnJmLGV4dGVuZFN0cmluZzpsZixleHRlbmRVaW50OEFycmF5OmRmLGV4dGVuZEJ1aWx0aW5zOmZ1bmN0aW9uKCl7bGYoKSxkZigpfX0saGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7bih0aGlzLGUpLHRoaXMub0Jhc2U2ND1mZn1yZXR1cm4gcihlLFt7a2V5OiJicm93c2VyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSx0PS8oZWRnZSlbL10oW1x3Ll0rKS8uZXhlYyhlKXx8LyhjaHJvbWUpWy9dKFtcdy5dKykvLmV4ZWMoZSl8fC8oc2FmYXJpKVsvXShbXHcuXSspLy5leGVjKGUpfHwvKG9wZXJhKSg/Oi4qdmVyc2lvbik/Wy9dKFtcdy5dKykvLmV4ZWMoZSl8fC8odHJpZGVudC4qcnY6KShbXHcuXSspLy5leGVjKGUpfHwvKG1zaWUpIChbXHcuXSspLy5leGVjKGUpfHxlLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiYvKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLmV4ZWMoZSl8fFsidW5rbm93IiwiMCJdO3QubGVuZ3RoPjAmJnRbMV0uaW5kZXhPZigidHJpZGVudCIpPi0xJiYodFsxXT0ibXNpZSIpO3ZhciBuPXt9O3JldHVybiBuW3RbMV1dPSEwLG4udmVyc2lvbj10WzJdLG59fSx7a2V5OiJnZXRDcmVhdGVXbmRNb2RlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQsdD1uYXZpZ2F0b3IucGxhdGZvcm0sbj0iV2luNjQiPT09dHx8IldpbjMyIj09PXR8fCJXaW5kb3dzIj09PXQsbz10aGlzLmJyb3dzZXIoKSxyPSEwO3JldHVybiB3aW5kb3cudG9wIT09d2luZG93P3I9ITE6bj8oZS5pbmRleE9mKCJXaW5kb3dzIE5UIDEwLjAiKT4tMSYmby5tb3ppbGxhJiYocj0hMSksby5lZGdlJiYocj0hMSkpOnI9ITEscn19LHtrZXk6ImdldFduZFBvc3Rpb24iLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciByPTAsaT0wLHM9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LGE9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLGM9e3RvcDphLnRvcCtwYXJzZUludCh1WyJib3JkZXItdG9wLXdpZHRoIl0uc2xpY2UoMCwtMiksMTApLGxlZnQ6YS5sZWZ0K3BhcnNlSW50KHVbImJvcmRlci1sZWZ0LXdpZHRoIl0uc2xpY2UoMCwtMiksMTApfSxsPXRoaXMuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO2lmKHQpaWYodGhpcy5icm93c2VyKCkubXNpZSl7dmFyIGQ9cy5vdXRlcldpZHRoLXMuaW5uZXJXaWR0aC0ocy5zY3JlZW5MZWZ0LXMuc2NyZWVuWCk7cj1jLmxlZnQrKHMuc2NyZWVuTGVmdC1zLnNjcmVlblgpLWQsaT1jLnRvcCsocy5zY3JlZW5Ub3Atcy5zY3JlZW5ZKX1lbHNle3ZhciBmPTAsaD0wLHA9dGhpcy5icm93c2VyKCkuY2hyb21lP3Mub3V0ZXJXaWR0aC9sOnMub3V0ZXJXaWR0aCx2PXRoaXMuYnJvd3NlcigpLmNocm9tZT9zLm91dGVySGVpZ2h0L2w6cy5vdXRlckhlaWdodCxiPU1hdGgucm91bmQoKHAtcy5pbm5lcldpZHRoKS8yKTt0aGlzLmlzV2luZG93cygpJiZ0aGlzLmJyb3dzZXIoKS5jaHJvbWUmJigtOD09PWJ8fHMuc2NyZWVuLmhlaWdodC1zLm91dGVySGVpZ2h0PT0wPy04PT09YiYmKGY9OCxoPTgpOjg9PT1iP2Y9LTU6MD09PWImJihoPTgpKSx0aGlzLmJyb3dzZXIoKS5tb3ppbGxhJiYoNz09PWJ8fDY9PT1iP2Y9LTY6OD09PWImJihmPS04KSkscj1jLmxlZnQrYitmLGk9Yy50b3ArKHYtcy5pbm5lckhlaWdodC1iKStofWVsc2V7dmFyIGc9d2luZG93LnRvcCxtPTAseT0wLF89MCx3PTA7dHJ5e209Zy5vdXRlcldpZHRoLWcuaW5uZXJXaWR0aCx5PWcub3V0ZXJIZWlnaHQtZy5pbm5lckhlaWdodCxfPWcuc2NyZWVuTGVmdC1nLnNjcmVlblgsdz1nLnNjcmVlblRvcC1nLnNjcmVlbll9Y2F0Y2goZSl7bT1uLm91dGVyV2lkdGgtbi5pbm5lcldpZHRoLHk9bi5vdXRlckhlaWdodC1uLmlubmVySGVpZ2h0LF89bi5zY3JlZW5MZWZ0LW4uc2NyZWVuWCx3PW4uc2NyZWVuVG9wLW4uc2NyZWVuWX1pZih0aGlzLmJyb3dzZXIoKS5tc2llKXswLHI9Yy5sZWZ0K18tMCxpPWMudG9wK3d9ZWxzZXt2YXIgQz1tLzI7cj1jLmxlZnQrQyxpPWMudG9wKyh5LUMpLHRoaXMuaXNXaW5kb3dzKCkmJnRoaXMuYnJvd3NlcigpLmNocm9tZSYmMD09PUMmJihyKz04LGkrPTgpfXIrPW8ubGVmdCxpKz1vLnRvcH1yZXR1cm4gdGhpcy5pc1dpbmRvd3MoKSYmKHRoaXMuYnJvd3NlcigpLmNocm9tZXx8dGhpcy5icm93c2VyKCkuc2FmYXJpKSYmKHI9Yy5sZWZ0LGk9Yy50b3Ascis9by5sZWZ0LGkrPW8udG9wKSx0aGlzLmJyb3dzZXIoKS5tc2llJiYiMTAuMCI9PT10aGlzLmJyb3dzZXIoKS52ZXJzaW9uJiYocis9cy5wYWdlWE9mZnNldCxpKz1zLnBhZ2VZT2Zmc2V0KSx7bGVmdDpyPU1hdGgucm91bmQocipsKSx0b3A6aT1NYXRoLnJvdW5kKGkqbCl9fX0se2tleToiZGV0ZWN0UG9ydCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe2lmKGUhPT10KXt2YXIgbz0iSGlrQ2VudHJhbFdlYkNvbnRyb2xQb3J0OiIuY29uY2F0KGUsIi0iKS5jb25jYXQodCkscj10aGlzLGk9MCxzPSExLGE9bnVsbDtzZXNzaW9uU3RvcmFnZSYmbnVsbCE9PShhPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0obykpJiYoYT1wYXJzZUludChhLDEwKSk7Zm9yKHZhciB1PVtdLGM9ZTtjPD10O2MrKyljIT09YSYmdS5wdXNoKGMpO251bGwhPT1hJiZ1LnVuc2hpZnQoYSk7Zm9yKHZhciBsPVtdLGQ9ZnVuY3Rpb24oKXtpPjAmJmNsZWFyVGltZW91dChpKX0sZj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wLHQ9bC5sZW5ndGg7ZTx0O2UrKylkZWxldGUgbFtlXX0saD0wLHA9KG5ldyBEYXRlKS5nZXRUaW1lKCksdj1mdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bC5wdXNoKHIuY3JlYXRlSW1hZ2VIdHRwKHVbdF0se3RpbWVTdGFtcDpwK3Qsc3VjY2VzczpmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7c2Vzc2lvblN0b3JhZ2UmJnNlc3Npb25TdG9yYWdlLnNldEl0ZW0obyxlKSwhcyYmbi5zdWNjZXNzJiYoZCgpLGYoKSxuLnN1Y2Nlc3MoZSkpfShlKX0sZXJyb3I6ZnVuY3Rpb24oKXtoKyssdS5sZW5ndGg9PT1oJiYhcyYmbi5lcnJvciYmKGQoKSxmKCksbi5lcnJvcigpKX19KSl9KSwxMDApfSxiPTAsZz11Lmxlbmd0aDtiPGc7YisrKXYoMCxiKTtpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cz0hMCxuLmVycm9yJiYoZigpLG4uZXJyb3IoKSl9KSw2ZTQpfWVsc2Ugbi5zdWNjZXNzKGUpfX0se2tleToiY3JlYXRlSW1hZ2VIdHRwIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBJbWFnZTtyZXR1cm4gbi5jcm9zc09yaWdpbj0iYW5vbnltb3VzIixuLm9ubG9hZD1mdW5jdGlvbigpe3Quc3VjY2VzcyYmdC5zdWNjZXNzKGUpfSxuLm9uZXJyb3I9ZnVuY3Rpb24oKXt0LmVycm9yJiZ0LmVycm9yKCl9LG4ub25hYm9ydD1mdW5jdGlvbigpe3QuYWJvcnQmJnQuYWJvcnQoKX0sbi5zcmM9Imh0dHA6Ly8xMjcuMC4wLjE6Ii5jb25jYXQoZSwiL2ltZ2h0dHAvbG9jYWw/dXBkYXRlPSIpLmNvbmNhdCh0LnRpbWVTdGFtcCksbn19LHtrZXk6InV0Zjh0bzE2Iix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixvLHI9IiIsaT0wLHM9ZS5sZW5ndGg7aTxzOylzd2l0Y2goKHQ9ZS5jaGFyQ29kZUF0KGkrKykpPj40KXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpjYXNlIDY6Y2FzZSA3OnIrPWUuY2hhckF0KGktMSk7YnJlYWs7Y2FzZSAxMjpjYXNlIDEzOm49ZS5jaGFyQ29kZUF0KGkrKykscis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMzEmdCk8PDZ8NjMmbik7YnJlYWs7Y2FzZSAxNDpuPWUuY2hhckNvZGVBdChpKyspLG89ZS5jaGFyQ29kZUF0KGkrKykscis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMTUmdCk8PDEyfCg2MyZuKTw8NnwoNjMmbyk8PDApfXJldHVybiByfX0se2tleToiY3JlYXRlRXZlbnRTY3JpcHQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtvLmh0bWxGb3I9ZSxvLmV2ZW50PXQsby5pbm5lckhUTUw9bixkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKS5hcHBlbmRDaGlsZChvKX19LHtrZXk6ImlzTWFjT1MiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIk1hY0ludGVsIj09PW5hdmlnYXRvci5wbGF0Zm9ybX19LHtrZXk6ImlzV2luZG93cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnBsYXRmb3JtLmluZGV4T2YoIldpbiIpPi0xfX0se2tleToiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0xO3JldHVybiB0aGlzLmlzTWFjT1MoKXx8KGU9d2luZG93LmRldmljZVBpeGVsUmF0aW98fHdpbmRvdy5zY3JlZW4uZGV2aWNlWERQSS93aW5kb3cuc2NyZWVuLmxvZ2ljYWxYRFBJKSxlfX0se2tleToiQmFzZTY0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9CYXNlNjR8fHt9fX1dKSxlfSgpLHBmPW5ldyBoZix2Zj0i44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CAIjtmdW5jdGlvbiBiZihlKXt3aW5kb3cudG9wLmRvY3VtZW50LnRpdGxlPXdpbmRvdy50b3AuZG9jdW1lbnQudGl0bGUrdmYrZX1mdW5jdGlvbiBnZihlKXt3aW5kb3cudG9wLmRvY3VtZW50LnRpdGxlPXdpbmRvdy50b3AuZG9jdW1lbnQudGl0bGUucmVwbGFjZSh2ZitlLCIiKX1mdW5jdGlvbiBtZihlLHQpeyh0fHxiZikoZSl9ZnVuY3Rpb24geWYoZSx0KXsodHx8Z2YpKGUpfXZhciBfZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7bih0aGlzLGUpLHRoaXMub09wdGlvbnM9T2JqZWN0LmFzc2lnbih7aVBvcnQ6LTEsY2JDb25uZWN0U3VjY2VzczpudWxsLGNiQ29ubmVjdEVycm9yOm51bGwsY2JDb25uZWN0Q2xvc2U6bnVsbH0sdCksdGhpcy5vV2ViU29ja2V0PW51bGwsdGhpcy5zelVVSUQ9IiIsdGhpcy5zelZlcnNpb249IiIsdGhpcy5vUmVxdWVzdExpc3Q9e30sdGhpcy5iTm9ybWFsQ2xvc2U9ITEsdGhpcy5vV2luZG93Q29udHJvbENhbGxiYWNrPXt9LHRoaXMub1NhZHBDYWxsYmFjaz17fSx0aGlzLm9TbGljZUNhbGxiYWNrPXt9LHRoaXMub1NlcmlhbENhbGxiYWNrPXt9LHRoaXMub1VJQ29udHJvbENhbGxiYWNrPXt9LHRoaXMub1VwZ3JhZGVDYWxsYmFjaz17fSx0aGlzLmluaXQoKX1yZXR1cm4gcihlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1mdW5jdGlvbigpe2Uub09wdGlvbnMuY2JDb25uZWN0Q2xvc2UmJmUub09wdGlvbnMuY2JDb25uZWN0Q2xvc2UoZS5iTm9ybWFsQ2xvc2UpLGUuYk5vcm1hbENsb3NlPSExfTtlLm9XZWJTb2NrZXQ9bmV3IFdlYlNvY2tldCgid3M6Ly8xMjcuMC4wLjE6Ii5jb25jYXQoZS5vT3B0aW9ucy5pUG9ydCkpLGUub1dlYlNvY2tldC5vbmVycm9yPWZ1bmN0aW9uKCl7fSxlLm9XZWJTb2NrZXQub25vcGVuPWZ1bmN0aW9uKCl7dmFyIHQ9e3NlcXVlbmNlOklkKCksY21kOiJzeXN0ZW0uY29ubmVjdCJ9LG49SlNPTi5zdHJpbmdpZnkodCk7ZS5vV2ViU29ja2V0LnNlbmQobil9LGUub1dlYlNvY2tldC5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7dmFyIG49dC5kYXRhLG89SlNPTi5wYXJzZShuKSxyPW8uc2VxdWVuY2U7dm9pZCAwPT09ciYmdm9pZCAwPT09by5jbWQ/KGUuc3pVVUlEPW8udXVpZCxlLnN6VmVyc2lvbj1vLnZlcnNpb24sZS5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzJiZlLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MoKSk6dm9pZCAwIT09by5jbWQ/ZS5wYXJzZUNtZChvKTp2b2lkIDAhPT1lLm9SZXF1ZXN0TGlzdFtyXSYmKDA9PT1vLmVycm9yTW9kdWxlJiYwPT09by5lcnJvckNvZGU/ZS5vUmVxdWVzdExpc3Rbcl0ucmVzb2x2ZShvKTplLm9SZXF1ZXN0TGlzdFtyXS5yZWplY3QobyksZGVsZXRlIGUub1JlcXVlc3RMaXN0W3JdKX0sZS5vV2ViU29ja2V0Lm9uY2xvc2U9ZnVuY3Rpb24oKXtlLm9XZWJTb2NrZXQ9bnVsbCxwZi5icm93c2VyKCkubW96aWxsYT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QoKX0pLDEwMCk6dCgpfX19LHtrZXk6InNldFdpbmRvd0NvbnRyb2xDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vV2luZG93Q29udHJvbENhbGxiYWNrPWV9fSx7a2V5OiJzZXRTYWRwQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub1NhZHBDYWxsYmFjaz1lfX0se2tleToic2V0U2xpY2VDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vU2xpY2VDYWxsYmFjaz1lfX0se2tleToic2V0U2VyaWFsQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub1NlcmlhbENhbGxiYWNrPWV9fSx7a2V5OiJzZXRVSUNvbnRyb2xDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vVUlDb250cm9sQ2FsbGJhY2s9ZX19LHtrZXk6InNldFVwZ3JhZGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vVXBncmFkZUNhbGxiYWNrPWV9fSx7a2V5OiJnZXRTZXJ2aWNlVmVyc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zelZlcnNpb259fSx7a2V5OiJnZXRSZXF1ZXN0VVVJRCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zelVVSUR9fSx7a2V5OiJkaXNjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYk5vcm1hbENsb3NlPSEwLHRoaXMub1dlYlNvY2tldCYmV2ViU29ja2V0Lk9QRU49PT10aGlzLm9XZWJTb2NrZXQucmVhZHlTdGF0ZSYmKHRoaXMub1dlYlNvY2tldC5jbG9zZSgpLGRlbGV0ZSB0aGlzLm9XZWJTb2NrZXQpfX0se2tleToic2VuZFJlcXVlc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe3ZhciByPUlkKCk7ZS5zZXF1ZW5jZT1yLHQub1JlcXVlc3RMaXN0W3JdPXtyZXNvbHZlOm4scmVqZWN0Om99LGUudXVpZD10LnN6VVVJRCxlLnRpbWVzdGFtcD0iIi5jb25jYXQoKG5ldyBEYXRlKS5nZXRUaW1lKCkpO3ZhciBpPUpTT04uc3RyaW5naWZ5KGUpO3Qub1dlYlNvY2tldCYmV2ViU29ja2V0Lk9QRU49PT10Lm9XZWJTb2NrZXQucmVhZHlTdGF0ZT90Lm9XZWJTb2NrZXQuc2VuZChpKTpvKCl9KSl9fSx7a2V5OiJwYXJzZUNtZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jbWQuc3BsaXQoIi4iKSxuPXRbMV0ucmVwbGFjZSgvXlthLXpdezF9L2csKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9KSk7IndpbmRvdyI9PT10WzBdfHwicGxheSI9PT10WzBdP3RoaXMub1dpbmRvd0NvbnRyb2xDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1dpbmRvd0NvbnRyb2xDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InNhZHAiPT09dFswXT90aGlzLm9TYWRwQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9TYWRwQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJzZXJpYWwiPT09dFswXT90aGlzLm9TZXJpYWxDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1NlcmlhbENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXShlKToic2xpY2UiPT09dFswXT90aGlzLm9TbGljZUNhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vU2xpY2VDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InVpIj09PXRbMF0/dGhpcy5vVUlDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9VSUNvbnRyb2xDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InVwZ3JhZGUiPT09dFswXSYmdGhpcy5vVXBncmFkZUNhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vVXBncmFkZUNhbGxiYWNrWyJjYiIuY29uY2F0KG4pXShlKX19XSksZX0oKTsKLyohIHBha28gMi4wLjQgaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9wYWtvIEBsaWNlbnNlIChNSVQgQU5EIFpsaWIpICovZnVuY3Rpb24gd2YoZSl7Zm9yKHZhciB0PWUubGVuZ3RoOy0tdD49MDspZVt0XT0wfXZhciBDZj0yNTYsa2Y9Mjg2LFNmPTMwLFJmPTE1LHFmPW5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdKSxJZj1uZXcgVWludDhBcnJheShbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10pLFBmPW5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XSksRWY9bmV3IFVpbnQ4QXJyYXkoWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdKSxPZj1uZXcgQXJyYXkoNTc2KTt3ZihPZik7dmFyIFRmPW5ldyBBcnJheSg2MCk7d2YoVGYpO3ZhciB6Zj1uZXcgQXJyYXkoNTEyKTt3Zih6Zik7dmFyIEFmPW5ldyBBcnJheSgyNTYpO3dmKEFmKTt2YXIgVWY9bmV3IEFycmF5KDI5KTt3ZihVZik7dmFyIERmLHhmLFdmLEZmPW5ldyBBcnJheShTZik7ZnVuY3Rpb24gTWYoZSx0LG4sbyxyKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1vLHRoaXMubWF4X2xlbmd0aD1yLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofWZ1bmN0aW9uIExmKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fXdmKEZmKTt2YXIgSmY9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8MjU2P3pmW2VdOnpmWzI1NisoZT4+PjcpXX0samY9ZnVuY3Rpb24oZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9LE5mPWZ1bmN0aW9uKGUsdCxuKXtlLmJpX3ZhbGlkPjE2LW4/KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LGpmKGUsZS5iaV9idWYpLGUuYmlfYnVmPXQ+PjE2LWUuYmlfdmFsaWQsZS5iaV92YWxpZCs9bi0xNik6KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LGUuYmlfdmFsaWQrPW4pfSxCZj1mdW5jdGlvbihlLHQsbil7TmYoZSxuWzIqdF0sblsyKnQrMV0pfSxaZj1mdW5jdGlvbihlLHQpe3ZhciBuPTA7ZG97bnw9MSZlLGU+Pj49MSxuPDw9MX13aGlsZSgtLXQ+MCk7cmV0dXJuIG4+Pj4xfSxIZj1mdW5jdGlvbihlLHQsbil7dmFyIG8scixpPW5ldyBBcnJheSgxNikscz0wO2ZvcihvPTE7bzw9UmY7bysrKWlbb109cz1zK25bby0xXTw8MTtmb3Iocj0wO3I8PXQ7cisrKXt2YXIgYT1lWzIqcisxXTswIT09YSYmKGVbMipyXT1aZihpW2FdKyssYSkpfX0sR2Y9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQ9MDt0PGtmO3QrKyllLmR5bl9sdHJlZVsyKnRdPTA7Zm9yKHQ9MDt0PFNmO3QrKyllLmR5bl9kdHJlZVsyKnRdPTA7Zm9yKHQ9MDt0PDE5O3QrKyllLmJsX3RyZWVbMip0XT0wO2UuZHluX2x0cmVlWzUxMl09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH0sVmY9ZnVuY3Rpb24oZSl7ZS5iaV92YWxpZD44P2pmKGUsZS5iaV9idWYpOmUuYmlfdmFsaWQ+MCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPWUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MH0sWGY9ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI9Mip0LGk9MipuO3JldHVybiBlW3JdPGVbaV18fGVbcl09PT1lW2ldJiZvW3RdPD1vW25dfSxZZj1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvPWUuaGVhcFtuXSxyPW48PDE7cjw9ZS5oZWFwX2xlbiYmKHI8ZS5oZWFwX2xlbiYmWGYodCxlLmhlYXBbcisxXSxlLmhlYXBbcl0sZS5kZXB0aCkmJnIrKywhWGYodCxvLGUuaGVhcFtyXSxlLmRlcHRoKSk7KWUuaGVhcFtuXT1lLmhlYXBbcl0sbj1yLHI8PD0xO2UuaGVhcFtuXT1vfSxLZj1mdW5jdGlvbihlLHQsbil7dmFyIG8scixpLHMsYT0wO2lmKDAhPT1lLmxhc3RfbGl0KWRve289ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqYV08PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqYSsxXSxyPWUucGVuZGluZ19idWZbZS5sX2J1ZithXSxhKyssMD09PW8/QmYoZSxyLHQpOihpPUFmW3JdLEJmKGUsaStDZisxLHQpLDAhPT0ocz1xZltpXSkmJihyLT1VZltpXSxOZihlLHIscykpLG8tLSxpPUpmKG8pLEJmKGUsaSxuKSwwIT09KHM9SWZbaV0pJiYoby09RmZbaV0sTmYoZSxvLHMpKSl9d2hpbGUoYTxlLmxhc3RfbGl0KTtCZihlLDI1Nix0KX0sJGY9ZnVuY3Rpb24oZSx0KXt2YXIgbixvLHIsaT10LmR5bl90cmVlLHM9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsYT10LnN0YXRfZGVzYy5oYXNfc3RyZWUsdT10LnN0YXRfZGVzYy5lbGVtcyxjPS0xO2ZvcihlLmhlYXBfbGVuPTAsZS5oZWFwX21heD01NzMsbj0wO248dTtuKyspMCE9PWlbMipuXT8oZS5oZWFwWysrZS5oZWFwX2xlbl09Yz1uLGUuZGVwdGhbbl09MCk6aVsyKm4rMV09MDtmb3IoO2UuaGVhcF9sZW48MjspaVsyKihyPWUuaGVhcFsrK2UuaGVhcF9sZW5dPWM8Mj8rK2M6MCldPTEsZS5kZXB0aFtyXT0wLGUub3B0X2xlbi0tLGEmJihlLnN0YXRpY19sZW4tPXNbMipyKzFdKTtmb3IodC5tYXhfY29kZT1jLG49ZS5oZWFwX2xlbj4+MTtuPj0xO24tLSlZZihlLGksbik7cj11O2Rve249ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxZZihlLGksMSksbz1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09bixlLmhlYXBbLS1lLmhlYXBfbWF4XT1vLGlbMipyXT1pWzIqbl0raVsyKm9dLGUuZGVwdGhbcl09KGUuZGVwdGhbbl0+PWUuZGVwdGhbb10/ZS5kZXB0aFtuXTplLmRlcHRoW29dKSsxLGlbMipuKzFdPWlbMipvKzFdPXIsZS5oZWFwWzFdPXIrKyxZZihlLGksMSl9d2hpbGUoZS5oZWFwX2xlbj49Mik7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLGZ1bmN0aW9uKGUsdCl7dmFyIG4sbyxyLGkscyxhLHU9dC5keW5fdHJlZSxjPXQubWF4X2NvZGUsbD10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxkPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxmPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMsaD10LnN0YXRfZGVzYy5leHRyYV9iYXNlLHA9dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCx2PTA7Zm9yKGk9MDtpPD1SZjtpKyspZS5ibF9jb3VudFtpXT0wO2Zvcih1WzIqZS5oZWFwW2UuaGVhcF9tYXhdKzFdPTAsbj1lLmhlYXBfbWF4KzE7bjw1NzM7bisrKShpPXVbMip1WzIqKG89ZS5oZWFwW25dKSsxXSsxXSsxKT5wJiYoaT1wLHYrKyksdVsyKm8rMV09aSxvPmN8fChlLmJsX2NvdW50W2ldKysscz0wLG8+PWgmJihzPWZbby1oXSksYT11WzIqb10sZS5vcHRfbGVuKz1hKihpK3MpLGQmJihlLnN0YXRpY19sZW4rPWEqKGxbMipvKzFdK3MpKSk7aWYoMCE9PXYpe2Rve2ZvcihpPXAtMTswPT09ZS5ibF9jb3VudFtpXTspaS0tO2UuYmxfY291bnRbaV0tLSxlLmJsX2NvdW50W2krMV0rPTIsZS5ibF9jb3VudFtwXS0tLHYtPTJ9d2hpbGUodj4wKTtmb3IoaT1wOzAhPT1pO2ktLSlmb3Iobz1lLmJsX2NvdW50W2ldOzAhPT1vOykocj1lLmhlYXBbLS1uXSk+Y3x8KHVbMipyKzFdIT09aSYmKGUub3B0X2xlbis9KGktdVsyKnIrMV0pKnVbMipyXSx1WzIqcisxXT1pKSxvLS0pfX0oZSx0KSxIZihpLGMsZS5ibF9jb3VudCl9LFFmPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbyxyLGk9LTEscz10WzFdLGE9MCx1PTcsYz00O2ZvcigwPT09cyYmKHU9MTM4LGM9MyksdFsyKihuKzEpKzFdPTY1NTM1LG89MDtvPD1uO28rKylyPXMscz10WzIqKG8rMSkrMV0sKythPHUmJnI9PT1zfHwoYTxjP2UuYmxfdHJlZVsyKnJdKz1hOjAhPT1yPyhyIT09aSYmZS5ibF90cmVlWzIqcl0rKyxlLmJsX3RyZWVbMzJdKyspOmE8PTEwP2UuYmxfdHJlZVszNF0rKzplLmJsX3RyZWVbMzZdKyssYT0wLGk9ciwwPT09cz8odT0xMzgsYz0zKTpyPT09cz8odT02LGM9Myk6KHU9NyxjPTQpKX0sZWg9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvLHIsaT0tMSxzPXRbMV0sYT0wLHU9NyxjPTQ7Zm9yKDA9PT1zJiYodT0xMzgsYz0zKSxvPTA7bzw9bjtvKyspaWYocj1zLHM9dFsyKihvKzEpKzFdLCEoKythPHUmJnI9PT1zKSl7aWYoYTxjKWRve0JmKGUscixlLmJsX3RyZWUpfXdoaWxlKDAhPS0tYSk7ZWxzZSAwIT09cj8ociE9PWkmJihCZihlLHIsZS5ibF90cmVlKSxhLS0pLEJmKGUsMTYsZS5ibF90cmVlKSxOZihlLGEtMywyKSk6YTw9MTA/KEJmKGUsMTcsZS5ibF90cmVlKSxOZihlLGEtMywzKSk6KEJmKGUsMTgsZS5ibF90cmVlKSxOZihlLGEtMTEsNykpO2E9MCxpPXIsMD09PXM/KHU9MTM4LGM9Myk6cj09PXM/KHU9NixjPTMpOih1PTcsYz00KX19LHRoPSExLG5oPWZ1bmN0aW9uKGUsdCxuLG8pe05mKGUsMCsobz8xOjApLDMpLGZ1bmN0aW9uKGUsdCxuLG8pe1ZmKGUpLG8mJihqZihlLG4pLGpmKGUsfm4pKSxlLnBlbmRpbmdfYnVmLnNldChlLndpbmRvdy5zdWJhcnJheSh0LHQrbiksZS5wZW5kaW5nKSxlLnBlbmRpbmcrPW59KGUsdCxuLCEwKX0sb2g9ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHIsaSxzPTA7ZS5sZXZlbD4wPygyPT09ZS5zdHJtLmRhdGFfdHlwZSYmKGUuc3RybS5kYXRhX3R5cGU9ZnVuY3Rpb24oZSl7dmFyIHQsbj00MDkzNjI0NDQ3O2Zvcih0PTA7dDw9MzE7dCsrLG4+Pj49MSlpZigxJm4mJjAhPT1lLmR5bl9sdHJlZVsyKnRdKXJldHVybiAwO2lmKDAhPT1lLmR5bl9sdHJlZVsxOF18fDAhPT1lLmR5bl9sdHJlZVsyMF18fDAhPT1lLmR5bl9sdHJlZVsyNl0pcmV0dXJuIDE7Zm9yKHQ9MzI7dDxDZjt0KyspaWYoMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIDE7cmV0dXJuIDB9KGUpKSwkZihlLGUubF9kZXNjKSwkZihlLGUuZF9kZXNjKSxzPWZ1bmN0aW9uKGUpe3ZhciB0O2ZvcihRZihlLGUuZHluX2x0cmVlLGUubF9kZXNjLm1heF9jb2RlKSxRZihlLGUuZHluX2R0cmVlLGUuZF9kZXNjLm1heF9jb2RlKSwkZihlLGUuYmxfZGVzYyksdD0xODt0Pj0zJiYwPT09ZS5ibF90cmVlWzIqRWZbdF0rMV07dC0tKTtyZXR1cm4gZS5vcHRfbGVuKz0zKih0KzEpKzUrNSs0LHR9KGUpLHI9ZS5vcHRfbGVuKzMrNz4+PjMsKGk9ZS5zdGF0aWNfbGVuKzMrNz4+PjMpPD1yJiYocj1pKSk6cj1pPW4rNSxuKzQ8PXImJi0xIT09dD9uaChlLHQsbixvKTo0PT09ZS5zdHJhdGVneXx8aT09PXI/KE5mKGUsMisobz8xOjApLDMpLEtmKGUsT2YsVGYpKTooTmYoZSw0KyhvPzE6MCksMyksZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI7Zm9yKE5mKGUsdC0yNTcsNSksTmYoZSxuLTEsNSksTmYoZSxvLTQsNCkscj0wO3I8bztyKyspTmYoZSxlLmJsX3RyZWVbMipFZltyXSsxXSwzKTtlaChlLGUuZHluX2x0cmVlLHQtMSksZWgoZSxlLmR5bl9kdHJlZSxuLTEpfShlLGUubF9kZXNjLm1heF9jb2RlKzEsZS5kX2Rlc2MubWF4X2NvZGUrMSxzKzEpLEtmKGUsZS5keW5fbHRyZWUsZS5keW5fZHRyZWUpKSxHZihlKSxvJiZWZihlKX0scmg9e190cl9pbml0OmZ1bmN0aW9uKGUpe3RofHwoIWZ1bmN0aW9uKCl7dmFyIGUsdCxuLG8scixpPW5ldyBBcnJheSgxNik7Zm9yKG49MCxvPTA7bzwyODtvKyspZm9yKFVmW29dPW4sZT0wO2U8MTw8cWZbb107ZSsrKUFmW24rK109bztmb3IoQWZbbi0xXT1vLHI9MCxvPTA7bzwxNjtvKyspZm9yKEZmW29dPXIsZT0wO2U8MTw8SWZbb107ZSsrKXpmW3IrK109bztmb3Iocj4+PTc7bzxTZjtvKyspZm9yKEZmW29dPXI8PDcsZT0wO2U8MTw8SWZbb10tNztlKyspemZbMjU2K3IrK109bztmb3IodD0wO3Q8PVJmO3QrKylpW3RdPTA7Zm9yKGU9MDtlPD0xNDM7KU9mWzIqZSsxXT04LGUrKyxpWzhdKys7Zm9yKDtlPD0yNTU7KU9mWzIqZSsxXT05LGUrKyxpWzldKys7Zm9yKDtlPD0yNzk7KU9mWzIqZSsxXT03LGUrKyxpWzddKys7Zm9yKDtlPD0yODc7KU9mWzIqZSsxXT04LGUrKyxpWzhdKys7Zm9yKEhmKE9mLDI4NyxpKSxlPTA7ZTxTZjtlKyspVGZbMiplKzFdPTUsVGZbMiplXT1aZihlLDUpO0RmPW5ldyBNZihPZixxZiwyNTcsa2YsUmYpLHhmPW5ldyBNZihUZixJZiwwLFNmLFJmKSxXZj1uZXcgTWYobmV3IEFycmF5KDApLFBmLDAsMTksNyl9KCksdGg9ITApLGUubF9kZXNjPW5ldyBMZihlLmR5bl9sdHJlZSxEZiksZS5kX2Rlc2M9bmV3IExmKGUuZHluX2R0cmVlLHhmKSxlLmJsX2Rlc2M9bmV3IExmKGUuYmxfdHJlZSxXZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsR2YoZSl9LF90cl9zdG9yZWRfYmxvY2s6bmgsX3RyX2ZsdXNoX2Jsb2NrOm9oLF90cl90YWxseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZisyKmUubGFzdF9saXRdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0KzFdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT0yNTUmbixlLmxhc3RfbGl0KyssMD09PXQ/ZS5keW5fbHRyZWVbMipuXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbMiooQWZbbl0rQ2YrMSldKyssZS5keW5fZHRyZWVbMipKZih0KV0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX0sX3RyX2FsaWduOmZ1bmN0aW9uKGUpe05mKGUsMiwzKSxCZihlLDI1NixPZiksZnVuY3Rpb24oZSl7MTY9PT1lLmJpX3ZhbGlkPyhqZihlLGUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MCk6ZS5iaV92YWxpZD49OCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZlLmJpX2J1ZixlLmJpX2J1Zj4+PTgsZS5iaV92YWxpZC09OCl9KGUpfX0saWg9ZnVuY3Rpb24oZSx0LG4sbyl7Zm9yKHZhciByPTY1NTM1JmV8MCxpPWU+Pj4xNiY2NTUzNXwwLHM9MDswIT09bjspe24tPXM9bj4yZTM/MmUzOm47ZG97aT1pKyhyPXIrdFtvKytdfDApfDB9d2hpbGUoLS1zKTtyJT02NTUyMSxpJT02NTUyMX1yZXR1cm4gcnxpPDwxNnwwfSxzaD1uZXcgVWludDMyQXJyYXkoZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPTA7bjwyNTY7bisrKXtlPW47Zm9yKHZhciBvPTA7bzw4O28rKyllPTEmZT8zOTg4MjkyMzg0XmU+Pj4xOmU+Pj4xO3Rbbl09ZX1yZXR1cm4gdH0oKSksYWg9ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI9c2gsaT1vK247ZV49LTE7Zm9yKHZhciBzPW87czxpO3MrKyllPWU+Pj44XnJbMjU1JihlXnRbc10pXTtyZXR1cm4tMV5lfSx1aD17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9LGNoPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfTUVNX0VSUk9SOi00LFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9LGxoPXJoLl90cl9pbml0LGRoPXJoLl90cl9zdG9yZWRfYmxvY2ssZmg9cmguX3RyX2ZsdXNoX2Jsb2NrLGhoPXJoLl90cl90YWxseSxwaD1yaC5fdHJfYWxpZ24sdmg9Y2guWl9OT19GTFVTSCxiaD1jaC5aX1BBUlRJQUxfRkxVU0gsZ2g9Y2guWl9GVUxMX0ZMVVNILG1oPWNoLlpfRklOSVNILHloPWNoLlpfQkxPQ0ssX2g9Y2guWl9PSyx3aD1jaC5aX1NUUkVBTV9FTkQsQ2g9Y2guWl9TVFJFQU1fRVJST1Isa2g9Y2guWl9EQVRBX0VSUk9SLFNoPWNoLlpfQlVGX0VSUk9SLFJoPWNoLlpfREVGQVVMVF9DT01QUkVTU0lPTixxaD1jaC5aX0ZJTFRFUkVELEloPWNoLlpfSFVGRk1BTl9PTkxZLFBoPWNoLlpfUkxFLEVoPWNoLlpfRklYRUQsT2g9Y2guWl9ERUZBVUxUX1NUUkFURUdZLFRoPWNoLlpfVU5LTk9XTix6aD1jaC5aX0RFRkxBVEVELEFoPTI1OCxVaD0yNjIsRGg9MTAzLHhoPTExMyxXaD02NjYsRmg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tc2c9dWhbdF0sdH0sTWg9ZnVuY3Rpb24oZSl7cmV0dXJuKGU8PDEpLShlPjQ/OTowKX0sTGg9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUubGVuZ3RoOy0tdD49MDspZVt0XT0wfSxKaD1mdW5jdGlvbihlLHQsbil7cmV0dXJuKHQ8PGUuaGFzaF9zaGlmdF5uKSZlLmhhc2hfbWFza30samg9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGF0ZSxuPXQucGVuZGluZztuPmUuYXZhaWxfb3V0JiYobj1lLmF2YWlsX291dCksMCE9PW4mJihlLm91dHB1dC5zZXQodC5wZW5kaW5nX2J1Zi5zdWJhcnJheSh0LnBlbmRpbmdfb3V0LHQucGVuZGluZ19vdXQrbiksZS5uZXh0X291dCksZS5uZXh0X291dCs9bix0LnBlbmRpbmdfb3V0Kz1uLGUudG90YWxfb3V0Kz1uLGUuYXZhaWxfb3V0LT1uLHQucGVuZGluZy09biwwPT09dC5wZW5kaW5nJiYodC5wZW5kaW5nX291dD0wKSl9LE5oPWZ1bmN0aW9uKGUsdCl7ZmgoZSxlLmJsb2NrX3N0YXJ0Pj0wP2UuYmxvY2tfc3RhcnQ6LTEsZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0LHQpLGUuYmxvY2tfc3RhcnQ9ZS5zdHJzdGFydCxqaChlLnN0cm0pfSxCaD1mdW5jdGlvbihlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXR9LFpoPWZ1bmN0aW9uKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0fSxIaD1mdW5jdGlvbihlLHQpe3ZhciBuLG8scj1lLm1heF9jaGFpbl9sZW5ndGgsaT1lLnN0cnN0YXJ0LHM9ZS5wcmV2X2xlbmd0aCxhPWUubmljZV9tYXRjaCx1PWUuc3Ryc3RhcnQ+ZS53X3NpemUtVWg/ZS5zdHJzdGFydC0oZS53X3NpemUtVWgpOjAsYz1lLndpbmRvdyxsPWUud19tYXNrLGQ9ZS5wcmV2LGY9ZS5zdHJzdGFydCtBaCxoPWNbaStzLTFdLHA9Y1tpK3NdO2UucHJldl9sZW5ndGg+PWUuZ29vZF9tYXRjaCYmKHI+Pj0yKSxhPmUubG9va2FoZWFkJiYoYT1lLmxvb2thaGVhZCk7ZG97aWYoY1sobj10KStzXT09PXAmJmNbbitzLTFdPT09aCYmY1tuXT09PWNbaV0mJmNbKytuXT09PWNbaSsxXSl7aSs9MixuKys7ZG97fXdoaWxlKGNbKytpXT09PWNbKytuXSYmY1srK2ldPT09Y1srK25dJiZjWysraV09PT1jWysrbl0mJmNbKytpXT09PWNbKytuXSYmY1srK2ldPT09Y1srK25dJiZjWysraV09PT1jWysrbl0mJmNbKytpXT09PWNbKytuXSYmY1srK2ldPT09Y1srK25dJiZpPGYpO2lmKG89QWgtKGYtaSksaT1mLUFoLG8+cyl7aWYoZS5tYXRjaF9zdGFydD10LHM9byxvPj1hKWJyZWFrO2g9Y1tpK3MtMV0scD1jW2krc119fX13aGlsZSgodD1kW3QmbF0pPnUmJjAhPS0tcik7cmV0dXJuIHM8PWUubG9va2FoZWFkP3M6ZS5sb29rYWhlYWR9LEdoPWZ1bmN0aW9uKGUpe3ZhciB0LG4sbyxyLGkscyxhLHUsYyxsLGQ9ZS53X3NpemU7ZG97aWYocj1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49ZCsoZC1VaCkpe2Uud2luZG93LnNldChlLndpbmRvdy5zdWJhcnJheShkLGQrZCksMCksZS5tYXRjaF9zdGFydC09ZCxlLnN0cnN0YXJ0LT1kLGUuYmxvY2tfc3RhcnQtPWQsdD1uPWUuaGFzaF9zaXplO2Rve289ZS5oZWFkWy0tdF0sZS5oZWFkW3RdPW8+PWQ/by1kOjB9d2hpbGUoLS1uKTt0PW49ZDtkb3tvPWUucHJldlstLXRdLGUucHJldlt0XT1vPj1kP28tZDowfXdoaWxlKC0tbik7cis9ZH1pZigwPT09ZS5zdHJtLmF2YWlsX2luKWJyZWFrO2lmKHM9ZS5zdHJtLGE9ZS53aW5kb3csdT1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLGM9cixsPXZvaWQgMCwobD1zLmF2YWlsX2luKT5jJiYobD1jKSxuPTA9PT1sPzA6KHMuYXZhaWxfaW4tPWwsYS5zZXQocy5pbnB1dC5zdWJhcnJheShzLm5leHRfaW4scy5uZXh0X2luK2wpLHUpLDE9PT1zLnN0YXRlLndyYXA/cy5hZGxlcj1paChzLmFkbGVyLGEsbCx1KToyPT09cy5zdGF0ZS53cmFwJiYocy5hZGxlcj1haChzLmFkbGVyLGEsbCx1KSkscy5uZXh0X2luKz1sLHMudG90YWxfaW4rPWwsbCksZS5sb29rYWhlYWQrPW4sZS5sb29rYWhlYWQrZS5pbnNlcnQ+PTMpZm9yKGk9ZS5zdHJzdGFydC1lLmluc2VydCxlLmluc19oPWUud2luZG93W2ldLGUuaW5zX2g9SmgoZSxlLmluc19oLGUud2luZG93W2krMV0pO2UuaW5zZXJ0JiYoZS5pbnNfaD1KaChlLGUuaW5zX2gsZS53aW5kb3dbaSszLTFdKSxlLnByZXZbaSZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1pLGkrKyxlLmluc2VydC0tLCEoZS5sb29rYWhlYWQrZS5pbnNlcnQ8MykpOyk7fXdoaWxlKGUubG9va2FoZWFkPFVoJiYwIT09ZS5zdHJtLmF2YWlsX2luKX0sVmg9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4sbzs7KXtpZihlLmxvb2thaGVhZDxVaCl7aWYoR2goZSksZS5sb29rYWhlYWQ8VWgmJnQ9PT12aClyZXR1cm4gMTtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj0zJiYoZS5pbnNfaD1KaChlLGUuaW5zX2gsZS53aW5kb3dbZS5zdHJzdGFydCszLTFdKSxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLDAhPT1uJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLVVoJiYoZS5tYXRjaF9sZW5ndGg9SGgoZSxuKSksZS5tYXRjaF9sZW5ndGg+PTMpaWYobz1oaChlLGUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aC0zKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj0zKXtlLm1hdGNoX2xlbmd0aC0tO2Rve2Uuc3Ryc3RhcnQrKyxlLmluc19oPUpoKGUsZS5pbnNfaCxlLndpbmRvd1tlLnN0cnN0YXJ0KzMtMV0pLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydH13aGlsZSgwIT0tLWUubWF0Y2hfbGVuZ3RoKTtlLnN0cnN0YXJ0Kyt9ZWxzZSBlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wLGUuaW5zX2g9ZS53aW5kb3dbZS5zdHJzdGFydF0sZS5pbnNfaD1KaChlLGUuaW5zX2gsZS53aW5kb3dbZS5zdHJzdGFydCsxXSk7ZWxzZSBvPWhoKGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0Kys7aWYobyYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1yZXR1cm4gZS5pbnNlcnQ9ZS5zdHJzdGFydDwyP2Uuc3Ryc3RhcnQ6Mix0PT09bWg/KE5oKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0PzM6NCk6ZS5sYXN0X2xpdCYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT8xOjJ9LFhoPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLG8scjs7KXtpZihlLmxvb2thaGVhZDxVaCl7aWYoR2goZSksZS5sb29rYWhlYWQ8VWgmJnQ9PT12aClyZXR1cm4gMTtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj0zJiYoZS5pbnNfaD1KaChlLGUuaW5zX2gsZS53aW5kb3dbZS5zdHJzdGFydCszLTFdKSxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9MiwwIT09biYmZS5wcmV2X2xlbmd0aDxlLm1heF9sYXp5X21hdGNoJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLVVoJiYoZS5tYXRjaF9sZW5ndGg9SGgoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKGUuc3RyYXRlZ3k9PT1xaHx8Mz09PWUubWF0Y2hfbGVuZ3RoJiZlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQ+NDA5NikmJihlLm1hdGNoX2xlbmd0aD0yKSksZS5wcmV2X2xlbmd0aD49MyYmZS5tYXRjaF9sZW5ndGg8PWUucHJldl9sZW5ndGgpe3I9ZS5zdHJzdGFydCtlLmxvb2thaGVhZC0zLG89aGgoZSxlLnN0cnN0YXJ0LTEtZS5wcmV2X21hdGNoLGUucHJldl9sZW5ndGgtMyksZS5sb29rYWhlYWQtPWUucHJldl9sZW5ndGgtMSxlLnByZXZfbGVuZ3RoLT0yO2RveysrZS5zdHJzdGFydDw9ciYmKGUuaW5zX2g9SmgoZSxlLmluc19oLGUud2luZG93W2Uuc3Ryc3RhcnQrMy0xXSksbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KX13aGlsZSgwIT0tLWUucHJldl9sZW5ndGgpO2lmKGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5tYXRjaF9sZW5ndGg9MixlLnN0cnN0YXJ0KyssbyYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1lbHNlIGlmKGUubWF0Y2hfYXZhaWxhYmxlKXtpZigobz1oaChlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSkpJiZOaChlLCExKSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLSwwPT09ZS5zdHJtLmF2YWlsX291dClyZXR1cm4gMX1lbHNlIGUubWF0Y2hfYXZhaWxhYmxlPTEsZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS19cmV0dXJuIGUubWF0Y2hfYXZhaWxhYmxlJiYobz1oaChlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDwyP2Uuc3Ryc3RhcnQ6Mix0PT09bWg/KE5oKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0PzM6NCk6ZS5sYXN0X2xpdCYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT8xOjJ9O2Z1bmN0aW9uIFloKGUsdCxuLG8scil7dGhpcy5nb29kX2xlbmd0aD1lLHRoaXMubWF4X2xhenk9dCx0aGlzLm5pY2VfbGVuZ3RoPW4sdGhpcy5tYXhfY2hhaW49byx0aGlzLmZ1bmM9cn12YXIgS2g9W25ldyBZaCgwLDAsMCwwLChmdW5jdGlvbihlLHQpe3ZhciBuPTY1NTM1O2ZvcihuPmUucGVuZGluZ19idWZfc2l6ZS01JiYobj1lLnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYoZS5sb29rYWhlYWQ8PTEpe2lmKEdoKGUpLDA9PT1lLmxvb2thaGVhZCYmdD09PXZoKXJldHVybiAxO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31lLnN0cnN0YXJ0Kz1lLmxvb2thaGVhZCxlLmxvb2thaGVhZD0wO3ZhciBvPWUuYmxvY2tfc3RhcnQrbjtpZigoMD09PWUuc3Ryc3RhcnR8fGUuc3Ryc3RhcnQ+PW8pJiYoZS5sb29rYWhlYWQ9ZS5zdHJzdGFydC1vLGUuc3Ryc3RhcnQ9byxOaChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIDE7aWYoZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0Pj1lLndfc2l6ZS1VaCYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09bWg/KE5oKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0PzM6NCk6KGUuc3Ryc3RhcnQ+ZS5ibG9ja19zdGFydCYmKE5oKGUsITEpLGUuc3RybS5hdmFpbF9vdXQpLDEpfSkpLG5ldyBZaCg0LDQsOCw0LFZoKSxuZXcgWWgoNCw1LDE2LDgsVmgpLG5ldyBZaCg0LDYsMzIsMzIsVmgpLG5ldyBZaCg0LDQsMTYsMTYsWGgpLG5ldyBZaCg4LDE2LDMyLDMyLFhoKSxuZXcgWWgoOCwxNiwxMjgsMTI4LFhoKSxuZXcgWWgoOCwzMiwxMjgsMjU2LFhoKSxuZXcgWWgoMzIsMTI4LDI1OCwxMDI0LFhoKSxuZXcgWWgoMzIsMjU4LDI1OCw0MDk2LFhoKV07ZnVuY3Rpb24gJGgoKXt0aGlzLnN0cm09bnVsbCx0aGlzLnN0YXR1cz0wLHRoaXMucGVuZGluZ19idWY9bnVsbCx0aGlzLnBlbmRpbmdfYnVmX3NpemU9MCx0aGlzLnBlbmRpbmdfb3V0PTAsdGhpcy5wZW5kaW5nPTAsdGhpcy53cmFwPTAsdGhpcy5nemhlYWQ9bnVsbCx0aGlzLmd6aW5kZXg9MCx0aGlzLm1ldGhvZD16aCx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgVWludDE2QXJyYXkoMTE0NiksdGhpcy5keW5fZHRyZWU9bmV3IFVpbnQxNkFycmF5KDEyMiksdGhpcy5ibF90cmVlPW5ldyBVaW50MTZBcnJheSg3OCksTGgodGhpcy5keW5fbHRyZWUpLExoKHRoaXMuZHluX2R0cmVlKSxMaCh0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBVaW50MTZBcnJheSgxNiksdGhpcy5oZWFwPW5ldyBVaW50MTZBcnJheSg1NzMpLExoKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBVaW50MTZBcnJheSg1NzMpLExoKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfXZhciBRaD1mdW5jdGlvbihlKXtpZighZXx8IWUuc3RhdGUpcmV0dXJuIEZoKGUsQ2gpO2UudG90YWxfaW49ZS50b3RhbF9vdXQ9MCxlLmRhdGFfdHlwZT1UaDt2YXIgdD1lLnN0YXRlO3JldHVybiB0LnBlbmRpbmc9MCx0LnBlbmRpbmdfb3V0PTAsdC53cmFwPDAmJih0LndyYXA9LXQud3JhcCksdC5zdGF0dXM9dC53cmFwPzQyOnhoLGUuYWRsZXI9Mj09PXQud3JhcD8wOjEsdC5sYXN0X2ZsdXNoPXZoLGxoKHQpLF9ofSxlcD1mdW5jdGlvbihlKXt2YXIgdCxuPVFoKGUpO3JldHVybiBuPT09X2gmJigodD1lLnN0YXRlKS53aW5kb3dfc2l6ZT0yKnQud19zaXplLExoKHQuaGVhZCksdC5tYXhfbGF6eV9tYXRjaD1LaFt0LmxldmVsXS5tYXhfbGF6eSx0Lmdvb2RfbWF0Y2g9S2hbdC5sZXZlbF0uZ29vZF9sZW5ndGgsdC5uaWNlX21hdGNoPUtoW3QubGV2ZWxdLm5pY2VfbGVuZ3RoLHQubWF4X2NoYWluX2xlbmd0aD1LaFt0LmxldmVsXS5tYXhfY2hhaW4sdC5zdHJzdGFydD0wLHQuYmxvY2tfc3RhcnQ9MCx0Lmxvb2thaGVhZD0wLHQuaW5zZXJ0PTAsdC5tYXRjaF9sZW5ndGg9dC5wcmV2X2xlbmd0aD0yLHQubWF0Y2hfYXZhaWxhYmxlPTAsdC5pbnNfaD0wKSxufSx0cD1mdW5jdGlvbihlLHQsbixvLHIsaSl7aWYoIWUpcmV0dXJuIENoO3ZhciBzPTE7aWYodD09PVJoJiYodD02KSxvPDA/KHM9MCxvPS1vKTpvPjE1JiYocz0yLG8tPTE2KSxyPDF8fHI+OXx8biE9PXpofHxvPDh8fG8+MTV8fHQ8MHx8dD45fHxpPDB8fGk+RWgpcmV0dXJuIEZoKGUsQ2gpOzg9PT1vJiYobz05KTt2YXIgYT1uZXcgJGg7cmV0dXJuIGUuc3RhdGU9YSxhLnN0cm09ZSxhLndyYXA9cyxhLmd6aGVhZD1udWxsLGEud19iaXRzPW8sYS53X3NpemU9MTw8YS53X2JpdHMsYS53X21hc2s9YS53X3NpemUtMSxhLmhhc2hfYml0cz1yKzcsYS5oYXNoX3NpemU9MTw8YS5oYXNoX2JpdHMsYS5oYXNoX21hc2s9YS5oYXNoX3NpemUtMSxhLmhhc2hfc2hpZnQ9fn4oKGEuaGFzaF9iaXRzKzMtMSkvMyksYS53aW5kb3c9bmV3IFVpbnQ4QXJyYXkoMiphLndfc2l6ZSksYS5oZWFkPW5ldyBVaW50MTZBcnJheShhLmhhc2hfc2l6ZSksYS5wcmV2PW5ldyBVaW50MTZBcnJheShhLndfc2l6ZSksYS5saXRfYnVmc2l6ZT0xPDxyKzYsYS5wZW5kaW5nX2J1Zl9zaXplPTQqYS5saXRfYnVmc2l6ZSxhLnBlbmRpbmdfYnVmPW5ldyBVaW50OEFycmF5KGEucGVuZGluZ19idWZfc2l6ZSksYS5kX2J1Zj0xKmEubGl0X2J1ZnNpemUsYS5sX2J1Zj0zKmEubGl0X2J1ZnNpemUsYS5sZXZlbD10LGEuc3RyYXRlZ3k9aSxhLm1ldGhvZD1uLGVwKGUpfSxucD1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnN0YXRlPzIhPT1lLnN0YXRlLndyYXA/Q2g6KGUuc3RhdGUuZ3poZWFkPXQsX2gpOkNofSxvcD1mdW5jdGlvbihlLHQpe3ZhciBuLG87aWYoIWV8fCFlLnN0YXRlfHx0PnlofHx0PDApcmV0dXJuIGU/RmgoZSxDaCk6Q2g7dmFyIHI9ZS5zdGF0ZTtpZighZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbnx8ci5zdGF0dXM9PT1XaCYmdCE9PW1oKXJldHVybiBGaChlLDA9PT1lLmF2YWlsX291dD9TaDpDaCk7ci5zdHJtPWU7dmFyIGk9ci5sYXN0X2ZsdXNoO2lmKHIubGFzdF9mbHVzaD10LDQyPT09ci5zdGF0dXMpaWYoMj09PXIud3JhcCllLmFkbGVyPTAsQmgociwzMSksQmgociwxMzkpLEJoKHIsOCksci5nemhlYWQ/KEJoKHIsKHIuZ3poZWFkLnRleHQ/MTowKSsoci5nemhlYWQuaGNyYz8yOjApKyhyLmd6aGVhZC5leHRyYT80OjApKyhyLmd6aGVhZC5uYW1lPzg6MCkrKHIuZ3poZWFkLmNvbW1lbnQ/MTY6MCkpLEJoKHIsMjU1JnIuZ3poZWFkLnRpbWUpLEJoKHIsci5nemhlYWQudGltZT4+OCYyNTUpLEJoKHIsci5nemhlYWQudGltZT4+MTYmMjU1KSxCaChyLHIuZ3poZWFkLnRpbWU+PjI0JjI1NSksQmgociw5PT09ci5sZXZlbD8yOnIuc3RyYXRlZ3k+PUlofHxyLmxldmVsPDI/NDowKSxCaChyLDI1NSZyLmd6aGVhZC5vcyksci5nemhlYWQuZXh0cmEmJnIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKEJoKHIsMjU1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCksQmgocixyLmd6aGVhZC5leHRyYS5sZW5ndGg+PjgmMjU1KSksci5nemhlYWQuaGNyYyYmKGUuYWRsZXI9YWgoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZywwKSksci5nemluZGV4PTAsci5zdGF0dXM9NjkpOihCaChyLDApLEJoKHIsMCksQmgociwwKSxCaChyLDApLEJoKHIsMCksQmgociw5PT09ci5sZXZlbD8yOnIuc3RyYXRlZ3k+PUlofHxyLmxldmVsPDI/NDowKSxCaChyLDMpLHIuc3RhdHVzPXhoKTtlbHNle3ZhciBzPXpoKyhyLndfYml0cy04PDw0KTw8ODtzfD0oci5zdHJhdGVneT49SWh8fHIubGV2ZWw8Mj8wOnIubGV2ZWw8Nj8xOjY9PT1yLmxldmVsPzI6Myk8PDYsMCE9PXIuc3Ryc3RhcnQmJihzfD0zMikscys9MzEtcyUzMSxyLnN0YXR1cz14aCxaaChyLHMpLDAhPT1yLnN0cnN0YXJ0JiYoWmgocixlLmFkbGVyPj4+MTYpLFpoKHIsNjU1MzUmZS5hZGxlcikpLGUuYWRsZXI9MX1pZig2OT09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLmV4dHJhKXtmb3Iobj1yLnBlbmRpbmc7ci5nemluZGV4PCg2NTUzNSZyLmd6aGVhZC5leHRyYS5sZW5ndGgpJiYoci5wZW5kaW5nIT09ci5wZW5kaW5nX2J1Zl9zaXplfHwoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm4mJihlLmFkbGVyPWFoKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbixuKSksamgoZSksbj1yLnBlbmRpbmcsci5wZW5kaW5nIT09ci5wZW5kaW5nX2J1Zl9zaXplKSk7KUJoKHIsMjU1JnIuZ3poZWFkLmV4dHJhW3IuZ3ppbmRleF0pLHIuZ3ppbmRleCsrO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5uJiYoZS5hZGxlcj1haChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW4sbikpLHIuZ3ppbmRleD09PXIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPTczKX1lbHNlIHIuc3RhdHVzPTczO2lmKDczPT09ci5zdGF0dXMpaWYoci5nemhlYWQubmFtZSl7bj1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm4mJihlLmFkbGVyPWFoKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbixuKSksamgoZSksbj1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7bz0xO2JyZWFrfW89ci5nemluZGV4PHIuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZyLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoci5nemluZGV4KyspOjAsQmgocixvKX13aGlsZSgwIT09byk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm4mJihlLmFkbGVyPWFoKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbixuKSksMD09PW8mJihyLmd6aW5kZXg9MCxyLnN0YXR1cz05MSl9ZWxzZSByLnN0YXR1cz05MTtpZig5MT09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLmNvbW1lbnQpe249ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5uJiYoZS5hZGxlcj1haChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW4sbikpLGpoKGUpLG49ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31vPXIuZ3ppbmRleDxyLmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmci5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKTowLEJoKHIsbyl9d2hpbGUoMCE9PW8pO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5uJiYoZS5hZGxlcj1haChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW4sbikpLDA9PT1vJiYoci5zdGF0dXM9RGgpfWVsc2Ugci5zdGF0dXM9RGg7aWYoci5zdGF0dXM9PT1EaCYmKHIuZ3poZWFkLmhjcmM/KHIucGVuZGluZysyPnIucGVuZGluZ19idWZfc2l6ZSYmamgoZSksci5wZW5kaW5nKzI8PXIucGVuZGluZ19idWZfc2l6ZSYmKEJoKHIsMjU1JmUuYWRsZXIpLEJoKHIsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxyLnN0YXR1cz14aCkpOnIuc3RhdHVzPXhoKSwwIT09ci5wZW5kaW5nKXtpZihqaChlKSwwPT09ZS5hdmFpbF9vdXQpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxfaH1lbHNlIGlmKDA9PT1lLmF2YWlsX2luJiZNaCh0KTw9TWgoaSkmJnQhPT1taClyZXR1cm4gRmgoZSxTaCk7aWYoci5zdGF0dXM9PT1XaCYmMCE9PWUuYXZhaWxfaW4pcmV0dXJuIEZoKGUsU2gpO2lmKDAhPT1lLmF2YWlsX2lufHwwIT09ci5sb29rYWhlYWR8fHQhPT12aCYmci5zdGF0dXMhPT1XaCl7dmFyIGE9ci5zdHJhdGVneT09PUloP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuOzspe2lmKDA9PT1lLmxvb2thaGVhZCYmKEdoKGUpLDA9PT1lLmxvb2thaGVhZCkpe2lmKHQ9PT12aClyZXR1cm4gMTticmVha31pZihlLm1hdGNoX2xlbmd0aD0wLG49aGgoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyxuJiYoTmgoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfXJldHVybiBlLmluc2VydD0wLHQ9PT1taD8oTmgoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/Mzo0KTplLmxhc3RfbGl0JiYoTmgoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpPzE6Mn0ocix0KTpyLnN0cmF0ZWd5PT09UGg/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4sbyxyLGkscz1lLndpbmRvdzs7KXtpZihlLmxvb2thaGVhZDw9QWgpe2lmKEdoKGUpLGUubG9va2FoZWFkPD1BaCYmdD09PXZoKXJldHVybiAxO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj0zJiZlLnN0cnN0YXJ0PjAmJihvPXNbcj1lLnN0cnN0YXJ0LTFdKT09PXNbKytyXSYmbz09PXNbKytyXSYmbz09PXNbKytyXSl7aT1lLnN0cnN0YXJ0K0FoO2Rve313aGlsZShvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZyPGkpO2UubWF0Y2hfbGVuZ3RoPUFoLShpLXIpLGUubWF0Y2hfbGVuZ3RoPmUubG9va2FoZWFkJiYoZS5tYXRjaF9sZW5ndGg9ZS5sb29rYWhlYWQpfWlmKGUubWF0Y2hfbGVuZ3RoPj0zPyhuPWhoKGUsMSxlLm1hdGNoX2xlbmd0aC0zKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KG49aGgoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyksbiYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09bWg/KE5oKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0PzM6NCk6ZS5sYXN0X2xpdCYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT8xOjJ9KHIsdCk6S2hbci5sZXZlbF0uZnVuYyhyLHQpO2lmKDMhPT1hJiY0IT09YXx8KHIuc3RhdHVzPVdoKSwxPT09YXx8Mz09PWEpcmV0dXJuIDA9PT1lLmF2YWlsX291dCYmKHIubGFzdF9mbHVzaD0tMSksX2g7aWYoMj09PWEmJih0PT09Ymg/cGgocik6dCE9PXloJiYoZGgociwwLDAsITEpLHQ9PT1naCYmKExoKHIuaGVhZCksMD09PXIubG9va2FoZWFkJiYoci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSkpLGpoKGUpLDA9PT1lLmF2YWlsX291dCkpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxfaH1yZXR1cm4gdCE9PW1oP19oOnIud3JhcDw9MD93aDooMj09PXIud3JhcD8oQmgociwyNTUmZS5hZGxlciksQmgocixlLmFkbGVyPj44JjI1NSksQmgocixlLmFkbGVyPj4xNiYyNTUpLEJoKHIsZS5hZGxlcj4+MjQmMjU1KSxCaChyLDI1NSZlLnRvdGFsX2luKSxCaChyLGUudG90YWxfaW4+PjgmMjU1KSxCaChyLGUudG90YWxfaW4+PjE2JjI1NSksQmgocixlLnRvdGFsX2luPj4yNCYyNTUpKTooWmgocixlLmFkbGVyPj4+MTYpLFpoKHIsNjU1MzUmZS5hZGxlcikpLGpoKGUpLHIud3JhcD4wJiYoci53cmFwPS1yLndyYXApLDAhPT1yLnBlbmRpbmc/X2g6d2gpfSxycD17ZGVmbGF0ZUluaXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHAoZSx0LHpoLDE1LDgsT2gpfSxkZWZsYXRlSW5pdDI6dHAsZGVmbGF0ZVJlc2V0OmVwLGRlZmxhdGVSZXNldEtlZXA6UWgsZGVmbGF0ZVNldEhlYWRlcjpucCxkZWZsYXRlOm9wLGRlZmxhdGVFbmQ6ZnVuY3Rpb24oZSl7aWYoIWV8fCFlLnN0YXRlKXJldHVybiBDaDt2YXIgdD1lLnN0YXRlLnN0YXR1cztyZXR1cm4gNDIhPT10JiY2OSE9PXQmJjczIT09dCYmOTEhPT10JiZ0IT09RGgmJnQhPT14aCYmdCE9PVdoP0ZoKGUsQ2gpOihlLnN0YXRlPW51bGwsdD09PXhoP0ZoKGUsa2gpOl9oKX0sZGVmbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbj10Lmxlbmd0aDtpZighZXx8IWUuc3RhdGUpcmV0dXJuIENoO3ZhciBvPWUuc3RhdGUscj1vLndyYXA7aWYoMj09PXJ8fDE9PT1yJiY0MiE9PW8uc3RhdHVzfHxvLmxvb2thaGVhZClyZXR1cm4gQ2g7aWYoMT09PXImJihlLmFkbGVyPWloKGUuYWRsZXIsdCxuLDApKSxvLndyYXA9MCxuPj1vLndfc2l6ZSl7MD09PXImJihMaChvLmhlYWQpLG8uc3Ryc3RhcnQ9MCxvLmJsb2NrX3N0YXJ0PTAsby5pbnNlcnQ9MCk7dmFyIGk9bmV3IFVpbnQ4QXJyYXkoby53X3NpemUpO2kuc2V0KHQuc3ViYXJyYXkobi1vLndfc2l6ZSxuKSwwKSx0PWksbj1vLndfc2l6ZX12YXIgcz1lLmF2YWlsX2luLGE9ZS5uZXh0X2luLHU9ZS5pbnB1dDtmb3IoZS5hdmFpbF9pbj1uLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxHaChvKTtvLmxvb2thaGVhZD49Mzspe3ZhciBjPW8uc3Ryc3RhcnQsbD1vLmxvb2thaGVhZC0yO2Rve28uaW5zX2g9SmgobyxvLmluc19oLG8ud2luZG93W2MrMy0xXSksby5wcmV2W2Mmby53X21hc2tdPW8uaGVhZFtvLmluc19oXSxvLmhlYWRbby5pbnNfaF09YyxjKyt9d2hpbGUoLS1sKTtvLnN0cnN0YXJ0PWMsby5sb29rYWhlYWQ9MixHaChvKX1yZXR1cm4gby5zdHJzdGFydCs9by5sb29rYWhlYWQsby5ibG9ja19zdGFydD1vLnN0cnN0YXJ0LG8uaW5zZXJ0PW8ubG9va2FoZWFkLG8ubG9va2FoZWFkPTAsby5tYXRjaF9sZW5ndGg9by5wcmV2X2xlbmd0aD0yLG8ubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPWEsZS5pbnB1dD11LGUuYXZhaWxfaW49cyxvLndyYXA9cixfaH0sZGVmbGF0ZUluZm86InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSxpcD1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sc3A9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtuLmxlbmd0aDspe3ZhciBvPW4uc2hpZnQoKTtpZihvKXtpZigib2JqZWN0IiE9PXQobykpdGhyb3cgbmV3IFR5cGVFcnJvcihvKyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IodmFyIHIgaW4gbylpcChvLHIpJiYoZVtyXT1vW3JdKX19cmV0dXJuIGV9LGFwPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49MCxvPWUubGVuZ3RoO248bztuKyspdCs9ZVtuXS5sZW5ndGg7Zm9yKHZhciByPW5ldyBVaW50OEFycmF5KHQpLGk9MCxzPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXt2YXIgdT1lW2ldO3Iuc2V0KHUscykscys9dS5sZW5ndGh9cmV0dXJuIHJ9O3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKGUpeyExfWZvcih2YXIgdXA9bmV3IFVpbnQ4QXJyYXkoMjU2KSxjcD0wO2NwPDI1NjtjcCsrKXVwW2NwXT1jcD49MjUyPzY6Y3A+PTI0OD81OmNwPj0yNDA/NDpjcD49MjI0PzM6Y3A+PTE5Mj8yOjE7dXBbMjU0XT11cFsyNTRdPTE7dmFyIGxwPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBUZXh0RW5jb2RlciYmVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZSlyZXR1cm4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSk7dmFyIHQsbixvLHIsaSxzPWUubGVuZ3RoLGE9MDtmb3Iocj0wO3I8cztyKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQocikpKSYmcisxPHMmJjU2MzIwPT0oNjQ1MTImKG89ZS5jaGFyQ29kZUF0KHIrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoby01NjMyMCkscisrKSxhKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBVaW50OEFycmF5KGEpLGk9MCxyPTA7aTxhO3IrKyk1NTI5Nj09KDY0NTEyJihuPWUuY2hhckNvZGVBdChyKSkpJiZyKzE8cyYmNTYzMjA9PSg2NDUxMiYobz1lLmNoYXJDb2RlQXQocisxKSkpJiYobj02NTUzNisobi01NTI5Njw8MTApKyhvLTU2MzIwKSxyKyspLG48MTI4P3RbaSsrXT1uOm48MjA0OD8odFtpKytdPTE5MnxuPj4+Nix0W2krK109MTI4fDYzJm4pOm48NjU1MzY/KHRbaSsrXT0yMjR8bj4+PjEyLHRbaSsrXT0xMjh8bj4+PjYmNjMsdFtpKytdPTEyOHw2MyZuKToodFtpKytdPTI0MHxuPj4+MTgsdFtpKytdPTEyOHxuPj4+MTImNjMsdFtpKytdPTEyOHxuPj4+NiY2Myx0W2krK109MTI4fDYzJm4pO3JldHVybiB0fTt2YXIgZHA9ZnVuY3Rpb24oKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfSxmcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGhwPWNoLlpfTk9fRkxVU0gscHA9Y2guWl9TWU5DX0ZMVVNILHZwPWNoLlpfRlVMTF9GTFVTSCxicD1jaC5aX0ZJTklTSCxncD1jaC5aX09LLG1wPWNoLlpfU1RSRUFNX0VORCx5cD1jaC5aX0RFRkFVTFRfQ09NUFJFU1NJT04sX3A9Y2guWl9ERUZBVUxUX1NUUkFURUdZLHdwPWNoLlpfREVGTEFURUQ7ZnVuY3Rpb24gQ3AoZSl7dGhpcy5vcHRpb25zPXNwKHtsZXZlbDp5cCxtZXRob2Q6d3AsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTpfcH0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmdC53aW5kb3dCaXRzPjA/dC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHM6dC5nemlwJiZ0LndpbmRvd0JpdHM+MCYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzKz0xNiksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgZHAsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPXJwLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sdC5sZXZlbCx0Lm1ldGhvZCx0LndpbmRvd0JpdHMsdC5tZW1MZXZlbCx0LnN0cmF0ZWd5KTtpZihuIT09Z3ApdGhyb3cgbmV3IEVycm9yKHVoW25dKTtpZih0LmhlYWRlciYmcnAuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sdC5oZWFkZXIpLHQuZGljdGlvbmFyeSl7dmFyIG87aWYobz0ic3RyaW5nIj09dHlwZW9mIHQuZGljdGlvbmFyeT9scCh0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1mcC5jYWxsKHQuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KTp0LmRpY3Rpb25hcnksKG49cnAuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLG8pKSE9PWdwKXRocm93IG5ldyBFcnJvcih1aFtuXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIGtwKGUsdCl7dmFyIG49bmV3IENwKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8dWhbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1DcC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLG8scj10aGlzLnN0cm0saT10aGlzLm9wdGlvbnMuY2h1bmtTaXplO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7Zm9yKG89dD09PX5+dD90OiEwPT09dD9icDpocCwic3RyaW5nIj09dHlwZW9mIGU/ci5pbnB1dD1scChlKToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09ZnAuY2FsbChlKT9yLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOnIuaW5wdXQ9ZSxyLm5leHRfaW49MCxyLmF2YWlsX2luPXIuaW5wdXQubGVuZ3RoOzspaWYoMD09PXIuYXZhaWxfb3V0JiYoci5vdXRwdXQ9bmV3IFVpbnQ4QXJyYXkoaSksci5uZXh0X291dD0wLHIuYXZhaWxfb3V0PWkpLChvPT09cHB8fG89PT12cCkmJnIuYXZhaWxfb3V0PD02KXRoaXMub25EYXRhKHIub3V0cHV0LnN1YmFycmF5KDAsci5uZXh0X291dCkpLHIuYXZhaWxfb3V0PTA7ZWxzZXtpZigobj1ycC5kZWZsYXRlKHIsbykpPT09bXApcmV0dXJuIHIubmV4dF9vdXQ+MCYmdGhpcy5vbkRhdGEoci5vdXRwdXQuc3ViYXJyYXkoMCxyLm5leHRfb3V0KSksbj1ycC5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1ncDtpZigwIT09ci5hdmFpbF9vdXQpe2lmKG8+MCYmci5uZXh0X291dD4wKXRoaXMub25EYXRhKHIub3V0cHV0LnN1YmFycmF5KDAsci5uZXh0X291dCkpLHIuYXZhaWxfb3V0PTA7ZWxzZSBpZigwPT09ci5hdmFpbF9pbilicmVha31lbHNlIHRoaXMub25EYXRhKHIub3V0cHV0KX1yZXR1cm4hMH0sQ3AucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxDcC5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PWdwJiYodGhpcy5yZXN1bHQ9YXAodGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9O3ZhciBTcCxScCxxcCxJcD17RGVmbGF0ZTpDcCxkZWZsYXRlOmtwLGRlZmxhdGVSYXc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4odD10fHx7fSkucmF3PSEwLGtwKGUsdCl9LGd6aXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4odD10fHx7fSkuZ3ppcD0hMCxrcChlLHQpfSxjb25zdGFudHM6Y2h9LmRlZmxhdGUsUHA9KFNwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSksdGhpcy5vT3B0aW9ucz1PYmplY3QuYXNzaWduKHtpUG9ydDotMSxjYkNvbm5lY3RTdWNjZXNzOm51bGwsY2JDb25uZWN0RXJyb3I6bnVsbCxjYkNvbm5lY3RDbG9zZTpudWxsfSx0KSx0aGlzLnN6SG9zdD0iaHR0cDovLzEyNy4wLjAuMSIsdGhpcy5zelVVSUQ9IiIsdGhpcy5zelZlcnNpb249IiIsdGhpcy5iTm9ybWFsQ2xvc2U9ITEsdGhpcy5iQ29ubmVjdGVkPSExLHRoaXMuYkluaXRDb25uZWN0PSEwLHRoaXMuaUdldEVycm9yQ291bnQ9MCx0aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2s9e30sdGhpcy5vU2FkcENhbGxiYWNrPXt9LHRoaXMub1NsaWNlQ2FsbGJhY2s9e30sdGhpcy5vU2VyaWFsQ2FsbGJhY2s9e30sdGhpcy5vVUlDb250cm9sQ2FsbGJhY2s9e30sdGhpcy5vVXBncmFkZUNhbGxiYWNrPXt9LHRoaXMuaW5pdCgpfXJldHVybiByKGUsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PUlkKCksbj17c2VxdWVuY2U6dCxjbWQ6InN5c3RlbS5jb25uZWN0In0sbz1KU09OLnN0cmluZ2lmeShuKTtlLnNlbmRJbWFnZUh0dHAoIiIuY29uY2F0KGUuc3pIb3N0LCI6IikuY29uY2F0KGUub09wdGlvbnMuaVBvcnQsIi9pbWdodHRwL2xvY2FsIiksbyx0LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3ZhciBuPUpTT04ucGFyc2UodCk7ZS5zelVVSUQ9bi51dWlkLGUuc3pWZXJzaW9uPW4udmVyc2lvbixlLmJDb25uZWN0ZWQ9ITAsZS5iSW5pdENvbm5lY3Q9ITEsc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLmltYWdlSHR0cFBvbGxpbmcoKX0pLDEwMCksZS5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzJiZlLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MoKX0sZXJyb3I6ZnVuY3Rpb24oKXt9fSl9fSx7a2V5OiJzZW5kSW1hZ2VIdHRwIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXt2YXIgcj10aGlzO289T2JqZWN0LmFzc2lnbih7c3VjY2VzczpudWxsLGVycm9yOm51bGwsYWJvcnQ6bnVsbH0sbyk7dmFyIGk9SXAodCk7IiIhPT0obmV3IFVpbnQ4QXJyYXkpLnRvU3RyaW5nKCkmJihwZi5pc01hY09TKCl8fHBmLmJyb3dzZXIoKS5tc2llKSYmKGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaSkpO2Zvcih2YXIgcz1lbmNvZGVVUklDb21wb25lbnQoYnRvYShpKSksYT10aGlzLnNwbGl0U3RyKHMpLHU9W10sYz0iIixsPTAsZD1hLmxlbmd0aDtsPGQ7bCsrKWM9bD09PWQtMT8idXBkYXRlPSIuY29uY2F0KChuZXcgRGF0ZSkuZ2V0VGltZSgpLCImaXNMYXN0PXRydWUmZGF0YT0iKS5jb25jYXQoYVtsXSwiJnNlcXVlbmNlPSIpLmNvbmNhdChuKToidXBkYXRlPSIuY29uY2F0KChuZXcgRGF0ZSkuZ2V0VGltZSgpLCImaXNMYXN0PWZhbHNlJmRhdGE9IikuY29uY2F0KGFbbF0sIiZzZXF1ZW5jZT0iKS5jb25jYXQobiksdS5wdXNoKGMpO3UubGVuZ3RoPjAmJmZ1bmN0aW9uIHQoKXtyLmltYWdlSHR0cCgiIi5jb25jYXQoZSwiPyIpLmNvbmNhdCh1WzBdKSx7c3VjY2VzczpmdW5jdGlvbihlKXt1LnNoaWZ0KCksdS5sZW5ndGg+MD8oci5iSW5pdENvbm5lY3R8fHIuYkNvbm5lY3RlZCkmJnQoKTpvLnN1Y2Nlc3MmJm8uc3VjY2VzcyhlKX0sZXJyb3I6ZnVuY3Rpb24oKXtvLmVycm9yJiZvLmVycm9yKCl9LGFib3J0OmZ1bmN0aW9uKCl7by5hYm9ydCYmby5hYm9ydCgpfX0pfSgpfX0se2tleToic3BsaXRTdHIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLmdldEJ5dGVMZW4oZSksbj1bXSxvPTE1MDAscj0wLGk9TWF0aC5jZWlsKHQvbyk7cjxpO3IrKyluW3JdPWUuc2xpY2UobypyLG8qKHIrMSkpO3JldHVybiBufX0se2tleToiZ2V0Qnl0ZUxlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0iIixvPTAscj1lLmxlbmd0aDtvPHI7bysrKW49ZS5jaGFyQXQobyksL1teXHgwMC1ceGZmXS8udGVzdChuKT90Kz0yOnQrPTE7cmV0dXJuIHR9fSx7a2V5OiJpbWFnZUh0dHAiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dD1PYmplY3QuYXNzaWduKHtzdWNjZXNzOm51bGwsZXJyb3I6bnVsbCxhYm9ydDpudWxsfSx0KTt2YXIgbj1uZXcgSW1hZ2U7bi5vbmxvYWQ9ZnVuY3Rpb24oKXtpZih0LnN1Y2Nlc3Mpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLG89ZS5nZXRDb250ZXh0KCIyZCIpLHI9bi53aWR0aCxpPW4uaGVpZ2h0O2Uud2lkdGg9cixlLmhlaWdodD1pO3RyeXtvLmRyYXdJbWFnZShuLDAsMCk7Zm9yKHZhciBzPW8uZ2V0SW1hZ2VEYXRhKDAsMCxyLGkpLmRhdGEsYT0iIix1PS0xLGM9aS0xO2M+PTA7Yy0tKWZvcih2YXIgbD0wO2w8NCpyJiYwIT09c1t1PWMqcio0K2xdO2wrKykyNTUhPT1zW3VdJiYoYSs9U3RyaW5nLmZyb21DaGFyQ29kZShzW3VdKSk7dC5zdWNjZXNzKHBmLnV0Zjh0bzE2KGEpKX1jYXRjaChlKXt0LmVycm9yJiZ0LmVycm9yKCl9fX0sbi5vbmVycm9yPWZ1bmN0aW9uKCl7dC5lcnJvciYmdC5lcnJvcigpfSxuLm9uYWJvcnQ9ZnVuY3Rpb24oKXt0LmFib3J0JiZ0LmFib3J0KCl9LG4uY3Jvc3NPcmlnaW49ImFub255bW91cyIsbi5zcmM9ZX19LHtrZXk6InNldFdpbmRvd0NvbnRyb2xDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vV2luZG93Q29udHJvbENhbGxiYWNrPWV9fSx7a2V5OiJzZXRTYWRwQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub1NhZHBDYWxsYmFjaz1lfX0se2tleToic2V0U2xpY2VDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vU2xpY2VDYWxsYmFjaz1lfX0se2tleToic2V0U2VyaWFsQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub1NlcmlhbENhbGxiYWNrPWV9fSx7a2V5OiJzZXRVSUNvbnRyb2xDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vVUlDb250cm9sQ2FsbGJhY2s9ZX19LHtrZXk6InNldFVwZ3JhZGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vVXBncmFkZUNhbGxiYWNrPWV9fSx7a2V5OiJnZXRTZXJ2aWNlVmVyc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zelZlcnNpb259fSx7a2V5OiJnZXRSZXF1ZXN0VVVJRCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zelVVSUR9fSx7a2V5OiJkaXNjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1JZCgpLG49e3NlcXVlbmNlOnQsdXVpZDplLnN6VVVJRCxjbWQ6InN5c3RlbS5kaXNjb25uZWN0In0sbz1KU09OLnN0cmluZ2lmeShuKTtlLmJDb25uZWN0ZWQmJmUuc2VuZEltYWdlSHR0cCgiIi5jb25jYXQoZS5zekhvc3QsIjoiKS5jb25jYXQoZS5vT3B0aW9ucy5pUG9ydCwiL2ltZ2h0dHAvbG9jYWwiKSxvLHQse3N1Y2Nlc3M6ZnVuY3Rpb24oKXtlLmJOb3JtYWxDbG9zZT0hMCxlLmJDb25uZWN0ZWQ9ITEsZS5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZSYmZS5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZShlLmJOb3JtYWxDbG9zZSl9LGVycm9yOmZ1bmN0aW9uKCl7ZS5iQ29ubmVjdGVkPSExfX0pfX0se2tleToiaW1hZ2VIdHRwUG9sbGluZyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9SWQoKSxuPXtzZXF1ZW5jZTp0LHV1aWQ6ZS5zelVVSUQsY21kOiJzeXN0ZW0uZ2V0In0sbz1KU09OLnN0cmluZ2lmeShuKTtlLmJDb25uZWN0ZWQmJmUuc2VuZEltYWdlSHR0cCgiIi5jb25jYXQoZS5zekhvc3QsIjoiKS5jb25jYXQoZS5vT3B0aW9ucy5pUG9ydCwiL2ltZ2h0dHAvbG9jYWwiKSxvLHQse3N1Y2Nlc3M6ZnVuY3Rpb24odCl7aWYoZS5pR2V0RXJyb3JDb3VudD0wLCJ0aW1lb3V0Ij09PXQpc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLmltYWdlSHR0cFBvbGxpbmcoKX0pLDEwMCk7ZWxzZSBpZigiaW52YWxpZCI9PT10KWUuYkNvbm5lY3RlZD0hMSxlLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yJiZlLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yKCk7ZWxzZSBpZigiY2xvc2VkIj09PXQpY29uc29sZS5sb2coImNvbm5lY3RlZCBpcyBkaXNjb25uZWN0ZWQiKTtlbHNle3ZhciBuPUpTT04ucGFyc2UodCk7dm9pZCAwIT09bi5jbWQ/ZS5wYXJzZUNtZChuKTpjb25zb2xlLmxvZygiW2pzV2ViQ29udHJvbF1pbWdIdHRwUG9sbGluZyBwdXNoIG1lc3NhZ2UgZXJyb3I6Ii5jb25jYXQodCkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5pbWFnZUh0dHBQb2xsaW5nKCl9KSwxMDApfX0sZXJyb3I6ZnVuY3Rpb24oKXs1PT09ZS5pR2V0RXJyb3JDb3VudD8oY29uc29sZS5sb2coIltqc1dlYkNvbnRyb2xdaW1hZ2VIdHRwUG9sbGluZyBnZXQgcG9sbGluZyBmaW5pc2hlZCIpLGUuYk5vcm1hbENsb3NlPSExLGUuYkNvbm5lY3RlZD0hMSxlLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlJiZlLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlKGUuYk5vcm1hbENsb3NlKSk6c2V0VGltZW91dCgoZnVuY3Rpb24oKXtjb25zb2xlLmxvZygiW2pzV2ViQ29udHJvbF1pbWdIdHRwUG9sbGluZyBnZXQgcG9sbGluZyBmYWlsZWQiKSxlLmlHZXRFcnJvckNvdW50KyssZS5pbWFnZUh0dHBQb2xsaW5nKCl9KSwxMDApfX0pfX0se2tleToic2VuZFJlcXVlc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe3ZhciByPWUuY21kLnNwbGl0KCIuIiksaT0iIjtyLmxlbmd0aD4xP2k9ImxhcHV0YSI9PT1yWzBdPyJsYXB1dGEiOiJsb2NhbCI6bygpO3ZhciBzPUlkKCk7ZS5zZXF1ZW5jZT1zLGUudXVpZD10LnN6VVVJRCxlLnRpbWVzdGFtcD0iIi5jb25jYXQoKG5ldyBEYXRlKS5nZXRUaW1lKCkpO3ZhciBhPUpTT04uc3RyaW5naWZ5KGUpO3QuYkNvbm5lY3RlZD90LnNlbmRJbWFnZUh0dHAoIiIuY29uY2F0KHQuc3pIb3N0LCI6IikuY29uY2F0KHQub09wdGlvbnMuaVBvcnQsIi9pbWdodHRwLyIpLmNvbmNhdChpKSxhLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShlKTswPT09dC5lcnJvck1vZHVsZSYmMD09PXQuZXJyb3JDb2RlP24odCk6byh0KX0sZXJyb3I6ZnVuY3Rpb24oKXtvKCl9fSk6bygpfSkpfX0se2tleToicGFyc2VDbWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuY21kLnNwbGl0KCIuIiksbj10WzFdLnJlcGxhY2UoL15bYS16XXsxfS9nLChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfSkpOyJ3aW5kb3ciPT09dFswXXx8InBsYXkiPT09dFswXT90aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJzYWRwIj09PXRbMF0/dGhpcy5vU2FkcENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vU2FkcENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXShlKToic2VyaWFsIj09PXRbMF0/dGhpcy5vU2VyaWFsQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9TZXJpYWxDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InNsaWNlIj09PXRbMF0/dGhpcy5vU2xpY2VDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1NsaWNlQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJ1aSI9PT10WzBdP3RoaXMub1VJQ29udHJvbENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vVUlDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJ1cGdyYWRlIj09PXRbMF0mJnRoaXMub1VwZ3JhZGVDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1VwZ3JhZGVDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSl9fV0pLGV9KCksU3ApLEVwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSksdGhpcy5vT3B0aW9ucz1PYmplY3QuYXNzaWduKHtzelBsdWdpbkNvbnRhaW5lcjoiIixpUG9ydDotMSxjYkNvbm5lY3RTdWNjZXNzOm51bGwsY2JDb25uZWN0RXJyb3I6bnVsbCxjYkNvbm5lY3RDbG9zZTpudWxsLHN6Q2xhc3NJZDoiIn0sdCksdGhpcy5vUGx1Z2luPW51bGwsdGhpcy5zelBsdWdpbklkPSIiLHRoaXMuc3pVVUlEPSIiLHRoaXMuc3pWZXJzaW9uPSIiLHRoaXMub1JlcXVlc3RMaXN0PXt9LHRoaXMuYk5vcm1hbENsb3NlPSExLHRoaXMuYU1lc3NhZ2U9W10sdGhpcy5vV2luZG93Q29udHJvbENhbGxiYWNrPXt9LHRoaXMub1NhZHBDYWxsYmFjaz17fSx0aGlzLm9TbGljZUNhbGxiYWNrPXt9LHRoaXMub1NlcmlhbENhbGxiYWNrPXt9LHRoaXMub1VJQ29udHJvbENhbGxiYWNrPXt9LHRoaXMub1VwZ3JhZGVDYWxsYmFjaz17fSx0aGlzLmluaXQoKX1yZXR1cm4gcihlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5pbml0UGx1Z2luKCksZS5vUGx1Z2luLm9iamVjdCYmZS5vUGx1Z2luLmNyZWF0ZVNvY2tldCgid3M6Ly8xMjcuMC4wLjE6Ii5jb25jYXQoZS5vT3B0aW9ucy5pUG9ydCkpfX0se2tleToiaW5pdFBsdWdpbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuc3pQbHVnaW5JZD0id2ViQWN0aXZlWF8iLmNvbmNhdCgobmV3IERhdGUpLmdldFRpbWUoKSk7dmFyIHQ9IjxvYmplY3QgaWQ9JyIuY29uY2F0KHRoaXMuc3pQbHVnaW5JZCwiJyBjbGFzc2lkPSdjbHNpZDoiKS5jb25jYXQoZS5vT3B0aW9ucy5zekNsYXNzSWQsIicgY29kZWJhc2U9Jycgc3RhbmRieT0nV2FpdGluZy4uLicgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScgYWxpZ249J2NlbnRlcicgPjwvb2JqZWN0PiIpLG49ZS5vT3B0aW9ucy5zelBsdWdpbkNvbnRhaW5lcjtpZigiIj09PW4pe249IiIuY29uY2F0KHRoaXMuc3pQbHVnaW5JZCwiX2RpdiIpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uaWQ9bixkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobyl9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobikuaW5uZXJIVE1MPXQsZS5vUGx1Z2luPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3pQbHVnaW5JZCksd2luZG93Lm9uQ29ubmVjdE1lc3NhZ2U9ZnVuY3Rpb24odCxuKXtuPyhlLmFNZXNzYWdlLnB1c2godCksZS5vbkNvbm5lY3RNZXNzYWdlKGUuYU1lc3NhZ2Uuam9pbigiIikpLGUuYU1lc3NhZ2UubGVuZ3RoPTApOmUuYU1lc3NhZ2UucHVzaCh0KX0sd2luZG93Lm9uQ29ubmVjdENsb3NlPWZ1bmN0aW9uKCl7ZS5vbkNvbm5lY3RDbG9zZSgpfSx3aW5kb3cub25Db25uZWN0RXJyb3I9ZnVuY3Rpb24oKXtlLm9uQ29ubmVjdEVycm9yKCl9LHdpbmRvdy5vbkNvbm5lY3RDbG9zZUV4Y2VwdGlvbj1mdW5jdGlvbigpe2Uub25Db25uZWN0Q2xvc2VFeGNlcHRpb24oKX0sd2luZG93Lm9uQ29ubmVjdE9wZW49ZnVuY3Rpb24oKXtlLm9uQ29ubmVjdE9wZW4oKX0scGYuY3JlYXRlRXZlbnRTY3JpcHQodGhpcy5zelBsdWdpbklkLCJvbkNvbm5lY3RNZXNzYWdlKHN6RGF0YSwgYkxhc3QpIiwib25Db25uZWN0TWVzc2FnZShzekRhdGEsIGJMYXN0KTsiKSxwZi5jcmVhdGVFdmVudFNjcmlwdCh0aGlzLnN6UGx1Z2luSWQsIm9uQ29ubmVjdENsb3NlKCkiLCJvbkNvbm5lY3RDbG9zZSgpOyIpLHBmLmNyZWF0ZUV2ZW50U2NyaXB0KHRoaXMuc3pQbHVnaW5JZCwib25Db25uZWN0RXJyb3IoKSIsIm9uQ29ubmVjdEVycm9yKCk7IikscGYuY3JlYXRlRXZlbnRTY3JpcHQodGhpcy5zelBsdWdpbklkLCJvbkNvbm5lY3RDbG9zZUV4Y2VwdGlvbigpIiwib25Db25uZWN0Q2xvc2VFeGNlcHRpb24oKTsiKSxwZi5jcmVhdGVFdmVudFNjcmlwdCh0aGlzLnN6UGx1Z2luSWQsIm9uQ29ubmVjdE9wZW4oKSIsIm9uQ29ubmVjdE9wZW4oKTsiKX19LHtrZXk6Im9uQ29ubmVjdE1lc3NhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoZSl7dmFyIG49SlNPTi5wYXJzZShlKSxvPW4uc2VxdWVuY2U7dm9pZCAwPT09byYmdm9pZCAwPT09bi5jbWQ/KHQuc3pVVUlEPW4udXVpZCx0LnN6VmVyc2lvbj1uLnZlcnNpb24sdC5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzJiZ0Lm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MoKSk6dm9pZCAwIT09bi5jbWQ/dC5wYXJzZUNtZChuKTp2b2lkIDAhPT10Lm9SZXF1ZXN0TGlzdFtvXSYmKDA9PT1uLmVycm9yTW9kdWxlJiYwPT09bi5lcnJvckNvZGU/dC5vUmVxdWVzdExpc3Rbb10ucmVzb2x2ZShuKTp0Lm9SZXF1ZXN0TGlzdFtvXS5yZWplY3QobiksZGVsZXRlIHQub1JlcXVlc3RMaXN0W29dKX19fSx7a2V5OiJvbkNvbm5lY3RDbG9zZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLm9QbHVnaW49bnVsbCwiIiE9PXRoaXMuc3pQbHVnaW5JZCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zelBsdWdpbklkKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIiIuY29uY2F0KHRoaXMuc3pQbHVnaW5JZCwiX2RpdiIpKTtudWxsIT09dCYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfXRoaXMub09wdGlvbnMuY2JDb25uZWN0Q2xvc2UmJnRoaXMub09wdGlvbnMuY2JDb25uZWN0Q2xvc2UodGhpcy5iTm9ybWFsQ2xvc2UpfX0se2tleToib25Db25uZWN0Q2xvc2VFeGNlcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uub1BsdWdpbi5vYmplY3QmJmUub1BsdWdpbi5jbG9zZVNvY2tldCgpfSksMWUzKX19LHtrZXk6Im9uQ29ubmVjdE9wZW4iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9e3NlcXVlbmNlOklkKCksY21kOiJzeXN0ZW0uY29ubmVjdCJ9LHQ9SlNPTi5zdHJpbmdpZnkoZSk7dGhpcy5vUGx1Z2luLm9iamVjdCYmdGhpcy5vUGx1Z2luLnNlbmRSZXF1ZXN0KHQpfX0se2tleToib25Db25uZWN0RXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToic2V0V2luZG93Q29udHJvbENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2s9ZX19LHtrZXk6InNldFNhZHBDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vU2FkcENhbGxiYWNrPWV9fSx7a2V5OiJzZXRTbGljZUNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9TbGljZUNhbGxiYWNrPWV9fSx7a2V5OiJzZXRTZXJpYWxDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vU2VyaWFsQ2FsbGJhY2s9ZX19LHtrZXk6InNldFVJQ29udHJvbENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9VSUNvbnRyb2xDYWxsYmFjaz1lfX0se2tleToic2V0VXBncmFkZUNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9VcGdyYWRlQ2FsbGJhY2s9ZX19LHtrZXk6ImdldFNlcnZpY2VWZXJzaW9uIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN6VmVyc2lvbn19LHtrZXk6ImdldFJlcXVlc3RVVUlEIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN6VVVJRH19LHtrZXk6ImRpc2Nvbm5lY3QiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5iTm9ybWFsQ2xvc2U9ITAsdGhpcy5vUGx1Z2luJiZ0aGlzLm9QbHVnaW4ub2JqZWN0JiZ0aGlzLm9QbHVnaW4uY2xvc2VTb2NrZXQoKX19LHtrZXk6InNlbmRSZXF1ZXN0Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiJ3aW5kb3cuaGlkZVduZCI9PT1lLmNtZD90Lm9QbHVnaW4mJnQub1BsdWdpbi5vYmplY3QmJih0Lm9QbHVnaW4uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIik6IndpbmRvdy5zaG93V25kIj09PWUuY21kJiZ0Lm9QbHVnaW4mJnQub1BsdWdpbi5vYmplY3QmJih0Lm9QbHVnaW4uc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe3ZhciByPUlkKCk7ZS5zZXF1ZW5jZT1yLHQub1JlcXVlc3RMaXN0W3JdPXtyZXNvbHZlOm4scmVqZWN0Om99LGUudXVpZD10LnN6VVVJRCxlLnRpbWVzdGFtcD0iIi5jb25jYXQoKG5ldyBEYXRlKS5nZXRUaW1lKCkpO3ZhciBpPUpTT04uc3RyaW5naWZ5KGUpO3Qub1BsdWdpbiYmdC5vUGx1Z2luLm9iamVjdD90Lm9QbHVnaW4uc2VuZFJlcXVlc3QoaSk6bygpfSkpfX0se2tleToicGFyc2VDbWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuY21kLnNwbGl0KCIuIiksbj10WzFdLnJlcGxhY2UoL15bYS16XXsxfS9nLChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfSkpOyJ3aW5kb3ciPT09dFswXXx8InBsYXkiPT09dFswXT90aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJzYWRwIj09PXRbMF0/dGhpcy5vU2FkcENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vU2FkcENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXShlKToic2VyaWFsIj09PXRbMF0/dGhpcy5vU2VyaWFsQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9TZXJpYWxDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InNsaWNlIj09PXRbMF0/dGhpcy5vU2xpY2VDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1NsaWNlQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJ1aSI9PT10WzBdP3RoaXMub1VJQ29udHJvbENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vVUlDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJ1cGdyYWRlIj09PXRbMF0mJnRoaXMub1VwZ3JhZGVDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1VwZ3JhZGVDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSl9fV0pLGV9KCksT3A9KFJwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSksdGhpcy5vT3B0aW9ucz1PYmplY3QuYXNzaWduKHtzelBsdWdpbkNvbnRhaW5lcjoiIixjYkNvbm5lY3RTdWNjZXNzOm51bGwsY2JDb25uZWN0RXJyb3I6bnVsbCxjYkNvbm5lY3RDbG9zZTpudWxsLGlTZXJ2aWNlUG9ydFN0YXJ0Oi0xLGlTZXJ2aWNlUG9ydEVuZDotMSxzekNsYXNzSWQ6IiJ9LHQpLHRoaXMuaVBvcnQ9LTEsdGhpcy5vUmVxdWVzdD1udWxsLHRoaXMuYkluaXQ9ITEsdGhpcy5vQ2FsbGJhY2tzPXt9LHRoaXMuaW5pdCgpfXJldHVybiByKGUsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztwZi5kZXRlY3RQb3J0KGUub09wdGlvbnMuaVNlcnZpY2VQb3J0U3RhcnQsZS5vT3B0aW9ucy5pU2VydmljZVBvcnRFbmQse3N1Y2Nlc3M6ZnVuY3Rpb24odCl7aWYoZS5pUG9ydD10LHBmLmJyb3dzZXIoKS5tc2llKSIxMS4wIj09PXBmLmJyb3dzZXIoKS52ZXJzaW9uPyJodHRwczoiPT09d2luZG93LmxvY2F0aW9uLnByb3RvY29sP2Uub1JlcXVlc3Q9bmV3IFBwKHtpUG9ydDplLmlQb3J0LGNiQ29ubmVjdFN1Y2Nlc3M6ZS5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzLGNiQ29ubmVjdEVycm9yOmUub09wdGlvbnMuY2JDb25uZWN0RXJyb3IsY2JDb25uZWN0Q2xvc2U6ZS5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZX0pOmUub1JlcXVlc3Q9bmV3IF9mKHtpUG9ydDplLmlQb3J0LGNiQ29ubmVjdFN1Y2Nlc3M6ZS5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzLGNiQ29ubmVjdEVycm9yOmUub09wdGlvbnMuY2JDb25uZWN0RXJyb3IsY2JDb25uZWN0Q2xvc2U6ZS5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZX0pOmUub1JlcXVlc3Q9bmV3IEVwKHtzelBsdWdpbkNvbnRhaW5lcjplLm9PcHRpb25zLnN6UGx1Z2luQ29udGFpbmVyLGlQb3J0OmUuaVBvcnQsY2JDb25uZWN0U3VjY2VzczplLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MsY2JDb25uZWN0RXJyb3I6ZS5vT3B0aW9ucy5jYkNvbm5lY3RFcnJvcixjYkNvbm5lY3RDbG9zZTplLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlLHN6Q2xhc3NJZDplLm9PcHRpb25zLnN6Q2xhc3NJZH0pO2Vsc2UgaWYoImh0dHBzOiI9PT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpaWYocGYuYnJvd3NlcigpLmNocm9tZSl0cnl7ZS5vUmVxdWVzdD1uZXcgX2Yoe2lQb3J0OmUuaVBvcnQsY2JDb25uZWN0U3VjY2VzczplLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MsY2JDb25uZWN0RXJyb3I6ZS5vT3B0aW9ucy5jYkNvbm5lY3RFcnJvcixjYkNvbm5lY3RDbG9zZTplLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlfSl9Y2F0Y2godCl7ZS5vUmVxdWVzdD1uZXcgUHAoe2lQb3J0OmUuaVBvcnQsY2JDb25uZWN0U3VjY2VzczplLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MsY2JDb25uZWN0RXJyb3I6ZS5vT3B0aW9ucy5jYkNvbm5lY3RFcnJvcixjYkNvbm5lY3RDbG9zZTplLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlfSl9ZWxzZSBlLm9SZXF1ZXN0PW5ldyBQcCh7aVBvcnQ6ZS5pUG9ydCxjYkNvbm5lY3RTdWNjZXNzOmUub09wdGlvbnMuY2JDb25uZWN0U3VjY2VzcyxjYkNvbm5lY3RFcnJvcjplLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yLGNiQ29ubmVjdENsb3NlOmUub09wdGlvbnMuY2JDb25uZWN0Q2xvc2V9KTtlbHNlIldlYlNvY2tldCJpbiB3aW5kb3cmJihlLm9SZXF1ZXN0PW5ldyBfZih7aVBvcnQ6ZS5pUG9ydCxjYkNvbm5lY3RTdWNjZXNzOmUub09wdGlvbnMuY2JDb25uZWN0U3VjY2VzcyxjYkNvbm5lY3RFcnJvcjplLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yLGNiQ29ubmVjdENsb3NlOmUub09wdGlvbnMuY2JDb25uZWN0Q2xvc2V9KSk7Zm9yKHZhciBuIGluIGUuYkluaXQ9ITAsZS5vQ2FsbGJhY2tzKWUub1JlcXVlc3Rbbl0oZS5vQ2FsbGJhY2tzW25dKX0sZXJyb3I6ZnVuY3Rpb24oKXtlLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yJiZlLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yKCl9fSl9fSx7a2V5OiJzZXRXaW5kb3dDb250cm9sQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuYkluaXQ/dGhpcy5vUmVxdWVzdC5zZXRXaW5kb3dDb250cm9sQ2FsbGJhY2soZSk6dGhpcy5vQ2FsbGJhY2tzLnNldFdpbmRvd0NvbnRyb2xDYWxsYmFjaz1lfX0se2tleToic2V0U2FkcENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmJJbml0P3RoaXMub1JlcXVlc3Quc2V0U2FkcENhbGxiYWNrKGUpOnRoaXMub0NhbGxiYWNrcy5zZXRTYWRwQ2FsbGJhY2s9ZX19LHtrZXk6InNldFNsaWNlQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuYkluaXQ/dGhpcy5vUmVxdWVzdC5zZXRTbGljZUNhbGxiYWNrKGUpOnRoaXMub0NhbGxiYWNrcy5zZXRTbGljZUNhbGxiYWNrPWV9fSx7a2V5OiJzZXRTZXJpYWxDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5iSW5pdD90aGlzLm9SZXF1ZXN0LnNldFNlcmlhbENhbGxiYWNrKGUpOnRoaXMub0NhbGxiYWNrcy5zZXRTZXJpYWxDYWxsYmFjaz1lfX0se2tleToic2V0VUlDb250cm9sQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuYkluaXQ/dGhpcy5vUmVxdWVzdC5zZXRVSUNvbnRyb2xDYWxsYmFjayhlKTp0aGlzLm9DYWxsYmFja3Muc2V0VUlDb250cm9sQ2FsbGJhY2s9ZX19LHtrZXk6InNldFVwZ3JhZGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5iSW5pdD90aGlzLm9SZXF1ZXN0LnNldFVwZ3JhZGVDYWxsYmFjayhlKTp0aGlzLm9DYWxsYmFja3Muc2V0VXBncmFkZUNhbGxiYWNrPWV9fSx7a2V5OiJnZXRTZXJ2aWNlVmVyc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5nZXRTZXJ2aWNlVmVyc2lvbigpfX0se2tleToiZ2V0UmVxdWVzdFVVSUQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZ2V0UmVxdWVzdFVVSUQoKX19LHtrZXk6InN0YXJ0U2VydmljZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj17Y21kOiJzeXN0ZW0uc3RhcnRTZXJ2aWNlIix0eXBlOmV9O3JldHVybiB2b2lkIDAhPT10JiYobi5vcHRpb25zPXQpLHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qobil9fSx7a2V5OiJzdG9wU2VydmljZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4sbyl7bnVsbCE9PXQub1JlcXVlc3Q/dC5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0uc3RvcFNlcnZpY2UiLHR5cGU6ZX0pLnRoZW4oKGZ1bmN0aW9uKGUpe24oZSl9KSwoZnVuY3Rpb24oZSl7byhlKX0pKTpvKCl9KSl9fSx7a2V5OiJkaXNjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe251bGwhPT1lLm9SZXF1ZXN0PyhlLm9SZXF1ZXN0LmRpc2Nvbm5lY3QoKSx0KCJjYkNvbm5lY3RDbG9zZSBjYWxsYmFjayBpcyByZWFsbHkgc3VjY2VzcyIpKTpuKCl9KSl9fSx7a2V5OiJvcGVuRGlyZWN0b3J5Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0ub3BlbkRpcmVjdG9yeSIscGF0aDplfSl9fSx7a2V5OiJvcGVuRmlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InN5c3RlbS5vcGVuRmlsZSIscGF0aDplLHJlbGF0aXZlOnQsdmVyc2lvbjpufSl9fSx7a2V5OiJzZWxlY3REaXJlY3RvcnkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8scil7bnVsbCE9PW4ub1JlcXVlc3Q/bi5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0uc2VsZWN0RGlyZWN0b3J5IixjYXB0aW9uOnZvaWQgMCE9PWUmJiIiIT09ZT9wZi5CYXNlNjQoKS5lbmNvZGUoZSk6IiIsZGlyOnZvaWQgMCE9PXQmJiIiIT09dD9wZi5CYXNlNjQoKS5lbmNvZGUodCk6IiJ9KS50aGVuKChmdW5jdGlvbihlKXsiIiE9PWUucGF0aCYmKGUucGF0aD1wZi5CYXNlNjQoKS5kZWNvZGUoZS5wYXRoKSksbyhlKX0pLChmdW5jdGlvbihlKXtyKGUpfSkpOnIoKX0pKX19LHtrZXk6InNlbGVjdEZpbGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixpKXtudWxsIT09by5vUmVxdWVzdD9vLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InN5c3RlbS5zZWxlY3RGaWxlIixjYXB0aW9uOiIiIT09ZT9wZi5CYXNlNjQoKS5lbmNvZGUoZSk6IiIsZGlyOiIiIT09dD9wZi5CYXNlNjQoKS5lbmNvZGUodCk6IiIsZmlsdGVyOm59KS50aGVuKChmdW5jdGlvbihlKXsiIiE9PWUucGF0aCYmKGUucGF0aD1wZi5CYXNlNjQoKS5kZWNvZGUoZS5wYXRoKSkscihlKX0pLChmdW5jdGlvbihlKXtpKGUpfSkpOmkoKX0pKX19LHtrZXk6ImdldExvY2FsQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0uZ2V0TG9jYWxDb25maWciLGRlZmF1bHQ6ZX0pfX0se2tleToic2V0TG9jYWxDb25maWciLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmNtZD0ic3lzdGVtLnNldExvY2FsQ29uZmlnIix0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KGUpfX0se2tleToiY3JlYXRlV25kIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIsaSxzKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XT9hcmd1bWVudHNbN106IiI7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmNyZWF0ZVduZCIscmVjdDp7bGVmdDplLHRvcDp0LHdpZHRoOm4saGVpZ2h0Om99LGNsYXNzTmFtZTpyLGVtYmVkOmksYWN0aXZlWFBhcmVudFduZDpzLEhXTkQ6YX0pfX0se2tleToic2hvd1duZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuc2hvd1duZCJ9KX19LHtrZXk6ImhpZGVXbmQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmhpZGVXbmQifSl9fSx7a2V5OiJkZXN0cm95V25kIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe251bGwhPT1lLm9SZXF1ZXN0P2Uub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmRlc3Ryb3lXbmQifSkudGhlbigoZnVuY3Rpb24oZSl7dChlKX0pLChmdW5jdGlvbihlKXtuKGUpfSkpOm4oKX0pKX19LHtrZXk6InNldFduZEdlb21ldHJ5Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuc2V0V25kR2VvbWV0cnkiLHJlY3Q6e2xlZnQ6ZSx0b3A6dCx3aWR0aDpuLGhlaWdodDpvfX0pfX0se2tleToic2V0V25kQ292ZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8scil7bnVsbCE9PW4ub1JlcXVlc3Q/bi5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuc2V0V25kQ292ZXIiLHBvc2l0aW9uOmUsc2l6ZTp0fSkudGhlbigoZnVuY3Rpb24oZSl7byhlKX0pLChmdW5jdGlvbihlKXtyKGUpfSkpOnIoKX0pKX19LHtrZXk6ImN1dHRpbmdQYXJ0V2luZG93Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIpe3ZhciBpPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe251bGwhPT1pLm9SZXF1ZXN0P2kub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmN1dHRpbmdQYXJ0V2luZG93IixyZWN0OntsZWZ0OmUsdG9wOnQsd2lkdGg6bixoZWlnaHQ6b30scm91bmQ6cn0pLnRoZW4oKGZ1bmN0aW9uKGUpe3MoZSl9KSwoZnVuY3Rpb24oZSl7YShlKX0pKTphKCl9KSl9fSx7a2V5OiJyZXBhaXJQYXJ0V2luZG93Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIpe3ZhciBpPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe251bGwhPT1pLm9SZXF1ZXN0P2kub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnJlcGFpclBhcnRXaW5kb3ciLHJlY3Q6e2xlZnQ6ZSx0b3A6dCx3aWR0aDpuLGhlaWdodDpvfSxyb3VuZDpyfSkudGhlbigoZnVuY3Rpb24oZSl7cyhlKX0pLChmdW5jdGlvbihlKXthKGUpfSkpOmEoKX0pKX19LHtrZXk6InNldFduZFpPcmRlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNldFduZFpPcmRlciIsZmxhZzplfSl9fSx7a2V5OiJjaGFuZ2VQbGF5TW9kZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmNoYW5nZVBsYXlNb2RlIix0eXBlOmV9KX19LHtrZXk6InNldExhbmd1YWdlVHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNldExhbmd1YWdlVHlwZSIsdHlwZTplfSl9fSx7a2V5OiJpbml0TG9naW5JbmZvIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuaW5pdExvZ2luSW5mbyIsdnNtQWRkcmVzczplLnZzbUFkZHJlc3MsdnNtUG9ydDplLnZzbVBvcnQsc2Vzc2lvbklEOmUuc2Vzc2lvbklELGxvZ2luTW9kZWw6ZS5sb2dpbk1vZGVsLHVzZXJUeXBlOmUudXNlclR5cGUsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZX0pfX0se2tleToic2V0VHJhbnNsYXRlRmlsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNldFRyYW5zbGF0ZUZpbGUiLHVybDplfSl9fSx7a2V5OiJzd2l0Y2hUb1NpbXBsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnN3aXRjaFRvU2ltcGxlIixzaW1wbGU6ZX0pfX0se2tleToic2V0VnNtVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuc2V0VnNtVG9rZW4iLHRva2VuOmV9KX19LHtrZXk6InN0YXJ0UGxheSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sbyxyLGkscyxhLHUpe3ZhciBjPXtjbWQ6InBsYXkuc3RhcnRQbGF5Iix1cmw6ZSx1c2VybmFtZTp0LHBhc3N3b3JkOm4sc2l0ZUlEOm8sYXJlYU5hbWU6cGYuQmFzZTY0KCkuZW5jb2RlKHIpLGNhbWVyYU5hbWU6cGYuQmFzZTY0KCkuZW5jb2RlKGkpLHBlcm1pc3Npb246cyx3bmRJbmRleDphfTtyZXR1cm4gdm9pZCAwIT09dSYmKGMub3B0aW9ucz11LHZvaWQgMCE9PWMub3B0aW9ucy5zaXRlTmFtZSYmKGMub3B0aW9ucy5zaXRlTmFtZT1wZi5CYXNlNjQoKS5lbmNvZGUoYy5vcHRpb25zLnNpdGVOYW1lKSkpLHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3QoYyl9fSx7a2V5OiJzZXRQcmV2aWV3M0RQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zZXRQcmV2aWV3M0RQb3NpdGlvbiIsb3BlbjplfSl9fSx7a2V5OiJzdG9wVG90YWwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7bnVsbCE9PWUub1JlcXVlc3Q/ZS5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJwbGF5LnN0b3BUb3RhbCJ9KS50aGVuKChmdW5jdGlvbihlKXt0KGUpfSksKGZ1bmN0aW9uKGUpe24oZSl9KSk6bigpfSkpfX0se2tleToic2V0RHJhZ01vZGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuc2V0RHJhZ01vZGUiLGRyYWc6ZX0pfX0se2tleToic2hvd0Vycm9ySW5mb0luRnVsbFNjcmVlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zaG93RXJyb3JJbmZvSW5GdWxsU2NyZWVuIixlcnJvcjpwZi5CYXNlNjQoKS5lbmNvZGUoZSl9KX19LHtrZXk6InNldE51bWJlck9mV2luZG93cyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zZXROdW1iZXJPZldpbmRvd3MiLG51bWJlcjplfSl9fSx7a2V5OiJpbml0Q2FyZFJlYWRlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2VyaWFsLkFDU0luaXRDYXJkUmVhZGVyIixwYXJhbTplfSl9fSx7a2V5OiJ1bkluaXRDYXJkUmVhZGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InNlcmlhbC5BQ1NVbkluaXRDYXJkUmVhZGVyIn0pfX0se2tleToic3RhcnRBdXRvTW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RhcnRBdXRvTW9kZSJ9KX19LHtrZXk6InN0b3BBdXRvTW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RvcEF1dG9Nb2RlIn0pfX0se2tleToiaW5pdEZpbmdlcnByaW50Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTSW5pdEZpbmdlcnByaW50IixwYXJhbTplfSl9fSx7a2V5OiJ1bkluaXRGaW5nZXJwcmludCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTVW5Jbml0RmluZ2VycHJpbnQifSl9fSx7a2V5OiJzdGFydENvbGxlY3RGaW5nZXJwcmludCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RhcnRDb2xsZWN0RmluZ2VycHJpbnQifSl9fSx7a2V5OiJzdG9wQ29sbGVjdEZpbmdlcnByaW50Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InNlcmlhbC5BQ1NTdG9wQ29sbGVjdEZpbmdlcnByaW50In0pfX0se2tleToiaXNDb2xsZWN0aW5nRmluZ2VycHJpbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2VyaWFsLkFDU0lzQ29sbGVjdGluZ0ZpbmdlcnByaW50In0pfX0se2tleToiaW5pdFZpZGVvY2FwdHVyZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFqb3JUaXRsZT1wZi5CYXNlNjQoKS5lbmNvZGUoZS5tYWpvclRpdGxlKSxlLnRpcD1wZi5CYXNlNjQoKS5lbmNvZGUoZS50aXApLGUuY2FwdHVyZUJ0blR4dD1wZi5CYXNlNjQoKS5lbmNvZGUoZS5jYXB0dXJlQnRuVHh0KSxlLlVTQlJlbW92ZWRUaXA9cGYuQmFzZTY0KCkuZW5jb2RlKGUuVVNCUmVtb3ZlZFRpcCksdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RhcnRDb2xsZWN0SW1hZ2UiLHBhcmFtOmV9KX19LHtrZXk6InVuSW5pdFZpZGVvY2FwdHVyZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RvcENvbGxlY3RJbWFnZSJ9KX19LHtrZXk6InJlZ2lzdGVyRGV2aWNlVHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2FkcC5yZWdpc3REZXZpY2VUeXBlIixkZXZpY2VUeXBlOmV9KX19LHtrZXk6ImFjdGl2ZU9ubGluZURldmljZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzYWRwLmFjdGl2ZURldmljZSIsc2VyaWFsTnVtYmVyOmUscGFzc3dvcmQ6dH0pfX0se2tleToicmVmcmVzaERldmljZUxpc3QiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2FkcC5yZWZyZXNoRGV2aWNlTGlzdCJ9KX19LHtrZXk6Im1vZGlmeURldmljZU5ldFBhcmFtIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIsaSxzKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzYWRwLm1vZGlmeURldmljZVBhcmFtIixtYWNBZGRyZXNzOmUscGFzc3dvcmQ6dCxpcHY0QWRkcmVzczpuLGlwdjRHYXRld2F5Om8saXB2NFN1Ym5ldE1hc2s6cixwb3J0OmksaHR0cFBvcnQ6c30pfX0se2tleToiZXhwb3J0S2V5RmlsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2FkcC5leHBvcnRLZXlGaWxlIixzZXJpYWxOdW1iZXI6ZX0pfX0se2tleToiaW1wb3J0S2V5RmlsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzYWRwLmltcG9ydEtleUZpbGUifSl9fSx7a2V5OiJyZXNldFBhc3N3b3JkIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzYWRwLnJlc2V0UGFzc3dvcmQiLHNlcmlhbE51bWJlcjplLHBhc3N3b3JkOnQsaW1wb3J0RmlsZURhdGE6bixzekNvZGU6b30pfX0se2tleToidXBsb2FkUGljdHVyZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2xpY2UudXBsb2FkUGljdHVyZSIscGF0aDpwZi5CYXNlNjQoKS5lbmNvZGUoZSl9KX19LHtrZXk6InNob3dTZWxlY3RNZW51Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InVpLnNob3dTZWxlY3RNZW51IixpdGVtczpyLHJlY3Q6e2xlZnQ6ZSx0b3A6dCx3aWR0aDpuLGhlaWdodDpvfX0pfX0se2tleToiaGlkZVNlbGVjdE1lbnUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidWkuaGlkZVNlbGVjdE1lbnUifSl9fSx7a2V5OiJkZXN0cm95U2VsZWN0TWVudSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtudWxsIT09ZS5vUmVxdWVzdD9lLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InVpLmRlc3Ryb3lTZWxlY3RNZW51In0pLnRoZW4oKGZ1bmN0aW9uKGUpe3QoZSl9KSwoZnVuY3Rpb24oZSl7bihlKX0pKTpuKCl9KSl9fSx7a2V5OiJkZXZpY2VDb25maWciLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImxhcHV0YS5lbmNvZGluZ0RldmljZSIscGFyYW06ZX0pfX0se2tleToiY2xvdWRTdG9yYWdlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJsYXB1dGEuY2xvdWRTdG9yYWdlIixwYXJhbTplfSl9fSx7a2V5OiJlenZpelJlbW90ZUNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoibGFwdXRhLmV6dml6UmVtb3RlIixwYXJhbTplfSl9fSx7a2V5OiJzaG93QWxhcm1JbmZvSW5GdWxsU2NyZWVuIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNob3dBbGFybUluZm9JbkZ1bGxTY3JlZW4iLGFsYXJtVGl0bGU6ZSxhbGFybU1lc3NhZ2U6dCxhbGFybUlkOm59KX19LHtrZXk6InVwZGF0ZVBhcmVudFduZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cudXBkYXRlUGFyZW50V25kIn0pfX0se2tleToicmVzdG9yZVduZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cucmVzdG9yZVduZCJ9KX19LHtrZXk6InNldEltbWVkaWF0ZVBsYXliYWNrVGltZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zZXRJbW1lZGlhdGVQbGF5YmFja1RpbWUiLHNwZWNpZnlUaW1lOmV9KX19LHtrZXk6InNldERyYXdTdGF0dXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuc2V0RHJhd1N0YXR1cyIsZW5hYmxlOmV9KX19LHtrZXk6ImNsZWFyUmVnaW9uIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuY2xlYXJSZWdpb24ifSl9fSx7a2V5OiJzZXREcmF3U2hhcGVJbmZvIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuc2V0RHJhd1NoYXBlSW5mbyIsZHJhd1R5cGU6ZSxkcmF3SW5mbzp0fSl9fSx7a2V5OiJzZXRHcmlkSW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoiZHJhdy5zZXRHcmlkSW5mbyIsZ3JpZEluZm86ZX0pfX0se2tleToiZ2V0R3JpZEluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoiZHJhdy5nZXRHcmlkSW5mbyJ9KX19LHtrZXk6InNldFBvbHlnb25JbmZvIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJkcmF3LnNldFBvbHlnb25JbmZvIixwb2x5Z29uSW5mbzplfSl9fSx7a2V5OiJnZXRQb2x5Z29uSW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJkcmF3LmdldFBvbHlnb25JbmZvIn0pfX0se2tleToic2V0TGluZUluZm8iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuc2V0TGluZUluZm8iLGxpbmVJbmZvOmV9KX19LHtrZXk6ImdldExpbmVJbmZvIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuZ2V0TGluZUluZm8ifSl9fSx7a2V5OiJzZXRSZWN0SW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoiZHJhdy5zZXRSZWN0SW5mbyIscmVjdEluZm86ZX0pfX0se2tleToiZ2V0UmVjdEluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoiZHJhdy5nZXRSZWN0SW5mbyJ9KX19LHtrZXk6ImNsZWFyU2hhcGVCeVR5cGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuY2xlYXJTaGFwZUJ5VHlwZSIsdHlwZTplfSl9fSx7a2V5OiJzZW5zaXRpdmVFbmNyeXB0Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIG89e2NtZDoibGFwdXRhLnNlbnNpdGl2ZUVuY3J5cHQiLGVuY3J5cHRUeXBlOmUsZW5jcnlwdEZpZWxkOnR9O3JldHVybiB2b2lkIDAhPT1uJiYoby5vcHRpb25zPW4pLHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qobyl9fSx7a2V5OiJzZW5kUmVxdWVzdCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3QoZSl9fSx7a2V5OiJyZXF1ZXN0SW50ZXJmYWNlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD17Y21kOiJ3aW5kb3cucmVxdWVzdEludGVyZmFjZSJ9O3JldHVybiB0LnJlcXVlc3RQYXJhbXM9ZSx0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHQpfX0se2tleToic3RvcFBsYXkiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0tMSksdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJwbGF5LnN0b3BQbGF5Iix3bmRJbmRleDplfSl9fSx7a2V5OiJzaG93UmVtb3RlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlLmNtZD0iY29uZmlnLnNob3dSZW1vdGVDb25maWciLG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe251bGwhPT10Lm9SZXF1ZXN0P3Qub1JlcXVlc3Quc2VuZFJlcXVlc3QoZSkudGhlbigoZnVuY3Rpb24oZSl7bihlKX0pLChmdW5jdGlvbihlKXtvKGUpfSkpOm8oKX0pKX19LHtrZXk6InZpZGVvMlBpY3R1cmUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9e2NtZDoid2luZG93LnZpZGVvMlBpY3R1cmUifTtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdChlKX19LHtrZXk6InBpY3R1cmUyVmlkZW8iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9e2NtZDoid2luZG93LnBpY3R1cmUyVmlkZW8ifTtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdChlKX19LHtrZXk6InB0ekNvbnRyb2wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImxhcHV0YS5wdHpDb250cm9sIixwYXJhbTplfSl9fSx7a2V5OiJzaW1Nb3VzZUNsaWNrRXZlbnQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNpbU1vdXNlQ2xpY2tFdmVudCIscG9pbnRYOmUscG9pbnRZOnR9KX19LHtrZXk6InVzX1NldE1heEpvYkNvdW50Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLnNldE1heEpvYkNvdW50Iix4bWw6ZX0pfX0se2tleToidXNfR2V0TWF4Sm9iQ291bnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5nZXRNYXhKb2JDb3VudCJ9KX19LHtrZXk6InVzX0FkZFNjaGVkdWxlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLmFkZFNjaGVkdWxlIix4bWw6cGYuQmFzZTY0KCkuZW5jb2RlKGUpfSl9fSx7a2V5OiJ1c19EZWxTY2hlZHVsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5kZWxTY2hlZHVsZSIsc2NoZWR1bGVJZDplfSl9fSx7a2V5OiJ1c19HZXRTY2hlZHVsZUxpc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe251bGwhPT10Lm9SZXF1ZXN0P3Qub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5nZXRTY2hlZHVsZUxpc3QiLHhtbDplfSkudGhlbigoZnVuY3Rpb24oZSl7IiIhPT1lLnhtbCYmKGUueG1sPXBmLkJhc2U2NCgpLmRlY29kZShlLnhtbCkpLG4oZSl9KSwoZnVuY3Rpb24oZSl7byhlKX0pKTpvKCl9KSl9fSx7a2V5OiJ1c19HZXRTY2hlZHVsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxyKXtudWxsIT09bi5vUmVxdWVzdD9uLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InVwZ3JhZGUuZ2V0U2NoZWR1bGUiLHhtbDp0LHNjaGVkdWxlSWQ6ZX0pLnRoZW4oKGZ1bmN0aW9uKGUpeyIiIT09ZS54bWwmJihlLnhtbD1wZi5CYXNlNjQoKS5kZWNvZGUoZS54bWwpKSxvKGUpfSksKGZ1bmN0aW9uKGUpe3IoZSl9KSk6cigpfSkpfX0se2tleToidXNfVXBncmFkZUFjdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLnVwZ3JhZGVBY3Rpb24iLHhtbDp0LHNjaGVkdWxlSWQ6ZX0pfX0se2tleToidXNfQ2hlY2tVcGdyYWRlYWJsZURldmljZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5jaGVja1VwZ3JhZGVhYmxlRGV2aWNlIixwYXJhbTplfSl9fSx7a2V5OiJ1c19DaGVja1VwZ3JhZGVhYmxlRGV2aWNlTGlzdCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5jaGVja1VwZ3JhZGVhYmxlRGV2aWNlTGlzdCIscGFyYW06ZX0pfX0se2tleToidXNfSXNSdW5uaW5nQXN5Q2hlY2tVcGdyYWRlYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLmlzUnVubmluZ0FzeUNoZWNrVXBncmFkZWFibGUifSl9fSx7a2V5OiJ1c19TdG9wQXN5Q2hlY2tVcGdyYWRlYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLnN0b3BBc3lDaGVja1VwZ3JhZGVhYmxlIn0pfX0se2tleToiZ2V0RmlzaEV5ZVBUWlByZXNldCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5nZXRGaXNoRXllUFRaUHJlc2V0Iix3bmRJbmRleDplfSl9fSx7a2V5OiJzZXRGaXNoRXllUFRaUHJlc2V0Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zZXRGaXNoRXllUFRaUHJlc2V0Iix3bmRJbmRleDplLGNvbW1hbmQ6dCxwcmVzZXRJbmZvOm59KX19LHtrZXk6ImNvbnRyb2xGaXNoRXllUFRaIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJwbGF5LmNvbnRyb2xGaXNoRXllUFRaIix3bmRJbmRleDplLGNvbW1hbmQ6dCxzdG9wOm4sc3BlZWQ6b30pfX0se2tleToiY29udHJvbEZpc2hFeWVQYXJvbCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuY29udHJvbEZpc2hFeWVQYXJvbCIsd25kSW5kZXg6ZSxjb21tYW5kOnQsY3J1aXNlUG9pbnRMaXN0Om59KX19LHtrZXk6InNldEZpcnN0RGF5T2ZXZWVrIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuc2V0Rmlyc3REYXlPZldlZWsiLGZpcnN0RGF5OmV9KX19LHtrZXk6InNldEVob21lUGxheUluZm8iLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8scixpKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJwbGF5LnNldEVob21lUGxheUluZm8iLGd1aWQ6ZSxwcm90b2NhbDp0LHNlc3Npb246bix0b2tlbjpvLGlwOnIscG9ydDppfSl9fSx7a2V5OiJzdGFydFBsYXlQYXRjaCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoZS5sZW5ndGg+MClmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS5hcmVhTmFtZT1wZi5CYXNlNjQoKS5lbmNvZGUoZVt0XS5hcmVhTmFtZSksZVt0XS5jYW1lcmFOYW1lPXBmLkJhc2U2NCgpLmVuY29kZShlW3RdLmNhbWVyYU5hbWUpO3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuc3RhcnRQbGF5UGF0Y2giLHBhcmFtczplfSl9fSx7a2V5OiJncmFiT3BlbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtudWxsIT09ZS5vUmVxdWVzdD9lLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6IndpbmRvdy5ncmFiT3BlbiJ9KS50aGVuKChmdW5jdGlvbihlKXt0KGUpfSksKGZ1bmN0aW9uKGUpe24oZSl9KSk6bigpfSkpfX0se2tleToic2V0V25kQXV0b1BhblN0YXRlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuc2V0V25kQXV0b1BhblN0YXRlIix3bmRJbmRleDplLG9wZW46dH0pfX0se2tleToiZW5hYmxlUHJpdmlsZWdlcyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0uZW5hYmxlUHJpdmlsZWdlcyJ9KX19XSksZX0oKSxScCksVHA9KHFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSk7dmFyIG89dGhpczt0aGlzLm9PcHRpb25zPU9iamVjdC5hc3NpZ24oe3N6UGx1Z2luQ29udGFpbmVyOiIiLGNiQ29ubmVjdFN1Y2Nlc3M6bnVsbCxjYkNvbm5lY3RFcnJvcjpudWxsLGNiQ29ubmVjdENsb3NlOm51bGwsaVNlcnZpY2VQb3J0U3RhcnQ6MTY5NjAsaVNlcnZpY2VQb3J0RW5kOjE2OTY5LHN6Q2xhc3NJZDoiNTVBNzMyOUUtRkFBRC00MzlhLTg3QkMtNzVCQUIzMzMyRTdDIn0sdCksdGhpcy5iRnJlZXplPSExLHRoaXMuYkZvY3VzPSEwLHRoaXMuYkVtYmVkPXBmLmdldENyZWF0ZVduZE1vZGUoKSx0aGlzLnN6V25kSWQ9IiIsdGhpcy5pQ3JlYXRlV25kVGltZXI9LTEsdGhpcy5pVXBkYXRlUGFyZW50V25kVGltZXI9LTEsdGhpcy5iRGV2VG9vbD0hMSx0aGlzLmlWQ1RpbWVTdGFydD0tMSx0aGlzLmlWQ1RpbWVFbmQ9LTEsdGhpcy5vV25kQ292ZXI9e2xlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowfSx0aGlzLm9Eb2NPZmZzZXQ9e2xlZnQ6MCx0b3A6MH0sdGhpcy5zelRpdGxlPSIiLHRoaXMub1dpbmRvd0F0dHI9e291dGVyV2lkdGg6MCxpbm5lcldpZHRoOjAsb3V0ZXJIZWlnaHQ6MCxpbm5lckhlaWdodDowLHNjcmVlblRvcDowLHNjcmVlbkxlZnQ6MCxzY3JlZW5YOjAsc2NyZWVuWTowfSx0aGlzLmlGaXhlZFJlc2l6ZVRpbWVyPS0xLHRoaXMuZlZpc2liaWxpdHlDaGFuZ2U9ZnVuY3Rpb24oKXtpZihwZi5pc01hY09TKCkpZG9jdW1lbnQuaGlkZGVuP28uZkhpZGVXbmQoKTpvLmZTaG93V25kKCk7ZWxzZSBpZihkb2N1bWVudC5oaWRkZW4pby5pVkNUaW1lU3RhcnQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksby5mSGlkZVduZCgpO2Vsc2V7by5pVkNUaW1lRW5kPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3ZhciBlPXBmLmJyb3dzZXIoKTtpZihlLmNocm9tZXx8ZS5tb3ppbGxhKWlmKG8uaVVwZGF0ZVBhcmVudFduZFRpbWVyPjAmJihjbGVhclRpbWVvdXQoby5pVXBkYXRlUGFyZW50V25kVGltZXIpLG8uaVVwZGF0ZVBhcmVudFduZFRpbWVyPS0xKSxvLmlWQ1RpbWVFbmQtby5pVkNUaW1lU3RhcnQ8MTAwKXt2YXIgdD1vLm9SZXF1ZXN0LmdldFJlcXVlc3RVVUlEKCk7bWYodCxvLm9PcHRpb25zLmNiU2V0RG9jVGl0bGUpLG8uaVVwZGF0ZVBhcmVudFduZFRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7by5vUmVxdWVzdC51cGRhdGVQYXJlbnRXbmQoKS50aGVuKChmdW5jdGlvbigpe3lmKHQsby5vT3B0aW9ucy5jYlVuc2V0RG9jVGl0bGUpLG8uYkZyZWV6ZXx8by5iRGV2VG9vbHx8by5mU2hvd1duZCgpfSksKGZ1bmN0aW9uKCl7eWYodCxvLm9PcHRpb25zLmNiVW5zZXREb2NUaXRsZSl9KSl9KSwxMDApfWVsc2Ugby5iRnJlZXplfHxvLmJEZXZUb29sfHxvLmZTaG93V25kKCk7ZWxzZSBvLmJGcmVlemV8fG8uYkRldlRvb2x8fG8uZlNob3dXbmQoKX19LHRoaXMuZkhpZGVXbmQ9ZnVuY3Rpb24oKXtvLm9SZXF1ZXN0LmhpZGVXbmQoKS50aGVuKChmdW5jdGlvbigpe30pLChmdW5jdGlvbigpe30pKX0sdGhpcy5mU2hvd1duZD1mdW5jdGlvbigpe28ub1JlcXVlc3Quc2hvd1duZCgpLnRoZW4oKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKCl7fSkpfSx0aGlzLmZGb2N1cz1mdW5jdGlvbigpe28uYkZvY3VzPSEwLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7by5yZW1vdmVHcmFiSW1hZ2UoKSxkb2N1bWVudC5oaWRkZW58fG8uYkZyZWV6ZXx8by5iRGV2VG9vbHx8by5mU2hvd1duZCgpfSksMjAwKX0sdGhpcy5mQmx1cj1mdW5jdGlvbigpe28uYkZvY3VzPSExfSx0aGlzLnJlbW92ZUdyYWJJbWFnZT1mdW5jdGlvbigpe2lmKCFwZi5pc01hY09TKCkpe3ZhciBlPW51bGw7aWYoIiIhPT1vLnN6V25kSWQmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG8uc3pXbmRJZCkpKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW5hbWU9IndjLWdyYWItb3Blbi1pbWFnZSJdJyk7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfSkpfX19LHRoaXMub1JlcXVlc3Q9bmV3IE9wKHtzelBsdWdpbkNvbnRhaW5lcjp0aGlzLm9PcHRpb25zLnN6UGx1Z2luQ29udGFpbmVyLGNiQ29ubmVjdFN1Y2Nlc3M6dGhpcy5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzLGNiQ29ubmVjdEVycm9yOnRoaXMub09wdGlvbnMuY2JDb25uZWN0RXJyb3IsY2JDb25uZWN0Q2xvc2U6ZnVuY3Rpb24oZSl7by5pQ3JlYXRlV25kVGltZXI+MCYmKGNsZWFyVGltZW91dChvLmlDcmVhdGVXbmRUaW1lciksby5pQ3JlYXRlV25kVGltZXI9LTEpLG8ucmVtb3ZlR3JhYkltYWdlKCksby5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZSYmby5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZShlKX0saVNlcnZpY2VQb3J0U3RhcnQ6dGhpcy5vT3B0aW9ucy5pU2VydmljZVBvcnRTdGFydCxpU2VydmljZVBvcnRFbmQ6dGhpcy5vT3B0aW9ucy5pU2VydmljZVBvcnRFbmQsc3pDbGFzc0lkOnRoaXMub09wdGlvbnMuc3pDbGFzc0lkfSl9cmV0dXJuIHIoZSxbe2tleToiSlNfU2V0V2luZG93Q29udHJvbENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49e2NiU2VsZWN0V25kOmZ1bmN0aW9uKHQpe2UuY2JTZWxlY3RXbmQmJmUuY2JTZWxlY3RXbmQocGFyc2VJbnQodC53bmRJbmRleCwxMCksdC5jYW1lcmFJRCx0LnNpdGVJRCx0Lm9wZW5kRmlzaGV5ZSl9LGNiVG9nZ2xlUFRaOmZ1bmN0aW9uKHQpe2UuY2JUb2dnbGVQVFomJmUuY2JUb2dnbGVQVFoodC5jYW1lcmFJRCx0LnNpdGVJRCl9LGNiVXBkYXRlQ2FtZXJhSWNvbjpmdW5jdGlvbih0KXtlLmNiVXBkYXRlQ2FtZXJhSWNvbiYmZS5jYlVwZGF0ZUNhbWVyYUljb24odC5jYW1lcmFJRCxwYXJzZUludCh0LnBsYXlpbmcsMTApLHQuc2l0ZUlEKX0sY2JHZXRMYXN0RXJyb3I6ZnVuY3Rpb24odCl7ZS5jYkdldExhc3RFcnJvciYmZS5jYkdldExhc3RFcnJvcih0LmVycm9yLHBhcnNlSW50KHQudHlwZSwxMCkpfSxjYlRhbGtVcmxFbXB0eTpmdW5jdGlvbih0KXtlLmNiVGFsa1VybEVtcHR5JiZlLmNiVGFsa1VybEVtcHR5KHQuY2FtZXJhSUQpfSxjYkdvdG9QbGF5YmFjazpmdW5jdGlvbih0KXtlLmNiR290b1BsYXliYWNrJiZlLmNiR290b1BsYXliYWNrKHQuY2FtZXJhSUQsdC5zaXRlSUQpfSxjYlNob3dEaXNwbGF5SW5mbzpmdW5jdGlvbih0KXtlLmNiU2hvd0Rpc3BsYXlJbmZvJiZlLmNiU2hvd0Rpc3BsYXlJbmZvKHBhcnNlSW50KHQudmlkZW9XaWR0aCwxMCkscGFyc2VJbnQodC52aWRlb0hlaWdodCwxMCkscGFyc2VJbnQodC5mcmFtZVJhdGUsMTApKX0sY2JQcmV2aWV3V25kM0RQb3N0aW9uOmZ1bmN0aW9uKHQpe2UuY2JQcmV2aWV3V25kM0RQb3N0aW9uJiZlLmNiUHJldmlld1duZDNEUG9zdGlvbihwYXJzZUludCh0LnN0YXJ0WCwxMCkscGFyc2VJbnQodC5zdGFydFksMTApLHBhcnNlSW50KHQuZW5kWCwxMCkscGFyc2VJbnQodC5lbmRZLDEwKSl9LGNiU3RvcFBsYXlBbGw6ZnVuY3Rpb24oKXtlLmNiU3RvcFBsYXlBbGwmJmUuY2JTdG9wUGxheUFsbCgpfSxjYldoZWVsRXZlbnQ6ZnVuY3Rpb24odCl7ZS5jYldoZWVsRXZlbnQmJmUuY2JXaGVlbEV2ZW50KHBhcnNlSW50KHQuZGVsdGEsMTApKX0sY2JBbGFybURldGFpbDpmdW5jdGlvbih0KXtlLmNiQWxhcm1EZXRhaWwmJmUuY2JBbGFybURldGFpbCh0LmFsYXJtSWQpfSxjYlF1aXRlZEZ1bGxTY3JlZW46ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZlNob3dXbmQoKX0pLDEwMCl9LGNiTWFudWFsbHlDbG9zZTpmdW5jdGlvbih0KXtlLmNiTWFudWFsbHlDbG9zZSYmZS5jYk1hbnVhbGx5Q2xvc2UodC5jYW1lcmFJRCx0LnNpdGVJRCxwYXJzZUludCh0LnduZEluZGV4LDEwKSl9LGNiSW50ZWdyYXRpb25DYWxsQmFjazpmdW5jdGlvbih0KXtlLmNiSW50ZWdyYXRpb25DYWxsQmFjayYmZS5jYkludGVncmF0aW9uQ2FsbEJhY2sodCl9LGNiQ2hhbmdlU3RvcmFnZTpmdW5jdGlvbih0KXtlLmNiQ2hhbmdlU3RvcmFnZSYmZS5jYkNoYW5nZVN0b3JhZ2UocGFyc2VJbnQodC5zdG9yYWdlVHlwZSwxMCksdC5jYW1lcmFJRCx0LnNpdGVJRCl9LGNiRmlzaGV5ZUV4cGFuZENoYW5nZWQ6ZnVuY3Rpb24odCl7ZS5jYkZpc2hleWVFeHBhbmRDaGFuZ2VkJiZlLmNiRmlzaGV5ZUV4cGFuZENoYW5nZWQodC5jYW1lcmFJRCx0LnNpdGVJRCxwYXJzZUludCh0LnduZEluZGV4LDEwKSx0Lm9wZW4pfSxjYkdldEVob21lUGxheUluZm86ZnVuY3Rpb24odCl7ZS5jYkdldEVob21lUGxheUluZm8mJmUuY2JHZXRFaG9tZVBsYXlJbmZvKHQuc2l0ZUlELHQuZ3VpZCl9LGNiV25kUHR6Q29udHJvbDpmdW5jdGlvbih0KXtlLmNiV25kUHR6Q29udHJvbCYmZS5jYlduZFB0ekNvbnRyb2wocGFyc2VJbnQodC53bmRJbmRleCwxMCksdC5jYW1lcmFJRCx0LmNvbW1hbmQsdC5zcGVlZCx0LnN0b3ApfSxjYk1lc3NhZ2VDYWxsQmFjazpmdW5jdGlvbihuKXtuPW4uZGF0YTt2YXIgbz10Lm9SZXF1ZXN0LmdldFJlcXVlc3RVVUlEKCk7Im1lbnVPcGVuIj09PW4udHlwZT8iIiE9PXQuc3pXbmRJZCYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQuc3pXbmRJZCkuaW5uZXJIVE1MPSI8aW1nIGRhdGEtbmFtZT0nd2MtZ3JhYi1vcGVuLWltYWdlJyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiLmNvbmNhdChuLm1lc3NhZ2UuaW1hZ2UsIicgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScgLz4iKSk6ImNoYW5nZVRpdGxlIj09PW4udHlwZT8tMT09PWRvY3VtZW50LnRpdGxlLmluZGV4T2YobykmJih0LnN6VGl0bGU9ZG9jdW1lbnQudGl0bGUsbWYobyx0Lm9PcHRpb25zLmNiU2V0RG9jVGl0bGUpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7InVwZGF0ZVBhcmVudFduZCI9PT1uLm1lc3NhZ2U/dC5vUmVxdWVzdC51cGRhdGVQYXJlbnRXbmQoKToicmVzdG9yZVduZCI9PT1uLm1lc3NhZ2UmJnQub1JlcXVlc3QucmVzdG9yZVduZCgpfSksMzAwKSk6ImNoYW5nZVRpdGxlRG9uZSI9PT1uLnR5cGU/IiIhPT10LnN6VGl0bGUmJnlmKG8sdC5vT3B0aW9ucy5jYlVuc2V0RG9jVGl0bGUpOiJzcGxpdENoYW5nZSI9PT1uLnR5cGU/ZS5jYlNwbGl0Q2hhbmdlJiZlLmNiU3BsaXRDaGFuZ2Uobi5tZXNzYWdlLnNwbGl0VHlwZSk6InNob3dNYXhpbWl6ZWQiPT09bi50eXBlJiZlLmNiU2hvd01heGltaXplZCYmZS5jYlNob3dNYXhpbWl6ZWQobi5tZXNzYWdlLnNob3dNYXgpfX07dGhpcy5vUmVxdWVzdC5zZXRXaW5kb3dDb250cm9sQ2FsbGJhY2sobil9fSx7a2V5OiJKU19TZXRTYWRwQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXtjYkRldmljZUZpbmQ6bnVsbH07T2JqZWN0LmFzc2lnbih0LGUpLHRoaXMub1JlcXVlc3Quc2V0U2FkcENhbGxiYWNrKHQpfX0se2tleToiSlNfU2V0U2xpY2VDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9e2NiSW1hZ2VTbGljZWQ6ZnVuY3Rpb24odCl7ZS5jYkltYWdlU2xpY2VkJiYoIiIhPT10LnBpY05hbWUmJih0LnBpY05hbWU9cGYuQmFzZTY0KCkuZGVjb2RlKHQucGljTmFtZSkpLGUuY2JJbWFnZVNsaWNlZCh0KSl9fTt0aGlzLm9SZXF1ZXN0LnNldFNsaWNlQ2FsbGJhY2sodCl9fSx7a2V5OiJKU19TZXRTZXJpYWxDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9e2NiQ2FyZEZpbmQ6ZnVuY3Rpb24odCl7ZS5jYkNhcmRGaW5kJiZlLmNiQ2FyZEZpbmQodCl9LGNiRmluZ2VyRmluZDpmdW5jdGlvbih0KXtlLmNiRmluZ2VyRmluZCYmZS5jYkZpbmdlckZpbmQodC5maW5nZXJQcmludCx0LmZpbmdlclF1YWxpdHkpfSxjYkltYWdlRmluZDpmdW5jdGlvbih0KXtlLmNiSW1hZ2VGaW5kJiZlLmNiSW1hZ2VGaW5kKHQuaW1hZ2UpfSxjYkltYWdlRXJyb3JGaW5kOmZ1bmN0aW9uKHQpe2UuY2JJbWFnZUVycm9yRmluZCYmZS5jYkltYWdlRXJyb3JGaW5kKHQuZXJyb3JNb2R1bGUsdC5lcnJvckNvZGUpfSxjYkltYWdlV25kVmlzaWJsZUZpbmQ6ZnVuY3Rpb24odCl7ZS5jYkltYWdlV25kVmlzaWJsZUZpbmQmJmUuY2JJbWFnZVduZFZpc2libGVGaW5kKHQudmlzaWJsZSl9fTt0aGlzLm9SZXF1ZXN0LnNldFNlcmlhbENhbGxiYWNrKHQpfX0se2tleToiSlNfU2V0VUlDb250cm9sQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXtjYkNsaWNrTWVudUl0ZW06ZnVuY3Rpb24odCl7ZS5jYkNsaWNrTWVudUl0ZW0mJmUuY2JDbGlja01lbnVJdGVtKHQuaXRlbUluZGV4KX0sY2JNZW51TW91c2VJbjpmdW5jdGlvbigpe2UuY2JNZW51TW91c2VJbiYmZS5jYk1lbnVNb3VzZUluKCl9LGNiTWVudU1vdXNlT3V0OmZ1bmN0aW9uKCl7ZS5jYk1lbnVNb3VzZU91dCYmZS5jYk1lbnVNb3VzZU91dCgpfX07dGhpcy5vUmVxdWVzdC5zZXRVSUNvbnRyb2xDYWxsYmFjayh0KX19LHtrZXk6IkpTX1NldFVwZ3JhZGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9e2NiQ2hlY2tVcGdyYWRlOmZ1bmN0aW9uKHQpe2UuY2JDaGVja1VwZ3JhZGUmJmUuY2JDaGVja1VwZ3JhZGUodCl9fTt0aGlzLm9SZXF1ZXN0LnNldFVwZ3JhZGVDYWxsYmFjayh0KX19LHtrZXk6IkpTX0NoZWNrVmVyc2lvbiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vUmVxdWVzdC5nZXRTZXJ2aWNlVmVyc2lvbigpLG49W10sbz1bXTsiIiE9PXQmJihuPSh0PXQucmVwbGFjZSgvLFtcc10qL2csIi4iKSkuc3BsaXQoIi4iKSksIiIhPT1lJiYobz0oZT1lLnJlcGxhY2UoLyxbXHNdKi9nLCIuIikpLnNwbGl0KCIuIikpO3ZhciByPSExO2lmKG8ubGVuZ3RoPT09bi5sZW5ndGgpZm9yKHZhciBpPTAscz1uLmxlbmd0aDtpPHM7aSsrKWlmKHBhcnNlSW50KG9baV0sMTApIT09cGFyc2VJbnQobltpXSwxMCkpe2lmKHBhcnNlSW50KG9baV0sMTApPnBhcnNlSW50KG5baV0sMTApKXtyPSEwO2JyZWFrfWJyZWFrfXJldHVybiByfX0se2tleToiSlNfU3RhcnRTZXJ2aWNlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnN0YXJ0U2VydmljZShlLHQpfX0se2tleToiSlNfU3RvcFNlcnZpY2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnN0b3BTZXJ2aWNlKGUpfX0se2tleToiSlNfRGlzY29ubmVjdCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5kaXNjb25uZWN0KCl9fSx7a2V5OiJKU19PcGVuRGlyZWN0b3J5Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5vcGVuRGlyZWN0b3J5KGUpfX0se2tleToiSlNfT3BlbkZpbGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5vcGVuRmlsZShlLHQsbil9fSx7a2V5OiJKU19TZWxlY3REaXJlY3RvcnkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VsZWN0RGlyZWN0b3J5KGUsdCl9fSx7a2V5OiJKU19TZWxlY3RGaWxlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VsZWN0RmlsZShlLHQsbil9fSx7a2V5OiJKU19HZXRMb2NhbENvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZ2V0TG9jYWxDb25maWcoZSl9fSx7a2V5OiJKU19TZXRMb2NhbENvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0TG9jYWxDb25maWcoZSl9fSx7a2V5OiJKU19TZXREb2NPZmZzZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlJiYodGhpcy5vRG9jT2Zmc2V0PWUpLCEwfX0se2tleToiSlNfU2V0V2luZG93QXR0ciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJih0aGlzLm9XaW5kb3dBdHRyPWUpLCEwfX0se2tleToiSlNfQ3JlYXRlV25kIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXt2YXIgcj10aGlzO3RoaXMuc3pXbmRJZD1lLHZvaWQgMCE9PShvPW98fHt9KS5iRW1iZWQmJih0aGlzLmJFbWJlZD1vLmJFbWJlZCk7dmFyIGk9ITA7cmV0dXJuIHZvaWQgMCE9PW8uYkFjdGl2ZVhQYXJlbnRXbmQmJihpPW8uYkFjdGl2ZVhQYXJlbnRXbmQpLG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe3ZhciB1PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpO2lmKHUpe3ZhciBjPSIiO3BmLmJyb3dzZXIoKS5tc2llP2M9IklFRnJhbWUiOnBmLmJyb3dzZXIoKS5jaHJvbWU/Yz0iQ2hyb21lIjpwZi5icm93c2VyKCkuc2FmYXJpJiYoYz13aW5kb3cudG9wLmRvY3VtZW50LnRpdGxlKSxvLmNiU2V0RG9jVGl0bGUmJihyLm9PcHRpb25zLmNiU2V0RG9jVGl0bGU9by5jYlNldERvY1RpdGxlKSxvLmNiVW5zZXREb2NUaXRsZSYmKHIub09wdGlvbnMuY2JVbnNldERvY1RpdGxlPW8uY2JVbnNldERvY1RpdGxlKTt2YXIgbD1yLm9SZXF1ZXN0LmdldFJlcXVlc3RVVUlEKCk7bWYobCxvLmNiU2V0RG9jVGl0bGUpLHIuaUNyZWF0ZVduZFRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYoIXIuYkRldlRvb2wpe3ZhciBlPXBmLmdldERldmljZVBpeGVsUmF0aW8oKSxkPXBmLmdldFduZFBvc3Rpb24odSxyLmJFbWJlZCxyLm9XaW5kb3dBdHRyLHIub0RvY09mZnNldCk7dD1NYXRoLnJvdW5kKHQqZSksbj1NYXRoLnJvdW5kKG4qZSksci5vUmVxdWVzdC5jcmVhdGVXbmQoZC5sZWZ0LGQudG9wLHQsbixjLHIuYkVtYmVkLGksby5IV05EfHwiIikudGhlbigoZnVuY3Rpb24oKXt5ZihsLG8uY2JVbnNldERvY1RpdGxlKSxzKCl9KSwoZnVuY3Rpb24oZSl7eWYobCxvLmNiVW5zZXREb2NUaXRsZSksNTAwMT09PWUuZXJyb3JDb2RlPyhkb2N1bWVudC5oaWRkZW58fHIuYkZyZWV6ZXx8IXIuYkZvY3VzfHxyLmZTaG93V25kKCkscygpKTphKGUpfSkpfX0pLDMwMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsci5mVmlzaWJpbGl0eUNoYW5nZSwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIixyLmZGb2N1cyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHIuZkJsdXIpfWVsc2UgYSgpfSkpfX0se2tleToiSlNfU2hvd1duZCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJGcmVlemU9ITEsZG9jdW1lbnQuaGlkZGVufHx0aGlzLmJEZXZUb29sfHx0aGlzLmZTaG93V25kKCl9fSx7a2V5OiJKU19IaWRlV25kIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYkZyZWV6ZT0hMCx0aGlzLmZIaWRlV25kKCl9fSx7a2V5OiJKU19EZXN0cm95V25kIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLmZWaXNpYmlsaXR5Q2hhbmdlLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuZkZvY3VzKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5mQmx1ciksdGhpcy5vUmVxdWVzdC5kZXN0cm95V25kKCl9fSx7a2V5OiJKU19SZXNpemUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz10aGlzLHI9bnVsbCxpPWUscz10O2lmKCIiIT09dGhpcy5zelduZElkJiYocj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN6V25kSWQpKSxyKXt2YXIgYT1wZi5nZXRXbmRQb3N0aW9uKHIsdGhpcy5iRW1iZWQsdGhpcy5vV2luZG93QXR0cix0aGlzLm9Eb2NPZmZzZXQpLHU9cGYuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpOyghcGYuYnJvd3NlcigpLm1zaWV8fHBmLmJyb3dzZXIoKS5tc2llJiYiMTEuMCI9PT1wZi5icm93c2VyKCkudmVyc2lvbikmJih0aGlzLm9XbmRDb3Zlci5sZWZ0PjAmJihhLmxlZnQrPU1hdGgucm91bmQodGhpcy5vV25kQ292ZXIubGVmdCp1KSxlLT10aGlzLm9XbmRDb3Zlci5sZWZ0KSx0aGlzLm9XbmRDb3Zlci50b3A+MCYmKGEudG9wKz1NYXRoLnJvdW5kKHRoaXMub1duZENvdmVyLnRvcCp1KSx0LT10aGlzLm9XbmRDb3Zlci50b3ApLHRoaXMub1duZENvdmVyLnJpZ2h0PjAmJihlLT10aGlzLm9XbmRDb3Zlci5yaWdodCksdGhpcy5vV25kQ292ZXIuYm90dG9tPjAmJih0LT10aGlzLm9XbmRDb3Zlci5ib3R0b20pKSxlPU1hdGgucm91bmQoZSp1KSx0PU1hdGgucm91bmQodCp1KSx0aGlzLm9SZXF1ZXN0LnNldFduZEdlb21ldHJ5KGEubGVmdCxhLnRvcCxlLHQpLChwZi5icm93c2VyKCkubXNpZSYmIjExLjAiPT09cGYuYnJvd3NlcigpLnZlcnNpb258fCFwZi5pc1dpbmRvd3MoKSkmJihuJiZuLmJGaXhlZD90aGlzLmlGaXhlZFJlc2l6ZVRpbWVyPS0xOih0aGlzLmlGaXhlZFJlc2l6ZVRpbWVyPi0xJiYoY2xlYXJUaW1lb3V0KHRoaXMuaUZpeGVkUmVzaXplVGltZXIpLHRoaXMuaUZpeGVkUmVzaXplVGltZXI9LTEpLHRoaXMuaUZpeGVkUmVzaXplVGltZXI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvLkpTX1Jlc2l6ZShpLHMse2JGaXhlZDohMH0pfSksMzAwKSkpfX19LHtrZXk6IkpTX1NldFduZENvdmVyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXBmLmdldERldmljZVBpeGVsUmF0aW8oKTtyZXR1cm4oIXBmLmJyb3dzZXIoKS5tc2llfHxwZi5icm93c2VyKCkubXNpZSYmIjExLjAiPT09cGYuYnJvd3NlcigpLnZlcnNpb24pJiYoImxlZnQiPT09ZT90aGlzLm9XbmRDb3Zlci5sZWZ0PXQ6InRvcCI9PT1lP3RoaXMub1duZENvdmVyLnRvcD10OiJyaWdodCI9PT1lP3RoaXMub1duZENvdmVyLnJpZ2h0PXQ6ImJvdHRvbSI9PT1lJiYodGhpcy5vV25kQ292ZXIuYm90dG9tPXQpKSx0PU1hdGgucm91bmQodCpuKSx0aGlzLm9SZXF1ZXN0LnNldFduZENvdmVyKGUsdCl9fSx7a2V5OiJKU19DdXR0aW5nUGFydFdpbmRvdyIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sbyxyKXt2YXIgaT1wZi5nZXREZXZpY2VQaXhlbFJhdGlvKCk7cmV0dXJuIGU9TWF0aC5yb3VuZChlKmkpLHQ9TWF0aC5yb3VuZCh0KmkpLG49TWF0aC5yb3VuZChuKmkpLG89TWF0aC5yb3VuZChvKmkpLHI9TWF0aC5yb3VuZChyKmkpLHRoaXMub1JlcXVlc3QuY3V0dGluZ1BhcnRXaW5kb3coZSx0LG4sbyxyKX19LHtrZXk6IkpTX1JlcGFpclBhcnRXaW5kb3ciLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8scil7dmFyIGk9cGYuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO3JldHVybiBlPU1hdGgucm91bmQoZSppKSx0PU1hdGgucm91bmQodCppKSxuPU1hdGgucm91bmQobippKSxvPU1hdGgucm91bmQobyppKSxyPU1hdGgucm91bmQocippKSx0aGlzLm9SZXF1ZXN0LnJlcGFpclBhcnRXaW5kb3coZSx0LG4sbyxyKX19LHtrZXk6IkpTX0NoYW5nZVBsYXlNb2RlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jaGFuZ2VQbGF5TW9kZShlKX19LHtrZXk6IkpTX1NldExhbmd1YWdlVHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0TGFuZ3VhZ2VUeXBlKGUpfX0se2tleToiSlNfSW5pdExvZ2luSW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuaW5pdExvZ2luSW5mbyhlKX19LHtrZXk6IkpTX1NldFRyYW5zbGF0ZUZpbGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNldFRyYW5zbGF0ZUZpbGUoZSl9fSx7a2V5OiJKU19Td2l0Y2hUb1NpbXBsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3dpdGNoVG9TaW1wbGUoZSl9fSx7a2V5OiJKU19TZXRWc21Ub2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0VnNtVG9rZW4oZSl9fSx7a2V5OiJKU19QbGF5Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIsaSxzLGEsdSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RhcnRQbGF5KGUsdCxuLG8scixpLHMsYSx1KX19LHtrZXk6IkpTX0VuYWJsZTNEWm9vbSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0UHJldmlldzNEUG9zaXRpb24oZSl9fSx7a2V5OiJKU19TdG9wVG90YWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RvcFRvdGFsKCl9fSx7a2V5OiJKU19TZXREcmFnTW9kZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0RHJhZ01vZGUoZSl9fSx7a2V5OiJKU19TaG93RXJyb3JJbmZvSW5GdWxsU2NyZWVuIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zaG93RXJyb3JJbmZvSW5GdWxsU2NyZWVuKGUpfX0se2tleToiSlNfU2V0TnVtYmVyT2ZXaW5kb3dzIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXROdW1iZXJPZldpbmRvd3MoZSl9fSx7a2V5OiJKU19Jbml0Q2FyZFJlYWRlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuaW5pdENhcmRSZWFkZXIoZSl9fSx7a2V5OiJKU19VbkluaXRDYXJkUmVhZGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnVuSW5pdENhcmRSZWFkZXIoKX19LHtrZXk6IkpTX1N0YXJ0QXV0b01vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RhcnRBdXRvTW9kZSgpfX0se2tleToiSlNfU3RvcEF1dG9Nb2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnN0b3BBdXRvTW9kZSgpfX0se2tleToiSlNfSW5pdEZpbmdlcnByaW50Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5pbml0RmluZ2VycHJpbnQoZSl9fSx7a2V5OiJKU19VbkluaXRGaW5nZXJwcmludCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51bkluaXRGaW5nZXJwcmludCgpfX0se2tleToiSlNfU3RhcnRDb2xsZWN0RmluZ2VycHJpbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RhcnRDb2xsZWN0RmluZ2VycHJpbnQoKX19LHtrZXk6IkpTX1N0b3BDb2xsZWN0RmluZ2VycHJpbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RvcENvbGxlY3RGaW5nZXJwcmludCgpfX0se2tleToiSlNfSXNDb2xsZWN0aW5nRmluZ2VycHJpbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QuaXNDb2xsZWN0aW5nRmluZ2VycHJpbnQoKX19LHtrZXk6IkpTX0luaXRWaWRlb2NhcHR1cmUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LmluaXRWaWRlb2NhcHR1cmUoZSl9fSx7a2V5OiJKU19VbkluaXRWaWRlb2NhcHR1cmUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QudW5Jbml0VmlkZW9jYXB0dXJlKCl9fSx7a2V5OiJKU19SZWdpc3RlckRldmljZVR5cGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnJlZ2lzdGVyRGV2aWNlVHlwZShlKX19LHtrZXk6IkpTX0FjdGl2ZU9ubGluZURldmljZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5hY3RpdmVPbmxpbmVEZXZpY2UoZSx0KX19LHtrZXk6IkpTX1JlZnJlc2hEZXZpY2VMaXN0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnJlZnJlc2hEZXZpY2VMaXN0KCl9fSx7a2V5OiJKU19Nb2RpZnlEZXZpY2VOZXRQYXJhbSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sbyxyLGkscyl7cmV0dXJuIHRoaXMub1JlcXVlc3QubW9kaWZ5RGV2aWNlTmV0UGFyYW0oZSx0LG4sbyxyLGkscyl9fSx7a2V5OiJKU19FeHBvcnRLZXlGaWxlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5leHBvcnRLZXlGaWxlKGUpfX0se2tleToiSlNfSW1wb3J0S2V5RmlsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5pbXBvcnRLZXlGaWxlKCl9fSx7a2V5OiJKU19SZXNldFBhc3N3b3JkIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5yZXNldFBhc3N3b3JkKGUsdCxuLG8pfX0se2tleToiSlNfVXBsb2FkUGljdHVyZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QudXBsb2FkUGljdHVyZShlKX19LHtrZXk6IkpTX1Nob3dTZWxlY3RNZW51Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIpe3ZhciBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpO2lmKGkpe3ZhciBzPXBmLmdldFduZFBvc3Rpb24oaSwhMSx0aGlzLm9XaW5kb3dBdHRyLHRoaXMub0RvY09mZnNldCk7ImNlbnRlciI9PT1yP3MubGVmdC09TWF0aC5yb3VuZCgodC1pLm9mZnNldFdpZHRoKS8yKToicmlnaHQiPT09ciYmKHMubGVmdC09TWF0aC5yb3VuZCh0LWkub2Zmc2V0V2lkdGgpKTt2YXIgYT1wZi5nZXREZXZpY2VQaXhlbFJhdGlvKCk7dD1NYXRoLnJvdW5kKHQqYSksbj1NYXRoLnJvdW5kKG4qYSk7dmFyIHU9MSp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpKS5oZWlnaHQuc2xpY2UoMCwtMiksYz1NYXRoLnJvdW5kKHUqYSk7dGhpcy5vUmVxdWVzdC5zaG93U2VsZWN0TWVudShzLmxlZnQscy50b3ArYyx0LG4sbyl9fX0se2tleToiSlNfSGlkZVNlbGVjdE1lbnUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vUmVxdWVzdC5oaWRlU2VsZWN0TWVudSgpfX0se2tleToiSlNfRGVzdHJveVNlbGVjdE1lbnUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZGVzdHJveVNlbGVjdE1lbnUoKX19LHtrZXk6IkpTX0RldmljZUNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZGV2aWNlQ29uZmlnKGUpfX0se2tleToiSlNfQ2xvdWRTdG9yYWdlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jbG91ZFN0b3JhZ2VDb25maWcoZSl9fSx7a2V5OiJKU19FenZpelJlbW90ZUNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZXp2aXpSZW1vdGVDb25maWcoZSl9fSx7a2V5OiJKU19TaG93QWxhcm1JbmZvSW5GdWxsU2NyZWVuIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2hvd0FsYXJtSW5mb0luRnVsbFNjcmVlbihlLHQsbil9fSx7a2V5OiJKU19TZXRJbW1lZGlhdGVQbGF5YmFja1RpbWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNldEltbWVkaWF0ZVBsYXliYWNrVGltZShlKX19LHtrZXk6IkpTX1NldERyYXdTdGF0dXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNldERyYXdTdGF0dXMoZSl9fSx7a2V5OiJKU19DbGVhclJlZ2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jbGVhclJlZ2lvbigpfX0se2tleToiSlNfU2V0RHJhd1NoYXBlSW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXREcmF3U2hhcGVJbmZvKGUsdCl9fSx7a2V5OiJKU19TZXRHcmlkSW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0R3JpZEluZm8oZSl9fSx7a2V5OiJKU19HZXRHcmlkSW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5nZXRHcmlkSW5mbygpfX0se2tleToiSlNfU2V0UG9seWdvbkluZm8iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNldFBvbHlnb25JbmZvKGUpfX0se2tleToiSlNfR2V0UG9seWdvbkluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZ2V0UG9seWdvbkluZm8oKX19LHtrZXk6IkpTX1NldExpbmVJbmZvIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXRMaW5lSW5mbyhlKX19LHtrZXk6IkpTX0dldExpbmVJbmZvIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LmdldExpbmVJbmZvKCl9fSx7a2V5OiJKU19TZXRSZWN0SW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0UmVjdEluZm8oZSl9fSx7a2V5OiJKU19HZXRSZWN0SW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5nZXRSZWN0SW5mbygpfX0se2tleToiSlNfQ2xlYXJTaGFwZUJ5VHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuY2xlYXJTaGFwZUJ5VHlwZShlKX19LHtrZXk6IkpTX1NlbnNpdGl2ZUVuY3J5cHQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5zaXRpdmVFbmNyeXB0KGUsdCxuKX19LHtrZXk6IkpTX1NlbmRSZXF1ZXN0Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdChlKX19LHtrZXk6IkpTX1JlcXVlc3RJbnRlcmZhY2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnJlcXVlc3RJbnRlcmZhY2UoZSl9fSx7a2V5OiJKU19TdG9wUGxheSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RvcFBsYXkoZSl9fSx7a2V5OiJKU19TaG93UmVtb3RlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zaG93UmVtb3RlQ29uZmlnKGUpfX0se2tleToiSlNfVmlkZW8yUGljdHVyZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC52aWRlbzJQaWN0dXJlKCl9fSx7a2V5OiJKU19QaWN0dXJlMlZpZGVvIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnBpY3R1cmUyVmlkZW8oKX19LHtrZXk6IkpTX1B0ekNvbnRyb2wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnB0ekNvbnRyb2woZSl9fSx7a2V5OiJKU19TaW1Nb3VzZUNsaWNrRXZlbnQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2ltTW91c2VDbGlja0V2ZW50KGUsdCl9fSx7a2V5OiJKU19VU19TZXRNYXhKb2JDb3VudCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QudXNfU2V0TWF4Sm9iQ291bnQoZSl9fSx7a2V5OiJKU19VU19HZXRNYXhKb2JDb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19HZXRNYXhKb2JDb3VudCgpfX0se2tleToiSlNfVVNfQWRkU2NoZWR1bGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnVzX0FkZFNjaGVkdWxlKGUpfX0se2tleToiSlNfVVNfRGVsU2NoZWR1bGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnVzX0RlbFNjaGVkdWxlKGUpfX0se2tleToiSlNfVVNfR2V0U2NoZWR1bGVMaXN0Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19HZXRTY2hlZHVsZUxpc3QoZSl9fSx7a2V5OiJKU19VU19HZXRTY2hlZHVsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19HZXRTY2hlZHVsZShlLHQpfX0se2tleToiSlNfVVNfVXBncmFkZUFjdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19VcGdyYWRlQWN0aW9uKGUsdCl9fSx7a2V5OiJKU19VU19DaGVja1VwZ3JhZGVhYmxlRGV2aWNlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19DaGVja1VwZ3JhZGVhYmxlRGV2aWNlKGUpfX0se2tleToiSlNfVVNfQ2hlY2tVcGdyYWRlYWJsZURldmljZUxpc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnVzX0NoZWNrVXBncmFkZWFibGVEZXZpY2VMaXN0KGUpfX0se2tleToiSlNfVVNfSXNSdW5uaW5nQXN5Q2hlY2tVcGdyYWRlYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19Jc1J1bm5pbmdBc3lDaGVja1VwZ3JhZGVhYmxlKCl9fSx7a2V5OiJKU19VU19TdG9wQXN5Q2hlY2tVcGdyYWRlYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19TdG9wQXN5Q2hlY2tVcGdyYWRlYWJsZSgpfX0se2tleToiSlNfR2V0RmlzaEV5ZVBUWlByZXNldCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZ2V0RmlzaEV5ZVBUWlByZXNldChlKX19LHtrZXk6IkpTX1NldEZpc2hFeWVQVFpQcmVzZXQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXRGaXNoRXllUFRaUHJlc2V0KGUsdCxuKX19LHtrZXk6IkpTX0NvbnRyb2xGaXNoRXllUFRaIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jb250cm9sRmlzaEV5ZVBUWihlLHQsbixvKX19LHtrZXk6IkpTX0NvbnRyb2xGaXNoRXllUGFyb2wiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jb250cm9sRmlzaEV5ZVBhcm9sKGUsdCxuKX19LHtrZXk6IkpTX1NldEZpcnN0RGF5T2ZXZWVrIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXRGaXJzdERheU9mV2VlayhlKX19LHtrZXk6IkpTX1NldEVob21lUGxheUluZm8iLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8scixpKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXRFaG9tZVBsYXlJbmZvKGUsdCxuLG8scixpKX19LHtrZXk6IkpTX1BsYXlQYXRjaCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RhcnRQbGF5UGF0Y2goZSl9fSx7a2V5OiJKU19TZXRXbmRBdXRvUGFuU3RhdGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0V25kQXV0b1BhblN0YXRlKGUsdCl9fSx7a2V5OiJKU19FbmFibGVQcml2aWxlZ2VzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LmVuYWJsZVByaXZpbGVnZXMoKX19XSxbe2tleToiSlNfV2FrZVVwIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQuc3JjPWUsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCl9KSwzZTMpfX1dKSxlfSgpLHFwKTtyZXR1cm4gVHAudmVyc2lvbj0iMS4yLjUiLFRwfSgpOwo=", import.meta.url).href;
2169
+ i = new URL("./public/web-control_1.2.5.min.js", import.meta.url).href;
2170
2170
  } catch {
2171
- Z = "./web-control_1.2.5.min.js";
2171
+ throw i = "../../../public/web-control_1.2.5.min.js", new Error("无法获取web-control_1.2.5.min.js");
2172
2172
  }
2173
- i.src = Z, i.async = !0, i.onload = () => {
2174
- console.log("web-control_1.2.5.min.js加载成功"), t();
2175
- }, i.onerror = () => {
2176
- console.error("web-control_1.2.5.min加载失败"), l(new Error("加载hweb-control_1.2.5.min.js失败"));
2177
- }, document.head.appendChild(i);
2173
+ e.src = i, e.async = !0, e.onload = () => {
2174
+ console.log("web-control_1.2.5.min.js加载成功"), r();
2175
+ }, e.onerror = () => {
2176
+ console.error("web-control_1.2.5.min加载失败"), t(new Error("加载hweb-control_1.2.5.min.js失败"));
2177
+ }, document.head.appendChild(e);
2178
2178
  });
2179
2179
  },
2180
- getPreviousMinute(t) {
2181
- const l = new Date(Number(t));
2182
- return l.setMinutes(l.getMinutes() - 1), l.getTime();
2180
+ getPreviousMinute(r) {
2181
+ const t = new Date(Number(r));
2182
+ return t.setMinutes(t.getMinutes() - 1), t.getTime();
2183
2183
  },
2184
- getNextMinute(t) {
2185
- const l = new Date(Number(t));
2186
- return l.setMinutes(l.getMinutes() + 1), l.getTime();
2184
+ getNextMinute(r) {
2185
+ const t = new Date(Number(r));
2186
+ return t.setMinutes(t.getMinutes() + 1), t.getTime();
2187
2187
  },
2188
- chunkArray(t, l) {
2189
- let i = [];
2190
- for (let Z = 0; Z < t.length; Z += l) {
2191
- let d = t.slice(Z, Z + l);
2192
- i.push(d);
2188
+ chunkArray(r, t) {
2189
+ let e = [];
2190
+ for (let i = 0; i < r.length; i += t) {
2191
+ let n = r.slice(i, i + t);
2192
+ e.push(n);
2193
2193
  }
2194
- return i;
2194
+ return e;
2195
2195
  },
2196
2196
  // 关闭视频
2197
2197
  closeVideo() {
@@ -2206,72 +2206,72 @@ const Gi = {
2206
2206
  },
2207
2207
  // 批量播放
2208
2208
  startMultiPreview() {
2209
- const t = {
2209
+ const r = {
2210
2210
  argument: {
2211
2211
  list: []
2212
2212
  }
2213
2213
  };
2214
- for (let l = 0; l < this.currentArr.length; l++) {
2215
- let Z = {
2216
- cameraIndexCode: this.currentArr[l].indexCode.replace(/(^\s*)/g, ""),
2214
+ for (let t = 0; t < this.currentArr.length; t++) {
2215
+ let i = {
2216
+ cameraIndexCode: this.currentArr[t].indexCode.replace(/(^\s*)/g, ""),
2217
2217
  gpuMode: 0,
2218
2218
  streamMode: 0,
2219
2219
  transMode: 1,
2220
- wndId: l + 1
2220
+ wndId: t + 1
2221
2221
  };
2222
- t.argument.list.unshift(Z);
2222
+ r.argument.list.unshift(i);
2223
2223
  }
2224
2224
  this.oWebControl.JS_RequestInterface({
2225
2225
  funcName: "startMultiPreviewByCameraIndexCode",
2226
- argument: JSON.stringify(t.argument)
2226
+ argument: JSON.stringify(r.argument)
2227
2227
  });
2228
2228
  },
2229
2229
  // 批量回放
2230
2230
  startMultiPlayback() {
2231
- let t = "", l = "";
2231
+ let r = "", t = "";
2232
2232
  this.happenedTime ? (console.log(
2233
2233
  this.getPreviousMinute(this.happenedTime),
2234
2234
  this.getNextMinute(this.happenedTime)
2235
- ), t = this.getPreviousMinute(this.happenedTime), l = this.getNextMinute(this.happenedTime)) : (t = (/* @__PURE__ */ new Date()).getTime() - 1440 * 60 * 1e3, l = (/* @__PURE__ */ new Date()).getTime());
2236
- const i = {
2235
+ ), r = this.getPreviousMinute(this.happenedTime), t = this.getNextMinute(this.happenedTime)) : (r = (/* @__PURE__ */ new Date()).getTime() - 1440 * 60 * 1e3, t = (/* @__PURE__ */ new Date()).getTime());
2236
+ const e = {
2237
2237
  argument: {
2238
2238
  list: []
2239
2239
  }
2240
2240
  };
2241
- for (let Z = 0; Z < this.currentArr.length; Z++) {
2242
- let d = this.currentArr[Z], b = {
2243
- startTimeStamp: Math.floor(t / 1e3).toString(),
2241
+ for (let i = 0; i < this.currentArr.length; i++) {
2242
+ let n = this.currentArr[i], s = {
2243
+ startTimeStamp: Math.floor(r / 1e3).toString(),
2244
2244
  // 录像查询开始时间戳,单位:秒
2245
- endTimeStamp: Math.floor(l / 1e3).toString(),
2245
+ endTimeStamp: Math.floor(t / 1e3).toString(),
2246
2246
  // 录像结束开始时间戳,单位:秒
2247
- cameraIndexCode: d.indexCode.replace(/(^\s*)/g, ""),
2247
+ cameraIndexCode: n.indexCode.replace(/(^\s*)/g, ""),
2248
2248
  gpuMode: 0,
2249
2249
  streamMode: 0,
2250
2250
  transMode: 1,
2251
- wndId: Z + 1
2251
+ wndId: i + 1
2252
2252
  };
2253
- i.argument.list.unshift(b);
2253
+ e.argument.list.unshift(s);
2254
2254
  }
2255
2255
  this.oWebControl.JS_RequestInterface({
2256
2256
  funcName: "startMultiPlaybackByCameraIndexCode",
2257
- argument: JSON.stringify(i.argument)
2257
+ argument: JSON.stringify(e.argument)
2258
2258
  });
2259
2259
  },
2260
2260
  // 回放
2261
2261
  startPlayback() {
2262
2262
  console.log(this.getPreviousMinute(this.happenedTime));
2263
- let t = "", l = "", i = "";
2263
+ let r = "", t = "", e = "";
2264
2264
  this.happenedTime ? (console.log(
2265
2265
  this.getPreviousMinute(this.happenedTime),
2266
2266
  this.getNextMinute(this.happenedTime)
2267
- ), t = this.cameraIndexCode, l = this.getPreviousMinute(this.happenedTime), i = this.getNextMinute(this.happenedTime)) : (t = this.cameraIndexCode, l = (/* @__PURE__ */ new Date()).getTime() - 1440 * 60 * 1e3, i = (/* @__PURE__ */ new Date()).getTime()), this.oWebControl.JS_RequestInterface({
2267
+ ), r = this.cameraIndexCode, t = this.getPreviousMinute(this.happenedTime), e = this.getNextMinute(this.happenedTime)) : (r = this.cameraIndexCode, t = (/* @__PURE__ */ new Date()).getTime() - 1440 * 60 * 1e3, e = (/* @__PURE__ */ new Date()).getTime()), this.oWebControl.JS_RequestInterface({
2268
2268
  funcName: "startPlayback",
2269
2269
  argument: JSON.stringify({
2270
- cameraIndexCode: t,
2270
+ cameraIndexCode: r,
2271
2271
  // 监控点编号
2272
- startTimeStamp: Math.floor(l / 1e3).toString(),
2272
+ startTimeStamp: Math.floor(t / 1e3).toString(),
2273
2273
  // 录像查询开始时间戳,单位:秒
2274
- endTimeStamp: Math.floor(i / 1e3).toString(),
2274
+ endTimeStamp: Math.floor(e / 1e3).toString(),
2275
2275
  // 录像结束开始时间戳,单位:秒
2276
2276
  recordLocation: 1,
2277
2277
  // 录像存储类型:0-中心存储,1-设备存储
@@ -2286,20 +2286,20 @@ const Gi = {
2286
2286
  },
2287
2287
  // 播放事件
2288
2288
  startPlay() {
2289
- let t = this.cameraIndexCode;
2290
- const l = 0, i = 1, Z = 0, d = -1;
2291
- t = t.replace(/(^\s*)/g, ""), t = t.replace(/(\s*$)/g, ""), this.oWebControl.JS_RequestInterface({
2289
+ let r = this.cameraIndexCode;
2290
+ const t = 0, e = 1, i = 0, n = -1;
2291
+ r = r.replace(/(^\s*)/g, ""), r = r.replace(/(\s*$)/g, ""), this.oWebControl.JS_RequestInterface({
2292
2292
  funcName: "startPreview",
2293
2293
  argument: JSON.stringify({
2294
- cameraIndexCode: t,
2294
+ cameraIndexCode: r,
2295
2295
  //监控点编号
2296
- streamMode: l,
2296
+ streamMode: t,
2297
2297
  //主子码流标识
2298
- transMode: i,
2298
+ transMode: e,
2299
2299
  //传输协议
2300
- gpuMode: Z,
2300
+ gpuMode: i,
2301
2301
  //是否开启GPU硬解
2302
- wndId: d
2302
+ wndId: n
2303
2303
  //可指定播放窗口
2304
2304
  })
2305
2305
  });
@@ -2333,8 +2333,8 @@ const Gi = {
2333
2333
  this.initPlugin();
2334
2334
  }, 3e3) : (this.$message.error("插件启动失败,请检查插件是否安装!"), this.playText = "插件启动失败,请检查插件是否安装!");
2335
2335
  },
2336
- cbConnectClose: (t) => {
2337
- t || (this.oWebControl = null, this.playText = "插件未启动,正在尝试启动,请稍候...", this.initCount++, this.initCount < 3 ? setTimeout(() => {
2336
+ cbConnectClose: (r) => {
2337
+ r || (this.oWebControl = null, this.playText = "插件未启动,正在尝试启动,请稍候...", this.initCount++, this.initCount < 3 ? setTimeout(() => {
2338
2338
  this.initPlugin();
2339
2339
  }, 3e3) : (this.$message.error("插件启动失败,请检查插件是否安装!"), this.playText = "插件启动失败,请检查插件是否安装!"));
2340
2340
  }
@@ -2381,64 +2381,64 @@ const Gi = {
2381
2381
  });
2382
2382
  },
2383
2383
  //获取公钥
2384
- getPubKey(t) {
2384
+ getPubKey(r) {
2385
2385
  this.oWebControl.JS_RequestInterface({
2386
2386
  funcName: "getRSAPubKey",
2387
2387
  argument: JSON.stringify({
2388
2388
  keyLength: 1024
2389
2389
  })
2390
- }).then((l) => {
2391
- l.responseMsg.data && (this.pubKey = l.responseMsg.data, t());
2390
+ }).then((t) => {
2391
+ t.responseMsg.data && (this.pubKey = t.responseMsg.data, r());
2392
2392
  });
2393
2393
  },
2394
2394
  //RSA加密
2395
- setEncrypt(t) {
2396
- let l = new pi();
2397
- return l.setPublicKey(this.pubKey), l.encrypt(t);
2395
+ setEncrypt(r) {
2396
+ let t = new me();
2397
+ return t.setPublicKey(this.pubKey), t.encrypt(r);
2398
2398
  },
2399
2399
  // 格式化时间
2400
- dateFormat(t, l) {
2401
- let i = {
2402
- "M+": t.getMonth() + 1,
2400
+ dateFormat(r, t) {
2401
+ let e = {
2402
+ "M+": r.getMonth() + 1,
2403
2403
  //月份
2404
- "d+": t.getDate(),
2404
+ "d+": r.getDate(),
2405
2405
  //日
2406
- "h+": t.getHours(),
2406
+ "h+": r.getHours(),
2407
2407
  //小时
2408
- "m+": t.getMinutes(),
2408
+ "m+": r.getMinutes(),
2409
2409
  //分
2410
- "s+": t.getSeconds(),
2410
+ "s+": r.getSeconds(),
2411
2411
  //秒
2412
- "q+": Math.floor((t.getMonth() + 3) / 3),
2412
+ "q+": Math.floor((r.getMonth() + 3) / 3),
2413
2413
  //季度
2414
- S: t.getMilliseconds()
2414
+ S: r.getMilliseconds()
2415
2415
  //毫秒
2416
2416
  };
2417
- /(y+)/.test(l) && (l = l.replace(
2417
+ /(y+)/.test(t) && (t = t.replace(
2418
2418
  RegExp.$1,
2419
- (t.getFullYear() + "").substr(4 - RegExp.$1.length)
2419
+ (r.getFullYear() + "").substr(4 - RegExp.$1.length)
2420
2420
  ));
2421
- for (let Z in i)
2422
- new RegExp("(" + Z + ")").test(l) && (l = l.replace(
2421
+ for (let i in e)
2422
+ new RegExp("(" + i + ")").test(t) && (t = t.replace(
2423
2423
  RegExp.$1,
2424
- RegExp.$1.length == 1 ? i[Z] : ("00" + i[Z]).substr(("" + i[Z]).length)
2424
+ RegExp.$1.length == 1 ? e[i] : ("00" + e[i]).substr(("" + e[i]).length)
2425
2425
  ));
2426
- return l;
2426
+ return t;
2427
2427
  },
2428
2428
  // 回调接口
2429
- cbIntegrationCallBack(t) {
2430
- const { responseMsg: l, responseMsg: i } = t;
2431
- l.type === 6 && (this.videoTotal = this.multipPointsArr.length, this.currentPage = 1, this.selectAll = this.multipPointsArr, this.layoutMode = l.msg.layout, this.pageSize = l.msg.wndNum, this.selectAll = this.chunkArray(this.selectAll, l.msg.wndNum), this.currentArr = [...this.selectAll[this.currentPage - 1]], this.oWebControl.JS_Disconnect().then(
2429
+ cbIntegrationCallBack(r) {
2430
+ const { responseMsg: t, responseMsg: e } = r;
2431
+ t.type === 6 && (this.videoTotal = this.multipPointsArr.length, this.currentPage = 1, this.selectAll = this.multipPointsArr, this.layoutMode = t.msg.layout, this.pageSize = t.msg.wndNum, this.selectAll = this.chunkArray(this.selectAll, t.msg.wndNum), this.currentArr = [...this.selectAll[this.currentPage - 1]], this.oWebControl.JS_Disconnect().then(
2432
2432
  () => {
2433
2433
  this.initPlugin();
2434
2434
  },
2435
2435
  () => {
2436
2436
  }
2437
- )), l.type === 7 && this.closeVideo();
2437
+ )), t.type === 7 && this.closeVideo();
2438
2438
  },
2439
2439
  // 显示下载插件弹窗
2440
2440
  showPluginDownloadDialog() {
2441
- Ul.alert(
2441
+ Pt.alert(
2442
2442
  "播放视频需要下载插件",
2443
2443
  "提示",
2444
2444
  {
@@ -2449,7 +2449,7 @@ const Gi = {
2449
2449
  }
2450
2450
  ).then(() => {
2451
2451
  deleteSysMenu(row.id).then(() => {
2452
- this.downloadPlugin(), this.showLoading.close(), fl({
2452
+ this.downloadPlugin(), this.showLoading.close(), Vt({
2453
2453
  type: "success",
2454
2454
  message: "下载插件成功"
2455
2455
  });
@@ -2461,30 +2461,30 @@ const Gi = {
2461
2461
  // 下载插件
2462
2462
  downloadPlugin() {
2463
2463
  try {
2464
- const t = this.baseUrl + "static/VideoWebPlugin.exe", l = document.createElement("a");
2465
- l.href = t, l.download = "VideoWebPlugin.exe", l.style.display = "none", document.body.appendChild(l), l.click(), setTimeout(() => {
2466
- l.parentNode && l.parentNode.removeChild(l), this.closeVideo();
2464
+ const r = this.baseUrl + "static/VideoWebPlugin.exe", t = document.createElement("a");
2465
+ t.href = r, t.download = "VideoWebPlugin.exe", t.style.display = "none", document.body.appendChild(t), t.click(), setTimeout(() => {
2466
+ t.parentNode && t.parentNode.removeChild(t), this.closeVideo();
2467
2467
  }, 100);
2468
2468
  } catch {
2469
2469
  this.closeVideo();
2470
2470
  }
2471
2471
  }
2472
2472
  }
2473
- }, yi = {
2473
+ }, be = {
2474
2474
  ref: "playWnd",
2475
2475
  id: "playWnd",
2476
2476
  class: "playWnd"
2477
2477
  };
2478
- function Yi(t, l, i, Z, d, b) {
2479
- return vl((Tl(), Il("div", yi, null, 512)), [
2480
- [Hl, !i.isFullScreen]
2478
+ function Te(r, t, e, i, n, s) {
2479
+ return Ct((Mt(), Ot("div", be, null, 512)), [
2480
+ [Nt, !e.isFullScreen]
2481
2481
  ]);
2482
2482
  }
2483
- const cl = /* @__PURE__ */ Fl(Gi, [["render", Yi]]);
2484
- cl.install = (t) => {
2485
- t.component(cl.name, cl);
2483
+ const at = /* @__PURE__ */ _t(Se, [["render", Te]]);
2484
+ at.install = (r) => {
2485
+ r.component(at.name, at);
2486
2486
  };
2487
2487
  export {
2488
- cl as GPluginVideo,
2489
- cl as default
2488
+ at as GPluginVideo,
2489
+ at as default
2490
2490
  };