@pipeline-builder/pipeline-data 4.3.11 → 4.3.13
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/managed-toolchain.d.ts +195 -0
- package/lib/api/managed-toolchain.js +443 -0
- package/lib/api/public-directory.d.ts +4 -15
- package/lib/api/public-directory.js +1 -31
- package/lib/api/reporting/ingest.js +52 -12
- package/lib/api/reporting/stakeholder/compose.d.ts +3 -2
- package/lib/api/reporting/stakeholder/compose.js +1 -1
- package/lib/api/reporting/stakeholder/period.d.ts +5 -4
- package/lib/api/reporting/stakeholder/period.js +1 -1
- package/lib/api/reporting/stakeholder/sections.d.ts +4 -4
- package/lib/api/reporting/stakeholder/sections.js +1 -1
- package/lib/api/reporting/stakeholder/store.d.ts +3 -2
- package/lib/api/reporting/stakeholder/store.js +1 -1
- package/lib/api/reporting/toolchain-runs.d.ts +156 -0
- package/lib/api/reporting/toolchain-runs.js +267 -0
- package/lib/api/reporting/types.d.ts +20 -3
- package/lib/api/reporting/types.js +1 -1
- package/lib/api/support-cases.d.ts +50 -24
- package/lib/api/support-cases.js +96 -37
- package/lib/api/version-references.d.ts +2 -24
- package/lib/api/version-references.js +46 -7
- package/lib/core/query-filters.d.ts +6 -6
- package/lib/core/query-filters.js +1 -1
- package/lib/database/drizzle-schema.d.ts +698 -41
- package/lib/database/drizzle-schema.js +11 -1
- package/lib/database/index.d.ts +1 -1
- package/lib/database/index.js +2 -2
- package/lib/database/schema/alert.js +4 -4
- package/lib/database/schema/compliance.d.ts +29 -40
- package/lib/database/schema/compliance.js +10 -14
- package/lib/database/schema/ecosystem.d.ts +72 -0
- package/lib/database/schema/ecosystem.js +18 -2
- package/lib/database/schema/pipeline.d.ts +19 -0
- package/lib/database/schema/pipeline.js +17 -1
- package/lib/database/schema/reporting-stakeholder.d.ts +2 -1
- package/lib/database/schema/reporting-stakeholder.js +2 -27
- package/lib/database/schema/toolchain.d.ts +643 -0
- package/lib/database/schema/toolchain.js +102 -0
- package/lib/index.d.ts +4 -2
- package/lib/index.js +7 -3
- package/lib/testing/exports.json +39 -2
- package/package.json +2 -2
|
@@ -13,6 +13,7 @@ import { invalidateOrgReports } from './caches.js';
|
|
|
13
13
|
import { upsertDeployments } from './deploy-rollup.js';
|
|
14
14
|
import { classifyFailure } from './failure-classifier.js';
|
|
15
15
|
import { scrubOptional } from './sql-helpers.js';
|
|
16
|
+
import { deployedToolchainOf, readPlatformDefaultRelease, SELF_MUTATION_ACTION, SELF_MUTATION_STAGE, toolchainActionOf, toolchainOutcomeOf, } from './toolchain-runs.js';
|
|
16
17
|
import { schema } from '../../database/drizzle-schema.js';
|
|
17
18
|
import { withTenantTx } from '../../database/tenancy.js';
|
|
18
19
|
const logger = createLogger('reporting-ingest');
|
|
@@ -26,14 +27,18 @@ function stepKey(pipelineId, stageName, actionName) {
|
|
|
26
27
|
return `${pipelineId}\u0000${stageName}\u0000${actionName}`;
|
|
27
28
|
}
|
|
28
29
|
/**
|
|
29
|
-
* Plugin attribution: the step manifests of
|
|
30
|
-
* event, in ONE read per batch, keyed for
|
|
31
|
-
* post-scrub on both sides (the manifest
|
|
30
|
+
* Plugin attribution AND the deployed toolchain release: the step manifests of
|
|
31
|
+
* every pipeline with an attributable event, in ONE read per batch, keyed for
|
|
32
|
+
* an in-memory join. Names are compared post-scrub on both sides (the manifest
|
|
33
|
+
* stores them scrubbed the same way).
|
|
34
|
+
*
|
|
35
|
+
* The toolchain map is the PLATFORM's record of what was deployed (the
|
|
36
|
+
* manifest's `build-image` entry) — the only source the §7 run stamp may use.
|
|
32
37
|
*/
|
|
33
38
|
async function loadStepPlugins(tx, attributable) {
|
|
34
39
|
const pipelineIds = [...new Set(attributable.map((e) => e.pipelineId))];
|
|
35
40
|
if (pipelineIds.length === 0)
|
|
36
|
-
return new Map();
|
|
41
|
+
return { steps: new Map(), toolchain: new Map() };
|
|
37
42
|
const rows = await tx
|
|
38
43
|
.select({
|
|
39
44
|
pipelineId: schema.pipelineStepManifest.pipelineId,
|
|
@@ -44,10 +49,14 @@ async function loadStepPlugins(tx, attributable) {
|
|
|
44
49
|
pluginPublisherId: schema.pipelineStepManifest.pluginPublisherId,
|
|
45
50
|
pluginName: schema.pipelineStepManifest.pluginName,
|
|
46
51
|
pluginVersion: schema.pipelineStepManifest.pluginVersion,
|
|
52
|
+
stepKey: schema.pipelineStepManifest.stepKey,
|
|
47
53
|
})
|
|
48
54
|
.from(schema.pipelineStepManifest)
|
|
49
55
|
.where(inArray(schema.pipelineStepManifest.pipelineId, pipelineIds));
|
|
50
|
-
return
|
|
56
|
+
return {
|
|
57
|
+
steps: new Map(rows.map((m) => [stepKey(m.pipelineId, m.stageName, m.actionName), m])),
|
|
58
|
+
toolchain: deployedToolchainOf(rows),
|
|
59
|
+
};
|
|
51
60
|
}
|
|
52
61
|
/**
|
|
53
62
|
* Allowance for clock skew between an AWS event's source clock and ours. A real
|
|
@@ -104,7 +113,7 @@ function pbFailureCode(detail) {
|
|
|
104
113
|
const code = failure && typeof failure === 'object' ? failure.code : undefined;
|
|
105
114
|
return typeof code === 'string' && /^[A-Z][A-Z0-9_]{0,63}$/.test(code) ? code : null;
|
|
106
115
|
}
|
|
107
|
-
function toEventRow(event, registry, plugin, keyId) {
|
|
116
|
+
function toEventRow(event, registry, plugin, keyId, toolchainRelease) {
|
|
108
117
|
const detail = event.sourceMessageId !== undefined
|
|
109
118
|
? { ...(event.detail ?? {}), sourceMessageId: event.sourceMessageId }
|
|
110
119
|
: event.detail;
|
|
@@ -142,6 +151,9 @@ function toEventRow(event, registry, plugin, keyId) {
|
|
|
142
151
|
pluginPublisherId: plugin?.pluginPublisherId ?? null,
|
|
143
152
|
pluginName: plugin?.pluginName ?? null,
|
|
144
153
|
pluginVersion: plugin?.pluginVersion ?? null,
|
|
154
|
+
// The managed toolchain release a synth / self-mutation action ran on, from
|
|
155
|
+
// the platform's deployed manifest (never the payload). NULL otherwise.
|
|
156
|
+
toolchainRelease,
|
|
145
157
|
// WHAT KIND of thing broke, classified here rather than at read time: the
|
|
146
158
|
// error text is scrubbed above and eventually swept by retention, so a
|
|
147
159
|
// category derived later would have nothing left to read. NULL for anything
|
|
@@ -174,10 +186,23 @@ function toEventRow(event, registry, plugin, keyId) {
|
|
|
174
186
|
*
|
|
175
187
|
* A non-null environment marks a deploy.
|
|
176
188
|
*/
|
|
177
|
-
function emitIngestMetrics(rows, onMetric) {
|
|
189
|
+
function emitIngestMetrics(rows, onMetric, platformDefaultRelease) {
|
|
178
190
|
for (const r of rows) {
|
|
179
191
|
if (!r.pipelineId)
|
|
180
192
|
continue;
|
|
193
|
+
// Toolchain runs (§7, alerting only): a terminal outcome on a stamped row.
|
|
194
|
+
// Not exclusive — the same action is also a compute measurement below.
|
|
195
|
+
const outcome = r.toolchainRelease ? toolchainOutcomeOf(r.status) : null;
|
|
196
|
+
if (r.toolchainRelease && outcome) {
|
|
197
|
+
onMetric({
|
|
198
|
+
kind: 'toolchain',
|
|
199
|
+
toolchainRelease: r.toolchainRelease,
|
|
200
|
+
// Stamped rows are only ever synth or self-mutation.
|
|
201
|
+
action: r.stageName === SELF_MUTATION_STAGE && r.actionName === SELF_MUTATION_ACTION ? 'self-mutation' : 'synth',
|
|
202
|
+
outcome,
|
|
203
|
+
platformDefaultRelease,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
181
206
|
// Compute consumption: every TERMINAL action, measurable or not. The
|
|
182
207
|
// unmeasurable ones are the point — they are what the coverage ratio counts.
|
|
183
208
|
if (r.eventType === 'ACTION' && TERMINAL_ACTION_STATES.includes(r.status)) {
|
|
@@ -239,7 +264,7 @@ export async function ingestEvents(events, onMetric, caller) {
|
|
|
239
264
|
// Caches are invalidated AFTER the tx resolves: doing it inside held the pg
|
|
240
265
|
// locks open across unrelated cache round-trips. The TTL is 2-5 min, so a
|
|
241
266
|
// fire-and-forget post-commit invalidation is an acceptable trade.
|
|
242
|
-
const { inserted, skipped, unregisteredPipelineIds, affectedOrgs, droppedForeignOrg, droppedInvalidTime, foreignPipelineIds, insertedRows } = await withTenantTx(async (tx) => {
|
|
267
|
+
const { inserted, skipped, unregisteredPipelineIds, affectedOrgs, droppedForeignOrg, droppedInvalidTime, foreignPipelineIds, insertedRows, platformDefaultRelease } = await withTenantTx(async (tx) => {
|
|
243
268
|
// Batch-resolve all unique pipeline ids in one query
|
|
244
269
|
const uniqueIds = [...new Set(events.map(e => e.pipelineId))];
|
|
245
270
|
const registryRows = await tx
|
|
@@ -250,7 +275,7 @@ export async function ingestEvents(events, onMetric, caller) {
|
|
|
250
275
|
.from(schema.pipelineRegistry)
|
|
251
276
|
.where(inArray(schema.pipelineRegistry.pipelineId, uniqueIds));
|
|
252
277
|
const idMap = new Map(registryRows.map(r => [r.pipelineId, r]));
|
|
253
|
-
const stepPlugins = await loadStepPlugins(tx, events.filter((e) => isAttributable(e) && idMap.has(e.pipelineId)));
|
|
278
|
+
const { steps: stepPlugins, toolchain } = await loadStepPlugins(tx, events.filter((e) => isAttributable(e) && idMap.has(e.pipelineId)));
|
|
254
279
|
// Build insert batch (skip events whose pipeline isn't registered)
|
|
255
280
|
const rows = [];
|
|
256
281
|
let skippedLocal = 0;
|
|
@@ -292,9 +317,16 @@ export async function ingestEvents(events, onMetric, caller) {
|
|
|
292
317
|
const step = isAttributable(event) && stageName && actionName
|
|
293
318
|
? stepPlugins.get(stepKey(registry.pipelineId, stageName, actionName))
|
|
294
319
|
: undefined;
|
|
320
|
+
// The toolchain stamp: is this the pipeline's synth / self-mutation
|
|
321
|
+
// action, and which release did the platform deploy it with?
|
|
322
|
+
const deployed = toolchain.get(registry.pipelineId);
|
|
323
|
+
const sameOrgDeployed = deployed && deployed.orgId === registry.orgId ? deployed : undefined;
|
|
324
|
+
const toolchainRelease = toolchainActionOf({ eventType: event.eventType, stageName, actionName }, sameOrgDeployed)
|
|
325
|
+
? sameOrgDeployed.releaseVersion
|
|
326
|
+
: null;
|
|
295
327
|
// Same-org guard: a manifest row is only ever written by the org that
|
|
296
328
|
// owns the pipeline, but the ingest runs cross-tenant, so don't lean on it.
|
|
297
|
-
rows.push(toEventRow(event, registry, step && step.orgId === registry.orgId ? step : undefined, caller?.keyId));
|
|
329
|
+
rows.push(toEventRow(event, registry, step && step.orgId === registry.orgId ? step : undefined, caller?.keyId, toolchainRelease));
|
|
298
330
|
}
|
|
299
331
|
// SQS is at-least-once, so EventBridge can deliver the same state-change
|
|
300
332
|
// twice. `onConflictDoNothing` + the partial unique indexes on
|
|
@@ -311,7 +343,9 @@ export async function ingestEvents(events, onMetric, caller) {
|
|
|
311
343
|
eventType: schema.pipelineEvent.eventType,
|
|
312
344
|
status: schema.pipelineEvent.status,
|
|
313
345
|
stageName: schema.pipelineEvent.stageName,
|
|
346
|
+
actionName: schema.pipelineEvent.actionName,
|
|
314
347
|
environment: schema.pipelineEvent.environment,
|
|
348
|
+
toolchainRelease: schema.pipelineEvent.toolchainRelease,
|
|
315
349
|
// For the per-deploy rollup below: everything `dora_deployments` needs,
|
|
316
350
|
// taken from the rows that ACTUALLY landed so a re-delivery cannot
|
|
317
351
|
// produce a second deploy.
|
|
@@ -342,7 +376,13 @@ export async function ingestEvents(events, onMetric, caller) {
|
|
|
342
376
|
reasons: [...invalidTimeReasons],
|
|
343
377
|
});
|
|
344
378
|
}
|
|
379
|
+
// The platform default, for the alert's baseline gauge — read only when a
|
|
380
|
+
// toolchain run landed, so ordinary batches pay nothing.
|
|
381
|
+
const defaultRelease = landed.some((r) => r.toolchainRelease)
|
|
382
|
+
? await readPlatformDefaultRelease(tx)
|
|
383
|
+
: null;
|
|
345
384
|
return {
|
|
385
|
+
platformDefaultRelease: defaultRelease,
|
|
346
386
|
inserted: landed.length,
|
|
347
387
|
skipped: skippedLocal,
|
|
348
388
|
unregisteredPipelineIds: unregisteredLocal,
|
|
@@ -354,7 +394,7 @@ export async function ingestEvents(events, onMetric, caller) {
|
|
|
354
394
|
};
|
|
355
395
|
});
|
|
356
396
|
if (onMetric)
|
|
357
|
-
emitIngestMetrics(insertedRows, onMetric);
|
|
397
|
+
emitIngestMetrics(insertedRows, onMetric, platformDefaultRelease);
|
|
358
398
|
// Per-deploy rollup. AFTER the events commit and outside their transaction: the
|
|
359
399
|
// events are the durable record and `dora_deployments` is derived from them, so
|
|
360
400
|
// a rollup failure must not roll back an ingest that succeeded. Rebuildable
|
|
@@ -389,4 +429,4 @@ export async function ingestEvents(events, onMetric, caller) {
|
|
|
389
429
|
insertedPipelineIds: [...new Set(insertedRows.map((r) => r.pipelineId).filter((id) => !!id))],
|
|
390
430
|
};
|
|
391
431
|
}
|
|
392
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5nZXN0LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9pbmdlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RJLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd6RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQWNoRCxxRUFBcUU7QUFDckUsU0FBUyxjQUFjLENBQUMsQ0FBYztJQUNwQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUM7V0FDdkQsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLGNBQWMsSUFBSSxDQUFDLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQztXQUNuRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUN2QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsVUFBa0IsRUFBRSxTQUFpQixFQUFFLFVBQWtCO0lBQ3hF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LEdBQUcsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTztRQUNMLFFBQVE7UUFDUixPQUFPO1FBQ1AsdUJBQXVCO1FBQ3ZCLFlBQVk7UUFDWixpQkFBaUI7UUFDakIsa0JBQWtCO1FBQ2xCLGtCQUFrQjtRQUNsQixvQkFBb0IsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdHLG1CQUFtQixFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDNUcsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBFdmVudCBpbmdlc3Q6IHRoZSBXUklURSBoYWxmIG9mIHJlcG9ydGluZy4gUmVzb2x2ZXMgaW5jb21pbmcgcGlwZWxpbmUgZXZlbnRzXG4gKiBhZ2FpbnN0IHRoZSBwaXBlbGluZSByZWdpc3RyeSwgc2NydWJzIGV2ZXJ5IGZyZWUtZm9ybSBzdHJpbmcsIGJhdGNoLWluc2VydHNcbiAqIHRoZSBtYXRjaGVkIHJvd3MgaWRlbXBvdGVudGx5LCBhbmQgaW52YWxpZGF0ZXMgdGhlIGFmZmVjdGVkIG9yZ3MnIHJlcG9ydFxuICogY2FjaGVzLiBTZXBhcmF0ZSBmcm9tIHRoZSByZXBvcnQgcXVlcmllcyBiZWNhdXNlIHRoaXMgaXMgcmVwb3J0aW5nJ3Mgb25seVxuICogZHVyYWJsZSBwZXJzaXN0ZW5jZSBib3VuZGFyeSDigJQgZXZlcnl0aGluZyBlbHNlIGluIHRoZSBzZXJ2aWNlIG9ubHkgcmVhZHMuXG4gKi9cblxuaW1wb3J0IHsgY29tcHV0ZUNyZWRpdHNGb3IsIGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBub3JtYWxpemVDb21wdXRlVHlwZSwgc2NydWJBd3NJZGVudGlmaWVycyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGluQXJyYXkgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBpbnZhbGlkYXRlT3JnUmVwb3J0cyB9IGZyb20gJy4vY2FjaGVzLmpzJztcbmltcG9ydCB7IHVwc2VydERlcGxveW1lbnRzIH0gZnJvbSAnLi9kZXBsb3ktcm9sbHVwLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5RmFpbHVyZSB9IGZyb20gJy4vZmFpbHVyZS1jbGFzc2lmaWVyLmpzJztcbmltcG9ydCB7IHNjcnViT3B0aW9uYWwgfSBmcm9tICcuL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgSW5nZXN0Q2FsbGVyLCBJbmdlc3RFdmVudCwgSW5nZXN0TWV0cmljLCBJbmdlc3RSZXN1bHQgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBDcnVkVHggfSBmcm9tICcuLi9jcnVkLXNlcnZpY2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3JlcG9ydGluZy1pbmdlc3QnKTtcblxudHlwZSBQaXBlbGluZUV2ZW50SW5zZXJ0ID0gdHlwZW9mIHNjaGVtYS5waXBlbGluZUV2ZW50LiRpbmZlckluc2VydDtcblxuXG4vKiogVGhlIHBsdWdpbiBhIHBpcGVsaW5lIHN0ZXAgcnVucywgZnJvbSB0aGUgc3RlcCBtYW5pZmVzdCBpdHMgbGFzdCBkZXBsb3kgcmVnaXN0ZXJlZC4gKi9cbmludGVyZmFjZSBTdGVwUGx1Z2luIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgcGx1Z2luUHVibGlzaGVyOiBzdHJpbmcgfCBudWxsO1xuICBwbHVnaW5QdWJsaXNoZXJJZDogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqIEFuIGFjdGlvbi9idWlsZCBldmVudCB0aGF0IGNhbiBiZSBhdHRyaWJ1dGVkIHRvIGEgcGx1Z2luIHN0ZXAuICovXG5mdW5jdGlvbiBpc0F0dHJpYnV0YWJsZShlOiBJbmdlc3RFdmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGUuZXZlbnRUeXBlID09PSAnQUNUSU9OJyB8fCBlLmV2ZW50VHlwZSA9PT0gJ0JVSUxEJylcbiAgICAmJiAoZS5ldmVudFNvdXJjZSA9PT0gJ2NvZGVwaXBlbGluZScgfHwgZS5ldmVudFNvdXJjZSA9PT0gJ2NvZGVidWlsZCcpXG4gICAgJiYgISFlLnN0YWdlTmFtZSAmJiAhIWUuYWN0aW9uTmFtZTtcbn1cblxuZnVuY3Rpb24gc3RlcEtleShwaXBlbGluZUlkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBhY3Rpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cGlwZWxpbmVJZH1cXHUwMDAwJHtzdGFnZU5hbWV9XFx1MDAwMCR7YWN0aW9uTmFtZX1gO1xufVxuXG4vKipcbiAqIFBsdWdpbiBhdHRyaWJ1dGlvbjogdGhlIHN0ZXAgbWFuaWZlc3RzIG9mIGV2ZXJ5IHBpcGVsaW5lIHdpdGggYW4gYXR0cmlidXRhYmxlXG4gKiBldmVudCwgaW4gT05FIHJlYWQgcGVyIGJhdGNoLCBrZXllZCBmb3IgYW4gaW4tbWVtb3J5IGpvaW4uIE5hbWVzIGFyZSBjb21wYXJlZFxuICogcG9zdC1zY3J1YiBvbiBib3RoIHNpZGVzICh0aGUgbWFuaWZlc3Qgc3RvcmVzIHRoZW0gc2NydWJiZWQgdGhlIHNhbWUgd2F5KS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFN0ZXBQbHVnaW5zKHR4OiBDcnVkVHgsIGF0dHJpYnV0YWJsZTogSW5nZXN0RXZlbnRbXSk6IFByb21pc2U8TWFwPHN0cmluZywgU3RlcFBsdWdpbj4+IHtcbiAgY29uc3QgcGlwZWxpbmVJZHMgPSBbLi4ubmV3IFNldChhdHRyaWJ1dGFibGUubWFwKChlKSA9PiBlLnBpcGVsaW5lSWQpKV07XG4gIGlmIChwaXBlbGluZUlkcy5sZW5ndGggPT09IDApIHJldHVybiBuZXcgTWFwKCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB0eFxuICAgIC5zZWxlY3Qoe1xuICAgICAgcGlwZWxpbmVJZDogc2NoZW1hLnBpcGVsaW5lU3RlcE1hbmlmZXN0LnBpcGVsaW5lSWQsXG4gICAgICBvcmdJZDogc2NoZW1hLnBpcGVsaW5lU3RlcE1hbmlmZXN0Lm9yZ0lkLFxuICAgICAgc3RhZ2VOYW1lOiBzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3Quc3RhZ2VOYW1lLFxuICAgICAgYWN0aW9uTmFtZTogc2NoZW1hLnBpcGVsaW5lU3RlcE1hbmlmZXN0LmFjdGlvbk5hbWUsXG4gICAgICBwbHVnaW5QdWJsaXNoZXI6IHNjaGVtYS5waXBlbGluZVN0ZXBNYW5pZmVzdC5wbHVnaW5QdWJsaXNoZXIsXG4gICAgICBwbHVnaW5QdWJsaXNoZXJJZDogc2NoZW1hLnBpcGVsaW5lU3RlcE1hbmlmZXN0LnBsdWdpblB1Ymxpc2hlcklkLFxuICAgICAgcGx1Z2luTmFtZTogc2NoZW1hLnBpcGVsaW5lU3RlcE1hbmlmZXN0LnBsdWdpbk5hbWUsXG4gICAgICBwbHVnaW5WZXJzaW9uOiBzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3QucGx1Z2luVmVyc2lvbixcbiAgICB9KVxuICAgIC5mcm9tKHNjaGVtYS5waXBlbGluZVN0ZXBNYW5pZmVzdClcbiAgICAud2hlcmUoaW5BcnJheShzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3QucGlwZWxpbmVJZCwgcGlwZWxpbmVJZHMpKTtcbiAgcmV0dXJuIG5ldyBNYXAocm93cy5tYXAoKG0pID0+IFtzdGVwS2V5KG0ucGlwZWxpbmVJZCwgbS5zdGFnZU5hbWUsIG0uYWN0aW9uTmFtZSksIG1dKSk7XG59XG5cbi8qKlxuICogQWxsb3dhbmNlIGZvciBjbG9jayBza2V3IGJldHdlZW4gYW4gQVdTIGV2ZW50J3Mgc291cmNlIGNsb2NrIGFuZCBvdXJzLiBBIHJlYWxcbiAqIENvZGVQaXBlbGluZSBldmVudCBjYW4gY2FycnkgYSB0aW1lc3RhbXAgYSBsaXR0bGUgYWhlYWQgb2Ygb3VyIGBub3dgOyB3aXRob3V0XG4gKiBzb21lIHRvbGVyYW5jZSB0aGUgdmFsaWRhdGlvbiBiZWxvdyB3b3VsZCBkcm9wIGhlYWx0aHkgZXZlbnRzIGR1cmluZyBub3JtYWxcbiAqIE5UUCBkcmlmdCwgd2hpY2ggaXMgZmFyIHdvcnNlIHRoYW4gYWRtaXR0aW5nIGEgZmV3IHNlY29uZHMgb2Ygc2tldy5cbiAqL1xuY29uc3QgQ0xPQ0tfU0tFV19UT0xFUkFOQ0VfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIFdoeSB0aGlzIGV2ZW50J3MgdGltZXN0YW1wcyBhcmUgaW1wb3NzaWJsZSwgb3IgbnVsbCB3aGVuIHRoZXkgYXJlIHVzYWJsZS5cbiAqXG4gKiBDaGVja2VkIGF0IElOR0VTVCDigJQgdGhlIGR1cmFibGUgYm91bmRhcnkg4oCUIHJhdGhlciB0aGFuIGNsYW1wZWQgd2hlbiB0aGUgbWV0cmljc1xuICogYXJlIGNvbXB1dGVkLiBBIG5lZ2F0aXZlIGR1cmF0aW9uIG9yIGEgZnV0dXJlIGRlcGxveSB1c2VkIHRvIGJlIGNsYW1wZWQgdG8gMFxuICogZG93bnN0cmVhbSwgd2hpY2ggcmVwb3J0ZWQgYSBicm9rZW4gY2xvY2sgYXMgYW4gaW5zdGFudCBkZXBsb3kgYW5kIHF1aWV0bHlcbiAqIG1vdmVkIGRlcGxveW1lbnQgZnJlcXVlbmN5LCBjaGFuZ2UtZmFpbHVyZSByYXRlIGFuZCBsZWFkIHRpbWUgZm9yIHRoZSBvcmcuXG4gKlxuICogTk9UIGNoZWNrZWQgaGVyZTogY29tbWl0IHRpbWUgdnMgZGVwbG95IGNvbXBsZXRpb24uIGBjb21taXRfdGltZXN0YW1wYCByaWRlcyB0aGVcbiAqIFBJUEVMSU5FL3NvdXJjZSBldmVudCB3aGlsZSB0aGUgZGVwbG95J3MgYGNvbXBsZXRlZF9hdGAgaXMgb24gYSBzZXBhcmF0ZSBTVEFHRVxuICogcm93LCBqb2luZWQgYnkgYGV4ZWN1dGlvbl9pZGAgb25seSB3aGVuIERPUkEgaXMgcXVlcmllZCDigJQgc28gbm8gc2luZ2xlIGV2ZW50XG4gKiBjYXJyaWVzIGJvdGgsIGFuZCB0aGF0IG9yZGVyaW5nIGNhbiBvbmx5IGJlIGd1YXJkZWQgd2hlcmUgdGhlIHR3byBtZWV0LlxuICovXG5mdW5jdGlvbiBpbnZhbGlkRXZlbnRUaW1lcyhldmVudDogSW5nZXN0RXZlbnQsIG5vd01zOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY2VpbGluZyA9IG5vd01zICsgQ0xPQ0tfU0tFV19UT0xFUkFOQ0VfTVM7XG4gIGNvbnN0IHBhcnNlZDogQXJyYXk8W3N0cmluZywgbnVtYmVyXT4gPSBbXTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBbJ3N0YXJ0ZWRBdCcsICdjb21wbGV0ZWRBdCcsICdjb21taXRUaW1lc3RhbXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHJhdyA9IGV2ZW50W2ZpZWxkXTtcbiAgICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSBjb250aW51ZTtcbiAgICBjb25zdCBtcyA9IERhdGUucGFyc2UoU3RyaW5nKHJhdykpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1zKSkgcmV0dXJuIGAke2ZpZWxkfSBpcyBub3QgYSBwYXJzZWFibGUgdGltZXN0YW1wYDtcbiAgICBpZiAobXMgPiBjZWlsaW5nKSByZXR1cm4gYCR7ZmllbGR9IGlzIGluIHRoZSBmdXR1cmVgO1xuICAgIHBhcnNlZC5wdXNoKFtmaWVsZCwgbXNdKTtcbiAgfVxuICBjb25zdCBzdGFydGVkID0gcGFyc2VkLmZpbmQoKFtmXSkgPT4gZiA9PT0gJ3N0YXJ0ZWRBdCcpPy5bMV07XG4gIGNvbnN0IGNvbXBsZXRlZCA9IHBhcnNlZC5maW5kKChbZl0pID0+IGYgPT09ICdjb21wbGV0ZWRBdCcpPy5bMV07XG4gIGlmIChzdGFydGVkICE9PSB1bmRlZmluZWQgJiYgY29tcGxldGVkICE9PSB1bmRlZmluZWQgJiYgY29tcGxldGVkIDwgc3RhcnRlZCkge1xuICAgIHJldHVybiAnY29tcGxldGVkQXQgaXMgYmVmb3JlIHN0YXJ0ZWRBdCc7XG4gIH1cbiAgaWYgKGV2ZW50LmR1cmF0aW9uTXMgIT09IHVuZGVmaW5lZCAmJiBldmVudC5kdXJhdGlvbk1zICE9PSBudWxsICYmIGV2ZW50LmR1cmF0aW9uTXMgPCAwKSB7XG4gICAgcmV0dXJuICdkdXJhdGlvbk1zIGlzIG5lZ2F0aXZlJztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUgcGVyc2lzdGVkIHJvdyBmb3Igb25lIGluZ2VzdGVkIGV2ZW50LiBUaGlzIGlzIHRoZSBEVVJBQkxFIHBlcnNpc3RlbmNlXG4gKiBib3VuZGFyeTogZXZlcnkgdXNlci9BV1MtZGVyaXZlZCBmcmVlLWZvcm0gc3RyaW5nIGlzIHNjcnViYmVkIGhlcmUsIGFuZFxuICogdGVuYW5jeSBjb21lcyBmcm9tIHRoZSBwaXBlbGluZSByZWdpc3RyeSwgbmV2ZXIgdGhlIGNhbGxlcidzIGNsYWltZWQgb3JnLlxuICovXG4vKiogVGhlIHN5bnRoIHJlZnVzYWwgY29kZSB0aGUgZXZlbnRzIExhbWJkYSBhdHRhY2hlZCAoYGRldGFpbC5wYkZhaWx1cmUuY29kZWApLCBpZiBhbnkuICovXG5mdW5jdGlvbiBwYkZhaWx1cmVDb2RlKGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZmFpbHVyZSA9IGRldGFpbD8ucGJGYWlsdXJlO1xuICBjb25zdCBjb2RlID0gZmFpbHVyZSAmJiB0eXBlb2YgZmFpbHVyZSA9PT0gJ29iamVjdCcgPyAoZmFpbHVyZSBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycgJiYgL15bQS1aXVtBLVowLTlfXXswLDYzfSQvLnRlc3QoY29kZSkgPyBjb2RlIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gdG9FdmVudFJvdyhldmVudDogSW5nZXN0RXZlbnQsIHJlZ2lzdHJ5OiB7IHBpcGVsaW5lSWQ6IHN0cmluZzsgb3JnSWQ6IHN0cmluZyB9LCBwbHVnaW46IFN0ZXBQbHVnaW4gfCB1bmRlZmluZWQsIGtleUlkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQaXBlbGluZUV2ZW50SW5zZXJ0IHtcbiAgY29uc3QgZGV0YWlsID0gZXZlbnQuc291cmNlTWVzc2FnZUlkICE9PSB1bmRlZmluZWRcbiAgICA/IHsgLi4uKGV2ZW50LmRldGFpbCA/PyB7fSksIHNvdXJjZU1lc3NhZ2VJZDogZXZlbnQuc291cmNlTWVzc2FnZUlkIH1cbiAgICA6IGV2ZW50LmRldGFpbDtcbiAgcmV0dXJuIHtcbiAgICAvLyByZWdpc3RyeS5waXBlbGluZUlkID09PSBldmVudC5waXBlbGluZUlkOyB0aGUgcmVnaXN0cnkncyBpcyBhbHdheXMgYSByb3dcbiAgICAvLyB0aGF0IGV4aXN0cyAoRkspIGFuZCBpdHMgb3JnSWQgaXMgdGhlIHRydXN0ZWQgdGVuYW50LlxuICAgIHBpcGVsaW5lSWQ6IHJlZ2lzdHJ5LnBpcGVsaW5lSWQsXG4gICAgb3JnSWQ6IHJlZ2lzdHJ5Lm9yZ0lkLFxuICAgIGV2ZW50U291cmNlOiBldmVudC5ldmVudFNvdXJjZSxcbiAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICBzdGF0dXM6IGV2ZW50LnN0YXR1cyxcbiAgICAvLyBBbiBBV1MtQVNTSUdORUQgVVVJRCwgbm90IGZyZWUtZm9ybSB0ZXh0OiBpdCBjYW4ndCBjYXJyeSBhbiBhY2NvdW50IGlkLFxuICAgIC8vIGFuZCBzY3J1YmJpbmcgYSAxMi1kaWdpdCBydW4gaW5zaWRlIGl0IHdvdWxkIGNvcnJ1cHQgdGhlIGNvcnJlbGF0aW9uIGtleS5cbiAgICBleGVjdXRpb25JZDogZXZlbnQuZXhlY3V0aW9uSWQsXG4gICAgLy8gVVNFUi1BVVRIT1JFRCBwaXBlbGluZS1zdHJ1Y3R1cmUgbmFtZXMg4oCUIHNhbWUgdW50cnVzdGVkIG9yaWdpbiBhc1xuICAgIC8vIGVycm9yTWVzc2FnZSwgc28gc2NydWJiZWQgKGEgc3RhZ2UgbmFtZWQgd2l0aCBhbiBBUk4gbXVzdCBub3QgcGVyc2lzdCkuXG4gICAgc3RhZ2VOYW1lOiBzY3J1Yk9wdGlvbmFsKGV2ZW50LnN0YWdlTmFtZSksXG4gICAgYWN0aW9uTmFtZTogc2NydWJPcHRpb25hbChldmVudC5hY3Rpb25OYW1lKSxcbiAgICAvLyBIQVJEIENPTlNUUkFJTlQ6IGFuIEFXUyBhY2NvdW50IGlkIG11c3QgTkVWRVIgYmUgcGVyc2lzdGVkLiBGYWlsdXJlIGRldGFpbFxuICAgIC8vIGFuZCBtZXNzYWdlcyByb3V0aW5lbHkgY2FycnkgQVJOcyBhbmQgYmFyZSAxMi1kaWdpdCBhY2NvdW50IGlkcy5cbiAgICBlcnJvck1lc3NhZ2U6IHNjcnViT3B0aW9uYWwoZXZlbnQuZXJyb3JNZXNzYWdlKSxcbiAgICBzdGFydGVkQXQ6IGV2ZW50LnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKGV2ZW50LnN0YXJ0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgY29tcGxldGVkQXQ6IGV2ZW50LmNvbXBsZXRlZEF0ID8gbmV3IERhdGUoZXZlbnQuY29tcGxldGVkQXQpIDogdW5kZWZpbmVkLFxuICAgIGR1cmF0aW9uTXM6IGV2ZW50LmR1cmF0aW9uTXMsXG4gICAgLy8gRGVwbG95IGF0dHJpYnV0aW9uIOKAlCBzY3J1YmJlZCBsaWtlIHRoZSBvdGhlciBmcmVlLWZvcm0gc3RyaW5ncy5cbiAgICBjb21taXRTaGE6IHNjcnViT3B0aW9uYWwoZXZlbnQuY29tbWl0U2hhKSxcbiAgICBjb21taXRSZWY6IHNjcnViT3B0aW9uYWwoZXZlbnQuY29tbWl0UmVmKSxcbiAgICBlbnZpcm9ubWVudDogc2NydWJPcHRpb25hbChldmVudC5lbnZpcm9ubWVudCksXG4gICAgLy8gTWVhc3VyZWQgbGVhZCB0aW1lOiB0aGUgb2xkZXN0IHVuc2hpcHBlZCBjb21taXQncyB0aW1lICsgdGhlIGNvdW50LiBBblxuICAgIC8vIFNDTS1kZXJpdmVkIGluc3RhbnQgYW5kIGEgcGxhaW4gaW50ZWdlciDigJQgbm90aGluZyB0byBzY3J1Yi5cbiAgICBjb21taXRUaW1lc3RhbXA6IGV2ZW50LmNvbW1pdFRpbWVzdGFtcCA/IG5ldyBEYXRlKGV2ZW50LmNvbW1pdFRpbWVzdGFtcCkgOiB1bmRlZmluZWQsXG4gICAgY29tbWl0Q291bnQ6IGV2ZW50LmNvbW1pdENvdW50LFxuICAgIC8vIE5VTEwgZm9yIG5vbi1wbHVnaW4gYWN0aW9ucyBhbmQgZm9yIHBpcGVsaW5lcyBkZXBsb3llZCB3aXRob3V0IGEgbWFuaWZlc3QuXG4gICAgcGx1Z2luUHVibGlzaGVyOiBwbHVnaW4/LnBsdWdpblB1Ymxpc2hlciA/PyBudWxsLFxuICAgIHBsdWdpblB1Ymxpc2hlcklkOiBwbHVnaW4/LnBsdWdpblB1Ymxpc2hlcklkID8/IG51bGwsXG4gICAgcGx1Z2luTmFtZTogcGx1Z2luPy5wbHVnaW5OYW1lID8/IG51bGwsXG4gICAgcGx1Z2luVmVyc2lvbjogcGx1Z2luPy5wbHVnaW5WZXJzaW9uID8/IG51bGwsXG4gICAgLy8gV0hBVCBLSU5EIG9mIHRoaW5nIGJyb2tlLCBjbGFzc2lmaWVkIGhlcmUgcmF0aGVyIHRoYW4gYXQgcmVhZCB0aW1lOiB0aGVcbiAgICAvLyBlcnJvciB0ZXh0IGlzIHNjcnViYmVkIGFib3ZlIGFuZCBldmVudHVhbGx5IHN3ZXB0IGJ5IHJldGVudGlvbiwgc28gYVxuICAgIC8vIGNhdGVnb3J5IGRlcml2ZWQgbGF0ZXIgd291bGQgaGF2ZSBub3RoaW5nIGxlZnQgdG8gcmVhZC4gTlVMTCBmb3IgYW55dGhpbmdcbiAgICAvLyB0aGF0IGlzIG5vdCBhIGZhaWx1cmUsIHNvIGl0cyBwcmVzZW5jZSBhbHdheXMgbWVhbnMgXCJ0aGlzIGJyb2tlXCIuXG4gICAgZmFpbHVyZUNhdGVnb3J5OiBjbGFzc2lmeUZhaWx1cmUoe1xuICAgICAgc3RhdHVzOiBldmVudC5zdGF0dXMsXG4gICAgICBlcnJvck1lc3NhZ2U6IHNjcnViT3B0aW9uYWwoZXZlbnQuZXJyb3JNZXNzYWdlKSxcbiAgICAgIGFjdGlvbk5hbWU6IHNjcnViT3B0aW9uYWwoZXZlbnQuYWN0aW9uTmFtZSksXG4gICAgICBzdGFnZU5hbWU6IHNjcnViT3B0aW9uYWwoZXZlbnQuc3RhZ2VOYW1lKSxcbiAgICAgIGZhaWx1cmVDb2RlOiBwYkZhaWx1cmVDb2RlKGV2ZW50LmRldGFpbCksXG4gICAgfSksXG4gICAgLy8gUHJvdmVuYW5jZS4gQm90aCBhcmUgb3BhcXVlIGlkcyDigJQgYW4gQVdTLWFzc2lnbmVkIGV2ZW50IFVVSUQgYW5kIG91ciBvd25cbiAgICAvLyBrZXkgaWQg4oCUIHNvIG5laXRoZXIgY2FuIGNhcnJ5IGFuIGFjY291bnQgaWQgYW5kIG5laXRoZXIgaXMgc2NydWJiZWRcbiAgICAvLyAoc2NydWJiaW5nIGEgZGlnaXQgcnVuIGluc2lkZSBvbmUgd291bGQgY29ycnVwdCB0aGUgY29ycmVsYXRpb24ga2V5KS5cbiAgICBzb3VyY2VFdmVudElkOiBldmVudC5zb3VyY2VFdmVudElkLFxuICAgIGluZ2VzdEtleUlkOiBrZXlJZCxcbiAgICBkZXRhaWw6IGRldGFpbCAhPT0gdW5kZWZpbmVkID8gc2NydWJBd3NJZGVudGlmaWVycyhkZXRhaWwpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIEZhbiB0ZXJtaW5hbCBTVEFHRSBvdXRjb21lcyBhbmQgcGVyLUFDVElPTiBjb21wdXRlIGNvbnN1bXB0aW9uIGludG8gdGhlXG4gKiByb3V0ZSdzIG1ldHJpYyBob29rIChwaXBlbGluZS1kYXRhIGNhbid0IGltcG9ydCBhcGktc2VydmVyJ3MgcmVnaXN0cnkpIGFmdGVyXG4gKiB0aGUgaW5zZXJ0IGNvbW1pdHMuXG4gKlxuICogRHJpdmVuIG9mZiB0aGUgSU5TRVJURUQgcm93cywgc28gYSByZS1kZWxpdmVyZWQgZXZlbnQgdGhlIGRlZHVwIGluZGV4XG4gKiBzd2FsbG93ZWQgaXMgbmV2ZXIgY291bnRlZCB0d2ljZS4gVGhhdCBwcm9wZXJ0eSBpcyBsb2FkLWJlYXJpbmcgZm9yIHRoZVxuICogY29tcHV0ZSBzZXJpZXMgaW4gYSB3YXkgaXQgd2FzIG5vdCBmb3IgdGhlIHN0YWdlIG9uZTogYSBkdXBsaWNhdGVkIHN0YWdlXG4gKiBvdXRjb21lIGRpc3RvcnRzIGEgcmF0ZSwgd2hlcmVhcyBhIGR1cGxpY2F0ZWQgdkNQVS1taW51dGUgZmlndXJlIGlzIGFcbiAqIGRvdWJsZS1jaGFyZ2Ugd2FpdGluZyBmb3IgdGhlIGRheSB0aGUgY2hhcmdlIGlzIHN3aXRjaGVkIG9uLlxuICpcbiAqIEEgbm9uLW51bGwgZW52aXJvbm1lbnQgbWFya3MgYSBkZXBsb3kuXG4gKi9cbmZ1bmN0aW9uIGVtaXRJbmdlc3RNZXRyaWNzKFxuICByb3dzOiBSZWFkb25seUFycmF5PHtcbiAgICBvcmdJZDogc3RyaW5nO1xuICAgIHBpcGVsaW5lSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgZXZlbnRUeXBlOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgc3RhZ2VOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIGVudmlyb25tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIGR1cmF0aW9uTXM/OiBudW1iZXIgfCBudWxsO1xuICAgIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgfT4sXG4gIG9uTWV0cmljOiAobTogSW5nZXN0TWV0cmljKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgciBvZiByb3dzKSB7XG4gICAgaWYgKCFyLnBpcGVsaW5lSWQpIGNvbnRpbnVlO1xuXG4gICAgLy8gQ29tcHV0ZSBjb25zdW1wdGlvbjogZXZlcnkgVEVSTUlOQUwgYWN0aW9uLCBtZWFzdXJhYmxlIG9yIG5vdC4gVGhlXG4gICAgLy8gdW5tZWFzdXJhYmxlIG9uZXMgYXJlIHRoZSBwb2ludCDigJQgdGhleSBhcmUgd2hhdCB0aGUgY292ZXJhZ2UgcmF0aW8gY291bnRzLlxuICAgIGlmIChyLmV2ZW50VHlwZSA9PT0gJ0FDVElPTicgJiYgVEVSTUlOQUxfQUNUSU9OX1NUQVRFUy5pbmNsdWRlcyhyLnN0YXR1cykpIHtcbiAgICAgIGNvbnN0IGNvbXB1dGVUeXBlID0gbm9ybWFsaXplQ29tcHV0ZVR5cGUoXG4gICAgICAgIHR5cGVvZiByLmRldGFpbD8uY29tcHV0ZVR5cGUgPT09ICdzdHJpbmcnID8gci5kZXRhaWwuY29tcHV0ZVR5cGUgOiBudWxsLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSByLmR1cmF0aW9uTXMgPz8gbnVsbDtcbiAgICAgIG9uTWV0cmljKHtcbiAgICAgICAga2luZDogJ2NvbXB1dGUnLFxuICAgICAgICBwaXBlbGluZUlkOiByLnBpcGVsaW5lSWQsXG4gICAgICAgIG9yZ0lkOiByLm9yZ0lkLFxuICAgICAgICBjb21wdXRlVHlwZSxcbiAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgY3JlZGl0czogY29tcHV0ZUNyZWRpdHNGb3IoZHVyYXRpb25NcywgY29tcHV0ZVR5cGUpLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoci5ldmVudFR5cGUgIT09ICdTVEFHRScgfHwgKHIuc3RhdHVzICE9PSAnU1VDQ0VFREVEJyAmJiByLnN0YXR1cyAhPT0gJ0ZBSUxFRCcpKSBjb250aW51ZTtcbiAgICBvbk1ldHJpYyh7XG4gICAgICBraW5kOiAnc3RhZ2UnLFxuICAgICAgcGlwZWxpbmVJZDogci5waXBlbGluZUlkLFxuICAgICAgb3JnSWQ6IHIub3JnSWQsXG4gICAgICBzdGFnZTogci5zdGFnZU5hbWUgPz8gJycsXG4gICAgICBlbnZpcm9ubWVudDogci5lbnZpcm9ubWVudCA/PyBudWxsLFxuICAgICAgcmVzdWx0OiByLnN0YXR1cyA9PT0gJ1NVQ0NFRURFRCcgPyAnc3VjY2VlZGVkJyA6ICdmYWlsZWQnLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBBY3Rpb24gc3RhdGVzIHRoYXQgbWVhbiB0aGUgYWN0aW9uIGlzIG92ZXIgYW5kIGl0cyBjb25zdW1wdGlvbiBpcyBmaW5hbC4gKi9cbmNvbnN0IFRFUk1JTkFMX0FDVElPTl9TVEFURVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ1NUT1BQRUQnXTtcblxuLyoqXG4gKiBSZXNvbHZlIGluY29taW5nIGV2ZW50cyBhZ2FpbnN0IHRoZSBwaXBlbGluZSByZWdpc3RyeSwgYmF0Y2gtaW5zZXJ0IHRoZVxuICogbWF0Y2hlZCBvbmVzLCBhbmQgaW52YWxpZGF0ZSByZXBvcnRpbmcgY2FjaGVzIGZvciBhZmZlY3RlZCBvcmdzLlxuICogRXZlbnRzIGZvciB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGFyZSBkcm9wcGVkIChhbmQgbG9nZ2VkIGF0IFdBUk5cbiAqIHdpdGggc2FtcGxlIGlkcyBzbyBhbiBvcGVyYXRvciBjYW4gc2VlIHdoZW4gRXZlbnRCcmlkZ2UgaXMgZGVsaXZlcmluZ1xuICogZXZlbnRzIGZvciBwaXBlbGluZXMgdGhhdCBoYXZlbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0KS5cbiAqXG4gKiBSZXR1cm5zIGNvdW50cyArIGEgc2FtcGxlIG9mIHVucmVnaXN0ZXJlZCBwaXBlbGluZSBpZHMgZm9yIG9ic2VydmFiaWxpdHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmdlc3RFdmVudHMoXG4gIGV2ZW50czogSW5nZXN0RXZlbnRbXSxcbiAgb25NZXRyaWM/OiAobTogSW5nZXN0TWV0cmljKSA9PiB2b2lkLFxuICBjYWxsZXI/OiBJbmdlc3RDYWxsZXIsXG4pOiBQcm9taXNlPEluZ2VzdFJlc3VsdD4ge1xuICAvLyBURU5BTkNZLiBBbiBldmVudCdzIG9yZyBjb21lcyBmcm9tIHRoZSBwaXBlbGluZSBSRUdJU1RSWSwgbm90IHRoZSB0b2tlbiwgc29cbiAgLy8gdGhlIHNjb3BlIGNoZWNrIGFsb25lIGxldCBhbnkgYHJlcG9ydGluZzppbmdlc3RgIGhvbGRlciBwb3N0IGV2ZW50cyBmb3JcbiAgLy8gYW5vdGhlciBvcmcncyBwaXBlbGluZSBpZCBhbmQgaGF2ZSB0aGVtIGF0dHJpYnV0ZWQgdGhlcmUuIGBjYWxsZXJgIGNhcnJpZXNcbiAgLy8gdGhlIG9yZyBpZHMgdGhpcyB0b2tlbiBtYXkgd3JpdGUgZm9yOyBhbnl0aGluZyBlbHNlIGlzIGRyb3BwZWQgYmVsb3cuXG4gIC8vXG4gIC8vIGBjYWxsZXJgIGlzIG9wdGlvbmFsIG9ubHkgc28gaW4tcHJvY2VzcyBjYWxsZXJzIHRoYXQgYWxyZWFkeSBydW5cbiAgLy8gY3Jvc3MtdGVuYW50ICh0ZXN0cywgYmFja2ZpbGxzKSBrZWVwIHdvcmtpbmcg4oCUIGFuIEFCU0VOVCBjYWxsZXIgbWVhbnMgXCJub1xuICAvLyByZXN0cmljdGlvblwiLCBhbmQgdGhlIHJvdXRlIGFsd2F5cyBzdXBwbGllcyBvbmUuIEEgY2FsbGVyIHdpdGggYW4gRU1QVFlcbiAgLy8gYWxsb3ctbGlzdCBhbmQgbm8gY3Jvc3NUZW5hbnQgZmxhZyB0aGVyZWZvcmUgZHJvcHMgZXZlcnl0aGluZywgd2hpY2ggaXMgdGhlXG4gIC8vIHJpZ2h0IGFuc3dlciB3aGVuIHRoZSByb3V0ZSBjb3VsZCBub3QgZXN0YWJsaXNoIHdobyBpcyB3cml0aW5nLlxuICBjb25zdCB1bnJlc3RyaWN0ZWQgPSBjYWxsZXIgPT09IHVuZGVmaW5lZCB8fCBjYWxsZXIuY3Jvc3NUZW5hbnQgPT09IHRydWU7XG4gIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KGNhbGxlcj8uYWxsb3dlZE9yZ0lkcyA/PyBbXSk7XG4gIC8vIE11bHRpLW9yZyBiYXRjaCBpbnNlcnQ6IHRoZSBjYWxsZXIgcmVzb2x2ZXMgdG8gbXVsdGlwbGUgb3JncyB2aWEgdGhlXG4gIC8vIHBpcGVsaW5lLXJlZ2lzdHJ5IGxvb2t1cCBiZWxvdywgc28gdGhlIHJvdXRlIGxheWVyIE1VU1QgZXN0YWJsaXNoIGFcbiAgLy8gYHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgaXNTdXBlckFkbWluOiB0cnVlIH0sIC4uLilgIHNjb3BlIGJlZm9yZSBjYWxsaW5nXG4gIC8vIHRoaXMgZnVuY3Rpb24uIFVuZGVyIEZPUkNFJ2QgUkxTLCBhIHNpbmdsZSB0eCB3aXRoIGBhcHAub3JnX2lkID0gPG9uZVxuICAvLyBvcmc+YCBjb3VsZCBvbmx5IHdyaXRlIGV2ZW50cyBmb3IgdGhhdCBvcmc7IGJ5cGFzcyB2aWEgc3lzYWRtaW4gaXNcbiAgLy8gdGhlIHJpZ2h0IGdhdGUgZm9yIHRoaXMgc2VydmVyLWludGVybmFsIGNyb3NzLXRlbmFudCBlbmRwb2ludC4gU2VlXG4gIC8vIGFwaS9yZXBvcnRpbmcvc3JjL3JvdXRlcy9ldmVudC1pbmdlc3QudHMgZm9yIHRoZSB3cmFwcGVyLlxuICAvLyBDYWNoZXMgYXJlIGludmFsaWRhdGVkIEFGVEVSIHRoZSB0eCByZXNvbHZlczogZG9pbmcgaXQgaW5zaWRlIGhlbGQgdGhlIHBnXG4gIC8vIGxvY2tzIG9wZW4gYWNyb3NzIHVucmVsYXRlZCBjYWNoZSByb3VuZC10cmlwcy4gVGhlIFRUTCBpcyAyLTUgbWluLCBzbyBhXG4gIC8vIGZpcmUtYW5kLWZvcmdldCBwb3N0LWNvbW1pdCBpbnZhbGlkYXRpb24gaXMgYW4gYWNjZXB0YWJsZSB0cmFkZS5cbiAgY29uc3QgeyBpbnNlcnRlZCwgc2tpcHBlZCwgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMsIGFmZmVjdGVkT3JncywgZHJvcHBlZEZvcmVpZ25PcmcsIGRyb3BwZWRJbnZhbGlkVGltZSwgZm9yZWlnblBpcGVsaW5lSWRzLCBpbnNlcnRlZFJvd3MgfSA9IGF3YWl0IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAvLyBCYXRjaC1yZXNvbHZlIGFsbCB1bmlxdWUgcGlwZWxpbmUgaWRzIGluIG9uZSBxdWVyeVxuICAgIGNvbnN0IHVuaXF1ZUlkcyA9IFsuLi5uZXcgU2V0KGV2ZW50cy5tYXAoZSA9PiBlLnBpcGVsaW5lSWQpKV07XG4gICAgY29uc3QgcmVnaXN0cnlSb3dzID0gYXdhaXQgdHhcbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICBwaXBlbGluZUlkOiBzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5waXBlbGluZUlkLFxuICAgICAgICBvcmdJZDogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkub3JnSWQsXG4gICAgICB9KVxuICAgICAgLmZyb20oc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkpXG4gICAgICAud2hlcmUoaW5BcnJheShzY2hlbWEucGlwZWxpbmVSZWdpc3RyeS5waXBlbGluZUlkLCB1bmlxdWVJZHMpKTtcblxuICAgIGNvbnN0IGlkTWFwID0gbmV3IE1hcChyZWdpc3RyeVJvd3MubWFwKHIgPT4gW3IucGlwZWxpbmVJZCwgcl0pKTtcbiAgICBjb25zdCBzdGVwUGx1Z2lucyA9IGF3YWl0IGxvYWRTdGVwUGx1Z2lucyh0eCwgZXZlbnRzLmZpbHRlcigoZSkgPT4gaXNBdHRyaWJ1dGFibGUoZSkgJiYgaWRNYXAuaGFzKGUucGlwZWxpbmVJZCkpKTtcblxuICAgIC8vIEJ1aWxkIGluc2VydCBiYXRjaCAoc2tpcCBldmVudHMgd2hvc2UgcGlwZWxpbmUgaXNuJ3QgcmVnaXN0ZXJlZClcbiAgICBjb25zdCByb3dzOiBQaXBlbGluZUV2ZW50SW5zZXJ0W10gPSBbXTtcbiAgICBsZXQgc2tpcHBlZExvY2FsID0gMDtcbiAgICBsZXQgZm9yZWlnbkxvY2FsID0gMDtcbiAgICBsZXQgaW52YWxpZFRpbWVMb2NhbCA9IDA7XG4gICAgY29uc3QgaW52YWxpZFRpbWVSZWFzb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgZm9yZWlnbk9yZ0lkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGZvcmVpZ25QaXBlbGluZUlkc0xvY2FsID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgdW5yZWdpc3RlcmVkTG9jYWw6IHN0cmluZ1tdID0gW107XG4gICAgLy8gT25lIGBub3dgIGZvciB0aGUgd2hvbGUgYmF0Y2g6IHBlci1ldmVudCBjbG9ja3Mgd291bGQgbGV0IGFuIGV2ZW50IHBhc3Mgb3JcbiAgICAvLyBmYWlsIGRlcGVuZGluZyBvbiB3aGVyZSBpdCBzYXQgaW4gdGhlIGxvb3AuXG4gICAgY29uc3Qgbm93TXMgPSBEYXRlLm5vdygpO1xuXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gaWRNYXAuZ2V0KGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgaWYgKCFyZWdpc3RyeSkge1xuICAgICAgICBza2lwcGVkTG9jYWwrKztcbiAgICAgICAgdW5yZWdpc3RlcmVkTG9jYWwucHVzaChldmVudC5waXBlbGluZUlkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBUaGUgcGlwZWxpbmUgcmVzb2x2ZXMgdG8gYW4gb3JnIHRoaXMgY2FsbGVyIG1heSBub3Qgd3JpdGUgZm9yLiBDb3VudGVkXG4gICAgICAvLyBzZXBhcmF0ZWx5IGZyb20gYHNraXBwZWRgIChhbiB1bnJlZ2lzdGVyZWQgaWQgaXMgYSBwcm9kdWNlciBydW5uaW5nXG4gICAgICAvLyBhaGVhZCBvZiByZWdpc3RyYXRpb247IHRoaXMgaXMgYSB0ZW5hbmN5IHJlZnVzYWwpIGFuZCBuZXZlciBpbnNlcnRlZC5cbiAgICAgIGlmICghdW5yZXN0cmljdGVkICYmICFhbGxvd2VkLmhhcyhyZWdpc3RyeS5vcmdJZCkpIHtcbiAgICAgICAgZm9yZWlnbkxvY2FsKys7XG4gICAgICAgIGZvcmVpZ25PcmdJZHMuYWRkKHJlZ2lzdHJ5Lm9yZ0lkKTtcbiAgICAgICAgZm9yZWlnblBpcGVsaW5lSWRzTG9jYWwuYWRkKGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIEltcG9zc2libGUgdGltZXN0YW1wcyBhcmUgcmVmdXNlZCBhdCB0aGUgYm91bmRhcnksIHNvIG5vIGRvd25zdHJlYW1cbiAgICAgIC8vIG1ldHJpYyBoYXMgdG8gY2xhbXAgYSBuZWdhdGl2ZSBnYXAgYW5kIGNhbGwgaXQgemVyby5cbiAgICAgIGNvbnN0IGJhZFRpbWUgPSBpbnZhbGlkRXZlbnRUaW1lcyhldmVudCwgbm93TXMpO1xuICAgICAgaWYgKGJhZFRpbWUpIHtcbiAgICAgICAgaW52YWxpZFRpbWVMb2NhbCsrO1xuICAgICAgICBpbnZhbGlkVGltZVJlYXNvbnMuYWRkKGJhZFRpbWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9IHNjcnViT3B0aW9uYWwoZXZlbnQuc3RhZ2VOYW1lKTtcbiAgICAgIGNvbnN0IGFjdGlvbk5hbWUgPSBzY3J1Yk9wdGlvbmFsKGV2ZW50LmFjdGlvbk5hbWUpO1xuICAgICAgY29uc3Qgc3RlcCA9IGlzQXR0cmlidXRhYmxlKGV2ZW50KSAmJiBzdGFnZU5hbWUgJiYgYWN0aW9uTmFtZVxuICAgICAgICA/IHN0ZXBQbHVnaW5zLmdldChzdGVwS2V5KHJlZ2lzdHJ5LnBpcGVsaW5lSWQsIHN0YWdlTmFtZSwgYWN0aW9uTmFtZSkpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgLy8gU2FtZS1vcmcgZ3VhcmQ6IGEgbWFuaWZlc3Qgcm93IGlzIG9ubHkgZXZlciB3cml0dGVuIGJ5IHRoZSBvcmcgdGhhdFxuICAgICAgLy8gb3ducyB0aGUgcGlwZWxpbmUsIGJ1dCB0aGUgaW5nZXN0IHJ1bnMgY3Jvc3MtdGVuYW50LCBzbyBkb24ndCBsZWFuIG9uIGl0LlxuICAgICAgcm93cy5wdXNoKHRvRXZlbnRSb3coZXZlbnQsIHJlZ2lzdHJ5LCBzdGVwICYmIHN0ZXAub3JnSWQgPT09IHJlZ2lzdHJ5Lm9yZ0lkID8gc3RlcCA6IHVuZGVmaW5lZCwgY2FsbGVyPy5rZXlJZCkpO1xuICAgIH1cblxuICAgIC8vIFNRUyBpcyBhdC1sZWFzdC1vbmNlLCBzbyBFdmVudEJyaWRnZSBjYW4gZGVsaXZlciB0aGUgc2FtZSBzdGF0ZS1jaGFuZ2VcbiAgICAvLyB0d2ljZS4gYG9uQ29uZmxpY3REb05vdGhpbmdgICsgdGhlIHBhcnRpYWwgdW5pcXVlIGluZGV4ZXMgb25cbiAgICAvLyAocGlwZWxpbmVfaWQsIGV4ZWN1dGlvbl9pZCwgZXZlbnRfdHlwZSwgc3RhdHVzLCBzdGFnZV9uYW1lLCBhY3Rpb25fbmFtZSlcbiAgICAvLyBhbmQgb24gc291cmNlX2V2ZW50X2lkICh0aGUgRXZlbnRCcmlkZ2UgaWQsIHdoZW4gcHJlc2VudCkgbWFrZVxuICAgIC8vIHJlLWRlbGl2ZXJ5IGlkZW1wb3RlbnQuIGByZXR1cm5pbmdgIGdpdmVzIHRoZSBSRUFMIGluc2VydGVkIHNldCBzb1xuICAgIC8vIGNvdW50cywgbWV0cmljcyBhbmQgY2FjaGUgaW52YWxpZGF0aW9uIGFsbCBpZ25vcmUgZHVwbGljYXRlcy5cbiAgICBjb25zdCBsYW5kZWQgPSByb3dzLmxlbmd0aCA+IDBcbiAgICAgID8gYXdhaXQgdHguaW5zZXJ0KHNjaGVtYS5waXBlbGluZUV2ZW50KS52YWx1ZXMocm93cylcbiAgICAgICAgLm9uQ29uZmxpY3REb05vdGhpbmcoKVxuICAgICAgICAucmV0dXJuaW5nKHtcbiAgICAgICAgICBvcmdJZDogc2NoZW1hLnBpcGVsaW5lRXZlbnQub3JnSWQsXG4gICAgICAgICAgcGlwZWxpbmVJZDogc2NoZW1hLnBpcGVsaW5lRXZlbnQucGlwZWxpbmVJZCxcbiAgICAgICAgICBldmVudFR5cGU6IHNjaGVtYS5waXBlbGluZUV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgICBzdGF0dXM6IHNjaGVtYS5waXBlbGluZUV2ZW50LnN0YXR1cyxcbiAgICAgICAgICBzdGFnZU5hbWU6IHNjaGVtYS5waXBlbGluZUV2ZW50LnN0YWdlTmFtZSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuZW52aXJvbm1lbnQsXG4gICAgICAgICAgLy8gRm9yIHRoZSBwZXItZGVwbG95IHJvbGx1cCBiZWxvdzogZXZlcnl0aGluZyBgZG9yYV9kZXBsb3ltZW50c2AgbmVlZHMsXG4gICAgICAgICAgLy8gdGFrZW4gZnJvbSB0aGUgcm93cyB0aGF0IEFDVFVBTExZIGxhbmRlZCBzbyBhIHJlLWRlbGl2ZXJ5IGNhbm5vdFxuICAgICAgICAgIC8vIHByb2R1Y2UgYSBzZWNvbmQgZGVwbG95LlxuICAgICAgICAgIGV4ZWN1dGlvbklkOiBzY2hlbWEucGlwZWxpbmVFdmVudC5leGVjdXRpb25JZCxcbiAgICAgICAgICBjb21taXRTaGE6IHNjaGVtYS5waXBlbGluZUV2ZW50LmNvbW1pdFNoYSxcbiAgICAgICAgICBjb21taXRUaW1lc3RhbXA6IHNjaGVtYS5waXBlbGluZUV2ZW50LmNvbW1pdFRpbWVzdGFtcCxcbiAgICAgICAgICBjb21taXRDb3VudDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuY29tbWl0Q291bnQsXG4gICAgICAgICAgY29tcGxldGVkQXQ6IHNjaGVtYS5waXBlbGluZUV2ZW50LmNvbXBsZXRlZEF0LFxuICAgICAgICAgIHN0YXJ0ZWRBdDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuc3RhcnRlZEF0LFxuICAgICAgICAgIGNyZWF0ZWRBdDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuY3JlYXRlZEF0LFxuICAgICAgICAgIGRldGFpbDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuZGV0YWlsLFxuICAgICAgICAgIHNvdXJjZUV2ZW50SWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50LnNvdXJjZUV2ZW50SWQsXG4gICAgICAgIH0pXG4gICAgICA6IFtdO1xuXG4gICAgLy8gTG9nIGluc2lkZSB0aGUgdHggc2NvcGUgd2hpbGUgdGhlIG9yZyBzZXQgaXMgaW4gaGFuZC4gV0FSTiwgbm90IGVycm9yOlxuICAgIC8vIGEgbWlzcm91dGVkIHByb2R1Y2VyIGlzIHRoZSBjb21tb24gY2F1c2UsIGJ1dCB0aGUgc2FtZSBsaW5lIGlzIHRoZSBvbmx5XG4gICAgLy8gc2lnbmFsIG9mIGFuIGluamVjdGlvbiBhdHRlbXB0LCBzbyBpdCBuYW1lcyB0aGUgb3JncyBpdCByZWZ1c2VkLlxuICAgIGlmIChmb3JlaWduTG9jYWwgPiAwKSB7XG4gICAgICBsb2dnZXIud2FybignRHJvcHBlZCBpbmdlc3QgZXZlbnRzIGZvciBvcmdzIHRoZSBjYWxsZXIgbWF5IG5vdCB3cml0ZSBmb3InLCB7XG4gICAgICAgIGRyb3BwZWQ6IGZvcmVpZ25Mb2NhbCxcbiAgICAgICAgZm9yZWlnbk9yZ0lkczogWy4uLmZvcmVpZ25PcmdJZHNdLFxuICAgICAgICBhbGxvd2VkT3JnSWRzOiBbLi4uYWxsb3dlZF0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFRpbWVMb2NhbCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKCdEcm9wcGVkIGluZ2VzdCBldmVudHMgd2l0aCBpbXBvc3NpYmxlIHRpbWVzdGFtcHMnLCB7XG4gICAgICAgIGRyb3BwZWQ6IGludmFsaWRUaW1lTG9jYWwsXG4gICAgICAgIHJlYXNvbnM6IFsuLi5pbnZhbGlkVGltZVJlYXNvbnNdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGluc2VydGVkOiBsYW5kZWQubGVuZ3RoLFxuICAgICAgc2tpcHBlZDogc2tpcHBlZExvY2FsLFxuICAgICAgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHM6IHVucmVnaXN0ZXJlZExvY2FsLFxuICAgICAgYWZmZWN0ZWRPcmdzOiBbLi4ubmV3IFNldChsYW5kZWQubWFwKHIgPT4gci5vcmdJZCkpXSxcbiAgICAgIGRyb3BwZWRGb3JlaWduT3JnOiBmb3JlaWduTG9jYWwsXG4gICAgICBkcm9wcGVkSW52YWxpZFRpbWU6IGludmFsaWRUaW1lTG9jYWwsXG4gICAgICBmb3JlaWduUGlwZWxpbmVJZHM6IFsuLi5mb3JlaWduUGlwZWxpbmVJZHNMb2NhbF0sXG4gICAgICBpbnNlcnRlZFJvd3M6IGxhbmRlZCxcbiAgICB9O1xuICB9KTtcblxuICBpZiAob25NZXRyaWMpIGVtaXRJbmdlc3RNZXRyaWNzKGluc2VydGVkUm93cywgb25NZXRyaWMpO1xuXG4gIC8vIFBlci1kZXBsb3kgcm9sbHVwLiBBRlRFUiB0aGUgZXZlbnRzIGNvbW1pdCBhbmQgb3V0c2lkZSB0aGVpciB0cmFuc2FjdGlvbjogdGhlXG4gIC8vIGV2ZW50cyBhcmUgdGhlIGR1cmFibGUgcmVjb3JkIGFuZCBgZG9yYV9kZXBsb3ltZW50c2AgaXMgZGVyaXZlZCBmcm9tIHRoZW0sIHNvXG4gIC8vIGEgcm9sbHVwIGZhaWx1cmUgbXVzdCBub3Qgcm9sbCBiYWNrIGFuIGluZ2VzdCB0aGF0IHN1Y2NlZWRlZC4gUmVidWlsZGFibGVcbiAgLy8gZWl0aGVyIHdheS4gYHVwc2VydERlcGxveW1lbnRzYCBuZXZlciB0aHJvd3MgZm9yIHRoYXQgcmVhc29uLlxuICBhd2FpdCB1cHNlcnREZXBsb3ltZW50cyhpbnNlcnRlZFJvd3MpO1xuXG4gIC8vIFN1cmZhY2UgdGhlIHNpbGVudCBza2lwOiBhbiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWQgdXN1YWxseSBtZWFucyB0aGVcbiAgLy8gcGlwZWxpbmUgaGFzbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0IChvciBpdHNcbiAgLy8gcGIucGlwZWxpbmUtaWQgdGFnIGlzIG1pc3NpbmcvdW5yZWFkYWJsZSBieSB0aGUgTGFtYmRhKS4gTG9nZ2luZyBpdFxuICAvLyBtYWtlcyBhIGJyb2tlbiBqb2luIHZpc2libGUgaW5zdGVhZCBvZiBsb29raW5nIGxpa2UgXCJubyBhY3Rpdml0eVwiLlxuICBpZiAodW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoID4gMCkge1xuICAgIGxvZ2dlci53YXJuKCdQaXBlbGluZSBldmVudHMgc2tpcHBlZDogcGlwZWxpbmUgaWQgbm90IGZvdW5kIGluIHJlZ2lzdHJ5Jywge1xuICAgICAgY291bnQ6IHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLmxlbmd0aCxcbiAgICAgIHNhbXBsZTogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMuc2xpY2UoMCwgMyksXG4gICAgfSk7XG4gIH1cblxuICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAvLyBzaG9ydCBlbm91Z2ggdGhhdCBhIG1pc3NlZCBpbnZhbGlkYXRpb24gc2VsZi1oZWFscy5cbiAgaWYgKGFmZmVjdGVkT3Jncy5sZW5ndGggPiAwKSB7XG4gICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICBpbnZhbGlkYXRlT3JnUmVwb3J0cyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZDogb3JnLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICB9KSxcbiAgICApKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5zZXJ0ZWQsXG4gICAgc2tpcHBlZCxcbiAgICB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcyxcbiAgICBhZmZlY3RlZE9yZ3MsXG4gICAgZHJvcHBlZEZvcmVpZ25PcmcsXG4gICAgZHJvcHBlZEludmFsaWRUaW1lLFxuICAgIGZvcmVpZ25QaXBlbGluZUlkcyxcbiAgICBpbnNlcnRlZEV4ZWN1dGlvbklkczogWy4uLm5ldyBTZXQoaW5zZXJ0ZWRSb3dzLm1hcCgocikgPT4gci5leGVjdXRpb25JZCkuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKSldLFxuICAgIGluc2VydGVkUGlwZWxpbmVJZHM6IFsuLi5uZXcgU2V0KGluc2VydGVkUm93cy5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKSldLFxuICB9O1xufVxuIl19
|
|
432
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5nZXN0LmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9pbmdlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RJLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUNMLG1CQUFtQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUM3RyxrQkFBa0IsR0FDbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3pELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBY2hELHFFQUFxRTtBQUNyRSxTQUFTLGNBQWMsQ0FBQyxDQUFjO0lBQ3BDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQztXQUN2RCxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssY0FBYyxJQUFJLENBQUMsQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDO1dBQ25FLENBQUMsQ0FBQyxDQUFDLENB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Q0FBQyxDQUFDLEVBQUUsRUFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdHLG1CQUFtQixFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDNUcsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBFdmVudCBpbmdlc3Q6IHRoZSBXUklURSBoYWxmIG9mIHJlcG9ydGluZy4gUmVzb2x2ZXMgaW5jb21pbmcgcGlwZWxpbmUgZXZlbnRzXG4gKiBhZ2FpbnN0IHRoZSBwaXBlbGluZSByZWdpc3RyeSwgc2NydWJzIGV2ZXJ5IGZyZWUtZm9ybSBzdHJpbmcsIGJhdGNoLWluc2VydHNcbiAqIHRoZSBtYXRjaGVkIHJvd3MgaWRlbXBvdGVudGx5LCBhbmQgaW52YWxpZGF0ZXMgdGhlIGFmZmVjdGVkIG9yZ3MnIHJlcG9ydFxuICogY2FjaGVzLiBTZXBhcmF0ZSBmcm9tIHRoZSByZXBvcnQgcXVlcmllcyBiZWNhdXNlIHRoaXMgaXMgcmVwb3J0aW5nJ3Mgb25seVxuICogZHVyYWJsZSBwZXJzaXN0ZW5jZSBib3VuZGFyeSDigJQgZXZlcnl0aGluZyBlbHNlIGluIHRoZSBzZXJ2aWNlIG9ubHkgcmVhZHMuXG4gKi9cblxuaW1wb3J0IHsgY29tcHV0ZUNyZWRpdHNGb3IsIGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBub3JtYWxpemVDb21wdXRlVHlwZSwgc2NydWJBd3NJZGVudGlmaWVycyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGluQXJyYXkgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgeyBpbnZhbGlkYXRlT3JnUmVwb3J0cyB9IGZyb20gJy4vY2FjaGVzLmpzJztcbmltcG9ydCB7IHVwc2VydERlcGxveW1lbnRzIH0gZnJvbSAnLi9kZXBsb3ktcm9sbHVwLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5RmFpbHVyZSB9IGZyb20gJy4vZmFpbHVyZS1jbGFzc2lmaWVyLmpzJztcbmltcG9ydCB7IHNjcnViT3B0aW9uYWwgfSBmcm9tICcuL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB7XG4gIGRlcGxveWVkVG9vbGNoYWluT2YsIHJlYWRQbGF0Zm9ybURlZmF1bHRSZWxlYXNlLCBTRUxGX01VVEFUSU9OX0FDVElPTiwgU0VMRl9NVVRBVElPTl9TVEFHRSwgdG9vbGNoYWluQWN0aW9uT2YsXG4gIHRvb2xjaGFpbk91dGNvbWVPZiwgdHlwZSBEZXBsb3llZFRvb2xjaGFpbixcbn0gZnJvbSAnLi90b29sY2hhaW4tcnVucy5qcyc7XG5pbXBvcnQgdHlwZSB7IEluZ2VzdENhbGxlciwgSW5nZXN0RXZlbnQsIEluZ2VzdE1ldHJpYywgSW5nZXN0UmVzdWx0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBzY2hlbWEgfSBmcm9tICcuLi8uLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50VHggfSBmcm9tICcuLi8uLi9kYXRhYmFzZS90ZW5hbmN5LmpzJztcbmltcG9ydCB0eXBlIHsgQ3J1ZFR4IH0gZnJvbSAnLi4vY3J1ZC1zZXJ2aWNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdyZXBvcnRpbmctaW5nZXN0Jyk7XG5cbnR5cGUgUGlwZWxpbmVFdmVudEluc2VydCA9IHR5cGVvZiBzY2hlbWEucGlwZWxpbmVFdmVudC4kaW5mZXJJbnNlcnQ7XG5cblxuLyoqIFRoZSBwbHVnaW4gYSBwaXBlbGluZSBzdGVwIHJ1bnMsIGZyb20gdGhlIHN0ZXAgbWFuaWZlc3QgaXRzIGxhc3QgZGVwbG95IHJlZ2lzdGVyZWQuICovXG5pbnRlcmZhY2UgU3RlcFBsdWdpbiB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHBsdWdpblB1Ymxpc2hlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luUHVibGlzaGVySWQ6IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbk5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpblZlcnNpb246IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBBbiBhY3Rpb24vYnVpbGQgZXZlbnQgdGhhdCBjYW4gYmUgYXR0cmlidXRlZCB0byBhIHBsdWdpbiBzdGVwLiAqL1xuZnVuY3Rpb24gaXNBdHRyaWJ1dGFibGUoZTogSW5nZXN0RXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChlLmV2ZW50VHlwZSA9PT0gJ0FDVElPTicgfHwgZS5ldmVudFR5cGUgPT09ICdCVUlMRCcpXG4gICAgJiYgKGUuZXZlbnRTb3VyY2UgPT09ICdjb2RlcGlwZWxpbmUnIHx8IGUuZXZlbnRTb3VyY2UgPT09ICdjb2RlYnVpbGQnKVxuICAgICYmICEhZS5zdGFnZU5hbWUgJiYgISFlLmFjdGlvbk5hbWU7XG59XG5cbmZ1bmN0aW9uIHN0ZXBLZXkocGlwZWxpbmVJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgYWN0aW9uTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3BpcGVsaW5lSWR9XFx1MDAwMCR7c3RhZ2VOYW1lfVxcdTAwMDAke2FjdGlvbk5hbWV9YDtcbn1cblxuLyoqXG4gKiBQbHVnaW4gYXR0cmlidXRpb24gQU5EIHRoZSBkZXBsb3llZCB0b29sY2hhaW4gcmVsZWFzZTogdGhlIHN0ZXAgbWFuaWZlc3RzIG9mXG4gKiBldmVyeSBwaXBlbGluZSB3aXRoIGFuIGF0dHJpYnV0YWJsZSBldmVudCwgaW4gT05FIHJlYWQgcGVyIGJhdGNoLCBrZXllZCBmb3JcbiAqIGFuIGluLW1lbW9yeSBqb2luLiBOYW1lcyBhcmUgY29tcGFyZWQgcG9zdC1zY3J1YiBvbiBib3RoIHNpZGVzICh0aGUgbWFuaWZlc3RcbiAqIHN0b3JlcyB0aGVtIHNjcnViYmVkIHRoZSBzYW1lIHdheSkuXG4gKlxuICogVGhlIHRvb2xjaGFpbiBtYXAgaXMgdGhlIFBMQVRGT1JNJ3MgcmVjb3JkIG9mIHdoYXQgd2FzIGRlcGxveWVkICh0aGVcbiAqIG1hbmlmZXN0J3MgYGJ1aWxkLWltYWdlYCBlbnRyeSkg4oCUIHRoZSBvbmx5IHNvdXJjZSB0aGUgwqc3IHJ1biBzdGFtcCBtYXkgdXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkU3RlcFBsdWdpbnModHg6IENydWRUeCwgYXR0cmlidXRhYmxlOiBJbmdlc3RFdmVudFtdKTogUHJvbWlzZTx7IHN0ZXBzOiBNYXA8c3RyaW5nLCBTdGVwUGx1Z2luPjsgdG9vbGNoYWluOiBNYXA8c3RyaW5nLCBEZXBsb3llZFRvb2xjaGFpbj4gfT4ge1xuICBjb25zdCBwaXBlbGluZUlkcyA9IFsuLi5uZXcgU2V0KGF0dHJpYnV0YWJsZS5tYXAoKGUpID0+IGUucGlwZWxpbmVJZCkpXTtcbiAgaWYgKHBpcGVsaW5lSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgc3RlcHM6IG5ldyBNYXAoKSwgdG9vbGNoYWluOiBuZXcgTWFwKCkgfTtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHR4XG4gICAgLnNlbGVjdCh7XG4gICAgICBwaXBlbGluZUlkOiBzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3QucGlwZWxpbmVJZCxcbiAgICAgIG9yZ0lkOiBzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3Qub3JnSWQsXG4gICAgICBzdGFnZU5hbWU6IHNjaGVtYS5waXBlbGluZVN0ZXBNYW5pZmVzdC5zdGFnZU5hbWUsXG4gICAgICBhY3Rpb25OYW1lOiBzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3QuYWN0aW9uTmFtZSxcbiAgICAgIHBsdWdpblB1Ymxpc2hlcjogc2NoZW1hLnBpcGVsaW5lU3RlcE1hbmlmZXN0LnBsdWdpblB1Ymxpc2hlcixcbiAgICAgIHBsdWdpblB1Ymxpc2hlcklkOiBzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3QucGx1Z2luUHVibGlzaGVySWQsXG4gICAgICBwbHVnaW5OYW1lOiBzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3QucGx1Z2luTmFtZSxcbiAgICAgIHBsdWdpblZlcnNpb246IHNjaGVtYS5waXBlbGluZVN0ZXBNYW5pZmVzdC5wbHVnaW5WZXJzaW9uLFxuICAgICAgc3RlcEtleTogc2NoZW1hLnBpcGVsaW5lU3RlcE1hbmlmZXN0LnN0ZXBLZXksXG4gICAgfSlcbiAgICAuZnJvbShzY2hlbWEucGlwZWxpbmVTdGVwTWFuaWZlc3QpXG4gICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lU3RlcE1hbmlmZXN0LnBpcGVsaW5lSWQsIHBpcGVsaW5lSWRzKSk7XG4gIHJldHVybiB7XG4gICAgc3RlcHM6IG5ldyBNYXAocm93cy5tYXAoKG0pID0+IFtzdGVwS2V5KG0ucGlwZWxpbmVJZCwgbS5zdGFnZU5hbWUsIG0uYWN0aW9uTmFtZSksIG1dKSksXG4gICAgdG9vbGNoYWluOiBkZXBsb3llZFRvb2xjaGFpbk9mKHJvd3MpLFxuICB9O1xufVxuXG4vKipcbiAqIEFsbG93YW5jZSBmb3IgY2xvY2sgc2tldyBiZXR3ZWVuIGFuIEFXUyBldmVudCdzIHNvdXJjZSBjbG9jayBhbmQgb3Vycy4gQSByZWFsXG4gKiBDb2RlUGlwZWxpbmUgZXZlbnQgY2FuIGNhcnJ5IGEgdGltZXN0YW1wIGEgbGl0dGxlIGFoZWFkIG9mIG91ciBgbm93YDsgd2l0aG91dFxuICogc29tZSB0b2xlcmFuY2UgdGhlIHZhbGlkYXRpb24gYmVsb3cgd291bGQgZHJvcCBoZWFsdGh5IGV2ZW50cyBkdXJpbmcgbm9ybWFsXG4gKiBOVFAgZHJpZnQsIHdoaWNoIGlzIGZhciB3b3JzZSB0aGFuIGFkbWl0dGluZyBhIGZldyBzZWNvbmRzIG9mIHNrZXcuXG4gKi9cbmNvbnN0IENMT0NLX1NLRVdfVE9MRVJBTkNFX01TID0gNSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBXaHkgdGhpcyBldmVudCdzIHRpbWVzdGFtcHMgYXJlIGltcG9zc2libGUsIG9yIG51bGwgd2hlbiB0aGV5IGFyZSB1c2FibGUuXG4gKlxuICogQ2hlY2tlZCBhdCBJTkdFU1Qg4oCUIHRoZSBkdXJhYmxlIGJvdW5kYXJ5IOKAlCByYXRoZXIgdGhhbiBjbGFtcGVkIHdoZW4gdGhlIG1ldHJpY3NcbiAqIGFyZSBjb21wdXRlZC4gQSBuZWdhdGl2ZSBkdXJhdGlvbiBvciBhIGZ1dHVyZSBkZXBsb3kgdXNlZCB0byBiZSBjbGFtcGVkIHRvIDBcbiAqIGRvd25zdHJlYW0sIHdoaWNoIHJlcG9ydGVkIGEgYnJva2VuIGNsb2NrIGFzIGFuIGluc3RhbnQgZGVwbG95IGFuZCBxdWlldGx5XG4gKiBtb3ZlZCBkZXBsb3ltZW50IGZyZXF1ZW5jeSwgY2hhbmdlLWZhaWx1cmUgcmF0ZSBhbmQgbGVhZCB0aW1lIGZvciB0aGUgb3JnLlxuICpcbiAqIE5PVCBjaGVja2VkIGhlcmU6IGNvbW1pdCB0aW1lIHZzIGRlcGxveSBjb21wbGV0aW9uLiBgY29tbWl0X3RpbWVzdGFtcGAgcmlkZXMgdGhlXG4gKiBQSVBFTElORS9zb3VyY2UgZXZlbnQgd2hpbGUgdGhlIGRlcGxveSdzIGBjb21wbGV0ZWRfYXRgIGlzIG9uIGEgc2VwYXJhdGUgU1RBR0VcbiAqIHJvdywgam9pbmVkIGJ5IGBleGVjdXRpb25faWRgIG9ubHkgd2hlbiBET1JBIGlzIHF1ZXJpZWQg4oCUIHNvIG5vIHNpbmdsZSBldmVudFxuICogY2FycmllcyBib3RoLCBhbmQgdGhhdCBvcmRlcmluZyBjYW4gb25seSBiZSBndWFyZGVkIHdoZXJlIHRoZSB0d28gbWVldC5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZEV2ZW50VGltZXMoZXZlbnQ6IEluZ2VzdEV2ZW50LCBub3dNczogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGNlaWxpbmcgPSBub3dNcyArIENMT0NLX1NLRVdfVE9MRVJBTkNFX01TO1xuICBjb25zdCBwYXJzZWQ6IEFycmF5PFtzdHJpbmcsIG51bWJlcl0+ID0gW107XG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydzdGFydGVkQXQnLCAnY29tcGxldGVkQXQnLCAnY29tbWl0VGltZXN0YW1wJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCByYXcgPSBldmVudFtmaWVsZF07XG4gICAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3QgbXMgPSBEYXRlLnBhcnNlKFN0cmluZyhyYXcpKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShtcykpIHJldHVybiBgJHtmaWVsZH0gaXMgbm90IGEgcGFyc2VhYmxlIHRpbWVzdGFtcGA7XG4gICAgaWYgKG1zID4gY2VpbGluZykgcmV0dXJuIGAke2ZpZWxkfSBpcyBpbiB0aGUgZnV0dXJlYDtcbiAgICBwYXJzZWQucHVzaChbZmllbGQsIG1zXSk7XG4gIH1cbiAgY29uc3Qgc3RhcnRlZCA9IHBhcnNlZC5maW5kKChbZl0pID0+IGYgPT09ICdzdGFydGVkQXQnKT8uWzFdO1xuICBjb25zdCBjb21wbGV0ZWQgPSBwYXJzZWQuZmluZCgoW2ZdKSA9PiBmID09PSAnY29tcGxldGVkQXQnKT8uWzFdO1xuICBpZiAoc3RhcnRlZCAhPT0gdW5kZWZpbmVkICYmIGNvbXBsZXRlZCAhPT0gdW5kZWZpbmVkICYmIGNvbXBsZXRlZCA8IHN0YXJ0ZWQpIHtcbiAgICByZXR1cm4gJ2NvbXBsZXRlZEF0IGlzIGJlZm9yZSBzdGFydGVkQXQnO1xuICB9XG4gIGlmIChldmVudC5kdXJhdGlvbk1zICE9PSB1bmRlZmluZWQgJiYgZXZlbnQuZHVyYXRpb25NcyAhPT0gbnVsbCAmJiBldmVudC5kdXJhdGlvbk1zIDwgMCkge1xuICAgIHJldHVybiAnZHVyYXRpb25NcyBpcyBuZWdhdGl2ZSc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVGhlIHBlcnNpc3RlZCByb3cgZm9yIG9uZSBpbmdlc3RlZCBldmVudC4gVGhpcyBpcyB0aGUgRFVSQUJMRSBwZXJzaXN0ZW5jZVxuICogYm91bmRhcnk6IGV2ZXJ5IHVzZXIvQVdTLWRlcml2ZWQgZnJlZS1mb3JtIHN0cmluZyBpcyBzY3J1YmJlZCBoZXJlLCBhbmRcbiAqIHRlbmFuY3kgY29tZXMgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIG5ldmVyIHRoZSBjYWxsZXIncyBjbGFpbWVkIG9yZy5cbiAqL1xuLyoqIFRoZSBzeW50aCByZWZ1c2FsIGNvZGUgdGhlIGV2ZW50cyBMYW1iZGEgYXR0YWNoZWQgKGBkZXRhaWwucGJGYWlsdXJlLmNvZGVgKSwgaWYgYW55LiAqL1xuZnVuY3Rpb24gcGJGYWlsdXJlQ29kZShkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZhaWx1cmUgPSBkZXRhaWw/LnBiRmFpbHVyZTtcbiAgY29uc3QgY29kZSA9IGZhaWx1cmUgJiYgdHlwZW9mIGZhaWx1cmUgPT09ICdvYmplY3QnID8gKGZhaWx1cmUgYXMgeyBjb2RlPzogdW5rbm93biB9KS5jb2RlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnICYmIC9eW0EtWl1bQS1aMC05X117MCw2M30kLy50ZXN0KGNvZGUpID8gY29kZSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHRvRXZlbnRSb3coXG4gIGV2ZW50OiBJbmdlc3RFdmVudCxcbiAgcmVnaXN0cnk6IHsgcGlwZWxpbmVJZDogc3RyaW5nOyBvcmdJZDogc3RyaW5nIH0sXG4gIHBsdWdpbjogU3RlcFBsdWdpbiB8IHVuZGVmaW5lZCxcbiAga2V5SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdG9vbGNoYWluUmVsZWFzZTogc3RyaW5nIHwgbnVsbCxcbik6IFBpcGVsaW5lRXZlbnRJbnNlcnQge1xuICBjb25zdCBkZXRhaWwgPSBldmVudC5zb3VyY2VNZXNzYWdlSWQgIT09IHVuZGVmaW5lZFxuICAgID8geyAuLi4oZXZlbnQuZGV0YWlsID8/IHt9KSwgc291cmNlTWVzc2FnZUlkOiBldmVudC5zb3VyY2VNZXNzYWdlSWQgfVxuICAgIDogZXZlbnQuZGV0YWlsO1xuICByZXR1cm4ge1xuICAgIC8vIHJlZ2lzdHJ5LnBpcGVsaW5lSWQgPT09IGV2ZW50LnBpcGVsaW5lSWQ7IHRoZSByZWdpc3RyeSdzIGlzIGFsd2F5cyBhIHJvd1xuICAgIC8vIHRoYXQgZXhpc3RzIChGSykgYW5kIGl0cyBvcmdJZCBpcyB0aGUgdHJ1c3RlZCB0ZW5hbnQuXG4gICAgcGlwZWxpbmVJZDogcmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICBvcmdJZDogcmVnaXN0cnkub3JnSWQsXG4gICAgZXZlbnRTb3VyY2U6IGV2ZW50LmV2ZW50U291cmNlLFxuICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgIHN0YXR1czogZXZlbnQuc3RhdHVzLFxuICAgIC8vIEFuIEFXUy1BU1NJR05FRCBVVUlELCBub3QgZnJlZS1mb3JtIHRleHQ6IGl0IGNhbid0IGNhcnJ5IGFuIGFjY291bnQgaWQsXG4gICAgLy8gYW5kIHNjcnViYmluZyBhIDEyLWRpZ2l0IHJ1biBpbnNpZGUgaXQgd291bGQgY29ycnVwdCB0aGUgY29ycmVsYXRpb24ga2V5LlxuICAgIGV4ZWN1dGlvbklkOiBldmVudC5leGVjdXRpb25JZCxcbiAgICAvLyBVU0VSLUFVVEhPUkVEIHBpcGVsaW5lLXN0cnVjdHVyZSBuYW1lcyDigJQgc2FtZSB1bnRydXN0ZWQgb3JpZ2luIGFzXG4gICAgLy8gZXJyb3JNZXNzYWdlLCBzbyBzY3J1YmJlZCAoYSBzdGFnZSBuYW1lZCB3aXRoIGFuIEFSTiBtdXN0IG5vdCBwZXJzaXN0KS5cbiAgICBzdGFnZU5hbWU6IHNjcnViT3B0aW9uYWwoZXZlbnQuc3RhZ2VOYW1lKSxcbiAgICBhY3Rpb25OYW1lOiBzY3J1Yk9wdGlvbmFsKGV2ZW50LmFjdGlvbk5hbWUpLFxuICAgIC8vIEhBUkQgQ09OU1RSQUlOVDogYW4gQVdTIGFjY291bnQgaWQgbXVzdCBORVZFUiBiZSBwZXJzaXN0ZWQuIEZhaWx1cmUgZGV0YWlsXG4gICAgLy8gYW5kIG1lc3NhZ2VzIHJvdXRpbmVseSBjYXJyeSBBUk5zIGFuZCBiYXJlIDEyLWRpZ2l0IGFjY291bnQgaWRzLlxuICAgIGVycm9yTWVzc2FnZTogc2NydWJPcHRpb25hbChldmVudC5lcnJvck1lc3NhZ2UpLFxuICAgIHN0YXJ0ZWRBdDogZXZlbnQuc3RhcnRlZEF0ID8gbmV3IERhdGUoZXZlbnQuc3RhcnRlZEF0KSA6IHVuZGVmaW5lZCxcbiAgICBjb21wbGV0ZWRBdDogZXZlbnQuY29tcGxldGVkQXQgPyBuZXcgRGF0ZShldmVudC5jb21wbGV0ZWRBdCkgOiB1bmRlZmluZWQsXG4gICAgZHVyYXRpb25NczogZXZlbnQuZHVyYXRpb25NcyxcbiAgICAvLyBEZXBsb3kgYXR0cmlidXRpb24g4oCUIHNjcnViYmVkIGxpa2UgdGhlIG90aGVyIGZyZWUtZm9ybSBzdHJpbmdzLlxuICAgIGNvbW1pdFNoYTogc2NydWJPcHRpb25hbChldmVudC5jb21taXRTaGEpLFxuICAgIGNvbW1pdFJlZjogc2NydWJPcHRpb25hbChldmVudC5jb21taXRSZWYpLFxuICAgIGVudmlyb25tZW50OiBzY3J1Yk9wdGlvbmFsKGV2ZW50LmVudmlyb25tZW50KSxcbiAgICAvLyBNZWFzdXJlZCBsZWFkIHRpbWU6IHRoZSBvbGRlc3QgdW5zaGlwcGVkIGNvbW1pdCdzIHRpbWUgKyB0aGUgY291bnQuIEFuXG4gICAgLy8gU0NNLWRlcml2ZWQgaW5zdGFudCBhbmQgYSBwbGFpbiBpbnRlZ2VyIOKAlCBub3RoaW5nIHRvIHNjcnViLlxuICAgIGNvbW1pdFRpbWVzdGFtcDogZXZlbnQuY29tbWl0VGltZXN0YW1wID8gbmV3IERhdGUoZXZlbnQuY29tbWl0VGltZXN0YW1wKSA6IHVuZGVmaW5lZCxcbiAgICBjb21taXRDb3VudDogZXZlbnQuY29tbWl0Q291bnQsXG4gICAgLy8gTlVMTCBmb3Igbm9uLXBsdWdpbiBhY3Rpb25zIGFuZCBmb3IgcGlwZWxpbmVzIGRlcGxveWVkIHdpdGhvdXQgYSBtYW5pZmVzdC5cbiAgICBwbHVnaW5QdWJsaXNoZXI6IHBsdWdpbj8ucGx1Z2luUHVibGlzaGVyID8/IG51bGwsXG4gICAgcGx1Z2luUHVibGlzaGVySWQ6IHBsdWdpbj8ucGx1Z2luUHVibGlzaGVySWQgPz8gbnVsbCxcbiAgICBwbHVnaW5OYW1lOiBwbHVnaW4/LnBsdWdpbk5hbWUgPz8gbnVsbCxcbiAgICBwbHVnaW5WZXJzaW9uOiBwbHVnaW4/LnBsdWdpblZlcnNpb24gPz8gbnVsbCxcbiAgICAvLyBUaGUgbWFuYWdlZCB0b29sY2hhaW4gcmVsZWFzZSBhIHN5bnRoIC8gc2VsZi1tdXRhdGlvbiBhY3Rpb24gcmFuIG9uLCBmcm9tXG4gICAgLy8gdGhlIHBsYXRmb3JtJ3MgZGVwbG95ZWQgbWFuaWZlc3QgKG5ldmVyIHRoZSBwYXlsb2FkKS4gTlVMTCBvdGhlcndpc2UuXG4gICAgdG9vbGNoYWluUmVsZWFzZSxcbiAgICAvLyBXSEFUIEtJTkQgb2YgdGhpbmcgYnJva2UsIGNsYXNzaWZpZWQgaGVyZSByYXRoZXIgdGhhbiBhdCByZWFkIHRpbWU6IHRoZVxuICAgIC8vIGVycm9yIHRleHQgaXMgc2NydWJiZWQgYWJvdmUgYW5kIGV2ZW50dWFsbHkgc3dlcHQgYnkgcmV0ZW50aW9uLCBzbyBhXG4gICAgLy8gY2F0ZWdvcnkgZGVyaXZlZCBsYXRlciB3b3VsZCBoYXZlIG5vdGhpbmcgbGVmdCB0byByZWFkLiBOVUxMIGZvciBhbnl0aGluZ1xuICAgIC8vIHRoYXQgaXMgbm90IGEgZmFpbHVyZSwgc28gaXRzIHByZXNlbmNlIGFsd2F5cyBtZWFucyBcInRoaXMgYnJva2VcIi5cbiAgICBmYWlsdXJlQ2F0ZWdvcnk6IGNsYXNzaWZ5RmFpbHVyZSh7XG4gICAgICBzdGF0dXM6IGV2ZW50LnN0YXR1cyxcbiAgICAgIGVycm9yTWVzc2FnZTogc2NydWJPcHRpb25hbChldmVudC5lcnJvck1lc3NhZ2UpLFxuICAgICAgYWN0aW9uTmFtZTogc2NydWJPcHRpb25hbChldmVudC5hY3Rpb25OYW1lKSxcbiAgICAgIHN0YWdlTmFtZTogc2NydWJPcHRpb25hbChldmVudC5zdGFnZU5hbWUpLFxuICAgICAgZmFpbHVyZUNvZGU6IHBiRmFpbHVyZUNvZGUoZXZlbnQuZGV0YWlsKSxcbiAgICB9KSxcbiAgICAvLyBQcm92ZW5hbmNlLiBCb3RoIGFyZSBvcGFxdWUgaWRzIOKAlCBhbiBBV1MtYXNzaWduZWQgZXZlbnQgVVVJRCBhbmQgb3VyIG93blxuICAgIC8vIGtleSBpZCDigJQgc28gbmVpdGhlciBjYW4gY2FycnkgYW4gYWNjb3VudCBpZCBhbmQgbmVpdGhlciBpcyBzY3J1YmJlZFxuICAgIC8vIChzY3J1YmJpbmcgYSBkaWdpdCBydW4gaW5zaWRlIG9uZSB3b3VsZCBjb3JydXB0IHRoZSBjb3JyZWxhdGlvbiBrZXkpLlxuICAgIHNvdXJjZUV2ZW50SWQ6IGV2ZW50LnNvdXJjZUV2ZW50SWQsXG4gICAgaW5nZXN0S2V5SWQ6IGtleUlkLFxuICAgIGRldGFpbDogZGV0YWlsICE9PSB1bmRlZmluZWQgPyBzY3J1YkF3c0lkZW50aWZpZXJzKGRldGFpbCkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogRmFuIHRlcm1pbmFsIFNUQUdFIG91dGNvbWVzIGFuZCBwZXItQUNUSU9OIGNvbXB1dGUgY29uc3VtcHRpb24gaW50byB0aGVcbiAqIHJvdXRlJ3MgbWV0cmljIGhvb2sgKHBpcGVsaW5lLWRhdGEgY2FuJ3QgaW1wb3J0IGFwaS1zZXJ2ZXIncyByZWdpc3RyeSkgYWZ0ZXJcbiAqIHRoZSBpbnNlcnQgY29tbWl0cy5cbiAqXG4gKiBEcml2ZW4gb2ZmIHRoZSBJTlNFUlRFRCByb3dzLCBzbyBhIHJlLWRlbGl2ZXJlZCBldmVudCB0aGUgZGVkdXAgaW5kZXhcbiAqIHN3YWxsb3dlZCBpcyBuZXZlciBjb3VudGVkIHR3aWNlLiBUaGF0IHByb3BlcnR5IGlzIGxvYWQtYmVhcmluZyBmb3IgdGhlXG4gKiBjb21wdXRlIHNlcmllcyBpbiBhIHdheSBpdCB3YXMgbm90IGZvciB0aGUgc3RhZ2Ugb25lOiBhIGR1cGxpY2F0ZWQgc3RhZ2VcbiAqIG91dGNvbWUgZGlzdG9ydHMgYSByYXRlLCB3aGVyZWFzIGEgZHVwbGljYXRlZCB2Q1BVLW1pbnV0ZSBmaWd1cmUgaXMgYVxuICogZG91YmxlLWNoYXJnZSB3YWl0aW5nIGZvciB0aGUgZGF5IHRoZSBjaGFyZ2UgaXMgc3dpdGNoZWQgb24uXG4gKlxuICogQSBub24tbnVsbCBlbnZpcm9ubWVudCBtYXJrcyBhIGRlcGxveS5cbiAqL1xuZnVuY3Rpb24gZW1pdEluZ2VzdE1ldHJpY3MoXG4gIHJvd3M6IFJlYWRvbmx5QXJyYXk8e1xuICAgIG9yZ0lkOiBzdHJpbmc7XG4gICAgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDtcbiAgICBldmVudFR5cGU6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBzdGFnZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgYWN0aW9uTmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgZW52aXJvbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgZHVyYXRpb25Ncz86IG51bWJlciB8IG51bGw7XG4gICAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xuICAgIHRvb2xjaGFpblJlbGVhc2U/OiBzdHJpbmcgfCBudWxsO1xuICB9PixcbiAgb25NZXRyaWM6IChtOiBJbmdlc3RNZXRyaWMpID0+IHZvaWQsXG4gIHBsYXRmb3JtRGVmYXVsdFJlbGVhc2U6IHN0cmluZyB8IG51bGwsXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCByIG9mIHJvd3MpIHtcbiAgICBpZiAoIXIucGlwZWxpbmVJZCkgY29udGludWU7XG5cbiAgICAvLyBUb29sY2hhaW4gcnVucyAowqc3LCBhbGVydGluZyBvbmx5KTogYSB0ZXJtaW5hbCBvdXRjb21lIG9uIGEgc3RhbXBlZCByb3cuXG4gICAgLy8gTm90IGV4Y2x1c2l2ZSDigJQgdGhlIHNhbWUgYWN0aW9uIGlzIGFsc28gYSBjb21wdXRlIG1lYXN1cmVtZW50IGJlbG93LlxuICAgIGNvbnN0IG91dGNvbWUgPSByLnRvb2xjaGFpblJlbGVhc2UgPyB0b29sY2hhaW5PdXRjb21lT2Yoci5zdGF0dXMpIDogbnVsbDtcbiAgICBpZiAoci50b29sY2hhaW5SZWxlYXNlICYmIG91dGNvbWUpIHtcbiAgICAgIG9uTWV0cmljKHtcbiAgICAgICAga2luZDogJ3Rvb2xjaGFpbicsXG4gICAgICAgIHRvb2xjaGFpblJlbGVhc2U6IHIudG9vbGNoYWluUmVsZWFzZSxcbiAgICAgICAgLy8gU3RhbXBlZCByb3dzIGFyZSBvbmx5IGV2ZXIgc3ludGggb3Igc2VsZi1tdXRhdGlvbi5cbiAgICAgICAgYWN0aW9uOiByLnN0YWdlTmFtZSA9PT0gU0VMRl9NVVRBVElPTl9TVEFHRSAmJiByLmFjdGlvbk5hbWUgPT09IFNFTEZfTVVUQVRJT05fQUNUSU9OID8gJ3NlbGYtbXV0YXRpb24nIDogJ3N5bnRoJyxcbiAgICAgICAgb3V0Y29tZSxcbiAgICAgICAgcGxhdGZvcm1EZWZhdWx0UmVsZWFzZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGUgY29uc3VtcHRpb246IGV2ZXJ5IFRFUk1JTkFMIGFjdGlvbiwgbWVhc3VyYWJsZSBvciBub3QuIFRoZVxuICAgIC8vIHVubWVhc3VyYWJsZSBvbmVzIGFyZSB0aGUgcG9pbnQg4oCUIHRoZXkgYXJlIHdoYXQgdGhlIGNvdmVyYWdlIHJhdGlvIGNvdW50cy5cbiAgICBpZiAoci5ldmVudFR5cGUgPT09ICdBQ1RJT04nICYmIFRFUk1JTkFMX0FDVElPTl9TVEFURVMuaW5jbHVkZXMoci5zdGF0dXMpKSB7XG4gICAgICBjb25zdCBjb21wdXRlVHlwZSA9IG5vcm1hbGl6ZUNvbXB1dGVUeXBlKFxuICAgICAgICB0eXBlb2Ygci5kZXRhaWw/LmNvbXB1dGVUeXBlID09PSAnc3RyaW5nJyA/IHIuZGV0YWlsLmNvbXB1dGVUeXBlIDogbnVsbCxcbiAgICAgICk7XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gci5kdXJhdGlvbk1zID8/IG51bGw7XG4gICAgICBvbk1ldHJpYyh7XG4gICAgICAgIGtpbmQ6ICdjb21wdXRlJyxcbiAgICAgICAgcGlwZWxpbmVJZDogci5waXBlbGluZUlkLFxuICAgICAgICBvcmdJZDogci5vcmdJZCxcbiAgICAgICAgY29tcHV0ZVR5cGUsXG4gICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgIGNyZWRpdHM6IGNvbXB1dGVDcmVkaXRzRm9yKGR1cmF0aW9uTXMsIGNvbXB1dGVUeXBlKSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHIuZXZlbnRUeXBlICE9PSAnU1RBR0UnIHx8IChyLnN0YXR1cyAhPT0gJ1NVQ0NFRURFRCcgJiYgci5zdGF0dXMgIT09ICdGQUlMRUQnKSkgY29udGludWU7XG4gICAgb25NZXRyaWMoe1xuICAgICAga2luZDogJ3N0YWdlJyxcbiAgICAgIHBpcGVsaW5lSWQ6IHIucGlwZWxpbmVJZCxcbiAgICAgIG9yZ0lkOiByLm9yZ0lkLFxuICAgICAgc3RhZ2U6IHIuc3RhZ2VOYW1lID8/ICcnLFxuICAgICAgZW52aXJvbm1lbnQ6IHIuZW52aXJvbm1lbnQgPz8gbnVsbCxcbiAgICAgIHJlc3VsdDogci5zdGF0dXMgPT09ICdTVUNDRUVERUQnID8gJ3N1Y2NlZWRlZCcgOiAnZmFpbGVkJyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogQWN0aW9uIHN0YXRlcyB0aGF0IG1lYW4gdGhlIGFjdGlvbiBpcyBvdmVyIGFuZCBpdHMgY29uc3VtcHRpb24gaXMgZmluYWwuICovXG5jb25zdCBURVJNSU5BTF9BQ1RJT05fU1RBVEVTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdTVE9QUEVEJ107XG5cbi8qKlxuICogUmVzb2x2ZSBpbmNvbWluZyBldmVudHMgYWdhaW5zdCB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIGJhdGNoLWluc2VydCB0aGVcbiAqIG1hdGNoZWQgb25lcywgYW5kIGludmFsaWRhdGUgcmVwb3J0aW5nIGNhY2hlcyBmb3IgYWZmZWN0ZWQgb3Jncy5cbiAqIEV2ZW50cyBmb3IgdW5yZWdpc3RlcmVkIHBpcGVsaW5lIGlkcyBhcmUgZHJvcHBlZCAoYW5kIGxvZ2dlZCBhdCBXQVJOXG4gKiB3aXRoIHNhbXBsZSBpZHMgc28gYW4gb3BlcmF0b3IgY2FuIHNlZSB3aGVuIEV2ZW50QnJpZGdlIGlzIGRlbGl2ZXJpbmdcbiAqIGV2ZW50cyBmb3IgcGlwZWxpbmVzIHRoYXQgaGF2ZW4ndCBjYWxsZWQgUE9TVCAvcGlwZWxpbmVzL3JlZ2lzdHJ5IHlldCkuXG4gKlxuICogUmV0dXJucyBjb3VudHMgKyBhIHNhbXBsZSBvZiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWRzIGZvciBvYnNlcnZhYmlsaXR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5nZXN0RXZlbnRzKFxuICBldmVudHM6IEluZ2VzdEV2ZW50W10sXG4gIG9uTWV0cmljPzogKG06IEluZ2VzdE1ldHJpYykgPT4gdm9pZCxcbiAgY2FsbGVyPzogSW5nZXN0Q2FsbGVyLFxuKTogUHJvbWlzZTxJbmdlc3RSZXN1bHQ+IHtcbiAgLy8gVEVOQU5DWS4gQW4gZXZlbnQncyBvcmcgY29tZXMgZnJvbSB0aGUgcGlwZWxpbmUgUkVHSVNUUlksIG5vdCB0aGUgdG9rZW4sIHNvXG4gIC8vIHRoZSBzY29wZSBjaGVjayBhbG9uZSBsZXQgYW55IGByZXBvcnRpbmc6aW5nZXN0YCBob2xkZXIgcG9zdCBldmVudHMgZm9yXG4gIC8vIGFub3RoZXIgb3JnJ3MgcGlwZWxpbmUgaWQgYW5kIGhhdmUgdGhlbSBhdHRyaWJ1dGVkIHRoZXJlLiBgY2FsbGVyYCBjYXJyaWVzXG4gIC8vIHRoZSBvcmcgaWRzIHRoaXMgdG9rZW4gbWF5IHdyaXRlIGZvcjsgYW55dGhpbmcgZWxzZSBpcyBkcm9wcGVkIGJlbG93LlxuICAvL1xuICAvLyBgY2FsbGVyYCBpcyBvcHRpb25hbCBvbmx5IHNvIGluLXByb2Nlc3MgY2FsbGVycyB0aGF0IGFscmVhZHkgcnVuXG4gIC8vIGNyb3NzLXRlbmFudCAodGVzdHMsIGJhY2tmaWxscykga2VlcCB3b3JraW5nIOKAlCBhbiBBQlNFTlQgY2FsbGVyIG1lYW5zIFwibm9cbiAgLy8gcmVzdHJpY3Rpb25cIiwgYW5kIHRoZSByb3V0ZSBhbHdheXMgc3VwcGxpZXMgb25lLiBBIGNhbGxlciB3aXRoIGFuIEVNUFRZXG4gIC8vIGFsbG93LWxpc3QgYW5kIG5vIGNyb3NzVGVuYW50IGZsYWcgdGhlcmVmb3JlIGRyb3BzIGV2ZXJ5dGhpbmcsIHdoaWNoIGlzIHRoZVxuICAvLyByaWdodCBhbnN3ZXIgd2hlbiB0aGUgcm91dGUgY291bGQgbm90IGVzdGFibGlzaCB3aG8gaXMgd3JpdGluZy5cbiAgY29uc3QgdW5yZXN0cmljdGVkID0gY2FsbGVyID09PSB1bmRlZmluZWQgfHwgY2FsbGVyLmNyb3NzVGVuYW50ID09PSB0cnVlO1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChjYWxsZXI/LmFsbG93ZWRPcmdJZHMgPz8gW10pO1xuICAvLyBNdWx0aS1vcmcgYmF0Y2ggaW5zZXJ0OiB0aGUgY2FsbGVyIHJlc29sdmVzIHRvIG11bHRpcGxlIG9yZ3MgdmlhIHRoZVxuICAvLyBwaXBlbGluZS1yZWdpc3RyeSBsb29rdXAgYmVsb3csIHNvIHRoZSByb3V0ZSBsYXllciBNVVNUIGVzdGFibGlzaCBhXG4gIC8vIGBydW5XaXRoVGVuYW50Q29udGV4dCh7IGlzU3VwZXJBZG1pbjogdHJ1ZSB9LCAuLi4pYCBzY29wZSBiZWZvcmUgY2FsbGluZ1xuICAvLyB0aGlzIGZ1bmN0aW9uLiBVbmRlciBGT1JDRSdkIFJMUywgYSBzaW5nbGUgdHggd2l0aCBgYXBwLm9yZ19pZCA9IDxvbmVcbiAgLy8gb3JnPmAgY291bGQgb25seSB3cml0ZSBldmVudHMgZm9yIHRoYXQgb3JnOyBieXBhc3MgdmlhIHN5c2FkbWluIGlzXG4gIC8vIHRoZSByaWdodCBnYXRlIGZvciB0aGlzIHNlcnZlci1pbnRlcm5hbCBjcm9zcy10ZW5hbnQgZW5kcG9pbnQuIFNlZVxuICAvLyBhcGkvcmVwb3J0aW5nL3NyYy9yb3V0ZXMvZXZlbnQtaW5nZXN0LnRzIGZvciB0aGUgd3JhcHBlci5cbiAgLy8gQ2FjaGVzIGFyZSBpbnZhbGlkYXRlZCBBRlRFUiB0aGUgdHggcmVzb2x2ZXM6IGRvaW5nIGl0IGluc2lkZSBoZWxkIHRoZSBwZ1xuICAvLyBsb2NrcyBvcGVuIGFjcm9zcyB1bnJlbGF0ZWQgY2FjaGUgcm91bmQtdHJpcHMuIFRoZSBUVEwgaXMgMi01IG1pbiwgc28gYVxuICAvLyBmaXJlLWFuZC1mb3JnZXQgcG9zdC1jb21taXQgaW52YWxpZGF0aW9uIGlzIGFuIGFjY2VwdGFibGUgdHJhZGUuXG4gIGNvbnN0IHsgaW5zZXJ0ZWQsIHNraXBwZWQsIHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLCBhZmZlY3RlZE9yZ3MsIGRyb3BwZWRGb3JlaWduT3JnLCBkcm9wcGVkSW52YWxpZFRpbWUsIGZvcmVpZ25QaXBlbGluZUlkcywgaW5zZXJ0ZWRSb3dzLCBwbGF0Zm9ybURlZmF1bHRSZWxlYXNlIH0gPSBhd2FpdCB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgLy8gQmF0Y2gtcmVzb2x2ZSBhbGwgdW5pcXVlIHBpcGVsaW5lIGlkcyBpbiBvbmUgcXVlcnlcbiAgICBjb25zdCB1bmlxdWVJZHMgPSBbLi4ubmV3IFNldChldmVudHMubWFwKGUgPT4gZS5waXBlbGluZUlkKSldO1xuICAgIGNvbnN0IHJlZ2lzdHJ5Um93cyA9IGF3YWl0IHR4XG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgcGlwZWxpbmVJZDogc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCxcbiAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5Lm9yZ0lkLFxuICAgICAgfSlcbiAgICAgIC5mcm9tKHNjaGVtYS5waXBlbGluZVJlZ2lzdHJ5KVxuICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBpcGVsaW5lUmVnaXN0cnkucGlwZWxpbmVJZCwgdW5pcXVlSWRzKSk7XG5cbiAgICBjb25zdCBpZE1hcCA9IG5ldyBNYXAocmVnaXN0cnlSb3dzLm1hcChyID0+IFtyLnBpcGVsaW5lSWQsIHJdKSk7XG4gICAgY29uc3QgeyBzdGVwczogc3RlcFBsdWdpbnMsIHRvb2xjaGFpbiB9ID0gYXdhaXQgbG9hZFN0ZXBQbHVnaW5zKHR4LCBldmVudHMuZmlsdGVyKChlKSA9PiBpc0F0dHJpYnV0YWJsZShlKSAmJiBpZE1hcC5oYXMoZS5waXBlbGluZUlkKSkpO1xuXG4gICAgLy8gQnVpbGQgaW5zZXJ0IGJhdGNoIChza2lwIGV2ZW50cyB3aG9zZSBwaXBlbGluZSBpc24ndCByZWdpc3RlcmVkKVxuICAgIGNvbnN0IHJvd3M6IFBpcGVsaW5lRXZlbnRJbnNlcnRbXSA9IFtdO1xuICAgIGxldCBza2lwcGVkTG9jYWwgPSAwO1xuICAgIGxldCBmb3JlaWduTG9jYWwgPSAwO1xuICAgIGxldCBpbnZhbGlkVGltZUxvY2FsID0gMDtcbiAgICBjb25zdCBpbnZhbGlkVGltZVJlYXNvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBmb3JlaWduT3JnSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgZm9yZWlnblBpcGVsaW5lSWRzTG9jYWwgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCB1bnJlZ2lzdGVyZWRMb2NhbDogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBPbmUgYG5vd2AgZm9yIHRoZSB3aG9sZSBiYXRjaDogcGVyLWV2ZW50IGNsb2NrcyB3b3VsZCBsZXQgYW4gZXZlbnQgcGFzcyBvclxuICAgIC8vIGZhaWwgZGVwZW5kaW5nIG9uIHdoZXJlIGl0IHNhdCBpbiB0aGUgbG9vcC5cbiAgICBjb25zdCBub3dNcyA9IERhdGUubm93KCk7XG5cbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgY29uc3QgcmVnaXN0cnkgPSBpZE1hcC5nZXQoZXZlbnQucGlwZWxpbmVJZCk7XG4gICAgICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgICAgIHNraXBwZWRMb2NhbCsrO1xuICAgICAgICB1bnJlZ2lzdGVyZWRMb2NhbC5wdXNoKGV2ZW50LnBpcGVsaW5lSWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBwaXBlbGluZSByZXNvbHZlcyB0byBhbiBvcmcgdGhpcyBjYWxsZXIgbWF5IG5vdCB3cml0ZSBmb3IuIENvdW50ZWRcbiAgICAgIC8vIHNlcGFyYXRlbHkgZnJvbSBgc2tpcHBlZGAgKGFuIHVucmVnaXN0ZXJlZCBpZCBpcyBhIHByb2R1Y2VyIHJ1bm5pbmdcbiAgICAgIC8vIGFoZWFkIG9mIHJlZ2lzdHJhdGlvbjsgdGhpcyBpcyBhIHRlbmFuY3kgcmVmdXNhbCkgYW5kIG5ldmVyIGluc2VydGVkLlxuICAgICAgaWYgKCF1bnJlc3RyaWN0ZWQgJiYgIWFsbG93ZWQuaGFzKHJlZ2lzdHJ5Lm9yZ0lkKSkge1xuICAgICAgICBmb3JlaWduTG9jYWwrKztcbiAgICAgICAgZm9yZWlnbk9yZ0lkcy5hZGQocmVnaXN0cnkub3JnSWQpO1xuICAgICAgICBmb3JlaWduUGlwZWxpbmVJZHNMb2NhbC5hZGQoZXZlbnQucGlwZWxpbmVJZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gSW1wb3NzaWJsZSB0aW1lc3RhbXBzIGFyZSByZWZ1c2VkIGF0IHRoZSBib3VuZGFyeSwgc28gbm8gZG93bnN0cmVhbVxuICAgICAgLy8gbWV0cmljIGhhcyB0byBjbGFtcCBhIG5lZ2F0aXZlIGdhcCBhbmQgY2FsbCBpdCB6ZXJvLlxuICAgICAgY29uc3QgYmFkVGltZSA9IGludmFsaWRFdmVudFRpbWVzKGV2ZW50LCBub3dNcyk7XG4gICAgICBpZiAoYmFkVGltZSkge1xuICAgICAgICBpbnZhbGlkVGltZUxvY2FsKys7XG4gICAgICAgIGludmFsaWRUaW1lUmVhc29ucy5hZGQoYmFkVGltZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhZ2VOYW1lID0gc2NydWJPcHRpb25hbChldmVudC5zdGFnZU5hbWUpO1xuICAgICAgY29uc3QgYWN0aW9uTmFtZSA9IHNjcnViT3B0aW9uYWwoZXZlbnQuYWN0aW9uTmFtZSk7XG4gICAgICBjb25zdCBzdGVwID0gaXNBdHRyaWJ1dGFibGUoZXZlbnQpICYmIHN0YWdlTmFtZSAmJiBhY3Rpb25OYW1lXG4gICAgICAgID8gc3RlcFBsdWdpbnMuZ2V0KHN0ZXBLZXkocmVnaXN0cnkucGlwZWxpbmVJZCwgc3RhZ2VOYW1lLCBhY3Rpb25OYW1lKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAvLyBUaGUgdG9vbGNoYWluIHN0YW1wOiBpcyB0aGlzIHRoZSBwaXBlbGluZSdzIHN5bnRoIC8gc2VsZi1tdXRhdGlvblxuICAgICAgLy8gYWN0aW9uLCBhbmQgd2hpY2ggcmVsZWFzZSBkaWQgdGhlIHBsYXRmb3JtIGRlcGxveSBpdCB3aXRoP1xuICAgICAgY29uc3QgZGVwbG95ZWQgPSB0b29sY2hhaW4uZ2V0KHJlZ2lzdHJ5LnBpcGVsaW5lSWQpO1xuICAgICAgY29uc3Qgc2FtZU9yZ0RlcGxveWVkID0gZGVwbG95ZWQgJiYgZGVwbG95ZWQub3JnSWQgPT09IHJlZ2lzdHJ5Lm9yZ0lkID8gZGVwbG95ZWQgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB0b29sY2hhaW5SZWxlYXNlID0gdG9vbGNoYWluQWN0aW9uT2YoeyBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSwgc3RhZ2VOYW1lLCBhY3Rpb25OYW1lIH0sIHNhbWVPcmdEZXBsb3llZClcbiAgICAgICAgPyBzYW1lT3JnRGVwbG95ZWQhLnJlbGVhc2VWZXJzaW9uXG4gICAgICAgIDogbnVsbDtcbiAgICAgIC8vIFNhbWUtb3JnIGd1YXJkOiBhIG1hbmlmZXN0IHJvdyBpcyBvbmx5IGV2ZXIgd3JpdHRlbiBieSB0aGUgb3JnIHRoYXRcbiAgICAgIC8vIG93bnMgdGhlIHBpcGVsaW5lLCBidXQgdGhlIGluZ2VzdCBydW5zIGNyb3NzLXRlbmFudCwgc28gZG9uJ3QgbGVhbiBvbiBpdC5cbiAgICAgIHJvd3MucHVzaCh0b0V2ZW50Um93KGV2ZW50LCByZWdpc3RyeSwgc3RlcCAmJiBzdGVwLm9yZ0lkID09PSByZWdpc3RyeS5vcmdJZCA/IHN0ZXAgOiB1bmRlZmluZWQsIGNhbGxlcj8ua2V5SWQsIHRvb2xjaGFpblJlbGVhc2UpKTtcbiAgICB9XG5cbiAgICAvLyBTUVMgaXMgYXQtbGVhc3Qtb25jZSwgc28gRXZlbnRCcmlkZ2UgY2FuIGRlbGl2ZXIgdGhlIHNhbWUgc3RhdGUtY2hhbmdlXG4gICAgLy8gdHdpY2UuIGBvbkNvbmZsaWN0RG9Ob3RoaW5nYCArIHRoZSBwYXJ0aWFsIHVuaXF1ZSBpbmRleGVzIG9uXG4gICAgLy8gKHBpcGVsaW5lX2lkLCBleGVjdXRpb25faWQsIGV2ZW50X3R5cGUsIHN0YXR1cywgc3RhZ2VfbmFtZSwgYWN0aW9uX25hbWUpXG4gICAgLy8gYW5kIG9uIHNvdXJjZV9ldmVudF9pZCAodGhlIEV2ZW50QnJpZGdlIGlkLCB3aGVuIHByZXNlbnQpIG1ha2VcbiAgICAvLyByZS1kZWxpdmVyeSBpZGVtcG90ZW50LiBgcmV0dXJuaW5nYCBnaXZlcyB0aGUgUkVBTCBpbnNlcnRlZCBzZXQgc29cbiAgICAvLyBjb3VudHMsIG1ldHJpY3MgYW5kIGNhY2hlIGludmFsaWRhdGlvbiBhbGwgaWdub3JlIGR1cGxpY2F0ZXMuXG4gICAgY29uc3QgbGFuZGVkID0gcm93cy5sZW5ndGggPiAwXG4gICAgICA/IGF3YWl0IHR4Lmluc2VydChzY2hlbWEucGlwZWxpbmVFdmVudCkudmFsdWVzKHJvd3MpXG4gICAgICAgIC5vbkNvbmZsaWN0RG9Ob3RoaW5nKClcbiAgICAgICAgLnJldHVybmluZyh7XG4gICAgICAgICAgb3JnSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50Lm9yZ0lkLFxuICAgICAgICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50LnBpcGVsaW5lSWQsXG4gICAgICAgICAgZXZlbnRUeXBlOiBzY2hlbWEucGlwZWxpbmVFdmVudC5ldmVudFR5cGUsXG4gICAgICAgICAgc3RhdHVzOiBzY2hlbWEucGlwZWxpbmVFdmVudC5zdGF0dXMsXG4gICAgICAgICAgc3RhZ2VOYW1lOiBzY2hlbWEucGlwZWxpbmVFdmVudC5zdGFnZU5hbWUsXG4gICAgICAgICAgYWN0aW9uTmFtZTogc2NoZW1hLnBpcGVsaW5lRXZlbnQuYWN0aW9uTmFtZSxcbiAgICAgICAgICBlbnZpcm9ubWVudDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuZW52aXJvbm1lbnQsXG4gICAgICAgICAgdG9vbGNoYWluUmVsZWFzZTogc2NoZW1hLnBpcGVsaW5lRXZlbnQudG9vbGNoYWluUmVsZWFzZSxcbiAgICAgICAgICAvLyBGb3IgdGhlIHBlci1kZXBsb3kgcm9sbHVwIGJlbG93OiBldmVyeXRoaW5nIGBkb3JhX2RlcGxveW1lbnRzYCBuZWVkcyxcbiAgICAgICAgICAvLyB0YWtlbiBmcm9tIHRoZSByb3dzIHRoYXQgQUNUVUFMTFkgbGFuZGVkIHNvIGEgcmUtZGVsaXZlcnkgY2Fubm90XG4gICAgICAgICAgLy8gcHJvZHVjZSBhIHNlY29uZCBkZXBsb3kuXG4gICAgICAgICAgZXhlY3V0aW9uSWQ6IHNjaGVtYS5waXBlbGluZUV2ZW50LmV4ZWN1dGlvbklkLFxuICAgICAgICAgIGNvbW1pdFNoYTogc2NoZW1hLnBpcGVsaW5lRXZlbnQuY29tbWl0U2hhLFxuICAgICAgICAgIGNvbW1pdFRpbWVzdGFtcDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuY29tbWl0VGltZXN0YW1wLFxuICAgICAgICAgIGNvbW1pdENvdW50OiBzY2hlbWEucGlwZWxpbmVFdmVudC5jb21taXRDb3VudCxcbiAgICAgICAgICBjb21wbGV0ZWRBdDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuY29tcGxldGVkQXQsXG4gICAgICAgICAgc3RhcnRlZEF0OiBzY2hlbWEucGlwZWxpbmVFdmVudC5zdGFydGVkQXQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBzY2hlbWEucGlwZWxpbmVFdmVudC5jcmVhdGVkQXQsXG4gICAgICAgICAgZGV0YWlsOiBzY2hlbWEucGlwZWxpbmVFdmVudC5kZXRhaWwsXG4gICAgICAgICAgc291cmNlRXZlbnRJZDogc2NoZW1hLnBpcGVsaW5lRXZlbnQuc291cmNlRXZlbnRJZCxcbiAgICAgICAgfSlcbiAgICAgIDogW107XG5cbiAgICAvLyBMb2cgaW5zaWRlIHRoZSB0eCBzY29wZSB3aGlsZSB0aGUgb3JnIHNldCBpcyBpbiBoYW5kLiBXQVJOLCBub3QgZXJyb3I6XG4gICAgLy8gYSBtaXNyb3V0ZWQgcHJvZHVjZXIgaXMgdGhlIGNvbW1vbiBjYXVzZSwgYnV0IHRoZSBzYW1lIGxpbmUgaXMgdGhlIG9ubHlcbiAgICAvLyBzaWduYWwgb2YgYW4gaW5qZWN0aW9uIGF0dGVtcHQsIHNvIGl0IG5hbWVzIHRoZSBvcmdzIGl0IHJlZnVzZWQuXG4gICAgaWYgKGZvcmVpZ25Mb2NhbCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKCdEcm9wcGVkIGluZ2VzdCBldmVudHMgZm9yIG9yZ3MgdGhlIGNhbGxlciBtYXkgbm90IHdyaXRlIGZvcicsIHtcbiAgICAgICAgZHJvcHBlZDogZm9yZWlnbkxvY2FsLFxuICAgICAgICBmb3JlaWduT3JnSWRzOiBbLi4uZm9yZWlnbk9yZ0lkc10sXG4gICAgICAgIGFsbG93ZWRPcmdJZHM6IFsuLi5hbGxvd2VkXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpbnZhbGlkVGltZUxvY2FsID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Ryb3BwZWQgaW5nZXN0IGV2ZW50cyB3aXRoIGltcG9zc2libGUgdGltZXN0YW1wcycsIHtcbiAgICAgICAgZHJvcHBlZDogaW52YWxpZFRpbWVMb2NhbCxcbiAgICAgICAgcmVhc29uczogWy4uLmludmFsaWRUaW1lUmVhc29uc10sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcGxhdGZvcm0gZGVmYXVsdCwgZm9yIHRoZSBhbGVydCdzIGJhc2VsaW5lIGdhdWdlIOKAlCByZWFkIG9ubHkgd2hlbiBhXG4gICAgLy8gdG9vbGNoYWluIHJ1biBsYW5kZWQsIHNvIG9yZGluYXJ5IGJhdGNoZXMgcGF5IG5vdGhpbmcuXG4gICAgY29uc3QgZGVmYXVsdFJlbGVhc2UgPSBsYW5kZWQuc29tZSgocikgPT4gci50b29sY2hhaW5SZWxlYXNlKVxuICAgICAgPyBhd2FpdCByZWFkUGxhdGZvcm1EZWZhdWx0UmVsZWFzZSh0eClcbiAgICAgIDogbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICBwbGF0Zm9ybURlZmF1bHRSZWxlYXNlOiBkZWZhdWx0UmVsZWFzZSxcbiAgICAgIGluc2VydGVkOiBsYW5kZWQubGVuZ3RoLFxuICAgICAgc2tpcHBlZDogc2tpcHBlZExvY2FsLFxuICAgICAgdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHM6IHVucmVnaXN0ZXJlZExvY2FsLFxuICAgICAgYWZmZWN0ZWRPcmdzOiBbLi4ubmV3IFNldChsYW5kZWQubWFwKHIgPT4gci5vcmdJZCkpXSxcbiAgICAgIGRyb3BwZWRGb3JlaWduT3JnOiBmb3JlaWduTG9jYWwsXG4gICAgICBkcm9wcGVkSW52YWxpZFRpbWU6IGludmFsaWRUaW1lTG9jYWwsXG4gICAgICBmb3JlaWduUGlwZWxpbmVJZHM6IFsuLi5mb3JlaWduUGlwZWxpbmVJZHNMb2NhbF0sXG4gICAgICBpbnNlcnRlZFJvd3M6IGxhbmRlZCxcbiAgICB9O1xuICB9KTtcblxuICBpZiAob25NZXRyaWMpIGVtaXRJbmdlc3RNZXRyaWNzKGluc2VydGVkUm93cywgb25NZXRyaWMsIHBsYXRmb3JtRGVmYXVsdFJlbGVhc2UpO1xuXG4gIC8vIFBlci1kZXBsb3kgcm9sbHVwLiBBRlRFUiB0aGUgZXZlbnRzIGNvbW1pdCBhbmQgb3V0c2lkZSB0aGVpciB0cmFuc2FjdGlvbjogdGhlXG4gIC8vIGV2ZW50cyBhcmUgdGhlIGR1cmFibGUgcmVjb3JkIGFuZCBgZG9yYV9kZXBsb3ltZW50c2AgaXMgZGVyaXZlZCBmcm9tIHRoZW0sIHNvXG4gIC8vIGEgcm9sbHVwIGZhaWx1cmUgbXVzdCBub3Qgcm9sbCBiYWNrIGFuIGluZ2VzdCB0aGF0IHN1Y2NlZWRlZC4gUmVidWlsZGFibGVcbiAgLy8gZWl0aGVyIHdheS4gYHVwc2VydERlcGxveW1lbnRzYCBuZXZlciB0aHJvd3MgZm9yIHRoYXQgcmVhc29uLlxuICBhd2FpdCB1cHNlcnREZXBsb3ltZW50cyhpbnNlcnRlZFJvd3MpO1xuXG4gIC8vIFN1cmZhY2UgdGhlIHNpbGVudCBza2lwOiBhbiB1bnJlZ2lzdGVyZWQgcGlwZWxpbmUgaWQgdXN1YWxseSBtZWFucyB0aGVcbiAgLy8gcGlwZWxpbmUgaGFzbid0IGNhbGxlZCBQT1NUIC9waXBlbGluZXMvcmVnaXN0cnkgeWV0IChvciBpdHNcbiAgLy8gcGIucGlwZWxpbmUtaWQgdGFnIGlzIG1pc3NpbmcvdW5yZWFkYWJsZSBieSB0aGUgTGFtYmRhKS4gTG9nZ2luZyBpdFxuICAvLyBtYWtlcyBhIGJyb2tlbiBqb2luIHZpc2libGUgaW5zdGVhZCBvZiBsb29raW5nIGxpa2UgXCJubyBhY3Rpdml0eVwiLlxuICBpZiAodW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMubGVuZ3RoID4gMCkge1xuICAgIGxvZ2dlci53YXJuKCdQaXBlbGluZSBldmVudHMgc2tpcHBlZDogcGlwZWxpbmUgaWQgbm90IGZvdW5kIGluIHJlZ2lzdHJ5Jywge1xuICAgICAgY291bnQ6IHVucmVnaXN0ZXJlZFBpcGVsaW5lSWRzLmxlbmd0aCxcbiAgICAgIHNhbXBsZTogdW5yZWdpc3RlcmVkUGlwZWxpbmVJZHMuc2xpY2UoMCwgMyksXG4gICAgfSk7XG4gIH1cblxuICAvLyBQb3N0LWNvbW1pdCBjYWNoZSBpbnZhbGlkYXRpb24uIEZpcmUtYW5kLWZvcmdldCB3aXRoIGxvZ2dpbmcg4oCUIFRUTCBpc1xuICAvLyBzaG9ydCBlbm91Z2ggdGhhdCBhIG1pc3NlZCBpbnZhbGlkYXRpb24gc2VsZi1oZWFscy5cbiAgaWYgKGFmZmVjdGVkT3Jncy5sZW5ndGggPiAwKSB7XG4gICAgdm9pZCBQcm9taXNlLmFsbChhZmZlY3RlZE9yZ3MubWFwKChvcmcpID0+XG4gICAgICBpbnZhbGlkYXRlT3JnUmVwb3J0cyhvcmcpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1JlcG9ydGluZyBjYWNoZSBpbnZhbGlkYXRpb24gZmFpbGVkJywgeyBvcmdJZDogb3JnLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICB9KSxcbiAgICApKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5zZXJ0ZWQsXG4gICAgc2tpcHBlZCxcbiAgICB1bnJlZ2lzdGVyZWRQaXBlbGluZUlkcyxcbiAgICBhZmZlY3RlZE9yZ3MsXG4gICAgZHJvcHBlZEZvcmVpZ25PcmcsXG4gICAgZHJvcHBlZEludmFsaWRUaW1lLFxuICAgIGZvcmVpZ25QaXBlbGluZUlkcyxcbiAgICBpbnNlcnRlZEV4ZWN1dGlvbklkczogWy4uLm5ldyBTZXQoaW5zZXJ0ZWRSb3dzLm1hcCgocikgPT4gci5leGVjdXRpb25JZCkuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKSldLFxuICAgIGluc2VydGVkUGlwZWxpbmVJZHM6IFsuLi5uZXcgU2V0KGluc2VydGVkUm93cy5tYXAoKHIpID0+IHIucGlwZWxpbmVJZCkuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiAhIWlkKSldLFxuICB9O1xufVxuIl19
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* identical on a chart and mean opposite things — a manager reading the first
|
|
15
15
|
* when it is really the second draws exactly the wrong conclusion.
|
|
16
16
|
*/
|
|
17
|
+
import type { WeekStart } from '@pipeline-builder/api-core';
|
|
17
18
|
import type { ResolvedPeriod } from './period.js';
|
|
18
19
|
import { type SectionDataSource } from './sections.js';
|
|
19
20
|
/** Below this many observations a rate is noise, and says so. */
|
|
@@ -66,7 +67,7 @@ export interface ReportSnapshot {
|
|
|
66
67
|
end: string;
|
|
67
68
|
};
|
|
68
69
|
timezone: string;
|
|
69
|
-
weekStart:
|
|
70
|
+
weekStart: WeekStart;
|
|
70
71
|
sections: ComposedSection[];
|
|
71
72
|
notes: DataQualityNote[];
|
|
72
73
|
/**
|
|
@@ -83,7 +84,7 @@ export interface ComposeOptions {
|
|
|
83
84
|
source: SectionDataSource;
|
|
84
85
|
period: ResolvedPeriod;
|
|
85
86
|
timezone: string;
|
|
86
|
-
weekStart:
|
|
87
|
+
weekStart: WeekStart;
|
|
87
88
|
orgId: string;
|
|
88
89
|
orgIds?: string[];
|
|
89
90
|
/** Features the org holds. A section needing one that is absent renders locked. */
|
|
@@ -260,4 +260,4 @@ export async function composeSnapshot(sectionIdList, opts) {
|
|
|
260
260
|
generatedAt: (opts.now ?? new Date()).toISOString(),
|
|
261
261
|
};
|
|
262
262
|
}
|
|
263
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvc3Rha2Vob2xkZXIvY29tcG9zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBb0J0QyxPQUFPLEVBQUUsVUFBVSxFQUFpRSxNQUFNLGVBQWUsQ0FBQztBQUUxRyxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBZ0V0Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBZ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNuRyxrQkFBa0IsRUFBRSxDQUFDLHFCQUFxQixDQUFDO0NBQzVDLENBQUMsQ0FBQztBQUVILG9GQUFvRjtBQUNwRixTQUFTLFNBQVMsQ0FBQyxRQUEyQixFQUFFLFFBQWdCO0lBQzlELElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM3QyxPQUFPLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUYsQ0FBQztBQUVELHNGQUFzRjtBQUN0RixTQUFTLFVBQVUsQ0FBQyxTQUFpQixFQUFFLEtBQWM7SUFDbkQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFdkQsdUVBQXVFO0lBQ3ZFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBNEIs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LFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUk7Y0FDeEUsdUZBQXVGO1FBQzNGLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRTtLQUNwRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBjb21wb3NlcjogdHVybiBhIGRlZmluaXRpb24ncyBzZWN0aW9uIGxpc3QgaW50byB0aGUgc25hcHNob3QgYSBtYW5hZ2VyIHJlYWRzLlxuICpcbiAqIFRocmVlIHRoaW5ncyBpdCBkb2VzIHRoYXQgdGhlIHJhdyBxdWVyaWVzIGRvIG5vdDpcbiAqXG4gKiAgLSBQRVJJT0QtT1ZFUi1QRVJJT0QuIEV2ZXJ5IGNvbXBhcmFibGUgc2VjdGlvbiBpcyBydW4gdHdpY2UsIGZvciB0aGlzIHBlcmlvZFxuICogICAgYW5kIHRoZSBvbmUgYmVmb3JlLCBzbyB0aGUgc25hcHNob3QgY2FycmllcyBcIjkxJSAoZG93biAzIHBvaW50cylcIi4gVGhlIHRyZW5kXG4gKiAgICBpcyB3aGF0IGEgbWFuYWdlciBhY3RzIG9uOyB0aGUgYWJzb2x1dGUgbnVtYmVyIGFsb25lIHJhcmVseSBpcy5cbiAqICAtIExPQ0tFRCBTRUNUSU9OUy4gQSBzZWN0aW9uIHdob3NlIGZlYXR1cmUgdGhlIG9yZyBsYWNrcyByZW5kZXJzIGFzIGxvY2tlZFxuICogICAgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4uIEEgcmVwb3J0IHRoYXQgZGllcyBiZWNhdXNlIG9uZSBnYXRlZCBzZWN0aW9uIHdhc1xuICogICAgaW5jbHVkZWQgaXMgYSBzdXBwb3J0IHRpY2tldDsgYSBsb2NrZWQgcGFuZWwgaXMgYW4gdXBzZWxsLlxuICogIC0gREFUQS1RVUFMSVRZIE5PVEVTLiBNaXNzaW5nIGRlcGxveSB0YWdzIGFuZCB0aW55IHNhbXBsZXMgYXJlIHN0YXRlZCwgbm90XG4gKiAgICBzaWxlbnRseSByZW5kZXJlZCBhcyB6ZXJvLiBcIjAgZGVwbG95c1wiIGFuZCBcIndlIGNhbm5vdCBzZWUgeW91ciBkZXBsb3lzXCIgbG9va1xuICogICAgaWRlbnRpY2FsIG9uIGEgY2hhcnQgYW5kIG1lYW4gb3Bwb3NpdGUgdGhpbmdzIOKAlCBhIG1hbmFnZXIgcmVhZGluZyB0aGUgZmlyc3RcbiAqICAgIHdoZW4gaXQgaXMgcmVhbGx5IHRoZSBzZWNvbmQgZHJhd3MgZXhhY3RseSB0aGUgd3JvbmcgY29uY2x1c2lvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkUGVyaW9kIH0gZnJvbSAnLi9wZXJpb2QuanMnO1xuaW1wb3J0IHsgZ2V0U2VjdGlvbiwgdHlwZSBTZWN0aW9uQ29udGV4dCwgdHlwZSBTZWN0aW9uRGF0YVNvdXJjZSwgdHlwZSBTZWN0aW9uU3BlYyB9IGZyb20gJy4vc2VjdGlvbnMuanMnO1xuXG4vKiogQmVsb3cgdGhpcyBtYW55IG9ic2VydmF0aW9ucyBhIHJhdGUgaXMgbm9pc2UsIGFuZCBzYXlzIHNvLiAqL1xuZXhwb3J0IGNvbnN0IExPV19TQU1QTEVfVEhSRVNIT0xEID0gNTtcblxuLyoqIFdoaWNoIHdheSBhIG1ldHJpYyBtb3ZlZC4gYGZsYXRgIHdoZW4gdGhlIGNoYW5nZSByb3VuZHMgdG8gbm90aGluZy4gKi9cbmV4cG9ydCB0eXBlIFRyZW5kRGlyZWN0aW9uID0gJ3VwJyB8ICdkb3duJyB8ICdmbGF0JyB8ICd1bmtub3duJztcblxuLyoqIEEgZGF0YS1xdWFsaXR5IGNhdmVhdCBhdHRhY2hlZCB0byB0aGUgd2hvbGUgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFRdWFsaXR5Tm90ZSB7XG4gIGNvZGU6ICdtaXNzaW5nX2RlcGxveV90YWcnIHwgJ21pc3NpbmdfY29tbWl0X2RhdGEnIHwgJ2xvd19zYW1wbGUnIHwgJ3NlY3Rpb25fZmFpbGVkJyB8ICdzZWN0aW9uX2xvY2tlZCcgfCAncnVsZV91bmF2YWlsYWJsZSc7XG4gIC8qKiBNYW5hZ2VyLXJlYWRhYmxlLiBOb3QgYSBtZXRyaWMgbmFtZSBhbmQgbm90IGEgc3RhY2sgdHJhY2UuICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFRoZSBzZWN0aW9uIGl0IGNvbmNlcm5zLCB3aGVuIGl0IGlzIHNlY3Rpb24tc3BlY2lmaWMuICovXG4gIHNlY3Rpb25JZD86IHN0cmluZztcbn1cblxuLyoqIE9uZSBjb21wb3NlZCBzZWN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlZFNlY3Rpb24ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICAvKiogYGxvY2tlZGAgd2hlbiB0aGUgb3JnIGxhY2tzIHRoZSBmZWF0dXJlOyBgZmFpbGVkYCB3aGVuIHRoZSBxdWVyeSB0aHJldy4gKi9cbiAgc3RhdGU6ICdvaycgfCAnbG9ja2VkJyB8ICdmYWlsZWQnO1xuICAvKiogVGhlIGZlYXR1cmUgbmVlZGVkLCB3aGVuIGxvY2tlZCDigJQgZHJpdmVzIHRoZSB1cHNlbGwgY29weS4gKi9cbiAgcmVxdWlyZXNGZWF0dXJlPzogc3RyaW5nO1xuICAvKiogVGhpcyBwZXJpb2QncyByYXcgcmVzdWx0LCBleGFjdGx5IGFzIHRoZSBkYXNoYm9hcmQgd291bGQgc2hvdyBpdC4gKi9cbiAgY3VycmVudD86IHVua25vd247XG4gIC8qKiBUaGUgcHJldmlvdXMgcGVyaW9kJ3MgcmVzdWx0LCBmb3IgY29tcGFyYWJsZSBzZWN0aW9ucy4gKi9cbiAgcHJldmlvdXM/OiB1bmtub3duO1xuICAvKiogVGhlIHNpbmdsZSBudW1iZXIgYSBtYW5hZ2VyIHJlYWRzIGZpcnN0LCB3aGVuIHRoZSBzZWN0aW9uIGhhcyBvbmUuICovXG4gIGhlYWRsaW5lPzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogbnVtYmVyOyB1bml0Pzogc3RyaW5nIH07XG4gIC8qKiBDaGFuZ2UgdmVyc3VzIHRoZSBwcmV2aW91cyBwZXJpb2QsIGZvciBjb21wYXJhYmxlIHNlY3Rpb25zLiAqL1xuICBjaGFuZ2U/OiB7IGFic29sdXRlOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB8IG51bGw7IGRpcmVjdGlvbjogVHJlbmREaXJlY3Rpb24gfTtcbn1cblxuLyoqIFRoZSBmcm96ZW4gb3V0cHV0IG9mIG9uZSBydW4uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFNuYXBzaG90IHtcbiAgLyoqIFBlcmlvZCBib3VuZHMgKyBsYWJlbCwgY29waWVkIGluIHNvIHRoZSBzbmFwc2hvdCBpcyBzZWxmLWRlc2NyaWJpbmcuICovXG4gIHBlcmlvZDogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9O1xuICBwcmV2aW91c1BlcmlvZDogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZyB9O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICB3ZWVrU3RhcnQ6ICdtb25kYXknIHwgJ3N1bmRheSc7XG4gIHNlY3Rpb25zOiBDb21wb3NlZFNlY3Rpb25bXTtcbiAgbm90ZXM6IERhdGFRdWFsaXR5Tm90ZVtdO1xuICAvKipcbiAgICogSG93IGV2ZXJ5IG51bWJlciBoZXJlIHdhcyBwcm9kdWNlZCwgc2hvd24gaW4gdGhlIHJlcG9ydCBmb290ZXIuIE1hbmFnZXJzXG4gICAqIGNvbXBhcmUgcmVwb3J0cyB0byB0aGUgZGFzaGJvYXJkOyBzYXlpbmcgcGxhaW5seSB0aGF0IGJvdGggcnVuIHRoZSBzYW1lXG4gICAqIHF1ZXJpZXMgb3ZlciB0aGUgc2FtZSB3aW5kb3cgaXMgd2hhdCBtYWtlcyBhIGRpZmZlcmVuY2UgaW52ZXN0aWdhYmxlIHJhdGhlclxuICAgKiB0aGFuIGEgcmVhc29uIHRvIGRpc3RydXN0IGJvdGguXG4gICAqL1xuICBtZXRob2RvbG9neTogc3RyaW5nO1xuICBnZW5lcmF0ZWRBdDogc3RyaW5nO1xufVxuXG4vKiogV2hhdCB0aGUgY29tcG9zZXIgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgb3JnJ3MgZW50aXRsZW1lbnRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlT3B0aW9ucyB7XG4gIHNvdXJjZTogU2VjdGlvbkRhdGFTb3VyY2U7XG4gIHBlcmlvZDogUmVzb2x2ZWRQZXJpb2Q7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIHdlZWtTdGFydDogJ21vbmRheScgfCAnc3VuZGF5JztcbiAgb3JnSWQ6IHN0cmluZztcbiAgb3JnSWRzPzogc3RyaW5nW107XG4gIC8qKiBGZWF0dXJlcyB0aGUgb3JnIGhvbGRzLiBBIHNlY3Rpb24gbmVlZGluZyBvbmUgdGhhdCBpcyBhYnNlbnQgcmVuZGVycyBsb2NrZWQuICovXG4gIGZlYXR1cmVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgbm93PzogRGF0ZTtcbn1cblxuLyoqXG4gKiBGZWF0dXJlcyB0aGF0LCBpbnNpZGUgYSBSRVBPUlQsIHN0YW5kIGluIGZvciBhbm90aGVyLlxuICpcbiAqIEJ1eWluZyBTdGFrZWhvbGRlciBSZXBvcnRzIGJ1eXMgdGhlIERPUkEgU0VDVElPTlMgb2YgYSByZXBvcnQuIEl0IGRvZXMgbm90IGJ1eSB0aGVcbiAqIGxpdmUgRE9SQSBkYXNoYm9hcmQsIHdoaWNoIHN0YXlzIGJlaGluZCBgYWR2YW5jZWRfcmVwb3J0aW5nYCBhbmQgaXMgZ2F0ZWQgb24gaXRzIG93blxuICogcm91dGVzIOKAlCBzbyB0aGlzIHN1YnN0aXR1dGlvbiBpcyBkZWxpYmVyYXRlbHkgc2NvcGVkIHRvIGNvbXBvc2l0aW9uIGFuZCBleGlzdHNcbiAqIG5vd2hlcmUgZWxzZS4gV2l0aG91dCBpdCwgYSBQcm8gY3VzdG9tZXIgd2hvIGJvdWdodCB0aGUgcmVwb3J0cyBhZGQtb24gd291bGQgb3BlblxuICogdGhlaXIgZmlyc3Qgd2Vla2x5IHJlcG9ydCBhbmQgZmluZCBpdHMgaGVhZGxpbmUgcGFuZWxzIGxvY2tlZCBiZWhpbmQgYSBzZWNvbmRcbiAqIHB1cmNoYXNlLCB3aGljaCBpcyBub3Qgd2hhdCB0aGUgYWRkLW9uJ3Mgb3duIGRlc2NyaXB0aW9uIHByb21pc2VzLlxuICpcbiAqIFN0YXRlZCBhcyBkYXRhIHJhdGhlciB0aGFuIGFuIGBpZmAsIHNvIGFkZGluZyBhIHNlY3Rpb24gdGhhdCBuZWVkcyBhIGRpZmZlcmVudFxuICogZmVhdHVyZSBjYW5ub3Qgc2lsZW50bHkgaW5oZXJpdCB0aGUgY2FydmUtb3V0LlxuICovXG5leHBvcnQgY29uc3QgUkVQT1JUX0ZFQVRVUkVfU1VCU1RJVFVURVM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4gPSBPYmplY3QuZnJlZXplKHtcbiAgYWR2YW5jZWRfcmVwb3J0aW5nOiBbJ3N0YWtlaG9sZGVyX3JlcG9ydHMnXSxcbn0pO1xuXG4vKiogRG9lcyB0aGUgb3JnIGhvbGQgYHJlcXVpcmVkYCwgb3Igc29tZXRoaW5nIHRoYXQgc3RhbmRzIGluIGZvciBpdCBpbiBhIHJlcG9ydD8gKi9cbmZ1bmN0aW9uIHNhdGlzZmllcyhmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW10sIHJlcXVpcmVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGZlYXR1cmVzLmluY2x1ZGVzKHJlcXVpcmVkKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAoUkVQT1JUX0ZFQVRVUkVfU1VCU1RJVFVURVNbcmVxdWlyZWRdID8/IFtdKS5zb21lKChhbHQpID0+IGZlYXR1cmVzLmluY2x1ZGVzKGFsdCkpO1xufVxuXG4vKiogUHVsbCBhIGNvbXBhcmFibGUgbnVtYmVyIG91dCBvZiBhIHNlY3Rpb24gcmVzdWx0LCBvciBudWxsIHdoZW4gdGhlcmUgaXNuJ3Qgb25lLiAqL1xuZnVuY3Rpb24gaGVhZGxpbmVPZihzZWN0aW9uSWQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBudW1iZXI7IHVuaXQ/OiBzdHJpbmcgfSB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG5cbiAgLy8gVGltZSBzZXJpZXMgKHN1Y2Nlc3MgcmF0ZSwgYnVpbGQgc3VjY2Vzcyk6IHRoZSBMQVNUIGJ1Y2tldCBpcyBcIm5vd1wiLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxhc3QgPSB2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIGxhc3Q/LnN1Y2Nlc3NfcGN0ID09PSAnbnVtYmVyJykgcmV0dXJuIHsgbGFiZWw6ICdTdWNjZXNzIHJhdGUnLCB2YWx1ZTogbGFzdC5zdWNjZXNzX3BjdCwgdW5pdDogJyUnIH07XG4gICAgLy8gRXhlY3V0aW9uIGNvdW50czogdG90YWwgcnVucyBhY3Jvc3MgcGlwZWxpbmVzLlxuICAgIC8vXG4gICAgLy8gQSB0b3RhbCBvZiBaRVJPIGlzIGEgcmVhbCBoZWFkbGluZSwgbm90IG1pc3NpbmcgZGF0YTogXCIwIGRlcGxveXMsIGRvd24gZnJvbVxuICAgIC8vIDVcIiBpcyB0aGUgc2luZ2xlIG1vc3QgaW1wb3J0YW50IHRoaW5nIGEgd2Vla2x5IHJlcG9ydCBjYW4gdGVsbCBhIG1hbmFnZXIsXG4gICAgLy8gYW5kIHRyZWF0aW5nIDAgYXMgXCJubyB2YWx1ZVwiIG1hZGUgZXhhY3RseSB0aGF0IGNhc2UgZGlzYXBwZWFyIOKAlCB0aGUgY2hhbmdlXG4gICAgLy8gY2FtZSBiYWNrIGB1bmtub3duYCBhbmQgbm8gYXJyb3cgd2FzIHNob3duLiBTbyB0aGUgdGVzdCBpcyB3aGV0aGVyIGFueSByb3dcbiAgICAvLyBDQVJSSUVEIGEgY291bnQsIG5vdCB3aGV0aGVyIHRoZSBzdW0gaXMgcG9zaXRpdmUuXG4gICAgbGV0IGNvdW50ZWQgPSBmYWxzZTtcbiAgICBjb25zdCB0b3RhbCA9ICh2YWx1ZSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByb3cudG90YWwgPz8gcm93LmNvdW50ID8/IHJvdy5leGVjdXRpb25zO1xuICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJykgcmV0dXJuIHN1bTtcbiAgICAgIGNvdW50ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN1bSArIG47XG4gICAgfSwgMCk7XG4gICAgaWYgKGNvdW50ZWQpIHJldHVybiB7IGxhYmVsOiAnVG90YWwnLCB2YWx1ZTogdG90YWwgfTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvLyBET1JBOiBkZXBsb3ltZW50IGZyZXF1ZW5jeSBpcyB0aGUgaGVhZGxpbmUgYSBtYW5hZ2VyIHJlY29nbmlzZXMuXG4gIGNvbnN0IGVudnMgPSBvYmouZW52aXJvbm1lbnRzO1xuICBpZiAoQXJyYXkuaXNBcnJheShlbnZzKSAmJiBlbnZzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBmaXJzdCA9IGVudnNbMF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgZGYgPSAoZmlyc3QuZGVwbG95bWVudEZyZXF1ZW5jeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmRlcGxveW1lbnRzO1xuICAgIGlmICh0eXBlb2YgZGYgPT09ICdudW1iZXInKSByZXR1cm4geyBsYWJlbDogJ0RlcGxveXMnLCB2YWx1ZTogZGYgfTtcbiAgfVxuICAvLyBQbHVnaW4gc3VtbWFyeSBhbmQgZnJpZW5kczogYSBwbGFpbiB0b3RhbC5cbiAgLy8gWmVybyBpcyBhIHZhbHVlIGhlcmUgdG9vIOKAlCBgcGx1Z2luX3ZlcnNpb25zYCByZXBvcnRpbmcgMCBvdXRkYXRlZCBwbHVnaW5zIGlzXG4gIC8vIGdvb2QgbmV3cyBhIG1hbmFnZXIgc2hvdWxkIHNlZSwgbm90IGFuIGFic2VudCBzZWN0aW9uLlxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RvdGFsJywgJ2NvdW50JywgJ2RlcGxveW1lbnRzJ10pIHtcbiAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnbnVtYmVyJykgcmV0dXJuIHsgbGFiZWw6IHNlY3Rpb25JZCA9PT0gJ3BsdWdpbl92ZXJzaW9ucycgPyAnT3V0ZGF0ZWQnIDogJ1RvdGFsJywgdmFsdWU6IG9ialtrZXldIGFzIG51bWJlciB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQ2hhbmdlIGJldHdlZW4gdHdvIGhlYWRsaW5lIG51bWJlcnMuICovXG5mdW5jdGlvbiBjaGFuZ2VPZihcbiAgY3VycmVudDogeyB2YWx1ZTogbnVtYmVyIH0gfCBudWxsLFxuICBwcmV2aW91czogeyB2YWx1ZTogbnVtYmVyIH0gfCBudWxsLFxuKTogQ29tcG9zZWRTZWN0aW9uWydjaGFuZ2UnXSB7XG4gIGlmICghY3VycmVudCB8fCAhcHJldmlvdXMpIHJldHVybiB7IGFic29sdXRlOiAwLCBwZXJjZW50OiBudWxsLCBkaXJlY3Rpb246ICd1bmtub3duJyB9O1xuICBjb25zdCBhYnNvbHV0ZSA9IE51bWJlcigoY3VycmVudC52YWx1ZSAtIHByZXZpb3VzLnZhbHVlKS50b0ZpeGVkKDIpKTtcbiAgLy8gQSBwZXJjZW50IGNoYW5nZSBvZmYgYSB6ZXJvIGJhc2VsaW5lIGlzIHVuZGVmaW5lZCwgbm90IGluZmluaXRlOiBnb2luZyBmcm9tIDBcbiAgLy8gdG8gNSBkZXBsb3lzIGlzIFwiNSBtb3JlXCIsIG5ldmVyIFwiK+KIniVcIi5cbiAgY29uc3QgcGVyY2VudCA9IHByZXZpb3VzLnZhbHVlID09PSAwID8gbnVsbCA6IE51bWJlcigoKGFic29sdXRlIC8gcHJldmlvdXMudmFsdWUpICogMTAwKS50b0ZpeGVkKDEpKTtcbiAgY29uc3QgZGlyZWN0aW9uOiBUcmVuZERpcmVjdGlvbiA9IGFic29sdXRlID09PSAwID8gJ2ZsYXQnIDogYWJzb2x1dGUgPiAwID8gJ3VwJyA6ICdkb3duJztcbiAgcmV0dXJuIHsgYWJzb2x1dGUsIHBlcmNlbnQsIGRpcmVjdGlvbiB9O1xufVxuXG4vKiogQ291bnQgdGhlIG9ic2VydmF0aW9ucyBiZWhpbmQgYSBzZWN0aW9uLCBmb3IgdGhlIGxvdy1zYW1wbGUgbm90ZS4gKi9cbmZ1bmN0aW9uIHNhbXBsZVNpemUodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByb3cudG90YWwgPz8gcm93LmNvdW50ID8/IHJvdy5leGVjdXRpb25zID8/IHJvdy5kZXBsb3ltZW50cztcbiAgICAgIHJldHVybiBzdW0gKyAodHlwZW9mIG4gPT09ICdudW1iZXInID8gbiA6IDApO1xuICAgIH0sIDApO1xuICB9XG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgY29uc3QgZW52cyA9IG9iaj8uZW52aXJvbm1lbnRzO1xuICBpZiAoQXJyYXkuaXNBcnJheShlbnZzKSkge1xuICAgIHJldHVybiBlbnZzLnJlZHVjZSgoc3VtOiBudW1iZXIsIGUpID0+IHtcbiAgICAgIGNvbnN0IGF0dGVtcHRzID0gKChlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5jaGFuZ2VGYWlsdXJlUmF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmF0dGVtcHRzO1xuICAgICAgcmV0dXJuIHN1bSArICh0eXBlb2YgYXR0ZW1wdHMgPT09ICdudW1iZXInID8gYXR0ZW1wdHMgOiAwKTtcbiAgICB9LCAwKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIERlcGxveS1jb3ZlcmFnZSBub3RlczogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBcInplcm8gZGVwbG95c1wiIGFuZCBcImJsaW5kXCIuICovXG5mdW5jdGlvbiBkZXBsb3lDb3ZlcmFnZU5vdGVzKGRvcmE6IHVua25vd24pOiBEYXRhUXVhbGl0eU5vdGVbXSB7XG4gIGNvbnN0IG5vdGVzOiBEYXRhUXVhbGl0eU5vdGVbXSA9IFtdO1xuICBjb25zdCBjb3ZlcmFnZSA9IChkb3JhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LmNvdmVyYWdlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCB3aXRob3V0ID0gY292ZXJhZ2U/LndpdGhvdXREZXBsb3lzO1xuICBpZiAodHlwZW9mIHdpdGhvdXQgPT09ICdudW1iZXInICYmIHdpdGhvdXQgPiAwKSB7XG4gICAgbm90ZXMucHVzaCh7XG4gICAgICBjb2RlOiAnbWlzc2luZ19kZXBsb3lfdGFnJyxcbiAgICAgIHNlY3Rpb25JZDogJ2RvcmEnLFxuICAgICAgbWVzc2FnZTogYERlcGxveSBkYXRhIHVuYXZhaWxhYmxlIGZvciAke3dpdGhvdXR9IHBpcGVsaW5lJHt3aXRob3V0ID09PSAxID8gJycgOiAncyd9OiB0aGV5IGhhdmUgbm90IHJlLXN5bnRoZWQgd2l0aCBkZXBsb3kgdGFncywgc28gdGhlaXIgZGVwbG95cyBhcmUgbm90IGNvdW50ZWQgaGVyZS4gVGhpcyBpcyBub3QgXCJ6ZXJvIGRlcGxveXNcIi5gLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGVudnMgPSAoZG9yYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwpPy5lbnZpcm9ubWVudHM7XG4gIGlmIChBcnJheS5pc0FycmF5KGVudnMpKSB7XG4gICAgY29uc3Qgbm9MZWFkID0gKGVudnMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5maWx0ZXIoKGUpID0+IHtcbiAgICAgIGNvbnN0IGx0ID0gZS5sZWFkVGltZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBsdCAmJiBsdC5tZWRpYW5TZWNvbmRzID09PSBudWxsO1xuICAgIH0pO1xuICAgIGlmIChub0xlYWQubGVuZ3RoID4gMCkge1xuICAgICAgbm90ZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdtaXNzaW5nX2NvbW1pdF9kYXRhJyxcbiAgICAgICAgc2VjdGlvbklkOiAnZG9yYScsXG4gICAgICAgIG1lc3NhZ2U6IGBMZWFkIHRpbWUgdW5hdmFpbGFibGUgZm9yICR7bm9MZWFkLmxlbmd0aH0gZW52aXJvbm1lbnQke25vTGVhZC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ306IG5vIHN1Y2Nlc3NmdWwgZGVwbG95IGNhcnJpZWQgYSByZXNvbHZhYmxlIGNvbW1pdCB0aW1lc3RhbXAsIHNvIGNvbW1pdC10by1kZXBsb3kgdGltZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuYCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm90ZXM7XG59XG5cbi8qKiBNYW5hZ2VyLWZhY2luZyBuYW1lcyBvZiB0aGUgbmVlZHMtYXR0ZW50aW9uIHJ1bGVzLCBmb3IgdGhlIHVuYXZhaWxhYmxlIG5vdGUuICovXG5jb25zdCBBVFRFTlRJT05fUlVMRV9MQUJFTFM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGxvd19zdWNjZXNzX3JhdGU6ICdsb3cgc3VjY2VzcyByYXRlJyxcbiAgc2xvd2VyX3A5NTogJ3Nsb3dlciBidWlsZHMnLFxuICBjb25zZWN1dGl2ZV9mYWlsdXJlczogJ2NvbnNlY3V0aXZlIGZhaWx1cmVzJyxcbiAgbm9fcmVjZW50X3N1Y2Nlc3M6ICdubyByZWNlbnQgc3VjY2VzcycsXG4gIGZhaWxlZF9hZnRlcl9jb25maWdfY2hhbmdlOiAnZmFpbGVkIGFmdGVyIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UnLFxuICB2dWxuZXJhYmxlX3BsdWdpbjogJ3Z1bG5lcmFibGUgcGx1Z2lucycsXG4gIG5vX2RlcGxveV90cmFja2luZzogJ2RlcGxveSB0cmFja2luZycsXG59O1xuXG4vKipcbiAqIFRoZSBuZWVkcy1hdHRlbnRpb24gcnVsZXMgdGhhdCBjb3VsZCBub3QgcnVuLiBBbiBlbXB0eSBsaXN0IHRoZXJlIG11c3QgcmVhZCBhc1xuICogXCJub3RoaW5nIHRyaXBwZWRcIiwgbmV2ZXIgYXMgXCJhIHJ1bGUgY291bGQgbm90IGxvb2tcIiDigJQgYWJvdmUgYWxsIGZvciB0aGVcbiAqIHZ1bG5lcmFibGUtcGx1Z2luIHJ1bGUsIHdoZXJlIHRoZSBzZWNvbmQgcmVhZGluZyBpcyBhIGZhbHNlIGFsbC1jbGVhci5cbiAqL1xuZnVuY3Rpb24gYXR0ZW50aW9uTm90ZXModmFsdWU6IHVua25vd24pOiBEYXRhUXVhbGl0eU5vdGVbXSB7XG4gIGNvbnN0IHJ1bGVzID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LnVuYXZhaWxhYmxlUnVsZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheShydWxlcykgfHwgcnVsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IG5hbWVzID0gcnVsZXMubWFwKChyKSA9PiBBVFRFTlRJT05fUlVMRV9MQUJFTFNbU3RyaW5nKHIpXSA/PyBTdHJpbmcocikpO1xuICByZXR1cm4gW3tcbiAgICBjb2RlOiAncnVsZV91bmF2YWlsYWJsZScsXG4gICAgc2VjdGlvbklkOiAnbmVlZHNfYXR0ZW50aW9uJyxcbiAgICBtZXNzYWdlOiBgU29tZSBjaGVja3MgY291bGQgbm90IHJ1biB0aGlzIHBlcmlvZCAoJHtuYW1lcy5qb2luKCcsICcpfSk6IHRoZWlyIGRhdGEgd2FzIHVuYXZhaWxhYmxlLiBgXG4gICAgICArICdBIHBpcGVsaW5lIG1pc3NpbmcgZnJvbSB0aGlzIGxpc3Qgd2FzIG5vdCBjaGVja2VkIGZvciB0aG9zZSDigJQgdGhpcyBpcyBub3QgYW4gYWxsLWNsZWFyLicsXG4gIH1dO1xufVxuXG4vKipcbiAqIENvbXBvc2Ugb25lIHBlcmlvZCdzIHNuYXBzaG90LlxuICpcbiAqIE5ldmVyIHRocm93cyBmb3IgYSBzZWN0aW9uLWxldmVsIHByb2JsZW06IGEgc2VjdGlvbiB0aGF0IGZhaWxzIGlzIG1hcmtlZFxuICogYGZhaWxlZGAgd2l0aCBhIG5vdGUsIGFuZCB0aGUgcmVzdCBvZiB0aGUgcmVwb3J0IHN0aWxsIHJlYWNoZXMgdGhlIGxlYWQuIEEgcnVuXG4gKiB0aGF0IHByb2R1Y2VzIG5pbmUgZ29vZCBzZWN0aW9ucyBhbmQgb25lIGZhaWx1cmUgaXMgdXNlZnVsOyBhIHJ1biB0aGF0IHByb2R1Y2VzXG4gKiBhbiBleGNlcHRpb24gaXMgbm90LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcG9zZVNuYXBzaG90KHNlY3Rpb25JZExpc3Q6IHJlYWRvbmx5IHN0cmluZ1tdLCBvcHRzOiBDb21wb3NlT3B0aW9ucyk6IFByb21pc2U8UmVwb3J0U25hcHNob3Q+IHtcbiAgY29uc3QgeyBzb3VyY2UsIHBlcmlvZCwgdGltZXpvbmUsIHdlZWtTdGFydCwgb3JnSWQsIG9yZ0lkcywgZmVhdHVyZXMgfSA9IG9wdHM7XG4gIGNvbnN0IG5vdGVzOiBEYXRhUXVhbGl0eU5vdGVbXSA9IFtdO1xuICBjb25zdCBzZWN0aW9uczogQ29tcG9zZWRTZWN0aW9uW10gPSBbXTtcblxuICBjb25zdCBjdHhGb3IgPSAoZnJvbTogRGF0ZSwgdG86IERhdGUpOiBTZWN0aW9uQ29udGV4dCA9PiAoe1xuICAgIG9yZ0lkLFxuICAgIC4uLihvcmdJZHMgPyB7IG9yZ0lkcyB9IDoge30pLFxuICAgIGZyb206IGZyb20udG9JU09TdHJpbmcoKSxcbiAgICB0bzogdG8udG9JU09TdHJpbmcoKSxcbiAgICB0ejogdGltZXpvbmUsXG4gICAgd2Vla1N0YXJ0LFxuICAgIC8vIFRoZSBwcmV2aW91cyBwZXJpb2QgdHJhdmVscyBXSVRIIHRoZSBjb250ZXh0LCBmb3IgdGhlIGFuYWx5dGljcyBzZWN0aW9uc1xuICAgIC8vIHdob3NlIHRyZW5kIGlzIHBlciBjYXRlZ29yeSwgcGVyIHN0YWdlIG9yIHBlciBwaXBlbGluZS4gVGhvc2UgY2Fubm90IGJlXG4gICAgLy8gaGFuZGxlZCBieSBydW5uaW5nIHRoZSBzZWN0aW9uIHR3aWNlIGFuZCBjb21wYXJpbmcgb25lIGhlYWRsaW5lIOKAlCB0aGVcbiAgICAvLyBjb21wYXJpc29uIGlzIGEgam9pbiwgYW5kIGRvaW5nIGl0IGluIHRoZSBjb21wb3NlciBhZnRlcndhcmRzIHdvdWxkIG1lYW5cbiAgICAvLyByZS1pbXBsZW1lbnRpbmcgaXQgZm9yIGV2ZXJ5IHNoYXBlLlxuICAgIHByZXZpb3VzRnJvbTogcGVyaW9kLnByZXZTdGFydC50b0lTT1N0cmluZygpLFxuICAgIHByZXZpb3VzVG86IHBlcmlvZC5wcmV2RW5kLnRvSVNPU3RyaW5nKCksXG4gIH0pO1xuICBjb25zdCBjdXJyZW50Q3R4ID0gY3R4Rm9yKHBlcmlvZC5zdGFydCwgcGVyaW9kLmVuZCk7XG4gIGNvbnN0IHByZXZpb3VzQ3R4ID0gY3R4Rm9yKHBlcmlvZC5wcmV2U3RhcnQsIHBlcmlvZC5wcmV2RW5kKTtcblxuICBmb3IgKGNvbnN0IGlkIG9mIHNlY3Rpb25JZExpc3QpIHtcbiAgICBjb25zdCBzcGVjOiBTZWN0aW9uU3BlYyB8IHVuZGVmaW5lZCA9IGdldFNlY3Rpb24oaWQpO1xuICAgIGlmICghc3BlYykge1xuICAgICAgLy8gQW4gdW5rbm93biBpZCBpcyBhIGRlZmluaXRpb24gcmVmZXJlbmNpbmcgYSBzZWN0aW9uIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICAgIC8vIFJlY29yZGVkIHJhdGhlciB0aGFuIGRyb3BwZWQsIHNvIHRoZSBsZWFkIGNhbiBzZWUgd2h5IGEgcGFuZWwgdmFuaXNoZWQuXG4gICAgICBzZWN0aW9ucy5wdXNoKHsgaWQsIHRpdGxlOiBpZCwgc3RhdGU6ICdmYWlsZWQnIH0pO1xuICAgICAgbm90ZXMucHVzaCh7IGNvZGU6ICdzZWN0aW9uX2ZhaWxlZCcsIHNlY3Rpb25JZDogaWQsIG1lc3NhZ2U6IGBVbmtub3duIHJlcG9ydCBzZWN0aW9uIFwiJHtpZH1cIiDigJQgaXQgbWF5IGhhdmUgYmVlbiByZW1vdmVkLmAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3BlYy5yZXF1aXJlc0ZlYXR1cmUgJiYgIXNhdGlzZmllcyhmZWF0dXJlcywgc3BlYy5yZXF1aXJlc0ZlYXR1cmUpKSB7XG4gICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQsIHRpdGxlOiBzcGVjLnRpdGxlLCBzdGF0ZTogJ2xvY2tlZCcsIHJlcXVpcmVzRmVhdHVyZTogc3BlYy5yZXF1aXJlc0ZlYXR1cmUsXG4gICAgICB9KTtcbiAgICAgIG5vdGVzLnB1c2goe1xuICAgICAgICBjb2RlOiAnc2VjdGlvbl9sb2NrZWQnLFxuICAgICAgICBzZWN0aW9uSWQ6IGlkLFxuICAgICAgICBtZXNzYWdlOiBgXCIke3NwZWMudGl0bGV9XCIgbmVlZHMgdGhlICR7c3BlYy5yZXF1aXJlc0ZlYXR1cmV9IGFkZC1vbi4gVGhlIHJlc3Qgb2YgdGhpcyByZXBvcnQgaXMgdW5hZmZlY3RlZC5gLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHNwZWMucnVuKHNvdXJjZSwgY3VycmVudEN0eCk7XG4gICAgICBjb25zdCBjb21wb3NlZDogQ29tcG9zZWRTZWN0aW9uID0geyBpZCwgdGl0bGU6IHNwZWMudGl0bGUsIHN0YXRlOiAnb2snLCBjdXJyZW50IH07XG5cbiAgICAgIGNvbnN0IGhlYWQgPSBoZWFkbGluZU9mKGlkLCBjdXJyZW50KTtcbiAgICAgIGlmIChoZWFkKSBjb21wb3NlZC5oZWFkbGluZSA9IGhlYWQ7XG5cbiAgICAgIGlmIChzcGVjLmNvbXBhcmFibGUpIHtcbiAgICAgICAgLy8gVGhlIGNvbXBhcmlzb24gaXMgYmVzdC1lZmZvcnQ6IGEgZmFpbGVkIHByZXZpb3VzIHBlcmlvZCBtdXN0IG5vdCBjb3N0IHRoZVxuICAgICAgICAvLyBsZWFkIHRoaXMgcGVyaW9kJ3MgbnVtYmVycy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHNwZWMucnVuKHNvdXJjZSwgcHJldmlvdXNDdHgpO1xuICAgICAgICAgIGNvbXBvc2VkLnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgY29tcG9zZWQuY2hhbmdlID0gY2hhbmdlT2YoaGVhZCwgaGVhZGxpbmVPZihpZCwgcHJldmlvdXMpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY29tcG9zZWQuY2hhbmdlID0geyBhYnNvbHV0ZTogMCwgcGVyY2VudDogbnVsbCwgZGlyZWN0aW9uOiAndW5rbm93bicgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzYW1wbGUgPSBzYW1wbGVTaXplKGN1cnJlbnQpO1xuICAgICAgaWYgKHNhbXBsZSAhPT0gbnVsbCAmJiBzYW1wbGUgPiAwICYmIHNhbXBsZSA8IExPV19TQU1QTEVfVEhSRVNIT0xEKSB7XG4gICAgICAgIG5vdGVzLnB1c2goe1xuICAgICAgICAgIGNvZGU6ICdsb3dfc2FtcGxlJyxcbiAgICAgICAgICBzZWN0aW9uSWQ6IGlkLFxuICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7c3BlYy50aXRsZX1cIiBpcyBiYXNlZCBvbiAke3NhbXBsZX0gb2JzZXJ2YXRpb24ke3NhbXBsZSA9PT0gMSA/ICcnIDogJ3MnfSDigJQgcGVyY2VudGFnZXMgc3dpbmcgd2lsZGx5IGF0IHRoaXMgdm9sdW1lLiBSZWFkIHRoZSBjb3VudHMsIG5vdCB0aGUgcmF0ZS5gLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlkID09PSAnZG9yYScpIG5vdGVzLnB1c2goLi4uZGVwbG95Q292ZXJhZ2VOb3RlcyhjdXJyZW50KSk7XG4gICAgICBpZiAoaWQgPT09ICduZWVkc19hdHRlbnRpb24nKSBub3Rlcy5wdXNoKC4uLmF0dGVudGlvbk5vdGVzKGN1cnJlbnQpKTtcbiAgICAgIHNlY3Rpb25zLnB1c2goY29tcG9zZWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2VjdGlvbnMucHVzaCh7IGlkLCB0aXRsZTogc3BlYy50aXRsZSwgc3RhdGU6ICdmYWlsZWQnIH0pO1xuICAgICAgbm90ZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdzZWN0aW9uX2ZhaWxlZCcsXG4gICAgICAgIHNlY3Rpb25JZDogaWQsXG4gICAgICAgIG1lc3NhZ2U6IGBcIiR7c3BlYy50aXRsZX1cIiBjb3VsZCBub3QgYmUgY29tcHV0ZWQgZm9yIHRoaXMgcGVyaW9kLiBUaGUgcmVzdCBvZiB0aGUgcmVwb3J0IGlzIHVuYWZmZWN0ZWQuYCxcbiAgICAgIH0pO1xuICAgICAgdm9pZCBlcnI7IC8vIHRoZSByZWFzb24gaXMgbG9nZ2VkIGJ5IHRoZSBjYWxsZXIsIG5ldmVyIHNob3duIHRvIGEgbWFuYWdlclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGVyaW9kOiB7IHN0YXJ0OiBwZXJpb2Quc3RhcnQudG9JU09TdHJpbmcoKSwgZW5kOiBwZXJpb2QuZW5kLnRvSVNPU3RyaW5nKCksIGxhYmVsOiBwZXJpb2QubGFiZWwgfSxcbiAgICBwcmV2aW91c1BlcmlvZDogeyBzdGFydDogcGVyaW9kLnByZXZTdGFydC50b0lTT1N0cmluZygpLCBlbmQ6IHBlcmlvZC5wcmV2RW5kLnRvSVNPU3RyaW5nKCkgfSxcbiAgICB0aW1lem9uZSxcbiAgICB3ZWVrU3RhcnQsXG4gICAgc2VjdGlvbnMsXG4gICAgbm90ZXMsXG4gICAgbWV0aG9kb2xvZ3k6XG4gICAgICBgQ29tcHV0ZWQgZnJvbSBwaXBlbGluZSBldmVudHMgYmV0d2VlbiAke3BlcmlvZC5zdGFydC50b0lTT1N0cmluZygpfSBhbmQgJHtwZXJpb2QuZW5kLnRvSVNPU3RyaW5nKCl9LCBgXG4gICAgICArIGBidWNrZXRlZCBpbiAke3RpbWV6b25lfSB3aXRoIHdlZWtzIHN0YXJ0aW5nICR7d2Vla1N0YXJ0fS4gQ29tcGFyaXNvbiBwZXJpb2Q6IGBcbiAgICAgICsgYCR7cGVyaW9kLnByZXZTdGFydC50b0lTT1N0cmluZygpfSB0byAke3BlcmlvZC5wcmV2RW5kLnRvSVNPU3RyaW5nKCl9LiBgXG4gICAgICArICdUaGVzZSBhcmUgdGhlIHNhbWUgcXVlcmllcyB0aGUgZGFzaGJvYXJkIHJ1bnMgb3ZlciB0aGUgc2FtZSB3aW5kb3csIHNvIHRoZSB0d28gYWdyZWUuJyxcbiAgICBnZW5lcmF0ZWRBdDogKG9wdHMubm93ID8/IG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksXG4gIH07XG59XG4iXX0=
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvc3Rha2Vob2xkZXIvY29tcG9zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBcUJ0QyxPQUFPLEVBQUUsVUFBVSxFQUFpRSxNQUFNLGVBQWUsQ0FBQztBQUUxRyxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBZ0V0Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBZ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNuRyxrQkFBa0IsRUFBRSxDQUFDLHFCQUFxQixDQUFDO0NBQzVDLENBQUMsQ0FBQztBQUVILG9GQUFvRjtBQUNwRixTQUFTLFNBQVMsQ0FBQyxRQUEyQixFQUFFLFFBQWdCO0lBQzlELElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM3QyxPQUFPLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUYsQ0FBQztBQUVELHNGQUFzRjtBQUN0RixTQUFTLFVBQVUsQ0FBQyxTQUFpQixFQUFFLEtBQWM7SUFDbkQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFdkQsdUVBQXVFO0lBQ3ZFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBNEIs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LFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUk7Y0FDeEUsdUZBQXVGO1FBQzNGLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRTtLQUNwRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBjb21wb3NlcjogdHVybiBhIGRlZmluaXRpb24ncyBzZWN0aW9uIGxpc3QgaW50byB0aGUgc25hcHNob3QgYSBtYW5hZ2VyIHJlYWRzLlxuICpcbiAqIFRocmVlIHRoaW5ncyBpdCBkb2VzIHRoYXQgdGhlIHJhdyBxdWVyaWVzIGRvIG5vdDpcbiAqXG4gKiAgLSBQRVJJT0QtT1ZFUi1QRVJJT0QuIEV2ZXJ5IGNvbXBhcmFibGUgc2VjdGlvbiBpcyBydW4gdHdpY2UsIGZvciB0aGlzIHBlcmlvZFxuICogICAgYW5kIHRoZSBvbmUgYmVmb3JlLCBzbyB0aGUgc25hcHNob3QgY2FycmllcyBcIjkxJSAoZG93biAzIHBvaW50cylcIi4gVGhlIHRyZW5kXG4gKiAgICBpcyB3aGF0IGEgbWFuYWdlciBhY3RzIG9uOyB0aGUgYWJzb2x1dGUgbnVtYmVyIGFsb25lIHJhcmVseSBpcy5cbiAqICAtIExPQ0tFRCBTRUNUSU9OUy4gQSBzZWN0aW9uIHdob3NlIGZlYXR1cmUgdGhlIG9yZyBsYWNrcyByZW5kZXJzIGFzIGxvY2tlZFxuICogICAgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4uIEEgcmVwb3J0IHRoYXQgZGllcyBiZWNhdXNlIG9uZSBnYXRlZCBzZWN0aW9uIHdhc1xuICogICAgaW5jbHVkZWQgaXMgYSBzdXBwb3J0IHRpY2tldDsgYSBsb2NrZWQgcGFuZWwgaXMgYW4gdXBzZWxsLlxuICogIC0gREFUQS1RVUFMSVRZIE5PVEVTLiBNaXNzaW5nIGRlcGxveSB0YWdzIGFuZCB0aW55IHNhbXBsZXMgYXJlIHN0YXRlZCwgbm90XG4gKiAgICBzaWxlbnRseSByZW5kZXJlZCBhcyB6ZXJvLiBcIjAgZGVwbG95c1wiIGFuZCBcIndlIGNhbm5vdCBzZWUgeW91ciBkZXBsb3lzXCIgbG9va1xuICogICAgaWRlbnRpY2FsIG9uIGEgY2hhcnQgYW5kIG1lYW4gb3Bwb3NpdGUgdGhpbmdzIOKAlCBhIG1hbmFnZXIgcmVhZGluZyB0aGUgZmlyc3RcbiAqICAgIHdoZW4gaXQgaXMgcmVhbGx5IHRoZSBzZWNvbmQgZHJhd3MgZXhhY3RseSB0aGUgd3JvbmcgY29uY2x1c2lvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdlZWtTdGFydCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUmVzb2x2ZWRQZXJpb2QgfSBmcm9tICcuL3BlcmlvZC5qcyc7XG5pbXBvcnQgeyBnZXRTZWN0aW9uLCB0eXBlIFNlY3Rpb25Db250ZXh0LCB0eXBlIFNlY3Rpb25EYXRhU291cmNlLCB0eXBlIFNlY3Rpb25TcGVjIH0gZnJvbSAnLi9zZWN0aW9ucy5qcyc7XG5cbi8qKiBCZWxvdyB0aGlzIG1hbnkgb2JzZXJ2YXRpb25zIGEgcmF0ZSBpcyBub2lzZSwgYW5kIHNheXMgc28uICovXG5leHBvcnQgY29uc3QgTE9XX1NBTVBMRV9USFJFU0hPTEQgPSA1O1xuXG4vKiogV2hpY2ggd2F5IGEgbWV0cmljIG1vdmVkLiBgZmxhdGAgd2hlbiB0aGUgY2hhbmdlIHJvdW5kcyB0byBub3RoaW5nLiAqL1xuZXhwb3J0IHR5cGUgVHJlbmREaXJlY3Rpb24gPSAndXAnIHwgJ2Rvd24nIHwgJ2ZsYXQnIHwgJ3Vua25vd24nO1xuXG4vKiogQSBkYXRhLXF1YWxpdHkgY2F2ZWF0IGF0dGFjaGVkIHRvIHRoZSB3aG9sZSBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVF1YWxpdHlOb3RlIHtcbiAgY29kZTogJ21pc3NpbmdfZGVwbG95X3RhZycgfCAnbWlzc2luZ19jb21taXRfZGF0YScgfCAnbG93X3NhbXBsZScgfCAnc2VjdGlvbl9mYWlsZWQnIHwgJ3NlY3Rpb25fbG9ja2VkJyB8ICdydWxlX3VuYXZhaWxhYmxlJztcbiAgLyoqIE1hbmFnZXItcmVhZGFibGUuIE5vdCBhIG1ldHJpYyBuYW1lIGFuZCBub3QgYSBzdGFjayB0cmFjZS4gKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogVGhlIHNlY3Rpb24gaXQgY29uY2VybnMsIHdoZW4gaXQgaXMgc2VjdGlvbi1zcGVjaWZpYy4gKi9cbiAgc2VjdGlvbklkPzogc3RyaW5nO1xufVxuXG4vKiogT25lIGNvbXBvc2VkIHNlY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvc2VkU2VjdGlvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKiBgbG9ja2VkYCB3aGVuIHRoZSBvcmcgbGFja3MgdGhlIGZlYXR1cmU7IGBmYWlsZWRgIHdoZW4gdGhlIHF1ZXJ5IHRocmV3LiAqL1xuICBzdGF0ZTogJ29rJyB8ICdsb2NrZWQnIHwgJ2ZhaWxlZCc7XG4gIC8qKiBUaGUgZmVhdHVyZSBuZWVkZWQsIHdoZW4gbG9ja2VkIOKAlCBkcml2ZXMgdGhlIHVwc2VsbCBjb3B5LiAqL1xuICByZXF1aXJlc0ZlYXR1cmU/OiBzdHJpbmc7XG4gIC8qKiBUaGlzIHBlcmlvZCdzIHJhdyByZXN1bHQsIGV4YWN0bHkgYXMgdGhlIGRhc2hib2FyZCB3b3VsZCBzaG93IGl0LiAqL1xuICBjdXJyZW50PzogdW5rbm93bjtcbiAgLyoqIFRoZSBwcmV2aW91cyBwZXJpb2QncyByZXN1bHQsIGZvciBjb21wYXJhYmxlIHNlY3Rpb25zLiAqL1xuICBwcmV2aW91cz86IHVua25vd247XG4gIC8qKiBUaGUgc2luZ2xlIG51bWJlciBhIG1hbmFnZXIgcmVhZHMgZmlyc3QsIHdoZW4gdGhlIHNlY3Rpb24gaGFzIG9uZS4gKi9cbiAgaGVhZGxpbmU/OiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBudW1iZXI7IHVuaXQ/OiBzdHJpbmcgfTtcbiAgLyoqIENoYW5nZSB2ZXJzdXMgdGhlIHByZXZpb3VzIHBlcmlvZCwgZm9yIGNvbXBhcmFibGUgc2VjdGlvbnMuICovXG4gIGNoYW5nZT86IHsgYWJzb2x1dGU6IG51bWJlcjsgcGVyY2VudDogbnVtYmVyIHwgbnVsbDsgZGlyZWN0aW9uOiBUcmVuZERpcmVjdGlvbiB9O1xufVxuXG4vKiogVGhlIGZyb3plbiBvdXRwdXQgb2Ygb25lIHJ1bi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0U25hcHNob3Qge1xuICAvKiogUGVyaW9kIGJvdW5kcyArIGxhYmVsLCBjb3BpZWQgaW4gc28gdGhlIHNuYXBzaG90IGlzIHNlbGYtZGVzY3JpYmluZy4gKi9cbiAgcGVyaW9kOiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH07XG4gIHByZXZpb3VzUGVyaW9kOiB7IHN0YXJ0OiBzdHJpbmc7IGVuZDogc3RyaW5nIH07XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIHdlZWtTdGFydDogV2Vla1N0YXJ0O1xuICBzZWN0aW9uczogQ29tcG9zZWRTZWN0aW9uW107XG4gIG5vdGVzOiBEYXRhUXVhbGl0eU5vdGVbXTtcbiAgLyoqXG4gICAqIEhvdyBldmVyeSBudW1iZXIgaGVyZSB3YXMgcHJvZHVjZWQsIHNob3duIGluIHRoZSByZXBvcnQgZm9vdGVyLiBNYW5hZ2Vyc1xuICAgKiBjb21wYXJlIHJlcG9ydHMgdG8gdGhlIGRhc2hib2FyZDsgc2F5aW5nIHBsYWlubHkgdGhhdCBib3RoIHJ1biB0aGUgc2FtZVxuICAgKiBxdWVyaWVzIG92ZXIgdGhlIHNhbWUgd2luZG93IGlzIHdoYXQgbWFrZXMgYSBkaWZmZXJlbmNlIGludmVzdGlnYWJsZSByYXRoZXJcbiAgICogdGhhbiBhIHJlYXNvbiB0byBkaXN0cnVzdCBib3RoLlxuICAgKi9cbiAgbWV0aG9kb2xvZ3k6IHN0cmluZztcbiAgZ2VuZXJhdGVkQXQ6IHN0cmluZztcbn1cblxuLyoqIFdoYXQgdGhlIGNvbXBvc2VyIG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIG9yZydzIGVudGl0bGVtZW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZU9wdGlvbnMge1xuICBzb3VyY2U6IFNlY3Rpb25EYXRhU291cmNlO1xuICBwZXJpb2Q6IFJlc29sdmVkUGVyaW9kO1xuICB0aW1lem9uZTogc3RyaW5nO1xuICB3ZWVrU3RhcnQ6IFdlZWtTdGFydDtcbiAgb3JnSWQ6IHN0cmluZztcbiAgb3JnSWRzPzogc3RyaW5nW107XG4gIC8qKiBGZWF0dXJlcyB0aGUgb3JnIGhvbGRzLiBBIHNlY3Rpb24gbmVlZGluZyBvbmUgdGhhdCBpcyBhYnNlbnQgcmVuZGVycyBsb2NrZWQuICovXG4gIGZlYXR1cmVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgbm93PzogRGF0ZTtcbn1cblxuLyoqXG4gKiBGZWF0dXJlcyB0aGF0LCBpbnNpZGUgYSBSRVBPUlQsIHN0YW5kIGluIGZvciBhbm90aGVyLlxuICpcbiAqIEJ1eWluZyBTdGFrZWhvbGRlciBSZXBvcnRzIGJ1eXMgdGhlIERPUkEgU0VDVElPTlMgb2YgYSByZXBvcnQuIEl0IGRvZXMgbm90IGJ1eSB0aGVcbiAqIGxpdmUgRE9SQSBkYXNoYm9hcmQsIHdoaWNoIHN0YXlzIGJlaGluZCBgYWR2YW5jZWRfcmVwb3J0aW5nYCBhbmQgaXMgZ2F0ZWQgb24gaXRzIG93blxuICogcm91dGVzIOKAlCBzbyB0aGlzIHN1YnN0aXR1dGlvbiBpcyBkZWxpYmVyYXRlbHkgc2NvcGVkIHRvIGNvbXBvc2l0aW9uIGFuZCBleGlzdHNcbiAqIG5vd2hlcmUgZWxzZS4gV2l0aG91dCBpdCwgYSBQcm8gY3VzdG9tZXIgd2hvIGJvdWdodCB0aGUgcmVwb3J0cyBhZGQtb24gd291bGQgb3BlblxuICogdGhlaXIgZmlyc3Qgd2Vla2x5IHJlcG9ydCBhbmQgZmluZCBpdHMgaGVhZGxpbmUgcGFuZWxzIGxvY2tlZCBiZWhpbmQgYSBzZWNvbmRcbiAqIHB1cmNoYXNlLCB3aGljaCBpcyBub3Qgd2hhdCB0aGUgYWRkLW9uJ3Mgb3duIGRlc2NyaXB0aW9uIHByb21pc2VzLlxuICpcbiAqIFN0YXRlZCBhcyBkYXRhIHJhdGhlciB0aGFuIGFuIGBpZmAsIHNvIGFkZGluZyBhIHNlY3Rpb24gdGhhdCBuZWVkcyBhIGRpZmZlcmVudFxuICogZmVhdHVyZSBjYW5ub3Qgc2lsZW50bHkgaW5oZXJpdCB0aGUgY2FydmUtb3V0LlxuICovXG5leHBvcnQgY29uc3QgUkVQT1JUX0ZFQVRVUkVfU1VCU1RJVFVURVM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4gPSBPYmplY3QuZnJlZXplKHtcbiAgYWR2YW5jZWRfcmVwb3J0aW5nOiBbJ3N0YWtlaG9sZGVyX3JlcG9ydHMnXSxcbn0pO1xuXG4vKiogRG9lcyB0aGUgb3JnIGhvbGQgYHJlcXVpcmVkYCwgb3Igc29tZXRoaW5nIHRoYXQgc3RhbmRzIGluIGZvciBpdCBpbiBhIHJlcG9ydD8gKi9cbmZ1bmN0aW9uIHNhdGlzZmllcyhmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW10sIHJlcXVpcmVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGZlYXR1cmVzLmluY2x1ZGVzKHJlcXVpcmVkKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAoUkVQT1JUX0ZFQVRVUkVfU1VCU1RJVFVURVNbcmVxdWlyZWRdID8/IFtdKS5zb21lKChhbHQpID0+IGZlYXR1cmVzLmluY2x1ZGVzKGFsdCkpO1xufVxuXG4vKiogUHVsbCBhIGNvbXBhcmFibGUgbnVtYmVyIG91dCBvZiBhIHNlY3Rpb24gcmVzdWx0LCBvciBudWxsIHdoZW4gdGhlcmUgaXNuJ3Qgb25lLiAqL1xuZnVuY3Rpb24gaGVhZGxpbmVPZihzZWN0aW9uSWQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBudW1iZXI7IHVuaXQ/OiBzdHJpbmcgfSB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG5cbiAgLy8gVGltZSBzZXJpZXMgKHN1Y2Nlc3MgcmF0ZSwgYnVpbGQgc3VjY2Vzcyk6IHRoZSBMQVNUIGJ1Y2tldCBpcyBcIm5vd1wiLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxhc3QgPSB2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIGxhc3Q/LnN1Y2Nlc3NfcGN0ID09PSAnbnVtYmVyJykgcmV0dXJuIHsgbGFiZWw6ICdTdWNjZXNzIHJhdGUnLCB2YWx1ZTogbGFzdC5zdWNjZXNzX3BjdCwgdW5pdDogJyUnIH07XG4gICAgLy8gRXhlY3V0aW9uIGNvdW50czogdG90YWwgcnVucyBhY3Jvc3MgcGlwZWxpbmVzLlxuICAgIC8vXG4gICAgLy8gQSB0b3RhbCBvZiBaRVJPIGlzIGEgcmVhbCBoZWFkbGluZSwgbm90IG1pc3NpbmcgZGF0YTogXCIwIGRlcGxveXMsIGRvd24gZnJvbVxuICAgIC8vIDVcIiBpcyB0aGUgc2luZ2xlIG1vc3QgaW1wb3J0YW50IHRoaW5nIGEgd2Vla2x5IHJlcG9ydCBjYW4gdGVsbCBhIG1hbmFnZXIsXG4gICAgLy8gYW5kIHRyZWF0aW5nIDAgYXMgXCJubyB2YWx1ZVwiIG1hZGUgZXhhY3RseSB0aGF0IGNhc2UgZGlzYXBwZWFyIOKAlCB0aGUgY2hhbmdlXG4gICAgLy8gY2FtZSBiYWNrIGB1bmtub3duYCBhbmQgbm8gYXJyb3cgd2FzIHNob3duLiBTbyB0aGUgdGVzdCBpcyB3aGV0aGVyIGFueSByb3dcbiAgICAvLyBDQVJSSUVEIGEgY291bnQsIG5vdCB3aGV0aGVyIHRoZSBzdW0gaXMgcG9zaXRpdmUuXG4gICAgbGV0IGNvdW50ZWQgPSBmYWxzZTtcbiAgICBjb25zdCB0b3RhbCA9ICh2YWx1ZSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByb3cudG90YWwgPz8gcm93LmNvdW50ID8/IHJvdy5leGVjdXRpb25zO1xuICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJykgcmV0dXJuIHN1bTtcbiAgICAgIGNvdW50ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN1bSArIG47XG4gICAgfSwgMCk7XG4gICAgaWYgKGNvdW50ZWQpIHJldHVybiB7IGxhYmVsOiAnVG90YWwnLCB2YWx1ZTogdG90YWwgfTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvLyBET1JBOiBkZXBsb3ltZW50IGZyZXF1ZW5jeSBpcyB0aGUgaGVhZGxpbmUgYSBtYW5hZ2VyIHJlY29nbmlzZXMuXG4gIGNvbnN0IGVudnMgPSBvYmouZW52aXJvbm1lbnRzO1xuICBpZiAoQXJyYXkuaXNBcnJheShlbnZzKSAmJiBlbnZzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBmaXJzdCA9IGVudnNbMF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgZGYgPSAoZmlyc3QuZGVwbG95bWVudEZyZXF1ZW5jeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmRlcGxveW1lbnRzO1xuICAgIGlmICh0eXBlb2YgZGYgPT09ICdudW1iZXInKSByZXR1cm4geyBsYWJlbDogJ0RlcGxveXMnLCB2YWx1ZTogZGYgfTtcbiAgfVxuICAvLyBQbHVnaW4gc3VtbWFyeSBhbmQgZnJpZW5kczogYSBwbGFpbiB0b3RhbC5cbiAgLy8gWmVybyBpcyBhIHZhbHVlIGhlcmUgdG9vIOKAlCBgcGx1Z2luX3ZlcnNpb25zYCByZXBvcnRpbmcgMCBvdXRkYXRlZCBwbHVnaW5zIGlzXG4gIC8vIGdvb2QgbmV3cyBhIG1hbmFnZXIgc2hvdWxkIHNlZSwgbm90IGFuIGFic2VudCBzZWN0aW9uLlxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RvdGFsJywgJ2NvdW50JywgJ2RlcGxveW1lbnRzJ10pIHtcbiAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnbnVtYmVyJykgcmV0dXJuIHsgbGFiZWw6IHNlY3Rpb25JZCA9PT0gJ3BsdWdpbl92ZXJzaW9ucycgPyAnT3V0ZGF0ZWQnIDogJ1RvdGFsJywgdmFsdWU6IG9ialtrZXldIGFzIG51bWJlciB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQ2hhbmdlIGJldHdlZW4gdHdvIGhlYWRsaW5lIG51bWJlcnMuICovXG5mdW5jdGlvbiBjaGFuZ2VPZihcbiAgY3VycmVudDogeyB2YWx1ZTogbnVtYmVyIH0gfCBudWxsLFxuICBwcmV2aW91czogeyB2YWx1ZTogbnVtYmVyIH0gfCBudWxsLFxuKTogQ29tcG9zZWRTZWN0aW9uWydjaGFuZ2UnXSB7XG4gIGlmICghY3VycmVudCB8fCAhcHJldmlvdXMpIHJldHVybiB7IGFic29sdXRlOiAwLCBwZXJjZW50OiBudWxsLCBkaXJlY3Rpb246ICd1bmtub3duJyB9O1xuICBjb25zdCBhYnNvbHV0ZSA9IE51bWJlcigoY3VycmVudC52YWx1ZSAtIHByZXZpb3VzLnZhbHVlKS50b0ZpeGVkKDIpKTtcbiAgLy8gQSBwZXJjZW50IGNoYW5nZSBvZmYgYSB6ZXJvIGJhc2VsaW5lIGlzIHVuZGVmaW5lZCwgbm90IGluZmluaXRlOiBnb2luZyBmcm9tIDBcbiAgLy8gdG8gNSBkZXBsb3lzIGlzIFwiNSBtb3JlXCIsIG5ldmVyIFwiK+KIniVcIi5cbiAgY29uc3QgcGVyY2VudCA9IHByZXZpb3VzLnZhbHVlID09PSAwID8gbnVsbCA6IE51bWJlcigoKGFic29sdXRlIC8gcHJldmlvdXMudmFsdWUpICogMTAwKS50b0ZpeGVkKDEpKTtcbiAgY29uc3QgZGlyZWN0aW9uOiBUcmVuZERpcmVjdGlvbiA9IGFic29sdXRlID09PSAwID8gJ2ZsYXQnIDogYWJzb2x1dGUgPiAwID8gJ3VwJyA6ICdkb3duJztcbiAgcmV0dXJuIHsgYWJzb2x1dGUsIHBlcmNlbnQsIGRpcmVjdGlvbiB9O1xufVxuXG4vKiogQ291bnQgdGhlIG9ic2VydmF0aW9ucyBiZWhpbmQgYSBzZWN0aW9uLCBmb3IgdGhlIGxvdy1zYW1wbGUgbm90ZS4gKi9cbmZ1bmN0aW9uIHNhbXBsZVNpemUodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByb3cudG90YWwgPz8gcm93LmNvdW50ID8/IHJvdy5leGVjdXRpb25zID8/IHJvdy5kZXBsb3ltZW50cztcbiAgICAgIHJldHVybiBzdW0gKyAodHlwZW9mIG4gPT09ICdudW1iZXInID8gbiA6IDApO1xuICAgIH0sIDApO1xuICB9XG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgY29uc3QgZW52cyA9IG9iaj8uZW52aXJvbm1lbnRzO1xuICBpZiAoQXJyYXkuaXNBcnJheShlbnZzKSkge1xuICAgIHJldHVybiBlbnZzLnJlZHVjZSgoc3VtOiBudW1iZXIsIGUpID0+IHtcbiAgICAgIGNvbnN0IGF0dGVtcHRzID0gKChlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5jaGFuZ2VGYWlsdXJlUmF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmF0dGVtcHRzO1xuICAgICAgcmV0dXJuIHN1bSArICh0eXBlb2YgYXR0ZW1wdHMgPT09ICdudW1iZXInID8gYXR0ZW1wdHMgOiAwKTtcbiAgICB9LCAwKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIERlcGxveS1jb3ZlcmFnZSBub3RlczogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBcInplcm8gZGVwbG95c1wiIGFuZCBcImJsaW5kXCIuICovXG5mdW5jdGlvbiBkZXBsb3lDb3ZlcmFnZU5vdGVzKGRvcmE6IHVua25vd24pOiBEYXRhUXVhbGl0eU5vdGVbXSB7XG4gIGNvbnN0IG5vdGVzOiBEYXRhUXVhbGl0eU5vdGVbXSA9IFtdO1xuICBjb25zdCBjb3ZlcmFnZSA9IChkb3JhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LmNvdmVyYWdlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCB3aXRob3V0ID0gY292ZXJhZ2U/LndpdGhvdXREZXBsb3lzO1xuICBpZiAodHlwZW9mIHdpdGhvdXQgPT09ICdudW1iZXInICYmIHdpdGhvdXQgPiAwKSB7XG4gICAgbm90ZXMucHVzaCh7XG4gICAgICBjb2RlOiAnbWlzc2luZ19kZXBsb3lfdGFnJyxcbiAgICAgIHNlY3Rpb25JZDogJ2RvcmEnLFxuICAgICAgbWVzc2FnZTogYERlcGxveSBkYXRhIHVuYXZhaWxhYmxlIGZvciAke3dpdGhvdXR9IHBpcGVsaW5lJHt3aXRob3V0ID09PSAxID8gJycgOiAncyd9OiB0aGV5IGhhdmUgbm90IHJlLXN5bnRoZWQgd2l0aCBkZXBsb3kgdGFncywgc28gdGhlaXIgZGVwbG95cyBhcmUgbm90IGNvdW50ZWQgaGVyZS4gVGhpcyBpcyBub3QgXCJ6ZXJvIGRlcGxveXNcIi5gLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGVudnMgPSAoZG9yYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwpPy5lbnZpcm9ubWVudHM7XG4gIGlmIChBcnJheS5pc0FycmF5KGVudnMpKSB7XG4gICAgY29uc3Qgbm9MZWFkID0gKGVudnMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5maWx0ZXIoKGUpID0+IHtcbiAgICAgIGNvbnN0IGx0ID0gZS5sZWFkVGltZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBsdCAmJiBsdC5tZWRpYW5TZWNvbmRzID09PSBudWxsO1xuICAgIH0pO1xuICAgIGlmIChub0xlYWQubGVuZ3RoID4gMCkge1xuICAgICAgbm90ZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdtaXNzaW5nX2NvbW1pdF9kYXRhJyxcbiAgICAgICAgc2VjdGlvbklkOiAnZG9yYScsXG4gICAgICAgIG1lc3NhZ2U6IGBMZWFkIHRpbWUgdW5hdmFpbGFibGUgZm9yICR7bm9MZWFkLmxlbmd0aH0gZW52aXJvbm1lbnQke25vTGVhZC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ306IG5vIHN1Y2Nlc3NmdWwgZGVwbG95IGNhcnJpZWQgYSByZXNvbHZhYmxlIGNvbW1pdCB0aW1lc3RhbXAsIHNvIGNvbW1pdC10by1kZXBsb3kgdGltZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuYCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm90ZXM7XG59XG5cbi8qKiBNYW5hZ2VyLWZhY2luZyBuYW1lcyBvZiB0aGUgbmVlZHMtYXR0ZW50aW9uIHJ1bGVzLCBmb3IgdGhlIHVuYXZhaWxhYmxlIG5vdGUuICovXG5jb25zdCBBVFRFTlRJT05fUlVMRV9MQUJFTFM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGxvd19zdWNjZXNzX3JhdGU6ICdsb3cgc3VjY2VzcyByYXRlJyxcbiAgc2xvd2VyX3A5NTogJ3Nsb3dlciBidWlsZHMnLFxuICBjb25zZWN1dGl2ZV9mYWlsdXJlczogJ2NvbnNlY3V0aXZlIGZhaWx1cmVzJyxcbiAgbm9fcmVjZW50X3N1Y2Nlc3M6ICdubyByZWNlbnQgc3VjY2VzcycsXG4gIGZhaWxlZF9hZnRlcl9jb25maWdfY2hhbmdlOiAnZmFpbGVkIGFmdGVyIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UnLFxuICB2dWxuZXJhYmxlX3BsdWdpbjogJ3Z1bG5lcmFibGUgcGx1Z2lucycsXG4gIG5vX2RlcGxveV90cmFja2luZzogJ2RlcGxveSB0cmFja2luZycsXG59O1xuXG4vKipcbiAqIFRoZSBuZWVkcy1hdHRlbnRpb24gcnVsZXMgdGhhdCBjb3VsZCBub3QgcnVuLiBBbiBlbXB0eSBsaXN0IHRoZXJlIG11c3QgcmVhZCBhc1xuICogXCJub3RoaW5nIHRyaXBwZWRcIiwgbmV2ZXIgYXMgXCJhIHJ1bGUgY291bGQgbm90IGxvb2tcIiDigJQgYWJvdmUgYWxsIGZvciB0aGVcbiAqIHZ1bG5lcmFibGUtcGx1Z2luIHJ1bGUsIHdoZXJlIHRoZSBzZWNvbmQgcmVhZGluZyBpcyBhIGZhbHNlIGFsbC1jbGVhci5cbiAqL1xuZnVuY3Rpb24gYXR0ZW50aW9uTm90ZXModmFsdWU6IHVua25vd24pOiBEYXRhUXVhbGl0eU5vdGVbXSB7XG4gIGNvbnN0IHJ1bGVzID0gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LnVuYXZhaWxhYmxlUnVsZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheShydWxlcykgfHwgcnVsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IG5hbWVzID0gcnVsZXMubWFwKChyKSA9PiBBVFRFTlRJT05fUlVMRV9MQUJFTFNbU3RyaW5nKHIpXSA/PyBTdHJpbmcocikpO1xuICByZXR1cm4gW3tcbiAgICBjb2RlOiAncnVsZV91bmF2YWlsYWJsZScsXG4gICAgc2VjdGlvbklkOiAnbmVlZHNfYXR0ZW50aW9uJyxcbiAgICBtZXNzYWdlOiBgU29tZSBjaGVja3MgY291bGQgbm90IHJ1biB0aGlzIHBlcmlvZCAoJHtuYW1lcy5qb2luKCcsICcpfSk6IHRoZWlyIGRhdGEgd2FzIHVuYXZhaWxhYmxlLiBgXG4gICAgICArICdBIHBpcGVsaW5lIG1pc3NpbmcgZnJvbSB0aGlzIGxpc3Qgd2FzIG5vdCBjaGVja2VkIGZvciB0aG9zZSDigJQgdGhpcyBpcyBub3QgYW4gYWxsLWNsZWFyLicsXG4gIH1dO1xufVxuXG4vKipcbiAqIENvbXBvc2Ugb25lIHBlcmlvZCdzIHNuYXBzaG90LlxuICpcbiAqIE5ldmVyIHRocm93cyBmb3IgYSBzZWN0aW9uLWxldmVsIHByb2JsZW06IGEgc2VjdGlvbiB0aGF0IGZhaWxzIGlzIG1hcmtlZFxuICogYGZhaWxlZGAgd2l0aCBhIG5vdGUsIGFuZCB0aGUgcmVzdCBvZiB0aGUgcmVwb3J0IHN0aWxsIHJlYWNoZXMgdGhlIGxlYWQuIEEgcnVuXG4gKiB0aGF0IHByb2R1Y2VzIG5pbmUgZ29vZCBzZWN0aW9ucyBhbmQgb25lIGZhaWx1cmUgaXMgdXNlZnVsOyBhIHJ1biB0aGF0IHByb2R1Y2VzXG4gKiBhbiBleGNlcHRpb24gaXMgbm90LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcG9zZVNuYXBzaG90KHNlY3Rpb25JZExpc3Q6IHJlYWRvbmx5IHN0cmluZ1tdLCBvcHRzOiBDb21wb3NlT3B0aW9ucyk6IFByb21pc2U8UmVwb3J0U25hcHNob3Q+IHtcbiAgY29uc3QgeyBzb3VyY2UsIHBlcmlvZCwgdGltZXpvbmUsIHdlZWtTdGFydCwgb3JnSWQsIG9yZ0lkcywgZmVhdHVyZXMgfSA9IG9wdHM7XG4gIGNvbnN0IG5vdGVzOiBEYXRhUXVhbGl0eU5vdGVbXSA9IFtdO1xuICBjb25zdCBzZWN0aW9uczogQ29tcG9zZWRTZWN0aW9uW10gPSBbXTtcblxuICBjb25zdCBjdHhGb3IgPSAoZnJvbTogRGF0ZSwgdG86IERhdGUpOiBTZWN0aW9uQ29udGV4dCA9PiAoe1xuICAgIG9yZ0lkLFxuICAgIC4uLihvcmdJZHMgPyB7IG9yZ0lkcyB9IDoge30pLFxuICAgIGZyb206IGZyb20udG9JU09TdHJpbmcoKSxcbiAgICB0bzogdG8udG9JU09TdHJpbmcoKSxcbiAgICB0ejogdGltZXpvbmUsXG4gICAgd2Vla1N0YXJ0LFxuICAgIC8vIFRoZSBwcmV2aW91cyBwZXJpb2QgdHJhdmVscyBXSVRIIHRoZSBjb250ZXh0LCBmb3IgdGhlIGFuYWx5dGljcyBzZWN0aW9uc1xuICAgIC8vIHdob3NlIHRyZW5kIGlzIHBlciBjYXRlZ29yeSwgcGVyIHN0YWdlIG9yIHBlciBwaXBlbGluZS4gVGhvc2UgY2Fubm90IGJlXG4gICAgLy8gaGFuZGxlZCBieSBydW5uaW5nIHRoZSBzZWN0aW9uIHR3aWNlIGFuZCBjb21wYXJpbmcgb25lIGhlYWRsaW5lIOKAlCB0aGVcbiAgICAvLyBjb21wYXJpc29uIGlzIGEgam9pbiwgYW5kIGRvaW5nIGl0IGluIHRoZSBjb21wb3NlciBhZnRlcndhcmRzIHdvdWxkIG1lYW5cbiAgICAvLyByZS1pbXBsZW1lbnRpbmcgaXQgZm9yIGV2ZXJ5IHNoYXBlLlxuICAgIHByZXZpb3VzRnJvbTogcGVyaW9kLnByZXZTdGFydC50b0lTT1N0cmluZygpLFxuICAgIHByZXZpb3VzVG86IHBlcmlvZC5wcmV2RW5kLnRvSVNPU3RyaW5nKCksXG4gIH0pO1xuICBjb25zdCBjdXJyZW50Q3R4ID0gY3R4Rm9yKHBlcmlvZC5zdGFydCwgcGVyaW9kLmVuZCk7XG4gIGNvbnN0IHByZXZpb3VzQ3R4ID0gY3R4Rm9yKHBlcmlvZC5wcmV2U3RhcnQsIHBlcmlvZC5wcmV2RW5kKTtcblxuICBmb3IgKGNvbnN0IGlkIG9mIHNlY3Rpb25JZExpc3QpIHtcbiAgICBjb25zdCBzcGVjOiBTZWN0aW9uU3BlYyB8IHVuZGVmaW5lZCA9IGdldFNlY3Rpb24oaWQpO1xuICAgIGlmICghc3BlYykge1xuICAgICAgLy8gQW4gdW5rbm93biBpZCBpcyBhIGRlZmluaXRpb24gcmVmZXJlbmNpbmcgYSBzZWN0aW9uIHRoYXQgbm8gbG9uZ2VyIGV4aXN0cy5cbiAgICAgIC8vIFJlY29yZGVkIHJhdGhlciB0aGFuIGRyb3BwZWQsIHNvIHRoZSBsZWFkIGNhbiBzZWUgd2h5IGEgcGFuZWwgdmFuaXNoZWQuXG4gICAgICBzZWN0aW9ucy5wdXNoKHsgaWQsIHRpdGxlOiBpZCwgc3RhdGU6ICdmYWlsZWQnIH0pO1xuICAgICAgbm90ZXMucHVzaCh7IGNvZGU6ICdzZWN0aW9uX2ZhaWxlZCcsIHNlY3Rpb25JZDogaWQsIG1lc3NhZ2U6IGBVbmtub3duIHJlcG9ydCBzZWN0aW9uIFwiJHtpZH1cIiDigJQgaXQgbWF5IGhhdmUgYmVlbiByZW1vdmVkLmAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3BlYy5yZXF1aXJlc0ZlYXR1cmUgJiYgIXNhdGlzZmllcyhmZWF0dXJlcywgc3BlYy5yZXF1aXJlc0ZlYXR1cmUpKSB7XG4gICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgaWQsIHRpdGxlOiBzcGVjLnRpdGxlLCBzdGF0ZTogJ2xvY2tlZCcsIHJlcXVpcmVzRmVhdHVyZTogc3BlYy5yZXF1aXJlc0ZlYXR1cmUsXG4gICAgICB9KTtcbiAgICAgIG5vdGVzLnB1c2goe1xuICAgICAgICBjb2RlOiAnc2VjdGlvbl9sb2NrZWQnLFxuICAgICAgICBzZWN0aW9uSWQ6IGlkLFxuICAgICAgICBtZXNzYWdlOiBgXCIke3NwZWMudGl0bGV9XCIgbmVlZHMgdGhlICR7c3BlYy5yZXF1aXJlc0ZlYXR1cmV9IGFkZC1vbi4gVGhlIHJlc3Qgb2YgdGhpcyByZXBvcnQgaXMgdW5hZmZlY3RlZC5gLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHNwZWMucnVuKHNvdXJjZSwgY3VycmVudEN0eCk7XG4gICAgICBjb25zdCBjb21wb3NlZDogQ29tcG9zZWRTZWN0aW9uID0geyBpZCwgdGl0bGU6IHNwZWMudGl0bGUsIHN0YXRlOiAnb2snLCBjdXJyZW50IH07XG5cbiAgICAgIGNvbnN0IGhlYWQgPSBoZWFkbGluZU9mKGlkLCBjdXJyZW50KTtcbiAgICAgIGlmIChoZWFkKSBjb21wb3NlZC5oZWFkbGluZSA9IGhlYWQ7XG5cbiAgICAgIGlmIChzcGVjLmNvbXBhcmFibGUpIHtcbiAgICAgICAgLy8gVGhlIGNvbXBhcmlzb24gaXMgYmVzdC1lZmZvcnQ6IGEgZmFpbGVkIHByZXZpb3VzIHBlcmlvZCBtdXN0IG5vdCBjb3N0IHRoZVxuICAgICAgICAvLyBsZWFkIHRoaXMgcGVyaW9kJ3MgbnVtYmVycy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHNwZWMucnVuKHNvdXJjZSwgcHJldmlvdXNDdHgpO1xuICAgICAgICAgIGNvbXBvc2VkLnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgY29tcG9zZWQuY2hhbmdlID0gY2hhbmdlT2YoaGVhZCwgaGVhZGxpbmVPZihpZCwgcHJldmlvdXMpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY29tcG9zZWQuY2hhbmdlID0geyBhYnNvbHV0ZTogMCwgcGVyY2VudDogbnVsbCwgZGlyZWN0aW9uOiAndW5rbm93bicgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzYW1wbGUgPSBzYW1wbGVTaXplKGN1cnJlbnQpO1xuICAgICAgaWYgKHNhbXBsZSAhPT0gbnVsbCAmJiBzYW1wbGUgPiAwICYmIHNhbXBsZSA8IExPV19TQU1QTEVfVEhSRVNIT0xEKSB7XG4gICAgICAgIG5vdGVzLnB1c2goe1xuICAgICAgICAgIGNvZGU6ICdsb3dfc2FtcGxlJyxcbiAgICAgICAgICBzZWN0aW9uSWQ6IGlkLFxuICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7c3BlYy50aXRsZX1cIiBpcyBiYXNlZCBvbiAke3NhbXBsZX0gb2JzZXJ2YXRpb24ke3NhbXBsZSA9PT0gMSA/ICcnIDogJ3MnfSDigJQgcGVyY2VudGFnZXMgc3dpbmcgd2lsZGx5IGF0IHRoaXMgdm9sdW1lLiBSZWFkIHRoZSBjb3VudHMsIG5vdCB0aGUgcmF0ZS5gLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlkID09PSAnZG9yYScpIG5vdGVzLnB1c2goLi4uZGVwbG95Q292ZXJhZ2VOb3RlcyhjdXJyZW50KSk7XG4gICAgICBpZiAoaWQgPT09ICduZWVkc19hdHRlbnRpb24nKSBub3Rlcy5wdXNoKC4uLmF0dGVudGlvbk5vdGVzKGN1cnJlbnQpKTtcbiAgICAgIHNlY3Rpb25zLnB1c2goY29tcG9zZWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2VjdGlvbnMucHVzaCh7IGlkLCB0aXRsZTogc3BlYy50aXRsZSwgc3RhdGU6ICdmYWlsZWQnIH0pO1xuICAgICAgbm90ZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdzZWN0aW9uX2ZhaWxlZCcsXG4gICAgICAgIHNlY3Rpb25JZDogaWQsXG4gICAgICAgIG1lc3NhZ2U6IGBcIiR7c3BlYy50aXRsZX1cIiBjb3VsZCBub3QgYmUgY29tcHV0ZWQgZm9yIHRoaXMgcGVyaW9kLiBUaGUgcmVzdCBvZiB0aGUgcmVwb3J0IGlzIHVuYWZmZWN0ZWQuYCxcbiAgICAgIH0pO1xuICAgICAgdm9pZCBlcnI7IC8vIHRoZSByZWFzb24gaXMgbG9nZ2VkIGJ5IHRoZSBjYWxsZXIsIG5ldmVyIHNob3duIHRvIGEgbWFuYWdlclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGVyaW9kOiB7IHN0YXJ0OiBwZXJpb2Quc3RhcnQudG9JU09TdHJpbmcoKSwgZW5kOiBwZXJpb2QuZW5kLnRvSVNPU3RyaW5nKCksIGxhYmVsOiBwZXJpb2QubGFiZWwgfSxcbiAgICBwcmV2aW91c1BlcmlvZDogeyBzdGFydDogcGVyaW9kLnByZXZTdGFydC50b0lTT1N0cmluZygpLCBlbmQ6IHBlcmlvZC5wcmV2RW5kLnRvSVNPU3RyaW5nKCkgfSxcbiAgICB0aW1lem9uZSxcbiAgICB3ZWVrU3RhcnQsXG4gICAgc2VjdGlvbnMsXG4gICAgbm90ZXMsXG4gICAgbWV0aG9kb2xvZ3k6XG4gICAgICBgQ29tcHV0ZWQgZnJvbSBwaXBlbGluZSBldmVudHMgYmV0d2VlbiAke3BlcmlvZC5zdGFydC50b0lTT1N0cmluZygpfSBhbmQgJHtwZXJpb2QuZW5kLnRvSVNPU3RyaW5nKCl9LCBgXG4gICAgICArIGBidWNrZXRlZCBpbiAke3RpbWV6b25lfSB3aXRoIHdlZWtzIHN0YXJ0aW5nICR7d2Vla1N0YXJ0fS4gQ29tcGFyaXNvbiBwZXJpb2Q6IGBcbiAgICAgICsgYCR7cGVyaW9kLnByZXZTdGFydC50b0lTT1N0cmluZygpfSB0byAke3BlcmlvZC5wcmV2RW5kLnRvSVNPU3RyaW5nKCl9LiBgXG4gICAgICArICdUaGVzZSBhcmUgdGhlIHNhbWUgcXVlcmllcyB0aGUgZGFzaGJvYXJkIHJ1bnMgb3ZlciB0aGUgc2FtZSB3aW5kb3csIHNvIHRoZSB0d28gYWdyZWUuJyxcbiAgICBnZW5lcmF0ZWRBdDogKG9wdHMubm93ID8/IG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksXG4gIH07XG59XG4iXX0=
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* is not 168 hours long, and a resolver that added `7 * 24 * 3600_000` would
|
|
19
19
|
* silently shift every boundary by an hour for half the year.
|
|
20
20
|
*/
|
|
21
|
+
import type { WeekStart } from '@pipeline-builder/api-core';
|
|
21
22
|
import type { ReportCadence } from '../../../database/schema/reporting-stakeholder.js';
|
|
22
23
|
/** One resolved reporting period, plus the previous one for comparison. */
|
|
23
24
|
export interface ResolvedPeriod {
|
|
@@ -38,13 +39,13 @@ export interface ResolvedPeriod {
|
|
|
38
39
|
* The period in progress is excluded: its end is the boundary, so a Monday run
|
|
39
40
|
* reports last week and a run on the 1st reports last month.
|
|
40
41
|
*/
|
|
41
|
-
export declare function resolvePeriod(cadence: ReportCadence, tz: string, weekStart?:
|
|
42
|
+
export declare function resolvePeriod(cadence: ReportCadence, tz: string, weekStart?: WeekStart, now?: Date): ResolvedPeriod;
|
|
42
43
|
/**
|
|
43
44
|
* Resolve a SPECIFIC period by its label (`2026-W38`, `2026-08`, `2026-Q3`), for
|
|
44
45
|
* on-demand runs and backfills. Returns null when the label does not parse or
|
|
45
46
|
* does not match the cadence.
|
|
46
47
|
*/
|
|
47
|
-
export declare function resolvePeriodByLabel(label: string, cadence: ReportCadence, tz: string, weekStart?:
|
|
48
|
+
export declare function resolvePeriodByLabel(label: string, cadence: ReportCadence, tz: string, weekStart?: WeekStart): ResolvedPeriod | null;
|
|
48
49
|
/**
|
|
49
50
|
* Why a period cannot be reported. Returned rather than thrown so a route can
|
|
50
51
|
* turn it into a 4xx with the reason, and the scheduler can pause with it.
|
|
@@ -84,7 +85,7 @@ export declare function rejectUnreportablePeriod(period: ResolvedPeriod, opts: {
|
|
|
84
85
|
* Strictly after `from`: a `from` sitting exactly on a boundary gets the NEXT one,
|
|
85
86
|
* so a run that completes at the instant of the boundary cannot re-claim it.
|
|
86
87
|
*/
|
|
87
|
-
export declare function nextPeriodBoundary(cadence: ReportCadence, tz: string, weekStart?:
|
|
88
|
+
export declare function nextPeriodBoundary(cadence: ReportCadence, tz: string, weekStart?: WeekStart, from?: Date): Date;
|
|
88
89
|
/**
|
|
89
90
|
* Every COMPLETE period that ended after `since`, oldest first.
|
|
90
91
|
*
|
|
@@ -99,4 +100,4 @@ export declare function nextPeriodBoundary(cadence: ReportCadence, tz: string, w
|
|
|
99
100
|
* right trade — nobody wants last April's weekly status, and the snapshot for it
|
|
100
101
|
* would be past the retention horizon anyway.
|
|
101
102
|
*/
|
|
102
|
-
export declare function completePeriodsSince(cadence: ReportCadence, tz: string, weekStart:
|
|
103
|
+
export declare function completePeriodsSince(cadence: ReportCadence, tz: string, weekStart: WeekStart, since: Date | null, now?: Date, max?: number): ResolvedPeriod[];
|