@pipeline-builder/pipeline-data 4.1.24 → 4.1.26
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/lib/api/alert-destinations.d.ts +17 -0
- package/lib/api/alert-destinations.js +36 -0
- package/lib/api/reporting/analytics-queries.d.ts +274 -0
- package/lib/api/reporting/analytics-queries.js +598 -0
- package/lib/api/reporting/daily-rollup.d.ts +41 -0
- package/lib/api/reporting/daily-rollup.js +173 -0
- package/lib/api/reporting/deploy-rollup.d.ts +78 -0
- package/lib/api/reporting/deploy-rollup.js +203 -0
- package/lib/api/reporting/dora-scoring.d.ts +14 -0
- package/lib/api/reporting/dora-scoring.js +25 -1
- package/lib/api/reporting/dora.js +30 -6
- package/lib/api/reporting/failure-classifier.d.ts +54 -0
- package/lib/api/reporting/failure-classifier.js +179 -0
- package/lib/api/reporting/ingest.d.ts +2 -2
- package/lib/api/reporting/ingest.js +129 -4
- package/lib/api/reporting/last-deploy.d.ts +31 -0
- package/lib/api/reporting/last-deploy.js +93 -0
- package/lib/api/reporting/needs-attention.d.ts +93 -0
- package/lib/api/reporting/needs-attention.js +152 -0
- package/lib/api/reporting/plugin-exposure.d.ts +129 -0
- package/lib/api/reporting/plugin-exposure.js +312 -0
- package/lib/api/reporting/retention-sweep.js +9 -1
- package/lib/api/reporting/sql-helpers.d.ts +35 -2
- package/lib/api/reporting/sql-helpers.js +39 -1
- package/lib/api/reporting/stakeholder/compose.d.ts +115 -0
- package/lib/api/reporting/stakeholder/compose.js +234 -0
- package/lib/api/reporting/stakeholder/index.d.ts +14 -0
- package/lib/api/reporting/stakeholder/index.js +17 -0
- package/lib/api/reporting/stakeholder/period.d.ts +102 -0
- package/lib/api/reporting/stakeholder/period.js +273 -0
- package/lib/api/reporting/stakeholder/report-html.d.ts +93 -0
- package/lib/api/reporting/stakeholder/report-html.js +208 -0
- package/lib/api/reporting/stakeholder/sections.d.ts +117 -0
- package/lib/api/reporting/stakeholder/sections.js +249 -0
- package/lib/api/reporting/stakeholder/store.d.ts +450 -0
- package/lib/api/reporting/stakeholder/store.js +981 -0
- package/lib/api/reporting/stakeholder/templates.d.ts +21 -0
- package/lib/api/reporting/stakeholder/templates.js +104 -0
- package/lib/api/reporting/types.d.ts +73 -0
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/reporting-service.d.ts +94 -5
- package/lib/api/reporting-service.js +169 -10
- package/lib/api/soft-delete-sweep.d.ts +11 -2
- package/lib/api/soft-delete-sweep.js +17 -6
- package/lib/database/drizzle-schema.d.ts +2244 -385
- package/lib/database/drizzle-schema.js +18 -7
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +4 -2
- package/lib/database/schema/compliance.d.ts +0 -682
- package/lib/database/schema/compliance.js +6 -66
- package/lib/database/schema/ecosystem.d.ts +20 -157
- package/lib/database/schema/ecosystem.js +23 -16
- package/lib/database/schema/pipeline.d.ts +200 -0
- package/lib/database/schema/pipeline.js +100 -1
- package/lib/database/schema/plugin.d.ts +20 -1
- package/lib/database/schema/plugin.js +13 -1
- package/lib/database/schema/reporting-analytics.d.ts +1212 -0
- package/lib/database/schema/reporting-analytics.js +250 -0
- package/lib/database/schema/reporting-stakeholder.d.ts +1373 -0
- package/lib/database/schema/reporting-stakeholder.js +251 -0
- package/lib/index.d.ts +10 -1
- package/lib/index.js +15 -1
- package/lib/testing/exports.json +67 -4
- package/package.json +4 -3
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Ids that would rank or compare INDIVIDUAL people. Refused at registration.
|
|
5
|
+
*
|
|
6
|
+
* Team-level metrics describe a system; per-person metrics describe a person, and
|
|
7
|
+
* a report a manager reads is the worst possible place for the second. Once a
|
|
8
|
+
* developer believes the weekly report ranks them, the numbers start being gamed
|
|
9
|
+
* and the report stops describing reality.
|
|
10
|
+
*/
|
|
11
|
+
const PER_PERSON_MARKERS = ['author', 'committer', 'developer', 'person', 'user', 'individual', 'by_member', 'per_member'];
|
|
12
|
+
/** Throws when a section id looks per-person. */
|
|
13
|
+
function assertNotPerPerson(id) {
|
|
14
|
+
const lowered = id.toLowerCase();
|
|
15
|
+
const hit = PER_PERSON_MARKERS.find((m) => lowered.includes(m));
|
|
16
|
+
if (hit) {
|
|
17
|
+
throw new Error(`Refusing to register report section "${id}": it looks per-person ("${hit}"). `
|
|
18
|
+
+ 'Stakeholder reports are team-level by design — ranking individuals in a report a '
|
|
19
|
+
+ 'manager reads destroys trust in every other number in it. Aggregate to the team.');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** The scope every analytics query takes, from the section context. */
|
|
23
|
+
function scopeOf(c) {
|
|
24
|
+
return { orgId: c.orgId, ...(c.orgIds ? { orgIds: c.orgIds } : {}), from: c.from, to: c.to };
|
|
25
|
+
}
|
|
26
|
+
/** The previous period, when the context carries one (for the trend columns). */
|
|
27
|
+
function previousOf(c) {
|
|
28
|
+
return c.previousFrom && c.previousTo ? { from: c.previousFrom, to: c.previousTo } : undefined;
|
|
29
|
+
}
|
|
30
|
+
const REGISTRY = new Map();
|
|
31
|
+
/** Register a section. Throws on a duplicate id or a per-person one. */
|
|
32
|
+
export function registerSection(spec) {
|
|
33
|
+
assertNotPerPerson(spec.id);
|
|
34
|
+
if (REGISTRY.has(spec.id))
|
|
35
|
+
throw new Error(`Duplicate report section id: ${spec.id}`);
|
|
36
|
+
REGISTRY.set(spec.id, spec);
|
|
37
|
+
return spec;
|
|
38
|
+
}
|
|
39
|
+
/** Look a section up; undefined when the id is unknown. */
|
|
40
|
+
export function getSection(id) {
|
|
41
|
+
return REGISTRY.get(id);
|
|
42
|
+
}
|
|
43
|
+
/** Every registered section, in registration order. */
|
|
44
|
+
export function allSections() {
|
|
45
|
+
return [...REGISTRY.values()];
|
|
46
|
+
}
|
|
47
|
+
/** The ids a caller may put in a definition. */
|
|
48
|
+
export function sectionIds() {
|
|
49
|
+
return [...REGISTRY.keys()];
|
|
50
|
+
}
|
|
51
|
+
// ── Delivery ────────────────────────────────────────────────────────────────
|
|
52
|
+
registerSection({
|
|
53
|
+
id: 'execution_count',
|
|
54
|
+
title: 'Pipeline runs',
|
|
55
|
+
comparable: true,
|
|
56
|
+
run: (s, c) => s.getExecutionCount(c.orgId, c.orgIds, { from: c.from, to: c.to }),
|
|
57
|
+
});
|
|
58
|
+
registerSection({
|
|
59
|
+
id: 'success_rate',
|
|
60
|
+
title: 'Success rate',
|
|
61
|
+
comparable: true,
|
|
62
|
+
run: (s, c) => s.getSuccessRate(c.orgId, 'week', c.from, c.to, c.orgIds, { tz: c.tz, weekStart: c.weekStart }),
|
|
63
|
+
});
|
|
64
|
+
registerSection({
|
|
65
|
+
id: 'duration',
|
|
66
|
+
title: 'Run duration',
|
|
67
|
+
comparable: true,
|
|
68
|
+
run: (s, c) => s.getAverageDuration(c.orgId, c.from, c.to, c.orgIds),
|
|
69
|
+
});
|
|
70
|
+
// ── What is blocking us ─────────────────────────────────────────────────────
|
|
71
|
+
registerSection({
|
|
72
|
+
id: 'stage_failures',
|
|
73
|
+
title: 'Top failing stages',
|
|
74
|
+
// A list, not a number: "change" on a top-N list is meaningless.
|
|
75
|
+
comparable: false,
|
|
76
|
+
run: (s, c) => s.getStageFailures(c.orgId, c.from, c.to, c.orgIds),
|
|
77
|
+
});
|
|
78
|
+
registerSection({
|
|
79
|
+
id: 'stage_bottlenecks',
|
|
80
|
+
title: 'Slowest stages',
|
|
81
|
+
comparable: false,
|
|
82
|
+
run: (s, c) => s.getStageBottlenecks(c.orgId, c.from, c.to, c.orgIds),
|
|
83
|
+
});
|
|
84
|
+
registerSection({
|
|
85
|
+
id: 'action_failures',
|
|
86
|
+
title: 'Top failing steps',
|
|
87
|
+
comparable: false,
|
|
88
|
+
run: (s, c) => s.getActionFailures(c.orgId, c.from, c.to, c.orgIds),
|
|
89
|
+
});
|
|
90
|
+
registerSection({
|
|
91
|
+
id: 'errors',
|
|
92
|
+
title: 'Recent failures',
|
|
93
|
+
comparable: false,
|
|
94
|
+
// Capped: a manager reads the top few, and the snapshot is stored forever.
|
|
95
|
+
run: (s, c) => s.getErrors(c.orgId, c.from, c.to, 10, c.orgIds),
|
|
96
|
+
});
|
|
97
|
+
// ── Plugin / supply-chain posture ───────────────────────────────────────────
|
|
98
|
+
registerSection({
|
|
99
|
+
id: 'plugin_summary',
|
|
100
|
+
title: 'Plugins in use',
|
|
101
|
+
comparable: true,
|
|
102
|
+
run: (s, c) => s.getPluginSummary(c.orgId),
|
|
103
|
+
});
|
|
104
|
+
registerSection({
|
|
105
|
+
id: 'plugin_distribution',
|
|
106
|
+
title: 'Plugin mix',
|
|
107
|
+
comparable: false,
|
|
108
|
+
run: (s, c) => s.getPluginDistribution(c.orgId),
|
|
109
|
+
});
|
|
110
|
+
registerSection({
|
|
111
|
+
id: 'plugin_versions',
|
|
112
|
+
title: 'Outdated plugins',
|
|
113
|
+
comparable: true,
|
|
114
|
+
run: (s, c) => s.getPluginVersions(c.orgId),
|
|
115
|
+
});
|
|
116
|
+
// ── Build health ────────────────────────────────────────────────────────────
|
|
117
|
+
registerSection({
|
|
118
|
+
id: 'build_success_rate',
|
|
119
|
+
title: 'Plugin build success',
|
|
120
|
+
comparable: true,
|
|
121
|
+
run: (s, c) => s.getBuildSuccessRate(c.orgId, 'week', c.from, c.to, c.orgIds, { tz: c.tz, weekStart: c.weekStart }),
|
|
122
|
+
});
|
|
123
|
+
registerSection({
|
|
124
|
+
id: 'build_duration',
|
|
125
|
+
title: 'Plugin build duration',
|
|
126
|
+
comparable: true,
|
|
127
|
+
run: (s, c) => s.getBuildDuration(c.orgId, c.from, c.to, c.orgIds),
|
|
128
|
+
});
|
|
129
|
+
registerSection({
|
|
130
|
+
id: 'build_failures',
|
|
131
|
+
title: 'Plugin build failures',
|
|
132
|
+
comparable: false,
|
|
133
|
+
run: (s, c) => s.getBuildFailures(c.orgId, c.from, c.to, 10, c.orgIds),
|
|
134
|
+
});
|
|
135
|
+
// ── Deploy / DORA (paid) ────────────────────────────────────────────────────
|
|
136
|
+
// These need `advanced_reporting`. Without it the composer renders a locked
|
|
137
|
+
// section and the rest of the report still delivers.
|
|
138
|
+
registerSection({
|
|
139
|
+
id: 'dora',
|
|
140
|
+
title: 'Delivery metrics (DORA)',
|
|
141
|
+
requiresFeature: 'advanced_reporting',
|
|
142
|
+
comparable: true,
|
|
143
|
+
run: (s, c) => s.getDoraMetrics(c.orgId, c.from, c.to, c.orgIds),
|
|
144
|
+
});
|
|
145
|
+
registerSection({
|
|
146
|
+
id: 'dora_trend',
|
|
147
|
+
title: 'Delivery trend',
|
|
148
|
+
requiresFeature: 'advanced_reporting',
|
|
149
|
+
comparable: false,
|
|
150
|
+
run: (s, c) => s.getDoraTrend(c.orgId, 'week', c.from, c.to, c.orgIds, { tz: c.tz, weekStart: c.weekStart }),
|
|
151
|
+
});
|
|
152
|
+
registerSection({
|
|
153
|
+
id: 'environments',
|
|
154
|
+
title: 'Deploy environments',
|
|
155
|
+
comparable: false,
|
|
156
|
+
run: (s, c) => s.getReportEnvironments(c.orgId, c.from, c.to, c.orgIds),
|
|
157
|
+
});
|
|
158
|
+
// ── The analytics sections ──────────────────────────────────────────────────
|
|
159
|
+
// Each reads a pre-aggregated table rather than raw events, and each answers a
|
|
160
|
+
// question the on-demand dashboards do not: not "how are we doing" but "what
|
|
161
|
+
// should somebody do about it".
|
|
162
|
+
registerSection({
|
|
163
|
+
id: 'pipeline_breakdown',
|
|
164
|
+
title: 'Pipelines needing the most attention',
|
|
165
|
+
comparable: false,
|
|
166
|
+
run: (s, c) => s.getPipelineBreakdown(scopeOf(c), 10),
|
|
167
|
+
});
|
|
168
|
+
/**
|
|
169
|
+
* The section that DECIDES rather than describes. Its findings carry the number
|
|
170
|
+
* behind them, because a flag without evidence is an opinion the reader has to take
|
|
171
|
+
* on trust — and the first time one is wrong the section stops being read.
|
|
172
|
+
*/
|
|
173
|
+
registerSection({
|
|
174
|
+
id: 'needs_attention',
|
|
175
|
+
title: 'Needs attention',
|
|
176
|
+
comparable: false,
|
|
177
|
+
run: (s, c) => (s.getNeedsAttention
|
|
178
|
+
? s.getNeedsAttention(scopeOf(c), previousOf(c))
|
|
179
|
+
: Promise.resolve({ items: [], unavailable: 'needs-attention evaluation is not wired in this context' })),
|
|
180
|
+
});
|
|
181
|
+
registerSection({
|
|
182
|
+
id: 'failure_analysis',
|
|
183
|
+
title: 'What is breaking',
|
|
184
|
+
comparable: false,
|
|
185
|
+
run: (s, c) => s.getFailureAnalysis(scopeOf(c), previousOf(c)),
|
|
186
|
+
});
|
|
187
|
+
registerSection({
|
|
188
|
+
id: 'stage_performance',
|
|
189
|
+
title: 'Slowest stages',
|
|
190
|
+
comparable: false,
|
|
191
|
+
// The worst pipeline from the breakdown is the one worth drilling into; a
|
|
192
|
+
// section that asked for a pipeline id would have nothing to put in it on a
|
|
193
|
+
// scheduled run, where there is no user to pick one.
|
|
194
|
+
run: async (s, c) => {
|
|
195
|
+
const breakdown = await s.getPipelineBreakdown(scopeOf(c), 1);
|
|
196
|
+
const worst = breakdown[0]?.pipelineId;
|
|
197
|
+
if (!worst)
|
|
198
|
+
return { stages: [], pipelineId: null };
|
|
199
|
+
return { pipelineId: worst, stages: await s.getStagePerformance(scopeOf(c), worst, previousOf(c)) };
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
registerSection({
|
|
203
|
+
id: 'promotion',
|
|
204
|
+
title: 'What reached production, and what did not',
|
|
205
|
+
comparable: false,
|
|
206
|
+
run: (s, c) => s.getPromotionView(scopeOf(c)),
|
|
207
|
+
});
|
|
208
|
+
registerSection({
|
|
209
|
+
id: 'resource_consumption',
|
|
210
|
+
title: 'Where the build time went',
|
|
211
|
+
comparable: false,
|
|
212
|
+
run: (s, c) => s.getResourceConsumption(scopeOf(c), 20),
|
|
213
|
+
});
|
|
214
|
+
registerSection({
|
|
215
|
+
id: 'outdated_plugins',
|
|
216
|
+
title: 'Plugins behind their latest version',
|
|
217
|
+
comparable: false,
|
|
218
|
+
run: (s, c) => s.getOutdatedPlugins(scopeOf(c), 50),
|
|
219
|
+
});
|
|
220
|
+
registerSection({
|
|
221
|
+
id: 'plugin_vulnerabilities',
|
|
222
|
+
title: 'Plugin vulnerabilities',
|
|
223
|
+
comparable: false,
|
|
224
|
+
run: (s, c) => s.getPluginVulnerabilities(scopeOf(c), 50),
|
|
225
|
+
});
|
|
226
|
+
registerSection({
|
|
227
|
+
id: 'adoption',
|
|
228
|
+
title: 'Adoption and coverage',
|
|
229
|
+
comparable: false,
|
|
230
|
+
run: (s, c) => s.getAdoption(scopeOf(c)),
|
|
231
|
+
});
|
|
232
|
+
/**
|
|
233
|
+
* Compliance and access posture, read from the compliance and platform services
|
|
234
|
+
* over a service-to-service call.
|
|
235
|
+
*
|
|
236
|
+
* DEGRADES rather than failing the run: if compliance is unreachable the section
|
|
237
|
+
* says "unavailable" and the rest of the report still reaches the lead. A weekly
|
|
238
|
+
* report that did not arrive because one optional panel's upstream was down is a
|
|
239
|
+
* support ticket; a panel that says it could not be computed is information.
|
|
240
|
+
*/
|
|
241
|
+
registerSection({
|
|
242
|
+
id: 'compliance_posture',
|
|
243
|
+
title: 'Compliance and access posture',
|
|
244
|
+
comparable: false,
|
|
245
|
+
run: (s, c) => (s.getCompliancePosture
|
|
246
|
+
? s.getCompliancePosture(scopeOf(c))
|
|
247
|
+
: Promise.resolve({ unavailable: 'compliance posture is not available in this context' })),
|
|
248
|
+
});
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9zdGFrZWhvbGRlci9zZWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBeUd0Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUUzSCxpREFBaUQ7QUFDakQsU0FBUyxrQkFBa0IsQ0FBQyxFQUFVO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxNQUFNLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsTUFBTSxJQUFJLEtBQUssQ0FDYix3Q0FBd0MsRUFBRSw0QkFBNEIsR0FBRyxNQUFNO2NBQzdFLG1GQUFtRjtjQUNuRixrRkFBa0YsQ0FDckYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBRUQsdUVBQXVFO0FBQ3ZFLFNBQVMsT0FBTyxDQUFDLENBQWlCO0lBQ2hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQy9GLENBQUM7QUFFRCxp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QyxDQUFDLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztDQUMxRCxDQUFDLENBQUM7QUFFSCxlQUFlLENBQUM7SUFDZCxFQUFFLEVBQUUsVUFBVTtJQUNkLEtBQUssRUFBRSx1QkFBdUI7SUFDOUIsVUFBVSxFQUFFLEtBQUs7SUFDakIsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDekMsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7O0dBUUc7QUFDSCxlQUFlLENBQUM7SUFDZCxFQUFFLEVBQUUsb0JBQW9CO0lBQ3hCLEtBQUssRUFBRSwrQkFBK0I7SUFDdEMsVUFBVSxFQUFFLEtBQUs7SUFDakIsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CO1FBQ3BDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxFQUFFLHFEQUFxRCxFQUFFLENBQUMsQ0FBQztDQUM3RixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgc2VjdGlvbiByZWdpc3RyeTogdGhlIG9uZSBwbGFjZSB0aGF0IG1hcHMgYSByZXBvcnQgc2VjdGlvbiBpZCB0byB0aGVcbiAqIFJlcG9ydGluZ1NlcnZpY2UgbWV0aG9kIHRoYXQgY29tcHV0ZXMgaXQuXG4gKlxuICogV2h5IGEgcmVnaXN0cnkgcmF0aGVyIHRoYW4gZWFjaCB0ZW1wbGF0ZSBjYWxsaW5nIHRoZSBzZXJ2aWNlIGRpcmVjdGx5OlxuICpcbiAqICAtIFRoZSBudW1iZXJzIGluIGEgcmVwb3J0IE1VU1QgbWF0Y2ggdGhlIGRhc2hib2FyZC4gQSBtYW5hZ2VyIHdobyBjb21wYXJlcyB0aGVcbiAqICAgIHR3byBhbmQgZmluZHMgYSBkaWZmZXJlbmNlIHN0b3BzIHRydXN0aW5nIGJvdGgsIHNvIGJvdGggcmVhZCB0aGUgc2FtZSBxdWVyeSDigJRcbiAqICAgIHRoZXJlIGlzIG5vIHNlcGFyYXRlIFwicmVwb3J0XCIgaW1wbGVtZW50YXRpb24gb2Ygc3VjY2VzcyByYXRlLlxuICogIC0gRmVhdHVyZSBnYXRpbmcgYmVsb25ncyB3aXRoIHRoZSBzZWN0aW9uLCBub3QgdGhlIHJvdXRlLiBET1JBIHNlY3Rpb25zIG5lZWRcbiAqICAgIGBhZHZhbmNlZF9yZXBvcnRpbmdgOyBhIHJlcG9ydCB0aGF0IGluY2x1ZGVzIG9uZSB3aXRob3V0IHRoZSBhZGQtb24gcmVuZGVycyBhXG4gKiAgICBMT0NLRUQgc2VjdGlvbiBhbmQgc3RpbGwgZGVsaXZlcnMsIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlIHJ1bi4gQSBydW5cbiAqICAgIHRoYXQgZGllcyBiZWNhdXNlIG9mIG9uZSBnYXRlZCBzZWN0aW9uIGlzIGEgc3VwcG9ydCB0aWNrZXQ7IGEgbG9ja2VkIHBhbmVsIGlzXG4gKiAgICBhbiB1cHNlbGwuXG4gKiAgLSBQZXItcGVyc29uIG1ldHJpY3MgYXJlIHJlZnVzZWQgSEVSRSwgYXQgcmVnaXN0cmF0aW9uLiBSYW5raW5nIGluZGl2aWR1YWxcbiAqICAgIGRldmVsb3BlcnMgZGVzdHJveXMgdHJ1c3QgaW4gdGhlIHdob2xlIHJlcG9ydCwgYW5kIGEgZ3VpZGVsaW5lIGluIGEgZG9jdW1lbnRcbiAqICAgIGRvZXMgbm90IHN0b3Agc29tZW9uZSBhZGRpbmcgYHRvcENvbW1pdHRlcnNgIGxhdGVyIOKAlCBhIHRocm93aW5nIHJlZ2lzdHJ5IGRvZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgQW5hbHl0aWNzU2NvcGUgfSBmcm9tICcuLi9hbmFseXRpY3MtcXVlcmllcy5qcyc7XG5cbi8qKiBXaGF0IGEgc2VjdGlvbiBuZWVkcyB0byBydW4gb25lIHBlcmlvZCdzIHF1ZXJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN0aW9uQ29udGV4dCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBSb2xsdXAgb3JnIGlkcywgd2hlbiB0aGUgZGVmaW5pdGlvbidzIHNjb3BlIGlzIGEgdGVhbSByb2xsdXAuICovXG4gIG9yZ0lkcz86IHN0cmluZ1tdO1xuICAvKiogUGVyaW9kIGJvdW5kcyBhcyBJU08gc3RyaW5ncywgd2hpY2ggaXMgd2hhdCBldmVyeSBzZXJ2aWNlIG1ldGhvZCB0YWtlcy4gKi9cbiAgZnJvbTogc3RyaW5nO1xuICB0bzogc3RyaW5nO1xuICAvKiogVGhlIHJlcG9ydCdzIGJ1Y2tldGluZyBzZXR0aW5ncywgZm9yIHRoZSB0aW1lLXNlcmllcyBzZWN0aW9ucy4gKi9cbiAgdHo6IHN0cmluZztcbiAgd2Vla1N0YXJ0OiAnbW9uZGF5JyB8ICdzdW5kYXknO1xuICAvKipcbiAgICogVGhlIFBSRVZJT1VTIHBlcmlvZCdzIGJvdW5kcywgZm9yIHRoZSBzZWN0aW9ucyB0aGF0IGNvbXB1dGUgdGhlaXIgb3duIHRyZW5kXG4gICAqIGludGVybmFsbHkgcmF0aGVyIHRoYW4gYmVpbmcgcnVuIHR3aWNlLlxuICAgKlxuICAgKiBNb3N0IHNlY3Rpb25zIGFyZSBzaW1wbHkgcmUtcnVuIG92ZXIgdGhlIHByZXZpb3VzIHdpbmRvdyBieSB0aGUgY29tcG9zZXIgYW5kXG4gICAqIGNvbXBhcmVkIG9uIGEgc2luZ2xlIGhlYWRsaW5lLiBUaGUgYW5hbHl0aWNzIHNlY3Rpb25zIGNhbm5vdCBiZTogdGhlaXIgdHJlbmQgaXNcbiAgICogcGVyIGNhdGVnb3J5LCBwZXIgc3RhZ2Ugb3IgcGVyIHBpcGVsaW5lLCBhbmQgY29tcGFyaW5nIHR3byB3aG9sZSByZXN1bHQgc2V0c1xuICAgKiBhZnRlcndhcmRzIHdvdWxkIG1lYW4gcmUtaW1wbGVtZW50aW5nIHRoZSBqb2luIGluIHRoZSBjb21wb3Nlci5cbiAgICovXG4gIHByZXZpb3VzRnJvbT86IHN0cmluZztcbiAgcHJldmlvdXNUbz86IHN0cmluZztcbn1cblxuLyoqIFRoZSBzZXJ2aWNlIHN1cmZhY2UgYSBzZWN0aW9uIGlzIGFsbG93ZWQgdG8gY2FsbC4gU3RydWN0dXJhbCBvbiBwdXJwb3NlOiB0aGVcbiAqICByZWdpc3RyeSBuZXZlciBpbXBvcnRzIHRoZSBzZXJ2aWNlLCBzbyBpdCBzdGF5cyB0ZXN0YWJsZSB3aXRoIGEgc3R1Yi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdGlvbkRhdGFTb3VyY2Uge1xuICBnZXRFeGVjdXRpb25Db3VudChvcmdJZDogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSwgcmFuZ2U/OiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nIH0pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRTdWNjZXNzUmF0ZShvcmdJZDogc3RyaW5nLCBpbnRlcnZhbDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBidWNrZXQ/OiB7IHR6Pzogc3RyaW5nOyB3ZWVrU3RhcnQ/OiAnbW9uZGF5JyB8ICdzdW5kYXknIH0pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRBdmVyYWdlRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGdldFN0YWdlRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGdldFN0YWdlQm90dGxlbmVja3Mob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGdldEFjdGlvbkZhaWx1cmVzKG9yZ0lkOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRFcnJvcnMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdD86IG51bWJlciwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRQbHVnaW5TdW1tYXJ5KG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRQbHVnaW5EaXN0cmlidXRpb24ob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj47XG4gIGdldFBsdWdpblZlcnNpb25zKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRCdWlsZFN1Y2Nlc3NSYXRlKG9yZ0lkOiBzdHJpbmcsIGludGVydmFsOiBzdHJpbmcsIGZyb206IHN0cmluZywgdG86IHN0cmluZywgb3JnSWRzPzogc3RyaW5nW10sIGJ1Y2tldD86IHsgdHo/OiBzdHJpbmc7IHdlZWtTdGFydD86ICdtb25kYXknIHwgJ3N1bmRheScgfSk6IFByb21pc2U8dW5rbm93bj47XG4gIGdldEJ1aWxkRHVyYXRpb24ob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGdldEJ1aWxkRmFpbHVyZXMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBsaW1pdD86IG51bWJlciwgb3JnSWRzPzogc3RyaW5nW10pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXREb3JhTWV0cmljcyhvcmdJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcsIG9yZ0lkcz86IHN0cmluZ1tdLCBvcHRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXREb3JhVHJlbmQob3JnSWQ6IHN0cmluZywgaW50ZXJ2YWw6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSwgb3B0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0QnVpbGRIZWFsdGgob3JnSWQ6IHN0cmluZywgcGlwZWxpbmVJZDogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRSZXBvcnRFbnZpcm9ubWVudHMob3JnSWQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nLCBvcmdJZHM/OiBzdHJpbmdbXSk6IFByb21pc2U8dW5rbm93bj47XG5cbiAgLy8g4pSA4pSAIFRoZSBBTkFMWVRJQ1MgcmVhZHMgKHRoZSByb2xsdXAgdGFibGVzLCBub3QgcmF3IGV2ZW50cykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFNlcGFyYXRlIGZyb20gdGhlIG9uLWRlbWFuZCBkYXNoYm9hcmQgbWV0aG9kcyBhYm92ZSBiZWNhdXNlIHRoZXkgYW5zd2VyXG4gIC8vIHF1ZXN0aW9ucyB0aGUgZGFzaGJvYXJkIG5ldmVyIGFza2VkOiB3aGljaCBwaXBlbGluZSBuZWVkcyBhdHRlbnRpb24sIHdoYXRcbiAgLy8ga2luZCBvZiB0aGluZyBpcyBicmVha2luZywgd2hlcmUgYnVpbGQgdGltZSB3ZW50LCB3aGljaCBjb21taXRzIGFyZSBzdHVjay5cbiAgLy8gRXZlcnkgb25lIHJlYWRzIGEgcHJlLWFnZ3JlZ2F0ZWQgdGFibGUsIHNvIGEgcXVhcnRlcmx5IHJlcG9ydCBzdGF5cyBhXG4gIC8vIGZldy1odW5kcmVkLXJvdyBxdWVyeSBhbmQga2VlcHMgd29ya2luZyBhZnRlciByZXRlbnRpb24gc3dlZXBzIHRoZSBldmVudHMuXG4gIGdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRGYWlsdXJlQW5hbHlzaXMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRTdGFnZVBlcmZvcm1hbmNlKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcGlwZWxpbmVJZDogc3RyaW5nLCBwcmV2aW91cz86IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uKHNjb3BlOiBBbmFseXRpY3NTY29wZSwgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRQcm9tb3Rpb25WaWV3KHNjb3BlOiBBbmFseXRpY3NTY29wZSwgcHJvZHVjdGlvbkVudj86IHN0cmluZywgbGltaXQ/OiBudW1iZXIpOiBQcm9taXNlPHVua25vd24+O1xuICBnZXRPdXRkYXRlZFBsdWdpbnMoc2NvcGU6IEFuYWx5dGljc1Njb3BlLCBsaW1pdD86IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIGdldFBsdWdpblZ1bG5lcmFiaWxpdGllcyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIGxpbWl0PzogbnVtYmVyKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0QWRvcHRpb24oc2NvcGU6IEFuYWx5dGljc1Njb3BlLCB0aW1lU2F2ZWRNaW51dGVzPzogbnVtYmVyIHwgbnVsbCk6IFByb21pc2U8dW5rbm93bj47XG4gIC8qKiBDb21wbGlhbmNlICsgYWNjZXNzIHBvc3R1cmUsIG92ZXIgYSBzZXJ2aWNlLXRvLXNlcnZpY2UgcmVhZC4gRGVncmFkZXMuICovXG4gIGdldENvbXBsaWFuY2VQb3N0dXJlPyhzY29wZTogQW5hbHl0aWNzU2NvcGUpOiBQcm9taXNlPHVua25vd24+O1xuICAvKiogVGhlIGV2YWx1YXRlZCBuZWVkcy1hdHRlbnRpb24gZmluZGluZ3MgZm9yIHRoZSBwZXJpb2QuICovXG4gIGdldE5lZWRzQXR0ZW50aW9uPyhzY29wZTogQW5hbHl0aWNzU2NvcGUsIHByZXZpb3VzPzogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKiBPbmUgcmVnaXN0ZXJlZCBzZWN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN0aW9uU3BlYyB7XG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBNYW5hZ2VyLWZhY2luZyB0aXRsZS4gTm90IGEgbWV0cmljIG5hbWUg4oCUIFwiRGVwbG95c1wiLCBub3QgXCJkZXBsb3ltZW50X2ZyZXF1ZW5jeVwiLiAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKiogRmVhdHVyZSB0aGUgb3JnIG11c3QgaG9sZCwgb3IgdW5kZWZpbmVkIGZvciBhIGZyZWUgc2VjdGlvbi4gKi9cbiAgcmVxdWlyZXNGZWF0dXJlPzogRmVhdHVyZUZsYWc7XG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhpcyBzZWN0aW9uJ3MgdmFsdWUgaXMgYSBzaW5nbGUgY29tcGFyYWJsZSBudW1iZXIsIHNvIHRoZSBjb21wb3NlclxuICAgKiBjYW4gY29tcHV0ZSBwZXJpb2Qtb3Zlci1wZXJpb2QgY2hhbmdlLiBBIGxpc3Qgc2VjdGlvbiAodG9wIGZhaWx1cmVzKSBoYXMgbm9cbiAgICogbWVhbmluZ2Z1bCBcImNoYW5nZVwiLCBhbmQgcHJldGVuZGluZyBvdGhlcndpc2UgcHJvZHVjZXMgbm9uc2Vuc2UgYXJyb3dzLlxuICAgKi9cbiAgY29tcGFyYWJsZTogYm9vbGVhbjtcbiAgcnVuKHNvdXJjZTogU2VjdGlvbkRhdGFTb3VyY2UsIGN0eDogU2VjdGlvbkNvbnRleHQpOiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKipcbiAqIElkcyB0aGF0IHdvdWxkIHJhbmsgb3IgY29tcGFyZSBJTkRJVklEVUFMIHBlb3BsZS4gUmVmdXNlZCBhdCByZWdpc3RyYXRpb24uXG4gKlxuICogVGVhbS1sZXZlbCBtZXRyaWNzIGRlc2NyaWJlIGEgc3lzdGVtOyBwZXItcGVyc29uIG1ldHJpY3MgZGVzY3JpYmUgYSBwZXJzb24sIGFuZFxuICogYSByZXBvcnQgYSBtYW5hZ2VyIHJlYWRzIGlzIHRoZSB3b3JzdCBwb3NzaWJsZSBwbGFjZSBmb3IgdGhlIHNlY29uZC4gT25jZSBhXG4gKiBkZXZlbG9wZXIgYmVsaWV2ZXMgdGhlIHdlZWtseSByZXBvcnQgcmFua3MgdGhlbSwgdGhlIG51bWJlcnMgc3RhcnQgYmVpbmcgZ2FtZWRcbiAqIGFuZCB0aGUgcmVwb3J0IHN0b3BzIGRlc2NyaWJpbmcgcmVhbGl0eS5cbiAqL1xuY29uc3QgUEVSX1BFUlNPTl9NQVJLRVJTID0gWydhdXRob3InLCAnY29tbWl0dGVyJywgJ2RldmVsb3BlcicsICdwZXJzb24nLCAndXNlcicsICdpbmRpdmlkdWFsJywgJ2J5X21lbWJlcicsICdwZXJfbWVtYmVyJ107XG5cbi8qKiBUaHJvd3Mgd2hlbiBhIHNlY3Rpb24gaWQgbG9va3MgcGVyLXBlcnNvbi4gKi9cbmZ1bmN0aW9uIGFzc2VydE5vdFBlclBlcnNvbihpZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvd2VyZWQgPSBpZC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoaXQgPSBQRVJfUEVSU09OX01BUktFUlMuZmluZCgobSkgPT4gbG93ZXJlZC5pbmNsdWRlcyhtKSk7XG4gIGlmIChoaXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUmVmdXNpbmcgdG8gcmVnaXN0ZXIgcmVwb3J0IHNlY3Rpb24gXCIke2lkfVwiOiBpdCBsb29rcyBwZXItcGVyc29uIChcIiR7aGl0fVwiKS4gYFxuICAgICAgKyAnU3Rha2Vob2xkZXIgcmVwb3J0cyBhcmUgdGVhbS1sZXZlbCBieSBkZXNpZ24g4oCUIHJhbmtpbmcgaW5kaXZpZHVhbHMgaW4gYSByZXBvcnQgYSAnXG4gICAgICArICdtYW5hZ2VyIHJlYWRzIGRlc3Ryb3lzIHRydXN0IGluIGV2ZXJ5IG90aGVyIG51bWJlciBpbiBpdC4gQWdncmVnYXRlIHRvIHRoZSB0ZWFtLicsXG4gICAgKTtcbiAgfVxufVxuXG4vKiogVGhlIHNjb3BlIGV2ZXJ5IGFuYWx5dGljcyBxdWVyeSB0YWtlcywgZnJvbSB0aGUgc2VjdGlvbiBjb250ZXh0LiAqL1xuZnVuY3Rpb24gc2NvcGVPZihjOiBTZWN0aW9uQ29udGV4dCk6IEFuYWx5dGljc1Njb3BlIHtcbiAgcmV0dXJuIHsgb3JnSWQ6IGMub3JnSWQsIC4uLihjLm9yZ0lkcyA/IHsgb3JnSWRzOiBjLm9yZ0lkcyB9IDoge30pLCBmcm9tOiBjLmZyb20sIHRvOiBjLnRvIH07XG59XG5cbi8qKiBUaGUgcHJldmlvdXMgcGVyaW9kLCB3aGVuIHRoZSBjb250ZXh0IGNhcnJpZXMgb25lIChmb3IgdGhlIHRyZW5kIGNvbHVtbnMpLiAqL1xuZnVuY3Rpb24gcHJldmlvdXNPZihjOiBTZWN0aW9uQ29udGV4dCk6IHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gYy5wcmV2aW91c0Zyb20gJiYgYy5wcmV2aW91c1RvID8geyBmcm9tOiBjLnByZXZpb3VzRnJvbSwgdG86IGMucHJldmlvdXNUbyB9IDogdW5kZWZpbmVkO1xufVxuXG5jb25zdCBSRUdJU1RSWSA9IG5ldyBNYXA8c3RyaW5nLCBTZWN0aW9uU3BlYz4oKTtcblxuLyoqIFJlZ2lzdGVyIGEgc2VjdGlvbi4gVGhyb3dzIG9uIGEgZHVwbGljYXRlIGlkIG9yIGEgcGVyLXBlcnNvbiBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTZWN0aW9uKHNwZWM6IFNlY3Rpb25TcGVjKTogU2VjdGlvblNwZWMge1xuICBhc3NlcnROb3RQZXJQZXJzb24oc3BlYy5pZCk7XG4gIGlmIChSRUdJU1RSWS5oYXMoc3BlYy5pZCkpIHRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIHJlcG9ydCBzZWN0aW9uIGlkOiAke3NwZWMuaWR9YCk7XG4gIFJFR0lTVFJZLnNldChzcGVjLmlkLCBzcGVjKTtcbiAgcmV0dXJuIHNwZWM7XG59XG5cbi8qKiBMb29rIGEgc2VjdGlvbiB1cDsgdW5kZWZpbmVkIHdoZW4gdGhlIGlkIGlzIHVua25vd24uICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VjdGlvbihpZDogc3RyaW5nKTogU2VjdGlvblNwZWMgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUkVHSVNUUlkuZ2V0KGlkKTtcbn1cblxuLyoqIEV2ZXJ5IHJlZ2lzdGVyZWQgc2VjdGlvbiwgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbFNlY3Rpb25zKCk6IFNlY3Rpb25TcGVjW10ge1xuICByZXR1cm4gWy4uLlJFR0lTVFJZLnZhbHVlcygpXTtcbn1cblxuLyoqIFRoZSBpZHMgYSBjYWxsZXIgbWF5IHB1dCBpbiBhIGRlZmluaXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbklkcygpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uUkVHSVNUUlkua2V5cygpXTtcbn1cblxuLy8g4pSA4pSAIERlbGl2ZXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ2V4ZWN1dGlvbl9jb3VudCcsXG4gIHRpdGxlOiAnUGlwZWxpbmUgcnVucycsXG4gIGNvbXBhcmFibGU6IHRydWUsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0RXhlY3V0aW9uQ291bnQoYy5vcmdJZCwgYy5vcmdJZHMsIHsgZnJvbTogYy5mcm9tLCB0bzogYy50byB9KSxcbn0pO1xuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ3N1Y2Nlc3NfcmF0ZScsXG4gIHRpdGxlOiAnU3VjY2VzcyByYXRlJyxcbiAgY29tcGFyYWJsZTogdHJ1ZSxcbiAgcnVuOiAocywgYykgPT4gcy5nZXRTdWNjZXNzUmF0ZShjLm9yZ0lkLCAnd2VlaycsIGMuZnJvbSwgYy50bywgYy5vcmdJZHMsIHsgdHo6IGMudHosIHdlZWtTdGFydDogYy53ZWVrU3RhcnQgfSksXG59KTtcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdkdXJhdGlvbicsXG4gIHRpdGxlOiAnUnVuIGR1cmF0aW9uJyxcbiAgY29tcGFyYWJsZTogdHJ1ZSxcbiAgcnVuOiAocywgYykgPT4gcy5nZXRBdmVyYWdlRHVyYXRpb24oYy5vcmdJZCwgYy5mcm9tLCBjLnRvLCBjLm9yZ0lkcyksXG59KTtcblxuLy8g4pSA4pSAIFdoYXQgaXMgYmxvY2tpbmcgdXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbnJlZ2lzdGVyU2VjdGlvbih7XG4gIGlkOiAnc3RhZ2VfZmFpbHVyZXMnLFxuICB0aXRsZTogJ1RvcCBmYWlsaW5nIHN0YWdlcycsXG4gIC8vIEEgbGlzdCwgbm90IGEgbnVtYmVyOiBcImNoYW5nZVwiIG9uIGEgdG9wLU4gbGlzdCBpcyBtZWFuaW5nbGVzcy5cbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0U3RhZ2VGYWlsdXJlcyhjLm9yZ0lkLCBjLmZyb20sIGMudG8sIGMub3JnSWRzKSxcbn0pO1xuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ3N0YWdlX2JvdHRsZW5lY2tzJyxcbiAgdGl0bGU6ICdTbG93ZXN0IHN0YWdlcycsXG4gIGNvbXBhcmFibGU6IGZhbHNlLFxuICBydW46IChzLCBjKSA9PiBzLmdldFN0YWdlQm90dGxlbmVja3MoYy5vcmdJZCwgYy5mcm9tLCBjLnRvLCBjLm9yZ0lkcyksXG59KTtcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdhY3Rpb25fZmFpbHVyZXMnLFxuICB0aXRsZTogJ1RvcCBmYWlsaW5nIHN0ZXBzJyxcbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0QWN0aW9uRmFpbHVyZXMoYy5vcmdJZCwgYy5mcm9tLCBjLnRvLCBjLm9yZ0lkcyksXG59KTtcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdlcnJvcnMnLFxuICB0aXRsZTogJ1JlY2VudCBmYWlsdXJlcycsXG4gIGNvbXBhcmFibGU6IGZhbHNlLFxuICAvLyBDYXBwZWQ6IGEgbWFuYWdlciByZWFkcyB0aGUgdG9wIGZldywgYW5kIHRoZSBzbmFwc2hvdCBpcyBzdG9yZWQgZm9yZXZlci5cbiAgcnVuOiAocywgYykgPT4gcy5nZXRFcnJvcnMoYy5vcmdJZCwgYy5mcm9tLCBjLnRvLCAxMCwgYy5vcmdJZHMpLFxufSk7XG5cbi8vIOKUgOKUgCBQbHVnaW4gLyBzdXBwbHktY2hhaW4gcG9zdHVyZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdwbHVnaW5fc3VtbWFyeScsXG4gIHRpdGxlOiAnUGx1Z2lucyBpbiB1c2UnLFxuICBjb21wYXJhYmxlOiB0cnVlLFxuICBydW46IChzLCBjKSA9PiBzLmdldFBsdWdpblN1bW1hcnkoYy5vcmdJZCksXG59KTtcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdwbHVnaW5fZGlzdHJpYnV0aW9uJyxcbiAgdGl0bGU6ICdQbHVnaW4gbWl4JyxcbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0UGx1Z2luRGlzdHJpYnV0aW9uKGMub3JnSWQpLFxufSk7XG5cbnJlZ2lzdGVyU2VjdGlvbih7XG4gIGlkOiAncGx1Z2luX3ZlcnNpb25zJyxcbiAgdGl0bGU6ICdPdXRkYXRlZCBwbHVnaW5zJyxcbiAgY29tcGFyYWJsZTogdHJ1ZSxcbiAgcnVuOiAocywgYykgPT4gcy5nZXRQbHVnaW5WZXJzaW9ucyhjLm9yZ0lkKSxcbn0pO1xuXG4vLyDilIDilIAgQnVpbGQgaGVhbHRoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ2J1aWxkX3N1Y2Nlc3NfcmF0ZScsXG4gIHRpdGxlOiAnUGx1Z2luIGJ1aWxkIHN1Y2Nlc3MnLFxuICBjb21wYXJhYmxlOiB0cnVlLFxuICBydW46IChzLCBjKSA9PiBzLmdldEJ1aWxkU3VjY2Vzc1JhdGUoYy5vcmdJZCwgJ3dlZWsnLCBjLmZyb20sIGMudG8sIGMub3JnSWRzLCB7IHR6OiBjLnR6LCB3ZWVrU3RhcnQ6IGMud2Vla1N0YXJ0IH0pLFxufSk7XG5cbnJlZ2lzdGVyU2VjdGlvbih7XG4gIGlkOiAnYnVpbGRfZHVyYXRpb24nLFxuICB0aXRsZTogJ1BsdWdpbiBidWlsZCBkdXJhdGlvbicsXG4gIGNvbXBhcmFibGU6IHRydWUsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0QnVpbGREdXJhdGlvbihjLm9yZ0lkLCBjLmZyb20sIGMudG8sIGMub3JnSWRzKSxcbn0pO1xuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ2J1aWxkX2ZhaWx1cmVzJyxcbiAgdGl0bGU6ICdQbHVnaW4gYnVpbGQgZmFpbHVyZXMnLFxuICBjb21wYXJhYmxlOiBmYWxzZSxcbiAgcnVuOiAocywgYykgPT4gcy5nZXRCdWlsZEZhaWx1cmVzKGMub3JnSWQsIGMuZnJvbSwgYy50bywgMTAsIGMub3JnSWRzKSxcbn0pO1xuXG4vLyDilIDilIAgRGVwbG95IC8gRE9SQSAocGFpZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUaGVzZSBuZWVkIGBhZHZhbmNlZF9yZXBvcnRpbmdgLiBXaXRob3V0IGl0IHRoZSBjb21wb3NlciByZW5kZXJzIGEgbG9ja2VkXG4vLyBzZWN0aW9uIGFuZCB0aGUgcmVzdCBvZiB0aGUgcmVwb3J0IHN0aWxsIGRlbGl2ZXJzLlxuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ2RvcmEnLFxuICB0aXRsZTogJ0RlbGl2ZXJ5IG1ldHJpY3MgKERPUkEpJyxcbiAgcmVxdWlyZXNGZWF0dXJlOiAnYWR2YW5jZWRfcmVwb3J0aW5nJyxcbiAgY29tcGFyYWJsZTogdHJ1ZSxcbiAgcnVuOiAocywgYykgPT4gcy5nZXREb3JhTWV0cmljcyhjLm9yZ0lkLCBjLmZyb20sIGMudG8sIGMub3JnSWRzKSxcbn0pO1xuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ2RvcmFfdHJlbmQnLFxuICB0aXRsZTogJ0RlbGl2ZXJ5IHRyZW5kJyxcbiAgcmVxdWlyZXNGZWF0dXJlOiAnYWR2YW5jZWRfcmVwb3J0aW5nJyxcbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0RG9yYVRyZW5kKGMub3JnSWQsICd3ZWVrJywgYy5mcm9tLCBjLnRvLCBjLm9yZ0lkcywgeyB0ejogYy50eiwgd2Vla1N0YXJ0OiBjLndlZWtTdGFydCB9KSxcbn0pO1xuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ2Vudmlyb25tZW50cycsXG4gIHRpdGxlOiAnRGVwbG95IGVudmlyb25tZW50cycsXG4gIGNvbXBhcmFibGU6IGZhbHNlLFxuICBydW46IChzLCBjKSA9PiBzLmdldFJlcG9ydEVudmlyb25tZW50cyhjLm9yZ0lkLCBjLmZyb20sIGMudG8sIGMub3JnSWRzKSxcbn0pO1xuXG4vLyDilIDilIAgVGhlIGFuYWx5dGljcyBzZWN0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEVhY2ggcmVhZHMgYSBwcmUtYWdncmVnYXRlZCB0YWJsZSByYXRoZXIgdGhhbiByYXcgZXZlbnRzLCBhbmQgZWFjaCBhbnN3ZXJzIGFcbi8vIHF1ZXN0aW9uIHRoZSBvbi1kZW1hbmQgZGFzaGJvYXJkcyBkbyBub3Q6IG5vdCBcImhvdyBhcmUgd2UgZG9pbmdcIiBidXQgXCJ3aGF0XG4vLyBzaG91bGQgc29tZWJvZHkgZG8gYWJvdXQgaXRcIi5cblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdwaXBlbGluZV9icmVha2Rvd24nLFxuICB0aXRsZTogJ1BpcGVsaW5lcyBuZWVkaW5nIHRoZSBtb3N0IGF0dGVudGlvbicsXG4gIGNvbXBhcmFibGU6IGZhbHNlLFxuICBydW46IChzLCBjKSA9PiBzLmdldFBpcGVsaW5lQnJlYWtkb3duKHNjb3BlT2YoYyksIDEwKSxcbn0pO1xuXG4vKipcbiAqIFRoZSBzZWN0aW9uIHRoYXQgREVDSURFUyByYXRoZXIgdGhhbiBkZXNjcmliZXMuIEl0cyBmaW5kaW5ncyBjYXJyeSB0aGUgbnVtYmVyXG4gKiBiZWhpbmQgdGhlbSwgYmVjYXVzZSBhIGZsYWcgd2l0aG91dCBldmlkZW5jZSBpcyBhbiBvcGluaW9uIHRoZSByZWFkZXIgaGFzIHRvIHRha2VcbiAqIG9uIHRydXN0IOKAlCBhbmQgdGhlIGZpcnN0IHRpbWUgb25lIGlzIHdyb25nIHRoZSBzZWN0aW9uIHN0b3BzIGJlaW5nIHJlYWQuXG4gKi9cbnJlZ2lzdGVyU2VjdGlvbih7XG4gIGlkOiAnbmVlZHNfYXR0ZW50aW9uJyxcbiAgdGl0bGU6ICdOZWVkcyBhdHRlbnRpb24nLFxuICBjb21wYXJhYmxlOiBmYWxzZSxcbiAgcnVuOiAocywgYykgPT4gKHMuZ2V0TmVlZHNBdHRlbnRpb25cbiAgICA/IHMuZ2V0TmVlZHNBdHRlbnRpb24oc2NvcGVPZihjKSwgcHJldmlvdXNPZihjKSlcbiAgICA6IFByb21pc2UucmVzb2x2ZSh7IGl0ZW1zOiBbXSwgdW5hdmFpbGFibGU6ICduZWVkcy1hdHRlbnRpb24gZXZhbHVhdGlvbiBpcyBub3Qgd2lyZWQgaW4gdGhpcyBjb250ZXh0JyB9KSksXG59KTtcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdmYWlsdXJlX2FuYWx5c2lzJyxcbiAgdGl0bGU6ICdXaGF0IGlzIGJyZWFraW5nJyxcbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0RmFpbHVyZUFuYWx5c2lzKHNjb3BlT2YoYyksIHByZXZpb3VzT2YoYykpLFxufSk7XG5cbnJlZ2lzdGVyU2VjdGlvbih7XG4gIGlkOiAnc3RhZ2VfcGVyZm9ybWFuY2UnLFxuICB0aXRsZTogJ1Nsb3dlc3Qgc3RhZ2VzJyxcbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIC8vIFRoZSB3b3JzdCBwaXBlbGluZSBmcm9tIHRoZSBicmVha2Rvd24gaXMgdGhlIG9uZSB3b3J0aCBkcmlsbGluZyBpbnRvOyBhXG4gIC8vIHNlY3Rpb24gdGhhdCBhc2tlZCBmb3IgYSBwaXBlbGluZSBpZCB3b3VsZCBoYXZlIG5vdGhpbmcgdG8gcHV0IGluIGl0IG9uIGFcbiAgLy8gc2NoZWR1bGVkIHJ1biwgd2hlcmUgdGhlcmUgaXMgbm8gdXNlciB0byBwaWNrIG9uZS5cbiAgcnVuOiBhc3luYyAocywgYykgPT4ge1xuICAgIGNvbnN0IGJyZWFrZG93biA9IGF3YWl0IHMuZ2V0UGlwZWxpbmVCcmVha2Rvd24oc2NvcGVPZihjKSwgMSkgYXMgQXJyYXk8eyBwaXBlbGluZUlkPzogc3RyaW5nIH0+O1xuICAgIGNvbnN0IHdvcnN0ID0gYnJlYWtkb3duWzBdPy5waXBlbGluZUlkO1xuICAgIGlmICghd29yc3QpIHJldHVybiB7IHN0YWdlczogW10sIHBpcGVsaW5lSWQ6IG51bGwgfTtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiB3b3JzdCwgc3RhZ2VzOiBhd2FpdCBzLmdldFN0YWdlUGVyZm9ybWFuY2Uoc2NvcGVPZihjKSwgd29yc3QsIHByZXZpb3VzT2YoYykpIH07XG4gIH0sXG59KTtcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdwcm9tb3Rpb24nLFxuICB0aXRsZTogJ1doYXQgcmVhY2hlZCBwcm9kdWN0aW9uLCBhbmQgd2hhdCBkaWQgbm90JyxcbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0UHJvbW90aW9uVmlldyhzY29wZU9mKGMpKSxcbn0pO1xuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ3Jlc291cmNlX2NvbnN1bXB0aW9uJyxcbiAgdGl0bGU6ICdXaGVyZSB0aGUgYnVpbGQgdGltZSB3ZW50JyxcbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0UmVzb3VyY2VDb25zdW1wdGlvbihzY29wZU9mKGMpLCAyMCksXG59KTtcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdvdXRkYXRlZF9wbHVnaW5zJyxcbiAgdGl0bGU6ICdQbHVnaW5zIGJlaGluZCB0aGVpciBsYXRlc3QgdmVyc2lvbicsXG4gIGNvbXBhcmFibGU6IGZhbHNlLFxuICBydW46IChzLCBjKSA9PiBzLmdldE91dGRhdGVkUGx1Z2lucyhzY29wZU9mKGMpLCA1MCksXG59KTtcblxucmVnaXN0ZXJTZWN0aW9uKHtcbiAgaWQ6ICdwbHVnaW5fdnVsbmVyYWJpbGl0aWVzJyxcbiAgdGl0bGU6ICdQbHVnaW4gdnVsbmVyYWJpbGl0aWVzJyxcbiAgY29tcGFyYWJsZTogZmFsc2UsXG4gIHJ1bjogKHMsIGMpID0+IHMuZ2V0UGx1Z2luVnVsbmVyYWJpbGl0aWVzKHNjb3BlT2YoYyksIDUwKSxcbn0pO1xuXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ2Fkb3B0aW9uJyxcbiAgdGl0bGU6ICdBZG9wdGlvbiBhbmQgY292ZXJhZ2UnLFxuICBjb21wYXJhYmxlOiBmYWxzZSxcbiAgcnVuOiAocywgYykgPT4gcy5nZXRBZG9wdGlvbihzY29wZU9mKGMpKSxcbn0pO1xuXG4vKipcbiAqIENvbXBsaWFuY2UgYW5kIGFjY2VzcyBwb3N0dXJlLCByZWFkIGZyb20gdGhlIGNvbXBsaWFuY2UgYW5kIHBsYXRmb3JtIHNlcnZpY2VzXG4gKiBvdmVyIGEgc2VydmljZS10by1zZXJ2aWNlIGNhbGwuXG4gKlxuICogREVHUkFERVMgcmF0aGVyIHRoYW4gZmFpbGluZyB0aGUgcnVuOiBpZiBjb21wbGlhbmNlIGlzIHVucmVhY2hhYmxlIHRoZSBzZWN0aW9uXG4gKiBzYXlzIFwidW5hdmFpbGFibGVcIiBhbmQgdGhlIHJlc3Qgb2YgdGhlIHJlcG9ydCBzdGlsbCByZWFjaGVzIHRoZSBsZWFkLiBBIHdlZWtseVxuICogcmVwb3J0IHRoYXQgZGlkIG5vdCBhcnJpdmUgYmVjYXVzZSBvbmUgb3B0aW9uYWwgcGFuZWwncyB1cHN0cmVhbSB3YXMgZG93biBpcyBhXG4gKiBzdXBwb3J0IHRpY2tldDsgYSBwYW5lbCB0aGF0IHNheXMgaXQgY291bGQgbm90IGJlIGNvbXB1dGVkIGlzIGluZm9ybWF0aW9uLlxuICovXG5yZWdpc3RlclNlY3Rpb24oe1xuICBpZDogJ2NvbXBsaWFuY2VfcG9zdHVyZScsXG4gIHRpdGxlOiAnQ29tcGxpYW5jZSBhbmQgYWNjZXNzIHBvc3R1cmUnLFxuICBjb21wYXJhYmxlOiBmYWxzZSxcbiAgcnVuOiAocywgYykgPT4gKHMuZ2V0Q29tcGxpYW5jZVBvc3R1cmVcbiAgICA/IHMuZ2V0Q29tcGxpYW5jZVBvc3R1cmUoc2NvcGVPZihjKSlcbiAgICA6IFByb21pc2UucmVzb2x2ZSh7IHVuYXZhaWxhYmxlOiAnY29tcGxpYW5jZSBwb3N0dXJlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjb250ZXh0JyB9KSksXG59KTtcbiJdfQ==
|