@genspectrum/dashboard-components 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +5 -5
- package/dist/assets/{mutationOverTimeWorker-DuWGESoO.js.map → mutationOverTimeWorker-CvZg52rf.js.map} +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/components.js +17 -8
- package/dist/components.js.map +1 -1
- package/package.json +1 -1
- package/src/preact/components/confidence-interval-selector.tsx +1 -1
- package/src/preact/mutationFilter/parseMutation.spec.ts +30 -0
- package/src/preact/mutationFilter/sequenceTypeFromSegment.ts +3 -2
- package/src/preact/prevalenceOverTime/prevalence-over-time.stories.tsx +4 -4
- package/src/preact/prevalenceOverTime/prevalence-over-time.tsx +11 -1
- package/src/utils/mutations.ts +3 -3
- package/src/web-components/visualization/gs-prevalence-over-time.stories.ts +1 -1
- package/src/web-components/visualization/gs-prevalence-over-time.tsx +2 -2
- package/standalone-bundle/assets/{mutationOverTimeWorker-MVSt1FVw.js.map → mutationOverTimeWorker-CypX_PYM.js.map} +1 -1
- package/standalone-bundle/dashboard-components.js +506 -501
- package/standalone-bundle/dashboard-components.js.map +1 -1
|
@@ -26,7 +26,7 @@ const $f = new Date(Ee);
|
|
|
26
26
|
$f.setMonth(Ee.getMonth() - 6);
|
|
27
27
|
const qf = new Date(Ee);
|
|
28
28
|
qf.setFullYear(Ee.getFullYear() - 1);
|
|
29
|
-
const
|
|
29
|
+
const P5 = {
|
|
30
30
|
last2Weeks: {
|
|
31
31
|
label: "Last 2 weeks",
|
|
32
32
|
dateFrom: Se(Bf)
|
|
@@ -133,7 +133,7 @@ let Ng = class {
|
|
|
133
133
|
* Copyright 2021 Google LLC
|
|
134
134
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
135
135
|
*/
|
|
136
|
-
let
|
|
136
|
+
let Tg = class extends Event {
|
|
137
137
|
constructor(t) {
|
|
138
138
|
super("context-provider", { bubbles: !0, composed: !0 }), this.context = t;
|
|
139
139
|
}
|
|
@@ -155,7 +155,7 @@ let zg = class extends Event {
|
|
|
155
155
|
this.host.addEventListener("context-request", this.onContextRequest), this.host.addEventListener("context-provider", this.onProviderRequest);
|
|
156
156
|
}
|
|
157
157
|
hostConnected() {
|
|
158
|
-
this.host.dispatchEvent(new
|
|
158
|
+
this.host.dispatchEvent(new Tg(this.context));
|
|
159
159
|
}
|
|
160
160
|
};
|
|
161
161
|
/**
|
|
@@ -224,7 +224,7 @@ function np({ context: n, subscribe: t }) {
|
|
|
224
224
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
225
225
|
*/
|
|
226
226
|
const Jo = globalThis, Qc = Jo.ShadowRoot && (Jo.ShadyCSS === void 0 || Jo.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype, ip = Symbol(), du = /* @__PURE__ */ new WeakMap();
|
|
227
|
-
let
|
|
227
|
+
let zg = class {
|
|
228
228
|
constructor(t, e, i) {
|
|
229
229
|
if (this._$cssResult$ = !0, i !== ip) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
|
|
230
230
|
this.cssText = t, this.t = e;
|
|
@@ -242,7 +242,7 @@ let Tg = class {
|
|
|
242
242
|
return this.cssText;
|
|
243
243
|
}
|
|
244
244
|
};
|
|
245
|
-
const
|
|
245
|
+
const za = (n) => new zg(typeof n == "string" ? n : n + "", void 0, ip), Fg = (n, t) => {
|
|
246
246
|
if (Qc) n.adoptedStyleSheets = t.map((e) => e instanceof CSSStyleSheet ? e : e.styleSheet);
|
|
247
247
|
else for (const e of t) {
|
|
248
248
|
const i = document.createElement("style"), r = Jo.litNonce;
|
|
@@ -251,7 +251,7 @@ const Ta = (n) => new Tg(typeof n == "string" ? n : n + "", void 0, ip), Fg = (n
|
|
|
251
251
|
}, uu = Qc ? (n) => n : (n) => n instanceof CSSStyleSheet ? ((t) => {
|
|
252
252
|
let e = "";
|
|
253
253
|
for (const i of t.cssRules) e += i.cssText;
|
|
254
|
-
return
|
|
254
|
+
return za(e);
|
|
255
255
|
})(n) : n;
|
|
256
256
|
/**
|
|
257
257
|
* @license
|
|
@@ -936,7 +936,7 @@ var rc;
|
|
|
936
936
|
// second overwrites first
|
|
937
937
|
});
|
|
938
938
|
})(rc || (rc = {}));
|
|
939
|
-
const
|
|
939
|
+
const z = at.arrayToEnum([
|
|
940
940
|
"string",
|
|
941
941
|
"nan",
|
|
942
942
|
"number",
|
|
@@ -960,23 +960,23 @@ const T = at.arrayToEnum([
|
|
|
960
960
|
]), Dn = (n) => {
|
|
961
961
|
switch (typeof n) {
|
|
962
962
|
case "undefined":
|
|
963
|
-
return
|
|
963
|
+
return z.undefined;
|
|
964
964
|
case "string":
|
|
965
|
-
return
|
|
965
|
+
return z.string;
|
|
966
966
|
case "number":
|
|
967
|
-
return isNaN(n) ?
|
|
967
|
+
return isNaN(n) ? z.nan : z.number;
|
|
968
968
|
case "boolean":
|
|
969
|
-
return
|
|
969
|
+
return z.boolean;
|
|
970
970
|
case "function":
|
|
971
|
-
return
|
|
971
|
+
return z.function;
|
|
972
972
|
case "bigint":
|
|
973
|
-
return
|
|
973
|
+
return z.bigint;
|
|
974
974
|
case "symbol":
|
|
975
|
-
return
|
|
975
|
+
return z.symbol;
|
|
976
976
|
case "object":
|
|
977
|
-
return Array.isArray(n) ?
|
|
977
|
+
return Array.isArray(n) ? z.array : n === null ? z.null : n.then && typeof n.then == "function" && n.catch && typeof n.catch == "function" ? z.promise : typeof Map < "u" && n instanceof Map ? z.map : typeof Set < "u" && n instanceof Set ? z.set : typeof Date < "u" && n instanceof Date ? z.date : z.object;
|
|
978
978
|
default:
|
|
979
|
-
return
|
|
979
|
+
return z.unknown;
|
|
980
980
|
}
|
|
981
981
|
}, L = at.arrayToEnum([
|
|
982
982
|
"invalid_type",
|
|
@@ -1060,7 +1060,7 @@ const Ir = (n, t) => {
|
|
|
1060
1060
|
let e;
|
|
1061
1061
|
switch (n.code) {
|
|
1062
1062
|
case L.invalid_type:
|
|
1063
|
-
n.received ===
|
|
1063
|
+
n.received === z.undefined ? e = "Required" : e = `Expected ${n.expected}, received ${n.received}`;
|
|
1064
1064
|
break;
|
|
1065
1065
|
case L.invalid_literal:
|
|
1066
1066
|
e = `Invalid literal value, expected ${JSON.stringify(n.expected, at.jsonStringifyReplacer)}`;
|
|
@@ -1198,7 +1198,7 @@ class At {
|
|
|
1198
1198
|
}
|
|
1199
1199
|
const B = Object.freeze({
|
|
1200
1200
|
status: "aborted"
|
|
1201
|
-
}), br = (n) => ({ status: "dirty", value: n }),
|
|
1201
|
+
}), br = (n) => ({ status: "dirty", value: n }), ie = (n) => ({ status: "valid", value: n }), sc = (n) => n.status === "aborted", oc = (n) => n.status === "dirty", Ls = (n) => n.status === "valid", Ys = (n) => typeof Promise < "u" && n instanceof Promise;
|
|
1202
1202
|
function ca(n, t, e, i) {
|
|
1203
1203
|
if (typeof t == "function" ? n !== t || !i : !t.has(n)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
1204
1204
|
return t.get(n);
|
|
@@ -1450,11 +1450,11 @@ function X0(n, t) {
|
|
|
1450
1450
|
}
|
|
1451
1451
|
class Fe extends et {
|
|
1452
1452
|
_parse(t) {
|
|
1453
|
-
if (this._def.coerce && (t.data = String(t.data)), this._getType(t) !==
|
|
1453
|
+
if (this._def.coerce && (t.data = String(t.data)), this._getType(t) !== z.string) {
|
|
1454
1454
|
const s = this._getOrReturnCtx(t);
|
|
1455
1455
|
return N(s, {
|
|
1456
1456
|
code: L.invalid_type,
|
|
1457
|
-
expected:
|
|
1457
|
+
expected: z.string,
|
|
1458
1458
|
received: s.parsedType
|
|
1459
1459
|
}), B;
|
|
1460
1460
|
}
|
|
@@ -1815,11 +1815,11 @@ class ni extends et {
|
|
|
1815
1815
|
super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf;
|
|
1816
1816
|
}
|
|
1817
1817
|
_parse(t) {
|
|
1818
|
-
if (this._def.coerce && (t.data = Number(t.data)), this._getType(t) !==
|
|
1818
|
+
if (this._def.coerce && (t.data = Number(t.data)), this._getType(t) !== z.number) {
|
|
1819
1819
|
const s = this._getOrReturnCtx(t);
|
|
1820
1820
|
return N(s, {
|
|
1821
1821
|
code: L.invalid_type,
|
|
1822
|
-
expected:
|
|
1822
|
+
expected: z.number,
|
|
1823
1823
|
received: s.parsedType
|
|
1824
1824
|
}), B;
|
|
1825
1825
|
}
|
|
@@ -1987,11 +1987,11 @@ class ii extends et {
|
|
|
1987
1987
|
super(...arguments), this.min = this.gte, this.max = this.lte;
|
|
1988
1988
|
}
|
|
1989
1989
|
_parse(t) {
|
|
1990
|
-
if (this._def.coerce && (t.data = BigInt(t.data)), this._getType(t) !==
|
|
1990
|
+
if (this._def.coerce && (t.data = BigInt(t.data)), this._getType(t) !== z.bigint) {
|
|
1991
1991
|
const s = this._getOrReturnCtx(t);
|
|
1992
1992
|
return N(s, {
|
|
1993
1993
|
code: L.invalid_type,
|
|
1994
|
-
expected:
|
|
1994
|
+
expected: z.bigint,
|
|
1995
1995
|
received: s.parsedType
|
|
1996
1996
|
}), B;
|
|
1997
1997
|
}
|
|
@@ -2112,15 +2112,15 @@ ii.create = (n) => {
|
|
|
2112
2112
|
};
|
|
2113
2113
|
class Vs extends et {
|
|
2114
2114
|
_parse(t) {
|
|
2115
|
-
if (this._def.coerce && (t.data = !!t.data), this._getType(t) !==
|
|
2115
|
+
if (this._def.coerce && (t.data = !!t.data), this._getType(t) !== z.boolean) {
|
|
2116
2116
|
const i = this._getOrReturnCtx(t);
|
|
2117
2117
|
return N(i, {
|
|
2118
2118
|
code: L.invalid_type,
|
|
2119
|
-
expected:
|
|
2119
|
+
expected: z.boolean,
|
|
2120
2120
|
received: i.parsedType
|
|
2121
2121
|
}), B;
|
|
2122
2122
|
}
|
|
2123
|
-
return
|
|
2123
|
+
return ie(t.data);
|
|
2124
2124
|
}
|
|
2125
2125
|
}
|
|
2126
2126
|
Vs.create = (n) => new Vs({
|
|
@@ -2130,11 +2130,11 @@ Vs.create = (n) => new Vs({
|
|
|
2130
2130
|
});
|
|
2131
2131
|
class Oi extends et {
|
|
2132
2132
|
_parse(t) {
|
|
2133
|
-
if (this._def.coerce && (t.data = new Date(t.data)), this._getType(t) !==
|
|
2133
|
+
if (this._def.coerce && (t.data = new Date(t.data)), this._getType(t) !== z.date) {
|
|
2134
2134
|
const s = this._getOrReturnCtx(t);
|
|
2135
2135
|
return N(s, {
|
|
2136
2136
|
code: L.invalid_type,
|
|
2137
|
-
expected:
|
|
2137
|
+
expected: z.date,
|
|
2138
2138
|
received: s.parsedType
|
|
2139
2139
|
}), B;
|
|
2140
2140
|
}
|
|
@@ -2208,15 +2208,15 @@ Oi.create = (n) => new Oi({
|
|
|
2208
2208
|
});
|
|
2209
2209
|
class da extends et {
|
|
2210
2210
|
_parse(t) {
|
|
2211
|
-
if (this._getType(t) !==
|
|
2211
|
+
if (this._getType(t) !== z.symbol) {
|
|
2212
2212
|
const i = this._getOrReturnCtx(t);
|
|
2213
2213
|
return N(i, {
|
|
2214
2214
|
code: L.invalid_type,
|
|
2215
|
-
expected:
|
|
2215
|
+
expected: z.symbol,
|
|
2216
2216
|
received: i.parsedType
|
|
2217
2217
|
}), B;
|
|
2218
2218
|
}
|
|
2219
|
-
return
|
|
2219
|
+
return ie(t.data);
|
|
2220
2220
|
}
|
|
2221
2221
|
}
|
|
2222
2222
|
da.create = (n) => new da({
|
|
@@ -2225,15 +2225,15 @@ da.create = (n) => new da({
|
|
|
2225
2225
|
});
|
|
2226
2226
|
class Is extends et {
|
|
2227
2227
|
_parse(t) {
|
|
2228
|
-
if (this._getType(t) !==
|
|
2228
|
+
if (this._getType(t) !== z.undefined) {
|
|
2229
2229
|
const i = this._getOrReturnCtx(t);
|
|
2230
2230
|
return N(i, {
|
|
2231
2231
|
code: L.invalid_type,
|
|
2232
|
-
expected:
|
|
2232
|
+
expected: z.undefined,
|
|
2233
2233
|
received: i.parsedType
|
|
2234
2234
|
}), B;
|
|
2235
2235
|
}
|
|
2236
|
-
return
|
|
2236
|
+
return ie(t.data);
|
|
2237
2237
|
}
|
|
2238
2238
|
}
|
|
2239
2239
|
Is.create = (n) => new Is({
|
|
@@ -2242,15 +2242,15 @@ Is.create = (n) => new Is({
|
|
|
2242
2242
|
});
|
|
2243
2243
|
class Ms extends et {
|
|
2244
2244
|
_parse(t) {
|
|
2245
|
-
if (this._getType(t) !==
|
|
2245
|
+
if (this._getType(t) !== z.null) {
|
|
2246
2246
|
const i = this._getOrReturnCtx(t);
|
|
2247
2247
|
return N(i, {
|
|
2248
2248
|
code: L.invalid_type,
|
|
2249
|
-
expected:
|
|
2249
|
+
expected: z.null,
|
|
2250
2250
|
received: i.parsedType
|
|
2251
2251
|
}), B;
|
|
2252
2252
|
}
|
|
2253
|
-
return
|
|
2253
|
+
return ie(t.data);
|
|
2254
2254
|
}
|
|
2255
2255
|
}
|
|
2256
2256
|
Ms.create = (n) => new Ms({
|
|
@@ -2262,7 +2262,7 @@ class Mr extends et {
|
|
|
2262
2262
|
super(...arguments), this._any = !0;
|
|
2263
2263
|
}
|
|
2264
2264
|
_parse(t) {
|
|
2265
|
-
return
|
|
2265
|
+
return ie(t.data);
|
|
2266
2266
|
}
|
|
2267
2267
|
}
|
|
2268
2268
|
Mr.create = (n) => new Mr({
|
|
@@ -2274,7 +2274,7 @@ class Ci extends et {
|
|
|
2274
2274
|
super(...arguments), this._unknown = !0;
|
|
2275
2275
|
}
|
|
2276
2276
|
_parse(t) {
|
|
2277
|
-
return
|
|
2277
|
+
return ie(t.data);
|
|
2278
2278
|
}
|
|
2279
2279
|
}
|
|
2280
2280
|
Ci.create = (n) => new Ci({
|
|
@@ -2286,7 +2286,7 @@ class Ln extends et {
|
|
|
2286
2286
|
const e = this._getOrReturnCtx(t);
|
|
2287
2287
|
return N(e, {
|
|
2288
2288
|
code: L.invalid_type,
|
|
2289
|
-
expected:
|
|
2289
|
+
expected: z.never,
|
|
2290
2290
|
received: e.parsedType
|
|
2291
2291
|
}), B;
|
|
2292
2292
|
}
|
|
@@ -2297,15 +2297,15 @@ Ln.create = (n) => new Ln({
|
|
|
2297
2297
|
});
|
|
2298
2298
|
class ua extends et {
|
|
2299
2299
|
_parse(t) {
|
|
2300
|
-
if (this._getType(t) !==
|
|
2300
|
+
if (this._getType(t) !== z.undefined) {
|
|
2301
2301
|
const i = this._getOrReturnCtx(t);
|
|
2302
2302
|
return N(i, {
|
|
2303
2303
|
code: L.invalid_type,
|
|
2304
|
-
expected:
|
|
2304
|
+
expected: z.void,
|
|
2305
2305
|
received: i.parsedType
|
|
2306
2306
|
}), B;
|
|
2307
2307
|
}
|
|
2308
|
-
return
|
|
2308
|
+
return ie(t.data);
|
|
2309
2309
|
}
|
|
2310
2310
|
}
|
|
2311
2311
|
ua.create = (n) => new ua({
|
|
@@ -2315,10 +2315,10 @@ ua.create = (n) => new ua({
|
|
|
2315
2315
|
class Pe extends et {
|
|
2316
2316
|
_parse(t) {
|
|
2317
2317
|
const { ctx: e, status: i } = this._processInputParams(t), r = this._def;
|
|
2318
|
-
if (e.parsedType !==
|
|
2318
|
+
if (e.parsedType !== z.array)
|
|
2319
2319
|
return N(e, {
|
|
2320
2320
|
code: L.invalid_type,
|
|
2321
|
-
expected:
|
|
2321
|
+
expected: z.array,
|
|
2322
2322
|
received: e.parsedType
|
|
2323
2323
|
}), B;
|
|
2324
2324
|
if (r.exactLength !== null) {
|
|
@@ -2412,11 +2412,11 @@ class Yt extends et {
|
|
|
2412
2412
|
return this._cached = { shape: t, keys: e };
|
|
2413
2413
|
}
|
|
2414
2414
|
_parse(t) {
|
|
2415
|
-
if (this._getType(t) !==
|
|
2415
|
+
if (this._getType(t) !== z.object) {
|
|
2416
2416
|
const c = this._getOrReturnCtx(t);
|
|
2417
2417
|
return N(c, {
|
|
2418
2418
|
code: L.invalid_type,
|
|
2419
|
-
expected:
|
|
2419
|
+
expected: z.object,
|
|
2420
2420
|
received: c.parsedType
|
|
2421
2421
|
}), B;
|
|
2422
2422
|
}
|
|
@@ -2761,14 +2761,14 @@ Cs.create = (n, t) => new Cs({
|
|
|
2761
2761
|
typeName: E.ZodUnion,
|
|
2762
2762
|
...Q(t)
|
|
2763
2763
|
});
|
|
2764
|
-
const xn = (n) => n instanceof
|
|
2764
|
+
const xn = (n) => n instanceof zs ? xn(n.schema) : n instanceof De ? xn(n.innerType()) : n instanceof Fs ? [n.value] : n instanceof ri ? n.options : n instanceof Hs ? at.objectValues(n.enum) : n instanceof Ps ? xn(n._def.innerType) : n instanceof Is ? [void 0] : n instanceof Ms ? [null] : n instanceof en ? [void 0, ...xn(n.unwrap())] : n instanceof si ? [null, ...xn(n.unwrap())] : n instanceof td || n instanceof Os ? xn(n.unwrap()) : n instanceof Ds ? xn(n._def.innerType) : [];
|
|
2765
2765
|
class Pa extends et {
|
|
2766
2766
|
_parse(t) {
|
|
2767
2767
|
const { ctx: e } = this._processInputParams(t);
|
|
2768
|
-
if (e.parsedType !==
|
|
2768
|
+
if (e.parsedType !== z.object)
|
|
2769
2769
|
return N(e, {
|
|
2770
2770
|
code: L.invalid_type,
|
|
2771
|
-
expected:
|
|
2771
|
+
expected: z.object,
|
|
2772
2772
|
received: e.parsedType
|
|
2773
2773
|
}), B;
|
|
2774
2774
|
const i = this.discriminator, r = e.data[i], s = this.optionsMap.get(r);
|
|
@@ -2828,7 +2828,7 @@ function ac(n, t) {
|
|
|
2828
2828
|
const e = Dn(n), i = Dn(t);
|
|
2829
2829
|
if (n === t)
|
|
2830
2830
|
return { valid: !0, data: n };
|
|
2831
|
-
if (e ===
|
|
2831
|
+
if (e === z.object && i === z.object) {
|
|
2832
2832
|
const r = at.objectKeys(t), s = at.objectKeys(n).filter((a) => r.indexOf(a) !== -1), o = { ...n, ...t };
|
|
2833
2833
|
for (const a of s) {
|
|
2834
2834
|
const l = ac(n[a], t[a]);
|
|
@@ -2837,7 +2837,7 @@ function ac(n, t) {
|
|
|
2837
2837
|
o[a] = l.data;
|
|
2838
2838
|
}
|
|
2839
2839
|
return { valid: !0, data: o };
|
|
2840
|
-
} else if (e ===
|
|
2840
|
+
} else if (e === z.array && i === z.array) {
|
|
2841
2841
|
if (n.length !== t.length)
|
|
2842
2842
|
return { valid: !1 };
|
|
2843
2843
|
const r = [];
|
|
@@ -2848,7 +2848,7 @@ function ac(n, t) {
|
|
|
2848
2848
|
r.push(l.data);
|
|
2849
2849
|
}
|
|
2850
2850
|
return { valid: !0, data: r };
|
|
2851
|
-
} else return e ===
|
|
2851
|
+
} else return e === z.date && i === z.date && +n == +t ? { valid: !0, data: n } : { valid: !1 };
|
|
2852
2852
|
}
|
|
2853
2853
|
class Ns extends et {
|
|
2854
2854
|
_parse(t) {
|
|
@@ -2891,10 +2891,10 @@ Ns.create = (n, t, e) => new Ns({
|
|
|
2891
2891
|
class ln extends et {
|
|
2892
2892
|
_parse(t) {
|
|
2893
2893
|
const { status: e, ctx: i } = this._processInputParams(t);
|
|
2894
|
-
if (i.parsedType !==
|
|
2894
|
+
if (i.parsedType !== z.array)
|
|
2895
2895
|
return N(i, {
|
|
2896
2896
|
code: L.invalid_type,
|
|
2897
|
-
expected:
|
|
2897
|
+
expected: z.array,
|
|
2898
2898
|
received: i.parsedType
|
|
2899
2899
|
}), B;
|
|
2900
2900
|
if (i.data.length < this._def.items.length)
|
|
@@ -2938,7 +2938,7 @@ ln.create = (n, t) => {
|
|
|
2938
2938
|
...Q(t)
|
|
2939
2939
|
});
|
|
2940
2940
|
};
|
|
2941
|
-
class
|
|
2941
|
+
class Ts extends et {
|
|
2942
2942
|
get keySchema() {
|
|
2943
2943
|
return this._def.keyType;
|
|
2944
2944
|
}
|
|
@@ -2947,10 +2947,10 @@ class zs extends et {
|
|
|
2947
2947
|
}
|
|
2948
2948
|
_parse(t) {
|
|
2949
2949
|
const { status: e, ctx: i } = this._processInputParams(t);
|
|
2950
|
-
if (i.parsedType !==
|
|
2950
|
+
if (i.parsedType !== z.object)
|
|
2951
2951
|
return N(i, {
|
|
2952
2952
|
code: L.invalid_type,
|
|
2953
|
-
expected:
|
|
2953
|
+
expected: z.object,
|
|
2954
2954
|
received: i.parsedType
|
|
2955
2955
|
}), B;
|
|
2956
2956
|
const r = [], s = this._def.keyType, o = this._def.valueType;
|
|
@@ -2966,12 +2966,12 @@ class zs extends et {
|
|
|
2966
2966
|
return this._def.valueType;
|
|
2967
2967
|
}
|
|
2968
2968
|
static create(t, e, i) {
|
|
2969
|
-
return e instanceof et ? new
|
|
2969
|
+
return e instanceof et ? new Ts({
|
|
2970
2970
|
keyType: t,
|
|
2971
2971
|
valueType: e,
|
|
2972
2972
|
typeName: E.ZodRecord,
|
|
2973
2973
|
...Q(i)
|
|
2974
|
-
}) : new
|
|
2974
|
+
}) : new Ts({
|
|
2975
2975
|
keyType: Fe.create(),
|
|
2976
2976
|
valueType: t,
|
|
2977
2977
|
typeName: E.ZodRecord,
|
|
@@ -2988,10 +2988,10 @@ class ha extends et {
|
|
|
2988
2988
|
}
|
|
2989
2989
|
_parse(t) {
|
|
2990
2990
|
const { status: e, ctx: i } = this._processInputParams(t);
|
|
2991
|
-
if (i.parsedType !==
|
|
2991
|
+
if (i.parsedType !== z.map)
|
|
2992
2992
|
return N(i, {
|
|
2993
2993
|
code: L.invalid_type,
|
|
2994
|
-
expected:
|
|
2994
|
+
expected: z.map,
|
|
2995
2995
|
received: i.parsedType
|
|
2996
2996
|
}), B;
|
|
2997
2997
|
const r = this._def.keyType, s = this._def.valueType, o = [...i.data.entries()].map(([a, l], c) => ({
|
|
@@ -3030,10 +3030,10 @@ ha.create = (n, t, e) => new ha({
|
|
|
3030
3030
|
class Ki extends et {
|
|
3031
3031
|
_parse(t) {
|
|
3032
3032
|
const { status: e, ctx: i } = this._processInputParams(t);
|
|
3033
|
-
if (i.parsedType !==
|
|
3033
|
+
if (i.parsedType !== z.set)
|
|
3034
3034
|
return N(i, {
|
|
3035
3035
|
code: L.invalid_type,
|
|
3036
|
-
expected:
|
|
3036
|
+
expected: z.set,
|
|
3037
3037
|
received: i.parsedType
|
|
3038
3038
|
}), B;
|
|
3039
3039
|
const r = this._def;
|
|
@@ -3097,10 +3097,10 @@ class kr extends et {
|
|
|
3097
3097
|
}
|
|
3098
3098
|
_parse(t) {
|
|
3099
3099
|
const { ctx: e } = this._processInputParams(t);
|
|
3100
|
-
if (e.parsedType !==
|
|
3100
|
+
if (e.parsedType !== z.function)
|
|
3101
3101
|
return N(e, {
|
|
3102
3102
|
code: L.invalid_type,
|
|
3103
|
-
expected:
|
|
3103
|
+
expected: z.function,
|
|
3104
3104
|
received: e.parsedType
|
|
3105
3105
|
}), B;
|
|
3106
3106
|
function i(a, l) {
|
|
@@ -3138,7 +3138,7 @@ class kr extends et {
|
|
|
3138
3138
|
const s = { errorMap: e.common.contextualErrorMap }, o = e.data;
|
|
3139
3139
|
if (this._def.returns instanceof Cr) {
|
|
3140
3140
|
const a = this;
|
|
3141
|
-
return
|
|
3141
|
+
return ie(async function(...l) {
|
|
3142
3142
|
const c = new ve([]), d = await a._def.args.parseAsync(l, s).catch((f) => {
|
|
3143
3143
|
throw c.addIssue(i(l, f)), c;
|
|
3144
3144
|
}), u = await Reflect.apply(o, this, d);
|
|
@@ -3148,7 +3148,7 @@ class kr extends et {
|
|
|
3148
3148
|
});
|
|
3149
3149
|
} else {
|
|
3150
3150
|
const a = this;
|
|
3151
|
-
return
|
|
3151
|
+
return ie(function(...l) {
|
|
3152
3152
|
const c = a._def.args.safeParse(l, s);
|
|
3153
3153
|
if (!c.success)
|
|
3154
3154
|
throw new ve([i(l, c.error)]);
|
|
@@ -3192,7 +3192,7 @@ class kr extends et {
|
|
|
3192
3192
|
});
|
|
3193
3193
|
}
|
|
3194
3194
|
}
|
|
3195
|
-
class
|
|
3195
|
+
class zs extends et {
|
|
3196
3196
|
get schema() {
|
|
3197
3197
|
return this._def.getter();
|
|
3198
3198
|
}
|
|
@@ -3201,7 +3201,7 @@ class Ts extends et {
|
|
|
3201
3201
|
return this._def.getter()._parse({ data: e.data, path: e.path, parent: e });
|
|
3202
3202
|
}
|
|
3203
3203
|
}
|
|
3204
|
-
|
|
3204
|
+
zs.create = (n, t) => new zs({
|
|
3205
3205
|
getter: n,
|
|
3206
3206
|
typeName: E.ZodLazy,
|
|
3207
3207
|
...Q(t)
|
|
@@ -3255,7 +3255,7 @@ class ri extends et {
|
|
|
3255
3255
|
options: i
|
|
3256
3256
|
}), B;
|
|
3257
3257
|
}
|
|
3258
|
-
return
|
|
3258
|
+
return ie(t.data);
|
|
3259
3259
|
}
|
|
3260
3260
|
get options() {
|
|
3261
3261
|
return this._def.values;
|
|
@@ -3299,7 +3299,7 @@ class Hs extends et {
|
|
|
3299
3299
|
}
|
|
3300
3300
|
_parse(t) {
|
|
3301
3301
|
const e = at.getValidEnumValues(this._def.values), i = this._getOrReturnCtx(t);
|
|
3302
|
-
if (i.parsedType !==
|
|
3302
|
+
if (i.parsedType !== z.string && i.parsedType !== z.number) {
|
|
3303
3303
|
const r = at.objectValues(e);
|
|
3304
3304
|
return N(i, {
|
|
3305
3305
|
expected: at.joinValues(r),
|
|
@@ -3315,7 +3315,7 @@ class Hs extends et {
|
|
|
3315
3315
|
options: r
|
|
3316
3316
|
}), B;
|
|
3317
3317
|
}
|
|
3318
|
-
return
|
|
3318
|
+
return ie(t.data);
|
|
3319
3319
|
}
|
|
3320
3320
|
get enum() {
|
|
3321
3321
|
return this._def.values;
|
|
@@ -3333,14 +3333,14 @@ class Cr extends et {
|
|
|
3333
3333
|
}
|
|
3334
3334
|
_parse(t) {
|
|
3335
3335
|
const { ctx: e } = this._processInputParams(t);
|
|
3336
|
-
if (e.parsedType !==
|
|
3336
|
+
if (e.parsedType !== z.promise && e.common.async === !1)
|
|
3337
3337
|
return N(e, {
|
|
3338
3338
|
code: L.invalid_type,
|
|
3339
|
-
expected:
|
|
3339
|
+
expected: z.promise,
|
|
3340
3340
|
received: e.parsedType
|
|
3341
3341
|
}), B;
|
|
3342
|
-
const i = e.parsedType ===
|
|
3343
|
-
return
|
|
3342
|
+
const i = e.parsedType === z.promise ? e.data : Promise.resolve(e.data);
|
|
3343
|
+
return ie(i.then((r) => this._def.type.parseAsync(r, {
|
|
3344
3344
|
path: e.path,
|
|
3345
3345
|
errorMap: e.common.contextualErrorMap
|
|
3346
3346
|
})));
|
|
@@ -3442,7 +3442,7 @@ De.createWithPreprocess = (n, t, e) => new De({
|
|
|
3442
3442
|
});
|
|
3443
3443
|
class en extends et {
|
|
3444
3444
|
_parse(t) {
|
|
3445
|
-
return this._getType(t) ===
|
|
3445
|
+
return this._getType(t) === z.undefined ? ie(void 0) : this._def.innerType._parse(t);
|
|
3446
3446
|
}
|
|
3447
3447
|
unwrap() {
|
|
3448
3448
|
return this._def.innerType;
|
|
@@ -3455,7 +3455,7 @@ en.create = (n, t) => new en({
|
|
|
3455
3455
|
});
|
|
3456
3456
|
class si extends et {
|
|
3457
3457
|
_parse(t) {
|
|
3458
|
-
return this._getType(t) ===
|
|
3458
|
+
return this._getType(t) === z.null ? ie(null) : this._def.innerType._parse(t);
|
|
3459
3459
|
}
|
|
3460
3460
|
unwrap() {
|
|
3461
3461
|
return this._def.innerType;
|
|
@@ -3470,7 +3470,7 @@ class Ps extends et {
|
|
|
3470
3470
|
_parse(t) {
|
|
3471
3471
|
const { ctx: e } = this._processInputParams(t);
|
|
3472
3472
|
let i = e.data;
|
|
3473
|
-
return e.parsedType ===
|
|
3473
|
+
return e.parsedType === z.undefined && (i = this._def.defaultValue()), this._def.innerType._parse({
|
|
3474
3474
|
data: i,
|
|
3475
3475
|
path: e.path,
|
|
3476
3476
|
parent: e
|
|
@@ -3531,11 +3531,11 @@ Ds.create = (n, t) => new Ds({
|
|
|
3531
3531
|
});
|
|
3532
3532
|
class fa extends et {
|
|
3533
3533
|
_parse(t) {
|
|
3534
|
-
if (this._getType(t) !==
|
|
3534
|
+
if (this._getType(t) !== z.nan) {
|
|
3535
3535
|
const i = this._getOrReturnCtx(t);
|
|
3536
3536
|
return N(i, {
|
|
3537
3537
|
code: L.invalid_type,
|
|
3538
|
-
expected:
|
|
3538
|
+
expected: z.nan,
|
|
3539
3539
|
received: i.parsedType
|
|
3540
3540
|
}), B;
|
|
3541
3541
|
}
|
|
@@ -3632,7 +3632,7 @@ var E;
|
|
|
3632
3632
|
})(E || (E = {}));
|
|
3633
3633
|
const G0 = (n, t = {
|
|
3634
3634
|
message: `Input not instance of ${n.name}`
|
|
3635
|
-
}) => yp((e) => e instanceof n, t), vp = Fe.create, xp = ni.create, R0 = fa.create, L0 = ii.create, Zp = Vs.create, Y0 = Oi.create, V0 = da.create, I0 = Is.create, M0 = Ms.create, C0 = Mr.create, N0 = Ci.create,
|
|
3635
|
+
}) => yp((e) => e instanceof n, t), vp = Fe.create, xp = ni.create, R0 = fa.create, L0 = ii.create, Zp = Vs.create, Y0 = Oi.create, V0 = da.create, I0 = Is.create, M0 = Ms.create, C0 = Mr.create, N0 = Ci.create, T0 = Ln.create, z0 = ua.create, F0 = Pe.create, H0 = Yt.create, P0 = Yt.strictCreate, D0 = Cs.create, O0 = Pa.create, K0 = Ns.create, j0 = ln.create, J0 = Ts.create, E0 = ha.create, B0 = Ki.create, U0 = kr.create, A0 = zs.create, Q0 = Fs.create, $0 = ri.create, q0 = Hs.create, ty = Cr.create, wu = De.create, ey = en.create, ny = si.create, iy = De.createWithPreprocess, ry = oo.create, sy = () => vp().optional(), oy = () => xp().optional(), ay = () => Zp().optional(), ly = {
|
|
3636
3636
|
string: (n) => Fe.create({ ...n, coerce: !0 }),
|
|
3637
3637
|
number: (n) => ni.create({ ...n, coerce: !0 }),
|
|
3638
3638
|
boolean: (n) => Vs.create({
|
|
@@ -3653,7 +3653,7 @@ var D = /* @__PURE__ */ Object.freeze({
|
|
|
3653
3653
|
ParseStatus: At,
|
|
3654
3654
|
INVALID: B,
|
|
3655
3655
|
DIRTY: br,
|
|
3656
|
-
OK:
|
|
3656
|
+
OK: ie,
|
|
3657
3657
|
isAborted: sc,
|
|
3658
3658
|
isDirty: oc,
|
|
3659
3659
|
isValid: Ls,
|
|
@@ -3664,7 +3664,7 @@ var D = /* @__PURE__ */ Object.freeze({
|
|
|
3664
3664
|
get objectUtil() {
|
|
3665
3665
|
return rc;
|
|
3666
3666
|
},
|
|
3667
|
-
ZodParsedType:
|
|
3667
|
+
ZodParsedType: z,
|
|
3668
3668
|
getParsedType: Dn,
|
|
3669
3669
|
ZodType: et,
|
|
3670
3670
|
datetimeRegex: bp,
|
|
@@ -3686,11 +3686,11 @@ var D = /* @__PURE__ */ Object.freeze({
|
|
|
3686
3686
|
ZodDiscriminatedUnion: Pa,
|
|
3687
3687
|
ZodIntersection: Ns,
|
|
3688
3688
|
ZodTuple: ln,
|
|
3689
|
-
ZodRecord:
|
|
3689
|
+
ZodRecord: Ts,
|
|
3690
3690
|
ZodMap: ha,
|
|
3691
3691
|
ZodSet: Ki,
|
|
3692
3692
|
ZodFunction: kr,
|
|
3693
|
-
ZodLazy:
|
|
3693
|
+
ZodLazy: zs,
|
|
3694
3694
|
ZodLiteral: Fs,
|
|
3695
3695
|
ZodEnum: ri,
|
|
3696
3696
|
ZodNativeEnum: Hs,
|
|
@@ -3730,7 +3730,7 @@ var D = /* @__PURE__ */ Object.freeze({
|
|
|
3730
3730
|
map: E0,
|
|
3731
3731
|
nan: R0,
|
|
3732
3732
|
nativeEnum: q0,
|
|
3733
|
-
never:
|
|
3733
|
+
never: T0,
|
|
3734
3734
|
null: M0,
|
|
3735
3735
|
nullable: ny,
|
|
3736
3736
|
number: xp,
|
|
@@ -3752,7 +3752,7 @@ var D = /* @__PURE__ */ Object.freeze({
|
|
|
3752
3752
|
undefined: I0,
|
|
3753
3753
|
union: D0,
|
|
3754
3754
|
unknown: N0,
|
|
3755
|
-
void:
|
|
3755
|
+
void: z0,
|
|
3756
3756
|
NEVER: cy,
|
|
3757
3757
|
ZodIssueCode: L,
|
|
3758
3758
|
quotelessJson: l0,
|
|
@@ -4081,7 +4081,7 @@ function sd(n, t, e, i, r, s, o, a, l, c) {
|
|
|
4081
4081
|
if (t.constructor !== void 0) return null;
|
|
4082
4082
|
128 & e.__u && (l = !!(32 & e.__u), s = [a = t.__e = e.__e]), (d = vt.__b) && d(t);
|
|
4083
4083
|
t: if (typeof Y == "function") try {
|
|
4084
|
-
if (y = t.props, x = "prototype" in Y && Y.prototype.render, w = (d = Y.contextType) && i[d.__c], k = d ? w ? w.props.value : d.__ : i, e.__c ? g = (u = t.__c = e.__c).__ = u.__E : (x ? t.__c = u = new Y(y, k) : (t.__c = u = new Bo(y, k), u.constructor = Y, u.render =
|
|
4084
|
+
if (y = t.props, x = "prototype" in Y && Y.prototype.render, w = (d = Y.contextType) && i[d.__c], k = d ? w ? w.props.value : d.__ : i, e.__c ? g = (u = t.__c = e.__c).__ = u.__E : (x ? t.__c = u = new Y(y, k) : (t.__c = u = new Bo(y, k), u.constructor = Y, u.render = zy), w && w.sub(u), u.props = y, u.state || (u.state = {}), u.context = k, u.__n = i, h = u.__d = !0, u.__h = [], u._sb = []), x && u.__s == null && (u.__s = u.state), x && Y.getDerivedStateFromProps != null && (u.__s == u.state && (u.__s = On({}, u.__s)), On(u.__s, Y.getDerivedStateFromProps(y, u.__s))), f = u.props, p = u.state, u.__v = t, h) x && Y.getDerivedStateFromProps == null && u.componentWillMount != null && u.componentWillMount(), x && u.componentDidMount != null && u.__h.push(u.componentDidMount);
|
|
4085
4085
|
else {
|
|
4086
4086
|
if (x && Y.getDerivedStateFromProps == null && y !== f && u.componentWillReceiveProps != null && u.componentWillReceiveProps(y, k), !u.__e && (u.shouldComponentUpdate != null && u.shouldComponentUpdate(y, u.__s, k) === !1 || t.__v === e.__v)) {
|
|
4087
4087
|
for (t.__v !== e.__v && (u.props = y, u.state = u.__s, u.__d = !1), t.__e = e.__e, t.__k = e.__k, t.__k.some(function(K) {
|
|
@@ -4108,7 +4108,7 @@ function sd(n, t, e, i, r, s, o, a, l, c) {
|
|
|
4108
4108
|
} else t.__e = e.__e, t.__k = e.__k;
|
|
4109
4109
|
vt.__e(K, t, e);
|
|
4110
4110
|
}
|
|
4111
|
-
else s == null && t.__v === e.__v ? (t.__k = e.__k, t.__e = e.__e) : t.__e =
|
|
4111
|
+
else s == null && t.__v === e.__v ? (t.__k = e.__k, t.__e = e.__e) : t.__e = Ty(e.__e, t, e, i, r, s, o, l, c);
|
|
4112
4112
|
(d = vt.diffed) && d(t);
|
|
4113
4113
|
}
|
|
4114
4114
|
function Vp(n, t, e) {
|
|
@@ -4124,7 +4124,7 @@ function Vp(n, t, e) {
|
|
|
4124
4124
|
}
|
|
4125
4125
|
});
|
|
4126
4126
|
}
|
|
4127
|
-
function
|
|
4127
|
+
function Ty(n, t, e, i, r, s, o, a, l) {
|
|
4128
4128
|
var c, d, u, h, f, p, b, g = e.props, y = t.props, x = t.type;
|
|
4129
4129
|
if (x === "svg" ? r = "http://www.w3.org/2000/svg" : x === "math" ? r = "http://www.w3.org/1998/Math/MathML" : r || (r = "http://www.w3.org/1999/xhtml"), s != null) {
|
|
4130
4130
|
for (c = 0; c < s.length; c++) if ((f = s[c]) && "setAttribute" in f == !!x && (x ? f.localName === x : f.nodeType === 3)) {
|
|
@@ -4176,7 +4176,7 @@ function Ip(n, t, e) {
|
|
|
4176
4176
|
if (i = n.__k) for (r = 0; r < i.length; r++) i[r] && Ip(i[r], t, e || typeof n.type != "function");
|
|
4177
4177
|
e || Gp(n.__e), n.__c = n.__ = n.__e = n.__d = void 0;
|
|
4178
4178
|
}
|
|
4179
|
-
function
|
|
4179
|
+
function zy(n, t, e) {
|
|
4180
4180
|
return this.constructor(n, e);
|
|
4181
4181
|
}
|
|
4182
4182
|
function Fy(n, t, e) {
|
|
@@ -4237,11 +4237,11 @@ function ao(n, t) {
|
|
|
4237
4237
|
return n >= e.__.length && e.__.push({}), e.__[n];
|
|
4238
4238
|
}
|
|
4239
4239
|
function it(n) {
|
|
4240
|
-
return ga = 1, Py(
|
|
4240
|
+
return ga = 1, Py(Tp, n);
|
|
4241
4241
|
}
|
|
4242
4242
|
function Py(n, t, e) {
|
|
4243
4243
|
var i = ao(ji++, 2);
|
|
4244
|
-
if (i.t = n, !i.__c && (i.__ = [
|
|
4244
|
+
if (i.t = n, !i.__c && (i.__ = [Tp(void 0, t), function(a) {
|
|
4245
4245
|
var l = i.__N ? i.__N[0] : i.__[0], c = i.t(l, a);
|
|
4246
4246
|
l !== c && (i.__N = [c, i.__[1]], i.__c.setState({}));
|
|
4247
4247
|
}], i.__c = wt, !wt.u)) {
|
|
@@ -4273,7 +4273,7 @@ function Py(n, t, e) {
|
|
|
4273
4273
|
}
|
|
4274
4274
|
return i.__N || i.__;
|
|
4275
4275
|
}
|
|
4276
|
-
function
|
|
4276
|
+
function Qt(n, t) {
|
|
4277
4277
|
var e = ao(ji++, 3);
|
|
4278
4278
|
!Ft.__s && Np(e.__H, t) && (e.__ = n, e.i = t, wt.__H.__h.push(e));
|
|
4279
4279
|
}
|
|
@@ -4364,10 +4364,10 @@ function Np(n, t) {
|
|
|
4364
4364
|
return e !== n[i];
|
|
4365
4365
|
});
|
|
4366
4366
|
}
|
|
4367
|
-
function
|
|
4367
|
+
function Tp(n, t) {
|
|
4368
4368
|
return typeof t == "function" ? t(n) : t;
|
|
4369
4369
|
}
|
|
4370
|
-
function
|
|
4370
|
+
function zp(n, t) {
|
|
4371
4371
|
const e = /* @__PURE__ */ new Map();
|
|
4372
4372
|
for (const i of n.content)
|
|
4373
4373
|
for (const r of i.data) {
|
|
@@ -4419,7 +4419,7 @@ function Ey(n, t) {
|
|
|
4419
4419
|
}
|
|
4420
4420
|
var r;
|
|
4421
4421
|
}
|
|
4422
|
-
function
|
|
4422
|
+
function qt(n, t, e) {
|
|
4423
4423
|
return t && Ey(n.prototype, t), Object.defineProperty(n, "prototype", { writable: !1 }), n;
|
|
4424
4424
|
}
|
|
4425
4425
|
function ct() {
|
|
@@ -4448,7 +4448,7 @@ function Cu(n, t) {
|
|
|
4448
4448
|
for (var e = 0, i = new Array(t); e < t; e++) i[e] = n[e];
|
|
4449
4449
|
return i;
|
|
4450
4450
|
}
|
|
4451
|
-
function
|
|
4451
|
+
function ee(n, t) {
|
|
4452
4452
|
var e = typeof Symbol < "u" && n[Symbol.iterator] || n["@@iterator"];
|
|
4453
4453
|
if (e) return (e = e.call(n)).next.bind(e);
|
|
4454
4454
|
if (Array.isArray(n) || (e = function(r, s) {
|
|
@@ -4552,17 +4552,17 @@ function Ep(n, t, e, i, r, s) {
|
|
|
4552
4552
|
}
|
|
4553
4553
|
return o !== void 0 ? o : r.nextSibling;
|
|
4554
4554
|
}
|
|
4555
|
-
function
|
|
4555
|
+
function Tu(n, t, e) {
|
|
4556
4556
|
t[0] === "-" ? n.setProperty(t, e) : n[t] = e == null ? "" : typeof e != "number" || By.test(t) ? e : e + "px";
|
|
4557
4557
|
}
|
|
4558
4558
|
function _o(n, t, e, i, r) {
|
|
4559
4559
|
var s;
|
|
4560
4560
|
t: if (t === "style") if (typeof e == "string") n.style.cssText = e;
|
|
4561
4561
|
else {
|
|
4562
|
-
if (typeof i == "string" && (n.style.cssText = i = ""), i) for (t in i) e && t in e ||
|
|
4563
|
-
if (e) for (t in e) i && e[t] === i[t] ||
|
|
4562
|
+
if (typeof i == "string" && (n.style.cssText = i = ""), i) for (t in i) e && t in e || Tu(n.style, t, "");
|
|
4563
|
+
if (e) for (t in e) i && e[t] === i[t] || Tu(n.style, t, e[t]);
|
|
4564
4564
|
}
|
|
4565
|
-
else if (t[0] === "o" && t[1] === "n") s = t !== (t = t.replace(/Capture$/, "")), t = t.toLowerCase() in n ? t.toLowerCase().slice(2) : t.slice(2), n.l || (n.l = {}), n.l[t + s] = e, e ? i || n.addEventListener(t, s ? Fu :
|
|
4565
|
+
else if (t[0] === "o" && t[1] === "n") s = t !== (t = t.replace(/Capture$/, "")), t = t.toLowerCase() in n ? t.toLowerCase().slice(2) : t.slice(2), n.l || (n.l = {}), n.l[t + s] = e, e ? i || n.addEventListener(t, s ? Fu : zu, s) : n.removeEventListener(t, s ? Fu : zu, s);
|
|
4566
4566
|
else if (t !== "dangerouslySetInnerHTML") {
|
|
4567
4567
|
if (r) t = t.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
|
|
4568
4568
|
else if (t !== "href" && t !== "list" && t !== "form" && t !== "tabIndex" && t !== "download" && t in n) try {
|
|
@@ -4573,7 +4573,7 @@ function _o(n, t, e, i, r) {
|
|
|
4573
4573
|
typeof e == "function" || (e == null || e === !1 && t.indexOf("-") == -1 ? n.removeAttribute(t) : n.setAttribute(t, e));
|
|
4574
4574
|
}
|
|
4575
4575
|
}
|
|
4576
|
-
function
|
|
4576
|
+
function zu(n) {
|
|
4577
4577
|
this.l[n.type + !1](tt.event ? tt.event(n) : n);
|
|
4578
4578
|
}
|
|
4579
4579
|
function Fu(n) {
|
|
@@ -4702,7 +4702,7 @@ var ja = /* @__PURE__ */ function() {
|
|
|
4702
4702
|
function n(t) {
|
|
4703
4703
|
this._id = void 0, this._id = t || Qp();
|
|
4704
4704
|
}
|
|
4705
|
-
return
|
|
4705
|
+
return qt(n, [{ key: "id", get: function() {
|
|
4706
4706
|
return this._id;
|
|
4707
4707
|
} }]), n;
|
|
4708
4708
|
}();
|
|
@@ -4741,7 +4741,7 @@ var Ut, ld = /* @__PURE__ */ function(n) {
|
|
|
4741
4741
|
return new t(i.map(function(r) {
|
|
4742
4742
|
return new ld(r.data);
|
|
4743
4743
|
}));
|
|
4744
|
-
},
|
|
4744
|
+
}, qt(t, [{ key: "cells", get: function() {
|
|
4745
4745
|
return this._cells;
|
|
4746
4746
|
}, set: function(i) {
|
|
4747
4747
|
this._cells = i;
|
|
@@ -4769,7 +4769,7 @@ var Ut, ld = /* @__PURE__ */ function(n) {
|
|
|
4769
4769
|
return new ld(r);
|
|
4770
4770
|
}));
|
|
4771
4771
|
}));
|
|
4772
|
-
},
|
|
4772
|
+
}, qt(t, [{ key: "rows", get: function() {
|
|
4773
4773
|
return this._rows;
|
|
4774
4774
|
}, set: function(e) {
|
|
4775
4775
|
this._rows = e;
|
|
@@ -4837,7 +4837,7 @@ var fn = /* @__PURE__ */ function(n) {
|
|
|
4837
4837
|
}, e.setProps = function(i) {
|
|
4838
4838
|
var r = ct({}, this._props, i);
|
|
4839
4839
|
return $o(r, this._props) || (this._props = r, this.emit("propsUpdated", this)), this;
|
|
4840
|
-
},
|
|
4840
|
+
}, qt(t, [{ key: "props", get: function() {
|
|
4841
4841
|
return this._props;
|
|
4842
4842
|
} }]), t;
|
|
4843
4843
|
}(cd), $y = /* @__PURE__ */ function(n) {
|
|
@@ -4858,7 +4858,7 @@ var fn = /* @__PURE__ */ function(n) {
|
|
|
4858
4858
|
});
|
|
4859
4859
|
}))) : e;
|
|
4860
4860
|
var i, r, s, o, a;
|
|
4861
|
-
},
|
|
4861
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
4862
4862
|
return Ut.Filter;
|
|
4863
4863
|
} }]), t;
|
|
4864
4864
|
}(fn);
|
|
@@ -4877,7 +4877,7 @@ function Zt() {
|
|
|
4877
4877
|
return (n || "") + " " + t;
|
|
4878
4878
|
}, "").trim();
|
|
4879
4879
|
}
|
|
4880
|
-
var lo,
|
|
4880
|
+
var lo, Tt, Ll, Hu, Pu = /* @__PURE__ */ function(n) {
|
|
4881
4881
|
function t() {
|
|
4882
4882
|
return n.apply(this, arguments) || this;
|
|
4883
4883
|
}
|
|
@@ -4885,13 +4885,13 @@ var lo, zt, Ll, Hu, Pu = /* @__PURE__ */ function(n) {
|
|
|
4885
4885
|
if (!this.props.keyword) return e;
|
|
4886
4886
|
var i = {};
|
|
4887
4887
|
return this.props.url && (i.url = this.props.url(e.url, this.props.keyword)), this.props.body && (i.body = this.props.body(e.body, this.props.keyword)), ct({}, e, i);
|
|
4888
|
-
},
|
|
4888
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
4889
4889
|
return Ut.ServerFilter;
|
|
4890
4890
|
} }]), t;
|
|
4891
4891
|
}(fn), Js = 0, qp = [], qo = [], Du = tt.__b, Ou = tt.__r, Ku = tt.diffed, ju = tt.__c, Ju = tt.unmount;
|
|
4892
4892
|
function Ea(n, t) {
|
|
4893
|
-
tt.__h && tt.__h(
|
|
4894
|
-
var e =
|
|
4893
|
+
tt.__h && tt.__h(Tt, n, Js || t), Js = 0;
|
|
4894
|
+
var e = Tt.__H || (Tt.__H = { __: [], __h: [] });
|
|
4895
4895
|
return n >= e.__.length && e.__.push({ __V: qo }), e.__[n];
|
|
4896
4896
|
}
|
|
4897
4897
|
function oi(n) {
|
|
@@ -4900,10 +4900,10 @@ function oi(n) {
|
|
|
4900
4900
|
if (r.t = t, !r.__c && (r.__ = [Bu(void 0, e), function(o) {
|
|
4901
4901
|
var a = r.__N ? r.__N[0] : r.__[0], l = r.t(a, o);
|
|
4902
4902
|
a !== l && (r.__N = [l, r.__[1]], r.__c.setState({}));
|
|
4903
|
-
}], r.__c =
|
|
4904
|
-
|
|
4905
|
-
var s =
|
|
4906
|
-
|
|
4903
|
+
}], r.__c = Tt, !Tt.u)) {
|
|
4904
|
+
Tt.u = !0;
|
|
4905
|
+
var s = Tt.shouldComponentUpdate;
|
|
4906
|
+
Tt.shouldComponentUpdate = function(o, a, l) {
|
|
4907
4907
|
if (!r.__c.__H) return !0;
|
|
4908
4908
|
var c = r.__c.__H.__.filter(function(u) {
|
|
4909
4909
|
return u.__c;
|
|
@@ -4925,7 +4925,7 @@ function oi(n) {
|
|
|
4925
4925
|
}
|
|
4926
4926
|
function de(n, t) {
|
|
4927
4927
|
var e = Ea(lo++, 3);
|
|
4928
|
-
!tt.__s && em(e.__H, t) && (e.__ = n, e.i = t,
|
|
4928
|
+
!tt.__s && em(e.__H, t) && (e.__ = n, e.i = t, Tt.__H.__h.push(e));
|
|
4929
4929
|
}
|
|
4930
4930
|
function co(n) {
|
|
4931
4931
|
return Js = 5, tm(function() {
|
|
@@ -4944,19 +4944,19 @@ function qy() {
|
|
|
4944
4944
|
}
|
|
4945
4945
|
}
|
|
4946
4946
|
tt.__b = function(n) {
|
|
4947
|
-
|
|
4947
|
+
Tt = null, Du && Du(n);
|
|
4948
4948
|
}, tt.__r = function(n) {
|
|
4949
4949
|
Ou && Ou(n), lo = 0;
|
|
4950
|
-
var t = (
|
|
4951
|
-
t && (Ll ===
|
|
4950
|
+
var t = (Tt = n.__c).__H;
|
|
4951
|
+
t && (Ll === Tt ? (t.__h = [], Tt.__h = [], t.__.forEach(function(e) {
|
|
4952
4952
|
e.__N && (e.__ = e.__N), e.__V = qo, e.__N = e.i = void 0;
|
|
4953
|
-
})) : (t.__h.forEach(ta), t.__h.forEach(bc), t.__h = [])), Ll =
|
|
4953
|
+
})) : (t.__h.forEach(ta), t.__h.forEach(bc), t.__h = [])), Ll = Tt;
|
|
4954
4954
|
}, tt.diffed = function(n) {
|
|
4955
4955
|
Ku && Ku(n);
|
|
4956
4956
|
var t = n.__c;
|
|
4957
4957
|
t && t.__H && (t.__H.__h.length && (qp.push(t) !== 1 && Hu === tt.requestAnimationFrame || ((Hu = tt.requestAnimationFrame) || tv)(qy)), t.__H.__.forEach(function(e) {
|
|
4958
4958
|
e.i && (e.__H = e.i), e.__V !== qo && (e.__ = e.__V), e.i = void 0, e.__V = qo;
|
|
4959
|
-
})), Ll =
|
|
4959
|
+
})), Ll = Tt = null;
|
|
4960
4960
|
}, tt.__c = function(n, t) {
|
|
4961
4961
|
t.some(function(e) {
|
|
4962
4962
|
try {
|
|
@@ -4988,12 +4988,12 @@ function tv(n) {
|
|
|
4988
4988
|
Eu && (t = requestAnimationFrame(e));
|
|
4989
4989
|
}
|
|
4990
4990
|
function ta(n) {
|
|
4991
|
-
var t =
|
|
4992
|
-
typeof e == "function" && (n.__c = void 0, e()),
|
|
4991
|
+
var t = Tt, e = n.__c;
|
|
4992
|
+
typeof e == "function" && (n.__c = void 0, e()), Tt = t;
|
|
4993
4993
|
}
|
|
4994
4994
|
function bc(n) {
|
|
4995
|
-
var t =
|
|
4996
|
-
n.__c = n.__(),
|
|
4995
|
+
var t = Tt;
|
|
4996
|
+
n.__c = n.__(), Tt = t;
|
|
4997
4997
|
}
|
|
4998
4998
|
function em(n, t) {
|
|
4999
4999
|
return !n || n.length !== t.length || t.some(function(e, i) {
|
|
@@ -5005,8 +5005,8 @@ function Bu(n, t) {
|
|
|
5005
5005
|
}
|
|
5006
5006
|
function re() {
|
|
5007
5007
|
return function(n) {
|
|
5008
|
-
var t =
|
|
5009
|
-
return e.c = n, t ? (e.__ == null && (e.__ = !0, t.sub(
|
|
5008
|
+
var t = Tt.context[n.__c], e = Ea(lo++, 9);
|
|
5009
|
+
return e.c = n, t ? (e.__ == null && (e.__ = !0, t.sub(Tt)), t.props.value) : n.__;
|
|
5010
5010
|
}(rm);
|
|
5011
5011
|
}
|
|
5012
5012
|
var ev = { search: { placeholder: "Type a keyword..." }, sort: { sortAsc: "Sort column ascending", sortDesc: "Sort column descending" }, pagination: { previous: "Previous", next: "Next", navigate: function(n, t) {
|
|
@@ -5097,7 +5097,7 @@ var Au = /* @__PURE__ */ function(n) {
|
|
|
5097
5097
|
}, e._process = function(i) {
|
|
5098
5098
|
var r = this.props.page;
|
|
5099
5099
|
return new Ja(i.rows.slice(r * this.props.limit, (r + 1) * this.props.limit));
|
|
5100
|
-
},
|
|
5100
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
5101
5101
|
return Ut.Limit;
|
|
5102
5102
|
} }]), t;
|
|
5103
5103
|
}(fn), Qu = /* @__PURE__ */ function(n) {
|
|
@@ -5107,7 +5107,7 @@ var Au = /* @__PURE__ */ function(n) {
|
|
|
5107
5107
|
return Dt(t, n), t.prototype._process = function(e) {
|
|
5108
5108
|
var i = {};
|
|
5109
5109
|
return this.props.url && (i.url = this.props.url(e.url, this.props.page, this.props.limit)), this.props.body && (i.body = this.props.body(e.body, this.props.page, this.props.limit)), ct({}, e, i);
|
|
5110
|
-
},
|
|
5110
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
5111
5111
|
return Ut.ServerLimit;
|
|
5112
5112
|
} }]), t;
|
|
5113
5113
|
}(fn);
|
|
@@ -5248,7 +5248,7 @@ var Xr = /* @__PURE__ */ function(n) {
|
|
|
5248
5248
|
return x[w.getAttribute("data-column-id")].width = w.clientWidth, x;
|
|
5249
5249
|
}, y);
|
|
5250
5250
|
}(s.current));
|
|
5251
|
-
for (var d, u =
|
|
5251
|
+
for (var d, u = ee(t.tabularFormat(this.columns).reduce(function(f, p) {
|
|
5252
5252
|
return f.concat(p);
|
|
5253
5253
|
}, [])); !(d = u()).done; ) {
|
|
5254
5254
|
var h = d.value;
|
|
@@ -5256,27 +5256,27 @@ var Xr = /* @__PURE__ */ function(n) {
|
|
|
5256
5256
|
}
|
|
5257
5257
|
return r.current && a && vs(null, s.current), this;
|
|
5258
5258
|
}, e.setSort = function(i, r) {
|
|
5259
|
-
for (var s, o =
|
|
5259
|
+
for (var s, o = ee(r || this.columns || []); !(s = o()).done; ) {
|
|
5260
5260
|
var a = s.value;
|
|
5261
5261
|
a.columns && a.columns.length > 0 ? a.sort = void 0 : a.sort === void 0 && i ? a.sort = {} : a.sort ? typeof a.sort == "object" && (a.sort = ct({}, a.sort)) : a.sort = void 0, a.columns && this.setSort(i, a.columns);
|
|
5262
5262
|
}
|
|
5263
5263
|
}, e.setResizable = function(i, r) {
|
|
5264
|
-
for (var s, o =
|
|
5264
|
+
for (var s, o = ee(r || this.columns || []); !(s = o()).done; ) {
|
|
5265
5265
|
var a = s.value;
|
|
5266
5266
|
a.resizable === void 0 && (a.resizable = i), a.columns && this.setResizable(i, a.columns);
|
|
5267
5267
|
}
|
|
5268
5268
|
}, e.setID = function(i) {
|
|
5269
|
-
for (var r, s =
|
|
5269
|
+
for (var r, s = ee(i || this.columns || []); !(r = s()).done; ) {
|
|
5270
5270
|
var o = r.value;
|
|
5271
5271
|
o.id || typeof o.name != "string" || (o.id = av(o.name)), o.id || Ge.error('Could not find a valid ID for one of the columns. Make sure a valid "id" is set for all columns.'), o.columns && this.setID(o.columns);
|
|
5272
5272
|
}
|
|
5273
5273
|
}, e.populatePlugins = function(i, r) {
|
|
5274
|
-
for (var s, o =
|
|
5274
|
+
for (var s, o = ee(r); !(s = o()).done; ) {
|
|
5275
5275
|
var a = s.value;
|
|
5276
5276
|
a.plugin !== void 0 && i.add(ct({ id: a.id }, a.plugin, { position: Ji.Cell }));
|
|
5277
5277
|
}
|
|
5278
5278
|
}, t.fromColumns = function(i) {
|
|
5279
|
-
for (var r, s = new t(), o =
|
|
5279
|
+
for (var r, s = new t(), o = ee(i); !(r = o()).done; ) {
|
|
5280
5280
|
var a = r.value;
|
|
5281
5281
|
if (typeof a == "string" || Hp(a)) s.columns.push({ name: a });
|
|
5282
5282
|
else if (typeof a == "object") {
|
|
@@ -5291,7 +5291,7 @@ var Xr = /* @__PURE__ */ function(n) {
|
|
|
5291
5291
|
return { name: s };
|
|
5292
5292
|
})), r.columns.length ? (r.setID(), r.setSort(i.sort), r.setResizable(i.resizable), r.populatePlugins(i.plugin, r.columns), r) : null;
|
|
5293
5293
|
}, t.fromHTMLTable = function(i) {
|
|
5294
|
-
for (var r, s = new t(), o =
|
|
5294
|
+
for (var r, s = new t(), o = ee(i.querySelector("thead").querySelectorAll("th")); !(r = o()).done; ) {
|
|
5295
5295
|
var a = r.value;
|
|
5296
5296
|
s.columns.push({ name: a.innerHTML, width: a.width });
|
|
5297
5297
|
}
|
|
@@ -5300,7 +5300,7 @@ var Xr = /* @__PURE__ */ function(n) {
|
|
|
5300
5300
|
var r = [], s = i || [], o = [];
|
|
5301
5301
|
if (s && s.length) {
|
|
5302
5302
|
r.push(s);
|
|
5303
|
-
for (var a, l =
|
|
5303
|
+
for (var a, l = ee(s); !(a = l()).done; ) {
|
|
5304
5304
|
var c = a.value;
|
|
5305
5305
|
c.columns && c.columns.length && (o = o.concat(c.columns));
|
|
5306
5306
|
}
|
|
@@ -5309,14 +5309,14 @@ var Xr = /* @__PURE__ */ function(n) {
|
|
|
5309
5309
|
return r;
|
|
5310
5310
|
}, t.leafColumns = function(i) {
|
|
5311
5311
|
var r = [], s = i || [];
|
|
5312
|
-
if (s && s.length) for (var o, a =
|
|
5312
|
+
if (s && s.length) for (var o, a = ee(s); !(o = a()).done; ) {
|
|
5313
5313
|
var l = o.value;
|
|
5314
5314
|
l.columns && l.columns.length !== 0 || r.push(l), l.columns && (r = r.concat(this.leafColumns(l.columns)));
|
|
5315
5315
|
}
|
|
5316
5316
|
return r;
|
|
5317
5317
|
}, t.maximumDepth = function(i) {
|
|
5318
5318
|
return this.tabularFormat([i]).length - 1;
|
|
5319
|
-
},
|
|
5319
|
+
}, qt(t, [{ key: "columns", get: function() {
|
|
5320
5320
|
return this._columns;
|
|
5321
5321
|
}, set: function(i) {
|
|
5322
5322
|
this._columns = i;
|
|
@@ -5368,8 +5368,8 @@ var Xr = /* @__PURE__ */ function(n) {
|
|
|
5368
5368
|
var e = null;
|
|
5369
5369
|
return t.data && (e = new qu(t.data)), t.from && (e = new qu(this.tableElementToArray(t.from)), t.from.style.display = "none"), t.server && (e = new im(t.server)), e || Ge.error("Could not determine the storage type", !0), e;
|
|
5370
5370
|
}, n.tableElementToArray = function(t) {
|
|
5371
|
-
for (var e, i, r = [], s =
|
|
5372
|
-
for (var o, a = [], l =
|
|
5371
|
+
for (var e, i, r = [], s = ee(t.querySelector("tbody").querySelectorAll("tr")); !(e = s()).done; ) {
|
|
5372
|
+
for (var o, a = [], l = ee(e.value.querySelectorAll("td")); !(o = l()).done; ) {
|
|
5373
5373
|
var c = o.value;
|
|
5374
5374
|
c.childNodes.length === 1 && c.childNodes[0].nodeType === Node.TEXT_NODE ? a.push((i = c.innerHTML, new DOMParser().parseFromString(i, "text/html").documentElement.textContent)) : a.push($p(c.innerHTML));
|
|
5375
5375
|
}
|
|
@@ -5378,13 +5378,13 @@ var Xr = /* @__PURE__ */ function(n) {
|
|
|
5378
5378
|
return r;
|
|
5379
5379
|
}, n;
|
|
5380
5380
|
}(), th = typeof Symbol < "u" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
|
|
5381
|
-
function
|
|
5381
|
+
function ne(n, t, e) {
|
|
5382
5382
|
if (!n.s) {
|
|
5383
5383
|
if (e instanceof gr) {
|
|
5384
|
-
if (!e.s) return void (e.o =
|
|
5384
|
+
if (!e.s) return void (e.o = ne.bind(null, n, t));
|
|
5385
5385
|
1 & t && (t = e.s), e = e.v;
|
|
5386
5386
|
}
|
|
5387
|
-
if (e && e.then) return void e.then(
|
|
5387
|
+
if (e && e.then) return void e.then(ne.bind(null, n, t), ne.bind(null, n, 2));
|
|
5388
5388
|
n.s = t, n.v = e;
|
|
5389
5389
|
var i = n.o;
|
|
5390
5390
|
i && i(n);
|
|
@@ -5399,9 +5399,9 @@ var gr = /* @__PURE__ */ function() {
|
|
|
5399
5399
|
var s = 1 & r ? t : e;
|
|
5400
5400
|
if (s) {
|
|
5401
5401
|
try {
|
|
5402
|
-
|
|
5402
|
+
ne(i, 1, s(this.v));
|
|
5403
5403
|
} catch (o) {
|
|
5404
|
-
|
|
5404
|
+
ne(i, 2, o);
|
|
5405
5405
|
}
|
|
5406
5406
|
return i;
|
|
5407
5407
|
}
|
|
@@ -5410,9 +5410,9 @@ var gr = /* @__PURE__ */ function() {
|
|
|
5410
5410
|
return this.o = function(o) {
|
|
5411
5411
|
try {
|
|
5412
5412
|
var a = o.v;
|
|
5413
|
-
1 & o.s ?
|
|
5413
|
+
1 & o.s ? ne(i, 1, t ? t(a) : a) : e ? ne(i, 1, e(a)) : ne(i, 2, a);
|
|
5414
5414
|
} catch (l) {
|
|
5415
|
-
|
|
5415
|
+
ne(i, 2, l);
|
|
5416
5416
|
}
|
|
5417
5417
|
}, i;
|
|
5418
5418
|
}, n;
|
|
@@ -5482,12 +5482,12 @@ var cv = /* @__PURE__ */ function(n) {
|
|
|
5482
5482
|
if (function G(_) {
|
|
5483
5483
|
try {
|
|
5484
5484
|
for (; !(g = w.next()).done; ) if ((_ = p(g.value)) && _.then) {
|
|
5485
|
-
if (!eh(_)) return void _.then(G, x || (x =
|
|
5485
|
+
if (!eh(_)) return void _.then(G, x || (x = ne.bind(null, y = new gr(), 2)));
|
|
5486
5486
|
_ = _.v;
|
|
5487
5487
|
}
|
|
5488
|
-
y ?
|
|
5488
|
+
y ? ne(y, 1, _) : y = _;
|
|
5489
5489
|
} catch (V) {
|
|
5490
|
-
|
|
5490
|
+
ne(y || (y = new gr()), 2, V);
|
|
5491
5491
|
}
|
|
5492
5492
|
}(), w.return) {
|
|
5493
5493
|
var k = function(G) {
|
|
@@ -5511,12 +5511,12 @@ var cv = /* @__PURE__ */ function(n) {
|
|
|
5511
5511
|
return function ot(q) {
|
|
5512
5512
|
try {
|
|
5513
5513
|
for (; ++H < G.length; ) if ((q = _(H)) && q.then) {
|
|
5514
|
-
if (!eh(q)) return void q.then(ot, K || (K =
|
|
5514
|
+
if (!eh(q)) return void q.then(ot, K || (K = ne.bind(null, Y = new gr(), 2)));
|
|
5515
5515
|
q = q.v;
|
|
5516
5516
|
}
|
|
5517
|
-
Y ?
|
|
5517
|
+
Y ? ne(Y, 1, q) : Y = q;
|
|
5518
5518
|
} catch (rt) {
|
|
5519
|
-
|
|
5519
|
+
ne(Y || (Y = new gr()), 2, rt);
|
|
5520
5520
|
}
|
|
5521
5521
|
}(), Y;
|
|
5522
5522
|
}(X, function(G) {
|
|
@@ -5554,8 +5554,8 @@ var cv = /* @__PURE__ */ function(n) {
|
|
|
5554
5554
|
this.setLastProcessorIndex(i), this.emit("propsUpdated"), this.emit("updated", i);
|
|
5555
5555
|
}, e.afterRegistered = function(i) {
|
|
5556
5556
|
this.setLastProcessorIndex(i), this.emit("afterRegister"), this.emit("updated", i);
|
|
5557
|
-
},
|
|
5558
|
-
for (var i, r = [], s =
|
|
5557
|
+
}, qt(t, [{ key: "steps", get: function() {
|
|
5558
|
+
for (var i, r = [], s = ee(this.getSortedProcessorTypes()); !(i = s()).done; ) {
|
|
5559
5559
|
var o = this._steps.get(i.value);
|
|
5560
5560
|
o && o.length && (r = r.concat(o));
|
|
5561
5561
|
}
|
|
@@ -5573,7 +5573,7 @@ var cv = /* @__PURE__ */ function(n) {
|
|
|
5573
5573
|
} catch (i) {
|
|
5574
5574
|
return Promise.reject(i);
|
|
5575
5575
|
}
|
|
5576
|
-
},
|
|
5576
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
5577
5577
|
return Ut.Extractor;
|
|
5578
5578
|
} }]), t;
|
|
5579
5579
|
}(fn), uv = /* @__PURE__ */ function(n) {
|
|
@@ -5583,7 +5583,7 @@ var cv = /* @__PURE__ */ function(n) {
|
|
|
5583
5583
|
return Dt(t, n), t.prototype._process = function(e) {
|
|
5584
5584
|
var i = Ja.fromArray(e.data);
|
|
5585
5585
|
return i.length = e.total, i;
|
|
5586
|
-
},
|
|
5586
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
5587
5587
|
return Ut.Transformer;
|
|
5588
5588
|
} }]), t;
|
|
5589
5589
|
}(fn), hv = /* @__PURE__ */ function(n) {
|
|
@@ -5597,7 +5597,7 @@ var cv = /* @__PURE__ */ function(n) {
|
|
|
5597
5597
|
var r;
|
|
5598
5598
|
return ct({}, e, ((r = {})[i[0]] = i[1], r));
|
|
5599
5599
|
}, {});
|
|
5600
|
-
},
|
|
5600
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
5601
5601
|
return Ut.Initiator;
|
|
5602
5602
|
} }]), t;
|
|
5603
5603
|
}(fn), fv = /* @__PURE__ */ function(n) {
|
|
@@ -5623,7 +5623,7 @@ var cv = /* @__PURE__ */ function(n) {
|
|
|
5623
5623
|
});
|
|
5624
5624
|
}, e._process = function(i) {
|
|
5625
5625
|
return { data: this.castData(i.data), total: i.total };
|
|
5626
|
-
},
|
|
5626
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
5627
5627
|
return Ut.Transformer;
|
|
5628
5628
|
} }]), t;
|
|
5629
5629
|
}(fn), pv = /* @__PURE__ */ function() {
|
|
@@ -5649,7 +5649,7 @@ var cv = /* @__PURE__ */ function(n) {
|
|
|
5649
5649
|
} finally {
|
|
5650
5650
|
t.isDispatching = !1;
|
|
5651
5651
|
}
|
|
5652
|
-
for (var r, s =
|
|
5652
|
+
for (var r, s = ee(t.listeners); !(r = s()).done; ) (0, r.value)(t.state, i);
|
|
5653
5653
|
return t.state;
|
|
5654
5654
|
}, this.subscribe = function(e) {
|
|
5655
5655
|
if (typeof e != "function") throw new Error("Listener is not a function");
|
|
@@ -5742,14 +5742,14 @@ var yv = /* @__PURE__ */ function(n) {
|
|
|
5742
5742
|
Dt(t, n);
|
|
5743
5743
|
var e = t.prototype;
|
|
5744
5744
|
return e.validateProps = function() {
|
|
5745
|
-
for (var i, r =
|
|
5745
|
+
for (var i, r = ee(this.props.columns); !(i = r()).done; ) {
|
|
5746
5746
|
var s = i.value;
|
|
5747
5747
|
s.direction === void 0 && (s.direction = 1), s.direction !== 1 && s.direction !== -1 && Ge.error("Invalid sort direction " + s.direction);
|
|
5748
5748
|
}
|
|
5749
5749
|
}, e.compare = function(i, r) {
|
|
5750
5750
|
return i > r ? 1 : i < r ? -1 : 0;
|
|
5751
5751
|
}, e.compareWrapper = function(i, r) {
|
|
5752
|
-
for (var s, o = 0, a =
|
|
5752
|
+
for (var s, o = 0, a = ee(this.props.columns); !(s = a()).done; ) {
|
|
5753
5753
|
var l = s.value;
|
|
5754
5754
|
if (o !== 0) break;
|
|
5755
5755
|
var c = i.cells[l.index].data, d = r.cells[l.index].data;
|
|
@@ -5761,7 +5761,7 @@ var yv = /* @__PURE__ */ function(n) {
|
|
|
5761
5761
|
r.sort(this.compareWrapper.bind(this));
|
|
5762
5762
|
var s = new Ja(r);
|
|
5763
5763
|
return s.length = i.length, s;
|
|
5764
|
-
},
|
|
5764
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
5765
5765
|
return Ut.Sort;
|
|
5766
5766
|
} }]), t;
|
|
5767
5767
|
}(fn), nh = function(n, t, e, i) {
|
|
@@ -5795,7 +5795,7 @@ var yv = /* @__PURE__ */ function(n) {
|
|
|
5795
5795
|
return Dt(t, n), t.prototype._process = function(e) {
|
|
5796
5796
|
var i = {};
|
|
5797
5797
|
return this.props.url && (i.url = this.props.url(e.url, this.props.columns)), this.props.body && (i.body = this.props.body(e.body, this.props.columns)), ct({}, e, i);
|
|
5798
|
-
},
|
|
5798
|
+
}, qt(t, [{ key: "type", get: function() {
|
|
5799
5799
|
return Ut.ServerSort;
|
|
5800
5800
|
} }]), t;
|
|
5801
5801
|
}(fn);
|
|
@@ -6007,7 +6007,7 @@ const lm = {
|
|
|
6007
6007
|
}
|
|
6008
6008
|
}, nr = ({ data: n, columns: t, pageSize: e }) => {
|
|
6009
6009
|
const i = typeof e == "number" ? { limit: e } : e, r = Mt(null);
|
|
6010
|
-
return
|
|
6010
|
+
return Qt(() => {
|
|
6011
6011
|
if (r.current === null)
|
|
6012
6012
|
return;
|
|
6013
6013
|
const s = new Gv({
|
|
@@ -6020,7 +6020,7 @@ const lm = {
|
|
|
6020
6020
|
s.destroy();
|
|
6021
6021
|
};
|
|
6022
6022
|
}), /* @__PURE__ */ m("div", { ref: r });
|
|
6023
|
-
}, Rv = /^((?<segment>[A-
|
|
6023
|
+
}, Rv = /^((?<segment>[A-Z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Z])?(?<position>\d+)(?<substitutionValue>[A-Z.])?$/i;
|
|
6024
6024
|
class Es {
|
|
6025
6025
|
constructor(t, e, i, r) {
|
|
6026
6026
|
this.segment = t, this.valueAtReference = e, this.substitutionValue = i, this.position = r, this.type = "substitution";
|
|
@@ -6043,7 +6043,7 @@ class Es {
|
|
|
6043
6043
|
);
|
|
6044
6044
|
}
|
|
6045
6045
|
}
|
|
6046
|
-
const Lv = /^((?<segment>[A-
|
|
6046
|
+
const Lv = /^((?<segment>[A-Z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Z])?(?<position>\d+)(-)$/i;
|
|
6047
6047
|
class Ei {
|
|
6048
6048
|
constructor(t, e, i) {
|
|
6049
6049
|
this.segment = t, this.valueAtReference = e, this.position = i, this.type = "deletion";
|
|
@@ -6065,7 +6065,7 @@ class Ei {
|
|
|
6065
6065
|
);
|
|
6066
6066
|
}
|
|
6067
6067
|
}
|
|
6068
|
-
const Yv = /^ins_((?<segment>[A-
|
|
6068
|
+
const Yv = /^ins_((?<segment>[A-Z0-9_-]+)(?=:):)?(?<position>\d+):(?<insertedSymbols>(([A-Z?]|(\.\*))+))$/i;
|
|
6069
6069
|
class Bs {
|
|
6070
6070
|
constructor(t, e, i) {
|
|
6071
6071
|
this.segment = t, this.position = e, this.insertedSymbols = i, this.type = "insertion", this.code = `ins_${this.segment ? `${this.segment}:` : ""}${this.position}:${this.insertedSymbols}`;
|
|
@@ -6138,7 +6138,7 @@ const gc = {
|
|
|
6138
6138
|
formatter: (o) => Re(o)
|
|
6139
6139
|
}))
|
|
6140
6140
|
}
|
|
6141
|
-
], r =
|
|
6141
|
+
], r = zp(n, t).map((s) => Object.values(s));
|
|
6142
6142
|
return /* @__PURE__ */ m(nr, { data: r, columns: i, pageSize: e });
|
|
6143
6143
|
};
|
|
6144
6144
|
/*!
|
|
@@ -6164,7 +6164,7 @@ function rh(n) {
|
|
|
6164
6164
|
return jn(uo(n * 100), 0, 100);
|
|
6165
6165
|
}
|
|
6166
6166
|
const _e = { 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15 }, yc = [..."0123456789ABCDEF"], Mv = (n) => yc[n & 15], Cv = (n) => yc[(n & 240) >> 4] + yc[n & 15], Wo = (n) => (n & 240) >> 4 === (n & 15), Nv = (n) => Wo(n.r) && Wo(n.g) && Wo(n.b) && Wo(n.a);
|
|
6167
|
-
function
|
|
6167
|
+
function Tv(n) {
|
|
6168
6168
|
var t = n.length, e;
|
|
6169
6169
|
return n[0] === "#" && (t === 4 || t === 5 ? e = {
|
|
6170
6170
|
r: 255 & _e[n[1]] * 17,
|
|
@@ -6178,10 +6178,10 @@ function zv(n) {
|
|
|
6178
6178
|
a: t === 9 ? _e[n[7]] << 4 | _e[n[8]] : 255
|
|
6179
6179
|
})), e;
|
|
6180
6180
|
}
|
|
6181
|
-
const
|
|
6181
|
+
const zv = (n, t) => n < 255 ? t(n) : "";
|
|
6182
6182
|
function Fv(n) {
|
|
6183
6183
|
var t = Nv(n) ? Mv : Cv;
|
|
6184
|
-
return n ? "#" + t(n.r) + t(n.g) + t(n.b) +
|
|
6184
|
+
return n ? "#" + t(n.r) + t(n.g) + t(n.b) + zv(n.a, t) : void 0;
|
|
6185
6185
|
}
|
|
6186
6186
|
const Hv = /^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;
|
|
6187
6187
|
function hm(n, t, e) {
|
|
@@ -6497,7 +6497,7 @@ class Us {
|
|
|
6497
6497
|
return t;
|
|
6498
6498
|
const e = typeof t;
|
|
6499
6499
|
let i;
|
|
6500
|
-
e === "object" ? i = ah(t) : e === "string" && (i =
|
|
6500
|
+
e === "object" ? i = ah(t) : e === "string" && (i = Tv(t) || Av(t) || ex(t)), this._rgb = i, this._valid = !!i;
|
|
6501
6501
|
}
|
|
6502
6502
|
get valid() {
|
|
6503
6503
|
return this._valid;
|
|
@@ -6720,7 +6720,7 @@ const As = (n) => typeof n < "u", li = (n) => typeof n == "function", ch = (n, t
|
|
|
6720
6720
|
function lx(n) {
|
|
6721
6721
|
return n.type === "mouseup" || n.type === "click" || n.type === "contextmenu";
|
|
6722
6722
|
}
|
|
6723
|
-
const _t = Math.PI, Xt = 2 * _t, cx = Xt + _t, wa = Number.POSITIVE_INFINITY, dx = _t / 180,
|
|
6723
|
+
const _t = Math.PI, Xt = 2 * _t, cx = Xt + _t, wa = Number.POSITIVE_INFINITY, dx = _t / 180, zt = _t / 2, Xi = _t / 4, dh = _t * 2 / 3, Jn = Math.log10, rn = Math.sign;
|
|
6724
6724
|
function Zs(n, t, e) {
|
|
6725
6725
|
return Math.abs(n - t) < e;
|
|
6726
6726
|
}
|
|
@@ -6737,7 +6737,7 @@ function ux(n) {
|
|
|
6737
6737
|
n % i === 0 && (t.push(i), t.push(n / i));
|
|
6738
6738
|
return e === (e | 0) && t.push(e), t.sort((r, s) => r - s).pop(), t;
|
|
6739
6739
|
}
|
|
6740
|
-
function
|
|
6740
|
+
function Tr(n) {
|
|
6741
6741
|
return !isNaN(parseFloat(n)) && isFinite(n);
|
|
6742
6742
|
}
|
|
6743
6743
|
function hx(n, t) {
|
|
@@ -6930,8 +6930,8 @@ const Ro = (n) => n === 0 || n === 1, ph = (n, t, e) => -(Math.pow(2, 10 * (n -=
|
|
|
6930
6930
|
easeInQuint: (n) => n * n * n * n * n,
|
|
6931
6931
|
easeOutQuint: (n) => (n -= 1) * n * n * n * n + 1,
|
|
6932
6932
|
easeInOutQuint: (n) => (n /= 0.5) < 1 ? 0.5 * n * n * n * n * n : 0.5 * ((n -= 2) * n * n * n * n + 2),
|
|
6933
|
-
easeInSine: (n) => -Math.cos(n *
|
|
6934
|
-
easeOutSine: (n) => Math.sin(n *
|
|
6933
|
+
easeInSine: (n) => -Math.cos(n * zt) + 1,
|
|
6934
|
+
easeOutSine: (n) => Math.sin(n * zt),
|
|
6935
6935
|
easeInOutSine: (n) => -0.5 * (Math.cos(_t * n) - 1),
|
|
6936
6936
|
easeInExpo: (n) => n === 0 ? 0 : Math.pow(2, 10 * (n - 1)),
|
|
6937
6937
|
easeOutExpo: (n) => n === 1 ? 1 : -Math.pow(2, -10 * n) + 1,
|
|
@@ -7311,7 +7311,7 @@ function Wm(n, t, e, i, r) {
|
|
|
7311
7311
|
d = r ? r / 2 : b, n.moveTo(e + Math.sin(g) * d, i - Math.cos(g) * b), g += dh, n.lineTo(e + Math.sin(g) * d, i - Math.cos(g) * b), g += dh, n.lineTo(e + Math.sin(g) * d, i - Math.cos(g) * b), n.closePath();
|
|
7312
7312
|
break;
|
|
7313
7313
|
case "rectRounded":
|
|
7314
|
-
c = b * 0.516, l = b - c, o = Math.cos(g + Xi) * l, u = Math.cos(g + Xi) * (r ? r / 2 - c : l), a = Math.sin(g + Xi) * l, h = Math.sin(g + Xi) * (r ? r / 2 - c : l), n.arc(e - u, i - a, c, g - _t, g -
|
|
7314
|
+
c = b * 0.516, l = b - c, o = Math.cos(g + Xi) * l, u = Math.cos(g + Xi) * (r ? r / 2 - c : l), a = Math.sin(g + Xi) * l, h = Math.sin(g + Xi) * (r ? r / 2 - c : l), n.arc(e - u, i - a, c, g - _t, g - zt), n.arc(e + h, i - o, c, g - zt, g), n.arc(e + u, i + a, c, g, g + zt), n.arc(e - h, i + o, c, g + zt, g + _t), n.closePath();
|
|
7315
7315
|
break;
|
|
7316
7316
|
case "rect":
|
|
7317
7317
|
if (!p) {
|
|
@@ -7390,10 +7390,10 @@ function Ui(n, t, e, i, r, s = {}) {
|
|
|
7390
7390
|
}
|
|
7391
7391
|
function $s(n, t) {
|
|
7392
7392
|
const { x: e, y: i, w: r, h: s, radius: o } = t;
|
|
7393
|
-
n.arc(e + o.topLeft, i + o.topLeft, o.topLeft, 1.5 * _t, _t, !0), n.lineTo(e, i + s - o.bottomLeft), n.arc(e + o.bottomLeft, i + s - o.bottomLeft, o.bottomLeft, _t,
|
|
7393
|
+
n.arc(e + o.topLeft, i + o.topLeft, o.topLeft, 1.5 * _t, _t, !0), n.lineTo(e, i + s - o.bottomLeft), n.arc(e + o.bottomLeft, i + s - o.bottomLeft, o.bottomLeft, _t, zt, !0), n.lineTo(e + r - o.bottomRight, i + s), n.arc(e + r - o.bottomRight, i + s - o.bottomRight, o.bottomRight, zt, 0, !0), n.lineTo(e + r, i + o.topRight), n.arc(e + r - o.topRight, i + o.topRight, o.topRight, 0, -zt, !0), n.lineTo(e + o.topLeft, i);
|
|
7394
7394
|
}
|
|
7395
7395
|
const Cx = /^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/, Nx = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;
|
|
7396
|
-
function
|
|
7396
|
+
function Tx(n, t) {
|
|
7397
7397
|
const e = ("" + n).match(Cx);
|
|
7398
7398
|
if (!e || e[1] === "normal")
|
|
7399
7399
|
return t * 1.2;
|
|
@@ -7406,11 +7406,11 @@ function zx(n, t) {
|
|
|
7406
7406
|
}
|
|
7407
7407
|
return t * n;
|
|
7408
7408
|
}
|
|
7409
|
-
const
|
|
7409
|
+
const zx = (n) => +n || 0;
|
|
7410
7410
|
function vd(n, t) {
|
|
7411
7411
|
const e = {}, i = st(t), r = i ? Object.keys(t) : t, s = st(n) ? i ? (o) => A(n[o], n[t[o]]) : (o) => n[o] : () => n;
|
|
7412
7412
|
for (const o of r)
|
|
7413
|
-
e[o] =
|
|
7413
|
+
e[o] = zx(s(o));
|
|
7414
7414
|
return e;
|
|
7415
7415
|
}
|
|
7416
7416
|
function Sm(n) {
|
|
@@ -7429,7 +7429,7 @@ function Ni(n) {
|
|
|
7429
7429
|
"bottomRight"
|
|
7430
7430
|
]);
|
|
7431
7431
|
}
|
|
7432
|
-
function
|
|
7432
|
+
function $t(n) {
|
|
7433
7433
|
const t = Sm(n);
|
|
7434
7434
|
return t.width = t.left + t.right, t.height = t.top + t.bottom, t;
|
|
7435
7435
|
}
|
|
@@ -7441,7 +7441,7 @@ function Pt(n, t) {
|
|
|
7441
7441
|
i && !("" + i).match(Nx) && (console.warn('Invalid font style specified: "' + i + '"'), i = void 0);
|
|
7442
7442
|
const r = {
|
|
7443
7443
|
family: A(n.family, t.family),
|
|
7444
|
-
lineHeight:
|
|
7444
|
+
lineHeight: Tx(A(n.lineHeight, t.lineHeight), e),
|
|
7445
7445
|
size: e,
|
|
7446
7446
|
style: i,
|
|
7447
7447
|
weight: A(n.weight, t.weight),
|
|
@@ -7529,7 +7529,7 @@ function xd(n, t = [
|
|
|
7529
7529
|
}
|
|
7530
7530
|
});
|
|
7531
7531
|
}
|
|
7532
|
-
function
|
|
7532
|
+
function zr(n, t, e, i) {
|
|
7533
7533
|
const r = {
|
|
7534
7534
|
_cacheable: !1,
|
|
7535
7535
|
_proxy: n,
|
|
@@ -7537,8 +7537,8 @@ function Tr(n, t, e, i) {
|
|
|
7537
7537
|
_subProxy: e,
|
|
7538
7538
|
_stack: /* @__PURE__ */ new Set(),
|
|
7539
7539
|
_descriptors: Gm(n, i),
|
|
7540
|
-
setContext: (s) =>
|
|
7541
|
-
override: (s) =>
|
|
7540
|
+
setContext: (s) => zr(n, s, e, i),
|
|
7541
|
+
override: (s) => zr(n.override(s), t, e, i)
|
|
7542
7542
|
};
|
|
7543
7543
|
return new Proxy(r, {
|
|
7544
7544
|
/**
|
|
@@ -7612,7 +7612,7 @@ function Rm(n, t, e) {
|
|
|
7612
7612
|
function Px(n, t, e) {
|
|
7613
7613
|
const { _proxy: i, _context: r, _subProxy: s, _descriptors: o } = n;
|
|
7614
7614
|
let a = i[t];
|
|
7615
|
-
return li(a) && o.isScriptable(t) && (a = Dx(t, a, n, e)), Wt(a) && a.length && (a = Ox(t, a, n, o.isIndexable)), Zd(t, a) && (a =
|
|
7615
|
+
return li(a) && o.isScriptable(t) && (a = Dx(t, a, n, e)), Wt(a) && a.length && (a = Ox(t, a, n, o.isIndexable)), Zd(t, a) && (a = zr(a, r, s && s[t], o)), a;
|
|
7616
7616
|
}
|
|
7617
7617
|
function Dx(n, t, e, i) {
|
|
7618
7618
|
const { _proxy: r, _context: s, _subProxy: o, _stack: a } = e;
|
|
@@ -7631,7 +7631,7 @@ function Ox(n, t, e, i) {
|
|
|
7631
7631
|
t = [];
|
|
7632
7632
|
for (const d of l) {
|
|
7633
7633
|
const u = wd(c, r, n, d);
|
|
7634
|
-
t.push(
|
|
7634
|
+
t.push(zr(u, s, o && o[n], a));
|
|
7635
7635
|
}
|
|
7636
7636
|
}
|
|
7637
7637
|
return t;
|
|
@@ -7802,7 +7802,7 @@ const i1 = [
|
|
|
7802
7802
|
"bottom",
|
|
7803
7803
|
"left"
|
|
7804
7804
|
];
|
|
7805
|
-
function
|
|
7805
|
+
function Ti(n, t, e) {
|
|
7806
7806
|
const i = {};
|
|
7807
7807
|
e = e ? "-" + e : "";
|
|
7808
7808
|
for (let r = 0; r < 4; r++) {
|
|
@@ -7830,7 +7830,7 @@ function s1(n, t) {
|
|
|
7830
7830
|
function Gi(n, t) {
|
|
7831
7831
|
if ("native" in n)
|
|
7832
7832
|
return n;
|
|
7833
|
-
const { canvas: e, currentDevicePixelRatio: i } = t, r = qa(e), s = r.boxSizing === "border-box", o =
|
|
7833
|
+
const { canvas: e, currentDevicePixelRatio: i } = t, r = qa(e), s = r.boxSizing === "border-box", o = Ti(r, "padding"), a = Ti(r, "border", "width"), { x: l, y: c, box: d } = s1(n, e), u = o.left + (d && a.left), h = o.top + (d && a.top);
|
|
7834
7834
|
let { width: f, height: p } = t;
|
|
7835
7835
|
return s && (f -= o.width + a.width, p -= o.height + a.height), {
|
|
7836
7836
|
x: Math.round((l - u) / f * e.width / i),
|
|
@@ -7844,7 +7844,7 @@ function o1(n, t, e) {
|
|
|
7844
7844
|
if (!s)
|
|
7845
7845
|
t = n.clientWidth, e = n.clientHeight;
|
|
7846
7846
|
else {
|
|
7847
|
-
const o = s.getBoundingClientRect(), a = qa(s), l =
|
|
7847
|
+
const o = s.getBoundingClientRect(), a = qa(s), l = Ti(a, "border", "width"), c = Ti(a, "padding");
|
|
7848
7848
|
t = o.width - c.width - l.width, e = o.height - c.height - l.height, i = _a(a.maxWidth, s, "clientWidth"), r = _a(a.maxHeight, s, "clientHeight");
|
|
7849
7849
|
}
|
|
7850
7850
|
}
|
|
@@ -7857,10 +7857,10 @@ function o1(n, t, e) {
|
|
|
7857
7857
|
}
|
|
7858
7858
|
const Yo = (n) => Math.round(n * 10) / 10;
|
|
7859
7859
|
function a1(n, t, e, i) {
|
|
7860
|
-
const r = qa(n), s =
|
|
7860
|
+
const r = qa(n), s = Ti(r, "margin"), o = _a(r.maxWidth, n, "clientWidth") || wa, a = _a(r.maxHeight, n, "clientHeight") || wa, l = o1(n, t, e);
|
|
7861
7861
|
let { width: c, height: d } = l;
|
|
7862
7862
|
if (r.boxSizing === "content-box") {
|
|
7863
|
-
const h =
|
|
7863
|
+
const h = Ti(r, "border", "width"), f = Ti(r, "padding");
|
|
7864
7864
|
c -= f.width + h.width, d -= f.height + h.height;
|
|
7865
7865
|
}
|
|
7866
7866
|
return c = Math.max(0, c - s.width), d = Math.max(0, i ? c / i : d - s.height), c = Yo(Math.min(c, o, l.maxWidth)), d = Yo(Math.min(d, a, l.maxHeight)), c && !d && (d = Yo(c / 2)), (t !== void 0 || e !== void 0) && i && l.height && d > l.height && (d = l.height, c = Yo(Math.floor(d * i))), {
|
|
@@ -7996,7 +7996,7 @@ function f1(n, t, e) {
|
|
|
7996
7996
|
style: n.style
|
|
7997
7997
|
};
|
|
7998
7998
|
}
|
|
7999
|
-
function
|
|
7999
|
+
function Tm(n, t, e) {
|
|
8000
8000
|
if (!e)
|
|
8001
8001
|
return [
|
|
8002
8002
|
n
|
|
@@ -8020,10 +8020,10 @@ function zm(n, t, e) {
|
|
|
8020
8020
|
style: f
|
|
8021
8021
|
})), p;
|
|
8022
8022
|
}
|
|
8023
|
-
function
|
|
8023
|
+
function zm(n, t) {
|
|
8024
8024
|
const e = [], i = n.segments;
|
|
8025
8025
|
for (let r = 0; r < i.length; r++) {
|
|
8026
|
-
const s =
|
|
8026
|
+
const s = Tm(i[r], n.points, t);
|
|
8027
8027
|
s.length && e.push(...s);
|
|
8028
8028
|
}
|
|
8029
8029
|
return e;
|
|
@@ -8482,7 +8482,7 @@ function Rh(n, t) {
|
|
|
8482
8482
|
x[a] = g;
|
|
8483
8483
|
}
|
|
8484
8484
|
}
|
|
8485
|
-
function
|
|
8485
|
+
function Tl(n, t) {
|
|
8486
8486
|
const e = n.scales;
|
|
8487
8487
|
return Object.keys(e).filter((i) => e[i].axis === t).shift();
|
|
8488
8488
|
}
|
|
@@ -8520,7 +8520,7 @@ function is(n, t) {
|
|
|
8520
8520
|
}
|
|
8521
8521
|
}
|
|
8522
8522
|
}
|
|
8523
|
-
const
|
|
8523
|
+
const zl = (n) => n === "reset" || n === "none", Lh = (n, t) => t ? n : Object.assign({}, n), V1 = (n, t, e) => n && !t.hidden && t._stacked && {
|
|
8524
8524
|
keys: Hm(e, !0),
|
|
8525
8525
|
values: null
|
|
8526
8526
|
};
|
|
@@ -8536,7 +8536,7 @@ class Le {
|
|
|
8536
8536
|
this.index !== t && is(this._cachedMeta), this.index = t;
|
|
8537
8537
|
}
|
|
8538
8538
|
linkScales() {
|
|
8539
|
-
const t = this.chart, e = this._cachedMeta, i = this.getDataset(), r = (u, h, f, p) => u === "x" ? h : u === "r" ? p : f, s = e.xAxisID = A(i.xAxisID,
|
|
8539
|
+
const t = this.chart, e = this._cachedMeta, i = this.getDataset(), r = (u, h, f, p) => u === "x" ? h : u === "r" ? p : f, s = e.xAxisID = A(i.xAxisID, Tl(t, "x")), o = e.yAxisID = A(i.yAxisID, Tl(t, "y")), a = e.rAxisID = A(i.rAxisID, Tl(t, "r")), l = e.indexAxis, c = e.iAxisID = r(l, s, o, a), d = e.vAxisID = r(l, o, s, a);
|
|
8540
8540
|
e.xScale = this.getScaleForId(s), e.yScale = this.getScaleForId(o), e.rScale = this.getScaleForId(a), e.iScale = this.getScaleForId(c), e.vScale = this.getScaleForId(d);
|
|
8541
8541
|
}
|
|
8542
8542
|
getDataset() {
|
|
@@ -8760,7 +8760,7 @@ class Le {
|
|
|
8760
8760
|
return this._sharedOptions || (this._sharedOptions = Object.assign({}, t));
|
|
8761
8761
|
}
|
|
8762
8762
|
includeOptions(t, e) {
|
|
8763
|
-
return !e ||
|
|
8763
|
+
return !e || zl(t) || this.chart._animationsDisabled;
|
|
8764
8764
|
}
|
|
8765
8765
|
_getSharedOptions(t, e) {
|
|
8766
8766
|
const i = this.resolveDataElementOptions(t, e), r = this._sharedOptions, s = this.getSharedOptions(i), o = this.includeOptions(e, s) || s !== r;
|
|
@@ -8770,10 +8770,10 @@ class Le {
|
|
|
8770
8770
|
};
|
|
8771
8771
|
}
|
|
8772
8772
|
updateElement(t, e, i, r) {
|
|
8773
|
-
|
|
8773
|
+
zl(r) ? Object.assign(t, i) : this._resolveAnimations(e, r).update(t, i);
|
|
8774
8774
|
}
|
|
8775
8775
|
updateSharedOptions(t, e, i) {
|
|
8776
|
-
t && !
|
|
8776
|
+
t && !zl(e) && this._resolveAnimations(void 0, e).update(t, i);
|
|
8777
8777
|
}
|
|
8778
8778
|
_setStyle(t, e, i, r) {
|
|
8779
8779
|
t.active = r;
|
|
@@ -8924,7 +8924,7 @@ function N1(n, t, e, i) {
|
|
|
8924
8924
|
start: c
|
|
8925
8925
|
};
|
|
8926
8926
|
}
|
|
8927
|
-
function
|
|
8927
|
+
function T1(n, t, e, i) {
|
|
8928
8928
|
const r = e.parse(n[0], i), s = e.parse(n[1], i), o = Math.min(r, s), a = Math.max(r, s);
|
|
8929
8929
|
let l = o, c = a;
|
|
8930
8930
|
Math.abs(o) > Math.abs(a) && (l = a, c = o), t[e.axis] = c, t._custom = {
|
|
@@ -8937,7 +8937,7 @@ function z1(n, t, e, i) {
|
|
|
8937
8937
|
};
|
|
8938
8938
|
}
|
|
8939
8939
|
function Pm(n, t, e, i) {
|
|
8940
|
-
return Wt(n) ?
|
|
8940
|
+
return Wt(n) ? T1(n, t, e, i) : t[e.axis] = e.parse(n, i), t;
|
|
8941
8941
|
}
|
|
8942
8942
|
function Yh(n, t, e, i) {
|
|
8943
8943
|
const r = n.iScale, s = n.vScale, o = r.getLabels(), a = r === s, l = [];
|
|
@@ -8949,7 +8949,7 @@ function Yh(n, t, e, i) {
|
|
|
8949
8949
|
function Fl(n) {
|
|
8950
8950
|
return n && n.barStart !== void 0 && n.barEnd !== void 0;
|
|
8951
8951
|
}
|
|
8952
|
-
function
|
|
8952
|
+
function z1(n, t, e) {
|
|
8953
8953
|
return n !== 0 ? rn(n) : (t.isHorizontal() ? 1 : -1) * (t.min >= e ? 1 : -1);
|
|
8954
8954
|
}
|
|
8955
8955
|
function F1(n) {
|
|
@@ -9093,7 +9093,7 @@ class ti extends Le {
|
|
|
9093
9093
|
const g = !dt(s) && !d ? s : h;
|
|
9094
9094
|
let y = e.getPixelForValue(g);
|
|
9095
9095
|
if (this.chart.getDataVisibility(t) ? p = e.getPixelForValue(h + f) : p = y, b = p - y, Math.abs(b) < o) {
|
|
9096
|
-
b =
|
|
9096
|
+
b = z1(b, e, a) * o, u === a && (y -= b / 2);
|
|
9097
9097
|
const x = e.getPixelForDecimal(0), w = e.getPixelForDecimal(1), k = Math.min(x, w), X = Math.max(x, w);
|
|
9098
9098
|
y = Math.max(Math.min(y, X), k), p = y + b, i && !d && (l._stacks[e.axis]._visualValues[r] = e.getValueForPixel(p) - e.getValueForPixel(y));
|
|
9099
9099
|
}
|
|
@@ -9251,7 +9251,7 @@ M(ea, "id", "bubble"), M(ea, "defaults", {
|
|
|
9251
9251
|
function O1(n, t, e) {
|
|
9252
9252
|
let i = 1, r = 1, s = 0, o = 0;
|
|
9253
9253
|
if (t < Xt) {
|
|
9254
|
-
const a = n, l = a + t, c = Math.cos(a), d = Math.sin(a), u = Math.cos(l), h = Math.sin(l), f = (w, k, X) => Qs(w, a, l, !0) ? 1 : Math.max(k, k * e, X, X * e), p = (w, k, X) => Qs(w, a, l, !0) ? -1 : Math.min(k, k * e, X, X * e), b = f(0, c, u), g = f(
|
|
9254
|
+
const a = n, l = a + t, c = Math.cos(a), d = Math.sin(a), u = Math.cos(l), h = Math.sin(l), f = (w, k, X) => Qs(w, a, l, !0) ? 1 : Math.max(k, k * e, X, X * e), p = (w, k, X) => Qs(w, a, l, !0) ? -1 : Math.min(k, k * e, X, X * e), b = f(0, c, u), g = f(zt, d, h), y = p(_t, c, u), x = p(_t + zt, d, h);
|
|
9255
9255
|
i = (b - y) / 2, r = (g - x) / 2, s = -(b + y) / 2, o = -(g + x) / 2;
|
|
9256
9256
|
}
|
|
9257
9257
|
return {
|
|
@@ -9464,7 +9464,7 @@ class Rn extends Le {
|
|
|
9464
9464
|
}, t), this.updateElements(r, a, l, t);
|
|
9465
9465
|
}
|
|
9466
9466
|
updateElements(t, e, i, r) {
|
|
9467
|
-
const s = r === "reset", { iScale: o, vScale: a, _stacked: l, _dataset: c } = this._cachedMeta, { sharedOptions: d, includeOptions: u } = this._getSharedOptions(e, r), h = o.axis, f = a.axis, { spanGaps: p, segment: b } = this.options, g =
|
|
9467
|
+
const s = r === "reset", { iScale: o, vScale: a, _stacked: l, _dataset: c } = this._cachedMeta, { sharedOptions: d, includeOptions: u } = this._getSharedOptions(e, r), h = o.axis, f = a.axis, { spanGaps: p, segment: b } = this.options, g = Tr(p) ? p : Number.POSITIVE_INFINITY, y = this.chart._animationsDisabled || s || r === "none", x = e + i, w = t.length;
|
|
9468
9468
|
let k = e > 0 && this.getParsed(e - 1);
|
|
9469
9469
|
for (let X = 0; X < w; ++X) {
|
|
9470
9470
|
const S = t[X], G = y ? S : {};
|
|
@@ -9702,7 +9702,7 @@ M(na, "id", "radar"), M(na, "defaults", {
|
|
|
9702
9702
|
}
|
|
9703
9703
|
}
|
|
9704
9704
|
});
|
|
9705
|
-
class
|
|
9705
|
+
class zi extends Le {
|
|
9706
9706
|
getLabelAndValue(t) {
|
|
9707
9707
|
const e = this._cachedMeta, i = this.chart.data.labels || [], { xScale: r, yScale: s } = e, o = this.getParsed(t), a = r.getLabelForValue(o.x), l = s.getLabelForValue(o.y);
|
|
9708
9708
|
return {
|
|
@@ -9730,7 +9730,7 @@ class Ti extends Le {
|
|
|
9730
9730
|
!this.datasetElementType && t && (this.datasetElementType = this.chart.registry.getElement("line")), super.addElements();
|
|
9731
9731
|
}
|
|
9732
9732
|
updateElements(t, e, i, r) {
|
|
9733
|
-
const s = r === "reset", { iScale: o, vScale: a, _stacked: l, _dataset: c } = this._cachedMeta, d = this.resolveDataElementOptions(e, r), u = this.getSharedOptions(d), h = this.includeOptions(r, u), f = o.axis, p = a.axis, { spanGaps: b, segment: g } = this.options, y =
|
|
9733
|
+
const s = r === "reset", { iScale: o, vScale: a, _stacked: l, _dataset: c } = this._cachedMeta, d = this.resolveDataElementOptions(e, r), u = this.getSharedOptions(d), h = this.includeOptions(r, u), f = o.axis, p = a.axis, { spanGaps: b, segment: g } = this.options, y = Tr(b) ? b : Number.POSITIVE_INFINITY, x = this.chart._animationsDisabled || s || r === "none";
|
|
9734
9734
|
let w = e > 0 && this.getParsed(e - 1);
|
|
9735
9735
|
for (let k = e; k < e + i; ++k) {
|
|
9736
9736
|
const X = t[k], S = this.getParsed(k), G = x ? X : {}, _ = dt(S[p]), V = G[f] = o.getPixelForValue(S[f], k), Y = G[p] = s || _ ? a.getBasePixel() : a.getPixelForValue(l ? this.applyStack(a, S, l) : S[p], k);
|
|
@@ -9753,12 +9753,12 @@ class Ti extends Le {
|
|
|
9753
9753
|
return Math.max(r, s, o) / 2;
|
|
9754
9754
|
}
|
|
9755
9755
|
}
|
|
9756
|
-
M(
|
|
9756
|
+
M(zi, "id", "scatter"), M(zi, "defaults", {
|
|
9757
9757
|
datasetElementType: !1,
|
|
9758
9758
|
dataElementType: "point",
|
|
9759
9759
|
showLine: !1,
|
|
9760
9760
|
fill: !1
|
|
9761
|
-
}), M(
|
|
9761
|
+
}), M(zi, "overrides", {
|
|
9762
9762
|
interaction: {
|
|
9763
9763
|
mode: "point"
|
|
9764
9764
|
},
|
|
@@ -9780,7 +9780,7 @@ var K1 = /* @__PURE__ */ Object.freeze({
|
|
|
9780
9780
|
PieController: wc,
|
|
9781
9781
|
PolarAreaController: sn,
|
|
9782
9782
|
RadarController: na,
|
|
9783
|
-
ScatterController:
|
|
9783
|
+
ScatterController: zi
|
|
9784
9784
|
});
|
|
9785
9785
|
function Wi() {
|
|
9786
9786
|
throw new Error("This method is not implemented: Check that a complete date adapter is provided.");
|
|
@@ -10123,7 +10123,7 @@ function fs(n, t, e, i) {
|
|
|
10123
10123
|
function Vo(n, t, e, i, r) {
|
|
10124
10124
|
n.top = e, n.left = t, n.right = t + i, n.bottom = e + r, n.width = i, n.height = r;
|
|
10125
10125
|
}
|
|
10126
|
-
function
|
|
10126
|
+
function Th(n, t, e, i) {
|
|
10127
10127
|
const r = e.padding;
|
|
10128
10128
|
let { x: s, y: o } = t;
|
|
10129
10129
|
for (const a of n) {
|
|
@@ -10165,7 +10165,7 @@ var Bt = {
|
|
|
10165
10165
|
update(n, t, e, i) {
|
|
10166
10166
|
if (!n)
|
|
10167
10167
|
return;
|
|
10168
|
-
const r =
|
|
10168
|
+
const r = $t(n.options.layout.padding), s = Math.max(t - r.width, 0), o = Math.max(e - r.height, 0), a = t2(n.boxes), l = a.vertical, c = a.horizontal;
|
|
10169
10169
|
mt(n.boxes, (b) => {
|
|
10170
10170
|
typeof b.beforeLayout == "function" && b.beforeLayout();
|
|
10171
10171
|
});
|
|
@@ -10178,7 +10178,7 @@ var Bt = {
|
|
|
10178
10178
|
vBoxMaxWidth: s / 2 / d,
|
|
10179
10179
|
hBoxMaxHeight: o / 2
|
|
10180
10180
|
}), h = Object.assign({}, r);
|
|
10181
|
-
Om(h,
|
|
10181
|
+
Om(h, $t(i));
|
|
10182
10182
|
const f = Object.assign({
|
|
10183
10183
|
maxPadding: h,
|
|
10184
10184
|
w: s,
|
|
@@ -10186,7 +10186,7 @@ var Bt = {
|
|
|
10186
10186
|
x: r.left,
|
|
10187
10187
|
y: r.top
|
|
10188
10188
|
}, r), p = q1(l.concat(c), u);
|
|
10189
|
-
fs(a.fullSize, f, u, p), fs(l, f, u, p), fs(c, f, u, p) && fs(l, f, u, p), n2(f),
|
|
10189
|
+
fs(a.fullSize, f, u, p), fs(l, f, u, p), fs(c, f, u, p) && fs(l, f, u, p), n2(f), Th(a.leftAndTop, f, u, p), f.x += f.w, f.y += f.h, Th(a.rightAndBottom, f, u, p), n.chartArea = {
|
|
10190
10190
|
left: f.left,
|
|
10191
10191
|
top: f.top,
|
|
10192
10192
|
right: f.left + f.w,
|
|
@@ -10247,7 +10247,7 @@ const ia = "$chartjs", s2 = {
|
|
|
10247
10247
|
pointerup: "mouseup",
|
|
10248
10248
|
pointerleave: "mouseout",
|
|
10249
10249
|
pointerout: "mouseout"
|
|
10250
|
-
},
|
|
10250
|
+
}, zh = (n) => n === null || n === "";
|
|
10251
10251
|
function o2(n, t) {
|
|
10252
10252
|
const e = n.style, i = n.getAttribute("height"), r = n.getAttribute("width");
|
|
10253
10253
|
if (n[ia] = {
|
|
@@ -10260,11 +10260,11 @@ function o2(n, t) {
|
|
|
10260
10260
|
width: e.width
|
|
10261
10261
|
}
|
|
10262
10262
|
}
|
|
10263
|
-
}, e.display = e.display || "block", e.boxSizing = e.boxSizing || "border-box",
|
|
10263
|
+
}, e.display = e.display || "block", e.boxSizing = e.boxSizing || "border-box", zh(r)) {
|
|
10264
10264
|
const s = Zh(n, "width");
|
|
10265
10265
|
s !== void 0 && (n.width = s);
|
|
10266
10266
|
}
|
|
10267
|
-
if (
|
|
10267
|
+
if (zh(i))
|
|
10268
10268
|
if (n.style.height === "")
|
|
10269
10269
|
n.height = n.width / (t || 2);
|
|
10270
10270
|
else {
|
|
@@ -10432,7 +10432,7 @@ let pn = (jo = class {
|
|
|
10432
10432
|
};
|
|
10433
10433
|
}
|
|
10434
10434
|
hasValue() {
|
|
10435
|
-
return
|
|
10435
|
+
return Tr(this.x) && Tr(this.y);
|
|
10436
10436
|
}
|
|
10437
10437
|
getProps(t, e) {
|
|
10438
10438
|
const i = this.$animations;
|
|
@@ -10535,7 +10535,7 @@ function os(n) {
|
|
|
10535
10535
|
function Oh(n, t) {
|
|
10536
10536
|
if (!n.display)
|
|
10537
10537
|
return 0;
|
|
10538
|
-
const e = Pt(n.font, t), i =
|
|
10538
|
+
const e = Pt(n.font, t), i = $t(n.padding);
|
|
10539
10539
|
return (Wt(n.text) ? n.text.length : 1) * e.lineHeight + i.height;
|
|
10540
10540
|
}
|
|
10541
10541
|
function S2(n, t) {
|
|
@@ -10570,7 +10570,7 @@ function L2(n, t, e, i) {
|
|
|
10570
10570
|
const y = Object.keys(e)[0], x = e[y];
|
|
10571
10571
|
f = d[y].getPixelForValue(x) - g + t;
|
|
10572
10572
|
} else e === "center" ? f = (c.left + c.right) / 2 - g + t : f = Hh(n, e, t);
|
|
10573
|
-
p = Jt(i, o, r), u = e === "left" ? -
|
|
10573
|
+
p = Jt(i, o, r), u = e === "left" ? -zt : zt;
|
|
10574
10574
|
}
|
|
10575
10575
|
return {
|
|
10576
10576
|
titleX: f,
|
|
@@ -10976,7 +10976,7 @@ class pi extends pn {
|
|
|
10976
10976
|
o ? (X = _, G === "inner" && (y === x - 1 ? Ae = this.options.reverse ? "left" : "right" : y === 0 ? Ae = this.options.reverse ? "right" : "left" : Ae = "center"), r === "top" ? c === "near" || b !== 0 ? H = -K * Y + Y / 2 : c === "center" ? H = -q.highest.height / 2 - ut * Y + Y : H = -q.highest.height + Y / 2 : c === "near" || b !== 0 ? H = Y / 2 : c === "center" ? H = q.highest.height / 2 - ut * Y : H = q.highest.height - K * Y, u && (H *= -1), b !== 0 && !rt.showLabelBackdrop && (X += Y / 2 * Math.sin(b))) : (S = _, H = (1 - K) * Y / 2);
|
|
10977
10977
|
let Fn;
|
|
10978
10978
|
if (rt.showLabelBackdrop) {
|
|
10979
|
-
const Hn =
|
|
10979
|
+
const Hn = $t(rt.backdropPadding), Zi = q.heights[y], gn = q.widths[y];
|
|
10980
10980
|
let Ce = H - Hn.top, Ne = 0 - Hn.left;
|
|
10981
10981
|
switch (ot) {
|
|
10982
10982
|
case "middle":
|
|
@@ -11124,7 +11124,7 @@ class pi extends pn {
|
|
|
11124
11124
|
const { ctx: t, options: { position: e, title: i, reverse: r } } = this;
|
|
11125
11125
|
if (!i.display)
|
|
11126
11126
|
return;
|
|
11127
|
-
const s = Pt(i.font), o =
|
|
11127
|
+
const s = Pt(i.font), o = $t(i.padding), a = i.align;
|
|
11128
11128
|
let l = s.lineHeight / 2;
|
|
11129
11129
|
e === "bottom" || e === "center" || st(e) ? (l += o.bottom, Wt(i.text) && (l += s.lineHeight * (i.text.length - 1))) : l += o.top;
|
|
11130
11130
|
const { titleX: c, titleY: d, maxWidth: u, rotation: h } = L2(this, l, e, a);
|
|
@@ -11348,7 +11348,7 @@ class C2 {
|
|
|
11348
11348
|
}
|
|
11349
11349
|
_createDescriptors(t, e) {
|
|
11350
11350
|
const i = t && t.config, r = A(i.options && i.options.plugins, {}), s = N2(i);
|
|
11351
|
-
return r === !1 && !e ? [] :
|
|
11351
|
+
return r === !1 && !e ? [] : z2(t, s, r, e);
|
|
11352
11352
|
}
|
|
11353
11353
|
_notifyStateChanges(t) {
|
|
11354
11354
|
const e = this._oldCache || [], i = this._cache, r = (s, o) => s.filter((a) => !o.some((l) => a.plugin.id === l.plugin.id));
|
|
@@ -11369,13 +11369,13 @@ function N2(n) {
|
|
|
11369
11369
|
localIds: t
|
|
11370
11370
|
};
|
|
11371
11371
|
}
|
|
11372
|
-
function
|
|
11372
|
+
function T2(n, t) {
|
|
11373
11373
|
return !t && n === !1 ? null : n === !0 ? {} : n;
|
|
11374
11374
|
}
|
|
11375
|
-
function
|
|
11375
|
+
function z2(n, { plugins: t, localIds: e }, i, r) {
|
|
11376
11376
|
const s = [], o = n.getContext();
|
|
11377
11377
|
for (const a of t) {
|
|
11378
|
-
const l = a.id, c =
|
|
11378
|
+
const l = a.id, c = T2(i[l], r);
|
|
11379
11379
|
c !== null && s.push({
|
|
11380
11380
|
plugin: a,
|
|
11381
11381
|
options: F2(n.config, {
|
|
@@ -11612,7 +11612,7 @@ class J2 {
|
|
|
11612
11612
|
if (B2(o, e)) {
|
|
11613
11613
|
s.$shared = !1, i = li(i) ? i() : i;
|
|
11614
11614
|
const c = this.createResolver(t, i, a);
|
|
11615
|
-
l =
|
|
11615
|
+
l = zr(o, i, c);
|
|
11616
11616
|
}
|
|
11617
11617
|
for (const c of e)
|
|
11618
11618
|
s[c] = l[c];
|
|
@@ -11622,7 +11622,7 @@ class J2 {
|
|
|
11622
11622
|
""
|
|
11623
11623
|
], r) {
|
|
11624
11624
|
const { resolver: s } = Eh(this._resolverCache, t, i);
|
|
11625
|
-
return st(e) ?
|
|
11625
|
+
return st(e) ? zr(s, e, void 0, r) : s;
|
|
11626
11626
|
}
|
|
11627
11627
|
}
|
|
11628
11628
|
function Eh(n, t, e) {
|
|
@@ -12192,7 +12192,7 @@ function $h() {
|
|
|
12192
12192
|
function eZ(n, t, e) {
|
|
12193
12193
|
const { startAngle: i, pixelMargin: r, x: s, y: o, outerRadius: a, innerRadius: l } = t;
|
|
12194
12194
|
let c = r / a;
|
|
12195
|
-
n.beginPath(), n.arc(s, o, a, i - c, e + c), l > r ? (c = r / l, n.arc(s, o, l, e + c, i - c, !0)) : n.arc(s, o, r, e +
|
|
12195
|
+
n.beginPath(), n.arc(s, o, a, i - c, e + c), l > r ? (c = r / l, n.arc(s, o, l, e + c, i - c, !0)) : n.arc(s, o, r, e + zt, i - zt), n.closePath(), n.clip();
|
|
12196
12196
|
}
|
|
12197
12197
|
function nZ(n) {
|
|
12198
12198
|
return vd(n, [
|
|
@@ -12233,22 +12233,22 @@ function Sa(n, t, e, i, r, s) {
|
|
|
12233
12233
|
const rt = (V + Y) / 2;
|
|
12234
12234
|
if (n.arc(o, a, u, V, rt), n.arc(o, a, u, rt, Y), k > 0) {
|
|
12235
12235
|
const bt = pr(_, Y, o, a);
|
|
12236
|
-
n.arc(bt.x, bt.y, k, Y, x +
|
|
12236
|
+
n.arc(bt.x, bt.y, k, Y, x + zt);
|
|
12237
12237
|
}
|
|
12238
12238
|
const ut = pr(H, x, o, a);
|
|
12239
12239
|
if (n.lineTo(ut.x, ut.y), S > 0) {
|
|
12240
12240
|
const bt = pr(H, q, o, a);
|
|
12241
|
-
n.arc(bt.x, bt.y, S, x +
|
|
12241
|
+
n.arc(bt.x, bt.y, S, x + zt, q + Math.PI);
|
|
12242
12242
|
}
|
|
12243
12243
|
const ft = (x - S / h + (y + X / h)) / 2;
|
|
12244
12244
|
if (n.arc(o, a, h, x - S / h, ft, !0), n.arc(o, a, h, ft, y + X / h, !0), X > 0) {
|
|
12245
12245
|
const bt = pr(K, ot, o, a);
|
|
12246
|
-
n.arc(bt.x, bt.y, X, ot + Math.PI, y -
|
|
12246
|
+
n.arc(bt.x, bt.y, X, ot + Math.PI, y - zt);
|
|
12247
12247
|
}
|
|
12248
12248
|
const Rt = pr(G, y, o, a);
|
|
12249
12249
|
if (n.lineTo(Rt.x, Rt.y), w > 0) {
|
|
12250
12250
|
const bt = pr(G, V, o, a);
|
|
12251
|
-
n.arc(bt.x, bt.y, w, y -
|
|
12251
|
+
n.arc(bt.x, bt.y, w, y - zt, V);
|
|
12252
12252
|
}
|
|
12253
12253
|
} else {
|
|
12254
12254
|
n.moveTo(o, a);
|
|
@@ -12449,7 +12449,7 @@ class Bn extends pn {
|
|
|
12449
12449
|
return i && e[t[i - 1].end];
|
|
12450
12450
|
}
|
|
12451
12451
|
interpolate(t, e) {
|
|
12452
|
-
const i = this.options, r = t[e], s = this.points, o =
|
|
12452
|
+
const i = this.options, r = t[e], s = this.points, o = zm(this, {
|
|
12453
12453
|
property: e,
|
|
12454
12454
|
start: r,
|
|
12455
12455
|
end: r
|
|
@@ -12914,9 +12914,9 @@ function VZ(n, t, e) {
|
|
|
12914
12914
|
});
|
|
12915
12915
|
continue;
|
|
12916
12916
|
}
|
|
12917
|
-
const u =
|
|
12917
|
+
const u = zm(t, d);
|
|
12918
12918
|
for (const h of u) {
|
|
12919
|
-
const f = Sc(e, s[h.start], s[h.end], h.loop), p =
|
|
12919
|
+
const f = Sc(e, s[h.start], s[h.end], h.loop), p = Tm(a, r, f);
|
|
12920
12920
|
for (const b of p)
|
|
12921
12921
|
o.push({
|
|
12922
12922
|
source: b,
|
|
@@ -13022,11 +13022,11 @@ function CZ(n, t, e) {
|
|
|
13022
13022
|
function NZ(n, t, e, i) {
|
|
13023
13023
|
return (n === "-" || n === "+") && (e = t + e), e === t || e < 0 || e >= i ? !1 : e;
|
|
13024
13024
|
}
|
|
13025
|
-
function
|
|
13025
|
+
function TZ(n, t) {
|
|
13026
13026
|
let e = null;
|
|
13027
13027
|
return n === "start" ? e = t.bottom : n === "end" ? e = t.top : st(n) ? e = t.getPixelForValue(n.value) : t.getBasePixel && (e = t.getBasePixel()), e;
|
|
13028
13028
|
}
|
|
13029
|
-
function
|
|
13029
|
+
function zZ(n, t, e) {
|
|
13030
13030
|
let i;
|
|
13031
13031
|
return n === "start" ? i = e : n === "end" ? i = t.options.reverse ? t.min : t.max : st(n) ? i = n.value : i = t.getBaseValue(), i;
|
|
13032
13032
|
}
|
|
@@ -13132,7 +13132,7 @@ function JZ(n) {
|
|
|
13132
13132
|
return (n.scale || {}).getPointPositionForValue ? BZ(n) : EZ(n);
|
|
13133
13133
|
}
|
|
13134
13134
|
function EZ(n) {
|
|
13135
|
-
const { scale: t = {}, fill: e } = n, i =
|
|
13135
|
+
const { scale: t = {}, fill: e } = n, i = TZ(e, t);
|
|
13136
13136
|
if (It(i)) {
|
|
13137
13137
|
const r = t.isHorizontal();
|
|
13138
13138
|
return {
|
|
@@ -13143,7 +13143,7 @@ function EZ(n) {
|
|
|
13143
13143
|
return null;
|
|
13144
13144
|
}
|
|
13145
13145
|
function BZ(n) {
|
|
13146
|
-
const { scale: t, fill: e } = n, i = t.options, r = t.getLabels().length, s = i.reverse ? t.max : t.min, o =
|
|
13146
|
+
const { scale: t, fill: e } = n, i = t.options, r = t.getLabels().length, s = i.reverse ? t.max : t.min, o = zZ(e, t, s), a = [];
|
|
13147
13147
|
if (i.grid.circular) {
|
|
13148
13148
|
const l = t.getPointPositionForValue(0, s);
|
|
13149
13149
|
return new rb({
|
|
@@ -13421,7 +13421,7 @@ class df extends pn {
|
|
|
13421
13421
|
}), Cm(this.ctx, t.textDirection);
|
|
13422
13422
|
}
|
|
13423
13423
|
drawTitle() {
|
|
13424
|
-
const t = this.options, e = t.title, i = Pt(e.font), r =
|
|
13424
|
+
const t = this.options, e = t.title, i = Pt(e.font), r = $t(e.padding);
|
|
13425
13425
|
if (!e.display)
|
|
13426
13426
|
return;
|
|
13427
13427
|
const s = _r(t.rtl, this.left, this.width), o = this.ctx, a = e.position, l = i.size / 2, c = r.top + l;
|
|
@@ -13436,7 +13436,7 @@ class df extends pn {
|
|
|
13436
13436
|
o.textAlign = s.textAlign(gd(a)), o.textBaseline = "middle", o.strokeStyle = e.color, o.fillStyle = e.color, o.font = i.string, Ui(o, e.text, f, d, i);
|
|
13437
13437
|
}
|
|
13438
13438
|
_computeTitleHeight() {
|
|
13439
|
-
const t = this.options.title, e = Pt(t.font), i =
|
|
13439
|
+
const t = this.options.title, e = Pt(t.font), i = $t(t.padding);
|
|
13440
13440
|
return t.display ? e.lineHeight + i.height : 0;
|
|
13441
13441
|
}
|
|
13442
13442
|
_getLegendItemAt(t, e) {
|
|
@@ -13538,7 +13538,7 @@ var iw = {
|
|
|
13538
13538
|
generateLabels(n) {
|
|
13539
13539
|
const t = n.data.datasets, { labels: { usePointStyle: e, pointStyle: i, textAlign: r, color: s, useBorderRadius: o, borderRadius: a } } = n.legend.options;
|
|
13540
13540
|
return n._getSortedDatasetMetas().map((l) => {
|
|
13541
|
-
const c = l.controller.getStyle(e ? 0 : void 0), d =
|
|
13541
|
+
const c = l.controller.getStyle(e ? 0 : void 0), d = $t(c.borderWidth);
|
|
13542
13542
|
return {
|
|
13543
13543
|
text: t[l.index].label,
|
|
13544
13544
|
fillStyle: c.backgroundColor,
|
|
@@ -13589,7 +13589,7 @@ class Sd extends pn {
|
|
|
13589
13589
|
}
|
|
13590
13590
|
this.width = this.right = t, this.height = this.bottom = e;
|
|
13591
13591
|
const r = Wt(i.text) ? i.text.length : 1;
|
|
13592
|
-
this._padding =
|
|
13592
|
+
this._padding = $t(i.padding);
|
|
13593
13593
|
const s = r * Pt(i.font).lineHeight + this._padding.height;
|
|
13594
13594
|
this.isHorizontal() ? this.height = s : this.width = s;
|
|
13595
13595
|
}
|
|
@@ -13667,7 +13667,7 @@ var sw = {
|
|
|
13667
13667
|
_indexable: !1
|
|
13668
13668
|
}
|
|
13669
13669
|
};
|
|
13670
|
-
const
|
|
13670
|
+
const To = /* @__PURE__ */ new WeakMap();
|
|
13671
13671
|
var ow = {
|
|
13672
13672
|
id: "subtitle",
|
|
13673
13673
|
start(n, t, e) {
|
|
@@ -13676,13 +13676,13 @@ var ow = {
|
|
|
13676
13676
|
options: e,
|
|
13677
13677
|
chart: n
|
|
13678
13678
|
});
|
|
13679
|
-
Bt.configure(n, i, e), Bt.addBox(n, i),
|
|
13679
|
+
Bt.configure(n, i, e), Bt.addBox(n, i), To.set(n, i);
|
|
13680
13680
|
},
|
|
13681
13681
|
stop(n) {
|
|
13682
|
-
Bt.removeBox(n,
|
|
13682
|
+
Bt.removeBox(n, To.get(n)), To.delete(n);
|
|
13683
13683
|
},
|
|
13684
13684
|
beforeUpdate(n, t, e) {
|
|
13685
|
-
const i =
|
|
13685
|
+
const i = To.get(n);
|
|
13686
13686
|
Bt.configure(n, i, e), i.options = e;
|
|
13687
13687
|
},
|
|
13688
13688
|
defaults: {
|
|
@@ -13768,7 +13768,7 @@ function aw(n, t) {
|
|
|
13768
13768
|
};
|
|
13769
13769
|
}
|
|
13770
13770
|
function uf(n, t) {
|
|
13771
|
-
const e = n.chart.ctx, { body: i, footer: r, title: s } = n, { boxWidth: o, boxHeight: a } = t, l = Pt(t.bodyFont), c = Pt(t.titleFont), d = Pt(t.footerFont), u = s.length, h = r.length, f = i.length, p =
|
|
13771
|
+
const e = n.chart.ctx, { body: i, footer: r, title: s } = n, { boxWidth: o, boxHeight: a } = t, l = Pt(t.bodyFont), c = Pt(t.titleFont), d = Pt(t.footerFont), u = s.length, h = r.length, f = i.length, p = $t(t.padding);
|
|
13772
13772
|
let b = p.height, g = 0, y = i.reduce((k, X) => k + X.before.length + X.lines.length + X.after.length, 0);
|
|
13773
13773
|
if (y += n.beforeBody.length + n.afterBody.length, u && (b += u * c.lineHeight + (u - 1) * t.titleSpacing + t.titleMarginBottom), y) {
|
|
13774
13774
|
const k = t.displayColors ? Math.max(a, l.lineHeight) : l.lineHeight;
|
|
@@ -13824,8 +13824,8 @@ function ff(n, t, e, i) {
|
|
|
13824
13824
|
y: Kt(b, 0, i.height - t.height)
|
|
13825
13825
|
};
|
|
13826
13826
|
}
|
|
13827
|
-
function
|
|
13828
|
-
const i =
|
|
13827
|
+
function zo(n, t, e) {
|
|
13828
|
+
const i = $t(e.padding);
|
|
13829
13829
|
return t === "center" ? n.x + n.width / 2 : t === "right" ? n.x + n.width - i.right : n.x + i.left;
|
|
13830
13830
|
}
|
|
13831
13831
|
function pf(n) {
|
|
@@ -14001,12 +14001,12 @@ let bf = (nc = class extends pn {
|
|
|
14001
14001
|
let o, a, l;
|
|
14002
14002
|
if (s) {
|
|
14003
14003
|
const c = _r(i.rtl, this.x, this.width);
|
|
14004
|
-
for (t.x =
|
|
14004
|
+
for (t.x = zo(this, i.titleAlign, i), e.textAlign = c.textAlign(i.titleAlign), e.textBaseline = "middle", o = Pt(i.titleFont), a = i.titleSpacing, e.fillStyle = i.titleColor, e.font = o.string, l = 0; l < s; ++l)
|
|
14005
14005
|
e.fillText(r[l], c.x(t.x), t.y + o.lineHeight / 2), t.y += o.lineHeight + a, l + 1 === s && (t.y += i.titleMarginBottom - a);
|
|
14006
14006
|
}
|
|
14007
14007
|
}
|
|
14008
14008
|
_drawColorBox(t, e, i, r, s) {
|
|
14009
|
-
const o = this.labelColors[i], a = this.labelPointStyles[i], { boxHeight: l, boxWidth: c } = s, d = Pt(s.bodyFont), u =
|
|
14009
|
+
const o = this.labelColors[i], a = this.labelPointStyles[i], { boxHeight: l, boxWidth: c } = s, d = Pt(s.bodyFont), u = zo(this, "left", s), h = r.x(u), f = l < d.lineHeight ? (d.lineHeight - l) / 2 : 0, p = e.y + f;
|
|
14010
14010
|
if (s.usePointStyle) {
|
|
14011
14011
|
const b = {
|
|
14012
14012
|
radius: Math.min(c, l) / 2,
|
|
@@ -14041,7 +14041,7 @@ let bf = (nc = class extends pn {
|
|
|
14041
14041
|
e.fillText(_, p.x(t.x + f), t.y + h / 2), t.y += h + s;
|
|
14042
14042
|
}, g = p.textAlign(o);
|
|
14043
14043
|
let y, x, w, k, X, S, G;
|
|
14044
|
-
for (e.textAlign = o, e.textBaseline = "middle", e.font = u.string, t.x =
|
|
14044
|
+
for (e.textAlign = o, e.textBaseline = "middle", e.font = u.string, t.x = zo(this, g, i), e.fillStyle = i.bodyColor, mt(this.beforeBody, b), f = a && g !== "right" ? o === "center" ? c / 2 + d : c + 2 + d : 0, k = 0, S = r.length; k < S; ++k) {
|
|
14045
14045
|
for (y = r[k], x = this.labelTextColors[k], e.fillStyle = x, mt(y.before, b), w = y.lines, a && w.length && (this._drawColorBox(e, t, k, p, i), h = Math.max(u.lineHeight, l)), X = 0, G = w.length; X < G; ++X)
|
|
14046
14046
|
b(w[X]), h = u.lineHeight;
|
|
14047
14047
|
mt(y.after, b);
|
|
@@ -14053,7 +14053,7 @@ let bf = (nc = class extends pn {
|
|
|
14053
14053
|
let o, a;
|
|
14054
14054
|
if (s) {
|
|
14055
14055
|
const l = _r(i.rtl, this.x, this.width);
|
|
14056
|
-
for (t.x =
|
|
14056
|
+
for (t.x = zo(this, i.footerAlign, i), t.y += i.footerMarginTop, e.textAlign = l.textAlign(i.footerAlign), e.textBaseline = "middle", o = Pt(i.footerFont), e.fillStyle = i.footerColor, e.font = o.string, a = 0; a < s; ++a)
|
|
14057
14057
|
e.fillText(r[a], l.x(t.x), t.y + o.lineHeight / 2), t.y += o.lineHeight + i.footerSpacing;
|
|
14058
14058
|
}
|
|
14059
14059
|
}
|
|
@@ -14088,7 +14088,7 @@ let bf = (nc = class extends pn {
|
|
|
14088
14088
|
y: this.y
|
|
14089
14089
|
};
|
|
14090
14090
|
i = Math.abs(i) < 1e-3 ? 0 : i;
|
|
14091
|
-
const o =
|
|
14091
|
+
const o = $t(e.padding), a = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;
|
|
14092
14092
|
e.enabled && a && (t.save(), t.globalAlpha = i, this.drawBackground(s, t, r, e), Mm(t, e.textDirection), s.y += o.top, this.drawTitle(s, t, e), this.drawBody(s, t, e), this.drawFooter(s, t, e), Cm(t, e.textDirection), t.restore());
|
|
14093
14093
|
}
|
|
14094
14094
|
getActiveElements() {
|
|
@@ -14544,7 +14544,7 @@ M(Gc, "id", "logarithmic"), M(Gc, "defaults", {
|
|
|
14544
14544
|
function Rc(n) {
|
|
14545
14545
|
const t = n.ticks;
|
|
14546
14546
|
if (t.display && n.display) {
|
|
14547
|
-
const e =
|
|
14547
|
+
const e = $t(t.backdropPadding);
|
|
14548
14548
|
return A(t.font && t.font.size, St.font.size) + e.height;
|
|
14549
14549
|
}
|
|
14550
14550
|
return 0;
|
|
@@ -14592,7 +14592,7 @@ function kw(n, t, e, i, r) {
|
|
|
14592
14592
|
i.start < t.l ? (a = (t.l - i.start) / s, n.l = Math.min(n.l, t.l - a)) : i.end > t.r && (a = (i.end - t.r) / s, n.r = Math.max(n.r, t.r + a)), r.start < t.t ? (l = (t.t - r.start) / o, n.t = Math.min(n.t, t.t - l)) : r.end > t.b && (l = (r.end - t.b) / o, n.b = Math.max(n.b, t.b + l));
|
|
14593
14593
|
}
|
|
14594
14594
|
function Xw(n, t, e) {
|
|
14595
|
-
const i = n.drawingArea, { extra: r, additionalAngle: s, padding: o, size: a } = e, l = n.getPointPosition(t, i + r + o, s), c = Math.round(md(ge(l.angle +
|
|
14595
|
+
const i = n.drawingArea, { extra: r, additionalAngle: s, padding: o, size: a } = e, l = n.getPointPosition(t, i + r + o, s), c = Math.round(md(ge(l.angle + zt))), d = Rw(l.y, a.h, c), u = Sw(c), h = Gw(l.x, a.w, u);
|
|
14596
14596
|
return {
|
|
14597
14597
|
visible: !0,
|
|
14598
14598
|
x: l.x,
|
|
@@ -14647,7 +14647,7 @@ function Rw(n, t, e) {
|
|
|
14647
14647
|
function Lw(n, t, e) {
|
|
14648
14648
|
const { left: i, top: r, right: s, bottom: o } = e, { backdropColor: a } = t;
|
|
14649
14649
|
if (!dt(a)) {
|
|
14650
|
-
const l = Ni(t.borderRadius), c =
|
|
14650
|
+
const l = Ni(t.borderRadius), c = $t(t.backdropPadding);
|
|
14651
14651
|
n.fillStyle = a;
|
|
14652
14652
|
const d = i - c.left, u = r - c.top, h = s - i + c.width, f = o - r + c.height;
|
|
14653
14653
|
Object.values(l).some((p) => p !== 0) ? (n.beginPath(), $s(n, {
|
|
@@ -14702,7 +14702,7 @@ class yr extends Ga {
|
|
|
14702
14702
|
super(t), this.xCenter = void 0, this.yCenter = void 0, this.drawingArea = void 0, this._pointLabels = [], this._pointLabelItems = [];
|
|
14703
14703
|
}
|
|
14704
14704
|
setDimensions() {
|
|
14705
|
-
const t = this._padding =
|
|
14705
|
+
const t = this._padding = $t(Rc(this.options) / 2), e = this.width = this.maxWidth - t.width, i = this.height = this.maxHeight - t.height;
|
|
14706
14706
|
this.xCenter = Math.floor(this.left + e / 2 + t.left), this.yCenter = Math.floor(this.top + i / 2 + t.top), this.drawingArea = Math.floor(Math.min(e, i) / 2);
|
|
14707
14707
|
}
|
|
14708
14708
|
determineDataLimits() {
|
|
@@ -14752,7 +14752,7 @@ class yr extends Ga {
|
|
|
14752
14752
|
}
|
|
14753
14753
|
}
|
|
14754
14754
|
getPointPosition(t, e, i = 0) {
|
|
14755
|
-
const r = this.getIndexAngle(t) -
|
|
14755
|
+
const r = this.getIndexAngle(t) - zt + i;
|
|
14756
14756
|
return {
|
|
14757
14757
|
x: Math.cos(r) * e + this.xCenter,
|
|
14758
14758
|
y: Math.sin(r) * e + this.yCenter,
|
|
@@ -14812,7 +14812,7 @@ class yr extends Ga {
|
|
|
14812
14812
|
const c = i.setContext(this.getContext(l)), d = Pt(c.font);
|
|
14813
14813
|
if (s = this.getDistanceFromCenterForValue(this.ticks[l].value), c.showLabelBackdrop) {
|
|
14814
14814
|
t.font = d.string, o = t.measureText(a.label).width, t.fillStyle = c.backdropColor;
|
|
14815
|
-
const u =
|
|
14815
|
+
const u = $t(c.backdropPadding);
|
|
14816
14816
|
t.fillRect(-o / 2 - u.left, -s - d.size / 2 - u.top, o + u.width, d.size + u.height);
|
|
14817
14817
|
}
|
|
14818
14818
|
Ui(t, a.label, 0, -s, d, {
|
|
@@ -14919,7 +14919,7 @@ function kf(n, t) {
|
|
|
14919
14919
|
return null;
|
|
14920
14920
|
const e = n._adapter, { parser: i, round: r, isoWeekday: s } = n._parseOpts;
|
|
14921
14921
|
let o = t;
|
|
14922
|
-
return typeof i == "function" && (o = i(o)), It(o) || (o = typeof i == "string" ? e.parse(o, i) : e.parse(o)), o === null ? null : (r && (o = r === "week" && (
|
|
14922
|
+
return typeof i == "function" && (o = i(o)), It(o) || (o = typeof i == "string" ? e.parse(o, i) : e.parse(o)), o === null ? null : (r && (o = r === "week" && (Tr(s) || s === !0) ? e.startOf(o, "isoWeek", s) : e.startOf(o, r)), +o);
|
|
14923
14923
|
}
|
|
14924
14924
|
function Xf(n, t, e, i) {
|
|
14925
14925
|
const r = le.length;
|
|
@@ -15030,7 +15030,7 @@ class no extends pi {
|
|
|
15030
15030
|
};
|
|
15031
15031
|
}
|
|
15032
15032
|
_generate() {
|
|
15033
|
-
const t = this._adapter, e = this.min, i = this.max, r = this.options, s = r.time, o = s.unit || Xf(s.minUnit, e, i, this._getLabelCapacity(e)), a = A(r.ticks.stepSize, 1), l = o === "week" ? s.isoWeekday : !1, c =
|
|
15033
|
+
const t = this._adapter, e = this.min, i = this.max, r = this.options, s = r.time, o = s.unit || Xf(s.minUnit, e, i, this._getLabelCapacity(e)), a = A(r.ticks.stepSize, 1), l = o === "week" ? s.isoWeekday : !1, c = Tr(l) || l === !0, d = {};
|
|
15034
15034
|
let u = e, h, f;
|
|
15035
15035
|
if (c && (u = +t.startOf(u, "isoWeek", l)), u = +t.startOf(u, c ? "day" : o), t.diff(i, e, o) > 1e5 * a)
|
|
15036
15036
|
throw new Error(e + " and " + i + " are too far apart with stepSize of " + a + " " + o);
|
|
@@ -15189,7 +15189,7 @@ class Lc extends no {
|
|
|
15189
15189
|
}
|
|
15190
15190
|
}
|
|
15191
15191
|
M(Lc, "id", "timeseries"), M(Lc, "defaults", no.defaults);
|
|
15192
|
-
var
|
|
15192
|
+
var Tw = /* @__PURE__ */ Object.freeze({
|
|
15193
15193
|
__proto__: null,
|
|
15194
15194
|
CategoryScale: to,
|
|
15195
15195
|
LinearScale: Ai,
|
|
@@ -15202,10 +15202,10 @@ const ir = [
|
|
|
15202
15202
|
K1,
|
|
15203
15203
|
xZ,
|
|
15204
15204
|
pw,
|
|
15205
|
-
|
|
15205
|
+
Tw
|
|
15206
15206
|
], cb = 1e-10;
|
|
15207
15207
|
function el(n, t) {
|
|
15208
|
-
const e = Fw(n), i = e.filter((a) =>
|
|
15208
|
+
const e = Fw(n), i = e.filter((a) => zw(a, n));
|
|
15209
15209
|
let r = 0, s = 0;
|
|
15210
15210
|
const o = [];
|
|
15211
15211
|
if (i.length > 1) {
|
|
@@ -15256,7 +15256,7 @@ function el(n, t) {
|
|
|
15256
15256
|
}
|
|
15257
15257
|
return s /= 2, t && (t.area = r + s, t.arcArea = r, t.polygonArea = s, t.arcs = o, t.innerPoints = i, t.intersectionPoints = e), r + s;
|
|
15258
15258
|
}
|
|
15259
|
-
function
|
|
15259
|
+
function zw(n, t) {
|
|
15260
15260
|
return t.every((e) => ue(n, e) < e.radius + cb);
|
|
15261
15261
|
}
|
|
15262
15262
|
function Fw(n) {
|
|
@@ -15972,11 +15972,11 @@ function lk(n, t) {
|
|
|
15972
15972
|
function ck(n, t) {
|
|
15973
15973
|
return lk(n.cx - t.cx, n.cy - t.cy);
|
|
15974
15974
|
}
|
|
15975
|
-
const
|
|
15975
|
+
const Tc = 1 / 180 * Math.PI;
|
|
15976
15976
|
function dk(n, t, e, i) {
|
|
15977
15977
|
return {
|
|
15978
|
-
x: n + Math.cos(i *
|
|
15979
|
-
y: t + Math.sin(i *
|
|
15978
|
+
x: n + Math.cos(i * Tc) * e,
|
|
15979
|
+
y: t + Math.sin(i * Tc) * e
|
|
15980
15980
|
};
|
|
15981
15981
|
}
|
|
15982
15982
|
class rr extends pn {
|
|
@@ -15985,7 +15985,7 @@ class rr extends pn {
|
|
|
15985
15985
|
const r = this.getProps(["arcs", "refs", "sets"]), s = new Set(r.sets);
|
|
15986
15986
|
function o(l, c, d) {
|
|
15987
15987
|
if (An(c)) {
|
|
15988
|
-
const u = c.rotation *
|
|
15988
|
+
const u = c.rotation * Tc, h = l.cx - c.cx, f = l.cy - c.cy, p = (h * Math.cos(u) + f * Math.sin(u)) ** 2 / c.rx ** 2 + (h * Math.sin(u) - f * Math.cos(u)) ** 2 / c.ry ** 2;
|
|
15989
15989
|
if (d && p > 1 || !d && p < 1)
|
|
15990
15990
|
return !1;
|
|
15991
15991
|
} else {
|
|
@@ -18704,7 +18704,7 @@ class Nk extends Vt {
|
|
|
18704
18704
|
}
|
|
18705
18705
|
}
|
|
18706
18706
|
Nk.id = mi.id;
|
|
18707
|
-
function
|
|
18707
|
+
function Tk(n) {
|
|
18708
18708
|
const t = n.reduce((i, r) => i + r.x, 0), e = n.reduce((i, r) => i + r.y, 0);
|
|
18709
18709
|
return {
|
|
18710
18710
|
x: t / n.length,
|
|
@@ -18722,7 +18722,7 @@ function Gf(n, t, e) {
|
|
|
18722
18722
|
}).join(`
|
|
18723
18723
|
`);
|
|
18724
18724
|
}
|
|
18725
|
-
function
|
|
18725
|
+
function zk(n, t) {
|
|
18726
18726
|
const e = n.x - t.x, i = n.y - t.y;
|
|
18727
18727
|
return Math.atan2(i, e) / Math.PI * 180;
|
|
18728
18728
|
}
|
|
@@ -18731,8 +18731,8 @@ function Fk(n, t) {
|
|
|
18731
18731
|
width: t.width,
|
|
18732
18732
|
height: t.height,
|
|
18733
18733
|
distinct: !0
|
|
18734
|
-
}), i = e.filter((c) => c.data.sets.length === 1), r = i.map((c) => c.data.sets[0]), s = i.map((c) => c.circles[0]), o =
|
|
18735
|
-
const d = c.circles[0], u =
|
|
18734
|
+
}), i = e.filter((c) => c.data.sets.length === 1), r = i.map((c) => c.data.sets[0]), s = i.map((c) => c.circles[0]), o = Tk(i.map((c) => c.circles[0])), a = i.map((c) => {
|
|
18735
|
+
const d = c.circles[0], u = zk(d, o);
|
|
18736
18736
|
return {
|
|
18737
18737
|
cx: d.x + t.x,
|
|
18738
18738
|
cy: d.y + t.y,
|
|
@@ -18841,7 +18841,7 @@ function Pk(n, t = {}) {
|
|
|
18841
18841
|
}
|
|
18842
18842
|
const sr = ({ configuration: n }) => {
|
|
18843
18843
|
const t = Mt(null), e = Mt(null);
|
|
18844
|
-
return
|
|
18844
|
+
return Qt(() => {
|
|
18845
18845
|
if (t.current === null)
|
|
18846
18846
|
return;
|
|
18847
18847
|
const i = t.current.getContext("2d");
|
|
@@ -18877,7 +18877,7 @@ const Dk = ({
|
|
|
18877
18877
|
),
|
|
18878
18878
|
[n, t]
|
|
18879
18879
|
);
|
|
18880
|
-
|
|
18880
|
+
Qt(() => {
|
|
18881
18881
|
if (e.current === null)
|
|
18882
18882
|
return;
|
|
18883
18883
|
if (r === null) {
|
|
@@ -19035,7 +19035,7 @@ class Sr extends Error {
|
|
|
19035
19035
|
const Uk = ({ error: n, resetError: t, layout: e }) => {
|
|
19036
19036
|
console.error(n);
|
|
19037
19037
|
const i = Mt(null), r = Mt(null);
|
|
19038
|
-
|
|
19038
|
+
Qt(() => {
|
|
19039
19039
|
var a;
|
|
19040
19040
|
(a = i.current) == null || a.dispatchEvent(new Bk(n));
|
|
19041
19041
|
});
|
|
@@ -19136,7 +19136,7 @@ function $k(n) {
|
|
|
19136
19136
|
}
|
|
19137
19137
|
function qk() {
|
|
19138
19138
|
const [n, t] = it(document.fullscreenElement !== null);
|
|
19139
|
-
return
|
|
19139
|
+
return Qt(() => {
|
|
19140
19140
|
const e = () => {
|
|
19141
19141
|
t(document.fullscreenElement !== null);
|
|
19142
19142
|
};
|
|
@@ -19277,9 +19277,9 @@ function rX(n, t, e) {
|
|
|
19277
19277
|
}
|
|
19278
19278
|
function sX(n) {
|
|
19279
19279
|
const t = Ya(n);
|
|
19280
|
-
return [
|
|
19280
|
+
return [zc(n), t, zc(t)];
|
|
19281
19281
|
}
|
|
19282
|
-
function
|
|
19282
|
+
function zc(n) {
|
|
19283
19283
|
return n.replace(/start|end/g, (t) => iX[t]);
|
|
19284
19284
|
}
|
|
19285
19285
|
function oX(n, t, e) {
|
|
@@ -19298,7 +19298,7 @@ function oX(n, t, e) {
|
|
|
19298
19298
|
function aX(n, t, e, i) {
|
|
19299
19299
|
const r = ol(n);
|
|
19300
19300
|
let s = oX($i(n), e === "start", i);
|
|
19301
|
-
return r && (s = s.map((o) => o + "-" + r), t && (s = s.concat(s.map(
|
|
19301
|
+
return r && (s = s.map((o) => o + "-" + r), t && (s = s.concat(s.map(zc)))), s;
|
|
19302
19302
|
}
|
|
19303
19303
|
function Ya(n) {
|
|
19304
19304
|
return n.replace(/left|right|bottom|top/g, (t) => nX[t]);
|
|
@@ -20160,9 +20160,9 @@ const IX = fX, MX = pX, CX = uX, NX = (n, t, e) => {
|
|
|
20160
20160
|
platform: s
|
|
20161
20161
|
});
|
|
20162
20162
|
};
|
|
20163
|
-
function
|
|
20163
|
+
function TX(n, t, e, i) {
|
|
20164
20164
|
const r = Mt(null);
|
|
20165
|
-
|
|
20165
|
+
Qt(() => {
|
|
20166
20166
|
if (!n.current || !t.current)
|
|
20167
20167
|
return;
|
|
20168
20168
|
const { current: s } = n, { current: o } = t, a = () => {
|
|
@@ -20178,8 +20178,8 @@ function zX(n, t, e, i) {
|
|
|
20178
20178
|
};
|
|
20179
20179
|
}, [i, e, n, t]);
|
|
20180
20180
|
}
|
|
20181
|
-
function
|
|
20182
|
-
|
|
20181
|
+
function zX(n, t, e) {
|
|
20182
|
+
Qt(() => {
|
|
20183
20183
|
const i = (r) => {
|
|
20184
20184
|
const s = r.composedPath();
|
|
20185
20185
|
n.current && !s.includes(n.current) && t.current && !s.includes(t.current) && e(!1);
|
|
@@ -20190,7 +20190,7 @@ function TX(n, t, e) {
|
|
|
20190
20190
|
}, [n, t, e]);
|
|
20191
20191
|
}
|
|
20192
20192
|
function FX(n) {
|
|
20193
|
-
|
|
20193
|
+
Qt(() => {
|
|
20194
20194
|
const t = (e) => {
|
|
20195
20195
|
e.key === "Escape" && n(!1);
|
|
20196
20196
|
};
|
|
@@ -20201,7 +20201,7 @@ function FX(n) {
|
|
|
20201
20201
|
}
|
|
20202
20202
|
const HX = "z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200 shadow-lg rounded-md", Id = ({ children: n, buttonTitle: t, placement: e }) => {
|
|
20203
20203
|
const [i, r] = it(!1), s = Mt(null), o = Mt(null);
|
|
20204
|
-
return
|
|
20204
|
+
return TX(s, o, [IX(4), MX(), CX()], e), zX(o, s, r), FX(r), /* @__PURE__ */ m(Gt, { children: [
|
|
20205
20205
|
/* @__PURE__ */ m("button", { type: "button", className: "btn btn-xs whitespace-nowrap w-full", onClick: () => {
|
|
20206
20206
|
r(!i);
|
|
20207
20207
|
}, ref: s, children: t }),
|
|
@@ -20332,7 +20332,7 @@ const HX = "z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200
|
|
|
20332
20332
|
indicateError: e = !1
|
|
20333
20333
|
}) => {
|
|
20334
20334
|
const [i, r] = it(n);
|
|
20335
|
-
|
|
20335
|
+
Qt(() => {
|
|
20336
20336
|
r(n);
|
|
20337
20337
|
}, [n]);
|
|
20338
20338
|
const s = (a) => {
|
|
@@ -20360,7 +20360,7 @@ const HX = "z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200
|
|
|
20360
20360
|
};
|
|
20361
20361
|
function Nf(n, t, e) {
|
|
20362
20362
|
const i = Mt(!1);
|
|
20363
|
-
|
|
20363
|
+
Qt(() => {
|
|
20364
20364
|
if (!i.current) {
|
|
20365
20365
|
i.current = !0;
|
|
20366
20366
|
return;
|
|
@@ -20451,7 +20451,7 @@ const DX = ({
|
|
|
20451
20451
|
const e = "All segments", i = t.join(", ");
|
|
20452
20452
|
return e.length >= i.length ? i : `${t.length} ${t.length === 1 ? "segment" : "segments"}`;
|
|
20453
20453
|
};
|
|
20454
|
-
function
|
|
20454
|
+
function Td(n) {
|
|
20455
20455
|
const t = Ct(Ur), e = uy(t, n).map((i) => ({
|
|
20456
20456
|
segment: i,
|
|
20457
20457
|
label: i,
|
|
@@ -20466,7 +20466,7 @@ const lr = ({ tabs: n, toolbar: t }) => {
|
|
|
20466
20466
|
s(`${d}px`);
|
|
20467
20467
|
}
|
|
20468
20468
|
};
|
|
20469
|
-
|
|
20469
|
+
Qt(() => (a(), window.addEventListener("resize", a), () => {
|
|
20470
20470
|
window.removeEventListener("resize", a);
|
|
20471
20471
|
}), []);
|
|
20472
20472
|
const l = /* @__PURE__ */ m("div", { className: "flex flex-row", children: n.map((d) => /* @__PURE__ */ m(Gt, { children: /* @__PURE__ */ m(
|
|
@@ -20496,7 +20496,7 @@ const lr = ({ tabs: n, toolbar: t }) => {
|
|
|
20496
20496
|
};
|
|
20497
20497
|
function Nn(n, t) {
|
|
20498
20498
|
const [e, i] = it(null), [r, s] = it(null), [o, a] = it(!0);
|
|
20499
|
-
return
|
|
20499
|
+
return Qt(() => {
|
|
20500
20500
|
(async () => {
|
|
20501
20501
|
a(!0);
|
|
20502
20502
|
try {
|
|
@@ -20524,7 +20524,7 @@ const KX = (n) => {
|
|
|
20524
20524
|
const [e, i] = it({ min: 0.5, max: 1 }), [r, s] = it([
|
|
20525
20525
|
{ label: "Substitutions", checked: !0, type: "substitution" },
|
|
20526
20526
|
{ label: "Deletions", checked: !0, type: "deletion" }
|
|
20527
|
-
]), [o, a] =
|
|
20527
|
+
]), [o, a] = Td(t.sequenceType), l = Oe(
|
|
20528
20528
|
() => jk(n, o, r),
|
|
20529
20529
|
[n, o, r]
|
|
20530
20530
|
), c = (u) => {
|
|
@@ -20603,7 +20603,7 @@ const KX = (n) => {
|
|
|
20603
20603
|
Qi,
|
|
20604
20604
|
{
|
|
20605
20605
|
className: "mx-1 btn btn-xs",
|
|
20606
|
-
getData: () =>
|
|
20606
|
+
getData: () => zp({ content: r }, s),
|
|
20607
20607
|
filename: "mutation_comparison.csv"
|
|
20608
20608
|
}
|
|
20609
20609
|
),
|
|
@@ -20622,7 +20622,7 @@ var $X = Object.defineProperty, Ib = (n, t, e, i) => {
|
|
|
20622
20622
|
(o = n[s]) && (r = o(t, e, r) || r);
|
|
20623
20623
|
return r && $X(t, e, r), r;
|
|
20624
20624
|
};
|
|
20625
|
-
const qX =
|
|
20625
|
+
const qX = za(QX), t_ = za(AX), Ad = class Ad extends Li {
|
|
20626
20626
|
constructor() {
|
|
20627
20627
|
super(...arguments), this.lapis = "", this.referenceGenome = {
|
|
20628
20628
|
nucleotideSequences: [],
|
|
@@ -20642,7 +20642,7 @@ Ib([
|
|
|
20642
20642
|
Ib([
|
|
20643
20643
|
np({ context: up, subscribe: !0 })
|
|
20644
20644
|
], Ye.prototype, "referenceGenome");
|
|
20645
|
-
const e_ =
|
|
20645
|
+
const e_ = za(UX), Qd = class Qd extends Ye {
|
|
20646
20646
|
};
|
|
20647
20647
|
Qd.styles = [...Ye.styles, e_];
|
|
20648
20648
|
let di = Qd;
|
|
@@ -20705,8 +20705,8 @@ function Cb(n, t) {
|
|
|
20705
20705
|
proportion: i.proportion
|
|
20706
20706
|
}));
|
|
20707
20707
|
}
|
|
20708
|
-
const
|
|
20709
|
-
const e = n.match(
|
|
20708
|
+
const Tf = /(?:([A-Za-z0-9]+):)?(\d+)$/, Nb = (n, t) => {
|
|
20709
|
+
const e = n.match(Tf), i = t.match(Tf);
|
|
20710
20710
|
if (e && i)
|
|
20711
20711
|
return e[1] !== i[1] ? e[1].localeCompare(i[1]) : parseInt(e[2], 10) - parseInt(i[2], 10);
|
|
20712
20712
|
throw new Error(`Invalid mutation position: ${n} or ${t}`);
|
|
@@ -20866,7 +20866,7 @@ const m_ = (n) => {
|
|
|
20866
20866
|
throw s;
|
|
20867
20867
|
return r === null ? /* @__PURE__ */ m(we, {}) : /* @__PURE__ */ m(g_, { mutationsData: r, originalComponentProps: n });
|
|
20868
20868
|
}, g_ = ({ mutationsData: n, originalComponentProps: t }) => {
|
|
20869
|
-
const [e, i] = it({ min: 0.05, max: 1 }), [r, s] =
|
|
20869
|
+
const [e, i] = it({ min: 0.05, max: 1 }), [r, s] = Td(t.sequenceType), [o, a] = it([
|
|
20870
20870
|
{ label: "Substitutions", checked: !0, type: "substitution" },
|
|
20871
20871
|
{ label: "Deletions", checked: !0, type: "deletion" }
|
|
20872
20872
|
]), l = p_(n, r, o), c = (h) => {
|
|
@@ -21044,7 +21044,7 @@ dr([
|
|
|
21044
21044
|
hi = dr([
|
|
21045
21045
|
ke("gs-mutations")
|
|
21046
21046
|
], hi);
|
|
21047
|
-
function
|
|
21047
|
+
function Tb(n, t) {
|
|
21048
21048
|
return n[0].content.map((e, i) => {
|
|
21049
21049
|
var s;
|
|
21050
21050
|
const r = n.map((o) => ({
|
|
@@ -21064,10 +21064,10 @@ const dl = {
|
|
|
21064
21064
|
errorBarWhiskerRatio: { v: [0.2, 0.25] },
|
|
21065
21065
|
errorBarWhiskerSize: { v: [20, 24] },
|
|
21066
21066
|
errorBarWhiskerColor: { v: ["#2c2c2c", "#1f1f1f"] }
|
|
21067
|
-
},
|
|
21067
|
+
}, zd = {
|
|
21068
21068
|
_scriptable: !0,
|
|
21069
21069
|
_indexable: (n) => n !== "v"
|
|
21070
|
-
},
|
|
21070
|
+
}, zf = Object.keys(dl);
|
|
21071
21071
|
function Fd(n, t) {
|
|
21072
21072
|
const e = Array.isArray(n) ? n : [n], i = Array.isArray(t) ? t : [t];
|
|
21073
21073
|
if (e.length === i.length)
|
|
@@ -21101,7 +21101,7 @@ function k_(n, t, e, i, r) {
|
|
|
21101
21101
|
r.lineWidth = ce(i.errorBarLineWidth, c), r.strokeStyle = ce(i.errorBarColor, c), r.beginPath(), r.moveTo(o, 0), r.lineTo(a, 0), r.stroke(), r.lineWidth = ce(i.errorBarWhiskerLineWidth, c), r.strokeStyle = ce(i.errorBarWhiskerColor, c), r.beginPath(), r.moveTo(o, -d), r.lineTo(o, d), r.moveTo(a, -d), r.lineTo(a, d), r.stroke();
|
|
21102
21102
|
}), r.restore();
|
|
21103
21103
|
}
|
|
21104
|
-
function
|
|
21104
|
+
function zb(n, t) {
|
|
21105
21105
|
var e, i, r, s;
|
|
21106
21106
|
const o = n.getProps(["x", "y", "width", "height", "xMin", "xMax", "yMin", "yMax"]);
|
|
21107
21107
|
(o.xMin != null || o.xMax != null) && k_(o, (e = o.xMin) !== null && e !== void 0 ? e : null, (i = o.xMax) !== null && i !== void 0 ? i : null, n.options, t), (o.yMin != null || o.yMax != null) && w_(o, (r = o.yMin) !== null && r !== void 0 ? r : null, (s = o.yMax) !== null && s !== void 0 ? s : null, n.options, t);
|
|
@@ -21125,22 +21125,22 @@ function __(n, t) {
|
|
|
21125
21125
|
}
|
|
21126
21126
|
class ur extends ei {
|
|
21127
21127
|
draw(t) {
|
|
21128
|
-
super.draw(t),
|
|
21128
|
+
super.draw(t), zb(this, t);
|
|
21129
21129
|
}
|
|
21130
21130
|
}
|
|
21131
21131
|
ur.id = "barWithErrorBar";
|
|
21132
21132
|
ur.defaults = { ...ei.defaults, ...dl };
|
|
21133
21133
|
ur.defaultRoutes = ei.defaultRoutes;
|
|
21134
|
-
ur.descriptors =
|
|
21134
|
+
ur.descriptors = zd;
|
|
21135
21135
|
class Ve extends Fi {
|
|
21136
21136
|
draw(t, e) {
|
|
21137
|
-
super.draw.call(this, t, e),
|
|
21137
|
+
super.draw.call(this, t, e), zb(this, t);
|
|
21138
21138
|
}
|
|
21139
21139
|
}
|
|
21140
21140
|
Ve.id = "pointWithErrorBar";
|
|
21141
21141
|
Ve.defaults = { ...Fi.defaults, ...dl };
|
|
21142
21142
|
Ve.defaultRoutes = Fi.defaultRoutes;
|
|
21143
|
-
Ve.descriptors =
|
|
21143
|
+
Ve.descriptors = zd;
|
|
21144
21144
|
class Ar extends En {
|
|
21145
21145
|
draw(t) {
|
|
21146
21146
|
super.draw(t), __(this, t);
|
|
@@ -21149,7 +21149,7 @@ class Ar extends En {
|
|
|
21149
21149
|
Ar.id = "arcWithErrorBar";
|
|
21150
21150
|
Ar.defaults = { ...En.defaults, ...dl };
|
|
21151
21151
|
Ar.defaultRoutes = En.defaultRoutes;
|
|
21152
|
-
Ar.descriptors =
|
|
21152
|
+
Ar.descriptors = zd;
|
|
21153
21153
|
const Hc = ["xMin", "xMax", "yMin", "yMax"];
|
|
21154
21154
|
function Fb(n) {
|
|
21155
21155
|
return n ? Hc.slice(0, 2) : Hc.slice(2);
|
|
@@ -21223,11 +21223,11 @@ const ul = {
|
|
|
21223
21223
|
animations: {
|
|
21224
21224
|
numberArray: {
|
|
21225
21225
|
fn: L_,
|
|
21226
|
-
properties: Hc.concat(
|
|
21226
|
+
properties: Hc.concat(zf.filter((n) => !n.endsWith("Color")), ["rMin", "rMax"])
|
|
21227
21227
|
},
|
|
21228
21228
|
colorArray: {
|
|
21229
21229
|
fn: Y_,
|
|
21230
|
-
properties:
|
|
21230
|
+
properties: zf.filter((n) => n.endsWith("Color"))
|
|
21231
21231
|
}
|
|
21232
21232
|
}
|
|
21233
21233
|
};
|
|
@@ -21376,7 +21376,7 @@ class I_ extends Vt {
|
|
|
21376
21376
|
}
|
|
21377
21377
|
}
|
|
21378
21378
|
I_.id = Qr.id;
|
|
21379
|
-
class $r extends
|
|
21379
|
+
class $r extends zi {
|
|
21380
21380
|
getMinMax(t, e) {
|
|
21381
21381
|
return hl(t, (i) => super.getMinMax(i, e));
|
|
21382
21382
|
}
|
|
@@ -21408,14 +21408,14 @@ class $r extends Ti {
|
|
|
21408
21408
|
}
|
|
21409
21409
|
$r.id = "scatterWithErrorBars";
|
|
21410
21410
|
$r.defaults = Ze({}, [
|
|
21411
|
-
|
|
21411
|
+
zi.defaults,
|
|
21412
21412
|
ul,
|
|
21413
21413
|
{
|
|
21414
21414
|
dataElementType: Ve.id
|
|
21415
21415
|
}
|
|
21416
21416
|
]);
|
|
21417
21417
|
$r.overrides = Ze({}, [
|
|
21418
|
-
|
|
21418
|
+
zi.overrides,
|
|
21419
21419
|
{
|
|
21420
21420
|
plugins: {
|
|
21421
21421
|
tooltip: {
|
|
@@ -21585,7 +21585,7 @@ const N_ = ({
|
|
|
21585
21585
|
}));
|
|
21586
21586
|
if (r.length === 0)
|
|
21587
21587
|
return /* @__PURE__ */ m(we, {});
|
|
21588
|
-
const s = r.map((l, c) =>
|
|
21588
|
+
const s = r.map((l, c) => T_(l, c, e)), o = t !== "logit" ? ml(Ed(r), i == null ? void 0 : i[t]) : void 0, a = {
|
|
21589
21589
|
type: yi.id,
|
|
21590
21590
|
data: {
|
|
21591
21591
|
datasets: s
|
|
@@ -21605,13 +21605,13 @@ const N_ = ({
|
|
|
21605
21605
|
}
|
|
21606
21606
|
};
|
|
21607
21607
|
return /* @__PURE__ */ m(sr, { configuration: a });
|
|
21608
|
-
},
|
|
21608
|
+
}, T_ = (n, t, e) => ({
|
|
21609
21609
|
borderWidth: 1,
|
|
21610
21610
|
label: n.displayName,
|
|
21611
21611
|
backgroundColor: Ie(t, 0.3),
|
|
21612
21612
|
borderColor: Ie(t),
|
|
21613
|
-
data: n.content.map(
|
|
21614
|
-
}),
|
|
21613
|
+
data: n.content.map(z_(e))
|
|
21614
|
+
}), z_ = (n) => (t) => {
|
|
21615
21615
|
var i;
|
|
21616
21616
|
const e = F_(t, n);
|
|
21617
21617
|
return {
|
|
@@ -21647,7 +21647,7 @@ const N_ = ({
|
|
|
21647
21647
|
return t;
|
|
21648
21648
|
}
|
|
21649
21649
|
};
|
|
21650
|
-
var Jb = 60, Eb = Jb * 60, Bb = Eb * 24, P_ = Bb * 7, Or = 1e3, Bl = Jb * Or, Hf = Eb * Or, D_ = Bb * Or, O_ = P_ * Or, Dd = "millisecond", vr = "second", xr = "minute", Zr = "hour",
|
|
21650
|
+
var Jb = 60, Eb = Jb * 60, Bb = Eb * 24, P_ = Bb * 7, Or = 1e3, Bl = Jb * Or, Hf = Eb * Or, D_ = Bb * Or, O_ = P_ * Or, Dd = "millisecond", vr = "second", xr = "minute", Zr = "hour", ze = "day", _s = "week", Te = "month", Ub = "quarter", Xn = "year", wr = "date", Ab = "YYYY-MM-DDTHH:mm:ssZ", Pf = "Invalid Date", K_ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, j_ = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
|
|
21651
21651
|
const J_ = {
|
|
21652
21652
|
name: "en",
|
|
21653
21653
|
weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
|
|
@@ -21665,16 +21665,16 @@ var Oc = function(t, e, i) {
|
|
|
21665
21665
|
return (e <= 0 ? "+" : "-") + Oc(r, 2, "0") + ":" + Oc(s, 2, "0");
|
|
21666
21666
|
}, B_ = function n(t, e) {
|
|
21667
21667
|
if (t.date() < e.date()) return -n(e, t);
|
|
21668
|
-
var i = (e.year() - t.year()) * 12 + (e.month() - t.month()), r = t.clone().add(i,
|
|
21668
|
+
var i = (e.year() - t.year()) * 12 + (e.month() - t.month()), r = t.clone().add(i, Te), s = e - r < 0, o = t.clone().add(i + (s ? -1 : 1), Te);
|
|
21669
21669
|
return +(-(i + (e - r) / (s ? r - o : o - r)) || 0);
|
|
21670
21670
|
}, U_ = function(t) {
|
|
21671
21671
|
return t < 0 ? Math.ceil(t) || 0 : Math.floor(t);
|
|
21672
21672
|
}, A_ = function(t) {
|
|
21673
21673
|
var e = {
|
|
21674
|
-
M:
|
|
21674
|
+
M: Te,
|
|
21675
21675
|
y: Xn,
|
|
21676
21676
|
w: _s,
|
|
21677
|
-
d:
|
|
21677
|
+
d: ze,
|
|
21678
21678
|
D: wr,
|
|
21679
21679
|
h: Zr,
|
|
21680
21680
|
m: xr,
|
|
@@ -21772,7 +21772,7 @@ var tW = function(t) {
|
|
|
21772
21772
|
}, t.startOf = function(i, r) {
|
|
21773
21773
|
var s = this, o = gt.u(r) ? !0 : r, a = gt.p(i), l = function(y, x) {
|
|
21774
21774
|
var w = gt.w(s.$u ? Date.UTC(s.$y, x, y) : new Date(s.$y, x, y), s);
|
|
21775
|
-
return o ? w : w.endOf(
|
|
21775
|
+
return o ? w : w.endOf(ze);
|
|
21776
21776
|
}, c = function(y, x) {
|
|
21777
21777
|
var w = [0, 0, 0, 0], k = [23, 59, 59, 999];
|
|
21778
21778
|
return gt.w(s.toDate()[y].apply(
|
|
@@ -21784,13 +21784,13 @@ var tW = function(t) {
|
|
|
21784
21784
|
switch (a) {
|
|
21785
21785
|
case Xn:
|
|
21786
21786
|
return o ? l(1, 0) : l(31, 11);
|
|
21787
|
-
case
|
|
21787
|
+
case Te:
|
|
21788
21788
|
return o ? l(1, u) : l(0, u + 1);
|
|
21789
21789
|
case _s: {
|
|
21790
21790
|
var p = this.$locale().weekStart || 0, b = (d < p ? d + 7 : d) - p;
|
|
21791
21791
|
return l(o ? h - b : h + (6 - b), u);
|
|
21792
21792
|
}
|
|
21793
|
-
case
|
|
21793
|
+
case ze:
|
|
21794
21794
|
case wr:
|
|
21795
21795
|
return c(f + "Hours", 0);
|
|
21796
21796
|
case Zr:
|
|
@@ -21805,8 +21805,8 @@ var tW = function(t) {
|
|
|
21805
21805
|
}, t.endOf = function(i) {
|
|
21806
21806
|
return this.startOf(i, !1);
|
|
21807
21807
|
}, t.$set = function(i, r) {
|
|
21808
|
-
var s, o = gt.p(i), a = "set" + (this.$u ? "UTC" : ""), l = (s = {}, s[
|
|
21809
|
-
if (o ===
|
|
21808
|
+
var s, o = gt.p(i), a = "set" + (this.$u ? "UTC" : ""), l = (s = {}, s[ze] = a + "Date", s[wr] = a + "Date", s[Te] = a + "Month", s[Xn] = a + "FullYear", s[Zr] = a + "Hours", s[xr] = a + "Minutes", s[vr] = a + "Seconds", s[Dd] = a + "Milliseconds", s)[o], c = o === ze ? this.$D + (r - this.$W) : r;
|
|
21809
|
+
if (o === Te || o === Xn) {
|
|
21810
21810
|
var d = this.clone().set(wr, 1);
|
|
21811
21811
|
d.$d[l](c), d.init(), this.$d = d.set(wr, Math.min(this.$D, d.daysInMonth())).$d;
|
|
21812
21812
|
} else l && this.$d[l](c);
|
|
@@ -21822,11 +21822,11 @@ var tW = function(t) {
|
|
|
21822
21822
|
var f = kt(s);
|
|
21823
21823
|
return gt.w(f.date(f.date() + Math.round(h * i)), s);
|
|
21824
21824
|
};
|
|
21825
|
-
if (a ===
|
|
21826
|
-
return this.set(
|
|
21825
|
+
if (a === Te)
|
|
21826
|
+
return this.set(Te, this.$M + i);
|
|
21827
21827
|
if (a === Xn)
|
|
21828
21828
|
return this.set(Xn, this.$y + i);
|
|
21829
|
-
if (a ===
|
|
21829
|
+
if (a === ze)
|
|
21830
21830
|
return l(1);
|
|
21831
21831
|
if (a === _s)
|
|
21832
21832
|
return l(7);
|
|
@@ -21910,7 +21910,7 @@ var tW = function(t) {
|
|
|
21910
21910
|
case Xn:
|
|
21911
21911
|
h = u() / 12;
|
|
21912
21912
|
break;
|
|
21913
|
-
case
|
|
21913
|
+
case Te:
|
|
21914
21914
|
h = u();
|
|
21915
21915
|
break;
|
|
21916
21916
|
case Ub:
|
|
@@ -21919,7 +21919,7 @@ var tW = function(t) {
|
|
|
21919
21919
|
case _s:
|
|
21920
21920
|
h = (d - c) / O_;
|
|
21921
21921
|
break;
|
|
21922
|
-
case
|
|
21922
|
+
case ze:
|
|
21923
21923
|
h = (d - c) / D_;
|
|
21924
21924
|
break;
|
|
21925
21925
|
case Zr:
|
|
@@ -21937,7 +21937,7 @@ var tW = function(t) {
|
|
|
21937
21937
|
}
|
|
21938
21938
|
return s ? h : gt.a(h);
|
|
21939
21939
|
}, t.daysInMonth = function() {
|
|
21940
|
-
return this.endOf(
|
|
21940
|
+
return this.endOf(Te).$D;
|
|
21941
21941
|
}, t.$locale = function() {
|
|
21942
21942
|
return Pi[this.$L];
|
|
21943
21943
|
}, t.locale = function(i, r) {
|
|
@@ -21957,7 +21957,7 @@ var tW = function(t) {
|
|
|
21957
21957
|
}, n;
|
|
21958
21958
|
}(), $b = bl.prototype;
|
|
21959
21959
|
kt.prototype = $b;
|
|
21960
|
-
[["$ms", Dd], ["$s", vr], ["$m", xr], ["$H", Zr], ["$W",
|
|
21960
|
+
[["$ms", Dd], ["$s", vr], ["$m", xr], ["$H", Zr], ["$W", ze], ["$M", Te], ["$y", Xn], ["$D", wr]].forEach(function(n) {
|
|
21961
21961
|
$b[n[1]] = function(t) {
|
|
21962
21962
|
return this.$g(t, n[0], n[1]);
|
|
21963
21963
|
};
|
|
@@ -22019,16 +22019,16 @@ var nW = "isoweek";
|
|
|
22019
22019
|
const iW = function(n, t, e) {
|
|
22020
22020
|
var i = function(l, c) {
|
|
22021
22021
|
var d = (c ? e.utc : e)().year(l).startOf(Xn), u = 4 - d.isoWeekday();
|
|
22022
|
-
return d.isoWeekday() > 4 && (u += 7), d.add(u,
|
|
22022
|
+
return d.isoWeekday() > 4 && (u += 7), d.add(u, ze);
|
|
22023
22023
|
}, r = function(l) {
|
|
22024
|
-
return l.add(4 - l.isoWeekday(),
|
|
22024
|
+
return l.add(4 - l.isoWeekday(), ze);
|
|
22025
22025
|
}, s = t.prototype;
|
|
22026
22026
|
s.isoWeekYear = function() {
|
|
22027
22027
|
var a = r(this);
|
|
22028
22028
|
return a.year();
|
|
22029
22029
|
}, s.isoWeek = function(a) {
|
|
22030
22030
|
if (!this.$utils().u(a))
|
|
22031
|
-
return this.add((a - this.isoWeek()) * 7,
|
|
22031
|
+
return this.add((a - this.isoWeek()) * 7, ze);
|
|
22032
22032
|
var l = r(this), c = i(this.isoWeekYear(), this.$u);
|
|
22033
22033
|
return l.diff(c, _s) + 1;
|
|
22034
22034
|
}, s.isoWeekday = function(a) {
|
|
@@ -22042,7 +22042,7 @@ const iW = function(n, t, e) {
|
|
|
22042
22042
|
};
|
|
22043
22043
|
kt.extend(iW);
|
|
22044
22044
|
kt.extend(eW);
|
|
22045
|
-
const Kc = "GGGG-[W]WW",
|
|
22045
|
+
const Kc = "GGGG-[W]WW", Ta = class Ta {
|
|
22046
22046
|
constructor() {
|
|
22047
22047
|
this.yearMonthDayCache = /* @__PURE__ */ new Map(), this.yearWeekCache = /* @__PURE__ */ new Map(), this.yearMonthCache = /* @__PURE__ */ new Map(), this.yearCache = /* @__PURE__ */ new Map();
|
|
22048
22048
|
}
|
|
@@ -22062,8 +22062,8 @@ const Kc = "GGGG-[W]WW", za = class za {
|
|
|
22062
22062
|
return this.instance;
|
|
22063
22063
|
}
|
|
22064
22064
|
};
|
|
22065
|
-
|
|
22066
|
-
let Qn =
|
|
22065
|
+
Ta.instance = new Ta();
|
|
22066
|
+
let Qn = Ta;
|
|
22067
22067
|
class dn {
|
|
22068
22068
|
constructor(t, e, i, r) {
|
|
22069
22069
|
this.yearNumber = t, this.monthNumber = e, this.dayNumber = i, this.cache = r, this.type = "YearMonthDay", this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber), this.dayjs = kt(this.date), this.dateString = this.toString();
|
|
@@ -22524,7 +22524,7 @@ const xW = ({ data: n, granularity: t, pageSize: e }) => {
|
|
|
22524
22524
|
...i(o)
|
|
22525
22525
|
];
|
|
22526
22526
|
return /* @__PURE__ */ m(nr, { data: ((o, a) => {
|
|
22527
|
-
const l =
|
|
22527
|
+
const l = Tb(o, a);
|
|
22528
22528
|
return Object.values(l).map((c) => Object.values(c));
|
|
22529
22529
|
})(n, t), columns: r(n), pageSize: e });
|
|
22530
22530
|
};
|
|
@@ -22703,7 +22703,7 @@ const jd = ({ items: n, selected: t, onChange: e, selectStyle: i }) => /* @__PUR
|
|
|
22703
22703
|
return null;
|
|
22704
22704
|
const i = [
|
|
22705
22705
|
{ label: "Confidence interval method", value: "none", disabled: !0 },
|
|
22706
|
-
...e.
|
|
22706
|
+
...e.map((r) => {
|
|
22707
22707
|
switch (r) {
|
|
22708
22708
|
case "wilson":
|
|
22709
22709
|
return { label: "Wilson, 95% CI", value: "wilson" };
|
|
@@ -22773,7 +22773,11 @@ const jd = ({ items: n, selected: t, onChange: e, selectStyle: i }) => /* @__PUR
|
|
|
22773
22773
|
}, MW = ({ data: n, ...t }) => {
|
|
22774
22774
|
const { views: e, granularity: i, confidenceIntervalMethods: r, pageSize: s, yAxisMaxLinear: o, yAxisMaxLogarithmic: a } = t, [l, c] = it("linear"), [d, u] = it(
|
|
22775
22775
|
r.length > 0 ? r[0] : "none"
|
|
22776
|
-
)
|
|
22776
|
+
);
|
|
22777
|
+
Qt(() => {
|
|
22778
|
+
u((g) => r.includes(g) ? g : r.length > 0 ? r[0] : "none");
|
|
22779
|
+
}, [r]);
|
|
22780
|
+
const h = { linear: o, logarithmic: a }, f = (g) => {
|
|
22777
22781
|
switch (g) {
|
|
22778
22782
|
case "bar":
|
|
22779
22783
|
return {
|
|
@@ -22856,7 +22860,7 @@ const jd = ({ items: n, selected: t, onChange: e, selectStyle: i }) => /* @__PUR
|
|
|
22856
22860
|
Qi,
|
|
22857
22861
|
{
|
|
22858
22862
|
className: "mx-1 btn btn-xs",
|
|
22859
|
-
getData: () =>
|
|
22863
|
+
getData: () => Tb(s, l),
|
|
22860
22864
|
filename: "prevalence_over_time.csv"
|
|
22861
22865
|
}
|
|
22862
22866
|
),
|
|
@@ -22888,14 +22892,14 @@ const jd = ({ items: n, selected: t, onChange: e, selectStyle: i }) => /* @__PUR
|
|
|
22888
22892
|
/* @__PURE__ */ m(ar, { componentName: "prevalence-over-time", params: n, lapisUrl: r })
|
|
22889
22893
|
] });
|
|
22890
22894
|
}, Ed = (n) => Math.max(...n.flatMap((t) => t.content.map((e) => e.prevalence)));
|
|
22891
|
-
var
|
|
22892
|
-
for (var r = i > 1 ? void 0 : i ?
|
|
22895
|
+
var TW = Object.defineProperty, zW = Object.getOwnPropertyDescriptor, Xe = (n, t, e, i) => {
|
|
22896
|
+
for (var r = i > 1 ? void 0 : i ? zW(t, e) : t, s = n.length - 1, o; s >= 0; s--)
|
|
22893
22897
|
(o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
|
|
22894
|
-
return i && r &&
|
|
22898
|
+
return i && r && TW(t, e, r), r;
|
|
22895
22899
|
};
|
|
22896
22900
|
let he = class extends di {
|
|
22897
22901
|
constructor() {
|
|
22898
|
-
super(...arguments), this.numeratorFilter = { displayName: "", lapisFilter: {} }, this.denominatorFilter = {}, this.granularity = "day", this.smoothingWindow = 0, this.views = ["bar", "line", "bubble", "table"], this.confidenceIntervalMethods = ["wilson"], this.width = "100%", this.height = "700px", this.lapisDateField = "date", this.pageSize = !1, this.yAxisMaxLinear = 1, this.yAxisMaxLogarithmic = 1;
|
|
22902
|
+
super(...arguments), this.numeratorFilter = { displayName: "", lapisFilter: {} }, this.denominatorFilter = {}, this.granularity = "day", this.smoothingWindow = 0, this.views = ["bar", "line", "bubble", "table"], this.confidenceIntervalMethods = ["none", "wilson"], this.width = "100%", this.height = "700px", this.lapisDateField = "date", this.pageSize = !1, this.yAxisMaxLinear = 1, this.yAxisMaxLogarithmic = 1;
|
|
22899
22903
|
}
|
|
22900
22904
|
render() {
|
|
22901
22905
|
return /* @__PURE__ */ m(
|
|
@@ -23385,7 +23389,7 @@ const qW = ({ data: n, fields: t, pageSize: e }) => {
|
|
|
23385
23389
|
/* @__PURE__ */ m(ar, { componentName: "aggregate", params: n, lapisUrl: t })
|
|
23386
23390
|
] });
|
|
23387
23391
|
};
|
|
23388
|
-
var sS = Object.defineProperty, oS = Object.getOwnPropertyDescriptor,
|
|
23392
|
+
var sS = Object.defineProperty, oS = Object.getOwnPropertyDescriptor, Tn = (n, t, e, i) => {
|
|
23389
23393
|
for (var r = i > 1 ? void 0 : i ? oS(t, e) : t, s = n.length - 1, o; s >= 0; s--)
|
|
23390
23394
|
(o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
|
|
23391
23395
|
return i && r && sS(t, e, r), r;
|
|
@@ -23410,31 +23414,31 @@ let un = class extends di {
|
|
|
23410
23414
|
);
|
|
23411
23415
|
}
|
|
23412
23416
|
};
|
|
23413
|
-
|
|
23417
|
+
Tn([
|
|
23414
23418
|
C({ type: Array })
|
|
23415
23419
|
], un.prototype, "fields", 2);
|
|
23416
|
-
|
|
23420
|
+
Tn([
|
|
23417
23421
|
C({ type: Array })
|
|
23418
23422
|
], un.prototype, "views", 2);
|
|
23419
|
-
|
|
23423
|
+
Tn([
|
|
23420
23424
|
C({ type: Object })
|
|
23421
23425
|
], un.prototype, "filter", 2);
|
|
23422
|
-
|
|
23426
|
+
Tn([
|
|
23423
23427
|
C({ type: String })
|
|
23424
23428
|
], un.prototype, "width", 2);
|
|
23425
|
-
|
|
23429
|
+
Tn([
|
|
23426
23430
|
C({ type: String })
|
|
23427
23431
|
], un.prototype, "height", 2);
|
|
23428
|
-
|
|
23432
|
+
Tn([
|
|
23429
23433
|
C({ type: String })
|
|
23430
23434
|
], un.prototype, "initialSortField", 2);
|
|
23431
|
-
|
|
23435
|
+
Tn([
|
|
23432
23436
|
C({ type: String })
|
|
23433
23437
|
], un.prototype, "initialSortDirection", 2);
|
|
23434
|
-
|
|
23438
|
+
Tn([
|
|
23435
23439
|
C({ type: Object })
|
|
23436
23440
|
], un.prototype, "pageSize", 2);
|
|
23437
|
-
un =
|
|
23441
|
+
un = Tn([
|
|
23438
23442
|
ke("gs-aggregate")
|
|
23439
23443
|
], un);
|
|
23440
23444
|
const gl = (n, t) => {
|
|
@@ -23680,7 +23684,7 @@ const fS = (n) => {
|
|
|
23680
23684
|
)
|
|
23681
23685
|
] });
|
|
23682
23686
|
};
|
|
23683
|
-
var yS = Object.defineProperty, vS = Object.getOwnPropertyDescriptor,
|
|
23687
|
+
var yS = Object.defineProperty, vS = Object.getOwnPropertyDescriptor, zn = (n, t, e, i) => {
|
|
23684
23688
|
for (var r = i > 1 ? void 0 : i ? vS(t, e) : t, s = n.length - 1, o; s >= 0; s--)
|
|
23685
23689
|
(o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
|
|
23686
23690
|
return i && r && yS(t, e, r), r;
|
|
@@ -23705,34 +23709,34 @@ let hn = class extends di {
|
|
|
23705
23709
|
);
|
|
23706
23710
|
}
|
|
23707
23711
|
};
|
|
23708
|
-
|
|
23712
|
+
zn([
|
|
23709
23713
|
C({ type: Object })
|
|
23710
23714
|
], hn.prototype, "lapisFilter", 2);
|
|
23711
|
-
|
|
23715
|
+
zn([
|
|
23712
23716
|
C({ type: String })
|
|
23713
23717
|
], hn.prototype, "lapisDateField", 2);
|
|
23714
|
-
|
|
23718
|
+
zn([
|
|
23715
23719
|
C({ type: Array })
|
|
23716
23720
|
], hn.prototype, "views", 2);
|
|
23717
|
-
|
|
23721
|
+
zn([
|
|
23718
23722
|
C({ type: String })
|
|
23719
23723
|
], hn.prototype, "width", 2);
|
|
23720
|
-
|
|
23724
|
+
zn([
|
|
23721
23725
|
C({ type: String })
|
|
23722
23726
|
], hn.prototype, "height", 2);
|
|
23723
|
-
|
|
23727
|
+
zn([
|
|
23724
23728
|
C({ type: String })
|
|
23725
23729
|
], hn.prototype, "granularity", 2);
|
|
23726
|
-
|
|
23730
|
+
zn([
|
|
23727
23731
|
C({ type: Number })
|
|
23728
23732
|
], hn.prototype, "smoothingWindow", 2);
|
|
23729
|
-
|
|
23733
|
+
zn([
|
|
23730
23734
|
C({ type: Object })
|
|
23731
23735
|
], hn.prototype, "pageSize", 2);
|
|
23732
|
-
hn =
|
|
23736
|
+
hn = zn([
|
|
23733
23737
|
ke("gs-number-sequences-over-time")
|
|
23734
23738
|
], hn);
|
|
23735
|
-
const rg = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB4OyhmdW5jdGlvbihyKXtyLmFzc2VydEVxdWFsPXM9PnM7ZnVuY3Rpb24gZShzKXt9ci5hc3NlcnRJcz1lO2Z1bmN0aW9uIHQocyl7dGhyb3cgbmV3IEVycm9yfXIuYXNzZXJ0TmV2ZXI9dCxyLmFycmF5VG9FbnVtPXM9Pntjb25zdCBhPXt9O2Zvcihjb25zdCBpIG9mIHMpYVtpXT1pO3JldHVybiBhfSxyLmdldFZhbGlkRW51bVZhbHVlcz1zPT57Y29uc3QgYT1yLm9iamVjdEtleXMocykuZmlsdGVyKG89PnR5cGVvZiBzW3Nbb11dIT0ibnVtYmVyIiksaT17fTtmb3IoY29uc3QgbyBvZiBhKWlbb109c1tvXTtyZXR1cm4gci5vYmplY3RWYWx1ZXMoaSl9LHIub2JqZWN0VmFsdWVzPXM9PnIub2JqZWN0S2V5cyhzKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHNbYV19KSxyLm9iamVjdEtleXM9dHlwZW9mIE9iamVjdC5rZXlzPT0iZnVuY3Rpb24iP3M9Pk9iamVjdC5rZXlzKHMpOnM9Pntjb25zdCBhPVtdO2Zvcihjb25zdCBpIGluIHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsaSkmJmEucHVzaChpKTtyZXR1cm4gYX0sci5maW5kPShzLGEpPT57Zm9yKGNvbnN0IGkgb2YgcylpZihhKGkpKXJldHVybiBpfSxyLmlzSW50ZWdlcj10eXBlb2YgTnVtYmVyLmlzSW50ZWdlcj09ImZ1bmN0aW9uIj9zPT5OdW1iZXIuaXNJbnRlZ2VyKHMpOnM9PnR5cGVvZiBzPT0ibnVtYmVyIiYmaXNGaW5pdGUocykmJk1hdGguZmxvb3Iocyk9PT1zO2Z1bmN0aW9uIG4ocyxhPSIgfCAiKXtyZXR1cm4gcy5tYXAoaT0+dHlwZW9mIGk9PSJzdHJpbmciP2AnJHtpfSdgOmkpLmpvaW4oYSl9ci5qb2luVmFsdWVzPW4sci5qc29uU3RyaW5naWZ5UmVwbGFjZXI9KHMsYSk9PnR5cGVvZiBhPT0iYmlnaW50Ij9hLnRvU3RyaW5nKCk6YX0pKHh8fCh4PXt9KSk7dmFyIHJ0OyhmdW5jdGlvbihyKXtyLm1lcmdlU2hhcGVzPShlLHQpPT4oey4uLmUsLi4udH0pfSkocnR8fChydD17fSkpO2NvbnN0IGY9eC5hcnJheVRvRW51bShbInN0cmluZyIsIm5hbiIsIm51bWJlciIsImludGVnZXIiLCJmbG9hdCIsImJvb2xlYW4iLCJkYXRlIiwiYmlnaW50Iiwic3ltYm9sIiwiZnVuY3Rpb24iLCJ1bmRlZmluZWQiLCJudWxsIiwiYXJyYXkiLCJvYmplY3QiLCJ1bmtub3duIiwicHJvbWlzZSIsInZvaWQiLCJuZXZlciIsIm1hcCIsInNldCJdKSxCPXI9Pntzd2l0Y2godHlwZW9mIHIpe2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4gZi51bmRlZmluZWQ7Y2FzZSJzdHJpbmciOnJldHVybiBmLnN0cmluZztjYXNlIm51bWJlciI6cmV0dXJuIGlzTmFOKHIpP2YubmFuOmYubnVtYmVyO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGYuYm9vbGVhbjtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZi5mdW5jdGlvbjtjYXNlImJpZ2ludCI6cmV0dXJuIGYuYmlnaW50O2Nhc2Uic3ltYm9sIjpyZXR1cm4gZi5zeW1ib2w7Y2FzZSJvYmplY3QiOnJldHVybiBBcnJheS5pc0FycmF5KHIpP2YuYXJyYXk6cj09PW51bGw/Zi5udWxsOnIudGhlbiYmdHlwZW9mIHIudGhlbj09ImZ1bmN0aW9uIiYmci5jYXRjaCYmdHlwZW9mIHIuY2F0Y2g9PSJmdW5jdGlvbiI/Zi5wcm9taXNlOnR5cGVvZiBNYXA8InUiJiZyIGluc3RhbmNlb2YgTWFwP2YubWFwOnR5cGVvZiBTZXQ8InUiJiZyIGluc3RhbmNlb2YgU2V0P2Yuc2V0OnR5cGVvZiBEYXRlPCJ1IiYmciBpbnN0YW5jZW9mIERhdGU/Zi5kYXRlOmYub2JqZWN0O2RlZmF1bHQ6cmV0dXJuIGYudW5rbm93bn19LGQ9eC5hcnJheVRvRW51bShbImludmFsaWRfdHlwZSIsImludmFsaWRfbGl0ZXJhbCIsImN1c3RvbSIsImludmFsaWRfdW5pb24iLCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3IiLCJpbnZhbGlkX2VudW1fdmFsdWUiLCJ1bnJlY29nbml6ZWRfa2V5cyIsImludmFsaWRfYXJndW1lbnRzIiwiaW52YWxpZF9yZXR1cm5fdHlwZSIsImludmFsaWRfZGF0ZSIsImludmFsaWRfc3RyaW5nIiwidG9vX3NtYWxsIiwidG9vX2JpZyIsImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzIiwibm90X211bHRpcGxlX29mIiwibm90X2Zpbml0ZSJdKSxpcj1yPT5KU09OLnN0cmluZ2lmeShyLG51bGwsMikucmVwbGFjZSgvIihbXiJdKykiOi9nLCIkMToiKTtjbGFzcyBBIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzc3Vlcz1bXSx0aGlzLmFkZElzc3VlPW49Pnt0aGlzLmlzc3Vlcz1bLi4udGhpcy5pc3N1ZXMsbl19LHRoaXMuYWRkSXNzdWVzPShuPVtdKT0+e3RoaXMuaXNzdWVzPVsuLi50aGlzLmlzc3VlcywuLi5uXX07Y29uc3QgdD1uZXcudGFyZ2V0LnByb3RvdHlwZTtPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsdCk6dGhpcy5fX3Byb3RvX189dCx0aGlzLm5hbWU9IlpvZEVycm9yIix0aGlzLmlzc3Vlcz1lfWdldCBlcnJvcnMoKXtyZXR1cm4gdGhpcy5pc3N1ZXN9Zm9ybWF0KGUpe2NvbnN0IHQ9ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWVzc2FnZX0sbj17X2Vycm9yczpbXX0scz1hPT57Zm9yKGNvbnN0IGkgb2YgYS5pc3N1ZXMpaWYoaS5jb2RlPT09ImludmFsaWRfdW5pb24iKWkudW5pb25FcnJvcnMubWFwKHMpO2Vsc2UgaWYoaS5jb2RlPT09ImludmFsaWRfcmV0dXJuX3R5cGUiKXMoaS5yZXR1cm5UeXBlRXJyb3IpO2Vsc2UgaWYoaS5jb2RlPT09ImludmFsaWRfYXJndW1lbnRzIilzKGkuYXJndW1lbnRzRXJyb3IpO2Vsc2UgaWYoaS5wYXRoLmxlbmd0aD09PTApbi5fZXJyb3JzLnB1c2godChpKSk7ZWxzZXtsZXQgbz1uLGM9MDtmb3IoO2M8aS5wYXRoLmxlbmd0aDspe2NvbnN0IHU9aS5wYXRoW2NdO2M9PT1pLnBhdGgubGVuZ3RoLTE/KG9bdV09b1t1XXx8e19lcnJvcnM6W119LG9bdV0uX2Vycm9ycy5wdXNoKHQoaSkpKTpvW3VdPW9bdV18fHtfZXJyb3JzOltdfSxvPW9bdV0sYysrfX19O3JldHVybiBzKHRoaXMpLG59c3RhdGljIGFzc2VydChlKXtpZighKGUgaW5zdGFuY2VvZiBBKSl0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIFpvZEVycm9yOiAke2V9YCl9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5tZXNzYWdlfWdldCBtZXNzYWdlKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuaXNzdWVzLHguanNvblN0cmluZ2lmeVJlcGxhY2VyLDIpfWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aD09PTB9ZmxhdHRlbihlPXQ9PnQubWVzc2FnZSl7Y29uc3QgdD17fSxuPVtdO2Zvcihjb25zdCBzIG9mIHRoaXMuaXNzdWVzKXMucGF0aC5sZW5ndGg+MD8odFtzLnBhdGhbMF1dPXRbcy5wYXRoWzBdXXx8W10sdFtzLnBhdGhbMF1dLnB1c2goZShzKSkpOm4ucHVzaChlKHMpKTtyZXR1cm57Zm9ybUVycm9yczpuLGZpZWxkRXJyb3JzOnR9fWdldCBmb3JtRXJyb3JzKCl7cmV0dXJuIHRoaXMuZmxhdHRlbigpfX1BLmNyZWF0ZT1yPT5uZXcgQShyKTtjb25zdCBpZT0ocixlKT0+e2xldCB0O3N3aXRjaChyLmNvZGUpe2Nhc2UgZC5pbnZhbGlkX3R5cGU6ci5yZWNlaXZlZD09PWYudW5kZWZpbmVkP3Q9IlJlcXVpcmVkIjp0PWBFeHBlY3RlZCAke3IuZXhwZWN0ZWR9LCByZWNlaXZlZCAke3IucmVjZWl2ZWR9YDticmVhaztjYXNlIGQuaW52YWxpZF9saXRlcmFsOnQ9YEludmFsaWQgbGl0ZXJhbCB2YWx1ZSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShyLmV4cGVjdGVkLHguanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO2JyZWFrO2Nhc2UgZC51bnJlY29nbml6ZWRfa2V5czp0PWBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt4LmpvaW5WYWx1ZXMoci5rZXlzLCIsICIpfWA7YnJlYWs7Y2FzZSBkLmludmFsaWRfdW5pb246dD0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBkLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjp0PWBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7eC5qb2luVmFsdWVzKHIub3B0aW9ucyl9YDticmVhaztjYXNlIGQuaW52YWxpZF9lbnVtX3ZhbHVlOnQ9YEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt4LmpvaW5WYWx1ZXMoci5vcHRpb25zKX0sIHJlY2VpdmVkICcke3IucmVjZWl2ZWR9J2A7YnJlYWs7Y2FzZSBkLmludmFsaWRfYXJndW1lbnRzOnQ9IkludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzIjticmVhaztjYXNlIGQuaW52YWxpZF9yZXR1cm5fdHlwZTp0PSJJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlIjticmVhaztjYXNlIGQuaW52YWxpZF9kYXRlOnQ9IkludmFsaWQgZGF0ZSI7YnJlYWs7Y2FzZSBkLmludmFsaWRfc3RyaW5nOnR5cGVvZiByLnZhbGlkYXRpb249PSJvYmplY3QiPyJpbmNsdWRlcyJpbiByLnZhbGlkYXRpb24/KHQ9YEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSAiJHtyLnZhbGlkYXRpb24uaW5jbHVkZXN9ImAsdHlwZW9mIHIudmFsaWRhdGlvbi5wb3NpdGlvbj09Im51bWJlciImJih0PWAke3R9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtyLnZhbGlkYXRpb24ucG9zaXRpb259YCkpOiJzdGFydHNXaXRoImluIHIudmFsaWRhdGlvbj90PWBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggIiR7ci52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9ImA6ImVuZHNXaXRoImluIHIudmFsaWRhdGlvbj90PWBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoICIke3IudmFsaWRhdGlvbi5lbmRzV2l0aH0iYDp4LmFzc2VydE5ldmVyKHIudmFsaWRhdGlvbik6ci52YWxpZGF0aW9uIT09InJlZ2V4Ij90PWBJbnZhbGlkICR7ci52YWxpZGF0aW9ufWA6dD0iSW52YWxpZCI7YnJlYWs7Y2FzZSBkLnRvb19zbWFsbDpyLnR5cGU9PT0iYXJyYXkiP3Q9YEFycmF5IG11c3QgY29udGFpbiAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJhdCBsZWFzdCI6Im1vcmUgdGhhbiJ9ICR7ci5taW5pbXVtfSBlbGVtZW50KHMpYDpyLnR5cGU9PT0ic3RyaW5nIj90PWBTdHJpbmcgbXVzdCBjb250YWluICR7ci5leGFjdD8iZXhhY3RseSI6ci5pbmNsdXNpdmU/ImF0IGxlYXN0Ijoib3ZlciJ9ICR7ci5taW5pbXVtfSBjaGFyYWN0ZXIocylgOnIudHlwZT09PSJudW1iZXIiP3Q9YE51bWJlciBtdXN0IGJlICR7ci5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnIuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtyLm1pbmltdW19YDpyLnR5cGU9PT0iZGF0ZSI/dD1gRGF0ZSBtdXN0IGJlICR7ci5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnIuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtuZXcgRGF0ZShOdW1iZXIoci5taW5pbXVtKSl9YDp0PSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIGQudG9vX2JpZzpyLnR5cGU9PT0iYXJyYXkiP3Q9YEFycmF5IG11c3QgY29udGFpbiAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJhdCBtb3N0IjoibGVzcyB0aGFuIn0gJHtyLm1heGltdW19IGVsZW1lbnQocylgOnIudHlwZT09PSJzdHJpbmciP3Q9YFN0cmluZyBtdXN0IGNvbnRhaW4gJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8iYXQgbW9zdCI6InVuZGVyIn0gJHtyLm1heGltdW19IGNoYXJhY3RlcihzKWA6ci50eXBlPT09Im51bWJlciI/dD1gTnVtYmVyIG11c3QgYmUgJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8ibGVzcyB0aGFuIG9yIGVxdWFsIHRvIjoibGVzcyB0aGFuIn0gJHtyLm1heGltdW19YDpyLnR5cGU9PT0iYmlnaW50Ij90PWBCaWdJbnQgbXVzdCBiZSAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJsZXNzIHRoYW4gb3IgZXF1YWwgdG8iOiJsZXNzIHRoYW4ifSAke3IubWF4aW11bX1gOnIudHlwZT09PSJkYXRlIj90PWBEYXRlIG11c3QgYmUgJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8ic21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIjoic21hbGxlciB0aGFuIn0gJHtuZXcgRGF0ZShOdW1iZXIoci5tYXhpbXVtKSl9YDp0PSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIGQuY3VzdG9tOnQ9IkludmFsaWQgaW5wdXQiO2JyZWFrO2Nhc2UgZC5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczp0PSJJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkIjticmVhaztjYXNlIGQubm90X211bHRpcGxlX29mOnQ9YE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHtyLm11bHRpcGxlT2Z9YDticmVhaztjYXNlIGQubm90X2Zpbml0ZTp0PSJOdW1iZXIgbXVzdCBiZSBmaW5pdGUiO2JyZWFrO2RlZmF1bHQ6dD1lLmRlZmF1bHRFcnJvcix4LmFzc2VydE5ldmVyKHIpfXJldHVybnttZXNzYWdlOnR9fTtsZXQgX3Q9aWU7ZnVuY3Rpb24gb3Iocil7X3Q9cn1mdW5jdGlvbiBQZSgpe3JldHVybiBfdH1jb25zdCBWZT1yPT57Y29uc3R7ZGF0YTplLHBhdGg6dCxlcnJvck1hcHM6bixpc3N1ZURhdGE6c309cixhPVsuLi50LC4uLnMucGF0aHx8W11dLGk9ey4uLnMscGF0aDphfTtpZihzLm1lc3NhZ2UhPT12b2lkIDApcmV0dXJuey4uLnMscGF0aDphLG1lc3NhZ2U6cy5tZXNzYWdlfTtsZXQgbz0iIjtjb25zdCBjPW4uZmlsdGVyKHU9PiEhdSkuc2xpY2UoKS5yZXZlcnNlKCk7Zm9yKGNvbnN0IHUgb2YgYylvPXUoaSx7ZGF0YTplLGRlZmF1bHRFcnJvcjpvfSkubWVzc2FnZTtyZXR1cm57Li4ucyxwYXRoOmEsbWVzc2FnZTpvfX0sY3I9W107ZnVuY3Rpb24gaChyLGUpe2NvbnN0IHQ9UGUoKSxuPVZlKHtpc3N1ZURhdGE6ZSxkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxlcnJvck1hcHM6W3IuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxyLnNjaGVtYUVycm9yTWFwLHQsdD09PWllP3ZvaWQgMDppZV0uZmlsdGVyKHM9PiEhcyl9KTtyLmNvbW1vbi5pc3N1ZXMucHVzaChuKX1jbGFzcyBEe2NvbnN0cnVjdG9yKCl7dGhpcy52YWx1ZT0idmFsaWQifWRpcnR5KCl7dGhpcy52YWx1ZT09PSJ2YWxpZCImJih0aGlzLnZhbHVlPSJkaXJ0eSIpfWFib3J0KCl7dGhpcy52YWx1ZSE9PSJhYm9ydGVkIiYmKHRoaXMudmFsdWU9ImFib3J0ZWQiKX1zdGF0aWMgbWVyZ2VBcnJheShlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgdCl7aWYocy5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7cy5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksbi5wdXNoKHMudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpufX1zdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3QgYT1hd2FpdCBzLmtleSxpPWF3YWl0IHMudmFsdWU7bi5wdXNoKHtrZXk6YSx2YWx1ZTppfSl9cmV0dXJuIEQubWVyZ2VPYmplY3RTeW5jKGUsbil9c3RhdGljIG1lcmdlT2JqZWN0U3luYyhlLHQpe2NvbnN0IG49e307Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3R7a2V5OmEsdmFsdWU6aX09cztpZihhLnN0YXR1cz09PSJhYm9ydGVkInx8aS5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7YS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksaS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksYS52YWx1ZSE9PSJfX3Byb3RvX18iJiYodHlwZW9mIGkudmFsdWU8InUifHxzLmFsd2F5c1NldCkmJihuW2EudmFsdWVdPWkudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpufX19Y29uc3QgZz1PYmplY3QuZnJlZXplKHtzdGF0dXM6ImFib3J0ZWQifSksb2U9cj0+KHtzdGF0dXM6ImRpcnR5Iix2YWx1ZTpyfSksTz1yPT4oe3N0YXR1czoidmFsaWQiLHZhbHVlOnJ9KSxudD1yPT5yLnN0YXR1cz09PSJhYm9ydGVkIixzdD1yPT5yLnN0YXR1cz09PSJkaXJ0eSIseGU9cj0+ci5zdGF0dXM9PT0idmFsaWQiLGtlPXI9PnR5cGVvZiBQcm9taXNlPCJ1IiYmciBpbnN0YW5jZW9mIFByb21pc2U7ZnVuY3Rpb24gTGUocixlLHQsbil7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiI/ciE9PWV8fCFuOiFlLmhhcyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTtyZXR1cm4gZS5nZXQocil9ZnVuY3Rpb24geHQocixlLHQsbixzKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIj9yIT09ZXx8IXM6IWUuaGFzKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0Iik7cmV0dXJuIGUuc2V0KHIsdCksdH10eXBlb2YgU3VwcHJlc3NlZEVycm9yPT0iZnVuY3Rpb24iJiZTdXBwcmVzc2VkRXJyb3I7dmFyIHA7KGZ1bmN0aW9uKHIpe3IuZXJyVG9PYmo9ZT0+dHlwZW9mIGU9PSJzdHJpbmciP3ttZXNzYWdlOmV9OmV8fHt9LHIudG9TdHJpbmc9ZT0+dHlwZW9mIGU9PSJzdHJpbmciP2U6ZT09bnVsbD92b2lkIDA6ZS5tZXNzYWdlfSkocHx8KHA9e30pKTt2YXIgYmUsd2U7Y2xhc3MgWXtjb25zdHJ1Y3RvcihlLHQsbixzKXt0aGlzLl9jYWNoZWRQYXRoPVtdLHRoaXMucGFyZW50PWUsdGhpcy5kYXRhPXQsdGhpcy5fcGF0aD1uLHRoaXMuX2tleT1zfWdldCBwYXRoKCl7cmV0dXJuIHRoaXMuX2NhY2hlZFBhdGgubGVuZ3RofHwodGhpcy5fa2V5IGluc3RhbmNlb2YgQXJyYXk/dGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsLi4udGhpcy5fa2V5KTp0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCx0aGlzLl9rZXkpKSx0aGlzLl9jYWNoZWRQYXRofX1jb25zdCBrdD0ocixlKT0+e2lmKHhlKGUpKXJldHVybntzdWNjZXNzOiEwLGRhdGE6ZS52YWx1ZX07aWYoIXIuY29tbW9uLmlzc3Vlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLiIpO3JldHVybntzdWNjZXNzOiExLGdldCBlcnJvcigpe2lmKHRoaXMuX2Vycm9yKXJldHVybiB0aGlzLl9lcnJvcjtjb25zdCB0PW5ldyBBKHIuY29tbW9uLmlzc3Vlcyk7cmV0dXJuIHRoaXMuX2Vycm9yPXQsdGhpcy5fZXJyb3J9fX07ZnVuY3Rpb24gdihyKXtpZighcilyZXR1cm57fTtjb25zdHtlcnJvck1hcDplLGludmFsaWRfdHlwZV9lcnJvcjp0LHJlcXVpcmVkX2Vycm9yOm4sZGVzY3JpcHRpb246c309cjtpZihlJiYodHx8bikpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgImludmFsaWRfdHlwZV9lcnJvciIgb3IgInJlcXVpcmVkX2Vycm9yIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7cmV0dXJuIGU/e2Vycm9yTWFwOmUsZGVzY3JpcHRpb246c306e2Vycm9yTWFwOihpLG8pPT57dmFyIGMsdTtjb25zdHttZXNzYWdlOmx9PXI7cmV0dXJuIGkuY29kZT09PSJpbnZhbGlkX2VudW1fdmFsdWUiP3ttZXNzYWdlOmw/P28uZGVmYXVsdEVycm9yfTp0eXBlb2Ygby5kYXRhPiJ1Ij97bWVzc2FnZTooYz1sPz9uKSE9PW51bGwmJmMhPT12b2lkIDA/YzpvLmRlZmF1bHRFcnJvcn06aS5jb2RlIT09ImludmFsaWRfdHlwZSI/e21lc3NhZ2U6by5kZWZhdWx0RXJyb3J9OnttZXNzYWdlOih1PWw/P3QpIT09bnVsbCYmdSE9PXZvaWQgMD91Om8uZGVmYXVsdEVycm9yfX0sZGVzY3JpcHRpb246c319Y2xhc3MgX3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNwYT10aGlzLnNhZmVQYXJzZUFzeW5jLHRoaXMuX2RlZj1lLHRoaXMucGFyc2U9dGhpcy5wYXJzZS5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlPXRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyksdGhpcy5wYXJzZUFzeW5jPXRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlQXN5bmM9dGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc3BhPXRoaXMuc3BhLmJpbmQodGhpcyksdGhpcy5yZWZpbmU9dGhpcy5yZWZpbmUuYmluZCh0aGlzKSx0aGlzLnJlZmluZW1lbnQ9dGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyksdGhpcy5zdXBlclJlZmluZT10aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyksdGhpcy5vcHRpb25hbD10aGlzLm9wdGlvbmFsLmJpbmQodGhpcyksdGhpcy5udWxsYWJsZT10aGlzLm51bGxhYmxlLmJpbmQodGhpcyksdGhpcy5udWxsaXNoPXRoaXMubnVsbGlzaC5iaW5kKHRoaXMpLHRoaXMuYXJyYXk9dGhpcy5hcnJheS5iaW5kKHRoaXMpLHRoaXMucHJvbWlzZT10aGlzLnByb21pc2UuYmluZCh0aGlzKSx0aGlzLm9yPXRoaXMub3IuYmluZCh0aGlzKSx0aGlzLmFuZD10aGlzLmFuZC5iaW5kKHRoaXMpLHRoaXMudHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyksdGhpcy5icmFuZD10aGlzLmJyYW5kLmJpbmQodGhpcyksdGhpcy5kZWZhdWx0PXRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLHRoaXMuY2F0Y2g9dGhpcy5jYXRjaC5iaW5kKHRoaXMpLHRoaXMuZGVzY3JpYmU9dGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpLHRoaXMucGlwZT10aGlzLnBpcGUuYmluZCh0aGlzKSx0aGlzLnJlYWRvbmx5PXRoaXMucmVhZG9ubHkuYmluZCh0aGlzKSx0aGlzLmlzTnVsbGFibGU9dGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyksdGhpcy5pc09wdGlvbmFsPXRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb259X2dldFR5cGUoZSl7cmV0dXJuIEIoZS5kYXRhKX1fZ2V0T3JSZXR1cm5DdHgoZSx0KXtyZXR1cm4gdHx8e2NvbW1vbjplLnBhcmVudC5jb21tb24sZGF0YTplLmRhdGEscGFyc2VkVHlwZTpCKGUuZGF0YSksc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhdGg6ZS5wYXRoLHBhcmVudDplLnBhcmVudH19X3Byb2Nlc3NJbnB1dFBhcmFtcyhlKXtyZXR1cm57c3RhdHVzOm5ldyBELGN0eDp7Y29tbW9uOmUucGFyZW50LmNvbW1vbixkYXRhOmUuZGF0YSxwYXJzZWRUeXBlOkIoZS5kYXRhKSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGF0aDplLnBhdGgscGFyZW50OmUucGFyZW50fX19X3BhcnNlU3luYyhlKXtjb25zdCB0PXRoaXMuX3BhcnNlKGUpO2lmKGtlKHQpKXRocm93IG5ldyBFcnJvcigiU3luY2hyb25vdXMgcGFyc2UgZW5jb3VudGVyZWQgcHJvbWlzZS4iKTtyZXR1cm4gdH1fcGFyc2VBc3luYyhlKXtjb25zdCB0PXRoaXMuX3BhcnNlKGUpO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9cGFyc2UoZSx0KXtjb25zdCBuPXRoaXMuc2FmZVBhcnNlKGUsdCk7aWYobi5zdWNjZXNzKXJldHVybiBuLmRhdGE7dGhyb3cgbi5lcnJvcn1zYWZlUGFyc2UoZSx0KXt2YXIgbjtjb25zdCBzPXtjb21tb246e2lzc3VlczpbXSxhc3luYzoobj10PT1udWxsP3ZvaWQgMDp0LmFzeW5jKSE9PW51bGwmJm4hPT12b2lkIDA/bjohMSxjb250ZXh0dWFsRXJyb3JNYXA6dD09bnVsbD92b2lkIDA6dC5lcnJvck1hcH0scGF0aDoodD09bnVsbD92b2lkIDA6dC5wYXRoKXx8W10sc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhcmVudDpudWxsLGRhdGE6ZSxwYXJzZWRUeXBlOkIoZSl9LGE9dGhpcy5fcGFyc2VTeW5jKHtkYXRhOmUscGF0aDpzLnBhdGgscGFyZW50OnN9KTtyZXR1cm4ga3QocyxhKX1hc3luYyBwYXJzZUFzeW5jKGUsdCl7Y29uc3Qgbj1hd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGUsdCk7aWYobi5zdWNjZXNzKXJldHVybiBuLmRhdGE7dGhyb3cgbi5lcnJvcn1hc3luYyBzYWZlUGFyc2VBc3luYyhlLHQpe2NvbnN0IG49e2NvbW1vbjp7aXNzdWVzOltdLGNvbnRleHR1YWxFcnJvck1hcDp0PT1udWxsP3ZvaWQgMDp0LmVycm9yTWFwLGFzeW5jOiEwfSxwYXRoOih0PT1udWxsP3ZvaWQgMDp0LnBhdGgpfHxbXSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGFyZW50Om51bGwsZGF0YTplLHBhcnNlZFR5cGU6QihlKX0scz10aGlzLl9wYXJzZSh7ZGF0YTplLHBhdGg6bi5wYXRoLHBhcmVudDpufSksYT1hd2FpdChrZShzKT9zOlByb21pc2UucmVzb2x2ZShzKSk7cmV0dXJuIGt0KG4sYSl9cmVmaW5lKGUsdCl7Y29uc3Qgbj1zPT50eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PiJ1Ij97bWVzc2FnZTp0fTp0eXBlb2YgdD09ImZ1bmN0aW9uIj90KHMpOnQ7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHMsYSk9Pntjb25zdCBpPWUocyksbz0oKT0+YS5hZGRJc3N1ZSh7Y29kZTpkLmN1c3RvbSwuLi5uKHMpfSk7cmV0dXJuIHR5cGVvZiBQcm9taXNlPCJ1IiYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS50aGVuKGM9PmM/ITA6KG8oKSwhMSkpOmk/ITA6KG8oKSwhMSl9KX1yZWZpbmVtZW50KGUsdCl7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKG4scyk9PmUobik/ITA6KHMuYWRkSXNzdWUodHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChuLHMpOnQpLCExKSl9X3JlZmluZW1lbnQoZSl7cmV0dXJuIG5ldyBDKHtzY2hlbWE6dGhpcyx0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0Ont0eXBlOiJyZWZpbmVtZW50IixyZWZpbmVtZW50OmV9fSl9c3VwZXJSZWZpbmUoZSl7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoZSl9b3B0aW9uYWwoKXtyZXR1cm4gUC5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfW51bGxhYmxlKCl7cmV0dXJuIEouY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1udWxsaXNoKCl7cmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpfWFycmF5KCl7cmV0dXJuIFIuY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1wcm9taXNlKCl7cmV0dXJuIGxlLmNyZWF0ZSh0aGlzLHRoaXMuX2RlZil9b3IoZSl7cmV0dXJuIE1lLmNyZWF0ZShbdGhpcyxlXSx0aGlzLl9kZWYpfWFuZChlKXtyZXR1cm4gRGUuY3JlYXRlKHRoaXMsZSx0aGlzLl9kZWYpfXRyYW5zZm9ybShlKXtyZXR1cm4gbmV3IEMoey4uLnYodGhpcy5fZGVmKSxzY2hlbWE6dGhpcyx0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0Ont0eXBlOiJ0cmFuc2Zvcm0iLHRyYW5zZm9ybTplfX0pfWRlZmF1bHQoZSl7Y29uc3QgdD10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgUmUoey4uLnYodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxkZWZhdWx0VmFsdWU6dCx0eXBlTmFtZTp5LlpvZERlZmF1bHR9KX1icmFuZCgpe3JldHVybiBuZXcgb3Qoe3R5cGVOYW1lOnkuWm9kQnJhbmRlZCx0eXBlOnRoaXMsLi4udih0aGlzLl9kZWYpfSl9Y2F0Y2goZSl7Y29uc3QgdD10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgQ2Uoey4uLnYodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxjYXRjaFZhbHVlOnQsdHlwZU5hbWU6eS5ab2RDYXRjaH0pfWRlc2NyaWJlKGUpe2NvbnN0IHQ9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gbmV3IHQoey4uLnRoaXMuX2RlZixkZXNjcmlwdGlvbjplfSl9cGlwZShlKXtyZXR1cm4gWmUuY3JlYXRlKHRoaXMsZSl9cmVhZG9ubHkoKXtyZXR1cm4gSWUuY3JlYXRlKHRoaXMpfWlzT3B0aW9uYWwoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2Uodm9pZCAwKS5zdWNjZXNzfWlzTnVsbGFibGUoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2Vzc319Y29uc3QgdXI9L15jW15ccy1dezgsfSQvaSxkcj0vXlswLTlhLXpdKyQvLGxyPS9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvLGhyPS9eWzAtOWEtZkEtRl17OH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXsxMn0kL2ksZnI9L15bYS16MC05Xy1dezIxfSQvaSxtcj0vXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvLHByPS9eKD8hXC4pKD8hLipcLlwuKShbQS1aMC05XycrXC1cLl0qKVtBLVowLTlfKy1dQChbQS1aMC05XVtBLVowLTlcLV0qXC4pK1tBLVpdezIsfSQvaSx5cj0iXihcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXHB7RW1vamlfQ29tcG9uZW50fSkrJCI7bGV0IGF0O2NvbnN0IGdyPS9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkkLyx2cj0vXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKSQvLF9yPS9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLyxidD0iKChcXGRcXGRbMjQ2OF1bMDQ4XXxcXGRcXGRbMTM1NzldWzI2XXxcXGRcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXGR7NH0tKCgwWzEzNTc4XXwxWzAyXSktKDBbMS05XXxbMTJdXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXGR8MzApfCgwMiktKDBbMS05XXwxXFxkfDJbMC04XSkpKSIseHI9bmV3IFJlZ0V4cChgXiR7YnR9JGApO2Z1bmN0aW9uIHd0KHIpe2xldCBlPSIoWzAxXVxcZHwyWzAtM10pOlswLTVdXFxkOlswLTVdXFxkIjtyZXR1cm4gci5wcmVjaXNpb24/ZT1gJHtlfVxcLlxcZHske3IucHJlY2lzaW9ufX1gOnIucHJlY2lzaW9uPT1udWxsJiYoZT1gJHtlfShcXC5cXGQrKT9gKSxlfWZ1bmN0aW9uIGtyKHIpe3JldHVybiBuZXcgUmVnRXhwKGBeJHt3dChyKX0kYCl9ZnVuY3Rpb24gU3Qocil7bGV0IGU9YCR7YnR9VCR7d3Qocil9YDtjb25zdCB0PVtdO3JldHVybiB0LnB1c2goci5sb2NhbD8iWj8iOiJaIiksci5vZmZzZXQmJnQucHVzaCgiKFsrLV1cXGR7Mn06P1xcZHsyfSkiKSxlPWAke2V9KCR7dC5qb2luKCJ8Iil9KWAsbmV3IFJlZ0V4cChgXiR7ZX0kYCl9ZnVuY3Rpb24gYnIocixlKXtyZXR1cm4hISgoZT09PSJ2NCJ8fCFlKSYmZ3IudGVzdChyKXx8KGU9PT0idjYifHwhZSkmJnZyLnRlc3QocikpfWNsYXNzIEUgZXh0ZW5kcyBfe19wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPVN0cmluZyhlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5zdHJpbmcpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLnN0cmluZyxyZWNlaXZlZDphLnBhcnNlZFR5cGV9KSxnfWNvbnN0IG49bmV3IEQ7bGV0IHM7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fZGVmLmNoZWNrcylpZihhLmtpbmQ9PT0ibWluIillLmRhdGEubGVuZ3RoPGEudmFsdWUmJihzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk7ZWxzZSBpZihhLmtpbmQ9PT0ibWF4IillLmRhdGEubGVuZ3RoPmEudmFsdWUmJihzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOmEudmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09Imxlbmd0aCIpe2NvbnN0IGk9ZS5kYXRhLmxlbmd0aD5hLnZhbHVlLG89ZS5kYXRhLmxlbmd0aDxhLnZhbHVlOyhpfHxvKSYmKHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxpP2gocyx7Y29kZTpkLnRvb19iaWcsbWF4aW11bTphLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6YS5tZXNzYWdlfSk6byYmaChzLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMCxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSl9ZWxzZSBpZihhLmtpbmQ9PT0iZW1haWwiKXByLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImVtYWlsIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09ImVtb2ppIilhdHx8KGF0PW5ldyBSZWdFeHAoeXIsInUiKSksYXQudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoiZW1vamkiLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk7ZWxzZSBpZihhLmtpbmQ9PT0idXVpZCIpaHIudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoidXVpZCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJuYW5vaWQiKWZyLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246Im5hbm9pZCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJjdWlkIil1ci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJjdWlkIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09ImN1aWQyIilkci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJjdWlkMiIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJ1bGlkIilsci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJ1bGlkIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09InVybCIpdHJ5e25ldyBVUkwoZS5kYXRhKX1jYXRjaHtzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJ1cmwiLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKX1lbHNlIGEua2luZD09PSJyZWdleCI/KGEucmVnZXgubGFzdEluZGV4PTAsYS5yZWdleC50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJyZWdleCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKSk6YS5raW5kPT09InRyaW0iP2UuZGF0YT1lLmRhdGEudHJpbSgpOmEua2luZD09PSJpbmNsdWRlcyI/ZS5kYXRhLmluY2x1ZGVzKGEudmFsdWUsYS5wb3NpdGlvbil8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7aW5jbHVkZXM6YS52YWx1ZSxwb3NpdGlvbjphLnBvc2l0aW9ufSxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk6YS5raW5kPT09InRvTG93ZXJDYXNlIj9lLmRhdGE9ZS5kYXRhLnRvTG93ZXJDYXNlKCk6YS5raW5kPT09InRvVXBwZXJDYXNlIj9lLmRhdGE9ZS5kYXRhLnRvVXBwZXJDYXNlKCk6YS5raW5kPT09InN0YXJ0c1dpdGgiP2UuZGF0YS5zdGFydHNXaXRoKGEudmFsdWUpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e3N0YXJ0c1dpdGg6YS52YWx1ZX0sbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJlbmRzV2l0aCI/ZS5kYXRhLmVuZHNXaXRoKGEudmFsdWUpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e2VuZHNXaXRoOmEudmFsdWV9LG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTphLmtpbmQ9PT0iZGF0ZXRpbWUiP1N0KGEpLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse2NvZGU6ZC5pbnZhbGlkX3N0cmluZyx2YWxpZGF0aW9uOiJkYXRldGltZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJkYXRlIj94ci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoiZGF0ZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJ0aW1lIj9rcihhKS50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoidGltZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJkdXJhdGlvbiI/bXIudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoiZHVyYXRpb24iLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk6YS5raW5kPT09ImlwIj9icihlLmRhdGEsYS52ZXJzaW9uKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImlwIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJiYXNlNjQiP19yLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImJhc2U2NCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTp4LmFzc2VydE5ldmVyKGEpO3JldHVybntzdGF0dXM6bi52YWx1ZSx2YWx1ZTplLmRhdGF9fV9yZWdleChlLHQsbil7cmV0dXJuIHRoaXMucmVmaW5lbWVudChzPT5lLnRlc3Qocykse3ZhbGlkYXRpb246dCxjb2RlOmQuaW52YWxpZF9zdHJpbmcsLi4ucC5lcnJUb09iaihuKX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1lbWFpbChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImVtYWlsIiwuLi5wLmVyclRvT2JqKGUpfSl9dXJsKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidXJsIiwuLi5wLmVyclRvT2JqKGUpfSl9ZW1vamkoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJlbW9qaSIsLi4ucC5lcnJUb09iaihlKX0pfXV1aWQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJ1dWlkIiwuLi5wLmVyclRvT2JqKGUpfSl9bmFub2lkKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibmFub2lkIiwuLi5wLmVyclRvT2JqKGUpfSl9Y3VpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQiLC4uLnAuZXJyVG9PYmooZSl9KX1jdWlkMihlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQyIiwuLi5wLmVyclRvT2JqKGUpfSl9dWxpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6InVsaWQiLC4uLnAuZXJyVG9PYmooZSl9KX1iYXNlNjQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJiYXNlNjQiLC4uLnAuZXJyVG9PYmooZSl9KX1pcChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImlwIiwuLi5wLmVyclRvT2JqKGUpfSl9ZGF0ZXRpbWUoZSl7dmFyIHQsbjtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP3RoaXMuX2FkZENoZWNrKHtraW5kOiJkYXRldGltZSIscHJlY2lzaW9uOm51bGwsb2Zmc2V0OiExLGxvY2FsOiExLG1lc3NhZ2U6ZX0pOnRoaXMuX2FkZENoZWNrKHtraW5kOiJkYXRldGltZSIscHJlY2lzaW9uOnR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbik+InUiP251bGw6ZT09bnVsbD92b2lkIDA6ZS5wcmVjaXNpb24sb2Zmc2V0Oih0PWU9PW51bGw/dm9pZCAwOmUub2Zmc2V0KSE9PW51bGwmJnQhPT12b2lkIDA/dDohMSxsb2NhbDoobj1lPT1udWxsP3ZvaWQgMDplLmxvY2FsKSE9PW51bGwmJm4hPT12b2lkIDA/bjohMSwuLi5wLmVyclRvT2JqKGU9PW51bGw/dm9pZCAwOmUubWVzc2FnZSl9KX1kYXRlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZGF0ZSIsbWVzc2FnZTplfSl9dGltZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP3RoaXMuX2FkZENoZWNrKHtraW5kOiJ0aW1lIixwcmVjaXNpb246bnVsbCxtZXNzYWdlOmV9KTp0aGlzLl9hZGRDaGVjayh7a2luZDoidGltZSIscHJlY2lzaW9uOnR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbik+InUiP251bGw6ZT09bnVsbD92b2lkIDA6ZS5wcmVjaXNpb24sLi4ucC5lcnJUb09iaihlPT1udWxsP3ZvaWQgMDplLm1lc3NhZ2UpfSl9ZHVyYXRpb24oZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJkdXJhdGlvbiIsLi4ucC5lcnJUb09iaihlKX0pfXJlZ2V4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJyZWdleCIscmVnZXg6ZSwuLi5wLmVyclRvT2JqKHQpfSl9aW5jbHVkZXMoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImluY2x1ZGVzIix2YWx1ZTplLHBvc2l0aW9uOnQ9PW51bGw/dm9pZCAwOnQucG9zaXRpb24sLi4ucC5lcnJUb09iaih0PT1udWxsP3ZvaWQgMDp0Lm1lc3NhZ2UpfSl9c3RhcnRzV2l0aChlLHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoic3RhcnRzV2l0aCIsdmFsdWU6ZSwuLi5wLmVyclRvT2JqKHQpfSl9ZW5kc1dpdGgoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImVuZHNXaXRoIix2YWx1ZTplLC4uLnAuZXJyVG9PYmoodCl9KX1taW4oZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZSwuLi5wLmVyclRvT2JqKHQpfSl9bWF4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUsLi4ucC5lcnJUb09iaih0KX0pfWxlbmd0aChlLHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibGVuZ3RoIix2YWx1ZTplLC4uLnAuZXJyVG9PYmoodCl9KX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxwLmVyclRvT2JqKGUpKX10cmltKCl7cmV0dXJuIG5ldyBFKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOiJ0cmltIn1dfSl9dG9Mb3dlckNhc2UoKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvTG93ZXJDYXNlIn1dfSl9dG9VcHBlckNhc2UoKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvVXBwZXJDYXNlIn1dfSl9Z2V0IGlzRGF0ZXRpbWUoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iZGF0ZXRpbWUiKX1nZXQgaXNEYXRlKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImRhdGUiKX1nZXQgaXNUaW1lKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09InRpbWUiKX1nZXQgaXNEdXJhdGlvbigpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJkdXJhdGlvbiIpfWdldCBpc0VtYWlsKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImVtYWlsIil9Z2V0IGlzVVJMKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09InVybCIpfWdldCBpc0Vtb2ppKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImVtb2ppIil9Z2V0IGlzVVVJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1dWlkIil9Z2V0IGlzTkFOT0lEKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09Im5hbm9pZCIpfWdldCBpc0NVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iY3VpZCIpfWdldCBpc0NVSUQyKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImN1aWQyIil9Z2V0IGlzVUxJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1bGlkIil9Z2V0IGlzSVAoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaXAiKX1nZXQgaXNCYXNlNjQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iYmFzZTY0Iil9Z2V0IG1pbkxlbmd0aCgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWluIiYmKGU9PT1udWxsfHx0LnZhbHVlPmUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX1nZXQgbWF4TGVuZ3RoKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtYXgiJiYoZT09PW51bGx8fHQudmFsdWU8ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfX1FLmNyZWF0ZT1yPT57dmFyIGU7cmV0dXJuIG5ldyBFKHtjaGVja3M6W10sdHlwZU5hbWU6eS5ab2RTdHJpbmcsY29lcmNlOihlPXI9PW51bGw/dm9pZCAwOnIuY29lcmNlKSE9PW51bGwmJmUhPT12b2lkIDA/ZTohMSwuLi52KHIpfSl9O2Z1bmN0aW9uIHdyKHIsZSl7Y29uc3QgdD0oci50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgsbj0oZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgscz10Pm4/dDpuLGE9cGFyc2VJbnQoci50b0ZpeGVkKHMpLnJlcGxhY2UoIi4iLCIiKSksaT1wYXJzZUludChlLnRvRml4ZWQocykucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4gYSVpL01hdGgucG93KDEwLHMpfWNsYXNzIEggZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm1pbj10aGlzLmd0ZSx0aGlzLm1heD10aGlzLmx0ZSx0aGlzLnN0ZXA9dGhpcy5tdWx0aXBsZU9mfV9wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPU51bWJlcihlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5udW1iZXIpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLm51bWJlcixyZWNlaXZlZDphLnBhcnNlZFR5cGV9KSxnfWxldCBuO2NvbnN0IHM9bmV3IEQ7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fZGVmLmNoZWNrcylhLmtpbmQ9PT0iaW50Ij94LmlzSW50ZWdlcihlLmRhdGEpfHwobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDoiaW50ZWdlciIscmVjZWl2ZWQ6ImZsb2F0IixtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6YS5raW5kPT09Im1pbiI/KGEuaW5jbHVzaXZlP2UuZGF0YTxhLnZhbHVlOmUuZGF0YTw9YS52YWx1ZSkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJudW1iZXIiLGluY2x1c2l2ZTphLmluY2x1c2l2ZSxleGFjdDohMSxtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6YS5raW5kPT09Im1heCI/KGEuaW5jbHVzaXZlP2UuZGF0YT5hLnZhbHVlOmUuZGF0YT49YS52YWx1ZSkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOmEudmFsdWUsdHlwZToibnVtYmVyIixpbmNsdXNpdmU6YS5pbmNsdXNpdmUsZXhhY3Q6ITEsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJtdWx0aXBsZU9mIj93cihlLmRhdGEsYS52YWx1ZSkhPT0wJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLm5vdF9tdWx0aXBsZV9vZixtdWx0aXBsZU9mOmEudmFsdWUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJmaW5pdGUiP051bWJlci5pc0Zpbml0ZShlLmRhdGEpfHwobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLm5vdF9maW5pdGUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOnguYXNzZXJ0TmV2ZXIoYSk7cmV0dXJue3N0YXR1czpzLnZhbHVlLHZhbHVlOmUuZGF0YX19Z3RlKGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMCxwLnRvU3RyaW5nKHQpKX1ndChlLHQpe3JldHVybiB0aGlzLnNldExpbWl0KCJtaW4iLGUsITEscC50b1N0cmluZyh0KSl9bHRlKGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMCxwLnRvU3RyaW5nKHQpKX1sdChlLHQpe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLGUsITEscC50b1N0cmluZyh0KSl9c2V0TGltaXQoZSx0LG4scyl7cmV0dXJuIG5ldyBIKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOmUsdmFsdWU6dCxpbmNsdXNpdmU6bixtZXNzYWdlOnAudG9TdHJpbmcocyl9XX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEgoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1pbnQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJpbnQiLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfXBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTowLGluY2x1c2l2ZTohMSxtZXNzYWdlOnAudG9TdHJpbmcoZSl9KX1uZWdhdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6MCxpbmNsdXNpdmU6ITEsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9bm9ucG9zaXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOjAsaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbm5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTowLGluY2x1c2l2ZTohMCxtZXNzYWdlOnAudG9TdHJpbmcoZSl9KX1tdWx0aXBsZU9mKGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTplLG1lc3NhZ2U6cC50b1N0cmluZyh0KX0pfWZpbml0ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImZpbml0ZSIsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9c2FmZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsaW5jbHVzaXZlOiEwLHZhbHVlOk51bWJlci5NSU5fU0FGRV9JTlRFR0VSLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pLl9hZGRDaGVjayh7a2luZDoibWF4IixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHx0LnZhbHVlPGUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX1nZXQgaXNJbnQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaW50Inx8ZS5raW5kPT09Im11bHRpcGxlT2YiJiZ4LmlzSW50ZWdlcihlLnZhbHVlKSl9Z2V0IGlzRmluaXRlKCl7bGV0IGU9bnVsbCx0PW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyl7aWYobi5raW5kPT09ImZpbml0ZSJ8fG4ua2luZD09PSJpbnQifHxuLmtpbmQ9PT0ibXVsdGlwbGVPZiIpcmV0dXJuITA7bi5raW5kPT09Im1pbiI/KHQ9PT1udWxsfHxuLnZhbHVlPnQpJiYodD1uLnZhbHVlKTpuLmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHxuLnZhbHVlPGUpJiYoZT1uLnZhbHVlKX1yZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpJiZOdW1iZXIuaXNGaW5pdGUoZSl9fUguY3JlYXRlPXI9Pm5ldyBIKHtjaGVja3M6W10sdHlwZU5hbWU6eS5ab2ROdW1iZXIsY29lcmNlOihyPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSl8fCExLC4uLnYocil9KTtjbGFzcyBxIGV4dGVuZHMgX3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5taW49dGhpcy5ndGUsdGhpcy5tYXg9dGhpcy5sdGV9X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9QmlnSW50KGUuZGF0YSkpLHRoaXMuX2dldFR5cGUoZSkhPT1mLmJpZ2ludCl7Y29uc3QgYT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaChhLHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuYmlnaW50LHJlY2VpdmVkOmEucGFyc2VkVHlwZX0pLGd9bGV0IG47Y29uc3Qgcz1uZXcgRDtmb3IoY29uc3QgYSBvZiB0aGlzLl9kZWYuY2hlY2tzKWEua2luZD09PSJtaW4iPyhhLmluY2x1c2l2ZT9lLmRhdGE8YS52YWx1ZTplLmRhdGE8PWEudmFsdWUpJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLnRvb19zbWFsbCx0eXBlOiJiaWdpbnQiLG1pbmltdW06YS52YWx1ZSxpbmNsdXNpdmU6YS5pbmNsdXNpdmUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJtYXgiPyhhLmluY2x1c2l2ZT9lLmRhdGE+YS52YWx1ZTplLmRhdGE+PWEudmFsdWUpJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLnRvb19iaWcsdHlwZToiYmlnaW50IixtYXhpbXVtOmEudmFsdWUsaW5jbHVzaXZlOmEuaW5jbHVzaXZlLG1lc3NhZ2U6YS5tZXNzYWdlfSkscy5kaXJ0eSgpKTphLmtpbmQ9PT0ibXVsdGlwbGVPZiI/ZS5kYXRhJWEudmFsdWUhPT1CaWdJbnQoMCkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQubm90X211bHRpcGxlX29mLG11bHRpcGxlT2Y6YS52YWx1ZSxtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6eC5hc3NlcnROZXZlcihhKTtyZXR1cm57c3RhdHVzOnMudmFsdWUsdmFsdWU6ZS5kYXRhfX1ndGUoZSx0KXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIixlLCEwLHAudG9TdHJpbmcodCkpfWd0KGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMSxwLnRvU3RyaW5nKHQpKX1sdGUoZSx0KXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4IixlLCEwLHAudG9TdHJpbmcodCkpfWx0KGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMSxwLnRvU3RyaW5nKHQpKX1zZXRMaW1pdChlLHQsbixzKXtyZXR1cm4gbmV3IHEoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6ZSx2YWx1ZTp0LGluY2x1c2l2ZTpuLG1lc3NhZ2U6cC50b1N0cmluZyhzKX1dfSl9X2FkZENoZWNrKGUpe3JldHVybiBuZXcgcSh7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyxlXX0pfXBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbnBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbm5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW11bHRpcGxlT2YoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im11bHRpcGxlT2YiLHZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHx0LnZhbHVlPGUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX19cS5jcmVhdGU9cj0+e3ZhciBlO3JldHVybiBuZXcgcSh7Y2hlY2tzOltdLHR5cGVOYW1lOnkuWm9kQmlnSW50LGNvZXJjZTooZT1yPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSkhPT1udWxsJiZlIT09dm9pZCAwP2U6ITEsLi4udihyKX0pfTtjbGFzcyBTZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9ISFlLmRhdGEpLHRoaXMuX2dldFR5cGUoZSkhPT1mLmJvb2xlYW4pe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLmJvb2xlYW4scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm4gTyhlLmRhdGEpfX1TZS5jcmVhdGU9cj0+bmV3IFNlKHt0eXBlTmFtZTp5LlpvZEJvb2xlYW4sY29lcmNlOihyPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSl8fCExLC4uLnYocil9KTtjbGFzcyBLIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT1uZXcgRGF0ZShlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5kYXRlKXtjb25zdCBhPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKGEse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5kYXRlLHJlY2VpdmVkOmEucGFyc2VkVHlwZX0pLGd9aWYoaXNOYU4oZS5kYXRhLmdldFRpbWUoKSkpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfZGF0ZX0pLGd9Y29uc3Qgbj1uZXcgRDtsZXQgcztmb3IoY29uc3QgYSBvZiB0aGlzLl9kZWYuY2hlY2tzKWEua2luZD09PSJtaW4iP2UuZGF0YS5nZXRUaW1lKCk8YS52YWx1ZSYmKHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse2NvZGU6ZC50b29fc21hbGwsbWVzc2FnZTphLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1pbmltdW06YS52YWx1ZSx0eXBlOiJkYXRlIn0pLG4uZGlydHkoKSk6YS5raW5kPT09Im1heCI/ZS5kYXRhLmdldFRpbWUoKT5hLnZhbHVlJiYocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLnRvb19iaWcsbWVzc2FnZTphLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1heGltdW06YS52YWx1ZSx0eXBlOiJkYXRlIn0pLG4uZGlydHkoKSk6eC5hc3NlcnROZXZlcihhKTtyZXR1cm57c3RhdHVzOm4udmFsdWUsdmFsdWU6bmV3IERhdGUoZS5kYXRhLmdldFRpbWUoKSl9fV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEsoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1taW4oZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZS5nZXRUaW1lKCksbWVzc2FnZTpwLnRvU3RyaW5nKHQpfSl9bWF4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUuZ2V0VGltZSgpLG1lc3NhZ2U6cC50b1N0cmluZyh0KX0pfWdldCBtaW5EYXRlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlIT1udWxsP25ldyBEYXRlKGUpOm51bGx9Z2V0IG1heERhdGUoKXtsZXQgZT1udWxsO2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi5jaGVja3MpdC5raW5kPT09Im1heCImJihlPT09bnVsbHx8dC52YWx1ZTxlKSYmKGU9dC52YWx1ZSk7cmV0dXJuIGUhPW51bGw/bmV3IERhdGUoZSk6bnVsbH19Sy5jcmVhdGU9cj0+bmV3IEsoe2NoZWNrczpbXSxjb2VyY2U6KHI9PW51bGw/dm9pZCAwOnIuY29lcmNlKXx8ITEsdHlwZU5hbWU6eS5ab2REYXRlLC4uLnYocil9KTtjbGFzcyB6ZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1mLnN5bWJvbCl7Y29uc3Qgbj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaChuLHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuc3ltYm9sLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19emUuY3JlYXRlPXI9Pm5ldyB6ZSh7dHlwZU5hbWU6eS5ab2RTeW1ib2wsLi4udihyKX0pO2NsYXNzIFRlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYudW5kZWZpbmVkKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi51bmRlZmluZWQscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm4gTyhlLmRhdGEpfX1UZS5jcmVhdGU9cj0+bmV3IFRlKHt0eXBlTmFtZTp5LlpvZFVuZGVmaW5lZCwuLi52KHIpfSk7Y2xhc3MgJGUgZXh0ZW5kcyBfe19wYXJzZShlKXtpZih0aGlzLl9nZXRUeXBlKGUpIT09Zi5udWxsKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5udWxsLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19JGUuY3JlYXRlPXI9Pm5ldyAkZSh7dHlwZU5hbWU6eS5ab2ROdWxsLC4uLnYocil9KTtjbGFzcyBjZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2FueT0hMH1fcGFyc2UoZSl7cmV0dXJuIE8oZS5kYXRhKX19Y2UuY3JlYXRlPXI9Pm5ldyBjZSh7dHlwZU5hbWU6eS5ab2RBbnksLi4udihyKX0pO2NsYXNzIFEgZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl91bmtub3duPSEwfV9wYXJzZShlKXtyZXR1cm4gTyhlLmRhdGEpfX1RLmNyZWF0ZT1yPT5uZXcgUSh7dHlwZU5hbWU6eS5ab2RVbmtub3duLC4uLnYocil9KTtjbGFzcyBMIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYubmV2ZXIscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZ319TC5jcmVhdGU9cj0+bmV3IEwoe3R5cGVOYW1lOnkuWm9kTmV2ZXIsLi4udihyKX0pO2NsYXNzIFVlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYudW5kZWZpbmVkKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi52b2lkLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19VWUuY3JlYXRlPXI9Pm5ldyBVZSh7dHlwZU5hbWU6eS5ab2RWb2lkLC4uLnYocil9KTtjbGFzcyBSIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnQsc3RhdHVzOm59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxzPXRoaXMuX2RlZjtpZih0LnBhcnNlZFR5cGUhPT1mLmFycmF5KXJldHVybiBoKHQse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5hcnJheSxyZWNlaXZlZDp0LnBhcnNlZFR5cGV9KSxnO2lmKHMuZXhhY3RMZW5ndGghPT1udWxsKXtjb25zdCBpPXQuZGF0YS5sZW5ndGg+cy5leGFjdExlbmd0aC52YWx1ZSxvPXQuZGF0YS5sZW5ndGg8cy5leGFjdExlbmd0aC52YWx1ZTsoaXx8bykmJihoKHQse2NvZGU6aT9kLnRvb19iaWc6ZC50b29fc21hbGwsbWluaW11bTpvP3MuZXhhY3RMZW5ndGgudmFsdWU6dm9pZCAwLG1heGltdW06aT9zLmV4YWN0TGVuZ3RoLnZhbHVlOnZvaWQgMCx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6cy5leGFjdExlbmd0aC5tZXNzYWdlfSksbi5kaXJ0eSgpKX1pZihzLm1pbkxlbmd0aCE9PW51bGwmJnQuZGF0YS5sZW5ndGg8cy5taW5MZW5ndGgudmFsdWUmJihoKHQse2NvZGU6ZC50b29fc21hbGwsbWluaW11bTpzLm1pbkxlbmd0aC52YWx1ZSx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6cy5taW5MZW5ndGgubWVzc2FnZX0pLG4uZGlydHkoKSkscy5tYXhMZW5ndGghPT1udWxsJiZ0LmRhdGEubGVuZ3RoPnMubWF4TGVuZ3RoLnZhbHVlJiYoaCh0LHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOnMubWF4TGVuZ3RoLnZhbHVlLHR5cGU6ImFycmF5IixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTpzLm1heExlbmd0aC5tZXNzYWdlfSksbi5kaXJ0eSgpKSx0LmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5hbGwoWy4uLnQuZGF0YV0ubWFwKChpLG8pPT5zLnR5cGUuX3BhcnNlQXN5bmMobmV3IFkodCxpLHQucGF0aCxvKSkpKS50aGVuKGk9PkQubWVyZ2VBcnJheShuLGkpKTtjb25zdCBhPVsuLi50LmRhdGFdLm1hcCgoaSxvKT0+cy50eXBlLl9wYXJzZVN5bmMobmV3IFkodCxpLHQucGF0aCxvKSkpO3JldHVybiBELm1lcmdlQXJyYXkobixhKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX1taW4oZSx0KXtyZXR1cm4gbmV3IFIoey4uLnRoaXMuX2RlZixtaW5MZW5ndGg6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW1heChlLHQpe3JldHVybiBuZXcgUih7Li4udGhpcy5fZGVmLG1heExlbmd0aDp7dmFsdWU6ZSxtZXNzYWdlOnAudG9TdHJpbmcodCl9fSl9bGVuZ3RoKGUsdCl7cmV0dXJuIG5ldyBSKHsuLi50aGlzLl9kZWYsZXhhY3RMZW5ndGg6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW5vbmVtcHR5KGUpe3JldHVybiB0aGlzLm1pbigxLGUpfX1SLmNyZWF0ZT0ocixlKT0+bmV3IFIoe3R5cGU6cixtaW5MZW5ndGg6bnVsbCxtYXhMZW5ndGg6bnVsbCxleGFjdExlbmd0aDpudWxsLHR5cGVOYW1lOnkuWm9kQXJyYXksLi4udihlKX0pO2Z1bmN0aW9uIHVlKHIpe2lmKHIgaW5zdGFuY2VvZiBUKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IGluIHIuc2hhcGUpe2NvbnN0IG49ci5zaGFwZVt0XTtlW3RdPVAuY3JlYXRlKHVlKG4pKX1yZXR1cm4gbmV3IFQoey4uLnIuX2RlZixzaGFwZTooKT0+ZX0pfWVsc2UgcmV0dXJuIHIgaW5zdGFuY2VvZiBSP25ldyBSKHsuLi5yLl9kZWYsdHlwZTp1ZShyLmVsZW1lbnQpfSk6ciBpbnN0YW5jZW9mIFA/UC5jcmVhdGUodWUoci51bndyYXAoKSkpOnIgaW5zdGFuY2VvZiBKP0ouY3JlYXRlKHVlKHIudW53cmFwKCkpKTpyIGluc3RhbmNlb2YgVz9XLmNyZWF0ZShyLml0ZW1zLm1hcChlPT51ZShlKSkpOnJ9Y2xhc3MgVCBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2NhY2hlZD1udWxsLHRoaXMubm9uc3RyaWN0PXRoaXMucGFzc3Rocm91Z2gsdGhpcy5hdWdtZW50PXRoaXMuZXh0ZW5kfV9nZXRDYWNoZWQoKXtpZih0aGlzLl9jYWNoZWQhPT1udWxsKXJldHVybiB0aGlzLl9jYWNoZWQ7Y29uc3QgZT10aGlzLl9kZWYuc2hhcGUoKSx0PXgub2JqZWN0S2V5cyhlKTtyZXR1cm4gdGhpcy5fY2FjaGVkPXtzaGFwZTplLGtleXM6dH19X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1mLm9iamVjdCl7Y29uc3QgdT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh1LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYub2JqZWN0LHJlY2VpdmVkOnUucGFyc2VkVHlwZX0pLGd9Y29uc3R7c3RhdHVzOm4sY3R4OnN9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSx7c2hhcGU6YSxrZXlzOml9PXRoaXMuX2dldENhY2hlZCgpLG89W107aWYoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBMJiZ0aGlzLl9kZWYudW5rbm93bktleXM9PT0ic3RyaXAiKSlmb3IoY29uc3QgdSBpbiBzLmRhdGEpaS5pbmNsdWRlcyh1KXx8by5wdXNoKHUpO2NvbnN0IGM9W107Zm9yKGNvbnN0IHUgb2YgaSl7Y29uc3QgbD1hW3VdLGs9cy5kYXRhW3VdO2MucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTp1fSx2YWx1ZTpsLl9wYXJzZShuZXcgWShzLGsscy5wYXRoLHUpKSxhbHdheXNTZXQ6dSBpbiBzLmRhdGF9KX1pZih0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBMKXtjb25zdCB1PXRoaXMuX2RlZi51bmtub3duS2V5cztpZih1PT09InBhc3N0aHJvdWdoIilmb3IoY29uc3QgbCBvZiBvKWMucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTpsfSx2YWx1ZTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6cy5kYXRhW2xdfX0pO2Vsc2UgaWYodT09PSJzdHJpY3QiKW8ubGVuZ3RoPjAmJihoKHMse2NvZGU6ZC51bnJlY29nbml6ZWRfa2V5cyxrZXlzOm99KSxuLmRpcnR5KCkpO2Vsc2UgaWYodSE9PSJzdHJpcCIpdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuIil9ZWxzZXtjb25zdCB1PXRoaXMuX2RlZi5jYXRjaGFsbDtmb3IoY29uc3QgbCBvZiBvKXtjb25zdCBrPXMuZGF0YVtsXTtjLnB1c2goe2tleTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6bH0sdmFsdWU6dS5fcGFyc2UobmV3IFkocyxrLHMucGF0aCxsKSksYWx3YXlzU2V0OmwgaW4gcy5kYXRhfSl9fXJldHVybiBzLmNvbW1vbi5hc3luYz9Qcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jKCk9Pntjb25zdCB1PVtdO2Zvcihjb25zdCBsIG9mIGMpe2NvbnN0IGs9YXdhaXQgbC5rZXksUz1hd2FpdCBsLnZhbHVlO3UucHVzaCh7a2V5OmssdmFsdWU6UyxhbHdheXNTZXQ6bC5hbHdheXNTZXR9KX1yZXR1cm4gdX0pLnRoZW4odT0+RC5tZXJnZU9iamVjdFN5bmMobix1KSk6RC5tZXJnZU9iamVjdFN5bmMobixjKX1nZXQgc2hhcGUoKXtyZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCl9c3RyaWN0KGUpe3JldHVybiBwLmVyclRvT2JqLG5ldyBUKHsuLi50aGlzLl9kZWYsdW5rbm93bktleXM6InN0cmljdCIsLi4uZSE9PXZvaWQgMD97ZXJyb3JNYXA6KHQsbik9Pnt2YXIgcyxhLGksbztjb25zdCBjPShpPShhPShzPXRoaXMuX2RlZikuZXJyb3JNYXApPT09bnVsbHx8YT09PXZvaWQgMD92b2lkIDA6YS5jYWxsKHMsdCxuKS5tZXNzYWdlKSE9PW51bGwmJmkhPT12b2lkIDA/aTpuLmRlZmF1bHRFcnJvcjtyZXR1cm4gdC5jb2RlPT09InVucmVjb2duaXplZF9rZXlzIj97bWVzc2FnZToobz1wLmVyclRvT2JqKGUpLm1lc3NhZ2UpIT09bnVsbCYmbyE9PXZvaWQgMD9vOmN9OnttZXNzYWdlOmN9fX06e319KX1zdHJpcCgpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJzdHJpcCJ9KX1wYXNzdGhyb3VnaCgpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJwYXNzdGhyb3VnaCJ9KX1leHRlbmQoZSl7cmV0dXJuIG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9Pih7Li4udGhpcy5fZGVmLnNoYXBlKCksLi4uZX0pfSl9bWVyZ2UoZSl7cmV0dXJuIG5ldyBUKHt1bmtub3duS2V5czplLl9kZWYudW5rbm93bktleXMsY2F0Y2hhbGw6ZS5fZGVmLmNhdGNoYWxsLHNoYXBlOigpPT4oey4uLnRoaXMuX2RlZi5zaGFwZSgpLC4uLmUuX2RlZi5zaGFwZSgpfSksdHlwZU5hbWU6eS5ab2RPYmplY3R9KX1zZXRLZXkoZSx0KXtyZXR1cm4gdGhpcy5hdWdtZW50KHtbZV06dH0pfWNhdGNoYWxsKGUpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLGNhdGNoYWxsOmV9KX1waWNrKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyhlKS5mb3JFYWNoKG49PntlW25dJiZ0aGlzLnNoYXBlW25dJiYodFtuXT10aGlzLnNoYXBlW25dKX0pLG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9PnR9KX1vbWl0KGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49PntlW25dfHwodFtuXT10aGlzLnNoYXBlW25dKX0pLG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9PnR9KX1kZWVwUGFydGlhbCgpe3JldHVybiB1ZSh0aGlzKX1wYXJ0aWFsKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49Pntjb25zdCBzPXRoaXMuc2hhcGVbbl07ZSYmIWVbbl0/dFtuXT1zOnRbbl09cy5vcHRpb25hbCgpfSksbmV3IFQoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+dH0pfXJlcXVpcmVkKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49PntpZihlJiYhZVtuXSl0W25dPXRoaXMuc2hhcGVbbl07ZWxzZXtsZXQgYT10aGlzLnNoYXBlW25dO2Zvcig7YSBpbnN0YW5jZW9mIFA7KWE9YS5fZGVmLmlubmVyVHlwZTt0W25dPWF9fSksbmV3IFQoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+dH0pfWtleW9mKCl7cmV0dXJuIFR0KHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSl9fVQuY3JlYXRlPShyLGUpPT5uZXcgVCh7c2hhcGU6KCk9PnIsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpMLmNyZWF0ZSgpLHR5cGVOYW1lOnkuWm9kT2JqZWN0LC4uLnYoZSl9KSxULnN0cmljdENyZWF0ZT0ocixlKT0+bmV3IFQoe3NoYXBlOigpPT5yLHVua25vd25LZXlzOiJzdHJpY3QiLGNhdGNoYWxsOkwuY3JlYXRlKCksdHlwZU5hbWU6eS5ab2RPYmplY3QsLi4udihlKX0pLFQubGF6eWNyZWF0ZT0ocixlKT0+bmV3IFQoe3NoYXBlOnIsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpMLmNyZWF0ZSgpLHR5cGVOYW1lOnkuWm9kT2JqZWN0LC4uLnYoZSl9KTtjbGFzcyBNZSBleHRlbmRzIF97X3BhcnNlKGUpe2NvbnN0e2N0eDp0fT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksbj10aGlzLl9kZWYub3B0aW9ucztmdW5jdGlvbiBzKGEpe2Zvcihjb25zdCBvIG9mIGEpaWYoby5yZXN1bHQuc3RhdHVzPT09InZhbGlkIilyZXR1cm4gby5yZXN1bHQ7Zm9yKGNvbnN0IG8gb2YgYSlpZihvLnJlc3VsdC5zdGF0dXM9PT0iZGlydHkiKXJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5vLmN0eC5jb21tb24uaXNzdWVzKSxvLnJlc3VsdDtjb25zdCBpPWEubWFwKG89Pm5ldyBBKG8uY3R4LmNvbW1vbi5pc3N1ZXMpKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczppfSksZ31pZih0LmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5hbGwobi5tYXAoYXN5bmMgYT0+e2NvbnN0IGk9ey4uLnQsY29tbW9uOnsuLi50LmNvbW1vbixpc3N1ZXM6W119LHBhcmVudDpudWxsfTtyZXR1cm57cmVzdWx0OmF3YWl0IGEuX3BhcnNlQXN5bmMoe2RhdGE6dC5kYXRhLHBhdGg6dC5wYXRoLHBhcmVudDppfSksY3R4Oml9fSkpLnRoZW4ocyk7e2xldCBhO2NvbnN0IGk9W107Zm9yKGNvbnN0IGMgb2Ygbil7Y29uc3QgdT17Li4udCxjb21tb246ey4uLnQuY29tbW9uLGlzc3VlczpbXX0scGFyZW50Om51bGx9LGw9Yy5fcGFyc2VTeW5jKHtkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxwYXJlbnQ6dX0pO2lmKGwuc3RhdHVzPT09InZhbGlkIilyZXR1cm4gbDtsLnN0YXR1cz09PSJkaXJ0eSImJiFhJiYoYT17cmVzdWx0OmwsY3R4OnV9KSx1LmNvbW1vbi5pc3N1ZXMubGVuZ3RoJiZpLnB1c2godS5jb21tb24uaXNzdWVzKX1pZihhKXJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5hLmN0eC5jb21tb24uaXNzdWVzKSxhLnJlc3VsdDtjb25zdCBvPWkubWFwKGM9Pm5ldyBBKGMpKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpvfSksZ319Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnN9fU1lLmNyZWF0ZT0ocixlKT0+bmV3IE1lKHtvcHRpb25zOnIsdHlwZU5hbWU6eS5ab2RVbmlvbiwuLi52KGUpfSk7Y29uc3Qgej1yPT5yIGluc3RhbmNlb2YgTmU/eihyLnNjaGVtYSk6ciBpbnN0YW5jZW9mIEM/eihyLmlubmVyVHlwZSgpKTpyIGluc3RhbmNlb2YgQWU/W3IudmFsdWVdOnIgaW5zdGFuY2VvZiBHP3Iub3B0aW9uczpyIGluc3RhbmNlb2YgRWU/eC5vYmplY3RWYWx1ZXMoci5lbnVtKTpyIGluc3RhbmNlb2YgUmU/eihyLl9kZWYuaW5uZXJUeXBlKTpyIGluc3RhbmNlb2YgVGU/W3ZvaWQgMF06ciBpbnN0YW5jZW9mICRlP1tudWxsXTpyIGluc3RhbmNlb2YgUD9bdm9pZCAwLC4uLnooci51bndyYXAoKSldOnIgaW5zdGFuY2VvZiBKP1tudWxsLC4uLnooci51bndyYXAoKSldOnIgaW5zdGFuY2VvZiBvdHx8ciBpbnN0YW5jZW9mIEllP3ooci51bndyYXAoKSk6ciBpbnN0YW5jZW9mIENlP3ooci5fZGVmLmlubmVyVHlwZSk6W107Y2xhc3MgRmUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKHQucGFyc2VkVHlwZSE9PWYub2JqZWN0KXJldHVybiBoKHQse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5vYmplY3QscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZztjb25zdCBuPXRoaXMuZGlzY3JpbWluYXRvcixzPXQuZGF0YVtuXSxhPXRoaXMub3B0aW9uc01hcC5nZXQocyk7cmV0dXJuIGE/dC5jb21tb24uYXN5bmM/YS5fcGFyc2VBc3luYyh7ZGF0YTp0LmRhdGEscGF0aDp0LnBhdGgscGFyZW50OnR9KTphLl9wYXJzZVN5bmMoe2RhdGE6dC5kYXRhLHBhdGg6dC5wYXRoLHBhcmVudDp0fSk6KGgodCx7Y29kZTpkLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixvcHRpb25zOkFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSkscGF0aDpbbl19KSxnKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcn1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc31nZXQgb3B0aW9uc01hcCgpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcH1zdGF0aWMgY3JlYXRlKGUsdCxuKXtjb25zdCBzPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgdCl7Y29uc3QgaT16KGEuc2hhcGVbZV0pO2lmKCFpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxgJHtlfVxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtmb3IoY29uc3QgbyBvZiBpKXtpZihzLmhhcyhvKSl0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZSl9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcobyl9YCk7cy5zZXQobyxhKX19cmV0dXJuIG5ldyBGZSh7dHlwZU5hbWU6eS5ab2REaXNjcmltaW5hdGVkVW5pb24sZGlzY3JpbWluYXRvcjplLG9wdGlvbnM6dCxvcHRpb25zTWFwOnMsLi4udihuKX0pfX1mdW5jdGlvbiBpdChyLGUpe2NvbnN0IHQ9QihyKSxuPUIoZSk7aWYocj09PWUpcmV0dXJue3ZhbGlkOiEwLGRhdGE6cn07aWYodD09PWYub2JqZWN0JiZuPT09Zi5vYmplY3Qpe2NvbnN0IHM9eC5vYmplY3RLZXlzKGUpLGE9eC5vYmplY3RLZXlzKHIpLmZpbHRlcihvPT5zLmluZGV4T2YobykhPT0tMSksaT17Li4uciwuLi5lfTtmb3IoY29uc3QgbyBvZiBhKXtjb25zdCBjPWl0KHJbb10sZVtvXSk7aWYoIWMudmFsaWQpcmV0dXJue3ZhbGlkOiExfTtpW29dPWMuZGF0YX1yZXR1cm57dmFsaWQ6ITAsZGF0YTppfX1lbHNlIGlmKHQ9PT1mLmFycmF5JiZuPT09Zi5hcnJheSl7aWYoci5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm57dmFsaWQ6ITF9O2NvbnN0IHM9W107Zm9yKGxldCBhPTA7YTxyLmxlbmd0aDthKyspe2NvbnN0IGk9clthXSxvPWVbYV0sYz1pdChpLG8pO2lmKCFjLnZhbGlkKXJldHVybnt2YWxpZDohMX07cy5wdXNoKGMuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6c319ZWxzZSByZXR1cm4gdD09PWYuZGF0ZSYmbj09PWYuZGF0ZSYmK3I9PStlP3t2YWxpZDohMCxkYXRhOnJ9Ont2YWxpZDohMX19Y2xhc3MgRGUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHM9KGEsaSk9PntpZihudChhKXx8bnQoaSkpcmV0dXJuIGc7Y29uc3Qgbz1pdChhLnZhbHVlLGkudmFsdWUpO3JldHVybiBvLnZhbGlkPygoc3QoYSl8fHN0KGkpKSYmdC5kaXJ0eSgpLHtzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvLmRhdGF9KTooaChuLHtjb2RlOmQuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXN9KSxnKX07cmV0dXJuIG4uY29tbW9uLmFzeW5jP1Byb21pc2UuYWxsKFt0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KSx0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSldKS50aGVuKChbYSxpXSk9PnMoYSxpKSk6cyh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pLHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pKX19RGUuY3JlYXRlPShyLGUsdCk9Pm5ldyBEZSh7bGVmdDpyLHJpZ2h0OmUsdHlwZU5hbWU6eS5ab2RJbnRlcnNlY3Rpb24sLi4udih0KX0pO2NsYXNzIFcgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYuYXJyYXkpcmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLmFycmF5LHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGc7aWYobi5kYXRhLmxlbmd0aDx0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKXJldHVybiBoKG4se2NvZGU6ZC50b29fc21hbGwsbWluaW11bTp0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLGluY2x1c2l2ZTohMCxleGFjdDohMSx0eXBlOiJhcnJheSJ9KSxnOyF0aGlzLl9kZWYucmVzdCYmbi5kYXRhLmxlbmd0aD50aGlzLl9kZWYuaXRlbXMubGVuZ3RoJiYoaChuLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLHQuZGlydHkoKSk7Y29uc3QgYT1bLi4ubi5kYXRhXS5tYXAoKGksbyk9Pntjb25zdCBjPXRoaXMuX2RlZi5pdGVtc1tvXXx8dGhpcy5fZGVmLnJlc3Q7cmV0dXJuIGM/Yy5fcGFyc2UobmV3IFkobixpLG4ucGF0aCxvKSk6bnVsbH0pLmZpbHRlcihpPT4hIWkpO3JldHVybiBuLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChhKS50aGVuKGk9PkQubWVyZ2VBcnJheSh0LGkpKTpELm1lcmdlQXJyYXkodCxhKX1nZXQgaXRlbXMoKXtyZXR1cm4gdGhpcy5fZGVmLml0ZW1zfXJlc3QoZSl7cmV0dXJuIG5ldyBXKHsuLi50aGlzLl9kZWYscmVzdDplfSl9fVcuY3JlYXRlPShyLGUpPT57aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKSIpO3JldHVybiBuZXcgVyh7aXRlbXM6cix0eXBlTmFtZTp5LlpvZFR1cGxlLHJlc3Q6bnVsbCwuLi52KGUpfSl9O2NsYXNzIE9lIGV4dGVuZHMgX3tnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYub2JqZWN0KXJldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5vYmplY3QscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZztjb25zdCBzPVtdLGE9dGhpcy5fZGVmLmtleVR5cGUsaT10aGlzLl9kZWYudmFsdWVUeXBlO2Zvcihjb25zdCBvIGluIG4uZGF0YSlzLnB1c2goe2tleTphLl9wYXJzZShuZXcgWShuLG8sbi5wYXRoLG8pKSx2YWx1ZTppLl9wYXJzZShuZXcgWShuLG4uZGF0YVtvXSxuLnBhdGgsbykpLGFsd2F5c1NldDpvIGluIG4uZGF0YX0pO3JldHVybiBuLmNvbW1vbi5hc3luYz9ELm1lcmdlT2JqZWN0QXN5bmModCxzKTpELm1lcmdlT2JqZWN0U3luYyh0LHMpfWdldCBlbGVtZW50KCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGV9c3RhdGljIGNyZWF0ZShlLHQsbil7cmV0dXJuIHQgaW5zdGFuY2VvZiBfP25ldyBPZSh7a2V5VHlwZTplLHZhbHVlVHlwZTp0LHR5cGVOYW1lOnkuWm9kUmVjb3JkLC4uLnYobil9KTpuZXcgT2Uoe2tleVR5cGU6RS5jcmVhdGUoKSx2YWx1ZVR5cGU6ZSx0eXBlTmFtZTp5LlpvZFJlY29yZCwuLi52KHQpfSl9fWNsYXNzIEJlIGV4dGVuZHMgX3tnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYubWFwKXJldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5tYXAscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZztjb25zdCBzPXRoaXMuX2RlZi5rZXlUeXBlLGE9dGhpcy5fZGVmLnZhbHVlVHlwZSxpPVsuLi5uLmRhdGEuZW50cmllcygpXS5tYXAoKFtvLGNdLHUpPT4oe2tleTpzLl9wYXJzZShuZXcgWShuLG8sbi5wYXRoLFt1LCJrZXkiXSkpLHZhbHVlOmEuX3BhcnNlKG5ldyBZKG4sYyxuLnBhdGgsW3UsInZhbHVlIl0pKX0pKTtpZihuLmNvbW1vbi5hc3luYyl7Y29uc3Qgbz1uZXcgTWFwO3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jKCk9Pntmb3IoY29uc3QgYyBvZiBpKXtjb25zdCB1PWF3YWl0IGMua2V5LGw9YXdhaXQgYy52YWx1ZTtpZih1LnN0YXR1cz09PSJhYm9ydGVkInx8bC5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7KHUuc3RhdHVzPT09ImRpcnR5Inx8bC5zdGF0dXM9PT0iZGlydHkiKSYmdC5kaXJ0eSgpLG8uc2V0KHUudmFsdWUsbC52YWx1ZSl9cmV0dXJue3N0YXR1czp0LnZhbHVlLHZhbHVlOm99fSl9ZWxzZXtjb25zdCBvPW5ldyBNYXA7Zm9yKGNvbnN0IGMgb2YgaSl7Y29uc3QgdT1jLmtleSxsPWMudmFsdWU7aWYodS5zdGF0dXM9PT0iYWJvcnRlZCJ8fGwuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiBnOyh1LnN0YXR1cz09PSJkaXJ0eSJ8fGwuc3RhdHVzPT09ImRpcnR5IikmJnQuZGlydHkoKSxvLnNldCh1LnZhbHVlLGwudmFsdWUpfXJldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfX19fUJlLmNyZWF0ZT0ocixlLHQpPT5uZXcgQmUoe3ZhbHVlVHlwZTplLGtleVR5cGU6cix0eXBlTmFtZTp5LlpvZE1hcCwuLi52KHQpfSk7Y2xhc3MgWCBleHRlbmRzIF97X3BhcnNlKGUpe2NvbnN0e3N0YXR1czp0LGN0eDpufT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYobi5wYXJzZWRUeXBlIT09Zi5zZXQpcmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLnNldCxyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSxnO2NvbnN0IHM9dGhpcy5fZGVmO3MubWluU2l6ZSE9PW51bGwmJm4uZGF0YS5zaXplPHMubWluU2l6ZS52YWx1ZSYmKGgobix7Y29kZTpkLnRvb19zbWFsbCxtaW5pbXVtOnMubWluU2l6ZS52YWx1ZSx0eXBlOiJzZXQiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOnMubWluU2l6ZS5tZXNzYWdlfSksdC5kaXJ0eSgpKSxzLm1heFNpemUhPT1udWxsJiZuLmRhdGEuc2l6ZT5zLm1heFNpemUudmFsdWUmJihoKG4se2NvZGU6ZC50b29fYmlnLG1heGltdW06cy5tYXhTaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6cy5tYXhTaXplLm1lc3NhZ2V9KSx0LmRpcnR5KCkpO2NvbnN0IGE9dGhpcy5fZGVmLnZhbHVlVHlwZTtmdW5jdGlvbiBpKGMpe2NvbnN0IHU9bmV3IFNldDtmb3IoY29uc3QgbCBvZiBjKXtpZihsLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZztsLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSx1LmFkZChsLnZhbHVlKX1yZXR1cm57c3RhdHVzOnQudmFsdWUsdmFsdWU6dX19Y29uc3Qgbz1bLi4ubi5kYXRhLnZhbHVlcygpXS5tYXAoKGMsdSk9PmEuX3BhcnNlKG5ldyBZKG4sYyxuLnBhdGgsdSkpKTtyZXR1cm4gbi5jb21tb24uYXN5bmM/UHJvbWlzZS5hbGwobykudGhlbihjPT5pKGMpKTppKG8pfW1pbihlLHQpe3JldHVybiBuZXcgWCh7Li4udGhpcy5fZGVmLG1pblNpemU6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW1heChlLHQpe3JldHVybiBuZXcgWCh7Li4udGhpcy5fZGVmLG1heFNpemU6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfXNpemUoZSx0KXtyZXR1cm4gdGhpcy5taW4oZSx0KS5tYXgoZSx0KX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxlKX19WC5jcmVhdGU9KHIsZSk9Pm5ldyBYKHt2YWx1ZVR5cGU6cixtaW5TaXplOm51bGwsbWF4U2l6ZTpudWxsLHR5cGVOYW1lOnkuWm9kU2V0LC4uLnYoZSl9KTtjbGFzcyBkZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMudmFsaWRhdGU9dGhpcy5pbXBsZW1lbnR9X3BhcnNlKGUpe2NvbnN0e2N0eDp0fT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYodC5wYXJzZWRUeXBlIT09Zi5mdW5jdGlvbilyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuZnVuY3Rpb24scmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZztmdW5jdGlvbiBuKG8sYyl7cmV0dXJuIFZlKHtkYXRhOm8scGF0aDp0LnBhdGgsZXJyb3JNYXBzOlt0LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsdC5zY2hlbWFFcnJvck1hcCxQZSgpLGllXS5maWx0ZXIodT0+ISF1KSxpc3N1ZURhdGE6e2NvZGU6ZC5pbnZhbGlkX2FyZ3VtZW50cyxhcmd1bWVudHNFcnJvcjpjfX0pfWZ1bmN0aW9uIHMobyxjKXtyZXR1cm4gVmUoe2RhdGE6byxwYXRoOnQucGF0aCxlcnJvck1hcHM6W3QuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCx0LnNjaGVtYUVycm9yTWFwLFBlKCksaWVdLmZpbHRlcih1PT4hIXUpLGlzc3VlRGF0YTp7Y29kZTpkLmludmFsaWRfcmV0dXJuX3R5cGUscmV0dXJuVHlwZUVycm9yOmN9fSl9Y29uc3QgYT17ZXJyb3JNYXA6dC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwfSxpPXQuZGF0YTtpZih0aGlzLl9kZWYucmV0dXJucyBpbnN0YW5jZW9mIGxlKXtjb25zdCBvPXRoaXM7cmV0dXJuIE8oYXN5bmMgZnVuY3Rpb24oLi4uYyl7Y29uc3QgdT1uZXcgQShbXSksbD1hd2FpdCBvLl9kZWYuYXJncy5wYXJzZUFzeW5jKGMsYSkuY2F0Y2goTT0+e3Rocm93IHUuYWRkSXNzdWUobihjLE0pKSx1fSksaz1hd2FpdCBSZWZsZWN0LmFwcGx5KGksdGhpcyxsKTtyZXR1cm4gYXdhaXQgby5fZGVmLnJldHVybnMuX2RlZi50eXBlLnBhcnNlQXN5bmMoayxhKS5jYXRjaChNPT57dGhyb3cgdS5hZGRJc3N1ZShzKGssTSkpLHV9KX0pfWVsc2V7Y29uc3Qgbz10aGlzO3JldHVybiBPKGZ1bmN0aW9uKC4uLmMpe2NvbnN0IHU9by5fZGVmLmFyZ3Muc2FmZVBhcnNlKGMsYSk7aWYoIXUuc3VjY2Vzcyl0aHJvdyBuZXcgQShbbihjLHUuZXJyb3IpXSk7Y29uc3QgbD1SZWZsZWN0LmFwcGx5KGksdGhpcyx1LmRhdGEpLGs9by5fZGVmLnJldHVybnMuc2FmZVBhcnNlKGwsYSk7aWYoIWsuc3VjY2Vzcyl0aHJvdyBuZXcgQShbcyhsLGsuZXJyb3IpXSk7cmV0dXJuIGsuZGF0YX0pfX1wYXJhbWV0ZXJzKCl7cmV0dXJuIHRoaXMuX2RlZi5hcmdzfXJldHVyblR5cGUoKXtyZXR1cm4gdGhpcy5fZGVmLnJldHVybnN9YXJncyguLi5lKXtyZXR1cm4gbmV3IGRlKHsuLi50aGlzLl9kZWYsYXJnczpXLmNyZWF0ZShlKS5yZXN0KFEuY3JlYXRlKCkpfSl9cmV0dXJucyhlKXtyZXR1cm4gbmV3IGRlKHsuLi50aGlzLl9kZWYscmV0dXJuczplfSl9aW1wbGVtZW50KGUpe3JldHVybiB0aGlzLnBhcnNlKGUpfXN0cmljdEltcGxlbWVudChlKXtyZXR1cm4gdGhpcy5wYXJzZShlKX1zdGF0aWMgY3JlYXRlKGUsdCxuKXtyZXR1cm4gbmV3IGRlKHthcmdzOmV8fFcuY3JlYXRlKFtdKS5yZXN0KFEuY3JlYXRlKCkpLHJldHVybnM6dHx8US5jcmVhdGUoKSx0eXBlTmFtZTp5LlpvZEZ1bmN0aW9uLC4uLnYobil9KX19Y2xhc3MgTmUgZXh0ZW5kcyBfe2dldCBzY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpfV9wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO3JldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCkuX3BhcnNlKHtkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxwYXJlbnQ6dH0pfX1OZS5jcmVhdGU9KHIsZSk9Pm5ldyBOZSh7Z2V0dGVyOnIsdHlwZU5hbWU6eS5ab2RMYXp5LC4uLnYoZSl9KTtjbGFzcyBBZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKGUuZGF0YSE9PXRoaXMuX2RlZi52YWx1ZSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh0LHtyZWNlaXZlZDp0LmRhdGEsY29kZTpkLmludmFsaWRfbGl0ZXJhbCxleHBlY3RlZDp0aGlzLl9kZWYudmFsdWV9KSxnfXJldHVybntzdGF0dXM6InZhbGlkIix2YWx1ZTplLmRhdGF9fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWV9fUFlLmNyZWF0ZT0ocixlKT0+bmV3IEFlKHt2YWx1ZTpyLHR5cGVOYW1lOnkuWm9kTGl0ZXJhbCwuLi52KGUpfSk7ZnVuY3Rpb24gVHQocixlKXtyZXR1cm4gbmV3IEcoe3ZhbHVlczpyLHR5cGVOYW1lOnkuWm9kRW51bSwuLi52KGUpfSl9Y2xhc3MgRyBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLGJlLnNldCh0aGlzLHZvaWQgMCl9X3BhcnNlKGUpe2lmKHR5cGVvZiBlLmRhdGEhPSJzdHJpbmciKXtjb25zdCB0PXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpLG49dGhpcy5fZGVmLnZhbHVlcztyZXR1cm4gaCh0LHtleHBlY3RlZDp4LmpvaW5WYWx1ZXMobikscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlLGNvZGU6ZC5pbnZhbGlkX3R5cGV9KSxnfWlmKExlKHRoaXMsYmUpfHx4dCh0aGlzLGJlLG5ldyBTZXQodGhpcy5fZGVmLnZhbHVlcykpLCFMZSh0aGlzLGJlKS5oYXMoZS5kYXRhKSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKSxuPXRoaXMuX2RlZi52YWx1ZXM7cmV0dXJuIGgodCx7cmVjZWl2ZWQ6dC5kYXRhLGNvZGU6ZC5pbnZhbGlkX2VudW1fdmFsdWUsb3B0aW9uczpufSksZ31yZXR1cm4gTyhlLmRhdGEpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZXN9Z2V0IGVudW0oKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpZVt0XT10O3JldHVybiBlfWdldCBWYWx1ZXMoKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpZVt0XT10O3JldHVybiBlfWdldCBFbnVtKCl7Y29uc3QgZT17fTtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYudmFsdWVzKWVbdF09dDtyZXR1cm4gZX1leHRyYWN0KGUsdD10aGlzLl9kZWYpe3JldHVybiBHLmNyZWF0ZShlLHsuLi50aGlzLl9kZWYsLi4udH0pfWV4Y2x1ZGUoZSx0PXRoaXMuX2RlZil7cmV0dXJuIEcuY3JlYXRlKHRoaXMub3B0aW9ucy5maWx0ZXIobj0+IWUuaW5jbHVkZXMobikpLHsuLi50aGlzLl9kZWYsLi4udH0pfX1iZT1uZXcgV2Vha01hcCxHLmNyZWF0ZT1UdDtjbGFzcyBFZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHdlLnNldCh0aGlzLHZvaWQgMCl9X3BhcnNlKGUpe2NvbnN0IHQ9eC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcyksbj10aGlzLl9nZXRPclJldHVybkN0eChlKTtpZihuLnBhcnNlZFR5cGUhPT1mLnN0cmluZyYmbi5wYXJzZWRUeXBlIT09Zi5udW1iZXIpe2NvbnN0IHM9eC5vYmplY3RWYWx1ZXModCk7cmV0dXJuIGgobix7ZXhwZWN0ZWQ6eC5qb2luVmFsdWVzKHMpLHJlY2VpdmVkOm4ucGFyc2VkVHlwZSxjb2RlOmQuaW52YWxpZF90eXBlfSksZ31pZihMZSh0aGlzLHdlKXx8eHQodGhpcyx3ZSxuZXcgU2V0KHguZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSksIUxlKHRoaXMsd2UpLmhhcyhlLmRhdGEpKXtjb25zdCBzPXgub2JqZWN0VmFsdWVzKHQpO3JldHVybiBoKG4se3JlY2VpdmVkOm4uZGF0YSxjb2RlOmQuaW52YWxpZF9lbnVtX3ZhbHVlLG9wdGlvbnM6c30pLGd9cmV0dXJuIE8oZS5kYXRhKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVzfX13ZT1uZXcgV2Vha01hcCxFZS5jcmVhdGU9KHIsZSk9Pm5ldyBFZSh7dmFsdWVzOnIsdHlwZU5hbWU6eS5ab2ROYXRpdmVFbnVtLC4uLnYoZSl9KTtjbGFzcyBsZSBleHRlbmRzIF97dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi50eXBlfV9wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKHQucGFyc2VkVHlwZSE9PWYucHJvbWlzZSYmdC5jb21tb24uYXN5bmM9PT0hMSlyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYucHJvbWlzZSxyZWNlaXZlZDp0LnBhcnNlZFR5cGV9KSxnO2NvbnN0IG49dC5wYXJzZWRUeXBlPT09Zi5wcm9taXNlP3QuZGF0YTpQcm9taXNlLnJlc29sdmUodC5kYXRhKTtyZXR1cm4gTyhuLnRoZW4ocz0+dGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhzLHtwYXRoOnQucGF0aCxlcnJvck1hcDp0LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXB9KSkpfX1sZS5jcmVhdGU9KHIsZSk9Pm5ldyBsZSh7dHlwZTpyLHR5cGVOYW1lOnkuWm9kUHJvbWlzZSwuLi52KGUpfSk7Y2xhc3MgQyBleHRlbmRzIF97aW5uZXJUeXBlKCl7cmV0dXJuIHRoaXMuX2RlZi5zY2hlbWF9c291cmNlVHlwZSgpe3JldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWU9PT15LlpvZEVmZmVjdHM/dGhpcy5fZGVmLnNjaGVtYS5zb3VyY2VUeXBlKCk6dGhpcy5fZGVmLnNjaGVtYX1fcGFyc2UoZSl7Y29uc3R7c3RhdHVzOnQsY3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxzPXRoaXMuX2RlZi5lZmZlY3R8fG51bGwsYT17YWRkSXNzdWU6aT0+e2gobixpKSxpLmZhdGFsP3QuYWJvcnQoKTp0LmRpcnR5KCl9LGdldCBwYXRoKCl7cmV0dXJuIG4ucGF0aH19O2lmKGEuYWRkSXNzdWU9YS5hZGRJc3N1ZS5iaW5kKGEpLHMudHlwZT09PSJwcmVwcm9jZXNzIil7Y29uc3QgaT1zLnRyYW5zZm9ybShuLmRhdGEsYSk7aWYobi5jb21tb24uYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShpKS50aGVuKGFzeW5jIG89PntpZih0LnZhbHVlPT09ImFib3J0ZWQiKXJldHVybiBnO2NvbnN0IGM9YXdhaXQgdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7ZGF0YTpvLHBhdGg6bi5wYXRoLHBhcmVudDpufSk7cmV0dXJuIGMuc3RhdHVzPT09ImFib3J0ZWQiP2c6Yy5zdGF0dXM9PT0iZGlydHkifHx0LnZhbHVlPT09ImRpcnR5Ij9vZShjLnZhbHVlKTpjfSk7e2lmKHQudmFsdWU9PT0iYWJvcnRlZCIpcmV0dXJuIGc7Y29uc3Qgbz10aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6aSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pO3JldHVybiBvLnN0YXR1cz09PSJhYm9ydGVkIj9nOm8uc3RhdHVzPT09ImRpcnR5Inx8dC52YWx1ZT09PSJkaXJ0eSI/b2Uoby52YWx1ZSk6b319aWYocy50eXBlPT09InJlZmluZW1lbnQiKXtjb25zdCBpPW89Pntjb25zdCBjPXMucmVmaW5lbWVudChvLGEpO2lmKG4uY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUoYyk7aWYoYyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybiBvfTtpZihuLmNvbW1vbi5hc3luYz09PSExKXtjb25zdCBvPXRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KTtyZXR1cm4gby5zdGF0dXM9PT0iYWJvcnRlZCI/Zzooby5zdGF0dXM9PT0iZGlydHkiJiZ0LmRpcnR5KCksaShvLnZhbHVlKSx7c3RhdHVzOnQudmFsdWUsdmFsdWU6by52YWx1ZX0pfWVsc2UgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSkudGhlbihvPT5vLnN0YXR1cz09PSJhYm9ydGVkIj9nOihvLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSxpKG8udmFsdWUpLnRoZW4oKCk9Pih7c3RhdHVzOnQudmFsdWUsdmFsdWU6by52YWx1ZX0pKSkpfWlmKHMudHlwZT09PSJ0cmFuc2Zvcm0iKWlmKG4uY29tbW9uLmFzeW5jPT09ITEpe2NvbnN0IGk9dGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pO2lmKCF4ZShpKSlyZXR1cm4gaTtjb25zdCBvPXMudHJhbnNmb3JtKGkudmFsdWUsYSk7aWYobyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfX1lbHNlIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pLnRoZW4oaT0+eGUoaSk/UHJvbWlzZS5yZXNvbHZlKHMudHJhbnNmb3JtKGkudmFsdWUsYSkpLnRoZW4obz0+KHtzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfSkpOmkpO3guYXNzZXJ0TmV2ZXIocyl9fUMuY3JlYXRlPShyLGUsdCk9Pm5ldyBDKHtzY2hlbWE6cix0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0OmUsLi4udih0KX0pLEMuY3JlYXRlV2l0aFByZXByb2Nlc3M9KHIsZSx0KT0+bmV3IEMoe3NjaGVtYTplLGVmZmVjdDp7dHlwZToicHJlcHJvY2VzcyIsdHJhbnNmb3JtOnJ9LHR5cGVOYW1lOnkuWm9kRWZmZWN0cywuLi52KHQpfSk7Y2xhc3MgUCBleHRlbmRzIF97X3BhcnNlKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlKGUpPT09Zi51bmRlZmluZWQ/Tyh2b2lkIDApOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1QLmNyZWF0ZT0ocixlKT0+bmV3IFAoe2lubmVyVHlwZTpyLHR5cGVOYW1lOnkuWm9kT3B0aW9uYWwsLi4udihlKX0pO2NsYXNzIEogZXh0ZW5kcyBfe19wYXJzZShlKXtyZXR1cm4gdGhpcy5fZ2V0VHlwZShlKT09PWYubnVsbD9PKG51bGwpOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1KLmNyZWF0ZT0ocixlKT0+bmV3IEooe2lubmVyVHlwZTpyLHR5cGVOYW1lOnkuWm9kTnVsbGFibGUsLi4udihlKX0pO2NsYXNzIFJlIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnR9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtsZXQgbj10LmRhdGE7cmV0dXJuIHQucGFyc2VkVHlwZT09PWYudW5kZWZpbmVkJiYobj10aGlzLl9kZWYuZGVmYXVsdFZhbHVlKCkpLHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtkYXRhOm4scGF0aDp0LnBhdGgscGFyZW50OnR9KX1yZW1vdmVEZWZhdWx0KCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fVJlLmNyZWF0ZT0ocixlKT0+bmV3IFJlKHtpbm5lclR5cGU6cix0eXBlTmFtZTp5LlpvZERlZmF1bHQsZGVmYXVsdFZhbHVlOnR5cGVvZiBlLmRlZmF1bHQ9PSJmdW5jdGlvbiI/ZS5kZWZhdWx0OigpPT5lLmRlZmF1bHQsLi4udihlKX0pO2NsYXNzIENlIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnR9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxuPXsuLi50LGNvbW1vbjp7Li4udC5jb21tb24saXNzdWVzOltdfX0scz10aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50OnsuLi5ufX0pO3JldHVybiBrZShzKT9zLnRoZW4oYT0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTphLnN0YXR1cz09PSJ2YWxpZCI/YS52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBBKG4uY29tbW9uLmlzc3Vlcyl9LGlucHV0Om4uZGF0YX0pfSkpOntzdGF0dXM6InZhbGlkIix2YWx1ZTpzLnN0YXR1cz09PSJ2YWxpZCI/cy52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBBKG4uY29tbW9uLmlzc3Vlcyl9LGlucHV0Om4uZGF0YX0pfX1yZW1vdmVDYXRjaCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1DZS5jcmVhdGU9KHIsZSk9Pm5ldyBDZSh7aW5uZXJUeXBlOnIsdHlwZU5hbWU6eS5ab2RDYXRjaCxjYXRjaFZhbHVlOnR5cGVvZiBlLmNhdGNoPT0iZnVuY3Rpb24iP2UuY2F0Y2g6KCk9PmUuY2F0Y2gsLi4udihlKX0pO2NsYXNzIEhlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYubmFuKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5uYW4scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6ZS5kYXRhfX19SGUuY3JlYXRlPXI9Pm5ldyBIZSh7dHlwZU5hbWU6eS5ab2ROYU4sLi4udihyKX0pO2NvbnN0IFNyPVN5bWJvbCgiem9kX2JyYW5kIik7Y2xhc3Mgb3QgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLG49dC5kYXRhO3JldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe2RhdGE6bixwYXRoOnQucGF0aCxwYXJlbnQ6dH0pfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX19Y2xhc3MgWmUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4uY29tbW9uLmFzeW5jKXJldHVybihhc3luYygpPT57Y29uc3QgYT1hd2FpdCB0aGlzLl9kZWYuaW4uX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSk7cmV0dXJuIGEuc3RhdHVzPT09ImFib3J0ZWQiP2c6YS5zdGF0dXM9PT0iZGlydHkiPyh0LmRpcnR5KCksb2UoYS52YWx1ZSkpOnRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe2RhdGE6YS52YWx1ZSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfSkoKTt7Y29uc3Qgcz10aGlzLl9kZWYuaW4uX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KTtyZXR1cm4gcy5zdGF0dXM9PT0iYWJvcnRlZCI/ZzpzLnN0YXR1cz09PSJkaXJ0eSI/KHQuZGlydHkoKSx7c3RhdHVzOiJkaXJ0eSIsdmFsdWU6cy52YWx1ZX0pOnRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7ZGF0YTpzLnZhbHVlLHBhdGg6bi5wYXRoLHBhcmVudDpufSl9fXN0YXRpYyBjcmVhdGUoZSx0KXtyZXR1cm4gbmV3IFplKHtpbjplLG91dDp0LHR5cGVOYW1lOnkuWm9kUGlwZWxpbmV9KX19Y2xhc3MgSWUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdCB0PXRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpLG49cz0+KHhlKHMpJiYocy52YWx1ZT1PYmplY3QuZnJlZXplKHMudmFsdWUpKSxzKTtyZXR1cm4ga2UodCk/dC50aGVuKHM9Pm4ocykpOm4odCl9dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fUllLmNyZWF0ZT0ocixlKT0+bmV3IEllKHtpbm5lclR5cGU6cix0eXBlTmFtZTp5LlpvZFJlYWRvbmx5LC4uLnYoZSl9KTtmdW5jdGlvbiAkdChyLGU9e30sdCl7cmV0dXJuIHI/Y2UuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKG4scyk9Pnt2YXIgYSxpO2lmKCFyKG4pKXtjb25zdCBvPXR5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6dHlwZW9mIGU9PSJzdHJpbmciP3ttZXNzYWdlOmV9OmUsYz0oaT0oYT1vLmZhdGFsKSE9PW51bGwmJmEhPT12b2lkIDA/YTp0KSE9PW51bGwmJmkhPT12b2lkIDA/aTohMCx1PXR5cGVvZiBvPT0ic3RyaW5nIj97bWVzc2FnZTpvfTpvO3MuYWRkSXNzdWUoe2NvZGU6ImN1c3RvbSIsLi4udSxmYXRhbDpjfSl9fSk6Y2UuY3JlYXRlKCl9Y29uc3QgVHI9e29iamVjdDpULmxhenljcmVhdGV9O3ZhciB5OyhmdW5jdGlvbihyKXtyLlpvZFN0cmluZz0iWm9kU3RyaW5nIixyLlpvZE51bWJlcj0iWm9kTnVtYmVyIixyLlpvZE5hTj0iWm9kTmFOIixyLlpvZEJpZ0ludD0iWm9kQmlnSW50IixyLlpvZEJvb2xlYW49IlpvZEJvb2xlYW4iLHIuWm9kRGF0ZT0iWm9kRGF0ZSIsci5ab2RTeW1ib2w9IlpvZFN5bWJvbCIsci5ab2RVbmRlZmluZWQ9IlpvZFVuZGVmaW5lZCIsci5ab2ROdWxsPSJab2ROdWxsIixyLlpvZEFueT0iWm9kQW55IixyLlpvZFVua25vd249IlpvZFVua25vd24iLHIuWm9kTmV2ZXI9IlpvZE5ldmVyIixyLlpvZFZvaWQ9IlpvZFZvaWQiLHIuWm9kQXJyYXk9IlpvZEFycmF5IixyLlpvZE9iamVjdD0iWm9kT2JqZWN0IixyLlpvZFVuaW9uPSJab2RVbmlvbiIsci5ab2REaXNjcmltaW5hdGVkVW5pb249IlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsci5ab2RJbnRlcnNlY3Rpb249IlpvZEludGVyc2VjdGlvbiIsci5ab2RUdXBsZT0iWm9kVHVwbGUiLHIuWm9kUmVjb3JkPSJab2RSZWNvcmQiLHIuWm9kTWFwPSJab2RNYXAiLHIuWm9kU2V0PSJab2RTZXQiLHIuWm9kRnVuY3Rpb249IlpvZEZ1bmN0aW9uIixyLlpvZExhenk9IlpvZExhenkiLHIuWm9kTGl0ZXJhbD0iWm9kTGl0ZXJhbCIsci5ab2RFbnVtPSJab2RFbnVtIixyLlpvZEVmZmVjdHM9IlpvZEVmZmVjdHMiLHIuWm9kTmF0aXZlRW51bT0iWm9kTmF0aXZlRW51bSIsci5ab2RPcHRpb25hbD0iWm9kT3B0aW9uYWwiLHIuWm9kTnVsbGFibGU9IlpvZE51bGxhYmxlIixyLlpvZERlZmF1bHQ9IlpvZERlZmF1bHQiLHIuWm9kQ2F0Y2g9IlpvZENhdGNoIixyLlpvZFByb21pc2U9IlpvZFByb21pc2UiLHIuWm9kQnJhbmRlZD0iWm9kQnJhbmRlZCIsci5ab2RQaXBlbGluZT0iWm9kUGlwZWxpbmUiLHIuWm9kUmVhZG9ubHk9IlpvZFJlYWRvbmx5In0pKHl8fCh5PXt9KSk7Y29uc3QgJHI9KHIsZT17bWVzc2FnZTpgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7ci5uYW1lfWB9KT0+JHQodD0+dCBpbnN0YW5jZW9mIHIsZSksTXQ9RS5jcmVhdGUsRHQ9SC5jcmVhdGUsTXI9SGUuY3JlYXRlLERyPXEuY3JlYXRlLE90PVNlLmNyZWF0ZSxPcj1LLmNyZWF0ZSxOcj16ZS5jcmVhdGUsQXI9VGUuY3JlYXRlLEVyPSRlLmNyZWF0ZSxScj1jZS5jcmVhdGUsQ3I9US5jcmVhdGUsWnI9TC5jcmVhdGUsSXI9VWUuY3JlYXRlLGpyPVIuY3JlYXRlLFlyPVQuY3JlYXRlLFdyPVQuc3RyaWN0Q3JlYXRlLFByPU1lLmNyZWF0ZSxWcj1GZS5jcmVhdGUsTHI9RGUuY3JlYXRlLHpyPVcuY3JlYXRlLFVyPU9lLmNyZWF0ZSxGcj1CZS5jcmVhdGUsQnI9WC5jcmVhdGUsSHI9ZGUuY3JlYXRlLHFyPU5lLmNyZWF0ZSxHcj1BZS5jcmVhdGUsSnI9Ry5jcmVhdGUsS3I9RWUuY3JlYXRlLFFyPWxlLmNyZWF0ZSxOdD1DLmNyZWF0ZSxYcj1QLmNyZWF0ZSxlbj1KLmNyZWF0ZSx0bj1DLmNyZWF0ZVdpdGhQcmVwcm9jZXNzLHJuPVplLmNyZWF0ZTt2YXIgbT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0RXJyb3JNYXA6aWUsc2V0RXJyb3JNYXA6b3IsZ2V0RXJyb3JNYXA6UGUsbWFrZUlzc3VlOlZlLEVNUFRZX1BBVEg6Y3IsYWRkSXNzdWVUb0NvbnRleHQ6aCxQYXJzZVN0YXR1czpELElOVkFMSUQ6ZyxESVJUWTpvZSxPSzpPLGlzQWJvcnRlZDpudCxpc0RpcnR5OnN0LGlzVmFsaWQ6eGUsaXNBc3luYzprZSxnZXQgdXRpbCgpe3JldHVybiB4fSxnZXQgb2JqZWN0VXRpbCgpe3JldHVybiBydH0sWm9kUGFyc2VkVHlwZTpmLGdldFBhcnNlZFR5cGU6Qixab2RUeXBlOl8sZGF0ZXRpbWVSZWdleDpTdCxab2RTdHJpbmc6RSxab2ROdW1iZXI6SCxab2RCaWdJbnQ6cSxab2RCb29sZWFuOlNlLFpvZERhdGU6Syxab2RTeW1ib2w6emUsWm9kVW5kZWZpbmVkOlRlLFpvZE51bGw6JGUsWm9kQW55OmNlLFpvZFVua25vd246USxab2ROZXZlcjpMLFpvZFZvaWQ6VWUsWm9kQXJyYXk6Uixab2RPYmplY3Q6VCxab2RVbmlvbjpNZSxab2REaXNjcmltaW5hdGVkVW5pb246RmUsWm9kSW50ZXJzZWN0aW9uOkRlLFpvZFR1cGxlOlcsWm9kUmVjb3JkOk9lLFpvZE1hcDpCZSxab2RTZXQ6WCxab2RGdW5jdGlvbjpkZSxab2RMYXp5Ok5lLFpvZExpdGVyYWw6QWUsWm9kRW51bTpHLFpvZE5hdGl2ZUVudW06RWUsWm9kUHJvbWlzZTpsZSxab2RFZmZlY3RzOkMsWm9kVHJhbnNmb3JtZXI6Qyxab2RPcHRpb25hbDpQLFpvZE51bGxhYmxlOkosWm9kRGVmYXVsdDpSZSxab2RDYXRjaDpDZSxab2ROYU46SGUsQlJBTkQ6U3IsWm9kQnJhbmRlZDpvdCxab2RQaXBlbGluZTpaZSxab2RSZWFkb25seTpJZSxjdXN0b206JHQsU2NoZW1hOl8sWm9kU2NoZW1hOl8sbGF0ZTpUcixnZXQgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKCl7cmV0dXJuIHl9LGNvZXJjZTp7c3RyaW5nOnI9PkUuY3JlYXRlKHsuLi5yLGNvZXJjZTohMH0pLG51bWJlcjpyPT5ILmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KSxib29sZWFuOnI9PlNlLmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KSxiaWdpbnQ6cj0+cS5jcmVhdGUoey4uLnIsY29lcmNlOiEwfSksZGF0ZTpyPT5LLmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KX0sYW55OlJyLGFycmF5OmpyLGJpZ2ludDpEcixib29sZWFuOk90LGRhdGU6T3IsZGlzY3JpbWluYXRlZFVuaW9uOlZyLGVmZmVjdDpOdCxlbnVtOkpyLGZ1bmN0aW9uOkhyLGluc3RhbmNlb2Y6JHIsaW50ZXJzZWN0aW9uOkxyLGxhenk6cXIsbGl0ZXJhbDpHcixtYXA6RnIsbmFuOk1yLG5hdGl2ZUVudW06S3IsbmV2ZXI6WnIsbnVsbDpFcixudWxsYWJsZTplbixudW1iZXI6RHQsb2JqZWN0OllyLG9ib29sZWFuOigpPT5PdCgpLm9wdGlvbmFsKCksb251bWJlcjooKT0+RHQoKS5vcHRpb25hbCgpLG9wdGlvbmFsOlhyLG9zdHJpbmc6KCk9Pk10KCkub3B0aW9uYWwoKSxwaXBlbGluZTpybixwcmVwcm9jZXNzOnRuLHByb21pc2U6UXIscmVjb3JkOlVyLHNldDpCcixzdHJpY3RPYmplY3Q6V3Isc3RyaW5nOk10LHN5bWJvbDpOcix0cmFuc2Zvcm1lcjpOdCx0dXBsZTp6cix1bmRlZmluZWQ6QXIsdW5pb246UHIsdW5rbm93bjpDcix2b2lkOklyLE5FVkVSOmcsWm9kSXNzdWVDb2RlOmQscXVvdGVsZXNzSnNvbjppcixab2RFcnJvcjpBfSk7bS5vYmplY3Qoe251Y2xlb3RpZGVTZXF1ZW5jZXM6bS5hcnJheShtLm9iamVjdCh7bmFtZTptLnN0cmluZygpLHNlcXVlbmNlOm0uc3RyaW5nKCl9KSksZ2VuZXM6bS5hcnJheShtLm9iamVjdCh7bmFtZTptLnN0cmluZygpLHNlcXVlbmNlOm0uc3RyaW5nKCl9KSl9KTtjb25zdCBubj1tLmVudW0oWyJhc2NlbmRpbmciLCJkZXNjZW5kaW5nIl0pLHNuPW0ub2JqZWN0KHtmaWVsZDptLnN0cmluZygpLHR5cGU6bm59KTttLm9iamVjdCh7bGltaXQ6bS5udW1iZXIoKS5vcHRpb25hbCgpLG9mZnNldDptLm51bWJlcigpLm9wdGlvbmFsKCksZmllbGRzOm0uYXJyYXkobS5zdHJpbmcoKSkub3B0aW9uYWwoKSxvcmRlckJ5Om0uYXJyYXkoc24pLm9wdGlvbmFsKCl9KS5jYXRjaGFsbChtLnVuaW9uKFttLmJvb2xlYW4oKSxtLnVuZGVmaW5lZCgpLG0uc3RyaW5nKCksbS5udW1iZXIoKSxtLm51bGwoKSxtLmFycmF5KG0uc3RyaW5nKCkpXSkpLmV4dGVuZCh7bWluUHJvcG9ydGlvbjptLm51bWJlcigpLm9wdGlvbmFsKCl9KTtjb25zdCBhbj1tLm9iamVjdCh7bXV0YXRpb246bS5zdHJpbmcoKSxwcm9wb3J0aW9uOm0ubnVtYmVyKCksY291bnQ6bS5udW1iZXIoKSxzZXF1ZW5jZU5hbWU6bS51bmlvbihbbS5zdHJpbmcoKSxtLm51bGwoKV0pLG11dGF0aW9uRnJvbTptLnN0cmluZygpLG11dGF0aW9uVG86bS5zdHJpbmcoKSxwb3NpdGlvbjptLm51bWJlcigpfSksb249Y3QobS5hcnJheShhbikpLGNuPW0ub2JqZWN0KHtpbnNlcnRpb246bS5zdHJpbmcoKSxjb3VudDptLm51bWJlcigpLGluc2VydGVkU3ltYm9sczptLnN0cmluZygpLHBvc2l0aW9uOm0ubnVtYmVyKCksc2VxdWVuY2VOYW1lOm0udW5pb24oW20uc3RyaW5nKCksbS5udWxsKCldKX0pO2N0KG0uYXJyYXkoY24pKTtjb25zdCB1bj1tLm9iamVjdCh7Y291bnQ6bS5udW1iZXIoKX0pLmNhdGNoYWxsKG0udW5pb24oW20uc3RyaW5nKCksbS5udW1iZXIoKSxtLm51bGwoKV0pKSxkbj1jdChtLmFycmF5KHVuKSk7ZnVuY3Rpb24gY3Qocil7cmV0dXJuIG0ub2JqZWN0KHtkYXRhOnJ9KX1jb25zdCBBdD1tLm9iamVjdCh7dGl0bGU6bS5zdHJpbmcoKS5vcHRpb25hbCgpLHN0YXR1czptLm51bWJlcigpLGRldGFpbDptLnN0cmluZygpLm9wdGlvbmFsKCksdHlwZTptLnN0cmluZygpLGluc3RhbmNlOm0uc3RyaW5nKCkub3B0aW9uYWwoKX0pLGxuPW0ub2JqZWN0KHtlcnJvcjpBdH0pO2NsYXNzIHV0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUpLHRoaXMuc3RhdHVzPXQsdGhpcy5yZXF1ZXN0ZWREYXRhPW4sdGhpcy5uYW1lPSJVbmtub3duTGFwaXNFcnJvciJ9fWNsYXNzIEV0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4scyl7c3VwZXIoZSksdGhpcy5zdGF0dXM9dCx0aGlzLnByb2JsZW1EZXRhaWw9bix0aGlzLnJlcXVlc3RlZERhdGE9cyx0aGlzLm5hbWU9IkxhcGlzRXJyb3IifX1hc3luYyBmdW5jdGlvbiBobihyLGUsdCl7Y29uc3Qgbj1hd2FpdCBSdChwbihyKSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZSksc2lnbmFsOnR9LCJhZ2dyZWdhdGVkIGRhdGEiKTtyZXR1cm4gZG4ucGFyc2UoYXdhaXQgbi5qc29uKCkpfWFzeW5jIGZ1bmN0aW9uIGZuKHIsZSx0LG4pe2NvbnN0IHM9YXdhaXQgUnQoeW4ocix0KSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZSksc2lnbmFsOm59LGAke3R9IG11dGF0aW9uc2ApO3JldHVybiBvbi5wYXJzZShhd2FpdCBzLmpzb24oKSl9YXN5bmMgZnVuY3Rpb24gUnQocixlLHQpe3RyeXtjb25zdCBuPWF3YWl0IGZldGNoKHIsZSk7cmV0dXJuIGF3YWl0IG1uKG4sdCksbn1jYXRjaChuKXtjb25zdCBzPW4gaW5zdGFuY2VvZiBFcnJvcj9uLm1lc3NhZ2U6YCR7bn1gO3Rocm93IG5ldyB1dChgRmFpbGVkIHRvIGNvbm5lY3QgdG8gTEFQSVM6ICR7c31gLDUwMCx0KX19Y29uc3QgbW49YXN5bmMocixlKT0+e2lmKCFyLm9rKXtpZihyLnN0YXR1cz49NDAwJiZyLnN0YXR1czw1MDApe2NvbnN0IHQ9YXdhaXQgci5qc29uKCksbj1sbi5zYWZlUGFyc2UodCk7aWYobi5zdWNjZXNzKXRocm93IG5ldyBFdChyLnN0YXR1c1RleHQrbi5kYXRhLmVycm9yLmRldGFpbCxyLnN0YXR1cyxuLmRhdGEuZXJyb3IsZSk7Y29uc3Qgcz1BdC5zYWZlUGFyc2UodCk7dGhyb3cgcy5zdWNjZXNzP25ldyBFdChyLnN0YXR1c1RleHQrcy5kYXRhLmRldGFpbCxyLnN0YXR1cyxzLmRhdGEsZSk6bmV3IHV0KGAke3Iuc3RhdHVzVGV4dH06ICR7SlNPTi5zdHJpbmdpZnkodCl9YCxyLnN0YXR1cyxlKX10aHJvdyBuZXcgdXQoYCR7ci5zdGF0dXNUZXh0fTogJHtyLnN0YXR1c31gLHIuc3RhdHVzLGUpfX0scG49cj0+YCR7cn0vc2FtcGxlL2FnZ3JlZ2F0ZWRgLHluPShyLGUpPT5lPT09ImFtaW5vIGFjaWQiP2Ake3J9L3NhbXBsZS9hbWlub0FjaWRNdXRhdGlvbnNgOmAke3J9L3NhbXBsZS9udWNsZW90aWRlTXV0YXRpb25zYDtjbGFzcyBDdHtjb25zdHJ1Y3RvcihlLHQ9W10pe3RoaXMuZmlsdGVyPWUsdGhpcy5maWVsZHM9dH1hc3luYyBldmFsdWF0ZShlLHQpe2NvbnN0IG49KGF3YWl0IGhuKGUsey4uLnRoaXMuZmlsdGVyLGZpZWxkczp0aGlzLmZpZWxkc30sdCkpLmRhdGE7aWYoZ24obikpcmV0dXJue2NvbnRlbnQ6bn07dGhyb3cgbmV3IEVycm9yKCJBZ2dyZWdhdGVkIHJlc3BvbnNlIGRvZXMgbm90IGhhdmUgY291bnQiKX19ZnVuY3Rpb24gZ24ocil7cmV0dXJuIHIuZXZlcnkoZT0+dHlwZW9mIGU9PSJvYmplY3QiJiYiY291bnQiaW4gZSYmdHlwZW9mIGUuY291bnQ9PSJudW1iZXIiKX1jbGFzcyB2bntjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5jaGlsZD1lLHRoaXMuZmllbGQ9dCx0aGlzLmFnZ3JlZ2F0ZT1ufWFzeW5jIGV2YWx1YXRlKGUsdCl7Y29uc3Qgbj1hd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkscz1uZXcgTWFwO2Zvcihjb25zdCBpIG9mIG4uY29udGVudCl7Y29uc3Qgbz1pW3RoaXMuZmllbGRdO3MuaGFzKG8pfHxzLnNldChvLFtdKSxzLmdldChvKS5wdXNoKGkpfWNvbnN0IGE9bmV3IEFycmF5O2Zvcihjb25zdFssaV1vZiBzKWEucHVzaCh0aGlzLmFnZ3JlZ2F0ZShpKSk7cmV0dXJue2NvbnRlbnQ6YX19fWNsYXNzIF9uIGV4dGVuZHMgdm57Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUsdCxzPT57bGV0IGE9MDtmb3IoY29uc3QgaSBvZiBzKWErPWlbbl07cmV0dXJue1t0XTpzWzBdW3RdLFtuXTphfX0pfX1jbGFzcyBkdHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY2hpbGQ9ZSx0aGlzLmZ1bmM9dH1hc3luYyBldmFsdWF0ZShlLHQpe3JldHVybntjb250ZW50Oihhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkpLmNvbnRlbnQubWFwKHRoaXMuZnVuYyl9fX1jbGFzcyB4biBleHRlbmRzIGR0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLHM9Pih7Li4ucyxbbl06c1t0XX0pKX19Y2xhc3Mga257Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNoaWxkPWUsdGhpcy5jb21wYXJlRm49dH1hc3luYyBldmFsdWF0ZShlLHQpe3JldHVybntjb250ZW50Oihhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkpLmNvbnRlbnQuc29ydCh0aGlzLmNvbXBhcmVGbil9fX12YXIgWnQ9NjAsSXQ9WnQqNjAsanQ9SXQqMjQsYm49anQqNyxoZT0xZTMsbHQ9WnQqaGUsWXQ9SXQqaGUsd249anQqaGUsU249Ym4qaGUsaHQ9Im1pbGxpc2Vjb25kIixmZT0ic2Vjb25kIixtZT0ibWludXRlIixwZT0iaG91ciIsWj0iZGF5IixqZT0id2VlayIsST0ibW9udGgiLFd0PSJxdWFydGVyIixVPSJ5ZWFyIix5ZT0iZGF0ZSIsUHQ9IllZWVktTU0tRERUSEg6bW06c3NaIixWdD0iSW52YWxpZCBEYXRlIixUbj0vXihcZHs0fSlbLS9dPyhcZHsxLDJ9KT9bLS9dPyhcZHswLDJ9KVtUdFxzXSooXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Wy46XT8oXGQrKT8kLywkbj0vXFsoW15cXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nLE1uPXtuYW1lOiJlbiIsd2Vla2RheXM6IlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLG1vbnRoczoiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSxvcmRpbmFsOmZ1bmN0aW9uKGUpe3ZhciB0PVsidGgiLCJzdCIsIm5kIiwicmQiXSxuPWUlMTAwO3JldHVybiJbIitlKyh0WyhuLTIwKSUxMF18fHRbbl18fHRbMF0pKyJdIn19LGZ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1TdHJpbmcoZSk7cmV0dXJuIXN8fHMubGVuZ3RoPj10P2U6IiIrQXJyYXkodCsxLXMubGVuZ3RoKS5qb2luKG4pK2V9LERuPWZ1bmN0aW9uKGUpe3ZhciB0PS1lLnV0Y09mZnNldCgpLG49TWF0aC5hYnModCkscz1NYXRoLmZsb29yKG4vNjApLGE9biU2MDtyZXR1cm4odDw9MD8iKyI6Ii0iKStmdChzLDIsIjAiKSsiOiIrZnQoYSwyLCIwIil9LE9uPWZ1bmN0aW9uIHIoZSx0KXtpZihlLmRhdGUoKTx0LmRhdGUoKSlyZXR1cm4tcih0LGUpO3ZhciBuPSh0LnllYXIoKS1lLnllYXIoKSkqMTIrKHQubW9udGgoKS1lLm1vbnRoKCkpLHM9ZS5jbG9uZSgpLmFkZChuLEkpLGE9dC1zPDAsaT1lLmNsb25lKCkuYWRkKG4rKGE/LTE6MSksSSk7cmV0dXJuKygtKG4rKHQtcykvKGE/cy1pOmktcykpfHwwKX0sTm49ZnVuY3Rpb24oZSl7cmV0dXJuIGU8MD9NYXRoLmNlaWwoZSl8fDA6TWF0aC5mbG9vcihlKX0sQW49ZnVuY3Rpb24oZSl7dmFyIHQ9e006SSx5OlUsdzpqZSxkOlosRDp5ZSxoOnBlLG06bWUsczpmZSxtczpodCxROld0fTtyZXR1cm4gdFtlXXx8U3RyaW5nKGV8fCIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywiIil9LEVuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwfSxSbj17czpmdCx6OkRuLG06T24sYTpObixwOkFuLHU6RW59LFllPSJlbiIsZWU9e307ZWVbWWVdPU1uO3ZhciBMdD0iJGlzRGF5anNPYmplY3QiLG10PWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgR2V8fCEhKGUmJmVbTHRdKX0scWU9ZnVuY3Rpb24gcihlLHQsbil7dmFyIHM7aWYoIWUpcmV0dXJuIFllO2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7dmFyIGE9ZS50b0xvd2VyQ2FzZSgpO2VlW2FdJiYocz1hKSx0JiYoZWVbYV09dCxzPWEpO3ZhciBpPWUuc3BsaXQoIi0iKTtpZighcyYmaS5sZW5ndGg+MSlyZXR1cm4gcihpWzBdKX1lbHNle3ZhciBvPWUubmFtZTtlZVtvXT1lLHM9b31yZXR1cm4hbiYmcyYmKFllPXMpLHN8fCFuJiZZZX0sdz1mdW5jdGlvbihlLHQpe2lmKG10KGUpKXJldHVybiBlLmNsb25lKCk7dmFyIG49dHlwZW9mIHQ9PSJvYmplY3QiP3Q6e307cmV0dXJuIG4uZGF0ZT1lLG4uYXJncz1hcmd1bWVudHMsbmV3IEdlKG4pfSxDbj1mdW5jdGlvbihlLHQpe3JldHVybiB3KGUse2xvY2FsZTp0LiRMLHV0Yzp0LiR1LHg6dC4keCwkb2Zmc2V0OnQuJG9mZnNldH0pfSxiPVJuO2IubD1xZSxiLmk9bXQsYi53PUNuO3ZhciBabj1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGUsbj1lLnV0YztpZih0PT09bnVsbClyZXR1cm4gbmV3IERhdGUoTmFOKTtpZihiLnUodCkpcmV0dXJuIG5ldyBEYXRlO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBuZXcgRGF0ZSh0KTtpZih0eXBlb2YgdD09InN0cmluZyImJiEvWiQvaS50ZXN0KHQpKXt2YXIgcz10Lm1hdGNoKFRuKTtpZihzKXt2YXIgYT1zWzJdLTF8fDAsaT0oc1s3XXx8IjAiKS5zdWJzdHJpbmcoMCwzKTtyZXR1cm4gbj9uZXcgRGF0ZShEYXRlLlVUQyhzWzFdLGEsc1szXXx8MSxzWzRdfHwwLHNbNV18fDAsc1s2XXx8MCxpKSk6bmV3IERhdGUoc1sxXSxhLHNbM118fDEsc1s0XXx8MCxzWzVdfHwwLHNbNl18fDAsaSl9fXJldHVybiBuZXcgRGF0ZSh0KX0sR2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKHQpe3RoaXMuJEw9cWUodC5sb2NhbGUsbnVsbCwhMCksdGhpcy5wYXJzZSh0KSx0aGlzLiR4PXRoaXMuJHh8fHQueHx8e30sdGhpc1tMdF09ITB9dmFyIGU9ci5wcm90b3R5cGU7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dGhpcy4kZD1abihuKSx0aGlzLmluaXQoKX0sZS5pbml0PWZ1bmN0aW9uKCl7dmFyIG49dGhpcy4kZDt0aGlzLiR5PW4uZ2V0RnVsbFllYXIoKSx0aGlzLiRNPW4uZ2V0TW9udGgoKSx0aGlzLiREPW4uZ2V0RGF0ZSgpLHRoaXMuJFc9bi5nZXREYXkoKSx0aGlzLiRIPW4uZ2V0SG91cnMoKSx0aGlzLiRtPW4uZ2V0TWludXRlcygpLHRoaXMuJHM9bi5nZXRTZWNvbmRzKCksdGhpcy4kbXM9bi5nZXRNaWxsaXNlY29uZHMoKX0sZS4kdXRpbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYn0sZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9TdHJpbmcoKSE9PVZ0fSxlLmlzU2FtZT1mdW5jdGlvbihuLHMpe3ZhciBhPXcobik7cmV0dXJuIHRoaXMuc3RhcnRPZihzKTw9YSYmYTw9dGhpcy5lbmRPZihzKX0sZS5pc0FmdGVyPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHcobik8dGhpcy5zdGFydE9mKHMpfSxlLmlzQmVmb3JlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuZW5kT2Yocyk8dyhuKX0sZS4kZz1mdW5jdGlvbihuLHMsYSl7cmV0dXJuIGIudShuKT90aGlzW3NdOnRoaXMuc2V0KGEsbil9LGUudW5peD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpLzFlMyl9LGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLmdldFRpbWUoKX0sZS5zdGFydE9mPWZ1bmN0aW9uKG4scyl7dmFyIGE9dGhpcyxpPWIudShzKT8hMDpzLG89Yi5wKG4pLGM9ZnVuY3Rpb24odmUsail7dmFyIE49Yi53KGEuJHU/RGF0ZS5VVEMoYS4keSxqLHZlKTpuZXcgRGF0ZShhLiR5LGosdmUpLGEpO3JldHVybiBpP046Ti5lbmRPZihaKX0sdT1mdW5jdGlvbih2ZSxqKXt2YXIgTj1bMCwwLDAsMF0sX2U9WzIzLDU5LDU5LDk5OV07cmV0dXJuIGIudyhhLnRvRGF0ZSgpW3ZlXS5hcHBseShhLnRvRGF0ZSgicyIpLChpP046X2UpLnNsaWNlKGopKSxhKX0sbD10aGlzLiRXLGs9dGhpcy4kTSxTPXRoaXMuJEQsTT0ic2V0IisodGhpcy4kdT8iVVRDIjoiIik7c3dpdGNoKG8pe2Nhc2UgVTpyZXR1cm4gaT9jKDEsMCk6YygzMSwxMSk7Y2FzZSBJOnJldHVybiBpP2MoMSxrKTpjKDAsaysxKTtjYXNlIGplOnt2YXIgRj10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsYWU9KGw8Rj9sKzc6bCktRjtyZXR1cm4gYyhpP1MtYWU6UysoNi1hZSksayl9Y2FzZSBaOmNhc2UgeWU6cmV0dXJuIHUoTSsiSG91cnMiLDApO2Nhc2UgcGU6cmV0dXJuIHUoTSsiTWludXRlcyIsMSk7Y2FzZSBtZTpyZXR1cm4gdShNKyJTZWNvbmRzIiwyKTtjYXNlIGZlOnJldHVybiB1KE0rIk1pbGxpc2Vjb25kcyIsMyk7ZGVmYXVsdDpyZXR1cm4gdGhpcy5jbG9uZSgpfX0sZS5lbmRPZj1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5zdGFydE9mKG4sITEpfSxlLiRzZXQ9ZnVuY3Rpb24obixzKXt2YXIgYSxpPWIucChuKSxvPSJzZXQiKyh0aGlzLiR1PyJVVEMiOiIiKSxjPShhPXt9LGFbWl09bysiRGF0ZSIsYVt5ZV09bysiRGF0ZSIsYVtJXT1vKyJNb250aCIsYVtVXT1vKyJGdWxsWWVhciIsYVtwZV09bysiSG91cnMiLGFbbWVdPW8rIk1pbnV0ZXMiLGFbZmVdPW8rIlNlY29uZHMiLGFbaHRdPW8rIk1pbGxpc2Vjb25kcyIsYSlbaV0sdT1pPT09Wj90aGlzLiREKyhzLXRoaXMuJFcpOnM7aWYoaT09PUl8fGk9PT1VKXt2YXIgbD10aGlzLmNsb25lKCkuc2V0KHllLDEpO2wuJGRbY10odSksbC5pbml0KCksdGhpcy4kZD1sLnNldCh5ZSxNYXRoLm1pbih0aGlzLiRELGwuZGF5c0luTW9udGgoKSkpLiRkfWVsc2UgYyYmdGhpcy4kZFtjXSh1KTtyZXR1cm4gdGhpcy5pbml0KCksdGhpc30sZS5zZXQ9ZnVuY3Rpb24obixzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLiRzZXQobixzKX0sZS5nZXQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXNbYi5wKG4pXSgpfSxlLmFkZD1mdW5jdGlvbihuLHMpe3ZhciBhPXRoaXMsaTtuPU51bWJlcihuKTt2YXIgbz1iLnAocyksYz1mdW5jdGlvbihTKXt2YXIgTT13KGEpO3JldHVybiBiLncoTS5kYXRlKE0uZGF0ZSgpK01hdGgucm91bmQoUypuKSksYSl9O2lmKG89PT1JKXJldHVybiB0aGlzLnNldChJLHRoaXMuJE0rbik7aWYobz09PVUpcmV0dXJuIHRoaXMuc2V0KFUsdGhpcy4keStuKTtpZihvPT09WilyZXR1cm4gYygxKTtpZihvPT09amUpcmV0dXJuIGMoNyk7dmFyIHU9KGk9e30saVttZV09bHQsaVtwZV09WXQsaVtmZV09aGUsaSlbb118fDEsbD10aGlzLiRkLmdldFRpbWUoKStuKnU7cmV0dXJuIGIudyhsLHRoaXMpfSxlLnN1YnRyYWN0PWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuYWRkKG4qLTEscyl9LGUuZm9ybWF0PWZ1bmN0aW9uKG4pe3ZhciBzPXRoaXMsYT10aGlzLiRsb2NhbGUoKTtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIGEuaW52YWxpZERhdGV8fFZ0O3ZhciBpPW58fFB0LG89Yi56KHRoaXMpLGM9dGhpcy4kSCx1PXRoaXMuJG0sbD10aGlzLiRNLGs9YS53ZWVrZGF5cyxTPWEubW9udGhzLE09YS5tZXJpZGllbSxGPWZ1bmN0aW9uKE4sX2UsdHQsZ3Mpe3JldHVybiBOJiYoTltfZV18fE4ocyxpKSl8fHR0W19lXS5zbGljZSgwLGdzKX0sYWU9ZnVuY3Rpb24oTil7cmV0dXJuIGIucyhjJTEyfHwxMixOLCIwIil9LGV0PU18fGZ1bmN0aW9uKGosTixfZSl7dmFyIHR0PWo8MTI/IkFNIjoiUE0iO3JldHVybiBfZT90dC50b0xvd2VyQ2FzZSgpOnR0fSx2ZT1mdW5jdGlvbihOKXtzd2l0Y2goTil7Y2FzZSJZWSI6cmV0dXJuIFN0cmluZyhzLiR5KS5zbGljZSgtMik7Y2FzZSJZWVlZIjpyZXR1cm4gYi5zKHMuJHksNCwiMCIpO2Nhc2UiTSI6cmV0dXJuIGwrMTtjYXNlIk1NIjpyZXR1cm4gYi5zKGwrMSwyLCIwIik7Y2FzZSJNTU0iOnJldHVybiBGKGEubW9udGhzU2hvcnQsbCxTLDMpO2Nhc2UiTU1NTSI6cmV0dXJuIEYoUyxsKTtjYXNlIkQiOnJldHVybiBzLiREO2Nhc2UiREQiOnJldHVybiBiLnMocy4kRCwyLCIwIik7Y2FzZSJkIjpyZXR1cm4gU3RyaW5nKHMuJFcpO2Nhc2UiZGQiOnJldHVybiBGKGEud2Vla2RheXNNaW4scy4kVyxrLDIpO2Nhc2UiZGRkIjpyZXR1cm4gRihhLndlZWtkYXlzU2hvcnQscy4kVyxrLDMpO2Nhc2UiZGRkZCI6cmV0dXJuIGtbcy4kV107Y2FzZSJIIjpyZXR1cm4gU3RyaW5nKGMpO2Nhc2UiSEgiOnJldHVybiBiLnMoYywyLCIwIik7Y2FzZSJoIjpyZXR1cm4gYWUoMSk7Y2FzZSJoaCI6cmV0dXJuIGFlKDIpO2Nhc2UiYSI6cmV0dXJuIGV0KGMsdSwhMCk7Y2FzZSJBIjpyZXR1cm4gZXQoYyx1LCExKTtjYXNlIm0iOnJldHVybiBTdHJpbmcodSk7Y2FzZSJtbSI6cmV0dXJuIGIucyh1LDIsIjAiKTtjYXNlInMiOnJldHVybiBTdHJpbmcocy4kcyk7Y2FzZSJzcyI6cmV0dXJuIGIucyhzLiRzLDIsIjAiKTtjYXNlIlNTUyI6cmV0dXJuIGIucyhzLiRtcywzLCIwIik7Y2FzZSJaIjpyZXR1cm4gb31yZXR1cm4gbnVsbH07cmV0dXJuIGkucmVwbGFjZSgkbixmdW5jdGlvbihqLE4pe3JldHVybiBOfHx2ZShqKXx8by5yZXBsYWNlKCI6IiwiIil9KX0sZS51dGNPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpKjE1fSxlLmRpZmY9ZnVuY3Rpb24obixzLGEpe3ZhciBpPXRoaXMsbz1iLnAocyksYz13KG4pLHU9KGMudXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSkqbHQsbD10aGlzLWMsaz1mdW5jdGlvbigpe3JldHVybiBiLm0oaSxjKX0sUztzd2l0Y2gobyl7Y2FzZSBVOlM9aygpLzEyO2JyZWFrO2Nhc2UgSTpTPWsoKTticmVhaztjYXNlIFd0OlM9aygpLzM7YnJlYWs7Y2FzZSBqZTpTPShsLXUpL1NuO2JyZWFrO2Nhc2UgWjpTPShsLXUpL3duO2JyZWFrO2Nhc2UgcGU6Uz1sL1l0O2JyZWFrO2Nhc2UgbWU6Uz1sL2x0O2JyZWFrO2Nhc2UgZmU6Uz1sL2hlO2JyZWFrO2RlZmF1bHQ6Uz1sO2JyZWFrfXJldHVybiBhP1M6Yi5hKFMpfSxlLmRheXNJbk1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kT2YoSSkuJER9LGUuJGxvY2FsZT1mdW5jdGlvbigpe3JldHVybiBlZVt0aGlzLiRMXX0sZS5sb2NhbGU9ZnVuY3Rpb24obixzKXtpZighbilyZXR1cm4gdGhpcy4kTDt2YXIgYT10aGlzLmNsb25lKCksaT1xZShuLHMsITApO3JldHVybiBpJiYoYS4kTD1pKSxhfSxlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGIudyh0aGlzLiRkLHRoaXMpfSxlLnRvRGF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSl9LGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMudG9JU09TdHJpbmcoKTpudWxsfSxlLnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9JU09TdHJpbmcoKX0sZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLnRvVVRDU3RyaW5nKCl9LHJ9KCksenQ9R2UucHJvdG90eXBlO3cucHJvdG90eXBlPXp0LFtbIiRtcyIsaHRdLFsiJHMiLGZlXSxbIiRtIixtZV0sWyIkSCIscGVdLFsiJFciLFpdLFsiJE0iLEldLFsiJHkiLFVdLFsiJEQiLHllXV0uZm9yRWFjaChmdW5jdGlvbihyKXt6dFtyWzFdXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kZyhlLHJbMF0sclsxXSl9fSksdy5leHRlbmQ9ZnVuY3Rpb24ocixlKXtyZXR1cm4gci4kaXx8KHIoZSxHZSx3KSxyLiRpPSEwKSx3fSx3LmxvY2FsZT1xZSx3LmlzRGF5anM9bXQsdy51bml4PWZ1bmN0aW9uKHIpe3JldHVybiB3KHIqMWUzKX0sdy5lbj1lZVtZZV0sdy5Mcz1lZSx3LnA9e307dmFyIEluPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9ZS5wcm90b3R5cGUsbj10LmZvcm1hdDt0LmZvcm1hdD1mdW5jdGlvbihzKXt2YXIgYT10aGlzLGk9dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmJpbmQodGhpcykocyk7dmFyIG89dGhpcy4kdXRpbHMoKSxjPXN8fFB0LHU9Yy5yZXBsYWNlKC9cWyhbXlxdXSspXXxRfHdvfHd3fHd8V1d8V3x6enp8enxnZ2dnfEdHR0d8RG98WHx4fGt7MSwyfXxTL2csZnVuY3Rpb24obCl7c3dpdGNoKGwpe2Nhc2UiUSI6cmV0dXJuIE1hdGguY2VpbCgoYS4kTSsxKS8zKTtjYXNlIkRvIjpyZXR1cm4gaS5vcmRpbmFsKGEuJEQpO2Nhc2UiZ2dnZyI6cmV0dXJuIGEud2Vla1llYXIoKTtjYXNlIkdHR0ciOnJldHVybiBhLmlzb1dlZWtZZWFyKCk7Y2FzZSJ3byI6cmV0dXJuIGkub3JkaW5hbChhLndlZWsoKSwiVyIpO2Nhc2UidyI6Y2FzZSJ3dyI6cmV0dXJuIG8ucyhhLndlZWsoKSxsPT09InciPzE6MiwiMCIpO2Nhc2UiVyI6Y2FzZSJXVyI6cmV0dXJuIG8ucyhhLmlzb1dlZWsoKSxsPT09IlciPzE6MiwiMCIpO2Nhc2UiayI6Y2FzZSJrayI6cmV0dXJuIG8ucyhTdHJpbmcoYS4kSD09PTA/MjQ6YS4kSCksbD09PSJrIj8xOjIsIjAiKTtjYXNlIlgiOnJldHVybiBNYXRoLmZsb29yKGEuJGQuZ2V0VGltZSgpLzFlMyk7Y2FzZSJ4IjpyZXR1cm4gYS4kZC5nZXRUaW1lKCk7Y2FzZSJ6IjpyZXR1cm4iWyIrYS5vZmZzZXROYW1lKCkrIl0iO2Nhc2Uienp6IjpyZXR1cm4iWyIrYS5vZmZzZXROYW1lKCJsb25nIikrIl0iO2RlZmF1bHQ6cmV0dXJuIGx9fSk7cmV0dXJuIG4uYmluZCh0aGlzKSh1KX19LGpuPSJpc293ZWVrIixZbj1mdW5jdGlvbihyLGUsdCl7dmFyIG49ZnVuY3Rpb24oYyx1KXt2YXIgbD0odT90LnV0Yzp0KSgpLnllYXIoYykuc3RhcnRPZihVKSxrPTQtbC5pc29XZWVrZGF5KCk7cmV0dXJuIGwuaXNvV2Vla2RheSgpPjQmJihrKz03KSxsLmFkZChrLFopfSxzPWZ1bmN0aW9uKGMpe3JldHVybiBjLmFkZCg0LWMuaXNvV2Vla2RheSgpLFopfSxhPWUucHJvdG90eXBlO2EuaXNvV2Vla1llYXI9ZnVuY3Rpb24oKXt2YXIgbz1zKHRoaXMpO3JldHVybiBvLnllYXIoKX0sYS5pc29XZWVrPWZ1bmN0aW9uKG8pe2lmKCF0aGlzLiR1dGlscygpLnUobykpcmV0dXJuIHRoaXMuYWRkKChvLXRoaXMuaXNvV2VlaygpKSo3LFopO3ZhciBjPXModGhpcyksdT1uKHRoaXMuaXNvV2Vla1llYXIoKSx0aGlzLiR1KTtyZXR1cm4gYy5kaWZmKHUsamUpKzF9LGEuaXNvV2Vla2RheT1mdW5jdGlvbihvKXtyZXR1cm4gdGhpcy4kdXRpbHMoKS51KG8pP3RoaXMuZGF5KCl8fDc6dGhpcy5kYXkodGhpcy5kYXkoKSU3P286by03KX07dmFyIGk9YS5zdGFydE9mO2Euc3RhcnRPZj1mdW5jdGlvbihvLGMpe3ZhciB1PXRoaXMuJHV0aWxzKCksbD11LnUoYyk/ITA6YyxrPXUucChvKTtyZXR1cm4gaz09PWpuP2w/dGhpcy5kYXRlKHRoaXMuZGF0ZSgpLSh0aGlzLmlzb1dlZWtkYXkoKS0xKSkuc3RhcnRPZigiZGF5Iik6dGhpcy5kYXRlKHRoaXMuZGF0ZSgpLTEtKHRoaXMuaXNvV2Vla2RheSgpLTEpKzcpLmVuZE9mKCJkYXkiKTppLmJpbmQodGhpcykobyxjKX19O3cuZXh0ZW5kKFluKSx3LmV4dGVuZChJbik7Y29uc3QgcHQ9IkdHR0ctW1ddV1ciLFhlPWNsYXNzIFhle2NvbnN0cnVjdG9yKCl7dGhpcy55ZWFyTW9udGhEYXlDYWNoZT1uZXcgTWFwLHRoaXMueWVhcldlZWtDYWNoZT1uZXcgTWFwLHRoaXMueWVhck1vbnRoQ2FjaGU9bmV3IE1hcCx0aGlzLnllYXJDYWNoZT1uZXcgTWFwfWdldFllYXJNb250aERheShlKXtyZXR1cm4gdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5oYXMoZSl8fHRoaXMueWVhck1vbnRoRGF5Q2FjaGUuc2V0KGUsdGUucGFyc2UoZSx0aGlzKSksdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5nZXQoZSl9Z2V0WWVhck1vbnRoKGUpe3JldHVybiB0aGlzLnllYXJNb250aENhY2hlLmhhcyhlKXx8dGhpcy55ZWFyTW9udGhDYWNoZS5zZXQoZSxuZS5wYXJzZShlLHRoaXMpKSx0aGlzLnllYXJNb250aENhY2hlLmdldChlKX1nZXRZZWFyV2VlayhlKXtyZXR1cm4gdGhpcy55ZWFyV2Vla0NhY2hlLmhhcyhlKXx8dGhpcy55ZWFyV2Vla0NhY2hlLnNldChlLHJlLnBhcnNlKGUsdGhpcykpLHRoaXMueWVhcldlZWtDYWNoZS5nZXQoZSl9Z2V0WWVhcihlKXtyZXR1cm4gdGhpcy55ZWFyQ2FjaGUuaGFzKGUpfHx0aGlzLnllYXJDYWNoZS5zZXQoZSxzZS5wYXJzZShlLHRoaXMpKSx0aGlzLnllYXJDYWNoZS5nZXQoZSl9c3RhdGljIGdldEluc3RhbmNlKCl7cmV0dXJuIHRoaXMuaW5zdGFuY2V9fTtYZS5pbnN0YW5jZT1uZXcgWGU7bGV0IHl0PVhlO2NsYXNzIHRle2NvbnN0cnVjdG9yKGUsdCxuLHMpe3RoaXMueWVhck51bWJlcj1lLHRoaXMubW9udGhOdW1iZXI9dCx0aGlzLmRheU51bWJlcj1uLHRoaXMuY2FjaGU9cyx0aGlzLnR5cGU9IlllYXJNb250aERheSIsdGhpcy5kYXRlPW5ldyBEYXRlKHRoaXMueWVhck51bWJlcix0aGlzLm1vbnRoTnVtYmVyLTEsdGhpcy5kYXlOdW1iZXIpLHRoaXMuZGF5anM9dyh0aGlzLmRhdGUpLHRoaXMuZGF0ZVN0cmluZz10aGlzLnRvU3RyaW5nKCl9Z2V0IHRleHQoKXtyZXR1cm4gdGhpcy5kYXlqcy5mb3JtYXQoIllZWVktTU0tREQiKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRleHR9ZW5nbGlzaE5hbWUoKXtyZXR1cm4gdGhpcy5kYXlqcy5mb3JtYXQoImRkZGQsIE1NTU0gRCwgWVlZWSIpfWdldCBmaXJzdERheSgpe3JldHVybiB0aGlzfWdldCBsYXN0RGF5KCl7cmV0dXJuIHRoaXN9Z2V0IHllYXIoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyKGAke3RoaXMueWVhck51bWJlcn1gKX1nZXQgbW9udGgoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgodGhpcy5kYXlqcy5mb3JtYXQoIllZWVktTU0iKSl9Z2V0IHdlZWsoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyV2Vlayh0aGlzLmRheWpzLmZvcm1hdChwdCkpfWFkZERheXMoZSl7Y29uc3Qgbj10aGlzLmRheWpzLmFkZChlLCJkYXkiKS5mb3JtYXQoIllZWVktTU0tREQiKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZGF5anMuZGlmZihlLmRheWpzLCJkYXkiKX1zdGF0aWMgcGFyc2UoZSx0KXtjb25zdFtuLHMsYV09ZS5zcGxpdCgiLSIpLm1hcChpPT5wYXJzZUludChpLDEwKSk7cmV0dXJuIG5ldyB0ZShuLHMsYSx0KX19Y2xhc3MgcmV7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuaXNvWWVhck51bWJlcj1lLHRoaXMuaXNvV2Vla051bWJlcj10LHRoaXMuY2FjaGU9bix0aGlzLnR5cGU9IlllYXJXZWVrIix0aGlzLmRhdGVTdHJpbmc9dGhpcy50b1N0cmluZygpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZm9ybWF0KHB0KX10b1N0cmluZygpe3JldHVybiB0aGlzLnRleHR9ZW5nbGlzaE5hbWUoKXtyZXR1cm5gV2VlayAke3RoaXMuaXNvV2Vla051bWJlcn0sICR7dGhpcy5pc29ZZWFyTnVtYmVyfWB9Z2V0IGZpcnN0RGF5KCl7Y29uc3QgZT13KCkueWVhcih0aGlzLmlzb1llYXJOdW1iZXIpLm1vbnRoKDEpLmRhdGUoNCkuaXNvV2Vlayh0aGlzLmlzb1dlZWtOdW1iZXIpLnN0YXJ0T2YoImlzb1dlZWsiKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkoZS5mb3JtYXQoIllZWVktTU0tREQiKSl9Z2V0IGxhc3REYXkoKXtjb25zdCB0PXcoKS55ZWFyKHRoaXMuaXNvWWVhck51bWJlcikuc3RhcnRPZigieWVhciIpLmFkZCgodGhpcy5pc29XZWVrTnVtYmVyLTEpKjcsImRheSIpLnN0YXJ0T2YoIndlZWsiKS5hZGQoMSwiZGF5IikuYWRkKDYsImRheSIpO3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aERheSh0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKX1nZXQgeWVhcigpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXIoYCR7dGhpcy5pc29ZZWFyTnVtYmVyfWApfWFkZFdlZWtzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwid2VlayIpLmZvcm1hdChwdCk7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcldlZWsobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJ3ZWVrIil9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3RbbixzXT1lLnNwbGl0KCItVyIpLm1hcChhPT5wYXJzZUludChhLDEwKSk7cmV0dXJuIG5ldyByZShuLHMsdCl9fWNsYXNzIG5le2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnllYXJOdW1iZXI9ZSx0aGlzLm1vbnRoTnVtYmVyPXQsdGhpcy5jYWNoZT1uLHRoaXMudHlwZT0iWWVhck1vbnRoIix0aGlzLmRhdGVTdHJpbmc9dGhpcy50b1N0cmluZygpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZm9ybWF0KCJZWVlZLU1NIil9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy50ZXh0fWVuZ2xpc2hOYW1lKCl7cmV0dXJuYCR7V24odGhpcy5tb250aE51bWJlcil9ICR7dGhpcy55ZWFyTnVtYmVyfWB9Z2V0IGZpcnN0RGF5KCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KHcoYCR7dGhpcy55ZWFyTnVtYmVyfS0ke3RoaXMubW9udGhOdW1iZXJ9LTAxYCkuZm9ybWF0KCJZWVlZLU1NLUREIikpfWdldCBsYXN0RGF5KCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KHcoYCR7dGhpcy55ZWFyTnVtYmVyfS0ke3RoaXMubW9udGhOdW1iZXJ9LTAxYCkuZW5kT2YoIm1vbnRoIikuZm9ybWF0KCJZWVlZLU1NLUREIikpfWdldCB5ZWFyKCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLnllYXJOdW1iZXJ9YCl9YWRkTW9udGhzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwibW9udGgiKS5mb3JtYXQoIllZWVktTU0iKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJtb250aCIpfXN0YXRpYyBwYXJzZShlLHQpe2NvbnN0W24sc109ZS5zcGxpdCgiLSIpLm1hcChhPT5wYXJzZUludChhLDEwKSk7cmV0dXJuIG5ldyBuZShuLHMsdCl9fWNsYXNzIHNle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy55ZWFyPWUsdGhpcy5jYWNoZT10LHRoaXMudHlwZT0iWWVhciIsdGhpcy5kYXRlU3RyaW5nPXRoaXMudG9TdHJpbmcoKX1nZXQgdGV4dCgpe3JldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmZvcm1hdCgiWVlZWSIpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudGV4dH1lbmdsaXNoTmFtZSgpe3JldHVybiB0aGlzLnllYXIudG9TdHJpbmcoKX1nZXQgZmlyc3RNb250aCgpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChgJHt0aGlzLnllYXJ9LTAxYCl9Z2V0IGxhc3RNb250aCgpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChgJHt0aGlzLnllYXJ9LTEyYCl9Z2V0IGZpcnN0RGF5KCl7cmV0dXJuIHRoaXMuZmlyc3RNb250aC5maXJzdERheX1nZXQgbGFzdERheSgpe3JldHVybiB0aGlzLmxhc3RNb250aC5sYXN0RGF5fWFkZFllYXJzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwieWVhciIpLmZvcm1hdCgiWVlZWSIpO3JldHVybiB0aGlzLmNhY2hlLmdldFllYXIobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJ5ZWFyIil9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3Qgbj1wYXJzZUludChlLDEwKTtyZXR1cm4gbmV3IHNlKG4sdCl9fWZ1bmN0aW9uIFduKHIpe3JldHVybiB3KCkubW9udGgoci0xKS5mb3JtYXQoIk1NTU0iKX1mdW5jdGlvbiBVdChyKXtzd2l0Y2goci50eXBlKXtjYXNlIlllYXJNb250aERheSI6cmV0dXJue3R5cGU6IlllYXJNb250aERheSIseWVhck51bWJlcjpyLnllYXJOdW1iZXIsbW9udGhOdW1iZXI6ci5tb250aE51bWJlcixkYXlOdW1iZXI6ci5kYXlOdW1iZXIsZGF0ZVN0cmluZzpyLmRhdGVTdHJpbmd9O2Nhc2UiWWVhcldlZWsiOnJldHVybnt0eXBlOiJZZWFyV2VlayIsaXNvWWVhck51bWJlcjpyLmlzb1llYXJOdW1iZXIsaXNvV2Vla051bWJlcjpyLmlzb1dlZWtOdW1iZXIsZGF0ZVN0cmluZzpyLmRhdGVTdHJpbmd9O2Nhc2UiWWVhck1vbnRoIjpyZXR1cm57dHlwZToiWWVhck1vbnRoIix5ZWFyTnVtYmVyOnIueWVhck51bWJlcixtb250aE51bWJlcjpyLm1vbnRoTnVtYmVyLGRhdGVTdHJpbmc6ci5kYXRlU3RyaW5nfTtjYXNlIlllYXIiOnJldHVybnt0eXBlOiJZZWFyIix5ZWFyOnIueWVhcixkYXRlU3RyaW5nOnIuZGF0ZVN0cmluZ319fWZ1bmN0aW9uIFBuKHIsZSl7Y29uc3QgdD1bXSxuPWUubWludXMocik7Zm9yKGxldCBzPTA7czw9bjtzKyspdC5wdXNoKHIuYWRkRGF5cyhzKSk7cmV0dXJuIHR9ZnVuY3Rpb24gVm4ocixlKXtjb25zdCB0PVtdLG49ZS5taW51cyhyKTtmb3IobGV0IHM9MDtzPD1uO3MrKyl0LnB1c2goci5hZGRXZWVrcyhzKSk7cmV0dXJuIHR9ZnVuY3Rpb24gTG4ocixlKXtjb25zdCB0PVtdLG49ZS5taW51cyhyKTtmb3IobGV0IHM9MDtzPD1uO3MrKyl0LnB1c2goci5hZGRNb250aHMocykpO3JldHVybiB0fWZ1bmN0aW9uIHpuKHIsZSl7Y29uc3QgdD1bXSxuPWUubWludXMocik7Zm9yKGxldCBzPTA7czw9bjtzKyspdC5wdXNoKHIuYWRkWWVhcnMocykpO3JldHVybiB0fWZ1bmN0aW9uIFVuKHIsZSl7aWYocj09PW51bGx8fGU9PT1udWxsKXJldHVybltdO2lmKHIgaW5zdGFuY2VvZiB0ZSYmZSBpbnN0YW5jZW9mIHRlKXJldHVybiBQbihyLGUpO2lmKHIgaW5zdGFuY2VvZiByZSYmZSBpbnN0YW5jZW9mIHJlKXJldHVybiBWbihyLGUpO2lmKHIgaW5zdGFuY2VvZiBuZSYmZSBpbnN0YW5jZW9mIG5lKXJldHVybiBMbihyLGUpO2lmKHIgaW5zdGFuY2VvZiBzZSYmZSBpbnN0YW5jZW9mIHNlKXJldHVybiB6bihyLGUpO3Rocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudHM6IHN0YXJ0IGFuZCBlbmQgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlOiAke3J9LCAke2V9YCl9ZnVuY3Rpb24gRm4ocixlKXtpZihyIGluc3RhbmNlb2YgdGUmJmUgaW5zdGFuY2VvZiB0ZXx8ciBpbnN0YW5jZW9mIHJlJiZlIGluc3RhbmNlb2YgcmV8fHIgaW5zdGFuY2VvZiBuZSYmZSBpbnN0YW5jZW9mIG5lfHxyIGluc3RhbmNlb2Ygc2UmJmUgaW5zdGFuY2VvZiBzZSlyZXR1cm4gci5taW51cyhlKTt0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wYXJlICR7cn0gYW5kICR7ZX1gKX1mdW5jdGlvbiBKZShyLGUpe2lmKHI9PT1udWxsKXJldHVybiAxO2lmKGU9PT1udWxsKXJldHVybi0xO2NvbnN0IHQ9Rm4ocixlKTtyZXR1cm4gdDwwPy0xOnQ+MD8xOjB9ZnVuY3Rpb24gQm4ocil7bGV0IGU9bnVsbCx0PW51bGw7Zm9yKGNvbnN0IG4gb2YgciluIT09bnVsbCYmKChlPT09bnVsbHx8SmUobixlKTwwKSYmKGU9biksKHQ9PT1udWxsfHxKZShuLHQpPjApJiYodD1uKSk7cmV0dXJuIGU9PT1udWxsfHx0PT09bnVsbD97bWluOm51bGwsbWF4Om51bGx9OnttaW46ZSxtYXg6dH19ZnVuY3Rpb24gV2UocixlKXtjb25zdCBuPXl0LmdldEluc3RhbmNlKCkuZ2V0WWVhck1vbnRoRGF5KHIpO3N3aXRjaChlKXtjYXNlImRheSI6cmV0dXJuIG47Y2FzZSJ3ZWVrIjpyZXR1cm4gbi53ZWVrO2Nhc2UibW9udGgiOnJldHVybiBuLm1vbnRoO2Nhc2UieWVhciI6cmV0dXJuIG4ueWVhcn19ZnVuY3Rpb24gSG4ocixlKXtyZXR1cm4gci5kYXRlUmFuZ2U9PT1udWxsPzE6ZS5kYXRlUmFuZ2U9PT1udWxsPy0xOkplKHIuZGF0ZVJhbmdlLGUuZGF0ZVJhbmdlKX1mdW5jdGlvbiBxbihyLGUpe3JldHVybntkYXRlUmFuZ2U6ci5kYXRlPT09bnVsbD9udWxsOldlKHIuZGF0ZSxlKSxjb3VudDpyLmNvdW50fX1jb25zdCBHbj0vXigoPzxzZWdtZW50PltBLVphLXowLTlfLV0rKSg/PTopOik/KD88dmFsdWVBdFJlZmVyZW5jZT5bQS1aYS16XSk/KD88cG9zaXRpb24+XGQrKSg/PHN1YnN0aXR1dGlvblZhbHVlPltBLVphLXouXSk/JC87Y2xhc3MgS2V7Y29uc3RydWN0b3IoZSx0LG4scyl7dGhpcy5zZWdtZW50PWUsdGhpcy52YWx1ZUF0UmVmZXJlbmNlPXQsdGhpcy5zdWJzdGl0dXRpb25WYWx1ZT1uLHRoaXMucG9zaXRpb249cyx0aGlzLnR5cGU9InN1YnN0aXR1dGlvbiI7Y29uc3QgYT10aGlzLnNlZ21lbnQ/YCR7dGhpcy5zZWdtZW50fTpgOiIiLGk9dGhpcy52YWx1ZUF0UmVmZXJlbmNlP2Ake3RoaXMudmFsdWVBdFJlZmVyZW5jZX1gOiIiLG89dGhpcy5zdWJzdGl0dXRpb25WYWx1ZT9gJHt0aGlzLnN1YnN0aXR1dGlvblZhbHVlfWA6IiI7dGhpcy5jb2RlPWAke2F9JHtpfSR7dGhpcy5wb3NpdGlvbn0ke299YH1lcXVhbHMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBLZT90aGlzLnNlZ21lbnQ9PT1lLnNlZ21lbnQmJnRoaXMudmFsdWVBdFJlZmVyZW5jZT09PWUudmFsdWVBdFJlZmVyZW5jZSYmdGhpcy5zdWJzdGl0dXRpb25WYWx1ZT09PWUuc3Vic3RpdHV0aW9uVmFsdWUmJnRoaXMucG9zaXRpb249PT1lLnBvc2l0aW9uOiExfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuY29kZX1zdGF0aWMgcGFyc2UoZSl7Y29uc3QgdD1lLm1hdGNoKEduKTtyZXR1cm4gdD09PW51bGx8fHQuZ3JvdXBzPT09dm9pZCAwP251bGw6bmV3IEtlKHQuZ3JvdXBzLnNlZ21lbnQsdC5ncm91cHMudmFsdWVBdFJlZmVyZW5jZSx0Lmdyb3Vwcy5zdWJzdGl0dXRpb25WYWx1ZSxwYXJzZUludCh0Lmdyb3Vwcy5wb3NpdGlvbiwxMCkpfX1jb25zdCBKbj0vXigoPzxzZWdtZW50PltBLVphLXowLTlfLV0rKSg/PTopOik/KD88dmFsdWVBdFJlZmVyZW5jZT5bQS1aYS16XSk/KD88cG9zaXRpb24+XGQrKSgtKSQvO2NsYXNzIGdle2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnNlZ21lbnQ9ZSx0aGlzLnZhbHVlQXRSZWZlcmVuY2U9dCx0aGlzLnBvc2l0aW9uPW4sdGhpcy50eXBlPSJkZWxldGlvbiI7Y29uc3Qgcz10aGlzLnNlZ21lbnQ/YCR7dGhpcy5zZWdtZW50fTpgOiIiLGE9dGhpcy52YWx1ZUF0UmVmZXJlbmNlP2Ake3RoaXMudmFsdWVBdFJlZmVyZW5jZX1gOiIiO3RoaXMuY29kZT1gJHtzfSR7YX0ke3RoaXMucG9zaXRpb259LWB9ZXF1YWxzKGUpe3JldHVybiBlIGluc3RhbmNlb2YgZ2U/dGhpcy5zZWdtZW50PT09ZS5zZWdtZW50JiZ0aGlzLnZhbHVlQXRSZWZlcmVuY2U9PT1lLnZhbHVlQXRSZWZlcmVuY2UmJnRoaXMucG9zaXRpb249PT1lLnBvc2l0aW9uOiExfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuY29kZX1zdGF0aWMgcGFyc2UoZSl7Y29uc3QgdD1lLm1hdGNoKEpuKTtyZXR1cm4gdD09PW51bGx8fHQuZ3JvdXBzPT09dm9pZCAwP251bGw6bmV3IGdlKHQuZ3JvdXBzLnNlZ21lbnQsdC5ncm91cHMudmFsdWVBdFJlZmVyZW5jZSxwYXJzZUludCh0Lmdyb3Vwcy5wb3NpdGlvbiwxMCkpfX1mdW5jdGlvbiBGdChyKXtzd2l0Y2goci50eXBlKXtjYXNlInN1YnN0aXR1dGlvbiI6cmV0dXJue3R5cGU6InN1YnN0aXR1dGlvbiIsY29kZTpyLmNvZGUsc2VnbWVudDpyLnNlZ21lbnQscG9zaXRpb246ci5wb3NpdGlvbix2YWx1ZUF0UmVmZXJlbmNlOnIudmFsdWVBdFJlZmVyZW5jZSxzdWJzdGl0dXRpb25WYWx1ZTpyLnN1YnN0aXR1dGlvblZhbHVlfTtjYXNlImRlbGV0aW9uIjpyZXR1cm57dHlwZToiZGVsZXRpb24iLGNvZGU6ci5jb2RlLHNlZ21lbnQ6ci5zZWdtZW50LHBvc2l0aW9uOnIucG9zaXRpb24sdmFsdWVBdFJlZmVyZW5jZTpyLnZhbHVlQXRSZWZlcmVuY2V9fX1jbGFzcyBLbntjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5maWx0ZXI9ZSx0aGlzLnNlcXVlbmNlVHlwZT10LHRoaXMubWluUHJvcG9ydGlvbj1ufWFzeW5jIGV2YWx1YXRlKGUsdCl7cmV0dXJue2NvbnRlbnQ6KGF3YWl0IHRoaXMuZmV0Y2hNdXRhdGlvbnMoZSx0KSkubWFwKCh7Y291bnQ6YSxwcm9wb3J0aW9uOmksbXV0YXRpb25Gcm9tOm8sbXV0YXRpb25UbzpjLHBvc2l0aW9uOnUsc2VxdWVuY2VOYW1lOmx9KT0+Yz09PSItIj97dHlwZToiZGVsZXRpb24iLG11dGF0aW9uOm5ldyBnZShsPz92b2lkIDAsbyx1KSxjb3VudDphLHByb3BvcnRpb246aX06e3R5cGU6InN1YnN0aXR1dGlvbiIsbXV0YXRpb246bmV3IEtlKGw/P3ZvaWQgMCxvLGMsdSksY291bnQ6YSxwcm9wb3J0aW9uOml9KX19YXN5bmMgZmV0Y2hNdXRhdGlvbnMoZSx0KXtjb25zdCBuPXsuLi50aGlzLmZpbHRlcixtaW5Qcm9wb3J0aW9uOnRoaXMubWluUHJvcG9ydGlvbn07cmV0dXJuIGZuKGUsbix0aGlzLnNlcXVlbmNlVHlwZSx0KS50aGVuKHM9PnMuZGF0YSl9fXZhciBCdDtCdD17X19lOmZ1bmN0aW9uKHIsZSx0LG4pe2Zvcih2YXIgcyxhLGk7ZT1lLl9fOylpZigocz1lLl9fYykmJiFzLl9fKXRyeXtpZigoYT1zLmNvbnN0cnVjdG9yKSYmYS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IhPW51bGwmJihzLnNldFN0YXRlKGEuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKHIpKSxpPXMuX19kKSxzLmNvbXBvbmVudERpZENhdGNoIT1udWxsJiYocy5jb21wb25lbnREaWRDYXRjaChyLG58fHt9KSxpPXMuX19kKSxpKXJldHVybiBzLl9fRT1zfWNhdGNoKG8pe3I9b310aHJvdyByfX0sdHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiImJlByb21pc2UucHJvdG90eXBlLnRoZW4uYmluZChQcm9taXNlLnJlc29sdmUoKSk7dmFyIFYsZ3QsSHQscXQ9W10sJD1CdCxHdD0kLl9fYixKdD0kLl9fcixLdD0kLmRpZmZlZCxRdD0kLl9fYyxYdD0kLnVubW91bnQsZXI9JC5fXztmdW5jdGlvbiBRbigpe2Zvcih2YXIgcjtyPXF0LnNoaWZ0KCk7KWlmKHIuX19QJiZyLl9fSCl0cnl7ci5fX0guX19oLmZvckVhY2goUWUpLHIuX19ILl9faC5mb3JFYWNoKHZ0KSxyLl9fSC5fX2g9W119Y2F0Y2goZSl7ci5fX0guX19oPVtdLCQuX19lKGUsci5fX3YpfX0kLl9fYj1mdW5jdGlvbihyKXtWPW51bGwsR3QmJkd0KHIpfSwkLl9fPWZ1bmN0aW9uKHIsZSl7ciYmZS5fX2smJmUuX19rLl9fbSYmKHIuX19tPWUuX19rLl9fbSksZXImJmVyKHIsZSl9LCQuX19yPWZ1bmN0aW9uKHIpe0p0JiZKdChyKTt2YXIgZT0oVj1yLl9fYykuX19IO2UmJihndD09PVY/KGUuX19oPVtdLFYuX19oPVtdLGUuX18uZm9yRWFjaChmdW5jdGlvbih0KXt0Ll9fTiYmKHQuX189dC5fX04pLHQuaT10Ll9fTj12b2lkIDB9KSk6KGUuX19oLmZvckVhY2goUWUpLGUuX19oLmZvckVhY2godnQpLGUuX19oPVtdKSksZ3Q9Vn0sJC5kaWZmZWQ9ZnVuY3Rpb24ocil7S3QmJkt0KHIpO3ZhciBlPXIuX19jO2UmJmUuX19IJiYoZS5fX0guX19oLmxlbmd0aCYmKHF0LnB1c2goZSkhPT0xJiZIdD09PSQucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHwoKEh0PSQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKXx8WG4pKFFuKSksZS5fX0guX18uZm9yRWFjaChmdW5jdGlvbih0KXt0LmkmJih0Ll9fSD10LmkpLHQuaT12b2lkIDB9KSksZ3Q9Vj1udWxsfSwkLl9fYz1mdW5jdGlvbihyLGUpe2Uuc29tZShmdW5jdGlvbih0KXt0cnl7dC5fX2guZm9yRWFjaChRZSksdC5fX2g9dC5fX2guZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiFuLl9ffHx2dChuKX0pfWNhdGNoKG4pe2Uuc29tZShmdW5jdGlvbihzKXtzLl9faCYmKHMuX19oPVtdKX0pLGU9W10sJC5fX2Uobix0Ll9fdil9fSksUXQmJlF0KHIsZSl9LCQudW5tb3VudD1mdW5jdGlvbihyKXtYdCYmWHQocik7dmFyIGUsdD1yLl9fYzt0JiZ0Ll9fSCYmKHQuX19ILl9fLmZvckVhY2goZnVuY3Rpb24obil7dHJ5e1FlKG4pfWNhdGNoKHMpe2U9c319KSx0Ll9fSD12b2lkIDAsZSYmJC5fX2UoZSx0Ll9fdikpfTt2YXIgdHI9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIjtmdW5jdGlvbiBYbihyKXt2YXIgZSx0PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KG4pLHRyJiZjYW5jZWxBbmltYXRpb25GcmFtZShlKSxzZXRUaW1lb3V0KHIpfSxuPXNldFRpbWVvdXQodCwxMDApO3RyJiYoZT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCkpfWZ1bmN0aW9uIFFlKHIpe3ZhciBlPVYsdD1yLl9fYzt0eXBlb2YgdD09ImZ1bmN0aW9uIiYmKHIuX19jPXZvaWQgMCx0KCkpLFY9ZX1mdW5jdGlvbiB2dChyKXt2YXIgZT1WO3IuX19jPXIuX18oKSxWPWV9Y2xhc3MgcnIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKHQpLHRoaXMuaGVhZGxpbmU9ZSx0aGlzLm5hbWU9IlVzZXJGYWNpbmdFcnJvciJ9fWNsYXNzIGVze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcz1lLHRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcz10LHRoaXMuZGF0YT1uZXcgTWFwLHRoaXMua2V5c0ZpcnN0QXhpcz1uZXcgTWFwLHRoaXMua2V5c1NlY29uZEF4aXM9bmV3IE1hcCxuJiYodGhpcy5rZXlzRmlyc3RBeGlzPW5ldyBNYXAobi5rZXlzRmlyc3RBeGlzKSx0aGlzLmtleXNTZWNvbmRBeGlzPW5ldyBNYXAobi5rZXlzU2Vjb25kQXhpcyksdGhpcy5kYXRhPW5ldyBNYXAobi5kYXRhKSl9Z2V0KGUsdCl7dmFyIGE7Y29uc3Qgbj10aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhlKSxzPXRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcyh0KTtyZXR1cm4oYT10aGlzLmRhdGEuZ2V0KG4pKT09bnVsbD92b2lkIDA6YS5nZXQocyl9Z2V0Um93KGUsdCl7Y29uc3Qgbj10aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhlKSxzPXRoaXMuZGF0YS5nZXQobik7cmV0dXJuIHM9PT12b2lkIDA/W106QXJyYXkuZnJvbSh0aGlzLmtleXNTZWNvbmRBeGlzLmtleXMoKSkubWFwKGE9PnMuZ2V0KGEpPz90KX1zZXQoZSx0LG4pe2NvbnN0IHM9dGhpcy5zZXJpYWxpemVGaXJzdEF4aXMoZSksYT10aGlzLnNlcmlhbGl6ZVNlY29uZEF4aXModCk7dGhpcy5kYXRhLmhhcyhzKXx8dGhpcy5kYXRhLnNldChzLG5ldyBNYXApLHRoaXMuZGF0YS5nZXQocykuc2V0KGEsbiksdGhpcy5rZXlzRmlyc3RBeGlzLnNldChzLGUpLHRoaXMua2V5c1NlY29uZEF4aXMuc2V0KGEsdCl9ZGVsZXRlUm93KGUpe2NvbnN0IHQ9dGhpcy5zZXJpYWxpemVGaXJzdEF4aXMoZSk7dGhpcy5kYXRhLmRlbGV0ZSh0KSx0aGlzLmtleXNGaXJzdEF4aXMuZGVsZXRlKHQpfWdldEZpcnN0QXhpc0tleXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmtleXNGaXJzdEF4aXMudmFsdWVzKCkpfWdldFNlY29uZEF4aXNLZXlzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5rZXlzU2Vjb25kQXhpcy52YWx1ZXMoKSl9Z2V0QXNBcnJheShlKXtyZXR1cm4gdGhpcy5nZXRGaXJzdEF4aXNLZXlzKCkubWFwKHQ9PnRoaXMuZ2V0U2Vjb25kQXhpc0tleXMoKS5tYXAobj0+dGhpcy5nZXQodCxuKT8/ZSkpfWdldENvbnRlbnRzKCl7cmV0dXJue2tleXNGaXJzdEF4aXM6dGhpcy5rZXlzRmlyc3RBeGlzLGtleXNTZWNvbmRBeGlzOnRoaXMua2V5c1NlY29uZEF4aXMsZGF0YTp0aGlzLmRhdGF9fX1jbGFzcyB0cyBleHRlbmRzIGVze2NvbnN0cnVjdG9yKGUpe3N1cGVyKGxzLGhzLGUpfX1jb25zdCBycz0ocixlKT0+e2lmKHIuc2VnbWVudCE9PWUuc2VnbWVudClyZXR1cm4gbnMoci5zZWdtZW50LGUuc2VnbWVudCk7aWYoci5wb3NpdGlvbiE9PWUucG9zaXRpb24pcmV0dXJuIHNzKHIucG9zaXRpb24sZS5wb3NpdGlvbik7Y29uc3QgdD1yIGluc3RhbmNlb2YgZ2Usbj1lIGluc3RhbmNlb2YgZ2U7cmV0dXJuIHQhPT1uP3Q/MTotMTohdCYmIW4mJnIuc3Vic3RpdHV0aW9uVmFsdWUhPT1lLnN1YnN0aXR1dGlvblZhbHVlP2FzKHIuc3Vic3RpdHV0aW9uVmFsdWUsZS5zdWJzdGl0dXRpb25WYWx1ZSk6MH0sbnM9KHIsZSk9PnI9PT12b2lkIDA/LTE6ZT09PXZvaWQgMD8xOnIubG9jYWxlQ29tcGFyZShlKSxzcz0ocixlKT0+ci1lLGFzPShyLGUpPT5yPT09dm9pZCAwPy0xOmU9PT12b2lkIDA/MTpyLmxvY2FsZUNvbXBhcmUoZSksbnI9MjAwO2FzeW5jIGZ1bmN0aW9uIGlzKHtsYXBpc0ZpbHRlcjpyLHNlcXVlbmNlVHlwZTplLGxhcGlzOnQsZ3JhbnVsYXJpdHk6bixsYXBpc0RhdGVGaWVsZDpzLHNpZ25hbDphfSl7Y29uc3QgaT1hd2FpdCBzcihyLHQsbixzLGEpO2lmKGkubGVuZ3RoPT09MClyZXR1cm57Y29udGVudDpbXX07Y29uc3Qgbz17Li4ucixbYCR7c31Gcm9tYF06aVswXS5maXJzdERheS50b1N0cmluZygpLFtgJHtzfVRvYF06aVtpLmxlbmd0aC0xXS5sYXN0RGF5LnRvU3RyaW5nKCl9O3JldHVybiBhcihvLGUpLmV2YWx1YXRlKHQsYSl9YXN5bmMgZnVuY3Rpb24gb3Moe2xhcGlzRmlsdGVyOnIsc2VxdWVuY2VUeXBlOmUsbGFwaXM6dCxsYXBpc0RhdGVGaWVsZDpuLGdyYW51bGFyaXR5OnMsc2lnbmFsOmF9KXtjb25zdCBpPWF3YWl0IHNyKHIsdCxzLG4sYSk7aWYoaS5sZW5ndGg+bnIpdGhyb3cgbmV3IHJyKCJUb28gbWFueSBkYXRlcyIsYFRoZSBkYXRhc2V0IHdvdWxkIGNvbnRhaW4gJHtpLmxlbmd0aH0gZGF0ZSBpbnRlcnZhbHMuIFBsZWFzZSByZWR1Y2UgdGhlIG51bWJlciB0byBiZWxvdyAke25yfSB0byBkaXNwbGF5IHRoZSBkYXRhLiBZb3UgY2FuIGFjaGlldmUgdGhpcyBieSBlaXRoZXIgbmFycm93aW5nIHRoZSBkYXRlIHJhbmdlIGluIHRoZSBwcm92aWRlZCBMQVBJUyBmaWx0ZXIgb3IgYnkgc2VsZWN0aW5nIGEgbGFyZ2VyIGdyYW51bGFyaXR5LmApO2NvbnN0IG89aS5tYXAoYXN5bmMgbD0+e2NvbnN0IGs9bC5maXJzdERheS50b1N0cmluZygpLFM9bC5sYXN0RGF5LnRvU3RyaW5nKCksTT17Li4ucixbYCR7bn1Gcm9tYF06ayxbYCR7bn1Ub2BdOlN9LEY9YXdhaXQgYXIoTSxlKS5ldmFsdWF0ZSh0LGEpLGFlPWF3YWl0IG1zKE0pLmV2YWx1YXRlKHQsYSk7cmV0dXJue2RhdGU6bCxtdXRhdGlvbnM6Ri5jb250ZW50LHRvdGFsQ291bnQ6YWUuY29udGVudFswXS5jb3VudH19KSxjPWF3YWl0IFByb21pc2UuYWxsKG8pLHU9KGF3YWl0IGlzKHtsYXBpc0ZpbHRlcjpyLHNlcXVlbmNlVHlwZTplLGxhcGlzOnQsbGFwaXNEYXRlRmllbGQ6bixncmFudWxhcml0eTpzfSkpLmNvbnRlbnQ7cmV0dXJue211dGF0aW9uT3ZlclRpbWVEYXRhOmZzKGMsdSksb3ZlcmFsbE11dGF0aW9uRGF0YTp1fX1hc3luYyBmdW5jdGlvbiBzcihyLGUsdCxuLHMpe2NvbnN0e2NvbnRlbnQ6YX09YXdhaXQgdXMocixlLHQsbixzKSx7ZGF0ZUZyb206aSxkYXRlVG86b309Y3MocixuLHQpLHttaW46YyxtYXg6dX09Qm4oYSk7cmV0dXJuIFVuKGk/P2Msbz8/dSl9ZnVuY3Rpb24gY3MocixlLHQpe2NvbnN0IG49cltlXTtpZihuKXJldHVybntkYXRlRnJvbTpXZShuLHQpLGRhdGVUbzpXZShuLHQpfTtjb25zdCBzPXJbYCR7ZX1Gcm9tYF0sYT1yW2Ake2V9VG9gXTtyZXR1cm57ZGF0ZUZyb206cz9XZShzLHQpOm51bGwsZGF0ZVRvOmE/V2UoYSx0KTpudWxsfX1mdW5jdGlvbiB1cyhyLGUsdCxuLHMpe3JldHVybiBkcyhyLHQsbikuZXZhbHVhdGUoZSxzKX1mdW5jdGlvbiBkcyhyLGUsdCl7Y29uc3Qgbj1uZXcgQ3QocixbdF0pLHM9bmV3IHhuKG4sdCwiZGF0ZSIpLGE9bmV3IGR0KHMsYz0+cW4oYyxlKSksaT1uZXcgX24oYSwiZGF0ZVJhbmdlIiwiY291bnQiKSxvPW5ldyBrbihpLEhuKTtyZXR1cm4gbmV3IGR0KG8sYz0+Yy5kYXRlUmFuZ2UpfWZ1bmN0aW9uIGFyKHIsZSl7cmV0dXJuIG5ldyBLbihyLGUsLjAwMSl9ZnVuY3Rpb24gbHMocil7cmV0dXJuIHIuY29kZX1mdW5jdGlvbiBocyhyKXtyZXR1cm4gci5kYXRlU3RyaW5nfWZ1bmN0aW9uIGZzKHIsZSl7Y29uc3QgdD1uZXcgdHMsbj1yLm1hcChpPT5pLmRhdGUpLHM9ZS5zb3J0KChpLG8pPT5ycyhpLm11dGF0aW9uLG8ubXV0YXRpb24pKS5tYXAoaT0+RnQoaS5tdXRhdGlvbikpLGE9bi5zb3J0KChpLG8pPT5KZShpLG8pKS5tYXAoaT0+VXQoaSkpO3JldHVybiBzLmZvckVhY2goaT0+e2EuZm9yRWFjaChvPT57dC5zZXQoaSxvLHtjb3VudDowLHByb3BvcnRpb246MCx0b3RhbENvdW50OjB9KX0pfSksci5mb3JFYWNoKGk9PntpLm11dGF0aW9ucy5mb3JFYWNoKG89Pntjb25zdCBjPUZ0KG8ubXV0YXRpb24pLHU9VXQoaS5kYXRlKTt0LmdldChjLHUpIT09dm9pZCAwJiZ0LnNldChjLHUse2NvdW50Om8uY291bnQscHJvcG9ydGlvbjpvLnByb3BvcnRpb24sdG90YWxDb3VudDppLnRvdGFsQ291bnR9KX0pfSksdH1mdW5jdGlvbiBtcyhyKXtyZXR1cm4gbmV3IEN0KHIpfWFzeW5jIGZ1bmN0aW9uIHBzKHIpe3RyeXtwb3N0TWVzc2FnZSh7c3RhdHVzOiJsb2FkaW5nIn0pO2NvbnN0IGU9YXdhaXQgcigpO3Bvc3RNZXNzYWdlKHtzdGF0dXM6InN1Y2Nlc3MiLGRhdGE6ZX0pfWNhdGNoKGUpe3Bvc3RNZXNzYWdlKGUgaW5zdGFuY2VvZiBycj97c3RhdHVzOiJlcnJvciIsdXNlckZhY2luZzohMCxoZWFkbGluZTplLmhlYWRsaW5lLGVycm9yOmV9OntzdGF0dXM6ImVycm9yIix1c2VyRmFjaW5nOiExLGVycm9yOmUgaW5zdGFuY2VvZiBFcnJvcj9lOm5ldyBFcnJvcihgJHtlfWApfSl9fWFzeW5jIGZ1bmN0aW9uIHlzKHIpe2NvbnN0IGU9YXdhaXQgb3Moci5kYXRhKTtyZXR1cm57b3ZlcmFsbE11dGF0aW9uRGF0YTplLm92ZXJhbGxNdXRhdGlvbkRhdGEsbXV0YXRpb25PdmVyVGltZVNlcmlhbGl6ZWQ6ZS5tdXRhdGlvbk92ZXJUaW1lRGF0YS5nZXRDb250ZW50cygpfX1zZWxmLm9ubWVzc2FnZT1hc3luYyBmdW5jdGlvbihyKXthd2FpdCBwcygoKT0+eXMocikpfX0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW11dGF0aW9uT3ZlclRpbWVXb3JrZXItTVZTdDFGVncuanMubWFwCg==", xS = (n) => Uint8Array.from(atob(n), (t) => t.charCodeAt(0)), Kf = typeof self < "u" && self.Blob && new Blob([xS(rg)], { type: "text/javascript;charset=utf-8" });
|
|
23739
|
+
const rg = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB4OyhmdW5jdGlvbihyKXtyLmFzc2VydEVxdWFsPXM9PnM7ZnVuY3Rpb24gZShzKXt9ci5hc3NlcnRJcz1lO2Z1bmN0aW9uIHQocyl7dGhyb3cgbmV3IEVycm9yfXIuYXNzZXJ0TmV2ZXI9dCxyLmFycmF5VG9FbnVtPXM9Pntjb25zdCBhPXt9O2Zvcihjb25zdCBpIG9mIHMpYVtpXT1pO3JldHVybiBhfSxyLmdldFZhbGlkRW51bVZhbHVlcz1zPT57Y29uc3QgYT1yLm9iamVjdEtleXMocykuZmlsdGVyKG89PnR5cGVvZiBzW3Nbb11dIT0ibnVtYmVyIiksaT17fTtmb3IoY29uc3QgbyBvZiBhKWlbb109c1tvXTtyZXR1cm4gci5vYmplY3RWYWx1ZXMoaSl9LHIub2JqZWN0VmFsdWVzPXM9PnIub2JqZWN0S2V5cyhzKS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIHNbYV19KSxyLm9iamVjdEtleXM9dHlwZW9mIE9iamVjdC5rZXlzPT0iZnVuY3Rpb24iP3M9Pk9iamVjdC5rZXlzKHMpOnM9Pntjb25zdCBhPVtdO2Zvcihjb25zdCBpIGluIHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsaSkmJmEucHVzaChpKTtyZXR1cm4gYX0sci5maW5kPShzLGEpPT57Zm9yKGNvbnN0IGkgb2YgcylpZihhKGkpKXJldHVybiBpfSxyLmlzSW50ZWdlcj10eXBlb2YgTnVtYmVyLmlzSW50ZWdlcj09ImZ1bmN0aW9uIj9zPT5OdW1iZXIuaXNJbnRlZ2VyKHMpOnM9PnR5cGVvZiBzPT0ibnVtYmVyIiYmaXNGaW5pdGUocykmJk1hdGguZmxvb3Iocyk9PT1zO2Z1bmN0aW9uIG4ocyxhPSIgfCAiKXtyZXR1cm4gcy5tYXAoaT0+dHlwZW9mIGk9PSJzdHJpbmciP2AnJHtpfSdgOmkpLmpvaW4oYSl9ci5qb2luVmFsdWVzPW4sci5qc29uU3RyaW5naWZ5UmVwbGFjZXI9KHMsYSk9PnR5cGVvZiBhPT0iYmlnaW50Ij9hLnRvU3RyaW5nKCk6YX0pKHh8fCh4PXt9KSk7dmFyIHJ0OyhmdW5jdGlvbihyKXtyLm1lcmdlU2hhcGVzPShlLHQpPT4oey4uLmUsLi4udH0pfSkocnR8fChydD17fSkpO2NvbnN0IGY9eC5hcnJheVRvRW51bShbInN0cmluZyIsIm5hbiIsIm51bWJlciIsImludGVnZXIiLCJmbG9hdCIsImJvb2xlYW4iLCJkYXRlIiwiYmlnaW50Iiwic3ltYm9sIiwiZnVuY3Rpb24iLCJ1bmRlZmluZWQiLCJudWxsIiwiYXJyYXkiLCJvYmplY3QiLCJ1bmtub3duIiwicHJvbWlzZSIsInZvaWQiLCJuZXZlciIsIm1hcCIsInNldCJdKSxCPXI9Pntzd2l0Y2godHlwZW9mIHIpe2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4gZi51bmRlZmluZWQ7Y2FzZSJzdHJpbmciOnJldHVybiBmLnN0cmluZztjYXNlIm51bWJlciI6cmV0dXJuIGlzTmFOKHIpP2YubmFuOmYubnVtYmVyO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIGYuYm9vbGVhbjtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZi5mdW5jdGlvbjtjYXNlImJpZ2ludCI6cmV0dXJuIGYuYmlnaW50O2Nhc2Uic3ltYm9sIjpyZXR1cm4gZi5zeW1ib2w7Y2FzZSJvYmplY3QiOnJldHVybiBBcnJheS5pc0FycmF5KHIpP2YuYXJyYXk6cj09PW51bGw/Zi5udWxsOnIudGhlbiYmdHlwZW9mIHIudGhlbj09ImZ1bmN0aW9uIiYmci5jYXRjaCYmdHlwZW9mIHIuY2F0Y2g9PSJmdW5jdGlvbiI/Zi5wcm9taXNlOnR5cGVvZiBNYXA8InUiJiZyIGluc3RhbmNlb2YgTWFwP2YubWFwOnR5cGVvZiBTZXQ8InUiJiZyIGluc3RhbmNlb2YgU2V0P2Yuc2V0OnR5cGVvZiBEYXRlPCJ1IiYmciBpbnN0YW5jZW9mIERhdGU/Zi5kYXRlOmYub2JqZWN0O2RlZmF1bHQ6cmV0dXJuIGYudW5rbm93bn19LGQ9eC5hcnJheVRvRW51bShbImludmFsaWRfdHlwZSIsImludmFsaWRfbGl0ZXJhbCIsImN1c3RvbSIsImludmFsaWRfdW5pb24iLCJpbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3IiLCJpbnZhbGlkX2VudW1fdmFsdWUiLCJ1bnJlY29nbml6ZWRfa2V5cyIsImludmFsaWRfYXJndW1lbnRzIiwiaW52YWxpZF9yZXR1cm5fdHlwZSIsImludmFsaWRfZGF0ZSIsImludmFsaWRfc3RyaW5nIiwidG9vX3NtYWxsIiwidG9vX2JpZyIsImludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzIiwibm90X211bHRpcGxlX29mIiwibm90X2Zpbml0ZSJdKSxpcj1yPT5KU09OLnN0cmluZ2lmeShyLG51bGwsMikucmVwbGFjZSgvIihbXiJdKykiOi9nLCIkMToiKTtjbGFzcyBBIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzc3Vlcz1bXSx0aGlzLmFkZElzc3VlPW49Pnt0aGlzLmlzc3Vlcz1bLi4udGhpcy5pc3N1ZXMsbl19LHRoaXMuYWRkSXNzdWVzPShuPVtdKT0+e3RoaXMuaXNzdWVzPVsuLi50aGlzLmlzc3VlcywuLi5uXX07Y29uc3QgdD1uZXcudGFyZ2V0LnByb3RvdHlwZTtPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsdCk6dGhpcy5fX3Byb3RvX189dCx0aGlzLm5hbWU9IlpvZEVycm9yIix0aGlzLmlzc3Vlcz1lfWdldCBlcnJvcnMoKXtyZXR1cm4gdGhpcy5pc3N1ZXN9Zm9ybWF0KGUpe2NvbnN0IHQ9ZXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWVzc2FnZX0sbj17X2Vycm9yczpbXX0scz1hPT57Zm9yKGNvbnN0IGkgb2YgYS5pc3N1ZXMpaWYoaS5jb2RlPT09ImludmFsaWRfdW5pb24iKWkudW5pb25FcnJvcnMubWFwKHMpO2Vsc2UgaWYoaS5jb2RlPT09ImludmFsaWRfcmV0dXJuX3R5cGUiKXMoaS5yZXR1cm5UeXBlRXJyb3IpO2Vsc2UgaWYoaS5jb2RlPT09ImludmFsaWRfYXJndW1lbnRzIilzKGkuYXJndW1lbnRzRXJyb3IpO2Vsc2UgaWYoaS5wYXRoLmxlbmd0aD09PTApbi5fZXJyb3JzLnB1c2godChpKSk7ZWxzZXtsZXQgbz1uLGM9MDtmb3IoO2M8aS5wYXRoLmxlbmd0aDspe2NvbnN0IHU9aS5wYXRoW2NdO2M9PT1pLnBhdGgubGVuZ3RoLTE/KG9bdV09b1t1XXx8e19lcnJvcnM6W119LG9bdV0uX2Vycm9ycy5wdXNoKHQoaSkpKTpvW3VdPW9bdV18fHtfZXJyb3JzOltdfSxvPW9bdV0sYysrfX19O3JldHVybiBzKHRoaXMpLG59c3RhdGljIGFzc2VydChlKXtpZighKGUgaW5zdGFuY2VvZiBBKSl0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIFpvZEVycm9yOiAke2V9YCl9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5tZXNzYWdlfWdldCBtZXNzYWdlKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuaXNzdWVzLHguanNvblN0cmluZ2lmeVJlcGxhY2VyLDIpfWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aD09PTB9ZmxhdHRlbihlPXQ9PnQubWVzc2FnZSl7Y29uc3QgdD17fSxuPVtdO2Zvcihjb25zdCBzIG9mIHRoaXMuaXNzdWVzKXMucGF0aC5sZW5ndGg+MD8odFtzLnBhdGhbMF1dPXRbcy5wYXRoWzBdXXx8W10sdFtzLnBhdGhbMF1dLnB1c2goZShzKSkpOm4ucHVzaChlKHMpKTtyZXR1cm57Zm9ybUVycm9yczpuLGZpZWxkRXJyb3JzOnR9fWdldCBmb3JtRXJyb3JzKCl7cmV0dXJuIHRoaXMuZmxhdHRlbigpfX1BLmNyZWF0ZT1yPT5uZXcgQShyKTtjb25zdCBpZT0ocixlKT0+e2xldCB0O3N3aXRjaChyLmNvZGUpe2Nhc2UgZC5pbnZhbGlkX3R5cGU6ci5yZWNlaXZlZD09PWYudW5kZWZpbmVkP3Q9IlJlcXVpcmVkIjp0PWBFeHBlY3RlZCAke3IuZXhwZWN0ZWR9LCByZWNlaXZlZCAke3IucmVjZWl2ZWR9YDticmVhaztjYXNlIGQuaW52YWxpZF9saXRlcmFsOnQ9YEludmFsaWQgbGl0ZXJhbCB2YWx1ZSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShyLmV4cGVjdGVkLHguanNvblN0cmluZ2lmeVJlcGxhY2VyKX1gO2JyZWFrO2Nhc2UgZC51bnJlY29nbml6ZWRfa2V5czp0PWBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt4LmpvaW5WYWx1ZXMoci5rZXlzLCIsICIpfWA7YnJlYWs7Y2FzZSBkLmludmFsaWRfdW5pb246dD0iSW52YWxpZCBpbnB1dCI7YnJlYWs7Y2FzZSBkLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjp0PWBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7eC5qb2luVmFsdWVzKHIub3B0aW9ucyl9YDticmVhaztjYXNlIGQuaW52YWxpZF9lbnVtX3ZhbHVlOnQ9YEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt4LmpvaW5WYWx1ZXMoci5vcHRpb25zKX0sIHJlY2VpdmVkICcke3IucmVjZWl2ZWR9J2A7YnJlYWs7Y2FzZSBkLmludmFsaWRfYXJndW1lbnRzOnQ9IkludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzIjticmVhaztjYXNlIGQuaW52YWxpZF9yZXR1cm5fdHlwZTp0PSJJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlIjticmVhaztjYXNlIGQuaW52YWxpZF9kYXRlOnQ9IkludmFsaWQgZGF0ZSI7YnJlYWs7Y2FzZSBkLmludmFsaWRfc3RyaW5nOnR5cGVvZiByLnZhbGlkYXRpb249PSJvYmplY3QiPyJpbmNsdWRlcyJpbiByLnZhbGlkYXRpb24/KHQ9YEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSAiJHtyLnZhbGlkYXRpb24uaW5jbHVkZXN9ImAsdHlwZW9mIHIudmFsaWRhdGlvbi5wb3NpdGlvbj09Im51bWJlciImJih0PWAke3R9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtyLnZhbGlkYXRpb24ucG9zaXRpb259YCkpOiJzdGFydHNXaXRoImluIHIudmFsaWRhdGlvbj90PWBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggIiR7ci52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9ImA6ImVuZHNXaXRoImluIHIudmFsaWRhdGlvbj90PWBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoICIke3IudmFsaWRhdGlvbi5lbmRzV2l0aH0iYDp4LmFzc2VydE5ldmVyKHIudmFsaWRhdGlvbik6ci52YWxpZGF0aW9uIT09InJlZ2V4Ij90PWBJbnZhbGlkICR7ci52YWxpZGF0aW9ufWA6dD0iSW52YWxpZCI7YnJlYWs7Y2FzZSBkLnRvb19zbWFsbDpyLnR5cGU9PT0iYXJyYXkiP3Q9YEFycmF5IG11c3QgY29udGFpbiAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJhdCBsZWFzdCI6Im1vcmUgdGhhbiJ9ICR7ci5taW5pbXVtfSBlbGVtZW50KHMpYDpyLnR5cGU9PT0ic3RyaW5nIj90PWBTdHJpbmcgbXVzdCBjb250YWluICR7ci5leGFjdD8iZXhhY3RseSI6ci5pbmNsdXNpdmU/ImF0IGxlYXN0Ijoib3ZlciJ9ICR7ci5taW5pbXVtfSBjaGFyYWN0ZXIocylgOnIudHlwZT09PSJudW1iZXIiP3Q9YE51bWJlciBtdXN0IGJlICR7ci5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnIuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtyLm1pbmltdW19YDpyLnR5cGU9PT0iZGF0ZSI/dD1gRGF0ZSBtdXN0IGJlICR7ci5leGFjdD8iZXhhY3RseSBlcXVhbCB0byAiOnIuaW5jbHVzaXZlPyJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIjoiZ3JlYXRlciB0aGFuICJ9JHtuZXcgRGF0ZShOdW1iZXIoci5taW5pbXVtKSl9YDp0PSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIGQudG9vX2JpZzpyLnR5cGU9PT0iYXJyYXkiP3Q9YEFycmF5IG11c3QgY29udGFpbiAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJhdCBtb3N0IjoibGVzcyB0aGFuIn0gJHtyLm1heGltdW19IGVsZW1lbnQocylgOnIudHlwZT09PSJzdHJpbmciP3Q9YFN0cmluZyBtdXN0IGNvbnRhaW4gJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8iYXQgbW9zdCI6InVuZGVyIn0gJHtyLm1heGltdW19IGNoYXJhY3RlcihzKWA6ci50eXBlPT09Im51bWJlciI/dD1gTnVtYmVyIG11c3QgYmUgJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8ibGVzcyB0aGFuIG9yIGVxdWFsIHRvIjoibGVzcyB0aGFuIn0gJHtyLm1heGltdW19YDpyLnR5cGU9PT0iYmlnaW50Ij90PWBCaWdJbnQgbXVzdCBiZSAke3IuZXhhY3Q/ImV4YWN0bHkiOnIuaW5jbHVzaXZlPyJsZXNzIHRoYW4gb3IgZXF1YWwgdG8iOiJsZXNzIHRoYW4ifSAke3IubWF4aW11bX1gOnIudHlwZT09PSJkYXRlIj90PWBEYXRlIG11c3QgYmUgJHtyLmV4YWN0PyJleGFjdGx5IjpyLmluY2x1c2l2ZT8ic21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIjoic21hbGxlciB0aGFuIn0gJHtuZXcgRGF0ZShOdW1iZXIoci5tYXhpbXVtKSl9YDp0PSJJbnZhbGlkIGlucHV0IjticmVhaztjYXNlIGQuY3VzdG9tOnQ9IkludmFsaWQgaW5wdXQiO2JyZWFrO2Nhc2UgZC5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczp0PSJJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkIjticmVhaztjYXNlIGQubm90X211bHRpcGxlX29mOnQ9YE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHtyLm11bHRpcGxlT2Z9YDticmVhaztjYXNlIGQubm90X2Zpbml0ZTp0PSJOdW1iZXIgbXVzdCBiZSBmaW5pdGUiO2JyZWFrO2RlZmF1bHQ6dD1lLmRlZmF1bHRFcnJvcix4LmFzc2VydE5ldmVyKHIpfXJldHVybnttZXNzYWdlOnR9fTtsZXQgX3Q9aWU7ZnVuY3Rpb24gb3Iocil7X3Q9cn1mdW5jdGlvbiBQZSgpe3JldHVybiBfdH1jb25zdCBWZT1yPT57Y29uc3R7ZGF0YTplLHBhdGg6dCxlcnJvck1hcHM6bixpc3N1ZURhdGE6c309cixhPVsuLi50LC4uLnMucGF0aHx8W11dLGk9ey4uLnMscGF0aDphfTtpZihzLm1lc3NhZ2UhPT12b2lkIDApcmV0dXJuey4uLnMscGF0aDphLG1lc3NhZ2U6cy5tZXNzYWdlfTtsZXQgbz0iIjtjb25zdCBjPW4uZmlsdGVyKHU9PiEhdSkuc2xpY2UoKS5yZXZlcnNlKCk7Zm9yKGNvbnN0IHUgb2YgYylvPXUoaSx7ZGF0YTplLGRlZmF1bHRFcnJvcjpvfSkubWVzc2FnZTtyZXR1cm57Li4ucyxwYXRoOmEsbWVzc2FnZTpvfX0sY3I9W107ZnVuY3Rpb24gaChyLGUpe2NvbnN0IHQ9UGUoKSxuPVZlKHtpc3N1ZURhdGE6ZSxkYXRhOnIuZGF0YSxwYXRoOnIucGF0aCxlcnJvck1hcHM6W3IuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxyLnNjaGVtYUVycm9yTWFwLHQsdD09PWllP3ZvaWQgMDppZV0uZmlsdGVyKHM9PiEhcyl9KTtyLmNvbW1vbi5pc3N1ZXMucHVzaChuKX1jbGFzcyBEe2NvbnN0cnVjdG9yKCl7dGhpcy52YWx1ZT0idmFsaWQifWRpcnR5KCl7dGhpcy52YWx1ZT09PSJ2YWxpZCImJih0aGlzLnZhbHVlPSJkaXJ0eSIpfWFib3J0KCl7dGhpcy52YWx1ZSE9PSJhYm9ydGVkIiYmKHRoaXMudmFsdWU9ImFib3J0ZWQiKX1zdGF0aWMgbWVyZ2VBcnJheShlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgdCl7aWYocy5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7cy5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksbi5wdXNoKHMudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpufX1zdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3QgYT1hd2FpdCBzLmtleSxpPWF3YWl0IHMudmFsdWU7bi5wdXNoKHtrZXk6YSx2YWx1ZTppfSl9cmV0dXJuIEQubWVyZ2VPYmplY3RTeW5jKGUsbil9c3RhdGljIG1lcmdlT2JqZWN0U3luYyhlLHQpe2NvbnN0IG49e307Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3R7a2V5OmEsdmFsdWU6aX09cztpZihhLnN0YXR1cz09PSJhYm9ydGVkInx8aS5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7YS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksaS5zdGF0dXM9PT0iZGlydHkiJiZlLmRpcnR5KCksYS52YWx1ZSE9PSJfX3Byb3RvX18iJiYodHlwZW9mIGkudmFsdWU8InUifHxzLmFsd2F5c1NldCkmJihuW2EudmFsdWVdPWkudmFsdWUpfXJldHVybntzdGF0dXM6ZS52YWx1ZSx2YWx1ZTpufX19Y29uc3QgZz1PYmplY3QuZnJlZXplKHtzdGF0dXM6ImFib3J0ZWQifSksb2U9cj0+KHtzdGF0dXM6ImRpcnR5Iix2YWx1ZTpyfSksTz1yPT4oe3N0YXR1czoidmFsaWQiLHZhbHVlOnJ9KSxudD1yPT5yLnN0YXR1cz09PSJhYm9ydGVkIixzdD1yPT5yLnN0YXR1cz09PSJkaXJ0eSIseGU9cj0+ci5zdGF0dXM9PT0idmFsaWQiLGtlPXI9PnR5cGVvZiBQcm9taXNlPCJ1IiYmciBpbnN0YW5jZW9mIFByb21pc2U7ZnVuY3Rpb24gTGUocixlLHQsbil7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiI/ciE9PWV8fCFuOiFlLmhhcyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTtyZXR1cm4gZS5nZXQocil9ZnVuY3Rpb24geHQocixlLHQsbixzKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIj9yIT09ZXx8IXM6IWUuaGFzKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0Iik7cmV0dXJuIGUuc2V0KHIsdCksdH10eXBlb2YgU3VwcHJlc3NlZEVycm9yPT0iZnVuY3Rpb24iJiZTdXBwcmVzc2VkRXJyb3I7dmFyIHA7KGZ1bmN0aW9uKHIpe3IuZXJyVG9PYmo9ZT0+dHlwZW9mIGU9PSJzdHJpbmciP3ttZXNzYWdlOmV9OmV8fHt9LHIudG9TdHJpbmc9ZT0+dHlwZW9mIGU9PSJzdHJpbmciP2U6ZT09bnVsbD92b2lkIDA6ZS5tZXNzYWdlfSkocHx8KHA9e30pKTt2YXIgYmUsd2U7Y2xhc3MgWXtjb25zdHJ1Y3RvcihlLHQsbixzKXt0aGlzLl9jYWNoZWRQYXRoPVtdLHRoaXMucGFyZW50PWUsdGhpcy5kYXRhPXQsdGhpcy5fcGF0aD1uLHRoaXMuX2tleT1zfWdldCBwYXRoKCl7cmV0dXJuIHRoaXMuX2NhY2hlZFBhdGgubGVuZ3RofHwodGhpcy5fa2V5IGluc3RhbmNlb2YgQXJyYXk/dGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsLi4udGhpcy5fa2V5KTp0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCx0aGlzLl9rZXkpKSx0aGlzLl9jYWNoZWRQYXRofX1jb25zdCBrdD0ocixlKT0+e2lmKHhlKGUpKXJldHVybntzdWNjZXNzOiEwLGRhdGE6ZS52YWx1ZX07aWYoIXIuY29tbW9uLmlzc3Vlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLiIpO3JldHVybntzdWNjZXNzOiExLGdldCBlcnJvcigpe2lmKHRoaXMuX2Vycm9yKXJldHVybiB0aGlzLl9lcnJvcjtjb25zdCB0PW5ldyBBKHIuY29tbW9uLmlzc3Vlcyk7cmV0dXJuIHRoaXMuX2Vycm9yPXQsdGhpcy5fZXJyb3J9fX07ZnVuY3Rpb24gdihyKXtpZighcilyZXR1cm57fTtjb25zdHtlcnJvck1hcDplLGludmFsaWRfdHlwZV9lcnJvcjp0LHJlcXVpcmVkX2Vycm9yOm4sZGVzY3JpcHRpb246c309cjtpZihlJiYodHx8bikpdGhyb3cgbmV3IEVycm9yKGBDYW4ndCB1c2UgImludmFsaWRfdHlwZV9lcnJvciIgb3IgInJlcXVpcmVkX2Vycm9yIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7cmV0dXJuIGU/e2Vycm9yTWFwOmUsZGVzY3JpcHRpb246c306e2Vycm9yTWFwOihpLG8pPT57dmFyIGMsdTtjb25zdHttZXNzYWdlOmx9PXI7cmV0dXJuIGkuY29kZT09PSJpbnZhbGlkX2VudW1fdmFsdWUiP3ttZXNzYWdlOmw/P28uZGVmYXVsdEVycm9yfTp0eXBlb2Ygby5kYXRhPiJ1Ij97bWVzc2FnZTooYz1sPz9uKSE9PW51bGwmJmMhPT12b2lkIDA/YzpvLmRlZmF1bHRFcnJvcn06aS5jb2RlIT09ImludmFsaWRfdHlwZSI/e21lc3NhZ2U6by5kZWZhdWx0RXJyb3J9OnttZXNzYWdlOih1PWw/P3QpIT09bnVsbCYmdSE9PXZvaWQgMD91Om8uZGVmYXVsdEVycm9yfX0sZGVzY3JpcHRpb246c319Y2xhc3MgX3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNwYT10aGlzLnNhZmVQYXJzZUFzeW5jLHRoaXMuX2RlZj1lLHRoaXMucGFyc2U9dGhpcy5wYXJzZS5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlPXRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyksdGhpcy5wYXJzZUFzeW5jPXRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc2FmZVBhcnNlQXN5bmM9dGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpLHRoaXMuc3BhPXRoaXMuc3BhLmJpbmQodGhpcyksdGhpcy5yZWZpbmU9dGhpcy5yZWZpbmUuYmluZCh0aGlzKSx0aGlzLnJlZmluZW1lbnQ9dGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyksdGhpcy5zdXBlclJlZmluZT10aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyksdGhpcy5vcHRpb25hbD10aGlzLm9wdGlvbmFsLmJpbmQodGhpcyksdGhpcy5udWxsYWJsZT10aGlzLm51bGxhYmxlLmJpbmQodGhpcyksdGhpcy5udWxsaXNoPXRoaXMubnVsbGlzaC5iaW5kKHRoaXMpLHRoaXMuYXJyYXk9dGhpcy5hcnJheS5iaW5kKHRoaXMpLHRoaXMucHJvbWlzZT10aGlzLnByb21pc2UuYmluZCh0aGlzKSx0aGlzLm9yPXRoaXMub3IuYmluZCh0aGlzKSx0aGlzLmFuZD10aGlzLmFuZC5iaW5kKHRoaXMpLHRoaXMudHJhbnNmb3JtPXRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyksdGhpcy5icmFuZD10aGlzLmJyYW5kLmJpbmQodGhpcyksdGhpcy5kZWZhdWx0PXRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpLHRoaXMuY2F0Y2g9dGhpcy5jYXRjaC5iaW5kKHRoaXMpLHRoaXMuZGVzY3JpYmU9dGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpLHRoaXMucGlwZT10aGlzLnBpcGUuYmluZCh0aGlzKSx0aGlzLnJlYWRvbmx5PXRoaXMucmVhZG9ubHkuYmluZCh0aGlzKSx0aGlzLmlzTnVsbGFibGU9dGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyksdGhpcy5pc09wdGlvbmFsPXRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb259X2dldFR5cGUoZSl7cmV0dXJuIEIoZS5kYXRhKX1fZ2V0T3JSZXR1cm5DdHgoZSx0KXtyZXR1cm4gdHx8e2NvbW1vbjplLnBhcmVudC5jb21tb24sZGF0YTplLmRhdGEscGFyc2VkVHlwZTpCKGUuZGF0YSksc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhdGg6ZS5wYXRoLHBhcmVudDplLnBhcmVudH19X3Byb2Nlc3NJbnB1dFBhcmFtcyhlKXtyZXR1cm57c3RhdHVzOm5ldyBELGN0eDp7Y29tbW9uOmUucGFyZW50LmNvbW1vbixkYXRhOmUuZGF0YSxwYXJzZWRUeXBlOkIoZS5kYXRhKSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGF0aDplLnBhdGgscGFyZW50OmUucGFyZW50fX19X3BhcnNlU3luYyhlKXtjb25zdCB0PXRoaXMuX3BhcnNlKGUpO2lmKGtlKHQpKXRocm93IG5ldyBFcnJvcigiU3luY2hyb25vdXMgcGFyc2UgZW5jb3VudGVyZWQgcHJvbWlzZS4iKTtyZXR1cm4gdH1fcGFyc2VBc3luYyhlKXtjb25zdCB0PXRoaXMuX3BhcnNlKGUpO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9cGFyc2UoZSx0KXtjb25zdCBuPXRoaXMuc2FmZVBhcnNlKGUsdCk7aWYobi5zdWNjZXNzKXJldHVybiBuLmRhdGE7dGhyb3cgbi5lcnJvcn1zYWZlUGFyc2UoZSx0KXt2YXIgbjtjb25zdCBzPXtjb21tb246e2lzc3VlczpbXSxhc3luYzoobj10PT1udWxsP3ZvaWQgMDp0LmFzeW5jKSE9PW51bGwmJm4hPT12b2lkIDA/bjohMSxjb250ZXh0dWFsRXJyb3JNYXA6dD09bnVsbD92b2lkIDA6dC5lcnJvck1hcH0scGF0aDoodD09bnVsbD92b2lkIDA6dC5wYXRoKXx8W10sc2NoZW1hRXJyb3JNYXA6dGhpcy5fZGVmLmVycm9yTWFwLHBhcmVudDpudWxsLGRhdGE6ZSxwYXJzZWRUeXBlOkIoZSl9LGE9dGhpcy5fcGFyc2VTeW5jKHtkYXRhOmUscGF0aDpzLnBhdGgscGFyZW50OnN9KTtyZXR1cm4ga3QocyxhKX1hc3luYyBwYXJzZUFzeW5jKGUsdCl7Y29uc3Qgbj1hd2FpdCB0aGlzLnNhZmVQYXJzZUFzeW5jKGUsdCk7aWYobi5zdWNjZXNzKXJldHVybiBuLmRhdGE7dGhyb3cgbi5lcnJvcn1hc3luYyBzYWZlUGFyc2VBc3luYyhlLHQpe2NvbnN0IG49e2NvbW1vbjp7aXNzdWVzOltdLGNvbnRleHR1YWxFcnJvck1hcDp0PT1udWxsP3ZvaWQgMDp0LmVycm9yTWFwLGFzeW5jOiEwfSxwYXRoOih0PT1udWxsP3ZvaWQgMDp0LnBhdGgpfHxbXSxzY2hlbWFFcnJvck1hcDp0aGlzLl9kZWYuZXJyb3JNYXAscGFyZW50Om51bGwsZGF0YTplLHBhcnNlZFR5cGU6QihlKX0scz10aGlzLl9wYXJzZSh7ZGF0YTplLHBhdGg6bi5wYXRoLHBhcmVudDpufSksYT1hd2FpdChrZShzKT9zOlByb21pc2UucmVzb2x2ZShzKSk7cmV0dXJuIGt0KG4sYSl9cmVmaW5lKGUsdCl7Y29uc3Qgbj1zPT50eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PiJ1Ij97bWVzc2FnZTp0fTp0eXBlb2YgdD09ImZ1bmN0aW9uIj90KHMpOnQ7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHMsYSk9Pntjb25zdCBpPWUocyksbz0oKT0+YS5hZGRJc3N1ZSh7Y29kZTpkLmN1c3RvbSwuLi5uKHMpfSk7cmV0dXJuIHR5cGVvZiBQcm9taXNlPCJ1IiYmaSBpbnN0YW5jZW9mIFByb21pc2U/aS50aGVuKGM9PmM/ITA6KG8oKSwhMSkpOmk/ITA6KG8oKSwhMSl9KX1yZWZpbmVtZW50KGUsdCl7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKG4scyk9PmUobik/ITA6KHMuYWRkSXNzdWUodHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChuLHMpOnQpLCExKSl9X3JlZmluZW1lbnQoZSl7cmV0dXJuIG5ldyBDKHtzY2hlbWE6dGhpcyx0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0Ont0eXBlOiJyZWZpbmVtZW50IixyZWZpbmVtZW50OmV9fSl9c3VwZXJSZWZpbmUoZSl7cmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoZSl9b3B0aW9uYWwoKXtyZXR1cm4gUC5jcmVhdGUodGhpcyx0aGlzLl9kZWYpfW51bGxhYmxlKCl7cmV0dXJuIEouY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1udWxsaXNoKCl7cmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpfWFycmF5KCl7cmV0dXJuIFIuY3JlYXRlKHRoaXMsdGhpcy5fZGVmKX1wcm9taXNlKCl7cmV0dXJuIGxlLmNyZWF0ZSh0aGlzLHRoaXMuX2RlZil9b3IoZSl7cmV0dXJuIE1lLmNyZWF0ZShbdGhpcyxlXSx0aGlzLl9kZWYpfWFuZChlKXtyZXR1cm4gRGUuY3JlYXRlKHRoaXMsZSx0aGlzLl9kZWYpfXRyYW5zZm9ybShlKXtyZXR1cm4gbmV3IEMoey4uLnYodGhpcy5fZGVmKSxzY2hlbWE6dGhpcyx0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0Ont0eXBlOiJ0cmFuc2Zvcm0iLHRyYW5zZm9ybTplfX0pfWRlZmF1bHQoZSl7Y29uc3QgdD10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgUmUoey4uLnYodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxkZWZhdWx0VmFsdWU6dCx0eXBlTmFtZTp5LlpvZERlZmF1bHR9KX1icmFuZCgpe3JldHVybiBuZXcgb3Qoe3R5cGVOYW1lOnkuWm9kQnJhbmRlZCx0eXBlOnRoaXMsLi4udih0aGlzLl9kZWYpfSl9Y2F0Y2goZSl7Y29uc3QgdD10eXBlb2YgZT09ImZ1bmN0aW9uIj9lOigpPT5lO3JldHVybiBuZXcgQ2Uoey4uLnYodGhpcy5fZGVmKSxpbm5lclR5cGU6dGhpcyxjYXRjaFZhbHVlOnQsdHlwZU5hbWU6eS5ab2RDYXRjaH0pfWRlc2NyaWJlKGUpe2NvbnN0IHQ9dGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gbmV3IHQoey4uLnRoaXMuX2RlZixkZXNjcmlwdGlvbjplfSl9cGlwZShlKXtyZXR1cm4gWmUuY3JlYXRlKHRoaXMsZSl9cmVhZG9ubHkoKXtyZXR1cm4gSWUuY3JlYXRlKHRoaXMpfWlzT3B0aW9uYWwoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2Uodm9pZCAwKS5zdWNjZXNzfWlzTnVsbGFibGUoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2Vzc319Y29uc3QgdXI9L15jW15ccy1dezgsfSQvaSxkcj0vXlswLTlhLXpdKyQvLGxyPS9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvLGhyPS9eWzAtOWEtZkEtRl17OH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXsxMn0kL2ksZnI9L15bYS16MC05Xy1dezIxfSQvaSxtcj0vXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvLHByPS9eKD8hXC4pKD8hLipcLlwuKShbQS1aMC05XycrXC1cLl0qKVtBLVowLTlfKy1dQChbQS1aMC05XVtBLVowLTlcLV0qXC4pK1tBLVpdezIsfSQvaSx5cj0iXihcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXHB7RW1vamlfQ29tcG9uZW50fSkrJCI7bGV0IGF0O2NvbnN0IGdyPS9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSkkLyx2cj0vXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKSQvLF9yPS9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLyxidD0iKChcXGRcXGRbMjQ2OF1bMDQ4XXxcXGRcXGRbMTM1NzldWzI2XXxcXGRcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXGR7NH0tKCgwWzEzNTc4XXwxWzAyXSktKDBbMS05XXxbMTJdXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXGR8MzApfCgwMiktKDBbMS05XXwxXFxkfDJbMC04XSkpKSIseHI9bmV3IFJlZ0V4cChgXiR7YnR9JGApO2Z1bmN0aW9uIHd0KHIpe2xldCBlPSIoWzAxXVxcZHwyWzAtM10pOlswLTVdXFxkOlswLTVdXFxkIjtyZXR1cm4gci5wcmVjaXNpb24/ZT1gJHtlfVxcLlxcZHske3IucHJlY2lzaW9ufX1gOnIucHJlY2lzaW9uPT1udWxsJiYoZT1gJHtlfShcXC5cXGQrKT9gKSxlfWZ1bmN0aW9uIGtyKHIpe3JldHVybiBuZXcgUmVnRXhwKGBeJHt3dChyKX0kYCl9ZnVuY3Rpb24gU3Qocil7bGV0IGU9YCR7YnR9VCR7d3Qocil9YDtjb25zdCB0PVtdO3JldHVybiB0LnB1c2goci5sb2NhbD8iWj8iOiJaIiksci5vZmZzZXQmJnQucHVzaCgiKFsrLV1cXGR7Mn06P1xcZHsyfSkiKSxlPWAke2V9KCR7dC5qb2luKCJ8Iil9KWAsbmV3IFJlZ0V4cChgXiR7ZX0kYCl9ZnVuY3Rpb24gYnIocixlKXtyZXR1cm4hISgoZT09PSJ2NCJ8fCFlKSYmZ3IudGVzdChyKXx8KGU9PT0idjYifHwhZSkmJnZyLnRlc3QocikpfWNsYXNzIEUgZXh0ZW5kcyBfe19wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPVN0cmluZyhlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5zdHJpbmcpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLnN0cmluZyxyZWNlaXZlZDphLnBhcnNlZFR5cGV9KSxnfWNvbnN0IG49bmV3IEQ7bGV0IHM7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fZGVmLmNoZWNrcylpZihhLmtpbmQ9PT0ibWluIillLmRhdGEubGVuZ3RoPGEudmFsdWUmJihzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk7ZWxzZSBpZihhLmtpbmQ9PT0ibWF4IillLmRhdGEubGVuZ3RoPmEudmFsdWUmJihzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOmEudmFsdWUsdHlwZToic3RyaW5nIixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09Imxlbmd0aCIpe2NvbnN0IGk9ZS5kYXRhLmxlbmd0aD5hLnZhbHVlLG89ZS5kYXRhLmxlbmd0aDxhLnZhbHVlOyhpfHxvKSYmKHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxpP2gocyx7Y29kZTpkLnRvb19iaWcsbWF4aW11bTphLnZhbHVlLHR5cGU6InN0cmluZyIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6YS5tZXNzYWdlfSk6byYmaChzLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJzdHJpbmciLGluY2x1c2l2ZTohMCxleGFjdDohMCxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSl9ZWxzZSBpZihhLmtpbmQ9PT0iZW1haWwiKXByLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImVtYWlsIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09ImVtb2ppIilhdHx8KGF0PW5ldyBSZWdFeHAoeXIsInUiKSksYXQudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoiZW1vamkiLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk7ZWxzZSBpZihhLmtpbmQ9PT0idXVpZCIpaHIudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoidXVpZCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJuYW5vaWQiKWZyLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246Im5hbm9pZCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJjdWlkIil1ci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJjdWlkIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09ImN1aWQyIilkci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJjdWlkMiIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTtlbHNlIGlmKGEua2luZD09PSJ1bGlkIilsci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJ1bGlkIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpO2Vsc2UgaWYoYS5raW5kPT09InVybCIpdHJ5e25ldyBVUkwoZS5kYXRhKX1jYXRjaHtzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJ1cmwiLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKX1lbHNlIGEua2luZD09PSJyZWdleCI/KGEucmVnZXgubGFzdEluZGV4PTAsYS5yZWdleC50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHt2YWxpZGF0aW9uOiJyZWdleCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKSk6YS5raW5kPT09InRyaW0iP2UuZGF0YT1lLmRhdGEudHJpbSgpOmEua2luZD09PSJpbmNsdWRlcyI/ZS5kYXRhLmluY2x1ZGVzKGEudmFsdWUsYS5wb3NpdGlvbil8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjp7aW5jbHVkZXM6YS52YWx1ZSxwb3NpdGlvbjphLnBvc2l0aW9ufSxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk6YS5raW5kPT09InRvTG93ZXJDYXNlIj9lLmRhdGE9ZS5kYXRhLnRvTG93ZXJDYXNlKCk6YS5raW5kPT09InRvVXBwZXJDYXNlIj9lLmRhdGE9ZS5kYXRhLnRvVXBwZXJDYXNlKCk6YS5raW5kPT09InN0YXJ0c1dpdGgiP2UuZGF0YS5zdGFydHNXaXRoKGEudmFsdWUpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e3N0YXJ0c1dpdGg6YS52YWx1ZX0sbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJlbmRzV2l0aCI/ZS5kYXRhLmVuZHNXaXRoKGEudmFsdWUpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLmludmFsaWRfc3RyaW5nLHZhbGlkYXRpb246e2VuZHNXaXRoOmEudmFsdWV9LG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTphLmtpbmQ9PT0iZGF0ZXRpbWUiP1N0KGEpLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse2NvZGU6ZC5pbnZhbGlkX3N0cmluZyx2YWxpZGF0aW9uOiJkYXRldGltZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJkYXRlIj94ci50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoiZGF0ZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJ0aW1lIj9rcihhKS50ZXN0KGUuZGF0YSl8fChzPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUscyksaChzLHtjb2RlOmQuaW52YWxpZF9zdHJpbmcsdmFsaWRhdGlvbjoidGltZSIsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJkdXJhdGlvbiI/bXIudGVzdChlLmRhdGEpfHwocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7dmFsaWRhdGlvbjoiZHVyYXRpb24iLGNvZGU6ZC5pbnZhbGlkX3N0cmluZyxtZXNzYWdlOmEubWVzc2FnZX0pLG4uZGlydHkoKSk6YS5raW5kPT09ImlwIj9icihlLmRhdGEsYS52ZXJzaW9uKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImlwIixjb2RlOmQuaW52YWxpZF9zdHJpbmcsbWVzc2FnZTphLm1lc3NhZ2V9KSxuLmRpcnR5KCkpOmEua2luZD09PSJiYXNlNjQiP19yLnRlc3QoZS5kYXRhKXx8KHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse3ZhbGlkYXRpb246ImJhc2U2NCIsY29kZTpkLmludmFsaWRfc3RyaW5nLG1lc3NhZ2U6YS5tZXNzYWdlfSksbi5kaXJ0eSgpKTp4LmFzc2VydE5ldmVyKGEpO3JldHVybntzdGF0dXM6bi52YWx1ZSx2YWx1ZTplLmRhdGF9fV9yZWdleChlLHQsbil7cmV0dXJuIHRoaXMucmVmaW5lbWVudChzPT5lLnRlc3Qocykse3ZhbGlkYXRpb246dCxjb2RlOmQuaW52YWxpZF9zdHJpbmcsLi4ucC5lcnJUb09iaihuKX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1lbWFpbChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImVtYWlsIiwuLi5wLmVyclRvT2JqKGUpfSl9dXJsKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoidXJsIiwuLi5wLmVyclRvT2JqKGUpfSl9ZW1vamkoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJlbW9qaSIsLi4ucC5lcnJUb09iaihlKX0pfXV1aWQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJ1dWlkIiwuLi5wLmVyclRvT2JqKGUpfSl9bmFub2lkKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibmFub2lkIiwuLi5wLmVyclRvT2JqKGUpfSl9Y3VpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQiLC4uLnAuZXJyVG9PYmooZSl9KX1jdWlkMihlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImN1aWQyIiwuLi5wLmVyclRvT2JqKGUpfSl9dWxpZChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6InVsaWQiLC4uLnAuZXJyVG9PYmooZSl9KX1iYXNlNjQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJiYXNlNjQiLC4uLnAuZXJyVG9PYmooZSl9KX1pcChlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImlwIiwuLi5wLmVyclRvT2JqKGUpfSl9ZGF0ZXRpbWUoZSl7dmFyIHQsbjtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP3RoaXMuX2FkZENoZWNrKHtraW5kOiJkYXRldGltZSIscHJlY2lzaW9uOm51bGwsb2Zmc2V0OiExLGxvY2FsOiExLG1lc3NhZ2U6ZX0pOnRoaXMuX2FkZENoZWNrKHtraW5kOiJkYXRldGltZSIscHJlY2lzaW9uOnR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbik+InUiP251bGw6ZT09bnVsbD92b2lkIDA6ZS5wcmVjaXNpb24sb2Zmc2V0Oih0PWU9PW51bGw/dm9pZCAwOmUub2Zmc2V0KSE9PW51bGwmJnQhPT12b2lkIDA/dDohMSxsb2NhbDoobj1lPT1udWxsP3ZvaWQgMDplLmxvY2FsKSE9PW51bGwmJm4hPT12b2lkIDA/bjohMSwuLi5wLmVyclRvT2JqKGU9PW51bGw/dm9pZCAwOmUubWVzc2FnZSl9KX1kYXRlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoiZGF0ZSIsbWVzc2FnZTplfSl9dGltZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP3RoaXMuX2FkZENoZWNrKHtraW5kOiJ0aW1lIixwcmVjaXNpb246bnVsbCxtZXNzYWdlOmV9KTp0aGlzLl9hZGRDaGVjayh7a2luZDoidGltZSIscHJlY2lzaW9uOnR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnByZWNpc2lvbik+InUiP251bGw6ZT09bnVsbD92b2lkIDA6ZS5wcmVjaXNpb24sLi4ucC5lcnJUb09iaihlPT1udWxsP3ZvaWQgMDplLm1lc3NhZ2UpfSl9ZHVyYXRpb24oZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJkdXJhdGlvbiIsLi4ucC5lcnJUb09iaihlKX0pfXJlZ2V4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJyZWdleCIscmVnZXg6ZSwuLi5wLmVyclRvT2JqKHQpfSl9aW5jbHVkZXMoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImluY2x1ZGVzIix2YWx1ZTplLHBvc2l0aW9uOnQ9PW51bGw/dm9pZCAwOnQucG9zaXRpb24sLi4ucC5lcnJUb09iaih0PT1udWxsP3ZvaWQgMDp0Lm1lc3NhZ2UpfSl9c3RhcnRzV2l0aChlLHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoic3RhcnRzV2l0aCIsdmFsdWU6ZSwuLi5wLmVyclRvT2JqKHQpfSl9ZW5kc1dpdGgoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImVuZHNXaXRoIix2YWx1ZTplLC4uLnAuZXJyVG9PYmoodCl9KX1taW4oZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZSwuLi5wLmVyclRvT2JqKHQpfSl9bWF4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUsLi4ucC5lcnJUb09iaih0KX0pfWxlbmd0aChlLHQpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibGVuZ3RoIix2YWx1ZTplLC4uLnAuZXJyVG9PYmoodCl9KX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxwLmVyclRvT2JqKGUpKX10cmltKCl7cmV0dXJuIG5ldyBFKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOiJ0cmltIn1dfSl9dG9Mb3dlckNhc2UoKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvTG93ZXJDYXNlIn1dfSl9dG9VcHBlckNhc2UoKXtyZXR1cm4gbmV3IEUoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6InRvVXBwZXJDYXNlIn1dfSl9Z2V0IGlzRGF0ZXRpbWUoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iZGF0ZXRpbWUiKX1nZXQgaXNEYXRlKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImRhdGUiKX1nZXQgaXNUaW1lKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09InRpbWUiKX1nZXQgaXNEdXJhdGlvbigpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJkdXJhdGlvbiIpfWdldCBpc0VtYWlsKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImVtYWlsIil9Z2V0IGlzVVJMKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09InVybCIpfWdldCBpc0Vtb2ppKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImVtb2ppIil9Z2V0IGlzVVVJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1dWlkIil9Z2V0IGlzTkFOT0lEKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09Im5hbm9pZCIpfWdldCBpc0NVSUQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iY3VpZCIpfWdldCBpc0NVSUQyKCl7cmV0dXJuISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoZT0+ZS5raW5kPT09ImN1aWQyIil9Z2V0IGlzVUxJRCgpe3JldHVybiEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKGU9PmUua2luZD09PSJ1bGlkIil9Z2V0IGlzSVAoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaXAiKX1nZXQgaXNCYXNlNjQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iYmFzZTY0Iil9Z2V0IG1pbkxlbmd0aCgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWluIiYmKGU9PT1udWxsfHx0LnZhbHVlPmUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX1nZXQgbWF4TGVuZ3RoKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtYXgiJiYoZT09PW51bGx8fHQudmFsdWU8ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfX1FLmNyZWF0ZT1yPT57dmFyIGU7cmV0dXJuIG5ldyBFKHtjaGVja3M6W10sdHlwZU5hbWU6eS5ab2RTdHJpbmcsY29lcmNlOihlPXI9PW51bGw/dm9pZCAwOnIuY29lcmNlKSE9PW51bGwmJmUhPT12b2lkIDA/ZTohMSwuLi52KHIpfSl9O2Z1bmN0aW9uIHdyKHIsZSl7Y29uc3QgdD0oci50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgsbj0oZS50b1N0cmluZygpLnNwbGl0KCIuIilbMV18fCIiKS5sZW5ndGgscz10Pm4/dDpuLGE9cGFyc2VJbnQoci50b0ZpeGVkKHMpLnJlcGxhY2UoIi4iLCIiKSksaT1wYXJzZUludChlLnRvRml4ZWQocykucmVwbGFjZSgiLiIsIiIpKTtyZXR1cm4gYSVpL01hdGgucG93KDEwLHMpfWNsYXNzIEggZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm1pbj10aGlzLmd0ZSx0aGlzLm1heD10aGlzLmx0ZSx0aGlzLnN0ZXA9dGhpcy5tdWx0aXBsZU9mfV9wYXJzZShlKXtpZih0aGlzLl9kZWYuY29lcmNlJiYoZS5kYXRhPU51bWJlcihlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5udW1iZXIpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLm51bWJlcixyZWNlaXZlZDphLnBhcnNlZFR5cGV9KSxnfWxldCBuO2NvbnN0IHM9bmV3IEQ7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fZGVmLmNoZWNrcylhLmtpbmQ9PT0iaW50Ij94LmlzSW50ZWdlcihlLmRhdGEpfHwobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDoiaW50ZWdlciIscmVjZWl2ZWQ6ImZsb2F0IixtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6YS5raW5kPT09Im1pbiI/KGEuaW5jbHVzaXZlP2UuZGF0YTxhLnZhbHVlOmUuZGF0YTw9YS52YWx1ZSkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQudG9vX3NtYWxsLG1pbmltdW06YS52YWx1ZSx0eXBlOiJudW1iZXIiLGluY2x1c2l2ZTphLmluY2x1c2l2ZSxleGFjdDohMSxtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6YS5raW5kPT09Im1heCI/KGEuaW5jbHVzaXZlP2UuZGF0YT5hLnZhbHVlOmUuZGF0YT49YS52YWx1ZSkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOmEudmFsdWUsdHlwZToibnVtYmVyIixpbmNsdXNpdmU6YS5pbmNsdXNpdmUsZXhhY3Q6ITEsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJtdWx0aXBsZU9mIj93cihlLmRhdGEsYS52YWx1ZSkhPT0wJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLm5vdF9tdWx0aXBsZV9vZixtdWx0aXBsZU9mOmEudmFsdWUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJmaW5pdGUiP051bWJlci5pc0Zpbml0ZShlLmRhdGEpfHwobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLm5vdF9maW5pdGUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOnguYXNzZXJ0TmV2ZXIoYSk7cmV0dXJue3N0YXR1czpzLnZhbHVlLHZhbHVlOmUuZGF0YX19Z3RlKGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMCxwLnRvU3RyaW5nKHQpKX1ndChlLHQpe3JldHVybiB0aGlzLnNldExpbWl0KCJtaW4iLGUsITEscC50b1N0cmluZyh0KSl9bHRlKGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMCxwLnRvU3RyaW5nKHQpKX1sdChlLHQpe3JldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLGUsITEscC50b1N0cmluZyh0KSl9c2V0TGltaXQoZSx0LG4scyl7cmV0dXJuIG5ldyBIKHsuLi50aGlzLl9kZWYsY2hlY2tzOlsuLi50aGlzLl9kZWYuY2hlY2tzLHtraW5kOmUsdmFsdWU6dCxpbmNsdXNpdmU6bixtZXNzYWdlOnAudG9TdHJpbmcocyl9XX0pfV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEgoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1pbnQoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJpbnQiLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfXBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTowLGluY2x1c2l2ZTohMSxtZXNzYWdlOnAudG9TdHJpbmcoZSl9KX1uZWdhdGl2ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1heCIsdmFsdWU6MCxpbmNsdXNpdmU6ITEsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9bm9ucG9zaXRpdmUoZSl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOjAsaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbm5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTowLGluY2x1c2l2ZTohMCxtZXNzYWdlOnAudG9TdHJpbmcoZSl9KX1tdWx0aXBsZU9mKGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtdWx0aXBsZU9mIix2YWx1ZTplLG1lc3NhZ2U6cC50b1N0cmluZyh0KX0pfWZpbml0ZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6ImZpbml0ZSIsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9c2FmZShlKXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsaW5jbHVzaXZlOiEwLHZhbHVlOk51bWJlci5NSU5fU0FGRV9JTlRFR0VSLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pLl9hZGRDaGVjayh7a2luZDoibWF4IixpbmNsdXNpdmU6ITAsdmFsdWU6TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbWVzc2FnZTpwLnRvU3RyaW5nKGUpfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHx0LnZhbHVlPGUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX1nZXQgaXNJbnQoKXtyZXR1cm4hIXRoaXMuX2RlZi5jaGVja3MuZmluZChlPT5lLmtpbmQ9PT0iaW50Inx8ZS5raW5kPT09Im11bHRpcGxlT2YiJiZ4LmlzSW50ZWdlcihlLnZhbHVlKSl9Z2V0IGlzRmluaXRlKCl7bGV0IGU9bnVsbCx0PW51bGw7Zm9yKGNvbnN0IG4gb2YgdGhpcy5fZGVmLmNoZWNrcyl7aWYobi5raW5kPT09ImZpbml0ZSJ8fG4ua2luZD09PSJpbnQifHxuLmtpbmQ9PT0ibXVsdGlwbGVPZiIpcmV0dXJuITA7bi5raW5kPT09Im1pbiI/KHQ9PT1udWxsfHxuLnZhbHVlPnQpJiYodD1uLnZhbHVlKTpuLmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHxuLnZhbHVlPGUpJiYoZT1uLnZhbHVlKX1yZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpJiZOdW1iZXIuaXNGaW5pdGUoZSl9fUguY3JlYXRlPXI9Pm5ldyBIKHtjaGVja3M6W10sdHlwZU5hbWU6eS5ab2ROdW1iZXIsY29lcmNlOihyPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSl8fCExLC4uLnYocil9KTtjbGFzcyBxIGV4dGVuZHMgX3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5taW49dGhpcy5ndGUsdGhpcy5tYXg9dGhpcy5sdGV9X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9QmlnSW50KGUuZGF0YSkpLHRoaXMuX2dldFR5cGUoZSkhPT1mLmJpZ2ludCl7Y29uc3QgYT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaChhLHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuYmlnaW50LHJlY2VpdmVkOmEucGFyc2VkVHlwZX0pLGd9bGV0IG47Y29uc3Qgcz1uZXcgRDtmb3IoY29uc3QgYSBvZiB0aGlzLl9kZWYuY2hlY2tzKWEua2luZD09PSJtaW4iPyhhLmluY2x1c2l2ZT9lLmRhdGE8YS52YWx1ZTplLmRhdGE8PWEudmFsdWUpJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLnRvb19zbWFsbCx0eXBlOiJiaWdpbnQiLG1pbmltdW06YS52YWx1ZSxpbmNsdXNpdmU6YS5pbmNsdXNpdmUsbWVzc2FnZTphLm1lc3NhZ2V9KSxzLmRpcnR5KCkpOmEua2luZD09PSJtYXgiPyhhLmluY2x1c2l2ZT9lLmRhdGE+YS52YWx1ZTplLmRhdGE+PWEudmFsdWUpJiYobj10aGlzLl9nZXRPclJldHVybkN0eChlLG4pLGgobix7Y29kZTpkLnRvb19iaWcsdHlwZToiYmlnaW50IixtYXhpbXVtOmEudmFsdWUsaW5jbHVzaXZlOmEuaW5jbHVzaXZlLG1lc3NhZ2U6YS5tZXNzYWdlfSkscy5kaXJ0eSgpKTphLmtpbmQ9PT0ibXVsdGlwbGVPZiI/ZS5kYXRhJWEudmFsdWUhPT1CaWdJbnQoMCkmJihuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsbiksaChuLHtjb2RlOmQubm90X211bHRpcGxlX29mLG11bHRpcGxlT2Y6YS52YWx1ZSxtZXNzYWdlOmEubWVzc2FnZX0pLHMuZGlydHkoKSk6eC5hc3NlcnROZXZlcihhKTtyZXR1cm57c3RhdHVzOnMudmFsdWUsdmFsdWU6ZS5kYXRhfX1ndGUoZSx0KXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIixlLCEwLHAudG9TdHJpbmcodCkpfWd0KGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1pbiIsZSwhMSxwLnRvU3RyaW5nKHQpKX1sdGUoZSx0KXtyZXR1cm4gdGhpcy5zZXRMaW1pdCgibWF4IixlLCEwLHAudG9TdHJpbmcodCkpfWx0KGUsdCl7cmV0dXJuIHRoaXMuc2V0TGltaXQoIm1heCIsZSwhMSxwLnRvU3RyaW5nKHQpKX1zZXRMaW1pdChlLHQsbixzKXtyZXR1cm4gbmV3IHEoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3Mse2tpbmQ6ZSx2YWx1ZTp0LGluY2x1c2l2ZTpuLG1lc3NhZ2U6cC50b1N0cmluZyhzKX1dfSl9X2FkZENoZWNrKGUpe3JldHVybiBuZXcgcSh7Li4udGhpcy5fZGVmLGNoZWNrczpbLi4udGhpcy5fZGVmLmNoZWNrcyxlXX0pfXBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiExLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbnBvc2l0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWF4Iix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW5vbm5lZ2F0aXZlKGUpe3JldHVybiB0aGlzLl9hZGRDaGVjayh7a2luZDoibWluIix2YWx1ZTpCaWdJbnQoMCksaW5jbHVzaXZlOiEwLG1lc3NhZ2U6cC50b1N0cmluZyhlKX0pfW11bHRpcGxlT2YoZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im11bHRpcGxlT2YiLHZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfSl9Z2V0IG1pblZhbHVlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlfWdldCBtYXhWYWx1ZSgpe2xldCBlPW51bGw7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcyl0LmtpbmQ9PT0ibWF4IiYmKGU9PT1udWxsfHx0LnZhbHVlPGUpJiYoZT10LnZhbHVlKTtyZXR1cm4gZX19cS5jcmVhdGU9cj0+e3ZhciBlO3JldHVybiBuZXcgcSh7Y2hlY2tzOltdLHR5cGVOYW1lOnkuWm9kQmlnSW50LGNvZXJjZTooZT1yPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSkhPT1udWxsJiZlIT09dm9pZCAwP2U6ITEsLi4udihyKX0pfTtjbGFzcyBTZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKHRoaXMuX2RlZi5jb2VyY2UmJihlLmRhdGE9ISFlLmRhdGEpLHRoaXMuX2dldFR5cGUoZSkhPT1mLmJvb2xlYW4pe2NvbnN0IG49dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLmJvb2xlYW4scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm4gTyhlLmRhdGEpfX1TZS5jcmVhdGU9cj0+bmV3IFNlKHt0eXBlTmFtZTp5LlpvZEJvb2xlYW4sY29lcmNlOihyPT1udWxsP3ZvaWQgMDpyLmNvZXJjZSl8fCExLC4uLnYocil9KTtjbGFzcyBLIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZGVmLmNvZXJjZSYmKGUuZGF0YT1uZXcgRGF0ZShlLmRhdGEpKSx0aGlzLl9nZXRUeXBlKGUpIT09Zi5kYXRlKXtjb25zdCBhPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKGEse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5kYXRlLHJlY2VpdmVkOmEucGFyc2VkVHlwZX0pLGd9aWYoaXNOYU4oZS5kYXRhLmdldFRpbWUoKSkpe2NvbnN0IGE9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7cmV0dXJuIGgoYSx7Y29kZTpkLmludmFsaWRfZGF0ZX0pLGd9Y29uc3Qgbj1uZXcgRDtsZXQgcztmb3IoY29uc3QgYSBvZiB0aGlzLl9kZWYuY2hlY2tzKWEua2luZD09PSJtaW4iP2UuZGF0YS5nZXRUaW1lKCk8YS52YWx1ZSYmKHM9dGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSxzKSxoKHMse2NvZGU6ZC50b29fc21hbGwsbWVzc2FnZTphLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1pbmltdW06YS52YWx1ZSx0eXBlOiJkYXRlIn0pLG4uZGlydHkoKSk6YS5raW5kPT09Im1heCI/ZS5kYXRhLmdldFRpbWUoKT5hLnZhbHVlJiYocz10aGlzLl9nZXRPclJldHVybkN0eChlLHMpLGgocyx7Y29kZTpkLnRvb19iaWcsbWVzc2FnZTphLm1lc3NhZ2UsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1heGltdW06YS52YWx1ZSx0eXBlOiJkYXRlIn0pLG4uZGlydHkoKSk6eC5hc3NlcnROZXZlcihhKTtyZXR1cm57c3RhdHVzOm4udmFsdWUsdmFsdWU6bmV3IERhdGUoZS5kYXRhLmdldFRpbWUoKSl9fV9hZGRDaGVjayhlKXtyZXR1cm4gbmV3IEsoey4uLnRoaXMuX2RlZixjaGVja3M6Wy4uLnRoaXMuX2RlZi5jaGVja3MsZV19KX1taW4oZSx0KXtyZXR1cm4gdGhpcy5fYWRkQ2hlY2soe2tpbmQ6Im1pbiIsdmFsdWU6ZS5nZXRUaW1lKCksbWVzc2FnZTpwLnRvU3RyaW5nKHQpfSl9bWF4KGUsdCl7cmV0dXJuIHRoaXMuX2FkZENoZWNrKHtraW5kOiJtYXgiLHZhbHVlOmUuZ2V0VGltZSgpLG1lc3NhZ2U6cC50b1N0cmluZyh0KX0pfWdldCBtaW5EYXRlKCl7bGV0IGU9bnVsbDtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKXQua2luZD09PSJtaW4iJiYoZT09PW51bGx8fHQudmFsdWU+ZSkmJihlPXQudmFsdWUpO3JldHVybiBlIT1udWxsP25ldyBEYXRlKGUpOm51bGx9Z2V0IG1heERhdGUoKXtsZXQgZT1udWxsO2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi5jaGVja3MpdC5raW5kPT09Im1heCImJihlPT09bnVsbHx8dC52YWx1ZTxlKSYmKGU9dC52YWx1ZSk7cmV0dXJuIGUhPW51bGw/bmV3IERhdGUoZSk6bnVsbH19Sy5jcmVhdGU9cj0+bmV3IEsoe2NoZWNrczpbXSxjb2VyY2U6KHI9PW51bGw/dm9pZCAwOnIuY29lcmNlKXx8ITEsdHlwZU5hbWU6eS5ab2REYXRlLC4uLnYocil9KTtjbGFzcyB6ZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1mLnN5bWJvbCl7Y29uc3Qgbj10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaChuLHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuc3ltYm9sLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19emUuY3JlYXRlPXI9Pm5ldyB6ZSh7dHlwZU5hbWU6eS5ab2RTeW1ib2wsLi4udihyKX0pO2NsYXNzIFRlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYudW5kZWZpbmVkKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi51bmRlZmluZWQscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm4gTyhlLmRhdGEpfX1UZS5jcmVhdGU9cj0+bmV3IFRlKHt0eXBlTmFtZTp5LlpvZFVuZGVmaW5lZCwuLi52KHIpfSk7Y2xhc3MgJGUgZXh0ZW5kcyBfe19wYXJzZShlKXtpZih0aGlzLl9nZXRUeXBlKGUpIT09Zi5udWxsKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5udWxsLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19JGUuY3JlYXRlPXI9Pm5ldyAkZSh7dHlwZU5hbWU6eS5ab2ROdWxsLC4uLnYocil9KTtjbGFzcyBjZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2FueT0hMH1fcGFyc2UoZSl7cmV0dXJuIE8oZS5kYXRhKX19Y2UuY3JlYXRlPXI9Pm5ldyBjZSh7dHlwZU5hbWU6eS5ab2RBbnksLi4udihyKX0pO2NsYXNzIFEgZXh0ZW5kcyBfe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl91bmtub3duPSEwfV9wYXJzZShlKXtyZXR1cm4gTyhlLmRhdGEpfX1RLmNyZWF0ZT1yPT5uZXcgUSh7dHlwZU5hbWU6eS5ab2RVbmtub3duLC4uLnYocil9KTtjbGFzcyBMIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYubmV2ZXIscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZ319TC5jcmVhdGU9cj0+bmV3IEwoe3R5cGVOYW1lOnkuWm9kTmV2ZXIsLi4udihyKX0pO2NsYXNzIFVlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYudW5kZWZpbmVkKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi52b2lkLHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGd9cmV0dXJuIE8oZS5kYXRhKX19VWUuY3JlYXRlPXI9Pm5ldyBVZSh7dHlwZU5hbWU6eS5ab2RWb2lkLC4uLnYocil9KTtjbGFzcyBSIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnQsc3RhdHVzOm59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxzPXRoaXMuX2RlZjtpZih0LnBhcnNlZFR5cGUhPT1mLmFycmF5KXJldHVybiBoKHQse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5hcnJheSxyZWNlaXZlZDp0LnBhcnNlZFR5cGV9KSxnO2lmKHMuZXhhY3RMZW5ndGghPT1udWxsKXtjb25zdCBpPXQuZGF0YS5sZW5ndGg+cy5leGFjdExlbmd0aC52YWx1ZSxvPXQuZGF0YS5sZW5ndGg8cy5leGFjdExlbmd0aC52YWx1ZTsoaXx8bykmJihoKHQse2NvZGU6aT9kLnRvb19iaWc6ZC50b29fc21hbGwsbWluaW11bTpvP3MuZXhhY3RMZW5ndGgudmFsdWU6dm9pZCAwLG1heGltdW06aT9zLmV4YWN0TGVuZ3RoLnZhbHVlOnZvaWQgMCx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiEwLG1lc3NhZ2U6cy5leGFjdExlbmd0aC5tZXNzYWdlfSksbi5kaXJ0eSgpKX1pZihzLm1pbkxlbmd0aCE9PW51bGwmJnQuZGF0YS5sZW5ndGg8cy5taW5MZW5ndGgudmFsdWUmJihoKHQse2NvZGU6ZC50b29fc21hbGwsbWluaW11bTpzLm1pbkxlbmd0aC52YWx1ZSx0eXBlOiJhcnJheSIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6cy5taW5MZW5ndGgubWVzc2FnZX0pLG4uZGlydHkoKSkscy5tYXhMZW5ndGghPT1udWxsJiZ0LmRhdGEubGVuZ3RoPnMubWF4TGVuZ3RoLnZhbHVlJiYoaCh0LHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOnMubWF4TGVuZ3RoLnZhbHVlLHR5cGU6ImFycmF5IixpbmNsdXNpdmU6ITAsZXhhY3Q6ITEsbWVzc2FnZTpzLm1heExlbmd0aC5tZXNzYWdlfSksbi5kaXJ0eSgpKSx0LmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5hbGwoWy4uLnQuZGF0YV0ubWFwKChpLG8pPT5zLnR5cGUuX3BhcnNlQXN5bmMobmV3IFkodCxpLHQucGF0aCxvKSkpKS50aGVuKGk9PkQubWVyZ2VBcnJheShuLGkpKTtjb25zdCBhPVsuLi50LmRhdGFdLm1hcCgoaSxvKT0+cy50eXBlLl9wYXJzZVN5bmMobmV3IFkodCxpLHQucGF0aCxvKSkpO3JldHVybiBELm1lcmdlQXJyYXkobixhKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX1taW4oZSx0KXtyZXR1cm4gbmV3IFIoey4uLnRoaXMuX2RlZixtaW5MZW5ndGg6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW1heChlLHQpe3JldHVybiBuZXcgUih7Li4udGhpcy5fZGVmLG1heExlbmd0aDp7dmFsdWU6ZSxtZXNzYWdlOnAudG9TdHJpbmcodCl9fSl9bGVuZ3RoKGUsdCl7cmV0dXJuIG5ldyBSKHsuLi50aGlzLl9kZWYsZXhhY3RMZW5ndGg6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW5vbmVtcHR5KGUpe3JldHVybiB0aGlzLm1pbigxLGUpfX1SLmNyZWF0ZT0ocixlKT0+bmV3IFIoe3R5cGU6cixtaW5MZW5ndGg6bnVsbCxtYXhMZW5ndGg6bnVsbCxleGFjdExlbmd0aDpudWxsLHR5cGVOYW1lOnkuWm9kQXJyYXksLi4udihlKX0pO2Z1bmN0aW9uIHVlKHIpe2lmKHIgaW5zdGFuY2VvZiBUKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IGluIHIuc2hhcGUpe2NvbnN0IG49ci5zaGFwZVt0XTtlW3RdPVAuY3JlYXRlKHVlKG4pKX1yZXR1cm4gbmV3IFQoey4uLnIuX2RlZixzaGFwZTooKT0+ZX0pfWVsc2UgcmV0dXJuIHIgaW5zdGFuY2VvZiBSP25ldyBSKHsuLi5yLl9kZWYsdHlwZTp1ZShyLmVsZW1lbnQpfSk6ciBpbnN0YW5jZW9mIFA/UC5jcmVhdGUodWUoci51bndyYXAoKSkpOnIgaW5zdGFuY2VvZiBKP0ouY3JlYXRlKHVlKHIudW53cmFwKCkpKTpyIGluc3RhbmNlb2YgVz9XLmNyZWF0ZShyLml0ZW1zLm1hcChlPT51ZShlKSkpOnJ9Y2xhc3MgVCBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2NhY2hlZD1udWxsLHRoaXMubm9uc3RyaWN0PXRoaXMucGFzc3Rocm91Z2gsdGhpcy5hdWdtZW50PXRoaXMuZXh0ZW5kfV9nZXRDYWNoZWQoKXtpZih0aGlzLl9jYWNoZWQhPT1udWxsKXJldHVybiB0aGlzLl9jYWNoZWQ7Y29uc3QgZT10aGlzLl9kZWYuc2hhcGUoKSx0PXgub2JqZWN0S2V5cyhlKTtyZXR1cm4gdGhpcy5fY2FjaGVkPXtzaGFwZTplLGtleXM6dH19X3BhcnNlKGUpe2lmKHRoaXMuX2dldFR5cGUoZSkhPT1mLm9iamVjdCl7Y29uc3QgdT10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh1LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYub2JqZWN0LHJlY2VpdmVkOnUucGFyc2VkVHlwZX0pLGd9Y29uc3R7c3RhdHVzOm4sY3R4OnN9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSx7c2hhcGU6YSxrZXlzOml9PXRoaXMuX2dldENhY2hlZCgpLG89W107aWYoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBMJiZ0aGlzLl9kZWYudW5rbm93bktleXM9PT0ic3RyaXAiKSlmb3IoY29uc3QgdSBpbiBzLmRhdGEpaS5pbmNsdWRlcyh1KXx8by5wdXNoKHUpO2NvbnN0IGM9W107Zm9yKGNvbnN0IHUgb2YgaSl7Y29uc3QgbD1hW3VdLGs9cy5kYXRhW3VdO2MucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTp1fSx2YWx1ZTpsLl9wYXJzZShuZXcgWShzLGsscy5wYXRoLHUpKSxhbHdheXNTZXQ6dSBpbiBzLmRhdGF9KX1pZih0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBMKXtjb25zdCB1PXRoaXMuX2RlZi51bmtub3duS2V5cztpZih1PT09InBhc3N0aHJvdWdoIilmb3IoY29uc3QgbCBvZiBvKWMucHVzaCh7a2V5OntzdGF0dXM6InZhbGlkIix2YWx1ZTpsfSx2YWx1ZTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6cy5kYXRhW2xdfX0pO2Vsc2UgaWYodT09PSJzdHJpY3QiKW8ubGVuZ3RoPjAmJihoKHMse2NvZGU6ZC51bnJlY29nbml6ZWRfa2V5cyxrZXlzOm99KSxuLmRpcnR5KCkpO2Vsc2UgaWYodSE9PSJzdHJpcCIpdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuIil9ZWxzZXtjb25zdCB1PXRoaXMuX2RlZi5jYXRjaGFsbDtmb3IoY29uc3QgbCBvZiBvKXtjb25zdCBrPXMuZGF0YVtsXTtjLnB1c2goe2tleTp7c3RhdHVzOiJ2YWxpZCIsdmFsdWU6bH0sdmFsdWU6dS5fcGFyc2UobmV3IFkocyxrLHMucGF0aCxsKSksYWx3YXlzU2V0OmwgaW4gcy5kYXRhfSl9fXJldHVybiBzLmNvbW1vbi5hc3luYz9Qcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jKCk9Pntjb25zdCB1PVtdO2Zvcihjb25zdCBsIG9mIGMpe2NvbnN0IGs9YXdhaXQgbC5rZXksUz1hd2FpdCBsLnZhbHVlO3UucHVzaCh7a2V5OmssdmFsdWU6UyxhbHdheXNTZXQ6bC5hbHdheXNTZXR9KX1yZXR1cm4gdX0pLnRoZW4odT0+RC5tZXJnZU9iamVjdFN5bmMobix1KSk6RC5tZXJnZU9iamVjdFN5bmMobixjKX1nZXQgc2hhcGUoKXtyZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCl9c3RyaWN0KGUpe3JldHVybiBwLmVyclRvT2JqLG5ldyBUKHsuLi50aGlzLl9kZWYsdW5rbm93bktleXM6InN0cmljdCIsLi4uZSE9PXZvaWQgMD97ZXJyb3JNYXA6KHQsbik9Pnt2YXIgcyxhLGksbztjb25zdCBjPShpPShhPShzPXRoaXMuX2RlZikuZXJyb3JNYXApPT09bnVsbHx8YT09PXZvaWQgMD92b2lkIDA6YS5jYWxsKHMsdCxuKS5tZXNzYWdlKSE9PW51bGwmJmkhPT12b2lkIDA/aTpuLmRlZmF1bHRFcnJvcjtyZXR1cm4gdC5jb2RlPT09InVucmVjb2duaXplZF9rZXlzIj97bWVzc2FnZToobz1wLmVyclRvT2JqKGUpLm1lc3NhZ2UpIT09bnVsbCYmbyE9PXZvaWQgMD9vOmN9OnttZXNzYWdlOmN9fX06e319KX1zdHJpcCgpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJzdHJpcCJ9KX1wYXNzdGhyb3VnaCgpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLHVua25vd25LZXlzOiJwYXNzdGhyb3VnaCJ9KX1leHRlbmQoZSl7cmV0dXJuIG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9Pih7Li4udGhpcy5fZGVmLnNoYXBlKCksLi4uZX0pfSl9bWVyZ2UoZSl7cmV0dXJuIG5ldyBUKHt1bmtub3duS2V5czplLl9kZWYudW5rbm93bktleXMsY2F0Y2hhbGw6ZS5fZGVmLmNhdGNoYWxsLHNoYXBlOigpPT4oey4uLnRoaXMuX2RlZi5zaGFwZSgpLC4uLmUuX2RlZi5zaGFwZSgpfSksdHlwZU5hbWU6eS5ab2RPYmplY3R9KX1zZXRLZXkoZSx0KXtyZXR1cm4gdGhpcy5hdWdtZW50KHtbZV06dH0pfWNhdGNoYWxsKGUpe3JldHVybiBuZXcgVCh7Li4udGhpcy5fZGVmLGNhdGNoYWxsOmV9KX1waWNrKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyhlKS5mb3JFYWNoKG49PntlW25dJiZ0aGlzLnNoYXBlW25dJiYodFtuXT10aGlzLnNoYXBlW25dKX0pLG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9PnR9KX1vbWl0KGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49PntlW25dfHwodFtuXT10aGlzLnNoYXBlW25dKX0pLG5ldyBUKHsuLi50aGlzLl9kZWYsc2hhcGU6KCk9PnR9KX1kZWVwUGFydGlhbCgpe3JldHVybiB1ZSh0aGlzKX1wYXJ0aWFsKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49Pntjb25zdCBzPXRoaXMuc2hhcGVbbl07ZSYmIWVbbl0/dFtuXT1zOnRbbl09cy5vcHRpb25hbCgpfSksbmV3IFQoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+dH0pfXJlcXVpcmVkKGUpe2NvbnN0IHQ9e307cmV0dXJuIHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKG49PntpZihlJiYhZVtuXSl0W25dPXRoaXMuc2hhcGVbbl07ZWxzZXtsZXQgYT10aGlzLnNoYXBlW25dO2Zvcig7YSBpbnN0YW5jZW9mIFA7KWE9YS5fZGVmLmlubmVyVHlwZTt0W25dPWF9fSksbmV3IFQoey4uLnRoaXMuX2RlZixzaGFwZTooKT0+dH0pfWtleW9mKCl7cmV0dXJuIFR0KHgub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSl9fVQuY3JlYXRlPShyLGUpPT5uZXcgVCh7c2hhcGU6KCk9PnIsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpMLmNyZWF0ZSgpLHR5cGVOYW1lOnkuWm9kT2JqZWN0LC4uLnYoZSl9KSxULnN0cmljdENyZWF0ZT0ocixlKT0+bmV3IFQoe3NoYXBlOigpPT5yLHVua25vd25LZXlzOiJzdHJpY3QiLGNhdGNoYWxsOkwuY3JlYXRlKCksdHlwZU5hbWU6eS5ab2RPYmplY3QsLi4udihlKX0pLFQubGF6eWNyZWF0ZT0ocixlKT0+bmV3IFQoe3NoYXBlOnIsdW5rbm93bktleXM6InN0cmlwIixjYXRjaGFsbDpMLmNyZWF0ZSgpLHR5cGVOYW1lOnkuWm9kT2JqZWN0LC4uLnYoZSl9KTtjbGFzcyBNZSBleHRlbmRzIF97X3BhcnNlKGUpe2NvbnN0e2N0eDp0fT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksbj10aGlzLl9kZWYub3B0aW9ucztmdW5jdGlvbiBzKGEpe2Zvcihjb25zdCBvIG9mIGEpaWYoby5yZXN1bHQuc3RhdHVzPT09InZhbGlkIilyZXR1cm4gby5yZXN1bHQ7Zm9yKGNvbnN0IG8gb2YgYSlpZihvLnJlc3VsdC5zdGF0dXM9PT0iZGlydHkiKXJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5vLmN0eC5jb21tb24uaXNzdWVzKSxvLnJlc3VsdDtjb25zdCBpPWEubWFwKG89Pm5ldyBBKG8uY3R4LmNvbW1vbi5pc3N1ZXMpKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczppfSksZ31pZih0LmNvbW1vbi5hc3luYylyZXR1cm4gUHJvbWlzZS5hbGwobi5tYXAoYXN5bmMgYT0+e2NvbnN0IGk9ey4uLnQsY29tbW9uOnsuLi50LmNvbW1vbixpc3N1ZXM6W119LHBhcmVudDpudWxsfTtyZXR1cm57cmVzdWx0OmF3YWl0IGEuX3BhcnNlQXN5bmMoe2RhdGE6dC5kYXRhLHBhdGg6dC5wYXRoLHBhcmVudDppfSksY3R4Oml9fSkpLnRoZW4ocyk7e2xldCBhO2NvbnN0IGk9W107Zm9yKGNvbnN0IGMgb2Ygbil7Y29uc3QgdT17Li4udCxjb21tb246ey4uLnQuY29tbW9uLGlzc3VlczpbXX0scGFyZW50Om51bGx9LGw9Yy5fcGFyc2VTeW5jKHtkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxwYXJlbnQ6dX0pO2lmKGwuc3RhdHVzPT09InZhbGlkIilyZXR1cm4gbDtsLnN0YXR1cz09PSJkaXJ0eSImJiFhJiYoYT17cmVzdWx0OmwsY3R4OnV9KSx1LmNvbW1vbi5pc3N1ZXMubGVuZ3RoJiZpLnB1c2godS5jb21tb24uaXNzdWVzKX1pZihhKXJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5hLmN0eC5jb21tb24uaXNzdWVzKSxhLnJlc3VsdDtjb25zdCBvPWkubWFwKGM9Pm5ldyBBKGMpKTtyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF91bmlvbix1bmlvbkVycm9yczpvfSksZ319Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnN9fU1lLmNyZWF0ZT0ocixlKT0+bmV3IE1lKHtvcHRpb25zOnIsdHlwZU5hbWU6eS5ab2RVbmlvbiwuLi52KGUpfSk7Y29uc3Qgej1yPT5yIGluc3RhbmNlb2YgTmU/eihyLnNjaGVtYSk6ciBpbnN0YW5jZW9mIEM/eihyLmlubmVyVHlwZSgpKTpyIGluc3RhbmNlb2YgQWU/W3IudmFsdWVdOnIgaW5zdGFuY2VvZiBHP3Iub3B0aW9uczpyIGluc3RhbmNlb2YgRWU/eC5vYmplY3RWYWx1ZXMoci5lbnVtKTpyIGluc3RhbmNlb2YgUmU/eihyLl9kZWYuaW5uZXJUeXBlKTpyIGluc3RhbmNlb2YgVGU/W3ZvaWQgMF06ciBpbnN0YW5jZW9mICRlP1tudWxsXTpyIGluc3RhbmNlb2YgUD9bdm9pZCAwLC4uLnooci51bndyYXAoKSldOnIgaW5zdGFuY2VvZiBKP1tudWxsLC4uLnooci51bndyYXAoKSldOnIgaW5zdGFuY2VvZiBvdHx8ciBpbnN0YW5jZW9mIEllP3ooci51bndyYXAoKSk6ciBpbnN0YW5jZW9mIENlP3ooci5fZGVmLmlubmVyVHlwZSk6W107Y2xhc3MgRmUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKHQucGFyc2VkVHlwZSE9PWYub2JqZWN0KXJldHVybiBoKHQse2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5vYmplY3QscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZztjb25zdCBuPXRoaXMuZGlzY3JpbWluYXRvcixzPXQuZGF0YVtuXSxhPXRoaXMub3B0aW9uc01hcC5nZXQocyk7cmV0dXJuIGE/dC5jb21tb24uYXN5bmM/YS5fcGFyc2VBc3luYyh7ZGF0YTp0LmRhdGEscGF0aDp0LnBhdGgscGFyZW50OnR9KTphLl9wYXJzZVN5bmMoe2RhdGE6dC5kYXRhLHBhdGg6dC5wYXRoLHBhcmVudDp0fSk6KGgodCx7Y29kZTpkLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixvcHRpb25zOkFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSkscGF0aDpbbl19KSxnKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcn1nZXQgb3B0aW9ucygpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc31nZXQgb3B0aW9uc01hcCgpe3JldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcH1zdGF0aWMgY3JlYXRlKGUsdCxuKXtjb25zdCBzPW5ldyBNYXA7Zm9yKGNvbnN0IGEgb2YgdCl7Y29uc3QgaT16KGEuc2hhcGVbZV0pO2lmKCFpLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxgJHtlfVxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtmb3IoY29uc3QgbyBvZiBpKXtpZihzLmhhcyhvKSl0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZSl9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcobyl9YCk7cy5zZXQobyxhKX19cmV0dXJuIG5ldyBGZSh7dHlwZU5hbWU6eS5ab2REaXNjcmltaW5hdGVkVW5pb24sZGlzY3JpbWluYXRvcjplLG9wdGlvbnM6dCxvcHRpb25zTWFwOnMsLi4udihuKX0pfX1mdW5jdGlvbiBpdChyLGUpe2NvbnN0IHQ9QihyKSxuPUIoZSk7aWYocj09PWUpcmV0dXJue3ZhbGlkOiEwLGRhdGE6cn07aWYodD09PWYub2JqZWN0JiZuPT09Zi5vYmplY3Qpe2NvbnN0IHM9eC5vYmplY3RLZXlzKGUpLGE9eC5vYmplY3RLZXlzKHIpLmZpbHRlcihvPT5zLmluZGV4T2YobykhPT0tMSksaT17Li4uciwuLi5lfTtmb3IoY29uc3QgbyBvZiBhKXtjb25zdCBjPWl0KHJbb10sZVtvXSk7aWYoIWMudmFsaWQpcmV0dXJue3ZhbGlkOiExfTtpW29dPWMuZGF0YX1yZXR1cm57dmFsaWQ6ITAsZGF0YTppfX1lbHNlIGlmKHQ9PT1mLmFycmF5JiZuPT09Zi5hcnJheSl7aWYoci5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm57dmFsaWQ6ITF9O2NvbnN0IHM9W107Zm9yKGxldCBhPTA7YTxyLmxlbmd0aDthKyspe2NvbnN0IGk9clthXSxvPWVbYV0sYz1pdChpLG8pO2lmKCFjLnZhbGlkKXJldHVybnt2YWxpZDohMX07cy5wdXNoKGMuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6c319ZWxzZSByZXR1cm4gdD09PWYuZGF0ZSYmbj09PWYuZGF0ZSYmK3I9PStlP3t2YWxpZDohMCxkYXRhOnJ9Ont2YWxpZDohMX19Y2xhc3MgRGUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLHM9KGEsaSk9PntpZihudChhKXx8bnQoaSkpcmV0dXJuIGc7Y29uc3Qgbz1pdChhLnZhbHVlLGkudmFsdWUpO3JldHVybiBvLnZhbGlkPygoc3QoYSl8fHN0KGkpKSYmdC5kaXJ0eSgpLHtzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvLmRhdGF9KTooaChuLHtjb2RlOmQuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXN9KSxnKX07cmV0dXJuIG4uY29tbW9uLmFzeW5jP1Byb21pc2UuYWxsKFt0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KSx0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSldKS50aGVuKChbYSxpXSk9PnMoYSxpKSk6cyh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pLHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pKX19RGUuY3JlYXRlPShyLGUsdCk9Pm5ldyBEZSh7bGVmdDpyLHJpZ2h0OmUsdHlwZU5hbWU6eS5ab2RJbnRlcnNlY3Rpb24sLi4udih0KX0pO2NsYXNzIFcgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYuYXJyYXkpcmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLmFycmF5LHJlY2VpdmVkOm4ucGFyc2VkVHlwZX0pLGc7aWYobi5kYXRhLmxlbmd0aDx0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKXJldHVybiBoKG4se2NvZGU6ZC50b29fc21hbGwsbWluaW11bTp0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLGluY2x1c2l2ZTohMCxleGFjdDohMSx0eXBlOiJhcnJheSJ9KSxnOyF0aGlzLl9kZWYucmVzdCYmbi5kYXRhLmxlbmd0aD50aGlzLl9kZWYuaXRlbXMubGVuZ3RoJiYoaChuLHtjb2RlOmQudG9vX2JpZyxtYXhpbXVtOnRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsaW5jbHVzaXZlOiEwLGV4YWN0OiExLHR5cGU6ImFycmF5In0pLHQuZGlydHkoKSk7Y29uc3QgYT1bLi4ubi5kYXRhXS5tYXAoKGksbyk9Pntjb25zdCBjPXRoaXMuX2RlZi5pdGVtc1tvXXx8dGhpcy5fZGVmLnJlc3Q7cmV0dXJuIGM/Yy5fcGFyc2UobmV3IFkobixpLG4ucGF0aCxvKSk6bnVsbH0pLmZpbHRlcihpPT4hIWkpO3JldHVybiBuLmNvbW1vbi5hc3luYz9Qcm9taXNlLmFsbChhKS50aGVuKGk9PkQubWVyZ2VBcnJheSh0LGkpKTpELm1lcmdlQXJyYXkodCxhKX1nZXQgaXRlbXMoKXtyZXR1cm4gdGhpcy5fZGVmLml0ZW1zfXJlc3QoZSl7cmV0dXJuIG5ldyBXKHsuLi50aGlzLl9kZWYscmVzdDplfSl9fVcuY3JlYXRlPShyLGUpPT57aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IEVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IG9mIHNjaGVtYXMgdG8gei50dXBsZShbIC4uLiBdKSIpO3JldHVybiBuZXcgVyh7aXRlbXM6cix0eXBlTmFtZTp5LlpvZFR1cGxlLHJlc3Q6bnVsbCwuLi52KGUpfSl9O2NsYXNzIE9lIGV4dGVuZHMgX3tnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYub2JqZWN0KXJldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5vYmplY3QscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZztjb25zdCBzPVtdLGE9dGhpcy5fZGVmLmtleVR5cGUsaT10aGlzLl9kZWYudmFsdWVUeXBlO2Zvcihjb25zdCBvIGluIG4uZGF0YSlzLnB1c2goe2tleTphLl9wYXJzZShuZXcgWShuLG8sbi5wYXRoLG8pKSx2YWx1ZTppLl9wYXJzZShuZXcgWShuLG4uZGF0YVtvXSxuLnBhdGgsbykpLGFsd2F5c1NldDpvIGluIG4uZGF0YX0pO3JldHVybiBuLmNvbW1vbi5hc3luYz9ELm1lcmdlT2JqZWN0QXN5bmModCxzKTpELm1lcmdlT2JqZWN0U3luYyh0LHMpfWdldCBlbGVtZW50KCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGV9c3RhdGljIGNyZWF0ZShlLHQsbil7cmV0dXJuIHQgaW5zdGFuY2VvZiBfP25ldyBPZSh7a2V5VHlwZTplLHZhbHVlVHlwZTp0LHR5cGVOYW1lOnkuWm9kUmVjb3JkLC4uLnYobil9KTpuZXcgT2Uoe2tleVR5cGU6RS5jcmVhdGUoKSx2YWx1ZVR5cGU6ZSx0eXBlTmFtZTp5LlpvZFJlY29yZCwuLi52KHQpfSl9fWNsYXNzIEJlIGV4dGVuZHMgX3tnZXQga2V5U2NoZW1hKCl7cmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlfWdldCB2YWx1ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlfV9wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4ucGFyc2VkVHlwZSE9PWYubWFwKXJldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5tYXAscmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZztjb25zdCBzPXRoaXMuX2RlZi5rZXlUeXBlLGE9dGhpcy5fZGVmLnZhbHVlVHlwZSxpPVsuLi5uLmRhdGEuZW50cmllcygpXS5tYXAoKFtvLGNdLHUpPT4oe2tleTpzLl9wYXJzZShuZXcgWShuLG8sbi5wYXRoLFt1LCJrZXkiXSkpLHZhbHVlOmEuX3BhcnNlKG5ldyBZKG4sYyxuLnBhdGgsW3UsInZhbHVlIl0pKX0pKTtpZihuLmNvbW1vbi5hc3luYyl7Y29uc3Qgbz1uZXcgTWFwO3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jKCk9Pntmb3IoY29uc3QgYyBvZiBpKXtjb25zdCB1PWF3YWl0IGMua2V5LGw9YXdhaXQgYy52YWx1ZTtpZih1LnN0YXR1cz09PSJhYm9ydGVkInx8bC5zdGF0dXM9PT0iYWJvcnRlZCIpcmV0dXJuIGc7KHUuc3RhdHVzPT09ImRpcnR5Inx8bC5zdGF0dXM9PT0iZGlydHkiKSYmdC5kaXJ0eSgpLG8uc2V0KHUudmFsdWUsbC52YWx1ZSl9cmV0dXJue3N0YXR1czp0LnZhbHVlLHZhbHVlOm99fSl9ZWxzZXtjb25zdCBvPW5ldyBNYXA7Zm9yKGNvbnN0IGMgb2YgaSl7Y29uc3QgdT1jLmtleSxsPWMudmFsdWU7aWYodS5zdGF0dXM9PT0iYWJvcnRlZCJ8fGwuc3RhdHVzPT09ImFib3J0ZWQiKXJldHVybiBnOyh1LnN0YXR1cz09PSJkaXJ0eSJ8fGwuc3RhdHVzPT09ImRpcnR5IikmJnQuZGlydHkoKSxvLnNldCh1LnZhbHVlLGwudmFsdWUpfXJldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfX19fUJlLmNyZWF0ZT0ocixlLHQpPT5uZXcgQmUoe3ZhbHVlVHlwZTplLGtleVR5cGU6cix0eXBlTmFtZTp5LlpvZE1hcCwuLi52KHQpfSk7Y2xhc3MgWCBleHRlbmRzIF97X3BhcnNlKGUpe2NvbnN0e3N0YXR1czp0LGN0eDpufT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYobi5wYXJzZWRUeXBlIT09Zi5zZXQpcmV0dXJuIGgobix7Y29kZTpkLmludmFsaWRfdHlwZSxleHBlY3RlZDpmLnNldCxyZWNlaXZlZDpuLnBhcnNlZFR5cGV9KSxnO2NvbnN0IHM9dGhpcy5fZGVmO3MubWluU2l6ZSE9PW51bGwmJm4uZGF0YS5zaXplPHMubWluU2l6ZS52YWx1ZSYmKGgobix7Y29kZTpkLnRvb19zbWFsbCxtaW5pbXVtOnMubWluU2l6ZS52YWx1ZSx0eXBlOiJzZXQiLGluY2x1c2l2ZTohMCxleGFjdDohMSxtZXNzYWdlOnMubWluU2l6ZS5tZXNzYWdlfSksdC5kaXJ0eSgpKSxzLm1heFNpemUhPT1udWxsJiZuLmRhdGEuc2l6ZT5zLm1heFNpemUudmFsdWUmJihoKG4se2NvZGU6ZC50b29fYmlnLG1heGltdW06cy5tYXhTaXplLnZhbHVlLHR5cGU6InNldCIsaW5jbHVzaXZlOiEwLGV4YWN0OiExLG1lc3NhZ2U6cy5tYXhTaXplLm1lc3NhZ2V9KSx0LmRpcnR5KCkpO2NvbnN0IGE9dGhpcy5fZGVmLnZhbHVlVHlwZTtmdW5jdGlvbiBpKGMpe2NvbnN0IHU9bmV3IFNldDtmb3IoY29uc3QgbCBvZiBjKXtpZihsLnN0YXR1cz09PSJhYm9ydGVkIilyZXR1cm4gZztsLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSx1LmFkZChsLnZhbHVlKX1yZXR1cm57c3RhdHVzOnQudmFsdWUsdmFsdWU6dX19Y29uc3Qgbz1bLi4ubi5kYXRhLnZhbHVlcygpXS5tYXAoKGMsdSk9PmEuX3BhcnNlKG5ldyBZKG4sYyxuLnBhdGgsdSkpKTtyZXR1cm4gbi5jb21tb24uYXN5bmM/UHJvbWlzZS5hbGwobykudGhlbihjPT5pKGMpKTppKG8pfW1pbihlLHQpe3JldHVybiBuZXcgWCh7Li4udGhpcy5fZGVmLG1pblNpemU6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfW1heChlLHQpe3JldHVybiBuZXcgWCh7Li4udGhpcy5fZGVmLG1heFNpemU6e3ZhbHVlOmUsbWVzc2FnZTpwLnRvU3RyaW5nKHQpfX0pfXNpemUoZSx0KXtyZXR1cm4gdGhpcy5taW4oZSx0KS5tYXgoZSx0KX1ub25lbXB0eShlKXtyZXR1cm4gdGhpcy5taW4oMSxlKX19WC5jcmVhdGU9KHIsZSk9Pm5ldyBYKHt2YWx1ZVR5cGU6cixtaW5TaXplOm51bGwsbWF4U2l6ZTpudWxsLHR5cGVOYW1lOnkuWm9kU2V0LC4uLnYoZSl9KTtjbGFzcyBkZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMudmFsaWRhdGU9dGhpcy5pbXBsZW1lbnR9X3BhcnNlKGUpe2NvbnN0e2N0eDp0fT10aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7aWYodC5wYXJzZWRUeXBlIT09Zi5mdW5jdGlvbilyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYuZnVuY3Rpb24scmVjZWl2ZWQ6dC5wYXJzZWRUeXBlfSksZztmdW5jdGlvbiBuKG8sYyl7cmV0dXJuIFZlKHtkYXRhOm8scGF0aDp0LnBhdGgsZXJyb3JNYXBzOlt0LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsdC5zY2hlbWFFcnJvck1hcCxQZSgpLGllXS5maWx0ZXIodT0+ISF1KSxpc3N1ZURhdGE6e2NvZGU6ZC5pbnZhbGlkX2FyZ3VtZW50cyxhcmd1bWVudHNFcnJvcjpjfX0pfWZ1bmN0aW9uIHMobyxjKXtyZXR1cm4gVmUoe2RhdGE6byxwYXRoOnQucGF0aCxlcnJvck1hcHM6W3QuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCx0LnNjaGVtYUVycm9yTWFwLFBlKCksaWVdLmZpbHRlcih1PT4hIXUpLGlzc3VlRGF0YTp7Y29kZTpkLmludmFsaWRfcmV0dXJuX3R5cGUscmV0dXJuVHlwZUVycm9yOmN9fSl9Y29uc3QgYT17ZXJyb3JNYXA6dC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwfSxpPXQuZGF0YTtpZih0aGlzLl9kZWYucmV0dXJucyBpbnN0YW5jZW9mIGxlKXtjb25zdCBvPXRoaXM7cmV0dXJuIE8oYXN5bmMgZnVuY3Rpb24oLi4uYyl7Y29uc3QgdT1uZXcgQShbXSksbD1hd2FpdCBvLl9kZWYuYXJncy5wYXJzZUFzeW5jKGMsYSkuY2F0Y2goTT0+e3Rocm93IHUuYWRkSXNzdWUobihjLE0pKSx1fSksaz1hd2FpdCBSZWZsZWN0LmFwcGx5KGksdGhpcyxsKTtyZXR1cm4gYXdhaXQgby5fZGVmLnJldHVybnMuX2RlZi50eXBlLnBhcnNlQXN5bmMoayxhKS5jYXRjaChNPT57dGhyb3cgdS5hZGRJc3N1ZShzKGssTSkpLHV9KX0pfWVsc2V7Y29uc3Qgbz10aGlzO3JldHVybiBPKGZ1bmN0aW9uKC4uLmMpe2NvbnN0IHU9by5fZGVmLmFyZ3Muc2FmZVBhcnNlKGMsYSk7aWYoIXUuc3VjY2Vzcyl0aHJvdyBuZXcgQShbbihjLHUuZXJyb3IpXSk7Y29uc3QgbD1SZWZsZWN0LmFwcGx5KGksdGhpcyx1LmRhdGEpLGs9by5fZGVmLnJldHVybnMuc2FmZVBhcnNlKGwsYSk7aWYoIWsuc3VjY2Vzcyl0aHJvdyBuZXcgQShbcyhsLGsuZXJyb3IpXSk7cmV0dXJuIGsuZGF0YX0pfX1wYXJhbWV0ZXJzKCl7cmV0dXJuIHRoaXMuX2RlZi5hcmdzfXJldHVyblR5cGUoKXtyZXR1cm4gdGhpcy5fZGVmLnJldHVybnN9YXJncyguLi5lKXtyZXR1cm4gbmV3IGRlKHsuLi50aGlzLl9kZWYsYXJnczpXLmNyZWF0ZShlKS5yZXN0KFEuY3JlYXRlKCkpfSl9cmV0dXJucyhlKXtyZXR1cm4gbmV3IGRlKHsuLi50aGlzLl9kZWYscmV0dXJuczplfSl9aW1wbGVtZW50KGUpe3JldHVybiB0aGlzLnBhcnNlKGUpfXN0cmljdEltcGxlbWVudChlKXtyZXR1cm4gdGhpcy5wYXJzZShlKX1zdGF0aWMgY3JlYXRlKGUsdCxuKXtyZXR1cm4gbmV3IGRlKHthcmdzOmV8fFcuY3JlYXRlKFtdKS5yZXN0KFEuY3JlYXRlKCkpLHJldHVybnM6dHx8US5jcmVhdGUoKSx0eXBlTmFtZTp5LlpvZEZ1bmN0aW9uLC4uLnYobil9KX19Y2xhc3MgTmUgZXh0ZW5kcyBfe2dldCBzY2hlbWEoKXtyZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpfV9wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO3JldHVybiB0aGlzLl9kZWYuZ2V0dGVyKCkuX3BhcnNlKHtkYXRhOnQuZGF0YSxwYXRoOnQucGF0aCxwYXJlbnQ6dH0pfX1OZS5jcmVhdGU9KHIsZSk9Pm5ldyBOZSh7Z2V0dGVyOnIsdHlwZU5hbWU6eS5ab2RMYXp5LC4uLnYoZSl9KTtjbGFzcyBBZSBleHRlbmRzIF97X3BhcnNlKGUpe2lmKGUuZGF0YSE9PXRoaXMuX2RlZi52YWx1ZSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKTtyZXR1cm4gaCh0LHtyZWNlaXZlZDp0LmRhdGEsY29kZTpkLmludmFsaWRfbGl0ZXJhbCxleHBlY3RlZDp0aGlzLl9kZWYudmFsdWV9KSxnfXJldHVybntzdGF0dXM6InZhbGlkIix2YWx1ZTplLmRhdGF9fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWV9fUFlLmNyZWF0ZT0ocixlKT0+bmV3IEFlKHt2YWx1ZTpyLHR5cGVOYW1lOnkuWm9kTGl0ZXJhbCwuLi52KGUpfSk7ZnVuY3Rpb24gVHQocixlKXtyZXR1cm4gbmV3IEcoe3ZhbHVlczpyLHR5cGVOYW1lOnkuWm9kRW51bSwuLi52KGUpfSl9Y2xhc3MgRyBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLGJlLnNldCh0aGlzLHZvaWQgMCl9X3BhcnNlKGUpe2lmKHR5cGVvZiBlLmRhdGEhPSJzdHJpbmciKXtjb25zdCB0PXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpLG49dGhpcy5fZGVmLnZhbHVlcztyZXR1cm4gaCh0LHtleHBlY3RlZDp4LmpvaW5WYWx1ZXMobikscmVjZWl2ZWQ6dC5wYXJzZWRUeXBlLGNvZGU6ZC5pbnZhbGlkX3R5cGV9KSxnfWlmKExlKHRoaXMsYmUpfHx4dCh0aGlzLGJlLG5ldyBTZXQodGhpcy5fZGVmLnZhbHVlcykpLCFMZSh0aGlzLGJlKS5oYXMoZS5kYXRhKSl7Y29uc3QgdD10aGlzLl9nZXRPclJldHVybkN0eChlKSxuPXRoaXMuX2RlZi52YWx1ZXM7cmV0dXJuIGgodCx7cmVjZWl2ZWQ6dC5kYXRhLGNvZGU6ZC5pbnZhbGlkX2VudW1fdmFsdWUsb3B0aW9uczpufSksZ31yZXR1cm4gTyhlLmRhdGEpfWdldCBvcHRpb25zKCl7cmV0dXJuIHRoaXMuX2RlZi52YWx1ZXN9Z2V0IGVudW0oKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpZVt0XT10O3JldHVybiBlfWdldCBWYWx1ZXMoKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpZVt0XT10O3JldHVybiBlfWdldCBFbnVtKCl7Y29uc3QgZT17fTtmb3IoY29uc3QgdCBvZiB0aGlzLl9kZWYudmFsdWVzKWVbdF09dDtyZXR1cm4gZX1leHRyYWN0KGUsdD10aGlzLl9kZWYpe3JldHVybiBHLmNyZWF0ZShlLHsuLi50aGlzLl9kZWYsLi4udH0pfWV4Y2x1ZGUoZSx0PXRoaXMuX2RlZil7cmV0dXJuIEcuY3JlYXRlKHRoaXMub3B0aW9ucy5maWx0ZXIobj0+IWUuaW5jbHVkZXMobikpLHsuLi50aGlzLl9kZWYsLi4udH0pfX1iZT1uZXcgV2Vha01hcCxHLmNyZWF0ZT1UdDtjbGFzcyBFZSBleHRlbmRzIF97Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHdlLnNldCh0aGlzLHZvaWQgMCl9X3BhcnNlKGUpe2NvbnN0IHQ9eC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcyksbj10aGlzLl9nZXRPclJldHVybkN0eChlKTtpZihuLnBhcnNlZFR5cGUhPT1mLnN0cmluZyYmbi5wYXJzZWRUeXBlIT09Zi5udW1iZXIpe2NvbnN0IHM9eC5vYmplY3RWYWx1ZXModCk7cmV0dXJuIGgobix7ZXhwZWN0ZWQ6eC5qb2luVmFsdWVzKHMpLHJlY2VpdmVkOm4ucGFyc2VkVHlwZSxjb2RlOmQuaW52YWxpZF90eXBlfSksZ31pZihMZSh0aGlzLHdlKXx8eHQodGhpcyx3ZSxuZXcgU2V0KHguZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSksIUxlKHRoaXMsd2UpLmhhcyhlLmRhdGEpKXtjb25zdCBzPXgub2JqZWN0VmFsdWVzKHQpO3JldHVybiBoKG4se3JlY2VpdmVkOm4uZGF0YSxjb2RlOmQuaW52YWxpZF9lbnVtX3ZhbHVlLG9wdGlvbnM6c30pLGd9cmV0dXJuIE8oZS5kYXRhKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLl9kZWYudmFsdWVzfX13ZT1uZXcgV2Vha01hcCxFZS5jcmVhdGU9KHIsZSk9Pm5ldyBFZSh7dmFsdWVzOnIsdHlwZU5hbWU6eS5ab2ROYXRpdmVFbnVtLC4uLnYoZSl9KTtjbGFzcyBsZSBleHRlbmRzIF97dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi50eXBlfV9wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKHQucGFyc2VkVHlwZSE9PWYucHJvbWlzZSYmdC5jb21tb24uYXN5bmM9PT0hMSlyZXR1cm4gaCh0LHtjb2RlOmQuaW52YWxpZF90eXBlLGV4cGVjdGVkOmYucHJvbWlzZSxyZWNlaXZlZDp0LnBhcnNlZFR5cGV9KSxnO2NvbnN0IG49dC5wYXJzZWRUeXBlPT09Zi5wcm9taXNlP3QuZGF0YTpQcm9taXNlLnJlc29sdmUodC5kYXRhKTtyZXR1cm4gTyhuLnRoZW4ocz0+dGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhzLHtwYXRoOnQucGF0aCxlcnJvck1hcDp0LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXB9KSkpfX1sZS5jcmVhdGU9KHIsZSk9Pm5ldyBsZSh7dHlwZTpyLHR5cGVOYW1lOnkuWm9kUHJvbWlzZSwuLi52KGUpfSk7Y2xhc3MgQyBleHRlbmRzIF97aW5uZXJUeXBlKCl7cmV0dXJuIHRoaXMuX2RlZi5zY2hlbWF9c291cmNlVHlwZSgpe3JldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWU9PT15LlpvZEVmZmVjdHM/dGhpcy5fZGVmLnNjaGVtYS5zb3VyY2VUeXBlKCk6dGhpcy5fZGVmLnNjaGVtYX1fcGFyc2UoZSl7Y29uc3R7c3RhdHVzOnQsY3R4Om59PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxzPXRoaXMuX2RlZi5lZmZlY3R8fG51bGwsYT17YWRkSXNzdWU6aT0+e2gobixpKSxpLmZhdGFsP3QuYWJvcnQoKTp0LmRpcnR5KCl9LGdldCBwYXRoKCl7cmV0dXJuIG4ucGF0aH19O2lmKGEuYWRkSXNzdWU9YS5hZGRJc3N1ZS5iaW5kKGEpLHMudHlwZT09PSJwcmVwcm9jZXNzIil7Y29uc3QgaT1zLnRyYW5zZm9ybShuLmRhdGEsYSk7aWYobi5jb21tb24uYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShpKS50aGVuKGFzeW5jIG89PntpZih0LnZhbHVlPT09ImFib3J0ZWQiKXJldHVybiBnO2NvbnN0IGM9YXdhaXQgdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7ZGF0YTpvLHBhdGg6bi5wYXRoLHBhcmVudDpufSk7cmV0dXJuIGMuc3RhdHVzPT09ImFib3J0ZWQiP2c6Yy5zdGF0dXM9PT0iZGlydHkifHx0LnZhbHVlPT09ImRpcnR5Ij9vZShjLnZhbHVlKTpjfSk7e2lmKHQudmFsdWU9PT0iYWJvcnRlZCIpcmV0dXJuIGc7Y29uc3Qgbz10aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe2RhdGE6aSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pO3JldHVybiBvLnN0YXR1cz09PSJhYm9ydGVkIj9nOm8uc3RhdHVzPT09ImRpcnR5Inx8dC52YWx1ZT09PSJkaXJ0eSI/b2Uoby52YWx1ZSk6b319aWYocy50eXBlPT09InJlZmluZW1lbnQiKXtjb25zdCBpPW89Pntjb25zdCBjPXMucmVmaW5lbWVudChvLGEpO2lmKG4uY29tbW9uLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUoYyk7aWYoYyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybiBvfTtpZihuLmNvbW1vbi5hc3luYz09PSExKXtjb25zdCBvPXRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KTtyZXR1cm4gby5zdGF0dXM9PT0iYWJvcnRlZCI/Zzooby5zdGF0dXM9PT0iZGlydHkiJiZ0LmRpcnR5KCksaShvLnZhbHVlKSx7c3RhdHVzOnQudmFsdWUsdmFsdWU6by52YWx1ZX0pfWVsc2UgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSkudGhlbihvPT5vLnN0YXR1cz09PSJhYm9ydGVkIj9nOihvLnN0YXR1cz09PSJkaXJ0eSImJnQuZGlydHkoKSxpKG8udmFsdWUpLnRoZW4oKCk9Pih7c3RhdHVzOnQudmFsdWUsdmFsdWU6by52YWx1ZX0pKSkpfWlmKHMudHlwZT09PSJ0cmFuc2Zvcm0iKWlmKG4uY29tbW9uLmFzeW5jPT09ITEpe2NvbnN0IGk9dGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pO2lmKCF4ZShpKSlyZXR1cm4gaTtjb25zdCBvPXMudHJhbnNmb3JtKGkudmFsdWUsYSk7aWYobyBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLiIpO3JldHVybntzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfX1lbHNlIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtkYXRhOm4uZGF0YSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pLnRoZW4oaT0+eGUoaSk/UHJvbWlzZS5yZXNvbHZlKHMudHJhbnNmb3JtKGkudmFsdWUsYSkpLnRoZW4obz0+KHtzdGF0dXM6dC52YWx1ZSx2YWx1ZTpvfSkpOmkpO3guYXNzZXJ0TmV2ZXIocyl9fUMuY3JlYXRlPShyLGUsdCk9Pm5ldyBDKHtzY2hlbWE6cix0eXBlTmFtZTp5LlpvZEVmZmVjdHMsZWZmZWN0OmUsLi4udih0KX0pLEMuY3JlYXRlV2l0aFByZXByb2Nlc3M9KHIsZSx0KT0+bmV3IEMoe3NjaGVtYTplLGVmZmVjdDp7dHlwZToicHJlcHJvY2VzcyIsdHJhbnNmb3JtOnJ9LHR5cGVOYW1lOnkuWm9kRWZmZWN0cywuLi52KHQpfSk7Y2xhc3MgUCBleHRlbmRzIF97X3BhcnNlKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlKGUpPT09Zi51bmRlZmluZWQ/Tyh2b2lkIDApOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1QLmNyZWF0ZT0ocixlKT0+bmV3IFAoe2lubmVyVHlwZTpyLHR5cGVOYW1lOnkuWm9kT3B0aW9uYWwsLi4udihlKX0pO2NsYXNzIEogZXh0ZW5kcyBfe19wYXJzZShlKXtyZXR1cm4gdGhpcy5fZ2V0VHlwZShlKT09PWYubnVsbD9PKG51bGwpOnRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1KLmNyZWF0ZT0ocixlKT0+bmV3IEooe2lubmVyVHlwZTpyLHR5cGVOYW1lOnkuWm9kTnVsbGFibGUsLi4udihlKX0pO2NsYXNzIFJlIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnR9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtsZXQgbj10LmRhdGE7cmV0dXJuIHQucGFyc2VkVHlwZT09PWYudW5kZWZpbmVkJiYobj10aGlzLl9kZWYuZGVmYXVsdFZhbHVlKCkpLHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtkYXRhOm4scGF0aDp0LnBhdGgscGFyZW50OnR9KX1yZW1vdmVEZWZhdWx0KCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fVJlLmNyZWF0ZT0ocixlKT0+bmV3IFJlKHtpbm5lclR5cGU6cix0eXBlTmFtZTp5LlpvZERlZmF1bHQsZGVmYXVsdFZhbHVlOnR5cGVvZiBlLmRlZmF1bHQ9PSJmdW5jdGlvbiI/ZS5kZWZhdWx0OigpPT5lLmRlZmF1bHQsLi4udihlKX0pO2NsYXNzIENlIGV4dGVuZHMgX3tfcGFyc2UoZSl7Y29uc3R7Y3R4OnR9PXRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSxuPXsuLi50LGNvbW1vbjp7Li4udC5jb21tb24saXNzdWVzOltdfX0scz10aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50OnsuLi5ufX0pO3JldHVybiBrZShzKT9zLnRoZW4oYT0+KHtzdGF0dXM6InZhbGlkIix2YWx1ZTphLnN0YXR1cz09PSJ2YWxpZCI/YS52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBBKG4uY29tbW9uLmlzc3Vlcyl9LGlucHV0Om4uZGF0YX0pfSkpOntzdGF0dXM6InZhbGlkIix2YWx1ZTpzLnN0YXR1cz09PSJ2YWxpZCI/cy52YWx1ZTp0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7Z2V0IGVycm9yKCl7cmV0dXJuIG5ldyBBKG4uY29tbW9uLmlzc3Vlcyl9LGlucHV0Om4uZGF0YX0pfX1yZW1vdmVDYXRjaCgpe3JldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlfX1DZS5jcmVhdGU9KHIsZSk9Pm5ldyBDZSh7aW5uZXJUeXBlOnIsdHlwZU5hbWU6eS5ab2RDYXRjaCxjYXRjaFZhbHVlOnR5cGVvZiBlLmNhdGNoPT0iZnVuY3Rpb24iP2UuY2F0Y2g6KCk9PmUuY2F0Y2gsLi4udihlKX0pO2NsYXNzIEhlIGV4dGVuZHMgX3tfcGFyc2UoZSl7aWYodGhpcy5fZ2V0VHlwZShlKSE9PWYubmFuKXtjb25zdCBuPXRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO3JldHVybiBoKG4se2NvZGU6ZC5pbnZhbGlkX3R5cGUsZXhwZWN0ZWQ6Zi5uYW4scmVjZWl2ZWQ6bi5wYXJzZWRUeXBlfSksZ31yZXR1cm57c3RhdHVzOiJ2YWxpZCIsdmFsdWU6ZS5kYXRhfX19SGUuY3JlYXRlPXI9Pm5ldyBIZSh7dHlwZU5hbWU6eS5ab2ROYU4sLi4udihyKX0pO2NvbnN0IFNyPVN5bWJvbCgiem9kX2JyYW5kIik7Y2xhc3Mgb3QgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtjdHg6dH09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLG49dC5kYXRhO3JldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe2RhdGE6bixwYXRoOnQucGF0aCxwYXJlbnQ6dH0pfXVud3JhcCgpe3JldHVybiB0aGlzLl9kZWYudHlwZX19Y2xhc3MgWmUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdHtzdGF0dXM6dCxjdHg6bn09dGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO2lmKG4uY29tbW9uLmFzeW5jKXJldHVybihhc3luYygpPT57Y29uc3QgYT1hd2FpdCB0aGlzLl9kZWYuaW4uX3BhcnNlQXN5bmMoe2RhdGE6bi5kYXRhLHBhdGg6bi5wYXRoLHBhcmVudDpufSk7cmV0dXJuIGEuc3RhdHVzPT09ImFib3J0ZWQiP2c6YS5zdGF0dXM9PT0iZGlydHkiPyh0LmRpcnR5KCksb2UoYS52YWx1ZSkpOnRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe2RhdGE6YS52YWx1ZSxwYXRoOm4ucGF0aCxwYXJlbnQ6bn0pfSkoKTt7Y29uc3Qgcz10aGlzLl9kZWYuaW4uX3BhcnNlU3luYyh7ZGF0YTpuLmRhdGEscGF0aDpuLnBhdGgscGFyZW50Om59KTtyZXR1cm4gcy5zdGF0dXM9PT0iYWJvcnRlZCI/ZzpzLnN0YXR1cz09PSJkaXJ0eSI/KHQuZGlydHkoKSx7c3RhdHVzOiJkaXJ0eSIsdmFsdWU6cy52YWx1ZX0pOnRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7ZGF0YTpzLnZhbHVlLHBhdGg6bi5wYXRoLHBhcmVudDpufSl9fXN0YXRpYyBjcmVhdGUoZSx0KXtyZXR1cm4gbmV3IFplKHtpbjplLG91dDp0LHR5cGVOYW1lOnkuWm9kUGlwZWxpbmV9KX19Y2xhc3MgSWUgZXh0ZW5kcyBfe19wYXJzZShlKXtjb25zdCB0PXRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpLG49cz0+KHhlKHMpJiYocy52YWx1ZT1PYmplY3QuZnJlZXplKHMudmFsdWUpKSxzKTtyZXR1cm4ga2UodCk/dC50aGVuKHM9Pm4ocykpOm4odCl9dW53cmFwKCl7cmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGV9fUllLmNyZWF0ZT0ocixlKT0+bmV3IEllKHtpbm5lclR5cGU6cix0eXBlTmFtZTp5LlpvZFJlYWRvbmx5LC4uLnYoZSl9KTtmdW5jdGlvbiAkdChyLGU9e30sdCl7cmV0dXJuIHI/Y2UuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKG4scyk9Pnt2YXIgYSxpO2lmKCFyKG4pKXtjb25zdCBvPXR5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6dHlwZW9mIGU9PSJzdHJpbmciP3ttZXNzYWdlOmV9OmUsYz0oaT0oYT1vLmZhdGFsKSE9PW51bGwmJmEhPT12b2lkIDA/YTp0KSE9PW51bGwmJmkhPT12b2lkIDA/aTohMCx1PXR5cGVvZiBvPT0ic3RyaW5nIj97bWVzc2FnZTpvfTpvO3MuYWRkSXNzdWUoe2NvZGU6ImN1c3RvbSIsLi4udSxmYXRhbDpjfSl9fSk6Y2UuY3JlYXRlKCl9Y29uc3QgVHI9e29iamVjdDpULmxhenljcmVhdGV9O3ZhciB5OyhmdW5jdGlvbihyKXtyLlpvZFN0cmluZz0iWm9kU3RyaW5nIixyLlpvZE51bWJlcj0iWm9kTnVtYmVyIixyLlpvZE5hTj0iWm9kTmFOIixyLlpvZEJpZ0ludD0iWm9kQmlnSW50IixyLlpvZEJvb2xlYW49IlpvZEJvb2xlYW4iLHIuWm9kRGF0ZT0iWm9kRGF0ZSIsci5ab2RTeW1ib2w9IlpvZFN5bWJvbCIsci5ab2RVbmRlZmluZWQ9IlpvZFVuZGVmaW5lZCIsci5ab2ROdWxsPSJab2ROdWxsIixyLlpvZEFueT0iWm9kQW55IixyLlpvZFVua25vd249IlpvZFVua25vd24iLHIuWm9kTmV2ZXI9IlpvZE5ldmVyIixyLlpvZFZvaWQ9IlpvZFZvaWQiLHIuWm9kQXJyYXk9IlpvZEFycmF5IixyLlpvZE9iamVjdD0iWm9kT2JqZWN0IixyLlpvZFVuaW9uPSJab2RVbmlvbiIsci5ab2REaXNjcmltaW5hdGVkVW5pb249IlpvZERpc2NyaW1pbmF0ZWRVbmlvbiIsci5ab2RJbnRlcnNlY3Rpb249IlpvZEludGVyc2VjdGlvbiIsci5ab2RUdXBsZT0iWm9kVHVwbGUiLHIuWm9kUmVjb3JkPSJab2RSZWNvcmQiLHIuWm9kTWFwPSJab2RNYXAiLHIuWm9kU2V0PSJab2RTZXQiLHIuWm9kRnVuY3Rpb249IlpvZEZ1bmN0aW9uIixyLlpvZExhenk9IlpvZExhenkiLHIuWm9kTGl0ZXJhbD0iWm9kTGl0ZXJhbCIsci5ab2RFbnVtPSJab2RFbnVtIixyLlpvZEVmZmVjdHM9IlpvZEVmZmVjdHMiLHIuWm9kTmF0aXZlRW51bT0iWm9kTmF0aXZlRW51bSIsci5ab2RPcHRpb25hbD0iWm9kT3B0aW9uYWwiLHIuWm9kTnVsbGFibGU9IlpvZE51bGxhYmxlIixyLlpvZERlZmF1bHQ9IlpvZERlZmF1bHQiLHIuWm9kQ2F0Y2g9IlpvZENhdGNoIixyLlpvZFByb21pc2U9IlpvZFByb21pc2UiLHIuWm9kQnJhbmRlZD0iWm9kQnJhbmRlZCIsci5ab2RQaXBlbGluZT0iWm9kUGlwZWxpbmUiLHIuWm9kUmVhZG9ubHk9IlpvZFJlYWRvbmx5In0pKHl8fCh5PXt9KSk7Y29uc3QgJHI9KHIsZT17bWVzc2FnZTpgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7ci5uYW1lfWB9KT0+JHQodD0+dCBpbnN0YW5jZW9mIHIsZSksTXQ9RS5jcmVhdGUsRHQ9SC5jcmVhdGUsTXI9SGUuY3JlYXRlLERyPXEuY3JlYXRlLE90PVNlLmNyZWF0ZSxPcj1LLmNyZWF0ZSxOcj16ZS5jcmVhdGUsQXI9VGUuY3JlYXRlLEVyPSRlLmNyZWF0ZSxScj1jZS5jcmVhdGUsQ3I9US5jcmVhdGUsWnI9TC5jcmVhdGUsSXI9VWUuY3JlYXRlLGpyPVIuY3JlYXRlLFlyPVQuY3JlYXRlLFdyPVQuc3RyaWN0Q3JlYXRlLFByPU1lLmNyZWF0ZSxWcj1GZS5jcmVhdGUsTHI9RGUuY3JlYXRlLHpyPVcuY3JlYXRlLFVyPU9lLmNyZWF0ZSxGcj1CZS5jcmVhdGUsQnI9WC5jcmVhdGUsSHI9ZGUuY3JlYXRlLHFyPU5lLmNyZWF0ZSxHcj1BZS5jcmVhdGUsSnI9Ry5jcmVhdGUsS3I9RWUuY3JlYXRlLFFyPWxlLmNyZWF0ZSxOdD1DLmNyZWF0ZSxYcj1QLmNyZWF0ZSxlbj1KLmNyZWF0ZSx0bj1DLmNyZWF0ZVdpdGhQcmVwcm9jZXNzLHJuPVplLmNyZWF0ZTt2YXIgbT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0RXJyb3JNYXA6aWUsc2V0RXJyb3JNYXA6b3IsZ2V0RXJyb3JNYXA6UGUsbWFrZUlzc3VlOlZlLEVNUFRZX1BBVEg6Y3IsYWRkSXNzdWVUb0NvbnRleHQ6aCxQYXJzZVN0YXR1czpELElOVkFMSUQ6ZyxESVJUWTpvZSxPSzpPLGlzQWJvcnRlZDpudCxpc0RpcnR5OnN0LGlzVmFsaWQ6eGUsaXNBc3luYzprZSxnZXQgdXRpbCgpe3JldHVybiB4fSxnZXQgb2JqZWN0VXRpbCgpe3JldHVybiBydH0sWm9kUGFyc2VkVHlwZTpmLGdldFBhcnNlZFR5cGU6Qixab2RUeXBlOl8sZGF0ZXRpbWVSZWdleDpTdCxab2RTdHJpbmc6RSxab2ROdW1iZXI6SCxab2RCaWdJbnQ6cSxab2RCb29sZWFuOlNlLFpvZERhdGU6Syxab2RTeW1ib2w6emUsWm9kVW5kZWZpbmVkOlRlLFpvZE51bGw6JGUsWm9kQW55OmNlLFpvZFVua25vd246USxab2ROZXZlcjpMLFpvZFZvaWQ6VWUsWm9kQXJyYXk6Uixab2RPYmplY3Q6VCxab2RVbmlvbjpNZSxab2REaXNjcmltaW5hdGVkVW5pb246RmUsWm9kSW50ZXJzZWN0aW9uOkRlLFpvZFR1cGxlOlcsWm9kUmVjb3JkOk9lLFpvZE1hcDpCZSxab2RTZXQ6WCxab2RGdW5jdGlvbjpkZSxab2RMYXp5Ok5lLFpvZExpdGVyYWw6QWUsWm9kRW51bTpHLFpvZE5hdGl2ZUVudW06RWUsWm9kUHJvbWlzZTpsZSxab2RFZmZlY3RzOkMsWm9kVHJhbnNmb3JtZXI6Qyxab2RPcHRpb25hbDpQLFpvZE51bGxhYmxlOkosWm9kRGVmYXVsdDpSZSxab2RDYXRjaDpDZSxab2ROYU46SGUsQlJBTkQ6U3IsWm9kQnJhbmRlZDpvdCxab2RQaXBlbGluZTpaZSxab2RSZWFkb25seTpJZSxjdXN0b206JHQsU2NoZW1hOl8sWm9kU2NoZW1hOl8sbGF0ZTpUcixnZXQgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKCl7cmV0dXJuIHl9LGNvZXJjZTp7c3RyaW5nOnI9PkUuY3JlYXRlKHsuLi5yLGNvZXJjZTohMH0pLG51bWJlcjpyPT5ILmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KSxib29sZWFuOnI9PlNlLmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KSxiaWdpbnQ6cj0+cS5jcmVhdGUoey4uLnIsY29lcmNlOiEwfSksZGF0ZTpyPT5LLmNyZWF0ZSh7Li4ucixjb2VyY2U6ITB9KX0sYW55OlJyLGFycmF5OmpyLGJpZ2ludDpEcixib29sZWFuOk90LGRhdGU6T3IsZGlzY3JpbWluYXRlZFVuaW9uOlZyLGVmZmVjdDpOdCxlbnVtOkpyLGZ1bmN0aW9uOkhyLGluc3RhbmNlb2Y6JHIsaW50ZXJzZWN0aW9uOkxyLGxhenk6cXIsbGl0ZXJhbDpHcixtYXA6RnIsbmFuOk1yLG5hdGl2ZUVudW06S3IsbmV2ZXI6WnIsbnVsbDpFcixudWxsYWJsZTplbixudW1iZXI6RHQsb2JqZWN0OllyLG9ib29sZWFuOigpPT5PdCgpLm9wdGlvbmFsKCksb251bWJlcjooKT0+RHQoKS5vcHRpb25hbCgpLG9wdGlvbmFsOlhyLG9zdHJpbmc6KCk9Pk10KCkub3B0aW9uYWwoKSxwaXBlbGluZTpybixwcmVwcm9jZXNzOnRuLHByb21pc2U6UXIscmVjb3JkOlVyLHNldDpCcixzdHJpY3RPYmplY3Q6V3Isc3RyaW5nOk10LHN5bWJvbDpOcix0cmFuc2Zvcm1lcjpOdCx0dXBsZTp6cix1bmRlZmluZWQ6QXIsdW5pb246UHIsdW5rbm93bjpDcix2b2lkOklyLE5FVkVSOmcsWm9kSXNzdWVDb2RlOmQscXVvdGVsZXNzSnNvbjppcixab2RFcnJvcjpBfSk7bS5vYmplY3Qoe251Y2xlb3RpZGVTZXF1ZW5jZXM6bS5hcnJheShtLm9iamVjdCh7bmFtZTptLnN0cmluZygpLHNlcXVlbmNlOm0uc3RyaW5nKCl9KSksZ2VuZXM6bS5hcnJheShtLm9iamVjdCh7bmFtZTptLnN0cmluZygpLHNlcXVlbmNlOm0uc3RyaW5nKCl9KSl9KTtjb25zdCBubj1tLmVudW0oWyJhc2NlbmRpbmciLCJkZXNjZW5kaW5nIl0pLHNuPW0ub2JqZWN0KHtmaWVsZDptLnN0cmluZygpLHR5cGU6bm59KTttLm9iamVjdCh7bGltaXQ6bS5udW1iZXIoKS5vcHRpb25hbCgpLG9mZnNldDptLm51bWJlcigpLm9wdGlvbmFsKCksZmllbGRzOm0uYXJyYXkobS5zdHJpbmcoKSkub3B0aW9uYWwoKSxvcmRlckJ5Om0uYXJyYXkoc24pLm9wdGlvbmFsKCl9KS5jYXRjaGFsbChtLnVuaW9uKFttLmJvb2xlYW4oKSxtLnVuZGVmaW5lZCgpLG0uc3RyaW5nKCksbS5udW1iZXIoKSxtLm51bGwoKSxtLmFycmF5KG0uc3RyaW5nKCkpXSkpLmV4dGVuZCh7bWluUHJvcG9ydGlvbjptLm51bWJlcigpLm9wdGlvbmFsKCl9KTtjb25zdCBhbj1tLm9iamVjdCh7bXV0YXRpb246bS5zdHJpbmcoKSxwcm9wb3J0aW9uOm0ubnVtYmVyKCksY291bnQ6bS5udW1iZXIoKSxzZXF1ZW5jZU5hbWU6bS51bmlvbihbbS5zdHJpbmcoKSxtLm51bGwoKV0pLG11dGF0aW9uRnJvbTptLnN0cmluZygpLG11dGF0aW9uVG86bS5zdHJpbmcoKSxwb3NpdGlvbjptLm51bWJlcigpfSksb249Y3QobS5hcnJheShhbikpLGNuPW0ub2JqZWN0KHtpbnNlcnRpb246bS5zdHJpbmcoKSxjb3VudDptLm51bWJlcigpLGluc2VydGVkU3ltYm9sczptLnN0cmluZygpLHBvc2l0aW9uOm0ubnVtYmVyKCksc2VxdWVuY2VOYW1lOm0udW5pb24oW20uc3RyaW5nKCksbS5udWxsKCldKX0pO2N0KG0uYXJyYXkoY24pKTtjb25zdCB1bj1tLm9iamVjdCh7Y291bnQ6bS5udW1iZXIoKX0pLmNhdGNoYWxsKG0udW5pb24oW20uc3RyaW5nKCksbS5udW1iZXIoKSxtLm51bGwoKV0pKSxkbj1jdChtLmFycmF5KHVuKSk7ZnVuY3Rpb24gY3Qocil7cmV0dXJuIG0ub2JqZWN0KHtkYXRhOnJ9KX1jb25zdCBBdD1tLm9iamVjdCh7dGl0bGU6bS5zdHJpbmcoKS5vcHRpb25hbCgpLHN0YXR1czptLm51bWJlcigpLGRldGFpbDptLnN0cmluZygpLm9wdGlvbmFsKCksdHlwZTptLnN0cmluZygpLGluc3RhbmNlOm0uc3RyaW5nKCkub3B0aW9uYWwoKX0pLGxuPW0ub2JqZWN0KHtlcnJvcjpBdH0pO2NsYXNzIHV0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUpLHRoaXMuc3RhdHVzPXQsdGhpcy5yZXF1ZXN0ZWREYXRhPW4sdGhpcy5uYW1lPSJVbmtub3duTGFwaXNFcnJvciJ9fWNsYXNzIEV0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LG4scyl7c3VwZXIoZSksdGhpcy5zdGF0dXM9dCx0aGlzLnByb2JsZW1EZXRhaWw9bix0aGlzLnJlcXVlc3RlZERhdGE9cyx0aGlzLm5hbWU9IkxhcGlzRXJyb3IifX1hc3luYyBmdW5jdGlvbiBobihyLGUsdCl7Y29uc3Qgbj1hd2FpdCBSdChwbihyKSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZSksc2lnbmFsOnR9LCJhZ2dyZWdhdGVkIGRhdGEiKTtyZXR1cm4gZG4ucGFyc2UoYXdhaXQgbi5qc29uKCkpfWFzeW5jIGZ1bmN0aW9uIGZuKHIsZSx0LG4pe2NvbnN0IHM9YXdhaXQgUnQoeW4ocix0KSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoZSksc2lnbmFsOm59LGAke3R9IG11dGF0aW9uc2ApO3JldHVybiBvbi5wYXJzZShhd2FpdCBzLmpzb24oKSl9YXN5bmMgZnVuY3Rpb24gUnQocixlLHQpe3RyeXtjb25zdCBuPWF3YWl0IGZldGNoKHIsZSk7cmV0dXJuIGF3YWl0IG1uKG4sdCksbn1jYXRjaChuKXtjb25zdCBzPW4gaW5zdGFuY2VvZiBFcnJvcj9uLm1lc3NhZ2U6YCR7bn1gO3Rocm93IG5ldyB1dChgRmFpbGVkIHRvIGNvbm5lY3QgdG8gTEFQSVM6ICR7c31gLDUwMCx0KX19Y29uc3QgbW49YXN5bmMocixlKT0+e2lmKCFyLm9rKXtpZihyLnN0YXR1cz49NDAwJiZyLnN0YXR1czw1MDApe2NvbnN0IHQ9YXdhaXQgci5qc29uKCksbj1sbi5zYWZlUGFyc2UodCk7aWYobi5zdWNjZXNzKXRocm93IG5ldyBFdChyLnN0YXR1c1RleHQrbi5kYXRhLmVycm9yLmRldGFpbCxyLnN0YXR1cyxuLmRhdGEuZXJyb3IsZSk7Y29uc3Qgcz1BdC5zYWZlUGFyc2UodCk7dGhyb3cgcy5zdWNjZXNzP25ldyBFdChyLnN0YXR1c1RleHQrcy5kYXRhLmRldGFpbCxyLnN0YXR1cyxzLmRhdGEsZSk6bmV3IHV0KGAke3Iuc3RhdHVzVGV4dH06ICR7SlNPTi5zdHJpbmdpZnkodCl9YCxyLnN0YXR1cyxlKX10aHJvdyBuZXcgdXQoYCR7ci5zdGF0dXNUZXh0fTogJHtyLnN0YXR1c31gLHIuc3RhdHVzLGUpfX0scG49cj0+YCR7cn0vc2FtcGxlL2FnZ3JlZ2F0ZWRgLHluPShyLGUpPT5lPT09ImFtaW5vIGFjaWQiP2Ake3J9L3NhbXBsZS9hbWlub0FjaWRNdXRhdGlvbnNgOmAke3J9L3NhbXBsZS9udWNsZW90aWRlTXV0YXRpb25zYDtjbGFzcyBDdHtjb25zdHJ1Y3RvcihlLHQ9W10pe3RoaXMuZmlsdGVyPWUsdGhpcy5maWVsZHM9dH1hc3luYyBldmFsdWF0ZShlLHQpe2NvbnN0IG49KGF3YWl0IGhuKGUsey4uLnRoaXMuZmlsdGVyLGZpZWxkczp0aGlzLmZpZWxkc30sdCkpLmRhdGE7aWYoZ24obikpcmV0dXJue2NvbnRlbnQ6bn07dGhyb3cgbmV3IEVycm9yKCJBZ2dyZWdhdGVkIHJlc3BvbnNlIGRvZXMgbm90IGhhdmUgY291bnQiKX19ZnVuY3Rpb24gZ24ocil7cmV0dXJuIHIuZXZlcnkoZT0+dHlwZW9mIGU9PSJvYmplY3QiJiYiY291bnQiaW4gZSYmdHlwZW9mIGUuY291bnQ9PSJudW1iZXIiKX1jbGFzcyB2bntjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5jaGlsZD1lLHRoaXMuZmllbGQ9dCx0aGlzLmFnZ3JlZ2F0ZT1ufWFzeW5jIGV2YWx1YXRlKGUsdCl7Y29uc3Qgbj1hd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkscz1uZXcgTWFwO2Zvcihjb25zdCBpIG9mIG4uY29udGVudCl7Y29uc3Qgbz1pW3RoaXMuZmllbGRdO3MuaGFzKG8pfHxzLnNldChvLFtdKSxzLmdldChvKS5wdXNoKGkpfWNvbnN0IGE9bmV3IEFycmF5O2Zvcihjb25zdFssaV1vZiBzKWEucHVzaCh0aGlzLmFnZ3JlZ2F0ZShpKSk7cmV0dXJue2NvbnRlbnQ6YX19fWNsYXNzIF9uIGV4dGVuZHMgdm57Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUsdCxzPT57bGV0IGE9MDtmb3IoY29uc3QgaSBvZiBzKWErPWlbbl07cmV0dXJue1t0XTpzWzBdW3RdLFtuXTphfX0pfX1jbGFzcyBkdHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY2hpbGQ9ZSx0aGlzLmZ1bmM9dH1hc3luYyBldmFsdWF0ZShlLHQpe3JldHVybntjb250ZW50Oihhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkpLmNvbnRlbnQubWFwKHRoaXMuZnVuYyl9fX1jbGFzcyB4biBleHRlbmRzIGR0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLHM9Pih7Li4ucyxbbl06c1t0XX0pKX19Y2xhc3Mga257Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNoaWxkPWUsdGhpcy5jb21wYXJlRm49dH1hc3luYyBldmFsdWF0ZShlLHQpe3JldHVybntjb250ZW50Oihhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGUsdCkpLmNvbnRlbnQuc29ydCh0aGlzLmNvbXBhcmVGbil9fX12YXIgWnQ9NjAsSXQ9WnQqNjAsanQ9SXQqMjQsYm49anQqNyxoZT0xZTMsbHQ9WnQqaGUsWXQ9SXQqaGUsd249anQqaGUsU249Ym4qaGUsaHQ9Im1pbGxpc2Vjb25kIixmZT0ic2Vjb25kIixtZT0ibWludXRlIixwZT0iaG91ciIsWj0iZGF5IixqZT0id2VlayIsST0ibW9udGgiLFd0PSJxdWFydGVyIixVPSJ5ZWFyIix5ZT0iZGF0ZSIsUHQ9IllZWVktTU0tRERUSEg6bW06c3NaIixWdD0iSW52YWxpZCBEYXRlIixUbj0vXihcZHs0fSlbLS9dPyhcZHsxLDJ9KT9bLS9dPyhcZHswLDJ9KVtUdFxzXSooXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Oj8oXGR7MSwyfSk/Wy46XT8oXGQrKT8kLywkbj0vXFsoW15cXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nLE1uPXtuYW1lOiJlbiIsd2Vla2RheXM6IlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLG1vbnRoczoiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSxvcmRpbmFsOmZ1bmN0aW9uKGUpe3ZhciB0PVsidGgiLCJzdCIsIm5kIiwicmQiXSxuPWUlMTAwO3JldHVybiJbIitlKyh0WyhuLTIwKSUxMF18fHRbbl18fHRbMF0pKyJdIn19LGZ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1TdHJpbmcoZSk7cmV0dXJuIXN8fHMubGVuZ3RoPj10P2U6IiIrQXJyYXkodCsxLXMubGVuZ3RoKS5qb2luKG4pK2V9LERuPWZ1bmN0aW9uKGUpe3ZhciB0PS1lLnV0Y09mZnNldCgpLG49TWF0aC5hYnModCkscz1NYXRoLmZsb29yKG4vNjApLGE9biU2MDtyZXR1cm4odDw9MD8iKyI6Ii0iKStmdChzLDIsIjAiKSsiOiIrZnQoYSwyLCIwIil9LE9uPWZ1bmN0aW9uIHIoZSx0KXtpZihlLmRhdGUoKTx0LmRhdGUoKSlyZXR1cm4tcih0LGUpO3ZhciBuPSh0LnllYXIoKS1lLnllYXIoKSkqMTIrKHQubW9udGgoKS1lLm1vbnRoKCkpLHM9ZS5jbG9uZSgpLmFkZChuLEkpLGE9dC1zPDAsaT1lLmNsb25lKCkuYWRkKG4rKGE/LTE6MSksSSk7cmV0dXJuKygtKG4rKHQtcykvKGE/cy1pOmktcykpfHwwKX0sTm49ZnVuY3Rpb24oZSl7cmV0dXJuIGU8MD9NYXRoLmNlaWwoZSl8fDA6TWF0aC5mbG9vcihlKX0sQW49ZnVuY3Rpb24oZSl7dmFyIHQ9e006SSx5OlUsdzpqZSxkOlosRDp5ZSxoOnBlLG06bWUsczpmZSxtczpodCxROld0fTtyZXR1cm4gdFtlXXx8U3RyaW5nKGV8fCIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywiIil9LEVuPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwfSxSbj17czpmdCx6OkRuLG06T24sYTpObixwOkFuLHU6RW59LFllPSJlbiIsZWU9e307ZWVbWWVdPU1uO3ZhciBMdD0iJGlzRGF5anNPYmplY3QiLG10PWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgR2V8fCEhKGUmJmVbTHRdKX0scWU9ZnVuY3Rpb24gcihlLHQsbil7dmFyIHM7aWYoIWUpcmV0dXJuIFllO2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7dmFyIGE9ZS50b0xvd2VyQ2FzZSgpO2VlW2FdJiYocz1hKSx0JiYoZWVbYV09dCxzPWEpO3ZhciBpPWUuc3BsaXQoIi0iKTtpZighcyYmaS5sZW5ndGg+MSlyZXR1cm4gcihpWzBdKX1lbHNle3ZhciBvPWUubmFtZTtlZVtvXT1lLHM9b31yZXR1cm4hbiYmcyYmKFllPXMpLHN8fCFuJiZZZX0sdz1mdW5jdGlvbihlLHQpe2lmKG10KGUpKXJldHVybiBlLmNsb25lKCk7dmFyIG49dHlwZW9mIHQ9PSJvYmplY3QiP3Q6e307cmV0dXJuIG4uZGF0ZT1lLG4uYXJncz1hcmd1bWVudHMsbmV3IEdlKG4pfSxDbj1mdW5jdGlvbihlLHQpe3JldHVybiB3KGUse2xvY2FsZTp0LiRMLHV0Yzp0LiR1LHg6dC4keCwkb2Zmc2V0OnQuJG9mZnNldH0pfSxiPVJuO2IubD1xZSxiLmk9bXQsYi53PUNuO3ZhciBabj1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGUsbj1lLnV0YztpZih0PT09bnVsbClyZXR1cm4gbmV3IERhdGUoTmFOKTtpZihiLnUodCkpcmV0dXJuIG5ldyBEYXRlO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBuZXcgRGF0ZSh0KTtpZih0eXBlb2YgdD09InN0cmluZyImJiEvWiQvaS50ZXN0KHQpKXt2YXIgcz10Lm1hdGNoKFRuKTtpZihzKXt2YXIgYT1zWzJdLTF8fDAsaT0oc1s3XXx8IjAiKS5zdWJzdHJpbmcoMCwzKTtyZXR1cm4gbj9uZXcgRGF0ZShEYXRlLlVUQyhzWzFdLGEsc1szXXx8MSxzWzRdfHwwLHNbNV18fDAsc1s2XXx8MCxpKSk6bmV3IERhdGUoc1sxXSxhLHNbM118fDEsc1s0XXx8MCxzWzVdfHwwLHNbNl18fDAsaSl9fXJldHVybiBuZXcgRGF0ZSh0KX0sR2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKHQpe3RoaXMuJEw9cWUodC5sb2NhbGUsbnVsbCwhMCksdGhpcy5wYXJzZSh0KSx0aGlzLiR4PXRoaXMuJHh8fHQueHx8e30sdGhpc1tMdF09ITB9dmFyIGU9ci5wcm90b3R5cGU7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dGhpcy4kZD1abihuKSx0aGlzLmluaXQoKX0sZS5pbml0PWZ1bmN0aW9uKCl7dmFyIG49dGhpcy4kZDt0aGlzLiR5PW4uZ2V0RnVsbFllYXIoKSx0aGlzLiRNPW4uZ2V0TW9udGgoKSx0aGlzLiREPW4uZ2V0RGF0ZSgpLHRoaXMuJFc9bi5nZXREYXkoKSx0aGlzLiRIPW4uZ2V0SG91cnMoKSx0aGlzLiRtPW4uZ2V0TWludXRlcygpLHRoaXMuJHM9bi5nZXRTZWNvbmRzKCksdGhpcy4kbXM9bi5nZXRNaWxsaXNlY29uZHMoKX0sZS4kdXRpbHM9ZnVuY3Rpb24oKXtyZXR1cm4gYn0sZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9TdHJpbmcoKSE9PVZ0fSxlLmlzU2FtZT1mdW5jdGlvbihuLHMpe3ZhciBhPXcobik7cmV0dXJuIHRoaXMuc3RhcnRPZihzKTw9YSYmYTw9dGhpcy5lbmRPZihzKX0sZS5pc0FmdGVyPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHcobik8dGhpcy5zdGFydE9mKHMpfSxlLmlzQmVmb3JlPWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuZW5kT2Yocyk8dyhuKX0sZS4kZz1mdW5jdGlvbihuLHMsYSl7cmV0dXJuIGIudShuKT90aGlzW3NdOnRoaXMuc2V0KGEsbil9LGUudW5peD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpLzFlMyl9LGUudmFsdWVPZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLmdldFRpbWUoKX0sZS5zdGFydE9mPWZ1bmN0aW9uKG4scyl7dmFyIGE9dGhpcyxpPWIudShzKT8hMDpzLG89Yi5wKG4pLGM9ZnVuY3Rpb24odmUsail7dmFyIE49Yi53KGEuJHU/RGF0ZS5VVEMoYS4keSxqLHZlKTpuZXcgRGF0ZShhLiR5LGosdmUpLGEpO3JldHVybiBpP046Ti5lbmRPZihaKX0sdT1mdW5jdGlvbih2ZSxqKXt2YXIgTj1bMCwwLDAsMF0sX2U9WzIzLDU5LDU5LDk5OV07cmV0dXJuIGIudyhhLnRvRGF0ZSgpW3ZlXS5hcHBseShhLnRvRGF0ZSgicyIpLChpP046X2UpLnNsaWNlKGopKSxhKX0sbD10aGlzLiRXLGs9dGhpcy4kTSxTPXRoaXMuJEQsTT0ic2V0IisodGhpcy4kdT8iVVRDIjoiIik7c3dpdGNoKG8pe2Nhc2UgVTpyZXR1cm4gaT9jKDEsMCk6YygzMSwxMSk7Y2FzZSBJOnJldHVybiBpP2MoMSxrKTpjKDAsaysxKTtjYXNlIGplOnt2YXIgRj10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsYWU9KGw8Rj9sKzc6bCktRjtyZXR1cm4gYyhpP1MtYWU6UysoNi1hZSksayl9Y2FzZSBaOmNhc2UgeWU6cmV0dXJuIHUoTSsiSG91cnMiLDApO2Nhc2UgcGU6cmV0dXJuIHUoTSsiTWludXRlcyIsMSk7Y2FzZSBtZTpyZXR1cm4gdShNKyJTZWNvbmRzIiwyKTtjYXNlIGZlOnJldHVybiB1KE0rIk1pbGxpc2Vjb25kcyIsMyk7ZGVmYXVsdDpyZXR1cm4gdGhpcy5jbG9uZSgpfX0sZS5lbmRPZj1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5zdGFydE9mKG4sITEpfSxlLiRzZXQ9ZnVuY3Rpb24obixzKXt2YXIgYSxpPWIucChuKSxvPSJzZXQiKyh0aGlzLiR1PyJVVEMiOiIiKSxjPShhPXt9LGFbWl09bysiRGF0ZSIsYVt5ZV09bysiRGF0ZSIsYVtJXT1vKyJNb250aCIsYVtVXT1vKyJGdWxsWWVhciIsYVtwZV09bysiSG91cnMiLGFbbWVdPW8rIk1pbnV0ZXMiLGFbZmVdPW8rIlNlY29uZHMiLGFbaHRdPW8rIk1pbGxpc2Vjb25kcyIsYSlbaV0sdT1pPT09Wj90aGlzLiREKyhzLXRoaXMuJFcpOnM7aWYoaT09PUl8fGk9PT1VKXt2YXIgbD10aGlzLmNsb25lKCkuc2V0KHllLDEpO2wuJGRbY10odSksbC5pbml0KCksdGhpcy4kZD1sLnNldCh5ZSxNYXRoLm1pbih0aGlzLiRELGwuZGF5c0luTW9udGgoKSkpLiRkfWVsc2UgYyYmdGhpcy4kZFtjXSh1KTtyZXR1cm4gdGhpcy5pbml0KCksdGhpc30sZS5zZXQ9ZnVuY3Rpb24obixzKXtyZXR1cm4gdGhpcy5jbG9uZSgpLiRzZXQobixzKX0sZS5nZXQ9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXNbYi5wKG4pXSgpfSxlLmFkZD1mdW5jdGlvbihuLHMpe3ZhciBhPXRoaXMsaTtuPU51bWJlcihuKTt2YXIgbz1iLnAocyksYz1mdW5jdGlvbihTKXt2YXIgTT13KGEpO3JldHVybiBiLncoTS5kYXRlKE0uZGF0ZSgpK01hdGgucm91bmQoUypuKSksYSl9O2lmKG89PT1JKXJldHVybiB0aGlzLnNldChJLHRoaXMuJE0rbik7aWYobz09PVUpcmV0dXJuIHRoaXMuc2V0KFUsdGhpcy4keStuKTtpZihvPT09WilyZXR1cm4gYygxKTtpZihvPT09amUpcmV0dXJuIGMoNyk7dmFyIHU9KGk9e30saVttZV09bHQsaVtwZV09WXQsaVtmZV09aGUsaSlbb118fDEsbD10aGlzLiRkLmdldFRpbWUoKStuKnU7cmV0dXJuIGIudyhsLHRoaXMpfSxlLnN1YnRyYWN0PWZ1bmN0aW9uKG4scyl7cmV0dXJuIHRoaXMuYWRkKG4qLTEscyl9LGUuZm9ybWF0PWZ1bmN0aW9uKG4pe3ZhciBzPXRoaXMsYT10aGlzLiRsb2NhbGUoKTtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIGEuaW52YWxpZERhdGV8fFZ0O3ZhciBpPW58fFB0LG89Yi56KHRoaXMpLGM9dGhpcy4kSCx1PXRoaXMuJG0sbD10aGlzLiRNLGs9YS53ZWVrZGF5cyxTPWEubW9udGhzLE09YS5tZXJpZGllbSxGPWZ1bmN0aW9uKE4sX2UsdHQsZ3Mpe3JldHVybiBOJiYoTltfZV18fE4ocyxpKSl8fHR0W19lXS5zbGljZSgwLGdzKX0sYWU9ZnVuY3Rpb24oTil7cmV0dXJuIGIucyhjJTEyfHwxMixOLCIwIil9LGV0PU18fGZ1bmN0aW9uKGosTixfZSl7dmFyIHR0PWo8MTI/IkFNIjoiUE0iO3JldHVybiBfZT90dC50b0xvd2VyQ2FzZSgpOnR0fSx2ZT1mdW5jdGlvbihOKXtzd2l0Y2goTil7Y2FzZSJZWSI6cmV0dXJuIFN0cmluZyhzLiR5KS5zbGljZSgtMik7Y2FzZSJZWVlZIjpyZXR1cm4gYi5zKHMuJHksNCwiMCIpO2Nhc2UiTSI6cmV0dXJuIGwrMTtjYXNlIk1NIjpyZXR1cm4gYi5zKGwrMSwyLCIwIik7Y2FzZSJNTU0iOnJldHVybiBGKGEubW9udGhzU2hvcnQsbCxTLDMpO2Nhc2UiTU1NTSI6cmV0dXJuIEYoUyxsKTtjYXNlIkQiOnJldHVybiBzLiREO2Nhc2UiREQiOnJldHVybiBiLnMocy4kRCwyLCIwIik7Y2FzZSJkIjpyZXR1cm4gU3RyaW5nKHMuJFcpO2Nhc2UiZGQiOnJldHVybiBGKGEud2Vla2RheXNNaW4scy4kVyxrLDIpO2Nhc2UiZGRkIjpyZXR1cm4gRihhLndlZWtkYXlzU2hvcnQscy4kVyxrLDMpO2Nhc2UiZGRkZCI6cmV0dXJuIGtbcy4kV107Y2FzZSJIIjpyZXR1cm4gU3RyaW5nKGMpO2Nhc2UiSEgiOnJldHVybiBiLnMoYywyLCIwIik7Y2FzZSJoIjpyZXR1cm4gYWUoMSk7Y2FzZSJoaCI6cmV0dXJuIGFlKDIpO2Nhc2UiYSI6cmV0dXJuIGV0KGMsdSwhMCk7Y2FzZSJBIjpyZXR1cm4gZXQoYyx1LCExKTtjYXNlIm0iOnJldHVybiBTdHJpbmcodSk7Y2FzZSJtbSI6cmV0dXJuIGIucyh1LDIsIjAiKTtjYXNlInMiOnJldHVybiBTdHJpbmcocy4kcyk7Y2FzZSJzcyI6cmV0dXJuIGIucyhzLiRzLDIsIjAiKTtjYXNlIlNTUyI6cmV0dXJuIGIucyhzLiRtcywzLCIwIik7Y2FzZSJaIjpyZXR1cm4gb31yZXR1cm4gbnVsbH07cmV0dXJuIGkucmVwbGFjZSgkbixmdW5jdGlvbihqLE4pe3JldHVybiBOfHx2ZShqKXx8by5yZXBsYWNlKCI6IiwiIil9KX0sZS51dGNPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpKjE1fSxlLmRpZmY9ZnVuY3Rpb24obixzLGEpe3ZhciBpPXRoaXMsbz1iLnAocyksYz13KG4pLHU9KGMudXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSkqbHQsbD10aGlzLWMsaz1mdW5jdGlvbigpe3JldHVybiBiLm0oaSxjKX0sUztzd2l0Y2gobyl7Y2FzZSBVOlM9aygpLzEyO2JyZWFrO2Nhc2UgSTpTPWsoKTticmVhaztjYXNlIFd0OlM9aygpLzM7YnJlYWs7Y2FzZSBqZTpTPShsLXUpL1NuO2JyZWFrO2Nhc2UgWjpTPShsLXUpL3duO2JyZWFrO2Nhc2UgcGU6Uz1sL1l0O2JyZWFrO2Nhc2UgbWU6Uz1sL2x0O2JyZWFrO2Nhc2UgZmU6Uz1sL2hlO2JyZWFrO2RlZmF1bHQ6Uz1sO2JyZWFrfXJldHVybiBhP1M6Yi5hKFMpfSxlLmRheXNJbk1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kT2YoSSkuJER9LGUuJGxvY2FsZT1mdW5jdGlvbigpe3JldHVybiBlZVt0aGlzLiRMXX0sZS5sb2NhbGU9ZnVuY3Rpb24obixzKXtpZighbilyZXR1cm4gdGhpcy4kTDt2YXIgYT10aGlzLmNsb25lKCksaT1xZShuLHMsITApO3JldHVybiBpJiYoYS4kTD1pKSxhfSxlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGIudyh0aGlzLiRkLHRoaXMpfSxlLnRvRGF0ZT1mdW5jdGlvbigpe3JldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSl9LGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpP3RoaXMudG9JU09TdHJpbmcoKTpudWxsfSxlLnRvSVNPU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGQudG9JU09TdHJpbmcoKX0sZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLnRvVVRDU3RyaW5nKCl9LHJ9KCksenQ9R2UucHJvdG90eXBlO3cucHJvdG90eXBlPXp0LFtbIiRtcyIsaHRdLFsiJHMiLGZlXSxbIiRtIixtZV0sWyIkSCIscGVdLFsiJFciLFpdLFsiJE0iLEldLFsiJHkiLFVdLFsiJEQiLHllXV0uZm9yRWFjaChmdW5jdGlvbihyKXt6dFtyWzFdXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kZyhlLHJbMF0sclsxXSl9fSksdy5leHRlbmQ9ZnVuY3Rpb24ocixlKXtyZXR1cm4gci4kaXx8KHIoZSxHZSx3KSxyLiRpPSEwKSx3fSx3LmxvY2FsZT1xZSx3LmlzRGF5anM9bXQsdy51bml4PWZ1bmN0aW9uKHIpe3JldHVybiB3KHIqMWUzKX0sdy5lbj1lZVtZZV0sdy5Mcz1lZSx3LnA9e307dmFyIEluPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9ZS5wcm90b3R5cGUsbj10LmZvcm1hdDt0LmZvcm1hdD1mdW5jdGlvbihzKXt2YXIgYT10aGlzLGk9dGhpcy4kbG9jYWxlKCk7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBuLmJpbmQodGhpcykocyk7dmFyIG89dGhpcy4kdXRpbHMoKSxjPXN8fFB0LHU9Yy5yZXBsYWNlKC9cWyhbXlxdXSspXXxRfHdvfHd3fHd8V1d8V3x6enp8enxnZ2dnfEdHR0d8RG98WHx4fGt7MSwyfXxTL2csZnVuY3Rpb24obCl7c3dpdGNoKGwpe2Nhc2UiUSI6cmV0dXJuIE1hdGguY2VpbCgoYS4kTSsxKS8zKTtjYXNlIkRvIjpyZXR1cm4gaS5vcmRpbmFsKGEuJEQpO2Nhc2UiZ2dnZyI6cmV0dXJuIGEud2Vla1llYXIoKTtjYXNlIkdHR0ciOnJldHVybiBhLmlzb1dlZWtZZWFyKCk7Y2FzZSJ3byI6cmV0dXJuIGkub3JkaW5hbChhLndlZWsoKSwiVyIpO2Nhc2UidyI6Y2FzZSJ3dyI6cmV0dXJuIG8ucyhhLndlZWsoKSxsPT09InciPzE6MiwiMCIpO2Nhc2UiVyI6Y2FzZSJXVyI6cmV0dXJuIG8ucyhhLmlzb1dlZWsoKSxsPT09IlciPzE6MiwiMCIpO2Nhc2UiayI6Y2FzZSJrayI6cmV0dXJuIG8ucyhTdHJpbmcoYS4kSD09PTA/MjQ6YS4kSCksbD09PSJrIj8xOjIsIjAiKTtjYXNlIlgiOnJldHVybiBNYXRoLmZsb29yKGEuJGQuZ2V0VGltZSgpLzFlMyk7Y2FzZSJ4IjpyZXR1cm4gYS4kZC5nZXRUaW1lKCk7Y2FzZSJ6IjpyZXR1cm4iWyIrYS5vZmZzZXROYW1lKCkrIl0iO2Nhc2Uienp6IjpyZXR1cm4iWyIrYS5vZmZzZXROYW1lKCJsb25nIikrIl0iO2RlZmF1bHQ6cmV0dXJuIGx9fSk7cmV0dXJuIG4uYmluZCh0aGlzKSh1KX19LGpuPSJpc293ZWVrIixZbj1mdW5jdGlvbihyLGUsdCl7dmFyIG49ZnVuY3Rpb24oYyx1KXt2YXIgbD0odT90LnV0Yzp0KSgpLnllYXIoYykuc3RhcnRPZihVKSxrPTQtbC5pc29XZWVrZGF5KCk7cmV0dXJuIGwuaXNvV2Vla2RheSgpPjQmJihrKz03KSxsLmFkZChrLFopfSxzPWZ1bmN0aW9uKGMpe3JldHVybiBjLmFkZCg0LWMuaXNvV2Vla2RheSgpLFopfSxhPWUucHJvdG90eXBlO2EuaXNvV2Vla1llYXI9ZnVuY3Rpb24oKXt2YXIgbz1zKHRoaXMpO3JldHVybiBvLnllYXIoKX0sYS5pc29XZWVrPWZ1bmN0aW9uKG8pe2lmKCF0aGlzLiR1dGlscygpLnUobykpcmV0dXJuIHRoaXMuYWRkKChvLXRoaXMuaXNvV2VlaygpKSo3LFopO3ZhciBjPXModGhpcyksdT1uKHRoaXMuaXNvV2Vla1llYXIoKSx0aGlzLiR1KTtyZXR1cm4gYy5kaWZmKHUsamUpKzF9LGEuaXNvV2Vla2RheT1mdW5jdGlvbihvKXtyZXR1cm4gdGhpcy4kdXRpbHMoKS51KG8pP3RoaXMuZGF5KCl8fDc6dGhpcy5kYXkodGhpcy5kYXkoKSU3P286by03KX07dmFyIGk9YS5zdGFydE9mO2Euc3RhcnRPZj1mdW5jdGlvbihvLGMpe3ZhciB1PXRoaXMuJHV0aWxzKCksbD11LnUoYyk/ITA6YyxrPXUucChvKTtyZXR1cm4gaz09PWpuP2w/dGhpcy5kYXRlKHRoaXMuZGF0ZSgpLSh0aGlzLmlzb1dlZWtkYXkoKS0xKSkuc3RhcnRPZigiZGF5Iik6dGhpcy5kYXRlKHRoaXMuZGF0ZSgpLTEtKHRoaXMuaXNvV2Vla2RheSgpLTEpKzcpLmVuZE9mKCJkYXkiKTppLmJpbmQodGhpcykobyxjKX19O3cuZXh0ZW5kKFluKSx3LmV4dGVuZChJbik7Y29uc3QgcHQ9IkdHR0ctW1ddV1ciLFhlPWNsYXNzIFhle2NvbnN0cnVjdG9yKCl7dGhpcy55ZWFyTW9udGhEYXlDYWNoZT1uZXcgTWFwLHRoaXMueWVhcldlZWtDYWNoZT1uZXcgTWFwLHRoaXMueWVhck1vbnRoQ2FjaGU9bmV3IE1hcCx0aGlzLnllYXJDYWNoZT1uZXcgTWFwfWdldFllYXJNb250aERheShlKXtyZXR1cm4gdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5oYXMoZSl8fHRoaXMueWVhck1vbnRoRGF5Q2FjaGUuc2V0KGUsdGUucGFyc2UoZSx0aGlzKSksdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5nZXQoZSl9Z2V0WWVhck1vbnRoKGUpe3JldHVybiB0aGlzLnllYXJNb250aENhY2hlLmhhcyhlKXx8dGhpcy55ZWFyTW9udGhDYWNoZS5zZXQoZSxuZS5wYXJzZShlLHRoaXMpKSx0aGlzLnllYXJNb250aENhY2hlLmdldChlKX1nZXRZZWFyV2VlayhlKXtyZXR1cm4gdGhpcy55ZWFyV2Vla0NhY2hlLmhhcyhlKXx8dGhpcy55ZWFyV2Vla0NhY2hlLnNldChlLHJlLnBhcnNlKGUsdGhpcykpLHRoaXMueWVhcldlZWtDYWNoZS5nZXQoZSl9Z2V0WWVhcihlKXtyZXR1cm4gdGhpcy55ZWFyQ2FjaGUuaGFzKGUpfHx0aGlzLnllYXJDYWNoZS5zZXQoZSxzZS5wYXJzZShlLHRoaXMpKSx0aGlzLnllYXJDYWNoZS5nZXQoZSl9c3RhdGljIGdldEluc3RhbmNlKCl7cmV0dXJuIHRoaXMuaW5zdGFuY2V9fTtYZS5pbnN0YW5jZT1uZXcgWGU7bGV0IHl0PVhlO2NsYXNzIHRle2NvbnN0cnVjdG9yKGUsdCxuLHMpe3RoaXMueWVhck51bWJlcj1lLHRoaXMubW9udGhOdW1iZXI9dCx0aGlzLmRheU51bWJlcj1uLHRoaXMuY2FjaGU9cyx0aGlzLnR5cGU9IlllYXJNb250aERheSIsdGhpcy5kYXRlPW5ldyBEYXRlKHRoaXMueWVhck51bWJlcix0aGlzLm1vbnRoTnVtYmVyLTEsdGhpcy5kYXlOdW1iZXIpLHRoaXMuZGF5anM9dyh0aGlzLmRhdGUpLHRoaXMuZGF0ZVN0cmluZz10aGlzLnRvU3RyaW5nKCl9Z2V0IHRleHQoKXtyZXR1cm4gdGhpcy5kYXlqcy5mb3JtYXQoIllZWVktTU0tREQiKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRleHR9ZW5nbGlzaE5hbWUoKXtyZXR1cm4gdGhpcy5kYXlqcy5mb3JtYXQoImRkZGQsIE1NTU0gRCwgWVlZWSIpfWdldCBmaXJzdERheSgpe3JldHVybiB0aGlzfWdldCBsYXN0RGF5KCl7cmV0dXJuIHRoaXN9Z2V0IHllYXIoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyKGAke3RoaXMueWVhck51bWJlcn1gKX1nZXQgbW9udGgoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgodGhpcy5kYXlqcy5mb3JtYXQoIllZWVktTU0iKSl9Z2V0IHdlZWsoKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyV2Vlayh0aGlzLmRheWpzLmZvcm1hdChwdCkpfWFkZERheXMoZSl7Y29uc3Qgbj10aGlzLmRheWpzLmFkZChlLCJkYXkiKS5mb3JtYXQoIllZWVktTU0tREQiKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZGF5anMuZGlmZihlLmRheWpzLCJkYXkiKX1zdGF0aWMgcGFyc2UoZSx0KXtjb25zdFtuLHMsYV09ZS5zcGxpdCgiLSIpLm1hcChpPT5wYXJzZUludChpLDEwKSk7cmV0dXJuIG5ldyB0ZShuLHMsYSx0KX19Y2xhc3MgcmV7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuaXNvWWVhck51bWJlcj1lLHRoaXMuaXNvV2Vla051bWJlcj10LHRoaXMuY2FjaGU9bix0aGlzLnR5cGU9IlllYXJXZWVrIix0aGlzLmRhdGVTdHJpbmc9dGhpcy50b1N0cmluZygpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZm9ybWF0KHB0KX10b1N0cmluZygpe3JldHVybiB0aGlzLnRleHR9ZW5nbGlzaE5hbWUoKXtyZXR1cm5gV2VlayAke3RoaXMuaXNvV2Vla051bWJlcn0sICR7dGhpcy5pc29ZZWFyTnVtYmVyfWB9Z2V0IGZpcnN0RGF5KCl7Y29uc3QgZT13KCkueWVhcih0aGlzLmlzb1llYXJOdW1iZXIpLm1vbnRoKDEpLmRhdGUoNCkuaXNvV2Vlayh0aGlzLmlzb1dlZWtOdW1iZXIpLnN0YXJ0T2YoImlzb1dlZWsiKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkoZS5mb3JtYXQoIllZWVktTU0tREQiKSl9Z2V0IGxhc3REYXkoKXtjb25zdCB0PXcoKS55ZWFyKHRoaXMuaXNvWWVhck51bWJlcikuc3RhcnRPZigieWVhciIpLmFkZCgodGhpcy5pc29XZWVrTnVtYmVyLTEpKjcsImRheSIpLnN0YXJ0T2YoIndlZWsiKS5hZGQoMSwiZGF5IikuYWRkKDYsImRheSIpO3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aERheSh0LmZvcm1hdCgiWVlZWS1NTS1ERCIpKX1nZXQgeWVhcigpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXIoYCR7dGhpcy5pc29ZZWFyTnVtYmVyfWApfWFkZFdlZWtzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwid2VlayIpLmZvcm1hdChwdCk7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcldlZWsobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJ3ZWVrIil9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3RbbixzXT1lLnNwbGl0KCItVyIpLm1hcChhPT5wYXJzZUludChhLDEwKSk7cmV0dXJuIG5ldyByZShuLHMsdCl9fWNsYXNzIG5le2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnllYXJOdW1iZXI9ZSx0aGlzLm1vbnRoTnVtYmVyPXQsdGhpcy5jYWNoZT1uLHRoaXMudHlwZT0iWWVhck1vbnRoIix0aGlzLmRhdGVTdHJpbmc9dGhpcy50b1N0cmluZygpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZm9ybWF0KCJZWVlZLU1NIil9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy50ZXh0fWVuZ2xpc2hOYW1lKCl7cmV0dXJuYCR7V24odGhpcy5tb250aE51bWJlcil9ICR7dGhpcy55ZWFyTnVtYmVyfWB9Z2V0IGZpcnN0RGF5KCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KHcoYCR7dGhpcy55ZWFyTnVtYmVyfS0ke3RoaXMubW9udGhOdW1iZXJ9LTAxYCkuZm9ybWF0KCJZWVlZLU1NLUREIikpfWdldCBsYXN0RGF5KCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KHcoYCR7dGhpcy55ZWFyTnVtYmVyfS0ke3RoaXMubW9udGhOdW1iZXJ9LTAxYCkuZW5kT2YoIm1vbnRoIikuZm9ybWF0KCJZWVlZLU1NLUREIikpfWdldCB5ZWFyKCl7cmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLnllYXJOdW1iZXJ9YCl9YWRkTW9udGhzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwibW9udGgiKS5mb3JtYXQoIllZWVktTU0iKTtyZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJtb250aCIpfXN0YXRpYyBwYXJzZShlLHQpe2NvbnN0W24sc109ZS5zcGxpdCgiLSIpLm1hcChhPT5wYXJzZUludChhLDEwKSk7cmV0dXJuIG5ldyBuZShuLHMsdCl9fWNsYXNzIHNle2NvbnN0cnVjdG9yKGUsdCl7dGhpcy55ZWFyPWUsdGhpcy5jYWNoZT10LHRoaXMudHlwZT0iWWVhciIsdGhpcy5kYXRlU3RyaW5nPXRoaXMudG9TdHJpbmcoKX1nZXQgdGV4dCgpe3JldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmZvcm1hdCgiWVlZWSIpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudGV4dH1lbmdsaXNoTmFtZSgpe3JldHVybiB0aGlzLnllYXIudG9TdHJpbmcoKX1nZXQgZmlyc3RNb250aCgpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChgJHt0aGlzLnllYXJ9LTAxYCl9Z2V0IGxhc3RNb250aCgpe3JldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChgJHt0aGlzLnllYXJ9LTEyYCl9Z2V0IGZpcnN0RGF5KCl7cmV0dXJuIHRoaXMuZmlyc3RNb250aC5maXJzdERheX1nZXQgbGFzdERheSgpe3JldHVybiB0aGlzLmxhc3RNb250aC5sYXN0RGF5fWFkZFllYXJzKGUpe2NvbnN0IG49dGhpcy5maXJzdERheS5kYXlqcy5hZGQoZSwieWVhciIpLmZvcm1hdCgiWVlZWSIpO3JldHVybiB0aGlzLmNhY2hlLmdldFllYXIobil9bWludXMoZSl7cmV0dXJuIHRoaXMuZmlyc3REYXkuZGF5anMuZGlmZihlLmZpcnN0RGF5LmRheWpzLCJ5ZWFyIil9c3RhdGljIHBhcnNlKGUsdCl7Y29uc3Qgbj1wYXJzZUludChlLDEwKTtyZXR1cm4gbmV3IHNlKG4sdCl9fWZ1bmN0aW9uIFduKHIpe3JldHVybiB3KCkubW9udGgoci0xKS5mb3JtYXQoIk1NTU0iKX1mdW5jdGlvbiBVdChyKXtzd2l0Y2goci50eXBlKXtjYXNlIlllYXJNb250aERheSI6cmV0dXJue3R5cGU6IlllYXJNb250aERheSIseWVhck51bWJlcjpyLnllYXJOdW1iZXIsbW9udGhOdW1iZXI6ci5tb250aE51bWJlcixkYXlOdW1iZXI6ci5kYXlOdW1iZXIsZGF0ZVN0cmluZzpyLmRhdGVTdHJpbmd9O2Nhc2UiWWVhcldlZWsiOnJldHVybnt0eXBlOiJZZWFyV2VlayIsaXNvWWVhck51bWJlcjpyLmlzb1llYXJOdW1iZXIsaXNvV2Vla051bWJlcjpyLmlzb1dlZWtOdW1iZXIsZGF0ZVN0cmluZzpyLmRhdGVTdHJpbmd9O2Nhc2UiWWVhck1vbnRoIjpyZXR1cm57dHlwZToiWWVhck1vbnRoIix5ZWFyTnVtYmVyOnIueWVhck51bWJlcixtb250aE51bWJlcjpyLm1vbnRoTnVtYmVyLGRhdGVTdHJpbmc6ci5kYXRlU3RyaW5nfTtjYXNlIlllYXIiOnJldHVybnt0eXBlOiJZZWFyIix5ZWFyOnIueWVhcixkYXRlU3RyaW5nOnIuZGF0ZVN0cmluZ319fWZ1bmN0aW9uIFBuKHIsZSl7Y29uc3QgdD1bXSxuPWUubWludXMocik7Zm9yKGxldCBzPTA7czw9bjtzKyspdC5wdXNoKHIuYWRkRGF5cyhzKSk7cmV0dXJuIHR9ZnVuY3Rpb24gVm4ocixlKXtjb25zdCB0PVtdLG49ZS5taW51cyhyKTtmb3IobGV0IHM9MDtzPD1uO3MrKyl0LnB1c2goci5hZGRXZWVrcyhzKSk7cmV0dXJuIHR9ZnVuY3Rpb24gTG4ocixlKXtjb25zdCB0PVtdLG49ZS5taW51cyhyKTtmb3IobGV0IHM9MDtzPD1uO3MrKyl0LnB1c2goci5hZGRNb250aHMocykpO3JldHVybiB0fWZ1bmN0aW9uIHpuKHIsZSl7Y29uc3QgdD1bXSxuPWUubWludXMocik7Zm9yKGxldCBzPTA7czw9bjtzKyspdC5wdXNoKHIuYWRkWWVhcnMocykpO3JldHVybiB0fWZ1bmN0aW9uIFVuKHIsZSl7aWYocj09PW51bGx8fGU9PT1udWxsKXJldHVybltdO2lmKHIgaW5zdGFuY2VvZiB0ZSYmZSBpbnN0YW5jZW9mIHRlKXJldHVybiBQbihyLGUpO2lmKHIgaW5zdGFuY2VvZiByZSYmZSBpbnN0YW5jZW9mIHJlKXJldHVybiBWbihyLGUpO2lmKHIgaW5zdGFuY2VvZiBuZSYmZSBpbnN0YW5jZW9mIG5lKXJldHVybiBMbihyLGUpO2lmKHIgaW5zdGFuY2VvZiBzZSYmZSBpbnN0YW5jZW9mIHNlKXJldHVybiB6bihyLGUpO3Rocm93IG5ldyBFcnJvcihgSW52YWxpZCBhcmd1bWVudHM6IHN0YXJ0IGFuZCBlbmQgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlOiAke3J9LCAke2V9YCl9ZnVuY3Rpb24gRm4ocixlKXtpZihyIGluc3RhbmNlb2YgdGUmJmUgaW5zdGFuY2VvZiB0ZXx8ciBpbnN0YW5jZW9mIHJlJiZlIGluc3RhbmNlb2YgcmV8fHIgaW5zdGFuY2VvZiBuZSYmZSBpbnN0YW5jZW9mIG5lfHxyIGluc3RhbmNlb2Ygc2UmJmUgaW5zdGFuY2VvZiBzZSlyZXR1cm4gci5taW51cyhlKTt0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21wYXJlICR7cn0gYW5kICR7ZX1gKX1mdW5jdGlvbiBKZShyLGUpe2lmKHI9PT1udWxsKXJldHVybiAxO2lmKGU9PT1udWxsKXJldHVybi0xO2NvbnN0IHQ9Rm4ocixlKTtyZXR1cm4gdDwwPy0xOnQ+MD8xOjB9ZnVuY3Rpb24gQm4ocil7bGV0IGU9bnVsbCx0PW51bGw7Zm9yKGNvbnN0IG4gb2YgciluIT09bnVsbCYmKChlPT09bnVsbHx8SmUobixlKTwwKSYmKGU9biksKHQ9PT1udWxsfHxKZShuLHQpPjApJiYodD1uKSk7cmV0dXJuIGU9PT1udWxsfHx0PT09bnVsbD97bWluOm51bGwsbWF4Om51bGx9OnttaW46ZSxtYXg6dH19ZnVuY3Rpb24gV2UocixlKXtjb25zdCBuPXl0LmdldEluc3RhbmNlKCkuZ2V0WWVhck1vbnRoRGF5KHIpO3N3aXRjaChlKXtjYXNlImRheSI6cmV0dXJuIG47Y2FzZSJ3ZWVrIjpyZXR1cm4gbi53ZWVrO2Nhc2UibW9udGgiOnJldHVybiBuLm1vbnRoO2Nhc2UieWVhciI6cmV0dXJuIG4ueWVhcn19ZnVuY3Rpb24gSG4ocixlKXtyZXR1cm4gci5kYXRlUmFuZ2U9PT1udWxsPzE6ZS5kYXRlUmFuZ2U9PT1udWxsPy0xOkplKHIuZGF0ZVJhbmdlLGUuZGF0ZVJhbmdlKX1mdW5jdGlvbiBxbihyLGUpe3JldHVybntkYXRlUmFuZ2U6ci5kYXRlPT09bnVsbD9udWxsOldlKHIuZGF0ZSxlKSxjb3VudDpyLmNvdW50fX1jb25zdCBHbj0vXigoPzxzZWdtZW50PltBLVowLTlfLV0rKSg/PTopOik/KD88dmFsdWVBdFJlZmVyZW5jZT5bQS1aXSk/KD88cG9zaXRpb24+XGQrKSg/PHN1YnN0aXR1dGlvblZhbHVlPltBLVouXSk/JC9pO2NsYXNzIEtle2NvbnN0cnVjdG9yKGUsdCxuLHMpe3RoaXMuc2VnbWVudD1lLHRoaXMudmFsdWVBdFJlZmVyZW5jZT10LHRoaXMuc3Vic3RpdHV0aW9uVmFsdWU9bix0aGlzLnBvc2l0aW9uPXMsdGhpcy50eXBlPSJzdWJzdGl0dXRpb24iO2NvbnN0IGE9dGhpcy5zZWdtZW50P2Ake3RoaXMuc2VnbWVudH06YDoiIixpPXRoaXMudmFsdWVBdFJlZmVyZW5jZT9gJHt0aGlzLnZhbHVlQXRSZWZlcmVuY2V9YDoiIixvPXRoaXMuc3Vic3RpdHV0aW9uVmFsdWU/YCR7dGhpcy5zdWJzdGl0dXRpb25WYWx1ZX1gOiIiO3RoaXMuY29kZT1gJHthfSR7aX0ke3RoaXMucG9zaXRpb259JHtvfWB9ZXF1YWxzKGUpe3JldHVybiBlIGluc3RhbmNlb2YgS2U/dGhpcy5zZWdtZW50PT09ZS5zZWdtZW50JiZ0aGlzLnZhbHVlQXRSZWZlcmVuY2U9PT1lLnZhbHVlQXRSZWZlcmVuY2UmJnRoaXMuc3Vic3RpdHV0aW9uVmFsdWU9PT1lLnN1YnN0aXR1dGlvblZhbHVlJiZ0aGlzLnBvc2l0aW9uPT09ZS5wb3NpdGlvbjohMX10b1N0cmluZygpe3JldHVybiB0aGlzLmNvZGV9c3RhdGljIHBhcnNlKGUpe2NvbnN0IHQ9ZS5tYXRjaChHbik7cmV0dXJuIHQ9PT1udWxsfHx0Lmdyb3Vwcz09PXZvaWQgMD9udWxsOm5ldyBLZSh0Lmdyb3Vwcy5zZWdtZW50LHQuZ3JvdXBzLnZhbHVlQXRSZWZlcmVuY2UsdC5ncm91cHMuc3Vic3RpdHV0aW9uVmFsdWUscGFyc2VJbnQodC5ncm91cHMucG9zaXRpb24sMTApKX19Y29uc3QgSm49L14oKD88c2VnbWVudD5bQS1aMC05Xy1dKykoPz06KTopPyg/PHZhbHVlQXRSZWZlcmVuY2U+W0EtWl0pPyg/PHBvc2l0aW9uPlxkKykoLSkkL2k7Y2xhc3MgZ2V7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuc2VnbWVudD1lLHRoaXMudmFsdWVBdFJlZmVyZW5jZT10LHRoaXMucG9zaXRpb249bix0aGlzLnR5cGU9ImRlbGV0aW9uIjtjb25zdCBzPXRoaXMuc2VnbWVudD9gJHt0aGlzLnNlZ21lbnR9OmA6IiIsYT10aGlzLnZhbHVlQXRSZWZlcmVuY2U/YCR7dGhpcy52YWx1ZUF0UmVmZXJlbmNlfWA6IiI7dGhpcy5jb2RlPWAke3N9JHthfSR7dGhpcy5wb3NpdGlvbn0tYH1lcXVhbHMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBnZT90aGlzLnNlZ21lbnQ9PT1lLnNlZ21lbnQmJnRoaXMudmFsdWVBdFJlZmVyZW5jZT09PWUudmFsdWVBdFJlZmVyZW5jZSYmdGhpcy5wb3NpdGlvbj09PWUucG9zaXRpb246ITF9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5jb2RlfXN0YXRpYyBwYXJzZShlKXtjb25zdCB0PWUubWF0Y2goSm4pO3JldHVybiB0PT09bnVsbHx8dC5ncm91cHM9PT12b2lkIDA/bnVsbDpuZXcgZ2UodC5ncm91cHMuc2VnbWVudCx0Lmdyb3Vwcy52YWx1ZUF0UmVmZXJlbmNlLHBhcnNlSW50KHQuZ3JvdXBzLnBvc2l0aW9uLDEwKSl9fWZ1bmN0aW9uIEZ0KHIpe3N3aXRjaChyLnR5cGUpe2Nhc2Uic3Vic3RpdHV0aW9uIjpyZXR1cm57dHlwZToic3Vic3RpdHV0aW9uIixjb2RlOnIuY29kZSxzZWdtZW50OnIuc2VnbWVudCxwb3NpdGlvbjpyLnBvc2l0aW9uLHZhbHVlQXRSZWZlcmVuY2U6ci52YWx1ZUF0UmVmZXJlbmNlLHN1YnN0aXR1dGlvblZhbHVlOnIuc3Vic3RpdHV0aW9uVmFsdWV9O2Nhc2UiZGVsZXRpb24iOnJldHVybnt0eXBlOiJkZWxldGlvbiIsY29kZTpyLmNvZGUsc2VnbWVudDpyLnNlZ21lbnQscG9zaXRpb246ci5wb3NpdGlvbix2YWx1ZUF0UmVmZXJlbmNlOnIudmFsdWVBdFJlZmVyZW5jZX19fWNsYXNzIEtue2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmZpbHRlcj1lLHRoaXMuc2VxdWVuY2VUeXBlPXQsdGhpcy5taW5Qcm9wb3J0aW9uPW59YXN5bmMgZXZhbHVhdGUoZSx0KXtyZXR1cm57Y29udGVudDooYXdhaXQgdGhpcy5mZXRjaE11dGF0aW9ucyhlLHQpKS5tYXAoKHtjb3VudDphLHByb3BvcnRpb246aSxtdXRhdGlvbkZyb206byxtdXRhdGlvblRvOmMscG9zaXRpb246dSxzZXF1ZW5jZU5hbWU6bH0pPT5jPT09Ii0iP3t0eXBlOiJkZWxldGlvbiIsbXV0YXRpb246bmV3IGdlKGw/P3ZvaWQgMCxvLHUpLGNvdW50OmEscHJvcG9ydGlvbjppfTp7dHlwZToic3Vic3RpdHV0aW9uIixtdXRhdGlvbjpuZXcgS2UobD8/dm9pZCAwLG8sYyx1KSxjb3VudDphLHByb3BvcnRpb246aX0pfX1hc3luYyBmZXRjaE11dGF0aW9ucyhlLHQpe2NvbnN0IG49ey4uLnRoaXMuZmlsdGVyLG1pblByb3BvcnRpb246dGhpcy5taW5Qcm9wb3J0aW9ufTtyZXR1cm4gZm4oZSxuLHRoaXMuc2VxdWVuY2VUeXBlLHQpLnRoZW4ocz0+cy5kYXRhKX19dmFyIEJ0O0J0PXtfX2U6ZnVuY3Rpb24ocixlLHQsbil7Zm9yKHZhciBzLGEsaTtlPWUuX187KWlmKChzPWUuX19jKSYmIXMuX18pdHJ5e2lmKChhPXMuY29uc3RydWN0b3IpJiZhLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciE9bnVsbCYmKHMuc2V0U3RhdGUoYS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IocikpLGk9cy5fX2QpLHMuY29tcG9uZW50RGlkQ2F0Y2ghPW51bGwmJihzLmNvbXBvbmVudERpZENhdGNoKHIsbnx8e30pLGk9cy5fX2QpLGkpcmV0dXJuIHMuX19FPXN9Y2F0Y2gobyl7cj1vfXRocm93IHJ9fSx0eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIiYmUHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTt2YXIgVixndCxIdCxxdD1bXSwkPUJ0LEd0PSQuX19iLEp0PSQuX19yLEt0PSQuZGlmZmVkLFF0PSQuX19jLFh0PSQudW5tb3VudCxlcj0kLl9fO2Z1bmN0aW9uIFFuKCl7Zm9yKHZhciByO3I9cXQuc2hpZnQoKTspaWYoci5fX1AmJnIuX19IKXRyeXtyLl9fSC5fX2guZm9yRWFjaChRZSksci5fX0guX19oLmZvckVhY2godnQpLHIuX19ILl9faD1bXX1jYXRjaChlKXtyLl9fSC5fX2g9W10sJC5fX2UoZSxyLl9fdil9fSQuX19iPWZ1bmN0aW9uKHIpe1Y9bnVsbCxHdCYmR3Qocil9LCQuX189ZnVuY3Rpb24ocixlKXtyJiZlLl9fayYmZS5fX2suX19tJiYoci5fX209ZS5fX2suX19tKSxlciYmZXIocixlKX0sJC5fX3I9ZnVuY3Rpb24ocil7SnQmJkp0KHIpO3ZhciBlPShWPXIuX19jKS5fX0g7ZSYmKGd0PT09Vj8oZS5fX2g9W10sVi5fX2g9W10sZS5fXy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuX19OJiYodC5fXz10Ll9fTiksdC5pPXQuX19OPXZvaWQgMH0pKTooZS5fX2guZm9yRWFjaChRZSksZS5fX2guZm9yRWFjaCh2dCksZS5fX2g9W10pKSxndD1WfSwkLmRpZmZlZD1mdW5jdGlvbihyKXtLdCYmS3Qocik7dmFyIGU9ci5fX2M7ZSYmZS5fX0gmJihlLl9fSC5fX2gubGVuZ3RoJiYocXQucHVzaChlKSE9PTEmJkh0PT09JC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCgoSHQ9JC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpfHxYbikoUW4pKSxlLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuaSYmKHQuX19IPXQuaSksdC5pPXZvaWQgMH0pKSxndD1WPW51bGx9LCQuX19jPWZ1bmN0aW9uKHIsZSl7ZS5zb21lKGZ1bmN0aW9uKHQpe3RyeXt0Ll9faC5mb3JFYWNoKFFlKSx0Ll9faD10Ll9faC5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIW4uX198fHZ0KG4pfSl9Y2F0Y2gobil7ZS5zb21lKGZ1bmN0aW9uKHMpe3MuX19oJiYocy5fX2g9W10pfSksZT1bXSwkLl9fZShuLHQuX192KX19KSxRdCYmUXQocixlKX0sJC51bm1vdW50PWZ1bmN0aW9uKHIpe1h0JiZYdChyKTt2YXIgZSx0PXIuX19jO3QmJnQuX19IJiYodC5fX0guX18uZm9yRWFjaChmdW5jdGlvbihuKXt0cnl7UWUobil9Y2F0Y2gocyl7ZT1zfX0pLHQuX19IPXZvaWQgMCxlJiYkLl9fZShlLHQuX192KSl9O3ZhciB0cj10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPT0iZnVuY3Rpb24iO2Z1bmN0aW9uIFhuKHIpe3ZhciBlLHQ9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQobiksdHImJmNhbmNlbEFuaW1hdGlvbkZyYW1lKGUpLHNldFRpbWVvdXQocil9LG49c2V0VGltZW91dCh0LDEwMCk7dHImJihlPXJlcXVlc3RBbmltYXRpb25GcmFtZSh0KSl9ZnVuY3Rpb24gUWUocil7dmFyIGU9Vix0PXIuX19jO3R5cGVvZiB0PT0iZnVuY3Rpb24iJiYoci5fX2M9dm9pZCAwLHQoKSksVj1lfWZ1bmN0aW9uIHZ0KHIpe3ZhciBlPVY7ci5fX2M9ci5fXygpLFY9ZX1jbGFzcyByciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIodCksdGhpcy5oZWFkbGluZT1lLHRoaXMubmFtZT0iVXNlckZhY2luZ0Vycm9yIn19Y2xhc3MgZXN7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuc2VyaWFsaXplRmlyc3RBeGlzPWUsdGhpcy5zZXJpYWxpemVTZWNvbmRBeGlzPXQsdGhpcy5kYXRhPW5ldyBNYXAsdGhpcy5rZXlzRmlyc3RBeGlzPW5ldyBNYXAsdGhpcy5rZXlzU2Vjb25kQXhpcz1uZXcgTWFwLG4mJih0aGlzLmtleXNGaXJzdEF4aXM9bmV3IE1hcChuLmtleXNGaXJzdEF4aXMpLHRoaXMua2V5c1NlY29uZEF4aXM9bmV3IE1hcChuLmtleXNTZWNvbmRBeGlzKSx0aGlzLmRhdGE9bmV3IE1hcChuLmRhdGEpKX1nZXQoZSx0KXt2YXIgYTtjb25zdCBuPXRoaXMuc2VyaWFsaXplRmlyc3RBeGlzKGUpLHM9dGhpcy5zZXJpYWxpemVTZWNvbmRBeGlzKHQpO3JldHVybihhPXRoaXMuZGF0YS5nZXQobikpPT1udWxsP3ZvaWQgMDphLmdldChzKX1nZXRSb3coZSx0KXtjb25zdCBuPXRoaXMuc2VyaWFsaXplRmlyc3RBeGlzKGUpLHM9dGhpcy5kYXRhLmdldChuKTtyZXR1cm4gcz09PXZvaWQgMD9bXTpBcnJheS5mcm9tKHRoaXMua2V5c1NlY29uZEF4aXMua2V5cygpKS5tYXAoYT0+cy5nZXQoYSk/P3QpfXNldChlLHQsbil7Y29uc3Qgcz10aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhlKSxhPXRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcyh0KTt0aGlzLmRhdGEuaGFzKHMpfHx0aGlzLmRhdGEuc2V0KHMsbmV3IE1hcCksdGhpcy5kYXRhLmdldChzKS5zZXQoYSxuKSx0aGlzLmtleXNGaXJzdEF4aXMuc2V0KHMsZSksdGhpcy5rZXlzU2Vjb25kQXhpcy5zZXQoYSx0KX1kZWxldGVSb3coZSl7Y29uc3QgdD10aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhlKTt0aGlzLmRhdGEuZGVsZXRlKHQpLHRoaXMua2V5c0ZpcnN0QXhpcy5kZWxldGUodCl9Z2V0Rmlyc3RBeGlzS2V5cygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMua2V5c0ZpcnN0QXhpcy52YWx1ZXMoKSl9Z2V0U2Vjb25kQXhpc0tleXMoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmtleXNTZWNvbmRBeGlzLnZhbHVlcygpKX1nZXRBc0FycmF5KGUpe3JldHVybiB0aGlzLmdldEZpcnN0QXhpc0tleXMoKS5tYXAodD0+dGhpcy5nZXRTZWNvbmRBeGlzS2V5cygpLm1hcChuPT50aGlzLmdldCh0LG4pPz9lKSl9Z2V0Q29udGVudHMoKXtyZXR1cm57a2V5c0ZpcnN0QXhpczp0aGlzLmtleXNGaXJzdEF4aXMsa2V5c1NlY29uZEF4aXM6dGhpcy5rZXlzU2Vjb25kQXhpcyxkYXRhOnRoaXMuZGF0YX19fWNsYXNzIHRzIGV4dGVuZHMgZXN7Y29uc3RydWN0b3IoZSl7c3VwZXIobHMsaHMsZSl9fWNvbnN0IHJzPShyLGUpPT57aWYoci5zZWdtZW50IT09ZS5zZWdtZW50KXJldHVybiBucyhyLnNlZ21lbnQsZS5zZWdtZW50KTtpZihyLnBvc2l0aW9uIT09ZS5wb3NpdGlvbilyZXR1cm4gc3Moci5wb3NpdGlvbixlLnBvc2l0aW9uKTtjb25zdCB0PXIgaW5zdGFuY2VvZiBnZSxuPWUgaW5zdGFuY2VvZiBnZTtyZXR1cm4gdCE9PW4/dD8xOi0xOiF0JiYhbiYmci5zdWJzdGl0dXRpb25WYWx1ZSE9PWUuc3Vic3RpdHV0aW9uVmFsdWU/YXMoci5zdWJzdGl0dXRpb25WYWx1ZSxlLnN1YnN0aXR1dGlvblZhbHVlKTowfSxucz0ocixlKT0+cj09PXZvaWQgMD8tMTplPT09dm9pZCAwPzE6ci5sb2NhbGVDb21wYXJlKGUpLHNzPShyLGUpPT5yLWUsYXM9KHIsZSk9PnI9PT12b2lkIDA/LTE6ZT09PXZvaWQgMD8xOnIubG9jYWxlQ29tcGFyZShlKSxucj0yMDA7YXN5bmMgZnVuY3Rpb24gaXMoe2xhcGlzRmlsdGVyOnIsc2VxdWVuY2VUeXBlOmUsbGFwaXM6dCxncmFudWxhcml0eTpuLGxhcGlzRGF0ZUZpZWxkOnMsc2lnbmFsOmF9KXtjb25zdCBpPWF3YWl0IHNyKHIsdCxuLHMsYSk7aWYoaS5sZW5ndGg9PT0wKXJldHVybntjb250ZW50OltdfTtjb25zdCBvPXsuLi5yLFtgJHtzfUZyb21gXTppWzBdLmZpcnN0RGF5LnRvU3RyaW5nKCksW2Ake3N9VG9gXTppW2kubGVuZ3RoLTFdLmxhc3REYXkudG9TdHJpbmcoKX07cmV0dXJuIGFyKG8sZSkuZXZhbHVhdGUodCxhKX1hc3luYyBmdW5jdGlvbiBvcyh7bGFwaXNGaWx0ZXI6cixzZXF1ZW5jZVR5cGU6ZSxsYXBpczp0LGxhcGlzRGF0ZUZpZWxkOm4sZ3JhbnVsYXJpdHk6cyxzaWduYWw6YX0pe2NvbnN0IGk9YXdhaXQgc3Iocix0LHMsbixhKTtpZihpLmxlbmd0aD5ucil0aHJvdyBuZXcgcnIoIlRvbyBtYW55IGRhdGVzIixgVGhlIGRhdGFzZXQgd291bGQgY29udGFpbiAke2kubGVuZ3RofSBkYXRlIGludGVydmFscy4gUGxlYXNlIHJlZHVjZSB0aGUgbnVtYmVyIHRvIGJlbG93ICR7bnJ9IHRvIGRpc3BsYXkgdGhlIGRhdGEuIFlvdSBjYW4gYWNoaWV2ZSB0aGlzIGJ5IGVpdGhlciBuYXJyb3dpbmcgdGhlIGRhdGUgcmFuZ2UgaW4gdGhlIHByb3ZpZGVkIExBUElTIGZpbHRlciBvciBieSBzZWxlY3RpbmcgYSBsYXJnZXIgZ3JhbnVsYXJpdHkuYCk7Y29uc3Qgbz1pLm1hcChhc3luYyBsPT57Y29uc3Qgaz1sLmZpcnN0RGF5LnRvU3RyaW5nKCksUz1sLmxhc3REYXkudG9TdHJpbmcoKSxNPXsuLi5yLFtgJHtufUZyb21gXTprLFtgJHtufVRvYF06U30sRj1hd2FpdCBhcihNLGUpLmV2YWx1YXRlKHQsYSksYWU9YXdhaXQgbXMoTSkuZXZhbHVhdGUodCxhKTtyZXR1cm57ZGF0ZTpsLG11dGF0aW9uczpGLmNvbnRlbnQsdG90YWxDb3VudDphZS5jb250ZW50WzBdLmNvdW50fX0pLGM9YXdhaXQgUHJvbWlzZS5hbGwobyksdT0oYXdhaXQgaXMoe2xhcGlzRmlsdGVyOnIsc2VxdWVuY2VUeXBlOmUsbGFwaXM6dCxsYXBpc0RhdGVGaWVsZDpuLGdyYW51bGFyaXR5OnN9KSkuY29udGVudDtyZXR1cm57bXV0YXRpb25PdmVyVGltZURhdGE6ZnMoYyx1KSxvdmVyYWxsTXV0YXRpb25EYXRhOnV9fWFzeW5jIGZ1bmN0aW9uIHNyKHIsZSx0LG4scyl7Y29uc3R7Y29udGVudDphfT1hd2FpdCB1cyhyLGUsdCxuLHMpLHtkYXRlRnJvbTppLGRhdGVUbzpvfT1jcyhyLG4sdCkse21pbjpjLG1heDp1fT1CbihhKTtyZXR1cm4gVW4oaT8/YyxvPz91KX1mdW5jdGlvbiBjcyhyLGUsdCl7Y29uc3Qgbj1yW2VdO2lmKG4pcmV0dXJue2RhdGVGcm9tOldlKG4sdCksZGF0ZVRvOldlKG4sdCl9O2NvbnN0IHM9cltgJHtlfUZyb21gXSxhPXJbYCR7ZX1Ub2BdO3JldHVybntkYXRlRnJvbTpzP1dlKHMsdCk6bnVsbCxkYXRlVG86YT9XZShhLHQpOm51bGx9fWZ1bmN0aW9uIHVzKHIsZSx0LG4scyl7cmV0dXJuIGRzKHIsdCxuKS5ldmFsdWF0ZShlLHMpfWZ1bmN0aW9uIGRzKHIsZSx0KXtjb25zdCBuPW5ldyBDdChyLFt0XSkscz1uZXcgeG4obix0LCJkYXRlIiksYT1uZXcgZHQocyxjPT5xbihjLGUpKSxpPW5ldyBfbihhLCJkYXRlUmFuZ2UiLCJjb3VudCIpLG89bmV3IGtuKGksSG4pO3JldHVybiBuZXcgZHQobyxjPT5jLmRhdGVSYW5nZSl9ZnVuY3Rpb24gYXIocixlKXtyZXR1cm4gbmV3IEtuKHIsZSwuMDAxKX1mdW5jdGlvbiBscyhyKXtyZXR1cm4gci5jb2RlfWZ1bmN0aW9uIGhzKHIpe3JldHVybiByLmRhdGVTdHJpbmd9ZnVuY3Rpb24gZnMocixlKXtjb25zdCB0PW5ldyB0cyxuPXIubWFwKGk9PmkuZGF0ZSkscz1lLnNvcnQoKGksbyk9PnJzKGkubXV0YXRpb24sby5tdXRhdGlvbikpLm1hcChpPT5GdChpLm11dGF0aW9uKSksYT1uLnNvcnQoKGksbyk9PkplKGksbykpLm1hcChpPT5VdChpKSk7cmV0dXJuIHMuZm9yRWFjaChpPT57YS5mb3JFYWNoKG89Pnt0LnNldChpLG8se2NvdW50OjAscHJvcG9ydGlvbjowLHRvdGFsQ291bnQ6MH0pfSl9KSxyLmZvckVhY2goaT0+e2kubXV0YXRpb25zLmZvckVhY2gobz0+e2NvbnN0IGM9RnQoby5tdXRhdGlvbiksdT1VdChpLmRhdGUpO3QuZ2V0KGMsdSkhPT12b2lkIDAmJnQuc2V0KGMsdSx7Y291bnQ6by5jb3VudCxwcm9wb3J0aW9uOm8ucHJvcG9ydGlvbix0b3RhbENvdW50OmkudG90YWxDb3VudH0pfSl9KSx0fWZ1bmN0aW9uIG1zKHIpe3JldHVybiBuZXcgQ3Qocil9YXN5bmMgZnVuY3Rpb24gcHMocil7dHJ5e3Bvc3RNZXNzYWdlKHtzdGF0dXM6ImxvYWRpbmcifSk7Y29uc3QgZT1hd2FpdCByKCk7cG9zdE1lc3NhZ2Uoe3N0YXR1czoic3VjY2VzcyIsZGF0YTplfSl9Y2F0Y2goZSl7cG9zdE1lc3NhZ2UoZSBpbnN0YW5jZW9mIHJyP3tzdGF0dXM6ImVycm9yIix1c2VyRmFjaW5nOiEwLGhlYWRsaW5lOmUuaGVhZGxpbmUsZXJyb3I6ZX06e3N0YXR1czoiZXJyb3IiLHVzZXJGYWNpbmc6ITEsZXJyb3I6ZSBpbnN0YW5jZW9mIEVycm9yP2U6bmV3IEVycm9yKGAke2V9YCl9KX19YXN5bmMgZnVuY3Rpb24geXMocil7Y29uc3QgZT1hd2FpdCBvcyhyLmRhdGEpO3JldHVybntvdmVyYWxsTXV0YXRpb25EYXRhOmUub3ZlcmFsbE11dGF0aW9uRGF0YSxtdXRhdGlvbk92ZXJUaW1lU2VyaWFsaXplZDplLm11dGF0aW9uT3ZlclRpbWVEYXRhLmdldENvbnRlbnRzKCl9fXNlbGYub25tZXNzYWdlPWFzeW5jIGZ1bmN0aW9uKHIpe2F3YWl0IHBzKCgpPT55cyhyKSl9fSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXV0YXRpb25PdmVyVGltZVdvcmtlci1DeXBYX1BZTS5qcy5tYXAK", xS = (n) => Uint8Array.from(atob(n), (t) => t.charCodeAt(0)), Kf = typeof self < "u" && self.Blob && new Blob([xS(rg)], { type: "text/javascript;charset=utf-8" });
|
|
23736
23740
|
function ZS(n) {
|
|
23737
23741
|
let t;
|
|
23738
23742
|
try {
|
|
@@ -23952,7 +23956,7 @@ const YS = ({ children: n, content: t, position: e = "bottom" }) => /* @__PURE__
|
|
|
23952
23956
|
"div",
|
|
23953
23957
|
{
|
|
23954
23958
|
style: { gridRowStart: a + 1, gridColumnStart: 1 },
|
|
23955
|
-
children: /* @__PURE__ */ m(
|
|
23959
|
+
children: /* @__PURE__ */ m(TS, { mutation: o })
|
|
23956
23960
|
},
|
|
23957
23961
|
`mutation-${o.toString()}`
|
|
23958
23962
|
),
|
|
@@ -24022,13 +24026,13 @@ const CS = ({ value: n, mutation: t, date: e, tooltipPosition: i, colorScale: r
|
|
|
24022
24026
|
children: /* @__PURE__ */ m("span", { className: "invisible @[2rem]:visible", children: Re(n.proportion, 0) })
|
|
24023
24027
|
}
|
|
24024
24028
|
) }) });
|
|
24025
|
-
}, NS = (n) => n instanceof dn ? n.toString() : `${n.firstDay.toString()} - ${n.lastDay.toString()}`,
|
|
24029
|
+
}, NS = (n) => n instanceof dn ? n.toString() : `${n.firstDay.toString()} - ${n.lastDay.toString()}`, TS = ({ mutation: n }) => /* @__PURE__ */ m("div", { className: "text-center", children: n.code }), zS = ({
|
|
24026
24030
|
colorScale: n,
|
|
24027
24031
|
setColorScale: t
|
|
24028
24032
|
}) => /* @__PURE__ */ m("div", { className: "w-20", children: /* @__PURE__ */ m(Id, { buttonTitle: "Color scale", placement: "bottom-start", children: /* @__PURE__ */ m(SS, { colorScale: n, setColorScale: t }) }) });
|
|
24029
24033
|
function FS(n, t) {
|
|
24030
24034
|
const [e, i] = it(void 0), [r, s] = it(void 0), [o, a] = it(!0);
|
|
24031
|
-
return
|
|
24035
|
+
return Qt(() => {
|
|
24032
24036
|
t.onmessage = (l) => {
|
|
24033
24037
|
const c = l.data, d = c.status;
|
|
24034
24038
|
switch (d) {
|
|
@@ -24049,7 +24053,7 @@ function FS(n, t) {
|
|
|
24049
24053
|
}, t.onmessageerror = (l) => {
|
|
24050
24054
|
s(new Error(`Worker received a message that it cannot deserialize: ${l.data}`)), a(!1);
|
|
24051
24055
|
};
|
|
24052
|
-
}, [t]),
|
|
24056
|
+
}, [t]), Qt(() => {
|
|
24053
24057
|
t.postMessage(n);
|
|
24054
24058
|
}, [n, t]), { data: e, error: r, isLoading: o };
|
|
24055
24059
|
}
|
|
@@ -24087,7 +24091,7 @@ const HS = (n) => {
|
|
|
24087
24091
|
originalComponentProps: t,
|
|
24088
24092
|
overallMutationData: e
|
|
24089
24093
|
}) => {
|
|
24090
|
-
const [i, r] = it({ min: 0.05, max: 0.9 }), [s, o] = it({ min: 0, max: 1, color: "indigo" }), [a, l] =
|
|
24094
|
+
const [i, r] = it({ min: 0.05, max: 0.9 }), [s, o] = it({ min: 0, max: 1, color: "indigo" }), [a, l] = Td(t.sequenceType), [c, d] = it([
|
|
24091
24095
|
{ label: "Substitutions", checked: !0, type: "substitution" },
|
|
24092
24096
|
{ label: "Deletions", checked: !0, type: "deletion" }
|
|
24093
24097
|
]), u = Oe(() => WS(
|
|
@@ -24139,7 +24143,7 @@ const HS = (n) => {
|
|
|
24139
24143
|
setColorScale: c,
|
|
24140
24144
|
originalComponentProps: d
|
|
24141
24145
|
}) => /* @__PURE__ */ m(Gt, { children: [
|
|
24142
|
-
n === "Grid" && /* @__PURE__ */ m(
|
|
24146
|
+
n === "Grid" && /* @__PURE__ */ m(zS, { colorScale: l, setColorScale: c }),
|
|
24143
24147
|
/* @__PURE__ */ m(Nd, { displayedSegments: t, setDisplayedSegments: e }),
|
|
24144
24148
|
/* @__PURE__ */ m(
|
|
24145
24149
|
Md,
|
|
@@ -24406,7 +24410,7 @@ function jf(n, t) {
|
|
|
24406
24410
|
var Ql = function(n) {
|
|
24407
24411
|
return n instanceof Array ? n : [n];
|
|
24408
24412
|
};
|
|
24409
|
-
function
|
|
24413
|
+
function te(n, t, e) {
|
|
24410
24414
|
if (e === !0)
|
|
24411
24415
|
return n.classList.add(t);
|
|
24412
24416
|
n.classList.remove(t);
|
|
@@ -24772,9 +24776,9 @@ function qS(n, t) {
|
|
|
24772
24776
|
e.amPM !== void 0 && (v = c(v, e.amPM.textContent));
|
|
24773
24777
|
var R = e.config.minTime !== void 0 || e.config.minDate && e.minDateHasTime && e.latestSelectedDateObj && me(e.latestSelectedDateObj, e.config.minDate, !0) === 0, I = e.config.maxTime !== void 0 || e.config.maxDate && e.maxDateHasTime && e.latestSelectedDateObj && me(e.latestSelectedDateObj, e.config.maxDate, !0) === 0;
|
|
24774
24778
|
if (e.config.maxTime !== void 0 && e.config.minTime !== void 0 && e.config.minTime > e.config.maxTime) {
|
|
24775
|
-
var
|
|
24776
|
-
if (O > $ && O <
|
|
24777
|
-
var nt = AS(
|
|
24779
|
+
var T = ql(e.config.minTime.getHours(), e.config.minTime.getMinutes(), e.config.minTime.getSeconds()), $ = ql(e.config.maxTime.getHours(), e.config.maxTime.getMinutes(), e.config.maxTime.getSeconds()), O = ql(v, Z, W);
|
|
24780
|
+
if (O > $ && O < T) {
|
|
24781
|
+
var nt = AS(T);
|
|
24778
24782
|
v = nt[0], Z = nt[1], W = nt[2];
|
|
24779
24783
|
}
|
|
24780
24784
|
} else {
|
|
@@ -24847,8 +24851,8 @@ function qS(n, t) {
|
|
|
24847
24851
|
var W = v !== void 0 ? e.parseDate(v) : e.latestSelectedDateObj || (e.config.minDate && e.config.minDate > e.now ? e.config.minDate : e.config.maxDate && e.config.maxDate < e.now ? e.config.maxDate : e.now), R = e.currentYear, I = e.currentMonth;
|
|
24848
24852
|
try {
|
|
24849
24853
|
W !== void 0 && (e.currentYear = W.getFullYear(), e.currentMonth = W.getMonth());
|
|
24850
|
-
} catch (
|
|
24851
|
-
|
|
24854
|
+
} catch (T) {
|
|
24855
|
+
T.message = "Invalid date supplied: " + W, e.config.errorHandler(T);
|
|
24852
24856
|
}
|
|
24853
24857
|
Z && e.currentYear !== R && (Lt("onYearChange"), ot()), Z && (e.currentYear !== R || e.currentMonth !== I) && Lt("onMonthChange"), e.redraw();
|
|
24854
24858
|
}
|
|
@@ -24857,8 +24861,8 @@ function qS(n, t) {
|
|
|
24857
24861
|
~Z.className.indexOf("arrow") && k(v, Z.classList.contains("arrowUp") ? 1 : -1);
|
|
24858
24862
|
}
|
|
24859
24863
|
function k(v, Z, W) {
|
|
24860
|
-
var R = v && pe(v), I = W || R && R.parentNode && R.parentNode.firstChild,
|
|
24861
|
-
|
|
24864
|
+
var R = v && pe(v), I = W || R && R.parentNode && R.parentNode.firstChild, T = vl("increment");
|
|
24865
|
+
T.delta = Z, I && I.dispatchEvent(T);
|
|
24862
24866
|
}
|
|
24863
24867
|
function X() {
|
|
24864
24868
|
var v = window.document.createDocumentFragment();
|
|
@@ -24869,32 +24873,32 @@ function qS(n, t) {
|
|
|
24869
24873
|
}
|
|
24870
24874
|
e.rContainer = ht("div", "flatpickr-rContainer"), e.rContainer.appendChild(Rt()), e.daysContainer || (e.daysContainer = ht("div", "flatpickr-days"), e.daysContainer.tabIndex = -1), H(), e.rContainer.appendChild(e.daysContainer), e.innerContainer.appendChild(e.rContainer), v.appendChild(e.innerContainer);
|
|
24871
24875
|
}
|
|
24872
|
-
e.config.enableTime && v.appendChild(ft()),
|
|
24876
|
+
e.config.enableTime && v.appendChild(ft()), te(e.calendarContainer, "rangeMode", e.config.mode === "range"), te(e.calendarContainer, "animate", e.config.animate === !0), te(e.calendarContainer, "multiMonth", e.config.showMonths > 1), e.calendarContainer.appendChild(v);
|
|
24873
24877
|
var I = e.config.appendTo !== void 0 && e.config.appendTo.nodeType !== void 0;
|
|
24874
24878
|
if ((e.config.inline || e.config.static) && (e.calendarContainer.classList.add(e.config.inline ? "inline" : "static"), e.config.inline && (!I && e.element.parentNode ? e.element.parentNode.insertBefore(e.calendarContainer, e._input.nextSibling) : e.config.appendTo !== void 0 && e.config.appendTo.appendChild(e.calendarContainer)), e.config.static)) {
|
|
24875
|
-
var
|
|
24876
|
-
e.element.parentNode && e.element.parentNode.insertBefore(
|
|
24879
|
+
var T = ht("div", "flatpickr-wrapper");
|
|
24880
|
+
e.element.parentNode && e.element.parentNode.insertBefore(T, e.element), T.appendChild(e.element), e.altInput && T.appendChild(e.altInput), T.appendChild(e.calendarContainer);
|
|
24877
24881
|
}
|
|
24878
24882
|
!e.config.static && !e.config.inline && (e.config.appendTo !== void 0 ? e.config.appendTo : window.document.body).appendChild(e.calendarContainer);
|
|
24879
24883
|
}
|
|
24880
24884
|
function S(v, Z, W, R) {
|
|
24881
|
-
var I = wi(Z, !0),
|
|
24882
|
-
return
|
|
24885
|
+
var I = wi(Z, !0), T = ht("span", v, Z.getDate().toString());
|
|
24886
|
+
return T.dateObj = Z, T.$i = R, T.setAttribute("aria-label", e.formatDate(Z, e.config.ariaDateFormat)), v.indexOf("hidden") === -1 && me(Z, e.now) === 0 && (e.todayDateElem = T, T.classList.add("today"), T.setAttribute("aria-current", "date")), I ? (T.tabIndex = -1, xl(Z) && (T.classList.add("selected"), e.selectedDateElem = T, e.config.mode === "range" && (te(T, "startRange", e.selectedDates[0] && me(Z, e.selectedDates[0], !0) === 0), te(T, "endRange", e.selectedDates[1] && me(Z, e.selectedDates[1], !0) === 0), v === "nextMonthDay" && T.classList.add("inRange")))) : T.classList.add("flatpickr-disabled"), e.config.mode === "range" && Zg(Z) && !xl(Z) && T.classList.add("inRange"), e.weekNumbers && e.config.showMonths === 1 && v !== "prevMonthDay" && R % 7 === 6 && e.weekNumbers.insertAdjacentHTML("beforeend", "<span class='flatpickr-day'>" + e.config.getWeek(Z) + "</span>"), Lt("onDayCreate", T), T;
|
|
24883
24887
|
}
|
|
24884
24888
|
function G(v) {
|
|
24885
24889
|
v.focus(), e.config.mode === "range" && xo(v);
|
|
24886
24890
|
}
|
|
24887
24891
|
function _(v) {
|
|
24888
24892
|
for (var Z = v > 0 ? 0 : e.config.showMonths - 1, W = v > 0 ? e.config.showMonths : -1, R = Z; R != W; R += v)
|
|
24889
|
-
for (var I = e.daysContainer.children[R],
|
|
24893
|
+
for (var I = e.daysContainer.children[R], T = v > 0 ? 0 : I.children.length - 1, $ = v > 0 ? I.children.length : -1, O = T; O != $; O += v) {
|
|
24890
24894
|
var nt = I.children[O];
|
|
24891
24895
|
if (nt.className.indexOf("hidden") === -1 && wi(nt.dateObj))
|
|
24892
24896
|
return nt;
|
|
24893
24897
|
}
|
|
24894
24898
|
}
|
|
24895
24899
|
function V(v, Z) {
|
|
24896
|
-
for (var W = v.className.indexOf("Month") === -1 ? v.dateObj.getMonth() : e.currentMonth, R = Z > 0 ? e.config.showMonths : -1, I = Z > 0 ? 1 : -1,
|
|
24897
|
-
for (var $ = e.daysContainer.children[
|
|
24900
|
+
for (var W = v.className.indexOf("Month") === -1 ? v.dateObj.getMonth() : e.currentMonth, R = Z > 0 ? e.config.showMonths : -1, I = Z > 0 ? 1 : -1, T = W - e.currentMonth; T != R; T += I)
|
|
24901
|
+
for (var $ = e.daysContainer.children[T], O = W - e.currentMonth === T ? v.$i + Z : Z < 0 ? $.children.length - 1 : 0, nt = $.children.length, P = O; P >= 0 && P < nt && P != (Z > 0 ? nt : -1); P += I) {
|
|
24898
24902
|
var U = $.children[P];
|
|
24899
24903
|
if (U.className.indexOf("hidden") === -1 && wi(U.dateObj) && Math.abs(v.$i - P) >= Math.abs(Z))
|
|
24900
24904
|
return G(U);
|
|
@@ -24906,14 +24910,14 @@ function qS(n, t) {
|
|
|
24906
24910
|
I === void 0 ? e._input.focus() : R ? V(I, Z) : G(I);
|
|
24907
24911
|
}
|
|
24908
24912
|
function K(v, Z) {
|
|
24909
|
-
for (var W = (new Date(v, Z, 1).getDay() - e.l10n.firstDayOfWeek + 7) % 7, R = e.utils.getDaysInMonth((Z - 1 + 12) % 12, v), I = e.utils.getDaysInMonth(Z, v),
|
|
24910
|
-
|
|
24913
|
+
for (var W = (new Date(v, Z, 1).getDay() - e.l10n.firstDayOfWeek + 7) % 7, R = e.utils.getDaysInMonth((Z - 1 + 12) % 12, v), I = e.utils.getDaysInMonth(Z, v), T = window.document.createDocumentFragment(), $ = e.config.showMonths > 1, O = $ ? "prevMonthDay hidden" : "prevMonthDay", nt = $ ? "nextMonthDay hidden" : "nextMonthDay", P = R + 1 - W, U = 0; P <= R; P++, U++)
|
|
24914
|
+
T.appendChild(S("flatpickr-day " + O, new Date(v, Z - 1, P), P, U));
|
|
24911
24915
|
for (P = 1; P <= I; P++, U++)
|
|
24912
|
-
|
|
24916
|
+
T.appendChild(S("flatpickr-day", new Date(v, Z, P), P, U));
|
|
24913
24917
|
for (var yt = I + 1; yt <= 42 - W && (e.config.showMonths === 1 || U % 7 !== 0); yt++, U++)
|
|
24914
|
-
|
|
24918
|
+
T.appendChild(S("flatpickr-day " + nt, new Date(v, Z + 1, yt % I), yt, U));
|
|
24915
24919
|
var Qe = ht("div", "dayContainer");
|
|
24916
|
-
return Qe.appendChild(
|
|
24920
|
+
return Qe.appendChild(T), Qe;
|
|
24917
24921
|
}
|
|
24918
24922
|
function H() {
|
|
24919
24923
|
if (e.daysContainer !== void 0) {
|
|
@@ -24946,8 +24950,8 @@ function qS(n, t) {
|
|
|
24946
24950
|
}), ot(), W = e.monthsDropdownContainer);
|
|
24947
24951
|
var R = Do("cur-year", { tabindex: "-1" }), I = R.getElementsByTagName("input")[0];
|
|
24948
24952
|
I.setAttribute("aria-label", e.l10n.yearAriaLabel), e.config.minDate && I.setAttribute("min", e.config.minDate.getFullYear().toString()), e.config.maxDate && (I.setAttribute("max", e.config.maxDate.getFullYear().toString()), I.disabled = !!e.config.minDate && e.config.minDate.getFullYear() === e.config.maxDate.getFullYear());
|
|
24949
|
-
var
|
|
24950
|
-
return
|
|
24953
|
+
var T = ht("div", "flatpickr-current-month");
|
|
24954
|
+
return T.appendChild(W), T.appendChild(R), Z.appendChild(T), v.appendChild(Z), {
|
|
24951
24955
|
container: v,
|
|
24952
24956
|
yearElement: I,
|
|
24953
24957
|
monthElement: W
|
|
@@ -24967,14 +24971,14 @@ function qS(n, t) {
|
|
|
24967
24971
|
return e.__hidePrevMonthArrow;
|
|
24968
24972
|
},
|
|
24969
24973
|
set: function(v) {
|
|
24970
|
-
e.__hidePrevMonthArrow !== v && (
|
|
24974
|
+
e.__hidePrevMonthArrow !== v && (te(e.prevMonthNav, "flatpickr-disabled", v), e.__hidePrevMonthArrow = v);
|
|
24971
24975
|
}
|
|
24972
24976
|
}), Object.defineProperty(e, "_hideNextMonthArrow", {
|
|
24973
24977
|
get: function() {
|
|
24974
24978
|
return e.__hideNextMonthArrow;
|
|
24975
24979
|
},
|
|
24976
24980
|
set: function(v) {
|
|
24977
|
-
e.__hideNextMonthArrow !== v && (
|
|
24981
|
+
e.__hideNextMonthArrow !== v && (te(e.nextMonthNav, "flatpickr-disabled", v), e.__hideNextMonthArrow = v);
|
|
24978
24982
|
}
|
|
24979
24983
|
}), e.currentYearElement = e.yearElements[0], ko(), e.monthNav;
|
|
24980
24984
|
}
|
|
@@ -25033,8 +25037,8 @@ function qS(n, t) {
|
|
|
25033
25037
|
}
|
|
25034
25038
|
function Hn(v, Z) {
|
|
25035
25039
|
if (v === void 0 && (v = !0), Z === void 0 && (Z = !0), e.input.value = "", e.altInput !== void 0 && (e.altInput.value = ""), e.mobileInput !== void 0 && (e.mobileInput.value = ""), e.selectedDates = [], e.latestSelectedDateObj = void 0, Z === !0 && (e.currentYear = e._initialDate.getFullYear(), e.currentMonth = e._initialDate.getMonth()), e.config.enableTime === !0) {
|
|
25036
|
-
var W = tc(e.config), R = W.hours, I = W.minutes,
|
|
25037
|
-
f(R, I,
|
|
25040
|
+
var W = tc(e.config), R = W.hours, I = W.minutes, T = W.seconds;
|
|
25041
|
+
f(R, I, T);
|
|
25038
25042
|
}
|
|
25039
25043
|
e.redraw(), v && Lt("onChange");
|
|
25040
25044
|
}
|
|
@@ -25099,10 +25103,10 @@ function qS(n, t) {
|
|
|
25099
25103
|
}
|
|
25100
25104
|
function Ne(v) {
|
|
25101
25105
|
if (e.isOpen && !e.config.inline) {
|
|
25102
|
-
var Z = pe(v), W = Ce(Z), R = Z === e.input || Z === e.altInput || e.element.contains(Z) || v.path && v.path.indexOf && (~v.path.indexOf(e.input) || ~v.path.indexOf(e.altInput)), I = !R && !W && !Ce(v.relatedTarget),
|
|
25106
|
+
var Z = pe(v), W = Ce(Z), R = Z === e.input || Z === e.altInput || e.element.contains(Z) || v.path && v.path.indexOf && (~v.path.indexOf(e.input) || ~v.path.indexOf(e.altInput)), I = !R && !W && !Ce(v.relatedTarget), T = !e.config.ignoredFocusElements.some(function($) {
|
|
25103
25107
|
return $.contains(Z);
|
|
25104
25108
|
});
|
|
25105
|
-
I &&
|
|
25109
|
+
I && T && (e.config.allowInput && e.setDate(e._input.value, !1, e.config.altInput ? e.config.altFormat : e.config.dateFormat), e.timeContainer !== void 0 && e.minuteElement !== void 0 && e.hourElement !== void 0 && e.input.value !== "" && e.input.value !== void 0 && l(), e.close(), e.config && e.config.mode === "range" && e.selectedDates.length === 1 && e.clear(!1));
|
|
25106
25110
|
}
|
|
25107
25111
|
}
|
|
25108
25112
|
function yo(v) {
|
|
@@ -25121,8 +25125,8 @@ function qS(n, t) {
|
|
|
25121
25125
|
return !0;
|
|
25122
25126
|
if (R === void 0)
|
|
25123
25127
|
return !1;
|
|
25124
|
-
for (var I = !!e.config.enable,
|
|
25125
|
-
if (O =
|
|
25128
|
+
for (var I = !!e.config.enable, T = (W = e.config.enable) !== null && W !== void 0 ? W : e.config.disable, $ = 0, O = void 0; $ < T.length; $++) {
|
|
25129
|
+
if (O = T[$], typeof O == "function" && O(R))
|
|
25126
25130
|
return I;
|
|
25127
25131
|
if (O instanceof Date && R !== void 0 && O.getTime() === R.getTime())
|
|
25128
25132
|
return I;
|
|
@@ -25142,12 +25146,12 @@ function qS(n, t) {
|
|
|
25142
25146
|
Z && W && !(v.relatedTarget && Ce(v.relatedTarget)) && e.setDate(e._input.value, !0, v.target === e.altInput ? e.config.altFormat : e.config.dateFormat);
|
|
25143
25147
|
}
|
|
25144
25148
|
function qd(v) {
|
|
25145
|
-
var Z = pe(v), W = e.config.wrap ? n.contains(Z) : Z === e._input, R = e.config.allowInput, I = e.isOpen && (!R || !W),
|
|
25149
|
+
var Z = pe(v), W = e.config.wrap ? n.contains(Z) : Z === e._input, R = e.config.allowInput, I = e.isOpen && (!R || !W), T = e.config.inline && W && !R;
|
|
25146
25150
|
if (v.keyCode === 13 && W) {
|
|
25147
25151
|
if (R)
|
|
25148
25152
|
return e.setDate(e._input.value, !0, Z === e.altInput ? e.config.altFormat : e.config.dateFormat), e.close(), Z.blur();
|
|
25149
25153
|
e.open();
|
|
25150
|
-
} else if (Ce(Z) || I ||
|
|
25154
|
+
} else if (Ce(Z) || I || T) {
|
|
25151
25155
|
var $ = !!e.timeContainer && e.timeContainer.contains(Z);
|
|
25152
25156
|
switch (v.keyCode) {
|
|
25153
25157
|
case 13:
|
|
@@ -25210,8 +25214,8 @@ function qS(n, t) {
|
|
|
25210
25214
|
}
|
|
25211
25215
|
function xo(v, Z) {
|
|
25212
25216
|
if (Z === void 0 && (Z = "flatpickr-day"), !(e.selectedDates.length !== 1 || v && (!v.classList.contains(Z) || v.classList.contains("flatpickr-disabled")))) {
|
|
25213
|
-
for (var W = v ? v.dateObj.getTime() : e.days.firstElementChild.dateObj.getTime(), R = e.parseDate(e.selectedDates[0], void 0, !0).getTime(), I = Math.min(W, e.selectedDates[0].getTime()),
|
|
25214
|
-
wi(new Date(P), !0) || ($ = $ || P > I && P <
|
|
25217
|
+
for (var W = v ? v.dateObj.getTime() : e.days.firstElementChild.dateObj.getTime(), R = e.parseDate(e.selectedDates[0], void 0, !0).getTime(), I = Math.min(W, e.selectedDates[0].getTime()), T = Math.max(W, e.selectedDates[0].getTime()), $ = !1, O = 0, nt = 0, P = I; P < T; P += QS.DAY)
|
|
25218
|
+
wi(new Date(P), !0) || ($ = $ || P > I && P < T, P < R && (!O || P > O) ? O = P : P > R && (!nt || P < nt) && (nt = P));
|
|
25215
25219
|
var U = Array.from(e.rContainer.querySelectorAll("*:nth-child(-n+" + e.config.showMonths + ") > ." + Z));
|
|
25216
25220
|
U.forEach(function(yt) {
|
|
25217
25221
|
var Qe = yt.dateObj, fe = Qe.getTime(), es = O > 0 && fe < O || nt > 0 && fe > nt;
|
|
@@ -25293,8 +25297,8 @@ function qS(n, t) {
|
|
|
25293
25297
|
W.dateFormat = Z.noCalendar || R ? "H:i" + (Z.enableSeconds ? ":S" : "") : I + " H:i" + (Z.enableSeconds ? ":S" : "");
|
|
25294
25298
|
}
|
|
25295
25299
|
if (Z.altInput && (Z.enableTime || R) && !Z.altFormat) {
|
|
25296
|
-
var
|
|
25297
|
-
W.altFormat = Z.noCalendar || R ? "h:i" + (Z.enableSeconds ? ":S K" : " K") :
|
|
25300
|
+
var T = Nt.defaultConfig.altFormat || Rr.altFormat;
|
|
25301
|
+
W.altFormat = Z.noCalendar || R ? "h:i" + (Z.enableSeconds ? ":S K" : " K") : T + (" h:i" + (Z.enableSeconds ? ":S" : "") + " K");
|
|
25298
25302
|
}
|
|
25299
25303
|
Object.defineProperty(e.config, "minDate", {
|
|
25300
25304
|
get: function() {
|
|
@@ -25352,12 +25356,12 @@ function qS(n, t) {
|
|
|
25352
25356
|
Lt("onPreCalendarPosition");
|
|
25353
25357
|
var Z = v || e._positionElement, W = Array.prototype.reduce.call(e.calendarContainer.children, function(Yg, Vg) {
|
|
25354
25358
|
return Yg + Vg.offsetHeight;
|
|
25355
|
-
}, 0), R = e.calendarContainer.offsetWidth, I = e.config.position.split(" "),
|
|
25356
|
-
if (
|
|
25359
|
+
}, 0), R = e.calendarContainer.offsetWidth, I = e.config.position.split(" "), T = I[0], $ = I.length > 1 ? I[1] : null, O = Z.getBoundingClientRect(), nt = window.innerHeight - O.bottom, P = T === "above" || T !== "below" && nt < W && O.top > W, U = window.pageYOffset + O.top + (P ? -W - 2 : Z.offsetHeight + 2);
|
|
25360
|
+
if (te(e.calendarContainer, "arrowTop", !P), te(e.calendarContainer, "arrowBottom", P), !e.config.inline) {
|
|
25357
25361
|
var yt = window.pageXOffset + O.left, Qe = !1, fe = !1;
|
|
25358
|
-
$ === "center" ? (yt -= (R - O.width) / 2, Qe = !0) : $ === "right" && (yt -= R - O.width, fe = !0),
|
|
25362
|
+
$ === "center" ? (yt -= (R - O.width) / 2, Qe = !0) : $ === "right" && (yt -= R - O.width, fe = !0), te(e.calendarContainer, "arrowLeft", !Qe && !fe), te(e.calendarContainer, "arrowCenter", Qe), te(e.calendarContainer, "arrowRight", fe);
|
|
25359
25363
|
var es = window.document.body.offsetWidth - (window.pageXOffset + O.right), hr = yt + R > window.document.body.offsetWidth, Xg = es + R > window.document.body.offsetWidth;
|
|
25360
|
-
if (
|
|
25364
|
+
if (te(e.calendarContainer, "rightMost", hr), !e.config.static)
|
|
25361
25365
|
if (e.calendarContainer.style.top = U + "px", !hr)
|
|
25362
25366
|
e.calendarContainer.style.left = yt + "px", e.calendarContainer.style.right = "auto";
|
|
25363
25367
|
else if (!Xg)
|
|
@@ -25367,7 +25371,7 @@ function qS(n, t) {
|
|
|
25367
25371
|
if (wl === void 0)
|
|
25368
25372
|
return;
|
|
25369
25373
|
var _g = window.document.body.offsetWidth, Wg = Math.max(0, _g / 2 - R / 2), Sg = ".flatpickr-calendar.centerMost:before", Gg = ".flatpickr-calendar.centerMost:after", Rg = wl.cssRules.length, Lg = "{left:" + O.left + "px;right:auto;}";
|
|
25370
|
-
|
|
25374
|
+
te(e.calendarContainer, "rightMost", !1), te(e.calendarContainer, "centerMost", !0), wl.insertRule(Sg + "," + Gg + Lg, Rg), e.calendarContainer.style.left = Wg + "px", e.calendarContainer.style.right = "auto";
|
|
25371
25375
|
}
|
|
25372
25376
|
}
|
|
25373
25377
|
}
|
|
@@ -25403,7 +25407,7 @@ function qS(n, t) {
|
|
|
25403
25407
|
return U.classList && U.classList.contains("flatpickr-day") && !U.classList.contains("flatpickr-disabled") && !U.classList.contains("notAllowed");
|
|
25404
25408
|
}, W = sg(pe(v), Z);
|
|
25405
25409
|
if (W !== void 0) {
|
|
25406
|
-
var R = W, I = e.latestSelectedDateObj = new Date(R.dateObj.getTime()),
|
|
25410
|
+
var R = W, I = e.latestSelectedDateObj = new Date(R.dateObj.getTime()), T = (I.getMonth() < e.currentMonth || I.getMonth() > e.currentMonth + e.config.showMonths - 1) && e.config.mode !== "range";
|
|
25407
25411
|
if (e.selectedDateElem = R, e.config.mode === "single")
|
|
25408
25412
|
e.selectedDates = [I];
|
|
25409
25413
|
else if (e.config.mode === "multiple") {
|
|
@@ -25412,11 +25416,11 @@ function qS(n, t) {
|
|
|
25412
25416
|
} else e.config.mode === "range" && (e.selectedDates.length === 2 && e.clear(!1, !1), e.latestSelectedDateObj = I, e.selectedDates.push(I), me(I, e.selectedDates[0], !0) !== 0 && e.selectedDates.sort(function(U, yt) {
|
|
25413
25417
|
return U.getTime() - yt.getTime();
|
|
25414
25418
|
}));
|
|
25415
|
-
if (u(),
|
|
25419
|
+
if (u(), T) {
|
|
25416
25420
|
var O = e.currentYear !== I.getFullYear();
|
|
25417
25421
|
e.currentYear = I.getFullYear(), e.currentMonth = I.getMonth(), O && (Lt("onYearChange"), ot()), Lt("onMonthChange");
|
|
25418
25422
|
}
|
|
25419
|
-
if (ko(), H(), yn(), !
|
|
25423
|
+
if (ko(), H(), yn(), !T && e.config.mode !== "range" && e.config.showMonths === 1 ? G(R) : e.selectedDateElem !== void 0 && e.hourElement === void 0 && e.selectedDateElem && e.selectedDateElem.focus(), e.hourElement !== void 0 && e.hourElement !== void 0 && e.hourElement.focus(), e.config.closeOnSelect) {
|
|
25420
25424
|
var nt = e.config.mode === "single" && !e.config.enableTime, P = e.config.mode === "range" && e.selectedDates.length === 2 && !e.config.enableTime;
|
|
25421
25425
|
(nt || P) && yl();
|
|
25422
25426
|
}
|
|
@@ -25576,10 +25580,10 @@ function qS(n, t) {
|
|
|
25576
25580
|
v.preventDefault();
|
|
25577
25581
|
var Z = v.type === "keydown", W = pe(v), R = W;
|
|
25578
25582
|
e.amPM !== void 0 && W === e.amPM && (e.amPM.textContent = e.l10n.amPM[We(e.amPM.textContent === e.l10n.amPM[0])]);
|
|
25579
|
-
var I = parseFloat(R.getAttribute("min")),
|
|
25583
|
+
var I = parseFloat(R.getAttribute("min")), T = parseFloat(R.getAttribute("max")), $ = parseFloat(R.getAttribute("step")), O = parseInt(R.value, 10), nt = v.delta || (Z ? v.which === 38 ? 1 : -1 : 0), P = O + $ * nt;
|
|
25580
25584
|
if (typeof R.value < "u" && R.value.length === 2) {
|
|
25581
25585
|
var U = R === e.hourElement, yt = R === e.minuteElement;
|
|
25582
|
-
P < I ? (P =
|
|
25586
|
+
P < I ? (P = T + P + We(!U) + (We(U) && We(!e.amPM)), yt && k(void 0, -1, e.hourElement)) : P > T && (P = R === e.hourElement ? P - T - We(!e.amPM) : I, yt && k(void 0, 1, e.hourElement)), e.amPM && U && ($ === 1 ? P + O === 23 : Math.abs(P - O) > $) && (e.amPM.textContent = e.l10n.amPM[We(e.amPM.textContent === e.l10n.amPM[0])]), R.value = ae(P);
|
|
25583
25587
|
}
|
|
25584
25588
|
}
|
|
25585
25589
|
return r(), e;
|
|
@@ -25638,7 +25642,7 @@ const ag = (n) => n.map((t) => ({ label: t.label, value: t.label })), lg = (n, t
|
|
|
25638
25642
|
dateTo: new Date(s.dateTo ?? i)
|
|
25639
25643
|
} : r;
|
|
25640
25644
|
};
|
|
25641
|
-
function
|
|
25645
|
+
function t5(n, t, e, i, r) {
|
|
25642
25646
|
var a;
|
|
25643
25647
|
if (Oo(t) && Oo(e)) {
|
|
25644
25648
|
const l = ag(r), c = (a = l.find((h) => h.value === n)) == null ? void 0 : a.value;
|
|
@@ -25675,7 +25679,7 @@ function tG(n, t, e, i, r) {
|
|
|
25675
25679
|
function Oo(n) {
|
|
25676
25680
|
return n === void 0 || n === "";
|
|
25677
25681
|
}
|
|
25678
|
-
const ls = "Custom",
|
|
25682
|
+
const ls = "Custom", e5 = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size: { width: n, height: "3rem" }, layout: "horizontal", children: /* @__PURE__ */ m("div", { style: { width: n }, children: /* @__PURE__ */ m(n5, { ...t }) }) }), n5 = ({
|
|
25679
25683
|
dateRangeOptions: n,
|
|
25680
25684
|
earliestDate: t = "1900-01-01",
|
|
25681
25685
|
initialValue: e,
|
|
@@ -25683,7 +25687,7 @@ const ls = "Custom", eG = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size:
|
|
|
25683
25687
|
initialDateFrom: r,
|
|
25684
25688
|
initialDateTo: s
|
|
25685
25689
|
}) => {
|
|
25686
|
-
const o =
|
|
25690
|
+
const o = t5(
|
|
25687
25691
|
e,
|
|
25688
25692
|
r,
|
|
25689
25693
|
s,
|
|
@@ -25695,7 +25699,7 @@ const ls = "Custom", eG = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size:
|
|
|
25695
25699
|
dateFrom: o.initialSelectedDateFrom,
|
|
25696
25700
|
dateTo: o.initialSelectedDateTo
|
|
25697
25701
|
});
|
|
25698
|
-
|
|
25702
|
+
Qt(() => {
|
|
25699
25703
|
const G = {
|
|
25700
25704
|
allowInput: !0,
|
|
25701
25705
|
dateFormat: "Y-m-d"
|
|
@@ -25797,10 +25801,10 @@ const ls = "Custom", eG = ({ width: n, ...t }) => /* @__PURE__ */ m(Me, { size:
|
|
|
25797
25801
|
] })
|
|
25798
25802
|
] });
|
|
25799
25803
|
};
|
|
25800
|
-
var
|
|
25801
|
-
for (var r = i > 1 ? void 0 : i ?
|
|
25804
|
+
var i5 = Object.defineProperty, r5 = Object.getOwnPropertyDescriptor, xi = (n, t, e, i) => {
|
|
25805
|
+
for (var r = i > 1 ? void 0 : i ? r5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
|
|
25802
25806
|
(o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
|
|
25803
|
-
return i && r &&
|
|
25807
|
+
return i && r && i5(t, e, r), r;
|
|
25804
25808
|
};
|
|
25805
25809
|
let Cn = class extends Ye {
|
|
25806
25810
|
constructor() {
|
|
@@ -25808,7 +25812,7 @@ let Cn = class extends Ye {
|
|
|
25808
25812
|
}
|
|
25809
25813
|
render() {
|
|
25810
25814
|
return /* @__PURE__ */ m(
|
|
25811
|
-
|
|
25815
|
+
e5,
|
|
25812
25816
|
{
|
|
25813
25817
|
dateRangeOptions: this.dateRangeOptions,
|
|
25814
25818
|
earliestDate: this.earliestDate,
|
|
@@ -25845,13 +25849,13 @@ xi([
|
|
|
25845
25849
|
Cn = xi([
|
|
25846
25850
|
ke("gs-date-range-selector")
|
|
25847
25851
|
], Cn);
|
|
25848
|
-
async function
|
|
25852
|
+
async function s5(n, t, e) {
|
|
25849
25853
|
const i = Array(n.length - 1).fill(0).map((a, l) => l + 1).map((a) => n.slice(a).reduce((l, c) => ({ ...l, [c]: null }), {}));
|
|
25850
25854
|
return [...(await new er({}, n).evaluate(t, e)).content.map((a) => n.reduce((l, c) => ({ ...l, [c]: a[c] }), {})).reduce((a, l) => (a.add(JSON.stringify(l)), i.forEach((c) => {
|
|
25851
25855
|
a.add(JSON.stringify({ ...l, ...c }));
|
|
25852
|
-
}), a), /* @__PURE__ */ new Set())].map((a) => JSON.parse(a)).sort(
|
|
25856
|
+
}), a), /* @__PURE__ */ new Set())].map((a) => JSON.parse(a)).sort(o5(n));
|
|
25853
25857
|
}
|
|
25854
|
-
function
|
|
25858
|
+
function o5(n) {
|
|
25855
25859
|
return (t, e) => {
|
|
25856
25860
|
for (const i of n) {
|
|
25857
25861
|
const r = t[i], s = e[i];
|
|
@@ -25861,11 +25865,11 @@ function oG(n) {
|
|
|
25861
25865
|
return 0;
|
|
25862
25866
|
};
|
|
25863
25867
|
}
|
|
25864
|
-
const
|
|
25868
|
+
const a5 = ({ width: n, ...t }) => {
|
|
25865
25869
|
const e = { width: n, height: "3rem" };
|
|
25866
|
-
return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(
|
|
25867
|
-
},
|
|
25868
|
-
const i = Ct(jt), [r, s] = it(n ?? ""), [o, a] = it(!1), l = Mt(null), { data: c, error: d, isLoading: u } = Nn(() =>
|
|
25870
|
+
return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(l5, { ...t }) }) });
|
|
25871
|
+
}, l5 = ({ initialValue: n, fields: t, placeholderText: e }) => {
|
|
25872
|
+
const i = Ct(jt), [r, s] = it(n ?? ""), [o, a] = it(!1), l = Mt(null), { data: c, error: d, isLoading: u } = Nn(() => s5(t, i), [t, i]);
|
|
25869
25873
|
if (u)
|
|
25870
25874
|
return /* @__PURE__ */ m(Ue, {});
|
|
25871
25875
|
if (d)
|
|
@@ -25882,8 +25886,8 @@ const aG = ({ width: n, ...t }) => {
|
|
|
25882
25886
|
const p = f.currentTarget.value;
|
|
25883
25887
|
if (s(p), p.trim() === r.trim() && p !== "")
|
|
25884
25888
|
return;
|
|
25885
|
-
const b =
|
|
25886
|
-
|
|
25889
|
+
const b = c5(p, t);
|
|
25890
|
+
d5(b) || u5(c, b) ? ((g = l.current) == null || g.dispatchEvent(
|
|
25887
25891
|
new CustomEvent("gs-location-changed", {
|
|
25888
25892
|
detail: b,
|
|
25889
25893
|
bubbles: !0,
|
|
@@ -25900,16 +25904,16 @@ const aG = ({ width: n, ...t }) => {
|
|
|
25900
25904
|
return /* @__PURE__ */ m("option", { value: p }, p);
|
|
25901
25905
|
}) })
|
|
25902
25906
|
] });
|
|
25903
|
-
},
|
|
25907
|
+
}, c5 = (n, t) => {
|
|
25904
25908
|
if (n === "")
|
|
25905
25909
|
return t.reduce((i, r) => ({ ...i, [r]: void 0 }), {});
|
|
25906
25910
|
const e = n.split("/").map((i) => i.trim());
|
|
25907
25911
|
return t.reduce((i, r, s) => ({ ...i, [r]: e[s] }), {});
|
|
25908
|
-
},
|
|
25909
|
-
var
|
|
25910
|
-
for (var r = i > 1 ? void 0 : i ?
|
|
25912
|
+
}, d5 = (n) => Object.values(n).every((t) => t === void 0), u5 = (n, t) => n === null ? !1 : Object.entries(t).filter(([, i]) => i !== void 0).reduce((i, [r, s]) => i.filter((o) => o[r] === s), n).length > 0;
|
|
25913
|
+
var h5 = Object.defineProperty, f5 = Object.getOwnPropertyDescriptor, mo = (n, t, e, i) => {
|
|
25914
|
+
for (var r = i > 1 ? void 0 : i ? f5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
|
|
25911
25915
|
(o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
|
|
25912
|
-
return i && r &&
|
|
25916
|
+
return i && r && h5(t, e, r), r;
|
|
25913
25917
|
};
|
|
25914
25918
|
let Kr = class extends Ye {
|
|
25915
25919
|
constructor() {
|
|
@@ -25917,7 +25921,7 @@ let Kr = class extends Ye {
|
|
|
25917
25921
|
}
|
|
25918
25922
|
render() {
|
|
25919
25923
|
return /* @__PURE__ */ m(
|
|
25920
|
-
|
|
25924
|
+
a5,
|
|
25921
25925
|
{
|
|
25922
25926
|
initialValue: this.initialValue,
|
|
25923
25927
|
fields: this.fields,
|
|
@@ -25942,14 +25946,14 @@ mo([
|
|
|
25942
25946
|
Kr = mo([
|
|
25943
25947
|
ke("gs-location-filter")
|
|
25944
25948
|
], Kr);
|
|
25945
|
-
async function
|
|
25949
|
+
async function p5(n, t, e) {
|
|
25946
25950
|
return (await new er({}, [t]).evaluate(n, e)).content.map((s) => s[t]);
|
|
25947
25951
|
}
|
|
25948
|
-
const
|
|
25952
|
+
const m5 = ({ width: n, ...t }) => {
|
|
25949
25953
|
const e = { width: n, height: "3rem" };
|
|
25950
|
-
return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(
|
|
25951
|
-
},
|
|
25952
|
-
const i = Ct(jt), r = Mt(null), { data: s, error: o, isLoading: a } = Nn(() =>
|
|
25954
|
+
return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(b5, { ...t }) }) });
|
|
25955
|
+
}, b5 = ({ lapisField: n, placeholderText: t, initialValue: e }) => {
|
|
25956
|
+
const i = Ct(jt), r = Mt(null), { data: s, error: o, isLoading: a } = Nn(() => p5(i, n), [n, i]);
|
|
25953
25957
|
if (a)
|
|
25954
25958
|
return /* @__PURE__ */ m(Ue, {});
|
|
25955
25959
|
if (o !== null)
|
|
@@ -25983,10 +25987,10 @@ const mG = ({ width: n, ...t }) => {
|
|
|
25983
25987
|
/* @__PURE__ */ m("datalist", { id: n, children: s.map((d) => /* @__PURE__ */ m("option", { value: d }, d)) })
|
|
25984
25988
|
] });
|
|
25985
25989
|
};
|
|
25986
|
-
var
|
|
25987
|
-
for (var r = i > 1 ? void 0 : i ?
|
|
25990
|
+
var g5 = Object.defineProperty, y5 = Object.getOwnPropertyDescriptor, bo = (n, t, e, i) => {
|
|
25991
|
+
for (var r = i > 1 ? void 0 : i ? y5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
|
|
25988
25992
|
(o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
|
|
25989
|
-
return i && r &&
|
|
25993
|
+
return i && r && g5(t, e, r), r;
|
|
25990
25994
|
};
|
|
25991
25995
|
let jr = class extends Ye {
|
|
25992
25996
|
constructor() {
|
|
@@ -25994,7 +25998,7 @@ let jr = class extends Ye {
|
|
|
25994
25998
|
}
|
|
25995
25999
|
render() {
|
|
25996
26000
|
return /* @__PURE__ */ m(
|
|
25997
|
-
|
|
26001
|
+
m5,
|
|
25998
26002
|
{
|
|
25999
26003
|
lapisField: this.lapisField,
|
|
26000
26004
|
placeholderText: this.placeholderText,
|
|
@@ -26019,20 +26023,20 @@ bo([
|
|
|
26019
26023
|
jr = bo([
|
|
26020
26024
|
ke("gs-text-input")
|
|
26021
26025
|
], jr);
|
|
26022
|
-
const
|
|
26026
|
+
const v5 = ({ children: n }) => {
|
|
26023
26027
|
const t = Ct(Ur);
|
|
26024
|
-
return
|
|
26028
|
+
return x5(t) ? /* @__PURE__ */ m("div", { className: "laoding loading-spinner loading-md", children: "Loading..." }) : /* @__PURE__ */ m(Gt, { children: n });
|
|
26025
26029
|
};
|
|
26026
|
-
function
|
|
26030
|
+
function x5(n) {
|
|
26027
26031
|
return n.nucleotideSequences.length === 0 && n.genes.length === 0;
|
|
26028
26032
|
}
|
|
26029
|
-
const
|
|
26033
|
+
const Z5 = () => {
|
|
26030
26034
|
const n = Ct(Ur), t = n.genes[0].name;
|
|
26031
26035
|
return /* @__PURE__ */ m(bi, { children: [
|
|
26032
26036
|
/* @__PURE__ */ m(gi, { children: " Mutation Filter" }),
|
|
26033
26037
|
/* @__PURE__ */ m(pt, { children: "This component allows you to filter for mutations at specific positions." }),
|
|
26034
26038
|
/* @__PURE__ */ m(qe, { children: " Nucleotide Mutations and Insertions" }),
|
|
26035
|
-
wp(n) ? /* @__PURE__ */ m(
|
|
26039
|
+
wp(n) ? /* @__PURE__ */ m(w5, {}) : /* @__PURE__ */ m(k5, {}),
|
|
26036
26040
|
/* @__PURE__ */ m(qe, { children: "Amino Acid Mutations and Insertions" }),
|
|
26037
26041
|
/* @__PURE__ */ m(pt, { children: [
|
|
26038
26042
|
"An amino acid mutation has the format ",
|
|
@@ -26126,7 +26130,7 @@ const ZG = () => {
|
|
|
26126
26130
|
" to filter for sequences for which it is confirmed that no mutation occurred, i.e. has the same base as the reference genome at the specified position."
|
|
26127
26131
|
] })
|
|
26128
26132
|
] });
|
|
26129
|
-
},
|
|
26133
|
+
}, w5 = () => /* @__PURE__ */ m(Gt, { children: [
|
|
26130
26134
|
/* @__PURE__ */ m(pt, { children: [
|
|
26131
26135
|
"This organism is single-segmented. Thus, nucleotide mutations have the format",
|
|
26132
26136
|
" ",
|
|
@@ -26168,7 +26172,7 @@ const ZG = () => {
|
|
|
26168
26172
|
/* @__PURE__ */ m("b", { children: "ins_1046:A" }),
|
|
26169
26173
|
" would filter for sequences with an insertion of A between the positions 1046 and 1047 in the nucleotide sequence."
|
|
26170
26174
|
] })
|
|
26171
|
-
] }),
|
|
26175
|
+
] }), k5 = () => {
|
|
26172
26176
|
const n = Ct(Ur), t = n.nucleotideSequences[0].name;
|
|
26173
26177
|
return /* @__PURE__ */ m(Gt, { children: [
|
|
26174
26178
|
/* @__PURE__ */ m(pt, { children: [
|
|
@@ -26234,9 +26238,10 @@ const ZG = () => {
|
|
|
26234
26238
|
}, ec = (n, t) => {
|
|
26235
26239
|
if (n === void 0)
|
|
26236
26240
|
return wp(t) ? "nucleotide" : void 0;
|
|
26237
|
-
|
|
26241
|
+
const e = n.toLowerCase();
|
|
26242
|
+
if (t.nucleotideSequences.some((i) => i.name.toLowerCase() === e))
|
|
26238
26243
|
return "nucleotide";
|
|
26239
|
-
if (t.genes.some((
|
|
26244
|
+
if (t.genes.some((i) => i.name.toLowerCase() === e))
|
|
26240
26245
|
return "amino acid";
|
|
26241
26246
|
}, Ac = (n, t) => {
|
|
26242
26247
|
const e = Bs.parse(n);
|
|
@@ -26270,9 +26275,9 @@ const ZG = () => {
|
|
|
26270
26275
|
return null;
|
|
26271
26276
|
}
|
|
26272
26277
|
return null;
|
|
26273
|
-
},
|
|
26278
|
+
}, X5 = ({ initialValue: n, width: t }) => /* @__PURE__ */ m(Me, { size: { height: "3.375rem", width: t }, layout: "horizontal", children: /* @__PURE__ */ m("div", { style: t, children: /* @__PURE__ */ m(_5, { initialValue: n }) }) }), _5 = ({ initialValue: n }) => {
|
|
26274
26279
|
const t = Ct(Ur), [e, i] = it(
|
|
26275
|
-
|
|
26280
|
+
W5(n, t)
|
|
26276
26281
|
), r = Mt(null), s = (a) => {
|
|
26277
26282
|
const l = {
|
|
26278
26283
|
...e,
|
|
@@ -26281,7 +26286,7 @@ const ZG = () => {
|
|
|
26281
26286
|
i(l), o(l);
|
|
26282
26287
|
}, o = (a) => {
|
|
26283
26288
|
var c;
|
|
26284
|
-
const l =
|
|
26289
|
+
const l = V5(a);
|
|
26285
26290
|
(c = r.current) == null || c.dispatchEvent(
|
|
26286
26291
|
new CustomEvent("gs-mutation-filter-changed", {
|
|
26287
26292
|
detail: l,
|
|
@@ -26291,10 +26296,10 @@ const ZG = () => {
|
|
|
26291
26296
|
);
|
|
26292
26297
|
};
|
|
26293
26298
|
return /* @__PURE__ */ m("div", { className: "w-full border border-gray-300 rounded-md relative", ref: r, children: [
|
|
26294
|
-
/* @__PURE__ */ m("div", { className: "absolute -top-3 -right-3 z-10", children: /* @__PURE__ */ m(
|
|
26299
|
+
/* @__PURE__ */ m("div", { className: "absolute -top-3 -right-3 z-10", children: /* @__PURE__ */ m(Z5, {}) }),
|
|
26295
26300
|
/* @__PURE__ */ m("div", { className: "relative w-full p-1", children: [
|
|
26296
26301
|
/* @__PURE__ */ m(
|
|
26297
|
-
|
|
26302
|
+
S5,
|
|
26298
26303
|
{
|
|
26299
26304
|
referenceGenome: t,
|
|
26300
26305
|
setSelectedFilters: (a) => {
|
|
@@ -26304,7 +26309,7 @@ const ZG = () => {
|
|
|
26304
26309
|
}
|
|
26305
26310
|
),
|
|
26306
26311
|
/* @__PURE__ */ m(
|
|
26307
|
-
|
|
26312
|
+
Y5,
|
|
26308
26313
|
{
|
|
26309
26314
|
selectedFilters: e,
|
|
26310
26315
|
handleRemoveValue: s
|
|
@@ -26313,7 +26318,7 @@ const ZG = () => {
|
|
|
26313
26318
|
] })
|
|
26314
26319
|
] });
|
|
26315
26320
|
};
|
|
26316
|
-
function
|
|
26321
|
+
function W5(n, t) {
|
|
26317
26322
|
return n === void 0 ? {
|
|
26318
26323
|
nucleotideMutations: [],
|
|
26319
26324
|
aminoAcidMutations: [],
|
|
@@ -26335,7 +26340,7 @@ function WG(n, t) {
|
|
|
26335
26340
|
}
|
|
26336
26341
|
);
|
|
26337
26342
|
}
|
|
26338
|
-
const
|
|
26343
|
+
const S5 = ({ referenceGenome: n, setSelectedFilters: t, selectedFilters: e }) => {
|
|
26339
26344
|
const [i, r] = it(null), [s, o] = it(""), a = Mt(null), l = (f) => {
|
|
26340
26345
|
if (f.includes(",") || f.includes(";"))
|
|
26341
26346
|
c(f);
|
|
@@ -26384,7 +26389,7 @@ const SG = ({ referenceGenome: n, setSelectedFilters: t, selectedFilters: e }) =
|
|
|
26384
26389
|
{
|
|
26385
26390
|
type: "text",
|
|
26386
26391
|
className: "w-full p-2 border-gray-300 border rounded-md",
|
|
26387
|
-
placeholder:
|
|
26392
|
+
placeholder: G5(n),
|
|
26388
26393
|
value: s,
|
|
26389
26394
|
onInput: (f) => {
|
|
26390
26395
|
l(f.target.value);
|
|
@@ -26405,16 +26410,16 @@ const SG = ({ referenceGenome: n, setSelectedFilters: t, selectedFilters: e }) =
|
|
|
26405
26410
|
)
|
|
26406
26411
|
] });
|
|
26407
26412
|
};
|
|
26408
|
-
function
|
|
26413
|
+
function G5(n) {
|
|
26409
26414
|
const t = n.nucleotideSequences.length > 1 ? `${n.nucleotideSequences[0].name}:` : "", e = n.genes[0].name;
|
|
26410
26415
|
return `Enter a mutation (e.g. ${t}A123T, ins_${t}123:AT, ${e}:M123E, ins_${e}:123:ME)`;
|
|
26411
26416
|
}
|
|
26412
|
-
const
|
|
26417
|
+
const R5 = {
|
|
26413
26418
|
aminoAcidMutations: ye("teal", 0.4),
|
|
26414
26419
|
nucleotideMutations: ye("green", 0.4),
|
|
26415
26420
|
aminoAcidInsertions: ye("purple", 0.4),
|
|
26416
26421
|
nucleotideInsertions: ye("indigo", 0.4)
|
|
26417
|
-
},
|
|
26422
|
+
}, L5 = (n) => R5[n.type] || "lightgray", Y5 = ({ selectedFilters: n, handleRemoveValue: t }) => /* @__PURE__ */ m("div", { className: "flex flex-wrap", children: [
|
|
26418
26423
|
n.nucleotideMutations.map((e) => /* @__PURE__ */ m(
|
|
26419
26424
|
Ko,
|
|
26420
26425
|
{
|
|
@@ -26453,7 +26458,7 @@ const RG = {
|
|
|
26453
26458
|
name: t.value.toString(),
|
|
26454
26459
|
className: "center p-2 m-1 inline-flex text-black rounded-md",
|
|
26455
26460
|
style: {
|
|
26456
|
-
backgroundColor:
|
|
26461
|
+
backgroundColor: L5(t)
|
|
26457
26462
|
},
|
|
26458
26463
|
children: [
|
|
26459
26464
|
t.value.toString(),
|
|
@@ -26462,7 +26467,7 @@ const RG = {
|
|
|
26462
26467
|
},
|
|
26463
26468
|
t.value.toString()
|
|
26464
26469
|
);
|
|
26465
|
-
function
|
|
26470
|
+
function V5(n) {
|
|
26466
26471
|
return {
|
|
26467
26472
|
aminoAcidMutations: n.aminoAcidMutations.map((t) => t.toString()),
|
|
26468
26473
|
nucleotideMutations: n.nucleotideMutations.map((t) => t.toString()),
|
|
@@ -26470,17 +26475,17 @@ function VG(n) {
|
|
|
26470
26475
|
nucleotideInsertions: n.nucleotideInsertions.map((t) => t.toString())
|
|
26471
26476
|
};
|
|
26472
26477
|
}
|
|
26473
|
-
var
|
|
26474
|
-
for (var r = i > 1 ? void 0 : i ?
|
|
26478
|
+
var I5 = Object.defineProperty, M5 = Object.getOwnPropertyDescriptor, Ud = (n, t, e, i) => {
|
|
26479
|
+
for (var r = i > 1 ? void 0 : i ? M5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
|
|
26475
26480
|
(o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
|
|
26476
|
-
return i && r &&
|
|
26481
|
+
return i && r && I5(t, e, r), r;
|
|
26477
26482
|
};
|
|
26478
26483
|
let Na = class extends Ye {
|
|
26479
26484
|
constructor() {
|
|
26480
26485
|
super(...arguments), this.initialValue = void 0, this.width = "100%";
|
|
26481
26486
|
}
|
|
26482
26487
|
render() {
|
|
26483
|
-
return /* @__PURE__ */ m(
|
|
26488
|
+
return /* @__PURE__ */ m(v5, { children: /* @__PURE__ */ m(X5, { initialValue: this.initialValue, width: this.width }) });
|
|
26484
26489
|
}
|
|
26485
26490
|
};
|
|
26486
26491
|
Ud([
|
|
@@ -26492,19 +26497,19 @@ Ud([
|
|
|
26492
26497
|
Na = Ud([
|
|
26493
26498
|
ke("gs-mutation-filter")
|
|
26494
26499
|
], Na);
|
|
26495
|
-
async function
|
|
26500
|
+
async function C5(n, t, e) {
|
|
26496
26501
|
return (await new er({}, [t]).evaluate(n, e)).content.flatMap((s) => [s[t], `${s[t]}*`]).sort();
|
|
26497
26502
|
}
|
|
26498
|
-
const
|
|
26503
|
+
const N5 = ({ width: n, ...t }) => {
|
|
26499
26504
|
const e = { width: n, height: "3rem" };
|
|
26500
|
-
return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(
|
|
26501
|
-
},
|
|
26505
|
+
return /* @__PURE__ */ m(Me, { size: e, layout: "horizontal", children: /* @__PURE__ */ m(Be, { size: e, children: /* @__PURE__ */ m(T5, { ...t }) }) });
|
|
26506
|
+
}, T5 = ({
|
|
26502
26507
|
lapisField: n,
|
|
26503
26508
|
placeholderText: t,
|
|
26504
26509
|
initialValue: e
|
|
26505
26510
|
}) => {
|
|
26506
26511
|
const i = Ct(jt), r = Mt(null), { data: s, error: o, isLoading: a } = Nn(
|
|
26507
|
-
() =>
|
|
26512
|
+
() => C5(i, n),
|
|
26508
26513
|
[n, i]
|
|
26509
26514
|
);
|
|
26510
26515
|
if (a)
|
|
@@ -26540,10 +26545,10 @@ const NG = ({ width: n, ...t }) => {
|
|
|
26540
26545
|
/* @__PURE__ */ m("datalist", { id: n, children: s.map((d) => /* @__PURE__ */ m("option", { value: d }, d)) })
|
|
26541
26546
|
] });
|
|
26542
26547
|
};
|
|
26543
|
-
var
|
|
26544
|
-
for (var r = i > 1 ? void 0 : i ?
|
|
26548
|
+
var z5 = Object.defineProperty, F5 = Object.getOwnPropertyDescriptor, go = (n, t, e, i) => {
|
|
26549
|
+
for (var r = i > 1 ? void 0 : i ? F5(t, e) : t, s = n.length - 1, o; s >= 0; s--)
|
|
26545
26550
|
(o = n[s]) && (r = (i ? o(t, e, r) : o(r)) || r);
|
|
26546
|
-
return i && r &&
|
|
26551
|
+
return i && r && z5(t, e, r), r;
|
|
26547
26552
|
};
|
|
26548
26553
|
let Jr = class extends Ye {
|
|
26549
26554
|
constructor() {
|
|
@@ -26551,7 +26556,7 @@ let Jr = class extends Ye {
|
|
|
26551
26556
|
}
|
|
26552
26557
|
render() {
|
|
26553
26558
|
return /* @__PURE__ */ m(
|
|
26554
|
-
|
|
26559
|
+
N5,
|
|
26555
26560
|
{
|
|
26556
26561
|
lapisField: this.lapisField,
|
|
26557
26562
|
placeholderText: this.placeholderText,
|
|
@@ -26592,6 +26597,6 @@ export {
|
|
|
26592
26597
|
Je as RelativeGrowthAdvantageComponent,
|
|
26593
26598
|
jr as TextInputComponent,
|
|
26594
26599
|
Sr as UserFacingError,
|
|
26595
|
-
|
|
26600
|
+
P5 as dateRangeOptionPresets
|
|
26596
26601
|
};
|
|
26597
26602
|
//# sourceMappingURL=dashboard-components.js.map
|