@dbx-tools/appkit-mastra 0.6.15 → 0.6.27
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/README.md +87 -11
- package/index.ts +6 -3
- package/lib/index.d.ts +6 -3
- package/lib/index.js +5 -2
- package/lib/src/chart.d.ts +39 -9
- package/lib/src/chart.js +460 -77
- package/lib/src/genie.js +24 -24
- package/lib/src/plugin.js +29 -3
- package/lib/src/remote-skills.js +10 -10
- package/lib/src/skill-paths.d.ts +15 -0
- package/lib/src/skill-paths.js +18 -0
- package/lib/src/workspaces.d.ts +85 -15
- package/lib/src/workspaces.js +128 -64
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -13
- package/src/chart.ts +519 -83
- package/src/genie.ts +24 -23
- package/src/plugin.ts +28 -2
- package/src/remote-skills.ts +10 -11
- package/src/skill-paths.ts +19 -0
- package/src/workspaces.ts +194 -84
package/lib/src/chart.js
CHANGED
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
* @module
|
|
28
28
|
*/
|
|
29
29
|
import { AppKitError, CacheManager, ExecutionError } from "@databricks/appkit";
|
|
30
|
-
import { async, error, hash, log, string } from "@dbx-tools/shared-core";
|
|
31
|
-
import { wire } from "@dbx-tools/shared-mastra";
|
|
30
|
+
import { async, error, hash, json, log, string } from "@dbx-tools/shared-core";
|
|
31
|
+
import { marker, wire } from "@dbx-tools/shared-mastra";
|
|
32
32
|
import { model } from "@dbx-tools/shared-model";
|
|
33
33
|
import { Agent } from "@mastra/core/agent";
|
|
34
34
|
import { createTool } from "@mastra/core/tools";
|
|
@@ -58,22 +58,23 @@ const CHART_FAILED_MESSAGE = "Chart generation failed";
|
|
|
58
58
|
* One series data point. Wide variant set so the planner agent can
|
|
59
59
|
* faithfully pass through whatever the SQL row set contained
|
|
60
60
|
* (numbers, stringified numbers, nulls for missing measurements,
|
|
61
|
-
* `[x, y]` tuples for scatter, `
|
|
62
|
-
*
|
|
61
|
+
* `[x, y]` tuples for scatter, `[x, y, value]` triples for heatmap,
|
|
62
|
+
* `{name, value}` slices for pie / funnel / treemap) without the
|
|
63
|
+
* structured-output guard rejecting the whole plan.
|
|
63
64
|
*
|
|
64
65
|
* Three layers of tolerance:
|
|
65
66
|
*
|
|
66
67
|
* 1. {@link z.preprocess} normalizes wire shapes BEFORE union
|
|
67
68
|
* dispatch: stringified numbers parse to numbers, finite
|
|
68
|
-
* checks reject `NaN` / `Infinity`, 2-element arrays coerce
|
|
69
|
+
* checks reject `NaN` / `Infinity`, 2-/3-element arrays coerce
|
|
69
70
|
* tuple components, and `{value}` objects with missing /
|
|
70
71
|
* stringified `value` get coerced or rejected uniformly.
|
|
71
72
|
* Anything not handleable becomes `null`.
|
|
72
73
|
* 2. The union accepts `null` as a first-class variant. Echarts
|
|
73
74
|
* renders null as a gap on bar / line / area (which is the
|
|
74
|
-
* right visual signal for "missing reading"). Scatter
|
|
75
|
-
*
|
|
76
|
-
* Echarts crashes on null tuples / slices.
|
|
75
|
+
* right visual signal for "missing reading"). Scatter, heatmap,
|
|
76
|
+
* and slice charts filter nulls in {@link planToEchartsOption}
|
|
77
|
+
* because Echarts crashes on null tuples / slices.
|
|
77
78
|
* 3. {@link z.union#catch} backstops the whole thing: if
|
|
78
79
|
* preprocess somehow produces a shape that still doesn't
|
|
79
80
|
* match any variant, the bad item becomes `null` instead of
|
|
@@ -90,10 +91,11 @@ const chartDataPointSchema = z
|
|
|
90
91
|
const n = Number(v);
|
|
91
92
|
return Number.isFinite(n) ? n : null;
|
|
92
93
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
// Scatter `[x, y]` or heatmap `[xIndex, yIndex, value]`. Coerce
|
|
95
|
+
// stringified components; reject if any component is non-finite.
|
|
96
|
+
if (Array.isArray(v) && (v.length === 2 || v.length === 3)) {
|
|
97
|
+
const nums = v.map((c) => (typeof c === "number" ? c : Number(c)));
|
|
98
|
+
return nums.every((n) => Number.isFinite(n)) ? nums : null;
|
|
97
99
|
}
|
|
98
100
|
if (typeof v === "object" && v !== null && "value" in v) {
|
|
99
101
|
const obj = v;
|
|
@@ -111,18 +113,21 @@ const chartDataPointSchema = z
|
|
|
111
113
|
}, z.union([
|
|
112
114
|
z.number(),
|
|
113
115
|
z.null(),
|
|
114
|
-
// `[x, y]` scatter
|
|
115
|
-
// homogeneous array rather than `z.tuple`:
|
|
116
|
-
// JSON Schema 2020-12 `prefixItems`, and
|
|
117
|
-
// endpoints reject a `response_json_schema`
|
|
118
|
-
// ("must be a boolean or an object", since
|
|
119
|
-
// `
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
z.array(z.number()).length(2),
|
|
116
|
+
// `[x, y]` scatter or `[x, y, value]` heatmap cell. Modelled as a
|
|
117
|
+
// length-constrained homogeneous array rather than `z.tuple`:
|
|
118
|
+
// Zod emits a tuple as JSON Schema 2020-12 `prefixItems`, and
|
|
119
|
+
// Databricks' Gemini endpoints reject a `response_json_schema`
|
|
120
|
+
// containing it ("must be a boolean or an object", since
|
|
121
|
+
// `items` is absent). `minItems` / `maxItems` + `items` is what
|
|
122
|
+
// every provider understands.
|
|
123
|
+
z.array(z.number()).min(2).max(3),
|
|
123
124
|
z.object({ name: z.string(), value: z.number() }),
|
|
124
125
|
]))
|
|
125
126
|
.catch(null);
|
|
127
|
+
/** Per-series mark type used by `combo` charts (bar + line overlay). */
|
|
128
|
+
const seriesMarkTypeSchema = z
|
|
129
|
+
.union([z.literal("bar"), z.literal("line"), z.literal("area")])
|
|
130
|
+
.describe("Mark type for this series. Required for `combo` (mix bar and line/area); ignored for other chart types.");
|
|
126
131
|
/**
|
|
127
132
|
* Compact, model-friendly representation of an Echarts spec. The
|
|
128
133
|
* planner agent emits this; {@link planToEchartsOption} expands it
|
|
@@ -146,41 +151,79 @@ export const chartPlanSchema = z.object({
|
|
|
146
151
|
.string()
|
|
147
152
|
.optional()
|
|
148
153
|
.describe(string.toDescription(`
|
|
149
|
-
Axis label
|
|
150
|
-
|
|
154
|
+
Axis label for the primary (usually bottom / value) axis.
|
|
155
|
+
Used for bar / horizontalBar / line / area / combo / waterfall
|
|
156
|
+
/ scatter / heatmap; ignored for pie / funnel / treemap / radar.
|
|
151
157
|
`)),
|
|
152
158
|
yAxisLabel: z
|
|
153
159
|
.string()
|
|
154
160
|
.optional()
|
|
155
161
|
.describe(string.toDescription(`
|
|
156
|
-
Axis label
|
|
157
|
-
|
|
162
|
+
Axis label for the secondary (usually left) axis. Used for
|
|
163
|
+
bar / horizontalBar / line / area / combo / waterfall /
|
|
164
|
+
scatter / heatmap; ignored for pie / funnel / treemap / radar.
|
|
158
165
|
`)),
|
|
159
166
|
categories: z
|
|
160
167
|
.array(z.string())
|
|
161
168
|
.optional()
|
|
162
169
|
.describe(string.toDescription(`
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
170
|
+
Primary category labels. For \`bar\` / \`horizontalBar\` /
|
|
171
|
+
\`line\` / \`area\` / \`combo\` / \`waterfall\`: one label per
|
|
172
|
+
data point. For \`heatmap\`: x-axis categories. For \`radar\`:
|
|
173
|
+
indicator names. Omit for \`scatter\` (\`[x, y]\` tuples) and
|
|
174
|
+
slice charts (\`pie\` / \`funnel\` / \`treemap\`, each slice
|
|
175
|
+
carries its own \`name\`).
|
|
176
|
+
`)),
|
|
177
|
+
yCategories: z
|
|
178
|
+
.array(z.string())
|
|
179
|
+
.optional()
|
|
180
|
+
.describe(string.toDescription(`
|
|
181
|
+
Y-axis (row) labels for \`heatmap\`. Optional - when omitted the
|
|
182
|
+
row labels come from the series names, which is the preferred
|
|
183
|
+
way to build a heatmap. Omit for every other chart type.
|
|
166
184
|
`)),
|
|
167
185
|
series: z
|
|
168
186
|
.array(z.object({
|
|
169
187
|
name: z.string().describe(string.toDescription(`
|
|
170
188
|
Legend name for this series.
|
|
171
189
|
`)),
|
|
190
|
+
type: seriesMarkTypeSchema.optional(),
|
|
191
|
+
yAxisIndex: z
|
|
192
|
+
.union([z.literal(0), z.literal(1)])
|
|
193
|
+
.optional()
|
|
194
|
+
.describe("Which y-axis to bind (0 = left, 1 = right). Use on `combo` when series have different units or scales."),
|
|
172
195
|
data: z.array(chartDataPointSchema).describe(string.toDescription(`
|
|
173
|
-
Data points. For \`bar\` / \`
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
\`
|
|
196
|
+
Data points. For category charts (\`bar\` / \`horizontalBar\`
|
|
197
|
+
/ \`line\` / \`area\` / \`combo\` / \`waterfall\` / \`radar\`),
|
|
198
|
+
an array of numbers aligned to \`categories\`; for
|
|
199
|
+
\`waterfall\` those numbers are signed deltas (one series
|
|
200
|
+
only - never a cumulative base series). For \`heatmap\`,
|
|
201
|
+
one series per matrix row, holding that row's numbers
|
|
202
|
+
aligned to \`categories\`. For \`scatter\`, an array of
|
|
203
|
+
\`[x, y]\` numeric tuples. For \`pie\` / \`funnel\` /
|
|
204
|
+
\`treemap\`, an array of \`{name, value}\` objects.
|
|
177
205
|
`)),
|
|
178
206
|
}))
|
|
179
|
-
.
|
|
207
|
+
.default([])
|
|
180
208
|
.describe(string.toDescription(`
|
|
181
|
-
One or more series to plot.
|
|
182
|
-
|
|
183
|
-
\`
|
|
209
|
+
One or more series to plot. Required for every chart type
|
|
210
|
+
except \`custom\`, which carries its series inside \`option\`.
|
|
211
|
+
Slice charts (\`pie\` / \`funnel\` / \`treemap\`) and
|
|
212
|
+
\`waterfall\` / \`heatmap\` use exactly one series; \`bar\` /
|
|
213
|
+
\`line\` / \`area\` / \`combo\` / \`radar\` / \`scatter\` can
|
|
214
|
+
carry multiple series.
|
|
215
|
+
`)),
|
|
216
|
+
option: z
|
|
217
|
+
.string()
|
|
218
|
+
.optional()
|
|
219
|
+
.describe(string.toDescription(`
|
|
220
|
+
Required for \`custom\`, ignored for every other chart type. A
|
|
221
|
+
COMPLETE Echarts option, as a JSON object encoded in a string:
|
|
222
|
+
\`series\` (each with its own \`type\` and that series' own data
|
|
223
|
+
shape) plus whatever else the chart needs - a coordinate system,
|
|
224
|
+
\`visualMap\`, axes. Plain JSON values only, never a JavaScript
|
|
225
|
+
function. A centered title is filled in when the object omits
|
|
226
|
+
one.
|
|
184
227
|
`)),
|
|
185
228
|
});
|
|
186
229
|
/**
|
|
@@ -217,6 +260,18 @@ export const chartPlannerRequestSchema = z.object({
|
|
|
217
260
|
aggregate larger datasets first.
|
|
218
261
|
`)),
|
|
219
262
|
});
|
|
263
|
+
/**
|
|
264
|
+
* Agent-facing result of either chart-producing tool.
|
|
265
|
+
*
|
|
266
|
+
* `marker` is deliberately redundant with `chartId`: the host still keys the
|
|
267
|
+
* cache by id, while the model gets the exact opaque token to copy into prose
|
|
268
|
+
* and has no reason to invent or retype a UUID.
|
|
269
|
+
*/
|
|
270
|
+
export const chartToolOutputSchema = wire.ChartSchema.pick({ chartId: true }).extend({
|
|
271
|
+
marker: z
|
|
272
|
+
.string()
|
|
273
|
+
.describe("Exact embed marker. Copy this complete value verbatim onto its own line; never construct a marker from chartId."),
|
|
274
|
+
});
|
|
220
275
|
/* --------------------------- planner instructions --------------------------- */
|
|
221
276
|
/**
|
|
222
277
|
* Format {@link wire.ChartTypeSchema}'s variants as a single
|
|
@@ -245,18 +300,58 @@ const CHART_PLANNER_INSTRUCTIONS = string.toDescription(`
|
|
|
245
300
|
|
|
246
301
|
When in doubt between bar and line, prefer bar for unordered
|
|
247
302
|
categories and line for ordered ones (dates, time buckets, ranks).
|
|
248
|
-
|
|
303
|
+
Prefer \`horizontalBar\` when category labels are long. Prefer
|
|
304
|
+
\`combo\` when one measure is a count/volume and another is a
|
|
305
|
+
rate/trend. Prefer \`waterfall\` for bridges of signed deltas.
|
|
306
|
+
Prefer \`scatter\` when correlating two numeric fields (no
|
|
307
|
+
category axis). Prefer \`heatmap\` for a category x category
|
|
308
|
+
matrix. Prefer \`radar\` for scoring the same entities across a
|
|
309
|
+
fixed set of dimensions. Never pick pie for more than 7 slices
|
|
310
|
+
(use \`treemap\` instead). Prefer \`funnel\` for ordered conversion
|
|
311
|
+
stages.
|
|
312
|
+
|
|
313
|
+
For bar / horizontalBar / line / area / combo / waterfall: pick one
|
|
314
|
+
column as the category axis (usually the only string-valued column)
|
|
315
|
+
and one or more numeric columns as series. Sort categories by the
|
|
316
|
+
primary series value descending unless the data is naturally ordered
|
|
317
|
+
(dates, ranks, funnel stages, waterfall steps). For \`combo\`, set
|
|
318
|
+
each series' \`type\` to \`bar\`, \`line\`, or \`area\`, and use
|
|
319
|
+
\`yAxisIndex: 1\` when a series needs a second scale.
|
|
320
|
+
|
|
321
|
+
For waterfall, emit exactly ONE series holding the signed step values
|
|
322
|
+
(deltas), one per category, in order - positive for a rise, negative
|
|
323
|
+
for a drop. Do NOT add a cumulative / running-total / base series and
|
|
324
|
+
do NOT convert the deltas into running totals yourself; the running
|
|
325
|
+
total is computed for you, and a hand-built base series renders as a
|
|
326
|
+
plain bar chart instead of a bridge.
|
|
327
|
+
|
|
328
|
+
For pie / funnel / treemap: pick the category column for slice names
|
|
329
|
+
and one numeric column for slice values. Emit a single series of
|
|
330
|
+
\`{name, value}\` objects.
|
|
249
331
|
|
|
250
|
-
For
|
|
251
|
-
|
|
252
|
-
series. Sort categories by the primary series value descending unless
|
|
253
|
-
the data is naturally ordered (dates, ranks).
|
|
332
|
+
For scatter: pick two numeric columns and emit \`[x, y]\` tuples in
|
|
333
|
+
one or more series (one series per group if a grouping column exists).
|
|
254
334
|
|
|
255
|
-
For
|
|
256
|
-
|
|
335
|
+
For heatmap: pick two category columns and one numeric measure. Put
|
|
336
|
+
the x-axis categories in \`categories\`, then emit ONE SERIES PER ROW
|
|
337
|
+
of the matrix - the series \`name\` is the row label and \`data\` is
|
|
338
|
+
the row's numbers, one per entry in \`categories\`, in the same order.
|
|
339
|
+
Do not compute cell indices.
|
|
257
340
|
|
|
258
|
-
For
|
|
259
|
-
|
|
341
|
+
For radar: \`categories\` are the indicator names; each series is an
|
|
342
|
+
array of numbers (one value per indicator).
|
|
343
|
+
|
|
344
|
+
For anything the types above cannot express - a sankey, boxplot,
|
|
345
|
+
candlestick, sunburst, gauge, network graph, calendar, parallel-
|
|
346
|
+
coordinates plot, or any other Echarts series - use \`custom\` and
|
|
347
|
+
hand-write the whole Echarts option into \`option\` as a JSON string.
|
|
348
|
+
Include every part that chart needs: the series with their own
|
|
349
|
+
\`type\` and data shape, plus any coordinate system, \`visualMap\`,
|
|
350
|
+
or axes. Leave \`series\`, \`categories\`, and the axis labels out;
|
|
351
|
+
they are ignored for \`custom\`. Prefer a listed type whenever one
|
|
352
|
+
genuinely fits - \`custom\` gives up the shared tooltip, legend, and
|
|
353
|
+
grid defaults, so it is the answer for an unsupported chart shape,
|
|
354
|
+
not a way to restyle a supported one.
|
|
260
355
|
|
|
261
356
|
Keep series names human-readable (use the column name; title case it
|
|
262
357
|
lightly if needed). Keep titles concise; do not repeat the user's
|
|
@@ -380,7 +475,7 @@ export async function prepareChart(opts) {
|
|
|
380
475
|
// Fire-and-forget. Failures land in the cache as `error` entries;
|
|
381
476
|
// never escape into an unhandled rejection.
|
|
382
477
|
void runPrepareChart(chartId, opts);
|
|
383
|
-
return { chartId };
|
|
478
|
+
return { chartId, marker: marker.formatMarker("chart", chartId) };
|
|
384
479
|
}
|
|
385
480
|
async function runPrepareChart(chartId, opts) {
|
|
386
481
|
const startedAt = Date.now();
|
|
@@ -484,16 +579,146 @@ function brandColorCycle(primary, accent) {
|
|
|
484
579
|
}
|
|
485
580
|
/**
|
|
486
581
|
* Derive an Echarts {@link ChartTheme} from a brand context: the primary +
|
|
487
|
-
* accent colors seed the series cycle
|
|
488
|
-
*
|
|
582
|
+
* accent colors seed the series cycle and the sans stack becomes the base
|
|
583
|
+
* font. Text colors are the renderer's job - see {@link ChartTheme}.
|
|
489
584
|
*/
|
|
490
585
|
function brandChartTheme(brand) {
|
|
491
586
|
return {
|
|
492
587
|
color: brandColorCycle(brand.colors.primary, brand.colors.accent),
|
|
493
|
-
textStyle: { fontFamily: brand.typography.sans
|
|
588
|
+
textStyle: { fontFamily: brand.typography.sans },
|
|
494
589
|
};
|
|
495
590
|
}
|
|
496
|
-
|
|
591
|
+
/** Keep only `{name, value}` slices; drop nulls / bare numbers / tuples. */
|
|
592
|
+
function namedSlices(data) {
|
|
593
|
+
return data.filter((d) => d !== null && typeof d === "object" && !Array.isArray(d));
|
|
594
|
+
}
|
|
595
|
+
/** Keep only finite numbers (category / radar / waterfall series). */
|
|
596
|
+
function numericPoints(data) {
|
|
597
|
+
return data.filter((d) => typeof d === "number" && Number.isFinite(d));
|
|
598
|
+
}
|
|
599
|
+
/** Keep only `[x, y]` scatter tuples. */
|
|
600
|
+
function scatterPoints(data) {
|
|
601
|
+
return data.filter((d) => Array.isArray(d) && d.length === 2);
|
|
602
|
+
}
|
|
603
|
+
/** Keep only `[xIndex, yIndex, value]` heatmap cells. */
|
|
604
|
+
function heatmapCells(data) {
|
|
605
|
+
return data.filter((d) => Array.isArray(d) && d.length === 3);
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Resolve a heatmap's cells and row labels from either shape the
|
|
609
|
+
* planner may produce.
|
|
610
|
+
*
|
|
611
|
+
* The documented shape is ONE series of `[xIndex, yIndex, value]`
|
|
612
|
+
* triples, but index arithmetic is exactly the kind of bookkeeping a
|
|
613
|
+
* fast model gets wrong, and the failure is silent (every cell is
|
|
614
|
+
* dropped and the grid renders empty). So the row-per-series shape it
|
|
615
|
+
* already produces reliably for bar charts - one series per matrix
|
|
616
|
+
* row, numbers aligned to `categories` - is accepted too and turned
|
|
617
|
+
* into triples here.
|
|
618
|
+
*
|
|
619
|
+
* Row order reads top-to-bottom: Echarts' category y-axis counts index
|
|
620
|
+
* 0 from the BOTTOM, so a row-derived matrix reverses both the axis
|
|
621
|
+
* labels and the row indices, putting the first series at the top the
|
|
622
|
+
* way the model listed it.
|
|
623
|
+
*/
|
|
624
|
+
function heatmapMatrix(plan) {
|
|
625
|
+
const triples = heatmapCells(plan.series[0]?.data ?? []);
|
|
626
|
+
if (triples.length > 0) {
|
|
627
|
+
return { cells: triples, yCategories: plan.yCategories ?? [] };
|
|
628
|
+
}
|
|
629
|
+
const rows = plan.series.map((s) => ({ name: s.name, values: numericPoints(s.data) }));
|
|
630
|
+
const labels = plan.yCategories ?? rows.map((r) => r.name);
|
|
631
|
+
const lastRow = rows.length - 1;
|
|
632
|
+
return {
|
|
633
|
+
cells: rows.flatMap((row, rowIndex) => row.values.map((value, columnIndex) => [columnIndex, lastRow - rowIndex, value])),
|
|
634
|
+
yCategories: [...labels].reverse(),
|
|
635
|
+
};
|
|
636
|
+
}
|
|
637
|
+
/** Sequential light-to-brand ramp for heatmap intensity. */
|
|
638
|
+
const HEATMAP_RAMP = ["#EAF1FE", "#9CBDF7", "#4C86EE", "#2463EB", "#14387F"];
|
|
639
|
+
/** Above this many cells, printed values overlap and are suppressed. */
|
|
640
|
+
const HEATMAP_LABEL_MAX_CELLS = 60;
|
|
641
|
+
/** Rising step fill (emerald) and falling step fill (rose). */
|
|
642
|
+
const WATERFALL_INCREASE_COLOR = "#2EB88A";
|
|
643
|
+
const WATERFALL_DECREASE_COLOR = "#DD2C4D";
|
|
644
|
+
/** Series names the waterfall expansion emits. */
|
|
645
|
+
const WATERFALL_HELPER_NAME = "Running total";
|
|
646
|
+
const WATERFALL_INCREASE_NAME = "Increase";
|
|
647
|
+
const WATERFALL_DECREASE_NAME = "Decrease";
|
|
648
|
+
/**
|
|
649
|
+
* A model asked for a bridge often builds the running total itself and
|
|
650
|
+
* hands back a cumulative-base series alongside the deltas - which
|
|
651
|
+
* renders as two plain bar series, not a waterfall (the base bars are
|
|
652
|
+
* the tall ones). The base is recognizable by name, so it is dropped
|
|
653
|
+
* here and the running total recomputed from the deltas.
|
|
654
|
+
*/
|
|
655
|
+
const WATERFALL_BASE_NAME = /\b(base|cumulative|running|helper|total|start(ing)?)\b/i;
|
|
656
|
+
/**
|
|
657
|
+
* Pick the signed-delta series out of a waterfall plan, ignoring any
|
|
658
|
+
* cumulative-base series the planner built by hand
|
|
659
|
+
* ({@link WATERFALL_BASE_NAME}). Falls back to the first series when
|
|
660
|
+
* every name looks like a base, since dropping them all would leave
|
|
661
|
+
* nothing to plot.
|
|
662
|
+
*/
|
|
663
|
+
function waterfallDeltaSeries(series) {
|
|
664
|
+
return series.find((s) => !WATERFALL_BASE_NAME.test(s.name)) ?? series[0];
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Build the stacked transparent-base + increase + decrease series that
|
|
668
|
+
* Echarts uses for a waterfall (it has no native waterfall type).
|
|
669
|
+
* Values are signed deltas; the transparent helper carries the running
|
|
670
|
+
* total so each visible bar starts where the previous one ended.
|
|
671
|
+
*
|
|
672
|
+
* The helper is `silent`, so with an item-triggered tooltip it is
|
|
673
|
+
* invisible to both the eye and the pointer - the alternative, an axis
|
|
674
|
+
* tooltip that hides the helper row, needs a function formatter, and
|
|
675
|
+
* this spec has to survive JSON serialization to the browser.
|
|
676
|
+
*/
|
|
677
|
+
function waterfallSeries(values) {
|
|
678
|
+
const helpers = [];
|
|
679
|
+
const increases = [];
|
|
680
|
+
const decreases = [];
|
|
681
|
+
let cumulative = 0;
|
|
682
|
+
for (const value of values) {
|
|
683
|
+
if (value >= 0) {
|
|
684
|
+
helpers.push(cumulative);
|
|
685
|
+
increases.push(value);
|
|
686
|
+
decreases.push("-");
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
helpers.push(cumulative + value);
|
|
690
|
+
increases.push("-");
|
|
691
|
+
decreases.push(-value);
|
|
692
|
+
}
|
|
693
|
+
cumulative += value;
|
|
694
|
+
}
|
|
695
|
+
const transparent = { borderColor: "transparent", color: "transparent" };
|
|
696
|
+
return [
|
|
697
|
+
{
|
|
698
|
+
name: WATERFALL_HELPER_NAME,
|
|
699
|
+
type: "bar",
|
|
700
|
+
stack: "total",
|
|
701
|
+
silent: true,
|
|
702
|
+
itemStyle: transparent,
|
|
703
|
+
emphasis: { itemStyle: transparent },
|
|
704
|
+
data: helpers,
|
|
705
|
+
},
|
|
706
|
+
{
|
|
707
|
+
name: WATERFALL_INCREASE_NAME,
|
|
708
|
+
type: "bar",
|
|
709
|
+
stack: "total",
|
|
710
|
+
itemStyle: { color: WATERFALL_INCREASE_COLOR },
|
|
711
|
+
data: increases,
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
name: WATERFALL_DECREASE_NAME,
|
|
715
|
+
type: "bar",
|
|
716
|
+
stack: "total",
|
|
717
|
+
itemStyle: { color: WATERFALL_DECREASE_COLOR },
|
|
718
|
+
data: decreases,
|
|
719
|
+
},
|
|
720
|
+
];
|
|
721
|
+
}
|
|
497
722
|
/**
|
|
498
723
|
* Expand a {@link ChartPlan} into a full Echarts `EChartsOption`
|
|
499
724
|
* JSON. Centralized here so the planner agent only fills in the
|
|
@@ -505,26 +730,44 @@ function brandChartTheme(brand) {
|
|
|
505
730
|
* color cycle and base text style (see {@link brandChartTheme}); otherwise
|
|
506
731
|
* Echarts' defaults apply.
|
|
507
732
|
*/
|
|
508
|
-
function planToEchartsOption(plan, fallbackTitle, brand) {
|
|
733
|
+
export function planToEchartsOption(plan, fallbackTitle, brand) {
|
|
509
734
|
const baseTitle = plan.title ?? fallbackTitle;
|
|
510
735
|
const grid = { left: 48, right: 24, top: 56, bottom: 48, containLabel: true };
|
|
511
736
|
const theme = brand ? brandChartTheme(brand) : undefined;
|
|
512
737
|
const themed = (option) => theme ? { ...theme, ...option } : option;
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
//
|
|
517
|
-
//
|
|
518
|
-
|
|
738
|
+
const title = { text: baseTitle, left: "center" };
|
|
739
|
+
const legend = { bottom: 0 };
|
|
740
|
+
if (plan.chartType === "custom") {
|
|
741
|
+
// The option arrives as a JSON STRING, not a nested object: this plan is
|
|
742
|
+
// the planner's provider-enforced structured output, and a free-form
|
|
743
|
+
// object becomes an unconstrained `additionalProperties` schema that
|
|
744
|
+
// strict OpenAI and Gemini endpoints reject - which would break EVERY
|
|
745
|
+
// chart, not just this one (same class of hazard as the `prefixItems`
|
|
746
|
+
// note on `chartDataPointSchema`). A malformed string costs one chart.
|
|
747
|
+
// Nothing here is eval'd; a string-valued Echarts formatter is a
|
|
748
|
+
// template, not code.
|
|
749
|
+
const option = json.parseRecord(plan.option);
|
|
750
|
+
if (!option) {
|
|
751
|
+
throw new Error('chartType "custom" needs an `option` holding a JSON object');
|
|
752
|
+
}
|
|
753
|
+
// Title is the one default worth filling: every other branch guarantees
|
|
754
|
+
// one and the renderer reserves grid space for it. A title the model set
|
|
755
|
+
// wins, as does every other field it declared.
|
|
756
|
+
return themed({ title, ...option });
|
|
757
|
+
}
|
|
758
|
+
if (plan.chartType === "pie" || plan.chartType === "funnel" || plan.chartType === "treemap") {
|
|
759
|
+
const slices = namedSlices(plan.series[0]?.data ?? []);
|
|
760
|
+
const seriesType = plan.chartType;
|
|
519
761
|
return themed({
|
|
520
|
-
title
|
|
762
|
+
title,
|
|
521
763
|
tooltip: { trigger: "item" },
|
|
522
|
-
legend:
|
|
764
|
+
legend: seriesType === "treemap" ? undefined : legend,
|
|
523
765
|
series: [
|
|
524
766
|
{
|
|
525
767
|
name: plan.series[0]?.name ?? baseTitle,
|
|
526
|
-
type:
|
|
527
|
-
radius: ["35%", "65%"],
|
|
768
|
+
type: seriesType,
|
|
769
|
+
...(seriesType === "pie" ? { radius: ["35%", "65%"] } : {}),
|
|
770
|
+
...(seriesType === "funnel" ? { sort: "descending" } : {}),
|
|
528
771
|
data: slices,
|
|
529
772
|
},
|
|
530
773
|
],
|
|
@@ -535,26 +778,166 @@ function planToEchartsOption(plan, fallbackTitle, brand) {
|
|
|
535
778
|
// `[x, y]` tuples. Bare numbers / objects / nulls from a
|
|
536
779
|
// mismatched plan get dropped silently.
|
|
537
780
|
return themed({
|
|
538
|
-
title
|
|
781
|
+
title,
|
|
539
782
|
tooltip: { trigger: "item" },
|
|
540
|
-
legend
|
|
783
|
+
legend,
|
|
541
784
|
grid,
|
|
542
785
|
xAxis: { type: "value", name: plan.xAxisLabel },
|
|
543
786
|
yAxis: { type: "value", name: plan.yAxisLabel },
|
|
544
787
|
series: plan.series.map((s) => ({
|
|
545
788
|
name: s.name,
|
|
546
789
|
type: "scatter",
|
|
547
|
-
data: s.data
|
|
790
|
+
data: scatterPoints(s.data),
|
|
791
|
+
})),
|
|
792
|
+
});
|
|
793
|
+
}
|
|
794
|
+
if (plan.chartType === "heatmap") {
|
|
795
|
+
const { cells, yCategories } = heatmapMatrix(plan);
|
|
796
|
+
const values = cells.map((c) => c[2]);
|
|
797
|
+
const min = values.length > 0 ? Math.min(...values) : 0;
|
|
798
|
+
const max = values.length > 0 ? Math.max(...values) : 1;
|
|
799
|
+
return themed({
|
|
800
|
+
title,
|
|
801
|
+
tooltip: { position: "top" },
|
|
802
|
+
// The visualMap ramp sits below the plot, so the grid gives up
|
|
803
|
+
// more bottom room than an axis-only chart needs.
|
|
804
|
+
grid: { ...grid, bottom: 72 },
|
|
805
|
+
xAxis: {
|
|
806
|
+
type: "category",
|
|
807
|
+
data: plan.categories ?? [],
|
|
808
|
+
name: plan.xAxisLabel,
|
|
809
|
+
splitArea: { show: true },
|
|
810
|
+
},
|
|
811
|
+
yAxis: {
|
|
812
|
+
type: "category",
|
|
813
|
+
data: yCategories,
|
|
814
|
+
name: plan.yAxisLabel,
|
|
815
|
+
splitArea: { show: true },
|
|
816
|
+
},
|
|
817
|
+
visualMap: {
|
|
818
|
+
// Echarts hides every cell when min === max (a uniform matrix),
|
|
819
|
+
// so a degenerate range is widened by one.
|
|
820
|
+
min,
|
|
821
|
+
max: max > min ? max : min + 1,
|
|
822
|
+
calculable: true,
|
|
823
|
+
orient: "horizontal",
|
|
824
|
+
left: "center",
|
|
825
|
+
bottom: 8,
|
|
826
|
+
inRange: { color: HEATMAP_RAMP },
|
|
827
|
+
},
|
|
828
|
+
series: [
|
|
829
|
+
{
|
|
830
|
+
name: plan.series[0]?.name ?? baseTitle,
|
|
831
|
+
type: "heatmap",
|
|
832
|
+
data: cells,
|
|
833
|
+
// Printed cell values are unreadable once the grid is dense.
|
|
834
|
+
label: { show: cells.length <= HEATMAP_LABEL_MAX_CELLS },
|
|
835
|
+
emphasis: { itemStyle: { shadowBlur: 10, shadowColor: "rgba(0, 0, 0, 0.3)" } },
|
|
836
|
+
},
|
|
837
|
+
],
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
if (plan.chartType === "radar") {
|
|
841
|
+
const indicators = (plan.categories ?? []).map((name, index) => {
|
|
842
|
+
const peak = Math.max(0, ...plan.series.map((s) => {
|
|
843
|
+
const nums = numericPoints(s.data);
|
|
844
|
+
return nums[index] ?? 0;
|
|
845
|
+
}));
|
|
846
|
+
return { name, max: peak > 0 ? peak : 1 };
|
|
847
|
+
});
|
|
848
|
+
return themed({
|
|
849
|
+
title,
|
|
850
|
+
tooltip: { trigger: "item" },
|
|
851
|
+
legend,
|
|
852
|
+
radar: { indicator: indicators },
|
|
853
|
+
series: [
|
|
854
|
+
{
|
|
855
|
+
type: "radar",
|
|
856
|
+
data: plan.series.map((s) => ({
|
|
857
|
+
name: s.name,
|
|
858
|
+
value: numericPoints(s.data),
|
|
859
|
+
})),
|
|
860
|
+
},
|
|
861
|
+
],
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
if (plan.chartType === "waterfall") {
|
|
865
|
+
const values = numericPoints(waterfallDeltaSeries(plan.series)?.data ?? []);
|
|
866
|
+
return themed({
|
|
867
|
+
title,
|
|
868
|
+
// Item-triggered so the transparent `silent` offset bars never
|
|
869
|
+
// surface in a tooltip (see `waterfallSeries`).
|
|
870
|
+
tooltip: { trigger: "item" },
|
|
871
|
+
// Only the two visible steps belong in the legend.
|
|
872
|
+
legend: { ...legend, data: [WATERFALL_INCREASE_NAME, WATERFALL_DECREASE_NAME] },
|
|
873
|
+
grid,
|
|
874
|
+
xAxis: {
|
|
875
|
+
type: "category",
|
|
876
|
+
data: plan.categories ?? [],
|
|
877
|
+
name: plan.xAxisLabel,
|
|
878
|
+
},
|
|
879
|
+
yAxis: { type: "value", name: plan.yAxisLabel },
|
|
880
|
+
series: waterfallSeries(values),
|
|
881
|
+
});
|
|
882
|
+
}
|
|
883
|
+
if (plan.chartType === "horizontalBar") {
|
|
884
|
+
return themed({
|
|
885
|
+
title,
|
|
886
|
+
tooltip: { trigger: "axis", axisPointer: { type: "shadow" } },
|
|
887
|
+
legend,
|
|
888
|
+
grid,
|
|
889
|
+
xAxis: { type: "value", name: plan.xAxisLabel },
|
|
890
|
+
yAxis: {
|
|
891
|
+
type: "category",
|
|
892
|
+
data: plan.categories ?? [],
|
|
893
|
+
name: plan.yAxisLabel,
|
|
894
|
+
},
|
|
895
|
+
series: plan.series.map((s) => ({
|
|
896
|
+
name: s.name,
|
|
897
|
+
type: "bar",
|
|
898
|
+
data: s.data,
|
|
548
899
|
})),
|
|
549
900
|
});
|
|
550
901
|
}
|
|
902
|
+
if (plan.chartType === "combo") {
|
|
903
|
+
const usesRightAxis = plan.series.some((s) => s.yAxisIndex === 1);
|
|
904
|
+
return themed({
|
|
905
|
+
title,
|
|
906
|
+
tooltip: { trigger: "axis" },
|
|
907
|
+
legend,
|
|
908
|
+
grid,
|
|
909
|
+
xAxis: {
|
|
910
|
+
type: "category",
|
|
911
|
+
data: plan.categories ?? [],
|
|
912
|
+
name: plan.xAxisLabel,
|
|
913
|
+
},
|
|
914
|
+
yAxis: usesRightAxis
|
|
915
|
+
? [
|
|
916
|
+
{ type: "value", name: plan.yAxisLabel },
|
|
917
|
+
{ type: "value", name: undefined },
|
|
918
|
+
]
|
|
919
|
+
: { type: "value", name: plan.yAxisLabel },
|
|
920
|
+
series: plan.series.map((s) => {
|
|
921
|
+
const mark = s.type ?? "bar";
|
|
922
|
+
const seriesType = mark === "area" ? "line" : mark;
|
|
923
|
+
return {
|
|
924
|
+
name: s.name,
|
|
925
|
+
type: seriesType,
|
|
926
|
+
data: s.data,
|
|
927
|
+
yAxisIndex: s.yAxisIndex ?? 0,
|
|
928
|
+
smooth: seriesType === "line",
|
|
929
|
+
...(mark === "area" ? { areaStyle: {} } : {}),
|
|
930
|
+
};
|
|
931
|
+
}),
|
|
932
|
+
});
|
|
933
|
+
}
|
|
551
934
|
// bar / line / area share the same axis layout.
|
|
552
935
|
const isArea = plan.chartType === "area";
|
|
553
936
|
const seriesType = plan.chartType === "bar" ? "bar" : "line";
|
|
554
937
|
return themed({
|
|
555
|
-
title
|
|
938
|
+
title,
|
|
556
939
|
tooltip: { trigger: "axis" },
|
|
557
|
-
legend
|
|
940
|
+
legend,
|
|
558
941
|
grid,
|
|
559
942
|
xAxis: {
|
|
560
943
|
type: "category",
|
|
@@ -581,9 +964,8 @@ function planToEchartsOption(plan, fallbackTitle, brand) {
|
|
|
581
964
|
* Thin wrapper over {@link prepareChart} for callers that already
|
|
582
965
|
* have a dataset in hand. Mints a `chartId` synchronously, caches
|
|
583
966
|
* an empty placeholder, and kicks off the chart-planner in the
|
|
584
|
-
* background. Returns
|
|
585
|
-
*
|
|
586
|
-
* `/embed/chart/:id` route.
|
|
967
|
+
* background. Returns the `chartId` plus its ready-to-copy `marker`; the host
|
|
968
|
+
* UI resolves that marker through the plugin's `/embed/chart/:id` route.
|
|
587
969
|
*
|
|
588
970
|
* For Genie statement results, prefer the Genie agent's
|
|
589
971
|
* `prepare_chart` tool, which accepts a `statement_id` and
|
|
@@ -597,14 +979,15 @@ export function buildRenderDataTool(config) {
|
|
|
597
979
|
Submit a tabular dataset for inline rendering as a chart in
|
|
598
980
|
the user's view. Pass a title, the raw rows (array of objects
|
|
599
981
|
keyed by column name), and an optional one-line description
|
|
600
|
-
of the insight to highlight. Returns
|
|
601
|
-
|
|
602
|
-
|
|
982
|
+
of the insight to highlight. Returns \`chartId\` plus the
|
|
983
|
+
complete \`marker\`; copy the returned marker VERBATIM onto
|
|
984
|
+
its own line where the chart should render. Never construct,
|
|
985
|
+
alter, or invent a chart marker yourself.
|
|
603
986
|
`,
|
|
604
987
|
`
|
|
605
|
-
Placement contract: embed \`
|
|
606
|
-
line (blank lines above and below) wherever you want the
|
|
607
|
-
|
|
988
|
+
Placement contract: embed the returned \`marker\` on its own
|
|
989
|
+
line (blank lines above and below) wherever you want the chart
|
|
990
|
+
to appear in your reply. The chart resolves
|
|
608
991
|
asynchronously - the tool returns the id immediately and the
|
|
609
992
|
host UI fetches the chart from the cache once the planner
|
|
610
993
|
lands. You can call \`render_data\` multiple times in the
|
|
@@ -620,7 +1003,7 @@ export function buildRenderDataTool(config) {
|
|
|
620
1003
|
`,
|
|
621
1004
|
]),
|
|
622
1005
|
inputSchema: chartPlannerRequestSchema,
|
|
623
|
-
outputSchema:
|
|
1006
|
+
outputSchema: chartToolOutputSchema,
|
|
624
1007
|
execute: async (input, ctxRaw) => {
|
|
625
1008
|
const { title, description, data } = input;
|
|
626
1009
|
const ctx = ctxRaw;
|
|
@@ -635,4 +1018,4 @@ export function buildRenderDataTool(config) {
|
|
|
635
1018
|
},
|
|
636
1019
|
});
|
|
637
1020
|
}
|
|
638
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFxQixNQUFNLHdCQUF3QixDQUFDO0FBQzVGLE9BQU8sRUFBRSxJQUFJLEVBQWdDLE1BQU0sMEJBQTBCLENBQUM7QUFDOUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7QUFFMUMsNkVBQTZFO0FBRTdFOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVwQyxzREFBc0Q7QUFDdEQsTUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQUM7QUFFN0MsbUVBQW1FO0FBQ25FLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDO0FBRXhDLHVEQUF1RDtBQUN2RCxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUV0QyxvRUFBb0U7QUFDcEUsTUFBTSxvQkFBb0IsR0FBRyx5QkFBeUIsQ0FBQztBQUV2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TSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBNEIsQ0FBQztZQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUF5RCxDQUFDO1lBQ3RFLE9BQU8sWUFBWSxDQUFDO2dCQUNsQixNQUFNO2dCQUNOLE9BQU8sRUFBRSxjQUFjLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQztnQkFDNUMsS0FBSztnQkFDTCxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNsRCxHQUFHLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDdkUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYXJ0IHBsYW5uZXIgKyBjaGFydCBjYWNoZS5cbiAqXG4gKiBTZWxmLWNvbnRhaW5lZCBjaGFydCBzdWJzeXN0ZW0gd2l0aCB0d28gbGF5ZXJzOlxuICpcbiAqICAgMS4gSW5uZXIgcGxhbm5lciBhZ2VudCAocHJpdmF0ZSkuIFB1cmUgZGF0YXNldC1pbiAvXG4gKiAgICAgIGBFQ2hhcnRzT3B0aW9uYC1vdXQgYnJhaW4uIERyaXZlbiBieSB7QGxpbmsgcHJlcGFyZUNoYXJ0fTtcbiAqICAgICAgY2FsbGVycyBuZXZlciBpbnN0YW50aWF0ZSBpdCBkaXJlY3RseS5cbiAqICAgMi4ge0BsaW5rIHByZXBhcmVDaGFydH06IG9yY2hlc3RyYXRpb24gb24gdG9wIG9mIHRoZSBwbGFubmVyLlxuICogICAgICBNaW50cyBhIGBjaGFydElkYCwgY2FjaGVzIGFuIGVtcHR5IGB7IGNoYXJ0SWQgfWAgcmVjb3JkXG4gKiAgICAgIHN5bmNocm9ub3VzbHksIHRoZW4gcmVzb2x2ZXMgdGhlIGRhdGFzZXQgYW5kIHJ1bnMgdGhlXG4gKiAgICAgIHBsYW5uZXIgaW4gdGhlIGJhY2tncm91bmQuIFRoZSB0ZXJtaW5hbCBlbnRyeSBzZXR0bGVzIHdpdGhcbiAqICAgICAgZWl0aGVyIGByZXN1bHRgIChzdWNjZXNzKSBvciBgZXJyb3JgIChmYWlsdXJlKS4gQm90aFxuICogICAgICB1bmRlZmluZWQgbWVhbnMgdGhlIGVudHJ5IGlzIHN0aWxsIHByb2Nlc3NpbmcuXG4gKlxuICogVGhlIGNhY2hlIHN1cmZhY2UgKHtAbGluayBmZXRjaENoYXJ0fSkgaXMgdGhlIG9ubHkgc3RhdGUgdGhlXG4gKiBIVFRQIHJvdXRlIGFuZCB0aGUgY2hhcnQtcHJvZHVjaW5nIHRvb2xzIHNoYXJlLiBgcHJlcGFyZUNoYXJ0YFxuICogaXMgZGF0YXNldC1hZ25vc3RpYyAtIGNhbGxlcnMgc3VwcGx5IGEgYHJlc29sdmVEYXRhYCBjYWxsYmFja1xuICogdGhhdCBmZXRjaGVzIHRoZSByb3dzIGhvd2V2ZXIgdGhleSBsaWtlIChHZW5pZSBzdGF0ZW1lbnQsIGlubGluZVxuICogZGF0YXNldCwgY3VzdG9tIEFQSSkuIFRoZSBtb2R1bGUgaGFzIG5vIGtub3dsZWRnZSBvZiBHZW5pZSBvclxuICogc3RhdGVtZW50IGlkczsgdGhvc2UgY29uY2VybnMgbGl2ZSBpbiB0aGUgdG9vbHMgdGhhdCB3cmFwIGl0LlxuICpcbiAqIFdpcmUtZm9ybWF0IHNjaGVtYXMgbGl2ZSBpbiBgQGRieC10b29scy9zaGFyZWQtbWFzdHJhYCBzb1xuICogdGhlIGRlbW8gY2xpZW50IGFuZCBhbnkgb3RoZXIgVUkgY29uc3VtZXIgc2hhcmUgdGhlIGV4YWN0IHNhbWVcbiAqIHNoYXBlIHRoaXMgbW9kdWxlIHJlYWRzIGFuZCB3cml0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEFwcEtpdEVycm9yLCBDYWNoZU1hbmFnZXIsIEV4ZWN1dGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXN5bmMsIGVycm9yLCBoYXNoLCBsb2csIHN0cmluZywgdHlwZSBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgd2lyZSwgdHlwZSBDaGFydCwgdHlwZSBDaGFydFJlc3VsdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlc29sdmVVc2VyS2V5LCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvY2hhcnRcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVFRMIGZvciBjYWNoZWQgY2hhcnQgZW50cmllcy4gT25lIGhvdXIgYmFsYW5jZXMgXCJsb25nIGVub3VnaCBmb3JcbiAqIHRoZSBob3N0IFVJIHRvIGZldGNoIHRoZSBjaGFydCB3ZWxsIGFmdGVyIHRoZSBtb2RlbCBmaW5pc2hlZFxuICogdGFsa2luZ1wiIGFnYWluc3QgXCJzaG9ydCBlbm91Z2ggdGhhdCBhYmFuZG9uZWQgY2hhcnQgaWRzIGRvbid0XG4gKiBwaW4gc3RvcmFnZVwiLiBNYXRjaGVzIHRoZSB0eXBpY2FsIERhdGFicmlja3MgT0JPIHRva2VuIGxpZmV0aW1lXG4gKiBzbyBhbnkgZGF0YSByZS1yZXNvbHV0aW9uIHN0YXlzIGluc2lkZSB0aGUgb3JpZ2luYWwgYXV0aCB3aW5kb3cuXG4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX1RUTF9TRUMgPSA2MCAqIDYwO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlOyBrZWVwcyB0aGUgY2hhcnQga2V5c3BhY2UgdGlkeS4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmNoYXJ0XCI7XG5cbi8qKiBEZWZhdWx0IHNlcnZlci1zaWRlIGxvbmctcG9sbCBidWRnZXQgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIERlZmF1bHQgaW50ZXItcG9sbCBzbGVlcCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUyA9IDI1MDtcblxuLyoqIFN0YWJsZSB0ZXh0IHN0b3JlZCBvbiBhIGNoYXJ0IGVudHJ5IHdob3NlIHBsYW5uZXIgcnVuIGZhaWxlZC4gKi9cbmNvbnN0IENIQVJUX0ZBSUxFRF9NRVNTQUdFID0gXCJDaGFydCBnZW5lcmF0aW9uIGZhaWxlZFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjaGVtYXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBzZXJpZXMgZGF0YSBwb2ludC4gV2lkZSB2YXJpYW50IHNldCBzbyB0aGUgcGxhbm5lciBhZ2VudCBjYW5cbiAqIGZhaXRoZnVsbHkgcGFzcyB0aHJvdWdoIHdoYXRldmVyIHRoZSBTUUwgcm93IHNldCBjb250YWluZWRcbiAqIChudW1iZXJzLCBzdHJpbmdpZmllZCBudW1iZXJzLCBudWxscyBmb3IgbWlzc2luZyBtZWFzdXJlbWVudHMsXG4gKiBgW3gsIHldYCB0dXBsZXMgZm9yIHNjYXR0ZXIsIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgZm9yIHBpZSlcbiAqIHdpdGhvdXQgdGhlIHN0cnVjdHVyZWQtb3V0cHV0IGd1YXJkIHJlamVjdGluZyB0aGUgd2hvbGUgcGxhbi5cbiAqXG4gKiBUaHJlZSBsYXllcnMgb2YgdG9sZXJhbmNlOlxuICpcbiAqICAgMS4ge0BsaW5rIHoucHJlcHJvY2Vzc30gbm9ybWFsaXplcyB3aXJlIHNoYXBlcyBCRUZPUkUgdW5pb25cbiAqICAgICAgZGlzcGF0Y2g6IHN0cmluZ2lmaWVkIG51bWJlcnMgcGFyc2UgdG8gbnVtYmVycywgZmluaXRlXG4gKiAgICAgIGNoZWNrcyByZWplY3QgYE5hTmAgLyBgSW5maW5pdHlgLCAyLWVsZW1lbnQgYXJyYXlzIGNvZXJjZVxuICogICAgICB0dXBsZSBjb21wb25lbnRzLCBhbmQgYHt2YWx1ZX1gIG9iamVjdHMgd2l0aCBtaXNzaW5nIC9cbiAqICAgICAgc3RyaW5naWZpZWQgYHZhbHVlYCBnZXQgY29lcmNlZCBvciByZWplY3RlZCB1bmlmb3JtbHkuXG4gKiAgICAgIEFueXRoaW5nIG5vdCBoYW5kbGVhYmxlIGJlY29tZXMgYG51bGxgLlxuICogICAyLiBUaGUgdW5pb24gYWNjZXB0cyBgbnVsbGAgYXMgYSBmaXJzdC1jbGFzcyB2YXJpYW50LiBFY2hhcnRzXG4gKiAgICAgIHJlbmRlcnMgbnVsbCBhcyBhIGdhcCBvbiBiYXIgLyBsaW5lIC8gYXJlYSAod2hpY2ggaXMgdGhlXG4gKiAgICAgIHJpZ2h0IHZpc3VhbCBzaWduYWwgZm9yIFwibWlzc2luZyByZWFkaW5nXCIpLiBTY2F0dGVyIGFuZFxuICogICAgICBwaWUgZmlsdGVyIG51bGxzIGluIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBiZWNhdXNlXG4gKiAgICAgIEVjaGFydHMgY3Jhc2hlcyBvbiBudWxsIHR1cGxlcyAvIHNsaWNlcy5cbiAqICAgMy4ge0BsaW5rIHoudW5pb24jY2F0Y2h9IGJhY2tzdG9wcyB0aGUgd2hvbGUgdGhpbmc6IGlmXG4gKiAgICAgIHByZXByb2Nlc3Mgc29tZWhvdyBwcm9kdWNlcyBhIHNoYXBlIHRoYXQgc3RpbGwgZG9lc24ndFxuICogICAgICBtYXRjaCBhbnkgdmFyaWFudCwgdGhlIGJhZCBpdGVtIGJlY29tZXMgYG51bGxgIGluc3RlYWQgb2ZcbiAqICAgICAgdGFraW5nIGRvd24gdGhlIGVudGlyZSBjaGFydCB3aXRoIGFcbiAqICAgICAgYFN0cnVjdHVyZWQgb3V0cHV0IHZhbGlkYXRpb24gZmFpbGVkYCBlcnJvci5cbiAqL1xuY29uc3QgY2hhcnREYXRhUG9pbnRTY2hlbWEgPSB6XG4gIC5wcmVwcm9jZXNzKFxuICAgICh2KSA9PiB7XG4gICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKSByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHYpID8gdiA6IG51bGw7XG4gICAgICBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgbiA9IE51bWJlcih2KTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgeCA9IHR5cGVvZiB2WzBdID09PSBcIm51bWJlclwiID8gdlswXSA6IE51bWJlcih2WzBdKTtcbiAgICAgICAgY29uc3QgeSA9IHR5cGVvZiB2WzFdID09PSBcIm51bWJlclwiID8gdlsxXSA6IE51bWJlcih2WzFdKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh4KSAmJiBOdW1iZXIuaXNGaW5pdGUoeSkgPyBbeCwgeV0gOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSB0eXBlb2Ygb2JqLnZhbHVlID09PSBcIm51bWJlclwiID8gb2JqLnZhbHVlIDogTnVtYmVyKG9iai52YWx1ZSk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb2VyY2UgbnVtZXJpYyAvIGJvb2xlYW4gLyBudWxsaXNoIG5hbWVzIHRvIHN0cmluZ3Mgc28gYVxuICAgICAgICAvLyBwaWUgc2xpY2Uga2V5ZWQgb24gYSB5ZWFyIChgMjAyNGApIG9yIGNhdGVnb3J5IGlkIGlzXG4gICAgICAgIC8vIGFjY2VwdGVkIHdpdGhvdXQgcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgY2F0Y2ggYXJtLlxuICAgICAgICBjb25zdCByYXdOYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJhd05hbWUpO1xuICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHoudW5pb24oW1xuICAgICAgei5udW1iZXIoKSxcbiAgICAgIHoubnVsbCgpLFxuICAgICAgLy8gYFt4LCB5XWAgc2NhdHRlciBwb2ludC4gTW9kZWxsZWQgYXMgYSBsZW5ndGgtY29uc3RyYWluZWRcbiAgICAgIC8vIGhvbW9nZW5lb3VzIGFycmF5IHJhdGhlciB0aGFuIGB6LnR1cGxlYDogWm9kIGVtaXRzIGEgdHVwbGUgYXNcbiAgICAgIC8vIEpTT04gU2NoZW1hIDIwMjAtMTIgYHByZWZpeEl0ZW1zYCwgYW5kIERhdGFicmlja3MnIEdlbWluaVxuICAgICAgLy8gZW5kcG9pbnRzIHJlamVjdCBhIGByZXNwb25zZV9qc29uX3NjaGVtYWAgY29udGFpbmluZyBpdFxuICAgICAgLy8gKFwibXVzdCBiZSBhIGJvb2xlYW4gb3IgYW4gb2JqZWN0XCIsIHNpbmNlIGBpdGVtc2AgaXMgYWJzZW50KS5cbiAgICAgIC8vIGB6LmFycmF5KHoubnVtYmVyKCkpLmxlbmd0aCgyKWAgZW1pdHMgYGl0ZW1zYCArIGBtaW5JdGVtc2AgL1xuICAgICAgLy8gYG1heEl0ZW1zYCwgd2hpY2ggZXZlcnkgcHJvdmlkZXIgdW5kZXJzdGFuZHMsIGFuZCB2YWxpZGF0ZXNcbiAgICAgIC8vIHRoZSBzYW1lIHR3by1udW1iZXIgc2hhcGUuXG4gICAgICB6LmFycmF5KHoubnVtYmVyKCkpLmxlbmd0aCgyKSxcbiAgICAgIHoub2JqZWN0KHsgbmFtZTogei5zdHJpbmcoKSwgdmFsdWU6IHoubnVtYmVyKCkgfSksXG4gICAgXSksXG4gIClcbiAgLmNhdGNoKG51bGwpO1xuXG4vKipcbiAqIENvbXBhY3QsIG1vZGVsLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIEVjaGFydHMgc3BlYy4gVGhlXG4gKiBwbGFubmVyIGFnZW50IGVtaXRzIHRoaXM7IHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBleHBhbmRzIGl0XG4gKiBpbnRvIGEgcmVhbCBgRUNoYXJ0c09wdGlvbmAgSlNPTi4gVHdvIGxheWVycyBiZWNhdXNlIGxldHRpbmcgdGhlXG4gKiBtb2RlbCBmaWxsIGluIGEgZnVsbHktdHlwZWQgYEVDaGFydHNPcHRpb25gIGlzIGJyaXR0bGUgKGh1bmRyZWRzXG4gKiBvZiBvcHRpb25hbCBmaWVsZHMsIGRlZXAgdW5pb25zLCB2ZXJzaW9uLWRlcGVuZGVudCBzaGFwZXMpLiBBXG4gKiBzbWFsbCBcImNoYXJ0IHBsYW5cIiBzY2hlbWEgaXMgbXVjaCBtb3JlIHJlbGlhYmxlIGZvciBhIGZhc3QgbW9kZWxcbiAqIGFuZCBrZWVwcyBhbmltYXRpb24gLyB0b29sdGlwIC8gc3R5bGluZyBkZWZhdWx0cyBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFuU2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydFR5cGU6IHdpcmUuQ2hhcnRUeXBlU2NoZW1hLFxuICB0aXRsZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIE9wdGlvbmFsOyBkZWZhdWx0cyB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgYmVsb3cgdGhlIGNoYXJ0LiBVc2VkIGZvciBiYXIgLyBsaW5lIC8gYXJlYSAvIHNjYXR0ZXI7XG4gICAgICAgIGlnbm9yZWQgZm9yIHBpZS5cbiAgICAgIGApLFxuICAgICksXG4gIHlBeGlzTGFiZWw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgQXhpcyBsYWJlbCB0byB0aGUgbGVmdCBvZiB0aGUgY2hhcnQuIFVzZWQgZm9yIGJhciAvIGxpbmUgLyBhcmVhIC9cbiAgICAgICAgc2NhdHRlcjsgaWdub3JlZCBmb3IgcGllLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBYLWF4aXMgY2F0ZWdvcnkgbGFiZWxzIGZvciBcXGBiYXJcXGAgLyBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCBjaGFydHNcbiAgICAgICAgKG9uZSBwZXIgZGF0YSBwb2ludCBpbiBlYWNoIHNlcmllcykuIE9taXQgZm9yIFxcYHNjYXR0ZXJcXGAgKHVzZXNcbiAgICAgICAgW3gsIHldIHR1cGxlcykgYW5kIFxcYHBpZVxcYCAoZWFjaCBzbGljZSBjYXJyaWVzIGl0cyBvd24gXFxgbmFtZVxcYCkuXG4gICAgICBgKSxcbiAgICApLFxuICBzZXJpZXM6IHpcbiAgICAuYXJyYXkoXG4gICAgICB6Lm9iamVjdCh7XG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgTGVnZW5kIG5hbWUgZm9yIHRoaXMgc2VyaWVzLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgICAgICBkYXRhOiB6LmFycmF5KGNoYXJ0RGF0YVBvaW50U2NoZW1hKS5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBEYXRhIHBvaW50cy4gRm9yIFxcYGJhclxcYCAvIFxcYGxpbmVcXGAgLyBcXGBhcmVhXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgbnVtYmVycyBhbGlnbmVkIHRvIFxcYGNhdGVnb3JpZXNcXGAuIEZvciBcXGBzY2F0dGVyXFxgLCBhbiBhcnJheVxuICAgICAgICAgICAgb2YgXFxgW3gsIHldXFxgIG51bWVyaWMgdHVwbGVzLiBGb3IgXFxgcGllXFxgLCBhbiBhcnJheSBvZlxuICAgICAgICAgICAgXFxge25hbWUsIHZhbHVlfVxcYCBvYmplY3RzLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgKVxuICAgIC5taW4oMSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIE9uZSBvciBtb3JlIHNlcmllcyB0byBwbG90LiBQaWUgY2hhcnRzIHVzZSBleGFjdGx5IG9uZSBzZXJpZXM7XG4gICAgICAgIGJhci9saW5lL2FyZWEgY2FuIHN0YWNrIG11bHRpcGxlIHNlcmllcyBzaGFyaW5nIHRoZSBzYW1lXG4gICAgICAgIFxcYGNhdGVnb3JpZXNcXGAgYXhpcy5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xuXG4vKipcbiAqIENhbm9uaWNhbCBwbGFubmVyIGlucHV0IHNoYXBlLiBUb29scyB0aGF0IHNvdXJjZSByb3dzIGZyb20gYW5cbiAqIGlubGluZSBkYXRhc2V0IChgcmVuZGVyX2RhdGFgKSB1c2UgaXQgYXMgdGhlaXIgYGlucHV0U2NoZW1hYFxuICogdmVyYmF0aW07IHRvb2xzIHRoYXQgcmVzb2x2ZSByb3dzIGZyb20gYSByZW1vdGUgKGBwcmVwYXJlX2NoYXJ0YFxuICogb3ZlciBhIEdlbmllIHN0YXRlbWVudCkgYG9taXQoeyBkYXRhIH0pYCBhbmQgYGV4dGVuZGAgd2l0aCB0aGVpclxuICogb3duIGlkZW50aWZpZXIgZmllbGQsIHNvIHRoZSBmaWVsZC1sZXZlbCBgLmRlc2NyaWJlKClgIHRleHRcbiAqIHN0YXlzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC4gU2VydmVyLW9ubHkgLSB0aGUgVUkgbmV2ZXJcbiAqIHNlZXMgYSBwbGFubmVyIHJlcXVlc3QsIG9ubHkgdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0uXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIENvbmNpc2UgdGl0bGUgc2hvd24gYWJvdmUgdGhlIGNoYXJ0IChlLmcuIFwiVG9wIDEwIFNLVXMgYnkgUmV2ZW51ZVwiKS5cbiAgICAgIGApLFxuICApLFxuICBkZXNjcmlwdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBUYWJ1bGFyIGRhdGFzZXQgdG8gY2hhcnQuIE9uZSBvYmplY3QgcGVyIHJvdywga2V5ZWQgYnkgY29sdW1uXG4gICAgICAgIG5hbWUuIFZhbHVlcyBtYXkgYmUgc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIG51bGwuIFRoZVxuICAgICAgICBjaGFydC1wbGFubmVyIGRlY2lkZXMgd2hpY2ggY29sdW1ucyBhcmUgY2F0ZWdvcmllcyB2cy4gbnVtZXJpY1xuICAgICAgICBzZXJpZXMuIENhcCBhdCBhIGZldyBodW5kcmVkIHJvd3MgZm9yIGxlZ2liaWxpdHk7IHNhbXBsZSAvXG4gICAgICAgIGFnZ3JlZ2F0ZSBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgKSxcbiAgICApLFxufSk7XG5cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgaW5zdHJ1Y3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEZvcm1hdCB7QGxpbmsgd2lyZS5DaGFydFR5cGVTY2hlbWF9J3MgdmFyaWFudHMgYXMgYSBzaW5nbGVcbiAqIGh1bWFuLWZyaWVuZGx5IHN0cmluZyBvZiBgYCBgPHZhbHVlPmAgZm9yIDxkZXNjcmlwdGlvbj4gYGBcbiAqIGNsYXVzZXMgam9pbmVkIGJ5IHNlbWljb2xvbnMsIGRyYXduIGZyb20gZWFjaCB2YXJpYW50J3Mgb3duXG4gKiBgLmRlc2NyaWJlKClgIHNvIHRoZSBwbGFubmVyIHByb21wdCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aFxuICogdGhlIHNjaGVtYSBieSBjb25zdHJ1Y3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdENoYXJ0VHlwZVBpY2tlcigpOiBzdHJpbmcge1xuICByZXR1cm4gd2lyZS5DaGFydFR5cGVTY2hlbWEub3B0aW9uc1xuICAgIC5tYXAoKG9wdCkgPT4gYFxcYCR7b3B0LnZhbHVlfVxcYCBmb3IgJHtvcHQuZGVzY3JpcHRpb24gPz8gXCJcIn1gKVxuICAgIC5qb2luKFwiOyBcIik7XG59XG5cbi8qKlxuICogU3lzdGVtIHByb21wdCBmb3IgdGhlIGlubmVyIGNoYXJ0LXBsYW5uaW5nIGFnZW50LiBUdW5lZCBmb3IgYVxuICogZmFzdC10aWVyIG1vZGVsIChIYWlrdSwgR1BULTUtbWluaSwgR2VtaW5pIEZsYXNoIExpdGUpLlxuICovXG5jb25zdCBDSEFSVF9QTEFOTkVSX0lOU1RSVUNUSU9OUyA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgWW91IGRlc2lnbiBBcGFjaGUgRWNoYXJ0cyB2aXN1YWxpemF0aW9ucy4gVGhlIHVzZXIgZ2l2ZXMgeW91IGFcbiAgdGFidWxhciBkYXRhc2V0IChyb3dzIG9mIG9iamVjdHMpIHBsdXMgYSB0aXRsZSBhbmQgYW4gb3B0aW9uYWxcbiAgZGVzY3JpcHRpb24gb2YgdGhlIGludGVudC4gWW91IHByb2R1Y2UgYSBzbWFsbCBjaGFydCBwbGFuIChjaGFydFxuICB0eXBlLCBheGlzIGxhYmVscywgY2F0ZWdvcmllcywgc2VyaWVzKSB0aGF0IGJlc3QgY29udmV5cyB0aGUgZGF0YS5cblxuICBEZWNpc2lvbiBndWlkZS4gUGljayB0aGUgY2hhcnQgdHlwZSB3aG9zZSBkYXRhIHNoYXBlIG1hdGNoZXMgdGhlXG4gIGRhdGFzZXQgYW5kIHRoZSB1c2VyJ3MgaW50ZW50OiAke2Zvcm1hdENoYXJ0VHlwZVBpY2tlcigpfS5cblxuICBXaGVuIGluIGRvdWJ0IGJldHdlZW4gYmFyIGFuZCBsaW5lLCBwcmVmZXIgYmFyIGZvciB1bm9yZGVyZWRcbiAgY2F0ZWdvcmllcyBhbmQgbGluZSBmb3Igb3JkZXJlZCBvbmVzIChkYXRlcywgdGltZSBidWNrZXRzLCByYW5rcykuXG4gIE5ldmVyIHBpY2sgcGllIGZvciBtb3JlIHRoYW4gNyBzbGljZXMuXG5cbiAgRm9yIGJhciAvIGxpbmUgLyBhcmVhOiBwaWNrIG9uZSBjb2x1bW4gYXMgdGhlIGNhdGVnb3J5IGF4aXMgKHVzdWFsbHlcbiAgdGhlIG9ubHkgc3RyaW5nLXZhbHVlZCBjb2x1bW4pIGFuZCBvbmUgb3IgbW9yZSBudW1lcmljIGNvbHVtbnMgYXNcbiAgc2VyaWVzLiBTb3J0IGNhdGVnb3JpZXMgYnkgdGhlIHByaW1hcnkgc2VyaWVzIHZhbHVlIGRlc2NlbmRpbmcgdW5sZXNzXG4gIHRoZSBkYXRhIGlzIG5hdHVyYWxseSBvcmRlcmVkIChkYXRlcywgcmFua3MpLlxuXG4gIEZvciBwaWU6IHBpY2sgdGhlIGNhdGVnb3J5IGNvbHVtbiBmb3Igc2xpY2UgbmFtZXMgYW5kIG9uZSBudW1lcmljXG4gIGNvbHVtbiBmb3Igc2xpY2UgdmFsdWVzLiBFbWl0IGEgc2luZ2xlIHNlcmllcy5cblxuICBGb3Igc2NhdHRlcjogcGljayB0d28gbnVtZXJpYyBjb2x1bW5zIGFuZCBlbWl0IFxcYFt4LCB5XVxcYCB0dXBsZXMgaW4gYVxuICBzaW5nbGUgc2VyaWVzLlxuXG4gIEtlZXAgc2VyaWVzIG5hbWVzIGh1bWFuLXJlYWRhYmxlICh1c2UgdGhlIGNvbHVtbiBuYW1lOyB0aXRsZSBjYXNlIGl0XG4gIGxpZ2h0bHkgaWYgbmVlZGVkKS4gS2VlcCB0aXRsZXMgY29uY2lzZTsgZG8gbm90IHJlcGVhdCB0aGUgdXNlcidzXG4gIHRpdGxlIGluIHhBeGlzTGFiZWwgLyB5QXhpc0xhYmVsLlxuYCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBsYW5uZXIgYWdlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcGxhbm5lciBgQWdlbnRgIHBlciBwbHVnaW4gY29uZmlnLiBDYWNoZWQgb24gY29uZmlnIG9iamVjdFxuICogaWRlbnRpdHkgc28gY2FsbGVycyBjYW4gYHByZXBhcmVDaGFydCh7IGNvbmZpZywgLi4uIH0pYCBmcm9tIGFcbiAqIGhvdCBwYXRoIHdpdGhvdXQgcGF5aW5nIHRoZSBBZ2VudC1jb25zdHJ1Y3RvciBjb3N0IGV2ZXJ5IGNhbGwuXG4gKiBgV2Vha01hcGAgbGV0cyByZXRpcmVkIGNvbmZpZ3MgKGUuZy4gdGVzdCByZWNvbmZpZ3VyYXRpb25zKVxuICogcmVsZWFzZSB0aGVpciBhZ2VudCB3aXRob3V0IG1hbnVhbCBldmljdGlvbi5cbiAqL1xuY29uc3QgcGxhbm5lckFnZW50cyA9IG5ldyBXZWFrTWFwPE1hc3RyYVBsdWdpbkNvbmZpZywgQWdlbnQ+KCk7XG5cbmZ1bmN0aW9uIGdldFBsYW5uZXJBZ2VudChjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IEFnZW50IHtcbiAgbGV0IGFnZW50ID0gcGxhbm5lckFnZW50cy5nZXQoY29uZmlnKTtcbiAgaWYgKCFhZ2VudCkge1xuICAgIGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgIGlkOiBcImNoYXJ0X3BsYW5uZXJcIixcbiAgICAgIG5hbWU6IFwiQ2hhcnQgUGxhbm5lclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiUGlja3MgY2hhcnQgdHlwZSBhbmQgYXhpcyBlbmNvZGluZ3MgZm9yIGEgZGF0YXNldC5cIixcbiAgICAgIGluc3RydWN0aW9uczogQ0hBUlRfUExBTk5FUl9JTlNUUlVDVElPTlMsXG4gICAgICBtb2RlbDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT5cbiAgICAgICAgYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0LCB7IG1vZGVsQ2xhc3M6IG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3QgfSksXG4gICAgfSk7XG4gICAgcGxhbm5lckFnZW50cy5zZXQoY29uZmlnLCBhZ2VudCk7XG4gIH1cbiAgcmV0dXJuIGFnZW50O1xufVxuXG4vKipcbiAqIFJ1biB0aGUgcGxhbm5lciBhZ2FpbnN0IGByZXF1ZXN0YCBhbmQgcmV0dXJuIHRoZSByZXNvbHZlZFxuICogRWNoYXJ0cyBzcGVjLiBUaHJvd3Mgb24gcGxhbm5lciBmYWlsdXJlIC0ge0BsaW5rIHByZXBhcmVDaGFydH1cbiAqIGNhdGNoZXMgYW5kIHN0YXNoZXMgdGhlIGVycm9yIGluIHRoZSBjYWNoZSBlbnRyeS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQ2hhcnRQbGFubmVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgcmVxdWVzdDogQ2hhcnRQbGFubmVyUmVxdWVzdCxcbiAgb3B0aW9uczogeyByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0OyBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbik6IFByb21pc2U8Q2hhcnRSZXN1bHQ+IHtcbiAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIGRhdGEgfSA9IHJlcXVlc3Q7XG4gIGNvbnN0IHsgcmVxdWVzdENvbnRleHQsIGFib3J0U2lnbmFsIH0gPSBvcHRpb25zO1xuICBjb25zdCBwcm9tcHQgPSBzdHJpbmcudG9EZXNjcmlwdGlvbih7XG4gICAgVGl0bGU6IHRpdGxlLFxuICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgRGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgXCJEYXRhc2V0IChKU09OLCBvbmUgcm93IHBlciBvYmplY3QpXCI6IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpLFxuICB9KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UGxhbm5lckFnZW50KGNvbmZpZykuZ2VuZXJhdGUocHJvbXB0LCB7XG4gICAgc3RydWN0dXJlZE91dHB1dDogeyBzY2hlbWE6IGNoYXJ0UGxhblNjaGVtYSB9LFxuICAgIC4uLihyZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAuLi4oYWJvcnRTaWduYWwgPyB7IGFib3J0U2lnbmFsIH0gOiB7fSksXG4gIH0pO1xuICBjb25zdCBwbGFuID0gY2hhcnRQbGFuU2NoZW1hLnBhcnNlKHJlc3VsdC5vYmplY3QpO1xuICBjb25zdCBvcHRpb24gPSBwbGFuVG9FY2hhcnRzT3B0aW9uKHBsYW4sIHRpdGxlLCBjb25maWcuYnJhbmQpO1xuICByZXR1cm4geyBjaGFydFR5cGU6IHBsYW4uY2hhcnRUeXBlLCBvcHRpb24gfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQnVpbGQgdGhlIGNhbm9uaWNhbCBjYWNoZSBrZXkgZm9yIGEgYGNoYXJ0SWRgIG93bmVkIGJ5IGB1c2VyS2V5YC5cbiAqXG4gKiBUaGUgaWRlbnRpdHkgaXMgcGFydCBvZiB0aGUga2V5LCBub3QgYSBmaWx0ZXIgYXBwbGllZCBhZnRlciB0aGUgcmVhZCwgc28gYVxuICogY2hhcnQgaWQgZ3Vlc3NlZCBvciBjb3BpZWQgZnJvbSBhbm90aGVyIHVzZXIncyB0cmFuc2NyaXB0IHJlc29sdmVzIHRvIGFcbiAqIGRpZmZlcmVudCBrZXkgYW5kIHNpbXBseSBtaXNzZXMuIFRoYXQgbWlzcyBpcyB3aGF0IHRoZSBIVFRQIHJvdXRlIHR1cm5zIGludG9cbiAqIGEgNDA0LCB3aGljaCBpcyBhbHNvIHRoZSBhbnN3ZXIgdGhhdCBsZWFrcyB0aGUgbGVhc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNoYXJ0Q2FjaGVLZXkoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gKGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpKS5nZW5lcmF0ZUtleShbQ0hBUlRfQ0FDSEVfTkFNRVNQQUNFLCBjaGFydElkXSwgdXNlcktleSk7XG59XG5cbi8qKlxuICogUGVyc2lzdCBhIHtAbGluayBDaGFydH0gZW50cnkgdW5kZXIgaXRzIGBjaGFydElkYCwgb3duZWQgYnkgYHVzZXJLZXlgLlxuICogUmVmcmVzaGVzIHRoZSBUVEwgb24gZXZlcnkgd3JpdGUuIENhY2hlLWxheWVyIGZhaWx1cmVzIGFyZSBsb2dnZWQgYW5kXG4gKiBzd2FsbG93ZWQgc28gYmFja2dyb3VuZCBydW5uZXJzIG5ldmVyIHRocm93IGludG8gdGhlXG4gKiB1bmhhbmRsZWQtcmVqZWN0aW9uIHN0cmVhbS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVDaGFydChlbnRyeTogQ2hhcnQsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IGNoYXJ0Q2FjaGVLZXkoZW50cnkuY2hhcnRJZCwgdXNlcktleSk7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLnNldChrZXksIGVudHJ5LCB7XG4gICAgICB0dGw6IENIQVJUX0NBQ0hFX1RUTF9TRUMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwid3JpdGUtZXJyb3JcIiwge1xuICAgICAgY2hhcnRJZDogZW50cnkuY2hhcnRJZCxcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIExvb2sgdXAgYSBjaGFydCBgdXNlcktleWAgb3ducy4gUmV0dXJucyBgdW5kZWZpbmVkYCBvbiBtaXNzLCBvblxuICogZXhwaXJ5LCB3aGVuIGFub3RoZXIgaWRlbnRpdHkgb3ducyB0aGUgaWQsIG9yIHdoZW4gdGhlIGNhY2hlIGxheWVyIGlzXG4gKiB1bmhlYWx0aHkgLSBuZXZlciB0aHJvd3MuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDaGFydChjaGFydElkOiBzdHJpbmcsIHVzZXJLZXk6IHN0cmluZyk6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjaGFydENhY2hlS2V5KGNoYXJ0SWQsIHVzZXJLZXkpO1xuICAgIGNvbnN0IHYgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuZ2V0PENoYXJ0PihrZXkpO1xuICAgIHJldHVybiB2ID8/IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJyZWFkLWVycm9yXCIsIHtcbiAgICAgIGNoYXJ0SWQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJlcGFyZUNoYXJ0IG9yY2hlc3RyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgcHJlcGFyZUNoYXJ0fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZUNoYXJ0T3B0aW9ucyB7XG4gIC8qKiBQbHVnaW4gY29uZmlnOyByZXNvbHZlcyB0aGUgcGxhbm5lciBhZ2VudCdzIG1vZGVsLiAqL1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoYXQgb3ducyB0aGUgbWludGVkIGNoYXJ0LiBPbmx5IGEge0BsaW5rIGZldGNoQ2hhcnR9IGNhbGxcbiAgICogY2FycnlpbmcgdGhlIHNhbWUga2V5IHJlc29sdmVzIGl0LiBVc2Uge0BsaW5rIHJlc29sdmVVc2VyS2V5fS5cbiAgICovXG4gIHVzZXJLZXk6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgdGl0bGUgZm9yd2FyZGVkIHRvIHRoZSBwbGFubmVyIGFnZW50LiAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGludGVudCBoaW50IGZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgcm93cyB0byBjaGFydC4gQ2FsbGVkIG9uY2UsIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgKiBBbnkgdGhyb3duIGVycm9yIGxhbmRzIGluIHRoZSBjYWNoZSBhcyB0aGUgZW50cnkncyBgZXJyb3JgXG4gICAqIGZpZWxkIChuZXZlciBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIgb2Yge0BsaW5rIHByZXBhcmVDaGFydH0pLlxuICAgKiBBbiBlbXB0eSBgcm93c2AgYXJyYXkgaXMgcmVqZWN0ZWQgYXMgYFwiZGF0YXNldCBoYXMgbm8gcm93cztcbiAgICogbm90aGluZyB0byBjaGFydFwiYC5cbiAgICovXG4gIHJlc29sdmVEYXRhOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8eyByb3dzOiBSZWFkb25seUFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB9PjtcbiAgLyoqXG4gICAqIFBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAuIEZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudCBzb1xuICAgKiB1c2VyLXNjb3BlZCBtb2RlbCByZXNvbHV0aW9uIChPQk8pIHN0YXlzIGluIGVmZmVjdC5cbiAgICovXG4gIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7XG4gIC8qKlxuICAgKiBDb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24uIEZvcndhcmRlZCB0byBgcmVzb2x2ZURhdGFgIGFuZCB0aGVcbiAgICogcGxhbm5lciBhZ2VudC4gTm90ZTogdGhlIGNoYXJ0IHRhc2sgY29udGludWVzIHJ1bm5pbmcgaW4gdGhlXG4gICAqIGJhY2tncm91bmQgYWZ0ZXIgdGhlIHBhcmVudCByZXF1ZXN0IGVuZHMsIHNvIGV4dGVybmFsIGFib3J0XG4gICAqIHNpZ25hbHMgYXJlIGJlc3QtZWZmb3J0OyB0eXBpY2FsIHVzZSBpcyB0byBsZWF2ZSB0aGlzIHVuc2V0XG4gICAqIGFuZCBsZXQgdGhlIDFoIFRUTCBjYXAgc3RhbGUgZW50cmllcy5cbiAgICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIE1pbnQgYSBgY2hhcnRJZGAsIGNhY2hlIGFuIGVtcHR5IGB7IGNoYXJ0SWQgfWAgcGxhY2Vob2xkZXJcbiAqIHN5bmNocm9ub3VzbHksIGFuZCBraWNrIG9mZiBhIGJhY2tncm91bmQgdGFzayB0aGF0IHJlc29sdmVzIHRoZVxuICogZGF0YXNldCBhbmQgcnVucyB0aGUgcGxhbm5lci4gUmV0dXJucyB0aGUgYGNoYXJ0SWRgIG9uY2UgdGhlXG4gKiBwbGFjZWhvbGRlciBsYW5kcyBzbyB0aGUgZmlyc3Qge0BsaW5rIGZldGNoQ2hhcnR9IGNhbGwgYWx3YXlzXG4gKiBzZWVzIGFuIGVudHJ5IChubyBzcHVyaW91cyA0MDQgcmFjZSkuXG4gKlxuICogVGhlIGJhY2tncm91bmQgdGFzayBzd2FsbG93cyBpdHMgb3duIGZhaWx1cmVzIGFuZCB3cml0ZXMgdGhlbVxuICogYXMgYGVycm9yYCBlbnRyaWVzLCBzbyBjYWxsZXJzIG5ldmVyIHNlZSBhIHJlamVjdGVkIHByb21pc2UuXG4gKiBDYWNoZSBzdGF0ZSBtYWNoaW5lOlxuICpcbiAqICAgLSBqdXN0IGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zOiBgeyBjaGFydElkIH1gIChwcm9jZXNzaW5nKVxuICogICAtIG9uIHBsYW5uZXIgc3VjY2VzczogICAgICAgICAgIGB7IGNoYXJ0SWQsIHJlc3VsdCB9YFxuICogICAtIG9uIGRhdGEgLyBwbGFubmVyIGZhaWx1cmU6ICAgIGB7IGNoYXJ0SWQsIGVycm9yIH1gXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlQ2hhcnQob3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8eyBjaGFydElkOiBzdHJpbmcgfT4ge1xuICBjb25zdCBjaGFydElkID0gaGFzaC5pZCgpO1xuICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCB9LCBvcHRzLnVzZXJLZXkpO1xuICBsb2dnZXIuZGVidWcoXCJxdWV1ZWRcIiwgeyBjaGFydElkIH0pO1xuICAvLyBGaXJlLWFuZC1mb3JnZXQuIEZhaWx1cmVzIGxhbmQgaW4gdGhlIGNhY2hlIGFzIGBlcnJvcmAgZW50cmllcztcbiAgLy8gbmV2ZXIgZXNjYXBlIGludG8gYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgdm9pZCBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZCwgb3B0cyk7XG4gIHJldHVybiB7IGNoYXJ0SWQgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJlcGFyZUNoYXJ0KGNoYXJ0SWQ6IHN0cmluZywgb3B0czogUHJlcGFyZUNoYXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBvcHRzLnJlc29sdmVEYXRhKG9wdHMuc2lnbmFsKTtcbiAgICBpZiAoZGF0YS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwiRGF0YXNldCBoYXMgbm8gcm93czsgbm90aGluZyB0byBjaGFydFwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQ2hhcnRQbGFubmVyKFxuICAgICAgb3B0cy5jb25maWcsXG4gICAgICB7XG4gICAgICAgIHRpdGxlOiBvcHRzLnRpdGxlID8/IFwiQ2hhcnRcIixcbiAgICAgICAgLi4uKG9wdHMuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIGRhdGE6IGRhdGEucm93cyBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0W1wiZGF0YVwiXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLihvcHRzLnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogb3B0cy5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGFib3J0U2lnbmFsOiBvcHRzLnNpZ25hbCB9IDoge30pLFxuICAgICAgfSxcbiAgICApO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCByZXN1bHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgICBsb2dnZXIuaW5mbyhcImRvbmVcIiwge1xuICAgICAgY2hhcnRJZCxcbiAgICAgIGNoYXJ0VHlwZTogcmVzdWx0LmNoYXJ0VHlwZSxcbiAgICAgIGVsYXBzZWRNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJlcnJvclwiLCB7IGNoYXJ0SWQsIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAvLyBUaGUgZW50cnkncyBgZXJyb3JgIGlzIHJlbmRlcmVkIGluIHRoZSBjaGF0LCBzbyBvbmx5IGFuIEFwcEtpdEVycm9yJ3NcbiAgICAvLyBvd24gbWVzc2FnZSB0cmF2ZWxzOyBhbnl0aGluZyBlbHNlIGNvdWxkIGNhcnJ5IHVwc3RyZWFtIHByb3ZpZGVyIGRldGFpbC5cbiAgICBjb25zdCBlcnJUZXh0ID0gZXJyIGluc3RhbmNlb2YgQXBwS2l0RXJyb3IgPyBlcnIubWVzc2FnZSA6IENIQVJUX0ZBSUxFRF9NRVNTQUdFO1xuICAgIGF3YWl0IHdyaXRlQ2hhcnQoeyBjaGFydElkLCBlcnJvcjogZXJyVGV4dCB9LCBvcHRzLnVzZXJLZXkpO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbG9uZy1wb2xsIGZldGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIElucHV0cyB0byB7QGxpbmsgZmV0Y2hDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoQ2hhcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIElkZW50aXR5IHRoZSBjaGFydCBtdXN0IGJlbG9uZyB0by4gQSBjaGFydCBtaW50ZWQgdW5kZXIgYSBkaWZmZXJlbnQga2V5XG4gICAqIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBwb2xsaW5nIGJ1ZGdldCBpbiBtcy4gV2hlbiB0aGUgZW50cnkgc3RheXMgaW5cbiAgICogdGhlIHByb2Nlc3Npbmcgc3RhdGUgcGFzdCB0aGlzIHdpbmRvdywgdGhlIGhlbHBlciByZXR1cm5zIHRoZVxuICAgKiBsYXN0IHNlZW4gdmFsdWUgKHN0aWxsIHByb2Nlc3NpbmcpIHNvIHRoZSBjbGllbnQgY2FuIHJlLXBvbGwuXG4gICAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0ZFVENIX1RJTUVPVVRfTVN9ICg2MHMpLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogUG9sbCBpbnRlcnZhbCBpbiBtcy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVN9ICgyNTBtcykuXG4gICAqL1xuICBpbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uIGhhbmRsZSAoZS5nLiByZXF1ZXN0IGByZXEuc2lnbmFsYCkuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIExvbmctcG9sbCB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5IHNldHRsZXMgKGByZXN1bHRgIG9yXG4gKiBgZXJyb3JgIHNldCksIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBvciB0aGUgc2VydmVyLXNpZGUgdGltZW91dFxuICogZWxhcHNlcy5cbiAqXG4gKiBSZXR1cm5zOlxuICogICAtIHRoZSByZXNvbHZlZCB7QGxpbmsgQ2hhcnR9IHdoZW4gaXQgc2V0dGxlZCwgZXJyb3JlZCwgb3JcbiAqICAgICBzdGF5ZWQgaW4gcHJvY2Vzc2luZyBwYXN0IGB0aW1lb3V0TXNgIChzbyB0aGUgY2xpZW50IGNhblxuICogICAgIHJlLXBvbGwpO1xuICogICAtIGB1bmRlZmluZWRgIHdoZW4gdGhlIGVudHJ5IGlzIG1pc3NpbmcsIGV4cGlyZWQsIG9yIG93bmVkIGJ5XG4gKiAgICAgYW5vdGhlciBpZGVudGl0eSAodGhlIGNvbnN1bWVyIHNob3VsZCB0cmVhdCBhcyA0MDQpLlxuICpcbiAqIGBzaWduYWxgIGxldHMgdGhlIGNhbGxlciBjYW5jZWwgYWhlYWQgb2YgdGltZW91dCAoZS5nLiB0aGUgSFRUUFxuICogcmVxdWVzdCBjbG9zZWQpLiBDYW5jZWxsYXRpb24gcHJvcGFnYXRlcyB0byB0aGUgaW50ZXItcG9sbCBzbGVlcFxuICogc28gdGhlIGhlbHBlciByZXR1cm5zIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDaGFydChcbiAgY2hhcnRJZDogc3RyaW5nLFxuICBvcHRpb25zOiBGZXRjaENoYXJ0T3B0aW9ucyxcbik6IFByb21pc2U8Q2hhcnQgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucy50aW1lb3V0TXMgPz8gREVGQVVMVF9GRVRDSF9USU1FT1VUX01TO1xuICBjb25zdCBpbnRlcnZhbE1zID0gb3B0aW9ucy5pbnRlcnZhbE1zID8/IERFRkFVTFRfRkVUQ0hfSU5URVJWQUxfTVM7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcblxuICBsZXQgbGFzdDogQ2hhcnQgfCB1bmRlZmluZWQ7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgb3B0aW9ucy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgbGFzdCA9IGF3YWl0IHJlYWRDaGFydChjaGFydElkLCBvcHRpb25zLnVzZXJLZXkpO1xuICAgIGlmICghbGFzdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAobGFzdC5yZXN1bHQgIT09IHVuZGVmaW5lZCB8fCBsYXN0LmVycm9yICE9PSB1bmRlZmluZWQpIHJldHVybiBsYXN0O1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGRlYWRsaW5lIC0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHJldHVybiBsYXN0O1xuICAgIGF3YWl0IGFzeW5jLnNsZWVwKE1hdGgubWluKGludGVydmFsTXMsIHJlbWFpbmluZyksIG9wdGlvbnMuc2lnbmFsKTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBlY2hhcnRzIHRoZW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGFuIEVjaGFydHMgb3B0aW9uIHRoYXQgY2FycmllcyBicmFuZCBpZGVudGl0eTogdGhlIHNlcmllc1xuICogY29sb3IgY3ljbGUgYW5kIHRoZSBiYXNlIHRleHQgc3R5bGUgKGZvbnQgZmFtaWx5ICsgZm9yZWdyb3VuZCBjb2xvcikuXG4gKiBEZXJpdmVkIGZyb20gYSB7QGxpbmsgQnJhbmRDb250ZXh0fSBieSB7QGxpbmsgYnJhbmRDaGFydFRoZW1lfSBhbmQgbWVyZ2VkXG4gKiBpbnRvIGV2ZXJ5IHNwZWMgYnkge0BsaW5rIHBsYW5Ub0VjaGFydHNPcHRpb259LlxuICovXG5pbnRlcmZhY2UgQ2hhcnRUaGVtZSB7XG4gIGNvbG9yOiBzdHJpbmdbXTtcbiAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIEFwcEtpdCdzIGNhdGVnb3JpY2FsIGNoYXJ0IHBhbGV0dGUgKGAtLWNoYXJ0LWNhdC0xYCAuLiBgLS1jaGFydC1jYXQtOGAgZnJvbVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC11aWApLCBhcyBoZXguIFNlcnZlci1yZW5kZXJlZCBjaGFydCBzcGVjcyBjYW5ub3QgcmVhZCB0aGVcbiAqIGJyb3dzZXIncyBDU1MgY3VzdG9tIHByb3BlcnRpZXMsIHNvIHRoZSB2YWx1ZXMgYXJlIG1pcnJvcmVkIGhlcmUgdG8ga2VlcCBhXG4gKiBnZW5lcmF0ZWQgY2hhcnQgdmlzdWFsbHkgY29uc2lzdGVudCB3aXRoIHRoZSBBcHBLaXQtc3R5bGVkIFVJIGFyb3VuZCBpdC5cbiAqIEtlZXAgaW4gc3luYyB3aXRoIEFwcEtpdCdzIHN0eWxlc2hlZXQgaWYgaXQgY2hhbmdlcy5cbiAqL1xuY29uc3QgQVBQS0lUX0NIQVJUX1BBTEVUVEUgPSBbXG4gIFwiIzI0NjNFQlwiLCAvLyBibHVlXG4gIFwiIzJFQjg4QVwiLCAvLyB0ZWFsXG4gIFwiI0FCNDdCRFwiLCAvLyBwdXJwbGVcbiAgXCIjRjY5RTIzXCIsIC8vIGFtYmVyXG4gIFwiI0REMkM0RFwiLCAvLyByb3NlXG4gIFwiIzFCQTNCQlwiLCAvLyBjeWFuXG4gIFwiIzlCNjFEMVwiLCAvLyBsYXZlbmRlclxuICBcIiMzNEIyNjJcIiwgLy8gZW1lcmFsZFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBFeHBhbmQgdHdvIGJyYW5kIGhleCBjb2xvcnMgaW50byBhIGxlZ2libGUgY2F0ZWdvcmljYWwgY3ljbGUuIEVjaGFydHNcbiAqIHJlcGVhdHMgdGhlIGBjb2xvcmAgYXJyYXkgYWNyb3NzIHNlcmllcyAvIGNhdGVnb3JpZXMsIHNvIGEgZ29vZCBkZWZhdWx0XG4gKiBuZWVkcyBzZXZlcmFsIGRpc3RpbmN0IGh1ZXMsIG5vdCB0d28uIFdlIHNlZWQgd2l0aCB0aGUgYnJhbmQgcHJpbWFyeSBhbmRcbiAqIGFjY2VudCAodGhlIGlkZW50aXR5IGNvbG9ycykgYW5kIGZvbGxvdyB3aXRoIEFwcEtpdCdzIG93biBjYXRlZ29yaWNhbCBjaGFydFxuICogcGFsZXR0ZSwgc28gbXVsdGktc2VyaWVzIC8gbWFueS1zbGljZSBjaGFydHMgc3RheSByZWFkYWJsZSBhbmQgbWF0Y2ggdGhlXG4gKiBzdXJyb3VuZGluZyBBcHBLaXQgVUkgd2hpbGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbWFya3MgbGFuZCBvbi1icmFuZC5cbiAqL1xuZnVuY3Rpb24gYnJhbmRDb2xvckN5Y2xlKHByaW1hcnk6IHN0cmluZywgYWNjZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNwcmVhZCA9IEFQUEtJVF9DSEFSVF9QQUxFVFRFO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiBbcHJpbWFyeSwgYWNjZW50LCAuLi5zcHJlYWRdLmZpbHRlcigoYykgPT4ge1xuICAgIGNvbnN0IGtleSA9IGMudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKGtleSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlcml2ZSBhbiBFY2hhcnRzIHtAbGluayBDaGFydFRoZW1lfSBmcm9tIGEgYnJhbmQgY29udGV4dDogdGhlIHByaW1hcnkgK1xuICogYWNjZW50IGNvbG9ycyBzZWVkIHRoZSBzZXJpZXMgY3ljbGUsIHRoZSBzYW5zIHN0YWNrIGJlY29tZXMgdGhlIGJhc2UgZm9udCxcbiAqIGFuZCB0aGUgYnJhbmQgZm9yZWdyb3VuZCBiZWNvbWVzIHRoZSBiYXNlIHRleHQgY29sb3IuXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ2hhcnRUaGVtZShicmFuZDogQnJhbmRDb250ZXh0KTogQ2hhcnRUaGVtZSB7XG4gIHJldHVybiB7XG4gICAgY29sb3I6IGJyYW5kQ29sb3JDeWNsZShicmFuZC5jb2xvcnMucHJpbWFyeSwgYnJhbmQuY29sb3JzLmFjY2VudCksXG4gICAgdGV4dFN0eWxlOiB7IGZvbnRGYW1pbHk6IGJyYW5kLnR5cG9ncmFwaHkuc2FucywgY29sb3I6IGJyYW5kLmNvbG9ycy5mb3JlZ3JvdW5kIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgZXhwYW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRXhwYW5kIGEge0BsaW5rIENoYXJ0UGxhbn0gaW50byBhIGZ1bGwgRWNoYXJ0cyBgRUNoYXJ0c09wdGlvbmBcbiAqIEpTT04uIENlbnRyYWxpemVkIGhlcmUgc28gdGhlIHBsYW5uZXIgYWdlbnQgb25seSBmaWxscyBpbiB0aGVcbiAqIGNvbXBhY3QgcGxhbiBzaGFwZTsgdG9vbHRpcCAvIGFuaW1hdGlvbiAvIGNvbG9yIC8gZ3JpZCBkZWZhdWx0c1xuICogc3RheSBjb25zaXN0ZW50IGFjcm9zcyBjaGFydHMgYW5kIGFyZSBlYXN5IHRvIHR1bmUgd2l0aG91dFxuICogcmV0cmFpbmluZyBtb2RlbCBiZWhhdmlvdXIuXG4gKlxuICogV2hlbiBgYnJhbmRgIGlzIHNldCwgdGhlIHJlc29sdmVkIHNwZWMgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3Mgc2VyaWVzXG4gKiBjb2xvciBjeWNsZSBhbmQgYmFzZSB0ZXh0IHN0eWxlIChzZWUge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0pOyBvdGhlcndpc2VcbiAqIEVjaGFydHMnIGRlZmF1bHRzIGFwcGx5LlxuICovXG5mdW5jdGlvbiBwbGFuVG9FY2hhcnRzT3B0aW9uKFxuICBwbGFuOiBDaGFydFBsYW4sXG4gIGZhbGxiYWNrVGl0bGU6IHN0cmluZyxcbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGJhc2VUaXRsZSA9IHBsYW4udGl0bGUgPz8gZmFsbGJhY2tUaXRsZTtcbiAgY29uc3QgZ3JpZCA9IHsgbGVmdDogNDgsIHJpZ2h0OiAyNCwgdG9wOiA1NiwgYm90dG9tOiA0OCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG4gIGNvbnN0IHRoZW1lID0gYnJhbmQgPyBicmFuZENoYXJ0VGhlbWUoYnJhbmQpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0aGVtZWQgPSAob3B0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gICAgdGhlbWUgPyB7IC4uLnRoZW1lLCAuLi5vcHRpb24gfSA6IG9wdGlvbjtcblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwicGllXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBwaWUgc2xpY2VzIC0gZmlsdGVyIHRoZW0gb3V0LlxuICAgIC8vIGB7bmFtZSwgdmFsdWV9YCBzbGljZXMgYXJlIHRoZSBvbmx5IHZhbGlkIHBpZSBkYXRhIHNoYXBlLFxuICAgIC8vIHNvIGRyb3AgYmFyZSBudW1iZXJzIC8gdHVwbGVzIC8gbnVsbHMgdGhlIHBsYW5uZXIgbWF5XG4gICAgLy8gaGF2ZSBsZWFrZWQgaW50byBhIHBpZSBzZXJpZXMuXG4gICAgY29uc3Qgc2xpY2VzID0gKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKS5maWx0ZXIoXG4gICAgICAoZCk6IGQgaXMgeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfSA9PlxuICAgICAgICBkICE9PSBudWxsICYmIHR5cGVvZiBkID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGQpLFxuICAgICk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZTogeyB0ZXh0OiBiYXNlVGl0bGUsIGxlZnQ6IFwiY2VudGVyXCIgfSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZDogeyBib3R0b206IDAgfSxcbiAgICAgIHNlcmllczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcGxhbi5zZXJpZXNbMF0/Lm5hbWUgPz8gYmFzZVRpdGxlLFxuICAgICAgICAgIHR5cGU6IFwicGllXCIsXG4gICAgICAgICAgcmFkaXVzOiBbXCIzNSVcIiwgXCI2NSVcIl0sXG4gICAgICAgICAgZGF0YTogc2xpY2VzLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJzY2F0dGVyXCIpIHtcbiAgICAvLyBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCBzY2F0dGVyIHBvaW50cyAtIGtlZXAgb25seSB2YWxpZFxuICAgIC8vIGBbeCwgeV1gIHR1cGxlcy4gQmFyZSBudW1iZXJzIC8gb2JqZWN0cyAvIG51bGxzIGZyb20gYVxuICAgIC8vIG1pc21hdGNoZWQgcGxhbiBnZXQgZHJvcHBlZCBzaWxlbnRseS5cbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlOiB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9LFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kOiB7IGJvdHRvbTogMCB9LFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi54QXhpc0xhYmVsIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJzY2F0dGVyXCIsXG4gICAgICAgIGRhdGE6IHMuZGF0YS5maWx0ZXIoKGQpOiBkIGlzIFtudW1iZXIsIG51bWJlcl0gPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMiksXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBiYXIgLyBsaW5lIC8gYXJlYSBzaGFyZSB0aGUgc2FtZSBheGlzIGxheW91dC5cbiAgY29uc3QgaXNBcmVhID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYXJlYVwiO1xuICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYmFyXCIgPyBcImJhclwiIDogXCJsaW5lXCI7XG4gIHJldHVybiB0aGVtZWQoe1xuICAgIHRpdGxlOiB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9LFxuICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIgfSxcbiAgICBsZWdlbmQ6IHsgYm90dG9tOiAwIH0sXG4gICAgZ3JpZCxcbiAgICB4QXhpczoge1xuICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgIH0sXG4gICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgLi4uKGlzQXJlYSA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgIH0pKSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlbmRlcl9kYXRhIHRvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHJlbmRlcl9kYXRhYCBNYXN0cmEgdG9vbCBib3VuZCB0byB0aGUgZ2l2ZW4gcGx1Z2luXG4gKiBjb25maWcuIEF1dG8td2lyZWQgYXMgYSBzeXN0ZW0gdG9vbCBvbiBldmVyeSBhZ2VudCAoc2VlXG4gKiBgYWdlbnRzLnRzYCk7IHBlci1hZ2VudCB0b29scyBjYW4gc2hhZG93IGl0IGJ5IHJlZ2lzdGVyaW5nIGFcbiAqIHNhbWUtbmFtZWQgZW50cnkuXG4gKlxuICogVGhpbiB3cmFwcGVyIG92ZXIge0BsaW5rIHByZXBhcmVDaGFydH0gZm9yIGNhbGxlcnMgdGhhdCBhbHJlYWR5XG4gKiBoYXZlIGEgZGF0YXNldCBpbiBoYW5kLiBNaW50cyBhIGBjaGFydElkYCBzeW5jaHJvbm91c2x5LCBjYWNoZXNcbiAqIGFuIGVtcHR5IHBsYWNlaG9sZGVyLCBhbmQga2lja3Mgb2ZmIHRoZSBjaGFydC1wbGFubmVyIGluIHRoZVxuICogYmFja2dyb3VuZC4gUmV0dXJucyBqdXN0IHRoZSBgY2hhcnRJZGA7IHRoZSBob3N0IFVJIHJlc29sdmVzXG4gKiBgW2NoYXJ0OjxjaGFydElkPl1gIG1hcmtlcnMgYnkgaGl0dGluZyB0aGUgcGx1Z2luJ3NcbiAqIGAvZW1iZWQvY2hhcnQvOmlkYCByb3V0ZS5cbiAqXG4gKiBGb3IgR2VuaWUgc3RhdGVtZW50IHJlc3VsdHMsIHByZWZlciB0aGUgR2VuaWUgYWdlbnQnc1xuICogYHByZXBhcmVfY2hhcnRgIHRvb2wsIHdoaWNoIGFjY2VwdHMgYSBgc3RhdGVtZW50X2lkYCBhbmRcbiAqIHJlc29sdmVzIHRoZSByb3dzIGxhemlseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpIHtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBcInJlbmRlcl9kYXRhXCIsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgU3VibWl0IGEgdGFidWxhciBkYXRhc2V0IGZvciBpbmxpbmUgcmVuZGVyaW5nIGFzIGEgY2hhcnQgaW5cbiAgICAgICAgdGhlIHVzZXIncyB2aWV3LiBQYXNzIGEgdGl0bGUsIHRoZSByYXcgcm93cyAoYXJyYXkgb2Ygb2JqZWN0c1xuICAgICAgICBrZXllZCBieSBjb2x1bW4gbmFtZSksIGFuZCBhbiBvcHRpb25hbCBvbmUtbGluZSBkZXNjcmlwdGlvblxuICAgICAgICBvZiB0aGUgaW5zaWdodCB0byBoaWdobGlnaHQuIFJldHVybnMgYSBzaG9ydCBcXGBjaGFydElkXFxgO1xuICAgICAgICB0aGUgY2hhcnQgcmVuZGVycyBpbmxpbmUgYXQgdGhlIHBvc2l0aW9uIHlvdSBlbWJlZCB0aGVcbiAgICAgICAgbWF0Y2hpbmcgXFxgW2NoYXJ0OjxjaGFydElkPl1cXGAgbWFya2VyLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgUGxhY2VtZW50IGNvbnRyYWN0OiBlbWJlZCBcXGBbY2hhcnQ6PGNoYXJ0SWQ+XVxcYCBvbiBpdHMgb3duXG4gICAgICAgIGxpbmUgKGJsYW5rIGxpbmVzIGFib3ZlIGFuZCBiZWxvdykgd2hlcmV2ZXIgeW91IHdhbnQgdGhlXG4gICAgICAgIGNoYXJ0IHRvIGFwcGVhciBpbiB5b3VyIHJlcGx5LiBUaGUgY2hhcnQgcmVzb2x2ZXNcbiAgICAgICAgYXN5bmNocm9ub3VzbHkgLSB0aGUgdG9vbCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2hhcnQgZnJvbSB0aGUgY2FjaGUgb25jZSB0aGUgcGxhbm5lclxuICAgICAgICBsYW5kcy4gWW91IGNhbiBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIG11bHRpcGxlIHRpbWVzIGluIHRoZVxuICAgICAgICBzYW1lIHR1cm4gKHRoZSB0b29sIGlzIHBhcmFsbGVsLXNhZmUpIGFuZCBpbnRlcmxlYXZlIHRoZVxuICAgICAgICBtYXJrZXJzIHdpdGggcHJvc2Ugc28gZWFjaCBjaGFydCBzaXRzIG5leHQgdG8gaXRzXG4gICAgICAgIGNvbW1lbnRhcnkuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2Ugd2hlbmV2ZXIgYSBTUUwgcm93IHNldCwgQVBJIHJlc3BvbnNlLCBvciBoYW5kLWJ1aWx0XG4gICAgICAgIGRhdGFzZXQgd291bGQgbGFuZCBiZXR0ZXIgYXMgYSBwaWN0dXJlIHRoYW4gYXMgYSBsaXN0IG9yXG4gICAgICAgIHRhYmxlLiBDYXAgaW5wdXQgYXQgYSBmZXcgaHVuZHJlZCByb3dzOyBzYW1wbGUgb3IgYWdncmVnYXRlXG4gICAgICAgIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiB3aXJlLkNoYXJ0U2NoZW1hLnBpY2soeyBjaGFydElkOiB0cnVlIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgZGF0YSB9ID0gaW5wdXQgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdDtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyB7IHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQgfSB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBwcmVwYXJlQ2hhcnQoe1xuICAgICAgICBjb25maWcsXG4gICAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KGN0eD8ucmVxdWVzdENvbnRleHQpLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICByZXNvbHZlRGF0YTogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHsgcm93czogZGF0YSB9KSxcbiAgICAgICAgLi4uKGN0eD8ucmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0OiBjdHgucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|
|
1021
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBcUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBZ0MsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE9BQU8sRUFBRSxjQUFjLEVBQTJCLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyw2RUFBNkU7QUFFN0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXBDLHNEQUFzRDtBQUN0RCxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxtRUFBbUU7QUFDbkUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUM7QUFFeEMsdURBQXVEO0FBQ3ZELE1BQU0seUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBRXRDLG9FQUFvRTtBQUNwRSxNQUFNLG9CQUFvQixH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QVVDO1lBQ0Q7Ozs7O09BS0M7U0FDRixDQUFDO1FBQ0YsV0FBVyxFQUFFLHlCQUF5QjtRQUN0QyxZQUFZLEVBQUUscUJBQXFCO1FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQTRCLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBeUQsQ0FBQztZQUN0RSxPQUFPLFlBQVksQ0FBQztnQkFDbEIsTUFBTTtnQkFDTixPQUFPLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUM7Z0JBQzVDLEtBQUs7Z0JBQ0wsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3ZFLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaGFydCBwbGFubmVyICsgY2hhcnQgY2FjaGUuXG4gKlxuICogU2VsZi1jb250YWluZWQgY2hhcnQgc3Vic3lzdGVtIHdpdGggdHdvIGxheWVyczpcbiAqXG4gKiAgIDEuIElubmVyIHBsYW5uZXIgYWdlbnQgKHByaXZhdGUpLiBQdXJlIGRhdGFzZXQtaW4gL1xuICogICAgICBgRUNoYXJ0c09wdGlvbmAtb3V0IGJyYWluLiBEcml2ZW4gYnkge0BsaW5rIHByZXBhcmVDaGFydH07XG4gKiAgICAgIGNhbGxlcnMgbmV2ZXIgaW5zdGFudGlhdGUgaXQgZGlyZWN0bHkuXG4gKiAgIDIuIHtAbGluayBwcmVwYXJlQ2hhcnR9OiBvcmNoZXN0cmF0aW9uIG9uIHRvcCBvZiB0aGUgcGxhbm5lci5cbiAqICAgICAgTWludHMgYSBgY2hhcnRJZGAsIGNhY2hlcyBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHJlY29yZFxuICogICAgICBzeW5jaHJvbm91c2x5LCB0aGVuIHJlc29sdmVzIHRoZSBkYXRhc2V0IGFuZCBydW5zIHRoZVxuICogICAgICBwbGFubmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGUgdGVybWluYWwgZW50cnkgc2V0dGxlcyB3aXRoXG4gKiAgICAgIGVpdGhlciBgcmVzdWx0YCAoc3VjY2Vzcykgb3IgYGVycm9yYCAoZmFpbHVyZSkuIEJvdGhcbiAqICAgICAgdW5kZWZpbmVkIG1lYW5zIHRoZSBlbnRyeSBpcyBzdGlsbCBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBjYWNoZSBzdXJmYWNlICh7QGxpbmsgZmV0Y2hDaGFydH0pIGlzIHRoZSBvbmx5IHN0YXRlIHRoZVxuICogSFRUUCByb3V0ZSBhbmQgdGhlIGNoYXJ0LXByb2R1Y2luZyB0b29scyBzaGFyZS4gYHByZXBhcmVDaGFydGBcbiAqIGlzIGRhdGFzZXQtYWdub3N0aWMgLSBjYWxsZXJzIHN1cHBseSBhIGByZXNvbHZlRGF0YWAgY2FsbGJhY2tcbiAqIHRoYXQgZmV0Y2hlcyB0aGUgcm93cyBob3dldmVyIHRoZXkgbGlrZSAoR2VuaWUgc3RhdGVtZW50LCBpbmxpbmVcbiAqIGRhdGFzZXQsIGN1c3RvbSBBUEkpLiBUaGUgbW9kdWxlIGhhcyBubyBrbm93bGVkZ2Ugb2YgR2VuaWUgb3JcbiAqIHN0YXRlbWVudCBpZHM7IHRob3NlIGNvbmNlcm5zIGxpdmUgaW4gdGhlIHRvb2xzIHRoYXQgd3JhcCBpdC5cbiAqXG4gKiBXaXJlLWZvcm1hdCBzY2hlbWFzIGxpdmUgaW4gYEBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYWAgc29cbiAqIHRoZSBkZW1vIGNsaWVudCBhbmQgYW55IG90aGVyIFVJIGNvbnN1bWVyIHNoYXJlIHRoZSBleGFjdCBzYW1lXG4gKiBzaGFwZSB0aGlzIG1vZHVsZSByZWFkcyBhbmQgd3JpdGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBBcHBLaXRFcnJvciwgQ2FjaGVNYW5hZ2VyLCBFeGVjdXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFzeW5jLCBlcnJvciwgaGFzaCwganNvbiwgbG9nLCBzdHJpbmcsIHR5cGUgQnJhbmRDb250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG1hcmtlciwgd2lyZSwgdHlwZSBDaGFydCwgdHlwZSBDaGFydFJlc3VsdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IG1vZGVsIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IHJlc29sdmVVc2VyS2V5LCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgYnVpbGRNb2RlbCB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvY2hhcnRcIik7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVFRMIGZvciBjYWNoZWQgY2hhcnQgZW50cmllcy4gT25lIGhvdXIgYmFsYW5jZXMgXCJsb25nIGVub3VnaCBmb3JcbiAqIHRoZSBob3N0IFVJIHRvIGZldGNoIHRoZSBjaGFydCB3ZWxsIGFmdGVyIHRoZSBtb2RlbCBmaW5pc2hlZFxuICogdGFsa2luZ1wiIGFnYWluc3QgXCJzaG9ydCBlbm91Z2ggdGhhdCBhYmFuZG9uZWQgY2hhcnQgaWRzIGRvbid0XG4gKiBwaW4gc3RvcmFnZVwiLiBNYXRjaGVzIHRoZSB0eXBpY2FsIERhdGFicmlja3MgT0JPIHRva2VuIGxpZmV0aW1lXG4gKiBzbyBhbnkgZGF0YSByZS1yZXNvbHV0aW9uIHN0YXlzIGluc2lkZSB0aGUgb3JpZ2luYWwgYXV0aCB3aW5kb3cuXG4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX1RUTF9TRUMgPSA2MCAqIDYwO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlOyBrZWVwcyB0aGUgY2hhcnQga2V5c3BhY2UgdGlkeS4gKi9cbmNvbnN0IENIQVJUX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmNoYXJ0XCI7XG5cbi8qKiBEZWZhdWx0IHNlcnZlci1zaWRlIGxvbmctcG9sbCBidWRnZXQgZm9yIHtAbGluayBmZXRjaENoYXJ0fS4gKi9cbmNvbnN0IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIERlZmF1bHQgaW50ZXItcG9sbCBzbGVlcCBmb3Ige0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuY29uc3QgREVGQVVMVF9GRVRDSF9JTlRFUlZBTF9NUyA9IDI1MDtcblxuLyoqIFN0YWJsZSB0ZXh0IHN0b3JlZCBvbiBhIGNoYXJ0IGVudHJ5IHdob3NlIHBsYW5uZXIgcnVuIGZhaWxlZC4gKi9cbmNvbnN0IENIQVJUX0ZBSUxFRF9NRVNTQUdFID0gXCJDaGFydCBnZW5lcmF0aW9uIGZhaWxlZFwiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjaGVtYXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE9uZSBzZXJpZXMgZGF0YSBwb2ludC4gV2lkZSB2YXJpYW50IHNldCBzbyB0aGUgcGxhbm5lciBhZ2VudCBjYW5cbiAqIGZhaXRoZnVsbHkgcGFzcyB0aHJvdWdoIHdoYXRldmVyIHRoZSBTUUwgcm93IHNldCBjb250YWluZWRcbiAqIChudW1iZXJzLCBzdHJpbmdpZmllZCBudW1iZXJzLCBudWxscyBmb3IgbWlzc2luZyBtZWFzdXJlbWVudHMsXG4gKiBgW3gsIHldYCB0dXBsZXMgZm9yIHNjYXR0ZXIsIGBbeCwgeSwgdmFsdWVdYCB0cmlwbGVzIGZvciBoZWF0bWFwLFxuICogYHtuYW1lLCB2YWx1ZX1gIHNsaWNlcyBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCkgd2l0aG91dCB0aGVcbiAqIHN0cnVjdHVyZWQtb3V0cHV0IGd1YXJkIHJlamVjdGluZyB0aGUgd2hvbGUgcGxhbi5cbiAqXG4gKiBUaHJlZSBsYXllcnMgb2YgdG9sZXJhbmNlOlxuICpcbiAqICAgMS4ge0BsaW5rIHoucHJlcHJvY2Vzc30gbm9ybWFsaXplcyB3aXJlIHNoYXBlcyBCRUZPUkUgdW5pb25cbiAqICAgICAgZGlzcGF0Y2g6IHN0cmluZ2lmaWVkIG51bWJlcnMgcGFyc2UgdG8gbnVtYmVycywgZmluaXRlXG4gKiAgICAgIGNoZWNrcyByZWplY3QgYE5hTmAgLyBgSW5maW5pdHlgLCAyLS8zLWVsZW1lbnQgYXJyYXlzIGNvZXJjZVxuICogICAgICB0dXBsZSBjb21wb25lbnRzLCBhbmQgYHt2YWx1ZX1gIG9iamVjdHMgd2l0aCBtaXNzaW5nIC9cbiAqICAgICAgc3RyaW5naWZpZWQgYHZhbHVlYCBnZXQgY29lcmNlZCBvciByZWplY3RlZCB1bmlmb3JtbHkuXG4gKiAgICAgIEFueXRoaW5nIG5vdCBoYW5kbGVhYmxlIGJlY29tZXMgYG51bGxgLlxuICogICAyLiBUaGUgdW5pb24gYWNjZXB0cyBgbnVsbGAgYXMgYSBmaXJzdC1jbGFzcyB2YXJpYW50LiBFY2hhcnRzXG4gKiAgICAgIHJlbmRlcnMgbnVsbCBhcyBhIGdhcCBvbiBiYXIgLyBsaW5lIC8gYXJlYSAod2hpY2ggaXMgdGhlXG4gKiAgICAgIHJpZ2h0IHZpc3VhbCBzaWduYWwgZm9yIFwibWlzc2luZyByZWFkaW5nXCIpLiBTY2F0dGVyLCBoZWF0bWFwLFxuICogICAgICBhbmQgc2xpY2UgY2hhcnRzIGZpbHRlciBudWxscyBpbiB7QGxpbmsgcGxhblRvRWNoYXJ0c09wdGlvbn1cbiAqICAgICAgYmVjYXVzZSBFY2hhcnRzIGNyYXNoZXMgb24gbnVsbCB0dXBsZXMgLyBzbGljZXMuXG4gKiAgIDMuIHtAbGluayB6LnVuaW9uI2NhdGNofSBiYWNrc3RvcHMgdGhlIHdob2xlIHRoaW5nOiBpZlxuICogICAgICBwcmVwcm9jZXNzIHNvbWVob3cgcHJvZHVjZXMgYSBzaGFwZSB0aGF0IHN0aWxsIGRvZXNuJ3RcbiAqICAgICAgbWF0Y2ggYW55IHZhcmlhbnQsIHRoZSBiYWQgaXRlbSBiZWNvbWVzIGBudWxsYCBpbnN0ZWFkIG9mXG4gKiAgICAgIHRha2luZyBkb3duIHRoZSBlbnRpcmUgY2hhcnQgd2l0aCBhXG4gKiAgICAgIGBTdHJ1Y3R1cmVkIG91dHB1dCB2YWxpZGF0aW9uIGZhaWxlZGAgZXJyb3IuXG4gKi9cbmNvbnN0IGNoYXJ0RGF0YVBvaW50U2NoZW1hID0gelxuICAucHJlcHJvY2VzcyhcbiAgICAodikgPT4ge1xuICAgICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2KSA/IHYgOiBudWxsO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IG4gPSBOdW1iZXIodik7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIFNjYXR0ZXIgYFt4LCB5XWAgb3IgaGVhdG1hcCBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gLiBDb2VyY2VcbiAgICAgIC8vIHN0cmluZ2lmaWVkIGNvbXBvbmVudHM7IHJlamVjdCBpZiBhbnkgY29tcG9uZW50IGlzIG5vbi1maW5pdGUuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSAmJiAodi5sZW5ndGggPT09IDIgfHwgdi5sZW5ndGggPT09IDMpKSB7XG4gICAgICAgIGNvbnN0IG51bXMgPSB2Lm1hcCgoYykgPT4gKHR5cGVvZiBjID09PSBcIm51bWJlclwiID8gYyA6IE51bWJlcihjKSkpO1xuICAgICAgICByZXR1cm4gbnVtcy5ldmVyeSgobikgPT4gTnVtYmVyLmlzRmluaXRlKG4pKSA/IG51bXMgOiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgXCJ2YWx1ZVwiIGluIHYpIHtcbiAgICAgICAgY29uc3Qgb2JqID0gdiBhcyB7IG5hbWU/OiB1bmtub3duOyB2YWx1ZTogdW5rbm93biB9O1xuICAgICAgICBjb25zdCB2YWwgPSB0eXBlb2Ygb2JqLnZhbHVlID09PSBcIm51bWJlclwiID8gb2JqLnZhbHVlIDogTnVtYmVyKG9iai52YWx1ZSk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBDb2VyY2UgbnVtZXJpYyAvIGJvb2xlYW4gLyBudWxsaXNoIG5hbWVzIHRvIHN0cmluZ3Mgc28gYVxuICAgICAgICAvLyBwaWUgc2xpY2Uga2V5ZWQgb24gYSB5ZWFyIChgMjAyNGApIG9yIGNhdGVnb3J5IGlkIGlzXG4gICAgICAgIC8vIGFjY2VwdGVkIHdpdGhvdXQgcm91bmQtdHJpcHBpbmcgdGhyb3VnaCB0aGUgY2F0Y2ggYXJtLlxuICAgICAgICBjb25zdCByYXdOYW1lID0gb2JqLm5hbWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcmF3TmFtZSA9PT0gXCJzdHJpbmdcIiA/IHJhd05hbWUgOiByYXdOYW1lID09IG51bGwgPyBcIlwiIDogU3RyaW5nKHJhd05hbWUpO1xuICAgICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZTogdmFsIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHoudW5pb24oW1xuICAgICAgei5udW1iZXIoKSxcbiAgICAgIHoubnVsbCgpLFxuICAgICAgLy8gYFt4LCB5XWAgc2NhdHRlciBvciBgW3gsIHksIHZhbHVlXWAgaGVhdG1hcCBjZWxsLiBNb2RlbGxlZCBhcyBhXG4gICAgICAvLyBsZW5ndGgtY29uc3RyYWluZWQgaG9tb2dlbmVvdXMgYXJyYXkgcmF0aGVyIHRoYW4gYHoudHVwbGVgOlxuICAgICAgLy8gWm9kIGVtaXRzIGEgdHVwbGUgYXMgSlNPTiBTY2hlbWEgMjAyMC0xMiBgcHJlZml4SXRlbXNgLCBhbmRcbiAgICAgIC8vIERhdGFicmlja3MnIEdlbWluaSBlbmRwb2ludHMgcmVqZWN0IGEgYHJlc3BvbnNlX2pzb25fc2NoZW1hYFxuICAgICAgLy8gY29udGFpbmluZyBpdCAoXCJtdXN0IGJlIGEgYm9vbGVhbiBvciBhbiBvYmplY3RcIiwgc2luY2VcbiAgICAgIC8vIGBpdGVtc2AgaXMgYWJzZW50KS4gYG1pbkl0ZW1zYCAvIGBtYXhJdGVtc2AgKyBgaXRlbXNgIGlzIHdoYXRcbiAgICAgIC8vIGV2ZXJ5IHByb3ZpZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgei5hcnJheSh6Lm51bWJlcigpKS5taW4oMikubWF4KDMpLFxuICAgICAgei5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpLCB2YWx1ZTogei5udW1iZXIoKSB9KSxcbiAgICBdKSxcbiAgKVxuICAuY2F0Y2gobnVsbCk7XG5cbi8qKiBQZXItc2VyaWVzIG1hcmsgdHlwZSB1c2VkIGJ5IGBjb21ib2AgY2hhcnRzIChiYXIgKyBsaW5lIG92ZXJsYXkpLiAqL1xuY29uc3Qgc2VyaWVzTWFya1R5cGVTY2hlbWEgPSB6XG4gIC51bmlvbihbei5saXRlcmFsKFwiYmFyXCIpLCB6LmxpdGVyYWwoXCJsaW5lXCIpLCB6LmxpdGVyYWwoXCJhcmVhXCIpXSlcbiAgLmRlc2NyaWJlKFxuICAgIFwiTWFyayB0eXBlIGZvciB0aGlzIHNlcmllcy4gUmVxdWlyZWQgZm9yIGBjb21ib2AgKG1peCBiYXIgYW5kIGxpbmUvYXJlYSk7IGlnbm9yZWQgZm9yIG90aGVyIGNoYXJ0IHR5cGVzLlwiLFxuICApO1xuXG4vKipcbiAqIENvbXBhY3QsIG1vZGVsLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIGFuIEVjaGFydHMgc3BlYy4gVGhlXG4gKiBwbGFubmVyIGFnZW50IGVtaXRzIHRoaXM7IHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufSBleHBhbmRzIGl0XG4gKiBpbnRvIGEgcmVhbCBgRUNoYXJ0c09wdGlvbmAgSlNPTi4gVHdvIGxheWVycyBiZWNhdXNlIGxldHRpbmcgdGhlXG4gKiBtb2RlbCBmaWxsIGluIGEgZnVsbHktdHlwZWQgYEVDaGFydHNPcHRpb25gIGlzIGJyaXR0bGUgKGh1bmRyZWRzXG4gKiBvZiBvcHRpb25hbCBmaWVsZHMsIGRlZXAgdW5pb25zLCB2ZXJzaW9uLWRlcGVuZGVudCBzaGFwZXMpLiBBXG4gKiBzbWFsbCBcImNoYXJ0IHBsYW5cIiBzY2hlbWEgaXMgbXVjaCBtb3JlIHJlbGlhYmxlIGZvciBhIGZhc3QgbW9kZWxcbiAqIGFuZCBrZWVwcyBhbmltYXRpb24gLyB0b29sdGlwIC8gc3R5bGluZyBkZWZhdWx0cyBjb25zaXN0ZW50XG4gKiBhY3Jvc3MgY2hhcnRzLlxuICovXG5leHBvcnQgY29uc3QgY2hhcnRQbGFuU2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydFR5cGU6IHdpcmUuQ2hhcnRUeXBlU2NoZW1hLFxuICB0aXRsZTogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBTaG9ydCB0aXRsZSBzaG93biBhYm92ZSB0aGUgY2hhcnQuIE9wdGlvbmFsOyBkZWZhdWx0cyB0byB0aGVcbiAgICAgICAgXFxgdGl0bGVcXGAgYXJndW1lbnQgdGhlIGNhbGxlciBwYXNzZWQgaW4uXG4gICAgICBgKSxcbiAgICApLFxuICB4QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBwcmltYXJ5ICh1c3VhbGx5IGJvdHRvbSAvIHZhbHVlKSBheGlzLlxuICAgICAgICBVc2VkIGZvciBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbFxuICAgICAgICAvIHNjYXR0ZXIgLyBoZWF0bWFwOyBpZ25vcmVkIGZvciBwaWUgLyBmdW5uZWwgLyB0cmVlbWFwIC8gcmFkYXIuXG4gICAgICBgKSxcbiAgICApLFxuICB5QXhpc0xhYmVsOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIEF4aXMgbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgKHVzdWFsbHkgbGVmdCkgYXhpcy4gVXNlZCBmb3JcbiAgICAgICAgYmFyIC8gaG9yaXpvbnRhbEJhciAvIGxpbmUgLyBhcmVhIC8gY29tYm8gLyB3YXRlcmZhbGwgL1xuICAgICAgICBzY2F0dGVyIC8gaGVhdG1hcDsgaWdub3JlZCBmb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcCAvIHJhZGFyLlxuICAgICAgYCksXG4gICAgKSxcbiAgY2F0ZWdvcmllczogelxuICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBQcmltYXJ5IGNhdGVnb3J5IGxhYmVscy4gRm9yIFxcYGJhclxcYCAvIFxcYGhvcml6b250YWxCYXJcXGAgL1xuICAgICAgICBcXGBsaW5lXFxgIC8gXFxgYXJlYVxcYCAvIFxcYGNvbWJvXFxgIC8gXFxgd2F0ZXJmYWxsXFxgOiBvbmUgbGFiZWwgcGVyXG4gICAgICAgIGRhdGEgcG9pbnQuIEZvciBcXGBoZWF0bWFwXFxgOiB4LWF4aXMgY2F0ZWdvcmllcy4gRm9yIFxcYHJhZGFyXFxgOlxuICAgICAgICBpbmRpY2F0b3IgbmFtZXMuIE9taXQgZm9yIFxcYHNjYXR0ZXJcXGAgKFxcYFt4LCB5XVxcYCB0dXBsZXMpIGFuZFxuICAgICAgICBzbGljZSBjaGFydHMgKFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvIFxcYHRyZWVtYXBcXGAsIGVhY2ggc2xpY2VcbiAgICAgICAgY2FycmllcyBpdHMgb3duIFxcYG5hbWVcXGApLlxuICAgICAgYCksXG4gICAgKSxcbiAgeUNhdGVnb3JpZXM6IHpcbiAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgWS1heGlzIChyb3cpIGxhYmVscyBmb3IgXFxgaGVhdG1hcFxcYC4gT3B0aW9uYWwgLSB3aGVuIG9taXR0ZWQgdGhlXG4gICAgICAgIHJvdyBsYWJlbHMgY29tZSBmcm9tIHRoZSBzZXJpZXMgbmFtZXMsIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWRcbiAgICAgICAgd2F5IHRvIGJ1aWxkIGEgaGVhdG1hcC4gT21pdCBmb3IgZXZlcnkgb3RoZXIgY2hhcnQgdHlwZS5cbiAgICAgIGApLFxuICAgICksXG4gIHNlcmllczogelxuICAgIC5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgbmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBMZWdlbmQgbmFtZSBmb3IgdGhpcyBzZXJpZXMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICAgIHR5cGU6IHNlcmllc01hcmtUeXBlU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgICAgIHlBeGlzSW5kZXg6IHpcbiAgICAgICAgICAudW5pb24oW3oubGl0ZXJhbCgwKSwgei5saXRlcmFsKDEpXSlcbiAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFwiV2hpY2ggeS1heGlzIHRvIGJpbmQgKDAgPSBsZWZ0LCAxID0gcmlnaHQpLiBVc2Ugb24gYGNvbWJvYCB3aGVuIHNlcmllcyBoYXZlIGRpZmZlcmVudCB1bml0cyBvciBzY2FsZXMuXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgZGF0YTogei5hcnJheShjaGFydERhdGFQb2ludFNjaGVtYSkuZGVzY3JpYmUoXG4gICAgICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICAgICAgRGF0YSBwb2ludHMuIEZvciBjYXRlZ29yeSBjaGFydHMgKFxcYGJhclxcYCAvIFxcYGhvcml6b250YWxCYXJcXGBcbiAgICAgICAgICAgIC8gXFxgbGluZVxcYCAvIFxcYGFyZWFcXGAgLyBcXGBjb21ib1xcYCAvIFxcYHdhdGVyZmFsbFxcYCAvIFxcYHJhZGFyXFxgKSxcbiAgICAgICAgICAgIGFuIGFycmF5IG9mIG51bWJlcnMgYWxpZ25lZCB0byBcXGBjYXRlZ29yaWVzXFxgOyBmb3JcbiAgICAgICAgICAgIFxcYHdhdGVyZmFsbFxcYCB0aG9zZSBudW1iZXJzIGFyZSBzaWduZWQgZGVsdGFzIChvbmUgc2VyaWVzXG4gICAgICAgICAgICBvbmx5IC0gbmV2ZXIgYSBjdW11bGF0aXZlIGJhc2Ugc2VyaWVzKS4gRm9yIFxcYGhlYXRtYXBcXGAsXG4gICAgICAgICAgICBvbmUgc2VyaWVzIHBlciBtYXRyaXggcm93LCBob2xkaW5nIHRoYXQgcm93J3MgbnVtYmVyc1xuICAgICAgICAgICAgYWxpZ25lZCB0byBcXGBjYXRlZ29yaWVzXFxgLiBGb3IgXFxgc2NhdHRlclxcYCwgYW4gYXJyYXkgb2ZcbiAgICAgICAgICAgIFxcYFt4LCB5XVxcYCBudW1lcmljIHR1cGxlcy4gRm9yIFxcYHBpZVxcYCAvIFxcYGZ1bm5lbFxcYCAvXG4gICAgICAgICAgICBcXGB0cmVlbWFwXFxgLCBhbiBhcnJheSBvZiBcXGB7bmFtZSwgdmFsdWV9XFxgIG9iamVjdHMuXG4gICAgICAgICAgYCksXG4gICAgICAgICksXG4gICAgICB9KSxcbiAgICApXG4gICAgLmRlZmF1bHQoW10pXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUgb3IgbW9yZSBzZXJpZXMgdG8gcGxvdC4gUmVxdWlyZWQgZm9yIGV2ZXJ5IGNoYXJ0IHR5cGVcbiAgICAgICAgZXhjZXB0IFxcYGN1c3RvbVxcYCwgd2hpY2ggY2FycmllcyBpdHMgc2VyaWVzIGluc2lkZSBcXGBvcHRpb25cXGAuXG4gICAgICAgIFNsaWNlIGNoYXJ0cyAoXFxgcGllXFxgIC8gXFxgZnVubmVsXFxgIC8gXFxgdHJlZW1hcFxcYCkgYW5kXG4gICAgICAgIFxcYHdhdGVyZmFsbFxcYCAvIFxcYGhlYXRtYXBcXGAgdXNlIGV4YWN0bHkgb25lIHNlcmllczsgXFxgYmFyXFxgIC9cbiAgICAgICAgXFxgbGluZVxcYCAvIFxcYGFyZWFcXGAgLyBcXGBjb21ib1xcYCAvIFxcYHJhZGFyXFxgIC8gXFxgc2NhdHRlclxcYCBjYW5cbiAgICAgICAgY2FycnkgbXVsdGlwbGUgc2VyaWVzLlxuICAgICAgYCksXG4gICAgKSxcbiAgb3B0aW9uOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIFJlcXVpcmVkIGZvciBcXGBjdXN0b21cXGAsIGlnbm9yZWQgZm9yIGV2ZXJ5IG90aGVyIGNoYXJ0IHR5cGUuIEFcbiAgICAgICAgQ09NUExFVEUgRWNoYXJ0cyBvcHRpb24sIGFzIGEgSlNPTiBvYmplY3QgZW5jb2RlZCBpbiBhIHN0cmluZzpcbiAgICAgICAgXFxgc2VyaWVzXFxgIChlYWNoIHdpdGggaXRzIG93biBcXGB0eXBlXFxgIGFuZCB0aGF0IHNlcmllcycgb3duIGRhdGFcbiAgICAgICAgc2hhcGUpIHBsdXMgd2hhdGV2ZXIgZWxzZSB0aGUgY2hhcnQgbmVlZHMgLSBhIGNvb3JkaW5hdGUgc3lzdGVtLFxuICAgICAgICBcXGB2aXN1YWxNYXBcXGAsIGF4ZXMuIFBsYWluIEpTT04gdmFsdWVzIG9ubHksIG5ldmVyIGEgSmF2YVNjcmlwdFxuICAgICAgICBmdW5jdGlvbi4gQSBjZW50ZXJlZCB0aXRsZSBpcyBmaWxsZWQgaW4gd2hlbiB0aGUgb2JqZWN0IG9taXRzXG4gICAgICAgIG9uZS5cbiAgICAgIGApLFxuICAgICksXG59KTtcblxudHlwZSBDaGFydFBsYW4gPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5TY2hlbWE+O1xuXG4vKipcbiAqIENhbm9uaWNhbCBwbGFubmVyIGlucHV0IHNoYXBlLiBUb29scyB0aGF0IHNvdXJjZSByb3dzIGZyb20gYW5cbiAqIGlubGluZSBkYXRhc2V0IChgcmVuZGVyX2RhdGFgKSB1c2UgaXQgYXMgdGhlaXIgYGlucHV0U2NoZW1hYFxuICogdmVyYmF0aW07IHRvb2xzIHRoYXQgcmVzb2x2ZSByb3dzIGZyb20gYSByZW1vdGUgKGBwcmVwYXJlX2NoYXJ0YFxuICogb3ZlciBhIEdlbmllIHN0YXRlbWVudCkgYG9taXQoeyBkYXRhIH0pYCBhbmQgYGV4dGVuZGAgd2l0aCB0aGVpclxuICogb3duIGlkZW50aWZpZXIgZmllbGQsIHNvIHRoZSBmaWVsZC1sZXZlbCBgLmRlc2NyaWJlKClgIHRleHRcbiAqIHN0YXlzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aC4gU2VydmVyLW9ubHkgLSB0aGUgVUkgbmV2ZXJcbiAqIHNlZXMgYSBwbGFubmVyIHJlcXVlc3QsIG9ubHkgdGhlIHJlc29sdmVkIHtAbGluayBDaGFydH0uXG4gKi9cbmV4cG9ydCBjb25zdCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hID0gei5vYmplY3Qoe1xuICB0aXRsZTogei5zdHJpbmcoKS5kZXNjcmliZShcbiAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgIENvbmNpc2UgdGl0bGUgc2hvd24gYWJvdmUgdGhlIGNoYXJ0IChlLmcuIFwiVG9wIDEwIFNLVXMgYnkgUmV2ZW51ZVwiKS5cbiAgICAgIGApLFxuICApLFxuICBkZXNjcmlwdGlvbjogelxuICAgIC5zdHJpbmcoKVxuICAgIC5vcHRpb25hbCgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBPbmUtbGluZSBpbnRlbnQgdGhlIGNoYXJ0LXBsYW5uZXIgdXNlcyB3aGVuIHBpY2tpbmcgYSBjaGFydCB0eXBlXG4gICAgICAgIGFuZCBheGlzIGVuY29kaW5ncyAoZS5nLiBcImNvbXBhcmUgcXVhcnRlcmx5IHJldmVudWUgYWNyb3NzXG4gICAgICAgIHJlZ2lvbnNcIiwgXCJoaWdobGlnaHQgdGhlIHN0ZWVwIGRyb3AgYWZ0ZXIgcG9zaXRpb24gNVwiKS4gTm90IHNob3duXG4gICAgICAgIHRvIHRoZSB1c2VyLlxuICAgICAgYCksXG4gICAgKSxcbiAgZGF0YTogelxuICAgIC5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpXG4gICAgLm5vbmVtcHR5KFwiRGF0YSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHJvd1wiKVxuICAgIC5yZWFkb25seSgpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgICBUYWJ1bGFyIGRhdGFzZXQgdG8gY2hhcnQuIE9uZSBvYmplY3QgcGVyIHJvdywga2V5ZWQgYnkgY29sdW1uXG4gICAgICAgIG5hbWUuIFZhbHVlcyBtYXkgYmUgc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMsIG9yIG51bGwuIFRoZVxuICAgICAgICBjaGFydC1wbGFubmVyIGRlY2lkZXMgd2hpY2ggY29sdW1ucyBhcmUgY2F0ZWdvcmllcyB2cy4gbnVtZXJpY1xuICAgICAgICBzZXJpZXMuIENhcCBhdCBhIGZldyBodW5kcmVkIHJvd3MgZm9yIGxlZ2liaWxpdHk7IHNhbXBsZSAvXG4gICAgICAgIGFnZ3JlZ2F0ZSBsYXJnZXIgZGF0YXNldHMgZmlyc3QuXG4gICAgICBgKSxcbiAgICApLFxufSk7XG5cbmV4cG9ydCB0eXBlIENoYXJ0UGxhbm5lclJlcXVlc3QgPSB6LmluZmVyPHR5cGVvZiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hPjtcblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgcmVzdWx0IG9mIGVpdGhlciBjaGFydC1wcm9kdWNpbmcgdG9vbC5cbiAqXG4gKiBgbWFya2VyYCBpcyBkZWxpYmVyYXRlbHkgcmVkdW5kYW50IHdpdGggYGNoYXJ0SWRgOiB0aGUgaG9zdCBzdGlsbCBrZXlzIHRoZVxuICogY2FjaGUgYnkgaWQsIHdoaWxlIHRoZSBtb2RlbCBnZXRzIHRoZSBleGFjdCBvcGFxdWUgdG9rZW4gdG8gY29weSBpbnRvIHByb3NlXG4gKiBhbmQgaGFzIG5vIHJlYXNvbiB0byBpbnZlbnQgb3IgcmV0eXBlIGEgVVVJRC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSA9IHdpcmUuQ2hhcnRTY2hlbWEucGljayh7IGNoYXJ0SWQ6IHRydWUgfSkuZXh0ZW5kKHtcbiAgbWFya2VyOiB6XG4gICAgLnN0cmluZygpXG4gICAgLmRlc2NyaWJlKFxuICAgICAgXCJFeGFjdCBlbWJlZCBtYXJrZXIuIENvcHkgdGhpcyBjb21wbGV0ZSB2YWx1ZSB2ZXJiYXRpbSBvbnRvIGl0cyBvd24gbGluZTsgbmV2ZXIgY29uc3RydWN0IGEgbWFya2VyIGZyb20gY2hhcnRJZC5cIixcbiAgICApLFxufSk7XG5cbi8qKiBSZXN1bHQgcmV0dXJuZWQgc3luY2hyb25vdXNseSB3aGlsZSBjaGFydCBwbGFubmluZyBjb250aW51ZXMgaW4gdGhlIGJhY2tncm91bmQuICovXG5leHBvcnQgdHlwZSBDaGFydFRvb2xPdXRwdXQgPSB6LmluZmVyPHR5cGVvZiBjaGFydFRvb2xPdXRwdXRTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGxhbm5lciBpbnN0cnVjdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRm9ybWF0IHtAbGluayB3aXJlLkNoYXJ0VHlwZVNjaGVtYX0ncyB2YXJpYW50cyBhcyBhIHNpbmdsZVxuICogaHVtYW4tZnJpZW5kbHkgc3RyaW5nIG9mIGBgIGA8dmFsdWU+YCBmb3IgPGRlc2NyaXB0aW9uPiBgYFxuICogY2xhdXNlcyBqb2luZWQgYnkgc2VtaWNvbG9ucywgZHJhd24gZnJvbSBlYWNoIHZhcmlhbnQncyBvd25cbiAqIGAuZGVzY3JpYmUoKWAgc28gdGhlIHBsYW5uZXIgcHJvbXB0IHN0YXlzIGluIGxvY2stc3RlcCB3aXRoXG4gKiB0aGUgc2NoZW1hIGJ5IGNvbnN0cnVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0Q2hhcnRUeXBlUGlja2VyKCk6IHN0cmluZyB7XG4gIHJldHVybiB3aXJlLkNoYXJ0VHlwZVNjaGVtYS5vcHRpb25zXG4gICAgLm1hcCgob3B0KSA9PiBgXFxgJHtvcHQudmFsdWV9XFxgIGZvciAke29wdC5kZXNjcmlwdGlvbiA/PyBcIlwifWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbn1cblxuLyoqXG4gKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgaW5uZXIgY2hhcnQtcGxhbm5pbmcgYWdlbnQuIFR1bmVkIGZvciBhXG4gKiBmYXN0LXRpZXIgbW9kZWwgKEhhaWt1LCBHUFQtNS1taW5pLCBHZW1pbmkgRmxhc2ggTGl0ZSkuXG4gKi9cbmNvbnN0IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICBZb3UgZGVzaWduIEFwYWNoZSBFY2hhcnRzIHZpc3VhbGl6YXRpb25zLiBUaGUgdXNlciBnaXZlcyB5b3UgYVxuICB0YWJ1bGFyIGRhdGFzZXQgKHJvd3Mgb2Ygb2JqZWN0cykgcGx1cyBhIHRpdGxlIGFuZCBhbiBvcHRpb25hbFxuICBkZXNjcmlwdGlvbiBvZiB0aGUgaW50ZW50LiBZb3UgcHJvZHVjZSBhIHNtYWxsIGNoYXJ0IHBsYW4gKGNoYXJ0XG4gIHR5cGUsIGF4aXMgbGFiZWxzLCBjYXRlZ29yaWVzLCBzZXJpZXMpIHRoYXQgYmVzdCBjb252ZXlzIHRoZSBkYXRhLlxuXG4gIERlY2lzaW9uIGd1aWRlLiBQaWNrIHRoZSBjaGFydCB0eXBlIHdob3NlIGRhdGEgc2hhcGUgbWF0Y2hlcyB0aGVcbiAgZGF0YXNldCBhbmQgdGhlIHVzZXIncyBpbnRlbnQ6ICR7Zm9ybWF0Q2hhcnRUeXBlUGlja2VyKCl9LlxuXG4gIFdoZW4gaW4gZG91YnQgYmV0d2VlbiBiYXIgYW5kIGxpbmUsIHByZWZlciBiYXIgZm9yIHVub3JkZXJlZFxuICBjYXRlZ29yaWVzIGFuZCBsaW5lIGZvciBvcmRlcmVkIG9uZXMgKGRhdGVzLCB0aW1lIGJ1Y2tldHMsIHJhbmtzKS5cbiAgUHJlZmVyIFxcYGhvcml6b250YWxCYXJcXGAgd2hlbiBjYXRlZ29yeSBsYWJlbHMgYXJlIGxvbmcuIFByZWZlclxuICBcXGBjb21ib1xcYCB3aGVuIG9uZSBtZWFzdXJlIGlzIGEgY291bnQvdm9sdW1lIGFuZCBhbm90aGVyIGlzIGFcbiAgcmF0ZS90cmVuZC4gUHJlZmVyIFxcYHdhdGVyZmFsbFxcYCBmb3IgYnJpZGdlcyBvZiBzaWduZWQgZGVsdGFzLlxuICBQcmVmZXIgXFxgc2NhdHRlclxcYCB3aGVuIGNvcnJlbGF0aW5nIHR3byBudW1lcmljIGZpZWxkcyAobm9cbiAgY2F0ZWdvcnkgYXhpcykuIFByZWZlciBcXGBoZWF0bWFwXFxgIGZvciBhIGNhdGVnb3J5IHggY2F0ZWdvcnlcbiAgbWF0cml4LiBQcmVmZXIgXFxgcmFkYXJcXGAgZm9yIHNjb3JpbmcgdGhlIHNhbWUgZW50aXRpZXMgYWNyb3NzIGFcbiAgZml4ZWQgc2V0IG9mIGRpbWVuc2lvbnMuIE5ldmVyIHBpY2sgcGllIGZvciBtb3JlIHRoYW4gNyBzbGljZXNcbiAgKHVzZSBcXGB0cmVlbWFwXFxgIGluc3RlYWQpLiBQcmVmZXIgXFxgZnVubmVsXFxgIGZvciBvcmRlcmVkIGNvbnZlcnNpb25cbiAgc3RhZ2VzLlxuXG4gIEZvciBiYXIgLyBob3Jpem9udGFsQmFyIC8gbGluZSAvIGFyZWEgLyBjb21ibyAvIHdhdGVyZmFsbDogcGljayBvbmVcbiAgY29sdW1uIGFzIHRoZSBjYXRlZ29yeSBheGlzICh1c3VhbGx5IHRoZSBvbmx5IHN0cmluZy12YWx1ZWQgY29sdW1uKVxuICBhbmQgb25lIG9yIG1vcmUgbnVtZXJpYyBjb2x1bW5zIGFzIHNlcmllcy4gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZVxuICBwcmltYXJ5IHNlcmllcyB2YWx1ZSBkZXNjZW5kaW5nIHVubGVzcyB0aGUgZGF0YSBpcyBuYXR1cmFsbHkgb3JkZXJlZFxuICAoZGF0ZXMsIHJhbmtzLCBmdW5uZWwgc3RhZ2VzLCB3YXRlcmZhbGwgc3RlcHMpLiBGb3IgXFxgY29tYm9cXGAsIHNldFxuICBlYWNoIHNlcmllcycgXFxgdHlwZVxcYCB0byBcXGBiYXJcXGAsIFxcYGxpbmVcXGAsIG9yIFxcYGFyZWFcXGAsIGFuZCB1c2VcbiAgXFxgeUF4aXNJbmRleDogMVxcYCB3aGVuIGEgc2VyaWVzIG5lZWRzIGEgc2Vjb25kIHNjYWxlLlxuXG4gIEZvciB3YXRlcmZhbGwsIGVtaXQgZXhhY3RseSBPTkUgc2VyaWVzIGhvbGRpbmcgdGhlIHNpZ25lZCBzdGVwIHZhbHVlc1xuICAoZGVsdGFzKSwgb25lIHBlciBjYXRlZ29yeSwgaW4gb3JkZXIgLSBwb3NpdGl2ZSBmb3IgYSByaXNlLCBuZWdhdGl2ZVxuICBmb3IgYSBkcm9wLiBEbyBOT1QgYWRkIGEgY3VtdWxhdGl2ZSAvIHJ1bm5pbmctdG90YWwgLyBiYXNlIHNlcmllcyBhbmRcbiAgZG8gTk9UIGNvbnZlcnQgdGhlIGRlbHRhcyBpbnRvIHJ1bm5pbmcgdG90YWxzIHlvdXJzZWxmOyB0aGUgcnVubmluZ1xuICB0b3RhbCBpcyBjb21wdXRlZCBmb3IgeW91LCBhbmQgYSBoYW5kLWJ1aWx0IGJhc2Ugc2VyaWVzIHJlbmRlcnMgYXMgYVxuICBwbGFpbiBiYXIgY2hhcnQgaW5zdGVhZCBvZiBhIGJyaWRnZS5cblxuICBGb3IgcGllIC8gZnVubmVsIC8gdHJlZW1hcDogcGljayB0aGUgY2F0ZWdvcnkgY29sdW1uIGZvciBzbGljZSBuYW1lc1xuICBhbmQgb25lIG51bWVyaWMgY29sdW1uIGZvciBzbGljZSB2YWx1ZXMuIEVtaXQgYSBzaW5nbGUgc2VyaWVzIG9mXG4gIFxcYHtuYW1lLCB2YWx1ZX1cXGAgb2JqZWN0cy5cblxuICBGb3Igc2NhdHRlcjogcGljayB0d28gbnVtZXJpYyBjb2x1bW5zIGFuZCBlbWl0IFxcYFt4LCB5XVxcYCB0dXBsZXMgaW5cbiAgb25lIG9yIG1vcmUgc2VyaWVzIChvbmUgc2VyaWVzIHBlciBncm91cCBpZiBhIGdyb3VwaW5nIGNvbHVtbiBleGlzdHMpLlxuXG4gIEZvciBoZWF0bWFwOiBwaWNrIHR3byBjYXRlZ29yeSBjb2x1bW5zIGFuZCBvbmUgbnVtZXJpYyBtZWFzdXJlLiBQdXRcbiAgdGhlIHgtYXhpcyBjYXRlZ29yaWVzIGluIFxcYGNhdGVnb3JpZXNcXGAsIHRoZW4gZW1pdCBPTkUgU0VSSUVTIFBFUiBST1dcbiAgb2YgdGhlIG1hdHJpeCAtIHRoZSBzZXJpZXMgXFxgbmFtZVxcYCBpcyB0aGUgcm93IGxhYmVsIGFuZCBcXGBkYXRhXFxgIGlzXG4gIHRoZSByb3cncyBudW1iZXJzLCBvbmUgcGVyIGVudHJ5IGluIFxcYGNhdGVnb3JpZXNcXGAsIGluIHRoZSBzYW1lIG9yZGVyLlxuICBEbyBub3QgY29tcHV0ZSBjZWxsIGluZGljZXMuXG5cbiAgRm9yIHJhZGFyOiBcXGBjYXRlZ29yaWVzXFxgIGFyZSB0aGUgaW5kaWNhdG9yIG5hbWVzOyBlYWNoIHNlcmllcyBpcyBhblxuICBhcnJheSBvZiBudW1iZXJzIChvbmUgdmFsdWUgcGVyIGluZGljYXRvcikuXG5cbiAgRm9yIGFueXRoaW5nIHRoZSB0eXBlcyBhYm92ZSBjYW5ub3QgZXhwcmVzcyAtIGEgc2Fua2V5LCBib3hwbG90LFxuICBjYW5kbGVzdGljaywgc3VuYnVyc3QsIGdhdWdlLCBuZXR3b3JrIGdyYXBoLCBjYWxlbmRhciwgcGFyYWxsZWwtXG4gIGNvb3JkaW5hdGVzIHBsb3QsIG9yIGFueSBvdGhlciBFY2hhcnRzIHNlcmllcyAtIHVzZSBcXGBjdXN0b21cXGAgYW5kXG4gIGhhbmQtd3JpdGUgdGhlIHdob2xlIEVjaGFydHMgb3B0aW9uIGludG8gXFxgb3B0aW9uXFxgIGFzIGEgSlNPTiBzdHJpbmcuXG4gIEluY2x1ZGUgZXZlcnkgcGFydCB0aGF0IGNoYXJ0IG5lZWRzOiB0aGUgc2VyaWVzIHdpdGggdGhlaXIgb3duXG4gIFxcYHR5cGVcXGAgYW5kIGRhdGEgc2hhcGUsIHBsdXMgYW55IGNvb3JkaW5hdGUgc3lzdGVtLCBcXGB2aXN1YWxNYXBcXGAsXG4gIG9yIGF4ZXMuIExlYXZlIFxcYHNlcmllc1xcYCwgXFxgY2F0ZWdvcmllc1xcYCwgYW5kIHRoZSBheGlzIGxhYmVscyBvdXQ7XG4gIHRoZXkgYXJlIGlnbm9yZWQgZm9yIFxcYGN1c3RvbVxcYC4gUHJlZmVyIGEgbGlzdGVkIHR5cGUgd2hlbmV2ZXIgb25lXG4gIGdlbnVpbmVseSBmaXRzIC0gXFxgY3VzdG9tXFxgIGdpdmVzIHVwIHRoZSBzaGFyZWQgdG9vbHRpcCwgbGVnZW5kLCBhbmRcbiAgZ3JpZCBkZWZhdWx0cywgc28gaXQgaXMgdGhlIGFuc3dlciBmb3IgYW4gdW5zdXBwb3J0ZWQgY2hhcnQgc2hhcGUsXG4gIG5vdCBhIHdheSB0byByZXN0eWxlIGEgc3VwcG9ydGVkIG9uZS5cblxuICBLZWVwIHNlcmllcyBuYW1lcyBodW1hbi1yZWFkYWJsZSAodXNlIHRoZSBjb2x1bW4gbmFtZTsgdGl0bGUgY2FzZSBpdFxuICBsaWdodGx5IGlmIG5lZWRlZCkuIEtlZXAgdGl0bGVzIGNvbmNpc2U7IGRvIG5vdCByZXBlYXQgdGhlIHVzZXInc1xuICB0aXRsZSBpbiB4QXhpc0xhYmVsIC8geUF4aXNMYWJlbC5cbmApO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwbGFubmVyIGFnZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogT25lIHBsYW5uZXIgYEFnZW50YCBwZXIgcGx1Z2luIGNvbmZpZy4gQ2FjaGVkIG9uIGNvbmZpZyBvYmplY3RcbiAqIGlkZW50aXR5IHNvIGNhbGxlcnMgY2FuIGBwcmVwYXJlQ2hhcnQoeyBjb25maWcsIC4uLiB9KWAgZnJvbSBhXG4gKiBob3QgcGF0aCB3aXRob3V0IHBheWluZyB0aGUgQWdlbnQtY29uc3RydWN0b3IgY29zdCBldmVyeSBjYWxsLlxuICogYFdlYWtNYXBgIGxldHMgcmV0aXJlZCBjb25maWdzIChlLmcuIHRlc3QgcmVjb25maWd1cmF0aW9ucylcbiAqIHJlbGVhc2UgdGhlaXIgYWdlbnQgd2l0aG91dCBtYW51YWwgZXZpY3Rpb24uXG4gKi9cbmNvbnN0IHBsYW5uZXJBZ2VudHMgPSBuZXcgV2Vha01hcDxNYXN0cmFQbHVnaW5Db25maWcsIEFnZW50PigpO1xuXG5mdW5jdGlvbiBnZXRQbGFubmVyQWdlbnQoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBBZ2VudCB7XG4gIGxldCBhZ2VudCA9IHBsYW5uZXJBZ2VudHMuZ2V0KGNvbmZpZyk7XG4gIGlmICghYWdlbnQpIHtcbiAgICBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICBpZDogXCJjaGFydF9wbGFubmVyXCIsXG4gICAgICBuYW1lOiBcIkNoYXJ0IFBsYW5uZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlBpY2tzIGNoYXJ0IHR5cGUgYW5kIGF4aXMgZW5jb2RpbmdzIGZvciBhIGRhdGFzZXQuXCIsXG4gICAgICBpbnN0cnVjdGlvbnM6IENIQVJUX1BMQU5ORVJfSU5TVFJVQ1RJT05TLFxuICAgICAgbW9kZWw6ICh7IHJlcXVlc3RDb250ZXh0IH0pID0+XG4gICAgICAgIGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCwgeyBtb2RlbENsYXNzOiBtb2RlbC5Nb2RlbENsYXNzLkNoYXRGYXN0IH0pLFxuICAgIH0pO1xuICAgIHBsYW5uZXJBZ2VudHMuc2V0KGNvbmZpZywgYWdlbnQpO1xuICB9XG4gIHJldHVybiBhZ2VudDtcbn1cblxuLyoqXG4gKiBSdW4gdGhlIHBsYW5uZXIgYWdhaW5zdCBgcmVxdWVzdGAgYW5kIHJldHVybiB0aGUgcmVzb2x2ZWRcbiAqIEVjaGFydHMgc3BlYy4gVGhyb3dzIG9uIHBsYW5uZXIgZmFpbHVyZSAtIHtAbGluayBwcmVwYXJlQ2hhcnR9XG4gKiBjYXRjaGVzIGFuZCBzdGFzaGVzIHRoZSBlcnJvciBpbiB0aGUgY2FjaGUgZW50cnkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNoYXJ0UGxhbm5lcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3Q6IENoYXJ0UGxhbm5lclJlcXVlc3QsXG4gIG9wdGlvbnM6IHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDsgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCB9ID0ge30sXG4pOiBQcm9taXNlPENoYXJ0UmVzdWx0PiB7XG4gIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSByZXF1ZXN0O1xuICBjb25zdCB7IHJlcXVlc3RDb250ZXh0LCBhYm9ydFNpZ25hbCB9ID0gb3B0aW9ucztcbiAgY29uc3QgcHJvbXB0ID0gc3RyaW5nLnRvRGVzY3JpcHRpb24oe1xuICAgIFRpdGxlOiB0aXRsZSxcbiAgICAuLi4oZGVzY3JpcHRpb24gPyB7IERlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgIFwiRGF0YXNldCAoSlNPTiwgb25lIHJvdyBwZXIgb2JqZWN0KVwiOiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKSxcbiAgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFBsYW5uZXJBZ2VudChjb25maWcpLmdlbmVyYXRlKHByb21wdCwge1xuICAgIHN0cnVjdHVyZWRPdXRwdXQ6IHsgc2NoZW1hOiBjaGFydFBsYW5TY2hlbWEgfSxcbiAgICAuLi4ocmVxdWVzdENvbnRleHQgPyB7IHJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgLi4uKGFib3J0U2lnbmFsID8geyBhYm9ydFNpZ25hbCB9IDoge30pLFxuICB9KTtcbiAgY29uc3QgcGxhbiA9IGNoYXJ0UGxhblNjaGVtYS5wYXJzZShyZXN1bHQub2JqZWN0KTtcbiAgY29uc3Qgb3B0aW9uID0gcGxhblRvRWNoYXJ0c09wdGlvbihwbGFuLCB0aXRsZSwgY29uZmlnLmJyYW5kKTtcbiAgcmV0dXJuIHsgY2hhcnRUeXBlOiBwbGFuLmNoYXJ0VHlwZSwgb3B0aW9uIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjYWNoZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBjYW5vbmljYWwgY2FjaGUga2V5IGZvciBhIGBjaGFydElkYCBvd25lZCBieSBgdXNlcktleWAuXG4gKlxuICogVGhlIGlkZW50aXR5IGlzIHBhcnQgb2YgdGhlIGtleSwgbm90IGEgZmlsdGVyIGFwcGxpZWQgYWZ0ZXIgdGhlIHJlYWQsIHNvIGFcbiAqIGNoYXJ0IGlkIGd1ZXNzZWQgb3IgY29waWVkIGZyb20gYW5vdGhlciB1c2VyJ3MgdHJhbnNjcmlwdCByZXNvbHZlcyB0byBhXG4gKiBkaWZmZXJlbnQga2V5IGFuZCBzaW1wbHkgbWlzc2VzLiBUaGF0IG1pc3MgaXMgd2hhdCB0aGUgSFRUUCByb3V0ZSB0dXJucyBpbnRvXG4gKiBhIDQwNCwgd2hpY2ggaXMgYWxzbyB0aGUgYW5zd2VyIHRoYXQgbGVha3MgdGhlIGxlYXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGFydENhY2hlS2V5KGNoYXJ0SWQ6IHN0cmluZywgdXNlcktleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIChhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKSkuZ2VuZXJhdGVLZXkoW0NIQVJUX0NBQ0hFX05BTUVTUEFDRSwgY2hhcnRJZF0sIHVzZXJLZXkpO1xufVxuXG4vKipcbiAqIFBlcnNpc3QgYSB7QGxpbmsgQ2hhcnR9IGVudHJ5IHVuZGVyIGl0cyBgY2hhcnRJZGAsIG93bmVkIGJ5IGB1c2VyS2V5YC5cbiAqIFJlZnJlc2hlcyB0aGUgVFRMIG9uIGV2ZXJ5IHdyaXRlLiBDYWNoZS1sYXllciBmYWlsdXJlcyBhcmUgbG9nZ2VkIGFuZFxuICogc3dhbGxvd2VkIHNvIGJhY2tncm91bmQgcnVubmVycyBuZXZlciB0aHJvdyBpbnRvIHRoZVxuICogdW5oYW5kbGVkLXJlamVjdGlvbiBzdHJlYW0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2hhcnQoZW50cnk6IENoYXJ0LCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCBjaGFydENhY2hlS2V5KGVudHJ5LmNoYXJ0SWQsIHVzZXJLZXkpO1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5zZXQoa2V5LCBlbnRyeSwge1xuICAgICAgdHRsOiBDSEFSVF9DQUNIRV9UVExfU0VDLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcIndyaXRlLWVycm9yXCIsIHtcbiAgICAgIGNoYXJ0SWQ6IGVudHJ5LmNoYXJ0SWQsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29rIHVwIGEgY2hhcnQgYHVzZXJLZXlgIG93bnMuIFJldHVybnMgYHVuZGVmaW5lZGAgb24gbWlzcywgb25cbiAqIGV4cGlyeSwgd2hlbiBhbm90aGVyIGlkZW50aXR5IG93bnMgdGhlIGlkLCBvciB3aGVuIHRoZSBjYWNoZSBsYXllciBpc1xuICogdW5oZWFsdGh5IC0gbmV2ZXIgdGhyb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2hhcnQoY2hhcnRJZDogc3RyaW5nLCB1c2VyS2V5OiBzdHJpbmcpOiBQcm9taXNlPENoYXJ0IHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qga2V5ID0gYXdhaXQgY2hhcnRDYWNoZUtleShjaGFydElkLCB1c2VyS2V5KTtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxDaGFydD4oa2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwicmVhZC1lcnJvclwiLCB7XG4gICAgICBjaGFydElkLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByZXBhcmVDaGFydCBvcmNoZXN0cmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBJbnB1dHMgdG8ge0BsaW5rIHByZXBhcmVDaGFydH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXBhcmVDaGFydE9wdGlvbnMge1xuICAvKiogUGx1Z2luIGNvbmZpZzsgcmVzb2x2ZXMgdGhlIHBsYW5uZXIgYWdlbnQncyBtb2RlbC4gKi9cbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG4gIC8qKlxuICAgKiBJZGVudGl0eSB0aGF0IG93bnMgdGhlIG1pbnRlZCBjaGFydC4gT25seSBhIHtAbGluayBmZXRjaENoYXJ0fSBjYWxsXG4gICAqIGNhcnJ5aW5nIHRoZSBzYW1lIGtleSByZXNvbHZlcyBpdC4gVXNlIHtAbGluayByZXNvbHZlVXNlcktleX0uXG4gICAqL1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IHRpdGxlIGZvcndhcmRlZCB0byB0aGUgcGxhbm5lciBhZ2VudC4gKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBpbnRlbnQgaGludCBmb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHJvd3MgdG8gY2hhcnQuIENhbGxlZCBvbmNlLCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICogQW55IHRocm93biBlcnJvciBsYW5kcyBpbiB0aGUgY2FjaGUgYXMgdGhlIGVudHJ5J3MgYGVycm9yYFxuICAgKiBmaWVsZCAobmV2ZXIgcHJvcGFnYXRlZCB0byB0aGUgY2FsbGVyIG9mIHtAbGluayBwcmVwYXJlQ2hhcnR9KS5cbiAgICogQW4gZW1wdHkgYHJvd3NgIGFycmF5IGlzIHJlamVjdGVkIGFzIGBcImRhdGFzZXQgaGFzIG5vIHJvd3M7XG4gICAqIG5vdGhpbmcgdG8gY2hhcnRcImAuXG4gICAqL1xuICByZXNvbHZlRGF0YTogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPHsgcm93czogUmVhZG9ubHlBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfT47XG4gIC8qKlxuICAgKiBQZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgLiBGb3J3YXJkZWQgdG8gdGhlIHBsYW5uZXIgYWdlbnQgc29cbiAgICogdXNlci1zY29wZWQgbW9kZWwgcmVzb2x1dGlvbiAoT0JPKSBzdGF5cyBpbiBlZmZlY3QuXG4gICAqL1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAvKipcbiAgICogQ29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uLiBGb3J3YXJkZWQgdG8gYHJlc29sdmVEYXRhYCBhbmQgdGhlXG4gICAqIHBsYW5uZXIgYWdlbnQuIE5vdGU6IHRoZSBjaGFydCB0YXNrIGNvbnRpbnVlcyBydW5uaW5nIGluIHRoZVxuICAgKiBiYWNrZ3JvdW5kIGFmdGVyIHRoZSBwYXJlbnQgcmVxdWVzdCBlbmRzLCBzbyBleHRlcm5hbCBhYm9ydFxuICAgKiBzaWduYWxzIGFyZSBiZXN0LWVmZm9ydDsgdHlwaWNhbCB1c2UgaXMgdG8gbGVhdmUgdGhpcyB1bnNldFxuICAgKiBhbmQgbGV0IHRoZSAxaCBUVEwgY2FwIHN0YWxlIGVudHJpZXMuXG4gICAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBNaW50IGEgYGNoYXJ0SWRgLCBjYWNoZSBhbiBlbXB0eSBgeyBjaGFydElkIH1gIHBsYWNlaG9sZGVyXG4gKiBzeW5jaHJvbm91c2x5LCBhbmQga2ljayBvZmYgYSBiYWNrZ3JvdW5kIHRhc2sgdGhhdCByZXNvbHZlcyB0aGVcbiAqIGRhdGFzZXQgYW5kIHJ1bnMgdGhlIHBsYW5uZXIuIFJldHVybnMgdGhlIGBjaGFydElkYCBvbmNlIHRoZVxuICogcGxhY2Vob2xkZXIgbGFuZHMgc28gdGhlIGZpcnN0IHtAbGluayBmZXRjaENoYXJ0fSBjYWxsIGFsd2F5c1xuICogc2VlcyBhbiBlbnRyeSAobm8gc3B1cmlvdXMgNDA0IHJhY2UpLlxuICpcbiAqIFRoZSBiYWNrZ3JvdW5kIHRhc2sgc3dhbGxvd3MgaXRzIG93biBmYWlsdXJlcyBhbmQgd3JpdGVzIHRoZW1cbiAqIGFzIGBlcnJvcmAgZW50cmllcywgc28gY2FsbGVycyBuZXZlciBzZWUgYSByZWplY3RlZCBwcm9taXNlLlxuICogQ2FjaGUgc3RhdGUgbWFjaGluZTpcbiAqXG4gKiAgIC0ganVzdCBhZnRlciB0aGlzIGNhbGwgcmV0dXJuczogYHsgY2hhcnRJZCB9YCAocHJvY2Vzc2luZylcbiAqICAgLSBvbiBwbGFubmVyIHN1Y2Nlc3M6ICAgICAgICAgICBgeyBjaGFydElkLCByZXN1bHQgfWBcbiAqICAgLSBvbiBkYXRhIC8gcGxhbm5lciBmYWlsdXJlOiAgICBgeyBjaGFydElkLCBlcnJvciB9YFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNoYXJ0KG9wdHM6IFByZXBhcmVDaGFydE9wdGlvbnMpOiBQcm9taXNlPENoYXJ0VG9vbE91dHB1dD4ge1xuICBjb25zdCBjaGFydElkID0gaGFzaC5pZCgpO1xuICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCB9LCBvcHRzLnVzZXJLZXkpO1xuICBsb2dnZXIuZGVidWcoXCJxdWV1ZWRcIiwgeyBjaGFydElkIH0pO1xuICAvLyBGaXJlLWFuZC1mb3JnZXQuIEZhaWx1cmVzIGxhbmQgaW4gdGhlIGNhY2hlIGFzIGBlcnJvcmAgZW50cmllcztcbiAgLy8gbmV2ZXIgZXNjYXBlIGludG8gYW4gdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgdm9pZCBydW5QcmVwYXJlQ2hhcnQoY2hhcnRJZCwgb3B0cyk7XG4gIHJldHVybiB7IGNoYXJ0SWQsIG1hcmtlcjogbWFya2VyLmZvcm1hdE1hcmtlcihcImNoYXJ0XCIsIGNoYXJ0SWQpIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByZXBhcmVDaGFydChjaGFydElkOiBzdHJpbmcsIG9wdHM6IFByZXBhcmVDaGFydE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgb3B0cy5yZXNvbHZlRGF0YShvcHRzLnNpZ25hbCk7XG4gICAgaWYgKGRhdGEucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIkRhdGFzZXQgaGFzIG5vIHJvd3M7IG5vdGhpbmcgdG8gY2hhcnRcIik7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1bkNoYXJ0UGxhbm5lcihcbiAgICAgIG9wdHMuY29uZmlnLFxuICAgICAge1xuICAgICAgICB0aXRsZTogb3B0cy50aXRsZSA/PyBcIkNoYXJ0XCIsXG4gICAgICAgIC4uLihvcHRzLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogb3B0cy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICBkYXRhOiBkYXRhLnJvd3MgYXMgQ2hhcnRQbGFubmVyUmVxdWVzdFtcImRhdGFcIl0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAuLi4ob3B0cy5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IG9wdHMucmVxdWVzdENvbnRleHQgfSA6IHt9KSxcbiAgICAgICAgLi4uKG9wdHMuc2lnbmFsID8geyBhYm9ydFNpZ25hbDogb3B0cy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCwgcmVzdWx0IH0sIG9wdHMudXNlcktleSk7XG4gICAgbG9nZ2VyLmluZm8oXCJkb25lXCIsIHtcbiAgICAgIGNoYXJ0SWQsXG4gICAgICBjaGFydFR5cGU6IHJlc3VsdC5jaGFydFR5cGUsXG4gICAgICBlbGFwc2VkTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZXJyb3JcIiwgeyBjaGFydElkLCBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgLy8gVGhlIGVudHJ5J3MgYGVycm9yYCBpcyByZW5kZXJlZCBpbiB0aGUgY2hhdCwgc28gb25seSBhbiBBcHBLaXRFcnJvcidzXG4gICAgLy8gb3duIG1lc3NhZ2UgdHJhdmVsczsgYW55dGhpbmcgZWxzZSBjb3VsZCBjYXJyeSB1cHN0cmVhbSBwcm92aWRlciBkZXRhaWwuXG4gICAgY29uc3QgZXJyVGV4dCA9IGVyciBpbnN0YW5jZW9mIEFwcEtpdEVycm9yID8gZXJyLm1lc3NhZ2UgOiBDSEFSVF9GQUlMRURfTUVTU0FHRTtcbiAgICBhd2FpdCB3cml0ZUNoYXJ0KHsgY2hhcnRJZCwgZXJyb3I6IGVyclRleHQgfSwgb3B0cy51c2VyS2V5KTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvbmctcG9sbCBmZXRjaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBJbnB1dHMgdG8ge0BsaW5rIGZldGNoQ2hhcnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZXRjaENoYXJ0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZGVudGl0eSB0aGUgY2hhcnQgbXVzdCBiZWxvbmcgdG8uIEEgY2hhcnQgbWludGVkIHVuZGVyIGEgZGlmZmVyZW50IGtleVxuICAgKiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIHVua25vd24gaWQuIFVzZSB7QGxpbmsgcmVzb2x2ZVVzZXJLZXl9LlxuICAgKi9cbiAgdXNlcktleTogc3RyaW5nO1xuICAvKipcbiAgICogU2VydmVyLXNpZGUgcG9sbGluZyBidWRnZXQgaW4gbXMuIFdoZW4gdGhlIGVudHJ5IHN0YXlzIGluXG4gICAqIHRoZSBwcm9jZXNzaW5nIHN0YXRlIHBhc3QgdGhpcyB3aW5kb3csIHRoZSBoZWxwZXIgcmV0dXJucyB0aGVcbiAgICogbGFzdCBzZWVuIHZhbHVlIChzdGlsbCBwcm9jZXNzaW5nKSBzbyB0aGUgY2xpZW50IGNhbiByZS1wb2xsLlxuICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9GRVRDSF9USU1FT1VUX01TfSAoNjBzKS5cbiAgICovXG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFBvbGwgaW50ZXJ2YWwgaW4gbXMuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TfSAoMjUwbXMpLlxuICAgKi9cbiAgaW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbiBoYW5kbGUgKGUuZy4gcmVxdWVzdCBgcmVxLnNpZ25hbGApLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBMb25nLXBvbGwgdGhlIGNoYXJ0IGNhY2hlIHVudGlsIHRoZSBlbnRyeSBzZXR0bGVzIChgcmVzdWx0YCBvclxuICogYGVycm9yYCBzZXQpLCB0aGUgZW50cnkgaXMgbWlzc2luZywgb3IgdGhlIHNlcnZlci1zaWRlIHRpbWVvdXRcbiAqIGVsYXBzZXMuXG4gKlxuICogUmV0dXJuczpcbiAqICAgLSB0aGUgcmVzb2x2ZWQge0BsaW5rIENoYXJ0fSB3aGVuIGl0IHNldHRsZWQsIGVycm9yZWQsIG9yXG4gKiAgICAgc3RheWVkIGluIHByb2Nlc3NpbmcgcGFzdCBgdGltZW91dE1zYCAoc28gdGhlIGNsaWVudCBjYW5cbiAqICAgICByZS1wb2xsKTtcbiAqICAgLSBgdW5kZWZpbmVkYCB3aGVuIHRoZSBlbnRyeSBpcyBtaXNzaW5nLCBleHBpcmVkLCBvciBvd25lZCBieVxuICogICAgIGFub3RoZXIgaWRlbnRpdHkgKHRoZSBjb25zdW1lciBzaG91bGQgdHJlYXQgYXMgNDA0KS5cbiAqXG4gKiBgc2lnbmFsYCBsZXRzIHRoZSBjYWxsZXIgY2FuY2VsIGFoZWFkIG9mIHRpbWVvdXQgKGUuZy4gdGhlIEhUVFBcbiAqIHJlcXVlc3QgY2xvc2VkKS4gQ2FuY2VsbGF0aW9uIHByb3BhZ2F0ZXMgdG8gdGhlIGludGVyLXBvbGwgc2xlZXBcbiAqIHNvIHRoZSBoZWxwZXIgcmV0dXJucyBpbW1lZGlhdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2hhcnQoXG4gIGNoYXJ0SWQ6IHN0cmluZyxcbiAgb3B0aW9uczogRmV0Y2hDaGFydE9wdGlvbnMsXG4pOiBQcm9taXNlPENoYXJ0IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHRpbWVvdXRNcyA9IG9wdGlvbnMudGltZW91dE1zID8/IERFRkFVTFRfRkVUQ0hfVElNRU9VVF9NUztcbiAgY29uc3QgaW50ZXJ2YWxNcyA9IG9wdGlvbnMuaW50ZXJ2YWxNcyA/PyBERUZBVUxUX0ZFVENIX0lOVEVSVkFMX01TO1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aW1lb3V0TXM7XG5cbiAgbGV0IGxhc3Q6IENoYXJ0IHwgdW5kZWZpbmVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIG9wdGlvbnMuc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGxhc3QgPSBhd2FpdCByZWFkQ2hhcnQoY2hhcnRJZCwgb3B0aW9ucy51c2VyS2V5KTtcbiAgICBpZiAoIWxhc3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGxhc3QucmVzdWx0ICE9PSB1bmRlZmluZWQgfHwgbGFzdC5lcnJvciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbGFzdDtcbiAgICBjb25zdCByZW1haW5pbmcgPSBkZWFkbGluZSAtIERhdGUubm93KCk7XG4gICAgaWYgKHJlbWFpbmluZyA8PSAwKSByZXR1cm4gbGFzdDtcbiAgICBhd2FpdCBhc3luYy5zbGVlcChNYXRoLm1pbihpbnRlcnZhbE1zLCByZW1haW5pbmcpLCBvcHRpb25zLnNpZ25hbCk7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZWNoYXJ0cyB0aGVtZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFRoZSBzbGljZSBvZiBhbiBFY2hhcnRzIG9wdGlvbiB0aGF0IGNhcnJpZXMgYnJhbmQgaWRlbnRpdHk6IHRoZSBzZXJpZXNcbiAqIGNvbG9yIGN5Y2xlIGFuZCB0aGUgYmFzZSBmb250IHN0YWNrLiBEZXJpdmVkIGZyb20gYSB7QGxpbmsgQnJhbmRDb250ZXh0fVxuICogYnkge0BsaW5rIGJyYW5kQ2hhcnRUaGVtZX0gYW5kIG1lcmdlZCBpbnRvIGV2ZXJ5IHNwZWMgYnlcbiAqIHtAbGluayBwbGFuVG9FY2hhcnRzT3B0aW9ufS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgY2FycmllcyBubyB0ZXh0IENPTE9SLiBBIHNwZWMgaXMgcGxhbm5lZCBoZXJlLCBvbiB0aGVcbiAqIHNlcnZlciwgYW5kIHJlYWQgbGF0ZXIgaW4gYSBicm93c2VyIHdob3NlIGxpZ2h0L2RhcmsgdGhlbWUgdGhpcyBjb2RlXG4gKiBjYW5ub3Qga25vdzsgYmFraW5nIGluIHRoZSBicmFuZCdzIHNpbmdsZSAobGlnaHQpIGZvcmVncm91bmQgcHJvZHVjZWRcbiAqIG5lYXItYmxhY2sgbGFiZWxzIHRoYXQgZGlzYXBwZWFyZWQgYWdhaW5zdCBhIGRhcmsgY2hhdCBzdXJmYWNlLiBUaGVcbiAqIHJlbmRlcmVyIHJlc29sdmVzIGNocm9tZSBjb2xvcnMgZnJvbSBBcHBLaXQncyBsaXZlIENTUyB0b2tlbnMgaW5zdGVhZFxuICogKGBAZGJ4LXRvb2xzL3VpLW1hc3RyYWAncyBgY2hhcnQtdGhlbWVgICsgYG5vcm1hbGl6ZUNoYXJ0T3B0aW9uYCksXG4gKiBsZWF2aW5nIHRoaXMgdGhlbWUgdGhlIHBhcnRzIHRoYXQgcmVhZCB0aGUgc2FtZSBpbiBlaXRoZXIgbW9kZS5cbiAqL1xuaW50ZXJmYWNlIENoYXJ0VGhlbWUge1xuICBjb2xvcjogc3RyaW5nW107XG4gIHRleHRTdHlsZTogeyBmb250RmFtaWx5OiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBcHBLaXQncyBjYXRlZ29yaWNhbCBjaGFydCBwYWxldHRlIChgLS1jaGFydC1jYXQtMWAgLi4gYC0tY2hhcnQtY2F0LThgIGZyb21cbiAqIGBAZGF0YWJyaWNrcy9hcHBraXQtdWlgKSwgYXMgaGV4LiBTZXJ2ZXItcmVuZGVyZWQgY2hhcnQgc3BlY3MgY2Fubm90IHJlYWQgdGhlXG4gKiBicm93c2VyJ3MgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBzbyB0aGUgdmFsdWVzIGFyZSBtaXJyb3JlZCBoZXJlIHRvIGtlZXAgYVxuICogZ2VuZXJhdGVkIGNoYXJ0IHZpc3VhbGx5IGNvbnNpc3RlbnQgd2l0aCB0aGUgQXBwS2l0LXN0eWxlZCBVSSBhcm91bmQgaXQuXG4gKiBLZWVwIGluIHN5bmMgd2l0aCBBcHBLaXQncyBzdHlsZXNoZWV0IGlmIGl0IGNoYW5nZXMuXG4gKi9cbmNvbnN0IEFQUEtJVF9DSEFSVF9QQUxFVFRFID0gW1xuICBcIiMyNDYzRUJcIiwgLy8gYmx1ZVxuICBcIiMyRUI4OEFcIiwgLy8gdGVhbFxuICBcIiNBQjQ3QkRcIiwgLy8gcHVycGxlXG4gIFwiI0Y2OUUyM1wiLCAvLyBhbWJlclxuICBcIiNERDJDNERcIiwgLy8gcm9zZVxuICBcIiMxQkEzQkJcIiwgLy8gY3lhblxuICBcIiM5QjYxRDFcIiwgLy8gbGF2ZW5kZXJcbiAgXCIjMzRCMjYyXCIsIC8vIGVtZXJhbGRcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRXhwYW5kIHR3byBicmFuZCBoZXggY29sb3JzIGludG8gYSBsZWdpYmxlIGNhdGVnb3JpY2FsIGN5Y2xlLiBFY2hhcnRzXG4gKiByZXBlYXRzIHRoZSBgY29sb3JgIGFycmF5IGFjcm9zcyBzZXJpZXMgLyBjYXRlZ29yaWVzLCBzbyBhIGdvb2QgZGVmYXVsdFxuICogbmVlZHMgc2V2ZXJhbCBkaXN0aW5jdCBodWVzLCBub3QgdHdvLiBXZSBzZWVkIHdpdGggdGhlIGJyYW5kIHByaW1hcnkgYW5kXG4gKiBhY2NlbnQgKHRoZSBpZGVudGl0eSBjb2xvcnMpIGFuZCBmb2xsb3cgd2l0aCBBcHBLaXQncyBvd24gY2F0ZWdvcmljYWwgY2hhcnRcbiAqIHBhbGV0dGUsIHNvIG11bHRpLXNlcmllcyAvIG1hbnktc2xpY2UgY2hhcnRzIHN0YXkgcmVhZGFibGUgYW5kIG1hdGNoIHRoZVxuICogc3Vycm91bmRpbmcgQXBwS2l0IFVJIHdoaWxlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIG1hcmtzIGxhbmQgb24tYnJhbmQuXG4gKi9cbmZ1bmN0aW9uIGJyYW5kQ29sb3JDeWNsZShwcmltYXJ5OiBzdHJpbmcsIGFjY2VudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBzcHJlYWQgPSBBUFBLSVRfQ0hBUlRfUEFMRVRURTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZXR1cm4gW3ByaW1hcnksIGFjY2VudCwgLi4uc3ByZWFkXS5maWx0ZXIoKGMpID0+IHtcbiAgICBjb25zdCBrZXkgPSBjLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHNlZW4uaGFzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICBzZWVuLmFkZChrZXkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYW4gRWNoYXJ0cyB7QGxpbmsgQ2hhcnRUaGVtZX0gZnJvbSBhIGJyYW5kIGNvbnRleHQ6IHRoZSBwcmltYXJ5ICtcbiAqIGFjY2VudCBjb2xvcnMgc2VlZCB0aGUgc2VyaWVzIGN5Y2xlIGFuZCB0aGUgc2FucyBzdGFjayBiZWNvbWVzIHRoZSBiYXNlXG4gKiBmb250LiBUZXh0IGNvbG9ycyBhcmUgdGhlIHJlbmRlcmVyJ3Mgam9iIC0gc2VlIHtAbGluayBDaGFydFRoZW1lfS5cbiAqL1xuZnVuY3Rpb24gYnJhbmRDaGFydFRoZW1lKGJyYW5kOiBCcmFuZENvbnRleHQpOiBDaGFydFRoZW1lIHtcbiAgcmV0dXJuIHtcbiAgICBjb2xvcjogYnJhbmRDb2xvckN5Y2xlKGJyYW5kLmNvbG9ycy5wcmltYXJ5LCBicmFuZC5jb2xvcnMuYWNjZW50KSxcbiAgICB0ZXh0U3R5bGU6IHsgZm9udEZhbWlseTogYnJhbmQudHlwb2dyYXBoeS5zYW5zIH0sXG4gIH07XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVjaGFydHMgZXhwYW5zaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbnR5cGUgTmFtZWRTbGljZSA9IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH07XG50eXBlIFNjYXR0ZXJQb2ludCA9IFtudW1iZXIsIG51bWJlcl07XG50eXBlIEhlYXRtYXBDZWxsID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4vKiogS2VlcCBvbmx5IGB7bmFtZSwgdmFsdWV9YCBzbGljZXM7IGRyb3AgbnVsbHMgLyBiYXJlIG51bWJlcnMgLyB0dXBsZXMuICovXG5mdW5jdGlvbiBuYW1lZFNsaWNlcyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBOYW1lZFNsaWNlW10ge1xuICByZXR1cm4gZGF0YS5maWx0ZXIoXG4gICAgKGQpOiBkIGlzIE5hbWVkU2xpY2UgPT4gZCAhPT0gbnVsbCAmJiB0eXBlb2YgZCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShkKSxcbiAgKTtcbn1cblxuLyoqIEtlZXAgb25seSBmaW5pdGUgbnVtYmVycyAoY2F0ZWdvcnkgLyByYWRhciAvIHdhdGVyZmFsbCBzZXJpZXMpLiAqL1xuZnVuY3Rpb24gbnVtZXJpY1BvaW50cyhkYXRhOiBDaGFydFBsYW5bXCJzZXJpZXNcIl1bbnVtYmVyXVtcImRhdGFcIl0pOiBudW1iZXJbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcigoZCk6IGQgaXMgbnVtYmVyID0+IHR5cGVvZiBkID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShkKSk7XG59XG5cbi8qKiBLZWVwIG9ubHkgYFt4LCB5XWAgc2NhdHRlciB0dXBsZXMuICovXG5mdW5jdGlvbiBzY2F0dGVyUG9pbnRzKGRhdGE6IENoYXJ0UGxhbltcInNlcmllc1wiXVtudW1iZXJdW1wiZGF0YVwiXSk6IFNjYXR0ZXJQb2ludFtdIHtcbiAgcmV0dXJuIGRhdGEuZmlsdGVyKFxuICAgIChkKTogZCBpcyBTY2F0dGVyUG9pbnQgPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMixcbiAgKSBhcyBTY2F0dGVyUG9pbnRbXTtcbn1cblxuLyoqIEtlZXAgb25seSBgW3hJbmRleCwgeUluZGV4LCB2YWx1ZV1gIGhlYXRtYXAgY2VsbHMuICovXG5mdW5jdGlvbiBoZWF0bWFwQ2VsbHMoZGF0YTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl1bXCJkYXRhXCJdKTogSGVhdG1hcENlbGxbXSB7XG4gIHJldHVybiBkYXRhLmZpbHRlcigoZCk6IGQgaXMgSGVhdG1hcENlbGwgPT4gQXJyYXkuaXNBcnJheShkKSAmJiBkLmxlbmd0aCA9PT0gMykgYXMgSGVhdG1hcENlbGxbXTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgaGVhdG1hcCdzIGNlbGxzIGFuZCByb3cgbGFiZWxzIGZyb20gZWl0aGVyIHNoYXBlIHRoZVxuICogcGxhbm5lciBtYXkgcHJvZHVjZS5cbiAqXG4gKiBUaGUgZG9jdW1lbnRlZCBzaGFwZSBpcyBPTkUgc2VyaWVzIG9mIGBbeEluZGV4LCB5SW5kZXgsIHZhbHVlXWBcbiAqIHRyaXBsZXMsIGJ1dCBpbmRleCBhcml0aG1ldGljIGlzIGV4YWN0bHkgdGhlIGtpbmQgb2YgYm9va2tlZXBpbmcgYVxuICogZmFzdCBtb2RlbCBnZXRzIHdyb25nLCBhbmQgdGhlIGZhaWx1cmUgaXMgc2lsZW50IChldmVyeSBjZWxsIGlzXG4gKiBkcm9wcGVkIGFuZCB0aGUgZ3JpZCByZW5kZXJzIGVtcHR5KS4gU28gdGhlIHJvdy1wZXItc2VyaWVzIHNoYXBlIGl0XG4gKiBhbHJlYWR5IHByb2R1Y2VzIHJlbGlhYmx5IGZvciBiYXIgY2hhcnRzIC0gb25lIHNlcmllcyBwZXIgbWF0cml4XG4gKiByb3csIG51bWJlcnMgYWxpZ25lZCB0byBgY2F0ZWdvcmllc2AgLSBpcyBhY2NlcHRlZCB0b28gYW5kIHR1cm5lZFxuICogaW50byB0cmlwbGVzIGhlcmUuXG4gKlxuICogUm93IG9yZGVyIHJlYWRzIHRvcC10by1ib3R0b206IEVjaGFydHMnIGNhdGVnb3J5IHktYXhpcyBjb3VudHMgaW5kZXhcbiAqIDAgZnJvbSB0aGUgQk9UVE9NLCBzbyBhIHJvdy1kZXJpdmVkIG1hdHJpeCByZXZlcnNlcyBib3RoIHRoZSBheGlzXG4gKiBsYWJlbHMgYW5kIHRoZSByb3cgaW5kaWNlcywgcHV0dGluZyB0aGUgZmlyc3Qgc2VyaWVzIGF0IHRoZSB0b3AgdGhlXG4gKiB3YXkgdGhlIG1vZGVsIGxpc3RlZCBpdC5cbiAqL1xuZnVuY3Rpb24gaGVhdG1hcE1hdHJpeChwbGFuOiBDaGFydFBsYW4pOiB7IGNlbGxzOiBIZWF0bWFwQ2VsbFtdOyB5Q2F0ZWdvcmllczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHRyaXBsZXMgPSBoZWF0bWFwQ2VsbHMocGxhbi5zZXJpZXNbMF0/LmRhdGEgPz8gW10pO1xuICBpZiAodHJpcGxlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHsgY2VsbHM6IHRyaXBsZXMsIHlDYXRlZ29yaWVzOiBwbGFuLnlDYXRlZ29yaWVzID8/IFtdIH07XG4gIH1cbiAgY29uc3Qgcm93cyA9IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHsgbmFtZTogcy5uYW1lLCB2YWx1ZXM6IG51bWVyaWNQb2ludHMocy5kYXRhKSB9KSk7XG4gIGNvbnN0IGxhYmVscyA9IHBsYW4ueUNhdGVnb3JpZXMgPz8gcm93cy5tYXAoKHIpID0+IHIubmFtZSk7XG4gIGNvbnN0IGxhc3RSb3cgPSByb3dzLmxlbmd0aCAtIDE7XG4gIHJldHVybiB7XG4gICAgY2VsbHM6IHJvd3MuZmxhdE1hcCgocm93LCByb3dJbmRleCkgPT5cbiAgICAgIHJvdy52YWx1ZXMubWFwKCh2YWx1ZSwgY29sdW1uSW5kZXgpOiBIZWF0bWFwQ2VsbCA9PiBbY29sdW1uSW5kZXgsIGxhc3RSb3cgLSByb3dJbmRleCwgdmFsdWVdKSxcbiAgICApLFxuICAgIHlDYXRlZ29yaWVzOiBbLi4ubGFiZWxzXS5yZXZlcnNlKCksXG4gIH07XG59XG5cbi8qKiBTZXF1ZW50aWFsIGxpZ2h0LXRvLWJyYW5kIHJhbXAgZm9yIGhlYXRtYXAgaW50ZW5zaXR5LiAqL1xuY29uc3QgSEVBVE1BUF9SQU1QID0gW1wiI0VBRjFGRVwiLCBcIiM5Q0JERjdcIiwgXCIjNEM4NkVFXCIsIFwiIzI0NjNFQlwiLCBcIiMxNDM4N0ZcIl07XG5cbi8qKiBBYm92ZSB0aGlzIG1hbnkgY2VsbHMsIHByaW50ZWQgdmFsdWVzIG92ZXJsYXAgYW5kIGFyZSBzdXBwcmVzc2VkLiAqL1xuY29uc3QgSEVBVE1BUF9MQUJFTF9NQVhfQ0VMTFMgPSA2MDtcblxuLyoqIFJpc2luZyBzdGVwIGZpbGwgKGVtZXJhbGQpIGFuZCBmYWxsaW5nIHN0ZXAgZmlsbCAocm9zZSkuICovXG5jb25zdCBXQVRFUkZBTExfSU5DUkVBU0VfQ09MT1IgPSBcIiMyRUI4OEFcIjtcbmNvbnN0IFdBVEVSRkFMTF9ERUNSRUFTRV9DT0xPUiA9IFwiI0REMkM0RFwiO1xuXG4vKiogU2VyaWVzIG5hbWVzIHRoZSB3YXRlcmZhbGwgZXhwYW5zaW9uIGVtaXRzLiAqL1xuY29uc3QgV0FURVJGQUxMX0hFTFBFUl9OQU1FID0gXCJSdW5uaW5nIHRvdGFsXCI7XG5jb25zdCBXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSA9IFwiSW5jcmVhc2VcIjtcbmNvbnN0IFdBVEVSRkFMTF9ERUNSRUFTRV9OQU1FID0gXCJEZWNyZWFzZVwiO1xuXG4vKipcbiAqIEEgbW9kZWwgYXNrZWQgZm9yIGEgYnJpZGdlIG9mdGVuIGJ1aWxkcyB0aGUgcnVubmluZyB0b3RhbCBpdHNlbGYgYW5kXG4gKiBoYW5kcyBiYWNrIGEgY3VtdWxhdGl2ZS1iYXNlIHNlcmllcyBhbG9uZ3NpZGUgdGhlIGRlbHRhcyAtIHdoaWNoXG4gKiByZW5kZXJzIGFzIHR3byBwbGFpbiBiYXIgc2VyaWVzLCBub3QgYSB3YXRlcmZhbGwgKHRoZSBiYXNlIGJhcnMgYXJlXG4gKiB0aGUgdGFsbCBvbmVzKS4gVGhlIGJhc2UgaXMgcmVjb2duaXphYmxlIGJ5IG5hbWUsIHNvIGl0IGlzIGRyb3BwZWRcbiAqIGhlcmUgYW5kIHRoZSBydW5uaW5nIHRvdGFsIHJlY29tcHV0ZWQgZnJvbSB0aGUgZGVsdGFzLlxuICovXG5jb25zdCBXQVRFUkZBTExfQkFTRV9OQU1FID0gL1xcYihiYXNlfGN1bXVsYXRpdmV8cnVubmluZ3xoZWxwZXJ8dG90YWx8c3RhcnQoaW5nKT8pXFxiL2k7XG5cbi8qKlxuICogUGljayB0aGUgc2lnbmVkLWRlbHRhIHNlcmllcyBvdXQgb2YgYSB3YXRlcmZhbGwgcGxhbiwgaWdub3JpbmcgYW55XG4gKiBjdW11bGF0aXZlLWJhc2Ugc2VyaWVzIHRoZSBwbGFubmVyIGJ1aWx0IGJ5IGhhbmRcbiAqICh7QGxpbmsgV0FURVJGQUxMX0JBU0VfTkFNRX0pLiBGYWxscyBiYWNrIHRvIHRoZSBmaXJzdCBzZXJpZXMgd2hlblxuICogZXZlcnkgbmFtZSBsb29rcyBsaWtlIGEgYmFzZSwgc2luY2UgZHJvcHBpbmcgdGhlbSBhbGwgd291bGQgbGVhdmVcbiAqIG5vdGhpbmcgdG8gcGxvdC5cbiAqL1xuZnVuY3Rpb24gd2F0ZXJmYWxsRGVsdGFTZXJpZXMoXG4gIHNlcmllczogQ2hhcnRQbGFuW1wic2VyaWVzXCJdLFxuKTogQ2hhcnRQbGFuW1wic2VyaWVzXCJdW251bWJlcl0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2VyaWVzLmZpbmQoKHMpID0+ICFXQVRFUkZBTExfQkFTRV9OQU1FLnRlc3Qocy5uYW1lKSkgPz8gc2VyaWVzWzBdO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBzdGFja2VkIHRyYW5zcGFyZW50LWJhc2UgKyBpbmNyZWFzZSArIGRlY3JlYXNlIHNlcmllcyB0aGF0XG4gKiBFY2hhcnRzIHVzZXMgZm9yIGEgd2F0ZXJmYWxsIChpdCBoYXMgbm8gbmF0aXZlIHdhdGVyZmFsbCB0eXBlKS5cbiAqIFZhbHVlcyBhcmUgc2lnbmVkIGRlbHRhczsgdGhlIHRyYW5zcGFyZW50IGhlbHBlciBjYXJyaWVzIHRoZSBydW5uaW5nXG4gKiB0b3RhbCBzbyBlYWNoIHZpc2libGUgYmFyIHN0YXJ0cyB3aGVyZSB0aGUgcHJldmlvdXMgb25lIGVuZGVkLlxuICpcbiAqIFRoZSBoZWxwZXIgaXMgYHNpbGVudGAsIHNvIHdpdGggYW4gaXRlbS10cmlnZ2VyZWQgdG9vbHRpcCBpdCBpc1xuICogaW52aXNpYmxlIHRvIGJvdGggdGhlIGV5ZSBhbmQgdGhlIHBvaW50ZXIgLSB0aGUgYWx0ZXJuYXRpdmUsIGFuIGF4aXNcbiAqIHRvb2x0aXAgdGhhdCBoaWRlcyB0aGUgaGVscGVyIHJvdywgbmVlZHMgYSBmdW5jdGlvbiBmb3JtYXR0ZXIsIGFuZFxuICogdGhpcyBzcGVjIGhhcyB0byBzdXJ2aXZlIEpTT04gc2VyaWFsaXphdGlvbiB0byB0aGUgYnJvd3Nlci5cbiAqL1xuZnVuY3Rpb24gd2F0ZXJmYWxsU2VyaWVzKHZhbHVlczogbnVtYmVyW10pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBoZWxwZXJzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBpbmNyZWFzZXM6IEFycmF5PG51bWJlciB8IFwiLVwiPiA9IFtdO1xuICBjb25zdCBkZWNyZWFzZXM6IEFycmF5PG51bWJlciB8IFwiLVwiPiA9IFtdO1xuICBsZXQgY3VtdWxhdGl2ZSA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgIGhlbHBlcnMucHVzaChjdW11bGF0aXZlKTtcbiAgICAgIGluY3JlYXNlcy5wdXNoKHZhbHVlKTtcbiAgICAgIGRlY3JlYXNlcy5wdXNoKFwiLVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVscGVycy5wdXNoKGN1bXVsYXRpdmUgKyB2YWx1ZSk7XG4gICAgICBpbmNyZWFzZXMucHVzaChcIi1cIik7XG4gICAgICBkZWNyZWFzZXMucHVzaCgtdmFsdWUpO1xuICAgIH1cbiAgICBjdW11bGF0aXZlICs9IHZhbHVlO1xuICB9XG4gIGNvbnN0IHRyYW5zcGFyZW50ID0geyBib3JkZXJDb2xvcjogXCJ0cmFuc3BhcmVudFwiLCBjb2xvcjogXCJ0cmFuc3BhcmVudFwiIH07XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0hFTFBFUl9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICBpdGVtU3R5bGU6IHRyYW5zcGFyZW50LFxuICAgICAgZW1waGFzaXM6IHsgaXRlbVN0eWxlOiB0cmFuc3BhcmVudCB9LFxuICAgICAgZGF0YTogaGVscGVycyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFdBVEVSRkFMTF9JTkNSRUFTRV9OQU1FLFxuICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgIHN0YWNrOiBcInRvdGFsXCIsXG4gICAgICBpdGVtU3R5bGU6IHsgY29sb3I6IFdBVEVSRkFMTF9JTkNSRUFTRV9DT0xPUiB9LFxuICAgICAgZGF0YTogaW5jcmVhc2VzLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogV0FURVJGQUxMX0RFQ1JFQVNFX05BTUUsXG4gICAgICB0eXBlOiBcImJhclwiLFxuICAgICAgc3RhY2s6IFwidG90YWxcIixcbiAgICAgIGl0ZW1TdHlsZTogeyBjb2xvcjogV0FURVJGQUxMX0RFQ1JFQVNFX0NPTE9SIH0sXG4gICAgICBkYXRhOiBkZWNyZWFzZXMsXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgYSB7QGxpbmsgQ2hhcnRQbGFufSBpbnRvIGEgZnVsbCBFY2hhcnRzIGBFQ2hhcnRzT3B0aW9uYFxuICogSlNPTi4gQ2VudHJhbGl6ZWQgaGVyZSBzbyB0aGUgcGxhbm5lciBhZ2VudCBvbmx5IGZpbGxzIGluIHRoZVxuICogY29tcGFjdCBwbGFuIHNoYXBlOyB0b29sdGlwIC8gYW5pbWF0aW9uIC8gY29sb3IgLyBncmlkIGRlZmF1bHRzXG4gKiBzdGF5IGNvbnNpc3RlbnQgYWNyb3NzIGNoYXJ0cyBhbmQgYXJlIGVhc3kgdG8gdHVuZSB3aXRob3V0XG4gKiByZXRyYWluaW5nIG1vZGVsIGJlaGF2aW91ci5cbiAqXG4gKiBXaGVuIGBicmFuZGAgaXMgc2V0LCB0aGUgcmVzb2x2ZWQgc3BlYyBpcyB0aGVtZWQgd2l0aCB0aGUgYnJhbmQncyBzZXJpZXNcbiAqIGNvbG9yIGN5Y2xlIGFuZCBiYXNlIHRleHQgc3R5bGUgKHNlZSB7QGxpbmsgYnJhbmRDaGFydFRoZW1lfSk7IG90aGVyd2lzZVxuICogRWNoYXJ0cycgZGVmYXVsdHMgYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGFuVG9FY2hhcnRzT3B0aW9uKFxuICBwbGFuOiBDaGFydFBsYW4sXG4gIGZhbGxiYWNrVGl0bGU6IHN0cmluZyxcbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IGJhc2VUaXRsZSA9IHBsYW4udGl0bGUgPz8gZmFsbGJhY2tUaXRsZTtcbiAgY29uc3QgZ3JpZCA9IHsgbGVmdDogNDgsIHJpZ2h0OiAyNCwgdG9wOiA1NiwgYm90dG9tOiA0OCwgY29udGFpbkxhYmVsOiB0cnVlIH07XG4gIGNvbnN0IHRoZW1lID0gYnJhbmQgPyBicmFuZENoYXJ0VGhlbWUoYnJhbmQpIDogdW5kZWZpbmVkO1xuICBjb25zdCB0aGVtZWQgPSAob3B0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gICAgdGhlbWUgPyB7IC4uLnRoZW1lLCAuLi5vcHRpb24gfSA6IG9wdGlvbjtcbiAgY29uc3QgdGl0bGUgPSB7IHRleHQ6IGJhc2VUaXRsZSwgbGVmdDogXCJjZW50ZXJcIiB9O1xuICBjb25zdCBsZWdlbmQgPSB7IGJvdHRvbTogMCB9O1xuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIC8vIFRoZSBvcHRpb24gYXJyaXZlcyBhcyBhIEpTT04gU1RSSU5HLCBub3QgYSBuZXN0ZWQgb2JqZWN0OiB0aGlzIHBsYW4gaXNcbiAgICAvLyB0aGUgcGxhbm5lcidzIHByb3ZpZGVyLWVuZm9yY2VkIHN0cnVjdHVyZWQgb3V0cHV0LCBhbmQgYSBmcmVlLWZvcm1cbiAgICAvLyBvYmplY3QgYmVjb21lcyBhbiB1bmNvbnN0cmFpbmVkIGBhZGRpdGlvbmFsUHJvcGVydGllc2Agc2NoZW1hIHRoYXRcbiAgICAvLyBzdHJpY3QgT3BlbkFJIGFuZCBHZW1pbmkgZW5kcG9pbnRzIHJlamVjdCAtIHdoaWNoIHdvdWxkIGJyZWFrIEVWRVJZXG4gICAgLy8gY2hhcnQsIG5vdCBqdXN0IHRoaXMgb25lIChzYW1lIGNsYXNzIG9mIGhhemFyZCBhcyB0aGUgYHByZWZpeEl0ZW1zYFxuICAgIC8vIG5vdGUgb24gYGNoYXJ0RGF0YVBvaW50U2NoZW1hYCkuIEEgbWFsZm9ybWVkIHN0cmluZyBjb3N0cyBvbmUgY2hhcnQuXG4gICAgLy8gTm90aGluZyBoZXJlIGlzIGV2YWwnZDsgYSBzdHJpbmctdmFsdWVkIEVjaGFydHMgZm9ybWF0dGVyIGlzIGFcbiAgICAvLyB0ZW1wbGF0ZSwgbm90IGNvZGUuXG4gICAgY29uc3Qgb3B0aW9uID0ganNvbi5wYXJzZVJlY29yZChwbGFuLm9wdGlvbik7XG4gICAgaWYgKCFvcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2hhcnRUeXBlIFwiY3VzdG9tXCIgbmVlZHMgYW4gYG9wdGlvbmAgaG9sZGluZyBhIEpTT04gb2JqZWN0Jyk7XG4gICAgfVxuICAgIC8vIFRpdGxlIGlzIHRoZSBvbmUgZGVmYXVsdCB3b3J0aCBmaWxsaW5nOiBldmVyeSBvdGhlciBicmFuY2ggZ3VhcmFudGVlc1xuICAgIC8vIG9uZSBhbmQgdGhlIHJlbmRlcmVyIHJlc2VydmVzIGdyaWQgc3BhY2UgZm9yIGl0LiBBIHRpdGxlIHRoZSBtb2RlbCBzZXRcbiAgICAvLyB3aW5zLCBhcyBkb2VzIGV2ZXJ5IG90aGVyIGZpZWxkIGl0IGRlY2xhcmVkLlxuICAgIHJldHVybiB0aGVtZWQoeyB0aXRsZSwgLi4ub3B0aW9uIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcInBpZVwiIHx8IHBsYW4uY2hhcnRUeXBlID09PSBcImZ1bm5lbFwiIHx8IHBsYW4uY2hhcnRUeXBlID09PSBcInRyZWVtYXBcIikge1xuICAgIGNvbnN0IHNsaWNlcyA9IG5hbWVkU2xpY2VzKHBsYW4uc2VyaWVzWzBdPy5kYXRhID8/IFtdKTtcbiAgICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGU7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZDogc2VyaWVzVHlwZSA9PT0gXCJ0cmVlbWFwXCIgPyB1bmRlZmluZWQgOiBsZWdlbmQsXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHBsYW4uc2VyaWVzWzBdPy5uYW1lID8/IGJhc2VUaXRsZSxcbiAgICAgICAgICB0eXBlOiBzZXJpZXNUeXBlLFxuICAgICAgICAgIC4uLihzZXJpZXNUeXBlID09PSBcInBpZVwiID8geyByYWRpdXM6IFtcIjM1JVwiLCBcIjY1JVwiXSB9IDoge30pLFxuICAgICAgICAgIC4uLihzZXJpZXNUeXBlID09PSBcImZ1bm5lbFwiID8geyBzb3J0OiBcImRlc2NlbmRpbmdcIiB9IDoge30pLFxuICAgICAgICAgIGRhdGE6IHNsaWNlcyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwic2NhdHRlclwiKSB7XG4gICAgLy8gRWNoYXJ0cyBjcmFzaGVzIG9uIG51bGwgc2NhdHRlciBwb2ludHMgLSBrZWVwIG9ubHkgdmFsaWRcbiAgICAvLyBgW3gsIHldYCB0dXBsZXMuIEJhcmUgbnVtYmVycyAvIG9iamVjdHMgLyBudWxscyBmcm9tIGFcbiAgICAvLyBtaXNtYXRjaGVkIHBsYW4gZ2V0IGRyb3BwZWQgc2lsZW50bHkuXG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJpdGVtXCIgfSxcbiAgICAgIGxlZ2VuZCxcbiAgICAgIGdyaWQsXG4gICAgICB4QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCB9LFxuICAgICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiAoe1xuICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgIHR5cGU6IFwic2NhdHRlclwiLFxuICAgICAgICBkYXRhOiBzY2F0dGVyUG9pbnRzKHMuZGF0YSksXG4gICAgICB9KSksXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwiaGVhdG1hcFwiKSB7XG4gICAgY29uc3QgeyBjZWxscywgeUNhdGVnb3JpZXMgfSA9IGhlYXRtYXBNYXRyaXgocGxhbik7XG4gICAgY29uc3QgdmFsdWVzID0gY2VsbHMubWFwKChjKSA9PiBjWzJdKTtcbiAgICBjb25zdCBtaW4gPSB2YWx1ZXMubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLnZhbHVlcykgOiAwO1xuICAgIGNvbnN0IG1heCA9IHZhbHVlcy5sZW5ndGggPiAwID8gTWF0aC5tYXgoLi4udmFsdWVzKSA6IDE7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIHRvb2x0aXA6IHsgcG9zaXRpb246IFwidG9wXCIgfSxcbiAgICAgIC8vIFRoZSB2aXN1YWxNYXAgcmFtcCBzaXRzIGJlbG93IHRoZSBwbG90LCBzbyB0aGUgZ3JpZCBnaXZlcyB1cFxuICAgICAgLy8gbW9yZSBib3R0b20gcm9vbSB0aGFuIGFuIGF4aXMtb25seSBjaGFydCBuZWVkcy5cbiAgICAgIGdyaWQ6IHsgLi4uZ3JpZCwgYm90dG9tOiA3MiB9LFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgICAgc3BsaXRBcmVhOiB7IHNob3c6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgICB5QXhpczoge1xuICAgICAgICB0eXBlOiBcImNhdGVnb3J5XCIsXG4gICAgICAgIGRhdGE6IHlDYXRlZ29yaWVzLFxuICAgICAgICBuYW1lOiBwbGFuLnlBeGlzTGFiZWwsXG4gICAgICAgIHNwbGl0QXJlYTogeyBzaG93OiB0cnVlIH0sXG4gICAgICB9LFxuICAgICAgdmlzdWFsTWFwOiB7XG4gICAgICAgIC8vIEVjaGFydHMgaGlkZXMgZXZlcnkgY2VsbCB3aGVuIG1pbiA9PT0gbWF4IChhIHVuaWZvcm0gbWF0cml4KSxcbiAgICAgICAgLy8gc28gYSBkZWdlbmVyYXRlIHJhbmdlIGlzIHdpZGVuZWQgYnkgb25lLlxuICAgICAgICBtaW4sXG4gICAgICAgIG1heDogbWF4ID4gbWluID8gbWF4IDogbWluICsgMSxcbiAgICAgICAgY2FsY3VsYWJsZTogdHJ1ZSxcbiAgICAgICAgb3JpZW50OiBcImhvcml6b250YWxcIixcbiAgICAgICAgbGVmdDogXCJjZW50ZXJcIixcbiAgICAgICAgYm90dG9tOiA4LFxuICAgICAgICBpblJhbmdlOiB7IGNvbG9yOiBIRUFUTUFQX1JBTVAgfSxcbiAgICAgIH0sXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHBsYW4uc2VyaWVzWzBdPy5uYW1lID8/IGJhc2VUaXRsZSxcbiAgICAgICAgICB0eXBlOiBcImhlYXRtYXBcIixcbiAgICAgICAgICBkYXRhOiBjZWxscyxcbiAgICAgICAgICAvLyBQcmludGVkIGNlbGwgdmFsdWVzIGFyZSB1bnJlYWRhYmxlIG9uY2UgdGhlIGdyaWQgaXMgZGVuc2UuXG4gICAgICAgICAgbGFiZWw6IHsgc2hvdzogY2VsbHMubGVuZ3RoIDw9IEhFQVRNQVBfTEFCRUxfTUFYX0NFTExTIH0sXG4gICAgICAgICAgZW1waGFzaXM6IHsgaXRlbVN0eWxlOiB7IHNoYWRvd0JsdXI6IDEwLCBzaGFkb3dDb2xvcjogXCJyZ2JhKDAsIDAsIDAsIDAuMylcIiB9IH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcInJhZGFyXCIpIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gKHBsYW4uY2F0ZWdvcmllcyA/PyBbXSkubWFwKChuYW1lLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcGVhayA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICAuLi5wbGFuLnNlcmllcy5tYXAoKHMpID0+IHtcbiAgICAgICAgICBjb25zdCBudW1zID0gbnVtZXJpY1BvaW50cyhzLmRhdGEpO1xuICAgICAgICAgIHJldHVybiBudW1zW2luZGV4XSA/PyAwO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBuYW1lLCBtYXg6IHBlYWsgPiAwID8gcGVhayA6IDEgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcIml0ZW1cIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgcmFkYXI6IHsgaW5kaWNhdG9yOiBpbmRpY2F0b3JzIH0sXG4gICAgICBzZXJpZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwicmFkYXJcIixcbiAgICAgICAgICBkYXRhOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogbnVtZXJpY1BvaW50cyhzLmRhdGEpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAocGxhbi5jaGFydFR5cGUgPT09IFwid2F0ZXJmYWxsXCIpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBudW1lcmljUG9pbnRzKHdhdGVyZmFsbERlbHRhU2VyaWVzKHBsYW4uc2VyaWVzKT8uZGF0YSA/PyBbXSk7XG4gICAgcmV0dXJuIHRoZW1lZCh7XG4gICAgICB0aXRsZSxcbiAgICAgIC8vIEl0ZW0tdHJpZ2dlcmVkIHNvIHRoZSB0cmFuc3BhcmVudCBgc2lsZW50YCBvZmZzZXQgYmFycyBuZXZlclxuICAgICAgLy8gc3VyZmFjZSBpbiBhIHRvb2x0aXAgKHNlZSBgd2F0ZXJmYWxsU2VyaWVzYCkuXG4gICAgICB0b29sdGlwOiB7IHRyaWdnZXI6IFwiaXRlbVwiIH0sXG4gICAgICAvLyBPbmx5IHRoZSB0d28gdmlzaWJsZSBzdGVwcyBiZWxvbmcgaW4gdGhlIGxlZ2VuZC5cbiAgICAgIGxlZ2VuZDogeyAuLi5sZWdlbmQsIGRhdGE6IFtXQVRFUkZBTExfSU5DUkVBU0VfTkFNRSwgV0FURVJGQUxMX0RFQ1JFQVNFX05BTUVdIH0sXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHtcbiAgICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgICBkYXRhOiBwbGFuLmNhdGVnb3JpZXMgPz8gW10sXG4gICAgICAgIG5hbWU6IHBsYW4ueEF4aXNMYWJlbCxcbiAgICAgIH0sXG4gICAgICB5QXhpczogeyB0eXBlOiBcInZhbHVlXCIsIG5hbWU6IHBsYW4ueUF4aXNMYWJlbCB9LFxuICAgICAgc2VyaWVzOiB3YXRlcmZhbGxTZXJpZXModmFsdWVzKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwbGFuLmNoYXJ0VHlwZSA9PT0gXCJob3Jpem9udGFsQmFyXCIpIHtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiwgYXhpc1BvaW50ZXI6IHsgdHlwZTogXCJzaGFkb3dcIiB9IH0sXG4gICAgICBsZWdlbmQsXG4gICAgICBncmlkLFxuICAgICAgeEF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnhBeGlzTGFiZWwgfSxcbiAgICAgIHlBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnlBeGlzTGFiZWwsXG4gICAgICB9LFxuICAgICAgc2VyaWVzOiBwbGFuLnNlcmllcy5tYXAoKHMpID0+ICh7XG4gICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgdHlwZTogXCJiYXJcIixcbiAgICAgICAgZGF0YTogcy5kYXRhLFxuICAgICAgfSkpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBsYW4uY2hhcnRUeXBlID09PSBcImNvbWJvXCIpIHtcbiAgICBjb25zdCB1c2VzUmlnaHRBeGlzID0gcGxhbi5zZXJpZXMuc29tZSgocykgPT4gcy55QXhpc0luZGV4ID09PSAxKTtcbiAgICByZXR1cm4gdGhlbWVkKHtcbiAgICAgIHRpdGxlLFxuICAgICAgdG9vbHRpcDogeyB0cmlnZ2VyOiBcImF4aXNcIiB9LFxuICAgICAgbGVnZW5kLFxuICAgICAgZ3JpZCxcbiAgICAgIHhBeGlzOiB7XG4gICAgICAgIHR5cGU6IFwiY2F0ZWdvcnlcIixcbiAgICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgICBuYW1lOiBwbGFuLnhBeGlzTGFiZWwsXG4gICAgICB9LFxuICAgICAgeUF4aXM6IHVzZXNSaWdodEF4aXNcbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogcGxhbi55QXhpc0xhYmVsIH0sXG4gICAgICAgICAgICB7IHR5cGU6IFwidmFsdWVcIiwgbmFtZTogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgXVxuICAgICAgICA6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICAgIHNlcmllczogcGxhbi5zZXJpZXMubWFwKChzKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSBzLnR5cGUgPz8gXCJiYXJcIjtcbiAgICAgICAgY29uc3Qgc2VyaWVzVHlwZSA9IG1hcmsgPT09IFwiYXJlYVwiID8gXCJsaW5lXCIgOiBtYXJrO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgICAgICB0eXBlOiBzZXJpZXNUeXBlLFxuICAgICAgICAgIGRhdGE6IHMuZGF0YSxcbiAgICAgICAgICB5QXhpc0luZGV4OiBzLnlBeGlzSW5kZXggPz8gMCxcbiAgICAgICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgICAgIC4uLihtYXJrID09PSBcImFyZWFcIiA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBiYXIgLyBsaW5lIC8gYXJlYSBzaGFyZSB0aGUgc2FtZSBheGlzIGxheW91dC5cbiAgY29uc3QgaXNBcmVhID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYXJlYVwiO1xuICBjb25zdCBzZXJpZXNUeXBlID0gcGxhbi5jaGFydFR5cGUgPT09IFwiYmFyXCIgPyBcImJhclwiIDogXCJsaW5lXCI7XG4gIHJldHVybiB0aGVtZWQoe1xuICAgIHRpdGxlLFxuICAgIHRvb2x0aXA6IHsgdHJpZ2dlcjogXCJheGlzXCIgfSxcbiAgICBsZWdlbmQsXG4gICAgZ3JpZCxcbiAgICB4QXhpczoge1xuICAgICAgdHlwZTogXCJjYXRlZ29yeVwiLFxuICAgICAgZGF0YTogcGxhbi5jYXRlZ29yaWVzID8/IFtdLFxuICAgICAgbmFtZTogcGxhbi54QXhpc0xhYmVsLFxuICAgIH0sXG4gICAgeUF4aXM6IHsgdHlwZTogXCJ2YWx1ZVwiLCBuYW1lOiBwbGFuLnlBeGlzTGFiZWwgfSxcbiAgICBzZXJpZXM6IHBsYW4uc2VyaWVzLm1hcCgocykgPT4gKHtcbiAgICAgIG5hbWU6IHMubmFtZSxcbiAgICAgIHR5cGU6IHNlcmllc1R5cGUsXG4gICAgICBkYXRhOiBzLmRhdGEsXG4gICAgICBzbW9vdGg6IHNlcmllc1R5cGUgPT09IFwibGluZVwiLFxuICAgICAgLi4uKGlzQXJlYSA/IHsgYXJlYVN0eWxlOiB7fSB9IDoge30pLFxuICAgIH0pKSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlbmRlcl9kYXRhIHRvb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHJlbmRlcl9kYXRhYCBNYXN0cmEgdG9vbCBib3VuZCB0byB0aGUgZ2l2ZW4gcGx1Z2luXG4gKiBjb25maWcuIEF1dG8td2lyZWQgYXMgYSBzeXN0ZW0gdG9vbCBvbiBldmVyeSBhZ2VudCAoc2VlXG4gKiBgYWdlbnRzLnRzYCk7IHBlci1hZ2VudCB0b29scyBjYW4gc2hhZG93IGl0IGJ5IHJlZ2lzdGVyaW5nIGFcbiAqIHNhbWUtbmFtZWQgZW50cnkuXG4gKlxuICogVGhpbiB3cmFwcGVyIG92ZXIge0BsaW5rIHByZXBhcmVDaGFydH0gZm9yIGNhbGxlcnMgdGhhdCBhbHJlYWR5XG4gKiBoYXZlIGEgZGF0YXNldCBpbiBoYW5kLiBNaW50cyBhIGBjaGFydElkYCBzeW5jaHJvbm91c2x5LCBjYWNoZXNcbiAqIGFuIGVtcHR5IHBsYWNlaG9sZGVyLCBhbmQga2lja3Mgb2ZmIHRoZSBjaGFydC1wbGFubmVyIGluIHRoZVxuICogYmFja2dyb3VuZC4gUmV0dXJucyB0aGUgYGNoYXJ0SWRgIHBsdXMgaXRzIHJlYWR5LXRvLWNvcHkgYG1hcmtlcmA7IHRoZSBob3N0XG4gKiBVSSByZXNvbHZlcyB0aGF0IG1hcmtlciB0aHJvdWdoIHRoZSBwbHVnaW4ncyBgL2VtYmVkL2NoYXJ0LzppZGAgcm91dGUuXG4gKlxuICogRm9yIEdlbmllIHN0YXRlbWVudCByZXN1bHRzLCBwcmVmZXIgdGhlIEdlbmllIGFnZW50J3NcbiAqIGBwcmVwYXJlX2NoYXJ0YCB0b29sLCB3aGljaCBhY2NlcHRzIGEgYHN0YXRlbWVudF9pZGAgYW5kXG4gKiByZXNvbHZlcyB0aGUgcm93cyBsYXppbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlbmRlckRhdGFUb29sKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKSB7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogXCJyZW5kZXJfZGF0YVwiLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihbXG4gICAgICBgXG4gICAgICAgIFN1Ym1pdCBhIHRhYnVsYXIgZGF0YXNldCBmb3IgaW5saW5lIHJlbmRlcmluZyBhcyBhIGNoYXJ0IGluXG4gICAgICAgIHRoZSB1c2VyJ3Mgdmlldy4gUGFzcyBhIHRpdGxlLCB0aGUgcmF3IHJvd3MgKGFycmF5IG9mIG9iamVjdHNcbiAgICAgICAga2V5ZWQgYnkgY29sdW1uIG5hbWUpLCBhbmQgYW4gb3B0aW9uYWwgb25lLWxpbmUgZGVzY3JpcHRpb25cbiAgICAgICAgb2YgdGhlIGluc2lnaHQgdG8gaGlnaGxpZ2h0LiBSZXR1cm5zIFxcYGNoYXJ0SWRcXGAgcGx1cyB0aGVcbiAgICAgICAgY29tcGxldGUgXFxgbWFya2VyXFxgOyBjb3B5IHRoZSByZXR1cm5lZCBtYXJrZXIgVkVSQkFUSU0gb250b1xuICAgICAgICBpdHMgb3duIGxpbmUgd2hlcmUgdGhlIGNoYXJ0IHNob3VsZCByZW5kZXIuIE5ldmVyIGNvbnN0cnVjdCxcbiAgICAgICAgYWx0ZXIsIG9yIGludmVudCBhIGNoYXJ0IG1hcmtlciB5b3Vyc2VsZi5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFBsYWNlbWVudCBjb250cmFjdDogZW1iZWQgdGhlIHJldHVybmVkIFxcYG1hcmtlclxcYCBvbiBpdHMgb3duXG4gICAgICAgIGxpbmUgKGJsYW5rIGxpbmVzIGFib3ZlIGFuZCBiZWxvdykgd2hlcmV2ZXIgeW91IHdhbnQgdGhlIGNoYXJ0XG4gICAgICAgIHRvIGFwcGVhciBpbiB5b3VyIHJlcGx5LiBUaGUgY2hhcnQgcmVzb2x2ZXNcbiAgICAgICAgYXN5bmNocm9ub3VzbHkgLSB0aGUgdG9vbCByZXR1cm5zIHRoZSBpZCBpbW1lZGlhdGVseSBhbmQgdGhlXG4gICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2hhcnQgZnJvbSB0aGUgY2FjaGUgb25jZSB0aGUgcGxhbm5lclxuICAgICAgICBsYW5kcy4gWW91IGNhbiBjYWxsIFxcYHJlbmRlcl9kYXRhXFxgIG11bHRpcGxlIHRpbWVzIGluIHRoZVxuICAgICAgICBzYW1lIHR1cm4gKHRoZSB0b29sIGlzIHBhcmFsbGVsLXNhZmUpIGFuZCBpbnRlcmxlYXZlIHRoZVxuICAgICAgICBtYXJrZXJzIHdpdGggcHJvc2Ugc28gZWFjaCBjaGFydCBzaXRzIG5leHQgdG8gaXRzXG4gICAgICAgIGNvbW1lbnRhcnkuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBVc2Ugd2hlbmV2ZXIgYSBTUUwgcm93IHNldCwgQVBJIHJlc3BvbnNlLCBvciBoYW5kLWJ1aWx0XG4gICAgICAgIGRhdGFzZXQgd291bGQgbGFuZCBiZXR0ZXIgYXMgYSBwaWN0dXJlIHRoYW4gYXMgYSBsaXN0IG9yXG4gICAgICAgIHRhYmxlLiBDYXAgaW5wdXQgYXQgYSBmZXcgaHVuZHJlZCByb3dzOyBzYW1wbGUgb3IgYWdncmVnYXRlXG4gICAgICAgIGxhcmdlciBkYXRhc2V0cyBmaXJzdC5cbiAgICAgIGAsXG4gICAgXSksXG4gICAgaW5wdXRTY2hlbWE6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsXG4gICAgb3V0cHV0U2NoZW1hOiBjaGFydFRvb2xPdXRwdXRTY2hlbWEsXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IHsgdGl0bGUsIGRlc2NyaXB0aW9uLCBkYXRhIH0gPSBpbnB1dCBhcyBDaGFydFBsYW5uZXJSZXF1ZXN0O1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIHsgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dCB9IHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkoY3R4Py5yZXF1ZXN0Q29udGV4dCksXG4gICAgICAgIHRpdGxlLFxuICAgICAgICAuLi4oZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoeyByb3dzOiBkYXRhIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
|