@getopenpay/openpay-js 0.5.13 → 0.5.15
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/dist/{ExportResult-B-YLKMaU.js → ExportResult-BacsqwKA.js} +1 -1
- package/dist/{Resource-BZeevyoh.js → Resource-Ds5bbQ3b.js} +4 -4
- package/dist/SimpleSpanProcessor-0bSccE1S.js +910 -0
- package/dist/_commonjsHelpers-CdLE1o9f.js +30 -0
- package/dist/detect-resources-UwRkF4Xd.js +862 -0
- package/dist/{diag-api-CHLb_Weo.js → diag-api-CMlZXyyv.js} +2 -2
- package/dist/index-1jECpTsg.js +147 -0
- package/dist/index-BZEpD-f0.js +6718 -0
- package/dist/index-BhZy-TW3.js +430 -0
- package/dist/index-BmKZeOoc.js +1619 -0
- package/dist/index-CDdbDQxQ.js +6 -0
- package/dist/index-CWTkU3J-.js +18 -0
- package/dist/index-DFO-DCsT.js +127 -0
- package/dist/index-DsxDp11a.js +28 -0
- package/dist/index-JNJd_YS1.js +1012 -0
- package/dist/index-j7i6AeZa.js +7005 -0
- package/dist/index.d.ts +29 -4
- package/dist/index.es.js +2 -2
- package/dist/index.umd.js +45 -45
- package/dist/lifecycle-D1BdEbZs.js +119 -0
- package/dist/{metrics-api-ClKmMX3Y.js → metrics-api-C9pRFfr-.js} +2 -2
- package/dist/sdk-info-ChuKu8zW.js +285 -0
- package/dist/suppress-tracing-B94rObkn.js +17 -0
- package/dist/url-CdPstDG9.js +798 -0
- package/dist/utils--M6ihaNw.js +101 -0
- package/dist/utils-De78ey-v.js +12 -0
- package/dist/utils-VJ-0MC7c.js +270 -0
- package/package.json +4 -4
- package/dist/SimpleSpanProcessor-CwJD-GjM.js +0 -957
- package/dist/_commonjsHelpers-f76XedMs.js +0 -25
- package/dist/detect-resources-BatabDmW.js +0 -854
- package/dist/index-ByaN1AdQ.js +0 -6685
- package/dist/index-CU4AI3HW.js +0 -52
- package/dist/index-Cb34s3AM.js +0 -1599
- package/dist/index-CmtkHZgE.js +0 -330
- package/dist/index-CtZ-xuHu.js +0 -7041
- package/dist/index-D5OCmVN-.js +0 -19
- package/dist/index-DLJd6nUV.js +0 -150
- package/dist/index-DjekHBls.js +0 -431
- package/dist/index-DoKHV9rR.js +0 -130
- package/dist/index-_ZTp3kCj.js +0 -830
- package/dist/lifecycle-BjQ-7GLm.js +0 -119
- package/dist/sdk-info-DYuuxEVK.js +0 -484
- package/dist/url-BAeEv8aD.js +0 -797
- package/dist/utils--qqdHZ_b.js +0 -142
- package/dist/utils-Bf8wDuNo.js +0 -381
- package/dist/utils-CX5YT7yI.js +0 -14
|
@@ -0,0 +1,1619 @@
|
|
|
1
|
+
import { R as qe } from "./index-j7i6AeZa.js";
|
|
2
|
+
function xt(j) {
|
|
3
|
+
return j === void 0 && (j = {}), typeof j.addEventListener == "function" && typeof j.removeEventListener == "function";
|
|
4
|
+
}
|
|
5
|
+
var Et = "OT_ZONE_CONTEXT", zt = (
|
|
6
|
+
/** @class */
|
|
7
|
+
function() {
|
|
8
|
+
function j() {
|
|
9
|
+
this._enabled = !1, this._zoneCounter = 0;
|
|
10
|
+
}
|
|
11
|
+
return j.prototype._activeContextFromZone = function(S) {
|
|
12
|
+
return S && S.get(Et) || qe;
|
|
13
|
+
}, j.prototype._bindFunction = function(S, B) {
|
|
14
|
+
var z = this, ee = function() {
|
|
15
|
+
for (var te = this, ie = [], fe = 0; fe < arguments.length; fe++)
|
|
16
|
+
ie[fe] = arguments[fe];
|
|
17
|
+
return z.with(S, function() {
|
|
18
|
+
return B.apply(te, ie);
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
return Object.defineProperty(ee, "length", {
|
|
22
|
+
enumerable: !1,
|
|
23
|
+
configurable: !0,
|
|
24
|
+
writable: !1,
|
|
25
|
+
value: B.length
|
|
26
|
+
}), ee;
|
|
27
|
+
}, j.prototype._bindListener = function(S, B) {
|
|
28
|
+
var z = B;
|
|
29
|
+
return z.__ot_listeners !== void 0 || (z.__ot_listeners = {}, typeof z.addEventListener == "function" && (z.addEventListener = this._patchAddEventListener(z, z.addEventListener, S)), typeof z.removeEventListener == "function" && (z.removeEventListener = this._patchRemoveEventListener(z, z.removeEventListener))), B;
|
|
30
|
+
}, j.prototype._createZoneName = function() {
|
|
31
|
+
this._zoneCounter++;
|
|
32
|
+
var S = Math.random();
|
|
33
|
+
return this._zoneCounter + "-" + S;
|
|
34
|
+
}, j.prototype._createZone = function(S, B) {
|
|
35
|
+
var z;
|
|
36
|
+
return Zone.current.fork({
|
|
37
|
+
name: S,
|
|
38
|
+
properties: (z = {}, z[Et] = B, z)
|
|
39
|
+
});
|
|
40
|
+
}, j.prototype._getActiveZone = function() {
|
|
41
|
+
return Zone.current;
|
|
42
|
+
}, j.prototype._patchAddEventListener = function(S, B, z) {
|
|
43
|
+
var ee = this;
|
|
44
|
+
return function(te, ie, fe) {
|
|
45
|
+
S.__ot_listeners === void 0 && (S.__ot_listeners = {});
|
|
46
|
+
var ke = S.__ot_listeners[te];
|
|
47
|
+
ke === void 0 && (ke = /* @__PURE__ */ new WeakMap(), S.__ot_listeners[te] = ke);
|
|
48
|
+
var ve = ee.bind(z, ie);
|
|
49
|
+
return ke.set(ie, ve), B.call(this, te, ve, fe);
|
|
50
|
+
};
|
|
51
|
+
}, j.prototype._patchRemoveEventListener = function(S, B) {
|
|
52
|
+
return function(z, ee) {
|
|
53
|
+
if (S.__ot_listeners === void 0 || S.__ot_listeners[z] === void 0)
|
|
54
|
+
return B.call(this, z, ee);
|
|
55
|
+
var te = S.__ot_listeners[z], ie = te.get(ee);
|
|
56
|
+
return te.delete(ee), B.call(this, z, ie || ee);
|
|
57
|
+
};
|
|
58
|
+
}, j.prototype.active = function() {
|
|
59
|
+
if (!this._enabled)
|
|
60
|
+
return qe;
|
|
61
|
+
var S = this._getActiveZone(), B = this._activeContextFromZone(S);
|
|
62
|
+
return B || qe;
|
|
63
|
+
}, j.prototype.bind = function(S, B) {
|
|
64
|
+
return S === void 0 && (S = this.active()), typeof B == "function" ? this._bindFunction(S, B) : (xt(B) && this._bindListener(S, B), B);
|
|
65
|
+
}, j.prototype.disable = function() {
|
|
66
|
+
return this._enabled = !1, this;
|
|
67
|
+
}, j.prototype.enable = function() {
|
|
68
|
+
return this._enabled = !0, this;
|
|
69
|
+
}, j.prototype.with = function(S, B, z) {
|
|
70
|
+
for (var ee = [], te = 3; te < arguments.length; te++)
|
|
71
|
+
ee[te - 3] = arguments[te];
|
|
72
|
+
var ie = this._createZoneName(), fe = this._createZone(ie, S);
|
|
73
|
+
return fe.run(B, z, ee);
|
|
74
|
+
}, j;
|
|
75
|
+
}()
|
|
76
|
+
), pt = {}, gt;
|
|
77
|
+
function Ft() {
|
|
78
|
+
if (gt) return pt;
|
|
79
|
+
gt = 1;
|
|
80
|
+
/**
|
|
81
|
+
* @license Angular v<unknown>
|
|
82
|
+
* (c) 2010-2025 Google LLC. https://angular.io/
|
|
83
|
+
* License: MIT
|
|
84
|
+
*/
|
|
85
|
+
const j = globalThis;
|
|
86
|
+
function S(t) {
|
|
87
|
+
return (j.__Zone_symbol_prefix || "__zone_symbol__") + t;
|
|
88
|
+
}
|
|
89
|
+
function B() {
|
|
90
|
+
const t = j.performance;
|
|
91
|
+
function n(I) {
|
|
92
|
+
t && t.mark && t.mark(I);
|
|
93
|
+
}
|
|
94
|
+
function a(I, s) {
|
|
95
|
+
t && t.measure && t.measure(I, s);
|
|
96
|
+
}
|
|
97
|
+
n("Zone");
|
|
98
|
+
class e {
|
|
99
|
+
static __symbol__ = S;
|
|
100
|
+
static assertZonePatched() {
|
|
101
|
+
if (j.Promise !== O.ZoneAwarePromise)
|
|
102
|
+
throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)");
|
|
103
|
+
}
|
|
104
|
+
static get root() {
|
|
105
|
+
let s = e.current;
|
|
106
|
+
for (; s.parent; )
|
|
107
|
+
s = s.parent;
|
|
108
|
+
return s;
|
|
109
|
+
}
|
|
110
|
+
static get current() {
|
|
111
|
+
return b.zone;
|
|
112
|
+
}
|
|
113
|
+
static get currentTask() {
|
|
114
|
+
return D;
|
|
115
|
+
}
|
|
116
|
+
static __load_patch(s, i, r = !1) {
|
|
117
|
+
if (O.hasOwnProperty(s)) {
|
|
118
|
+
const E = j[S("forceDuplicateZoneCheck")] === !0;
|
|
119
|
+
if (!r && E)
|
|
120
|
+
throw Error("Already loaded patch: " + s);
|
|
121
|
+
} else if (!j["__Zone_disable_" + s]) {
|
|
122
|
+
const E = "Zone:" + s;
|
|
123
|
+
n(E), O[s] = i(j, e, P), a(E, E);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
get parent() {
|
|
127
|
+
return this._parent;
|
|
128
|
+
}
|
|
129
|
+
get name() {
|
|
130
|
+
return this._name;
|
|
131
|
+
}
|
|
132
|
+
_parent;
|
|
133
|
+
_name;
|
|
134
|
+
_properties;
|
|
135
|
+
_zoneDelegate;
|
|
136
|
+
constructor(s, i) {
|
|
137
|
+
this._parent = s, this._name = i ? i.name || "unnamed" : "<root>", this._properties = i && i.properties || {}, this._zoneDelegate = new f(this, this._parent && this._parent._zoneDelegate, i);
|
|
138
|
+
}
|
|
139
|
+
get(s) {
|
|
140
|
+
const i = this.getZoneWith(s);
|
|
141
|
+
if (i)
|
|
142
|
+
return i._properties[s];
|
|
143
|
+
}
|
|
144
|
+
getZoneWith(s) {
|
|
145
|
+
let i = this;
|
|
146
|
+
for (; i; ) {
|
|
147
|
+
if (i._properties.hasOwnProperty(s))
|
|
148
|
+
return i;
|
|
149
|
+
i = i._parent;
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
fork(s) {
|
|
154
|
+
if (!s)
|
|
155
|
+
throw new Error("ZoneSpec required!");
|
|
156
|
+
return this._zoneDelegate.fork(this, s);
|
|
157
|
+
}
|
|
158
|
+
wrap(s, i) {
|
|
159
|
+
if (typeof s != "function")
|
|
160
|
+
throw new Error("Expecting function got: " + s);
|
|
161
|
+
const r = this._zoneDelegate.intercept(this, s, i), E = this;
|
|
162
|
+
return function() {
|
|
163
|
+
return E.runGuarded(r, this, arguments, i);
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
run(s, i, r, E) {
|
|
167
|
+
b = { parent: b, zone: this };
|
|
168
|
+
try {
|
|
169
|
+
return this._zoneDelegate.invoke(this, s, i, r, E);
|
|
170
|
+
} finally {
|
|
171
|
+
b = b.parent;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
runGuarded(s, i = null, r, E) {
|
|
175
|
+
b = { parent: b, zone: this };
|
|
176
|
+
try {
|
|
177
|
+
try {
|
|
178
|
+
return this._zoneDelegate.invoke(this, s, i, r, E);
|
|
179
|
+
} catch (G) {
|
|
180
|
+
if (this._zoneDelegate.handleError(this, G))
|
|
181
|
+
throw G;
|
|
182
|
+
}
|
|
183
|
+
} finally {
|
|
184
|
+
b = b.parent;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
runTask(s, i, r) {
|
|
188
|
+
if (s.zone != this)
|
|
189
|
+
throw new Error("A task can only be run in the zone of creation! (Creation: " + (s.zone || re).name + "; Execution: " + this.name + ")");
|
|
190
|
+
const E = s, { type: G, data: { isPeriodic: ce = !1, isRefreshable: A = !1 } = {} } = s;
|
|
191
|
+
if (s.state === J && (G === Y || G === g))
|
|
192
|
+
return;
|
|
193
|
+
const ge = s.state != x;
|
|
194
|
+
ge && E._transitionTo(x, d);
|
|
195
|
+
const ye = D;
|
|
196
|
+
D = E, b = { parent: b, zone: this };
|
|
197
|
+
try {
|
|
198
|
+
G == g && s.data && !ce && !A && (s.cancelFn = void 0);
|
|
199
|
+
try {
|
|
200
|
+
return this._zoneDelegate.invokeTask(this, E, i, r);
|
|
201
|
+
} catch (se) {
|
|
202
|
+
if (this._zoneDelegate.handleError(this, se))
|
|
203
|
+
throw se;
|
|
204
|
+
}
|
|
205
|
+
} finally {
|
|
206
|
+
const se = s.state;
|
|
207
|
+
if (se !== J && se !== K)
|
|
208
|
+
if (G == Y || ce || A && se === k)
|
|
209
|
+
ge && E._transitionTo(d, x, k);
|
|
210
|
+
else {
|
|
211
|
+
const Ce = E._zoneDelegates;
|
|
212
|
+
this._updateTaskCount(E, -1), ge && E._transitionTo(J, x, J), A && (E._zoneDelegates = Ce);
|
|
213
|
+
}
|
|
214
|
+
b = b.parent, D = ye;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
scheduleTask(s) {
|
|
218
|
+
if (s.zone && s.zone !== this) {
|
|
219
|
+
let r = this;
|
|
220
|
+
for (; r; ) {
|
|
221
|
+
if (r === s.zone)
|
|
222
|
+
throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${s.zone.name}`);
|
|
223
|
+
r = r.parent;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
s._transitionTo(k, J);
|
|
227
|
+
const i = [];
|
|
228
|
+
s._zoneDelegates = i, s._zone = this;
|
|
229
|
+
try {
|
|
230
|
+
s = this._zoneDelegate.scheduleTask(this, s);
|
|
231
|
+
} catch (r) {
|
|
232
|
+
throw s._transitionTo(K, k, J), this._zoneDelegate.handleError(this, r), r;
|
|
233
|
+
}
|
|
234
|
+
return s._zoneDelegates === i && this._updateTaskCount(s, 1), s.state == k && s._transitionTo(d, k), s;
|
|
235
|
+
}
|
|
236
|
+
scheduleMicroTask(s, i, r, E) {
|
|
237
|
+
return this.scheduleTask(new p(U, s, i, r, E, void 0));
|
|
238
|
+
}
|
|
239
|
+
scheduleMacroTask(s, i, r, E, G) {
|
|
240
|
+
return this.scheduleTask(new p(g, s, i, r, E, G));
|
|
241
|
+
}
|
|
242
|
+
scheduleEventTask(s, i, r, E, G) {
|
|
243
|
+
return this.scheduleTask(new p(Y, s, i, r, E, G));
|
|
244
|
+
}
|
|
245
|
+
cancelTask(s) {
|
|
246
|
+
if (s.zone != this)
|
|
247
|
+
throw new Error("A task can only be cancelled in the zone of creation! (Creation: " + (s.zone || re).name + "; Execution: " + this.name + ")");
|
|
248
|
+
if (!(s.state !== d && s.state !== x)) {
|
|
249
|
+
s._transitionTo(V, d, x);
|
|
250
|
+
try {
|
|
251
|
+
this._zoneDelegate.cancelTask(this, s);
|
|
252
|
+
} catch (i) {
|
|
253
|
+
throw s._transitionTo(K, V), this._zoneDelegate.handleError(this, i), i;
|
|
254
|
+
}
|
|
255
|
+
return this._updateTaskCount(s, -1), s._transitionTo(J, V), s.runCount = -1, s;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
_updateTaskCount(s, i) {
|
|
259
|
+
const r = s._zoneDelegates;
|
|
260
|
+
i == -1 && (s._zoneDelegates = null);
|
|
261
|
+
for (let E = 0; E < r.length; E++)
|
|
262
|
+
r[E]._updateTaskCount(s.type, i);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const c = {
|
|
266
|
+
name: "",
|
|
267
|
+
onHasTask: (I, s, i, r) => I.hasTask(i, r),
|
|
268
|
+
onScheduleTask: (I, s, i, r) => I.scheduleTask(i, r),
|
|
269
|
+
onInvokeTask: (I, s, i, r, E, G) => I.invokeTask(i, r, E, G),
|
|
270
|
+
onCancelTask: (I, s, i, r) => I.cancelTask(i, r)
|
|
271
|
+
};
|
|
272
|
+
class f {
|
|
273
|
+
get zone() {
|
|
274
|
+
return this._zone;
|
|
275
|
+
}
|
|
276
|
+
_zone;
|
|
277
|
+
_taskCounts = {
|
|
278
|
+
microTask: 0,
|
|
279
|
+
macroTask: 0,
|
|
280
|
+
eventTask: 0
|
|
281
|
+
};
|
|
282
|
+
_parentDelegate;
|
|
283
|
+
_forkDlgt;
|
|
284
|
+
_forkZS;
|
|
285
|
+
_forkCurrZone;
|
|
286
|
+
_interceptDlgt;
|
|
287
|
+
_interceptZS;
|
|
288
|
+
_interceptCurrZone;
|
|
289
|
+
_invokeDlgt;
|
|
290
|
+
_invokeZS;
|
|
291
|
+
_invokeCurrZone;
|
|
292
|
+
_handleErrorDlgt;
|
|
293
|
+
_handleErrorZS;
|
|
294
|
+
_handleErrorCurrZone;
|
|
295
|
+
_scheduleTaskDlgt;
|
|
296
|
+
_scheduleTaskZS;
|
|
297
|
+
_scheduleTaskCurrZone;
|
|
298
|
+
_invokeTaskDlgt;
|
|
299
|
+
_invokeTaskZS;
|
|
300
|
+
_invokeTaskCurrZone;
|
|
301
|
+
_cancelTaskDlgt;
|
|
302
|
+
_cancelTaskZS;
|
|
303
|
+
_cancelTaskCurrZone;
|
|
304
|
+
_hasTaskDlgt;
|
|
305
|
+
_hasTaskDlgtOwner;
|
|
306
|
+
_hasTaskZS;
|
|
307
|
+
_hasTaskCurrZone;
|
|
308
|
+
constructor(s, i, r) {
|
|
309
|
+
this._zone = s, this._parentDelegate = i, this._forkZS = r && (r && r.onFork ? r : i._forkZS), this._forkDlgt = r && (r.onFork ? i : i._forkDlgt), this._forkCurrZone = r && (r.onFork ? this._zone : i._forkCurrZone), this._interceptZS = r && (r.onIntercept ? r : i._interceptZS), this._interceptDlgt = r && (r.onIntercept ? i : i._interceptDlgt), this._interceptCurrZone = r && (r.onIntercept ? this._zone : i._interceptCurrZone), this._invokeZS = r && (r.onInvoke ? r : i._invokeZS), this._invokeDlgt = r && (r.onInvoke ? i : i._invokeDlgt), this._invokeCurrZone = r && (r.onInvoke ? this._zone : i._invokeCurrZone), this._handleErrorZS = r && (r.onHandleError ? r : i._handleErrorZS), this._handleErrorDlgt = r && (r.onHandleError ? i : i._handleErrorDlgt), this._handleErrorCurrZone = r && (r.onHandleError ? this._zone : i._handleErrorCurrZone), this._scheduleTaskZS = r && (r.onScheduleTask ? r : i._scheduleTaskZS), this._scheduleTaskDlgt = r && (r.onScheduleTask ? i : i._scheduleTaskDlgt), this._scheduleTaskCurrZone = r && (r.onScheduleTask ? this._zone : i._scheduleTaskCurrZone), this._invokeTaskZS = r && (r.onInvokeTask ? r : i._invokeTaskZS), this._invokeTaskDlgt = r && (r.onInvokeTask ? i : i._invokeTaskDlgt), this._invokeTaskCurrZone = r && (r.onInvokeTask ? this._zone : i._invokeTaskCurrZone), this._cancelTaskZS = r && (r.onCancelTask ? r : i._cancelTaskZS), this._cancelTaskDlgt = r && (r.onCancelTask ? i : i._cancelTaskDlgt), this._cancelTaskCurrZone = r && (r.onCancelTask ? this._zone : i._cancelTaskCurrZone), this._hasTaskZS = null, this._hasTaskDlgt = null, this._hasTaskDlgtOwner = null, this._hasTaskCurrZone = null;
|
|
310
|
+
const E = r && r.onHasTask, G = i && i._hasTaskZS;
|
|
311
|
+
(E || G) && (this._hasTaskZS = E ? r : c, this._hasTaskDlgt = i, this._hasTaskDlgtOwner = this, this._hasTaskCurrZone = this._zone, r.onScheduleTask || (this._scheduleTaskZS = c, this._scheduleTaskDlgt = i, this._scheduleTaskCurrZone = this._zone), r.onInvokeTask || (this._invokeTaskZS = c, this._invokeTaskDlgt = i, this._invokeTaskCurrZone = this._zone), r.onCancelTask || (this._cancelTaskZS = c, this._cancelTaskDlgt = i, this._cancelTaskCurrZone = this._zone));
|
|
312
|
+
}
|
|
313
|
+
fork(s, i) {
|
|
314
|
+
return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, s, i) : new e(s, i);
|
|
315
|
+
}
|
|
316
|
+
intercept(s, i, r) {
|
|
317
|
+
return this._interceptZS ? this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, s, i, r) : i;
|
|
318
|
+
}
|
|
319
|
+
invoke(s, i, r, E, G) {
|
|
320
|
+
return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, s, i, r, E, G) : i.apply(r, E);
|
|
321
|
+
}
|
|
322
|
+
handleError(s, i) {
|
|
323
|
+
return this._handleErrorZS ? this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, s, i) : !0;
|
|
324
|
+
}
|
|
325
|
+
scheduleTask(s, i) {
|
|
326
|
+
let r = i;
|
|
327
|
+
if (this._scheduleTaskZS)
|
|
328
|
+
this._hasTaskZS && r._zoneDelegates.push(this._hasTaskDlgtOwner), r = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, s, i), r || (r = i);
|
|
329
|
+
else if (i.scheduleFn)
|
|
330
|
+
i.scheduleFn(i);
|
|
331
|
+
else if (i.type == U)
|
|
332
|
+
X(i);
|
|
333
|
+
else
|
|
334
|
+
throw new Error("Task is missing scheduleFn.");
|
|
335
|
+
return r;
|
|
336
|
+
}
|
|
337
|
+
invokeTask(s, i, r, E) {
|
|
338
|
+
return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, s, i, r, E) : i.callback.apply(r, E);
|
|
339
|
+
}
|
|
340
|
+
cancelTask(s, i) {
|
|
341
|
+
let r;
|
|
342
|
+
if (this._cancelTaskZS)
|
|
343
|
+
r = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, s, i);
|
|
344
|
+
else {
|
|
345
|
+
if (!i.cancelFn)
|
|
346
|
+
throw Error("Task is not cancelable");
|
|
347
|
+
r = i.cancelFn(i);
|
|
348
|
+
}
|
|
349
|
+
return r;
|
|
350
|
+
}
|
|
351
|
+
hasTask(s, i) {
|
|
352
|
+
try {
|
|
353
|
+
this._hasTaskZS && this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, s, i);
|
|
354
|
+
} catch (r) {
|
|
355
|
+
this.handleError(s, r);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
_updateTaskCount(s, i) {
|
|
359
|
+
const r = this._taskCounts, E = r[s], G = r[s] = E + i;
|
|
360
|
+
if (G < 0)
|
|
361
|
+
throw new Error("More tasks executed then were scheduled.");
|
|
362
|
+
if (E == 0 || G == 0) {
|
|
363
|
+
const ce = {
|
|
364
|
+
microTask: r.microTask > 0,
|
|
365
|
+
macroTask: r.macroTask > 0,
|
|
366
|
+
eventTask: r.eventTask > 0,
|
|
367
|
+
change: s
|
|
368
|
+
};
|
|
369
|
+
this.hasTask(this._zone, ce);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
class p {
|
|
374
|
+
type;
|
|
375
|
+
source;
|
|
376
|
+
invoke;
|
|
377
|
+
callback;
|
|
378
|
+
data;
|
|
379
|
+
scheduleFn;
|
|
380
|
+
cancelFn;
|
|
381
|
+
_zone = null;
|
|
382
|
+
runCount = 0;
|
|
383
|
+
_zoneDelegates = null;
|
|
384
|
+
_state = "notScheduled";
|
|
385
|
+
constructor(s, i, r, E, G, ce) {
|
|
386
|
+
if (this.type = s, this.source = i, this.data = E, this.scheduleFn = G, this.cancelFn = ce, !r)
|
|
387
|
+
throw new Error("callback is not defined");
|
|
388
|
+
this.callback = r;
|
|
389
|
+
const A = this;
|
|
390
|
+
s === Y && E && E.useG ? this.invoke = p.invokeTask : this.invoke = function() {
|
|
391
|
+
return p.invokeTask.call(j, A, this, arguments);
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
static invokeTask(s, i, r) {
|
|
395
|
+
s || (s = this), oe++;
|
|
396
|
+
try {
|
|
397
|
+
return s.runCount++, s.zone.runTask(s, i, r);
|
|
398
|
+
} finally {
|
|
399
|
+
oe == 1 && ne(), oe--;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
get zone() {
|
|
403
|
+
return this._zone;
|
|
404
|
+
}
|
|
405
|
+
get state() {
|
|
406
|
+
return this._state;
|
|
407
|
+
}
|
|
408
|
+
cancelScheduleRequest() {
|
|
409
|
+
this._transitionTo(J, k);
|
|
410
|
+
}
|
|
411
|
+
_transitionTo(s, i, r) {
|
|
412
|
+
if (this._state === i || this._state === r)
|
|
413
|
+
this._state = s, s == J && (this._zoneDelegates = null);
|
|
414
|
+
else
|
|
415
|
+
throw new Error(`${this.type} '${this.source}': can not transition to '${s}', expecting state '${i}'${r ? " or '" + r + "'" : ""}, was '${this._state}'.`);
|
|
416
|
+
}
|
|
417
|
+
toString() {
|
|
418
|
+
return this.data && typeof this.data.handleId < "u" ? this.data.handleId.toString() : Object.prototype.toString.call(this);
|
|
419
|
+
}
|
|
420
|
+
// add toJSON method to prevent cyclic error when
|
|
421
|
+
// call JSON.stringify(zoneTask)
|
|
422
|
+
toJSON() {
|
|
423
|
+
return {
|
|
424
|
+
type: this.type,
|
|
425
|
+
state: this.state,
|
|
426
|
+
source: this.source,
|
|
427
|
+
zone: this.zone.name,
|
|
428
|
+
runCount: this.runCount
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
const T = S("setTimeout"), y = S("Promise"), w = S("then");
|
|
433
|
+
let _ = [], C = !1, M;
|
|
434
|
+
function F(I) {
|
|
435
|
+
if (M || j[y] && (M = j[y].resolve(0)), M) {
|
|
436
|
+
let s = M[w];
|
|
437
|
+
s || (s = M.then), s.call(M, I);
|
|
438
|
+
} else
|
|
439
|
+
j[T](I, 0);
|
|
440
|
+
}
|
|
441
|
+
function X(I) {
|
|
442
|
+
oe === 0 && _.length === 0 && F(ne), I && _.push(I);
|
|
443
|
+
}
|
|
444
|
+
function ne() {
|
|
445
|
+
if (!C) {
|
|
446
|
+
for (C = !0; _.length; ) {
|
|
447
|
+
const I = _;
|
|
448
|
+
_ = [];
|
|
449
|
+
for (let s = 0; s < I.length; s++) {
|
|
450
|
+
const i = I[s];
|
|
451
|
+
try {
|
|
452
|
+
i.zone.runTask(i, null, null);
|
|
453
|
+
} catch (r) {
|
|
454
|
+
P.onUnhandledError(r);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
P.microtaskDrainDone(), C = !1;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
const re = { name: "NO ZONE" }, J = "notScheduled", k = "scheduling", d = "scheduled", x = "running", V = "canceling", K = "unknown", U = "microTask", g = "macroTask", Y = "eventTask", O = {}, P = {
|
|
462
|
+
symbol: S,
|
|
463
|
+
currentZoneFrame: () => b,
|
|
464
|
+
onUnhandledError: $,
|
|
465
|
+
microtaskDrainDone: $,
|
|
466
|
+
scheduleMicroTask: X,
|
|
467
|
+
showUncaughtError: () => !e[S("ignoreConsoleErrorUncaughtError")],
|
|
468
|
+
patchEventTarget: () => [],
|
|
469
|
+
patchOnProperties: $,
|
|
470
|
+
patchMethod: () => $,
|
|
471
|
+
bindArguments: () => [],
|
|
472
|
+
patchThen: () => $,
|
|
473
|
+
patchMacroTask: () => $,
|
|
474
|
+
patchEventPrototype: () => $,
|
|
475
|
+
isIEOrEdge: () => !1,
|
|
476
|
+
getGlobalObjects: () => {
|
|
477
|
+
},
|
|
478
|
+
ObjectDefineProperty: () => $,
|
|
479
|
+
ObjectGetOwnPropertyDescriptor: () => {
|
|
480
|
+
},
|
|
481
|
+
ObjectCreate: () => {
|
|
482
|
+
},
|
|
483
|
+
ArraySlice: () => [],
|
|
484
|
+
patchClass: () => $,
|
|
485
|
+
wrapWithCurrentZone: () => $,
|
|
486
|
+
filterProperties: () => [],
|
|
487
|
+
attachOriginToPatched: () => $,
|
|
488
|
+
_redefineProperty: () => $,
|
|
489
|
+
patchCallbacks: () => $,
|
|
490
|
+
nativeScheduleMicroTask: F
|
|
491
|
+
};
|
|
492
|
+
let b = { parent: null, zone: new e(null, null) }, D = null, oe = 0;
|
|
493
|
+
function $() {
|
|
494
|
+
}
|
|
495
|
+
return a("Zone", "Zone"), e;
|
|
496
|
+
}
|
|
497
|
+
function z() {
|
|
498
|
+
const t = globalThis, n = t[S("forceDuplicateZoneCheck")] === !0;
|
|
499
|
+
if (t.Zone && (n || typeof t.Zone.__symbol__ != "function"))
|
|
500
|
+
throw new Error("Zone already loaded.");
|
|
501
|
+
return t.Zone ??= B(), t.Zone;
|
|
502
|
+
}
|
|
503
|
+
const ee = Object.getOwnPropertyDescriptor, te = Object.defineProperty, ie = Object.getPrototypeOf, fe = Object.create, ke = Array.prototype.slice, ve = "addEventListener", Ae = "removeEventListener", je = S(ve), He = S(Ae), _e = "true", Te = "false", we = S("");
|
|
504
|
+
function xe(t, n) {
|
|
505
|
+
return Zone.current.wrap(t, n);
|
|
506
|
+
}
|
|
507
|
+
function Fe(t, n, a, e, c) {
|
|
508
|
+
return Zone.current.scheduleMacroTask(t, n, a, e, c);
|
|
509
|
+
}
|
|
510
|
+
const H = S, Ne = typeof window < "u", De = Ne ? window : void 0, Q = Ne && De || globalThis, mt = "removeAttribute";
|
|
511
|
+
function Ve(t, n) {
|
|
512
|
+
for (let a = t.length - 1; a >= 0; a--)
|
|
513
|
+
typeof t[a] == "function" && (t[a] = xe(t[a], n + "_" + a));
|
|
514
|
+
return t;
|
|
515
|
+
}
|
|
516
|
+
function yt(t, n) {
|
|
517
|
+
const a = t.constructor.name;
|
|
518
|
+
for (let e = 0; e < n.length; e++) {
|
|
519
|
+
const c = n[e], f = t[c];
|
|
520
|
+
if (f) {
|
|
521
|
+
const p = ee(t, c);
|
|
522
|
+
if (!Xe(p))
|
|
523
|
+
continue;
|
|
524
|
+
t[c] = ((T) => {
|
|
525
|
+
const y = function() {
|
|
526
|
+
return T.apply(this, Ve(arguments, a + "." + c));
|
|
527
|
+
};
|
|
528
|
+
return pe(y, T), y;
|
|
529
|
+
})(f);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
function Xe(t) {
|
|
534
|
+
return t ? t.writable === !1 ? !1 : !(typeof t.get == "function" && typeof t.set > "u") : !0;
|
|
535
|
+
}
|
|
536
|
+
const Ye = typeof WorkerGlobalScope < "u" && self instanceof WorkerGlobalScope, Ze = !("nw" in Q) && typeof Q.process < "u" && Q.process.toString() === "[object process]", ze = !Ze && !Ye && !!(Ne && De.HTMLElement), $e = typeof Q.process < "u" && Q.process.toString() === "[object process]" && !Ye && !!(Ne && De.HTMLElement), Le = {}, kt = H("enable_beforeunload"), Je = function(t) {
|
|
537
|
+
if (t = t || Q.event, !t)
|
|
538
|
+
return;
|
|
539
|
+
let n = Le[t.type];
|
|
540
|
+
n || (n = Le[t.type] = H("ON_PROPERTY" + t.type));
|
|
541
|
+
const a = this || t.target || Q, e = a[n];
|
|
542
|
+
let c;
|
|
543
|
+
if (ze && a === De && t.type === "error") {
|
|
544
|
+
const f = t;
|
|
545
|
+
c = e && e.call(this, f.message, f.filename, f.lineno, f.colno, f.error), c === !0 && t.preventDefault();
|
|
546
|
+
} else
|
|
547
|
+
c = e && e.apply(this, arguments), // https://github.com/angular/angular/issues/47579
|
|
548
|
+
// https://www.w3.org/TR/2011/WD-html5-20110525/history.html#beforeunloadevent
|
|
549
|
+
// This is the only specific case we should check for. The spec defines that the
|
|
550
|
+
// `returnValue` attribute represents the message to show the user. When the event
|
|
551
|
+
// is created, this attribute must be set to the empty string.
|
|
552
|
+
t.type === "beforeunload" && // To prevent any breaking changes resulting from this change, given that
|
|
553
|
+
// it was already causing a significant number of failures in G3, we have hidden
|
|
554
|
+
// that behavior behind a global configuration flag. Consumers can enable this
|
|
555
|
+
// flag explicitly if they want the `beforeunload` event to be handled as defined
|
|
556
|
+
// in the specification.
|
|
557
|
+
Q[kt] && // The IDL event definition is `attribute DOMString returnValue`, so we check whether
|
|
558
|
+
// `typeof result` is a string.
|
|
559
|
+
typeof c == "string" ? t.returnValue = c : c != null && !c && t.preventDefault();
|
|
560
|
+
return c;
|
|
561
|
+
};
|
|
562
|
+
function Ke(t, n, a) {
|
|
563
|
+
let e = ee(t, n);
|
|
564
|
+
if (!e && a && ee(a, n) && (e = { enumerable: !0, configurable: !0 }), !e || !e.configurable)
|
|
565
|
+
return;
|
|
566
|
+
const c = H("on" + n + "patched");
|
|
567
|
+
if (t.hasOwnProperty(c) && t[c])
|
|
568
|
+
return;
|
|
569
|
+
delete e.writable, delete e.value;
|
|
570
|
+
const f = e.get, p = e.set, T = n.slice(2);
|
|
571
|
+
let y = Le[T];
|
|
572
|
+
y || (y = Le[T] = H("ON_PROPERTY" + T)), e.set = function(w) {
|
|
573
|
+
let _ = this;
|
|
574
|
+
if (!_ && t === Q && (_ = Q), !_)
|
|
575
|
+
return;
|
|
576
|
+
typeof _[y] == "function" && _.removeEventListener(T, Je), p?.call(_, null), _[y] = w, typeof w == "function" && _.addEventListener(T, Je, !1);
|
|
577
|
+
}, e.get = function() {
|
|
578
|
+
let w = this;
|
|
579
|
+
if (!w && t === Q && (w = Q), !w)
|
|
580
|
+
return null;
|
|
581
|
+
const _ = w[y];
|
|
582
|
+
if (_)
|
|
583
|
+
return _;
|
|
584
|
+
if (f) {
|
|
585
|
+
let C = f.call(this);
|
|
586
|
+
if (C)
|
|
587
|
+
return e.set.call(this, C), typeof w[mt] == "function" && w.removeAttribute(n), C;
|
|
588
|
+
}
|
|
589
|
+
return null;
|
|
590
|
+
}, te(t, n, e), t[c] = !0;
|
|
591
|
+
}
|
|
592
|
+
function Qe(t, n, a) {
|
|
593
|
+
if (n)
|
|
594
|
+
for (let e = 0; e < n.length; e++)
|
|
595
|
+
Ke(t, "on" + n[e], a);
|
|
596
|
+
else {
|
|
597
|
+
const e = [];
|
|
598
|
+
for (const c in t)
|
|
599
|
+
c.slice(0, 2) == "on" && e.push(c);
|
|
600
|
+
for (let c = 0; c < e.length; c++)
|
|
601
|
+
Ke(t, e[c], a);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
const le = H("originalInstance");
|
|
605
|
+
function Se(t) {
|
|
606
|
+
const n = Q[t];
|
|
607
|
+
if (!n)
|
|
608
|
+
return;
|
|
609
|
+
Q[H(t)] = n, Q[t] = function() {
|
|
610
|
+
const c = Ve(arguments, t);
|
|
611
|
+
switch (c.length) {
|
|
612
|
+
case 0:
|
|
613
|
+
this[le] = new n();
|
|
614
|
+
break;
|
|
615
|
+
case 1:
|
|
616
|
+
this[le] = new n(c[0]);
|
|
617
|
+
break;
|
|
618
|
+
case 2:
|
|
619
|
+
this[le] = new n(c[0], c[1]);
|
|
620
|
+
break;
|
|
621
|
+
case 3:
|
|
622
|
+
this[le] = new n(c[0], c[1], c[2]);
|
|
623
|
+
break;
|
|
624
|
+
case 4:
|
|
625
|
+
this[le] = new n(c[0], c[1], c[2], c[3]);
|
|
626
|
+
break;
|
|
627
|
+
default:
|
|
628
|
+
throw new Error("Arg list too long.");
|
|
629
|
+
}
|
|
630
|
+
}, pe(Q[t], n);
|
|
631
|
+
const a = new n(function() {
|
|
632
|
+
});
|
|
633
|
+
let e;
|
|
634
|
+
for (e in a)
|
|
635
|
+
t === "XMLHttpRequest" && e === "responseBlob" || function(c) {
|
|
636
|
+
typeof a[c] == "function" ? Q[t].prototype[c] = function() {
|
|
637
|
+
return this[le][c].apply(this[le], arguments);
|
|
638
|
+
} : te(Q[t].prototype, c, {
|
|
639
|
+
set: function(f) {
|
|
640
|
+
typeof f == "function" ? (this[le][c] = xe(f, t + "." + c), pe(this[le][c], f)) : this[le][c] = f;
|
|
641
|
+
},
|
|
642
|
+
get: function() {
|
|
643
|
+
return this[le][c];
|
|
644
|
+
}
|
|
645
|
+
});
|
|
646
|
+
}(e);
|
|
647
|
+
for (e in n)
|
|
648
|
+
e !== "prototype" && n.hasOwnProperty(e) && (Q[t][e] = n[e]);
|
|
649
|
+
}
|
|
650
|
+
function Ee(t, n, a) {
|
|
651
|
+
let e = t;
|
|
652
|
+
for (; e && !e.hasOwnProperty(n); )
|
|
653
|
+
e = ie(e);
|
|
654
|
+
!e && t[n] && (e = t);
|
|
655
|
+
const c = H(n);
|
|
656
|
+
let f = null;
|
|
657
|
+
if (e && (!(f = e[c]) || !e.hasOwnProperty(c))) {
|
|
658
|
+
f = e[c] = e[n];
|
|
659
|
+
const p = e && ee(e, n);
|
|
660
|
+
if (Xe(p)) {
|
|
661
|
+
const T = a(f, c, n);
|
|
662
|
+
e[n] = function() {
|
|
663
|
+
return T(this, arguments);
|
|
664
|
+
}, pe(e[n], f);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
return f;
|
|
668
|
+
}
|
|
669
|
+
function vt(t, n, a) {
|
|
670
|
+
let e = null;
|
|
671
|
+
function c(f) {
|
|
672
|
+
const p = f.data;
|
|
673
|
+
return p.args[p.cbIdx] = function() {
|
|
674
|
+
f.invoke.apply(this, arguments);
|
|
675
|
+
}, e.apply(p.target, p.args), f;
|
|
676
|
+
}
|
|
677
|
+
e = Ee(t, n, (f) => function(p, T) {
|
|
678
|
+
const y = a(p, T);
|
|
679
|
+
return y.cbIdx >= 0 && typeof T[y.cbIdx] == "function" ? Fe(y.name, T[y.cbIdx], y, c) : f.apply(p, T);
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
function pe(t, n) {
|
|
683
|
+
t[H("OriginalDelegate")] = n;
|
|
684
|
+
}
|
|
685
|
+
let et = !1, Ge = !1;
|
|
686
|
+
function bt() {
|
|
687
|
+
if (et)
|
|
688
|
+
return Ge;
|
|
689
|
+
et = !0;
|
|
690
|
+
try {
|
|
691
|
+
const t = De.navigator.userAgent;
|
|
692
|
+
(t.indexOf("MSIE ") !== -1 || t.indexOf("Trident/") !== -1 || t.indexOf("Edge/") !== -1) && (Ge = !0);
|
|
693
|
+
} catch {
|
|
694
|
+
}
|
|
695
|
+
return Ge;
|
|
696
|
+
}
|
|
697
|
+
function tt(t) {
|
|
698
|
+
return typeof t == "function";
|
|
699
|
+
}
|
|
700
|
+
function nt(t) {
|
|
701
|
+
return typeof t == "number";
|
|
702
|
+
}
|
|
703
|
+
const Ct = {
|
|
704
|
+
useG: !0
|
|
705
|
+
}, ae = {}, rt = {}, ot = new RegExp("^" + we + "(\\w+)(true|false)$"), st = H("propagationStopped");
|
|
706
|
+
function it(t, n) {
|
|
707
|
+
const a = (n ? n(t) : t) + Te, e = (n ? n(t) : t) + _e, c = we + a, f = we + e;
|
|
708
|
+
ae[t] = {}, ae[t][Te] = c, ae[t][_e] = f;
|
|
709
|
+
}
|
|
710
|
+
function Pt(t, n, a, e) {
|
|
711
|
+
const c = e && e.add || ve, f = e && e.rm || Ae, p = e && e.listeners || "eventListeners", T = e && e.rmAll || "removeAllListeners", y = H(c), w = "." + c + ":", _ = "prependListener", C = "." + _ + ":", M = function(k, d, x) {
|
|
712
|
+
if (k.isRemoved)
|
|
713
|
+
return;
|
|
714
|
+
const V = k.callback;
|
|
715
|
+
typeof V == "object" && V.handleEvent && (k.callback = (g) => V.handleEvent(g), k.originalDelegate = V);
|
|
716
|
+
let K;
|
|
717
|
+
try {
|
|
718
|
+
k.invoke(k, d, [x]);
|
|
719
|
+
} catch (g) {
|
|
720
|
+
K = g;
|
|
721
|
+
}
|
|
722
|
+
const U = k.options;
|
|
723
|
+
if (U && typeof U == "object" && U.once) {
|
|
724
|
+
const g = k.originalDelegate ? k.originalDelegate : k.callback;
|
|
725
|
+
d[f].call(d, x.type, g, U);
|
|
726
|
+
}
|
|
727
|
+
return K;
|
|
728
|
+
};
|
|
729
|
+
function F(k, d, x) {
|
|
730
|
+
if (d = d || t.event, !d)
|
|
731
|
+
return;
|
|
732
|
+
const V = k || d.target || t, K = V[ae[d.type][x ? _e : Te]];
|
|
733
|
+
if (K) {
|
|
734
|
+
const U = [];
|
|
735
|
+
if (K.length === 1) {
|
|
736
|
+
const g = M(K[0], V, d);
|
|
737
|
+
g && U.push(g);
|
|
738
|
+
} else {
|
|
739
|
+
const g = K.slice();
|
|
740
|
+
for (let Y = 0; Y < g.length && !(d && d[st] === !0); Y++) {
|
|
741
|
+
const O = M(g[Y], V, d);
|
|
742
|
+
O && U.push(O);
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
if (U.length === 1)
|
|
746
|
+
throw U[0];
|
|
747
|
+
for (let g = 0; g < U.length; g++) {
|
|
748
|
+
const Y = U[g];
|
|
749
|
+
n.nativeScheduleMicroTask(() => {
|
|
750
|
+
throw Y;
|
|
751
|
+
});
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
const X = function(k) {
|
|
756
|
+
return F(this, k, !1);
|
|
757
|
+
}, ne = function(k) {
|
|
758
|
+
return F(this, k, !0);
|
|
759
|
+
};
|
|
760
|
+
function re(k, d) {
|
|
761
|
+
if (!k)
|
|
762
|
+
return !1;
|
|
763
|
+
let x = !0;
|
|
764
|
+
d && d.useG !== void 0 && (x = d.useG);
|
|
765
|
+
const V = d && d.vh;
|
|
766
|
+
let K = !0;
|
|
767
|
+
d && d.chkDup !== void 0 && (K = d.chkDup);
|
|
768
|
+
let U = !1;
|
|
769
|
+
d && d.rt !== void 0 && (U = d.rt);
|
|
770
|
+
let g = k;
|
|
771
|
+
for (; g && !g.hasOwnProperty(c); )
|
|
772
|
+
g = ie(g);
|
|
773
|
+
if (!g && k[c] && (g = k), !g || g[y])
|
|
774
|
+
return !1;
|
|
775
|
+
const Y = d && d.eventNameToString, O = {}, P = g[y] = g[c], b = g[H(f)] = g[f], D = g[H(p)] = g[p], oe = g[H(T)] = g[T];
|
|
776
|
+
let $;
|
|
777
|
+
d && d.prepend && ($ = g[H(d.prepend)] = g[d.prepend]);
|
|
778
|
+
function I(o, u) {
|
|
779
|
+
return u ? typeof o == "boolean" ? { capture: o, passive: !0 } : o ? typeof o == "object" && o.passive !== !1 ? { ...o, passive: !0 } : o : { passive: !0 } : o;
|
|
780
|
+
}
|
|
781
|
+
const s = function(o) {
|
|
782
|
+
if (!O.isExisting)
|
|
783
|
+
return P.call(O.target, O.eventName, O.capture ? ne : X, O.options);
|
|
784
|
+
}, i = function(o) {
|
|
785
|
+
if (!o.isRemoved) {
|
|
786
|
+
const u = ae[o.eventName];
|
|
787
|
+
let v;
|
|
788
|
+
u && (v = u[o.capture ? _e : Te]);
|
|
789
|
+
const R = v && o.target[v];
|
|
790
|
+
if (R) {
|
|
791
|
+
for (let m = 0; m < R.length; m++)
|
|
792
|
+
if (R[m] === o) {
|
|
793
|
+
R.splice(m, 1), o.isRemoved = !0, o.removeAbortListener && (o.removeAbortListener(), o.removeAbortListener = null), R.length === 0 && (o.allRemoved = !0, o.target[v] = null);
|
|
794
|
+
break;
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
if (o.allRemoved)
|
|
799
|
+
return b.call(o.target, o.eventName, o.capture ? ne : X, o.options);
|
|
800
|
+
}, r = function(o) {
|
|
801
|
+
return P.call(O.target, O.eventName, o.invoke, O.options);
|
|
802
|
+
}, E = function(o) {
|
|
803
|
+
return $.call(O.target, O.eventName, o.invoke, O.options);
|
|
804
|
+
}, G = function(o) {
|
|
805
|
+
return b.call(o.target, o.eventName, o.invoke, o.options);
|
|
806
|
+
}, ce = x ? s : r, A = x ? i : G, ge = function(o, u) {
|
|
807
|
+
const v = typeof u;
|
|
808
|
+
return v === "function" && o.callback === u || v === "object" && o.originalDelegate === u;
|
|
809
|
+
}, ye = d?.diff || ge, se = Zone[H("UNPATCHED_EVENTS")], Ce = t[H("PASSIVE_EVENTS")];
|
|
810
|
+
function h(o) {
|
|
811
|
+
if (typeof o == "object" && o !== null) {
|
|
812
|
+
const u = { ...o };
|
|
813
|
+
return o.signal && (u.signal = o.signal), u;
|
|
814
|
+
}
|
|
815
|
+
return o;
|
|
816
|
+
}
|
|
817
|
+
const l = function(o, u, v, R, m = !1, N = !1) {
|
|
818
|
+
return function() {
|
|
819
|
+
const Z = this || t;
|
|
820
|
+
let L = arguments[0];
|
|
821
|
+
d && d.transferEventName && (L = d.transferEventName(L));
|
|
822
|
+
let W = arguments[1];
|
|
823
|
+
if (!W)
|
|
824
|
+
return o.apply(this, arguments);
|
|
825
|
+
if (Ze && L === "uncaughtException")
|
|
826
|
+
return o.apply(this, arguments);
|
|
827
|
+
let q = !1;
|
|
828
|
+
if (typeof W != "function") {
|
|
829
|
+
if (!W.handleEvent)
|
|
830
|
+
return o.apply(this, arguments);
|
|
831
|
+
q = !0;
|
|
832
|
+
}
|
|
833
|
+
if (V && !V(o, W, Z, arguments))
|
|
834
|
+
return;
|
|
835
|
+
const me = !!Ce && Ce.indexOf(L) !== -1, he = h(I(arguments[2], me)), Pe = he?.signal;
|
|
836
|
+
if (Pe?.aborted)
|
|
837
|
+
return;
|
|
838
|
+
if (se) {
|
|
839
|
+
for (let de = 0; de < se.length; de++)
|
|
840
|
+
if (L === se[de])
|
|
841
|
+
return me ? o.call(Z, L, W, he) : o.apply(this, arguments);
|
|
842
|
+
}
|
|
843
|
+
const Ue = he ? typeof he == "boolean" ? !0 : he.capture : !1, ft = he && typeof he == "object" ? he.once : !1, Ht = Zone.current;
|
|
844
|
+
let We = ae[L];
|
|
845
|
+
We || (it(L, Y), We = ae[L]);
|
|
846
|
+
const ht = We[Ue ? _e : Te];
|
|
847
|
+
let Re = Z[ht], dt = !1;
|
|
848
|
+
if (Re) {
|
|
849
|
+
if (dt = !0, K) {
|
|
850
|
+
for (let de = 0; de < Re.length; de++)
|
|
851
|
+
if (ye(Re[de], W))
|
|
852
|
+
return;
|
|
853
|
+
}
|
|
854
|
+
} else
|
|
855
|
+
Re = Z[ht] = [];
|
|
856
|
+
let Ie;
|
|
857
|
+
const _t = Z.constructor.name, Tt = rt[_t];
|
|
858
|
+
Tt && (Ie = Tt[L]), Ie || (Ie = _t + u + (Y ? Y(L) : L)), O.options = he, ft && (O.options.once = !1), O.target = Z, O.capture = Ue, O.eventName = L, O.isExisting = dt;
|
|
859
|
+
const Oe = x ? Ct : void 0;
|
|
860
|
+
Oe && (Oe.taskData = O), Pe && (O.options.signal = void 0);
|
|
861
|
+
const ue = Ht.scheduleEventTask(Ie, W, Oe, v, R);
|
|
862
|
+
if (Pe) {
|
|
863
|
+
O.options.signal = Pe;
|
|
864
|
+
const de = () => ue.zone.cancelTask(ue);
|
|
865
|
+
o.call(Pe, "abort", de, { once: !0 }), ue.removeAbortListener = () => Pe.removeEventListener("abort", de);
|
|
866
|
+
}
|
|
867
|
+
if (O.target = null, Oe && (Oe.taskData = null), ft && (O.options.once = !0), typeof ue.options != "boolean" && (ue.options = he), ue.target = Z, ue.capture = Ue, ue.eventName = L, q && (ue.originalDelegate = W), N ? Re.unshift(ue) : Re.push(ue), m)
|
|
868
|
+
return Z;
|
|
869
|
+
};
|
|
870
|
+
};
|
|
871
|
+
return g[c] = l(P, w, ce, A, U), $ && (g[_] = l($, C, E, A, U, !0)), g[f] = function() {
|
|
872
|
+
const o = this || t;
|
|
873
|
+
let u = arguments[0];
|
|
874
|
+
d && d.transferEventName && (u = d.transferEventName(u));
|
|
875
|
+
const v = arguments[2], R = v ? typeof v == "boolean" ? !0 : v.capture : !1, m = arguments[1];
|
|
876
|
+
if (!m)
|
|
877
|
+
return b.apply(this, arguments);
|
|
878
|
+
if (V && !V(b, m, o, arguments))
|
|
879
|
+
return;
|
|
880
|
+
const N = ae[u];
|
|
881
|
+
let Z;
|
|
882
|
+
N && (Z = N[R ? _e : Te]);
|
|
883
|
+
const L = Z && o[Z];
|
|
884
|
+
if (L)
|
|
885
|
+
for (let W = 0; W < L.length; W++) {
|
|
886
|
+
const q = L[W];
|
|
887
|
+
if (ye(q, m)) {
|
|
888
|
+
if (L.splice(W, 1), q.isRemoved = !0, L.length === 0 && (q.allRemoved = !0, o[Z] = null, !R && typeof u == "string")) {
|
|
889
|
+
const me = we + "ON_PROPERTY" + u;
|
|
890
|
+
o[me] = null;
|
|
891
|
+
}
|
|
892
|
+
return q.zone.cancelTask(q), U ? o : void 0;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
return b.apply(this, arguments);
|
|
896
|
+
}, g[p] = function() {
|
|
897
|
+
const o = this || t;
|
|
898
|
+
let u = arguments[0];
|
|
899
|
+
d && d.transferEventName && (u = d.transferEventName(u));
|
|
900
|
+
const v = [], R = ct(o, Y ? Y(u) : u);
|
|
901
|
+
for (let m = 0; m < R.length; m++) {
|
|
902
|
+
const N = R[m];
|
|
903
|
+
let Z = N.originalDelegate ? N.originalDelegate : N.callback;
|
|
904
|
+
v.push(Z);
|
|
905
|
+
}
|
|
906
|
+
return v;
|
|
907
|
+
}, g[T] = function() {
|
|
908
|
+
const o = this || t;
|
|
909
|
+
let u = arguments[0];
|
|
910
|
+
if (u) {
|
|
911
|
+
d && d.transferEventName && (u = d.transferEventName(u));
|
|
912
|
+
const v = ae[u];
|
|
913
|
+
if (v) {
|
|
914
|
+
const R = v[Te], m = v[_e], N = o[R], Z = o[m];
|
|
915
|
+
if (N) {
|
|
916
|
+
const L = N.slice();
|
|
917
|
+
for (let W = 0; W < L.length; W++) {
|
|
918
|
+
const q = L[W];
|
|
919
|
+
let me = q.originalDelegate ? q.originalDelegate : q.callback;
|
|
920
|
+
this[f].call(this, u, me, q.options);
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
if (Z) {
|
|
924
|
+
const L = Z.slice();
|
|
925
|
+
for (let W = 0; W < L.length; W++) {
|
|
926
|
+
const q = L[W];
|
|
927
|
+
let me = q.originalDelegate ? q.originalDelegate : q.callback;
|
|
928
|
+
this[f].call(this, u, me, q.options);
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
} else {
|
|
933
|
+
const v = Object.keys(o);
|
|
934
|
+
for (let R = 0; R < v.length; R++) {
|
|
935
|
+
const m = v[R], N = ot.exec(m);
|
|
936
|
+
let Z = N && N[1];
|
|
937
|
+
Z && Z !== "removeListener" && this[T].call(this, Z);
|
|
938
|
+
}
|
|
939
|
+
this[T].call(this, "removeListener");
|
|
940
|
+
}
|
|
941
|
+
if (U)
|
|
942
|
+
return this;
|
|
943
|
+
}, pe(g[c], P), pe(g[f], b), oe && pe(g[T], oe), D && pe(g[p], D), !0;
|
|
944
|
+
}
|
|
945
|
+
let J = [];
|
|
946
|
+
for (let k = 0; k < a.length; k++)
|
|
947
|
+
J[k] = re(a[k], e);
|
|
948
|
+
return J;
|
|
949
|
+
}
|
|
950
|
+
function ct(t, n) {
|
|
951
|
+
if (!n) {
|
|
952
|
+
const f = [];
|
|
953
|
+
for (let p in t) {
|
|
954
|
+
const T = ot.exec(p);
|
|
955
|
+
let y = T && T[1];
|
|
956
|
+
if (y && (!n || y === n)) {
|
|
957
|
+
const w = t[p];
|
|
958
|
+
if (w)
|
|
959
|
+
for (let _ = 0; _ < w.length; _++)
|
|
960
|
+
f.push(w[_]);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
return f;
|
|
964
|
+
}
|
|
965
|
+
let a = ae[n];
|
|
966
|
+
a || (it(n), a = ae[n]);
|
|
967
|
+
const e = t[a[Te]], c = t[a[_e]];
|
|
968
|
+
return e ? c ? e.concat(c) : e.slice() : c ? c.slice() : [];
|
|
969
|
+
}
|
|
970
|
+
function Rt(t, n) {
|
|
971
|
+
const a = t.Event;
|
|
972
|
+
a && a.prototype && n.patchMethod(a.prototype, "stopImmediatePropagation", (e) => function(c, f) {
|
|
973
|
+
c[st] = !0, e && e.apply(c, f);
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
function wt(t, n) {
|
|
977
|
+
n.patchMethod(t, "queueMicrotask", (a) => function(e, c) {
|
|
978
|
+
Zone.current.scheduleMicroTask("queueMicrotask", c[0]);
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
const Me = H("zoneTask");
|
|
982
|
+
function be(t, n, a, e) {
|
|
983
|
+
let c = null, f = null;
|
|
984
|
+
n += e, a += e;
|
|
985
|
+
const p = {};
|
|
986
|
+
function T(w) {
|
|
987
|
+
const _ = w.data;
|
|
988
|
+
_.args[0] = function() {
|
|
989
|
+
return w.invoke.apply(this, arguments);
|
|
990
|
+
};
|
|
991
|
+
const C = c.apply(t, _.args);
|
|
992
|
+
return nt(C) ? _.handleId = C : (_.handle = C, _.isRefreshable = tt(C.refresh)), w;
|
|
993
|
+
}
|
|
994
|
+
function y(w) {
|
|
995
|
+
const { handle: _, handleId: C } = w.data;
|
|
996
|
+
return f.call(t, _ ?? C);
|
|
997
|
+
}
|
|
998
|
+
c = Ee(t, n, (w) => function(_, C) {
|
|
999
|
+
if (tt(C[0])) {
|
|
1000
|
+
const M = {
|
|
1001
|
+
isRefreshable: !1,
|
|
1002
|
+
isPeriodic: e === "Interval",
|
|
1003
|
+
delay: e === "Timeout" || e === "Interval" ? C[1] || 0 : void 0,
|
|
1004
|
+
args: C
|
|
1005
|
+
}, F = C[0];
|
|
1006
|
+
C[0] = function() {
|
|
1007
|
+
try {
|
|
1008
|
+
return F.apply(this, arguments);
|
|
1009
|
+
} finally {
|
|
1010
|
+
const { handle: x, handleId: V, isPeriodic: K, isRefreshable: U } = M;
|
|
1011
|
+
!K && !U && (V ? delete p[V] : x && (x[Me] = null));
|
|
1012
|
+
}
|
|
1013
|
+
};
|
|
1014
|
+
const X = Fe(n, C[0], M, T, y);
|
|
1015
|
+
if (!X)
|
|
1016
|
+
return X;
|
|
1017
|
+
const { handleId: ne, handle: re, isRefreshable: J, isPeriodic: k } = X.data;
|
|
1018
|
+
if (ne)
|
|
1019
|
+
p[ne] = X;
|
|
1020
|
+
else if (re && (re[Me] = X, J && !k)) {
|
|
1021
|
+
const d = re.refresh;
|
|
1022
|
+
re.refresh = function() {
|
|
1023
|
+
const { zone: x, state: V } = X;
|
|
1024
|
+
return V === "notScheduled" ? (X._state = "scheduled", x._updateTaskCount(X, 1)) : V === "running" && (X._state = "scheduling"), d.call(this);
|
|
1025
|
+
};
|
|
1026
|
+
}
|
|
1027
|
+
return re ?? ne ?? X;
|
|
1028
|
+
} else
|
|
1029
|
+
return w.apply(t, C);
|
|
1030
|
+
}), f = Ee(t, a, (w) => function(_, C) {
|
|
1031
|
+
const M = C[0];
|
|
1032
|
+
let F;
|
|
1033
|
+
nt(M) ? (F = p[M], delete p[M]) : (F = M?.[Me], F ? M[Me] = null : F = M), F?.type ? F.cancelFn && F.zone.cancelTask(F) : w.apply(t, C);
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
1036
|
+
function Dt(t, n) {
|
|
1037
|
+
const { isBrowser: a, isMix: e } = n.getGlobalObjects();
|
|
1038
|
+
if (!a && !e || !t.customElements || !("customElements" in t))
|
|
1039
|
+
return;
|
|
1040
|
+
const c = [
|
|
1041
|
+
"connectedCallback",
|
|
1042
|
+
"disconnectedCallback",
|
|
1043
|
+
"adoptedCallback",
|
|
1044
|
+
"attributeChangedCallback",
|
|
1045
|
+
"formAssociatedCallback",
|
|
1046
|
+
"formDisabledCallback",
|
|
1047
|
+
"formResetCallback",
|
|
1048
|
+
"formStateRestoreCallback"
|
|
1049
|
+
];
|
|
1050
|
+
n.patchCallbacks(n, t.customElements, "customElements", "define", c);
|
|
1051
|
+
}
|
|
1052
|
+
function St(t, n) {
|
|
1053
|
+
if (Zone[n.symbol("patchEventTarget")])
|
|
1054
|
+
return;
|
|
1055
|
+
const { eventNames: a, zoneSymbolEventNames: e, TRUE_STR: c, FALSE_STR: f, ZONE_SYMBOL_PREFIX: p } = n.getGlobalObjects();
|
|
1056
|
+
for (let y = 0; y < a.length; y++) {
|
|
1057
|
+
const w = a[y], _ = w + f, C = w + c, M = p + _, F = p + C;
|
|
1058
|
+
e[w] = {}, e[w][f] = M, e[w][c] = F;
|
|
1059
|
+
}
|
|
1060
|
+
const T = t.EventTarget;
|
|
1061
|
+
if (!(!T || !T.prototype))
|
|
1062
|
+
return n.patchEventTarget(t, n, [T && T.prototype]), !0;
|
|
1063
|
+
}
|
|
1064
|
+
function Ot(t, n) {
|
|
1065
|
+
n.patchEventPrototype(t, n);
|
|
1066
|
+
}
|
|
1067
|
+
function at(t, n, a) {
|
|
1068
|
+
if (!a || a.length === 0)
|
|
1069
|
+
return n;
|
|
1070
|
+
const e = a.filter((f) => f.target === t);
|
|
1071
|
+
if (e.length === 0)
|
|
1072
|
+
return n;
|
|
1073
|
+
const c = e[0].ignoreProperties;
|
|
1074
|
+
return n.filter((f) => c.indexOf(f) === -1);
|
|
1075
|
+
}
|
|
1076
|
+
function lt(t, n, a, e) {
|
|
1077
|
+
if (!t)
|
|
1078
|
+
return;
|
|
1079
|
+
const c = at(t, n, a);
|
|
1080
|
+
Qe(t, c, e);
|
|
1081
|
+
}
|
|
1082
|
+
function Be(t) {
|
|
1083
|
+
return Object.getOwnPropertyNames(t).filter((n) => n.startsWith("on") && n.length > 2).map((n) => n.substring(2));
|
|
1084
|
+
}
|
|
1085
|
+
function Nt(t, n) {
|
|
1086
|
+
if (Ze && !$e || Zone[t.symbol("patchEvents")])
|
|
1087
|
+
return;
|
|
1088
|
+
const a = n.__Zone_ignore_on_properties;
|
|
1089
|
+
let e = [];
|
|
1090
|
+
if (ze) {
|
|
1091
|
+
const c = window;
|
|
1092
|
+
e = e.concat([
|
|
1093
|
+
"Document",
|
|
1094
|
+
"SVGElement",
|
|
1095
|
+
"Element",
|
|
1096
|
+
"HTMLElement",
|
|
1097
|
+
"HTMLBodyElement",
|
|
1098
|
+
"HTMLMediaElement",
|
|
1099
|
+
"HTMLFrameSetElement",
|
|
1100
|
+
"HTMLFrameElement",
|
|
1101
|
+
"HTMLIFrameElement",
|
|
1102
|
+
"HTMLMarqueeElement",
|
|
1103
|
+
"Worker"
|
|
1104
|
+
]);
|
|
1105
|
+
const f = [];
|
|
1106
|
+
lt(c, Be(c), a && a.concat(f), ie(c));
|
|
1107
|
+
}
|
|
1108
|
+
e = e.concat([
|
|
1109
|
+
"XMLHttpRequest",
|
|
1110
|
+
"XMLHttpRequestEventTarget",
|
|
1111
|
+
"IDBIndex",
|
|
1112
|
+
"IDBRequest",
|
|
1113
|
+
"IDBOpenDBRequest",
|
|
1114
|
+
"IDBDatabase",
|
|
1115
|
+
"IDBTransaction",
|
|
1116
|
+
"IDBCursor",
|
|
1117
|
+
"WebSocket"
|
|
1118
|
+
]);
|
|
1119
|
+
for (let c = 0; c < e.length; c++) {
|
|
1120
|
+
const f = n[e[c]];
|
|
1121
|
+
f?.prototype && lt(f.prototype, Be(f.prototype), a);
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
function Zt(t) {
|
|
1125
|
+
t.__load_patch("legacy", (n) => {
|
|
1126
|
+
const a = n[t.__symbol__("legacyPatch")];
|
|
1127
|
+
a && a();
|
|
1128
|
+
}), t.__load_patch("timers", (n) => {
|
|
1129
|
+
const e = "clear";
|
|
1130
|
+
be(n, "set", e, "Timeout"), be(n, "set", e, "Interval"), be(n, "set", e, "Immediate");
|
|
1131
|
+
}), t.__load_patch("requestAnimationFrame", (n) => {
|
|
1132
|
+
be(n, "request", "cancel", "AnimationFrame"), be(n, "mozRequest", "mozCancel", "AnimationFrame"), be(n, "webkitRequest", "webkitCancel", "AnimationFrame");
|
|
1133
|
+
}), t.__load_patch("blocking", (n, a) => {
|
|
1134
|
+
const e = ["alert", "prompt", "confirm"];
|
|
1135
|
+
for (let c = 0; c < e.length; c++) {
|
|
1136
|
+
const f = e[c];
|
|
1137
|
+
Ee(n, f, (p, T, y) => function(w, _) {
|
|
1138
|
+
return a.current.run(p, n, _, y);
|
|
1139
|
+
});
|
|
1140
|
+
}
|
|
1141
|
+
}), t.__load_patch("EventTarget", (n, a, e) => {
|
|
1142
|
+
Ot(n, e), St(n, e);
|
|
1143
|
+
const c = n.XMLHttpRequestEventTarget;
|
|
1144
|
+
c && c.prototype && e.patchEventTarget(n, e, [c.prototype]);
|
|
1145
|
+
}), t.__load_patch("MutationObserver", (n, a, e) => {
|
|
1146
|
+
Se("MutationObserver"), Se("WebKitMutationObserver");
|
|
1147
|
+
}), t.__load_patch("IntersectionObserver", (n, a, e) => {
|
|
1148
|
+
Se("IntersectionObserver");
|
|
1149
|
+
}), t.__load_patch("FileReader", (n, a, e) => {
|
|
1150
|
+
Se("FileReader");
|
|
1151
|
+
}), t.__load_patch("on_property", (n, a, e) => {
|
|
1152
|
+
Nt(e, n);
|
|
1153
|
+
}), t.__load_patch("customElements", (n, a, e) => {
|
|
1154
|
+
Dt(n, e);
|
|
1155
|
+
}), t.__load_patch("XHR", (n, a) => {
|
|
1156
|
+
w(n);
|
|
1157
|
+
const e = H("xhrTask"), c = H("xhrSync"), f = H("xhrListener"), p = H("xhrScheduled"), T = H("xhrURL"), y = H("xhrErrorBeforeScheduled");
|
|
1158
|
+
function w(_) {
|
|
1159
|
+
const C = _.XMLHttpRequest;
|
|
1160
|
+
if (!C)
|
|
1161
|
+
return;
|
|
1162
|
+
const M = C.prototype;
|
|
1163
|
+
function F(P) {
|
|
1164
|
+
return P[e];
|
|
1165
|
+
}
|
|
1166
|
+
let X = M[je], ne = M[He];
|
|
1167
|
+
if (!X) {
|
|
1168
|
+
const P = _.XMLHttpRequestEventTarget;
|
|
1169
|
+
if (P) {
|
|
1170
|
+
const b = P.prototype;
|
|
1171
|
+
X = b[je], ne = b[He];
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
const re = "readystatechange", J = "scheduled";
|
|
1175
|
+
function k(P) {
|
|
1176
|
+
const b = P.data, D = b.target;
|
|
1177
|
+
D[p] = !1, D[y] = !1;
|
|
1178
|
+
const oe = D[f];
|
|
1179
|
+
X || (X = D[je], ne = D[He]), oe && ne.call(D, re, oe);
|
|
1180
|
+
const $ = D[f] = () => {
|
|
1181
|
+
if (D.readyState === D.DONE)
|
|
1182
|
+
if (!b.aborted && D[p] && P.state === J) {
|
|
1183
|
+
const s = D[a.__symbol__("loadfalse")];
|
|
1184
|
+
if (D.status !== 0 && s && s.length > 0) {
|
|
1185
|
+
const i = P.invoke;
|
|
1186
|
+
P.invoke = function() {
|
|
1187
|
+
const r = D[a.__symbol__("loadfalse")];
|
|
1188
|
+
for (let E = 0; E < r.length; E++)
|
|
1189
|
+
r[E] === P && r.splice(E, 1);
|
|
1190
|
+
!b.aborted && P.state === J && i.call(P);
|
|
1191
|
+
}, s.push(P);
|
|
1192
|
+
} else
|
|
1193
|
+
P.invoke();
|
|
1194
|
+
} else !b.aborted && D[p] === !1 && (D[y] = !0);
|
|
1195
|
+
};
|
|
1196
|
+
return X.call(D, re, $), D[e] || (D[e] = P), Y.apply(D, b.args), D[p] = !0, P;
|
|
1197
|
+
}
|
|
1198
|
+
function d() {
|
|
1199
|
+
}
|
|
1200
|
+
function x(P) {
|
|
1201
|
+
const b = P.data;
|
|
1202
|
+
return b.aborted = !0, O.apply(b.target, b.args);
|
|
1203
|
+
}
|
|
1204
|
+
const V = Ee(M, "open", () => function(P, b) {
|
|
1205
|
+
return P[c] = b[2] == !1, P[T] = b[1], V.apply(P, b);
|
|
1206
|
+
}), K = "XMLHttpRequest.send", U = H("fetchTaskAborting"), g = H("fetchTaskScheduling"), Y = Ee(M, "send", () => function(P, b) {
|
|
1207
|
+
if (a.current[g] === !0 || P[c])
|
|
1208
|
+
return Y.apply(P, b);
|
|
1209
|
+
{
|
|
1210
|
+
const D = {
|
|
1211
|
+
target: P,
|
|
1212
|
+
url: P[T],
|
|
1213
|
+
isPeriodic: !1,
|
|
1214
|
+
args: b,
|
|
1215
|
+
aborted: !1
|
|
1216
|
+
}, oe = Fe(K, d, D, k, x);
|
|
1217
|
+
P && P[y] === !0 && !D.aborted && oe.state === J && oe.invoke();
|
|
1218
|
+
}
|
|
1219
|
+
}), O = Ee(M, "abort", () => function(P, b) {
|
|
1220
|
+
const D = F(P);
|
|
1221
|
+
if (D && typeof D.type == "string") {
|
|
1222
|
+
if (D.cancelFn == null || D.data && D.data.aborted)
|
|
1223
|
+
return;
|
|
1224
|
+
D.zone.cancelTask(D);
|
|
1225
|
+
} else if (a.current[U] === !0)
|
|
1226
|
+
return O.apply(P, b);
|
|
1227
|
+
});
|
|
1228
|
+
}
|
|
1229
|
+
}), t.__load_patch("geolocation", (n) => {
|
|
1230
|
+
n.navigator && n.navigator.geolocation && yt(n.navigator.geolocation, ["getCurrentPosition", "watchPosition"]);
|
|
1231
|
+
}), t.__load_patch("PromiseRejectionEvent", (n, a) => {
|
|
1232
|
+
function e(c) {
|
|
1233
|
+
return function(f) {
|
|
1234
|
+
ct(n, c).forEach((T) => {
|
|
1235
|
+
const y = n.PromiseRejectionEvent;
|
|
1236
|
+
if (y) {
|
|
1237
|
+
const w = new y(c, {
|
|
1238
|
+
promise: f.promise,
|
|
1239
|
+
reason: f.rejection
|
|
1240
|
+
});
|
|
1241
|
+
T.invoke(w);
|
|
1242
|
+
}
|
|
1243
|
+
});
|
|
1244
|
+
};
|
|
1245
|
+
}
|
|
1246
|
+
n.PromiseRejectionEvent && (a[H("unhandledPromiseRejectionHandler")] = e("unhandledrejection"), a[H("rejectionHandledHandler")] = e("rejectionhandled"));
|
|
1247
|
+
}), t.__load_patch("queueMicrotask", (n, a, e) => {
|
|
1248
|
+
wt(n, e);
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
function Lt(t) {
|
|
1252
|
+
t.__load_patch("ZoneAwarePromise", (n, a, e) => {
|
|
1253
|
+
const c = Object.getOwnPropertyDescriptor, f = Object.defineProperty;
|
|
1254
|
+
function p(h) {
|
|
1255
|
+
if (h && h.toString === Object.prototype.toString) {
|
|
1256
|
+
const l = h.constructor && h.constructor.name;
|
|
1257
|
+
return (l || "") + ": " + JSON.stringify(h);
|
|
1258
|
+
}
|
|
1259
|
+
return h ? h.toString() : Object.prototype.toString.call(h);
|
|
1260
|
+
}
|
|
1261
|
+
const T = e.symbol, y = [], w = n[T("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")] !== !1, _ = T("Promise"), C = T("then"), M = "__creationTrace__";
|
|
1262
|
+
e.onUnhandledError = (h) => {
|
|
1263
|
+
if (e.showUncaughtError()) {
|
|
1264
|
+
const l = h && h.rejection;
|
|
1265
|
+
l ? console.error("Unhandled Promise rejection:", l instanceof Error ? l.message : l, "; Zone:", h.zone.name, "; Task:", h.task && h.task.source, "; Value:", l, l instanceof Error ? l.stack : void 0) : console.error(h);
|
|
1266
|
+
}
|
|
1267
|
+
}, e.microtaskDrainDone = () => {
|
|
1268
|
+
for (; y.length; ) {
|
|
1269
|
+
const h = y.shift();
|
|
1270
|
+
try {
|
|
1271
|
+
h.zone.runGuarded(() => {
|
|
1272
|
+
throw h.throwOriginal ? h.rejection : h;
|
|
1273
|
+
});
|
|
1274
|
+
} catch (l) {
|
|
1275
|
+
X(l);
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
};
|
|
1279
|
+
const F = T("unhandledPromiseRejectionHandler");
|
|
1280
|
+
function X(h) {
|
|
1281
|
+
e.onUnhandledError(h);
|
|
1282
|
+
try {
|
|
1283
|
+
const l = a[F];
|
|
1284
|
+
typeof l == "function" && l.call(this, h);
|
|
1285
|
+
} catch {
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
function ne(h) {
|
|
1289
|
+
return h && typeof h.then == "function";
|
|
1290
|
+
}
|
|
1291
|
+
function re(h) {
|
|
1292
|
+
return h;
|
|
1293
|
+
}
|
|
1294
|
+
function J(h) {
|
|
1295
|
+
return A.reject(h);
|
|
1296
|
+
}
|
|
1297
|
+
const k = T("state"), d = T("value"), x = T("finally"), V = T("parentPromiseValue"), K = T("parentPromiseState"), U = "Promise.then", g = null, Y = !0, O = !1, P = 0;
|
|
1298
|
+
function b(h, l) {
|
|
1299
|
+
return (o) => {
|
|
1300
|
+
try {
|
|
1301
|
+
I(h, l, o);
|
|
1302
|
+
} catch (u) {
|
|
1303
|
+
I(h, !1, u);
|
|
1304
|
+
}
|
|
1305
|
+
};
|
|
1306
|
+
}
|
|
1307
|
+
const D = function() {
|
|
1308
|
+
let h = !1;
|
|
1309
|
+
return function(o) {
|
|
1310
|
+
return function() {
|
|
1311
|
+
h || (h = !0, o.apply(null, arguments));
|
|
1312
|
+
};
|
|
1313
|
+
};
|
|
1314
|
+
}, oe = "Promise resolved with itself", $ = T("currentTaskTrace");
|
|
1315
|
+
function I(h, l, o) {
|
|
1316
|
+
const u = D();
|
|
1317
|
+
if (h === o)
|
|
1318
|
+
throw new TypeError(oe);
|
|
1319
|
+
if (h[k] === g) {
|
|
1320
|
+
let v = null;
|
|
1321
|
+
try {
|
|
1322
|
+
(typeof o == "object" || typeof o == "function") && (v = o && o.then);
|
|
1323
|
+
} catch (R) {
|
|
1324
|
+
return u(() => {
|
|
1325
|
+
I(h, !1, R);
|
|
1326
|
+
})(), h;
|
|
1327
|
+
}
|
|
1328
|
+
if (l !== O && o instanceof A && o.hasOwnProperty(k) && o.hasOwnProperty(d) && o[k] !== g)
|
|
1329
|
+
i(o), I(h, o[k], o[d]);
|
|
1330
|
+
else if (l !== O && typeof v == "function")
|
|
1331
|
+
try {
|
|
1332
|
+
v.call(o, u(b(h, l)), u(b(h, !1)));
|
|
1333
|
+
} catch (R) {
|
|
1334
|
+
u(() => {
|
|
1335
|
+
I(h, !1, R);
|
|
1336
|
+
})();
|
|
1337
|
+
}
|
|
1338
|
+
else {
|
|
1339
|
+
h[k] = l;
|
|
1340
|
+
const R = h[d];
|
|
1341
|
+
if (h[d] = o, h[x] === x && l === Y && (h[k] = h[K], h[d] = h[V]), l === O && o instanceof Error) {
|
|
1342
|
+
const m = a.currentTask && a.currentTask.data && a.currentTask.data[M];
|
|
1343
|
+
m && f(o, $, {
|
|
1344
|
+
configurable: !0,
|
|
1345
|
+
enumerable: !1,
|
|
1346
|
+
writable: !0,
|
|
1347
|
+
value: m
|
|
1348
|
+
});
|
|
1349
|
+
}
|
|
1350
|
+
for (let m = 0; m < R.length; )
|
|
1351
|
+
r(h, R[m++], R[m++], R[m++], R[m++]);
|
|
1352
|
+
if (R.length == 0 && l == O) {
|
|
1353
|
+
h[k] = P;
|
|
1354
|
+
let m = o;
|
|
1355
|
+
try {
|
|
1356
|
+
throw new Error("Uncaught (in promise): " + p(o) + (o && o.stack ? `
|
|
1357
|
+
` + o.stack : ""));
|
|
1358
|
+
} catch (N) {
|
|
1359
|
+
m = N;
|
|
1360
|
+
}
|
|
1361
|
+
w && (m.throwOriginal = !0), m.rejection = o, m.promise = h, m.zone = a.current, m.task = a.currentTask, y.push(m), e.scheduleMicroTask();
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
}
|
|
1365
|
+
return h;
|
|
1366
|
+
}
|
|
1367
|
+
const s = T("rejectionHandledHandler");
|
|
1368
|
+
function i(h) {
|
|
1369
|
+
if (h[k] === P) {
|
|
1370
|
+
try {
|
|
1371
|
+
const l = a[s];
|
|
1372
|
+
l && typeof l == "function" && l.call(this, { rejection: h[d], promise: h });
|
|
1373
|
+
} catch {
|
|
1374
|
+
}
|
|
1375
|
+
h[k] = O;
|
|
1376
|
+
for (let l = 0; l < y.length; l++)
|
|
1377
|
+
h === y[l].promise && y.splice(l, 1);
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
function r(h, l, o, u, v) {
|
|
1381
|
+
i(h);
|
|
1382
|
+
const R = h[k], m = R ? typeof u == "function" ? u : re : typeof v == "function" ? v : J;
|
|
1383
|
+
l.scheduleMicroTask(U, () => {
|
|
1384
|
+
try {
|
|
1385
|
+
const N = h[d], Z = !!o && x === o[x];
|
|
1386
|
+
Z && (o[V] = N, o[K] = R);
|
|
1387
|
+
const L = l.run(m, void 0, Z && m !== J && m !== re ? [] : [N]);
|
|
1388
|
+
I(o, !0, L);
|
|
1389
|
+
} catch (N) {
|
|
1390
|
+
I(o, !1, N);
|
|
1391
|
+
}
|
|
1392
|
+
}, o);
|
|
1393
|
+
}
|
|
1394
|
+
const E = "function ZoneAwarePromise() { [native code] }", G = function() {
|
|
1395
|
+
}, ce = n.AggregateError;
|
|
1396
|
+
class A {
|
|
1397
|
+
static toString() {
|
|
1398
|
+
return E;
|
|
1399
|
+
}
|
|
1400
|
+
static resolve(l) {
|
|
1401
|
+
return l instanceof A ? l : I(new this(null), Y, l);
|
|
1402
|
+
}
|
|
1403
|
+
static reject(l) {
|
|
1404
|
+
return I(new this(null), O, l);
|
|
1405
|
+
}
|
|
1406
|
+
static withResolvers() {
|
|
1407
|
+
const l = {};
|
|
1408
|
+
return l.promise = new A((o, u) => {
|
|
1409
|
+
l.resolve = o, l.reject = u;
|
|
1410
|
+
}), l;
|
|
1411
|
+
}
|
|
1412
|
+
static any(l) {
|
|
1413
|
+
if (!l || typeof l[Symbol.iterator] != "function")
|
|
1414
|
+
return Promise.reject(new ce([], "All promises were rejected"));
|
|
1415
|
+
const o = [];
|
|
1416
|
+
let u = 0;
|
|
1417
|
+
try {
|
|
1418
|
+
for (let m of l)
|
|
1419
|
+
u++, o.push(A.resolve(m));
|
|
1420
|
+
} catch {
|
|
1421
|
+
return Promise.reject(new ce([], "All promises were rejected"));
|
|
1422
|
+
}
|
|
1423
|
+
if (u === 0)
|
|
1424
|
+
return Promise.reject(new ce([], "All promises were rejected"));
|
|
1425
|
+
let v = !1;
|
|
1426
|
+
const R = [];
|
|
1427
|
+
return new A((m, N) => {
|
|
1428
|
+
for (let Z = 0; Z < o.length; Z++)
|
|
1429
|
+
o[Z].then((L) => {
|
|
1430
|
+
v || (v = !0, m(L));
|
|
1431
|
+
}, (L) => {
|
|
1432
|
+
R.push(L), u--, u === 0 && (v = !0, N(new ce(R, "All promises were rejected")));
|
|
1433
|
+
});
|
|
1434
|
+
});
|
|
1435
|
+
}
|
|
1436
|
+
static race(l) {
|
|
1437
|
+
let o, u, v = new this((N, Z) => {
|
|
1438
|
+
o = N, u = Z;
|
|
1439
|
+
});
|
|
1440
|
+
function R(N) {
|
|
1441
|
+
o(N);
|
|
1442
|
+
}
|
|
1443
|
+
function m(N) {
|
|
1444
|
+
u(N);
|
|
1445
|
+
}
|
|
1446
|
+
for (let N of l)
|
|
1447
|
+
ne(N) || (N = this.resolve(N)), N.then(R, m);
|
|
1448
|
+
return v;
|
|
1449
|
+
}
|
|
1450
|
+
static all(l) {
|
|
1451
|
+
return A.allWithCallback(l);
|
|
1452
|
+
}
|
|
1453
|
+
static allSettled(l) {
|
|
1454
|
+
return (this && this.prototype instanceof A ? this : A).allWithCallback(l, {
|
|
1455
|
+
thenCallback: (u) => ({ status: "fulfilled", value: u }),
|
|
1456
|
+
errorCallback: (u) => ({ status: "rejected", reason: u })
|
|
1457
|
+
});
|
|
1458
|
+
}
|
|
1459
|
+
static allWithCallback(l, o) {
|
|
1460
|
+
let u, v, R = new this((L, W) => {
|
|
1461
|
+
u = L, v = W;
|
|
1462
|
+
}), m = 2, N = 0;
|
|
1463
|
+
const Z = [];
|
|
1464
|
+
for (let L of l) {
|
|
1465
|
+
ne(L) || (L = this.resolve(L));
|
|
1466
|
+
const W = N;
|
|
1467
|
+
try {
|
|
1468
|
+
L.then((q) => {
|
|
1469
|
+
Z[W] = o ? o.thenCallback(q) : q, m--, m === 0 && u(Z);
|
|
1470
|
+
}, (q) => {
|
|
1471
|
+
o ? (Z[W] = o.errorCallback(q), m--, m === 0 && u(Z)) : v(q);
|
|
1472
|
+
});
|
|
1473
|
+
} catch (q) {
|
|
1474
|
+
v(q);
|
|
1475
|
+
}
|
|
1476
|
+
m++, N++;
|
|
1477
|
+
}
|
|
1478
|
+
return m -= 2, m === 0 && u(Z), R;
|
|
1479
|
+
}
|
|
1480
|
+
constructor(l) {
|
|
1481
|
+
const o = this;
|
|
1482
|
+
if (!(o instanceof A))
|
|
1483
|
+
throw new Error("Must be an instanceof Promise.");
|
|
1484
|
+
o[k] = g, o[d] = [];
|
|
1485
|
+
try {
|
|
1486
|
+
const u = D();
|
|
1487
|
+
l && l(u(b(o, Y)), u(b(o, O)));
|
|
1488
|
+
} catch (u) {
|
|
1489
|
+
I(o, !1, u);
|
|
1490
|
+
}
|
|
1491
|
+
}
|
|
1492
|
+
get [Symbol.toStringTag]() {
|
|
1493
|
+
return "Promise";
|
|
1494
|
+
}
|
|
1495
|
+
get [Symbol.species]() {
|
|
1496
|
+
return A;
|
|
1497
|
+
}
|
|
1498
|
+
then(l, o) {
|
|
1499
|
+
let u = this.constructor?.[Symbol.species];
|
|
1500
|
+
(!u || typeof u != "function") && (u = this.constructor || A);
|
|
1501
|
+
const v = new u(G), R = a.current;
|
|
1502
|
+
return this[k] == g ? this[d].push(R, v, l, o) : r(this, R, v, l, o), v;
|
|
1503
|
+
}
|
|
1504
|
+
catch(l) {
|
|
1505
|
+
return this.then(null, l);
|
|
1506
|
+
}
|
|
1507
|
+
finally(l) {
|
|
1508
|
+
let o = this.constructor?.[Symbol.species];
|
|
1509
|
+
(!o || typeof o != "function") && (o = A);
|
|
1510
|
+
const u = new o(G);
|
|
1511
|
+
u[x] = x;
|
|
1512
|
+
const v = a.current;
|
|
1513
|
+
return this[k] == g ? this[d].push(v, u, l, l) : r(this, v, u, l, l), u;
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
A.resolve = A.resolve, A.reject = A.reject, A.race = A.race, A.all = A.all;
|
|
1517
|
+
const ge = n[_] = n.Promise;
|
|
1518
|
+
n.Promise = A;
|
|
1519
|
+
const ye = T("thenPatched");
|
|
1520
|
+
function se(h) {
|
|
1521
|
+
const l = h.prototype, o = c(l, "then");
|
|
1522
|
+
if (o && (o.writable === !1 || !o.configurable))
|
|
1523
|
+
return;
|
|
1524
|
+
const u = l.then;
|
|
1525
|
+
l[C] = u, h.prototype.then = function(v, R) {
|
|
1526
|
+
return new A((N, Z) => {
|
|
1527
|
+
u.call(this, N, Z);
|
|
1528
|
+
}).then(v, R);
|
|
1529
|
+
}, h[ye] = !0;
|
|
1530
|
+
}
|
|
1531
|
+
e.patchThen = se;
|
|
1532
|
+
function Ce(h) {
|
|
1533
|
+
return function(l, o) {
|
|
1534
|
+
let u = h.apply(l, o);
|
|
1535
|
+
if (u instanceof A)
|
|
1536
|
+
return u;
|
|
1537
|
+
let v = u.constructor;
|
|
1538
|
+
return v[ye] || se(v), u;
|
|
1539
|
+
};
|
|
1540
|
+
}
|
|
1541
|
+
return ge && (se(ge), Ee(n, "fetch", (h) => Ce(h))), Promise[a.__symbol__("uncaughtPromiseErrors")] = y, A;
|
|
1542
|
+
});
|
|
1543
|
+
}
|
|
1544
|
+
function Mt(t) {
|
|
1545
|
+
t.__load_patch("toString", (n) => {
|
|
1546
|
+
const a = Function.prototype.toString, e = H("OriginalDelegate"), c = H("Promise"), f = H("Error"), p = function() {
|
|
1547
|
+
if (typeof this == "function") {
|
|
1548
|
+
const _ = this[e];
|
|
1549
|
+
if (_)
|
|
1550
|
+
return typeof _ == "function" ? a.call(_) : Object.prototype.toString.call(_);
|
|
1551
|
+
if (this === Promise) {
|
|
1552
|
+
const C = n[c];
|
|
1553
|
+
if (C)
|
|
1554
|
+
return a.call(C);
|
|
1555
|
+
}
|
|
1556
|
+
if (this === Error) {
|
|
1557
|
+
const C = n[f];
|
|
1558
|
+
if (C)
|
|
1559
|
+
return a.call(C);
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
return a.call(this);
|
|
1563
|
+
};
|
|
1564
|
+
p[e] = a, Function.prototype.toString = p;
|
|
1565
|
+
const T = Object.prototype.toString, y = "[object Promise]";
|
|
1566
|
+
Object.prototype.toString = function() {
|
|
1567
|
+
return typeof Promise == "function" && this instanceof Promise ? y : T.call(this);
|
|
1568
|
+
};
|
|
1569
|
+
});
|
|
1570
|
+
}
|
|
1571
|
+
function It(t, n, a, e, c) {
|
|
1572
|
+
const f = Zone.__symbol__(e);
|
|
1573
|
+
if (n[f])
|
|
1574
|
+
return;
|
|
1575
|
+
const p = n[f] = n[e];
|
|
1576
|
+
n[e] = function(T, y, w) {
|
|
1577
|
+
return y && y.prototype && c.forEach(function(_) {
|
|
1578
|
+
const C = `${a}.${e}::` + _, M = y.prototype;
|
|
1579
|
+
try {
|
|
1580
|
+
if (M.hasOwnProperty(_)) {
|
|
1581
|
+
const F = t.ObjectGetOwnPropertyDescriptor(M, _);
|
|
1582
|
+
F && F.value ? (F.value = t.wrapWithCurrentZone(F.value, C), t._redefineProperty(y.prototype, _, F)) : M[_] && (M[_] = t.wrapWithCurrentZone(M[_], C));
|
|
1583
|
+
} else M[_] && (M[_] = t.wrapWithCurrentZone(M[_], C));
|
|
1584
|
+
} catch {
|
|
1585
|
+
}
|
|
1586
|
+
}), p.call(n, T, y, w);
|
|
1587
|
+
}, t.attachOriginToPatched(n[e], p);
|
|
1588
|
+
}
|
|
1589
|
+
function At(t) {
|
|
1590
|
+
t.__load_patch("util", (n, a, e) => {
|
|
1591
|
+
const c = Be(n);
|
|
1592
|
+
e.patchOnProperties = Qe, e.patchMethod = Ee, e.bindArguments = Ve, e.patchMacroTask = vt;
|
|
1593
|
+
const f = a.__symbol__("BLACK_LISTED_EVENTS"), p = a.__symbol__("UNPATCHED_EVENTS");
|
|
1594
|
+
n[p] && (n[f] = n[p]), n[f] && (a[f] = a[p] = n[f]), e.patchEventPrototype = Rt, e.patchEventTarget = Pt, e.isIEOrEdge = bt, e.ObjectDefineProperty = te, e.ObjectGetOwnPropertyDescriptor = ee, e.ObjectCreate = fe, e.ArraySlice = ke, e.patchClass = Se, e.wrapWithCurrentZone = xe, e.filterProperties = at, e.attachOriginToPatched = pe, e._redefineProperty = Object.defineProperty, e.patchCallbacks = It, e.getGlobalObjects = () => ({
|
|
1595
|
+
globalSources: rt,
|
|
1596
|
+
zoneSymbolEventNames: ae,
|
|
1597
|
+
eventNames: c,
|
|
1598
|
+
isBrowser: ze,
|
|
1599
|
+
isMix: $e,
|
|
1600
|
+
isNode: Ze,
|
|
1601
|
+
TRUE_STR: _e,
|
|
1602
|
+
FALSE_STR: Te,
|
|
1603
|
+
ZONE_SYMBOL_PREFIX: we,
|
|
1604
|
+
ADD_EVENT_LISTENER_STR: ve,
|
|
1605
|
+
REMOVE_EVENT_LISTENER_STR: Ae
|
|
1606
|
+
});
|
|
1607
|
+
});
|
|
1608
|
+
}
|
|
1609
|
+
function jt(t) {
|
|
1610
|
+
Lt(t), Mt(t), At(t);
|
|
1611
|
+
}
|
|
1612
|
+
const ut = z();
|
|
1613
|
+
return jt(ut), Zt(ut), pt;
|
|
1614
|
+
}
|
|
1615
|
+
Ft();
|
|
1616
|
+
export {
|
|
1617
|
+
zt as ZoneContextManager
|
|
1618
|
+
};
|
|
1619
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBrfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFIgYXMgUk9PVF9DT05URVhUIH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lciBmdW5jdGlvbnMgdGhlbiBpdCB3aWxsIHJldHVybiB0cnVlLlxuICogR2VuZXJhbGx5IG9ubHkgY2FsbGVkIHdpdGggYSBgVGFyZ2V0V2l0aEV2ZW50c2AgYnV0IG1heSBiZSBjYWxsZWQgd2l0aCBhbiB1bmtub3duIC8gYW55LlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gY2hlY2suXG4gKi9cbmZ1bmN0aW9uIGlzTGlzdGVuZXJPYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gdm9pZCAwKSB7IG9iaiA9IHt9OyB9XG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG9iai5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiem9uZS5qc1wiIC8+XG4vKiBLZXkgbmFtZSB0byBiZSB1c2VkIHRvIHNhdmUgYSBjb250ZXh0IHJlZmVyZW5jZSBpbiBab25lICovXG52YXIgWk9ORV9DT05URVhUX0tFWSA9ICdPVF9aT05FX0NPTlRFWFQnO1xuLyoqXG4gKiBab25lQ29udGV4dE1hbmFnZXJcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGVhc3kgZnVuY3Rpb25hbGl0eSBmb3IgdHJhY2luZyBhY3Rpb24gYmV0d2VlbiBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbiB3ZWIuXG4gKiBJdCB3YXMgbm90IHBvc3NpYmxlIHdpdGggc3RhbmRhcmQgW1N0YWNrQ29udGV4dE1hbmFnZXJde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvbWFpbi9wYWNrYWdlcy9vcGVudGVsZW1ldHJ5LXNkay10cmFjZS13ZWIvc3JjL1N0YWNrQ29udGV4dE1hbmFnZXIudHN9LlxuICogSXQgaGVhdmlseSBkZXBlbmRzIG9uIFt6b25lLmpzXXtAbGluayBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS96b25lLmpzfS5cbiAqIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgY29udGV4dCBpbiB6b25lLiBFYWNoIENvbnRleHQgd2lsbCBoYXZlIGFsd2F5cyBuZXcgWm9uZTtcbiAqIEl0IGFsc28gc3VwcG9ydHMgYmluZGluZyBhIGNlcnRhaW4gU3BhbiB0byBhIHRhcmdldCB0aGF0IGhhcyBcImFkZEV2ZW50TGlzdGVuZXJcIiBhbmQgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIuXG4gKiBXaGVuIHRoaXMgaGFwcGVucyBhIG5ldyB6b25lIGlzIGJlaW5nIGNyZWF0ZWQgYW5kIHRoZSBwcm92aWRlZCBTcGFuIGlzIGJlaW5nIGFzc2lnbmVkIHRvIHRoaXMgem9uZS5cbiAqL1xudmFyIFpvbmVDb250ZXh0TWFuYWdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBab25lQ29udGV4dE1hbmFnZXIoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB3aGV0aGVyIHRoZSBjb250ZXh0IG1hbmFnZXIgaXMgZW5hYmxlZCBvciBub3RcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhlbHBzIHRvIGNyZWF0ZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgem9uZXMgLSBwYXJ0IG9mIHpvbmUgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIgPSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgY29udGV4dCBmcm9tIGNlcnRhaW4gem9uZSBuYW1lXG4gICAgICogQHBhcmFtIGFjdGl2ZVpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9hY3RpdmVDb250ZXh0RnJvbVpvbmUgPSBmdW5jdGlvbiAoYWN0aXZlWm9uZSkge1xuICAgICAgICByZXR1cm4gKGFjdGl2ZVpvbmUgJiYgYWN0aXZlWm9uZS5nZXQoWk9ORV9DT05URVhUX0tFWSkpIHx8IFJPT1RfQ09OVEVYVDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRhcmdldCBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB0YXJnZXQgRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBjb250ZXh0XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9iaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIHZhciBtYW5hZ2VyID0gdGhpcztcbiAgICAgICAgdmFyIGNvbnRleHRXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtYW5hZ2VyLndpdGgoY29udGV4dCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGFyZ2V0LmFwcGx5KF90aGlzLCBhcmdzKTsgfSk7XG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0V3JhcHBlciwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWU6IHRhcmdldC5sZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29udGV4dFdyYXBwZXI7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGJpbmQgdG8gdGFyZ2V0XG4gICAgICogQHBhcmFtIG9iaiB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBsaXN0ZW5lcnMgd2lsbCBiZSBwYXRjaGVkXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fYmluZExpc3RlbmVyID0gZnVuY3Rpb24gKGNvbnRleHQsIG9iaikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gb2JqO1xuICAgICAgICBpZiAodGFyZ2V0Ll9fb3RfbGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hBZGRFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyID0gdGhpcy5fcGF0Y2hSZW1vdmVFdmVudExpc3RlbmVyKHRhcmdldCwgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSB6b25lIG5hbWVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fem9uZUNvdW50ZXIrKztcbiAgICAgICAgdmFyIHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl96b25lQ291bnRlciArIFwiLVwiICsgcmFuZG9tO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB6b25lXG4gICAgICogQHBhcmFtIHpvbmVOYW1lIHpvbmUgbmFtZVxuICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCAoc3BhbikgdG8gYmUgYmluZCB3aXRoIFpvbmVcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9jcmVhdGVab25lID0gZnVuY3Rpb24gKHpvbmVOYW1lLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5mb3JrKHtcbiAgICAgICAgICAgIG5hbWU6IHpvbmVOYW1lLFxuICAgICAgICAgICAgcHJvcGVydGllczogKF9hID0ge30sXG4gICAgICAgICAgICAgICAgX2FbWk9ORV9DT05URVhUX0tFWV0gPSBjb250ZXh0LFxuICAgICAgICAgICAgICAgIF9hKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhY3RpdmUgem9uZVxuICAgICAqL1xuICAgIFpvbmVDb250ZXh0TWFuYWdlci5wcm90b3R5cGUuX2dldEFjdGl2ZVpvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBab25lLmN1cnJlbnQ7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBQYXRjaGVzIGFkZEV2ZW50TGlzdGVuZXIgbWV0aG9kXG4gICAgICogQHBhcmFtIHRhcmdldCBhbnkgdGFyZ2V0IHRoYXQgaGFzIFwiYWRkRXZlbnRMaXN0ZW5lclwiIG1ldGhvZFxuICAgICAqIEBwYXJhbSBvcmlnaW5hbCByZWZlcmVuY2UgdG8gdGhlIHBhdGNoZWQgbWV0aG9kXG4gICAgICogQHBhcmFtIFtjb250ZXh0XSBjb250ZXh0IHRvIGJlIGJpbmQgdG8gdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5fcGF0Y2hBZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHRhcmdldCwgb3JpZ2luYWwsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnRleHRNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIsIG9wdHMpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19vdF9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVycyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF07XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgICAgICAgICAgICAgIHRhcmdldC5fX290X2xpc3RlbmVyc1tldmVudF0gPSBsaXN0ZW5lcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcGF0Y2hlZExpc3RlbmVyID0gY29udGV4dE1hbmFnZXIuYmluZChjb250ZXh0LCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAvLyBzdG9yZSBhIHdlYWsgcmVmZXJlbmNlIG9mIHRoZSB1c2VyIGxpc3RlbmVyIHRvIG91cnNcbiAgICAgICAgICAgIGxpc3RlbmVycy5zZXQobGlzdGVuZXIsIHBhdGNoZWRMaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyLCBvcHRzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFBhdGNoZXMgcmVtb3ZlRXZlbnRMaXN0ZW5lciBtZXRob2RcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IGFueSB0YXJnZXQgdGhhdCBoYXMgXCJyZW1vdmVFdmVudExpc3RlbmVyXCIgbWV0aG9kXG4gICAgICogQHBhcmFtIG9yaWdpbmFsIHJlZmVyZW5jZSB0byB0aGUgcGF0Y2hlZCBtZXRob2RcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLl9wYXRjaFJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodGFyZ2V0LCBvcmlnaW5hbCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5fX290X2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICAgdGFyZ2V0Ll9fb3RfbGlzdGVuZXJzW2V2ZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBldmVudHMgPSB0YXJnZXQuX19vdF9saXN0ZW5lcnNbZXZlbnRdO1xuICAgICAgICAgICAgdmFyIHBhdGNoZWRMaXN0ZW5lciA9IGV2ZW50cy5nZXQobGlzdGVuZXIpO1xuICAgICAgICAgICAgZXZlbnRzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY2FsbCh0aGlzLCBldmVudCwgcGF0Y2hlZExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFjdGl2ZSBjb250ZXh0XG4gICAgICovXG4gICAgWm9uZUNvbnRleHRNYW5hZ2VyLnByb3RvdHlwZS5hY3RpdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJPT1RfQ09OVEVYVDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYWN0aXZlWm9uZSA9IHRoaXMuX2dldEFjdGl2ZVpvbmUoKTtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuX2FjdGl2ZUNvbnRleHRGcm9tWm9uZShhY3RpdmVab25lKTtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUk9PVF9DT05URVhUO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQmluZHMgYSB0aGUgY2VydGFpbiBjb250ZXh0IG9yIHRoZSBhY3RpdmUgb25lIHRvIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIHRoZW4gcmV0dXJucyB0aGUgdGFyZ2V0XG4gICAgICogQHBhcmFtIGNvbnRleHQgQSBjb250ZXh0IChzcGFuKSB0byBiZSBiaW5kIHRvIHRhcmdldFxuICAgICAqIEBwYXJhbSB0YXJnZXQgYSBmdW5jdGlvbiBvciBldmVudCBlbWl0dGVyLiBXaGVuIHRhcmdldCBvciBvbmUgb2YgaXRzIGNhbGxiYWNrcyBpcyBjYWxsZWQsXG4gICAgICogIHRoZSBwcm92aWRlZCBjb250ZXh0IHdpbGwgYmUgdXNlZCBhcyB0aGUgYWN0aXZlIGNvbnRleHQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoY29udGV4dCwgdGFyZ2V0KSB7XG4gICAgICAgIC8vIGlmIG5vIHNwZWNpZmljIGNvbnRleHQgdG8gcHJvcGFnYXRlIGlzIGdpdmVuLCB3ZSB1c2UgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnRleHQgPSB0aGlzLmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYmluZEZ1bmN0aW9uKGNvbnRleHQsIHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNMaXN0ZW5lck9iamVjdCh0YXJnZXQpKSB7XG4gICAgICAgICAgICB0aGlzLl9iaW5kTGlzdGVuZXIoY29udGV4dCwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogRGlzYWJsZSB0aGUgY29udGV4dCBtYW5hZ2VyIChjbGVhcnMgYWxsIHRoZSBjb250ZXh0cylcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBjb250ZXh0IG1hbmFnZXIgYW5kIGNyZWF0ZXMgYSBkZWZhdWx0KHJvb3QpIGNvbnRleHRcbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIFtmbl0gd2l0aCB0aGUgcHJvdmlkZWQgW2NvbnRleHRdLlxuICAgICAqICAgICBJZiBbY29udGV4dF0gaXMgdW5kZWZpbmVkIHRoZW4gaXQgd2lsbCB1c2UgdGhlIGFjdGl2ZSBjb250ZXh0LlxuICAgICAqICAgICBUaGUgY29udGV4dCB3aWxsIGJlIHNldCBhcyBhY3RpdmVcbiAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgKHNwYW4pIHRvIGJlIGNhbGxlZCB3aXRoIHByb3ZpZGVkIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHRoaXNBcmcgb3B0aW9uYWwgcmVjZWl2ZXIgdG8gYmUgdXNlZCBmb3IgY2FsbGluZyBmblxuICAgICAqIEBwYXJhbSBhcmdzIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gZm5cbiAgICAgKi9cbiAgICBab25lQ29udGV4dE1hbmFnZXIucHJvdG90eXBlLndpdGggPSBmdW5jdGlvbiAoY29udGV4dCwgZm4sIHRoaXNBcmcpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAzOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2kgLSAzXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHpvbmVOYW1lID0gdGhpcy5fY3JlYXRlWm9uZU5hbWUoKTtcbiAgICAgICAgdmFyIG5ld1pvbmUgPSB0aGlzLl9jcmVhdGVab25lKHpvbmVOYW1lLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG5ld1pvbmUucnVuKGZuLCB0aGlzQXJnLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBab25lQ29udGV4dE1hbmFnZXI7XG59KCkpO1xuXG52YXIgem9uZSA9IHt9O1xuXG52YXIgaGFzUmVxdWlyZWRab25lO1xuXG5mdW5jdGlvbiByZXF1aXJlWm9uZSAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFpvbmUpIHJldHVybiB6b25lO1xuXHRoYXNSZXF1aXJlZFpvbmUgPSAxO1xuXHQvKipcblx0ICogQGxpY2Vuc2UgQW5ndWxhciB2PHVua25vd24+XG5cdCAqIChjKSAyMDEwLTIwMjUgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvL1xuXHQgKiBMaWNlbnNlOiBNSVRcblx0ICovXG5cdGNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXM7XG5cdC8vIF9fWm9uZV9zeW1ib2xfcHJlZml4IGdsb2JhbCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB6b25lXG5cdC8vIHN5bWJvbCBwcmVmaXggd2l0aCBhIGN1c3RvbSBvbmUgaWYgbmVlZGVkLlxuXHRmdW5jdGlvbiBfX3N5bWJvbF9fKG5hbWUpIHtcblx0ICAgIGNvbnN0IHN5bWJvbFByZWZpeCA9IGdsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJztcblx0ICAgIHJldHVybiBzeW1ib2xQcmVmaXggKyBuYW1lO1xuXHR9XG5cdGZ1bmN0aW9uIGluaXRab25lKCkge1xuXHQgICAgY29uc3QgcGVyZm9ybWFuY2UgPSBnbG9iYWxbJ3BlcmZvcm1hbmNlJ107XG5cdCAgICBmdW5jdGlvbiBtYXJrKG5hbWUpIHtcblx0ICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWFyayddICYmIHBlcmZvcm1hbmNlWydtYXJrJ10obmFtZSk7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBwZXJmb3JtYW5jZU1lYXN1cmUobmFtZSwgbGFiZWwpIHtcblx0ICAgICAgICBwZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZVsnbWVhc3VyZSddICYmIHBlcmZvcm1hbmNlWydtZWFzdXJlJ10obmFtZSwgbGFiZWwpO1xuXHQgICAgfVxuXHQgICAgbWFyaygnWm9uZScpO1xuXHQgICAgY2xhc3MgWm9uZUltcGwge1xuXHQgICAgICAgIHN0YXRpYyBfX3N5bWJvbF9fID0gX19zeW1ib2xfXztcblx0ICAgICAgICBzdGF0aWMgYXNzZXJ0Wm9uZVBhdGNoZWQoKSB7XG5cdCAgICAgICAgICAgIGlmIChnbG9iYWxbJ1Byb21pc2UnXSAhPT0gcGF0Y2hlc1snWm9uZUF3YXJlUHJvbWlzZSddKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmUuanMgaGFzIGRldGVjdGVkIHRoYXQgWm9uZUF3YXJlUHJvbWlzZSBgKHdpbmRvd3xnbG9iYWwpLlByb21pc2VgICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiBvdmVyd3JpdHRlbi5cXG4nICtcblx0ICAgICAgICAgICAgICAgICAgICAnTW9zdCBsaWtlbHkgY2F1c2UgaXMgdGhhdCBhIFByb21pc2UgcG9seWZpbGwgaGFzIGJlZW4gbG9hZGVkICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICdJZiB5b3UgbXVzdCBsb2FkIG9uZSwgZG8gc28gYmVmb3JlIGxvYWRpbmcgem9uZS5qcy4pJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgc3RhdGljIGdldCByb290KCkge1xuXHQgICAgICAgICAgICBsZXQgem9uZSA9IFpvbmVJbXBsLmN1cnJlbnQ7XG5cdCAgICAgICAgICAgIHdoaWxlICh6b25lLnBhcmVudCkge1xuXHQgICAgICAgICAgICAgICAgem9uZSA9IHpvbmUucGFyZW50O1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiB6b25lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgZ2V0IGN1cnJlbnQoKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBfY3VycmVudFpvbmVGcmFtZS56b25lO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgZ2V0IGN1cnJlbnRUYXNrKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRUYXNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBzdGF0aWMgX19sb2FkX3BhdGNoKG5hbWUsIGZuLCBpZ25vcmVEdXBsaWNhdGUgPSBmYWxzZSkge1xuXHQgICAgICAgICAgICBpZiAocGF0Y2hlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgLy8gYGNoZWNrRHVwbGljYXRlYCBvcHRpb24gaXMgZGVmaW5lZCBmcm9tIGdsb2JhbCB2YXJpYWJsZVxuXHQgICAgICAgICAgICAgICAgLy8gc28gaXQgd29ya3MgZm9yIGFsbCBtb2R1bGVzLlxuXHQgICAgICAgICAgICAgICAgLy8gYGlnbm9yZUR1cGxpY2F0ZWAgY2FuIHdvcmsgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlXG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGVja0R1cGxpY2F0ZSA9IGdsb2JhbFtfX3N5bWJvbF9fKCdmb3JjZUR1cGxpY2F0ZVpvbmVDaGVjaycpXSA9PT0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIGlmICghaWdub3JlRHVwbGljYXRlICYmIGNoZWNrRHVwbGljYXRlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0FscmVhZHkgbG9hZGVkIHBhdGNoOiAnICsgbmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoIWdsb2JhbFsnX19ab25lX2Rpc2FibGVfJyArIG5hbWVdKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwZXJmTmFtZSA9ICdab25lOicgKyBuYW1lO1xuXHQgICAgICAgICAgICAgICAgbWFyayhwZXJmTmFtZSk7XG5cdCAgICAgICAgICAgICAgICBwYXRjaGVzW25hbWVdID0gZm4oZ2xvYmFsLCBab25lSW1wbCwgX2FwaSk7XG5cdCAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZU1lYXN1cmUocGVyZk5hbWUsIHBlcmZOYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXQgcGFyZW50KCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXQgbmFtZSgpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF9wYXJlbnQ7XG5cdCAgICAgICAgX25hbWU7XG5cdCAgICAgICAgX3Byb3BlcnRpZXM7XG5cdCAgICAgICAgX3pvbmVEZWxlZ2F0ZTtcblx0ICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHpvbmVTcGVjKSB7XG5cdCAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcblx0ICAgICAgICAgICAgdGhpcy5fbmFtZSA9IHpvbmVTcGVjID8gem9uZVNwZWMubmFtZSB8fCAndW5uYW1lZCcgOiAnPHJvb3Q+Jztcblx0ICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9ICh6b25lU3BlYyAmJiB6b25lU3BlYy5wcm9wZXJ0aWVzKSB8fCB7fTtcblx0ICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlID0gbmV3IF9ab25lRGVsZWdhdGUodGhpcywgdGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC5fem9uZURlbGVnYXRlLCB6b25lU3BlYyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGdldChrZXkpIHtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZSA9IHRoaXMuZ2V0Wm9uZVdpdGgoa2V5KTtcblx0ICAgICAgICAgICAgaWYgKHpvbmUpXG5cdCAgICAgICAgICAgICAgICByZXR1cm4gem9uZS5fcHJvcGVydGllc1trZXldO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBnZXRab25lV2l0aChrZXkpIHtcblx0ICAgICAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzO1xuXHQgICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuXHQgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQuX3Byb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuX3BhcmVudDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gbnVsbDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZm9yayh6b25lU3BlYykge1xuXHQgICAgICAgICAgICBpZiAoIXpvbmVTcGVjKVxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lU3BlYyByZXF1aXJlZCEnKTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5mb3JrKHRoaXMsIHpvbmVTcGVjKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgd3JhcChjYWxsYmFjaywgc291cmNlKSB7XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIGZ1bmN0aW9uIGdvdDogJyArIGNhbGxiYWNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBfY2FsbGJhY2sgPSB0aGlzLl96b25lRGVsZWdhdGUuaW50ZXJjZXB0KHRoaXMsIGNhbGxiYWNrLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICBjb25zdCB6b25lID0gdGhpcztcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB6b25lLnJ1bkd1YXJkZWQoX2NhbGxiYWNrLCB0aGlzLCBhcmd1bWVudHMsIHNvdXJjZSk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJ1bihjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkge1xuXHQgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBfY3VycmVudFpvbmVGcmFtZSwgem9uZTogdGhpcyB9O1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZpbmFsbHkge1xuXHQgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcnVuR3VhcmRlZChjYWxsYmFjaywgYXBwbHlUaGlzID0gbnVsbCwgYXBwbHlBcmdzLCBzb3VyY2UpIHtcblx0ICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogX2N1cnJlbnRab25lRnJhbWUsIHpvbmU6IHRoaXMgfTtcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnJvcikpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZpbmFsbHkge1xuXHQgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcnVuVGFzayh0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykge1xuXHQgICAgICAgICAgICBpZiAodGFzay56b25lICE9IHRoaXMpIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICtcblx0ICAgICAgICAgICAgICAgICAgICAodGFzay56b25lIHx8IE5PX1pPTkUpLm5hbWUgK1xuXHQgICAgICAgICAgICAgICAgICAgICc7IEV4ZWN1dGlvbjogJyArXG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lICtcblx0ICAgICAgICAgICAgICAgICAgICAnKScpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IHpvbmVUYXNrID0gdGFzaztcblx0ICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvNzc4LCBzb21ldGltZXMgZXZlbnRUYXNrXG5cdCAgICAgICAgICAgIC8vIHdpbGwgcnVuIGluIG5vdFNjaGVkdWxlZChjYW5jZWxlZCkgc3RhdGUsIHdlIHNob3VsZCBub3QgdHJ5IHRvXG5cdCAgICAgICAgICAgIC8vIHJ1biBzdWNoIGtpbmQgb2YgdGFzayBidXQganVzdCByZXR1cm5cblx0ICAgICAgICAgICAgY29uc3QgeyB0eXBlLCBkYXRhOiB7IGlzUGVyaW9kaWMgPSBmYWxzZSwgaXNSZWZyZXNoYWJsZSA9IGZhbHNlIH0gPSB7fSB9ID0gdGFzaztcblx0ICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT09IG5vdFNjaGVkdWxlZCAmJiAodHlwZSA9PT0gZXZlbnRUYXNrIHx8IHR5cGUgPT09IG1hY3JvVGFzaykpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCByZUVudHJ5R3VhcmQgPSB0YXNrLnN0YXRlICE9IHJ1bm5pbmc7XG5cdCAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB6b25lVGFzay5fdHJhbnNpdGlvblRvKHJ1bm5pbmcsIHNjaGVkdWxlZCk7XG5cdCAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVGFzayA9IF9jdXJyZW50VGFzaztcblx0ICAgICAgICAgICAgX2N1cnJlbnRUYXNrID0gem9uZVRhc2s7XG5cdCAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBtYWNyb1Rhc2sgJiYgdGFzay5kYXRhICYmICFpc1BlcmlvZGljICYmICFpc1JlZnJlc2hhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGFzay5jYW5jZWxGbiA9IHVuZGVmaW5lZDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsIHpvbmVUYXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycm9yKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZmluYWxseSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzaydzIHN0YXRlIGlzIG5vdFNjaGVkdWxlZCBvciB1bmtub3duLCB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkXG5cdCAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgbm90IHJlc2V0IHRoZSBzdGF0ZSB0byBzY2hlZHVsZWRcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGFzay5zdGF0ZTtcblx0ICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbm90U2NoZWR1bGVkICYmIHN0YXRlICE9PSB1bmtub3duKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gZXZlbnRUYXNrIHx8IGlzUGVyaW9kaWMgfHwgKGlzUmVmcmVzaGFibGUgJiYgc3RhdGUgPT09IHNjaGVkdWxpbmcpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB6b25lVGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgcnVubmluZywgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6b25lRGVsZWdhdGVzID0gem9uZVRhc2suX3pvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh6b25lVGFzaywgLTEpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZUVudHJ5R3VhcmQgJiYgem9uZVRhc2suX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHJ1bm5pbmcsIG5vdFNjaGVkdWxlZCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JlZnJlc2hhYmxlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lVGFzay5fem9uZURlbGVnYXRlcyA9IHpvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IF9jdXJyZW50Wm9uZUZyYW1lLnBhcmVudDtcblx0ICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHByZXZpb3VzVGFzaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBzY2hlZHVsZVRhc2sodGFzaykge1xuXHQgICAgICAgICAgICBpZiAodGFzay56b25lICYmIHRhc2suem9uZSAhPT0gdGhpcykge1xuXHQgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRhc2sgd2FzIHJlc2NoZWR1bGVkLCB0aGUgbmV3Wm9uZVxuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBiZSB0aGUgY2hpbGRyZW4gb2YgdGhlIG9yaWdpbmFsIHpvbmVcblx0ICAgICAgICAgICAgICAgIGxldCBuZXdab25lID0gdGhpcztcblx0ICAgICAgICAgICAgICAgIHdoaWxlIChuZXdab25lKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1pvbmUgPT09IHRhc2suem9uZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgY2FuIG5vdCByZXNjaGVkdWxlIHRhc2sgdG8gJHt0aGlzLm5hbWV9IHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICR7dGFzay56b25lLm5hbWV9YCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIG5ld1pvbmUgPSBuZXdab25lLnBhcmVudDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGluZywgbm90U2NoZWR1bGVkKTtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZURlbGVnYXRlcyA9IFtdO1xuXHQgICAgICAgICAgICB0YXNrLl96b25lRGVsZWdhdGVzID0gem9uZURlbGVnYXRlcztcblx0ICAgICAgICAgICAgdGFzay5fem9uZSA9IHRoaXM7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICB0YXNrID0gdGhpcy5fem9uZURlbGVnYXRlLnNjaGVkdWxlVGFzayh0aGlzLCB0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBzaG91bGQgc2V0IHRhc2sncyBzdGF0ZSB0byB1bmtub3duIHdoZW4gc2NoZWR1bGVUYXNrIHRocm93IGVycm9yXG5cdCAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlcnIgbWF5IGZyb20gcmVzY2hlZHVsZSwgc28gdGhlIGZyb21TdGF0ZSBtYXliZSBub3RTY2hlZHVsZWRcblx0ICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyh1bmtub3duLCBzY2hlZHVsaW5nLCBub3RTY2hlZHVsZWQpO1xuXHQgICAgICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc2hvdWxkIHdlIGNoZWNrIHRoZSByZXN1bHQgZnJvbSBoYW5kbGVFcnJvcj9cblx0ICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnIpO1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0YXNrLl96b25lRGVsZWdhdGVzID09PSB6b25lRGVsZWdhdGVzKSB7XG5cdCAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIGJlY2F1c2UgaW50ZXJuYWxseSB0aGUgZGVsZWdhdGUgY2FuIHJlc2NoZWR1bGUgdGhlIHRhc2suXG5cdCAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT0gc2NoZWR1bGluZykge1xuXHQgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWljcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgdW5kZWZpbmVkKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHNjaGVkdWxlTWFjcm9UYXNrKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyBab25lVGFzayhtYWNyb1Rhc2ssIHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IFpvbmVUYXNrKGV2ZW50VGFzaywgc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjYW5jZWxUYXNrKHRhc2spIHtcblx0ICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKVxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHRhc2sgY2FuIG9ubHkgYmUgY2FuY2VsbGVkIGluIHRoZSB6b25lIG9mIGNyZWF0aW9uISAoQ3JlYXRpb246ICcgK1xuXHQgICAgICAgICAgICAgICAgICAgICh0YXNrLnpvbmUgfHwgTk9fWk9ORSkubmFtZSArXG5cdCAgICAgICAgICAgICAgICAgICAgJzsgRXhlY3V0aW9uOiAnICtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgK1xuXHQgICAgICAgICAgICAgICAgICAgICcpJyk7XG5cdCAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlICE9PSBzY2hlZHVsZWQgJiYgdGFzay5zdGF0ZSAhPT0gcnVubmluZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhjYW5jZWxpbmcsIHNjaGVkdWxlZCwgcnVubmluZyk7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuY2FuY2VsVGFzayh0aGlzLCB0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBpZiBlcnJvciBvY2N1cnMgd2hlbiBjYW5jZWxUYXNrLCB0cmFuc2l0IHRoZSBzdGF0ZSB0byB1bmtub3duXG5cdCAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8odW5rbm93biwgY2FuY2VsaW5nKTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnIpO1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh0YXNrLCAtMSk7XG5cdCAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIGNhbmNlbGluZyk7XG5cdCAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAtMTtcblx0ICAgICAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF91cGRhdGVUYXNrQ291bnQodGFzaywgY291bnQpIHtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZURlbGVnYXRlcyA9IHRhc2suX3pvbmVEZWxlZ2F0ZXM7XG5cdCAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkge1xuXHQgICAgICAgICAgICAgICAgdGFzay5fem9uZURlbGVnYXRlcyA9IG51bGw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB6b25lRGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICB6b25lRGVsZWdhdGVzW2ldLl91cGRhdGVUYXNrQ291bnQodGFzay50eXBlLCBjb3VudCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjb25zdCBERUxFR0FURV9aUyA9IHtcblx0ICAgICAgICBuYW1lOiAnJyxcblx0ICAgICAgICBvbkhhc1Rhc2s6IChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCBoYXNUYXNrU3RhdGUpID0+IGRlbGVnYXRlLmhhc1Rhc2sodGFyZ2V0LCBoYXNUYXNrU3RhdGUpLFxuXHQgICAgICAgIG9uU2NoZWR1bGVUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykgPT4gZGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRhcmdldCwgdGFzayksXG5cdCAgICAgICAgb25JbnZva2VUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpID0+IGRlbGVnYXRlLmludm9rZVRhc2sodGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyksXG5cdCAgICAgICAgb25DYW5jZWxUYXNrOiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaykgPT4gZGVsZWdhdGUuY2FuY2VsVGFzayh0YXJnZXQsIHRhc2spLFxuXHQgICAgfTtcblx0ICAgIGNsYXNzIF9ab25lRGVsZWdhdGUge1xuXHQgICAgICAgIGdldCB6b25lKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgX3pvbmU7XG5cdCAgICAgICAgX3Rhc2tDb3VudHMgPSB7XG5cdCAgICAgICAgICAgICdtaWNyb1Rhc2snOiAwLFxuXHQgICAgICAgICAgICAnbWFjcm9UYXNrJzogMCxcblx0ICAgICAgICAgICAgJ2V2ZW50VGFzayc6IDAsXG5cdCAgICAgICAgfTtcblx0ICAgICAgICBfcGFyZW50RGVsZWdhdGU7XG5cdCAgICAgICAgX2ZvcmtEbGd0O1xuXHQgICAgICAgIF9mb3JrWlM7XG5cdCAgICAgICAgX2ZvcmtDdXJyWm9uZTtcblx0ICAgICAgICBfaW50ZXJjZXB0RGxndDtcblx0ICAgICAgICBfaW50ZXJjZXB0WlM7XG5cdCAgICAgICAgX2ludGVyY2VwdEN1cnJab25lO1xuXHQgICAgICAgIF9pbnZva2VEbGd0O1xuXHQgICAgICAgIF9pbnZva2VaUztcblx0ICAgICAgICBfaW52b2tlQ3VyclpvbmU7XG5cdCAgICAgICAgX2hhbmRsZUVycm9yRGxndDtcblx0ICAgICAgICBfaGFuZGxlRXJyb3JaUztcblx0ICAgICAgICBfaGFuZGxlRXJyb3JDdXJyWm9uZTtcblx0ICAgICAgICBfc2NoZWR1bGVUYXNrRGxndDtcblx0ICAgICAgICBfc2NoZWR1bGVUYXNrWlM7XG5cdCAgICAgICAgX3NjaGVkdWxlVGFza0N1cnJab25lO1xuXHQgICAgICAgIF9pbnZva2VUYXNrRGxndDtcblx0ICAgICAgICBfaW52b2tlVGFza1pTO1xuXHQgICAgICAgIF9pbnZva2VUYXNrQ3VyclpvbmU7XG5cdCAgICAgICAgX2NhbmNlbFRhc2tEbGd0O1xuXHQgICAgICAgIF9jYW5jZWxUYXNrWlM7XG5cdCAgICAgICAgX2NhbmNlbFRhc2tDdXJyWm9uZTtcblx0ICAgICAgICBfaGFzVGFza0RsZ3Q7XG5cdCAgICAgICAgX2hhc1Rhc2tEbGd0T3duZXI7XG5cdCAgICAgICAgX2hhc1Rhc2taUztcblx0ICAgICAgICBfaGFzVGFza0N1cnJab25lO1xuXHQgICAgICAgIGNvbnN0cnVjdG9yKHpvbmUsIHBhcmVudERlbGVnYXRlLCB6b25lU3BlYykge1xuXHQgICAgICAgICAgICB0aGlzLl96b25lID0gem9uZTtcblx0ICAgICAgICAgICAgdGhpcy5fcGFyZW50RGVsZWdhdGUgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgdGhpcy5fZm9ya1pTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjICYmIHpvbmVTcGVjLm9uRm9yayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtaUyk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ZvcmtEbGd0ID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uRm9yayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtEbGd0KTtcblx0ICAgICAgICAgICAgdGhpcy5fZm9ya0N1cnJab25lID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkZvcmsgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtDdXJyWm9uZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdFpTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdFpTKTtcblx0ICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0RGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnRlcmNlcHQgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHREbGd0KTtcblx0ICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHRDdXJyWm9uZSk7XG5cdCAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VEbGd0ID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZSA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZURsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VDdXJyWm9uZSA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZUN1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JaUyA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25IYW5kbGVFcnJvciA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2hhbmRsZUVycm9yWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckRsZ3QgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSGFuZGxlRXJyb3IgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckRsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gdGhpcy5fem9uZSA6IHBhcmVudERlbGVnYXRlLl9oYW5kbGVFcnJvckN1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrWlMgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uU2NoZWR1bGVUYXNrID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5fc2NoZWR1bGVUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tEbGd0ID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB0aGlzLl96b25lIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrRGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2VUYXNrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID1cblx0ICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkNhbmNlbFRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9jYW5jZWxUYXNrWlMpO1xuXHQgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9XG5cdCAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25DYW5jZWxUYXNrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0RsZ3QpO1xuXHQgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPVxuXHQgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHRoaXMuX3pvbmUgOiBwYXJlbnREZWxlZ2F0ZS5fY2FuY2VsVGFza0N1cnJab25lKTtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gbnVsbDtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBudWxsO1xuXHQgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndE93bmVyID0gbnVsbDtcblx0ICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gbnVsbDtcblx0ICAgICAgICAgICAgY29uc3Qgem9uZVNwZWNIYXNUYXNrID0gem9uZVNwZWMgJiYgem9uZVNwZWMub25IYXNUYXNrO1xuXHQgICAgICAgICAgICBjb25zdCBwYXJlbnRIYXNUYXNrID0gcGFyZW50RGVsZWdhdGUgJiYgcGFyZW50RGVsZWdhdGUuX2hhc1Rhc2taUztcblx0ICAgICAgICAgICAgaWYgKHpvbmVTcGVjSGFzVGFzayB8fCBwYXJlbnRIYXNUYXNrKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIHJlcG9ydCBoYXNUYXNrLCB0aGFuIHRoaXMgWlMgbmVlZHMgdG8gZG8gcmVmIGNvdW50aW5nIG9uIHRhc2tzLiBJbiBzdWNoXG5cdCAgICAgICAgICAgICAgICAvLyBhIGNhc2UgYWxsIHRhc2sgcmVsYXRlZCBpbnRlcmNlcHRvcnMgbXVzdCBnbyB0aHJvdWdoIHRoaXMgWkQuIFdlIGNhbid0IHNob3J0IGNpcmN1aXQgaXQuXG5cdCAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMgPSB6b25lU3BlY0hhc1Rhc2sgPyB6b25lU3BlYyA6IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSB0aGlzO1xuXHQgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gdGhpcy5fem9uZTtcblx0ICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25TY2hlZHVsZVRhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSA9IHRoaXMuX3pvbmU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoIXpvbmVTcGVjLm9uSW52b2tlVGFzaykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2taUyA9IERFTEVHQVRFX1pTO1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0N1cnJab25lID0gdGhpcy5fem9uZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25DYW5jZWxUYXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID0gREVMRUdBVEVfWlM7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPSB0aGlzLl96b25lO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvcmsodGFyZ2V0Wm9uZSwgem9uZVNwZWMpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcmtaU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LCB0aGlzLnpvbmUsIHRhcmdldFpvbmUsIHpvbmVTcGVjKVxuXHQgICAgICAgICAgICAgICAgOiBuZXcgWm9uZUltcGwodGFyZ2V0Wm9uZSwgem9uZVNwZWMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpbnRlcmNlcHQodGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIHNvdXJjZSkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJjZXB0WlNcblx0ICAgICAgICAgICAgICAgID8gdGhpcy5faW50ZXJjZXB0WlMub25JbnRlcmNlcHQodGhpcy5faW50ZXJjZXB0RGxndCwgdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUsIHRhcmdldFpvbmUsIGNhbGxiYWNrLCBzb3VyY2UpXG5cdCAgICAgICAgICAgICAgICA6IGNhbGxiYWNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpbnZva2UodGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVpTXG5cdCAgICAgICAgICAgICAgICA/IHRoaXMuX2ludm9rZVpTLm9uSW52b2tlKHRoaXMuX2ludm9rZURsZ3QsIHRoaXMuX2ludm9rZUN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSlcblx0ICAgICAgICAgICAgICAgIDogY2FsbGJhY2suYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBoYW5kbGVFcnJvcih0YXJnZXRab25lLCBlcnJvcikge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRXJyb3JaU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9oYW5kbGVFcnJvclpTLm9uSGFuZGxlRXJyb3IodGhpcy5faGFuZGxlRXJyb3JEbGd0LCB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lLCB0YXJnZXRab25lLCBlcnJvcilcblx0ICAgICAgICAgICAgICAgIDogdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgc2NoZWR1bGVUYXNrKHRhcmdldFpvbmUsIHRhc2spIHtcblx0ICAgICAgICAgICAgbGV0IHJldHVyblRhc2sgPSB0YXNrO1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc2NoZWR1bGVUYXNrWlMpIHtcblx0ICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNUYXNrWlMpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrLl96b25lRGVsZWdhdGVzLnB1c2godGhpcy5faGFzVGFza0RsZ3RPd25lcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFyZXR1cm5UYXNrKVxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVyblRhc2sgPSB0YXNrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKHRhc2suc2NoZWR1bGVGbikge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhc2suc2NoZWR1bGVGbih0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhc2sudHlwZSA9PSBtaWNyb1Rhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uJyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIHJldHVyblRhc2s7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGludm9rZVRhc2sodGFyZ2V0Wm9uZSwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVRhc2taU1xuXHQgICAgICAgICAgICAgICAgPyB0aGlzLl9pbnZva2VUYXNrWlMub25JbnZva2VUYXNrKHRoaXMuX2ludm9rZVRhc2tEbGd0LCB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKVxuXHQgICAgICAgICAgICAgICAgOiB0YXNrLmNhbGxiYWNrLmFwcGx5KGFwcGx5VGhpcywgYXBwbHlBcmdzKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2FuY2VsVGFzayh0YXJnZXRab25lLCB0YXNrKSB7XG5cdCAgICAgICAgICAgIGxldCB2YWx1ZTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuX2NhbmNlbFRhc2taUykge1xuXHQgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9jYW5jZWxUYXNrWlMub25DYW5jZWxUYXNrKHRoaXMuX2NhbmNlbFRhc2tEbGd0LCB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbEZuKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1Rhc2sgaXMgbm90IGNhbmNlbGFibGUnKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHZhbHVlID0gdGFzay5jYW5jZWxGbih0YXNrKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGhhc1Rhc2sodGFyZ2V0Wm9uZSwgaXNFbXB0eSkge1xuXHQgICAgICAgICAgICAvLyBoYXNUYXNrIHNob3VsZCBub3QgdGhyb3cgZXJyb3Igc28gb3RoZXIgWm9uZURlbGVnYXRlXG5cdCAgICAgICAgICAgIC8vIGNhbiBzdGlsbCB0cmlnZ2VyIGhhc1Rhc2sgY2FsbGJhY2tcblx0ICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUy5vbkhhc1Rhc2sodGhpcy5faGFzVGFza0RsZ3QsIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgaXNFbXB0eSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcih0YXJnZXRab25lLCBlcnIpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF91cGRhdGVUYXNrQ291bnQodHlwZSwgY291bnQpIHtcblx0ICAgICAgICAgICAgY29uc3QgY291bnRzID0gdGhpcy5fdGFza0NvdW50cztcblx0ICAgICAgICAgICAgY29uc3QgcHJldiA9IGNvdW50c1t0eXBlXTtcblx0ICAgICAgICAgICAgY29uc3QgbmV4dCA9IChjb3VudHNbdHlwZV0gPSBwcmV2ICsgY291bnQpO1xuXHQgICAgICAgICAgICBpZiAobmV4dCA8IDApIHtcblx0ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTW9yZSB0YXNrcyBleGVjdXRlZCB0aGVuIHdlcmUgc2NoZWR1bGVkLicpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwcmV2ID09IDAgfHwgbmV4dCA9PSAwKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0ge1xuXHQgICAgICAgICAgICAgICAgICAgIG1pY3JvVGFzazogY291bnRzWydtaWNyb1Rhc2snXSA+IDAsXG5cdCAgICAgICAgICAgICAgICAgICAgbWFjcm9UYXNrOiBjb3VudHNbJ21hY3JvVGFzayddID4gMCxcblx0ICAgICAgICAgICAgICAgICAgICBldmVudFRhc2s6IGNvdW50c1snZXZlbnRUYXNrJ10gPiAwLFxuXHQgICAgICAgICAgICAgICAgICAgIGNoYW5nZTogdHlwZSxcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB0aGlzLmhhc1Rhc2sodGhpcy5fem9uZSwgaXNFbXB0eSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjbGFzcyBab25lVGFzayB7XG5cdCAgICAgICAgdHlwZTtcblx0ICAgICAgICBzb3VyY2U7XG5cdCAgICAgICAgaW52b2tlO1xuXHQgICAgICAgIGNhbGxiYWNrO1xuXHQgICAgICAgIGRhdGE7XG5cdCAgICAgICAgc2NoZWR1bGVGbjtcblx0ICAgICAgICBjYW5jZWxGbjtcblx0ICAgICAgICBfem9uZSA9IG51bGw7XG5cdCAgICAgICAgcnVuQ291bnQgPSAwO1xuXHQgICAgICAgIF96b25lRGVsZWdhdGVzID0gbnVsbDtcblx0ICAgICAgICBfc3RhdGUgPSAnbm90U2NoZWR1bGVkJztcblx0ICAgICAgICBjb25zdHJ1Y3Rvcih0eXBlLCBzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZUZuLCBjYW5jZWxGbikge1xuXHQgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuXHQgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcblx0ICAgICAgICAgICAgdGhpcy5kYXRhID0gb3B0aW9ucztcblx0ICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZuID0gc2NoZWR1bGVGbjtcblx0ICAgICAgICAgICAgdGhpcy5jYW5jZWxGbiA9IGNhbmNlbEZuO1xuXHQgICAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIGlzIG5vdCBkZWZpbmVkJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXHQgICAgICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblx0ICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiBvcHRpb25zIHNob3VsZCBoYXZlIGludGVyZmFjZVxuXHQgICAgICAgICAgICBpZiAodHlwZSA9PT0gZXZlbnRUYXNrICYmIG9wdGlvbnMgJiYgb3B0aW9ucy51c2VHKSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IFpvbmVUYXNrLmludm9rZVRhc2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gWm9uZVRhc2suaW52b2tlVGFzay5jYWxsKGdsb2JhbCwgc2VsZiwgdGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgc3RhdGljIGludm9rZVRhc2sodGFzaywgdGFyZ2V0LCBhcmdzKSB7XG5cdCAgICAgICAgICAgIGlmICghdGFzaykge1xuXHQgICAgICAgICAgICAgICAgdGFzayA9IHRoaXM7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcysrO1xuXHQgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgdGFzay5ydW5Db3VudCsrO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIHRhcmdldCwgYXJncyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZmluYWxseSB7XG5cdCAgICAgICAgICAgICAgICBpZiAoX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9PSAxKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcy0tO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGdldCB6b25lKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZ2V0IHN0YXRlKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNhbmNlbFNjaGVkdWxlUmVxdWVzdCgpIHtcblx0ICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgc2NoZWR1bGluZyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIF90cmFuc2l0aW9uVG8odG9TdGF0ZSwgZnJvbVN0YXRlMSwgZnJvbVN0YXRlMikge1xuXHQgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09IGZyb21TdGF0ZTEgfHwgdGhpcy5fc3RhdGUgPT09IGZyb21TdGF0ZTIpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gdG9TdGF0ZTtcblx0ICAgICAgICAgICAgICAgIGlmICh0b1N0YXRlID09IG5vdFNjaGVkdWxlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZXMgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMudHlwZX0gJyR7dGhpcy5zb3VyY2V9JzogY2FuIG5vdCB0cmFuc2l0aW9uIHRvICcke3RvU3RhdGV9JywgZXhwZWN0aW5nIHN0YXRlICcke2Zyb21TdGF0ZTF9JyR7ZnJvbVN0YXRlMiA/IFwiIG9yICdcIiArIGZyb21TdGF0ZTIgKyBcIidcIiA6ICcnfSwgd2FzICcke3RoaXMuX3N0YXRlfScuYCk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgdG9TdHJpbmcoKSB7XG5cdCAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdHlwZW9mIHRoaXMuZGF0YS5oYW5kbGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuaGFuZGxlSWQudG9TdHJpbmcoKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gYWRkIHRvSlNPTiBtZXRob2QgdG8gcHJldmVudCBjeWNsaWMgZXJyb3Igd2hlblxuXHQgICAgICAgIC8vIGNhbGwgSlNPTi5zdHJpbmdpZnkoem9uZVRhc2spXG5cdCAgICAgICAgdG9KU09OKCkge1xuXHQgICAgICAgICAgICByZXR1cm4ge1xuXHQgICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuXHQgICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG5cdCAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLFxuXHQgICAgICAgICAgICAgICAgem9uZTogdGhpcy56b25lLm5hbWUsXG5cdCAgICAgICAgICAgICAgICBydW5Db3VudDogdGhpcy5ydW5Db3VudCxcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vICBNSUNST1RBU0sgUVVFVUVcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICBjb25zdCBzeW1ib2xTZXRUaW1lb3V0ID0gX19zeW1ib2xfXygnc2V0VGltZW91dCcpO1xuXHQgICAgY29uc3Qgc3ltYm9sUHJvbWlzZSA9IF9fc3ltYm9sX18oJ1Byb21pc2UnKTtcblx0ICAgIGNvbnN0IHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG5cdCAgICBsZXQgX21pY3JvVGFza1F1ZXVlID0gW107XG5cdCAgICBsZXQgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IGZhbHNlO1xuXHQgICAgbGV0IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZTtcblx0ICAgIGZ1bmN0aW9uIG5hdGl2ZVNjaGVkdWxlTWljcm9UYXNrKGZ1bmMpIHtcblx0ICAgICAgICBpZiAoIW5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICBpZiAoZ2xvYmFsW3N5bWJvbFByb21pc2VdKSB7XG5cdCAgICAgICAgICAgICAgICBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UgPSBnbG9iYWxbc3ltYm9sUHJvbWlzZV0ucmVzb2x2ZSgwKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlKSB7XG5cdCAgICAgICAgICAgIGxldCBuYXRpdmVUaGVuID0gbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlW3N5bWJvbFRoZW5dO1xuXHQgICAgICAgICAgICBpZiAoIW5hdGl2ZVRoZW4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBQcm9taXNlIGlzIG5vdCBwYXRjaGFibGUsIHdlIG5lZWQgdG8gdXNlIGB0aGVuYCBkaXJlY3RseVxuXHQgICAgICAgICAgICAgICAgLy8gaXNzdWUgMTA3OFxuXHQgICAgICAgICAgICAgICAgbmF0aXZlVGhlbiA9IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZVsndGhlbiddO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIG5hdGl2ZVRoZW4uY2FsbChuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UsIGZ1bmMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgZ2xvYmFsW3N5bWJvbFNldFRpbWVvdXRdKGZ1bmMsIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIGZ1bmN0aW9uIHNjaGVkdWxlTWljcm9UYXNrKHRhc2spIHtcblx0ICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gYW55IHRhc2ssIGFuZCB0aGVyZSBoYXMgbm90IGJlZW4gYW55dGhpbmcgc2NoZWR1bGVkXG5cdCAgICAgICAgLy8gd2UgbXVzdCBib290c3RyYXAgdGhlIGluaXRpYWwgdGFzayBjcmVhdGlvbiBieSBtYW51YWxseSBzY2hlZHVsaW5nIHRoZSBkcmFpblxuXHQgICAgICAgIGlmIChfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzID09PSAwICYmIF9taWNyb1Rhc2tRdWV1ZS5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICAgICAgLy8gV2UgYXJlIG5vdCBydW5uaW5nIGluIFRhc2ssIHNvIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBtaWNyb3Rhc2sgcXVldWUuXG5cdCAgICAgICAgICAgIG5hdGl2ZVNjaGVkdWxlTWljcm9UYXNrKGRyYWluTWljcm9UYXNrUXVldWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0YXNrICYmIF9taWNyb1Rhc2tRdWV1ZS5wdXNoKHRhc2spO1xuXHQgICAgfVxuXHQgICAgZnVuY3Rpb24gZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpIHtcblx0ICAgICAgICBpZiAoIV9pc0RyYWluaW5nTWljcm90YXNrUXVldWUpIHtcblx0ICAgICAgICAgICAgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IHRydWU7XG5cdCAgICAgICAgICAgIHdoaWxlIChfbWljcm9UYXNrUXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IF9taWNyb1Rhc2tRdWV1ZTtcblx0ICAgICAgICAgICAgICAgIF9taWNyb1Rhc2tRdWV1ZSA9IFtdO1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBxdWV1ZVtpXTtcblx0ICAgICAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUucnVuVGFzayh0YXNrLCBudWxsLCBudWxsKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIF9hcGkub25VbmhhbmRsZWRFcnJvcihlcnJvcik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIF9hcGkubWljcm90YXNrRHJhaW5Eb25lKCk7XG5cdCAgICAgICAgICAgIF9pc0RyYWluaW5nTWljcm90YXNrUXVldWUgPSBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vICBCT09UU1RSQVBcblx0ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdCAgICBjb25zdCBOT19aT05FID0geyBuYW1lOiAnTk8gWk9ORScgfTtcblx0ICAgIGNvbnN0IG5vdFNjaGVkdWxlZCA9ICdub3RTY2hlZHVsZWQnLCBzY2hlZHVsaW5nID0gJ3NjaGVkdWxpbmcnLCBzY2hlZHVsZWQgPSAnc2NoZWR1bGVkJywgcnVubmluZyA9ICdydW5uaW5nJywgY2FuY2VsaW5nID0gJ2NhbmNlbGluZycsIHVua25vd24gPSAndW5rbm93bic7XG5cdCAgICBjb25zdCBtaWNyb1Rhc2sgPSAnbWljcm9UYXNrJywgbWFjcm9UYXNrID0gJ21hY3JvVGFzaycsIGV2ZW50VGFzayA9ICdldmVudFRhc2snO1xuXHQgICAgY29uc3QgcGF0Y2hlcyA9IHt9O1xuXHQgICAgY29uc3QgX2FwaSA9IHtcblx0ICAgICAgICBzeW1ib2w6IF9fc3ltYm9sX18sXG5cdCAgICAgICAgY3VycmVudFpvbmVGcmFtZTogKCkgPT4gX2N1cnJlbnRab25lRnJhbWUsXG5cdCAgICAgICAgb25VbmhhbmRsZWRFcnJvcjogbm9vcCxcblx0ICAgICAgICBtaWNyb3Rhc2tEcmFpbkRvbmU6IG5vb3AsXG5cdCAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2s6IHNjaGVkdWxlTWljcm9UYXNrLFxuXHQgICAgICAgIHNob3dVbmNhdWdodEVycm9yOiAoKSA9PiAhWm9uZUltcGxbX19zeW1ib2xfXygnaWdub3JlQ29uc29sZUVycm9yVW5jYXVnaHRFcnJvcicpXSxcblx0ICAgICAgICBwYXRjaEV2ZW50VGFyZ2V0OiAoKSA9PiBbXSxcblx0ICAgICAgICBwYXRjaE9uUHJvcGVydGllczogbm9vcCxcblx0ICAgICAgICBwYXRjaE1ldGhvZDogKCkgPT4gbm9vcCxcblx0ICAgICAgICBiaW5kQXJndW1lbnRzOiAoKSA9PiBbXSxcblx0ICAgICAgICBwYXRjaFRoZW46ICgpID0+IG5vb3AsXG5cdCAgICAgICAgcGF0Y2hNYWNyb1Rhc2s6ICgpID0+IG5vb3AsXG5cdCAgICAgICAgcGF0Y2hFdmVudFByb3RvdHlwZTogKCkgPT4gbm9vcCxcblx0ICAgICAgICBpc0lFT3JFZGdlOiAoKSA9PiBmYWxzZSxcblx0ICAgICAgICBnZXRHbG9iYWxPYmplY3RzOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHk6ICgpID0+IG5vb3AsXG5cdCAgICAgICAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgT2JqZWN0Q3JlYXRlOiAoKSA9PiB1bmRlZmluZWQsXG5cdCAgICAgICAgQXJyYXlTbGljZTogKCkgPT4gW10sXG5cdCAgICAgICAgcGF0Y2hDbGFzczogKCkgPT4gbm9vcCxcblx0ICAgICAgICB3cmFwV2l0aEN1cnJlbnRab25lOiAoKSA9PiBub29wLFxuXHQgICAgICAgIGZpbHRlclByb3BlcnRpZXM6ICgpID0+IFtdLFxuXHQgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZDogKCkgPT4gbm9vcCxcblx0ICAgICAgICBfcmVkZWZpbmVQcm9wZXJ0eTogKCkgPT4gbm9vcCxcblx0ICAgICAgICBwYXRjaENhbGxiYWNrczogKCkgPT4gbm9vcCxcblx0ICAgICAgICBuYXRpdmVTY2hlZHVsZU1pY3JvVGFzazogbmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2ssXG5cdCAgICB9O1xuXHQgICAgbGV0IF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IG51bGwsIHpvbmU6IG5ldyBab25lSW1wbChudWxsLCBudWxsKSB9O1xuXHQgICAgbGV0IF9jdXJyZW50VGFzayA9IG51bGw7XG5cdCAgICBsZXQgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9IDA7XG5cdCAgICBmdW5jdGlvbiBub29wKCkgeyB9XG5cdCAgICBwZXJmb3JtYW5jZU1lYXN1cmUoJ1pvbmUnLCAnWm9uZScpO1xuXHQgICAgcmV0dXJuIFpvbmVJbXBsO1xuXHR9XG5cblx0ZnVuY3Rpb24gbG9hZFpvbmUoKSB7XG5cdCAgICAvLyBpZiBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cyAobWF5YmUgem9uZS5qcyB3YXMgYWxyZWFkeSBsb2FkZWQgb3Jcblx0ICAgIC8vIHNvbWUgb3RoZXIgbGliIGFsc28gcmVnaXN0ZXJlZCBhIGdsb2JhbCBvYmplY3QgbmFtZWQgWm9uZSksIHdlIG1heSBuZWVkXG5cdCAgICAvLyB0byB0aHJvdyBhbiBlcnJvciwgYnV0IHNvbWV0aW1lcyB1c2VyIG1heSBub3Qgd2FudCB0aGlzIGVycm9yLlxuXHQgICAgLy8gRm9yIGV4YW1wbGUsXG5cdCAgICAvLyB3ZSBoYXZlIHR3byB3ZWIgcGFnZXMsIHBhZ2UxIGluY2x1ZGVzIHpvbmUuanMsIHBhZ2UyIGRvZXNuJ3QuXG5cdCAgICAvLyBhbmQgdGhlIDFzdCB0aW1lIHVzZXIgbG9hZCBwYWdlMSBhbmQgcGFnZTIsIGV2ZXJ5dGhpbmcgd29yayBmaW5lLFxuXHQgICAgLy8gYnV0IHdoZW4gdXNlciBsb2FkIHBhZ2UyIGFnYWluLCBlcnJvciBvY2N1cnMgYmVjYXVzZSBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cy5cblx0ICAgIC8vIHNvIHdlIGFkZCBhIGZsYWcgdG8gbGV0IHVzZXIgY2hvb3NlIHdoZXRoZXIgdG8gdGhyb3cgdGhpcyBlcnJvciBvciBub3QuXG5cdCAgICAvLyBCeSBkZWZhdWx0LCBpZiBleGlzdGluZyBab25lIGlzIGZyb20gem9uZS5qcywgd2Ugd2lsbCBub3QgdGhyb3cgdGhlIGVycm9yLlxuXHQgICAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcztcblx0ICAgIGNvbnN0IGNoZWNrRHVwbGljYXRlID0gZ2xvYmFsW19fc3ltYm9sX18oJ2ZvcmNlRHVwbGljYXRlWm9uZUNoZWNrJyldID09PSB0cnVlO1xuXHQgICAgaWYgKGdsb2JhbFsnWm9uZSddICYmIChjaGVja0R1cGxpY2F0ZSB8fCB0eXBlb2YgZ2xvYmFsWydab25lJ10uX19zeW1ib2xfXyAhPT0gJ2Z1bmN0aW9uJykpIHtcblx0ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pvbmUgYWxyZWFkeSBsb2FkZWQuJyk7XG5cdCAgICB9XG5cdCAgICAvLyBJbml0aWFsaXplIGdsb2JhbCBgWm9uZWAgY29uc3RhbnQuXG5cdCAgICBnbG9iYWxbJ1pvbmUnXSA/Pz0gaW5pdFpvbmUoKTtcblx0ICAgIHJldHVybiBnbG9iYWxbJ1pvbmUnXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdXBwcmVzcyBjbG9zdXJlIGNvbXBpbGVyIGVycm9ycyBhYm91dCB1bmtub3duICdab25lJyB2YXJpYWJsZVxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFycyxnbG9iYWxUaGlzLG1pc3NpbmdSZXF1aXJlfVxuXHQgKi9cblx0Ly8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIvPlxuXHQvLyBpc3N1ZSAjOTg5LCB0byByZWR1Y2UgYnVuZGxlIHNpemUsIHVzZSBzaG9ydCBuYW1lXG5cdC8qKiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICovXG5cdGNvbnN0IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdC8qKiBPYmplY3QuZGVmaW5lUHJvcGVydHkgKi9cblx0Y29uc3QgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdC8qKiBPYmplY3QuZ2V0UHJvdG90eXBlT2YgKi9cblx0Y29uc3QgT2JqZWN0R2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cdC8qKiBPYmplY3QuY3JlYXRlICovXG5cdGNvbnN0IE9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG5cdC8qKiBBcnJheS5wcm90b3R5cGUuc2xpY2UgKi9cblx0Y29uc3QgQXJyYXlTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblx0LyoqIGFkZEV2ZW50TGlzdGVuZXIgc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IEFERF9FVkVOVF9MSVNURU5FUl9TVFIgPSAnYWRkRXZlbnRMaXN0ZW5lcic7XG5cdC8qKiByZW1vdmVFdmVudExpc3RlbmVyIHN0cmluZyBjb25zdCAqL1xuXHRjb25zdCBSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInO1xuXHQvKiogem9uZVN5bWJvbCBhZGRFdmVudExpc3RlbmVyICovXG5cdGNvbnN0IFpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiA9IF9fc3ltYm9sX18oQUREX0VWRU5UX0xJU1RFTkVSX1NUUik7XG5cdC8qKiB6b25lU3ltYm9sIHJlbW92ZUV2ZW50TGlzdGVuZXIgKi9cblx0Y29uc3QgWk9ORV9TWU1CT0xfUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gX19zeW1ib2xfXyhSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSKTtcblx0LyoqIHRydWUgc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IFRSVUVfU1RSID0gJ3RydWUnO1xuXHQvKiogZmFsc2Ugc3RyaW5nIGNvbnN0ICovXG5cdGNvbnN0IEZBTFNFX1NUUiA9ICdmYWxzZSc7XG5cdC8qKiBab25lIHN5bWJvbCBwcmVmaXggc3RyaW5nIGNvbnN0LiAqL1xuXHRjb25zdCBaT05FX1NZTUJPTF9QUkVGSVggPSBfX3N5bWJvbF9fKCcnKTtcblx0ZnVuY3Rpb24gd3JhcFdpdGhDdXJyZW50Wm9uZShjYWxsYmFjaywgc291cmNlKSB7XG5cdCAgICByZXR1cm4gWm9uZS5jdXJyZW50LndyYXAoY2FsbGJhY2ssIHNvdXJjZSk7XG5cdH1cblx0ZnVuY3Rpb24gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkge1xuXHQgICAgcmV0dXJuIFpvbmUuY3VycmVudC5zY2hlZHVsZU1hY3JvVGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKTtcblx0fVxuXHRjb25zdCB6b25lU3ltYm9sID0gX19zeW1ib2xfXztcblx0Y29uc3QgaXNXaW5kb3dFeGlzdHMgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcblx0Y29uc3QgaW50ZXJuYWxXaW5kb3cgPSBpc1dpbmRvd0V4aXN0cyA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcblx0Y29uc3QgX2dsb2JhbCA9IChpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvdykgfHwgZ2xvYmFsVGhpcztcblx0Y29uc3QgUkVNT1ZFX0FUVFJJQlVURSA9ICdyZW1vdmVBdHRyaWJ1dGUnO1xuXHRmdW5jdGlvbiBiaW5kQXJndW1lbnRzKGFyZ3MsIHNvdXJjZSkge1xuXHQgICAgZm9yIChsZXQgaSA9IGFyZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0ICAgICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgYXJnc1tpXSA9IHdyYXBXaXRoQ3VycmVudFpvbmUoYXJnc1tpXSwgc291cmNlICsgJ18nICsgaSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHQgICAgcmV0dXJuIGFyZ3M7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hQcm90b3R5cGUocHJvdG90eXBlLCBmbk5hbWVzKSB7XG5cdCAgICBjb25zdCBzb3VyY2UgPSBwcm90b3R5cGUuY29uc3RydWN0b3JbJ25hbWUnXTtcblx0ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm5OYW1lcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgIGNvbnN0IG5hbWUgPSBmbk5hbWVzW2ldO1xuXHQgICAgICAgIGNvbnN0IGRlbGVnYXRlID0gcHJvdG90eXBlW25hbWVdO1xuXHQgICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICBjb25zdCBwcm90b3R5cGVEZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgbmFtZSk7XG5cdCAgICAgICAgICAgIGlmICghaXNQcm9wZXJ0eVdyaXRhYmxlKHByb3RvdHlwZURlc2MpKSB7XG5cdCAgICAgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBwcm90b3R5cGVbbmFtZV0gPSAoKGRlbGVnYXRlKSA9PiB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwYXRjaGVkID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5hcHBseSh0aGlzLCBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgc291cmNlICsgJy4nICsgbmFtZSkpO1xuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwYXRjaGVkLCBkZWxlZ2F0ZSk7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hlZDtcblx0ICAgICAgICAgICAgfSkoZGVsZWdhdGUpO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0fVxuXHRmdW5jdGlvbiBpc1Byb3BlcnR5V3JpdGFibGUocHJvcGVydHlEZXNjKSB7XG5cdCAgICBpZiAoIXByb3BlcnR5RGVzYykge1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfVxuXHQgICAgaWYgKHByb3BlcnR5RGVzYy53cml0YWJsZSA9PT0gZmFsc2UpIHtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgICByZXR1cm4gISh0eXBlb2YgcHJvcGVydHlEZXNjLmdldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcHJvcGVydHlEZXNjLnNldCA9PT0gJ3VuZGVmaW5lZCcpO1xuXHR9XG5cdGNvbnN0IGlzV2ViV29ya2VyID0gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7XG5cdC8vIE1ha2Ugc3VyZSB0byBhY2Nlc3MgYHByb2Nlc3NgIHRocm91Z2ggYF9nbG9iYWxgIHNvIHRoYXQgV2ViUGFjayBkb2VzIG5vdCBhY2NpZGVudGFsbHkgYnJvd3NlcmlmeVxuXHQvLyB0aGlzIGNvZGUuXG5cdGNvbnN0IGlzTm9kZSA9ICEoJ253JyBpbiBfZ2xvYmFsKSAmJlxuXHQgICAgdHlwZW9mIF9nbG9iYWwucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcblx0ICAgIF9nbG9iYWwucHJvY2Vzcy50b1N0cmluZygpID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG5cdGNvbnN0IGlzQnJvd3NlciA9ICFpc05vZGUgJiYgIWlzV2ViV29ya2VyICYmICEhKGlzV2luZG93RXhpc3RzICYmIGludGVybmFsV2luZG93WydIVE1MRWxlbWVudCddKTtcblx0Ly8gd2UgYXJlIGluIGVsZWN0cm9uIG9mIG53LCBzbyB3ZSBhcmUgYm90aCBicm93c2VyIGFuZCBub2RlanNcblx0Ly8gTWFrZSBzdXJlIHRvIGFjY2VzcyBgcHJvY2Vzc2AgdGhyb3VnaCBgX2dsb2JhbGAgc28gdGhhdCBXZWJQYWNrIGRvZXMgbm90IGFjY2lkZW50YWxseSBicm93c2VyaWZ5XG5cdC8vIHRoaXMgY29kZS5cblx0Y29uc3QgaXNNaXggPSB0eXBlb2YgX2dsb2JhbC5wcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJlxuXHQgICAgX2dsb2JhbC5wcm9jZXNzLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJyAmJlxuXHQgICAgIWlzV2ViV29ya2VyICYmXG5cdCAgICAhIShpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvd1snSFRNTEVsZW1lbnQnXSk7XG5cdGNvbnN0IHpvbmVTeW1ib2xFdmVudE5hbWVzJDEgPSB7fTtcblx0Y29uc3QgZW5hYmxlQmVmb3JldW5sb2FkU3ltYm9sID0gem9uZVN5bWJvbCgnZW5hYmxlX2JlZm9yZXVubG9hZCcpO1xuXHRjb25zdCB3cmFwRm4gPSBmdW5jdGlvbiAoZXZlbnQpIHtcblx0ICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzkxMSwgaW4gSUUsIHNvbWV0aW1lc1xuXHQgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuXHQgICAgZXZlbnQgPSBldmVudCB8fCBfZ2xvYmFsLmV2ZW50O1xuXHQgICAgaWYgKCFldmVudCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGxldCBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdO1xuXHQgICAgaWYgKCFldmVudE5hbWVTeW1ib2wpIHtcblx0ICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnQudHlwZSk7XG5cdCAgICB9XG5cdCAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsO1xuXHQgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcblx0ICAgIGxldCByZXN1bHQ7XG5cdCAgICBpZiAoaXNCcm93c2VyICYmIHRhcmdldCA9PT0gaW50ZXJuYWxXaW5kb3cgJiYgZXZlbnQudHlwZSA9PT0gJ2Vycm9yJykge1xuXHQgICAgICAgIC8vIHdpbmRvdy5vbmVycm9yIGhhdmUgZGlmZmVyZW50IHNpZ25hdHVyZVxuXHQgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HbG9iYWxFdmVudEhhbmRsZXJzL29uZXJyb3Ijd2luZG93Lm9uZXJyb3Jcblx0ICAgICAgICAvLyBhbmQgb25lcnJvciBjYWxsYmFjayB3aWxsIHByZXZlbnQgZGVmYXVsdCB3aGVuIGNhbGxiYWNrIHJldHVybiB0cnVlXG5cdCAgICAgICAgY29uc3QgZXJyb3JFdmVudCA9IGV2ZW50O1xuXHQgICAgICAgIHJlc3VsdCA9XG5cdCAgICAgICAgICAgIGxpc3RlbmVyICYmXG5cdCAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGVycm9yRXZlbnQubWVzc2FnZSwgZXJyb3JFdmVudC5maWxlbmFtZSwgZXJyb3JFdmVudC5saW5lbm8sIGVycm9yRXZlbnQuY29sbm8sIGVycm9yRXZlbnQuZXJyb3IpO1xuXHQgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcblx0ICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICByZXN1bHQgPSBsaXN0ZW5lciAmJiBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIGlmIChcblx0ICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80NzU3OVxuXHQgICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwNTI1L2hpc3RvcnkuaHRtbCNiZWZvcmV1bmxvYWRldmVudFxuXHQgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3BlY2lmaWMgY2FzZSB3ZSBzaG91bGQgY2hlY2sgZm9yLiBUaGUgc3BlYyBkZWZpbmVzIHRoYXQgdGhlXG5cdCAgICAgICAgLy8gYHJldHVyblZhbHVlYCBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgbWVzc2FnZSB0byBzaG93IHRoZSB1c2VyLiBXaGVuIHRoZSBldmVudFxuXHQgICAgICAgIC8vIGlzIGNyZWF0ZWQsIHRoaXMgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcuXG5cdCAgICAgICAgZXZlbnQudHlwZSA9PT0gJ2JlZm9yZXVubG9hZCcgJiZcblx0ICAgICAgICAgICAgLy8gVG8gcHJldmVudCBhbnkgYnJlYWtpbmcgY2hhbmdlcyByZXN1bHRpbmcgZnJvbSB0aGlzIGNoYW5nZSwgZ2l2ZW4gdGhhdFxuXHQgICAgICAgICAgICAvLyBpdCB3YXMgYWxyZWFkeSBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGZhaWx1cmVzIGluIEczLCB3ZSBoYXZlIGhpZGRlblxuXHQgICAgICAgICAgICAvLyB0aGF0IGJlaGF2aW9yIGJlaGluZCBhIGdsb2JhbCBjb25maWd1cmF0aW9uIGZsYWcuIENvbnN1bWVycyBjYW4gZW5hYmxlIHRoaXNcblx0ICAgICAgICAgICAgLy8gZmxhZyBleHBsaWNpdGx5IGlmIHRoZXkgd2FudCB0aGUgYGJlZm9yZXVubG9hZGAgZXZlbnQgdG8gYmUgaGFuZGxlZCBhcyBkZWZpbmVkXG5cdCAgICAgICAgICAgIC8vIGluIHRoZSBzcGVjaWZpY2F0aW9uLlxuXHQgICAgICAgICAgICBfZ2xvYmFsW2VuYWJsZUJlZm9yZXVubG9hZFN5bWJvbF0gJiZcblx0ICAgICAgICAgICAgLy8gVGhlIElETCBldmVudCBkZWZpbml0aW9uIGlzIGBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJldHVyblZhbHVlYCwgc28gd2UgY2hlY2sgd2hldGhlclxuXHQgICAgICAgICAgICAvLyBgdHlwZW9mIHJlc3VsdGAgaXMgYSBzdHJpbmcuXG5cdCAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG5cdCAgICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gcmVzdWx0O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkICYmICFyZXN1bHQpIHtcblx0ICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gcmVzdWx0O1xuXHR9O1xuXHRmdW5jdGlvbiBwYXRjaFByb3BlcnR5KG9iaiwgcHJvcCwgcHJvdG90eXBlKSB7XG5cdCAgICBsZXQgZGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuXHQgICAgaWYgKCFkZXNjICYmIHByb3RvdHlwZSkge1xuXHQgICAgICAgIC8vIHdoZW4gcGF0Y2ggd2luZG93IG9iamVjdCwgdXNlIHByb3RvdHlwZSB0byBjaGVjayBwcm9wIGV4aXN0IG9yIG5vdFxuXHQgICAgICAgIGNvbnN0IHByb3RvdHlwZURlc2MgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBwcm9wKTtcblx0ICAgICAgICBpZiAocHJvdG90eXBlRGVzYykge1xuXHQgICAgICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLyBpZiB0aGUgZGVzY3JpcHRvciBub3QgZXhpc3RzIG9yIGlzIG5vdCBjb25maWd1cmFibGVcblx0ICAgIC8vIGp1c3QgcmV0dXJuXG5cdCAgICBpZiAoIWRlc2MgfHwgIWRlc2MuY29uZmlndXJhYmxlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3Qgb25Qcm9wUGF0Y2hlZFN5bWJvbCA9IHpvbmVTeW1ib2woJ29uJyArIHByb3AgKyAncGF0Y2hlZCcpO1xuXHQgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShvblByb3BQYXRjaGVkU3ltYm9sKSAmJiBvYmpbb25Qcm9wUGF0Y2hlZFN5bWJvbF0pIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICAvLyBBIHByb3BlcnR5IGRlc2NyaXB0b3IgY2Fubm90IGhhdmUgZ2V0dGVyL3NldHRlciBhbmQgYmUgd3JpdGFibGVcblx0ICAgIC8vIGRlbGV0aW5nIHRoZSB3cml0YWJsZSBhbmQgdmFsdWUgcHJvcGVydGllcyBhdm9pZHMgdGhpcyBlcnJvcjpcblx0ICAgIC8vXG5cdCAgICAvLyBUeXBlRXJyb3I6IHByb3BlcnR5IGRlc2NyaXB0b3JzIG11c3Qgbm90IHNwZWNpZnkgYSB2YWx1ZSBvciBiZSB3cml0YWJsZSB3aGVuIGFcblx0ICAgIC8vIGdldHRlciBvciBzZXR0ZXIgaGFzIGJlZW4gc3BlY2lmaWVkXG5cdCAgICBkZWxldGUgZGVzYy53cml0YWJsZTtcblx0ICAgIGRlbGV0ZSBkZXNjLnZhbHVlO1xuXHQgICAgY29uc3Qgb3JpZ2luYWxEZXNjR2V0ID0gZGVzYy5nZXQ7XG5cdCAgICBjb25zdCBvcmlnaW5hbERlc2NTZXQgPSBkZXNjLnNldDtcblx0ICAgIC8vIHNsaWNlKDIpIGN1eiAnb25jbGljaycgLT4gJ2NsaWNrJywgZXRjXG5cdCAgICBjb25zdCBldmVudE5hbWUgPSBwcm9wLnNsaWNlKDIpO1xuXHQgICAgbGV0IGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTtcblx0ICAgIGlmICghZXZlbnROYW1lU3ltYm9sKSB7XG5cdCAgICAgICAgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdID0gem9uZVN5bWJvbCgnT05fUFJPUEVSVFknICsgZXZlbnROYW1lKTtcblx0ICAgIH1cblx0ICAgIGRlc2Muc2V0ID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7XG5cdCAgICAgICAgLy8gSW4gc29tZSB2ZXJzaW9ucyBvZiBXaW5kb3dzLCB0aGUgYHRoaXNgIGNvbnRleHQgbWF5IGJlIHVuZGVmaW5lZFxuXHQgICAgICAgIC8vIGluIG9uLXByb3BlcnR5IGNhbGxiYWNrcy5cblx0ICAgICAgICAvLyBUbyBoYW5kbGUgdGhpcyBlZGdlIGNhc2UsIHdlIGNoZWNrIGlmIGB0aGlzYCBpcyBmYWxzeSBhbmRcblx0ICAgICAgICAvLyBmYWxsYmFjayB0byBgX2dsb2JhbGAgaWYgbmVlZGVkLlxuXHQgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzO1xuXHQgICAgICAgIGlmICghdGFyZ2V0ICYmIG9iaiA9PT0gX2dsb2JhbCkge1xuXHQgICAgICAgICAgICB0YXJnZXQgPSBfZ2xvYmFsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXRhcmdldCkge1xuXHQgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTtcblx0ICAgICAgICBpZiAodHlwZW9mIHByZXZpb3VzVmFsdWUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB3cmFwRm4pO1xuXHQgICAgICAgIH1cblx0ICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85Nzhcblx0ICAgICAgICAvLyBJZiBhbiBpbmxpbmUgaGFuZGxlciAobGlrZSBgb25sb2FkYCkgd2FzIGRlZmluZWQgYmVmb3JlIHpvbmUuanMgd2FzIGxvYWRlZCxcblx0ICAgICAgICAvLyBjYWxsIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yJ3Mgc2V0dGVyIHRvIGNsZWFuIGl0IHVwLlxuXHQgICAgICAgIG9yaWdpbmFsRGVzY1NldD8uY2FsbCh0YXJnZXQsIG51bGwpO1xuXHQgICAgICAgIHRhcmdldFtldmVudE5hbWVTeW1ib2xdID0gbmV3VmFsdWU7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHdyYXBGbiwgZmFsc2UpO1xuXHQgICAgICAgIH1cblx0ICAgIH07XG5cdCAgICAvLyBUaGUgZ2V0dGVyIHdvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIHVuYXNzaWduZWQgcHJvcGVydGllcyBidXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW5cblx0ICAgIC8vIHVuYXNzaWduZWQgcHJvcGVydHkgaXMgbnVsbFxuXHQgICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgLy8gaW4gc29tZSBvZiB3aW5kb3dzJ3Mgb25wcm9wZXJ0eSBjYWxsYmFjaywgdGhpcyBpcyB1bmRlZmluZWRcblx0ICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGl0XG5cdCAgICAgICAgbGV0IHRhcmdldCA9IHRoaXM7XG5cdCAgICAgICAgaWYgKCF0YXJnZXQgJiYgb2JqID09PSBfZ2xvYmFsKSB7XG5cdCAgICAgICAgICAgIHRhcmdldCA9IF9nbG9iYWw7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmICghdGFyZ2V0KSB7XG5cdCAgICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRhcmdldFtldmVudE5hbWVTeW1ib2xdO1xuXHQgICAgICAgIGlmIChsaXN0ZW5lcikge1xuXHQgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2UgaWYgKG9yaWdpbmFsRGVzY0dldCkge1xuXHQgICAgICAgICAgICAvLyByZXN1bHQgd2lsbCBiZSBudWxsIHdoZW4gdXNlIGlubGluZSBldmVudCBhdHRyaWJ1dGUsXG5cdCAgICAgICAgICAgIC8vIHN1Y2ggYXMgPGJ1dHRvbiBvbmNsaWNrPVwiZnVuYygpO1wiPk9LPC9idXR0b24+XG5cdCAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIG9uY2xpY2sgZnVuY3Rpb24gaXMgaW50ZXJuYWwgcmF3IHVuY29tcGlsZWQgaGFuZGxlclxuXHQgICAgICAgICAgICAvLyB0aGUgb25jbGljayB3aWxsIGJlIGV2YWx1YXRlZCB3aGVuIGZpcnN0IHRpbWUgZXZlbnQgd2FzIHRyaWdnZXJlZCBvclxuXHQgICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgYWNjZXNzZWQsIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzUyNVxuXHQgICAgICAgICAgICAvLyBzbyB3ZSBzaG91bGQgdXNlIG9yaWdpbmFsIG5hdGl2ZSBnZXQgdG8gcmV0cmlldmUgdGhlIGhhbmRsZXJcblx0ICAgICAgICAgICAgbGV0IHZhbHVlID0gb3JpZ2luYWxEZXNjR2V0LmNhbGwodGhpcyk7XG5cdCAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgZGVzYy5zZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtSRU1PVkVfQVRUUklCVVRFXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9O1xuXHQgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjKTtcblx0ICAgIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSA9IHRydWU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hPblByb3BlcnRpZXMob2JqLCBwcm9wZXJ0aWVzLCBwcm90b3R5cGUpIHtcblx0ICAgIGlmIChwcm9wZXJ0aWVzKSB7XG5cdCAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIHBhdGNoUHJvcGVydHkob2JqLCAnb24nICsgcHJvcGVydGllc1tpXSwgcHJvdG90eXBlKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBlbHNlIHtcblx0ICAgICAgICBjb25zdCBvblByb3BlcnRpZXMgPSBbXTtcblx0ICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKSB7XG5cdCAgICAgICAgICAgIGlmIChwcm9wLnNsaWNlKDAsIDIpID09ICdvbicpIHtcblx0ICAgICAgICAgICAgICAgIG9uUHJvcGVydGllcy5wdXNoKHByb3ApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb25Qcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7XG5cdCAgICAgICAgICAgIHBhdGNoUHJvcGVydHkob2JqLCBvblByb3BlcnRpZXNbal0sIHByb3RvdHlwZSk7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cdGNvbnN0IG9yaWdpbmFsSW5zdGFuY2VLZXkgPSB6b25lU3ltYm9sKCdvcmlnaW5hbEluc3RhbmNlJyk7XG5cdC8vIHdyYXAgc29tZSBuYXRpdmUgQVBJIG9uIGB3aW5kb3dgXG5cdGZ1bmN0aW9uIHBhdGNoQ2xhc3MoY2xhc3NOYW1lKSB7XG5cdCAgICBjb25zdCBPcmlnaW5hbENsYXNzID0gX2dsb2JhbFtjbGFzc05hbWVdO1xuXHQgICAgaWYgKCFPcmlnaW5hbENsYXNzKVxuXHQgICAgICAgIHJldHVybjtcblx0ICAgIC8vIGtlZXAgb3JpZ2luYWwgY2xhc3MgaW4gZ2xvYmFsXG5cdCAgICBfZ2xvYmFsW3pvbmVTeW1ib2woY2xhc3NOYW1lKV0gPSBPcmlnaW5hbENsYXNzO1xuXHQgICAgX2dsb2JhbFtjbGFzc05hbWVdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgIGNvbnN0IGEgPSBiaW5kQXJndW1lbnRzKGFyZ3VtZW50cywgY2xhc3NOYW1lKTtcblx0ICAgICAgICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgIGNhc2UgMDpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcygpO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgMTpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBjYXNlIDI6XG5cdCAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSwgYVsxXSk7XG5cdCAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgY2FzZSAzOlxuXHQgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0sIGFbMV0sIGFbMl0pO1xuXHQgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgIGNhc2UgNDpcblx0ICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcblx0ICAgICAgICAgICAgICAgIGJyZWFrO1xuXHQgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmcgbGlzdCB0b28gbG9uZy4nKTtcblx0ICAgICAgICB9XG5cdCAgICB9O1xuXHQgICAgLy8gYXR0YWNoIG9yaWdpbmFsIGRlbGVnYXRlIHRvIHBhdGNoZWQgZnVuY3Rpb25cblx0ICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChfZ2xvYmFsW2NsYXNzTmFtZV0sIE9yaWdpbmFsQ2xhc3MpO1xuXHQgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgT3JpZ2luYWxDbGFzcyhmdW5jdGlvbiAoKSB7IH0pO1xuXHQgICAgbGV0IHByb3A7XG5cdCAgICBmb3IgKHByb3AgaW4gaW5zdGFuY2UpIHtcblx0ICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQ3MjFcblx0ICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnWE1MSHR0cFJlcXVlc3QnICYmIHByb3AgPT09ICdyZXNwb25zZUJsb2InKVxuXHQgICAgICAgICAgICBjb250aW51ZTtcblx0ICAgICAgICAoZnVuY3Rpb24gKHByb3ApIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgX2dsb2JhbFtjbGFzc05hbWVdLnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXS5hcHBseSh0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KF9nbG9iYWxbY2xhc3NOYW1lXS5wcm90b3R5cGUsIHByb3AsIHtcblx0ICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChmbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdID0gd3JhcFdpdGhDdXJyZW50Wm9uZShmbiwgY2xhc3NOYW1lICsgJy4nICsgcHJvcCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGNhbGxiYWNrIGluIHdyYXBwZWQgZnVuY3Rpb24gc28gd2UgY2FuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgaXQgaW4gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nIHRvIHJldHVyblxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBvbmUuXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSwgZm4pO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXSA9IGZuO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF07XG5cdCAgICAgICAgICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfSkocHJvcCk7XG5cdCAgICB9XG5cdCAgICBmb3IgKHByb3AgaW4gT3JpZ2luYWxDbGFzcykge1xuXHQgICAgICAgIGlmIChwcm9wICE9PSAncHJvdG90eXBlJyAmJiBPcmlnaW5hbENsYXNzLmhhc093blByb3BlcnR5KHByb3ApKSB7XG5cdCAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXVtwcm9wXSA9IE9yaWdpbmFsQ2xhc3NbcHJvcF07XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHR9XG5cdGZ1bmN0aW9uIHBhdGNoTWV0aG9kKHRhcmdldCwgbmFtZSwgcGF0Y2hGbikge1xuXHQgICAgbGV0IHByb3RvID0gdGFyZ2V0O1xuXHQgICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuXHQgICAgICAgIHByb3RvID0gT2JqZWN0R2V0UHJvdG90eXBlT2YocHJvdG8pO1xuXHQgICAgfVxuXHQgICAgaWYgKCFwcm90byAmJiB0YXJnZXRbbmFtZV0pIHtcblx0ICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuXG5cdCAgICAgICAgcHJvdG8gPSB0YXJnZXQ7XG5cdCAgICB9XG5cdCAgICBjb25zdCBkZWxlZ2F0ZU5hbWUgPSB6b25lU3ltYm9sKG5hbWUpO1xuXHQgICAgbGV0IGRlbGVnYXRlID0gbnVsbDtcblx0ICAgIGlmIChwcm90byAmJiAoIShkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0pIHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eShkZWxlZ2F0ZU5hbWUpKSkge1xuXHQgICAgICAgIGRlbGVnYXRlID0gcHJvdG9bZGVsZWdhdGVOYW1lXSA9IHByb3RvW25hbWVdO1xuXHQgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgcHJvdG9bbmFtZV0gaXMgd3JpdGFibGVcblx0ICAgICAgICAvLyBzb21lIHByb3BlcnR5IGlzIHJlYWRvbmx5IGluIHNhZmFyaSwgc3VjaCBhcyBIdG1sQ2FudmFzRWxlbWVudC5wcm90b3R5cGUudG9CbG9iXG5cdCAgICAgICAgY29uc3QgZGVzYyA9IHByb3RvICYmIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgbmFtZSk7XG5cdCAgICAgICAgaWYgKGlzUHJvcGVydHlXcml0YWJsZShkZXNjKSkge1xuXHQgICAgICAgICAgICBjb25zdCBwYXRjaERlbGVnYXRlID0gcGF0Y2hGbihkZWxlZ2F0ZSwgZGVsZWdhdGVOYW1lLCBuYW1lKTtcblx0ICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hEZWxlZ2F0ZSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bbmFtZV0sIGRlbGVnYXRlKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gZGVsZWdhdGU7XG5cdH1cblx0Ly8gVE9ETzogQEppYUxpUGFzc2lvbiwgc3VwcG9ydCBjYW5jZWwgdGFzayBsYXRlciBpZiBuZWNlc3Nhcnlcblx0ZnVuY3Rpb24gcGF0Y2hNYWNyb1Rhc2sob2JqLCBmdW5jTmFtZSwgbWV0YUNyZWF0b3IpIHtcblx0ICAgIGxldCBzZXROYXRpdmUgPSBudWxsO1xuXHQgICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcblx0ICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuXHQgICAgICAgIGRhdGEuYXJnc1tkYXRhLmNiSWR4XSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgdGFzay5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHNldE5hdGl2ZS5hcHBseShkYXRhLnRhcmdldCwgZGF0YS5hcmdzKTtcblx0ICAgICAgICByZXR1cm4gdGFzaztcblx0ICAgIH1cblx0ICAgIHNldE5hdGl2ZSA9IHBhdGNoTWV0aG9kKG9iaiwgZnVuY05hbWUsIChkZWxlZ2F0ZSkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcblx0ICAgICAgICBjb25zdCBtZXRhID0gbWV0YUNyZWF0b3Ioc2VsZiwgYXJncyk7XG5cdCAgICAgICAgaWYgKG1ldGEuY2JJZHggPj0gMCAmJiB0eXBlb2YgYXJnc1ttZXRhLmNiSWR4XSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUobWV0YS5uYW1lLCBhcmdzW21ldGEuY2JJZHhdLCBtZXRhLCBzY2hlZHVsZVRhc2spO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS5cblx0ICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9XG5cdGZ1bmN0aW9uIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwYXRjaGVkLCBvcmlnaW5hbCkge1xuXHQgICAgcGF0Y2hlZFt6b25lU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyldID0gb3JpZ2luYWw7XG5cdH1cblx0bGV0IGlzRGV0ZWN0ZWRJRU9yRWRnZSA9IGZhbHNlO1xuXHRsZXQgaWVPckVkZ2UgPSBmYWxzZTtcblx0ZnVuY3Rpb24gaXNJRU9yRWRnZSgpIHtcblx0ICAgIGlmIChpc0RldGVjdGVkSUVPckVkZ2UpIHtcblx0ICAgICAgICByZXR1cm4gaWVPckVkZ2U7XG5cdCAgICB9XG5cdCAgICBpc0RldGVjdGVkSUVPckVkZ2UgPSB0cnVlO1xuXHQgICAgdHJ5IHtcblx0ICAgICAgICBjb25zdCB1YSA9IGludGVybmFsV2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG5cdCAgICAgICAgaWYgKHVhLmluZGV4T2YoJ01TSUUgJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0VkZ2UvJykgIT09IC0xKSB7XG5cdCAgICAgICAgICAgIGllT3JFZGdlID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBjYXRjaCAoZXJyb3IpIHsgfVxuXHQgICAgcmV0dXJuIGllT3JFZGdlO1xuXHR9XG5cdGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG5cdH1cblx0ZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcblx0ICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdC8vIGFuIGlkZW50aWZpZXIgdG8gdGVsbCBab25lVGFzayBkbyBub3QgY3JlYXRlIGEgbmV3IGludm9rZSBjbG9zdXJlXG5cdGNvbnN0IE9QVElNSVpFRF9aT05FX0VWRU5UX1RBU0tfREFUQSA9IHtcblx0ICAgIHVzZUc6IHRydWUsXG5cdH07XG5cdGNvbnN0IHpvbmVTeW1ib2xFdmVudE5hbWVzID0ge307XG5cdGNvbnN0IGdsb2JhbFNvdXJjZXMgPSB7fTtcblx0Y29uc3QgRVZFTlRfTkFNRV9TWU1CT0xfUkVHWCA9IG5ldyBSZWdFeHAoJ14nICsgWk9ORV9TWU1CT0xfUFJFRklYICsgJyhcXFxcdyspKHRydWV8ZmFsc2UpJCcpO1xuXHRjb25zdCBJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MID0gem9uZVN5bWJvbCgncHJvcGFnYXRpb25TdG9wcGVkJyk7XG5cdGZ1bmN0aW9uIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSwgZXZlbnROYW1lVG9TdHJpbmcpIHtcblx0ICAgIGNvbnN0IGZhbHNlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBGQUxTRV9TVFI7XG5cdCAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gKGV2ZW50TmFtZVRvU3RyaW5nID8gZXZlbnROYW1lVG9TdHJpbmcoZXZlbnROYW1lKSA6IGV2ZW50TmFtZSkgKyBUUlVFX1NUUjtcblx0ICAgIGNvbnN0IHN5bWJvbCA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIGZhbHNlRXZlbnROYW1lO1xuXHQgICAgY29uc3Qgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0ge307XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7XG5cdCAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hFdmVudFRhcmdldChfZ2xvYmFsLCBhcGksIGFwaXMsIHBhdGNoT3B0aW9ucykge1xuXHQgICAgY29uc3QgQUREX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuYWRkKSB8fCBBRERfRVZFTlRfTElTVEVORVJfU1RSO1xuXHQgICAgY29uc3QgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm0pIHx8IFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI7XG5cdCAgICBjb25zdCBMSVNURU5FUlNfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5saXN0ZW5lcnMpIHx8ICdldmVudExpc3RlbmVycyc7XG5cdCAgICBjb25zdCBSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUiA9IChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnJtQWxsKSB8fCAncmVtb3ZlQWxsTGlzdGVuZXJzJztcblx0ICAgIGNvbnN0IHpvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyID0gem9uZVN5bWJvbChBRERfRVZFTlRfTElTVEVORVIpO1xuXHQgICAgY29uc3QgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuJyArIEFERF9FVkVOVF9MSVNURU5FUiArICc6Jztcblx0ICAgIGNvbnN0IFBSRVBFTkRfRVZFTlRfTElTVEVORVIgPSAncHJlcGVuZExpc3RlbmVyJztcblx0ICAgIGNvbnN0IFBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFID0gJy4nICsgUFJFUEVORF9FVkVOVF9MSVNURU5FUiArICc6Jztcblx0ICAgIGNvbnN0IGludm9rZVRhc2sgPSBmdW5jdGlvbiAodGFzaywgdGFyZ2V0LCBldmVudCkge1xuXHQgICAgICAgIC8vIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UsIGNoZWNrIGlzUmVtb3ZlZCB3aGljaCBpcyBzZXRcblx0ICAgICAgICAvLyBieSByZW1vdmVFdmVudExpc3RlbmVyXG5cdCAgICAgICAgaWYgKHRhc2suaXNSZW1vdmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3QgZGVsZWdhdGUgPSB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgIGlmICh0eXBlb2YgZGVsZWdhdGUgPT09ICdvYmplY3QnICYmIGRlbGVnYXRlLmhhbmRsZUV2ZW50KSB7XG5cdCAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYmluZCB2ZXJzaW9uIG9mIGhhbmRsZUV2ZW50IHdoZW4gaW52b2tlXG5cdCAgICAgICAgICAgIHRhc2suY2FsbGJhY2sgPSAoZXZlbnQpID0+IGRlbGVnYXRlLmhhbmRsZUV2ZW50KGV2ZW50KTtcblx0ICAgICAgICAgICAgdGFzay5vcmlnaW5hbERlbGVnYXRlID0gZGVsZWdhdGU7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIGludm9rZSBzdGF0aWMgdGFzay5pbnZva2Vcblx0ICAgICAgICAvLyBuZWVkIHRvIHRyeS9jYXRjaCBlcnJvciBoZXJlLCBvdGhlcndpc2UsIHRoZSBlcnJvciBpbiBvbmUgZXZlbnQgbGlzdGVuZXJcblx0ICAgICAgICAvLyB3aWxsIGJyZWFrIHRoZSBleGVjdXRpb25zIG9mIHRoZSBvdGhlciBldmVudCBsaXN0ZW5lcnMuIEFsc28gZXJyb3Igd2lsbFxuXHQgICAgICAgIC8vIG5vdCByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHdoZW4gYG9uY2VgIG9wdGlvbnMgaXMgdHJ1ZS5cblx0ICAgICAgICBsZXQgZXJyb3I7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgdGFzay5pbnZva2UodGFzaywgdGFyZ2V0LCBbZXZlbnRdKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICBlcnJvciA9IGVycjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRhc2sub3B0aW9ucztcblx0ICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5vbmNlKSB7XG5cdCAgICAgICAgICAgIC8vIGlmIG9wdGlvbnMub25jZSBpcyB0cnVlLCBhZnRlciBpbnZva2Ugb25jZSByZW1vdmUgbGlzdGVuZXIgaGVyZVxuXHQgICAgICAgICAgICAvLyBvbmx5IGJyb3dzZXIgbmVlZCB0byBkbyB0aGlzLCBub2RlanMgZXZlbnRFbWl0dGVyIHdpbGwgY2FsIHJlbW92ZUxpc3RlbmVyXG5cdCAgICAgICAgICAgIC8vIGluc2lkZSBFdmVudEVtaXR0ZXIub25jZVxuXHQgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7XG5cdCAgICAgICAgICAgIHRhcmdldFtSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGFyZ2V0LCBldmVudC50eXBlLCBkZWxlZ2F0ZSwgb3B0aW9ucyk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBlcnJvcjtcblx0ICAgIH07XG5cdCAgICBmdW5jdGlvbiBnbG9iYWxDYWxsYmFjayhjb250ZXh0LCBldmVudCwgaXNDYXB0dXJlKSB7XG5cdCAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTExLCBpbiBJRSwgc29tZXRpbWVzXG5cdCAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudFxuXHQgICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgX2dsb2JhbC5ldmVudDtcblx0ICAgICAgICBpZiAoIWV2ZW50KSB7XG5cdCAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLy8gZXZlbnQudGFyZ2V0IGlzIG5lZWRlZCBmb3IgU2Ftc3VuZyBUViBhbmQgU291cmNlQnVmZmVyXG5cdCAgICAgICAgLy8gfHwgZ2xvYmFsIGlzIG5lZWRlZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy8xOTBcblx0ICAgICAgICBjb25zdCB0YXJnZXQgPSBjb250ZXh0IHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IHRhc2tzID0gdGFyZ2V0W3pvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50LnR5cGVdW2lzQ2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXV07XG5cdCAgICAgICAgaWYgKHRhc2tzKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXHQgICAgICAgICAgICAvLyBpbnZva2UgYWxsIHRhc2tzIHdoaWNoIGF0dGFjaGVkIHRvIGN1cnJlbnQgdGFyZ2V0IHdpdGggZ2l2ZW4gZXZlbnQudHlwZSBhbmQgY2FwdHVyZSA9IGZhbHNlXG5cdCAgICAgICAgICAgIC8vIGZvciBwZXJmb3JtYW5jZSBjb25jZXJuLCBpZiB0YXNrLmxlbmd0aCA9PT0gMSwganVzdCBpbnZva2Vcblx0ICAgICAgICAgICAgaWYgKHRhc2tzLmxlbmd0aCA9PT0gMSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gaW52b2tlVGFzayh0YXNrc1swXSwgdGFyZ2V0LCBldmVudCk7XG5cdCAgICAgICAgICAgICAgICBlcnIgJiYgZXJyb3JzLnB1c2goZXJyKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzgzNlxuXHQgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdGFza3MgYXJyYXkgYmVmb3JlIGludm9rZSwgdG8gYXZvaWRcblx0ICAgICAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayB3aWxsIHJlbW92ZSBpdHNlbGYgb3Igb3RoZXIgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGNvcHlUYXNrcyA9IHRhc2tzLnNsaWNlKCk7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvcHlUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudFtJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MXSA9PT0gdHJ1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gaW52b2tlVGFzayhjb3B5VGFza3NbaV0sIHRhcmdldCwgZXZlbnQpO1xuXHQgICAgICAgICAgICAgICAgICAgIGVyciAmJiBlcnJvcnMucHVzaChlcnIpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIC8vIFNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIGVycm9yLCB3ZSBkb24ndCBuZWVkIHRvIHNjaGVkdWxlIG1pY3JvVGFza1xuXHQgICAgICAgICAgICAvLyB0byB0aHJvdyB0aGUgZXJyb3IuXG5cdCAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAxKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcnNbMF07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yc1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICBhcGkubmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2soKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG5cdCAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICAvLyBnbG9iYWwgc2hhcmVkIHpvbmVBd2FyZUNhbGxiYWNrIHRvIGhhbmRsZSBhbGwgZXZlbnQgY2FsbGJhY2sgd2l0aCBjYXB0dXJlID0gZmFsc2Vcblx0ICAgIGNvbnN0IGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7XG5cdCAgICAgICAgcmV0dXJuIGdsb2JhbENhbGxiYWNrKHRoaXMsIGV2ZW50LCBmYWxzZSk7XG5cdCAgICB9O1xuXHQgICAgLy8gZ2xvYmFsIHNoYXJlZCB6b25lQXdhcmVDYWxsYmFjayB0byBoYW5kbGUgYWxsIGV2ZW50IGNhbGxiYWNrIHdpdGggY2FwdHVyZSA9IHRydWVcblx0ICAgIGNvbnN0IGdsb2JhbFpvbmVBd2FyZUNhcHR1cmVDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuXHQgICAgICAgIHJldHVybiBnbG9iYWxDYWxsYmFjayh0aGlzLCBldmVudCwgdHJ1ZSk7XG5cdCAgICB9O1xuXHQgICAgZnVuY3Rpb24gcGF0Y2hFdmVudFRhcmdldE1ldGhvZHMob2JqLCBwYXRjaE9wdGlvbnMpIHtcblx0ICAgICAgICBpZiAoIW9iaikge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGxldCB1c2VHbG9iYWxDYWxsYmFjayA9IHRydWU7XG5cdCAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudXNlRyAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHVzZUdsb2JhbENhbGxiYWNrID0gcGF0Y2hPcHRpb25zLnVzZUc7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IHZhbGlkYXRlSGFuZGxlciA9IHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudmg7XG5cdCAgICAgICAgbGV0IGNoZWNrRHVwbGljYXRlID0gdHJ1ZTtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5jaGtEdXAgIT09IHVuZGVmaW5lZCkge1xuXHQgICAgICAgICAgICBjaGVja0R1cGxpY2F0ZSA9IHBhdGNoT3B0aW9ucy5jaGtEdXA7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGxldCByZXR1cm5UYXJnZXQgPSBmYWxzZTtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ydCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgIHJldHVyblRhcmdldCA9IHBhdGNoT3B0aW9ucy5ydDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgbGV0IHByb3RvID0gb2JqO1xuXHQgICAgICAgIHdoaWxlIChwcm90byAmJiAhcHJvdG8uaGFzT3duUHJvcGVydHkoQUREX0VWRU5UX0xJU1RFTkVSKSkge1xuXHQgICAgICAgICAgICBwcm90byA9IE9iamVjdEdldFByb3RvdHlwZU9mKHByb3RvKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCFwcm90byAmJiBvYmpbQUREX0VWRU5UX0xJU1RFTkVSXSkge1xuXHQgICAgICAgICAgICAvLyBzb21laG93IHdlIGRpZCBub3QgZmluZCBpdCwgYnV0IHdlIGNhbiBzZWUgaXQuIFRoaXMgaGFwcGVucyBvbiBJRSBmb3IgV2luZG93IHByb3BlcnRpZXMuXG5cdCAgICAgICAgICAgIHByb3RvID0gb2JqO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoIXByb3RvKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHByb3RvW3pvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyXSkge1xuXHQgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IGV2ZW50TmFtZVRvU3RyaW5nID0gcGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ldmVudE5hbWVUb1N0cmluZztcblx0ICAgICAgICAvLyBXZSB1c2UgYSBzaGFyZWQgZ2xvYmFsIGB0YXNrRGF0YWAgdG8gcGFzcyBkYXRhIGZvciBgc2NoZWR1bGVFdmVudFRhc2tgLFxuXHQgICAgICAgIC8vIGVsaW1pbmF0aW5nIHRoZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgc29sZWx5IGZvciBwYXNzaW5nIGRhdGEuXG5cdCAgICAgICAgLy8gV0FSTklORzogVGhpcyBvYmplY3QgaGFzIGEgc3RhdGljIGxpZmV0aW1lLCBtZWFuaW5nIGl0IGlzIG5vdCBjcmVhdGVkXG5cdCAgICAgICAgLy8gZWFjaCB0aW1lIGBhZGRFdmVudExpc3RlbmVyYCBpcyBjYWxsZWQuIEl0IGlzIGluc3RhbnRpYXRlZCBvbmx5IG9uY2Vcblx0ICAgICAgICAvLyBhbmQgY2FwdHVyZWQgYnkgcmVmZXJlbmNlIGluc2lkZSB0aGUgYGFkZEV2ZW50TGlzdGVuZXJgIGFuZFxuXHQgICAgICAgIC8vIGByZW1vdmVFdmVudExpc3RlbmVyYCBmdW5jdGlvbnMuIERvIG5vdCBhZGQgYW55IG5ldyBwcm9wZXJ0aWVzIHRvIHRoaXNcblx0ICAgICAgICAvLyBvYmplY3QsIGFzIGRvaW5nIHNvIHdvdWxkIG5lY2Vzc2l0YXRlIG1haW50YWluaW5nIHRoZSBpbmZvcm1hdGlvblxuXHQgICAgICAgIC8vIGJldHdlZW4gYGFkZEV2ZW50TGlzdGVuZXJgIGNhbGxzLlxuXHQgICAgICAgIGNvbnN0IHRhc2tEYXRhID0ge307XG5cdCAgICAgICAgY29uc3QgbmF0aXZlQWRkRXZlbnRMaXN0ZW5lciA9IChwcm90b1t6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lcl0gPSBwcm90b1tBRERfRVZFTlRfTElTVEVORVJdKTtcblx0ICAgICAgICBjb25zdCBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyID0gKHByb3RvW3pvbmVTeW1ib2woUkVNT1ZFX0VWRU5UX0xJU1RFTkVSKV0gPVxuXHQgICAgICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdKTtcblx0ICAgICAgICBjb25zdCBuYXRpdmVMaXN0ZW5lcnMgPSAocHJvdG9bem9uZVN5bWJvbChMSVNURU5FUlNfRVZFTlRfTElTVEVORVIpXSA9XG5cdCAgICAgICAgICAgIHByb3RvW0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0pO1xuXHQgICAgICAgIGNvbnN0IG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyA9IChwcm90b1t6b25lU3ltYm9sKFJFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSKV0gPVxuXHQgICAgICAgICAgICBwcm90b1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0pO1xuXHQgICAgICAgIGxldCBuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lcjtcblx0ICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5wcmVwZW5kKSB7XG5cdCAgICAgICAgICAgIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyID0gcHJvdG9bem9uZVN5bWJvbChwYXRjaE9wdGlvbnMucHJlcGVuZCldID1cblx0ICAgICAgICAgICAgICAgIHByb3RvW3BhdGNoT3B0aW9ucy5wcmVwZW5kXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgLyoqXG5cdCAgICAgICAgICogVGhpcyB1dGlsIGZ1bmN0aW9uIHdpbGwgYnVpbGQgYW4gb3B0aW9uIG9iamVjdCB3aXRoIHBhc3NpdmUgb3B0aW9uXG5cdCAgICAgICAgICogdG8gaGFuZGxlIGFsbCBwb3NzaWJsZSBpbnB1dCBmcm9tIHRoZSB1c2VyLlxuXHQgICAgICAgICAqL1xuXHQgICAgICAgIGZ1bmN0aW9uIGJ1aWxkRXZlbnRMaXN0ZW5lck9wdGlvbnMob3B0aW9ucywgcGFzc2l2ZSkge1xuXHQgICAgICAgICAgICBpZiAoIXBhc3NpdmUpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyBjYXB0dXJlOiBvcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLnBhc3NpdmUgIT09IGZhbHNlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5vcHRpb25zLCBwYXNzaXZlOiB0cnVlIH07XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHRhc2sgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlLFxuXHQgICAgICAgICAgICAvLyBqdXN0IHJldHVybiwgYmVjYXVzZSB3ZSB1c2UgdGhlIHNoYXJlZCBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBoZXJlLlxuXHQgICAgICAgICAgICBpZiAodGFza0RhdGEuaXNFeGlzdGluZykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVBZGRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2tEYXRhLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFza0RhdGEub3B0aW9ucyk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICAvKipcblx0ICAgICAgICAgKiBJbiB0aGUgY29udGV4dCBvZiBldmVudHMgYW5kIGxpc3RlbmVycywgdGhpcyBmdW5jdGlvbiB3aWxsIGJlXG5cdCAgICAgICAgICogY2FsbGVkIGF0IHRoZSBlbmQgYnkgYGNhbmNlbFRhc2tgLCB3aGljaCwgaW4gdHVybiwgY2FsbHMgYHRhc2suY2FuY2VsRm5gLlxuXHQgICAgICAgICAqIENhbmNlbGxpbmcgYSB0YXNrIGlzIHByaW1hcmlseSB1c2VkIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgZnJvbVxuXHQgICAgICAgICAqIHRoZSB0YXNrIHRhcmdldC5cblx0ICAgICAgICAgKi9cblx0ICAgICAgICBjb25zdCBjdXN0b21DYW5jZWxHbG9iYWwgPSBmdW5jdGlvbiAodGFzaykge1xuXHQgICAgICAgICAgICAvLyBpZiB0YXNrIGlzIG5vdCBtYXJrZWQgYXMgaXNSZW1vdmVkLCB0aGlzIGNhbGwgaXMgZGlyZWN0bHlcblx0ICAgICAgICAgICAgLy8gZnJvbSBab25lLnByb3RvdHlwZS5jYW5jZWxUYXNrLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB0YXNrXG5cdCAgICAgICAgICAgIC8vIGZyb20gdGFza3NMaXN0IG9mIHRhcmdldCBmaXJzdFxuXHQgICAgICAgICAgICBpZiAoIXRhc2suaXNSZW1vdmVkKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbdGFzay5ldmVudE5hbWVdO1xuXHQgICAgICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1t0YXNrLmNhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2tzID0gc3ltYm9sRXZlbnROYW1lICYmIHRhc2sudGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2sgPSBleGlzdGluZ1Rhc2tzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrID09PSB0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpc1JlbW92ZWQgdG8gZGF0YSBmb3IgZmFzdGVyIGludm9rZVRhc2sgY2hlY2tcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaXNSZW1vdmVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIgPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmFsbFJlbW92ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sudGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gaWYgYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsXG5cdCAgICAgICAgICAgIC8vIHdlIHdpbGwgcmVhbGx5IHJlbW92ZSB0aGUgZ2xvYmFsIGV2ZW50IGNhbGxiYWNrLFxuXHQgICAgICAgICAgICAvLyBpZiBub3QsIHJldHVyblxuXHQgICAgICAgICAgICBpZiAoIXRhc2suYWxsUmVtb3ZlZCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrRGF0YS50YXJnZXQsIHRhc2tEYXRhLmV2ZW50TmFtZSwgdGFzay5pbnZva2UsIHRhc2tEYXRhLm9wdGlvbnMpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgY3VzdG9tU2NoZWR1bGVQcmVwZW5kID0gZnVuY3Rpb24gKHRhc2spIHtcblx0ICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2suaW52b2tlLCB0YXNrRGF0YS5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbUNhbmNlbE5vbkdsb2JhbCA9IGZ1bmN0aW9uICh0YXNrKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmludm9rZSwgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbVNjaGVkdWxlID0gdXNlR2xvYmFsQ2FsbGJhY2sgPyBjdXN0b21TY2hlZHVsZUdsb2JhbCA6IGN1c3RvbVNjaGVkdWxlTm9uR2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IGN1c3RvbUNhbmNlbCA9IHVzZUdsb2JhbENhbGxiYWNrID8gY3VzdG9tQ2FuY2VsR2xvYmFsIDogY3VzdG9tQ2FuY2VsTm9uR2xvYmFsO1xuXHQgICAgICAgIGNvbnN0IGNvbXBhcmVUYXNrQ2FsbGJhY2tWc0RlbGVnYXRlID0gZnVuY3Rpb24gKHRhc2ssIGRlbGVnYXRlKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IHR5cGVPZkRlbGVnYXRlID0gdHlwZW9mIGRlbGVnYXRlO1xuXHQgICAgICAgICAgICByZXR1cm4gKCh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXNrLmNhbGxiYWNrID09PSBkZWxlZ2F0ZSkgfHxcblx0ICAgICAgICAgICAgICAgICh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ29iamVjdCcgJiYgdGFzay5vcmlnaW5hbERlbGVnYXRlID09PSBkZWxlZ2F0ZSkpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgY29tcGFyZSA9IHBhdGNoT3B0aW9ucz8uZGlmZiB8fCBjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZTtcblx0ICAgICAgICBjb25zdCB1bnBhdGNoZWRFdmVudHMgPSBab25lW3pvbmVTeW1ib2woJ1VOUEFUQ0hFRF9FVkVOVFMnKV07XG5cdCAgICAgICAgY29uc3QgcGFzc2l2ZUV2ZW50cyA9IF9nbG9iYWxbem9uZVN5bWJvbCgnUEFTU0lWRV9FVkVOVFMnKV07XG5cdCAgICAgICAgZnVuY3Rpb24gY29weUV2ZW50TGlzdGVuZXJPcHRpb25zKG9wdGlvbnMpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlc3RydWN0dXJlIHRoZSB0YXJnZXQgYG9wdGlvbnNgIG9iamVjdCBzaW5jZSBpdCBtYXlcblx0ICAgICAgICAgICAgICAgIC8vIGJlIGZyb3plbiBvciBzZWFsZWQgKHBvc3NpYmx5IHByb3ZpZGVkIGltcGxpY2l0bHkgYnkgYSB0aGlyZC1wYXJ0eVxuXHQgICAgICAgICAgICAgICAgLy8gbGlicmFyeSksIG9yIGl0cyBwcm9wZXJ0aWVzIG1heSBiZSByZWFkb25seS5cblx0ICAgICAgICAgICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7IC4uLm9wdGlvbnMgfTtcblx0ICAgICAgICAgICAgICAgIC8vIFRoZSBgc2lnbmFsYCBvcHRpb24gd2FzIHJlY2VudGx5IGludHJvZHVjZWQsIHdoaWNoIGNhdXNlZCByZWdyZXNzaW9ucyBpblxuXHQgICAgICAgICAgICAgICAgLy8gdGhpcmQtcGFydHkgc2NlbmFyaW9zIHdoZXJlIGBBYm9ydENvbnRyb2xsZXJgIHdhcyBkaXJlY3RseSBwcm92aWRlZCB0b1xuXHQgICAgICAgICAgICAgICAgLy8gYGFkZEV2ZW50TGlzdGVuZXJgIGFzIG9wdGlvbnMuIEZvciBpbnN0YW5jZSwgaW4gY2FzZXMgbGlrZVxuXHQgICAgICAgICAgICAgICAgLy8gYGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBjYWxsYmFjaywgYWJvcnRDb250cm9sbGVySW5zdGFuY2UpYCxcblx0ICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIHZhbGlkIGJlY2F1c2UgYEFib3J0Q29udHJvbGxlcmAgaW5jbHVkZXMgYSBgc2lnbmFsYCBnZXR0ZXIsIHNwcmVhZGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gYHsuLi5vcHRpb25zfWAgd291bGRuJ3QgY29weSB0aGUgYHNpZ25hbGAuIEFkZGl0aW9uYWxseSwgdXNpbmcgYE9iamVjdC5jcmVhdGVgXG5cdCAgICAgICAgICAgICAgICAvLyBpc24ndCBmZWFzaWJsZSBzaW5jZSBgQWJvcnRDb250cm9sbGVyYCBpcyBhIGJ1aWx0LWluIG9iamVjdCB0eXBlLCBhbmQgYXR0ZW1wdGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBkaXJlY3RseSB3aXRoIGl0IGFzIHRoZSBwcm90b3R5cGUgbWlnaHQgcmVzdWx0IGluXG5cdCAgICAgICAgICAgICAgICAvLyB1bmV4cGVjdGVkIGJlaGF2aW9yLlxuXHQgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2lnbmFsKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgbmV3T3B0aW9ucy5zaWduYWwgPSBvcHRpb25zLnNpZ25hbDtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXdPcHRpb25zO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBtYWtlQWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAobmF0aXZlTGlzdGVuZXIsIGFkZFNvdXJjZSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4sIHJldHVyblRhcmdldCA9IGZhbHNlLCBwcmVwZW5kID0gZmFsc2UpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcblx0ICAgICAgICAgICAgICAgIGxldCBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gYXJndW1lbnRzWzFdO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGlzTm9kZSAmJiBldmVudE5hbWUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBwYXRjaCB1bmNhdWdodEV4Y2VwdGlvbiBvZiBub2RlanMgdG8gcHJldmVudCBlbmRsZXNzIGxvb3Bcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIFRvIGltcHJvdmUgYGFkZEV2ZW50TGlzdGVuZXJgIHBlcmZvcm1hbmNlLCB3ZSB3aWxsIGNyZWF0ZSB0aGUgY2FsbGJhY2tcblx0ICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGFzayBsYXRlciB3aGVuIHRoZSB0YXNrIGlzIGludm9rZWQuXG5cdCAgICAgICAgICAgICAgICBsZXQgaXNFdmVudExpc3RlbmVyT2JqZWN0ID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlbGVnYXRlICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjaGVja3Mgd2hldGhlciB0aGUgcHJvdmlkZWQgbGlzdGVuZXIgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGhcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhIGBoYW5kbGVFdmVudGAgbWV0aG9kIChzaW5jZSB3ZSBjYW4gY2FsbCBgYWRkRXZlbnRMaXN0ZW5lcmAgd2l0aCBhXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gYGV2ZW50ID0+IC4uLmAgb3Igd2l0aCBhbiBvYmplY3QgYHsgaGFuZGxlRXZlbnQ6IGV2ZW50ID0+IC4uLiB9YCkuXG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZS5oYW5kbGVFdmVudCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaXNFdmVudExpc3RlbmVyT2JqZWN0ID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUhhbmRsZXIgJiYgIXZhbGlkYXRlSGFuZGxlcihuYXRpdmVMaXN0ZW5lciwgZGVsZWdhdGUsIHRhcmdldCwgYXJndW1lbnRzKSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NpdmUgPSAhIXBhc3NpdmVFdmVudHMgJiYgcGFzc2l2ZUV2ZW50cy5pbmRleE9mKGV2ZW50TmFtZSkgIT09IC0xO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvcHlFdmVudExpc3RlbmVyT3B0aW9ucyhidWlsZEV2ZW50TGlzdGVuZXJPcHRpb25zKGFyZ3VtZW50c1syXSwgcGFzc2l2ZSkpO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaWduYWwgaXMgYW4gYWJvcnRlZCBvbmUsIGp1c3QgcmV0dXJuIHdpdGhvdXQgYXR0YWNoaW5nIHRoZSBldmVudCBsaXN0ZW5lci5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodW5wYXRjaGVkRXZlbnRzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdW5wYXRjaGVkIGxpc3Rcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVucGF0Y2hlZEV2ZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSB1bnBhdGNoZWRFdmVudHNbaV0pIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzaXZlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmNhbGwodGFyZ2V0LCBldmVudE5hbWUsIGRlbGVnYXRlLCBvcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3QgY2FwdHVyZSA9ICFvcHRpb25zID8gZmFsc2UgOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gdHJ1ZSA6IG9wdGlvbnMuY2FwdHVyZTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IG9uY2UgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyA/IG9wdGlvbnMub25jZSA6IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgem9uZSA9IFpvbmUuY3VycmVudDtcblx0ICAgICAgICAgICAgICAgIGxldCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIGlmICghc3ltYm9sRXZlbnROYW1lcykge1xuXHQgICAgICAgICAgICAgICAgICAgIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSwgZXZlbnROYW1lVG9TdHJpbmcpO1xuXHQgICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tjYXB0dXJlID8gVFJVRV9TVFIgOiBGQUxTRV9TVFJdO1xuXHQgICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIGxldCBpc0V4aXN0aW5nID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaGF2ZSB0YXNrIHJlZ2lzdGVyZWRcblx0ICAgICAgICAgICAgICAgICAgICBpc0V4aXN0aW5nID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tEdXBsaWNhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2tzW2ldLCBkZWxlZ2F0ZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIGNhbGxiYWNrLCBzYW1lIGNhcHR1cmUsIHNhbWUgZXZlbnQgbmFtZSwganVzdCByZXR1cm5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV0gPSBbXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGxldCBzb3VyY2U7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB0YXJnZXQuY29uc3RydWN0b3JbJ25hbWUnXTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFNvdXJjZSA9IGdsb2JhbFNvdXJjZXNbY29uc3RydWN0b3JOYW1lXTtcblx0ICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTb3VyY2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0YXJnZXRTb3VyY2VbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghc291cmNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc291cmNlID1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JOYW1lICtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZSArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIEluIHRoZSBjb2RlIGJlbG93LCBgb3B0aW9uc2Agc2hvdWxkIG5vIGxvbmdlciBiZSByZWFzc2lnbmVkOyBpbnN0ZWFkLCBpdFxuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgYmUgbXV0YXRlZC4gVGhpcyBpcyBiZWNhdXNlIHdlIHBhc3MgdGhhdCBvYmplY3QgdG8gdGhlIG5hdGl2ZVxuXHQgICAgICAgICAgICAgICAgLy8gYGFkZEV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICAgICAgLy8gSXQncyBnZW5lcmFsbHkgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBzYW1lIG9iamVjdCByZWZlcmVuY2UgZm9yIG9wdGlvbnMuXG5cdCAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY29uc2lzdGVuY3kgYW5kIGF2b2lkcyBwb3RlbnRpYWwgaXNzdWVzLlxuXHQgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucyA9IG9wdGlvbnM7XG5cdCAgICAgICAgICAgICAgICBpZiAob25jZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBvbmNlYCBvcHRpb24sIHdlIGRvbid0IHBhc3Ncblx0ICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYG9uY2VgIG9wdGlvbiBkaXJlY3RseSB0byB0aGUgbmF0aXZlIGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2Uga2VlcCB0aGUgYG9uY2VgIHNldHRpbmcgYW5kIGhhbmRsZSBpdCBvdXJzZWx2ZXMuXG5cdCAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5vbmNlID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB0YXNrRGF0YS50YXJnZXQgPSB0YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXNrRGF0YS5jYXB0dXJlID0gY2FwdHVyZTtcblx0ICAgICAgICAgICAgICAgIHRhc2tEYXRhLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgIHRhc2tEYXRhLmlzRXhpc3RpbmcgPSBpc0V4aXN0aW5nO1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHVzZUdsb2JhbENhbGxiYWNrID8gT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBIDogdW5kZWZpbmVkO1xuXHQgICAgICAgICAgICAgICAgLy8ga2VlcCB0YXNrRGF0YSBpbnRvIGRhdGEgdG8gYWxsb3cgb25TY2hlZHVsZUV2ZW50VGFzayB0byBhY2Nlc3MgdGhlIHRhc2sgaW5mb3JtYXRpb25cblx0ICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IHRhc2tEYXRhO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgYGFkZEV2ZW50TGlzdGVuZXJgIHdpdGggdGhlIGBzaWduYWxgIG9wdGlvbiwgd2UgZG9uJ3QgcGFzc1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgc2lnbmFsYCBvcHRpb24gZGlyZWN0bHkgdG8gdGhlIG5hdGl2ZSBgYWRkRXZlbnRMaXN0ZW5lcmAgbWV0aG9kLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGtlZXAgdGhlIGBzaWduYWxgIHNldHRpbmcgYW5kIGhhbmRsZSBpdCBvdXJzZWx2ZXMuXG5cdCAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEub3B0aW9ucy5zaWduYWwgPSB1bmRlZmluZWQ7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBUaGUgYHNjaGVkdWxlRXZlbnRUYXNrYCBmdW5jdGlvbiB3aWxsIHVsdGltYXRlbHkgY2FsbCBgY3VzdG9tU2NoZWR1bGVHbG9iYWxgLFxuXHQgICAgICAgICAgICAgICAgLy8gd2hpY2ggaW4gdHVybiBjYWxscyB0aGUgbmF0aXZlIGBhZGRFdmVudExpc3RlbmVyYC4gVGhpcyBpcyB3aHkgYHRhc2tEYXRhLm9wdGlvbnNgXG5cdCAgICAgICAgICAgICAgICAvLyBpcyB1cGRhdGVkIGJlZm9yZSBzY2hlZHVsaW5nIHRoZSB0YXNrLCBhcyBgY3VzdG9tU2NoZWR1bGVHbG9iYWxgIHVzZXNcblx0ICAgICAgICAgICAgICAgIC8vIGB0YXNrRGF0YS5vcHRpb25zYCB0byBwYXNzIGl0IHRvIHRoZSBuYXRpdmUgYGFkZEV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHpvbmUuc2NoZWR1bGVFdmVudFRhc2soc291cmNlLCBkZWxlZ2F0ZSwgZGF0YSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4pO1xuXHQgICAgICAgICAgICAgICAgaWYgKHNpZ25hbCkge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIHRhc2sgaXMgc2NoZWR1bGVkLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBzaWduYWwgYmFjayB0byB0YXNrLm9wdGlvbnNcblx0ICAgICAgICAgICAgICAgICAgICB0YXNrRGF0YS5vcHRpb25zLnNpZ25hbCA9IHNpZ25hbDtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBXcmFwcGluZyBgdGFza2AgaW4gYSB3ZWFrIHJlZmVyZW5jZSB3b3VsZCBub3QgcHJldmVudCBtZW1vcnkgbGVha3MuIFdlYWsgcmVmZXJlbmNlcyBhcmVcblx0ICAgICAgICAgICAgICAgICAgICAvLyBwcmltYXJpbHkgdXNlZCBmb3IgcHJldmVudGluZyBzdHJvbmcgcmVmZXJlbmNlcyBjeWNsZXMuIGBvbkFib3J0YCBpcyBhbHdheXMgcmVhY2hhYmxlXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gYXMgaXQncyBhbiBldmVudCBsaXN0ZW5lciwgc28gaXRzIGNsb3N1cmUgcmV0YWlucyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIGB0YXNrYC5cblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4gdGFzay56b25lLmNhbmNlbFRhc2sodGFzayk7XG5cdCAgICAgICAgICAgICAgICAgICAgbmF0aXZlTGlzdGVuZXIuY2FsbChzaWduYWwsICdhYm9ydCcsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgYGFib3J0YCBsaXN0ZW5lciB3aGVuIHRoZSBldmVudCBsaXN0ZW5lciBpcyBnb2luZyB0byBiZSByZW1vdmVkLFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIGFzIGl0IGNyZWF0ZXMgYSBjbG9zdXJlIHRoYXQgY2FwdHVyZXMgYHRhc2tgLiBUaGlzIGNsb3N1cmUgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGVcblx0ICAgICAgICAgICAgICAgICAgICAvLyBgdGFza2Agb2JqZWN0IGV2ZW4gYWZ0ZXIgaXQgZ29lcyBvdXQgb2Ygc2NvcGUsIHByZXZlbnRpbmcgYHRhc2tgIGZyb20gYmVpbmcgZ2FyYmFnZVxuXHQgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3RlZC5cblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLnJlbW92ZUFib3J0TGlzdGVuZXIgPSAoKSA9PiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIHNob3VsZCBjbGVhciB0YXNrRGF0YS50YXJnZXQgdG8gYXZvaWQgbWVtb3J5IGxlYWtcblx0ICAgICAgICAgICAgICAgIC8vIGlzc3VlLCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDQ0MlxuXHQgICAgICAgICAgICAgICAgdGFza0RhdGEudGFyZ2V0ID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gY2xlYXIgdXAgdGFza0RhdGEgYmVjYXVzZSBpdCBpcyBhIGdsb2JhbCBvYmplY3Rcblx0ICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIHNhdmUgdGhvc2UgaW5mb3JtYXRpb24gdG8gdGFzayBpbiBjYXNlXG5cdCAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBtYXkgY2FsbCB0YXNrLnpvbmUuY2FuY2VsVGFzaygpIGRpcmVjdGx5XG5cdCAgICAgICAgICAgICAgICBpZiAob25jZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMub25jZSA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhc2sub3B0aW9ucyAhPT0gJ2Jvb2xlYW4nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHNhdmUgdGhlIG9wdGlvbnMgb24gdGhlIHRhc2sgKGlmIGl0J3MgYW4gb2JqZWN0KSBiZWNhdXNlXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgYmUgdXNpbmcgYHRhc2sub3B0aW9uc2AgbGF0ZXIgd2hlbiByZW1vdmluZyB0aGUgZXZlbnQgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcGFzc2luZyBpdCBiYWNrIHRvIGByZW1vdmVFdmVudExpc3RlbmVyYC5cblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLm9wdGlvbnMgPSBvcHRpb25zO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgdGFzay50YXJnZXQgPSB0YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXNrLmNhcHR1cmUgPSBjYXB0dXJlO1xuXHQgICAgICAgICAgICAgICAgdGFzay5ldmVudE5hbWUgPSBldmVudE5hbWU7XG5cdCAgICAgICAgICAgICAgICBpZiAoaXNFdmVudExpc3RlbmVyT2JqZWN0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBkZWxlZ2F0ZSBmb3IgY29tcGFyZSB0byBjaGVjayBkdXBsaWNhdGVcblx0ICAgICAgICAgICAgICAgICAgICB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPSBkZWxlZ2F0ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmICghcHJlcGVuZCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFza3MucHVzaCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFza3MudW5zaGlmdCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVBZGRFdmVudExpc3RlbmVyLCBBRERfRVZFTlRfTElTVEVORVJfU09VUkNFLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQpO1xuXHQgICAgICAgIGlmIChuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lcikge1xuXHQgICAgICAgICAgICBwcm90b1tQUkVQRU5EX0VWRU5UX0xJU1RFTkVSXSA9IG1ha2VBZGRMaXN0ZW5lcihuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciwgUFJFUEVORF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UsIGN1c3RvbVNjaGVkdWxlUHJlcGVuZCwgY3VzdG9tQ2FuY2VsLCByZXR1cm5UYXJnZXQsIHRydWUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7XG5cdCAgICAgICAgICAgIGxldCBldmVudE5hbWUgPSBhcmd1bWVudHNbMF07XG5cdCAgICAgICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKSB7XG5cdCAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gYXJndW1lbnRzWzJdO1xuXHQgICAgICAgICAgICBjb25zdCBjYXB0dXJlID0gIW9wdGlvbnMgPyBmYWxzZSA6IHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgPyB0cnVlIDogb3B0aW9ucy5jYXB0dXJlO1xuXHQgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IGFyZ3VtZW50c1sxXTtcblx0ICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAodmFsaWRhdGVIYW5kbGVyICYmXG5cdCAgICAgICAgICAgICAgICAhdmFsaWRhdGVIYW5kbGVyKG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIsIGRlbGVnYXRlLCB0YXJnZXQsIGFyZ3VtZW50cykpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgbGV0IHN5bWJvbEV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgaWYgKHN5bWJvbEV2ZW50TmFtZXMpIHtcblx0ICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbY2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Rhc2tzID0gc3ltYm9sRXZlbnROYW1lICYmIHRhcmdldFtzeW1ib2xFdmVudE5hbWVdO1xuXHQgICAgICAgICAgICAvLyBgZXhpc3RpbmdUYXNrc2AgbWF5IG5vdCBleGlzdCBpZiB0aGUgYGFkZEV2ZW50TGlzdGVuZXJgIHdhcyBjYWxsZWQgYmVmb3JlXG5cdCAgICAgICAgICAgIC8vIGl0IHdhcyBwYXRjaGVkIGJ5IHpvbmUuanMuIFBsZWFzZSByZWZlciB0byB0aGUgYXR0YWNoZWQgaXNzdWUgZm9yXG5cdCAgICAgICAgICAgIC8vIGNsYXJpZmljYXRpb24sIHBhcnRpY3VsYXJseSBhZnRlciB0aGUgYGlmYCBjb25kaXRpb24sIGJlZm9yZSBjYWxsaW5nXG5cdCAgICAgICAgICAgIC8vIHRoZSBuYXRpdmUgYHJlbW92ZUV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXNrID0gZXhpc3RpbmdUYXNrc1tpXTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2ssIGRlbGVnYXRlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGlzUmVtb3ZlZCB0byBkYXRhIGZvciBmYXN0ZXIgaW52b2tlVGFzayBjaGVja1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suaXNSZW1vdmVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdGFza3MgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlIGhhdmUgZ29uZSxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBnbG9iYWxab25lQXdhcmVDYWxsYmFjayBhbmQgcmVtb3ZlIHRoZSB0YXNrIGNhY2hlIGZyb20gdGFyZ2V0XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Rhc2suYWxsUmVtb3ZlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXSA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgdGFyZ2V0LCB3ZSBoYXZlIGFuIGV2ZW50IGxpc3RlbmVyIHdoaWNoIGlzIGFkZGVkIGJ5IG9uX3Byb3BlcnR5XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIGFzIHRhcmdldC5vbmNsaWNrID0gZnVuY3Rpb24oKSB7fSwgc28gd2UgbmVlZCB0byBjbGVhciB0aGlzIGludGVybmFsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSB0b28gaWYgYWxsIGRlbGVnYXRlcyB3aXRoIGNhcHR1cmU9ZmFsc2Ugd2VyZSByZW1vdmVkXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovLyBnaXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzE2NDNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzU0NTgxXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmUgJiYgdHlwZW9mIGV2ZW50TmFtZSA9PT0gJ3N0cmluZycpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvblByb3BlcnR5U3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgJ09OX1BST1BFUlRZJyArIGV2ZW50TmFtZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbb25Qcm9wZXJ0eVN5bWJvbF0gPSBudWxsO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGFsbCBvdGhlciBjb25kaXRpb25zLCB3aGVuIGBhZGRFdmVudExpc3RlbmVyYCBpcyBjYWxsZWQgYWZ0ZXIgYmVpbmdcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGF0Y2hlZCBieSB6b25lLmpzLCB3ZSB3b3VsZCBhbHdheXMgZmluZCBhbiBldmVudCB0YXNrIG9uIHRoZSBgRXZlbnRUYXJnZXRgLlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdHJpZ2dlciBgY2FuY2VsRm5gIG9uIHRoZSBgZXhpc3RpbmdUYXNrYCwgbGVhZGluZyB0byBgY3VzdG9tQ2FuY2VsR2xvYmFsYCxcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdWx0aW1hdGVseSByZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGFuZCBjbGVhbnMgdXAgdGhlIGFib3J0IGxpc3RlbmVyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIChpZiBhbiBgQWJvcnRTaWduYWxgIHdhcyBwcm92aWRlZCB3aGVuIHNjaGVkdWxpbmcgYSB0YXNrKS5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLnpvbmUuY2FuY2VsVGFzayhleGlzdGluZ1Rhc2spO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvOTMwXG5cdCAgICAgICAgICAgIC8vIFdlIG1heSBlbmNvdW50ZXIgYSBzaXR1YXRpb24gd2hlcmUgdGhlIGBhZGRFdmVudExpc3RlbmVyYCB3YXNcblx0ICAgICAgICAgICAgLy8gY2FsbGVkIG9uIHRoZSBldmVudCB0YXJnZXQgYmVmb3JlIHpvbmUuanMgaXMgbG9hZGVkLCByZXN1bHRpbmdcblx0ICAgICAgICAgICAgLy8gaW4gbm8gdGFzayBiZWluZyBzdG9yZWQgb24gdGhlIGV2ZW50IHRhcmdldCBkdWUgdG8gaXRzIGludm9jYXRpb25cblx0ICAgICAgICAgICAgLy8gb2YgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4gSW4gdGhpcyBzY2VuYXJpbywgd2Ugc2ltcGx5IG5lZWQgdG9cblx0ICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBuYXRpdmUgYHJlbW92ZUV2ZW50TGlzdGVuZXJgLlxuXHQgICAgICAgICAgICByZXR1cm4gbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcHJvdG9bTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcyB8fCBfZ2xvYmFsO1xuXHQgICAgICAgICAgICBsZXQgZXZlbnROYW1lID0gYXJndW1lbnRzWzBdO1xuXHQgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gcGF0Y2hPcHRpb25zLnRyYW5zZmVyRXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gW107XG5cdCAgICAgICAgICAgIGNvbnN0IHRhc2tzID0gZmluZEV2ZW50VGFza3ModGFyZ2V0LCBldmVudE5hbWVUb1N0cmluZyA/IGV2ZW50TmFtZVRvU3RyaW5nKGV2ZW50TmFtZSkgOiBldmVudE5hbWUpO1xuXHQgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gdGFza3NbaV07XG5cdCAgICAgICAgICAgICAgICBsZXQgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goZGVsZWdhdGUpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnM7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBwcm90b1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDtcblx0ICAgICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTtcblx0ICAgICAgICAgICAgaWYgKCFldmVudE5hbWUpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0YXJnZXQpO1xuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IGtleXNbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYLmV4ZWMocHJvcCk7XG5cdCAgICAgICAgICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpbiBub2RlanMgRXZlbnRFbWl0dGVyLCByZW1vdmVMaXN0ZW5lciBldmVudCBpc1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1vbml0b3JpbmcgdGhlIHJlbW92ZUxpc3RlbmVyIGNhbGwsXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc28ganVzdCBrZWVwIHJlbW92ZUxpc3RlbmVyIGV2ZW50TGlzdGVuZXIgdW50aWxcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgZXZlbnRMaXN0ZW5lcnMgYXJlIHJlbW92ZWRcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0TmFtZSAmJiBldnROYW1lICE9PSAncmVtb3ZlTGlzdGVuZXInKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZ0TmFtZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlbW92ZUxpc3RlbmVyIGxpc3RlbmVyIGZpbmFsbHlcblx0ICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgJ3JlbW92ZUxpc3RlbmVyJyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbRkFMU0VfU1RSXTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xDYXB0dXJlRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tUUlVFX1NUUl07XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlVGFza3MgPSB0YXJnZXRbc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZV07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZVRhc2tzID0gdGFza3Muc2xpY2UoKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVUYXNrcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHJlbW92ZVRhc2tzW2ldO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlbGVnYXRlID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsIGV2ZW50TmFtZSwgZGVsZWdhdGUsIHRhc2sub3B0aW9ucyk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVUYXNrcykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVUYXNrcyA9IGNhcHR1cmVUYXNrcy5zbGljZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbW92ZVRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gcmVtb3ZlVGFza3NbaV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgdGFzay5vcHRpb25zKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgLy8gZm9yIG5hdGl2ZSB0b1N0cmluZyBwYXRjaFxuXHQgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tBRERfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVBZGRFdmVudExpc3RlbmVyKTtcblx0ICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lcik7XG5cdCAgICAgICAgaWYgKG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycykge1xuXHQgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVSZW1vdmVBbGxMaXN0ZW5lcnMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobmF0aXZlTGlzdGVuZXJzKSB7XG5cdCAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdLCBuYXRpdmVMaXN0ZW5lcnMpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gdHJ1ZTtcblx0ICAgIH1cblx0ICAgIGxldCByZXN1bHRzID0gW107XG5cdCAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFwaXMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICByZXN1bHRzW2ldID0gcGF0Y2hFdmVudFRhcmdldE1ldGhvZHMoYXBpc1tpXSwgcGF0Y2hPcHRpb25zKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiByZXN1bHRzO1xuXHR9XG5cdGZ1bmN0aW9uIGZpbmRFdmVudFRhc2tzKHRhcmdldCwgZXZlbnROYW1lKSB7XG5cdCAgICBpZiAoIWV2ZW50TmFtZSkge1xuXHQgICAgICAgIGNvbnN0IGZvdW5kVGFza3MgPSBbXTtcblx0ICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRhcmdldCkge1xuXHQgICAgICAgICAgICBjb25zdCBtYXRjaCA9IEVWRU5UX05BTUVfU1lNQk9MX1JFR1guZXhlYyhwcm9wKTtcblx0ICAgICAgICAgICAgbGV0IGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTtcblx0ICAgICAgICAgICAgaWYgKGV2dE5hbWUgJiYgKCFldmVudE5hbWUgfHwgZXZ0TmFtZSA9PT0gZXZlbnROYW1lKSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFza3MgPSB0YXJnZXRbcHJvcF07XG5cdCAgICAgICAgICAgICAgICBpZiAodGFza3MpIHtcblx0ICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGFza3MucHVzaCh0YXNrc1tpXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBmb3VuZFRhc2tzO1xuXHQgICAgfVxuXHQgICAgbGV0IHN5bWJvbEV2ZW50TmFtZSA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV07XG5cdCAgICBpZiAoIXN5bWJvbEV2ZW50TmFtZSkge1xuXHQgICAgICAgIHByZXBhcmVFdmVudE5hbWVzKGV2ZW50TmFtZSk7XG5cdCAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGNhcHR1cmVGYWxzZVRhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZVtGQUxTRV9TVFJdXTtcblx0ICAgIGNvbnN0IGNhcHR1cmVUcnVlVGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lW1RSVUVfU1RSXV07XG5cdCAgICBpZiAoIWNhcHR1cmVGYWxzZVRhc2tzKSB7XG5cdCAgICAgICAgcmV0dXJuIGNhcHR1cmVUcnVlVGFza3MgPyBjYXB0dXJlVHJ1ZVRhc2tzLnNsaWNlKCkgOiBbXTtcblx0ICAgIH1cblx0ICAgIGVsc2Uge1xuXHQgICAgICAgIHJldHVybiBjYXB0dXJlVHJ1ZVRhc2tzXG5cdCAgICAgICAgICAgID8gY2FwdHVyZUZhbHNlVGFza3MuY29uY2F0KGNhcHR1cmVUcnVlVGFza3MpXG5cdCAgICAgICAgICAgIDogY2FwdHVyZUZhbHNlVGFza3Muc2xpY2UoKTtcblx0ICAgIH1cblx0fVxuXHRmdW5jdGlvbiBwYXRjaEV2ZW50UHJvdG90eXBlKGdsb2JhbCwgYXBpKSB7XG5cdCAgICBjb25zdCBFdmVudCA9IGdsb2JhbFsnRXZlbnQnXTtcblx0ICAgIGlmIChFdmVudCAmJiBFdmVudC5wcm90b3R5cGUpIHtcblx0ICAgICAgICBhcGkucGF0Y2hNZXRob2QoRXZlbnQucHJvdG90eXBlLCAnc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uJywgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICBzZWxmW0lNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0xdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uXG5cdCAgICAgICAgICAgIC8vIGluIGNhc2UgaW4gc29tZSBoeWJyaWQgYXBwbGljYXRpb24sIHNvbWUgcGFydCBvZlxuXHQgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiB3aWxsIGJlIGNvbnRyb2xsZWQgYnkgem9uZSwgc29tZSBhcmUgbm90XG5cdCAgICAgICAgICAgIGRlbGVnYXRlICYmIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgIH0pO1xuXHQgICAgfVxuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdGZ1bmN0aW9uIHBhdGNoUXVldWVNaWNyb3Rhc2soZ2xvYmFsLCBhcGkpIHtcblx0ICAgIGFwaS5wYXRjaE1ldGhvZChnbG9iYWwsICdxdWV1ZU1pY3JvdGFzaycsIChkZWxlZ2F0ZSkgPT4ge1xuXHQgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICBab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb1Rhc2soJ3F1ZXVlTWljcm90YXNrJywgYXJnc1swXSk7XG5cdCAgICAgICAgfTtcblx0ICAgIH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHttaXNzaW5nUmVxdWlyZX1cblx0ICovXG5cdGNvbnN0IHRhc2tTeW1ib2wgPSB6b25lU3ltYm9sKCd6b25lVGFzaycpO1xuXHRmdW5jdGlvbiBwYXRjaFRpbWVyKHdpbmRvdywgc2V0TmFtZSwgY2FuY2VsTmFtZSwgbmFtZVN1ZmZpeCkge1xuXHQgICAgbGV0IHNldE5hdGl2ZSA9IG51bGw7XG5cdCAgICBsZXQgY2xlYXJOYXRpdmUgPSBudWxsO1xuXHQgICAgc2V0TmFtZSArPSBuYW1lU3VmZml4O1xuXHQgICAgY2FuY2VsTmFtZSArPSBuYW1lU3VmZml4O1xuXHQgICAgY29uc3QgdGFza3NCeUhhbmRsZUlkID0ge307XG5cdCAgICBmdW5jdGlvbiBzY2hlZHVsZVRhc2sodGFzaykge1xuXHQgICAgICAgIGNvbnN0IGRhdGEgPSB0YXNrLmRhdGE7XG5cdCAgICAgICAgZGF0YS5hcmdzWzBdID0gZnVuY3Rpb24gKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gdGFzay5pbnZva2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IGhhbmRsZU9ySWQgPSBzZXROYXRpdmUuYXBwbHkod2luZG93LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgIC8vIFdobGlzdCBvbiBOb2RlLmpzIHdoZW4gZ2V0IGNhbiB0aGUgSUQgYnkgdXNpbmcgYFtTeW1ib2wudG9QcmltaXRpdmVdKClgIHdlIGRvXG5cdCAgICAgICAgLy8gdG8gdGhpcyBzbyB0aGF0IHdlIGRvIG5vdCBjYXVzZSBwb3RlbnRhbGx5IGxlYWtzIHdoZW4gdXNpbmcgYHNldFRpbWVvdXRgXG5cdCAgICAgICAgLy8gc2luY2UgdGhpcyBjYW4gYmUgcGVyaW9kaWMgd2hlbiB1c2luZyBgLnJlZnJlc2hgLlxuXHQgICAgICAgIGlmIChpc051bWJlcihoYW5kbGVPcklkKSkge1xuXHQgICAgICAgICAgICBkYXRhLmhhbmRsZUlkID0gaGFuZGxlT3JJZDtcblx0ICAgICAgICB9XG5cdCAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgIGRhdGEuaGFuZGxlID0gaGFuZGxlT3JJZDtcblx0ICAgICAgICAgICAgLy8gT24gTm9kZS5qcyBhIHRpbWVvdXQgYW5kIGludGVydmFsIGNhbiBiZSByZXN0YXJ0ZWQgb3ZlciBhbmQgb3ZlciBhZ2FpbiBieSB1c2luZyB0aGUgYC5yZWZyZXNoYCBtZXRob2QuXG5cdCAgICAgICAgICAgIGRhdGEuaXNSZWZyZXNoYWJsZSA9IGlzRnVuY3Rpb24oaGFuZGxlT3JJZC5yZWZyZXNoKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcmV0dXJuIHRhc2s7XG5cdCAgICB9XG5cdCAgICBmdW5jdGlvbiBjbGVhclRhc2sodGFzaykge1xuXHQgICAgICAgIGNvbnN0IHsgaGFuZGxlLCBoYW5kbGVJZCB9ID0gdGFzay5kYXRhO1xuXHQgICAgICAgIHJldHVybiBjbGVhck5hdGl2ZS5jYWxsKHdpbmRvdywgaGFuZGxlID8/IGhhbmRsZUlkKTtcblx0ICAgIH1cblx0ICAgIHNldE5hdGl2ZSA9IHBhdGNoTWV0aG9kKHdpbmRvdywgc2V0TmFtZSwgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgIGlmIChpc0Z1bmN0aW9uKGFyZ3NbMF0pKSB7XG5cdCAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG5cdCAgICAgICAgICAgICAgICBpc1JlZnJlc2hhYmxlOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcsXG5cdCAgICAgICAgICAgICAgICBkZWxheTogbmFtZVN1ZmZpeCA9PT0gJ1RpbWVvdXQnIHx8IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcgPyBhcmdzWzFdIHx8IDAgOiB1bmRlZmluZWQsXG5cdCAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3NbMF07XG5cdCAgICAgICAgICAgIGFyZ3NbMF0gPSBmdW5jdGlvbiB0aW1lcigpIHtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBmaW5hbGx5IHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZS05MzQsIHRhc2sgd2lsbCBiZSBjYW5jZWxsZWRcblx0ICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGl0IGlzIGEgcGVyaW9kaWMgdGFzayBzdWNoIGFzXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2V0SW50ZXJ2YWxcblx0ICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80MDM4N1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXAgdGFza3NCeUhhbmRsZUlkIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBzY2hlZHVsZVRhc2tcblx0ICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBzb21lIHpvbmVTcGVjIG1heSBpbnRlcmNlcHQgYW5kIGRvZXNuJ3QgdHJpZ2dlclxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlRm4oc2NoZWR1bGVUYXNrKSBwcm92aWRlZCBoZXJlLlxuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaGFuZGxlLCBoYW5kbGVJZCwgaXNQZXJpb2RpYywgaXNSZWZyZXNoYWJsZSB9ID0gb3B0aW9ucztcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUGVyaW9kaWMgJiYgIWlzUmVmcmVzaGFibGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZUlkKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBub24tbm9kZWpzIGVudiwgd2UgcmVtb3ZlIHRpbWVySWRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gbG9jYWwgY2FjaGVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbaGFuZGxlSWRdO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhbmRsZSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSByZXR1cm5zIGNvbXBsZXggb2JqZWN0cyBhcyBoYW5kbGVJZHNcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHJlbW92ZSB0YXNrIHJlZmVyZW5jZSBmcm9tIHRpbWVyIG9iamVjdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gbnVsbDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgY29uc3QgdGFzayA9IHNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lKHNldE5hbWUsIGFyZ3NbMF0sIG9wdGlvbnMsIHNjaGVkdWxlVGFzaywgY2xlYXJUYXNrKTtcblx0ICAgICAgICAgICAgaWYgKCF0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gdGFzaztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAvLyBOb2RlLmpzIG11c3QgYWRkaXRpb25hbGx5IHN1cHBvcnQgdGhlIHJlZiBhbmQgdW5yZWYgZnVuY3Rpb25zLlxuXHQgICAgICAgICAgICBjb25zdCB7IGhhbmRsZUlkLCBoYW5kbGUsIGlzUmVmcmVzaGFibGUsIGlzUGVyaW9kaWMgfSA9IHRhc2suZGF0YTtcblx0ICAgICAgICAgICAgaWYgKGhhbmRsZUlkKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBmb3Igbm9uIG5vZGVqcyBlbnYsIHdlIHNhdmUgaGFuZGxlSWQ6IHRhc2tcblx0ICAgICAgICAgICAgICAgIC8vIG1hcHBpbmcgaW4gbG9jYWwgY2FjaGUgZm9yIGNsZWFyVGltZW91dFxuXHQgICAgICAgICAgICAgICAgdGFza3NCeUhhbmRsZUlkW2hhbmRsZUlkXSA9IHRhc2s7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBmb3Igbm9kZWpzIGVudiwgd2Ugc2F2ZSB0YXNrXG5cdCAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgaW4gdGltZXJJZCBPYmplY3QgZm9yIGNsZWFyVGltZW91dFxuXHQgICAgICAgICAgICAgICAgaGFuZGxlW3Rhc2tTeW1ib2xdID0gdGFzaztcblx0ICAgICAgICAgICAgICAgIGlmIChpc1JlZnJlc2hhYmxlICYmICFpc1BlcmlvZGljKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZWZyZXNoID0gaGFuZGxlLnJlZnJlc2g7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFuZGxlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgem9uZSwgc3RhdGUgfSA9IHRhc2s7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ25vdFNjaGVkdWxlZCcpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3N0YXRlID0gJ3NjaGVkdWxlZCc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09ICdydW5uaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5fc3RhdGUgPSAnc2NoZWR1bGluZyc7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVmcmVzaC5jYWxsKHRoaXMpO1xuXHQgICAgICAgICAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIGhhbmRsZSA/PyBoYW5kbGVJZCA/PyB0YXNrO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS5cblx0ICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHdpbmRvdywgYXJncyk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBjbGVhck5hdGl2ZSA9IHBhdGNoTWV0aG9kKHdpbmRvdywgY2FuY2VsTmFtZSwgKGRlbGVnYXRlKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgIGNvbnN0IGlkID0gYXJnc1swXTtcblx0ICAgICAgICBsZXQgdGFzaztcblx0ICAgICAgICBpZiAoaXNOdW1iZXIoaWQpKSB7XG5cdCAgICAgICAgICAgIC8vIG5vbiBub2RlanMgZW52LlxuXHQgICAgICAgICAgICB0YXNrID0gdGFza3NCeUhhbmRsZUlkW2lkXTtcblx0ICAgICAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVJZFtpZF07XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAvLyBub2RlanMgZW52ID8/IG90aGVyIGVudmlyb25tZW50cy5cblx0ICAgICAgICAgICAgdGFzayA9IGlkPy5bdGFza1N5bWJvbF07XG5cdCAgICAgICAgICAgIGlmICh0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICBpZFt0YXNrU3ltYm9sXSA9IG51bGw7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICB0YXNrID0gaWQ7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKHRhc2s/LnR5cGUpIHtcblx0ICAgICAgICAgICAgaWYgKHRhc2suY2FuY2VsRm4pIHtcblx0ICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjYW5jZWwgYWxyZWFkeSBjYW5jZWxlZCBmdW5jdGlvbnNcblx0ICAgICAgICAgICAgICAgIHRhc2suem9uZS5jYW5jZWxUYXNrKHRhc2spO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LlxuXHQgICAgICAgICAgICBkZWxlZ2F0ZS5hcHBseSh3aW5kb3csIGFyZ3MpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDdXN0b21FbGVtZW50cyhfZ2xvYmFsLCBhcGkpIHtcblx0ICAgIGNvbnN0IHsgaXNCcm93c2VyLCBpc01peCB9ID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKTtcblx0ICAgIGlmICgoIWlzQnJvd3NlciAmJiAhaXNNaXgpIHx8ICFfZ2xvYmFsWydjdXN0b21FbGVtZW50cyddIHx8ICEoJ2N1c3RvbUVsZW1lbnRzJyBpbiBfZ2xvYmFsKSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2N1c3RvbS1lbGVtZW50cy5odG1sI2NvbmNlcHQtY3VzdG9tLWVsZW1lbnQtZGVmaW5pdGlvbi1saWZlY3ljbGUtY2FsbGJhY2tzXG5cdCAgICBjb25zdCBjYWxsYmFja3MgPSBbXG5cdCAgICAgICAgJ2Nvbm5lY3RlZENhbGxiYWNrJyxcblx0ICAgICAgICAnZGlzY29ubmVjdGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdhZG9wdGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2snLFxuXHQgICAgICAgICdmb3JtQXNzb2NpYXRlZENhbGxiYWNrJyxcblx0ICAgICAgICAnZm9ybURpc2FibGVkQ2FsbGJhY2snLFxuXHQgICAgICAgICdmb3JtUmVzZXRDYWxsYmFjaycsXG5cdCAgICAgICAgJ2Zvcm1TdGF0ZVJlc3RvcmVDYWxsYmFjaycsXG5cdCAgICBdO1xuXHQgICAgYXBpLnBhdGNoQ2FsbGJhY2tzKGFwaSwgX2dsb2JhbC5jdXN0b21FbGVtZW50cywgJ2N1c3RvbUVsZW1lbnRzJywgJ2RlZmluZScsIGNhbGxiYWNrcyk7XG5cdH1cblxuXHRmdW5jdGlvbiBldmVudFRhcmdldFBhdGNoKF9nbG9iYWwsIGFwaSkge1xuXHQgICAgaWYgKFpvbmVbYXBpLnN5bWJvbCgncGF0Y2hFdmVudFRhcmdldCcpXSkge1xuXHQgICAgICAgIC8vIEV2ZW50VGFyZ2V0IGlzIGFscmVhZHkgcGF0Y2hlZC5cblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBjb25zdCB7IGV2ZW50TmFtZXMsIHpvbmVTeW1ib2xFdmVudE5hbWVzLCBUUlVFX1NUUiwgRkFMU0VfU1RSLCBaT05FX1NZTUJPTF9QUkVGSVggfSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCk7XG5cdCAgICAvLyAgcHJlZGVmaW5lIGFsbCBfX3pvbmVfc3ltYm9sX18gKyBldmVudE5hbWUgKyB0cnVlL2ZhbHNlIHN0cmluZ1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgY29uc3QgZXZlbnROYW1lID0gZXZlbnROYW1lc1tpXTtcblx0ICAgICAgICBjb25zdCBmYWxzZUV2ZW50TmFtZSA9IGV2ZW50TmFtZSArIEZBTFNFX1NUUjtcblx0ICAgICAgICBjb25zdCB0cnVlRXZlbnROYW1lID0gZXZlbnROYW1lICsgVFJVRV9TVFI7XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgZmFsc2VFdmVudE5hbWU7XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7XG5cdCAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHt9O1xuXHQgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV1bRkFMU0VfU1RSXSA9IHN5bWJvbDtcblx0ICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7XG5cdCAgICB9XG5cdCAgICBjb25zdCBFVkVOVF9UQVJHRVQgPSBfZ2xvYmFsWydFdmVudFRhcmdldCddO1xuXHQgICAgaWYgKCFFVkVOVF9UQVJHRVQgfHwgIUVWRU5UX1RBUkdFVC5wcm90b3R5cGUpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBhcGkucGF0Y2hFdmVudFRhcmdldChfZ2xvYmFsLCBhcGksIFtFVkVOVF9UQVJHRVQgJiYgRVZFTlRfVEFSR0VULnByb3RvdHlwZV0pO1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hFdmVudChnbG9iYWwsIGFwaSkge1xuXHQgICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUoZ2xvYmFsLCBhcGkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmaWxlb3ZlcnZpZXdcblx0ICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfVxuXHQgKi9cblx0ZnVuY3Rpb24gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcykge1xuXHQgICAgaWYgKCFpZ25vcmVQcm9wZXJ0aWVzIHx8IGlnbm9yZVByb3BlcnRpZXMubGVuZ3RoID09PSAwKSB7XG5cdCAgICAgICAgcmV0dXJuIG9uUHJvcGVydGllcztcblx0ICAgIH1cblx0ICAgIGNvbnN0IHRpcCA9IGlnbm9yZVByb3BlcnRpZXMuZmlsdGVyKChpcCkgPT4gaXAudGFyZ2V0ID09PSB0YXJnZXQpO1xuXHQgICAgaWYgKHRpcC5sZW5ndGggPT09IDApIHtcblx0ICAgICAgICByZXR1cm4gb25Qcm9wZXJ0aWVzO1xuXHQgICAgfVxuXHQgICAgY29uc3QgdGFyZ2V0SWdub3JlUHJvcGVydGllcyA9IHRpcFswXS5pZ25vcmVQcm9wZXJ0aWVzO1xuXHQgICAgcmV0dXJuIG9uUHJvcGVydGllcy5maWx0ZXIoKG9wKSA9PiB0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzLmluZGV4T2Yob3ApID09PSAtMSk7XG5cdH1cblx0ZnVuY3Rpb24gcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXModGFyZ2V0LCBvblByb3BlcnRpZXMsIGlnbm9yZVByb3BlcnRpZXMsIHByb3RvdHlwZSkge1xuXHQgICAgLy8gY2hlY2sgd2hldGhlciB0YXJnZXQgaXMgYXZhaWxhYmxlLCBzb21ldGltZXMgdGFyZ2V0IHdpbGwgYmUgdW5kZWZpbmVkXG5cdCAgICAvLyBiZWNhdXNlIGRpZmZlcmVudCBicm93c2VyIG9yIHNvbWUgM3JkIHBhcnR5IHBsdWdpbi5cblx0ICAgIGlmICghdGFyZ2V0KSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgY29uc3QgZmlsdGVyZWRQcm9wZXJ0aWVzID0gZmlsdGVyUHJvcGVydGllcyh0YXJnZXQsIG9uUHJvcGVydGllcywgaWdub3JlUHJvcGVydGllcyk7XG5cdCAgICBwYXRjaE9uUHJvcGVydGllcyh0YXJnZXQsIGZpbHRlcmVkUHJvcGVydGllcywgcHJvdG90eXBlKTtcblx0fVxuXHQvKipcblx0ICogR2V0IGFsbCBldmVudCBuYW1lIHByb3BlcnRpZXMgd2hpY2ggdGhlIGV2ZW50IG5hbWUgc3RhcnRzV2l0aCBgb25gXG5cdCAqIGZyb20gdGhlIHRhcmdldCBvYmplY3QgaXRzZWxmLCBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgbm90IGNvbnNpZGVyZWQuXG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRPbkV2ZW50TmFtZXModGFyZ2V0KSB7XG5cdCAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuXHQgICAgICAgIC5maWx0ZXIoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aCgnb24nKSAmJiBuYW1lLmxlbmd0aCA+IDIpXG5cdCAgICAgICAgLm1hcCgobmFtZSkgPT4gbmFtZS5zdWJzdHJpbmcoMikpO1xuXHR9XG5cdGZ1bmN0aW9uIHByb3BlcnR5RGVzY3JpcHRvclBhdGNoKGFwaSwgX2dsb2JhbCkge1xuXHQgICAgaWYgKGlzTm9kZSAmJiAhaXNNaXgpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICBpZiAoWm9uZVthcGkuc3ltYm9sKCdwYXRjaEV2ZW50cycpXSkge1xuXHQgICAgICAgIC8vIGV2ZW50cyBhcmUgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgbGVnYWN5IHBhdGNoLlxuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IGlnbm9yZVByb3BlcnRpZXMgPSBfZ2xvYmFsWydfX1pvbmVfaWdub3JlX29uX3Byb3BlcnRpZXMnXTtcblx0ICAgIC8vIGZvciBicm93c2VycyB0aGF0IHdlIGNhbiBwYXRjaCB0aGUgZGVzY3JpcHRvcjogIENocm9tZSAmIEZpcmVmb3hcblx0ICAgIGxldCBwYXRjaFRhcmdldHMgPSBbXTtcblx0ICAgIGlmIChpc0Jyb3dzZXIpIHtcblx0ICAgICAgICBjb25zdCBpbnRlcm5hbFdpbmRvdyA9IHdpbmRvdztcblx0ICAgICAgICBwYXRjaFRhcmdldHMgPSBwYXRjaFRhcmdldHMuY29uY2F0KFtcblx0ICAgICAgICAgICAgJ0RvY3VtZW50Jyxcblx0ICAgICAgICAgICAgJ1NWR0VsZW1lbnQnLFxuXHQgICAgICAgICAgICAnRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MQm9keUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTE1lZGlhRWxlbWVudCcsXG5cdCAgICAgICAgICAgICdIVE1MRnJhbWVTZXRFbGVtZW50Jyxcblx0ICAgICAgICAgICAgJ0hUTUxGcmFtZUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTElGcmFtZUVsZW1lbnQnLFxuXHQgICAgICAgICAgICAnSFRNTE1hcnF1ZWVFbGVtZW50Jyxcblx0ICAgICAgICAgICAgJ1dvcmtlcicsXG5cdCAgICAgICAgXSk7XG5cdCAgICAgICAgY29uc3QgaWdub3JlRXJyb3JQcm9wZXJ0aWVzID0gW107XG5cdCAgICAgICAgLy8gSW4gb2xkZXIgYnJvd3NlcnMgbGlrZSBJRSBvciBFZGdlLCBldmVudCBoYW5kbGVyIHByb3BlcnRpZXMgKGUuZy4sIGBvbmNsaWNrYClcblx0ICAgICAgICAvLyBtYXkgbm90IGJlIGRlZmluZWQgZGlyZWN0bHkgb24gdGhlIGB3aW5kb3dgIG9iamVjdCBidXQgb24gaXRzIHByb3RvdHlwZSAoYFdpbmRvd1Byb3RvdHlwZWApLlxuXHQgICAgICAgIC8vIFRvIGVuc3VyZSBjb21wbGV0ZSBjb3ZlcmFnZSwgd2UgdXNlIHRoZSBwcm90b3R5cGUgd2hlbiBjaGVja2luZ1xuXHQgICAgICAgIC8vIGZvciBhbmQgcGF0Y2hpbmcgdGhlc2UgcHJvcGVydGllcy5cblx0ICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhpbnRlcm5hbFdpbmRvdywgZ2V0T25FdmVudE5hbWVzKGludGVybmFsV2luZG93KSwgaWdub3JlUHJvcGVydGllcyA/IGlnbm9yZVByb3BlcnRpZXMuY29uY2F0KGlnbm9yZUVycm9yUHJvcGVydGllcykgOiBpZ25vcmVQcm9wZXJ0aWVzLCBPYmplY3RHZXRQcm90b3R5cGVPZihpbnRlcm5hbFdpbmRvdykpO1xuXHQgICAgfVxuXHQgICAgcGF0Y2hUYXJnZXRzID0gcGF0Y2hUYXJnZXRzLmNvbmNhdChbXG5cdCAgICAgICAgJ1hNTEh0dHBSZXF1ZXN0Jyxcblx0ICAgICAgICAnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCcsXG5cdCAgICAgICAgJ0lEQkluZGV4Jyxcblx0ICAgICAgICAnSURCUmVxdWVzdCcsXG5cdCAgICAgICAgJ0lEQk9wZW5EQlJlcXVlc3QnLFxuXHQgICAgICAgICdJREJEYXRhYmFzZScsXG5cdCAgICAgICAgJ0lEQlRyYW5zYWN0aW9uJyxcblx0ICAgICAgICAnSURCQ3Vyc29yJyxcblx0ICAgICAgICAnV2ViU29ja2V0Jyxcblx0ICAgIF0pO1xuXHQgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRjaFRhcmdldHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICBjb25zdCB0YXJnZXQgPSBfZ2xvYmFsW3BhdGNoVGFyZ2V0c1tpXV07XG5cdCAgICAgICAgdGFyZ2V0Py5wcm90b3R5cGUgJiZcblx0ICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXModGFyZ2V0LnByb3RvdHlwZSwgZ2V0T25FdmVudE5hbWVzKHRhcmdldC5wcm90b3R5cGUpLCBpZ25vcmVQcm9wZXJ0aWVzKTtcblx0ICAgIH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZmlsZW92ZXJ2aWV3XG5cdCAqIEBzdXBwcmVzcyB7bWlzc2luZ1JlcXVpcmV9XG5cdCAqL1xuXHRmdW5jdGlvbiBwYXRjaEJyb3dzZXIoWm9uZSkge1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ2xlZ2FjeScsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICBjb25zdCBsZWdhY3lQYXRjaCA9IGdsb2JhbFtab25lLl9fc3ltYm9sX18oJ2xlZ2FjeVBhdGNoJyldO1xuXHQgICAgICAgIGlmIChsZWdhY3lQYXRjaCkge1xuXHQgICAgICAgICAgICBsZWdhY3lQYXRjaCgpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3RpbWVycycsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICBjb25zdCBzZXQgPSAnc2V0Jztcblx0ICAgICAgICBjb25zdCBjbGVhciA9ICdjbGVhcic7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdUaW1lb3V0Jyk7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsIHNldCwgY2xlYXIsICdJbnRlcnZhbCcpO1xuXHQgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnSW1tZWRpYXRlJyk7XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnLCAoZ2xvYmFsKSA9PiB7XG5cdCAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsICdyZXF1ZXN0JywgJ2NhbmNlbCcsICdBbmltYXRpb25GcmFtZScpO1xuXHQgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCAnbW96UmVxdWVzdCcsICdtb3pDYW5jZWwnLCAnQW5pbWF0aW9uRnJhbWUnKTtcblx0ICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgJ3dlYmtpdFJlcXVlc3QnLCAnd2Via2l0Q2FuY2VsJywgJ0FuaW1hdGlvbkZyYW1lJyk7XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdibG9ja2luZycsIChnbG9iYWwsIFpvbmUpID0+IHtcblx0ICAgICAgICBjb25zdCBibG9ja2luZ01ldGhvZHMgPSBbJ2FsZXJ0JywgJ3Byb21wdCcsICdjb25maXJtJ107XG5cdCAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja2luZ01ldGhvZHMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgY29uc3QgbmFtZSA9IGJsb2NraW5nTWV0aG9kc1tpXTtcblx0ICAgICAgICAgICAgcGF0Y2hNZXRob2QoZ2xvYmFsLCBuYW1lLCAoZGVsZWdhdGUsIHN5bWJvbCwgbmFtZSkgPT4ge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzLCBhcmdzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5ydW4oZGVsZWdhdGUsIGdsb2JhbCwgYXJncywgbmFtZSk7XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldCcsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIHBhdGNoRXZlbnQoZ2xvYmFsLCBhcGkpO1xuXHQgICAgICAgIGV2ZW50VGFyZ2V0UGF0Y2goZ2xvYmFsLCBhcGkpO1xuXHQgICAgICAgIC8vIHBhdGNoIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQncyBhZGRFdmVudExpc3RlbmVyL3JlbW92ZUV2ZW50TGlzdGVuZXJcblx0ICAgICAgICBjb25zdCBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gZ2xvYmFsWydYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0J107XG5cdCAgICAgICAgaWYgKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgJiYgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldC5wcm90b3R5cGUpIHtcblx0ICAgICAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoZ2xvYmFsLCBhcGksIFtYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZV0pO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ011dGF0aW9uT2JzZXJ2ZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaENsYXNzKCdNdXRhdGlvbk9ic2VydmVyJyk7XG5cdCAgICAgICAgcGF0Y2hDbGFzcygnV2ViS2l0TXV0YXRpb25PYnNlcnZlcicpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaENsYXNzKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnRmlsZVJlYWRlcicsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIHBhdGNoQ2xhc3MoJ0ZpbGVSZWFkZXInKTtcblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ29uX3Byb3BlcnR5JywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yUGF0Y2goYXBpLCBnbG9iYWwpO1xuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnY3VzdG9tRWxlbWVudHMnLCAoZ2xvYmFsLCBab25lLCBhcGkpID0+IHtcblx0ICAgICAgICBwYXRjaEN1c3RvbUVsZW1lbnRzKGdsb2JhbCwgYXBpKTtcblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ1hIUicsIChnbG9iYWwsIFpvbmUpID0+IHtcblx0ICAgICAgICAvLyBUcmVhdCBYTUxIdHRwUmVxdWVzdCBhcyBhIG1hY3JvdGFzay5cblx0ICAgICAgICBwYXRjaFhIUihnbG9iYWwpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9UQVNLID0gem9uZVN5bWJvbCgneGhyVGFzaycpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9TWU5DID0gem9uZVN5bWJvbCgneGhyU3luYycpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9MSVNURU5FUiA9IHpvbmVTeW1ib2woJ3hockxpc3RlbmVyJyk7XG5cdCAgICAgICAgY29uc3QgWEhSX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hoclNjaGVkdWxlZCcpO1xuXHQgICAgICAgIGNvbnN0IFhIUl9VUkwgPSB6b25lU3ltYm9sKCd4aHJVUkwnKTtcblx0ICAgICAgICBjb25zdCBYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hockVycm9yQmVmb3JlU2NoZWR1bGVkJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gcGF0Y2hYSFIod2luZG93KSB7XG5cdCAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0ID0gd2luZG93WydYTUxIdHRwUmVxdWVzdCddO1xuXHQgICAgICAgICAgICBpZiAoIVhNTEh0dHBSZXF1ZXN0KSB7XG5cdCAgICAgICAgICAgICAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIHNlcnZpY2Ugd29ya2VyXG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRQZW5kaW5nVGFzayh0YXJnZXQpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbWEhSX1RBU0tdO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGxldCBvcmlBZGRMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgIGxldCBvcmlSZW1vdmVMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB3aW5kb3dbJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnXTtcblx0ICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZSA9IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQucHJvdG90eXBlO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaUFkZExpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZVtaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldFByb3RvdHlwZVtaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IFJFQURZX1NUQVRFX0NIQU5HRSA9ICdyZWFkeXN0YXRlY2hhbmdlJztcblx0ICAgICAgICAgICAgY29uc3QgU0NIRURVTEVEID0gJ3NjaGVkdWxlZCc7XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGFzay5kYXRhO1xuXHQgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZGF0YS50YXJnZXQ7XG5cdCAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRF0gPSBmYWxzZTtcblx0ICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBldmVudCBsaXN0ZW5lclxuXHQgICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXRbWEhSX0xJU1RFTkVSXTtcblx0ICAgICAgICAgICAgICAgIGlmICghb3JpQWRkTGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lciA9IHRhcmdldFtaT05FX1NZTUJPTF9BRERfRVZFTlRfTElTVEVORVJdO1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gdGFyZ2V0W1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHtcblx0ICAgICAgICAgICAgICAgICAgICBvcmlSZW1vdmVMaXN0ZW5lci5jYWxsKHRhcmdldCwgUkVBRFlfU1RBVEVfQ0hBTkdFLCBsaXN0ZW5lcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBuZXdMaXN0ZW5lciA9ICh0YXJnZXRbWEhSX0xJU1RFTkVSXSA9ICgpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnJlYWR5U3RhdGUgPT09IHRhcmdldC5ET05FKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWV0aW1lcyBvbiBzb21lIGJyb3dzZXJzIFhNTEh0dHBSZXF1ZXN0IHdpbGwgZmlyZSBvbnJlYWR5c3RhdGVjaGFuZ2Ugd2l0aFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkeVN0YXRlPTQgbXVsdGlwbGUgdGltZXMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGFzayBzdGF0ZSBoZXJlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5hYm9ydGVkICYmIHRhcmdldFtYSFJfU0NIRURVTEVEXSAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHhociBoYXMgcmVnaXN0ZXJlZCBvbmxvYWQgbGlzdGVuZXJcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZSB0YXNrIHNob3VsZCBpbnZva2UgYWZ0ZXIgYWxsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmxvYWQgbGlzdGVuZXJzIGZpbmlzaC5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gaWYgdGhlIHJlcXVlc3QgZmFpbGVkIHdpdGhvdXQgcmVzcG9uc2UgKHN0YXR1cyA9IDApLCB0aGUgbG9hZCBldmVudCBoYW5kbGVyXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQsIGluIHRoYXQgY2FzZSwgd2Ugc2hvdWxkIGFsc28gaW52b2tlIHRoZSBwbGFjZWhvbGRlciBjYWxsYmFja1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2xvc2UgdGhlIFhNTEh0dHBSZXF1ZXN0OjpzZW5kIG1hY3JvVGFzay5cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzM4Nzk1XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkVGFza3MgPSB0YXJnZXRbWm9uZS5fX3N5bWJvbF9fKCdsb2FkZmFsc2UnKV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnN0YXR1cyAhPT0gMCAmJiBsb2FkVGFza3MgJiYgbG9hZFRhc2tzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlJbnZva2UgPSB0YXNrLmludm9rZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBsb2FkIHRoZSB0YXNrcyBhZ2FpbiwgYmVjYXVzZSBpbiBvdGhlclxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIGxpc3RlbmVyLCB0aGV5IG1heSByZW1vdmUgdGhlbXNlbHZlc1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkVGFza3MgPSB0YXJnZXRbWm9uZS5fX3N5bWJvbF9fKCdsb2FkZmFsc2UnKV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9hZFRhc2tzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZFRhc2tzW2ldID09PSB0YXNrKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFRhc2tzLnNwbGljZShpLCAxKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaUludm9rZS5jYWxsKHRhc2spO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkVGFza3MucHVzaCh0YXNrKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaW52b2tlKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPT09IGZhbHNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBvY2N1cnMgd2hlbiB4aHIuc2VuZCgpXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRURdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgb3JpQWRkTGlzdGVuZXIuY2FsbCh0YXJnZXQsIFJFQURZX1NUQVRFX0NIQU5HRSwgbmV3TGlzdGVuZXIpO1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc3RvcmVkVGFzayA9IHRhcmdldFtYSFJfVEFTS107XG5cdCAgICAgICAgICAgICAgICBpZiAoIXN0b3JlZFRhc2spIHtcblx0ICAgICAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1RBU0tdID0gdGFzaztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHNlbmROYXRpdmUuYXBwbHkodGFyZ2V0LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9TQ0hFRFVMRURdID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB0YXNrO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGZ1bmN0aW9uIHBsYWNlaG9sZGVyQ2FsbGJhY2soKSB7IH1cblx0ICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJUYXNrKHRhc2spIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0YXNrLmRhdGE7XG5cdCAgICAgICAgICAgICAgICAvLyBOb3RlIC0gaWRlYWxseSwgd2Ugd291bGQgY2FsbCBkYXRhLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyIGhlcmUsIGJ1dCBpdCdzIHRvbyBsYXRlXG5cdCAgICAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IGl0IGZyb20gZmlyaW5nLiBTbyBpbnN0ZWFkLCB3ZSBzdG9yZSBpbmZvIGZvciB0aGUgZXZlbnQgbGlzdGVuZXIuXG5cdCAgICAgICAgICAgICAgICBkYXRhLmFib3J0ZWQgPSB0cnVlO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIGFib3J0TmF0aXZlLmFwcGx5KGRhdGEudGFyZ2V0LCBkYXRhLmFyZ3MpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNvbnN0IG9wZW5OYXRpdmUgPSBwYXRjaE1ldGhvZChYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgJ29wZW4nLCAoKSA9PiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICAgICAgc2VsZltYSFJfU1lOQ10gPSBhcmdzWzJdID09IGZhbHNlO1xuXHQgICAgICAgICAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gb3Blbk5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIGNvbnN0IFhNTEhUVFBSRVFVRVNUX1NPVVJDRSA9ICdYTUxIdHRwUmVxdWVzdC5zZW5kJztcblx0ICAgICAgICAgICAgY29uc3QgZmV0Y2hUYXNrQWJvcnRpbmcgPSB6b25lU3ltYm9sKCdmZXRjaFRhc2tBYm9ydGluZycpO1xuXHQgICAgICAgICAgICBjb25zdCBmZXRjaFRhc2tTY2hlZHVsaW5nID0gem9uZVN5bWJvbCgnZmV0Y2hUYXNrU2NoZWR1bGluZycpO1xuXHQgICAgICAgICAgICBjb25zdCBzZW5kTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdzZW5kJywgKCkgPT4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcblx0ICAgICAgICAgICAgICAgIGlmIChab25lLmN1cnJlbnRbZmV0Y2hUYXNrU2NoZWR1bGluZ10gPT09IHRydWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhIGZldGNoIGlzIHNjaGVkdWxpbmcsIHNvIHdlIGFyZSB1c2luZyB4aHIgdG8gcG9seWZpbGwgZmV0Y2hcblx0ICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVjYXVzZSB3ZSBhbHJlYWR5IHNjaGVkdWxlIG1hY3JvVGFzayBmb3IgZmV0Y2gsIHdlIHNob3VsZFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzY2hlZHVsZSBhIG1hY3JvVGFzayBmb3IgeGhyIGFnYWluXG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAoc2VsZltYSFJfU1lOQ10pIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgWEhSIGlzIHN5bmMgdGhlcmUgaXMgbm8gdGFzayB0byBzY2hlZHVsZSwganVzdCBleGVjdXRlIHRoZSBjb2RlLlxuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBzZWxmLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHNlbGZbWEhSX1VSTF0sXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlzUGVyaW9kaWM6IGZhbHNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGVkOiBmYWxzZSxcblx0ICAgICAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhc2sgPSBzY2hlZHVsZU1hY3JvVGFza1dpdGhDdXJyZW50Wm9uZShYTUxIVFRQUkVRVUVTVF9TT1VSQ0UsIHBsYWNlaG9sZGVyQ2FsbGJhY2ssIG9wdGlvbnMsIHNjaGVkdWxlVGFzaywgY2xlYXJUYXNrKTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZiAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICBzZWxmW1hIUl9FUlJPUl9CRUZPUkVfU0NIRURVTEVEXSA9PT0gdHJ1ZSAmJlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAhb3B0aW9ucy5hYm9ydGVkICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyB4aHIgcmVxdWVzdCB0aHJvdyBlcnJvciB3aGVuIHNlbmRcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGludm9rZSB0YXNrIGluc3RlYWQgb2YgbGVhdmluZyBhIHNjaGVkdWxlZFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIG1hY3JvVGFza1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmludm9rZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgIGNvbnN0IGFib3J0TmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdhYm9ydCcsICgpID0+IGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB0YXNrID0gZmluZFBlbmRpbmdUYXNrKHNlbGYpO1xuXHQgICAgICAgICAgICAgICAgaWYgKHRhc2sgJiYgdHlwZW9mIHRhc2sudHlwZSA9PSAnc3RyaW5nJykge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBYSFIgaGFzIGFscmVhZHkgY29tcGxldGVkLCBkbyBub3RoaW5nLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBYSFIgaGFzIGFscmVhZHkgYmVlbiBhYm9ydGVkLCBkbyBub3RoaW5nLlxuXHQgICAgICAgICAgICAgICAgICAgIC8vIEZpeCAjNTY5LCBjYWxsIGFib3J0IG11bHRpcGxlIHRpbWVzIGJlZm9yZSBkb25lIHdpbGwgY2F1c2Vcblx0ICAgICAgICAgICAgICAgICAgICAvLyBtYWNyb1Rhc2sgdGFzayBjb3VudCBiZSBuZWdhdGl2ZSBudW1iZXJcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5jYW5jZWxGbiA9PSBudWxsIHx8ICh0YXNrLmRhdGEgJiYgdGFzay5kYXRhLmFib3J0ZWQpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgdGFzay56b25lLmNhbmNlbFRhc2sodGFzayk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChab25lLmN1cnJlbnRbZmV0Y2hUYXNrQWJvcnRpbmddID09PSB0cnVlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFib3J0IGlzIGNhbGxlZCBmcm9tIGZldGNoIHBvbHlmaWxsLCB3ZSBuZWVkIHRvIGNhbGwgbmF0aXZlIGFib3J0IG9mIFhIUi5cblx0ICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSB0cnlpbmcgdG8gYWJvcnQgYW4gWEhSIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gc2VudCwgc28gdGhlcmUgaXMgbm9cblx0ICAgICAgICAgICAgICAgIC8vIHRhc2tcblx0ICAgICAgICAgICAgICAgIC8vIHRvIGNhbmNlbC4gRG8gbm90aGluZy5cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgfSk7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnZ2VvbG9jYXRpb24nLCAoZ2xvYmFsKSA9PiB7XG5cdCAgICAgICAgLy8vIEdFT19MT0NBVElPTlxuXHQgICAgICAgIGlmIChnbG9iYWxbJ25hdmlnYXRvciddICYmIGdsb2JhbFsnbmF2aWdhdG9yJ10uZ2VvbG9jYXRpb24pIHtcblx0ICAgICAgICAgICAgcGF0Y2hQcm90b3R5cGUoZ2xvYmFsWyduYXZpZ2F0b3InXS5nZW9sb2NhdGlvbiwgWydnZXRDdXJyZW50UG9zaXRpb24nLCAnd2F0Y2hQb3NpdGlvbiddKTtcblx0ICAgICAgICB9XG5cdCAgICB9KTtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCdQcm9taXNlUmVqZWN0aW9uRXZlbnQnLCAoZ2xvYmFsLCBab25lKSA9PiB7XG5cdCAgICAgICAgLy8gaGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvblxuXHQgICAgICAgIGZ1bmN0aW9uIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcihldnROYW1lKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRUYXNrcyA9IGZpbmRFdmVudFRhc2tzKGdsb2JhbCwgZXZ0TmFtZSk7XG5cdCAgICAgICAgICAgICAgICBldmVudFRhc2tzLmZvckVhY2goKGV2ZW50VGFzaykgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgaGFzIGFkZGVkIHVuaGFuZGxlZHJlamVjdGlvbiBldmVudCBsaXN0ZW5lclxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGV2ZW50IGxpc3RlbmVyXG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID0gZ2xvYmFsWydQcm9taXNlUmVqZWN0aW9uRXZlbnQnXTtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoUHJvbWlzZVJlamVjdGlvbkV2ZW50KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2dCA9IG5ldyBQcm9taXNlUmVqZWN0aW9uRXZlbnQoZXZ0TmFtZSwge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogZS5wcm9taXNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBlLnJlamVjdGlvbixcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VGFzay5pbnZva2UoZXZ0KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J10pIHtcblx0ICAgICAgICAgICAgWm9uZVt6b25lU3ltYm9sKCd1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcicpXSA9XG5cdCAgICAgICAgICAgICAgICBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicpO1xuXHQgICAgICAgICAgICBab25lW3pvbmVTeW1ib2woJ3JlamVjdGlvbkhhbmRsZWRIYW5kbGVyJyldID1cblx0ICAgICAgICAgICAgICAgIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcigncmVqZWN0aW9uaGFuZGxlZCcpO1xuXHQgICAgICAgIH1cblx0ICAgIH0pO1xuXHQgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3F1ZXVlTWljcm90YXNrJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgcGF0Y2hRdWV1ZU1pY3JvdGFzayhnbG9iYWwsIGFwaSk7XG5cdCAgICB9KTtcblx0fVxuXG5cdGZ1bmN0aW9uIHBhdGNoUHJvbWlzZShab25lKSB7XG5cdCAgICBab25lLl9fbG9hZF9wYXRjaCgnWm9uZUF3YXJlUHJvbWlzZScsIChnbG9iYWwsIFpvbmUsIGFwaSkgPT4ge1xuXHQgICAgICAgIGNvbnN0IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cdCAgICAgICAgY29uc3QgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cdCAgICAgICAgZnVuY3Rpb24gcmVhZGFibGVPYmplY3RUb1N0cmluZyhvYmopIHtcblx0ICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmoudG9TdHJpbmcgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IubmFtZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAoY2xhc3NOYW1lID8gY2xhc3NOYW1lIDogJycpICsgJzogJyArIEpTT04uc3RyaW5naWZ5KG9iaik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgcmV0dXJuIG9iaiA/IG9iai50b1N0cmluZygpIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IF9fc3ltYm9sX18gPSBhcGkuc3ltYm9sO1xuXHQgICAgICAgIGNvbnN0IF91bmNhdWdodFByb21pc2VFcnJvcnMgPSBbXTtcblx0ICAgICAgICBjb25zdCBpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiA9IGdsb2JhbFtfX3N5bWJvbF9fKCdESVNBQkxFX1dSQVBQSU5HX1VOQ0FVR0hUX1BST01JU0VfUkVKRUNUSU9OJyldICE9PSBmYWxzZTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7XG5cdCAgICAgICAgY29uc3QgY3JlYXRpb25UcmFjZSA9ICdfX2NyZWF0aW9uVHJhY2VfXyc7XG5cdCAgICAgICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IgPSAoZSkgPT4ge1xuXHQgICAgICAgICAgICBpZiAoYXBpLnNob3dVbmNhdWdodEVycm9yKCkpIHtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IGUgJiYgZS5yZWplY3Rpb247XG5cdCAgICAgICAgICAgICAgICBpZiAocmVqZWN0aW9uKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5oYW5kbGVkIFByb21pc2UgcmVqZWN0aW9uOicsIHJlamVjdGlvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVqZWN0aW9uLm1lc3NhZ2UgOiByZWplY3Rpb24sICc7IFpvbmU6JywgZS56b25lLm5hbWUsICc7IFRhc2s6JywgZS50YXNrICYmIGUudGFzay5zb3VyY2UsICc7IFZhbHVlOicsIHJlamVjdGlvbiwgcmVqZWN0aW9uIGluc3RhbmNlb2YgRXJyb3IgPyByZWplY3Rpb24uc3RhY2sgOiB1bmRlZmluZWQpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgYXBpLm1pY3JvdGFza0RyYWluRG9uZSA9ICgpID0+IHtcblx0ICAgICAgICAgICAgd2hpbGUgKF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB1bmNhdWdodFByb21pc2VFcnJvciA9IF91bmNhdWdodFByb21pc2VFcnJvcnMuc2hpZnQoKTtcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZS5ydW5HdWFyZGVkKCgpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuY2F1Z2h0UHJvbWlzZUVycm9yLnRocm93T3JpZ2luYWwpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0UHJvbWlzZUVycm9yLnJlamVjdGlvbjtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodFByb21pc2VFcnJvcjtcblx0ICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuXHQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlcnJvcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICB9O1xuXHQgICAgICAgIGNvbnN0IFVOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTCA9IF9fc3ltYm9sX18oJ3VuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gaGFuZGxlVW5oYW5kbGVkUmVqZWN0aW9uKGUpIHtcblx0ICAgICAgICAgICAgYXBpLm9uVW5oYW5kbGVkRXJyb3IoZSk7XG5cdCAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gWm9uZVtVTkhBTkRMRURfUFJPTUlTRV9SRUpFQ1RJT05fSEFORExFUl9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlKSB7XG5cdCAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJztcblx0ICAgICAgICB9XG5cdCAgICAgICAgZnVuY3Rpb24gZm9yd2FyZFJlc29sdXRpb24odmFsdWUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVqZWN0aW9uKHJlamVjdGlvbikge1xuXHQgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgc3ltYm9sU3RhdGUgPSBfX3N5bWJvbF9fKCdzdGF0ZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFZhbHVlID0gX19zeW1ib2xfXygndmFsdWUnKTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xGaW5hbGx5ID0gX19zeW1ib2xfXygnZmluYWxseScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFBhcmVudFByb21pc2VWYWx1ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VWYWx1ZScpO1xuXHQgICAgICAgIGNvbnN0IHN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VTdGF0ZScpO1xuXHQgICAgICAgIGNvbnN0IHNvdXJjZSA9ICdQcm9taXNlLnRoZW4nO1xuXHQgICAgICAgIGNvbnN0IFVOUkVTT0xWRUQgPSBudWxsO1xuXHQgICAgICAgIGNvbnN0IFJFU09MVkVEID0gdHJ1ZTtcblx0ICAgICAgICBjb25zdCBSRUpFQ1RFRCA9IGZhbHNlO1xuXHQgICAgICAgIGNvbnN0IFJFSkVDVEVEX05PX0NBVENIID0gMDtcblx0ICAgICAgICBmdW5jdGlvbiBtYWtlUmVzb2x2ZXIocHJvbWlzZSwgc3RhdGUpIHtcblx0ICAgICAgICAgICAgcmV0dXJuICh2KSA9PiB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHN0YXRlLCB2KTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIERvIG5vdCByZXR1cm4gdmFsdWUgb3IgeW91IHdpbGwgYnJlYWsgdGhlIFByb21pc2Ugc3BlYy5cblx0ICAgICAgICAgICAgfTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgY29uc3Qgb25jZSA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgbGV0IHdhc0NhbGxlZCA9IGZhbHNlO1xuXHQgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlcih3cmFwcGVkRnVuY3Rpb24pIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbGxlZCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEZ1bmN0aW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG5cdCAgICAgICAgICAgICAgICB9O1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgY29uc3QgVFlQRV9FUlJPUiA9ICdQcm9taXNlIHJlc29sdmVkIHdpdGggaXRzZWxmJztcblx0ICAgICAgICBjb25zdCBDVVJSRU5UX1RBU0tfVFJBQ0VfU1lNQk9MID0gX19zeW1ib2xfXygnY3VycmVudFRhc2tUcmFjZScpO1xuXHQgICAgICAgIC8vIFByb21pc2UgUmVzb2x1dGlvblxuXHQgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVQcm9taXNlKHByb21pc2UsIHN0YXRlLCB2YWx1ZSkge1xuXHQgICAgICAgICAgICBjb25zdCBvbmNlV3JhcHBlciA9IG9uY2UoKTtcblx0ICAgICAgICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG5cdCAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFRZUEVfRVJST1IpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgZ2V0IHZhbHVlLnRoZW4gb25jZSBiYXNlZCBvbiBwcm9taXNlIHNwZWMuXG5cdCAgICAgICAgICAgICAgICBsZXQgdGhlbiA9IG51bGw7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGVuID0gdmFsdWUgJiYgdmFsdWUudGhlbjtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTtcblx0ICAgICAgICAgICAgICAgICAgICB9KSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgLy8gaWYgKHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBSRUpFQ1RFRCAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFN0YXRlKSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFZhbHVlKSAmJlxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlW3N5bWJvbFN0YXRlXSAhPT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCB2YWx1ZVtzeW1ib2xTdGF0ZV0sIHZhbHVlW3N5bWJvbFZhbHVlXSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBzdGF0ZSkpLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgZmFsc2UpKSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoKCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pKCk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBzdGF0ZTtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWV1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sRmluYWxseV0gPT09IHN5bWJvbEZpbmFsbHkpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGJ5IFByb21pc2UucHJvdG90eXBlLmZpbmFsbHlcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlIGlzIHJlc29sdmVkLCBzaG91bGQgaWdub3JlIHRoZSB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZSBwYXJlbnQgcHJvbWlzZSB2YWx1ZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBwcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VTdGF0ZV07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IHByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGFzayBpbmZvcm1hdGlvbiBpbiB2YWx1ZSB3aGVuIGVycm9yIG9jY3Vycywgc28gd2UgY2FuXG5cdCAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyByZW5kZXIgbG9uZ1N0YWNrVHJhY2Vcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEICYmIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgbG9uZ1N0YWNrVHJhY2Vab25lIGlzIGhlcmVcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhY2UgPSBab25lLmN1cnJlbnRUYXNrICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBab25lLmN1cnJlbnRUYXNrLmRhdGEgJiZcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpvbmUuY3VycmVudFRhc2suZGF0YVtjcmVhdGlvblRyYWNlXTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGtlZXAgdGhlIGxvbmcgc3RhY2sgdHJhY2UgaW50byBlcnJvciB3aGVuIGluIGxvbmdTdGFja1RyYWNlWm9uZVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkodmFsdWUsIENVUlJFTlRfVEFTS19UUkFDRV9TWU1CT0wsIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRyYWNlLFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7KSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHByb21pc2UsIHF1ZXVlW2krK10sIHF1ZXVlW2krK10sIHF1ZXVlW2krK10sIHF1ZXVlW2krK10pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09IDAgJiYgc3RhdGUgPT0gUkVKRUNURUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBSRUpFQ1RFRF9OT19DQVRDSDtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIHRocm93cyBhIG5ldyBFcnJvciB0byBwcmludCBtb3JlIHJlYWRhYmxlIGVycm9yIGxvZ1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlmIHRoZSB2YWx1ZSBpcyBub3QgYW4gZXJyb3IsIHpvbmUuanMgYnVpbGRzIGFuIGBFcnJvcmBcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9iamVjdCBoZXJlIHRvIGF0dGFjaCB0aGUgc3RhY2sgaW5mb3JtYXRpb24uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuY2F1Z2h0IChpbiBwcm9taXNlKTogJyArXG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgK1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAmJiB2YWx1ZS5zdGFjayA/ICdcXG4nICsgdmFsdWUuc3RhY2sgOiAnJykpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gZXJyO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZGlzYWJsZSB3cmFwcGluZyB1bmNhdWdodCBwcm9taXNlIHJlamVjdFxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHdyYXBwaW5nIGl0LlxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IudGhyb3dPcmlnaW5hbCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IucmVqZWN0aW9uID0gdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnByb21pc2UgPSBwcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci56b25lID0gWm9uZS5jdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci50YXNrID0gWm9uZS5jdXJyZW50VGFzaztcblx0ICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5wdXNoKHVuY2F1Z2h0UHJvbWlzZUVycm9yKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgYXBpLnNjaGVkdWxlTWljcm9UYXNrKCk7IC8vIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHJ1bm5pbmdcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgLy8gUmVzb2x2aW5nIGFuIGFscmVhZHkgcmVzb2x2ZWQgcHJvbWlzZSBpcyBhIG5vb3AuXG5cdCAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBjb25zdCBSRUpFQ1RJT05fSEFORExFRF9IQU5ETEVSID0gX19zeW1ib2xfXygncmVqZWN0aW9uSGFuZGxlZEhhbmRsZXInKTtcblx0ICAgICAgICBmdW5jdGlvbiBjbGVhclJlamVjdGVkTm9DYXRjaChwcm9taXNlKSB7XG5cdCAgICAgICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gUkVKRUNURURfTk9fQ0FUQ0gpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIG5vIGNhdGNoIHN0YXR1c1xuXHQgICAgICAgICAgICAgICAgLy8gYW5kIHF1ZXVlLmxlbmd0aCA+IDAsIG1lYW5zIHRoZXJlIGlzIGEgZXJyb3IgaGFuZGxlclxuXHQgICAgICAgICAgICAgICAgLy8gaGVyZSB0byBoYW5kbGUgdGhlIHJlamVjdGVkIHByb21pc2UsIHdlIHNob3VsZCB0cmlnZ2VyXG5cdCAgICAgICAgICAgICAgICAvLyB3aW5kb3dzLnJlamVjdGlvbmhhbmRsZWQgZXZlbnRIYW5kbGVyIG9yIG5vZGVqcyByZWplY3Rpb25IYW5kbGVkXG5cdCAgICAgICAgICAgICAgICAvLyBldmVudEhhbmRsZXJcblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IFpvbmVbUkVKRUNUSU9OX0hBTkRMRURfSEFORExFUl07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIHsgcmVqZWN0aW9uOiBwcm9taXNlW3N5bWJvbFZhbHVlXSwgcHJvbWlzZTogcHJvbWlzZSB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7IH1cblx0ICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gUkVKRUNURUQ7XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoOyBpKyspIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZSA9PT0gX3VuY2F1Z2h0UHJvbWlzZUVycm9yc1tpXS5wcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIF91bmNhdWdodFByb21pc2VFcnJvcnMuc3BsaWNlKGksIDEpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBmdW5jdGlvbiBzY2hlZHVsZVJlc29sdmVPclJlamVjdChwcm9taXNlLCB6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdCAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHByb21pc2UpO1xuXHQgICAgICAgICAgICBjb25zdCBwcm9taXNlU3RhdGUgPSBwcm9taXNlW3N5bWJvbFN0YXRlXTtcblx0ICAgICAgICAgICAgY29uc3QgZGVsZWdhdGUgPSBwcm9taXNlU3RhdGVcblx0ICAgICAgICAgICAgICAgID8gdHlwZW9mIG9uRnVsZmlsbGVkID09PSAnZnVuY3Rpb24nXG5cdCAgICAgICAgICAgICAgICAgICAgPyBvbkZ1bGZpbGxlZFxuXHQgICAgICAgICAgICAgICAgICAgIDogZm9yd2FyZFJlc29sdXRpb25cblx0ICAgICAgICAgICAgICAgIDogdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbidcblx0ICAgICAgICAgICAgICAgICAgICA/IG9uUmVqZWN0ZWRcblx0ICAgICAgICAgICAgICAgICAgICA6IGZvcndhcmRSZWplY3Rpb247XG5cdCAgICAgICAgICAgIHpvbmUuc2NoZWR1bGVNaWNyb1Rhc2soc291cmNlLCAoKSA9PiB7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFByb21pc2VWYWx1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdO1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmluYWxseVByb21pc2UgPSAhIWNoYWluUHJvbWlzZSAmJiBzeW1ib2xGaW5hbGx5ID09PSBjaGFpblByb21pc2Vbc3ltYm9sRmluYWxseV07XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluYWxseVByb21pc2UpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGZyb20gZmluYWxseSBjYWxsLCBrZWVwIHBhcmVudCBwcm9taXNlJ3Mgc3RhdGUgYW5kIHZhbHVlXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWVdID0gcGFyZW50UHJvbWlzZVZhbHVlO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlXSA9IHByb21pc2VTdGF0ZTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBwYXNzIHZhbHVlIHRvIGZpbmFsbHkgY2FsbGJhY2tcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHpvbmUucnVuKGRlbGVnYXRlLCB1bmRlZmluZWQsIGlzRmluYWxseVByb21pc2UgJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZWplY3Rpb24gJiYgZGVsZWdhdGUgIT09IGZvcndhcmRSZXNvbHV0aW9uXG5cdCAgICAgICAgICAgICAgICAgICAgICAgID8gW11cblx0ICAgICAgICAgICAgICAgICAgICAgICAgOiBbcGFyZW50UHJvbWlzZVZhbHVlXSk7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UoY2hhaW5Qcm9taXNlLCB0cnVlLCB2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICAvLyBpZiBlcnJvciBvY2N1cnMsIHNob3VsZCBhbHdheXMgcmV0dXJuIHRoaXMgZXJyb3Jcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShjaGFpblByb21pc2UsIGZhbHNlLCBlcnJvcik7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIH0sIGNoYWluUHJvbWlzZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGNvbnN0IFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkcgPSAnZnVuY3Rpb24gWm9uZUF3YXJlUHJvbWlzZSgpIHsgW25hdGl2ZSBjb2RlXSB9Jztcblx0ICAgICAgICBjb25zdCBub29wID0gZnVuY3Rpb24gKCkgeyB9O1xuXHQgICAgICAgIGNvbnN0IEFnZ3JlZ2F0ZUVycm9yID0gZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yO1xuXHQgICAgICAgIGNsYXNzIFpvbmVBd2FyZVByb21pc2Uge1xuXHQgICAgICAgICAgICBzdGF0aWMgdG9TdHJpbmcoKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gWk9ORV9BV0FSRV9QUk9NSVNFX1RPX1NUUklORztcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmVzb2x2ZSh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlUHJvbWlzZShuZXcgdGhpcyhudWxsKSwgUkVTT0xWRUQsIHZhbHVlKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmVqZWN0KGVycm9yKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVByb21pc2UobmV3IHRoaXMobnVsbCksIFJFSkVDVEVELCBlcnJvcik7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RhdGljIHdpdGhSZXNvbHZlcnMoKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblx0ICAgICAgICAgICAgICAgIHJlc3VsdC5wcm9taXNlID0gbmV3IFpvbmVBd2FyZVByb21pc2UoKHJlcywgcmVqKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc29sdmUgPSByZXM7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlamVjdCA9IHJlajtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgYW55KHZhbHVlcykge1xuXHQgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXMgfHwgdHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblx0ICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHYgb2YgdmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goWm9uZUF3YXJlUHJvbWlzZS5yZXNvbHZlKHYpKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBBZ2dyZWdhdGVFcnJvcihbXSwgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9uZUF3YXJlUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9taXNlcy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlc1tpXS50aGVuKCh2KSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWQpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHYpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlcnIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQtLTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgJ0FsbCBwcm9taXNlcyB3ZXJlIHJlamVjdGVkJykpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgcmFjZSh2YWx1ZXMpIHtcblx0ICAgICAgICAgICAgICAgIGxldCByZXNvbHZlO1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlamVjdDtcblx0ICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gbmV3IHRoaXMoKHJlcywgcmVqKSA9PiB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcblx0ICAgICAgICAgICAgICAgICAgICByZWplY3QgPSByZWo7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVzb2x2ZSh2YWx1ZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZnVuY3Rpb24gb25SZWplY3QoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RoZW5hYmxlKHZhbHVlKSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmVzb2x2ZSh2YWx1ZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBzdGF0aWMgYWxsKHZhbHVlcykge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVBd2FyZVByb21pc2UuYWxsV2l0aENhbGxiYWNrKHZhbHVlcyk7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgc3RhdGljIGFsbFNldHRsZWQodmFsdWVzKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBQID0gdGhpcyAmJiB0aGlzLnByb3RvdHlwZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UgPyB0aGlzIDogWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiBQLmFsbFdpdGhDYWxsYmFjayh2YWx1ZXMsIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGVuQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWUgfSksXG5cdCAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjazogKGVycikgPT4gKHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVyciB9KSxcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHN0YXRpYyBhbGxXaXRoQ2FsbGJhY2sodmFsdWVzLCBjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlc29sdmU7XG5cdCAgICAgICAgICAgICAgICBsZXQgcmVqZWN0O1xuXHQgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSBuZXcgdGhpcygocmVzLCByZWopID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlID0gcmVzO1xuXHQgICAgICAgICAgICAgICAgICAgIHJlamVjdCA9IHJlajtcblx0ICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgLy8gU3RhcnQgYXQgMiB0byBwcmV2ZW50IHByZW1hdHVyZWx5IHJlc29sdmluZyBpZiAudGhlbiBpcyBjYWxsZWQgaW1tZWRpYXRlbHkuXG5cdCAgICAgICAgICAgICAgICBsZXQgdW5yZXNvbHZlZENvdW50ID0gMjtcblx0ICAgICAgICAgICAgICAgIGxldCB2YWx1ZUluZGV4ID0gMDtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWVzID0gW107XG5cdCAgICAgICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVGhlbmFibGUodmFsdWUpKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZXNvbHZlKHZhbHVlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyVmFsdWVJbmRleCA9IHZhbHVlSW5kZXg7XG5cdCAgICAgICAgICAgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudGhlbigodmFsdWUpID0+IHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWVzW2N1clZhbHVlSW5kZXhdID0gY2FsbGJhY2sgPyBjYWxsYmFjay50aGVuQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlc29sdmVkQ291bnQtLTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZXNbY3VyVmFsdWVJbmRleF0gPSBjYWxsYmFjay5lcnJvckNhbGxiYWNrKGVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50LS07XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVucmVzb2x2ZWRDb3VudCA9PT0gMCkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBjYXRjaCAodGhlbkVycikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QodGhlbkVycik7XG5cdCAgICAgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudCsrO1xuXHQgICAgICAgICAgICAgICAgICAgIHZhbHVlSW5kZXgrKztcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHVucmVzb2x2ZWRDb3VudCB6ZXJvLWJhc2VkIGFnYWluLlxuXHQgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50IC09IDI7XG5cdCAgICAgICAgICAgICAgICBpZiAodW5yZXNvbHZlZENvdW50ID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBjb25zdHJ1Y3RvcihleGVjdXRvcikge1xuXHQgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXM7XG5cdCAgICAgICAgICAgICAgICBpZiAoIShwcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgYmUgYW4gaW5zdGFuY2VvZiBQcm9taXNlLicpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBVTlJFU09MVkVEO1xuXHQgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xWYWx1ZV0gPSBbXTsgLy8gcXVldWU7XG5cdCAgICAgICAgICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uY2VXcmFwcGVyID0gb25jZSgpO1xuXHQgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yICYmXG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yKG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBSRVNPTFZFRCkpLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgUkVKRUNURUQpKSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcblx0ICAgICAgICAgICAgICAgIHJldHVybiAnUHJvbWlzZSc7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgZ2V0IFtTeW1ib2wuc3BlY2llc10oKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHJlYWQgYFN5bWJvbC5zcGVjaWVzYCBzYWZlbHkgYmVjYXVzZSBgdGhpc2AgbWF5IGJlIGFueXRoaW5nLiBGb3IgaW5zdGFuY2UsIGB0aGlzYFxuXHQgICAgICAgICAgICAgICAgLy8gbWF5IGJlIGFuIG9iamVjdCB3aXRob3V0IGEgcHJvdG90eXBlIChjcmVhdGVkIHRocm91Z2ggYE9iamVjdC5jcmVhdGUobnVsbClgKTsgdGh1c1xuXHQgICAgICAgICAgICAgICAgLy8gYHRoaXMuY29uc3RydWN0b3JgIHdpbGwgYmUgdW5kZWZpbmVkLiBPbmUgb2YgdGhlIHVzZSBjYXNlcyBpcyBTeXN0ZW1KUyBjcmVhdGluZ1xuXHQgICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLWxlc3Mgb2JqZWN0cyAobW9kdWxlcykgdmlhIGBPYmplY3QuY3JlYXRlKG51bGwpYC4gVGhlIFN5c3RlbUpTIGNyZWF0ZXMgYW4gZW1wdHlcblx0ICAgICAgICAgICAgICAgIC8vIG9iamVjdCBhbmQgY29waWVzIHByb21pc2UgcHJvcGVydGllcyBpbnRvIHRoYXQgb2JqZWN0ICh3aXRoaW4gdGhlIGBnZXRPckNyZWF0ZUxvYWRgXG5cdCAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbikuIFRoZSB6b25lLmpzIHRoZW4gY2hlY2tzIGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBoYXMgdGhlIGB0aGVuYCBtZXRob2QgYW5kXG5cdCAgICAgICAgICAgICAgICAvLyBpbnZva2VzIGl0IHdpdGggdGhlIGB2YWx1ZWAgY29udGV4dC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3I6IGBUeXBlRXJyb3I6XG5cdCAgICAgICAgICAgICAgICAvLyBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZCAocmVhZGluZyAnU3ltYm9sKFN5bWJvbC5zcGVjaWVzKScpYC5cblx0ICAgICAgICAgICAgICAgIGxldCBDID0gdGhpcy5jb25zdHJ1Y3Rvcj8uW1N5bWJvbC5zcGVjaWVzXTtcblx0ICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICAgICAgICAgIEMgPSB0aGlzLmNvbnN0cnVjdG9yIHx8IFpvbmVBd2FyZVByb21pc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTtcblx0ICAgICAgICAgICAgICAgIGNvbnN0IHpvbmUgPSBab25lLmN1cnJlbnQ7XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpc1tzeW1ib2xTdGF0ZV0gPT0gVU5SRVNPTFZFRCkge1xuXHQgICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sVmFsdWVdLnB1c2goem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdCh0aGlzLCB6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiBjaGFpblByb21pc2U7XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY2F0Y2gob25SZWplY3RlZCkge1xuXHQgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBmaW5hbGx5KG9uRmluYWxseSkge1xuXHQgICAgICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgb24gdGhlIGNhbGwgdG8gYHRoZW5gIGFib3V0IHdoeSB0aGVlIGBTeW1ib2wuc3BlY2llc2AgaXMgc2FmZWx5IGFjY2Vzc2VkLlxuXHQgICAgICAgICAgICAgICAgbGV0IEMgPSB0aGlzLmNvbnN0cnVjdG9yPy5bU3ltYm9sLnNwZWNpZXNdO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFDIHx8IHR5cGVvZiBDICE9PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgQyA9IFpvbmVBd2FyZVByb21pc2U7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjb25zdCBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTtcblx0ICAgICAgICAgICAgICAgIGNoYWluUHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9IHN5bWJvbEZpbmFsbHk7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB6b25lID0gWm9uZS5jdXJyZW50O1xuXHQgICAgICAgICAgICAgICAgaWYgKHRoaXNbc3ltYm9sU3RhdGVdID09IFVOUkVTT0xWRUQpIHtcblx0ICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbFZhbHVlXS5wdXNoKHpvbmUsIGNoYWluUHJvbWlzZSwgb25GaW5hbGx5LCBvbkZpbmFsbHkpO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgZWxzZSB7XG5cdCAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QodGhpcywgem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZpbmFsbHksIG9uRmluYWxseSk7XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gY2hhaW5Qcm9taXNlO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCBhZ2dyZXNzaXZlIG9wdGltaXplcnMgZHJvcHBpbmcgc2VlbWluZ2x5IHVudXNlZCBwcm9wZXJ0aWVzLlxuXHQgICAgICAgIC8vIEUuZy4gQ2xvc3VyZSBDb21waWxlciBpbiBhZHZhbmNlZCBtb2RlLlxuXHQgICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3Jlc29sdmUnXSA9IFpvbmVBd2FyZVByb21pc2UucmVzb2x2ZTtcblx0ICAgICAgICBab25lQXdhcmVQcm9taXNlWydyZWplY3QnXSA9IFpvbmVBd2FyZVByb21pc2UucmVqZWN0O1xuXHQgICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3JhY2UnXSA9IFpvbmVBd2FyZVByb21pc2UucmFjZTtcblx0ICAgICAgICBab25lQXdhcmVQcm9taXNlWydhbGwnXSA9IFpvbmVBd2FyZVByb21pc2UuYWxsO1xuXHQgICAgICAgIGNvbnN0IE5hdGl2ZVByb21pc2UgPSAoZ2xvYmFsW3N5bWJvbFByb21pc2VdID0gZ2xvYmFsWydQcm9taXNlJ10pO1xuXHQgICAgICAgIGdsb2JhbFsnUHJvbWlzZSddID0gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgICAgICBjb25zdCBzeW1ib2xUaGVuUGF0Y2hlZCA9IF9fc3ltYm9sX18oJ3RoZW5QYXRjaGVkJyk7XG5cdCAgICAgICAgZnVuY3Rpb24gcGF0Y2hUaGVuKEN0b3IpIHtcblx0ICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBDdG9yLnByb3RvdHlwZTtcblx0ICAgICAgICAgICAgY29uc3QgcHJvcCA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgJ3RoZW4nKTtcblx0ICAgICAgICAgICAgaWYgKHByb3AgJiYgKHByb3Aud3JpdGFibGUgPT09IGZhbHNlIHx8ICFwcm9wLmNvbmZpZ3VyYWJsZSkpIHtcblx0ICAgICAgICAgICAgICAgIC8vIGNoZWNrIEN0b3IucHJvdG90eXBlLnRoZW4gcHJvcGVydHlEZXNjcmlwdG9yIGlzIHdyaXRhYmxlIG9yIG5vdFxuXHQgICAgICAgICAgICAgICAgLy8gaW4gbWV0ZW9yIGVudiwgd3JpdGFibGUgaXMgZmFsc2UsIHdlIHNob3VsZCBpZ25vcmUgc3VjaCBjYXNlXG5cdCAgICAgICAgICAgICAgICByZXR1cm47XG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUaGVuID0gcHJvdG8udGhlbjtcblx0ICAgICAgICAgICAgLy8gS2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgbWV0aG9kLlxuXHQgICAgICAgICAgICBwcm90b1tzeW1ib2xUaGVuXSA9IG9yaWdpbmFsVGhlbjtcblx0ICAgICAgICAgICAgQ3Rvci5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChvblJlc29sdmUsIG9uUmVqZWN0KSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkID0gbmV3IFpvbmVBd2FyZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHQgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVGhlbi5jYWxsKHRoaXMsIHJlc29sdmUsIHJlamVjdCk7XG5cdCAgICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLnRoZW4ob25SZXNvbHZlLCBvblJlamVjdCk7XG5cdCAgICAgICAgICAgIH07XG5cdCAgICAgICAgICAgIEN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdID0gdHJ1ZTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXBpLnBhdGNoVGhlbiA9IHBhdGNoVGhlbjtcblx0ICAgICAgICBmdW5jdGlvbiB6b25laWZ5KGZuKSB7XG5cdCAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuXHQgICAgICAgICAgICAgICAgbGV0IHJlc3VsdFByb21pc2UgPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblx0ICAgICAgICAgICAgICAgIGlmIChyZXN1bHRQcm9taXNlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xuXHQgICAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICAgICAgbGV0IGN0b3IgPSByZXN1bHRQcm9taXNlLmNvbnN0cnVjdG9yO1xuXHQgICAgICAgICAgICAgICAgaWYgKCFjdG9yW3N5bWJvbFRoZW5QYXRjaGVkXSkge1xuXHQgICAgICAgICAgICAgICAgICAgIHBhdGNoVGhlbihjdG9yKTtcblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xuXHQgICAgICAgICAgICB9O1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoTmF0aXZlUHJvbWlzZSkge1xuXHQgICAgICAgICAgICBwYXRjaFRoZW4oTmF0aXZlUHJvbWlzZSk7XG5cdCAgICAgICAgICAgIHBhdGNoTWV0aG9kKGdsb2JhbCwgJ2ZldGNoJywgKGRlbGVnYXRlKSA9PiB6b25laWZ5KGRlbGVnYXRlKSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIC8vIFRoaXMgaXMgbm90IHBhcnQgb2YgcHVibGljIEFQSSwgYnV0IGl0IGlzIHVzZWZ1bCBmb3IgdGVzdHMsIHNvIHdlIGV4cG9zZSBpdC5cblx0ICAgICAgICBQcm9taXNlW1pvbmUuX19zeW1ib2xfXygndW5jYXVnaHRQcm9taXNlRXJyb3JzJyldID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycztcblx0ICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hUb1N0cmluZyhab25lKSB7XG5cdCAgICAvLyBvdmVycmlkZSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgdG8gbWFrZSB6b25lLmpzIHBhdGNoZWQgZnVuY3Rpb25cblx0ICAgIC8vIGxvb2sgbGlrZSBuYXRpdmUgZnVuY3Rpb25cblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCd0b1N0cmluZycsIChnbG9iYWwpID0+IHtcblx0ICAgICAgICAvLyBwYXRjaCBGdW5jLnByb3RvdHlwZS50b1N0cmluZyB0byBsZXQgdGhlbSBsb29rIGxpa2UgbmF0aXZlXG5cdCAgICAgICAgY29uc3Qgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuXHQgICAgICAgIGNvbnN0IE9SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTCA9IHpvbmVTeW1ib2woJ09yaWdpbmFsRGVsZWdhdGUnKTtcblx0ICAgICAgICBjb25zdCBQUk9NSVNFX1NZTUJPTCA9IHpvbmVTeW1ib2woJ1Byb21pc2UnKTtcblx0ICAgICAgICBjb25zdCBFUlJPUl9TWU1CT0wgPSB6b25lU3ltYm9sKCdFcnJvcicpO1xuXHQgICAgICAgIGNvbnN0IG5ld0Z1bmN0aW9uVG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlbGVnYXRlID0gdGhpc1tPUklHSU5BTF9ERUxFR0FURV9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGVsZWdhdGUpIHtcblx0ICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsRGVsZWdhdGUgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKG9yaWdpbmFsRGVsZWdhdGUpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICBlbHNlIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcmlnaW5hbERlbGVnYXRlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gUHJvbWlzZSkge1xuXHQgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZVByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVQcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbChuYXRpdmVQcm9taXNlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gRXJyb3IpIHtcblx0ICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVFcnJvciA9IGdsb2JhbFtFUlJPUl9TWU1CT0xdO1xuXHQgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVFcnJvcikge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwobmF0aXZlRXJyb3IpO1xuXHQgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgfTtcblx0ICAgICAgICBuZXdGdW5jdGlvblRvU3RyaW5nW09SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTF0gPSBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmc7XG5cdCAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbmV3RnVuY3Rpb25Ub1N0cmluZztcblx0ICAgICAgICAvLyBwYXRjaCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIHRvIGxldCB0aGVtIGxvb2sgbGlrZSBuYXRpdmVcblx0ICAgICAgICBjb25zdCBvcmlnaW5hbE9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0ICAgICAgICBjb25zdCBQUk9NSVNFX09CSkVDVF9UT19TVFJJTkcgPSAnW29iamVjdCBQcm9taXNlXSc7XG5cdCAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlID09PSAnZnVuY3Rpb24nICYmIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE9iamVjdFRvU3RyaW5nLmNhbGwodGhpcyk7XG5cdCAgICAgICAgfTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDYWxsYmFja3MoYXBpLCB0YXJnZXQsIHRhcmdldE5hbWUsIG1ldGhvZCwgY2FsbGJhY2tzKSB7XG5cdCAgICBjb25zdCBzeW1ib2wgPSBab25lLl9fc3ltYm9sX18obWV0aG9kKTtcblx0ICAgIGlmICh0YXJnZXRbc3ltYm9sXSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGNvbnN0IG5hdGl2ZURlbGVnYXRlID0gKHRhcmdldFtzeW1ib2xdID0gdGFyZ2V0W21ldGhvZF0pO1xuXHQgICAgdGFyZ2V0W21ldGhvZF0gPSBmdW5jdGlvbiAobmFtZSwgb3B0cywgb3B0aW9ucykge1xuXHQgICAgICAgIGlmIChvcHRzICYmIG9wdHMucHJvdG90eXBlKSB7XG5cdCAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuXHQgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYCR7dGFyZ2V0TmFtZX0uJHttZXRob2R9OjpgICsgY2FsbGJhY2s7XG5cdCAgICAgICAgICAgICAgICBjb25zdCBwcm90b3R5cGUgPSBvcHRzLnByb3RvdHlwZTtcblx0ICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSBgcGF0Y2hDYWxsYmFja3NgIGlzIHVzZWQgZm9yIHBhdGNoaW5nIHRoZSBgZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50YCBhbmRcblx0ICAgICAgICAgICAgICAgIC8vIGBjdXN0b21FbGVtZW50cy5kZWZpbmVgLiBXZSBleHBsaWNpdGx5IHdyYXAgdGhlIHBhdGNoaW5nIGNvZGUgaW50byB0cnktY2F0Y2ggc2luY2Vcblx0ICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrcyBtYXkgYmUgYWxyZWFkeSBwYXRjaGVkIGJ5IG90aGVyIHdlYiBjb21wb25lbnRzIGZyYW1ld29ya3MgKGUuZy4gTFdDKSwgYW5kIHRoZXlcblx0ICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhvc2UgcHJvcGVydGllcyBub24td3JpdGFibGUuIFRoaXMgbWVhbnMgdGhhdCBwYXRjaGluZyBjYWxsYmFjayB3aWxsIHRocm93IGFuIGVycm9yXG5cdCAgICAgICAgICAgICAgICAvLyBgY2Fubm90IGFzc2lnbiB0byByZWFkLW9ubHkgcHJvcGVydHlgLiBTZWUgdGhpcyBjb2RlIGFzIGFuIGV4YW1wbGU6XG5cdCAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc2FsZXNmb3JjZS9sd2MvYmxvYi9tYXN0ZXIvcGFja2FnZXMvQGx3Yy9lbmdpbmUtY29yZS9zcmMvZnJhbWV3b3JrL2Jhc2UtYnJpZGdlLWVsZW1lbnQudHMjTDE4MC1MMTg2XG5cdCAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHN0b3AgdGhlIGFwcGxpY2F0aW9uIHJlbmRlcmluZyBpZiB3ZSBjb3VsZG4ndCBwYXRjaCBzb21lXG5cdCAgICAgICAgICAgICAgICAvLyBjYWxsYmFjaywgZS5nLiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYC5cblx0ICAgICAgICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShjYWxsYmFjaykpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBjYWxsYmFjayk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IudmFsdWUpIHtcblx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZShkZXNjcmlwdG9yLnZhbHVlLCBzb3VyY2UpO1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpLl9yZWRlZmluZVByb3BlcnR5KG9wdHMucHJvdG90eXBlLCBjYWxsYmFjaywgZGVzY3JpcHRvcik7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlW2NhbGxiYWNrXSA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKHByb3RvdHlwZVtjYWxsYmFja10sIHNvdXJjZSk7XG5cdCAgICAgICAgICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkge1xuXHQgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3R5cGVbY2FsbGJhY2tdID0gYXBpLndyYXBXaXRoQ3VycmVudFpvbmUocHJvdG90eXBlW2NhbGxiYWNrXSwgc291cmNlKTtcblx0ICAgICAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICB9XG5cdCAgICAgICAgICAgICAgICBjYXRjaCB7XG5cdCAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2UgbGVhdmUgdGhlIGNhdGNoIGJsb2NrIGVtcHR5IHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGhhbmRsZSB0aGUgZXJyb3IgcmVsYXRlZFxuXHQgICAgICAgICAgICAgICAgICAgIC8vIHRvIG5vbi13cml0YWJsZSBwcm9wZXJ0eS5cblx0ICAgICAgICAgICAgICAgIH1cblx0ICAgICAgICAgICAgfSk7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHJldHVybiBuYXRpdmVEZWxlZ2F0ZS5jYWxsKHRhcmdldCwgbmFtZSwgb3B0cywgb3B0aW9ucyk7XG5cdCAgICB9O1xuXHQgICAgYXBpLmF0dGFjaE9yaWdpblRvUGF0Y2hlZCh0YXJnZXRbbWV0aG9kXSwgbmF0aXZlRGVsZWdhdGUpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hVdGlsKFpvbmUpIHtcblx0ICAgIFpvbmUuX19sb2FkX3BhdGNoKCd1dGlsJywgKGdsb2JhbCwgWm9uZSwgYXBpKSA9PiB7XG5cdCAgICAgICAgLy8gQ29sbGVjdCBuYXRpdmUgZXZlbnQgbmFtZXMgYnkgbG9va2luZyBhdCBwcm9wZXJ0aWVzXG5cdCAgICAgICAgLy8gb24gdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGUuZy4gJ29uY2xpY2snLlxuXHQgICAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSBnZXRPbkV2ZW50TmFtZXMoZ2xvYmFsKTtcblx0ICAgICAgICBhcGkucGF0Y2hPblByb3BlcnRpZXMgPSBwYXRjaE9uUHJvcGVydGllcztcblx0ICAgICAgICBhcGkucGF0Y2hNZXRob2QgPSBwYXRjaE1ldGhvZDtcblx0ICAgICAgICBhcGkuYmluZEFyZ3VtZW50cyA9IGJpbmRBcmd1bWVudHM7XG5cdCAgICAgICAgYXBpLnBhdGNoTWFjcm9UYXNrID0gcGF0Y2hNYWNyb1Rhc2s7XG5cdCAgICAgICAgLy8gSW4gZWFybGllciB2ZXJzaW9uIG9mIHpvbmUuanMgKDwwLjkuMCksIHdlIHVzZSBlbnYgbmFtZSBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2Bcblx0ICAgICAgICAvLyB0byBkZWZpbmUgd2hpY2ggZXZlbnRzIHdpbGwgbm90IGJlIHBhdGNoZWQgYnkgYFpvbmUuanNgLiBJbiBuZXdlciB2ZXJzaW9uICg+PTAuOS4wKSwgd2Vcblx0ICAgICAgICAvLyBjaGFuZ2UgdGhlIGVudiBuYW1lIHRvIGBfX3pvbmVfc3ltYm9sX19VTlBBVENIRURfRVZFTlRTYCB0byBrZWVwIHRoZSBuYW1lIGNvbnNpc3RlbnQgd2l0aFxuXHQgICAgICAgIC8vIGFuZ3VsYXIgcmVwby4gVGhlICBgX196b25lX3N5bWJvbF9fQkxBQ0tfTElTVEVEX0VWRU5UU2AgaXMgZGVwcmVjYXRlZCwgYnV0IGl0IGlzIHN0aWxsIGJlXG5cdCAgICAgICAgLy8gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblx0ICAgICAgICBjb25zdCBTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UUyA9IFpvbmUuX19zeW1ib2xfXygnQkxBQ0tfTElTVEVEX0VWRU5UUycpO1xuXHQgICAgICAgIGNvbnN0IFNZTUJPTF9VTlBBVENIRURfRVZFTlRTID0gWm9uZS5fX3N5bWJvbF9fKCdVTlBBVENIRURfRVZFTlRTJyk7XG5cdCAgICAgICAgaWYgKGdsb2JhbFtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU10pIHtcblx0ICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSA9IGdsb2JhbFtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU107XG5cdCAgICAgICAgfVxuXHQgICAgICAgIGlmIChnbG9iYWxbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdKSB7XG5cdCAgICAgICAgICAgIFpvbmVbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdID0gWm9uZVtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU10gPVxuXHQgICAgICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUgPSBwYXRjaEV2ZW50UHJvdG90eXBlO1xuXHQgICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0ID0gcGF0Y2hFdmVudFRhcmdldDtcblx0ICAgICAgICBhcGkuaXNJRU9yRWRnZSA9IGlzSUVPckVkZ2U7XG5cdCAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5ID0gT2JqZWN0RGVmaW5lUHJvcGVydHk7XG5cdCAgICAgICAgYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblx0ICAgICAgICBhcGkuT2JqZWN0Q3JlYXRlID0gT2JqZWN0Q3JlYXRlO1xuXHQgICAgICAgIGFwaS5BcnJheVNsaWNlID0gQXJyYXlTbGljZTtcblx0ICAgICAgICBhcGkucGF0Y2hDbGFzcyA9IHBhdGNoQ2xhc3M7XG5cdCAgICAgICAgYXBpLndyYXBXaXRoQ3VycmVudFpvbmUgPSB3cmFwV2l0aEN1cnJlbnRab25lO1xuXHQgICAgICAgIGFwaS5maWx0ZXJQcm9wZXJ0aWVzID0gZmlsdGVyUHJvcGVydGllcztcblx0ICAgICAgICBhcGkuYXR0YWNoT3JpZ2luVG9QYXRjaGVkID0gYXR0YWNoT3JpZ2luVG9QYXRjaGVkO1xuXHQgICAgICAgIGFwaS5fcmVkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblx0ICAgICAgICBhcGkucGF0Y2hDYWxsYmFja3MgPSBwYXRjaENhbGxiYWNrcztcblx0ICAgICAgICBhcGkuZ2V0R2xvYmFsT2JqZWN0cyA9ICgpID0+ICh7XG5cdCAgICAgICAgICAgIGdsb2JhbFNvdXJjZXMsXG5cdCAgICAgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzLFxuXHQgICAgICAgICAgICBldmVudE5hbWVzLFxuXHQgICAgICAgICAgICBpc0Jyb3dzZXIsXG5cdCAgICAgICAgICAgIGlzTWl4LFxuXHQgICAgICAgICAgICBpc05vZGUsXG5cdCAgICAgICAgICAgIFRSVUVfU1RSLFxuXHQgICAgICAgICAgICBGQUxTRV9TVFIsXG5cdCAgICAgICAgICAgIFpPTkVfU1lNQk9MX1BSRUZJWCxcblx0ICAgICAgICAgICAgQUREX0VWRU5UX0xJU1RFTkVSX1NUUixcblx0ICAgICAgICAgICAgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUixcblx0ICAgICAgICB9KTtcblx0ICAgIH0pO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGF0Y2hDb21tb24oWm9uZSkge1xuXHQgICAgcGF0Y2hQcm9taXNlKFpvbmUpO1xuXHQgICAgcGF0Y2hUb1N0cmluZyhab25lKTtcblx0ICAgIHBhdGNoVXRpbChab25lKTtcblx0fVxuXG5cdGNvbnN0IFpvbmUkMSA9IGxvYWRab25lKCk7XG5cdHBhdGNoQ29tbW9uKFpvbmUkMSk7XG5cdHBhdGNoQnJvd3Nlcihab25lJDEpO1xuXHRyZXR1cm4gem9uZTtcbn1cblxucmVxdWlyZVpvbmUoKTtcblxuZXhwb3J0IHsgWm9uZUNvbnRleHRNYW5hZ2VyIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxVQUFvQjtBQXNCbEMsU0FBU0MsR0FBaUJDLEdBQUs7QUFDM0IsU0FBSUEsTUFBUSxXQUFVQSxJQUFNLENBQUMsSUFDckIsT0FBT0EsRUFBSSxvQkFBcUIsY0FDcEMsT0FBT0EsRUFBSSx1QkFBd0I7QUFDM0M7QUFtQkEsSUFBSUMsS0FBbUIsbUJBVW5CQztBQUFBO0FBQUEsRUFBb0MsV0FBWTtBQUNoRCxhQUFTQSxJQUFxQjtBQUkxQixXQUFLLFdBQVcsSUFJaEIsS0FBSyxlQUFlO0FBQUEsSUFDeEI7QUFLQSxXQUFBQSxFQUFtQixVQUFVLHlCQUF5QixTQUFVQyxHQUFZO0FBQ3hFLGFBQVFBLEtBQWNBLEVBQVcsSUFB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WSIsICJab25lQ29udGV4dE1hbmFnZXIiLCAiYWN0aXZlWm9uZSIsICJjb250ZXh0IiwgInRhcmdldCIsICJtYW5hZ2VyIiwgImNvbnRleHRXcmFwcGVyIiwgIl90aGlzIiwgImFyZ3MiLCAiX2kiLCAicmFuZG9tIiwgInpvbmVOYW1lIiwgIl9hIiwgIm9yaWdpbmFsIiwgImNvbnRleHRNYW5hZ2VyIiwgImV2ZW50IiwgImxpc3RlbmVyIiwgIm9wdHMiLCAibGlzdGVuZXJzIiwgInBhdGNoZWRMaXN0ZW5lciIsICJldmVudHMiLCAiYWN0aXZlIiwgImZuIiwgInRoaXNBcmciLCAibmV3Wm9uZSIsICJ6b25lIiwgImhhc1JlcXVpcmVkWm9uZSIsICJyZXF1aXJlWm9uZSIsICJnbG9iYWwiLCAiX19zeW1ib2xfXyIsICJuYW1lIiwgImluaXRab25lIiwgInBlcmZvcm1hbmNlIiwgIm1hcmsiLCAicGVyZm9ybWFuY2VNZWFzdXJlIiwgImxhYmVsIiwgIlpvbmVJbXBsIiwgInBhdGNoZXMiLCAiX2N1cnJlbnRab25lRnJhbWUiLCAiX2N1cnJlbnRUYXNrIiwgImlnbm9yZUR1cGxpY2F0ZSIsICJjaGVja0R1cGxpY2F0ZSIsICJwZXJmTmFtZSIsICJfYXBpIiwgInBhcmVudCIsICJ6b25lU3BlYyIsICJfWm9uZURlbGVnYXRlIiwgImtleSIsICJjdXJyZW50IiwgImNhbGxiYWNrIiwgInNvdXJjZSIsICJfY2FsbGJhY2siLCAiYXBwbHlUaGlzIiwgImFwcGx5QXJncyIsICJlcnJvciIsICJ0YXNrIiwgIk5PX1pPTkUiLCAiem9uZVRhc2siLCAidHlwZSIsICJpc1BlcmlvZGljIiwgImlzUmVmcmVzaGFibGUiLCAibm90U2NoZWR1bGVkIiwgImV2ZW50VGFzayIsICJtYWNyb1Rhc2siLCAicmVFbnRyeUd1YXJkIiwgInJ1bm5pbmciLCAic2NoZWR1bGVkIiwgInByZXZpb3VzVGFzayIsICJzdGF0ZSIsICJ1bmtub3duIiwgInNjaGVkdWxpbmciLCAiem9uZURlbGVnYXRlcyIsICJlcnIiLCAiZGF0YSIsICJjdXN0b21TY2hlZHVsZSIsICJab25lVGFzayIsICJtaWNyb1Rhc2siLCAiY3VzdG9tQ2FuY2VsIiwgImNhbmNlbGluZyIsICJjb3VudCIsICJpIiwgIkRFTEVHQVRFX1pTIiwgImRlbGVnYXRlIiwgIl8iLCAiaGFzVGFza1N0YXRlIiwgInBhcmVudERlbGVnYXRlIiwgInpvbmVTcGVjSGFzVGFzayIsICJwYXJlbnRIYXNUYXNrIiwgInRhcmdldFpvbmUiLCAicmV0dXJuVGFzayIsICJzY2hlZHVsZU1pY3JvVGFzayIsICJ2YWx1ZSIsICJpc0VtcHR5IiwgImNvdW50cyIsICJwcmV2IiwgIm5leHQiLCAib3B0aW9ucyIsICJzY2hlZHVsZUZuIiwgImNhbmNlbEZuIiwgInNlbGYiLCAiX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyIsICJkcmFpbk1pY3JvVGFza1F1ZXVlIiwgInRvU3RhdGUiLCAiZnJvbVN0YXRlMSIsICJmcm9tU3RhdGUyIiwgInN5bWJvbFNldFRpbWVvdXQiLCAic3ltYm9sUHJvbWlzZSIsICJzeW1ib2xUaGVuIiwgIl9taWNyb1Rhc2tRdWV1ZSIsICJfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlIiwgIm5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSIsICJuYXRpdmVTY2hlZHVsZU1pY3JvVGFzayIsICJmdW5jIiwgIm5hdGl2ZVRoZW4iLCAicXVldWUiLCAibm9vcCIsICJsb2FkWm9uZSIsICJPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCAiT2JqZWN0RGVmaW5lUHJvcGVydHkiLCAiT2JqZWN0R2V0UHJvdG90eXBlT2YiLCAiT2JqZWN0Q3JlYXRlIiwgIkFycmF5U2xpY2UiLCAiQUREX0VWRU5UX0xJU1RFTkVSX1NUUiIsICJSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSIiwgIlpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiIsICJaT05FX1NZTUJPTF9SRU1PVkVfRVZFTlRfTElTVEVORVIiLCAiVFJVRV9TVFIiLCAiRkFMU0VfU1RSIiwgIlpPTkVfU1lNQk9MX1BSRUZJWCIsICJ3cmFwV2l0aEN1cnJlbnRab25lIiwgInNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lIiwgInpvbmVTeW1ib2wiLCAiaXNXaW5kb3dFeGlzdHMiLCAiaW50ZXJuYWxXaW5kb3ciLCAiX2dsb2JhbCIsICJSRU1PVkVfQVRUUklCVVRFIiwgImJpbmRBcmd1bWVudHMiLCAicGF0Y2hQcm90b3R5cGUiLCAicHJvdG90eXBlIiwgImZuTmFtZXMiLCAicHJvdG90eXBlRGVzYyIsICJpc1Byb3BlcnR5V3JpdGFibGUiLCAicGF0Y2hlZCIsICJhdHRhY2hPcmlnaW5Ub1BhdGNoZWQiLCAicHJvcGVydHlEZXNjIiwgImlzV2ViV29ya2VyIiwgImlzTm9kZSIsICJpc0Jyb3dzZXIiLCAiaXNNaXgiLCAiem9uZVN5bWJvbEV2ZW50TmFtZXMkMSIsICJlbmFibGVCZWZvcmV1bmxvYWRTeW1ib2wiLCAid3JhcEZuIiwgImV2ZW50TmFtZVN5bWJvbCIsICJyZXN1bHQiLCAiZXJyb3JFdmVudCIsICJwYXRjaFByb3BlcnR5IiwgInByb3AiLCAiZGVzYyIsICJvblByb3BQYXRjaGVkU3ltYm9sIiwgIm9yaWdpbmFsRGVzY0dldCIsICJvcmlnaW5hbERlc2NTZXQiLCAiZXZlbnROYW1lIiwgIm5ld1ZhbHVlIiwgInBhdGNoT25Qcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiLCAib25Qcm9wZXJ0aWVzIiwgImoiLCAib3JpZ2luYWxJbnN0YW5jZUtleSIsICJwYXRjaENsYXNzIiwgImNsYXNzTmFtZSIsICJPcmlnaW5hbENsYXNzIiwgImEiLCAiaW5zdGFuY2UiLCAicGF0Y2hNZXRob2QiLCAicGF0Y2hGbiIsICJwcm90byIsICJkZWxlZ2F0ZU5hbWUiLCAicGF0Y2hEZWxlZ2F0ZSIsICJwYXRjaE1hY3JvVGFzayIsICJmdW5jTmFtZSIsICJtZXRhQ3JlYXRvciIsICJzZXROYXRpdmUiLCAic2NoZWR1bGVUYXNrIiwgIm1ldGEiLCAiaXNEZXRlY3RlZElFT3JFZGdlIiwgImllT3JFZGdlIiwgImlzSUVPckVkZ2UiLCAidWEiLCAiaXNGdW5jdGlvbiIsICJpc051bWJlciIsICJPUFRJTUlaRURfWk9ORV9FVkVOVF9UQVNLX0RBVEEiLCAiem9uZVN5bWJvbEV2ZW50TmFtZXMiLCAiZ2xvYmFsU291cmNlcyIsICJFVkVOVF9OQU1FX1NZTUJPTF9SRUdYIiwgIklNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0wiLCAicHJlcGFyZUV2ZW50TmFtZXMiLCAiZXZlbnROYW1lVG9TdHJpbmciLCAiZmFsc2VFdmVudE5hbWUiLCAidHJ1ZUV2ZW50TmFtZSIsICJzeW1ib2wiLCAic3ltYm9sQ2FwdHVyZSIsICJwYXRjaEV2ZW50VGFyZ2V0IiwgImFwaSIsICJhcGlzIiwgInBhdGNoT3B0aW9ucyIsICJBRERfRVZFTlRfTElTVEVORVIiLCAiUkVNT1ZFX0VWRU5UX0xJU1RFTkVSIiwgIkxJU1RFTkVSU19FVkVOVF9MSVNURU5FUiIsICJSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUiIsICJ6b25lU3ltYm9sQWRkRXZlbnRMaXN0ZW5lciIsICJBRERfRVZFTlRfTElTVEVORVJfU09VUkNFIiwgIlBSRVBFTkRfRVZFTlRfTElTVEVORVIiLCAiUFJFUEVORF9FVkVOVF9MSVNURU5FUl9TT1VSQ0UiLCAiaW52b2tlVGFzayIsICJnbG9iYWxDYWxsYmFjayIsICJpc0NhcHR1cmUiLCAidGFza3MiLCAiZXJyb3JzIiwgImNvcHlUYXNrcyIsICJnbG9iYWxab25lQXdhcmVDYWxsYmFjayIsICJnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2siLCAicGF0Y2hFdmVudFRhcmdldE1ldGhvZHMiLCAidXNlR2xvYmFsQ2FsbGJhY2siLCAidmFsaWRhdGVIYW5kbGVyIiwgInJldHVyblRhcmdldCIsICJ0YXNrRGF0YSIsICJuYXRpdmVBZGRFdmVudExpc3RlbmVyIiwgIm5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIiLCAibmF0aXZlTGlzdGVuZXJzIiwgIm5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyIsICJuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lciIsICJidWlsZEV2ZW50TGlzdGVuZXJPcHRpb25zIiwgInBhc3NpdmUiLCAiY3VzdG9tU2NoZWR1bGVHbG9iYWwiLCAiY3VzdG9tQ2FuY2VsR2xvYmFsIiwgInN5bWJvbEV2ZW50TmFtZXMiLCAic3ltYm9sRXZlbnROYW1lIiwgImV4aXN0aW5nVGFza3MiLCAiY3VzdG9tU2NoZWR1bGVOb25HbG9iYWwiLCAiY3VzdG9tU2NoZWR1bGVQcmVwZW5kIiwgImN1c3RvbUNhbmNlbE5vbkdsb2JhbCIsICJjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZSIsICJ0eXBlT2ZEZWxlZ2F0ZSIsICJjb21wYXJlIiwgInVucGF0Y2hlZEV2ZW50cyIsICJwYXNzaXZlRXZlbnRzIiwgImNvcHlFdmVudExpc3RlbmVyT3B0aW9ucyIsICJuZXdPcHRpb25zIiwgIm1ha2VBZGRMaXN0ZW5lciIsICJuYXRpdmVMaXN0ZW5lciIsICJhZGRTb3VyY2UiLCAiY3VzdG9tU2NoZWR1bGVGbiIsICJjdXN0b21DYW5jZWxGbiIsICJwcmVwZW5kIiwgImlzRXZlbnRMaXN0ZW5lck9iamVjdCIsICJzaWduYWwiLCAiY2FwdHVyZSIsICJvbmNlIiwgImlzRXhpc3RpbmciLCAiY29uc3RydWN0b3JOYW1lIiwgInRhcmdldFNvdXJjZSIsICJvbkFib3J0IiwgImV4aXN0aW5nVGFzayIsICJvblByb3BlcnR5U3ltYm9sIiwgImZpbmRFdmVudFRhc2tzIiwgInN5bWJvbENhcHR1cmVFdmVudE5hbWUiLCAiY2FwdHVyZVRhc2tzIiwgInJlbW92ZVRhc2tzIiwgImtleXMiLCAibWF0Y2giLCAiZXZ0TmFtZSIsICJyZXN1bHRzIiwgImZvdW5kVGFza3MiLCAiY2FwdHVyZUZhbHNlVGFza3MiLCAiY2FwdHVyZVRydWVUYXNrcyIsICJwYXRjaEV2ZW50UHJvdG90eXBlIiwgIkV2ZW50IiwgInBhdGNoUXVldWVNaWNyb3Rhc2siLCAidGFza1N5bWJvbCIsICJwYXRjaFRpbWVyIiwgIndpbmRvdyIsICJzZXROYW1lIiwgImNhbmNlbE5hbWUiLCAibmFtZVN1ZmZpeCIsICJjbGVhck5hdGl2ZSIsICJ0YXNrc0J5SGFuZGxlSWQiLCAiaGFuZGxlT3JJZCIsICJjbGVhclRhc2siLCAiaGFuZGxlIiwgImhhbmRsZUlkIiwgIm9yaWdpbmFsUmVmcmVzaCIsICJpZCIsICJwYXRjaEN1c3RvbUVsZW1lbnRzIiwgImNhbGxiYWNrcyIsICJldmVudFRhcmdldFBhdGNoIiwgImV2ZW50TmFtZXMiLCAiRVZFTlRfVEFSR0VUIiwgInBhdGNoRXZlbnQiLCAiZmlsdGVyUHJvcGVydGllcyIsICJpZ25vcmVQcm9wZXJ0aWVzIiwgInRpcCIsICJpcCIsICJ0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzIiwgIm9wIiwgInBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzIiwgImZpbHRlcmVkUHJvcGVydGllcyIsICJnZXRPbkV2ZW50TmFtZXMiLCAicHJvcGVydHlEZXNjcmlwdG9yUGF0Y2giLCAicGF0Y2hUYXJnZXRzIiwgImlnbm9yZUVycm9yUHJvcGVydGllcyIsICJwYXRjaEJyb3dzZXIiLCAiWm9uZSIsICJsZWdhY3lQYXRjaCIsICJjbGVhciIsICJibG9ja2luZ01ldGhvZHMiLCAicyIsICJYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IiwgInBhdGNoWEhSIiwgIlhIUl9UQVNLIiwgIlhIUl9TWU5DIiwgIlhIUl9MSVNURU5FUiIsICJYSFJfU0NIRURVTEVEIiwgIlhIUl9VUkwiLCAiWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRUQiLCAiWE1MSHR0cFJlcXVlc3QiLCAiWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUiLCAiZmluZFBlbmRpbmdUYXNrIiwgIm9yaUFkZExpc3RlbmVyIiwgIm9yaVJlbW92ZUxpc3RlbmVyIiwgIlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGUiLCAiUkVBRFlfU1RBVEVfQ0hBTkdFIiwgIlNDSEVEVUxFRCIsICJuZXdMaXN0ZW5lciIsICJsb2FkVGFza3MiLCAib3JpSW52b2tlIiwgInNlbmROYXRpdmUiLCAicGxhY2Vob2xkZXJDYWxsYmFjayIsICJhYm9ydE5hdGl2ZSIsICJvcGVuTmF0aXZlIiwgIlhNTEhUVFBSRVFVRVNUX1NPVVJDRSIsICJmZXRjaFRhc2tBYm9ydGluZyIsICJmZXRjaFRhc2tTY2hlZHVsaW5nIiwgImZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIsICJlIiwgIlByb21pc2VSZWplY3Rpb25FdmVudCIsICJldnQiLCAicGF0Y2hQcm9taXNlIiwgInJlYWRhYmxlT2JqZWN0VG9TdHJpbmciLCAiX3VuY2F1Z2h0UHJvbWlzZUVycm9ycyIsICJpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbiIsICJjcmVhdGlvblRyYWNlIiwgInJlamVjdGlvbiIsICJ1bmNhdWdodFByb21pc2VFcnJvciIsICJoYW5kbGVVbmhhbmRsZWRSZWplY3Rpb24iLCAiVU5IQU5ETEVEX1BST01JU0VfUkVKRUNUSU9OX0hBTkRMRVJfU1lNQk9MIiwgImhhbmRsZXIiLCAiaXNUaGVuYWJsZSIsICJmb3J3YXJkUmVzb2x1dGlvbiIsICJmb3J3YXJkUmVqZWN0aW9uIiwgIlpvbmVBd2FyZVByb21pc2UiLCAic3ltYm9sU3RhdGUiLCAic3ltYm9sVmFsdWUiLCAic3ltYm9sRmluYWxseSIsICJzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWUiLCAic3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlIiwgIlVOUkVTT0xWRUQiLCAiUkVTT0xWRUQiLCAiUkVKRUNURUQiLCAiUkVKRUNURURfTk9fQ0FUQ0giLCAibWFrZVJlc29sdmVyIiwgInByb21pc2UiLCAidiIsICJyZXNvbHZlUHJvbWlzZSIsICJ3YXNDYWxsZWQiLCAid3JhcHBlZEZ1bmN0aW9uIiwgIlRZUEVfRVJST1IiLCAiQ1VSUkVOVF9UQVNLX1RSQUNFX1NZTUJPTCIsICJvbmNlV3JhcHBlciIsICJ0aGVuIiwgImNsZWFyUmVqZWN0ZWROb0NhdGNoIiwgInRyYWNlIiwgInNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0IiwgIlJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIiLCAiY2hhaW5Qcm9taXNlIiwgIm9uRnVsZmlsbGVkIiwgIm9uUmVqZWN0ZWQiLCAicHJvbWlzZVN0YXRlIiwgInBhcmVudFByb21pc2VWYWx1ZSIsICJpc0ZpbmFsbHlQcm9taXNlIiwgIlpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkciLCAiQWdncmVnYXRlRXJyb3IiLCAicmVzIiwgInJlaiIsICJ2YWx1ZXMiLCAicHJvbWlzZXMiLCAiZmluaXNoZWQiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAib25SZXNvbHZlIiwgIm9uUmVqZWN0IiwgInVucmVzb2x2ZWRDb3VudCIsICJ2YWx1ZUluZGV4IiwgInJlc29sdmVkVmFsdWVzIiwgImN1clZhbHVlSW5kZXgiLCAidGhlbkVyciIsICJleGVjdXRvciIsICJDIiwgIm9uRmluYWxseSIsICJOYXRpdmVQcm9taXNlIiwgInN5bWJvbFRoZW5QYXRjaGVkIiwgInBhdGNoVGhlbiIsICJDdG9yIiwgIm9yaWdpbmFsVGhlbiIsICJ6b25laWZ5IiwgInJlc3VsdFByb21pc2UiLCAiY3RvciIsICJwYXRjaFRvU3RyaW5nIiwgIm9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyIsICJPUklHSU5BTF9ERUxFR0FURV9TWU1CT0wiLCAiUFJPTUlTRV9TWU1CT0wiLCAiRVJST1JfU1lNQk9MIiwgIm5ld0Z1bmN0aW9uVG9TdHJpbmciLCAib3JpZ2luYWxEZWxlZ2F0ZSIsICJuYXRpdmVQcm9taXNlIiwgIm5hdGl2ZUVycm9yIiwgIm9yaWdpbmFsT2JqZWN0VG9TdHJpbmciLCAiUFJPTUlTRV9PQkpFQ1RfVE9fU1RSSU5HIiwgInBhdGNoQ2FsbGJhY2tzIiwgInRhcmdldE5hbWUiLCAibWV0aG9kIiwgIm5hdGl2ZURlbGVnYXRlIiwgImRlc2NyaXB0b3IiLCAicGF0Y2hVdGlsIiwgIlNZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTIiwgIlNZTUJPTF9VTlBBVENIRURfRVZFTlRTIiwgInBhdGNoQ29tbW9uIiwgIlpvbmUkMSJdCn0K
|