@getopenpay/openpay-js 0.3.4 → 0.3.5

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