@kulupu-linku/sona 0.3.1 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2905 @@
1
+ var g;
2
+ (function(r) {
3
+ r.assertEqual = (n) => n;
4
+ function e(n) {
5
+ }
6
+ r.assertIs = e;
7
+ function t(n) {
8
+ throw new Error();
9
+ }
10
+ r.assertNever = t, r.arrayToEnum = (n) => {
11
+ const a = {};
12
+ for (const i of n)
13
+ a[i] = i;
14
+ return a;
15
+ }, r.getValidEnumValues = (n) => {
16
+ const a = r.objectKeys(n).filter((o) => typeof n[n[o]] != "number"), i = {};
17
+ for (const o of a)
18
+ i[o] = n[o];
19
+ return r.objectValues(i);
20
+ }, r.objectValues = (n) => r.objectKeys(n).map(function(a) {
21
+ return n[a];
22
+ }), r.objectKeys = typeof Object.keys == "function" ? (n) => Object.keys(n) : (n) => {
23
+ const a = [];
24
+ for (const i in n)
25
+ Object.prototype.hasOwnProperty.call(n, i) && a.push(i);
26
+ return a;
27
+ }, r.find = (n, a) => {
28
+ for (const i of n)
29
+ if (a(i))
30
+ return i;
31
+ }, r.isInteger = typeof Number.isInteger == "function" ? (n) => Number.isInteger(n) : (n) => typeof n == "number" && isFinite(n) && Math.floor(n) === n;
32
+ function s(n, a = " | ") {
33
+ return n.map((i) => typeof i == "string" ? `'${i}'` : i).join(a);
34
+ }
35
+ r.joinValues = s, r.jsonStringifyReplacer = (n, a) => typeof a == "bigint" ? a.toString() : a;
36
+ })(g || (g = {}));
37
+ var ke;
38
+ (function(r) {
39
+ r.mergeShapes = (e, t) => ({
40
+ ...e,
41
+ ...t
42
+ // second overwrites first
43
+ });
44
+ })(ke || (ke = {}));
45
+ const f = g.arrayToEnum([
46
+ "string",
47
+ "nan",
48
+ "number",
49
+ "integer",
50
+ "float",
51
+ "boolean",
52
+ "date",
53
+ "bigint",
54
+ "symbol",
55
+ "function",
56
+ "undefined",
57
+ "null",
58
+ "array",
59
+ "object",
60
+ "unknown",
61
+ "promise",
62
+ "void",
63
+ "never",
64
+ "map",
65
+ "set"
66
+ ]), A = (r) => {
67
+ switch (typeof r) {
68
+ case "undefined":
69
+ return f.undefined;
70
+ case "string":
71
+ return f.string;
72
+ case "number":
73
+ return isNaN(r) ? f.nan : f.number;
74
+ case "boolean":
75
+ return f.boolean;
76
+ case "function":
77
+ return f.function;
78
+ case "bigint":
79
+ return f.bigint;
80
+ case "symbol":
81
+ return f.symbol;
82
+ case "object":
83
+ return Array.isArray(r) ? f.array : r === null ? f.null : r.then && typeof r.then == "function" && r.catch && typeof r.catch == "function" ? f.promise : typeof Map < "u" && r instanceof Map ? f.map : typeof Set < "u" && r instanceof Set ? f.set : typeof Date < "u" && r instanceof Date ? f.date : f.object;
84
+ default:
85
+ return f.unknown;
86
+ }
87
+ }, d = g.arrayToEnum([
88
+ "invalid_type",
89
+ "invalid_literal",
90
+ "custom",
91
+ "invalid_union",
92
+ "invalid_union_discriminator",
93
+ "invalid_enum_value",
94
+ "unrecognized_keys",
95
+ "invalid_arguments",
96
+ "invalid_return_type",
97
+ "invalid_date",
98
+ "invalid_string",
99
+ "too_small",
100
+ "too_big",
101
+ "invalid_intersection_types",
102
+ "not_multiple_of",
103
+ "not_finite"
104
+ ]), De = (r) => JSON.stringify(r, null, 2).replace(/"([^"]+)":/g, "$1:");
105
+ class T extends Error {
106
+ constructor(e) {
107
+ super(), this.issues = [], this.addIssue = (s) => {
108
+ this.issues = [...this.issues, s];
109
+ }, this.addIssues = (s = []) => {
110
+ this.issues = [...this.issues, ...s];
111
+ };
112
+ const t = new.target.prototype;
113
+ Object.setPrototypeOf ? Object.setPrototypeOf(this, t) : this.__proto__ = t, this.name = "ZodError", this.issues = e;
114
+ }
115
+ get errors() {
116
+ return this.issues;
117
+ }
118
+ format(e) {
119
+ const t = e || function(a) {
120
+ return a.message;
121
+ }, s = { _errors: [] }, n = (a) => {
122
+ for (const i of a.issues)
123
+ if (i.code === "invalid_union")
124
+ i.unionErrors.map(n);
125
+ else if (i.code === "invalid_return_type")
126
+ n(i.returnTypeError);
127
+ else if (i.code === "invalid_arguments")
128
+ n(i.argumentsError);
129
+ else if (i.path.length === 0)
130
+ s._errors.push(t(i));
131
+ else {
132
+ let o = s, l = 0;
133
+ for (; l < i.path.length; ) {
134
+ const c = i.path[l];
135
+ l === i.path.length - 1 ? (o[c] = o[c] || { _errors: [] }, o[c]._errors.push(t(i))) : o[c] = o[c] || { _errors: [] }, o = o[c], l++;
136
+ }
137
+ }
138
+ };
139
+ return n(this), s;
140
+ }
141
+ static assert(e) {
142
+ if (!(e instanceof T))
143
+ throw new Error(`Not a ZodError: ${e}`);
144
+ }
145
+ toString() {
146
+ return this.message;
147
+ }
148
+ get message() {
149
+ return JSON.stringify(this.issues, g.jsonStringifyReplacer, 2);
150
+ }
151
+ get isEmpty() {
152
+ return this.issues.length === 0;
153
+ }
154
+ flatten(e = (t) => t.message) {
155
+ const t = {}, s = [];
156
+ for (const n of this.issues)
157
+ n.path.length > 0 ? (t[n.path[0]] = t[n.path[0]] || [], t[n.path[0]].push(e(n))) : s.push(e(n));
158
+ return { formErrors: s, fieldErrors: t };
159
+ }
160
+ get formErrors() {
161
+ return this.flatten();
162
+ }
163
+ }
164
+ T.create = (r) => new T(r);
165
+ const q = (r, e) => {
166
+ let t;
167
+ switch (r.code) {
168
+ case d.invalid_type:
169
+ r.received === f.undefined ? t = "Required" : t = `Expected ${r.expected}, received ${r.received}`;
170
+ break;
171
+ case d.invalid_literal:
172
+ t = `Invalid literal value, expected ${JSON.stringify(r.expected, g.jsonStringifyReplacer)}`;
173
+ break;
174
+ case d.unrecognized_keys:
175
+ t = `Unrecognized key(s) in object: ${g.joinValues(r.keys, ", ")}`;
176
+ break;
177
+ case d.invalid_union:
178
+ t = "Invalid input";
179
+ break;
180
+ case d.invalid_union_discriminator:
181
+ t = `Invalid discriminator value. Expected ${g.joinValues(r.options)}`;
182
+ break;
183
+ case d.invalid_enum_value:
184
+ t = `Invalid enum value. Expected ${g.joinValues(r.options)}, received '${r.received}'`;
185
+ break;
186
+ case d.invalid_arguments:
187
+ t = "Invalid function arguments";
188
+ break;
189
+ case d.invalid_return_type:
190
+ t = "Invalid function return type";
191
+ break;
192
+ case d.invalid_date:
193
+ t = "Invalid date";
194
+ break;
195
+ case d.invalid_string:
196
+ typeof r.validation == "object" ? "includes" in r.validation ? (t = `Invalid input: must include "${r.validation.includes}"`, typeof r.validation.position == "number" && (t = `${t} at one or more positions greater than or equal to ${r.validation.position}`)) : "startsWith" in r.validation ? t = `Invalid input: must start with "${r.validation.startsWith}"` : "endsWith" in r.validation ? t = `Invalid input: must end with "${r.validation.endsWith}"` : g.assertNever(r.validation) : r.validation !== "regex" ? t = `Invalid ${r.validation}` : t = "Invalid";
197
+ break;
198
+ case d.too_small:
199
+ r.type === "array" ? t = `Array must contain ${r.exact ? "exactly" : r.inclusive ? "at least" : "more than"} ${r.minimum} element(s)` : r.type === "string" ? t = `String must contain ${r.exact ? "exactly" : r.inclusive ? "at least" : "over"} ${r.minimum} character(s)` : r.type === "number" ? t = `Number must be ${r.exact ? "exactly equal to " : r.inclusive ? "greater than or equal to " : "greater than "}${r.minimum}` : r.type === "date" ? t = `Date must be ${r.exact ? "exactly equal to " : r.inclusive ? "greater than or equal to " : "greater than "}${new Date(Number(r.minimum))}` : t = "Invalid input";
200
+ break;
201
+ case d.too_big:
202
+ r.type === "array" ? t = `Array must contain ${r.exact ? "exactly" : r.inclusive ? "at most" : "less than"} ${r.maximum} element(s)` : r.type === "string" ? t = `String must contain ${r.exact ? "exactly" : r.inclusive ? "at most" : "under"} ${r.maximum} character(s)` : r.type === "number" ? t = `Number must be ${r.exact ? "exactly" : r.inclusive ? "less than or equal to" : "less than"} ${r.maximum}` : r.type === "bigint" ? t = `BigInt must be ${r.exact ? "exactly" : r.inclusive ? "less than or equal to" : "less than"} ${r.maximum}` : r.type === "date" ? t = `Date must be ${r.exact ? "exactly" : r.inclusive ? "smaller than or equal to" : "smaller than"} ${new Date(Number(r.maximum))}` : t = "Invalid input";
203
+ break;
204
+ case d.custom:
205
+ t = "Invalid input";
206
+ break;
207
+ case d.invalid_intersection_types:
208
+ t = "Intersection results could not be merged";
209
+ break;
210
+ case d.not_multiple_of:
211
+ t = `Number must be a multiple of ${r.multipleOf}`;
212
+ break;
213
+ case d.not_finite:
214
+ t = "Number must be finite";
215
+ break;
216
+ default:
217
+ t = e.defaultError, g.assertNever(r);
218
+ }
219
+ return { message: t };
220
+ };
221
+ let Oe = q;
222
+ function Le(r) {
223
+ Oe = r;
224
+ }
225
+ function le() {
226
+ return Oe;
227
+ }
228
+ const fe = (r) => {
229
+ const { data: e, path: t, errorMaps: s, issueData: n } = r, a = [...t, ...n.path || []], i = {
230
+ ...n,
231
+ path: a
232
+ };
233
+ if (n.message !== void 0)
234
+ return {
235
+ ...n,
236
+ path: a,
237
+ message: n.message
238
+ };
239
+ let o = "";
240
+ const l = s.filter((c) => !!c).slice().reverse();
241
+ for (const c of l)
242
+ o = c(i, { data: e, defaultError: o }).message;
243
+ return {
244
+ ...n,
245
+ path: a,
246
+ message: o
247
+ };
248
+ }, ze = [];
249
+ function u(r, e) {
250
+ const t = le(), s = fe({
251
+ issueData: e,
252
+ data: r.data,
253
+ path: r.path,
254
+ errorMaps: [
255
+ r.common.contextualErrorMap,
256
+ r.schemaErrorMap,
257
+ t,
258
+ t === q ? void 0 : q
259
+ // then global default map
260
+ ].filter((n) => !!n)
261
+ });
262
+ r.common.issues.push(s);
263
+ }
264
+ class b {
265
+ constructor() {
266
+ this.value = "valid";
267
+ }
268
+ dirty() {
269
+ this.value === "valid" && (this.value = "dirty");
270
+ }
271
+ abort() {
272
+ this.value !== "aborted" && (this.value = "aborted");
273
+ }
274
+ static mergeArray(e, t) {
275
+ const s = [];
276
+ for (const n of t) {
277
+ if (n.status === "aborted")
278
+ return m;
279
+ n.status === "dirty" && e.dirty(), s.push(n.value);
280
+ }
281
+ return { status: e.value, value: s };
282
+ }
283
+ static async mergeObjectAsync(e, t) {
284
+ const s = [];
285
+ for (const n of t) {
286
+ const a = await n.key, i = await n.value;
287
+ s.push({
288
+ key: a,
289
+ value: i
290
+ });
291
+ }
292
+ return b.mergeObjectSync(e, s);
293
+ }
294
+ static mergeObjectSync(e, t) {
295
+ const s = {};
296
+ for (const n of t) {
297
+ const { key: a, value: i } = n;
298
+ if (a.status === "aborted" || i.status === "aborted")
299
+ return m;
300
+ a.status === "dirty" && e.dirty(), i.status === "dirty" && e.dirty(), a.value !== "__proto__" && (typeof i.value < "u" || n.alwaysSet) && (s[a.value] = i.value);
301
+ }
302
+ return { status: e.value, value: s };
303
+ }
304
+ }
305
+ const m = Object.freeze({
306
+ status: "aborted"
307
+ }), B = (r) => ({ status: "dirty", value: r }), w = (r) => ({ status: "valid", value: r }), be = (r) => r.status === "aborted", we = (r) => r.status === "dirty", X = (r) => r.status === "valid", Q = (r) => typeof Promise < "u" && r instanceof Promise;
308
+ function he(r, e, t, s) {
309
+ if (typeof e == "function" ? r !== e || !s : !e.has(r))
310
+ throw new TypeError("Cannot read private member from an object whose class did not declare it");
311
+ return e.get(r);
312
+ }
313
+ function Ee(r, e, t, s, n) {
314
+ if (typeof e == "function" ? r !== e || !n : !e.has(r))
315
+ throw new TypeError("Cannot write private member to an object whose class did not declare it");
316
+ return e.set(r, t), t;
317
+ }
318
+ var h;
319
+ (function(r) {
320
+ r.errToObj = (e) => typeof e == "string" ? { message: e } : e || {}, r.toString = (e) => typeof e == "string" ? e : e == null ? void 0 : e.message;
321
+ })(h || (h = {}));
322
+ var H, G;
323
+ class E {
324
+ constructor(e, t, s, n) {
325
+ this._cachedPath = [], this.parent = e, this.data = t, this._path = s, this._key = n;
326
+ }
327
+ get path() {
328
+ return this._cachedPath.length || (this._key instanceof Array ? this._cachedPath.push(...this._path, ...this._key) : this._cachedPath.push(...this._path, this._key)), this._cachedPath;
329
+ }
330
+ }
331
+ const Ce = (r, e) => {
332
+ if (X(e))
333
+ return { success: !0, data: e.value };
334
+ if (!r.common.issues.length)
335
+ throw new Error("Validation failed but no issues detected.");
336
+ return {
337
+ success: !1,
338
+ get error() {
339
+ if (this._error)
340
+ return this._error;
341
+ const t = new T(r.common.issues);
342
+ return this._error = t, this._error;
343
+ }
344
+ };
345
+ };
346
+ function v(r) {
347
+ if (!r)
348
+ return {};
349
+ const { errorMap: e, invalid_type_error: t, required_error: s, description: n } = r;
350
+ if (e && (t || s))
351
+ throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);
352
+ return e ? { errorMap: e, description: n } : { errorMap: (i, o) => {
353
+ var l, c;
354
+ const { message: y } = r;
355
+ return i.code === "invalid_enum_value" ? { message: y ?? o.defaultError } : typeof o.data > "u" ? { message: (l = y ?? s) !== null && l !== void 0 ? l : o.defaultError } : i.code !== "invalid_type" ? { message: o.defaultError } : { message: (c = y ?? t) !== null && c !== void 0 ? c : o.defaultError };
356
+ }, description: n };
357
+ }
358
+ class _ {
359
+ constructor(e) {
360
+ this.spa = this.safeParseAsync, this._def = e, this.parse = this.parse.bind(this), this.safeParse = this.safeParse.bind(this), this.parseAsync = this.parseAsync.bind(this), this.safeParseAsync = this.safeParseAsync.bind(this), this.spa = this.spa.bind(this), this.refine = this.refine.bind(this), this.refinement = this.refinement.bind(this), this.superRefine = this.superRefine.bind(this), this.optional = this.optional.bind(this), this.nullable = this.nullable.bind(this), this.nullish = this.nullish.bind(this), this.array = this.array.bind(this), this.promise = this.promise.bind(this), this.or = this.or.bind(this), this.and = this.and.bind(this), this.transform = this.transform.bind(this), this.brand = this.brand.bind(this), this.default = this.default.bind(this), this.catch = this.catch.bind(this), this.describe = this.describe.bind(this), this.pipe = this.pipe.bind(this), this.readonly = this.readonly.bind(this), this.isNullable = this.isNullable.bind(this), this.isOptional = this.isOptional.bind(this);
361
+ }
362
+ get description() {
363
+ return this._def.description;
364
+ }
365
+ _getType(e) {
366
+ return A(e.data);
367
+ }
368
+ _getOrReturnCtx(e, t) {
369
+ return t || {
370
+ common: e.parent.common,
371
+ data: e.data,
372
+ parsedType: A(e.data),
373
+ schemaErrorMap: this._def.errorMap,
374
+ path: e.path,
375
+ parent: e.parent
376
+ };
377
+ }
378
+ _processInputParams(e) {
379
+ return {
380
+ status: new b(),
381
+ ctx: {
382
+ common: e.parent.common,
383
+ data: e.data,
384
+ parsedType: A(e.data),
385
+ schemaErrorMap: this._def.errorMap,
386
+ path: e.path,
387
+ parent: e.parent
388
+ }
389
+ };
390
+ }
391
+ _parseSync(e) {
392
+ const t = this._parse(e);
393
+ if (Q(t))
394
+ throw new Error("Synchronous parse encountered promise.");
395
+ return t;
396
+ }
397
+ _parseAsync(e) {
398
+ const t = this._parse(e);
399
+ return Promise.resolve(t);
400
+ }
401
+ parse(e, t) {
402
+ const s = this.safeParse(e, t);
403
+ if (s.success)
404
+ return s.data;
405
+ throw s.error;
406
+ }
407
+ safeParse(e, t) {
408
+ var s;
409
+ const n = {
410
+ common: {
411
+ issues: [],
412
+ async: (s = t == null ? void 0 : t.async) !== null && s !== void 0 ? s : !1,
413
+ contextualErrorMap: t == null ? void 0 : t.errorMap
414
+ },
415
+ path: (t == null ? void 0 : t.path) || [],
416
+ schemaErrorMap: this._def.errorMap,
417
+ parent: null,
418
+ data: e,
419
+ parsedType: A(e)
420
+ }, a = this._parseSync({ data: e, path: n.path, parent: n });
421
+ return Ce(n, a);
422
+ }
423
+ async parseAsync(e, t) {
424
+ const s = await this.safeParseAsync(e, t);
425
+ if (s.success)
426
+ return s.data;
427
+ throw s.error;
428
+ }
429
+ async safeParseAsync(e, t) {
430
+ const s = {
431
+ common: {
432
+ issues: [],
433
+ contextualErrorMap: t == null ? void 0 : t.errorMap,
434
+ async: !0
435
+ },
436
+ path: (t == null ? void 0 : t.path) || [],
437
+ schemaErrorMap: this._def.errorMap,
438
+ parent: null,
439
+ data: e,
440
+ parsedType: A(e)
441
+ }, n = this._parse({ data: e, path: s.path, parent: s }), a = await (Q(n) ? n : Promise.resolve(n));
442
+ return Ce(s, a);
443
+ }
444
+ refine(e, t) {
445
+ const s = (n) => typeof t == "string" || typeof t > "u" ? { message: t } : typeof t == "function" ? t(n) : t;
446
+ return this._refinement((n, a) => {
447
+ const i = e(n), o = () => a.addIssue({
448
+ code: d.custom,
449
+ ...s(n)
450
+ });
451
+ return typeof Promise < "u" && i instanceof Promise ? i.then((l) => l ? !0 : (o(), !1)) : i ? !0 : (o(), !1);
452
+ });
453
+ }
454
+ refinement(e, t) {
455
+ return this._refinement((s, n) => e(s) ? !0 : (n.addIssue(typeof t == "function" ? t(s, n) : t), !1));
456
+ }
457
+ _refinement(e) {
458
+ return new N({
459
+ schema: this,
460
+ typeName: p.ZodEffects,
461
+ effect: { type: "refinement", refinement: e }
462
+ });
463
+ }
464
+ superRefine(e) {
465
+ return this._refinement(e);
466
+ }
467
+ optional() {
468
+ return O.create(this, this._def);
469
+ }
470
+ nullable() {
471
+ return V.create(this, this._def);
472
+ }
473
+ nullish() {
474
+ return this.nullable().optional();
475
+ }
476
+ array() {
477
+ return C.create(this, this._def);
478
+ }
479
+ promise() {
480
+ return J.create(this, this._def);
481
+ }
482
+ or(e) {
483
+ return te.create([this, e], this._def);
484
+ }
485
+ and(e) {
486
+ return re.create(this, e, this._def);
487
+ }
488
+ transform(e) {
489
+ return new N({
490
+ ...v(this._def),
491
+ schema: this,
492
+ typeName: p.ZodEffects,
493
+ effect: { type: "transform", transform: e }
494
+ });
495
+ }
496
+ default(e) {
497
+ const t = typeof e == "function" ? e : () => e;
498
+ return new oe({
499
+ ...v(this._def),
500
+ innerType: this,
501
+ defaultValue: t,
502
+ typeName: p.ZodDefault
503
+ });
504
+ }
505
+ brand() {
506
+ return new Ze({
507
+ typeName: p.ZodBranded,
508
+ type: this,
509
+ ...v(this._def)
510
+ });
511
+ }
512
+ catch(e) {
513
+ const t = typeof e == "function" ? e : () => e;
514
+ return new de({
515
+ ...v(this._def),
516
+ innerType: this,
517
+ catchValue: t,
518
+ typeName: p.ZodCatch
519
+ });
520
+ }
521
+ describe(e) {
522
+ const t = this.constructor;
523
+ return new t({
524
+ ...this._def,
525
+ description: e
526
+ });
527
+ }
528
+ pipe(e) {
529
+ return ue.create(this, e);
530
+ }
531
+ readonly() {
532
+ return ce.create(this);
533
+ }
534
+ isOptional() {
535
+ return this.safeParse(void 0).success;
536
+ }
537
+ isNullable() {
538
+ return this.safeParse(null).success;
539
+ }
540
+ }
541
+ const Ue = /^c[^\s-]{8,}$/i, Be = /^[0-9a-z]+$/, We = /^[0-9A-HJKMNP-TV-Z]{26}$/, qe = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i, Ye = /^[a-z0-9_-]{21}$/i, Je = /^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/, He = /^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i, Ge = "^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";
542
+ let xe;
543
+ const Xe = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/, Qe = /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/, Ke = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/, Re = "((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))", Fe = new RegExp(`^${Re}$`);
544
+ function Ie(r) {
545
+ let e = "([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d";
546
+ return r.precision ? e = `${e}\\.\\d{${r.precision}}` : r.precision == null && (e = `${e}(\\.\\d+)?`), e;
547
+ }
548
+ function et(r) {
549
+ return new RegExp(`^${Ie(r)}$`);
550
+ }
551
+ function je(r) {
552
+ let e = `${Re}T${Ie(r)}`;
553
+ const t = [];
554
+ return t.push(r.local ? "Z?" : "Z"), r.offset && t.push("([+-]\\d{2}:?\\d{2})"), e = `${e}(${t.join("|")})`, new RegExp(`^${e}$`);
555
+ }
556
+ function tt(r, e) {
557
+ return !!((e === "v4" || !e) && Xe.test(r) || (e === "v6" || !e) && Qe.test(r));
558
+ }
559
+ class S extends _ {
560
+ _parse(e) {
561
+ if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== f.string) {
562
+ const a = this._getOrReturnCtx(e);
563
+ return u(a, {
564
+ code: d.invalid_type,
565
+ expected: f.string,
566
+ received: a.parsedType
567
+ }), m;
568
+ }
569
+ const s = new b();
570
+ let n;
571
+ for (const a of this._def.checks)
572
+ if (a.kind === "min")
573
+ e.data.length < a.value && (n = this._getOrReturnCtx(e, n), u(n, {
574
+ code: d.too_small,
575
+ minimum: a.value,
576
+ type: "string",
577
+ inclusive: !0,
578
+ exact: !1,
579
+ message: a.message
580
+ }), s.dirty());
581
+ else if (a.kind === "max")
582
+ e.data.length > a.value && (n = this._getOrReturnCtx(e, n), u(n, {
583
+ code: d.too_big,
584
+ maximum: a.value,
585
+ type: "string",
586
+ inclusive: !0,
587
+ exact: !1,
588
+ message: a.message
589
+ }), s.dirty());
590
+ else if (a.kind === "length") {
591
+ const i = e.data.length > a.value, o = e.data.length < a.value;
592
+ (i || o) && (n = this._getOrReturnCtx(e, n), i ? u(n, {
593
+ code: d.too_big,
594
+ maximum: a.value,
595
+ type: "string",
596
+ inclusive: !0,
597
+ exact: !0,
598
+ message: a.message
599
+ }) : o && u(n, {
600
+ code: d.too_small,
601
+ minimum: a.value,
602
+ type: "string",
603
+ inclusive: !0,
604
+ exact: !0,
605
+ message: a.message
606
+ }), s.dirty());
607
+ } else if (a.kind === "email")
608
+ He.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
609
+ validation: "email",
610
+ code: d.invalid_string,
611
+ message: a.message
612
+ }), s.dirty());
613
+ else if (a.kind === "emoji")
614
+ xe || (xe = new RegExp(Ge, "u")), xe.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
615
+ validation: "emoji",
616
+ code: d.invalid_string,
617
+ message: a.message
618
+ }), s.dirty());
619
+ else if (a.kind === "uuid")
620
+ qe.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
621
+ validation: "uuid",
622
+ code: d.invalid_string,
623
+ message: a.message
624
+ }), s.dirty());
625
+ else if (a.kind === "nanoid")
626
+ Ye.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
627
+ validation: "nanoid",
628
+ code: d.invalid_string,
629
+ message: a.message
630
+ }), s.dirty());
631
+ else if (a.kind === "cuid")
632
+ Ue.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
633
+ validation: "cuid",
634
+ code: d.invalid_string,
635
+ message: a.message
636
+ }), s.dirty());
637
+ else if (a.kind === "cuid2")
638
+ Be.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
639
+ validation: "cuid2",
640
+ code: d.invalid_string,
641
+ message: a.message
642
+ }), s.dirty());
643
+ else if (a.kind === "ulid")
644
+ We.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
645
+ validation: "ulid",
646
+ code: d.invalid_string,
647
+ message: a.message
648
+ }), s.dirty());
649
+ else if (a.kind === "url")
650
+ try {
651
+ new URL(e.data);
652
+ } catch {
653
+ n = this._getOrReturnCtx(e, n), u(n, {
654
+ validation: "url",
655
+ code: d.invalid_string,
656
+ message: a.message
657
+ }), s.dirty();
658
+ }
659
+ else
660
+ a.kind === "regex" ? (a.regex.lastIndex = 0, a.regex.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
661
+ validation: "regex",
662
+ code: d.invalid_string,
663
+ message: a.message
664
+ }), s.dirty())) : a.kind === "trim" ? e.data = e.data.trim() : a.kind === "includes" ? e.data.includes(a.value, a.position) || (n = this._getOrReturnCtx(e, n), u(n, {
665
+ code: d.invalid_string,
666
+ validation: { includes: a.value, position: a.position },
667
+ message: a.message
668
+ }), s.dirty()) : a.kind === "toLowerCase" ? e.data = e.data.toLowerCase() : a.kind === "toUpperCase" ? e.data = e.data.toUpperCase() : a.kind === "startsWith" ? e.data.startsWith(a.value) || (n = this._getOrReturnCtx(e, n), u(n, {
669
+ code: d.invalid_string,
670
+ validation: { startsWith: a.value },
671
+ message: a.message
672
+ }), s.dirty()) : a.kind === "endsWith" ? e.data.endsWith(a.value) || (n = this._getOrReturnCtx(e, n), u(n, {
673
+ code: d.invalid_string,
674
+ validation: { endsWith: a.value },
675
+ message: a.message
676
+ }), s.dirty()) : a.kind === "datetime" ? je(a).test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
677
+ code: d.invalid_string,
678
+ validation: "datetime",
679
+ message: a.message
680
+ }), s.dirty()) : a.kind === "date" ? Fe.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
681
+ code: d.invalid_string,
682
+ validation: "date",
683
+ message: a.message
684
+ }), s.dirty()) : a.kind === "time" ? et(a).test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
685
+ code: d.invalid_string,
686
+ validation: "time",
687
+ message: a.message
688
+ }), s.dirty()) : a.kind === "duration" ? Je.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
689
+ validation: "duration",
690
+ code: d.invalid_string,
691
+ message: a.message
692
+ }), s.dirty()) : a.kind === "ip" ? tt(e.data, a.version) || (n = this._getOrReturnCtx(e, n), u(n, {
693
+ validation: "ip",
694
+ code: d.invalid_string,
695
+ message: a.message
696
+ }), s.dirty()) : a.kind === "base64" ? Ke.test(e.data) || (n = this._getOrReturnCtx(e, n), u(n, {
697
+ validation: "base64",
698
+ code: d.invalid_string,
699
+ message: a.message
700
+ }), s.dirty()) : g.assertNever(a);
701
+ return { status: s.value, value: e.data };
702
+ }
703
+ _regex(e, t, s) {
704
+ return this.refinement((n) => e.test(n), {
705
+ validation: t,
706
+ code: d.invalid_string,
707
+ ...h.errToObj(s)
708
+ });
709
+ }
710
+ _addCheck(e) {
711
+ return new S({
712
+ ...this._def,
713
+ checks: [...this._def.checks, e]
714
+ });
715
+ }
716
+ email(e) {
717
+ return this._addCheck({ kind: "email", ...h.errToObj(e) });
718
+ }
719
+ url(e) {
720
+ return this._addCheck({ kind: "url", ...h.errToObj(e) });
721
+ }
722
+ emoji(e) {
723
+ return this._addCheck({ kind: "emoji", ...h.errToObj(e) });
724
+ }
725
+ uuid(e) {
726
+ return this._addCheck({ kind: "uuid", ...h.errToObj(e) });
727
+ }
728
+ nanoid(e) {
729
+ return this._addCheck({ kind: "nanoid", ...h.errToObj(e) });
730
+ }
731
+ cuid(e) {
732
+ return this._addCheck({ kind: "cuid", ...h.errToObj(e) });
733
+ }
734
+ cuid2(e) {
735
+ return this._addCheck({ kind: "cuid2", ...h.errToObj(e) });
736
+ }
737
+ ulid(e) {
738
+ return this._addCheck({ kind: "ulid", ...h.errToObj(e) });
739
+ }
740
+ base64(e) {
741
+ return this._addCheck({ kind: "base64", ...h.errToObj(e) });
742
+ }
743
+ ip(e) {
744
+ return this._addCheck({ kind: "ip", ...h.errToObj(e) });
745
+ }
746
+ datetime(e) {
747
+ var t, s;
748
+ return typeof e == "string" ? this._addCheck({
749
+ kind: "datetime",
750
+ precision: null,
751
+ offset: !1,
752
+ local: !1,
753
+ message: e
754
+ }) : this._addCheck({
755
+ kind: "datetime",
756
+ precision: typeof (e == null ? void 0 : e.precision) > "u" ? null : e == null ? void 0 : e.precision,
757
+ offset: (t = e == null ? void 0 : e.offset) !== null && t !== void 0 ? t : !1,
758
+ local: (s = e == null ? void 0 : e.local) !== null && s !== void 0 ? s : !1,
759
+ ...h.errToObj(e == null ? void 0 : e.message)
760
+ });
761
+ }
762
+ date(e) {
763
+ return this._addCheck({ kind: "date", message: e });
764
+ }
765
+ time(e) {
766
+ return typeof e == "string" ? this._addCheck({
767
+ kind: "time",
768
+ precision: null,
769
+ message: e
770
+ }) : this._addCheck({
771
+ kind: "time",
772
+ precision: typeof (e == null ? void 0 : e.precision) > "u" ? null : e == null ? void 0 : e.precision,
773
+ ...h.errToObj(e == null ? void 0 : e.message)
774
+ });
775
+ }
776
+ duration(e) {
777
+ return this._addCheck({ kind: "duration", ...h.errToObj(e) });
778
+ }
779
+ regex(e, t) {
780
+ return this._addCheck({
781
+ kind: "regex",
782
+ regex: e,
783
+ ...h.errToObj(t)
784
+ });
785
+ }
786
+ includes(e, t) {
787
+ return this._addCheck({
788
+ kind: "includes",
789
+ value: e,
790
+ position: t == null ? void 0 : t.position,
791
+ ...h.errToObj(t == null ? void 0 : t.message)
792
+ });
793
+ }
794
+ startsWith(e, t) {
795
+ return this._addCheck({
796
+ kind: "startsWith",
797
+ value: e,
798
+ ...h.errToObj(t)
799
+ });
800
+ }
801
+ endsWith(e, t) {
802
+ return this._addCheck({
803
+ kind: "endsWith",
804
+ value: e,
805
+ ...h.errToObj(t)
806
+ });
807
+ }
808
+ min(e, t) {
809
+ return this._addCheck({
810
+ kind: "min",
811
+ value: e,
812
+ ...h.errToObj(t)
813
+ });
814
+ }
815
+ max(e, t) {
816
+ return this._addCheck({
817
+ kind: "max",
818
+ value: e,
819
+ ...h.errToObj(t)
820
+ });
821
+ }
822
+ length(e, t) {
823
+ return this._addCheck({
824
+ kind: "length",
825
+ value: e,
826
+ ...h.errToObj(t)
827
+ });
828
+ }
829
+ /**
830
+ * @deprecated Use z.string().min(1) instead.
831
+ * @see {@link ZodString.min}
832
+ */
833
+ nonempty(e) {
834
+ return this.min(1, h.errToObj(e));
835
+ }
836
+ trim() {
837
+ return new S({
838
+ ...this._def,
839
+ checks: [...this._def.checks, { kind: "trim" }]
840
+ });
841
+ }
842
+ toLowerCase() {
843
+ return new S({
844
+ ...this._def,
845
+ checks: [...this._def.checks, { kind: "toLowerCase" }]
846
+ });
847
+ }
848
+ toUpperCase() {
849
+ return new S({
850
+ ...this._def,
851
+ checks: [...this._def.checks, { kind: "toUpperCase" }]
852
+ });
853
+ }
854
+ get isDatetime() {
855
+ return !!this._def.checks.find((e) => e.kind === "datetime");
856
+ }
857
+ get isDate() {
858
+ return !!this._def.checks.find((e) => e.kind === "date");
859
+ }
860
+ get isTime() {
861
+ return !!this._def.checks.find((e) => e.kind === "time");
862
+ }
863
+ get isDuration() {
864
+ return !!this._def.checks.find((e) => e.kind === "duration");
865
+ }
866
+ get isEmail() {
867
+ return !!this._def.checks.find((e) => e.kind === "email");
868
+ }
869
+ get isURL() {
870
+ return !!this._def.checks.find((e) => e.kind === "url");
871
+ }
872
+ get isEmoji() {
873
+ return !!this._def.checks.find((e) => e.kind === "emoji");
874
+ }
875
+ get isUUID() {
876
+ return !!this._def.checks.find((e) => e.kind === "uuid");
877
+ }
878
+ get isNANOID() {
879
+ return !!this._def.checks.find((e) => e.kind === "nanoid");
880
+ }
881
+ get isCUID() {
882
+ return !!this._def.checks.find((e) => e.kind === "cuid");
883
+ }
884
+ get isCUID2() {
885
+ return !!this._def.checks.find((e) => e.kind === "cuid2");
886
+ }
887
+ get isULID() {
888
+ return !!this._def.checks.find((e) => e.kind === "ulid");
889
+ }
890
+ get isIP() {
891
+ return !!this._def.checks.find((e) => e.kind === "ip");
892
+ }
893
+ get isBase64() {
894
+ return !!this._def.checks.find((e) => e.kind === "base64");
895
+ }
896
+ get minLength() {
897
+ let e = null;
898
+ for (const t of this._def.checks)
899
+ t.kind === "min" && (e === null || t.value > e) && (e = t.value);
900
+ return e;
901
+ }
902
+ get maxLength() {
903
+ let e = null;
904
+ for (const t of this._def.checks)
905
+ t.kind === "max" && (e === null || t.value < e) && (e = t.value);
906
+ return e;
907
+ }
908
+ }
909
+ S.create = (r) => {
910
+ var e;
911
+ return new S({
912
+ checks: [],
913
+ typeName: p.ZodString,
914
+ coerce: (e = r == null ? void 0 : r.coerce) !== null && e !== void 0 ? e : !1,
915
+ ...v(r)
916
+ });
917
+ };
918
+ function rt(r, e) {
919
+ const t = (r.toString().split(".")[1] || "").length, s = (e.toString().split(".")[1] || "").length, n = t > s ? t : s, a = parseInt(r.toFixed(n).replace(".", "")), i = parseInt(e.toFixed(n).replace(".", ""));
920
+ return a % i / Math.pow(10, n);
921
+ }
922
+ class M extends _ {
923
+ constructor() {
924
+ super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf;
925
+ }
926
+ _parse(e) {
927
+ if (this._def.coerce && (e.data = Number(e.data)), this._getType(e) !== f.number) {
928
+ const a = this._getOrReturnCtx(e);
929
+ return u(a, {
930
+ code: d.invalid_type,
931
+ expected: f.number,
932
+ received: a.parsedType
933
+ }), m;
934
+ }
935
+ let s;
936
+ const n = new b();
937
+ for (const a of this._def.checks)
938
+ a.kind === "int" ? g.isInteger(e.data) || (s = this._getOrReturnCtx(e, s), u(s, {
939
+ code: d.invalid_type,
940
+ expected: "integer",
941
+ received: "float",
942
+ message: a.message
943
+ }), n.dirty()) : a.kind === "min" ? (a.inclusive ? e.data < a.value : e.data <= a.value) && (s = this._getOrReturnCtx(e, s), u(s, {
944
+ code: d.too_small,
945
+ minimum: a.value,
946
+ type: "number",
947
+ inclusive: a.inclusive,
948
+ exact: !1,
949
+ message: a.message
950
+ }), n.dirty()) : a.kind === "max" ? (a.inclusive ? e.data > a.value : e.data >= a.value) && (s = this._getOrReturnCtx(e, s), u(s, {
951
+ code: d.too_big,
952
+ maximum: a.value,
953
+ type: "number",
954
+ inclusive: a.inclusive,
955
+ exact: !1,
956
+ message: a.message
957
+ }), n.dirty()) : a.kind === "multipleOf" ? rt(e.data, a.value) !== 0 && (s = this._getOrReturnCtx(e, s), u(s, {
958
+ code: d.not_multiple_of,
959
+ multipleOf: a.value,
960
+ message: a.message
961
+ }), n.dirty()) : a.kind === "finite" ? Number.isFinite(e.data) || (s = this._getOrReturnCtx(e, s), u(s, {
962
+ code: d.not_finite,
963
+ message: a.message
964
+ }), n.dirty()) : g.assertNever(a);
965
+ return { status: n.value, value: e.data };
966
+ }
967
+ gte(e, t) {
968
+ return this.setLimit("min", e, !0, h.toString(t));
969
+ }
970
+ gt(e, t) {
971
+ return this.setLimit("min", e, !1, h.toString(t));
972
+ }
973
+ lte(e, t) {
974
+ return this.setLimit("max", e, !0, h.toString(t));
975
+ }
976
+ lt(e, t) {
977
+ return this.setLimit("max", e, !1, h.toString(t));
978
+ }
979
+ setLimit(e, t, s, n) {
980
+ return new M({
981
+ ...this._def,
982
+ checks: [
983
+ ...this._def.checks,
984
+ {
985
+ kind: e,
986
+ value: t,
987
+ inclusive: s,
988
+ message: h.toString(n)
989
+ }
990
+ ]
991
+ });
992
+ }
993
+ _addCheck(e) {
994
+ return new M({
995
+ ...this._def,
996
+ checks: [...this._def.checks, e]
997
+ });
998
+ }
999
+ int(e) {
1000
+ return this._addCheck({
1001
+ kind: "int",
1002
+ message: h.toString(e)
1003
+ });
1004
+ }
1005
+ positive(e) {
1006
+ return this._addCheck({
1007
+ kind: "min",
1008
+ value: 0,
1009
+ inclusive: !1,
1010
+ message: h.toString(e)
1011
+ });
1012
+ }
1013
+ negative(e) {
1014
+ return this._addCheck({
1015
+ kind: "max",
1016
+ value: 0,
1017
+ inclusive: !1,
1018
+ message: h.toString(e)
1019
+ });
1020
+ }
1021
+ nonpositive(e) {
1022
+ return this._addCheck({
1023
+ kind: "max",
1024
+ value: 0,
1025
+ inclusive: !0,
1026
+ message: h.toString(e)
1027
+ });
1028
+ }
1029
+ nonnegative(e) {
1030
+ return this._addCheck({
1031
+ kind: "min",
1032
+ value: 0,
1033
+ inclusive: !0,
1034
+ message: h.toString(e)
1035
+ });
1036
+ }
1037
+ multipleOf(e, t) {
1038
+ return this._addCheck({
1039
+ kind: "multipleOf",
1040
+ value: e,
1041
+ message: h.toString(t)
1042
+ });
1043
+ }
1044
+ finite(e) {
1045
+ return this._addCheck({
1046
+ kind: "finite",
1047
+ message: h.toString(e)
1048
+ });
1049
+ }
1050
+ safe(e) {
1051
+ return this._addCheck({
1052
+ kind: "min",
1053
+ inclusive: !0,
1054
+ value: Number.MIN_SAFE_INTEGER,
1055
+ message: h.toString(e)
1056
+ })._addCheck({
1057
+ kind: "max",
1058
+ inclusive: !0,
1059
+ value: Number.MAX_SAFE_INTEGER,
1060
+ message: h.toString(e)
1061
+ });
1062
+ }
1063
+ get minValue() {
1064
+ let e = null;
1065
+ for (const t of this._def.checks)
1066
+ t.kind === "min" && (e === null || t.value > e) && (e = t.value);
1067
+ return e;
1068
+ }
1069
+ get maxValue() {
1070
+ let e = null;
1071
+ for (const t of this._def.checks)
1072
+ t.kind === "max" && (e === null || t.value < e) && (e = t.value);
1073
+ return e;
1074
+ }
1075
+ get isInt() {
1076
+ return !!this._def.checks.find((e) => e.kind === "int" || e.kind === "multipleOf" && g.isInteger(e.value));
1077
+ }
1078
+ get isFinite() {
1079
+ let e = null, t = null;
1080
+ for (const s of this._def.checks) {
1081
+ if (s.kind === "finite" || s.kind === "int" || s.kind === "multipleOf")
1082
+ return !0;
1083
+ s.kind === "min" ? (t === null || s.value > t) && (t = s.value) : s.kind === "max" && (e === null || s.value < e) && (e = s.value);
1084
+ }
1085
+ return Number.isFinite(t) && Number.isFinite(e);
1086
+ }
1087
+ }
1088
+ M.create = (r) => new M({
1089
+ checks: [],
1090
+ typeName: p.ZodNumber,
1091
+ coerce: (r == null ? void 0 : r.coerce) || !1,
1092
+ ...v(r)
1093
+ });
1094
+ class $ extends _ {
1095
+ constructor() {
1096
+ super(...arguments), this.min = this.gte, this.max = this.lte;
1097
+ }
1098
+ _parse(e) {
1099
+ if (this._def.coerce && (e.data = BigInt(e.data)), this._getType(e) !== f.bigint) {
1100
+ const a = this._getOrReturnCtx(e);
1101
+ return u(a, {
1102
+ code: d.invalid_type,
1103
+ expected: f.bigint,
1104
+ received: a.parsedType
1105
+ }), m;
1106
+ }
1107
+ let s;
1108
+ const n = new b();
1109
+ for (const a of this._def.checks)
1110
+ a.kind === "min" ? (a.inclusive ? e.data < a.value : e.data <= a.value) && (s = this._getOrReturnCtx(e, s), u(s, {
1111
+ code: d.too_small,
1112
+ type: "bigint",
1113
+ minimum: a.value,
1114
+ inclusive: a.inclusive,
1115
+ message: a.message
1116
+ }), n.dirty()) : a.kind === "max" ? (a.inclusive ? e.data > a.value : e.data >= a.value) && (s = this._getOrReturnCtx(e, s), u(s, {
1117
+ code: d.too_big,
1118
+ type: "bigint",
1119
+ maximum: a.value,
1120
+ inclusive: a.inclusive,
1121
+ message: a.message
1122
+ }), n.dirty()) : a.kind === "multipleOf" ? e.data % a.value !== BigInt(0) && (s = this._getOrReturnCtx(e, s), u(s, {
1123
+ code: d.not_multiple_of,
1124
+ multipleOf: a.value,
1125
+ message: a.message
1126
+ }), n.dirty()) : g.assertNever(a);
1127
+ return { status: n.value, value: e.data };
1128
+ }
1129
+ gte(e, t) {
1130
+ return this.setLimit("min", e, !0, h.toString(t));
1131
+ }
1132
+ gt(e, t) {
1133
+ return this.setLimit("min", e, !1, h.toString(t));
1134
+ }
1135
+ lte(e, t) {
1136
+ return this.setLimit("max", e, !0, h.toString(t));
1137
+ }
1138
+ lt(e, t) {
1139
+ return this.setLimit("max", e, !1, h.toString(t));
1140
+ }
1141
+ setLimit(e, t, s, n) {
1142
+ return new $({
1143
+ ...this._def,
1144
+ checks: [
1145
+ ...this._def.checks,
1146
+ {
1147
+ kind: e,
1148
+ value: t,
1149
+ inclusive: s,
1150
+ message: h.toString(n)
1151
+ }
1152
+ ]
1153
+ });
1154
+ }
1155
+ _addCheck(e) {
1156
+ return new $({
1157
+ ...this._def,
1158
+ checks: [...this._def.checks, e]
1159
+ });
1160
+ }
1161
+ positive(e) {
1162
+ return this._addCheck({
1163
+ kind: "min",
1164
+ value: BigInt(0),
1165
+ inclusive: !1,
1166
+ message: h.toString(e)
1167
+ });
1168
+ }
1169
+ negative(e) {
1170
+ return this._addCheck({
1171
+ kind: "max",
1172
+ value: BigInt(0),
1173
+ inclusive: !1,
1174
+ message: h.toString(e)
1175
+ });
1176
+ }
1177
+ nonpositive(e) {
1178
+ return this._addCheck({
1179
+ kind: "max",
1180
+ value: BigInt(0),
1181
+ inclusive: !0,
1182
+ message: h.toString(e)
1183
+ });
1184
+ }
1185
+ nonnegative(e) {
1186
+ return this._addCheck({
1187
+ kind: "min",
1188
+ value: BigInt(0),
1189
+ inclusive: !0,
1190
+ message: h.toString(e)
1191
+ });
1192
+ }
1193
+ multipleOf(e, t) {
1194
+ return this._addCheck({
1195
+ kind: "multipleOf",
1196
+ value: e,
1197
+ message: h.toString(t)
1198
+ });
1199
+ }
1200
+ get minValue() {
1201
+ let e = null;
1202
+ for (const t of this._def.checks)
1203
+ t.kind === "min" && (e === null || t.value > e) && (e = t.value);
1204
+ return e;
1205
+ }
1206
+ get maxValue() {
1207
+ let e = null;
1208
+ for (const t of this._def.checks)
1209
+ t.kind === "max" && (e === null || t.value < e) && (e = t.value);
1210
+ return e;
1211
+ }
1212
+ }
1213
+ $.create = (r) => {
1214
+ var e;
1215
+ return new $({
1216
+ checks: [],
1217
+ typeName: p.ZodBigInt,
1218
+ coerce: (e = r == null ? void 0 : r.coerce) !== null && e !== void 0 ? e : !1,
1219
+ ...v(r)
1220
+ });
1221
+ };
1222
+ class K extends _ {
1223
+ _parse(e) {
1224
+ if (this._def.coerce && (e.data = !!e.data), this._getType(e) !== f.boolean) {
1225
+ const s = this._getOrReturnCtx(e);
1226
+ return u(s, {
1227
+ code: d.invalid_type,
1228
+ expected: f.boolean,
1229
+ received: s.parsedType
1230
+ }), m;
1231
+ }
1232
+ return w(e.data);
1233
+ }
1234
+ }
1235
+ K.create = (r) => new K({
1236
+ typeName: p.ZodBoolean,
1237
+ coerce: (r == null ? void 0 : r.coerce) || !1,
1238
+ ...v(r)
1239
+ });
1240
+ class L extends _ {
1241
+ _parse(e) {
1242
+ if (this._def.coerce && (e.data = new Date(e.data)), this._getType(e) !== f.date) {
1243
+ const a = this._getOrReturnCtx(e);
1244
+ return u(a, {
1245
+ code: d.invalid_type,
1246
+ expected: f.date,
1247
+ received: a.parsedType
1248
+ }), m;
1249
+ }
1250
+ if (isNaN(e.data.getTime())) {
1251
+ const a = this._getOrReturnCtx(e);
1252
+ return u(a, {
1253
+ code: d.invalid_date
1254
+ }), m;
1255
+ }
1256
+ const s = new b();
1257
+ let n;
1258
+ for (const a of this._def.checks)
1259
+ a.kind === "min" ? e.data.getTime() < a.value && (n = this._getOrReturnCtx(e, n), u(n, {
1260
+ code: d.too_small,
1261
+ message: a.message,
1262
+ inclusive: !0,
1263
+ exact: !1,
1264
+ minimum: a.value,
1265
+ type: "date"
1266
+ }), s.dirty()) : a.kind === "max" ? e.data.getTime() > a.value && (n = this._getOrReturnCtx(e, n), u(n, {
1267
+ code: d.too_big,
1268
+ message: a.message,
1269
+ inclusive: !0,
1270
+ exact: !1,
1271
+ maximum: a.value,
1272
+ type: "date"
1273
+ }), s.dirty()) : g.assertNever(a);
1274
+ return {
1275
+ status: s.value,
1276
+ value: new Date(e.data.getTime())
1277
+ };
1278
+ }
1279
+ _addCheck(e) {
1280
+ return new L({
1281
+ ...this._def,
1282
+ checks: [...this._def.checks, e]
1283
+ });
1284
+ }
1285
+ min(e, t) {
1286
+ return this._addCheck({
1287
+ kind: "min",
1288
+ value: e.getTime(),
1289
+ message: h.toString(t)
1290
+ });
1291
+ }
1292
+ max(e, t) {
1293
+ return this._addCheck({
1294
+ kind: "max",
1295
+ value: e.getTime(),
1296
+ message: h.toString(t)
1297
+ });
1298
+ }
1299
+ get minDate() {
1300
+ let e = null;
1301
+ for (const t of this._def.checks)
1302
+ t.kind === "min" && (e === null || t.value > e) && (e = t.value);
1303
+ return e != null ? new Date(e) : null;
1304
+ }
1305
+ get maxDate() {
1306
+ let e = null;
1307
+ for (const t of this._def.checks)
1308
+ t.kind === "max" && (e === null || t.value < e) && (e = t.value);
1309
+ return e != null ? new Date(e) : null;
1310
+ }
1311
+ }
1312
+ L.create = (r) => new L({
1313
+ checks: [],
1314
+ coerce: (r == null ? void 0 : r.coerce) || !1,
1315
+ typeName: p.ZodDate,
1316
+ ...v(r)
1317
+ });
1318
+ class pe extends _ {
1319
+ _parse(e) {
1320
+ if (this._getType(e) !== f.symbol) {
1321
+ const s = this._getOrReturnCtx(e);
1322
+ return u(s, {
1323
+ code: d.invalid_type,
1324
+ expected: f.symbol,
1325
+ received: s.parsedType
1326
+ }), m;
1327
+ }
1328
+ return w(e.data);
1329
+ }
1330
+ }
1331
+ pe.create = (r) => new pe({
1332
+ typeName: p.ZodSymbol,
1333
+ ...v(r)
1334
+ });
1335
+ class F extends _ {
1336
+ _parse(e) {
1337
+ if (this._getType(e) !== f.undefined) {
1338
+ const s = this._getOrReturnCtx(e);
1339
+ return u(s, {
1340
+ code: d.invalid_type,
1341
+ expected: f.undefined,
1342
+ received: s.parsedType
1343
+ }), m;
1344
+ }
1345
+ return w(e.data);
1346
+ }
1347
+ }
1348
+ F.create = (r) => new F({
1349
+ typeName: p.ZodUndefined,
1350
+ ...v(r)
1351
+ });
1352
+ class ee extends _ {
1353
+ _parse(e) {
1354
+ if (this._getType(e) !== f.null) {
1355
+ const s = this._getOrReturnCtx(e);
1356
+ return u(s, {
1357
+ code: d.invalid_type,
1358
+ expected: f.null,
1359
+ received: s.parsedType
1360
+ }), m;
1361
+ }
1362
+ return w(e.data);
1363
+ }
1364
+ }
1365
+ ee.create = (r) => new ee({
1366
+ typeName: p.ZodNull,
1367
+ ...v(r)
1368
+ });
1369
+ class Y extends _ {
1370
+ constructor() {
1371
+ super(...arguments), this._any = !0;
1372
+ }
1373
+ _parse(e) {
1374
+ return w(e.data);
1375
+ }
1376
+ }
1377
+ Y.create = (r) => new Y({
1378
+ typeName: p.ZodAny,
1379
+ ...v(r)
1380
+ });
1381
+ class D extends _ {
1382
+ constructor() {
1383
+ super(...arguments), this._unknown = !0;
1384
+ }
1385
+ _parse(e) {
1386
+ return w(e.data);
1387
+ }
1388
+ }
1389
+ D.create = (r) => new D({
1390
+ typeName: p.ZodUnknown,
1391
+ ...v(r)
1392
+ });
1393
+ class j extends _ {
1394
+ _parse(e) {
1395
+ const t = this._getOrReturnCtx(e);
1396
+ return u(t, {
1397
+ code: d.invalid_type,
1398
+ expected: f.never,
1399
+ received: t.parsedType
1400
+ }), m;
1401
+ }
1402
+ }
1403
+ j.create = (r) => new j({
1404
+ typeName: p.ZodNever,
1405
+ ...v(r)
1406
+ });
1407
+ class me extends _ {
1408
+ _parse(e) {
1409
+ if (this._getType(e) !== f.undefined) {
1410
+ const s = this._getOrReturnCtx(e);
1411
+ return u(s, {
1412
+ code: d.invalid_type,
1413
+ expected: f.void,
1414
+ received: s.parsedType
1415
+ }), m;
1416
+ }
1417
+ return w(e.data);
1418
+ }
1419
+ }
1420
+ me.create = (r) => new me({
1421
+ typeName: p.ZodVoid,
1422
+ ...v(r)
1423
+ });
1424
+ class C extends _ {
1425
+ _parse(e) {
1426
+ const { ctx: t, status: s } = this._processInputParams(e), n = this._def;
1427
+ if (t.parsedType !== f.array)
1428
+ return u(t, {
1429
+ code: d.invalid_type,
1430
+ expected: f.array,
1431
+ received: t.parsedType
1432
+ }), m;
1433
+ if (n.exactLength !== null) {
1434
+ const i = t.data.length > n.exactLength.value, o = t.data.length < n.exactLength.value;
1435
+ (i || o) && (u(t, {
1436
+ code: i ? d.too_big : d.too_small,
1437
+ minimum: o ? n.exactLength.value : void 0,
1438
+ maximum: i ? n.exactLength.value : void 0,
1439
+ type: "array",
1440
+ inclusive: !0,
1441
+ exact: !0,
1442
+ message: n.exactLength.message
1443
+ }), s.dirty());
1444
+ }
1445
+ if (n.minLength !== null && t.data.length < n.minLength.value && (u(t, {
1446
+ code: d.too_small,
1447
+ minimum: n.minLength.value,
1448
+ type: "array",
1449
+ inclusive: !0,
1450
+ exact: !1,
1451
+ message: n.minLength.message
1452
+ }), s.dirty()), n.maxLength !== null && t.data.length > n.maxLength.value && (u(t, {
1453
+ code: d.too_big,
1454
+ maximum: n.maxLength.value,
1455
+ type: "array",
1456
+ inclusive: !0,
1457
+ exact: !1,
1458
+ message: n.maxLength.message
1459
+ }), s.dirty()), t.common.async)
1460
+ return Promise.all([...t.data].map((i, o) => n.type._parseAsync(new E(t, i, t.path, o)))).then((i) => b.mergeArray(s, i));
1461
+ const a = [...t.data].map((i, o) => n.type._parseSync(new E(t, i, t.path, o)));
1462
+ return b.mergeArray(s, a);
1463
+ }
1464
+ get element() {
1465
+ return this._def.type;
1466
+ }
1467
+ min(e, t) {
1468
+ return new C({
1469
+ ...this._def,
1470
+ minLength: { value: e, message: h.toString(t) }
1471
+ });
1472
+ }
1473
+ max(e, t) {
1474
+ return new C({
1475
+ ...this._def,
1476
+ maxLength: { value: e, message: h.toString(t) }
1477
+ });
1478
+ }
1479
+ length(e, t) {
1480
+ return new C({
1481
+ ...this._def,
1482
+ exactLength: { value: e, message: h.toString(t) }
1483
+ });
1484
+ }
1485
+ nonempty(e) {
1486
+ return this.min(1, e);
1487
+ }
1488
+ }
1489
+ C.create = (r, e) => new C({
1490
+ type: r,
1491
+ minLength: null,
1492
+ maxLength: null,
1493
+ exactLength: null,
1494
+ typeName: p.ZodArray,
1495
+ ...v(e)
1496
+ });
1497
+ function U(r) {
1498
+ if (r instanceof x) {
1499
+ const e = {};
1500
+ for (const t in r.shape) {
1501
+ const s = r.shape[t];
1502
+ e[t] = O.create(U(s));
1503
+ }
1504
+ return new x({
1505
+ ...r._def,
1506
+ shape: () => e
1507
+ });
1508
+ } else
1509
+ return r instanceof C ? new C({
1510
+ ...r._def,
1511
+ type: U(r.element)
1512
+ }) : r instanceof O ? O.create(U(r.unwrap())) : r instanceof V ? V.create(U(r.unwrap())) : r instanceof R ? R.create(r.items.map((e) => U(e))) : r;
1513
+ }
1514
+ class x extends _ {
1515
+ constructor() {
1516
+ super(...arguments), this._cached = null, this.nonstrict = this.passthrough, this.augment = this.extend;
1517
+ }
1518
+ _getCached() {
1519
+ if (this._cached !== null)
1520
+ return this._cached;
1521
+ const e = this._def.shape(), t = g.objectKeys(e);
1522
+ return this._cached = { shape: e, keys: t };
1523
+ }
1524
+ _parse(e) {
1525
+ if (this._getType(e) !== f.object) {
1526
+ const c = this._getOrReturnCtx(e);
1527
+ return u(c, {
1528
+ code: d.invalid_type,
1529
+ expected: f.object,
1530
+ received: c.parsedType
1531
+ }), m;
1532
+ }
1533
+ const { status: s, ctx: n } = this._processInputParams(e), { shape: a, keys: i } = this._getCached(), o = [];
1534
+ if (!(this._def.catchall instanceof j && this._def.unknownKeys === "strip"))
1535
+ for (const c in n.data)
1536
+ i.includes(c) || o.push(c);
1537
+ const l = [];
1538
+ for (const c of i) {
1539
+ const y = a[c], Z = n.data[c];
1540
+ l.push({
1541
+ key: { status: "valid", value: c },
1542
+ value: y._parse(new E(n, Z, n.path, c)),
1543
+ alwaysSet: c in n.data
1544
+ });
1545
+ }
1546
+ if (this._def.catchall instanceof j) {
1547
+ const c = this._def.unknownKeys;
1548
+ if (c === "passthrough")
1549
+ for (const y of o)
1550
+ l.push({
1551
+ key: { status: "valid", value: y },
1552
+ value: { status: "valid", value: n.data[y] }
1553
+ });
1554
+ else if (c === "strict")
1555
+ o.length > 0 && (u(n, {
1556
+ code: d.unrecognized_keys,
1557
+ keys: o
1558
+ }), s.dirty());
1559
+ else if (c !== "strip")
1560
+ throw new Error("Internal ZodObject error: invalid unknownKeys value.");
1561
+ } else {
1562
+ const c = this._def.catchall;
1563
+ for (const y of o) {
1564
+ const Z = n.data[y];
1565
+ l.push({
1566
+ key: { status: "valid", value: y },
1567
+ value: c._parse(
1568
+ new E(n, Z, n.path, y)
1569
+ //, ctx.child(key), value, getParsedType(value)
1570
+ ),
1571
+ alwaysSet: y in n.data
1572
+ });
1573
+ }
1574
+ }
1575
+ return n.common.async ? Promise.resolve().then(async () => {
1576
+ const c = [];
1577
+ for (const y of l) {
1578
+ const Z = await y.key, Se = await y.value;
1579
+ c.push({
1580
+ key: Z,
1581
+ value: Se,
1582
+ alwaysSet: y.alwaysSet
1583
+ });
1584
+ }
1585
+ return c;
1586
+ }).then((c) => b.mergeObjectSync(s, c)) : b.mergeObjectSync(s, l);
1587
+ }
1588
+ get shape() {
1589
+ return this._def.shape();
1590
+ }
1591
+ strict(e) {
1592
+ return h.errToObj, new x({
1593
+ ...this._def,
1594
+ unknownKeys: "strict",
1595
+ ...e !== void 0 ? {
1596
+ errorMap: (t, s) => {
1597
+ var n, a, i, o;
1598
+ const l = (i = (a = (n = this._def).errorMap) === null || a === void 0 ? void 0 : a.call(n, t, s).message) !== null && i !== void 0 ? i : s.defaultError;
1599
+ return t.code === "unrecognized_keys" ? {
1600
+ message: (o = h.errToObj(e).message) !== null && o !== void 0 ? o : l
1601
+ } : {
1602
+ message: l
1603
+ };
1604
+ }
1605
+ } : {}
1606
+ });
1607
+ }
1608
+ strip() {
1609
+ return new x({
1610
+ ...this._def,
1611
+ unknownKeys: "strip"
1612
+ });
1613
+ }
1614
+ passthrough() {
1615
+ return new x({
1616
+ ...this._def,
1617
+ unknownKeys: "passthrough"
1618
+ });
1619
+ }
1620
+ // const AugmentFactory =
1621
+ // <Def extends ZodObjectDef>(def: Def) =>
1622
+ // <Augmentation extends ZodRawShape>(
1623
+ // augmentation: Augmentation
1624
+ // ): ZodObject<
1625
+ // extendShape<ReturnType<Def["shape"]>, Augmentation>,
1626
+ // Def["unknownKeys"],
1627
+ // Def["catchall"]
1628
+ // > => {
1629
+ // return new ZodObject({
1630
+ // ...def,
1631
+ // shape: () => ({
1632
+ // ...def.shape(),
1633
+ // ...augmentation,
1634
+ // }),
1635
+ // }) as any;
1636
+ // };
1637
+ extend(e) {
1638
+ return new x({
1639
+ ...this._def,
1640
+ shape: () => ({
1641
+ ...this._def.shape(),
1642
+ ...e
1643
+ })
1644
+ });
1645
+ }
1646
+ /**
1647
+ * Prior to zod@1.0.12 there was a bug in the
1648
+ * inferred type of merged objects. Please
1649
+ * upgrade if you are experiencing issues.
1650
+ */
1651
+ merge(e) {
1652
+ return new x({
1653
+ unknownKeys: e._def.unknownKeys,
1654
+ catchall: e._def.catchall,
1655
+ shape: () => ({
1656
+ ...this._def.shape(),
1657
+ ...e._def.shape()
1658
+ }),
1659
+ typeName: p.ZodObject
1660
+ });
1661
+ }
1662
+ // merge<
1663
+ // Incoming extends AnyZodObject,
1664
+ // Augmentation extends Incoming["shape"],
1665
+ // NewOutput extends {
1666
+ // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation
1667
+ // ? Augmentation[k]["_output"]
1668
+ // : k extends keyof Output
1669
+ // ? Output[k]
1670
+ // : never;
1671
+ // },
1672
+ // NewInput extends {
1673
+ // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation
1674
+ // ? Augmentation[k]["_input"]
1675
+ // : k extends keyof Input
1676
+ // ? Input[k]
1677
+ // : never;
1678
+ // }
1679
+ // >(
1680
+ // merging: Incoming
1681
+ // ): ZodObject<
1682
+ // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
1683
+ // Incoming["_def"]["unknownKeys"],
1684
+ // Incoming["_def"]["catchall"],
1685
+ // NewOutput,
1686
+ // NewInput
1687
+ // > {
1688
+ // const merged: any = new ZodObject({
1689
+ // unknownKeys: merging._def.unknownKeys,
1690
+ // catchall: merging._def.catchall,
1691
+ // shape: () =>
1692
+ // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
1693
+ // typeName: ZodFirstPartyTypeKind.ZodObject,
1694
+ // }) as any;
1695
+ // return merged;
1696
+ // }
1697
+ setKey(e, t) {
1698
+ return this.augment({ [e]: t });
1699
+ }
1700
+ // merge<Incoming extends AnyZodObject>(
1701
+ // merging: Incoming
1702
+ // ): //ZodObject<T & Incoming["_shape"], UnknownKeys, Catchall> = (merging) => {
1703
+ // ZodObject<
1704
+ // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
1705
+ // Incoming["_def"]["unknownKeys"],
1706
+ // Incoming["_def"]["catchall"]
1707
+ // > {
1708
+ // // const mergedShape = objectUtil.mergeShapes(
1709
+ // // this._def.shape(),
1710
+ // // merging._def.shape()
1711
+ // // );
1712
+ // const merged: any = new ZodObject({
1713
+ // unknownKeys: merging._def.unknownKeys,
1714
+ // catchall: merging._def.catchall,
1715
+ // shape: () =>
1716
+ // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
1717
+ // typeName: ZodFirstPartyTypeKind.ZodObject,
1718
+ // }) as any;
1719
+ // return merged;
1720
+ // }
1721
+ catchall(e) {
1722
+ return new x({
1723
+ ...this._def,
1724
+ catchall: e
1725
+ });
1726
+ }
1727
+ pick(e) {
1728
+ const t = {};
1729
+ return g.objectKeys(e).forEach((s) => {
1730
+ e[s] && this.shape[s] && (t[s] = this.shape[s]);
1731
+ }), new x({
1732
+ ...this._def,
1733
+ shape: () => t
1734
+ });
1735
+ }
1736
+ omit(e) {
1737
+ const t = {};
1738
+ return g.objectKeys(this.shape).forEach((s) => {
1739
+ e[s] || (t[s] = this.shape[s]);
1740
+ }), new x({
1741
+ ...this._def,
1742
+ shape: () => t
1743
+ });
1744
+ }
1745
+ /**
1746
+ * @deprecated
1747
+ */
1748
+ deepPartial() {
1749
+ return U(this);
1750
+ }
1751
+ partial(e) {
1752
+ const t = {};
1753
+ return g.objectKeys(this.shape).forEach((s) => {
1754
+ const n = this.shape[s];
1755
+ e && !e[s] ? t[s] = n : t[s] = n.optional();
1756
+ }), new x({
1757
+ ...this._def,
1758
+ shape: () => t
1759
+ });
1760
+ }
1761
+ required(e) {
1762
+ const t = {};
1763
+ return g.objectKeys(this.shape).forEach((s) => {
1764
+ if (e && !e[s])
1765
+ t[s] = this.shape[s];
1766
+ else {
1767
+ let a = this.shape[s];
1768
+ for (; a instanceof O; )
1769
+ a = a._def.innerType;
1770
+ t[s] = a;
1771
+ }
1772
+ }), new x({
1773
+ ...this._def,
1774
+ shape: () => t
1775
+ });
1776
+ }
1777
+ keyof() {
1778
+ return Ae(g.objectKeys(this.shape));
1779
+ }
1780
+ }
1781
+ x.create = (r, e) => new x({
1782
+ shape: () => r,
1783
+ unknownKeys: "strip",
1784
+ catchall: j.create(),
1785
+ typeName: p.ZodObject,
1786
+ ...v(e)
1787
+ });
1788
+ x.strictCreate = (r, e) => new x({
1789
+ shape: () => r,
1790
+ unknownKeys: "strict",
1791
+ catchall: j.create(),
1792
+ typeName: p.ZodObject,
1793
+ ...v(e)
1794
+ });
1795
+ x.lazycreate = (r, e) => new x({
1796
+ shape: r,
1797
+ unknownKeys: "strip",
1798
+ catchall: j.create(),
1799
+ typeName: p.ZodObject,
1800
+ ...v(e)
1801
+ });
1802
+ class te extends _ {
1803
+ _parse(e) {
1804
+ const { ctx: t } = this._processInputParams(e), s = this._def.options;
1805
+ function n(a) {
1806
+ for (const o of a)
1807
+ if (o.result.status === "valid")
1808
+ return o.result;
1809
+ for (const o of a)
1810
+ if (o.result.status === "dirty")
1811
+ return t.common.issues.push(...o.ctx.common.issues), o.result;
1812
+ const i = a.map((o) => new T(o.ctx.common.issues));
1813
+ return u(t, {
1814
+ code: d.invalid_union,
1815
+ unionErrors: i
1816
+ }), m;
1817
+ }
1818
+ if (t.common.async)
1819
+ return Promise.all(s.map(async (a) => {
1820
+ const i = {
1821
+ ...t,
1822
+ common: {
1823
+ ...t.common,
1824
+ issues: []
1825
+ },
1826
+ parent: null
1827
+ };
1828
+ return {
1829
+ result: await a._parseAsync({
1830
+ data: t.data,
1831
+ path: t.path,
1832
+ parent: i
1833
+ }),
1834
+ ctx: i
1835
+ };
1836
+ })).then(n);
1837
+ {
1838
+ let a;
1839
+ const i = [];
1840
+ for (const l of s) {
1841
+ const c = {
1842
+ ...t,
1843
+ common: {
1844
+ ...t.common,
1845
+ issues: []
1846
+ },
1847
+ parent: null
1848
+ }, y = l._parseSync({
1849
+ data: t.data,
1850
+ path: t.path,
1851
+ parent: c
1852
+ });
1853
+ if (y.status === "valid")
1854
+ return y;
1855
+ y.status === "dirty" && !a && (a = { result: y, ctx: c }), c.common.issues.length && i.push(c.common.issues);
1856
+ }
1857
+ if (a)
1858
+ return t.common.issues.push(...a.ctx.common.issues), a.result;
1859
+ const o = i.map((l) => new T(l));
1860
+ return u(t, {
1861
+ code: d.invalid_union,
1862
+ unionErrors: o
1863
+ }), m;
1864
+ }
1865
+ }
1866
+ get options() {
1867
+ return this._def.options;
1868
+ }
1869
+ }
1870
+ te.create = (r, e) => new te({
1871
+ options: r,
1872
+ typeName: p.ZodUnion,
1873
+ ...v(e)
1874
+ });
1875
+ const I = (r) => r instanceof ne ? I(r.schema) : r instanceof N ? I(r.innerType()) : r instanceof ae ? [r.value] : r instanceof P ? r.options : r instanceof ie ? g.objectValues(r.enum) : r instanceof oe ? I(r._def.innerType) : r instanceof F ? [void 0] : r instanceof ee ? [null] : r instanceof O ? [void 0, ...I(r.unwrap())] : r instanceof V ? [null, ...I(r.unwrap())] : r instanceof Ze || r instanceof ce ? I(r.unwrap()) : r instanceof de ? I(r._def.innerType) : [];
1876
+ class _e extends _ {
1877
+ _parse(e) {
1878
+ const { ctx: t } = this._processInputParams(e);
1879
+ if (t.parsedType !== f.object)
1880
+ return u(t, {
1881
+ code: d.invalid_type,
1882
+ expected: f.object,
1883
+ received: t.parsedType
1884
+ }), m;
1885
+ const s = this.discriminator, n = t.data[s], a = this.optionsMap.get(n);
1886
+ return a ? t.common.async ? a._parseAsync({
1887
+ data: t.data,
1888
+ path: t.path,
1889
+ parent: t
1890
+ }) : a._parseSync({
1891
+ data: t.data,
1892
+ path: t.path,
1893
+ parent: t
1894
+ }) : (u(t, {
1895
+ code: d.invalid_union_discriminator,
1896
+ options: Array.from(this.optionsMap.keys()),
1897
+ path: [s]
1898
+ }), m);
1899
+ }
1900
+ get discriminator() {
1901
+ return this._def.discriminator;
1902
+ }
1903
+ get options() {
1904
+ return this._def.options;
1905
+ }
1906
+ get optionsMap() {
1907
+ return this._def.optionsMap;
1908
+ }
1909
+ /**
1910
+ * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.
1911
+ * However, it only allows a union of objects, all of which need to share a discriminator property. This property must
1912
+ * have a different value for each object in the union.
1913
+ * @param discriminator the name of the discriminator property
1914
+ * @param types an array of object schemas
1915
+ * @param params
1916
+ */
1917
+ static create(e, t, s) {
1918
+ const n = /* @__PURE__ */ new Map();
1919
+ for (const a of t) {
1920
+ const i = I(a.shape[e]);
1921
+ if (!i.length)
1922
+ throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);
1923
+ for (const o of i) {
1924
+ if (n.has(o))
1925
+ throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);
1926
+ n.set(o, a);
1927
+ }
1928
+ }
1929
+ return new _e({
1930
+ typeName: p.ZodDiscriminatedUnion,
1931
+ discriminator: e,
1932
+ options: t,
1933
+ optionsMap: n,
1934
+ ...v(s)
1935
+ });
1936
+ }
1937
+ }
1938
+ function Te(r, e) {
1939
+ const t = A(r), s = A(e);
1940
+ if (r === e)
1941
+ return { valid: !0, data: r };
1942
+ if (t === f.object && s === f.object) {
1943
+ const n = g.objectKeys(e), a = g.objectKeys(r).filter((o) => n.indexOf(o) !== -1), i = { ...r, ...e };
1944
+ for (const o of a) {
1945
+ const l = Te(r[o], e[o]);
1946
+ if (!l.valid)
1947
+ return { valid: !1 };
1948
+ i[o] = l.data;
1949
+ }
1950
+ return { valid: !0, data: i };
1951
+ } else if (t === f.array && s === f.array) {
1952
+ if (r.length !== e.length)
1953
+ return { valid: !1 };
1954
+ const n = [];
1955
+ for (let a = 0; a < r.length; a++) {
1956
+ const i = r[a], o = e[a], l = Te(i, o);
1957
+ if (!l.valid)
1958
+ return { valid: !1 };
1959
+ n.push(l.data);
1960
+ }
1961
+ return { valid: !0, data: n };
1962
+ } else
1963
+ return t === f.date && s === f.date && +r == +e ? { valid: !0, data: r } : { valid: !1 };
1964
+ }
1965
+ class re extends _ {
1966
+ _parse(e) {
1967
+ const { status: t, ctx: s } = this._processInputParams(e), n = (a, i) => {
1968
+ if (be(a) || be(i))
1969
+ return m;
1970
+ const o = Te(a.value, i.value);
1971
+ return o.valid ? ((we(a) || we(i)) && t.dirty(), { status: t.value, value: o.data }) : (u(s, {
1972
+ code: d.invalid_intersection_types
1973
+ }), m);
1974
+ };
1975
+ return s.common.async ? Promise.all([
1976
+ this._def.left._parseAsync({
1977
+ data: s.data,
1978
+ path: s.path,
1979
+ parent: s
1980
+ }),
1981
+ this._def.right._parseAsync({
1982
+ data: s.data,
1983
+ path: s.path,
1984
+ parent: s
1985
+ })
1986
+ ]).then(([a, i]) => n(a, i)) : n(this._def.left._parseSync({
1987
+ data: s.data,
1988
+ path: s.path,
1989
+ parent: s
1990
+ }), this._def.right._parseSync({
1991
+ data: s.data,
1992
+ path: s.path,
1993
+ parent: s
1994
+ }));
1995
+ }
1996
+ }
1997
+ re.create = (r, e, t) => new re({
1998
+ left: r,
1999
+ right: e,
2000
+ typeName: p.ZodIntersection,
2001
+ ...v(t)
2002
+ });
2003
+ class R extends _ {
2004
+ _parse(e) {
2005
+ const { status: t, ctx: s } = this._processInputParams(e);
2006
+ if (s.parsedType !== f.array)
2007
+ return u(s, {
2008
+ code: d.invalid_type,
2009
+ expected: f.array,
2010
+ received: s.parsedType
2011
+ }), m;
2012
+ if (s.data.length < this._def.items.length)
2013
+ return u(s, {
2014
+ code: d.too_small,
2015
+ minimum: this._def.items.length,
2016
+ inclusive: !0,
2017
+ exact: !1,
2018
+ type: "array"
2019
+ }), m;
2020
+ !this._def.rest && s.data.length > this._def.items.length && (u(s, {
2021
+ code: d.too_big,
2022
+ maximum: this._def.items.length,
2023
+ inclusive: !0,
2024
+ exact: !1,
2025
+ type: "array"
2026
+ }), t.dirty());
2027
+ const a = [...s.data].map((i, o) => {
2028
+ const l = this._def.items[o] || this._def.rest;
2029
+ return l ? l._parse(new E(s, i, s.path, o)) : null;
2030
+ }).filter((i) => !!i);
2031
+ return s.common.async ? Promise.all(a).then((i) => b.mergeArray(t, i)) : b.mergeArray(t, a);
2032
+ }
2033
+ get items() {
2034
+ return this._def.items;
2035
+ }
2036
+ rest(e) {
2037
+ return new R({
2038
+ ...this._def,
2039
+ rest: e
2040
+ });
2041
+ }
2042
+ }
2043
+ R.create = (r, e) => {
2044
+ if (!Array.isArray(r))
2045
+ throw new Error("You must pass an array of schemas to z.tuple([ ... ])");
2046
+ return new R({
2047
+ items: r,
2048
+ typeName: p.ZodTuple,
2049
+ rest: null,
2050
+ ...v(e)
2051
+ });
2052
+ };
2053
+ class se extends _ {
2054
+ get keySchema() {
2055
+ return this._def.keyType;
2056
+ }
2057
+ get valueSchema() {
2058
+ return this._def.valueType;
2059
+ }
2060
+ _parse(e) {
2061
+ const { status: t, ctx: s } = this._processInputParams(e);
2062
+ if (s.parsedType !== f.object)
2063
+ return u(s, {
2064
+ code: d.invalid_type,
2065
+ expected: f.object,
2066
+ received: s.parsedType
2067
+ }), m;
2068
+ const n = [], a = this._def.keyType, i = this._def.valueType;
2069
+ for (const o in s.data)
2070
+ n.push({
2071
+ key: a._parse(new E(s, o, s.path, o)),
2072
+ value: i._parse(new E(s, s.data[o], s.path, o)),
2073
+ alwaysSet: o in s.data
2074
+ });
2075
+ return s.common.async ? b.mergeObjectAsync(t, n) : b.mergeObjectSync(t, n);
2076
+ }
2077
+ get element() {
2078
+ return this._def.valueType;
2079
+ }
2080
+ static create(e, t, s) {
2081
+ return t instanceof _ ? new se({
2082
+ keyType: e,
2083
+ valueType: t,
2084
+ typeName: p.ZodRecord,
2085
+ ...v(s)
2086
+ }) : new se({
2087
+ keyType: S.create(),
2088
+ valueType: e,
2089
+ typeName: p.ZodRecord,
2090
+ ...v(t)
2091
+ });
2092
+ }
2093
+ }
2094
+ class ye extends _ {
2095
+ get keySchema() {
2096
+ return this._def.keyType;
2097
+ }
2098
+ get valueSchema() {
2099
+ return this._def.valueType;
2100
+ }
2101
+ _parse(e) {
2102
+ const { status: t, ctx: s } = this._processInputParams(e);
2103
+ if (s.parsedType !== f.map)
2104
+ return u(s, {
2105
+ code: d.invalid_type,
2106
+ expected: f.map,
2107
+ received: s.parsedType
2108
+ }), m;
2109
+ const n = this._def.keyType, a = this._def.valueType, i = [...s.data.entries()].map(([o, l], c) => ({
2110
+ key: n._parse(new E(s, o, s.path, [c, "key"])),
2111
+ value: a._parse(new E(s, l, s.path, [c, "value"]))
2112
+ }));
2113
+ if (s.common.async) {
2114
+ const o = /* @__PURE__ */ new Map();
2115
+ return Promise.resolve().then(async () => {
2116
+ for (const l of i) {
2117
+ const c = await l.key, y = await l.value;
2118
+ if (c.status === "aborted" || y.status === "aborted")
2119
+ return m;
2120
+ (c.status === "dirty" || y.status === "dirty") && t.dirty(), o.set(c.value, y.value);
2121
+ }
2122
+ return { status: t.value, value: o };
2123
+ });
2124
+ } else {
2125
+ const o = /* @__PURE__ */ new Map();
2126
+ for (const l of i) {
2127
+ const c = l.key, y = l.value;
2128
+ if (c.status === "aborted" || y.status === "aborted")
2129
+ return m;
2130
+ (c.status === "dirty" || y.status === "dirty") && t.dirty(), o.set(c.value, y.value);
2131
+ }
2132
+ return { status: t.value, value: o };
2133
+ }
2134
+ }
2135
+ }
2136
+ ye.create = (r, e, t) => new ye({
2137
+ valueType: e,
2138
+ keyType: r,
2139
+ typeName: p.ZodMap,
2140
+ ...v(t)
2141
+ });
2142
+ class z extends _ {
2143
+ _parse(e) {
2144
+ const { status: t, ctx: s } = this._processInputParams(e);
2145
+ if (s.parsedType !== f.set)
2146
+ return u(s, {
2147
+ code: d.invalid_type,
2148
+ expected: f.set,
2149
+ received: s.parsedType
2150
+ }), m;
2151
+ const n = this._def;
2152
+ n.minSize !== null && s.data.size < n.minSize.value && (u(s, {
2153
+ code: d.too_small,
2154
+ minimum: n.minSize.value,
2155
+ type: "set",
2156
+ inclusive: !0,
2157
+ exact: !1,
2158
+ message: n.minSize.message
2159
+ }), t.dirty()), n.maxSize !== null && s.data.size > n.maxSize.value && (u(s, {
2160
+ code: d.too_big,
2161
+ maximum: n.maxSize.value,
2162
+ type: "set",
2163
+ inclusive: !0,
2164
+ exact: !1,
2165
+ message: n.maxSize.message
2166
+ }), t.dirty());
2167
+ const a = this._def.valueType;
2168
+ function i(l) {
2169
+ const c = /* @__PURE__ */ new Set();
2170
+ for (const y of l) {
2171
+ if (y.status === "aborted")
2172
+ return m;
2173
+ y.status === "dirty" && t.dirty(), c.add(y.value);
2174
+ }
2175
+ return { status: t.value, value: c };
2176
+ }
2177
+ const o = [...s.data.values()].map((l, c) => a._parse(new E(s, l, s.path, c)));
2178
+ return s.common.async ? Promise.all(o).then((l) => i(l)) : i(o);
2179
+ }
2180
+ min(e, t) {
2181
+ return new z({
2182
+ ...this._def,
2183
+ minSize: { value: e, message: h.toString(t) }
2184
+ });
2185
+ }
2186
+ max(e, t) {
2187
+ return new z({
2188
+ ...this._def,
2189
+ maxSize: { value: e, message: h.toString(t) }
2190
+ });
2191
+ }
2192
+ size(e, t) {
2193
+ return this.min(e, t).max(e, t);
2194
+ }
2195
+ nonempty(e) {
2196
+ return this.min(1, e);
2197
+ }
2198
+ }
2199
+ z.create = (r, e) => new z({
2200
+ valueType: r,
2201
+ minSize: null,
2202
+ maxSize: null,
2203
+ typeName: p.ZodSet,
2204
+ ...v(e)
2205
+ });
2206
+ class W extends _ {
2207
+ constructor() {
2208
+ super(...arguments), this.validate = this.implement;
2209
+ }
2210
+ _parse(e) {
2211
+ const { ctx: t } = this._processInputParams(e);
2212
+ if (t.parsedType !== f.function)
2213
+ return u(t, {
2214
+ code: d.invalid_type,
2215
+ expected: f.function,
2216
+ received: t.parsedType
2217
+ }), m;
2218
+ function s(o, l) {
2219
+ return fe({
2220
+ data: o,
2221
+ path: t.path,
2222
+ errorMaps: [
2223
+ t.common.contextualErrorMap,
2224
+ t.schemaErrorMap,
2225
+ le(),
2226
+ q
2227
+ ].filter((c) => !!c),
2228
+ issueData: {
2229
+ code: d.invalid_arguments,
2230
+ argumentsError: l
2231
+ }
2232
+ });
2233
+ }
2234
+ function n(o, l) {
2235
+ return fe({
2236
+ data: o,
2237
+ path: t.path,
2238
+ errorMaps: [
2239
+ t.common.contextualErrorMap,
2240
+ t.schemaErrorMap,
2241
+ le(),
2242
+ q
2243
+ ].filter((c) => !!c),
2244
+ issueData: {
2245
+ code: d.invalid_return_type,
2246
+ returnTypeError: l
2247
+ }
2248
+ });
2249
+ }
2250
+ const a = { errorMap: t.common.contextualErrorMap }, i = t.data;
2251
+ if (this._def.returns instanceof J) {
2252
+ const o = this;
2253
+ return w(async function(...l) {
2254
+ const c = new T([]), y = await o._def.args.parseAsync(l, a).catch((ge) => {
2255
+ throw c.addIssue(s(l, ge)), c;
2256
+ }), Z = await Reflect.apply(i, this, y);
2257
+ return await o._def.returns._def.type.parseAsync(Z, a).catch((ge) => {
2258
+ throw c.addIssue(n(Z, ge)), c;
2259
+ });
2260
+ });
2261
+ } else {
2262
+ const o = this;
2263
+ return w(function(...l) {
2264
+ const c = o._def.args.safeParse(l, a);
2265
+ if (!c.success)
2266
+ throw new T([s(l, c.error)]);
2267
+ const y = Reflect.apply(i, this, c.data), Z = o._def.returns.safeParse(y, a);
2268
+ if (!Z.success)
2269
+ throw new T([n(y, Z.error)]);
2270
+ return Z.data;
2271
+ });
2272
+ }
2273
+ }
2274
+ parameters() {
2275
+ return this._def.args;
2276
+ }
2277
+ returnType() {
2278
+ return this._def.returns;
2279
+ }
2280
+ args(...e) {
2281
+ return new W({
2282
+ ...this._def,
2283
+ args: R.create(e).rest(D.create())
2284
+ });
2285
+ }
2286
+ returns(e) {
2287
+ return new W({
2288
+ ...this._def,
2289
+ returns: e
2290
+ });
2291
+ }
2292
+ implement(e) {
2293
+ return this.parse(e);
2294
+ }
2295
+ strictImplement(e) {
2296
+ return this.parse(e);
2297
+ }
2298
+ static create(e, t, s) {
2299
+ return new W({
2300
+ args: e || R.create([]).rest(D.create()),
2301
+ returns: t || D.create(),
2302
+ typeName: p.ZodFunction,
2303
+ ...v(s)
2304
+ });
2305
+ }
2306
+ }
2307
+ class ne extends _ {
2308
+ get schema() {
2309
+ return this._def.getter();
2310
+ }
2311
+ _parse(e) {
2312
+ const { ctx: t } = this._processInputParams(e);
2313
+ return this._def.getter()._parse({ data: t.data, path: t.path, parent: t });
2314
+ }
2315
+ }
2316
+ ne.create = (r, e) => new ne({
2317
+ getter: r,
2318
+ typeName: p.ZodLazy,
2319
+ ...v(e)
2320
+ });
2321
+ class ae extends _ {
2322
+ _parse(e) {
2323
+ if (e.data !== this._def.value) {
2324
+ const t = this._getOrReturnCtx(e);
2325
+ return u(t, {
2326
+ received: t.data,
2327
+ code: d.invalid_literal,
2328
+ expected: this._def.value
2329
+ }), m;
2330
+ }
2331
+ return { status: "valid", value: e.data };
2332
+ }
2333
+ get value() {
2334
+ return this._def.value;
2335
+ }
2336
+ }
2337
+ ae.create = (r, e) => new ae({
2338
+ value: r,
2339
+ typeName: p.ZodLiteral,
2340
+ ...v(e)
2341
+ });
2342
+ function Ae(r, e) {
2343
+ return new P({
2344
+ values: r,
2345
+ typeName: p.ZodEnum,
2346
+ ...v(e)
2347
+ });
2348
+ }
2349
+ class P extends _ {
2350
+ constructor() {
2351
+ super(...arguments), H.set(this, void 0);
2352
+ }
2353
+ _parse(e) {
2354
+ if (typeof e.data != "string") {
2355
+ const t = this._getOrReturnCtx(e), s = this._def.values;
2356
+ return u(t, {
2357
+ expected: g.joinValues(s),
2358
+ received: t.parsedType,
2359
+ code: d.invalid_type
2360
+ }), m;
2361
+ }
2362
+ if (he(this, H) || Ee(this, H, new Set(this._def.values)), !he(this, H).has(e.data)) {
2363
+ const t = this._getOrReturnCtx(e), s = this._def.values;
2364
+ return u(t, {
2365
+ received: t.data,
2366
+ code: d.invalid_enum_value,
2367
+ options: s
2368
+ }), m;
2369
+ }
2370
+ return w(e.data);
2371
+ }
2372
+ get options() {
2373
+ return this._def.values;
2374
+ }
2375
+ get enum() {
2376
+ const e = {};
2377
+ for (const t of this._def.values)
2378
+ e[t] = t;
2379
+ return e;
2380
+ }
2381
+ get Values() {
2382
+ const e = {};
2383
+ for (const t of this._def.values)
2384
+ e[t] = t;
2385
+ return e;
2386
+ }
2387
+ get Enum() {
2388
+ const e = {};
2389
+ for (const t of this._def.values)
2390
+ e[t] = t;
2391
+ return e;
2392
+ }
2393
+ extract(e, t = this._def) {
2394
+ return P.create(e, {
2395
+ ...this._def,
2396
+ ...t
2397
+ });
2398
+ }
2399
+ exclude(e, t = this._def) {
2400
+ return P.create(this.options.filter((s) => !e.includes(s)), {
2401
+ ...this._def,
2402
+ ...t
2403
+ });
2404
+ }
2405
+ }
2406
+ H = /* @__PURE__ */ new WeakMap();
2407
+ P.create = Ae;
2408
+ class ie extends _ {
2409
+ constructor() {
2410
+ super(...arguments), G.set(this, void 0);
2411
+ }
2412
+ _parse(e) {
2413
+ const t = g.getValidEnumValues(this._def.values), s = this._getOrReturnCtx(e);
2414
+ if (s.parsedType !== f.string && s.parsedType !== f.number) {
2415
+ const n = g.objectValues(t);
2416
+ return u(s, {
2417
+ expected: g.joinValues(n),
2418
+ received: s.parsedType,
2419
+ code: d.invalid_type
2420
+ }), m;
2421
+ }
2422
+ if (he(this, G) || Ee(this, G, new Set(g.getValidEnumValues(this._def.values))), !he(this, G).has(e.data)) {
2423
+ const n = g.objectValues(t);
2424
+ return u(s, {
2425
+ received: s.data,
2426
+ code: d.invalid_enum_value,
2427
+ options: n
2428
+ }), m;
2429
+ }
2430
+ return w(e.data);
2431
+ }
2432
+ get enum() {
2433
+ return this._def.values;
2434
+ }
2435
+ }
2436
+ G = /* @__PURE__ */ new WeakMap();
2437
+ ie.create = (r, e) => new ie({
2438
+ values: r,
2439
+ typeName: p.ZodNativeEnum,
2440
+ ...v(e)
2441
+ });
2442
+ class J extends _ {
2443
+ unwrap() {
2444
+ return this._def.type;
2445
+ }
2446
+ _parse(e) {
2447
+ const { ctx: t } = this._processInputParams(e);
2448
+ if (t.parsedType !== f.promise && t.common.async === !1)
2449
+ return u(t, {
2450
+ code: d.invalid_type,
2451
+ expected: f.promise,
2452
+ received: t.parsedType
2453
+ }), m;
2454
+ const s = t.parsedType === f.promise ? t.data : Promise.resolve(t.data);
2455
+ return w(s.then((n) => this._def.type.parseAsync(n, {
2456
+ path: t.path,
2457
+ errorMap: t.common.contextualErrorMap
2458
+ })));
2459
+ }
2460
+ }
2461
+ J.create = (r, e) => new J({
2462
+ type: r,
2463
+ typeName: p.ZodPromise,
2464
+ ...v(e)
2465
+ });
2466
+ class N extends _ {
2467
+ innerType() {
2468
+ return this._def.schema;
2469
+ }
2470
+ sourceType() {
2471
+ return this._def.schema._def.typeName === p.ZodEffects ? this._def.schema.sourceType() : this._def.schema;
2472
+ }
2473
+ _parse(e) {
2474
+ const { status: t, ctx: s } = this._processInputParams(e), n = this._def.effect || null, a = {
2475
+ addIssue: (i) => {
2476
+ u(s, i), i.fatal ? t.abort() : t.dirty();
2477
+ },
2478
+ get path() {
2479
+ return s.path;
2480
+ }
2481
+ };
2482
+ if (a.addIssue = a.addIssue.bind(a), n.type === "preprocess") {
2483
+ const i = n.transform(s.data, a);
2484
+ if (s.common.async)
2485
+ return Promise.resolve(i).then(async (o) => {
2486
+ if (t.value === "aborted")
2487
+ return m;
2488
+ const l = await this._def.schema._parseAsync({
2489
+ data: o,
2490
+ path: s.path,
2491
+ parent: s
2492
+ });
2493
+ return l.status === "aborted" ? m : l.status === "dirty" || t.value === "dirty" ? B(l.value) : l;
2494
+ });
2495
+ {
2496
+ if (t.value === "aborted")
2497
+ return m;
2498
+ const o = this._def.schema._parseSync({
2499
+ data: i,
2500
+ path: s.path,
2501
+ parent: s
2502
+ });
2503
+ return o.status === "aborted" ? m : o.status === "dirty" || t.value === "dirty" ? B(o.value) : o;
2504
+ }
2505
+ }
2506
+ if (n.type === "refinement") {
2507
+ const i = (o) => {
2508
+ const l = n.refinement(o, a);
2509
+ if (s.common.async)
2510
+ return Promise.resolve(l);
2511
+ if (l instanceof Promise)
2512
+ throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");
2513
+ return o;
2514
+ };
2515
+ if (s.common.async === !1) {
2516
+ const o = this._def.schema._parseSync({
2517
+ data: s.data,
2518
+ path: s.path,
2519
+ parent: s
2520
+ });
2521
+ return o.status === "aborted" ? m : (o.status === "dirty" && t.dirty(), i(o.value), { status: t.value, value: o.value });
2522
+ } else
2523
+ return this._def.schema._parseAsync({ data: s.data, path: s.path, parent: s }).then((o) => o.status === "aborted" ? m : (o.status === "dirty" && t.dirty(), i(o.value).then(() => ({ status: t.value, value: o.value }))));
2524
+ }
2525
+ if (n.type === "transform")
2526
+ if (s.common.async === !1) {
2527
+ const i = this._def.schema._parseSync({
2528
+ data: s.data,
2529
+ path: s.path,
2530
+ parent: s
2531
+ });
2532
+ if (!X(i))
2533
+ return i;
2534
+ const o = n.transform(i.value, a);
2535
+ if (o instanceof Promise)
2536
+ throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");
2537
+ return { status: t.value, value: o };
2538
+ } else
2539
+ return this._def.schema._parseAsync({ data: s.data, path: s.path, parent: s }).then((i) => X(i) ? Promise.resolve(n.transform(i.value, a)).then((o) => ({ status: t.value, value: o })) : i);
2540
+ g.assertNever(n);
2541
+ }
2542
+ }
2543
+ N.create = (r, e, t) => new N({
2544
+ schema: r,
2545
+ typeName: p.ZodEffects,
2546
+ effect: e,
2547
+ ...v(t)
2548
+ });
2549
+ N.createWithPreprocess = (r, e, t) => new N({
2550
+ schema: e,
2551
+ effect: { type: "preprocess", transform: r },
2552
+ typeName: p.ZodEffects,
2553
+ ...v(t)
2554
+ });
2555
+ class O extends _ {
2556
+ _parse(e) {
2557
+ return this._getType(e) === f.undefined ? w(void 0) : this._def.innerType._parse(e);
2558
+ }
2559
+ unwrap() {
2560
+ return this._def.innerType;
2561
+ }
2562
+ }
2563
+ O.create = (r, e) => new O({
2564
+ innerType: r,
2565
+ typeName: p.ZodOptional,
2566
+ ...v(e)
2567
+ });
2568
+ class V extends _ {
2569
+ _parse(e) {
2570
+ return this._getType(e) === f.null ? w(null) : this._def.innerType._parse(e);
2571
+ }
2572
+ unwrap() {
2573
+ return this._def.innerType;
2574
+ }
2575
+ }
2576
+ V.create = (r, e) => new V({
2577
+ innerType: r,
2578
+ typeName: p.ZodNullable,
2579
+ ...v(e)
2580
+ });
2581
+ class oe extends _ {
2582
+ _parse(e) {
2583
+ const { ctx: t } = this._processInputParams(e);
2584
+ let s = t.data;
2585
+ return t.parsedType === f.undefined && (s = this._def.defaultValue()), this._def.innerType._parse({
2586
+ data: s,
2587
+ path: t.path,
2588
+ parent: t
2589
+ });
2590
+ }
2591
+ removeDefault() {
2592
+ return this._def.innerType;
2593
+ }
2594
+ }
2595
+ oe.create = (r, e) => new oe({
2596
+ innerType: r,
2597
+ typeName: p.ZodDefault,
2598
+ defaultValue: typeof e.default == "function" ? e.default : () => e.default,
2599
+ ...v(e)
2600
+ });
2601
+ class de extends _ {
2602
+ _parse(e) {
2603
+ const { ctx: t } = this._processInputParams(e), s = {
2604
+ ...t,
2605
+ common: {
2606
+ ...t.common,
2607
+ issues: []
2608
+ }
2609
+ }, n = this._def.innerType._parse({
2610
+ data: s.data,
2611
+ path: s.path,
2612
+ parent: {
2613
+ ...s
2614
+ }
2615
+ });
2616
+ return Q(n) ? n.then((a) => ({
2617
+ status: "valid",
2618
+ value: a.status === "valid" ? a.value : this._def.catchValue({
2619
+ get error() {
2620
+ return new T(s.common.issues);
2621
+ },
2622
+ input: s.data
2623
+ })
2624
+ })) : {
2625
+ status: "valid",
2626
+ value: n.status === "valid" ? n.value : this._def.catchValue({
2627
+ get error() {
2628
+ return new T(s.common.issues);
2629
+ },
2630
+ input: s.data
2631
+ })
2632
+ };
2633
+ }
2634
+ removeCatch() {
2635
+ return this._def.innerType;
2636
+ }
2637
+ }
2638
+ de.create = (r, e) => new de({
2639
+ innerType: r,
2640
+ typeName: p.ZodCatch,
2641
+ catchValue: typeof e.catch == "function" ? e.catch : () => e.catch,
2642
+ ...v(e)
2643
+ });
2644
+ class ve extends _ {
2645
+ _parse(e) {
2646
+ if (this._getType(e) !== f.nan) {
2647
+ const s = this._getOrReturnCtx(e);
2648
+ return u(s, {
2649
+ code: d.invalid_type,
2650
+ expected: f.nan,
2651
+ received: s.parsedType
2652
+ }), m;
2653
+ }
2654
+ return { status: "valid", value: e.data };
2655
+ }
2656
+ }
2657
+ ve.create = (r) => new ve({
2658
+ typeName: p.ZodNaN,
2659
+ ...v(r)
2660
+ });
2661
+ const st = Symbol("zod_brand");
2662
+ class Ze extends _ {
2663
+ _parse(e) {
2664
+ const { ctx: t } = this._processInputParams(e), s = t.data;
2665
+ return this._def.type._parse({
2666
+ data: s,
2667
+ path: t.path,
2668
+ parent: t
2669
+ });
2670
+ }
2671
+ unwrap() {
2672
+ return this._def.type;
2673
+ }
2674
+ }
2675
+ class ue extends _ {
2676
+ _parse(e) {
2677
+ const { status: t, ctx: s } = this._processInputParams(e);
2678
+ if (s.common.async)
2679
+ return (async () => {
2680
+ const a = await this._def.in._parseAsync({
2681
+ data: s.data,
2682
+ path: s.path,
2683
+ parent: s
2684
+ });
2685
+ return a.status === "aborted" ? m : a.status === "dirty" ? (t.dirty(), B(a.value)) : this._def.out._parseAsync({
2686
+ data: a.value,
2687
+ path: s.path,
2688
+ parent: s
2689
+ });
2690
+ })();
2691
+ {
2692
+ const n = this._def.in._parseSync({
2693
+ data: s.data,
2694
+ path: s.path,
2695
+ parent: s
2696
+ });
2697
+ return n.status === "aborted" ? m : n.status === "dirty" ? (t.dirty(), {
2698
+ status: "dirty",
2699
+ value: n.value
2700
+ }) : this._def.out._parseSync({
2701
+ data: n.value,
2702
+ path: s.path,
2703
+ parent: s
2704
+ });
2705
+ }
2706
+ }
2707
+ static create(e, t) {
2708
+ return new ue({
2709
+ in: e,
2710
+ out: t,
2711
+ typeName: p.ZodPipeline
2712
+ });
2713
+ }
2714
+ }
2715
+ class ce extends _ {
2716
+ _parse(e) {
2717
+ const t = this._def.innerType._parse(e), s = (n) => (X(n) && (n.value = Object.freeze(n.value)), n);
2718
+ return Q(t) ? t.then((n) => s(n)) : s(t);
2719
+ }
2720
+ unwrap() {
2721
+ return this._def.innerType;
2722
+ }
2723
+ }
2724
+ ce.create = (r, e) => new ce({
2725
+ innerType: r,
2726
+ typeName: p.ZodReadonly,
2727
+ ...v(e)
2728
+ });
2729
+ function Me(r, e = {}, t) {
2730
+ return r ? Y.create().superRefine((s, n) => {
2731
+ var a, i;
2732
+ if (!r(s)) {
2733
+ const o = typeof e == "function" ? e(s) : typeof e == "string" ? { message: e } : e, l = (i = (a = o.fatal) !== null && a !== void 0 ? a : t) !== null && i !== void 0 ? i : !0, c = typeof o == "string" ? { message: o } : o;
2734
+ n.addIssue({ code: "custom", ...c, fatal: l });
2735
+ }
2736
+ }) : Y.create();
2737
+ }
2738
+ const nt = {
2739
+ object: x.lazycreate
2740
+ };
2741
+ var p;
2742
+ (function(r) {
2743
+ r.ZodString = "ZodString", r.ZodNumber = "ZodNumber", r.ZodNaN = "ZodNaN", r.ZodBigInt = "ZodBigInt", r.ZodBoolean = "ZodBoolean", r.ZodDate = "ZodDate", r.ZodSymbol = "ZodSymbol", r.ZodUndefined = "ZodUndefined", r.ZodNull = "ZodNull", r.ZodAny = "ZodAny", r.ZodUnknown = "ZodUnknown", r.ZodNever = "ZodNever", r.ZodVoid = "ZodVoid", r.ZodArray = "ZodArray", r.ZodObject = "ZodObject", r.ZodUnion = "ZodUnion", r.ZodDiscriminatedUnion = "ZodDiscriminatedUnion", r.ZodIntersection = "ZodIntersection", r.ZodTuple = "ZodTuple", r.ZodRecord = "ZodRecord", r.ZodMap = "ZodMap", r.ZodSet = "ZodSet", r.ZodFunction = "ZodFunction", r.ZodLazy = "ZodLazy", r.ZodLiteral = "ZodLiteral", r.ZodEnum = "ZodEnum", r.ZodEffects = "ZodEffects", r.ZodNativeEnum = "ZodNativeEnum", r.ZodOptional = "ZodOptional", r.ZodNullable = "ZodNullable", r.ZodDefault = "ZodDefault", r.ZodCatch = "ZodCatch", r.ZodPromise = "ZodPromise", r.ZodBranded = "ZodBranded", r.ZodPipeline = "ZodPipeline", r.ZodReadonly = "ZodReadonly";
2744
+ })(p || (p = {}));
2745
+ const at = (r, e = {
2746
+ message: `Input not instance of ${r.name}`
2747
+ }) => Me((t) => t instanceof r, e), $e = S.create, Pe = M.create, it = ve.create, ot = $.create, Ve = K.create, dt = L.create, ct = pe.create, ut = F.create, lt = ee.create, ft = Y.create, ht = D.create, pt = j.create, mt = me.create, yt = C.create, vt = x.create, _t = x.strictCreate, gt = te.create, xt = _e.create, kt = re.create, bt = R.create, wt = se.create, Tt = ye.create, Zt = z.create, St = W.create, Ct = ne.create, Nt = ae.create, Ot = P.create, Et = ie.create, Rt = J.create, Ne = N.create, It = O.create, jt = V.create, At = N.createWithPreprocess, Mt = ue.create, $t = () => $e().optional(), Pt = () => Pe().optional(), Vt = () => Ve().optional(), Dt = {
2748
+ string: (r) => S.create({ ...r, coerce: !0 }),
2749
+ number: (r) => M.create({ ...r, coerce: !0 }),
2750
+ boolean: (r) => K.create({
2751
+ ...r,
2752
+ coerce: !0
2753
+ }),
2754
+ bigint: (r) => $.create({ ...r, coerce: !0 }),
2755
+ date: (r) => L.create({ ...r, coerce: !0 })
2756
+ }, Lt = m;
2757
+ var k = /* @__PURE__ */ Object.freeze({
2758
+ __proto__: null,
2759
+ defaultErrorMap: q,
2760
+ setErrorMap: Le,
2761
+ getErrorMap: le,
2762
+ makeIssue: fe,
2763
+ EMPTY_PATH: ze,
2764
+ addIssueToContext: u,
2765
+ ParseStatus: b,
2766
+ INVALID: m,
2767
+ DIRTY: B,
2768
+ OK: w,
2769
+ isAborted: be,
2770
+ isDirty: we,
2771
+ isValid: X,
2772
+ isAsync: Q,
2773
+ get util() {
2774
+ return g;
2775
+ },
2776
+ get objectUtil() {
2777
+ return ke;
2778
+ },
2779
+ ZodParsedType: f,
2780
+ getParsedType: A,
2781
+ ZodType: _,
2782
+ datetimeRegex: je,
2783
+ ZodString: S,
2784
+ ZodNumber: M,
2785
+ ZodBigInt: $,
2786
+ ZodBoolean: K,
2787
+ ZodDate: L,
2788
+ ZodSymbol: pe,
2789
+ ZodUndefined: F,
2790
+ ZodNull: ee,
2791
+ ZodAny: Y,
2792
+ ZodUnknown: D,
2793
+ ZodNever: j,
2794
+ ZodVoid: me,
2795
+ ZodArray: C,
2796
+ ZodObject: x,
2797
+ ZodUnion: te,
2798
+ ZodDiscriminatedUnion: _e,
2799
+ ZodIntersection: re,
2800
+ ZodTuple: R,
2801
+ ZodRecord: se,
2802
+ ZodMap: ye,
2803
+ ZodSet: z,
2804
+ ZodFunction: W,
2805
+ ZodLazy: ne,
2806
+ ZodLiteral: ae,
2807
+ ZodEnum: P,
2808
+ ZodNativeEnum: ie,
2809
+ ZodPromise: J,
2810
+ ZodEffects: N,
2811
+ ZodTransformer: N,
2812
+ ZodOptional: O,
2813
+ ZodNullable: V,
2814
+ ZodDefault: oe,
2815
+ ZodCatch: de,
2816
+ ZodNaN: ve,
2817
+ BRAND: st,
2818
+ ZodBranded: Ze,
2819
+ ZodPipeline: ue,
2820
+ ZodReadonly: ce,
2821
+ custom: Me,
2822
+ Schema: _,
2823
+ ZodSchema: _,
2824
+ late: nt,
2825
+ get ZodFirstPartyTypeKind() {
2826
+ return p;
2827
+ },
2828
+ coerce: Dt,
2829
+ any: ft,
2830
+ array: yt,
2831
+ bigint: ot,
2832
+ boolean: Ve,
2833
+ date: dt,
2834
+ discriminatedUnion: xt,
2835
+ effect: Ne,
2836
+ enum: Ot,
2837
+ function: St,
2838
+ instanceof: at,
2839
+ intersection: kt,
2840
+ lazy: Ct,
2841
+ literal: Nt,
2842
+ map: Tt,
2843
+ nan: it,
2844
+ nativeEnum: Et,
2845
+ never: pt,
2846
+ null: lt,
2847
+ nullable: jt,
2848
+ number: Pe,
2849
+ object: vt,
2850
+ oboolean: Vt,
2851
+ onumber: Pt,
2852
+ optional: It,
2853
+ ostring: $t,
2854
+ pipeline: Mt,
2855
+ preprocess: At,
2856
+ promise: Rt,
2857
+ record: wt,
2858
+ set: Zt,
2859
+ strictObject: _t,
2860
+ string: $e,
2861
+ symbol: ct,
2862
+ transformer: Ne,
2863
+ tuple: bt,
2864
+ undefined: ut,
2865
+ union: gt,
2866
+ unknown: ht,
2867
+ void: mt,
2868
+ NEVER: Lt,
2869
+ ZodIssueCode: d,
2870
+ quotelessJson: De,
2871
+ ZodError: T
2872
+ });
2873
+ const zt = k.union([
2874
+ k.literal("pu"),
2875
+ k.literal("ku suli"),
2876
+ k.literal("ku lili"),
2877
+ k.literal("none")
2878
+ ]), Ut = k.union([k.literal("pre-pu"), k.literal("post-pu"), k.literal("post-ku")]), Bt = k.union([
2879
+ k.literal("core"),
2880
+ k.literal("common"),
2881
+ k.literal("uncommon"),
2882
+ k.literal("obscure"),
2883
+ k.literal("sandbox")
2884
+ ]), Wt = k.enum([
2885
+ "sitelen pona",
2886
+ "sitelen sitelen",
2887
+ "alphabet",
2888
+ "syllabary",
2889
+ "logography",
2890
+ "tokiponido alphabet",
2891
+ "tokiponido syllabary",
2892
+ "tokiponido logography"
2893
+ ]);
2894
+ function qt(r, e, t) {
2895
+ return (r.translations[t] ?? r.translations.en)[e];
2896
+ }
2897
+ export {
2898
+ zt as B,
2899
+ Ut as C,
2900
+ Bt as U,
2901
+ Wt as W,
2902
+ qt as g,
2903
+ k as z
2904
+ };
2905
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMtR2ZVdkV6RDQuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy8ucG5wbS96b2RAMy4yMy44L25vZGVfbW9kdWxlcy96b2QvbGliL2luZGV4Lm1qcyIsIi4uL3NyYy9saWIvdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHV0aWw7XG4oZnVuY3Rpb24gKHV0aWwpIHtcbiAgICB1dGlsLmFzc2VydEVxdWFsID0gKHZhbCkgPT4gdmFsO1xuICAgIGZ1bmN0aW9uIGFzc2VydElzKF9hcmcpIHsgfVxuICAgIHV0aWwuYXNzZXJ0SXMgPSBhc3NlcnRJcztcbiAgICBmdW5jdGlvbiBhc3NlcnROZXZlcihfeCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnROZXZlciA9IGFzc2VydE5ldmVyO1xuICAgIHV0aWwuYXJyYXlUb0VudW0gPSAoaXRlbXMpID0+IHtcbiAgICAgICAgY29uc3Qgb2JqID0ge307XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgb2JqW2l0ZW1dID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gICAgdXRpbC5nZXRWYWxpZEVudW1WYWx1ZXMgPSAob2JqKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhvYmopLmZpbHRlcigoaykgPT4gdHlwZW9mIG9ialtvYmpba11dICE9PSBcIm51bWJlclwiKTtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIHZhbGlkS2V5cykge1xuICAgICAgICAgICAgZmlsdGVyZWRba10gPSBvYmpba107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0VmFsdWVzKGZpbHRlcmVkKTtcbiAgICB9O1xuICAgIHV0aWwub2JqZWN0VmFsdWVzID0gKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gdXRpbC5vYmplY3RLZXlzKG9iaikubWFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqW2VdO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHV0aWwub2JqZWN0S2V5cyA9IHR5cGVvZiBPYmplY3Qua2V5cyA9PT0gXCJmdW5jdGlvblwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA/IChvYmopID0+IE9iamVjdC5rZXlzKG9iaikgLy8gZXNsaW50LWRpc2FibGUtbGluZSBiYW4vYmFuXG4gICAgICAgIDogKG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH07XG4gICAgdXRpbC5maW5kID0gKGFyciwgY2hlY2tlcikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tlcihpdGVtKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgdXRpbC5pc0ludGVnZXIgPSB0eXBlb2YgTnVtYmVyLmlzSW50ZWdlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gKHZhbCkgPT4gTnVtYmVyLmlzSW50ZWdlcih2YWwpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA6ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUodmFsKSAmJiBNYXRoLmZsb29yKHZhbCkgPT09IHZhbDtcbiAgICBmdW5jdGlvbiBqb2luVmFsdWVzKGFycmF5LCBzZXBhcmF0b3IgPSBcIiB8IFwiKSB7XG4gICAgICAgIHJldHVybiBhcnJheVxuICAgICAgICAgICAgLm1hcCgodmFsKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAnJHt2YWx9J2AgOiB2YWwpKVxuICAgICAgICAgICAgLmpvaW4oc2VwYXJhdG9yKTtcbiAgICB9XG4gICAgdXRpbC5qb2luVmFsdWVzID0gam9pblZhbHVlcztcbiAgICB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciA9IChfLCB2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbn0pKHV0aWwgfHwgKHV0aWwgPSB7fSkpO1xudmFyIG9iamVjdFV0aWw7XG4oZnVuY3Rpb24gKG9iamVjdFV0aWwpIHtcbiAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzID0gKGZpcnN0LCBzZWNvbmQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmZpcnN0LFxuICAgICAgICAgICAgLi4uc2Vjb25kLCAvLyBzZWNvbmQgb3ZlcndyaXRlcyBmaXJzdFxuICAgICAgICB9O1xuICAgIH07XG59KShvYmplY3RVdGlsIHx8IChvYmplY3RVdGlsID0ge30pKTtcbmNvbnN0IFpvZFBhcnNlZFR5cGUgPSB1dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcInN0cmluZ1wiLFxuICAgIFwibmFuXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImludGVnZXJcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJkYXRlXCIsXG4gICAgXCJiaWdpbnRcIixcbiAgICBcInN5bWJvbFwiLFxuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcInVuZGVmaW5lZFwiLFxuICAgIFwibnVsbFwiLFxuICAgIFwiYXJyYXlcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwidW5rbm93blwiLFxuICAgIFwicHJvbWlzZVwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcIm1hcFwiLFxuICAgIFwic2V0XCIsXG5dKTtcbmNvbnN0IGdldFBhcnNlZFR5cGUgPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgZGF0YTtcbiAgICBzd2l0Y2ggKHQpIHtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5zdHJpbmc7XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBpc05hTihkYXRhKSA/IFpvZFBhcnNlZFR5cGUubmFuIDogWm9kUGFyc2VkVHlwZS5udW1iZXI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5ib29sZWFuO1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmZ1bmN0aW9uO1xuICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5iaWdpbnQ7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnN5bWJvbDtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5hcnJheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS50aGVuID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICBkYXRhLmNhdGNoICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBTZXQgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YSBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmRhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5vYmplY3Q7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS51bmtub3duO1xuICAgIH1cbn07XG5cbmNvbnN0IFpvZElzc3VlQ29kZSA9IHV0aWwuYXJyYXlUb0VudW0oW1xuICAgIFwiaW52YWxpZF90eXBlXCIsXG4gICAgXCJpbnZhbGlkX2xpdGVyYWxcIixcbiAgICBcImN1c3RvbVwiLFxuICAgIFwiaW52YWxpZF91bmlvblwiLFxuICAgIFwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yXCIsXG4gICAgXCJpbnZhbGlkX2VudW1fdmFsdWVcIixcbiAgICBcInVucmVjb2duaXplZF9rZXlzXCIsXG4gICAgXCJpbnZhbGlkX2FyZ3VtZW50c1wiLFxuICAgIFwiaW52YWxpZF9yZXR1cm5fdHlwZVwiLFxuICAgIFwiaW52YWxpZF9kYXRlXCIsXG4gICAgXCJpbnZhbGlkX3N0cmluZ1wiLFxuICAgIFwidG9vX3NtYWxsXCIsXG4gICAgXCJ0b29fYmlnXCIsXG4gICAgXCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc1wiLFxuICAgIFwibm90X211bHRpcGxlX29mXCIsXG4gICAgXCJub3RfZmluaXRlXCIsXG5dKTtcbmNvbnN0IHF1b3RlbGVzc0pzb24gPSAob2JqKSA9PiB7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgcmV0dXJuIGpzb24ucmVwbGFjZSgvXCIoW15cIl0rKVwiOi9nLCBcIiQxOlwiKTtcbn07XG5jbGFzcyBab2RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihpc3N1ZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZSA9IChzdWIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCBzdWJdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZElzc3VlcyA9IChzdWJzID0gW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCAuLi5zdWJzXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWN0dWFsUHJvdG8gPSBuZXcudGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBhY3R1YWxQcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9fcHJvdG9fXyA9IGFjdHVhbFByb3RvO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmFtZSA9IFwiWm9kRXJyb3JcIjtcbiAgICAgICAgdGhpcy5pc3N1ZXMgPSBpc3N1ZXM7XG4gICAgfVxuICAgIGdldCBlcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzc3VlcztcbiAgICB9XG4gICAgZm9ybWF0KF9tYXBwZXIpIHtcbiAgICAgICAgY29uc3QgbWFwcGVyID0gX21hcHBlciB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGlzc3VlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHsgX2Vycm9yczogW10gfTtcbiAgICAgICAgY29uc3QgcHJvY2Vzc0Vycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGVycm9yLmlzc3Vlcykge1xuICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfdW5pb25cIikge1xuICAgICAgICAgICAgICAgICAgICBpc3N1ZS51bmlvbkVycm9ycy5tYXAocHJvY2Vzc0Vycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX3JldHVybl90eXBlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLnJldHVyblR5cGVFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF9hcmd1bWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoaXNzdWUuYXJndW1lbnRzRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5wYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEVycm9ycy5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VyciA9IGZpZWxkRXJyb3JzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaXNzdWUucGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gaXNzdWUucGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaSA9PT0gaXNzdWUucGF0aC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0eXBlb2YgZWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodHlwZW9mIGVsID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zdCBlcnJvckFycmF5OiBhbnkgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVycm9yQXJyYXkuX2Vycm9ycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCBlcnJvckFycmF5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdID0gY3VycltlbF0gfHwgeyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJbZWxdLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcHJvY2Vzc0Vycm9yKHRoaXMpO1xuICAgICAgICByZXR1cm4gZmllbGRFcnJvcnM7XG4gICAgfVxuICAgIHN0YXRpYyBhc3NlcnQodmFsdWUpIHtcbiAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBab2RFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGEgWm9kRXJyb3I6ICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxuICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5pc3N1ZXMsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzc3Vlcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGZsYXR0ZW4obWFwcGVyID0gKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0ge307XG4gICAgICAgIGNvbnN0IGZvcm1FcnJvcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5pc3N1ZXMpIHtcbiAgICAgICAgICAgIGlmIChzdWIucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dID0gZmllbGRFcnJvcnNbc3ViLnBhdGhbMF1dIHx8IFtdO1xuICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXS5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1FcnJvcnMucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZm9ybUVycm9ycywgZmllbGRFcnJvcnMgfTtcbiAgICB9XG4gICAgZ2V0IGZvcm1FcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYXR0ZW4oKTtcbiAgICB9XG59XG5ab2RFcnJvci5jcmVhdGUgPSAoaXNzdWVzKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoaXNzdWVzKTtcbiAgICByZXR1cm4gZXJyb3I7XG59O1xuXG5jb25zdCBlcnJvck1hcCA9IChpc3N1ZSwgX2N0eCkgPT4ge1xuICAgIGxldCBtZXNzYWdlO1xuICAgIHN3aXRjaCAoaXNzdWUuY29kZSkge1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGU6XG4gICAgICAgICAgICBpZiAoaXNzdWUucmVjZWl2ZWQgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiUmVxdWlyZWRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRXhwZWN0ZWQgJHtpc3N1ZS5leHBlY3RlZH0sIHJlY2VpdmVkICR7aXNzdWUucmVjZWl2ZWR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2xpdGVyYWw6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgbGl0ZXJhbCB2YWx1ZSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShpc3N1ZS5leHBlY3RlZCwgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYFVucmVjb2duaXplZCBrZXkocykgaW4gb2JqZWN0OiAke3V0aWwuam9pblZhbHVlcyhpc3N1ZS5rZXlzLCBcIiwgXCIpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLm9wdGlvbnMpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGVudW0gdmFsdWUuIEV4cGVjdGVkICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLm9wdGlvbnMpfSwgcmVjZWl2ZWQgJyR7aXNzdWUucmVjZWl2ZWR9J2A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3JldHVybl90eXBlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2RhdGU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZGF0ZWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmc6XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlLnZhbGlkYXRpb24gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJpbmNsdWRlc1wiIGluIGlzc3VlLnZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGluY2x1ZGUgXCIke2lzc3VlLnZhbGlkYXRpb24uaW5jbHVkZXN9XCJgO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlLnZhbGlkYXRpb24ucG9zaXRpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgJHttZXNzYWdlfSBhdCBvbmUgb3IgbW9yZSBwb3NpdGlvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7aXNzdWUudmFsaWRhdGlvbi5wb3NpdGlvbn1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFwic3RhcnRzV2l0aFwiIGluIGlzc3VlLnZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggXCIke2lzc3VlLnZhbGlkYXRpb24uc3RhcnRzV2l0aH1cImA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFwiZW5kc1dpdGhcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBlbmQgd2l0aCBcIiR7aXNzdWUudmFsaWRhdGlvbi5lbmRzV2l0aH1cImA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGlzc3VlLnZhbGlkYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnZhbGlkYXRpb24gIT09IFwicmVnZXhcIikge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCAke2lzc3VlLnZhbGlkYXRpb259YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS50b29fc21hbGw6XG4gICAgICAgICAgICBpZiAoaXNzdWUudHlwZSA9PT0gXCJhcnJheVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBcImV4YWN0bHlcIiA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBsZWFzdGAgOiBgbW9yZSB0aGFuYH0gJHtpc3N1ZS5taW5pbXVtfSBlbGVtZW50KHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBcImV4YWN0bHlcIiA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBsZWFzdGAgOiBgb3ZlcmB9ICR7aXNzdWUubWluaW11bX0gY2hhcmFjdGVyKHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHkgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICA6IGlzc3VlLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGdyZWF0ZXIgdGhhbiBgfSR7aXNzdWUubWluaW11bX1gO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJkYXRlXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBEYXRlIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5IGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBncmVhdGVyIHRoYW4gYH0ke25ldyBEYXRlKE51bWJlcihpc3N1ZS5taW5pbXVtKSl9YDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudG9vX2JpZzpcbiAgICAgICAgICAgIGlmIChpc3N1ZS50eXBlID09PSBcImFycmF5XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBtb3N0YCA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19IGVsZW1lbnQocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBtb3N0YCA6IGB1bmRlcmB9ICR7aXNzdWUubWF4aW11bX0gY2hhcmFjdGVyKHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHlgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBsZXNzIHRoYW4gb3IgZXF1YWwgdG9gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBCaWdJbnQgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHlgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBsZXNzIHRoYW4gb3IgZXF1YWwgdG9gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRGF0ZSBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0b2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYHNtYWxsZXIgdGhhbmB9ICR7bmV3IERhdGUoTnVtYmVyKGlzc3VlLm1heGltdW0pKX1gO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5jdXN0b206XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2Y6XG4gICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHtpc3N1ZS5tdWx0aXBsZU9mfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUubm90X2Zpbml0ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBcIk51bWJlciBtdXN0IGJlIGZpbml0ZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBtZXNzYWdlID0gX2N0eC5kZWZhdWx0RXJyb3I7XG4gICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGlzc3VlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbWVzc2FnZSB9O1xufTtcblxubGV0IG92ZXJyaWRlRXJyb3JNYXAgPSBlcnJvck1hcDtcbmZ1bmN0aW9uIHNldEVycm9yTWFwKG1hcCkge1xuICAgIG92ZXJyaWRlRXJyb3JNYXAgPSBtYXA7XG59XG5mdW5jdGlvbiBnZXRFcnJvck1hcCgpIHtcbiAgICByZXR1cm4gb3ZlcnJpZGVFcnJvck1hcDtcbn1cblxuY29uc3QgbWFrZUlzc3VlID0gKHBhcmFtcykgPT4ge1xuICAgIGNvbnN0IHsgZGF0YSwgcGF0aCwgZXJyb3JNYXBzLCBpc3N1ZURhdGEgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmdWxsUGF0aCA9IFsuLi5wYXRoLCAuLi4oaXNzdWVEYXRhLnBhdGggfHwgW10pXTtcbiAgICBjb25zdCBmdWxsSXNzdWUgPSB7XG4gICAgICAgIC4uLmlzc3VlRGF0YSxcbiAgICAgICAgcGF0aDogZnVsbFBhdGgsXG4gICAgfTtcbiAgICBpZiAoaXNzdWVEYXRhLm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICAgICAgcGF0aDogZnVsbFBhdGgsXG4gICAgICAgICAgICBtZXNzYWdlOiBpc3N1ZURhdGEubWVzc2FnZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IFwiXCI7XG4gICAgY29uc3QgbWFwcyA9IGVycm9yTWFwc1xuICAgICAgICAuZmlsdGVyKChtKSA9PiAhIW0pXG4gICAgICAgIC5zbGljZSgpXG4gICAgICAgIC5yZXZlcnNlKCk7XG4gICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBtYXAoZnVsbElzc3VlLCB7IGRhdGEsIGRlZmF1bHRFcnJvcjogZXJyb3JNZXNzYWdlIH0pLm1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlzc3VlRGF0YSxcbiAgICAgICAgcGF0aDogZnVsbFBhdGgsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICB9O1xufTtcbmNvbnN0IEVNUFRZX1BBVEggPSBbXTtcbmZ1bmN0aW9uIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgaXNzdWVEYXRhKSB7XG4gICAgY29uc3Qgb3ZlcnJpZGVNYXAgPSBnZXRFcnJvck1hcCgpO1xuICAgIGNvbnN0IGlzc3VlID0gbWFrZUlzc3VlKHtcbiAgICAgICAgaXNzdWVEYXRhOiBpc3N1ZURhdGEsXG4gICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCxcbiAgICAgICAgICAgIG92ZXJyaWRlTWFwLFxuICAgICAgICAgICAgb3ZlcnJpZGVNYXAgPT09IGVycm9yTWFwID8gdW5kZWZpbmVkIDogZXJyb3JNYXAsIC8vIHRoZW4gZ2xvYmFsIGRlZmF1bHQgbWFwXG4gICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgIH0pO1xuICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goaXNzdWUpO1xufVxuY2xhc3MgUGFyc2VTdGF0dXMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJ2YWxpZFwiO1xuICAgIH1cbiAgICBkaXJ0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IFwidmFsaWRcIilcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcImRpcnR5XCI7XG4gICAgfVxuICAgIGFib3J0KCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJhYm9ydGVkXCI7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0cykge1xuICAgICAgICBjb25zdCBhcnJheVZhbHVlID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBpZiAocy5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKHMuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBhcnJheVZhbHVlLnB1c2gocy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBhcnJheVZhbHVlIH07XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBtZXJnZU9iamVjdEFzeW5jKHN0YXR1cywgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qgc3luY1BhaXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycykge1xuICAgICAgICBjb25zdCBmaW5hbE9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcGFpcjtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmIChrZXkudmFsdWUgIT09IFwiX19wcm90b19fXCIgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlLnZhbHVlICE9PSBcInVuZGVmaW5lZFwiIHx8IHBhaXIuYWx3YXlzU2V0KSkge1xuICAgICAgICAgICAgICAgIGZpbmFsT2JqZWN0W2tleS52YWx1ZV0gPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsT2JqZWN0IH07XG4gICAgfVxufVxuY29uc3QgSU5WQUxJRCA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0YXR1czogXCJhYm9ydGVkXCIsXG59KTtcbmNvbnN0IERJUlRZID0gKHZhbHVlKSA9PiAoeyBzdGF0dXM6IFwiZGlydHlcIiwgdmFsdWUgfSk7XG5jb25zdCBPSyA9ICh2YWx1ZSkgPT4gKHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlIH0pO1xuY29uc3QgaXNBYm9ydGVkID0gKHgpID0+IHguc3RhdHVzID09PSBcImFib3J0ZWRcIjtcbmNvbnN0IGlzRGlydHkgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwiZGlydHlcIjtcbmNvbnN0IGlzVmFsaWQgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwidmFsaWRcIjtcbmNvbnN0IGlzQXN5bmMgPSAoeCkgPT4gdHlwZW9mIFByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgeCBpbnN0YW5jZW9mIFByb21pc2U7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XHJcbn1cclxuXHJcbnR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xuXG52YXIgZXJyb3JVdGlsO1xuKGZ1bmN0aW9uIChlcnJvclV0aWwpIHtcbiAgICBlcnJvclV0aWwuZXJyVG9PYmogPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2UgfSA6IG1lc3NhZ2UgfHwge307XG4gICAgZXJyb3JVdGlsLnRvU3RyaW5nID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5tZXNzYWdlO1xufSkoZXJyb3JVdGlsIHx8IChlcnJvclV0aWwgPSB7fSkpO1xuXG52YXIgX1pvZEVudW1fY2FjaGUsIF9ab2ROYXRpdmVFbnVtX2NhY2hlO1xuY2xhc3MgUGFyc2VJbnB1dExhenlQYXRoIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHZhbHVlLCBwYXRoLCBrZXkpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkUGF0aCA9IFtdO1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5kYXRhID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3BhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLl9rZXkgPSBrZXk7XG4gICAgfVxuICAgIGdldCBwYXRoKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlZFBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fa2V5IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgLi4udGhpcy5fa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCB0aGlzLl9rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRQYXRoO1xuICAgIH1cbn1cbmNvbnN0IGhhbmRsZVJlc3VsdCA9IChjdHgsIHJlc3VsdCkgPT4ge1xuICAgIGlmIChpc1ZhbGlkKHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogcmVzdWx0LnZhbHVlIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWN0eC5jb21tb24uaXNzdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWQgYnV0IG5vIGlzc3VlcyBkZXRlY3RlZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0IGVycm9yKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lcnJvcilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yKGN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufTtcbmZ1bmN0aW9uIHByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMpXG4gICAgICAgIHJldHVybiB7fTtcbiAgICBjb25zdCB7IGVycm9yTWFwLCBpbnZhbGlkX3R5cGVfZXJyb3IsIHJlcXVpcmVkX2Vycm9yLCBkZXNjcmlwdGlvbiB9ID0gcGFyYW1zO1xuICAgIGlmIChlcnJvck1hcCAmJiAoaW52YWxpZF90eXBlX2Vycm9yIHx8IHJlcXVpcmVkX2Vycm9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHVzZSBcImludmFsaWRfdHlwZV9lcnJvclwiIG9yIFwicmVxdWlyZWRfZXJyb3JcIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7XG4gICAgfVxuICAgIGlmIChlcnJvck1hcClcbiAgICAgICAgcmV0dXJuIHsgZXJyb3JNYXA6IGVycm9yTWFwLCBkZXNjcmlwdGlvbiB9O1xuICAgIGNvbnN0IGN1c3RvbU1hcCA9IChpc3MsIGN0eCkgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UgfSA9IHBhcmFtcztcbiAgICAgICAgaWYgKGlzcy5jb2RlID09PSBcImludmFsaWRfZW51bV92YWx1ZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlICE9PSBudWxsICYmIG1lc3NhZ2UgIT09IHZvaWQgMCA/IG1lc3NhZ2UgOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjdHguZGF0YSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogKF9hID0gbWVzc2FnZSAhPT0gbnVsbCAmJiBtZXNzYWdlICE9PSB2b2lkIDAgPyBtZXNzYWdlIDogcmVxdWlyZWRfZXJyb3IpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNzLmNvZGUgIT09IFwiaW52YWxpZF90eXBlXCIpXG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IChfYiA9IG1lc3NhZ2UgIT09IG51bGwgJiYgbWVzc2FnZSAhPT0gdm9pZCAwID8gbWVzc2FnZSA6IGludmFsaWRfdHlwZV9lcnJvcikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgIH07XG4gICAgcmV0dXJuIHsgZXJyb3JNYXA6IGN1c3RvbU1hcCwgZGVzY3JpcHRpb24gfTtcbn1cbmNsYXNzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKGRlZikge1xuICAgICAgICAvKiogQWxpYXMgb2Ygc2FmZVBhcnNlQXN5bmMgKi9cbiAgICAgICAgdGhpcy5zcGEgPSB0aGlzLnNhZmVQYXJzZUFzeW5jO1xuICAgICAgICB0aGlzLl9kZWYgPSBkZWY7XG4gICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlID0gdGhpcy5zYWZlUGFyc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wYXJzZUFzeW5jID0gdGhpcy5wYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc2FmZVBhcnNlQXN5bmMgPSB0aGlzLnNhZmVQYXJzZUFzeW5jLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zcGEuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmUgPSB0aGlzLnJlZmluZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZmluZW1lbnQgPSB0aGlzLnJlZmluZW1lbnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zdXBlclJlZmluZSA9IHRoaXMuc3VwZXJSZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsYWJsZSA9IHRoaXMubnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5udWxsaXNoID0gdGhpcy5udWxsaXNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYXJyYXkgPSB0aGlzLmFycmF5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvbWlzZSA9IHRoaXMucHJvbWlzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9yID0gdGhpcy5vci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFuZCA9IHRoaXMuYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5icmFuZCA9IHRoaXMuYnJhbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuY2F0Y2ggPSB0aGlzLmNhdGNoLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVzY3JpYmUgPSB0aGlzLmRlc2NyaWJlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGlwZSA9IHRoaXMucGlwZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmlzTnVsbGFibGUgPSB0aGlzLmlzTnVsbGFibGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc09wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgX2dldFR5cGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIF9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KSB7XG4gICAgICAgIHJldHVybiAoY3R4IHx8IHtcbiAgICAgICAgICAgIGNvbW1vbjogaW5wdXQucGFyZW50LmNvbW1vbixcbiAgICAgICAgICAgIGRhdGE6IGlucHV0LmRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhdGg6IGlucHV0LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogbmV3IFBhcnNlU3RhdHVzKCksXG4gICAgICAgICAgICBjdHg6IHtcbiAgICAgICAgICAgICAgICBjb21tb246IGlucHV0LnBhcmVudC5jb21tb24sXG4gICAgICAgICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSxcbiAgICAgICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpLFxuICAgICAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGlucHV0LnBhcmVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9wYXJzZVN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jaHJvbm91cyBwYXJzZSBlbmNvdW50ZXJlZCBwcm9taXNlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBfcGFyc2VBc3luYyhpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcGFyc2UoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2FmZVBhcnNlKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBzYWZlUGFyc2UoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBhc3luYzogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmFzeW5jKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZVN5bmMoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpO1xuICAgIH1cbiAgICBhc3luYyBwYXJzZUFzeW5jKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGRhdGEsIHBhcmFtcyk7XG4gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcylcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBhc3luYyBzYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgY3R4ID0ge1xuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCxcbiAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLFxuICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXJzZWRUeXBlOiBnZXRQYXJzZWRUeXBlKGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtYXliZUFzeW5jUmVzdWx0ID0gdGhpcy5fcGFyc2UoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChpc0FzeW5jKG1heWJlQXN5bmNSZXN1bHQpXG4gICAgICAgICAgICA/IG1heWJlQXN5bmNSZXN1bHRcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKG1heWJlQXN5bmNSZXN1bHQpKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJlZmluZShjaGVjaywgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBnZXRJc3N1ZVByb3BlcnRpZXMgPSAodmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG1lc3NhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UodmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrKHZhbCk7XG4gICAgICAgICAgICBjb25zdCBzZXRFcnJvciA9ICgpID0+IGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgICAgICAuLi5nZXRJc3N1ZVByb3BlcnRpZXModmFsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZmluZW1lbnQoY2hlY2ssIHJlZmluZW1lbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjaGVjayh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY3R4LmFkZElzc3VlKHR5cGVvZiByZWZpbmVtZW50RGF0YSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVmaW5lbWVudERhdGEodmFsLCBjdHgpXG4gICAgICAgICAgICAgICAgICAgIDogcmVmaW5lbWVudERhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlZmluZW1lbnQocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicmVmaW5lbWVudFwiLCByZWZpbmVtZW50IH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdXBlclJlZmluZShyZWZpbmVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KHJlZmluZW1lbnQpO1xuICAgIH1cbiAgICBvcHRpb25hbCgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE9wdGlvbmFsLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBudWxsaXNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5udWxsYWJsZSgpLm9wdGlvbmFsKCk7XG4gICAgfVxuICAgIGFycmF5KCkge1xuICAgICAgICByZXR1cm4gWm9kQXJyYXkuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiBab2RQcm9taXNlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBvcihvcHRpb24pIHtcbiAgICAgICAgcmV0dXJuIFpvZFVuaW9uLmNyZWF0ZShbdGhpcywgb3B0aW9uXSwgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgYW5kKGluY29taW5nKSB7XG4gICAgICAgIHJldHVybiBab2RJbnRlcnNlY3Rpb24uY3JlYXRlKHRoaXMsIGluY29taW5nLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZhdWx0KGRlZikge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQnJhbmRlZCh7XG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJyYW5kZWQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2F0Y2goZGVmKSB7XG4gICAgICAgIGNvbnN0IGNhdGNoVmFsdWVGdW5jID0gdHlwZW9mIGRlZiA9PT0gXCJmdW5jdGlvblwiID8gZGVmIDogKCkgPT4gZGVmO1xuICAgICAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgICAgICAgIGNhdGNoVmFsdWU6IGNhdGNoVmFsdWVGdW5jLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlc2NyaWJlKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IFRoaXMgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IFRoaXMoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaXBlKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gWm9kUGlwZWxpbmUuY3JlYXRlKHRoaXMsIHRhcmdldCk7XG4gICAgfVxuICAgIHJlYWRvbmx5KCkge1xuICAgICAgICByZXR1cm4gWm9kUmVhZG9ubHkuY3JlYXRlKHRoaXMpO1xuICAgIH1cbiAgICBpc09wdGlvbmFsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UodW5kZWZpbmVkKS5zdWNjZXNzO1xuICAgIH1cbiAgICBpc051bGxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2VzcztcbiAgICB9XG59XG5jb25zdCBjdWlkUmVnZXggPSAvXmNbXlxccy1dezgsfSQvaTtcbmNvbnN0IGN1aWQyUmVnZXggPSAvXlswLTlhLXpdKyQvO1xuY29uc3QgdWxpZFJlZ2V4ID0gL15bMC05QS1ISktNTlAtVFYtWl17MjZ9JC87XG4vLyBjb25zdCB1dWlkUmVnZXggPVxuLy8gICAvXihbYS1mMC05XXs4fS1bYS1mMC05XXs0fS1bMS01XVthLWYwLTldezN9LVthLWYwLTldezR9LVthLWYwLTldezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO1xuY29uc3QgdXVpZFJlZ2V4ID0gL15bMC05YS1mQS1GXXs4fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXsxMn0kL2k7XG5jb25zdCBuYW5vaWRSZWdleCA9IC9eW2EtejAtOV8tXXsyMX0kL2k7XG5jb25zdCBkdXJhdGlvblJlZ2V4ID0gL15bLStdP1AoPyEkKSg/Oig/OlstK10/XFxkK1kpfCg/OlstK10/XFxkK1suLF1cXGQrWSQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86KD86Wy0rXT9cXGQrVyl8KD86Wy0rXT9cXGQrWy4sXVxcZCtXJCkpPyg/Oig/OlstK10/XFxkK0QpfCg/OlstK10/XFxkK1suLF1cXGQrRCQpKT8oPzpUKD89W1xcZCstXSkoPzooPzpbLStdP1xcZCtIKXwoPzpbLStdP1xcZCtbLixdXFxkK0gkKSk/KD86KD86Wy0rXT9cXGQrTSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtNJCkpPyg/OlstK10/XFxkKyg/OlsuLF1cXGQrKT9TKT8pPz8kLztcbi8vIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2MTgxLzE1NTAxNTVcbi8vIG9sZCB2ZXJzaW9uOiB0b28gc2xvdywgZGlkbid0IHN1cHBvcnQgdW5pY29kZVxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSQvaTtcbi8vb2xkIGVtYWlsIHJlZ2V4XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID0gL14oKFtePD4oKVtcXF0uLDs6XFxzQFwiXSsoXFwuW148PigpW1xcXS4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKCg/IS0pKFtePD4oKVtcXF0uLDs6XFxzQFwiXStcXC4pK1tePD4oKVtcXF0uLDs6XFxzQFwiXXsxLH0pW14tPD4oKVtcXF0uLDs6XFxzQFwiXSQvaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFxcWygoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcXSl8KFxcW0lQdjY6KChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKVxcXSl8KFtBLVphLXowLTldKFtBLVphLXowLTktXSpbQS1aYS16MC05XSkqKFxcLltBLVphLXpdezIsfSkrKSkkLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXpBLVowLTlcXC5cXCFcXCNcXCRcXCVcXCZcXCdcXCpcXCtcXC9cXD1cXD9cXF5cXF9cXGBcXHtcXHxcXH1cXH5cXC1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKD86W2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKnxcIig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/fFxcWyg/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/fFthLXowLTktXSpbYS16MC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkkL2k7XG5jb25zdCBlbWFpbFJlZ2V4ID0gL14oPyFcXC4pKD8hLipcXC5cXC4pKFtBLVowLTlfJytcXC1cXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XFwtXSpcXC4pK1tBLVpdezIsfSQvaTtcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXowLTkuISMkJSbigJkqKy89P15fYHt8fX4tXStAW2EtejAtOS1dKyg/OlxcLlthLXowLTlcXC1dKykqJC9pO1xuLy8gZnJvbSBodHRwczovL3RoZWtldmluc2NvdHQuY29tL2Vtb2ppcy1pbi1qYXZhc2NyaXB0LyN3cml0aW5nLWEtcmVndWxhci1leHByZXNzaW9uXG5jb25zdCBfZW1vamlSZWdleCA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5sZXQgZW1vamlSZWdleDtcbi8vIGZhc3Rlciwgc2ltcGxlciwgc2FmZXJcbmNvbnN0IGlwdjRSZWdleCA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC87XG5jb25zdCBpcHY2UmVnZXggPSAvXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLztcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc4NjAzOTIvZGV0ZXJtaW5lLWlmLXN0cmluZy1pcy1pbi1iYXNlNjQtdXNpbmctamF2YXNjcmlwdFxuY29uc3QgYmFzZTY0UmVnZXggPSAvXihbMC05YS16QS1aKy9dezR9KSooKFswLTlhLXpBLVorL117Mn09PSl8KFswLTlhLXpBLVorL117M309KSk/JC87XG4vLyBzaW1wbGVcbi8vIGNvbnN0IGRhdGVSZWdleFNvdXJjZSA9IGBcXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfWA7XG4vLyBubyBsZWFwIHllYXIgdmFsaWRhdGlvblxuLy8gY29uc3QgZGF0ZVJlZ2V4U291cmNlID0gYFxcXFxkezR9LSgoMFsxMzU3OF18MTB8MTIpLTMxfCgwWzEzLTldfDFbMC0yXSktMzB8KDBbMS05XXwxWzAtMl0pLSgwWzEtOV18MVxcXFxkfDJcXFxcZCkpYDtcbi8vIHdpdGggbGVhcCB5ZWFyIHZhbGlkYXRpb25cbmNvbnN0IGRhdGVSZWdleFNvdXJjZSA9IGAoKFxcXFxkXFxcXGRbMjQ2OF1bMDQ4XXxcXFxcZFxcXFxkWzEzNTc5XVsyNl18XFxcXGRcXFxcZDBbNDhdfFswMjQ2OF1bMDQ4XTAwfFsxMzU3OV1bMjZdMDApLTAyLTI5fFxcXFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXFxcZHwzMCl8KDAyKS0oMFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuY29uc3QgZGF0ZVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7ZGF0ZVJlZ2V4U291cmNlfSRgKTtcbmZ1bmN0aW9uIHRpbWVSZWdleFNvdXJjZShhcmdzKSB7XG4gICAgLy8gbGV0IHJlZ2V4ID0gYFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9YDtcbiAgICBsZXQgcmVnZXggPSBgKFswMV1cXFxcZHwyWzAtM10pOlswLTVdXFxcXGQ6WzAtNV1cXFxcZGA7XG4gICAgaWYgKGFyZ3MucHJlY2lzaW9uKSB7XG4gICAgICAgIHJlZ2V4ID0gYCR7cmVnZXh9XFxcXC5cXFxcZHske2FyZ3MucHJlY2lzaW9ufX1gO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLnByZWNpc2lvbiA9PSBudWxsKSB7XG4gICAgICAgIHJlZ2V4ID0gYCR7cmVnZXh9KFxcXFwuXFxcXGQrKT9gO1xuICAgIH1cbiAgICByZXR1cm4gcmVnZXg7XG59XG5mdW5jdGlvbiB0aW1lUmVnZXgoYXJncykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeJHt0aW1lUmVnZXhTb3VyY2UoYXJncyl9JGApO1xufVxuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMTQzMjMxXG5mdW5jdGlvbiBkYXRldGltZVJlZ2V4KGFyZ3MpIHtcbiAgICBsZXQgcmVnZXggPSBgJHtkYXRlUmVnZXhTb3VyY2V9VCR7dGltZVJlZ2V4U291cmNlKGFyZ3MpfWA7XG4gICAgY29uc3Qgb3B0cyA9IFtdO1xuICAgIG9wdHMucHVzaChhcmdzLmxvY2FsID8gYFo/YCA6IGBaYCk7XG4gICAgaWYgKGFyZ3Mub2Zmc2V0KVxuICAgICAgICBvcHRzLnB1c2goYChbKy1dXFxcXGR7Mn06P1xcXFxkezJ9KWApO1xuICAgIHJlZ2V4ID0gYCR7cmVnZXh9KCR7b3B0cy5qb2luKFwifFwiKX0pYDtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7cmVnZXh9JGApO1xufVxuZnVuY3Rpb24gaXNWYWxpZElQKGlwLCB2ZXJzaW9uKSB7XG4gICAgaWYgKCh2ZXJzaW9uID09PSBcInY0XCIgfHwgIXZlcnNpb24pICYmIGlwdjRSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCh2ZXJzaW9uID09PSBcInY2XCIgfHwgIXZlcnNpb24pICYmIGlwdjZSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuY2xhc3MgWm9kU3RyaW5nIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gU3RyaW5nKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnN0cmluZyxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpO1xuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEubGVuZ3RoIDwgY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEubGVuZ3RoID4gY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGlucHV0LmRhdGEubGVuZ3RoID4gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcgfHwgdG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJlbWFpbFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFlbWFpbFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJlbWFpbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW1vamlcIikge1xuICAgICAgICAgICAgICAgIGlmICghZW1vamlSZWdleCkge1xuICAgICAgICAgICAgICAgICAgICBlbW9qaVJlZ2V4ID0gbmV3IFJlZ0V4cChfZW1vamlSZWdleCwgXCJ1XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImVtb2ppXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXV1aWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidXVpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibmFub2lkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbm9pZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJuYW5vaWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImN1aWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghY3VpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjdWlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkMlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdWlkMlJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjdWlkMlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1bGlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInVsaWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVybFwiKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVSTChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgY2hlY2sucmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gY2hlY2sucmVnZXgudGVzdChpbnB1dC5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3RSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJyZWdleFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidHJpbVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJpbmNsdWRlc1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLmluY2x1ZGVzKGNoZWNrLnZhbHVlLCBjaGVjay5wb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBpbmNsdWRlczogY2hlY2sudmFsdWUsIHBvc2l0aW9uOiBjaGVjay5wb3NpdGlvbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidG9Mb3dlckNhc2VcIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRvVXBwZXJDYXNlXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJzdGFydHNXaXRoXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuc3RhcnRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBzdGFydHNXaXRoOiBjaGVjay52YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW5kc1dpdGhcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5lbmRzV2l0aChjaGVjay52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBlbmRzV2l0aDogY2hlY2sudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGV0aW1lUmVnZXgoY2hlY2spO1xuICAgICAgICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGVSZWdleDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0aW1lXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IHRpbWVSZWdleChjaGVjayk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidGltZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZHVyYXRpb25cIikge1xuICAgICAgICAgICAgICAgIGlmICghZHVyYXRpb25SZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImlwXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRJUChpbnB1dC5kYXRhLCBjaGVjay52ZXJzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImlwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJiYXNlNjRcIikge1xuICAgICAgICAgICAgICAgIGlmICghYmFzZTY0UmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImJhc2U2NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBfcmVnZXgocmVnZXgsIHZhbGlkYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmaW5lbWVudCgoZGF0YSkgPT4gcmVnZXgudGVzdChkYXRhKSwge1xuICAgICAgICAgICAgdmFsaWRhdGlvbixcbiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbWFpbChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1haWxcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1cmwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVybFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGVtb2ppKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbW9qaVwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHV1aWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInV1aWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBuYW5vaWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcIm5hbm9pZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGN1aWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBjdWlkMihtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY3VpZDJcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1bGlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1bGlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgYmFzZTY0KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJiYXNlNjRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBpcChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiaXBcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pO1xuICAgIH1cbiAgICBkYXRldGltZShvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgICAgICBraW5kOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAgICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbG9jYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2YgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24pID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sXG4gICAgICAgICAgICBvZmZzZXQ6IChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5vZmZzZXQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAgICAgbG9jYWw6IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sb2NhbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZmFsc2UsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGF0ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZGF0ZVwiLCBtZXNzYWdlIH0pO1xuICAgIH1cbiAgICB0aW1lKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwidGltZVwiLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwidGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2YgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24pID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHVyYXRpb24obWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImR1cmF0aW9uXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgcmVnZXgocmVnZXgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwicmVnZXhcIixcbiAgICAgICAgICAgIHJlZ2V4OiByZWdleCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluY2x1ZGVzKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImluY2x1ZGVzXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBwb3NpdGlvbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBvc2l0aW9uLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXJ0c1dpdGgodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwic3RhcnRzV2l0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW5kc1dpdGgodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZW5kc1dpdGhcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1pbihtaW5MZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluTGVuZ3RoLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heExlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhMZW5ndGgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImxlbmd0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IGxlbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB6LnN0cmluZygpLm1pbigxKSBpbnN0ZWFkLlxuICAgICAqIEBzZWUge0BsaW5rIFpvZFN0cmluZy5taW59XG4gICAgICovXG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgdHJpbSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRyaW1cIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvTG93ZXJDYXNlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidG9Mb3dlckNhc2VcIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvVXBwZXJDYXNlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidG9VcHBlckNhc2VcIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBpc0RhdGV0aW1lKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImRhdGV0aW1lXCIpO1xuICAgIH1cbiAgICBnZXQgaXNEYXRlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImRhdGVcIik7XG4gICAgfVxuICAgIGdldCBpc1RpbWUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidGltZVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZHVyYXRpb25cIik7XG4gICAgfVxuICAgIGdldCBpc0VtYWlsKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtYWlsXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVUkwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidXJsXCIpO1xuICAgIH1cbiAgICBnZXQgaXNFbW9qaSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJlbW9qaVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVVVJRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1dWlkXCIpO1xuICAgIH1cbiAgICBnZXQgaXNOQU5PSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwibmFub2lkXCIpO1xuICAgIH1cbiAgICBnZXQgaXNDVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImN1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQyKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImN1aWQyXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVTElEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInVsaWRcIik7XG4gICAgfVxuICAgIGdldCBpc0lQKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImlwXCIpO1xuICAgIH1cbiAgICBnZXQgaXNCYXNlNjQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiYmFzZTY0XCIpO1xuICAgIH1cbiAgICBnZXQgbWluTGVuZ3RoKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhMZW5ndGgoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG59XG5ab2RTdHJpbmcuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nLFxuICAgICAgICBjb2VyY2U6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzk2NjQ4NC93aHktZG9lcy1tb2R1bHVzLW9wZXJhdG9yLXJldHVybi1mcmFjdGlvbmFsLW51bWJlci1pbi1qYXZhc2NyaXB0LzMxNzExMDM0IzMxNzExMDM0XG5mdW5jdGlvbiBmbG9hdFNhZmVSZW1haW5kZXIodmFsLCBzdGVwKSB7XG4gICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBzdGVwRGVjQ291bnQgPSAoc3RlcC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3QgZGVjQ291bnQgPSB2YWxEZWNDb3VudCA+IHN0ZXBEZWNDb3VudCA/IHZhbERlY0NvdW50IDogc3RlcERlY0NvdW50O1xuICAgIGNvbnN0IHZhbEludCA9IHBhcnNlSW50KHZhbC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgY29uc3Qgc3RlcEludCA9IHBhcnNlSW50KHN0ZXAudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIHJldHVybiAodmFsSW50ICUgc3RlcEludCkgLyBNYXRoLnBvdygxMCwgZGVjQ291bnQpO1xufVxuY2xhc3MgWm9kTnVtYmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgICAgIHRoaXMuc3RlcCA9IHRoaXMubXVsdGlwbGVPZjtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gTnVtYmVyKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bWJlcixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcImludFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGlsLmlzSW50ZWdlcihpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IFwiZmxvYXRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPiBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPj0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsb2F0U2FmZVJlbWFpbmRlcihpbnB1dC5kYXRhLCBjaGVjay52YWx1ZSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZixcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlT2Y6IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZmluaXRlXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X2Zpbml0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW50KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiaW50XCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3NpdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbm5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZmluaXRlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZmluaXRlXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzYWZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pblZhbHVlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbiAgICBnZXQgaXNJbnQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaW50XCIgfHxcbiAgICAgICAgICAgIChjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIiAmJiB1dGlsLmlzSW50ZWdlcihjaC52YWx1ZSkpKTtcbiAgICB9XG4gICAgZ2V0IGlzRmluaXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbCwgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJmaW5pdGVcIiB8fFxuICAgICAgICAgICAgICAgIGNoLmtpbmQgPT09IFwiaW50XCIgfHxcbiAgICAgICAgICAgICAgICBjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobWluKSAmJiBOdW1iZXIuaXNGaW5pdGUobWF4KTtcbiAgICB9XG59XG5ab2ROdW1iZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdW1iZXIsXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQmlnSW50IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IEJpZ0ludChpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJpZ2ludCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5iaWdpbnQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhICUgY2hlY2sudmFsdWUgIT09IEJpZ0ludCgwKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEJpZ0ludCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ubmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pblZhbHVlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW47XG4gICAgfVxuICAgIGdldCBtYXhWYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgIH1cbn1cblpvZEJpZ0ludC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCaWdJbnQsXG4gICAgICAgIGNvZXJjZTogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RCb29sZWFuIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gQm9vbGVhbihpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJvb2xlYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYm9vbGVhbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RCb29sZWFuLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEJvb2xlYW4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJvb2xlYW4sXG4gICAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRGF0ZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IG5ldyBEYXRlKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5kYXRlLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTmFOKGlucHV0LmRhdGEuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEuZ2V0VGltZSgpID4gY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cy52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShpbnB1dC5kYXRhLmdldFRpbWUoKSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkRhdGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluRGF0ZS5nZXRUaW1lKCksXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4RGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhEYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5EYXRlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCA/IG5ldyBEYXRlKG1pbikgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbWF4RGF0ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4ICE9IG51bGwgPyBuZXcgRGF0ZShtYXgpIDogbnVsbDtcbiAgICB9XG59XG5ab2REYXRlLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICBjb2VyY2U6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSB8fCBmYWxzZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REYXRlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kU3ltYm9sIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3ltYm9sKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnN5bWJvbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RTeW1ib2wuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU3ltYm9sKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTeW1ib2wsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RVbmRlZmluZWQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFVuZGVmaW5lZC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmRlZmluZWQoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuZGVmaW5lZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE51bGwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bGwsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kTnVsbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQW55IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIG90aGVyIGNsYXNzZXMgZnJvbSBleHRlbmRpbmcgWm9kQW55LiB0aGlzIGNhdXNlcyBpc3N1ZXMgd2l0aCBjYXRjaGFsbCBpbiBab2RPYmplY3QuXG4gICAgICAgIHRoaXMuX2FueSA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kQW55LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFueSh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQW55LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVW5rbm93biBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvLyByZXF1aXJlZFxuICAgICAgICB0aGlzLl91bmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RVbmtub3duLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVua25vd24oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVua25vd24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROZXZlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5ldmVyLFxuICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgfVxufVxuWm9kTmV2ZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmV2ZXIoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5ldmVyLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVm9pZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS52b2lkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFZvaWQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVm9pZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVm9pZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEFycmF5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4LCBzdGF0dXMgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmFycmF5LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5leGFjdExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgdG9vQmlnID0gY3R4LmRhdGEubGVuZ3RoID4gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjdHguZGF0YS5sZW5ndGggPCBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IHRvb0JpZyA/IFpvZElzc3VlQ29kZS50b29fYmlnIDogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogKHRvb1NtYWxsID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogKHRvb0JpZyA/IGRlZi5leGFjdExlbmd0aC52YWx1ZSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmLmV4YWN0TGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5taW5MZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCBkZWYubWluTGVuZ3RoLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5MZW5ndGgudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5taW5MZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1heExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5tYXhMZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06IGRlZi5tYXhMZW5ndGgudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tYXhMZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFsuLi5jdHguZGF0YV0ubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlZi50eXBlLl9wYXJzZUFzeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaSkpO1xuICAgICAgICAgICAgfSkpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5jdHguZGF0YV0ubWFwKChpdGVtLCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlU3luYyhuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0KTtcbiAgICB9XG4gICAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG4gICAgbWluKG1pbkxlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1pbkxlbmd0aDogeyB2YWx1ZTogbWluTGVuZ3RoLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhMZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtYXhMZW5ndGg6IHsgdmFsdWU6IG1heExlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgZXhhY3RMZW5ndGg6IHsgdmFsdWU6IGxlbiwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTtcbiAgICB9XG59XG5ab2RBcnJheS5jcmVhdGUgPSAoc2NoZW1hLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgdHlwZTogc2NoZW1hLFxuICAgICAgICBtaW5MZW5ndGg6IG51bGwsXG4gICAgICAgIG1heExlbmd0aDogbnVsbCxcbiAgICAgICAgZXhhY3RMZW5ndGg6IG51bGwsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQXJyYXksXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBkZWVwUGFydGlhbGlmeShzY2hlbWEpIHtcbiAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5zaGFwZSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSBzY2hlbWEuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoZmllbGRTY2hlbWEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi5zY2hlbWEuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZEFycmF5KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4uc2NoZW1hLl9kZWYsXG4gICAgICAgICAgICB0eXBlOiBkZWVwUGFydGlhbGlmeShzY2hlbWEuZWxlbWVudCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gWm9kT3B0aW9uYWwuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS51bndyYXAoKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2ROdWxsYWJsZSkge1xuICAgICAgICByZXR1cm4gWm9kTnVsbGFibGUuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYS51bndyYXAoKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RUdXBsZSkge1xuICAgICAgICByZXR1cm4gWm9kVHVwbGUuY3JlYXRlKHNjaGVtYS5pdGVtcy5tYXAoKGl0ZW0pID0+IGRlZXBQYXJ0aWFsaWZ5KGl0ZW0pKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gc2NoZW1hO1xuICAgIH1cbn1cbmNsYXNzIFpvZE9iamVjdCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLl9jYWNoZWQgPSBudWxsO1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgSW4gbW9zdCBjYXNlcywgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkIC0gdW5rbm93biBwcm9wZXJ0aWVzIGFyZSBub3cgc2lsZW50bHkgc3RyaXBwZWQuXG4gICAgICAgICAqIElmIHlvdSB3YW50IHRvIHBhc3MgdGhyb3VnaCB1bmtub3duIHByb3BlcnRpZXMsIHVzZSBgLnBhc3N0aHJvdWdoKClgIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm5vbnN0cmljdCA9IHRoaXMucGFzc3Rocm91Z2g7XG4gICAgICAgIC8vIGV4dGVuZDxcbiAgICAgICAgLy8gICBBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZSxcbiAgICAgICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB1dGlsLmZsYXR0ZW48e1xuICAgICAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgICAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gICAgICAgIC8vICAgICAgID8gT3V0cHV0W2tdXG4gICAgICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgICAgIC8vICAgfT4sXG4gICAgICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB1dGlsLmZsYXR0ZW48e1xuICAgICAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgSW5wdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIElucHV0XG4gICAgICAgIC8vICAgICAgID8gSW5wdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PlxuICAgICAgICAvLyA+KFxuICAgICAgICAvLyAgIGF1Z21lbnRhdGlvbjogQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICk6IFpvZE9iamVjdDxcbiAgICAgICAgLy8gICBleHRlbmRTaGFwZTxULCBBdWdtZW50YXRpb24+LFxuICAgICAgICAvLyAgIFVua25vd25LZXlzLFxuICAgICAgICAvLyAgIENhdGNoYWxsLFxuICAgICAgICAvLyAgIE5ld091dHB1dCxcbiAgICAgICAgLy8gICBOZXdJbnB1dFxuICAgICAgICAvLyA+IHtcbiAgICAgICAgLy8gICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIC8vICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgIC8vICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgLy8gICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgIC8vICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgLy8gICAgIH0pLFxuICAgICAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvKipcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGAuZXh0ZW5kYCBpbnN0ZWFkXG4gICAgICAgICAqICAqL1xuICAgICAgICB0aGlzLmF1Z21lbnQgPSB0aGlzLmV4dGVuZDtcbiAgICB9XG4gICAgX2dldENhY2hlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlZCAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWQ7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5fZGVmLnNoYXBlKCk7XG4gICAgICAgIGNvbnN0IGtleXMgPSB1dGlsLm9iamVjdEtleXMoc2hhcGUpO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2NhY2hlZCA9IHsgc2hhcGUsIGtleXMgfSk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCB7IHNoYXBlLCBrZXlzOiBzaGFwZUtleXMgfSA9IHRoaXMuX2dldENhY2hlZCgpO1xuICAgICAgICBjb25zdCBleHRyYUtleXMgPSBbXTtcbiAgICAgICAgaWYgKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIgJiZcbiAgICAgICAgICAgIHRoaXMuX2RlZi51bmtub3duS2V5cyA9PT0gXCJzdHJpcFwiKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXBlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhS2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXBlS2V5cykge1xuICAgICAgICAgICAgY29uc3Qga2V5VmFsaWRhdG9yID0gc2hhcGVba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXlWYWxpZGF0b3IuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIFpvZE5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB1bmtub3duS2V5cyA9IHRoaXMuX2RlZi51bmtub3duS2V5cztcbiAgICAgICAgICAgIGlmICh1bmtub3duS2V5cyA9PT0gXCJwYXNzdGhyb3VnaFwiKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgZXh0cmFLZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGN0eC5kYXRhW2tleV0gfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwic3RyaWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmFLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiBleHRyYUtleXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpcFwiKSA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIFpvZE9iamVjdCBlcnJvcjogaW52YWxpZCB1bmtub3duS2V5cyB2YWx1ZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJ1biBjYXRjaGFsbCB2YWxpZGF0aW9uXG4gICAgICAgICAgICBjb25zdCBjYXRjaGFsbCA9IHRoaXMuX2RlZi5jYXRjaGFsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGV4dHJhS2V5cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTtcbiAgICAgICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYXRjaGFsbC5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSAvLywgY3R4LmNoaWxkKGtleSksIHZhbHVlLCBnZXRQYXJzZWRUeXBlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IGtleSBpbiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsd2F5c1NldDogcGFpci5hbHdheXNTZXQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3luY1BhaXJzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoc3luY1BhaXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHNoYXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCk7XG4gICAgfVxuICAgIHN0cmljdChtZXNzYWdlKSB7XG4gICAgICAgIGVycm9yVXRpbC5lcnJUb09iajtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwic3RyaWN0XCIsXG4gICAgICAgICAgICAuLi4obWVzc2FnZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWFwOiAoaXNzdWUsIGN0eCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEVycm9yID0gKF9jID0gKF9iID0gKF9hID0gdGhpcy5fZGVmKS5lcnJvck1hcCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIGlzc3VlLCBjdHgpLm1lc3NhZ2UpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGN0eC5kZWZhdWx0RXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gXCJ1bnJlY29nbml6ZWRfa2V5c1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IChfZCA9IGVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBkZWZhdWx0RXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGVmYXVsdEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdHJpcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhc3N0aHJvdWdoKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICB1bmtub3duS2V5czogXCJwYXNzdGhyb3VnaFwiLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gY29uc3QgQXVnbWVudEZhY3RvcnkgPVxuICAgIC8vICAgPERlZiBleHRlbmRzIFpvZE9iamVjdERlZj4oZGVmOiBEZWYpID0+XG4gICAgLy8gICA8QXVnbWVudGF0aW9uIGV4dGVuZHMgWm9kUmF3U2hhcGU+KFxuICAgIC8vICAgICBhdWdtZW50YXRpb246IEF1Z21lbnRhdGlvblxuICAgIC8vICAgKTogWm9kT2JqZWN0PFxuICAgIC8vICAgICBleHRlbmRTaGFwZTxSZXR1cm5UeXBlPERlZltcInNoYXBlXCJdPiwgQXVnbWVudGF0aW9uPixcbiAgICAvLyAgICAgRGVmW1widW5rbm93bktleXNcIl0sXG4gICAgLy8gICAgIERlZltcImNhdGNoYWxsXCJdXG4gICAgLy8gICA+ID0+IHtcbiAgICAvLyAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgIC8vICAgICAgIC4uLmRlZixcbiAgICAvLyAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAvLyAgICAgICAgIC4uLmRlZi5zaGFwZSgpLFxuICAgIC8vICAgICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgIC8vICAgICAgIH0pLFxuICAgIC8vICAgICB9KSBhcyBhbnk7XG4gICAgLy8gICB9O1xuICAgIGV4dGVuZChhdWdtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmlvciB0byB6b2RAMS4wLjEyIHRoZXJlIHdhcyBhIGJ1ZyBpbiB0aGVcbiAgICAgKiBpbmZlcnJlZCB0eXBlIG9mIG1lcmdlZCBvYmplY3RzLiBQbGVhc2VcbiAgICAgKiB1cGdyYWRlIGlmIHlvdSBhcmUgZXhwZXJpZW5jaW5nIGlzc3Vlcy5cbiAgICAgKi9cbiAgICBtZXJnZShtZXJnaW5nKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAgICAgICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgICAgICAuLi5tZXJnaW5nLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICAvLyBtZXJnZTxcbiAgICAvLyAgIEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0LFxuICAgIC8vICAgQXVnbWVudGF0aW9uIGV4dGVuZHMgSW5jb21pbmdbXCJzaGFwZVwiXSxcbiAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHtcbiAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIE91dHB1dFxuICAgIC8vICAgICAgID8gT3V0cHV0W2tdXG4gICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAvLyAgIH0sXG4gICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHtcbiAgICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgSW5wdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBJbnB1dFxuICAgIC8vICAgICAgID8gSW5wdXRba11cbiAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgIC8vICAgfVxuICAgIC8vID4oXG4gICAgLy8gICBtZXJnaW5nOiBJbmNvbWluZ1xuICAgIC8vICk6IFpvZE9iamVjdDxcbiAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIFJldHVyblR5cGU8SW5jb21pbmdbXCJfZGVmXCJdW1wic2hhcGVcIl0+PixcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl0sXG4gICAgLy8gICBOZXdPdXRwdXQsXG4gICAgLy8gICBOZXdJbnB1dFxuICAgIC8vID4ge1xuICAgIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAvLyAgICAgc2hhcGU6ICgpID0+XG4gICAgLy8gICAgICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyh0aGlzLl9kZWYuc2hhcGUoKSwgbWVyZ2luZy5fZGVmLnNoYXBlKCkpLFxuICAgIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAvLyAgIHJldHVybiBtZXJnZWQ7XG4gICAgLy8gfVxuICAgIHNldEtleShrZXksIHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdGhpcy5hdWdtZW50KHsgW2tleV06IHNjaGVtYSB9KTtcbiAgICB9XG4gICAgLy8gbWVyZ2U8SW5jb21pbmcgZXh0ZW5kcyBBbnlab2RPYmplY3Q+KFxuICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmdcbiAgICAvLyApOiAvL1pvZE9iamVjdDxUICYgSW5jb21pbmdbXCJfc2hhcGVcIl0sIFVua25vd25LZXlzLCBDYXRjaGFsbD4gPSAobWVyZ2luZykgPT4ge1xuICAgIC8vIFpvZE9iamVjdDxcbiAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIFJldHVyblR5cGU8SW5jb21pbmdbXCJfZGVmXCJdW1wic2hhcGVcIl0+PixcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl1cbiAgICAvLyA+IHtcbiAgICAvLyAgIC8vIGNvbnN0IG1lcmdlZFNoYXBlID0gb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyhcbiAgICAvLyAgIC8vICAgdGhpcy5fZGVmLnNoYXBlKCksXG4gICAgLy8gICAvLyAgIG1lcmdpbmcuX2RlZi5zaGFwZSgpXG4gICAgLy8gICAvLyApO1xuICAgIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgdW5rbm93bktleXM6IG1lcmdpbmcuX2RlZi51bmtub3duS2V5cyxcbiAgICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgICAvLyAgICAgc2hhcGU6ICgpID0+XG4gICAgLy8gICAgICAgb2JqZWN0VXRpbC5tZXJnZVNoYXBlcyh0aGlzLl9kZWYuc2hhcGUoKSwgbWVyZ2luZy5fZGVmLnNoYXBlKCkpLFxuICAgIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAvLyAgIH0pIGFzIGFueTtcbiAgICAvLyAgIHJldHVybiBtZXJnZWQ7XG4gICAgLy8gfVxuICAgIGNhdGNoYWxsKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNhdGNoYWxsOiBpbmRleCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBpY2sobWFzaykge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHt9O1xuICAgICAgICB1dGlsLm9iamVjdEtleXMobWFzaykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAobWFza1trZXldICYmIHRoaXMuc2hhcGVba2V5XSkge1xuICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvbWl0KG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZWVwUGFydGlhbCgpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBQYXJ0aWFsaWZ5KHRoaXMpO1xuICAgIH1cbiAgICBwYXJ0aWFsKG1hc2spIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hLm9wdGlvbmFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXF1aXJlZChtYXNrKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IG5ld0ZpZWxkID0gZmllbGRTY2hlbWE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld0ZpZWxkIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RmllbGQgPSBuZXdGaWVsZC5fZGVmLmlubmVyVHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IG5ld0ZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAga2V5b2YoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVab2RFbnVtKHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSk7XG4gICAgfVxufVxuWm9kT2JqZWN0LmNyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RPYmplY3Quc3RyaWN0Q3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaWN0XCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RPYmplY3QubGF6eWNyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFVuaW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdHMocmVzdWx0cykge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGZpcnN0IGlzc3VlLWZyZWUgdmFsaWRhdGlvbiBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGlzc3VlcyBmcm9tIGRpcnR5IG9wdGlvblxuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLnJlc3VsdC5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJldHVybiBpbnZhbGlkXG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IHJlc3VsdHMubWFwKChyZXN1bHQpID0+IG5ldyBab2RFcnJvcihyZXN1bHQuY3R4LmNvbW1vbi5pc3N1ZXMpKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICAgICAgICAgIHVuaW9uRXJyb3JzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGN0eDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pKS50aGVuKGhhbmRsZVJlc3VsdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGRpcnR5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgaXNzdWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5jdHguY29tbW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY2hpbGRDdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgIWRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnR5ID0geyByZXN1bHQsIGN0eDogY2hpbGRDdHggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3Vlcy5wdXNoKGNoaWxkQ3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkaXJ0eSkge1xuICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4uZGlydHkuY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBkaXJ0eS5yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1bmlvbkVycm9ycyA9IGlzc3Vlcy5tYXAoKGlzc3VlcykgPT4gbmV3IFpvZEVycm9yKGlzc3VlcykpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gICAgfVxufVxuWm9kVW5pb24uY3JlYXRlID0gKHR5cGVzLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuaW9uKHtcbiAgICAgICAgb3B0aW9uczogdHlwZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5pb24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgWm9kRGlzY3JpbWluYXRlZFVuaW9uICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuY29uc3QgZ2V0RGlzY3JpbWluYXRvciA9ICh0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMYXp5KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2NoZW1hKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVmZmVjdHMpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5pbm5lclR5cGUoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMaXRlcmFsKSB7XG4gICAgICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFbnVtKSB7XG4gICAgICAgIHJldHVybiB0eXBlLm9wdGlvbnM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROYXRpdmVFbnVtKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyh0eXBlLmVudW0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsKSB7XG4gICAgICAgIHJldHVybiBbbnVsbF07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkge1xuICAgICAgICByZXR1cm4gW3VuZGVmaW5lZCwgLi4uZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsYWJsZSkge1xuICAgICAgICByZXR1cm4gW251bGwsIC4uLmdldERpc2NyaW1pbmF0b3IodHlwZS51bndyYXAoKSldO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kQnJhbmRlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFJlYWRvbmx5KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kQ2F0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5fZGVmLmlubmVyVHlwZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxufTtcbmNsYXNzIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yID0gdGhpcy5kaXNjcmltaW5hdG9yO1xuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWUgPSBjdHguZGF0YVtkaXNjcmltaW5hdG9yXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zTWFwLmdldChkaXNjcmltaW5hdG9yVmFsdWUpO1xuICAgICAgICBpZiAoIW9wdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5mcm9tKHRoaXMub3B0aW9uc01hcC5rZXlzKCkpLFxuICAgICAgICAgICAgICAgIHBhdGg6IFtkaXNjcmltaW5hdG9yXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRpc2NyaW1pbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcjtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnNNYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uIHNjaGVtYS4gSXRzIGJlaGF2aW91ciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgbm9ybWFsIHoudW5pb24oKSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBIb3dldmVyLCBpdCBvbmx5IGFsbG93cyBhIHVuaW9uIG9mIG9iamVjdHMsIGFsbCBvZiB3aGljaCBuZWVkIHRvIHNoYXJlIGEgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBtdXN0XG4gICAgICogaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgZWFjaCBvYmplY3QgaW4gdGhlIHVuaW9uLlxuICAgICAqIEBwYXJhbSBkaXNjcmltaW5hdG9yIHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGVzIGFuIGFycmF5IG9mIG9iamVjdCBzY2hlbWFzXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICAgIC8vIEdldCBhbGwgdGhlIHZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWVzXG4gICAgICAgIGNvbnN0IG9wdGlvbnNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWVzID0gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnNoYXBlW2Rpc2NyaW1pbmF0b3JdKTtcbiAgICAgICAgICAgIGlmICghZGlzY3JpbWluYXRvclZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxcYCR7ZGlzY3JpbWluYXRvcn1cXGAgY291bGQgbm90IGJlIGV4dHJhY3RlZCBmcm9tIGFsbCBzY2hlbWEgb3B0aW9uc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBkaXNjcmltaW5hdG9yVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNNYXAuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZGlzY3JpbWluYXRvcil9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcodmFsdWUpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnNldCh2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2REaXNjcmltaW5hdGVkVW5pb24oe1xuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REaXNjcmltaW5hdGVkVW5pb24sXG4gICAgICAgICAgICBkaXNjcmltaW5hdG9yLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnNNYXAsXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlVmFsdWVzKGEsIGIpIHtcbiAgICBjb25zdCBhVHlwZSA9IGdldFBhcnNlZFR5cGUoYSk7XG4gICAgY29uc3QgYlR5cGUgPSBnZXRQYXJzZWRUeXBlKGIpO1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBhIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLm9iamVjdCAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5vYmplY3QpIHtcbiAgICAgICAgY29uc3QgYktleXMgPSB1dGlsLm9iamVjdEtleXMoYik7XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleXMgPSB1dGlsXG4gICAgICAgICAgICAub2JqZWN0S2V5cyhhKVxuICAgICAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBiS2V5cy5pbmRleE9mKGtleSkgIT09IC0xKTtcbiAgICAgICAgY29uc3QgbmV3T2JqID0geyAuLi5hLCAuLi5iIH07XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXJlZEtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFZhbHVlID0gbWVyZ2VWYWx1ZXMoYVtrZXldLCBiW2tleV0pO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSBzaGFyZWRWYWx1ZS5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBuZXdPYmogfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUuYXJyYXkgJiYgYlR5cGUgPT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtQSA9IGFbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgaXRlbUIgPSBiW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFZhbHVlID0gbWVyZ2VWYWx1ZXMoaXRlbUEsIGl0ZW1CKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0FycmF5LnB1c2goc2hhcmVkVmFsdWUuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld0FycmF5IH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLmRhdGUgJiZcbiAgICAgICAgYlR5cGUgPT09IFpvZFBhcnNlZFR5cGUuZGF0ZSAmJlxuICAgICAgICArYSA9PT0gK2IpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IGEgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgIH1cbn1cbmNsYXNzIFpvZEludGVyc2VjdGlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBoYW5kbGVQYXJzZWQgPSAocGFyc2VkTGVmdCwgcGFyc2VkUmlnaHQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0Fib3J0ZWQocGFyc2VkTGVmdCkgfHwgaXNBYm9ydGVkKHBhcnNlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VWYWx1ZXMocGFyc2VkTGVmdC52YWx1ZSwgcGFyc2VkUmlnaHQudmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFtZXJnZWQudmFsaWQpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRGlydHkocGFyc2VkTGVmdCkgfHwgaXNEaXJ0eShwYXJzZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogbWVyZ2VkLmRhdGEgfTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmLmxlZnQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdKS50aGVuKChbbGVmdCwgcmlnaHRdKSA9PiBoYW5kbGVQYXJzZWQobGVmdCwgcmlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVQYXJzZWQodGhpcy5fZGVmLmxlZnQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KSwgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZSA9IChsZWZ0LCByaWdodCwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RJbnRlcnNlY3Rpb24oe1xuICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICByaWdodDogcmlnaHQsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kSW50ZXJzZWN0aW9uLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVHVwbGUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmFycmF5LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA8IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgbWluaW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdCA9IHRoaXMuX2RlZi5yZXN0O1xuICAgICAgICBpZiAoIXJlc3QgJiYgY3R4LmRhdGEubGVuZ3RoID4gdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4uY3R4LmRhdGFdXG4gICAgICAgICAgICAubWFwKChpdGVtLCBpdGVtSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuX2RlZi5pdGVtc1tpdGVtSW5kZXhdIHx8IHRoaXMuX2RlZi5yZXN0O1xuICAgICAgICAgICAgaWYgKCFzY2hlbWEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGl0ZW1JbmRleCkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4gISF4KTsgLy8gZmlsdGVyIG51bGxzXG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaXRlbXMpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIGl0ZW1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaXRlbXM7XG4gICAgfVxuICAgIHJlc3QocmVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHJlc3QsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblpvZFR1cGxlLmNyZWF0ZSA9IChzY2hlbWFzLCBwYXJhbXMpID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcGFzcyBhbiBhcnJheSBvZiBzY2hlbWFzIHRvIHoudHVwbGUoWyAuLi4gXSlcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgWm9kVHVwbGUoe1xuICAgICAgICBpdGVtczogc2NoZW1hcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RUdXBsZSxcbiAgICAgICAgcmVzdDogbnVsbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFJlY29yZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGdldCBrZXlTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlU2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5vYmplY3QpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUub2JqZWN0LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFpcnMgPSBbXTtcbiAgICAgICAgY29uc3Qga2V5VHlwZSA9IHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdHguZGF0YSkge1xuICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBrZXlUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwga2V5LCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGN0eC5kYXRhW2tleV0sIGN0eC5wYXRoLCBrZXkpKSxcbiAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IGtleSBpbiBjdHguZGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGZpcnN0LCBzZWNvbmQsIHRoaXJkKSB7XG4gICAgICAgIGlmIChzZWNvbmQgaW5zdGFuY2VvZiBab2RUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgICAgICAgICAga2V5VHlwZTogZmlyc3QsXG4gICAgICAgICAgICAgICAgdmFsdWVUeXBlOiBzZWNvbmQsXG4gICAgICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWNvcmQsXG4gICAgICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlyZCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgICAgICBrZXlUeXBlOiBab2RTdHJpbmcuY3JlYXRlKCksXG4gICAgICAgICAgICB2YWx1ZVR5cGU6IGZpcnN0LFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWNvcmQsXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHNlY29uZCksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmNsYXNzIFpvZE1hcCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGdldCBrZXlTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlU2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5tYXApIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubWFwLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5VHlwZSA9IHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBjb25zdCBwYWlycyA9IFsuLi5jdHguZGF0YS5lbnRyaWVzKCldLm1hcCgoW2tleSwgdmFsdWVdLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBrZXksIGN0eC5wYXRoLCBbaW5kZXgsIFwia2V5XCJdKSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwgW2luZGV4LCBcInZhbHVlXCJdKSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxNYXAuc2V0KGtleS52YWx1ZSwgdmFsdWUudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsTWFwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYWlyLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsTWFwIH07XG4gICAgICAgIH1cbiAgICB9XG59XG5ab2RNYXAuY3JlYXRlID0gKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RNYXAoe1xuICAgICAgICB2YWx1ZVR5cGUsXG4gICAgICAgIGtleVR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTWFwLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kU2V0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zZXQpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc2V0LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoZGVmLm1pblNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5zaXplIDwgZGVmLm1pblNpemUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogZGVmLm1pblNpemUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluU2l6ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWF4U2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPiBkZWYubWF4U2l6ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heFNpemUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4U2l6ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGZ1bmN0aW9uIGZpbmFsaXplU2V0KGVsZW1lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgcGFyc2VkU2V0LmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcGFyc2VkU2V0IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbLi4uY3R4LmRhdGEudmFsdWVzKCldLm1hcCgoaXRlbSwgaSkgPT4gdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKSk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZWxlbWVudHMpLnRoZW4oKGVsZW1lbnRzKSA9PiBmaW5hbGl6ZVNldChlbGVtZW50cykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsaXplU2V0KGVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtaW4obWluU2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtaW5TaXplOiB7IHZhbHVlOiBtaW5TaXplLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhTaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heFNpemU6IHsgdmFsdWU6IG1heFNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2l6ZShzaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbihzaXplLCBtZXNzYWdlKS5tYXgoc2l6ZSwgbWVzc2FnZSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblpvZFNldC5jcmVhdGUgPSAodmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgbWluU2l6ZTogbnVsbCxcbiAgICAgICAgbWF4U2l6ZTogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTZXQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RGdW5jdGlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnZhbGlkYXRlID0gdGhpcy5pbXBsZW1lbnQ7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmZ1bmN0aW9uLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUFyZ3NJc3N1ZShhcmdzLCBlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VJc3N1ZSh7XG4gICAgICAgICAgICAgICAgZGF0YTogYXJncyxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvck1hcHM6IFtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgZ2V0RXJyb3JNYXAoKSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgICAgICAgICAgICAgaXNzdWVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzRXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlUmV0dXJuc0lzc3VlKHJldHVybnMsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiByZXR1cm5zLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW1xuICAgICAgICAgICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1hcCgpLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcCxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICAgICAgICAgICAgICBpc3N1ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGVFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHsgZXJyb3JNYXA6IGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwIH07XG4gICAgICAgIGNvbnN0IGZuID0gY3R4LmRhdGE7XG4gICAgICAgIGlmICh0aGlzLl9kZWYucmV0dXJucyBpbnN0YW5jZW9mIFpvZFByb21pc2UpIHtcbiAgICAgICAgICAgIC8vIFdvdWxkIGxvdmUgYSB3YXkgdG8gYXZvaWQgZGlzYWJsaW5nIHRoaXMgcnVsZSwgYnV0IHdlIG5lZWRcbiAgICAgICAgICAgIC8vIGFuIGFsaWFzICh1c2luZyBhbiBhcnJvdyBmdW5jdGlvbiB3YXMgd2hhdCBjYXVzZWQgMjY1MSkuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBPSyhhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yKFtdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gYXdhaXQgbWUuX2RlZi5hcmdzXG4gICAgICAgICAgICAgICAgICAgIC5wYXJzZUFzeW5jKGFyZ3MsIHBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFkZElzc3VlKG1ha2VBcmdzSXNzdWUoYXJncywgZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gYXdhaXQgbWUuX2RlZi5yZXR1cm5zLl9kZWYudHlwZVxuICAgICAgICAgICAgICAgICAgICAucGFyc2VBc3luYyhyZXN1bHQsIHBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFkZElzc3VlKG1ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXR1cm5zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBXb3VsZCBsb3ZlIGEgd2F5IHRvIGF2b2lkIGRpc2FibGluZyB0aGlzIHJ1bGUsIGJ1dCB3ZSBuZWVkXG4gICAgICAgICAgICAvLyBhbiBhbGlhcyAodXNpbmcgYW4gYXJyb3cgZnVuY3Rpb24gd2FzIHdoYXQgY2F1c2VkIDI2NTEpLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gT0soZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gbWUuX2RlZi5hcmdzLnNhZmVQYXJzZShhcmdzLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkQXJncy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBab2RFcnJvcihbbWFrZUFyZ3NJc3N1ZShhcmdzLCBwYXJzZWRBcmdzLmVycm9yKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzLCBwYXJzZWRBcmdzLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJldHVybnMgPSBtZS5fZGVmLnJldHVybnMuc2FmZVBhcnNlKHJlc3VsdCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZFJldHVybnMuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBwYXJzZWRSZXR1cm5zLmVycm9yKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJucy5kYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyYW1ldGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5hcmdzO1xuICAgIH1cbiAgICByZXR1cm5UeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnJldHVybnM7XG4gICAgfVxuICAgIGFyZ3MoLi4uaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBhcmdzOiBab2RUdXBsZS5jcmVhdGUoaXRlbXMpLnJlc3QoWm9kVW5rbm93bi5jcmVhdGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5zKHJldHVyblR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICByZXR1cm5zOiByZXR1cm5UeXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW1wbGVtZW50KGZ1bmMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jO1xuICAgIH1cbiAgICBzdHJpY3RJbXBsZW1lbnQoZnVuYykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGdW5jID0gdGhpcy5wYXJzZShmdW5jKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZEZ1bmM7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoYXJncywgcmV0dXJucywgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgYXJnczogKGFyZ3NcbiAgICAgICAgICAgICAgICA/IGFyZ3NcbiAgICAgICAgICAgICAgICA6IFpvZFR1cGxlLmNyZWF0ZShbXSkucmVzdChab2RVbmtub3duLmNyZWF0ZSgpKSksXG4gICAgICAgICAgICByZXR1cm5zOiByZXR1cm5zIHx8IFpvZFVua25vd24uY3JlYXRlKCksXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEZ1bmN0aW9uLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5jbGFzcyBab2RMYXp5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBsYXp5U2NoZW1hID0gdGhpcy5fZGVmLmdldHRlcigpO1xuICAgICAgICByZXR1cm4gbGF6eVNjaGVtYS5fcGFyc2UoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgIH1cbn1cblpvZExhenkuY3JlYXRlID0gKGdldHRlciwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RMYXp5KHtcbiAgICAgICAgZ2V0dGVyOiBnZXR0ZXIsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGF6eSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZExpdGVyYWwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0LmRhdGEgIT09IHRoaXMuX2RlZi52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2xpdGVyYWwsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHRoaXMuX2RlZi52YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZTtcbiAgICB9XG59XG5ab2RMaXRlcmFsLmNyZWF0ZSA9ICh2YWx1ZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RMaXRlcmFsKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZExpdGVyYWwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBjcmVhdGVab2RFbnVtKHZhbHVlcywgcGFyYW1zKSB7XG4gICAgcmV0dXJuIG5ldyBab2RFbnVtKHtcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVudW0sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn1cbmNsYXNzIFpvZEVudW0gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgX1pvZEVudW1fY2FjaGUuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1pvZEVudW1fY2FjaGUsIFwiZlwiKSkge1xuICAgICAgICAgICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCh0aGlzLCBfWm9kRW51bV9jYWNoZSwgbmV3IFNldCh0aGlzLl9kZWYudmFsdWVzKSwgXCJmXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWm9kRW51bV9jYWNoZSwgXCJmXCIpLmhhcyhpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogZXhwZWN0ZWRWYWx1ZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVzO1xuICAgIH1cbiAgICBnZXQgZW51bSgpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykge1xuICAgICAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVmFsdWVzO1xuICAgIH1cbiAgICBnZXQgRW51bSgpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGV4dHJhY3QodmFsdWVzLCBuZXdEZWYgPSB0aGlzLl9kZWYpIHtcbiAgICAgICAgcmV0dXJuIFpvZEVudW0uY3JlYXRlKHZhbHVlcywge1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgLi4ubmV3RGVmLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXhjbHVkZSh2YWx1ZXMsIG5ld0RlZiA9IHRoaXMuX2RlZikge1xuICAgICAgICByZXR1cm4gWm9kRW51bS5jcmVhdGUodGhpcy5vcHRpb25zLmZpbHRlcigob3B0KSA9PiAhdmFsdWVzLmluY2x1ZGVzKG9wdCkpLCB7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICAuLi5uZXdEZWYsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbl9ab2RFbnVtX2NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblpvZEVudW0uY3JlYXRlID0gY3JlYXRlWm9kRW51bTtcbmNsYXNzIFpvZE5hdGl2ZUVudW0gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgX1pvZE5hdGl2ZUVudW1fY2FjaGUuc2V0KHRoaXMsIHZvaWQgMCk7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBuYXRpdmVFbnVtVmFsdWVzID0gdXRpbC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN0cmluZyAmJlxuICAgICAgICAgICAgY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubnVtYmVyKSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHV0aWwub2JqZWN0VmFsdWVzKG5hdGl2ZUVudW1WYWx1ZXMpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWwuam9pblZhbHVlcyhleHBlY3RlZFZhbHVlcyksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWm9kTmF0aXZlRW51bV9jYWNoZSwgXCJmXCIpKSB7XG4gICAgICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ab2ROYXRpdmVFbnVtX2NhY2hlLCBuZXcgU2V0KHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSwgXCJmXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWm9kTmF0aXZlRW51bV9jYWNoZSwgXCJmXCIpLmhhcyhpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgICB9XG59XG5fWm9kTmF0aXZlRW51bV9jYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5ab2ROYXRpdmVFbnVtLmNyZWF0ZSA9ICh2YWx1ZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmF0aXZlRW51bSh7XG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hdGl2ZUVudW0sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RQcm9taXNlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnByb21pc2UgJiZcbiAgICAgICAgICAgIGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnByb21pc2UsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNpZmllZCA9IGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnByb21pc2VcbiAgICAgICAgICAgID8gY3R4LmRhdGFcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKGN0eC5kYXRhKTtcbiAgICAgICAgcmV0dXJuIE9LKHByb21pc2lmaWVkLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZS5wYXJzZUFzeW5jKGRhdGEsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cblpvZFByb21pc2UuY3JlYXRlID0gKHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHtcbiAgICAgICAgdHlwZTogc2NoZW1hLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFByb21pc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RFZmZlY3RzIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgaW5uZXJUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYTtcbiAgICB9XG4gICAgc291cmNlVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHNcbiAgICAgICAgICAgID8gdGhpcy5fZGVmLnNjaGVtYS5zb3VyY2VUeXBlKClcbiAgICAgICAgICAgIDogdGhpcy5fZGVmLnNjaGVtYTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGVmZmVjdCA9IHRoaXMuX2RlZi5lZmZlY3QgfHwgbnVsbDtcbiAgICAgICAgY29uc3QgY2hlY2tDdHggPSB7XG4gICAgICAgICAgICBhZGRJc3N1ZTogKGFyZykgPT4ge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgYXJnKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLmZhdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBwYXRoKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGF0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNoZWNrQ3R4LmFkZElzc3VlID0gY2hlY2tDdHguYWRkSXNzdWUuYmluZChjaGVja0N0eCk7XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJwcmVwcm9jZXNzXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGVmZmVjdC50cmFuc2Zvcm0oY3R4LmRhdGEsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwcm9jZXNzZWQpLnRoZW4oYXN5bmMgKHByb2Nlc3NlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZhbHVlID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJUWShyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZhbHVlID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBwcm9jZXNzZWQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJUWShyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWZmZWN0LnR5cGUgPT09IFwicmVmaW5lbWVudFwiKSB7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRlUmVmaW5lbWVudCA9IChhY2MpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBlZmZlY3QucmVmaW5lbWVudChhY2MsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFzeW5jIHJlZmluZW1lbnQgZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVSZWZpbmVtZW50KGlubmVyLnZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlubmVyLnZhbHVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYVxuICAgICAgICAgICAgICAgICAgICAuX3BhcnNlQXN5bmMoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChpbm5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVSZWZpbmVtZW50KGlubmVyLnZhbHVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC50cmFuc2Zvcm0oYmFzZS52YWx1ZSwgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXN5bmNocm9ub3VzIHRyYW5zZm9ybSBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiByZXN1bHQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgIC5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGJhc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKGJhc2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCkpLnRoZW4oKHJlc3VsdCkgPT4gKHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiByZXN1bHQgfSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoZWZmZWN0KTtcbiAgICB9XG59XG5ab2RFZmZlY3RzLmNyZWF0ZSA9IChzY2hlbWEsIGVmZmVjdCwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcblpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3MgPSAocHJlcHJvY2Vzcywgc2NoZW1hLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGVmZmVjdDogeyB0eXBlOiBcInByZXByb2Nlc3NcIiwgdHJhbnNmb3JtOiBwcmVwcm9jZXNzIH0sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE9wdGlvbmFsIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gT0sodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZE9wdGlvbmFsLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9wdGlvbmFsKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9wdGlvbmFsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTnVsbGFibGUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gT0sobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2ROdWxsYWJsZS5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsYWJsZSh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsYWJsZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZERlZmF1bHQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGxldCBkYXRhID0gY3R4LmRhdGE7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9kZWYuZGVmYXVsdFZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVtb3ZlRGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kRGVmYXVsdC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2REZWZhdWx0KHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERlZmF1bHQsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogdHlwZW9mIHBhcmFtcy5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgID8gcGFyYW1zLmRlZmF1bHRcbiAgICAgICAgICAgIDogKCkgPT4gcGFyYW1zLmRlZmF1bHQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RDYXRjaCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgLy8gbmV3Q3R4IGlzIHVzZWQgdG8gbm90IGNvbGxlY3QgaXNzdWVzIGZyb20gaW5uZXIgdHlwZXMgaW4gY3R4XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IHtcbiAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGE6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgcGF0aDogbmV3Q3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICAuLi5uZXdDdHgsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzQXN5bmMocmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwidmFsaWRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlQ2F0Y2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZENhdGNoLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZENhdGNoLFxuICAgICAgICBjYXRjaFZhbHVlOiB0eXBlb2YgcGFyYW1zLmNhdGNoID09PSBcImZ1bmN0aW9uXCIgPyBwYXJhbXMuY2F0Y2ggOiAoKSA9PiBwYXJhbXMuY2F0Y2gsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROYU4gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5uYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubmFuLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxufVxuWm9kTmFOLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE5hTih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmFOLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY29uc3QgQlJBTkQgPSBTeW1ib2woXCJ6b2RfYnJhbmRcIik7XG5jbGFzcyBab2RCcmFuZGVkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LmRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG59XG5jbGFzcyBab2RQaXBlbGluZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlQXN5bmMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5SZXN1bHQgPSBhd2FpdCB0aGlzLl9kZWYuaW4uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJUWShpblJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm91dC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpblJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXN5bmMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gdGhpcy5fZGVmLmluLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJkaXJ0eVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYub3V0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpblJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoYSwgYikge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFBpcGVsaW5lKHtcbiAgICAgICAgICAgIGluOiBhLFxuICAgICAgICAgICAgb3V0OiBiLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RQaXBlbGluZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY2xhc3MgWm9kUmVhZG9ubHkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgICAgICBjb25zdCBmcmVlemUgPSAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzVmFsaWQoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnZhbHVlID0gT2JqZWN0LmZyZWV6ZShkYXRhLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNBc3luYyhyZXN1bHQpXG4gICAgICAgICAgICA/IHJlc3VsdC50aGVuKChkYXRhKSA9PiBmcmVlemUoZGF0YSkpXG4gICAgICAgICAgICA6IGZyZWV6ZShyZXN1bHQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZFJlYWRvbmx5LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFJlYWRvbmx5KHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlYWRvbmx5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gY3VzdG9tKGNoZWNrLCBwYXJhbXMgPSB7fSwgXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKlxuICogUGFzcyBgZmF0YWxgIGludG8gdGhlIHBhcmFtcyBvYmplY3QgaW5zdGVhZDpcbiAqXG4gKiBgYGB0c1xuICogei5zdHJpbmcoKS5jdXN0b20oKHZhbCkgPT4gdmFsLmxlbmd0aCA+IDUsIHsgZmF0YWw6IGZhbHNlIH0pXG4gKiBgYGBcbiAqXG4gKi9cbmZhdGFsKSB7XG4gICAgaWYgKGNoZWNrKVxuICAgICAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICBpZiAoIWNoZWNrKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IHBhcmFtcyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICA6IHR5cGVvZiBwYXJhbXMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8geyBtZXNzYWdlOiBwYXJhbXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJhbXM7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZhdGFsID0gKF9iID0gKF9hID0gcC5mYXRhbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmF0YWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcDIgPSB0eXBlb2YgcCA9PT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZTogcCB9IDogcDtcbiAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiBcImN1c3RvbVwiLCAuLi5wMiwgZmF0YWw6IF9mYXRhbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIFpvZEFueS5jcmVhdGUoKTtcbn1cbmNvbnN0IGxhdGUgPSB7XG4gICAgb2JqZWN0OiBab2RPYmplY3QubGF6eWNyZWF0ZSxcbn07XG52YXIgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kO1xuKGZ1bmN0aW9uIChab2RGaXJzdFBhcnR5VHlwZUtpbmQpIHtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTdHJpbmdcIl0gPSBcIlpvZFN0cmluZ1wiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bWJlclwiXSA9IFwiWm9kTnVtYmVyXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmFOXCJdID0gXCJab2ROYU5cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCaWdJbnRcIl0gPSBcIlpvZEJpZ0ludFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJvb2xlYW5cIl0gPSBcIlpvZEJvb2xlYW5cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REYXRlXCJdID0gXCJab2REYXRlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU3ltYm9sXCJdID0gXCJab2RTeW1ib2xcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmRlZmluZWRcIl0gPSBcIlpvZFVuZGVmaW5lZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bGxcIl0gPSBcIlpvZE51bGxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RBbnlcIl0gPSBcIlpvZEFueVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVua25vd25cIl0gPSBcIlpvZFVua25vd25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROZXZlclwiXSA9IFwiWm9kTmV2ZXJcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RWb2lkXCJdID0gXCJab2RWb2lkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQXJyYXlcIl0gPSBcIlpvZEFycmF5XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kT2JqZWN0XCJdID0gXCJab2RPYmplY3RcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmlvblwiXSA9IFwiWm9kVW5pb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REaXNjcmltaW5hdGVkVW5pb25cIl0gPSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEludGVyc2VjdGlvblwiXSA9IFwiWm9kSW50ZXJzZWN0aW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVHVwbGVcIl0gPSBcIlpvZFR1cGxlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUmVjb3JkXCJdID0gXCJab2RSZWNvcmRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RNYXBcIl0gPSBcIlpvZE1hcFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFNldFwiXSA9IFwiWm9kU2V0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRnVuY3Rpb25cIl0gPSBcIlpvZEZ1bmN0aW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTGF6eVwiXSA9IFwiWm9kTGF6eVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZExpdGVyYWxcIl0gPSBcIlpvZExpdGVyYWxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RFbnVtXCJdID0gXCJab2RFbnVtXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRWZmZWN0c1wiXSA9IFwiWm9kRWZmZWN0c1wiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5hdGl2ZUVudW1cIl0gPSBcIlpvZE5hdGl2ZUVudW1cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RPcHRpb25hbFwiXSA9IFwiWm9kT3B0aW9uYWxcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdWxsYWJsZVwiXSA9IFwiWm9kTnVsbGFibGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2REZWZhdWx0XCJdID0gXCJab2REZWZhdWx0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQ2F0Y2hcIl0gPSBcIlpvZENhdGNoXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUHJvbWlzZVwiXSA9IFwiWm9kUHJvbWlzZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJyYW5kZWRcIl0gPSBcIlpvZEJyYW5kZWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RQaXBlbGluZVwiXSA9IFwiWm9kUGlwZWxpbmVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RSZWFkb25seVwiXSA9IFwiWm9kUmVhZG9ubHlcIjtcbn0pKFpvZEZpcnN0UGFydHlUeXBlS2luZCB8fCAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kID0ge30pKTtcbmNvbnN0IGluc3RhbmNlT2ZUeXBlID0gKFxuLy8gY29uc3QgaW5zdGFuY2VPZlR5cGUgPSA8VCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueT4oXG5jbHMsIHBhcmFtcyA9IHtcbiAgICBtZXNzYWdlOiBgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7Y2xzLm5hbWV9YCxcbn0pID0+IGN1c3RvbSgoZGF0YSkgPT4gZGF0YSBpbnN0YW5jZW9mIGNscywgcGFyYW1zKTtcbmNvbnN0IHN0cmluZ1R5cGUgPSBab2RTdHJpbmcuY3JlYXRlO1xuY29uc3QgbnVtYmVyVHlwZSA9IFpvZE51bWJlci5jcmVhdGU7XG5jb25zdCBuYW5UeXBlID0gWm9kTmFOLmNyZWF0ZTtcbmNvbnN0IGJpZ0ludFR5cGUgPSBab2RCaWdJbnQuY3JlYXRlO1xuY29uc3QgYm9vbGVhblR5cGUgPSBab2RCb29sZWFuLmNyZWF0ZTtcbmNvbnN0IGRhdGVUeXBlID0gWm9kRGF0ZS5jcmVhdGU7XG5jb25zdCBzeW1ib2xUeXBlID0gWm9kU3ltYm9sLmNyZWF0ZTtcbmNvbnN0IHVuZGVmaW5lZFR5cGUgPSBab2RVbmRlZmluZWQuY3JlYXRlO1xuY29uc3QgbnVsbFR5cGUgPSBab2ROdWxsLmNyZWF0ZTtcbmNvbnN0IGFueVR5cGUgPSBab2RBbnkuY3JlYXRlO1xuY29uc3QgdW5rbm93blR5cGUgPSBab2RVbmtub3duLmNyZWF0ZTtcbmNvbnN0IG5ldmVyVHlwZSA9IFpvZE5ldmVyLmNyZWF0ZTtcbmNvbnN0IHZvaWRUeXBlID0gWm9kVm9pZC5jcmVhdGU7XG5jb25zdCBhcnJheVR5cGUgPSBab2RBcnJheS5jcmVhdGU7XG5jb25zdCBvYmplY3RUeXBlID0gWm9kT2JqZWN0LmNyZWF0ZTtcbmNvbnN0IHN0cmljdE9iamVjdFR5cGUgPSBab2RPYmplY3Quc3RyaWN0Q3JlYXRlO1xuY29uc3QgdW5pb25UeXBlID0gWm9kVW5pb24uY3JlYXRlO1xuY29uc3QgZGlzY3JpbWluYXRlZFVuaW9uVHlwZSA9IFpvZERpc2NyaW1pbmF0ZWRVbmlvbi5jcmVhdGU7XG5jb25zdCBpbnRlcnNlY3Rpb25UeXBlID0gWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZTtcbmNvbnN0IHR1cGxlVHlwZSA9IFpvZFR1cGxlLmNyZWF0ZTtcbmNvbnN0IHJlY29yZFR5cGUgPSBab2RSZWNvcmQuY3JlYXRlO1xuY29uc3QgbWFwVHlwZSA9IFpvZE1hcC5jcmVhdGU7XG5jb25zdCBzZXRUeXBlID0gWm9kU2V0LmNyZWF0ZTtcbmNvbnN0IGZ1bmN0aW9uVHlwZSA9IFpvZEZ1bmN0aW9uLmNyZWF0ZTtcbmNvbnN0IGxhenlUeXBlID0gWm9kTGF6eS5jcmVhdGU7XG5jb25zdCBsaXRlcmFsVHlwZSA9IFpvZExpdGVyYWwuY3JlYXRlO1xuY29uc3QgZW51bVR5cGUgPSBab2RFbnVtLmNyZWF0ZTtcbmNvbnN0IG5hdGl2ZUVudW1UeXBlID0gWm9kTmF0aXZlRW51bS5jcmVhdGU7XG5jb25zdCBwcm9taXNlVHlwZSA9IFpvZFByb21pc2UuY3JlYXRlO1xuY29uc3QgZWZmZWN0c1R5cGUgPSBab2RFZmZlY3RzLmNyZWF0ZTtcbmNvbnN0IG9wdGlvbmFsVHlwZSA9IFpvZE9wdGlvbmFsLmNyZWF0ZTtcbmNvbnN0IG51bGxhYmxlVHlwZSA9IFpvZE51bGxhYmxlLmNyZWF0ZTtcbmNvbnN0IHByZXByb2Nlc3NUeXBlID0gWm9kRWZmZWN0cy5jcmVhdGVXaXRoUHJlcHJvY2VzcztcbmNvbnN0IHBpcGVsaW5lVHlwZSA9IFpvZFBpcGVsaW5lLmNyZWF0ZTtcbmNvbnN0IG9zdHJpbmcgPSAoKSA9PiBzdHJpbmdUeXBlKCkub3B0aW9uYWwoKTtcbmNvbnN0IG9udW1iZXIgPSAoKSA9PiBudW1iZXJUeXBlKCkub3B0aW9uYWwoKTtcbmNvbnN0IG9ib29sZWFuID0gKCkgPT4gYm9vbGVhblR5cGUoKS5vcHRpb25hbCgpO1xuY29uc3QgY29lcmNlID0ge1xuICAgIHN0cmluZzogKChhcmcpID0+IFpvZFN0cmluZy5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG4gICAgbnVtYmVyOiAoKGFyZykgPT4gWm9kTnVtYmVyLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBib29sZWFuOiAoKGFyZykgPT4gWm9kQm9vbGVhbi5jcmVhdGUoe1xuICAgICAgICAuLi5hcmcsXG4gICAgICAgIGNvZXJjZTogdHJ1ZSxcbiAgICB9KSksXG4gICAgYmlnaW50OiAoKGFyZykgPT4gWm9kQmlnSW50LmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBkYXRlOiAoKGFyZykgPT4gWm9kRGF0ZS5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KSksXG59O1xuY29uc3QgTkVWRVIgPSBJTlZBTElEO1xuXG52YXIgeiA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZGVmYXVsdEVycm9yTWFwOiBlcnJvck1hcCxcbiAgICBzZXRFcnJvck1hcDogc2V0RXJyb3JNYXAsXG4gICAgZ2V0RXJyb3JNYXA6IGdldEVycm9yTWFwLFxuICAgIG1ha2VJc3N1ZTogbWFrZUlzc3VlLFxuICAgIEVNUFRZX1BBVEg6IEVNUFRZX1BBVEgsXG4gICAgYWRkSXNzdWVUb0NvbnRleHQ6IGFkZElzc3VlVG9Db250ZXh0LFxuICAgIFBhcnNlU3RhdHVzOiBQYXJzZVN0YXR1cyxcbiAgICBJTlZBTElEOiBJTlZBTElELFxuICAgIERJUlRZOiBESVJUWSxcbiAgICBPSzogT0ssXG4gICAgaXNBYm9ydGVkOiBpc0Fib3J0ZWQsXG4gICAgaXNEaXJ0eTogaXNEaXJ0eSxcbiAgICBpc1ZhbGlkOiBpc1ZhbGlkLFxuICAgIGlzQXN5bmM6IGlzQXN5bmMsXG4gICAgZ2V0IHV0aWwgKCkgeyByZXR1cm4gdXRpbDsgfSxcbiAgICBnZXQgb2JqZWN0VXRpbCAoKSB7IHJldHVybiBvYmplY3RVdGlsOyB9LFxuICAgIFpvZFBhcnNlZFR5cGU6IFpvZFBhcnNlZFR5cGUsXG4gICAgZ2V0UGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZSxcbiAgICBab2RUeXBlOiBab2RUeXBlLFxuICAgIGRhdGV0aW1lUmVnZXg6IGRhdGV0aW1lUmVnZXgsXG4gICAgWm9kU3RyaW5nOiBab2RTdHJpbmcsXG4gICAgWm9kTnVtYmVyOiBab2ROdW1iZXIsXG4gICAgWm9kQmlnSW50OiBab2RCaWdJbnQsXG4gICAgWm9kQm9vbGVhbjogWm9kQm9vbGVhbixcbiAgICBab2REYXRlOiBab2REYXRlLFxuICAgIFpvZFN5bWJvbDogWm9kU3ltYm9sLFxuICAgIFpvZFVuZGVmaW5lZDogWm9kVW5kZWZpbmVkLFxuICAgIFpvZE51bGw6IFpvZE51bGwsXG4gICAgWm9kQW55OiBab2RBbnksXG4gICAgWm9kVW5rbm93bjogWm9kVW5rbm93bixcbiAgICBab2ROZXZlcjogWm9kTmV2ZXIsXG4gICAgWm9kVm9pZDogWm9kVm9pZCxcbiAgICBab2RBcnJheTogWm9kQXJyYXksXG4gICAgWm9kT2JqZWN0OiBab2RPYmplY3QsXG4gICAgWm9kVW5pb246IFpvZFVuaW9uLFxuICAgIFpvZERpc2NyaW1pbmF0ZWRVbmlvbjogWm9kRGlzY3JpbWluYXRlZFVuaW9uLFxuICAgIFpvZEludGVyc2VjdGlvbjogWm9kSW50ZXJzZWN0aW9uLFxuICAgIFpvZFR1cGxlOiBab2RUdXBsZSxcbiAgICBab2RSZWNvcmQ6IFpvZFJlY29yZCxcbiAgICBab2RNYXA6IFpvZE1hcCxcbiAgICBab2RTZXQ6IFpvZFNldCxcbiAgICBab2RGdW5jdGlvbjogWm9kRnVuY3Rpb24sXG4gICAgWm9kTGF6eTogWm9kTGF6eSxcbiAgICBab2RMaXRlcmFsOiBab2RMaXRlcmFsLFxuICAgIFpvZEVudW06IFpvZEVudW0sXG4gICAgWm9kTmF0aXZlRW51bTogWm9kTmF0aXZlRW51bSxcbiAgICBab2RQcm9taXNlOiBab2RQcm9taXNlLFxuICAgIFpvZEVmZmVjdHM6IFpvZEVmZmVjdHMsXG4gICAgWm9kVHJhbnNmb3JtZXI6IFpvZEVmZmVjdHMsXG4gICAgWm9kT3B0aW9uYWw6IFpvZE9wdGlvbmFsLFxuICAgIFpvZE51bGxhYmxlOiBab2ROdWxsYWJsZSxcbiAgICBab2REZWZhdWx0OiBab2REZWZhdWx0LFxuICAgIFpvZENhdGNoOiBab2RDYXRjaCxcbiAgICBab2ROYU46IFpvZE5hTixcbiAgICBCUkFORDogQlJBTkQsXG4gICAgWm9kQnJhbmRlZDogWm9kQnJhbmRlZCxcbiAgICBab2RQaXBlbGluZTogWm9kUGlwZWxpbmUsXG4gICAgWm9kUmVhZG9ubHk6IFpvZFJlYWRvbmx5LFxuICAgIGN1c3RvbTogY3VzdG9tLFxuICAgIFNjaGVtYTogWm9kVHlwZSxcbiAgICBab2RTY2hlbWE6IFpvZFR5cGUsXG4gICAgbGF0ZTogbGF0ZSxcbiAgICBnZXQgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kICgpIHsgcmV0dXJuIFpvZEZpcnN0UGFydHlUeXBlS2luZDsgfSxcbiAgICBjb2VyY2U6IGNvZXJjZSxcbiAgICBhbnk6IGFueVR5cGUsXG4gICAgYXJyYXk6IGFycmF5VHlwZSxcbiAgICBiaWdpbnQ6IGJpZ0ludFR5cGUsXG4gICAgYm9vbGVhbjogYm9vbGVhblR5cGUsXG4gICAgZGF0ZTogZGF0ZVR5cGUsXG4gICAgZGlzY3JpbWluYXRlZFVuaW9uOiBkaXNjcmltaW5hdGVkVW5pb25UeXBlLFxuICAgIGVmZmVjdDogZWZmZWN0c1R5cGUsXG4gICAgJ2VudW0nOiBlbnVtVHlwZSxcbiAgICAnZnVuY3Rpb24nOiBmdW5jdGlvblR5cGUsXG4gICAgJ2luc3RhbmNlb2YnOiBpbnN0YW5jZU9mVHlwZSxcbiAgICBpbnRlcnNlY3Rpb246IGludGVyc2VjdGlvblR5cGUsXG4gICAgbGF6eTogbGF6eVR5cGUsXG4gICAgbGl0ZXJhbDogbGl0ZXJhbFR5cGUsXG4gICAgbWFwOiBtYXBUeXBlLFxuICAgIG5hbjogbmFuVHlwZSxcbiAgICBuYXRpdmVFbnVtOiBuYXRpdmVFbnVtVHlwZSxcbiAgICBuZXZlcjogbmV2ZXJUeXBlLFxuICAgICdudWxsJzogbnVsbFR5cGUsXG4gICAgbnVsbGFibGU6IG51bGxhYmxlVHlwZSxcbiAgICBudW1iZXI6IG51bWJlclR5cGUsXG4gICAgb2JqZWN0OiBvYmplY3RUeXBlLFxuICAgIG9ib29sZWFuOiBvYm9vbGVhbixcbiAgICBvbnVtYmVyOiBvbnVtYmVyLFxuICAgIG9wdGlvbmFsOiBvcHRpb25hbFR5cGUsXG4gICAgb3N0cmluZzogb3N0cmluZyxcbiAgICBwaXBlbGluZTogcGlwZWxpbmVUeXBlLFxuICAgIHByZXByb2Nlc3M6IHByZXByb2Nlc3NUeXBlLFxuICAgIHByb21pc2U6IHByb21pc2VUeXBlLFxuICAgIHJlY29yZDogcmVjb3JkVHlwZSxcbiAgICBzZXQ6IHNldFR5cGUsXG4gICAgc3RyaWN0T2JqZWN0OiBzdHJpY3RPYmplY3RUeXBlLFxuICAgIHN0cmluZzogc3RyaW5nVHlwZSxcbiAgICBzeW1ib2w6IHN5bWJvbFR5cGUsXG4gICAgdHJhbnNmb3JtZXI6IGVmZmVjdHNUeXBlLFxuICAgIHR1cGxlOiB0dXBsZVR5cGUsXG4gICAgJ3VuZGVmaW5lZCc6IHVuZGVmaW5lZFR5cGUsXG4gICAgdW5pb246IHVuaW9uVHlwZSxcbiAgICB1bmtub3duOiB1bmtub3duVHlwZSxcbiAgICAndm9pZCc6IHZvaWRUeXBlLFxuICAgIE5FVkVSOiBORVZFUixcbiAgICBab2RJc3N1ZUNvZGU6IFpvZElzc3VlQ29kZSxcbiAgICBxdW90ZWxlc3NKc29uOiBxdW90ZWxlc3NKc29uLFxuICAgIFpvZEVycm9yOiBab2RFcnJvclxufSk7XG5cbmV4cG9ydCB7IEJSQU5ELCBESVJUWSwgRU1QVFlfUEFUSCwgSU5WQUxJRCwgTkVWRVIsIE9LLCBQYXJzZVN0YXR1cywgWm9kVHlwZSBhcyBTY2hlbWEsIFpvZEFueSwgWm9kQXJyYXksIFpvZEJpZ0ludCwgWm9kQm9vbGVhbiwgWm9kQnJhbmRlZCwgWm9kQ2F0Y2gsIFpvZERhdGUsIFpvZERlZmF1bHQsIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiwgWm9kRWZmZWN0cywgWm9kRW51bSwgWm9kRXJyb3IsIFpvZEZpcnN0UGFydHlUeXBlS2luZCwgWm9kRnVuY3Rpb24sIFpvZEludGVyc2VjdGlvbiwgWm9kSXNzdWVDb2RlLCBab2RMYXp5LCBab2RMaXRlcmFsLCBab2RNYXAsIFpvZE5hTiwgWm9kTmF0aXZlRW51bSwgWm9kTmV2ZXIsIFpvZE51bGwsIFpvZE51bGxhYmxlLCBab2ROdW1iZXIsIFpvZE9iamVjdCwgWm9kT3B0aW9uYWwsIFpvZFBhcnNlZFR5cGUsIFpvZFBpcGVsaW5lLCBab2RQcm9taXNlLCBab2RSZWFkb25seSwgWm9kUmVjb3JkLCBab2RUeXBlIGFzIFpvZFNjaGVtYSwgWm9kU2V0LCBab2RTdHJpbmcsIFpvZFN5bWJvbCwgWm9kRWZmZWN0cyBhcyBab2RUcmFuc2Zvcm1lciwgWm9kVHVwbGUsIFpvZFR5cGUsIFpvZFVuZGVmaW5lZCwgWm9kVW5pb24sIFpvZFVua25vd24sIFpvZFZvaWQsIGFkZElzc3VlVG9Db250ZXh0LCBhbnlUeXBlIGFzIGFueSwgYXJyYXlUeXBlIGFzIGFycmF5LCBiaWdJbnRUeXBlIGFzIGJpZ2ludCwgYm9vbGVhblR5cGUgYXMgYm9vbGVhbiwgY29lcmNlLCBjdXN0b20sIGRhdGVUeXBlIGFzIGRhdGUsIGRhdGV0aW1lUmVnZXgsIHogYXMgZGVmYXVsdCwgZXJyb3JNYXAgYXMgZGVmYXVsdEVycm9yTWFwLCBkaXNjcmltaW5hdGVkVW5pb25UeXBlIGFzIGRpc2NyaW1pbmF0ZWRVbmlvbiwgZWZmZWN0c1R5cGUgYXMgZWZmZWN0LCBlbnVtVHlwZSBhcyBlbnVtLCBmdW5jdGlvblR5cGUgYXMgZnVuY3Rpb24sIGdldEVycm9yTWFwLCBnZXRQYXJzZWRUeXBlLCBpbnN0YW5jZU9mVHlwZSBhcyBpbnN0YW5jZW9mLCBpbnRlcnNlY3Rpb25UeXBlIGFzIGludGVyc2VjdGlvbiwgaXNBYm9ydGVkLCBpc0FzeW5jLCBpc0RpcnR5LCBpc1ZhbGlkLCBsYXRlLCBsYXp5VHlwZSBhcyBsYXp5LCBsaXRlcmFsVHlwZSBhcyBsaXRlcmFsLCBtYWtlSXNzdWUsIG1hcFR5cGUgYXMgbWFwLCBuYW5UeXBlIGFzIG5hbiwgbmF0aXZlRW51bVR5cGUgYXMgbmF0aXZlRW51bSwgbmV2ZXJUeXBlIGFzIG5ldmVyLCBudWxsVHlwZSBhcyBudWxsLCBudWxsYWJsZVR5cGUgYXMgbnVsbGFibGUsIG51bWJlclR5cGUgYXMgbnVtYmVyLCBvYmplY3RUeXBlIGFzIG9iamVjdCwgb2JqZWN0VXRpbCwgb2Jvb2xlYW4sIG9udW1iZXIsIG9wdGlvbmFsVHlwZSBhcyBvcHRpb25hbCwgb3N0cmluZywgcGlwZWxpbmVUeXBlIGFzIHBpcGVsaW5lLCBwcmVwcm9jZXNzVHlwZSBhcyBwcmVwcm9jZXNzLCBwcm9taXNlVHlwZSBhcyBwcm9taXNlLCBxdW90ZWxlc3NKc29uLCByZWNvcmRUeXBlIGFzIHJlY29yZCwgc2V0VHlwZSBhcyBzZXQsIHNldEVycm9yTWFwLCBzdHJpY3RPYmplY3RUeXBlIGFzIHN0cmljdE9iamVjdCwgc3RyaW5nVHlwZSBhcyBzdHJpbmcsIHN5bWJvbFR5cGUgYXMgc3ltYm9sLCBlZmZlY3RzVHlwZSBhcyB0cmFuc2Zvcm1lciwgdHVwbGVUeXBlIGFzIHR1cGxlLCB1bmRlZmluZWRUeXBlIGFzIHVuZGVmaW5lZCwgdW5pb25UeXBlIGFzIHVuaW9uLCB1bmtub3duVHlwZSBhcyB1bmtub3duLCB1dGlsLCB2b2lkVHlwZSBhcyB2b2lkLCB6IH07XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgQm9vayA9IHoudW5pb24oW1xuXHR6LmxpdGVyYWwoXCJwdVwiKSxcblx0ei5saXRlcmFsKFwia3Ugc3VsaVwiKSxcblx0ei5saXRlcmFsKFwia3UgbGlsaVwiKSxcblx0ei5saXRlcmFsKFwibm9uZVwiKSxcbl0pO1xuZXhwb3J0IHR5cGUgQm9vayA9IHouaW5mZXI8dHlwZW9mIEJvb2s+O1xuXG5leHBvcnQgY29uc3QgQ29pbmVkRXJhID0gei51bmlvbihbei5saXRlcmFsKFwicHJlLXB1XCIpLCB6LmxpdGVyYWwoXCJwb3N0LXB1XCIpLCB6LmxpdGVyYWwoXCJwb3N0LWt1XCIpXSk7XG5leHBvcnQgdHlwZSBDb2luZWRFcmEgPSB6LmluZmVyPHR5cGVvZiBDb2luZWRFcmE+O1xuXG5leHBvcnQgY29uc3QgVXNhZ2VDYXRlZ29yeSA9IHoudW5pb24oW1xuXHR6LmxpdGVyYWwoXCJjb3JlXCIpLFxuXHR6LmxpdGVyYWwoXCJjb21tb25cIiksXG5cdHoubGl0ZXJhbChcInVuY29tbW9uXCIpLFxuXHR6LmxpdGVyYWwoXCJvYnNjdXJlXCIpLFxuXHR6LmxpdGVyYWwoXCJzYW5kYm94XCIpLFxuXSk7XG5leHBvcnQgdHlwZSBVc2FnZUNhdGVnb3J5ID0gei5pbmZlcjx0eXBlb2YgVXNhZ2VDYXRlZ29yeT47XG5cbmV4cG9ydCBjb25zdCBXcml0aW5nU3lzdGVtID0gei5lbnVtKFtcblx0XCJzaXRlbGVuIHBvbmFcIixcblx0XCJzaXRlbGVuIHNpdGVsZW5cIixcblx0XCJhbHBoYWJldFwiLFxuXHRcInN5bGxhYmFyeVwiLFxuXHRcImxvZ29ncmFwaHlcIixcblx0XCJ0b2tpcG9uaWRvIGFscGhhYmV0XCIsXG5cdFwidG9raXBvbmlkbyBzeWxsYWJhcnlcIixcblx0XCJ0b2tpcG9uaWRvIGxvZ29ncmFwaHlcIixcbl0pO1xuZXhwb3J0IHR5cGUgV3JpdGluZ1N5c3RlbSA9IHouaW5mZXI8dHlwZW9mIFdyaXRpbmdTeXN0ZW0+O1xuXG5leHBvcnQgdHlwZSAqIGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGVkRGF0YTxcblx0T2JqIGV4dGVuZHMgeyB0cmFuc2xhdGlvbnM6IFJlY29yZDxzdHJpbmcsIG9iamVjdD4gfSxcblx0S2V5IGV4dGVuZHMga2V5b2YgT2JqW1widHJhbnNsYXRpb25zXCJdW3N0cmluZ10sXG4+KGRhdGE6IE9iaiwga2V5OiBLZXksIGxhbmd1YWdlOiBzdHJpbmcpOiBPYmpbXCJ0cmFuc2xhdGlvbnNcIl1bc3RyaW5nXVtLZXldIHtcblx0cmV0dXJuICgoZGF0YS50cmFuc2xhdGlvbnNbbGFuZ3VhZ2VdID8/IGRhdGEudHJhbnNsYXRpb25zW1wiZW5cIl0hKSBhcyBPYmpbXCJ0cmFuc2xhdGlvbnNcIl1bc3RyaW5nXSlbXG5cdFx0a2V5XG5cdF07XG59XG4iXSwibmFtZXMiOlsidXRpbCIsInZhbCIsImFzc2VydElzIiwiX2FyZyIsImFzc2VydE5ldmVyIiwiX3giLCJpdGVtcyIsIm9iaiIsIml0ZW0iLCJ2YWxpZEtleXMiLCJrIiwiZmlsdGVyZWQiLCJlIiwib2JqZWN0Iiwia2V5cyIsImtleSIsImFyciIsImNoZWNrZXIiLCJqb2luVmFsdWVzIiwiYXJyYXkiLCJzZXBhcmF0b3IiLCJfIiwidmFsdWUiLCJvYmplY3RVdGlsIiwiZmlyc3QiLCJzZWNvbmQiLCJab2RQYXJzZWRUeXBlIiwiZ2V0UGFyc2VkVHlwZSIsImRhdGEiLCJab2RJc3N1ZUNvZGUiLCJxdW90ZWxlc3NKc29uIiwiWm9kRXJyb3IiLCJpc3N1ZXMiLCJzdWIiLCJzdWJzIiwiYWN0dWFsUHJvdG8iLCJfbWFwcGVyIiwibWFwcGVyIiwiaXNzdWUiLCJmaWVsZEVycm9ycyIsInByb2Nlc3NFcnJvciIsImVycm9yIiwiY3VyciIsImkiLCJlbCIsImZvcm1FcnJvcnMiLCJlcnJvck1hcCIsIl9jdHgiLCJtZXNzYWdlIiwib3ZlcnJpZGVFcnJvck1hcCIsInNldEVycm9yTWFwIiwibWFwIiwiZ2V0RXJyb3JNYXAiLCJtYWtlSXNzdWUiLCJwYXJhbXMiLCJwYXRoIiwiZXJyb3JNYXBzIiwiaXNzdWVEYXRhIiwiZnVsbFBhdGgiLCJmdWxsSXNzdWUiLCJlcnJvck1lc3NhZ2UiLCJtYXBzIiwibSIsIkVNUFRZX1BBVEgiLCJhZGRJc3N1ZVRvQ29udGV4dCIsImN0eCIsIm92ZXJyaWRlTWFwIiwieCIsIlBhcnNlU3RhdHVzIiwic3RhdHVzIiwicmVzdWx0cyIsImFycmF5VmFsdWUiLCJzIiwiSU5WQUxJRCIsInBhaXJzIiwic3luY1BhaXJzIiwicGFpciIsImZpbmFsT2JqZWN0IiwiRElSVFkiLCJPSyIsImlzQWJvcnRlZCIsImlzRGlydHkiLCJpc1ZhbGlkIiwiaXNBc3luYyIsIl9fY2xhc3NQcml2YXRlRmllbGRHZXQiLCJyZWNlaXZlciIsInN0YXRlIiwia2luZCIsImYiLCJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IiwiZXJyb3JVdGlsIiwiX1pvZEVudW1fY2FjaGUiLCJfWm9kTmF0aXZlRW51bV9jYWNoZSIsIlBhcnNlSW5wdXRMYXp5UGF0aCIsInBhcmVudCIsImhhbmRsZVJlc3VsdCIsInJlc3VsdCIsInByb2Nlc3NDcmVhdGVQYXJhbXMiLCJpbnZhbGlkX3R5cGVfZXJyb3IiLCJyZXF1aXJlZF9lcnJvciIsImRlc2NyaXB0aW9uIiwiaXNzIiwiX2EiLCJfYiIsIlpvZFR5cGUiLCJkZWYiLCJpbnB1dCIsIm1heWJlQXN5bmNSZXN1bHQiLCJjaGVjayIsImdldElzc3VlUHJvcGVydGllcyIsInNldEVycm9yIiwicmVmaW5lbWVudERhdGEiLCJyZWZpbmVtZW50IiwiWm9kRWZmZWN0cyIsIlpvZEZpcnN0UGFydHlUeXBlS2luZCIsIlpvZE9wdGlvbmFsIiwiWm9kTnVsbGFibGUiLCJab2RBcnJheSIsIlpvZFByb21pc2UiLCJvcHRpb24iLCJab2RVbmlvbiIsImluY29taW5nIiwiWm9kSW50ZXJzZWN0aW9uIiwidHJhbnNmb3JtIiwiZGVmYXVsdFZhbHVlRnVuYyIsIlpvZERlZmF1bHQiLCJab2RCcmFuZGVkIiwiY2F0Y2hWYWx1ZUZ1bmMiLCJab2RDYXRjaCIsIlRoaXMiLCJ0YXJnZXQiLCJab2RQaXBlbGluZSIsIlpvZFJlYWRvbmx5IiwiY3VpZFJlZ2V4IiwiY3VpZDJSZWdleCIsInVsaWRSZWdleCIsInV1aWRSZWdleCIsIm5hbm9pZFJlZ2V4IiwiZHVyYXRpb25SZWdleCIsImVtYWlsUmVnZXgiLCJfZW1vamlSZWdleCIsImVtb2ppUmVnZXgiLCJpcHY0UmVnZXgiLCJpcHY2UmVnZXgiLCJiYXNlNjRSZWdleCIsImRhdGVSZWdleFNvdXJjZSIsImRhdGVSZWdleCIsInRpbWVSZWdleFNvdXJjZSIsImFyZ3MiLCJyZWdleCIsInRpbWVSZWdleCIsImRhdGV0aW1lUmVnZXgiLCJvcHRzIiwiaXNWYWxpZElQIiwiaXAiLCJ2ZXJzaW9uIiwiWm9kU3RyaW5nIiwidG9vQmlnIiwidG9vU21hbGwiLCJ2YWxpZGF0aW9uIiwib3B0aW9ucyIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsImxlbiIsImNoIiwibWluIiwibWF4IiwiZmxvYXRTYWZlUmVtYWluZGVyIiwic3RlcCIsInZhbERlY0NvdW50Iiwic3RlcERlY0NvdW50IiwiZGVjQ291bnQiLCJ2YWxJbnQiLCJzdGVwSW50IiwiWm9kTnVtYmVyIiwiaW5jbHVzaXZlIiwiWm9kQmlnSW50IiwiWm9kQm9vbGVhbiIsIlpvZERhdGUiLCJtaW5EYXRlIiwibWF4RGF0ZSIsIlpvZFN5bWJvbCIsIlpvZFVuZGVmaW5lZCIsIlpvZE51bGwiLCJab2RBbnkiLCJab2RVbmtub3duIiwiWm9kTmV2ZXIiLCJab2RWb2lkIiwic2NoZW1hIiwiZGVlcFBhcnRpYWxpZnkiLCJab2RPYmplY3QiLCJuZXdTaGFwZSIsImZpZWxkU2NoZW1hIiwiWm9kVHVwbGUiLCJzaGFwZSIsInNoYXBlS2V5cyIsImV4dHJhS2V5cyIsImtleVZhbGlkYXRvciIsInVua25vd25LZXlzIiwiY2F0Y2hhbGwiLCJfYyIsIl9kIiwiZGVmYXVsdEVycm9yIiwiYXVnbWVudGF0aW9uIiwibWVyZ2luZyIsImluZGV4IiwibWFzayIsIm5ld0ZpZWxkIiwiY3JlYXRlWm9kRW51bSIsImhhbmRsZVJlc3VsdHMiLCJ1bmlvbkVycm9ycyIsImNoaWxkQ3R4IiwiZGlydHkiLCJ0eXBlcyIsImdldERpc2NyaW1pbmF0b3IiLCJ0eXBlIiwiWm9kTGF6eSIsIlpvZExpdGVyYWwiLCJab2RFbnVtIiwiWm9kTmF0aXZlRW51bSIsIlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsImRpc2NyaW1pbmF0b3IiLCJkaXNjcmltaW5hdG9yVmFsdWUiLCJvcHRpb25zTWFwIiwiZGlzY3JpbWluYXRvclZhbHVlcyIsIm1lcmdlVmFsdWVzIiwiYSIsImIiLCJhVHlwZSIsImJUeXBlIiwiYktleXMiLCJzaGFyZWRLZXlzIiwibmV3T2JqIiwic2hhcmVkVmFsdWUiLCJuZXdBcnJheSIsIml0ZW1BIiwiaXRlbUIiLCJoYW5kbGVQYXJzZWQiLCJwYXJzZWRMZWZ0IiwicGFyc2VkUmlnaHQiLCJtZXJnZWQiLCJsZWZ0IiwicmlnaHQiLCJpdGVtSW5kZXgiLCJyZXN0Iiwic2NoZW1hcyIsIlpvZFJlY29yZCIsImtleVR5cGUiLCJ2YWx1ZVR5cGUiLCJ0aGlyZCIsIlpvZE1hcCIsImZpbmFsTWFwIiwiWm9kU2V0IiwiZmluYWxpemVTZXQiLCJlbGVtZW50cyIsInBhcnNlZFNldCIsImVsZW1lbnQiLCJtaW5TaXplIiwibWF4U2l6ZSIsInNpemUiLCJab2RGdW5jdGlvbiIsIm1ha2VBcmdzSXNzdWUiLCJtYWtlUmV0dXJuc0lzc3VlIiwicmV0dXJucyIsImZuIiwibWUiLCJwYXJzZWRBcmdzIiwicGFyc2VkUmV0dXJucyIsInJldHVyblR5cGUiLCJmdW5jIiwiZ2V0dGVyIiwidmFsdWVzIiwiZXhwZWN0ZWRWYWx1ZXMiLCJlbnVtVmFsdWVzIiwibmV3RGVmIiwib3B0IiwibmF0aXZlRW51bVZhbHVlcyIsInByb21pc2lmaWVkIiwiZWZmZWN0IiwiY2hlY2tDdHgiLCJhcmciLCJwcm9jZXNzZWQiLCJleGVjdXRlUmVmaW5lbWVudCIsImFjYyIsImlubmVyIiwiYmFzZSIsInByZXByb2Nlc3MiLCJuZXdDdHgiLCJab2ROYU4iLCJCUkFORCIsImluUmVzdWx0IiwiZnJlZXplIiwiY3VzdG9tIiwiZmF0YWwiLCJwIiwiX2ZhdGFsIiwicDIiLCJsYXRlIiwiaW5zdGFuY2VPZlR5cGUiLCJjbHMiLCJzdHJpbmdUeXBlIiwibnVtYmVyVHlwZSIsIm5hblR5cGUiLCJiaWdJbnRUeXBlIiwiYm9vbGVhblR5cGUiLCJkYXRlVHlwZSIsInN5bWJvbFR5cGUiLCJ1bmRlZmluZWRUeXBlIiwibnVsbFR5cGUiLCJhbnlUeXBlIiwidW5rbm93blR5cGUiLCJuZXZlclR5cGUiLCJ2b2lkVHlwZSIsImFycmF5VHlwZSIsIm9iamVjdFR5cGUiLCJzdHJpY3RPYmplY3RUeXBlIiwidW5pb25UeXBlIiwiZGlzY3JpbWluYXRlZFVuaW9uVHlwZSIsImludGVyc2VjdGlvblR5cGUiLCJ0dXBsZVR5cGUiLCJyZWNvcmRUeXBlIiwibWFwVHlwZSIsInNldFR5cGUiLCJmdW5jdGlvblR5cGUiLCJsYXp5VHlwZSIsImxpdGVyYWxUeXBlIiwiZW51bVR5cGUiLCJuYXRpdmVFbnVtVHlwZSIsInByb21pc2VUeXBlIiwiZWZmZWN0c1R5cGUiLCJvcHRpb25hbFR5cGUiLCJudWxsYWJsZVR5cGUiLCJwcmVwcm9jZXNzVHlwZSIsInBpcGVsaW5lVHlwZSIsIm9zdHJpbmciLCJvbnVtYmVyIiwib2Jvb2xlYW4iLCJjb2VyY2UiLCJORVZFUiIsInoiLCJCb29rIiwiQ29pbmVkRXJhIiwiVXNhZ2VDYXRlZ29yeSIsIldyaXRpbmdTeXN0ZW0iLCJnZXRUcmFuc2xhdGVkRGF0YSIsImxhbmd1YWdlIl0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQTtBQUFBLENBQ0gsU0FBVUEsR0FBTTtBQUNiLEVBQUFBLEVBQUssY0FBYyxDQUFDQyxNQUFRQTtBQUM1QixXQUFTQyxFQUFTQyxHQUFNO0FBQUEsRUFBRztBQUMzQixFQUFBSCxFQUFLLFdBQVdFO0FBQ2hCLFdBQVNFLEVBQVlDLEdBQUk7QUFDckIsVUFBTSxJQUFJLE1BQUs7QUFBQSxFQUNsQjtBQUNELEVBQUFMLEVBQUssY0FBY0ksR0FDbkJKLEVBQUssY0FBYyxDQUFDTSxNQUFVO0FBQzFCLFVBQU1DLElBQU0sQ0FBQTtBQUNaLGVBQVdDLEtBQVFGO0FBQ2YsTUFBQUMsRUFBSUMsQ0FBSSxJQUFJQTtBQUVoQixXQUFPRDtBQUFBLEVBQ2YsR0FDSVAsRUFBSyxxQkFBcUIsQ0FBQ08sTUFBUTtBQUMvQixVQUFNRSxJQUFZVCxFQUFLLFdBQVdPLENBQUcsRUFBRSxPQUFPLENBQUNHLE1BQU0sT0FBT0gsRUFBSUEsRUFBSUcsQ0FBQyxDQUFDLEtBQU0sUUFBUSxHQUM5RUMsSUFBVyxDQUFBO0FBQ2pCLGVBQVdELEtBQUtEO0FBQ1osTUFBQUUsRUFBU0QsQ0FBQyxJQUFJSCxFQUFJRyxDQUFDO0FBRXZCLFdBQU9WLEVBQUssYUFBYVcsQ0FBUTtBQUFBLEVBQ3pDLEdBQ0lYLEVBQUssZUFBZSxDQUFDTyxNQUNWUCxFQUFLLFdBQVdPLENBQUcsRUFBRSxJQUFJLFNBQVVLLEdBQUc7QUFDekMsV0FBT0wsRUFBSUssQ0FBQztBQUFBLEVBQ3hCLENBQVMsR0FFTFosRUFBSyxh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