@genspectrum/dashboard-components 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/mutationOverTimeWorker-BOCXtKzd.js.map +1 -1
- package/dist/dashboard-components.js +16 -4
- package/dist/dashboard-components.js.map +1 -1
- package/dist/genspectrum-components.d.ts +40 -40
- package/package.json +2 -2
- package/src/operator/SlidingOperator.ts +3 -0
- package/src/preact/components/error-display.tsx +1 -0
- package/src/preact/prevalenceOverTime/__mockData__/numeratorFilterNoData.json +11 -0
- package/src/preact/prevalenceOverTime/prevalence-over-time-bar-chart.tsx +13 -6
- package/src/preact/prevalenceOverTime/prevalence-over-time-bubble-chart.tsx +13 -6
- package/src/preact/prevalenceOverTime/prevalence-over-time-line-chart.tsx +13 -6
- package/src/preact/prevalenceOverTime/prevalence-over-time.stories.tsx +74 -11
- package/src/preact/prevalenceOverTime/prevalence-over-time.tsx +1 -1
- package/src/preact/relativeGrowthAdvantage/relative-growth-advantage.stories.tsx +12 -5
- package/standalone-bundle/dashboard-components.js +505 -493
- package/standalone-bundle/dashboard-components.js.map +1 -1
|
@@ -1115,7 +1115,7 @@ var O;
|
|
|
1115
1115
|
n.errToObj = (e) => typeof e == "string" ? { message: e } : e || {}, n.toString = (e) => typeof e == "string" ? e : e == null ? void 0 : e.message;
|
|
1116
1116
|
})(O || (O = {}));
|
|
1117
1117
|
var ds, Is;
|
|
1118
|
-
class
|
|
1118
|
+
class on {
|
|
1119
1119
|
constructor(e, t, i, o) {
|
|
1120
1120
|
this._cachedPath = [], this.parent = e, this.data = t, this._path = i, this._key = o;
|
|
1121
1121
|
}
|
|
@@ -1250,7 +1250,7 @@ class ne {
|
|
|
1250
1250
|
return this._refinement((i, o) => e(i) ? !0 : (o.addIssue(typeof t == "function" ? t(i, o) : t), !1));
|
|
1251
1251
|
}
|
|
1252
1252
|
_refinement(e) {
|
|
1253
|
-
return new
|
|
1253
|
+
return new zt({
|
|
1254
1254
|
schema: this,
|
|
1255
1255
|
typeName: j.ZodEffects,
|
|
1256
1256
|
effect: { type: "refinement", refinement: e }
|
|
@@ -1260,7 +1260,7 @@ class ne {
|
|
|
1260
1260
|
return this._refinement(e);
|
|
1261
1261
|
}
|
|
1262
1262
|
optional() {
|
|
1263
|
-
return
|
|
1263
|
+
return $t.create(this, this._def);
|
|
1264
1264
|
}
|
|
1265
1265
|
nullable() {
|
|
1266
1266
|
return oi.create(this, this._def);
|
|
@@ -1269,7 +1269,7 @@ class ne {
|
|
|
1269
1269
|
return this.nullable().optional();
|
|
1270
1270
|
}
|
|
1271
1271
|
array() {
|
|
1272
|
-
return
|
|
1272
|
+
return _t.create(this, this._def);
|
|
1273
1273
|
}
|
|
1274
1274
|
promise() {
|
|
1275
1275
|
return Yo.create(this, this._def);
|
|
@@ -1281,7 +1281,7 @@ class ne {
|
|
|
1281
1281
|
return _s.create(this, e, this._def);
|
|
1282
1282
|
}
|
|
1283
1283
|
transform(e) {
|
|
1284
|
-
return new
|
|
1284
|
+
return new zt({
|
|
1285
1285
|
...$(this._def),
|
|
1286
1286
|
schema: this,
|
|
1287
1287
|
typeName: j.ZodEffects,
|
|
@@ -1351,7 +1351,7 @@ function pC(n) {
|
|
|
1351
1351
|
function Yf(n, e) {
|
|
1352
1352
|
return !!((e === "v4" || !e) && Rf.test(n) || (e === "v6" || !e) && xf.test(n));
|
|
1353
1353
|
}
|
|
1354
|
-
class
|
|
1354
|
+
class Ft extends ne {
|
|
1355
1355
|
_parse(e) {
|
|
1356
1356
|
if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== _.string) {
|
|
1357
1357
|
const s = this._getOrReturnCtx(e);
|
|
@@ -1502,7 +1502,7 @@ class Nt extends ne {
|
|
|
1502
1502
|
});
|
|
1503
1503
|
}
|
|
1504
1504
|
_addCheck(e) {
|
|
1505
|
-
return new
|
|
1505
|
+
return new Ft({
|
|
1506
1506
|
...this._def,
|
|
1507
1507
|
checks: [...this._def.checks, e]
|
|
1508
1508
|
});
|
|
@@ -1628,19 +1628,19 @@ class Nt extends ne {
|
|
|
1628
1628
|
return this.min(1, O.errToObj(e));
|
|
1629
1629
|
}
|
|
1630
1630
|
trim() {
|
|
1631
|
-
return new
|
|
1631
|
+
return new Ft({
|
|
1632
1632
|
...this._def,
|
|
1633
1633
|
checks: [...this._def.checks, { kind: "trim" }]
|
|
1634
1634
|
});
|
|
1635
1635
|
}
|
|
1636
1636
|
toLowerCase() {
|
|
1637
|
-
return new
|
|
1637
|
+
return new Ft({
|
|
1638
1638
|
...this._def,
|
|
1639
1639
|
checks: [...this._def.checks, { kind: "toLowerCase" }]
|
|
1640
1640
|
});
|
|
1641
1641
|
}
|
|
1642
1642
|
toUpperCase() {
|
|
1643
|
-
return new
|
|
1643
|
+
return new Ft({
|
|
1644
1644
|
...this._def,
|
|
1645
1645
|
checks: [...this._def.checks, { kind: "toUpperCase" }]
|
|
1646
1646
|
});
|
|
@@ -1700,9 +1700,9 @@ class Nt extends ne {
|
|
|
1700
1700
|
return e;
|
|
1701
1701
|
}
|
|
1702
1702
|
}
|
|
1703
|
-
|
|
1703
|
+
Ft.create = (n) => {
|
|
1704
1704
|
var e;
|
|
1705
|
-
return new
|
|
1705
|
+
return new Ft({
|
|
1706
1706
|
checks: [],
|
|
1707
1707
|
typeName: j.ZodString,
|
|
1708
1708
|
coerce: (e = n == null ? void 0 : n.coerce) !== null && e !== void 0 ? e : !1,
|
|
@@ -2184,7 +2184,7 @@ Si.create = (n) => new Si({
|
|
|
2184
2184
|
typeName: j.ZodUnknown,
|
|
2185
2185
|
...$(n)
|
|
2186
2186
|
});
|
|
2187
|
-
class
|
|
2187
|
+
class Xn extends ne {
|
|
2188
2188
|
_parse(e) {
|
|
2189
2189
|
const t = this._getOrReturnCtx(e);
|
|
2190
2190
|
return F(t, {
|
|
@@ -2194,7 +2194,7 @@ class Vn extends ne {
|
|
|
2194
2194
|
}), E;
|
|
2195
2195
|
}
|
|
2196
2196
|
}
|
|
2197
|
-
|
|
2197
|
+
Xn.create = (n) => new Xn({
|
|
2198
2198
|
typeName: j.ZodNever,
|
|
2199
2199
|
...$(n)
|
|
2200
2200
|
});
|
|
@@ -2215,7 +2215,7 @@ ur.create = (n) => new ur({
|
|
|
2215
2215
|
typeName: j.ZodVoid,
|
|
2216
2216
|
...$(n)
|
|
2217
2217
|
});
|
|
2218
|
-
class
|
|
2218
|
+
class _t extends ne {
|
|
2219
2219
|
_parse(e) {
|
|
2220
2220
|
const { ctx: t, status: i } = this._processInputParams(e), o = this._def;
|
|
2221
2221
|
if (t.parsedType !== _.array)
|
|
@@ -2251,27 +2251,27 @@ class Kt extends ne {
|
|
|
2251
2251
|
exact: !1,
|
|
2252
2252
|
message: o.maxLength.message
|
|
2253
2253
|
}), i.dirty()), t.common.async)
|
|
2254
|
-
return Promise.all([...t.data].map((a, r) => o.type._parseAsync(new
|
|
2255
|
-
const s = [...t.data].map((a, r) => o.type._parseSync(new
|
|
2254
|
+
return Promise.all([...t.data].map((a, r) => o.type._parseAsync(new on(t, a, t.path, r)))).then((a) => Qe.mergeArray(i, a));
|
|
2255
|
+
const s = [...t.data].map((a, r) => o.type._parseSync(new on(t, a, t.path, r)));
|
|
2256
2256
|
return Qe.mergeArray(i, s);
|
|
2257
2257
|
}
|
|
2258
2258
|
get element() {
|
|
2259
2259
|
return this._def.type;
|
|
2260
2260
|
}
|
|
2261
2261
|
min(e, t) {
|
|
2262
|
-
return new
|
|
2262
|
+
return new _t({
|
|
2263
2263
|
...this._def,
|
|
2264
2264
|
minLength: { value: e, message: O.toString(t) }
|
|
2265
2265
|
});
|
|
2266
2266
|
}
|
|
2267
2267
|
max(e, t) {
|
|
2268
|
-
return new
|
|
2268
|
+
return new _t({
|
|
2269
2269
|
...this._def,
|
|
2270
2270
|
maxLength: { value: e, message: O.toString(t) }
|
|
2271
2271
|
});
|
|
2272
2272
|
}
|
|
2273
2273
|
length(e, t) {
|
|
2274
|
-
return new
|
|
2274
|
+
return new _t({
|
|
2275
2275
|
...this._def,
|
|
2276
2276
|
exactLength: { value: e, message: O.toString(t) }
|
|
2277
2277
|
});
|
|
@@ -2280,7 +2280,7 @@ class Kt extends ne {
|
|
|
2280
2280
|
return this.min(1, e);
|
|
2281
2281
|
}
|
|
2282
2282
|
}
|
|
2283
|
-
|
|
2283
|
+
_t.create = (n, e) => new _t({
|
|
2284
2284
|
type: n,
|
|
2285
2285
|
minLength: null,
|
|
2286
2286
|
maxLength: null,
|
|
@@ -2293,16 +2293,16 @@ function ho(n) {
|
|
|
2293
2293
|
const e = {};
|
|
2294
2294
|
for (const t in n.shape) {
|
|
2295
2295
|
const i = n.shape[t];
|
|
2296
|
-
e[t] =
|
|
2296
|
+
e[t] = $t.create(ho(i));
|
|
2297
2297
|
}
|
|
2298
2298
|
return new xe({
|
|
2299
2299
|
...n._def,
|
|
2300
2300
|
shape: () => e
|
|
2301
2301
|
});
|
|
2302
|
-
} else return n instanceof
|
|
2302
|
+
} else return n instanceof _t ? new _t({
|
|
2303
2303
|
...n._def,
|
|
2304
2304
|
type: ho(n.element)
|
|
2305
|
-
}) : n instanceof
|
|
2305
|
+
}) : n instanceof $t ? $t.create(ho(n.unwrap())) : n instanceof oi ? oi.create(ho(n.unwrap())) : n instanceof sn ? sn.create(n.items.map((e) => ho(e))) : n;
|
|
2306
2306
|
}
|
|
2307
2307
|
class xe extends ne {
|
|
2308
2308
|
constructor() {
|
|
@@ -2324,7 +2324,7 @@ class xe extends ne {
|
|
|
2324
2324
|
}), E;
|
|
2325
2325
|
}
|
|
2326
2326
|
const { status: i, ctx: o } = this._processInputParams(e), { shape: s, keys: a } = this._getCached(), r = [];
|
|
2327
|
-
if (!(this._def.catchall instanceof
|
|
2327
|
+
if (!(this._def.catchall instanceof Xn && this._def.unknownKeys === "strip"))
|
|
2328
2328
|
for (const g in o.data)
|
|
2329
2329
|
a.includes(g) || r.push(g);
|
|
2330
2330
|
const l = [];
|
|
@@ -2332,11 +2332,11 @@ class xe extends ne {
|
|
|
2332
2332
|
const c = s[g], d = o.data[g];
|
|
2333
2333
|
l.push({
|
|
2334
2334
|
key: { status: "valid", value: g },
|
|
2335
|
-
value: c._parse(new
|
|
2335
|
+
value: c._parse(new on(o, d, o.path, g)),
|
|
2336
2336
|
alwaysSet: g in o.data
|
|
2337
2337
|
});
|
|
2338
2338
|
}
|
|
2339
|
-
if (this._def.catchall instanceof
|
|
2339
|
+
if (this._def.catchall instanceof Xn) {
|
|
2340
2340
|
const g = this._def.unknownKeys;
|
|
2341
2341
|
if (g === "passthrough")
|
|
2342
2342
|
for (const c of r)
|
|
@@ -2357,7 +2357,7 @@ class xe extends ne {
|
|
|
2357
2357
|
l.push({
|
|
2358
2358
|
key: { status: "valid", value: c },
|
|
2359
2359
|
value: g._parse(
|
|
2360
|
-
new
|
|
2360
|
+
new on(o, d, o.path, c)
|
|
2361
2361
|
//, ctx.child(key), value, getParsedType(value)
|
|
2362
2362
|
),
|
|
2363
2363
|
alwaysSet: c in o.data
|
|
@@ -2557,7 +2557,7 @@ class xe extends ne {
|
|
|
2557
2557
|
t[i] = this.shape[i];
|
|
2558
2558
|
else {
|
|
2559
2559
|
let s = this.shape[i];
|
|
2560
|
-
for (; s instanceof
|
|
2560
|
+
for (; s instanceof $t; )
|
|
2561
2561
|
s = s._def.innerType;
|
|
2562
2562
|
t[i] = s;
|
|
2563
2563
|
}
|
|
@@ -2573,21 +2573,21 @@ class xe extends ne {
|
|
|
2573
2573
|
xe.create = (n, e) => new xe({
|
|
2574
2574
|
shape: () => n,
|
|
2575
2575
|
unknownKeys: "strip",
|
|
2576
|
-
catchall:
|
|
2576
|
+
catchall: Xn.create(),
|
|
2577
2577
|
typeName: j.ZodObject,
|
|
2578
2578
|
...$(e)
|
|
2579
2579
|
});
|
|
2580
2580
|
xe.strictCreate = (n, e) => new xe({
|
|
2581
2581
|
shape: () => n,
|
|
2582
2582
|
unknownKeys: "strict",
|
|
2583
|
-
catchall:
|
|
2583
|
+
catchall: Xn.create(),
|
|
2584
2584
|
typeName: j.ZodObject,
|
|
2585
2585
|
...$(e)
|
|
2586
2586
|
});
|
|
2587
2587
|
xe.lazycreate = (n, e) => new xe({
|
|
2588
2588
|
shape: n,
|
|
2589
2589
|
unknownKeys: "strip",
|
|
2590
|
-
catchall:
|
|
2590
|
+
catchall: Xn.create(),
|
|
2591
2591
|
typeName: j.ZodObject,
|
|
2592
2592
|
...$(e)
|
|
2593
2593
|
});
|
|
@@ -2664,7 +2664,7 @@ Ks.create = (n, e) => new Ks({
|
|
|
2664
2664
|
typeName: j.ZodUnion,
|
|
2665
2665
|
...$(e)
|
|
2666
2666
|
});
|
|
2667
|
-
const
|
|
2667
|
+
const mn = (n) => n instanceof Ms ? mn(n.schema) : n instanceof zt ? mn(n.innerType()) : n instanceof Ls ? [n.value] : n instanceof ii ? n.options : n instanceof Ts ? re.objectValues(n.enum) : n instanceof Js ? mn(n._def.innerType) : n instanceof Ns ? [void 0] : n instanceof Fs ? [null] : n instanceof $t ? [void 0, ...mn(n.unwrap())] : n instanceof oi ? [null, ...mn(n.unwrap())] : n instanceof sc || n instanceof Os ? mn(n.unwrap()) : n instanceof Ds ? mn(n._def.innerType) : [];
|
|
2668
2668
|
class Mr extends ne {
|
|
2669
2669
|
_parse(e) {
|
|
2670
2670
|
const { ctx: t } = this._processInputParams(e);
|
|
@@ -2709,7 +2709,7 @@ class Mr extends ne {
|
|
|
2709
2709
|
static create(e, t, i) {
|
|
2710
2710
|
const o = /* @__PURE__ */ new Map();
|
|
2711
2711
|
for (const s of t) {
|
|
2712
|
-
const a =
|
|
2712
|
+
const a = mn(s.shape[e]);
|
|
2713
2713
|
if (!a.length)
|
|
2714
2714
|
throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);
|
|
2715
2715
|
for (const r of a) {
|
|
@@ -2791,7 +2791,7 @@ _s.create = (n, e, t) => new _s({
|
|
|
2791
2791
|
typeName: j.ZodIntersection,
|
|
2792
2792
|
...$(t)
|
|
2793
2793
|
});
|
|
2794
|
-
class
|
|
2794
|
+
class sn extends ne {
|
|
2795
2795
|
_parse(e) {
|
|
2796
2796
|
const { status: t, ctx: i } = this._processInputParams(e);
|
|
2797
2797
|
if (i.parsedType !== _.array)
|
|
@@ -2817,7 +2817,7 @@ class on extends ne {
|
|
|
2817
2817
|
}), t.dirty());
|
|
2818
2818
|
const s = [...i.data].map((a, r) => {
|
|
2819
2819
|
const l = this._def.items[r] || this._def.rest;
|
|
2820
|
-
return l ? l._parse(new
|
|
2820
|
+
return l ? l._parse(new on(i, a, i.path, r)) : null;
|
|
2821
2821
|
}).filter((a) => !!a);
|
|
2822
2822
|
return i.common.async ? Promise.all(s).then((a) => Qe.mergeArray(t, a)) : Qe.mergeArray(t, s);
|
|
2823
2823
|
}
|
|
@@ -2825,16 +2825,16 @@ class on extends ne {
|
|
|
2825
2825
|
return this._def.items;
|
|
2826
2826
|
}
|
|
2827
2827
|
rest(e) {
|
|
2828
|
-
return new
|
|
2828
|
+
return new sn({
|
|
2829
2829
|
...this._def,
|
|
2830
2830
|
rest: e
|
|
2831
2831
|
});
|
|
2832
2832
|
}
|
|
2833
2833
|
}
|
|
2834
|
-
|
|
2834
|
+
sn.create = (n, e) => {
|
|
2835
2835
|
if (!Array.isArray(n))
|
|
2836
2836
|
throw new Error("You must pass an array of schemas to z.tuple([ ... ])");
|
|
2837
|
-
return new
|
|
2837
|
+
return new sn({
|
|
2838
2838
|
items: n,
|
|
2839
2839
|
typeName: j.ZodTuple,
|
|
2840
2840
|
rest: null,
|
|
@@ -2859,8 +2859,8 @@ class zs extends ne {
|
|
|
2859
2859
|
const o = [], s = this._def.keyType, a = this._def.valueType;
|
|
2860
2860
|
for (const r in i.data)
|
|
2861
2861
|
o.push({
|
|
2862
|
-
key: s._parse(new
|
|
2863
|
-
value: a._parse(new
|
|
2862
|
+
key: s._parse(new on(i, r, i.path, r)),
|
|
2863
|
+
value: a._parse(new on(i, i.data[r], i.path, r)),
|
|
2864
2864
|
alwaysSet: r in i.data
|
|
2865
2865
|
});
|
|
2866
2866
|
return i.common.async ? Qe.mergeObjectAsync(t, o) : Qe.mergeObjectSync(t, o);
|
|
@@ -2875,7 +2875,7 @@ class zs extends ne {
|
|
|
2875
2875
|
typeName: j.ZodRecord,
|
|
2876
2876
|
...$(i)
|
|
2877
2877
|
}) : new zs({
|
|
2878
|
-
keyType:
|
|
2878
|
+
keyType: Ft.create(),
|
|
2879
2879
|
valueType: e,
|
|
2880
2880
|
typeName: j.ZodRecord,
|
|
2881
2881
|
...$(t)
|
|
@@ -2898,8 +2898,8 @@ class Cr extends ne {
|
|
|
2898
2898
|
received: i.parsedType
|
|
2899
2899
|
}), E;
|
|
2900
2900
|
const o = this._def.keyType, s = this._def.valueType, a = [...i.data.entries()].map(([r, l], g) => ({
|
|
2901
|
-
key: o._parse(new
|
|
2902
|
-
value: s._parse(new
|
|
2901
|
+
key: o._parse(new on(i, r, i.path, [g, "key"])),
|
|
2902
|
+
value: s._parse(new on(i, l, i.path, [g, "value"]))
|
|
2903
2903
|
}));
|
|
2904
2904
|
if (i.common.async) {
|
|
2905
2905
|
const r = /* @__PURE__ */ new Map();
|
|
@@ -2965,7 +2965,7 @@ class Ti extends ne {
|
|
|
2965
2965
|
}
|
|
2966
2966
|
return { status: t.value, value: g };
|
|
2967
2967
|
}
|
|
2968
|
-
const r = [...i.data.values()].map((l, g) => s._parse(new
|
|
2968
|
+
const r = [...i.data.values()].map((l, g) => s._parse(new on(i, l, i.path, g)));
|
|
2969
2969
|
return i.common.async ? Promise.all(r).then((l) => a(l)) : a(r);
|
|
2970
2970
|
}
|
|
2971
2971
|
min(e, t) {
|
|
@@ -3071,7 +3071,7 @@ class vo extends ne {
|
|
|
3071
3071
|
args(...e) {
|
|
3072
3072
|
return new vo({
|
|
3073
3073
|
...this._def,
|
|
3074
|
-
args:
|
|
3074
|
+
args: sn.create(e).rest(Si.create())
|
|
3075
3075
|
});
|
|
3076
3076
|
}
|
|
3077
3077
|
returns(e) {
|
|
@@ -3088,7 +3088,7 @@ class vo extends ne {
|
|
|
3088
3088
|
}
|
|
3089
3089
|
static create(e, t, i) {
|
|
3090
3090
|
return new vo({
|
|
3091
|
-
args: e ||
|
|
3091
|
+
args: e || sn.create([]).rest(Si.create()),
|
|
3092
3092
|
returns: t || Si.create(),
|
|
3093
3093
|
typeName: j.ZodFunction,
|
|
3094
3094
|
...$(i)
|
|
@@ -3254,7 +3254,7 @@ Yo.create = (n, e) => new Yo({
|
|
|
3254
3254
|
typeName: j.ZodPromise,
|
|
3255
3255
|
...$(e)
|
|
3256
3256
|
});
|
|
3257
|
-
class
|
|
3257
|
+
class zt extends ne {
|
|
3258
3258
|
innerType() {
|
|
3259
3259
|
return this._def.schema;
|
|
3260
3260
|
}
|
|
@@ -3331,19 +3331,19 @@ class _t extends ne {
|
|
|
3331
3331
|
re.assertNever(o);
|
|
3332
3332
|
}
|
|
3333
3333
|
}
|
|
3334
|
-
|
|
3334
|
+
zt.create = (n, e, t) => new zt({
|
|
3335
3335
|
schema: n,
|
|
3336
3336
|
typeName: j.ZodEffects,
|
|
3337
3337
|
effect: e,
|
|
3338
3338
|
...$(t)
|
|
3339
3339
|
});
|
|
3340
|
-
|
|
3340
|
+
zt.createWithPreprocess = (n, e, t) => new zt({
|
|
3341
3341
|
schema: e,
|
|
3342
3342
|
effect: { type: "preprocess", transform: n },
|
|
3343
3343
|
typeName: j.ZodEffects,
|
|
3344
3344
|
...$(t)
|
|
3345
3345
|
});
|
|
3346
|
-
class
|
|
3346
|
+
class $t extends ne {
|
|
3347
3347
|
_parse(e) {
|
|
3348
3348
|
return this._getType(e) === _.undefined ? it(void 0) : this._def.innerType._parse(e);
|
|
3349
3349
|
}
|
|
@@ -3351,7 +3351,7 @@ class Qt extends ne {
|
|
|
3351
3351
|
return this._def.innerType;
|
|
3352
3352
|
}
|
|
3353
3353
|
}
|
|
3354
|
-
|
|
3354
|
+
$t.create = (n, e) => new $t({
|
|
3355
3355
|
innerType: n,
|
|
3356
3356
|
typeName: j.ZodOptional,
|
|
3357
3357
|
...$(e)
|
|
@@ -3535,8 +3535,8 @@ var j;
|
|
|
3535
3535
|
})(j || (j = {}));
|
|
3536
3536
|
const _f = (n, e = {
|
|
3537
3537
|
message: `Input not instance of ${n.name}`
|
|
3538
|
-
}) => mC((t) => t instanceof n, e), bC =
|
|
3539
|
-
string: (n) =>
|
|
3538
|
+
}) => mC((t) => t instanceof n, e), bC = Ft.create, yC = ti.create, zf = hr.create, Mf = ni.create, ZC = Ys.create, Lf = Li.create, Tf = Ir.create, Jf = Ns.create, Df = Fs.create, Of = So.create, jf = Si.create, Ef = Xn.create, Pf = ur.create, Uf = _t.create, Qf = xe.create, $f = xe.strictCreate, qf = Ks.create, em = Mr.create, tm = _s.create, nm = sn.create, im = zs.create, om = Cr.create, sm = Ti.create, am = vo.create, rm = Ms.create, lm = Ls.create, gm = ii.create, cm = Ts.create, dm = Yo.create, Bd = zt.create, Im = $t.create, um = oi.create, Cm = zt.createWithPreprocess, hm = ga.create, Am = () => bC().optional(), pm = () => yC().optional(), fm = () => ZC().optional(), mm = {
|
|
3539
|
+
string: (n) => Ft.create({ ...n, coerce: !0 }),
|
|
3540
3540
|
number: (n) => ti.create({ ...n, coerce: !0 }),
|
|
3541
3541
|
boolean: (n) => Ys.create({
|
|
3542
3542
|
...n,
|
|
@@ -3571,7 +3571,7 @@ var T = /* @__PURE__ */ Object.freeze({
|
|
|
3571
3571
|
getParsedType: Ln,
|
|
3572
3572
|
ZodType: ne,
|
|
3573
3573
|
datetimeRegex: pC,
|
|
3574
|
-
ZodString:
|
|
3574
|
+
ZodString: Ft,
|
|
3575
3575
|
ZodNumber: ti,
|
|
3576
3576
|
ZodBigInt: ni,
|
|
3577
3577
|
ZodBoolean: Ys,
|
|
@@ -3581,14 +3581,14 @@ var T = /* @__PURE__ */ Object.freeze({
|
|
|
3581
3581
|
ZodNull: Fs,
|
|
3582
3582
|
ZodAny: So,
|
|
3583
3583
|
ZodUnknown: Si,
|
|
3584
|
-
ZodNever:
|
|
3584
|
+
ZodNever: Xn,
|
|
3585
3585
|
ZodVoid: ur,
|
|
3586
|
-
ZodArray:
|
|
3586
|
+
ZodArray: _t,
|
|
3587
3587
|
ZodObject: xe,
|
|
3588
3588
|
ZodUnion: Ks,
|
|
3589
3589
|
ZodDiscriminatedUnion: Mr,
|
|
3590
3590
|
ZodIntersection: _s,
|
|
3591
|
-
ZodTuple:
|
|
3591
|
+
ZodTuple: sn,
|
|
3592
3592
|
ZodRecord: zs,
|
|
3593
3593
|
ZodMap: Cr,
|
|
3594
3594
|
ZodSet: Ti,
|
|
@@ -3598,9 +3598,9 @@ var T = /* @__PURE__ */ Object.freeze({
|
|
|
3598
3598
|
ZodEnum: ii,
|
|
3599
3599
|
ZodNativeEnum: Ts,
|
|
3600
3600
|
ZodPromise: Yo,
|
|
3601
|
-
ZodEffects:
|
|
3602
|
-
ZodTransformer:
|
|
3603
|
-
ZodOptional:
|
|
3601
|
+
ZodEffects: zt,
|
|
3602
|
+
ZodTransformer: zt,
|
|
3603
|
+
ZodOptional: $t,
|
|
3604
3604
|
ZodNullable: oi,
|
|
3605
3605
|
ZodDefault: Js,
|
|
3606
3606
|
ZodCatch: Ds,
|
|
@@ -4007,7 +4007,7 @@ function Ua(n, e, t, i, o) {
|
|
|
4007
4007
|
var s = { type: n, props: e, key: t, ref: i, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: o ?? ++SC };
|
|
4008
4008
|
return o == null && te.vnode != null && te.vnode(s), s;
|
|
4009
4009
|
}
|
|
4010
|
-
function
|
|
4010
|
+
function Qt(n) {
|
|
4011
4011
|
return n.children;
|
|
4012
4012
|
}
|
|
4013
4013
|
function Qa(n, e) {
|
|
@@ -4041,7 +4041,7 @@ function fr() {
|
|
|
4041
4041
|
}
|
|
4042
4042
|
function zC(n, e, t, i, o, s, a, r, l, g) {
|
|
4043
4043
|
var c, d, I, u, C, A, p, m = i && i.__k || FC, b = m.length;
|
|
4044
|
-
for (t.__k = [], c = 0; c < e.length; c++) if ((u = t.__k[c] = (u = e[c]) == null || typeof u == "boolean" ? null : typeof u == "string" || typeof u == "number" || typeof u == "bigint" ? Ua(null, u, null, null, u) : Array.isArray(u) ? Ua(
|
|
4044
|
+
for (t.__k = [], c = 0; c < e.length; c++) if ((u = t.__k[c] = (u = e[c]) == null || typeof u == "boolean" ? null : typeof u == "string" || typeof u == "number" || typeof u == "bigint" ? Ua(null, u, null, null, u) : Array.isArray(u) ? Ua(Qt, { children: u }, null, null, null) : u.__b > 0 ? Ua(u.type, u.props, u.key, u.ref ? u.ref : null, u.__v) : u) != null) {
|
|
4045
4045
|
if (u.__ = t, u.__b = t.__b + 1, (I = m[c]) === null || I && u.key == I.key && u.type === I.type) m[c] = void 0;
|
|
4046
4046
|
else for (d = 0; d < b; d++) {
|
|
4047
4047
|
if ((I = m[d]) && u.key == I.key && u.type === I.type) {
|
|
@@ -4121,7 +4121,7 @@ function cc(n, e, t, i, o, s, a, r, l) {
|
|
|
4121
4121
|
} else do
|
|
4122
4122
|
c.__d = !1, w && w(e), g = c.render(c.props, c.state, c.context), c.state = c.__s;
|
|
4123
4123
|
while (c.__d && ++v < 25);
|
|
4124
|
-
c.state = c.__s, c.getChildContext != null && (i = Jn(Jn({}, i), c.getChildContext())), d || c.getSnapshotBeforeUpdate == null || (C = c.getSnapshotBeforeUpdate(I, u)), V = g != null && g.type ===
|
|
4124
|
+
c.state = c.__s, c.getChildContext != null && (i = Jn(Jn({}, i), c.getChildContext())), d || c.getSnapshotBeforeUpdate == null || (C = c.getSnapshotBeforeUpdate(I, u)), V = g != null && g.type === Qt && g.key == null ? g.props.children : g, zC(n, Array.isArray(V) ? V : [V], e, t, i, o, s, a, r, l), c.base = e.__e, e.__h = null, c.__h.length && a.push(c), A && (c.__E = c.__ = null), c.__e = !1;
|
|
4125
4125
|
} else s == null && e.__v === t.__v ? (e.__k = t.__k, e.__e = t.__e) : e.__e = Rm(t.__e, e, t, i, o, s, a, l);
|
|
4126
4126
|
(g = te.diffed) && g(e);
|
|
4127
4127
|
} catch (k) {
|
|
@@ -4192,7 +4192,7 @@ function xm(n, e, t) {
|
|
|
4192
4192
|
}
|
|
4193
4193
|
function ys(n, e, t) {
|
|
4194
4194
|
var i, o, s;
|
|
4195
|
-
te.__ && te.__(n, e), o = (i = typeof t == "function") ? null : e.__k, s = [], cc(e, n = (!i && t || e).__k = z(
|
|
4195
|
+
te.__ && te.__(n, e), o = (i = typeof t == "function") ? null : e.__k, s = [], cc(e, n = (!i && t || e).__k = z(Qt, null, [n]), o || pr, pr, e.ownerSVGElement !== void 0, !i && t ? [t] : o ? null : e.firstChild ? Tr.call(e.childNodes) : null, s, !i && t ? t : o ? o.__e : e.firstChild, i), TC(s, n);
|
|
4196
4196
|
}
|
|
4197
4197
|
function OC() {
|
|
4198
4198
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(n) {
|
|
@@ -4214,7 +4214,7 @@ Tr = FC.slice, te = { __e: function(n, e, t, i) {
|
|
|
4214
4214
|
t = this.__s != null && this.__s !== this.state ? this.__s : this.__s = Jn({}, this.state), typeof n == "function" && (n = n(Jn({}, t), this.props)), n && Jn(t, n), n != null && this.__v && (e && this._sb.push(e), Ag(this));
|
|
4215
4215
|
}, Qa.prototype.forceUpdate = function(n) {
|
|
4216
4216
|
this.__v && (this.__e = !0, n && this.__h.push(n), Ag(this));
|
|
4217
|
-
}, Qa.prototype.render =
|
|
4217
|
+
}, Qa.prototype.render = Qt, bs = [], fr.__r = 0, NC = 0;
|
|
4218
4218
|
var Jr = /* @__PURE__ */ function() {
|
|
4219
4219
|
function n(e) {
|
|
4220
4220
|
this._id = void 0, this._id = e || OC();
|
|
@@ -4339,7 +4339,7 @@ function $a(n, e) {
|
|
|
4339
4339
|
(function(n) {
|
|
4340
4340
|
n[n.Initiator = 0] = "Initiator", n[n.ServerFilter = 1] = "ServerFilter", n[n.ServerSort = 2] = "ServerSort", n[n.ServerLimit = 3] = "ServerLimit", n[n.Extractor = 4] = "Extractor", n[n.Transformer = 5] = "Transformer", n[n.Filter = 6] = "Filter", n[n.Sort = 7] = "Sort", n[n.Limit = 8] = "Limit";
|
|
4341
4341
|
})(Ue || (Ue = {}));
|
|
4342
|
-
var
|
|
4342
|
+
var dn = /* @__PURE__ */ function(n) {
|
|
4343
4343
|
function e(i) {
|
|
4344
4344
|
var o;
|
|
4345
4345
|
return (o = n.call(this) || this).id = void 0, o._props = void 0, o._props = {}, o.id = OC(), i && o.setProps(i), o;
|
|
@@ -4378,7 +4378,7 @@ var cn = /* @__PURE__ */ function(n) {
|
|
|
4378
4378
|
}, qe(e, [{ key: "type", get: function() {
|
|
4379
4379
|
return Ue.Filter;
|
|
4380
4380
|
} }]), e;
|
|
4381
|
-
}(
|
|
4381
|
+
}(dn);
|
|
4382
4382
|
function le() {
|
|
4383
4383
|
var n = "gridjs";
|
|
4384
4384
|
return "" + n + [].slice.call(arguments).reduce(function(e, t) {
|
|
@@ -4405,7 +4405,7 @@ var ca, Ne, xl, Nd, Fd = /* @__PURE__ */ function(n) {
|
|
|
4405
4405
|
}, qe(e, [{ key: "type", get: function() {
|
|
4406
4406
|
return Ue.ServerFilter;
|
|
4407
4407
|
} }]), e;
|
|
4408
|
-
}(
|
|
4408
|
+
}(dn), Ps = 0, EC = [], qa = [], Kd = te.__b, _d = te.__r, zd = te.diffed, Md = te.__c, Ld = te.unmount;
|
|
4409
4409
|
function Or(n, e) {
|
|
4410
4410
|
te.__h && te.__h(Ne, n, Ps || e), Ps = 0;
|
|
4411
4411
|
var t = Ne.__H || (Ne.__H = { __: [], __h: [] });
|
|
@@ -4565,7 +4565,7 @@ var Dd = function(n) {
|
|
|
4565
4565
|
function jo() {
|
|
4566
4566
|
return ot().store;
|
|
4567
4567
|
}
|
|
4568
|
-
function
|
|
4568
|
+
function qt(n) {
|
|
4569
4569
|
var e = jo(), t = si(n(e.getState())), i = t[0], o = t[1];
|
|
4570
4570
|
return dt(function() {
|
|
4571
4571
|
return e.subscribe(function() {
|
|
@@ -4575,7 +4575,7 @@ function $t(n) {
|
|
|
4575
4575
|
}, []), i;
|
|
4576
4576
|
}
|
|
4577
4577
|
function Km() {
|
|
4578
|
-
var n, e = si(void 0), t = e[0], i = e[1], o = ot(), s = o.search, a = jr(), r = jo().dispatch, l =
|
|
4578
|
+
var n, e = si(void 0), t = e[0], i = e[1], o = ot(), s = o.search, a = jr(), r = jo().dispatch, l = qt(function(u) {
|
|
4579
4579
|
return u.search;
|
|
4580
4580
|
});
|
|
4581
4581
|
dt(function() {
|
|
@@ -4617,7 +4617,7 @@ var Od = /* @__PURE__ */ function(n) {
|
|
|
4617
4617
|
}, qe(e, [{ key: "type", get: function() {
|
|
4618
4618
|
return Ue.Limit;
|
|
4619
4619
|
} }]), e;
|
|
4620
|
-
}(
|
|
4620
|
+
}(dn), jd = /* @__PURE__ */ function(n) {
|
|
4621
4621
|
function e() {
|
|
4622
4622
|
return n.apply(this, arguments) || this;
|
|
4623
4623
|
}
|
|
@@ -4627,7 +4627,7 @@ var Od = /* @__PURE__ */ function(n) {
|
|
|
4627
4627
|
}, qe(e, [{ key: "type", get: function() {
|
|
4628
4628
|
return Ue.ServerLimit;
|
|
4629
4629
|
} }]), e;
|
|
4630
|
-
}(
|
|
4630
|
+
}(dn);
|
|
4631
4631
|
function _m() {
|
|
4632
4632
|
var n = ot(), e = n.pagination, t = e.server, i = e.summary, o = i === void 0 || i, s = e.nextButton, a = s === void 0 || s, r = e.prevButton, l = r === void 0 || r, g = e.buttonsCount, c = g === void 0 ? 3 : g, d = e.limit, I = d === void 0 ? 10 : d, u = e.page, C = u === void 0 ? 0 : u, A = e.resetPageOnUpdate, p = A === void 0 || A, m = da(null), b = si(C), Z = b[0], w = b[1], v = si(0), W = v[0], V = v[1], B = jr();
|
|
4633
4633
|
dt(function() {
|
|
@@ -4649,12 +4649,12 @@ function _m() {
|
|
|
4649
4649
|
if (N >= R() || N < 0 || N === Z) return null;
|
|
4650
4650
|
w(N), m.current.setProps({ page: N });
|
|
4651
4651
|
};
|
|
4652
|
-
return z("div", { className: ye(le("pagination"), n.className.pagination) }, z(
|
|
4652
|
+
return z("div", { className: ye(le("pagination"), n.className.pagination) }, z(Qt, null, o && W > 0 && z("div", { role: "status", "aria-live": "polite", className: ye(le("summary"), n.className.paginationSummary), title: B("pagination.navigate", Z + 1, R()) }, B("pagination.showing"), " ", z("b", null, B("" + (Z * I + 1))), " ", B("pagination.to"), " ", z("b", null, B("" + Math.min((Z + 1) * I, W))), " ", B("pagination.of"), " ", z("b", null, B("" + W)), " ", B("pagination.results"))), z("div", { className: le("pages") }, l && z("button", { tabIndex: 0, role: "button", disabled: Z === 0, onClick: function() {
|
|
4653
4653
|
return M(Z - 1);
|
|
4654
4654
|
}, title: B("pagination.previous"), "aria-label": B("pagination.previous"), className: ye(n.className.paginationButton, n.className.paginationButtonPrev) }, B("pagination.previous")), function() {
|
|
4655
4655
|
if (c <= 0) return null;
|
|
4656
4656
|
var N = Math.min(R(), c), P = Math.min(Z, Math.floor(N / 2));
|
|
4657
|
-
return Z + Math.floor(N / 2) >= R() && (P = N - (R() - Z)), z(
|
|
4657
|
+
return Z + Math.floor(N / 2) >= R() && (P = N - (R() - Z)), z(Qt, null, R() > N && Z - P > 0 && z(Qt, null, z("button", { tabIndex: 0, role: "button", onClick: function() {
|
|
4658
4658
|
return M(0);
|
|
4659
4659
|
}, title: B("pagination.firstPage"), "aria-label": B("pagination.firstPage"), className: n.className.paginationButton }, B("1")), z("button", { tabIndex: -1, className: ye(le("spread"), n.className.paginationButton) }, "...")), Array.from(Array(N).keys()).map(function(ee) {
|
|
4660
4660
|
return Z + (ee - P);
|
|
@@ -4662,7 +4662,7 @@ function _m() {
|
|
|
4662
4662
|
return z("button", { tabIndex: 0, role: "button", onClick: function() {
|
|
4663
4663
|
return M(ee);
|
|
4664
4664
|
}, className: ye(Z === ee ? ye(le("currentPage"), n.className.paginationButtonCurrent) : null, n.className.paginationButton), title: B("pagination.page", ee + 1), "aria-label": B("pagination.page", ee + 1) }, B("" + (ee + 1)));
|
|
4665
|
-
}), R() > N && R() > Z + P + 1 && z(
|
|
4665
|
+
}), R() > N && R() > Z + P + 1 && z(Qt, null, z("button", { tabIndex: -1, className: ye(le("spread"), n.className.paginationButton) }, "..."), z("button", { tabIndex: 0, role: "button", onClick: function() {
|
|
4666
4666
|
return M(R() - 1);
|
|
4667
4667
|
}, title: B("pagination.page", R()), "aria-label": B("pagination.page", R()), className: n.className.paginationButton }, B("" + R()))));
|
|
4668
4668
|
}(), a && z("button", { tabIndex: 0, role: "button", disabled: R() === Z + 1 || R() === 0, onClick: function() {
|
|
@@ -4735,9 +4735,9 @@ function Er(n) {
|
|
|
4735
4735
|
var e = this, t = ot();
|
|
4736
4736
|
if (n.pluginId) {
|
|
4737
4737
|
var i = t.plugin.get(n.pluginId);
|
|
4738
|
-
return i ? z(
|
|
4738
|
+
return i ? z(Qt, {}, z(i.component, ge({ plugin: i }, n.props))) : null;
|
|
4739
4739
|
}
|
|
4740
|
-
return n.position !== void 0 ? z(
|
|
4740
|
+
return n.position !== void 0 ? z(Qt, {}, t.plugin.list(n.position).map(function(o) {
|
|
4741
4741
|
return z(o.component, ge({ plugin: o }, e.props.props));
|
|
4742
4742
|
})) : null;
|
|
4743
4743
|
}
|
|
@@ -5093,7 +5093,7 @@ var Jm = /* @__PURE__ */ function(n) {
|
|
|
5093
5093
|
}, qe(e, [{ key: "type", get: function() {
|
|
5094
5094
|
return Ue.Extractor;
|
|
5095
5095
|
} }]), e;
|
|
5096
|
-
}(
|
|
5096
|
+
}(dn), Om = /* @__PURE__ */ function(n) {
|
|
5097
5097
|
function e() {
|
|
5098
5098
|
return n.apply(this, arguments) || this;
|
|
5099
5099
|
}
|
|
@@ -5103,7 +5103,7 @@ var Jm = /* @__PURE__ */ function(n) {
|
|
|
5103
5103
|
}, qe(e, [{ key: "type", get: function() {
|
|
5104
5104
|
return Ue.Transformer;
|
|
5105
5105
|
} }]), e;
|
|
5106
|
-
}(
|
|
5106
|
+
}(dn), jm = /* @__PURE__ */ function(n) {
|
|
5107
5107
|
function e() {
|
|
5108
5108
|
return n.apply(this, arguments) || this;
|
|
5109
5109
|
}
|
|
@@ -5117,7 +5117,7 @@ var Jm = /* @__PURE__ */ function(n) {
|
|
|
5117
5117
|
}, qe(e, [{ key: "type", get: function() {
|
|
5118
5118
|
return Ue.Initiator;
|
|
5119
5119
|
} }]), e;
|
|
5120
|
-
}(
|
|
5120
|
+
}(dn), Em = /* @__PURE__ */ function(n) {
|
|
5121
5121
|
function e() {
|
|
5122
5122
|
return n.apply(this, arguments) || this;
|
|
5123
5123
|
}
|
|
@@ -5143,7 +5143,7 @@ var Jm = /* @__PURE__ */ function(n) {
|
|
|
5143
5143
|
}, qe(e, [{ key: "type", get: function() {
|
|
5144
5144
|
return Ue.Transformer;
|
|
5145
5145
|
} }]), e;
|
|
5146
|
-
}(
|
|
5146
|
+
}(dn), Pm = /* @__PURE__ */ function() {
|
|
5147
5147
|
function n() {
|
|
5148
5148
|
}
|
|
5149
5149
|
return n.createFromConfig = function(e) {
|
|
@@ -5219,7 +5219,7 @@ function eh(n) {
|
|
|
5219
5219
|
} }, (e = n.column) ? typeof e.attributes == "function" ? e.attributes(n.cell.data, n.row, n.column) : e.attributes : {}), n.column && typeof n.column.formatter == "function" ? n.column.formatter(n.cell.data, n.row, n.column) : n.column && n.column.plugin ? z(Er, { pluginId: n.column.id, props: { column: n.column, cell: n.cell, row: n.row } }) : n.cell.data);
|
|
5220
5220
|
}
|
|
5221
5221
|
function uc(n) {
|
|
5222
|
-
var e = ot(), t =
|
|
5222
|
+
var e = ot(), t = qt(function(i) {
|
|
5223
5223
|
return i.header;
|
|
5224
5224
|
});
|
|
5225
5225
|
return z("tr", { className: ye(le("tr"), e.className.tr), onClick: function(i) {
|
|
@@ -5239,11 +5239,11 @@ function Hl(n) {
|
|
|
5239
5239
|
return z(uc, { messageRow: !0 }, z(eh, { role: "alert", colSpan: n.colSpan, messageCell: !0, cell: new dc(n.message), className: ye(le("message"), n.className ? n.className : null) }));
|
|
5240
5240
|
}
|
|
5241
5241
|
function $m() {
|
|
5242
|
-
var n = ot(), e =
|
|
5242
|
+
var n = ot(), e = qt(function(a) {
|
|
5243
5243
|
return a.data;
|
|
5244
|
-
}), t =
|
|
5244
|
+
}), t = qt(function(a) {
|
|
5245
5245
|
return a.status;
|
|
5246
|
-
}), i =
|
|
5246
|
+
}), i = qt(function(a) {
|
|
5247
5247
|
return a.header;
|
|
5248
5248
|
}), o = jr(), s = function() {
|
|
5249
5249
|
return i ? i.visibleColumns.length : 0;
|
|
@@ -5281,7 +5281,7 @@ var qm = /* @__PURE__ */ function(n) {
|
|
|
5281
5281
|
}, qe(e, [{ key: "type", get: function() {
|
|
5282
5282
|
return Ue.Sort;
|
|
5283
5283
|
} }]), e;
|
|
5284
|
-
}(
|
|
5284
|
+
}(dn), $d = function(n, e, t, i) {
|
|
5285
5285
|
return function(o) {
|
|
5286
5286
|
var s, a = (s = o.sort) != null && s.columns ? o.sort.columns.map(function(A) {
|
|
5287
5287
|
return ge({}, A);
|
|
@@ -5315,9 +5315,9 @@ var qm = /* @__PURE__ */ function(n) {
|
|
|
5315
5315
|
}, qe(e, [{ key: "type", get: function() {
|
|
5316
5316
|
return Ue.ServerSort;
|
|
5317
5317
|
} }]), e;
|
|
5318
|
-
}(
|
|
5318
|
+
}(dn);
|
|
5319
5319
|
function tb(n) {
|
|
5320
|
-
var e = ot(), t = jo().dispatch, i = jr(), o = si(0), s = o[0], a = o[1], r = e.sort, l =
|
|
5320
|
+
var e = ot(), t = jo().dispatch, i = jr(), o = si(0), s = o[0], a = o[1], r = e.sort, l = qt(function(d) {
|
|
5321
5321
|
return d.sort;
|
|
5322
5322
|
}), g = typeof (r == null ? void 0 : r.server) == "object" ? Ue.ServerSort : Ue.Sort, c = function() {
|
|
5323
5323
|
var d = e.pipeline.getStepsByType(g);
|
|
@@ -5395,7 +5395,7 @@ function ib(n) {
|
|
|
5395
5395
|
}, rowSpan: n.rowSpan > 1 ? n.rowSpan : void 0, colSpan: n.colSpan > 1 ? n.colSpan : void 0 }, (r = n.column) ? typeof r.attributes == "function" ? r.attributes(null, null, n.column) : r.attributes : {}, l() ? { tabIndex: 0 } : {}), z("div", { className: le("th", "content") }, n.column.name !== void 0 ? n.column.name : n.column.plugin !== void 0 ? z(Er, { pluginId: n.column.plugin.id, props: { column: n.column } }) : null), l() && z(tb, ge({ index: n.index }, n.column.sort)), n.column.resizable && n.index < e.header.visibleColumns.length - 1 && z(nb, { column: n.column, thRef: t }));
|
|
5396
5396
|
}
|
|
5397
5397
|
function ob() {
|
|
5398
|
-
var n, e = ot(), t =
|
|
5398
|
+
var n, e = ot(), t = qt(function(i) {
|
|
5399
5399
|
return i.header;
|
|
5400
5400
|
});
|
|
5401
5401
|
return t ? z("thead", { key: t.id, className: ye(le("thead"), e.className.thead) }, (n = Go.tabularFormat(t.columns)).map(function(i, o) {
|
|
@@ -5441,11 +5441,11 @@ function rb() {
|
|
|
5441
5441
|
}, [n]), t ? z("div", { ref: n, className: ye(le("footer"), o.className.footer), style: ge({}, o.style.footer) }, z(Er, { position: Ji.Footer })) : null;
|
|
5442
5442
|
}
|
|
5443
5443
|
function lb() {
|
|
5444
|
-
var n = ot(), e = jo().dispatch, t =
|
|
5444
|
+
var n = ot(), e = jo().dispatch, t = qt(function(r) {
|
|
5445
5445
|
return r.status;
|
|
5446
|
-
}), i =
|
|
5446
|
+
}), i = qt(function(r) {
|
|
5447
5447
|
return r.data;
|
|
5448
|
-
}), o =
|
|
5448
|
+
}), o = qt(function(r) {
|
|
5449
5449
|
return r.tableRef;
|
|
5450
5450
|
}), s = { current: null }, a = nh(function() {
|
|
5451
5451
|
try {
|
|
@@ -5523,7 +5523,7 @@ function us(n) {
|
|
|
5523
5523
|
function $n(n) {
|
|
5524
5524
|
return Dn(Ia(n * 255), 0, 255);
|
|
5525
5525
|
}
|
|
5526
|
-
function
|
|
5526
|
+
function Zn(n) {
|
|
5527
5527
|
return Dn(Ia(n / 2.55) / 100, 0, 1);
|
|
5528
5528
|
}
|
|
5529
5529
|
function eI(n) {
|
|
@@ -5610,7 +5610,7 @@ function vb(n) {
|
|
|
5610
5610
|
if (!n)
|
|
5611
5611
|
return;
|
|
5612
5612
|
const e = Cc(n), t = e[0], i = eI(e[1]), o = eI(e[2]);
|
|
5613
|
-
return n.a < 255 ? `hsla(${t}, ${i}%, ${o}%, ${
|
|
5613
|
+
return n.a < 255 ? `hsla(${t}, ${i}%, ${o}%, ${Zn(n.a)})` : `hsl(${t}, ${i}%, ${o}%)`;
|
|
5614
5614
|
}
|
|
5615
5615
|
const tI = {
|
|
5616
5616
|
x: "dark",
|
|
@@ -5829,15 +5829,15 @@ function Vb(n) {
|
|
|
5829
5829
|
}
|
|
5830
5830
|
}
|
|
5831
5831
|
function Xb(n) {
|
|
5832
|
-
return n && (n.a < 255 ? `rgba(${n.r}, ${n.g}, ${n.b}, ${
|
|
5832
|
+
return n && (n.a < 255 ? `rgba(${n.r}, ${n.g}, ${n.b}, ${Zn(n.a)})` : `rgb(${n.r}, ${n.g}, ${n.b})`);
|
|
5833
5833
|
}
|
|
5834
5834
|
const Sl = (n) => n <= 31308e-7 ? n * 12.92 : Math.pow(n, 1 / 2.4) * 1.055 - 0.055, uo = (n) => n <= 0.04045 ? n / 12.92 : Math.pow((n + 0.055) / 1.055, 2.4);
|
|
5835
5835
|
function Rb(n, e, t) {
|
|
5836
|
-
const i = uo(
|
|
5836
|
+
const i = uo(Zn(n.r)), o = uo(Zn(n.g)), s = uo(Zn(n.b));
|
|
5837
5837
|
return {
|
|
5838
|
-
r: $n(Sl(i + t * (uo(
|
|
5839
|
-
g: $n(Sl(o + t * (uo(
|
|
5840
|
-
b: $n(Sl(s + t * (uo(
|
|
5838
|
+
r: $n(Sl(i + t * (uo(Zn(e.r)) - i))),
|
|
5839
|
+
g: $n(Sl(o + t * (uo(Zn(e.g)) - o))),
|
|
5840
|
+
b: $n(Sl(s + t * (uo(Zn(e.b)) - s))),
|
|
5841
5841
|
a: n.a + t * (e.a - n.a)
|
|
5842
5842
|
};
|
|
5843
5843
|
}
|
|
@@ -5870,7 +5870,7 @@ class Us {
|
|
|
5870
5870
|
}
|
|
5871
5871
|
get rgb() {
|
|
5872
5872
|
var e = sh(this._rgb);
|
|
5873
|
-
return e && (e.a =
|
|
5873
|
+
return e && (e.a = Zn(e.a)), e;
|
|
5874
5874
|
}
|
|
5875
5875
|
set rgb(e) {
|
|
5876
5876
|
this._rgb = iI(e);
|
|
@@ -5940,7 +5940,7 @@ class Us {
|
|
|
5940
5940
|
* (c) 2024 Chart.js Contributors
|
|
5941
5941
|
* Released under the MIT License
|
|
5942
5942
|
*/
|
|
5943
|
-
function
|
|
5943
|
+
function fn() {
|
|
5944
5944
|
}
|
|
5945
5945
|
const kb = /* @__PURE__ */ (() => {
|
|
5946
5946
|
let n = 0;
|
|
@@ -6086,7 +6086,7 @@ const Qs = (n) => typeof n < "u", ri = (n) => typeof n == "function", sI = (n, e
|
|
|
6086
6086
|
function Kb(n) {
|
|
6087
6087
|
return n.type === "mouseup" || n.type === "click" || n.type === "contextmenu";
|
|
6088
6088
|
}
|
|
6089
|
-
const Ge = Math.PI, ve = 2 * Ge, _b = ve + Ge, yr = Number.POSITIVE_INFINITY, zb = Ge / 180, Fe = Ge / 2, Zi = Ge / 4, aI = Ge * 2 / 3, On = Math.log10,
|
|
6089
|
+
const Ge = Math.PI, ve = 2 * Ge, _b = ve + Ge, yr = Number.POSITIVE_INFINITY, zb = Ge / 180, Fe = Ge / 2, Zi = Ge / 4, aI = Ge * 2 / 3, On = Math.log10, en = Math.sign;
|
|
6090
6090
|
function ws(n, e, t) {
|
|
6091
6091
|
return Math.abs(n - e) < t;
|
|
6092
6092
|
}
|
|
@@ -6115,7 +6115,7 @@ function lh(n, e, t) {
|
|
|
6115
6115
|
for (i = 0, o = n.length; i < o; i++)
|
|
6116
6116
|
s = n[i][t], isNaN(s) || (e.min = Math.min(e.min, s), e.max = Math.max(e.max, s));
|
|
6117
6117
|
}
|
|
6118
|
-
function
|
|
6118
|
+
function Kt(n) {
|
|
6119
6119
|
return n * (Ge / 180);
|
|
6120
6120
|
}
|
|
6121
6121
|
function fc(n) {
|
|
@@ -6156,7 +6156,7 @@ function Je(n, e, t) {
|
|
|
6156
6156
|
function Jb(n) {
|
|
6157
6157
|
return Je(n, -32768, 32767);
|
|
6158
6158
|
}
|
|
6159
|
-
function
|
|
6159
|
+
function Gn(n, e, t, i = 1e-6) {
|
|
6160
6160
|
return n >= Math.min(e, t) - i && n <= Math.max(e, t) + i;
|
|
6161
6161
|
}
|
|
6162
6162
|
function mc(n, e, t) {
|
|
@@ -6169,7 +6169,7 @@ function mc(n, e, t) {
|
|
|
6169
6169
|
hi: i
|
|
6170
6170
|
};
|
|
6171
6171
|
}
|
|
6172
|
-
const
|
|
6172
|
+
const Bn = (n, e, t, i) => mc(n, t, i ? (o) => {
|
|
6173
6173
|
const s = n[o][e];
|
|
6174
6174
|
return s < t || s === t && n[o + 1][e] === t;
|
|
6175
6175
|
} : (o) => n[o][e] < t), Db = (n, e, t) => mc(n, t, (i) => n[i][e] >= t);
|
|
@@ -6255,14 +6255,14 @@ function Ch(n, e, t) {
|
|
|
6255
6255
|
const { iScale: a, _parsed: r } = n, l = a.axis, { min: g, max: c, minDefined: d, maxDefined: I } = a.getUserBounds();
|
|
6256
6256
|
d && (o = Je(Math.min(
|
|
6257
6257
|
// @ts-expect-error Need to type _parsed
|
|
6258
|
-
|
|
6258
|
+
Bn(r, l, g).lo,
|
|
6259
6259
|
// @ts-expect-error Need to fix types on _lookupByKey
|
|
6260
|
-
t ? i :
|
|
6260
|
+
t ? i : Bn(e, l, a.getPixelForValue(g)).lo
|
|
6261
6261
|
), 0, i - 1)), I ? s = Je(Math.max(
|
|
6262
6262
|
// @ts-expect-error Need to type _parsed
|
|
6263
|
-
|
|
6263
|
+
Bn(r, a.axis, c, !0).hi + 1,
|
|
6264
6264
|
// @ts-expect-error Need to fix types on _lookupByKey
|
|
6265
|
-
t ? 0 :
|
|
6265
|
+
t ? 0 : Bn(e, l, a.getPixelForValue(c), !0).hi + 1
|
|
6266
6266
|
), o, i) - o : s = i - o;
|
|
6267
6267
|
}
|
|
6268
6268
|
return {
|
|
@@ -6709,7 +6709,7 @@ function ph(n, e, t, i, o) {
|
|
|
6709
6709
|
n.fill(), e.borderWidth > 0 && n.stroke();
|
|
6710
6710
|
}
|
|
6711
6711
|
}
|
|
6712
|
-
function
|
|
6712
|
+
function Wn(n, e, t) {
|
|
6713
6713
|
return t = t || 0.5, !e || n && n.x > e.left - t && n.x < e.right + t && n.y > e.top - t && n.y < e.bottom + t;
|
|
6714
6714
|
}
|
|
6715
6715
|
function Ur(n, e) {
|
|
@@ -7124,7 +7124,7 @@ function X0(n, e = "x") {
|
|
|
7124
7124
|
const c = g[e] - l[e];
|
|
7125
7125
|
o[a] = c !== 0 ? (g[t] - l[t]) / c : 0;
|
|
7126
7126
|
}
|
|
7127
|
-
s[a] = r ? g ?
|
|
7127
|
+
s[a] = r ? g ? en(o[a - 1]) !== en(o[a]) ? 0 : (o[a - 1] + o[a]) / 2 : o[a - 1] : o[a];
|
|
7128
7128
|
}
|
|
7129
7129
|
W0(n, o, s), V0(n, s, e);
|
|
7130
7130
|
}
|
|
@@ -7132,9 +7132,9 @@ function ka(n, e, t) {
|
|
|
7132
7132
|
return Math.max(Math.min(n, t), e);
|
|
7133
7133
|
}
|
|
7134
7134
|
function R0(n, e) {
|
|
7135
|
-
let t, i, o, s, a, r =
|
|
7135
|
+
let t, i, o, s, a, r = Wn(n[0], e);
|
|
7136
7136
|
for (t = 0, i = n.length; t < i; ++t)
|
|
7137
|
-
a = s, s = r, r = t < i - 1 &&
|
|
7137
|
+
a = s, s = r, r = t < i - 1 && Wn(n[t + 1], e), s && (o = n[t], a && (o.cp1x = ka(o.cp1x, e.left, e.right), o.cp1y = ka(o.cp1y, e.top, e.bottom)), r && (o.cp2x = ka(o.cp2x, e.left, e.right), o.cp2y = ka(o.cp2y, e.top, e.bottom)));
|
|
7138
7138
|
}
|
|
7139
7139
|
function x0(n, e, t, i, o) {
|
|
7140
7140
|
let s, a, r, l;
|
|
@@ -7334,7 +7334,7 @@ function Wh(n) {
|
|
|
7334
7334
|
compare: Tb,
|
|
7335
7335
|
normalize: ft
|
|
7336
7336
|
} : {
|
|
7337
|
-
between:
|
|
7337
|
+
between: Gn,
|
|
7338
7338
|
compare: (e, t) => e - t,
|
|
7339
7339
|
normalize: (e) => e
|
|
7340
7340
|
};
|
|
@@ -7581,7 +7581,7 @@ class P0 {
|
|
|
7581
7581
|
return this._charts.delete(e);
|
|
7582
7582
|
}
|
|
7583
7583
|
}
|
|
7584
|
-
var
|
|
7584
|
+
var bn = /* @__PURE__ */ new P0();
|
|
7585
7585
|
const yI = "transparent", U0 = {
|
|
7586
7586
|
boolean(n, e, t) {
|
|
7587
7587
|
return t > 0.5 ? e : n;
|
|
@@ -7727,7 +7727,7 @@ class Rh {
|
|
|
7727
7727
|
}
|
|
7728
7728
|
const i = this._createAnimations(e, t);
|
|
7729
7729
|
if (i.length)
|
|
7730
|
-
return
|
|
7730
|
+
return bn.add(this._chart, i), !0;
|
|
7731
7731
|
}
|
|
7732
7732
|
}
|
|
7733
7733
|
function $0(n, e) {
|
|
@@ -7798,7 +7798,7 @@ function wI(n, e, t, i = {}) {
|
|
|
7798
7798
|
continue;
|
|
7799
7799
|
break;
|
|
7800
7800
|
}
|
|
7801
|
-
g = n.values[l], He(g) && (s || e === 0 ||
|
|
7801
|
+
g = n.values[l], He(g) && (s || e === 0 || en(e) === en(g)) && (e += g);
|
|
7802
7802
|
}
|
|
7803
7803
|
return !c && !i.all ? 0 : e;
|
|
7804
7804
|
}
|
|
@@ -8316,7 +8316,7 @@ function zl(n) {
|
|
|
8316
8316
|
return n && n.barStart !== void 0 && n.barEnd !== void 0;
|
|
8317
8317
|
}
|
|
8318
8318
|
function Cy(n, e, t) {
|
|
8319
|
-
return n !== 0 ?
|
|
8319
|
+
return n !== 0 ? en(n) : (e.isHorizontal() ? 1 : -1) * (e.min >= t ? 1 : -1);
|
|
8320
8320
|
}
|
|
8321
8321
|
function hy(n) {
|
|
8322
8322
|
let e, t, i, o, s;
|
|
@@ -8455,7 +8455,7 @@ class qn extends Wt {
|
|
|
8455
8455
|
_calculateBarValuePixels(e) {
|
|
8456
8456
|
const { _cachedMeta: { vScale: t, _stacked: i, index: o }, options: { base: s, minBarLength: a } } = this, r = s || 0, l = this.getParsed(e), g = l._custom, c = zl(g);
|
|
8457
8457
|
let d = l[t.axis], I = 0, u = i ? this.applyStack(t, l, i) : d, C, A;
|
|
8458
|
-
u !== d && (I = u - d, u = d), c && (d = g.barStart, u = g.barEnd - g.barStart, d !== 0 &&
|
|
8458
|
+
u !== d && (I = u - d, u = d), c && (d = g.barStart, u = g.barEnd - g.barStart, d !== 0 && en(d) !== en(g.barEnd) && (I = 0), I += d);
|
|
8459
8459
|
const p = !ce(s) && !c ? s : I;
|
|
8460
8460
|
let m = t.getPixelForValue(p);
|
|
8461
8461
|
if (this.chart.getDataVisibility(e) ? C = t.getPixelForValue(I + u) : C = m, A = C - m, Math.abs(A) < a) {
|
|
@@ -8464,7 +8464,7 @@ class qn extends Wt {
|
|
|
8464
8464
|
m = Math.max(Math.min(m, v), w), C = m + A, i && !c && (l._stacks[t.axis]._visualValues[o] = t.getValueForPixel(C) - t.getValueForPixel(m));
|
|
8465
8465
|
}
|
|
8466
8466
|
if (m === t.getPixelForValue(r)) {
|
|
8467
|
-
const b =
|
|
8467
|
+
const b = en(A) * t.getLineWidthForValue(r) / 2;
|
|
8468
8468
|
m += b, A -= b;
|
|
8469
8469
|
}
|
|
8470
8470
|
return {
|
|
@@ -8649,10 +8649,10 @@ class Hi extends Wt {
|
|
|
8649
8649
|
}
|
|
8650
8650
|
}
|
|
8651
8651
|
_getRotation() {
|
|
8652
|
-
return
|
|
8652
|
+
return Kt(this.options.rotation - 90);
|
|
8653
8653
|
}
|
|
8654
8654
|
_getCircumference() {
|
|
8655
|
-
return
|
|
8655
|
+
return Kt(this.options.circumference);
|
|
8656
8656
|
}
|
|
8657
8657
|
_getRotationExtents() {
|
|
8658
8658
|
let e = ve, t = -ve;
|
|
@@ -8815,7 +8815,7 @@ S(Hi, "id", "doughnut"), S(Hi, "defaults", {
|
|
|
8815
8815
|
}
|
|
8816
8816
|
}
|
|
8817
8817
|
});
|
|
8818
|
-
class
|
|
8818
|
+
class Vn extends Wt {
|
|
8819
8819
|
initialize() {
|
|
8820
8820
|
this.enableOptionSharing = !0, this.supportsDecimation = !0, super.initialize();
|
|
8821
8821
|
}
|
|
@@ -8854,12 +8854,12 @@ class Wn extends Wt {
|
|
|
8854
8854
|
e.dataset.updateControlPoints(this.chart.chartArea, e.iScale.axis), super.draw();
|
|
8855
8855
|
}
|
|
8856
8856
|
}
|
|
8857
|
-
S(
|
|
8857
|
+
S(Vn, "id", "line"), S(Vn, "defaults", {
|
|
8858
8858
|
datasetElementType: "line",
|
|
8859
8859
|
dataElementType: "point",
|
|
8860
8860
|
showLine: !0,
|
|
8861
8861
|
spanGaps: !1
|
|
8862
|
-
}), S(
|
|
8862
|
+
}), S(Vn, "overrides", {
|
|
8863
8863
|
scales: {
|
|
8864
8864
|
_index_: {
|
|
8865
8865
|
type: "category"
|
|
@@ -8869,7 +8869,7 @@ S(Wn, "id", "line"), S(Wn, "defaults", {
|
|
|
8869
8869
|
}
|
|
8870
8870
|
}
|
|
8871
8871
|
});
|
|
8872
|
-
class
|
|
8872
|
+
class tn extends Wt {
|
|
8873
8873
|
constructor(e, t) {
|
|
8874
8874
|
super(e, t), this.innerRadius = void 0, this.outerRadius = void 0;
|
|
8875
8875
|
}
|
|
@@ -8931,10 +8931,10 @@ class en extends Wt {
|
|
|
8931
8931
|
}), t;
|
|
8932
8932
|
}
|
|
8933
8933
|
_computeAngle(e, t, i) {
|
|
8934
|
-
return this.chart.getDataVisibility(e) ?
|
|
8934
|
+
return this.chart.getDataVisibility(e) ? Kt(this.resolveDataElementOptions(e, t).angle || i) : 0;
|
|
8935
8935
|
}
|
|
8936
8936
|
}
|
|
8937
|
-
S(
|
|
8937
|
+
S(tn, "id", "polarArea"), S(tn, "defaults", {
|
|
8938
8938
|
dataElementType: "arc",
|
|
8939
8939
|
animation: {
|
|
8940
8940
|
animateRotate: !0,
|
|
@@ -8955,7 +8955,7 @@ S(en, "id", "polarArea"), S(en, "defaults", {
|
|
|
8955
8955
|
},
|
|
8956
8956
|
indexAxis: "r",
|
|
8957
8957
|
startAngle: 0
|
|
8958
|
-
}), S(
|
|
8958
|
+
}), S(tn, "overrides", {
|
|
8959
8959
|
aspectRatio: 1,
|
|
8960
8960
|
plugins: {
|
|
8961
8961
|
legend: {
|
|
@@ -9142,9 +9142,9 @@ var by = /* @__PURE__ */ Object.freeze({
|
|
|
9142
9142
|
BarController: qn,
|
|
9143
9143
|
BubbleController: tr,
|
|
9144
9144
|
DoughnutController: Hi,
|
|
9145
|
-
LineController:
|
|
9145
|
+
LineController: Vn,
|
|
9146
9146
|
PieController: Zg,
|
|
9147
|
-
PolarAreaController:
|
|
9147
|
+
PolarAreaController: tn,
|
|
9148
9148
|
RadarController: nr,
|
|
9149
9149
|
ScatterController: Fi
|
|
9150
9150
|
});
|
|
@@ -9200,7 +9200,7 @@ var yy = {
|
|
|
9200
9200
|
function Zy(n, e, t, i) {
|
|
9201
9201
|
const { controller: o, data: s, _sorted: a } = n, r = o._cachedMeta.iScale;
|
|
9202
9202
|
if (r && e === r.axis && e !== "r" && a && s.length) {
|
|
9203
|
-
const l = r._reversePixels ? Db :
|
|
9203
|
+
const l = r._reversePixels ? Db : Bn;
|
|
9204
9204
|
if (i) {
|
|
9205
9205
|
if (o._sharedOptions) {
|
|
9206
9206
|
const g = s[0], c = typeof g.getRange == "function" && g.getRange(e);
|
|
@@ -9239,7 +9239,7 @@ function wy(n) {
|
|
|
9239
9239
|
function Ml(n, e, t, i, o) {
|
|
9240
9240
|
const s = [];
|
|
9241
9241
|
return !o && !n.isPointInArea(e) || Ca(n, t, e, function(r, l, g) {
|
|
9242
|
-
!o && !
|
|
9242
|
+
!o && !Wn(r, n.chartArea, 0) || r.inRange(e.x, e.y, i) && s.push({
|
|
9243
9243
|
element: r,
|
|
9244
9244
|
datasetIndex: l,
|
|
9245
9245
|
index: g
|
|
@@ -9779,7 +9779,7 @@ function jy(n) {
|
|
|
9779
9779
|
return !Bc() || typeof OffscreenCanvas < "u" && n instanceof OffscreenCanvas ? Sy : Oy;
|
|
9780
9780
|
}
|
|
9781
9781
|
var Oa;
|
|
9782
|
-
let
|
|
9782
|
+
let In = (Oa = class {
|
|
9783
9783
|
constructor() {
|
|
9784
9784
|
S(this, "x");
|
|
9785
9785
|
S(this, "y");
|
|
@@ -9945,7 +9945,7 @@ function aZ(n, e, t, i) {
|
|
|
9945
9945
|
rotation: d
|
|
9946
9946
|
};
|
|
9947
9947
|
}
|
|
9948
|
-
class Ii extends
|
|
9948
|
+
class Ii extends In {
|
|
9949
9949
|
constructor(e) {
|
|
9950
9950
|
super(), this.id = e.id, this.type = e.type, this.options = void 0, this.ctx = e.ctx, this.chart = e.chart, this.top = void 0, this.bottom = void 0, this.left = void 0, this.right = void 0, this.width = void 0, this.height = void 0, this._margins = {
|
|
9951
9951
|
left: 0,
|
|
@@ -10120,7 +10120,7 @@ class Ii extends dn {
|
|
|
10120
10120
|
if (a) {
|
|
10121
10121
|
const l = _I(o, t.options.font);
|
|
10122
10122
|
if (r ? (e.width = this.maxWidth, e.height = rs(s) + l) : (e.height = this.maxHeight, e.width = rs(s) + l), i.display && this.ticks.length) {
|
|
10123
|
-
const { first: g, last: c, widest: d, highest: I } = this._getLabelSizes(), u = i.padding * 2, C =
|
|
10123
|
+
const { first: g, last: c, widest: d, highest: I } = this._getLabelSizes(), u = i.padding * 2, C = Kt(this.labelRotation), A = Math.cos(C), p = Math.sin(C);
|
|
10124
10124
|
if (r) {
|
|
10125
10125
|
const m = i.mirror ? 0 : p * d.width + A * I.height;
|
|
10126
10126
|
e.height = Math.min(this.maxHeight, e.height + m + u);
|
|
@@ -10240,7 +10240,7 @@ class Ii extends dn {
|
|
|
10240
10240
|
return this.$context || (this.$context = iZ(this.chart.getContext(), this));
|
|
10241
10241
|
}
|
|
10242
10242
|
_tickSize() {
|
|
10243
|
-
const e = this.options.ticks, t =
|
|
10243
|
+
const e = this.options.ticks, t = Kt(this.labelRotation), i = Math.abs(Math.cos(t)), o = Math.abs(Math.sin(t)), s = this._getLabelSizes(), a = e.autoSkipPadding || 0, r = s ? s.widest.width + a : 0, l = s ? s.highest.height + a : 0;
|
|
10244
10244
|
return this.isHorizontal() ? l * i > r * o ? r / i : l / o : l * o < r * i ? l / i : r / o;
|
|
10245
10245
|
}
|
|
10246
10246
|
_isVisible() {
|
|
@@ -10279,7 +10279,7 @@ class Ii extends dn {
|
|
|
10279
10279
|
}
|
|
10280
10280
|
const ee = Q(o.ticks.maxTicksLimit, d), se = Math.max(1, Math.ceil(d / ee));
|
|
10281
10281
|
for (Z = 0; Z < d; Z += se) {
|
|
10282
|
-
const de = this.getContext(Z), ue = s.setContext(de), Xe = r.setContext(de), Ae = ue.lineWidth,
|
|
10282
|
+
const de = this.getContext(Z), ue = s.setContext(de), Xe = r.setContext(de), Ae = ue.lineWidth, jt = ue.color, _n = Xe.dash || [], zn = Xe.dashOffset, mi = ue.tickWidth, An = ue.tickColor, Ht = ue.tickBorderDash || [], St = ue.tickBorderDashOffset;
|
|
10283
10283
|
w = tZ(this, Z, l), w !== void 0 && (v = wi(i, w, Ae), g ? W = B = R = N = v : V = k = M = P = v, u.push({
|
|
10284
10284
|
tx1: W,
|
|
10285
10285
|
ty1: V,
|
|
@@ -10290,19 +10290,19 @@ class Ii extends dn {
|
|
|
10290
10290
|
x2: N,
|
|
10291
10291
|
y2: P,
|
|
10292
10292
|
width: Ae,
|
|
10293
|
-
color:
|
|
10293
|
+
color: jt,
|
|
10294
10294
|
borderDash: _n,
|
|
10295
10295
|
borderDashOffset: zn,
|
|
10296
10296
|
tickWidth: mi,
|
|
10297
|
-
tickColor:
|
|
10298
|
-
tickBorderDash:
|
|
10299
|
-
tickBorderDashOffset:
|
|
10297
|
+
tickColor: An,
|
|
10298
|
+
tickBorderDash: Ht,
|
|
10299
|
+
tickBorderDashOffset: St
|
|
10300
10300
|
}));
|
|
10301
10301
|
}
|
|
10302
10302
|
return this._ticksLength = d, this._borderValue = b, u;
|
|
10303
10303
|
}
|
|
10304
10304
|
_computeLabelItems(e) {
|
|
10305
|
-
const t = this.axis, i = this.options, { position: o, ticks: s } = i, a = this.isHorizontal(), r = this.ticks, { align: l, crossAlign: g, padding: c, mirror: d } = s, I = rs(i.grid), u = I + c, C = d ? -c : u, A = -
|
|
10305
|
+
const t = this.axis, i = this.options, { position: o, ticks: s } = i, a = this.isHorizontal(), r = this.ticks, { align: l, crossAlign: g, padding: c, mirror: d } = s, I = rs(i.grid), u = I + c, C = d ? -c : u, A = -Kt(this.labelRotation), p = [];
|
|
10306
10306
|
let m, b, Z, w, v, W, V, B, k, R, M, N, P = "middle";
|
|
10307
10307
|
if (o === "top")
|
|
10308
10308
|
W = this.bottom - C, V = this._getXAxisLabelAlignment();
|
|
@@ -10338,35 +10338,35 @@ class Ii extends dn {
|
|
|
10338
10338
|
const se = s.setContext(this.getContext(m));
|
|
10339
10339
|
B = this.getPixelForTick(m) + s.labelOffset, k = this._resolveTickFontOptions(m), R = k.lineHeight, M = We(w) ? w.length : 1;
|
|
10340
10340
|
const de = M / 2, ue = se.color, Xe = se.textStrokeColor, Ae = se.textStrokeWidth;
|
|
10341
|
-
let
|
|
10342
|
-
a ? (v = B, V === "inner" && (m === b - 1 ?
|
|
10341
|
+
let jt = V;
|
|
10342
|
+
a ? (v = B, V === "inner" && (m === b - 1 ? jt = this.options.reverse ? "left" : "right" : m === 0 ? jt = this.options.reverse ? "right" : "left" : jt = "center"), o === "top" ? g === "near" || A !== 0 ? N = -M * R + R / 2 : g === "center" ? N = -ee.highest.height / 2 - de * R + R : N = -ee.highest.height + R / 2 : g === "near" || A !== 0 ? N = R / 2 : g === "center" ? N = ee.highest.height / 2 - de * R : N = ee.highest.height - M * R, d && (N *= -1), A !== 0 && !se.showLabelBackdrop && (v += R / 2 * Math.sin(A))) : (W = B, N = (1 - M) * R / 2);
|
|
10343
10343
|
let _n;
|
|
10344
10344
|
if (se.showLabelBackdrop) {
|
|
10345
|
-
const zn = $e(se.backdropPadding), mi = ee.heights[m],
|
|
10346
|
-
let
|
|
10345
|
+
const zn = $e(se.backdropPadding), mi = ee.heights[m], An = ee.widths[m];
|
|
10346
|
+
let Ht = N - zn.top, St = 0 - zn.left;
|
|
10347
10347
|
switch (P) {
|
|
10348
10348
|
case "middle":
|
|
10349
|
-
|
|
10349
|
+
Ht -= mi / 2;
|
|
10350
10350
|
break;
|
|
10351
10351
|
case "bottom":
|
|
10352
|
-
|
|
10352
|
+
Ht -= mi;
|
|
10353
10353
|
break;
|
|
10354
10354
|
}
|
|
10355
10355
|
switch (V) {
|
|
10356
10356
|
case "center":
|
|
10357
|
-
|
|
10357
|
+
St -= An / 2;
|
|
10358
10358
|
break;
|
|
10359
10359
|
case "right":
|
|
10360
|
-
|
|
10360
|
+
St -= An;
|
|
10361
10361
|
break;
|
|
10362
10362
|
case "inner":
|
|
10363
|
-
m === b - 1 ?
|
|
10363
|
+
m === b - 1 ? St -= An : m > 0 && (St -= An / 2);
|
|
10364
10364
|
break;
|
|
10365
10365
|
}
|
|
10366
10366
|
_n = {
|
|
10367
|
-
left:
|
|
10368
|
-
top:
|
|
10369
|
-
width:
|
|
10367
|
+
left: St,
|
|
10368
|
+
top: Ht,
|
|
10369
|
+
width: An + zn.width,
|
|
10370
10370
|
height: mi + zn.height,
|
|
10371
10371
|
color: se.backdropColor
|
|
10372
10372
|
};
|
|
@@ -10380,7 +10380,7 @@ class Ii extends dn {
|
|
|
10380
10380
|
color: ue,
|
|
10381
10381
|
strokeColor: Xe,
|
|
10382
10382
|
strokeWidth: Ae,
|
|
10383
|
-
textAlign:
|
|
10383
|
+
textAlign: jt,
|
|
10384
10384
|
textBaseline: P,
|
|
10385
10385
|
translation: [
|
|
10386
10386
|
v,
|
|
@@ -10394,7 +10394,7 @@ class Ii extends dn {
|
|
|
10394
10394
|
}
|
|
10395
10395
|
_getXAxisLabelAlignment() {
|
|
10396
10396
|
const { position: e, ticks: t } = this.options;
|
|
10397
|
-
if (-
|
|
10397
|
+
if (-Kt(this.labelRotation))
|
|
10398
10398
|
return e === "top" ? "left" : "right";
|
|
10399
10399
|
let o = "center";
|
|
10400
10400
|
return t.align === "start" ? o = "left" : t.align === "end" ? o = "right" : t.align === "inner" && (o = "inner"), o;
|
|
@@ -10602,7 +10602,7 @@ function gZ(n) {
|
|
|
10602
10602
|
}
|
|
10603
10603
|
class cZ {
|
|
10604
10604
|
constructor() {
|
|
10605
|
-
this.controllers = new Na(Wt, "datasets", !0), this.elements = new Na(
|
|
10605
|
+
this.controllers = new Na(Wt, "datasets", !0), this.elements = new Na(In, "elements"), this.plugins = new Na(Object, "plugins"), this.scales = new Na(Ii, "scales"), this._typedRegistries = [
|
|
10606
10606
|
this.controllers,
|
|
10607
10607
|
this.scales,
|
|
10608
10608
|
this.elements
|
|
@@ -11089,7 +11089,7 @@ class ke {
|
|
|
11089
11089
|
console.error("Failed to create chart: can't acquire context from the given item");
|
|
11090
11090
|
return;
|
|
11091
11091
|
}
|
|
11092
|
-
|
|
11092
|
+
bn.listen(this, "complete", OI), bn.listen(this, "progress", WZ), this._initialize(), this.attached && this.update();
|
|
11093
11093
|
}
|
|
11094
11094
|
get aspectRatio() {
|
|
11095
11095
|
const { options: { aspectRatio: e, maintainAspectRatio: t }, width: i, height: o, _aspectRatio: s } = this;
|
|
@@ -11117,10 +11117,10 @@ class ke {
|
|
|
11117
11117
|
return uI(this.canvas, this.ctx), this;
|
|
11118
11118
|
}
|
|
11119
11119
|
stop() {
|
|
11120
|
-
return
|
|
11120
|
+
return bn.stop(this), this;
|
|
11121
11121
|
}
|
|
11122
11122
|
resize(e, t) {
|
|
11123
|
-
|
|
11123
|
+
bn.running(this) ? this._resizeBeforeDraw = {
|
|
11124
11124
|
width: e,
|
|
11125
11125
|
height: t
|
|
11126
11126
|
} : this._resize(e, t);
|
|
@@ -11310,7 +11310,7 @@ class ke {
|
|
|
11310
11310
|
render() {
|
|
11311
11311
|
this.notifyPlugins("beforeRender", {
|
|
11312
11312
|
cancelable: !0
|
|
11313
|
-
}) !== !1 && (
|
|
11313
|
+
}) !== !1 && (bn.has(this) ? this.attached && !bn.running(this) && bn.start(this) : (this.draw(), OI({
|
|
11314
11314
|
chart: this
|
|
11315
11315
|
})));
|
|
11316
11316
|
}
|
|
@@ -11367,7 +11367,7 @@ class ke {
|
|
|
11367
11367
|
}), e.controller.draw(), o && Qr(t), a.cancelable = !1, this.notifyPlugins("afterDatasetDraw", a));
|
|
11368
11368
|
}
|
|
11369
11369
|
isPointInArea(e) {
|
|
11370
|
-
return
|
|
11370
|
+
return Wn(e, this.chartArea, this._minPadding);
|
|
11371
11371
|
}
|
|
11372
11372
|
getElementsAtEventForMode(e, t, i, o) {
|
|
11373
11373
|
const s = By.modes[t];
|
|
@@ -11435,7 +11435,7 @@ class ke {
|
|
|
11435
11435
|
}
|
|
11436
11436
|
_stop() {
|
|
11437
11437
|
let e, t;
|
|
11438
|
-
for (this.stop(),
|
|
11438
|
+
for (this.stop(), bn.remove(this), e = 0, t = this.data.datasets.length; e < t; ++e)
|
|
11439
11439
|
this._destroyDatasetMeta(e);
|
|
11440
11440
|
}
|
|
11441
11441
|
destroy() {
|
|
@@ -11650,7 +11650,7 @@ function YZ(n, e, t, i, o) {
|
|
|
11650
11650
|
}
|
|
11651
11651
|
u && xZ(n, e, C), s || (Br(n, e, t, i, C, o), n.stroke());
|
|
11652
11652
|
}
|
|
11653
|
-
class jn extends
|
|
11653
|
+
class jn extends In {
|
|
11654
11654
|
constructor(t) {
|
|
11655
11655
|
super();
|
|
11656
11656
|
S(this, "circumference");
|
|
@@ -11675,7 +11675,7 @@ class jn extends dn {
|
|
|
11675
11675
|
"innerRadius",
|
|
11676
11676
|
"outerRadius",
|
|
11677
11677
|
"circumference"
|
|
11678
|
-
], o), u = (this.options.spacing + this.options.borderWidth) / 2, C = Q(I, g - l), A = $s(a, l, g) && l !== g, p = C >= ve || A, m =
|
|
11678
|
+
], o), u = (this.options.spacing + this.options.borderWidth) / 2, C = Q(I, g - l), A = $s(a, l, g) && l !== g, p = C >= ve || A, m = Gn(r, c + u, d + u);
|
|
11679
11679
|
return p && m;
|
|
11680
11680
|
}
|
|
11681
11681
|
getCenterPoint(t) {
|
|
@@ -11786,7 +11786,7 @@ const TZ = typeof Path2D == "function";
|
|
|
11786
11786
|
function JZ(n, e, t, i) {
|
|
11787
11787
|
TZ && !e.options.segment ? MZ(n, e, t, i) : LZ(n, e, t, i);
|
|
11788
11788
|
}
|
|
11789
|
-
class En extends
|
|
11789
|
+
class En extends In {
|
|
11790
11790
|
constructor(e) {
|
|
11791
11791
|
super(), this.animated = !0, this.options = void 0, this._chart = void 0, this._loop = void 0, this._fullLoop = void 0, this._path = void 0, this._points = void 0, this._segments = void 0, this._decimated = !1, this._pointsUpdated = !1, this._datasetIndex = void 0, e && Object.assign(this, e);
|
|
11792
11792
|
}
|
|
@@ -11879,7 +11879,7 @@ function PI(n, e, t, i) {
|
|
|
11879
11879
|
], i);
|
|
11880
11880
|
return Math.abs(e - s) < o.radius + o.hitRadius;
|
|
11881
11881
|
}
|
|
11882
|
-
class Ki extends
|
|
11882
|
+
class Ki extends In {
|
|
11883
11883
|
constructor(t) {
|
|
11884
11884
|
super();
|
|
11885
11885
|
S(this, "parsed");
|
|
@@ -11919,7 +11919,7 @@ class Ki extends dn {
|
|
|
11919
11919
|
}
|
|
11920
11920
|
draw(t, i) {
|
|
11921
11921
|
const o = this.options;
|
|
11922
|
-
this.skip || o.radius < 0.1 || !
|
|
11922
|
+
this.skip || o.radius < 0.1 || !Wn(this, i, this.size(o) / 2) || (t.strokeStyle = o.borderColor, t.lineWidth = o.borderWidth, t.fillStyle = o.backgroundColor, yg(t, o, this.x, this.y));
|
|
11923
11923
|
}
|
|
11924
11924
|
getRange() {
|
|
11925
11925
|
const t = this.options || {};
|
|
@@ -12009,7 +12009,7 @@ function jZ(n) {
|
|
|
12009
12009
|
}
|
|
12010
12010
|
function Jl(n, e, t, i) {
|
|
12011
12011
|
const o = e === null, s = t === null, r = n && !(o && s) && Jh(n, i);
|
|
12012
|
-
return r && (o ||
|
|
12012
|
+
return r && (o || Gn(e, r.left, r.right)) && (s || Gn(t, r.top, r.bottom));
|
|
12013
12013
|
}
|
|
12014
12014
|
function EZ(n) {
|
|
12015
12015
|
return n.topLeft || n.topRight || n.bottomLeft || n.bottomRight;
|
|
@@ -12027,7 +12027,7 @@ function Dl(n, e, t = {}) {
|
|
|
12027
12027
|
radius: n.radius
|
|
12028
12028
|
};
|
|
12029
12029
|
}
|
|
12030
|
-
class ei extends
|
|
12030
|
+
class ei extends In {
|
|
12031
12031
|
constructor(e) {
|
|
12032
12032
|
super(), this.options = void 0, this.horizontal = void 0, this.base = void 0, this.width = void 0, this.height = void 0, this.inflateAmount = void 0, e && Object.assign(this, e);
|
|
12033
12033
|
}
|
|
@@ -12106,7 +12106,7 @@ function ew(n) {
|
|
|
12106
12106
|
let e = 0;
|
|
12107
12107
|
return (t, i) => {
|
|
12108
12108
|
const o = n.getDatasetMeta(i).controller;
|
|
12109
|
-
o instanceof Hi ? e = $Z(t, e) : o instanceof
|
|
12109
|
+
o instanceof Hi ? e = $Z(t, e) : o instanceof tn ? e = qZ(t, e) : o && (e = QZ(t, e));
|
|
12110
12110
|
};
|
|
12111
12111
|
}
|
|
12112
12112
|
function QI(n) {
|
|
@@ -12204,7 +12204,7 @@ function aw(n, e) {
|
|
|
12204
12204
|
const t = e.length;
|
|
12205
12205
|
let i = 0, o;
|
|
12206
12206
|
const { iScale: s } = n, { min: a, max: r, minDefined: l, maxDefined: g } = s.getUserBounds();
|
|
12207
|
-
return l && (i = Je(
|
|
12207
|
+
return l && (i = Je(Bn(e, s.axis, a).lo, 0, t - 1)), g ? o = Je(Bn(e, s.axis, r).hi + 1, i, t) - i : o = t - i, {
|
|
12208
12208
|
start: i,
|
|
12209
12209
|
count: o
|
|
12210
12210
|
};
|
|
@@ -12448,7 +12448,7 @@ function mw(n, e, t) {
|
|
|
12448
12448
|
let r = !1, l = !1;
|
|
12449
12449
|
for (let g = 0; g < s.length; g++) {
|
|
12450
12450
|
const c = s[g], d = a[c.start][t], I = a[c.end][t];
|
|
12451
|
-
if (
|
|
12451
|
+
if (Gn(o, d, I)) {
|
|
12452
12452
|
r = o === d, l = o === I;
|
|
12453
12453
|
break;
|
|
12454
12454
|
}
|
|
@@ -12639,7 +12639,7 @@ const ou = (n, e) => {
|
|
|
12639
12639
|
itemHeight: Math.max(e, t)
|
|
12640
12640
|
};
|
|
12641
12641
|
}, Vw = (n, e) => n !== null && e !== null && n.datasetIndex === e.datasetIndex && n.index === e.index;
|
|
12642
|
-
class su extends
|
|
12642
|
+
class su extends In {
|
|
12643
12643
|
constructor(e) {
|
|
12644
12644
|
super(), this._added = !1, this.legendHitBoxes = [], this._hoveredItem = null, this.doughnutMode = !1, this.chart = e.chart, this.options = e.options, this.ctx = e.ctx, this.legendItems = void 0, this.columnSizes = void 0, this.lineWidths = void 0, this.maxHeight = void 0, this.maxWidth = void 0, this.top = void 0, this.bottom = void 0, this.left = void 0, this.right = void 0, this.height = void 0, this.width = void 0, this._margins = void 0, this.position = void 0, this.weight = void 0, this.fullSize = void 0;
|
|
12645
12645
|
}
|
|
@@ -12807,9 +12807,9 @@ class su extends dn {
|
|
|
12807
12807
|
}
|
|
12808
12808
|
_getLegendItemAt(e, t) {
|
|
12809
12809
|
let i, o, s;
|
|
12810
|
-
if (
|
|
12810
|
+
if (Gn(e, this.left, this.right) && Gn(t, this.top, this.bottom)) {
|
|
12811
12811
|
for (s = this.legendHitBoxes, i = 0; i < s.length; ++i)
|
|
12812
|
-
if (o = s[i],
|
|
12812
|
+
if (o = s[i], Gn(e, o.left, o.left + o.width) && Gn(t, o.top, o.top + o.height))
|
|
12813
12813
|
return this.legendItems[i];
|
|
12814
12814
|
}
|
|
12815
12815
|
return null;
|
|
@@ -12943,7 +12943,7 @@ var Hw = {
|
|
|
12943
12943
|
}
|
|
12944
12944
|
}
|
|
12945
12945
|
};
|
|
12946
|
-
class Rc extends
|
|
12946
|
+
class Rc extends In {
|
|
12947
12947
|
constructor(e) {
|
|
12948
12948
|
super(), this.chart = e.chart, this.options = e.options, this.ctx = e.ctx, this._padding = void 0, this.top = void 0, this.bottom = void 0, this.left = void 0, this.right = void 0, this.width = void 0, this.height = void 0, this.position = void 0, this.weight = void 0, this.fullSize = void 0;
|
|
12949
12949
|
}
|
|
@@ -13111,10 +13111,10 @@ const As = {
|
|
|
13111
13111
|
};
|
|
13112
13112
|
}
|
|
13113
13113
|
};
|
|
13114
|
-
function
|
|
13114
|
+
function Pt(n, e) {
|
|
13115
13115
|
return e && (We(e) ? Array.prototype.push.apply(n, e) : n.push(e)), n;
|
|
13116
13116
|
}
|
|
13117
|
-
function
|
|
13117
|
+
function yn(n) {
|
|
13118
13118
|
return (typeof n == "string" || n instanceof String) && n.indexOf(`
|
|
13119
13119
|
`) > -1 ? n.split(`
|
|
13120
13120
|
`) : n;
|
|
@@ -13195,7 +13195,7 @@ function za(n, e, t) {
|
|
|
13195
13195
|
return e === "center" ? n.x + n.width / 2 : e === "right" ? n.x + n.width - i.right : n.x + i.left;
|
|
13196
13196
|
}
|
|
13197
13197
|
function gu(n) {
|
|
13198
|
-
return
|
|
13198
|
+
return Pt([], yn(n));
|
|
13199
13199
|
}
|
|
13200
13200
|
function Tw(n, e, t) {
|
|
13201
13201
|
return di(n, {
|
|
@@ -13209,7 +13209,7 @@ function cu(n, e) {
|
|
|
13209
13209
|
return t ? n.override(t) : n;
|
|
13210
13210
|
}
|
|
13211
13211
|
const Qh = {
|
|
13212
|
-
beforeTitle:
|
|
13212
|
+
beforeTitle: fn,
|
|
13213
13213
|
title(n) {
|
|
13214
13214
|
if (n.length > 0) {
|
|
13215
13215
|
const e = n[0], t = e.chart.data.labels, i = t ? t.length : 0;
|
|
@@ -13222,9 +13222,9 @@ const Qh = {
|
|
|
13222
13222
|
}
|
|
13223
13223
|
return "";
|
|
13224
13224
|
},
|
|
13225
|
-
afterTitle:
|
|
13226
|
-
beforeBody:
|
|
13227
|
-
beforeLabel:
|
|
13225
|
+
afterTitle: fn,
|
|
13226
|
+
beforeBody: fn,
|
|
13227
|
+
beforeLabel: fn,
|
|
13228
13228
|
label(n) {
|
|
13229
13229
|
if (this && this.options && this.options.mode === "dataset")
|
|
13230
13230
|
return n.label + ": " + n.formattedValue || n.formattedValue;
|
|
@@ -13254,18 +13254,18 @@ const Qh = {
|
|
|
13254
13254
|
rotation: t.rotation
|
|
13255
13255
|
};
|
|
13256
13256
|
},
|
|
13257
|
-
afterLabel:
|
|
13258
|
-
afterBody:
|
|
13259
|
-
beforeFooter:
|
|
13260
|
-
footer:
|
|
13261
|
-
afterFooter:
|
|
13257
|
+
afterLabel: fn,
|
|
13258
|
+
afterBody: fn,
|
|
13259
|
+
beforeFooter: fn,
|
|
13260
|
+
footer: fn,
|
|
13261
|
+
afterFooter: fn
|
|
13262
13262
|
};
|
|
13263
13263
|
function at(n, e, t, i) {
|
|
13264
13264
|
const o = n[e].call(t, i);
|
|
13265
13265
|
return typeof o > "u" ? Qh[e].call(t, i) : o;
|
|
13266
13266
|
}
|
|
13267
13267
|
var og;
|
|
13268
|
-
let du = (og = class extends
|
|
13268
|
+
let du = (og = class extends In {
|
|
13269
13269
|
constructor(e) {
|
|
13270
13270
|
super(), this.opacity = 0, this._active = [], this._eventPosition = void 0, this._size = void 0, this._cachedAnimations = void 0, this._tooltipItems = [], this.$animations = void 0, this.$context = void 0, this.chart = e.chart, this.options = e.options, this.dataPoints = void 0, this.title = void 0, this.beforeBody = void 0, this.body = void 0, this.afterBody = void 0, this.footer = void 0, this.xAlign = void 0, this.yAlign = void 0, this.x = void 0, this.y = void 0, this.height = void 0, this.width = void 0, this.caretX = void 0, this.caretY = void 0, this.labelColors = void 0, this.labelPointStyles = void 0, this.labelTextColors = void 0;
|
|
13271
13271
|
}
|
|
@@ -13285,7 +13285,7 @@ let du = (og = class extends dn {
|
|
|
13285
13285
|
getTitle(e, t) {
|
|
13286
13286
|
const { callbacks: i } = t, o = at(i, "beforeTitle", this, e), s = at(i, "title", this, e), a = at(i, "afterTitle", this, e);
|
|
13287
13287
|
let r = [];
|
|
13288
|
-
return r =
|
|
13288
|
+
return r = Pt(r, yn(o)), r = Pt(r, yn(s)), r = Pt(r, yn(a)), r;
|
|
13289
13289
|
}
|
|
13290
13290
|
getBeforeBody(e, t) {
|
|
13291
13291
|
return gu(at(t.callbacks, "beforeBody", this, e));
|
|
@@ -13298,7 +13298,7 @@ let du = (og = class extends dn {
|
|
|
13298
13298
|
lines: [],
|
|
13299
13299
|
after: []
|
|
13300
13300
|
}, r = cu(i, s);
|
|
13301
|
-
|
|
13301
|
+
Pt(a.before, yn(at(r, "beforeLabel", this, s))), Pt(a.lines, at(r, "label", this, s)), Pt(a.after, yn(at(r, "afterLabel", this, s))), o.push(a);
|
|
13302
13302
|
}), o;
|
|
13303
13303
|
}
|
|
13304
13304
|
getAfterBody(e, t) {
|
|
@@ -13307,7 +13307,7 @@ let du = (og = class extends dn {
|
|
|
13307
13307
|
getFooter(e, t) {
|
|
13308
13308
|
const { callbacks: i } = t, o = at(i, "beforeFooter", this, e), s = at(i, "footer", this, e), a = at(i, "afterFooter", this, e);
|
|
13309
13309
|
let r = [];
|
|
13310
|
-
return r =
|
|
13310
|
+
return r = Pt(r, yn(o)), r = Pt(r, yn(s)), r = Pt(r, yn(a)), r;
|
|
13311
13311
|
}
|
|
13312
13312
|
_createItems(e) {
|
|
13313
13313
|
const t = this._active, i = this.chart.data, o = [], s = [], a = [];
|
|
@@ -13731,7 +13731,7 @@ function Ew(n, e) {
|
|
|
13731
13731
|
}), t;
|
|
13732
13732
|
}
|
|
13733
13733
|
function uu(n, e, { horizontal: t, minRotation: i }) {
|
|
13734
|
-
const o =
|
|
13734
|
+
const o = Kt(i), s = (t ? Math.sin(o) : Math.cos(o)) || 1e-3, a = 0.75 * e * ("" + n).length;
|
|
13735
13735
|
return Math.min(e / s, a);
|
|
13736
13736
|
}
|
|
13737
13737
|
class Wr extends Ii {
|
|
@@ -13746,7 +13746,7 @@ class Wr extends Ii {
|
|
|
13746
13746
|
let { min: o, max: s } = this;
|
|
13747
13747
|
const a = (l) => o = t ? o : l, r = (l) => s = i ? s : l;
|
|
13748
13748
|
if (e) {
|
|
13749
|
-
const l =
|
|
13749
|
+
const l = en(o), g = en(s);
|
|
13750
13750
|
l < 0 && g < 0 ? r(0) : l > 0 && g > 0 && a(0);
|
|
13751
13751
|
}
|
|
13752
13752
|
if (o === s) {
|
|
@@ -13801,7 +13801,7 @@ class ji extends Wr {
|
|
|
13801
13801
|
this.min = He(e) ? e : 0, this.max = He(t) ? t : 1, this.handleTickRangeOptions();
|
|
13802
13802
|
}
|
|
13803
13803
|
computeTickLimit() {
|
|
13804
|
-
const e = this.isHorizontal(), t = e ? this.width : this.height, i =
|
|
13804
|
+
const e = this.isHorizontal(), t = e ? this.width : this.height, i = Kt(this.options.ticks.minRotation), o = (e ? Math.sin(i) : Math.cos(i)) || 1e-3, s = this._resolveTickFontOptions(0);
|
|
13805
13805
|
return Math.ceil(t / Math.min(40, s.lineHeight / o));
|
|
13806
13806
|
}
|
|
13807
13807
|
getPixelForValue(e) {
|
|
@@ -13974,16 +13974,16 @@ function tv(n, e) {
|
|
|
13974
13974
|
if (!e)
|
|
13975
13975
|
return !0;
|
|
13976
13976
|
const { left: t, top: i, right: o, bottom: s } = n;
|
|
13977
|
-
return !(
|
|
13977
|
+
return !(Wn({
|
|
13978
13978
|
x: t,
|
|
13979
13979
|
y: i
|
|
13980
|
-
}, e) ||
|
|
13980
|
+
}, e) || Wn({
|
|
13981
13981
|
x: t,
|
|
13982
13982
|
y: s
|
|
13983
|
-
}, e) ||
|
|
13983
|
+
}, e) || Wn({
|
|
13984
13984
|
x: o,
|
|
13985
13985
|
y: i
|
|
13986
|
-
}, e) ||
|
|
13986
|
+
}, e) || Wn({
|
|
13987
13987
|
x: o,
|
|
13988
13988
|
y: s
|
|
13989
13989
|
}, e));
|
|
@@ -14096,7 +14096,7 @@ class fo extends Wr {
|
|
|
14096
14096
|
}
|
|
14097
14097
|
getIndexAngle(e) {
|
|
14098
14098
|
const t = ve / (this._pointLabels.length || 1), i = this.options.startAngle || 0;
|
|
14099
|
-
return ft(e * t +
|
|
14099
|
+
return ft(e * t + Kt(i));
|
|
14100
14100
|
}
|
|
14101
14101
|
getDistanceFromCenterForValue(e) {
|
|
14102
14102
|
if (ce(e))
|
|
@@ -14441,7 +14441,7 @@ class ia extends Ii {
|
|
|
14441
14441
|
return this.min + i * (this.max - this.min);
|
|
14442
14442
|
}
|
|
14443
14443
|
_getLabelSize(e) {
|
|
14444
|
-
const t = this.options.ticks, i = this.ctx.measureText(e).width, o =
|
|
14444
|
+
const t = this.options.ticks, i = this.ctx.measureText(e).width, o = Kt(this.isHorizontal() ? t.maxRotation : t.minRotation), s = Math.cos(o), a = Math.sin(o), r = this._resolveTickFontOptions(0).size;
|
|
14445
14445
|
return {
|
|
14446
14446
|
w: i * s + r * a,
|
|
14447
14447
|
h: i * a + r * s
|
|
@@ -14499,7 +14499,7 @@ S(ia, "id", "time"), S(ia, "defaults", {
|
|
|
14499
14499
|
});
|
|
14500
14500
|
function Ma(n, e, t) {
|
|
14501
14501
|
let i = 0, o = n.length - 1, s, a, r, l;
|
|
14502
|
-
t ? (e >= n[i].pos && e <= n[o].pos && ({ lo: i, hi: o } =
|
|
14502
|
+
t ? (e >= n[i].pos && e <= n[o].pos && ({ lo: i, hi: o } = Bn(n, "pos", e)), { pos: s, time: r } = n[i], { pos: a, time: l } = n[o]) : (e >= n[i].time && e <= n[o].time && ({ lo: i, hi: o } = Bn(n, "time", e)), { time: s, pos: r } = n[i], { time: a, pos: l } = n[o]);
|
|
14503
14503
|
const g = a - s;
|
|
14504
14504
|
return g ? r + (l - r) * (e - s) / g : r;
|
|
14505
14505
|
}
|
|
@@ -14607,7 +14607,7 @@ function Hg(n, e, t) {
|
|
|
14607
14607
|
for (var i = 0; i < e.length; ++i)
|
|
14608
14608
|
n[i] = e[i] * t;
|
|
14609
14609
|
}
|
|
14610
|
-
function
|
|
14610
|
+
function vn(n, e, t, i, o) {
|
|
14611
14611
|
for (var s = 0; s < n.length; ++s)
|
|
14612
14612
|
n[s] = e * t[s] + i * o[s];
|
|
14613
14613
|
}
|
|
@@ -14651,14 +14651,14 @@ function eA(n, e, t) {
|
|
|
14651
14651
|
Z[A] /= u;
|
|
14652
14652
|
}
|
|
14653
14653
|
var R = C[u];
|
|
14654
|
-
if (
|
|
14655
|
-
|
|
14654
|
+
if (vn(w, 1 + l, Z, -l, R), w.fx = n(w), w.fx < C[0].fx)
|
|
14655
|
+
vn(W, 1 + g, Z, -g, R), W.fx = n(W), W.fx < w.fx ? m(W) : m(w);
|
|
14656
14656
|
else if (w.fx >= C[u - 1].fx) {
|
|
14657
14657
|
var M = !1;
|
|
14658
|
-
if (w.fx > R.fx ? (
|
|
14658
|
+
if (w.fx > R.fx ? (vn(v, 1 + c, Z, -c, R), v.fx = n(v), v.fx < R.fx ? m(v) : M = !0) : (vn(v, 1 - c * l, Z, c * l, R), v.fx = n(v), v.fx < w.fx ? m(v) : M = !0), M) {
|
|
14659
14659
|
if (d >= 1) break;
|
|
14660
14660
|
for (A = 1; A < C.length; ++A)
|
|
14661
|
-
|
|
14661
|
+
vn(C[A], 1 - d, C[0], d, C[A]), C[A].fx = n(C[A]);
|
|
14662
14662
|
}
|
|
14663
14663
|
} else
|
|
14664
14664
|
m(w);
|
|
@@ -14673,7 +14673,7 @@ function hv(n, e, t, i, o, s, a) {
|
|
|
14673
14673
|
o = o || 1, s = s || 1e-6, a = a || 0.1;
|
|
14674
14674
|
function u(A, p, m) {
|
|
14675
14675
|
for (var b = 0; b < 16; ++b)
|
|
14676
|
-
if (o = (A + p) / 2,
|
|
14676
|
+
if (o = (A + p) / 2, vn(i.x, 1, t.x, o, e), g = i.fx = n(i.x, i.fxprime), d = Wo(i.fxprime, e), g > r + s * o * l || g >= m)
|
|
14677
14677
|
p = o;
|
|
14678
14678
|
else {
|
|
14679
14679
|
if (Math.abs(d) <= -a * l)
|
|
@@ -14683,7 +14683,7 @@ function hv(n, e, t, i, o, s, a) {
|
|
|
14683
14683
|
return 0;
|
|
14684
14684
|
}
|
|
14685
14685
|
for (var C = 0; C < 10; ++C) {
|
|
14686
|
-
if (
|
|
14686
|
+
if (vn(i.x, 1, t.x, o, e), g = i.fx = n(i.x, i.fxprime), d = Wo(i.fxprime, e), g > r + s * o * l || C && g >= c)
|
|
14687
14687
|
return u(I, o, c);
|
|
14688
14688
|
if (Math.abs(d) <= -a * l)
|
|
14689
14689
|
return o;
|
|
@@ -14705,9 +14705,9 @@ function Av(n, e, t) {
|
|
|
14705
14705
|
}), !l)
|
|
14706
14706
|
Hg(a, i.fxprime, -1);
|
|
14707
14707
|
else {
|
|
14708
|
-
|
|
14708
|
+
vn(s, 1, o.fxprime, -1, i.fxprime);
|
|
14709
14709
|
var d = Wo(i.fxprime, i.fxprime), I = Math.max(0, Wo(s, o.fxprime) / d);
|
|
14710
|
-
|
|
14710
|
+
vn(a, I, a, -1, o.fxprime), r = i, i = o, o = r;
|
|
14711
14711
|
}
|
|
14712
14712
|
if (kg(i.fxprime) <= 1e-5)
|
|
14713
14713
|
break;
|
|
@@ -15345,7 +15345,7 @@ function zv(n, e, t, i) {
|
|
|
15345
15345
|
y: e + Math.sin(i * Fg) * t
|
|
15346
15346
|
};
|
|
15347
15347
|
}
|
|
15348
|
-
class no extends
|
|
15348
|
+
class no extends In {
|
|
15349
15349
|
inRange(e, t) {
|
|
15350
15350
|
var i;
|
|
15351
15351
|
const o = this.getProps(["arcs", "refs", "sets"]), s = new Set(o.sets);
|
|
@@ -18205,7 +18205,7 @@ function pG(n, e = {}) {
|
|
|
18205
18205
|
]
|
|
18206
18206
|
};
|
|
18207
18207
|
}
|
|
18208
|
-
const Vr = Math.min, _i = Math.max, Xr = Math.round, La = Math.floor,
|
|
18208
|
+
const Vr = Math.min, _i = Math.max, Xr = Math.round, La = Math.floor, nn = (n) => ({
|
|
18209
18209
|
x: n,
|
|
18210
18210
|
y: n
|
|
18211
18211
|
}), fG = {
|
|
@@ -18525,7 +18525,7 @@ const WG = function(n) {
|
|
|
18525
18525
|
Ae === "y";
|
|
18526
18526
|
}
|
|
18527
18527
|
return !0;
|
|
18528
|
-
}).map((Xe) => [Xe.placement, Xe.overflows.filter((Ae) => Ae > 0).reduce((Ae,
|
|
18528
|
+
}).map((Xe) => [Xe.placement, Xe.overflows.filter((Ae) => Ae > 0).reduce((Ae, jt) => Ae + jt, 0)]).sort((Xe, Ae) => Xe[1] - Ae[1])[0]) == null ? void 0 : P[0];
|
|
18529
18529
|
ue && (de = ue);
|
|
18530
18530
|
break;
|
|
18531
18531
|
}
|
|
@@ -18657,17 +18657,17 @@ function bt(n) {
|
|
|
18657
18657
|
var e;
|
|
18658
18658
|
return (n == null || (e = n.ownerDocument) == null ? void 0 : e.defaultView) || window;
|
|
18659
18659
|
}
|
|
18660
|
-
function
|
|
18660
|
+
function un(n) {
|
|
18661
18661
|
var e;
|
|
18662
18662
|
return (e = (uA(n) ? n.ownerDocument : n.document) || window.document) == null ? void 0 : e.documentElement;
|
|
18663
18663
|
}
|
|
18664
18664
|
function uA(n) {
|
|
18665
18665
|
return sl() ? n instanceof Node || n instanceof bt(n).Node : !1;
|
|
18666
18666
|
}
|
|
18667
|
-
function
|
|
18667
|
+
function Mt(n) {
|
|
18668
18668
|
return sl() ? n instanceof Element || n instanceof bt(n).Element : !1;
|
|
18669
18669
|
}
|
|
18670
|
-
function
|
|
18670
|
+
function an(n) {
|
|
18671
18671
|
return sl() ? n instanceof HTMLElement || n instanceof bt(n).HTMLElement : !1;
|
|
18672
18672
|
}
|
|
18673
18673
|
function Bu(n) {
|
|
@@ -18679,7 +18679,7 @@ function ha(n) {
|
|
|
18679
18679
|
overflowX: t,
|
|
18680
18680
|
overflowY: i,
|
|
18681
18681
|
display: o
|
|
18682
|
-
} =
|
|
18682
|
+
} = Lt(n);
|
|
18683
18683
|
return /auto|scroll|overlay|hidden|clip/.test(e + i + t) && !["inline", "contents"].includes(o);
|
|
18684
18684
|
}
|
|
18685
18685
|
function xG(n) {
|
|
@@ -18695,12 +18695,12 @@ function al(n) {
|
|
|
18695
18695
|
});
|
|
18696
18696
|
}
|
|
18697
18697
|
function kc(n) {
|
|
18698
|
-
const e = Hc(), t =
|
|
18698
|
+
const e = Hc(), t = Mt(n) ? Lt(n) : n;
|
|
18699
18699
|
return t.transform !== "none" || t.perspective !== "none" || (t.containerType ? t.containerType !== "normal" : !1) || !e && (t.backdropFilter ? t.backdropFilter !== "none" : !1) || !e && (t.filter ? t.filter !== "none" : !1) || ["transform", "perspective", "filter"].some((i) => (t.willChange || "").includes(i)) || ["paint", "layout", "strict", "content"].some((i) => (t.contain || "").includes(i));
|
|
18700
18700
|
}
|
|
18701
18701
|
function kG(n) {
|
|
18702
18702
|
let e = li(n);
|
|
18703
|
-
for (;
|
|
18703
|
+
for (; an(e) && !Mo(e); ) {
|
|
18704
18704
|
if (kc(e))
|
|
18705
18705
|
return e;
|
|
18706
18706
|
if (al(e))
|
|
@@ -18715,11 +18715,11 @@ function Hc() {
|
|
|
18715
18715
|
function Mo(n) {
|
|
18716
18716
|
return ["html", "body", "#document"].includes(Eo(n));
|
|
18717
18717
|
}
|
|
18718
|
-
function
|
|
18718
|
+
function Lt(n) {
|
|
18719
18719
|
return bt(n).getComputedStyle(n);
|
|
18720
18720
|
}
|
|
18721
18721
|
function rl(n) {
|
|
18722
|
-
return
|
|
18722
|
+
return Mt(n) ? {
|
|
18723
18723
|
scrollLeft: n.scrollLeft,
|
|
18724
18724
|
scrollTop: n.scrollTop
|
|
18725
18725
|
} : {
|
|
@@ -18735,13 +18735,13 @@ function li(n) {
|
|
|
18735
18735
|
n.assignedSlot || // DOM Element detected.
|
|
18736
18736
|
n.parentNode || // ShadowRoot detected.
|
|
18737
18737
|
Bu(n) && n.host || // Fallback.
|
|
18738
|
-
|
|
18738
|
+
un(n)
|
|
18739
18739
|
);
|
|
18740
18740
|
return Bu(e) ? e.host : e;
|
|
18741
18741
|
}
|
|
18742
18742
|
function CA(n) {
|
|
18743
18743
|
const e = li(n);
|
|
18744
|
-
return Mo(e) ? n.ownerDocument ? n.ownerDocument.body : n.body :
|
|
18744
|
+
return Mo(e) ? n.ownerDocument ? n.ownerDocument.body : n.body : an(e) && ha(e) ? e : CA(e);
|
|
18745
18745
|
}
|
|
18746
18746
|
function oa(n, e, t) {
|
|
18747
18747
|
var i;
|
|
@@ -18757,9 +18757,9 @@ function _g(n) {
|
|
|
18757
18757
|
return n.parent && Object.getPrototypeOf(n.parent) ? n.frameElement : null;
|
|
18758
18758
|
}
|
|
18759
18759
|
function hA(n) {
|
|
18760
|
-
const e =
|
|
18760
|
+
const e = Lt(n);
|
|
18761
18761
|
let t = parseFloat(e.width) || 0, i = parseFloat(e.height) || 0;
|
|
18762
|
-
const o =
|
|
18762
|
+
const o = an(n), s = o ? n.offsetWidth : t, a = o ? n.offsetHeight : i, r = Xr(t) !== s || Xr(i) !== a;
|
|
18763
18763
|
return r && (t = s, i = a), {
|
|
18764
18764
|
width: t,
|
|
18765
18765
|
height: i,
|
|
@@ -18767,12 +18767,12 @@ function hA(n) {
|
|
|
18767
18767
|
};
|
|
18768
18768
|
}
|
|
18769
18769
|
function Sc(n) {
|
|
18770
|
-
return
|
|
18770
|
+
return Mt(n) ? n : n.contextElement;
|
|
18771
18771
|
}
|
|
18772
18772
|
function Vo(n) {
|
|
18773
18773
|
const e = Sc(n);
|
|
18774
|
-
if (!
|
|
18775
|
-
return
|
|
18774
|
+
if (!an(e))
|
|
18775
|
+
return nn(1);
|
|
18776
18776
|
const t = e.getBoundingClientRect(), {
|
|
18777
18777
|
width: i,
|
|
18778
18778
|
height: o,
|
|
@@ -18784,7 +18784,7 @@ function Vo(n) {
|
|
|
18784
18784
|
y: r
|
|
18785
18785
|
};
|
|
18786
18786
|
}
|
|
18787
|
-
const HG = /* @__PURE__ */
|
|
18787
|
+
const HG = /* @__PURE__ */ nn(0);
|
|
18788
18788
|
function AA(n) {
|
|
18789
18789
|
const e = bt(n);
|
|
18790
18790
|
return !Hc() || !e.visualViewport ? HG : {
|
|
@@ -18798,15 +18798,15 @@ function SG(n, e, t) {
|
|
|
18798
18798
|
function Pi(n, e, t, i) {
|
|
18799
18799
|
e === void 0 && (e = !1), t === void 0 && (t = !1);
|
|
18800
18800
|
const o = n.getBoundingClientRect(), s = Sc(n);
|
|
18801
|
-
let a =
|
|
18802
|
-
e && (i ?
|
|
18803
|
-
const r = SG(s, t, i) ? AA(s) :
|
|
18801
|
+
let a = nn(1);
|
|
18802
|
+
e && (i ? Mt(i) && (a = Vo(i)) : a = Vo(n));
|
|
18803
|
+
const r = SG(s, t, i) ? AA(s) : nn(0);
|
|
18804
18804
|
let l = (o.left + r.x) / a.x, g = (o.top + r.y) / a.y, c = o.width / a.x, d = o.height / a.y;
|
|
18805
18805
|
if (s) {
|
|
18806
|
-
const I = bt(s), u = i &&
|
|
18806
|
+
const I = bt(s), u = i && Mt(i) ? bt(i) : i;
|
|
18807
18807
|
let C = I, A = _g(C);
|
|
18808
18808
|
for (; A && i && u !== C; ) {
|
|
18809
|
-
const p = Vo(A), m = A.getBoundingClientRect(), b =
|
|
18809
|
+
const p = Vo(A), m = A.getBoundingClientRect(), b = Lt(A), Z = m.left + (A.clientLeft + parseFloat(b.paddingLeft)) * p.x, w = m.top + (A.clientTop + parseFloat(b.paddingTop)) * p.y;
|
|
18810
18810
|
l *= p.x, g *= p.y, c *= p.x, d *= p.y, l += Z, g += w, C = bt(A), A = _g(C);
|
|
18811
18811
|
}
|
|
18812
18812
|
}
|
|
@@ -18819,7 +18819,7 @@ function Pi(n, e, t, i) {
|
|
|
18819
18819
|
}
|
|
18820
18820
|
function Yc(n, e) {
|
|
18821
18821
|
const t = rl(n).scrollLeft;
|
|
18822
|
-
return e ? e.left + t : Pi(
|
|
18822
|
+
return e ? e.left + t : Pi(un(n)).left + t;
|
|
18823
18823
|
}
|
|
18824
18824
|
function pA(n, e, t) {
|
|
18825
18825
|
t === void 0 && (t = !1);
|
|
@@ -18839,19 +18839,19 @@ function YG(n) {
|
|
|
18839
18839
|
offsetParent: i,
|
|
18840
18840
|
strategy: o
|
|
18841
18841
|
} = n;
|
|
18842
|
-
const s = o === "fixed", a =
|
|
18842
|
+
const s = o === "fixed", a = un(i), r = e ? al(e.floating) : !1;
|
|
18843
18843
|
if (i === a || r && s)
|
|
18844
18844
|
return t;
|
|
18845
18845
|
let l = {
|
|
18846
18846
|
scrollLeft: 0,
|
|
18847
18847
|
scrollTop: 0
|
|
18848
|
-
}, g =
|
|
18849
|
-
const c =
|
|
18850
|
-
if ((d || !d && !s) && ((Eo(i) !== "body" || ha(a)) && (l = rl(i)),
|
|
18848
|
+
}, g = nn(1);
|
|
18849
|
+
const c = nn(0), d = an(i);
|
|
18850
|
+
if ((d || !d && !s) && ((Eo(i) !== "body" || ha(a)) && (l = rl(i)), an(i))) {
|
|
18851
18851
|
const u = Pi(i);
|
|
18852
18852
|
g = Vo(i), c.x = u.x + i.clientLeft, c.y = u.y + i.clientTop;
|
|
18853
18853
|
}
|
|
18854
|
-
const I = a && !d && !s ? pA(a, l, !0) :
|
|
18854
|
+
const I = a && !d && !s ? pA(a, l, !0) : nn(0);
|
|
18855
18855
|
return {
|
|
18856
18856
|
width: t.width * g.x,
|
|
18857
18857
|
height: t.height * g.y,
|
|
@@ -18863,10 +18863,10 @@ function NG(n) {
|
|
|
18863
18863
|
return Array.from(n.getClientRects());
|
|
18864
18864
|
}
|
|
18865
18865
|
function FG(n) {
|
|
18866
|
-
const e =
|
|
18866
|
+
const e = un(n), t = rl(n), i = n.ownerDocument.body, o = _i(e.scrollWidth, e.clientWidth, i.scrollWidth, i.clientWidth), s = _i(e.scrollHeight, e.clientHeight, i.scrollHeight, i.clientHeight);
|
|
18867
18867
|
let a = -t.scrollLeft + Yc(n);
|
|
18868
18868
|
const r = -t.scrollTop;
|
|
18869
|
-
return
|
|
18869
|
+
return Lt(i).direction === "rtl" && (a += _i(e.clientWidth, i.clientWidth) - o), {
|
|
18870
18870
|
width: o,
|
|
18871
18871
|
height: s,
|
|
18872
18872
|
x: a,
|
|
@@ -18874,7 +18874,7 @@ function FG(n) {
|
|
|
18874
18874
|
};
|
|
18875
18875
|
}
|
|
18876
18876
|
function KG(n, e) {
|
|
18877
|
-
const t = bt(n), i =
|
|
18877
|
+
const t = bt(n), i = un(n), o = t.visualViewport;
|
|
18878
18878
|
let s = i.clientWidth, a = i.clientHeight, r = 0, l = 0;
|
|
18879
18879
|
if (o) {
|
|
18880
18880
|
s = o.width, a = o.height;
|
|
@@ -18889,7 +18889,7 @@ function KG(n, e) {
|
|
|
18889
18889
|
};
|
|
18890
18890
|
}
|
|
18891
18891
|
function _G(n, e) {
|
|
18892
|
-
const t = Pi(n, !0, e === "fixed"), i = t.top + n.clientTop, o = t.left + n.clientLeft, s =
|
|
18892
|
+
const t = Pi(n, !0, e === "fixed"), i = t.top + n.clientTop, o = t.left + n.clientLeft, s = an(n) ? Vo(n) : nn(1), a = n.clientWidth * s.x, r = n.clientHeight * s.y, l = o * s.x, g = i * s.y;
|
|
18893
18893
|
return {
|
|
18894
18894
|
width: a,
|
|
18895
18895
|
height: r,
|
|
@@ -18902,8 +18902,8 @@ function Wu(n, e, t) {
|
|
|
18902
18902
|
if (e === "viewport")
|
|
18903
18903
|
i = KG(n, t);
|
|
18904
18904
|
else if (e === "document")
|
|
18905
|
-
i = FG(
|
|
18906
|
-
else if (
|
|
18905
|
+
i = FG(un(n));
|
|
18906
|
+
else if (Mt(e))
|
|
18907
18907
|
i = _G(e, t);
|
|
18908
18908
|
else {
|
|
18909
18909
|
const o = AA(n);
|
|
@@ -18918,17 +18918,17 @@ function Wu(n, e, t) {
|
|
|
18918
18918
|
}
|
|
18919
18919
|
function fA(n, e) {
|
|
18920
18920
|
const t = li(n);
|
|
18921
|
-
return t === e || !
|
|
18921
|
+
return t === e || !Mt(t) || Mo(t) ? !1 : Lt(t).position === "fixed" || fA(t, e);
|
|
18922
18922
|
}
|
|
18923
18923
|
function zG(n, e) {
|
|
18924
18924
|
const t = e.get(n);
|
|
18925
18925
|
if (t)
|
|
18926
18926
|
return t;
|
|
18927
|
-
let i = oa(n, [], !1).filter((r) =>
|
|
18928
|
-
const s =
|
|
18927
|
+
let i = oa(n, [], !1).filter((r) => Mt(r) && Eo(r) !== "body"), o = null;
|
|
18928
|
+
const s = Lt(n).position === "fixed";
|
|
18929
18929
|
let a = s ? li(n) : n;
|
|
18930
|
-
for (;
|
|
18931
|
-
const r =
|
|
18930
|
+
for (; Mt(a) && !Mo(a); ) {
|
|
18931
|
+
const r = Lt(a), l = kc(a);
|
|
18932
18932
|
!l && r.position === "fixed" && (o = null), (s ? !l && !o : !l && r.position === "static" && !!o && ["absolute", "fixed"].includes(o.position) || ha(a) && !l && fA(n, a)) ? i = i.filter((c) => c !== a) : o = r, a = li(a);
|
|
18933
18933
|
}
|
|
18934
18934
|
return e.set(n, i), i;
|
|
@@ -18962,18 +18962,18 @@ function LG(n) {
|
|
|
18962
18962
|
};
|
|
18963
18963
|
}
|
|
18964
18964
|
function TG(n, e, t) {
|
|
18965
|
-
const i =
|
|
18965
|
+
const i = an(e), o = un(e), s = t === "fixed", a = Pi(n, !0, s, e);
|
|
18966
18966
|
let r = {
|
|
18967
18967
|
scrollLeft: 0,
|
|
18968
18968
|
scrollTop: 0
|
|
18969
18969
|
};
|
|
18970
|
-
const l =
|
|
18970
|
+
const l = nn(0);
|
|
18971
18971
|
if (i || !i && !s)
|
|
18972
18972
|
if ((Eo(e) !== "body" || ha(o)) && (r = rl(e)), i) {
|
|
18973
18973
|
const I = Pi(e, !0, s, e);
|
|
18974
18974
|
l.x = I.x + e.clientLeft, l.y = I.y + e.clientTop;
|
|
18975
18975
|
} else o && (l.x = Yc(o));
|
|
18976
|
-
const g = o && !i && !s ? pA(o, r) :
|
|
18976
|
+
const g = o && !i && !s ? pA(o, r) : nn(0), c = a.left + r.scrollLeft - l.x - g.x, d = a.top + r.scrollTop - l.y - g.y;
|
|
18977
18977
|
return {
|
|
18978
18978
|
x: c,
|
|
18979
18979
|
y: d,
|
|
@@ -18982,24 +18982,24 @@ function TG(n, e, t) {
|
|
|
18982
18982
|
};
|
|
18983
18983
|
}
|
|
18984
18984
|
function El(n) {
|
|
18985
|
-
return
|
|
18985
|
+
return Lt(n).position === "static";
|
|
18986
18986
|
}
|
|
18987
18987
|
function Vu(n, e) {
|
|
18988
|
-
if (!
|
|
18988
|
+
if (!an(n) || Lt(n).position === "fixed")
|
|
18989
18989
|
return null;
|
|
18990
18990
|
if (e)
|
|
18991
18991
|
return e(n);
|
|
18992
18992
|
let t = n.offsetParent;
|
|
18993
|
-
return
|
|
18993
|
+
return un(n) === t && (t = t.ownerDocument.body), t;
|
|
18994
18994
|
}
|
|
18995
18995
|
function mA(n, e) {
|
|
18996
18996
|
const t = bt(n);
|
|
18997
18997
|
if (al(n))
|
|
18998
18998
|
return t;
|
|
18999
|
-
if (!
|
|
18999
|
+
if (!an(n)) {
|
|
19000
19000
|
let o = li(n);
|
|
19001
19001
|
for (; o && !Mo(o); ) {
|
|
19002
|
-
if (
|
|
19002
|
+
if (Mt(o) && !El(o))
|
|
19003
19003
|
return o;
|
|
19004
19004
|
o = li(o);
|
|
19005
19005
|
}
|
|
@@ -19023,23 +19023,23 @@ const JG = async function(n) {
|
|
|
19023
19023
|
};
|
|
19024
19024
|
};
|
|
19025
19025
|
function DG(n) {
|
|
19026
|
-
return
|
|
19026
|
+
return Lt(n).direction === "rtl";
|
|
19027
19027
|
}
|
|
19028
19028
|
const OG = {
|
|
19029
19029
|
convertOffsetParentRelativeRectToViewportRelativeRect: YG,
|
|
19030
|
-
getDocumentElement:
|
|
19030
|
+
getDocumentElement: un,
|
|
19031
19031
|
getClippingRect: MG,
|
|
19032
19032
|
getOffsetParent: mA,
|
|
19033
19033
|
getElementRects: JG,
|
|
19034
19034
|
getClientRects: NG,
|
|
19035
19035
|
getDimensions: LG,
|
|
19036
19036
|
getScale: Vo,
|
|
19037
|
-
isElement:
|
|
19037
|
+
isElement: Mt,
|
|
19038
19038
|
isRTL: DG
|
|
19039
19039
|
};
|
|
19040
19040
|
function jG(n, e) {
|
|
19041
19041
|
let t = null, i;
|
|
19042
|
-
const o =
|
|
19042
|
+
const o = un(n);
|
|
19043
19043
|
function s() {
|
|
19044
19044
|
var r;
|
|
19045
19045
|
clearTimeout(i), (r = t) == null || r.disconnect(), t = null;
|
|
@@ -19264,7 +19264,7 @@ function s2(n) {
|
|
|
19264
19264
|
return `(${t(n.label, !0)}, ${t(n.parsed.y, !1)})`;
|
|
19265
19265
|
}
|
|
19266
19266
|
function a2(n) {
|
|
19267
|
-
const e =
|
|
19267
|
+
const e = tn.overrides.plugins.tooltip.callbacks.label.call(this, n), t = n.chart.data.datasets[n.datasetIndex].data[n.dataIndex], i = ["rMin", "rMax"];
|
|
19268
19268
|
return t == null || i.every((o) => t[o] == null) ? e : `${e} [${_c(t[i[0]])} .. ${t[i[1]]}]`;
|
|
19269
19269
|
}
|
|
19270
19270
|
const wA = {
|
|
@@ -19386,7 +19386,7 @@ class g2 extends ke {
|
|
|
19386
19386
|
}
|
|
19387
19387
|
}
|
|
19388
19388
|
g2.id = Ci.id;
|
|
19389
|
-
class Uo extends
|
|
19389
|
+
class Uo extends Vn {
|
|
19390
19390
|
getMinMax(e, t) {
|
|
19391
19391
|
return cl(e, (i) => super.getMinMax(i, t));
|
|
19392
19392
|
}
|
|
@@ -19422,14 +19422,14 @@ class Uo extends Wn {
|
|
|
19422
19422
|
}
|
|
19423
19423
|
Uo.id = "lineWithErrorBars";
|
|
19424
19424
|
Uo.defaults = yt({}, [
|
|
19425
|
-
|
|
19425
|
+
Vn.defaults,
|
|
19426
19426
|
gl,
|
|
19427
19427
|
{
|
|
19428
19428
|
dataElementType: Xt.id
|
|
19429
19429
|
}
|
|
19430
19430
|
]);
|
|
19431
19431
|
Uo.overrides = yt({}, [
|
|
19432
|
-
|
|
19432
|
+
Vn.overrides,
|
|
19433
19433
|
{
|
|
19434
19434
|
plugins: {
|
|
19435
19435
|
tooltip: {
|
|
@@ -19440,7 +19440,7 @@ Uo.overrides = yt({}, [
|
|
|
19440
19440
|
}
|
|
19441
19441
|
}
|
|
19442
19442
|
]);
|
|
19443
|
-
Uo.defaultRoutes =
|
|
19443
|
+
Uo.defaultRoutes = Vn.defaultRoutes;
|
|
19444
19444
|
class c2 extends ke {
|
|
19445
19445
|
constructor(e, t) {
|
|
19446
19446
|
super(e, dl("lineWithErrorBars", t, Uo, Xt, [
|
|
@@ -19500,14 +19500,14 @@ Qo.overrides = yt({}, [
|
|
|
19500
19500
|
}
|
|
19501
19501
|
}
|
|
19502
19502
|
]);
|
|
19503
|
-
Qo.defaultRoutes =
|
|
19503
|
+
Qo.defaultRoutes = Vn.defaultRoutes;
|
|
19504
19504
|
class d2 extends ke {
|
|
19505
19505
|
constructor(e, t) {
|
|
19506
19506
|
super(e, dl("scatterWithErrorBars", t, Qo, Xt, [ji]));
|
|
19507
19507
|
}
|
|
19508
19508
|
}
|
|
19509
19509
|
d2.id = Qo.id;
|
|
19510
|
-
class $o extends
|
|
19510
|
+
class $o extends tn {
|
|
19511
19511
|
getMinMaxImpl(e) {
|
|
19512
19512
|
const t = this._cachedMeta, i = {
|
|
19513
19513
|
min: Number.POSITIVE_INFINITY,
|
|
@@ -19555,14 +19555,14 @@ class $o extends en {
|
|
|
19555
19555
|
}
|
|
19556
19556
|
$o.id = "polarAreaWithErrorBars";
|
|
19557
19557
|
$o.defaults = yt({}, [
|
|
19558
|
-
|
|
19558
|
+
tn.defaults,
|
|
19559
19559
|
gl,
|
|
19560
19560
|
{
|
|
19561
19561
|
dataElementType: Po.id
|
|
19562
19562
|
}
|
|
19563
19563
|
]);
|
|
19564
19564
|
$o.overrides = yt({}, [
|
|
19565
|
-
|
|
19565
|
+
tn.overrides,
|
|
19566
19566
|
{
|
|
19567
19567
|
plugins: {
|
|
19568
19568
|
tooltip: {
|
|
@@ -19573,7 +19573,7 @@ $o.overrides = yt({}, [
|
|
|
19573
19573
|
}
|
|
19574
19574
|
}
|
|
19575
19575
|
]);
|
|
19576
|
-
$o.defaultRoutes =
|
|
19576
|
+
$o.defaultRoutes = tn.defaultRoutes;
|
|
19577
19577
|
class I2 extends ke {
|
|
19578
19578
|
constructor(e, t) {
|
|
19579
19579
|
super(e, dl("polarAreaWithErrorBars", t, $o, Po, [
|
|
@@ -20054,7 +20054,7 @@ function f2(n, e) {
|
|
|
20054
20054
|
config: Ee(Ee({}, Xo), Ye.defaultConfig),
|
|
20055
20055
|
l10n: aa
|
|
20056
20056
|
};
|
|
20057
|
-
t.parseDate = Lg({ config: t.config, l10n: t.l10n }), t._handlers = [], t.pluginElements = [], t.loadedPlugins = [], t._bind = A, t._setHoursFromDate = I, t._positionCalendar = wa, t.changeMonth = _n, t.changeYear = ba, t.clear = zn, t.close = mi, t.onMouseOver = Za, t._createElement = Ie, t.createDay = W, t.destroy =
|
|
20057
|
+
t.parseDate = Lg({ config: t.config, l10n: t.l10n }), t._handlers = [], t.pluginElements = [], t.loadedPlugins = [], t._bind = A, t._setHoursFromDate = I, t._positionCalendar = wa, t.changeMonth = _n, t.changeYear = ba, t.clear = zn, t.close = mi, t.onMouseOver = Za, t._createElement = Ie, t.createDay = W, t.destroy = An, t.isEnabled = bi, t.jumpToDate = b, t.updateValue = pn, t.open = vp, t.redraw = rd, t.set = Vp, t.setDate = Xp, t.toggle = Hp;
|
|
20058
20058
|
function i() {
|
|
20059
20059
|
t.utils = {
|
|
20060
20060
|
getDaysInMonth: function(f, y) {
|
|
@@ -20063,7 +20063,7 @@ function f2(n, e) {
|
|
|
20063
20063
|
};
|
|
20064
20064
|
}
|
|
20065
20065
|
function o() {
|
|
20066
|
-
t.element = t.input = n, t.isOpen = !1, Gp(), ad(), xp(), Rp(), i(), t.isMobile || v(), m(), (t.selectedDates.length || t.config.noCalendar) && (t.config.enableTime && I(t.config.noCalendar ? t.latestSelectedDateObj : void 0),
|
|
20066
|
+
t.element = t.input = n, t.isOpen = !1, Gp(), ad(), xp(), Rp(), i(), t.isMobile || v(), m(), (t.selectedDates.length || t.config.noCalendar) && (t.config.enableTime && I(t.config.noCalendar ? t.latestSelectedDateObj : void 0), pn(!1)), r();
|
|
20067
20067
|
var f = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
|
|
20068
20068
|
!t.isMobile && f && wa(), Re("onReady");
|
|
20069
20069
|
}
|
|
@@ -20090,7 +20090,7 @@ function f2(n, e) {
|
|
|
20090
20090
|
}
|
|
20091
20091
|
f !== void 0 && f.type !== "blur" && Np(f);
|
|
20092
20092
|
var X = t._input.value;
|
|
20093
|
-
d(),
|
|
20093
|
+
d(), pn(), t._input.value !== X && t._debouncedChange();
|
|
20094
20094
|
}
|
|
20095
20095
|
function g(f, y) {
|
|
20096
20096
|
return f % 12 + 12 * Gt(y === t.l10n.amPM[1]);
|
|
@@ -20169,7 +20169,7 @@ function f2(n, e) {
|
|
|
20169
20169
|
var f = xu(wp, 50);
|
|
20170
20170
|
if (t._debouncedChange = xu(p, p2), t.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent) && A(t.daysContainer, "mouseover", function(G) {
|
|
20171
20171
|
t.config.mode === "range" && Za(ht(G));
|
|
20172
|
-
}), A(t._input, "keydown", id), t.calendarContainer !== void 0 && A(t.calendarContainer, "keydown", id), !t.config.inline && !t.config.static && A(window, "resize", f), window.ontouchstart !== void 0 ? A(window.document, "touchstart",
|
|
20172
|
+
}), A(t._input, "keydown", id), t.calendarContainer !== void 0 && A(t.calendarContainer, "keydown", id), !t.config.inline && !t.config.static && A(window, "resize", f), window.ontouchstart !== void 0 ? A(window.document, "touchstart", St) : A(window.document, "mousedown", St), A(window.document, "focus", St, { capture: !0 }), t.config.clickOpens === !0 && (A(t._input, "focus", t.open), A(t._input, "click", t.open)), t.daysContainer !== void 0 && (A(t.monthNav, "click", Yp), A(t.monthNav, ["keyup", "increment"], C), A(t.daysContainer, "click", ld)), t.timeContainer !== void 0 && t.minuteElement !== void 0 && t.hourElement !== void 0) {
|
|
20173
20173
|
var y = function(G) {
|
|
20174
20174
|
return ht(G).select();
|
|
20175
20175
|
};
|
|
@@ -20202,7 +20202,7 @@ function f2(n, e) {
|
|
|
20202
20202
|
var f = window.document.createDocumentFragment();
|
|
20203
20203
|
if (t.calendarContainer = Ie("div", "flatpickr-calendar"), t.calendarContainer.tabIndex = -1, !t.config.noCalendar) {
|
|
20204
20204
|
if (f.appendChild(de()), t.innerContainer = Ie("div", "flatpickr-innerContainer"), t.config.weekNumbers) {
|
|
20205
|
-
var y =
|
|
20205
|
+
var y = jt(), G = y.weekWrapper, X = y.weekNumbers;
|
|
20206
20206
|
t.innerContainer.appendChild(G), t.weekNumbers = X, t.weekWrapper = G;
|
|
20207
20207
|
}
|
|
20208
20208
|
t.rContainer = Ie("div", "flatpickr-rContainer"), t.rContainer.appendChild(Xe()), t.daysContainer || (t.daysContainer = Ie("div", "flatpickr-days"), t.daysContainer.tabIndex = -1), N(), t.rContainer.appendChild(t.daysContainer), t.innerContainer.appendChild(t.rContainer), f.appendChild(t.innerContainer);
|
|
@@ -20250,8 +20250,8 @@ function f2(n, e) {
|
|
|
20250
20250
|
K.appendChild(W("flatpickr-day", new Date(f, y, L), L, U));
|
|
20251
20251
|
for (var fe = H + 1; fe <= 42 - G && (t.config.showMonths === 1 || U % 7 !== 0); fe++, U++)
|
|
20252
20252
|
K.appendChild(W("flatpickr-day " + ie, new Date(f, y + 1, fe % H), fe, U));
|
|
20253
|
-
var
|
|
20254
|
-
return
|
|
20253
|
+
var Et = Ie("div", "dayContainer");
|
|
20254
|
+
return Et.appendChild(K), Et;
|
|
20255
20255
|
}
|
|
20256
20256
|
function N() {
|
|
20257
20257
|
if (t.daysContainer !== void 0) {
|
|
@@ -20354,7 +20354,7 @@ function f2(n, e) {
|
|
|
20354
20354
|
`;
|
|
20355
20355
|
}
|
|
20356
20356
|
}
|
|
20357
|
-
function
|
|
20357
|
+
function jt() {
|
|
20358
20358
|
t.calendarContainer.classList.add("hasWeeks");
|
|
20359
20359
|
var f = Ie("div", "flatpickr-weekwrapper");
|
|
20360
20360
|
f.appendChild(Ie("span", "flatpickr-weekday", t.l10n.weekAbbreviation));
|
|
@@ -20379,7 +20379,7 @@ function f2(n, e) {
|
|
|
20379
20379
|
function mi() {
|
|
20380
20380
|
t.isOpen = !1, t.isMobile || (t.calendarContainer !== void 0 && t.calendarContainer.classList.remove("open"), t._input !== void 0 && t._input.classList.remove("active")), Re("onClose");
|
|
20381
20381
|
}
|
|
20382
|
-
function
|
|
20382
|
+
function An() {
|
|
20383
20383
|
t.config !== void 0 && Re("onDestroy");
|
|
20384
20384
|
for (var f = t._handlers.length; f--; )
|
|
20385
20385
|
t._handlers[f].remove();
|
|
@@ -20432,12 +20432,12 @@ function f2(n, e) {
|
|
|
20432
20432
|
}
|
|
20433
20433
|
});
|
|
20434
20434
|
}
|
|
20435
|
-
function
|
|
20435
|
+
function Ht(f) {
|
|
20436
20436
|
return t.calendarContainer.contains(f);
|
|
20437
20437
|
}
|
|
20438
|
-
function
|
|
20438
|
+
function St(f) {
|
|
20439
20439
|
if (t.isOpen && !t.config.inline) {
|
|
20440
|
-
var y = ht(f), G =
|
|
20440
|
+
var y = ht(f), G = Ht(y), X = y === t.input || y === t.altInput || t.element.contains(y) || f.path && f.path.indexOf && (~f.path.indexOf(t.input) || ~f.path.indexOf(t.altInput)), H = !X && !G && !Ht(f.relatedTarget), K = !t.config.ignoredFocusElements.some(function(q) {
|
|
20441
20441
|
return q.contains(y);
|
|
20442
20442
|
});
|
|
20443
20443
|
H && K && (t.config.allowInput && t.setDate(t._input.value, !1, t.config.altInput ? t.config.altFormat : t.config.dateFormat), t.timeContainer !== void 0 && t.minuteElement !== void 0 && t.hourElement !== void 0 && t.input.value !== "" && t.input.value !== void 0 && l(), t.close(), t.config && t.config.mode === "range" && t.selectedDates.length === 1 && t.clear(!1));
|
|
@@ -20477,7 +20477,7 @@ function f2(n, e) {
|
|
|
20477
20477
|
}
|
|
20478
20478
|
function Zp(f) {
|
|
20479
20479
|
var y = f.target === t._input, G = t._input.value.trimEnd() !== wl();
|
|
20480
|
-
y && G && !(f.relatedTarget &&
|
|
20480
|
+
y && G && !(f.relatedTarget && Ht(f.relatedTarget)) && t.setDate(t._input.value, !0, f.target === t.altInput ? t.config.altFormat : t.config.dateFormat);
|
|
20481
20481
|
}
|
|
20482
20482
|
function id(f) {
|
|
20483
20483
|
var y = ht(f), G = t.config.wrap ? n.contains(y) : y === t._input, X = t.config.allowInput, H = t.isOpen && (!X || !G), K = t.config.inline && G && !X;
|
|
@@ -20485,7 +20485,7 @@ function f2(n, e) {
|
|
|
20485
20485
|
if (X)
|
|
20486
20486
|
return t.setDate(t._input.value, !0, y === t.altInput ? t.config.altFormat : t.config.dateFormat), t.close(), y.blur();
|
|
20487
20487
|
t.open();
|
|
20488
|
-
} else if (
|
|
20488
|
+
} else if (Ht(y) || H || K) {
|
|
20489
20489
|
var q = !!t.timeContainer && t.timeContainer.contains(y);
|
|
20490
20490
|
switch (f.keyCode) {
|
|
20491
20491
|
case 13:
|
|
@@ -20526,8 +20526,8 @@ function f2(n, e) {
|
|
|
20526
20526
|
return Ct;
|
|
20527
20527
|
}), fe = U.indexOf(y);
|
|
20528
20528
|
if (fe !== -1) {
|
|
20529
|
-
var
|
|
20530
|
-
f.preventDefault(), (
|
|
20529
|
+
var Et = U[fe + (f.shiftKey ? -1 : 1)];
|
|
20530
|
+
f.preventDefault(), (Et || t._input).focus();
|
|
20531
20531
|
}
|
|
20532
20532
|
} else !t.config.noCalendar && t.daysContainer && t.daysContainer.contains(y) && f.shiftKey && (f.preventDefault(), t._input.focus());
|
|
20533
20533
|
break;
|
|
@@ -20537,14 +20537,14 @@ function f2(n, e) {
|
|
|
20537
20537
|
switch (f.key) {
|
|
20538
20538
|
case t.l10n.amPM[0].charAt(0):
|
|
20539
20539
|
case t.l10n.amPM[0].charAt(0).toLowerCase():
|
|
20540
|
-
t.amPM.textContent = t.l10n.amPM[0], d(),
|
|
20540
|
+
t.amPM.textContent = t.l10n.amPM[0], d(), pn();
|
|
20541
20541
|
break;
|
|
20542
20542
|
case t.l10n.amPM[1].charAt(0):
|
|
20543
20543
|
case t.l10n.amPM[1].charAt(0).toLowerCase():
|
|
20544
|
-
t.amPM.textContent = t.l10n.amPM[1], d(),
|
|
20544
|
+
t.amPM.textContent = t.l10n.amPM[1], d(), pn();
|
|
20545
20545
|
break;
|
|
20546
20546
|
}
|
|
20547
|
-
(G ||
|
|
20547
|
+
(G || Ht(y)) && Re("onKeyDown", f);
|
|
20548
20548
|
}
|
|
20549
20549
|
function Za(f, y) {
|
|
20550
20550
|
if (y === void 0 && (y = "flatpickr-day"), !(t.selectedDates.length !== 1 || f && (!f.classList.contains(y) || f.classList.contains("flatpickr-disabled")))) {
|
|
@@ -20552,7 +20552,7 @@ function f2(n, e) {
|
|
|
20552
20552
|
bi(new Date(L), !0) || (q = q || L > H && L < K, L < X && (!J || L > J) ? J = L : L > X && (!ie || L < ie) && (ie = L));
|
|
20553
20553
|
var U = Array.from(t.rContainer.querySelectorAll("*:nth-child(-n+" + t.config.showMonths + ") > ." + y));
|
|
20554
20554
|
U.forEach(function(fe) {
|
|
20555
|
-
var
|
|
20555
|
+
var Et = fe.dateObj, Ct = Et.getTime(), ns = J > 0 && Ct < J || ie > 0 && Ct > ie;
|
|
20556
20556
|
if (ns) {
|
|
20557
20557
|
fe.classList.add("notAllowed"), ["inRange", "startRange", "endRange"].forEach(function(Io) {
|
|
20558
20558
|
fe.classList.remove(Io);
|
|
@@ -20590,7 +20590,7 @@ function f2(n, e) {
|
|
|
20590
20590
|
var G = t.config["_" + f + "Date"] = t.parseDate(y, t.config.dateFormat), X = t.config["_" + (f === "min" ? "max" : "min") + "Date"];
|
|
20591
20591
|
G !== void 0 && (t[f === "min" ? "minDateHasTime" : "maxDateHasTime"] = G.getHours() > 0 || G.getMinutes() > 0 || G.getSeconds() > 0), t.selectedDates && (t.selectedDates = t.selectedDates.filter(function(H) {
|
|
20592
20592
|
return bi(H);
|
|
20593
|
-
}), !t.selectedDates.length && f === "min" && I(G),
|
|
20593
|
+
}), !t.selectedDates.length && f === "min" && I(G), pn()), t.daysContainer && (rd(), G !== void 0 ? t.currentYearElement[f] = G.getFullYear().toString() : t.currentYearElement.removeAttribute(f), t.currentYearElement.disabled = !!X && G !== void 0 && X.getFullYear() === G.getFullYear());
|
|
20594
20594
|
};
|
|
20595
20595
|
}
|
|
20596
20596
|
function Gp() {
|
|
@@ -20692,8 +20692,8 @@ function f2(n, e) {
|
|
|
20692
20692
|
return Jp + Dp.offsetHeight;
|
|
20693
20693
|
}, 0), X = t.calendarContainer.offsetWidth, H = t.config.position.split(" "), K = H[0], q = H.length > 1 ? H[1] : null, J = y.getBoundingClientRect(), ie = window.innerHeight - J.bottom, L = K === "above" || K !== "below" && ie < G && J.top > G, U = window.pageYOffset + J.top + (L ? -G - 2 : y.offsetHeight + 2);
|
|
20694
20694
|
if (et(t.calendarContainer, "arrowTop", !L), et(t.calendarContainer, "arrowBottom", L), !t.config.inline) {
|
|
20695
|
-
var fe = window.pageXOffset + J.left,
|
|
20696
|
-
q === "center" ? (fe -= (X - J.width) / 2,
|
|
20695
|
+
var fe = window.pageXOffset + J.left, Et = !1, Ct = !1;
|
|
20696
|
+
q === "center" ? (fe -= (X - J.width) / 2, Et = !0) : q === "right" && (fe -= X - J.width, Ct = !0), et(t.calendarContainer, "arrowLeft", !Et && !Ct), et(t.calendarContainer, "arrowCenter", Et), et(t.calendarContainer, "arrowRight", Ct);
|
|
20697
20697
|
var ns = window.document.body.offsetWidth - (window.pageXOffset + J.right), Io = fe + X > window.document.body.offsetWidth, Fp = ns + X > window.document.body.offsetWidth;
|
|
20698
20698
|
if (et(t.calendarContainer, "rightMost", Io), !t.config.static)
|
|
20699
20699
|
if (t.calendarContainer.style.top = U + "px", !Io)
|
|
@@ -20754,7 +20754,7 @@ function f2(n, e) {
|
|
|
20754
20754
|
var J = t.currentYear !== H.getFullYear();
|
|
20755
20755
|
t.currentYear = H.getFullYear(), t.currentMonth = H.getMonth(), J && (Re("onYearChange"), P()), Re("onMonthChange");
|
|
20756
20756
|
}
|
|
20757
|
-
if (Ga(), N(),
|
|
20757
|
+
if (Ga(), N(), pn(), !K && t.config.mode !== "range" && t.config.showMonths === 1 ? V(X) : t.selectedDateElem !== void 0 && t.hourElement === void 0 && t.selectedDateElem && t.selectedDateElem.focus(), t.hourElement !== void 0 && t.hourElement !== void 0 && t.hourElement.focus(), t.config.closeOnSelect) {
|
|
20758
20758
|
var ie = t.config.mode === "single" && !t.config.enableTime, L = t.config.mode === "range" && t.selectedDates.length === 2 && !t.config.enableTime;
|
|
20759
20759
|
(ie || L) && bl();
|
|
20760
20760
|
}
|
|
@@ -20784,7 +20784,7 @@ function f2(n, e) {
|
|
|
20784
20784
|
t.config[f] = y, va[f] !== void 0 ? va[f].forEach(function(X) {
|
|
20785
20785
|
return X();
|
|
20786
20786
|
}) : Pl.indexOf(f) > -1 && (t.config[f] = Ul(y));
|
|
20787
|
-
t.redraw(),
|
|
20787
|
+
t.redraw(), pn(!0);
|
|
20788
20788
|
}
|
|
20789
20789
|
function gd(f, y) {
|
|
20790
20790
|
var G = [];
|
|
@@ -20822,7 +20822,7 @@ function f2(n, e) {
|
|
|
20822
20822
|
function Xp(f, y, G) {
|
|
20823
20823
|
if (y === void 0 && (y = !1), G === void 0 && (G = t.config.dateFormat), f !== 0 && !f || f instanceof Array && f.length === 0)
|
|
20824
20824
|
return t.clear(y);
|
|
20825
|
-
gd(f, G), t.latestSelectedDateObj = t.selectedDates[t.selectedDates.length - 1], t.redraw(), b(void 0, y), I(), t.selectedDates.length === 0 && t.clear(!1),
|
|
20825
|
+
gd(f, G), t.latestSelectedDateObj = t.selectedDates[t.selectedDates.length - 1], t.redraw(), b(void 0, y), I(), t.selectedDates.length === 0 && t.clear(!1), pn(y), y && Re("onChange");
|
|
20826
20826
|
}
|
|
20827
20827
|
function cd(f) {
|
|
20828
20828
|
return f.slice().map(function(y) {
|
|
@@ -20903,7 +20903,7 @@ function f2(n, e) {
|
|
|
20903
20903
|
return t.config.mode !== "range" || t.config.enableTime || H.indexOf(G) === X;
|
|
20904
20904
|
}).join(t.config.mode !== "range" ? t.config.conjunction : t.l10n.rangeSeparator);
|
|
20905
20905
|
}
|
|
20906
|
-
function
|
|
20906
|
+
function pn(f) {
|
|
20907
20907
|
f === void 0 && (f = !0), t.mobileInput !== void 0 && t.mobileFormatStr && (t.mobileInput.value = t.latestSelectedDateObj !== void 0 ? t.formatDate(t.latestSelectedDateObj, t.mobileFormatStr) : ""), t.input.value = wl(t.config.dateFormat), t.altInput !== void 0 && (t.altInput.value = wl(t.config.altFormat)), f !== !1 && Re("onValueUpdate");
|
|
20908
20908
|
}
|
|
20909
20909
|
function Yp(f) {
|
|
@@ -21512,11 +21512,11 @@ function st(n, e) {
|
|
|
21512
21512
|
!_e.__s && SA(t.__H, e) && (t.__ = n, t.i = e, Ze.__H.__h.push(t));
|
|
21513
21513
|
}
|
|
21514
21514
|
function Ke(n) {
|
|
21515
|
-
return Yr = 5,
|
|
21515
|
+
return Yr = 5, rn(function() {
|
|
21516
21516
|
return { current: n };
|
|
21517
21517
|
}, []);
|
|
21518
21518
|
}
|
|
21519
|
-
function
|
|
21519
|
+
function rn(n, e) {
|
|
21520
21520
|
var t = Aa(Qi++, 7);
|
|
21521
21521
|
return SA(t.__H, e) && (t.__ = n(), t.__H = e, t.__h = n), t.__;
|
|
21522
21522
|
}
|
|
@@ -21810,7 +21810,7 @@ const IB = ({
|
|
|
21810
21810
|
data: n,
|
|
21811
21811
|
proportionInterval: e
|
|
21812
21812
|
}) => {
|
|
21813
|
-
const t = Ke(null), i = "You have no elements selected. Click in the venn diagram to select.", [o, s] = oe(null), a =
|
|
21813
|
+
const t = Ke(null), i = "You have no elements selected. Click in the venn diagram to select.", [o, s] = oe(null), a = rn(
|
|
21814
21814
|
() => pG(
|
|
21815
21815
|
n.content.map((l) => ({
|
|
21816
21816
|
displayName: l.displayName,
|
|
@@ -21834,7 +21834,7 @@ const IB = ({
|
|
|
21834
21834
|
const l = a.datasets[0].data[o].values, g = a.datasets[0].data[o].label;
|
|
21835
21835
|
t.current.innerText = `${g}: ${l.join(", ")}` || "";
|
|
21836
21836
|
}, [t, o, a]);
|
|
21837
|
-
const r =
|
|
21837
|
+
const r = rn(
|
|
21838
21838
|
() => ({
|
|
21839
21839
|
type: "venn",
|
|
21840
21840
|
data: a,
|
|
@@ -21979,7 +21979,7 @@ class rr extends Error {
|
|
|
21979
21979
|
super(t), this.headline = e, this.name = "UserFacingError";
|
|
21980
21980
|
}
|
|
21981
21981
|
}
|
|
21982
|
-
const
|
|
21982
|
+
const Jt = ({ error: n }) => {
|
|
21983
21983
|
console.error(n);
|
|
21984
21984
|
const e = Ke(null), t = Ke(null);
|
|
21985
21985
|
st(() => {
|
|
@@ -22037,9 +22037,9 @@ function mB(n) {
|
|
|
22037
22037
|
}
|
|
22038
22038
|
} : { headline: "Error", details: void 0 };
|
|
22039
22039
|
}
|
|
22040
|
-
const
|
|
22040
|
+
const Dt = ({ children: n, size: e }) => /* @__PURE__ */ h("div", { style: e, className: "bg-white", children: n }), xt = ({ size: n, children: e }) => {
|
|
22041
22041
|
const [t] = tB();
|
|
22042
|
-
return t ? /* @__PURE__ */ h(
|
|
22042
|
+
return t ? /* @__PURE__ */ h(Dt, { size: n, children: /* @__PURE__ */ h(Jt, { error: t }) }) : /* @__PURE__ */ h(Be, { children: e });
|
|
22043
22043
|
}, ao = () => {
|
|
22044
22044
|
const n = Ke(null), e = ZB();
|
|
22045
22045
|
return /* @__PURE__ */ h(
|
|
@@ -22102,7 +22102,7 @@ const hi = ({ children: n }) => {
|
|
|
22102
22102
|
/* @__PURE__ */ h("form", { method: "dialog", className: "modal-backdrop", children: /* @__PURE__ */ h("button", { children: "Helper to close when clicked outside" }) })
|
|
22103
22103
|
] })
|
|
22104
22104
|
] });
|
|
22105
|
-
}, Ai = ({ children: n }) => /* @__PURE__ */ h("h1", { className: "text-lg font-bold", children: n }),
|
|
22105
|
+
}, Ai = ({ children: n }) => /* @__PURE__ */ h("h1", { className: "text-lg font-bold", children: n }), Ut = ({ children: n }) => /* @__PURE__ */ h("h2", { className: "text-base font-bold mt-4", children: n }), Ce = ({ children: n }) => /* @__PURE__ */ h("p", { className: "text-justify my-1", children: n }), Vs = ({ children: n, href: e }) => /* @__PURE__ */ h("a", { className: "text-blue-600 hover:text-blue-800", href: e, target: "_blank", rel: "noopener noreferrer", children: n }), ro = ({ componentName: n, params: e, lapisUrl: t }) => {
|
|
22106
22106
|
const i = wB(n, e, t), o = {
|
|
22107
22107
|
title: "GenSpectrum dashboard component",
|
|
22108
22108
|
html: vB(i, n),
|
|
@@ -22110,7 +22110,7 @@ const hi = ({ children: n }) => {
|
|
|
22110
22110
|
editors: "100"
|
|
22111
22111
|
};
|
|
22112
22112
|
return /* @__PURE__ */ h(Be, { children: [
|
|
22113
|
-
/* @__PURE__ */ h(
|
|
22113
|
+
/* @__PURE__ */ h(Ut, { children: "Use this component yourself" }),
|
|
22114
22114
|
/* @__PURE__ */ h(Ce, { children: [
|
|
22115
22115
|
"This component was created using the following parameters:",
|
|
22116
22116
|
/* @__PURE__ */ h("div", { className: "p-4 border border-gray-200 rounded-lg overflow-x-auto", children: /* @__PURE__ */ h("pre", { children: /* @__PURE__ */ h("code", { children: i }) }) })
|
|
@@ -22167,7 +22167,7 @@ function LA(n, e) {
|
|
|
22167
22167
|
`).map((i) => t + i).join(`
|
|
22168
22168
|
`);
|
|
22169
22169
|
}
|
|
22170
|
-
const
|
|
22170
|
+
const Ot = () => /* @__PURE__ */ h(
|
|
22171
22171
|
"div",
|
|
22172
22172
|
{
|
|
22173
22173
|
"aria-label": "Loading",
|
|
@@ -22288,7 +22288,7 @@ const VB = "z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200
|
|
|
22288
22288
|
return "Del.";
|
|
22289
22289
|
}
|
|
22290
22290
|
}).join(", ") : e.map((t) => t.label).join(", ");
|
|
22291
|
-
},
|
|
22291
|
+
}, kt = () => /* @__PURE__ */ h("div", { className: "h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center", children: /* @__PURE__ */ h("div", { children: "No data available." }) }), JA = ({
|
|
22292
22292
|
min: n,
|
|
22293
22293
|
max: e,
|
|
22294
22294
|
setMin: t,
|
|
@@ -22527,15 +22527,15 @@ function Yn(n, e) {
|
|
|
22527
22527
|
}
|
|
22528
22528
|
const kB = (n) => {
|
|
22529
22529
|
const { width: e, height: t } = n, i = { height: t, width: e };
|
|
22530
|
-
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(
|
|
22530
|
+
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(HB, { ...n }) }) });
|
|
22531
22531
|
}, HB = (n) => {
|
|
22532
22532
|
const { lapisFilters: e, sequenceType: t } = n, i = Se(De), { data: o, error: s, isLoading: a } = Yn(async () => CB(e, t, i), [e, t, i]);
|
|
22533
|
-
return a ? /* @__PURE__ */ h(
|
|
22533
|
+
return a ? /* @__PURE__ */ h(Ot, {}) : s !== null ? /* @__PURE__ */ h(Jt, { error: s }) : o === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(SB, { data: o.mutationData, originalComponentProps: n });
|
|
22534
22534
|
}, SB = ({ data: n, originalComponentProps: e }) => {
|
|
22535
22535
|
const [t, i] = oe({ min: 0.5, max: 1 }), [o, s] = oe([
|
|
22536
22536
|
{ label: "Substitutions", checked: !0, type: "substitution" },
|
|
22537
22537
|
{ label: "Deletions", checked: !0, type: "deletion" }
|
|
22538
|
-
]), [a, r] = Ec(e.sequenceType), l =
|
|
22538
|
+
]), [a, r] = Ec(e.sequenceType), l = rn(
|
|
22539
22539
|
() => hB(n, a, o),
|
|
22540
22540
|
[n, a, o]
|
|
22541
22541
|
), g = (d) => {
|
|
@@ -26041,16 +26041,16 @@ const MB = _r(_B), LB = _r(KB), OA = class extends Vi {
|
|
|
26041
26041
|
}
|
|
26042
26042
|
};
|
|
26043
26043
|
OA.styles = [MB, LB];
|
|
26044
|
-
let
|
|
26044
|
+
let Cn = OA;
|
|
26045
26045
|
DA([
|
|
26046
26046
|
sC({ context: XA })
|
|
26047
|
-
],
|
|
26047
|
+
], Cn.prototype, "lapis");
|
|
26048
26048
|
DA([
|
|
26049
26049
|
sC({ context: RA, subscribe: !0 })
|
|
26050
|
-
],
|
|
26051
|
-
const TB = _r(FB), jA = class extends
|
|
26050
|
+
], Cn.prototype, "referenceGenome");
|
|
26051
|
+
const TB = _r(FB), jA = class extends Cn {
|
|
26052
26052
|
};
|
|
26053
|
-
jA.styles = [...
|
|
26053
|
+
jA.styles = [...Cn.styles, TB];
|
|
26054
26054
|
let es = jA;
|
|
26055
26055
|
var JB = Object.defineProperty, DB = Object.getOwnPropertyDescriptor, go = (n, e, t, i) => {
|
|
26056
26056
|
for (var o = i > 1 ? void 0 : i ? DB(e, t) : e, s = n.length - 1, a; s >= 0; s--)
|
|
@@ -26178,7 +26178,7 @@ const Pu = /(?:([A-Za-z0-9]+):)?(\d+)$/, UA = (n, e) => {
|
|
|
26178
26178
|
...FA.td,
|
|
26179
26179
|
color: "gray"
|
|
26180
26180
|
}
|
|
26181
|
-
} : {}, r =
|
|
26181
|
+
} : {}, r = rn(
|
|
26182
26182
|
() => OB(n, e, t).map((l) => Object.values(l)),
|
|
26183
26183
|
[n, t, e]
|
|
26184
26184
|
);
|
|
@@ -26263,10 +26263,10 @@ function nW(n, e, t) {
|
|
|
26263
26263
|
}
|
|
26264
26264
|
const iW = (n) => {
|
|
26265
26265
|
const { width: e, height: t } = n, i = { height: t, width: e };
|
|
26266
|
-
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(
|
|
26266
|
+
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(oW, { ...n }) }) });
|
|
26267
26267
|
}, oW = (n) => {
|
|
26268
26268
|
const e = Se(De), { lapisFilter: t, sequenceType: i } = n, { data: o, error: s, isLoading: a } = Yn(async () => tW(t, i, e), [t, i, e]);
|
|
26269
|
-
return a ? /* @__PURE__ */ h(
|
|
26269
|
+
return a ? /* @__PURE__ */ h(Ot, {}) : s !== null ? /* @__PURE__ */ h(Jt, { error: s }) : o === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(sW, { mutationsData: o, originalComponentProps: n });
|
|
26270
26270
|
}, sW = ({ mutationsData: n, originalComponentProps: e }) => {
|
|
26271
26271
|
const [t, i] = oe({ min: 0.05, max: 1 }), [o, s] = Ec(e.sequenceType), [a, r] = oe([
|
|
26272
26272
|
{ label: "Substitutions", checked: !0, type: "substitution" },
|
|
@@ -26385,7 +26385,7 @@ const iW = (n) => {
|
|
|
26385
26385
|
/* @__PURE__ */ h(Vs, { href: "https://www.genome.gov/genetics-glossary/Insertion", children: "insertions" }),
|
|
26386
26386
|
"."
|
|
26387
26387
|
] }),
|
|
26388
|
-
/* @__PURE__ */ h(
|
|
26388
|
+
/* @__PURE__ */ h(Ut, { children: "Proportion calculation" }),
|
|
26389
26389
|
/* @__PURE__ */ h(Ce, { children: "The proportion of a mutation is calculated by dividing the number of sequences with the mutation by the total number of sequences with a non-ambiguous symbol at the position." }),
|
|
26390
26390
|
/* @__PURE__ */ h(Ce, { children: [
|
|
26391
26391
|
/* @__PURE__ */ h("b", { children: "Example:" }),
|
|
@@ -26530,10 +26530,13 @@ const cW = ({
|
|
|
26530
26530
|
confidenceIntervalMethod: t,
|
|
26531
26531
|
yAxisMaxConfig: i
|
|
26532
26532
|
}) => {
|
|
26533
|
-
const o = n.map((l) => ({
|
|
26533
|
+
const o = n.filter((l) => l.content.length > 0).map((l) => ({
|
|
26534
26534
|
content: l.content.sort($A),
|
|
26535
26535
|
displayName: l.displayName
|
|
26536
|
-
}))
|
|
26536
|
+
}));
|
|
26537
|
+
if (o.length === 0)
|
|
26538
|
+
return /* @__PURE__ */ h(kt, {});
|
|
26539
|
+
const s = o.map((l, g) => dW(l, g, t)), a = e !== "logit" ? Al(ed(o), i == null ? void 0 : i[e]) : void 0, r = {
|
|
26537
26540
|
type: Ci.id,
|
|
26538
26541
|
data: {
|
|
26539
26542
|
datasets: s
|
|
@@ -26595,7 +26598,7 @@ const cW = ({
|
|
|
26595
26598
|
return e;
|
|
26596
26599
|
}
|
|
26597
26600
|
};
|
|
26598
|
-
var tp = 60, np = tp * 60, ip = np * 24, hW = ip * 7, To = 1e3, tg = tp * To, Uu = np * To, AW = ip * To, pW = hW * To, Pc = "millisecond", mo = "second", bo = "minute", yo = "hour",
|
|
26601
|
+
var tp = 60, np = tp * 60, ip = np * 24, hW = ip * 7, To = 1e3, tg = tp * To, Uu = np * To, AW = ip * To, pW = hW * To, Pc = "millisecond", mo = "second", bo = "minute", yo = "hour", Nt = "day", Xs = "week", Yt = "month", op = "quarter", wn = "year", Zo = "date", sp = "YYYY-MM-DDTHH:mm:ssZ", Qu = "Invalid Date", fW = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, mW = /\[([^\]]+)]|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;
|
|
26599
26602
|
const bW = {
|
|
26600
26603
|
name: "en",
|
|
26601
26604
|
weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
|
|
@@ -26613,16 +26616,16 @@ var Eg = function(e, t, i) {
|
|
|
26613
26616
|
return (t <= 0 ? "+" : "-") + Eg(o, 2, "0") + ":" + Eg(s, 2, "0");
|
|
26614
26617
|
}, ZW = function n(e, t) {
|
|
26615
26618
|
if (e.date() < t.date()) return -n(t, e);
|
|
26616
|
-
var i = (t.year() - e.year()) * 12 + (t.month() - e.month()), o = e.clone().add(i,
|
|
26619
|
+
var i = (t.year() - e.year()) * 12 + (t.month() - e.month()), o = e.clone().add(i, Yt), s = t - o < 0, a = e.clone().add(i + (s ? -1 : 1), Yt);
|
|
26617
26620
|
return +(-(i + (t - o) / (s ? o - a : a - o)) || 0);
|
|
26618
26621
|
}, wW = function(e) {
|
|
26619
26622
|
return e < 0 ? Math.ceil(e) || 0 : Math.floor(e);
|
|
26620
26623
|
}, vW = function(e) {
|
|
26621
26624
|
var t = {
|
|
26622
|
-
M:
|
|
26623
|
-
y:
|
|
26625
|
+
M: Yt,
|
|
26626
|
+
y: wn,
|
|
26624
26627
|
w: Xs,
|
|
26625
|
-
d:
|
|
26628
|
+
d: Nt,
|
|
26626
26629
|
D: Zo,
|
|
26627
26630
|
h: yo,
|
|
26628
26631
|
m: bo,
|
|
@@ -26720,7 +26723,7 @@ var VW = function(e) {
|
|
|
26720
26723
|
}, e.startOf = function(i, o) {
|
|
26721
26724
|
var s = this, a = pe.u(o) ? !0 : o, r = pe.p(i), l = function(m, b) {
|
|
26722
26725
|
var Z = pe.w(s.$u ? Date.UTC(s.$y, b, m) : new Date(s.$y, b, m), s);
|
|
26723
|
-
return a ? Z : Z.endOf(
|
|
26726
|
+
return a ? Z : Z.endOf(Nt);
|
|
26724
26727
|
}, g = function(m, b) {
|
|
26725
26728
|
var Z = [0, 0, 0, 0], w = [23, 59, 59, 999];
|
|
26726
26729
|
return pe.w(s.toDate()[m].apply(
|
|
@@ -26730,15 +26733,15 @@ var VW = function(e) {
|
|
|
26730
26733
|
), s);
|
|
26731
26734
|
}, c = this.$W, d = this.$M, I = this.$D, u = "set" + (this.$u ? "UTC" : "");
|
|
26732
26735
|
switch (r) {
|
|
26733
|
-
case
|
|
26736
|
+
case wn:
|
|
26734
26737
|
return a ? l(1, 0) : l(31, 11);
|
|
26735
|
-
case
|
|
26738
|
+
case Yt:
|
|
26736
26739
|
return a ? l(1, d) : l(0, d + 1);
|
|
26737
26740
|
case Xs: {
|
|
26738
26741
|
var C = this.$locale().weekStart || 0, A = (c < C ? c + 7 : c) - C;
|
|
26739
26742
|
return l(a ? I - A : I + (6 - A), d);
|
|
26740
26743
|
}
|
|
26741
|
-
case
|
|
26744
|
+
case Nt:
|
|
26742
26745
|
case Zo:
|
|
26743
26746
|
return g(u + "Hours", 0);
|
|
26744
26747
|
case yo:
|
|
@@ -26753,8 +26756,8 @@ var VW = function(e) {
|
|
|
26753
26756
|
}, e.endOf = function(i) {
|
|
26754
26757
|
return this.startOf(i, !1);
|
|
26755
26758
|
}, e.$set = function(i, o) {
|
|
26756
|
-
var s, a = pe.p(i), r = "set" + (this.$u ? "UTC" : ""), l = (s = {}, s[
|
|
26757
|
-
if (a ===
|
|
26759
|
+
var s, a = pe.p(i), r = "set" + (this.$u ? "UTC" : ""), l = (s = {}, s[Nt] = r + "Date", s[Zo] = r + "Date", s[Yt] = r + "Month", s[wn] = r + "FullYear", s[yo] = r + "Hours", s[bo] = r + "Minutes", s[mo] = r + "Seconds", s[Pc] = r + "Milliseconds", s)[a], g = a === Nt ? this.$D + (o - this.$W) : o;
|
|
26760
|
+
if (a === Yt || a === wn) {
|
|
26758
26761
|
var c = this.clone().set(Zo, 1);
|
|
26759
26762
|
c.$d[l](g), c.init(), this.$d = c.set(Zo, Math.min(this.$D, c.daysInMonth())).$d;
|
|
26760
26763
|
} else l && this.$d[l](g);
|
|
@@ -26770,11 +26773,11 @@ var VW = function(e) {
|
|
|
26770
26773
|
var u = we(s);
|
|
26771
26774
|
return pe.w(u.date(u.date() + Math.round(I * i)), s);
|
|
26772
26775
|
};
|
|
26773
|
-
if (r === St)
|
|
26774
|
-
return this.set(St, this.$M + i);
|
|
26775
|
-
if (r === Zn)
|
|
26776
|
-
return this.set(Zn, this.$y + i);
|
|
26777
26776
|
if (r === Yt)
|
|
26777
|
+
return this.set(Yt, this.$M + i);
|
|
26778
|
+
if (r === wn)
|
|
26779
|
+
return this.set(wn, this.$y + i);
|
|
26780
|
+
if (r === Nt)
|
|
26778
26781
|
return l(1);
|
|
26779
26782
|
if (r === Xs)
|
|
26780
26783
|
return l(7);
|
|
@@ -26855,10 +26858,10 @@ var VW = function(e) {
|
|
|
26855
26858
|
return pe.m(a, l);
|
|
26856
26859
|
}, I;
|
|
26857
26860
|
switch (r) {
|
|
26858
|
-
case
|
|
26861
|
+
case wn:
|
|
26859
26862
|
I = d() / 12;
|
|
26860
26863
|
break;
|
|
26861
|
-
case
|
|
26864
|
+
case Yt:
|
|
26862
26865
|
I = d();
|
|
26863
26866
|
break;
|
|
26864
26867
|
case op:
|
|
@@ -26867,7 +26870,7 @@ var VW = function(e) {
|
|
|
26867
26870
|
case Xs:
|
|
26868
26871
|
I = (c - g) / pW;
|
|
26869
26872
|
break;
|
|
26870
|
-
case
|
|
26873
|
+
case Nt:
|
|
26871
26874
|
I = (c - g) / AW;
|
|
26872
26875
|
break;
|
|
26873
26876
|
case yo:
|
|
@@ -26885,7 +26888,7 @@ var VW = function(e) {
|
|
|
26885
26888
|
}
|
|
26886
26889
|
return s ? I : pe.a(I);
|
|
26887
26890
|
}, e.daysInMonth = function() {
|
|
26888
|
-
return this.endOf(
|
|
26891
|
+
return this.endOf(Yt).$D;
|
|
26889
26892
|
}, e.$locale = function() {
|
|
26890
26893
|
return zi[this.$L];
|
|
26891
26894
|
}, e.locale = function(i, o) {
|
|
@@ -26905,7 +26908,7 @@ var VW = function(e) {
|
|
|
26905
26908
|
}, n;
|
|
26906
26909
|
}(), rp = pl.prototype;
|
|
26907
26910
|
we.prototype = rp;
|
|
26908
|
-
[["$ms", Pc], ["$s", mo], ["$m", bo], ["$H", yo], ["$W",
|
|
26911
|
+
[["$ms", Pc], ["$s", mo], ["$m", bo], ["$H", yo], ["$W", Nt], ["$M", Yt], ["$y", wn], ["$D", Zo]].forEach(function(n) {
|
|
26909
26912
|
rp[n[1]] = function(e) {
|
|
26910
26913
|
return this.$g(e, n[0], n[1]);
|
|
26911
26914
|
};
|
|
@@ -26966,17 +26969,17 @@ const XW = function(n, e) {
|
|
|
26966
26969
|
var RW = "isoweek";
|
|
26967
26970
|
const xW = function(n, e, t) {
|
|
26968
26971
|
var i = function(l, g) {
|
|
26969
|
-
var c = (g ? t.utc : t)().year(l).startOf(
|
|
26970
|
-
return c.isoWeekday() > 4 && (d += 7), c.add(d,
|
|
26972
|
+
var c = (g ? t.utc : t)().year(l).startOf(wn), d = 4 - c.isoWeekday();
|
|
26973
|
+
return c.isoWeekday() > 4 && (d += 7), c.add(d, Nt);
|
|
26971
26974
|
}, o = function(l) {
|
|
26972
|
-
return l.add(4 - l.isoWeekday(),
|
|
26975
|
+
return l.add(4 - l.isoWeekday(), Nt);
|
|
26973
26976
|
}, s = e.prototype;
|
|
26974
26977
|
s.isoWeekYear = function() {
|
|
26975
26978
|
var r = o(this);
|
|
26976
26979
|
return r.year();
|
|
26977
26980
|
}, s.isoWeek = function(r) {
|
|
26978
26981
|
if (!this.$utils().u(r))
|
|
26979
|
-
return this.add((r - this.isoWeek()) * 7,
|
|
26982
|
+
return this.add((r - this.isoWeek()) * 7, Nt);
|
|
26980
26983
|
var l = o(this), g = i(this.isoWeekYear(), this.$u);
|
|
26981
26984
|
return l.diff(g, Xs) + 1;
|
|
26982
26985
|
}, s.isoWeekday = function(r) {
|
|
@@ -26995,16 +26998,16 @@ const Pg = "GGGG-[W]WW", Ug = class {
|
|
|
26995
26998
|
this.yearMonthDayCache = /* @__PURE__ */ new Map(), this.yearWeekCache = /* @__PURE__ */ new Map(), this.yearMonthCache = /* @__PURE__ */ new Map(), this.yearCache = /* @__PURE__ */ new Map();
|
|
26996
26999
|
}
|
|
26997
27000
|
getYearMonthDay(e) {
|
|
26998
|
-
return this.yearMonthDayCache.has(e) || this.yearMonthDayCache.set(e,
|
|
27001
|
+
return this.yearMonthDayCache.has(e) || this.yearMonthDayCache.set(e, ln.parse(e, this)), this.yearMonthDayCache.get(e);
|
|
26999
27002
|
}
|
|
27000
27003
|
getYearMonth(e) {
|
|
27001
|
-
return this.yearMonthCache.has(e) || this.yearMonthCache.set(e,
|
|
27004
|
+
return this.yearMonthCache.has(e) || this.yearMonthCache.set(e, xn.parse(e, this)), this.yearMonthCache.get(e);
|
|
27002
27005
|
}
|
|
27003
27006
|
getYearWeek(e) {
|
|
27004
|
-
return this.yearWeekCache.has(e) || this.yearWeekCache.set(e,
|
|
27007
|
+
return this.yearWeekCache.has(e) || this.yearWeekCache.set(e, Rn.parse(e, this)), this.yearWeekCache.get(e);
|
|
27005
27008
|
}
|
|
27006
27009
|
getYear(e) {
|
|
27007
|
-
return this.yearCache.has(e) || this.yearCache.set(e,
|
|
27010
|
+
return this.yearCache.has(e) || this.yearCache.set(e, kn.parse(e, this)), this.yearCache.get(e);
|
|
27008
27011
|
}
|
|
27009
27012
|
static getInstance() {
|
|
27010
27013
|
return this.instance;
|
|
@@ -27012,7 +27015,7 @@ const Pg = "GGGG-[W]WW", Ug = class {
|
|
|
27012
27015
|
};
|
|
27013
27016
|
Ug.instance = new Ug();
|
|
27014
27017
|
let wo = Ug;
|
|
27015
|
-
class
|
|
27018
|
+
class ln {
|
|
27016
27019
|
constructor(e, t, i, o) {
|
|
27017
27020
|
this.yearNumber = e, this.monthNumber = t, this.dayNumber = i, this.cache = o, this.type = "YearMonthDay", this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber), this.dayjs = we(this.date), this.dateString = this.toString();
|
|
27018
27021
|
}
|
|
@@ -27049,10 +27052,10 @@ class rn {
|
|
|
27049
27052
|
}
|
|
27050
27053
|
static parse(e, t) {
|
|
27051
27054
|
const [i, o, s] = e.split("-").map((a) => parseInt(a, 10));
|
|
27052
|
-
return new
|
|
27055
|
+
return new ln(i, o, s, t);
|
|
27053
27056
|
}
|
|
27054
27057
|
}
|
|
27055
|
-
class
|
|
27058
|
+
class Rn {
|
|
27056
27059
|
constructor(e, t, i) {
|
|
27057
27060
|
this.isoYearNumber = e, this.isoWeekNumber = t, this.cache = i, this.type = "YearWeek", this.dateString = this.toString();
|
|
27058
27061
|
}
|
|
@@ -27085,10 +27088,10 @@ class Xn {
|
|
|
27085
27088
|
}
|
|
27086
27089
|
static parse(e, t) {
|
|
27087
27090
|
const [i, o] = e.split("-W").map((s) => parseInt(s, 10));
|
|
27088
|
-
return new
|
|
27091
|
+
return new Rn(i, o, t);
|
|
27089
27092
|
}
|
|
27090
27093
|
}
|
|
27091
|
-
class
|
|
27094
|
+
class xn {
|
|
27092
27095
|
constructor(e, t, i) {
|
|
27093
27096
|
this.yearNumber = e, this.monthNumber = t, this.cache = i, this.type = "YearMonth", this.dateString = this.toString();
|
|
27094
27097
|
}
|
|
@@ -27121,10 +27124,10 @@ class Rn {
|
|
|
27121
27124
|
}
|
|
27122
27125
|
static parse(e, t) {
|
|
27123
27126
|
const [i, o] = e.split("-").map((s) => parseInt(s, 10));
|
|
27124
|
-
return new
|
|
27127
|
+
return new xn(i, o, t);
|
|
27125
27128
|
}
|
|
27126
27129
|
}
|
|
27127
|
-
class
|
|
27130
|
+
class kn {
|
|
27128
27131
|
constructor(e, t) {
|
|
27129
27132
|
this.year = e, this.cache = t, this.type = "Year", this.dateString = this.toString();
|
|
27130
27133
|
}
|
|
@@ -27158,7 +27161,7 @@ class xn {
|
|
|
27158
27161
|
}
|
|
27159
27162
|
static parse(e, t) {
|
|
27160
27163
|
const i = parseInt(e, 10);
|
|
27161
|
-
return new
|
|
27164
|
+
return new kn(i, t);
|
|
27162
27165
|
}
|
|
27163
27166
|
}
|
|
27164
27167
|
function kW(n) {
|
|
@@ -27167,18 +27170,18 @@ function kW(n) {
|
|
|
27167
27170
|
function lp(n) {
|
|
27168
27171
|
switch (n.type) {
|
|
27169
27172
|
case "YearMonthDay":
|
|
27170
|
-
return new
|
|
27173
|
+
return new ln(
|
|
27171
27174
|
n.yearNumber,
|
|
27172
27175
|
n.monthNumber,
|
|
27173
27176
|
n.dayNumber,
|
|
27174
27177
|
wo.getInstance()
|
|
27175
27178
|
);
|
|
27176
27179
|
case "YearWeek":
|
|
27177
|
-
return new
|
|
27180
|
+
return new Rn(n.isoYearNumber, n.isoWeekNumber, wo.getInstance());
|
|
27178
27181
|
case "YearMonth":
|
|
27179
|
-
return new
|
|
27182
|
+
return new xn(n.yearNumber, n.monthNumber, wo.getInstance());
|
|
27180
27183
|
case "Year":
|
|
27181
|
-
return new
|
|
27184
|
+
return new kn(n.year, wo.getInstance());
|
|
27182
27185
|
}
|
|
27183
27186
|
}
|
|
27184
27187
|
function HW(n, e) {
|
|
@@ -27208,18 +27211,18 @@ function NW(n, e) {
|
|
|
27208
27211
|
function gp(n, e) {
|
|
27209
27212
|
if (n === null || e === null)
|
|
27210
27213
|
return [];
|
|
27211
|
-
if (n instanceof
|
|
27214
|
+
if (n instanceof ln && e instanceof ln)
|
|
27212
27215
|
return HW(n, e);
|
|
27213
|
-
if (n instanceof Xn && e instanceof Xn)
|
|
27214
|
-
return SW(n, e);
|
|
27215
27216
|
if (n instanceof Rn && e instanceof Rn)
|
|
27216
|
-
return
|
|
27217
|
+
return SW(n, e);
|
|
27217
27218
|
if (n instanceof xn && e instanceof xn)
|
|
27219
|
+
return YW(n, e);
|
|
27220
|
+
if (n instanceof kn && e instanceof kn)
|
|
27218
27221
|
return NW(n, e);
|
|
27219
27222
|
throw new Error(`Invalid arguments: start and end must be of the same type: ${n}, ${e}`);
|
|
27220
27223
|
}
|
|
27221
27224
|
function cp(n, e) {
|
|
27222
|
-
if (n instanceof
|
|
27225
|
+
if (n instanceof ln && e instanceof ln || n instanceof Rn && e instanceof Rn || n instanceof xn && e instanceof xn || n instanceof kn && e instanceof kn)
|
|
27223
27226
|
return n.minus(e);
|
|
27224
27227
|
throw new Error(`Cannot compare ${n} and ${e}`);
|
|
27225
27228
|
}
|
|
@@ -27238,13 +27241,13 @@ function Qc(n) {
|
|
|
27238
27241
|
return e === null || t === null ? { min: null, max: null } : { min: e, max: t };
|
|
27239
27242
|
}
|
|
27240
27243
|
function FW(n, e) {
|
|
27241
|
-
if (n instanceof
|
|
27244
|
+
if (n instanceof ln)
|
|
27242
27245
|
return n.addDays(e);
|
|
27243
|
-
if (n instanceof Xn)
|
|
27244
|
-
return n.addWeeks(e);
|
|
27245
27246
|
if (n instanceof Rn)
|
|
27246
|
-
return n.
|
|
27247
|
+
return n.addWeeks(e);
|
|
27247
27248
|
if (n instanceof xn)
|
|
27249
|
+
return n.addMonths(e);
|
|
27250
|
+
if (n instanceof kn)
|
|
27248
27251
|
return n.addYears(e);
|
|
27249
27252
|
throw new Error(`Invalid argument: ${n}`);
|
|
27250
27253
|
}
|
|
@@ -27279,10 +27282,13 @@ const MW = ({
|
|
|
27279
27282
|
yAxisScaleType: e,
|
|
27280
27283
|
yAxisMaxConfig: t
|
|
27281
27284
|
}) => {
|
|
27282
|
-
const i = n.map((d) => ({
|
|
27285
|
+
const i = n.filter((d) => d.content.length > 0).map((d) => ({
|
|
27283
27286
|
content: d.content.filter((I) => I.dateRange !== null),
|
|
27284
27287
|
displayName: d.displayName
|
|
27285
|
-
}))
|
|
27288
|
+
}));
|
|
27289
|
+
if (i.length === 0)
|
|
27290
|
+
return /* @__PURE__ */ h(kt, {});
|
|
27291
|
+
const o = i[0].content[0].dateRange, s = i.map((d) => d.content.map((I) => I.total)).flat(), [a, r] = zW(s), l = (d) => (d - a) / (r - a) * 4.5 + 0.5, g = e !== "logit" ? Al(ed(i), t == null ? void 0 : t[e]) : void 0, c = {
|
|
27286
27292
|
type: "bubble",
|
|
27287
27293
|
data: {
|
|
27288
27294
|
datasets: i.map((d, I) => ({
|
|
@@ -27339,10 +27345,13 @@ const LW = ({
|
|
|
27339
27345
|
confidenceIntervalMethod: t,
|
|
27340
27346
|
yAxisMaxConfig: i
|
|
27341
27347
|
}) => {
|
|
27342
|
-
const o = n.map((l) => ({
|
|
27348
|
+
const o = n.filter((l) => l.content.length > 0).map((l) => ({
|
|
27343
27349
|
content: l.content.filter((g) => g.dateRange !== null),
|
|
27344
27350
|
displayName: l.displayName
|
|
27345
|
-
}))
|
|
27351
|
+
}));
|
|
27352
|
+
if (o.length === 0)
|
|
27353
|
+
return /* @__PURE__ */ h(kt, {});
|
|
27354
|
+
const s = o.map((l, g) => TW(l, g, t)).flat(), a = e !== "logit" ? Al(ed(o), i == null ? void 0 : i[e]) : void 0, r = {
|
|
27346
27355
|
type: "line",
|
|
27347
27356
|
data: {
|
|
27348
27357
|
datasets: s
|
|
@@ -27565,7 +27574,10 @@ class qW {
|
|
|
27565
27574
|
throw new Error("Window size must be at least 1");
|
|
27566
27575
|
}
|
|
27567
27576
|
async evaluate(e, t) {
|
|
27568
|
-
const i = await this.child.evaluate(e, t), o = new Array()
|
|
27577
|
+
const i = await this.child.evaluate(e, t), o = new Array();
|
|
27578
|
+
if (i.content.length === 0)
|
|
27579
|
+
return { content: o };
|
|
27580
|
+
const s = Math.max(i.content.length - this.windowSize, 0) + 1;
|
|
27569
27581
|
for (let a = 0; a < s; a++)
|
|
27570
27582
|
o.push(this.aggregate(i.content.slice(a, a + this.windowSize)));
|
|
27571
27583
|
return { content: o };
|
|
@@ -27691,7 +27703,7 @@ const $c = ({ items: n, selected: e, onChange: t, selectStyle: i }) => /* @__PUR
|
|
|
27691
27703
|
);
|
|
27692
27704
|
}, aV = (n) => {
|
|
27693
27705
|
const { width: e, height: t } = n, i = { height: t, width: e };
|
|
27694
|
-
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(
|
|
27706
|
+
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(rV, { ...n }) }) });
|
|
27695
27707
|
}, rV = (n) => {
|
|
27696
27708
|
const { numeratorFilter: e, denominatorFilter: t, granularity: i, smoothingWindow: o, lapisDateField: s } = n, a = Se(De), { data: r, error: l, isLoading: g } = Yn(
|
|
27697
27709
|
() => iV(
|
|
@@ -27704,7 +27716,7 @@ const $c = ({ items: n, selected: e, onChange: t, selectStyle: i }) => /* @__PUR
|
|
|
27704
27716
|
),
|
|
27705
27717
|
[a, e, t, i, o, s]
|
|
27706
27718
|
);
|
|
27707
|
-
return g ? /* @__PURE__ */ h(
|
|
27719
|
+
return g ? /* @__PURE__ */ h(Ot, {}) : l !== null ? /* @__PURE__ */ h(Jt, { error: l }) : r === null || r.every((c) => c.content.length === 0) ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(lV, { data: r, ...n });
|
|
27708
27720
|
}, lV = ({ data: n, ...e }) => {
|
|
27709
27721
|
const { views: t, granularity: i, confidenceIntervalMethods: o, pageSize: s, yAxisMaxLinear: a, yAxisMaxLogarithmic: r } = e, [l, g] = oe("linear"), [c, d] = oe(
|
|
27710
27722
|
o.length > 0 ? o[0] : "none"
|
|
@@ -27812,7 +27824,7 @@ const $c = ({ items: n, selected: e, onChange: t, selectStyle: i }) => /* @__PUR
|
|
|
27812
27824
|
] }),
|
|
27813
27825
|
/* @__PURE__ */ h(Ce, { children: 'Sequences that have no assigned date will not be shown in the line and bubble chart. They will show up in the bar and table view with date "unknown".' }),
|
|
27814
27826
|
i.includes("bubble") && /* @__PURE__ */ h(Be, { children: [
|
|
27815
|
-
/* @__PURE__ */ h(
|
|
27827
|
+
/* @__PURE__ */ h(Ut, { children: "Bubble chart" }),
|
|
27816
27828
|
/* @__PURE__ */ h(Ce, { children: [
|
|
27817
27829
|
"The size of the bubble scales with the total number of available sequences from the",
|
|
27818
27830
|
" ",
|
|
@@ -28064,13 +28076,13 @@ function qu(n) {
|
|
|
28064
28076
|
}
|
|
28065
28077
|
const fV = (n) => {
|
|
28066
28078
|
const { width: e, height: t } = n, i = { height: t, width: e };
|
|
28067
|
-
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(
|
|
28079
|
+
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(mV, { ...n }) }) });
|
|
28068
28080
|
}, mV = (n) => {
|
|
28069
28081
|
const e = Se(De), { numeratorFilter: t, denominatorFilter: i, generationTime: o, lapisDateField: s } = n, [a, r] = oe("linear"), { data: l, error: g, isLoading: c } = Yn(
|
|
28070
28082
|
() => pV(t, i, o, e, s),
|
|
28071
28083
|
[e, t, i, o, s]
|
|
28072
28084
|
);
|
|
28073
|
-
return c ? /* @__PURE__ */ h(
|
|
28085
|
+
return c ? /* @__PURE__ */ h(Ot, {}) : g !== null ? /* @__PURE__ */ h(Jt, { error: g }) : l === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(
|
|
28074
28086
|
bV,
|
|
28075
28087
|
{
|
|
28076
28088
|
data: l,
|
|
@@ -28137,7 +28149,7 @@ const fV = (n) => {
|
|
|
28137
28149
|
t,
|
|
28138
28150
|
" days from today, we expect the number of new infections from the focal variant to be 15."
|
|
28139
28151
|
] }),
|
|
28140
|
-
/* @__PURE__ */ h(
|
|
28152
|
+
/* @__PURE__ */ h(Ut, { children: "Reference" }),
|
|
28141
28153
|
/* @__PURE__ */ h(Ce, { children: [
|
|
28142
28154
|
'Chen, Chaoran, et al. "Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland." Epidemics (2021); doi:',
|
|
28143
28155
|
" ",
|
|
@@ -28153,12 +28165,12 @@ const fV = (n) => {
|
|
|
28153
28165
|
)
|
|
28154
28166
|
] });
|
|
28155
28167
|
};
|
|
28156
|
-
var wV = Object.defineProperty, vV = Object.getOwnPropertyDescriptor,
|
|
28168
|
+
var wV = Object.defineProperty, vV = Object.getOwnPropertyDescriptor, hn = (n, e, t, i) => {
|
|
28157
28169
|
for (var o = i > 1 ? void 0 : i ? vV(e, t) : e, s = n.length - 1, a; s >= 0; s--)
|
|
28158
28170
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
28159
28171
|
return i && o && wV(e, t, o), o;
|
|
28160
28172
|
};
|
|
28161
|
-
let
|
|
28173
|
+
let Tt = class extends Cn {
|
|
28162
28174
|
constructor() {
|
|
28163
28175
|
super(...arguments), this.numeratorFilter = {}, this.denominatorFilter = {}, this.generationTime = 7, this.views = ["line"], this.width = "100%", this.height = "700px", this.lapisDateField = "date", this.yAxisMaxLinear = 1, this.yAxisMaxLogarithmic = 1;
|
|
28164
28176
|
}
|
|
@@ -28181,36 +28193,36 @@ let Lt = class extends un {
|
|
|
28181
28193
|
);
|
|
28182
28194
|
}
|
|
28183
28195
|
};
|
|
28184
|
-
|
|
28196
|
+
hn([
|
|
28185
28197
|
Y({ type: Object })
|
|
28186
|
-
],
|
|
28187
|
-
|
|
28198
|
+
], Tt.prototype, "numeratorFilter", 2);
|
|
28199
|
+
hn([
|
|
28188
28200
|
Y({ type: Object })
|
|
28189
|
-
],
|
|
28190
|
-
|
|
28201
|
+
], Tt.prototype, "denominatorFilter", 2);
|
|
28202
|
+
hn([
|
|
28191
28203
|
Y({ type: Number })
|
|
28192
|
-
],
|
|
28193
|
-
|
|
28204
|
+
], Tt.prototype, "generationTime", 2);
|
|
28205
|
+
hn([
|
|
28194
28206
|
Y({ type: Array })
|
|
28195
|
-
],
|
|
28196
|
-
|
|
28207
|
+
], Tt.prototype, "views", 2);
|
|
28208
|
+
hn([
|
|
28197
28209
|
Y({ type: String })
|
|
28198
|
-
],
|
|
28199
|
-
|
|
28210
|
+
], Tt.prototype, "width", 2);
|
|
28211
|
+
hn([
|
|
28200
28212
|
Y({ type: String })
|
|
28201
|
-
],
|
|
28202
|
-
|
|
28213
|
+
], Tt.prototype, "height", 2);
|
|
28214
|
+
hn([
|
|
28203
28215
|
Y({ type: String })
|
|
28204
|
-
],
|
|
28205
|
-
|
|
28216
|
+
], Tt.prototype, "lapisDateField", 2);
|
|
28217
|
+
hn([
|
|
28206
28218
|
Y({ type: String })
|
|
28207
|
-
],
|
|
28208
|
-
|
|
28219
|
+
], Tt.prototype, "yAxisMaxLinear", 2);
|
|
28220
|
+
hn([
|
|
28209
28221
|
Y({ type: String })
|
|
28210
|
-
],
|
|
28211
|
-
|
|
28222
|
+
], Tt.prototype, "yAxisMaxLogarithmic", 2);
|
|
28223
|
+
Tt = hn([
|
|
28212
28224
|
Zt("gs-relative-growth-advantage")
|
|
28213
|
-
],
|
|
28225
|
+
], Tt);
|
|
28214
28226
|
const ec = (n, e) => {
|
|
28215
28227
|
if (typeof n == "number" && typeof e == "number")
|
|
28216
28228
|
return n - e;
|
|
@@ -28250,10 +28262,10 @@ const BV = ({ data: n, fields: e, pageSize: t }) => {
|
|
|
28250
28262
|
return /* @__PURE__ */ h(oo, { data: n, columns: i, pageSize: t });
|
|
28251
28263
|
}, WV = (n) => {
|
|
28252
28264
|
const { width: e, height: t } = n, i = { height: t, width: e };
|
|
28253
|
-
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(
|
|
28265
|
+
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(VV, { ...n }) }) });
|
|
28254
28266
|
}, VV = (n) => {
|
|
28255
28267
|
const { fields: e, filter: t, initialSortField: i, initialSortDirection: o } = n, s = Se(De), { data: a, error: r, isLoading: l } = Yn(async () => GV(t, e, s, { field: i, direction: o }), [t, e, s]);
|
|
28256
|
-
return l ? /* @__PURE__ */ h(
|
|
28268
|
+
return l ? /* @__PURE__ */ h(Ot, {}) : r !== null ? /* @__PURE__ */ h(Jt, { error: r }) : a === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(XV, { data: a, originalComponentProps: n });
|
|
28257
28269
|
}, XV = ({ data: n, originalComponentProps: e }) => {
|
|
28258
28270
|
const t = (o) => {
|
|
28259
28271
|
switch (o) {
|
|
@@ -28294,7 +28306,7 @@ var kV = Object.defineProperty, HV = Object.getOwnPropertyDescriptor, Nn = (n, e
|
|
|
28294
28306
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
28295
28307
|
return i && o && kV(e, t, o), o;
|
|
28296
28308
|
};
|
|
28297
|
-
let
|
|
28309
|
+
let gn = class extends es {
|
|
28298
28310
|
constructor() {
|
|
28299
28311
|
super(...arguments), this.fields = [], this.views = ["table"], this.filter = {}, this.width = "100%", this.height = "700px", this.initialSortField = "count", this.initialSortDirection = "descending", this.pageSize = !1;
|
|
28300
28312
|
}
|
|
@@ -28316,31 +28328,31 @@ let ln = class extends es {
|
|
|
28316
28328
|
};
|
|
28317
28329
|
Nn([
|
|
28318
28330
|
Y({ type: Array })
|
|
28319
|
-
],
|
|
28331
|
+
], gn.prototype, "fields", 2);
|
|
28320
28332
|
Nn([
|
|
28321
28333
|
Y({ type: Array })
|
|
28322
|
-
],
|
|
28334
|
+
], gn.prototype, "views", 2);
|
|
28323
28335
|
Nn([
|
|
28324
28336
|
Y({ type: Object })
|
|
28325
|
-
],
|
|
28337
|
+
], gn.prototype, "filter", 2);
|
|
28326
28338
|
Nn([
|
|
28327
28339
|
Y({ type: String })
|
|
28328
|
-
],
|
|
28340
|
+
], gn.prototype, "width", 2);
|
|
28329
28341
|
Nn([
|
|
28330
28342
|
Y({ type: String })
|
|
28331
|
-
],
|
|
28343
|
+
], gn.prototype, "height", 2);
|
|
28332
28344
|
Nn([
|
|
28333
28345
|
Y({ type: String })
|
|
28334
|
-
],
|
|
28346
|
+
], gn.prototype, "initialSortField", 2);
|
|
28335
28347
|
Nn([
|
|
28336
28348
|
Y({ type: String })
|
|
28337
|
-
],
|
|
28349
|
+
], gn.prototype, "initialSortDirection", 2);
|
|
28338
28350
|
Nn([
|
|
28339
28351
|
Y({ type: Object })
|
|
28340
|
-
],
|
|
28341
|
-
|
|
28352
|
+
], gn.prototype, "pageSize", 2);
|
|
28353
|
+
gn = Nn([
|
|
28342
28354
|
Zt("gs-aggregate")
|
|
28343
|
-
],
|
|
28355
|
+
], gn);
|
|
28344
28356
|
const fl = (n, e) => {
|
|
28345
28357
|
const t = n.map(({ displayName: a, content: r }) => ({
|
|
28346
28358
|
displayName: a,
|
|
@@ -28365,7 +28377,7 @@ const fl = (n, e) => {
|
|
|
28365
28377
|
};
|
|
28366
28378
|
ke.register(...to);
|
|
28367
28379
|
const SV = ({ data: n, yAxisScaleType: e }) => {
|
|
28368
|
-
const t =
|
|
28380
|
+
const t = rn(
|
|
28369
28381
|
() => ({
|
|
28370
28382
|
type: "bar",
|
|
28371
28383
|
data: {
|
|
@@ -28410,7 +28422,7 @@ const SV = ({ data: n, yAxisScaleType: e }) => {
|
|
|
28410
28422
|
};
|
|
28411
28423
|
ke.register(...to);
|
|
28412
28424
|
const NV = ({ data: n, yAxisScaleType: e }) => {
|
|
28413
|
-
const t =
|
|
28425
|
+
const t = rn(
|
|
28414
28426
|
() => ({
|
|
28415
28427
|
type: "line",
|
|
28416
28428
|
data: {
|
|
@@ -28463,7 +28475,7 @@ const NV = ({ data: n, yAxisScaleType: e }) => {
|
|
|
28463
28475
|
name: s.displayName,
|
|
28464
28476
|
sort: !0
|
|
28465
28477
|
}))
|
|
28466
|
-
], o =
|
|
28478
|
+
], o = rn(() => {
|
|
28467
28479
|
const s = fl(n, e);
|
|
28468
28480
|
return Object.values(s).map((a) => Object.values(a));
|
|
28469
28481
|
}, [n, e]);
|
|
@@ -28486,13 +28498,13 @@ async function _V(n, e, t, i, o) {
|
|
|
28486
28498
|
}
|
|
28487
28499
|
const zV = (n) => {
|
|
28488
28500
|
const { width: e, height: t } = n, i = { height: t, width: e };
|
|
28489
|
-
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(
|
|
28501
|
+
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(MV, { ...n }) }) });
|
|
28490
28502
|
}, MV = (n) => {
|
|
28491
28503
|
const { lapisFilter: e, lapisDateField: t, granularity: i, smoothingWindow: o } = n, s = Se(De), { data: a, error: r, isLoading: l } = Yn(
|
|
28492
28504
|
() => _V(s, e, t, i, o),
|
|
28493
28505
|
[s, e, t, i, o]
|
|
28494
28506
|
);
|
|
28495
|
-
return l ? /* @__PURE__ */ h(
|
|
28507
|
+
return l ? /* @__PURE__ */ h(Ot, {}) : r !== null ? /* @__PURE__ */ h(Jt, { error: r }) : a === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(LV, { data: a, originalComponentProps: n });
|
|
28496
28508
|
}, LV = ({ data: n, originalComponentProps: e }) => {
|
|
28497
28509
|
const [t, i] = oe("linear"), o = (s) => {
|
|
28498
28510
|
switch (s) {
|
|
@@ -28585,7 +28597,7 @@ var DV = Object.defineProperty, OV = Object.getOwnPropertyDescriptor, Fn = (n, e
|
|
|
28585
28597
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
28586
28598
|
return i && o && DV(e, t, o), o;
|
|
28587
28599
|
};
|
|
28588
|
-
let
|
|
28600
|
+
let cn = class extends es {
|
|
28589
28601
|
constructor() {
|
|
28590
28602
|
super(...arguments), this.lapisFilter = { displayName: "", lapisFilter: {} }, this.lapisDateField = "date", this.views = ["bar", "line", "table"], this.width = "100%", this.height = "700px", this.granularity = "day", this.smoothingWindow = 0, this.pageSize = !1;
|
|
28591
28603
|
}
|
|
@@ -28607,31 +28619,31 @@ let gn = class extends es {
|
|
|
28607
28619
|
};
|
|
28608
28620
|
Fn([
|
|
28609
28621
|
Y({ type: Object })
|
|
28610
|
-
],
|
|
28622
|
+
], cn.prototype, "lapisFilter", 2);
|
|
28611
28623
|
Fn([
|
|
28612
28624
|
Y({ type: String })
|
|
28613
|
-
],
|
|
28625
|
+
], cn.prototype, "lapisDateField", 2);
|
|
28614
28626
|
Fn([
|
|
28615
28627
|
Y({ type: Array })
|
|
28616
|
-
],
|
|
28628
|
+
], cn.prototype, "views", 2);
|
|
28617
28629
|
Fn([
|
|
28618
28630
|
Y({ type: String })
|
|
28619
|
-
],
|
|
28631
|
+
], cn.prototype, "width", 2);
|
|
28620
28632
|
Fn([
|
|
28621
28633
|
Y({ type: String })
|
|
28622
|
-
],
|
|
28634
|
+
], cn.prototype, "height", 2);
|
|
28623
28635
|
Fn([
|
|
28624
28636
|
Y({ type: String })
|
|
28625
|
-
],
|
|
28637
|
+
], cn.prototype, "granularity", 2);
|
|
28626
28638
|
Fn([
|
|
28627
28639
|
Y({ type: Number })
|
|
28628
|
-
],
|
|
28640
|
+
], cn.prototype, "smoothingWindow", 2);
|
|
28629
28641
|
Fn([
|
|
28630
28642
|
Y({ type: Object })
|
|
28631
|
-
],
|
|
28632
|
-
|
|
28643
|
+
], cn.prototype, "pageSize", 2);
|
|
28644
|
+
cn = Fn([
|
|
28633
28645
|
Zt("gs-number-sequences-over-time")
|
|
28634
|
-
],
|
|
28646
|
+
], cn);
|
|
28635
28647
|
const Ip = "KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgdXRpbDsKICAoZnVuY3Rpb24odXRpbDIpIHsKICAgIHV0aWwyLmFzc2VydEVxdWFsID0gKHZhbCkgPT4gdmFsOwogICAgZnVuY3Rpb24gYXNzZXJ0SXMoX2FyZykgewogICAgfQogICAgdXRpbDIuYXNzZXJ0SXMgPSBhc3NlcnRJczsKICAgIGZ1bmN0aW9uIGFzc2VydE5ldmVyKF94KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgfQogICAgdXRpbDIuYXNzZXJ0TmV2ZXIgPSBhc3NlcnROZXZlcjsKICAgIHV0aWwyLmFycmF5VG9FbnVtID0gKGl0ZW1zKSA9PiB7CiAgICAgIGNvbnN0IG9iaiA9IHt9OwogICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgICAgICBvYmpbaXRlbV0gPSBpdGVtOwogICAgICB9CiAgICAgIHJldHVybiBvYmo7CiAgICB9OwogICAgdXRpbDIuZ2V0VmFsaWRFbnVtVmFsdWVzID0gKG9iaikgPT4gewogICAgICBjb25zdCB2YWxpZEtleXMgPSB1dGlsMi5vYmplY3RLZXlzKG9iaikuZmlsdGVyKChrMikgPT4gdHlwZW9mIG9ialtvYmpbazJdXSAhPT0gIm51bWJlciIpOwogICAgICBjb25zdCBmaWx0ZXJlZCA9IHt9OwogICAgICBmb3IgKGNvbnN0IGsyIG9mIHZhbGlkS2V5cykgewogICAgICAgIGZpbHRlcmVkW2syXSA9IG9ialtrMl07CiAgICAgIH0KICAgICAgcmV0dXJuIHV0aWwyLm9iamVjdFZhbHVlcyhmaWx0ZXJlZCk7CiAgICB9OwogICAgdXRpbDIub2JqZWN0VmFsdWVzID0gKG9iaikgPT4gewogICAgICByZXR1cm4gdXRpbDIub2JqZWN0S2V5cyhvYmopLm1hcChmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBvYmpbZTJdOwogICAgICB9KTsKICAgIH07CiAgICB1dGlsMi5vYmplY3RLZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAiZnVuY3Rpb24iID8gKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKSA6IChvYmplY3QpID0+IHsKICAgICAgY29uc3Qga2V5cyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHsKICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBrZXlzOwogICAgfTsKICAgIHV0aWwyLmZpbmQgPSAoYXJyLCBjaGVja2VyKSA9PiB7CiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHsKICAgICAgICBpZiAoY2hlY2tlcihpdGVtKSkKICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICB9CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9OwogICAgdXRpbDIuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT09ICJmdW5jdGlvbiIgPyAodmFsKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHZhbCkgOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAibnVtYmVyIiAmJiBpc0Zpbml0ZSh2YWwpICYmIE1hdGguZmxvb3IodmFsKSA9PT0gdmFsOwogICAgZnVuY3Rpb24gam9pblZhbHVlcyhhcnJheSwgc2VwYXJhdG9yID0gIiB8ICIpIHsKICAgICAgcmV0dXJuIGFycmF5Lm1hcCgodmFsKSA9PiB0eXBlb2YgdmFsID09PSAic3RyaW5nIiA/IGAnJHt2YWx9J2AgOiB2YWwpLmpvaW4oc2VwYXJhdG9yKTsKICAgIH0KICAgIHV0aWwyLmpvaW5WYWx1ZXMgPSBqb2luVmFsdWVzOwogICAgdXRpbDIuanNvblN0cmluZ2lmeVJlcGxhY2VyID0gKF8sIHZhbHVlKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJiaWdpbnQiKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKICB9KSh1dGlsIHx8ICh1dGlsID0ge30pKTsKICB2YXIgb2JqZWN0VXRpbDsKICAoZnVuY3Rpb24ob2JqZWN0VXRpbDIpIHsKICAgIG9iamVjdFV0aWwyLm1lcmdlU2hhcGVzID0gKGZpcnN0LCBzZWNvbmQpID0+IHsKICAgICAgcmV0dXJuIHsKICAgICAgICAuLi5maXJzdCwKICAgICAgICAuLi5zZWNvbmQKICAgICAgICAvLyBzZWNvbmQgb3ZlcndyaXRlcyBmaXJzdAogICAgICB9OwogICAgfTsKICB9KShvYmplY3RVdGlsIHx8IChvYmplY3RVdGlsID0ge30pKTsKICBjb25zdCBab2RQYXJzZWRUeXBlID0gdXRpbC5hcnJheVRvRW51bShbCiAgICAic3RyaW5nIiwKICAgICJuYW4iLAogICAgIm51bWJlciIsCiAgICAiaW50ZWdlciIsCiAgICAiZmxvYXQiLAogICAgImJvb2xlYW4iLAogICAgImRhdGUiLAogICAgImJpZ2ludCIsCiAgICAic3ltYm9sIiwKICAgICJmdW5jdGlvbiIsCiAgICAidW5kZWZpbmVkIiwKICAgICJudWxsIiwKICAgICJhcnJheSIsCiAgICAib2JqZWN0IiwKICAgICJ1bmtub3duIiwKICAgICJwcm9taXNlIiwKICAgICJ2b2lkIiwKICAgICJuZXZlciIsCiAgICAibWFwIiwKICAgICJzZXQiCiAgXSk7CiAgY29uc3QgZ2V0UGFyc2VkVHlwZSA9IChkYXRhKSA9PiB7CiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7CiAgICBzd2l0Y2ggKHQpIHsKICAgICAgY2FzZSAidW5kZWZpbmVkIjoKICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQ7CiAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3RyaW5nOwogICAgICBjYXNlICJudW1iZXIiOgogICAgICAgIHJldHVybiBpc05hTihkYXRhKSA/IFpvZFBhcnNlZFR5cGUubmFuIDogWm9kUGFyc2VkVHlwZS5udW1iZXI7CiAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmJvb2xlYW47CiAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbjsKICAgICAgY2FzZSAiYmlnaW50IjoKICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5iaWdpbnQ7CiAgICAgIGNhc2UgInN5bWJvbCI6CiAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3ltYm9sOwogICAgICBjYXNlICJvYmplY3QiOgogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5hcnJheTsKICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnRoZW4gJiYgdHlwZW9mIGRhdGEudGhlbiA9PT0gImZ1bmN0aW9uIiAmJiBkYXRhLmNhdGNoICYmIHR5cGVvZiBkYXRhLmNhdGNoID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5wcm9taXNlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gInVuZGVmaW5lZCIgJiYgZGF0YSBpbnN0YW5jZW9mIE1hcCkgewogICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubWFwOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIFNldCAhPT0gInVuZGVmaW5lZCIgJiYgZGF0YSBpbnN0YW5jZW9mIFNldCkgewogICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc2V0OwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIERhdGUgIT09ICJ1bmRlZmluZWQiICYmIGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7CiAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5kYXRlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5vYmplY3Q7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUudW5rbm93bjsKICAgIH0KICB9OwogIGNvbnN0IFpvZElzc3VlQ29kZSA9IHV0aWwuYXJyYXlUb0VudW0oWwogICAgImludmFsaWRfdHlwZSIsCiAgICAiaW52YWxpZF9saXRlcmFsIiwKICAgICJjdXN0b20iLAogICAgImludmFsaWRfdW5pb24iLAogICAgImludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvciIsCiAgICAiaW52YWxpZF9lbnVtX3ZhbHVlIiwKICAgICJ1bnJlY29nbml6ZWRfa2V5cyIsCiAgICAiaW52YWxpZF9hcmd1bWVudHMiLAogICAgImludmFsaWRfcmV0dXJuX3R5cGUiLAogICAgImludmFsaWRfZGF0ZSIsCiAgICAiaW52YWxpZF9zdHJpbmciLAogICAgInRvb19zbWFsbCIsCiAgICAidG9vX2JpZyIsCiAgICAiaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXMiLAogICAgIm5vdF9tdWx0aXBsZV9vZiIsCiAgICAibm90X2Zpbml0ZSIKICBdKTsKICBjb25zdCBxdW90ZWxlc3NKc29uID0gKG9iaikgPT4gewogICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7CiAgICByZXR1cm4ganNvbi5yZXBsYWNlKC8iKFteIl0rKSI6L2csICIkMToiKTsKICB9OwogIGNsYXNzIFpvZEVycm9yIGV4dGVuZHMgRXJyb3IgewogICAgY29uc3RydWN0b3IoaXNzdWVzKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNzdWVzID0gW107CiAgICAgIHRoaXMuYWRkSXNzdWUgPSAoc3ViKSA9PiB7CiAgICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIHN1Yl07CiAgICAgIH07CiAgICAgIHRoaXMuYWRkSXNzdWVzID0gKHN1YnMgPSBbXSkgPT4gewogICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCAuLi5zdWJzXTsKICAgICAgfTsKICAgICAgY29uc3QgYWN0dWFsUHJvdG8gPSBuZXcudGFyZ2V0LnByb3RvdHlwZTsKICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgewogICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBhY3R1YWxQcm90byk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fX3Byb3RvX18gPSBhY3R1YWxQcm90bzsKICAgICAgfQogICAgICB0aGlzLm5hbWUgPSAiWm9kRXJyb3IiOwogICAgICB0aGlzLmlzc3VlcyA9IGlzc3VlczsKICAgIH0KICAgIGdldCBlcnJvcnMoKSB7CiAgICAgIHJldHVybiB0aGlzLmlzc3VlczsKICAgIH0KICAgIGZvcm1hdChfbWFwcGVyKSB7CiAgICAgIGNvbnN0IG1hcHBlciA9IF9tYXBwZXIgfHwgZnVuY3Rpb24oaXNzdWUpIHsKICAgICAgICByZXR1cm4gaXNzdWUubWVzc2FnZTsKICAgICAgfTsKICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7IF9lcnJvcnM6IFtdIH07CiAgICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvcikgPT4gewogICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7CiAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gImludmFsaWRfdW5pb24iKSB7CiAgICAgICAgICAgIGlzc3VlLnVuaW9uRXJyb3JzLm1hcChwcm9jZXNzRXJyb3IpOwogICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSAiaW52YWxpZF9yZXR1cm5fdHlwZSIpIHsKICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLnJldHVyblR5cGVFcnJvcik7CiAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09ICJpbnZhbGlkX2FyZ3VtZW50cyIpIHsKICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLmFyZ3VtZW50c0Vycm9yKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUucGF0aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgZmllbGRFcnJvcnMuX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IGN1cnIgPSBmaWVsZEVycm9yczsKICAgICAgICAgICAgbGV0IGkyID0gMDsKICAgICAgICAgICAgd2hpbGUgKGkyIDwgaXNzdWUucGF0aC5sZW5ndGgpIHsKICAgICAgICAgICAgICBjb25zdCBlbCA9IGlzc3VlLnBhdGhbaTJdOwogICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaTIgPT09IGlzc3VlLnBhdGgubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsKSB7CiAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07CiAgICAgICAgICAgICAgICBjdXJyW2VsXS5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTsKICAgICAgICAgICAgICBpMisrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBwcm9jZXNzRXJyb3IodGhpcyk7CiAgICAgIHJldHVybiBmaWVsZEVycm9yczsKICAgIH0KICAgIHN0YXRpYyBhc3NlcnQodmFsdWUpIHsKICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBab2RFcnJvcikpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIFpvZEVycm9yOiAke3ZhbHVlfWApOwogICAgICB9CiAgICB9CiAgICB0b1N0cmluZygpIHsKICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTsKICAgIH0KICAgIGdldCBtZXNzYWdlKCkgewogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5pc3N1ZXMsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTsKICAgIH0KICAgIGdldCBpc0VtcHR5KCkgewogICAgICByZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoID09PSAwOwogICAgfQogICAgZmxhdHRlbihtYXBwZXIgPSAoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpIHsKICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTsKICAgICAgY29uc3QgZm9ybUVycm9ycyA9IFtdOwogICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLmlzc3VlcykgewogICAgICAgIGlmIChzdWIucGF0aC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gPSBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gfHwgW107CiAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0ucHVzaChtYXBwZXIoc3ViKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvcm1FcnJvcnMucHVzaChtYXBwZXIoc3ViKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IGZvcm1FcnJvcnMsIGZpZWxkRXJyb3JzIH07CiAgICB9CiAgICBnZXQgZm9ybUVycm9ycygpIHsKICAgICAgcmV0dXJuIHRoaXMuZmxhdHRlbigpOwogICAgfQogIH0KICBab2RFcnJvci5jcmVhdGUgPSAoaXNzdWVzKSA9PiB7CiAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihpc3N1ZXMpOwogICAgcmV0dXJuIGVycm9yOwogIH07CiAgY29uc3QgZXJyb3JNYXAgPSAoaXNzdWUsIF9jdHgpID0+IHsKICAgIGxldCBtZXNzYWdlOwogICAgc3dpdGNoIChpc3N1ZS5jb2RlKSB7CiAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZToKICAgICAgICBpZiAoaXNzdWUucmVjZWl2ZWQgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7CiAgICAgICAgICBtZXNzYWdlID0gIlJlcXVpcmVkIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWVzc2FnZSA9IGBFeHBlY3RlZCAke2lzc3VlLmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHtpc3N1ZS5yZWNlaXZlZH1gOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsOgogICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KGlzc3VlLmV4cGVjdGVkLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlcil9YDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXM6CiAgICAgICAgbWVzc2FnZSA9IGBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUua2V5cywgIiwgIil9YDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbjoKICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXRgOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3I6CiAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLm9wdGlvbnMpfWA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZToKICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9LCByZWNlaXZlZCAnJHtpc3N1ZS5yZWNlaXZlZH0nYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHM6CiAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIGFyZ3VtZW50c2A7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGU6CiAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlOgogICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkYXRlYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmc6CiAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uID09PSAib2JqZWN0IikgewogICAgICAgICAgaWYgKCJpbmNsdWRlcyIgaW4gaXNzdWUudmFsaWRhdGlvbikgewogICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSAiJHtpc3N1ZS52YWxpZGF0aW9uLmluY2x1ZGVzfSJgOwogICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlLnZhbGlkYXRpb24ucG9zaXRpb24gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgbWVzc2FnZSA9IGAke21lc3NhZ2V9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9ufWA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoInN0YXJ0c1dpdGgiIGluIGlzc3VlLnZhbGlkYXRpb24pIHsKICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggIiR7aXNzdWUudmFsaWRhdGlvbi5zdGFydHNXaXRofSJgOwogICAgICAgICAgfSBlbHNlIGlmICgiZW5kc1dpdGgiIGluIGlzc3VlLnZhbGlkYXRpb24pIHsKICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoICIke2lzc3VlLnZhbGlkYXRpb24uZW5kc1dpdGh9ImA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGlzc3VlLnZhbGlkYXRpb24pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaXNzdWUudmFsaWRhdGlvbiAhPT0gInJlZ2V4IikgewogICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkICR7aXNzdWUudmFsaWRhdGlvbn1gOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZXNzYWdlID0gIkludmFsaWQiOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudG9vX3NtYWxsOgogICAgICAgIGlmIChpc3N1ZS50eXBlID09PSAiYXJyYXkiKQogICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/ICJleGFjdGx5IiA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBsZWFzdGAgOiBgbW9yZSB0aGFuYH0gJHtpc3N1ZS5taW5pbXVtfSBlbGVtZW50KHMpYDsKICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gImV4YWN0bHkiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBvdmVyYH0gJHtpc3N1ZS5taW5pbXVtfSBjaGFyYWN0ZXIocylgOwogICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09ICJudW1iZXIiKQogICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHkgZXF1YWwgdG8gYCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYCA6IGBncmVhdGVyIHRoYW4gYH0ke2lzc3VlLm1pbmltdW19YDsKICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSAiZGF0ZSIpCiAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHkgZXF1YWwgdG8gYCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYCA6IGBncmVhdGVyIHRoYW4gYH0ke25ldyBEYXRlKE51bWJlcihpc3N1ZS5taW5pbXVtKSl9YDsKICAgICAgICBlbHNlCiAgICAgICAgICBtZXNzYWdlID0gIkludmFsaWQgaW5wdXQiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFpvZElzc3VlQ29kZS50b29fYmlnOgogICAgICAgIGlmIChpc3N1ZS50eXBlID09PSAiYXJyYXkiKQogICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBtb3N0YCA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19IGVsZW1lbnQocylgOwogICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgbWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbW9zdGAgOiBgdW5kZXJgfSAke2lzc3VlLm1heGltdW19IGNoYXJhY3RlcihzKWA7CiAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYCA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19YDsKICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSAiYmlnaW50IikKICAgICAgICAgIG1lc3NhZ2UgPSBgQmlnSW50IG11c3QgYmUgJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBsZXNzIHRoYW4gb3IgZXF1YWwgdG9gIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gOwogICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09ICJkYXRlIikKICAgICAgICAgIG1lc3NhZ2UgPSBgRGF0ZSBtdXN0IGJlICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvYCA6IGBzbWFsbGVyIHRoYW5gfSAke25ldyBEYXRlKE51bWJlcihpc3N1ZS5tYXhpbXVtKSl9YDsKICAgICAgICBlbHNlCiAgICAgICAgICBtZXNzYWdlID0gIkludmFsaWQgaW5wdXQiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFpvZElzc3VlQ29kZS5jdXN0b206CiAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0YDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6CiAgICAgICAgbWVzc2FnZSA9IGBJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mOgogICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAke2lzc3VlLm11bHRpcGxlT2Z9YDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUubm90X2Zpbml0ZToKICAgICAgICBtZXNzYWdlID0gIk51bWJlciBtdXN0IGJlIGZpbml0ZSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgbWVzc2FnZSA9IF9jdHguZGVmYXVsdEVycm9yOwogICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUpOwogICAgfQogICAgcmV0dXJuIHsgbWVzc2FnZSB9OwogIH07CiAgbGV0IG92ZXJyaWRlRXJyb3JNYXAgPSBlcnJvck1hcDsKICBmdW5jdGlvbiBzZXRFcnJvck1hcChtYXApIHsKICAgIG92ZXJyaWRlRXJyb3JNYXAgPSBtYXA7CiAgfQogIGZ1bmN0aW9uIGdldEVycm9yTWFwKCkgewogICAgcmV0dXJuIG92ZXJyaWRlRXJyb3JNYXA7CiAgfQogIGNvbnN0IG1ha2VJc3N1ZSA9IChwYXJhbXMpID0+IHsKICAgIGNvbnN0IHsgZGF0YSwgcGF0aCwgZXJyb3JNYXBzLCBpc3N1ZURhdGEgfSA9IHBhcmFtczsKICAgIGNvbnN0IGZ1bGxQYXRoID0gWy4uLnBhdGgsIC4uLmlzc3VlRGF0YS5wYXRoIHx8IFtdXTsKICAgIGNvbnN0IGZ1bGxJc3N1ZSA9IHsKICAgICAgLi4uaXNzdWVEYXRhLAogICAgICBwYXRoOiBmdWxsUGF0aAogICAgfTsKICAgIGlmIChpc3N1ZURhdGEubWVzc2FnZSAhPT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgLi4uaXNzdWVEYXRhLAogICAgICAgIHBhdGg6IGZ1bGxQYXRoLAogICAgICAgIG1lc3NhZ2U6IGlzc3VlRGF0YS5tZXNzYWdlCiAgICAgIH07CiAgICB9CiAgICBsZXQgZXJyb3JNZXNzYWdlID0gIiI7CiAgICBjb25zdCBtYXBzID0gZXJyb3JNYXBzLmZpbHRlcigobTIpID0+ICEhbTIpLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykgewogICAgICBlcnJvck1lc3NhZ2UgPSBtYXAoZnVsbElzc3VlLCB7IGRhdGEsIGRlZmF1bHRFcnJvcjogZXJyb3JNZXNzYWdlIH0pLm1lc3NhZ2U7CiAgICB9CiAgICByZXR1cm4gewogICAgICAuLi5pc3N1ZURhdGEsCiAgICAgIHBhdGg6IGZ1bGxQYXRoLAogICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UKICAgIH07CiAgfTsKICBjb25zdCBFTVBUWV9QQVRIID0gW107CiAgZnVuY3Rpb24gYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBpc3N1ZURhdGEpIHsKICAgIGNvbnN0IG92ZXJyaWRlTWFwID0gZ2V0RXJyb3JNYXAoKTsKICAgIGNvbnN0IGlzc3VlID0gbWFrZUlzc3VlKHsKICAgICAgaXNzdWVEYXRhLAogICAgICBkYXRhOiBjdHguZGF0YSwKICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgIGVycm9yTWFwczogWwogICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLAogICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCwKICAgICAgICBvdmVycmlkZU1hcCwKICAgICAgICBvdmVycmlkZU1hcCA9PT0gZXJyb3JNYXAgPyB2b2lkIDAgOiBlcnJvck1hcAogICAgICAgIC8vIHRoZW4gZ2xvYmFsIGRlZmF1bHQgbWFwCiAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpCiAgICB9KTsKICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goaXNzdWUpOwogIH0KICBjbGFzcyBQYXJzZVN0YXR1cyB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy52YWx1ZSA9ICJ2YWxpZCI7CiAgICB9CiAgICBkaXJ0eSgpIHsKICAgICAgaWYgKHRoaXMudmFsdWUgPT09ICJ2YWxpZCIpCiAgICAgICAgdGhpcy52YWx1ZSA9ICJkaXJ0eSI7CiAgICB9CiAgICBhYm9ydCgpIHsKICAgICAgaWYgKHRoaXMudmFsdWUgIT09ICJhYm9ydGVkIikKICAgICAgICB0aGlzLnZhbHVlID0gImFib3J0ZWQiOwogICAgfQogICAgc3RhdGljIG1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKSB7CiAgICAgIGNvbnN0IGFycmF5VmFsdWUgPSBbXTsKICAgICAgZm9yIChjb25zdCBzMiBvZiByZXN1bHRzKSB7CiAgICAgICAgaWYgKHMyLnN0YXR1cyA9PT0gImFib3J0ZWQiKQogICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgaWYgKHMyLnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgIGFycmF5VmFsdWUucHVzaChzMi52YWx1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBhcnJheVZhbHVlIH07CiAgICB9CiAgICBzdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKSB7CiAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdOwogICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHsKICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTsKICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7CiAgICAgICAgc3luY1BhaXJzLnB1c2goewogICAgICAgICAga2V5LAogICAgICAgICAgdmFsdWUKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgc3luY1BhaXJzKTsKICAgIH0KICAgIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycykgewogICAgICBjb25zdCBmaW5hbE9iamVjdCA9IHt9OwogICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHsKICAgICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHBhaXI7CiAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09ICJhYm9ydGVkIikKICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09ICJhYm9ydGVkIikKICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgIGlmIChrZXkuc3RhdHVzID09PSAiZGlydHkiKQogICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgaWYgKHZhbHVlLnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgIGlmIChrZXkudmFsdWUgIT09ICJfX3Byb3RvX18iICYmICh0eXBlb2YgdmFsdWUudmFsdWUgIT09ICJ1bmRlZmluZWQiIHx8IHBhaXIuYWx3YXlzU2V0KSkgewogICAgICAgICAgZmluYWxPYmplY3Rba2V5LnZhbHVlXSA9IHZhbHVlLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsT2JqZWN0IH07CiAgICB9CiAgfQogIGNvbnN0IElOVkFMSUQgPSBPYmplY3QuZnJlZXplKHsKICAgIHN0YXR1czogImFib3J0ZWQiCiAgfSk7CiAgY29uc3QgRElSVFkgPSAodmFsdWUpID0+ICh7IHN0YXR1czogImRpcnR5IiwgdmFsdWUgfSk7CiAgY29uc3QgT0sgPSAodmFsdWUpID0+ICh7IHN0YXR1czogInZhbGlkIiwgdmFsdWUgfSk7CiAgY29uc3QgaXNBYm9ydGVkID0gKHgpID0+IHguc3RhdHVzID09PSAiYWJvcnRlZCI7CiAgY29uc3QgaXNEaXJ0eSA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gImRpcnR5IjsKICBjb25zdCBpc1ZhbGlkID0gKHgpID0+IHguc3RhdHVzID09PSAidmFsaWQiOwogIGNvbnN0IGlzQXN5bmMgPSAoeCkgPT4gdHlwZW9mIFByb21pc2UgIT09ICJ1bmRlZmluZWQiICYmIHggaW5zdGFuY2VvZiBQcm9taXNlOwogIGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmMikgewogICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZjIgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0Iik7CiAgICByZXR1cm4gc3RhdGUuZ2V0KHJlY2VpdmVyKTsKICB9CiAgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmMikgewogICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZjIgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTsKICAgIHJldHVybiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSwgdmFsdWU7CiAgfQogIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbihlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkgewogICAgdmFyIGUyID0gbmV3IEVycm9yKG1lc3NhZ2UpOwogICAgcmV0dXJuIGUyLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZTIuZXJyb3IgPSBlcnJvciwgZTIuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGUyOwogIH07CiAgdmFyIGVycm9yVXRpbDsKICAoZnVuY3Rpb24oZXJyb3JVdGlsMikgewogICAgZXJyb3JVdGlsMi5lcnJUb09iaiA9IChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gInN0cmluZyIgPyB7IG1lc3NhZ2UgfSA6IG1lc3NhZ2UgfHwge307CiAgICBlcnJvclV0aWwyLnRvU3RyaW5nID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSAic3RyaW5nIiA/IG1lc3NhZ2UgOiBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UubWVzc2FnZTsKICB9KShlcnJvclV0aWwgfHwgKGVycm9yVXRpbCA9IHt9KSk7CiAgdmFyIF9ab2RFbnVtX2NhY2hlLCBfWm9kTmF0aXZlRW51bV9jYWNoZTsKICBjbGFzcyBQYXJzZUlucHV0TGF6eVBhdGggewogICAgY29uc3RydWN0b3IocGFyZW50LCB2YWx1ZSwgcGF0aCwga2V5KSB7CiAgICAgIHRoaXMuX2NhY2hlZFBhdGggPSBbXTsKICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIHRoaXMuZGF0YSA9IHZhbHVlOwogICAgICB0aGlzLl9wYXRoID0gcGF0aDsKICAgICAgdGhpcy5fa2V5ID0ga2V5OwogICAgfQogICAgZ2V0IHBhdGgoKSB7CiAgICAgIGlmICghdGhpcy5fY2FjaGVkUGF0aC5sZW5ndGgpIHsKICAgICAgICBpZiAodGhpcy5fa2V5IGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCAuLi50aGlzLl9rZXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgdGhpcy5fa2V5KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGg7CiAgICB9CiAgfQogIGNvbnN0IGhhbmRsZVJlc3VsdCA9IChjdHgsIHJlc3VsdCkgPT4gewogICAgaWYgKGlzVmFsaWQocmVzdWx0KSkgewogICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHQudmFsdWUgfTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLiIpOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgc3VjY2VzczogZmFsc2UsCiAgICAgICAgZ2V0IGVycm9yKCkgewogICAgICAgICAgaWYgKHRoaXMuX2Vycm9yKQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7CiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihjdHguY29tbW9uLmlzc3Vlcyk7CiAgICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yOwogICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIHByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSB7CiAgICBpZiAoIXBhcmFtcykKICAgICAgcmV0dXJuIHt9OwogICAgY29uc3QgeyBlcnJvck1hcDogZXJyb3JNYXAyLCBpbnZhbGlkX3R5cGVfZXJyb3IsIHJlcXVpcmVkX2Vycm9yLCBkZXNjcmlwdGlvbiB9ID0gcGFyYW1zOwogICAgaWYgKGVycm9yTWFwMiAmJiAoaW52YWxpZF90eXBlX2Vycm9yIHx8IHJlcXVpcmVkX2Vycm9yKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHVzZSAiaW52YWxpZF90eXBlX2Vycm9yIiBvciAicmVxdWlyZWRfZXJyb3IiIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1hcC5gKTsKICAgIH0KICAgIGlmIChlcnJvck1hcDIpCiAgICAgIHJldHVybiB7IGVycm9yTWFwOiBlcnJvck1hcDIsIGRlc2NyaXB0aW9uIH07CiAgICBjb25zdCBjdXN0b21NYXAgPSAoaXNzLCBjdHgpID0+IHsKICAgICAgdmFyIF9hLCBfYjsKICAgICAgY29uc3QgeyBtZXNzYWdlIH0gPSBwYXJhbXM7CiAgICAgIGlmIChpc3MuY29kZSA9PT0gImludmFsaWRfZW51bV92YWx1ZSIpIHsKICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlICE9PSBudWxsICYmIG1lc3NhZ2UgIT09IHZvaWQgMCA/IG1lc3NhZ2UgOiBjdHguZGVmYXVsdEVycm9yIH07CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBjdHguZGF0YSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICByZXR1cm4geyBtZXNzYWdlOiAoX2EgPSBtZXNzYWdlICE9PSBudWxsICYmIG1lc3NhZ2UgIT09IHZvaWQgMCA/IG1lc3NhZ2UgOiByZXF1aXJlZF9lcnJvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY3R4LmRlZmF1bHRFcnJvciB9OwogICAgICB9CiAgICAgIGlmIChpc3MuY29kZSAhPT0gImludmFsaWRfdHlwZSIpCiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogY3R4LmRlZmF1bHRFcnJvciB9OwogICAgICByZXR1cm4geyBtZXNzYWdlOiAoX2IgPSBtZXNzYWdlICE9PSBudWxsICYmIG1lc3NhZ2UgIT09IHZvaWQgMCA/IG1lc3NhZ2UgOiBpbnZhbGlkX3R5cGVfZXJyb3IpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGN0eC5kZWZhdWx0RXJyb3IgfTsKICAgIH07CiAgICByZXR1cm4geyBlcnJvck1hcDogY3VzdG9tTWFwLCBkZXNjcmlwdGlvbiB9OwogIH0KICBjbGFzcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKGRlZikgewogICAgICB0aGlzLnNwYSA9IHRoaXMuc2FmZVBhcnNlQXN5bmM7CiAgICAgIHRoaXMuX2RlZiA9IGRlZjsKICAgICAgdGhpcy5wYXJzZSA9IHRoaXMucGFyc2UuYmluZCh0aGlzKTsKICAgICAgdGhpcy5zYWZlUGFyc2UgPSB0aGlzLnNhZmVQYXJzZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLnBhcnNlQXN5bmMgPSB0aGlzLnBhcnNlQXN5bmMuYmluZCh0aGlzKTsKICAgICAgdGhpcy5zYWZlUGFyc2VBc3luYyA9IHRoaXMuc2FmZVBhcnNlQXN5bmMuYmluZCh0aGlzKTsKICAgICAgdGhpcy5zcGEgPSB0aGlzLnNwYS5iaW5kKHRoaXMpOwogICAgICB0aGlzLnJlZmluZSA9IHRoaXMucmVmaW5lLmJpbmQodGhpcyk7CiAgICAgIHRoaXMucmVmaW5lbWVudCA9IHRoaXMucmVmaW5lbWVudC5iaW5kKHRoaXMpOwogICAgICB0aGlzLnN1cGVyUmVmaW5lID0gdGhpcy5zdXBlclJlZmluZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLm9wdGlvbmFsID0gdGhpcy5vcHRpb25hbC5iaW5kKHRoaXMpOwogICAgICB0aGlzLm51bGxhYmxlID0gdGhpcy5udWxsYWJsZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLm51bGxpc2ggPSB0aGlzLm51bGxpc2guYmluZCh0aGlzKTsKICAgICAgdGhpcy5hcnJheSA9IHRoaXMuYXJyYXkuYmluZCh0aGlzKTsKICAgICAgdGhpcy5wcm9taXNlID0gdGhpcy5wcm9taXNlLmJpbmQodGhpcyk7CiAgICAgIHRoaXMub3IgPSB0aGlzLm9yLmJpbmQodGhpcyk7CiAgICAgIHRoaXMuYW5kID0gdGhpcy5hbmQuYmluZCh0aGlzKTsKICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybS5iaW5kKHRoaXMpOwogICAgICB0aGlzLmJyYW5kID0gdGhpcy5icmFuZC5iaW5kKHRoaXMpOwogICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlZmF1bHQuYmluZCh0aGlzKTsKICAgICAgdGhpcy5jYXRjaCA9IHRoaXMuY2F0Y2guYmluZCh0aGlzKTsKICAgICAgdGhpcy5kZXNjcmliZSA9IHRoaXMuZGVzY3JpYmUuYmluZCh0aGlzKTsKICAgICAgdGhpcy5waXBlID0gdGhpcy5waXBlLmJpbmQodGhpcyk7CiAgICAgIHRoaXMucmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5LmJpbmQodGhpcyk7CiAgICAgIHRoaXMuaXNOdWxsYWJsZSA9IHRoaXMuaXNOdWxsYWJsZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLmlzT3B0aW9uYWwgPSB0aGlzLmlzT3B0aW9uYWwuYmluZCh0aGlzKTsKICAgIH0KICAgIGdldCBkZXNjcmlwdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kZXNjcmlwdGlvbjsKICAgIH0KICAgIF9nZXRUeXBlKGlucHV0KSB7CiAgICAgIHJldHVybiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpOwogICAgfQogICAgX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpIHsKICAgICAgcmV0dXJuIGN0eCB8fCB7CiAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLAogICAgICAgIGRhdGE6IGlucHV0LmRhdGEsCiAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKSwKICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLAogICAgICAgIHBhdGg6IGlucHV0LnBhdGgsCiAgICAgICAgcGFyZW50OiBpbnB1dC5wYXJlbnQKICAgICAgfTsKICAgIH0KICAgIF9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzdGF0dXM6IG5ldyBQYXJzZVN0YXR1cygpLAogICAgICAgIGN0eDogewogICAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLAogICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSwKICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSksCiAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLAogICAgICAgICAgcGF0aDogaW5wdXQucGF0aCwKICAgICAgICAgIHBhcmVudDogaW5wdXQucGFyZW50CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgX3BhcnNlU3luYyhpbnB1dCkgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7CiAgICAgIGlmIChpc0FzeW5jKHJlc3VsdCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9wYXJzZUFzeW5jKGlucHV0KSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlKGlucHV0KTsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpOwogICAgfQogICAgcGFyc2UoZGF0YSwgcGFyYW1zKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2FmZVBhcnNlKGRhdGEsIHBhcmFtcyk7CiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykKICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7CiAgICAgIHRocm93IHJlc3VsdC5lcnJvcjsKICAgIH0KICAgIHNhZmVQYXJzZShkYXRhLCBwYXJhbXMpIHsKICAgICAgdmFyIF9hOwogICAgICBjb25zdCBjdHggPSB7CiAgICAgICAgY29tbW9uOiB7CiAgICAgICAgICBpc3N1ZXM6IFtdLAogICAgICAgICAgYXN5bmM6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5hc3luYykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsCiAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcAogICAgICAgIH0sCiAgICAgICAgcGF0aDogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYXRoKSB8fCBbXSwKICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLAogICAgICAgIHBhcmVudDogbnVsbCwKICAgICAgICBkYXRhLAogICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoZGF0YSkKICAgICAgfTsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pOwogICAgICByZXR1cm4gaGFuZGxlUmVzdWx0KGN0eCwgcmVzdWx0KTsKICAgIH0KICAgIGFzeW5jIHBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKTsKICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKQogICAgICAgIHJldHVybiByZXN1bHQuZGF0YTsKICAgICAgdGhyb3cgcmVzdWx0LmVycm9yOwogICAgfQogICAgYXN5bmMgc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7CiAgICAgIGNvbnN0IGN0eCA9IHsKICAgICAgICBjb21tb246IHsKICAgICAgICAgIGlzc3VlczogW10sCiAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCwKICAgICAgICAgIGFzeW5jOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLAogICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsCiAgICAgICAgcGFyZW50OiBudWxsLAogICAgICAgIGRhdGEsCiAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKQogICAgICB9OwogICAgICBjb25zdCBtYXliZUFzeW5jUmVzdWx0ID0gdGhpcy5fcGFyc2UoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChpc0FzeW5jKG1heWJlQXN5bmNSZXN1bHQpID8gbWF5YmVBc3luY1Jlc3VsdCA6IFByb21pc2UucmVzb2x2ZShtYXliZUFzeW5jUmVzdWx0KSk7CiAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpOwogICAgfQogICAgcmVmaW5lKGNoZWNrLCBtZXNzYWdlKSB7CiAgICAgIGNvbnN0IGdldElzc3VlUHJvcGVydGllcyA9ICh2YWwpID0+IHsKICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICJzdHJpbmciIHx8IHR5cGVvZiBtZXNzYWdlID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZSB9OwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHJldHVybiBtZXNzYWdlKHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2sodmFsKTsKICAgICAgICBjb25zdCBzZXRFcnJvciA9ICgpID0+IGN0eC5hZGRJc3N1ZSh7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuY3VzdG9tLAogICAgICAgICAgLi4uZ2V0SXNzdWVQcm9wZXJ0aWVzKHZhbCkKICAgICAgICB9KTsKICAgICAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICJ1bmRlZmluZWQiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigoZGF0YSkgPT4gewogICAgICAgICAgICBpZiAoIWRhdGEpIHsKICAgICAgICAgICAgICBzZXRFcnJvcigpOwogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICBzZXRFcnJvcigpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgcmVmaW5lbWVudChjaGVjaywgcmVmaW5lbWVudERhdGEpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7CiAgICAgICAgaWYgKCFjaGVjayh2YWwpKSB7CiAgICAgICAgICBjdHguYWRkSXNzdWUodHlwZW9mIHJlZmluZW1lbnREYXRhID09PSAiZnVuY3Rpb24iID8gcmVmaW5lbWVudERhdGEodmFsLCBjdHgpIDogcmVmaW5lbWVudERhdGEpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgX3JlZmluZW1lbnQocmVmaW5lbWVudCkgewogICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoewogICAgICAgIHNjaGVtYTogdGhpcywKICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsCiAgICAgICAgZWZmZWN0OiB7IHR5cGU6ICJyZWZpbmVtZW50IiwgcmVmaW5lbWVudCB9CiAgICAgIH0pOwogICAgfQogICAgc3VwZXJSZWZpbmUocmVmaW5lbWVudCkgewogICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudChyZWZpbmVtZW50KTsKICAgIH0KICAgIG9wdGlvbmFsKCkgewogICAgICByZXR1cm4gWm9kT3B0aW9uYWwuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7CiAgICB9CiAgICBudWxsYWJsZSgpIHsKICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpOwogICAgfQogICAgbnVsbGlzaCgpIHsKICAgICAgcmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpOwogICAgfQogICAgYXJyYXkoKSB7CiAgICAgIHJldHVybiBab2RBcnJheS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTsKICAgIH0KICAgIHByb21pc2UoKSB7CiAgICAgIHJldHVybiBab2RQcm9taXNlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpOwogICAgfQogICAgb3Iob3B0aW9uKSB7CiAgICAgIHJldHVybiBab2RVbmlvbi5jcmVhdGUoW3RoaXMsIG9wdGlvbl0sIHRoaXMuX2RlZik7CiAgICB9CiAgICBhbmQoaW5jb21pbmcpIHsKICAgICAgcmV0dXJuIFpvZEludGVyc2VjdGlvbi5jcmVhdGUodGhpcywgaW5jb21pbmcsIHRoaXMuX2RlZik7CiAgICB9CiAgICB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7CiAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7CiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLAogICAgICAgIHNjaGVtYTogdGhpcywKICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsCiAgICAgICAgZWZmZWN0OiB7IHR5cGU6ICJ0cmFuc2Zvcm0iLCB0cmFuc2Zvcm0gfQogICAgICB9KTsKICAgIH0KICAgIGRlZmF1bHQoZGVmKSB7CiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmMgPSB0eXBlb2YgZGVmID09PSAiZnVuY3Rpb24iID8gZGVmIDogKCkgPT4gZGVmOwogICAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoewogICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSwKICAgICAgICBpbm5lclR5cGU6IHRoaXMsCiAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVGdW5jLAogICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdAogICAgICB9KTsKICAgIH0KICAgIGJyYW5kKCkgewogICAgICByZXR1cm4gbmV3IFpvZEJyYW5kZWQoewogICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQnJhbmRlZCwKICAgICAgICB0eXBlOiB0aGlzLAogICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKQogICAgICB9KTsKICAgIH0KICAgIGNhdGNoKGRlZikgewogICAgICBjb25zdCBjYXRjaFZhbHVlRnVuYyA9IHR5cGVvZiBkZWYgPT09ICJmdW5jdGlvbiIgPyBkZWYgOiAoKSA9PiBkZWY7CiAgICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goewogICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSwKICAgICAgICBpbm5lclR5cGU6IHRoaXMsCiAgICAgICAgY2F0Y2hWYWx1ZTogY2F0Y2hWYWx1ZUZ1bmMsCiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaAogICAgICB9KTsKICAgIH0KICAgIGRlc2NyaWJlKGRlc2NyaXB0aW9uKSB7CiAgICAgIGNvbnN0IFRoaXMgPSB0aGlzLmNvbnN0cnVjdG9yOwogICAgICByZXR1cm4gbmV3IFRoaXMoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBkZXNjcmlwdGlvbgogICAgICB9KTsKICAgIH0KICAgIHBpcGUodGFyZ2V0KSB7CiAgICAgIHJldHVybiBab2RQaXBlbGluZS5jcmVhdGUodGhpcywgdGFyZ2V0KTsKICAgIH0KICAgIHJlYWRvbmx5KCkgewogICAgICByZXR1cm4gWm9kUmVhZG9ubHkuY3JlYXRlKHRoaXMpOwogICAgfQogICAgaXNPcHRpb25hbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKHZvaWQgMCkuc3VjY2VzczsKICAgIH0KICAgIGlzTnVsbGFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzOwogICAgfQogIH0KICBjb25zdCBjdWlkUmVnZXggPSAvXmNbXlxzLV17OCx9JC9pOwogIGNvbnN0IGN1aWQyUmVnZXggPSAvXlswLTlhLXpdKyQvOwogIGNvbnN0IHVsaWRSZWdleCA9IC9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvOwogIGNvbnN0IHV1aWRSZWdleCA9IC9eWzAtOWEtZkEtRl17OH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXsxMn0kL2k7CiAgY29uc3QgbmFub2lkUmVnZXggPSAvXlthLXowLTlfLV17MjF9JC9pOwogIGNvbnN0IGR1cmF0aW9uUmVnZXggPSAvXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvOwogIGNvbnN0IGVtYWlsUmVnZXggPSAvXig/IVwuKSg/IS4qXC5cLikoW0EtWjAtOV8nK1wtXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XC1dKlwuKStbQS1aXXsyLH0kL2k7CiAgY29uc3QgX2Vtb2ppUmVnZXggPSBgXihcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7CiAgbGV0IGVtb2ppUmVnZXg7CiAgY29uc3QgaXB2NFJlZ2V4ID0gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSQvOwogIGNvbnN0IGlwdjZSZWdleCA9IC9eKChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpJC87CiAgY29uc3QgYmFzZTY0UmVnZXggPSAvXihbMC05YS16QS1aKy9dezR9KSooKFswLTlhLXpBLVorL117Mn09PSl8KFswLTlhLXpBLVorL117M309KSk/JC87CiAgY29uc3QgZGF0ZVJlZ2V4U291cmNlID0gYCgoXFxkXFxkWzI0NjhdWzA0OF18XFxkXFxkWzEzNTc5XVsyNl18XFxkXFxkMFs0OF18WzAyNDY4XVswNDhdMDB8WzEzNTc5XVsyNl0wMCktMDItMjl8XFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcZHwzWzAxXSl8KDBbNDY5XXwxMSktKDBbMS05XXxbMTJdXFxkfDMwKXwoMDIpLSgwWzEtOV18MVxcZHwyWzAtOF0pKSlgOwogIGNvbnN0IGRhdGVSZWdleCA9IG5ldyBSZWdFeHAoYF4ke2RhdGVSZWdleFNvdXJjZX0kYCk7CiAgZnVuY3Rpb24gdGltZVJlZ2V4U291cmNlKGFyZ3MpIHsKICAgIGxldCByZWdleCA9IGAoWzAxXVxcZHwyWzAtM10pOlswLTVdXFxkOlswLTVdXFxkYDsKICAgIGlmIChhcmdzLnByZWNpc2lvbikgewogICAgICByZWdleCA9IGAke3JlZ2V4fVxcLlxcZHske2FyZ3MucHJlY2lzaW9ufX1gOwogICAgfSBlbHNlIGlmIChhcmdzLnByZWNpc2lvbiA9PSBudWxsKSB7CiAgICAgIHJlZ2V4ID0gYCR7cmVnZXh9KFxcLlxcZCspP2A7CiAgICB9CiAgICByZXR1cm4gcmVnZXg7CiAgfQogIGZ1bmN0aW9uIHRpbWVSZWdleChhcmdzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7dGltZVJlZ2V4U291cmNlKGFyZ3MpfSRgKTsKICB9CiAgZnVuY3Rpb24gZGF0ZXRpbWVSZWdleChhcmdzKSB7CiAgICBsZXQgcmVnZXggPSBgJHtkYXRlUmVnZXhTb3VyY2V9VCR7dGltZVJlZ2V4U291cmNlKGFyZ3MpfWA7CiAgICBjb25zdCBvcHRzID0gW107CiAgICBvcHRzLnB1c2goYXJncy5sb2NhbCA/IGBaP2AgOiBgWmApOwogICAgaWYgKGFyZ3Mub2Zmc2V0KQogICAgICBvcHRzLnB1c2goYChbKy1dXFxkezJ9Oj9cXGR7Mn0pYCk7CiAgICByZWdleCA9IGAke3JlZ2V4fSgke29wdHMuam9pbigifCIpfSlgOwogICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4fSRgKTsKICB9CiAgZnVuY3Rpb24gaXNWYWxpZElQKGlwLCB2ZXJzaW9uKSB7CiAgICBpZiAoKHZlcnNpb24gPT09ICJ2NCIgfHwgIXZlcnNpb24pICYmIGlwdjRSZWdleC50ZXN0KGlwKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICgodmVyc2lvbiA9PT0gInY2IiB8fCAhdmVyc2lvbikgJiYgaXB2NlJlZ2V4LnRlc3QoaXApKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjbGFzcyBab2RTdHJpbmcgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkgewogICAgICAgIGlucHV0LmRhdGEgPSBTdHJpbmcoaW5wdXQuZGF0YSk7CiAgICAgIH0KICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpOwogICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcpIHsKICAgICAgICBjb25zdCBjdHgyID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpOwogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eDIsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsCiAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zdHJpbmcsCiAgICAgICAgICByZWNlaXZlZDogY3R4Mi5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7CiAgICAgIGxldCBjdHggPSB2b2lkIDA7CiAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykgewogICAgICAgIGlmIChjaGVjay5raW5kID09PSAibWluIikgewogICAgICAgICAgaWYgKGlucHV0LmRhdGEubGVuZ3RoIDwgY2hlY2sudmFsdWUpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsCiAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsCiAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJsZW5ndGgiKSB7CiAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlOwogICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlOwogICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgaWYgKHRvb0JpZykgewogICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsCiAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9vU21hbGwpIHsKICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsCiAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiZW1haWwiKSB7CiAgICAgICAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogImVtYWlsIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiZW1vamkiKSB7CiAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgpIHsKICAgICAgICAgICAgZW1vamlSZWdleCA9IG5ldyBSZWdFeHAoX2Vtb2ppUmVnZXgsICJ1Iik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogImVtb2ppIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAidXVpZCIpIHsKICAgICAgICAgIGlmICghdXVpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJ1dWlkIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAibmFub2lkIikgewogICAgICAgICAgaWYgKCFuYW5vaWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICB2YWxpZGF0aW9uOiAibmFub2lkIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiY3VpZCIpIHsKICAgICAgICAgIGlmICghY3VpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJjdWlkIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiY3VpZDIiKSB7CiAgICAgICAgICBpZiAoIWN1aWQyUmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogImN1aWQyIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAidWxpZCIpIHsKICAgICAgICAgIGlmICghdWxpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJ1bGlkIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAidXJsIikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbmV3IFVSTChpbnB1dC5kYXRhKTsKICAgICAgICAgIH0gY2F0Y2ggKF9hKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICB2YWxpZGF0aW9uOiAidXJsIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAicmVnZXgiKSB7CiAgICAgICAgICBjaGVjay5yZWdleC5sYXN0SW5kZXggPSAwOwogICAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IGNoZWNrLnJlZ2V4LnRlc3QoaW5wdXQuZGF0YSk7CiAgICAgICAgICBpZiAoIXRlc3RSZXN1bHQpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJyZWdleCIsCiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gInRyaW0iKSB7CiAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50cmltKCk7CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiaW5jbHVkZXMiKSB7CiAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuaW5jbHVkZXMoY2hlY2sudmFsdWUsIGNoZWNrLnBvc2l0aW9uKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgaW5jbHVkZXM6IGNoZWNrLnZhbHVlLCBwb3NpdGlvbjogY2hlY2sucG9zaXRpb24gfSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJ0b0xvd2VyQ2FzZSIpIHsKICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAidG9VcHBlckNhc2UiKSB7CiAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gInN0YXJ0c1dpdGgiKSB7CiAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuc3RhcnRzV2l0aChjaGVjay52YWx1ZSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZywKICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IHN0YXJ0c1dpdGg6IGNoZWNrLnZhbHVlIH0sCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiZW5kc1dpdGgiKSB7CiAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuZW5kc1dpdGgoY2hlY2sudmFsdWUpKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBlbmRzV2l0aDogY2hlY2sudmFsdWUgfSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJkYXRldGltZSIpIHsKICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gZGF0ZXRpbWVSZWdleChjaGVjayk7CiAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZywKICAgICAgICAgICAgICB2YWxpZGF0aW9uOiAiZGF0ZXRpbWUiLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gImRhdGUiKSB7CiAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGVSZWdleDsKICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJkYXRlIiwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJ0aW1lIikgewogICAgICAgICAgY29uc3QgcmVnZXggPSB0aW1lUmVnZXgoY2hlY2spOwogICAgICAgICAgaWYgKCFyZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogInRpbWUiLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gImR1cmF0aW9uIikgewogICAgICAgICAgaWYgKCFkdXJhdGlvblJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJkdXJhdGlvbiIsCiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gImlwIikgewogICAgICAgICAgaWYgKCFpc1ZhbGlkSVAoaW5wdXQuZGF0YSwgY2hlY2sudmVyc2lvbikpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJpcCIsCiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gImJhc2U2NCIpIHsKICAgICAgICAgIGlmICghYmFzZTY0UmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogImJhc2U2NCIsCiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07CiAgICB9CiAgICBfcmVnZXgocmVnZXgsIHZhbGlkYXRpb24sIG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMucmVmaW5lbWVudCgoZGF0YSkgPT4gcmVnZXgudGVzdChkYXRhKSwgewogICAgICAgIHZhbGlkYXRpb24sCiAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIF9hZGRDaGVjayhjaGVjaykgewogICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXQogICAgICB9KTsKICAgIH0KICAgIGVtYWlsKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImVtYWlsIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgdXJsKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogInVybCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTsKICAgIH0KICAgIGVtb2ppKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImVtb2ppIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgdXVpZChtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6ICJ1dWlkIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgbmFub2lkKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogIm5hbm9pZCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTsKICAgIH0KICAgIGN1aWQobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiAiY3VpZCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTsKICAgIH0KICAgIGN1aWQyKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImN1aWQyIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgdWxpZChtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6ICJ1bGlkIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgYmFzZTY0KG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImJhc2U2NCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTsKICAgIH0KICAgIGlwKG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImlwIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pOwogICAgfQogICAgZGF0ZXRpbWUob3B0aW9ucykgewogICAgICB2YXIgX2EsIF9iOwogICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICAgIGtpbmQ6ICJkYXRldGltZSIsCiAgICAgICAgICBwcmVjaXNpb246IG51bGwsCiAgICAgICAgICBvZmZzZXQ6IGZhbHNlLAogICAgICAgICAgbG9jYWw6IGZhbHNlLAogICAgICAgICAgbWVzc2FnZTogb3B0aW9ucwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogImRhdGV0aW1lIiwKICAgICAgICBwcmVjaXNpb246IHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbikgPT09ICJ1bmRlZmluZWQiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sCiAgICAgICAgb2Zmc2V0OiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMub2Zmc2V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSwKICAgICAgICBsb2NhbDogKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvY2FsKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZSwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1lc3NhZ2UpCiAgICAgIH0pOwogICAgfQogICAgZGF0ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6ICJkYXRlIiwgbWVzc2FnZSB9KTsKICAgIH0KICAgIHRpbWUob3B0aW9ucykgewogICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICAgIGtpbmQ6ICJ0aW1lIiwKICAgICAgICAgIHByZWNpc2lvbjogbnVsbCwKICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJ0aW1lIiwKICAgICAgICBwcmVjaXNpb246IHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbikgPT09ICJ1bmRlZmluZWQiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sCiAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIGR1cmF0aW9uKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImR1cmF0aW9uIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgcmVnZXgocmVnZXgsIG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICBraW5kOiAicmVnZXgiLAogICAgICAgIHJlZ2V4LAogICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIGluY2x1ZGVzKHZhbHVlLCBvcHRpb25zKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogImluY2x1ZGVzIiwKICAgICAgICB2YWx1ZSwKICAgICAgICBwb3NpdGlvbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBzdGFydHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogInN0YXJ0c1dpdGgiLAogICAgICAgIHZhbHVlLAogICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIGVuZHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogImVuZHNXaXRoIiwKICAgICAgICB2YWx1ZSwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1pbiIsCiAgICAgICAgdmFsdWU6IG1pbkxlbmd0aCwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IG1heExlbmd0aCwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogImxlbmd0aCIsCiAgICAgICAgdmFsdWU6IGxlbiwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkIFVzZSB6LnN0cmluZygpLm1pbigxKSBpbnN0ZWFkLgogICAgICogQHNlZSB7QGxpbmsgWm9kU3RyaW5nLm1pbn0KICAgICAqLwogICAgbm9uZW1wdHkobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5taW4oMSwgZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpKTsKICAgIH0KICAgIHRyaW0oKSB7CiAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiAidHJpbSIgfV0KICAgICAgfSk7CiAgICB9CiAgICB0b0xvd2VyQ2FzZSgpIHsKICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6ICJ0b0xvd2VyQ2FzZSIgfV0KICAgICAgfSk7CiAgICB9CiAgICB0b1VwcGVyQ2FzZSgpIHsKICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6ICJ0b1VwcGVyQ2FzZSIgfV0KICAgICAgfSk7CiAgICB9CiAgICBnZXQgaXNEYXRldGltZSgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gImRhdGV0aW1lIik7CiAgICB9CiAgICBnZXQgaXNEYXRlKCkgewogICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSAiZGF0ZSIpOwogICAgfQogICAgZ2V0IGlzVGltZSgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gInRpbWUiKTsKICAgIH0KICAgIGdldCBpc0R1cmF0aW9uKCkgewogICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSAiZHVyYXRpb24iKTsKICAgIH0KICAgIGdldCBpc0VtYWlsKCkgewogICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSAiZW1haWwiKTsKICAgIH0KICAgIGdldCBpc1VSTCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gInVybCIpOwogICAgfQogICAgZ2V0IGlzRW1vamkoKSB7CiAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09ICJlbW9qaSIpOwogICAgfQogICAgZ2V0IGlzVVVJRCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gInV1aWQiKTsKICAgIH0KICAgIGdldCBpc05BTk9JRCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gIm5hbm9pZCIpOwogICAgfQogICAgZ2V0IGlzQ1VJRCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gImN1aWQiKTsKICAgIH0KICAgIGdldCBpc0NVSUQyKCkgewogICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSAiY3VpZDIiKTsKICAgIH0KICAgIGdldCBpc1VMSUQoKSB7CiAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09ICJ1bGlkIik7CiAgICB9CiAgICBnZXQgaXNJUCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gImlwIik7CiAgICB9CiAgICBnZXQgaXNCYXNlNjQoKSB7CiAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09ICJiYXNlNjQiKTsKICAgIH0KICAgIGdldCBtaW5MZW5ndGgoKSB7CiAgICAgIGxldCBtaW4gPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2gua2luZCA9PT0gIm1pbiIpIHsKICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pCiAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWluOwogICAgfQogICAgZ2V0IG1heExlbmd0aCgpIHsKICAgICAgbGV0IG1heCA9IG51bGw7CiAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykgewogICAgICAgIGlmIChjaC5raW5kID09PSAibWF4IikgewogICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heCkKICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBtYXg7CiAgICB9CiAgfQogIFpvZFN0cmluZy5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICB2YXIgX2E7CiAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7CiAgICAgIGNoZWNrczogW10sCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nLAogICAgICBjb2VyY2U6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgZnVuY3Rpb24gZmxvYXRTYWZlUmVtYWluZGVyKHZhbCwgc3RlcCkgewogICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoIi4iKVsxXSB8fCAiIikubGVuZ3RoOwogICAgY29uc3Qgc3RlcERlY0NvdW50ID0gKHN0ZXAudG9TdHJpbmcoKS5zcGxpdCgiLiIpWzFdIHx8ICIiKS5sZW5ndGg7CiAgICBjb25zdCBkZWNDb3VudCA9IHZhbERlY0NvdW50ID4gc3RlcERlY0NvdW50ID8gdmFsRGVjQ291bnQgOiBzdGVwRGVjQ291bnQ7CiAgICBjb25zdCB2YWxJbnQgPSBwYXJzZUludCh2YWwudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZSgiLiIsICIiKSk7CiAgICBjb25zdCBzdGVwSW50ID0gcGFyc2VJbnQoc3RlcC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKCIuIiwgIiIpKTsKICAgIHJldHVybiB2YWxJbnQgJSBzdGVwSW50IC8gTWF0aC5wb3coMTAsIGRlY0NvdW50KTsKICB9CiAgY2xhc3MgWm9kTnVtYmVyIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgdGhpcy5taW4gPSB0aGlzLmd0ZTsKICAgICAgdGhpcy5tYXggPSB0aGlzLmx0ZTsKICAgICAgdGhpcy5zdGVwID0gdGhpcy5tdWx0aXBsZU9mOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7CiAgICAgICAgaW5wdXQuZGF0YSA9IE51bWJlcihpbnB1dC5kYXRhKTsKICAgICAgfQogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bWJlcikgewogICAgICAgIGNvbnN0IGN0eDIgPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4MiwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bWJlciwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgyLnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICBsZXQgY3R4ID0gdm9pZCAwOwogICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTsKICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09ICJpbnQiKSB7CiAgICAgICAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKGlucHV0LmRhdGEpKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgICAgIGV4cGVjdGVkOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgcmVjZWl2ZWQ6ICJmbG9hdCIsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAibWluIikgewogICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmUgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWUgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlOwogICAgICAgICAgaWYgKHRvb1NtYWxsKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLAogICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLAogICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLAogICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmUgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWUgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlOwogICAgICAgICAgaWYgKHRvb0JpZykgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsCiAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsCiAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gIm11bHRpcGxlT2YiKSB7CiAgICAgICAgICBpZiAoZmxvYXRTYWZlUmVtYWluZGVyKGlucHV0LmRhdGEsIGNoZWNrLnZhbHVlKSAhPT0gMCkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZiwKICAgICAgICAgICAgICBtdWx0aXBsZU9mOiBjaGVjay52YWx1ZSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJmaW5pdGUiKSB7CiAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9maW5pdGUsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTsKICAgIH0KICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7CiAgICB9CiAgICBndCh2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpOwogICAgfQogICAgbHRlKHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTsKICAgIH0KICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7CiAgICB9CiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbCiAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLAogICAgICAgICAgewogICAgICAgICAgICBraW5kLAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgaW5jbHVzaXZlLAogICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0pOwogICAgfQogICAgX2FkZENoZWNrKGNoZWNrKSB7CiAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdCiAgICAgIH0pOwogICAgfQogICAgaW50KG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICBraW5kOiAiaW50IiwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBwb3NpdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1pbiIsCiAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBuZWdhdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBub25wb3NpdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIG5vbm5lZ2F0aXZlKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICBraW5kOiAibWluIiwKICAgICAgICB2YWx1ZTogMCwKICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpCiAgICAgIH0pOwogICAgfQogICAgbXVsdGlwbGVPZih2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJtdWx0aXBsZU9mIiwKICAgICAgICB2YWx1ZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBmaW5pdGUobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJmaW5pdGUiLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIHNhZmUobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJtaW4iLAogICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICB2YWx1ZTogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsCiAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpCiAgICAgIH0pLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgIHZhbHVlOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBnZXQgbWluVmFsdWUoKSB7CiAgICAgIGxldCBtaW4gPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2gua2luZCA9PT0gIm1pbiIpIHsKICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pCiAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWluOwogICAgfQogICAgZ2V0IG1heFZhbHVlKCkgewogICAgICBsZXQgbWF4ID0gbnVsbDsKICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KQogICAgICAgICAgICBtYXggPSBjaC52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1heDsKICAgIH0KICAgIGdldCBpc0ludCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gImludCIgfHwgY2gua2luZCA9PT0gIm11bHRpcGxlT2YiICYmIHV0aWwuaXNJbnRlZ2VyKGNoLnZhbHVlKSk7CiAgICB9CiAgICBnZXQgaXNGaW5pdGUoKSB7CiAgICAgIGxldCBtYXggPSBudWxsLCBtaW4gPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2gua2luZCA9PT0gImZpbml0ZSIgfHwgY2gua2luZCA9PT0gImludCIgfHwgY2gua2luZCA9PT0gIm11bHRpcGxlT2YiKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKGNoLmtpbmQgPT09ICJtaW4iKSB7CiAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKQogICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKGNoLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KQogICAgICAgICAgICBtYXggPSBjaC52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShtaW4pICYmIE51bWJlci5pc0Zpbml0ZShtYXgpOwogICAgfQogIH0KICBab2ROdW1iZXIuY3JlYXRlID0gKHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoewogICAgICBjaGVja3M6IFtdLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bWJlciwKICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RCaWdJbnQgZXh0ZW5kcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlOwogICAgICB0aGlzLm1heCA9IHRoaXMubHRlOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7CiAgICAgICAgaW5wdXQuZGF0YSA9IEJpZ0ludChpbnB1dC5kYXRhKTsKICAgICAgfQogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJpZ2ludCkgewogICAgICAgIGNvbnN0IGN0eDIgPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4MiwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmJpZ2ludCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgyLnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICBsZXQgY3R4ID0gdm9pZCAwOwogICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTsKICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09ICJtaW4iKSB7CiAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGNoZWNrLmluY2x1c2l2ZSA/IGlucHV0LmRhdGEgPCBjaGVjay52YWx1ZSA6IGlucHV0LmRhdGEgPD0gY2hlY2sudmFsdWU7CiAgICAgICAgICBpZiAodG9vU21hbGwpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsCiAgICAgICAgICAgICAgdHlwZTogImJpZ2ludCIsCiAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAibWF4IikgewogICAgICAgICAgY29uc3QgdG9vQmlnID0gY2hlY2suaW5jbHVzaXZlID8gaW5wdXQuZGF0YSA+IGNoZWNrLnZhbHVlIDogaW5wdXQuZGF0YSA+PSBjaGVjay52YWx1ZTsKICAgICAgICAgIGlmICh0b29CaWcpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLAogICAgICAgICAgICAgIHR5cGU6ICJiaWdpbnQiLAogICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLAogICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gIm11bHRpcGxlT2YiKSB7CiAgICAgICAgICBpZiAoaW5wdXQuZGF0YSAlIGNoZWNrLnZhbHVlICE9PSBCaWdJbnQoMCkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2YsCiAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTsKICAgIH0KICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7CiAgICB9CiAgICBndCh2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpOwogICAgfQogICAgbHRlKHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTsKICAgIH0KICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7CiAgICB9CiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbCiAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLAogICAgICAgICAgewogICAgICAgICAgICBraW5kLAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgaW5jbHVzaXZlLAogICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0pOwogICAgfQogICAgX2FkZENoZWNrKGNoZWNrKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdCiAgICAgIH0pOwogICAgfQogICAgcG9zaXRpdmUobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJtaW4iLAogICAgICAgIHZhbHVlOiBCaWdJbnQoMCksCiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBuZWdhdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSwKICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICBraW5kOiAibWF4IiwKICAgICAgICB2YWx1ZTogQmlnSW50KDApLAogICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1pbiIsCiAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSwKICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpCiAgICAgIH0pOwogICAgfQogICAgbXVsdGlwbGVPZih2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJtdWx0aXBsZU9mIiwKICAgICAgICB2YWx1ZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBnZXQgbWluVmFsdWUoKSB7CiAgICAgIGxldCBtaW4gPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2gua2luZCA9PT0gIm1pbiIpIHsKICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pCiAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWluOwogICAgfQogICAgZ2V0IG1heFZhbHVlKCkgewogICAgICBsZXQgbWF4ID0gbnVsbDsKICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KQogICAgICAgICAgICBtYXggPSBjaC52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1heDsKICAgIH0KICB9CiAgWm9kQmlnSW50LmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHZhciBfYTsKICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHsKICAgICAgY2hlY2tzOiBbXSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCaWdJbnQsCiAgICAgIGNvZXJjZTogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RCb29sZWFuIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHsKICAgICAgICBpbnB1dC5kYXRhID0gQm9vbGVhbihpbnB1dC5kYXRhKTsKICAgICAgfQogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJvb2xlYW4pIHsKICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYm9vbGVhbiwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTsKICAgIH0KICB9CiAgWm9kQm9vbGVhbi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZEJvb2xlYW4oewogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJvb2xlYW4sCiAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kRGF0ZSBleHRlbmRzIFpvZFR5cGUgewogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7CiAgICAgICAgaW5wdXQuZGF0YSA9IG5ldyBEYXRlKGlucHV0LmRhdGEpOwogICAgICB9CiAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTsKICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZGF0ZSkgewogICAgICAgIGNvbnN0IGN0eDIgPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4MiwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmRhdGUsCiAgICAgICAgICByZWNlaXZlZDogY3R4Mi5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKGlucHV0LmRhdGEuZ2V0VGltZSgpKSkgewogICAgICAgIGNvbnN0IGN0eDIgPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4MiwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpOwogICAgICBsZXQgY3R4ID0gdm9pZCAwOwogICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gIm1pbiIpIHsKICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA8IGNoZWNrLnZhbHVlKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSwKICAgICAgICAgICAgICB0eXBlOiAiZGF0ZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gIm1heCIpIHsKICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA+IGNoZWNrLnZhbHVlKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZywKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLAogICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICAgICAgICBleGFjdDogZmFsc2UsCiAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgdHlwZTogImRhdGUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgc3RhdHVzOiBzdGF0dXMudmFsdWUsCiAgICAgICAgdmFsdWU6IG5ldyBEYXRlKGlucHV0LmRhdGEuZ2V0VGltZSgpKQogICAgICB9OwogICAgfQogICAgX2FkZENoZWNrKGNoZWNrKSB7CiAgICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXQogICAgICB9KTsKICAgIH0KICAgIG1pbihtaW5EYXRlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1pbiIsCiAgICAgICAgdmFsdWU6IG1pbkRhdGUuZ2V0VGltZSgpLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIG1heChtYXhEYXRlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IG1heERhdGUuZ2V0VGltZSgpLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIGdldCBtaW5EYXRlKCkgewogICAgICBsZXQgbWluID0gbnVsbDsKICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoLmtpbmQgPT09ICJtaW4iKSB7CiAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKQogICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1pbiAhPSBudWxsID8gbmV3IERhdGUobWluKSA6IG51bGw7CiAgICB9CiAgICBnZXQgbWF4RGF0ZSgpIHsKICAgICAgbGV0IG1heCA9IG51bGw7CiAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykgewogICAgICAgIGlmIChjaC5raW5kID09PSAibWF4IikgewogICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heCkKICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBtYXggIT0gbnVsbCA/IG5ldyBEYXRlKG1heCkgOiBudWxsOwogICAgfQogIH0KICBab2REYXRlLmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7CiAgICAgIGNoZWNrczogW10sCiAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERhdGUsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RTeW1ib2wgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN5bWJvbCkgewogICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsCiAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zeW1ib2wsCiAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7CiAgICB9CiAgfQogIFpvZFN5bWJvbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZFN5bWJvbCh7CiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3ltYm9sLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kVW5kZWZpbmVkIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpOwogICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHsKICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkLAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpOwogICAgfQogIH0KICBab2RVbmRlZmluZWQuY3JlYXRlID0gKHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RVbmRlZmluZWQoewogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuZGVmaW5lZCwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZE51bGwgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bGwpIHsKICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVsbCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTsKICAgIH0KICB9CiAgWm9kTnVsbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE51bGwoewogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGwsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RBbnkgZXh0ZW5kcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICB0aGlzLl9hbnkgPSB0cnVlOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTsKICAgIH0KICB9CiAgWm9kQW55LmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kQW55KHsKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBbnksCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RVbmtub3duIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgdGhpcy5fdW5rbm93biA9IHRydWU7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpOwogICAgfQogIH0KICBab2RVbmtub3duLmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kVW5rbm93bih7CiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5rbm93biwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZE5ldmVyIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpOwogICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5ldmVyLAogICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICB9KTsKICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICB9CiAgfQogIFpvZE5ldmVyLmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kTmV2ZXIoewogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5ldmVyLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kVm9pZCBleHRlbmRzIFpvZFR5cGUgewogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTsKICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpOwogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnZvaWQsCiAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7CiAgICB9CiAgfQogIFpvZFZvaWQuY3JlYXRlID0gKHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RWb2lkKHsKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RWb2lkLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kQXJyYXkgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IGN0eCwgc3RhdHVzIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBjb25zdCBkZWYgPSB0aGlzLl9kZWY7CiAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5hcnJheSkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmFycmF5LAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgaWYgKGRlZi5leGFjdExlbmd0aCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IHRvb0JpZyA9IGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5leGFjdExlbmd0aC52YWx1ZTsKICAgICAgICBjb25zdCB0b29TbWFsbCA9IGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5leGFjdExlbmd0aC52YWx1ZTsKICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7CiAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgY29kZTogdG9vQmlnID8gWm9kSXNzdWVDb2RlLnRvb19iaWcgOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLAogICAgICAgICAgICBtaW5pbXVtOiB0b29TbWFsbCA/IGRlZi5leGFjdExlbmd0aC52YWx1ZSA6IHZvaWQgMCwKICAgICAgICAgICAgbWF4aW11bTogdG9vQmlnID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdm9pZCAwLAogICAgICAgICAgICB0eXBlOiAiYXJyYXkiLAogICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgICAgIGV4YWN0OiB0cnVlLAogICAgICAgICAgICBtZXNzYWdlOiBkZWYuZXhhY3RMZW5ndGgubWVzc2FnZQogICAgICAgICAgfSk7CiAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlZi5taW5MZW5ndGggIT09IG51bGwpIHsKICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoIDwgZGVmLm1pbkxlbmd0aC52YWx1ZSkgewogICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsCiAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5MZW5ndGgudmFsdWUsCiAgICAgICAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLAogICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluTGVuZ3RoLm1lc3NhZ2UKICAgICAgICAgIH0pOwogICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkZWYubWF4TGVuZ3RoICE9PSBudWxsKSB7CiAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5tYXhMZW5ndGgudmFsdWUpIHsKICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZywKICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heExlbmd0aC52YWx1ZSwKICAgICAgICAgICAgdHlwZTogImFycmF5IiwKICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICBleGFjdDogZmFsc2UsCiAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tYXhMZW5ndGgubWVzc2FnZQogICAgICAgICAgfSk7CiAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkyKSA9PiB7CiAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlQXN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpMikpOwogICAgICAgIH0pKS50aGVuKChyZXN1bHQyKSA9PiB7CiAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdDIpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5jdHguZGF0YV0ubWFwKChpdGVtLCBpMikgPT4gewogICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VTeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaTIpKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0KTsKICAgIH0KICAgIGdldCBlbGVtZW50KCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7CiAgICB9CiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IG1pbkxlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0KICAgICAgfSk7CiAgICB9CiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBtYXhMZW5ndGg6IHsgdmFsdWU6IG1heExlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0KICAgICAgfSk7CiAgICB9CiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBleGFjdExlbmd0aDogeyB2YWx1ZTogbGVuLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfQogICAgICB9KTsKICAgIH0KICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpOwogICAgfQogIH0KICBab2RBcnJheS5jcmVhdGUgPSAoc2NoZW1hLCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kQXJyYXkoewogICAgICB0eXBlOiBzY2hlbWEsCiAgICAgIG1pbkxlbmd0aDogbnVsbCwKICAgICAgbWF4TGVuZ3RoOiBudWxsLAogICAgICBleGFjdExlbmd0aDogbnVsbCwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheSwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGZ1bmN0aW9uIGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYSkgewogICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9iamVjdCkgewogICAgICBjb25zdCBuZXdTaGFwZSA9IHt9OwogICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuc2hhcGUpIHsKICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYS5zaGFwZVtrZXldOwogICAgICAgIG5ld1NoYXBlW2tleV0gPSBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoZmllbGRTY2hlbWEpKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgICAgLi4uc2NoZW1hLl9kZWYsCiAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RBcnJheSkgewogICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHsKICAgICAgICAuLi5zY2hlbWEuX2RlZiwKICAgICAgICB0eXBlOiBkZWVwUGFydGlhbGlmeShzY2hlbWEuZWxlbWVudCkKICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7CiAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7CiAgICB9IGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7CiAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7CiAgICB9IGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZFR1cGxlKSB7CiAgICAgIHJldHVybiBab2RUdXBsZS5jcmVhdGUoc2NoZW1hLml0ZW1zLm1hcCgoaXRlbSkgPT4gZGVlcFBhcnRpYWxpZnkoaXRlbSkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBzY2hlbWE7CiAgICB9CiAgfQogIGNsYXNzIFpvZE9iamVjdCBleHRlbmRzIFpvZFR5cGUgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIHRoaXMuX2NhY2hlZCA9IG51bGw7CiAgICAgIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaDsKICAgICAgdGhpcy5hdWdtZW50ID0gdGhpcy5leHRlbmQ7CiAgICB9CiAgICBfZ2V0Q2FjaGVkKCkgewogICAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKQogICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWQ7CiAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5fZGVmLnNoYXBlKCk7CiAgICAgIGNvbnN0IGtleXMgPSB1dGlsLm9iamVjdEtleXMoc2hhcGUpOwogICAgICByZXR1cm4gdGhpcy5fY2FjaGVkID0geyBzaGFwZSwga2V5cyB9OwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTsKICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7CiAgICAgICAgY29uc3QgY3R4MiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgyLCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUub2JqZWN0LAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eDIucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7CiAgICAgIGNvbnN0IHsgc2hhcGUsIGtleXM6IHNoYXBlS2V5cyB9ID0gdGhpcy5fZ2V0Q2FjaGVkKCk7CiAgICAgIGNvbnN0IGV4dHJhS2V5cyA9IFtdOwogICAgICBpZiAoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlciAmJiB0aGlzLl9kZWYudW5rbm93bktleXMgPT09ICJzdHJpcCIpKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHsKICAgICAgICAgIGlmICghc2hhcGVLZXlzLmluY2x1ZGVzKGtleSkpIHsKICAgICAgICAgICAgZXh0cmFLZXlzLnB1c2goa2V5KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgcGFpcnMgPSBbXTsKICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcGVLZXlzKSB7CiAgICAgICAgY29uc3Qga2V5VmFsaWRhdG9yID0gc2hhcGVba2V5XTsKICAgICAgICBjb25zdCB2YWx1ZSA9IGN0eC5kYXRhW2tleV07CiAgICAgICAgcGFpcnMucHVzaCh7CiAgICAgICAgICBrZXk6IHsgc3RhdHVzOiAidmFsaWQiLCB2YWx1ZToga2V5IH0sCiAgICAgICAgICB2YWx1ZToga2V5VmFsaWRhdG9yLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBrZXkpKSwKICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIFpvZE5ldmVyKSB7CiAgICAgICAgY29uc3QgdW5rbm93bktleXMgPSB0aGlzLl9kZWYudW5rbm93bktleXM7CiAgICAgICAgaWYgKHVua25vd25LZXlzID09PSAicGFzc3Rocm91Z2giKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHsKICAgICAgICAgICAgcGFpcnMucHVzaCh7CiAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogInZhbGlkIiwgdmFsdWU6IGtleSB9LAogICAgICAgICAgICAgIHZhbHVlOiB7IHN0YXR1czogInZhbGlkIiwgdmFsdWU6IGN0eC5kYXRhW2tleV0gfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHVua25vd25LZXlzID09PSAic3RyaWN0IikgewogICAgICAgICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5cywKICAgICAgICAgICAgICBrZXlzOiBleHRyYUtleXMKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodW5rbm93bktleXMgPT09ICJzdHJpcCIpIDsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgWm9kT2JqZWN0IGVycm9yOiBpbnZhbGlkIHVua25vd25LZXlzIHZhbHVlLmApOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBjYXRjaGFsbCA9IHRoaXMuX2RlZi5jYXRjaGFsbDsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTsKICAgICAgICAgIHBhaXJzLnB1c2goewogICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiAidmFsaWQiLCB2YWx1ZToga2V5IH0sCiAgICAgICAgICAgIHZhbHVlOiBjYXRjaGFsbC5fcGFyc2UoCiAgICAgICAgICAgICAgbmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KQogICAgICAgICAgICAgIC8vLCBjdHguY2hpbGQoa2V5KSwgdmFsdWUsIGdldFBhcnNlZFR5cGUodmFsdWUpCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCBzeW5jUGFpcnMgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykgewogICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTsKICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwYWlyLnZhbHVlOwogICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7CiAgICAgICAgICAgICAga2V5LAogICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgIGFsd2F5c1NldDogcGFpci5hbHdheXNTZXQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3luY1BhaXJzOwogICAgICAgIH0pLnRoZW4oKHN5bmNQYWlycykgPT4gewogICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTsKICAgICAgfQogICAgfQogICAgZ2V0IHNoYXBlKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCk7CiAgICB9CiAgICBzdHJpY3QobWVzc2FnZSkgewogICAgICBlcnJvclV0aWwuZXJyVG9PYmo7CiAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgdW5rbm93bktleXM6ICJzdHJpY3QiLAogICAgICAgIC4uLm1lc3NhZ2UgIT09IHZvaWQgMCA/IHsKICAgICAgICAgIGVycm9yTWFwOiAoaXNzdWUsIGN0eCkgPT4gewogICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRFcnJvciA9IChfYyA9IChfYiA9IChfYSA9IHRoaXMuX2RlZikuZXJyb3JNYXApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBpc3N1ZSwgY3R4KS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdHguZGVmYXVsdEVycm9yOwogICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gInVucmVjb2duaXplZF9rZXlzIikKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWVzc2FnZTogKF9kID0gZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLm1lc3NhZ2UpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGRlZmF1bHRFcnJvcgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgbWVzc2FnZTogZGVmYXVsdEVycm9yCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfSA6IHt9CiAgICAgIH0pOwogICAgfQogICAgc3RyaXAoKSB7CiAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgdW5rbm93bktleXM6ICJzdHJpcCIKICAgICAgfSk7CiAgICB9CiAgICBwYXNzdGhyb3VnaCgpIHsKICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3QoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICB1bmtub3duS2V5czogInBhc3N0aHJvdWdoIgogICAgICB9KTsKICAgIH0KICAgIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID0KICAgIC8vICAgPERlZiBleHRlbmRzIFpvZE9iamVjdERlZj4oZGVmOiBEZWYpID0+CiAgICAvLyAgIDxBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZT4oCiAgICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb24KICAgIC8vICAgKTogWm9kT2JqZWN0PAogICAgLy8gICAgIGV4dGVuZFNoYXBlPFJldHVyblR5cGU8RGVmWyJzaGFwZSJdPiwgQXVnbWVudGF0aW9uPiwKICAgIC8vICAgICBEZWZbInVua25vd25LZXlzIl0sCiAgICAvLyAgICAgRGVmWyJjYXRjaGFsbCJdCiAgICAvLyAgID4gPT4gewogICAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgIC8vICAgICAgIC4uLmRlZiwKICAgIC8vICAgICAgIHNoYXBlOiAoKSA9PiAoewogICAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSwKICAgIC8vICAgICAgICAgLi4uYXVnbWVudGF0aW9uLAogICAgLy8gICAgICAgfSksCiAgICAvLyAgICAgfSkgYXMgYW55OwogICAgLy8gICB9OwogICAgZXh0ZW5kKGF1Z21lbnRhdGlvbikgewogICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIHNoYXBlOiAoKSA9PiAoewogICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksCiAgICAgICAgICAuLi5hdWdtZW50YXRpb24KICAgICAgICB9KQogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogUHJpb3IgdG8gem9kQDEuMC4xMiB0aGVyZSB3YXMgYSBidWcgaW4gdGhlCiAgICAgKiBpbmZlcnJlZCB0eXBlIG9mIG1lcmdlZCBvYmplY3RzLiBQbGVhc2UKICAgICAqIHVwZ3JhZGUgaWYgeW91IGFyZSBleHBlcmllbmNpbmcgaXNzdWVzLgogICAgICovCiAgICBtZXJnZShtZXJnaW5nKSB7CiAgICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBab2RPYmplY3QoewogICAgICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsCiAgICAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCwKICAgICAgICBzaGFwZTogKCkgPT4gKHsKICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLAogICAgICAgICAgLi4ubWVyZ2luZy5fZGVmLnNoYXBlKCkKICAgICAgICB9KSwKICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdAogICAgICB9KTsKICAgICAgcmV0dXJuIG1lcmdlZDsKICAgIH0KICAgIC8vIG1lcmdlPAogICAgLy8gICBJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdCwKICAgIC8vICAgQXVnbWVudGF0aW9uIGV4dGVuZHMgSW5jb21pbmdbInNoYXBlIl0sCiAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHsKICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uCiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVsiX291dHB1dCJdCiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXQKICAgIC8vICAgICAgID8gT3V0cHV0W2tdCiAgICAvLyAgICAgICA6IG5ldmVyOwogICAgLy8gICB9LAogICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHsKICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb24KICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdWyJfaW5wdXQiXQogICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXQKICAgIC8vICAgICAgID8gSW5wdXRba10KICAgIC8vICAgICAgIDogbmV2ZXI7CiAgICAvLyAgIH0KICAgIC8vID4oCiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nCiAgICAvLyApOiBab2RPYmplY3Q8CiAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIFJldHVyblR5cGU8SW5jb21pbmdbIl9kZWYiXVsic2hhcGUiXT4+LAogICAgLy8gICBJbmNvbWluZ1siX2RlZiJdWyJ1bmtub3duS2V5cyJdLAogICAgLy8gICBJbmNvbWluZ1siX2RlZiJdWyJjYXRjaGFsbCJdLAogICAgLy8gICBOZXdPdXRwdXQsCiAgICAvLyAgIE5ld0lucHV0CiAgICAvLyA+IHsKICAgIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHsKICAgIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLAogICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsCiAgICAvLyAgICAgc2hhcGU6ICgpID0+CiAgICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksCiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsCiAgICAvLyAgIH0pIGFzIGFueTsKICAgIC8vICAgcmV0dXJuIG1lcmdlZDsKICAgIC8vIH0KICAgIHNldEtleShrZXksIHNjaGVtYSkgewogICAgICByZXR1cm4gdGhpcy5hdWdtZW50KHsgW2tleV06IHNjaGVtYSB9KTsKICAgIH0KICAgIC8vIG1lcmdlPEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0PigKICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmcKICAgIC8vICk6IC8vWm9kT2JqZWN0PFQgJiBJbmNvbWluZ1siX3NoYXBlIl0sIFVua25vd25LZXlzLCBDYXRjaGFsbD4gPSAobWVyZ2luZykgPT4gewogICAgLy8gWm9kT2JqZWN0PAogICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nWyJfZGVmIl1bInNoYXBlIl0+PiwKICAgIC8vICAgSW5jb21pbmdbIl9kZWYiXVsidW5rbm93bktleXMiXSwKICAgIC8vICAgSW5jb21pbmdbIl9kZWYiXVsiY2F0Y2hhbGwiXQogICAgLy8gPiB7CiAgICAvLyAgIC8vIGNvbnN0IG1lcmdlZFNoYXBlID0gb2JqZWN0VXRpbC5tZXJnZVNoYXBlcygKICAgIC8vICAgLy8gICB0aGlzLl9kZWYuc2hhcGUoKSwKICAgIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKQogICAgLy8gICAvLyApOwogICAgLy8gICBjb25zdCBtZXJnZWQ6IGFueSA9IG5ldyBab2RPYmplY3QoewogICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsCiAgICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCwKICAgIC8vICAgICBzaGFwZTogKCkgPT4KICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSwKICAgIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCwKICAgIC8vICAgfSkgYXMgYW55OwogICAgLy8gICByZXR1cm4gbWVyZ2VkOwogICAgLy8gfQogICAgY2F0Y2hhbGwoaW5kZXgpIHsKICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3QoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBjYXRjaGFsbDogaW5kZXgKICAgICAgfSk7CiAgICB9CiAgICBwaWNrKG1hc2spIHsKICAgICAgY29uc3Qgc2hhcGUgPSB7fTsKICAgICAgdXRpbC5vYmplY3RLZXlzKG1hc2spLmZvckVhY2goKGtleSkgPT4gewogICAgICAgIGlmIChtYXNrW2tleV0gJiYgdGhpcy5zaGFwZVtrZXldKSB7CiAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlCiAgICAgIH0pOwogICAgfQogICAgb21pdChtYXNrKSB7CiAgICAgIGNvbnN0IHNoYXBlID0ge307CiAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHsKICAgICAgICBpZiAoIW1hc2tba2V5XSkgewogICAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZQogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgZGVlcFBhcnRpYWwoKSB7CiAgICAgIHJldHVybiBkZWVwUGFydGlhbGlmeSh0aGlzKTsKICAgIH0KICAgIHBhcnRpYWwobWFzaykgewogICAgICBjb25zdCBuZXdTaGFwZSA9IHt9OwogICAgICB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaCgoa2V5KSA9PiB7CiAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07CiAgICAgICAgaWYgKG1hc2sgJiYgIW1hc2tba2V5XSkgewogICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdTaGFwZVtrZXldID0gZmllbGRTY2hlbWEub3B0aW9uYWwoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZQogICAgICB9KTsKICAgIH0KICAgIHJlcXVpcmVkKG1hc2spIHsKICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTsKICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4gewogICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHsKICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldOwogICAgICAgICAgbGV0IG5ld0ZpZWxkID0gZmllbGRTY2hlbWE7CiAgICAgICAgICB3aGlsZSAobmV3RmllbGQgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkgewogICAgICAgICAgICBuZXdGaWVsZCA9IG5ld0ZpZWxkLl9kZWYuaW5uZXJUeXBlOwogICAgICAgICAgfQogICAgICAgICAgbmV3U2hhcGVba2V5XSA9IG5ld0ZpZWxkOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlCiAgICAgIH0pOwogICAgfQogICAga2V5b2YoKSB7CiAgICAgIHJldHVybiBjcmVhdGVab2RFbnVtKHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSk7CiAgICB9CiAgfQogIFpvZE9iamVjdC5jcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RPYmplY3QoewogICAgICBzaGFwZTogKCkgPT4gc2hhcGUsCiAgICAgIHVua25vd25LZXlzOiAic3RyaXAiLAogICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgWm9kT2JqZWN0LnN0cmljdENyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSwKICAgICAgdW5rbm93bktleXM6ICJzdHJpY3QiLAogICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgWm9kT2JqZWN0LmxhenljcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RPYmplY3QoewogICAgICBzaGFwZSwKICAgICAgdW5rbm93bktleXM6ICJzdHJpcCIsCiAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RVbmlvbiBleHRlbmRzIFpvZFR5cGUgewogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZGVmLm9wdGlvbnM7CiAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdHMocmVzdWx0cykgewogICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHsKICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0LnN0YXR1cyA9PT0gInZhbGlkIikgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykgewogICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSAiZGlydHkiKSB7CiAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4ucmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gbmV3IFpvZEVycm9yKHJlc3VsdC5jdHguY29tbW9uLmlzc3VlcykpOwogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sCiAgICAgICAgICB1bmlvbkVycm9ycwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IHsKICAgICAgICAgIGNvbnN0IGNoaWxkQ3R4ID0gewogICAgICAgICAgICAuLi5jdHgsCiAgICAgICAgICAgIGNvbW1vbjogewogICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sCiAgICAgICAgICAgICAgaXNzdWVzOiBbXQogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXJlbnQ6IG51bGwKICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG9wdGlvbi5fcGFyc2VBc3luYyh7CiAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eAogICAgICAgICAgICB9KSwKICAgICAgICAgICAgY3R4OiBjaGlsZEN0eAogICAgICAgICAgfTsKICAgICAgICB9KSkudGhlbihoYW5kbGVSZXN1bHRzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgZGlydHkgPSB2b2lkIDA7CiAgICAgICAgY29uc3QgaXNzdWVzID0gW107CiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykgewogICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7CiAgICAgICAgICAgIC4uLmN0eCwKICAgICAgICAgICAgY29tbW9uOiB7CiAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbiwKICAgICAgICAgICAgICBpc3N1ZXM6IFtdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhcmVudDogbnVsbAogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbi5fcGFyc2VTeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGNoaWxkQ3R4CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAidmFsaWQiKSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICJkaXJ0eSIgJiYgIWRpcnR5KSB7CiAgICAgICAgICAgIGRpcnR5ID0geyByZXN1bHQsIGN0eDogY2hpbGRDdHggfTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaGlsZEN0eC5jb21tb24uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgICBpc3N1ZXMucHVzaChjaGlsZEN0eC5jb21tb24uaXNzdWVzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRpcnR5KSB7CiAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLmRpcnR5LmN0eC5jb21tb24uaXNzdWVzKTsKICAgICAgICAgIHJldHVybiBkaXJ0eS5yZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gaXNzdWVzLm1hcCgoaXNzdWVzMikgPT4gbmV3IFpvZEVycm9yKGlzc3VlczIpKTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLAogICAgICAgICAgdW5pb25FcnJvcnMKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgfQogICAgZ2V0IG9wdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uczsKICAgIH0KICB9CiAgWm9kVW5pb24uY3JlYXRlID0gKHR5cGVzLCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kVW5pb24oewogICAgICBvcHRpb25zOiB0eXBlcywKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmlvbiwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNvbnN0IGdldERpc2NyaW1pbmF0b3IgPSAodHlwZSkgPT4gewogICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMYXp5KSB7CiAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2NoZW1hKTsKICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVmZmVjdHMpIHsKICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5pbm5lclR5cGUoKSk7CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMaXRlcmFsKSB7CiAgICAgIHJldHVybiBbdHlwZS52YWx1ZV07CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFbnVtKSB7CiAgICAgIHJldHVybiB0eXBlLm9wdGlvbnM7CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROYXRpdmVFbnVtKSB7CiAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyh0eXBlLmVudW0pOwogICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRGVmYXVsdCkgewogICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTsKICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFVuZGVmaW5lZCkgewogICAgICByZXR1cm4gW3ZvaWQgMF07CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsKSB7CiAgICAgIHJldHVybiBbbnVsbF07CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkgewogICAgICByZXR1cm4gW3ZvaWQgMCwgLi4uZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKV07CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsYWJsZSkgewogICAgICByZXR1cm4gW251bGwsIC4uLmdldERpc2NyaW1pbmF0b3IodHlwZS51bndyYXAoKSldOwogICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kQnJhbmRlZCkgewogICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKTsKICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFJlYWRvbmx5KSB7CiAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpOwogICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kQ2F0Y2gpIHsKICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5fZGVmLmlubmVyVHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gW107CiAgICB9CiAgfTsKICBjbGFzcyBab2REaXNjcmltaW5hdGVkVW5pb24gZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSB0aGlzLmRpc2NyaW1pbmF0b3I7CiAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZSA9IGN0eC5kYXRhW2Rpc2NyaW1pbmF0b3JdOwogICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnNNYXAuZ2V0KGRpc2NyaW1pbmF0b3JWYWx1ZSk7CiAgICAgIGlmICghb3B0aW9uKSB7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLAogICAgICAgICAgb3B0aW9uczogQXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNNYXAua2V5cygpKSwKICAgICAgICAgIHBhdGg6IFtkaXNjcmltaW5hdG9yXQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbi5fcGFyc2VBc3luYyh7CiAgICAgICAgICBkYXRhOiBjdHguZGF0YSwKICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgcGFyZW50OiBjdHgKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZVN5bmMoewogICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgIHBhcmVudDogY3R4CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGdldCBkaXNjcmltaW5hdG9yKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmRpc2NyaW1pbmF0b3I7CiAgICB9CiAgICBnZXQgb3B0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zOwogICAgfQogICAgZ2V0IG9wdGlvbnNNYXAoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcDsKICAgIH0KICAgIC8qKgogICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uIHNjaGVtYS4gSXRzIGJlaGF2aW91ciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgbm9ybWFsIHoudW5pb24oKSBjb25zdHJ1Y3Rvci4KICAgICAqIEhvd2V2ZXIsIGl0IG9ubHkgYWxsb3dzIGEgdW5pb24gb2Ygb2JqZWN0cywgYWxsIG9mIHdoaWNoIG5lZWQgdG8gc2hhcmUgYSBkaXNjcmltaW5hdG9yIHByb3BlcnR5LiBUaGlzIHByb3BlcnR5IG11c3QKICAgICAqIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZm9yIGVhY2ggb2JqZWN0IGluIHRoZSB1bmlvbi4KICAgICAqIEBwYXJhbSBkaXNjcmltaW5hdG9yIHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5CiAgICAgKiBAcGFyYW0gdHlwZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHNjaGVtYXMKICAgICAqIEBwYXJhbSBwYXJhbXMKICAgICAqLwogICAgc3RhdGljIGNyZWF0ZShkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHsKICAgICAgY29uc3Qgb3B0aW9uc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvclZhbHVlcyA9IGdldERpc2NyaW1pbmF0b3IodHlwZS5zaGFwZVtkaXNjcmltaW5hdG9yXSk7CiAgICAgICAgaWYgKCFkaXNjcmltaW5hdG9yVmFsdWVzLmxlbmd0aCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIGRpc2NyaW1pbmF0b3IgdmFsdWUgZm9yIGtleSBcYCR7ZGlzY3JpbWluYXRvcn1cYCBjb3VsZCBub3QgYmUgZXh0cmFjdGVkIGZyb20gYWxsIHNjaGVtYSBvcHRpb25zYCk7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZGlzY3JpbWluYXRvclZhbHVlcykgewogICAgICAgICAgaWYgKG9wdGlvbnNNYXAuaGFzKHZhbHVlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZGlzY3JpbWluYXRvcil9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcodmFsdWUpfWApOwogICAgICAgICAgfQogICAgICAgICAgb3B0aW9uc01hcC5zZXQodmFsdWUsIHR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7CiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REaXNjcmltaW5hdGVkVW5pb24sCiAgICAgICAgZGlzY3JpbWluYXRvciwKICAgICAgICBvcHRpb25zLAogICAgICAgIG9wdGlvbnNNYXAsCiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICAgIH0pOwogICAgfQogIH0KICBmdW5jdGlvbiBtZXJnZVZhbHVlcyhhMiwgYikgewogICAgY29uc3QgYVR5cGUgPSBnZXRQYXJzZWRUeXBlKGEyKTsKICAgIGNvbnN0IGJUeXBlID0gZ2V0UGFyc2VkVHlwZShiKTsKICAgIGlmIChhMiA9PT0gYikgewogICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYTIgfTsKICAgIH0gZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUub2JqZWN0ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLm9iamVjdCkgewogICAgICBjb25zdCBiS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhiKTsKICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhhMikuZmlsdGVyKChrZXkpID0+IGJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpOwogICAgICBjb25zdCBuZXdPYmogPSB7IC4uLmEyLCAuLi5iIH07CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXJlZEtleXMpIHsKICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGEyW2tleV0sIGJba2V5XSk7CiAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkgewogICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07CiAgICAgICAgfQogICAgICAgIG5ld09ialtrZXldID0gc2hhcmVkVmFsdWUuZGF0YTsKICAgICAgfQogICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3T2JqIH07CiAgICB9IGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLmFycmF5ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7CiAgICAgIGlmIChhMi5sZW5ndGggIT09IGIubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07CiAgICAgIH0KICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTsKICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEyLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIGNvbnN0IGl0ZW1BID0gYTJbaW5kZXhdOwogICAgICAgIGNvbnN0IGl0ZW1CID0gYltpbmRleF07CiAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpOwogICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHsKICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9OwogICAgICAgIH0KICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpOwogICAgICB9CiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBuZXdBcnJheSB9OwogICAgfSBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLmRhdGUgJiYgK2EyID09PSArYikgewogICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYTIgfTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9OwogICAgfQogIH0KICBjbGFzcyBab2RJbnRlcnNlY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBjb25zdCBoYW5kbGVQYXJzZWQgPSAocGFyc2VkTGVmdCwgcGFyc2VkUmlnaHQpID0+IHsKICAgICAgICBpZiAoaXNBYm9ydGVkKHBhcnNlZExlZnQpIHx8IGlzQWJvcnRlZChwYXJzZWRSaWdodCkpIHsKICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVZhbHVlcyhwYXJzZWRMZWZ0LnZhbHVlLCBwYXJzZWRSaWdodC52YWx1ZSk7CiAgICAgICAgaWYgKCFtZXJnZWQudmFsaWQpIHsKICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXMKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgfQogICAgICAgIGlmIChpc0RpcnR5KHBhcnNlZExlZnQpIHx8IGlzRGlydHkocGFyc2VkUmlnaHQpKSB7CiAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBtZXJnZWQuZGF0YSB9OwogICAgICB9OwogICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykgewogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbCiAgICAgICAgICB0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7CiAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLAogICAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgICAgcGFyZW50OiBjdHgKICAgICAgICAgIH0pLAogICAgICAgICAgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZUFzeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgfSkKICAgICAgICBdKS50aGVuKChbbGVmdCwgcmlnaHRdKSA9PiBoYW5kbGVQYXJzZWQobGVmdCwgcmlnaHQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gaGFuZGxlUGFyc2VkKHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZVN5bmMoewogICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgIHBhcmVudDogY3R4CiAgICAgICAgfSksIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHsKICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLAogICAgICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgIH0pKTsKICAgICAgfQogICAgfQogIH0KICBab2RJbnRlcnNlY3Rpb24uY3JlYXRlID0gKGxlZnQsIHJpZ2h0LCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHsKICAgICAgbGVmdCwKICAgICAgcmlnaHQsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kSW50ZXJzZWN0aW9uLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kVHVwbGUgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsCiAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5hcnJheSwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLAogICAgICAgICAgbWluaW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCwKICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgIHR5cGU6ICJhcnJheSIKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICBjb25zdCByZXN0ID0gdGhpcy5fZGVmLnJlc3Q7CiAgICAgIGlmICghcmVzdCAmJiBjdHguZGF0YS5sZW5ndGggPiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZywKICAgICAgICAgIG1heGltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsCiAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgICBleGFjdDogZmFsc2UsCiAgICAgICAgICB0eXBlOiAiYXJyYXkiCiAgICAgICAgfSk7CiAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgIH0KICAgICAgY29uc3QgaXRlbXMgPSBbLi4uY3R4LmRhdGFdLm1hcCgoaXRlbSwgaXRlbUluZGV4KSA9PiB7CiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5fZGVmLml0ZW1zW2l0ZW1JbmRleF0gfHwgdGhpcy5fZGVmLnJlc3Q7CiAgICAgICAgaWYgKCFzY2hlbWEpCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gc2NoZW1hLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGl0ZW1JbmRleCkpOwogICAgICB9KS5maWx0ZXIoKHgpID0+ICEheCk7CiAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zKS50aGVuKChyZXN1bHRzKSA9PiB7CiAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgaXRlbXMpOwogICAgICB9CiAgICB9CiAgICBnZXQgaXRlbXMoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYuaXRlbXM7CiAgICB9CiAgICByZXN0KHJlc3QpIHsKICAgICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIHJlc3QKICAgICAgfSk7CiAgICB9CiAgfQogIFpvZFR1cGxlLmNyZWF0ZSA9IChzY2hlbWFzLCBwYXJhbXMpID0+IHsKICAgIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWFzKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pIik7CiAgICB9CiAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHsKICAgICAgaXRlbXM6IHNjaGVtYXMsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVHVwbGUsCiAgICAgIHJlc3Q6IG51bGwsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RSZWNvcmQgZXh0ZW5kcyBab2RUeXBlIHsKICAgIGdldCBrZXlTY2hlbWEoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTsKICAgIH0KICAgIGdldCB2YWx1ZVNjaGVtYSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IHBhaXJzID0gW107CiAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTsKICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTsKICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHsKICAgICAgICBwYWlycy5wdXNoKHsKICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIGtleSkpLAogICAgICAgICAgdmFsdWU6IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGN0eC5kYXRhW2tleV0sIGN0eC5wYXRoLCBrZXkpKSwKICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHsKICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpOwogICAgICB9CiAgICB9CiAgICBnZXQgZWxlbWVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7CiAgICB9CiAgICBzdGF0aWMgY3JlYXRlKGZpcnN0LCBzZWNvbmQsIHRoaXJkKSB7CiAgICAgIGlmIChzZWNvbmQgaW5zdGFuY2VvZiBab2RUeXBlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoewogICAgICAgICAga2V5VHlwZTogZmlyc3QsCiAgICAgICAgICB2YWx1ZVR5cGU6IHNlY29uZCwKICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLAogICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlyZCkKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7CiAgICAgICAga2V5VHlwZTogWm9kU3RyaW5nLmNyZWF0ZSgpLAogICAgICAgIHZhbHVlVHlwZTogZmlyc3QsCiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWNvcmQsCiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhzZWNvbmQpCiAgICAgIH0pOwogICAgfQogIH0KICBjbGFzcyBab2RNYXAgZXh0ZW5kcyBab2RUeXBlIHsKICAgIGdldCBrZXlTY2hlbWEoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTsKICAgIH0KICAgIGdldCB2YWx1ZVNjaGVtYSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm1hcCkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm1hcCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTsKICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTsKICAgICAgY29uc3QgcGFpcnMgPSBbLi4uY3R4LmRhdGEuZW50cmllcygpXS5tYXAoKFtrZXksIHZhbHVlXSwgaW5kZXgpID0+IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAga2V5OiBrZXlUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwga2V5LCBjdHgucGF0aCwgW2luZGV4LCAia2V5Il0pKSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIFtpbmRleCwgInZhbHVlIl0pKQogICAgICAgIH07CiAgICAgIH0pOwogICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykgewogICAgICAgIGNvbnN0IGZpbmFsTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHsKICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7CiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFpci52YWx1ZTsKICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09ICJhYm9ydGVkIiB8fCB2YWx1ZS5zdGF0dXMgPT09ICJhYm9ydGVkIikgewogICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSAiZGlydHkiIHx8IHZhbHVlLnN0YXR1cyA9PT0gImRpcnR5IikgewogICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBmaW5hbE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7CiAgICAgICAgICBjb25zdCBrZXkgPSBwYWlyLmtleTsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFpci52YWx1ZTsKICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSAiYWJvcnRlZCIgfHwgdmFsdWUuc3RhdHVzID09PSAiYWJvcnRlZCIpIHsKICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gImRpcnR5IiB8fCB2YWx1ZS5zdGF0dXMgPT09ICJkaXJ0eSIpIHsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTsKICAgICAgfQogICAgfQogIH0KICBab2RNYXAuY3JlYXRlID0gKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE1hcCh7CiAgICAgIHZhbHVlVHlwZSwKICAgICAga2V5VHlwZSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RNYXAsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RTZXQgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc2V0KSB7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc2V0LAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmOwogICAgICBpZiAoZGVmLm1pblNpemUgIT09IG51bGwpIHsKICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA8IGRlZi5taW5TaXplLnZhbHVlKSB7CiAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCwKICAgICAgICAgICAgbWluaW11bTogZGVmLm1pblNpemUudmFsdWUsCiAgICAgICAgICAgIHR5cGU6ICJzZXQiLAogICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pblNpemUubWVzc2FnZQogICAgICAgICAgfSk7CiAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlZi5tYXhTaXplICE9PSBudWxsKSB7CiAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPiBkZWYubWF4U2l6ZS52YWx1ZSkgewogICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLAogICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4U2l6ZS52YWx1ZSwKICAgICAgICAgICAgdHlwZTogInNldCIsCiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLAogICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4U2l6ZS5tZXNzYWdlCiAgICAgICAgICB9KTsKICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlOwogICAgICBmdW5jdGlvbiBmaW5hbGl6ZVNldChlbGVtZW50czIpIHsKICAgICAgICBjb25zdCBwYXJzZWRTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50czIpIHsKICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gImFib3J0ZWQiKQogICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICBwYXJzZWRTZXQuYWRkKGVsZW1lbnQudmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHBhcnNlZFNldCB9OwogICAgICB9CiAgICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmN0eC5kYXRhLnZhbHVlcygpXS5tYXAoKGl0ZW0sIGkyKSA9PiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaTIpKSk7CiAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGVsZW1lbnRzKS50aGVuKChlbGVtZW50czIpID0+IGZpbmFsaXplU2V0KGVsZW1lbnRzMikpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmaW5hbGl6ZVNldChlbGVtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIG1pbihtaW5TaXplLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kU2V0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgbWluU2l6ZTogeyB2YWx1ZTogbWluU2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0KICAgICAgfSk7CiAgICB9CiAgICBtYXgobWF4U2l6ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gbmV3IFpvZFNldCh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIG1heFNpemU6IHsgdmFsdWU6IG1heFNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9CiAgICAgIH0pOwogICAgfQogICAgc2l6ZShzaXplLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLm1pbihzaXplLCBtZXNzYWdlKS5tYXgoc2l6ZSwgbWVzc2FnZSk7CiAgICB9CiAgICBub25lbXB0eShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTsKICAgIH0KICB9CiAgWm9kU2V0LmNyZWF0ZSA9ICh2YWx1ZVR5cGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RTZXQoewogICAgICB2YWx1ZVR5cGUsCiAgICAgIG1pblNpemU6IG51bGwsCiAgICAgIG1heFNpemU6IG51bGwsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU2V0LAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kRnVuY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICB0aGlzLnZhbGlkYXRlID0gdGhpcy5pbXBsZW1lbnQ7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7CiAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbikgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmZ1bmN0aW9uLAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbWFrZUFyZ3NJc3N1ZShhcmdzLCBlcnJvcikgewogICAgICAgIHJldHVybiBtYWtlSXNzdWUoewogICAgICAgICAgZGF0YTogYXJncywKICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgZXJyb3JNYXBzOiBbCiAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLAogICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsCiAgICAgICAgICAgIGdldEVycm9yTWFwKCksCiAgICAgICAgICAgIGVycm9yTWFwCiAgICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSwKICAgICAgICAgIGlzc3VlRGF0YTogewogICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHMsCiAgICAgICAgICAgIGFyZ3VtZW50c0Vycm9yOiBlcnJvcgogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG1ha2VSZXR1cm5zSXNzdWUocmV0dXJucywgZXJyb3IpIHsKICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHsKICAgICAgICAgIGRhdGE6IHJldHVybnMsCiAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgIGVycm9yTWFwczogWwogICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCwKICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLAogICAgICAgICAgICBnZXRFcnJvck1hcCgpLAogICAgICAgICAgICBlcnJvck1hcAogICAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksCiAgICAgICAgICBpc3N1ZURhdGE6IHsKICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGUsCiAgICAgICAgICAgIHJldHVyblR5cGVFcnJvcjogZXJyb3IKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBwYXJhbXMgPSB7IGVycm9yTWFwOiBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCB9OwogICAgICBjb25zdCBmbiA9IGN0eC5kYXRhOwogICAgICBpZiAodGhpcy5fZGVmLnJldHVybnMgaW5zdGFuY2VvZiBab2RQcm9taXNlKSB7CiAgICAgICAgY29uc3QgbWUgPSB0aGlzOwogICAgICAgIHJldHVybiBPSyhhc3luYyBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihbXSk7CiAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gYXdhaXQgbWUuX2RlZi5hcmdzLnBhcnNlQXN5bmMoYXJncywgcGFyYW1zKS5jYXRjaCgoZTIpID0+IHsKICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZUFyZ3NJc3N1ZShhcmdzLCBlMikpOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIH0pOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncyk7CiAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gYXdhaXQgbWUuX2RlZi5yZXR1cm5zLl9kZWYudHlwZS5wYXJzZUFzeW5jKHJlc3VsdCwgcGFyYW1zKS5jYXRjaCgoZTIpID0+IHsKICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIGUyKSk7CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJuczsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBtZSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIE9LKGZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBtZS5fZGVmLmFyZ3Muc2FmZVBhcnNlKGFyZ3MsIHBhcmFtcyk7CiAgICAgICAgICBpZiAoIXBhcnNlZEFyZ3Muc3VjY2VzcykgewogICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VBcmdzSXNzdWUoYXJncywgcGFyc2VkQXJncy5lcnJvcildKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MuZGF0YSk7CiAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gbWUuX2RlZi5yZXR1cm5zLnNhZmVQYXJzZShyZXN1bHQsIHBhcmFtcyk7CiAgICAgICAgICBpZiAoIXBhcnNlZFJldHVybnMuc3VjY2VzcykgewogICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBwYXJzZWRSZXR1cm5zLmVycm9yKV0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnMuZGF0YTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcGFyYW1ldGVycygpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5hcmdzOwogICAgfQogICAgcmV0dXJuVHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5yZXR1cm5zOwogICAgfQogICAgYXJncyguLi5pdGVtcykgewogICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgYXJnczogWm9kVHVwbGUuY3JlYXRlKGl0ZW1zKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJucyhyZXR1cm5UeXBlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICByZXR1cm5zOiByZXR1cm5UeXBlCiAgICAgIH0pOwogICAgfQogICAgaW1wbGVtZW50KGZ1bmMpIHsKICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7CiAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jOwogICAgfQogICAgc3RyaWN0SW1wbGVtZW50KGZ1bmMpIHsKICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7CiAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jOwogICAgfQogICAgc3RhdGljIGNyZWF0ZShhcmdzLCByZXR1cm5zLCBwYXJhbXMpIHsKICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7CiAgICAgICAgYXJnczogYXJncyA/IGFyZ3MgOiBab2RUdXBsZS5jcmVhdGUoW10pLnJlc3QoWm9kVW5rbm93bi5jcmVhdGUoKSksCiAgICAgICAgcmV0dXJuczogcmV0dXJucyB8fCBab2RVbmtub3duLmNyZWF0ZSgpLAogICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRnVuY3Rpb24sCiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICAgIH0pOwogICAgfQogIH0KICBjbGFzcyBab2RMYXp5IGV4dGVuZHMgWm9kVHlwZSB7CiAgICBnZXQgc2NoZW1hKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBjb25zdCBsYXp5U2NoZW1hID0gdGhpcy5fZGVmLmdldHRlcigpOwogICAgICByZXR1cm4gbGF6eVNjaGVtYS5fcGFyc2UoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pOwogICAgfQogIH0KICBab2RMYXp5LmNyZWF0ZSA9IChnZXR0ZXIsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RMYXp5KHsKICAgICAgZ2V0dGVyLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZExhenksCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RMaXRlcmFsIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgaWYgKGlucHV0LmRhdGEgIT09IHRoaXMuX2RlZi52YWx1ZSkgewogICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSwKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2xpdGVyYWwsCiAgICAgICAgICBleHBlY3RlZDogdGhpcy5fZGVmLnZhbHVlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHsgc3RhdHVzOiAidmFsaWQiLCB2YWx1ZTogaW5wdXQuZGF0YSB9OwogICAgfQogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlOwogICAgfQogIH0KICBab2RMaXRlcmFsLmNyZWF0ZSA9ICh2YWx1ZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoewogICAgICB2YWx1ZSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMaXRlcmFsLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgZnVuY3Rpb24gY3JlYXRlWm9kRW51bSh2YWx1ZXMsIHBhcmFtcykgewogICAgcmV0dXJuIG5ldyBab2RFbnVtKHsKICAgICAgdmFsdWVzLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVudW0sCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfQogIGNsYXNzIFpvZEVudW0gZXh0ZW5kcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfWm9kRW51bV9jYWNoZS5zZXQodGhpcywgdm9pZCAwKTsKICAgIH0KICAgIF9wYXJzZShpbnB1dCkgewogICAgICBpZiAodHlwZW9mIGlucHV0LmRhdGEgIT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpOwogICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlczsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLAogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWm9kRW51bV9jYWNoZSkpIHsKICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ab2RFbnVtX2NhY2hlLCBuZXcgU2V0KHRoaXMuX2RlZi52YWx1ZXMpKTsKICAgICAgfQogICAgICBpZiAoIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1pvZEVudW1fY2FjaGUpLmhhcyhpbnB1dC5kYXRhKSkgewogICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsCiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLAogICAgICAgICAgb3B0aW9uczogZXhwZWN0ZWRWYWx1ZXMKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7CiAgICB9CiAgICBnZXQgb3B0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7CiAgICB9CiAgICBnZXQgZW51bSgpIHsKICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9OwogICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7CiAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsOwogICAgICB9CiAgICAgIHJldHVybiBlbnVtVmFsdWVzOwogICAgfQogICAgZ2V0IFZhbHVlcygpIHsKICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9OwogICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7CiAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsOwogICAgICB9CiAgICAgIHJldHVybiBlbnVtVmFsdWVzOwogICAgfQogICAgZ2V0IEVudW0oKSB7CiAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTsKICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykgewogICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDsKICAgICAgfQogICAgICByZXR1cm4gZW51bVZhbHVlczsKICAgIH0KICAgIGV4dHJhY3QodmFsdWVzLCBuZXdEZWYgPSB0aGlzLl9kZWYpIHsKICAgICAgcmV0dXJuIFpvZEVudW0uY3JlYXRlKHZhbHVlcywgewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICAuLi5uZXdEZWYKICAgICAgfSk7CiAgICB9CiAgICBleGNsdWRlKHZhbHVlcywgbmV3RGVmID0gdGhpcy5fZGVmKSB7CiAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+ICF2YWx1ZXMuaW5jbHVkZXMob3B0KSksIHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgLi4ubmV3RGVmCiAgICAgIH0pOwogICAgfQogIH0KICBfWm9kRW51bV9jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIFpvZEVudW0uY3JlYXRlID0gY3JlYXRlWm9kRW51bTsKICBjbGFzcyBab2ROYXRpdmVFbnVtIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX1pvZE5hdGl2ZUVudW1fY2FjaGUuc2V0KHRoaXMsIHZvaWQgMCk7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgbmF0aXZlRW51bVZhbHVlcyA9IHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpOwogICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcgJiYgY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubnVtYmVyKSB7CiAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLAogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWm9kTmF0aXZlRW51bV9jYWNoZSkpIHsKICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ab2ROYXRpdmVFbnVtX2NhY2hlLCBuZXcgU2V0KHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSk7CiAgICAgIH0KICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ab2ROYXRpdmVFbnVtX2NhY2hlKS5oYXMoaW5wdXQuZGF0YSkpIHsKICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHV0aWwub2JqZWN0VmFsdWVzKG5hdGl2ZUVudW1WYWx1ZXMpOwogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLAogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSwKICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpOwogICAgfQogICAgZ2V0IGVudW0oKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVzOwogICAgfQogIH0KICBfWm9kTmF0aXZlRW51bV9jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIFpvZE5hdGl2ZUVudW0uY3JlYXRlID0gKHZhbHVlcywgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE5hdGl2ZUVudW0oewogICAgICB2YWx1ZXMsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmF0aXZlRW51bSwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZFByb21pc2UgZXh0ZW5kcyBab2RUeXBlIHsKICAgIHVud3JhcCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUucHJvbWlzZSAmJiBjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnByb21pc2UsCiAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICBjb25zdCBwcm9taXNpZmllZCA9IGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnByb21pc2UgPyBjdHguZGF0YSA6IFByb21pc2UucmVzb2x2ZShjdHguZGF0YSk7CiAgICAgIHJldHVybiBPSyhwcm9taXNpZmllZC50aGVuKChkYXRhKSA9PiB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlLnBhcnNlQXN5bmMoZGF0YSwgewogICAgICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgICAgICBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAKICAgICAgICB9KTsKICAgICAgfSkpOwogICAgfQogIH0KICBab2RQcm9taXNlLmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHsKICAgICAgdHlwZTogc2NoZW1hLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFByb21pc2UsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RFZmZlY3RzIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBpbm5lclR5cGUoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hOwogICAgfQogICAgc291cmNlVHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMgPyB0aGlzLl9kZWYuc2NoZW1hLnNvdXJjZVR5cGUoKSA6IHRoaXMuX2RlZi5zY2hlbWE7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgY29uc3QgZWZmZWN0ID0gdGhpcy5fZGVmLmVmZmVjdCB8fCBudWxsOwogICAgICBjb25zdCBjaGVja0N0eCA9IHsKICAgICAgICBhZGRJc3N1ZTogKGFyZykgPT4gewogICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBhcmcpOwogICAgICAgICAgaWYgKGFyZy5mYXRhbCkgewogICAgICAgICAgICBzdGF0dXMuYWJvcnQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgICByZXR1cm4gY3R4LnBhdGg7CiAgICAgICAgfQogICAgICB9OwogICAgICBjaGVja0N0eC5hZGRJc3N1ZSA9IGNoZWNrQ3R4LmFkZElzc3VlLmJpbmQoY2hlY2tDdHgpOwogICAgICBpZiAoZWZmZWN0LnR5cGUgPT09ICJwcmVwcm9jZXNzIikgewogICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGVmZmVjdC50cmFuc2Zvcm0oY3R4LmRhdGEsIGNoZWNrQ3R4KTsKICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykgewogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwcm9jZXNzZWQpLnRoZW4oYXN5bmMgKHByb2Nlc3NlZDIpID0+IHsKICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gImFib3J0ZWQiKQogICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsKICAgICAgICAgICAgICBkYXRhOiBwcm9jZXNzZWQyLAogICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICAgIHBhcmVudDogY3R4CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gImFib3J0ZWQiKQogICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gImRpcnR5IikKICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc3RhdHVzLnZhbHVlID09PSAiYWJvcnRlZCIpCiAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHsKICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLAogICAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgICAgcGFyZW50OiBjdHgKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICJhYm9ydGVkIikKICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICBpZiAoc3RhdHVzLnZhbHVlID09PSAiZGlydHkiKQogICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gInJlZmluZW1lbnQiKSB7CiAgICAgICAgY29uc3QgZXhlY3V0ZVJlZmluZW1lbnQgPSAoYWNjKSA9PiB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBlZmZlY3QucmVmaW5lbWVudChhY2MsIGNoZWNrQ3R4KTsKICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgfTsKICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHsKICAgICAgICAgIGNvbnN0IGlubmVyID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSAiYWJvcnRlZCIpCiAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSk7CiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlubmVyLnZhbHVlIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KS50aGVuKChpbm5lcikgPT4gewogICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSAiYWJvcnRlZCIpCiAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09ICJkaXJ0eSIpCiAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICAgIHJldHVybiBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZWZmZWN0LnR5cGUgPT09ICJ0cmFuc2Zvcm0iKSB7CiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7CiAgICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpCiAgICAgICAgICAgIHJldHVybiBiYXNlOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCk7CiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzeW5jaHJvbm91cyB0cmFuc2Zvcm0gZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuYCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSkudGhlbigoYmFzZSkgPT4gewogICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpCiAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCkpLnRoZW4oKHJlc3VsdCkgPT4gKHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiByZXN1bHQgfSkpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoZWZmZWN0KTsKICAgIH0KICB9CiAgWm9kRWZmZWN0cy5jcmVhdGUgPSAoc2NoZW1hLCBlZmZlY3QsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHsKICAgICAgc2NoZW1hLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsCiAgICAgIGVmZmVjdCwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIFpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3MgPSAocHJlcHJvY2Vzcywgc2NoZW1hLCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7CiAgICAgIHNjaGVtYSwKICAgICAgZWZmZWN0OiB7IHR5cGU6ICJwcmVwcm9jZXNzIiwgdHJhbnNmb3JtOiBwcmVwcm9jZXNzIH0sCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cywKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZE9wdGlvbmFsIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpOwogICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gT0sodm9pZCAwKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpOwogICAgfQogICAgdW53cmFwKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTsKICAgIH0KICB9CiAgWm9kT3B0aW9uYWwuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RPcHRpb25hbCh7CiAgICAgIGlubmVyVHlwZTogdHlwZSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPcHRpb25hbCwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZE51bGxhYmxlIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpOwogICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7CiAgICAgICAgcmV0dXJuIE9LKG51bGwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7CiAgICB9CiAgICB1bndyYXAoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlOwogICAgfQogIH0KICBab2ROdWxsYWJsZS5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE51bGxhYmxlKHsKICAgICAgaW5uZXJUeXBlOiB0eXBlLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGxhYmxlLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kRGVmYXVsdCBleHRlbmRzIFpvZFR5cGUgewogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBsZXQgZGF0YSA9IGN0eC5kYXRhOwogICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YSA9IHRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoewogICAgICAgIGRhdGEsCiAgICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgICAgcGFyZW50OiBjdHgKICAgICAgfSk7CiAgICB9CiAgICByZW1vdmVEZWZhdWx0KCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTsKICAgIH0KICB9CiAgWm9kRGVmYXVsdC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoewogICAgICBpbm5lclR5cGU6IHR5cGUsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCwKICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgcGFyYW1zLmRlZmF1bHQgPT09ICJmdW5jdGlvbiIgPyBwYXJhbXMuZGVmYXVsdCA6ICgpID0+IHBhcmFtcy5kZWZhdWx0LAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kQ2F0Y2ggZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgY29uc3QgbmV3Q3R4ID0gewogICAgICAgIC4uLmN0eCwKICAgICAgICBjb21tb246IHsKICAgICAgICAgIC4uLmN0eC5jb21tb24sCiAgICAgICAgICBpc3N1ZXM6IFtdCiAgICAgICAgfQogICAgICB9OwogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7CiAgICAgICAgZGF0YTogbmV3Q3R4LmRhdGEsCiAgICAgICAgcGF0aDogbmV3Q3R4LnBhdGgsCiAgICAgICAgcGFyZW50OiB7CiAgICAgICAgICAuLi5uZXdDdHgKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQyKSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdGF0dXM6ICJ2YWxpZCIsCiAgICAgICAgICAgIHZhbHVlOiByZXN1bHQyLnN0YXR1cyA9PT0gInZhbGlkIiA/IHJlc3VsdDIudmFsdWUgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7CiAgICAgICAgICAgICAgZ2V0IGVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEKICAgICAgICAgICAgfSkKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHN0YXR1czogInZhbGlkIiwKICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSAidmFsaWQiID8gcmVzdWx0LnZhbHVlIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoewogICAgICAgICAgICBnZXQgZXJyb3IoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGlucHV0OiBuZXdDdHguZGF0YQogICAgICAgICAgfSkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICByZW1vdmVDYXRjaCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7CiAgICB9CiAgfQogIFpvZENhdGNoLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goewogICAgICBpbm5lclR5cGU6IHR5cGUsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsCiAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBwYXJhbXMuY2F0Y2ggPT09ICJmdW5jdGlvbiIgPyBwYXJhbXMuY2F0Y2ggOiAoKSA9PiBwYXJhbXMuY2F0Y2gsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2ROYU4gZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm5hbikgewogICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsCiAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5uYW4sCiAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICByZXR1cm4geyBzdGF0dXM6ICJ2YWxpZCIsIHZhbHVlOiBpbnB1dC5kYXRhIH07CiAgICB9CiAgfQogIFpvZE5hTi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE5hTih7CiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmFOLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY29uc3QgQlJBTkQgPSBTeW1ib2woInpvZF9icmFuZCIpOwogIGNsYXNzIFpvZEJyYW5kZWQgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgY29uc3QgZGF0YSA9IGN0eC5kYXRhOwogICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUuX3BhcnNlKHsKICAgICAgICBkYXRhLAogICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgIHBhcmVudDogY3R4CiAgICAgIH0pOwogICAgfQogICAgdW53cmFwKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7CiAgICB9CiAgfQogIGNsYXNzIFpvZFBpcGVsaW5lIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHsKICAgICAgICBjb25zdCBoYW5kbGVBc3luYyA9IGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gYXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSAiYWJvcnRlZCIpCiAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gImRpcnR5IikgewogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgICAgcmV0dXJuIERJUlRZKGluUmVzdWx0LnZhbHVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYub3V0Ll9wYXJzZUFzeW5jKHsKICAgICAgICAgICAgICBkYXRhOiBpblJlc3VsdC52YWx1ZSwKICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBoYW5kbGVBc3luYygpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGluUmVzdWx0ID0gdGhpcy5fZGVmLmluLl9wYXJzZVN5bmMoewogICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgIHBhcmVudDogY3R4CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gImFib3J0ZWQiKQogICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gImRpcnR5IikgewogICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdGF0dXM6ICJkaXJ0eSIsCiAgICAgICAgICAgIHZhbHVlOiBpblJlc3VsdC52YWx1ZQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7CiAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLAogICAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgICAgcGFyZW50OiBjdHgKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc3RhdGljIGNyZWF0ZShhMiwgYikgewogICAgICByZXR1cm4gbmV3IFpvZFBpcGVsaW5lKHsKICAgICAgICBpbjogYTIsCiAgICAgICAgb3V0OiBiLAogICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUGlwZWxpbmUKICAgICAgfSk7CiAgICB9CiAgfQogIGNsYXNzIFpvZFJlYWRvbmx5IGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpOwogICAgICBjb25zdCBmcmVlemUgPSAoZGF0YSkgPT4gewogICAgICAgIGlmIChpc1ZhbGlkKGRhdGEpKSB7CiAgICAgICAgICBkYXRhLnZhbHVlID0gT2JqZWN0LmZyZWV6ZShkYXRhLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgIH07CiAgICAgIHJldHVybiBpc0FzeW5jKHJlc3VsdCkgPyByZXN1bHQudGhlbigoZGF0YSkgPT4gZnJlZXplKGRhdGEpKSA6IGZyZWV6ZShyZXN1bHQpOwogICAgfQogICAgdW53cmFwKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTsKICAgIH0KICB9CiAgWm9kUmVhZG9ubHkuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RSZWFkb25seSh7CiAgICAgIGlubmVyVHlwZTogdHlwZSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWFkb25seSwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGZ1bmN0aW9uIGN1c3RvbShjaGVjaywgcGFyYW1zID0ge30sIGZhdGFsKSB7CiAgICBpZiAoY2hlY2spCiAgICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKGRhdGEsIGN0eCkgPT4gewogICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgaWYgKCFjaGVjayhkYXRhKSkgewogICAgICAgICAgY29uc3QgcCA9IHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIgPyBwYXJhbXMoZGF0YSkgOiB0eXBlb2YgcGFyYW1zID09PSAic3RyaW5nIiA/IHsgbWVzc2FnZTogcGFyYW1zIH0gOiBwYXJhbXM7CiAgICAgICAgICBjb25zdCBfZmF0YWwgPSAoX2IgPSAoX2EgPSBwLmZhdGFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYXRhbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZTsKICAgICAgICAgIGNvbnN0IHAyID0gdHlwZW9mIHAgPT09ICJzdHJpbmciID8geyBtZXNzYWdlOiBwIH0gOiBwOwogICAgICAgICAgY3R4LmFkZElzc3VlKHsgY29kZTogImN1c3RvbSIsIC4uLnAyLCBmYXRhbDogX2ZhdGFsIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpOwogIH0KICBjb25zdCBsYXRlID0gewogICAgb2JqZWN0OiBab2RPYmplY3QubGF6eWNyZWF0ZQogIH07CiAgdmFyIFpvZEZpcnN0UGFydHlUeXBlS2luZDsKICAoZnVuY3Rpb24oWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMikgewogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kU3RyaW5nIl0gPSAiWm9kU3RyaW5nIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZE51bWJlciJdID0gIlpvZE51bWJlciI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2ROYU4iXSA9ICJab2ROYU4iOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kQmlnSW50Il0gPSAiWm9kQmlnSW50IjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZEJvb2xlYW4iXSA9ICJab2RCb29sZWFuIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZERhdGUiXSA9ICJab2REYXRlIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZFN5bWJvbCJdID0gIlpvZFN5bWJvbCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RVbmRlZmluZWQiXSA9ICJab2RVbmRlZmluZWQiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kTnVsbCJdID0gIlpvZE51bGwiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kQW55Il0gPSAiWm9kQW55IjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZFVua25vd24iXSA9ICJab2RVbmtub3duIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZE5ldmVyIl0gPSAiWm9kTmV2ZXIiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kVm9pZCJdID0gIlpvZFZvaWQiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kQXJyYXkiXSA9ICJab2RBcnJheSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RPYmplY3QiXSA9ICJab2RPYmplY3QiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kVW5pb24iXSA9ICJab2RVbmlvbiI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2REaXNjcmltaW5hdGVkVW5pb24iXSA9ICJab2REaXNjcmltaW5hdGVkVW5pb24iOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kSW50ZXJzZWN0aW9uIl0gPSAiWm9kSW50ZXJzZWN0aW9uIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZFR1cGxlIl0gPSAiWm9kVHVwbGUiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kUmVjb3JkIl0gPSAiWm9kUmVjb3JkIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZE1hcCJdID0gIlpvZE1hcCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RTZXQiXSA9ICJab2RTZXQiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kRnVuY3Rpb24iXSA9ICJab2RGdW5jdGlvbiI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RMYXp5Il0gPSAiWm9kTGF6eSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RMaXRlcmFsIl0gPSAiWm9kTGl0ZXJhbCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RFbnVtIl0gPSAiWm9kRW51bSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RFZmZlY3RzIl0gPSAiWm9kRWZmZWN0cyI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2ROYXRpdmVFbnVtIl0gPSAiWm9kTmF0aXZlRW51bSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RPcHRpb25hbCJdID0gIlpvZE9wdGlvbmFsIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZE51bGxhYmxlIl0gPSAiWm9kTnVsbGFibGUiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kRGVmYXVsdCJdID0gIlpvZERlZmF1bHQiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kQ2F0Y2giXSA9ICJab2RDYXRjaCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RQcm9taXNlIl0gPSAiWm9kUHJvbWlzZSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RCcmFuZGVkIl0gPSAiWm9kQnJhbmRlZCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RQaXBlbGluZSJdID0gIlpvZFBpcGVsaW5lIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZFJlYWRvbmx5Il0gPSAiWm9kUmVhZG9ubHkiOwogIH0pKFpvZEZpcnN0UGFydHlUeXBlS2luZCB8fCAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kID0ge30pKTsKICBjb25zdCBpbnN0YW5jZU9mVHlwZSA9IChjbHMsIHBhcmFtcyA9IHsKICAgIG1lc3NhZ2U6IGBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHtjbHMubmFtZX1gCiAgfSkgPT4gY3VzdG9tKChkYXRhKSA9PiBkYXRhIGluc3RhbmNlb2YgY2xzLCBwYXJhbXMpOwogIGNvbnN0IHN0cmluZ1R5cGUgPSBab2RTdHJpbmcuY3JlYXRlOwogIGNvbnN0IG51bWJlclR5cGUgPSBab2ROdW1iZXIuY3JlYXRlOwogIGNvbnN0IG5hblR5cGUgPSBab2ROYU4uY3JlYXRlOwogIGNvbnN0IGJpZ0ludFR5cGUgPSBab2RCaWdJbnQuY3JlYXRlOwogIGNvbnN0IGJvb2xlYW5UeXBlID0gWm9kQm9vbGVhbi5jcmVhdGU7CiAgY29uc3QgZGF0ZVR5cGUgPSBab2REYXRlLmNyZWF0ZTsKICBjb25zdCBzeW1ib2xUeXBlID0gWm9kU3ltYm9sLmNyZWF0ZTsKICBjb25zdCB1bmRlZmluZWRUeXBlID0gWm9kVW5kZWZpbmVkLmNyZWF0ZTsKICBjb25zdCBudWxsVHlwZSA9IFpvZE51bGwuY3JlYXRlOwogIGNvbnN0IGFueVR5cGUgPSBab2RBbnkuY3JlYXRlOwogIGNvbnN0IHVua25vd25UeXBlID0gWm9kVW5rbm93bi5jcmVhdGU7CiAgY29uc3QgbmV2ZXJUeXBlID0gWm9kTmV2ZXIuY3JlYXRlOwogIGNvbnN0IHZvaWRUeXBlID0gWm9kVm9pZC5jcmVhdGU7CiAgY29uc3QgYXJyYXlUeXBlID0gWm9kQXJyYXkuY3JlYXRlOwogIGNvbnN0IG9iamVjdFR5cGUgPSBab2RPYmplY3QuY3JlYXRlOwogIGNvbnN0IHN0cmljdE9iamVjdFR5cGUgPSBab2RPYmplY3Quc3RyaWN0Q3JlYXRlOwogIGNvbnN0IHVuaW9uVHlwZSA9IFpvZFVuaW9uLmNyZWF0ZTsKICBjb25zdCBkaXNjcmltaW5hdGVkVW5pb25UeXBlID0gWm9kRGlzY3JpbWluYXRlZFVuaW9uLmNyZWF0ZTsKICBjb25zdCBpbnRlcnNlY3Rpb25UeXBlID0gWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZTsKICBjb25zdCB0dXBsZVR5cGUgPSBab2RUdXBsZS5jcmVhdGU7CiAgY29uc3QgcmVjb3JkVHlwZSA9IFpvZFJlY29yZC5jcmVhdGU7CiAgY29uc3QgbWFwVHlwZSA9IFpvZE1hcC5jcmVhdGU7CiAgY29uc3Qgc2V0VHlwZSA9IFpvZFNldC5jcmVhdGU7CiAgY29uc3QgZnVuY3Rpb25UeXBlID0gWm9kRnVuY3Rpb24uY3JlYXRlOwogIGNvbnN0IGxhenlUeXBlID0gWm9kTGF6eS5jcmVhdGU7CiAgY29uc3QgbGl0ZXJhbFR5cGUgPSBab2RMaXRlcmFsLmNyZWF0ZTsKICBjb25zdCBlbnVtVHlwZSA9IFpvZEVudW0uY3JlYXRlOwogIGNvbnN0IG5hdGl2ZUVudW1UeXBlID0gWm9kTmF0aXZlRW51bS5jcmVhdGU7CiAgY29uc3QgcHJvbWlzZVR5cGUgPSBab2RQcm9taXNlLmNyZWF0ZTsKICBjb25zdCBlZmZlY3RzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlOwogIGNvbnN0IG9wdGlvbmFsVHlwZSA9IFpvZE9wdGlvbmFsLmNyZWF0ZTsKICBjb25zdCBudWxsYWJsZVR5cGUgPSBab2ROdWxsYWJsZS5jcmVhdGU7CiAgY29uc3QgcHJlcHJvY2Vzc1R5cGUgPSBab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzOwogIGNvbnN0IHBpcGVsaW5lVHlwZSA9IFpvZFBpcGVsaW5lLmNyZWF0ZTsKICBjb25zdCBvc3RyaW5nID0gKCkgPT4gc3RyaW5nVHlwZSgpLm9wdGlvbmFsKCk7CiAgY29uc3Qgb251bWJlciA9ICgpID0+IG51bWJlclR5cGUoKS5vcHRpb25hbCgpOwogIGNvbnN0IG9ib29sZWFuID0gKCkgPT4gYm9vbGVhblR5cGUoKS5vcHRpb25hbCgpOwogIGNvbnN0IGNvZXJjZSA9IHsKICAgIHN0cmluZzogKGFyZykgPT4gWm9kU3RyaW5nLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pLAogICAgbnVtYmVyOiAoYXJnKSA9PiBab2ROdW1iZXIuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSksCiAgICBib29sZWFuOiAoYXJnKSA9PiBab2RCb29sZWFuLmNyZWF0ZSh7CiAgICAgIC4uLmFyZywKICAgICAgY29lcmNlOiB0cnVlCiAgICB9KSwKICAgIGJpZ2ludDogKGFyZykgPT4gWm9kQmlnSW50LmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pLAogICAgZGF0ZTogKGFyZykgPT4gWm9kRGF0ZS5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KQogIH07CiAgY29uc3QgTkVWRVIgPSBJTlZBTElEOwogIHZhciB6JDEgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmZyZWV6ZSh7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBkZWZhdWx0RXJyb3JNYXA6IGVycm9yTWFwLAogICAgc2V0RXJyb3JNYXAsCiAgICBnZXRFcnJvck1hcCwKICAgIG1ha2VJc3N1ZSwKICAgIEVNUFRZX1BBVEgsCiAgICBhZGRJc3N1ZVRvQ29udGV4dCwKICAgIFBhcnNlU3RhdHVzLAogICAgSU5WQUxJRCwKICAgIERJUlRZLAogICAgT0ssCiAgICBpc0Fib3J0ZWQsCiAgICBpc0RpcnR5LAogICAgaXNWYWxpZCwKICAgIGlzQXN5bmMsCiAgICBnZXQgdXRpbCgpIHsKICAgICAgcmV0dXJuIHV0aWw7CiAgICB9LAogICAgZ2V0IG9iamVjdFV0aWwoKSB7CiAgICAgIHJldHVybiBvYmplY3RVdGlsOwogICAgfSwKICAgIFpvZFBhcnNlZFR5cGUsCiAgICBnZXRQYXJzZWRUeXBlLAogICAgWm9kVHlwZSwKICAgIGRhdGV0aW1lUmVnZXgsCiAgICBab2RTdHJpbmcsCiAgICBab2ROdW1iZXIsCiAgICBab2RCaWdJbnQsCiAgICBab2RCb29sZWFuLAogICAgWm9kRGF0ZSwKICAgIFpvZFN5bWJvbCwKICAgIFpvZFVuZGVmaW5lZCwKICAgIFpvZE51bGwsCiAgICBab2RBbnksCiAgICBab2RVbmtub3duLAogICAgWm9kTmV2ZXIsCiAgICBab2RWb2lkLAogICAgWm9kQXJyYXksCiAgICBab2RPYmplY3QsCiAgICBab2RVbmlvbiwKICAgIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiwKICAgIFpvZEludGVyc2VjdGlvbiwKICAgIFpvZFR1cGxlLAogICAgWm9kUmVjb3JkLAogICAgWm9kTWFwLAogICAgWm9kU2V0LAogICAgWm9kRnVuY3Rpb24sCiAgICBab2RMYXp5LAogICAgWm9kTGl0ZXJhbCwKICAgIFpvZEVudW0sCiAgICBab2ROYXRpdmVFbnVtLAogICAgWm9kUHJvbWlzZSwKICAgIFpvZEVmZmVjdHMsCiAgICBab2RUcmFuc2Zvcm1lcjogWm9kRWZmZWN0cywKICAgIFpvZE9wdGlvbmFsLAogICAgWm9kTnVsbGFibGUsCiAgICBab2REZWZhdWx0LAogICAgWm9kQ2F0Y2gsCiAgICBab2ROYU4sCiAgICBCUkFORCwKICAgIFpvZEJyYW5kZWQsCiAgICBab2RQaXBlbGluZSwKICAgIFpvZFJlYWRvbmx5LAogICAgY3VzdG9tLAogICAgU2NoZW1hOiBab2RUeXBlLAogICAgWm9kU2NoZW1hOiBab2RUeXBlLAogICAgbGF0ZSwKICAgIGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQoKSB7CiAgICAgIHJldHVybiBab2RGaXJzdFBhcnR5VHlwZUtpbmQ7CiAgICB9LAogICAgY29lcmNlLAogICAgYW55OiBhbnlUeXBlLAogICAgYXJyYXk6IGFycmF5VHlwZSwKICAgIGJpZ2ludDogYmlnSW50VHlwZSwKICAgIGJvb2xlYW46IGJvb2xlYW5UeXBlLAogICAgZGF0ZTogZGF0ZVR5cGUsCiAgICBkaXNjcmltaW5hdGVkVW5pb246IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUsCiAgICBlZmZlY3Q6IGVmZmVjdHNUeXBlLAogICAgImVudW0iOiBlbnVtVHlwZSwKICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uVHlwZSwKICAgICJpbnN0YW5jZW9mIjogaW5zdGFuY2VPZlR5cGUsCiAgICBpbnRlcnNlY3Rpb246IGludGVyc2VjdGlvblR5cGUsCiAgICBsYXp5OiBsYXp5VHlwZSwKICAgIGxpdGVyYWw6IGxpdGVyYWxUeXBlLAogICAgbWFwOiBtYXBUeXBlLAogICAgbmFuOiBuYW5UeXBlLAogICAgbmF0aXZlRW51bTogbmF0aXZlRW51bVR5cGUsCiAgICBuZXZlcjogbmV2ZXJUeXBlLAogICAgIm51bGwiOiBudWxsVHlwZSwKICAgIG51bGxhYmxlOiBudWxsYWJsZVR5cGUsCiAgICBudW1iZXI6IG51bWJlclR5cGUsCiAgICBvYmplY3Q6IG9iamVjdFR5cGUsCiAgICBvYm9vbGVhbiwKICAgIG9udW1iZXIsCiAgICBvcHRpb25hbDogb3B0aW9uYWxUeXBlLAogICAgb3N0cmluZywKICAgIHBpcGVsaW5lOiBwaXBlbGluZVR5cGUsCiAgICBwcmVwcm9jZXNzOiBwcmVwcm9jZXNzVHlwZSwKICAgIHByb21pc2U6IHByb21pc2VUeXBlLAogICAgcmVjb3JkOiByZWNvcmRUeXBlLAogICAgc2V0OiBzZXRUeXBlLAogICAgc3RyaWN0T2JqZWN0OiBzdHJpY3RPYmplY3RUeXBlLAogICAgc3RyaW5nOiBzdHJpbmdUeXBlLAogICAgc3ltYm9sOiBzeW1ib2xUeXBlLAogICAgdHJhbnNmb3JtZXI6IGVmZmVjdHNUeXBlLAogICAgdHVwbGU6IHR1cGxlVHlwZSwKICAgICJ1bmRlZmluZWQiOiB1bmRlZmluZWRUeXBlLAogICAgdW5pb246IHVuaW9uVHlwZSwKICAgIHVua25vd246IHVua25vd25UeXBlLAogICAgInZvaWQiOiB2b2lkVHlwZSwKICAgIE5FVkVSLAogICAgWm9kSXNzdWVDb2RlLAogICAgcXVvdGVsZXNzSnNvbiwKICAgIFpvZEVycm9yCiAgfSk7CiAgeiQxLm9iamVjdCh7CiAgICBudWNsZW90aWRlU2VxdWVuY2VzOiB6JDEuYXJyYXkoCiAgICAgIHokMS5vYmplY3QoewogICAgICAgIG5hbWU6IHokMS5zdHJpbmcoKSwKICAgICAgICBzZXF1ZW5jZTogeiQxLnN0cmluZygpCiAgICAgIH0pCiAgICApLAogICAgZ2VuZXM6IHokMS5hcnJheSgKICAgICAgeiQxLm9iamVjdCh7CiAgICAgICAgbmFtZTogeiQxLnN0cmluZygpLAogICAgICAgIHNlcXVlbmNlOiB6JDEuc3RyaW5nKCkKICAgICAgfSkKICAgICkKICB9KTsKICBjb25zdCBvcmRlckJ5VHlwZSA9IHokMS5lbnVtKFsiYXNjZW5kaW5nIiwgImRlc2NlbmRpbmciXSk7CiAgY29uc3Qgb3JkZXJCeSA9IHokMS5vYmplY3QoewogICAgZmllbGQ6IHokMS5zdHJpbmcoKSwKICAgIHR5cGU6IG9yZGVyQnlUeXBlCiAgfSk7CiAgY29uc3QgbGFwaXNCYXNlUmVxdWVzdCA9IHokMS5vYmplY3QoewogICAgbGltaXQ6IHokMS5udW1iZXIoKS5vcHRpb25hbCgpLAogICAgb2Zmc2V0OiB6JDEubnVtYmVyKCkub3B0aW9uYWwoKSwKICAgIGZpZWxkczogeiQxLmFycmF5KHokMS5zdHJpbmcoKSkub3B0aW9uYWwoKSwKICAgIG9yZGVyQnk6IHokMS5hcnJheShvcmRlckJ5KS5vcHRpb25hbCgpCiAgfSkuY2F0Y2hhbGwoeiQxLnVuaW9uKFt6JDEuYm9vbGVhbigpLCB6JDEudW5kZWZpbmVkKCksIHokMS5zdHJpbmcoKSwgeiQxLm51bWJlcigpLCB6JDEubnVsbCgpLCB6JDEuYXJyYXkoeiQxLnN0cmluZygpKV0pKTsKICBsYXBpc0Jhc2VSZXF1ZXN0LmV4dGVuZCh7IG1pblByb3BvcnRpb246IHokMS5udW1iZXIoKS5vcHRpb25hbCgpIH0pOwogIGNvbnN0IG11dGF0aW9uUHJvcG9ydGlvbkNvdW50ID0geiQxLm9iamVjdCh7CiAgICBtdXRhdGlvbjogeiQxLnN0cmluZygpLAogICAgcHJvcG9ydGlvbjogeiQxLm51bWJlcigpLAogICAgY291bnQ6IHokMS5udW1iZXIoKSwKICAgIHNlcXVlbmNlTmFtZTogeiQxLnVuaW9uKFt6JDEuc3RyaW5nKCksIHokMS5udWxsKCldKSwKICAgIG11dGF0aW9uRnJvbTogeiQxLnN0cmluZygpLAogICAgbXV0YXRpb25UbzogeiQxLnN0cmluZygpLAogICAgcG9zaXRpb246IHokMS5udW1iZXIoKQogIH0pOwogIGNvbnN0IG11dGF0aW9uc1Jlc3BvbnNlID0gbWFrZUxhcGlzUmVzcG9uc2UoeiQxLmFycmF5KG11dGF0aW9uUHJvcG9ydGlvbkNvdW50KSk7CiAgY29uc3QgaW5zZXJ0aW9uQ291bnQgPSB6JDEub2JqZWN0KHsKICAgIGluc2VydGlvbjogeiQxLnN0cmluZygpLAogICAgY291bnQ6IHokMS5udW1iZXIoKSwKICAgIGluc2VydGVkU3ltYm9sczogeiQxLnN0cmluZygpLAogICAgcG9zaXRpb246IHokMS5udW1iZXIoKSwKICAgIHNlcXVlbmNlTmFtZTogeiQxLnVuaW9uKFt6JDEuc3RyaW5nKCksIHokMS5udWxsKCldKQogIH0pOwogIG1ha2VMYXBpc1Jlc3BvbnNlKHokMS5hcnJheShpbnNlcnRpb25Db3VudCkpOwogIGNvbnN0IGFnZ3JlZ2F0ZWRJdGVtID0geiQxLm9iamVjdCh7IGNvdW50OiB6JDEubnVtYmVyKCkgfSkuY2F0Y2hhbGwoeiQxLnVuaW9uKFt6JDEuc3RyaW5nKCksIHokMS5udW1iZXIoKSwgeiQxLm51bGwoKV0pKTsKICBjb25zdCBhZ2dyZWdhdGVkUmVzcG9uc2UgPSBtYWtlTGFwaXNSZXNwb25zZSh6JDEuYXJyYXkoYWdncmVnYXRlZEl0ZW0pKTsKICBmdW5jdGlvbiBtYWtlTGFwaXNSZXNwb25zZShkYXRhKSB7CiAgICByZXR1cm4geiQxLm9iamVjdCh7CiAgICAgIGRhdGEKICAgIH0pOwogIH0KICBjb25zdCBwcm9ibGVtRGV0YWlsID0geiQxLm9iamVjdCh7CiAgICB0aXRsZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksCiAgICBzdGF0dXM6IHokMS5udW1iZXIoKSwKICAgIGRldGFpbDogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksCiAgICB0eXBlOiB6JDEuc3RyaW5nKCksCiAgICBpbnN0YW5jZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCkKICB9KTsKICBjb25zdCBsYXBpc0Vycm9yID0geiQxLm9iamVjdCh7CiAgICBlcnJvcjogcHJvYmxlbURldGFpbAogIH0pOwogIGNsYXNzIFVua25vd25MYXBpc0Vycm9yIGV4dGVuZHMgRXJyb3IgewogICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCByZXF1ZXN0ZWREYXRhKSB7CiAgICAgIHN1cGVyKG1lc3NhZ2UpOwogICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgdGhpcy5yZXF1ZXN0ZWREYXRhID0gcmVxdWVzdGVkRGF0YTsKICAgICAgdGhpcy5uYW1lID0gIlVua25vd25MYXBpc0Vycm9yIjsKICAgIH0KICB9CiAgY2xhc3MgTGFwaXNFcnJvciBleHRlbmRzIEVycm9yIHsKICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgcHJvYmxlbURldGFpbDIsIHJlcXVlc3RlZERhdGEpIHsKICAgICAgc3VwZXIobWVzc2FnZSk7CiAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICB0aGlzLnByb2JsZW1EZXRhaWwgPSBwcm9ibGVtRGV0YWlsMjsKICAgICAgdGhpcy5yZXF1ZXN0ZWREYXRhID0gcmVxdWVzdGVkRGF0YTsKICAgICAgdGhpcy5uYW1lID0gIkxhcGlzRXJyb3IiOwogICAgfQogIH0KICBhc3luYyBmdW5jdGlvbiBmZXRjaEFnZ3JlZ2F0ZWQobGFwaXNVcmwsIGJvZHksIHNpZ25hbCkgewogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhZ2dyZWdhdGVkRW5kcG9pbnQobGFwaXNVcmwpLCB7CiAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIgogICAgICB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgc2lnbmFsCiAgICB9KTsKICAgIGF3YWl0IGhhbmRsZUVycm9ycyhyZXNwb25zZSwgImFnZ3JlZ2F0ZWQgZGF0YSIpOwogICAgcmV0dXJuIGFnZ3JlZ2F0ZWRSZXNwb25zZS5wYXJzZShhd2FpdCByZXNwb25zZS5qc29uKCkpOwogIH0KICBhc3luYyBmdW5jdGlvbiBmZXRjaFN1YnN0aXR1dGlvbnNPckRlbGV0aW9ucyhsYXBpc1VybCwgYm9keSwgc2VxdWVuY2VUeXBlLCBzaWduYWwpIHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goc3Vic3RpdHV0aW9uc09yRGVsZXRpb25zRW5kcG9pbnQobGFwaXNVcmwsIHNlcXVlbmNlVHlwZSksIHsKICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iCiAgICAgIH0sCiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogICAgICBzaWduYWwKICAgIH0pOwogICAgYXdhaXQgaGFuZGxlRXJyb3JzKHJlc3BvbnNlLCBgJHtzZXF1ZW5jZVR5cGV9IG11dGF0aW9uc2ApOwogICAgcmV0dXJuIG11dGF0aW9uc1Jlc3BvbnNlLnBhcnNlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7CiAgfQogIGNvbnN0IGhhbmRsZUVycm9ycyA9IGFzeW5jIChyZXNwb25zZSwgcmVxdWVzdGVkRGF0YSkgPT4gewogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDQwMCAmJiByZXNwb25zZS5zdGF0dXMgPCA1MDApIHsKICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICAgIGNvbnN0IGxhcGlzRXJyb3JSZXN1bHQgPSBsYXBpc0Vycm9yLnNhZmVQYXJzZShqc29uKTsKICAgICAgICBpZiAobGFwaXNFcnJvclJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgTGFwaXNFcnJvcigKICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCArIGxhcGlzRXJyb3JSZXN1bHQuZGF0YS5lcnJvci5kZXRhaWwsCiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgbGFwaXNFcnJvclJlc3VsdC5kYXRhLmVycm9yLAogICAgICAgICAgICByZXF1ZXN0ZWREYXRhCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBwcm9ibGVtRGV0YWlsUmVzdWx0ID0gcHJvYmxlbURldGFpbC5zYWZlUGFyc2UoanNvbik7CiAgICAgICAgaWYgKHByb2JsZW1EZXRhaWxSZXN1bHQuc3VjY2VzcykgewogICAgICAgICAgdGhyb3cgbmV3IExhcGlzRXJyb3IoCiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgKyBwcm9ibGVtRGV0YWlsUmVzdWx0LmRhdGEuZGV0YWlsLAogICAgICAgICAgICByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgIHByb2JsZW1EZXRhaWxSZXN1bHQuZGF0YSwKICAgICAgICAgICAgcmVxdWVzdGVkRGF0YQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IFVua25vd25MYXBpc0Vycm9yKAogICAgICAgICAgYCR7cmVzcG9uc2Uuc3RhdHVzVGV4dH06ICR7SlNPTi5zdHJpbmdpZnkoanNvbil9YCwKICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgIHJlcXVlc3RlZERhdGEKICAgICAgICApOwogICAgICB9CiAgICAgIHRocm93IG5ldyBVbmtub3duTGFwaXNFcnJvcihgJHtyZXNwb25zZS5zdGF0dXNUZXh0fTogJHtyZXNwb25zZS5zdGF0dXN9YCwgcmVzcG9uc2Uuc3RhdHVzLCByZXF1ZXN0ZWREYXRhKTsKICAgIH0KICB9OwogIGNvbnN0IGFnZ3JlZ2F0ZWRFbmRwb2ludCA9IChsYXBpc1VybCkgPT4gYCR7bGFwaXNVcmx9L3NhbXBsZS9hZ2dyZWdhdGVkYDsKICBjb25zdCBzdWJzdGl0dXRpb25zT3JEZWxldGlvbnNFbmRwb2ludCA9IChsYXBpc1VybCwgc2VxdWVuY2VUeXBlKSA9PiB7CiAgICByZXR1cm4gc2VxdWVuY2VUeXBlID09PSAiYW1pbm8gYWNpZCIgPyBgJHtsYXBpc1VybH0vc2FtcGxlL2FtaW5vQWNpZE11dGF0aW9uc2AgOiBgJHtsYXBpc1VybH0vc2FtcGxlL251Y2xlb3RpZGVNdXRhdGlvbnNgOwogIH07CiAgY2xhc3MgRmV0Y2hBZ2dyZWdhdGVkT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoZmlsdGVyLCBmaWVsZHMgPSBbXSkgewogICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7CiAgICB9CiAgICBhc3luYyBldmFsdWF0ZShsYXBpc1VybCwgc2lnbmFsKSB7CiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRSZXNwb25zZTIgPSAoYXdhaXQgZmV0Y2hBZ2dyZWdhdGVkKAogICAgICAgIGxhcGlzVXJsLAogICAgICAgIHsKICAgICAgICAgIC4uLnRoaXMuZmlsdGVyLAogICAgICAgICAgZmllbGRzOiB0aGlzLmZpZWxkcwogICAgICAgIH0sCiAgICAgICAgc2lnbmFsCiAgICAgICkpLmRhdGE7CiAgICAgIGlmIChpc0ZpZWxkc0FycmF5V2l0aENvdW50KGFnZ3JlZ2F0ZWRSZXNwb25zZTIpKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGNvbnRlbnQ6IGFnZ3JlZ2F0ZWRSZXNwb25zZTIKICAgICAgICB9OwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcigiQWdncmVnYXRlZCByZXNwb25zZSBkb2VzIG5vdCBoYXZlIGNvdW50Iik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGlzRmllbGRzQXJyYXlXaXRoQ291bnQoZGF0YSkgewogICAgcmV0dXJuIGRhdGEuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAib2JqZWN0IiAmJiAiY291bnQiIGluIGl0ZW0gJiYgdHlwZW9mIGl0ZW0uY291bnQgPT09ICJudW1iZXIiKTsKICB9CiAgY2xhc3MgR3JvdXBCeU9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBmaWVsZCwgYWdncmVnYXRlKSB7CiAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICB0aGlzLmFnZ3JlZ2F0ZSA9IGFnZ3JlZ2F0ZTsKICAgIH0KICAgIGFzeW5jIGV2YWx1YXRlKGxhcGlzLCBzaWduYWwpIHsKICAgICAgY29uc3QgY2hpbGRFdmFsdWF0ZWQgPSBhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGxhcGlzLCBzaWduYWwpOwogICAgICBjb25zdCBncm91cGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgZm9yIChjb25zdCByb3cgb2YgY2hpbGRFdmFsdWF0ZWQuY29udGVudCkgewogICAgICAgIGNvbnN0IGtleSA9IHJvd1t0aGlzLmZpZWxkXTsKICAgICAgICBpZiAoIWdyb3VwZWQuaGFzKGtleSkpIHsKICAgICAgICAgIGdyb3VwZWQuc2V0KGtleSwgW10pOwogICAgICAgIH0KICAgICAgICBncm91cGVkLmdldChrZXkpLnB1c2gocm93KTsKICAgICAgfQogICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoKTsKICAgICAgZm9yIChjb25zdCBbLCB2YWx1ZXNdIG9mIGdyb3VwZWQpIHsKICAgICAgICByZXN1bHQucHVzaCh0aGlzLmFnZ3JlZ2F0ZSh2YWx1ZXMpKTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGNvbnRlbnQ6IHJlc3VsdAogICAgICB9OwogICAgfQogIH0KICBjbGFzcyBHcm91cEJ5QW5kU3VtT3BlcmF0b3IgZXh0ZW5kcyBHcm91cEJ5T3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoY2hpbGQsIGdyb3VwQnlGaWVsZCwgc3VtRmllbGQpIHsKICAgICAgc3VwZXIoY2hpbGQsIGdyb3VwQnlGaWVsZCwgKHZhbHVlcykgPT4gewogICAgICAgIGxldCBuID0gMDsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykgewogICAgICAgICAgbiArPSB2YWx1ZVtzdW1GaWVsZF07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBbZ3JvdXBCeUZpZWxkXTogdmFsdWVzWzBdW2dyb3VwQnlGaWVsZF0sCiAgICAgICAgICBbc3VtRmllbGRdOiBuCiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CiAgfQogIGNsYXNzIE1hcE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBmdW5jKSB7CiAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKICAgICAgdGhpcy5mdW5jID0gZnVuYzsKICAgIH0KICAgIGFzeW5jIGV2YWx1YXRlKGxhcGlzLCBzaWduYWwpIHsKICAgICAgY29uc3QgY2hpbGRFdmFsdWF0ZWQgPSBhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGxhcGlzLCBzaWduYWwpOwogICAgICByZXR1cm4gewogICAgICAgIGNvbnRlbnQ6IGNoaWxkRXZhbHVhdGVkLmNvbnRlbnQubWFwKHRoaXMuZnVuYykKICAgICAgfTsKICAgIH0KICB9CiAgY2xhc3MgUmVuYW1lRmllbGRPcGVyYXRvciBleHRlbmRzIE1hcE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBvbGRGaWVsZE5hbWUsIG5ld0ZpZWxkTmFtZSkgewogICAgICBzdXBlcigKICAgICAgICBjaGlsZCwKICAgICAgICAodmFsdWUpID0+ICh7CiAgICAgICAgICAuLi52YWx1ZSwKICAgICAgICAgIFtuZXdGaWVsZE5hbWVdOiB2YWx1ZVtvbGRGaWVsZE5hbWVdCiAgICAgICAgfSkKICAgICAgKTsKICAgIH0KICB9CiAgY2xhc3MgU29ydE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBjb21wYXJlRm4pIHsKICAgICAgdGhpcy5jaGlsZCA9IGNoaWxkOwogICAgICB0aGlzLmNvbXBhcmVGbiA9IGNvbXBhcmVGbjsKICAgIH0KICAgIGFzeW5jIGV2YWx1YXRlKGxhcGlzLCBzaWduYWwpIHsKICAgICAgY29uc3QgY2hpbGRFdmFsdWF0ZWQgPSBhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGxhcGlzLCBzaWduYWwpOwogICAgICByZXR1cm4gewogICAgICAgIGNvbnRlbnQ6IGNoaWxkRXZhbHVhdGVkLmNvbnRlbnQuc29ydCh0aGlzLmNvbXBhcmVGbikKICAgICAgfTsKICAgIH0KICB9CiAgdmFyIFNFQ09ORFNfQV9NSU5VVEUgPSA2MDsKICB2YXIgU0VDT05EU19BX0hPVVIgPSBTRUNPTkRTX0FfTUlOVVRFICogNjA7CiAgdmFyIFNFQ09ORFNfQV9EQVkgPSBTRUNPTkRTX0FfSE9VUiAqIDI0OwogIHZhciBTRUNPTkRTX0FfV0VFSyA9IFNFQ09ORFNfQV9EQVkgKiA3OwogIHZhciBNSUxMSVNFQ09ORFNfQV9TRUNPTkQgPSAxZTM7CiAgdmFyIE1JTExJU0VDT05EU19BX01JTlVURSA9IFNFQ09ORFNfQV9NSU5VVEUgKiBNSUxMSVNFQ09ORFNfQV9TRUNPTkQ7CiAgdmFyIE1JTExJU0VDT05EU19BX0hPVVIgPSBTRUNPTkRTX0FfSE9VUiAqIE1JTExJU0VDT05EU19BX1NFQ09ORDsKICB2YXIgTUlMTElTRUNPTkRTX0FfREFZID0gU0VDT05EU19BX0RBWSAqIE1JTExJU0VDT05EU19BX1NFQ09ORDsKICB2YXIgTUlMTElTRUNPTkRTX0FfV0VFSyA9IFNFQ09ORFNfQV9XRUVLICogTUlMTElTRUNPTkRTX0FfU0VDT05EOwogIHZhciBNUyA9ICJtaWxsaXNlY29uZCI7CiAgdmFyIFMgPSAic2Vjb25kIjsKICB2YXIgTUlOID0gIm1pbnV0ZSI7CiAgdmFyIEggPSAiaG91ciI7CiAgdmFyIEQgPSAiZGF5IjsKICB2YXIgVyA9ICJ3ZWVrIjsKICB2YXIgTSA9ICJtb250aCI7CiAgdmFyIFEgPSAicXVhcnRlciI7CiAgdmFyIFkgPSAieWVhciI7CiAgdmFyIERBVEUgPSAiZGF0ZSI7CiAgdmFyIEZPUk1BVF9ERUZBVUxUID0gIllZWVktTU0tRERUSEg6bW06c3NaIjsKICB2YXIgSU5WQUxJRF9EQVRFX1NUUklORyA9ICJJbnZhbGlkIERhdGUiOwogIHZhciBSRUdFWF9QQVJTRSA9IC9eKFxkezR9KVstL10/KFxkezEsMn0pP1stL10/KFxkezAsMn0pW1R0XHNdKihcZHsxLDJ9KT86PyhcZHsxLDJ9KT86PyhcZHsxLDJ9KT9bLjpdPyhcZCspPyQvOwogIHZhciBSRUdFWF9GT1JNQVQgPSAvXFsoW15cXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nOwogIHZhciBlbiA9IHsKICAgIG5hbWU6ICJlbiIsCiAgICB3ZWVrZGF5czogIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLAogICAgbW9udGhzOiAiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSwKICAgIG9yZGluYWw6IGZ1bmN0aW9uIG9yZGluYWwobikgewogICAgICB2YXIgczIgPSBbInRoIiwgInN0IiwgIm5kIiwgInJkIl07CiAgICAgIHZhciB2MiA9IG4gJSAxMDA7CiAgICAgIHJldHVybiAiWyIgKyBuICsgKHMyWyh2MiAtIDIwKSAlIDEwXSB8fCBzMlt2Ml0gfHwgczJbMF0pICsgIl0iOwogICAgfQogIH07CiAgdmFyIHBhZFN0YXJ0ID0gZnVuY3Rpb24gcGFkU3RhcnQyKHN0cmluZywgbGVuZ3RoLCBwYWQpIHsKICAgIHZhciBzMiA9IFN0cmluZyhzdHJpbmcpOwogICAgaWYgKCFzMiB8fCBzMi5sZW5ndGggPj0gbGVuZ3RoKSByZXR1cm4gc3RyaW5nOwogICAgcmV0dXJuICIiICsgQXJyYXkobGVuZ3RoICsgMSAtIHMyLmxlbmd0aCkuam9pbihwYWQpICsgc3RyaW5nOwogIH07CiAgdmFyIHBhZFpvbmVTdHIgPSBmdW5jdGlvbiBwYWRab25lU3RyMihpbnN0YW5jZSkgewogICAgdmFyIG5lZ01pbnV0ZXMgPSAtaW5zdGFuY2UudXRjT2Zmc2V0KCk7CiAgICB2YXIgbWludXRlcyA9IE1hdGguYWJzKG5lZ01pbnV0ZXMpOwogICAgdmFyIGhvdXJPZmZzZXQgPSBNYXRoLmZsb29yKG1pbnV0ZXMgLyA2MCk7CiAgICB2YXIgbWludXRlT2Zmc2V0ID0gbWludXRlcyAlIDYwOwogICAgcmV0dXJuIChuZWdNaW51dGVzIDw9IDAgPyAiKyIgOiAiLSIpICsgcGFkU3RhcnQoaG91ck9mZnNldCwgMiwgIjAiKSArICI6IiArIHBhZFN0YXJ0KG1pbnV0ZU9mZnNldCwgMiwgIjAiKTsKICB9OwogIHZhciBtb250aERpZmYgPSBmdW5jdGlvbiBtb250aERpZmYyKGEyLCBiKSB7CiAgICBpZiAoYTIuZGF0ZSgpIDwgYi5kYXRlKCkpIHJldHVybiAtbW9udGhEaWZmMihiLCBhMik7CiAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoYi55ZWFyKCkgLSBhMi55ZWFyKCkpICogMTIgKyAoYi5tb250aCgpIC0gYTIubW9udGgoKSk7CiAgICB2YXIgYW5jaG9yID0gYTIuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYsIE0pOwogICAgdmFyIGMyID0gYiAtIGFuY2hvciA8IDA7CiAgICB2YXIgYW5jaG9yMiA9IGEyLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmICsgKGMyID8gLTEgOiAxKSwgTSk7CiAgICByZXR1cm4gKygtKHdob2xlTW9udGhEaWZmICsgKGIgLSBhbmNob3IpIC8gKGMyID8gYW5jaG9yIC0gYW5jaG9yMiA6IGFuY2hvcjIgLSBhbmNob3IpKSB8fCAwKTsKICB9OwogIHZhciBhYnNGbG9vciA9IGZ1bmN0aW9uIGFic0Zsb29yMihuKSB7CiAgICByZXR1cm4gbiA8IDAgPyBNYXRoLmNlaWwobikgfHwgMCA6IE1hdGguZmxvb3Iobik7CiAgfTsKICB2YXIgcHJldHR5VW5pdCA9IGZ1bmN0aW9uIHByZXR0eVVuaXQyKHUyKSB7CiAgICB2YXIgc3BlY2lhbCA9IHsKICAgICAgTSwKICAgICAgeTogWSwKICAgICAgdzogVywKICAgICAgZDogRCwKICAgICAgRDogREFURSwKICAgICAgaDogSCwKICAgICAgbTogTUlOLAogICAgICBzOiBTLAogICAgICBtczogTVMsCiAgICAgIFEKICAgIH07CiAgICByZXR1cm4gc3BlY2lhbFt1Ml0gfHwgU3RyaW5nKHUyIHx8ICIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywgIiIpOwogIH07CiAgdmFyIGlzVW5kZWZpbmVkID0gZnVuY3Rpb24gaXNVbmRlZmluZWQyKHMyKSB7CiAgICByZXR1cm4gczIgPT09IHZvaWQgMDsKICB9OwogIHZhciBVID0gewogICAgczogcGFkU3RhcnQsCiAgICB6OiBwYWRab25lU3RyLAogICAgbTogbW9udGhEaWZmLAogICAgYTogYWJzRmxvb3IsCiAgICBwOiBwcmV0dHlVbml0LAogICAgdTogaXNVbmRlZmluZWQKICB9OwogIHZhciBMID0gImVuIjsKICB2YXIgTHMgPSB7fTsKICBMc1tMXSA9IGVuOwogIHZhciBJU19EQVlKUyA9ICIkaXNEYXlqc09iamVjdCI7CiAgdmFyIGlzRGF5anMgPSBmdW5jdGlvbiBpc0RheWpzMihkKSB7CiAgICByZXR1cm4gZCBpbnN0YW5jZW9mIERheWpzIHx8ICEhKGQgJiYgZFtJU19EQVlKU10pOwogIH07CiAgdmFyIHBhcnNlTG9jYWxlID0gZnVuY3Rpb24gcGFyc2VMb2NhbGUyKHByZXNldCwgb2JqZWN0LCBpc0xvY2FsKSB7CiAgICB2YXIgbDI7CiAgICBpZiAoIXByZXNldCkgcmV0dXJuIEw7CiAgICBpZiAodHlwZW9mIHByZXNldCA9PT0gInN0cmluZyIpIHsKICAgICAgdmFyIHByZXNldExvd2VyID0gcHJlc2V0LnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChMc1twcmVzZXRMb3dlcl0pIHsKICAgICAgICBsMiA9IHByZXNldExvd2VyOwogICAgICB9CiAgICAgIGlmIChvYmplY3QpIHsKICAgICAgICBMc1twcmVzZXRMb3dlcl0gPSBvYmplY3Q7CiAgICAgICAgbDIgPSBwcmVzZXRMb3dlcjsKICAgICAgfQogICAgICB2YXIgcHJlc2V0U3BsaXQgPSBwcmVzZXQuc3BsaXQoIi0iKTsKICAgICAgaWYgKCFsMiAmJiBwcmVzZXRTcGxpdC5sZW5ndGggPiAxKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTG9jYWxlMihwcmVzZXRTcGxpdFswXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBuYW1lID0gcHJlc2V0Lm5hbWU7CiAgICAgIExzW25hbWVdID0gcHJlc2V0OwogICAgICBsMiA9IG5hbWU7CiAgICB9CiAgICBpZiAoIWlzTG9jYWwgJiYgbDIpIEwgPSBsMjsKICAgIHJldHVybiBsMiB8fCAhaXNMb2NhbCAmJiBMOwogIH07CiAgdmFyIGRheWpzID0gZnVuY3Rpb24gZGF5anMyKGRhdGUsIGMyKSB7CiAgICBpZiAoaXNEYXlqcyhkYXRlKSkgewogICAgICByZXR1cm4gZGF0ZS5jbG9uZSgpOwogICAgfQogICAgdmFyIGNmZyA9IHR5cGVvZiBjMiA9PT0gIm9iamVjdCIgPyBjMiA6IHt9OwogICAgY2ZnLmRhdGUgPSBkYXRlOwogICAgY2ZnLmFyZ3MgPSBhcmd1bWVudHM7CiAgICByZXR1cm4gbmV3IERheWpzKGNmZyk7CiAgfTsKICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uIHdyYXBwZXIyKGRhdGUsIGluc3RhbmNlKSB7CiAgICByZXR1cm4gZGF5anMoZGF0ZSwgewogICAgICBsb2NhbGU6IGluc3RhbmNlLiRMLAogICAgICB1dGM6IGluc3RhbmNlLiR1LAogICAgICB4OiBpbnN0YW5jZS4keCwKICAgICAgJG9mZnNldDogaW5zdGFuY2UuJG9mZnNldAogICAgICAvLyB0b2RvOiByZWZhY3RvcjsgZG8gbm90IHVzZSB0aGlzLiRvZmZzZXQgaW4geW91IGNvZGUKICAgIH0pOwogIH07CiAgdmFyIFV0aWxzID0gVTsKICBVdGlscy5sID0gcGFyc2VMb2NhbGU7CiAgVXRpbHMuaSA9IGlzRGF5anM7CiAgVXRpbHMudyA9IHdyYXBwZXI7CiAgdmFyIHBhcnNlRGF0ZSA9IGZ1bmN0aW9uIHBhcnNlRGF0ZTIoY2ZnKSB7CiAgICB2YXIgZGF0ZSA9IGNmZy5kYXRlLCB1dGMgPSBjZmcudXRjOwogICAgaWYgKGRhdGUgPT09IG51bGwpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTsKICAgIGlmIChVdGlscy51KGRhdGUpKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZShkYXRlKTsKICAgIGlmICh0eXBlb2YgZGF0ZSA9PT0gInN0cmluZyIgJiYgIS9aJC9pLnRlc3QoZGF0ZSkpIHsKICAgICAgdmFyIGQgPSBkYXRlLm1hdGNoKFJFR0VYX1BBUlNFKTsKICAgICAgaWYgKGQpIHsKICAgICAgICB2YXIgbTIgPSBkWzJdIC0gMSB8fCAwOwogICAgICAgIHZhciBtcyA9IChkWzddIHx8ICIwIikuc3Vic3RyaW5nKDAsIDMpOwogICAgICAgIGlmICh1dGMpIHsKICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkWzFdLCBtMiwgZFszXSB8fCAxLCBkWzRdIHx8IDAsIGRbNV0gfHwgMCwgZFs2XSB8fCAwLCBtcykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IERhdGUoZFsxXSwgbTIsIGRbM10gfHwgMSwgZFs0XSB8fCAwLCBkWzVdIHx8IDAsIGRbNl0gfHwgMCwgbXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSk7CiAgfTsKICB2YXIgRGF5anMgPSAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBEYXlqczIoY2ZnKSB7CiAgICAgIHRoaXMuJEwgPSBwYXJzZUxvY2FsZShjZmcubG9jYWxlLCBudWxsLCB0cnVlKTsKICAgICAgdGhpcy5wYXJzZShjZmcpOwogICAgICB0aGlzLiR4ID0gdGhpcy4keCB8fCBjZmcueCB8fCB7fTsKICAgICAgdGhpc1tJU19EQVlKU10gPSB0cnVlOwogICAgfQogICAgdmFyIF9wcm90byA9IERheWpzMi5wcm90b3R5cGU7CiAgICBfcHJvdG8ucGFyc2UgPSBmdW5jdGlvbiBwYXJzZShjZmcpIHsKICAgICAgdGhpcy4kZCA9IHBhcnNlRGF0ZShjZmcpOwogICAgICB0aGlzLmluaXQoKTsKICAgIH07CiAgICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgIHZhciAkZCA9IHRoaXMuJGQ7CiAgICAgIHRoaXMuJHkgPSAkZC5nZXRGdWxsWWVhcigpOwogICAgICB0aGlzLiRNID0gJGQuZ2V0TW9udGgoKTsKICAgICAgdGhpcy4kRCA9ICRkLmdldERhdGUoKTsKICAgICAgdGhpcy4kVyA9ICRkLmdldERheSgpOwogICAgICB0aGlzLiRIID0gJGQuZ2V0SG91cnMoKTsKICAgICAgdGhpcy4kbSA9ICRkLmdldE1pbnV0ZXMoKTsKICAgICAgdGhpcy4kcyA9ICRkLmdldFNlY29uZHMoKTsKICAgICAgdGhpcy4kbXMgPSAkZC5nZXRNaWxsaXNlY29uZHMoKTsKICAgIH07CiAgICBfcHJvdG8uJHV0aWxzID0gZnVuY3Rpb24gJHV0aWxzKCkgewogICAgICByZXR1cm4gVXRpbHM7CiAgICB9OwogICAgX3Byb3RvLmlzVmFsaWQgPSBmdW5jdGlvbiBpc1ZhbGlkMigpIHsKICAgICAgcmV0dXJuICEodGhpcy4kZC50b1N0cmluZygpID09PSBJTlZBTElEX0RBVEVfU1RSSU5HKTsKICAgIH07CiAgICBfcHJvdG8uaXNTYW1lID0gZnVuY3Rpb24gaXNTYW1lKHRoYXQsIHVuaXRzKSB7CiAgICAgIHZhciBvdGhlciA9IGRheWpzKHRoYXQpOwogICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXRzKSA8PSBvdGhlciAmJiBvdGhlciA8PSB0aGlzLmVuZE9mKHVuaXRzKTsKICAgIH07CiAgICBfcHJvdG8uaXNBZnRlciA9IGZ1bmN0aW9uIGlzQWZ0ZXIodGhhdCwgdW5pdHMpIHsKICAgICAgcmV0dXJuIGRheWpzKHRoYXQpIDwgdGhpcy5zdGFydE9mKHVuaXRzKTsKICAgIH07CiAgICBfcHJvdG8uaXNCZWZvcmUgPSBmdW5jdGlvbiBpc0JlZm9yZSh0aGF0LCB1bml0cykgewogICAgICByZXR1cm4gdGhpcy5lbmRPZih1bml0cykgPCBkYXlqcyh0aGF0KTsKICAgIH07CiAgICBfcHJvdG8uJGcgPSBmdW5jdGlvbiAkZyhpbnB1dCwgZ2V0LCBzZXQpIHsKICAgICAgaWYgKFV0aWxzLnUoaW5wdXQpKSByZXR1cm4gdGhpc1tnZXRdOwogICAgICByZXR1cm4gdGhpcy5zZXQoc2V0LCBpbnB1dCk7CiAgICB9OwogICAgX3Byb3RvLnVuaXggPSBmdW5jdGlvbiB1bml4KCkgewogICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDFlMyk7CiAgICB9OwogICAgX3Byb3RvLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkgewogICAgICByZXR1cm4gdGhpcy4kZC5nZXRUaW1lKCk7CiAgICB9OwogICAgX3Byb3RvLnN0YXJ0T2YgPSBmdW5jdGlvbiBzdGFydE9mKHVuaXRzLCBfc3RhcnRPZikgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgaXNTdGFydE9mID0gIVV0aWxzLnUoX3N0YXJ0T2YpID8gX3N0YXJ0T2YgOiB0cnVlOwogICAgICB2YXIgdW5pdCA9IFV0aWxzLnAodW5pdHMpOwogICAgICB2YXIgaW5zdGFuY2VGYWN0b3J5ID0gZnVuY3Rpb24gaW5zdGFuY2VGYWN0b3J5MihkLCBtMikgewogICAgICAgIHZhciBpbnMgPSBVdGlscy53KF90aGlzLiR1ID8gRGF0ZS5VVEMoX3RoaXMuJHksIG0yLCBkKSA6IG5ldyBEYXRlKF90aGlzLiR5LCBtMiwgZCksIF90aGlzKTsKICAgICAgICByZXR1cm4gaXNTdGFydE9mID8gaW5zIDogaW5zLmVuZE9mKEQpOwogICAgICB9OwogICAgICB2YXIgaW5zdGFuY2VGYWN0b3J5U2V0ID0gZnVuY3Rpb24gaW5zdGFuY2VGYWN0b3J5U2V0MihtZXRob2QsIHNsaWNlKSB7CiAgICAgICAgdmFyIGFyZ3VtZW50U3RhcnQgPSBbMCwgMCwgMCwgMF07CiAgICAgICAgdmFyIGFyZ3VtZW50RW5kID0gWzIzLCA1OSwgNTksIDk5OV07CiAgICAgICAgcmV0dXJuIFV0aWxzLncoX3RoaXMudG9EYXRlKClbbWV0aG9kXS5hcHBseSgKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXNwcmVhZAogICAgICAgICAgX3RoaXMudG9EYXRlKCJzIiksCiAgICAgICAgICAoaXNTdGFydE9mID8gYXJndW1lbnRTdGFydCA6IGFyZ3VtZW50RW5kKS5zbGljZShzbGljZSkKICAgICAgICApLCBfdGhpcyk7CiAgICAgIH07CiAgICAgIHZhciAkVyA9IHRoaXMuJFcsICRNID0gdGhpcy4kTSwgJEQgPSB0aGlzLiREOwogICAgICB2YXIgdXRjUGFkID0gInNldCIgKyAodGhpcy4kdSA/ICJVVEMiIDogIiIpOwogICAgICBzd2l0Y2ggKHVuaXQpIHsKICAgICAgICBjYXNlIFk6CiAgICAgICAgICByZXR1cm4gaXNTdGFydE9mID8gaW5zdGFuY2VGYWN0b3J5KDEsIDApIDogaW5zdGFuY2VGYWN0b3J5KDMxLCAxMSk7CiAgICAgICAgY2FzZSBNOgogICAgICAgICAgcmV0dXJuIGlzU3RhcnRPZiA/IGluc3RhbmNlRmFjdG9yeSgxLCAkTSkgOiBpbnN0YW5jZUZhY3RvcnkoMCwgJE0gKyAxKTsKICAgICAgICBjYXNlIFc6IHsKICAgICAgICAgIHZhciB3ZWVrU3RhcnQgPSB0aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnQgfHwgMDsKICAgICAgICAgIHZhciBnYXAgPSAoJFcgPCB3ZWVrU3RhcnQgPyAkVyArIDcgOiAkVykgLSB3ZWVrU3RhcnQ7CiAgICAgICAgICByZXR1cm4gaW5zdGFuY2VGYWN0b3J5KGlzU3RhcnRPZiA/ICREIC0gZ2FwIDogJEQgKyAoNiAtIGdhcCksICRNKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBEOgogICAgICAgIGNhc2UgREFURToKICAgICAgICAgIHJldHVybiBpbnN0YW5jZUZhY3RvcnlTZXQodXRjUGFkICsgIkhvdXJzIiwgMCk7CiAgICAgICAgY2FzZSBIOgogICAgICAgICAgcmV0dXJuIGluc3RhbmNlRmFjdG9yeVNldCh1dGNQYWQgKyAiTWludXRlcyIsIDEpOwogICAgICAgIGNhc2UgTUlOOgogICAgICAgICAgcmV0dXJuIGluc3RhbmNlRmFjdG9yeVNldCh1dGNQYWQgKyAiU2Vjb25kcyIsIDIpOwogICAgICAgIGNhc2UgUzoKICAgICAgICAgIHJldHVybiBpbnN0YW5jZUZhY3RvcnlTZXQodXRjUGFkICsgIk1pbGxpc2Vjb25kcyIsIDMpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpOwogICAgICB9CiAgICB9OwogICAgX3Byb3RvLmVuZE9mID0gZnVuY3Rpb24gZW5kT2YoYXJnKSB7CiAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YoYXJnLCBmYWxzZSk7CiAgICB9OwogICAgX3Byb3RvLiRzZXQgPSBmdW5jdGlvbiAkc2V0KHVuaXRzLCBfaW50KSB7CiAgICAgIHZhciBfQyREJEMkREFURSRDJE0kQyRZJEM7CiAgICAgIHZhciB1bml0ID0gVXRpbHMucCh1bml0cyk7CiAgICAgIHZhciB1dGNQYWQgPSAic2V0IiArICh0aGlzLiR1ID8gIlVUQyIgOiAiIik7CiAgICAgIHZhciBuYW1lID0gKF9DJEQkQyREQVRFJEMkTSRDJFkkQyA9IHt9LCBfQyREJEMkREFURSRDJE0kQyRZJENbRF0gPSB1dGNQYWQgKyAiRGF0ZSIsIF9DJEQkQyREQVRFJEMkTSRDJFkkQ1tEQVRFXSA9IHV0Y1BhZCArICJEYXRlIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW01dID0gdXRjUGFkICsgIk1vbnRoIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW1ldID0gdXRjUGFkICsgIkZ1bGxZZWFyIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW0hdID0gdXRjUGFkICsgIkhvdXJzIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW01JTl0gPSB1dGNQYWQgKyAiTWludXRlcyIsIF9DJEQkQyREQVRFJEMkTSRDJFkkQ1tTXSA9IHV0Y1BhZCArICJTZWNvbmRzIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW01TXSA9IHV0Y1BhZCArICJNaWxsaXNlY29uZHMiLCBfQyREJEMkREFURSRDJE0kQyRZJEMpW3VuaXRdOwogICAgICB2YXIgYXJnID0gdW5pdCA9PT0gRCA/IHRoaXMuJEQgKyAoX2ludCAtIHRoaXMuJFcpIDogX2ludDsKICAgICAgaWYgKHVuaXQgPT09IE0gfHwgdW5pdCA9PT0gWSkgewogICAgICAgIHZhciBkYXRlID0gdGhpcy5jbG9uZSgpLnNldChEQVRFLCAxKTsKICAgICAgICBkYXRlLiRkW25hbWVdKGFyZyk7CiAgICAgICAgZGF0ZS5pbml0KCk7CiAgICAgICAgdGhpcy4kZCA9IGRhdGUuc2V0KERBVEUsIE1hdGgubWluKHRoaXMuJEQsIGRhdGUuZGF5c0luTW9udGgoKSkpLiRkOwogICAgICB9IGVsc2UgaWYgKG5hbWUpIHRoaXMuJGRbbmFtZV0oYXJnKTsKICAgICAgdGhpcy5pbml0KCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIF9wcm90by5zZXQgPSBmdW5jdGlvbiBzZXQoc3RyaW5nLCBfaW50MikgewogICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLiRzZXQoc3RyaW5nLCBfaW50Mik7CiAgICB9OwogICAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldCh1bml0KSB7CiAgICAgIHJldHVybiB0aGlzW1V0aWxzLnAodW5pdCldKCk7CiAgICB9OwogICAgX3Byb3RvLmFkZCA9IGZ1bmN0aW9uIGFkZChudW1iZXIsIHVuaXRzKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzLCBfQyRNSU4kQyRIJEMkUyR1bml0OwogICAgICBudW1iZXIgPSBOdW1iZXIobnVtYmVyKTsKICAgICAgdmFyIHVuaXQgPSBVdGlscy5wKHVuaXRzKTsKICAgICAgdmFyIGluc3RhbmNlRmFjdG9yeVNldCA9IGZ1bmN0aW9uIGluc3RhbmNlRmFjdG9yeVNldDIobikgewogICAgICAgIHZhciBkID0gZGF5anMoX3RoaXMyKTsKICAgICAgICByZXR1cm4gVXRpbHMudyhkLmRhdGUoZC5kYXRlKCkgKyBNYXRoLnJvdW5kKG4gKiBudW1iZXIpKSwgX3RoaXMyKTsKICAgICAgfTsKICAgICAgaWYgKHVuaXQgPT09IE0pIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXQoTSwgdGhpcy4kTSArIG51bWJlcik7CiAgICAgIH0KICAgICAgaWYgKHVuaXQgPT09IFkpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXQoWSwgdGhpcy4keSArIG51bWJlcik7CiAgICAgIH0KICAgICAgaWYgKHVuaXQgPT09IEQpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2VGYWN0b3J5U2V0KDEpOwogICAgICB9CiAgICAgIGlmICh1bml0ID09PSBXKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlRmFjdG9yeVNldCg3KTsKICAgICAgfQogICAgICB2YXIgc3RlcCA9IChfQyRNSU4kQyRIJEMkUyR1bml0ID0ge30sIF9DJE1JTiRDJEgkQyRTJHVuaXRbTUlOXSA9IE1JTExJU0VDT05EU19BX01JTlVURSwgX0MkTUlOJEMkSCRDJFMkdW5pdFtIXSA9IE1JTExJU0VDT05EU19BX0hPVVIsIF9DJE1JTiRDJEgkQyRTJHVuaXRbU10gPSBNSUxMSVNFQ09ORFNfQV9TRUNPTkQsIF9DJE1JTiRDJEgkQyRTJHVuaXQpW3VuaXRdIHx8IDE7CiAgICAgIHZhciBuZXh0VGltZVN0YW1wID0gdGhpcy4kZC5nZXRUaW1lKCkgKyBudW1iZXIgKiBzdGVwOwogICAgICByZXR1cm4gVXRpbHMudyhuZXh0VGltZVN0YW1wLCB0aGlzKTsKICAgIH07CiAgICBfcHJvdG8uc3VidHJhY3QgPSBmdW5jdGlvbiBzdWJ0cmFjdChudW1iZXIsIHN0cmluZykgewogICAgICByZXR1cm4gdGhpcy5hZGQobnVtYmVyICogLTEsIHN0cmluZyk7CiAgICB9OwogICAgX3Byb3RvLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChmb3JtYXRTdHIpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgIHZhciBsb2NhbGUgPSB0aGlzLiRsb2NhbGUoKTsKICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgcmV0dXJuIGxvY2FsZS5pbnZhbGlkRGF0ZSB8fCBJTlZBTElEX0RBVEVfU1RSSU5HOwogICAgICB2YXIgc3RyID0gZm9ybWF0U3RyIHx8IEZPUk1BVF9ERUZBVUxUOwogICAgICB2YXIgem9uZVN0ciA9IFV0aWxzLnoodGhpcyk7CiAgICAgIHZhciAkSCA9IHRoaXMuJEgsICRtID0gdGhpcy4kbSwgJE0gPSB0aGlzLiRNOwogICAgICB2YXIgd2Vla2RheXMgPSBsb2NhbGUud2Vla2RheXMsIG1vbnRocyA9IGxvY2FsZS5tb250aHMsIG1lcmlkaWVtID0gbG9jYWxlLm1lcmlkaWVtOwogICAgICB2YXIgZ2V0U2hvcnQgPSBmdW5jdGlvbiBnZXRTaG9ydDIoYXJyLCBpbmRleCwgZnVsbCwgbGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGFyciAmJiAoYXJyW2luZGV4XSB8fCBhcnIoX3RoaXMzLCBzdHIpKSB8fCBmdWxsW2luZGV4XS5zbGljZSgwLCBsZW5ndGgpOwogICAgICB9OwogICAgICB2YXIgZ2V0JEggPSBmdW5jdGlvbiBnZXQkSDIobnVtKSB7CiAgICAgICAgcmV0dXJuIFV0aWxzLnMoJEggJSAxMiB8fCAxMiwgbnVtLCAiMCIpOwogICAgICB9OwogICAgICB2YXIgbWVyaWRpZW1GdW5jID0gbWVyaWRpZW0gfHwgZnVuY3Rpb24oaG91ciwgbWludXRlLCBpc0xvd2VyY2FzZSkgewogICAgICAgIHZhciBtMiA9IGhvdXIgPCAxMiA/ICJBTSIgOiAiUE0iOwogICAgICAgIHJldHVybiBpc0xvd2VyY2FzZSA/IG0yLnRvTG93ZXJDYXNlKCkgOiBtMjsKICAgICAgfTsKICAgICAgdmFyIG1hdGNoZXMgPSBmdW5jdGlvbiBtYXRjaGVzMihtYXRjaCkgewogICAgICAgIHN3aXRjaCAobWF0Y2gpIHsKICAgICAgICAgIGNhc2UgIllZIjoKICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhfdGhpczMuJHkpLnNsaWNlKC0yKTsKICAgICAgICAgIGNhc2UgIllZWVkiOgogICAgICAgICAgICByZXR1cm4gVXRpbHMucyhfdGhpczMuJHksIDQsICIwIik7CiAgICAgICAgICBjYXNlICJNIjoKICAgICAgICAgICAgcmV0dXJuICRNICsgMTsKICAgICAgICAgIGNhc2UgIk1NIjoKICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnMoJE0gKyAxLCAyLCAiMCIpOwogICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgcmV0dXJuIGdldFNob3J0KGxvY2FsZS5tb250aHNTaG9ydCwgJE0sIG1vbnRocywgMyk7CiAgICAgICAgICBjYXNlICJNTU1NIjoKICAgICAgICAgICAgcmV0dXJuIGdldFNob3J0KG1vbnRocywgJE0pOwogICAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICAgIHJldHVybiBfdGhpczMuJEQ7CiAgICAgICAgICBjYXNlICJERCI6CiAgICAgICAgICAgIHJldHVybiBVdGlscy5zKF90aGlzMy4kRCwgMiwgIjAiKTsKICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICByZXR1cm4gU3RyaW5nKF90aGlzMy4kVyk7CiAgICAgICAgICBjYXNlICJkZCI6CiAgICAgICAgICAgIHJldHVybiBnZXRTaG9ydChsb2NhbGUud2Vla2RheXNNaW4sIF90aGlzMy4kVywgd2Vla2RheXMsIDIpOwogICAgICAgICAgY2FzZSAiZGRkIjoKICAgICAgICAgICAgcmV0dXJuIGdldFNob3J0KGxvY2FsZS53ZWVrZGF5c1Nob3J0LCBfdGhpczMuJFcsIHdlZWtkYXlzLCAzKTsKICAgICAgICAgIGNhc2UgImRkZGQiOgogICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbX3RoaXMzLiRXXTsKICAgICAgICAgIGNhc2UgIkgiOgogICAgICAgICAgICByZXR1cm4gU3RyaW5nKCRIKTsKICAgICAgICAgIGNhc2UgIkhIIjoKICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnMoJEgsIDIsICIwIik7CiAgICAgICAgICBjYXNlICJoIjoKICAgICAgICAgICAgcmV0dXJuIGdldCRIKDEpOwogICAgICAgICAgY2FzZSAiaGgiOgogICAgICAgICAgICByZXR1cm4gZ2V0JEgoMik7CiAgICAgICAgICBjYXNlICJhIjoKICAgICAgICAgICAgcmV0dXJuIG1lcmlkaWVtRnVuYygkSCwgJG0sIHRydWUpOwogICAgICAgICAgY2FzZSAiQSI6CiAgICAgICAgICAgIHJldHVybiBtZXJpZGllbUZ1bmMoJEgsICRtLCBmYWxzZSk7CiAgICAgICAgICBjYXNlICJtIjoKICAgICAgICAgICAgcmV0dXJuIFN0cmluZygkbSk7CiAgICAgICAgICBjYXNlICJtbSI6CiAgICAgICAgICAgIHJldHVybiBVdGlscy5zKCRtLCAyLCAiMCIpOwogICAgICAgICAgY2FzZSAicyI6CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoX3RoaXMzLiRzKTsKICAgICAgICAgIGNhc2UgInNzIjoKICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnMoX3RoaXMzLiRzLCAyLCAiMCIpOwogICAgICAgICAgY2FzZSAiU1NTIjoKICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnMoX3RoaXMzLiRtcywgMywgIjAiKTsKICAgICAgICAgIGNhc2UgIloiOgogICAgICAgICAgICByZXR1cm4gem9uZVN0cjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH07CiAgICAgIHJldHVybiBzdHIucmVwbGFjZShSRUdFWF9GT1JNQVQsIGZ1bmN0aW9uKG1hdGNoLCAkMSkgewogICAgICAgIHJldHVybiAkMSB8fCBtYXRjaGVzKG1hdGNoKSB8fCB6b25lU3RyLnJlcGxhY2UoIjoiLCAiIik7CiAgICAgIH0pOwogICAgfTsKICAgIF9wcm90by51dGNPZmZzZXQgPSBmdW5jdGlvbiB1dGNPZmZzZXQoKSB7CiAgICAgIHJldHVybiAtTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSkgKiAxNTsKICAgIH07CiAgICBfcHJvdG8uZGlmZiA9IGZ1bmN0aW9uIGRpZmYoaW5wdXQsIHVuaXRzLCBfZmxvYXQpIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgIHZhciB1bml0ID0gVXRpbHMucCh1bml0cyk7CiAgICAgIHZhciB0aGF0ID0gZGF5anMoaW5wdXQpOwogICAgICB2YXIgem9uZURlbHRhID0gKHRoYXQudXRjT2Zmc2V0KCkgLSB0aGlzLnV0Y09mZnNldCgpKSAqIE1JTExJU0VDT05EU19BX01JTlVURTsKICAgICAgdmFyIGRpZmYyID0gdGhpcyAtIHRoYXQ7CiAgICAgIHZhciBnZXRNb250aCA9IGZ1bmN0aW9uIGdldE1vbnRoMigpIHsKICAgICAgICByZXR1cm4gVXRpbHMubShfdGhpczQsIHRoYXQpOwogICAgICB9OwogICAgICB2YXIgcmVzdWx0OwogICAgICBzd2l0Y2ggKHVuaXQpIHsKICAgICAgICBjYXNlIFk6CiAgICAgICAgICByZXN1bHQgPSBnZXRNb250aCgpIC8gMTI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE06CiAgICAgICAgICByZXN1bHQgPSBnZXRNb250aCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBROgogICAgICAgICAgcmVzdWx0ID0gZ2V0TW9udGgoKSAvIDM7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFc6CiAgICAgICAgICByZXN1bHQgPSAoZGlmZjIgLSB6b25lRGVsdGEpIC8gTUlMTElTRUNPTkRTX0FfV0VFSzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRDoKICAgICAgICAgIHJlc3VsdCA9IChkaWZmMiAtIHpvbmVEZWx0YSkgLyBNSUxMSVNFQ09ORFNfQV9EQVk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEg6CiAgICAgICAgICByZXN1bHQgPSBkaWZmMiAvIE1JTExJU0VDT05EU19BX0hPVVI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JTjoKICAgICAgICAgIHJlc3VsdCA9IGRpZmYyIC8gTUlMTElTRUNPTkRTX0FfTUlOVVRFOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTOgogICAgICAgICAgcmVzdWx0ID0gZGlmZjIgLyBNSUxMSVNFQ09ORFNfQV9TRUNPTkQ7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmVzdWx0ID0gZGlmZjI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICByZXR1cm4gX2Zsb2F0ID8gcmVzdWx0IDogVXRpbHMuYShyZXN1bHQpOwogICAgfTsKICAgIF9wcm90by5kYXlzSW5Nb250aCA9IGZ1bmN0aW9uIGRheXNJbk1vbnRoKCkgewogICAgICByZXR1cm4gdGhpcy5lbmRPZihNKS4kRDsKICAgIH07CiAgICBfcHJvdG8uJGxvY2FsZSA9IGZ1bmN0aW9uICRsb2NhbGUoKSB7CiAgICAgIHJldHVybiBMc1t0aGlzLiRMXTsKICAgIH07CiAgICBfcHJvdG8ubG9jYWxlID0gZnVuY3Rpb24gbG9jYWxlKHByZXNldCwgb2JqZWN0KSB7CiAgICAgIGlmICghcHJlc2V0KSByZXR1cm4gdGhpcy4kTDsKICAgICAgdmFyIHRoYXQgPSB0aGlzLmNsb25lKCk7CiAgICAgIHZhciBuZXh0TG9jYWxlTmFtZSA9IHBhcnNlTG9jYWxlKHByZXNldCwgb2JqZWN0LCB0cnVlKTsKICAgICAgaWYgKG5leHRMb2NhbGVOYW1lKSB0aGF0LiRMID0gbmV4dExvY2FsZU5hbWU7CiAgICAgIHJldHVybiB0aGF0OwogICAgfTsKICAgIF9wcm90by5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lKCkgewogICAgICByZXR1cm4gVXRpbHMudyh0aGlzLiRkLCB0aGlzKTsKICAgIH07CiAgICBfcHJvdG8udG9EYXRlID0gZnVuY3Rpb24gdG9EYXRlKCkgewogICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpOwogICAgfTsKICAgIF9wcm90by50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7CiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMudG9JU09TdHJpbmcoKSA6IG51bGw7CiAgICB9OwogICAgX3Byb3RvLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiRkLnRvSVNPU3RyaW5nKCk7CiAgICB9OwogICAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiRkLnRvVVRDU3RyaW5nKCk7CiAgICB9OwogICAgcmV0dXJuIERheWpzMjsKICB9KCk7CiAgdmFyIHByb3RvID0gRGF5anMucHJvdG90eXBlOwogIGRheWpzLnByb3RvdHlwZSA9IHByb3RvOwogIFtbIiRtcyIsIE1TXSwgWyIkcyIsIFNdLCBbIiRtIiwgTUlOXSwgWyIkSCIsIEhdLCBbIiRXIiwgRF0sIFsiJE0iLCBNXSwgWyIkeSIsIFldLCBbIiREIiwgREFURV1dLmZvckVhY2goZnVuY3Rpb24oZykgewogICAgcHJvdG9bZ1sxXV0gPSBmdW5jdGlvbihpbnB1dCkgewogICAgICByZXR1cm4gdGhpcy4kZyhpbnB1dCwgZ1swXSwgZ1sxXSk7CiAgICB9OwogIH0pOwogIGRheWpzLmV4dGVuZCA9IGZ1bmN0aW9uKHBsdWdpbiwgb3B0aW9uKSB7CiAgICBpZiAoIXBsdWdpbi4kaSkgewogICAgICBwbHVnaW4ob3B0aW9uLCBEYXlqcywgZGF5anMpOwogICAgICBwbHVnaW4uJGkgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGRheWpzOwogIH07CiAgZGF5anMubG9jYWxlID0gcGFyc2VMb2NhbGU7CiAgZGF5anMuaXNEYXlqcyA9IGlzRGF5anM7CiAgZGF5anMudW5peCA9IGZ1bmN0aW9uKHRpbWVzdGFtcCkgewogICAgcmV0dXJuIGRheWpzKHRpbWVzdGFtcCAqIDFlMyk7CiAgfTsKICBkYXlqcy5lbiA9IExzW0xdOwogIGRheWpzLkxzID0gTHM7CiAgZGF5anMucCA9IHt9OwogIHZhciBhZHZhbmNlZEZvcm1hdCA9IGZ1bmN0aW9uKG8sIGMyKSB7CiAgICB2YXIgcHJvdG8yID0gYzIucHJvdG90eXBlOwogICAgdmFyIG9sZEZvcm1hdCA9IHByb3RvMi5mb3JtYXQ7CiAgICBwcm90bzIuZm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0U3RyKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBsb2NhbGUgPSB0aGlzLiRsb2NhbGUoKTsKICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgewogICAgICAgIHJldHVybiBvbGRGb3JtYXQuYmluZCh0aGlzKShmb3JtYXRTdHIpOwogICAgICB9CiAgICAgIHZhciB1dGlscyA9IHRoaXMuJHV0aWxzKCk7CiAgICAgIHZhciBzdHIgPSBmb3JtYXRTdHIgfHwgRk9STUFUX0RFRkFVTFQ7CiAgICAgIHZhciByZXN1bHQgPSBzdHIucmVwbGFjZSgvXFsoW15cXV0rKV18UXx3b3x3d3x3fFdXfFd8enp6fHp8Z2dnZ3xHR0dHfERvfFh8eHxrezEsMn18Uy9nLCBmdW5jdGlvbihtYXRjaCkgewogICAgICAgIHN3aXRjaCAobWF0Y2gpIHsKICAgICAgICAgIGNhc2UgIlEiOgogICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKChfdGhpcy4kTSArIDEpIC8gMyk7CiAgICAgICAgICBjYXNlICJEbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGUub3JkaW5hbChfdGhpcy4kRCk7CiAgICAgICAgICBjYXNlICJnZ2dnIjoKICAgICAgICAgICAgcmV0dXJuIF90aGlzLndlZWtZZWFyKCk7CiAgICAgICAgICBjYXNlICJHR0dHIjoKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmlzb1dlZWtZZWFyKCk7CiAgICAgICAgICBjYXNlICJ3byI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGUub3JkaW5hbChfdGhpcy53ZWVrKCksICJXIik7CiAgICAgICAgICBjYXNlICJ3IjoKICAgICAgICAgIGNhc2UgInd3IjoKICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnMoX3RoaXMud2VlaygpLCBtYXRjaCA9PT0gInciID8gMSA6IDIsICIwIik7CiAgICAgICAgICBjYXNlICJXIjoKICAgICAgICAgIGNhc2UgIldXIjoKICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnMoX3RoaXMuaXNvV2VlaygpLCBtYXRjaCA9PT0gIlciID8gMSA6IDIsICIwIik7CiAgICAgICAgICBjYXNlICJrIjoKICAgICAgICAgIGNhc2UgImtrIjoKICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnMoU3RyaW5nKF90aGlzLiRIID09PSAwID8gMjQgOiBfdGhpcy4kSCksIG1hdGNoID09PSAiayIgPyAxIDogMiwgIjAiKTsKICAgICAgICAgIGNhc2UgIlgiOgogICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihfdGhpcy4kZC5nZXRUaW1lKCkgLyAxZTMpOwogICAgICAgICAgY2FzZSAieCI6CiAgICAgICAgICAgIHJldHVybiBfdGhpcy4kZC5nZXRUaW1lKCk7CiAgICAgICAgICBjYXNlICJ6IjoKICAgICAgICAgICAgcmV0dXJuICJbIiArIF90aGlzLm9mZnNldE5hbWUoKSArICJdIjsKICAgICAgICAgIGNhc2UgInp6eiI6CiAgICAgICAgICAgIHJldHVybiAiWyIgKyBfdGhpcy5vZmZzZXROYW1lKCJsb25nIikgKyAiXSI7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIG9sZEZvcm1hdC5iaW5kKHRoaXMpKHJlc3VsdCk7CiAgICB9OwogIH07CiAgdmFyIGlzb1dlZWtQcmV0dHlVbml0ID0gImlzb3dlZWsiOwogIHZhciBpc29XZWVrID0gZnVuY3Rpb24obywgYzIsIGQpIHsKICAgIHZhciBnZXRZZWFyRmlyc3RUaHVyc2RheSA9IGZ1bmN0aW9uIGdldFllYXJGaXJzdFRodXJzZGF5Mih5ZWFyLCBpc1V0YykgewogICAgICB2YXIgeWVhckZpcnN0RGF5ID0gKGlzVXRjID8gZC51dGMgOiBkKSgpLnllYXIoeWVhcikuc3RhcnRPZihZKTsKICAgICAgdmFyIGFkZERpZmZEYXlzID0gNCAtIHllYXJGaXJzdERheS5pc29XZWVrZGF5KCk7CiAgICAgIGlmICh5ZWFyRmlyc3REYXkuaXNvV2Vla2RheSgpID4gNCkgewogICAgICAgIGFkZERpZmZEYXlzICs9IDc7CiAgICAgIH0KICAgICAgcmV0dXJuIHllYXJGaXJzdERheS5hZGQoYWRkRGlmZkRheXMsIEQpOwogICAgfTsKICAgIHZhciBnZXRDdXJyZW50V2Vla1RodXJzZGF5ID0gZnVuY3Rpb24gZ2V0Q3VycmVudFdlZWtUaHVyc2RheTIoaW5zKSB7CiAgICAgIHJldHVybiBpbnMuYWRkKDQgLSBpbnMuaXNvV2Vla2RheSgpLCBEKTsKICAgIH07CiAgICB2YXIgcHJvdG8yID0gYzIucHJvdG90eXBlOwogICAgcHJvdG8yLmlzb1dlZWtZZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBub3dXZWVrVGh1cnNkYXkgPSBnZXRDdXJyZW50V2Vla1RodXJzZGF5KHRoaXMpOwogICAgICByZXR1cm4gbm93V2Vla1RodXJzZGF5LnllYXIoKTsKICAgIH07CiAgICBwcm90bzIuaXNvV2VlayA9IGZ1bmN0aW9uKHdlZWspIHsKICAgICAgaWYgKCF0aGlzLiR1dGlscygpLnUod2VlaykpIHsKICAgICAgICByZXR1cm4gdGhpcy5hZGQoKHdlZWsgLSB0aGlzLmlzb1dlZWsoKSkgKiA3LCBEKTsKICAgICAgfQogICAgICB2YXIgbm93V2Vla1RodXJzZGF5ID0gZ2V0Q3VycmVudFdlZWtUaHVyc2RheSh0aGlzKTsKICAgICAgdmFyIGRpZmZXZWVrVGh1cnNkYXkgPSBnZXRZZWFyRmlyc3RUaHVyc2RheSh0aGlzLmlzb1dlZWtZZWFyKCksIHRoaXMuJHUpOwogICAgICByZXR1cm4gbm93V2Vla1RodXJzZGF5LmRpZmYoZGlmZldlZWtUaHVyc2RheSwgVykgKyAxOwogICAgfTsKICAgIHByb3RvMi5pc29XZWVrZGF5ID0gZnVuY3Rpb24od2VlaykgewogICAgICBpZiAoIXRoaXMuJHV0aWxzKCkudSh3ZWVrKSkgewogICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWsgOiB3ZWVrIC0gNyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgfHwgNzsKICAgIH07CiAgICB2YXIgb2xkU3RhcnRPZiA9IHByb3RvMi5zdGFydE9mOwogICAgcHJvdG8yLnN0YXJ0T2YgPSBmdW5jdGlvbih1bml0cywgc3RhcnRPZikgewogICAgICB2YXIgdXRpbHMgPSB0aGlzLiR1dGlscygpOwogICAgICB2YXIgaXNTdGFydE9mID0gIXV0aWxzLnUoc3RhcnRPZikgPyBzdGFydE9mIDogdHJ1ZTsKICAgICAgdmFyIHVuaXQgPSB1dGlscy5wKHVuaXRzKTsKICAgICAgaWYgKHVuaXQgPT09IGlzb1dlZWtQcmV0dHlVbml0KSB7CiAgICAgICAgcmV0dXJuIGlzU3RhcnRPZiA/IHRoaXMuZGF0ZSh0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpKS5zdGFydE9mKCJkYXkiKSA6IHRoaXMuZGF0ZSh0aGlzLmRhdGUoKSAtIDEgLSAodGhpcy5pc29XZWVrZGF5KCkgLSAxKSArIDcpLmVuZE9mKCJkYXkiKTsKICAgICAgfQogICAgICByZXR1cm4gb2xkU3RhcnRPZi5iaW5kKHRoaXMpKHVuaXRzLCBzdGFydE9mKTsKICAgIH07CiAgfTsKICBkYXlqcy5leHRlbmQoaXNvV2Vlayk7CiAgZGF5anMuZXh0ZW5kKGFkdmFuY2VkRm9ybWF0KTsKICBjb25zdCBGT1JNQVRfSVNPX1dFRUtfWUVBUl9XRUVLID0gIkdHR0ctW1ddV1ciOwogIGNvbnN0IF9UZW1wb3JhbENhY2hlID0gY2xhc3MgX1RlbXBvcmFsQ2FjaGUgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHRoaXMueWVhck1vbnRoRGF5Q2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB0aGlzLnllYXJXZWVrQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB0aGlzLnllYXJNb250aENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgdGhpcy55ZWFyQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgfQogICAgZ2V0WWVhck1vbnRoRGF5KHMyKSB7CiAgICAgIGlmICghdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5oYXMoczIpKSB7CiAgICAgICAgdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5zZXQoczIsIFllYXJNb250aERheUNsYXNzLnBhcnNlKHMyLCB0aGlzKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMueWVhck1vbnRoRGF5Q2FjaGUuZ2V0KHMyKTsKICAgIH0KICAgIGdldFllYXJNb250aChzMikgewogICAgICBpZiAoIXRoaXMueWVhck1vbnRoQ2FjaGUuaGFzKHMyKSkgewogICAgICAgIHRoaXMueWVhck1vbnRoQ2FjaGUuc2V0KHMyLCBZZWFyTW9udGhDbGFzcy5wYXJzZShzMiwgdGhpcykpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnllYXJNb250aENhY2hlLmdldChzMik7CiAgICB9CiAgICBnZXRZZWFyV2VlayhzMikgewogICAgICBpZiAoIXRoaXMueWVhcldlZWtDYWNoZS5oYXMoczIpKSB7CiAgICAgICAgdGhpcy55ZWFyV2Vla0NhY2hlLnNldChzMiwgWWVhcldlZWtDbGFzcy5wYXJzZShzMiwgdGhpcykpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnllYXJXZWVrQ2FjaGUuZ2V0KHMyKTsKICAgIH0KICAgIGdldFllYXIoczIpIHsKICAgICAgaWYgKCF0aGlzLnllYXJDYWNoZS5oYXMoczIpKSB7CiAgICAgICAgdGhpcy55ZWFyQ2FjaGUuc2V0KHMyLCBZZWFyQ2xhc3MucGFyc2UoczIsIHRoaXMpKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy55ZWFyQ2FjaGUuZ2V0KHMyKTsKICAgIH0KICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7CiAgICB9CiAgfTsKICBfVGVtcG9yYWxDYWNoZS5pbnN0YW5jZSA9IG5ldyBfVGVtcG9yYWxDYWNoZSgpOwogIGxldCBUZW1wb3JhbENhY2hlID0gX1RlbXBvcmFsQ2FjaGU7CiAgY2xhc3MgWWVhck1vbnRoRGF5Q2xhc3MgewogICAgY29uc3RydWN0b3IoeWVhck51bWJlciwgbW9udGhOdW1iZXIsIGRheU51bWJlciwgY2FjaGUpIHsKICAgICAgdGhpcy55ZWFyTnVtYmVyID0geWVhck51bWJlcjsKICAgICAgdGhpcy5tb250aE51bWJlciA9IG1vbnRoTnVtYmVyOwogICAgICB0aGlzLmRheU51bWJlciA9IGRheU51bWJlcjsKICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlOwogICAgICB0aGlzLnR5cGUgPSAiWWVhck1vbnRoRGF5IjsKICAgICAgdGhpcy5kYXRlID0gbmV3IERhdGUodGhpcy55ZWFyTnVtYmVyLCB0aGlzLm1vbnRoTnVtYmVyIC0gMSwgdGhpcy5kYXlOdW1iZXIpOwogICAgICB0aGlzLmRheWpzID0gZGF5anModGhpcy5kYXRlKTsKICAgICAgdGhpcy5kYXRlU3RyaW5nID0gdGhpcy50b1N0cmluZygpOwogICAgfQogICAgZ2V0IHRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLmRheWpzLmZvcm1hdCgiWVlZWS1NTS1ERCIpOwogICAgfQogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICB9CiAgICBlbmdsaXNoTmFtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF5anMuZm9ybWF0KCJkZGRkLCBNTU1NIEQsIFlZWVkiKTsKICAgIH0KICAgIGdldCBmaXJzdERheSgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXQgbGFzdERheSgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXQgeWVhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLnllYXJOdW1iZXJ9YCk7CiAgICB9CiAgICBnZXQgbW9udGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aCh0aGlzLmRheWpzLmZvcm1hdCgiWVlZWS1NTSIpKTsKICAgIH0KICAgIGdldCB3ZWVrKCkgewogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyV2Vlayh0aGlzLmRheWpzLmZvcm1hdChGT1JNQVRfSVNPX1dFRUtfWUVBUl9XRUVLKSk7CiAgICB9CiAgICBhZGREYXlzKGRheXMpIHsKICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF5anMuYWRkKGRheXMsICJkYXkiKTsKICAgICAgY29uc3QgczIgPSBkYXRlLmZvcm1hdCgiWVlZWS1NTS1ERCIpOwogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkoczIpOwogICAgfQogICAgbWludXMob3RoZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF5anMuZGlmZihvdGhlci5kYXlqcywgImRheSIpOwogICAgfQogICAgc3RhdGljIHBhcnNlKHMyLCBjYWNoZSkgewogICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBzMi5zcGxpdCgiLSIpLm1hcCgoczIyKSA9PiBwYXJzZUludChzMjIsIDEwKSk7CiAgICAgIHJldHVybiBuZXcgWWVhck1vbnRoRGF5Q2xhc3MoeWVhciwgbW9udGgsIGRheSwgY2FjaGUpOwogICAgfQogIH0KICBjbGFzcyBZZWFyV2Vla0NsYXNzIHsKICAgIGNvbnN0cnVjdG9yKGlzb1llYXJOdW1iZXIsIGlzb1dlZWtOdW1iZXIsIGNhY2hlKSB7CiAgICAgIHRoaXMuaXNvWWVhck51bWJlciA9IGlzb1llYXJOdW1iZXI7CiAgICAgIHRoaXMuaXNvV2Vla051bWJlciA9IGlzb1dlZWtOdW1iZXI7CiAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKICAgICAgdGhpcy50eXBlID0gIlllYXJXZWVrIjsKICAgICAgdGhpcy5kYXRlU3RyaW5nID0gdGhpcy50b1N0cmluZygpOwogICAgfQogICAgZ2V0IHRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmZvcm1hdChGT1JNQVRfSVNPX1dFRUtfWUVBUl9XRUVLKTsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy50ZXh0OwogICAgfQogICAgZW5nbGlzaE5hbWUoKSB7CiAgICAgIHJldHVybiBgV2VlayAke3RoaXMuaXNvV2Vla051bWJlcn0sICR7dGhpcy5pc29ZZWFyTnVtYmVyfWA7CiAgICB9CiAgICBnZXQgZmlyc3REYXkoKSB7CiAgICAgIGNvbnN0IGZpcnN0RGF5ID0gZGF5anMoKS55ZWFyKHRoaXMuaXNvWWVhck51bWJlcikubW9udGgoMSkuZGF0ZSg0KS5pc29XZWVrKHRoaXMuaXNvV2Vla051bWJlcikuc3RhcnRPZigiaXNvV2VlayIpOwogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkoZmlyc3REYXkuZm9ybWF0KCJZWVlZLU1NLUREIikpOwogICAgfQogICAgZ2V0IGxhc3REYXkoKSB7CiAgICAgIGNvbnN0IGZpcnN0RGF5ID0gZGF5anMoKS55ZWFyKHRoaXMuaXNvWWVhck51bWJlcikuc3RhcnRPZigieWVhciIpLmFkZCgodGhpcy5pc29XZWVrTnVtYmVyIC0gMSkgKiA3LCAiZGF5Iikuc3RhcnRPZigid2VlayIpLmFkZCgxLCAiZGF5Iik7CiAgICAgIGNvbnN0IGxhc3REYXkgPSBmaXJzdERheS5hZGQoNiwgImRheSIpOwogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkobGFzdERheS5mb3JtYXQoIllZWVktTU0tREQiKSk7CiAgICB9CiAgICBnZXQgeWVhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLmlzb1llYXJOdW1iZXJ9YCk7CiAgICB9CiAgICBhZGRXZWVrcyh3ZWVrcykgewogICAgICBjb25zdCBkYXRlID0gdGhpcy5maXJzdERheS5kYXlqcy5hZGQod2Vla3MsICJ3ZWVrIik7CiAgICAgIGNvbnN0IHMyID0gZGF0ZS5mb3JtYXQoRk9STUFUX0lTT19XRUVLX1lFQVJfV0VFSyk7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFllYXJXZWVrKHMyKTsKICAgIH0KICAgIG1pbnVzKG90aGVyKSB7CiAgICAgIHJldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmRpZmYob3RoZXIuZmlyc3REYXkuZGF5anMsICJ3ZWVrIik7CiAgICB9CiAgICBzdGF0aWMgcGFyc2UoczIsIGNhY2hlKSB7CiAgICAgIGNvbnN0IFt5ZWFyLCB3ZWVrXSA9IHMyLnNwbGl0KCItVyIpLm1hcCgoczIyKSA9PiBwYXJzZUludChzMjIsIDEwKSk7CiAgICAgIHJldHVybiBuZXcgWWVhcldlZWtDbGFzcyh5ZWFyLCB3ZWVrLCBjYWNoZSk7CiAgICB9CiAgfQogIGNsYXNzIFllYXJNb250aENsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHllYXJOdW1iZXIsIG1vbnRoTnVtYmVyLCBjYWNoZSkgewogICAgICB0aGlzLnllYXJOdW1iZXIgPSB5ZWFyTnVtYmVyOwogICAgICB0aGlzLm1vbnRoTnVtYmVyID0gbW9udGhOdW1iZXI7CiAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKICAgICAgdGhpcy50eXBlID0gIlllYXJNb250aCI7CiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9IHRoaXMudG9TdHJpbmcoKTsKICAgIH0KICAgIGdldCB0ZXh0KCkgewogICAgICByZXR1cm4gdGhpcy5maXJzdERheS5kYXlqcy5mb3JtYXQoIllZWVktTU0iKTsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy50ZXh0OwogICAgfQogICAgZW5nbGlzaE5hbWUoKSB7CiAgICAgIHJldHVybiBgJHttb250aE5hbWUodGhpcy5tb250aE51bWJlcil9ICR7dGhpcy55ZWFyTnVtYmVyfWA7CiAgICB9CiAgICBnZXQgZmlyc3REYXkoKSB7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aERheShkYXlqcyhgJHt0aGlzLnllYXJOdW1iZXJ9LSR7dGhpcy5tb250aE51bWJlcn0tMDFgKS5mb3JtYXQoIllZWVktTU0tREQiKSk7CiAgICB9CiAgICBnZXQgbGFzdERheSgpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KAogICAgICAgIGRheWpzKGAke3RoaXMueWVhck51bWJlcn0tJHt0aGlzLm1vbnRoTnVtYmVyfS0wMWApLmVuZE9mKCJtb250aCIpLmZvcm1hdCgiWVlZWS1NTS1ERCIpCiAgICAgICk7CiAgICB9CiAgICBnZXQgeWVhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLnllYXJOdW1iZXJ9YCk7CiAgICB9CiAgICBhZGRNb250aHMobW9udGhzKSB7CiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmZpcnN0RGF5LmRheWpzLmFkZChtb250aHMsICJtb250aCIpOwogICAgICBjb25zdCBzMiA9IGRhdGUuZm9ybWF0KCJZWVlZLU1NIik7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChzMik7CiAgICB9CiAgICBtaW51cyhvdGhlcikgewogICAgICByZXR1cm4gdGhpcy5maXJzdERheS5kYXlqcy5kaWZmKG90aGVyLmZpcnN0RGF5LmRheWpzLCAibW9udGgiKTsKICAgIH0KICAgIHN0YXRpYyBwYXJzZShzMiwgY2FjaGUpIHsKICAgICAgY29uc3QgW3llYXIsIG1vbnRoXSA9IHMyLnNwbGl0KCItIikubWFwKChzMjIpID0+IHBhcnNlSW50KHMyMiwgMTApKTsKICAgICAgcmV0dXJuIG5ldyBZZWFyTW9udGhDbGFzcyh5ZWFyLCBtb250aCwgY2FjaGUpOwogICAgfQogIH0KICBjbGFzcyBZZWFyQ2xhc3MgewogICAgY29uc3RydWN0b3IoeWVhciwgY2FjaGUpIHsKICAgICAgdGhpcy55ZWFyID0geWVhcjsKICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlOwogICAgICB0aGlzLnR5cGUgPSAiWWVhciI7CiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9IHRoaXMudG9TdHJpbmcoKTsKICAgIH0KICAgIGdldCB0ZXh0KCkgewogICAgICByZXR1cm4gdGhpcy5maXJzdERheS5kYXlqcy5mb3JtYXQoIllZWVkiKTsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy50ZXh0OwogICAgfQogICAgZW5nbGlzaE5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnllYXIudG9TdHJpbmcoKTsKICAgIH0KICAgIGdldCBmaXJzdE1vbnRoKCkgewogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgoYCR7dGhpcy55ZWFyfS0wMWApOwogICAgfQogICAgZ2V0IGxhc3RNb250aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoKGAke3RoaXMueWVhcn0tMTJgKTsKICAgIH0KICAgIGdldCBmaXJzdERheSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZmlyc3RNb250aC5maXJzdERheTsKICAgIH0KICAgIGdldCBsYXN0RGF5KCkgewogICAgICByZXR1cm4gdGhpcy5sYXN0TW9udGgubGFzdERheTsKICAgIH0KICAgIGFkZFllYXJzKHllYXJzKSB7CiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmZpcnN0RGF5LmRheWpzLmFkZCh5ZWFycywgInllYXIiKTsKICAgICAgY29uc3QgczIgPSBkYXRlLmZvcm1hdCgiWVlZWSIpOwogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyKHMyKTsKICAgIH0KICAgIG1pbnVzKG90aGVyKSB7CiAgICAgIHJldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmRpZmYob3RoZXIuZmlyc3REYXkuZGF5anMsICJ5ZWFyIik7CiAgICB9CiAgICBzdGF0aWMgcGFyc2UoczIsIGNhY2hlKSB7CiAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChzMiwgMTApOwogICAgICByZXR1cm4gbmV3IFllYXJDbGFzcyh5ZWFyLCBjYWNoZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG1vbnRoTmFtZShtb250aCkgewogICAgcmV0dXJuIGRheWpzKCkubW9udGgobW9udGggLSAxKS5mb3JtYXQoIk1NTU0iKTsKICB9CiAgZnVuY3Rpb24gdG9UZW1wb3JhbCh0ZW1wb3JhbENsYXNzKSB7CiAgICBzd2l0Y2ggKHRlbXBvcmFsQ2xhc3MudHlwZSkgewogICAgICBjYXNlICJZZWFyTW9udGhEYXkiOgogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiWWVhck1vbnRoRGF5IiwKICAgICAgICAgIHllYXJOdW1iZXI6IHRlbXBvcmFsQ2xhc3MueWVhck51bWJlciwKICAgICAgICAgIG1vbnRoTnVtYmVyOiB0ZW1wb3JhbENsYXNzLm1vbnRoTnVtYmVyLAogICAgICAgICAgZGF5TnVtYmVyOiB0ZW1wb3JhbENsYXNzLmRheU51bWJlciwKICAgICAgICAgIGRhdGVTdHJpbmc6IHRlbXBvcmFsQ2xhc3MuZGF0ZVN0cmluZwogICAgICAgIH07CiAgICAgIGNhc2UgIlllYXJXZWVrIjoKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIlllYXJXZWVrIiwKICAgICAgICAgIGlzb1llYXJOdW1iZXI6IHRlbXBvcmFsQ2xhc3MuaXNvWWVhck51bWJlciwKICAgICAgICAgIGlzb1dlZWtOdW1iZXI6IHRlbXBvcmFsQ2xhc3MuaXNvV2Vla051bWJlciwKICAgICAgICAgIGRhdGVTdHJpbmc6IHRlbXBvcmFsQ2xhc3MuZGF0ZVN0cmluZwogICAgICAgIH07CiAgICAgIGNhc2UgIlllYXJNb250aCI6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJZZWFyTW9udGgiLAogICAgICAgICAgeWVhck51bWJlcjogdGVtcG9yYWxDbGFzcy55ZWFyTnVtYmVyLAogICAgICAgICAgbW9udGhOdW1iZXI6IHRlbXBvcmFsQ2xhc3MubW9udGhOdW1iZXIsCiAgICAgICAgICBkYXRlU3RyaW5nOiB0ZW1wb3JhbENsYXNzLmRhdGVTdHJpbmcKICAgICAgICB9OwogICAgICBjYXNlICJZZWFyIjoKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIlllYXIiLAogICAgICAgICAgeWVhcjogdGVtcG9yYWxDbGFzcy55ZWFyLAogICAgICAgICAgZGF0ZVN0cmluZzogdGVtcG9yYWxDbGFzcy5kYXRlU3RyaW5nCiAgICAgICAgfTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVBbGxEYXlzSW5SYW5nZShzdGFydCwgZW5kKSB7CiAgICBjb25zdCBkYXlzID0gW107CiAgICBjb25zdCBkYXlzSW5CZXR3ZWVuID0gZW5kLm1pbnVzKHN0YXJ0KTsKICAgIGZvciAobGV0IGkyID0gMDsgaTIgPD0gZGF5c0luQmV0d2VlbjsgaTIrKykgewogICAgICBkYXlzLnB1c2goc3RhcnQuYWRkRGF5cyhpMikpOwogICAgfQogICAgcmV0dXJuIGRheXM7CiAgfQogIGZ1bmN0aW9uIGdlbmVyYXRlQWxsV2Vla3NJblJhbmdlKHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IHdlZWtzID0gW107CiAgICBjb25zdCB3ZWVrc0luQmV0d2VlbiA9IGVuZC5taW51cyhzdGFydCk7CiAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDw9IHdlZWtzSW5CZXR3ZWVuOyBpMisrKSB7CiAgICAgIHdlZWtzLnB1c2goc3RhcnQuYWRkV2Vla3MoaTIpKTsKICAgIH0KICAgIHJldHVybiB3ZWVrczsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVBbGxNb250aHNJblJhbmdlKHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IG1vbnRocyA9IFtdOwogICAgY29uc3QgbW9udGhzSW5CZXR3ZWVuID0gZW5kLm1pbnVzKHN0YXJ0KTsKICAgIGZvciAobGV0IGkyID0gMDsgaTIgPD0gbW9udGhzSW5CZXR3ZWVuOyBpMisrKSB7CiAgICAgIG1vbnRocy5wdXNoKHN0YXJ0LmFkZE1vbnRocyhpMikpOwogICAgfQogICAgcmV0dXJuIG1vbnRoczsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVBbGxZZWFyc0luUmFuZ2Uoc3RhcnQsIGVuZCkgewogICAgY29uc3QgeWVhcnMgPSBbXTsKICAgIGNvbnN0IHllYXJzSW5CZXR3ZWVuID0gZW5kLm1pbnVzKHN0YXJ0KTsKICAgIGZvciAobGV0IGkyID0gMDsgaTIgPD0geWVhcnNJbkJldHdlZW47IGkyKyspIHsKICAgICAgeWVhcnMucHVzaChzdGFydC5hZGRZZWFycyhpMikpOwogICAgfQogICAgcmV0dXJuIHllYXJzOwogIH0KICBmdW5jdGlvbiBnZW5lcmF0ZUFsbEluUmFuZ2Uoc3RhcnQsIGVuZCkgewogICAgaWYgKHN0YXJ0ID09PSBudWxsIHx8IGVuZCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gW107CiAgICB9CiAgICBpZiAoc3RhcnQgaW5zdGFuY2VvZiBZZWFyTW9udGhEYXlDbGFzcyAmJiBlbmQgaW5zdGFuY2VvZiBZZWFyTW9udGhEYXlDbGFzcykgewogICAgICByZXR1cm4gZ2VuZXJhdGVBbGxEYXlzSW5SYW5nZShzdGFydCwgZW5kKTsKICAgIH0KICAgIGlmIChzdGFydCBpbnN0YW5jZW9mIFllYXJXZWVrQ2xhc3MgJiYgZW5kIGluc3RhbmNlb2YgWWVhcldlZWtDbGFzcykgewogICAgICByZXR1cm4gZ2VuZXJhdGVBbGxXZWVrc0luUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgICB9CiAgICBpZiAoc3RhcnQgaW5zdGFuY2VvZiBZZWFyTW9udGhDbGFzcyAmJiBlbmQgaW5zdGFuY2VvZiBZZWFyTW9udGhDbGFzcykgewogICAgICByZXR1cm4gZ2VuZXJhdGVBbGxNb250aHNJblJhbmdlKHN0YXJ0LCBlbmQpOwogICAgfQogICAgaWYgKHN0YXJ0IGluc3RhbmNlb2YgWWVhckNsYXNzICYmIGVuZCBpbnN0YW5jZW9mIFllYXJDbGFzcykgewogICAgICByZXR1cm4gZ2VuZXJhdGVBbGxZZWFyc0luUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzOiBzdGFydCBhbmQgZW5kIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZTogJHtzdGFydH0sICR7ZW5kfWApOwogIH0KICBmdW5jdGlvbiBtaW51c1RlbXBvcmFsKGEyLCBiKSB7CiAgICBpZiAoYTIgaW5zdGFuY2VvZiBZZWFyTW9udGhEYXlDbGFzcyAmJiBiIGluc3RhbmNlb2YgWWVhck1vbnRoRGF5Q2xhc3MpIHsKICAgICAgcmV0dXJuIGEyLm1pbnVzKGIpOwogICAgfQogICAgaWYgKGEyIGluc3RhbmNlb2YgWWVhcldlZWtDbGFzcyAmJiBiIGluc3RhbmNlb2YgWWVhcldlZWtDbGFzcykgewogICAgICByZXR1cm4gYTIubWludXMoYik7CiAgICB9CiAgICBpZiAoYTIgaW5zdGFuY2VvZiBZZWFyTW9udGhDbGFzcyAmJiBiIGluc3RhbmNlb2YgWWVhck1vbnRoQ2xhc3MpIHsKICAgICAgcmV0dXJuIGEyLm1pbnVzKGIpOwogICAgfQogICAgaWYgKGEyIGluc3RhbmNlb2YgWWVhckNsYXNzICYmIGIgaW5zdGFuY2VvZiBZZWFyQ2xhc3MpIHsKICAgICAgcmV0dXJuIGEyLm1pbnVzKGIpOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcGFyZSAke2EyfSBhbmQgJHtifWApOwogIH0KICBmdW5jdGlvbiBjb21wYXJlVGVtcG9yYWwoYTIsIGIpIHsKICAgIGlmIChhMiA9PT0gbnVsbCkgewogICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmIChiID09PSBudWxsKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGNvbnN0IGRpZmYgPSBtaW51c1RlbXBvcmFsKGEyLCBiKTsKICAgIGlmIChkaWZmIDwgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoZGlmZiA+IDApIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgZnVuY3Rpb24gZ2V0TWluTWF4VGVtcG9yYWwodmFsdWVzKSB7CiAgICBsZXQgbWluID0gbnVsbDsKICAgIGxldCBtYXggPSBudWxsOwogICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjb21wYXJlVGVtcG9yYWwodmFsdWUsIG1pbikgPCAwKSB7CiAgICAgICAgbWluID0gdmFsdWU7CiAgICAgIH0KICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjb21wYXJlVGVtcG9yYWwodmFsdWUsIG1heCkgPiAwKSB7CiAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChtaW4gPT09IG51bGwgfHwgbWF4ID09PSBudWxsKSB7CiAgICAgIHJldHVybiB7IG1pbjogbnVsbCwgbWF4OiBudWxsIH07CiAgICB9CiAgICByZXR1cm4geyBtaW4sIG1heCB9OwogIH0KICBmdW5jdGlvbiBwYXJzZURhdGVTdHJpbmdUb1RlbXBvcmFsKGRhdGUsIGdyYW51bGFyaXR5KSB7CiAgICBjb25zdCBjYWNoZSA9IFRlbXBvcmFsQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKICAgIGNvbnN0IGRheSA9IGNhY2hlLmdldFllYXJNb250aERheShkYXRlKTsKICAgIHN3aXRjaCAoZ3JhbnVsYXJpdHkpIHsKICAgICAgY2FzZSAiZGF5IjoKICAgICAgICByZXR1cm4gZGF5OwogICAgICBjYXNlICJ3ZWVrIjoKICAgICAgICByZXR1cm4gZGF5LndlZWs7CiAgICAgIGNhc2UgIm1vbnRoIjoKICAgICAgICByZXR1cm4gZGF5Lm1vbnRoOwogICAgICBjYXNlICJ5ZWFyIjoKICAgICAgICByZXR1cm4gZGF5LnllYXI7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRhdGVSYW5nZUNvbXBhcmUoYTIsIGIpIHsKICAgIGlmIChhMi5kYXRlUmFuZ2UgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoYi5kYXRlUmFuZ2UgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIGNvbXBhcmVUZW1wb3JhbChhMi5kYXRlUmFuZ2UsIGIuZGF0ZVJhbmdlKTsKICB9CiAgZnVuY3Rpb24gbWFwRGF0ZVRvR3JhbnVsYXJpdHlSYW5nZShkYXRhLCBncmFudWxhcml0eSkgewogICAgcmV0dXJuIHsKICAgICAgZGF0ZVJhbmdlOiBkYXRhLmRhdGUgPT09IG51bGwgPyBudWxsIDogcGFyc2VEYXRlU3RyaW5nVG9UZW1wb3JhbChkYXRhLmRhdGUsIGdyYW51bGFyaXR5KSwKICAgICAgY291bnQ6IGRhdGEuY291bnQKICAgIH07CiAgfQogIGNvbnN0IHN1YnN0aXR1dGlvblJlZ2V4ID0gL14oKD88c2VnbWVudD5bQS1aYS16MC05Xy1dKykoPz06KTopPyg/PHZhbHVlQXRSZWZlcmVuY2U+W0EtWmEtel0pPyg/PHBvc2l0aW9uPlxkKykoPzxzdWJzdGl0dXRpb25WYWx1ZT5bQS1aYS16Ll0pPyQvOwogIGNsYXNzIFN1YnN0aXR1dGlvbkNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHNlZ21lbnQsIHZhbHVlQXRSZWZlcmVuY2UsIHN1YnN0aXR1dGlvblZhbHVlLCBwb3NpdGlvbikgewogICAgICB0aGlzLnNlZ21lbnQgPSBzZWdtZW50OwogICAgICB0aGlzLnZhbHVlQXRSZWZlcmVuY2UgPSB2YWx1ZUF0UmVmZXJlbmNlOwogICAgICB0aGlzLnN1YnN0aXR1dGlvblZhbHVlID0gc3Vic3RpdHV0aW9uVmFsdWU7CiAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgdGhpcy50eXBlID0gInN1YnN0aXR1dGlvbiI7CiAgICAgIGNvbnN0IHNlZ21lbnRTdHJpbmcgPSB0aGlzLnNlZ21lbnQgPyBgJHt0aGlzLnNlZ21lbnR9OmAgOiAiIjsKICAgICAgY29uc3QgdmFsdWVBdFJlZmVyZW5jZVN0cmluZyA9IHRoaXMudmFsdWVBdFJlZmVyZW5jZSA/IGAke3RoaXMudmFsdWVBdFJlZmVyZW5jZX1gIDogIiI7CiAgICAgIGNvbnN0IHN1YnN0aXR1dGlvblZhbHVlU3RyaW5nID0gdGhpcy5zdWJzdGl0dXRpb25WYWx1ZSA/IGAke3RoaXMuc3Vic3RpdHV0aW9uVmFsdWV9YCA6ICIiOwogICAgICB0aGlzLmNvZGUgPSBgJHtzZWdtZW50U3RyaW5nfSR7dmFsdWVBdFJlZmVyZW5jZVN0cmluZ30ke3RoaXMucG9zaXRpb259JHtzdWJzdGl0dXRpb25WYWx1ZVN0cmluZ31gOwogICAgfQogICAgZXF1YWxzKG90aGVyKSB7CiAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU3Vic3RpdHV0aW9uQ2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnNlZ21lbnQgPT09IG90aGVyLnNlZ21lbnQgJiYgdGhpcy52YWx1ZUF0UmVmZXJlbmNlID09PSBvdGhlci52YWx1ZUF0UmVmZXJlbmNlICYmIHRoaXMuc3Vic3RpdHV0aW9uVmFsdWUgPT09IG90aGVyLnN1YnN0aXR1dGlvblZhbHVlICYmIHRoaXMucG9zaXRpb24gPT09IG90aGVyLnBvc2l0aW9uOwogICAgfQogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLmNvZGU7CiAgICB9CiAgICBzdGF0aWMgcGFyc2UobXV0YXRpb25TdHIpIHsKICAgICAgY29uc3QgbWF0Y2ggPSBtdXRhdGlvblN0ci5tYXRjaChzdWJzdGl0dXRpb25SZWdleCk7CiAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCB8fCBtYXRjaC5ncm91cHMgPT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgU3Vic3RpdHV0aW9uQ2xhc3MoCiAgICAgICAgbWF0Y2guZ3JvdXBzLnNlZ21lbnQsCiAgICAgICAgbWF0Y2guZ3JvdXBzLnZhbHVlQXRSZWZlcmVuY2UsCiAgICAgICAgbWF0Y2guZ3JvdXBzLnN1YnN0aXR1dGlvblZhbHVlLAogICAgICAgIHBhcnNlSW50KG1hdGNoLmdyb3Vwcy5wb3NpdGlvbiwgMTApCiAgICAgICk7CiAgICB9CiAgfQogIGNvbnN0IGRlbGV0aW9uUmVnZXggPSAvXigoPzxzZWdtZW50PltBLVphLXowLTlfLV0rKSg/PTopOik/KD88dmFsdWVBdFJlZmVyZW5jZT5bQS1aYS16XSk/KD88cG9zaXRpb24+XGQrKSgtKSQvOwogIGNsYXNzIERlbGV0aW9uQ2xhc3MgewogICAgY29uc3RydWN0b3Ioc2VnbWVudCwgdmFsdWVBdFJlZmVyZW5jZSwgcG9zaXRpb24pIHsKICAgICAgdGhpcy5zZWdtZW50ID0gc2VnbWVudDsKICAgICAgdGhpcy52YWx1ZUF0UmVmZXJlbmNlID0gdmFsdWVBdFJlZmVyZW5jZTsKICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICB0aGlzLnR5cGUgPSAiZGVsZXRpb24iOwogICAgICBjb25zdCBzZWdtZW50U3RyaW5nID0gdGhpcy5zZWdtZW50ID8gYCR7dGhpcy5zZWdtZW50fTpgIDogIiI7CiAgICAgIGNvbnN0IHZhbHVlQXRSZWZlcmVuY2VTdHJpbmcgPSB0aGlzLnZhbHVlQXRSZWZlcmVuY2UgPyBgJHt0aGlzLnZhbHVlQXRSZWZlcmVuY2V9YCA6ICIiOwogICAgICB0aGlzLmNvZGUgPSBgJHtzZWdtZW50U3RyaW5nfSR7dmFsdWVBdFJlZmVyZW5jZVN0cmluZ30ke3RoaXMucG9zaXRpb259LWA7CiAgICB9CiAgICBlcXVhbHMob3RoZXIpIHsKICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBEZWxldGlvbkNsYXNzKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5zZWdtZW50ID09PSBvdGhlci5zZWdtZW50ICYmIHRoaXMudmFsdWVBdFJlZmVyZW5jZSA9PT0gb3RoZXIudmFsdWVBdFJlZmVyZW5jZSAmJiB0aGlzLnBvc2l0aW9uID09PSBvdGhlci5wb3NpdGlvbjsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy5jb2RlOwogICAgfQogICAgc3RhdGljIHBhcnNlKG11dGF0aW9uU3RyKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gbXV0YXRpb25TdHIubWF0Y2goZGVsZXRpb25SZWdleCk7CiAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCB8fCBtYXRjaC5ncm91cHMgPT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGVsZXRpb25DbGFzcygKICAgICAgICBtYXRjaC5ncm91cHMuc2VnbWVudCwKICAgICAgICBtYXRjaC5ncm91cHMudmFsdWVBdFJlZmVyZW5jZSwKICAgICAgICBwYXJzZUludChtYXRjaC5ncm91cHMucG9zaXRpb24sIDEwKQogICAgICApOwogICAgfQogIH0KICBmdW5jdGlvbiB0b1N1YnN0aXR1dGlvbk9yRGVsZXRpb24obXV0YXRpb24pIHsKICAgIHN3aXRjaCAobXV0YXRpb24udHlwZSkgewogICAgICBjYXNlICJzdWJzdGl0dXRpb24iOgogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAic3Vic3RpdHV0aW9uIiwKICAgICAgICAgIGNvZGU6IG11dGF0aW9uLmNvZGUsCiAgICAgICAgICBzZWdtZW50OiBtdXRhdGlvbi5zZWdtZW50LAogICAgICAgICAgcG9zaXRpb246IG11dGF0aW9uLnBvc2l0aW9uLAogICAgICAgICAgdmFsdWVBdFJlZmVyZW5jZTogbXV0YXRpb24udmFsdWVBdFJlZmVyZW5jZSwKICAgICAgICAgIHN1YnN0aXR1dGlvblZhbHVlOiBtdXRhdGlvbi5zdWJzdGl0dXRpb25WYWx1ZQogICAgICAgIH07CiAgICAgIGNhc2UgImRlbGV0aW9uIjoKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogImRlbGV0aW9uIiwKICAgICAgICAgIGNvZGU6IG11dGF0aW9uLmNvZGUsCiAgICAgICAgICBzZWdtZW50OiBtdXRhdGlvbi5zZWdtZW50LAogICAgICAgICAgcG9zaXRpb246IG11dGF0aW9uLnBvc2l0aW9uLAogICAgICAgICAgdmFsdWVBdFJlZmVyZW5jZTogbXV0YXRpb24udmFsdWVBdFJlZmVyZW5jZQogICAgICAgIH07CiAgICB9CiAgfQogIGNsYXNzIEZldGNoU3Vic3RpdHV0aW9uc09yRGVsZXRpb25zT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoZmlsdGVyLCBzZXF1ZW5jZVR5cGUsIG1pblByb3BvcnRpb24pIHsKICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7CiAgICAgIHRoaXMuc2VxdWVuY2VUeXBlID0gc2VxdWVuY2VUeXBlOwogICAgICB0aGlzLm1pblByb3BvcnRpb24gPSBtaW5Qcm9wb3J0aW9uOwogICAgfQogICAgYXN5bmMgZXZhbHVhdGUobGFwaXMsIHNpZ25hbCkgewogICAgICBjb25zdCBtdXRhdGlvbnMgPSBhd2FpdCB0aGlzLmZldGNoTXV0YXRpb25zKGxhcGlzLCBzaWduYWwpOwogICAgICBjb25zdCBjb250ZW50ID0gbXV0YXRpb25zLm1hcCgKICAgICAgICAoeyBjb3VudCwgcHJvcG9ydGlvbiwgbXV0YXRpb25Gcm9tLCBtdXRhdGlvblRvLCBwb3NpdGlvbiwgc2VxdWVuY2VOYW1lIH0pID0+IHsKICAgICAgICAgIGlmIChtdXRhdGlvblRvID09PSAiLSIpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0eXBlOiAiZGVsZXRpb24iLAogICAgICAgICAgICAgIG11dGF0aW9uOiBuZXcgRGVsZXRpb25DbGFzcyhzZXF1ZW5jZU5hbWUgPz8gdm9pZCAwLCBtdXRhdGlvbkZyb20sIHBvc2l0aW9uKSwKICAgICAgICAgICAgICBjb3VudCwKICAgICAgICAgICAgICBwcm9wb3J0aW9uCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAic3Vic3RpdHV0aW9uIiwKICAgICAgICAgICAgbXV0YXRpb246IG5ldyBTdWJzdGl0dXRpb25DbGFzcyhzZXF1ZW5jZU5hbWUgPz8gdm9pZCAwLCBtdXRhdGlvbkZyb20sIG11dGF0aW9uVG8sIHBvc2l0aW9uKSwKICAgICAgICAgICAgY291bnQsCiAgICAgICAgICAgIHByb3BvcnRpb24KICAgICAgICAgIH07CiAgICAgICAgfQogICAgICApOwogICAgICByZXR1cm4geyBjb250ZW50IH07CiAgICB9CiAgICBhc3luYyBmZXRjaE11dGF0aW9ucyhsYXBpcywgc2lnbmFsKSB7CiAgICAgIGNvbnN0IGZpbHRlciA9IHsKICAgICAgICAuLi50aGlzLmZpbHRlciwKICAgICAgICBtaW5Qcm9wb3J0aW9uOiB0aGlzLm1pblByb3BvcnRpb24KICAgICAgfTsKICAgICAgcmV0dXJuIGZldGNoU3Vic3RpdHV0aW9uc09yRGVsZXRpb25zKGxhcGlzLCBmaWx0ZXIsIHRoaXMuc2VxdWVuY2VUeXBlLCBzaWduYWwpLnRoZW4oCiAgICAgICAgKHJlc3BvbnNlKSA9PiByZXNwb25zZS5kYXRhCiAgICAgICk7CiAgICB9CiAgfQogIHZhciBsJDE7CiAgbCQxID0geyBfX2U6IGZ1bmN0aW9uKG4sIGwyLCB1MiwgdCkgewogICAgZm9yICh2YXIgaTIsIG8sIHIyOyBsMiA9IGwyLl9fOyApIGlmICgoaTIgPSBsMi5fX2MpICYmICFpMi5fXykgdHJ5IHsKICAgICAgaWYgKChvID0gaTIuY29uc3RydWN0b3IpICYmIG51bGwgIT0gby5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgJiYgKGkyLnNldFN0YXRlKG8uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKG4pKSwgcjIgPSBpMi5fX2QpLCBudWxsICE9IGkyLmNvbXBvbmVudERpZENhdGNoICYmIChpMi5jb21wb25lbnREaWRDYXRjaChuLCB0IHx8IHt9KSwgcjIgPSBpMi5fX2QpLCByMikgcmV0dXJuIGkyLl9fRSA9IGkyOwogICAgfSBjYXRjaCAobDMpIHsKICAgICAgbiA9IGwzOwogICAgfQogICAgdGhyb3cgbjsKICB9IH0sICJmdW5jdGlvbiIgPT0gdHlwZW9mIFByb21pc2UgPyBQcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpIDogc2V0VGltZW91dDsKICB2YXIgciwgdSwgaSwgZiA9IFtdLCBjID0gbCQxLCBlID0gYy5fX2IsIGEgPSBjLl9fciwgdiA9IGMuZGlmZmVkLCBsID0gYy5fX2MsIG0gPSBjLnVubW91bnQsIHMgPSBjLl9fOwogIGZ1bmN0aW9uIGooKSB7CiAgICBmb3IgKHZhciBuOyBuID0gZi5zaGlmdCgpOyApIGlmIChuLl9fUCAmJiBuLl9fSCkgdHJ5IHsKICAgICAgbi5fX0guX19oLmZvckVhY2goeiksIG4uX19ILl9faC5mb3JFYWNoKEIpLCBuLl9fSC5fX2ggPSBbXTsKICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgbi5fX0guX19oID0gW10sIGMuX19lKHQsIG4uX192KTsKICAgIH0KICB9CiAgYy5fX2IgPSBmdW5jdGlvbihuKSB7CiAgICByID0gbnVsbCwgZSAmJiBlKG4pOwogIH0sIGMuX18gPSBmdW5jdGlvbihuLCB0KSB7CiAgICBuICYmIHQuX19rICYmIHQuX19rLl9fbSAmJiAobi5fX20gPSB0Ll9fay5fX20pLCBzICYmIHMobiwgdCk7CiAgfSwgYy5fX3IgPSBmdW5jdGlvbihuKSB7CiAgICBhICYmIGEobik7CiAgICB2YXIgaTIgPSAociA9IG4uX19jKS5fX0g7CiAgICBpMiAmJiAodSA9PT0gciA/IChpMi5fX2ggPSBbXSwgci5fX2ggPSBbXSwgaTIuX18uZm9yRWFjaChmdW5jdGlvbihuMikgewogICAgICBuMi5fX04gJiYgKG4yLl9fID0gbjIuX19OKSwgbjIuaSA9IG4yLl9fTiA9IHZvaWQgMDsKICAgIH0pKSA6IChpMi5fX2guZm9yRWFjaCh6KSwgaTIuX19oLmZvckVhY2goQiksIGkyLl9faCA9IFtdLCAwKSksIHUgPSByOwogIH0sIGMuZGlmZmVkID0gZnVuY3Rpb24obikgewogICAgdiAmJiB2KG4pOwogICAgdmFyIHQgPSBuLl9fYzsKICAgIHQgJiYgdC5fX0ggJiYgKHQuX19ILl9faC5sZW5ndGggJiYgKDEgIT09IGYucHVzaCh0KSAmJiBpID09PSBjLnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAoKGkgPSBjLnJlcXVlc3RBbmltYXRpb25GcmFtZSkgfHwgdykoaikpLCB0Ll9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKG4yKSB7CiAgICAgIG4yLmkgJiYgKG4yLl9fSCA9IG4yLmkpLCBuMi5pID0gdm9pZCAwOwogICAgfSkpLCB1ID0gciA9IG51bGw7CiAgfSwgYy5fX2MgPSBmdW5jdGlvbihuLCB0KSB7CiAgICB0LnNvbWUoZnVuY3Rpb24objIpIHsKICAgICAgdHJ5IHsKICAgICAgICBuMi5fX2guZm9yRWFjaCh6KSwgbjIuX19oID0gbjIuX19oLmZpbHRlcihmdW5jdGlvbihuMykgewogICAgICAgICAgcmV0dXJuICFuMy5fXyB8fCBCKG4zKTsKICAgICAgICB9KTsKICAgICAgfSBjYXRjaCAocjIpIHsKICAgICAgICB0LnNvbWUoZnVuY3Rpb24objMpIHsKICAgICAgICAgIG4zLl9faCAmJiAobjMuX19oID0gW10pOwogICAgICAgIH0pLCB0ID0gW10sIGMuX19lKHIyLCBuMi5fX3YpOwogICAgICB9CiAgICB9KSwgbCAmJiBsKG4sIHQpOwogIH0sIGMudW5tb3VudCA9IGZ1bmN0aW9uKG4pIHsKICAgIG0gJiYgbShuKTsKICAgIHZhciB0LCByMiA9IG4uX19jOwogICAgcjIgJiYgcjIuX19IICYmIChyMi5fX0guX18uZm9yRWFjaChmdW5jdGlvbihuMikgewogICAgICB0cnkgewogICAgICAgIHoobjIpOwogICAgICB9IGNhdGNoIChuMykgewogICAgICAgIHQgPSBuMzsKICAgICAgfQogICAgfSksIHIyLl9fSCA9IHZvaWQgMCwgdCAmJiBjLl9fZSh0LCByMi5fX3YpKTsKICB9OwogIHZhciBrID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOwogIGZ1bmN0aW9uIHcobikgewogICAgdmFyIHQsIHIyID0gZnVuY3Rpb24oKSB7CiAgICAgIGNsZWFyVGltZW91dCh1MiksIGsgJiYgY2FuY2VsQW5pbWF0aW9uRnJhbWUodCksIHNldFRpbWVvdXQobik7CiAgICB9LCB1MiA9IHNldFRpbWVvdXQocjIsIDEwMCk7CiAgICBrICYmICh0ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIyKSk7CiAgfQogIGZ1bmN0aW9uIHoobikgewogICAgdmFyIHQgPSByLCB1MiA9IG4uX19jOwogICAgImZ1bmN0aW9uIiA9PSB0eXBlb2YgdTIgJiYgKG4uX19jID0gdm9pZCAwLCB1MigpKSwgciA9IHQ7CiAgfQogIGZ1bmN0aW9uIEIobikgewogICAgdmFyIHQgPSByOwogICAgbi5fX2MgPSBuLl9fKCksIHIgPSB0OwogIH0KICBjbGFzcyBVc2VyRmFjaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgICBjb25zdHJ1Y3RvcihoZWFkbGluZSwgbWVzc2FnZSkgewogICAgICBzdXBlcihtZXNzYWdlKTsKICAgICAgdGhpcy5oZWFkbGluZSA9IGhlYWRsaW5lOwogICAgICB0aGlzLm5hbWUgPSAiVXNlckZhY2luZ0Vycm9yIjsKICAgIH0KICB9CiAgY2xhc3MgTWFwMmRCYXNlIHsKICAgIGNvbnN0cnVjdG9yKHNlcmlhbGl6ZUZpcnN0QXhpcywgc2VyaWFsaXplU2Vjb25kQXhpcywgaW5pdGlhbENvbnRlbnQpIHsKICAgICAgdGhpcy5zZXJpYWxpemVGaXJzdEF4aXMgPSBzZXJpYWxpemVGaXJzdEF4aXM7CiAgICAgIHRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcyA9IHNlcmlhbGl6ZVNlY29uZEF4aXM7CiAgICAgIHRoaXMuZGF0YSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIHRoaXMua2V5c0ZpcnN0QXhpcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIHRoaXMua2V5c1NlY29uZEF4aXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBpZiAoaW5pdGlhbENvbnRlbnQpIHsKICAgICAgICB0aGlzLmtleXNGaXJzdEF4aXMgPSBuZXcgTWFwKGluaXRpYWxDb250ZW50LmtleXNGaXJzdEF4aXMpOwogICAgICAgIHRoaXMua2V5c1NlY29uZEF4aXMgPSBuZXcgTWFwKGluaXRpYWxDb250ZW50LmtleXNTZWNvbmRBeGlzKTsKICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWFwKGluaXRpYWxDb250ZW50LmRhdGEpOwogICAgICB9CiAgICB9CiAgICBnZXQoa2V5Rmlyc3RBeGlzLCBrZXlTZWNvbmRBeGlzKSB7CiAgICAgIHZhciBfYTsKICAgICAgY29uc3Qgc2VyaWFsaXplZEtleUZpcnN0QXhpcyA9IHRoaXMuc2VyaWFsaXplRmlyc3RBeGlzKGtleUZpcnN0QXhpcyk7CiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRLZXlTZWNvbmRBeGlzID0gdGhpcy5zZXJpYWxpemVTZWNvbmRBeGlzKGtleVNlY29uZEF4aXMpOwogICAgICByZXR1cm4gKF9hID0gdGhpcy5kYXRhLmdldChzZXJpYWxpemVkS2V5Rmlyc3RBeGlzKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmdldChzZXJpYWxpemVkS2V5U2Vjb25kQXhpcyk7CiAgICB9CiAgICBnZXRSb3coa2V5LCBmaWxsRW1wdHlXaXRoKSB7CiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMgPSB0aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhrZXkpOwogICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGEuZ2V0KHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMpOwogICAgICBpZiAocm93ID09PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5rZXlzU2Vjb25kQXhpcy5rZXlzKCkpLm1hcCgoa2V5MikgPT4gcm93LmdldChrZXkyKSA/PyBmaWxsRW1wdHlXaXRoKTsKICAgIH0KICAgIHNldChrZXlGaXJzdEF4aXMsIGtleVNlY29uZEF4aXMsIHZhbHVlKSB7CiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMgPSB0aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhrZXlGaXJzdEF4aXMpOwogICAgICBjb25zdCBzZXJpYWxpemVkS2V5U2Vjb25kQXhpcyA9IHRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcyhrZXlTZWNvbmRBeGlzKTsKICAgICAgaWYgKCF0aGlzLmRhdGEuaGFzKHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMpKSB7CiAgICAgICAgdGhpcy5kYXRhLnNldChzZXJpYWxpemVkS2V5Rmlyc3RBeGlzLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTsKICAgICAgfQogICAgICB0aGlzLmRhdGEuZ2V0KHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMpLnNldChzZXJpYWxpemVkS2V5U2Vjb25kQXhpcywgdmFsdWUpOwogICAgICB0aGlzLmtleXNGaXJzdEF4aXMuc2V0KHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMsIGtleUZpcnN0QXhpcyk7CiAgICAgIHRoaXMua2V5c1NlY29uZEF4aXMuc2V0KHNlcmlhbGl6ZWRLZXlTZWNvbmRBeGlzLCBrZXlTZWNvbmRBeGlzKTsKICAgIH0KICAgIGRlbGV0ZVJvdyhrZXkpIHsKICAgICAgY29uc3Qgc2VyaWFsaXplZEtleUZpcnN0QXhpcyA9IHRoaXMuc2VyaWFsaXplRmlyc3RBeGlzKGtleSk7CiAgICAgIHRoaXMuZGF0YS5kZWxldGUoc2VyaWFsaXplZEtleUZpcnN0QXhpcyk7CiAgICAgIHRoaXMua2V5c0ZpcnN0QXhpcy5kZWxldGUoc2VyaWFsaXplZEtleUZpcnN0QXhpcyk7CiAgICB9CiAgICBnZXRGaXJzdEF4aXNLZXlzKCkgewogICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmtleXNGaXJzdEF4aXMudmFsdWVzKCkpOwogICAgfQogICAgZ2V0U2Vjb25kQXhpc0tleXMoKSB7CiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMua2V5c1NlY29uZEF4aXMudmFsdWVzKCkpOwogICAgfQogICAgZ2V0QXNBcnJheShmaWxsRW1wdHlXaXRoKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEZpcnN0QXhpc0tleXMoKS5tYXAoKGZpcnN0QXhpc0tleSkgPT4gewogICAgICAgIHJldHVybiB0aGlzLmdldFNlY29uZEF4aXNLZXlzKCkubWFwKChzZWNvbmRBeGlzS2V5KSA9PiB7CiAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoZmlyc3RBeGlzS2V5LCBzZWNvbmRBeGlzS2V5KSA/PyBmaWxsRW1wdHlXaXRoOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIGdldENvbnRlbnRzKCkgewogICAgICByZXR1cm4gewogICAgICAgIGtleXNGaXJzdEF4aXM6IHRoaXMua2V5c0ZpcnN0QXhpcywKICAgICAgICBrZXlzU2Vjb25kQXhpczogdGhpcy5rZXlzU2Vjb25kQXhpcywKICAgICAgICBkYXRhOiB0aGlzLmRhdGEKICAgICAgfTsKICAgIH0KICB9CiAgY2xhc3MgQmFzZU11dGF0aW9uT3ZlclRpbWVEYXRhTWFwIGV4dGVuZHMgTWFwMmRCYXNlIHsKICAgIGNvbnN0cnVjdG9yKGluaXRpYWxDb250ZW50KSB7CiAgICAgIHN1cGVyKHNlcmlhbGl6ZVN1YnN0aXR1dGlvbk9yRGVsZXRpb24sIHNlcmlhbGl6ZVRlbXBvcmFsLCBpbml0aWFsQ29udGVudCk7CiAgICB9CiAgfQogIGNvbnN0IHNvcnRTdWJzdGl0dXRpb25zQW5kRGVsZXRpb25zID0gKGEyLCBiKSA9PiB7CiAgICBpZiAoYTIuc2VnbWVudCAhPT0gYi5zZWdtZW50KSB7CiAgICAgIHJldHVybiBjb21wYXJlU2VnbWVudHMoYTIuc2VnbWVudCwgYi5zZWdtZW50KTsKICAgIH0KICAgIGlmIChhMi5wb3NpdGlvbiAhPT0gYi5wb3NpdGlvbikgewogICAgICByZXR1cm4gY29tcGFyZVBvc2l0aW9ucyhhMi5wb3NpdGlvbiwgYi5wb3NpdGlvbik7CiAgICB9CiAgICBjb25zdCBhSXNEZWxldGlvbiA9IGEyIGluc3RhbmNlb2YgRGVsZXRpb25DbGFzczsKICAgIGNvbnN0IGJJc0RlbGV0aW9uID0gYiBpbnN0YW5jZW9mIERlbGV0aW9uQ2xhc3M7CiAgICBpZiAoYUlzRGVsZXRpb24gIT09IGJJc0RlbGV0aW9uKSB7CiAgICAgIHJldHVybiBhSXNEZWxldGlvbiA/IDEgOiAtMTsKICAgIH0KICAgIGlmICghYUlzRGVsZXRpb24gJiYgIWJJc0RlbGV0aW9uKSB7CiAgICAgIGlmIChhMi5zdWJzdGl0dXRpb25WYWx1ZSAhPT0gYi5zdWJzdGl0dXRpb25WYWx1ZSkgewogICAgICAgIHJldHVybiBjb21wYXJlU3Vic3RpdHV0aW9uVmFsdWVzKGEyLnN1YnN0aXR1dGlvblZhbHVlLCBiLnN1YnN0aXR1dGlvblZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7CiAgfTsKICBjb25zdCBjb21wYXJlU2VnbWVudHMgPSAoYTIsIGIpID0+IHsKICAgIGlmIChhMiA9PT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGlmIChiID09PSB2b2lkIDApIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gYTIubG9jYWxlQ29tcGFyZShiKTsKICB9OwogIGNvbnN0IGNvbXBhcmVQb3NpdGlvbnMgPSAoYTIsIGIpID0+IHsKICAgIHJldHVybiBhMiAtIGI7CiAgfTsKICBjb25zdCBjb21wYXJlU3Vic3RpdHV0aW9uVmFsdWVzID0gKGEyLCBiKSA9PiB7CiAgICBpZiAoYTIgPT09IHZvaWQgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoYiA9PT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIGEyLmxvY2FsZUNvbXBhcmUoYik7CiAgfTsKICBjb25zdCBNQVhfTlVNQkVSX09GX0dSSURfQ09MVU1OUyA9IDIwMDsKICBhc3luYyBmdW5jdGlvbiBxdWVyeU92ZXJhbGxNdXRhdGlvbkRhdGEoewogICAgbGFwaXNGaWx0ZXIsCiAgICBzZXF1ZW5jZVR5cGUsCiAgICBsYXBpcywKICAgIGdyYW51bGFyaXR5LAogICAgbGFwaXNEYXRlRmllbGQsCiAgICBzaWduYWwKICB9KSB7CiAgICBjb25zdCBhbGxEYXRlcyA9IGF3YWl0IGdldERhdGVzSW5EYXRhc2V0KGxhcGlzRmlsdGVyLCBsYXBpcywgZ3JhbnVsYXJpdHksIGxhcGlzRGF0ZUZpZWxkLCBzaWduYWwpOwogICAgY29uc3QgZmlsdGVyID0gewogICAgICAuLi5sYXBpc0ZpbHRlciwKICAgICAgW2Ake2xhcGlzRGF0ZUZpZWxkfUZyb21gXTogYWxsRGF0ZXNbMF0uZmlyc3REYXkudG9TdHJpbmcoKSwKICAgICAgW2Ake2xhcGlzRGF0ZUZpZWxkfVRvYF06IGFsbERhdGVzW2FsbERhdGVzLmxlbmd0aCAtIDFdLmxhc3REYXkudG9TdHJpbmcoKQogICAgfTsKICAgIHJldHVybiBmZXRjaEFuZFByZXBhcmVTdWJzdGl0dXRpb25zT3JEZWxldGlvbnMoZmlsdGVyLCBzZXF1ZW5jZVR5cGUpLmV2YWx1YXRlKGxhcGlzLCBzaWduYWwpOwogIH0KICBhc3luYyBmdW5jdGlvbiBxdWVyeU11dGF0aW9uc092ZXJUaW1lRGF0YSh7CiAgICBsYXBpc0ZpbHRlciwKICAgIHNlcXVlbmNlVHlwZSwKICAgIGxhcGlzLAogICAgbGFwaXNEYXRlRmllbGQsCiAgICBncmFudWxhcml0eSwKICAgIHNpZ25hbAogIH0pIHsKICAgIGNvbnN0IGFsbERhdGVzID0gYXdhaXQgZ2V0RGF0ZXNJbkRhdGFzZXQobGFwaXNGaWx0ZXIsIGxhcGlzLCBncmFudWxhcml0eSwgbGFwaXNEYXRlRmllbGQsIHNpZ25hbCk7CiAgICBpZiAoYWxsRGF0ZXMubGVuZ3RoID4gTUFYX05VTUJFUl9PRl9HUklEX0NPTFVNTlMpIHsKICAgICAgdGhyb3cgbmV3IFVzZXJGYWNpbmdFcnJvcigKICAgICAgICAiVG9vIG1hbnkgZGF0ZXMiLAogICAgICAgIGBUaGUgZGF0YXNldCB3b3VsZCBjb250YWluICR7YWxsRGF0ZXMubGVuZ3RofSBkYXRlIGludGVydmFscy4gUGxlYXNlIHJlZHVjZSB0aGUgbnVtYmVyIHRvIGJlbG93ICR7TUFYX05VTUJFUl9PRl9HUklEX0NPTFVNTlN9IHRvIGRpc3BsYXkgdGhlIGRhdGEuIFlvdSBjYW4gYWNoaWV2ZSB0aGlzIGJ5IGVpdGhlciBuYXJyb3dpbmcgdGhlIGRhdGUgcmFuZ2UgaW4gdGhlIHByb3ZpZGVkIExBUElTIGZpbHRlciBvciBieSBzZWxlY3RpbmcgYSBsYXJnZXIgZ3JhbnVsYXJpdHkuYAogICAgICApOwogICAgfQogICAgY29uc3Qgc3ViUXVlcmllcyA9IGFsbERhdGVzLm1hcChhc3luYyAoZGF0ZSkgPT4gewogICAgICBjb25zdCBkYXRlRnJvbSA9IGRhdGUuZmlyc3REYXkudG9TdHJpbmcoKTsKICAgICAgY29uc3QgZGF0ZVRvID0gZGF0ZS5sYXN0RGF5LnRvU3RyaW5nKCk7CiAgICAgIGNvbnN0IGZpbHRlciA9IHsKICAgICAgICAuLi5sYXBpc0ZpbHRlciwKICAgICAgICBbYCR7bGFwaXNEYXRlRmllbGR9RnJvbWBdOiBkYXRlRnJvbSwKICAgICAgICBbYCR7bGFwaXNEYXRlRmllbGR9VG9gXTogZGF0ZVRvCiAgICAgIH07CiAgICAgIGNvbnN0IGRhdGEyID0gYXdhaXQgZmV0Y2hBbmRQcmVwYXJlU3Vic3RpdHV0aW9uc09yRGVsZXRpb25zKGZpbHRlciwgc2VxdWVuY2VUeXBlKS5ldmFsdWF0ZShsYXBpcywgc2lnbmFsKTsKICAgICAgY29uc3QgdG90YWxDb3VudFF1ZXJ5ID0gYXdhaXQgZ2V0VG90YWxOdW1iZXJPZlNlcXVlbmNlc0luRGF0ZVJhbmdlKGZpbHRlcikuZXZhbHVhdGUobGFwaXMsIHNpZ25hbCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0ZSwKICAgICAgICBtdXRhdGlvbnM6IGRhdGEyLmNvbnRlbnQsCiAgICAgICAgdG90YWxDb3VudDogdG90YWxDb3VudFF1ZXJ5LmNvbnRlbnRbMF0uY291bnQKICAgICAgfTsKICAgIH0pOwogICAgY29uc3QgZGF0YSA9IGF3YWl0IFByb21pc2UuYWxsKHN1YlF1ZXJpZXMpOwogICAgY29uc3Qgb3ZlcmFsbE11dGF0aW9uc0RhdGEgPSAoYXdhaXQgcXVlcnlPdmVyYWxsTXV0YXRpb25EYXRhKHsKICAgICAgbGFwaXNGaWx0ZXIsCiAgICAgIHNlcXVlbmNlVHlwZSwKICAgICAgbGFwaXMsCiAgICAgIGxhcGlzRGF0ZUZpZWxkLAogICAgICBncmFudWxhcml0eQogICAgfSkpLmNvbnRlbnQ7CiAgICByZXR1cm4gewogICAgICBtdXRhdGlvbk92ZXJUaW1lRGF0YTogZ3JvdXBCeU11dGF0aW9uKGRhdGEsIG92ZXJhbGxNdXRhdGlvbnNEYXRhKSwKICAgICAgb3ZlcmFsbE11dGF0aW9uRGF0YTogb3ZlcmFsbE11dGF0aW9uc0RhdGEKICAgIH07CiAgfQogIGFzeW5jIGZ1bmN0aW9uIGdldERhdGVzSW5EYXRhc2V0KGxhcGlzRmlsdGVyLCBsYXBpcywgZ3JhbnVsYXJpdHksIGxhcGlzRGF0ZUZpZWxkLCBzaWduYWwpIHsKICAgIGNvbnN0IHsgY29udGVudDogYXZhaWxhYmxlRGF0ZXMgfSA9IGF3YWl0IHF1ZXJ5QXZhaWxhYmxlRGF0ZXMoCiAgICAgIGxhcGlzRmlsdGVyLAogICAgICBsYXBpcywKICAgICAgZ3JhbnVsYXJpdHksCiAgICAgIGxhcGlzRGF0ZUZpZWxkLAogICAgICBzaWduYWwKICAgICk7CiAgICBjb25zdCB7IGRhdGVGcm9tLCBkYXRlVG8gfSA9IGdldERhdGVSYW5nZUZyb21GaWx0ZXIobGFwaXNGaWx0ZXIsIGxhcGlzRGF0ZUZpZWxkLCBncmFudWxhcml0eSk7CiAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSBnZXRNaW5NYXhUZW1wb3JhbChhdmFpbGFibGVEYXRlcyk7CiAgICByZXR1cm4gZ2VuZXJhdGVBbGxJblJhbmdlKGRhdGVGcm9tID8/IG1pbiwgZGF0ZVRvID8/IG1heCk7CiAgfQogIGZ1bmN0aW9uIGdldERhdGVSYW5nZUZyb21GaWx0ZXIobGFwaXNGaWx0ZXIsIGxhcGlzRGF0ZUZpZWxkLCBncmFudWxhcml0eSkgewogICAgY29uc3QgdmFsdWVGcm9tRmlsdGVyID0gbGFwaXNGaWx0ZXJbbGFwaXNEYXRlRmllbGRdOwogICAgaWYgKHZhbHVlRnJvbUZpbHRlcikgewogICAgICByZXR1cm4gewogICAgICAgIGRhdGVGcm9tOiBwYXJzZURhdGVTdHJpbmdUb1RlbXBvcmFsKHZhbHVlRnJvbUZpbHRlciwgZ3JhbnVsYXJpdHkpLAogICAgICAgIGRhdGVUbzogcGFyc2VEYXRlU3RyaW5nVG9UZW1wb3JhbCh2YWx1ZUZyb21GaWx0ZXIsIGdyYW51bGFyaXR5KQogICAgICB9OwogICAgfQogICAgY29uc3QgbWluRnJvbUZpbHRlciA9IGxhcGlzRmlsdGVyW2Ake2xhcGlzRGF0ZUZpZWxkfUZyb21gXTsKICAgIGNvbnN0IG1heEZyb21GaWx0ZXIgPSBsYXBpc0ZpbHRlcltgJHtsYXBpc0RhdGVGaWVsZH1Ub2BdOwogICAgcmV0dXJuIHsKICAgICAgZGF0ZUZyb206IG1pbkZyb21GaWx0ZXIgPyBwYXJzZURhdGVTdHJpbmdUb1RlbXBvcmFsKG1pbkZyb21GaWx0ZXIsIGdyYW51bGFyaXR5KSA6IG51bGwsCiAgICAgIGRhdGVUbzogbWF4RnJvbUZpbHRlciA/IHBhcnNlRGF0ZVN0cmluZ1RvVGVtcG9yYWwobWF4RnJvbUZpbHRlciwgZ3JhbnVsYXJpdHkpIDogbnVsbAogICAgfTsKICB9CiAgZnVuY3Rpb24gcXVlcnlBdmFpbGFibGVEYXRlcyhsYXBpc0ZpbHRlciwgbGFwaXMsIGdyYW51bGFyaXR5LCBsYXBpc0RhdGVGaWVsZCwgc2lnbmFsKSB7CiAgICByZXR1cm4gZmV0Y2hBbmRQcmVwYXJlRGF0ZXMobGFwaXNGaWx0ZXIsIGdyYW51bGFyaXR5LCBsYXBpc0RhdGVGaWVsZCkuZXZhbHVhdGUobGFwaXMsIHNpZ25hbCk7CiAgfQogIGZ1bmN0aW9uIGZldGNoQW5kUHJlcGFyZURhdGVzKGZpbHRlciwgZ3JhbnVsYXJpdHksIGxhcGlzRGF0ZUZpZWxkKSB7CiAgICBjb25zdCBmZXRjaERhdGEgPSBuZXcgRmV0Y2hBZ2dyZWdhdGVkT3BlcmF0b3IoZmlsdGVyLCBbbGFwaXNEYXRlRmllbGRdKTsKICAgIGNvbnN0IGRhdGFXaXRoRml4ZWREYXRlS2V5ID0gbmV3IFJlbmFtZUZpZWxkT3BlcmF0b3IoZmV0Y2hEYXRhLCBsYXBpc0RhdGVGaWVsZCwgImRhdGUiKTsKICAgIGNvbnN0IG1hcERhdGEgPSBuZXcgTWFwT3BlcmF0b3IoZGF0YVdpdGhGaXhlZERhdGVLZXksIChkYXRhKSA9PiBtYXBEYXRlVG9HcmFudWxhcml0eVJhbmdlKGRhdGEsIGdyYW51bGFyaXR5KSk7CiAgICBjb25zdCBncm91cEJ5RGF0YSA9IG5ldyBHcm91cEJ5QW5kU3VtT3BlcmF0b3IobWFwRGF0YSwgImRhdGVSYW5nZSIsICJjb3VudCIpOwogICAgY29uc3Qgc29ydERhdGEgPSBuZXcgU29ydE9wZXJhdG9yKGdyb3VwQnlEYXRhLCBkYXRlUmFuZ2VDb21wYXJlKTsKICAgIHJldHVybiBuZXcgTWFwT3BlcmF0b3Ioc29ydERhdGEsIChkYXRhKSA9PiBkYXRhLmRhdGVSYW5nZSk7CiAgfQogIGZ1bmN0aW9uIGZldGNoQW5kUHJlcGFyZVN1YnN0aXR1dGlvbnNPckRlbGV0aW9ucyhmaWx0ZXIsIHNlcXVlbmNlVHlwZSkgewogICAgcmV0dXJuIG5ldyBGZXRjaFN1YnN0aXR1dGlvbnNPckRlbGV0aW9uc09wZXJhdG9yKGZpbHRlciwgc2VxdWVuY2VUeXBlLCAxZS0zKTsKICB9CiAgZnVuY3Rpb24gc2VyaWFsaXplU3Vic3RpdHV0aW9uT3JEZWxldGlvbihtdXRhdGlvbikgewogICAgcmV0dXJuIG11dGF0aW9uLmNvZGU7CiAgfQogIGZ1bmN0aW9uIHNlcmlhbGl6ZVRlbXBvcmFsKGRhdGUpIHsKICAgIHJldHVybiBkYXRlLmRhdGVTdHJpbmc7CiAgfQogIGZ1bmN0aW9uIGdyb3VwQnlNdXRhdGlvbihkYXRhLCBvdmVyYWxsTXV0YXRpb25EYXRhKSB7CiAgICBjb25zdCBkYXRhQXJyYXkgPSBuZXcgQmFzZU11dGF0aW9uT3ZlclRpbWVEYXRhTWFwKCk7CiAgICBjb25zdCBhbGxEYXRlcyA9IGRhdGEubWFwKChtdXRhdGlvbkRhdGEpID0+IG11dGF0aW9uRGF0YS5kYXRlKTsKICAgIGNvbnN0IHNvcnRlZE92ZXJhbGxNdXRhdGlvbkRhdGEgPSBvdmVyYWxsTXV0YXRpb25EYXRhLnNvcnQoKGEyLCBiKSA9PiBzb3J0U3Vic3RpdHV0aW9uc0FuZERlbGV0aW9ucyhhMi5tdXRhdGlvbiwgYi5tdXRhdGlvbikpLm1hcCgoZW50cnkpID0+IHsKICAgICAgcmV0dXJuIHRvU3Vic3RpdHV0aW9uT3JEZWxldGlvbihlbnRyeS5tdXRhdGlvbik7CiAgICB9KTsKICAgIGNvbnN0IHNvcnRlZERhdGVzID0gYWxsRGF0ZXMuc29ydCgoYTIsIGIpID0+IGNvbXBhcmVUZW1wb3JhbChhMiwgYikpLm1hcCgoZGF0ZSkgPT4gdG9UZW1wb3JhbChkYXRlKSk7CiAgICBzb3J0ZWRPdmVyYWxsTXV0YXRpb25EYXRhLmZvckVhY2goKG11dGF0aW9uRGF0YSkgPT4gewogICAgICBzb3J0ZWREYXRlcy5mb3JFYWNoKChkYXRlKSA9PiB7CiAgICAgICAgZGF0YUFycmF5LnNldChtdXRhdGlvbkRhdGEsIGRhdGUsIHsKICAgICAgICAgIGNvdW50OiAwLAogICAgICAgICAgcHJvcG9ydGlvbjogMCwKICAgICAgICAgIHRvdGFsQ291bnQ6IDAKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGRhdGEuZm9yRWFjaCgobXV0YXRpb25EYXRhKSA9PiB7CiAgICAgIG11dGF0aW9uRGF0YS5tdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb25FbnRyeSkgPT4gewogICAgICAgIGNvbnN0IG11dGF0aW9uID0gdG9TdWJzdGl0dXRpb25PckRlbGV0aW9uKG11dGF0aW9uRW50cnkubXV0YXRpb24pOwogICAgICAgIGNvbnN0IGRhdGUgPSB0b1RlbXBvcmFsKG11dGF0aW9uRGF0YS5kYXRlKTsKICAgICAgICBpZiAoZGF0YUFycmF5LmdldChtdXRhdGlvbiwgZGF0ZSkgIT09IHZvaWQgMCkgewogICAgICAgICAgZGF0YUFycmF5LnNldChtdXRhdGlvbiwgZGF0ZSwgewogICAgICAgICAgICBjb3VudDogbXV0YXRpb25FbnRyeS5jb3VudCwKICAgICAgICAgICAgcHJvcG9ydGlvbjogbXV0YXRpb25FbnRyeS5wcm9wb3J0aW9uLAogICAgICAgICAgICB0b3RhbENvdW50OiBtdXRhdGlvbkRhdGEudG90YWxDb3VudAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIGRhdGFBcnJheTsKICB9CiAgZnVuY3Rpb24gZ2V0VG90YWxOdW1iZXJPZlNlcXVlbmNlc0luRGF0ZVJhbmdlKGZpbHRlcikgewogICAgcmV0dXJuIG5ldyBGZXRjaEFnZ3JlZ2F0ZWRPcGVyYXRvcihmaWx0ZXIpOwogIH0KICBhc3luYyBmdW5jdGlvbiB3b3JrZXJGdW5jdGlvbihxdWVyeUZ1bmN0aW9uKSB7CiAgICB0cnkgewogICAgICBwb3N0TWVzc2FnZSh7IHN0YXR1czogImxvYWRpbmciIH0pOwogICAgICBjb25zdCB3b3JrZXJSZXNwb25zZSA9IGF3YWl0IHF1ZXJ5RnVuY3Rpb24oKTsKICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgIHN0YXR1czogInN1Y2Nlc3MiLAogICAgICAgIGRhdGE6IHdvcmtlclJlc3BvbnNlCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgcG9zdE1lc3NhZ2UoeyBzdGF0dXM6ICJlcnJvciIsIGVycm9yIH0pOwogICAgfQogIH0KICBhc3luYyBmdW5jdGlvbiBnZXRNdXRhdGlvbk92ZXJUaW1lV29ya2VyRnVuY3Rpb24oZXZlbnQpIHsKICAgIGNvbnN0IG11dGF0aW9uT3ZlclRpbWVEYXRhID0gYXdhaXQgcXVlcnlNdXRhdGlvbnNPdmVyVGltZURhdGEoZXZlbnQuZGF0YSk7CiAgICBjb25zdCB3b3JrZXJSZXNwb25zZSA9IHsKICAgICAgb3ZlcmFsbE11dGF0aW9uRGF0YTogbXV0YXRpb25PdmVyVGltZURhdGEub3ZlcmFsbE11dGF0aW9uRGF0YSwKICAgICAgbXV0YXRpb25PdmVyVGltZVNlcmlhbGl6ZWQ6IG11dGF0aW9uT3ZlclRpbWVEYXRhLm11dGF0aW9uT3ZlclRpbWVEYXRhLmdldENvbnRlbnRzKCkKICAgIH07CiAgICByZXR1cm4gd29ya2VyUmVzcG9uc2U7CiAgfQogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgZnVuY3Rpb24oZXZlbnQpIHsKICAgIGF3YWl0IHdvcmtlckZ1bmN0aW9uKCgpID0+IGdldE11dGF0aW9uT3ZlclRpbWVXb3JrZXJGdW5jdGlvbihldmVudCkpOwogIH07Cn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW11dGF0aW9uT3ZlclRpbWVXb3JrZXItQk9DWHRLemQuanMubWFwCg==", jV = (n) => Uint8Array.from(atob(n), (e) => e.charCodeAt(0)), eC = typeof self < "u" && self.Blob && new Blob([jV(Ip)], { type: "text/javascript;charset=utf-8" });
|
|
28636
28648
|
function EV(n) {
|
|
28637
28649
|
let e;
|
|
@@ -28936,7 +28948,7 @@ const g1 = ({ value: n, mutation: e, date: t, tooltipPosition: i, showProportion
|
|
|
28936
28948
|
children: o ? Vt(n.proportion, 0) : void 0
|
|
28937
28949
|
}
|
|
28938
28950
|
) }) });
|
|
28939
|
-
}, c1 = (n) => n instanceof
|
|
28951
|
+
}, c1 = (n) => n instanceof ln ? n.toString() : `${n.firstDay.toString()} - ${n.lastDay.toString()}`, d1 = ({ mutation: n }) => /* @__PURE__ */ h("div", { className: "text-center", children: n.code }), I1 = ({
|
|
28940
28952
|
colorScale: n,
|
|
28941
28953
|
setColorScale: e
|
|
28942
28954
|
}) => /* @__PURE__ */ h("div", { className: "w-20", children: /* @__PURE__ */ h(Jc, { buttonTitle: "Color scale", placement: "bottom-start", children: /* @__PURE__ */ h(e1, { colorScale: n, setColorScale: e }) }) });
|
|
@@ -28961,13 +28973,13 @@ function u1(n, e) {
|
|
|
28961
28973
|
s(new Error(`Worker received a message that it cannot deserialize: ${l.data}`)), r(!1);
|
|
28962
28974
|
}, () => {
|
|
28963
28975
|
e.terminate();
|
|
28964
|
-
}), []),
|
|
28976
|
+
}), []), rn(() => {
|
|
28965
28977
|
e.postMessage(n);
|
|
28966
28978
|
}, [n]), { data: t, error: o, isLoading: a };
|
|
28967
28979
|
}
|
|
28968
28980
|
const C1 = (n) => {
|
|
28969
28981
|
const { width: e, height: t } = n, i = { height: t, width: e };
|
|
28970
|
-
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(
|
|
28982
|
+
return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(h1, { ...n }) }) });
|
|
28971
28983
|
}, h1 = (n) => {
|
|
28972
28984
|
const e = Se(De), { lapisFilter: t, sequenceType: i, granularity: o, lapisDateField: s } = n, { data: a, error: r, isLoading: l } = u1(
|
|
28973
28985
|
{
|
|
@@ -28980,11 +28992,11 @@ const C1 = (n) => {
|
|
|
28980
28992
|
new EV()
|
|
28981
28993
|
);
|
|
28982
28994
|
if (l)
|
|
28983
|
-
return /* @__PURE__ */ h(
|
|
28995
|
+
return /* @__PURE__ */ h(Ot, {});
|
|
28984
28996
|
if (r !== void 0)
|
|
28985
|
-
return /* @__PURE__ */ h(
|
|
28997
|
+
return /* @__PURE__ */ h(Jt, { error: r });
|
|
28986
28998
|
if (a == null)
|
|
28987
|
-
return /* @__PURE__ */ h(
|
|
28999
|
+
return /* @__PURE__ */ h(kt, {});
|
|
28988
29000
|
const { overallMutationData: g, mutationOverTimeSerialized: c } = a, d = new $V(c);
|
|
28989
29001
|
return /* @__PURE__ */ h(
|
|
28990
29002
|
A1,
|
|
@@ -29002,7 +29014,7 @@ const C1 = (n) => {
|
|
|
29002
29014
|
const [i, o] = oe({ min: 0.05, max: 0.9 }), [s, a] = oe({ min: 0, max: 1, color: "indigo" }), [r, l] = Ec(e.sequenceType), [g, c] = oe([
|
|
29003
29015
|
{ label: "Substitutions", checked: !0, type: "substitution" },
|
|
29004
29016
|
{ label: "Deletions", checked: !0, type: "deletion" }
|
|
29005
|
-
]), d =
|
|
29017
|
+
]), d = rn(() => qV(
|
|
29006
29018
|
n,
|
|
29007
29019
|
t,
|
|
29008
29020
|
r,
|
|
@@ -29012,7 +29024,7 @@ const C1 = (n) => {
|
|
|
29012
29024
|
if (d === void 0)
|
|
29013
29025
|
return {
|
|
29014
29026
|
title: "Calculating",
|
|
29015
|
-
content: /* @__PURE__ */ h(
|
|
29027
|
+
content: /* @__PURE__ */ h(Ot, {})
|
|
29016
29028
|
};
|
|
29017
29029
|
switch (A) {
|
|
29018
29030
|
case "grid":
|
|
@@ -29106,7 +29118,7 @@ var b1 = Object.defineProperty, y1 = Object.getOwnPropertyDescriptor, pi = (n, e
|
|
|
29106
29118
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
29107
29119
|
return i && o && b1(e, t, o), o;
|
|
29108
29120
|
};
|
|
29109
|
-
let
|
|
29121
|
+
let Hn = class extends es {
|
|
29110
29122
|
constructor() {
|
|
29111
29123
|
super(...arguments), this.lapisFilter = {}, this.sequenceType = "nucleotide", this.views = ["grid"], this.width = "100%", this.height = "700px", this.granularity = "week", this.lapisDateField = "date";
|
|
29112
29124
|
}
|
|
@@ -29127,28 +29139,28 @@ let kn = class extends es {
|
|
|
29127
29139
|
};
|
|
29128
29140
|
pi([
|
|
29129
29141
|
Y({ type: Object })
|
|
29130
|
-
],
|
|
29142
|
+
], Hn.prototype, "lapisFilter", 2);
|
|
29131
29143
|
pi([
|
|
29132
29144
|
Y({ type: String })
|
|
29133
|
-
],
|
|
29145
|
+
], Hn.prototype, "sequenceType", 2);
|
|
29134
29146
|
pi([
|
|
29135
29147
|
Y({ type: Array })
|
|
29136
|
-
],
|
|
29148
|
+
], Hn.prototype, "views", 2);
|
|
29137
29149
|
pi([
|
|
29138
29150
|
Y({ type: String })
|
|
29139
|
-
],
|
|
29151
|
+
], Hn.prototype, "width", 2);
|
|
29140
29152
|
pi([
|
|
29141
29153
|
Y({ type: String })
|
|
29142
|
-
],
|
|
29154
|
+
], Hn.prototype, "height", 2);
|
|
29143
29155
|
pi([
|
|
29144
29156
|
Y({ type: String })
|
|
29145
|
-
],
|
|
29157
|
+
], Hn.prototype, "granularity", 2);
|
|
29146
29158
|
pi([
|
|
29147
29159
|
Y({ type: String })
|
|
29148
|
-
],
|
|
29149
|
-
|
|
29160
|
+
], Hn.prototype, "lapisDateField", 2);
|
|
29161
|
+
Hn = pi([
|
|
29150
29162
|
Zt("gs-mutations-over-time")
|
|
29151
|
-
],
|
|
29163
|
+
], Hn);
|
|
29152
29164
|
const Cp = (n) => n.map((e) => ({ label: e.label, value: e.label })), hp = (n, e, t) => {
|
|
29153
29165
|
const i = /* @__PURE__ */ new Date(), o = { dateFrom: new Date(t), dateTo: i };
|
|
29154
29166
|
if (n === void 0)
|
|
@@ -29313,7 +29325,7 @@ var G1 = Object.defineProperty, B1 = Object.getOwnPropertyDescriptor, fi = (n, e
|
|
|
29313
29325
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
29314
29326
|
return i && o && G1(e, t, o), o;
|
|
29315
29327
|
};
|
|
29316
|
-
let
|
|
29328
|
+
let Sn = class extends Cn {
|
|
29317
29329
|
constructor() {
|
|
29318
29330
|
super(...arguments), this.dateRangeOptions = [], this.earliestDate = "1900-01-01", this.initialValue = void 0, this.initialDateFrom = "", this.initialDateTo = "", this.width = "100%", this.dateColumn = "date";
|
|
29319
29331
|
}
|
|
@@ -29334,28 +29346,28 @@ let Hn = class extends un {
|
|
|
29334
29346
|
};
|
|
29335
29347
|
fi([
|
|
29336
29348
|
Y({ type: Array })
|
|
29337
|
-
],
|
|
29349
|
+
], Sn.prototype, "dateRangeOptions", 2);
|
|
29338
29350
|
fi([
|
|
29339
29351
|
Y({ type: String })
|
|
29340
|
-
],
|
|
29352
|
+
], Sn.prototype, "earliestDate", 2);
|
|
29341
29353
|
fi([
|
|
29342
29354
|
Y()
|
|
29343
|
-
],
|
|
29355
|
+
], Sn.prototype, "initialValue", 2);
|
|
29344
29356
|
fi([
|
|
29345
29357
|
Y()
|
|
29346
|
-
],
|
|
29358
|
+
], Sn.prototype, "initialDateFrom", 2);
|
|
29347
29359
|
fi([
|
|
29348
29360
|
Y()
|
|
29349
|
-
],
|
|
29361
|
+
], Sn.prototype, "initialDateTo", 2);
|
|
29350
29362
|
fi([
|
|
29351
29363
|
Y({ type: String })
|
|
29352
|
-
],
|
|
29364
|
+
], Sn.prototype, "width", 2);
|
|
29353
29365
|
fi([
|
|
29354
29366
|
Y({ type: String })
|
|
29355
|
-
],
|
|
29356
|
-
|
|
29367
|
+
], Sn.prototype, "dateColumn", 2);
|
|
29368
|
+
Sn = fi([
|
|
29357
29369
|
Zt("gs-date-range-selector")
|
|
29358
|
-
],
|
|
29370
|
+
], Sn);
|
|
29359
29371
|
async function W1(n, e, t) {
|
|
29360
29372
|
const i = Array(n.length - 1).fill(0).map((r, l) => l + 1).map((r) => n.slice(r).reduce((l, g) => ({ ...l, [g]: null }), {}));
|
|
29361
29373
|
return [...(await new eo({}, n).evaluate(e, t)).content.map((r) => n.reduce((l, g) => ({ ...l, [g]: r[g] }), {})).reduce((r, l) => (r.add(JSON.stringify(l)), i.forEach((g) => {
|
|
@@ -29374,10 +29386,10 @@ function V1(n) {
|
|
|
29374
29386
|
}
|
|
29375
29387
|
const X1 = ({ width: n, ...e }) => {
|
|
29376
29388
|
const t = { width: n, height: "3rem" };
|
|
29377
|
-
return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(
|
|
29389
|
+
return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Dt, { size: t, children: /* @__PURE__ */ h(R1, { ...e }) }) });
|
|
29378
29390
|
}, R1 = ({ initialValue: n, fields: e, placeholderText: t }) => {
|
|
29379
29391
|
const i = Se(De), [o, s] = oe(n ?? ""), [a, r] = oe(!1), l = Ke(null), { data: g, error: c, isLoading: d } = Yn(() => W1(e, i), [e, i]);
|
|
29380
|
-
return d ? /* @__PURE__ */ h(
|
|
29392
|
+
return d ? /* @__PURE__ */ h(Ot, {}) : c ? /* @__PURE__ */ h(Jt, { error: c }) : /* @__PURE__ */ h("div", { class: "flex w-full", ref: l, children: [
|
|
29381
29393
|
/* @__PURE__ */ h(
|
|
29382
29394
|
"input",
|
|
29383
29395
|
{
|
|
@@ -29418,7 +29430,7 @@ var S1 = Object.defineProperty, Y1 = Object.getOwnPropertyDescriptor, pa = (n, e
|
|
|
29418
29430
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
29419
29431
|
return i && o && S1(e, t, o), o;
|
|
29420
29432
|
};
|
|
29421
|
-
let Jo = class extends
|
|
29433
|
+
let Jo = class extends Cn {
|
|
29422
29434
|
constructor() {
|
|
29423
29435
|
super(...arguments), this.initialValue = "", this.fields = [], this.width = "100%", this.placeholderText = "";
|
|
29424
29436
|
}
|
|
@@ -29454,15 +29466,15 @@ async function N1(n, e, t) {
|
|
|
29454
29466
|
}
|
|
29455
29467
|
const F1 = ({ width: n, ...e }) => {
|
|
29456
29468
|
const t = { width: n, height: "3rem" };
|
|
29457
|
-
return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(
|
|
29469
|
+
return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Dt, { size: t, children: /* @__PURE__ */ h(K1, { ...e }) }) });
|
|
29458
29470
|
}, K1 = ({ lapisField: n, placeholderText: e, initialValue: t }) => {
|
|
29459
29471
|
const i = Se(De), o = Ke(null), { data: s, error: a, isLoading: r } = Yn(() => N1(i, n), [n, i]);
|
|
29460
29472
|
if (r)
|
|
29461
|
-
return /* @__PURE__ */ h(
|
|
29473
|
+
return /* @__PURE__ */ h(Ot, {});
|
|
29462
29474
|
if (a !== null)
|
|
29463
|
-
return /* @__PURE__ */ h(
|
|
29475
|
+
return /* @__PURE__ */ h(Jt, { error: a });
|
|
29464
29476
|
if (s === null)
|
|
29465
|
-
return /* @__PURE__ */ h(
|
|
29477
|
+
return /* @__PURE__ */ h(kt, {});
|
|
29466
29478
|
const l = () => {
|
|
29467
29479
|
var c, d, I;
|
|
29468
29480
|
const u = ((c = o.current) == null ? void 0 : c.value) === "" || (d = o.current) == null ? void 0 : d.value;
|
|
@@ -29495,7 +29507,7 @@ var _1 = Object.defineProperty, z1 = Object.getOwnPropertyDescriptor, fa = (n, e
|
|
|
29495
29507
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
29496
29508
|
return i && o && _1(e, t, o), o;
|
|
29497
29509
|
};
|
|
29498
|
-
let Do = class extends
|
|
29510
|
+
let Do = class extends Cn {
|
|
29499
29511
|
constructor() {
|
|
29500
29512
|
super(...arguments), this.initialValue = "", this.lapisField = "", this.placeholderText = "", this.width = "100%";
|
|
29501
29513
|
}
|
|
@@ -29538,9 +29550,9 @@ const T1 = () => {
|
|
|
29538
29550
|
return /* @__PURE__ */ h(hi, { children: [
|
|
29539
29551
|
/* @__PURE__ */ h(Ai, { children: " Mutation Filter" }),
|
|
29540
29552
|
/* @__PURE__ */ h(Ce, { children: "This component allows you to filter for mutations at specific positions." }),
|
|
29541
|
-
/* @__PURE__ */ h(
|
|
29553
|
+
/* @__PURE__ */ h(Ut, { children: " Nucleotide Mutations and Insertions" }),
|
|
29542
29554
|
xA(n) ? /* @__PURE__ */ h(J1, {}) : /* @__PURE__ */ h(D1, {}),
|
|
29543
|
-
/* @__PURE__ */ h(
|
|
29555
|
+
/* @__PURE__ */ h(Ut, { children: "Amino Acid Mutations and Insertions" }),
|
|
29544
29556
|
/* @__PURE__ */ h(Ce, { children: [
|
|
29545
29557
|
"An amino acid mutation has the format ",
|
|
29546
29558
|
/* @__PURE__ */ h("b", { children: "<gene>:<position><base>" }),
|
|
@@ -29575,7 +29587,7 @@ const T1 = () => {
|
|
|
29575
29587
|
n.genes.map((t) => t.name).join(", "),
|
|
29576
29588
|
"."
|
|
29577
29589
|
] }),
|
|
29578
|
-
/* @__PURE__ */ h(
|
|
29590
|
+
/* @__PURE__ */ h(Ut, { children: "Insertion Wildcards" }),
|
|
29579
29591
|
/* @__PURE__ */ h(Ce, { children: [
|
|
29580
29592
|
"This component supports insertion queries that contain wildcards ",
|
|
29581
29593
|
/* @__PURE__ */ h("b", { children: "?" }),
|
|
@@ -29610,9 +29622,9 @@ const T1 = () => {
|
|
|
29610
29622
|
] }),
|
|
29611
29623
|
" match any (but at least one) insertion between the positions 214 and 215."
|
|
29612
29624
|
] }),
|
|
29613
|
-
/* @__PURE__ */ h(
|
|
29625
|
+
/* @__PURE__ */ h(Ut, { children: "Multiple Mutations" }),
|
|
29614
29626
|
/* @__PURE__ */ h(Ce, { children: "Multiple mutation filters can be provided by adding one mutation after the other." }),
|
|
29615
|
-
/* @__PURE__ */ h(
|
|
29627
|
+
/* @__PURE__ */ h(Ut, { children: "Any Mutation" }),
|
|
29616
29628
|
/* @__PURE__ */ h(Ce, { children: [
|
|
29617
29629
|
"To filter for any mutation at a given position you can omit the ",
|
|
29618
29630
|
/* @__PURE__ */ h("b", { children: "<base>" }),
|
|
@@ -29624,7 +29636,7 @@ const T1 = () => {
|
|
|
29624
29636
|
] }),
|
|
29625
29637
|
"."
|
|
29626
29638
|
] }),
|
|
29627
|
-
/* @__PURE__ */ h(
|
|
29639
|
+
/* @__PURE__ */ h(Ut, { children: "No Mutation" }),
|
|
29628
29640
|
/* @__PURE__ */ h(Ce, { children: [
|
|
29629
29641
|
"You can write a ",
|
|
29630
29642
|
/* @__PURE__ */ h("b", { children: "." }),
|
|
@@ -29991,7 +30003,7 @@ var tX = Object.defineProperty, nX = Object.getOwnPropertyDescriptor, nd = (n, e
|
|
|
29991
30003
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
29992
30004
|
return i && o && tX(e, t, o), o;
|
|
29993
30005
|
};
|
|
29994
|
-
let Kr = class extends
|
|
30006
|
+
let Kr = class extends Cn {
|
|
29995
30007
|
constructor() {
|
|
29996
30008
|
super(...arguments), this.initialValue = void 0, this.width = "100%";
|
|
29997
30009
|
}
|
|
@@ -30013,7 +30025,7 @@ async function iX(n, e, t) {
|
|
|
30013
30025
|
}
|
|
30014
30026
|
const oX = ({ width: n, ...e }) => {
|
|
30015
30027
|
const t = { width: n, height: "3rem" };
|
|
30016
|
-
return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(
|
|
30028
|
+
return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Dt, { size: t, children: /* @__PURE__ */ h(sX, { ...e }) }) });
|
|
30017
30029
|
}, sX = ({
|
|
30018
30030
|
lapisField: n,
|
|
30019
30031
|
placeholderText: e,
|
|
@@ -30024,11 +30036,11 @@ const oX = ({ width: n, ...e }) => {
|
|
|
30024
30036
|
[n, i]
|
|
30025
30037
|
);
|
|
30026
30038
|
if (r)
|
|
30027
|
-
return /* @__PURE__ */ h(
|
|
30039
|
+
return /* @__PURE__ */ h(Ot, {});
|
|
30028
30040
|
if (a !== null)
|
|
30029
|
-
return /* @__PURE__ */ h(
|
|
30041
|
+
return /* @__PURE__ */ h(Jt, { error: a });
|
|
30030
30042
|
if (s === null)
|
|
30031
|
-
return /* @__PURE__ */ h(
|
|
30043
|
+
return /* @__PURE__ */ h(kt, {});
|
|
30032
30044
|
const l = () => {
|
|
30033
30045
|
var c, d, I;
|
|
30034
30046
|
const u = ((c = o.current) == null ? void 0 : c.value) === "" || (d = o.current) == null ? void 0 : d.value;
|
|
@@ -30061,7 +30073,7 @@ var aX = Object.defineProperty, rX = Object.getOwnPropertyDescriptor, ma = (n, e
|
|
|
30061
30073
|
(a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
|
|
30062
30074
|
return i && o && aX(e, t, o), o;
|
|
30063
30075
|
};
|
|
30064
|
-
let Oo = class extends
|
|
30076
|
+
let Oo = class extends Cn {
|
|
30065
30077
|
constructor() {
|
|
30066
30078
|
super(...arguments), this.initialValue = "", this.lapisField = "", this.placeholderText = "", this.width = "100%";
|
|
30067
30079
|
}
|
|
@@ -30128,18 +30140,18 @@ const kX = {
|
|
|
30128
30140
|
}
|
|
30129
30141
|
};
|
|
30130
30142
|
export {
|
|
30131
|
-
|
|
30143
|
+
gn as AggregateComponent,
|
|
30132
30144
|
Sr as App,
|
|
30133
|
-
|
|
30145
|
+
Sn as DateRangeSelectorComponent,
|
|
30134
30146
|
Oo as LineageFilterComponent,
|
|
30135
30147
|
Jo as LocationFilterComponent,
|
|
30136
30148
|
gi as MutationComparisonComponent,
|
|
30137
30149
|
Kr as MutationFilterComponent,
|
|
30138
30150
|
ci as MutationsComponent,
|
|
30139
|
-
|
|
30140
|
-
|
|
30151
|
+
Hn as MutationsOverTimeComponent,
|
|
30152
|
+
cn as NumberSequencesOverTimeComponent,
|
|
30141
30153
|
ut as PrevalenceOverTimeComponent,
|
|
30142
|
-
|
|
30154
|
+
Tt as RelativeGrowthAdvantageComponent,
|
|
30143
30155
|
Do as TextInputComponent,
|
|
30144
30156
|
rr as UserFacingError,
|
|
30145
30157
|
kX as dateRangeOptionPresets
|