windsor-bot 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/index.js +6 -7
- package/dist/server.js +24 -7
- package/dist/web/app.bundle.js +955 -0
- package/package.json +3 -3
- package/scripts/build-web.mjs +13 -0
- package/src/index.ts +7 -7
- package/src/server.ts +24 -7
|
@@ -0,0 +1,955 @@
|
|
|
1
|
+
// node_modules/preact/dist/preact.module.js
|
|
2
|
+
var n;
|
|
3
|
+
var l;
|
|
4
|
+
var u;
|
|
5
|
+
var t;
|
|
6
|
+
var i;
|
|
7
|
+
var r;
|
|
8
|
+
var o;
|
|
9
|
+
var e;
|
|
10
|
+
var f;
|
|
11
|
+
var c;
|
|
12
|
+
var a;
|
|
13
|
+
var s;
|
|
14
|
+
var h;
|
|
15
|
+
var p;
|
|
16
|
+
var v;
|
|
17
|
+
var y;
|
|
18
|
+
var d = {};
|
|
19
|
+
var w = [];
|
|
20
|
+
var _ = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
|
|
21
|
+
var g = Array.isArray;
|
|
22
|
+
function m(n2, l3) {
|
|
23
|
+
for (var u4 in l3) n2[u4] = l3[u4];
|
|
24
|
+
return n2;
|
|
25
|
+
}
|
|
26
|
+
function b(n2) {
|
|
27
|
+
n2 && n2.parentNode && n2.parentNode.removeChild(n2);
|
|
28
|
+
}
|
|
29
|
+
function k(l3, u4, t3) {
|
|
30
|
+
var i3, r3, o3, e3 = {};
|
|
31
|
+
for (o3 in u4) "key" == o3 ? i3 = u4[o3] : "ref" == o3 ? r3 = u4[o3] : e3[o3] = u4[o3];
|
|
32
|
+
if (arguments.length > 2 && (e3.children = arguments.length > 3 ? n.call(arguments, 2) : t3), "function" == typeof l3 && null != l3.defaultProps) for (o3 in l3.defaultProps) void 0 === e3[o3] && (e3[o3] = l3.defaultProps[o3]);
|
|
33
|
+
return x(l3, e3, i3, r3, null);
|
|
34
|
+
}
|
|
35
|
+
function x(n2, t3, i3, r3, o3) {
|
|
36
|
+
var e3 = { type: n2, props: t3, key: i3, ref: r3, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: null == o3 ? ++u : o3, __i: -1, __u: 0 };
|
|
37
|
+
return null == o3 && null != l.vnode && l.vnode(e3), e3;
|
|
38
|
+
}
|
|
39
|
+
function S(n2) {
|
|
40
|
+
return n2.children;
|
|
41
|
+
}
|
|
42
|
+
function C(n2, l3) {
|
|
43
|
+
this.props = n2, this.context = l3;
|
|
44
|
+
}
|
|
45
|
+
function $(n2, l3) {
|
|
46
|
+
if (null == l3) return n2.__ ? $(n2.__, n2.__i + 1) : null;
|
|
47
|
+
for (var u4; l3 < n2.__k.length; l3++) if (null != (u4 = n2.__k[l3]) && null != u4.__e) return u4.__e;
|
|
48
|
+
return "function" == typeof n2.type ? $(n2) : null;
|
|
49
|
+
}
|
|
50
|
+
function I(n2) {
|
|
51
|
+
if (n2.__P && n2.__d) {
|
|
52
|
+
var u4 = n2.__v, t3 = u4.__e, i3 = [], r3 = [], o3 = m({}, u4);
|
|
53
|
+
o3.__v = u4.__v + 1, l.vnode && l.vnode(o3), q(n2.__P, o3, u4, n2.__n, n2.__P.namespaceURI, 32 & u4.__u ? [t3] : null, i3, null == t3 ? $(u4) : t3, !!(32 & u4.__u), r3), o3.__v = u4.__v, o3.__.__k[o3.__i] = o3, D(i3, o3, r3), u4.__e = u4.__ = null, o3.__e != t3 && P(o3);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function P(n2) {
|
|
57
|
+
if (null != (n2 = n2.__) && null != n2.__c) return n2.__e = n2.__c.base = null, n2.__k.some(function(l3) {
|
|
58
|
+
if (null != l3 && null != l3.__e) return n2.__e = n2.__c.base = l3.__e;
|
|
59
|
+
}), P(n2);
|
|
60
|
+
}
|
|
61
|
+
function A(n2) {
|
|
62
|
+
(!n2.__d && (n2.__d = true) && i.push(n2) && !H.__r++ || r != l.debounceRendering) && ((r = l.debounceRendering) || o)(H);
|
|
63
|
+
}
|
|
64
|
+
function H() {
|
|
65
|
+
try {
|
|
66
|
+
for (var n2, l3 = 1; i.length; ) i.length > l3 && i.sort(e), n2 = i.shift(), l3 = i.length, I(n2);
|
|
67
|
+
} finally {
|
|
68
|
+
i.length = H.__r = 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function L(n2, l3, u4, t3, i3, r3, o3, e3, f4, c3, a3) {
|
|
72
|
+
var s3, h3, p3, v3, y3, _2, g2, m3 = t3 && t3.__k || w, b2 = l3.length;
|
|
73
|
+
for (f4 = T(u4, l3, m3, f4, b2), s3 = 0; s3 < b2; s3++) null != (p3 = u4.__k[s3]) && (h3 = -1 != p3.__i && m3[p3.__i] || d, p3.__i = s3, _2 = q(n2, p3, h3, i3, r3, o3, e3, f4, c3, a3), v3 = p3.__e, p3.ref && h3.ref != p3.ref && (h3.ref && J(h3.ref, null, p3), a3.push(p3.ref, p3.__c || v3, p3)), null == y3 && null != v3 && (y3 = v3), (g2 = !!(4 & p3.__u)) || h3.__k === p3.__k ? (f4 = j(p3, f4, n2, g2), g2 && h3.__e && (h3.__e = null)) : "function" == typeof p3.type && void 0 !== _2 ? f4 = _2 : v3 && (f4 = v3.nextSibling), p3.__u &= -7);
|
|
74
|
+
return u4.__e = y3, f4;
|
|
75
|
+
}
|
|
76
|
+
function T(n2, l3, u4, t3, i3) {
|
|
77
|
+
var r3, o3, e3, f4, c3, a3 = u4.length, s3 = a3, h3 = 0;
|
|
78
|
+
for (n2.__k = new Array(i3), r3 = 0; r3 < i3; r3++) null != (o3 = l3[r3]) && "boolean" != typeof o3 && "function" != typeof o3 ? ("string" == typeof o3 || "number" == typeof o3 || "bigint" == typeof o3 || o3.constructor == String ? o3 = n2.__k[r3] = x(null, o3, null, null, null) : g(o3) ? o3 = n2.__k[r3] = x(S, { children: o3 }, null, null, null) : void 0 === o3.constructor && o3.__b > 0 ? o3 = n2.__k[r3] = x(o3.type, o3.props, o3.key, o3.ref ? o3.ref : null, o3.__v) : n2.__k[r3] = o3, f4 = r3 + h3, o3.__ = n2, o3.__b = n2.__b + 1, e3 = null, -1 != (c3 = o3.__i = O(o3, u4, f4, s3)) && (s3--, (e3 = u4[c3]) && (e3.__u |= 2)), null == e3 || null == e3.__v ? (-1 == c3 && (i3 > a3 ? h3-- : i3 < a3 && h3++), "function" != typeof o3.type && (o3.__u |= 4)) : c3 != f4 && (c3 == f4 - 1 ? h3-- : c3 == f4 + 1 ? h3++ : (c3 > f4 ? h3-- : h3++, o3.__u |= 4))) : n2.__k[r3] = null;
|
|
79
|
+
if (s3) for (r3 = 0; r3 < a3; r3++) null != (e3 = u4[r3]) && 0 == (2 & e3.__u) && (e3.__e == t3 && (t3 = $(e3)), K(e3, e3));
|
|
80
|
+
return t3;
|
|
81
|
+
}
|
|
82
|
+
function j(n2, l3, u4, t3) {
|
|
83
|
+
var i3, r3;
|
|
84
|
+
if ("function" == typeof n2.type) {
|
|
85
|
+
for (i3 = n2.__k, r3 = 0; i3 && r3 < i3.length; r3++) i3[r3] && (i3[r3].__ = n2, l3 = j(i3[r3], l3, u4, t3));
|
|
86
|
+
return l3;
|
|
87
|
+
}
|
|
88
|
+
n2.__e != l3 && (t3 && (l3 && n2.type && !l3.parentNode && (l3 = $(n2)), u4.insertBefore(n2.__e, l3 || null)), l3 = n2.__e);
|
|
89
|
+
do {
|
|
90
|
+
l3 = l3 && l3.nextSibling;
|
|
91
|
+
} while (null != l3 && 8 == l3.nodeType);
|
|
92
|
+
return l3;
|
|
93
|
+
}
|
|
94
|
+
function O(n2, l3, u4, t3) {
|
|
95
|
+
var i3, r3, o3, e3 = n2.key, f4 = n2.type, c3 = l3[u4], a3 = null != c3 && 0 == (2 & c3.__u);
|
|
96
|
+
if (null === c3 && null == e3 || a3 && e3 == c3.key && f4 == c3.type) return u4;
|
|
97
|
+
if (t3 > (a3 ? 1 : 0)) {
|
|
98
|
+
for (i3 = u4 - 1, r3 = u4 + 1; i3 >= 0 || r3 < l3.length; ) if (null != (c3 = l3[o3 = i3 >= 0 ? i3-- : r3++]) && 0 == (2 & c3.__u) && e3 == c3.key && f4 == c3.type) return o3;
|
|
99
|
+
}
|
|
100
|
+
return -1;
|
|
101
|
+
}
|
|
102
|
+
function z(n2, l3, u4) {
|
|
103
|
+
"-" == l3[0] ? n2.setProperty(l3, null == u4 ? "" : u4) : n2[l3] = null == u4 ? "" : "number" != typeof u4 || _.test(l3) ? u4 : u4 + "px";
|
|
104
|
+
}
|
|
105
|
+
function N(n2, l3, u4, t3, i3) {
|
|
106
|
+
var r3, o3;
|
|
107
|
+
n: if ("style" == l3) if ("string" == typeof u4) n2.style.cssText = u4;
|
|
108
|
+
else {
|
|
109
|
+
if ("string" == typeof t3 && (n2.style.cssText = t3 = ""), t3) for (l3 in t3) u4 && l3 in u4 || z(n2.style, l3, "");
|
|
110
|
+
if (u4) for (l3 in u4) t3 && u4[l3] == t3[l3] || z(n2.style, l3, u4[l3]);
|
|
111
|
+
}
|
|
112
|
+
else if ("o" == l3[0] && "n" == l3[1]) r3 = l3 != (l3 = l3.replace(s, "$1")), o3 = l3.toLowerCase(), l3 = o3 in n2 || "onFocusOut" == l3 || "onFocusIn" == l3 ? o3.slice(2) : l3.slice(2), n2.l || (n2.l = {}), n2.l[l3 + r3] = u4, u4 ? t3 ? u4[a] = t3[a] : (u4[a] = h, n2.addEventListener(l3, r3 ? v : p, r3)) : n2.removeEventListener(l3, r3 ? v : p, r3);
|
|
113
|
+
else {
|
|
114
|
+
if ("http://www.w3.org/2000/svg" == i3) l3 = l3.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
|
|
115
|
+
else if ("width" != l3 && "height" != l3 && "href" != l3 && "list" != l3 && "form" != l3 && "tabIndex" != l3 && "download" != l3 && "rowSpan" != l3 && "colSpan" != l3 && "role" != l3 && "popover" != l3 && l3 in n2) try {
|
|
116
|
+
n2[l3] = null == u4 ? "" : u4;
|
|
117
|
+
break n;
|
|
118
|
+
} catch (n3) {
|
|
119
|
+
}
|
|
120
|
+
"function" == typeof u4 || (null == u4 || false === u4 && "-" != l3[4] ? n2.removeAttribute(l3) : n2.setAttribute(l3, "popover" == l3 && 1 == u4 ? "" : u4));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function V(n2) {
|
|
124
|
+
return function(u4) {
|
|
125
|
+
if (this.l) {
|
|
126
|
+
var t3 = this.l[u4.type + n2];
|
|
127
|
+
if (null == u4[c]) u4[c] = h++;
|
|
128
|
+
else if (u4[c] < t3[a]) return;
|
|
129
|
+
return t3(l.event ? l.event(u4) : u4);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function q(n2, u4, t3, i3, r3, o3, e3, f4, c3, a3) {
|
|
134
|
+
var s3, h3, p3, v3, y3, d3, _2, k3, x2, M, $2, I2, P2, A2, H2, T2, j3 = u4.type;
|
|
135
|
+
if (void 0 !== u4.constructor) return null;
|
|
136
|
+
128 & t3.__u && (c3 = !!(32 & t3.__u), o3 = [f4 = u4.__e = t3.__e]), (s3 = l.__b) && s3(u4);
|
|
137
|
+
n: if ("function" == typeof j3) {
|
|
138
|
+
h3 = e3.length;
|
|
139
|
+
try {
|
|
140
|
+
if (x2 = u4.props, M = j3.prototype && j3.prototype.render, $2 = (s3 = j3.contextType) && i3[s3.__c], I2 = s3 ? $2 ? $2.props.value : s3.__ : i3, t3.__c ? k3 = (p3 = u4.__c = t3.__c).__ = p3.__E : (M ? u4.__c = p3 = new j3(x2, I2) : (u4.__c = p3 = new C(x2, I2), p3.constructor = j3, p3.render = Q), $2 && $2.sub(p3), p3.state || (p3.state = {}), p3.__n = i3, v3 = p3.__d = true, p3.__h = [], p3._sb = []), M && null == p3.__s && (p3.__s = p3.state), M && null != j3.getDerivedStateFromProps && (p3.__s == p3.state && (p3.__s = m({}, p3.__s)), m(p3.__s, j3.getDerivedStateFromProps(x2, p3.__s))), y3 = p3.props, d3 = p3.state, p3.__v = u4, v3) M && null == j3.getDerivedStateFromProps && null != p3.componentWillMount && p3.componentWillMount(), M && null != p3.componentDidMount && p3.__h.push(p3.componentDidMount);
|
|
141
|
+
else {
|
|
142
|
+
if (M && null == j3.getDerivedStateFromProps && x2 !== y3 && null != p3.componentWillReceiveProps && p3.componentWillReceiveProps(x2, I2), u4.__v == t3.__v || !p3.__e && null != p3.shouldComponentUpdate && false === p3.shouldComponentUpdate(x2, p3.__s, I2)) {
|
|
143
|
+
u4.__v != t3.__v && (p3.props = x2, p3.state = p3.__s, p3.__d = false), u4.__e = t3.__e, u4.__k = t3.__k, u4.__k.some(function(n3) {
|
|
144
|
+
n3 && (n3.__ = u4);
|
|
145
|
+
}), w.push.apply(p3.__h, p3._sb), p3._sb = [], p3.__h.length && e3.push(p3);
|
|
146
|
+
break n;
|
|
147
|
+
}
|
|
148
|
+
null != p3.componentWillUpdate && p3.componentWillUpdate(x2, p3.__s, I2), M && null != p3.componentDidUpdate && p3.__h.push(function() {
|
|
149
|
+
p3.componentDidUpdate(y3, d3, _2);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
if (p3.context = I2, p3.props = x2, p3.__P = n2, p3.__e = false, P2 = l.__r, A2 = 0, M) p3.state = p3.__s, p3.__d = false, P2 && P2(u4), s3 = p3.render(p3.props, p3.state, p3.context), w.push.apply(p3.__h, p3._sb), p3._sb = [];
|
|
153
|
+
else do {
|
|
154
|
+
p3.__d = false, P2 && P2(u4), s3 = p3.render(p3.props, p3.state, p3.context), p3.state = p3.__s;
|
|
155
|
+
} while (p3.__d && ++A2 < 25);
|
|
156
|
+
p3.state = p3.__s, null != p3.getChildContext && (i3 = m(m({}, i3), p3.getChildContext())), M && !v3 && null != p3.getSnapshotBeforeUpdate && (_2 = p3.getSnapshotBeforeUpdate(y3, d3)), H2 = null != s3 && s3.type === S && null == s3.key ? E(s3.props.children) : s3, f4 = L(n2, g(H2) ? H2 : [H2], u4, t3, i3, r3, o3, e3, f4, c3, a3), p3.base = u4.__e, u4.__u &= -161, p3.__h.length && e3.push(p3), k3 && (p3.__E = p3.__ = null);
|
|
157
|
+
} catch (n3) {
|
|
158
|
+
if (e3.length = h3, u4.__v = null, c3 || null != o3) {
|
|
159
|
+
if (n3.then) {
|
|
160
|
+
for (u4.__u |= c3 ? 160 : 128; f4 && 8 == f4.nodeType && f4.nextSibling; ) f4 = f4.nextSibling;
|
|
161
|
+
null != o3 && (o3[o3.indexOf(f4)] = null), u4.__e = f4;
|
|
162
|
+
} else if (null != o3) for (T2 = o3.length; T2--; ) b(o3[T2]);
|
|
163
|
+
} else u4.__e = t3.__e;
|
|
164
|
+
null == u4.__k && (u4.__k = t3.__k || []), n3.then || B(u4), l.__e(n3, u4, t3);
|
|
165
|
+
}
|
|
166
|
+
} else null == o3 && u4.__v == t3.__v ? (u4.__k = t3.__k, u4.__e = t3.__e) : f4 = u4.__e = G(t3.__e, u4, t3, i3, r3, o3, e3, c3, a3);
|
|
167
|
+
return (s3 = l.diffed) && s3(u4), 128 & u4.__u ? void 0 : f4;
|
|
168
|
+
}
|
|
169
|
+
function B(n2) {
|
|
170
|
+
n2 && (n2.__c && (n2.__c.__e = true), n2.__k && n2.__k.some(B));
|
|
171
|
+
}
|
|
172
|
+
function D(n2, u4, t3) {
|
|
173
|
+
for (var i3 = 0; i3 < t3.length; i3++) J(t3[i3], t3[++i3], t3[++i3]);
|
|
174
|
+
l.__c && l.__c(u4, n2), n2.some(function(u5) {
|
|
175
|
+
try {
|
|
176
|
+
n2 = u5.__h, u5.__h = [], n2.some(function(n3) {
|
|
177
|
+
n3.call(u5);
|
|
178
|
+
});
|
|
179
|
+
} catch (n3) {
|
|
180
|
+
l.__e(n3, u5.__v);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
function E(n2) {
|
|
185
|
+
return "object" != typeof n2 || null == n2 || n2.__b > 0 ? n2 : g(n2) ? n2.map(E) : void 0 !== n2.constructor ? null : m({}, n2);
|
|
186
|
+
}
|
|
187
|
+
function G(u4, t3, i3, r3, o3, e3, f4, c3, a3) {
|
|
188
|
+
var s3, h3, p3, v3, y3, w3, _2, m3 = i3.props || d, k3 = t3.props, x2 = t3.type;
|
|
189
|
+
if ("svg" == x2 ? o3 = "http://www.w3.org/2000/svg" : "math" == x2 ? o3 = "http://www.w3.org/1998/Math/MathML" : o3 || (o3 = "http://www.w3.org/1999/xhtml"), null != e3) {
|
|
190
|
+
for (s3 = 0; s3 < e3.length; s3++) if ((y3 = e3[s3]) && "setAttribute" in y3 == !!x2 && (x2 ? y3.localName == x2 : 3 == y3.nodeType)) {
|
|
191
|
+
u4 = y3, e3[s3] = null;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (null == u4) {
|
|
196
|
+
if (null == x2) return document.createTextNode(k3);
|
|
197
|
+
u4 = document.createElementNS(o3, x2, k3.is && k3), c3 && (l.__m && l.__m(t3, e3), c3 = false), e3 = null;
|
|
198
|
+
}
|
|
199
|
+
if (null == x2) m3 === k3 || c3 && u4.data == k3 || (u4.data = k3);
|
|
200
|
+
else {
|
|
201
|
+
if (e3 = "textarea" == x2 && null != k3.defaultValue ? null : e3 && n.call(u4.childNodes), !c3 && null != e3) for (m3 = {}, s3 = 0; s3 < u4.attributes.length; s3++) m3[(y3 = u4.attributes[s3]).name] = y3.value;
|
|
202
|
+
for (s3 in m3) y3 = m3[s3], "dangerouslySetInnerHTML" == s3 ? p3 = y3 : "children" == s3 || s3 in k3 || "value" == s3 && "defaultValue" in k3 || "checked" == s3 && "defaultChecked" in k3 || N(u4, s3, null, y3, o3);
|
|
203
|
+
for (s3 in k3) y3 = k3[s3], "children" == s3 ? v3 = y3 : "dangerouslySetInnerHTML" == s3 ? h3 = y3 : "value" == s3 ? w3 = y3 : "checked" == s3 ? _2 = y3 : c3 && "function" != typeof y3 || m3[s3] === y3 || N(u4, s3, y3, m3[s3], o3);
|
|
204
|
+
if (h3) c3 || p3 && (h3.__html == p3.__html || h3.__html == u4.innerHTML) || (u4.innerHTML = h3.__html), t3.__k = [];
|
|
205
|
+
else if (p3 && (u4.innerHTML = ""), L("template" == t3.type ? u4.content : u4, g(v3) ? v3 : [v3], t3, i3, r3, "foreignObject" == x2 ? "http://www.w3.org/1999/xhtml" : o3, e3, f4, e3 ? e3[0] : i3.__k && $(i3, 0), c3, a3), null != e3) for (s3 = e3.length; s3--; ) b(e3[s3]);
|
|
206
|
+
c3 && "textarea" != x2 || (s3 = "value", "progress" == x2 && null == w3 ? u4.removeAttribute("value") : null != w3 && (w3 !== u4[s3] || "progress" == x2 && !w3 || "option" == x2 && w3 != m3[s3]) && N(u4, s3, w3, m3[s3], o3), s3 = "checked", null != _2 && _2 != u4[s3] && N(u4, s3, _2, m3[s3], o3));
|
|
207
|
+
}
|
|
208
|
+
return u4;
|
|
209
|
+
}
|
|
210
|
+
function J(n2, u4, t3) {
|
|
211
|
+
try {
|
|
212
|
+
if ("function" == typeof n2) {
|
|
213
|
+
var i3 = "function" == typeof n2.__u;
|
|
214
|
+
i3 && n2.__u(), i3 && null == u4 || (n2.__u = n2(u4));
|
|
215
|
+
} else n2.current = u4;
|
|
216
|
+
} catch (n3) {
|
|
217
|
+
l.__e(n3, t3);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function K(n2, u4, t3) {
|
|
221
|
+
var i3, r3;
|
|
222
|
+
if (l.unmount && l.unmount(n2), (i3 = n2.ref) && (i3.current && i3.current != n2.__e || J(i3, null, u4)), null != (i3 = n2.__c)) {
|
|
223
|
+
if (i3.componentWillUnmount) try {
|
|
224
|
+
i3.componentWillUnmount();
|
|
225
|
+
} catch (n3) {
|
|
226
|
+
l.__e(n3, u4);
|
|
227
|
+
}
|
|
228
|
+
i3.base = i3.__P = i3.__n = null;
|
|
229
|
+
}
|
|
230
|
+
if (i3 = n2.__k) for (r3 = 0; r3 < i3.length; r3++) i3[r3] && K(i3[r3], u4, t3 || "function" != typeof n2.type);
|
|
231
|
+
t3 || b(n2.__e), n2.__c = n2.__ = n2.__e = void 0;
|
|
232
|
+
}
|
|
233
|
+
function Q(n2, l3, u4) {
|
|
234
|
+
return this.constructor(n2, u4);
|
|
235
|
+
}
|
|
236
|
+
function R(u4, t3, i3) {
|
|
237
|
+
var r3, o3, e3, f4;
|
|
238
|
+
t3 == document && (t3 = document.documentElement), l.__ && l.__(u4, t3), o3 = (r3 = "function" == typeof i3) ? null : i3 && i3.__k || t3.__k, e3 = [], f4 = [], q(t3, u4 = (!r3 && i3 || t3).__k = k(S, null, [u4]), o3 || d, d, t3.namespaceURI, !r3 && i3 ? [i3] : o3 ? null : t3.firstChild ? n.call(t3.childNodes) : null, e3, !r3 && i3 ? i3 : o3 ? o3.__e : t3.firstChild, r3, f4), D(e3, u4, f4), u4.props.children = null;
|
|
239
|
+
}
|
|
240
|
+
n = w.slice, l = { __e: function(n2, l3, u4, t3) {
|
|
241
|
+
for (var i3, r3, o3; l3 = l3.__; ) if ((i3 = l3.__c) && !i3.__) try {
|
|
242
|
+
if ((r3 = i3.constructor) && null != r3.getDerivedStateFromError && (i3.setState(r3.getDerivedStateFromError(n2)), o3 = i3.__d), null != i3.componentDidCatch && (i3.componentDidCatch(n2, t3 || {}), o3 = i3.__d), o3) return i3.__E = i3;
|
|
243
|
+
} catch (l4) {
|
|
244
|
+
n2 = l4;
|
|
245
|
+
}
|
|
246
|
+
throw n2;
|
|
247
|
+
} }, u = 0, t = function(n2) {
|
|
248
|
+
return null != n2 && void 0 === n2.constructor;
|
|
249
|
+
}, C.prototype.setState = function(n2, l3) {
|
|
250
|
+
var u4;
|
|
251
|
+
u4 = null != this.__s && this.__s != this.state ? this.__s : this.__s = m({}, this.state), "function" == typeof n2 && (n2 = n2(m({}, u4), this.props)), n2 && m(u4, n2), null != n2 && this.__v && (l3 && this._sb.push(l3), A(this));
|
|
252
|
+
}, C.prototype.forceUpdate = function(n2) {
|
|
253
|
+
this.__v && (this.__e = true, n2 && this.__h.push(n2), A(this));
|
|
254
|
+
}, C.prototype.render = S, i = [], o = "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, e = function(n2, l3) {
|
|
255
|
+
return n2.__v.__b - l3.__v.__b;
|
|
256
|
+
}, H.__r = 0, f = Math.random().toString(8), c = "__d" + f, a = "__a" + f, s = /(PointerCapture)$|Capture$/i, h = 0, p = V(false), v = V(true), y = 0;
|
|
257
|
+
|
|
258
|
+
// node_modules/preact/hooks/dist/hooks.module.js
|
|
259
|
+
var t2;
|
|
260
|
+
var r2;
|
|
261
|
+
var u2;
|
|
262
|
+
var i2;
|
|
263
|
+
var o2 = 0;
|
|
264
|
+
var f2 = [];
|
|
265
|
+
var c2 = l;
|
|
266
|
+
var e2 = c2.__b;
|
|
267
|
+
var a2 = c2.__r;
|
|
268
|
+
var v2 = c2.diffed;
|
|
269
|
+
var l2 = c2.__c;
|
|
270
|
+
var m2 = c2.unmount;
|
|
271
|
+
var p2 = c2.__;
|
|
272
|
+
function s2(n2, t3) {
|
|
273
|
+
c2.__h && c2.__h(r2, n2, o2 || t3), o2 = 0;
|
|
274
|
+
var u4 = r2.__H || (r2.__H = { __: [], __h: [] });
|
|
275
|
+
return n2 >= u4.__.length && u4.__.push({}), u4.__[n2];
|
|
276
|
+
}
|
|
277
|
+
function d2(n2) {
|
|
278
|
+
return o2 = 1, y2(D2, n2);
|
|
279
|
+
}
|
|
280
|
+
function y2(n2, u4, i3) {
|
|
281
|
+
var o3 = s2(t2++, 2);
|
|
282
|
+
if (o3.t = n2, !o3.__c && (o3.__ = [i3 ? i3(u4) : D2(void 0, u4), function(n3) {
|
|
283
|
+
var t3 = o3.__N ? o3.__N[0] : o3.__[0], r3 = o3.t(t3, n3);
|
|
284
|
+
t3 !== r3 && (o3.__N = [r3, o3.__[1]], o3.__c.setState({}));
|
|
285
|
+
}], o3.__c = r2, !r2.__f)) {
|
|
286
|
+
var f4 = function(n3, t3, r3) {
|
|
287
|
+
if (!o3.__c.__H) return true;
|
|
288
|
+
var u5 = false, i4 = o3.__c.props !== n3;
|
|
289
|
+
if (o3.__c.__H.__.some(function(n4) {
|
|
290
|
+
if (n4.__N) {
|
|
291
|
+
u5 = true;
|
|
292
|
+
var t4 = n4.__[0];
|
|
293
|
+
n4.__ = n4.__N, n4.__N = void 0, t4 !== n4.__[0] && (i4 = true);
|
|
294
|
+
}
|
|
295
|
+
}), c3) {
|
|
296
|
+
var f5 = c3.call(this, n3, t3, r3);
|
|
297
|
+
return u5 ? f5 || i4 : f5;
|
|
298
|
+
}
|
|
299
|
+
return !u5 || i4;
|
|
300
|
+
};
|
|
301
|
+
r2.__f = true;
|
|
302
|
+
var c3 = r2.shouldComponentUpdate, e3 = r2.componentWillUpdate;
|
|
303
|
+
r2.componentWillUpdate = function(n3, t3, r3) {
|
|
304
|
+
if (this.__e) {
|
|
305
|
+
var u5 = c3;
|
|
306
|
+
c3 = void 0, f4(n3, t3, r3), c3 = u5;
|
|
307
|
+
}
|
|
308
|
+
e3 && e3.call(this, n3, t3, r3);
|
|
309
|
+
}, r2.shouldComponentUpdate = f4;
|
|
310
|
+
}
|
|
311
|
+
return o3.__N || o3.__;
|
|
312
|
+
}
|
|
313
|
+
function h2(n2, u4) {
|
|
314
|
+
var i3 = s2(t2++, 3);
|
|
315
|
+
!c2.__s && C2(i3.__H, u4) && (i3.__ = n2, i3.u = u4, r2.__H.__h.push(i3));
|
|
316
|
+
}
|
|
317
|
+
function j2() {
|
|
318
|
+
for (var n2; n2 = f2.shift(); ) {
|
|
319
|
+
var t3 = n2.__H;
|
|
320
|
+
if (n2.__P && t3) try {
|
|
321
|
+
t3.__h.some(z2), t3.__h.some(B2), t3.__h = [];
|
|
322
|
+
} catch (r3) {
|
|
323
|
+
t3.__h = [], c2.__e(r3, n2.__v);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
c2.__b = function(n2) {
|
|
328
|
+
r2 = null, e2 && e2(n2);
|
|
329
|
+
}, c2.__ = function(n2, t3) {
|
|
330
|
+
n2 && t3.__k && t3.__k.__m && (n2.__m = t3.__k.__m), p2 && p2(n2, t3);
|
|
331
|
+
}, c2.__r = function(n2) {
|
|
332
|
+
a2 && a2(n2), t2 = 0;
|
|
333
|
+
var i3 = (r2 = n2.__c).__H;
|
|
334
|
+
i3 && (u2 === r2 ? (i3.__h = [], r2.__h = [], i3.__.some(function(n3) {
|
|
335
|
+
n3.__N && (n3.__ = n3.__N), n3.u = n3.__N = void 0;
|
|
336
|
+
})) : (i3.__h.some(z2), i3.__h.some(B2), i3.__h = [], t2 = 0)), u2 = r2;
|
|
337
|
+
}, c2.diffed = function(n2) {
|
|
338
|
+
v2 && v2(n2);
|
|
339
|
+
var t3 = n2.__c;
|
|
340
|
+
t3 && t3.__H && (t3.__H.__h.length && (1 !== f2.push(t3) && i2 === c2.requestAnimationFrame || ((i2 = c2.requestAnimationFrame) || w2)(j2)), t3.__H.__.some(function(n3) {
|
|
341
|
+
n3.u && (n3.__H = n3.u, n3.u = void 0);
|
|
342
|
+
})), u2 = r2 = null;
|
|
343
|
+
}, c2.__c = function(n2, t3) {
|
|
344
|
+
t3.some(function(n3) {
|
|
345
|
+
try {
|
|
346
|
+
n3.__h.some(z2), n3.__h = n3.__h.filter(function(n4) {
|
|
347
|
+
return !n4.__ || B2(n4);
|
|
348
|
+
});
|
|
349
|
+
} catch (r3) {
|
|
350
|
+
t3.some(function(n4) {
|
|
351
|
+
n4.__h && (n4.__h = []);
|
|
352
|
+
}), t3 = [], c2.__e(r3, n3.__v);
|
|
353
|
+
}
|
|
354
|
+
}), l2 && l2(n2, t3);
|
|
355
|
+
}, c2.unmount = function(n2) {
|
|
356
|
+
m2 && m2(n2);
|
|
357
|
+
var t3, r3 = n2.__c;
|
|
358
|
+
r3 && r3.__H && (r3.__H.__.some(function(n3) {
|
|
359
|
+
try {
|
|
360
|
+
z2(n3);
|
|
361
|
+
} catch (n4) {
|
|
362
|
+
t3 = n4;
|
|
363
|
+
}
|
|
364
|
+
}), r3.__H = void 0, t3 && c2.__e(t3, r3.__v));
|
|
365
|
+
};
|
|
366
|
+
var k2 = "function" == typeof requestAnimationFrame;
|
|
367
|
+
function w2(n2) {
|
|
368
|
+
var t3, r3 = function() {
|
|
369
|
+
clearTimeout(u4), k2 && cancelAnimationFrame(t3), setTimeout(n2);
|
|
370
|
+
}, u4 = setTimeout(r3, 35);
|
|
371
|
+
k2 && (t3 = requestAnimationFrame(r3));
|
|
372
|
+
}
|
|
373
|
+
function z2(n2) {
|
|
374
|
+
var t3 = r2, u4 = n2.__c;
|
|
375
|
+
"function" == typeof u4 && (n2.__c = void 0, u4()), r2 = t3;
|
|
376
|
+
}
|
|
377
|
+
function B2(n2) {
|
|
378
|
+
var t3 = r2;
|
|
379
|
+
n2.__c = n2.__(), r2 = t3;
|
|
380
|
+
}
|
|
381
|
+
function C2(n2, t3) {
|
|
382
|
+
return !n2 || n2.length !== t3.length || t3.some(function(t4, r3) {
|
|
383
|
+
return t4 !== n2[r3];
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
function D2(n2, t3) {
|
|
387
|
+
return "function" == typeof t3 ? t3(n2) : t3;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js
|
|
391
|
+
var f3 = 0;
|
|
392
|
+
function u3(e3, t3, n2, o3, i3, u4) {
|
|
393
|
+
t3 || (t3 = {});
|
|
394
|
+
var a3, c3, p3 = t3;
|
|
395
|
+
if ("ref" in p3) for (c3 in p3 = {}, t3) "ref" == c3 ? a3 = t3[c3] : p3[c3] = t3[c3];
|
|
396
|
+
var l3 = { type: e3, props: p3, key: n2, ref: a3, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: --f3, __i: -1, __u: 0, __source: i3, __self: u4 };
|
|
397
|
+
if ("function" == typeof e3 && (a3 = e3.defaultProps)) for (c3 in a3) void 0 === p3[c3] && (p3[c3] = a3[c3]);
|
|
398
|
+
return l.vnode && l.vnode(l3), l3;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// src/web/app.tsx
|
|
402
|
+
var S2 = {
|
|
403
|
+
box: { background: "#151922", border: "1px solid #2b3340", borderRadius: "10px", padding: "16px", marginBottom: "16px" },
|
|
404
|
+
input: { background: "#0f1115", color: "#f5f7fa", border: "1px solid #354051", borderRadius: "6px", padding: "8px 10px", width: "100%", boxSizing: "border-box" },
|
|
405
|
+
btn: { background: "#2e7dff", color: "#fff", border: "none", borderRadius: "6px", padding: "8px 14px", cursor: "pointer", marginRight: "8px" },
|
|
406
|
+
btnDanger: { background: "#c0392b", color: "#fff", border: "none", borderRadius: "6px", padding: "4px 10px", cursor: "pointer" },
|
|
407
|
+
label: { display: "block", marginBottom: "12px" },
|
|
408
|
+
labelText: { display: "block", marginBottom: "4px", color: "#b4bdc8" },
|
|
409
|
+
select: { background: "#0f1115", color: "#f5f7fa", border: "1px solid #354051", borderRadius: "6px", padding: "8px 10px" },
|
|
410
|
+
th: { textAlign: "left", padding: "8px", borderBottom: "1px solid #2b3340" },
|
|
411
|
+
td: { padding: "8px", borderBottom: "1px solid #1a2030", verticalAlign: "top", wordBreak: "break-word" },
|
|
412
|
+
row: { cursor: "pointer", background: "transparent" },
|
|
413
|
+
rowHover: { background: "#1a2030" },
|
|
414
|
+
grid2: { display: "grid", gridTemplateColumns: "1fr 1fr", gap: "12px" },
|
|
415
|
+
grid3: { display: "grid", gridTemplateColumns: "1fr 1fr 1fr", gap: "8px", alignItems: "end" },
|
|
416
|
+
err: { color: "#ff8080", margin: "8px 0" },
|
|
417
|
+
ok: { color: "#8ff0a4", margin: "8px 0" },
|
|
418
|
+
mono: { fontFamily: "monospace", fontSize: "0.85em" }
|
|
419
|
+
};
|
|
420
|
+
async function apiFetch(url, options) {
|
|
421
|
+
const res = await fetch(url, options);
|
|
422
|
+
const json = await res.json();
|
|
423
|
+
if (!res.ok) throw new Error(json.error ?? "Request failed");
|
|
424
|
+
return json;
|
|
425
|
+
}
|
|
426
|
+
function jsonPost(url, body) {
|
|
427
|
+
return apiFetch(url, {
|
|
428
|
+
method: "POST",
|
|
429
|
+
headers: { "Content-Type": "application/json" },
|
|
430
|
+
body: JSON.stringify(body)
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
function jsonPut(url, body) {
|
|
434
|
+
return apiFetch(url, {
|
|
435
|
+
method: "PUT",
|
|
436
|
+
headers: { "Content-Type": "application/json" },
|
|
437
|
+
body: JSON.stringify(body)
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
async function jsonDelete(url) {
|
|
441
|
+
return apiFetch(url, { method: "DELETE" });
|
|
442
|
+
}
|
|
443
|
+
function Field({ label, type = "text", value, onChange, placeholder }) {
|
|
444
|
+
return /* @__PURE__ */ u3("label", { style: S2.label, children: [
|
|
445
|
+
/* @__PURE__ */ u3("span", { style: S2.labelText, children: label }),
|
|
446
|
+
/* @__PURE__ */ u3(
|
|
447
|
+
"input",
|
|
448
|
+
{
|
|
449
|
+
type,
|
|
450
|
+
value,
|
|
451
|
+
placeholder: placeholder ?? "",
|
|
452
|
+
onInput: (e3) => onChange(e3.currentTarget.value),
|
|
453
|
+
style: S2.input
|
|
454
|
+
}
|
|
455
|
+
)
|
|
456
|
+
] });
|
|
457
|
+
}
|
|
458
|
+
function CheckField({ label, checked, onChange }) {
|
|
459
|
+
return /* @__PURE__ */ u3("label", { style: { ...S2.label, display: "flex", alignItems: "center", gap: "8px", cursor: "pointer" }, children: [
|
|
460
|
+
/* @__PURE__ */ u3("input", { type: "checkbox", checked, onChange: (e3) => onChange(e3.currentTarget.checked) }),
|
|
461
|
+
label
|
|
462
|
+
] });
|
|
463
|
+
}
|
|
464
|
+
function BehaviorConfig({ config, onChange }) {
|
|
465
|
+
const t3 = config.type;
|
|
466
|
+
return /* @__PURE__ */ u3("div", { style: { paddingTop: "12px" }, children: [
|
|
467
|
+
(t3 === "immediate-print" || t3 === "accumulating-list" || t3 === "recurring-print") && /* @__PURE__ */ u3(S, { children: [
|
|
468
|
+
/* @__PURE__ */ u3(
|
|
469
|
+
Field,
|
|
470
|
+
{
|
|
471
|
+
label: "Header",
|
|
472
|
+
value: config.header ?? "",
|
|
473
|
+
onChange: (v3) => {
|
|
474
|
+
const c3 = { ...config };
|
|
475
|
+
if (v3) {
|
|
476
|
+
c3.header = v3;
|
|
477
|
+
} else {
|
|
478
|
+
delete c3.header;
|
|
479
|
+
}
|
|
480
|
+
onChange(c3);
|
|
481
|
+
},
|
|
482
|
+
placeholder: "Optional header text"
|
|
483
|
+
}
|
|
484
|
+
),
|
|
485
|
+
/* @__PURE__ */ u3(
|
|
486
|
+
Field,
|
|
487
|
+
{
|
|
488
|
+
label: "Footer",
|
|
489
|
+
value: config.footer ?? "",
|
|
490
|
+
onChange: (v3) => {
|
|
491
|
+
const c3 = { ...config };
|
|
492
|
+
if (v3) {
|
|
493
|
+
c3.footer = v3;
|
|
494
|
+
} else {
|
|
495
|
+
delete c3.footer;
|
|
496
|
+
}
|
|
497
|
+
onChange(c3);
|
|
498
|
+
},
|
|
499
|
+
placeholder: "Optional footer text"
|
|
500
|
+
}
|
|
501
|
+
),
|
|
502
|
+
/* @__PURE__ */ u3(
|
|
503
|
+
CheckField,
|
|
504
|
+
{
|
|
505
|
+
label: "Include metadata footer",
|
|
506
|
+
checked: config.includeMetadata ?? false,
|
|
507
|
+
onChange: (v3) => onChange({ ...config, includeMetadata: v3 })
|
|
508
|
+
}
|
|
509
|
+
)
|
|
510
|
+
] }),
|
|
511
|
+
(t3 === "immediate-print" || t3 === "recurring-print") && /* @__PURE__ */ u3(
|
|
512
|
+
CheckField,
|
|
513
|
+
{
|
|
514
|
+
label: "Include AI-generated icon (requires OpenAI key)",
|
|
515
|
+
checked: config.includeIcon ?? false,
|
|
516
|
+
onChange: (v3) => onChange({ ...config, includeIcon: v3 })
|
|
517
|
+
}
|
|
518
|
+
),
|
|
519
|
+
t3 === "accumulating-list" && /* @__PURE__ */ u3(
|
|
520
|
+
CheckField,
|
|
521
|
+
{
|
|
522
|
+
label: "Include checklist boxes",
|
|
523
|
+
checked: config.includeChecklist ?? false,
|
|
524
|
+
onChange: (v3) => onChange({ ...config, includeChecklist: v3 })
|
|
525
|
+
}
|
|
526
|
+
)
|
|
527
|
+
] });
|
|
528
|
+
}
|
|
529
|
+
function ChannelRow({ mapping, onDelete, onUpdate }) {
|
|
530
|
+
const [expanded, setExpanded] = d2(false);
|
|
531
|
+
const [hovered, setHovered] = d2(false);
|
|
532
|
+
return /* @__PURE__ */ u3("tbody", { children: [
|
|
533
|
+
/* @__PURE__ */ u3(
|
|
534
|
+
"tr",
|
|
535
|
+
{
|
|
536
|
+
style: hovered ? S2.rowHover : S2.row,
|
|
537
|
+
onClick: () => setExpanded(!expanded),
|
|
538
|
+
onMouseEnter: () => setHovered(true),
|
|
539
|
+
onMouseLeave: () => setHovered(false),
|
|
540
|
+
children: [
|
|
541
|
+
/* @__PURE__ */ u3("td", { style: S2.td, children: [
|
|
542
|
+
"# ",
|
|
543
|
+
mapping.channelName
|
|
544
|
+
] }),
|
|
545
|
+
/* @__PURE__ */ u3("td", { style: S2.td, children: mapping.config.type }),
|
|
546
|
+
/* @__PURE__ */ u3("td", { style: { ...S2.td, textAlign: "right" }, children: /* @__PURE__ */ u3(
|
|
547
|
+
"button",
|
|
548
|
+
{
|
|
549
|
+
style: S2.btnDanger,
|
|
550
|
+
onClick: (e3) => {
|
|
551
|
+
e3.stopPropagation();
|
|
552
|
+
onDelete();
|
|
553
|
+
},
|
|
554
|
+
children: "Delete"
|
|
555
|
+
}
|
|
556
|
+
) })
|
|
557
|
+
]
|
|
558
|
+
}
|
|
559
|
+
),
|
|
560
|
+
expanded && /* @__PURE__ */ u3("tr", { children: /* @__PURE__ */ u3("td", { colSpan: 3, style: { ...S2.td, background: "#0f1115", padding: "16px" }, children: /* @__PURE__ */ u3(
|
|
561
|
+
BehaviorConfig,
|
|
562
|
+
{
|
|
563
|
+
config: mapping.config,
|
|
564
|
+
onChange: (c3) => onUpdate(c3)
|
|
565
|
+
}
|
|
566
|
+
) }) })
|
|
567
|
+
] });
|
|
568
|
+
}
|
|
569
|
+
function BotSetup({ config, onSave }) {
|
|
570
|
+
const [discordToken, setDiscordToken] = d2(config?.discordToken ?? "");
|
|
571
|
+
const [serverId, setServerId] = d2(config?.serverId ?? "");
|
|
572
|
+
const [openaiKey, setOpenaiKey] = d2(config?.openaiKey ?? "");
|
|
573
|
+
const [diagnosticsPort, setDiagnosticsPort] = d2(String(config?.diagnosticsPort ?? 8080));
|
|
574
|
+
const [msg, setMsg] = d2("");
|
|
575
|
+
const [err, setErr] = d2("");
|
|
576
|
+
const [saving, setSaving] = d2(false);
|
|
577
|
+
h2(() => {
|
|
578
|
+
setDiscordToken(config?.discordToken ?? "");
|
|
579
|
+
setServerId(config?.serverId ?? "");
|
|
580
|
+
setOpenaiKey(config?.openaiKey ?? "");
|
|
581
|
+
setDiagnosticsPort(String(config?.diagnosticsPort ?? 8080));
|
|
582
|
+
}, [config?.discordToken, config?.openaiKey, config?.serverId, config?.diagnosticsPort]);
|
|
583
|
+
async function save() {
|
|
584
|
+
setSaving(true);
|
|
585
|
+
setErr("");
|
|
586
|
+
setMsg("");
|
|
587
|
+
try {
|
|
588
|
+
const body = {
|
|
589
|
+
discordToken: discordToken.trim(),
|
|
590
|
+
openaiKey: openaiKey.trim(),
|
|
591
|
+
serverId: serverId.trim() || null,
|
|
592
|
+
diagnosticsPort: Number(diagnosticsPort)
|
|
593
|
+
};
|
|
594
|
+
await jsonPost("/api/config", body);
|
|
595
|
+
setMsg("Saved.");
|
|
596
|
+
onSave();
|
|
597
|
+
} catch (e3) {
|
|
598
|
+
setErr(e3 instanceof Error ? e3.message : String(e3));
|
|
599
|
+
} finally {
|
|
600
|
+
setSaving(false);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
return /* @__PURE__ */ u3("section", { style: S2.box, children: [
|
|
604
|
+
/* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Bot Setup" }),
|
|
605
|
+
config && /* @__PURE__ */ u3("p", { style: { color: "#b4bdc8", marginTop: 0 }, children: [
|
|
606
|
+
"Config: ",
|
|
607
|
+
config.configPath
|
|
608
|
+
] }),
|
|
609
|
+
err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
|
|
610
|
+
msg && /* @__PURE__ */ u3("p", { style: S2.ok, children: msg }),
|
|
611
|
+
/* @__PURE__ */ u3(Field, { label: "Discord Token", value: discordToken, onChange: setDiscordToken, placeholder: "Discord bot token" }),
|
|
612
|
+
/* @__PURE__ */ u3(Field, { label: "Server ID (required)", value: serverId, onChange: setServerId, placeholder: "Required \u2014 Discord server ID" }),
|
|
613
|
+
/* @__PURE__ */ u3(Field, { label: "OpenAI Key", value: openaiKey, onChange: setOpenaiKey, placeholder: "OpenAI API key" }),
|
|
614
|
+
/* @__PURE__ */ u3(Field, { label: "Diagnostics Port", type: "number", value: diagnosticsPort, onChange: setDiagnosticsPort, placeholder: "8080" }),
|
|
615
|
+
/* @__PURE__ */ u3("button", { style: S2.btn, onClick: () => void save(), disabled: saving, children: saving ? "Saving\u2026" : "Save" })
|
|
616
|
+
] });
|
|
617
|
+
}
|
|
618
|
+
function ChannelBehaviors({ refreshKey }) {
|
|
619
|
+
const [data, setData] = d2(null);
|
|
620
|
+
const [err, setErr] = d2("");
|
|
621
|
+
const [addChannelId, setAddChannelId] = d2("");
|
|
622
|
+
const [addBehavior, setAddBehavior] = d2("immediate-print");
|
|
623
|
+
async function load() {
|
|
624
|
+
try {
|
|
625
|
+
const d3 = await apiFetch("/api/channels");
|
|
626
|
+
setData(d3);
|
|
627
|
+
} catch (e3) {
|
|
628
|
+
setErr(e3 instanceof Error ? e3.message : String(e3));
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
h2(() => {
|
|
632
|
+
void load();
|
|
633
|
+
}, [refreshKey]);
|
|
634
|
+
async function addMapping() {
|
|
635
|
+
if (!addChannelId) return;
|
|
636
|
+
const dc = data?.discordChannels.find((c3) => c3.id === addChannelId);
|
|
637
|
+
if (!dc) return;
|
|
638
|
+
const defaultConfig = addBehavior === "immediate-print" ? { type: "immediate-print", includeIcon: false, includeMetadata: false } : addBehavior === "accumulating-list" ? { type: "accumulating-list", includeChecklist: false, includeMetadata: false } : addBehavior === "recurring-print" ? { type: "recurring-print", includeIcon: false, includeMetadata: false } : { type: "on-demand" };
|
|
639
|
+
await jsonPost("/api/channels", { channelId: dc.id, channelName: dc.name, config: defaultConfig });
|
|
640
|
+
setAddChannelId("");
|
|
641
|
+
await load();
|
|
642
|
+
}
|
|
643
|
+
async function deleteChannel(id) {
|
|
644
|
+
await jsonDelete(`/api/channels/${id}`);
|
|
645
|
+
await load();
|
|
646
|
+
}
|
|
647
|
+
async function updateChannel(id, config) {
|
|
648
|
+
await jsonPut(`/api/channels/${id}`, { config });
|
|
649
|
+
await load();
|
|
650
|
+
}
|
|
651
|
+
async function refreshFromDiscord() {
|
|
652
|
+
try {
|
|
653
|
+
const d3 = await apiFetch("/api/channels/refresh", { method: "POST" });
|
|
654
|
+
setData(d3);
|
|
655
|
+
} catch (e3) {
|
|
656
|
+
setErr(e3 instanceof Error ? e3.message : String(e3));
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
return /* @__PURE__ */ u3("section", { style: S2.box, children: [
|
|
660
|
+
/* @__PURE__ */ u3("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "12px" }, children: [
|
|
661
|
+
/* @__PURE__ */ u3("h2", { style: { marginTop: 0, marginBottom: 0 }, children: "Channel Behaviors" }),
|
|
662
|
+
/* @__PURE__ */ u3("button", { style: { ...S2.btn, marginRight: 0 }, onClick: () => void refreshFromDiscord(), children: "Refresh Channels" })
|
|
663
|
+
] }),
|
|
664
|
+
err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
|
|
665
|
+
/* @__PURE__ */ u3("table", { style: { width: "100%", borderCollapse: "collapse", marginBottom: "16px" }, children: [
|
|
666
|
+
/* @__PURE__ */ u3("thead", { children: /* @__PURE__ */ u3("tr", { children: [
|
|
667
|
+
/* @__PURE__ */ u3("th", { style: S2.th, children: "Channel" }),
|
|
668
|
+
/* @__PURE__ */ u3("th", { style: S2.th, children: "Behavior" }),
|
|
669
|
+
/* @__PURE__ */ u3("th", { style: { ...S2.th, textAlign: "right" }, children: "Actions" })
|
|
670
|
+
] }) }),
|
|
671
|
+
data?.channels.map((m3) => /* @__PURE__ */ u3(
|
|
672
|
+
ChannelRow,
|
|
673
|
+
{
|
|
674
|
+
mapping: m3,
|
|
675
|
+
onDelete: () => void deleteChannel(m3.channelId),
|
|
676
|
+
onUpdate: (c3) => void updateChannel(m3.channelId, c3)
|
|
677
|
+
},
|
|
678
|
+
m3.channelId
|
|
679
|
+
)),
|
|
680
|
+
(!data || data.channels.length === 0) && /* @__PURE__ */ u3("tbody", { children: /* @__PURE__ */ u3("tr", { children: /* @__PURE__ */ u3("td", { colSpan: 3, style: { ...S2.td, color: "#b4bdc8" }, children: "No channel mappings yet." }) }) })
|
|
681
|
+
] }),
|
|
682
|
+
/* @__PURE__ */ u3("div", { style: S2.grid3, children: [
|
|
683
|
+
/* @__PURE__ */ u3("label", { style: S2.label, children: [
|
|
684
|
+
/* @__PURE__ */ u3("span", { style: S2.labelText, children: "Channel" }),
|
|
685
|
+
/* @__PURE__ */ u3("select", { style: S2.select, value: addChannelId, onChange: (e3) => setAddChannelId(e3.currentTarget.value), children: [
|
|
686
|
+
/* @__PURE__ */ u3("option", { value: "", children: "Select channel\u2026" }),
|
|
687
|
+
data?.unmapped.map((c3) => /* @__PURE__ */ u3("option", { value: c3.id, children: [
|
|
688
|
+
"#",
|
|
689
|
+
c3.name
|
|
690
|
+
] }, c3.id))
|
|
691
|
+
] })
|
|
692
|
+
] }),
|
|
693
|
+
/* @__PURE__ */ u3("label", { style: S2.label, children: [
|
|
694
|
+
/* @__PURE__ */ u3("span", { style: S2.labelText, children: "Behavior" }),
|
|
695
|
+
/* @__PURE__ */ u3("select", { style: S2.select, value: addBehavior, onChange: (e3) => setAddBehavior(e3.currentTarget.value), children: [
|
|
696
|
+
/* @__PURE__ */ u3("option", { value: "immediate-print", children: "\u{1F5A8}\uFE0F Immediate Print" }),
|
|
697
|
+
/* @__PURE__ */ u3("option", { value: "accumulating-list", children: "\u{1F6D2} Accumulating List" }),
|
|
698
|
+
/* @__PURE__ */ u3("option", { value: "recurring-print", children: "\u{1F504} Recurring Print" }),
|
|
699
|
+
/* @__PURE__ */ u3("option", { value: "on-demand", children: "\u{1F4AC} On-Demand" })
|
|
700
|
+
] })
|
|
701
|
+
] }),
|
|
702
|
+
/* @__PURE__ */ u3("button", { style: S2.btn, onClick: () => void addMapping(), disabled: !addChannelId, children: "Add" })
|
|
703
|
+
] })
|
|
704
|
+
] });
|
|
705
|
+
}
|
|
706
|
+
function PrintModeSection() {
|
|
707
|
+
const [printConfig, setPrintConfig] = d2(null);
|
|
708
|
+
const [mode, setMode] = d2("escp");
|
|
709
|
+
const [serialPort, setSerialPort] = d2("/dev/ttyUSB0");
|
|
710
|
+
const [printerName, setPrinterName] = d2("");
|
|
711
|
+
const [paperSize, setPaperSize] = d2("Letter");
|
|
712
|
+
const [paperName, setPaperName] = d2("");
|
|
713
|
+
const [msg, setMsg] = d2("");
|
|
714
|
+
const [err, setErr] = d2("");
|
|
715
|
+
const [saving, setSaving] = d2(false);
|
|
716
|
+
const [testing, setTesting] = d2(false);
|
|
717
|
+
async function load() {
|
|
718
|
+
try {
|
|
719
|
+
const d3 = await apiFetch("/api/print-config");
|
|
720
|
+
if (d3.printConfig) {
|
|
721
|
+
setPrintConfig(d3.printConfig);
|
|
722
|
+
setMode(d3.printConfig.mode);
|
|
723
|
+
if (d3.printConfig.mode === "escp") setSerialPort(d3.printConfig.serialPort);
|
|
724
|
+
if (d3.printConfig.mode === "cups") {
|
|
725
|
+
setPrinterName(d3.printConfig.printerName);
|
|
726
|
+
setPaperSize(d3.printConfig.paperSize);
|
|
727
|
+
setPaperName(d3.printConfig.paperName);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
} catch (e3) {
|
|
731
|
+
setErr(e3 instanceof Error ? e3.message : String(e3));
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
h2(() => {
|
|
735
|
+
void load();
|
|
736
|
+
}, []);
|
|
737
|
+
async function save() {
|
|
738
|
+
setSaving(true);
|
|
739
|
+
setErr("");
|
|
740
|
+
setMsg("");
|
|
741
|
+
try {
|
|
742
|
+
let cfg;
|
|
743
|
+
if (mode === "escp") {
|
|
744
|
+
cfg = { mode: "escp", serialPort: serialPort.trim() };
|
|
745
|
+
} else if (mode === "cups") {
|
|
746
|
+
cfg = { mode: "cups", printerName: printerName.trim(), paperSize: paperSize.trim(), paperName: paperName.trim() };
|
|
747
|
+
} else {
|
|
748
|
+
cfg = { mode: "imagefeed" };
|
|
749
|
+
}
|
|
750
|
+
await jsonPost("/api/print-config", { printConfig: cfg });
|
|
751
|
+
setPrintConfig(cfg);
|
|
752
|
+
setMsg("Print mode saved.");
|
|
753
|
+
} catch (e3) {
|
|
754
|
+
setErr(e3 instanceof Error ? e3.message : String(e3));
|
|
755
|
+
} finally {
|
|
756
|
+
setSaving(false);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
async function testPrint() {
|
|
760
|
+
setTesting(true);
|
|
761
|
+
setErr("");
|
|
762
|
+
setMsg("");
|
|
763
|
+
try {
|
|
764
|
+
await jsonPost("/api/printer/test", {});
|
|
765
|
+
setMsg(mode === "imagefeed" ? "Test job added to image feed." : "Test page sent to printer.");
|
|
766
|
+
} catch (e3) {
|
|
767
|
+
setErr(e3 instanceof Error ? e3.message : String(e3));
|
|
768
|
+
} finally {
|
|
769
|
+
setTesting(false);
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
const modeLabel = {
|
|
773
|
+
escp: "\u{1F50C} ESC/P via Serial Port",
|
|
774
|
+
cups: "\u{1F4C4} PDF via CUPS",
|
|
775
|
+
imagefeed: "\u{1F5BC}\uFE0F Image Feed (testing)"
|
|
776
|
+
};
|
|
777
|
+
return /* @__PURE__ */ u3("section", { style: S2.box, children: [
|
|
778
|
+
/* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Print Mode" }),
|
|
779
|
+
err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
|
|
780
|
+
msg && /* @__PURE__ */ u3("p", { style: S2.ok, children: msg }),
|
|
781
|
+
/* @__PURE__ */ u3("label", { style: S2.label, children: [
|
|
782
|
+
/* @__PURE__ */ u3("span", { style: S2.labelText, children: "Output Mode" }),
|
|
783
|
+
/* @__PURE__ */ u3(
|
|
784
|
+
"select",
|
|
785
|
+
{
|
|
786
|
+
style: S2.select,
|
|
787
|
+
value: mode,
|
|
788
|
+
onChange: (e3) => setMode(e3.currentTarget.value),
|
|
789
|
+
children: ["escp", "cups", "imagefeed"].map((m3) => /* @__PURE__ */ u3("option", { value: m3, children: modeLabel[m3] }, m3))
|
|
790
|
+
}
|
|
791
|
+
)
|
|
792
|
+
] }),
|
|
793
|
+
mode === "escp" && /* @__PURE__ */ u3(
|
|
794
|
+
Field,
|
|
795
|
+
{
|
|
796
|
+
label: "Serial Port",
|
|
797
|
+
value: serialPort,
|
|
798
|
+
onChange: setSerialPort,
|
|
799
|
+
placeholder: "e.g. /dev/ttyUSB0 or COM3"
|
|
800
|
+
}
|
|
801
|
+
),
|
|
802
|
+
mode === "cups" && /* @__PURE__ */ u3(S, { children: [
|
|
803
|
+
/* @__PURE__ */ u3(Field, { label: "CUPS Printer Name", value: printerName, onChange: setPrinterName, placeholder: "e.g. TM-T88V" }),
|
|
804
|
+
/* @__PURE__ */ u3(Field, { label: "Paper Size", value: paperSize, onChange: setPaperSize, placeholder: "e.g. Letter, A4, 80x297mm" }),
|
|
805
|
+
/* @__PURE__ */ u3(Field, { label: "Paper Name (display label)", value: paperName, onChange: setPaperName, placeholder: "e.g. Receipt Roll" })
|
|
806
|
+
] }),
|
|
807
|
+
mode === "imagefeed" && /* @__PURE__ */ u3("p", { style: { color: "#b4bdc8", marginTop: 0 }, children: [
|
|
808
|
+
"Print jobs will be rendered as PNGs and shown at",
|
|
809
|
+
" ",
|
|
810
|
+
/* @__PURE__ */ u3("a", { href: "/feed", target: "_blank", rel: "noopener noreferrer", children: "/feed" }),
|
|
811
|
+
"."
|
|
812
|
+
] }),
|
|
813
|
+
/* @__PURE__ */ u3("div", { style: { display: "flex", gap: "8px", marginTop: "8px" }, children: [
|
|
814
|
+
/* @__PURE__ */ u3("button", { style: S2.btn, onClick: () => void save(), disabled: saving, children: saving ? "Saving\u2026" : "Save" }),
|
|
815
|
+
/* @__PURE__ */ u3(
|
|
816
|
+
"button",
|
|
817
|
+
{
|
|
818
|
+
style: { ...S2.btn, background: "#1a7a3a" },
|
|
819
|
+
onClick: () => void testPrint(),
|
|
820
|
+
disabled: testing || !printConfig,
|
|
821
|
+
title: !printConfig ? "Save a mode first" : "",
|
|
822
|
+
children: testing ? "Printing\u2026" : "Print Test Page"
|
|
823
|
+
}
|
|
824
|
+
)
|
|
825
|
+
] })
|
|
826
|
+
] });
|
|
827
|
+
}
|
|
828
|
+
function SecuritySection({ onSave }) {
|
|
829
|
+
const [password, setPassword] = d2("");
|
|
830
|
+
const [msg, setMsg] = d2("");
|
|
831
|
+
const [err, setErr] = d2("");
|
|
832
|
+
const [saving, setSaving] = d2(false);
|
|
833
|
+
async function save() {
|
|
834
|
+
setSaving(true);
|
|
835
|
+
setErr("");
|
|
836
|
+
setMsg("");
|
|
837
|
+
try {
|
|
838
|
+
await jsonPost("/api/config", { password });
|
|
839
|
+
setPassword("");
|
|
840
|
+
setMsg(password ? "Password set." : "Password cleared.");
|
|
841
|
+
onSave();
|
|
842
|
+
} catch (e3) {
|
|
843
|
+
setErr(e3 instanceof Error ? e3.message : String(e3));
|
|
844
|
+
} finally {
|
|
845
|
+
setSaving(false);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
return /* @__PURE__ */ u3("section", { style: S2.box, children: [
|
|
849
|
+
/* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Security" }),
|
|
850
|
+
err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
|
|
851
|
+
msg && /* @__PURE__ */ u3("p", { style: S2.ok, children: msg }),
|
|
852
|
+
/* @__PURE__ */ u3(Field, { label: "Control Panel Password", type: "password", value: password, onChange: setPassword, placeholder: "Leave blank to remove password" }),
|
|
853
|
+
/* @__PURE__ */ u3("button", { style: S2.btn, onClick: () => void save(), disabled: saving, children: saving ? "Saving\u2026" : "Set Password" })
|
|
854
|
+
] });
|
|
855
|
+
}
|
|
856
|
+
function LogSection() {
|
|
857
|
+
const [events, setEvents] = d2([]);
|
|
858
|
+
const [status, setStatus] = d2(null);
|
|
859
|
+
async function load() {
|
|
860
|
+
const d3 = await apiFetch("/api/events");
|
|
861
|
+
setEvents(d3.events);
|
|
862
|
+
setStatus(d3.status);
|
|
863
|
+
}
|
|
864
|
+
h2(() => {
|
|
865
|
+
void load();
|
|
866
|
+
const t3 = setInterval(() => void load(), 4e3);
|
|
867
|
+
return () => clearInterval(t3);
|
|
868
|
+
}, []);
|
|
869
|
+
const typeColor = {
|
|
870
|
+
startup: "#8ab4ff",
|
|
871
|
+
success: "#8ff0a4",
|
|
872
|
+
error: "#ff8080",
|
|
873
|
+
print: "#ffd580",
|
|
874
|
+
info: "#b4bdc8",
|
|
875
|
+
command: "#d2a8ff"
|
|
876
|
+
};
|
|
877
|
+
return /* @__PURE__ */ u3("section", { style: S2.box, children: [
|
|
878
|
+
/* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Bot Status & Log" }),
|
|
879
|
+
status && /* @__PURE__ */ u3("dl", { style: { display: "grid", gridTemplateColumns: "140px 1fr", gap: "4px 12px", marginBottom: "16px" }, children: [
|
|
880
|
+
/* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Connected" }),
|
|
881
|
+
/* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.connected ? "\u2705 yes" : "\u274C no" }),
|
|
882
|
+
/* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Bot" }),
|
|
883
|
+
/* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.tag ?? "\u2014" }),
|
|
884
|
+
/* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Started" }),
|
|
885
|
+
/* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.startedAt ?? "\u2014" }),
|
|
886
|
+
/* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Server ID" }),
|
|
887
|
+
/* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.configuredServerId ?? "\u2014" }),
|
|
888
|
+
/* @__PURE__ */ u3("dt", { style: { color: "#b4bdc8" }, children: "Servers" }),
|
|
889
|
+
/* @__PURE__ */ u3("dd", { style: { margin: 0 }, children: status.guilds.join(", ") || "\u2014" })
|
|
890
|
+
] }),
|
|
891
|
+
/* @__PURE__ */ u3("div", { style: { maxHeight: "400px", overflow: "auto", border: "1px solid #2b3340", borderRadius: "8px" }, children: events.length === 0 ? /* @__PURE__ */ u3("p", { style: { padding: "12px", margin: 0, color: "#b4bdc8" }, children: "No events yet." }) : /* @__PURE__ */ u3("table", { style: { width: "100%", borderCollapse: "collapse" }, children: [
|
|
892
|
+
/* @__PURE__ */ u3("thead", { children: /* @__PURE__ */ u3("tr", { children: [
|
|
893
|
+
/* @__PURE__ */ u3("th", { style: S2.th, children: "Time" }),
|
|
894
|
+
/* @__PURE__ */ u3("th", { style: S2.th, children: "Type" }),
|
|
895
|
+
/* @__PURE__ */ u3("th", { style: S2.th, children: "Message" })
|
|
896
|
+
] }) }),
|
|
897
|
+
/* @__PURE__ */ u3("tbody", { children: events.map((e3, i3) => /* @__PURE__ */ u3("tr", { children: [
|
|
898
|
+
/* @__PURE__ */ u3("td", { style: { ...S2.td, ...S2.mono, whiteSpace: "nowrap" }, children: e3.timestamp }),
|
|
899
|
+
/* @__PURE__ */ u3("td", { style: { ...S2.td, color: typeColor[e3.type] ?? "#b4bdc8" }, children: e3.type }),
|
|
900
|
+
/* @__PURE__ */ u3("td", { style: S2.td, children: e3.message })
|
|
901
|
+
] }, String(i3))) })
|
|
902
|
+
] }) })
|
|
903
|
+
] });
|
|
904
|
+
}
|
|
905
|
+
function RestartSection() {
|
|
906
|
+
const [msg, setMsg] = d2("");
|
|
907
|
+
const [err, setErr] = d2("");
|
|
908
|
+
const [restarting, setRestarting] = d2(false);
|
|
909
|
+
async function restart() {
|
|
910
|
+
setRestarting(true);
|
|
911
|
+
setErr("");
|
|
912
|
+
setMsg("");
|
|
913
|
+
try {
|
|
914
|
+
await jsonPost("/api/restart", {});
|
|
915
|
+
setMsg("Restart signal sent. The server will restart shortly.");
|
|
916
|
+
} catch (e3) {
|
|
917
|
+
setErr(e3 instanceof Error ? e3.message : String(e3));
|
|
918
|
+
setRestarting(false);
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
return /* @__PURE__ */ u3("section", { style: S2.box, children: [
|
|
922
|
+
/* @__PURE__ */ u3("h2", { style: { marginTop: 0 }, children: "Server Control" }),
|
|
923
|
+
err && /* @__PURE__ */ u3("p", { style: S2.err, children: err }),
|
|
924
|
+
msg && /* @__PURE__ */ u3("p", { style: S2.ok, children: msg }),
|
|
925
|
+
/* @__PURE__ */ u3("button", { style: { ...S2.btn, background: "#8a6d00" }, onClick: () => void restart(), disabled: restarting, children: restarting ? "Restarting\u2026" : "Restart Server" })
|
|
926
|
+
] });
|
|
927
|
+
}
|
|
928
|
+
function App() {
|
|
929
|
+
const [config, setConfig] = d2(null);
|
|
930
|
+
const [refreshKey, setRefreshKey] = d2(0);
|
|
931
|
+
async function loadConfig() {
|
|
932
|
+
const d3 = await apiFetch("/api/config");
|
|
933
|
+
setConfig(d3);
|
|
934
|
+
}
|
|
935
|
+
h2(() => {
|
|
936
|
+
void loadConfig();
|
|
937
|
+
}, []);
|
|
938
|
+
function handleSave() {
|
|
939
|
+
void loadConfig();
|
|
940
|
+
setRefreshKey((k3) => k3 + 1);
|
|
941
|
+
}
|
|
942
|
+
return /* @__PURE__ */ u3("main", { style: { maxWidth: "860px", margin: "0 auto", padding: "24px" }, children: [
|
|
943
|
+
/* @__PURE__ */ u3("h1", { style: { marginTop: 0 }, children: "\u{1F5A8}\uFE0F Windsor Control Panel" }),
|
|
944
|
+
/* @__PURE__ */ u3(BotSetup, { config, onSave: handleSave }),
|
|
945
|
+
/* @__PURE__ */ u3(ChannelBehaviors, { refreshKey }),
|
|
946
|
+
/* @__PURE__ */ u3(PrintModeSection, {}),
|
|
947
|
+
/* @__PURE__ */ u3(SecuritySection, { onSave: () => void loadConfig() }),
|
|
948
|
+
/* @__PURE__ */ u3(LogSection, {}),
|
|
949
|
+
/* @__PURE__ */ u3(RestartSection, {})
|
|
950
|
+
] });
|
|
951
|
+
}
|
|
952
|
+
var root = document.getElementById("app");
|
|
953
|
+
if (!root) throw new Error("Missing #app");
|
|
954
|
+
R(/* @__PURE__ */ u3(App, {}), root);
|
|
955
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29uc3RhbnRzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL3V0aWwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvb3B0aW9ucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtZWxlbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jb21wb25lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9wcm9wcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtY29udGV4dC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9kaWZmL2NoaWxkcmVuLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL2RpZmYvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvcmVuZGVyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL2Nsb25lLWVsZW1lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9jYXRjaC1lcnJvci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L2hvb2tzL3NyYy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L2pzeC1ydW50aW1lL3NyYy91dGlscy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jb25zdGFudHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3ByZWFjdC9qc3gtcnVudGltZS9zcmMvaW5kZXguanMiLCAiLi4vLi4vc3JjL3dlYi9hcHAudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiogTm9ybWFsIGh5ZHJhdGlvbiB0aGF0IGF0dGFjaGVzIHRvIGEgRE9NIHRyZWUgYnV0IGRvZXMgbm90IGRpZmYgaXQuICovXG5leHBvcnQgY29uc3QgTU9ERV9IWURSQVRFID0gMSA8PCA1O1xuLyoqIFNpZ25pZmllcyB0aGlzIFZOb2RlIHN1c3BlbmRlZCBvbiB0aGUgcHJldmlvdXMgcmVuZGVyICovXG5leHBvcnQgY29uc3QgTU9ERV9TVVNQRU5ERUQgPSAxIDw8IDc7XG4vKiogSW5kaWNhdGVzIHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGJlIGluc2VydGVkIHdoaWxlIHBhdGNoaW5nIGNoaWxkcmVuICovXG5leHBvcnQgY29uc3QgSU5TRVJUX1ZOT0RFID0gMSA8PCAyO1xuLyoqIEluZGljYXRlcyBhIFZOb2RlIGhhcyBiZWVuIG1hdGNoZWQgd2l0aCBhbm90aGVyIFZOb2RlIGluIHRoZSBkaWZmICovXG5leHBvcnQgY29uc3QgTUFUQ0hFRCA9IDEgPDwgMTtcblxuLyoqIFJlc2V0IGFsbCBtb2RlIGZsYWdzICovXG5leHBvcnQgY29uc3QgUkVTRVRfTU9ERSA9IH4oTU9ERV9IWURSQVRFIHwgTU9ERV9TVVNQRU5ERUQpO1xuXG5leHBvcnQgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5leHBvcnQgY29uc3QgWEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuZXhwb3J0IGNvbnN0IE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuXG5leHBvcnQgY29uc3QgTlVMTCA9IG51bGw7XG5leHBvcnQgY29uc3QgVU5ERUZJTkVEID0gdW5kZWZpbmVkO1xuZXhwb3J0IGNvbnN0IEVNUFRZX09CSiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoe30pO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSUiA9IFtdO1xuZXhwb3J0IGNvbnN0IElTX05PTl9ESU1FTlNJT05BTCA9XG5cdC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7XG4iLCAiaW1wb3J0IHsgRU1QVFlfQVJSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQXNzaWduIHByb3BlcnRpZXMgZnJvbSBgcHJvcHNgIHRvIGBvYmpgXG4gKiBAdGVtcGxhdGUgTywgUCBUaGUgb2JqIGFuZCBwcm9wcyB0eXBlc1xuICogQHBhcmFtIHtPfSBvYmogVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG9cbiAqIEBwYXJhbSB7UH0gcHJvcHMgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHJldHVybnMge08gJiBQfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKG9iaiwgcHJvcHMpIHtcblx0Ly8gQHRzLWV4cGVjdC1lcnJvciBXZSBjaGFuZ2UgdGhlIHR5cGUgb2YgYG9iamAgdG8gYmUgYE8gJiBQYFxuXHRmb3IgKGxldCBpIGluIHByb3BzKSBvYmpbaV0gPSBwcm9wc1tpXTtcblx0cmV0dXJuIC8qKiBAdHlwZSB7TyAmIFB9ICovIChvYmopO1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGNoaWxkIG5vZGUgZnJvbSBpdHMgcGFyZW50IGlmIGF0dGFjaGVkLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3JcbiAqIElFMTEgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUoKWAuIFVzaW5nIHRoaXMgZnVuY3Rpb25cbiAqIGlzIHNtYWxsZXIgdGhhbiBpbmNsdWRpbmcgYSBkZWRpY2F0ZWQgcG9seWZpbGwuXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbmRleCcpLkNvbnRhaW5lck5vZGV9IG5vZGUgVGhlIG5vZGUgdG8gcmVtb3ZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUpIHtcblx0aWYgKG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlKSBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG59XG5cbmV4cG9ydCBjb25zdCBzbGljZSA9IEVNUFRZX0FSUi5zbGljZTtcbiIsICJpbXBvcnQgeyBfY2F0Y2hFcnJvciB9IGZyb20gJy4vZGlmZi9jYXRjaC1lcnJvcic7XG5cbi8qKlxuICogVGhlIGBvcHRpb25gIG9iamVjdCBjYW4gcG90ZW50aWFsbHkgY29udGFpbiBjYWxsYmFjayBmdW5jdGlvbnNcbiAqIHRoYXQgYXJlIGNhbGxlZCBkdXJpbmcgdmFyaW91cyBzdGFnZXMgb2Ygb3VyIHJlbmRlcmVyLiBUaGlzIGlzIHRoZVxuICogZm91bmRhdGlvbiBvbiB3aGljaCBhbGwgb3VyIGFkZG9ucyBsaWtlIGBwcmVhY3QvZGVidWdgLCBgcHJlYWN0L2NvbXBhdGAsXG4gKiBhbmQgYHByZWFjdC9ob29rc2AgYXJlIGJhc2VkIG9uLiBTZWUgdGhlIGBPcHRpb25zYCB0eXBlIGluIGBpbnRlcm5hbC5kLnRzYFxuICogZm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBvcHRpb24gaG9va3MgKG1vc3QgZWRpdG9ycy9JREVzIGFsbG93IHlvdSB0b1xuICogY3RybCtjbGljayBvciBjbWQrY2xpY2sgb24gbWFjIHRoZSB0eXBlIGRlZmluaXRpb24gYmVsb3cpLlxuICogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLk9wdGlvbnN9XG4gKi9cbmNvbnN0IG9wdGlvbnMgPSB7XG5cdF9jYXRjaEVycm9yXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvcHRpb25zO1xuIiwgImltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBOVUxMLCBVTkRFRklORUQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmxldCB2bm9kZUlkID0gMDtcblxuLyoqXG4gKiBDcmVhdGUgYW4gdmlydHVhbCBub2RlICh1c2VkIGZvciBKU1gpXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlW1widHlwZVwiXX0gdHlwZSBUaGUgbm9kZSBuYW1lIG9yIENvbXBvbmVudCBjb25zdHJ1Y3RvciBmb3IgdGhpc1xuICogdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdCB8IG51bGwgfCB1bmRlZmluZWR9IFtwcm9wc10gVGhlIHByb3BlcnRpZXMgb2YgdGhlIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoJy4nKS5Db21wb25lbnRDaGlsZHJlbj59IFtjaGlsZHJlbl0gVGhlIGNoaWxkcmVuIG9mIHRoZVxuICogdmlydHVhbCBub2RlXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCBjaGlsZHJlbikge1xuXHRsZXQgbm9ybWFsaXplZFByb3BzID0ge30sXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRpO1xuXHRmb3IgKGkgaW4gcHJvcHMpIHtcblx0XHRpZiAoaSA9PSAna2V5Jykga2V5ID0gcHJvcHNbaV07XG5cdFx0ZWxzZSBpZiAoaSA9PSAncmVmJykgcmVmID0gcHJvcHNbaV07XG5cdFx0ZWxzZSBub3JtYWxpemVkUHJvcHNbaV0gPSBwcm9wc1tpXTtcblx0fVxuXG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuXHRcdG5vcm1hbGl6ZWRQcm9wcy5jaGlsZHJlbiA9XG5cdFx0XHRhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IGNoaWxkcmVuO1xuXHR9XG5cblx0Ly8gSWYgYSBDb21wb25lbnQgVk5vZGUsIGNoZWNrIGZvciBhbmQgYXBwbHkgZGVmYXVsdFByb3BzXG5cdC8vIE5vdGU6IHR5cGUgbWF5IGJlIHVuZGVmaW5lZCBpbiBkZXZlbG9wbWVudCwgbXVzdCBuZXZlciBlcnJvciBoZXJlLlxuXHRpZiAodHlwZW9mIHR5cGUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlLmRlZmF1bHRQcm9wcyAhPSBOVUxMKSB7XG5cdFx0Zm9yIChpIGluIHR5cGUuZGVmYXVsdFByb3BzKSB7XG5cdFx0XHRpZiAobm9ybWFsaXplZFByb3BzW2ldID09PSBVTkRFRklORUQpIHtcblx0XHRcdFx0bm9ybWFsaXplZFByb3BzW2ldID0gdHlwZS5kZWZhdWx0UHJvcHNbaV07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIG5vcm1hbGl6ZWRQcm9wcywga2V5LCByZWYsIE5VTEwpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIFZOb2RlICh1c2VkIGludGVybmFsbHkgYnkgUHJlYWN0KVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZVtcInR5cGVcIl19IHR5cGUgVGhlIG5vZGUgbmFtZSBvciBDb21wb25lbnRcbiAqIENvbnN0cnVjdG9yIGZvciB0aGlzIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtvYmplY3QgfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBwcm9wcyBUaGUgcHJvcGVydGllcyBvZiB0aGlzIHZpcnR1YWwgbm9kZS5cbiAqIElmIHRoaXMgdmlydHVhbCBub2RlIHJlcHJlc2VudHMgYSB0ZXh0IG5vZGUsIHRoaXMgaXMgdGhlIHRleHQgb2YgdGhlIG5vZGUgKHN0cmluZyBvciBudW1iZXIpLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBrZXkgVGhlIGtleSBmb3IgdGhpcyB2aXJ0dWFsIG5vZGUsIHVzZWQgd2hlblxuICogZGlmZmluZyBpdCBhZ2FpbnN0IGl0cyBjaGlsZHJlblxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZVtcInJlZlwiXX0gcmVmIFRoZSByZWYgcHJvcGVydHkgdGhhdCB3aWxsXG4gKiByZWNlaXZlIGEgcmVmZXJlbmNlIHRvIGl0cyBjcmVhdGVkIGNoaWxkXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wcywga2V5LCByZWYsIG9yaWdpbmFsKSB7XG5cdC8vIFY4IHNlZW1zIHRvIGJlIGJldHRlciBhdCBkZXRlY3RpbmcgdHlwZSBzaGFwZXMgaWYgdGhlIG9iamVjdCBpcyBhbGxvY2F0ZWQgZnJvbSB0aGUgc2FtZSBjYWxsIHNpdGVcblx0Ly8gRG8gbm90IGlubGluZSBpbnRvIGNyZWF0ZUVsZW1lbnQgYW5kIGNvZXJjZVRvVk5vZGUhXG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9ICovXG5cdGNvbnN0IHZub2RlID0ge1xuXHRcdHR5cGUsXG5cdFx0cHJvcHMsXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRfY2hpbGRyZW46IE5VTEwsXG5cdFx0X3BhcmVudDogTlVMTCxcblx0XHRfZGVwdGg6IDAsXG5cdFx0X2RvbTogTlVMTCxcblx0XHRfY29tcG9uZW50OiBOVUxMLFxuXHRcdGNvbnN0cnVjdG9yOiBVTkRFRklORUQsXG5cdFx0X29yaWdpbmFsOiBvcmlnaW5hbCA9PSBOVUxMID8gKyt2bm9kZUlkIDogb3JpZ2luYWwsXG5cdFx0X2luZGV4OiAtMSxcblx0XHRfZmxhZ3M6IDBcblx0fTtcblxuXHQvLyBPbmx5IGludm9rZSB0aGUgdm5vZGUgaG9vayBpZiB0aGlzIHdhcyAqbm90KiBhIGRpcmVjdCBjb3B5OlxuXHRpZiAob3JpZ2luYWwgPT0gTlVMTCAmJiBvcHRpb25zLnZub2RlICE9IE5VTEwpIG9wdGlvbnMudm5vZGUodm5vZGUpO1xuXG5cdHJldHVybiB2bm9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZigpIHtcblx0cmV0dXJuIHsgY3VycmVudDogTlVMTCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRnJhZ21lbnQocHJvcHMpIHtcblx0cmV0dXJuIHByb3BzLmNoaWxkcmVuO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgdGhlIGFyZ3VtZW50IGlzIGEgdmFsaWQgUHJlYWN0IFZOb2RlLlxuICogQHBhcmFtIHsqfSB2bm9kZVxuICogQHJldHVybnMge3Zub2RlIGlzIFZOb2RlfVxuICovXG5leHBvcnQgY29uc3QgaXNWYWxpZEVsZW1lbnQgPSB2bm9kZSA9PlxuXHR2bm9kZSAhPSBOVUxMICYmIHZub2RlLmNvbnN0cnVjdG9yID09PSBVTkRFRklORUQ7XG4iLCAiaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGRpZmYsIGNvbW1pdFJvb3QgfSBmcm9tICcuL2RpZmYvaW5kZXgnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBNT0RFX0hZRFJBVEUsIE5VTEwgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQmFzZSBDb21wb25lbnQgY2xhc3MuIFByb3ZpZGVzIGBzZXRTdGF0ZSgpYCBhbmQgYGZvcmNlVXBkYXRlKClgLCB3aGljaFxuICogdHJpZ2dlciByZW5kZXJpbmdcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBUaGUgaW5pdGlhbCBjb21wb25lbnQgcHJvcHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0IFRoZSBpbml0aWFsIGNvbnRleHQgZnJvbSBwYXJlbnQgY29tcG9uZW50cydcbiAqIGdldENoaWxkQ29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gQmFzZUNvbXBvbmVudChwcm9wcywgY29udGV4dCkge1xuXHR0aGlzLnByb3BzID0gcHJvcHM7XG5cdHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbi8qKlxuICogVXBkYXRlIGNvbXBvbmVudCBzdGF0ZSBhbmQgc2NoZWR1bGUgYSByZS1yZW5kZXIuXG4gKiBAdGhpcyB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fVxuICogQHBhcmFtIHtvYmplY3QgfCAoKHM6IG9iamVjdCwgcDogb2JqZWN0KSA9PiBvYmplY3QpfSB1cGRhdGUgQSBoYXNoIG9mIHN0YXRlXG4gKiBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSB3aXRoIG5ldyB2YWx1ZXMgb3IgYSBmdW5jdGlvbiB0aGF0IGdpdmVuIHRoZSBjdXJyZW50XG4gKiBzdGF0ZSBhbmQgcHJvcHMgcmV0dXJucyBhIG5ldyBwYXJ0aWFsIHN0YXRlXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IFtjYWxsYmFja10gQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSBjb21wb25lbnQgc3RhdGUgaXNcbiAqIHVwZGF0ZWRcbiAqL1xuQmFzZUNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAodXBkYXRlLCBjYWxsYmFjaykge1xuXHQvLyBvbmx5IGNsb25lIHN0YXRlIHdoZW4gY29weWluZyB0byBuZXh0U3RhdGUgdGhlIGZpcnN0IHRpbWUuXG5cdGxldCBzO1xuXHRpZiAodGhpcy5fbmV4dFN0YXRlICE9IE5VTEwgJiYgdGhpcy5fbmV4dFN0YXRlICE9IHRoaXMuc3RhdGUpIHtcblx0XHRzID0gdGhpcy5fbmV4dFN0YXRlO1xuXHR9IGVsc2Uge1xuXHRcdHMgPSB0aGlzLl9uZXh0U3RhdGUgPSBhc3NpZ24oe30sIHRoaXMuc3RhdGUpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB1cGRhdGUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdC8vIFNvbWUgbGlicmFyaWVzIGxpa2UgYGltbWVyYCBtYXJrIHRoZSBjdXJyZW50IHN0YXRlIGFzIHJlYWRvbmx5LFxuXHRcdC8vIHByZXZlbnRpbmcgdXMgZnJvbSBtdXRhdGluZyBpdCwgc28gd2UgbmVlZCB0byBjbG9uZSBpdC4gU2VlICMyNzE2XG5cdFx0dXBkYXRlID0gdXBkYXRlKGFzc2lnbih7fSwgcyksIHRoaXMucHJvcHMpO1xuXHR9XG5cblx0aWYgKHVwZGF0ZSkge1xuXHRcdGFzc2lnbihzLCB1cGRhdGUpO1xuXHR9XG5cblx0Ly8gU2tpcCB1cGRhdGUgaWYgdXBkYXRlciBmdW5jdGlvbiByZXR1cm5lZCBudWxsXG5cdGlmICh1cGRhdGUgPT0gTlVMTCkgcmV0dXJuO1xuXG5cdGlmICh0aGlzLl92bm9kZSkge1xuXHRcdGlmIChjYWxsYmFjaykge1xuXHRcdFx0dGhpcy5fc3RhdGVDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG5cdFx0fVxuXHRcdGVucXVldWVSZW5kZXIodGhpcyk7XG5cdH1cbn07XG5cbi8qKlxuICogSW1tZWRpYXRlbHkgcGVyZm9ybSBhIHN5bmNocm9ub3VzIHJlLXJlbmRlciBvZiB0aGUgY29tcG9uZW50XG4gKiBAdGhpcyB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBbY2FsbGJhY2tdIEEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpc1xuICogcmUtcmVuZGVyZWRcbiAqL1xuQmFzZUNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcblx0aWYgKHRoaXMuX3Zub2RlKSB7XG5cdFx0Ly8gU2V0IHJlbmRlciBtb2RlIHNvIHRoYXQgd2UgY2FuIGRpZmZlcmVudGlhdGUgd2hlcmUgdGhlIHJlbmRlciByZXF1ZXN0XG5cdFx0Ly8gaXMgY29taW5nIGZyb20uIFdlIG5lZWQgdGhpcyBiZWNhdXNlIGZvcmNlVXBkYXRlIHNob3VsZCBuZXZlciBjYWxsXG5cdFx0Ly8gc2hvdWxkQ29tcG9uZW50VXBkYXRlXG5cdFx0dGhpcy5fZm9yY2UgPSB0cnVlO1xuXHRcdGlmIChjYWxsYmFjaykgdGhpcy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuXHRcdGVucXVldWVSZW5kZXIodGhpcyk7XG5cdH1cbn07XG5cbi8qKlxuICogQWNjZXB0cyBgcHJvcHNgIGFuZCBgc3RhdGVgLCBhbmQgcmV0dXJucyBhIG5ldyBWaXJ0dWFsIERPTSB0cmVlIHRvIGJ1aWxkLlxuICogVmlydHVhbCBET00gaXMgZ2VuZXJhbGx5IGNvbnN0cnVjdGVkIHZpYSBbSlNYXShodHRwczovL2phc29uZm9ybWF0LmNvbS93dGYtaXMtanN4KS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBQcm9wcyAoZWc6IEpTWCBhdHRyaWJ1dGVzKSByZWNlaXZlZCBmcm9tIHBhcmVudFxuICogZWxlbWVudC9jb21wb25lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZSBUaGUgY29tcG9uZW50J3MgY3VycmVudCBzdGF0ZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCBvYmplY3QsIGFzIHJldHVybmVkIGJ5IHRoZSBuZWFyZXN0XG4gKiBhbmNlc3RvcidzIGBnZXRDaGlsZENvbnRleHQoKWBcbiAqIEByZXR1cm5zIHtDb21wb25lbnRDaGlsZHJlbiB8IHZvaWR9XG4gKi9cbkJhc2VDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IEZyYWdtZW50O1xuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9IHZub2RlXG4gKiBAcGFyYW0ge251bWJlciB8IG51bGx9IFtjaGlsZEluZGV4XVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tU2libGluZyh2bm9kZSwgY2hpbGRJbmRleCkge1xuXHRpZiAoY2hpbGRJbmRleCA9PSBOVUxMKSB7XG5cdFx0Ly8gVXNlIGNoaWxkSW5kZXg9PW51bGwgYXMgYSBzaWduYWwgdG8gcmVzdW1lIHRoZSBzZWFyY2ggZnJvbSB0aGUgdm5vZGUncyBzaWJsaW5nXG5cdFx0cmV0dXJuIHZub2RlLl9wYXJlbnRcblx0XHRcdD8gZ2V0RG9tU2libGluZyh2bm9kZS5fcGFyZW50LCB2bm9kZS5faW5kZXggKyAxKVxuXHRcdFx0OiBOVUxMO1xuXHR9XG5cblx0bGV0IHNpYmxpbmc7XG5cdGZvciAoOyBjaGlsZEluZGV4IDwgdm5vZGUuX2NoaWxkcmVuLmxlbmd0aDsgY2hpbGRJbmRleCsrKSB7XG5cdFx0c2libGluZyA9IHZub2RlLl9jaGlsZHJlbltjaGlsZEluZGV4XTtcblxuXHRcdGlmIChzaWJsaW5nICE9IE5VTEwgJiYgc2libGluZy5fZG9tICE9IE5VTEwpIHtcblx0XHRcdC8vIFNpbmNlIHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzIGtlZXBzIF9kb20gcG9pbnRlciBjb3JyZWN0LFxuXHRcdFx0Ly8gd2UgY2FuIHJlbHkgb24gX2RvbSB0byB0ZWxsIHVzIGlmIHRoaXMgc3VidHJlZSBjb250YWlucyBhXG5cdFx0XHQvLyByZW5kZXJlZCBET00gbm9kZSwgYW5kIHdoYXQgdGhlIGZpcnN0IHJlbmRlcmVkIERPTSBub2RlIGlzXG5cdFx0XHRyZXR1cm4gc2libGluZy5fZG9tO1xuXHRcdH1cblx0fVxuXG5cdC8vIElmIHdlIGdldCBoZXJlLCB3ZSBoYXZlIG5vdCBmb3VuZCBhIERPTSBub2RlIGluIHRoaXMgdm5vZGUncyBjaGlsZHJlbi5cblx0Ly8gV2UgbXVzdCByZXN1bWUgZnJvbSB0aGlzIHZub2RlJ3Mgc2libGluZyAoaW4gaXQncyBwYXJlbnQgX2NoaWxkcmVuIGFycmF5KVxuXHQvLyBPbmx5IGNsaW1iIHVwIGFuZCBzZWFyY2ggdGhlIHBhcmVudCBpZiB3ZSBhcmVuJ3Qgc2VhcmNoaW5nIHRocm91Z2ggYSBET01cblx0Ly8gVk5vZGUgKG1lYW5pbmcgd2UgcmVhY2hlZCB0aGUgRE9NIHBhcmVudCBvZiB0aGUgb3JpZ2luYWwgdm5vZGUgdGhhdCBiZWdhblxuXHQvLyB0aGUgc2VhcmNoKVxuXHRyZXR1cm4gdHlwZW9mIHZub2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyA/IGdldERvbVNpYmxpbmcodm5vZGUpIDogTlVMTDtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGluLXBsYWNlIHJlLXJlbmRlcmluZyBvZiBhIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byByZXJlbmRlclxuICovXG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnQoY29tcG9uZW50KSB7XG5cdGlmIChjb21wb25lbnQuX3BhcmVudERvbSAmJiBjb21wb25lbnQuX2RpcnR5KSB7XG5cdFx0bGV0IG9sZFZOb2RlID0gY29tcG9uZW50Ll92bm9kZSxcblx0XHRcdG9sZERvbSA9IG9sZFZOb2RlLl9kb20sXG5cdFx0XHRjb21taXRRdWV1ZSA9IFtdLFxuXHRcdFx0cmVmUXVldWUgPSBbXSxcblx0XHRcdG5ld1ZOb2RlID0gYXNzaWduKHt9LCBvbGRWTm9kZSk7XG5cdFx0bmV3Vk5vZGUuX29yaWdpbmFsID0gb2xkVk5vZGUuX29yaWdpbmFsICsgMTtcblx0XHRpZiAob3B0aW9ucy52bm9kZSkgb3B0aW9ucy52bm9kZShuZXdWTm9kZSk7XG5cblx0XHRkaWZmKFxuXHRcdFx0Y29tcG9uZW50Ll9wYXJlbnREb20sXG5cdFx0XHRuZXdWTm9kZSxcblx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0Y29tcG9uZW50Ll9nbG9iYWxDb250ZXh0LFxuXHRcdFx0Y29tcG9uZW50Ll9wYXJlbnREb20ubmFtZXNwYWNlVVJJLFxuXHRcdFx0b2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFID8gW29sZERvbV0gOiBOVUxMLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRvbGREb20gPT0gTlVMTCA/IGdldERvbVNpYmxpbmcob2xkVk5vZGUpIDogb2xkRG9tLFxuXHRcdFx0ISEob2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFKSxcblx0XHRcdHJlZlF1ZXVlXG5cdFx0KTtcblxuXHRcdG5ld1ZOb2RlLl9vcmlnaW5hbCA9IG9sZFZOb2RlLl9vcmlnaW5hbDtcblx0XHRuZXdWTm9kZS5fcGFyZW50Ll9jaGlsZHJlbltuZXdWTm9kZS5faW5kZXhdID0gbmV3Vk5vZGU7XG5cdFx0Y29tbWl0Um9vdChjb21taXRRdWV1ZSwgbmV3Vk5vZGUsIHJlZlF1ZXVlKTtcblx0XHRvbGRWTm9kZS5fZG9tID0gb2xkVk5vZGUuX3BhcmVudCA9IG51bGw7XG5cblx0XHRpZiAobmV3Vk5vZGUuX2RvbSAhPSBvbGREb20pIHtcblx0XHRcdHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzKG5ld1ZOb2RlKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlfSB2bm9kZVxuICovXG5mdW5jdGlvbiB1cGRhdGVQYXJlbnREb21Qb2ludGVycyh2bm9kZSkge1xuXHRpZiAoKHZub2RlID0gdm5vZGUuX3BhcmVudCkgIT0gTlVMTCAmJiB2bm9kZS5fY29tcG9uZW50ICE9IE5VTEwpIHtcblx0XHR2bm9kZS5fZG9tID0gdm5vZGUuX2NvbXBvbmVudC5iYXNlID0gTlVMTDtcblx0XHR2bm9kZS5fY2hpbGRyZW4uc29tZShjaGlsZCA9PiB7XG5cdFx0XHRpZiAoY2hpbGQgIT0gTlVMTCAmJiBjaGlsZC5fZG9tICE9IE5VTEwpIHtcblx0XHRcdFx0cmV0dXJuICh2bm9kZS5fZG9tID0gdm5vZGUuX2NvbXBvbmVudC5iYXNlID0gY2hpbGQuX2RvbSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdXBkYXRlUGFyZW50RG9tUG9pbnRlcnModm5vZGUpO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIHJlbmRlciBxdWV1ZVxuICogQHR5cGUge0FycmF5PGltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudD59XG4gKi9cbmxldCByZXJlbmRlclF1ZXVlID0gW107XG5cbi8qXG4gKiBUaGUgdmFsdWUgb2YgYENvbXBvbmVudC5kZWJvdW5jZWAgbXVzdCBhc3luY2hyb25vdXNseSBpbnZva2UgdGhlIHBhc3NlZCBpbiBjYWxsYmFjay4gSXQgaXNcbiAqIGltcG9ydGFudCB0aGF0IGNvbnRyaWJ1dG9ycyB0byBQcmVhY3QgY2FuIGNvbnNpc3RlbnRseSByZWFzb24gYWJvdXQgd2hhdCBjYWxscyB0byBgc2V0U3RhdGVgLCBldGMuXG4gKiBkbywgYW5kIHdoZW4gdGhlaXIgZWZmZWN0cyB3aWxsIGJlIGFwcGxpZWQuIFNlZSB0aGUgbGlua3MgYmVsb3cgZm9yIHNvbWUgZnVydGhlciByZWFkaW5nIG9uIGRlc2lnbmluZ1xuICogYXN5bmNocm9ub3VzIEFQSXMuXG4gKiAqIFtEZXNpZ25pbmcgQVBJcyBmb3IgQXN5bmNocm9ueV0oaHR0cHM6Ly9ibG9nLml6cy5tZS8yMDEzLzA4L2Rlc2lnbmluZy1hcGlzLWZvci1hc3luY2hyb255KVxuICogKiBbQ2FsbGJhY2tzIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXNdKGh0dHBzOi8vYmxvZy5vbWV0ZXIuY29tLzIwMTEvMDcvMjQvY2FsbGJhY2tzLXN5bmNocm9ub3VzLWFuZC1hc3luY2hyb25vdXMvKVxuICovXG5cbmxldCBwcmV2RGVib3VuY2U7XG5cbmNvbnN0IGRlZmVyID1cblx0dHlwZW9mIFByb21pc2UgPT0gJ2Z1bmN0aW9uJ1xuXHRcdD8gUHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKVxuXHRcdDogc2V0VGltZW91dDtcblxuLyoqXG4gKiBFbnF1ZXVlIGEgcmVyZW5kZXIgb2YgYSBjb21wb25lbnRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSBjIFRoZSBjb21wb25lbnQgdG8gcmVyZW5kZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVucXVldWVSZW5kZXIoYykge1xuXHRpZiAoXG5cdFx0KCFjLl9kaXJ0eSAmJlxuXHRcdFx0KGMuX2RpcnR5ID0gdHJ1ZSkgJiZcblx0XHRcdHJlcmVuZGVyUXVldWUucHVzaChjKSAmJlxuXHRcdFx0IXByb2Nlc3MuX3JlcmVuZGVyQ291bnQrKykgfHxcblx0XHRwcmV2RGVib3VuY2UgIT0gb3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZ1xuXHQpIHtcblx0XHRwcmV2RGVib3VuY2UgPSBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nO1xuXHRcdChwcmV2RGVib3VuY2UgfHwgZGVmZXIpKHByb2Nlc3MpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9IGFcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSBiXG4gKi9cbmNvbnN0IGRlcHRoU29ydCA9IChhLCBiKSA9PiBhLl92bm9kZS5fZGVwdGggLSBiLl92bm9kZS5fZGVwdGg7XG5cbi8qKiBGbHVzaCB0aGUgcmVuZGVyIHF1ZXVlIGJ5IHJlcmVuZGVyaW5nIGFsbCBxdWV1ZWQgY29tcG9uZW50cyAqL1xuZnVuY3Rpb24gcHJvY2VzcygpIHtcblx0dHJ5IHtcblx0XHRsZXQgYyxcblx0XHRcdGwgPSAxO1xuXG5cdFx0Ly8gRG9uJ3QgdXBkYXRlIGByZW5kZXJDb3VudGAgeWV0LiBLZWVwIGl0cyB2YWx1ZSBub24temVybyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5XG5cdFx0Ly8gcHJvY2VzcygpIGNhbGxzIGZyb20gZ2V0dGluZyBzY2hlZHVsZWQgd2hpbGUgYHF1ZXVlYCBpcyBzdGlsbCBiZWluZyBjb25zdW1lZC5cblx0XHR3aGlsZSAocmVyZW5kZXJRdWV1ZS5sZW5ndGgpIHtcblx0XHRcdC8vIEtlZXAgdGhlIHJlcmVuZGVyIHF1ZXVlIHNvcnRlZCBieSAoZGVwdGgsIGluc2VydGlvbiBvcmRlcikuIFRoZSBxdWV1ZVxuXHRcdFx0Ly8gd2lsbCBpbml0aWFsbHkgYmUgc29ydGVkIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24gb25seSBpZiBpdCBoYXMgbW9yZSB0aGFuIDEgaXRlbS5cblx0XHRcdC8vXG5cdFx0XHQvLyBOZXcgaXRlbXMgY2FuIGJlIGFkZGVkIHRvIHRoZSBxdWV1ZSBlLmcuIHdoZW4gcmVyZW5kZXJpbmcgYSBwcm92aWRlciwgc28gd2Ugd2FudCB0b1xuXHRcdFx0Ly8ga2VlcCB0aGUgb3JkZXIgZnJvbSB0b3AgdG8gYm90dG9tIHdpdGggdGhvc2UgbmV3IGl0ZW1zIHNvIHdlIGNhbiBoYW5kbGUgdGhlbSBpbiBhXG5cdFx0XHQvLyBzaW5nbGUgcGFzc1xuXHRcdFx0aWYgKHJlcmVuZGVyUXVldWUubGVuZ3RoID4gbCkge1xuXHRcdFx0XHRyZXJlbmRlclF1ZXVlLnNvcnQoZGVwdGhTb3J0KTtcblx0XHRcdH1cblxuXHRcdFx0YyA9IHJlcmVuZGVyUXVldWUuc2hpZnQoKTtcblx0XHRcdGwgPSByZXJlbmRlclF1ZXVlLmxlbmd0aDtcblxuXHRcdFx0cmVuZGVyQ29tcG9uZW50KGMpO1xuXHRcdH1cblx0fSBmaW5hbGx5IHtcblx0XHRyZXJlbmRlclF1ZXVlLmxlbmd0aCA9IHByb2Nlc3MuX3JlcmVuZGVyQ291bnQgPSAwO1xuXHR9XG59XG5cbnByb2Nlc3MuX3JlcmVuZGVyQ291bnQgPSAwO1xuIiwgImltcG9ydCB7IElTX05PTl9ESU1FTlNJT05BTCwgTlVMTCwgU1ZHX05BTUVTUEFDRSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuLy8gUGVyLWluc3RhbmNlIHVuaXF1ZSBrZXkgZm9yIGV2ZW50IGNsb2NrIHN0YW1wcy4gRWFjaCBQcmVhY3QgY29weSBvbiB0aGUgcGFnZVxuLy8gZ2V0cyBpdHMgb3duIHJhbmRvbSBzdWZmaXggc28gdGhhdCBgX2Rpc3BhdGNoZWRgIC8gYF9hdHRhY2hlZGAgcHJvcGVydGllcyBvblxuLy8gc2hhcmVkIGV2ZW50IG9iamVjdHMgYW5kIGhhbmRsZXIgZnVuY3Rpb25zIGNhbm5vdCBjb2xsaWRlIGFjcm9zcyBpbnN0YW5jZXMuXG4vLyB+MSBpbiA2ME0gY29sbGlzaW9uIG9kZHMgLSBpZiB5b3UgaGF2ZSB0aGF0IG1hbnkgcHJhZWN0IHZlcnNpb25zIG9uIHRoZSBwYWdlLFxuLy8geW91IGRlc2VydmUgc29tZSB3ZWlyZCBidWdzLlxuLy8gSW4gMTEgd2UgY2FuIHJlcGxhY2UgdGhpcyB3aXRoIGFcbi8vIFN5bWJvbFxubGV0IF9pZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoOCksXG5cdEVWRU5UX0RJU1BBVENIRUQgPSAnX19kJyArIF9pZCxcblx0RVZFTlRfQVRUQUNIRUQgPSAnX19hJyArIF9pZDtcblxuZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUsIGtleSwgdmFsdWUpIHtcblx0aWYgKGtleVswXSA9PSAnLScpIHtcblx0XHRzdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlID09IE5VTEwgPyAnJyA6IHZhbHVlKTtcblx0fSBlbHNlIGlmICh2YWx1ZSA9PSBOVUxMKSB7XG5cdFx0c3R5bGVba2V5XSA9ICcnO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnbnVtYmVyJyB8fCBJU19OT05fRElNRU5TSU9OQUwudGVzdChrZXkpKSB7XG5cdFx0c3R5bGVba2V5XSA9IHZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlW2tleV0gPSB2YWx1ZSArICdweCc7XG5cdH1cbn1cblxuY29uc3QgQ0FQVFVSRV9SRUdFWCA9IC8oUG9pbnRlckNhcHR1cmUpJHxDYXB0dXJlJC9pO1xuXG4vLyBBIGxvZ2ljYWwgY2xvY2sgdG8gc29sdmUgaXNzdWVzIGxpa2UgaHR0cHM6Ly9naXRodWIuY29tL3ByZWFjdGpzL3ByZWFjdC9pc3N1ZXMvMzkyNy5cbi8vIFdoZW4gdGhlIERPTSBwZXJmb3JtcyBhbiBldmVudCBpdCBsZWF2ZXMgbWljcm8tdGlja3MgaW4gYmV0d2VlbiBidWJibGluZyB1cCB3aGljaCBtZWFucyB0aGF0XG4vLyBhbiBldmVudCBjYW4gdHJpZ2dlciBvbiBhIG5ld2x5IHJlYXRlZCBET00tbm9kZSB3aGlsZSB0aGUgZXZlbnQgYnViYmxlcyB1cC5cbi8vXG4vLyBPcmlnaW5hbGx5IGluc3BpcmVkIGJ5IFZ1ZVxuLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy9jb3JlL2Jsb2IvY2FlYjhhNjg4MTFhMWIwZjc5L3BhY2thZ2VzL3J1bnRpbWUtZG9tL3NyYy9tb2R1bGVzL2V2ZW50cy50cyNMOTAtTDEwMSksXG4vLyBidXQgbW9kaWZpZWQgdG8gdXNlIGEgbG9naWNhbCBjbG9jayBpbnN0ZWFkIG9mIERhdGUubm93KCkgaW4gY2FzZSBldmVudCBoYW5kbGVycyBnZXQgYXR0YWNoZWRcbi8vIGFuZCBldmVudHMgZ2V0IGRpc3BhdGNoZWQgZHVyaW5nIHRoZSBzYW1lIG1pbGxpc2Vjb25kLlxuLy9cbi8vIFRoZSBjbG9jayBpcyBpbmNyZW1lbnRlZCBhZnRlciBlYWNoIG5ldyBldmVudCBkaXNwYXRjaC4gVGhpcyBhbGxvd3MgMSAwMDAgMDAwIG5ldyBldmVudHNcbi8vIHBlciBzZWNvbmQgZm9yIG92ZXIgMjgwIHllYXJzIGJlZm9yZSB0aGUgdmFsdWUgcmVhY2hlcyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAoMioqNTMgLSAxKS5cbmxldCBldmVudENsb2NrID0gMDtcblxuLyoqXG4gKiBTZXQgYSBwcm9wZXJ0eSB2YWx1ZSBvbiBhIERPTSBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBkb20gVGhlIERPTSBub2RlIHRvIG1vZGlmeVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0b1xuICogQHBhcmFtIHsqfSBvbGRWYWx1ZSBUaGUgb2xkIHZhbHVlIHRoZSBwcm9wZXJ0eSBoYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgV2hldGhlciBvciBub3QgdGhpcyBET00gbm9kZSBpcyBhbiBTVkcgbm9kZSBvciBub3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFByb3BlcnR5KGRvbSwgbmFtZSwgdmFsdWUsIG9sZFZhbHVlLCBuYW1lc3BhY2UpIHtcblx0bGV0IHVzZUNhcHR1cmU7XG5cblx0bzogaWYgKG5hbWUgPT0gJ3N0eWxlJykge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcblx0XHRcdGRvbS5zdHlsZS5jc3NUZXh0ID0gdmFsdWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0eXBlb2Ygb2xkVmFsdWUgPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0ZG9tLnN0eWxlLmNzc1RleHQgPSBvbGRWYWx1ZSA9ICcnO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob2xkVmFsdWUpIHtcblx0XHRcdFx0Zm9yIChuYW1lIGluIG9sZFZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKCEodmFsdWUgJiYgbmFtZSBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0XHRcdHNldFN0eWxlKGRvbS5zdHlsZSwgbmFtZSwgJycpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodmFsdWUpIHtcblx0XHRcdFx0Zm9yIChuYW1lIGluIHZhbHVlKSB7XG5cdFx0XHRcdFx0aWYgKCFvbGRWYWx1ZSB8fCB2YWx1ZVtuYW1lXSAhPSBvbGRWYWx1ZVtuYW1lXSkge1xuXHRcdFx0XHRcdFx0c2V0U3R5bGUoZG9tLnN0eWxlLCBuYW1lLCB2YWx1ZVtuYW1lXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIEJlbmNobWFyayBmb3IgY29tcGFyaXNvbjogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81NzRjOTU0YmRiOTY1YjlhMDA5NjVhYzZcblx0ZWxzZSBpZiAobmFtZVswXSA9PSAnbycgJiYgbmFtZVsxXSA9PSAnbicpIHtcblx0XHR1c2VDYXB0dXJlID0gbmFtZSAhPSAobmFtZSA9IG5hbWUucmVwbGFjZShDQVBUVVJFX1JFR0VYLCAnJDEnKSk7XG5cdFx0Y29uc3QgbG93ZXJDYXNlTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdC8vIEluZmVyIGNvcnJlY3QgY2FzaW5nIGZvciBET00gYnVpbHQtaW4gZXZlbnRzOlxuXHRcdGlmIChsb3dlckNhc2VOYW1lIGluIGRvbSB8fCBuYW1lID09ICdvbkZvY3VzT3V0JyB8fCBuYW1lID09ICdvbkZvY3VzSW4nKVxuXHRcdFx0bmFtZSA9IGxvd2VyQ2FzZU5hbWUuc2xpY2UoMik7XG5cdFx0ZWxzZSBuYW1lID0gbmFtZS5zbGljZSgyKTtcblxuXHRcdGlmICghZG9tLl9saXN0ZW5lcnMpIGRvbS5fbGlzdGVuZXJzID0ge307XG5cdFx0ZG9tLl9saXN0ZW5lcnNbbmFtZSArIHVzZUNhcHR1cmVdID0gdmFsdWU7XG5cblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdGlmICghb2xkVmFsdWUpIHtcblx0XHRcdFx0dmFsdWVbRVZFTlRfQVRUQUNIRURdID0gZXZlbnRDbG9jaztcblx0XHRcdFx0ZG9tLmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHR1c2VDYXB0dXJlID8gZXZlbnRQcm94eUNhcHR1cmUgOiBldmVudFByb3h5LFxuXHRcdFx0XHRcdHVzZUNhcHR1cmVcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbHVlW0VWRU5UX0FUVEFDSEVEXSA9IG9sZFZhbHVlW0VWRU5UX0FUVEFDSEVEXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoXG5cdFx0XHRcdG5hbWUsXG5cdFx0XHRcdHVzZUNhcHR1cmUgPyBldmVudFByb3h5Q2FwdHVyZSA6IGV2ZW50UHJveHksXG5cdFx0XHRcdHVzZUNhcHR1cmVcblx0XHRcdCk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGlmIChuYW1lc3BhY2UgPT0gU1ZHX05BTUVTUEFDRSkge1xuXHRcdFx0Ly8gTm9ybWFsaXplIGluY29ycmVjdCBwcm9wIHVzYWdlIGZvciBTVkc6XG5cdFx0XHQvLyAtIHhsaW5rOmhyZWYgLyB4bGlua0hyZWYgLS0+IGhyZWYgKHhsaW5rOmhyZWYgd2FzIHJlbW92ZWQgZnJvbSBTVkcgYW5kIGlzbid0IG5lZWRlZClcblx0XHRcdC8vIC0gY2xhc3NOYW1lIC0tPiBjbGFzc1xuXHRcdFx0bmFtZSA9IG5hbWUucmVwbGFjZSgveGxpbmsoSHw6aCkvLCAnaCcpLnJlcGxhY2UoL3NOYW1lJC8sICdzJyk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdG5hbWUgIT0gJ3dpZHRoJyAmJlxuXHRcdFx0bmFtZSAhPSAnaGVpZ2h0JyAmJlxuXHRcdFx0bmFtZSAhPSAnaHJlZicgJiZcblx0XHRcdG5hbWUgIT0gJ2xpc3QnICYmXG5cdFx0XHRuYW1lICE9ICdmb3JtJyAmJlxuXHRcdFx0Ly8gRGVmYXVsdCB2YWx1ZSBpbiBicm93c2VycyBpcyBgLTFgIGFuZCBhbiBlbXB0eSBzdHJpbmcgaXNcblx0XHRcdC8vIGNhc3QgdG8gYDBgIGluc3RlYWRcblx0XHRcdG5hbWUgIT0gJ3RhYkluZGV4JyAmJlxuXHRcdFx0bmFtZSAhPSAnZG93bmxvYWQnICYmXG5cdFx0XHRuYW1lICE9ICdyb3dTcGFuJyAmJlxuXHRcdFx0bmFtZSAhPSAnY29sU3BhbicgJiZcblx0XHRcdG5hbWUgIT0gJ3JvbGUnICYmXG5cdFx0XHRuYW1lICE9ICdwb3BvdmVyJyAmJlxuXHRcdFx0bmFtZSBpbiBkb21cblx0XHQpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRvbVtuYW1lXSA9IHZhbHVlID09IE5VTEwgPyAnJyA6IHZhbHVlO1xuXHRcdFx0XHQvLyBsYWJlbGxlZCBicmVhayBpcyAxYiBzbWFsbGVyIGhlcmUgdGhhbiBhIHJldHVybiBzdGF0ZW1lbnQgKHNvcnJ5KVxuXHRcdFx0XHRicmVhayBvO1xuXHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHR9XG5cblx0XHQvLyBhcmlhLSBhbmQgZGF0YS0gYXR0cmlidXRlcyBoYXZlIG5vIGJvb2xlYW4gcmVwcmVzZW50YXRpb24uXG5cdFx0Ly8gQSBgZmFsc2VgIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhdHRyaWJ1dGUgbm90IGJlaW5nXG5cdFx0Ly8gcHJlc2VudCwgc28gd2UgY2FuJ3QgcmVtb3ZlIGl0LiBGb3Igbm9uLWJvb2xlYW4gYXJpYVxuXHRcdC8vIGF0dHJpYnV0ZXMgd2UgY291bGQgdHJlYXQgZmFsc2UgYXMgYSByZW1vdmFsLCBidXQgdGhlXG5cdFx0Ly8gYW1vdW50IG9mIGV4Y2VwdGlvbnMgd291bGQgY29zdCB0b28gbWFueSBieXRlcy4gT24gdG9wIG9mXG5cdFx0Ly8gdGhhdCBvdGhlciBmcmFtZXdvcmtzIGdlbmVyYWxseSBzdHJpbmdpZnkgYGZhbHNlYC5cblxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Ly8gbmV2ZXIgc2VyaWFsaXplIGZ1bmN0aW9ucyBhcyBhdHRyaWJ1dGUgdmFsdWVzXG5cdFx0fSBlbHNlIGlmICh2YWx1ZSAhPSBOVUxMICYmICh2YWx1ZSAhPT0gZmFsc2UgfHwgbmFtZVs0XSA9PSAnLScpKSB7XG5cdFx0XHRkb20uc2V0QXR0cmlidXRlKG5hbWUsIG5hbWUgPT0gJ3BvcG92ZXInICYmIHZhbHVlID09IHRydWUgPyAnJyA6IHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gZXZlbnQgcHJveHkgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHVzZUNhcHR1cmUgSXMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBjYXB0dXJlIHBoYXNlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRXZlbnRQcm94eSh1c2VDYXB0dXJlKSB7XG5cdC8qKlxuXHQgKiBQcm94eSBhbiBldmVudCB0byBob29rZWQgZXZlbnQgaGFuZGxlcnNcblx0ICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuUHJlYWN0RXZlbnR9IGUgVGhlIGV2ZW50IG9iamVjdCBmcm9tIHRoZSBicm93c2VyXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRyZXR1cm4gZnVuY3Rpb24gKGUpIHtcblx0XHRpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG5cdFx0XHRjb25zdCBldmVudEhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnNbZS50eXBlICsgdXNlQ2FwdHVyZV07XG5cdFx0XHRpZiAoZVtFVkVOVF9ESVNQQVRDSEVEXSA9PSBOVUxMKSB7XG5cdFx0XHRcdGVbRVZFTlRfRElTUEFUQ0hFRF0gPSBldmVudENsb2NrKys7XG5cblx0XHRcdFx0Ly8gV2hlbiBgZVtFVkVOVF9ESVNQQVRDSEVEXWAgaXMgc21hbGxlciB0aGFuIHRoZSB0aW1lIHdoZW4gdGhlIHRhcmdldGVkIGV2ZW50XG5cdFx0XHRcdC8vIGhhbmRsZXIgd2FzIGF0dGFjaGVkIHdlIGtub3cgd2UgaGF2ZSBidWJibGVkIHVwIHRvIGFuIGVsZW1lbnQgdGhhdCB3YXMgYWRkZWRcblx0XHRcdFx0Ly8gZHVyaW5nIHBhdGNoaW5nIHRoZSBET00uXG5cdFx0XHR9IGVsc2UgaWYgKGVbRVZFTlRfRElTUEFUQ0hFRF0gPCBldmVudEhhbmRsZXJbRVZFTlRfQVRUQUNIRURdKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHJldHVybiBldmVudEhhbmRsZXIob3B0aW9ucy5ldmVudCA/IG9wdGlvbnMuZXZlbnQoZSkgOiBlKTtcblx0XHR9XG5cdH07XG59XG5cbmNvbnN0IGV2ZW50UHJveHkgPSBjcmVhdGVFdmVudFByb3h5KGZhbHNlKTtcbmNvbnN0IGV2ZW50UHJveHlDYXB0dXJlID0gY3JlYXRlRXZlbnRQcm94eSh0cnVlKTtcbiIsICJpbXBvcnQgeyBlbnF1ZXVlUmVuZGVyIH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgTlVMTCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGxldCBpID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG5cdGZ1bmN0aW9uIENvbnRleHQocHJvcHMpIHtcblx0XHRpZiAoIXRoaXMuZ2V0Q2hpbGRDb250ZXh0KSB7XG5cdFx0XHQvKiogQHR5cGUge1NldDxpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnQ+IHwgbnVsbH0gKi9cblx0XHRcdGxldCBzdWJzID0gbmV3IFNldCgpO1xuXHRcdFx0bGV0IGN0eCA9IHt9O1xuXHRcdFx0Y3R4W0NvbnRleHQuX2lkXSA9IHRoaXM7XG5cblx0XHRcdHRoaXMuZ2V0Q2hpbGRDb250ZXh0ID0gKCkgPT4gY3R4O1xuXG5cdFx0XHR0aGlzLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gKCkgPT4ge1xuXHRcdFx0XHRzdWJzID0gTlVMTDtcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gKF9wcm9wcykge1xuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIGV2ZW5cblx0XHRcdFx0aWYgKHRoaXMucHJvcHMudmFsdWUgIT0gX3Byb3BzLnZhbHVlKSB7XG5cdFx0XHRcdFx0c3Vicy5mb3JFYWNoKGMgPT4ge1xuXHRcdFx0XHRcdFx0Yy5fZm9yY2UgPSB0cnVlO1xuXHRcdFx0XHRcdFx0ZW5xdWV1ZVJlbmRlcihjKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5zdWIgPSBjID0+IHtcblx0XHRcdFx0c3Vicy5hZGQoYyk7XG5cdFx0XHRcdGxldCBvbGQgPSBjLmNvbXBvbmVudFdpbGxVbm1vdW50O1xuXHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gKCkgPT4ge1xuXHRcdFx0XHRcdGlmIChzdWJzKSB7XG5cdFx0XHRcdFx0XHRzdWJzLmRlbGV0ZShjKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9sZCkgb2xkLmNhbGwoYyk7XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wcy5jaGlsZHJlbjtcblx0fVxuXG5cdENvbnRleHQuX2lkID0gJ19fY0MnICsgaSsrO1xuXHRDb250ZXh0Ll9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG5cblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5GdW5jdGlvbkNvbXBvbmVudH0gKi9cblx0Q29udGV4dC5Db25zdW1lciA9IChwcm9wcywgY29udGV4dFZhbHVlKSA9PiB7XG5cdFx0cmV0dXJuIHByb3BzLmNoaWxkcmVuKGNvbnRleHRWYWx1ZSk7XG5cdH07XG5cblx0Ly8gd2UgY291bGQgYWxzbyBnZXQgcmlkIG9mIF9jb250ZXh0UmVmIGVudGlyZWx5XG5cdENvbnRleHQuUHJvdmlkZXIgPVxuXHRcdENvbnRleHQuX2NvbnRleHRSZWYgPVxuXHRcdENvbnRleHQuQ29uc3VtZXIuY29udGV4dFR5cGUgPVxuXHRcdFx0Q29udGV4dDtcblxuXHRyZXR1cm4gQ29udGV4dDtcbn1cbiIsICJpbXBvcnQgeyBkaWZmLCB1bm1vdW50LCBhcHBseVJlZiB9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgY3JlYXRlVk5vZGUsIEZyYWdtZW50IH0gZnJvbSAnLi4vY3JlYXRlLWVsZW1lbnQnO1xuaW1wb3J0IHtcblx0RU1QVFlfT0JKLFxuXHRFTVBUWV9BUlIsXG5cdElOU0VSVF9WTk9ERSxcblx0TUFUQ0hFRCxcblx0VU5ERUZJTkVELFxuXHROVUxMXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc0FycmF5IH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBnZXREb21TaWJsaW5nIH0gZnJvbSAnLi4vY29tcG9uZW50JztcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLkNvbXBvbmVudENoaWxkcmVufSBDb21wb25lbnRDaGlsZHJlblxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5Db21wb25lbnR9IENvbXBvbmVudFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBQcmVhY3RFbGVtZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBWTm9kZVxuICovXG5cbi8qKlxuICogRGlmZiB0aGUgY2hpbGRyZW4gb2YgYSB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBET00gZWxlbWVudCB3aG9zZSBjaGlsZHJlbiBhcmUgYmVpbmdcbiAqIGRpZmZlZFxuICogQHBhcmFtIHtDb21wb25lbnRDaGlsZHJlbltdfSByZW5kZXJSZXN1bHRcbiAqIEBwYXJhbSB7Vk5vZGV9IG5ld1BhcmVudFZOb2RlIFRoZSBuZXcgdmlydHVhbCBub2RlIHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZVxuICogZGlmZidlZCBhZ2FpbnN0IG9sZFBhcmVudFZOb2RlXG4gKiBAcGFyYW0ge1ZOb2RlfSBvbGRQYXJlbnRWTm9kZSBUaGUgb2xkIHZpcnR1YWwgbm9kZSB3aG9zZSBjaGlsZHJlbiBzaG91bGQgYmVcbiAqIGRpZmYnZWQgYWdhaW5zdCBuZXdQYXJlbnRWTm9kZVxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbENvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dCBvYmplY3QgLSBtb2RpZmllZCBieVxuICogZ2V0Q2hpbGRDb250ZXh0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIEN1cnJlbnQgbmFtZXNwYWNlIG9mIHRoZSBET00gbm9kZSAoSFRNTCwgU1ZHLCBvciBNYXRoTUwpXG4gKiBAcGFyYW0ge0FycmF5PFByZWFjdEVsZW1lbnQ+fSBleGNlc3NEb21DaGlsZHJlblxuICogQHBhcmFtIHtBcnJheTxDb21wb25lbnQ+fSBjb21taXRRdWV1ZSBMaXN0IG9mIGNvbXBvbmVudHMgd2hpY2ggaGF2ZSBjYWxsYmFja3NcbiAqIHRvIGludm9rZSBpbiBjb21taXRSb290XG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IG9sZERvbSBUaGUgY3VycmVudCBhdHRhY2hlZCBET00gZWxlbWVudCBhbnkgbmV3IGRvbVxuICogZWxlbWVudHMgc2hvdWxkIGJlIHBsYWNlZCBhcm91bmQuIExpa2VseSBgbnVsbGAgb24gZmlyc3QgcmVuZGVyIChleGNlcHQgd2hlblxuICogaHlkcmF0aW5nKS4gQ2FuIGJlIGEgc2libGluZyBET00gZWxlbWVudCB3aGVuIGRpZmZpbmcgRnJhZ21lbnRzIHRoYXQgaGF2ZVxuICogc2libGluZ3MuIEluIG1vc3QgY2FzZXMsIGl0IHN0YXJ0cyBvdXQgYXMgYG9sZENoaWxkcmVuWzBdLl9kb21gLlxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKiBAcGFyYW0ge2FueVtdfSByZWZRdWV1ZSBhbiBhcnJheSBvZiBlbGVtZW50cyBuZWVkZWQgdG8gaW52b2tlIHJlZnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDaGlsZHJlbihcblx0cGFyZW50RG9tLFxuXHRyZW5kZXJSZXN1bHQsXG5cdG5ld1BhcmVudFZOb2RlLFxuXHRvbGRQYXJlbnRWTm9kZSxcblx0Z2xvYmFsQ29udGV4dCxcblx0bmFtZXNwYWNlLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdG9sZERvbSxcblx0aXNIeWRyYXRpbmcsXG5cdHJlZlF1ZXVlXG4pIHtcblx0bGV0IGksXG5cdFx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0XHRvbGRWTm9kZSxcblx0XHQvKiogQHR5cGUge1ZOb2RlfSAqL1xuXHRcdGNoaWxkVk5vZGUsXG5cdFx0LyoqIEB0eXBlIHtQcmVhY3RFbGVtZW50fSAqL1xuXHRcdG5ld0RvbSxcblx0XHQvKiogQHR5cGUge1ByZWFjdEVsZW1lbnR9ICovXG5cdFx0Zmlyc3RDaGlsZERvbTtcblxuXHQvLyBUaGlzIGlzIGEgY29tcHJlc3Npb24gb2Ygb2xkUGFyZW50Vk5vZGUhPW51bGwgJiYgb2xkUGFyZW50Vk5vZGUgIT0gRU1QVFlfT0JKICYmIG9sZFBhcmVudFZOb2RlLl9jaGlsZHJlbiB8fCBFTVBUWV9BUlJcblx0Ly8gYXMgRU1QVFlfT0JKLl9jaGlsZHJlbiBzaG91bGQgYmUgYHVuZGVmaW5lZGAuXG5cdC8qKiBAdHlwZSB7Vk5vZGVbXX0gKi9cblx0bGV0IG9sZENoaWxkcmVuID0gKG9sZFBhcmVudFZOb2RlICYmIG9sZFBhcmVudFZOb2RlLl9jaGlsZHJlbikgfHwgRU1QVFlfQVJSO1xuXG5cdGxldCBuZXdDaGlsZHJlbkxlbmd0aCA9IHJlbmRlclJlc3VsdC5sZW5ndGg7XG5cblx0b2xkRG9tID0gY29uc3RydWN0TmV3Q2hpbGRyZW5BcnJheShcblx0XHRuZXdQYXJlbnRWTm9kZSxcblx0XHRyZW5kZXJSZXN1bHQsXG5cdFx0b2xkQ2hpbGRyZW4sXG5cdFx0b2xkRG9tLFxuXHRcdG5ld0NoaWxkcmVuTGVuZ3RoXG5cdCk7XG5cblx0Zm9yIChpID0gMDsgaSA8IG5ld0NoaWxkcmVuTGVuZ3RoOyBpKyspIHtcblx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldO1xuXHRcdGlmIChjaGlsZFZOb2RlID09IE5VTEwpIGNvbnRpbnVlO1xuXG5cdFx0Ly8gQXQgdGhpcyBwb2ludCwgY29uc3RydWN0TmV3Q2hpbGRyZW5BcnJheSBoYXMgYXNzaWduZWQgX2luZGV4IHRvIGJlIHRoZVxuXHRcdC8vIG1hdGNoaW5nSW5kZXggZm9yIHRoaXMgVk5vZGUncyBvbGRWTm9kZSAob3IgLTEgaWYgdGhlcmUgaXMgbm8gb2xkVk5vZGUpLlxuXHRcdG9sZFZOb2RlID1cblx0XHRcdChjaGlsZFZOb2RlLl9pbmRleCAhPSAtMSAmJiBvbGRDaGlsZHJlbltjaGlsZFZOb2RlLl9pbmRleF0pIHx8IEVNUFRZX09CSjtcblxuXHRcdC8vIFVwZGF0ZSBjaGlsZFZOb2RlLl9pbmRleCB0byBpdHMgZmluYWwgaW5kZXhcblx0XHRjaGlsZFZOb2RlLl9pbmRleCA9IGk7XG5cblx0XHQvLyBNb3JwaCB0aGUgb2xkIGVsZW1lbnQgaW50byB0aGUgbmV3IG9uZSwgYnV0IGRvbid0IGFwcGVuZCBpdCB0byB0aGUgZG9tIHlldFxuXHRcdGxldCByZXN1bHQgPSBkaWZmKFxuXHRcdFx0cGFyZW50RG9tLFxuXHRcdFx0Y2hpbGRWTm9kZSxcblx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0Z2xvYmFsQ29udGV4dCxcblx0XHRcdG5hbWVzcGFjZSxcblx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRvbGREb20sXG5cdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdHJlZlF1ZXVlXG5cdFx0KTtcblxuXHRcdC8vIEFkanVzdCBET00gbm9kZXNcblx0XHRuZXdEb20gPSBjaGlsZFZOb2RlLl9kb207XG5cdFx0aWYgKGNoaWxkVk5vZGUucmVmICYmIG9sZFZOb2RlLnJlZiAhPSBjaGlsZFZOb2RlLnJlZikge1xuXHRcdFx0aWYgKG9sZFZOb2RlLnJlZikge1xuXHRcdFx0XHRhcHBseVJlZihvbGRWTm9kZS5yZWYsIE5VTEwsIGNoaWxkVk5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0cmVmUXVldWUucHVzaChcblx0XHRcdFx0Y2hpbGRWTm9kZS5yZWYsXG5cdFx0XHRcdGNoaWxkVk5vZGUuX2NvbXBvbmVudCB8fCBuZXdEb20sXG5cdFx0XHRcdGNoaWxkVk5vZGVcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGZpcnN0Q2hpbGREb20gPT0gTlVMTCAmJiBuZXdEb20gIT0gTlVMTCkge1xuXHRcdFx0Zmlyc3RDaGlsZERvbSA9IG5ld0RvbTtcblx0XHR9XG5cblx0XHRsZXQgc2hvdWxkUGxhY2UgPSAhIShjaGlsZFZOb2RlLl9mbGFncyAmIElOU0VSVF9WTk9ERSk7XG5cdFx0aWYgKHNob3VsZFBsYWNlIHx8IG9sZFZOb2RlLl9jaGlsZHJlbiA9PT0gY2hpbGRWTm9kZS5fY2hpbGRyZW4pIHtcblx0XHRcdG9sZERvbSA9IGluc2VydChjaGlsZFZOb2RlLCBvbGREb20sIHBhcmVudERvbSwgc2hvdWxkUGxhY2UpO1xuXG5cdFx0XHQvLyBXaGVuIGEgbWF0Y2hlZCBWTm9kZSBpcyBwaHlzaWNhbGx5IG1vdmVkIHZpYSBJTlNFUlRfVk5PREUsIGl0cyBvbGRcblx0XHRcdC8vIF9kb20gcG9pbnRlciBiZWNvbWVzIGEgc3RhbGUgcG9zaXRpb25hbCByZWZlcmVuY2UuIENsZWFyIGl0IHNvIHRoYXRcblx0XHRcdC8vIGdldERvbVNpYmxpbmcgKGNhbGxlZCBmcm9tIG5lc3RlZCBkaWZmcykgd29uJ3QgcmV0dXJuIHRoaXMgc3RhbGVcblx0XHRcdC8vIHJlZmVyZW5jZSBhbmQgbWlzLXBsYWNlIHN1YnNlcXVlbnQgRE9NIG5vZGVzLiBTZWUgIzUwNjUuXG5cdFx0XHRpZiAoc2hvdWxkUGxhY2UgJiYgb2xkVk5vZGUuX2RvbSkge1xuXHRcdFx0XHRvbGRWTm9kZS5fZG9tID0gTlVMTDtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZFZOb2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyAmJiByZXN1bHQgIT09IFVOREVGSU5FRCkge1xuXHRcdFx0b2xkRG9tID0gcmVzdWx0O1xuXHRcdH0gZWxzZSBpZiAobmV3RG9tKSB7XG5cdFx0XHRvbGREb20gPSBuZXdEb20ubmV4dFNpYmxpbmc7XG5cdFx0fVxuXG5cdFx0Ly8gVW5zZXQgZGlmZmluZyBmbGFnc1xuXHRcdGNoaWxkVk5vZGUuX2ZsYWdzICY9IH4oSU5TRVJUX1ZOT0RFIHwgTUFUQ0hFRCk7XG5cdH1cblxuXHRuZXdQYXJlbnRWTm9kZS5fZG9tID0gZmlyc3RDaGlsZERvbTtcblxuXHRyZXR1cm4gb2xkRG9tO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Vk5vZGV9IG5ld1BhcmVudFZOb2RlXG4gKiBAcGFyYW0ge0NvbXBvbmVudENoaWxkcmVuW119IHJlbmRlclJlc3VsdFxuICogQHBhcmFtIHtWTm9kZVtdfSBvbGRDaGlsZHJlblxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3ROZXdDaGlsZHJlbkFycmF5KFxuXHRuZXdQYXJlbnRWTm9kZSxcblx0cmVuZGVyUmVzdWx0LFxuXHRvbGRDaGlsZHJlbixcblx0b2xkRG9tLFxuXHRuZXdDaGlsZHJlbkxlbmd0aFxuKSB7XG5cdC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuXHRsZXQgaTtcblx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0bGV0IGNoaWxkVk5vZGU7XG5cdC8qKiBAdHlwZSB7Vk5vZGV9ICovXG5cdGxldCBvbGRWTm9kZTtcblxuXHRsZXQgb2xkQ2hpbGRyZW5MZW5ndGggPSBvbGRDaGlsZHJlbi5sZW5ndGgsXG5cdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW4gPSBvbGRDaGlsZHJlbkxlbmd0aDtcblxuXHRsZXQgc2tldyA9IDA7XG5cblx0bmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuID0gbmV3IEFycmF5KG5ld0NoaWxkcmVuTGVuZ3RoKTtcblx0Zm9yIChpID0gMDsgaSA8IG5ld0NoaWxkcmVuTGVuZ3RoOyBpKyspIHtcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGFyZSByZXVzaW5nIHRoZSBjaGlsZFZOb2RlIHZhcmlhYmxlIHRvIGhvbGQgYm90aCB0aGVcblx0XHQvLyBwcmUgYW5kIHBvc3Qgbm9ybWFsaXplZCBjaGlsZFZOb2RlXG5cdFx0Y2hpbGRWTm9kZSA9IHJlbmRlclJlc3VsdFtpXTtcblxuXHRcdGlmIChcblx0XHRcdGNoaWxkVk5vZGUgPT0gTlVMTCB8fFxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ2Jvb2xlYW4nIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnZnVuY3Rpb24nXG5cdFx0KSB7XG5cdFx0XHRuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBOVUxMO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdC8vIElmIHRoaXMgbmV3Vk5vZGUgaXMgYmVpbmcgcmV1c2VkIChlLmcuIDxkaXY+e3JldXNlfXtyZXVzZX08L2Rpdj4pIGluIHRoZSBzYW1lIGRpZmYsXG5cdFx0Ly8gb3Igd2UgYXJlIHJlbmRlcmluZyBhIGNvbXBvbmVudCAoZS5nLiBzZXRTdGF0ZSkgY29weSB0aGUgb2xkVk5vZGVzIHNvIGl0IGNhbiBoYXZlXG5cdFx0Ly8gaXQncyBvd24gRE9NICYgZXRjLiBwb2ludGVyc1xuXHRcdGVsc2UgaWYgKFxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ3N0cmluZycgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdudW1iZXInIHx8XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdmFsaWQtdHlwZW9mXG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnYmlnaW50JyB8fFxuXHRcdFx0Y2hpbGRWTm9kZS5jb25zdHJ1Y3RvciA9PSBTdHJpbmdcblx0XHQpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0Y2hpbGRWTm9kZSxcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0TlVMTFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGRWTm9kZSkpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjcmVhdGVWTm9kZShcblx0XHRcdFx0RnJhZ21lbnQsXG5cdFx0XHRcdHsgY2hpbGRyZW46IGNoaWxkVk5vZGUgfSxcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0TlVMTCxcblx0XHRcdFx0TlVMTFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGNoaWxkVk5vZGUuY29uc3RydWN0b3IgPT09IFVOREVGSU5FRCAmJiBjaGlsZFZOb2RlLl9kZXB0aCA+IDApIHtcblx0XHRcdC8vIFZOb2RlIGlzIGFscmVhZHkgaW4gdXNlLCBjbG9uZSBpdC4gVGhpcyBjYW4gaGFwcGVuIGluIHRoZSBmb2xsb3dpbmdcblx0XHRcdC8vIHNjZW5hcmlvOlxuXHRcdFx0Ly8gICBjb25zdCByZXVzZSA9IDxkaXYgLz5cblx0XHRcdC8vICAgPGRpdj57cmV1c2V9PHNwYW4gLz57cmV1c2V9PC9kaXY+XG5cdFx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY3JlYXRlVk5vZGUoXG5cdFx0XHRcdGNoaWxkVk5vZGUudHlwZSxcblx0XHRcdFx0Y2hpbGRWTm9kZS5wcm9wcyxcblx0XHRcdFx0Y2hpbGRWTm9kZS5rZXksXG5cdFx0XHRcdGNoaWxkVk5vZGUucmVmID8gY2hpbGRWTm9kZS5yZWYgOiBOVUxMLFxuXHRcdFx0XHRjaGlsZFZOb2RlLl9vcmlnaW5hbFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY2hpbGRWTm9kZTtcblx0XHR9XG5cblx0XHRjb25zdCBza2V3ZWRJbmRleCA9IGkgKyBza2V3O1xuXHRcdGNoaWxkVk5vZGUuX3BhcmVudCA9IG5ld1BhcmVudFZOb2RlO1xuXHRcdGNoaWxkVk5vZGUuX2RlcHRoID0gbmV3UGFyZW50Vk5vZGUuX2RlcHRoICsgMTtcblxuXHRcdC8vIFRlbXBvcmFyaWx5IHN0b3JlIHRoZSBtYXRjaGluZ0luZGV4IG9uIHRoZSBfaW5kZXggcHJvcGVydHkgc28gd2UgY2FuIHB1bGxcblx0XHQvLyBvdXQgdGhlIG9sZFZOb2RlIGluIGRpZmZDaGlsZHJlbi4gV2UnbGwgb3ZlcnJpZGUgdGhpcyB0byB0aGUgVk5vZGUnc1xuXHRcdC8vIGZpbmFsIGluZGV4IGFmdGVyIHVzaW5nIHRoaXMgcHJvcGVydHkgdG8gZ2V0IHRoZSBvbGRWTm9kZVxuXHRcdGNvbnN0IG1hdGNoaW5nSW5kZXggPSAoY2hpbGRWTm9kZS5faW5kZXggPSBmaW5kTWF0Y2hpbmdJbmRleChcblx0XHRcdGNoaWxkVk5vZGUsXG5cdFx0XHRvbGRDaGlsZHJlbixcblx0XHRcdHNrZXdlZEluZGV4LFxuXHRcdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW5cblx0XHQpKTtcblxuXHRcdG9sZFZOb2RlID0gTlVMTDtcblx0XHRpZiAobWF0Y2hpbmdJbmRleCAhPSAtMSkge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlblttYXRjaGluZ0luZGV4XTtcblx0XHRcdHJlbWFpbmluZ09sZENoaWxkcmVuLS07XG5cdFx0XHRpZiAob2xkVk5vZGUpIHtcblx0XHRcdFx0b2xkVk5vZGUuX2ZsYWdzIHw9IE1BVENIRUQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSGVyZSwgd2UgZGVmaW5lIGlzTW91bnRpbmcgZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgc2tldyBkaWZmaW5nXG5cdFx0Ly8gYWxnb3JpdGhtLiBOb2RlcyB0aGF0IGFyZSB1bnN1c3BlbmRpbmcgYXJlIGNvbnNpZGVyZWQgbW91bnRpbmcgYW5kIHdlIGRldGVjdFxuXHRcdC8vIHRoaXMgYnkgY2hlY2tpbmcgaWYgb2xkVk5vZGUuX29yaWdpbmFsID09IG51bGxcblx0XHRjb25zdCBpc01vdW50aW5nID0gb2xkVk5vZGUgPT0gTlVMTCB8fCBvbGRWTm9kZS5fb3JpZ2luYWwgPT0gTlVMTDtcblxuXHRcdGlmIChpc01vdW50aW5nKSB7XG5cdFx0XHRpZiAobWF0Y2hpbmdJbmRleCA9PSAtMSkge1xuXHRcdFx0XHQvLyBXaGVuIHRoZSBhcnJheSBvZiBjaGlsZHJlbiBpcyBncm93aW5nIHdlIG5lZWQgdG8gZGVjcmVhc2UgdGhlIHNrZXdcblx0XHRcdFx0Ly8gYXMgd2UgYXJlIGFkZGluZyBhIG5ldyBlbGVtZW50IHRvIHRoZSBhcnJheS5cblx0XHRcdFx0Ly8gRXhhbXBsZTpcblx0XHRcdFx0Ly8gWzEsIDIsIDNdIC0tPiBbMCwgMSwgMiwgM11cblx0XHRcdFx0Ly8gb2xkQ2hpbGRyZW4gICBuZXdDaGlsZHJlblxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBUaGUgbmV3IGVsZW1lbnQgaXMgYXQgaW5kZXggMCwgc28gb3VyIHNrZXcgaXMgMCxcblx0XHRcdFx0Ly8gd2UgbmVlZCB0byBkZWNyZWFzZSB0aGUgc2tldyBhcyB3ZSBhcmUgYWRkaW5nIGEgbmV3IGVsZW1lbnQuXG5cdFx0XHRcdC8vIFRoZSBkZWNyZWFzZSB3aWxsIGNhdXNlIHVzIHRvIGNvbXBhcmUgdGhlIGVsZW1lbnQgYXQgcG9zaXRpb24gMVxuXHRcdFx0XHQvLyB3aXRoIHZhbHVlIDEgd2l0aCB0aGUgZWxlbWVudCBhdCBwb3NpdGlvbiAwIHdpdGggdmFsdWUgMC5cblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gQSBsaW5lYXIgY29uY2VwdCBpcyBhcHBsaWVkIHdoZW4gdGhlIGFycmF5IGlzIHNocmlua2luZyxcblx0XHRcdFx0Ly8gaWYgdGhlIGxlbmd0aCBpcyB1bmNoYW5nZWQgd2UgY2FuIGFzc3VtZSB0aGF0IG5vIHNrZXdcblx0XHRcdFx0Ly8gY2hhbmdlcyBhcmUgbmVlZGVkLlxuXHRcdFx0XHRpZiAobmV3Q2hpbGRyZW5MZW5ndGggPiBvbGRDaGlsZHJlbkxlbmd0aCkge1xuXHRcdFx0XHRcdHNrZXctLTtcblx0XHRcdFx0fSBlbHNlIGlmIChuZXdDaGlsZHJlbkxlbmd0aCA8IG9sZENoaWxkcmVuTGVuZ3RoKSB7XG5cdFx0XHRcdFx0c2tldysrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHdlIGFyZSBtb3VudGluZyBhIERPTSBWTm9kZSwgbWFyayBpdCBmb3IgaW5zZXJ0aW9uXG5cdFx0XHRpZiAodHlwZW9mIGNoaWxkVk5vZGUudHlwZSAhPSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGNoaWxkVk5vZGUuX2ZsYWdzIHw9IElOU0VSVF9WTk9ERTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG1hdGNoaW5nSW5kZXggIT0gc2tld2VkSW5kZXgpIHtcblx0XHRcdC8vIFdoZW4gd2UgbW92ZSBlbGVtZW50cyBhcm91bmQgaS5lLiBbMCwgMSwgMl0gLS0+IFsxLCAwLCAyXVxuXHRcdFx0Ly8gLS0+IHdlIGRpZmYgMSwgd2UgZmluZCBpdCBhdCBwb3NpdGlvbiAxIHdoaWxlIG91ciBza2V3ZWQgaW5kZXggaXMgMCBhbmQgb3VyIHNrZXcgaXMgMFxuXHRcdFx0Ly8gICAgIHdlIHNldCB0aGUgc2tldyB0byAxIGFzIHdlIGZvdW5kIGFuIG9mZnNldC5cblx0XHRcdC8vIC0tPiB3ZSBkaWZmIDAsIHdlIGZpbmQgaXQgYXQgcG9zaXRpb24gMCB3aGlsZSBvdXIgc2tld2VkIGluZGV4IGlzIGF0IDIgYW5kIG91ciBza2V3IGlzIDFcblx0XHRcdC8vICAgICB0aGlzIG1ha2VzIHVzIGluY3JlYXNlIHRoZSBza2V3IGFnYWluLlxuXHRcdFx0Ly8gLS0+IHdlIGRpZmYgMiwgd2UgZmluZCBpdCBhdCBwb3NpdGlvbiAyIHdoaWxlIG91ciBza2V3ZWQgaW5kZXggaXMgYXQgNCBhbmQgb3VyIHNrZXcgaXMgMlxuXHRcdFx0Ly9cblx0XHRcdC8vIHRoaXMgYmVjb21lcyBhbiBvcHRpbWl6YXRpb24gcXVlc3Rpb24gd2hlcmUgY3VycmVudGx5IHdlIHNlZSBhIDEgZWxlbWVudCBvZmZzZXQgYXMgYW4gaW5zZXJ0aW9uXG5cdFx0XHQvLyBvciBkZWxldGlvbiBpLmUuIHdlIG9wdGltaXplIGZvciBbMCwgMSwgMl0gLS0+IFs5LCAwLCAxLCAyXVxuXHRcdFx0Ly8gd2hpbGUgYSBtb3JlIHRoYW4gMSBvZmZzZXQgd2Ugc2VlIGFzIGEgc3dhcC5cblx0XHRcdC8vIFdlIGNvdWxkIHByb2JhYmx5IGJ1aWxkIGhldXJpc3RpY3MgZm9yIGhhdmluZyBhbiBvcHRpbWl6ZWQgY291cnNlIG9mIGFjdGlvbiBoZXJlIGFzIHdlbGwsIGJ1dFxuXHRcdFx0Ly8gbWlnaHQgZ28gYXQgdGhlIGNvc3Qgb2Ygc29tZSBieXRlcy5cblx0XHRcdC8vXG5cdFx0XHQvLyBJZiB3ZSB3YW50ZWQgdG8gb3B0aW1pemUgZm9yIGkuZS4gb25seSBzd2FwcyB3ZSdkIGp1c3QgZG8gdGhlIGxhc3QgdHdvIGNvZGUtYnJhbmNoZXMgYW5kIGhhdmVcblx0XHRcdC8vIG9ubHkgdGhlIGZpcnN0IGl0ZW0gYmUgYSByZS1zY291dGluZyBhbmQgYWxsIHRoZSBvdGhlcnMgZmFsbCBpbiB0aGVpciBza2V3ZWQgY291bnRlci1wYXJ0LlxuXHRcdFx0Ly8gV2UgY291bGQgYWxzbyBmdXJ0aGVyIG9wdGltaXplIGZvciBzd2Fwc1xuXHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPT0gc2tld2VkSW5kZXggLSAxKSB7XG5cdFx0XHRcdHNrZXctLTtcblx0XHRcdH0gZWxzZSBpZiAobWF0Y2hpbmdJbmRleCA9PSBza2V3ZWRJbmRleCArIDEpIHtcblx0XHRcdFx0c2tldysrO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPiBza2V3ZWRJbmRleCkge1xuXHRcdFx0XHRcdHNrZXctLTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRza2V3Kys7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBNb3ZlIHRoaXMgVk5vZGUncyBET00gaWYgdGhlIG9yaWdpbmFsIGluZGV4IChtYXRjaGluZ0luZGV4KSBkb2Vzbid0XG5cdFx0XHRcdC8vIG1hdGNoIHRoZSBuZXcgc2tldyBpbmRleCAoaSArIG5ldyBza2V3KVxuXHRcdFx0XHQvLyBJbiB0aGUgZm9ybWVyIHR3byBicmFuY2hlcyB3ZSBrbm93IHRoYXQgaXQgbWF0Y2hlcyBhZnRlciBza2V3aW5nXG5cdFx0XHRcdGNoaWxkVk5vZGUuX2ZsYWdzIHw9IElOU0VSVF9WTk9ERTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZW1vdmUgcmVtYWluaW5nIG9sZENoaWxkcmVuIGlmIHRoZXJlIGFyZSBhbnkuIExvb3AgZm9yd2FyZHMgc28gdGhhdCBhcyB3ZVxuXHQvLyB1bm1vdW50IERPTSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9sZENoaWxkcmVuLCB3ZSBjYW4gYWRqdXN0IG9sZERvbSB0b1xuXHQvLyBwb2ludCB0byB0aGUgbmV4dCBjaGlsZCwgd2hpY2ggbmVlZHMgdG8gYmUgdGhlIGZpcnN0IERPTSBub2RlIHRoYXQgd29uJ3QgYmVcblx0Ly8gdW5tb3VudGVkLlxuXHRpZiAocmVtYWluaW5nT2xkQ2hpbGRyZW4pIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcblx0XHRcdGlmIChvbGRWTm9kZSAhPSBOVUxMICYmIChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PSAwKSB7XG5cdFx0XHRcdGlmIChvbGRWTm9kZS5fZG9tID09IG9sZERvbSkge1xuXHRcdFx0XHRcdG9sZERvbSA9IGdldERvbVNpYmxpbmcob2xkVk5vZGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dW5tb3VudChvbGRWTm9kZSwgb2xkVk5vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBvbGREb207XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gcGFyZW50Vk5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gb2xkRG9tXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQbGFjZVxuICogQHJldHVybnMge1ByZWFjdEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGluc2VydChwYXJlbnRWTm9kZSwgb2xkRG9tLCBwYXJlbnREb20sIHNob3VsZFBsYWNlKSB7XG5cdC8vIE5vdGU6IFZOb2RlcyBpbiBuZXN0ZWQgc3VzcGVuZGVkIHRyZWVzIG1heSBiZSBtaXNzaW5nIF9jaGlsZHJlbi5cblxuXHRpZiAodHlwZW9mIHBhcmVudFZOb2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdGxldCBjaGlsZHJlbiA9IHBhcmVudFZOb2RlLl9jaGlsZHJlbjtcblx0XHRmb3IgKGxldCBpID0gMDsgY2hpbGRyZW4gJiYgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoY2hpbGRyZW5baV0pIHtcblx0XHRcdFx0Ly8gSWYgd2UgZW50ZXIgdGhpcyBjb2RlIHBhdGggb24gc0NVIGJhaWxvdXQsIHdoZXJlIHdlIGNvcHlcblx0XHRcdFx0Ly8gb2xkVk5vZGUuX2NoaWxkcmVuIHRvIG5ld1ZOb2RlLl9jaGlsZHJlbiwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG9sZFxuXHRcdFx0XHQvLyBjaGlsZHJlbidzIF9wYXJlbnQgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbmV3Vk5vZGUgKHBhcmVudFZOb2RlXG5cdFx0XHRcdC8vIGhlcmUpLlxuXHRcdFx0XHRjaGlsZHJlbltpXS5fcGFyZW50ID0gcGFyZW50Vk5vZGU7XG5cdFx0XHRcdG9sZERvbSA9IGluc2VydChjaGlsZHJlbltpXSwgb2xkRG9tLCBwYXJlbnREb20sIHNob3VsZFBsYWNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2xkRG9tO1xuXHR9IGVsc2UgaWYgKHBhcmVudFZOb2RlLl9kb20gIT0gb2xkRG9tKSB7XG5cdFx0aWYgKHNob3VsZFBsYWNlKSB7XG5cdFx0XHRpZiAob2xkRG9tICYmIHBhcmVudFZOb2RlLnR5cGUgJiYgIW9sZERvbS5wYXJlbnROb2RlKSB7XG5cdFx0XHRcdG9sZERvbSA9IGdldERvbVNpYmxpbmcocGFyZW50Vk5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0cGFyZW50RG9tLmluc2VydEJlZm9yZShwYXJlbnRWTm9kZS5fZG9tLCBvbGREb20gfHwgTlVMTCk7XG5cdFx0fVxuXHRcdG9sZERvbSA9IHBhcmVudFZOb2RlLl9kb207XG5cdH1cblxuXHRkbyB7XG5cdFx0b2xkRG9tID0gb2xkRG9tICYmIG9sZERvbS5uZXh0U2libGluZztcblx0fSB3aGlsZSAob2xkRG9tICE9IE5VTEwgJiYgb2xkRG9tLm5vZGVUeXBlID09IDgpO1xuXG5cdHJldHVybiBvbGREb207XG59XG5cbi8qKlxuICogRmxhdHRlbiBhbmQgbG9vcCB0aHJvdWdoIHRoZSBjaGlsZHJlbiBvZiBhIHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtDb21wb25lbnRDaGlsZHJlbn0gY2hpbGRyZW4gVGhlIHVuZmxhdHRlbmVkIGNoaWxkcmVuIG9mIGEgdmlydHVhbFxuICogbm9kZVxuICogQHJldHVybnMge1ZOb2RlW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0NoaWxkQXJyYXkoY2hpbGRyZW4sIG91dCkge1xuXHRvdXQgPSBvdXQgfHwgW107XG5cdGlmIChjaGlsZHJlbiA9PSBOVUxMIHx8IHR5cGVvZiBjaGlsZHJlbiA9PSAnYm9vbGVhbicpIHtcblx0fSBlbHNlIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuXHRcdGNoaWxkcmVuLnNvbWUoY2hpbGQgPT4ge1xuXHRcdFx0dG9DaGlsZEFycmF5KGNoaWxkLCBvdXQpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG91dC5wdXNoKGNoaWxkcmVuKTtcblx0fVxuXHRyZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Vk5vZGV9IGNoaWxkVk5vZGVcbiAqIEBwYXJhbSB7Vk5vZGVbXX0gb2xkQ2hpbGRyZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBza2V3ZWRJbmRleFxuICogQHBhcmFtIHtudW1iZXJ9IHJlbWFpbmluZ09sZENoaWxkcmVuXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdJbmRleChcblx0Y2hpbGRWTm9kZSxcblx0b2xkQ2hpbGRyZW4sXG5cdHNrZXdlZEluZGV4LFxuXHRyZW1haW5pbmdPbGRDaGlsZHJlblxuKSB7XG5cdGNvbnN0IGtleSA9IGNoaWxkVk5vZGUua2V5O1xuXHRjb25zdCB0eXBlID0gY2hpbGRWTm9kZS50eXBlO1xuXHRsZXQgb2xkVk5vZGUgPSBvbGRDaGlsZHJlbltza2V3ZWRJbmRleF07XG5cdGNvbnN0IG1hdGNoZWQgPSBvbGRWTm9kZSAhPSBOVUxMICYmIChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PSAwO1xuXG5cdC8vIFdlIG9ubHkgbmVlZCB0byBwZXJmb3JtIGEgc2VhcmNoIGlmIHRoZXJlIGFyZSBtb3JlIGNoaWxkcmVuXG5cdC8vIChyZW1haW5pbmdPbGRDaGlsZHJlbikgdG8gc2VhcmNoLiBIb3dldmVyLCBpZiB0aGUgb2xkVk5vZGUgd2UganVzdCBsb29rZWRcblx0Ly8gYXQgc2tld2VkSW5kZXggd2FzIG5vdCBhbHJlYWR5IHVzZWQgaW4gdGhpcyBkaWZmLCB0aGVuIHRoZXJlIG11c3QgYmUgYXRcblx0Ly8gbGVhc3QgMSBvdGhlciAoc28gZ3JlYXRlciB0aGFuIDEpIHJlbWFpbmluZ09sZENoaWxkcmVuIHRvIGF0dGVtcHQgdG8gbWF0Y2hcblx0Ly8gYWdhaW5zdC4gU28gdGhlIGZvbGxvd2luZyBjb25kaXRpb24gY2hlY2tzIHRoYXQgZW5zdXJpbmdcblx0Ly8gcmVtYWluaW5nT2xkQ2hpbGRyZW4gPiAxIGlmIHRoZSBvbGRWTm9kZSBpcyBub3QgYWxyZWFkeSB1c2VkL21hdGNoZWQuIEVsc2Vcblx0Ly8gaWYgdGhlIG9sZFZOb2RlIHdhcyBudWxsIG9yIG1hdGNoZWQsIHRoZW4gdGhlcmUgY291bGQgbmVlZHMgdG8gYmUgYXQgbGVhc3Rcblx0Ly8gMSAoYWthIGByZW1haW5pbmdPbGRDaGlsZHJlbiA+IDBgKSBjaGlsZHJlbiB0byBmaW5kIGFuZCBjb21wYXJlIGFnYWluc3QuXG5cdC8vXG5cdC8vIElmIHRoZXJlIGlzIGFuIHVua2V5ZWQgZnVuY3Rpb25hbCBWTm9kZSwgdGhhdCBpc24ndCBhIGJ1aWx0LWluIGxpa2Ugb3VyIEZyYWdtZW50LFxuXHQvLyB3ZSBzaG91bGQgbm90IHNlYXJjaCBhcyB3ZSByaXNrIHJlLXVzaW5nIHN0YXRlIG9mIGFuIHVucmVsYXRlZCBWTm9kZS4gKHJldmVydGVkIGZvciBub3cpXG5cdGxldCBzaG91bGRTZWFyY2ggPVxuXHRcdC8vICh0eXBlb2YgdHlwZSAhPSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09IEZyYWdtZW50IHx8IGtleSkgJiZcblx0XHRyZW1haW5pbmdPbGRDaGlsZHJlbiA+IChtYXRjaGVkID8gMSA6IDApO1xuXG5cdGlmIChcblx0XHQob2xkVk5vZGUgPT09IE5VTEwgJiYga2V5ID09IG51bGwpIHx8XG5cdFx0KG1hdGNoZWQgJiYga2V5ID09IG9sZFZOb2RlLmtleSAmJiB0eXBlID09IG9sZFZOb2RlLnR5cGUpXG5cdCkge1xuXHRcdHJldHVybiBza2V3ZWRJbmRleDtcblx0fSBlbHNlIGlmIChzaG91bGRTZWFyY2gpIHtcblx0XHRsZXQgeCA9IHNrZXdlZEluZGV4IC0gMTtcblx0XHRsZXQgeSA9IHNrZXdlZEluZGV4ICsgMTtcblx0XHR3aGlsZSAoeCA+PSAwIHx8IHkgPCBvbGRDaGlsZHJlbi5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGNoaWxkSW5kZXggPSB4ID49IDAgPyB4LS0gOiB5Kys7XG5cdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2NoaWxkSW5kZXhdO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvbGRWTm9kZSAhPSBOVUxMICYmXG5cdFx0XHRcdChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PSAwICYmXG5cdFx0XHRcdGtleSA9PSBvbGRWTm9kZS5rZXkgJiZcblx0XHRcdFx0dHlwZSA9PSBvbGRWTm9kZS50eXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIGNoaWxkSW5kZXg7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIC0xO1xufVxuIiwgImltcG9ydCB7XG5cdEVNUFRZX0FSUixcblx0RU1QVFlfT0JKLFxuXHRNQVRIX05BTUVTUEFDRSxcblx0TU9ERV9IWURSQVRFLFxuXHRNT0RFX1NVU1BFTkRFRCxcblx0TlVMTCxcblx0UkVTRVRfTU9ERSxcblx0U1ZHX05BTUVTUEFDRSxcblx0VU5ERUZJTkVELFxuXHRYSFRNTF9OQU1FU1BBQ0Vcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIGdldERvbVNpYmxpbmcgfSBmcm9tICcuLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICcuLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBkaWZmQ2hpbGRyZW4gfSBmcm9tICcuL2NoaWxkcmVuJztcbmltcG9ydCB7IHNldFByb3BlcnR5IH0gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQgeyBhc3NpZ24sIGlzQXJyYXksIHJlbW92ZU5vZGUsIHNsaWNlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLkNvbXBvbmVudENoaWxkcmVufSBDb21wb25lbnRDaGlsZHJlblxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5Db21wb25lbnR9IENvbXBvbmVudFxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBQcmVhY3RFbGVtZW50XG4gKiBAdHlwZWRlZiB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBWTm9kZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHthbnl9IFRcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2ludGVybmFsJykuUmVmPFQ+fSBSZWY8VD5cbiAqL1xuXG4vKipcbiAqIERpZmYgdHdvIHZpcnR1YWwgbm9kZXMgYW5kIGFwcGx5IHByb3BlciBjaGFuZ2VzIHRvIHRoZSBET01cbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBwYXJlbnQgb2YgdGhlIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge1ZOb2RlfSBuZXdWTm9kZSBUaGUgbmV3IHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtWTm9kZX0gb2xkVk5vZGUgVGhlIG9sZCB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxDb250ZXh0IFRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0LiBNb2RpZmllZCBieVxuICogZ2V0Q2hpbGRDb250ZXh0XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIEN1cnJlbnQgbmFtZXNwYWNlIG9mIHRoZSBET00gbm9kZSAoSFRNTCwgU1ZHLCBvciBNYXRoTUwpXG4gKiBAcGFyYW0ge0FycmF5PFByZWFjdEVsZW1lbnQ+fSBleGNlc3NEb21DaGlsZHJlblxuICogQHBhcmFtIHtBcnJheTxDb21wb25lbnQ+fSBjb21taXRRdWV1ZSBMaXN0IG9mIGNvbXBvbmVudHMgd2hpY2ggaGF2ZSBjYWxsYmFja3NcbiAqIHRvIGludm9rZSBpbiBjb21taXRSb290XG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IG9sZERvbSBUaGUgY3VycmVudCBhdHRhY2hlZCBET00gZWxlbWVudCBhbnkgbmV3IGRvbVxuICogZWxlbWVudHMgc2hvdWxkIGJlIHBsYWNlZCBhcm91bmQuIExpa2VseSBgbnVsbGAgb24gZmlyc3QgcmVuZGVyIChleGNlcHQgd2hlblxuICogaHlkcmF0aW5nKS4gQ2FuIGJlIGEgc2libGluZyBET00gZWxlbWVudCB3aGVuIGRpZmZpbmcgRnJhZ21lbnRzIHRoYXQgaGF2ZVxuICogc2libGluZ3MuIEluIG1vc3QgY2FzZXMsIGl0IHN0YXJ0cyBvdXQgYXMgYG9sZENoaWxkcmVuWzBdLl9kb21gLlxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKiBAcGFyYW0ge2FueVtdfSByZWZRdWV1ZSBhbiBhcnJheSBvZiBlbGVtZW50cyBuZWVkZWQgdG8gaW52b2tlIHJlZnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmYoXG5cdHBhcmVudERvbSxcblx0bmV3Vk5vZGUsXG5cdG9sZFZOb2RlLFxuXHRnbG9iYWxDb250ZXh0LFxuXHRuYW1lc3BhY2UsXG5cdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRjb21taXRRdWV1ZSxcblx0b2xkRG9tLFxuXHRpc0h5ZHJhdGluZyxcblx0cmVmUXVldWVcbikge1xuXHQvKiogQHR5cGUge2FueX0gKi9cblx0bGV0IHRtcCxcblx0XHRuZXdUeXBlID0gbmV3Vk5vZGUudHlwZTtcblxuXHQvLyBXaGVuIHBhc3NpbmcgdGhyb3VnaCBjcmVhdGVFbGVtZW50IGl0IGFzc2lnbnMgdGhlIG9iamVjdFxuXHQvLyBjb25zdHJ1Y3RvciBhcyB1bmRlZmluZWQuIFRoaXMgdG8gcHJldmVudCBKU09OLWluamVjdGlvbi5cblx0aWYgKG5ld1ZOb2RlLmNvbnN0cnVjdG9yICE9PSBVTkRFRklORUQpIHJldHVybiBOVUxMO1xuXG5cdC8vIElmIHRoZSBwcmV2aW91cyBkaWZmIGJhaWxlZCBvdXQsIHJlc3VtZSBjcmVhdGluZy9oeWRyYXRpbmcuXG5cdGlmIChvbGRWTm9kZS5fZmxhZ3MgJiBNT0RFX1NVU1BFTkRFRCkge1xuXHRcdGlzSHlkcmF0aW5nID0gISEob2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9IWURSQVRFKTtcblx0XHRvbGREb20gPSBuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IFtvbGREb21dO1xuXHR9XG5cblx0aWYgKCh0bXAgPSBvcHRpb25zLl9kaWZmKSkgdG1wKG5ld1ZOb2RlKTtcblxuXHRvdXRlcjogaWYgKHR5cGVvZiBuZXdUeXBlID09ICdmdW5jdGlvbicpIHtcblx0XHRsZXQgb2xkQ29tbWl0UXVldWVMZW5ndGggPSBjb21taXRRdWV1ZS5sZW5ndGg7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBjLCBpc05ldywgb2xkUHJvcHMsIG9sZFN0YXRlLCBzbmFwc2hvdCwgY2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uO1xuXHRcdFx0bGV0IG5ld1Byb3BzID0gbmV3Vk5vZGUucHJvcHM7XG5cdFx0XHRjb25zdCBpc0NsYXNzQ29tcG9uZW50ID0gbmV3VHlwZS5wcm90b3R5cGUgJiYgbmV3VHlwZS5wcm90b3R5cGUucmVuZGVyO1xuXG5cdFx0XHQvLyBOZWNlc3NhcnkgZm9yIGNyZWF0ZUNvbnRleHQgYXBpLiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgd2lsbCBwYXNzXG5cdFx0XHQvLyB0aGUgY29udGV4dCB2YWx1ZSBhcyBgdGhpcy5jb250ZXh0YCBqdXN0IGZvciB0aGlzIGNvbXBvbmVudC5cblx0XHRcdHRtcCA9IG5ld1R5cGUuY29udGV4dFR5cGU7XG5cdFx0XHRsZXQgcHJvdmlkZXIgPSB0bXAgJiYgZ2xvYmFsQ29udGV4dFt0bXAuX2lkXTtcblx0XHRcdGxldCBjb21wb25lbnRDb250ZXh0ID0gdG1wXG5cdFx0XHRcdD8gcHJvdmlkZXJcblx0XHRcdFx0XHQ/IHByb3ZpZGVyLnByb3BzLnZhbHVlXG5cdFx0XHRcdFx0OiB0bXAuX2RlZmF1bHRWYWx1ZVxuXHRcdFx0XHQ6IGdsb2JhbENvbnRleHQ7XG5cblx0XHRcdC8vIEdldCBjb21wb25lbnQgYW5kIHNldCBpdCB0byBgY2Bcblx0XHRcdGlmIChvbGRWTm9kZS5fY29tcG9uZW50KSB7XG5cdFx0XHRcdGMgPSBuZXdWTm9kZS5fY29tcG9uZW50ID0gb2xkVk5vZGUuX2NvbXBvbmVudDtcblx0XHRcdFx0Y2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uID0gYy5fcHJvY2Vzc2luZ0V4Y2VwdGlvbiA9IGMuX3BlbmRpbmdFcnJvcjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEluc3RhbnRpYXRlIHRoZSBuZXcgY29tcG9uZW50XG5cdFx0XHRcdGlmIChpc0NsYXNzQ29tcG9uZW50KSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUaGUgY2hlY2sgYWJvdmUgdmVyaWZpZXMgdGhhdCBuZXdUeXBlIGlzIHN1cHBvc2UgdG8gYmUgY29uc3RydWN0ZWRcblx0XHRcdFx0XHRuZXdWTm9kZS5fY29tcG9uZW50ID0gYyA9IG5ldyBuZXdUeXBlKG5ld1Byb3BzLCBjb21wb25lbnRDb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUcnVzdCBtZSwgQ29tcG9uZW50IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSB3ZSB3YW50XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NvbXBvbmVudCA9IGMgPSBuZXcgQmFzZUNvbXBvbmVudChcblx0XHRcdFx0XHRcdG5ld1Byb3BzLFxuXHRcdFx0XHRcdFx0Y29tcG9uZW50Q29udGV4dFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Yy5jb25zdHJ1Y3RvciA9IG5ld1R5cGU7XG5cdFx0XHRcdFx0Yy5yZW5kZXIgPSBkb1JlbmRlcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvdmlkZXIpIHByb3ZpZGVyLnN1YihjKTtcblxuXHRcdFx0XHRpZiAoIWMuc3RhdGUpIGMuc3RhdGUgPSB7fTtcblx0XHRcdFx0Yy5fZ2xvYmFsQ29udGV4dCA9IGdsb2JhbENvbnRleHQ7XG5cdFx0XHRcdGlzTmV3ID0gYy5fZGlydHkgPSB0cnVlO1xuXHRcdFx0XHRjLl9yZW5kZXJDYWxsYmFja3MgPSBbXTtcblx0XHRcdFx0Yy5fc3RhdGVDYWxsYmFja3MgPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSW52b2tlIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuXHRcdFx0aWYgKGlzQ2xhc3NDb21wb25lbnQgJiYgYy5fbmV4dFN0YXRlID09IE5VTEwpIHtcblx0XHRcdFx0Yy5fbmV4dFN0YXRlID0gYy5zdGF0ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlzQ2xhc3NDb21wb25lbnQgJiYgbmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT0gTlVMTCkge1xuXHRcdFx0XHRpZiAoYy5fbmV4dFN0YXRlID09IGMuc3RhdGUpIHtcblx0XHRcdFx0XHRjLl9uZXh0U3RhdGUgPSBhc3NpZ24oe30sIGMuX25leHRTdGF0ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhc3NpZ24oXG5cdFx0XHRcdFx0Yy5fbmV4dFN0YXRlLFxuXHRcdFx0XHRcdG5ld1R5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5ld1Byb3BzLCBjLl9uZXh0U3RhdGUpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdG9sZFByb3BzID0gYy5wcm9wcztcblx0XHRcdG9sZFN0YXRlID0gYy5zdGF0ZTtcblx0XHRcdGMuX3Zub2RlID0gbmV3Vk5vZGU7XG5cblx0XHRcdC8vIEludm9rZSBwcmUtcmVuZGVyIGxpZmVjeWNsZSBtZXRob2RzXG5cdFx0XHRpZiAoaXNOZXcpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGlzQ2xhc3NDb21wb25lbnQgJiZcblx0XHRcdFx0XHRuZXdUeXBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PSBOVUxMICYmXG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsTW91bnQgIT0gTlVMTFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzQ2xhc3NDb21wb25lbnQgJiYgYy5jb21wb25lbnREaWRNb3VudCAhPSBOVUxMKSB7XG5cdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goYy5jb21wb25lbnREaWRNb3VudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRpc0NsYXNzQ29tcG9uZW50ICYmXG5cdFx0XHRcdFx0bmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT0gTlVMTCAmJlxuXHRcdFx0XHRcdG5ld1Byb3BzICE9PSBvbGRQcm9wcyAmJlxuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAhPSBOVUxMXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bmV3Vk5vZGUuX29yaWdpbmFsID09IG9sZFZOb2RlLl9vcmlnaW5hbCB8fFxuXHRcdFx0XHRcdCghYy5fZm9yY2UgJiZcblx0XHRcdFx0XHRcdGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlICE9IE5VTEwgJiZcblx0XHRcdFx0XHRcdGMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKFxuXHRcdFx0XHRcdFx0XHRuZXdQcm9wcyxcblx0XHRcdFx0XHRcdFx0Yy5fbmV4dFN0YXRlLFxuXHRcdFx0XHRcdFx0XHRjb21wb25lbnRDb250ZXh0XG5cdFx0XHRcdFx0XHQpID09PSBmYWxzZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gTW9yZSBpbmZvIGFib3V0IHRoaXMgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vSm92aURlQ3Jvb2NrL2JlYzVmMmNlOTM1NDRkMmU2MDcwZWY4ZTAwMzZlNGU4XG5cdFx0XHRcdFx0aWYgKG5ld1ZOb2RlLl9vcmlnaW5hbCAhPSBvbGRWTm9kZS5fb3JpZ2luYWwpIHtcblx0XHRcdFx0XHRcdC8vIFdoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhaWwgYmVjYXVzZSBvZiBzQ1Ugd2UgaGF2ZSB0byB1cGRhdGVcblx0XHRcdFx0XHRcdC8vIHRoZSBwcm9wcywgc3RhdGUgYW5kIGRpcnR5LXN0YXRlLlxuXHRcdFx0XHRcdFx0Ly8gd2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIHN0cmljdC1lcXVhbGl0eSB3ZSBkb24ndCBhcyB0aGUgY2hpbGQgY291bGQgc3RpbGxcblx0XHRcdFx0XHRcdC8vIGJlIGRpcnRpZWQgc2VlICMzODgzXG5cdFx0XHRcdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHRcdFx0Yy5fZGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRcdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBvbGRWTm9kZS5fY2hpbGRyZW47XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuLnNvbWUodm5vZGUgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKHZub2RlKSB2bm9kZS5fcGFyZW50ID0gbmV3Vk5vZGU7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRFTVBUWV9BUlIucHVzaC5hcHBseShjLl9yZW5kZXJDYWxsYmFja3MsIGMuX3N0YXRlQ2FsbGJhY2tzKTtcblx0XHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXG5cdFx0XHRcdFx0aWYgKGMuX3JlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbW1pdFF1ZXVlLnB1c2goYyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWsgb3V0ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnRXaWxsVXBkYXRlICE9IE5VTEwpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIGMuX25leHRTdGF0ZSwgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNDbGFzc0NvbXBvbmVudCAmJiBjLmNvbXBvbmVudERpZFVwZGF0ZSAhPSBOVUxMKSB7XG5cdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuXHRcdFx0XHRcdFx0Yy5jb21wb25lbnREaWRVcGRhdGUob2xkUHJvcHMsIG9sZFN0YXRlLCBzbmFwc2hvdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Yy5jb250ZXh0ID0gY29tcG9uZW50Q29udGV4dDtcblx0XHRcdGMucHJvcHMgPSBuZXdQcm9wcztcblx0XHRcdGMuX3BhcmVudERvbSA9IHBhcmVudERvbTtcblx0XHRcdGMuX2ZvcmNlID0gZmFsc2U7XG5cblx0XHRcdGxldCByZW5kZXJIb29rID0gb3B0aW9ucy5fcmVuZGVyLFxuXHRcdFx0XHRjb3VudCA9IDA7XG5cdFx0XHRpZiAoaXNDbGFzc0NvbXBvbmVudCkge1xuXHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHRjLl9kaXJ0eSA9IGZhbHNlO1xuXG5cdFx0XHRcdGlmIChyZW5kZXJIb29rKSByZW5kZXJIb29rKG5ld1ZOb2RlKTtcblxuXHRcdFx0XHR0bXAgPSBjLnJlbmRlcihjLnByb3BzLCBjLnN0YXRlLCBjLmNvbnRleHQpO1xuXG5cdFx0XHRcdEVNUFRZX0FSUi5wdXNoLmFwcGx5KGMuX3JlbmRlckNhbGxiYWNrcywgYy5fc3RhdGVDYWxsYmFja3MpO1xuXHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKHJlbmRlckhvb2spIHJlbmRlckhvb2sobmV3Vk5vZGUpO1xuXG5cdFx0XHRcdFx0dG1wID0gYy5yZW5kZXIoYy5wcm9wcywgYy5zdGF0ZSwgYy5jb250ZXh0KTtcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBzZXRTdGF0ZSBjYWxsZWQgaW4gcmVuZGVyLCBzZWUgIzI1NTNcblx0XHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHR9IHdoaWxlIChjLl9kaXJ0eSAmJiArK2NvdW50IDwgMjUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIYW5kbGUgc2V0U3RhdGUgY2FsbGVkIGluIHJlbmRlciwgc2VlICMyNTUzXG5cdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXG5cdFx0XHRpZiAoYy5nZXRDaGlsZENvbnRleHQgIT0gTlVMTCkge1xuXHRcdFx0XHRnbG9iYWxDb250ZXh0ID0gYXNzaWduKGFzc2lnbih7fSwgZ2xvYmFsQ29udGV4dCksIGMuZ2V0Q2hpbGRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNDbGFzc0NvbXBvbmVudCAmJiAhaXNOZXcgJiYgYy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAhPSBOVUxMKSB7XG5cdFx0XHRcdHNuYXBzaG90ID0gYy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShvbGRQcm9wcywgb2xkU3RhdGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgcmVuZGVyUmVzdWx0ID1cblx0XHRcdFx0dG1wICE9IE5VTEwgJiYgdG1wLnR5cGUgPT09IEZyYWdtZW50ICYmIHRtcC5rZXkgPT0gTlVMTFxuXHRcdFx0XHRcdD8gY2xvbmVOb2RlKHRtcC5wcm9wcy5jaGlsZHJlbilcblx0XHRcdFx0XHQ6IHRtcDtcblxuXHRcdFx0b2xkRG9tID0gZGlmZkNoaWxkcmVuKFxuXHRcdFx0XHRwYXJlbnREb20sXG5cdFx0XHRcdGlzQXJyYXkocmVuZGVyUmVzdWx0KSA/IHJlbmRlclJlc3VsdCA6IFtyZW5kZXJSZXN1bHRdLFxuXHRcdFx0XHRuZXdWTm9kZSxcblx0XHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRcdGdsb2JhbENvbnRleHQsXG5cdFx0XHRcdG5hbWVzcGFjZSxcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdFx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0XHRvbGREb20sXG5cdFx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0XHRyZWZRdWV1ZVxuXHRcdFx0KTtcblxuXHRcdFx0Yy5iYXNlID0gbmV3Vk5vZGUuX2RvbTtcblxuXHRcdFx0Ly8gV2Ugc3VjY2Vzc2Z1bGx5IHJlbmRlcmVkIHRoaXMgVk5vZGUsIHVuc2V0IGFueSBzdG9yZWQgaHlkcmF0aW9uL2JhaWxvdXQgc3RhdGU6XG5cdFx0XHRuZXdWTm9kZS5fZmxhZ3MgJj0gUkVTRVRfTU9ERTtcblxuXHRcdFx0aWYgKGMuX3JlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0Y29tbWl0UXVldWUucHVzaChjKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNsZWFyUHJvY2Vzc2luZ0V4Y2VwdGlvbikge1xuXHRcdFx0XHRjLl9wZW5kaW5nRXJyb3IgPSBjLl9wcm9jZXNzaW5nRXhjZXB0aW9uID0gTlVMTDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHQvLyBXZSByZW1vdmUgYW55IGNvbXBvbmVudERpZE1vdW50LCAuLi5cblx0XHRcdC8vIHRoYXQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGJ5IHVzXG5cdFx0XHQvLyBpbnRlcmNlcHRpbmcgdGhlIGVycm9yLlxuXHRcdFx0Y29tbWl0UXVldWUubGVuZ3RoID0gb2xkQ29tbWl0UXVldWVMZW5ndGg7XG5cdFx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPSBOVUxMO1xuXHRcdFx0Ly8gaWYgaHlkcmF0aW5nIG9yIGNyZWF0aW5nIGluaXRpYWwgdHJlZSwgYmFpbG91dCBwcmVzZXJ2ZXMgRE9NOlxuXHRcdFx0aWYgKGlzSHlkcmF0aW5nIHx8IGV4Y2Vzc0RvbUNoaWxkcmVuICE9IE5VTEwpIHtcblx0XHRcdFx0aWYgKGUudGhlbikge1xuXHRcdFx0XHRcdG5ld1ZOb2RlLl9mbGFncyB8PSBpc0h5ZHJhdGluZ1xuXHRcdFx0XHRcdFx0PyBNT0RFX0hZRFJBVEUgfCBNT0RFX1NVU1BFTkRFRFxuXHRcdFx0XHRcdFx0OiBNT0RFX1NVU1BFTkRFRDtcblxuXHRcdFx0XHRcdHdoaWxlIChvbGREb20gJiYgb2xkRG9tLm5vZGVUeXBlID09IDggJiYgb2xkRG9tLm5leHRTaWJsaW5nKSB7XG5cdFx0XHRcdFx0XHRvbGREb20gPSBvbGREb20ubmV4dFNpYmxpbmc7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IE5VTEwpIHtcblx0XHRcdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuW2V4Y2Vzc0RvbUNoaWxkcmVuLmluZGV4T2Yob2xkRG9tKV0gPSBOVUxMO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdWTm9kZS5fZG9tID0gb2xkRG9tO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IE5VTEwpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoOyBpLS07ICkge1xuXHRcdFx0XHRcdFx0cmVtb3ZlTm9kZShleGNlc3NEb21DaGlsZHJlbltpXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdWTm9kZS5fZG9tID0gb2xkVk5vZGUuX2RvbTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1ZOb2RlLl9jaGlsZHJlbiA9PSBOVUxMKSB7XG5cdFx0XHRcdG5ld1ZOb2RlLl9jaGlsZHJlbiA9IG9sZFZOb2RlLl9jaGlsZHJlbiB8fCBbXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFlLnRoZW4pIG1hcmtBc0ZvcmNlKG5ld1ZOb2RlKTtcblx0XHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgbmV3Vk5vZGUsIG9sZFZOb2RlKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoXG5cdFx0ZXhjZXNzRG9tQ2hpbGRyZW4gPT0gTlVMTCAmJlxuXHRcdG5ld1ZOb2RlLl9vcmlnaW5hbCA9PSBvbGRWTm9kZS5fb3JpZ2luYWxcblx0KSB7XG5cdFx0bmV3Vk5vZGUuX2NoaWxkcmVuID0gb2xkVk5vZGUuX2NoaWxkcmVuO1xuXHRcdG5ld1ZOb2RlLl9kb20gPSBvbGRWTm9kZS5fZG9tO1xuXHR9IGVsc2Uge1xuXHRcdG9sZERvbSA9IG5ld1ZOb2RlLl9kb20gPSBkaWZmRWxlbWVudE5vZGVzKFxuXHRcdFx0b2xkVk5vZGUuX2RvbSxcblx0XHRcdG5ld1ZOb2RlLFxuXHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0bmFtZXNwYWNlLFxuXHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0cmVmUXVldWVcblx0XHQpO1xuXHR9XG5cblx0aWYgKCh0bXAgPSBvcHRpb25zLmRpZmZlZCkpIHRtcChuZXdWTm9kZSk7XG5cblx0cmV0dXJuIG5ld1ZOb2RlLl9mbGFncyAmIE1PREVfU1VTUEVOREVEID8gdW5kZWZpbmVkIDogb2xkRG9tO1xufVxuXG5mdW5jdGlvbiBtYXJrQXNGb3JjZSh2bm9kZSkge1xuXHRpZiAodm5vZGUpIHtcblx0XHRpZiAodm5vZGUuX2NvbXBvbmVudCkgdm5vZGUuX2NvbXBvbmVudC5fZm9yY2UgPSB0cnVlO1xuXHRcdGlmICh2bm9kZS5fY2hpbGRyZW4pIHZub2RlLl9jaGlsZHJlbi5zb21lKG1hcmtBc0ZvcmNlKTtcblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzXG4gKiB3aGljaCBoYXZlIGNhbGxiYWNrcyB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtWTm9kZX0gcm9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0Um9vdChjb21taXRRdWV1ZSwgcm9vdCwgcmVmUXVldWUpIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCByZWZRdWV1ZS5sZW5ndGg7IGkrKykge1xuXHRcdGFwcGx5UmVmKHJlZlF1ZXVlW2ldLCByZWZRdWV1ZVsrK2ldLCByZWZRdWV1ZVsrK2ldKTtcblx0fVxuXG5cdGlmIChvcHRpb25zLl9jb21taXQpIG9wdGlvbnMuX2NvbW1pdChyb290LCBjb21taXRRdWV1ZSk7XG5cblx0Y29tbWl0UXVldWUuc29tZShjID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBSZXVzZSB0aGUgY29tbWl0UXVldWUgdmFyaWFibGUgaGVyZSBzbyB0aGUgdHlwZSBjaGFuZ2VzXG5cdFx0XHRjb21taXRRdWV1ZSA9IGMuX3JlbmRlckNhbGxiYWNrcztcblx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0Y29tbWl0UXVldWUuc29tZShjYiA9PiB7XG5cdFx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgU2VlIGFib3ZlIGNvbW1lbnQgb24gY29tbWl0UXVldWVcblx0XHRcdFx0Y2IuY2FsbChjKTtcblx0XHRcdH0pO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgYy5fdm5vZGUpO1xuXHRcdH1cblx0fSk7XG59XG5cbmZ1bmN0aW9uIGNsb25lTm9kZShub2RlKSB7XG5cdGlmICh0eXBlb2Ygbm9kZSAhPSAnb2JqZWN0JyB8fCBub2RlID09IE5VTEwgfHwgbm9kZS5fZGVwdGggPiAwKSB7XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH1cblxuXHRpZiAoaXNBcnJheShub2RlKSkge1xuXHRcdHJldHVybiBub2RlLm1hcChjbG9uZU5vZGUpO1xuXHR9XG5cblx0aWYgKG5vZGUuY29uc3RydWN0b3IgIT09IFVOREVGSU5FRCkgcmV0dXJuIG51bGw7XG5cblx0cmV0dXJuIGFzc2lnbih7fSwgbm9kZSk7XG59XG5cbi8qKlxuICogRGlmZiB0d28gdmlydHVhbCBub2RlcyByZXByZXNlbnRpbmcgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gZG9tIFRoZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIHZpcnR1YWwgbm9kZXNcbiAqIGJlaW5nIGRpZmZlZFxuICogQHBhcmFtIHtWTm9kZX0gbmV3Vk5vZGUgVGhlIG5ldyB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7Vk5vZGV9IG9sZFZOb2RlIFRoZSBvbGQgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsQ29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSBDdXJyZW50IG5hbWVzcGFjZSBvZiB0aGUgRE9NIG5vZGUgKEhUTUwsIFNWRywgb3IgTWF0aE1MKVxuICogQHBhcmFtIHtBcnJheTxQcmVhY3RFbGVtZW50Pn0gZXhjZXNzRG9tQ2hpbGRyZW5cbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzIHdoaWNoIGhhdmUgY2FsbGJhY2tzXG4gKiB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtib29sZWFufSBpc0h5ZHJhdGluZyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgaW4gaHlkcmF0aW9uXG4gKiBAcGFyYW0ge2FueVtdfSByZWZRdWV1ZSBhbiBhcnJheSBvZiBlbGVtZW50cyBuZWVkZWQgdG8gaW52b2tlIHJlZnNcbiAqIEByZXR1cm5zIHtQcmVhY3RFbGVtZW50fVxuICovXG5mdW5jdGlvbiBkaWZmRWxlbWVudE5vZGVzKFxuXHRkb20sXG5cdG5ld1ZOb2RlLFxuXHRvbGRWTm9kZSxcblx0Z2xvYmFsQ29udGV4dCxcblx0bmFtZXNwYWNlLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdGlzSHlkcmF0aW5nLFxuXHRyZWZRdWV1ZVxuKSB7XG5cdGxldCBvbGRQcm9wcyA9IG9sZFZOb2RlLnByb3BzIHx8IEVNUFRZX09CSjtcblx0bGV0IG5ld1Byb3BzID0gbmV3Vk5vZGUucHJvcHM7XG5cdGxldCBub2RlVHlwZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobmV3Vk5vZGUudHlwZSk7XG5cdC8qKiBAdHlwZSB7YW55fSAqL1xuXHRsZXQgaTtcblx0LyoqIEB0eXBlIHt7IF9faHRtbD86IHN0cmluZyB9fSAqL1xuXHRsZXQgbmV3SHRtbDtcblx0LyoqIEB0eXBlIHt7IF9faHRtbD86IHN0cmluZyB9fSAqL1xuXHRsZXQgb2xkSHRtbDtcblx0LyoqIEB0eXBlIHtDb21wb25lbnRDaGlsZHJlbn0gKi9cblx0bGV0IG5ld0NoaWxkcmVuO1xuXHRsZXQgdmFsdWU7XG5cdGxldCBpbnB1dFZhbHVlO1xuXHRsZXQgY2hlY2tlZDtcblxuXHQvLyBUcmFja3MgZW50ZXJpbmcgYW5kIGV4aXRpbmcgbmFtZXNwYWNlcyB3aGVuIGRlc2NlbmRpbmcgdGhyb3VnaCB0aGUgdHJlZS5cblx0aWYgKG5vZGVUeXBlID09ICdzdmcnKSBuYW1lc3BhY2UgPSBTVkdfTkFNRVNQQUNFO1xuXHRlbHNlIGlmIChub2RlVHlwZSA9PSAnbWF0aCcpIG5hbWVzcGFjZSA9IE1BVEhfTkFNRVNQQUNFO1xuXHRlbHNlIGlmICghbmFtZXNwYWNlKSBuYW1lc3BhY2UgPSBYSFRNTF9OQU1FU1BBQ0U7XG5cblx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IE5VTEwpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhbHVlID0gZXhjZXNzRG9tQ2hpbGRyZW5baV07XG5cblx0XHRcdC8vIGlmIG5ld1ZOb2RlIG1hdGNoZXMgYW4gZWxlbWVudCBpbiBleGNlc3NEb21DaGlsZHJlbiBvciB0aGUgYGRvbWBcblx0XHRcdC8vIGFyZ3VtZW50IG1hdGNoZXMgYW4gZWxlbWVudCBpbiBleGNlc3NEb21DaGlsZHJlbiwgcmVtb3ZlIGl0IGZyb21cblx0XHRcdC8vIGV4Y2Vzc0RvbUNoaWxkcmVuIHNvIGl0IGlzbid0IGxhdGVyIHJlbW92ZWQgaW4gZGlmZkNoaWxkcmVuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHZhbHVlICYmXG5cdFx0XHRcdCdzZXRBdHRyaWJ1dGUnIGluIHZhbHVlID09ICEhbm9kZVR5cGUgJiZcblx0XHRcdFx0KG5vZGVUeXBlID8gdmFsdWUubG9jYWxOYW1lID09IG5vZGVUeXBlIDogdmFsdWUubm9kZVR5cGUgPT0gMylcblx0XHRcdCkge1xuXHRcdFx0XHRkb20gPSB2YWx1ZTtcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5baV0gPSBOVUxMO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoZG9tID09IE5VTEwpIHtcblx0XHRpZiAobm9kZVR5cGUgPT0gTlVMTCkge1xuXHRcdFx0cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld1Byb3BzKTtcblx0XHR9XG5cblx0XHRkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXG5cdFx0XHRuYW1lc3BhY2UsXG5cdFx0XHRub2RlVHlwZSxcblx0XHRcdG5ld1Byb3BzLmlzICYmIG5ld1Byb3BzXG5cdFx0KTtcblxuXHRcdC8vIHdlIGFyZSBjcmVhdGluZyBhIG5ldyBub2RlLCBzbyB3ZSBjYW4gYXNzdW1lIHRoaXMgaXMgYSBuZXcgc3VidHJlZSAoaW5cblx0XHQvLyBjYXNlIHdlIGFyZSBoeWRyYXRpbmcpLCB0aGlzIGRlb3B0cyB0aGUgaHlkcmF0ZVxuXHRcdGlmIChpc0h5ZHJhdGluZykge1xuXHRcdFx0aWYgKG9wdGlvbnMuX2h5ZHJhdGlvbk1pc21hdGNoKVxuXHRcdFx0XHRvcHRpb25zLl9oeWRyYXRpb25NaXNtYXRjaChuZXdWTm9kZSwgZXhjZXNzRG9tQ2hpbGRyZW4pO1xuXHRcdFx0aXNIeWRyYXRpbmcgPSBmYWxzZTtcblx0XHR9XG5cdFx0Ly8gd2UgY3JlYXRlZCBhIG5ldyBwYXJlbnQsIHNvIG5vbmUgb2YgdGhlIHByZXZpb3VzbHkgYXR0YWNoZWQgY2hpbGRyZW4gY2FuIGJlIHJldXNlZDpcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IE5VTEw7XG5cdH1cblxuXHRpZiAobm9kZVR5cGUgPT0gTlVMTCkge1xuXHRcdC8vIER1cmluZyBoeWRyYXRpb24sIHdlIHN0aWxsIGhhdmUgdG8gc3BsaXQgbWVyZ2VkIHRleHQgZnJvbSBTU1InZCBIVE1MLlxuXHRcdGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgJiYgKCFpc0h5ZHJhdGluZyB8fCBkb20uZGF0YSAhPSBuZXdQcm9wcykpIHtcblx0XHRcdGRvbS5kYXRhID0gbmV3UHJvcHM7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIElmIGV4Y2Vzc0RvbUNoaWxkcmVuIHdhcyBub3QgbnVsbCwgcmVwb3B1bGF0ZSBpdCB3aXRoIHRoZSBjdXJyZW50IGVsZW1lbnQncyBjaGlsZHJlbjpcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9XG5cdFx0XHRub2RlVHlwZSA9PSAndGV4dGFyZWEnICYmIG5ld1Byb3BzLmRlZmF1bHRWYWx1ZSAhPSBOVUxMXG5cdFx0XHRcdD8gTlVMTFxuXHRcdFx0XHQ6IGV4Y2Vzc0RvbUNoaWxkcmVuICYmIHNsaWNlLmNhbGwoZG9tLmNoaWxkTm9kZXMpO1xuXG5cdFx0Ly8gSWYgd2UgYXJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFyZSBub3QgaHlkcmF0aW5nIGJ1dCBhcmUgdXNpbmdcblx0XHQvLyBleGlzdGluZyBET00gKGUuZy4gcmVwbGFjZU5vZGUpIHdlIHNob3VsZCByZWFkIHRoZSBleGlzdGluZyBET01cblx0XHQvLyBhdHRyaWJ1dGVzIHRvIGRpZmYgdGhlbVxuXHRcdGlmICghaXNIeWRyYXRpbmcgJiYgZXhjZXNzRG9tQ2hpbGRyZW4gIT0gTlVMTCkge1xuXHRcdFx0b2xkUHJvcHMgPSB7fTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkb20uYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YWx1ZSA9IGRvbS5hdHRyaWJ1dGVzW2ldO1xuXHRcdFx0XHRvbGRQcm9wc1t2YWx1ZS5uYW1lXSA9IHZhbHVlLnZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSBpbiBvbGRQcm9wcykge1xuXHRcdFx0dmFsdWUgPSBvbGRQcm9wc1tpXTtcblx0XHRcdGlmIChpID09ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcpIHtcblx0XHRcdFx0b2xkSHRtbCA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0aSAhPSAnY2hpbGRyZW4nICYmXG5cdFx0XHRcdCEoaSBpbiBuZXdQcm9wcykgJiZcblx0XHRcdFx0IShpID09ICd2YWx1ZScgJiYgJ2RlZmF1bHRWYWx1ZScgaW4gbmV3UHJvcHMpICYmXG5cdFx0XHRcdCEoaSA9PSAnY2hlY2tlZCcgJiYgJ2RlZmF1bHRDaGVja2VkJyBpbiBuZXdQcm9wcylcblx0XHRcdCkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIE5VTEwsIHZhbHVlLCBuYW1lc3BhY2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIER1cmluZyBoeWRyYXRpb24sIHByb3BzIGFyZSBub3QgZGlmZmVkIGF0IGFsbCAoaW5jbHVkaW5nIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKVxuXHRcdC8vIEBUT0RPIHdlIHNob3VsZCB3YXJuIGluIGRlYnVnIG1vZGUgd2hlbiBwcm9wcyBkb24ndCBtYXRjaCBoZXJlLlxuXHRcdGZvciAoaSBpbiBuZXdQcm9wcykge1xuXHRcdFx0dmFsdWUgPSBuZXdQcm9wc1tpXTtcblx0XHRcdGlmIChpID09ICdjaGlsZHJlbicpIHtcblx0XHRcdFx0bmV3Q2hpbGRyZW4gPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnKSB7XG5cdFx0XHRcdG5ld0h0bWwgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PSAndmFsdWUnKSB7XG5cdFx0XHRcdGlucHV0VmFsdWUgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PSAnY2hlY2tlZCcpIHtcblx0XHRcdFx0Y2hlY2tlZCA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KCFpc0h5ZHJhdGluZyB8fCB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJykgJiZcblx0XHRcdFx0b2xkUHJvcHNbaV0gIT09IHZhbHVlXG5cdFx0XHQpIHtcblx0XHRcdFx0c2V0UHJvcGVydHkoZG9tLCBpLCB2YWx1ZSwgb2xkUHJvcHNbaV0sIG5hbWVzcGFjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIG5ldyB2bm9kZSBkaWRuJ3QgaGF2ZSBkYW5nZXJvdXNseVNldElubmVySFRNTCwgZGlmZiBpdHMgY2hpbGRyZW5cblx0XHRpZiAobmV3SHRtbCkge1xuXHRcdFx0Ly8gQXZvaWQgcmUtYXBwbHlpbmcgdGhlIHNhbWUgJ19faHRtbCcgaWYgaXQgZGlkIG5vdCBjaGFuZ2VkIGJldHdlZW4gcmUtcmVuZGVyXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpc0h5ZHJhdGluZyAmJlxuXHRcdFx0XHQoIW9sZEh0bWwgfHxcblx0XHRcdFx0XHQobmV3SHRtbC5fX2h0bWwgIT0gb2xkSHRtbC5fX2h0bWwgJiYgbmV3SHRtbC5fX2h0bWwgIT0gZG9tLmlubmVySFRNTCkpXG5cdFx0XHQpIHtcblx0XHRcdFx0ZG9tLmlubmVySFRNTCA9IG5ld0h0bWwuX19odG1sO1xuXHRcdFx0fVxuXG5cdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBbXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKG9sZEh0bWwpIGRvbS5pbm5lckhUTUwgPSAnJztcblxuXHRcdFx0ZGlmZkNoaWxkcmVuKFxuXHRcdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yXG5cdFx0XHRcdG5ld1ZOb2RlLnR5cGUgPT0gJ3RlbXBsYXRlJyA/IGRvbS5jb250ZW50IDogZG9tLFxuXHRcdFx0XHRpc0FycmF5KG5ld0NoaWxkcmVuKSA/IG5ld0NoaWxkcmVuIDogW25ld0NoaWxkcmVuXSxcblx0XHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0XHRub2RlVHlwZSA9PSAnZm9yZWlnbk9iamVjdCcgPyBYSFRNTF9OQU1FU1BBQ0UgOiBuYW1lc3BhY2UsXG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5cblx0XHRcdFx0XHQ/IGV4Y2Vzc0RvbUNoaWxkcmVuWzBdXG5cdFx0XHRcdFx0OiBvbGRWTm9kZS5fY2hpbGRyZW4gJiYgZ2V0RG9tU2libGluZyhvbGRWTm9kZSwgMCksXG5cdFx0XHRcdGlzSHlkcmF0aW5nLFxuXHRcdFx0XHRyZWZRdWV1ZVxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gUmVtb3ZlIGNoaWxkcmVuIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFueSB2bm9kZS5cblx0XHRcdGlmIChleGNlc3NEb21DaGlsZHJlbiAhPSBOVUxMKSB7XG5cdFx0XHRcdGZvciAoaSA9IGV4Y2Vzc0RvbUNoaWxkcmVuLmxlbmd0aDsgaS0tOyApIHtcblx0XHRcdFx0XHRyZW1vdmVOb2RlKGV4Y2Vzc0RvbUNoaWxkcmVuW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFzIGFib3ZlLCBkb24ndCBkaWZmIHByb3BzIGR1cmluZyBoeWRyYXRpb25cblx0XHRpZiAoIWlzSHlkcmF0aW5nIHx8IG5vZGVUeXBlID09ICd0ZXh0YXJlYScpIHtcblx0XHRcdGkgPSAndmFsdWUnO1xuXHRcdFx0aWYgKG5vZGVUeXBlID09ICdwcm9ncmVzcycgJiYgaW5wdXRWYWx1ZSA9PSBOVUxMKSB7XG5cdFx0XHRcdGRvbS5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRpbnB1dFZhbHVlICE9IFVOREVGSU5FRCAmJlxuXHRcdFx0XHQvLyAjMjc1NiBGb3IgdGhlIDxwcm9ncmVzcz4tZWxlbWVudCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyAwLFxuXHRcdFx0XHQvLyBkZXNwaXRlIHRoZSBhdHRyaWJ1dGUgbm90IGJlaW5nIHByZXNlbnQuIFdoZW4gdGhlIGF0dHJpYnV0ZVxuXHRcdFx0XHQvLyBpcyBtaXNzaW5nIHRoZSBwcm9ncmVzcyBiYXIgaXMgdHJlYXRlZCBhcyBpbmRldGVybWluYXRlLlxuXHRcdFx0XHQvLyBUbyBmaXggdGhhdCB3ZSdsbCBhbHdheXMgdXBkYXRlIGl0IHdoZW4gaXQgaXMgMCBmb3IgcHJvZ3Jlc3MgZWxlbWVudHNcblx0XHRcdFx0KGlucHV0VmFsdWUgIT09IGRvbVtpXSB8fFxuXHRcdFx0XHRcdChub2RlVHlwZSA9PSAncHJvZ3Jlc3MnICYmICFpbnB1dFZhbHVlKSB8fFxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgb25seSBmb3IgSUUgMTEgdG8gZml4IDxzZWxlY3Q+IHZhbHVlIG5vdCBiZWluZyB1cGRhdGVkLlxuXHRcdFx0XHRcdC8vIFRvIGF2b2lkIGEgc3RhbGUgc2VsZWN0IHZhbHVlIHdlIG5lZWQgdG8gc2V0IHRoZSBvcHRpb24udmFsdWVcblx0XHRcdFx0XHQvLyBhZ2Fpbiwgd2hpY2ggdHJpZ2dlcnMgSUUxMSB0byByZS1ldmFsdWF0ZSB0aGUgc2VsZWN0IHZhbHVlXG5cdFx0XHRcdFx0KG5vZGVUeXBlID09ICdvcHRpb24nICYmIGlucHV0VmFsdWUgIT0gb2xkUHJvcHNbaV0pKVxuXHRcdFx0KSB7XG5cdFx0XHRcdHNldFByb3BlcnR5KGRvbSwgaSwgaW5wdXRWYWx1ZSwgb2xkUHJvcHNbaV0sIG5hbWVzcGFjZSk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSAnY2hlY2tlZCc7XG5cdFx0XHRpZiAoY2hlY2tlZCAhPSBVTkRFRklORUQgJiYgY2hlY2tlZCAhPSBkb21baV0pIHtcblx0XHRcdFx0c2V0UHJvcGVydHkoZG9tLCBpLCBjaGVja2VkLCBvbGRQcm9wc1tpXSwgbmFtZXNwYWNlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZG9tO1xufVxuXG4vKipcbiAqIEludm9rZSBvciB1cGRhdGUgYSByZWYsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGEgZnVuY3Rpb24gb3Igb2JqZWN0IHJlZi5cbiAqIEBwYXJhbSB7UmVmPGFueT4gJiB7IF91bm1vdW50PzogdW5rbm93biB9fSByZWZcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtWTm9kZX0gdm5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVmKHJlZiwgdmFsdWUsIHZub2RlKSB7XG5cdHRyeSB7XG5cdFx0aWYgKHR5cGVvZiByZWYgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0bGV0IGhhc1JlZlVubW91bnQgPSB0eXBlb2YgcmVmLl91bm1vdW50ID09ICdmdW5jdGlvbic7XG5cdFx0XHRpZiAoaGFzUmVmVW5tb3VudCkge1xuXHRcdFx0XHQvLyBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBtb3ZpbmcgbmFycm93aW5nIGNoZWNrcyBpbnRvIHZhcmlhYmxlc1xuXHRcdFx0XHRyZWYuX3VubW91bnQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFoYXNSZWZVbm1vdW50IHx8IHZhbHVlICE9IE5VTEwpIHtcblx0XHRcdFx0Ly8gU3RvcmUgdGhlIGNsZWFudXAgZnVuY3Rpb24gb24gdGhlIGZ1bmN0aW9uXG5cdFx0XHRcdC8vIGluc3RhbmNlIG9iamVjdCBpdHNlbGYgdG8gYXZvaWQgc2hhcGVcblx0XHRcdFx0Ly8gdHJhbnNpdGlvbmluZyB2bm9kZVxuXHRcdFx0XHRyZWYuX3VubW91bnQgPSByZWYodmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSByZWYuY3VycmVudCA9IHZhbHVlO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCB2bm9kZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBVbm1vdW50IGEgdmlydHVhbCBub2RlIGZyb20gdGhlIHRyZWUgYW5kIGFwcGx5IERPTSBjaGFuZ2VzXG4gKiBAcGFyYW0ge1ZOb2RlfSB2bm9kZSBUaGUgdmlydHVhbCBub2RlIHRvIHVubW91bnRcbiAqIEBwYXJhbSB7Vk5vZGV9IHBhcmVudFZOb2RlIFRoZSBwYXJlbnQgb2YgdGhlIFZOb2RlIHRoYXQgaW5pdGlhdGVkIHRoZSB1bm1vdW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtza2lwUmVtb3ZlXSBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgYSBwYXJlbnQgbm9kZSBvZiB0aGVcbiAqIGN1cnJlbnQgZWxlbWVudCBpcyBhbHJlYWR5IGRldGFjaGVkIGZyb20gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVubW91bnQodm5vZGUsIHBhcmVudFZOb2RlLCBza2lwUmVtb3ZlKSB7XG5cdGxldCByO1xuXHRpZiAob3B0aW9ucy51bm1vdW50KSBvcHRpb25zLnVubW91bnQodm5vZGUpO1xuXG5cdGlmICgociA9IHZub2RlLnJlZikpIHtcblx0XHRpZiAoIXIuY3VycmVudCB8fCByLmN1cnJlbnQgPT0gdm5vZGUuX2RvbSkge1xuXHRcdFx0YXBwbHlSZWYociwgTlVMTCwgcGFyZW50Vk5vZGUpO1xuXHRcdH1cblx0fVxuXG5cdGlmICgociA9IHZub2RlLl9jb21wb25lbnQpICE9IE5VTEwpIHtcblx0XHRpZiAoci5jb21wb25lbnRXaWxsVW5tb3VudCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIHBhcmVudFZOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyLmJhc2UgPSByLl9wYXJlbnREb20gPSByLl9nbG9iYWxDb250ZXh0ID0gTlVMTDtcblx0fVxuXG5cdGlmICgociA9IHZub2RlLl9jaGlsZHJlbikpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChyW2ldKSB7XG5cdFx0XHRcdHVubW91bnQoXG5cdFx0XHRcdFx0cltpXSxcblx0XHRcdFx0XHRwYXJlbnRWTm9kZSxcblx0XHRcdFx0XHRza2lwUmVtb3ZlIHx8IHR5cGVvZiB2bm9kZS50eXBlICE9ICdmdW5jdGlvbidcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIXNraXBSZW1vdmUpIHtcblx0XHRyZW1vdmVOb2RlKHZub2RlLl9kb20pO1xuXHR9XG5cblx0dm5vZGUuX2NvbXBvbmVudCA9IHZub2RlLl9wYXJlbnQgPSB2bm9kZS5fZG9tID0gVU5ERUZJTkVEO1xufVxuXG4vKiogVGhlIGAucmVuZGVyKClgIG1ldGhvZCBmb3IgYSBQRkMgYmFja2luZyBpbnN0YW5jZS4gKi9cbmZ1bmN0aW9uIGRvUmVuZGVyKHByb3BzLCBzdGF0ZSwgY29udGV4dCkge1xuXHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvcihwcm9wcywgY29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHsgRU1QVFlfT0JKLCBOVUxMIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgY29tbWl0Um9vdCwgZGlmZiB9IGZyb20gJy4vZGlmZi9pbmRleCc7XG5pbXBvcnQgeyBjcmVhdGVFbGVtZW50LCBGcmFnbWVudCB9IGZyb20gJy4vY3JlYXRlLWVsZW1lbnQnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IHNsaWNlIH0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBSZW5kZXIgYSBQcmVhY3QgdmlydHVhbCBub2RlIGludG8gYSBET00gZWxlbWVudFxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnRDaGlsZH0gdm5vZGUgVGhlIHZpcnR1YWwgbm9kZSB0byByZW5kZXJcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ludGVybmFsJykuUHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBET00gZWxlbWVudCB0byByZW5kZXIgaW50b1xuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50IHwgb2JqZWN0fSBbcmVwbGFjZU5vZGVdIE9wdGlvbmFsOiBBdHRlbXB0IHRvIHJlLXVzZSBhblxuICogZXhpc3RpbmcgRE9NIHRyZWUgcm9vdGVkIGF0IGByZXBsYWNlTm9kZWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcih2bm9kZSwgcGFyZW50RG9tLCByZXBsYWNlTm9kZSkge1xuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vcHJlYWN0anMvcHJlYWN0L2lzc3Vlcy8zNzk0XG5cdGlmIChwYXJlbnREb20gPT0gZG9jdW1lbnQpIHtcblx0XHRwYXJlbnREb20gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cdH1cblxuXHRpZiAob3B0aW9ucy5fcm9vdCkgb3B0aW9ucy5fcm9vdCh2bm9kZSwgcGFyZW50RG9tKTtcblxuXHQvLyBXZSBhYnVzZSB0aGUgYHJlcGxhY2VOb2RlYCBwYXJhbWV0ZXIgaW4gYGh5ZHJhdGUoKWAgdG8gc2lnbmFsIGlmIHdlIGFyZSBpblxuXHQvLyBoeWRyYXRpb24gbW9kZSBvciBub3QgYnkgcGFzc2luZyB0aGUgYGh5ZHJhdGVgIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBET01cblx0Ly8gZWxlbWVudC4uXG5cdGxldCBpc0h5ZHJhdGluZyA9IHR5cGVvZiByZXBsYWNlTm9kZSA9PSAnZnVuY3Rpb24nO1xuXG5cdC8vIFRvIGJlIGFibGUgdG8gc3VwcG9ydCBjYWxsaW5nIGByZW5kZXIoKWAgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWVcblx0Ly8gRE9NIG5vZGUsIHdlIG5lZWQgdG8gb2J0YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyB0cmVlLiBXZSBkb1xuXHQvLyB0aGlzIGJ5IGFzc2lnbmluZyBhIG5ldyBgX2NoaWxkcmVuYCBwcm9wZXJ0eSB0byBET00gbm9kZXMgd2hpY2ggcG9pbnRzXG5cdC8vIHRvIHRoZSBsYXN0IHJlbmRlcmVkIHRyZWUuIEJ5IGRlZmF1bHQgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCwgd2hpY2hcblx0Ly8gbWVhbnMgdGhhdCB3ZSBhcmUgbW91bnRpbmcgYSBuZXcgdHJlZSBmb3IgdGhlIGZpcnN0IHRpbWUuXG5cdGxldCBvbGRWTm9kZSA9IGlzSHlkcmF0aW5nXG5cdFx0PyBOVUxMXG5cdFx0OiAocmVwbGFjZU5vZGUgJiYgcmVwbGFjZU5vZGUuX2NoaWxkcmVuKSB8fCBwYXJlbnREb20uX2NoaWxkcmVuO1xuXG5cdHZub2RlID0gKCghaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGUpIHx8IHBhcmVudERvbSkuX2NoaWxkcmVuID1cblx0XHRjcmVhdGVFbGVtZW50KEZyYWdtZW50LCBOVUxMLCBbdm5vZGVdKTtcblxuXHQvLyBMaXN0IG9mIGVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIGNhbGxlZCBhZnRlciBkaWZmaW5nLlxuXHRsZXQgY29tbWl0UXVldWUgPSBbXSxcblx0XHRyZWZRdWV1ZSA9IFtdO1xuXHRkaWZmKFxuXHRcdHBhcmVudERvbSxcblx0XHQvLyBEZXRlcm1pbmUgdGhlIG5ldyB2bm9kZSB0cmVlIGFuZCBzdG9yZSBpdCBvbiB0aGUgRE9NIGVsZW1lbnQgb25cblx0XHQvLyBvdXIgY3VzdG9tIGBfY2hpbGRyZW5gIHByb3BlcnR5LlxuXHRcdHZub2RlLFxuXHRcdG9sZFZOb2RlIHx8IEVNUFRZX09CSixcblx0XHRFTVBUWV9PQkosXG5cdFx0cGFyZW50RG9tLm5hbWVzcGFjZVVSSSxcblx0XHQhaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGVcblx0XHRcdD8gW3JlcGxhY2VOb2RlXVxuXHRcdFx0OiBvbGRWTm9kZVxuXHRcdFx0XHQ/IE5VTExcblx0XHRcdFx0OiBwYXJlbnREb20uZmlyc3RDaGlsZFxuXHRcdFx0XHRcdD8gc2xpY2UuY2FsbChwYXJlbnREb20uY2hpbGROb2Rlcylcblx0XHRcdFx0XHQ6IE5VTEwsXG5cdFx0Y29tbWl0UXVldWUsXG5cdFx0IWlzSHlkcmF0aW5nICYmIHJlcGxhY2VOb2RlXG5cdFx0XHQ/IHJlcGxhY2VOb2RlXG5cdFx0XHQ6IG9sZFZOb2RlXG5cdFx0XHRcdD8gb2xkVk5vZGUuX2RvbVxuXHRcdFx0XHQ6IHBhcmVudERvbS5maXJzdENoaWxkLFxuXHRcdGlzSHlkcmF0aW5nLFxuXHRcdHJlZlF1ZXVlXG5cdCk7XG5cblx0Ly8gRmx1c2ggYWxsIHF1ZXVlZCBlZmZlY3RzXG5cdGNvbW1pdFJvb3QoY29tbWl0UXVldWUsIHZub2RlLCByZWZRdWV1ZSk7XG5cblx0Ly8gVGhlIGxpdmUgY2hpbGRyZW4gYXJlIHRyYWNrZWQgb24gX2NoaWxkcmVuIGFmdGVyIGRpZmZpbmcuXG5cdHZub2RlLnByb3BzLmNoaWxkcmVuID0gTlVMTDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQgd2l0aCBkYXRhIGZyb20gYSBQcmVhY3QgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudENoaWxkfSB2bm9kZSBUaGUgdmlydHVhbCBub2RlIHRvIHJlbmRlclxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5QcmVhY3RFbGVtZW50fSBwYXJlbnREb20gVGhlIERPTSBlbGVtZW50IHRvIHVwZGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZSh2bm9kZSwgcGFyZW50RG9tKSB7XG5cdHJlbmRlcih2bm9kZSwgcGFyZW50RG9tLCBoeWRyYXRlKTtcbn1cbiIsICJpbXBvcnQgeyBhc3NpZ24sIHNsaWNlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNyZWF0ZVZOb2RlIH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBOVUxMLCBVTkRFRklORUQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQ2xvbmVzIHRoZSBnaXZlbiBWTm9kZSwgb3B0aW9uYWxseSBhZGRpbmcgYXR0cmlidXRlcy9wcm9wcyBhbmQgcmVwbGFjaW5nIGl0c1xuICogY2hpbGRyZW4uXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlfSB2bm9kZSBUaGUgdmlydHVhbCBET00gZWxlbWVudCB0byBjbG9uZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIEF0dHJpYnV0ZXMvcHJvcHMgdG8gYWRkIHdoZW4gY2xvbmluZ1xuICogQHBhcmFtIHtBcnJheTxpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnRDaGlsZHJlbj59IHJlc3QgQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgdXNlZFxuICogYXMgcmVwbGFjZW1lbnQgY2hpbGRyZW4uXG4gKiBAcmV0dXJucyB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUVsZW1lbnQodm5vZGUsIHByb3BzLCBjaGlsZHJlbikge1xuXHRsZXQgbm9ybWFsaXplZFByb3BzID0gYXNzaWduKHt9LCB2bm9kZS5wcm9wcyksXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRpO1xuXG5cdGxldCBkZWZhdWx0UHJvcHM7XG5cblx0aWYgKHZub2RlLnR5cGUgJiYgdm5vZGUudHlwZS5kZWZhdWx0UHJvcHMpIHtcblx0XHRkZWZhdWx0UHJvcHMgPSB2bm9kZS50eXBlLmRlZmF1bHRQcm9wcztcblx0fVxuXG5cdGZvciAoaSBpbiBwcm9wcykge1xuXHRcdGlmIChpID09ICdrZXknKSBrZXkgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChpID09ICdyZWYnKSByZWYgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChwcm9wc1tpXSA9PT0gVU5ERUZJTkVEICYmIGRlZmF1bHRQcm9wcyAhPSBVTkRFRklORUQpIHtcblx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IGRlZmF1bHRQcm9wc1tpXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bm9ybWFsaXplZFByb3BzW2ldID0gcHJvcHNbaV07XG5cdFx0fVxuXHR9XG5cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG5cdFx0bm9ybWFsaXplZFByb3BzLmNoaWxkcmVuID1cblx0XHRcdGFyZ3VtZW50cy5sZW5ndGggPiAzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIDogY2hpbGRyZW47XG5cdH1cblxuXHRyZXR1cm4gY3JlYXRlVk5vZGUoXG5cdFx0dm5vZGUudHlwZSxcblx0XHRub3JtYWxpemVkUHJvcHMsXG5cdFx0a2V5IHx8IHZub2RlLmtleSxcblx0XHRyZWYgfHwgdm5vZGUucmVmLFxuXHRcdE5VTExcblx0KTtcbn1cbiIsICJpbXBvcnQgeyBOVUxMIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBGaW5kIHRoZSBjbG9zZXN0IGVycm9yIGJvdW5kYXJ5IHRvIGEgdGhyb3duIGVycm9yIGFuZCBjYWxsIGl0XG4gKiBAcGFyYW0ge29iamVjdH0gZXJyb3IgVGhlIHRocm93biB2YWx1ZVxuICogQHBhcmFtIHtpbXBvcnQoJy4uL2ludGVybmFsJykuVk5vZGV9IHZub2RlIFRoZSB2bm9kZSB0aGF0IHRocmV3IHRoZSBlcnJvciB0aGF0IHdhcyBjYXVnaHQgKGV4Y2VwdFxuICogZm9yIHVubW91bnRpbmcgd2hlbiB0aGlzIHBhcmFtZXRlciBpcyB0aGUgaGlnaGVzdCBwYXJlbnQgdGhhdCB3YXMgYmVpbmdcbiAqIHVubW91bnRlZClcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLlZOb2RlfSBbb2xkVk5vZGVdXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi4vaW50ZXJuYWwnKS5FcnJvckluZm99IFtlcnJvckluZm9dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2F0Y2hFcnJvcihlcnJvciwgdm5vZGUsIG9sZFZOb2RlLCBlcnJvckluZm8pIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4uL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xuXHRsZXQgY29tcG9uZW50LFxuXHRcdC8qKiBAdHlwZSB7aW1wb3J0KCcuLi9pbnRlcm5hbCcpLkNvbXBvbmVudFR5cGV9ICovXG5cdFx0Y3Rvcixcblx0XHQvKiogQHR5cGUge2Jvb2xlYW59ICovXG5cdFx0aGFuZGxlZDtcblxuXHRmb3IgKDsgKHZub2RlID0gdm5vZGUuX3BhcmVudCk7ICkge1xuXHRcdGlmICgoY29tcG9uZW50ID0gdm5vZGUuX2NvbXBvbmVudCkgJiYgIWNvbXBvbmVudC5fcHJvY2Vzc2luZ0V4Y2VwdGlvbikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y3RvciA9IGNvbXBvbmVudC5jb25zdHJ1Y3RvcjtcblxuXHRcdFx0XHRpZiAoY3RvciAmJiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPSBOVUxMKSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50LnNldFN0YXRlKGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yKSk7XG5cdFx0XHRcdFx0aGFuZGxlZCA9IGNvbXBvbmVudC5fZGlydHk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29tcG9uZW50LmNvbXBvbmVudERpZENhdGNoICE9IE5VTEwpIHtcblx0XHRcdFx0XHRjb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbyB8fCB7fSk7XG5cdFx0XHRcdFx0aGFuZGxlZCA9IGNvbXBvbmVudC5fZGlydHk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaGlzIGlzIGFuIGVycm9yIGJvdW5kYXJ5LiBNYXJrIGl0IGFzIGhhdmluZyBiYWlsZWQgb3V0LCBhbmQgd2hldGhlciBpdCB3YXMgbWlkLWh5ZHJhdGlvbi5cblx0XHRcdFx0aWYgKGhhbmRsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gKGNvbXBvbmVudC5fcGVuZGluZ0Vycm9yID0gY29tcG9uZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRlcnJvciA9IGU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgZXJyb3I7XG59XG4iLCAiaW1wb3J0IHsgb3B0aW9ucyBhcyBfb3B0aW9ucyB9IGZyb20gJ3ByZWFjdCc7XG5cbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xubGV0IGN1cnJlbnRJbmRleDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9ICovXG5sZXQgY3VycmVudENvbXBvbmVudDtcblxuLyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnR9ICovXG5sZXQgcHJldmlvdXNDb21wb25lbnQ7XG5cbi8qKiBAdHlwZSB7bnVtYmVyfSAqL1xubGV0IGN1cnJlbnRIb29rID0gMDtcblxuLyoqIEB0eXBlIHtBcnJheTxpbXBvcnQoJy4vaW50ZXJuYWwnKS5Db21wb25lbnQ+fSAqL1xubGV0IGFmdGVyUGFpbnRFZmZlY3RzID0gW107XG5cbi8vIENhc3QgdG8gdXNlIGludGVybmFsIE9wdGlvbnMgdHlwZVxuY29uc3Qgb3B0aW9ucyA9IC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuT3B0aW9uc30gKi8gKF9vcHRpb25zKTtcblxubGV0IG9sZEJlZm9yZURpZmYgPSBvcHRpb25zLl9kaWZmO1xubGV0IG9sZEJlZm9yZVJlbmRlciA9IG9wdGlvbnMuX3JlbmRlcjtcbmxldCBvbGRBZnRlckRpZmYgPSBvcHRpb25zLmRpZmZlZDtcbmxldCBvbGRDb21taXQgPSBvcHRpb25zLl9jb21taXQ7XG5sZXQgb2xkQmVmb3JlVW5tb3VudCA9IG9wdGlvbnMudW5tb3VudDtcbmxldCBvbGRSb290ID0gb3B0aW9ucy5fcm9vdDtcblxuLy8gV2UgdGFrZSB0aGUgbWluaW11bSB0aW1lb3V0IGZvciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgdG8gZW5zdXJlIHRoYXRcbi8vIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIGFmdGVyIHRoZSBuZXh0IGZyYW1lLiAzNW1zIGlzIGJhc2VkIG9uIGEgMzBoelxuLy8gcmVmcmVzaCByYXRlLCB3aGljaCBpcyB0aGUgbWluaW11bSByYXRlIGZvciBhIHNtb290aCB1c2VyIGV4cGVyaWVuY2UuXG5jb25zdCBSQUZfVElNRU9VVCA9IDM1O1xubGV0IHByZXZSYWY7XG5cbi8qKiBAdHlwZSB7KHZub2RlOiBpbXBvcnQoJy4vaW50ZXJuYWwnKS5WTm9kZSkgPT4gdm9pZH0gKi9cbm9wdGlvbnMuX2RpZmYgPSB2bm9kZSA9PiB7XG5cdGN1cnJlbnRDb21wb25lbnQgPSBudWxsO1xuXHRpZiAob2xkQmVmb3JlRGlmZikgb2xkQmVmb3JlRGlmZih2bm9kZSk7XG59O1xuXG5vcHRpb25zLl9yb290ID0gKHZub2RlLCBwYXJlbnREb20pID0+IHtcblx0aWYgKHZub2RlICYmIHBhcmVudERvbS5fY2hpbGRyZW4gJiYgcGFyZW50RG9tLl9jaGlsZHJlbi5fbWFzaykge1xuXHRcdHZub2RlLl9tYXNrID0gcGFyZW50RG9tLl9jaGlsZHJlbi5fbWFzaztcblx0fVxuXG5cdGlmIChvbGRSb290KSBvbGRSb290KHZub2RlLCBwYXJlbnREb20pO1xufTtcblxuLyoqIEB0eXBlIHsodm5vZGU6IGltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlKSA9PiB2b2lkfSAqL1xub3B0aW9ucy5fcmVuZGVyID0gdm5vZGUgPT4ge1xuXHRpZiAob2xkQmVmb3JlUmVuZGVyKSBvbGRCZWZvcmVSZW5kZXIodm5vZGUpO1xuXG5cdGN1cnJlbnRDb21wb25lbnQgPSB2bm9kZS5fY29tcG9uZW50O1xuXHRjdXJyZW50SW5kZXggPSAwO1xuXG5cdGNvbnN0IGhvb2tzID0gY3VycmVudENvbXBvbmVudC5fX2hvb2tzO1xuXHRpZiAoaG9va3MpIHtcblx0XHRpZiAocHJldmlvdXNDb21wb25lbnQgPT09IGN1cnJlbnRDb21wb25lbnQpIHtcblx0XHRcdGhvb2tzLl9wZW5kaW5nRWZmZWN0cyA9IFtdO1xuXHRcdFx0Y3VycmVudENvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzID0gW107XG5cdFx0XHRob29rcy5fbGlzdC5zb21lKGhvb2tJdGVtID0+IHtcblx0XHRcdFx0aWYgKGhvb2tJdGVtLl9uZXh0VmFsdWUpIHtcblx0XHRcdFx0XHRob29rSXRlbS5fdmFsdWUgPSBob29rSXRlbS5fbmV4dFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGhvb2tJdGVtLl9wZW5kaW5nQXJncyA9IGhvb2tJdGVtLl9uZXh0VmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzLnNvbWUoaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRob29rcy5fcGVuZGluZ0VmZmVjdHMuc29tZShpbnZva2VFZmZlY3QpO1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0XHRjdXJyZW50SW5kZXggPSAwO1xuXHRcdH1cblx0fVxuXHRwcmV2aW91c0NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQ7XG59O1xuXG4vKiogQHR5cGUgeyh2bm9kZTogaW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGUpID0+IHZvaWR9ICovXG5vcHRpb25zLmRpZmZlZCA9IHZub2RlID0+IHtcblx0aWYgKG9sZEFmdGVyRGlmZikgb2xkQWZ0ZXJEaWZmKHZub2RlKTtcblxuXHRjb25zdCBjID0gdm5vZGUuX2NvbXBvbmVudDtcblx0aWYgKGMgJiYgYy5fX2hvb2tzKSB7XG5cdFx0aWYgKGMuX19ob29rcy5fcGVuZGluZ0VmZmVjdHMubGVuZ3RoKSBhZnRlclBhaW50KGFmdGVyUGFpbnRFZmZlY3RzLnB1c2goYykpO1xuXHRcdGMuX19ob29rcy5fbGlzdC5zb21lKGhvb2tJdGVtID0+IHtcblx0XHRcdGlmIChob29rSXRlbS5fcGVuZGluZ0FyZ3MpIHtcblx0XHRcdFx0aG9va0l0ZW0uX2FyZ3MgPSBob29rSXRlbS5fcGVuZGluZ0FyZ3M7XG5cdFx0XHRcdGhvb2tJdGVtLl9wZW5kaW5nQXJncyA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRwcmV2aW91c0NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQgPSBudWxsO1xufTtcblxuLy8gVE9ETzogSW1wcm92ZSB0eXBpbmcgb2YgY29tbWl0UXVldWUgcGFyYW1ldGVyXG4vKiogQHR5cGUgeyh2bm9kZTogaW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGUsIGNvbW1pdFF1ZXVlOiBhbnkpID0+IHZvaWR9ICovXG5vcHRpb25zLl9jb21taXQgPSAodm5vZGUsIGNvbW1pdFF1ZXVlKSA9PiB7XG5cdGNvbW1pdFF1ZXVlLnNvbWUoY29tcG9uZW50ID0+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29tcG9uZW50Ll9yZW5kZXJDYWxsYmFja3Muc29tZShpbnZva2VDbGVhbnVwKTtcblx0XHRcdGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzID0gY29tcG9uZW50Ll9yZW5kZXJDYWxsYmFja3MuZmlsdGVyKGNiID0+XG5cdFx0XHRcdGNiLl92YWx1ZSA/IGludm9rZUVmZmVjdChjYikgOiB0cnVlXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbW1pdFF1ZXVlLnNvbWUoYyA9PiB7XG5cdFx0XHRcdGlmIChjLl9yZW5kZXJDYWxsYmFja3MpIGMuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fSk7XG5cdFx0XHRjb21taXRRdWV1ZSA9IFtdO1xuXHRcdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBjb21wb25lbnQuX3Zub2RlKTtcblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvbGRDb21taXQpIG9sZENvbW1pdCh2bm9kZSwgY29tbWl0UXVldWUpO1xufTtcblxuLyoqIEB0eXBlIHsodm5vZGU6IGltcG9ydCgnLi9pbnRlcm5hbCcpLlZOb2RlKSA9PiB2b2lkfSAqL1xub3B0aW9ucy51bm1vdW50ID0gdm5vZGUgPT4ge1xuXHRpZiAob2xkQmVmb3JlVW5tb3VudCkgb2xkQmVmb3JlVW5tb3VudCh2bm9kZSk7XG5cblx0Y29uc3QgYyA9IHZub2RlLl9jb21wb25lbnQ7XG5cdGlmIChjICYmIGMuX19ob29rcykge1xuXHRcdGxldCBoYXNFcnJvcmVkO1xuXHRcdGMuX19ob29rcy5fbGlzdC5zb21lKHMgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aW52b2tlQ2xlYW51cChzKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0aGFzRXJyb3JlZCA9IGU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Yy5fX2hvb2tzID0gdW5kZWZpbmVkO1xuXHRcdGlmIChoYXNFcnJvcmVkKSBvcHRpb25zLl9jYXRjaEVycm9yKGhhc0Vycm9yZWQsIGMuX3Zub2RlKTtcblx0fVxufTtcblxuLyoqXG4gKiBHZXQgYSBob29rJ3Mgc3RhdGUgZnJvbSB0aGUgY3VycmVudENvbXBvbmVudFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaG9vayB0byBnZXRcbiAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIFRoZSBpbmRleCBvZiB0aGUgaG9vayB0byBnZXRcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGdldEhvb2tTdGF0ZShpbmRleCwgdHlwZSkge1xuXHRpZiAob3B0aW9ucy5faG9vaykge1xuXHRcdG9wdGlvbnMuX2hvb2soY3VycmVudENvbXBvbmVudCwgaW5kZXgsIGN1cnJlbnRIb29rIHx8IHR5cGUpO1xuXHR9XG5cdGN1cnJlbnRIb29rID0gMDtcblxuXHQvLyBMYXJnZWx5IGluc3BpcmVkIGJ5OlxuXHQvLyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNoYWVsLWtsZWluL2Z1bmN5LmpzL2Jsb2IvZjZiZTczNDY4ZTZlYzQ2YjBmZjVhYTNjYzRjOWJhZjcyYTI5MDI1YS9zcmMvaG9va3MvY29yZV9ob29rcy5tanNcblx0Ly8gKiBodHRwczovL2dpdGh1Yi5jb20vbWljaGFlbC1rbGVpbi9mdW5jeS5qcy9ibG9iLzY1MGJlYWE1OGM0M2MzM2E3NDgyMGEzYzk4YjNjNzA3OWNmMmUzMzMvc3JjL3JlbmRlcmVyLm1qc1xuXHQvLyBPdGhlciBpbXBsZW1lbnRhdGlvbnMgdG8gbG9vayBhdDpcblx0Ly8gKiBodHRwczovL2NvZGVzYW5kYm94LmlvL3MvbW5veDA1cXA4XG5cdGNvbnN0IGhvb2tzID1cblx0XHRjdXJyZW50Q29tcG9uZW50Ll9faG9va3MgfHxcblx0XHQoY3VycmVudENvbXBvbmVudC5fX2hvb2tzID0ge1xuXHRcdFx0X2xpc3Q6IFtdLFxuXHRcdFx0X3BlbmRpbmdFZmZlY3RzOiBbXVxuXHRcdH0pO1xuXG5cdGlmIChpbmRleCA+PSBob29rcy5fbGlzdC5sZW5ndGgpIHtcblx0XHRob29rcy5fbGlzdC5wdXNoKHt9KTtcblx0fVxuXG5cdHJldHVybiBob29rcy5fbGlzdFtpbmRleF07XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHt1bmtub3dufSBTXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbmRleCcpLkRpc3BhdGNoPGltcG9ydCgnLi9pbmRleCcpLlN0YXRlVXBkYXRlcjxTPj59IFtpbml0aWFsU3RhdGVdXG4gKiBAcmV0dXJucyB7W1MsIChzdGF0ZTogUykgPT4gdm9pZF19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcblx0Y3VycmVudEhvb2sgPSAxO1xuXHRyZXR1cm4gdXNlUmVkdWNlcihpbnZva2VPclJldHVybiwgaW5pdGlhbFN0YXRlKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUge3Vua25vd259IFNcbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bn0gQVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5SZWR1Y2VyPFMsIEE+fSByZWR1Y2VyXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbmRleCcpLkRpc3BhdGNoPGltcG9ydCgnLi9pbmRleCcpLlN0YXRlVXBkYXRlcjxTPj59IGluaXRpYWxTdGF0ZVxuICogQHBhcmFtIHsoaW5pdGlhbFN0YXRlOiBhbnkpID0+IHZvaWR9IFtpbml0XVxuICogQHJldHVybnMge1sgUywgKHN0YXRlOiBTKSA9PiB2b2lkIF19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSwgaW5pdCkge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlJlZHVjZXJIb29rU3RhdGV9ICovXG5cdGNvbnN0IGhvb2tTdGF0ZSA9IGdldEhvb2tTdGF0ZShjdXJyZW50SW5kZXgrKywgMik7XG5cdGhvb2tTdGF0ZS5fcmVkdWNlciA9IHJlZHVjZXI7XG5cdGlmICghaG9va1N0YXRlLl9jb21wb25lbnQpIHtcblx0XHRob29rU3RhdGUuX3ZhbHVlID0gW1xuXHRcdFx0IWluaXQgPyBpbnZva2VPclJldHVybih1bmRlZmluZWQsIGluaXRpYWxTdGF0ZSkgOiBpbml0KGluaXRpYWxTdGF0ZSksXG5cblx0XHRcdGFjdGlvbiA9PiB7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGhvb2tTdGF0ZS5fbmV4dFZhbHVlXG5cdFx0XHRcdFx0PyBob29rU3RhdGUuX25leHRWYWx1ZVswXVxuXHRcdFx0XHRcdDogaG9va1N0YXRlLl92YWx1ZVswXTtcblx0XHRcdFx0Y29uc3QgbmV4dFZhbHVlID0gaG9va1N0YXRlLl9yZWR1Y2VyKGN1cnJlbnRWYWx1ZSwgYWN0aW9uKTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlICE9PSBuZXh0VmFsdWUpIHtcblx0XHRcdFx0XHRob29rU3RhdGUuX25leHRWYWx1ZSA9IFtuZXh0VmFsdWUsIGhvb2tTdGF0ZS5fdmFsdWVbMV1dO1xuXHRcdFx0XHRcdGhvb2tTdGF0ZS5fY29tcG9uZW50LnNldFN0YXRlKHt9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF07XG5cblx0XHRob29rU3RhdGUuX2NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQ7XG5cblx0XHRpZiAoIWN1cnJlbnRDb21wb25lbnQuX2hhc1NjdUZyb21Ib29rcykge1xuXHRcdFx0Y3VycmVudENvbXBvbmVudC5faGFzU2N1RnJvbUhvb2tzID0gdHJ1ZTtcblx0XHRcdGxldCBwcmV2U2N1ID0gY3VycmVudENvbXBvbmVudC5zaG91bGRDb21wb25lbnRVcGRhdGU7XG5cdFx0XHRjb25zdCBwcmV2Q1dVID0gY3VycmVudENvbXBvbmVudC5jb21wb25lbnRXaWxsVXBkYXRlO1xuXG5cdFx0XHQvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBmb3JjZWQgdXBkYXRlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgIHdpbGxcblx0XHRcdC8vIG5vdCBiZSBjYWxsZWQuIEJ1dCB3ZSB1c2UgdGhhdCB0byB1cGRhdGUgdGhlIGhvb2sgdmFsdWVzLCBzbyB3ZVxuXHRcdFx0Ly8gbmVlZCB0byBjYWxsIGl0LlxuXHRcdFx0Y3VycmVudENvbXBvbmVudC5jb21wb25lbnRXaWxsVXBkYXRlID0gZnVuY3Rpb24gKHAsIHMsIGMpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2ZvcmNlKSB7XG5cdFx0XHRcdFx0bGV0IHRtcCA9IHByZXZTY3U7XG5cdFx0XHRcdFx0Ly8gQ2xlYXIgdG8gYXZvaWQgb3RoZXIgc0NVIGhvb2tzIGZyb20gYmVpbmcgY2FsbGVkXG5cdFx0XHRcdFx0cHJldlNjdSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHR1cGRhdGVIb29rU3RhdGUocCwgcywgYyk7XG5cdFx0XHRcdFx0cHJldlNjdSA9IHRtcDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChwcmV2Q1dVKSBwcmV2Q1dVLmNhbGwodGhpcywgcCwgcywgYyk7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBUaGlzIFNDVSBoYXMgdGhlIHB1cnBvc2Ugb2YgYmFpbGluZyBvdXQgYWZ0ZXIgcmVwZWF0ZWQgdXBkYXRlc1xuXHRcdFx0Ly8gdG8gc3RhdGVmdWwgaG9va3MuXG5cdFx0XHQvLyB3ZSBzdG9yZSB0aGUgbmV4dCB2YWx1ZSBpbiBfbmV4dFZhbHVlWzBdIGFuZCBrZWVwIGRvaW5nIHRoYXQgZm9yIGFsbFxuXHRcdFx0Ly8gc3RhdGUgc2V0dGVycywgaWYgd2UgaGF2ZSBuZXh0IHN0YXRlcyBhbmRcblx0XHRcdC8vIGFsbCBuZXh0IHN0YXRlcyB3aXRoaW4gYSBjb21wb25lbnQgZW5kIHVwIGJlaW5nIGVxdWFsIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlXG5cdFx0XHQvLyB3ZSBhcmUgc2FmZSB0byBiYWlsIG91dCBmb3IgdGhpcyBzcGVjaWZpYyBjb21wb25lbnQuXG5cdFx0XHQvKipcblx0XHRcdCAqXG5cdFx0XHQgKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50W1wic2hvdWxkQ29tcG9uZW50VXBkYXRlXCJdfVxuXHRcdFx0ICovXG5cdFx0XHQvLyBAdHMtaWdub3JlIC0gV2UgZG9uJ3QgdXNlIFRTIHRvIGRvd250cmFuc3BpbGVcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbm5lci1kZWNsYXJhdGlvbnNcblx0XHRcdGZ1bmN0aW9uIHVwZGF0ZUhvb2tTdGF0ZShwLCBzLCBjKSB7XG5cdFx0XHRcdGlmICghaG9va1N0YXRlLl9jb21wb25lbnQuX19ob29rcykgcmV0dXJuIHRydWU7XG5cblx0XHRcdFx0Ly8gV2UgY2hlY2sgd2hldGhlciB3ZSBoYXZlIGNvbXBvbmVudHMgd2l0aCBhIG5leHRWYWx1ZSBzZXQgdGhhdFxuXHRcdFx0XHQvLyBoYXZlIHZhbHVlcyB0aGF0IGFyZW4ndCBlcXVhbCB0byBvbmUgYW5vdGhlciB0aGlzIHB1c2hlc1xuXHRcdFx0XHQvLyB1cyB0byB1cGRhdGUgZnVydGhlciBkb3duIHRoZSB0cmVlXG5cdFx0XHRcdGxldCB1cGRhdGVkSG9vayA9IGZhbHNlO1xuXHRcdFx0XHRsZXQgc2hvdWxkVXBkYXRlID0gaG9va1N0YXRlLl9jb21wb25lbnQucHJvcHMgIT09IHA7XG5cdFx0XHRcdGhvb2tTdGF0ZS5fY29tcG9uZW50Ll9faG9va3MuX2xpc3Quc29tZShob29rSXRlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKGhvb2tJdGVtLl9uZXh0VmFsdWUpIHtcblx0XHRcdFx0XHRcdHVwZGF0ZWRIb29rID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGhvb2tJdGVtLl92YWx1ZVswXTtcblx0XHRcdFx0XHRcdGhvb2tJdGVtLl92YWx1ZSA9IGhvb2tJdGVtLl9uZXh0VmFsdWU7XG5cdFx0XHRcdFx0XHRob29rSXRlbS5fbmV4dFZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSAhPT0gaG9va0l0ZW0uX3ZhbHVlWzBdKSBzaG91bGRVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHByZXZTY3UpIHtcblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSBwcmV2U2N1LmNhbGwodGhpcywgcCwgcywgYyk7XG5cdFx0XHRcdFx0cmV0dXJuIHVwZGF0ZWRIb29rID8gcmVzdWx0IHx8IHNob3VsZFVwZGF0ZSA6IHJlc3VsdDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAhdXBkYXRlZEhvb2sgfHwgc2hvdWxkVXBkYXRlO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50Q29tcG9uZW50LnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IHVwZGF0ZUhvb2tTdGF0ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaG9va1N0YXRlLl9uZXh0VmFsdWUgfHwgaG9va1N0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdH0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBhcmdzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUVmZmVjdChjYWxsYmFjaywgYXJncykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gKi9cblx0Y29uc3Qgc3RhdGUgPSBnZXRIb29rU3RhdGUoY3VycmVudEluZGV4KyssIDMpO1xuXHRpZiAoIW9wdGlvbnMuX3NraXBFZmZlY3RzICYmIGFyZ3NDaGFuZ2VkKHN0YXRlLl9hcmdzLCBhcmdzKSkge1xuXHRcdHN0YXRlLl92YWx1ZSA9IGNhbGxiYWNrO1xuXHRcdHN0YXRlLl9wZW5kaW5nQXJncyA9IGFyZ3M7XG5cblx0XHRjdXJyZW50Q29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3R9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gYXJnc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY2FsbGJhY2ssIGFyZ3MpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA0KTtcblx0aWYgKCFvcHRpb25zLl9za2lwRWZmZWN0cyAmJiBhcmdzQ2hhbmdlZChzdGF0ZS5fYXJncywgYXJncykpIHtcblx0XHRzdGF0ZS5fdmFsdWUgPSBjYWxsYmFjaztcblx0XHRzdGF0ZS5fcGVuZGluZ0FyZ3MgPSBhcmdzO1xuXG5cdFx0Y3VycmVudENvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbi8qKiBAdHlwZSB7KGluaXRpYWxWYWx1ZTogdW5rbm93bikgPT4gdW5rbm93bn0gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG5cdGN1cnJlbnRIb29rID0gNTtcblx0cmV0dXJuIHVzZU1lbW8oKCkgPT4gKHsgY3VycmVudDogaW5pdGlhbFZhbHVlIH0pLCBbXSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHJlZlxuICogQHBhcmFtIHsoKSA9PiBvYmplY3R9IGNyZWF0ZUhhbmRsZVxuICogQHBhcmFtIHt1bmtub3duW119IGFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZUhhbmRsZSwgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDY7XG5cdHVzZUxheW91dEVmZmVjdChcblx0XHQoKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHJlZiA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IHJlZihjcmVhdGVIYW5kbGUoKSk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0cmVmKG51bGwpO1xuXHRcdFx0XHRcdGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PSAnZnVuY3Rpb24nKSByZXN1bHQoKTtcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSBpZiAocmVmKSB7XG5cdFx0XHRcdHJlZi5jdXJyZW50ID0gY3JlYXRlSGFuZGxlKCk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiAocmVmLmN1cnJlbnQgPSBudWxsKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFyZ3MgPT0gbnVsbCA/IGFyZ3MgOiBhcmdzLmNvbmNhdChyZWYpXG5cdCk7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIHt1bmtub3dufSBUXG4gKiBAcGFyYW0geygpID0+IFR9IGZhY3RvcnlcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBhcmdzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1lbW8oZmFjdG9yeSwgYXJncykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLk1lbW9Ib29rU3RhdGU8VD59ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA3KTtcblx0aWYgKGFyZ3NDaGFuZ2VkKHN0YXRlLl9hcmdzLCBhcmdzKSkge1xuXHRcdHN0YXRlLl92YWx1ZSA9IGZhY3RvcnkoKTtcblx0XHRzdGF0ZS5fYXJncyA9IGFyZ3M7XG5cdFx0c3RhdGUuX2ZhY3RvcnkgPSBmYWN0b3J5O1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gYXJnc1xuICogQHJldHVybnMgeygpID0+IHZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDg7XG5cdHJldHVybiB1c2VNZW1vKCgpID0+IGNhbGxiYWNrLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlByZWFjdENvbnRleHR9IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRleHQoY29udGV4dCkge1xuXHRjb25zdCBwcm92aWRlciA9IGN1cnJlbnRDb21wb25lbnQuY29udGV4dFtjb250ZXh0Ll9pZF07XG5cdC8vIFdlIGNvdWxkIHNraXAgdGhpcyBjYWxsIGhlcmUsIGJ1dCB0aGFuIHdlJ2Qgbm90IGNhbGxcblx0Ly8gYG9wdGlvbnMuX2hvb2tgLiBXZSBuZWVkIHRvIGRvIHRoYXQgaW4gb3JkZXIgdG8gbWFrZVxuXHQvLyB0aGUgZGV2dG9vbHMgYXdhcmUgb2YgdGhpcyBob29rLlxuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbnRleHRIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA5KTtcblx0Ly8gVGhlIGRldnRvb2xzIG5lZWRzIGFjY2VzcyB0byB0aGUgY29udGV4dCBvYmplY3QgdG9cblx0Ly8gYmUgYWJsZSB0byBwdWxsIG9mIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvdmlkZXJcblx0Ly8gaXMgcHJlc2VudCBpbiB0aGUgdHJlZS5cblx0c3RhdGUuX2NvbnRleHQgPSBjb250ZXh0O1xuXHRpZiAoIXByb3ZpZGVyKSByZXR1cm4gY29udGV4dC5fZGVmYXVsdFZhbHVlO1xuXHQvLyBUaGlzIGlzIHByb2JhYmx5IG5vdCBzYWZlIHRvIGNvbnZlcnQgdG8gXCIhXCJcblx0aWYgKHN0YXRlLl92YWx1ZSA9PSBudWxsKSB7XG5cdFx0c3RhdGUuX3ZhbHVlID0gdHJ1ZTtcblx0XHRwcm92aWRlci5zdWIoY3VycmVudENvbXBvbmVudCk7XG5cdH1cblx0cmV0dXJuIHByb3ZpZGVyLnByb3BzLnZhbHVlO1xufVxuXG4vKipcbiAqIERpc3BsYXkgYSBjdXN0b20gbGFiZWwgZm9yIGEgY3VzdG9tIGhvb2sgZm9yIHRoZSBkZXZ0b29scyBwYW5lbFxuICogQHR5cGUgezxUPih2YWx1ZTogVCwgY2I/OiAodmFsdWU6IFQpID0+IHN0cmluZyB8IG51bWJlcikgPT4gdm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlcikge1xuXHRpZiAob3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKSB7XG5cdFx0b3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKFxuXHRcdFx0Zm9ybWF0dGVyID8gZm9ybWF0dGVyKHZhbHVlKSA6IC8qKiBAdHlwZSB7YW55fSovICh2YWx1ZSlcblx0XHQpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHsoZXJyb3I6IHVua25vd24sIGVycm9ySW5mbzogaW1wb3J0KCdwcmVhY3QnKS5FcnJvckluZm8pID0+IHZvaWR9IGNiXG4gKiBAcmV0dXJucyB7W3Vua25vd24sICgpID0+IHZvaWRdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRXJyb3JCb3VuZGFyeShjYikge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVycm9yQm91bmRhcnlIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCAxMCk7XG5cdGNvbnN0IGVyclN0YXRlID0gdXNlU3RhdGUoKTtcblx0c3RhdGUuX3ZhbHVlID0gY2I7XG5cdGlmICghY3VycmVudENvbXBvbmVudC5jb21wb25lbnREaWRDYXRjaCkge1xuXHRcdGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2ggPSAoZXJyLCBlcnJvckluZm8pID0+IHtcblx0XHRcdGlmIChzdGF0ZS5fdmFsdWUpIHN0YXRlLl92YWx1ZShlcnIsIGVycm9ySW5mbyk7XG5cdFx0XHRlcnJTdGF0ZVsxXShlcnIpO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIFtcblx0XHRlcnJTdGF0ZVswXSxcblx0XHQoKSA9PiB7XG5cdFx0XHRlcnJTdGF0ZVsxXSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XTtcbn1cblxuLyoqIEB0eXBlIHsoKSA9PiBzdHJpbmd9ICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSWQoKSB7XG5cdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuSWRIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCAxMSk7XG5cdGlmICghc3RhdGUuX3ZhbHVlKSB7XG5cdFx0Ly8gR3JhYiBlaXRoZXIgdGhlIHJvb3Qgbm9kZSBvciB0aGUgbmVhcmVzdCBhc3luYyBib3VuZGFyeSBub2RlLlxuXHRcdC8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuVk5vZGV9ICovXG5cdFx0bGV0IHJvb3QgPSBjdXJyZW50Q29tcG9uZW50Ll92bm9kZTtcblx0XHR3aGlsZSAocm9vdCAhPT0gbnVsbCAmJiAhcm9vdC5fbWFzayAmJiByb290Ll9wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdHJvb3QgPSByb290Ll9wYXJlbnQ7XG5cdFx0fVxuXG5cdFx0bGV0IG1hc2sgPSByb290Ll9tYXNrIHx8IChyb290Ll9tYXNrID0gWzAsIDBdKTtcblx0XHRzdGF0ZS5fdmFsdWUgPSAnUCcgKyBtYXNrWzBdICsgJy0nICsgbWFza1sxXSsrO1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBBZnRlciBwYWludCBlZmZlY3RzIGNvbnN1bWVyLlxuICovXG5mdW5jdGlvbiBmbHVzaEFmdGVyUGFpbnRFZmZlY3RzKCkge1xuXHRsZXQgY29tcG9uZW50O1xuXHR3aGlsZSAoKGNvbXBvbmVudCA9IGFmdGVyUGFpbnRFZmZlY3RzLnNoaWZ0KCkpKSB7XG5cdFx0Y29uc3QgaG9va3MgPSBjb21wb25lbnQuX19ob29rcztcblx0XHRpZiAoIWNvbXBvbmVudC5fcGFyZW50RG9tIHx8ICFob29rcykgY29udGludWU7XG5cdFx0dHJ5IHtcblx0XHRcdGhvb2tzLl9wZW5kaW5nRWZmZWN0cy5zb21lKGludm9rZUNsZWFudXApO1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzLnNvbWUoaW52b2tlRWZmZWN0KTtcblx0XHRcdGhvb2tzLl9wZW5kaW5nRWZmZWN0cyA9IFtdO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGhvb2tzLl9wZW5kaW5nRWZmZWN0cyA9IFtdO1xuXHRcdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBjb21wb25lbnQuX3Zub2RlKTtcblx0XHR9XG5cdH1cbn1cblxubGV0IEhBU19SQUYgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09ICdmdW5jdGlvbic7XG5cbi8qKlxuICogU2NoZWR1bGUgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIGFmdGVyIHRoZSBicm93c2VyIGhhcyBhIGNoYW5jZSB0byBwYWludCBhIG5ldyBmcmFtZS5cbiAqIERvIHRoaXMgYnkgY29tYmluaW5nIHJlcXVlc3RBbmltYXRpb25GcmFtZSAockFGKSArIHNldFRpbWVvdXQgdG8gaW52b2tlIGEgY2FsbGJhY2sgYWZ0ZXJcbiAqIHRoZSBuZXh0IGJyb3dzZXIgZnJhbWUuXG4gKlxuICogQWxzbywgc2NoZWR1bGUgYSB0aW1lb3V0IGluIHBhcmFsbGVsIHRvIHRoZSB0aGUgckFGIHRvIGVuc3VyZSB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZFxuICogZXZlbiBpZiBSQUYgZG9lc24ndCBmaXJlIChmb3IgZXhhbXBsZSBpZiB0aGUgYnJvd3NlciB0YWIgaXMgbm90IHZpc2libGUpXG4gKlxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjYWxsYmFja1xuICovXG5mdW5jdGlvbiBhZnRlck5leHRGcmFtZShjYWxsYmFjaykge1xuXHRjb25zdCBkb25lID0gKCkgPT4ge1xuXHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRpZiAoSEFTX1JBRikgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcblx0XHRzZXRUaW1lb3V0KGNhbGxiYWNrKTtcblx0fTtcblx0Y29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoZG9uZSwgUkFGX1RJTUVPVVQpO1xuXG5cdGxldCByYWY7XG5cdGlmIChIQVNfUkFGKSB7XG5cdFx0cmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRvbmUpO1xuXHR9XG59XG5cbi8vIE5vdGU6IGlmIHNvbWVvbmUgdXNlZCBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLFxuLy8gdGhlbiBlZmZlY3RzIHdpbGwgQUxXQVlTIHJ1biBvbiB0aGUgTkVYVCBmcmFtZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IG9uZSwgaW5jdXJyaW5nIGEgfjE2bXMgZGVsYXkuXG4vLyBQZXJoYXBzIHRoaXMgaXMgbm90IHN1Y2ggYSBiaWcgZGVhbC5cbi8qKlxuICogU2NoZWR1bGUgYWZ0ZXJQYWludEVmZmVjdHMgZmx1c2ggYWZ0ZXIgdGhlIGJyb3dzZXIgcGFpbnRzXG4gKiBAcGFyYW0ge251bWJlcn0gbmV3UXVldWVMZW5ndGhcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhZnRlclBhaW50KG5ld1F1ZXVlTGVuZ3RoKSB7XG5cdGlmIChuZXdRdWV1ZUxlbmd0aCA9PT0gMSB8fCBwcmV2UmFmICE9PSBvcHRpb25zLnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuXHRcdHByZXZSYWYgPSBvcHRpb25zLnJlcXVlc3RBbmltYXRpb25GcmFtZTtcblx0XHQocHJldlJhZiB8fCBhZnRlck5leHRGcmFtZSkoZmx1c2hBZnRlclBhaW50RWZmZWN0cyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkhvb2tTdGF0ZX0gaG9va1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGludm9rZUNsZWFudXAoaG9vaykge1xuXHQvLyBBIGhvb2sgY2xlYW51cCBjYW4gaW50cm9kdWNlIGEgY2FsbCB0byByZW5kZXIgd2hpY2ggY3JlYXRlcyBhIG5ldyByb290LCB0aGlzIHdpbGwgY2FsbCBvcHRpb25zLnZub2RlXG5cdC8vIGFuZCBtb3ZlIHRoZSBjdXJyZW50Q29tcG9uZW50IGF3YXkuXG5cdGNvbnN0IGNvbXAgPSBjdXJyZW50Q29tcG9uZW50O1xuXHRsZXQgY2xlYW51cCA9IGhvb2suX2NsZWFudXA7XG5cdGlmICh0eXBlb2YgY2xlYW51cCA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0aG9vay5fY2xlYW51cCA9IHVuZGVmaW5lZDtcblx0XHRjbGVhbnVwKCk7XG5cdH1cblxuXHRjdXJyZW50Q29tcG9uZW50ID0gY29tcDtcbn1cblxuLyoqXG4gKiBJbnZva2UgYSBIb29rJ3MgZWZmZWN0XG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gaG9va1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGludm9rZUVmZmVjdChob29rKSB7XG5cdC8vIEEgaG9vayBjYWxsIGNhbiBpbnRyb2R1Y2UgYSBjYWxsIHRvIHJlbmRlciB3aGljaCBjcmVhdGVzIGEgbmV3IHJvb3QsIHRoaXMgd2lsbCBjYWxsIG9wdGlvbnMudm5vZGVcblx0Ly8gYW5kIG1vdmUgdGhlIGN1cnJlbnRDb21wb25lbnQgYXdheS5cblx0Y29uc3QgY29tcCA9IGN1cnJlbnRDb21wb25lbnQ7XG5cdGhvb2suX2NsZWFudXAgPSBob29rLl92YWx1ZSgpO1xuXHRjdXJyZW50Q29tcG9uZW50ID0gY29tcDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gb2xkQXJnc1xuICogQHBhcmFtIHt1bmtub3duW119IG5ld0FyZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBhcmdzQ2hhbmdlZChvbGRBcmdzLCBuZXdBcmdzKSB7XG5cdHJldHVybiAoXG5cdFx0IW9sZEFyZ3MgfHxcblx0XHRvbGRBcmdzLmxlbmd0aCAhPT0gbmV3QXJncy5sZW5ndGggfHxcblx0XHRuZXdBcmdzLnNvbWUoKGFyZywgaW5kZXgpID0+IGFyZyAhPT0gb2xkQXJnc1tpbmRleF0pXG5cdCk7XG59XG5cbi8qKlxuICogQHRlbXBsYXRlIEFyZ1xuICogQHBhcmFtIHtBcmd9IGFyZ1xuICogQHBhcmFtIHsoYXJnOiBBcmcpID0+IGFueX0gZlxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gaW52b2tlT3JSZXR1cm4oYXJnLCBmKSB7XG5cdHJldHVybiB0eXBlb2YgZiA9PSAnZnVuY3Rpb24nID8gZihhcmcpIDogZjtcbn1cbiIsICJjb25zdCBFTkNPREVEX0VOVElUSUVTID0gL1tcIiY8XS87XG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gc3RyICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlRW50aXRpZXMoc3RyKSB7XG5cdC8vIFNraXAgYWxsIHdvcmsgZm9yIHN0cmluZ3Mgd2l0aCBubyBlbnRpdGllcyBuZWVkaW5nIGVuY29kaW5nOlxuXHRpZiAoc3RyLmxlbmd0aCA9PT0gMCB8fCBFTkNPREVEX0VOVElUSUVTLnRlc3Qoc3RyKSA9PT0gZmFsc2UpIHJldHVybiBzdHI7XG5cblx0bGV0IGxhc3QgPSAwLFxuXHRcdGkgPSAwLFxuXHRcdG91dCA9ICcnLFxuXHRcdGNoID0gJyc7XG5cblx0Ly8gU2VlayBmb3J3YXJkIGluIHN0ciB1bnRpbCB0aGUgbmV4dCBlbnRpdHkgY2hhcjpcblx0Zm9yICg7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRzd2l0Y2ggKHN0ci5jaGFyQ29kZUF0KGkpKSB7XG5cdFx0XHRjYXNlIDM0OlxuXHRcdFx0XHRjaCA9ICcmcXVvdDsnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMzg6XG5cdFx0XHRcdGNoID0gJyZhbXA7Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDYwOlxuXHRcdFx0XHRjaCA9ICcmbHQ7Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0Ly8gQXBwZW5kIHNraXBwZWQvYnVmZmVyZWQgY2hhcmFjdGVycyBhbmQgdGhlIGVuY29kZWQgZW50aXR5OlxuXHRcdGlmIChpICE9PSBsYXN0KSBvdXQgKz0gc3RyLnNsaWNlKGxhc3QsIGkpO1xuXHRcdG91dCArPSBjaDtcblx0XHQvLyBTdGFydCB0aGUgbmV4dCBzZWVrL2J1ZmZlciBhZnRlciB0aGUgZW50aXR5J3Mgb2Zmc2V0OlxuXHRcdGxhc3QgPSBpICsgMTtcblx0fVxuXHRpZiAoaSAhPT0gbGFzdCkgb3V0ICs9IHN0ci5zbGljZShsYXN0LCBpKTtcblx0cmV0dXJuIG91dDtcbn1cbiIsICIvKiogTm9ybWFsIGh5ZHJhdGlvbiB0aGF0IGF0dGFjaGVzIHRvIGEgRE9NIHRyZWUgYnV0IGRvZXMgbm90IGRpZmYgaXQuICovXG5leHBvcnQgY29uc3QgTU9ERV9IWURSQVRFID0gMSA8PCA1O1xuLyoqIFNpZ25pZmllcyB0aGlzIFZOb2RlIHN1c3BlbmRlZCBvbiB0aGUgcHJldmlvdXMgcmVuZGVyICovXG5leHBvcnQgY29uc3QgTU9ERV9TVVNQRU5ERUQgPSAxIDw8IDc7XG4vKiogSW5kaWNhdGVzIHRoYXQgdGhpcyBub2RlIG5lZWRzIHRvIGJlIGluc2VydGVkIHdoaWxlIHBhdGNoaW5nIGNoaWxkcmVuICovXG5leHBvcnQgY29uc3QgSU5TRVJUX1ZOT0RFID0gMSA8PCAyO1xuLyoqIEluZGljYXRlcyBhIFZOb2RlIGhhcyBiZWVuIG1hdGNoZWQgd2l0aCBhbm90aGVyIFZOb2RlIGluIHRoZSBkaWZmICovXG5leHBvcnQgY29uc3QgTUFUQ0hFRCA9IDEgPDwgMTtcblxuLyoqIFJlc2V0IGFsbCBtb2RlIGZsYWdzICovXG5leHBvcnQgY29uc3QgUkVTRVRfTU9ERSA9IH4oTU9ERV9IWURSQVRFIHwgTU9ERV9TVVNQRU5ERUQpO1xuXG5leHBvcnQgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5leHBvcnQgY29uc3QgWEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xuZXhwb3J0IGNvbnN0IE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuXG5leHBvcnQgY29uc3QgTlVMTCA9IG51bGw7XG5leHBvcnQgY29uc3QgVU5ERUZJTkVEID0gdW5kZWZpbmVkO1xuZXhwb3J0IGNvbnN0IEVNUFRZX09CSiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoe30pO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSUiA9IFtdO1xuZXhwb3J0IGNvbnN0IElTX05PTl9ESU1FTlNJT05BTCA9XG5cdC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7XG4iLCAiaW1wb3J0IHsgb3B0aW9ucywgRnJhZ21lbnQgfSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHsgZW5jb2RlRW50aXRpZXMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IElTX05PTl9ESU1FTlNJT05BTCB9IGZyb20gJy4uLy4uL3NyYy9jb25zdGFudHMnO1xuXG5sZXQgdm5vZGVJZCA9IDA7XG5cbmNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIFRoaXMgZmlsZSBleHBvcnRzIHZhcmlvdXMgbWV0aG9kcyB0aGF0IGltcGxlbWVudCBCYWJlbCdzIFwiYXV0b21hdGljXCIgSlNYIHJ1bnRpbWUgQVBJOlxuICogLSBqc3godHlwZSwgcHJvcHMsIGtleSlcbiAqIC0ganN4cyh0eXBlLCBwcm9wcywga2V5KVxuICogLSBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgX19zb3VyY2UsIF9fc2VsZilcbiAqXG4gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgY3JlYXRlVk5vZGUgaGVyZSBpcyBvcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlLlxuICogQmVuY2htYXJrczogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81ZjZiNTRhMGI0NjMyMTAwYTdkY2QyYjNcbiAqL1xuXG4vKipcbiAqIEpTWC5FbGVtZW50IGZhY3RvcnkgdXNlZCBieSBCYWJlbCdzIHtydW50aW1lOlwiYXV0b21hdGljXCJ9IEpTWCB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7Vk5vZGVbJ3R5cGUnXX0gdHlwZVxuICogQHBhcmFtIHtWTm9kZVsncHJvcHMnXX0gcHJvcHNcbiAqIEBwYXJhbSB7Vk5vZGVbJ2tleSddfSBba2V5XVxuICogQHBhcmFtIHt1bmtub3dufSBbaXNTdGF0aWNDaGlsZHJlbl1cbiAqIEBwYXJhbSB7dW5rbm93bn0gW19fc291cmNlXVxuICogQHBhcmFtIHt1bmtub3dufSBbX19zZWxmXVxuICovXG5mdW5jdGlvbiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wcywga2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBfX3NvdXJjZSwgX19zZWxmKSB7XG5cdGlmICghcHJvcHMpIHByb3BzID0ge307XG5cdC8vIFdlJ2xsIHdhbnQgdG8gcHJlc2VydmUgYHJlZmAgaW4gcHJvcHMgdG8gZ2V0IHJpZCBvZiB0aGUgbmVlZCBmb3Jcblx0Ly8gZm9yd2FyZFJlZiBjb21wb25lbnRzIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IHNob3VsZCBoYXBwZW4gdmlhXG5cdC8vIGEgc2VwYXJhdGUgUFIuXG5cdGxldCBub3JtYWxpemVkUHJvcHMgPSBwcm9wcyxcblx0XHRyZWYsXG5cdFx0aTtcblxuXHRpZiAoJ3JlZicgaW4gbm9ybWFsaXplZFByb3BzKSB7XG5cdFx0bm9ybWFsaXplZFByb3BzID0ge307XG5cdFx0Zm9yIChpIGluIHByb3BzKSB7XG5cdFx0XHRpZiAoaSA9PSAncmVmJykge1xuXHRcdFx0XHRyZWYgPSBwcm9wc1tpXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHByb3BzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKiBAdHlwZSB7Vk5vZGUgJiB7IF9fc291cmNlOiBhbnk7IF9fc2VsZjogYW55IH19ICovXG5cdGNvbnN0IHZub2RlID0ge1xuXHRcdHR5cGUsXG5cdFx0cHJvcHM6IG5vcm1hbGl6ZWRQcm9wcyxcblx0XHRrZXksXG5cdFx0cmVmLFxuXHRcdF9jaGlsZHJlbjogbnVsbCxcblx0XHRfcGFyZW50OiBudWxsLFxuXHRcdF9kZXB0aDogMCxcblx0XHRfZG9tOiBudWxsLFxuXHRcdF9jb21wb25lbnQ6IG51bGwsXG5cdFx0Y29uc3RydWN0b3I6IHVuZGVmaW5lZCxcblx0XHRfb3JpZ2luYWw6IC0tdm5vZGVJZCxcblx0XHRfaW5kZXg6IC0xLFxuXHRcdF9mbGFnczogMCxcblx0XHRfX3NvdXJjZSxcblx0XHRfX3NlbGZcblx0fTtcblxuXHQvLyBJZiBhIENvbXBvbmVudCBWTm9kZSwgY2hlY2sgZm9yIGFuZCBhcHBseSBkZWZhdWx0UHJvcHMuXG5cdC8vIE5vdGU6IGB0eXBlYCBpcyBvZnRlbiBhIFN0cmluZywgYW5kIGNhbiBiZSBgdW5kZWZpbmVkYCBpbiBkZXZlbG9wbWVudC5cblx0aWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmIChyZWYgPSB0eXBlLmRlZmF1bHRQcm9wcykpIHtcblx0XHRmb3IgKGkgaW4gcmVmKVxuXHRcdFx0aWYgKG5vcm1hbGl6ZWRQcm9wc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHJlZltpXTtcblx0XHRcdH1cblx0fVxuXG5cdGlmIChvcHRpb25zLnZub2RlKSBvcHRpb25zLnZub2RlKHZub2RlKTtcblx0cmV0dXJuIHZub2RlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHRlbXBsYXRlIHZub2RlLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBlY3RlZCB0byBiZVxuICogdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGEgcHJlY29tcGlsZSBKU1ggdHJhbnNmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB0ZW1wbGF0ZXNcbiAqIEBwYXJhbSAge0FycmF5PHN0cmluZyB8IG51bGwgfCBWTm9kZT59IGV4cHJzXG4gKiBAcmV0dXJucyB7Vk5vZGV9XG4gKi9cbmZ1bmN0aW9uIGpzeFRlbXBsYXRlKHRlbXBsYXRlcywgLi4uZXhwcnMpIHtcblx0Y29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShGcmFnbWVudCwgeyB0cGw6IHRlbXBsYXRlcywgZXhwcnMgfSk7XG5cdC8vIEJ5cGFzcyByZW5kZXIgdG8gc3RyaW5nIHRvcCBsZXZlbCBGcmFnbWVudCBvcHRpbWl6YXRpb25cblx0dm5vZGUua2V5ID0gdm5vZGUuX3Zub2RlO1xuXHRyZXR1cm4gdm5vZGU7XG59XG5cbmNvbnN0IEpTX1RPX0NTUyA9IHt9O1xuY29uc3QgQ1NTX1JFR0VYID0gL1tBLVpdL2c7XG5cbi8qKlxuICogVW53cmFwIHBvdGVudGlhbCBzaWduYWxzLlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF0dHJWYWx1ZSh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgIT09IG51bGwgJiZcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG5cdFx0dHlwZW9mIHZhbHVlLnZhbHVlT2YgPT09ICdmdW5jdGlvbidcblx0XHQ/IHZhbHVlLnZhbHVlT2YoKVxuXHRcdDogdmFsdWU7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGFuIEhUTUwgYXR0cmlidXRlIHRvIGEgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdFxuICogZXhwZWN0ZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGEgcHJlY29tcGlsZVxuICogSlNYIHRyYW5zZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGpzeEF0dHIobmFtZSwgdmFsdWUpIHtcblx0aWYgKG9wdGlvbnMuYXR0cikge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMuYXR0cihuYW1lLCB2YWx1ZSk7XG5cdFx0aWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0dmFsdWUgPSBub3JtYWxpemVBdHRyVmFsdWUodmFsdWUpO1xuXG5cdGlmIChuYW1lID09PSAncmVmJyB8fCBuYW1lID09PSAna2V5JykgcmV0dXJuICcnO1xuXHRpZiAobmFtZSA9PT0gJ3N0eWxlJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG5cdFx0bGV0IHN0ciA9ICcnO1xuXHRcdGZvciAobGV0IHByb3AgaW4gdmFsdWUpIHtcblx0XHRcdGxldCB2YWwgPSB2YWx1ZVtwcm9wXTtcblx0XHRcdGlmICh2YWwgIT0gbnVsbCAmJiB2YWwgIT09ICcnKSB7XG5cdFx0XHRcdGNvbnN0IG5hbWUgPVxuXHRcdFx0XHRcdHByb3BbMF0gPT0gJy0nXG5cdFx0XHRcdFx0XHQ/IHByb3Bcblx0XHRcdFx0XHRcdDogSlNfVE9fQ1NTW3Byb3BdIHx8XG5cdFx0XHRcdFx0XHRcdChKU19UT19DU1NbcHJvcF0gPSBwcm9wLnJlcGxhY2UoQ1NTX1JFR0VYLCAnLSQmJykudG9Mb3dlckNhc2UoKSk7XG5cblx0XHRcdFx0bGV0IHN1ZmZpeCA9ICc7Jztcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmXG5cdFx0XHRcdFx0Ly8gRXhjbHVkZSBjdXN0b20tYXR0cmlidXRlc1xuXHRcdFx0XHRcdCFuYW1lLnN0YXJ0c1dpdGgoJy0tJykgJiZcblx0XHRcdFx0XHQhSVNfTk9OX0RJTUVOU0lPTkFMLnRlc3QobmFtZSlcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0c3VmZml4ID0gJ3B4Oyc7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RyID0gc3RyICsgbmFtZSArICc6JyArIHZhbCArIHN1ZmZpeDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG5hbWUgKyAnPVwiJyArIGVuY29kZUVudGl0aWVzKHN0cikgKyAnXCInO1xuXHR9XG5cblx0aWYgKFxuXHRcdHZhbHVlID09IG51bGwgfHxcblx0XHR2YWx1ZSA9PT0gZmFsc2UgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG5cdCkge1xuXHRcdHJldHVybiAnJztcblx0fSBlbHNlIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIG5hbWU7XG5cblx0cmV0dXJuIG5hbWUgKyAnPVwiJyArIGVuY29kZUVudGl0aWVzKCcnICsgdmFsdWUpICsgJ1wiJztcbn1cblxuLyoqXG4gKiBFc2NhcGUgYSBkeW5hbWljIGNoaWxkIHBhc3NlZCB0byBganN4VGVtcGxhdGVgLiBUaGlzIGZ1bmN0aW9uXG4gKiBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGFcbiAqIHByZWNvbXBpbGUgSlNYIHRyYW5zZm9ybVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZyB8IG51bGwgfCBWTm9kZSB8IEFycmF5PHN0cmluZyB8IG51bGwgfCBWTm9kZT59XG4gKi9cbmZ1bmN0aW9uIGpzeEVzY2FwZSh2YWx1ZSkge1xuXHRpZiAoXG5cdFx0dmFsdWUgPT0gbnVsbCB8fFxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8XG5cdFx0dHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nXG5cdCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcblx0XHQvLyBDaGVjayBmb3IgVk5vZGVcblx0XHRpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0aWYgKGlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhbHVlW2ldID0ganN4RXNjYXBlKHZhbHVlW2ldKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZW5jb2RlRW50aXRpZXMoJycgKyB2YWx1ZSk7XG59XG5cbmV4cG9ydCB7XG5cdGNyZWF0ZVZOb2RlIGFzIGpzeCxcblx0Y3JlYXRlVk5vZGUgYXMganN4cyxcblx0Y3JlYXRlVk5vZGUgYXMganN4REVWLFxuXHRGcmFnbWVudCxcblx0Ly8gcHJlY29tcGlsZWQgSlNYIHRyYW5zZm9ybVxuXHRqc3hUZW1wbGF0ZSxcblx0anN4QXR0cixcblx0anN4RXNjYXBlXG59O1xuIiwgIi8qKiBAanN4SW1wb3J0U291cmNlIHByZWFjdCAqL1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB0eXBlIHsgSlNYIH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdwcmVhY3QvaG9va3MnO1xuXG5cbnR5cGUgQmVoYXZpb3JUeXBlID0gJ2ltbWVkaWF0ZS1wcmludCcgfCAnYWNjdW11bGF0aW5nLWxpc3QnIHwgJ3JlY3VycmluZy1wcmludCcgfCAnb24tZGVtYW5kJztcblxuaW50ZXJmYWNlIENoYW5uZWxCZWhhdmlvckNvbmZpZyB7XG4gICAgdHlwZTogQmVoYXZpb3JUeXBlO1xuICAgIGhlYWRlcj86IHN0cmluZztcbiAgICBmb290ZXI/OiBzdHJpbmc7XG4gICAgaW5jbHVkZUljb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVNZXRhZGF0YT86IGJvb2xlYW47XG4gICAgaW5jbHVkZUNoZWNrbGlzdD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDaGFubmVsTWFwcGluZyB7XG4gICAgY2hhbm5lbElkOiBzdHJpbmc7XG4gICAgY2hhbm5lbE5hbWU6IHN0cmluZztcbiAgICBjb25maWc6IENoYW5uZWxCZWhhdmlvckNvbmZpZztcbn1cblxuaW50ZXJmYWNlIERpc2NvcmRDaGFubmVsIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIERpYWdub3N0aWNFdmVudCB7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFN0YXR1c0RhdGEge1xuICAgIGNvbm5lY3RlZDogYm9vbGVhbjtcbiAgICB0YWc6IHN0cmluZyB8IG51bGw7XG4gICAgc3RhcnRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICAgIGd1aWxkczogc3RyaW5nW107XG4gICAgY29uZmlndXJlZFNlcnZlcklkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgQ29uZmlnRGF0YSB7XG4gICAgZGlzY29yZFRva2VuOiBzdHJpbmc7XG4gICAgb3BlbmFpS2V5OiBzdHJpbmc7XG4gICAgc2VydmVySWQ6IHN0cmluZyB8IG51bGw7XG4gICAgZGlhZ25vc3RpY3NQb3J0OiBudW1iZXI7XG4gICAgY2hhbm5lbHM6IENoYW5uZWxNYXBwaW5nW107XG4gICAgY29uZmlnUGF0aDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hhbm5lbHNEYXRhIHtcbiAgICBjaGFubmVsczogQ2hhbm5lbE1hcHBpbmdbXTtcbiAgICBkaXNjb3JkQ2hhbm5lbHM6IERpc2NvcmRDaGFubmVsW107XG4gICAgdW5tYXBwZWQ6IERpc2NvcmRDaGFubmVsW107XG59XG5cblxuY29uc3QgUyA9IHtcbiAgICBib3g6IHsgYmFja2dyb3VuZDogJyMxNTE5MjInLCBib3JkZXI6ICcxcHggc29saWQgIzJiMzM0MCcsIGJvcmRlclJhZGl1czogJzEwcHgnLCBwYWRkaW5nOiAnMTZweCcsIG1hcmdpbkJvdHRvbTogJzE2cHgnIH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgaW5wdXQ6IHsgYmFja2dyb3VuZDogJyMwZjExMTUnLCBjb2xvcjogJyNmNWY3ZmEnLCBib3JkZXI6ICcxcHggc29saWQgIzM1NDA1MScsIGJvcmRlclJhZGl1czogJzZweCcsIHBhZGRpbmc6ICc4cHggMTBweCcsIHdpZHRoOiAnMTAwJScsIGJveFNpemluZzogJ2JvcmRlci1ib3gnIGFzIGNvbnN0IH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgYnRuOiB7IGJhY2tncm91bmQ6ICcjMmU3ZGZmJywgY29sb3I6ICcjZmZmJywgYm9yZGVyOiAnbm9uZScsIGJvcmRlclJhZGl1czogJzZweCcsIHBhZGRpbmc6ICc4cHggMTRweCcsIGN1cnNvcjogJ3BvaW50ZXInLCBtYXJnaW5SaWdodDogJzhweCcgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICBidG5EYW5nZXI6IHsgYmFja2dyb3VuZDogJyNjMDM5MmInLCBjb2xvcjogJyNmZmYnLCBib3JkZXI6ICdub25lJywgYm9yZGVyUmFkaXVzOiAnNnB4JywgcGFkZGluZzogJzRweCAxMHB4JywgY3Vyc29yOiAncG9pbnRlcicgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICBsYWJlbDogeyBkaXNwbGF5OiAnYmxvY2snLCBtYXJnaW5Cb3R0b206ICcxMnB4JyB9IGFzIEpTWC5DU1NQcm9wZXJ0aWVzLFxuICAgIGxhYmVsVGV4dDogeyBkaXNwbGF5OiAnYmxvY2snLCBtYXJnaW5Cb3R0b206ICc0cHgnLCBjb2xvcjogJyNiNGJkYzgnIH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgc2VsZWN0OiB7IGJhY2tncm91bmQ6ICcjMGYxMTE1JywgY29sb3I6ICcjZjVmN2ZhJywgYm9yZGVyOiAnMXB4IHNvbGlkICMzNTQwNTEnLCBib3JkZXJSYWRpdXM6ICc2cHgnLCBwYWRkaW5nOiAnOHB4IDEwcHgnIH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgdGg6IHsgdGV4dEFsaWduOiAnbGVmdCcgYXMgY29uc3QsIHBhZGRpbmc6ICc4cHgnLCBib3JkZXJCb3R0b206ICcxcHggc29saWQgIzJiMzM0MCcgfSxcbiAgICB0ZDogeyBwYWRkaW5nOiAnOHB4JywgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICMxYTIwMzAnLCB2ZXJ0aWNhbEFsaWduOiAndG9wJyBhcyBjb25zdCwgd29yZEJyZWFrOiAnYnJlYWstd29yZCcgYXMgY29uc3QgfSxcbiAgICByb3c6IHsgY3Vyc29yOiAncG9pbnRlcicsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICByb3dIb3ZlcjogeyBiYWNrZ3JvdW5kOiAnIzFhMjAzMCcgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICBncmlkMjogeyBkaXNwbGF5OiAnZ3JpZCcsIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICcxZnIgMWZyJywgZ2FwOiAnMTJweCcgfSBhcyBKU1guQ1NTUHJvcGVydGllcyxcbiAgICBncmlkMzogeyBkaXNwbGF5OiAnZ3JpZCcsIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICcxZnIgMWZyIDFmcicsIGdhcDogJzhweCcsIGFsaWduSXRlbXM6ICdlbmQnIH0gYXMgSlNYLkNTU1Byb3BlcnRpZXMsXG4gICAgZXJyOiB7IGNvbG9yOiAnI2ZmODA4MCcsIG1hcmdpbjogJzhweCAwJyB9IGFzIEpTWC5DU1NQcm9wZXJ0aWVzLFxuICAgIG9rOiB7IGNvbG9yOiAnIzhmZjBhNCcsIG1hcmdpbjogJzhweCAwJyB9IGFzIEpTWC5DU1NQcm9wZXJ0aWVzLFxuICAgIG1vbm86IHsgZm9udEZhbWlseTogJ21vbm9zcGFjZScsIGZvbnRTaXplOiAnMC44NWVtJyB9IGFzIEpTWC5DU1NQcm9wZXJ0aWVzLFxufTtcblxuXG5hc3luYyBmdW5jdGlvbiBhcGlGZXRjaDxUPih1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKSBhcyB7IGVycm9yPzogc3RyaW5nIH0gJiBUO1xuICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoanNvbi5lcnJvciA/PyAnUmVxdWVzdCBmYWlsZWQnKTtcbiAgICByZXR1cm4ganNvbjtcbn1cblxuZnVuY3Rpb24ganNvblBvc3Q8VD4odXJsOiBzdHJpbmcsIGJvZHk6IHVua25vd24pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gYXBpRmV0Y2g8VD4odXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGpzb25QdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHk6IHVua25vd24pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gYXBpRmV0Y2g8VD4odXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24ganNvbkRlbGV0ZTxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBhcGlGZXRjaDxUPih1cmwsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbn1cblxuXG5mdW5jdGlvbiBGaWVsZCh7IGxhYmVsLCB0eXBlID0gJ3RleHQnLCB2YWx1ZSwgb25DaGFuZ2UsIHBsYWNlaG9sZGVyIH06IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBvbkNoYW5nZTogKHY6IHN0cmluZykgPT4gdm9pZDtcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcbn0pOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPGxhYmVsIHN0eWxlPXtTLmxhYmVsfT5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPXtTLmxhYmVsVGV4dH0+e2xhYmVsfTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9e3R5cGV9XG4gICAgICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZWhvbGRlciA/PyAnJ31cbiAgICAgICAgICAgICAgICBvbklucHV0PXtlID0+IG9uQ2hhbmdlKChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpfVxuICAgICAgICAgICAgICAgIHN0eWxlPXtTLmlucHV0fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICApO1xufVxuXG5mdW5jdGlvbiBDaGVja0ZpZWxkKHsgbGFiZWwsIGNoZWNrZWQsIG9uQ2hhbmdlIH06IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNoZWNrZWQ6IGJvb2xlYW47XG4gICAgb25DaGFuZ2U6ICh2OiBib29sZWFuKSA9PiB2b2lkO1xufSk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8bGFiZWwgc3R5bGU9e3sgLi4uUy5sYWJlbCwgZGlzcGxheTogJ2ZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJywgZ2FwOiAnOHB4JywgY3Vyc29yOiAncG9pbnRlcicgfX0+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2hlY2tlZD17Y2hlY2tlZH0gb25DaGFuZ2U9e2UgPT4gb25DaGFuZ2UoKGUuY3VycmVudFRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKX0gLz5cbiAgICAgICAgICAgIHtsYWJlbH1cbiAgICAgICAgPC9sYWJlbD5cbiAgICApO1xufVxuXG5cbmZ1bmN0aW9uIEJlaGF2aW9yQ29uZmlnKHsgY29uZmlnLCBvbkNoYW5nZSB9OiB7XG4gICAgY29uZmlnOiBDaGFubmVsQmVoYXZpb3JDb25maWc7XG4gICAgb25DaGFuZ2U6IChjOiBDaGFubmVsQmVoYXZpb3JDb25maWcpID0+IHZvaWQ7XG59KTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IHQgPSBjb25maWcudHlwZTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2IHN0eWxlPXt7IHBhZGRpbmdUb3A6ICcxMnB4JyB9fT5cbiAgICAgICAgICAgIHsodCA9PT0gJ2ltbWVkaWF0ZS1wcmludCcgfHwgdCA9PT0gJ2FjY3VtdWxhdGluZy1saXN0JyB8fCB0ID09PSAncmVjdXJyaW5nLXByaW50JykgJiYgKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJIZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2NvbmZpZy5oZWFkZXIgPz8gJyd9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17diA9PiB7IGNvbnN0IGMgPSB7IC4uLmNvbmZpZyB9OyBpZiAodikgeyBjLmhlYWRlciA9IHY7IH0gZWxzZSB7IGRlbGV0ZSBjLmhlYWRlcjsgfSBvbkNoYW5nZShjKTsgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgaGVhZGVyIHRleHRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRm9vdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtjb25maWcuZm9vdGVyID8/ICcnfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3YgPT4geyBjb25zdCBjID0geyAuLi5jb25maWcgfTsgaWYgKHYpIHsgYy5mb290ZXIgPSB2OyB9IGVsc2UgeyBkZWxldGUgYy5mb290ZXI7IH0gb25DaGFuZ2UoYyk7IH19XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIk9wdGlvbmFsIGZvb3RlciB0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPENoZWNrRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSW5jbHVkZSBtZXRhZGF0YSBmb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y29uZmlnLmluY2x1ZGVNZXRhZGF0YSA/PyBmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt2ID0+IG9uQ2hhbmdlKHsgLi4uY29uZmlnLCBpbmNsdWRlTWV0YWRhdGE6IHYgfSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgeyh0ID09PSAnaW1tZWRpYXRlLXByaW50JyB8fCB0ID09PSAncmVjdXJyaW5nLXByaW50JykgJiYgKFxuICAgICAgICAgICAgICAgIDxDaGVja0ZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiSW5jbHVkZSBBSS1nZW5lcmF0ZWQgaWNvbiAocmVxdWlyZXMgT3BlbkFJIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtjb25maWcuaW5jbHVkZUljb24gPz8gZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt2ID0+IG9uQ2hhbmdlKHsgLi4uY29uZmlnLCBpbmNsdWRlSWNvbjogdiB9KX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHt0ID09PSAnYWNjdW11bGF0aW5nLWxpc3QnICYmIChcbiAgICAgICAgICAgICAgICA8Q2hlY2tGaWVsZFxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkluY2x1ZGUgY2hlY2tsaXN0IGJveGVzXCJcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17Y29uZmlnLmluY2x1ZGVDaGVja2xpc3QgPz8gZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt2ID0+IG9uQ2hhbmdlKHsgLi4uY29uZmlnLCBpbmNsdWRlQ2hlY2tsaXN0OiB2IH0pfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICApO1xufVxuXG5cbmZ1bmN0aW9uIENoYW5uZWxSb3coeyBtYXBwaW5nLCBvbkRlbGV0ZSwgb25VcGRhdGUgfToge1xuICAgIG1hcHBpbmc6IENoYW5uZWxNYXBwaW5nO1xuICAgIG9uRGVsZXRlOiAoKSA9PiB2b2lkO1xuICAgIG9uVXBkYXRlOiAoYzogQ2hhbm5lbEJlaGF2aW9yQ29uZmlnKSA9PiB2b2lkO1xufSk6IEpTWC5FbGVtZW50IHtcbiAgICBjb25zdCBbZXhwYW5kZWQsIHNldEV4cGFuZGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbaG92ZXJlZCwgc2V0SG92ZXJlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICBzdHlsZT17aG92ZXJlZCA/IFMucm93SG92ZXIgOiBTLnJvd31cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRFeHBhbmRlZCghZXhwYW5kZWQpfVxuICAgICAgICAgICAgICAgIG9uTW91c2VFbnRlcj17KCkgPT4gc2V0SG92ZXJlZCh0cnVlKX1cbiAgICAgICAgICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT17Uy50ZH0+IyB7bWFwcGluZy5jaGFubmVsTmFtZX08L3RkPlxuICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT17Uy50ZH0+e21hcHBpbmcuY29uZmlnLnR5cGV9PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgc3R5bGU9e3sgLi4uUy50ZCwgdGV4dEFsaWduOiAncmlnaHQnIH19PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17Uy5idG5EYW5nZXJ9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtlID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgb25EZWxldGUoKTsgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAge2V4cGFuZGVkICYmIChcbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xTcGFuPXszfSBzdHlsZT17eyAuLi5TLnRkLCBiYWNrZ3JvdW5kOiAnIzBmMTExNScsIHBhZGRpbmc6ICcxNnB4JyB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxCZWhhdmlvckNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZz17bWFwcGluZy5jb25maWd9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2MgPT4gb25VcGRhdGUoYyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICApfVxuICAgICAgICA8L3Rib2R5PlxuICAgICk7XG59XG5cblxuZnVuY3Rpb24gQm90U2V0dXAoeyBjb25maWcsIG9uU2F2ZSB9OiB7XG4gICAgY29uZmlnOiBDb25maWdEYXRhIHwgbnVsbDtcbiAgICBvblNhdmU6ICgpID0+IHZvaWQ7XG59KTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtkaXNjb3JkVG9rZW4sIHNldERpc2NvcmRUb2tlbl0gPSB1c2VTdGF0ZShjb25maWc/LmRpc2NvcmRUb2tlbiA/PyAnJyk7XG4gICAgY29uc3QgW3NlcnZlcklkLCBzZXRTZXJ2ZXJJZF0gPSB1c2VTdGF0ZShjb25maWc/LnNlcnZlcklkID8/ICcnKTtcbiAgICBjb25zdCBbb3BlbmFpS2V5LCBzZXRPcGVuYWlLZXldID0gdXNlU3RhdGUoY29uZmlnPy5vcGVuYWlLZXkgPz8gJycpO1xuICAgIGNvbnN0IFtkaWFnbm9zdGljc1BvcnQsIHNldERpYWdub3N0aWNzUG9ydF0gPSB1c2VTdGF0ZShTdHJpbmcoY29uZmlnPy5kaWFnbm9zdGljc1BvcnQgPz8gODA4MCkpO1xuICAgIGNvbnN0IFttc2csIHNldE1zZ10gPSB1c2VTdGF0ZSgnJyk7XG4gICAgY29uc3QgW2Vyciwgc2V0RXJyXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2V0RGlzY29yZFRva2VuKGNvbmZpZz8uZGlzY29yZFRva2VuID8/ICcnKTtcbiAgICAgICAgc2V0U2VydmVySWQoY29uZmlnPy5zZXJ2ZXJJZCA/PyAnJyk7XG4gICAgICAgIHNldE9wZW5haUtleShjb25maWc/Lm9wZW5haUtleSA/PyAnJyk7XG4gICAgICAgIHNldERpYWdub3N0aWNzUG9ydChTdHJpbmcoY29uZmlnPy5kaWFnbm9zdGljc1BvcnQgPz8gODA4MCkpO1xuICAgIH0sIFtjb25maWc/LmRpc2NvcmRUb2tlbiwgY29uZmlnPy5vcGVuYWlLZXksIGNvbmZpZz8uc2VydmVySWQsIGNvbmZpZz8uZGlhZ25vc3RpY3NQb3J0XSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBzZXRTYXZpbmcodHJ1ZSk7XG4gICAgICAgIHNldEVycignJyk7IHNldE1zZygnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgICAgICAgICAgICBkaXNjb3JkVG9rZW46IGRpc2NvcmRUb2tlbi50cmltKCksXG4gICAgICAgICAgICAgICAgb3BlbmFpS2V5OiBvcGVuYWlLZXkudHJpbSgpLFxuICAgICAgICAgICAgICAgIHNlcnZlcklkOiBzZXJ2ZXJJZC50cmltKCkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBkaWFnbm9zdGljc1BvcnQ6IE51bWJlcihkaWFnbm9zdGljc1BvcnQpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGF3YWl0IGpzb25Qb3N0KCcvYXBpL2NvbmZpZycsIGJvZHkpO1xuICAgICAgICAgICAgc2V0TXNnKCdTYXZlZC4nKTtcbiAgICAgICAgICAgIG9uU2F2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXRFcnIoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldFNhdmluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8c2VjdGlvbiBzdHlsZT17Uy5ib3h9PlxuICAgICAgICAgICAgPGgyIHN0eWxlPXt7IG1hcmdpblRvcDogMCB9fT5Cb3QgU2V0dXA8L2gyPlxuICAgICAgICAgICAge2NvbmZpZyAmJiA8cCBzdHlsZT17eyBjb2xvcjogJyNiNGJkYzgnLCBtYXJnaW5Ub3A6IDAgfX0+Q29uZmlnOiB7Y29uZmlnLmNvbmZpZ1BhdGh9PC9wPn1cbiAgICAgICAgICAgIHtlcnIgJiYgPHAgc3R5bGU9e1MuZXJyfT57ZXJyfTwvcD59XG4gICAgICAgICAgICB7bXNnICYmIDxwIHN0eWxlPXtTLm9rfT57bXNnfTwvcD59XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJEaXNjb3JkIFRva2VuXCIgdmFsdWU9e2Rpc2NvcmRUb2tlbn0gb25DaGFuZ2U9e3NldERpc2NvcmRUb2tlbn0gcGxhY2Vob2xkZXI9XCJEaXNjb3JkIGJvdCB0b2tlblwiIC8+XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJTZXJ2ZXIgSUQgKHJlcXVpcmVkKVwiIHZhbHVlPXtzZXJ2ZXJJZH0gb25DaGFuZ2U9e3NldFNlcnZlcklkfSBwbGFjZWhvbGRlcj1cIlJlcXVpcmVkIFx1MjAxNCBEaXNjb3JkIHNlcnZlciBJRFwiIC8+XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJPcGVuQUkgS2V5XCIgdmFsdWU9e29wZW5haUtleX0gb25DaGFuZ2U9e3NldE9wZW5haUtleX0gcGxhY2Vob2xkZXI9XCJPcGVuQUkgQVBJIGtleVwiIC8+XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJEaWFnbm9zdGljcyBQb3J0XCIgdHlwZT1cIm51bWJlclwiIHZhbHVlPXtkaWFnbm9zdGljc1BvcnR9IG9uQ2hhbmdlPXtzZXREaWFnbm9zdGljc1BvcnR9IHBsYWNlaG9sZGVyPVwiODA4MFwiIC8+XG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXtTLmJ0bn0gb25DbGljaz17KCkgPT4gdm9pZCBzYXZlKCl9IGRpc2FibGVkPXtzYXZpbmd9PlxuICAgICAgICAgICAgICAgIHtzYXZpbmcgPyAnU2F2aW5nXHUyMDI2JyA6ICdTYXZlJ31cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gQ2hhbm5lbEJlaGF2aW9ycyh7IHJlZnJlc2hLZXkgfTogeyByZWZyZXNoS2V5PzogbnVtYmVyIH0pOiBKU1guRWxlbWVudCB7XG4gICAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gdXNlU3RhdGU8Q2hhbm5lbHNEYXRhIHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW2Vyciwgc2V0RXJyXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbYWRkQ2hhbm5lbElkLCBzZXRBZGRDaGFubmVsSWRdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFthZGRCZWhhdmlvciwgc2V0QWRkQmVoYXZpb3JdID0gdXNlU3RhdGU8QmVoYXZpb3JUeXBlPignaW1tZWRpYXRlLXByaW50Jyk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IGFwaUZldGNoPENoYW5uZWxzRGF0YT4oJy9hcGkvY2hhbm5lbHMnKTtcbiAgICAgICAgICAgIHNldERhdGEoZCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNldEVycihlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHsgdm9pZCBsb2FkKCk7IH0sIFtyZWZyZXNoS2V5XSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBhZGRNYXBwaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIWFkZENoYW5uZWxJZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBkYyA9IGRhdGE/LmRpc2NvcmRDaGFubmVscy5maW5kKGMgPT4gYy5pZCA9PT0gYWRkQ2hhbm5lbElkKTtcbiAgICAgICAgaWYgKCFkYykgcmV0dXJuO1xuICAgICAgICBjb25zdCBkZWZhdWx0Q29uZmlnOiBDaGFubmVsQmVoYXZpb3JDb25maWcgPSBhZGRCZWhhdmlvciA9PT0gJ2ltbWVkaWF0ZS1wcmludCdcbiAgICAgICAgICAgID8geyB0eXBlOiAnaW1tZWRpYXRlLXByaW50JywgaW5jbHVkZUljb246IGZhbHNlLCBpbmNsdWRlTWV0YWRhdGE6IGZhbHNlIH1cbiAgICAgICAgICAgIDogYWRkQmVoYXZpb3IgPT09ICdhY2N1bXVsYXRpbmctbGlzdCdcbiAgICAgICAgICAgICAgICA/IHsgdHlwZTogJ2FjY3VtdWxhdGluZy1saXN0JywgaW5jbHVkZUNoZWNrbGlzdDogZmFsc2UsIGluY2x1ZGVNZXRhZGF0YTogZmFsc2UgfVxuICAgICAgICAgICAgICAgIDogYWRkQmVoYXZpb3IgPT09ICdyZWN1cnJpbmctcHJpbnQnXG4gICAgICAgICAgICAgICAgICAgID8geyB0eXBlOiAncmVjdXJyaW5nLXByaW50JywgaW5jbHVkZUljb246IGZhbHNlLCBpbmNsdWRlTWV0YWRhdGE6IGZhbHNlIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7IHR5cGU6ICdvbi1kZW1hbmQnIH07XG4gICAgICAgIGF3YWl0IGpzb25Qb3N0KCcvYXBpL2NoYW5uZWxzJywgeyBjaGFubmVsSWQ6IGRjLmlkLCBjaGFubmVsTmFtZTogZGMubmFtZSwgY29uZmlnOiBkZWZhdWx0Q29uZmlnIH0pO1xuICAgICAgICBzZXRBZGRDaGFubmVsSWQoJycpO1xuICAgICAgICBhd2FpdCBsb2FkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQ2hhbm5lbChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IGpzb25EZWxldGUoYC9hcGkvY2hhbm5lbHMvJHtpZH1gKTtcbiAgICAgICAgYXdhaXQgbG9hZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNoYW5uZWwoaWQ6IHN0cmluZywgY29uZmlnOiBDaGFubmVsQmVoYXZpb3JDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQganNvblB1dChgL2FwaS9jaGFubmVscy8ke2lkfWAsIHsgY29uZmlnIH0pO1xuICAgICAgICBhd2FpdCBsb2FkKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEZyb21EaXNjb3JkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IGFwaUZldGNoPENoYW5uZWxzRGF0YT4oJy9hcGkvY2hhbm5lbHMvcmVmcmVzaCcsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG4gICAgICAgICAgICBzZXREYXRhKGQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXRFcnIoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxzZWN0aW9uIHN0eWxlPXtTLmJveH0+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IGRpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcicsIGdhcDogJzEycHgnLCBtYXJnaW5Cb3R0b206ICcxMnB4JyB9fT5cbiAgICAgICAgICAgICAgICA8aDIgc3R5bGU9e3sgbWFyZ2luVG9wOiAwLCBtYXJnaW5Cb3R0b206IDAgfX0+Q2hhbm5lbCBCZWhhdmlvcnM8L2gyPlxuICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3sgLi4uUy5idG4sIG1hcmdpblJpZ2h0OiAwIH19IG9uQ2xpY2s9eygpID0+IHZvaWQgcmVmcmVzaEZyb21EaXNjb3JkKCl9PlJlZnJlc2ggQ2hhbm5lbHM8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge2VyciAmJiA8cCBzdHlsZT17Uy5lcnJ9PntlcnJ9PC9wPn1cbiAgICAgICAgICAgIDx0YWJsZSBzdHlsZT17eyB3aWR0aDogJzEwMCUnLCBib3JkZXJDb2xsYXBzZTogJ2NvbGxhcHNlJywgbWFyZ2luQm90dG9tOiAnMTZweCcgfX0+XG4gICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e1MudGh9PkNoYW5uZWw8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPXtTLnRofT5CZWhhdmlvcjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e3sgLi4uUy50aCwgdGV4dEFsaWduOiAncmlnaHQnIGFzIGNvbnN0IH19PkFjdGlvbnM8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAge2RhdGE/LmNoYW5uZWxzLm1hcChtID0+IChcbiAgICAgICAgICAgICAgICAgICAgPENoYW5uZWxSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17bS5jaGFubmVsSWR9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nPXttfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25EZWxldGU9eygpID0+IHZvaWQgZGVsZXRlQ2hhbm5lbChtLmNoYW5uZWxJZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZT17YyA9PiB2b2lkIHVwZGF0ZUNoYW5uZWwobS5jaGFubmVsSWQsIGMpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIHsoIWRhdGEgfHwgZGF0YS5jaGFubmVscy5sZW5ndGggPT09IDApICYmIChcbiAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZCBjb2xTcGFuPXszfSBzdHlsZT17eyAuLi5TLnRkLCBjb2xvcjogJyNiNGJkYzgnIH19Pk5vIGNoYW5uZWwgbWFwcGluZ3MgeWV0LjwvdGQ+PC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC90YWJsZT5cblxuICAgICAgICAgICAgPGRpdiBzdHlsZT17Uy5ncmlkM30+XG4gICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPXtTLmxhYmVsfT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e1MubGFiZWxUZXh0fT5DaGFubmVsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IHN0eWxlPXtTLnNlbGVjdH0gdmFsdWU9e2FkZENoYW5uZWxJZH0gb25DaGFuZ2U9e2UgPT4gc2V0QWRkQ2hhbm5lbElkKChlLmN1cnJlbnRUYXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IGNoYW5uZWxcdTIwMjY8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtkYXRhPy51bm1hcHBlZC5tYXAoYyA9PiA8b3B0aW9uIGtleT17Yy5pZH0gdmFsdWU9e2MuaWR9PiN7Yy5uYW1lfTwvb3B0aW9uPil9XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPXtTLmxhYmVsfT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e1MubGFiZWxUZXh0fT5CZWhhdmlvcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBzdHlsZT17Uy5zZWxlY3R9IHZhbHVlPXthZGRCZWhhdmlvcn0gb25DaGFuZ2U9e2UgPT4gc2V0QWRkQmVoYXZpb3IoKGUuY3VycmVudFRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkudmFsdWUgYXMgQmVoYXZpb3JUeXBlKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaW1tZWRpYXRlLXByaW50XCI+XHVEODNEXHVEREE4XHVGRTBGIEltbWVkaWF0ZSBQcmludDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFjY3VtdWxhdGluZy1saXN0XCI+XHVEODNEXHVERUQyIEFjY3VtdWxhdGluZyBMaXN0PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVjdXJyaW5nLXByaW50XCI+XHVEODNEXHVERDA0IFJlY3VycmluZyBQcmludDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm9uLWRlbWFuZFwiPlx1RDgzRFx1RENBQyBPbi1EZW1hbmQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXtTLmJ0bn0gb25DbGljaz17KCkgPT4gdm9pZCBhZGRNYXBwaW5nKCl9IGRpc2FibGVkPXshYWRkQ2hhbm5lbElkfT5BZGQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgKTtcbn1cblxuXG50eXBlIFByaW50TW9kZSA9ICdlc2NwJyB8ICdjdXBzJyB8ICdpbWFnZWZlZWQnO1xuXG5pbnRlcmZhY2UgRXNjcFByaW50Q29uZmlnIHsgbW9kZTogJ2VzY3AnOyBzZXJpYWxQb3J0OiBzdHJpbmc7IH1cbmludGVyZmFjZSBDdXBzUHJpbnRDb25maWcgeyBtb2RlOiAnY3Vwcyc7IHByaW50ZXJOYW1lOiBzdHJpbmc7IHBhcGVyU2l6ZTogc3RyaW5nOyBwYXBlck5hbWU6IHN0cmluZzsgfVxuaW50ZXJmYWNlIEltYWdlRmVlZENvbmZpZyB7IG1vZGU6ICdpbWFnZWZlZWQnOyB9XG50eXBlIFByaW50Q29uZmlnID0gRXNjcFByaW50Q29uZmlnIHwgQ3Vwc1ByaW50Q29uZmlnIHwgSW1hZ2VGZWVkQ29uZmlnO1xuXG5cbmZ1bmN0aW9uIFByaW50TW9kZVNlY3Rpb24oKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtwcmludENvbmZpZywgc2V0UHJpbnRDb25maWddID0gdXNlU3RhdGU8UHJpbnRDb25maWcgfCBudWxsPihudWxsKTtcbiAgICBjb25zdCBbbW9kZSwgc2V0TW9kZV0gPSB1c2VTdGF0ZTxQcmludE1vZGU+KCdlc2NwJyk7XG4gICAgLy8gZXNjcCBmaWVsZHNcbiAgICBjb25zdCBbc2VyaWFsUG9ydCwgc2V0U2VyaWFsUG9ydF0gPSB1c2VTdGF0ZSgnL2Rldi90dHlVU0IwJyk7XG4gICAgLy8gY3VwcyBmaWVsZHNcbiAgICBjb25zdCBbcHJpbnRlck5hbWUsIHNldFByaW50ZXJOYW1lXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbcGFwZXJTaXplLCBzZXRQYXBlclNpemVdID0gdXNlU3RhdGUoJ0xldHRlcicpO1xuICAgIGNvbnN0IFtwYXBlck5hbWUsIHNldFBhcGVyTmFtZV0gPSB1c2VTdGF0ZSgnJyk7XG4gICAgY29uc3QgW21zZywgc2V0TXNnXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbZXJyLCBzZXRFcnJdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW3Rlc3RpbmcsIHNldFRlc3RpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCBhcGlGZXRjaDx7IHByaW50Q29uZmlnOiBQcmludENvbmZpZyB8IG51bGwgfT4oJy9hcGkvcHJpbnQtY29uZmlnJyk7XG4gICAgICAgICAgICBpZiAoZC5wcmludENvbmZpZykge1xuICAgICAgICAgICAgICAgIHNldFByaW50Q29uZmlnKGQucHJpbnRDb25maWcpO1xuICAgICAgICAgICAgICAgIHNldE1vZGUoZC5wcmludENvbmZpZy5tb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoZC5wcmludENvbmZpZy5tb2RlID09PSAnZXNjcCcpIHNldFNlcmlhbFBvcnQoZC5wcmludENvbmZpZy5zZXJpYWxQb3J0KTtcbiAgICAgICAgICAgICAgICBpZiAoZC5wcmludENvbmZpZy5tb2RlID09PSAnY3VwcycpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJpbnRlck5hbWUoZC5wcmludENvbmZpZy5wcmludGVyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldFBhcGVyU2l6ZShkLnByaW50Q29uZmlnLnBhcGVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldFBhcGVyTmFtZShkLnByaW50Q29uZmlnLnBhcGVyTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXRFcnIoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7IHZvaWQgbG9hZCgpOyB9LCBbXSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBzZXRTYXZpbmcodHJ1ZSk7IHNldEVycignJyk7IHNldE1zZygnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY2ZnOiBQcmludENvbmZpZztcbiAgICAgICAgICAgIGlmIChtb2RlID09PSAnZXNjcCcpIHtcbiAgICAgICAgICAgICAgICBjZmcgPSB7IG1vZGU6ICdlc2NwJywgc2VyaWFsUG9ydDogc2VyaWFsUG9ydC50cmltKCkgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2N1cHMnKSB7XG4gICAgICAgICAgICAgICAgY2ZnID0geyBtb2RlOiAnY3VwcycsIHByaW50ZXJOYW1lOiBwcmludGVyTmFtZS50cmltKCksIHBhcGVyU2l6ZTogcGFwZXJTaXplLnRyaW0oKSwgcGFwZXJOYW1lOiBwYXBlck5hbWUudHJpbSgpIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNmZyA9IHsgbW9kZTogJ2ltYWdlZmVlZCcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGpzb25Qb3N0KCcvYXBpL3ByaW50LWNvbmZpZycsIHsgcHJpbnRDb25maWc6IGNmZyB9KTtcbiAgICAgICAgICAgIHNldFByaW50Q29uZmlnKGNmZyk7XG4gICAgICAgICAgICBzZXRNc2coJ1ByaW50IG1vZGUgc2F2ZWQuJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNldEVycihlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0U2F2aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uIHRlc3RQcmludCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgc2V0VGVzdGluZyh0cnVlKTsgc2V0RXJyKCcnKTsgc2V0TXNnKCcnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGpzb25Qb3N0KCcvYXBpL3ByaW50ZXIvdGVzdCcsIHt9KTtcbiAgICAgICAgICAgIHNldE1zZyhtb2RlID09PSAnaW1hZ2VmZWVkJyA/ICdUZXN0IGpvYiBhZGRlZCB0byBpbWFnZSBmZWVkLicgOiAnVGVzdCBwYWdlIHNlbnQgdG8gcHJpbnRlci4nKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc2V0RXJyKGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzZXRUZXN0aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVMYWJlbDogUmVjb3JkPFByaW50TW9kZSwgc3RyaW5nPiA9IHtcbiAgICAgICAgZXNjcDogJ1x1RDgzRFx1REQwQyBFU0MvUCB2aWEgU2VyaWFsIFBvcnQnLFxuICAgICAgICBjdXBzOiAnXHVEODNEXHVEQ0M0IFBERiB2aWEgQ1VQUycsXG4gICAgICAgIGltYWdlZmVlZDogJ1x1RDgzRFx1RERCQ1x1RkUwRiBJbWFnZSBGZWVkICh0ZXN0aW5nKScsXG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxzZWN0aW9uIHN0eWxlPXtTLmJveH0+XG4gICAgICAgICAgICA8aDIgc3R5bGU9e3sgbWFyZ2luVG9wOiAwIH19PlByaW50IE1vZGU8L2gyPlxuICAgICAgICAgICAge2VyciAmJiA8cCBzdHlsZT17Uy5lcnJ9PntlcnJ9PC9wPn1cbiAgICAgICAgICAgIHttc2cgJiYgPHAgc3R5bGU9e1Mub2t9Pnttc2d9PC9wPn1cblxuICAgICAgICAgICAgPGxhYmVsIHN0eWxlPXtTLmxhYmVsfT5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17Uy5sYWJlbFRleHR9Pk91dHB1dCBNb2RlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e1Muc2VsZWN0fVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bW9kZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0TW9kZSgoZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZSBhcyBQcmludE1vZGUpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgeyhbJ2VzY3AnLCAnY3VwcycsICdpbWFnZWZlZWQnXSBhcyBQcmludE1vZGVbXSkubWFwKG0gPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e219IHZhbHVlPXttfT57bW9kZUxhYmVsW21dfTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgIHttb2RlID09PSAnZXNjcCcgJiYgKFxuICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlNlcmlhbCBQb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlcmlhbFBvcnR9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtzZXRTZXJpYWxQb3J0fVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImUuZy4gL2Rldi90dHlVU0IwIG9yIENPTTNcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICB7bW9kZSA9PT0gJ2N1cHMnICYmIDw+XG4gICAgICAgICAgICAgICAgPEZpZWxkIGxhYmVsPVwiQ1VQUyBQcmludGVyIE5hbWVcIiB2YWx1ZT17cHJpbnRlck5hbWV9IG9uQ2hhbmdlPXtzZXRQcmludGVyTmFtZX0gcGxhY2Vob2xkZXI9XCJlLmcuIFRNLVQ4OFZcIiAvPlxuICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlBhcGVyIFNpemVcIiB2YWx1ZT17cGFwZXJTaXplfSBvbkNoYW5nZT17c2V0UGFwZXJTaXplfSBwbGFjZWhvbGRlcj1cImUuZy4gTGV0dGVyLCBBNCwgODB4Mjk3bW1cIiAvPlxuICAgICAgICAgICAgICAgIDxGaWVsZCBsYWJlbD1cIlBhcGVyIE5hbWUgKGRpc3BsYXkgbGFiZWwpXCIgdmFsdWU9e3BhcGVyTmFtZX0gb25DaGFuZ2U9e3NldFBhcGVyTmFtZX0gcGxhY2Vob2xkZXI9XCJlLmcuIFJlY2VpcHQgUm9sbFwiIC8+XG4gICAgICAgICAgICA8Lz59XG5cbiAgICAgICAgICAgIHttb2RlID09PSAnaW1hZ2VmZWVkJyAmJiAoXG4gICAgICAgICAgICAgICAgPHAgc3R5bGU9e3sgY29sb3I6ICcjYjRiZGM4JywgbWFyZ2luVG9wOiAwIH19PlxuICAgICAgICAgICAgICAgICAgICBQcmludCBqb2JzIHdpbGwgYmUgcmVuZGVyZWQgYXMgUE5HcyBhbmQgc2hvd24gYXR7JyAnfVxuICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiL2ZlZWRcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+L2ZlZWQ8L2E+LlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogJ2ZsZXgnLCBnYXA6ICc4cHgnLCBtYXJnaW5Ub3A6ICc4cHgnIH19PlxuICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e1MuYnRufSBvbkNsaWNrPXsoKSA9PiB2b2lkIHNhdmUoKX0gZGlzYWJsZWQ9e3NhdmluZ30+XG4gICAgICAgICAgICAgICAgICAgIHtzYXZpbmcgPyAnU2F2aW5nXHUyMDI2JyA6ICdTYXZlJ31cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IC4uLlMuYnRuLCBiYWNrZ3JvdW5kOiAnIzFhN2EzYScgfX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdm9pZCB0ZXN0UHJpbnQoKX1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3Rlc3RpbmcgfHwgIXByaW50Q29uZmlnfVxuICAgICAgICAgICAgICAgICAgICB0aXRsZT17IXByaW50Q29uZmlnID8gJ1NhdmUgYSBtb2RlIGZpcnN0JyA6ICcnfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3Rlc3RpbmcgPyAnUHJpbnRpbmdcdTIwMjYnIDogJ1ByaW50IFRlc3QgUGFnZSd9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIFNlY3VyaXR5U2VjdGlvbih7IG9uU2F2ZSB9OiB7IG9uU2F2ZTogKCkgPT4gdm9pZCB9KTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtwYXNzd29yZCwgc2V0UGFzc3dvcmRdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFttc2csIHNldE1zZ10gPSB1c2VTdGF0ZSgnJyk7XG4gICAgY29uc3QgW2Vyciwgc2V0RXJyXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gc2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgc2V0U2F2aW5nKHRydWUpOyBzZXRFcnIoJycpOyBzZXRNc2coJycpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQganNvblBvc3QoJy9hcGkvY29uZmlnJywgeyBwYXNzd29yZCB9KTtcbiAgICAgICAgICAgIHNldFBhc3N3b3JkKCcnKTtcbiAgICAgICAgICAgIHNldE1zZyhwYXNzd29yZCA/ICdQYXNzd29yZCBzZXQuJyA6ICdQYXNzd29yZCBjbGVhcmVkLicpO1xuICAgICAgICAgICAgb25TYXZlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNldEVycihlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0U2F2aW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxzZWN0aW9uIHN0eWxlPXtTLmJveH0+XG4gICAgICAgICAgICA8aDIgc3R5bGU9e3sgbWFyZ2luVG9wOiAwIH19PlNlY3VyaXR5PC9oMj5cbiAgICAgICAgICAgIHtlcnIgJiYgPHAgc3R5bGU9e1MuZXJyfT57ZXJyfTwvcD59XG4gICAgICAgICAgICB7bXNnICYmIDxwIHN0eWxlPXtTLm9rfT57bXNnfTwvcD59XG4gICAgICAgICAgICA8RmllbGQgbGFiZWw9XCJDb250cm9sIFBhbmVsIFBhc3N3b3JkXCIgdHlwZT1cInBhc3N3b3JkXCIgdmFsdWU9e3Bhc3N3b3JkfSBvbkNoYW5nZT17c2V0UGFzc3dvcmR9IHBsYWNlaG9sZGVyPVwiTGVhdmUgYmxhbmsgdG8gcmVtb3ZlIHBhc3N3b3JkXCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e1MuYnRufSBvbkNsaWNrPXsoKSA9PiB2b2lkIHNhdmUoKX0gZGlzYWJsZWQ9e3NhdmluZ30+XG4gICAgICAgICAgICAgICAge3NhdmluZyA/ICdTYXZpbmdcdTIwMjYnIDogJ1NldCBQYXNzd29yZCd9XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICk7XG59XG5cbmZ1bmN0aW9uIExvZ1NlY3Rpb24oKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtldmVudHMsIHNldEV2ZW50c10gPSB1c2VTdGF0ZTxEaWFnbm9zdGljRXZlbnRbXT4oW10pO1xuICAgIGNvbnN0IFtzdGF0dXMsIHNldFN0YXR1c10gPSB1c2VTdGF0ZTxTdGF0dXNEYXRhIHwgbnVsbD4obnVsbCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgYXBpRmV0Y2g8eyBldmVudHM6IERpYWdub3N0aWNFdmVudFtdOyBzdGF0dXM6IFN0YXR1c0RhdGEgfT4oJy9hcGkvZXZlbnRzJyk7XG4gICAgICAgIHNldEV2ZW50cyhkLmV2ZW50cyk7XG4gICAgICAgIHNldFN0YXR1cyhkLnN0YXR1cyk7XG4gICAgfVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm9pZCBsb2FkKCk7XG4gICAgICAgIGNvbnN0IHQgPSBzZXRJbnRlcnZhbCgoKSA9PiB2b2lkIGxvYWQoKSwgNDAwMCk7XG4gICAgICAgIHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKHQpO1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IHR5cGVDb2xvcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgc3RhcnR1cDogJyM4YWI0ZmYnLFxuICAgICAgICBzdWNjZXNzOiAnIzhmZjBhNCcsXG4gICAgICAgIGVycm9yOiAnI2ZmODA4MCcsXG4gICAgICAgIHByaW50OiAnI2ZmZDU4MCcsXG4gICAgICAgIGluZm86ICcjYjRiZGM4JyxcbiAgICAgICAgY29tbWFuZDogJyNkMmE4ZmYnLFxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8c2VjdGlvbiBzdHlsZT17Uy5ib3h9PlxuICAgICAgICAgICAgPGgyIHN0eWxlPXt7IG1hcmdpblRvcDogMCB9fT5Cb3QgU3RhdHVzICYgTG9nPC9oMj5cbiAgICAgICAgICAgIHtzdGF0dXMgJiYgKFxuICAgICAgICAgICAgICAgIDxkbCBzdHlsZT17eyBkaXNwbGF5OiAnZ3JpZCcsIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICcxNDBweCAxZnInLCBnYXA6ICc0cHggMTJweCcsIG1hcmdpbkJvdHRvbTogJzE2cHgnIH19PlxuICAgICAgICAgICAgICAgICAgICA8ZHQgc3R5bGU9e3sgY29sb3I6ICcjYjRiZGM4JyB9fT5Db25uZWN0ZWQ8L2R0PjxkZCBzdHlsZT17eyBtYXJnaW46IDAgfX0+e3N0YXR1cy5jb25uZWN0ZWQgPyAnXHUyNzA1IHllcycgOiAnXHUyNzRDIG5vJ308L2RkPlxuICAgICAgICAgICAgICAgICAgICA8ZHQgc3R5bGU9e3sgY29sb3I6ICcjYjRiZGM4JyB9fT5Cb3Q8L2R0PjxkZCBzdHlsZT17eyBtYXJnaW46IDAgfX0+e3N0YXR1cy50YWcgPz8gJ1x1MjAxNCd9PC9kZD5cbiAgICAgICAgICAgICAgICAgICAgPGR0IHN0eWxlPXt7IGNvbG9yOiAnI2I0YmRjOCcgfX0+U3RhcnRlZDwvZHQ+PGRkIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57c3RhdHVzLnN0YXJ0ZWRBdCA/PyAnXHUyMDE0J308L2RkPlxuICAgICAgICAgICAgICAgICAgICA8ZHQgc3R5bGU9e3sgY29sb3I6ICcjYjRiZGM4JyB9fT5TZXJ2ZXIgSUQ8L2R0PjxkZCBzdHlsZT17eyBtYXJnaW46IDAgfX0+e3N0YXR1cy5jb25maWd1cmVkU2VydmVySWQgPz8gJ1x1MjAxNCd9PC9kZD5cbiAgICAgICAgICAgICAgICAgICAgPGR0IHN0eWxlPXt7IGNvbG9yOiAnI2I0YmRjOCcgfX0+U2VydmVyczwvZHQ+PGRkIHN0eWxlPXt7IG1hcmdpbjogMCB9fT57c3RhdHVzLmd1aWxkcy5qb2luKCcsICcpIHx8ICdcdTIwMTQnfTwvZGQ+XG4gICAgICAgICAgICAgICAgPC9kbD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7IG1heEhlaWdodDogJzQwMHB4Jywgb3ZlcmZsb3c6ICdhdXRvJywgYm9yZGVyOiAnMXB4IHNvbGlkICMyYjMzNDAnLCBib3JkZXJSYWRpdXM6ICc4cHgnIH19PlxuICAgICAgICAgICAgICAgIHtldmVudHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT17eyBwYWRkaW5nOiAnMTJweCcsIG1hcmdpbjogMCwgY29sb3I6ICcjYjRiZGM4JyB9fT5ObyBldmVudHMgeWV0LjwvcD5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgYm9yZGVyQ29sbGFwc2U6ICdjb2xsYXBzZScgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e1MudGh9PlRpbWU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e1MudGh9PlR5cGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9e1MudGh9Pk1lc3NhZ2U8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtldmVudHMubWFwKChlLCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBrZXk9e1N0cmluZyhpKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9e3sgLi4uUy50ZCwgLi4uUy5tb25vLCB3aGl0ZVNwYWNlOiAnbm93cmFwJyBhcyBjb25zdCB9fT57ZS50aW1lc3RhbXB9PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT17eyAuLi5TLnRkLCBjb2xvcjogdHlwZUNvbG9yW2UudHlwZV0gPz8gJyNiNGJkYzgnIH19PntlLnR5cGV9PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT17Uy50ZH0+e2UubWVzc2FnZX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICApO1xufVxuXG5mdW5jdGlvbiBSZXN0YXJ0U2VjdGlvbigpOiBKU1guRWxlbWVudCB7XG4gICAgY29uc3QgW21zZywgc2V0TXNnXSA9IHVzZVN0YXRlKCcnKTtcbiAgICBjb25zdCBbZXJyLCBzZXRFcnJdID0gdXNlU3RhdGUoJycpO1xuICAgIGNvbnN0IFtyZXN0YXJ0aW5nLCBzZXRSZXN0YXJ0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHNldFJlc3RhcnRpbmcodHJ1ZSk7IHNldEVycignJyk7IHNldE1zZygnJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBqc29uUG9zdCgnL2FwaS9yZXN0YXJ0Jywge30pO1xuICAgICAgICAgICAgc2V0TXNnKCdSZXN0YXJ0IHNpZ25hbCBzZW50LiBUaGUgc2VydmVyIHdpbGwgcmVzdGFydCBzaG9ydGx5LicpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzZXRFcnIoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTtcbiAgICAgICAgICAgIHNldFJlc3RhcnRpbmcoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPHNlY3Rpb24gc3R5bGU9e1MuYm94fT5cbiAgICAgICAgICAgIDxoMiBzdHlsZT17eyBtYXJnaW5Ub3A6IDAgfX0+U2VydmVyIENvbnRyb2w8L2gyPlxuICAgICAgICAgICAge2VyciAmJiA8cCBzdHlsZT17Uy5lcnJ9PntlcnJ9PC9wPn1cbiAgICAgICAgICAgIHttc2cgJiYgPHAgc3R5bGU9e1Mub2t9Pnttc2d9PC9wPn1cbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3sgLi4uUy5idG4sIGJhY2tncm91bmQ6ICcjOGE2ZDAwJyB9fSBvbkNsaWNrPXsoKSA9PiB2b2lkIHJlc3RhcnQoKX0gZGlzYWJsZWQ9e3Jlc3RhcnRpbmd9PlxuICAgICAgICAgICAgICAgIHtyZXN0YXJ0aW5nID8gJ1Jlc3RhcnRpbmdcdTIwMjYnIDogJ1Jlc3RhcnQgU2VydmVyJ31cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgKTtcbn1cblxuXG5mdW5jdGlvbiBBcHAoKTogSlNYLkVsZW1lbnQge1xuICAgIGNvbnN0IFtjb25maWcsIHNldENvbmZpZ10gPSB1c2VTdGF0ZTxDb25maWdEYXRhIHwgbnVsbD4obnVsbCk7XG4gICAgY29uc3QgW3JlZnJlc2hLZXksIHNldFJlZnJlc2hLZXldID0gdXNlU3RhdGUoMCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkID0gYXdhaXQgYXBpRmV0Y2g8Q29uZmlnRGF0YT4oJy9hcGkvY29uZmlnJyk7XG4gICAgICAgIHNldENvbmZpZyhkKTtcbiAgICB9XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4geyB2b2lkIGxvYWRDb25maWcoKTsgfSwgW10pO1xuXG4gICAgZnVuY3Rpb24gaGFuZGxlU2F2ZSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCBsb2FkQ29uZmlnKCk7XG4gICAgICAgIHNldFJlZnJlc2hLZXkoayA9PiBrICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPG1haW4gc3R5bGU9e3sgbWF4V2lkdGg6ICc4NjBweCcsIG1hcmdpbjogJzAgYXV0bycsIHBhZGRpbmc6ICcyNHB4JyB9fT5cbiAgICAgICAgICAgIDxoMSBzdHlsZT17eyBtYXJnaW5Ub3A6IDAgfX0+XHVEODNEXHVEREE4XHVGRTBGIFdpbmRzb3IgQ29udHJvbCBQYW5lbDwvaDE+XG4gICAgICAgICAgICA8Qm90U2V0dXAgY29uZmlnPXtjb25maWd9IG9uU2F2ZT17aGFuZGxlU2F2ZX0gLz5cbiAgICAgICAgICAgIDxDaGFubmVsQmVoYXZpb3JzIHJlZnJlc2hLZXk9e3JlZnJlc2hLZXl9IC8+XG4gICAgICAgICAgICA8UHJpbnRNb2RlU2VjdGlvbiAvPlxuICAgICAgICAgICAgPFNlY3VyaXR5U2VjdGlvbiBvblNhdmU9eygpID0+IHZvaWQgbG9hZENvbmZpZygpfSAvPlxuICAgICAgICAgICAgPExvZ1NlY3Rpb24gLz5cbiAgICAgICAgICAgIDxSZXN0YXJ0U2VjdGlvbiAvPlxuICAgICAgICA8L21haW4+XG4gICAgKTtcbn1cblxuY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAnKTtcbmlmICghcm9vdCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nICNhcHAnKTtcbnJlbmRlcig8QXBwIC8+LCByb290KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFDTyxJQzBCTUE7QUQxQk4sSUVVREM7QUZWQyxJR0dIQztBSEhHLElHOEZNQztBSDlGTixJSStLSEM7QUovS0csSUkwTEhDO0FKMUxHLElJNExEQztBSjVMQyxJSXNOREM7QUp0TkMsSUtTSEM7QUxURyxJS1VOQztBTFZNLElLV05DO0FMWE0sSUt5QkRDO0FMekJDLElLc0NIQztBTHRDRyxJS3FMREM7QUxyTEMsSUtzTERDO0FMdExDLElNRUlDO0FORkosSUFpQk1DLElBQWdDLENBQUc7QUFqQnpDLElBa0JNQyxJQUFZLENBQUE7QUFsQmxCLElBbUJNQyxJQUNaO0FBcEJNLElDQ01DLElBQVVDLE1BQU1EO0FBU3RCLFNBQVNFLEVBQU9DLElBQUtDLElBQUFBO0FBRTNCLFdBQVNSLE1BQUtRLEdBQU9ELENBQUFBLEdBQUlQLEVBQUFBLElBQUtRLEdBQU1SLEVBQUFBO0FBQ3BDLFNBQTZCTztBQUM5QjtBQVFnQixTQUFBRSxFQUFXQyxJQUFBQTtBQUN0QkEsRUFBQUEsTUFBUUEsR0FBS0MsY0FBWUQsR0FBS0MsV0FBV0MsWUFBWUYsRUFBQUE7QUFDMUQ7QUVWZ0IsU0FBQUcsRUFBY0MsSUFBTU4sSUFBT08sSUFBQUE7QUFDMUMsTUFDQ0MsSUFDQUMsSUFDQWpCLElBSEdrQixLQUFrQixDQUFBO0FBSXRCLE9BQUtsQixNQUFLUSxHQUNBLFVBQUxSLEtBQVlnQixLQUFNUixHQUFNUixFQUFBQSxJQUNkLFNBQUxBLEtBQVlpQixLQUFNVCxHQUFNUixFQUFBQSxJQUM1QmtCLEdBQWdCbEIsRUFBQUEsSUFBS1EsR0FBTVIsRUFBQUE7QUFVakMsTUFQSW1CLFVBQVVDLFNBQVMsTUFDdEJGLEdBQWdCSCxXQUNmSSxVQUFVQyxTQUFTLElBQUluQyxFQUFNb0MsS0FBS0YsV0FBVyxDQUFBLElBQUtKLEtBS2pDLGNBQUEsT0FBUkQsTUhqQlEsUUdpQmNBLEdBQUtRLGFBQ3JDLE1BQUt0QixNQUFLYyxHQUFLUSxhQUFBQSxZQUNWSixHQUFnQmxCLEVBQUFBLE1BQ25Ca0IsR0FBZ0JsQixFQUFBQSxJQUFLYyxHQUFLUSxhQUFhdEIsRUFBQUE7QUFLMUMsU0FBT3VCLEVBQVlULElBQU1JLElBQWlCRixJQUFLQyxJSHpCNUIsSUFBQTtBRzBCcEI7QUFjZ0IsU0FBQU0sRUFBWVQsSUFBTU4sSUFBT1EsSUFBS0MsSUFBS08sSUFBQUE7QUFJbEQsTUFBTUMsS0FBUSxFQUNiWCxNQUFBQSxJQUNBTixPQUFBQSxJQUNBUSxLQUFBQSxJQUNBQyxLQUFBQSxJQUNBUyxLSGpEa0IsTUdrRGxCQyxJSGxEa0IsTUdtRGxCQyxLQUFRLEdBQ1JDLEtIcERrQixNR3FEbEJDLEtIckRrQixNR3NEbEJDLGFBQUFBLFFBQ0FDLEtIdkRrQixRR3VEUFIsS0FBQUEsRUFBcUJyQyxJQUFVcUMsSUFDMUNTLEtBQUFBLElBQ0FDLEtBQVEsRUFBQTtBQU1ULFNIL0RtQixRRzZEZlYsTUg3RGUsUUc2REt0QyxFQUFRdUMsU0FBZXZDLEVBQVF1QyxNQUFNQSxFQUFBQSxHQUV0REE7QUFDUjtBQU1nQixTQUFBVSxFQUFTQyxJQUFBQTtBQUN4QixTQUFPQSxHQUFNQztBQUNkO0FDM0VPLFNBQVNDLEVBQWNGLElBQU9HLElBQUFBO0FBQ3BDQyxPQUFLSixRQUFRQSxJQUNiSSxLQUFLRCxVQUFVQTtBQUNoQjtBQTBFZ0IsU0FBQUUsRUFBY0MsSUFBT0MsSUFBQUE7QUFDcEMsTUozRW1CLFFJMkVmQSxHQUVILFFBQU9ELEdBQUtFLEtBQ1RILEVBQWNDLEdBQUtFLElBQVVGLEdBQUtHLE1BQVUsQ0FBQSxJSjlFN0I7QUltRm5CLFdBRElDLElBQ0dILEtBQWFELEdBQUtLLElBQVdDLFFBQVFMLEtBRzNDLEtKdEZrQixTSW9GbEJHLEtBQVVKLEdBQUtLLElBQVdKLEVBQUFBLE1KcEZSLFFJc0ZLRyxHQUFPRyxJQUk3QixRQUFPSCxHQUFPRztBQVNoQixTQUE0QixjQUFBLE9BQWRQLEdBQU1RLE9BQXFCVCxFQUFjQyxFQUFBQSxJSm5HcEM7QUlvR3BCO0FBTUEsU0FBU1MsRUFBZ0JDLElBQUFBO0FBQ3hCLE1BQUlBLEdBQVNDLE9BQWVELEdBQVNFLEtBQVM7QUFDN0MsUUFBSUMsS0FBV0gsR0FBU0ksS0FDdkJDLEtBQVNGLEdBQVFOLEtBQ2pCUyxLQUFjLENBQUEsR0FDZEMsS0FBVyxDQUFBLEdBQ1hDLEtBQVdDLEVBQU8sQ0FBRSxHQUFFTixFQUFBQTtBQUN2QkssSUFBQUEsR0FBUUosTUFBYUQsR0FBUUMsTUFBYSxHQUN0Q00sRUFBUXBCLFNBQU9vQixFQUFRcEIsTUFBTWtCLEVBQUFBLEdBRWpDRyxFQUNDWCxHQUFTQyxLQUNUTyxJQUNBTCxJQUNBSCxHQUFTWSxLQUNUWixHQUFTQyxJQUFZWSxjSnhJSSxLSXlJekJWLEdBQVFXLE1BQXlCLENBQUNULEVBQUFBLElKMUhqQixNSTJIakJDLElKM0hpQixRSTRIakJELEtBQWlCaEIsRUFBY2MsRUFBQUEsSUFBWUUsSUFBQUEsQ0FBQUEsRUozSWxCLEtJNEl0QkYsR0FBUVcsTUFDWFAsRUFBQUEsR0FHREMsR0FBUUosTUFBYUQsR0FBUUMsS0FDN0JJLEdBQVFoQixHQUFBRyxJQUFtQmEsR0FBUWYsR0FBQUEsSUFBV2UsSUFDOUNPLEVBQVdULElBQWFFLElBQVVELEVBQUFBLEdBQ2xDSixHQUFRTixNQUFRTSxHQUFRWCxLQUFXLE1BRS9CZ0IsR0FBUVgsT0FBU1EsTUFDcEJXLEVBQXdCUixFQUFBQTtFQUUxQjtBQUNEO0FBS0EsU0FBU1EsRUFBd0IxQixJQUFBQTtBQUNoQyxNSmhKbUIsU0lnSmRBLEtBQVFBLEdBQUtFLE9KaEpDLFFJZ0pvQkYsR0FBSzJCLElBUTNDLFFBUEEzQixHQUFLTyxNQUFRUCxHQUFLMkIsSUFBWUMsT0pqSlosTUlrSmxCNUIsR0FBS0ssSUFBV3dCLEtBQUssU0FBQUMsSUFBQUE7QUFDcEIsUUpuSmlCLFFJbUpiQSxNSm5KYSxRSW1KSUEsR0FBS3ZCLElBQ3pCLFFBQVFQLEdBQUtPLE1BQVFQLEdBQUsyQixJQUFZQyxPQUFPRSxHQUFLdkI7RUFFcEQsQ0FBQSxHQUVPbUIsRUFBd0IxQixFQUFBQTtBQUVqQztBQTRCTyxTQUFTK0IsRUFBY0MsSUFBQUE7QUFBQUEsR0FBQUEsQ0FFMUJBLEdBQUNwQixRQUNEb0IsR0FBQ3BCLE1BQUFBLFNBQ0ZxQixFQUFjQyxLQUFLRixFQUFBQSxLQUFBQSxDQUNsQkcsRUFBT0MsU0FDVEMsS0FBZ0JqQixFQUFRa0Isd0JBRXhCRCxJQUFlakIsRUFBUWtCLHNCQUNOQyxHQUFPSixDQUFBQTtBQUUxQjtBQVNBLFNBQVNBLElBQUFBO0FBQ1IsTUFBQTtBQU1DLGFBTElILElBQ0hRLEtBQUksR0FJRVAsRUFBYzNCLFNBT2hCMkIsR0FBYzNCLFNBQVNrQyxNQUMxQlAsRUFBY1EsS0FBS0MsQ0FBQUEsR0FHcEJWLEtBQUlDLEVBQWNVLE1BQUFBLEdBQ2xCSCxLQUFJUCxFQUFjM0IsUUFFbEJHLEVBQWdCdUIsRUFBQUE7RUFJbEIsVUFGQztBQUNBQyxNQUFjM0IsU0FBUzZCLEVBQU9DLE1BQWtCO0VBQ2pEO0FBQ0Q7QUcxTWdCLFNBQUFRLEVBQ2ZDLElBQ0FDLElBQ0FDLElBQ0FDLElBQ0FDLElBQ0FDLElBQ0FDLElBQ0FuQyxJQUNBRCxJQUNBcUMsSUFDQW5DLElBQUFBO0FBWGUsTUFhWG9DLElBRUh4QyxJQUVBeUMsSUFFQUMsSUFFQUMsSUE4QklDLElBOEJBQyxJQXZEREMsS0FBZVgsTUFBa0JBLEdBQWMzQyxPQUFldUQsR0FFOURDLEtBQW9CZixHQUFheEM7QUFVckMsT0FSQVMsS0FBUytDLEVBQ1JmLElBQ0FELElBQ0FhLElBQ0E1QyxJQUNBOEMsRUFBQUEsR0FHSVIsS0FBSSxHQUFHQSxLQUFJUSxJQUFtQlIsS1BoRWhCLFVPaUVsQkMsS0FBYVAsR0FBYzFDLElBQVdnRCxFQUFBQSxPQUt0Q3hDLEtBQUFBLE1BQ0V5QyxHQUFVbkQsT0FBaUJ3RCxHQUFZTCxHQUFVbkQsR0FBQUEsS0FBYTRELEdBR2hFVCxHQUFVbkQsTUFBVWtELElBR2hCSSxLQUFTcEMsRUFDWndCLElBQ0FTLElBQ0F6QyxJQUNBb0MsSUFDQUMsSUFDQUMsSUFDQW5DLElBQ0FELElBQ0FxQyxJQUNBbkMsRUFBQUEsR0FJRHNDLEtBQVNELEdBQVUvQyxLQUNmK0MsR0FBV1UsT0FBT25ELEdBQVNtRCxPQUFPVixHQUFXVSxRQUM1Q25ELEdBQVNtRCxPQUNaQyxFQUFTcEQsR0FBU21ELEtQOUZGLE1POEZhVixFQUFBQSxHQUU5QnJDLEdBQVNpQixLQUNSb0IsR0FBV1UsS0FDWFYsR0FBVTNCLE9BQWU0QixJQUN6QkQsRUFBQUEsSVBuR2dCLFFPdUdkRSxNUHZHYyxRT3VHV0QsT0FDNUJDLEtBQWdCRCxNQUdiRyxLQUFBQSxDQUFBQSxFUHRIc0IsSU9zSExKLEdBQVU5QixTQUNaWCxHQUFRUixRQUFlaUQsR0FBVWpELE9BQ25EVSxLQUFTbUQsRUFBT1osSUFBWXZDLElBQVE4QixJQUFXYSxFQUFBQSxHQU0zQ0EsTUFBZTdDLEdBQVFOLFFBQzFCTSxHQUFRTixNUHBIUSxTT3NIbUIsY0FBQSxPQUFuQitDLEdBQVc5QyxRQUFBQSxXQUFzQmlELEtBQ2xEMUMsS0FBUzBDLEtBQ0NGLE9BQ1Z4QyxLQUFTd0MsR0FBT1ksY0FJakJiLEdBQVU5QixPQUFBQTtBQUtYLFNBRkF1QixHQUFjeEMsTUFBUWlELElBRWZ6QztBQUNSO0FBT0EsU0FBUytDLEVBQ1JmLElBQ0FELElBQ0FhLElBQ0E1QyxJQUNBOEMsSUFBQUE7QUFMRCxNQVFLUixJQUVBQyxJQUVBekMsSUE4REd1RCxJQU9BQyxJQW5FSEMsS0FBb0JYLEdBQVlyRCxRQUNuQ2lFLEtBQXVCRCxJQUVwQkUsS0FBTztBQUdYLE9BREF6QixHQUFjMUMsTUFBYSxJQUFJb0UsTUFBTVosRUFBQUEsR0FDaENSLEtBQUksR0FBR0EsS0FBSVEsSUFBbUJSLEtQOUpoQixVT2lLbEJDLEtBQWFSLEdBQWFPLEVBQUFBLE1BSUosYUFBQSxPQUFkQyxNQUNjLGNBQUEsT0FBZEEsTUFTYyxZQUFBLE9BQWRBLE1BQ2MsWUFBQSxPQUFkQSxNQUVjLFlBQUEsT0FBZEEsTUFDUEEsR0FBV29CLGVBQWVDLFNBRTFCckIsS0FBYVAsR0FBYzFDLElBQVdnRCxFQUFBQSxJQUFLdUIsRVByTDFCLE1PdUxoQnRCLElQdkxnQixNQUFBLE1BQUEsSUFBQSxJTzRMUHVCLEVBQVF2QixFQUFBQSxJQUNsQkEsS0FBYVAsR0FBYzFDLElBQVdnRCxFQUFBQSxJQUFLdUIsRUFDMUNuRixHQUNBLEVBQUVFLFVBQVUyRCxHQUFBQSxHUC9MSSxNQUFBLE1BQUEsSUFBQSxJQUFBLFdPb01QQSxHQUFXb0IsZUFBNkJwQixHQUFVd0IsTUFBVSxJQUt0RXhCLEtBQWFQLEdBQWMxQyxJQUFXZ0QsRUFBQUEsSUFBS3VCLEVBQzFDdEIsR0FBVzlDLE1BQ1g4QyxHQUFXNUQsT0FDWDRELEdBQVd5QixLQUNYekIsR0FBV1UsTUFBTVYsR0FBV1UsTVA3TVosTU84TWhCVixHQUFVeEMsR0FBQUEsSUFHWGlDLEdBQWMxQyxJQUFXZ0QsRUFBQUEsSUFBS0MsSUFHekJjLEtBQWNmLEtBQUltQixJQUN4QmxCLEdBQVVwRCxLQUFXNkMsSUFDckJPLEdBQVV3QixNQUFVL0IsR0FBYytCLE1BQVUsR0FZNUNqRSxLUGxPa0IsTUFBQSxPTzJOWndELEtBQWlCZixHQUFVbkQsTUFBVTZFLEVBQzFDMUIsSUFDQUssSUFDQVMsSUFDQUcsRUFBQUEsT0FNQUEsT0FEQTFELEtBQVc4QyxHQUFZVSxFQUFBQSxPQUd0QnhELEdBQVFXLE9QaFBXLEtBU0gsUU84T0NYLE1QOU9ELFFPOE9xQkEsR0FBUUMsT0FBQUEsTUFHMUN1RCxPQWVDUixLQUFvQlMsS0FDdkJFLE9BQ1VYLEtBQW9CUyxNQUM5QkUsT0FLNEIsY0FBQSxPQUFuQmxCLEdBQVc5QyxTQUNyQjhDLEdBQVU5QixPUHBSYyxNT3NSZjZDLE1BQWlCRCxPQWlCdkJDLE1BQWlCRCxLQUFjLElBQ2xDSSxPQUNVSCxNQUFpQkQsS0FBYyxJQUN6Q0ksUUFFSUgsS0FBZ0JELEtBQ25CSSxPQUVBQSxNQU1EbEIsR0FBVTlCLE9QclRjLE9PbUx6QnVCLEdBQWMxQyxJQUFXZ0QsRUFBQUEsSVB4S1I7QU9tVG5CLE1BQUlrQixHQUNILE1BQUtsQixLQUFJLEdBQUdBLEtBQUlpQixJQUFtQmpCLEtQcFRqQixVT3FUakJ4QyxLQUFXOEMsR0FBWU4sRUFBQUEsTUFDZ0MsTVAvVG5DLElPK1RLeEMsR0FBUVcsU0FDNUJYLEdBQVFOLE9BQVNRLE9BQ3BCQSxLQUFTaEIsRUFBY2MsRUFBQUEsSUFHeEJvRSxFQUFRcEUsSUFBVUEsRUFBQUE7QUFLckIsU0FBT0U7QUFDUjtBQVNBLFNBQVNtRCxFQUFPZ0IsSUFBYW5FLElBQVE4QixJQUFXYSxJQUFBQTtBQUFoRCxNQUlNL0QsSUFDSzBEO0FBRlYsTUFBK0IsY0FBQSxPQUFwQjZCLEdBQVkxRSxNQUFvQjtBQUUxQyxTQURJYixLQUFXdUYsR0FBVzdFLEtBQ2pCZ0QsS0FBSSxHQUFHMUQsTUFBWTBELEtBQUkxRCxHQUFTVyxRQUFRK0MsS0FDNUMxRCxDQUFBQSxHQUFTMEQsRUFBQUEsTUFLWjFELEdBQVMwRCxFQUFBQSxFQUFFbkQsS0FBV2dGLElBQ3RCbkUsS0FBU21ELEVBQU92RSxHQUFTMEQsRUFBQUEsR0FBSXRDLElBQVE4QixJQUFXYSxFQUFBQTtBQUlsRCxXQUFPM0M7RUFDUjtBQUFXbUUsRUFBQUEsR0FBVzNFLE9BQVNRLE9BQzFCMkMsT0FDQzNDLE1BQVVtRSxHQUFZMUUsUUFBQUEsQ0FBU08sR0FBT29FLGVBQ3pDcEUsS0FBU2hCLEVBQWNtRixFQUFBQSxJQUV4QnJDLEdBQVV1QyxhQUFhRixHQUFXM0UsS0FBT1EsTVBoV3hCLElBQUEsSU9rV2xCQSxLQUFTbUUsR0FBVzNFO0FBR3JCLEtBQUE7QUFDQ1EsSUFBQUEsS0FBU0EsTUFBVUEsR0FBT29EO0VBQUFBLFNQdFdSLFFPdVdWcEQsTUFBcUMsS0FBbkJBLEdBQU9zRTtBQUVsQyxTQUFPdEU7QUFDUjtBQTRCQSxTQUFTdUUsRUFDUkMsSUFDQUMsSUFDQUMsSUFDQUMsSUFBQUE7QUFKRCxNQWdDTUMsSUFDQUMsSUFFR0MsSUE3QkZDLEtBQU1QLEdBQVdPLEtBQ2pCQyxLQUFPUixHQUFXUSxNQUNwQkMsS0FBV1IsR0FBWUMsRUFBQUEsR0FDckJRLEtQL1lhLFFPK1lIRCxNQUFtRCxNUHhaN0MsSU93WmVBLEdBQVFFO0FBaUI3QyxNUGhhbUIsU09pYWpCRixNQUE0QixRQUFQRixNQUNyQkcsTUFBV0gsTUFBT0UsR0FBU0YsT0FBT0MsTUFBUUMsR0FBU0QsS0FFcEQsUUFBT047QUFBQUEsTUFOUEMsTUFBd0JPLEtBQVUsSUFBSTtBQVV0QyxTQUZJTixLQUFJRixLQUFjLEdBQ2xCRyxLQUFJSCxLQUFjLEdBQ2ZFLE1BQUssS0FBS0MsS0FBSUosR0FBWVcsU0FHaEMsS1AzYWlCLFNPMGFqQkgsS0FBV1IsR0FETEssS0FBYUYsTUFBSyxJQUFJQSxPQUFNQyxJQUFBQSxNQUlGLE1QdGJaLElPc2JsQkksR0FBUUUsUUFDVEosTUFBT0UsR0FBU0YsT0FDaEJDLE1BQVFDLEdBQVNELEtBRWpCLFFBQU9GOztBQUtWLFNBQUE7QUFDRDtBRnpiQSxTQUFTTyxFQUFTQyxJQUFPUCxJQUFLUSxJQUFBQTtBQUNmLFNBQVZSLEdBQUksQ0FBQSxJQUNQTyxHQUFNRSxZQUFZVCxJTEFBLFFLQUtRLEtBQWdCLEtBQUtBLEVBQUFBLElBRTVDRCxHQUFNUCxFQUFBQSxJTEZZLFFLQ1JRLEtBQ0csS0FDYSxZQUFBLE9BQVRBLE1BQXFCRSxFQUFtQkMsS0FBS1gsRUFBQUEsSUFDakRRLEtBRUFBLEtBQVE7QUFFdkI7QUFBQSxTQXlCZ0JDLEVBQVlHLElBQUtDLElBQU1MLElBQU9NLElBQVVDLElBQUFBO0FBQUFBLE1BQ25EQyxJQThCR0M7QUE1QlBDLElBQUcsS0FBWSxXQUFSTCxHQUNOLEtBQW9CLFlBQUEsT0FBVEwsR0FDVkksQ0FBQUEsR0FBSUwsTUFBTVksVUFBVVg7T0FDZDtBQUtOLFFBSnVCLFlBQUEsT0FBWk0sT0FDVkYsR0FBSUwsTUFBTVksVUFBVUwsS0FBVyxLQUc1QkEsR0FDSCxNQUFLRCxNQUFRQyxHQUNOTixDQUFBQSxNQUFTSyxNQUFRTCxNQUN0QkYsRUFBU00sR0FBSUwsT0FBT00sSUFBTSxFQUFBO0FBSzdCLFFBQUlMLEdBQ0gsTUFBS0ssTUFBUUwsR0FDUE0sQ0FBQUEsTUFBWU4sR0FBTUssRUFBQUEsS0FBU0MsR0FBU0QsRUFBQUEsS0FDeENQLEVBQVNNLEdBQUlMLE9BQU9NLElBQU1MLEdBQU1LLEVBQUFBLENBQUFBO0VBSXBDO1dBR21CLE9BQVhBLEdBQUssQ0FBQSxLQUF3QixPQUFYQSxHQUFLLENBQUEsRUFDL0JHLENBQUFBLEtBQWFILE9BQVNBLEtBQU9BLEdBQUtPLFFBQVFDLEdBQWUsSUFBQSxJQUNuREosS0FBZ0JKLEdBQUtTLFlBQUFBLEdBSTFCVCxLQURHSSxNQUFpQkwsTUFBZSxnQkFBUkMsTUFBZ0MsZUFBUkEsS0FDNUNJLEdBQWNNLE1BQU0sQ0FBQSxJQUNoQlYsR0FBS1UsTUFBTSxDQUFBLEdBRWxCWCxHQUFHWSxNQUFhWixHQUFHWSxJQUFjLENBQUEsSUFDdENaLEdBQUdZLEVBQVlYLEtBQU9HLEVBQUFBLElBQWNSLElBRWhDQSxLQUNFTSxLQVFKTixHQUFNaUIsQ0FBQUEsSUFBa0JYLEdBQVNXLENBQUFBLEtBUGpDakIsR0FBTWlCLENBQUFBLElBQWtCQyxHQUN4QmQsR0FBSWUsaUJBQ0hkLElBQ0FHLEtBQWFZLElBQW9CQyxHQUNqQ2IsRUFBQUEsS0FNRkosR0FBSWtCLG9CQUNIakIsSUFDQUcsS0FBYVksSUFBb0JDLEdBQ2pDYixFQUFBQTtPQUdJO0FBQ04sUUxqRzJCLGdDS2lHdkJELEdBSUhGLENBQUFBLEtBQU9BLEdBQUtPLFFBQVEsZUFBZSxHQUFBLEVBQUtBLFFBQVEsVUFBVSxHQUFBO2FBRWxELFdBQVJQLE1BQ1EsWUFBUkEsTUFDUSxVQUFSQSxNQUNRLFVBQVJBLE1BQ1EsVUFBUkEsTUFHUSxjQUFSQSxNQUNRLGNBQVJBLE1BQ1EsYUFBUkEsTUFDUSxhQUFSQSxNQUNRLFVBQVJBLE1BQ1EsYUFBUkEsTUFDQUEsTUFBUUQsR0FFUixLQUFBO0FBQ0NBLE1BQUFBLEdBQUlDLEVBQUFBLElMbkhZLFFLbUhKTCxLQUFnQixLQUFLQTtBQUVqQyxZQUFNVTtJQUNLLFNBQUhhLElBQUFBO0lBQUc7QUFVTyxrQkFBQSxPQUFUdkIsT0xoSU8sUUtrSVBBLE1BQUFBLFVBQWtCQSxNQUE4QixPQUFYSyxHQUFLLENBQUEsSUFHcERELEdBQUlvQixnQkFBZ0JuQixFQUFBQSxJQUZwQkQsR0FBSXFCLGFBQWFwQixJQUFjLGFBQVJBLE1BQThCLEtBQVRMLEtBQWdCLEtBQUtBLEVBQUFBO0VBSW5FO0FBQ0Q7QUFPQSxTQUFTMEIsRUFBaUJsQixJQUFBQTtBQU16QixTQUFBLFNBQWlCZSxJQUFBQTtBQUNoQixRQUFJSSxLQUFJWCxHQUFhO0FBQ3BCLFVBQU1ZLEtBQWVELEtBQUlYLEVBQVlPLEdBQUU5QixPQUFPZSxFQUFBQTtBQUM5QyxVTHhKaUIsUUt3SmJlLEdBQUVNLENBQUFBLEVBQ0xOLENBQUFBLEdBQUVNLENBQUFBLElBQW9CWDtlQUtaSyxHQUFFTSxDQUFBQSxJQUFvQkQsR0FBYVgsQ0FBQUEsRUFDN0M7QUFFRCxhQUFPVyxHQUFhRSxFQUFRQyxRQUFRRCxFQUFRQyxNQUFNUixFQUFBQSxJQUFLQSxFQUFBQTtJQUN4RDtFQUNEO0FBQ0Q7QUduSWdCLFNBQUFTLEVBQ2ZDLElBQ0FDLElBQ0F4QyxJQUNBeUMsSUFDQTVCLElBQ0E2QixJQUNBQyxJQUNBQyxJQUNBQyxJQUNBQyxJQUFBQTtBQVZlLE1BYVhDLElBaUJDQyxJQUVDQyxJQUFHQyxJQUFPQyxJQUFVQyxJQUFVQyxJQUFVQyxJQUN4Q0MsSUFDRUMsR0FLRkMsSUFDQUMsSUFpSUFDLElBQ0hDLElBa0NHQyxJQXFET0MsSUFuUFpDLEtBQVV2QixHQUFTekM7QUFJcEIsTUFBQSxXQUFJeUMsR0FBU3dCLFlBQTJCLFFSbkRyQjtBQWJVLFFRbUV6QmhFLEdBQVFFLFFBQ1gyQyxLQUFBQSxDQUFBQSxFUnRFMEIsS1FzRVQ3QyxHQUFRRSxNQUV6QndDLEtBQW9CLENBRHBCRSxLQUFTSixHQUFReUIsTUFBUWpFLEdBQVFpRSxHQUFBQSxLQUk3QmxCLEtBQU1YLEVBQU84QixRQUFTbkIsR0FBSVAsRUFBQUE7QUFFL0IyQixJQUFPLEtBQXNCLGNBQUEsT0FBWEosSUFBdUI7QUFDcENmLElBQUFBLEtBQXVCTCxHQUFZeEM7QUFDdkMsUUFBQTtBQStEQyxVQTdESW9ELEtBQVdmLEdBQVM0QixPQUNsQlosSUFBbUJPLEdBQVFNLGFBQWFOLEdBQVFNLFVBQVVDLFFBSzVEYixNQURKVixLQUFNZ0IsR0FBUVEsZ0JBQ1E5QixHQUFjTSxHQUFHeUIsR0FBQUEsR0FDbkNkLEtBQW1CWCxLQUNwQlUsS0FDQ0EsR0FBU1csTUFBTTlELFFBQ2Z5QyxHQUFHMEIsS0FDSmhDLElBR0N6QyxHQUFRd0UsTUFFWGxCLE1BREFMLEtBQUlULEdBQVFnQyxNQUFjeEUsR0FBUXdFLEtBQ05DLEtBQXdCeEIsR0FBQ3lCLE9BR2pEbEIsSUFFSGhCLEdBQVFnQyxNQUFjdkIsS0FBSSxJQUFJYyxHQUFRUixJQUFVRyxFQUFBQSxLQUdoRGxCLEdBQVFnQyxNQUFjdkIsS0FBSSxJQUFJMEIsRUFDN0JwQixJQUNBRyxFQUFBQSxHQUVEVCxHQUFFZSxjQUFjRCxJQUNoQmQsR0FBRXFCLFNBQVNNLElBRVJuQixNQUFVQSxHQUFTb0IsSUFBSTVCLEVBQUFBLEdBRXRCQSxHQUFFNkIsVUFBTzdCLEdBQUU2QixRQUFRLENBQUUsSUFDMUI3QixHQUFDOEIsTUFBa0J0QyxJQUNuQlMsS0FBUUQsR0FBQytCLE1BQUFBLE1BQ1QvQixHQUFDZ0MsTUFBb0IsQ0FBQSxHQUNyQmhDLEdBQUNpQyxNQUFtQixDQUFBLElBSWpCMUIsS1IzR2EsUVEyR09QLEdBQUNrQyxRQUN4QmxDLEdBQUNrQyxNQUFjbEMsR0FBRTZCLFFBR2R0QixLUi9HYSxRUStHT08sR0FBUXFCLDZCQUMzQm5DLEdBQUNrQyxPQUFlbEMsR0FBRTZCLFVBQ3JCN0IsR0FBQ2tDLE1BQWNFLEVBQU8sQ0FBQSxHQUFJcEMsR0FBQ2tDLEdBQUFBLElBRzVCRSxFQUNDcEMsR0FBQ2tDLEtBQ0RwQixHQUFRcUIseUJBQXlCN0IsSUFBVU4sR0FBQ2tDLEdBQUFBLENBQUFBLElBSTlDaEMsS0FBV0YsR0FBRW1CLE9BQ2JoQixLQUFXSCxHQUFFNkIsT0FDYjdCLEdBQUNxQyxNQUFVOUMsSUFHUFUsR0FFRk0sTVJqSWUsUVFrSWZPLEdBQVFxQiw0QlJsSU8sUVFtSWZuQyxHQUFFc0Msc0JBRUZ0QyxHQUFFc0MsbUJBQUFBLEdBR0MvQixLUnhJWSxRUXdJUVAsR0FBRXVDLHFCQUN6QnZDLEdBQUNnQyxJQUFrQlEsS0FBS3hDLEdBQUV1QyxpQkFBQUE7V0FFckI7QUFVTixZQVJDaEMsS1I3SWUsUVE4SWZPLEdBQVFxQiw0QkFDUjdCLE9BQWFKLE1SL0lFLFFRZ0pmRixHQUFFeUMsNkJBRUZ6QyxHQUFFeUMsMEJBQTBCbkMsSUFBVUcsRUFBQUEsR0FJdENsQixHQUFROEMsT0FBY3RGLEdBQVFzRixPQUFBQSxDQUM1QnJDLEdBQUNnQixPUnZKWSxRUXdKZGhCLEdBQUUwQyx5QkFBQUEsVUFDRjFDLEdBQUUwQyxzQkFDRHBDLElBQ0FOLEdBQUNrQyxLQUNEekIsRUFBQUEsR0FFRDtBQUVHbEIsVUFBQUEsR0FBUThDLE9BQWN0RixHQUFRc0YsUUFLakNyQyxHQUFFbUIsUUFBUWIsSUFDVk4sR0FBRTZCLFFBQVE3QixHQUFDa0MsS0FDWGxDLEdBQUMrQixNQUFBQSxRQUdGeEMsR0FBUXlCLE1BQVFqRSxHQUFRaUUsS0FDeEJ6QixHQUFRb0QsTUFBYTVGLEdBQVE0RixLQUM3QnBELEdBQVFvRCxJQUFXQyxLQUFLLFNBQUFDLElBQUFBO0FBQ25CQSxZQUFBQSxPQUFPQSxHQUFLckIsS0FBV2pDO1VBQzVCLENBQUEsR0FFQXVELEVBQVVOLEtBQUtPLE1BQU0vQyxHQUFDZ0MsS0FBbUJoQyxHQUFDaUMsR0FBQUEsR0FDMUNqQyxHQUFDaUMsTUFBbUIsQ0FBQSxHQUVoQmpDLEdBQUNnQyxJQUFrQjlFLFVBQ3RCd0MsR0FBWThDLEtBQUt4QyxFQUFBQTtBQUdsQixnQkFBTWtCO1FBQ1A7QVJ4TGdCLGdCUTBMWmxCLEdBQUVnRCx1QkFDTGhELEdBQUVnRCxvQkFBb0IxQyxJQUFVTixHQUFDa0MsS0FBYXpCLEVBQUFBLEdBRzNDRixLUjlMWSxRUThMUVAsR0FBRWlELHNCQUN6QmpELEdBQUNnQyxJQUFrQlEsS0FBSyxXQUFBO0FBQ3ZCeEMsVUFBQUEsR0FBRWlELG1CQUFtQi9DLElBQVVDLElBQVVDLEVBQUFBO1FBQzFDLENBQUE7TUFFRjtBQVNBLFVBUEFKLEdBQUVrRCxVQUFVekMsSUFDWlQsR0FBRW1CLFFBQVFiLElBQ1ZOLEdBQUNtRCxNQUFjN0QsSUFDZlUsR0FBQ2dCLE1BQUFBLE9BRUdOLEtBQWF2QixFQUFPaUUsS0FDdkJ6QyxLQUFRLEdBQ0xKLEVBQ0hQLENBQUFBLEdBQUU2QixRQUFRN0IsR0FBQ2tDLEtBQ1hsQyxHQUFDK0IsTUFBQUEsT0FFR3JCLE1BQVlBLEdBQVduQixFQUFBQSxHQUUzQk8sS0FBTUUsR0FBRXFCLE9BQU9yQixHQUFFbUIsT0FBT25CLEdBQUU2QixPQUFPN0IsR0FBRWtELE9BQUFBLEdBRW5DSixFQUFVTixLQUFLTyxNQUFNL0MsR0FBQ2dDLEtBQW1CaEMsR0FBQ2lDLEdBQUFBLEdBQzFDakMsR0FBQ2lDLE1BQW1CLENBQUE7VUFFcEIsSUFBQTtBQUNDakMsUUFBQUEsR0FBQytCLE1BQUFBLE9BQ0dyQixNQUFZQSxHQUFXbkIsRUFBQUEsR0FFM0JPLEtBQU1FLEdBQUVxQixPQUFPckIsR0FBRW1CLE9BQU9uQixHQUFFNkIsT0FBTzdCLEdBQUVrRCxPQUFBQSxHQUduQ2xELEdBQUU2QixRQUFRN0IsR0FBQ2tDO01BQUFBLFNBQ0hsQyxHQUFDK0IsT0FBQUEsRUFBYXBCLEtBQVE7QUFJaENYLE1BQUFBLEdBQUU2QixRQUFRN0IsR0FBQ2tDLEtSbk9NLFFRcU9ibEMsR0FBRXFELG9CQUNMN0QsS0FBZ0I0QyxFQUFPQSxFQUFPLENBQUEsR0FBSTVDLEVBQUFBLEdBQWdCUSxHQUFFcUQsZ0JBQUFBLENBQUFBLElBR2pEOUMsS0FBQUEsQ0FBcUJOLE1Sek9SLFFReU9pQkQsR0FBRXNELDRCQUNuQ2xELEtBQVdKLEdBQUVzRCx3QkFBd0JwRCxJQUFVQyxFQUFBQSxJQUc1Q1MsS1I3T2EsUVE4T2hCZCxNQUFlQSxHQUFJaEQsU0FBU3lHLEtSOU9aLFFROE93QnpELEdBQUlqRCxNQUN6QzJHLEVBQVUxRCxHQUFJcUIsTUFBTXNDLFFBQUFBLElBQ3BCM0QsSUFFSkgsS0FBUytELEVBQ1JwRSxJQUNBcUUsRUFBUS9DLEVBQUFBLElBQWdCQSxLQUFlLENBQUNBLEVBQUFBLEdBQ3hDckIsSUFDQXhDLElBQ0F5QyxJQUNBNUIsSUFDQTZCLElBQ0FDLElBQ0FDLElBQ0FDLElBQ0FDLEVBQUFBLEdBR0RHLEdBQUU0RCxPQUFPckUsR0FBUXlCLEtBR2pCekIsR0FBUXRDLE9BQUFBLE1BRUorQyxHQUFDZ0MsSUFBa0I5RSxVQUN0QndDLEdBQVk4QyxLQUFLeEMsRUFBQUEsR0FHZEssT0FDSEwsR0FBQ3lCLE1BQWlCekIsR0FBQ3dCLEtSMVFIO0lRZ1RsQixTQXBDUzVDLElBQUFBO0FBT1IsVUFIQWMsR0FBWXhDLFNBQVM2QyxJQUNyQlIsR0FBUThDLE1SalJTLE1RbVJiekMsTVJuUmEsUVFtUkVILElBQUFBO0FBQ2xCLFlBQUliLEdBQUVpRixNQUFNO0FBS1gsZUFKQXRFLEdBQVF0QyxPQUFXMkMsS0FDaEJrRSxNUm5Tc0IsS1FzU2xCbkUsTUFBNkIsS0FBbkJBLEdBQU9vRSxZQUFpQnBFLEdBQU9xRSxjQUMvQ3JFLENBQUFBLEtBQVNBLEdBQU9xRTtBUjFSRixrQlE2Ulh2RSxPQUNIQSxHQUFrQkEsR0FBa0J3RSxRQUFRdEUsRUFBQUEsQ0FBQUEsSVI5UjlCLE9RZ1NmSixHQUFReUIsTUFBUXJCO1FBQ2pCLFdSalNnQixRUWlTTEYsR0FDVixNQUFTb0IsS0FBSXBCLEdBQWtCdkMsUUFBUTJELE9BQ3RDcUQsR0FBV3pFLEdBQWtCb0IsRUFBQUEsQ0FBQUE7TUFBQUEsTUFJL0J0QixDQUFBQSxHQUFReUIsTUFBUWpFLEdBQVFpRTtBUnZTUixjUTBTYnpCLEdBQVFvRCxRQUNYcEQsR0FBUW9ELE1BQWE1RixHQUFRNEYsT0FBYyxDQUFBLElBR3ZDL0QsR0FBRWlGLFFBQU1NLEVBQVk1RSxFQUFBQSxHQUN6QkosRUFBTzZCLElBQWFwQyxJQUFHVyxJQUFVeEMsRUFBQUE7SUFDbEM7RUFDRCxNUmpUbUIsU1FrVGxCMEMsTUFDQUYsR0FBUThDLE9BQWN0RixHQUFRc0YsT0FFOUI5QyxHQUFRb0QsTUFBYTVGLEdBQVE0RixLQUM3QnBELEdBQVF5QixNQUFRakUsR0FBUWlFLE9BRXhCckIsS0FBU0osR0FBUXlCLE1BQVFvRCxFQUN4QnJILEdBQVFpRSxLQUNSekIsSUFDQXhDLElBQ0F5QyxJQUNBNUIsSUFDQTZCLElBQ0FDLElBQ0FFLElBQ0FDLEVBQUFBO0FBTUYsVUFGS0MsS0FBTVgsRUFBUWtGLFdBQVN2RSxHQUFJUCxFQUFBQSxHUmxWSCxNUW9WdEJBLEdBQVF0QyxNQUFBQSxTQUF1QzBDO0FBQ3ZEO0FBRUEsU0FBU3dFLEVBQVl0QixJQUFBQTtBQUNoQkEsRUFBQUEsT0FDQ0EsR0FBS3RCLFFBQWFzQixHQUFLdEIsSUFBQVAsTUFBQUEsT0FDdkI2QixHQUFLRixPQUFZRSxHQUFLRixJQUFXQyxLQUFLdUIsQ0FBQUE7QUFFNUM7QUFBQSxTQU9nQkcsRUFBVzVFLElBQWE2RSxJQUFNMUUsSUFBQUE7QUFDN0MsV0FBU2dCLEtBQUksR0FBR0EsS0FBSWhCLEdBQVMzQyxRQUFRMkQsS0FDcEMyRCxHQUFTM0UsR0FBU2dCLEVBQUFBLEdBQUloQixHQUFBQSxFQUFXZ0IsRUFBQUEsR0FBSWhCLEdBQUFBLEVBQVdnQixFQUFBQSxDQUFBQTtBQUc3QzFCLElBQU9vQyxPQUFVcEMsRUFBT29DLElBQVNnRCxJQUFNN0UsRUFBQUEsR0FFM0NBLEdBQVlrRCxLQUFLLFNBQUE1QyxJQUFBQTtBQUNoQixRQUFBO0FBRUNOLE1BQUFBLEtBQWNNLEdBQUNnQyxLQUNmaEMsR0FBQ2dDLE1BQW9CLENBQUEsR0FDckJ0QyxHQUFZa0QsS0FBSyxTQUFBNkIsSUFBQUE7QUFFaEJBLFFBQUFBLEdBQUdDLEtBQUsxRSxFQUFBQTtNQUNULENBQUE7SUFHRCxTQUZTcEIsSUFBQUE7QUFDUk8sUUFBTzZCLElBQWFwQyxJQUFHb0IsR0FBQ3FDLEdBQUFBO0lBQ3pCO0VBQ0QsQ0FBQTtBQUNEO0FBRUEsU0FBU21CLEVBQVVtQixJQUFBQTtBQUNsQixTQUFtQixZQUFBLE9BQVJBLE1SN1dRLFFRNldZQSxNQUFnQkEsR0FBSTFELE1BQVUsSUFDckQwRCxLQUdKaEIsRUFBUWdCLEVBQUFBLElBQ0pBLEdBQUtDLElBQUlwQixDQUFBQSxJQUFBQSxXQUdibUIsR0FBSzVELGNBQXNDLE9BRXhDcUIsRUFBTyxDQUFFLEdBQUV1QyxFQUFBQTtBQUNuQjtBQWlCQSxTQUFTUCxFQUNSM0csSUFDQThCLElBQ0F4QyxJQUNBeUMsSUFDQTVCLElBQ0E2QixJQUNBQyxJQUNBRSxJQUNBQyxJQUFBQTtBQVRELE1BZUtnQixJQUVBZ0UsSUFFQUMsSUFFQUMsSUFDQTFILElBQ0EySCxJQUNBQyxJQWJBL0UsS0FBV25ELEdBQVNvRSxTQUFTK0QsR0FDN0I1RSxLQUFXZixHQUFTNEIsT0FDcEI0QyxLQUFrQ3hFLEdBQVN6QztBQWtCL0MsTUFKZ0IsU0FBWmlILEtBQW1CbkcsS1J4YUssK0JReWFQLFVBQVptRyxLQUFvQm5HLEtSdmFBLHVDUXdhbkJBLE9BQVdBLEtSemFTLGlDQUdYLFFRd2FmNkI7QUFDSCxTQUFLb0IsS0FBSSxHQUFHQSxLQUFJcEIsR0FBa0J2QyxRQUFRMkQsS0FNekMsTUFMQXhELEtBQVFvQyxHQUFrQm9CLEVBQUFBLE1BT3pCLGtCQUFrQnhELE1BQUFBLENBQUFBLENBQVcwRyxPQUM1QkEsS0FBVzFHLEdBQU04SCxhQUFhcEIsS0FBNkIsS0FBbEIxRyxHQUFNMEcsV0FDL0M7QUFDRHRHLE1BQUFBLEtBQU1KLElBQ05vQyxHQUFrQm9CLEVBQUFBLElScmJGO0FRc2JoQjtJQUNEOztBQUlGLE1SM2JtQixRUTJiZnBELElBQWE7QUFDaEIsUVI1YmtCLFFRNGJkc0csR0FDSCxRQUFPcUIsU0FBU0MsZUFBZS9FLEVBQUFBO0FBR2hDN0MsSUFBQUEsS0FBTTJILFNBQVNFLGdCQUNkMUgsSUFDQW1HLElBQ0F6RCxHQUFTaUYsTUFBTWpGLEVBQUFBLEdBS1pWLE9BQ0NULEVBQU9xRyxPQUNWckcsRUFBT3FHLElBQW9CakcsSUFBVUUsRUFBQUEsR0FDdENHLEtBQUFBLFFBR0RILEtSOWNrQjtFUStjbkI7QUFFQSxNUmpkbUIsUVFpZGZzRSxHQUVDN0QsQ0FBQUEsT0FBYUksTUFBY1YsTUFBZW5DLEdBQUlnSSxRQUFRbkYsT0FDekQ3QyxHQUFJZ0ksT0FBT25GO09BRU47QUFVTixRQVJBYixLQUNhLGNBQVpzRSxNUnpkaUIsUVF5ZFN6RCxHQUFTb0YsZVJ6ZGxCLE9RMmRkakcsTUFBcUJyQixFQUFNc0csS0FBS2pILEdBQUlrSSxVQUFBQSxHQUFBQSxDQUtuQy9GLE1SaGVhLFFRZ2VFSCxHQUVuQixNQURBUyxLQUFXLENBQUEsR0FDTlcsS0FBSSxHQUFHQSxLQUFJcEQsR0FBSW1JLFdBQVcxSSxRQUFRMkQsS0FFdENYLENBQUFBLElBREE3QyxLQUFRSSxHQUFJbUksV0FBVy9FLEVBQUFBLEdBQ1JuRCxJQUFBQSxJQUFRTCxHQUFNQTtBQUkvQixTQUFLd0QsTUFBS1gsR0FDVDdDLENBQUFBLEtBQVE2QyxHQUFTVyxFQUFBQSxHQUNSLDZCQUFMQSxLQUNIaUUsS0FBVXpILEtBRUwsY0FBTHdELE1BQ0VBLE1BQUtQLE1BQ0EsV0FBTE8sTUFBZ0Isa0JBQWtCUCxNQUM3QixhQUFMTyxNQUFrQixvQkFBb0JQLE1BRXhDaEQsRUFBWUcsSUFBS29ELElSbGZELE1Ra2ZVeEQsSUFBT08sRUFBQUE7QUFNbkMsU0FBS2lELE1BQUtQLEdBQ1RqRCxDQUFBQSxLQUFRaUQsR0FBU08sRUFBQUEsR0FDUixjQUFMQSxLQUNIa0UsS0FBYzFILEtBQ0MsNkJBQUx3RCxLQUNWZ0UsS0FBVXhILEtBQ0ssV0FBTHdELEtBQ1ZtRSxLQUFhM0gsS0FDRSxhQUFMd0QsS0FDVm9FLEtBQVU1SCxLQUVSdUMsTUFBK0IsY0FBQSxPQUFUdkMsTUFDeEI2QyxHQUFTVyxFQUFBQSxNQUFPeEQsTUFFaEJDLEVBQVlHLElBQUtvRCxJQUFHeEQsSUFBTzZDLEdBQVNXLEVBQUFBLEdBQUlqRCxFQUFBQTtBQUsxQyxRQUFJaUgsR0FHRGpGLENBQUFBLE1BQ0NrRixPQUNBRCxHQUFPZ0IsVUFBV2YsR0FBT2UsVUFBV2hCLEdBQU9nQixVQUFXcEksR0FBSXFJLGVBRTVEckksR0FBSXFJLFlBQVlqQixHQUFPZ0IsU0FHeEJ0RyxHQUFRb0QsTUFBYSxDQUFBO2FBRWpCbUMsT0FBU3JILEdBQUlxSSxZQUFZLEtBRTdCcEMsRUFFa0IsY0FBakJuRSxHQUFTekMsT0FBcUJXLEdBQUlzSSxVQUFVdEksSUFDNUNrRyxFQUFRb0IsRUFBQUEsSUFBZUEsS0FBYyxDQUFDQSxFQUFBQSxHQUN0Q3hGLElBQ0F4QyxJQUNBeUMsSUFDWSxtQkFBWnVFLEtSbmlCMkIsaUNRbWlCcUJuRyxJQUNoRDZCLElBQ0FDLElBQ0FELEtBQ0dBLEdBQWtCLENBQUEsSUFDbEIxQyxHQUFRNEYsT0FBY3FELEVBQWNqSixJQUFVLENBQUEsR0FDakQ2QyxJQUNBQyxFQUFBQSxHUnZpQmdCLFFRMmlCYkosR0FDSCxNQUFLb0IsS0FBSXBCLEdBQWtCdkMsUUFBUTJELE9BQ2xDcUQsR0FBV3pFLEdBQWtCb0IsRUFBQUEsQ0FBQUE7QUFNM0JqQixJQUFBQSxNQUEyQixjQUFabUUsT0FDbkJsRCxLQUFJLFNBQ1ksY0FBWmtELE1ScmpCYSxRUXFqQmFpQixLQUM3QnZILEdBQUlvQixnQkFBZ0IsT0FBQSxJUnJqQkNvSCxRUXVqQnJCakIsT0FLQ0EsT0FBZXZILEdBQUlvRCxFQUFBQSxLQUNOLGNBQVprRCxNQUFBQSxDQUEyQmlCLE1BSWYsWUFBWmpCLE1BQXdCaUIsTUFBYzlFLEdBQVNXLEVBQUFBLE1BRWpEdkQsRUFBWUcsSUFBS29ELElBQUdtRSxJQUFZOUUsR0FBU1csRUFBQUEsR0FBSWpELEVBQUFBLEdBRzlDaUQsS0FBSSxXUnRrQmtCb0YsUVF1a0JsQmhCLE1BQXdCQSxNQUFXeEgsR0FBSW9ELEVBQUFBLEtBQzFDdkQsRUFBWUcsSUFBS29ELElBQUdvRSxJQUFTL0UsR0FBU1csRUFBQUEsR0FBSWpELEVBQUFBO0VBRzdDO0FBRUEsU0FBT0g7QUFDUjtBQVFnQixTQUFBK0csRUFBUzBCLElBQUs3SSxJQUFPd0YsSUFBQUE7QUFDcEMsTUFBQTtBQUNDLFFBQWtCLGNBQUEsT0FBUHFELElBQW1CO0FBQzdCLFVBQUlDLEtBQXVDLGNBQUEsT0FBaEJELEdBQUdqSjtBQUMxQmtKLE1BQUFBLE1BRUhELEdBQUdqSixJQUFBQSxHQUdDa0osTVJobUJZLFFRZ21CSzlJLE9BSXJCNkksR0FBR2pKLE1BQVlpSixHQUFJN0ksRUFBQUE7SUFFckIsTUFBTzZJLENBQUFBLEdBQUlFLFVBQVUvSTtFQUd0QixTQUZTdUIsSUFBQUE7QUFDUk8sTUFBTzZCLElBQWFwQyxJQUFHaUUsRUFBQUE7RUFDeEI7QUFDRDtBQVNnQixTQUFBd0QsRUFBUXhELElBQU95RCxJQUFhQyxJQUFBQTtBQUE1QixNQUNYQyxJQXNCTTNGO0FBYlYsTUFSSTFCLEVBQVFrSCxXQUFTbEgsRUFBUWtILFFBQVF4RCxFQUFBQSxJQUVoQzJELEtBQUkzRCxHQUFNcUQsU0FDVE0sR0FBRUosV0FBV0ksR0FBRUosV0FBV3ZELEdBQUs3QixPQUNuQ3dELEVBQVNnQyxJUnpuQlEsTVF5bkJDRixFQUFBQSxJUnpuQkQsU1E2bkJkRSxLQUFJM0QsR0FBS3RCLE1BQXNCO0FBQ25DLFFBQUlpRixHQUFFQyxxQkFDTCxLQUFBO0FBQ0NELE1BQUFBLEdBQUVDLHFCQUFBQTtJQUdILFNBRlM3SCxJQUFBQTtBQUNSTyxRQUFPNkIsSUFBYXBDLElBQUcwSCxFQUFBQTtJQUN4QjtBQUdERSxJQUFBQSxHQUFFNUMsT0FBTzRDLEdBQUNyRCxNQUFjcUQsR0FBQzFFLE1SdG9CUDtFUXVvQm5CO0FBRUEsTUFBSzBFLEtBQUkzRCxHQUFLRixJQUNiLE1BQVM5QixLQUFJLEdBQUdBLEtBQUkyRixHQUFFdEosUUFBUTJELEtBQ3pCMkYsQ0FBQUEsR0FBRTNGLEVBQUFBLEtBQ0x3RixFQUNDRyxHQUFFM0YsRUFBQUEsR0FDRnlGLElBQ0FDLE1BQW1DLGNBQUEsT0FBZDFELEdBQU0vRixJQUFBQTtBQU0xQnlKLEVBQUFBLE1BQ0pyQyxFQUFXckIsR0FBSzdCLEdBQUFBLEdBR2pCNkIsR0FBS3RCLE1BQWNzQixHQUFLckIsS0FBV3FCLEdBQUs3QixNQUFBQTtBQUN6QztBQUdBLFNBQVNXLEVBQVNSLElBQU9VLElBQU9xQixJQUFBQTtBQUMvQixTQUFBLEtBQVluQyxZQUFZSSxJQUFPK0IsRUFBQUE7QUFDaEM7QUNscUJnQixTQUFBN0IsRUFBT3dCLElBQU92RCxJQUFXb0gsSUFBQUE7QUFBekIsTUFXWDlHLElBT0E3QyxJQVFBMkMsSUFDSEc7QUF6QkdQLEVBQUFBLE1BQWE4RixhQUNoQjlGLEtBQVk4RixTQUFTdUIsa0JBR2xCeEgsRUFBT3FDLE1BQVFyQyxFQUFPcUMsR0FBT3FCLElBQU92RCxFQUFBQSxHQVlwQ3ZDLE1BUEE2QyxLQUFvQyxjQUFBLE9BQWY4RyxNVFJOLE9TaUJmQSxNQUFlQSxHQUFXL0QsT0FBZXJELEdBQVNxRCxLQU1sRGpELEtBQWMsQ0FBQSxHQUNqQkcsS0FBVyxDQUFBLEdBQ1pSLEVBQ0NDLElBUER1RCxNQUFBQSxDQUFXakQsTUFBZThHLE1BQWdCcEgsSUFBU3FELE1BQ2xEaUUsRUFBY3JELEdUcEJJLE1Tb0JZLENBQUNWLEVBQUFBLENBQUFBLEdBVS9COUYsTUFBWW1JLEdBQ1pBLEdBQ0E1RixHQUFVdUgsY0FBQUEsQ0FDVGpILE1BQWU4RyxLQUNiLENBQUNBLEVBQUFBLElBQ0QzSixLVG5DZSxPU3FDZHVDLEdBQVV3SCxhQUNUMUksRUFBTXNHLEtBQUtwRixHQUFVcUcsVUFBQUEsSVR0Q1IsTVN3Q2xCakcsSUFBQUEsQ0FDQ0UsTUFBZThHLEtBQ2JBLEtBQ0EzSixLQUNDQSxHQUFRaUUsTUFDUjFCLEdBQVV3SCxZQUNkbEgsSUFDQUMsRUFBQUEsR0FJRHlFLEVBQVc1RSxJQUFhbUQsSUFBT2hELEVBQUFBLEdBRy9CZ0QsR0FBTTFCLE1BQU1zQyxXVHRETztBU3VEcEI7QVI1Q2FzRCxJQUFRQyxFQUFVRCxPQ2hCekJFLElBQVUsRUFDZkMsS1NETSxTQUFxQkMsSUFBT0MsSUFBT0MsSUFBVUMsSUFBQUE7QUFRbkQsV0FOSUMsSUFFSEMsSUFFQUMsSUFFT0wsS0FBUUEsR0FBS00sS0FDcEIsTUFBS0gsS0FBWUgsR0FBS08sUUFBQUEsQ0FBaUJKLEdBQVNHLEdBQy9DLEtBQUE7QUFjQyxTQWJBRixLQUFPRCxHQUFVSyxnQlhORCxRV1FKSixHQUFLSyw2QkFDaEJOLEdBQVVPLFNBQVNOLEdBQUtLLHlCQUF5QlYsRUFBQUEsQ0FBQUEsR0FDakRNLEtBQVVGLEdBQVNRLE1YVkosUVdhWlIsR0FBVVMsc0JBQ2JULEdBQVVTLGtCQUFrQmIsSUFBT0csTUFBYSxDQUFFLENBQUEsR0FDbERHLEtBQVVGLEdBQVNRLE1BSWhCTixHQUNILFFBQVFGLEdBQVNVLE1BQWlCVjtFQUlwQyxTQUZTVyxJQUFBQTtBQUNSZixJQUFBQSxLQUFRZTtFQUNUO0FBSUYsUUFBTWY7QUFDUCxFQUFBLEdSekNJZ0IsSUFBVSxHQTJGREMsSUFBaUIsU0FBQWhCLElBQUFBO0FBQUssU0gvRWYsUUdnRm5CQSxNQUFBQSxXQUFpQkEsR0FBTVE7QUFBeUIsR0NyRWpEUyxFQUFjQyxVQUFVUixXQUFXLFNBQVVTLElBQVFDLElBQUFBO0FBRXBELE1BQUlDO0FBRUhBLEVBQUFBLEtKZmtCLFFJY2ZDLEtBQUlDLE9BQXVCRCxLQUFJQyxPQUFlRCxLQUFLRSxRQUNsREYsS0FBSUMsTUFFSkQsS0FBSUMsTUFBY0UsRUFBTyxDQUFBLEdBQUlILEtBQUtFLEtBQUFBLEdBR2xCLGNBQUEsT0FBVkwsT0FHVkEsS0FBU0EsR0FBT00sRUFBTyxDQUFFLEdBQUVKLEVBQUFBLEdBQUlDLEtBQUtJLEtBQUFBLElBR2pDUCxNQUNITSxFQUFPSixJQUFHRixFQUFBQSxHSjNCUSxRSStCZkEsTUFFQUcsS0FBSUssUUFDSFAsTUFDSEUsS0FBSU0sSUFBaUJDLEtBQUtULEVBQUFBLEdBRTNCVSxFQUFjUixJQUFBQTtBQUVoQixHQVFBTCxFQUFjQyxVQUFVYSxjQUFjLFNBQVVYLElBQUFBO0FBQzNDRSxPQUFJSyxRQUlQTCxLQUFJeEIsTUFBQUEsTUFDQXNCLE1BQVVFLEtBQUlVLElBQWtCSCxLQUFLVCxFQUFBQSxHQUN6Q1UsRUFBY1IsSUFBQUE7QUFFaEIsR0FZQUwsRUFBY0MsVUFBVWUsU0FBU0MsR0E0RjdCQyxJQUFnQixDQUFBLEdBYWRDLElBQ2EsY0FBQSxPQUFYQyxVQUNKQSxRQUFRbkIsVUFBVW9CLEtBQUtDLEtBQUtGLFFBQVFHLFFBQUFBLENBQUFBLElBQ3BDQyxZQXVCRUMsSUFBWSxTQUFDQyxJQUFHQyxJQUFBQTtBQUFBQSxTQUFNRCxHQUFDaEIsSUFBQWtCLE1BQWlCRCxHQUFDakIsSUFBQWtCO0FBQWMsR0ErQjdEQyxFQUFPQyxNQUFrQixHQzVPckJDLElBQU1DLEtBQUtDLE9BQUFBLEVBQVNDLFNBQVMsQ0FBQSxHQUNoQ0MsSUFBbUIsUUFBUUosR0FDM0JLLElBQWlCLFFBQVFMLEdBY3BCTSxJQUFnQiwrQkFhbEJDLElBQWEsR0ErSVhDLElBQWFDLEVBQUFBLEtBQWlCLEdBQzlCQyxJQUFvQkQsRUFBQUEsSUFBaUIsR0NwTGhDRSxJQUFJOzs7QU1BZixJQUFJQztBQUFKLElBR0lDO0FBSEosSUFNSUM7QUFOSixJQTRCSUM7QUE1QkosSUFTSUMsS0FBYztBQVRsQixJQVlJQyxLQUFvQixDQUFBO0FBWnhCLElBZU1DLEtBQXVEQztBQWY3RCxJQWlCSUMsS0FBZ0JGLEdBQU9HO0FBakIzQixJQWtCSUMsS0FBa0JKLEdBQU9LO0FBbEI3QixJQW1CSUMsS0FBZU4sR0FBUU87QUFuQjNCLElBb0JJQyxLQUFZUixHQUFPUztBQXBCdkIsSUFxQklDLEtBQW1CVixHQUFRVztBQXJCL0IsSUFzQklDLEtBQVVaLEdBQU9hO0FBaUhyQixTQUFTQyxHQUFhQyxJQUFPQyxJQUFBQTtBQUN4QmhCLEVBQUFBLEdBQU9pQixPQUNWakIsR0FBT2lCLElBQU90QixJQUFrQm9CLElBQU9qQixNQUFla0IsRUFBQUEsR0FFdkRsQixLQUFjO0FBT2QsTUFBTW9CLEtBQ0x2QixHQUFnQndCLFFBQ2Z4QixHQUFnQndCLE1BQVcsRUFDM0JOLElBQU8sQ0FBQSxHQUNQSSxLQUFpQixDQUFBLEVBQUE7QUFPbkIsU0FKSUYsTUFBU0csR0FBS0wsR0FBT08sVUFDeEJGLEdBQUtMLEdBQU9RLEtBQUssQ0FBQSxDQUFBLEdBR1hILEdBQUtMLEdBQU9FLEVBQUFBO0FBQ3BCO0FBT2dCLFNBQUFPLEdBQVNDLElBQUFBO0FBRXhCLFNBREF6QixLQUFjLEdBQ1AwQixHQUFXQyxJQUFnQkYsRUFBQUE7QUFDbkM7QUFVTyxTQUFTQyxHQUFXRSxJQUFTSCxJQUFjSSxJQUFBQTtBQUVqRCxNQUFNQyxLQUFZZCxHQUFhcEIsTUFBZ0IsQ0FBQTtBQUUvQyxNQURBa0MsR0FBVUMsSUFBV0gsSUFBQUEsQ0FDaEJFLEdBQVNuQixRQUNibUIsR0FBU2YsS0FBVSxDQUNqQmMsS0FBaURBLEdBQUtKLEVBQUFBLElBQS9DRSxHQUFBQSxRQUEwQkYsRUFBQUEsR0FFbEMsU0FBQU8sSUFBQUE7QUFDQyxRQUFNQyxLQUFlSCxHQUFTSSxNQUMzQkosR0FBU0ksSUFBWSxDQUFBLElBQ3JCSixHQUFTZixHQUFRLENBQUEsR0FDZG9CLEtBQVlMLEdBQVVDLEVBQVNFLElBQWNELEVBQUFBO0FBRS9DQyxJQUFBQSxPQUFpQkUsT0FDcEJMLEdBQVNJLE1BQWMsQ0FBQ0MsSUFBV0wsR0FBU2YsR0FBUSxDQUFBLENBQUEsR0FDcERlLEdBQVNuQixJQUFZeUIsU0FBUyxDQUFBLENBQUE7RUFFaEMsQ0FBQSxHQUdETixHQUFTbkIsTUFBY2QsSUFBQUEsQ0FFbEJBLEdBQWdCd0MsTUFBbUI7QUFBQSxRQWdDOUJDLEtBQVQsU0FBeUJDLElBQUdDLElBQUdDLElBQUFBO0FBQzlCLFVBQUEsQ0FBS1gsR0FBU25CLElBQUFVLElBQXFCLFFBQUE7QUFLbkMsVUFBSXFCLEtBQUFBLE9BQ0FDLEtBQWViLEdBQVNuQixJQUFZaUMsVUFBVUw7QUFXbEQsVUFWQVQsR0FBU25CLElBQUFVLElBQUFOLEdBQTBCOEIsS0FBSyxTQUFBQyxJQUFBQTtBQUN2QyxZQUFJQSxHQUFRWixLQUFhO0FBQ3hCUSxVQUFBQSxLQUFBQTtBQUNBLGNBQU1ULEtBQWVhLEdBQVEvQixHQUFRLENBQUE7QUFDckMrQixVQUFBQSxHQUFRL0IsS0FBVStCLEdBQVFaLEtBQzFCWSxHQUFRWixNQUFBQSxRQUNKRCxPQUFpQmEsR0FBUS9CLEdBQVEsQ0FBQSxNQUFJNEIsS0FBQUE7UUFDMUM7TUFDRCxDQUFBLEdBRUlJLElBQVM7QUFDWixZQUFNQyxLQUFTRCxHQUFRRSxLQUFLQyxNQUFNWCxJQUFHQyxJQUFHQyxFQUFBQTtBQUN4QyxlQUFPQyxLQUFjTSxNQUFVTCxLQUFlSztNQUMvQztBQUVBLGFBQUEsQ0FBUU4sTUFBZUM7SUFDeEI7QUF2REE5QyxJQUFBQSxHQUFnQndDLE1BQUFBO0FBQ2hCLFFBQUlVLEtBQVVsRCxHQUFpQnNELHVCQUN6QkMsS0FBVXZELEdBQWlCd0Q7QUFLakN4RCxJQUFBQSxHQUFpQndELHNCQUFzQixTQUFVZCxJQUFHQyxJQUFHQyxJQUFBQTtBQUN0RCxVQUFJUyxLQUFJSSxLQUFTO0FBQ2hCLFlBQUlDLEtBQU1SO0FBRVZBLFFBQUFBLEtBQUFBLFFBQ0FULEdBQWdCQyxJQUFHQyxJQUFHQyxFQUFBQSxHQUN0Qk0sS0FBVVE7TUFDWDtBQUVJSCxNQUFBQSxNQUFTQSxHQUFRSCxLQUFLQyxNQUFNWCxJQUFHQyxJQUFHQyxFQUFBQTtJQUN2QyxHQXdDQTVDLEdBQWlCc0Qsd0JBQXdCYjtFQUMxQztBQUdELFNBQU9SLEdBQVNJLE9BQWVKLEdBQVNmO0FBQ3pDO0FBT2dCLFNBQUF5QyxHQUFVQyxJQUFVQyxJQUFBQTtBQUVuQyxNQUFNQyxLQUFRM0MsR0FBYXBCLE1BQWdCLENBQUE7QUFBQSxHQUN0Q00sR0FBTzBELE9BQWlCQyxHQUFZRixHQUFLdEMsS0FBUXFDLEVBQUFBLE1BQ3JEQyxHQUFLNUMsS0FBVTBDLElBQ2ZFLEdBQU1HLElBQWVKLElBRXJCN0QsR0FBZ0J3QixJQUFBRixJQUF5QkksS0FBS29DLEVBQUFBO0FBRWhEO0FBNkpBLFNBQVNJLEtBQUFBO0FBRVIsV0FESUMsSUFDSUEsS0FBWUMsR0FBa0JDLE1BQUFBLEtBQVU7QUFDL0MsUUFBTUMsS0FBUUgsR0FBU0k7QUFDdkIsUUFBS0osR0FBU0ssT0FBZ0JGLEdBQzlCLEtBQUE7QUFDQ0EsTUFBQUEsR0FBS0csSUFBaUJDLEtBQUtDLEVBQUFBLEdBQzNCTCxHQUFLRyxJQUFpQkMsS0FBS0UsRUFBQUEsR0FDM0JOLEdBQUtHLE1BQW1CLENBQUE7SUFJekIsU0FIU0ksSUFBQUE7QUFDUlAsTUFBQUEsR0FBS0csTUFBbUIsQ0FBQSxHQUN4QkssR0FBT0MsSUFBYUYsSUFBR1YsR0FBU2EsR0FBQUE7SUFDakM7RUFDRDtBQUNEO0FBcGFBRixHQUFPRyxNQUFTLFNBQUFDLElBQUFBO0FBQ2ZDLEVBQUFBLEtBQW1CLE1BQ2ZDLE1BQWVBLEdBQWNGLEVBQUFBO0FBQ2xDLEdBRUFKLEdBQU9PLEtBQVMsU0FBQ0gsSUFBT0ksSUFBQUE7QUFDbkJKLEVBQUFBLE1BQVNJLEdBQVNDLE9BQWNELEdBQVNDLElBQUFDLFFBQzVDTixHQUFLTSxNQUFTRixHQUFTQyxJQUFBQyxNQUdwQkMsTUFBU0EsR0FBUVAsSUFBT0ksRUFBQUE7QUFDN0IsR0FHQVIsR0FBT1ksTUFBVyxTQUFBUixJQUFBQTtBQUNiUyxFQUFBQSxNQUFpQkEsR0FBZ0JULEVBQUFBLEdBR3JDVSxLQUFlO0FBRWYsTUFBTXRCLE1BSE5hLEtBQW1CRCxHQUFLVyxLQUdNdEI7QUFDMUJELEVBQUFBLE9BQ0N3QixPQUFzQlgsTUFDekJiLEdBQUtHLE1BQW1CLENBQUEsR0FDeEJVLEdBQWdCVixNQUFvQixDQUFBLEdBQ3BDSCxHQUFLZSxHQUFPWCxLQUFLLFNBQUFxQixJQUFBQTtBQUNaQSxJQUFBQSxHQUFRQyxRQUNYRCxHQUFRVixLQUFVVSxHQUFRQyxNQUUzQkQsR0FBU0UsSUFBZUYsR0FBUUMsTUFBQUE7RUFDakMsQ0FBQSxNQUVBMUIsR0FBS0csSUFBaUJDLEtBQUtDLEVBQUFBLEdBQzNCTCxHQUFLRyxJQUFpQkMsS0FBS0UsRUFBQUEsR0FDM0JOLEdBQUtHLE1BQW1CLENBQUEsR0FDeEJtQixLQUFlLEtBR2pCRSxLQUFvQlg7QUFDckIsR0FHQUwsR0FBUW9CLFNBQVMsU0FBQWhCLElBQUFBO0FBQ1ppQixFQUFBQSxNQUFjQSxHQUFhakIsRUFBQUE7QUFFL0IsTUFBTWtCLEtBQUlsQixHQUFLVztBQUNYTyxFQUFBQSxNQUFLQSxHQUFDN0IsUUFDTDZCLEdBQUM3QixJQUFBRSxJQUF5QjRCLFdBMFpSLE1BMVoyQmpDLEdBQWtCa0MsS0FBS0YsRUFBQUEsS0EwWjdDRyxPQUFZekIsR0FBUTBCLDJCQUMvQ0QsS0FBVXpCLEdBQVEwQiwwQkFDTkMsSUFBZ0J2QyxFQUFBQSxJQTNaNUJrQyxHQUFDN0IsSUFBQWMsR0FBZVgsS0FBSyxTQUFBcUIsSUFBQUE7QUFDaEJBLElBQUFBLEdBQVNFLE1BQ1pGLEdBQVF4QixNQUFTd0IsR0FBU0UsR0FDMUJGLEdBQVNFLElBQUFBO0VBRVgsQ0FBQSxJQUVESCxLQUFvQlgsS0FBbUI7QUFDeEMsR0FJQUwsR0FBT2UsTUFBVyxTQUFDWCxJQUFPd0IsSUFBQUE7QUFDekJBLEVBQUFBLEdBQVloQyxLQUFLLFNBQUFQLElBQUFBO0FBQ2hCLFFBQUE7QUFDQ0EsTUFBQUEsR0FBU00sSUFBa0JDLEtBQUtDLEVBQUFBLEdBQ2hDUixHQUFTTSxNQUFvQk4sR0FBU00sSUFBa0JrQyxPQUFPLFNBQUFDLElBQUFBO0FBQzlELGVBQUEsQ0FBQUEsR0FBRXZCLE1BQVVULEdBQWFnQyxFQUFBQTtNQUFVLENBQUE7SUFRckMsU0FOUy9CLElBQUFBO0FBQ1I2QixNQUFBQSxHQUFZaEMsS0FBSyxTQUFBMEIsSUFBQUE7QUFDWkEsUUFBQUEsR0FBQzNCLFFBQW1CMkIsR0FBQzNCLE1BQW9CLENBQUE7TUFDOUMsQ0FBQSxHQUNBaUMsS0FBYyxDQUFBLEdBQ2Q1QixHQUFPQyxJQUFhRixJQUFHVixHQUFTYSxHQUFBQTtJQUNqQztFQUNELENBQUEsR0FFSTZCLE1BQVdBLEdBQVUzQixJQUFPd0IsRUFBQUE7QUFDakMsR0FHQTVCLEdBQVFnQyxVQUFVLFNBQUE1QixJQUFBQTtBQUNiNkIsRUFBQUEsTUFBa0JBLEdBQWlCN0IsRUFBQUE7QUFFdkMsTUFFSzhCLElBRkNaLEtBQUlsQixHQUFLVztBQUNYTyxFQUFBQSxNQUFLQSxHQUFDN0IsUUFFVDZCLEdBQUM3QixJQUFBYyxHQUFlWCxLQUFLLFNBQUF1QyxJQUFBQTtBQUNwQixRQUFBO0FBQ0N0QyxNQUFBQSxHQUFjc0MsRUFBQUE7SUFHZixTQUZTcEMsSUFBQUE7QUFDUm1DLE1BQUFBLEtBQWFuQztJQUNkO0VBQ0QsQ0FBQSxHQUNBdUIsR0FBQzdCLE1BQUFBLFFBQ0d5QyxNQUFZbEMsR0FBT0MsSUFBYWlDLElBQVlaLEdBQUNwQixHQUFBQTtBQUVuRDtBQXNVQSxJQUFJa0MsS0FBMEMsY0FBQSxPQUF6QlY7QUFZckIsU0FBU0MsR0FBZVUsSUFBQUE7QUFDdkIsTUFPSUMsSUFQRUMsS0FBTyxXQUFBO0FBQ1pDLGlCQUFhQyxFQUFBQSxHQUNUTCxNQUFTTSxxQkFBcUJKLEVBQUFBLEdBQ2xDSyxXQUFXTixFQUFBQTtFQUNaLEdBQ01JLEtBQVVFLFdBQVdKLElBNWJSLEVBQUE7QUErYmZILEVBQUFBLE9BQ0hFLEtBQU1aLHNCQUFzQmEsRUFBQUE7QUFFOUI7QUFxQkEsU0FBUzFDLEdBQWMrQyxJQUFBQTtBQUd0QixNQUFNQyxLQUFPeEMsSUFDVHlDLEtBQVVGLEdBQUk3QjtBQUNJLGdCQUFBLE9BQVgrQixPQUNWRixHQUFJN0IsTUFBQUEsUUFDSitCLEdBQUFBLElBR0R6QyxLQUFtQndDO0FBQ3BCO0FBT0EsU0FBUy9DLEdBQWE4QyxJQUFBQTtBQUdyQixNQUFNQyxLQUFPeEM7QUFDYnVDLEVBQUFBLEdBQUk3QixNQUFZNkIsR0FBSXJDLEdBQUFBLEdBQ3BCRixLQUFtQndDO0FBQ3BCO0FBT0EsU0FBU0UsR0FBWUMsSUFBU0MsSUFBQUE7QUFDN0IsU0FBQSxDQUNFRCxNQUNEQSxHQUFRekIsV0FBVzBCLEdBQVExQixVQUMzQjBCLEdBQVFyRCxLQUFLLFNBQUNzRCxJQUFLQyxJQUFBQTtBQUFLLFdBQUtELE9BQVFGLEdBQVFHLEVBQUFBO0VBQU0sQ0FBQTtBQUVyRDtBQVFBLFNBQVNDLEdBQWVGLElBQUtHLElBQUFBO0FBQzVCLFNBQW1CLGNBQUEsT0FBTEEsS0FBa0JBLEdBQUVILEVBQUFBLElBQU9HO0FBQzFDOzs7QUVoaEJhLElDaEJUQyxLQUFVO0FBd0JkLFNBQVNDLEdBQVlDLElBQU1DLElBQU9DLElBQUtDLElBQWtCQyxJQUFVQyxJQUFBQTtBQUM3REosRUFBQUEsT0FBT0EsS0FBUSxDQUFBO0FBSXBCLE1BQ0NLLElBQ0FDLElBRkdDLEtBQWtCUDtBQUl0QixNQUFJLFNBQVNPLEdBRVosTUFBS0QsTUFETEMsS0FBa0IsQ0FBQSxHQUNSUCxHQUNBLFVBQUxNLEtBQ0hELEtBQU1MLEdBQU1NLEVBQUFBLElBRVpDLEdBQWdCRCxFQUFBQSxJQUFLTixHQUFNTSxFQUFBQTtBQU05QixNQUFNRSxLQUFRLEVBQ2JULE1BQUFBLElBQ0FDLE9BQU9PLElBQ1BOLEtBQUFBLElBQ0FJLEtBQUFBLElBQ0FJLEtBQVcsTUFDWEMsSUFBUyxNQUNUQyxLQUFRLEdBQ1JDLEtBQU0sTUFDTkMsS0FBWSxNQUNaQyxhQUFBQSxRQUNBQyxLQUFBQSxFQUFhQyxJQUNiQyxLQUFBQSxJQUNBQyxLQUFRLEdBQ1JmLFVBQUFBLElBQ0FDLFFBQUFBLEdBQUFBO0FBS0QsTUFBb0IsY0FBQSxPQUFUTCxPQUF3Qk0sS0FBTU4sR0FBS29CLGNBQzdDLE1BQUtiLE1BQUtELEdBQUFBLFlBQ0xFLEdBQWdCRCxFQUFBQSxNQUNuQkMsR0FBZ0JELEVBQUFBLElBQUtELEdBQUlDLEVBQUFBO0FBSzVCLFNBREljLEVBQVFaLFNBQU9ZLEVBQVFaLE1BQU1BLEVBQUFBLEdBQzFCQTtBQUNSOzs7QUNwQkEsSUFBTWEsS0FBSTtBQUFBLEVBQ04sS0FBSyxFQUFFLFlBQVksV0FBVyxRQUFRLHFCQUFxQixjQUFjLFFBQVEsU0FBUyxRQUFRLGNBQWMsT0FBTztBQUFBLEVBQ3ZILE9BQU8sRUFBRSxZQUFZLFdBQVcsT0FBTyxXQUFXLFFBQVEscUJBQXFCLGNBQWMsT0FBTyxTQUFTLFlBQVksT0FBTyxRQUFRLFdBQVcsYUFBc0I7QUFBQSxFQUN6SyxLQUFLLEVBQUUsWUFBWSxXQUFXLE9BQU8sUUFBUSxRQUFRLFFBQVEsY0FBYyxPQUFPLFNBQVMsWUFBWSxRQUFRLFdBQVcsYUFBYSxNQUFNO0FBQUEsRUFDN0ksV0FBVyxFQUFFLFlBQVksV0FBVyxPQUFPLFFBQVEsUUFBUSxRQUFRLGNBQWMsT0FBTyxTQUFTLFlBQVksUUFBUSxVQUFVO0FBQUEsRUFDL0gsT0FBTyxFQUFFLFNBQVMsU0FBUyxjQUFjLE9BQU87QUFBQSxFQUNoRCxXQUFXLEVBQUUsU0FBUyxTQUFTLGNBQWMsT0FBTyxPQUFPLFVBQVU7QUFBQSxFQUNyRSxRQUFRLEVBQUUsWUFBWSxXQUFXLE9BQU8sV0FBVyxRQUFRLHFCQUFxQixjQUFjLE9BQU8sU0FBUyxXQUFXO0FBQUEsRUFDekgsSUFBSSxFQUFFLFdBQVcsUUFBaUIsU0FBUyxPQUFPLGNBQWMsb0JBQW9CO0FBQUEsRUFDcEYsSUFBSSxFQUFFLFNBQVMsT0FBTyxjQUFjLHFCQUFxQixlQUFlLE9BQWdCLFdBQVcsYUFBc0I7QUFBQSxFQUN6SCxLQUFLLEVBQUUsUUFBUSxXQUFXLFlBQVksY0FBYztBQUFBLEVBQ3BELFVBQVUsRUFBRSxZQUFZLFVBQVU7QUFBQSxFQUNsQyxPQUFPLEVBQUUsU0FBUyxRQUFRLHFCQUFxQixXQUFXLEtBQUssT0FBTztBQUFBLEVBQ3RFLE9BQU8sRUFBRSxTQUFTLFFBQVEscUJBQXFCLGVBQWUsS0FBSyxPQUFPLFlBQVksTUFBTTtBQUFBLEVBQzVGLEtBQUssRUFBRSxPQUFPLFdBQVcsUUFBUSxRQUFRO0FBQUEsRUFDekMsSUFBSSxFQUFFLE9BQU8sV0FBVyxRQUFRLFFBQVE7QUFBQSxFQUN4QyxNQUFNLEVBQUUsWUFBWSxhQUFhLFVBQVUsU0FBUztBQUN4RDtBQUdBLGVBQWUsU0FBWSxLQUFhLFNBQW1DO0FBQ3ZFLFFBQU0sTUFBTSxNQUFNLE1BQU0sS0FBSyxPQUFPO0FBQ3BDLFFBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixNQUFJLENBQUMsSUFBSSxHQUFJLE9BQU0sSUFBSSxNQUFNLEtBQUssU0FBUyxnQkFBZ0I7QUFDM0QsU0FBTztBQUNYO0FBRUEsU0FBUyxTQUFZLEtBQWEsTUFBMkI7QUFDekQsU0FBTyxTQUFZLEtBQUs7QUFBQSxJQUNwQixRQUFRO0FBQUEsSUFDUixTQUFTLEVBQUUsZ0JBQWdCLG1CQUFtQjtBQUFBLElBQzlDLE1BQU0sS0FBSyxVQUFVLElBQUk7QUFBQSxFQUM3QixDQUFDO0FBQ0w7QUFFQSxTQUFTLFFBQVcsS0FBYSxNQUEyQjtBQUN4RCxTQUFPLFNBQVksS0FBSztBQUFBLElBQ3BCLFFBQVE7QUFBQSxJQUNSLFNBQVMsRUFBRSxnQkFBZ0IsbUJBQW1CO0FBQUEsSUFDOUMsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLEVBQzdCLENBQUM7QUFDTDtBQUVBLGVBQWUsV0FBYyxLQUF5QjtBQUNsRCxTQUFPLFNBQVksS0FBSyxFQUFFLFFBQVEsU0FBUyxDQUFDO0FBQ2hEO0FBR0EsU0FBUyxNQUFNLEVBQUUsT0FBTyxPQUFPLFFBQVEsT0FBTyxVQUFVLFlBQVksR0FNcEQ7QUFDWixTQUNJLGdCQUFBQyxHQUFDLFdBQU0sT0FBT0QsR0FBRSxPQUNaO0FBQUEsb0JBQUFDLEdBQUMsVUFBSyxPQUFPRCxHQUFFLFdBQVksaUJBQU07QUFBQSxJQUNqQyxnQkFBQUM7QUFBQSxNQUFDO0FBQUE7QUFBQSxRQUNHO0FBQUEsUUFDQTtBQUFBLFFBQ0EsYUFBYSxlQUFlO0FBQUEsUUFDNUIsU0FBUyxDQUFBQyxPQUFLLFNBQVVBLEdBQUUsY0FBbUMsS0FBSztBQUFBLFFBQ2xFLE9BQU9GLEdBQUU7QUFBQTtBQUFBLElBQ2I7QUFBQSxLQUNKO0FBRVI7QUFFQSxTQUFTLFdBQVcsRUFBRSxPQUFPLFNBQVMsU0FBUyxHQUkvQjtBQUNaLFNBQ0ksZ0JBQUFDLEdBQUMsV0FBTSxPQUFPLEVBQUUsR0FBR0QsR0FBRSxPQUFPLFNBQVMsUUFBUSxZQUFZLFVBQVUsS0FBSyxPQUFPLFFBQVEsVUFBVSxHQUM3RjtBQUFBLG9CQUFBQyxHQUFDLFdBQU0sTUFBSyxZQUFXLFNBQWtCLFVBQVUsQ0FBQUMsT0FBSyxTQUFVQSxHQUFFLGNBQW1DLE9BQU8sR0FBRztBQUFBLElBQ2hIO0FBQUEsS0FDTDtBQUVSO0FBR0EsU0FBUyxlQUFlLEVBQUUsUUFBUSxTQUFTLEdBRzNCO0FBQ1osUUFBTUMsS0FBSSxPQUFPO0FBQ2pCLFNBQ0ksZ0JBQUFGLEdBQUMsU0FBSSxPQUFPLEVBQUUsWUFBWSxPQUFPLEdBQzNCO0FBQUEsS0FBQUUsT0FBTSxxQkFBcUJBLE9BQU0sdUJBQXVCQSxPQUFNLHNCQUM1RCxnQkFBQUYsR0FBQSxLQUNJO0FBQUEsc0JBQUFBO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFDRyxPQUFNO0FBQUEsVUFDTixPQUFPLE9BQU8sVUFBVTtBQUFBLFVBQ3hCLFVBQVUsQ0FBQUcsT0FBSztBQUFFLGtCQUFNQyxLQUFJLEVBQUUsR0FBRyxPQUFPO0FBQUcsZ0JBQUlELElBQUc7QUFBRSxjQUFBQyxHQUFFLFNBQVNEO0FBQUEsWUFBRyxPQUFPO0FBQUUscUJBQU9DLEdBQUU7QUFBQSxZQUFRO0FBQUUscUJBQVNBLEVBQUM7QUFBQSxVQUFHO0FBQUEsVUFDMUcsYUFBWTtBQUFBO0FBQUEsTUFDaEI7QUFBQSxNQUNBLGdCQUFBSjtBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0csT0FBTTtBQUFBLFVBQ04sT0FBTyxPQUFPLFVBQVU7QUFBQSxVQUN4QixVQUFVLENBQUFHLE9BQUs7QUFBRSxrQkFBTUMsS0FBSSxFQUFFLEdBQUcsT0FBTztBQUFHLGdCQUFJRCxJQUFHO0FBQUUsY0FBQUMsR0FBRSxTQUFTRDtBQUFBLFlBQUcsT0FBTztBQUFFLHFCQUFPQyxHQUFFO0FBQUEsWUFBUTtBQUFFLHFCQUFTQSxFQUFDO0FBQUEsVUFBRztBQUFBLFVBQzFHLGFBQVk7QUFBQTtBQUFBLE1BQ2hCO0FBQUEsTUFDQSxnQkFBQUo7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNHLE9BQU07QUFBQSxVQUNOLFNBQVMsT0FBTyxtQkFBbUI7QUFBQSxVQUNuQyxVQUFVLENBQUFHLE9BQUssU0FBUyxFQUFFLEdBQUcsUUFBUSxpQkFBaUJBLEdBQUUsQ0FBQztBQUFBO0FBQUEsTUFDN0Q7QUFBQSxPQUNKO0FBQUEsS0FFRkQsT0FBTSxxQkFBcUJBLE9BQU0sc0JBQy9CLGdCQUFBRjtBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0csT0FBTTtBQUFBLFFBQ04sU0FBUyxPQUFPLGVBQWU7QUFBQSxRQUMvQixVQUFVLENBQUFHLE9BQUssU0FBUyxFQUFFLEdBQUcsUUFBUSxhQUFhQSxHQUFFLENBQUM7QUFBQTtBQUFBLElBQ3pEO0FBQUEsSUFFSEQsT0FBTSx1QkFDSCxnQkFBQUY7QUFBQSxNQUFDO0FBQUE7QUFBQSxRQUNHLE9BQU07QUFBQSxRQUNOLFNBQVMsT0FBTyxvQkFBb0I7QUFBQSxRQUNwQyxVQUFVLENBQUFHLE9BQUssU0FBUyxFQUFFLEdBQUcsUUFBUSxrQkFBa0JBLEdBQUUsQ0FBQztBQUFBO0FBQUEsSUFDOUQ7QUFBQSxLQUVSO0FBRVI7QUFHQSxTQUFTLFdBQVcsRUFBRSxTQUFTLFVBQVUsU0FBUyxHQUlsQztBQUNaLFFBQU0sQ0FBQyxVQUFVLFdBQVcsSUFBSUUsR0FBUyxLQUFLO0FBQzlDLFFBQU0sQ0FBQyxTQUFTLFVBQVUsSUFBSUEsR0FBUyxLQUFLO0FBRTVDLFNBQ0ksZ0JBQUFMLEdBQUMsV0FDRztBQUFBLG9CQUFBQTtBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0csT0FBTyxVQUFVRCxHQUFFLFdBQVdBLEdBQUU7QUFBQSxRQUNoQyxTQUFTLE1BQU0sWUFBWSxDQUFDLFFBQVE7QUFBQSxRQUNwQyxjQUFjLE1BQU0sV0FBVyxJQUFJO0FBQUEsUUFDbkMsY0FBYyxNQUFNLFdBQVcsS0FBSztBQUFBLFFBRXBDO0FBQUEsMEJBQUFDLEdBQUMsUUFBRyxPQUFPRCxHQUFFLElBQUk7QUFBQTtBQUFBLFlBQUcsUUFBUTtBQUFBLGFBQVk7QUFBQSxVQUN4QyxnQkFBQUMsR0FBQyxRQUFHLE9BQU9ELEdBQUUsSUFBSyxrQkFBUSxPQUFPLE1BQUs7QUFBQSxVQUN0QyxnQkFBQUMsR0FBQyxRQUFHLE9BQU8sRUFBRSxHQUFHRCxHQUFFLElBQUksV0FBVyxRQUFRLEdBQ3JDLDBCQUFBQztBQUFBLFlBQUM7QUFBQTtBQUFBLGNBQ0csT0FBT0QsR0FBRTtBQUFBLGNBQ1QsU0FBUyxDQUFBRSxPQUFLO0FBQUUsZ0JBQUFBLEdBQUUsZ0JBQWdCO0FBQUcseUJBQVM7QUFBQSxjQUFHO0FBQUEsY0FDcEQ7QUFBQTtBQUFBLFVBRUQsR0FDSjtBQUFBO0FBQUE7QUFBQSxJQUNKO0FBQUEsSUFDQyxZQUNHLGdCQUFBRCxHQUFDLFFBQ0csMEJBQUFBLEdBQUMsUUFBRyxTQUFTLEdBQUcsT0FBTyxFQUFFLEdBQUdELEdBQUUsSUFBSSxZQUFZLFdBQVcsU0FBUyxPQUFPLEdBQ3JFLDBCQUFBQztBQUFBLE1BQUM7QUFBQTtBQUFBLFFBQ0csUUFBUSxRQUFRO0FBQUEsUUFDaEIsVUFBVSxDQUFBSSxPQUFLLFNBQVNBLEVBQUM7QUFBQTtBQUFBLElBQzdCLEdBQ0osR0FDSjtBQUFBLEtBRVI7QUFFUjtBQUdBLFNBQVMsU0FBUyxFQUFFLFFBQVEsT0FBTyxHQUduQjtBQUNaLFFBQU0sQ0FBQyxjQUFjLGVBQWUsSUFBSUMsR0FBUyxRQUFRLGdCQUFnQixFQUFFO0FBQzNFLFFBQU0sQ0FBQyxVQUFVLFdBQVcsSUFBSUEsR0FBUyxRQUFRLFlBQVksRUFBRTtBQUMvRCxRQUFNLENBQUMsV0FBVyxZQUFZLElBQUlBLEdBQVMsUUFBUSxhQUFhLEVBQUU7QUFDbEUsUUFBTSxDQUFDLGlCQUFpQixrQkFBa0IsSUFBSUEsR0FBUyxPQUFPLFFBQVEsbUJBQW1CLElBQUksQ0FBQztBQUM5RixRQUFNLENBQUMsS0FBSyxNQUFNLElBQUlBLEdBQVMsRUFBRTtBQUNqQyxRQUFNLENBQUMsS0FBSyxNQUFNLElBQUlBLEdBQVMsRUFBRTtBQUNqQyxRQUFNLENBQUMsUUFBUSxTQUFTLElBQUlBLEdBQVMsS0FBSztBQUUxQyxFQUFBQyxHQUFVLE1BQU07QUFDWixvQkFBZ0IsUUFBUSxnQkFBZ0IsRUFBRTtBQUMxQyxnQkFBWSxRQUFRLFlBQVksRUFBRTtBQUNsQyxpQkFBYSxRQUFRLGFBQWEsRUFBRTtBQUNwQyx1QkFBbUIsT0FBTyxRQUFRLG1CQUFtQixJQUFJLENBQUM7QUFBQSxFQUM5RCxHQUFHLENBQUMsUUFBUSxjQUFjLFFBQVEsV0FBVyxRQUFRLFVBQVUsUUFBUSxlQUFlLENBQUM7QUFFdkYsaUJBQWUsT0FBc0I7QUFDakMsY0FBVSxJQUFJO0FBQ2QsV0FBTyxFQUFFO0FBQUcsV0FBTyxFQUFFO0FBQ3JCLFFBQUk7QUFDQSxZQUFNLE9BQWdDO0FBQUEsUUFDbEMsY0FBYyxhQUFhLEtBQUs7QUFBQSxRQUNoQyxXQUFXLFVBQVUsS0FBSztBQUFBLFFBQzFCLFVBQVUsU0FBUyxLQUFLLEtBQUs7QUFBQSxRQUM3QixpQkFBaUIsT0FBTyxlQUFlO0FBQUEsTUFDM0M7QUFDQSxZQUFNLFNBQVMsZUFBZSxJQUFJO0FBQ2xDLGFBQU8sUUFBUTtBQUNmLGFBQU87QUFBQSxJQUNYLFNBQVNMLElBQUc7QUFDUixhQUFPQSxjQUFhLFFBQVFBLEdBQUUsVUFBVSxPQUFPQSxFQUFDLENBQUM7QUFBQSxJQUNyRCxVQUFFO0FBQ0UsZ0JBQVUsS0FBSztBQUFBLElBQ25CO0FBQUEsRUFDSjtBQUVBLFNBQ0ksZ0JBQUFELEdBQUMsYUFBUSxPQUFPRCxHQUFFLEtBQ2Q7QUFBQSxvQkFBQUMsR0FBQyxRQUFHLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyx1QkFBUztBQUFBLElBQ3JDLFVBQVUsZ0JBQUFBLEdBQUMsT0FBRSxPQUFPLEVBQUUsT0FBTyxXQUFXLFdBQVcsRUFBRSxHQUFHO0FBQUE7QUFBQSxNQUFTLE9BQU87QUFBQSxPQUFXO0FBQUEsSUFDbkYsT0FBTyxnQkFBQUEsR0FBQyxPQUFFLE9BQU9ELEdBQUUsS0FBTSxlQUFJO0FBQUEsSUFDN0IsT0FBTyxnQkFBQUMsR0FBQyxPQUFFLE9BQU9ELEdBQUUsSUFBSyxlQUFJO0FBQUEsSUFDN0IsZ0JBQUFDLEdBQUMsU0FBTSxPQUFNLGlCQUFnQixPQUFPLGNBQWMsVUFBVSxpQkFBaUIsYUFBWSxxQkFBb0I7QUFBQSxJQUM3RyxnQkFBQUEsR0FBQyxTQUFNLE9BQU0sd0JBQXVCLE9BQU8sVUFBVSxVQUFVLGFBQWEsYUFBWSxxQ0FBK0I7QUFBQSxJQUN2SCxnQkFBQUEsR0FBQyxTQUFNLE9BQU0sY0FBYSxPQUFPLFdBQVcsVUFBVSxjQUFjLGFBQVksa0JBQWlCO0FBQUEsSUFDakcsZ0JBQUFBLEdBQUMsU0FBTSxPQUFNLG9CQUFtQixNQUFLLFVBQVMsT0FBTyxpQkFBaUIsVUFBVSxvQkFBb0IsYUFBWSxRQUFPO0FBQUEsSUFDdkgsZ0JBQUFBLEdBQUMsWUFBTyxPQUFPRCxHQUFFLEtBQUssU0FBUyxNQUFNLEtBQUssS0FBSyxHQUFHLFVBQVUsUUFDdkQsbUJBQVMsaUJBQVksUUFDMUI7QUFBQSxLQUNKO0FBRVI7QUFFQSxTQUFTLGlCQUFpQixFQUFFLFdBQVcsR0FBeUM7QUFDNUUsUUFBTSxDQUFDLE1BQU0sT0FBTyxJQUFJTSxHQUE4QixJQUFJO0FBQzFELFFBQU0sQ0FBQyxLQUFLLE1BQU0sSUFBSUEsR0FBUyxFQUFFO0FBQ2pDLFFBQU0sQ0FBQyxjQUFjLGVBQWUsSUFBSUEsR0FBUyxFQUFFO0FBQ25ELFFBQU0sQ0FBQyxhQUFhLGNBQWMsSUFBSUEsR0FBdUIsaUJBQWlCO0FBRTlFLGlCQUFlLE9BQXNCO0FBQ2pDLFFBQUk7QUFDQSxZQUFNQSxLQUFJLE1BQU0sU0FBdUIsZUFBZTtBQUN0RCxjQUFRQSxFQUFDO0FBQUEsSUFDYixTQUFTSixJQUFHO0FBQ1IsYUFBT0EsY0FBYSxRQUFRQSxHQUFFLFVBQVUsT0FBT0EsRUFBQyxDQUFDO0FBQUEsSUFDckQ7QUFBQSxFQUNKO0FBRUEsRUFBQUssR0FBVSxNQUFNO0FBQUUsU0FBSyxLQUFLO0FBQUEsRUFBRyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBRTlDLGlCQUFlLGFBQTRCO0FBQ3ZDLFFBQUksQ0FBQyxhQUFjO0FBQ25CLFVBQU0sS0FBSyxNQUFNLGdCQUFnQixLQUFLLENBQUFGLE9BQUtBLEdBQUUsT0FBTyxZQUFZO0FBQ2hFLFFBQUksQ0FBQyxHQUFJO0FBQ1QsVUFBTSxnQkFBdUMsZ0JBQWdCLG9CQUN2RCxFQUFFLE1BQU0sbUJBQW1CLGFBQWEsT0FBTyxpQkFBaUIsTUFBTSxJQUN0RSxnQkFBZ0Isc0JBQ1osRUFBRSxNQUFNLHFCQUFxQixrQkFBa0IsT0FBTyxpQkFBaUIsTUFBTSxJQUM3RSxnQkFBZ0Isb0JBQ1osRUFBRSxNQUFNLG1CQUFtQixhQUFhLE9BQU8saUJBQWlCLE1BQU0sSUFDdEUsRUFBRSxNQUFNLFlBQVk7QUFDbEMsVUFBTSxTQUFTLGlCQUFpQixFQUFFLFdBQVcsR0FBRyxJQUFJLGFBQWEsR0FBRyxNQUFNLFFBQVEsY0FBYyxDQUFDO0FBQ2pHLG9CQUFnQixFQUFFO0FBQ2xCLFVBQU0sS0FBSztBQUFBLEVBQ2Y7QUFFQSxpQkFBZSxjQUFjLElBQTJCO0FBQ3BELFVBQU0sV0FBVyxpQkFBaUIsRUFBRSxFQUFFO0FBQ3RDLFVBQU0sS0FBSztBQUFBLEVBQ2Y7QUFFQSxpQkFBZSxjQUFjLElBQVksUUFBOEM7QUFDbkYsVUFBTSxRQUFRLGlCQUFpQixFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7QUFDL0MsVUFBTSxLQUFLO0FBQUEsRUFDZjtBQUVBLGlCQUFlLHFCQUFvQztBQUMvQyxRQUFJO0FBQ0EsWUFBTUMsS0FBSSxNQUFNLFNBQXVCLHlCQUF5QixFQUFFLFFBQVEsT0FBTyxDQUFDO0FBQ2xGLGNBQVFBLEVBQUM7QUFBQSxJQUNiLFNBQVNKLElBQUc7QUFDUixhQUFPQSxjQUFhLFFBQVFBLEdBQUUsVUFBVSxPQUFPQSxFQUFDLENBQUM7QUFBQSxJQUNyRDtBQUFBLEVBQ0o7QUFFQSxTQUNJLGdCQUFBRCxHQUFDLGFBQVEsT0FBT0QsR0FBRSxLQUNkO0FBQUEsb0JBQUFDLEdBQUMsU0FBSSxPQUFPLEVBQUUsU0FBUyxRQUFRLFlBQVksVUFBVSxLQUFLLFFBQVEsY0FBYyxPQUFPLEdBQ25GO0FBQUEsc0JBQUFBLEdBQUMsUUFBRyxPQUFPLEVBQUUsV0FBVyxHQUFHLGNBQWMsRUFBRSxHQUFHLCtCQUFpQjtBQUFBLE1BQy9ELGdCQUFBQSxHQUFDLFlBQU8sT0FBTyxFQUFFLEdBQUdELEdBQUUsS0FBSyxhQUFhLEVBQUUsR0FBRyxTQUFTLE1BQU0sS0FBSyxtQkFBbUIsR0FBRyw4QkFBZ0I7QUFBQSxPQUMzRztBQUFBLElBQ0MsT0FBTyxnQkFBQUMsR0FBQyxPQUFFLE9BQU9ELEdBQUUsS0FBTSxlQUFJO0FBQUEsSUFDOUIsZ0JBQUFDLEdBQUMsV0FBTSxPQUFPLEVBQUUsT0FBTyxRQUFRLGdCQUFnQixZQUFZLGNBQWMsT0FBTyxHQUM1RTtBQUFBLHNCQUFBQSxHQUFDLFdBQ0csMEJBQUFBLEdBQUMsUUFDRztBQUFBLHdCQUFBQSxHQUFDLFFBQUcsT0FBT0QsR0FBRSxJQUFJLHFCQUFPO0FBQUEsUUFDeEIsZ0JBQUFDLEdBQUMsUUFBRyxPQUFPRCxHQUFFLElBQUksc0JBQVE7QUFBQSxRQUN6QixnQkFBQUMsR0FBQyxRQUFHLE9BQU8sRUFBRSxHQUFHRCxHQUFFLElBQUksV0FBVyxRQUFpQixHQUFHLHFCQUFPO0FBQUEsU0FDaEUsR0FDSjtBQUFBLE1BQ0MsTUFBTSxTQUFTLElBQUksQ0FBQVEsT0FDaEIsZ0JBQUFQO0FBQUEsUUFBQztBQUFBO0FBQUEsVUFFRyxTQUFTTztBQUFBLFVBQ1QsVUFBVSxNQUFNLEtBQUssY0FBY0EsR0FBRSxTQUFTO0FBQUEsVUFDOUMsVUFBVSxDQUFBSCxPQUFLLEtBQUssY0FBY0csR0FBRSxXQUFXSCxFQUFDO0FBQUE7QUFBQSxRQUgzQ0csR0FBRTtBQUFBLE1BSVgsQ0FDSDtBQUFBLE9BQ0MsQ0FBQyxRQUFRLEtBQUssU0FBUyxXQUFXLE1BQ2hDLGdCQUFBUCxHQUFDLFdBQ0csMEJBQUFBLEdBQUMsUUFBRywwQkFBQUEsR0FBQyxRQUFHLFNBQVMsR0FBRyxPQUFPLEVBQUUsR0FBR0QsR0FBRSxJQUFJLE9BQU8sVUFBVSxHQUFHLHNDQUF3QixHQUFLLEdBQzNGO0FBQUEsT0FFUjtBQUFBLElBRUEsZ0JBQUFDLEdBQUMsU0FBSSxPQUFPRCxHQUFFLE9BQ1Y7QUFBQSxzQkFBQUMsR0FBQyxXQUFNLE9BQU9ELEdBQUUsT0FDWjtBQUFBLHdCQUFBQyxHQUFDLFVBQUssT0FBT0QsR0FBRSxXQUFXLHFCQUFPO0FBQUEsUUFDakMsZ0JBQUFDLEdBQUMsWUFBTyxPQUFPRCxHQUFFLFFBQVEsT0FBTyxjQUFjLFVBQVUsQ0FBQUUsT0FBSyxnQkFBaUJBLEdBQUUsY0FBb0MsS0FBSyxHQUNySDtBQUFBLDBCQUFBRCxHQUFDLFlBQU8sT0FBTSxJQUFHLGtDQUFlO0FBQUEsVUFDL0IsTUFBTSxTQUFTLElBQUksQ0FBQUksT0FBSyxnQkFBQUosR0FBQyxZQUFrQixPQUFPSSxHQUFFLElBQUk7QUFBQTtBQUFBLFlBQUVBLEdBQUU7QUFBQSxlQUF2QkEsR0FBRSxFQUEwQixDQUFTO0FBQUEsV0FDL0U7QUFBQSxTQUNKO0FBQUEsTUFDQSxnQkFBQUosR0FBQyxXQUFNLE9BQU9ELEdBQUUsT0FDWjtBQUFBLHdCQUFBQyxHQUFDLFVBQUssT0FBT0QsR0FBRSxXQUFXLHNCQUFRO0FBQUEsUUFDbEMsZ0JBQUFDLEdBQUMsWUFBTyxPQUFPRCxHQUFFLFFBQVEsT0FBTyxhQUFhLFVBQVUsQ0FBQUUsT0FBSyxlQUFnQkEsR0FBRSxjQUFvQyxLQUFxQixHQUNuSTtBQUFBLDBCQUFBRCxHQUFDLFlBQU8sT0FBTSxtQkFBa0IsNkNBQW1CO0FBQUEsVUFDbkQsZ0JBQUFBLEdBQUMsWUFBTyxPQUFNLHFCQUFvQix5Q0FBb0I7QUFBQSxVQUN0RCxnQkFBQUEsR0FBQyxZQUFPLE9BQU0sbUJBQWtCLHVDQUFrQjtBQUFBLFVBQ2xELGdCQUFBQSxHQUFDLFlBQU8sT0FBTSxhQUFZLGlDQUFZO0FBQUEsV0FDMUM7QUFBQSxTQUNKO0FBQUEsTUFDQSxnQkFBQUEsR0FBQyxZQUFPLE9BQU9ELEdBQUUsS0FBSyxTQUFTLE1BQU0sS0FBSyxXQUFXLEdBQUcsVUFBVSxDQUFDLGNBQWMsaUJBQUc7QUFBQSxPQUN4RjtBQUFBLEtBQ0o7QUFFUjtBQVdBLFNBQVMsbUJBQWdDO0FBQ3JDLFFBQU0sQ0FBQyxhQUFhLGNBQWMsSUFBSU0sR0FBNkIsSUFBSTtBQUN2RSxRQUFNLENBQUMsTUFBTSxPQUFPLElBQUlBLEdBQW9CLE1BQU07QUFFbEQsUUFBTSxDQUFDLFlBQVksYUFBYSxJQUFJQSxHQUFTLGNBQWM7QUFFM0QsUUFBTSxDQUFDLGFBQWEsY0FBYyxJQUFJQSxHQUFTLEVBQUU7QUFDakQsUUFBTSxDQUFDLFdBQVcsWUFBWSxJQUFJQSxHQUFTLFFBQVE7QUFDbkQsUUFBTSxDQUFDLFdBQVcsWUFBWSxJQUFJQSxHQUFTLEVBQUU7QUFDN0MsUUFBTSxDQUFDLEtBQUssTUFBTSxJQUFJQSxHQUFTLEVBQUU7QUFDakMsUUFBTSxDQUFDLEtBQUssTUFBTSxJQUFJQSxHQUFTLEVBQUU7QUFDakMsUUFBTSxDQUFDLFFBQVEsU0FBUyxJQUFJQSxHQUFTLEtBQUs7QUFDMUMsUUFBTSxDQUFDLFNBQVMsVUFBVSxJQUFJQSxHQUFTLEtBQUs7QUFFNUMsaUJBQWUsT0FBc0I7QUFDakMsUUFBSTtBQUNBLFlBQU1BLEtBQUksTUFBTSxTQUE4QyxtQkFBbUI7QUFDakYsVUFBSUEsR0FBRSxhQUFhO0FBQ2YsdUJBQWVBLEdBQUUsV0FBVztBQUM1QixnQkFBUUEsR0FBRSxZQUFZLElBQUk7QUFDMUIsWUFBSUEsR0FBRSxZQUFZLFNBQVMsT0FBUSxlQUFjQSxHQUFFLFlBQVksVUFBVTtBQUN6RSxZQUFJQSxHQUFFLFlBQVksU0FBUyxRQUFRO0FBQy9CLHlCQUFlQSxHQUFFLFlBQVksV0FBVztBQUN4Qyx1QkFBYUEsR0FBRSxZQUFZLFNBQVM7QUFDcEMsdUJBQWFBLEdBQUUsWUFBWSxTQUFTO0FBQUEsUUFDeEM7QUFBQSxNQUNKO0FBQUEsSUFDSixTQUFTSixJQUFHO0FBQ1IsYUFBT0EsY0FBYSxRQUFRQSxHQUFFLFVBQVUsT0FBT0EsRUFBQyxDQUFDO0FBQUEsSUFDckQ7QUFBQSxFQUNKO0FBRUEsRUFBQUssR0FBVSxNQUFNO0FBQUUsU0FBSyxLQUFLO0FBQUEsRUFBRyxHQUFHLENBQUMsQ0FBQztBQUVwQyxpQkFBZSxPQUFzQjtBQUNqQyxjQUFVLElBQUk7QUFBRyxXQUFPLEVBQUU7QUFBRyxXQUFPLEVBQUU7QUFDdEMsUUFBSTtBQUNBLFVBQUk7QUFDSixVQUFJLFNBQVMsUUFBUTtBQUNqQixjQUFNLEVBQUUsTUFBTSxRQUFRLFlBQVksV0FBVyxLQUFLLEVBQUU7QUFBQSxNQUN4RCxXQUFXLFNBQVMsUUFBUTtBQUN4QixjQUFNLEVBQUUsTUFBTSxRQUFRLGFBQWEsWUFBWSxLQUFLLEdBQUcsV0FBVyxVQUFVLEtBQUssR0FBRyxXQUFXLFVBQVUsS0FBSyxFQUFFO0FBQUEsTUFDcEgsT0FBTztBQUNILGNBQU0sRUFBRSxNQUFNLFlBQVk7QUFBQSxNQUM5QjtBQUNBLFlBQU0sU0FBUyxxQkFBcUIsRUFBRSxhQUFhLElBQUksQ0FBQztBQUN4RCxxQkFBZSxHQUFHO0FBQ2xCLGFBQU8sbUJBQW1CO0FBQUEsSUFDOUIsU0FBU0wsSUFBRztBQUNSLGFBQU9BLGNBQWEsUUFBUUEsR0FBRSxVQUFVLE9BQU9BLEVBQUMsQ0FBQztBQUFBLElBQ3JELFVBQUU7QUFDRSxnQkFBVSxLQUFLO0FBQUEsSUFDbkI7QUFBQSxFQUNKO0FBRUEsaUJBQWUsWUFBMkI7QUFDdEMsZUFBVyxJQUFJO0FBQUcsV0FBTyxFQUFFO0FBQUcsV0FBTyxFQUFFO0FBQ3ZDLFFBQUk7QUFDQSxZQUFNLFNBQVMscUJBQXFCLENBQUMsQ0FBQztBQUN0QyxhQUFPLFNBQVMsY0FBYyxrQ0FBa0MsNEJBQTRCO0FBQUEsSUFDaEcsU0FBU0EsSUFBRztBQUNSLGFBQU9BLGNBQWEsUUFBUUEsR0FBRSxVQUFVLE9BQU9BLEVBQUMsQ0FBQztBQUFBLElBQ3JELFVBQUU7QUFDRSxpQkFBVyxLQUFLO0FBQUEsSUFDcEI7QUFBQSxFQUNKO0FBRUEsUUFBTSxZQUF1QztBQUFBLElBQ3pDLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxFQUNmO0FBRUEsU0FDSSxnQkFBQUQsR0FBQyxhQUFRLE9BQU9ELEdBQUUsS0FDZDtBQUFBLG9CQUFBQyxHQUFDLFFBQUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLHdCQUFVO0FBQUEsSUFDdEMsT0FBTyxnQkFBQUEsR0FBQyxPQUFFLE9BQU9ELEdBQUUsS0FBTSxlQUFJO0FBQUEsSUFDN0IsT0FBTyxnQkFBQUMsR0FBQyxPQUFFLE9BQU9ELEdBQUUsSUFBSyxlQUFJO0FBQUEsSUFFN0IsZ0JBQUFDLEdBQUMsV0FBTSxPQUFPRCxHQUFFLE9BQ1o7QUFBQSxzQkFBQUMsR0FBQyxVQUFLLE9BQU9ELEdBQUUsV0FBVyx5QkFBVztBQUFBLE1BQ3JDLGdCQUFBQztBQUFBLFFBQUM7QUFBQTtBQUFBLFVBQ0csT0FBT0QsR0FBRTtBQUFBLFVBQ1QsT0FBTztBQUFBLFVBQ1AsVUFBVSxDQUFBRSxPQUFLLFFBQVNBLEdBQUUsY0FBb0MsS0FBa0I7QUFBQSxVQUU5RSxXQUFDLFFBQVEsUUFBUSxXQUFXLEVBQWtCLElBQUksQ0FBQU0sT0FDaEQsZ0JBQUFQLEdBQUMsWUFBZSxPQUFPTyxJQUFJLG9CQUFVQSxFQUFDLEtBQXpCQSxFQUEyQixDQUMzQztBQUFBO0FBQUEsTUFDTDtBQUFBLE9BQ0o7QUFBQSxJQUVDLFNBQVMsVUFDTixnQkFBQVA7QUFBQSxNQUFDO0FBQUE7QUFBQSxRQUNHLE9BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVU7QUFBQSxRQUNWLGFBQVk7QUFBQTtBQUFBLElBQ2hCO0FBQUEsSUFHSCxTQUFTLFVBQVUsZ0JBQUFBLEdBQUEsS0FDaEI7QUFBQSxzQkFBQUEsR0FBQyxTQUFNLE9BQU0scUJBQW9CLE9BQU8sYUFBYSxVQUFVLGdCQUFnQixhQUFZLGdCQUFlO0FBQUEsTUFDMUcsZ0JBQUFBLEdBQUMsU0FBTSxPQUFNLGNBQWEsT0FBTyxXQUFXLFVBQVUsY0FBYyxhQUFZLDZCQUE0QjtBQUFBLE1BQzVHLGdCQUFBQSxHQUFDLFNBQU0sT0FBTSw4QkFBNkIsT0FBTyxXQUFXLFVBQVUsY0FBYyxhQUFZLHFCQUFvQjtBQUFBLE9BQ3hIO0FBQUEsSUFFQyxTQUFTLGVBQ04sZ0JBQUFBLEdBQUMsT0FBRSxPQUFPLEVBQUUsT0FBTyxXQUFXLFdBQVcsRUFBRSxHQUFHO0FBQUE7QUFBQSxNQUNPO0FBQUEsTUFDakQsZ0JBQUFBLEdBQUMsT0FBRSxNQUFLLFNBQVEsUUFBTyxVQUFTLEtBQUksdUJBQXNCLG1CQUFLO0FBQUEsTUFBSTtBQUFBLE9BQ3ZFO0FBQUEsSUFHSixnQkFBQUEsR0FBQyxTQUFJLE9BQU8sRUFBRSxTQUFTLFFBQVEsS0FBSyxPQUFPLFdBQVcsTUFBTSxHQUN4RDtBQUFBLHNCQUFBQSxHQUFDLFlBQU8sT0FBT0QsR0FBRSxLQUFLLFNBQVMsTUFBTSxLQUFLLEtBQUssR0FBRyxVQUFVLFFBQ3ZELG1CQUFTLGlCQUFZLFFBQzFCO0FBQUEsTUFDQSxnQkFBQUM7QUFBQSxRQUFDO0FBQUE7QUFBQSxVQUNHLE9BQU8sRUFBRSxHQUFHRCxHQUFFLEtBQUssWUFBWSxVQUFVO0FBQUEsVUFDekMsU0FBUyxNQUFNLEtBQUssVUFBVTtBQUFBLFVBQzlCLFVBQVUsV0FBVyxDQUFDO0FBQUEsVUFDdEIsT0FBTyxDQUFDLGNBQWMsc0JBQXNCO0FBQUEsVUFFM0Msb0JBQVUsbUJBQWM7QUFBQTtBQUFBLE1BQzdCO0FBQUEsT0FDSjtBQUFBLEtBQ0o7QUFFUjtBQUVBLFNBQVMsZ0JBQWdCLEVBQUUsT0FBTyxHQUF3QztBQUN0RSxRQUFNLENBQUMsVUFBVSxXQUFXLElBQUlNLEdBQVMsRUFBRTtBQUMzQyxRQUFNLENBQUMsS0FBSyxNQUFNLElBQUlBLEdBQVMsRUFBRTtBQUNqQyxRQUFNLENBQUMsS0FBSyxNQUFNLElBQUlBLEdBQVMsRUFBRTtBQUNqQyxRQUFNLENBQUMsUUFBUSxTQUFTLElBQUlBLEdBQVMsS0FBSztBQUUxQyxpQkFBZSxPQUFzQjtBQUNqQyxjQUFVLElBQUk7QUFBRyxXQUFPLEVBQUU7QUFBRyxXQUFPLEVBQUU7QUFDdEMsUUFBSTtBQUNBLFlBQU0sU0FBUyxlQUFlLEVBQUUsU0FBUyxDQUFDO0FBQzFDLGtCQUFZLEVBQUU7QUFDZCxhQUFPLFdBQVcsa0JBQWtCLG1CQUFtQjtBQUN2RCxhQUFPO0FBQUEsSUFDWCxTQUFTSixJQUFHO0FBQ1IsYUFBT0EsY0FBYSxRQUFRQSxHQUFFLFVBQVUsT0FBT0EsRUFBQyxDQUFDO0FBQUEsSUFDckQsVUFBRTtBQUNFLGdCQUFVLEtBQUs7QUFBQSxJQUNuQjtBQUFBLEVBQ0o7QUFFQSxTQUNJLGdCQUFBRCxHQUFDLGFBQVEsT0FBT0QsR0FBRSxLQUNkO0FBQUEsb0JBQUFDLEdBQUMsUUFBRyxPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsc0JBQVE7QUFBQSxJQUNwQyxPQUFPLGdCQUFBQSxHQUFDLE9BQUUsT0FBT0QsR0FBRSxLQUFNLGVBQUk7QUFBQSxJQUM3QixPQUFPLGdCQUFBQyxHQUFDLE9BQUUsT0FBT0QsR0FBRSxJQUFLLGVBQUk7QUFBQSxJQUM3QixnQkFBQUMsR0FBQyxTQUFNLE9BQU0sMEJBQXlCLE1BQUssWUFBVyxPQUFPLFVBQVUsVUFBVSxhQUFhLGFBQVksa0NBQWlDO0FBQUEsSUFDM0ksZ0JBQUFBLEdBQUMsWUFBTyxPQUFPRCxHQUFFLEtBQUssU0FBUyxNQUFNLEtBQUssS0FBSyxHQUFHLFVBQVUsUUFDdkQsbUJBQVMsaUJBQVksZ0JBQzFCO0FBQUEsS0FDSjtBQUVSO0FBRUEsU0FBUyxhQUEwQjtBQUMvQixRQUFNLENBQUMsUUFBUSxTQUFTLElBQUlNLEdBQTRCLENBQUMsQ0FBQztBQUMxRCxRQUFNLENBQUMsUUFBUSxTQUFTLElBQUlBLEdBQTRCLElBQUk7QUFFNUQsaUJBQWUsT0FBc0I7QUFDakMsVUFBTUEsS0FBSSxNQUFNLFNBQTRELGFBQWE7QUFDekYsY0FBVUEsR0FBRSxNQUFNO0FBQ2xCLGNBQVVBLEdBQUUsTUFBTTtBQUFBLEVBQ3RCO0FBRUEsRUFBQUMsR0FBVSxNQUFNO0FBQ1osU0FBSyxLQUFLO0FBQ1YsVUFBTUosS0FBSSxZQUFZLE1BQU0sS0FBSyxLQUFLLEdBQUcsR0FBSTtBQUM3QyxXQUFPLE1BQU0sY0FBY0EsRUFBQztBQUFBLEVBQ2hDLEdBQUcsQ0FBQyxDQUFDO0FBRUwsUUFBTSxZQUFvQztBQUFBLElBQ3RDLFNBQVM7QUFBQSxJQUNULFNBQVM7QUFBQSxJQUNULE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLFNBQVM7QUFBQSxFQUNiO0FBRUEsU0FDSSxnQkFBQUYsR0FBQyxhQUFRLE9BQU9ELEdBQUUsS0FDZDtBQUFBLG9CQUFBQyxHQUFDLFFBQUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLDhCQUFnQjtBQUFBLElBQzVDLFVBQ0csZ0JBQUFBLEdBQUMsUUFBRyxPQUFPLEVBQUUsU0FBUyxRQUFRLHFCQUFxQixhQUFhLEtBQUssWUFBWSxjQUFjLE9BQU8sR0FDbEc7QUFBQSxzQkFBQUEsR0FBQyxRQUFHLE9BQU8sRUFBRSxPQUFPLFVBQVUsR0FBRyx1QkFBUztBQUFBLE1BQUssZ0JBQUFBLEdBQUMsUUFBRyxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUksaUJBQU8sWUFBWSxlQUFVLGFBQU87QUFBQSxNQUM5RyxnQkFBQUEsR0FBQyxRQUFHLE9BQU8sRUFBRSxPQUFPLFVBQVUsR0FBRyxpQkFBRztBQUFBLE1BQUssZ0JBQUFBLEdBQUMsUUFBRyxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUksaUJBQU8sT0FBTyxVQUFJO0FBQUEsTUFDdEYsZ0JBQUFBLEdBQUMsUUFBRyxPQUFPLEVBQUUsT0FBTyxVQUFVLEdBQUcscUJBQU87QUFBQSxNQUFLLGdCQUFBQSxHQUFDLFFBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFJLGlCQUFPLGFBQWEsVUFBSTtBQUFBLE1BQ2hHLGdCQUFBQSxHQUFDLFFBQUcsT0FBTyxFQUFFLE9BQU8sVUFBVSxHQUFHLHVCQUFTO0FBQUEsTUFBSyxnQkFBQUEsR0FBQyxRQUFHLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBSSxpQkFBTyxzQkFBc0IsVUFBSTtBQUFBLE1BQzNHLGdCQUFBQSxHQUFDLFFBQUcsT0FBTyxFQUFFLE9BQU8sVUFBVSxHQUFHLHFCQUFPO0FBQUEsTUFBSyxnQkFBQUEsR0FBQyxRQUFHLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBSSxpQkFBTyxPQUFPLEtBQUssSUFBSSxLQUFLLFVBQUk7QUFBQSxPQUM1RztBQUFBLElBRUosZ0JBQUFBLEdBQUMsU0FBSSxPQUFPLEVBQUUsV0FBVyxTQUFTLFVBQVUsUUFBUSxRQUFRLHFCQUFxQixjQUFjLE1BQU0sR0FDaEcsaUJBQU8sV0FBVyxJQUNmLGdCQUFBQSxHQUFDLE9BQUUsT0FBTyxFQUFFLFNBQVMsUUFBUSxRQUFRLEdBQUcsT0FBTyxVQUFVLEdBQUcsNEJBQWMsSUFFMUUsZ0JBQUFBLEdBQUMsV0FBTSxPQUFPLEVBQUUsT0FBTyxRQUFRLGdCQUFnQixXQUFXLEdBQ3REO0FBQUEsc0JBQUFBLEdBQUMsV0FDRywwQkFBQUEsR0FBQyxRQUNHO0FBQUEsd0JBQUFBLEdBQUMsUUFBRyxPQUFPRCxHQUFFLElBQUksa0JBQUk7QUFBQSxRQUNyQixnQkFBQUMsR0FBQyxRQUFHLE9BQU9ELEdBQUUsSUFBSSxrQkFBSTtBQUFBLFFBQ3JCLGdCQUFBQyxHQUFDLFFBQUcsT0FBT0QsR0FBRSxJQUFJLHFCQUFPO0FBQUEsU0FDNUIsR0FDSjtBQUFBLE1BQ0EsZ0JBQUFDLEdBQUMsV0FDSSxpQkFBTyxJQUFJLENBQUNDLElBQUdPLE9BQ1osZ0JBQUFSLEdBQUMsUUFDRztBQUFBLHdCQUFBQSxHQUFDLFFBQUcsT0FBTyxFQUFFLEdBQUdELEdBQUUsSUFBSSxHQUFHQSxHQUFFLE1BQU0sWUFBWSxTQUFrQixHQUFJLFVBQUFFLEdBQUUsV0FBVTtBQUFBLFFBQy9FLGdCQUFBRCxHQUFDLFFBQUcsT0FBTyxFQUFFLEdBQUdELEdBQUUsSUFBSSxPQUFPLFVBQVVFLEdBQUUsSUFBSSxLQUFLLFVBQVUsR0FBSSxVQUFBQSxHQUFFLE1BQUs7QUFBQSxRQUN2RSxnQkFBQUQsR0FBQyxRQUFHLE9BQU9ELEdBQUUsSUFBSyxVQUFBRSxHQUFFLFNBQVE7QUFBQSxXQUh2QixPQUFPTyxFQUFDLENBSWpCLENBQ0gsR0FDTDtBQUFBLE9BQ0osR0FFUjtBQUFBLEtBQ0o7QUFFUjtBQUVBLFNBQVMsaUJBQThCO0FBQ25DLFFBQU0sQ0FBQyxLQUFLLE1BQU0sSUFBSUgsR0FBUyxFQUFFO0FBQ2pDLFFBQU0sQ0FBQyxLQUFLLE1BQU0sSUFBSUEsR0FBUyxFQUFFO0FBQ2pDLFFBQU0sQ0FBQyxZQUFZLGFBQWEsSUFBSUEsR0FBUyxLQUFLO0FBRWxELGlCQUFlLFVBQXlCO0FBQ3BDLGtCQUFjLElBQUk7QUFBRyxXQUFPLEVBQUU7QUFBRyxXQUFPLEVBQUU7QUFDMUMsUUFBSTtBQUNBLFlBQU0sU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2pDLGFBQU8sdURBQXVEO0FBQUEsSUFDbEUsU0FBU0osSUFBRztBQUNSLGFBQU9BLGNBQWEsUUFBUUEsR0FBRSxVQUFVLE9BQU9BLEVBQUMsQ0FBQztBQUNqRCxvQkFBYyxLQUFLO0FBQUEsSUFDdkI7QUFBQSxFQUNKO0FBRUEsU0FDSSxnQkFBQUQsR0FBQyxhQUFRLE9BQU9ELEdBQUUsS0FDZDtBQUFBLG9CQUFBQyxHQUFDLFFBQUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLDRCQUFjO0FBQUEsSUFDMUMsT0FBTyxnQkFBQUEsR0FBQyxPQUFFLE9BQU9ELEdBQUUsS0FBTSxlQUFJO0FBQUEsSUFDN0IsT0FBTyxnQkFBQUMsR0FBQyxPQUFFLE9BQU9ELEdBQUUsSUFBSyxlQUFJO0FBQUEsSUFDN0IsZ0JBQUFDLEdBQUMsWUFBTyxPQUFPLEVBQUUsR0FBR0QsR0FBRSxLQUFLLFlBQVksVUFBVSxHQUFHLFNBQVMsTUFBTSxLQUFLLFFBQVEsR0FBRyxVQUFVLFlBQ3hGLHVCQUFhLHFCQUFnQixrQkFDbEM7QUFBQSxLQUNKO0FBRVI7QUFHQSxTQUFTLE1BQW1CO0FBQ3hCLFFBQU0sQ0FBQyxRQUFRLFNBQVMsSUFBSU0sR0FBNEIsSUFBSTtBQUM1RCxRQUFNLENBQUMsWUFBWSxhQUFhLElBQUlBLEdBQVMsQ0FBQztBQUU5QyxpQkFBZSxhQUE0QjtBQUN2QyxVQUFNQSxLQUFJLE1BQU0sU0FBcUIsYUFBYTtBQUNsRCxjQUFVQSxFQUFDO0FBQUEsRUFDZjtBQUVBLEVBQUFDLEdBQVUsTUFBTTtBQUFFLFNBQUssV0FBVztBQUFBLEVBQUcsR0FBRyxDQUFDLENBQUM7QUFFMUMsV0FBUyxhQUFtQjtBQUN4QixTQUFLLFdBQVc7QUFDaEIsa0JBQWMsQ0FBQUcsT0FBS0EsS0FBSSxDQUFDO0FBQUEsRUFDNUI7QUFFQSxTQUNJLGdCQUFBVCxHQUFDLFVBQUssT0FBTyxFQUFFLFVBQVUsU0FBUyxRQUFRLFVBQVUsU0FBUyxPQUFPLEdBQ2hFO0FBQUEsb0JBQUFBLEdBQUMsUUFBRyxPQUFPLEVBQUUsV0FBVyxFQUFFLEdBQUcsbURBQXlCO0FBQUEsSUFDdEQsZ0JBQUFBLEdBQUMsWUFBUyxRQUFnQixRQUFRLFlBQVk7QUFBQSxJQUM5QyxnQkFBQUEsR0FBQyxvQkFBaUIsWUFBd0I7QUFBQSxJQUMxQyxnQkFBQUEsR0FBQyxvQkFBaUI7QUFBQSxJQUNsQixnQkFBQUEsR0FBQyxtQkFBZ0IsUUFBUSxNQUFNLEtBQUssV0FBVyxHQUFHO0FBQUEsSUFDbEQsZ0JBQUFBLEdBQUMsY0FBVztBQUFBLElBQ1osZ0JBQUFBLEdBQUMsa0JBQWU7QUFBQSxLQUNwQjtBQUVSO0FBRUEsSUFBTSxPQUFPLFNBQVMsZUFBZSxLQUFLO0FBQzFDLElBQUksQ0FBQyxLQUFNLE9BQU0sSUFBSSxNQUFNLGNBQWM7QUFDekMsRUFBTyxnQkFBQUEsR0FBQyxPQUFJLEdBQUksSUFBSTsiLAogICJuYW1lcyI6IFsic2xpY2UiLCAib3B0aW9ucyIsICJ2bm9kZUlkIiwgImlzVmFsaWRFbGVtZW50IiwgInJlcmVuZGVyUXVldWUiLCAicHJldkRlYm91bmNlIiwgImRlZmVyIiwgImRlcHRoU29ydCIsICJfaWQiLCAiRVZFTlRfRElTUEFUQ0hFRCIsICJFVkVOVF9BVFRBQ0hFRCIsICJDQVBUVVJFX1JFR0VYIiwgImV2ZW50Q2xvY2siLCAiZXZlbnRQcm94eSIsICJldmVudFByb3h5Q2FwdHVyZSIsICJpIiwgIkVNUFRZX09CSiIsICJFTVBUWV9BUlIiLCAiSVNfTk9OX0RJTUVOU0lPTkFMIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAiYXNzaWduIiwgIm9iaiIsICJwcm9wcyIsICJyZW1vdmVOb2RlIiwgIm5vZGUiLCAicGFyZW50Tm9kZSIsICJyZW1vdmVDaGlsZCIsICJjcmVhdGVFbGVtZW50IiwgInR5cGUiLCAiY2hpbGRyZW4iLCAia2V5IiwgInJlZiIsICJub3JtYWxpemVkUHJvcHMiLCAiYXJndW1lbnRzIiwgImxlbmd0aCIsICJjYWxsIiwgImRlZmF1bHRQcm9wcyIsICJjcmVhdGVWTm9kZSIsICJvcmlnaW5hbCIsICJ2bm9kZSIsICJfX2siLCAiX18iLCAiX19iIiwgIl9fZSIsICJfX2MiLCAiY29uc3RydWN0b3IiLCAiX192IiwgIl9faSIsICJfX3UiLCAiRnJhZ21lbnQiLCAicHJvcHMiLCAiY2hpbGRyZW4iLCAiQmFzZUNvbXBvbmVudCIsICJjb250ZXh0IiwgInRoaXMiLCAiZ2V0RG9tU2libGluZyIsICJ2bm9kZSIsICJjaGlsZEluZGV4IiwgIl9fIiwgIl9faSIsICJzaWJsaW5nIiwgIl9fayIsICJsZW5ndGgiLCAiX19lIiwgInR5cGUiLCAicmVuZGVyQ29tcG9uZW50IiwgImNvbXBvbmVudCIsICJfX1AiLCAiX19kIiwgIm9sZFZOb2RlIiwgIl9fdiIsICJvbGREb20iLCAiY29tbWl0UXVldWUiLCAicmVmUXVldWUiLCAibmV3Vk5vZGUiLCAiYXNzaWduIiwgIm9wdGlvbnMiLCAiZGlmZiIsICJfX24iLCAibmFtZXNwYWNlVVJJIiwgIl9fdSIsICJjb21taXRSb290IiwgInVwZGF0ZVBhcmVudERvbVBvaW50ZXJzIiwgIl9fYyIsICJiYXNlIiwgInNvbWUiLCAiY2hpbGQiLCAiZW5xdWV1ZVJlbmRlciIsICJjIiwgInJlcmVuZGVyUXVldWUiLCAicHVzaCIsICJwcm9jZXNzIiwgIl9fciIsICJwcmV2RGVib3VuY2UiLCAiZGVib3VuY2VSZW5kZXJpbmciLCAiZGVmZXIiLCAibCIsICJzb3J0IiwgImRlcHRoU29ydCIsICJzaGlmdCIsICJkaWZmQ2hpbGRyZW4iLCAicGFyZW50RG9tIiwgInJlbmRlclJlc3VsdCIsICJuZXdQYXJlbnRWTm9kZSIsICJvbGRQYXJlbnRWTm9kZSIsICJnbG9iYWxDb250ZXh0IiwgIm5hbWVzcGFjZSIsICJleGNlc3NEb21DaGlsZHJlbiIsICJpc0h5ZHJhdGluZyIsICJpIiwgImNoaWxkVk5vZGUiLCAibmV3RG9tIiwgImZpcnN0Q2hpbGREb20iLCAicmVzdWx0IiwgInNob3VsZFBsYWNlIiwgIm9sZENoaWxkcmVuIiwgIkVNUFRZX0FSUiIsICJuZXdDaGlsZHJlbkxlbmd0aCIsICJjb25zdHJ1Y3ROZXdDaGlsZHJlbkFycmF5IiwgIkVNUFRZX09CSiIsICJyZWYiLCAiYXBwbHlSZWYiLCAiaW5zZXJ0IiwgIm5leHRTaWJsaW5nIiwgInNrZXdlZEluZGV4IiwgIm1hdGNoaW5nSW5kZXgiLCAib2xkQ2hpbGRyZW5MZW5ndGgiLCAicmVtYWluaW5nT2xkQ2hpbGRyZW4iLCAic2tldyIsICJBcnJheSIsICJjb25zdHJ1Y3RvciIsICJTdHJpbmciLCAiY3JlYXRlVk5vZGUiLCAiaXNBcnJheSIsICJfX2IiLCAia2V5IiwgImZpbmRNYXRjaGluZ0luZGV4IiwgInVubW91bnQiLCAicGFyZW50Vk5vZGUiLCAicGFyZW50Tm9kZSIsICJpbnNlcnRCZWZvcmUiLCAibm9kZVR5cGUiLCAiZmluZE1hdGNoaW5nSW5kZXgiLCAiY2hpbGRWTm9kZSIsICJvbGRDaGlsZHJlbiIsICJza2V3ZWRJbmRleCIsICJyZW1haW5pbmdPbGRDaGlsZHJlbiIsICJ4IiwgInkiLCAiY2hpbGRJbmRleCIsICJrZXkiLCAidHlwZSIsICJvbGRWTm9kZSIsICJtYXRjaGVkIiwgIl9fdSIsICJsZW5ndGgiLCAic2V0U3R5bGUiLCAic3R5bGUiLCAidmFsdWUiLCAic2V0UHJvcGVydHkiLCAiSVNfTk9OX0RJTUVOU0lPTkFMIiwgInRlc3QiLCAiZG9tIiwgIm5hbWUiLCAib2xkVmFsdWUiLCAibmFtZXNwYWNlIiwgInVzZUNhcHR1cmUiLCAibG93ZXJDYXNlTmFtZSIsICJvIiwgImNzc1RleHQiLCAicmVwbGFjZSIsICJDQVBUVVJFX1JFR0VYIiwgInRvTG93ZXJDYXNlIiwgInNsaWNlIiwgImwiLCAiRVZFTlRfQVRUQUNIRUQiLCAiZXZlbnRDbG9jayIsICJhZGRFdmVudExpc3RlbmVyIiwgImV2ZW50UHJveHlDYXB0dXJlIiwgImV2ZW50UHJveHkiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJzZXRBdHRyaWJ1dGUiLCAiY3JlYXRlRXZlbnRQcm94eSIsICJ0aGlzIiwgImV2ZW50SGFuZGxlciIsICJFVkVOVF9ESVNQQVRDSEVEIiwgIm9wdGlvbnMiLCAiZXZlbnQiLCAiZGlmZiIsICJwYXJlbnREb20iLCAibmV3Vk5vZGUiLCAiZ2xvYmFsQ29udGV4dCIsICJleGNlc3NEb21DaGlsZHJlbiIsICJjb21taXRRdWV1ZSIsICJvbGREb20iLCAiaXNIeWRyYXRpbmciLCAicmVmUXVldWUiLCAidG1wIiwgIm9sZENvbW1pdFF1ZXVlTGVuZ3RoIiwgImMiLCAiaXNOZXciLCAib2xkUHJvcHMiLCAib2xkU3RhdGUiLCAic25hcHNob3QiLCAiY2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uIiwgIm5ld1Byb3BzIiwgImlzQ2xhc3NDb21wb25lbnQiLCAicHJvdmlkZXIiLCAiY29tcG9uZW50Q29udGV4dCIsICJyZW5kZXJIb29rIiwgImNvdW50IiwgInJlbmRlclJlc3VsdCIsICJpIiwgIm5ld1R5cGUiLCAiY29uc3RydWN0b3IiLCAiX19lIiwgIl9fYiIsICJvdXRlciIsICJwcm9wcyIsICJwcm90b3R5cGUiLCAicmVuZGVyIiwgImNvbnRleHRUeXBlIiwgIl9fYyIsICJfXyIsICJfX0UiLCAiQmFzZUNvbXBvbmVudCIsICJkb1JlbmRlciIsICJzdWIiLCAic3RhdGUiLCAiX19uIiwgIl9fZCIsICJfX2giLCAiX3NiIiwgIl9fcyIsICJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCAiYXNzaWduIiwgIl9fdiIsICJjb21wb25lbnRXaWxsTW91bnQiLCAiY29tcG9uZW50RGlkTW91bnQiLCAicHVzaCIsICJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwgInNob3VsZENvbXBvbmVudFVwZGF0ZSIsICJfX2siLCAic29tZSIsICJ2bm9kZSIsICJFTVBUWV9BUlIiLCAiYXBwbHkiLCAiY29tcG9uZW50V2lsbFVwZGF0ZSIsICJjb21wb25lbnREaWRVcGRhdGUiLCAiY29udGV4dCIsICJfX1AiLCAiX19yIiwgImdldENoaWxkQ29udGV4dCIsICJnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSIsICJGcmFnbWVudCIsICJjbG9uZU5vZGUiLCAiY2hpbGRyZW4iLCAiZGlmZkNoaWxkcmVuIiwgImlzQXJyYXkiLCAiYmFzZSIsICJ0aGVuIiwgIk1PREVfSFlEUkFURSIsICJub2RlVHlwZSIsICJuZXh0U2libGluZyIsICJpbmRleE9mIiwgInJlbW92ZU5vZGUiLCAibWFya0FzRm9yY2UiLCAiZGlmZkVsZW1lbnROb2RlcyIsICJkaWZmZWQiLCAiY29tbWl0Um9vdCIsICJyb290IiwgImFwcGx5UmVmIiwgImNiIiwgImNhbGwiLCAibm9kZSIsICJtYXAiLCAibmV3SHRtbCIsICJvbGRIdG1sIiwgIm5ld0NoaWxkcmVuIiwgImlucHV0VmFsdWUiLCAiY2hlY2tlZCIsICJFTVBUWV9PQkoiLCAibG9jYWxOYW1lIiwgImRvY3VtZW50IiwgImNyZWF0ZVRleHROb2RlIiwgImNyZWF0ZUVsZW1lbnROUyIsICJpcyIsICJfX20iLCAiZGF0YSIsICJkZWZhdWx0VmFsdWUiLCAiY2hpbGROb2RlcyIsICJhdHRyaWJ1dGVzIiwgIl9faHRtbCIsICJpbm5lckhUTUwiLCAiY29udGVudCIsICJnZXREb21TaWJsaW5nIiwgInVuZGVmaW5lZCIsICJyZWYiLCAiaGFzUmVmVW5tb3VudCIsICJjdXJyZW50IiwgInVubW91bnQiLCAicGFyZW50Vk5vZGUiLCAic2tpcFJlbW92ZSIsICJyIiwgImNvbXBvbmVudFdpbGxVbm1vdW50IiwgInJlcGxhY2VOb2RlIiwgImRvY3VtZW50RWxlbWVudCIsICJjcmVhdGVFbGVtZW50IiwgIm5hbWVzcGFjZVVSSSIsICJmaXJzdENoaWxkIiwgInNsaWNlIiwgIkVNUFRZX0FSUiIsICJvcHRpb25zIiwgIl9fZSIsICJlcnJvciIsICJ2bm9kZSIsICJvbGRWTm9kZSIsICJlcnJvckluZm8iLCAiY29tcG9uZW50IiwgImN0b3IiLCAiaGFuZGxlZCIsICJfXyIsICJfX2MiLCAiY29uc3RydWN0b3IiLCAiZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIiwgInNldFN0YXRlIiwgIl9fZCIsICJjb21wb25lbnREaWRDYXRjaCIsICJfX0UiLCAiZSIsICJ2bm9kZUlkIiwgImlzVmFsaWRFbGVtZW50IiwgIkJhc2VDb21wb25lbnQiLCAicHJvdG90eXBlIiwgInVwZGF0ZSIsICJjYWxsYmFjayIsICJzIiwgInRoaXMiLCAiX19zIiwgInN0YXRlIiwgImFzc2lnbiIsICJwcm9wcyIsICJfX3YiLCAiX3NiIiwgInB1c2giLCAiZW5xdWV1ZVJlbmRlciIsICJmb3JjZVVwZGF0ZSIsICJfX2giLCAicmVuZGVyIiwgIkZyYWdtZW50IiwgInJlcmVuZGVyUXVldWUiLCAiZGVmZXIiLCAiUHJvbWlzZSIsICJ0aGVuIiwgImJpbmQiLCAicmVzb2x2ZSIsICJzZXRUaW1lb3V0IiwgImRlcHRoU29ydCIsICJhIiwgImIiLCAiX19iIiwgInByb2Nlc3MiLCAiX19yIiwgIl9pZCIsICJNYXRoIiwgInJhbmRvbSIsICJ0b1N0cmluZyIsICJFVkVOVF9ESVNQQVRDSEVEIiwgIkVWRU5UX0FUVEFDSEVEIiwgIkNBUFRVUkVfUkVHRVgiLCAiZXZlbnRDbG9jayIsICJldmVudFByb3h5IiwgImNyZWF0ZUV2ZW50UHJveHkiLCAiZXZlbnRQcm94eUNhcHR1cmUiLCAiaSIsICJjdXJyZW50SW5kZXgiLCAiY3VycmVudENvbXBvbmVudCIsICJwcmV2aW91c0NvbXBvbmVudCIsICJwcmV2UmFmIiwgImN1cnJlbnRIb29rIiwgImFmdGVyUGFpbnRFZmZlY3RzIiwgIm9wdGlvbnMiLCAiX29wdGlvbnMiLCAib2xkQmVmb3JlRGlmZiIsICJfX2IiLCAib2xkQmVmb3JlUmVuZGVyIiwgIl9fciIsICJvbGRBZnRlckRpZmYiLCAiZGlmZmVkIiwgIm9sZENvbW1pdCIsICJfX2MiLCAib2xkQmVmb3JlVW5tb3VudCIsICJ1bm1vdW50IiwgIm9sZFJvb3QiLCAiX18iLCAiZ2V0SG9va1N0YXRlIiwgImluZGV4IiwgInR5cGUiLCAiX19oIiwgImhvb2tzIiwgIl9fSCIsICJsZW5ndGgiLCAicHVzaCIsICJ1c2VTdGF0ZSIsICJpbml0aWFsU3RhdGUiLCAidXNlUmVkdWNlciIsICJpbnZva2VPclJldHVybiIsICJyZWR1Y2VyIiwgImluaXQiLCAiaG9va1N0YXRlIiwgIl9yZWR1Y2VyIiwgImFjdGlvbiIsICJjdXJyZW50VmFsdWUiLCAiX19OIiwgIm5leHRWYWx1ZSIsICJzZXRTdGF0ZSIsICJfX2YiLCAidXBkYXRlSG9va1N0YXRlIiwgInAiLCAicyIsICJjIiwgInVwZGF0ZWRIb29rIiwgInNob3VsZFVwZGF0ZSIsICJwcm9wcyIsICJzb21lIiwgImhvb2tJdGVtIiwgInByZXZTY3UiLCAicmVzdWx0IiwgImNhbGwiLCAidGhpcyIsICJzaG91bGRDb21wb25lbnRVcGRhdGUiLCAicHJldkNXVSIsICJjb21wb25lbnRXaWxsVXBkYXRlIiwgIl9fZSIsICJ0bXAiLCAidXNlRWZmZWN0IiwgImNhbGxiYWNrIiwgImFyZ3MiLCAic3RhdGUiLCAiX19zIiwgImFyZ3NDaGFuZ2VkIiwgIl9wZW5kaW5nQXJncyIsICJmbHVzaEFmdGVyUGFpbnRFZmZlY3RzIiwgImNvbXBvbmVudCIsICJhZnRlclBhaW50RWZmZWN0cyIsICJzaGlmdCIsICJob29rcyIsICJfX0giLCAiX19QIiwgIl9faCIsICJzb21lIiwgImludm9rZUNsZWFudXAiLCAiaW52b2tlRWZmZWN0IiwgImUiLCAib3B0aW9ucyIsICJfX2UiLCAiX192IiwgIl9fYiIsICJ2bm9kZSIsICJjdXJyZW50Q29tcG9uZW50IiwgIm9sZEJlZm9yZURpZmYiLCAiX18iLCAicGFyZW50RG9tIiwgIl9fayIsICJfX20iLCAib2xkUm9vdCIsICJfX3IiLCAib2xkQmVmb3JlUmVuZGVyIiwgImN1cnJlbnRJbmRleCIsICJfX2MiLCAicHJldmlvdXNDb21wb25lbnQiLCAiaG9va0l0ZW0iLCAiX19OIiwgIl9wZW5kaW5nQXJncyIsICJkaWZmZWQiLCAib2xkQWZ0ZXJEaWZmIiwgImMiLCAibGVuZ3RoIiwgInB1c2giLCAicHJldlJhZiIsICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCAiYWZ0ZXJOZXh0RnJhbWUiLCAiY29tbWl0UXVldWUiLCAiZmlsdGVyIiwgImNiIiwgIm9sZENvbW1pdCIsICJ1bm1vdW50IiwgIm9sZEJlZm9yZVVubW91bnQiLCAiaGFzRXJyb3JlZCIsICJzIiwgIkhBU19SQUYiLCAiY2FsbGJhY2siLCAicmFmIiwgImRvbmUiLCAiY2xlYXJUaW1lb3V0IiwgInRpbWVvdXQiLCAiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCAic2V0VGltZW91dCIsICJob29rIiwgImNvbXAiLCAiY2xlYW51cCIsICJhcmdzQ2hhbmdlZCIsICJvbGRBcmdzIiwgIm5ld0FyZ3MiLCAiYXJnIiwgImluZGV4IiwgImludm9rZU9yUmV0dXJuIiwgImYiLCAidm5vZGVJZCIsICJjcmVhdGVWTm9kZSIsICJ0eXBlIiwgInByb3BzIiwgImtleSIsICJpc1N0YXRpY0NoaWxkcmVuIiwgIl9fc291cmNlIiwgIl9fc2VsZiIsICJyZWYiLCAiaSIsICJub3JtYWxpemVkUHJvcHMiLCAidm5vZGUiLCAiX19rIiwgIl9fIiwgIl9fYiIsICJfX2UiLCAiX19jIiwgImNvbnN0cnVjdG9yIiwgIl9fdiIsICJ2bm9kZUlkIiwgIl9faSIsICJfX3UiLCAiZGVmYXVsdFByb3BzIiwgIm9wdGlvbnMiLCAiUyIsICJ1IiwgImUiLCAidCIsICJ2IiwgImMiLCAiZCIsICJoIiwgIm0iLCAiaSIsICJrIl0KfQo=
|